<?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>36520</bug_id>
          
          <creation_ts>2010-03-24 01:16:55 -0700</creation_ts>
          <short_desc>[DRT/Chromium] Add LayoutTestController</short_desc>
          <delta_ts>2010-03-26 09:24:05 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>35902</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Kent Tamura">tkent</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>fishd</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>203356</commentid>
    <comment_count>0</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-24 01:16:55 -0700</bug_when>
    <thetext>[DRT/Chromium] Add LayoutTestController</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203358</commentid>
    <comment_count>1</comment_count>
      <attachid>51484</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-24 01:30:29 -0700</bug_when>
    <thetext>Created attachment 51484
Proposed patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203441</commentid>
    <comment_count>2</comment_count>
      <attachid>51484</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-24 09:18:08 -0700</bug_when>
    <thetext>Comment on attachment 51484
Proposed patch

Thanks for working on this. I know it&apos;s a slow process, but it&apos;s a very important one.

&gt; +#include &quot;WebViewHost.h&quot;
&gt; +#include &quot;base/basictypes.h&quot;
&gt; +#include &quot;base/debug_util.h&quot;
&gt; +#include &quot;base/file_path.h&quot;
&gt; +#include &quot;base/message_loop.h&quot;
&gt; +#include &quot;base/path_service.h&quot;
&gt; +#include &quot;base/string_util.h&quot;

Ouch, that&apos;s a lot of base dependencies. We should work to eliminate them.
With these upstream, changing base code will be very difficult -- think of all the three-sided patches it will take.
Let&apos;s convert them to WebKit API uses or build up webkit_support library.

&gt; +
&gt; +LayoutTestController::LayoutTestController(TestShell* shell)
&gt; +    : ALLOW_THIS_IN_INITIALIZER_LIST(m_timeoutFactory(this))
&gt; +    , m_shell(shell)
&gt; +    , ALLOW_THIS_IN_INITIALIZER_LIST(m_workQueue(this))

We can just drop ALLOW_THIS_IN_INITIALIZER_LIST in WebKit.

&gt; +{
&gt; +    if (arguments.size() &gt; 0 &amp;&amp; arguments[0].isString()) {
&gt; +        GURL currentURL = m_shell-&gt;webView()-&gt;mainFrame()-&gt;url();
&gt; +        GURL fullURL = currentURL.Resolve(arguments[0].toString());

WebURL?

&gt; +        m_userStyleSheetLocation = GURL(TestShell::rewriteLocalUrl(arguments[0].toString()));

Ditto.

&gt; +        m_shell-&gt;webView()-&gt;settings()-&gt;setUserStyleSheetLocation(m_userStyleSheetLocation);


&gt; +    GURL location(TestShell::rewriteLocalUrl(url));

Ditto.

&gt; +    } else {
&gt; +        result-&gt;set(false);
&gt; +    }

No braces here?

&gt; +        result-&gt;set(pauseTransitionAtTimeOnElementWithId(propertyName, time, elementId));
&gt; +    } else {
&gt; +        result-&gt;set(false);
&gt; +    }

Ditto.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203834</commentid>
    <comment_count>3</comment_count>
      <attachid>51599</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-24 23:44:20 -0700</bug_when>
    <thetext>Created attachment 51599
Proposed patch (rev.2)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203841</commentid>
    <comment_count>4</comment_count>
      <attachid>51600</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-24 23:51:59 -0700</bug_when>
    <thetext>Created attachment 51600
Proposed patch (rev.3)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>203849</commentid>
    <comment_count>5</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-24 23:58:38 -0700</bug_when>
    <thetext>&gt; &gt; +#include &quot;base/basictypes.h&quot;
&gt; &gt; +#include &quot;base/debug_util.h&quot;
&gt; &gt; +#include &quot;base/file_path.h&quot;
&gt; &gt; +#include &quot;base/message_loop.h&quot;
&gt; &gt; +#include &quot;base/path_service.h&quot;
&gt; &gt; +#include &quot;base/string_util.h&quot;
&gt; 
&gt; Ouch, that&apos;s a lot of base dependencies. We should work to eliminate them.
&gt; With these upstream, changing base code will be very difficult -- think of all
&gt; the three-sided patches it will take.
&gt; Let&apos;s convert them to WebKit API uses or build up webkit_support library.

ok, I&apos;m adding some wrapper functions to webkit_support (See http://codereview.chromium.org/1331001/show ), and remov almost all of them.

string_util.h remains.  I&apos;ll address it later.

&gt; &gt; +    : ALLOW_THIS_IN_INITIALIZER_LIST(m_timeoutFactory(this))
&gt; &gt; +    , m_shell(shell)
&gt; &gt; +    , ALLOW_THIS_IN_INITIALIZER_LIST(m_workQueue(this))
&gt; 
&gt; We can just drop ALLOW_THIS_IN_INITIALIZER_LIST in WebKit.

Done.

&gt; &gt; +    if (arguments.size() &gt; 0 &amp;&amp; arguments[0].isString()) {
&gt; &gt; +        GURL currentURL = m_shell-&gt;webView()-&gt;mainFrame()-&gt;url();
&gt; &gt; +        GURL fullURL = currentURL.Resolve(arguments[0].toString());
&gt; 
&gt; WebURL?

We need GURL because WebURL doesn&apos;t have Resolve().

&gt; &gt; +        m_userStyleSheetLocation = GURL(TestShell::rewriteLocalUrl(arguments[0].toString()));
&gt; 
&gt; Ditto.

We need GURL because WebURL doesn&apos;t have a constructor with a string.

&gt; &gt; +        m_shell-&gt;webView()-&gt;settings()-&gt;setUserStyleSheetLocation(m_userStyleSheetLocation);
&gt; &gt; +    GURL location(TestShell::rewriteLocalUrl(url));
&gt; 
&gt; Ditto.

Ditto.

&gt; &gt; +    } else {
&gt; &gt; +        result-&gt;set(false);
&gt; &gt; +    }
&gt; 
&gt; No braces here?

Done.

&gt; &gt; +    } else {
&gt; &gt; +        result-&gt;set(false);
&gt; &gt; +    }
&gt; 
&gt; Ditto.

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>204217</commentid>
    <comment_count>6</comment_count>
      <attachid>51600</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-25 14:18:44 -0700</bug_when>
    <thetext>Comment on attachment 51600
Proposed patch (rev.3)

I am ok with checking this in as-is as long as we all understand this is far from final and is going in because we want to have something running to hack on. Please spread FIXMEs liberally and start filing bugs, so that we don&apos;t forget. Nate and I did this for V8 bindings refactoring, and it worked out really well (https://bugs.webkit.org/showdependencytree.cgi?id=32630&amp;hide_resolved=0).

We will need to get rid of direct base dependencies, and convert all std::string uses to WebString, and remove STL use.

On GURL::Resolve, we may have to poke this method through WebURL wrapper.

&gt; +    if (!m_queue.isEmpty()) {
&gt; +        // We delay processing queued work to avoid recursion problems.
&gt; +        m_timer.Start(base::TimeDelta(), this, &amp;WorkQueue::processWork);

How did base/time squeak by here?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>204218</commentid>
    <comment_count>7</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-25 14:19:58 -0700</bug_when>
    <thetext>BTW, I see you&apos;re already doing the bug tree part very well: https://bugs.webkit.org/showdependencytree.cgi?id=28395&amp;hide_resolved=0. Good work :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>204435</commentid>
    <comment_count>8</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-26 00:09:38 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 51600 [details])
&gt; I am ok with checking this in as-is as long as we all understand this is far
&gt; from final and is going in because we want to have something running to hack
&gt; on. Please spread FIXMEs liberally and start filing bugs, so that we don&apos;t
&gt; forget. Nate and I did this for V8 bindings refactoring, and it worked out
&gt; really well
&gt; (https://bugs.webkit.org/showdependencytree.cgi?id=32630&amp;hide_resolved=0).
&gt; 
&gt; We will need to get rid of direct base dependencies, and convert all
&gt; std::string uses to WebString, and remove STL use.

Removing base/ dependencies are understandable though I have no idea how to remove Task interface for now.
Should we really remove std::string?  I thought WebString was just a bridge between WebCore and Chromium code and we should have used String/AtomicString in WebCore, string16/string in Chromium.  We need to add many functions to WebString in order to replace string with WebString.

&gt; On GURL::Resolve, we may have to poke this method through WebURL wrapper.

Same question as above.  Should we make WebKit API classes fully-functional clases, not just wrappers?

&gt; 
&gt; &gt; +    if (!m_queue.isEmpty()) {
&gt; &gt; +        // We delay processing queued work to avoid recursion problems.
&gt; &gt; +        m_timer.Start(base::TimeDelta(), this, &amp;WorkQueue::processWork);
&gt; 
&gt; How did base/time squeak by here?

LayoutTestController.h still have base/timer.h.
I have added FIXME there.


I&apos;ll land this with some FIXME additions, and filed Bug#36641 for dependency cleanup.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>204459</commentid>
    <comment_count>9</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-03-26 00:59:49 -0700</bug_when>
    <thetext>Landed as r56612.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>204614</commentid>
    <comment_count>10</comment_count>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2010-03-26 09:24:05 -0700</bug_when>
    <thetext>(In reply to comment #8)
&gt; (In reply to comment #6)
&gt; &gt; (From update of attachment 51600 [details] [details])
&gt; &gt; I am ok with checking this in as-is as long as we all understand this is far
&gt; &gt; from final and is going in because we want to have something running to hack
&gt; &gt; on. Please spread FIXMEs liberally and start filing bugs, so that we don&apos;t
&gt; &gt; forget. Nate and I did this for V8 bindings refactoring, and it worked out
&gt; &gt; really well
&gt; &gt; (https://bugs.webkit.org/showdependencytree.cgi?id=32630&amp;hide_resolved=0).
&gt; &gt; 
&gt; &gt; We will need to get rid of direct base dependencies, and convert all
&gt; &gt; std::string uses to WebString, and remove STL use.
&gt; 
&gt; Removing base/ dependencies are understandable though I have no idea how to
&gt; remove Task interface for now.
&gt; Should we really remove std::string?  I thought WebString was just a bridge
&gt; between WebCore and Chromium code and we should have used String/AtomicString
&gt; in WebCore, string16/string in Chromium.  We need to add many functions to
&gt; WebString in order to replace string with WebString.

std::string use removal is definitely a lower priority.

&gt; &gt; On GURL::Resolve, we may have to poke this method through WebURL wrapper.
&gt; 
&gt; Same question as above.  Should we make WebKit API classes fully-functional
&gt; clases, not just wrappers?

Not fully functional, but just enough to be functional :)

&gt; &gt; 
&gt; &gt; &gt; +    if (!m_queue.isEmpty()) {
&gt; &gt; &gt; +        // We delay processing queued work to avoid recursion problems.
&gt; &gt; &gt; +        m_timer.Start(base::TimeDelta(), this, &amp;WorkQueue::processWork);
&gt; &gt; 
&gt; &gt; How did base/time squeak by here?
&gt; 
&gt; LayoutTestController.h still have base/timer.h.
&gt; I have added FIXME there.
&gt; 
&gt; 
&gt; I&apos;ll land this with some FIXME additions, and filed Bug#36641 for dependency
&gt; cleanup.

Thanks!</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51484</attachid>
            <date>2010-03-24 01:30:29 -0700</date>
            <delta_ts>2010-03-24 23:44:14 -0700</delta_ts>
            <desc>Proposed patch</desc>
            <filename>bug-36520-20100324173027.patch</filename>
            <type>text/plain</type>
            <size>67647</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA3YjAyYTliLi44NzJkMmYzIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTAtMDMt
MjQgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBUZXN0TmF2
aWdhdGlvbkNvbnRyb2xsZXIgYW5kIFRlc3RXZWJXb3JrZXIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM2NTIwCisKKyAgICAgICAgQWRkIExheW91dFRl
c3RDb250cm9sbGVyIGNsYXNzLCB3aGljaCBpcyBnb2luZyB0byBiZSB1c2VkIGJ5CisgICAgICAg
IER1bXBSZW5kZXJUcmVlIENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoK
KyAgICAgICAgLSBzcmMvd2Via2l0L3Rvb2xzL3Rlc3Rfc2hlbGwvbGF5b3V0X3Rlc3RfY29udHJv
bGxlci5jYworICAgICAgICAtIHNyYy93ZWJraXQvdG9vbHMvdGVzdF9zaGVsbC9sYXlvdXRfdGVz
dF9jb250cm9sbGVyLmgKKyAgICAgICAgb2YgQ2hyb21pdW0gcmV2LjQwNDkyLgorCisgICAgICAg
ICogRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRyb2xsZXIuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9MYXlvdXRUZXN0Q29udHJvbGxl
ci5oOiBBZGRlZC4KKwogMjAxMC0wMy0yMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292LgpkaWZmIC0tZ2l0IGEv
V2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRyb2xsZXIu
Y3BwIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRy
b2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjIyN2QKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9MYXlv
dXRUZXN0Q29udHJvbGxlci5jcHAKQEAgLTAsMCArMSwxMTc3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgUGF3ZWwgSGFqZGFuIChwaGFqZGFuLmpyQGNocm9taXVtLm9yZykKKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIlRl
c3RTaGVsbC5oIgorI2luY2x1ZGUgIldlYlZpZXdIb3N0LmgiCisjaW5jbHVkZSAiYmFzZS9iYXNp
Y3R5cGVzLmgiCisjaW5jbHVkZSAiYmFzZS9kZWJ1Z191dGlsLmgiCisjaW5jbHVkZSAiYmFzZS9m
aWxlX3BhdGguaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgorI2luY2x1ZGUgImJh
c2UvcGF0aF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgorI2luY2x1
ZGUgInB1YmxpYy9XZWJBbmltYXRpb25Db250cm9sbGVyLmgiCisjaW5jbHVkZSAicHVibGljL1dl
YkNvbnNvbGVNZXNzYWdlLmgiCisjaW5jbHVkZSAicHVibGljL1dlYkRvY3VtZW50LmgiCisjaW5j
bHVkZSAicHVibGljL1dlYkZyYW1lLmgiCisjaW5jbHVkZSAicHVibGljL1dlYklucHV0RWxlbWVu
dC5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJLaXQuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViU2Ny
aXB0U291cmNlLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlNlY3VyaXR5UG9saWN5LmgiCisjaW5j
bHVkZSAicHVibGljL1dlYlNldHRpbmdzLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlNpemUuaCIK
KyNpbmNsdWRlICJwdWJsaWMvV2ViVVJMLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlZpZXcuaCIK
KyNpbmNsdWRlICJ3ZWJraXQvc3VwcG9ydC93ZWJraXRfc3VwcG9ydC5oIgorCit1c2luZyBuYW1l
c3BhY2UgV2ViS2l0OwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OkxheW91dFRlc3RDb250cm9sbGVyKFRlc3RTaGVsbCogc2hlbGwpCisgICAgOiBBTExPV19U
SElTX0lOX0lOSVRJQUxJWkVSX0xJU1QobV90aW1lb3V0RmFjdG9yeSh0aGlzKSkKKyAgICAsIG1f
c2hlbGwoc2hlbGwpCisgICAgLCBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QobV93b3Jr
UXVldWUodGhpcykpCit7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBtYXAgdGhhdCBhc3NvY2lh
dGVzIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBuYW1lcworICAgIC8vIHRoZXkgd2ls
bCB1c2Ugd2hlbiBjYWxsZWQgYnkgSmF2YVNjcmlwdC4gIFRoZSBhY3R1YWwgYmluZGluZyBvZiB0
aG9zZQorICAgIC8vIG5hbWVzIHRvIHRoZWlyIG1ldGhvZHMgd2lsbCBiZSBkb25lIGJ5IGNhbGxp
bmcgYmluZFRvSmF2YVNjcmlwdCgpIChkZWZpbmVkCisgICAgLy8gYnkgQ3BwQm91bmRDbGFzcywg
dGhlIHBhcmVudCB0byBMYXlvdXRUZXN0Q29udHJvbGxlcikuCisgICAgYmluZE1ldGhvZCgiZHVt
cEFzVGV4dCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcEFzVGV4dCk7CisgICAgYmluZE1l
dGhvZCgiZHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMiLCAmTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OmR1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zKTsKKyAgICBiaW5kTWV0aG9kKCJkdW1w
Q2hpbGRGcmFtZXNBc1RleHQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBDaGlsZEZyYW1l
c0FzVGV4dCk7CisgICAgYmluZE1ldGhvZCgiZHVtcERhdGFiYXNlQ2FsbGJhY2tzIiwgJkxheW91
dFRlc3RDb250cm9sbGVyOjpkdW1wRGF0YWJhc2VDYWxsYmFja3MpOworICAgIGJpbmRNZXRob2Qo
ImR1bXBFZGl0aW5nQ2FsbGJhY2tzIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpkdW1wRWRpdGlu
Z0NhbGxiYWNrcyk7CisgICAgYmluZE1ldGhvZCgiZHVtcEJhY2tGb3J3YXJkTGlzdCIsICZMYXlv
dXRUZXN0Q29udHJvbGxlcjo6ZHVtcEJhY2tGb3J3YXJkTGlzdCk7CisgICAgYmluZE1ldGhvZCgi
ZHVtcEZyYW1lTG9hZENhbGxiYWNrcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcEZyYW1l
TG9hZENhbGxiYWNrcyk7CisgICAgYmluZE1ldGhvZCgiZHVtcFJlc291cmNlTG9hZENhbGxiYWNr
cyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcFJlc291cmNlTG9hZENhbGxiYWNrcyk7Cisg
ICAgYmluZE1ldGhvZCgiZHVtcFN0YXR1c0NhbGxiYWNrcyIsICZMYXlvdXRUZXN0Q29udHJvbGxl
cjo6ZHVtcFdpbmRvd1N0YXR1c0NoYW5nZXMpOworICAgIGJpbmRNZXRob2QoImR1bXBUaXRsZUNo
YW5nZXMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBUaXRsZUNoYW5nZXMpOworICAgIGJp
bmRNZXRob2QoInNldEFjY2VwdHNFZGl0aW5nIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRB
Y2NlcHRzRWRpdGluZyk7CisgICAgYmluZE1ldGhvZCgid2FpdFVudGlsRG9uZSIsICZMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6d2FpdFVudGlsRG9uZSk7CisgICAgYmluZE1ldGhvZCgibm90aWZ5RG9u
ZSIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6bm90aWZ5RG9uZSk7CisgICAgYmluZE1ldGhvZCgi
cXVldWVSZWxvYWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlUmVsb2FkKTsKKyAgICBi
aW5kTWV0aG9kKCJxdWV1ZUxvYWRpbmdTY3JpcHQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1
ZXVlTG9hZGluZ1NjcmlwdCk7CisgICAgYmluZE1ldGhvZCgicXVldWVOb25Mb2FkaW5nU2NyaXB0
IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpxdWV1ZU5vbkxvYWRpbmdTY3JpcHQpOworICAgIGJp
bmRNZXRob2QoInF1ZXVlTG9hZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6cXVldWVMb2FkKTsK
KyAgICBiaW5kTWV0aG9kKCJxdWV1ZUJhY2tOYXZpZ2F0aW9uIiwgJkxheW91dFRlc3RDb250cm9s
bGVyOjpxdWV1ZUJhY2tOYXZpZ2F0aW9uKTsKKyAgICBiaW5kTWV0aG9kKCJxdWV1ZUZvcndhcmRO
YXZpZ2F0aW9uIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpxdWV1ZUZvcndhcmROYXZpZ2F0aW9u
KTsKKyAgICBiaW5kTWV0aG9kKCJ3aW5kb3dDb3VudCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6
d2luZG93Q291bnQpOworICAgIGJpbmRNZXRob2QoInNldENhbk9wZW5XaW5kb3dzIiwgJkxheW91
dFRlc3RDb250cm9sbGVyOjpzZXRDYW5PcGVuV2luZG93cyk7CisgICAgYmluZE1ldGhvZCgic2V0
Q2xvc2VSZW1haW5pbmdXaW5kb3dzV2hlbkNvbXBsZXRlIiwgJkxheW91dFRlc3RDb250cm9sbGVy
OjpzZXRDbG9zZVJlbWFpbmluZ1dpbmRvd3NXaGVuQ29tcGxldGUpOworICAgIGJpbmRNZXRob2Qo
Im9iakNJZGVudGl0eUlzRXF1YWwiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om9iakNJZGVudGl0
eUlzRXF1YWwpOworICAgIGJpbmRNZXRob2QoInNldEFsd2F5c0FjY2VwdENvb2tpZXMiLCAmTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnNldEFsd2F5c0FjY2VwdENvb2tpZXMpOworICAgIGJpbmRNZXRo
b2QoInNldFdpbmRvd0lzS2V5IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRXaW5kb3dJc0tl
eSk7CisgICAgYmluZE1ldGhvZCgic2V0VGFiS2V5Q3ljbGVzVGhyb3VnaEVsZW1lbnRzIiwgJkxh
eW91dFRlc3RDb250cm9sbGVyOjpzZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxlbWVudHMpOworICAg
IGJpbmRNZXRob2QoInNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24iLCAmTGF5b3V0VGVzdENvbnRy
b2xsZXI6OnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24pOworICAgIGJpbmRNZXRob2QoInNldFVz
ZXJTdHlsZVNoZWV0RW5hYmxlZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VXNlclN0eWxl
U2hlZXRFbmFibGVkKTsKKyAgICBiaW5kTWV0aG9kKCJwYXRoVG9Mb2NhbFJlc291cmNlIiwgJkxh
eW91dFRlc3RDb250cm9sbGVyOjpwYXRoVG9Mb2NhbFJlc291cmNlKTsKKyAgICBiaW5kTWV0aG9k
KCJhZGRGaWxlVG9QYXN0ZWJvYXJkT25EcmFnIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjphZGRG
aWxlVG9QYXN0ZWJvYXJkT25EcmFnKTsKKyAgICBiaW5kTWV0aG9kKCJleGVjQ29tbWFuZCIsICZM
YXlvdXRUZXN0Q29udHJvbGxlcjo6ZXhlY0NvbW1hbmQpOworICAgIGJpbmRNZXRob2QoImlzQ29t
bWFuZEVuYWJsZWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmlzQ29tbWFuZEVuYWJsZWQpOwor
ICAgIGJpbmRNZXRob2QoInNldFBvcHVwQmxvY2tpbmdFbmFibGVkIiwgJkxheW91dFRlc3RDb250
cm9sbGVyOjpzZXRQb3B1cEJsb2NraW5nRW5hYmxlZCk7CisgICAgYmluZE1ldGhvZCgic2V0U3Rv
cFByb3Zpc2lvbmFsRnJhbWVMb2FkcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0U3RvcFBy
b3Zpc2lvbmFsRnJhbWVMb2Fkcyk7CisgICAgYmluZE1ldGhvZCgic2V0U21hcnRJbnNlcnREZWxl
dGVFbmFibGVkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRTbWFydEluc2VydERlbGV0ZUVu
YWJsZWQpOworICAgIGJpbmRNZXRob2QoInNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJs
ZWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVu
YWJsZWQpOworICAgIGJpbmRNZXRob2QoInBhdXNlQW5pbWF0aW9uQXRUaW1lT25FbGVtZW50V2l0
aElkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpwYXVzZUFuaW1hdGlvbkF0VGltZU9uRWxlbWVu
dFdpdGhJZCk7CisgICAgYmluZE1ldGhvZCgicGF1c2VUcmFuc2l0aW9uQXRUaW1lT25FbGVtZW50
V2l0aElkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpwYXVzZVRyYW5zaXRpb25BdFRpbWVPbkVs
ZW1lbnRXaXRoSWQpOworICAgIGJpbmRNZXRob2QoImVsZW1lbnREb2VzQXV0b0NvbXBsZXRlRm9y
RWxlbWVudFdpdGhJZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZWxlbWVudERvZXNBdXRvQ29t
cGxldGVGb3JFbGVtZW50V2l0aElkKTsKKyAgICBiaW5kTWV0aG9kKCJudW1iZXJPZkFjdGl2ZUFu
aW1hdGlvbnMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om51bWJlck9mQWN0aXZlQW5pbWF0aW9u
cyk7CisgICAgYmluZE1ldGhvZCgiZGlzYWJsZUltYWdlTG9hZGluZyIsICZMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6ZGlzYWJsZUltYWdlTG9hZGluZyk7CisgICAgYmluZE1ldGhvZCgic2V0SWNvbkRh
dGFiYXNlRW5hYmxlZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0SWNvbkRhdGFiYXNlRW5h
YmxlZCk7CisgICAgYmluZE1ldGhvZCgic2V0Q3VzdG9tUG9saWN5RGVsZWdhdGUiLCAmTGF5b3V0
VGVzdENvbnRyb2xsZXI6OnNldEN1c3RvbVBvbGljeURlbGVnYXRlKTsKKyAgICBiaW5kTWV0aG9k
KCJ3YWl0Rm9yUG9saWN5RGVsZWdhdGUiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OndhaXRGb3JQ
b2xpY3lEZWxlZ2F0ZSk7CisgICAgYmluZE1ldGhvZCgic2V0V2lsbFNlbmRSZXF1ZXN0UmV0dXJu
c051bGxPblJlZGlyZWN0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRXaWxsU2VuZFJlcXVl
c3RSZXR1cm5zTnVsbE9uUmVkaXJlY3QpOworICAgIGJpbmRNZXRob2QoInNldFdpbGxTZW5kUmVx
dWVzdFJldHVybnNOdWxsIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRXaWxsU2VuZFJlcXVl
c3RSZXR1cm5zTnVsbCk7CisgICAgYmluZE1ldGhvZCgid2hpdGVMaXN0QWNjZXNzRnJvbU9yaWdp
biIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6d2hpdGVMaXN0QWNjZXNzRnJvbU9yaWdpbik7Cisg
ICAgYmluZE1ldGhvZCgiY2xlYXJBbGxEYXRhYmFzZXMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6
OmNsZWFyQWxsRGF0YWJhc2VzKTsKKyAgICBiaW5kTWV0aG9kKCJzZXREYXRhYmFzZVF1b3RhIiwg
JkxheW91dFRlc3RDb250cm9sbGVyOjpzZXREYXRhYmFzZVF1b3RhKTsKKyAgICBiaW5kTWV0aG9k
KCJzZXRQT1NJWExvY2FsZSIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0UE9TSVhMb2NhbGUp
OworICAgIGJpbmRNZXRob2QoImNvdW50ZXJWYWx1ZUZvckVsZW1lbnRCeUlkIiwgJkxheW91dFRl
c3RDb250cm9sbGVyOjpjb3VudGVyVmFsdWVGb3JFbGVtZW50QnlJZCk7CisgICAgYmluZE1ldGhv
ZCgiYWRkVXNlclNjcmlwdCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkVXNlclNjcmlwdCk7
CisgICAgYmluZE1ldGhvZCgicGFnZU51bWJlckZvckVsZW1lbnRCeUlkIiwgJkxheW91dFRlc3RD
b250cm9sbGVyOjpwYWdlTnVtYmVyRm9yRWxlbWVudEJ5SWQpOworICAgIGJpbmRNZXRob2QoIm51
bWJlck9mUGFnZXMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om51bWJlck9mUGFnZXMpOworICAg
IGJpbmRNZXRob2QoImR1bXBTZWxlY3Rpb25SZWN0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpk
dW1wU2VsZWN0aW9uUmVjdCk7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBzdHVicy4KKyAg
ICBiaW5kTWV0aG9kKCJkdW1wQXNXZWJBcmNoaXZlIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpk
dW1wQXNXZWJBcmNoaXZlKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRNYWluRnJhbWVJc0ZpcnN0UmVz
cG9uZGVyIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9u
ZGVyKTsKKyAgICBiaW5kTWV0aG9kKCJkdW1wU2VsZWN0aW9uUmVjdCIsICZMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6ZHVtcFNlbGVjdGlvblJlY3QpOworICAgIGJpbmRNZXRob2QoImRpc3BsYXkiLCAm
TGF5b3V0VGVzdENvbnRyb2xsZXI6OmRpc3BsYXkpOworICAgIGJpbmRNZXRob2QoInRlc3RSZXBh
aW50IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjp0ZXN0UmVwYWludCk7CisgICAgYmluZE1ldGhv
ZCgicmVwYWludFN3ZWVwSG9yaXpvbnRhbGx5IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpyZXBh
aW50U3dlZXBIb3Jpem9udGFsbHkpOworICAgIGJpbmRNZXRob2QoImNsZWFyQmFja0ZvcndhcmRM
aXN0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpjbGVhckJhY2tGb3J3YXJkTGlzdCk7CisgICAg
YmluZE1ldGhvZCgia2VlcFdlYkhpc3RvcnkiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmtlZXBX
ZWJIaXN0b3J5KTsKKyAgICBiaW5kTWV0aG9kKCJzdG9yZVdlYlNjcmlwdE9iamVjdCIsICZMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c3RvcmVXZWJTY3JpcHRPYmplY3QpOworICAgIGJpbmRNZXRob2Qo
ImFjY2Vzc1N0b3JlZFdlYlNjcmlwdE9iamVjdCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWNj
ZXNzU3RvcmVkV2ViU2NyaXB0T2JqZWN0KTsKKyAgICBiaW5kTWV0aG9kKCJvYmpDQ2xhc3NOYW1l
T2YiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om9iakNDbGFzc05hbWVPZik7CisgICAgYmluZE1l
dGhvZCgiYWRkRGlzYWxsb3dlZFVSTCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkRGlzYWxs
b3dlZFVSTCk7CisgICAgYmluZE1ldGhvZCgic2V0Q2FsbENsb3NlT25XZWJWaWV3cyIsICZMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c2V0Q2FsbENsb3NlT25XZWJWaWV3cyk7CisgICAgYmluZE1ldGhv
ZCgic2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0
UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCk7CisgICAgYmluZE1ldGhvZCgic2V0VXNlRGFzaGJvYXJk
Q29tcGF0aWJpbGl0eU1vZGUiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFVzZURhc2hib2Fy
ZENvbXBhdGliaWxpdHlNb2RlKTsKKworICAgIGJpbmRNZXRob2QoInNldFhTU0F1ZGl0b3JFbmFi
bGVkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRYU1NBdWRpdG9yRW5hYmxlZCk7CisgICAg
YmluZE1ldGhvZCgiZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQiLCAmTGF5b3V0VGVzdENv
bnRyb2xsZXI6OmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKTsKKyAgICBiaW5kTWV0aG9k
KCJvdmVycmlkZVByZWZlcmVuY2UiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om92ZXJyaWRlUHJl
ZmVyZW5jZSk7CisgICAgYmluZE1ldGhvZCgic2V0QWxsb3dVbml2ZXJzYWxBY2Nlc3NGcm9tRmls
ZVVSTHMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJv
bUZpbGVVUkxzKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRBbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVS
THMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJM
cyk7CisgICAgYmluZE1ldGhvZCgic2V0VGltZWxpbmVQcm9maWxpbmdFbmFibGVkIiwgJkxheW91
dFRlc3RDb250cm9sbGVyOjpzZXRUaW1lbGluZVByb2ZpbGluZ0VuYWJsZWQpOworICAgIGJpbmRN
ZXRob2QoImV2YWx1YXRlSW5XZWJJbnNwZWN0b3IiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmV2
YWx1YXRlSW5XZWJJbnNwZWN0b3IpOworICAgIGJpbmRNZXRob2QoImZvcmNlUmVkU2VsZWN0aW9u
Q29sb3JzIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpmb3JjZVJlZFNlbGVjdGlvbkNvbG9ycyk7
CisKKyAgICAvLyBUaGUgZmFsbGJhY2sgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIHVua25vd24g
bWV0aG9kIGlzIGludm9rZWQuCisgICAgYmluZEZhbGxiYWNrTWV0aG9kKCZMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6ZmFsbGJhY2tNZXRob2QpOworCisgICAgLy8gU2hhcmVkIHByb3BlcnRpZXMuCisg
ICAgLy8gZ2xvYmFsRmxhZyBpcyB1c2VkIGJ5IGEgbnVtYmVyIG9mIGxheW91dCB0ZXN0cyBpbgor
ICAgIC8vIExheW91dFRlc3RzXGh0dHBcdGVzdHNcc2VjdXJpdHlcZGF0YVVSTC4KKyAgICBiaW5k
UHJvcGVydHkoImdsb2JhbEZsYWciLCAmbV9nbG9iYWxGbGFnKTsKKyAgICAvLyB3ZWJIaXN0b3J5
SXRlbUNvdW50IGlzIHVzZWQgYnkgdGVzdHMgaW4gTGF5b3V0VGVzdHNcaHR0cFx0ZXN0c1xoaXN0
b3J5CisgICAgYmluZFByb3BlcnR5KCJ3ZWJIaXN0b3J5SXRlbUNvdW50IiwgJm1fd2ViSGlzdG9y
eUl0ZW1Db3VudCk7Cit9CisKK0xheW91dFRlc3RDb250cm9sbGVyOjpXb3JrUXVldWU6On5Xb3Jr
UXVldWUoKQoreworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OldvcmtRdWV1ZTo6cHJvY2Vzc1dvcmtTb29uKCkKK3sKKyAgICBpZiAobV9jb250cm9sbGVyLT5t
X3NoZWxsLT53ZWJWaWV3SG9zdCgpLT50b3BMb2FkaW5nRnJhbWUoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKCFtX3F1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBXZSBkZWxheSBw
cm9jZXNzaW5nIHF1ZXVlZCB3b3JrIHRvIGF2b2lkIHJlY3Vyc2lvbiBwcm9ibGVtcy4KKyAgICAg
ICAgbV90aW1lci5TdGFydChiYXNlOjpUaW1lRGVsdGEoKSwgdGhpcywgJldvcmtRdWV1ZTo6cHJv
Y2Vzc1dvcmspOworICAgIH0gZWxzZSBpZiAoIW1fY29udHJvbGxlci0+bV93YWl0VW50aWxEb25l
KSB7CisgICAgICAgIG1fY29udHJvbGxlci0+bV9zaGVsbC0+dGVzdEZpbmlzaGVkKCk7CisgICAg
fQorfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpXb3JrUXVldWU6OnByb2Nlc3NXb3Jr
KCkKK3sKKyAgICBUZXN0U2hlbGwqIHNoZWxsID0gbV9jb250cm9sbGVyLT5tX3NoZWxsOworICAg
IC8vIFF1aXQgZG9pbmcgd29yayBvbmNlIGEgbG9hZCBpcyBpbiBwcm9ncmVzcy4KKyAgICB3aGls
ZSAoIW1fcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIGJvb2wgc3RhcnRlZExvYWQgPSBtX3F1
ZXVlLmZpcnN0KCktPnJ1bihzaGVsbCk7CisgICAgICAgIGRlbGV0ZSBtX3F1ZXVlLmZpcnN0KCk7
CisgICAgICAgIG1fcXVldWUucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgaWYgKHN0YXJ0ZWRMb2Fk
KQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbV9jb250cm9sbGVyLT5t
X3dhaXRVbnRpbERvbmUgJiYgIXNoZWxsLT53ZWJWaWV3SG9zdCgpLT50b3BMb2FkaW5nRnJhbWUo
KSkKKyAgICAgICAgc2hlbGwtPnRlc3RGaW5pc2hlZCgpOworfQorCit2b2lkIExheW91dFRlc3RD
b250cm9sbGVyOjpXb3JrUXVldWU6OnJlc2V0KCkKK3sKKyAgICBtX2Zyb3plbiA9IGZhbHNlOwor
ICAgIHdoaWxlICghbV9xdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGVsZXRlIG1fcXVldWUu
Zmlyc3QoKTsKKyAgICAgICAgbV9xdWV1ZS5yZW1vdmVGaXJzdCgpOworICAgIH0KK30KKwordm9p
ZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6V29ya1F1ZXVlOjphZGRXb3JrKFdvcmtJdGVtKiB3b3Jr
KQoreworICAgIGlmIChtX2Zyb3plbikgeworICAgICAgICBkZWxldGUgd29yazsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBtX3F1ZXVlLmFwcGVuZCh3b3JrKTsKK30KKwordm9pZCBMYXlv
dXRUZXN0Q29udHJvbGxlcjo6ZHVtcEFzVGV4dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgbV9kdW1wQXNUZXh0ID0gdHJ1ZTsKKyAgICByZXN1bHQt
PnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcERhdGFiYXNl
Q2FsbGJhY2tzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sK
KyAgICAvLyBEbyBub3RoaW5nOyB3ZSBkb24ndCB1c2UgdGhpcyBmbGFnIGFueXdoZXJlIGZvciBu
b3cKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6ZHVtcEVkaXRpbmdDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIG1fZHVtcEVkaXRpbmdDYWxsYmFja3MgPSB0cnVlOworICAgIHJl
c3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wQmFj
a0ZvcndhcmRMaXN0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICBtX2R1bXBCYWNrRm9yd2FyZExpc3QgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVs
bCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wRnJhbWVMb2FkQ2FsbGJh
Y2tzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBt
X2R1bXBGcmFtZUxvYWRDYWxsYmFja3MgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wUmVzb3VyY2VMb2FkQ2FsbGJhY2tz
KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX2R1
bXBSZXNvdXJjZUxvYWRDYWxsYmFja3MgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0
aW9ucyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
bV9kdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucyA9IHRydWU7CisgICAgcmVzdWx0LT5zZXRO
dWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBDaGlsZEZyYW1lc0Fz
VGV4dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
bV9kdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wV2luZG93U3RhdHVzQ2hhbmdlcyhj
b25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgbV9kdW1w
V2luZG93U3RhdHVzQ2hhbmdlcyA9IHRydWU7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBUaXRsZUNoYW5nZXMoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIG1fZHVtcFRpdGxlQ2hhbmdl
cyA9IHRydWU7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENv
bnRyb2xsZXI6OnNldEFjY2VwdHNFZGl0aW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1l
bnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAw
ICYmIGFyZ3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAgbV9hY2NlcHRzRWRpdGluZyA9IGFy
Z3VtZW50c1swXS52YWx1ZS5ib29sVmFsdWU7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OndhaXRVbnRpbERvbmUoY29uc3QgQ3BwQXJndW1l
bnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmICghRGVidWdVdGlsOjpCZWlu
Z0RlYnVnZ2VkKCkpIHsKKyAgICAgICAgLy8gRklYTUU6IFVzZSBiYXNlOjpPbmVTaG90VGltZXIu
IEZvciBzb21lIHJlYXNvbiwgdXNpbmcgT25lU2hvdFRpbWVyCisgICAgICAgIC8vIHNlZW1zIHRv
IGNhdXNlIGxheW91dCB0ZXN0IGZhaWx1cmVzIG9uIHRoZSB0cnkgYm90cy4KKyAgICAgICAgTWVz
c2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdERlbGF5ZWRUYXNrKAorICAgICAgICAgICAgRlJPTV9I
RVJFLCBtX3RpbWVvdXRGYWN0b3J5Lk5ld1J1bm5hYmxlTWV0aG9kKCZMYXlvdXRUZXN0Q29udHJv
bGxlcjo6bm90aWZ5RG9uZVRpbWVkT3V0KSwKKyAgICAgICAgICAgIG1fc2hlbGwtPmxheW91dFRl
c3RUaW1lb3V0KCkpOworICAgIH0KKyAgICBtX3dhaXRVbnRpbERvbmUgPSB0cnVlOworICAgIHJl
c3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpub3RpZnlE
b25lKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICAv
LyBUZXN0IGRpZG4ndCB0aW1lb3V0LiBLaWxsIHRoZSB0aW1lb3V0IHRpbWVyLgorICAgIG1fdGlt
ZW91dEZhY3RvcnkuUmV2b2tlQWxsKCk7CisKKyAgICBjb21wbGV0ZU5vdGlmeURvbmUoZmFsc2Up
OworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
Ojpub3RpZnlEb25lVGltZWRPdXQoKQoreworICAgIGNvbXBsZXRlTm90aWZ5RG9uZSh0cnVlKTsK
K30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y29tcGxldGVOb3RpZnlEb25lKGJvb2wg
aXNUaW1lb3V0KQoreworICAgIGlmIChtX3dhaXRVbnRpbERvbmUgJiYgIW1fc2hlbGwtPndlYlZp
ZXdIb3N0KCktPnRvcExvYWRpbmdGcmFtZSgpICYmIG1fd29ya1F1ZXVlLmlzRW1wdHkoKSkgewor
ICAgICAgICBpZiAoaXNUaW1lb3V0KQorICAgICAgICAgICAgbV9zaGVsbC0+dGVzdFRpbWVkT3V0
KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fc2hlbGwtPnRlc3RGaW5pc2hlZCgpOwor
ICAgIH0KKyAgICBtX3dhaXRVbnRpbERvbmUgPSBmYWxzZTsKK30KKworY2xhc3MgV29ya0l0ZW1C
YWNrRm9yd2FyZCA6IHB1YmxpYyBMYXlvdXRUZXN0Q29udHJvbGxlcjo6V29ya0l0ZW0geworcHVi
bGljOgorICAgIFdvcmtJdGVtQmFja0ZvcndhcmQoaW50IGRpc3RhbmNlKSA6IG1fZGlzdGFuY2Uo
ZGlzdGFuY2UpIHt9CisgICAgYm9vbCBydW4oVGVzdFNoZWxsKiBzaGVsbCkKKyAgICB7CisgICAg
ICAgIHNoZWxsLT5nb1RvT2Zmc2V0KG1fZGlzdGFuY2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsg
Ly8gRklYTUU6IERpZCBpdCByZWFsbHkgc3RhcnQgYSBuYXZpZ2F0aW9uPworICAgIH0KK3ByaXZh
dGU6CisgICAgaW50IG1fZGlzdGFuY2U7Cit9OworCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpxdWV1ZUJhY2tOYXZpZ2F0aW9uKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBD
cHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFy
Z3VtZW50c1swXS5pc051bWJlcigpKQorICAgICAgICBtX3dvcmtRdWV1ZS5hZGRXb3JrKG5ldyBX
b3JrSXRlbUJhY2tGb3J3YXJkKC1hcmd1bWVudHNbMF0udG9JbnQzMigpKSk7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlRm9yd2Fy
ZE5hdmlnYXRpb24oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBd
LmlzTnVtYmVyKCkpCisgICAgICAgIG1fd29ya1F1ZXVlLmFkZFdvcmsobmV3IFdvcmtJdGVtQmFj
a0ZvcndhcmQoYXJndW1lbnRzWzBdLnRvSW50MzIoKSkpOworICAgIHJlc3VsdC0+c2V0TnVsbCgp
OworfQorCitjbGFzcyBXb3JrSXRlbVJlbG9hZCA6IHB1YmxpYyBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6V29ya0l0ZW0geworcHVibGljOgorICAgIGJvb2wgcnVuKFRlc3RTaGVsbCogc2hlbGwpCisg
ICAgeworICAgICAgICBzaGVsbC0+cmVsb2FkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KK307CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlUmVsb2FkKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX3dvcmtRdWV1ZS5h
ZGRXb3JrKG5ldyBXb3JrSXRlbVJlbG9hZCk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K2NsYXNzIFdvcmtJdGVtTG9hZGluZ1NjcmlwdCA6IHB1YmxpYyBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6V29ya0l0ZW0geworcHVibGljOgorICAgIFdvcmtJdGVtTG9hZGluZ1NjcmlwdChjb25zdCBz
dHJpbmcmIHNjcmlwdCkgOiBtX3NjcmlwdChzY3JpcHQpIHt9CisgICAgYm9vbCBydW4oVGVzdFNo
ZWxsKiBzaGVsbCkKKyAgICB7CisgICAgICAgIHNoZWxsLT53ZWJWaWV3KCktPm1haW5GcmFtZSgp
LT5leGVjdXRlU2NyaXB0KFdlYlNjcmlwdFNvdXJjZShXZWJTdHJpbmc6OmZyb21VVEY4KG1fc2Ny
aXB0KSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRklYTUU6IERpZCBpdCByZWFsbHkgc3Rh
cnQgYSBuYXZpZ2F0aW9uPworICAgIH0KK3ByaXZhdGU6CisgICAgc3RyaW5nIG1fc2NyaXB0Owor
fTsKKworY2xhc3MgV29ya0l0ZW1Ob25Mb2FkaW5nU2NyaXB0IDogcHVibGljIExheW91dFRlc3RD
b250cm9sbGVyOjpXb3JrSXRlbSB7CitwdWJsaWM6CisgICAgV29ya0l0ZW1Ob25Mb2FkaW5nU2Ny
aXB0KGNvbnN0IHN0cmluZyYgc2NyaXB0KSA6IG1fc2NyaXB0KHNjcmlwdCkge30KKyAgICBib29s
IHJ1bihUZXN0U2hlbGwqIHNoZWxsKQorICAgIHsKKyAgICAgICAgc2hlbGwtPndlYlZpZXcoKS0+
bWFpbkZyYW1lKCktPmV4ZWN1dGVTY3JpcHQoV2ViU2NyaXB0U291cmNlKFdlYlN0cmluZzo6ZnJv
bVVURjgobV9zY3JpcHQpKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Citwcml2YXRl
OgorICAgIHN0cmluZyBtX3NjcmlwdDsKK307CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OnF1ZXVlTG9hZGluZ1NjcmlwdChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3Bw
VmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1
bWVudHNbMF0uaXNTdHJpbmcoKSkKKyAgICAgICAgbV93b3JrUXVldWUuYWRkV29yayhuZXcgV29y
a0l0ZW1Mb2FkaW5nU2NyaXB0KGFyZ3VtZW50c1swXS50b1N0cmluZygpKSk7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlTm9uTG9h
ZGluZ1NjcmlwdChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCog
cmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVudHNbMF0u
aXNTdHJpbmcoKSkKKyAgICAgICAgbV93b3JrUXVldWUuYWRkV29yayhuZXcgV29ya0l0ZW1Ob25M
b2FkaW5nU2NyaXB0KGFyZ3VtZW50c1swXS50b1N0cmluZygpKSk7CisgICAgcmVzdWx0LT5zZXRO
dWxsKCk7Cit9CisKK2NsYXNzIFdvcmtJdGVtTG9hZCA6IHB1YmxpYyBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6V29ya0l0ZW0geworcHVibGljOgorICAgIFdvcmtJdGVtTG9hZChjb25zdCBXZWJVUkwm
IHVybCwgY29uc3QgV2ViU3RyaW5nJiB0YXJnZXQpCisgICAgICAgIDogbV91cmwodXJsKQorICAg
ICAgICAsIG1fdGFyZ2V0KHRhcmdldCkge30KKyAgICBib29sIHJ1bihUZXN0U2hlbGwqIHNoZWxs
KQorICAgIHsKKyAgICAgICAgc2hlbGwtPndlYlZpZXdIb3N0KCktPmxvYWRVUkxGb3JGcmFtZSht
X3VybCwgbV90YXJnZXQpOworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRklYTUU6IERpZCBpdCBy
ZWFsbHkgc3RhcnQgYSBuYXZpZ2F0aW9uPworICAgIH0KK3ByaXZhdGU6CisgICAgV2ViVVJMIG1f
dXJsOworICAgIFdlYlN0cmluZyBtX3RhcmdldDsKK307CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRy
b2xsZXI6OnF1ZXVlTG9hZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFy
aWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVu
dHNbMF0uaXNTdHJpbmcoKSkgeworICAgICAgICBHVVJMIGN1cnJlbnRVUkwgPSBtX3NoZWxsLT53
ZWJWaWV3KCktPm1haW5GcmFtZSgpLT51cmwoKTsKKyAgICAgICAgR1VSTCBmdWxsVVJMID0gY3Vy
cmVudFVSTC5SZXNvbHZlKGFyZ3VtZW50c1swXS50b1N0cmluZygpKTsKKworICAgICAgICBzdHJp
bmcgdGFyZ2V0ID0gIiI7CisgICAgICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMSAmJiBhcmd1
bWVudHNbMV0uaXNTdHJpbmcoKSkKKyAgICAgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1sxXS50
b1N0cmluZygpOworCisgICAgICAgIG1fd29ya1F1ZXVlLmFkZFdvcmsobmV3IFdvcmtJdGVtTG9h
ZChmdWxsVVJMLCBXZWJTdHJpbmc6OmZyb21VVEY4KHRhcmdldCkpKTsKKyAgICB9CisgICAgcmVz
dWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6Om9iakNJZGVu
dGl0eUlzRXF1YWwoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA8IDIpIHsKKyAgICAgICAgLy8g
VGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8gdG8gcmV0dXJuIGFuIGVycm9yLgorICAgICAgICBy
ZXN1bHQtPnNldE51bGwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXN1bHQtPnNl
dChhcmd1bWVudHNbMF0uaXNFcXVhbChhcmd1bWVudHNbMV0pKTsKK30KKwordm9pZCBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6cmVzZXQoKQoreworICAgIGlmIChtX3NoZWxsKSB7CisgICAgICAgIG1f
c2hlbGwtPndlYlZpZXcoKS0+c2V0Wm9vbUxldmVsKGZhbHNlLCAwKTsKKyAgICAgICAgbV9zaGVs
bC0+d2ViVmlldygpLT5zZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxlbWVudHModHJ1ZSk7CisjaWYg
ZGVmaW5lZChPU19MSU5VWCkKKyAgICAgICAgLy8gKENvbnN0YW50cyBjb3BpZWQgYmVjYXVzZSB3
ZSBjYW4ndCBkZXBlbmQgb24gdGhlIGhlYWRlciB0aGF0IGRlZmluZWQKKyAgICAgICAgLy8gdGhl
bSBmcm9tIHRoaXMgZmlsZS4pCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+c2V0U2VsZWN0
aW9uQ29sb3JzKDB4ZmYxZTkwZmYsIDB4ZmYwMDAwMDAsIDB4ZmZjOGM4YzgsIDB4ZmYzMjMyMzIp
OworI2VuZGlmIC8vIGRlZmluZWQoT1NfTElOVVgpCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXco
KS0+cmVtb3ZlQWxsVXNlckNvbnRlbnQoKTsKKyAgICB9CisgICAgbV9kdW1wQXNUZXh0ID0gZmFs
c2U7CisgICAgbV9kdW1wRWRpdGluZ0NhbGxiYWNrcyA9IGZhbHNlOworICAgIG1fZHVtcEZyYW1l
TG9hZENhbGxiYWNrcyA9IGZhbHNlOworICAgIG1fZHVtcFJlc291cmNlTG9hZENhbGxiYWNrcyA9
IGZhbHNlOworICAgIG1fZHVtcEJhY2tGb3J3YXJkTGlzdCA9IGZhbHNlOworICAgIG1fZHVtcENo
aWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMgPSBmYWxzZTsKKyAgICBtX2R1bXBDaGlsZEZyYW1lc0Fz
VGV4dCA9IGZhbHNlOworICAgIG1fZHVtcFdpbmRvd1N0YXR1c0NoYW5nZXMgPSBmYWxzZTsKKyAg
ICBtX2R1bXBTZWxlY3Rpb25SZWN0ID0gZmFsc2U7CisgICAgbV9kdW1wVGl0bGVDaGFuZ2VzID0g
ZmFsc2U7CisgICAgbV9hY2NlcHRzRWRpdGluZyA9IHRydWU7CisgICAgbV93YWl0VW50aWxEb25l
ID0gZmFsc2U7CisgICAgbV9jYW5PcGVuV2luZG93cyA9IGZhbHNlOworICAgIG1fdGVzdFJlcGFp
bnQgPSBmYWxzZTsKKyAgICBtX3N3ZWVwSG9yaXpvbnRhbGx5ID0gZmFsc2U7CisgICAgbV9zaG91
bGRBZGRGaWxlVG9QYXN0ZWJvYXJkID0gZmFsc2U7CisgICAgbV9zdG9wUHJvdmlzaW9uYWxGcmFt
ZUxvYWRzID0gZmFsc2U7CisgICAgbV9nbG9iYWxGbGFnLnNldChmYWxzZSk7CisgICAgbV93ZWJI
aXN0b3J5SXRlbUNvdW50LnNldCgwKTsKKworICAgIHdlYmtpdF9zdXBwb3J0OjpTZXRBY2NlcHRB
bGxDb29raWVzKGZhbHNlKTsKKyAgICBXZWJTZWN1cml0eVBvbGljeTo6cmVzZXRPcmlnaW5BY2Nl
c3NXaGl0ZUxpc3RzKCk7CisKKyAgICAvLyBSZXNldCB0aGUgZGVmYXVsdCBxdW90YSBmb3IgZWFj
aCBvcmlnaW4gdG8gNU1CCisgICAgd2Via2l0X3N1cHBvcnQ6OlNldERhdGFiYXNlUXVvdGEoNSAq
IDEwMjQgKiAxMDI0KTsKKworICAgIHNldGxvY2FsZShMQ19BTEwsICIiKTsKKworICAgIGlmICht
X2Nsb3NlUmVtYWluaW5nV2luZG93cykKKyAgICAgICAgbV9zaGVsbC0+Y2xvc2VSZW1haW5pbmdX
aW5kb3dzKCk7CisgICAgZWxzZQorICAgICAgICBtX2Nsb3NlUmVtYWluaW5nV2luZG93cyA9IHRy
dWU7CisgICAgbV93b3JrUXVldWUucmVzZXQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6bG9jYXRpb25DaGFuZ2VEb25lKCkKK3sKKyAgICBtX3dlYkhpc3RvcnlJdGVtQ291bnQu
c2V0KG1fc2hlbGwtPm5hdmlnYXRpb25FbnRyeUNvdW50KCkpOworCisgICAgLy8gTm8gbW9yZSBu
ZXcgd29yayBhZnRlciB0aGUgZmlyc3QgY29tcGxldGUgbG9hZC4KKyAgICBtX3dvcmtRdWV1ZS5z
ZXRGcm96ZW4odHJ1ZSk7CisKKyAgICBpZiAoIW1fd2FpdFVudGlsRG9uZSkKKyAgICAgICAgbV93
b3JrUXVldWUucHJvY2Vzc1dvcmtTb29uKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OnBvbGljeURlbGVnYXRlRG9uZSgpCit7CisgICAgQVNTRVJUKG1fd2FpdFVudGlsRG9uZSk7
CisgICAgbV9zaGVsbC0+dGVzdEZpbmlzaGVkKCk7CisgICAgbV93YWl0VW50aWxEb25lID0gZmFs
c2U7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldENhbk9wZW5XaW5kb3dzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX2Nhbk9w
ZW5XaW5kb3dzID0gdHJ1ZTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c2V0VGFiS2V5Q3ljbGVzVGhyb3VnaEVsZW1lbnRzKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYg
KGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAg
bV9zaGVsbC0+d2ViVmlldygpLT5zZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxlbWVudHMoYXJndW1l
bnRzWzBdLnRvQm9vbGVhbigpKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6d2luZG93Q291bnQoY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0KHN0YXRpY19jYXN0PGludD4o
bV9zaGVsbC0+d2luZG93Q291bnQoKSkpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpzZXRDbG9zZVJlbWFpbmluZ1dpbmRvd3NXaGVuQ29tcGxldGUoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRz
LnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX2Nsb3NlUmVt
YWluaW5nV2luZG93cyA9IGFyZ3VtZW50c1swXS52YWx1ZS5ib29sVmFsdWU7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEFsd2F5c0Fj
Y2VwdENvb2tpZXMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDApCisgICAgICAgIHdlYmtp
dF9zdXBwb3J0OjpTZXRBY2NlcHRBbGxDb29raWVzKGNwcFZhcmlhbnRUb0Jvb2woYXJndW1lbnRz
WzBdKSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRy
b2xsZXI6OnNldFdpbmRvd0lzS2V5KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBD
cHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFy
Z3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAgbV9zaGVsbC0+c2V0Rm9jdXMobV9zaGVsbC0+
d2ViVmlldygpLCBhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1bHQtPnNl
dE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VXNlclN0eWxlU2hl
ZXRFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiBy
ZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5p
c0Jvb2woKSkKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlldygpLT5zZXR0aW5ncygpLT5zZXRVc2Vy
U3R5bGVTaGVldExvY2F0aW9uKGFyZ3VtZW50c1swXS52YWx1ZS5ib29sVmFsdWUgPyBtX3VzZXJT
dHlsZVNoZWV0TG9jYXRpb24gOiBXZWJVUkwoKSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24o
Y29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sK
KyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzU3RyaW5nKCkp
IHsKKyAgICAgICAgbV91c2VyU3R5bGVTaGVldExvY2F0aW9uID0gR1VSTChUZXN0U2hlbGw6OnJl
d3JpdGVMb2NhbFVybChhcmd1bWVudHNbMF0udG9TdHJpbmcoKSkpOworICAgICAgICBtX3NoZWxs
LT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24obV91c2Vy
U3R5bGVTaGVldExvY2F0aW9uKTsKKyAgICB9CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmV4ZWNDb21tYW5kKGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXRO
dWxsKCk7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPD0gMCB8fCAhYXJndW1lbnRzWzBdLmlz
U3RyaW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHN0ZDo6c3RyaW5nIGNvbW1hbmQgPSBh
cmd1bWVudHNbMF0udG9TdHJpbmcoKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZSgiIik7CisgICAg
Ly8gSWdub3JlIHRoZSBzZWNvbmQgcGFyYW1ldGVyICh3aGljaCBpcyB1c2VySW50ZXJmYWNlKQor
ICAgIC8vIHNpbmNlIHRoaXMgY29tbWFuZCBlbXVsYXRlcyBhIG1hbnVhbCBhY3Rpb24uCisgICAg
aWYgKGFyZ3VtZW50cy5zaXplKCkgPj0gMyAmJiBhcmd1bWVudHNbMl0uaXNTdHJpbmcoKSkKKyAg
ICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMl0udG9TdHJpbmcoKTsKKworICAgIC8vIE5vdGU6IHdl
YmtpdCdzIHZlcnNpb24gZG9lcyBub3QgcmV0dXJuIHRoZSBib29sZWFuLCBzbyBuZWl0aGVyIGRv
IHdlLgorICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+Zm9jdXNlZEZyYW1lKCktPmV4ZWN1dGVDb21t
YW5kKFdlYlN0cmluZzo6ZnJvbVVURjgoY29tbWFuZCksIFdlYlN0cmluZzo6ZnJvbVVURjgodmFs
dWUpKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6aXNDb21tYW5kRW5hYmxlZChj
b25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQorewor
ICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDw9IDAgfHwgIWFyZ3VtZW50c1swXS5pc1N0cmluZygp
KSB7CisgICAgICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgc3RkOjpzdHJpbmcgY29tbWFuZCA9IGFyZ3VtZW50c1swXS50b1N0cmluZygpOworICAg
IGJvb2wgcnYgPSBtX3NoZWxsLT53ZWJWaWV3KCktPmZvY3VzZWRGcmFtZSgpLT5pc0NvbW1hbmRF
bmFibGVkKFdlYlN0cmluZzo6ZnJvbVVURjgoY29tbWFuZCkpOworICAgIHJlc3VsdC0+c2V0KHJ2
KTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0UG9wdXBCbG9ja2luZ0VuYWJs
ZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgp
KSB7CisgICAgICAgIGJvb2wgYmxvY2tQb3B1cHMgPSBhcmd1bWVudHNbMF0udG9Cb29sZWFuKCk7
CisgICAgICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+c2V0dGluZ3MoKS0+c2V0SmF2YVNjcmlwdENh
bk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSghYmxvY2tQb3B1cHMpOworICAgIH0KKyAgICByZXN1
bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VXNlRGFz
aGJvYXJkQ29tcGF0aWJpbGl0eU1vZGUoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIC8vIFdlIGhhdmUgbm8gbmVlZCB0byBzdXBwb3J0IERhc2hib2Fy
ZCBDb21wYXRpYmlsaXR5IE1vZGUgKG1hYy1vbmx5KQorICAgIHJlc3VsdC0+c2V0TnVsbCgpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRDdXN0b21Qb2xpY3lEZWxlZ2F0ZShj
b25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQorewor
ICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVudHNbMF0uaXNCb29sKCkpIHsK
KyAgICAgICAgYm9vbCBlbmFibGUgPSBhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlOworICAg
ICAgICBib29sIHBlcm1pc3NpdmUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5zaXpl
KCkgPiAxICYmIGFyZ3VtZW50c1sxXS5pc0Jvb2woKSkKKyAgICAgICAgICAgIHBlcm1pc3NpdmUg
PSBhcmd1bWVudHNbMV0udmFsdWUuYm9vbFZhbHVlOworICAgICAgICBtX3NoZWxsLT53ZWJWaWV3
SG9zdCgpLT5zZXRDdXN0b21Qb2xpY3lEZWxlZ2F0ZShlbmFibGUsIHBlcm1pc3NpdmUpOworICAg
IH0KKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6d2FpdEZvclBvbGljeURlbGVnYXRlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlh
bnQqIHJlc3VsdCkKK3sKKyAgICBtX3NoZWxsLT53ZWJWaWV3SG9zdCgpLT53YWl0Rm9yUG9saWN5
RGVsZWdhdGUoKTsKKyAgICBtX3dhaXRVbnRpbERvbmUgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0
TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRXaWxsU2VuZFJlcXVl
c3RSZXR1cm5zTnVsbE9uUmVkaXJlY3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMs
IENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYg
YXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3NoZWxsLT53ZWJWaWV3SG9zdCgpLT5z
ZXRCbG9ja1JlZGlyZWN0cyhhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1
bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0V2lsbFNl
bmRSZXF1ZXN0UmV0dXJuc051bGwoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENw
cFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJn
dW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3NoZWxsLT53ZWJWaWV3SG9zdCgpLT5zZXRS
ZXF1ZXN0UmV0dXJuTnVsbChhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1
bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cGF0aFRvTG9j
YWxSZXNvdXJjZShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCog
cmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1bWVudHMuc2l6
ZSgpIDw9IDAgfHwgIWFyZ3VtZW50c1swXS5pc1N0cmluZygpKQorICAgICAgICByZXR1cm47CisK
KyAgICBzdGQ6OnN0cmluZyB1cmwgPSBhcmd1bWVudHNbMF0udG9TdHJpbmcoKTsKKyAgICBpZiAo
U3RhcnRzV2l0aEFTQ0lJKHVybCwgIi90bXAvIiwgdHJ1ZSkpIHsKKyAgICAgICAgLy8gV2Ugd2Fu
dCBhIHRlbXAgZmlsZS4KKyAgICAgICAgRmlsZVBhdGggcGF0aDsKKyAgICAgICAgUGF0aFNlcnZp
Y2U6OkdldChiYXNlOjpESVJfVEVNUCwgJnBhdGgpOworICAgICAgICBwYXRoID0gcGF0aC5BcHBl
bmRBU0NJSSh1cmwuc3Vic3RyKDUpKTsKKyNpZiBPUyhXSU5ET1dTKQorICAgICAgICByZXN1bHQt
PnNldChVVEYxNlRvVVRGOChwYXRoLnZhbHVlKCkpKTsKKyNlbHNlCisgICAgICAgIHJlc3VsdC0+
c2V0KHBhdGgudmFsdWUoKSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFNvbWUgbGF5b3V0IHRlc3RzIHVzZSBmaWxlOi8vLy8gd2hpY2ggd2UgcmVzb2x2ZSBhcyBh
IFVOQyBwYXRoLiAgTm9ybWFsaXplCisgICAgLy8gdGhlbSB0byBqdXN0IGZpbGU6Ly8vLgorICAg
IHdoaWxlIChTdGFydHNXaXRoQVNDSUkodXJsLCAiZmlsZTovLy8vIiwgZmFsc2UpKQorICAgICAg
ICB1cmwgPSB1cmwuc3Vic3RyKDAsIDgpICsgdXJsLnN1YnN0cig5KTsKKyAgICBHVVJMIGxvY2F0
aW9uKFRlc3RTaGVsbDo6cmV3cml0ZUxvY2FsVXJsKHVybCkpOworICAgIHJlc3VsdC0+c2V0KGxv
Y2F0aW9uLnNwZWMoKSk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmFkZEZpbGVU
b1Bhc3RlYm9hcmRPbkRyYWcoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVz
dWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIG1fc2hvdWxkQWRkRmlsZVRvUGFz
dGVib2FyZCA9IHRydWU7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFN0b3BQ
cm92aXNpb25hbEZyYW1lTG9hZHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCog
cmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIG1fc3RvcFByb3Zpc2lvbmFs
RnJhbWVMb2FkcyA9IHRydWU7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFNt
YXJ0SW5zZXJ0RGVsZXRlRW5hYmxlZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywg
Q3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBh
cmd1bWVudHNbMF0uaXNCb29sKCkpCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXdIb3N0KCktPnNl
dFNtYXJ0SW5zZXJ0RGVsZXRlRW5hYmxlZChhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsK
KyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6
c2V0U2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZChjb25zdCBDcHBBcmd1bWVudExpc3Qm
IGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6
ZSgpID4gMCAmJiBhcmd1bWVudHNbMF0uaXNCb29sKCkpCisgICAgICAgIG1fc2hlbGwtPndlYlZp
ZXdIb3N0KCktPnNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJsZWQoYXJndW1lbnRzWzBd
LnZhbHVlLmJvb2xWYWx1ZSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK2Jvb2wgTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNlQW5pbWF0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKGNv
bnN0IFdlYlN0cmluZyYgYW5pbWF0aW9uTmFtZSwgZG91YmxlIHRpbWUsIGNvbnN0IFdlYlN0cmlu
ZyYgZWxlbWVudElkKQoreworICAgIFdlYkZyYW1lKiB3ZWJGcmFtZSA9IG1fc2hlbGwtPndlYlZp
ZXcoKS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCF3ZWJGcmFtZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgV2ViQW5pbWF0aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9IHdlYkZyYW1l
LT5hbmltYXRpb25Db250cm9sbGVyKCk7CisgICAgaWYgKCFjb250cm9sbGVyKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBXZWJFbGVtZW50IGVsZW1lbnQgPSB3ZWJGcmFtZS0+ZG9jdW1l
bnQoKS5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpOworICAgIGlmIChlbGVtZW50LmlzTnVsbCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGNvbnRyb2xsZXItPnBhdXNlQW5p
bWF0aW9uQXRUaW1lKGVsZW1lbnQsIGFuaW1hdGlvbk5hbWUsIHRpbWUpOworfQorCitib29sIExh
eW91dFRlc3RDb250cm9sbGVyOjpwYXVzZVRyYW5zaXRpb25BdFRpbWVPbkVsZW1lbnRXaXRoSWQo
Y29uc3QgV2ViU3RyaW5nJiBwcm9wZXJ0eU5hbWUsIGRvdWJsZSB0aW1lLCBjb25zdCBXZWJTdHJp
bmcmIGVsZW1lbnRJZCkKK3sKKyAgICBXZWJGcmFtZSogd2ViRnJhbWUgPSBtX3NoZWxsLT53ZWJW
aWV3KCktPm1haW5GcmFtZSgpOworICAgIGlmICghd2ViRnJhbWUpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIFdlYkFuaW1hdGlvbkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSB3ZWJGcmFt
ZS0+YW5pbWF0aW9uQ29udHJvbGxlcigpOworICAgIGlmICghY29udHJvbGxlcikKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgV2ViRWxlbWVudCBlbGVtZW50ID0gd2ViRnJhbWUtPmRvY3Vt
ZW50KCkuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKKyAgICBpZiAoZWxlbWVudC5pc051bGwo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBjb250cm9sbGVyLT5wYXVzZVRy
YW5zaXRpb25BdFRpbWUoZWxlbWVudCwgcHJvcGVydHlOYW1lLCB0aW1lKTsKK30KKworYm9vbCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6ZWxlbWVudERvZXNBdXRvQ29tcGxldGVGb3JFbGVtZW50V2l0
aElkKGNvbnN0IFdlYlN0cmluZyYgZWxlbWVudElkKQoreworICAgIFdlYkZyYW1lKiB3ZWJGcmFt
ZSA9IG1fc2hlbGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCF3ZWJGcmFtZSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgV2ViRWxlbWVudCBlbGVtZW50ID0gd2ViRnJh
bWUtPmRvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKKyAgICBpZiAoZWxlbWVu
dC5pc051bGwoKSB8fCAhZWxlbWVudC5oYXNUYWdOYW1lKCJpbnB1dCIpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBXZWJJbnB1dEVsZW1lbnQgaW5wdXRFbGVtZW50ID0gZWxlbWVudC50
b0VsZW1lbnQ8V2ViSW5wdXRFbGVtZW50PigpOworICAgIHJldHVybiBpbnB1dEVsZW1lbnQuYXV0
b0NvbXBsZXRlKCk7Cit9CisKK2ludCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bnVtYmVyT2ZBY3Rp
dmVBbmltYXRpb25zKCkKK3sKKyAgICBXZWJGcmFtZSogd2ViRnJhbWUgPSBtX3NoZWxsLT53ZWJW
aWV3KCktPm1haW5GcmFtZSgpOworICAgIGlmICghd2ViRnJhbWUpCisgICAgICAgIHJldHVybiAt
MTsKKworICAgIFdlYkFuaW1hdGlvbkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSB3ZWJGcmFtZS0+
YW5pbWF0aW9uQ29udHJvbGxlcigpOworICAgIGlmICghY29udHJvbGxlcikKKyAgICAgICAgcmV0
dXJuIC0xOworCisgICAgcmV0dXJuIGNvbnRyb2xsZXItPm51bWJlck9mQWN0aXZlQW5pbWF0aW9u
cygpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpwYXVzZUFuaW1hdGlvbkF0VGlt
ZU9uRWxlbWVudFdpdGhJZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFy
aWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMiAmJiBhcmd1bWVu
dHNbMF0uaXNTdHJpbmcoKSAmJiBhcmd1bWVudHNbMV0uaXNOdW1iZXIoKSAmJiBhcmd1bWVudHNb
Ml0uaXNTdHJpbmcoKSkgeworICAgICAgICBXZWJTdHJpbmcgYW5pbWF0aW9uTmFtZSA9IGNwcFZh
cmlhbnRUb1dlYlN0cmluZyhhcmd1bWVudHNbMF0pOworICAgICAgICBkb3VibGUgdGltZSA9IGFy
Z3VtZW50c1sxXS50b0RvdWJsZSgpOworICAgICAgICBXZWJTdHJpbmcgZWxlbWVudElkID0gY3Bw
VmFyaWFudFRvV2ViU3RyaW5nKGFyZ3VtZW50c1syXSk7CisgICAgICAgIHJlc3VsdC0+c2V0KHBh
dXNlQW5pbWF0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKGFuaW1hdGlvbk5hbWUsIHRpbWUsIGVs
ZW1lbnRJZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC0+c2V0KGZhbHNlKTsKKyAg
ICB9Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNlVHJhbnNpdGlvbkF0VGlt
ZU9uRWxlbWVudFdpdGhJZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFy
aWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMiAmJiBhcmd1bWVu
dHNbMF0uaXNTdHJpbmcoKSAmJiBhcmd1bWVudHNbMV0uaXNOdW1iZXIoKSAmJiBhcmd1bWVudHNb
Ml0uaXNTdHJpbmcoKSkgeworICAgICAgICBXZWJTdHJpbmcgcHJvcGVydHlOYW1lID0gY3BwVmFy
aWFudFRvV2ViU3RyaW5nKGFyZ3VtZW50c1swXSk7CisgICAgICAgIGRvdWJsZSB0aW1lID0gYXJn
dW1lbnRzWzFdLnRvRG91YmxlKCk7CisgICAgICAgIFdlYlN0cmluZyBlbGVtZW50SWQgPSBjcHBW
YXJpYW50VG9XZWJTdHJpbmcoYXJndW1lbnRzWzJdKTsKKyAgICAgICAgcmVzdWx0LT5zZXQocGF1
c2VUcmFuc2l0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKHByb3BlcnR5TmFtZSwgdGltZSwgZWxl
bWVudElkKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LT5zZXQoZmFsc2UpOworICAg
IH0KK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZWxlbWVudERvZXNBdXRvQ29tcGxl
dGVGb3JFbGVtZW50V2l0aElkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgIT0gMSB8fCAhYXJn
dW1lbnRzWzBdLmlzU3RyaW5nKCkpIHsKKyAgICAgICAgcmVzdWx0LT5zZXQoZmFsc2UpOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIFdlYlN0cmluZyBlbGVtZW50SWQgPSBjcHBWYXJpYW50
VG9XZWJTdHJpbmcoYXJndW1lbnRzWzBdKTsKKyAgICByZXN1bHQtPnNldChlbGVtZW50RG9lc0F1
dG9Db21wbGV0ZUZvckVsZW1lbnRXaXRoSWQoZWxlbWVudElkKSk7Cit9CisKK3ZvaWQgTGF5b3V0
VGVzdENvbnRyb2xsZXI6Om51bWJlck9mQWN0aXZlQW5pbWF0aW9ucyhjb25zdCBDcHBBcmd1bWVu
dExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXQobnVtYmVyT2ZB
Y3RpdmVBbmltYXRpb25zKCkpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkaXNh
YmxlSW1hZ2VMb2FkaW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3Vs
dCkKK3sKKyAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldExvYWRzSW1hZ2Vz
QXV0b21hdGljYWxseShmYWxzZSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQg
TGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEljb25EYXRhYmFzZUVuYWJsZWQoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIC8vIFdlIGRvbid0IHVzZSB0
aGUgV2ViS2l0IGljb24gZGF0YWJhc2UuCisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKKy8v
CisvLyBVbmltcGxlbWVudGVkIHN0dWJzCisvLworCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpkdW1wQXNXZWJBcmNoaXZlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnNldE1haW5GcmFtZUlzRmlyc3RSZXNwb25kZXIoY29uc3QgQ3Bw
QXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1
bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcFNlbGVj
dGlvblJlY3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJl
c3VsdCkKK3sKKyAgICBtX2R1bXBTZWxlY3Rpb25SZWN0ID0gdHJ1ZTsKKyAgICByZXN1bHQtPnNl
dE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZGlzcGxheShjb25zdCBD
cHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIFdl
YlZpZXdIb3N0KiBob3N0ID0gbV9zaGVsbC0+d2ViVmlld0hvc3QoKTsKKyAgICBjb25zdCBXZWJL
aXQ6OldlYlNpemUmIHNpemUgPSBtX3NoZWxsLT53ZWJWaWV3KCktPnNpemUoKTsKKyAgICBXZWJS
ZWN0IHJlY3QoMCwgMCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOworICAgIGhvc3QtPnVwZGF0
ZVBhaW50UmVjdChyZWN0KTsKKyAgICBob3N0LT5wYWludEludmFsaWRhdGVkUmVnaW9uKCk7Cisg
ICAgaG9zdC0+ZGlzcGxheVJlcGFpbnRNYXNrKCk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnRlc3RSZXBhaW50KGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX3Rlc3RSZXBhaW50ID0gdHJ1
ZTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6cmVwYWludFN3ZWVwSG9yaXpvbnRhbGx5KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX3N3ZWVwSG9yaXpvbnRhbGx5ID0gdHJ1ZTsKKyAgICBy
ZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2xlYXJC
YWNrRm9yd2FyZExpc3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlh
bnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6a2VlcFdlYkhpc3RvcnkoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1
bWVudHMsICBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnN0b3JlV2ViU2NyaXB0T2JqZWN0KGNvbnN0
IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
cmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmFjY2Vz
c1N0b3JlZFdlYlNjcmlwdE9iamVjdChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywg
Q3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpvYmpDQ2xhc3NOYW1lT2YoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51
bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkRGlzYWxsb3dlZFVSTChj
b25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQorewor
ICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0
Q2FsbENsb3NlT25XZWJWaWV3cyhjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3Bw
VmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExh
eW91dFRlc3RDb250cm9sbGVyOjpzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGNvbnN0IENwcEFy
Z3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFhTU0F1ZGl0
b3JFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiBy
ZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5p
c0Jvb2woKSkKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlldygpLT5zZXR0aW5ncygpLT5zZXRYU1NB
dWRpdG9yRW5hYmxlZChhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1bHQt
PnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZXZhbHVhdGVTY3Jp
cHRJbklzb2xhdGVkV29ybGQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZh
cmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+PSAyICYmIGFyZ3Vt
ZW50c1swXS5pc051bWJlcigpICYmIGFyZ3VtZW50c1sxXS5pc1N0cmluZygpKSB7CisgICAgICAg
IFdlYlNjcmlwdFNvdXJjZSBzb3VyY2UoV2ViU3RyaW5nOjpmcm9tVVRGOChhcmd1bWVudHNbMV0u
dG9TdHJpbmcoKSkpOworICAgICAgICAvLyBUaGlzIHJlbGllcyBvbiB0aGUgaWZyYW1lIGZvY3Vz
aW5nIGl0c2VsZiB3aGVuIGl0IGxvYWRzLiBUaGlzIGlzIGEgYml0CisgICAgICAgIC8vIHNrZXRj
aHksIGJ1dCBpdCBzZWVtcyB0byBiZSB3aGF0IG90aGVyIHRlc3RzIGRvLgorICAgICAgICBtX3No
ZWxsLT53ZWJWaWV3KCktPmZvY3VzZWRGcmFtZSgpLT5leGVjdXRlU2NyaXB0SW5Jc29sYXRlZFdv
cmxkKGFyZ3VtZW50c1swXS50b0ludDMyKCksICZzb3VyY2UsIDEsIDEpOworICAgIH0KKyAgICBy
ZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWxs
b3dVbml2ZXJzYWxBY2Nlc3NGcm9tRmlsZVVSTHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1
bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+
IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3NoZWxsLT53ZWJWaWV3KCkt
PnNldHRpbmdzKCktPnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKGFyZ3VtZW50
c1swXS52YWx1ZS5ib29sVmFsdWUpOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpzZXRBbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVSTHMoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAg
ICAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldEFsbG93RmlsZUFjY2Vzc0Zy
b21GaWxlVVJMcyhhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1bHQtPnNl
dE51bGwoKTsKK30KKworLy8gTmVlZCB0aGVzZSBjb252ZXJzaW9ucyBiZWNhdXNlIHRoZSBmb3Jt
YXQgb2YgdGhlIHZhbHVlIGZvciBib29sZWFucworLy8gbWF5IHZhcnkgLSBmb3IgZXhhbXBsZSwg
b24gbWFjICIxIiBhbmQgIjAiIGFyZSB1c2VkIGZvciBib29sZWFuLgorYm9vbCBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6Y3BwVmFyaWFudFRvQm9vbChjb25zdCBDcHBWYXJpYW50JiB2YWx1ZSkKK3sK
KyAgICBpZiAodmFsdWUuaXNCb29sKCkpCisgICAgICAgIHJldHVybiB2YWx1ZS50b0Jvb2xlYW4o
KTsKKyAgICBpZiAodmFsdWUuaXNJbnQzMigpKQorICAgICAgICByZXR1cm4gdmFsdWUudG9JbnQz
MigpOworICAgIGlmICh2YWx1ZS5pc1N0cmluZygpKSB7CisgICAgICAgIHN0cmluZyB2YWx1ZVN0
cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgIGlmICh2YWx1ZVN0cmluZyA9PSAidHJ1
ZSIgfHwgdmFsdWVTdHJpbmcgPT0gIjEiKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGlmICh2YWx1ZVN0cmluZyA9PSAiZmFsc2UiIHx8IHZhbHVlU3RyaW5nID09ICIwIikKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbG9nRXJyb3JUb0NvbnNvbGUoIklu
dmFsaWQgdmFsdWUuIEV4cGVjdGVkIGJvb2xlYW4gdmFsdWUuIik7CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitpbnQzMl90IExheW91dFRlc3RDb250cm9sbGVyOjpjcHBWYXJpYW50VG9JbnQzMihj
b25zdCBDcHBWYXJpYW50JiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUuaXNJbnQzMigpKQorICAg
ICAgICByZXR1cm4gdmFsdWUudG9JbnQzMigpOworICAgIGlmICh2YWx1ZS5pc1N0cmluZygpKSB7
CisgICAgICAgIGludCBudW1iZXI7CisgICAgICAgIGlmIChTdHJpbmdUb0ludCh2YWx1ZS50b1N0
cmluZygpLCAmbnVtYmVyKSkKKyAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgfQorICAg
IGxvZ0Vycm9yVG9Db25zb2xlKCJJbnZhbGlkIHZhbHVlIGZvciBwcmVmZXJlbmNlLiBFeHBlY3Rl
ZCBpbnRlZ2VyIHZhbHVlLiIpOworICAgIHJldHVybiAwOworfQorCitXZWJTdHJpbmcgTGF5b3V0
VGVzdENvbnRyb2xsZXI6OmNwcFZhcmlhbnRUb1dlYlN0cmluZyhjb25zdCBDcHBWYXJpYW50JiB2
YWx1ZSkKK3sKKyAgICBpZiAoIXZhbHVlLmlzU3RyaW5nKCkpIHsKKyAgICAgICAgbG9nRXJyb3JU
b0NvbnNvbGUoIkludmFsaWQgdmFsdWUgZm9yIHByZWZlcmVuY2UuIEV4cGVjdGVkIHN0cmluZyB2
YWx1ZS4iKTsKKyAgICAgICAgcmV0dXJuIFdlYlN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4g
V2ViU3RyaW5nOjpmcm9tVVRGOCh2YWx1ZS50b1N0cmluZygpKTsKK30KKwordm9pZCBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6b3ZlcnJpZGVQcmVmZXJlbmNlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYg
YXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7
CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgIT0gMiB8fCAhYXJndW1lbnRzWzBdLmlzU3RyaW5n
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHN0cmluZyBrZXkgPSBhcmd1bWVudHNbMF0udG9T
dHJpbmcoKTsKKyAgICBDcHBWYXJpYW50IHZhbHVlID0gYXJndW1lbnRzWzFdOworICAgIFdlYlNl
dHRpbmdzKiBzZXR0aW5ncyA9IG1fc2hlbGwtPndlYlZpZXcoKS0+c2V0dGluZ3MoKTsKKyAgICBp
ZiAoa2V5ID09ICJXZWJLaXRTdGFuZGFyZEZvbnQiKQorICAgICAgICBzZXR0aW5ncy0+c2V0U3Rh
bmRhcmRGb250RmFtaWx5KGNwcFZhcmlhbnRUb1dlYlN0cmluZyh2YWx1ZSkpOworICAgIGVsc2Ug
aWYgKGtleSA9PSAiV2ViS2l0Rml4ZWRGb250IikKKyAgICAgICAgc2V0dGluZ3MtPnNldEZpeGVk
Rm9udEZhbWlseShjcHBWYXJpYW50VG9XZWJTdHJpbmcodmFsdWUpKTsKKyAgICBlbHNlIGlmIChr
ZXkgPT0gIldlYktpdFNlcmlmRm9udCIpCisgICAgICAgIHNldHRpbmdzLT5zZXRTZXJpZkZvbnRG
YW1pbHkoY3BwVmFyaWFudFRvV2ViU3RyaW5nKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09
ICJXZWJLaXRTYW5zU2VyaWZGb250IikKKyAgICAgICAgc2V0dGluZ3MtPnNldFNhbnNTZXJpZkZv
bnRGYW1pbHkoY3BwVmFyaWFudFRvV2ViU3RyaW5nKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5
ID09ICJXZWJLaXRDdXJzaXZlRm9udCIpCisgICAgICAgIHNldHRpbmdzLT5zZXRDdXJzaXZlRm9u
dEZhbWlseShjcHBWYXJpYW50VG9XZWJTdHJpbmcodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkg
PT0gIldlYktpdEZhbnRhc3lGb250IikKKyAgICAgICAgc2V0dGluZ3MtPnNldEZhbnRhc3lGb250
RmFtaWx5KGNwcFZhcmlhbnRUb1dlYlN0cmluZyh2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9
PSAiV2ViS2l0RGVmYXVsdEZvbnRTaXplIikKKyAgICAgICAgc2V0dGluZ3MtPnNldERlZmF1bHRG
b250U2l6ZShjcHBWYXJpYW50VG9JbnQzMih2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAi
V2ViS2l0RGVmYXVsdEZpeGVkRm9udFNpemUiKQorICAgICAgICBzZXR0aW5ncy0+c2V0RGVmYXVs
dEZpeGVkRm9udFNpemUoY3BwVmFyaWFudFRvSW50MzIodmFsdWUpKTsKKyAgICBlbHNlIGlmIChr
ZXkgPT0gIldlYktpdE1pbmltdW1Gb250U2l6ZSIpCisgICAgICAgIHNldHRpbmdzLT5zZXRNaW5p
bXVtRm9udFNpemUoY3BwVmFyaWFudFRvSW50MzIodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkg
PT0gIldlYktpdE1pbmltdW1Mb2dpY2FsRm9udFNpemUiKQorICAgICAgICBzZXR0aW5ncy0+c2V0
TWluaW11bUxvZ2ljYWxGb250U2l6ZShjcHBWYXJpYW50VG9JbnQzMih2YWx1ZSkpOworICAgIGVs
c2UgaWYgKGtleSA9PSAiV2ViS2l0RGVmYXVsdFRleHRFbmNvZGluZ05hbWUiKQorICAgICAgICBz
ZXR0aW5ncy0+c2V0RGVmYXVsdFRleHRFbmNvZGluZ05hbWUoY3BwVmFyaWFudFRvV2ViU3RyaW5n
KHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRKYXZhU2NyaXB0RW5hYmxlZCIp
CisgICAgICAgIHNldHRpbmdzLT5zZXRKYXZhU2NyaXB0RW5hYmxlZChjcHBWYXJpYW50VG9Cb29s
KHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRXZWJTZWN1cml0eUVuYWJsZWQi
KQorICAgICAgICBzZXR0aW5ncy0+c2V0V2ViU2VjdXJpdHlFbmFibGVkKGNwcFZhcmlhbnRUb0Jv
b2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdEphdmFTY3JpcHRDYW5PcGVu
V2luZG93c0F1dG9tYXRpY2FsbHkiKQorICAgICAgICBzZXR0aW5ncy0+c2V0SmF2YVNjcmlwdENh
bk9wZW5XaW5kb3dzQXV0b21hdGljYWxseShjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAg
ZWxzZSBpZiAoa2V5ID09ICJXZWJLaXREaXNwbGF5SW1hZ2VzS2V5IikKKyAgICAgICAgc2V0dGlu
Z3MtPnNldExvYWRzSW1hZ2VzQXV0b21hdGljYWxseShjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7
CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRQbHVnaW5zRW5hYmxlZCIpCisgICAgICAgIHNl
dHRpbmdzLT5zZXRQbHVnaW5zRW5hYmxlZChjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAg
ZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRET01QYXN0ZUFsbG93ZWRQcmVmZXJlbmNlS2V5IikKKyAg
ICAgICAgc2V0dGluZ3MtPnNldERPTVBhc3RlQWxsb3dlZChjcHBWYXJpYW50VG9Cb29sKHZhbHVl
KSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXREZXZlbG9wZXJFeHRyYXNFbmFibGVkUHJl
ZmVyZW5jZUtleSIpCisgICAgICAgIHNldHRpbmdzLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFibGVk
KGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdFNo
cmlua3NTdGFuZGFsb25lSW1hZ2VzVG9GaXQiKQorICAgICAgICBzZXR0aW5ncy0+c2V0U2hyaW5r
c1N0YW5kYWxvbmVJbWFnZXNUb0ZpdChjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAgZWxz
ZSBpZiAoa2V5ID09ICJXZWJLaXRUZXh0QXJlYXNBcmVSZXNpemFibGUiKQorICAgICAgICBzZXR0
aW5ncy0+c2V0VGV4dEFyZWFzQXJlUmVzaXphYmxlKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsK
KyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdEphdmFFbmFibGVkIikKKyAgICAgICAgc2V0dGlu
Z3MtPnNldEphdmFFbmFibGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlm
IChrZXkgPT0gIldlYktpdFVzZXNQYWdlQ2FjaGVQcmVmZXJlbmNlS2V5IikKKyAgICAgICAgc2V0
dGluZ3MtPnNldFVzZXNQYWdlQ2FjaGUoY3BwVmFyaWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVs
c2UgaWYgKGtleSA9PSAiV2ViS2l0WFNTQXVkaXRvckVuYWJsZWQiKQorICAgICAgICBzZXR0aW5n
cy0+c2V0WFNTQXVkaXRvckVuYWJsZWQoY3BwVmFyaWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVs
c2UgaWYgKGtleSA9PSAiV2ViS2l0TG9jYWxTdG9yYWdlRW5hYmxlZFByZWZlcmVuY2VLZXkiKQor
ICAgICAgICBzZXR0aW5ncy0+c2V0TG9jYWxTdG9yYWdlRW5hYmxlZChjcHBWYXJpYW50VG9Cb29s
KHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRPZmZsaW5lV2ViQXBwbGljYXRp
b25DYWNoZUVuYWJsZWQiKQorICAgICAgICBzZXR0aW5ncy0+c2V0T2ZmbGluZVdlYkFwcGxpY2F0
aW9uQ2FjaGVFbmFibGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChr
ZXkgPT0gIldlYktpdFRhYlRvTGlua3NQcmVmZXJlbmNlS2V5IikKKyAgICAgICAgbV9zaGVsbC0+
d2ViVmlldygpLT5zZXRUYWJzVG9MaW5rcyhjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAg
ZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRXZWJHTEVuYWJsZWQiKQorICAgICAgICBzZXR0aW5ncy0+
c2V0RXhwZXJpbWVudGFsV2ViR0xFbmFibGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAg
ICBlbHNlIHsKKyAgICAgICAgc3RyaW5nIG1lc3NhZ2UoIkludmFsaWQgbmFtZSBmb3IgcHJlZmVy
ZW5jZTogIik7CisgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGtleSk7CisgICAgICAgIGxvZ0Vycm9y
VG9Db25zb2xlKG1lc3NhZ2UpOworICAgIH0KK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6ZmFsbGJhY2tNZXRob2QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVz
dWx0KQoreworICAgIHByaW50ZigiQ09OU09MRSBNRVNTQUdFOiBKYXZhU2NyaXB0IEVSUk9SOiB1
bmtub3duIG1ldGhvZCBjYWxsZWQgb24gTGF5b3V0VGVzdENvbnRyb2xsZXJcbiIpOworICAgIHJl
c3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjp3aGl0ZUxp
c3RBY2Nlc3NGcm9tT3JpZ2luKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7CisKKyAgICBpZiAoYXJn
dW1lbnRzLnNpemUoKSAhPSA0IHx8ICFhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSB8fCAhYXJndW1l
bnRzWzFdLmlzU3RyaW5nKCkKKyAgICAgICAgfHwgIWFyZ3VtZW50c1syXS5pc1N0cmluZygpIHx8
ICFhcmd1bWVudHNbM10uaXNCb29sKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFdlYktpdDo6
V2ViVVJMIHVybChHVVJMKGFyZ3VtZW50c1swXS50b1N0cmluZygpKSk7CisgICAgaWYgKCF1cmwu
aXNWYWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBXZWJTZWN1cml0eVBvbGljeTo6d2hp
dGVMaXN0QWNjZXNzRnJvbU9yaWdpbih1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgV2ViU3RyaW5nOjpmcm9tVVRGOChhcmd1bWVudHNbMV0udG9T
dHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgV2ViU3RyaW5nOjpmcm9tVVRGOChhcmd1bWVudHNbMl0udG9TdHJpbmcoKSksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzWzNdLnRv
Qm9vbGVhbigpKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2xlYXJBbGxEYXRh
YmFzZXMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3Vs
dCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICB3ZWJraXRfc3VwcG9ydDo6Q2xlYXJB
bGxEYXRhYmFzZXMoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0RGF0YWJh
c2VRdW90YShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVz
dWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmICgoYXJndW1lbnRzLnNpemUo
KSA+PSAxKSAmJiBhcmd1bWVudHNbMF0uaXNJbnQzMigpKQorICAgICAgICB3ZWJraXRfc3VwcG9y
dDo6U2V0RGF0YWJhc2VRdW90YShhcmd1bWVudHNbMF0udG9JbnQzMigpKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0UE9TSVhMb2NhbGUoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwo
KTsKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA9PSAxICYmIGFyZ3VtZW50c1swXS5pc1N0cmlu
ZygpKQorICAgICAgICBzZXRsb2NhbGUoTENfQUxMLCBhcmd1bWVudHNbMF0udG9TdHJpbmcoKS5j
X3N0cigpKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y291bnRlclZhbHVlRm9y
RWxlbWVudEJ5SWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICBpZiAoYXJndW1lbnRzLnNp
emUoKSA8IDEgfHwgIWFyZ3VtZW50c1swXS5pc1N0cmluZygpKQorICAgICAgICByZXR1cm47Cisg
ICAgV2ViRnJhbWUqIGZyYW1lID0gbV9zaGVsbC0+d2ViVmlldygpLT5tYWluRnJhbWUoKTsKKyAg
ICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgV2ViU3RyaW5nIGNvdW50ZXJWYWx1
ZSA9IGZyYW1lLT5jb3VudGVyVmFsdWVGb3JFbGVtZW50QnlJZChjcHBWYXJpYW50VG9XZWJTdHJp
bmcoYXJndW1lbnRzWzBdKSk7CisgICAgaWYgKGNvdW50ZXJWYWx1ZS5pc051bGwoKSkKKyAgICAg
ICAgcmV0dXJuOworICAgIHJlc3VsdC0+c2V0KGNvdW50ZXJWYWx1ZS51dGY4KCkpOworfQorCitz
dGF0aWMgYm9vbCBwYXJzZVBhZ2VTaXplUGFyYW1ldGVycyhjb25zdCBDcHBBcmd1bWVudExpc3Qm
IGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdP
ZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGFnZVdp
ZHRoSW5QaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCog
cGFnZUhlaWdodEluUGl4ZWxzKQoreworICAgIC8vIFdlYktpdCBpcyB1c2luZyB0aGUgd2luZG93
IHdpZHRoL2hlaWdodCBvZiBEdW1wUmVuZGVyVHJlZSBhcyB0aGUKKyAgICAvLyBkZWZhdWx0IHZh
bHVlIG9mIHRoZSBwYWdlIHNpemUuCisgICAgLy8gRklYTUU6IHNoYXJlIHRoZXNlIHZhbHVlcyB3
aXRoIG90aGVyIHBvcnRzLgorICAgICpwYWdlV2lkdGhJblBpeGVscyA9IDgwMDsKKyAgICAqcGFn
ZUhlaWdodEluUGl4ZWxzID0gNjAwOworICAgIHN3aXRjaCAoYXJndW1lbnRzLnNpemUoKSAtIGFy
Z09mZnNldCkgeworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKCFhcmd1bWVudHNbYXJnT2Zmc2V0
XS5pc051bWJlcigpIHx8ICFhcmd1bWVudHNbMSArIGFyZ09mZnNldF0uaXNOdW1iZXIoKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKnBhZ2VXaWR0aEluUGl4ZWxzID0gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KGFyZ3VtZW50c1thcmdPZmZzZXRdLnRvSW50MzIoKSk7CisgICAgICAg
ICpwYWdlSGVpZ2h0SW5QaXhlbHMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXJndW1lbnRzWzEgKyBh
cmdPZmZzZXRdLnRvSW50MzIoKSk7CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4KKyAgICBjYXNl
IDA6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OnBhZ2VOdW1iZXJGb3JFbGVtZW50QnlJZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGZs
b2F0IHBhZ2VXaWR0aEluUGl4ZWxzID0gMDsKKyAgICBmbG9hdCBwYWdlSGVpZ2h0SW5QaXhlbHMg
PSAwOworICAgIGlmICghcGFyc2VQYWdlU2l6ZVBhcmFtZXRlcnMoYXJndW1lbnRzLCAxLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhZ2VXaWR0aEluUGl4ZWxzLCAmcGFnZUhl
aWdodEluUGl4ZWxzKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghYXJndW1lbnRzWzBdLmlz
U3RyaW5nKCkpCisgICAgICAgIHJldHVybjsKKyAgICBXZWJGcmFtZSogZnJhbWUgPSBtX3NoZWxs
LT53ZWJWaWV3KCktPm1haW5GcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVy
bjsKKyAgICByZXN1bHQtPnNldChmcmFtZS0+cGFnZU51bWJlckZvckVsZW1lbnRCeUlkKGNwcFZh
cmlhbnRUb1dlYlN0cmluZyhhcmd1bWVudHNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVdpZHRoSW5QaXhlbHMsIHBhZ2VIZWlnaHRJblBp
eGVscykpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpudW1iZXJPZlBhZ2VzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7Cisg
ICAgcmVzdWx0LT5zZXROdWxsKCk7CisgICAgZmxvYXQgcGFnZVdpZHRoSW5QaXhlbHMgPSAwOwor
ICAgIGZsb2F0IHBhZ2VIZWlnaHRJblBpeGVscyA9IDA7CisgICAgaWYgKCFwYXJzZVBhZ2VTaXpl
UGFyYW1ldGVycyhhcmd1bWVudHMsIDAsICZwYWdlV2lkdGhJblBpeGVscywgJnBhZ2VIZWlnaHRJ
blBpeGVscykpCisgICAgICAgIHJldHVybjsKKworICAgIFdlYkZyYW1lKiBmcmFtZSA9IG1fc2hl
bGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0
dXJuOworICAgIFdlYlNpemUgc2l6ZShwYWdlV2lkdGhJblBpeGVscywgcGFnZUhlaWdodEluUGl4
ZWxzKTsKKyAgICBpbnQgbnVtYmVyT2ZQYWdlcyA9IGZyYW1lLT5wcmludEJlZ2luKHNpemUpOwor
ICAgIGZyYW1lLT5wcmludEVuZCgpOworICAgIHJlc3VsdC0+c2V0KG51bWJlck9mUGFnZXMpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpsb2dFcnJvclRvQ29uc29sZShjb25zdCBz
dGQ6OnN0cmluZyYgdGV4dCkKK3sKKyAgICBtX3NoZWxsLT53ZWJWaWV3SG9zdCgpLT5kaWRBZGRN
ZXNzYWdlVG9Db25zb2xlKAorICAgICAgICBXZWJDb25zb2xlTWVzc2FnZShXZWJDb25zb2xlTWVz
c2FnZTo6TGV2ZWxFcnJvciwgV2ViU3RyaW5nOjpmcm9tVVRGOCh0ZXh0KSksCisgICAgICAgIFdl
YlN0cmluZygpLCAwKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VGltZWxp
bmVQcm9maWxpbmdFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7CisgICAgaWYgKGFyZ3Vt
ZW50cy5zaXplKCkgPCAxIHx8ICFhcmd1bWVudHNbMF0uaXNCb29sKCkpCisgICAgICAgIHJldHVy
bjsKKyAgICAvLyBGSVhNRTogU2hvdWxkIGNhbGwgVGVzdFNoZWxsRGV2VG9vbHNBZ2VudDo6c2V0
VGltZWxpbmVQcm9maWxpbmdFbmFibGVkKCkuCit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OmV2YWx1YXRlSW5XZWJJbnNwZWN0b3IoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVu
dHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICBp
ZiAoYXJndW1lbnRzLnNpemUoKSA8IDIgfHwgIWFyZ3VtZW50c1swXS5pc0ludDMyKCkgfHwgIWFy
Z3VtZW50c1sxXS5pc1N0cmluZygpKQorICAgICAgICByZXR1cm47CisgICAgLy8gRklYTUU6IFNo
b3VsZCBjYWxsIFRlc3RTaGVsbERldlRvb2xzQWdlbnQ6OmV2YWx1YXRlSW5XZWJJbnNwZWN0b3Io
KS4KK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Zm9yY2VSZWRTZWxlY3Rpb25Db2xv
cnMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldFNl
bGVjdGlvbkNvbG9ycygweGZmZWUwMDAwLCAweGZmMDBlZTAwLCAweGZmMDAwMDAwLCAweGZmYzBj
MGMwKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkVXNlclNjcmlwdChjb25z
dCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAg
IHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDwgMSB8fCAhYXJn
dW1lbnRzWzBdLmlzU3RyaW5nKCkgfHwgIWFyZ3VtZW50c1sxXS5pc0Jvb2woKSkKKyAgICAgICAg
cmV0dXJuOworICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+YWRkVXNlclNjcmlwdChXZWJTdHJpbmc6
OmZyb21VVEY4KGFyZ3VtZW50c1swXS50b1N0cmluZygpKSwgYXJndW1lbnRzWzFdLnRvQm9vbGVh
bigpKTsKK30KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVt
L0xheW91dFRlc3RDb250cm9sbGVyLmggYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJv
bWl1bS9MYXlvdXRUZXN0Q29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmRhNTcyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVy
VHJlZS9jaHJvbWl1bS9MYXlvdXRUZXN0Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsNDQwIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUGF3ZWwgSGFqZGFuIChwaGFqZGFuLmpyQGNocm9taXVt
Lm9yZykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisvKgorICBMYXlvdXRUZXN0Q29udHJvbGxlciBjbGFzczoKKyAgQm91bmQgdG8gYSBKYXZhU2Ny
aXB0IHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlciBvYmplY3QgdXNpbmcgdGhlCisgIENwcEJv
dW5kQ2xhc3M6OmJpbmRUb0phdmFzY3JpcHQoKSwgdGhpcyBhbGxvd3MgbGF5b3V0IHRlc3RzIHRo
YXQgYXJlIHJ1biBpbgorICB0aGUgdGVzdF9zaGVsbCAob3IsIGluIHByaW5jaXBsZSwgYW55IHdl
YiBwYWdlIGxvYWRlZCBpbnRvIGEgY2xpZW50IGFwcCBidWlsdAorICB3aXRoIHRoaXMgY2xhc3Mp
IHRvIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgdGVzdHMgYXJlIHJ1biBhbmQg
d2hhdAorICBzb3J0IG9mIG91dHB1dCB0aGV5IHByb2R1Y2UuCisqLworCisjaWZuZGVmIExheW91
dFRlc3RDb250cm9sbGVyX2gKKyNkZWZpbmUgTGF5b3V0VGVzdENvbnRyb2xsZXJfaAorCisjaW5j
bHVkZSAiQ3BwQm91bmRDbGFzcy5oIgorI2luY2x1ZGUgImJhc2UvdGltZXIuaCIKKyNpbmNsdWRl
ICJwdWJsaWMvV2ViU3RyaW5nLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlVSTC5oIgorI2luY2x1
ZGUgPHd0Zi9EZXF1ZS5oPgorCitjbGFzcyBUZXN0U2hlbGw7CisKK2NsYXNzIExheW91dFRlc3RD
b250cm9sbGVyIDogcHVibGljIENwcEJvdW5kQ2xhc3MgeworcHVibGljOgorICAgIC8vIEJ1aWxk
cyB0aGUgcHJvcGVydHkgYW5kIG1ldGhvZCBsaXN0cyBuZWVkZWQgdG8gYmluZCB0aGlzIGNsYXNz
IHRvIGEgSlMKKyAgICAvLyBvYmplY3QuCisgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIoVGVzdFNo
ZWxsKik7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYSBmbGFnIHRoYXQgdGVsbHMgdGhl
IHRlc3Rfc2hlbGwgdG8gZHVtcCBwYWdlcyBhcworICAgIC8vIHBsYWluIHRleHQsIHJhdGhlciB0
aGFuIGFzIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVuZGVyZXIncyBzdGF0ZS4KKyAg
ICAvLyBJdCB0YWtlcyBubyBhcmd1bWVudHMsIGFuZCBpZ25vcmVzIGFueSB0aGF0IG1heSBiZSBw
cmVzZW50LgorICAgIHZvaWQgZHVtcEFzVGV4dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50Kik7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZXQgYSBmbGFnIHRoYXQg
dGVsbHMgdGhlIHRlc3Rfc2hlbGwgdG8gcHJpbnQgYSBsaW5lCisgICAgLy8gb2YgZGVzY3JpcHRp
dmUgdGV4dCBmb3IgZWFjaCBkYXRhYmFzZSBjb21tYW5kLiAgSXQgc2hvdWxkIHRha2Ugbm8KKyAg
ICAvLyBhcmd1bWVudHMsIGFuZCBpZ25vcmUgYW55IHRoYXQgbWF5IGJlIHByZXNlbnQuIEhvd2V2
ZXIsIGF0IHRoZSBtb21lbnQsIHdlCisgICAgLy8gZG9uJ3QgaGF2ZSBhbnkgREIgZnVuY3Rpb24g
dGhhdCBwcmludHMgbWVzc2FnZXMsIHNvIGZvciBub3cgdGhpcyBmdW5jdGlvbgorICAgIC8vIGRv
ZXNuJ3QgZG8gYW55dGhpbmcuCisgICAgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBz
ZXRzIGEgZmxhZyB0aGF0IHRlbGxzIHRoZSB0ZXN0X3NoZWxsIHRvIHByaW50IGEgbGluZSBvZgor
ICAgIC8vIGRlc2NyaXB0aXZlIHRleHQgZm9yIGVhY2ggZWRpdGluZyBjb21tYW5kLiAgSXQgdGFr
ZXMgbm8gYXJndW1lbnRzLCBhbmQKKyAgICAvLyBpZ25vcmVzIGFueSB0aGF0IG1heSBiZSBwcmVz
ZW50LgorICAgIHZvaWQgZHVtcEVkaXRpbmdDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzZXRzIGEgZmxhZyB0aGF0
IHRlbGxzIHRoZSB0ZXN0X3NoZWxsIHRvIHByaW50IGEgbGluZSBvZgorICAgIC8vIGRlc2NyaXB0
aXZlIHRleHQgZm9yIGVhY2ggZnJhbWUgbG9hZCBjYWxsYmFjay4gIEl0IHRha2VzIG5vIGFyZ3Vt
ZW50cywgYW5kCisgICAgLy8gaWdub3JlcyBhbnkgdGhhdCBtYXkgYmUgcHJlc2VudC4KKyAgICB2
b2lkIGR1bXBGcmFtZUxvYWRDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFy
aWFudCopOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzZXRzIGEgZmxhZyB0aGF0IHRlbGxzIHRo
ZSB0ZXN0X3NoZWxsIHRvIHByaW50IG91dCBhIHRleHQKKyAgICAvLyByZXByZXNlbnRhdGlvbiBv
ZiB0aGUgYmFjay9mb3J3YXJkIGxpc3QuICBJdCBpZ25vcmVzIGFsbCBhcmd1bWVudHMuCisgICAg
dm9pZCBkdW1wQmFja0ZvcndhcmRMaXN0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlh
bnQqKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyBhIGZsYWcgdGhhdCB0ZWxscyB0aGUg
dGVzdF9zaGVsbCB0byBwcmludCBvdXQgdGhlCisgICAgLy8gc2Nyb2xsIG9mZnNldHMgb2YgdGhl
IGNoaWxkIGZyYW1lcy4gIEl0IGlnbm9yZXMgYWxsLgorICAgIHZvaWQgZHVtcENoaWxkRnJhbWVT
Y3JvbGxQb3NpdGlvbnMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisg
ICAgLy8gVGhpcyBmdW5jdGlvbiBzZXRzIGEgZmxhZyB0aGF0IHRlbGxzIHRoZSB0ZXN0X3NoZWxs
IHRvIHJlY3Vyc2l2ZWx5CisgICAgLy8gZHVtcCBhbGwgZnJhbWVzIGFzIHBsYWluIHRleHQgaWYg
dGhlIGR1bXBBc1RleHQgZmxhZyBpcyBzZXQuCisgICAgLy8gSXQgdGFrZXMgbm8gYXJndW1lbnRz
LCBhbmQgaWdub3JlcyBhbnkgdGhhdCBtYXkgYmUgcHJlc2VudC4KKyAgICB2b2lkIGR1bXBDaGls
ZEZyYW1lc0FzVGV4dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAg
ICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYSBmbGFnIHRoYXQgdGVsbHMgdGhlIHRlc3Rfc2hlbGwg
dG8gZHVtcCBhbGwgY2FsbHMKKyAgICAvLyB0byB3aW5kb3cuc3RhdHVzKCkuCisgICAgLy8gSXQg
dGFrZXMgbm8gYXJndW1lbnRzLCBhbmQgaWdub3JlcyBhbnkgdGhhdCBtYXkgYmUgcHJlc2VudC4K
KyAgICB2b2lkIGR1bXBXaW5kb3dTdGF0dXNDaGFuZ2VzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYs
IENwcFZhcmlhbnQqKTsKKworICAgIC8vIFdoZW4gY2FsbGVkIHdpdGggYSBib29sZWFuIGFyZ3Vt
ZW50LCB0aGlzIHNldHMgYSBmbGFnIHRoYXQgY29udHJvbHMKKyAgICAvLyB3aGV0aGVyIGNvbnRl
bnQtZWRpdGFibGUgZWxlbWVudHMgYWNjZXB0IGVkaXRpbmcgZm9jdXMgd2hlbiBhbiBlZGl0aW5n
CisgICAgLy8gYXR0ZW1wdCBpcyBtYWRlLiBJdCBpZ25vcmVzIGFueSBhZGRpdGlvbmFsIGFyZ3Vt
ZW50cy4KKyAgICB2b2lkIHNldEFjY2VwdHNFZGl0aW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYs
IENwcFZhcmlhbnQqKTsKKworICAgIC8vIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHdpbmRv
d3MuICBCeSBkZWZhdWx0IHdlIGJsb2NrIGFsbCBuZXcgd2luZG93cy4KKyAgICB2b2lkIHdpbmRv
d0NvdW50KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHNl
dENhbk9wZW5XaW5kb3dzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAg
ICB2b2lkIHNldENsb3NlUmVtYWluaW5nV2luZG93c1doZW5Db21wbGV0ZShjb25zdCBDcHBBcmd1
bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBCeSBkZWZhdWx0LCB0ZXN0cyBlbmQg
d2hlbiBwYWdlIGxvYWQgaXMgY29tcGxldGUuICBUaGVzZSBtZXRob2RzIGFyZSB1c2VkCisgICAg
Ly8gdG8gZGVsYXkgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHRlc3QgdW50aWwgbm90aWZ5RG9uZSBp
cyBjYWxsZWQuCisgICAgdm9pZCB3YWl0VW50aWxEb25lKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYs
IENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIG5vdGlmeURvbmUoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgbm90aWZ5RG9uZVRpbWVkT3V0KCk7CisKKyAgICAv
LyBNZXRob2RzIGZvciBhZGRpbmcgYWN0aW9ucyB0byB0aGUgd29yayBxdWV1ZS4gIFVzZWQgaW4g
Y29uanVuY3Rpb24gd2l0aAorICAgIC8vIHdhaXRVbnRpbERvbmUvbm90aWZ5RG9uZSBhYm92ZS4K
KyAgICB2b2lkIHF1ZXVlQmFja05hdmlnYXRpb24oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3Bw
VmFyaWFudCopOworICAgIHZvaWQgcXVldWVGb3J3YXJkTmF2aWdhdGlvbihjb25zdCBDcHBBcmd1
bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBxdWV1ZVJlbG9hZChjb25zdCBDcHBB
cmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBxdWV1ZUxvYWRpbmdTY3JpcHQo
Y29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgcXVldWVOb25M
b2FkaW5nU2NyaXB0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2
b2lkIHF1ZXVlTG9hZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAg
ICAvLyBBbHRob3VnaCB0aGlzIGlzIG5hbWVkICJvYmpDIiB0byBtYXRjaCB0aGUgTWFjIHZlcnNp
b24sIGl0IGFjdHVhbGx5IHRlc3RzCisgICAgLy8gdGhlIGlkZW50aXR5IG9mIGl0cyB0d28gYXJn
dW1lbnRzIGluIEMrKy4KKyAgICB2b2lkIG9iakNJZGVudGl0eUlzRXF1YWwoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gQ2hhbmdlcyB0aGUgY29va2llIHBv
bGljeSBmcm9tIHRoZSBkZWZhdWx0IHRvIGFsbG93IGFsbCBjb29raWVzLgorICAgIHZvaWQgc2V0
QWx3YXlzQWNjZXB0Q29va2llcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisKKyAgICAvLyBHaXZlcyBmb2N1cyB0byB0aGUgd2luZG93LgorICAgIHZvaWQgc2V0V2luZG93
SXNLZXkoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gTWV0
aG9kIHRoYXQgY29udHJvbHMgd2hldGhlciBwcmVzc2luZyBUYWIga2V5IGN5Y2xlcyB0aHJvdWdo
IHBhZ2UgZWxlbWVudHMKKyAgICAvLyBvciBpbnNlcnRzIGEgJ1x0JyBjaGFyIGluIHRleHQgYXJl
YQorICAgIHZvaWQgc2V0VGFiS2V5Q3ljbGVzVGhyb3VnaEVsZW1lbnRzKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFBhc3NlcyB0aHJvdWdoIHRvIFdlYlBy
ZWZlcmVuY2VzIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBoYXZlIGEgY3VzdG9tCisgICAgLy8g
c3R5bGUgc2hlZXQuCisgICAgdm9pZCBzZXRVc2VyU3R5bGVTaGVldEVuYWJsZWQoY29uc3QgQ3Bw
QXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgc2V0VXNlclN0eWxlU2hlZXRM
b2NhdGlvbihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBQ
dXRzIFdlYmtpdCBpbiAiZGFzaGJvYXJkIGNvbXBhdGliaWxpdHkgbW9kZSIsIHdoaWNoIGlzIHVz
ZWQgaW4gb2JzY3VyZQorICAgIC8vIE1hYy1vbmx5IGNpcmN1bXN0YW5jZXMuIEl0J3Mgbm90IHJl
YWxseSBuZWNlc3NhcnksIGFuZCB3aWxsIG1vc3QgbGlrZWx5CisgICAgLy8gbmV2ZXIgYmUgdXNl
ZCBieSBDaHJvbWUsIGJ1dCBzb21lIGxheW91dCB0ZXN0cyBkZXBlbmQgb24gaXRzIHByZXNlbmNl
LgorICAgIHZvaWQgc2V0VXNlRGFzaGJvYXJkQ29tcGF0aWJpbGl0eU1vZGUoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gQ2F1c2VzIG5hdmlnYXRpb24gYWN0
aW9ucyBqdXN0IHByaW50b3V0IHRoZSBpbnRlbmRlZCBuYXZpZ2F0aW9uIGluc3RlYWQKKyAgICAv
LyBvZiB0YWtpbmcgeW91IHRvIHRoZSBwYWdlLiBUaGlzIGlzIHVzZWQgZm9yIGNhc2VzIGxpa2Ug
bWFpbHRvLCB3aGVyZSB5b3UKKyAgICAvLyBkb24ndCBhY3R1YWxseSB3YW50IHRvIG9wZW4gdGhl
IG1haWwgcHJvZ3JhbS4KKyAgICB2b2lkIHNldEN1c3RvbVBvbGljeURlbGVnYXRlKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIERlbGF5cyBjb21wbGV0aW9u
IG9mIHRoZSB0ZXN0IHVudGlsIHRoZSBwb2xpY3kgZGVsZWdhdGUgcnVucy4KKyAgICB2b2lkIHdh
aXRGb3JQb2xpY3lEZWxlZ2F0ZShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisKKyAgICAvLyBDYXVzZXMgV2lsbFNlbmRSZXF1ZXN0IHRvIGJsb2NrIHJlZGlyZWN0cy4KKyAg
ICB2b2lkIHNldFdpbGxTZW5kUmVxdWVzdFJldHVybnNOdWxsT25SZWRpcmVjdChjb25zdCBDcHBB
cmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBDYXVzZXMgV2lsbFNlbmRSZXF1
ZXN0IHRvIHJldHVybiBhbiBlbXB0eSByZXF1ZXN0LgorICAgIHZvaWQgc2V0V2lsbFNlbmRSZXF1
ZXN0UmV0dXJuc051bGwoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisg
ICAgLy8gQ29udmVydHMgYSBVUkwgc3RhcnRpbmcgd2l0aCBmaWxlOi8vL3RtcC8gdG8gdGhlIGxv
Y2FsIG1hcHBpbmcuCisgICAgdm9pZCBwYXRoVG9Mb2NhbFJlc291cmNlKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFNldHMgYSBib29sIHN1Y2ggdGhhdCB3
aGVuIGEgZHJhZyBpcyBzdGFydGVkLCB3ZSBmaWxsIHRoZSBkcmFnIGNsaXBib2FyZAorICAgIC8v
IHdpdGggYSBmYWtlIGZpbGUgb2JqZWN0LgorICAgIHZvaWQgYWRkRmlsZVRvUGFzdGVib2FyZE9u
RHJhZyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBFeGVj
dXRlcyBhbiBpbnRlcm5hbCBjb21tYW5kIChzdXBlcnNldCBvZiBkb2N1bWVudC5leGVjQ29tbWFu
ZCgpIGNvbW1hbmRzKS4KKyAgICB2b2lkIGV4ZWNDb21tYW5kKGNvbnN0IENwcEFyZ3VtZW50TGlz
dCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIENoZWNrcyBpZiBhbiBpbnRlcm5hbCBjb21tYW5k
IGlzIGN1cnJlbnRseSBhdmFpbGFibGUuCisgICAgdm9pZCBpc0NvbW1hbmRFbmFibGVkKGNvbnN0
IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFNldCB0aGUgV2ViUHJl
ZmVyZW5jZSB0aGF0IGNvbnRyb2xzIHdlYmtpdCdzIHBvcHVwIGJsb2NraW5nLgorICAgIHZvaWQg
c2V0UG9wdXBCbG9ja2luZ0VuYWJsZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFu
dCopOworCisgICAgLy8gSWYgdHJ1ZSwgY2F1c2VzIHByb3Zpc2lvbmFsIGZyYW1lIGxvYWRzIHRv
IGJlIHN0b3BwZWQgZm9yIHRoZSByZW1haW5kZXIgb2YKKyAgICAvLyB0aGUgdGVzdC4KKyAgICB2
b2lkIHNldFN0b3BQcm92aXNpb25hbEZyYW1lTG9hZHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCopOworCisgICAgLy8gRW5hYmxlIG9yIGRpc2FibGUgc21hcnQgaW5zZXJ0L2Rl
bGV0ZS4gIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgIHZvaWQgc2V0U21hcnRJbnNl
cnREZWxldGVFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKwor
ICAgIC8vIEVuYWJsZSBvciBkaXNhYmxlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugc2VsZWN0aW9uIG9u
IGRvdWJsZSBjbGljay4KKyAgICB2b2lkIHNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJs
ZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgdm9pZCBwYXVz
ZUFuaW1hdGlvbkF0VGltZU9uRWxlbWVudFdpdGhJZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBD
cHBWYXJpYW50Kik7CisgICAgdm9pZCBwYXVzZVRyYW5zaXRpb25BdFRpbWVPbkVsZW1lbnRXaXRo
SWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgZWxlbWVu
dERvZXNBdXRvQ29tcGxldGVGb3JFbGVtZW50V2l0aElkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYs
IENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIG51bWJlck9mQWN0aXZlQW5pbWF0aW9ucyhjb25zdCBD
cHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICB2b2lkIGRpc2FibGVJbWFnZUxv
YWRpbmcoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgdm9pZCBz
ZXRJY29uRGF0YWJhc2VFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQq
KTsKKworICAgIHZvaWQgZHVtcFNlbGVjdGlvblJlY3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCopOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgb25seSBzdHVicy4gIFRP
RE8ocGFtZyk6IEltcGxlbWVudCBhbnkgb2YgdGhlc2UgdGhhdAorICAgIC8vIGFyZSBuZWVkZWQg
dG8gcGFzcyB0aGUgbGF5b3V0IHRlc3RzLgorICAgIHZvaWQgZHVtcEFzV2ViQXJjaGl2ZShjb25z
dCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBkdW1wVGl0bGVDaGFu
Z2VzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGR1bXBS
ZXNvdXJjZUxvYWRDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCop
OworICAgIHZvaWQgc2V0TWFpbkZyYW1lSXNGaXJzdFJlc3BvbmRlcihjb25zdCBDcHBBcmd1bWVu
dExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBkaXNwbGF5KGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHRlc3RSZXBhaW50KGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHJlcGFpbnRTd2VlcEhvcml6b250YWxs
eShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBjbGVhckJh
Y2tGb3J3YXJkTGlzdChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAg
dm9pZCBrZWVwV2ViSGlzdG9yeShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisgICAgdm9pZCBzdG9yZVdlYlNjcmlwdE9iamVjdChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBD
cHBWYXJpYW50Kik7CisgICAgdm9pZCBhY2Nlc3NTdG9yZWRXZWJTY3JpcHRPYmplY3QoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgb2JqQ0NsYXNzTmFtZU9m
KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGFkZERpc2Fs
bG93ZWRVUkwoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQg
c2V0Q2FsbENsb3NlT25XZWJWaWV3cyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
Kik7CisgICAgdm9pZCBzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgZXZhbHVhdGVTY3Jp
cHRJbklzb2xhdGVkV29ybGQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOwor
ICAgIHZvaWQgb3ZlcnJpZGVQcmVmZXJlbmNlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKyAgICB2b2lkIHNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHNldEFsbG93Rmls
ZUFjY2Vzc0Zyb21GaWxlVVJMcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisKKworICAgIC8vIFRoZSBmYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBub25leGlz
dGVudCBtZXRob2QgaXMgY2FsbGVkIG9uCisgICAgLy8gdGhlIGxheW91dCB0ZXN0IGNvbnRyb2xs
ZXIgb2JqZWN0LgorICAgIC8vIEl0IGlzIHVzZWZ1bGwgdG8gY2F0Y2ggdHlwb3MgaW4gdGhlIEph
dmFTY3JpcHQgY29kZSAoYSBmZXcgbGF5b3V0IHRlc3RzCisgICAgLy8gZG8gaGF2ZSB0eXBvcyBp
biB0aGVtKSBhbmQgaXQgYWxsb3dzIHRoZSBzY3JpcHQgdG8gY29udGludWUgcnVubmluZyBpbgor
ICAgIC8vIHRoYXQgY2FzZSAoYXMgdGhlIE1hYyBkb2VzKS4KKyAgICB2b2lkIGZhbGxiYWNrTWV0
aG9kKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEFsbG93
cyBsYXlvdXQgdGVzdHMgdG8gY2FsbCBTZWN1cml0eU9yaWdpbjo6d2hpdGVMaXN0QWNjZXNzRnJv
bU9yaWdpbigpLgorICAgIHZvaWQgd2hpdGVMaXN0QWNjZXNzRnJvbU9yaWdpbihjb25zdCBDcHBB
cmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBDbGVhcnMgYWxsIGRhdGFiYXNl
cy4KKyAgICB2b2lkIGNsZWFyQWxsRGF0YWJhc2VzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENw
cFZhcmlhbnQqKTsKKyAgICAvLyBTZXRzIHRoZSBkZWZhdWx0IHF1b3RhIGZvciBhbGwgb3JpZ2lu
cworICAgIHZvaWQgc2V0RGF0YWJhc2VRdW90YShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50Kik7CisKKyAgICAvLyBDYWxscyBzZXRsb2NhbGUoTENfQUxMLCAuLi4pIGZvciBhIHNw
ZWNpZmllZCBsb2NhbGUuCisgICAgLy8gUmVzZXRzIGJldHdlZW4gdGVzdHMuCisgICAgdm9pZCBz
ZXRQT1NJWExvY2FsZShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAg
ICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciBpbiB0aGUgZWxlbWVudCBzcGVjaWZp
ZWQgYnkgaXRzIElELgorICAgIHZvaWQgY291bnRlclZhbHVlRm9yRWxlbWVudEJ5SWQoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gR2V0cyB0aGUgbnVtYmVy
IG9mIHBhZ2Ugd2hlcmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IHdpbGwgYmUgcHV0LgorICAgIHZv
aWQgcGFnZU51bWJlckZvckVsZW1lbnRCeUlkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKworICAgIC8vIEdldHMgdGhlIG51bWJlciBvZiBwYWdlcyB0byBiZSBwcmludGVk
LgorICAgIHZvaWQgbnVtYmVyT2ZQYWdlcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJp
YW50Kik7CisKKworICAgIC8vIEFsbG93cyBsYXlvdXQgdGVzdHMgdG8gc3RhcnQgVGltZWxpbmUg
cHJvZmlsaW5nLgorICAgIHZvaWQgc2V0VGltZWxpbmVQcm9maWxpbmdFbmFibGVkKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEFsbG93cyBsYXlvdXQgdGVz
dHMgdG8gZXhlYyBzY3JpcHRzIGF0IFdlYkluc3BlY3RvciBzaWRlLgorICAgIHZvaWQgZXZhbHVh
dGVJbldlYkluc3BlY3Rvcihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisK
KyAgICAvLyBGb3JjZXMgdGhlIHNlbGVjdGlvbiBjb2xvcnMgZm9yIHRlc3RpbmcgdW5kZXIgTGlu
dXguCisgICAgdm9pZCBmb3JjZVJlZFNlbGVjdGlvbkNvbG9ycyhjb25zdCBDcHBBcmd1bWVudExp
c3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBBZGRzIGEgdXNlciBzY3JpcHQgdG8gYmUgaW5q
ZWN0ZWQgaW50byBuZXcgZG9jdW1lbnRzLgorICAgIHZvaWQgYWRkVXNlclNjcmlwdChjb25zdCBD
cHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKK3B1YmxpYzoKKyAgICAvLyBUaGUgZm9s
bG93aW5nIG1ldGhvZHMgYXJlIG5vdCBleHBvc2VkIHRvIEphdmFTY3JpcHQuCisgICAgdm9pZCBz
ZXRXb3JrUXVldWVGcm96ZW4oYm9vbCBmcm96ZW4pIHsgbV93b3JrUXVldWUuc2V0RnJvemVuKGZy
b3plbik7IH0KKworICAgIGJvb2wgc2hvdWxkRHVtcEFzVGV4dCgpIHsgcmV0dXJuIG1fZHVtcEFz
VGV4dDsgfQorICAgIGJvb2wgc2hvdWxkRHVtcEVkaXRpbmdDYWxsYmFja3MoKSB7IHJldHVybiBt
X2R1bXBFZGl0aW5nQ2FsbGJhY2tzOyB9CisgICAgYm9vbCBzaG91bGREdW1wRnJhbWVMb2FkQ2Fs
bGJhY2tzKCkgeyByZXR1cm4gbV9kdW1wRnJhbWVMb2FkQ2FsbGJhY2tzOyB9CisgICAgdm9pZCBz
ZXRTaG91bGREdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKGJvb2wgdmFsdWUpIHsgbV9kdW1wRnJhbWVM
b2FkQ2FsbGJhY2tzID0gdmFsdWU7IH0KKyAgICBib29sIHNob3VsZER1bXBSZXNvdXJjZUxvYWRD
YWxsYmFja3MoKSB7cmV0dXJuIG1fZHVtcFJlc291cmNlTG9hZENhbGxiYWNrczsgfQorICAgIGJv
b2wgc2hvdWxkRHVtcFN0YXR1c0NhbGxiYWNrcygpIHsgcmV0dXJuIG1fZHVtcFdpbmRvd1N0YXR1
c0NoYW5nZXM7IH0KKyAgICBib29sIHNob3VsZER1bXBTZWxlY3Rpb25SZWN0KCkgeyByZXR1cm4g
bV9kdW1wU2VsZWN0aW9uUmVjdDsgfQorICAgIGJvb2wgc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlz
dCgpIHsgcmV0dXJuIG1fZHVtcEJhY2tGb3J3YXJkTGlzdDsgfQorICAgIGJvb2wgc2hvdWxkRHVt
cFRpdGxlQ2hhbmdlcygpIHsgcmV0dXJuIG1fZHVtcFRpdGxlQ2hhbmdlczsgfQorICAgIGJvb2wg
c2hvdWxkRHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMoKSB7IHJldHVybiBtX2R1bXBDaGls
ZEZyYW1lU2Nyb2xsUG9zaXRpb25zOyB9CisgICAgYm9vbCBzaG91bGREdW1wQ2hpbGRGcmFtZXNB
c1RleHQoKSB7IHJldHVybiBtX2R1bXBDaGlsZEZyYW1lc0FzVGV4dDsgfQorICAgIGJvb2wgYWNj
ZXB0c0VkaXRpbmcoKSB7IHJldHVybiBtX2FjY2VwdHNFZGl0aW5nOyB9CisgICAgYm9vbCBjYW5P
cGVuV2luZG93cygpIHsgcmV0dXJuIG1fY2FuT3BlbldpbmRvd3M7IH0KKyAgICBib29sIHNob3Vs
ZEFkZEZpbGVUb1Bhc3RlYm9hcmQoKSB7IHJldHVybiBtX3Nob3VsZEFkZEZpbGVUb1Bhc3RlYm9h
cmQ7IH0KKyAgICBib29sIHN0b3BQcm92aXNpb25hbEZyYW1lTG9hZHMoKSB7IHJldHVybiBtX3N0
b3BQcm92aXNpb25hbEZyYW1lTG9hZHM7IH0KKworICAgIGJvb2wgdGVzdFJlcGFpbnQoKSBjb25z
dCB7IHJldHVybiBtX3Rlc3RSZXBhaW50OyB9CisgICAgYm9vbCBzd2VlcEhvcml6b250YWxseSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3dlZXBIb3Jpem9udGFsbHk7IH0KKworICAgIC8vIENhbGxlZCBi
eSB0aGUgd2VidmlldyBkZWxlZ2F0ZSB3aGVuIHRoZSB0b3BsZXZlbCBmcmFtZSBsb2FkIGlzIGRv
bmUuCisgICAgdm9pZCBsb2NhdGlvbkNoYW5nZURvbmUoKTsKKworICAgIC8vIENhbGxlZCBieSB0
aGUgd2VidmlldyBkZWxlZ2F0ZSB3aGVuIHRoZSBwb2xpY3kgZGVsZWdhdGUgcnVucyBpZiB0aGUK
KyAgICAvLyB3YWl0Rm9yUG9saWN5RGVsZWdhdGUgd2FzIGNhbGxlZC4KKyAgICB2b2lkIHBvbGlj
eURlbGVnYXRlRG9uZSgpOworCisgICAgLy8gUmVpbml0aWFsaXplcyBhbGwgc3RhdGljIHZhbHVl
cy4gIFRoZSByZXNldCgpIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkCisgICAgLy8gYmVmb3JlIHRo
ZSBzdGFydCBvZiBlYWNoIHRlc3QgKGN1cnJlbnRseSBmcm9tCisgICAgLy8gVGVzdFNoZWxsOjpy
dW5GaWxlVGVzdCkuCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gQSBzaW5nbGUgaXRlbSBp
biB0aGUgd29yayBxdWV1ZS4KKyAgICBjbGFzcyBXb3JrSXRlbSB7CisgICAgcHVibGljOgorICAg
ICAgICB2aXJ0dWFsIH5Xb3JrSXRlbSgpIHt9CisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlm
IHRoaXMgc3RhcnRlZCBhIGxvYWQuCisgICAgICAgIHZpcnR1YWwgYm9vbCBydW4oVGVzdFNoZWxs
KiBzaGVsbCkgPSAwOworICAgIH07CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFdvcmtJ
dGVtOworICAgIGZyaWVuZCBjbGFzcyBXb3JrUXVldWU7CisKKyAgICAvLyBIZWxwZXIgY2xhc3Mg
Zm9yIG1hbmFnaW5nIGV2ZW50cyBxdWV1ZWQgYnkgbWV0aG9kcyBsaWtlIHF1ZXVlTG9hZCBvcgor
ICAgIC8vIHF1ZXVlU2NyaXB0LgorICAgIGNsYXNzIFdvcmtRdWV1ZSB7CisgICAgcHVibGljOgor
ICAgICAgICBXb3JrUXVldWUoTGF5b3V0VGVzdENvbnRyb2xsZXIqIGNvbnRyb2xsZXIpIDogbV9j
b250cm9sbGVyKGNvbnRyb2xsZXIpIHt9CisgICAgICAgIHZpcnR1YWwgfldvcmtRdWV1ZSgpOwor
ICAgICAgICB2b2lkIHByb2Nlc3NXb3JrU29vbigpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBz
dGF0ZSBvZiB0aGUgY2xhc3MgYmV0d2VlbiB0ZXN0cy4KKyAgICAgICAgdm9pZCByZXNldCgpOwor
CisgICAgICAgIHZvaWQgYWRkV29yayhXb3JrSXRlbSogd29yayk7CisKKyAgICAgICAgdm9pZCBz
ZXRGcm96ZW4oYm9vbCBmcm96ZW4pIHsgbV9mcm96ZW4gPSBmcm96ZW47IH0KKyAgICAgICAgYm9v
bCBpc0VtcHR5KCkgeyByZXR1cm4gbV9xdWV1ZS5pc0VtcHR5KCk7IH0KKworICAgIHByaXZhdGU6
CisgICAgICAgIHZvaWQgcHJvY2Vzc1dvcmsoKTsKKworICAgICAgICBiYXNlOjpPbmVTaG90VGlt
ZXI8V29ya1F1ZXVlPiBtX3RpbWVyOworICAgICAgICBEZXF1ZTxXb3JrSXRlbSo+IG1fcXVldWU7
CisgICAgICAgIGJvb2wgbV9mcm96ZW47CisgICAgICAgIExheW91dFRlc3RDb250cm9sbGVyKiBt
X2NvbnRyb2xsZXI7CisgICAgfTsKKworICAgIC8vIFN1cHBvcnQgZm9yIG92ZXJyaWRlUHJlZmVy
ZW5jZS4KKyAgICBib29sIGNwcFZhcmlhbnRUb0Jvb2woY29uc3QgQ3BwVmFyaWFudCYpOworICAg
IGludDMyX3QgY3BwVmFyaWFudFRvSW50MzIoY29uc3QgQ3BwVmFyaWFudCYpOworICAgIFdlYktp
dDo6V2ViU3RyaW5nIGNwcFZhcmlhbnRUb1dlYlN0cmluZyhjb25zdCBDcHBWYXJpYW50Jik7CisK
KyAgICB2b2lkIGxvZ0Vycm9yVG9Db25zb2xlKGNvbnN0IHN0ZDo6c3RyaW5nJik7CisgICAgdm9p
ZCBjb21wbGV0ZU5vdGlmeURvbmUoYm9vbCBpc1RpbWVvdXQpOworCisgICAgYm9vbCBwYXVzZUFu
aW1hdGlvbkF0VGltZU9uRWxlbWVudFdpdGhJZChjb25zdCBXZWJLaXQ6OldlYlN0cmluZyYgYW5p
bWF0aW9uTmFtZSwgZG91YmxlIHRpbWUsIGNvbnN0IFdlYktpdDo6V2ViU3RyaW5nJiBlbGVtZW50
SWQpOworICAgIGJvb2wgcGF1c2VUcmFuc2l0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKGNvbnN0
IFdlYktpdDo6V2ViU3RyaW5nJiBwcm9wZXJ0eU5hbWUsIGRvdWJsZSB0aW1lLCBjb25zdCBXZWJL
aXQ6OldlYlN0cmluZyYgZWxlbWVudElkKTsKKyAgICBib29sIGVsZW1lbnREb2VzQXV0b0NvbXBs
ZXRlRm9yRWxlbWVudFdpdGhJZChjb25zdCBXZWJLaXQ6OldlYlN0cmluZyYpOworICAgIGludCBu
dW1iZXJPZkFjdGl2ZUFuaW1hdGlvbnMoKTsKKworICAgIC8vIFVzZWQgZm9yIHRlc3QgdGltZW91
dHMuCisgICAgU2NvcGVkUnVubmFibGVNZXRob2RGYWN0b3J5PExheW91dFRlc3RDb250cm9sbGVy
PiBtX3RpbWVvdXRGYWN0b3J5OworCisgICAgLy8gTm9uLW93bmluZyBwb2ludGVyLiAgVGhlIExh
eW91dFRlc3RDb250cm9sbGVyIGlzIG93bmVkIGJ5IHRoZSBob3N0LgorICAgIFRlc3RTaGVsbCog
bV9zaGVsbDsKKworICAgIC8vIElmIHRydWUsIHRoZSB0ZXN0X3NoZWxsIHdpbGwgcHJvZHVjZSBh
IHBsYWluIHRleHQgZHVtcCByYXRoZXIgdGhhbiBhCisgICAgLy8gdGV4dCByZXByZXNlbnRhdGlv
biBvZiB0aGUgcmVuZGVyZXIuCisgICAgYm9vbCBtX2R1bXBBc1RleHQ7CisKKyAgICAvLyBJZiB0
cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxsIHdyaXRlIGEgZGVzY3JpcHRpdmUgbGluZSBmb3IgZWFj
aCBlZGl0aW5nCisgICAgLy8gY29tbWFuZC4KKyAgICBib29sIG1fZHVtcEVkaXRpbmdDYWxsYmFj
a3M7CisKKyAgICAvLyBJZiB0cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxsIGRyYXcgdGhlIGJvdW5k
cyBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcmVjdAorICAgIC8vIHRha2luZyBwb3NzaWJsZSB0
cmFuc2Zvcm1zIG9mIHRoZSBzZWxlY3Rpb24gcmVjdCBpbnRvIGFjY291bnQuCisgICAgYm9vbCBt
X2R1bXBTZWxlY3Rpb25SZWN0OworCisgICAgLy8gSWYgdHJ1ZSwgdGhlIHRlc3Rfc2hlbGwgd2ls
bCBvdXRwdXQgYSBkZXNjcmlwdGl2ZSBsaW5lIGZvciBlYWNoIGZyYW1lCisgICAgLy8gbG9hZCBj
YWxsYmFjay4KKyAgICBib29sIG1fZHVtcEZyYW1lTG9hZENhbGxiYWNrczsKKworICAgIC8vIElm
IHRydWUsIHRoZSB0ZXN0X3NoZWxsIHdpbGwgb3V0cHV0IGEgZGVzY3JpcHRpdmUgbGluZSBmb3Ig
ZWFjaCByZXNvdXJjZQorICAgIC8vIGxvYWQgY2FsbGJhY2suCisgICAgYm9vbCBtX2R1bXBSZXNv
dXJjZUxvYWRDYWxsYmFja3M7CisKKyAgICAvLyBJZiB0cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxs
IHByb2R1Y2UgYSBkdW1wIG9mIHRoZSBiYWNrIGZvcndhcmQgbGlzdCBhcworICAgIC8vIHdlbGwu
CisgICAgYm9vbCBtX2R1bXBCYWNrRm9yd2FyZExpc3Q7CisKKyAgICAvLyBJZiB0cnVlLCB0aGUg
dGVzdF9zaGVsbCB3aWxsIHByaW50IG91dCB0aGUgY2hpbGQgZnJhbWUgc2Nyb2xsIG9mZnNldHMg
YXMKKyAgICAvLyB3ZWxsLgorICAgIGJvb2wgbV9kdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9u
czsKKworICAgIC8vIElmIHRydWUgYW5kIGlmIGR1bXBfYXNfdGV4dF8gaXMgdHJ1ZSwgdGhlIHRl
c3Rfc2hlbGwgd2lsbCByZWN1cnNpdmVseQorICAgIC8vIGR1bXAgYWxsIGZyYW1lcyBhcyBwbGFp
biB0ZXh0LgorICAgIGJvb2wgbV9kdW1wQ2hpbGRGcmFtZXNBc1RleHQ7CisKKyAgICAvLyBJZiB0
cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxsIGR1bXAgYWxsIGNoYW5nZXMgdG8gd2luZG93LnN0YXR1
cy4KKyAgICBib29sIG1fZHVtcFdpbmRvd1N0YXR1c0NoYW5nZXM7CisKKyAgICAvLyBJZiB0cnVl
LCBvdXRwdXQgYSBtZXNzYWdlIHdoZW4gdGhlIHBhZ2UgdGl0bGUgaXMgY2hhbmdlZC4KKyAgICBi
b29sIG1fZHVtcFRpdGxlQ2hhbmdlczsKKworICAgIC8vIElmIHRydWUsIHRoZSBlbGVtZW50IHdp
bGwgYmUgdHJlYXRlZCBhcyBlZGl0YWJsZS4gIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQKKyAgICAv
LyBmcm9tIHZhcmlvdXMgZWRpdGluZyBjYWxsYmFja3MgdGhhdCBhcmUgY2FsbGVkIGp1c3QgYmVm
b3JlIGVkaXQgb3BlcmF0aW9ucworICAgIC8vIGFyZSBhbGxvd2VkLgorICAgIGJvb2wgbV9hY2Nl
cHRzRWRpdGluZzsKKworICAgIC8vIElmIHRydWUsIG5ldyB3aW5kb3dzIGNhbiBiZSBvcGVuZWQg
dmlhIGphdmFzY3JpcHQgb3IgYnkgcGx1Z2lucy4gIEJ5CisgICAgLy8gZGVmYXVsdCwgc2V0IHRv
IGZhbHNlIGFuZCBjYW4gYmUgdG9nZ2xlZCB0byB0cnVlIHVzaW5nCisgICAgLy8gc2V0Q2FuT3Bl
bldpbmRvd3MoKS4KKyAgICBib29sIG1fY2FuT3BlbldpbmRvd3M7CisKKyAgICAvLyBXaGVuIHJl
c2V0IGlzIGNhbGxlZCwgZ28gdGhyb3VnaCBhbmQgY2xvc2UgYWxsIGJ1dCB0aGUgbWFpbiB0ZXN0
IHNoZWxsCisgICAgLy8gd2luZG93LiAgQnkgZGVmYXVsdCwgc2V0IHRvIHRydWUgYnV0IHRvZ2ds
ZWQgdG8gZmFsc2UgdXNpbmcKKyAgICAvLyBzZXRDbG9zZVJlbWFpbmluZ1dpbmRvd3NXaGVuQ29t
cGxldGUoKS4KKyAgICBib29sIG1fY2xvc2VSZW1haW5pbmdXaW5kb3dzOworCisgICAgLy8gSWYg
dHJ1ZSwgcGl4ZWwgZHVtcCB3aWxsIGJlIHByb2R1Y2VkIGFzIGEgc2VyaWVzIG9mIDFweC10YWxs
LCB2aWV3LXdpZGUKKyAgICAvLyBpbmRpdmlkdWFsIHBhaW50cyBvdmVyIHRoZSBoZWlnaHQgb2Yg
dGhlIHZpZXcuCisgICAgYm9vbCBtX3Rlc3RSZXBhaW50OworICAgIC8vIElmIHRydWUgYW5kIHRl
c3RfcmVwYWludF8gaXMgdHJ1ZSBhcyB3ZWxsLCBwaXhlbCBkdW1wIHdpbGwgYmUgcHJvZHVjZWQg
YXMKKyAgICAvLyBhIHNlcmllcyBvZiAxcHgtd2lkZSwgdmlldy10YWxsIHBhaW50cyBhY3Jvc3Mg
dGhlIHdpZHRoIG9mIHRoZSB2aWV3LgorICAgIGJvb2wgbV9zd2VlcEhvcml6b250YWxseTsKKwor
ICAgIC8vIElmIHRydWUgYW5kIGEgZHJhZyBzdGFydHMsIGFkZHMgYSBmaWxlIHRvIHRoZSBkcmFn
JmRyb3AgY2xpcGJvYXJkLgorICAgIGJvb2wgbV9zaG91bGRBZGRGaWxlVG9QYXN0ZWJvYXJkOwor
CisgICAgLy8gSWYgdHJ1ZSwgc3RvcHMgcHJvdmlzaW9uYWwgZnJhbWUgbG9hZHMgZHVyaW5nIHRo
ZQorICAgIC8vIERpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUgY2FsbGJhY2suCisgICAg
Ym9vbCBtX3N0b3BQcm92aXNpb25hbEZyYW1lTG9hZHM7CisKKyAgICAvLyBJZiB0cnVlLCBkb24n
dCBkdW1wIG91dHB1dCB1bnRpbCBub3RpZnlEb25lIGlzIGNhbGxlZC4KKyAgICBib29sIG1fd2Fp
dFVudGlsRG9uZTsKKworICAgIC8vIFRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMsIG9ubHkgdGhl
IGZpcnN0IHBhZ2Ugb2YgYSB0ZXN0IGNhbiBhZGQgdG8gYQorICAgIC8vIHdvcmsgcXVldWUgKHNp
bmNlIHdlIG1heSB3ZWxsIGNvbWUgYmFjayB0byB0aGF0IHNhbWUgcGFnZSkuCisgICAgYm9vbCBt
X3dvcmtRdWV1ZUZyb3plbjsKKworICAgIFdvcmtRdWV1ZSBtX3dvcmtRdWV1ZTsKKworICAgIENw
cFZhcmlhbnQgbV9nbG9iYWxGbGFnOworCisgICAgLy8gQm91bmQgdmFyaWFibGUgY291bnRpbmcg
dGhlIG51bWJlciBvZiB0b3AgVVJMcyB2aXNpdGVkLgorICAgIENwcFZhcmlhbnQgbV93ZWJIaXN0
b3J5SXRlbUNvdW50OworCisgICAgV2ViS2l0OjpXZWJVUkwgbV91c2VyU3R5bGVTaGVldExvY2F0
aW9uOworfTsKKworI2VuZGlmIC8vIExheW91dFRlc3RDb250cm9sbGVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51599</attachid>
            <date>2010-03-24 23:44:20 -0700</date>
            <delta_ts>2010-03-24 23:51:53 -0700</delta_ts>
            <desc>Proposed patch (rev.2)</desc>
            <filename>bug-36520-20100325154418.patch</filename>
            <type>text/plain</type>
            <size>67647</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA3YjAyYTliLi44NzJkMmYzIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTAtMDMt
MjQgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBUZXN0TmF2
aWdhdGlvbkNvbnRyb2xsZXIgYW5kIFRlc3RXZWJXb3JrZXIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM2NTIwCisKKyAgICAgICAgQWRkIExheW91dFRl
c3RDb250cm9sbGVyIGNsYXNzLCB3aGljaCBpcyBnb2luZyB0byBiZSB1c2VkIGJ5CisgICAgICAg
IER1bXBSZW5kZXJUcmVlIENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoK
KyAgICAgICAgLSBzcmMvd2Via2l0L3Rvb2xzL3Rlc3Rfc2hlbGwvbGF5b3V0X3Rlc3RfY29udHJv
bGxlci5jYworICAgICAgICAtIHNyYy93ZWJraXQvdG9vbHMvdGVzdF9zaGVsbC9sYXlvdXRfdGVz
dF9jb250cm9sbGVyLmgKKyAgICAgICAgb2YgQ2hyb21pdW0gcmV2LjQwNDkyLgorCisgICAgICAg
ICogRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRyb2xsZXIuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9MYXlvdXRUZXN0Q29udHJvbGxl
ci5oOiBBZGRlZC4KKwogMjAxMC0wMy0yMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292LgpkaWZmIC0tZ2l0IGEv
V2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRyb2xsZXIu
Y3BwIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRy
b2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjIyN2QKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9MYXlv
dXRUZXN0Q29udHJvbGxlci5jcHAKQEAgLTAsMCArMSwxMTc3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgUGF3ZWwgSGFqZGFuIChwaGFqZGFuLmpyQGNocm9taXVtLm9yZykKKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIlRl
c3RTaGVsbC5oIgorI2luY2x1ZGUgIldlYlZpZXdIb3N0LmgiCisjaW5jbHVkZSAiYmFzZS9iYXNp
Y3R5cGVzLmgiCisjaW5jbHVkZSAiYmFzZS9kZWJ1Z191dGlsLmgiCisjaW5jbHVkZSAiYmFzZS9m
aWxlX3BhdGguaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgorI2luY2x1ZGUgImJh
c2UvcGF0aF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgorI2luY2x1
ZGUgInB1YmxpYy9XZWJBbmltYXRpb25Db250cm9sbGVyLmgiCisjaW5jbHVkZSAicHVibGljL1dl
YkNvbnNvbGVNZXNzYWdlLmgiCisjaW5jbHVkZSAicHVibGljL1dlYkRvY3VtZW50LmgiCisjaW5j
bHVkZSAicHVibGljL1dlYkZyYW1lLmgiCisjaW5jbHVkZSAicHVibGljL1dlYklucHV0RWxlbWVu
dC5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJLaXQuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViU2Ny
aXB0U291cmNlLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlNlY3VyaXR5UG9saWN5LmgiCisjaW5j
bHVkZSAicHVibGljL1dlYlNldHRpbmdzLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlNpemUuaCIK
KyNpbmNsdWRlICJwdWJsaWMvV2ViVVJMLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlZpZXcuaCIK
KyNpbmNsdWRlICJ3ZWJraXQvc3VwcG9ydC93ZWJraXRfc3VwcG9ydC5oIgorCit1c2luZyBuYW1l
c3BhY2UgV2ViS2l0OwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OkxheW91dFRlc3RDb250cm9sbGVyKFRlc3RTaGVsbCogc2hlbGwpCisgICAgOiBBTExPV19U
SElTX0lOX0lOSVRJQUxJWkVSX0xJU1QobV90aW1lb3V0RmFjdG9yeSh0aGlzKSkKKyAgICAsIG1f
c2hlbGwoc2hlbGwpCisgICAgLCBBTExPV19USElTX0lOX0lOSVRJQUxJWkVSX0xJU1QobV93b3Jr
UXVldWUodGhpcykpCit7CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBtYXAgdGhhdCBhc3NvY2lh
dGVzIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB3aXRoIHRoZSBuYW1lcworICAgIC8vIHRoZXkgd2ls
bCB1c2Ugd2hlbiBjYWxsZWQgYnkgSmF2YVNjcmlwdC4gIFRoZSBhY3R1YWwgYmluZGluZyBvZiB0
aG9zZQorICAgIC8vIG5hbWVzIHRvIHRoZWlyIG1ldGhvZHMgd2lsbCBiZSBkb25lIGJ5IGNhbGxp
bmcgYmluZFRvSmF2YVNjcmlwdCgpIChkZWZpbmVkCisgICAgLy8gYnkgQ3BwQm91bmRDbGFzcywg
dGhlIHBhcmVudCB0byBMYXlvdXRUZXN0Q29udHJvbGxlcikuCisgICAgYmluZE1ldGhvZCgiZHVt
cEFzVGV4dCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcEFzVGV4dCk7CisgICAgYmluZE1l
dGhvZCgiZHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMiLCAmTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OmR1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zKTsKKyAgICBiaW5kTWV0aG9kKCJkdW1w
Q2hpbGRGcmFtZXNBc1RleHQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBDaGlsZEZyYW1l
c0FzVGV4dCk7CisgICAgYmluZE1ldGhvZCgiZHVtcERhdGFiYXNlQ2FsbGJhY2tzIiwgJkxheW91
dFRlc3RDb250cm9sbGVyOjpkdW1wRGF0YWJhc2VDYWxsYmFja3MpOworICAgIGJpbmRNZXRob2Qo
ImR1bXBFZGl0aW5nQ2FsbGJhY2tzIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpkdW1wRWRpdGlu
Z0NhbGxiYWNrcyk7CisgICAgYmluZE1ldGhvZCgiZHVtcEJhY2tGb3J3YXJkTGlzdCIsICZMYXlv
dXRUZXN0Q29udHJvbGxlcjo6ZHVtcEJhY2tGb3J3YXJkTGlzdCk7CisgICAgYmluZE1ldGhvZCgi
ZHVtcEZyYW1lTG9hZENhbGxiYWNrcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcEZyYW1l
TG9hZENhbGxiYWNrcyk7CisgICAgYmluZE1ldGhvZCgiZHVtcFJlc291cmNlTG9hZENhbGxiYWNr
cyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcFJlc291cmNlTG9hZENhbGxiYWNrcyk7Cisg
ICAgYmluZE1ldGhvZCgiZHVtcFN0YXR1c0NhbGxiYWNrcyIsICZMYXlvdXRUZXN0Q29udHJvbGxl
cjo6ZHVtcFdpbmRvd1N0YXR1c0NoYW5nZXMpOworICAgIGJpbmRNZXRob2QoImR1bXBUaXRsZUNo
YW5nZXMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBUaXRsZUNoYW5nZXMpOworICAgIGJp
bmRNZXRob2QoInNldEFjY2VwdHNFZGl0aW5nIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRB
Y2NlcHRzRWRpdGluZyk7CisgICAgYmluZE1ldGhvZCgid2FpdFVudGlsRG9uZSIsICZMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6d2FpdFVudGlsRG9uZSk7CisgICAgYmluZE1ldGhvZCgibm90aWZ5RG9u
ZSIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6bm90aWZ5RG9uZSk7CisgICAgYmluZE1ldGhvZCgi
cXVldWVSZWxvYWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlUmVsb2FkKTsKKyAgICBi
aW5kTWV0aG9kKCJxdWV1ZUxvYWRpbmdTY3JpcHQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1
ZXVlTG9hZGluZ1NjcmlwdCk7CisgICAgYmluZE1ldGhvZCgicXVldWVOb25Mb2FkaW5nU2NyaXB0
IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpxdWV1ZU5vbkxvYWRpbmdTY3JpcHQpOworICAgIGJp
bmRNZXRob2QoInF1ZXVlTG9hZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6cXVldWVMb2FkKTsK
KyAgICBiaW5kTWV0aG9kKCJxdWV1ZUJhY2tOYXZpZ2F0aW9uIiwgJkxheW91dFRlc3RDb250cm9s
bGVyOjpxdWV1ZUJhY2tOYXZpZ2F0aW9uKTsKKyAgICBiaW5kTWV0aG9kKCJxdWV1ZUZvcndhcmRO
YXZpZ2F0aW9uIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpxdWV1ZUZvcndhcmROYXZpZ2F0aW9u
KTsKKyAgICBiaW5kTWV0aG9kKCJ3aW5kb3dDb3VudCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6
d2luZG93Q291bnQpOworICAgIGJpbmRNZXRob2QoInNldENhbk9wZW5XaW5kb3dzIiwgJkxheW91
dFRlc3RDb250cm9sbGVyOjpzZXRDYW5PcGVuV2luZG93cyk7CisgICAgYmluZE1ldGhvZCgic2V0
Q2xvc2VSZW1haW5pbmdXaW5kb3dzV2hlbkNvbXBsZXRlIiwgJkxheW91dFRlc3RDb250cm9sbGVy
OjpzZXRDbG9zZVJlbWFpbmluZ1dpbmRvd3NXaGVuQ29tcGxldGUpOworICAgIGJpbmRNZXRob2Qo
Im9iakNJZGVudGl0eUlzRXF1YWwiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om9iakNJZGVudGl0
eUlzRXF1YWwpOworICAgIGJpbmRNZXRob2QoInNldEFsd2F5c0FjY2VwdENvb2tpZXMiLCAmTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnNldEFsd2F5c0FjY2VwdENvb2tpZXMpOworICAgIGJpbmRNZXRo
b2QoInNldFdpbmRvd0lzS2V5IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRXaW5kb3dJc0tl
eSk7CisgICAgYmluZE1ldGhvZCgic2V0VGFiS2V5Q3ljbGVzVGhyb3VnaEVsZW1lbnRzIiwgJkxh
eW91dFRlc3RDb250cm9sbGVyOjpzZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxlbWVudHMpOworICAg
IGJpbmRNZXRob2QoInNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24iLCAmTGF5b3V0VGVzdENvbnRy
b2xsZXI6OnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24pOworICAgIGJpbmRNZXRob2QoInNldFVz
ZXJTdHlsZVNoZWV0RW5hYmxlZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VXNlclN0eWxl
U2hlZXRFbmFibGVkKTsKKyAgICBiaW5kTWV0aG9kKCJwYXRoVG9Mb2NhbFJlc291cmNlIiwgJkxh
eW91dFRlc3RDb250cm9sbGVyOjpwYXRoVG9Mb2NhbFJlc291cmNlKTsKKyAgICBiaW5kTWV0aG9k
KCJhZGRGaWxlVG9QYXN0ZWJvYXJkT25EcmFnIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjphZGRG
aWxlVG9QYXN0ZWJvYXJkT25EcmFnKTsKKyAgICBiaW5kTWV0aG9kKCJleGVjQ29tbWFuZCIsICZM
YXlvdXRUZXN0Q29udHJvbGxlcjo6ZXhlY0NvbW1hbmQpOworICAgIGJpbmRNZXRob2QoImlzQ29t
bWFuZEVuYWJsZWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmlzQ29tbWFuZEVuYWJsZWQpOwor
ICAgIGJpbmRNZXRob2QoInNldFBvcHVwQmxvY2tpbmdFbmFibGVkIiwgJkxheW91dFRlc3RDb250
cm9sbGVyOjpzZXRQb3B1cEJsb2NraW5nRW5hYmxlZCk7CisgICAgYmluZE1ldGhvZCgic2V0U3Rv
cFByb3Zpc2lvbmFsRnJhbWVMb2FkcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0U3RvcFBy
b3Zpc2lvbmFsRnJhbWVMb2Fkcyk7CisgICAgYmluZE1ldGhvZCgic2V0U21hcnRJbnNlcnREZWxl
dGVFbmFibGVkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRTbWFydEluc2VydERlbGV0ZUVu
YWJsZWQpOworICAgIGJpbmRNZXRob2QoInNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJs
ZWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVu
YWJsZWQpOworICAgIGJpbmRNZXRob2QoInBhdXNlQW5pbWF0aW9uQXRUaW1lT25FbGVtZW50V2l0
aElkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpwYXVzZUFuaW1hdGlvbkF0VGltZU9uRWxlbWVu
dFdpdGhJZCk7CisgICAgYmluZE1ldGhvZCgicGF1c2VUcmFuc2l0aW9uQXRUaW1lT25FbGVtZW50
V2l0aElkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpwYXVzZVRyYW5zaXRpb25BdFRpbWVPbkVs
ZW1lbnRXaXRoSWQpOworICAgIGJpbmRNZXRob2QoImVsZW1lbnREb2VzQXV0b0NvbXBsZXRlRm9y
RWxlbWVudFdpdGhJZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZWxlbWVudERvZXNBdXRvQ29t
cGxldGVGb3JFbGVtZW50V2l0aElkKTsKKyAgICBiaW5kTWV0aG9kKCJudW1iZXJPZkFjdGl2ZUFu
aW1hdGlvbnMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om51bWJlck9mQWN0aXZlQW5pbWF0aW9u
cyk7CisgICAgYmluZE1ldGhvZCgiZGlzYWJsZUltYWdlTG9hZGluZyIsICZMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6ZGlzYWJsZUltYWdlTG9hZGluZyk7CisgICAgYmluZE1ldGhvZCgic2V0SWNvbkRh
dGFiYXNlRW5hYmxlZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0SWNvbkRhdGFiYXNlRW5h
YmxlZCk7CisgICAgYmluZE1ldGhvZCgic2V0Q3VzdG9tUG9saWN5RGVsZWdhdGUiLCAmTGF5b3V0
VGVzdENvbnRyb2xsZXI6OnNldEN1c3RvbVBvbGljeURlbGVnYXRlKTsKKyAgICBiaW5kTWV0aG9k
KCJ3YWl0Rm9yUG9saWN5RGVsZWdhdGUiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OndhaXRGb3JQ
b2xpY3lEZWxlZ2F0ZSk7CisgICAgYmluZE1ldGhvZCgic2V0V2lsbFNlbmRSZXF1ZXN0UmV0dXJu
c051bGxPblJlZGlyZWN0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRXaWxsU2VuZFJlcXVl
c3RSZXR1cm5zTnVsbE9uUmVkaXJlY3QpOworICAgIGJpbmRNZXRob2QoInNldFdpbGxTZW5kUmVx
dWVzdFJldHVybnNOdWxsIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRXaWxsU2VuZFJlcXVl
c3RSZXR1cm5zTnVsbCk7CisgICAgYmluZE1ldGhvZCgid2hpdGVMaXN0QWNjZXNzRnJvbU9yaWdp
biIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6d2hpdGVMaXN0QWNjZXNzRnJvbU9yaWdpbik7Cisg
ICAgYmluZE1ldGhvZCgiY2xlYXJBbGxEYXRhYmFzZXMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6
OmNsZWFyQWxsRGF0YWJhc2VzKTsKKyAgICBiaW5kTWV0aG9kKCJzZXREYXRhYmFzZVF1b3RhIiwg
JkxheW91dFRlc3RDb250cm9sbGVyOjpzZXREYXRhYmFzZVF1b3RhKTsKKyAgICBiaW5kTWV0aG9k
KCJzZXRQT1NJWExvY2FsZSIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0UE9TSVhMb2NhbGUp
OworICAgIGJpbmRNZXRob2QoImNvdW50ZXJWYWx1ZUZvckVsZW1lbnRCeUlkIiwgJkxheW91dFRl
c3RDb250cm9sbGVyOjpjb3VudGVyVmFsdWVGb3JFbGVtZW50QnlJZCk7CisgICAgYmluZE1ldGhv
ZCgiYWRkVXNlclNjcmlwdCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkVXNlclNjcmlwdCk7
CisgICAgYmluZE1ldGhvZCgicGFnZU51bWJlckZvckVsZW1lbnRCeUlkIiwgJkxheW91dFRlc3RD
b250cm9sbGVyOjpwYWdlTnVtYmVyRm9yRWxlbWVudEJ5SWQpOworICAgIGJpbmRNZXRob2QoIm51
bWJlck9mUGFnZXMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om51bWJlck9mUGFnZXMpOworICAg
IGJpbmRNZXRob2QoImR1bXBTZWxlY3Rpb25SZWN0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpk
dW1wU2VsZWN0aW9uUmVjdCk7CisKKyAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBzdHVicy4KKyAg
ICBiaW5kTWV0aG9kKCJkdW1wQXNXZWJBcmNoaXZlIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpk
dW1wQXNXZWJBcmNoaXZlKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRNYWluRnJhbWVJc0ZpcnN0UmVz
cG9uZGVyIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9u
ZGVyKTsKKyAgICBiaW5kTWV0aG9kKCJkdW1wU2VsZWN0aW9uUmVjdCIsICZMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6ZHVtcFNlbGVjdGlvblJlY3QpOworICAgIGJpbmRNZXRob2QoImRpc3BsYXkiLCAm
TGF5b3V0VGVzdENvbnRyb2xsZXI6OmRpc3BsYXkpOworICAgIGJpbmRNZXRob2QoInRlc3RSZXBh
aW50IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjp0ZXN0UmVwYWludCk7CisgICAgYmluZE1ldGhv
ZCgicmVwYWludFN3ZWVwSG9yaXpvbnRhbGx5IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpyZXBh
aW50U3dlZXBIb3Jpem9udGFsbHkpOworICAgIGJpbmRNZXRob2QoImNsZWFyQmFja0ZvcndhcmRM
aXN0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpjbGVhckJhY2tGb3J3YXJkTGlzdCk7CisgICAg
YmluZE1ldGhvZCgia2VlcFdlYkhpc3RvcnkiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmtlZXBX
ZWJIaXN0b3J5KTsKKyAgICBiaW5kTWV0aG9kKCJzdG9yZVdlYlNjcmlwdE9iamVjdCIsICZMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c3RvcmVXZWJTY3JpcHRPYmplY3QpOworICAgIGJpbmRNZXRob2Qo
ImFjY2Vzc1N0b3JlZFdlYlNjcmlwdE9iamVjdCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWNj
ZXNzU3RvcmVkV2ViU2NyaXB0T2JqZWN0KTsKKyAgICBiaW5kTWV0aG9kKCJvYmpDQ2xhc3NOYW1l
T2YiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om9iakNDbGFzc05hbWVPZik7CisgICAgYmluZE1l
dGhvZCgiYWRkRGlzYWxsb3dlZFVSTCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkRGlzYWxs
b3dlZFVSTCk7CisgICAgYmluZE1ldGhvZCgic2V0Q2FsbENsb3NlT25XZWJWaWV3cyIsICZMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c2V0Q2FsbENsb3NlT25XZWJWaWV3cyk7CisgICAgYmluZE1ldGhv
ZCgic2V0UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0
UHJpdmF0ZUJyb3dzaW5nRW5hYmxlZCk7CisgICAgYmluZE1ldGhvZCgic2V0VXNlRGFzaGJvYXJk
Q29tcGF0aWJpbGl0eU1vZGUiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFVzZURhc2hib2Fy
ZENvbXBhdGliaWxpdHlNb2RlKTsKKworICAgIGJpbmRNZXRob2QoInNldFhTU0F1ZGl0b3JFbmFi
bGVkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRYU1NBdWRpdG9yRW5hYmxlZCk7CisgICAg
YmluZE1ldGhvZCgiZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQiLCAmTGF5b3V0VGVzdENv
bnRyb2xsZXI6OmV2YWx1YXRlU2NyaXB0SW5Jc29sYXRlZFdvcmxkKTsKKyAgICBiaW5kTWV0aG9k
KCJvdmVycmlkZVByZWZlcmVuY2UiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6Om92ZXJyaWRlUHJl
ZmVyZW5jZSk7CisgICAgYmluZE1ldGhvZCgic2V0QWxsb3dVbml2ZXJzYWxBY2Nlc3NGcm9tRmls
ZVVSTHMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJv
bUZpbGVVUkxzKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRBbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVS
THMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJM
cyk7CisgICAgYmluZE1ldGhvZCgic2V0VGltZWxpbmVQcm9maWxpbmdFbmFibGVkIiwgJkxheW91
dFRlc3RDb250cm9sbGVyOjpzZXRUaW1lbGluZVByb2ZpbGluZ0VuYWJsZWQpOworICAgIGJpbmRN
ZXRob2QoImV2YWx1YXRlSW5XZWJJbnNwZWN0b3IiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmV2
YWx1YXRlSW5XZWJJbnNwZWN0b3IpOworICAgIGJpbmRNZXRob2QoImZvcmNlUmVkU2VsZWN0aW9u
Q29sb3JzIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpmb3JjZVJlZFNlbGVjdGlvbkNvbG9ycyk7
CisKKyAgICAvLyBUaGUgZmFsbGJhY2sgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGFuIHVua25vd24g
bWV0aG9kIGlzIGludm9rZWQuCisgICAgYmluZEZhbGxiYWNrTWV0aG9kKCZMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6ZmFsbGJhY2tNZXRob2QpOworCisgICAgLy8gU2hhcmVkIHByb3BlcnRpZXMuCisg
ICAgLy8gZ2xvYmFsRmxhZyBpcyB1c2VkIGJ5IGEgbnVtYmVyIG9mIGxheW91dCB0ZXN0cyBpbgor
ICAgIC8vIExheW91dFRlc3RzXGh0dHBcdGVzdHNcc2VjdXJpdHlcZGF0YVVSTC4KKyAgICBiaW5k
UHJvcGVydHkoImdsb2JhbEZsYWciLCAmbV9nbG9iYWxGbGFnKTsKKyAgICAvLyB3ZWJIaXN0b3J5
SXRlbUNvdW50IGlzIHVzZWQgYnkgdGVzdHMgaW4gTGF5b3V0VGVzdHNcaHR0cFx0ZXN0c1xoaXN0
b3J5CisgICAgYmluZFByb3BlcnR5KCJ3ZWJIaXN0b3J5SXRlbUNvdW50IiwgJm1fd2ViSGlzdG9y
eUl0ZW1Db3VudCk7Cit9CisKK0xheW91dFRlc3RDb250cm9sbGVyOjpXb3JrUXVldWU6On5Xb3Jr
UXVldWUoKQoreworICAgIHJlc2V0KCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OldvcmtRdWV1ZTo6cHJvY2Vzc1dvcmtTb29uKCkKK3sKKyAgICBpZiAobV9jb250cm9sbGVyLT5t
X3NoZWxsLT53ZWJWaWV3SG9zdCgpLT50b3BMb2FkaW5nRnJhbWUoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKCFtX3F1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBXZSBkZWxheSBw
cm9jZXNzaW5nIHF1ZXVlZCB3b3JrIHRvIGF2b2lkIHJlY3Vyc2lvbiBwcm9ibGVtcy4KKyAgICAg
ICAgbV90aW1lci5TdGFydChiYXNlOjpUaW1lRGVsdGEoKSwgdGhpcywgJldvcmtRdWV1ZTo6cHJv
Y2Vzc1dvcmspOworICAgIH0gZWxzZSBpZiAoIW1fY29udHJvbGxlci0+bV93YWl0VW50aWxEb25l
KSB7CisgICAgICAgIG1fY29udHJvbGxlci0+bV9zaGVsbC0+dGVzdEZpbmlzaGVkKCk7CisgICAg
fQorfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpXb3JrUXVldWU6OnByb2Nlc3NXb3Jr
KCkKK3sKKyAgICBUZXN0U2hlbGwqIHNoZWxsID0gbV9jb250cm9sbGVyLT5tX3NoZWxsOworICAg
IC8vIFF1aXQgZG9pbmcgd29yayBvbmNlIGEgbG9hZCBpcyBpbiBwcm9ncmVzcy4KKyAgICB3aGls
ZSAoIW1fcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIGJvb2wgc3RhcnRlZExvYWQgPSBtX3F1
ZXVlLmZpcnN0KCktPnJ1bihzaGVsbCk7CisgICAgICAgIGRlbGV0ZSBtX3F1ZXVlLmZpcnN0KCk7
CisgICAgICAgIG1fcXVldWUucmVtb3ZlRmlyc3QoKTsKKyAgICAgICAgaWYgKHN0YXJ0ZWRMb2Fk
KQorICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbV9jb250cm9sbGVyLT5t
X3dhaXRVbnRpbERvbmUgJiYgIXNoZWxsLT53ZWJWaWV3SG9zdCgpLT50b3BMb2FkaW5nRnJhbWUo
KSkKKyAgICAgICAgc2hlbGwtPnRlc3RGaW5pc2hlZCgpOworfQorCit2b2lkIExheW91dFRlc3RD
b250cm9sbGVyOjpXb3JrUXVldWU6OnJlc2V0KCkKK3sKKyAgICBtX2Zyb3plbiA9IGZhbHNlOwor
ICAgIHdoaWxlICghbV9xdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgZGVsZXRlIG1fcXVldWUu
Zmlyc3QoKTsKKyAgICAgICAgbV9xdWV1ZS5yZW1vdmVGaXJzdCgpOworICAgIH0KK30KKwordm9p
ZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6V29ya1F1ZXVlOjphZGRXb3JrKFdvcmtJdGVtKiB3b3Jr
KQoreworICAgIGlmIChtX2Zyb3plbikgeworICAgICAgICBkZWxldGUgd29yazsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBtX3F1ZXVlLmFwcGVuZCh3b3JrKTsKK30KKwordm9pZCBMYXlv
dXRUZXN0Q29udHJvbGxlcjo6ZHVtcEFzVGV4dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgbV9kdW1wQXNUZXh0ID0gdHJ1ZTsKKyAgICByZXN1bHQt
PnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcERhdGFiYXNl
Q2FsbGJhY2tzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sK
KyAgICAvLyBEbyBub3RoaW5nOyB3ZSBkb24ndCB1c2UgdGhpcyBmbGFnIGFueXdoZXJlIGZvciBu
b3cKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6ZHVtcEVkaXRpbmdDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIG1fZHVtcEVkaXRpbmdDYWxsYmFja3MgPSB0cnVlOworICAgIHJl
c3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wQmFj
a0ZvcndhcmRMaXN0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICBtX2R1bXBCYWNrRm9yd2FyZExpc3QgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVs
bCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wRnJhbWVMb2FkQ2FsbGJh
Y2tzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBt
X2R1bXBGcmFtZUxvYWRDYWxsYmFja3MgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wUmVzb3VyY2VMb2FkQ2FsbGJhY2tz
KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX2R1
bXBSZXNvdXJjZUxvYWRDYWxsYmFja3MgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0
aW9ucyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
bV9kdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucyA9IHRydWU7CisgICAgcmVzdWx0LT5zZXRO
dWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBDaGlsZEZyYW1lc0Fz
VGV4dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
bV9kdW1wQ2hpbGRGcmFtZXNBc1RleHQgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wV2luZG93U3RhdHVzQ2hhbmdlcyhj
b25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgbV9kdW1w
V2luZG93U3RhdHVzQ2hhbmdlcyA9IHRydWU7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBUaXRsZUNoYW5nZXMoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIG1fZHVtcFRpdGxlQ2hhbmdl
cyA9IHRydWU7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENv
bnRyb2xsZXI6OnNldEFjY2VwdHNFZGl0aW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1l
bnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAw
ICYmIGFyZ3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAgbV9hY2NlcHRzRWRpdGluZyA9IGFy
Z3VtZW50c1swXS52YWx1ZS5ib29sVmFsdWU7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OndhaXRVbnRpbERvbmUoY29uc3QgQ3BwQXJndW1l
bnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmICghRGVidWdVdGlsOjpCZWlu
Z0RlYnVnZ2VkKCkpIHsKKyAgICAgICAgLy8gRklYTUU6IFVzZSBiYXNlOjpPbmVTaG90VGltZXIu
IEZvciBzb21lIHJlYXNvbiwgdXNpbmcgT25lU2hvdFRpbWVyCisgICAgICAgIC8vIHNlZW1zIHRv
IGNhdXNlIGxheW91dCB0ZXN0IGZhaWx1cmVzIG9uIHRoZSB0cnkgYm90cy4KKyAgICAgICAgTWVz
c2FnZUxvb3A6OmN1cnJlbnQoKS0+UG9zdERlbGF5ZWRUYXNrKAorICAgICAgICAgICAgRlJPTV9I
RVJFLCBtX3RpbWVvdXRGYWN0b3J5Lk5ld1J1bm5hYmxlTWV0aG9kKCZMYXlvdXRUZXN0Q29udHJv
bGxlcjo6bm90aWZ5RG9uZVRpbWVkT3V0KSwKKyAgICAgICAgICAgIG1fc2hlbGwtPmxheW91dFRl
c3RUaW1lb3V0KCkpOworICAgIH0KKyAgICBtX3dhaXRVbnRpbERvbmUgPSB0cnVlOworICAgIHJl
c3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpub3RpZnlE
b25lKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICAv
LyBUZXN0IGRpZG4ndCB0aW1lb3V0LiBLaWxsIHRoZSB0aW1lb3V0IHRpbWVyLgorICAgIG1fdGlt
ZW91dEZhY3RvcnkuUmV2b2tlQWxsKCk7CisKKyAgICBjb21wbGV0ZU5vdGlmeURvbmUoZmFsc2Up
OworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
Ojpub3RpZnlEb25lVGltZWRPdXQoKQoreworICAgIGNvbXBsZXRlTm90aWZ5RG9uZSh0cnVlKTsK
K30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y29tcGxldGVOb3RpZnlEb25lKGJvb2wg
aXNUaW1lb3V0KQoreworICAgIGlmIChtX3dhaXRVbnRpbERvbmUgJiYgIW1fc2hlbGwtPndlYlZp
ZXdIb3N0KCktPnRvcExvYWRpbmdGcmFtZSgpICYmIG1fd29ya1F1ZXVlLmlzRW1wdHkoKSkgewor
ICAgICAgICBpZiAoaXNUaW1lb3V0KQorICAgICAgICAgICAgbV9zaGVsbC0+dGVzdFRpbWVkT3V0
KCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fc2hlbGwtPnRlc3RGaW5pc2hlZCgpOwor
ICAgIH0KKyAgICBtX3dhaXRVbnRpbERvbmUgPSBmYWxzZTsKK30KKworY2xhc3MgV29ya0l0ZW1C
YWNrRm9yd2FyZCA6IHB1YmxpYyBMYXlvdXRUZXN0Q29udHJvbGxlcjo6V29ya0l0ZW0geworcHVi
bGljOgorICAgIFdvcmtJdGVtQmFja0ZvcndhcmQoaW50IGRpc3RhbmNlKSA6IG1fZGlzdGFuY2Uo
ZGlzdGFuY2UpIHt9CisgICAgYm9vbCBydW4oVGVzdFNoZWxsKiBzaGVsbCkKKyAgICB7CisgICAg
ICAgIHNoZWxsLT5nb1RvT2Zmc2V0KG1fZGlzdGFuY2UpOworICAgICAgICByZXR1cm4gdHJ1ZTsg
Ly8gRklYTUU6IERpZCBpdCByZWFsbHkgc3RhcnQgYSBuYXZpZ2F0aW9uPworICAgIH0KK3ByaXZh
dGU6CisgICAgaW50IG1fZGlzdGFuY2U7Cit9OworCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpxdWV1ZUJhY2tOYXZpZ2F0aW9uKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBD
cHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFy
Z3VtZW50c1swXS5pc051bWJlcigpKQorICAgICAgICBtX3dvcmtRdWV1ZS5hZGRXb3JrKG5ldyBX
b3JrSXRlbUJhY2tGb3J3YXJkKC1hcmd1bWVudHNbMF0udG9JbnQzMigpKSk7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlRm9yd2Fy
ZE5hdmlnYXRpb24oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBd
LmlzTnVtYmVyKCkpCisgICAgICAgIG1fd29ya1F1ZXVlLmFkZFdvcmsobmV3IFdvcmtJdGVtQmFj
a0ZvcndhcmQoYXJndW1lbnRzWzBdLnRvSW50MzIoKSkpOworICAgIHJlc3VsdC0+c2V0TnVsbCgp
OworfQorCitjbGFzcyBXb3JrSXRlbVJlbG9hZCA6IHB1YmxpYyBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6V29ya0l0ZW0geworcHVibGljOgorICAgIGJvb2wgcnVuKFRlc3RTaGVsbCogc2hlbGwpCisg
ICAgeworICAgICAgICBzaGVsbC0+cmVsb2FkKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KK307CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlUmVsb2FkKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX3dvcmtRdWV1ZS5h
ZGRXb3JrKG5ldyBXb3JrSXRlbVJlbG9hZCk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K2NsYXNzIFdvcmtJdGVtTG9hZGluZ1NjcmlwdCA6IHB1YmxpYyBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6V29ya0l0ZW0geworcHVibGljOgorICAgIFdvcmtJdGVtTG9hZGluZ1NjcmlwdChjb25zdCBz
dHJpbmcmIHNjcmlwdCkgOiBtX3NjcmlwdChzY3JpcHQpIHt9CisgICAgYm9vbCBydW4oVGVzdFNo
ZWxsKiBzaGVsbCkKKyAgICB7CisgICAgICAgIHNoZWxsLT53ZWJWaWV3KCktPm1haW5GcmFtZSgp
LT5leGVjdXRlU2NyaXB0KFdlYlNjcmlwdFNvdXJjZShXZWJTdHJpbmc6OmZyb21VVEY4KG1fc2Ny
aXB0KSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRklYTUU6IERpZCBpdCByZWFsbHkgc3Rh
cnQgYSBuYXZpZ2F0aW9uPworICAgIH0KK3ByaXZhdGU6CisgICAgc3RyaW5nIG1fc2NyaXB0Owor
fTsKKworY2xhc3MgV29ya0l0ZW1Ob25Mb2FkaW5nU2NyaXB0IDogcHVibGljIExheW91dFRlc3RD
b250cm9sbGVyOjpXb3JrSXRlbSB7CitwdWJsaWM6CisgICAgV29ya0l0ZW1Ob25Mb2FkaW5nU2Ny
aXB0KGNvbnN0IHN0cmluZyYgc2NyaXB0KSA6IG1fc2NyaXB0KHNjcmlwdCkge30KKyAgICBib29s
IHJ1bihUZXN0U2hlbGwqIHNoZWxsKQorICAgIHsKKyAgICAgICAgc2hlbGwtPndlYlZpZXcoKS0+
bWFpbkZyYW1lKCktPmV4ZWN1dGVTY3JpcHQoV2ViU2NyaXB0U291cmNlKFdlYlN0cmluZzo6ZnJv
bVVURjgobV9zY3JpcHQpKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Citwcml2YXRl
OgorICAgIHN0cmluZyBtX3NjcmlwdDsKK307CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OnF1ZXVlTG9hZGluZ1NjcmlwdChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3Bw
VmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1
bWVudHNbMF0uaXNTdHJpbmcoKSkKKyAgICAgICAgbV93b3JrUXVldWUuYWRkV29yayhuZXcgV29y
a0l0ZW1Mb2FkaW5nU2NyaXB0KGFyZ3VtZW50c1swXS50b1N0cmluZygpKSk7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlTm9uTG9h
ZGluZ1NjcmlwdChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCog
cmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVudHNbMF0u
aXNTdHJpbmcoKSkKKyAgICAgICAgbV93b3JrUXVldWUuYWRkV29yayhuZXcgV29ya0l0ZW1Ob25M
b2FkaW5nU2NyaXB0KGFyZ3VtZW50c1swXS50b1N0cmluZygpKSk7CisgICAgcmVzdWx0LT5zZXRO
dWxsKCk7Cit9CisKK2NsYXNzIFdvcmtJdGVtTG9hZCA6IHB1YmxpYyBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6V29ya0l0ZW0geworcHVibGljOgorICAgIFdvcmtJdGVtTG9hZChjb25zdCBXZWJVUkwm
IHVybCwgY29uc3QgV2ViU3RyaW5nJiB0YXJnZXQpCisgICAgICAgIDogbV91cmwodXJsKQorICAg
ICAgICAsIG1fdGFyZ2V0KHRhcmdldCkge30KKyAgICBib29sIHJ1bihUZXN0U2hlbGwqIHNoZWxs
KQorICAgIHsKKyAgICAgICAgc2hlbGwtPndlYlZpZXdIb3N0KCktPmxvYWRVUkxGb3JGcmFtZSht
X3VybCwgbV90YXJnZXQpOworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gRklYTUU6IERpZCBpdCBy
ZWFsbHkgc3RhcnQgYSBuYXZpZ2F0aW9uPworICAgIH0KK3ByaXZhdGU6CisgICAgV2ViVVJMIG1f
dXJsOworICAgIFdlYlN0cmluZyBtX3RhcmdldDsKK307CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRy
b2xsZXI6OnF1ZXVlTG9hZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFy
aWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVu
dHNbMF0uaXNTdHJpbmcoKSkgeworICAgICAgICBHVVJMIGN1cnJlbnRVUkwgPSBtX3NoZWxsLT53
ZWJWaWV3KCktPm1haW5GcmFtZSgpLT51cmwoKTsKKyAgICAgICAgR1VSTCBmdWxsVVJMID0gY3Vy
cmVudFVSTC5SZXNvbHZlKGFyZ3VtZW50c1swXS50b1N0cmluZygpKTsKKworICAgICAgICBzdHJp
bmcgdGFyZ2V0ID0gIiI7CisgICAgICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMSAmJiBhcmd1
bWVudHNbMV0uaXNTdHJpbmcoKSkKKyAgICAgICAgICAgIHRhcmdldCA9IGFyZ3VtZW50c1sxXS50
b1N0cmluZygpOworCisgICAgICAgIG1fd29ya1F1ZXVlLmFkZFdvcmsobmV3IFdvcmtJdGVtTG9h
ZChmdWxsVVJMLCBXZWJTdHJpbmc6OmZyb21VVEY4KHRhcmdldCkpKTsKKyAgICB9CisgICAgcmVz
dWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6Om9iakNJZGVu
dGl0eUlzRXF1YWwoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA8IDIpIHsKKyAgICAgICAgLy8g
VGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8gdG8gcmV0dXJuIGFuIGVycm9yLgorICAgICAgICBy
ZXN1bHQtPnNldE51bGwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZXN1bHQtPnNl
dChhcmd1bWVudHNbMF0uaXNFcXVhbChhcmd1bWVudHNbMV0pKTsKK30KKwordm9pZCBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6cmVzZXQoKQoreworICAgIGlmIChtX3NoZWxsKSB7CisgICAgICAgIG1f
c2hlbGwtPndlYlZpZXcoKS0+c2V0Wm9vbUxldmVsKGZhbHNlLCAwKTsKKyAgICAgICAgbV9zaGVs
bC0+d2ViVmlldygpLT5zZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxlbWVudHModHJ1ZSk7CisjaWYg
ZGVmaW5lZChPU19MSU5VWCkKKyAgICAgICAgLy8gKENvbnN0YW50cyBjb3BpZWQgYmVjYXVzZSB3
ZSBjYW4ndCBkZXBlbmQgb24gdGhlIGhlYWRlciB0aGF0IGRlZmluZWQKKyAgICAgICAgLy8gdGhl
bSBmcm9tIHRoaXMgZmlsZS4pCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+c2V0U2VsZWN0
aW9uQ29sb3JzKDB4ZmYxZTkwZmYsIDB4ZmYwMDAwMDAsIDB4ZmZjOGM4YzgsIDB4ZmYzMjMyMzIp
OworI2VuZGlmIC8vIGRlZmluZWQoT1NfTElOVVgpCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXco
KS0+cmVtb3ZlQWxsVXNlckNvbnRlbnQoKTsKKyAgICB9CisgICAgbV9kdW1wQXNUZXh0ID0gZmFs
c2U7CisgICAgbV9kdW1wRWRpdGluZ0NhbGxiYWNrcyA9IGZhbHNlOworICAgIG1fZHVtcEZyYW1l
TG9hZENhbGxiYWNrcyA9IGZhbHNlOworICAgIG1fZHVtcFJlc291cmNlTG9hZENhbGxiYWNrcyA9
IGZhbHNlOworICAgIG1fZHVtcEJhY2tGb3J3YXJkTGlzdCA9IGZhbHNlOworICAgIG1fZHVtcENo
aWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMgPSBmYWxzZTsKKyAgICBtX2R1bXBDaGlsZEZyYW1lc0Fz
VGV4dCA9IGZhbHNlOworICAgIG1fZHVtcFdpbmRvd1N0YXR1c0NoYW5nZXMgPSBmYWxzZTsKKyAg
ICBtX2R1bXBTZWxlY3Rpb25SZWN0ID0gZmFsc2U7CisgICAgbV9kdW1wVGl0bGVDaGFuZ2VzID0g
ZmFsc2U7CisgICAgbV9hY2NlcHRzRWRpdGluZyA9IHRydWU7CisgICAgbV93YWl0VW50aWxEb25l
ID0gZmFsc2U7CisgICAgbV9jYW5PcGVuV2luZG93cyA9IGZhbHNlOworICAgIG1fdGVzdFJlcGFp
bnQgPSBmYWxzZTsKKyAgICBtX3N3ZWVwSG9yaXpvbnRhbGx5ID0gZmFsc2U7CisgICAgbV9zaG91
bGRBZGRGaWxlVG9QYXN0ZWJvYXJkID0gZmFsc2U7CisgICAgbV9zdG9wUHJvdmlzaW9uYWxGcmFt
ZUxvYWRzID0gZmFsc2U7CisgICAgbV9nbG9iYWxGbGFnLnNldChmYWxzZSk7CisgICAgbV93ZWJI
aXN0b3J5SXRlbUNvdW50LnNldCgwKTsKKworICAgIHdlYmtpdF9zdXBwb3J0OjpTZXRBY2NlcHRB
bGxDb29raWVzKGZhbHNlKTsKKyAgICBXZWJTZWN1cml0eVBvbGljeTo6cmVzZXRPcmlnaW5BY2Nl
c3NXaGl0ZUxpc3RzKCk7CisKKyAgICAvLyBSZXNldCB0aGUgZGVmYXVsdCBxdW90YSBmb3IgZWFj
aCBvcmlnaW4gdG8gNU1CCisgICAgd2Via2l0X3N1cHBvcnQ6OlNldERhdGFiYXNlUXVvdGEoNSAq
IDEwMjQgKiAxMDI0KTsKKworICAgIHNldGxvY2FsZShMQ19BTEwsICIiKTsKKworICAgIGlmICht
X2Nsb3NlUmVtYWluaW5nV2luZG93cykKKyAgICAgICAgbV9zaGVsbC0+Y2xvc2VSZW1haW5pbmdX
aW5kb3dzKCk7CisgICAgZWxzZQorICAgICAgICBtX2Nsb3NlUmVtYWluaW5nV2luZG93cyA9IHRy
dWU7CisgICAgbV93b3JrUXVldWUucmVzZXQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6bG9jYXRpb25DaGFuZ2VEb25lKCkKK3sKKyAgICBtX3dlYkhpc3RvcnlJdGVtQ291bnQu
c2V0KG1fc2hlbGwtPm5hdmlnYXRpb25FbnRyeUNvdW50KCkpOworCisgICAgLy8gTm8gbW9yZSBu
ZXcgd29yayBhZnRlciB0aGUgZmlyc3QgY29tcGxldGUgbG9hZC4KKyAgICBtX3dvcmtRdWV1ZS5z
ZXRGcm96ZW4odHJ1ZSk7CisKKyAgICBpZiAoIW1fd2FpdFVudGlsRG9uZSkKKyAgICAgICAgbV93
b3JrUXVldWUucHJvY2Vzc1dvcmtTb29uKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OnBvbGljeURlbGVnYXRlRG9uZSgpCit7CisgICAgQVNTRVJUKG1fd2FpdFVudGlsRG9uZSk7
CisgICAgbV9zaGVsbC0+dGVzdEZpbmlzaGVkKCk7CisgICAgbV93YWl0VW50aWxEb25lID0gZmFs
c2U7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldENhbk9wZW5XaW5kb3dzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX2Nhbk9w
ZW5XaW5kb3dzID0gdHJ1ZTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c2V0VGFiS2V5Q3ljbGVzVGhyb3VnaEVsZW1lbnRzKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYg
KGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAg
bV9zaGVsbC0+d2ViVmlldygpLT5zZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxlbWVudHMoYXJndW1l
bnRzWzBdLnRvQm9vbGVhbigpKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6d2luZG93Q291bnQoY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0KHN0YXRpY19jYXN0PGludD4o
bV9zaGVsbC0+d2luZG93Q291bnQoKSkpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpzZXRDbG9zZVJlbWFpbmluZ1dpbmRvd3NXaGVuQ29tcGxldGUoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRz
LnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX2Nsb3NlUmVt
YWluaW5nV2luZG93cyA9IGFyZ3VtZW50c1swXS52YWx1ZS5ib29sVmFsdWU7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEFsd2F5c0Fj
Y2VwdENvb2tpZXMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDApCisgICAgICAgIHdlYmtp
dF9zdXBwb3J0OjpTZXRBY2NlcHRBbGxDb29raWVzKGNwcFZhcmlhbnRUb0Jvb2woYXJndW1lbnRz
WzBdKSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRy
b2xsZXI6OnNldFdpbmRvd0lzS2V5KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBD
cHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFy
Z3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAgbV9zaGVsbC0+c2V0Rm9jdXMobV9zaGVsbC0+
d2ViVmlldygpLCBhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1bHQtPnNl
dE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VXNlclN0eWxlU2hl
ZXRFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiBy
ZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5p
c0Jvb2woKSkKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlldygpLT5zZXR0aW5ncygpLT5zZXRVc2Vy
U3R5bGVTaGVldExvY2F0aW9uKGFyZ3VtZW50c1swXS52YWx1ZS5ib29sVmFsdWUgPyBtX3VzZXJT
dHlsZVNoZWV0TG9jYXRpb24gOiBXZWJVUkwoKSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24o
Y29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sK
KyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzU3RyaW5nKCkp
IHsKKyAgICAgICAgbV91c2VyU3R5bGVTaGVldExvY2F0aW9uID0gR1VSTChUZXN0U2hlbGw6OnJl
d3JpdGVMb2NhbFVybChhcmd1bWVudHNbMF0udG9TdHJpbmcoKSkpOworICAgICAgICBtX3NoZWxs
LT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24obV91c2Vy
U3R5bGVTaGVldExvY2F0aW9uKTsKKyAgICB9CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmV4ZWNDb21tYW5kKGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXRO
dWxsKCk7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPD0gMCB8fCAhYXJndW1lbnRzWzBdLmlz
U3RyaW5nKCkpCisgICAgICAgIHJldHVybjsKKworICAgIHN0ZDo6c3RyaW5nIGNvbW1hbmQgPSBh
cmd1bWVudHNbMF0udG9TdHJpbmcoKTsKKyAgICBzdGQ6OnN0cmluZyB2YWx1ZSgiIik7CisgICAg
Ly8gSWdub3JlIHRoZSBzZWNvbmQgcGFyYW1ldGVyICh3aGljaCBpcyB1c2VySW50ZXJmYWNlKQor
ICAgIC8vIHNpbmNlIHRoaXMgY29tbWFuZCBlbXVsYXRlcyBhIG1hbnVhbCBhY3Rpb24uCisgICAg
aWYgKGFyZ3VtZW50cy5zaXplKCkgPj0gMyAmJiBhcmd1bWVudHNbMl0uaXNTdHJpbmcoKSkKKyAg
ICAgICAgdmFsdWUgPSBhcmd1bWVudHNbMl0udG9TdHJpbmcoKTsKKworICAgIC8vIE5vdGU6IHdl
YmtpdCdzIHZlcnNpb24gZG9lcyBub3QgcmV0dXJuIHRoZSBib29sZWFuLCBzbyBuZWl0aGVyIGRv
IHdlLgorICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+Zm9jdXNlZEZyYW1lKCktPmV4ZWN1dGVDb21t
YW5kKFdlYlN0cmluZzo6ZnJvbVVURjgoY29tbWFuZCksIFdlYlN0cmluZzo6ZnJvbVVURjgodmFs
dWUpKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6aXNDb21tYW5kRW5hYmxlZChj
b25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQorewor
ICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDw9IDAgfHwgIWFyZ3VtZW50c1swXS5pc1N0cmluZygp
KSB7CisgICAgICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgc3RkOjpzdHJpbmcgY29tbWFuZCA9IGFyZ3VtZW50c1swXS50b1N0cmluZygpOworICAg
IGJvb2wgcnYgPSBtX3NoZWxsLT53ZWJWaWV3KCktPmZvY3VzZWRGcmFtZSgpLT5pc0NvbW1hbmRF
bmFibGVkKFdlYlN0cmluZzo6ZnJvbVVURjgoY29tbWFuZCkpOworICAgIHJlc3VsdC0+c2V0KHJ2
KTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0UG9wdXBCbG9ja2luZ0VuYWJs
ZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgp
KSB7CisgICAgICAgIGJvb2wgYmxvY2tQb3B1cHMgPSBhcmd1bWVudHNbMF0udG9Cb29sZWFuKCk7
CisgICAgICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+c2V0dGluZ3MoKS0+c2V0SmF2YVNjcmlwdENh
bk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSghYmxvY2tQb3B1cHMpOworICAgIH0KKyAgICByZXN1
bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VXNlRGFz
aGJvYXJkQ29tcGF0aWJpbGl0eU1vZGUoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIC8vIFdlIGhhdmUgbm8gbmVlZCB0byBzdXBwb3J0IERhc2hib2Fy
ZCBDb21wYXRpYmlsaXR5IE1vZGUgKG1hYy1vbmx5KQorICAgIHJlc3VsdC0+c2V0TnVsbCgpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRDdXN0b21Qb2xpY3lEZWxlZ2F0ZShj
b25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQorewor
ICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVudHNbMF0uaXNCb29sKCkpIHsK
KyAgICAgICAgYm9vbCBlbmFibGUgPSBhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlOworICAg
ICAgICBib29sIHBlcm1pc3NpdmUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGFyZ3VtZW50cy5zaXpl
KCkgPiAxICYmIGFyZ3VtZW50c1sxXS5pc0Jvb2woKSkKKyAgICAgICAgICAgIHBlcm1pc3NpdmUg
PSBhcmd1bWVudHNbMV0udmFsdWUuYm9vbFZhbHVlOworICAgICAgICBtX3NoZWxsLT53ZWJWaWV3
SG9zdCgpLT5zZXRDdXN0b21Qb2xpY3lEZWxlZ2F0ZShlbmFibGUsIHBlcm1pc3NpdmUpOworICAg
IH0KKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6d2FpdEZvclBvbGljeURlbGVnYXRlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlh
bnQqIHJlc3VsdCkKK3sKKyAgICBtX3NoZWxsLT53ZWJWaWV3SG9zdCgpLT53YWl0Rm9yUG9saWN5
RGVsZWdhdGUoKTsKKyAgICBtX3dhaXRVbnRpbERvbmUgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0
TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRXaWxsU2VuZFJlcXVl
c3RSZXR1cm5zTnVsbE9uUmVkaXJlY3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMs
IENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYg
YXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3NoZWxsLT53ZWJWaWV3SG9zdCgpLT5z
ZXRCbG9ja1JlZGlyZWN0cyhhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1
bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0V2lsbFNl
bmRSZXF1ZXN0UmV0dXJuc051bGwoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENw
cFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJn
dW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3NoZWxsLT53ZWJWaWV3SG9zdCgpLT5zZXRS
ZXF1ZXN0UmV0dXJuTnVsbChhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1
bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cGF0aFRvTG9j
YWxSZXNvdXJjZShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCog
cmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1bWVudHMuc2l6
ZSgpIDw9IDAgfHwgIWFyZ3VtZW50c1swXS5pc1N0cmluZygpKQorICAgICAgICByZXR1cm47CisK
KyAgICBzdGQ6OnN0cmluZyB1cmwgPSBhcmd1bWVudHNbMF0udG9TdHJpbmcoKTsKKyAgICBpZiAo
U3RhcnRzV2l0aEFTQ0lJKHVybCwgIi90bXAvIiwgdHJ1ZSkpIHsKKyAgICAgICAgLy8gV2Ugd2Fu
dCBhIHRlbXAgZmlsZS4KKyAgICAgICAgRmlsZVBhdGggcGF0aDsKKyAgICAgICAgUGF0aFNlcnZp
Y2U6OkdldChiYXNlOjpESVJfVEVNUCwgJnBhdGgpOworICAgICAgICBwYXRoID0gcGF0aC5BcHBl
bmRBU0NJSSh1cmwuc3Vic3RyKDUpKTsKKyNpZiBPUyhXSU5ET1dTKQorICAgICAgICByZXN1bHQt
PnNldChVVEYxNlRvVVRGOChwYXRoLnZhbHVlKCkpKTsKKyNlbHNlCisgICAgICAgIHJlc3VsdC0+
c2V0KHBhdGgudmFsdWUoKSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAg
IC8vIFNvbWUgbGF5b3V0IHRlc3RzIHVzZSBmaWxlOi8vLy8gd2hpY2ggd2UgcmVzb2x2ZSBhcyBh
IFVOQyBwYXRoLiAgTm9ybWFsaXplCisgICAgLy8gdGhlbSB0byBqdXN0IGZpbGU6Ly8vLgorICAg
IHdoaWxlIChTdGFydHNXaXRoQVNDSUkodXJsLCAiZmlsZTovLy8vIiwgZmFsc2UpKQorICAgICAg
ICB1cmwgPSB1cmwuc3Vic3RyKDAsIDgpICsgdXJsLnN1YnN0cig5KTsKKyAgICBHVVJMIGxvY2F0
aW9uKFRlc3RTaGVsbDo6cmV3cml0ZUxvY2FsVXJsKHVybCkpOworICAgIHJlc3VsdC0+c2V0KGxv
Y2F0aW9uLnNwZWMoKSk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmFkZEZpbGVU
b1Bhc3RlYm9hcmRPbkRyYWcoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVz
dWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIG1fc2hvdWxkQWRkRmlsZVRvUGFz
dGVib2FyZCA9IHRydWU7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFN0b3BQ
cm92aXNpb25hbEZyYW1lTG9hZHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCog
cmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIG1fc3RvcFByb3Zpc2lvbmFs
RnJhbWVMb2FkcyA9IHRydWU7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFNt
YXJ0SW5zZXJ0RGVsZXRlRW5hYmxlZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywg
Q3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBh
cmd1bWVudHNbMF0uaXNCb29sKCkpCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXdIb3N0KCktPnNl
dFNtYXJ0SW5zZXJ0RGVsZXRlRW5hYmxlZChhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsK
KyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6
c2V0U2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZChjb25zdCBDcHBBcmd1bWVudExpc3Qm
IGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6
ZSgpID4gMCAmJiBhcmd1bWVudHNbMF0uaXNCb29sKCkpCisgICAgICAgIG1fc2hlbGwtPndlYlZp
ZXdIb3N0KCktPnNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJsZWQoYXJndW1lbnRzWzBd
LnZhbHVlLmJvb2xWYWx1ZSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK2Jvb2wgTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNlQW5pbWF0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKGNv
bnN0IFdlYlN0cmluZyYgYW5pbWF0aW9uTmFtZSwgZG91YmxlIHRpbWUsIGNvbnN0IFdlYlN0cmlu
ZyYgZWxlbWVudElkKQoreworICAgIFdlYkZyYW1lKiB3ZWJGcmFtZSA9IG1fc2hlbGwtPndlYlZp
ZXcoKS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCF3ZWJGcmFtZSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgV2ViQW5pbWF0aW9uQ29udHJvbGxlciogY29udHJvbGxlciA9IHdlYkZyYW1l
LT5hbmltYXRpb25Db250cm9sbGVyKCk7CisgICAgaWYgKCFjb250cm9sbGVyKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBXZWJFbGVtZW50IGVsZW1lbnQgPSB3ZWJGcmFtZS0+ZG9jdW1l
bnQoKS5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpOworICAgIGlmIChlbGVtZW50LmlzTnVsbCgp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGNvbnRyb2xsZXItPnBhdXNlQW5p
bWF0aW9uQXRUaW1lKGVsZW1lbnQsIGFuaW1hdGlvbk5hbWUsIHRpbWUpOworfQorCitib29sIExh
eW91dFRlc3RDb250cm9sbGVyOjpwYXVzZVRyYW5zaXRpb25BdFRpbWVPbkVsZW1lbnRXaXRoSWQo
Y29uc3QgV2ViU3RyaW5nJiBwcm9wZXJ0eU5hbWUsIGRvdWJsZSB0aW1lLCBjb25zdCBXZWJTdHJp
bmcmIGVsZW1lbnRJZCkKK3sKKyAgICBXZWJGcmFtZSogd2ViRnJhbWUgPSBtX3NoZWxsLT53ZWJW
aWV3KCktPm1haW5GcmFtZSgpOworICAgIGlmICghd2ViRnJhbWUpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIFdlYkFuaW1hdGlvbkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSB3ZWJGcmFt
ZS0+YW5pbWF0aW9uQ29udHJvbGxlcigpOworICAgIGlmICghY29udHJvbGxlcikKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgV2ViRWxlbWVudCBlbGVtZW50ID0gd2ViRnJhbWUtPmRvY3Vt
ZW50KCkuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKKyAgICBpZiAoZWxlbWVudC5pc051bGwo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBjb250cm9sbGVyLT5wYXVzZVRy
YW5zaXRpb25BdFRpbWUoZWxlbWVudCwgcHJvcGVydHlOYW1lLCB0aW1lKTsKK30KKworYm9vbCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6ZWxlbWVudERvZXNBdXRvQ29tcGxldGVGb3JFbGVtZW50V2l0
aElkKGNvbnN0IFdlYlN0cmluZyYgZWxlbWVudElkKQoreworICAgIFdlYkZyYW1lKiB3ZWJGcmFt
ZSA9IG1fc2hlbGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCF3ZWJGcmFtZSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgV2ViRWxlbWVudCBlbGVtZW50ID0gd2ViRnJh
bWUtPmRvY3VtZW50KCkuZ2V0RWxlbWVudEJ5SWQoZWxlbWVudElkKTsKKyAgICBpZiAoZWxlbWVu
dC5pc051bGwoKSB8fCAhZWxlbWVudC5oYXNUYWdOYW1lKCJpbnB1dCIpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBXZWJJbnB1dEVsZW1lbnQgaW5wdXRFbGVtZW50ID0gZWxlbWVudC50
b0VsZW1lbnQ8V2ViSW5wdXRFbGVtZW50PigpOworICAgIHJldHVybiBpbnB1dEVsZW1lbnQuYXV0
b0NvbXBsZXRlKCk7Cit9CisKK2ludCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bnVtYmVyT2ZBY3Rp
dmVBbmltYXRpb25zKCkKK3sKKyAgICBXZWJGcmFtZSogd2ViRnJhbWUgPSBtX3NoZWxsLT53ZWJW
aWV3KCktPm1haW5GcmFtZSgpOworICAgIGlmICghd2ViRnJhbWUpCisgICAgICAgIHJldHVybiAt
MTsKKworICAgIFdlYkFuaW1hdGlvbkNvbnRyb2xsZXIqIGNvbnRyb2xsZXIgPSB3ZWJGcmFtZS0+
YW5pbWF0aW9uQ29udHJvbGxlcigpOworICAgIGlmICghY29udHJvbGxlcikKKyAgICAgICAgcmV0
dXJuIC0xOworCisgICAgcmV0dXJuIGNvbnRyb2xsZXItPm51bWJlck9mQWN0aXZlQW5pbWF0aW9u
cygpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpwYXVzZUFuaW1hdGlvbkF0VGlt
ZU9uRWxlbWVudFdpdGhJZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFy
aWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMiAmJiBhcmd1bWVu
dHNbMF0uaXNTdHJpbmcoKSAmJiBhcmd1bWVudHNbMV0uaXNOdW1iZXIoKSAmJiBhcmd1bWVudHNb
Ml0uaXNTdHJpbmcoKSkgeworICAgICAgICBXZWJTdHJpbmcgYW5pbWF0aW9uTmFtZSA9IGNwcFZh
cmlhbnRUb1dlYlN0cmluZyhhcmd1bWVudHNbMF0pOworICAgICAgICBkb3VibGUgdGltZSA9IGFy
Z3VtZW50c1sxXS50b0RvdWJsZSgpOworICAgICAgICBXZWJTdHJpbmcgZWxlbWVudElkID0gY3Bw
VmFyaWFudFRvV2ViU3RyaW5nKGFyZ3VtZW50c1syXSk7CisgICAgICAgIHJlc3VsdC0+c2V0KHBh
dXNlQW5pbWF0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKGFuaW1hdGlvbk5hbWUsIHRpbWUsIGVs
ZW1lbnRJZCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC0+c2V0KGZhbHNlKTsKKyAg
ICB9Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNlVHJhbnNpdGlvbkF0VGlt
ZU9uRWxlbWVudFdpdGhJZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFy
aWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMiAmJiBhcmd1bWVu
dHNbMF0uaXNTdHJpbmcoKSAmJiBhcmd1bWVudHNbMV0uaXNOdW1iZXIoKSAmJiBhcmd1bWVudHNb
Ml0uaXNTdHJpbmcoKSkgeworICAgICAgICBXZWJTdHJpbmcgcHJvcGVydHlOYW1lID0gY3BwVmFy
aWFudFRvV2ViU3RyaW5nKGFyZ3VtZW50c1swXSk7CisgICAgICAgIGRvdWJsZSB0aW1lID0gYXJn
dW1lbnRzWzFdLnRvRG91YmxlKCk7CisgICAgICAgIFdlYlN0cmluZyBlbGVtZW50SWQgPSBjcHBW
YXJpYW50VG9XZWJTdHJpbmcoYXJndW1lbnRzWzJdKTsKKyAgICAgICAgcmVzdWx0LT5zZXQocGF1
c2VUcmFuc2l0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKHByb3BlcnR5TmFtZSwgdGltZSwgZWxl
bWVudElkKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LT5zZXQoZmFsc2UpOworICAg
IH0KK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZWxlbWVudERvZXNBdXRvQ29tcGxl
dGVGb3JFbGVtZW50V2l0aElkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgIT0gMSB8fCAhYXJn
dW1lbnRzWzBdLmlzU3RyaW5nKCkpIHsKKyAgICAgICAgcmVzdWx0LT5zZXQoZmFsc2UpOworICAg
ICAgICByZXR1cm47CisgICAgfQorICAgIFdlYlN0cmluZyBlbGVtZW50SWQgPSBjcHBWYXJpYW50
VG9XZWJTdHJpbmcoYXJndW1lbnRzWzBdKTsKKyAgICByZXN1bHQtPnNldChlbGVtZW50RG9lc0F1
dG9Db21wbGV0ZUZvckVsZW1lbnRXaXRoSWQoZWxlbWVudElkKSk7Cit9CisKK3ZvaWQgTGF5b3V0
VGVzdENvbnRyb2xsZXI6Om51bWJlck9mQWN0aXZlQW5pbWF0aW9ucyhjb25zdCBDcHBBcmd1bWVu
dExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXQobnVtYmVyT2ZB
Y3RpdmVBbmltYXRpb25zKCkpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkaXNh
YmxlSW1hZ2VMb2FkaW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3Vs
dCkKK3sKKyAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldExvYWRzSW1hZ2Vz
QXV0b21hdGljYWxseShmYWxzZSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQg
TGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEljb25EYXRhYmFzZUVuYWJsZWQoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIC8vIFdlIGRvbid0IHVzZSB0
aGUgV2ViS2l0IGljb24gZGF0YWJhc2UuCisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKKy8v
CisvLyBVbmltcGxlbWVudGVkIHN0dWJzCisvLworCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpkdW1wQXNXZWJBcmNoaXZlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnNldE1haW5GcmFtZUlzRmlyc3RSZXNwb25kZXIoY29uc3QgQ3Bw
QXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1
bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcFNlbGVj
dGlvblJlY3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJl
c3VsdCkKK3sKKyAgICBtX2R1bXBTZWxlY3Rpb25SZWN0ID0gdHJ1ZTsKKyAgICByZXN1bHQtPnNl
dE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZGlzcGxheShjb25zdCBD
cHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIFdl
YlZpZXdIb3N0KiBob3N0ID0gbV9zaGVsbC0+d2ViVmlld0hvc3QoKTsKKyAgICBjb25zdCBXZWJL
aXQ6OldlYlNpemUmIHNpemUgPSBtX3NoZWxsLT53ZWJWaWV3KCktPnNpemUoKTsKKyAgICBXZWJS
ZWN0IHJlY3QoMCwgMCwgc2l6ZS53aWR0aCwgc2l6ZS5oZWlnaHQpOworICAgIGhvc3QtPnVwZGF0
ZVBhaW50UmVjdChyZWN0KTsKKyAgICBob3N0LT5wYWludEludmFsaWRhdGVkUmVnaW9uKCk7Cisg
ICAgaG9zdC0+ZGlzcGxheVJlcGFpbnRNYXNrKCk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnRlc3RSZXBhaW50KGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX3Rlc3RSZXBhaW50ID0gdHJ1
ZTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6cmVwYWludFN3ZWVwSG9yaXpvbnRhbGx5KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX3N3ZWVwSG9yaXpvbnRhbGx5ID0gdHJ1ZTsKKyAgICBy
ZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2xlYXJC
YWNrRm9yd2FyZExpc3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlh
bnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6a2VlcFdlYkhpc3RvcnkoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1
bWVudHMsICBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnN0b3JlV2ViU2NyaXB0T2JqZWN0KGNvbnN0
IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
cmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmFjY2Vz
c1N0b3JlZFdlYlNjcmlwdE9iamVjdChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywg
Q3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpvYmpDQ2xhc3NOYW1lT2YoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51
bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkRGlzYWxsb3dlZFVSTChj
b25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQorewor
ICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0
Q2FsbENsb3NlT25XZWJWaWV3cyhjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3Bw
VmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExh
eW91dFRlc3RDb250cm9sbGVyOjpzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGNvbnN0IENwcEFy
Z3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0
LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFhTU0F1ZGl0
b3JFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiBy
ZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5p
c0Jvb2woKSkKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlldygpLT5zZXR0aW5ncygpLT5zZXRYU1NB
dWRpdG9yRW5hYmxlZChhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1bHQt
PnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZXZhbHVhdGVTY3Jp
cHRJbklzb2xhdGVkV29ybGQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZh
cmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+PSAyICYmIGFyZ3Vt
ZW50c1swXS5pc051bWJlcigpICYmIGFyZ3VtZW50c1sxXS5pc1N0cmluZygpKSB7CisgICAgICAg
IFdlYlNjcmlwdFNvdXJjZSBzb3VyY2UoV2ViU3RyaW5nOjpmcm9tVVRGOChhcmd1bWVudHNbMV0u
dG9TdHJpbmcoKSkpOworICAgICAgICAvLyBUaGlzIHJlbGllcyBvbiB0aGUgaWZyYW1lIGZvY3Vz
aW5nIGl0c2VsZiB3aGVuIGl0IGxvYWRzLiBUaGlzIGlzIGEgYml0CisgICAgICAgIC8vIHNrZXRj
aHksIGJ1dCBpdCBzZWVtcyB0byBiZSB3aGF0IG90aGVyIHRlc3RzIGRvLgorICAgICAgICBtX3No
ZWxsLT53ZWJWaWV3KCktPmZvY3VzZWRGcmFtZSgpLT5leGVjdXRlU2NyaXB0SW5Jc29sYXRlZFdv
cmxkKGFyZ3VtZW50c1swXS50b0ludDMyKCksICZzb3VyY2UsIDEsIDEpOworICAgIH0KKyAgICBy
ZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWxs
b3dVbml2ZXJzYWxBY2Nlc3NGcm9tRmlsZVVSTHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1
bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+
IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3NoZWxsLT53ZWJWaWV3KCkt
PnNldHRpbmdzKCktPnNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKGFyZ3VtZW50
c1swXS52YWx1ZS5ib29sVmFsdWUpOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpzZXRBbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVSTHMoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAg
ICAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldEFsbG93RmlsZUFjY2Vzc0Zy
b21GaWxlVVJMcyhhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1bHQtPnNl
dE51bGwoKTsKK30KKworLy8gTmVlZCB0aGVzZSBjb252ZXJzaW9ucyBiZWNhdXNlIHRoZSBmb3Jt
YXQgb2YgdGhlIHZhbHVlIGZvciBib29sZWFucworLy8gbWF5IHZhcnkgLSBmb3IgZXhhbXBsZSwg
b24gbWFjICIxIiBhbmQgIjAiIGFyZSB1c2VkIGZvciBib29sZWFuLgorYm9vbCBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6Y3BwVmFyaWFudFRvQm9vbChjb25zdCBDcHBWYXJpYW50JiB2YWx1ZSkKK3sK
KyAgICBpZiAodmFsdWUuaXNCb29sKCkpCisgICAgICAgIHJldHVybiB2YWx1ZS50b0Jvb2xlYW4o
KTsKKyAgICBpZiAodmFsdWUuaXNJbnQzMigpKQorICAgICAgICByZXR1cm4gdmFsdWUudG9JbnQz
MigpOworICAgIGlmICh2YWx1ZS5pc1N0cmluZygpKSB7CisgICAgICAgIHN0cmluZyB2YWx1ZVN0
cmluZyA9IHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgIGlmICh2YWx1ZVN0cmluZyA9PSAidHJ1
ZSIgfHwgdmFsdWVTdHJpbmcgPT0gIjEiKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIGlmICh2YWx1ZVN0cmluZyA9PSAiZmFsc2UiIHx8IHZhbHVlU3RyaW5nID09ICIwIikKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbG9nRXJyb3JUb0NvbnNvbGUoIklu
dmFsaWQgdmFsdWUuIEV4cGVjdGVkIGJvb2xlYW4gdmFsdWUuIik7CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitpbnQzMl90IExheW91dFRlc3RDb250cm9sbGVyOjpjcHBWYXJpYW50VG9JbnQzMihj
b25zdCBDcHBWYXJpYW50JiB2YWx1ZSkKK3sKKyAgICBpZiAodmFsdWUuaXNJbnQzMigpKQorICAg
ICAgICByZXR1cm4gdmFsdWUudG9JbnQzMigpOworICAgIGlmICh2YWx1ZS5pc1N0cmluZygpKSB7
CisgICAgICAgIGludCBudW1iZXI7CisgICAgICAgIGlmIChTdHJpbmdUb0ludCh2YWx1ZS50b1N0
cmluZygpLCAmbnVtYmVyKSkKKyAgICAgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgfQorICAg
IGxvZ0Vycm9yVG9Db25zb2xlKCJJbnZhbGlkIHZhbHVlIGZvciBwcmVmZXJlbmNlLiBFeHBlY3Rl
ZCBpbnRlZ2VyIHZhbHVlLiIpOworICAgIHJldHVybiAwOworfQorCitXZWJTdHJpbmcgTGF5b3V0
VGVzdENvbnRyb2xsZXI6OmNwcFZhcmlhbnRUb1dlYlN0cmluZyhjb25zdCBDcHBWYXJpYW50JiB2
YWx1ZSkKK3sKKyAgICBpZiAoIXZhbHVlLmlzU3RyaW5nKCkpIHsKKyAgICAgICAgbG9nRXJyb3JU
b0NvbnNvbGUoIkludmFsaWQgdmFsdWUgZm9yIHByZWZlcmVuY2UuIEV4cGVjdGVkIHN0cmluZyB2
YWx1ZS4iKTsKKyAgICAgICAgcmV0dXJuIFdlYlN0cmluZygpOworICAgIH0KKyAgICByZXR1cm4g
V2ViU3RyaW5nOjpmcm9tVVRGOCh2YWx1ZS50b1N0cmluZygpKTsKK30KKwordm9pZCBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6b3ZlcnJpZGVQcmVmZXJlbmNlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYg
YXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7
CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgIT0gMiB8fCAhYXJndW1lbnRzWzBdLmlzU3RyaW5n
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIHN0cmluZyBrZXkgPSBhcmd1bWVudHNbMF0udG9T
dHJpbmcoKTsKKyAgICBDcHBWYXJpYW50IHZhbHVlID0gYXJndW1lbnRzWzFdOworICAgIFdlYlNl
dHRpbmdzKiBzZXR0aW5ncyA9IG1fc2hlbGwtPndlYlZpZXcoKS0+c2V0dGluZ3MoKTsKKyAgICBp
ZiAoa2V5ID09ICJXZWJLaXRTdGFuZGFyZEZvbnQiKQorICAgICAgICBzZXR0aW5ncy0+c2V0U3Rh
bmRhcmRGb250RmFtaWx5KGNwcFZhcmlhbnRUb1dlYlN0cmluZyh2YWx1ZSkpOworICAgIGVsc2Ug
aWYgKGtleSA9PSAiV2ViS2l0Rml4ZWRGb250IikKKyAgICAgICAgc2V0dGluZ3MtPnNldEZpeGVk
Rm9udEZhbWlseShjcHBWYXJpYW50VG9XZWJTdHJpbmcodmFsdWUpKTsKKyAgICBlbHNlIGlmIChr
ZXkgPT0gIldlYktpdFNlcmlmRm9udCIpCisgICAgICAgIHNldHRpbmdzLT5zZXRTZXJpZkZvbnRG
YW1pbHkoY3BwVmFyaWFudFRvV2ViU3RyaW5nKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09
ICJXZWJLaXRTYW5zU2VyaWZGb250IikKKyAgICAgICAgc2V0dGluZ3MtPnNldFNhbnNTZXJpZkZv
bnRGYW1pbHkoY3BwVmFyaWFudFRvV2ViU3RyaW5nKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5
ID09ICJXZWJLaXRDdXJzaXZlRm9udCIpCisgICAgICAgIHNldHRpbmdzLT5zZXRDdXJzaXZlRm9u
dEZhbWlseShjcHBWYXJpYW50VG9XZWJTdHJpbmcodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkg
PT0gIldlYktpdEZhbnRhc3lGb250IikKKyAgICAgICAgc2V0dGluZ3MtPnNldEZhbnRhc3lGb250
RmFtaWx5KGNwcFZhcmlhbnRUb1dlYlN0cmluZyh2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9
PSAiV2ViS2l0RGVmYXVsdEZvbnRTaXplIikKKyAgICAgICAgc2V0dGluZ3MtPnNldERlZmF1bHRG
b250U2l6ZShjcHBWYXJpYW50VG9JbnQzMih2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAi
V2ViS2l0RGVmYXVsdEZpeGVkRm9udFNpemUiKQorICAgICAgICBzZXR0aW5ncy0+c2V0RGVmYXVs
dEZpeGVkRm9udFNpemUoY3BwVmFyaWFudFRvSW50MzIodmFsdWUpKTsKKyAgICBlbHNlIGlmIChr
ZXkgPT0gIldlYktpdE1pbmltdW1Gb250U2l6ZSIpCisgICAgICAgIHNldHRpbmdzLT5zZXRNaW5p
bXVtRm9udFNpemUoY3BwVmFyaWFudFRvSW50MzIodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkg
PT0gIldlYktpdE1pbmltdW1Mb2dpY2FsRm9udFNpemUiKQorICAgICAgICBzZXR0aW5ncy0+c2V0
TWluaW11bUxvZ2ljYWxGb250U2l6ZShjcHBWYXJpYW50VG9JbnQzMih2YWx1ZSkpOworICAgIGVs
c2UgaWYgKGtleSA9PSAiV2ViS2l0RGVmYXVsdFRleHRFbmNvZGluZ05hbWUiKQorICAgICAgICBz
ZXR0aW5ncy0+c2V0RGVmYXVsdFRleHRFbmNvZGluZ05hbWUoY3BwVmFyaWFudFRvV2ViU3RyaW5n
KHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRKYXZhU2NyaXB0RW5hYmxlZCIp
CisgICAgICAgIHNldHRpbmdzLT5zZXRKYXZhU2NyaXB0RW5hYmxlZChjcHBWYXJpYW50VG9Cb29s
KHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRXZWJTZWN1cml0eUVuYWJsZWQi
KQorICAgICAgICBzZXR0aW5ncy0+c2V0V2ViU2VjdXJpdHlFbmFibGVkKGNwcFZhcmlhbnRUb0Jv
b2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdEphdmFTY3JpcHRDYW5PcGVu
V2luZG93c0F1dG9tYXRpY2FsbHkiKQorICAgICAgICBzZXR0aW5ncy0+c2V0SmF2YVNjcmlwdENh
bk9wZW5XaW5kb3dzQXV0b21hdGljYWxseShjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAg
ZWxzZSBpZiAoa2V5ID09ICJXZWJLaXREaXNwbGF5SW1hZ2VzS2V5IikKKyAgICAgICAgc2V0dGlu
Z3MtPnNldExvYWRzSW1hZ2VzQXV0b21hdGljYWxseShjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7
CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRQbHVnaW5zRW5hYmxlZCIpCisgICAgICAgIHNl
dHRpbmdzLT5zZXRQbHVnaW5zRW5hYmxlZChjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAg
ZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRET01QYXN0ZUFsbG93ZWRQcmVmZXJlbmNlS2V5IikKKyAg
ICAgICAgc2V0dGluZ3MtPnNldERPTVBhc3RlQWxsb3dlZChjcHBWYXJpYW50VG9Cb29sKHZhbHVl
KSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXREZXZlbG9wZXJFeHRyYXNFbmFibGVkUHJl
ZmVyZW5jZUtleSIpCisgICAgICAgIHNldHRpbmdzLT5zZXREZXZlbG9wZXJFeHRyYXNFbmFibGVk
KGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdFNo
cmlua3NTdGFuZGFsb25lSW1hZ2VzVG9GaXQiKQorICAgICAgICBzZXR0aW5ncy0+c2V0U2hyaW5r
c1N0YW5kYWxvbmVJbWFnZXNUb0ZpdChjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAgZWxz
ZSBpZiAoa2V5ID09ICJXZWJLaXRUZXh0QXJlYXNBcmVSZXNpemFibGUiKQorICAgICAgICBzZXR0
aW5ncy0+c2V0VGV4dEFyZWFzQXJlUmVzaXphYmxlKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsK
KyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdEphdmFFbmFibGVkIikKKyAgICAgICAgc2V0dGlu
Z3MtPnNldEphdmFFbmFibGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlm
IChrZXkgPT0gIldlYktpdFVzZXNQYWdlQ2FjaGVQcmVmZXJlbmNlS2V5IikKKyAgICAgICAgc2V0
dGluZ3MtPnNldFVzZXNQYWdlQ2FjaGUoY3BwVmFyaWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVs
c2UgaWYgKGtleSA9PSAiV2ViS2l0WFNTQXVkaXRvckVuYWJsZWQiKQorICAgICAgICBzZXR0aW5n
cy0+c2V0WFNTQXVkaXRvckVuYWJsZWQoY3BwVmFyaWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVs
c2UgaWYgKGtleSA9PSAiV2ViS2l0TG9jYWxTdG9yYWdlRW5hYmxlZFByZWZlcmVuY2VLZXkiKQor
ICAgICAgICBzZXR0aW5ncy0+c2V0TG9jYWxTdG9yYWdlRW5hYmxlZChjcHBWYXJpYW50VG9Cb29s
KHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRPZmZsaW5lV2ViQXBwbGljYXRp
b25DYWNoZUVuYWJsZWQiKQorICAgICAgICBzZXR0aW5ncy0+c2V0T2ZmbGluZVdlYkFwcGxpY2F0
aW9uQ2FjaGVFbmFibGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChr
ZXkgPT0gIldlYktpdFRhYlRvTGlua3NQcmVmZXJlbmNlS2V5IikKKyAgICAgICAgbV9zaGVsbC0+
d2ViVmlldygpLT5zZXRUYWJzVG9MaW5rcyhjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAg
ZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRXZWJHTEVuYWJsZWQiKQorICAgICAgICBzZXR0aW5ncy0+
c2V0RXhwZXJpbWVudGFsV2ViR0xFbmFibGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAg
ICBlbHNlIHsKKyAgICAgICAgc3RyaW5nIG1lc3NhZ2UoIkludmFsaWQgbmFtZSBmb3IgcHJlZmVy
ZW5jZTogIik7CisgICAgICAgIG1lc3NhZ2UuYXBwZW5kKGtleSk7CisgICAgICAgIGxvZ0Vycm9y
VG9Db25zb2xlKG1lc3NhZ2UpOworICAgIH0KK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6ZmFsbGJhY2tNZXRob2QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVz
dWx0KQoreworICAgIHByaW50ZigiQ09OU09MRSBNRVNTQUdFOiBKYXZhU2NyaXB0IEVSUk9SOiB1
bmtub3duIG1ldGhvZCBjYWxsZWQgb24gTGF5b3V0VGVzdENvbnRyb2xsZXJcbiIpOworICAgIHJl
c3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjp3aGl0ZUxp
c3RBY2Nlc3NGcm9tT3JpZ2luKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7CisKKyAgICBpZiAoYXJn
dW1lbnRzLnNpemUoKSAhPSA0IHx8ICFhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSB8fCAhYXJndW1l
bnRzWzFdLmlzU3RyaW5nKCkKKyAgICAgICAgfHwgIWFyZ3VtZW50c1syXS5pc1N0cmluZygpIHx8
ICFhcmd1bWVudHNbM10uaXNCb29sKCkpCisgICAgICAgIHJldHVybjsKKworICAgIFdlYktpdDo6
V2ViVVJMIHVybChHVVJMKGFyZ3VtZW50c1swXS50b1N0cmluZygpKSk7CisgICAgaWYgKCF1cmwu
aXNWYWxpZCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBXZWJTZWN1cml0eVBvbGljeTo6d2hp
dGVMaXN0QWNjZXNzRnJvbU9yaWdpbih1cmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgV2ViU3RyaW5nOjpmcm9tVVRGOChhcmd1bWVudHNbMV0udG9T
dHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgV2ViU3RyaW5nOjpmcm9tVVRGOChhcmd1bWVudHNbMl0udG9TdHJpbmcoKSksCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzWzNdLnRv
Qm9vbGVhbigpKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2xlYXJBbGxEYXRh
YmFzZXMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3Vs
dCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICB3ZWJraXRfc3VwcG9ydDo6Q2xlYXJB
bGxEYXRhYmFzZXMoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0RGF0YWJh
c2VRdW90YShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVz
dWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmICgoYXJndW1lbnRzLnNpemUo
KSA+PSAxKSAmJiBhcmd1bWVudHNbMF0uaXNJbnQzMigpKQorICAgICAgICB3ZWJraXRfc3VwcG9y
dDo6U2V0RGF0YWJhc2VRdW90YShhcmd1bWVudHNbMF0udG9JbnQzMigpKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0UE9TSVhMb2NhbGUoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwo
KTsKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA9PSAxICYmIGFyZ3VtZW50c1swXS5pc1N0cmlu
ZygpKQorICAgICAgICBzZXRsb2NhbGUoTENfQUxMLCBhcmd1bWVudHNbMF0udG9TdHJpbmcoKS5j
X3N0cigpKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y291bnRlclZhbHVlRm9y
RWxlbWVudEJ5SWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICBpZiAoYXJndW1lbnRzLnNp
emUoKSA8IDEgfHwgIWFyZ3VtZW50c1swXS5pc1N0cmluZygpKQorICAgICAgICByZXR1cm47Cisg
ICAgV2ViRnJhbWUqIGZyYW1lID0gbV9zaGVsbC0+d2ViVmlldygpLT5tYWluRnJhbWUoKTsKKyAg
ICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgV2ViU3RyaW5nIGNvdW50ZXJWYWx1
ZSA9IGZyYW1lLT5jb3VudGVyVmFsdWVGb3JFbGVtZW50QnlJZChjcHBWYXJpYW50VG9XZWJTdHJp
bmcoYXJndW1lbnRzWzBdKSk7CisgICAgaWYgKGNvdW50ZXJWYWx1ZS5pc051bGwoKSkKKyAgICAg
ICAgcmV0dXJuOworICAgIHJlc3VsdC0+c2V0KGNvdW50ZXJWYWx1ZS51dGY4KCkpOworfQorCitz
dGF0aWMgYm9vbCBwYXJzZVBhZ2VTaXplUGFyYW1ldGVycyhjb25zdCBDcHBBcmd1bWVudExpc3Qm
IGFyZ3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdP
ZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogcGFnZVdp
ZHRoSW5QaXhlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCog
cGFnZUhlaWdodEluUGl4ZWxzKQoreworICAgIC8vIFdlYktpdCBpcyB1c2luZyB0aGUgd2luZG93
IHdpZHRoL2hlaWdodCBvZiBEdW1wUmVuZGVyVHJlZSBhcyB0aGUKKyAgICAvLyBkZWZhdWx0IHZh
bHVlIG9mIHRoZSBwYWdlIHNpemUuCisgICAgLy8gRklYTUU6IHNoYXJlIHRoZXNlIHZhbHVlcyB3
aXRoIG90aGVyIHBvcnRzLgorICAgICpwYWdlV2lkdGhJblBpeGVscyA9IDgwMDsKKyAgICAqcGFn
ZUhlaWdodEluUGl4ZWxzID0gNjAwOworICAgIHN3aXRjaCAoYXJndW1lbnRzLnNpemUoKSAtIGFy
Z09mZnNldCkgeworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKCFhcmd1bWVudHNbYXJnT2Zmc2V0
XS5pc051bWJlcigpIHx8ICFhcmd1bWVudHNbMSArIGFyZ09mZnNldF0uaXNOdW1iZXIoKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgKnBhZ2VXaWR0aEluUGl4ZWxzID0gc3Rh
dGljX2Nhc3Q8ZmxvYXQ+KGFyZ3VtZW50c1thcmdPZmZzZXRdLnRvSW50MzIoKSk7CisgICAgICAg
ICpwYWdlSGVpZ2h0SW5QaXhlbHMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXJndW1lbnRzWzEgKyBh
cmdPZmZzZXRdLnRvSW50MzIoKSk7CisgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4KKyAgICBjYXNl
IDA6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OnBhZ2VOdW1iZXJGb3JFbGVtZW50QnlJZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGZs
b2F0IHBhZ2VXaWR0aEluUGl4ZWxzID0gMDsKKyAgICBmbG9hdCBwYWdlSGVpZ2h0SW5QaXhlbHMg
PSAwOworICAgIGlmICghcGFyc2VQYWdlU2l6ZVBhcmFtZXRlcnMoYXJndW1lbnRzLCAxLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhZ2VXaWR0aEluUGl4ZWxzLCAmcGFnZUhl
aWdodEluUGl4ZWxzKSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmICghYXJndW1lbnRzWzBdLmlz
U3RyaW5nKCkpCisgICAgICAgIHJldHVybjsKKyAgICBXZWJGcmFtZSogZnJhbWUgPSBtX3NoZWxs
LT53ZWJWaWV3KCktPm1haW5GcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAgIHJldHVy
bjsKKyAgICByZXN1bHQtPnNldChmcmFtZS0+cGFnZU51bWJlckZvckVsZW1lbnRCeUlkKGNwcFZh
cmlhbnRUb1dlYlN0cmluZyhhcmd1bWVudHNbMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVdpZHRoSW5QaXhlbHMsIHBhZ2VIZWlnaHRJblBp
eGVscykpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpudW1iZXJPZlBhZ2VzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7Cisg
ICAgcmVzdWx0LT5zZXROdWxsKCk7CisgICAgZmxvYXQgcGFnZVdpZHRoSW5QaXhlbHMgPSAwOwor
ICAgIGZsb2F0IHBhZ2VIZWlnaHRJblBpeGVscyA9IDA7CisgICAgaWYgKCFwYXJzZVBhZ2VTaXpl
UGFyYW1ldGVycyhhcmd1bWVudHMsIDAsICZwYWdlV2lkdGhJblBpeGVscywgJnBhZ2VIZWlnaHRJ
blBpeGVscykpCisgICAgICAgIHJldHVybjsKKworICAgIFdlYkZyYW1lKiBmcmFtZSA9IG1fc2hl
bGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0
dXJuOworICAgIFdlYlNpemUgc2l6ZShwYWdlV2lkdGhJblBpeGVscywgcGFnZUhlaWdodEluUGl4
ZWxzKTsKKyAgICBpbnQgbnVtYmVyT2ZQYWdlcyA9IGZyYW1lLT5wcmludEJlZ2luKHNpemUpOwor
ICAgIGZyYW1lLT5wcmludEVuZCgpOworICAgIHJlc3VsdC0+c2V0KG51bWJlck9mUGFnZXMpOwor
fQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpsb2dFcnJvclRvQ29uc29sZShjb25zdCBz
dGQ6OnN0cmluZyYgdGV4dCkKK3sKKyAgICBtX3NoZWxsLT53ZWJWaWV3SG9zdCgpLT5kaWRBZGRN
ZXNzYWdlVG9Db25zb2xlKAorICAgICAgICBXZWJDb25zb2xlTWVzc2FnZShXZWJDb25zb2xlTWVz
c2FnZTo6TGV2ZWxFcnJvciwgV2ViU3RyaW5nOjpmcm9tVVRGOCh0ZXh0KSksCisgICAgICAgIFdl
YlN0cmluZygpLCAwKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VGltZWxp
bmVQcm9maWxpbmdFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7CisgICAgaWYgKGFyZ3Vt
ZW50cy5zaXplKCkgPCAxIHx8ICFhcmd1bWVudHNbMF0uaXNCb29sKCkpCisgICAgICAgIHJldHVy
bjsKKyAgICAvLyBGSVhNRTogU2hvdWxkIGNhbGwgVGVzdFNoZWxsRGV2VG9vbHNBZ2VudDo6c2V0
VGltZWxpbmVQcm9maWxpbmdFbmFibGVkKCkuCit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OmV2YWx1YXRlSW5XZWJJbnNwZWN0b3IoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVu
dHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICBp
ZiAoYXJndW1lbnRzLnNpemUoKSA8IDIgfHwgIWFyZ3VtZW50c1swXS5pc0ludDMyKCkgfHwgIWFy
Z3VtZW50c1sxXS5pc1N0cmluZygpKQorICAgICAgICByZXR1cm47CisgICAgLy8gRklYTUU6IFNo
b3VsZCBjYWxsIFRlc3RTaGVsbERldlRvb2xzQWdlbnQ6OmV2YWx1YXRlSW5XZWJJbnNwZWN0b3Io
KS4KK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Zm9yY2VSZWRTZWxlY3Rpb25Db2xv
cnMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkK
K3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldFNl
bGVjdGlvbkNvbG9ycygweGZmZWUwMDAwLCAweGZmMDBlZTAwLCAweGZmMDAwMDAwLCAweGZmYzBj
MGMwKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkVXNlclNjcmlwdChjb25z
dCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAg
IHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDwgMSB8fCAhYXJn
dW1lbnRzWzBdLmlzU3RyaW5nKCkgfHwgIWFyZ3VtZW50c1sxXS5pc0Jvb2woKSkKKyAgICAgICAg
cmV0dXJuOworICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+YWRkVXNlclNjcmlwdChXZWJTdHJpbmc6
OmZyb21VVEY4KGFyZ3VtZW50c1swXS50b1N0cmluZygpKSwgYXJndW1lbnRzWzFdLnRvQm9vbGVh
bigpKTsKK30KZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVt
L0xheW91dFRlc3RDb250cm9sbGVyLmggYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJv
bWl1bS9MYXlvdXRUZXN0Q29udHJvbGxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLmRhNTcyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVy
VHJlZS9jaHJvbWl1bS9MYXlvdXRUZXN0Q29udHJvbGxlci5oCkBAIC0wLDAgKzEsNDQwIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgUGF3ZWwgSGFqZGFuIChwaGFqZGFuLmpyQGNocm9taXVt
Lm9yZykKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisg
KiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4g
dGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUg
SW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRv
IGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRS
SUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAq
IE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisvKgorICBMYXlvdXRUZXN0Q29udHJvbGxlciBjbGFzczoKKyAgQm91bmQgdG8gYSBKYXZhU2Ny
aXB0IHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlciBvYmplY3QgdXNpbmcgdGhlCisgIENwcEJv
dW5kQ2xhc3M6OmJpbmRUb0phdmFzY3JpcHQoKSwgdGhpcyBhbGxvd3MgbGF5b3V0IHRlc3RzIHRo
YXQgYXJlIHJ1biBpbgorICB0aGUgdGVzdF9zaGVsbCAob3IsIGluIHByaW5jaXBsZSwgYW55IHdl
YiBwYWdlIGxvYWRlZCBpbnRvIGEgY2xpZW50IGFwcCBidWlsdAorICB3aXRoIHRoaXMgY2xhc3Mp
IHRvIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIGhvdyB0aGUgdGVzdHMgYXJlIHJ1biBhbmQg
d2hhdAorICBzb3J0IG9mIG91dHB1dCB0aGV5IHByb2R1Y2UuCisqLworCisjaWZuZGVmIExheW91
dFRlc3RDb250cm9sbGVyX2gKKyNkZWZpbmUgTGF5b3V0VGVzdENvbnRyb2xsZXJfaAorCisjaW5j
bHVkZSAiQ3BwQm91bmRDbGFzcy5oIgorI2luY2x1ZGUgImJhc2UvdGltZXIuaCIKKyNpbmNsdWRl
ICJwdWJsaWMvV2ViU3RyaW5nLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlVSTC5oIgorI2luY2x1
ZGUgPHd0Zi9EZXF1ZS5oPgorCitjbGFzcyBUZXN0U2hlbGw7CisKK2NsYXNzIExheW91dFRlc3RD
b250cm9sbGVyIDogcHVibGljIENwcEJvdW5kQ2xhc3MgeworcHVibGljOgorICAgIC8vIEJ1aWxk
cyB0aGUgcHJvcGVydHkgYW5kIG1ldGhvZCBsaXN0cyBuZWVkZWQgdG8gYmluZCB0aGlzIGNsYXNz
IHRvIGEgSlMKKyAgICAvLyBvYmplY3QuCisgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIoVGVzdFNo
ZWxsKik7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYSBmbGFnIHRoYXQgdGVsbHMgdGhl
IHRlc3Rfc2hlbGwgdG8gZHVtcCBwYWdlcyBhcworICAgIC8vIHBsYWluIHRleHQsIHJhdGhlciB0
aGFuIGFzIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVuZGVyZXIncyBzdGF0ZS4KKyAg
ICAvLyBJdCB0YWtlcyBubyBhcmd1bWVudHMsIGFuZCBpZ25vcmVzIGFueSB0aGF0IG1heSBiZSBw
cmVzZW50LgorICAgIHZvaWQgZHVtcEFzVGV4dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50Kik7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzZXQgYSBmbGFnIHRoYXQg
dGVsbHMgdGhlIHRlc3Rfc2hlbGwgdG8gcHJpbnQgYSBsaW5lCisgICAgLy8gb2YgZGVzY3JpcHRp
dmUgdGV4dCBmb3IgZWFjaCBkYXRhYmFzZSBjb21tYW5kLiAgSXQgc2hvdWxkIHRha2Ugbm8KKyAg
ICAvLyBhcmd1bWVudHMsIGFuZCBpZ25vcmUgYW55IHRoYXQgbWF5IGJlIHByZXNlbnQuIEhvd2V2
ZXIsIGF0IHRoZSBtb21lbnQsIHdlCisgICAgLy8gZG9uJ3QgaGF2ZSBhbnkgREIgZnVuY3Rpb24g
dGhhdCBwcmludHMgbWVzc2FnZXMsIHNvIGZvciBub3cgdGhpcyBmdW5jdGlvbgorICAgIC8vIGRv
ZXNuJ3QgZG8gYW55dGhpbmcuCisgICAgdm9pZCBkdW1wRGF0YWJhc2VDYWxsYmFja3MoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBz
ZXRzIGEgZmxhZyB0aGF0IHRlbGxzIHRoZSB0ZXN0X3NoZWxsIHRvIHByaW50IGEgbGluZSBvZgor
ICAgIC8vIGRlc2NyaXB0aXZlIHRleHQgZm9yIGVhY2ggZWRpdGluZyBjb21tYW5kLiAgSXQgdGFr
ZXMgbm8gYXJndW1lbnRzLCBhbmQKKyAgICAvLyBpZ25vcmVzIGFueSB0aGF0IG1heSBiZSBwcmVz
ZW50LgorICAgIHZvaWQgZHVtcEVkaXRpbmdDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzZXRzIGEgZmxhZyB0aGF0
IHRlbGxzIHRoZSB0ZXN0X3NoZWxsIHRvIHByaW50IGEgbGluZSBvZgorICAgIC8vIGRlc2NyaXB0
aXZlIHRleHQgZm9yIGVhY2ggZnJhbWUgbG9hZCBjYWxsYmFjay4gIEl0IHRha2VzIG5vIGFyZ3Vt
ZW50cywgYW5kCisgICAgLy8gaWdub3JlcyBhbnkgdGhhdCBtYXkgYmUgcHJlc2VudC4KKyAgICB2
b2lkIGR1bXBGcmFtZUxvYWRDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFy
aWFudCopOworCisgICAgLy8gVGhpcyBmdW5jdGlvbiBzZXRzIGEgZmxhZyB0aGF0IHRlbGxzIHRo
ZSB0ZXN0X3NoZWxsIHRvIHByaW50IG91dCBhIHRleHQKKyAgICAvLyByZXByZXNlbnRhdGlvbiBv
ZiB0aGUgYmFjay9mb3J3YXJkIGxpc3QuICBJdCBpZ25vcmVzIGFsbCBhcmd1bWVudHMuCisgICAg
dm9pZCBkdW1wQmFja0ZvcndhcmRMaXN0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlh
bnQqKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0cyBhIGZsYWcgdGhhdCB0ZWxscyB0aGUg
dGVzdF9zaGVsbCB0byBwcmludCBvdXQgdGhlCisgICAgLy8gc2Nyb2xsIG9mZnNldHMgb2YgdGhl
IGNoaWxkIGZyYW1lcy4gIEl0IGlnbm9yZXMgYWxsLgorICAgIHZvaWQgZHVtcENoaWxkRnJhbWVT
Y3JvbGxQb3NpdGlvbnMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisg
ICAgLy8gVGhpcyBmdW5jdGlvbiBzZXRzIGEgZmxhZyB0aGF0IHRlbGxzIHRoZSB0ZXN0X3NoZWxs
IHRvIHJlY3Vyc2l2ZWx5CisgICAgLy8gZHVtcCBhbGwgZnJhbWVzIGFzIHBsYWluIHRleHQgaWYg
dGhlIGR1bXBBc1RleHQgZmxhZyBpcyBzZXQuCisgICAgLy8gSXQgdGFrZXMgbm8gYXJndW1lbnRz
LCBhbmQgaWdub3JlcyBhbnkgdGhhdCBtYXkgYmUgcHJlc2VudC4KKyAgICB2b2lkIGR1bXBDaGls
ZEZyYW1lc0FzVGV4dChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAg
ICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYSBmbGFnIHRoYXQgdGVsbHMgdGhlIHRlc3Rfc2hlbGwg
dG8gZHVtcCBhbGwgY2FsbHMKKyAgICAvLyB0byB3aW5kb3cuc3RhdHVzKCkuCisgICAgLy8gSXQg
dGFrZXMgbm8gYXJndW1lbnRzLCBhbmQgaWdub3JlcyBhbnkgdGhhdCBtYXkgYmUgcHJlc2VudC4K
KyAgICB2b2lkIGR1bXBXaW5kb3dTdGF0dXNDaGFuZ2VzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYs
IENwcFZhcmlhbnQqKTsKKworICAgIC8vIFdoZW4gY2FsbGVkIHdpdGggYSBib29sZWFuIGFyZ3Vt
ZW50LCB0aGlzIHNldHMgYSBmbGFnIHRoYXQgY29udHJvbHMKKyAgICAvLyB3aGV0aGVyIGNvbnRl
bnQtZWRpdGFibGUgZWxlbWVudHMgYWNjZXB0IGVkaXRpbmcgZm9jdXMgd2hlbiBhbiBlZGl0aW5n
CisgICAgLy8gYXR0ZW1wdCBpcyBtYWRlLiBJdCBpZ25vcmVzIGFueSBhZGRpdGlvbmFsIGFyZ3Vt
ZW50cy4KKyAgICB2b2lkIHNldEFjY2VwdHNFZGl0aW5nKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYs
IENwcFZhcmlhbnQqKTsKKworICAgIC8vIEZ1bmN0aW9ucyBmb3IgZGVhbGluZyB3aXRoIHdpbmRv
d3MuICBCeSBkZWZhdWx0IHdlIGJsb2NrIGFsbCBuZXcgd2luZG93cy4KKyAgICB2b2lkIHdpbmRv
d0NvdW50KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHNl
dENhbk9wZW5XaW5kb3dzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAg
ICB2b2lkIHNldENsb3NlUmVtYWluaW5nV2luZG93c1doZW5Db21wbGV0ZShjb25zdCBDcHBBcmd1
bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBCeSBkZWZhdWx0LCB0ZXN0cyBlbmQg
d2hlbiBwYWdlIGxvYWQgaXMgY29tcGxldGUuICBUaGVzZSBtZXRob2RzIGFyZSB1c2VkCisgICAg
Ly8gdG8gZGVsYXkgdGhlIGNvbXBsZXRpb24gb2YgdGhlIHRlc3QgdW50aWwgbm90aWZ5RG9uZSBp
cyBjYWxsZWQuCisgICAgdm9pZCB3YWl0VW50aWxEb25lKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYs
IENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIG5vdGlmeURvbmUoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgbm90aWZ5RG9uZVRpbWVkT3V0KCk7CisKKyAgICAv
LyBNZXRob2RzIGZvciBhZGRpbmcgYWN0aW9ucyB0byB0aGUgd29yayBxdWV1ZS4gIFVzZWQgaW4g
Y29uanVuY3Rpb24gd2l0aAorICAgIC8vIHdhaXRVbnRpbERvbmUvbm90aWZ5RG9uZSBhYm92ZS4K
KyAgICB2b2lkIHF1ZXVlQmFja05hdmlnYXRpb24oY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3Bw
VmFyaWFudCopOworICAgIHZvaWQgcXVldWVGb3J3YXJkTmF2aWdhdGlvbihjb25zdCBDcHBBcmd1
bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBxdWV1ZVJlbG9hZChjb25zdCBDcHBB
cmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBxdWV1ZUxvYWRpbmdTY3JpcHQo
Y29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgcXVldWVOb25M
b2FkaW5nU2NyaXB0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2
b2lkIHF1ZXVlTG9hZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAg
ICAvLyBBbHRob3VnaCB0aGlzIGlzIG5hbWVkICJvYmpDIiB0byBtYXRjaCB0aGUgTWFjIHZlcnNp
b24sIGl0IGFjdHVhbGx5IHRlc3RzCisgICAgLy8gdGhlIGlkZW50aXR5IG9mIGl0cyB0d28gYXJn
dW1lbnRzIGluIEMrKy4KKyAgICB2b2lkIG9iakNJZGVudGl0eUlzRXF1YWwoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gQ2hhbmdlcyB0aGUgY29va2llIHBv
bGljeSBmcm9tIHRoZSBkZWZhdWx0IHRvIGFsbG93IGFsbCBjb29raWVzLgorICAgIHZvaWQgc2V0
QWx3YXlzQWNjZXB0Q29va2llcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisKKyAgICAvLyBHaXZlcyBmb2N1cyB0byB0aGUgd2luZG93LgorICAgIHZvaWQgc2V0V2luZG93
SXNLZXkoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gTWV0
aG9kIHRoYXQgY29udHJvbHMgd2hldGhlciBwcmVzc2luZyBUYWIga2V5IGN5Y2xlcyB0aHJvdWdo
IHBhZ2UgZWxlbWVudHMKKyAgICAvLyBvciBpbnNlcnRzIGEgJ1x0JyBjaGFyIGluIHRleHQgYXJl
YQorICAgIHZvaWQgc2V0VGFiS2V5Q3ljbGVzVGhyb3VnaEVsZW1lbnRzKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFBhc3NlcyB0aHJvdWdoIHRvIFdlYlBy
ZWZlcmVuY2VzIHdoaWNoIGFsbG93cyB0aGUgdXNlciB0byBoYXZlIGEgY3VzdG9tCisgICAgLy8g
c3R5bGUgc2hlZXQuCisgICAgdm9pZCBzZXRVc2VyU3R5bGVTaGVldEVuYWJsZWQoY29uc3QgQ3Bw
QXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgc2V0VXNlclN0eWxlU2hlZXRM
b2NhdGlvbihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBQ
dXRzIFdlYmtpdCBpbiAiZGFzaGJvYXJkIGNvbXBhdGliaWxpdHkgbW9kZSIsIHdoaWNoIGlzIHVz
ZWQgaW4gb2JzY3VyZQorICAgIC8vIE1hYy1vbmx5IGNpcmN1bXN0YW5jZXMuIEl0J3Mgbm90IHJl
YWxseSBuZWNlc3NhcnksIGFuZCB3aWxsIG1vc3QgbGlrZWx5CisgICAgLy8gbmV2ZXIgYmUgdXNl
ZCBieSBDaHJvbWUsIGJ1dCBzb21lIGxheW91dCB0ZXN0cyBkZXBlbmQgb24gaXRzIHByZXNlbmNl
LgorICAgIHZvaWQgc2V0VXNlRGFzaGJvYXJkQ29tcGF0aWJpbGl0eU1vZGUoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gQ2F1c2VzIG5hdmlnYXRpb24gYWN0
aW9ucyBqdXN0IHByaW50b3V0IHRoZSBpbnRlbmRlZCBuYXZpZ2F0aW9uIGluc3RlYWQKKyAgICAv
LyBvZiB0YWtpbmcgeW91IHRvIHRoZSBwYWdlLiBUaGlzIGlzIHVzZWQgZm9yIGNhc2VzIGxpa2Ug
bWFpbHRvLCB3aGVyZSB5b3UKKyAgICAvLyBkb24ndCBhY3R1YWxseSB3YW50IHRvIG9wZW4gdGhl
IG1haWwgcHJvZ3JhbS4KKyAgICB2b2lkIHNldEN1c3RvbVBvbGljeURlbGVnYXRlKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIERlbGF5cyBjb21wbGV0aW9u
IG9mIHRoZSB0ZXN0IHVudGlsIHRoZSBwb2xpY3kgZGVsZWdhdGUgcnVucy4KKyAgICB2b2lkIHdh
aXRGb3JQb2xpY3lEZWxlZ2F0ZShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisKKyAgICAvLyBDYXVzZXMgV2lsbFNlbmRSZXF1ZXN0IHRvIGJsb2NrIHJlZGlyZWN0cy4KKyAg
ICB2b2lkIHNldFdpbGxTZW5kUmVxdWVzdFJldHVybnNOdWxsT25SZWRpcmVjdChjb25zdCBDcHBB
cmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBDYXVzZXMgV2lsbFNlbmRSZXF1
ZXN0IHRvIHJldHVybiBhbiBlbXB0eSByZXF1ZXN0LgorICAgIHZvaWQgc2V0V2lsbFNlbmRSZXF1
ZXN0UmV0dXJuc051bGwoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisg
ICAgLy8gQ29udmVydHMgYSBVUkwgc3RhcnRpbmcgd2l0aCBmaWxlOi8vL3RtcC8gdG8gdGhlIGxv
Y2FsIG1hcHBpbmcuCisgICAgdm9pZCBwYXRoVG9Mb2NhbFJlc291cmNlKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFNldHMgYSBib29sIHN1Y2ggdGhhdCB3
aGVuIGEgZHJhZyBpcyBzdGFydGVkLCB3ZSBmaWxsIHRoZSBkcmFnIGNsaXBib2FyZAorICAgIC8v
IHdpdGggYSBmYWtlIGZpbGUgb2JqZWN0LgorICAgIHZvaWQgYWRkRmlsZVRvUGFzdGVib2FyZE9u
RHJhZyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBFeGVj
dXRlcyBhbiBpbnRlcm5hbCBjb21tYW5kIChzdXBlcnNldCBvZiBkb2N1bWVudC5leGVjQ29tbWFu
ZCgpIGNvbW1hbmRzKS4KKyAgICB2b2lkIGV4ZWNDb21tYW5kKGNvbnN0IENwcEFyZ3VtZW50TGlz
dCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIENoZWNrcyBpZiBhbiBpbnRlcm5hbCBjb21tYW5k
IGlzIGN1cnJlbnRseSBhdmFpbGFibGUuCisgICAgdm9pZCBpc0NvbW1hbmRFbmFibGVkKGNvbnN0
IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFNldCB0aGUgV2ViUHJl
ZmVyZW5jZSB0aGF0IGNvbnRyb2xzIHdlYmtpdCdzIHBvcHVwIGJsb2NraW5nLgorICAgIHZvaWQg
c2V0UG9wdXBCbG9ja2luZ0VuYWJsZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFu
dCopOworCisgICAgLy8gSWYgdHJ1ZSwgY2F1c2VzIHByb3Zpc2lvbmFsIGZyYW1lIGxvYWRzIHRv
IGJlIHN0b3BwZWQgZm9yIHRoZSByZW1haW5kZXIgb2YKKyAgICAvLyB0aGUgdGVzdC4KKyAgICB2
b2lkIHNldFN0b3BQcm92aXNpb25hbEZyYW1lTG9hZHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCopOworCisgICAgLy8gRW5hYmxlIG9yIGRpc2FibGUgc21hcnQgaW5zZXJ0L2Rl
bGV0ZS4gIFRoaXMgaXMgZW5hYmxlZCBieSBkZWZhdWx0LgorICAgIHZvaWQgc2V0U21hcnRJbnNl
cnREZWxldGVFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKwor
ICAgIC8vIEVuYWJsZSBvciBkaXNhYmxlIHRyYWlsaW5nIHdoaXRlc3BhY2Ugc2VsZWN0aW9uIG9u
IGRvdWJsZSBjbGljay4KKyAgICB2b2lkIHNldFNlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJs
ZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgdm9pZCBwYXVz
ZUFuaW1hdGlvbkF0VGltZU9uRWxlbWVudFdpdGhJZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBD
cHBWYXJpYW50Kik7CisgICAgdm9pZCBwYXVzZVRyYW5zaXRpb25BdFRpbWVPbkVsZW1lbnRXaXRo
SWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgZWxlbWVu
dERvZXNBdXRvQ29tcGxldGVGb3JFbGVtZW50V2l0aElkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYs
IENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIG51bWJlck9mQWN0aXZlQW5pbWF0aW9ucyhjb25zdCBD
cHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICB2b2lkIGRpc2FibGVJbWFnZUxv
YWRpbmcoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgdm9pZCBz
ZXRJY29uRGF0YWJhc2VFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQq
KTsKKworICAgIHZvaWQgZHVtcFNlbGVjdGlvblJlY3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCopOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBhcmUgb25seSBzdHVicy4gIFRP
RE8ocGFtZyk6IEltcGxlbWVudCBhbnkgb2YgdGhlc2UgdGhhdAorICAgIC8vIGFyZSBuZWVkZWQg
dG8gcGFzcyB0aGUgbGF5b3V0IHRlc3RzLgorICAgIHZvaWQgZHVtcEFzV2ViQXJjaGl2ZShjb25z
dCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBkdW1wVGl0bGVDaGFu
Z2VzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGR1bXBS
ZXNvdXJjZUxvYWRDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCop
OworICAgIHZvaWQgc2V0TWFpbkZyYW1lSXNGaXJzdFJlc3BvbmRlcihjb25zdCBDcHBBcmd1bWVu
dExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBkaXNwbGF5KGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHRlc3RSZXBhaW50KGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHJlcGFpbnRTd2VlcEhvcml6b250YWxs
eShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBjbGVhckJh
Y2tGb3J3YXJkTGlzdChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAg
dm9pZCBrZWVwV2ViSGlzdG9yeShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisgICAgdm9pZCBzdG9yZVdlYlNjcmlwdE9iamVjdChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBD
cHBWYXJpYW50Kik7CisgICAgdm9pZCBhY2Nlc3NTdG9yZWRXZWJTY3JpcHRPYmplY3QoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgb2JqQ0NsYXNzTmFtZU9m
KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGFkZERpc2Fs
bG93ZWRVUkwoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQg
c2V0Q2FsbENsb3NlT25XZWJWaWV3cyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
Kik7CisgICAgdm9pZCBzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIHZvaWQgc2V0WFNTQXVkaXRvckVuYWJsZWQoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgZXZhbHVhdGVTY3Jp
cHRJbklzb2xhdGVkV29ybGQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOwor
ICAgIHZvaWQgb3ZlcnJpZGVQcmVmZXJlbmNlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKyAgICB2b2lkIHNldEFsbG93VW5pdmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHNldEFsbG93Rmls
ZUFjY2Vzc0Zyb21GaWxlVVJMcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7
CisKKworICAgIC8vIFRoZSBmYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYSBub25leGlz
dGVudCBtZXRob2QgaXMgY2FsbGVkIG9uCisgICAgLy8gdGhlIGxheW91dCB0ZXN0IGNvbnRyb2xs
ZXIgb2JqZWN0LgorICAgIC8vIEl0IGlzIHVzZWZ1bGwgdG8gY2F0Y2ggdHlwb3MgaW4gdGhlIEph
dmFTY3JpcHQgY29kZSAoYSBmZXcgbGF5b3V0IHRlc3RzCisgICAgLy8gZG8gaGF2ZSB0eXBvcyBp
biB0aGVtKSBhbmQgaXQgYWxsb3dzIHRoZSBzY3JpcHQgdG8gY29udGludWUgcnVubmluZyBpbgor
ICAgIC8vIHRoYXQgY2FzZSAoYXMgdGhlIE1hYyBkb2VzKS4KKyAgICB2b2lkIGZhbGxiYWNrTWV0
aG9kKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEFsbG93
cyBsYXlvdXQgdGVzdHMgdG8gY2FsbCBTZWN1cml0eU9yaWdpbjo6d2hpdGVMaXN0QWNjZXNzRnJv
bU9yaWdpbigpLgorICAgIHZvaWQgd2hpdGVMaXN0QWNjZXNzRnJvbU9yaWdpbihjb25zdCBDcHBB
cmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBDbGVhcnMgYWxsIGRhdGFiYXNl
cy4KKyAgICB2b2lkIGNsZWFyQWxsRGF0YWJhc2VzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENw
cFZhcmlhbnQqKTsKKyAgICAvLyBTZXRzIHRoZSBkZWZhdWx0IHF1b3RhIGZvciBhbGwgb3JpZ2lu
cworICAgIHZvaWQgc2V0RGF0YWJhc2VRdW90YShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50Kik7CisKKyAgICAvLyBDYWxscyBzZXRsb2NhbGUoTENfQUxMLCAuLi4pIGZvciBhIHNw
ZWNpZmllZCBsb2NhbGUuCisgICAgLy8gUmVzZXRzIGJldHdlZW4gdGVzdHMuCisgICAgdm9pZCBz
ZXRQT1NJWExvY2FsZShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAg
ICAvLyBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY291bnRlciBpbiB0aGUgZWxlbWVudCBzcGVjaWZp
ZWQgYnkgaXRzIElELgorICAgIHZvaWQgY291bnRlclZhbHVlRm9yRWxlbWVudEJ5SWQoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gR2V0cyB0aGUgbnVtYmVy
IG9mIHBhZ2Ugd2hlcmUgdGhlIHNwZWNpZmllZCBlbGVtZW50IHdpbGwgYmUgcHV0LgorICAgIHZv
aWQgcGFnZU51bWJlckZvckVsZW1lbnRCeUlkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKworICAgIC8vIEdldHMgdGhlIG51bWJlciBvZiBwYWdlcyB0byBiZSBwcmludGVk
LgorICAgIHZvaWQgbnVtYmVyT2ZQYWdlcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJp
YW50Kik7CisKKworICAgIC8vIEFsbG93cyBsYXlvdXQgdGVzdHMgdG8gc3RhcnQgVGltZWxpbmUg
cHJvZmlsaW5nLgorICAgIHZvaWQgc2V0VGltZWxpbmVQcm9maWxpbmdFbmFibGVkKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEFsbG93cyBsYXlvdXQgdGVz
dHMgdG8gZXhlYyBzY3JpcHRzIGF0IFdlYkluc3BlY3RvciBzaWRlLgorICAgIHZvaWQgZXZhbHVh
dGVJbldlYkluc3BlY3Rvcihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisK
KyAgICAvLyBGb3JjZXMgdGhlIHNlbGVjdGlvbiBjb2xvcnMgZm9yIHRlc3RpbmcgdW5kZXIgTGlu
dXguCisgICAgdm9pZCBmb3JjZVJlZFNlbGVjdGlvbkNvbG9ycyhjb25zdCBDcHBBcmd1bWVudExp
c3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBBZGRzIGEgdXNlciBzY3JpcHQgdG8gYmUgaW5q
ZWN0ZWQgaW50byBuZXcgZG9jdW1lbnRzLgorICAgIHZvaWQgYWRkVXNlclNjcmlwdChjb25zdCBD
cHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKK3B1YmxpYzoKKyAgICAvLyBUaGUgZm9s
bG93aW5nIG1ldGhvZHMgYXJlIG5vdCBleHBvc2VkIHRvIEphdmFTY3JpcHQuCisgICAgdm9pZCBz
ZXRXb3JrUXVldWVGcm96ZW4oYm9vbCBmcm96ZW4pIHsgbV93b3JrUXVldWUuc2V0RnJvemVuKGZy
b3plbik7IH0KKworICAgIGJvb2wgc2hvdWxkRHVtcEFzVGV4dCgpIHsgcmV0dXJuIG1fZHVtcEFz
VGV4dDsgfQorICAgIGJvb2wgc2hvdWxkRHVtcEVkaXRpbmdDYWxsYmFja3MoKSB7IHJldHVybiBt
X2R1bXBFZGl0aW5nQ2FsbGJhY2tzOyB9CisgICAgYm9vbCBzaG91bGREdW1wRnJhbWVMb2FkQ2Fs
bGJhY2tzKCkgeyByZXR1cm4gbV9kdW1wRnJhbWVMb2FkQ2FsbGJhY2tzOyB9CisgICAgdm9pZCBz
ZXRTaG91bGREdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKGJvb2wgdmFsdWUpIHsgbV9kdW1wRnJhbWVM
b2FkQ2FsbGJhY2tzID0gdmFsdWU7IH0KKyAgICBib29sIHNob3VsZER1bXBSZXNvdXJjZUxvYWRD
YWxsYmFja3MoKSB7cmV0dXJuIG1fZHVtcFJlc291cmNlTG9hZENhbGxiYWNrczsgfQorICAgIGJv
b2wgc2hvdWxkRHVtcFN0YXR1c0NhbGxiYWNrcygpIHsgcmV0dXJuIG1fZHVtcFdpbmRvd1N0YXR1
c0NoYW5nZXM7IH0KKyAgICBib29sIHNob3VsZER1bXBTZWxlY3Rpb25SZWN0KCkgeyByZXR1cm4g
bV9kdW1wU2VsZWN0aW9uUmVjdDsgfQorICAgIGJvb2wgc2hvdWxkRHVtcEJhY2tGb3J3YXJkTGlz
dCgpIHsgcmV0dXJuIG1fZHVtcEJhY2tGb3J3YXJkTGlzdDsgfQorICAgIGJvb2wgc2hvdWxkRHVt
cFRpdGxlQ2hhbmdlcygpIHsgcmV0dXJuIG1fZHVtcFRpdGxlQ2hhbmdlczsgfQorICAgIGJvb2wg
c2hvdWxkRHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMoKSB7IHJldHVybiBtX2R1bXBDaGls
ZEZyYW1lU2Nyb2xsUG9zaXRpb25zOyB9CisgICAgYm9vbCBzaG91bGREdW1wQ2hpbGRGcmFtZXNB
c1RleHQoKSB7IHJldHVybiBtX2R1bXBDaGlsZEZyYW1lc0FzVGV4dDsgfQorICAgIGJvb2wgYWNj
ZXB0c0VkaXRpbmcoKSB7IHJldHVybiBtX2FjY2VwdHNFZGl0aW5nOyB9CisgICAgYm9vbCBjYW5P
cGVuV2luZG93cygpIHsgcmV0dXJuIG1fY2FuT3BlbldpbmRvd3M7IH0KKyAgICBib29sIHNob3Vs
ZEFkZEZpbGVUb1Bhc3RlYm9hcmQoKSB7IHJldHVybiBtX3Nob3VsZEFkZEZpbGVUb1Bhc3RlYm9h
cmQ7IH0KKyAgICBib29sIHN0b3BQcm92aXNpb25hbEZyYW1lTG9hZHMoKSB7IHJldHVybiBtX3N0
b3BQcm92aXNpb25hbEZyYW1lTG9hZHM7IH0KKworICAgIGJvb2wgdGVzdFJlcGFpbnQoKSBjb25z
dCB7IHJldHVybiBtX3Rlc3RSZXBhaW50OyB9CisgICAgYm9vbCBzd2VlcEhvcml6b250YWxseSgp
IGNvbnN0IHsgcmV0dXJuIG1fc3dlZXBIb3Jpem9udGFsbHk7IH0KKworICAgIC8vIENhbGxlZCBi
eSB0aGUgd2VidmlldyBkZWxlZ2F0ZSB3aGVuIHRoZSB0b3BsZXZlbCBmcmFtZSBsb2FkIGlzIGRv
bmUuCisgICAgdm9pZCBsb2NhdGlvbkNoYW5nZURvbmUoKTsKKworICAgIC8vIENhbGxlZCBieSB0
aGUgd2VidmlldyBkZWxlZ2F0ZSB3aGVuIHRoZSBwb2xpY3kgZGVsZWdhdGUgcnVucyBpZiB0aGUK
KyAgICAvLyB3YWl0Rm9yUG9saWN5RGVsZWdhdGUgd2FzIGNhbGxlZC4KKyAgICB2b2lkIHBvbGlj
eURlbGVnYXRlRG9uZSgpOworCisgICAgLy8gUmVpbml0aWFsaXplcyBhbGwgc3RhdGljIHZhbHVl
cy4gIFRoZSByZXNldCgpIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkCisgICAgLy8gYmVmb3JlIHRo
ZSBzdGFydCBvZiBlYWNoIHRlc3QgKGN1cnJlbnRseSBmcm9tCisgICAgLy8gVGVzdFNoZWxsOjpy
dW5GaWxlVGVzdCkuCisgICAgdm9pZCByZXNldCgpOworCisgICAgLy8gQSBzaW5nbGUgaXRlbSBp
biB0aGUgd29yayBxdWV1ZS4KKyAgICBjbGFzcyBXb3JrSXRlbSB7CisgICAgcHVibGljOgorICAg
ICAgICB2aXJ0dWFsIH5Xb3JrSXRlbSgpIHt9CisKKyAgICAgICAgLy8gUmV0dXJucyB0cnVlIGlm
IHRoaXMgc3RhcnRlZCBhIGxvYWQuCisgICAgICAgIHZpcnR1YWwgYm9vbCBydW4oVGVzdFNoZWxs
KiBzaGVsbCkgPSAwOworICAgIH07CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFdvcmtJ
dGVtOworICAgIGZyaWVuZCBjbGFzcyBXb3JrUXVldWU7CisKKyAgICAvLyBIZWxwZXIgY2xhc3Mg
Zm9yIG1hbmFnaW5nIGV2ZW50cyBxdWV1ZWQgYnkgbWV0aG9kcyBsaWtlIHF1ZXVlTG9hZCBvcgor
ICAgIC8vIHF1ZXVlU2NyaXB0LgorICAgIGNsYXNzIFdvcmtRdWV1ZSB7CisgICAgcHVibGljOgor
ICAgICAgICBXb3JrUXVldWUoTGF5b3V0VGVzdENvbnRyb2xsZXIqIGNvbnRyb2xsZXIpIDogbV9j
b250cm9sbGVyKGNvbnRyb2xsZXIpIHt9CisgICAgICAgIHZpcnR1YWwgfldvcmtRdWV1ZSgpOwor
ICAgICAgICB2b2lkIHByb2Nlc3NXb3JrU29vbigpOworCisgICAgICAgIC8vIFJlc2V0IHRoZSBz
dGF0ZSBvZiB0aGUgY2xhc3MgYmV0d2VlbiB0ZXN0cy4KKyAgICAgICAgdm9pZCByZXNldCgpOwor
CisgICAgICAgIHZvaWQgYWRkV29yayhXb3JrSXRlbSogd29yayk7CisKKyAgICAgICAgdm9pZCBz
ZXRGcm96ZW4oYm9vbCBmcm96ZW4pIHsgbV9mcm96ZW4gPSBmcm96ZW47IH0KKyAgICAgICAgYm9v
bCBpc0VtcHR5KCkgeyByZXR1cm4gbV9xdWV1ZS5pc0VtcHR5KCk7IH0KKworICAgIHByaXZhdGU6
CisgICAgICAgIHZvaWQgcHJvY2Vzc1dvcmsoKTsKKworICAgICAgICBiYXNlOjpPbmVTaG90VGlt
ZXI8V29ya1F1ZXVlPiBtX3RpbWVyOworICAgICAgICBEZXF1ZTxXb3JrSXRlbSo+IG1fcXVldWU7
CisgICAgICAgIGJvb2wgbV9mcm96ZW47CisgICAgICAgIExheW91dFRlc3RDb250cm9sbGVyKiBt
X2NvbnRyb2xsZXI7CisgICAgfTsKKworICAgIC8vIFN1cHBvcnQgZm9yIG92ZXJyaWRlUHJlZmVy
ZW5jZS4KKyAgICBib29sIGNwcFZhcmlhbnRUb0Jvb2woY29uc3QgQ3BwVmFyaWFudCYpOworICAg
IGludDMyX3QgY3BwVmFyaWFudFRvSW50MzIoY29uc3QgQ3BwVmFyaWFudCYpOworICAgIFdlYktp
dDo6V2ViU3RyaW5nIGNwcFZhcmlhbnRUb1dlYlN0cmluZyhjb25zdCBDcHBWYXJpYW50Jik7CisK
KyAgICB2b2lkIGxvZ0Vycm9yVG9Db25zb2xlKGNvbnN0IHN0ZDo6c3RyaW5nJik7CisgICAgdm9p
ZCBjb21wbGV0ZU5vdGlmeURvbmUoYm9vbCBpc1RpbWVvdXQpOworCisgICAgYm9vbCBwYXVzZUFu
aW1hdGlvbkF0VGltZU9uRWxlbWVudFdpdGhJZChjb25zdCBXZWJLaXQ6OldlYlN0cmluZyYgYW5p
bWF0aW9uTmFtZSwgZG91YmxlIHRpbWUsIGNvbnN0IFdlYktpdDo6V2ViU3RyaW5nJiBlbGVtZW50
SWQpOworICAgIGJvb2wgcGF1c2VUcmFuc2l0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKGNvbnN0
IFdlYktpdDo6V2ViU3RyaW5nJiBwcm9wZXJ0eU5hbWUsIGRvdWJsZSB0aW1lLCBjb25zdCBXZWJL
aXQ6OldlYlN0cmluZyYgZWxlbWVudElkKTsKKyAgICBib29sIGVsZW1lbnREb2VzQXV0b0NvbXBs
ZXRlRm9yRWxlbWVudFdpdGhJZChjb25zdCBXZWJLaXQ6OldlYlN0cmluZyYpOworICAgIGludCBu
dW1iZXJPZkFjdGl2ZUFuaW1hdGlvbnMoKTsKKworICAgIC8vIFVzZWQgZm9yIHRlc3QgdGltZW91
dHMuCisgICAgU2NvcGVkUnVubmFibGVNZXRob2RGYWN0b3J5PExheW91dFRlc3RDb250cm9sbGVy
PiBtX3RpbWVvdXRGYWN0b3J5OworCisgICAgLy8gTm9uLW93bmluZyBwb2ludGVyLiAgVGhlIExh
eW91dFRlc3RDb250cm9sbGVyIGlzIG93bmVkIGJ5IHRoZSBob3N0LgorICAgIFRlc3RTaGVsbCog
bV9zaGVsbDsKKworICAgIC8vIElmIHRydWUsIHRoZSB0ZXN0X3NoZWxsIHdpbGwgcHJvZHVjZSBh
IHBsYWluIHRleHQgZHVtcCByYXRoZXIgdGhhbiBhCisgICAgLy8gdGV4dCByZXByZXNlbnRhdGlv
biBvZiB0aGUgcmVuZGVyZXIuCisgICAgYm9vbCBtX2R1bXBBc1RleHQ7CisKKyAgICAvLyBJZiB0
cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxsIHdyaXRlIGEgZGVzY3JpcHRpdmUgbGluZSBmb3IgZWFj
aCBlZGl0aW5nCisgICAgLy8gY29tbWFuZC4KKyAgICBib29sIG1fZHVtcEVkaXRpbmdDYWxsYmFj
a3M7CisKKyAgICAvLyBJZiB0cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxsIGRyYXcgdGhlIGJvdW5k
cyBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gcmVjdAorICAgIC8vIHRha2luZyBwb3NzaWJsZSB0
cmFuc2Zvcm1zIG9mIHRoZSBzZWxlY3Rpb24gcmVjdCBpbnRvIGFjY291bnQuCisgICAgYm9vbCBt
X2R1bXBTZWxlY3Rpb25SZWN0OworCisgICAgLy8gSWYgdHJ1ZSwgdGhlIHRlc3Rfc2hlbGwgd2ls
bCBvdXRwdXQgYSBkZXNjcmlwdGl2ZSBsaW5lIGZvciBlYWNoIGZyYW1lCisgICAgLy8gbG9hZCBj
YWxsYmFjay4KKyAgICBib29sIG1fZHVtcEZyYW1lTG9hZENhbGxiYWNrczsKKworICAgIC8vIElm
IHRydWUsIHRoZSB0ZXN0X3NoZWxsIHdpbGwgb3V0cHV0IGEgZGVzY3JpcHRpdmUgbGluZSBmb3Ig
ZWFjaCByZXNvdXJjZQorICAgIC8vIGxvYWQgY2FsbGJhY2suCisgICAgYm9vbCBtX2R1bXBSZXNv
dXJjZUxvYWRDYWxsYmFja3M7CisKKyAgICAvLyBJZiB0cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxs
IHByb2R1Y2UgYSBkdW1wIG9mIHRoZSBiYWNrIGZvcndhcmQgbGlzdCBhcworICAgIC8vIHdlbGwu
CisgICAgYm9vbCBtX2R1bXBCYWNrRm9yd2FyZExpc3Q7CisKKyAgICAvLyBJZiB0cnVlLCB0aGUg
dGVzdF9zaGVsbCB3aWxsIHByaW50IG91dCB0aGUgY2hpbGQgZnJhbWUgc2Nyb2xsIG9mZnNldHMg
YXMKKyAgICAvLyB3ZWxsLgorICAgIGJvb2wgbV9kdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9u
czsKKworICAgIC8vIElmIHRydWUgYW5kIGlmIGR1bXBfYXNfdGV4dF8gaXMgdHJ1ZSwgdGhlIHRl
c3Rfc2hlbGwgd2lsbCByZWN1cnNpdmVseQorICAgIC8vIGR1bXAgYWxsIGZyYW1lcyBhcyBwbGFp
biB0ZXh0LgorICAgIGJvb2wgbV9kdW1wQ2hpbGRGcmFtZXNBc1RleHQ7CisKKyAgICAvLyBJZiB0
cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxsIGR1bXAgYWxsIGNoYW5nZXMgdG8gd2luZG93LnN0YXR1
cy4KKyAgICBib29sIG1fZHVtcFdpbmRvd1N0YXR1c0NoYW5nZXM7CisKKyAgICAvLyBJZiB0cnVl
LCBvdXRwdXQgYSBtZXNzYWdlIHdoZW4gdGhlIHBhZ2UgdGl0bGUgaXMgY2hhbmdlZC4KKyAgICBi
b29sIG1fZHVtcFRpdGxlQ2hhbmdlczsKKworICAgIC8vIElmIHRydWUsIHRoZSBlbGVtZW50IHdp
bGwgYmUgdHJlYXRlZCBhcyBlZGl0YWJsZS4gIFRoaXMgdmFsdWUgaXMgcmV0dXJuZWQKKyAgICAv
LyBmcm9tIHZhcmlvdXMgZWRpdGluZyBjYWxsYmFja3MgdGhhdCBhcmUgY2FsbGVkIGp1c3QgYmVm
b3JlIGVkaXQgb3BlcmF0aW9ucworICAgIC8vIGFyZSBhbGxvd2VkLgorICAgIGJvb2wgbV9hY2Nl
cHRzRWRpdGluZzsKKworICAgIC8vIElmIHRydWUsIG5ldyB3aW5kb3dzIGNhbiBiZSBvcGVuZWQg
dmlhIGphdmFzY3JpcHQgb3IgYnkgcGx1Z2lucy4gIEJ5CisgICAgLy8gZGVmYXVsdCwgc2V0IHRv
IGZhbHNlIGFuZCBjYW4gYmUgdG9nZ2xlZCB0byB0cnVlIHVzaW5nCisgICAgLy8gc2V0Q2FuT3Bl
bldpbmRvd3MoKS4KKyAgICBib29sIG1fY2FuT3BlbldpbmRvd3M7CisKKyAgICAvLyBXaGVuIHJl
c2V0IGlzIGNhbGxlZCwgZ28gdGhyb3VnaCBhbmQgY2xvc2UgYWxsIGJ1dCB0aGUgbWFpbiB0ZXN0
IHNoZWxsCisgICAgLy8gd2luZG93LiAgQnkgZGVmYXVsdCwgc2V0IHRvIHRydWUgYnV0IHRvZ2ds
ZWQgdG8gZmFsc2UgdXNpbmcKKyAgICAvLyBzZXRDbG9zZVJlbWFpbmluZ1dpbmRvd3NXaGVuQ29t
cGxldGUoKS4KKyAgICBib29sIG1fY2xvc2VSZW1haW5pbmdXaW5kb3dzOworCisgICAgLy8gSWYg
dHJ1ZSwgcGl4ZWwgZHVtcCB3aWxsIGJlIHByb2R1Y2VkIGFzIGEgc2VyaWVzIG9mIDFweC10YWxs
LCB2aWV3LXdpZGUKKyAgICAvLyBpbmRpdmlkdWFsIHBhaW50cyBvdmVyIHRoZSBoZWlnaHQgb2Yg
dGhlIHZpZXcuCisgICAgYm9vbCBtX3Rlc3RSZXBhaW50OworICAgIC8vIElmIHRydWUgYW5kIHRl
c3RfcmVwYWludF8gaXMgdHJ1ZSBhcyB3ZWxsLCBwaXhlbCBkdW1wIHdpbGwgYmUgcHJvZHVjZWQg
YXMKKyAgICAvLyBhIHNlcmllcyBvZiAxcHgtd2lkZSwgdmlldy10YWxsIHBhaW50cyBhY3Jvc3Mg
dGhlIHdpZHRoIG9mIHRoZSB2aWV3LgorICAgIGJvb2wgbV9zd2VlcEhvcml6b250YWxseTsKKwor
ICAgIC8vIElmIHRydWUgYW5kIGEgZHJhZyBzdGFydHMsIGFkZHMgYSBmaWxlIHRvIHRoZSBkcmFn
JmRyb3AgY2xpcGJvYXJkLgorICAgIGJvb2wgbV9zaG91bGRBZGRGaWxlVG9QYXN0ZWJvYXJkOwor
CisgICAgLy8gSWYgdHJ1ZSwgc3RvcHMgcHJvdmlzaW9uYWwgZnJhbWUgbG9hZHMgZHVyaW5nIHRo
ZQorICAgIC8vIERpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUgY2FsbGJhY2suCisgICAg
Ym9vbCBtX3N0b3BQcm92aXNpb25hbEZyYW1lTG9hZHM7CisKKyAgICAvLyBJZiB0cnVlLCBkb24n
dCBkdW1wIG91dHB1dCB1bnRpbCBub3RpZnlEb25lIGlzIGNhbGxlZC4KKyAgICBib29sIG1fd2Fp
dFVudGlsRG9uZTsKKworICAgIC8vIFRvIHByZXZlbnQgaW5maW5pdGUgbG9vcHMsIG9ubHkgdGhl
IGZpcnN0IHBhZ2Ugb2YgYSB0ZXN0IGNhbiBhZGQgdG8gYQorICAgIC8vIHdvcmsgcXVldWUgKHNp
bmNlIHdlIG1heSB3ZWxsIGNvbWUgYmFjayB0byB0aGF0IHNhbWUgcGFnZSkuCisgICAgYm9vbCBt
X3dvcmtRdWV1ZUZyb3plbjsKKworICAgIFdvcmtRdWV1ZSBtX3dvcmtRdWV1ZTsKKworICAgIENw
cFZhcmlhbnQgbV9nbG9iYWxGbGFnOworCisgICAgLy8gQm91bmQgdmFyaWFibGUgY291bnRpbmcg
dGhlIG51bWJlciBvZiB0b3AgVVJMcyB2aXNpdGVkLgorICAgIENwcFZhcmlhbnQgbV93ZWJIaXN0
b3J5SXRlbUNvdW50OworCisgICAgV2ViS2l0OjpXZWJVUkwgbV91c2VyU3R5bGVTaGVldExvY2F0
aW9uOworfTsKKworI2VuZGlmIC8vIExheW91dFRlc3RDb250cm9sbGVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>51600</attachid>
            <date>2010-03-24 23:51:59 -0700</date>
            <delta_ts>2010-03-25 14:18:44 -0700</delta_ts>
            <desc>Proposed patch (rev.3)</desc>
            <filename>bug-36520-20100325155157.patch</filename>
            <type>text/plain</type>
            <size>67682</size>
            <attacher name="Kent Tamura">tkent</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYktpdFRvb2xzL0NoYW5nZUxvZyBiL1dlYktpdFRvb2xzL0NoYW5nZUxv
ZwppbmRleCA3YjAyYTliLi44NzJkMmYzIDEwMDY0NAotLS0gYS9XZWJLaXRUb29scy9DaGFuZ2VM
b2cKKysrIGIvV2ViS2l0VG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTAtMDMt
MjQgIEtlbnQgVGFtdXJhICA8dGtlbnRAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtEUlQvQ2hyb21pdW1dIEFkZCBUZXN0TmF2
aWdhdGlvbkNvbnRyb2xsZXIgYW5kIFRlc3RXZWJXb3JrZXIKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTM2NTIwCisKKyAgICAgICAgQWRkIExheW91dFRl
c3RDb250cm9sbGVyIGNsYXNzLCB3aGljaCBpcyBnb2luZyB0byBiZSB1c2VkIGJ5CisgICAgICAg
IER1bXBSZW5kZXJUcmVlIENocm9taXVtIHBvcnQuIFRoZXNlIGZpbGVzIGFyZSBiYXNlZCBvbjoK
KyAgICAgICAgLSBzcmMvd2Via2l0L3Rvb2xzL3Rlc3Rfc2hlbGwvbGF5b3V0X3Rlc3RfY29udHJv
bGxlci5jYworICAgICAgICAtIHNyYy93ZWJraXQvdG9vbHMvdGVzdF9zaGVsbC9sYXlvdXRfdGVz
dF9jb250cm9sbGVyLmgKKyAgICAgICAgb2YgQ2hyb21pdW0gcmV2LjQwNDkyLgorCisgICAgICAg
ICogRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRyb2xsZXIuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9MYXlvdXRUZXN0Q29udHJvbGxl
ci5oOiBBZGRlZC4KKwogMjAxMC0wMy0yMyAgS2VudCBUYW11cmEgIDx0a2VudEBjaHJvbWl1bS5v
cmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGltaXRyaSBHbGF6a292LgpkaWZmIC0tZ2l0IGEv
V2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRyb2xsZXIu
Y3BwIGIvV2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRy
b2xsZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZDdmMDQKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJLaXRUb29scy9EdW1wUmVuZGVyVHJlZS9jaHJvbWl1bS9MYXlv
dXRUZXN0Q29udHJvbGxlci5jcHAKQEAgLTAsMCArMSwxMTczIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDEwIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTAgUGF3ZWwgSGFqZGFuIChwaGFqZGFuLmpyQGNocm9taXVtLm9yZykKKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRyb2xsZXIuaCIKKworI2luY2x1ZGUgIlRl
c3RTaGVsbC5oIgorI2luY2x1ZGUgIldlYlZpZXdIb3N0LmgiCisjaW5jbHVkZSAiYmFzZS9zdHJp
bmdfdXRpbC5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJBbmltYXRpb25Db250cm9sbGVyLmgiCisj
aW5jbHVkZSAicHVibGljL1dlYkNvbnNvbGVNZXNzYWdlLmgiCisjaW5jbHVkZSAicHVibGljL1dl
YkRvY3VtZW50LmgiCisjaW5jbHVkZSAicHVibGljL1dlYkZyYW1lLmgiCisjaW5jbHVkZSAicHVi
bGljL1dlYklucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJLaXQuaCIKKyNpbmNs
dWRlICJwdWJsaWMvV2ViU2NyaXB0U291cmNlLmgiCisjaW5jbHVkZSAicHVibGljL1dlYlNlY3Vy
aXR5UG9saWN5LmgiCisjaW5jbHVkZSAicHVibGljL1dlYlNldHRpbmdzLmgiCisjaW5jbHVkZSAi
cHVibGljL1dlYlNpemUuaCIKKyNpbmNsdWRlICJwdWJsaWMvV2ViVVJMLmgiCisjaW5jbHVkZSAi
cHVibGljL1dlYlZpZXcuaCIKKyNpbmNsdWRlICJ3ZWJraXQvc3VwcG9ydC93ZWJraXRfc3VwcG9y
dC5oIgorCit1c2luZyBuYW1lc3BhY2UgV2ViS2l0OwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKwor
TGF5b3V0VGVzdENvbnRyb2xsZXI6OkxheW91dFRlc3RDb250cm9sbGVyKFRlc3RTaGVsbCogc2hl
bGwpCisgICAgOiBtX3RpbWVvdXRGYWN0b3J5KHRoaXMpCisgICAgLCBtX3NoZWxsKHNoZWxsKQor
ICAgICwgbV93b3JrUXVldWUodGhpcykKK3sKKworICAgIC8vIEluaXRpYWxpemUgdGhlIG1hcCB0
aGF0IGFzc29jaWF0ZXMgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHdpdGggdGhlIG5hbWVzCisgICAg
Ly8gdGhleSB3aWxsIHVzZSB3aGVuIGNhbGxlZCBieSBKYXZhU2NyaXB0LiAgVGhlIGFjdHVhbCBi
aW5kaW5nIG9mIHRob3NlCisgICAgLy8gbmFtZXMgdG8gdGhlaXIgbWV0aG9kcyB3aWxsIGJlIGRv
bmUgYnkgY2FsbGluZyBiaW5kVG9KYXZhU2NyaXB0KCkgKGRlZmluZWQKKyAgICAvLyBieSBDcHBC
b3VuZENsYXNzLCB0aGUgcGFyZW50IHRvIExheW91dFRlc3RDb250cm9sbGVyKS4KKyAgICBiaW5k
TWV0aG9kKCJkdW1wQXNUZXh0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpkdW1wQXNUZXh0KTsK
KyAgICBiaW5kTWV0aG9kKCJkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucyIsICZMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6ZHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnMpOworICAgIGJpbmRN
ZXRob2QoImR1bXBDaGlsZEZyYW1lc0FzVGV4dCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVt
cENoaWxkRnJhbWVzQXNUZXh0KTsKKyAgICBiaW5kTWV0aG9kKCJkdW1wRGF0YWJhc2VDYWxsYmFj
a3MiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBEYXRhYmFzZUNhbGxiYWNrcyk7CisgICAg
YmluZE1ldGhvZCgiZHVtcEVkaXRpbmdDYWxsYmFja3MiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6
OmR1bXBFZGl0aW5nQ2FsbGJhY2tzKTsKKyAgICBiaW5kTWV0aG9kKCJkdW1wQmFja0ZvcndhcmRM
aXN0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpkdW1wQmFja0ZvcndhcmRMaXN0KTsKKyAgICBi
aW5kTWV0aG9kKCJkdW1wRnJhbWVMb2FkQ2FsbGJhY2tzIiwgJkxheW91dFRlc3RDb250cm9sbGVy
OjpkdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKTsKKyAgICBiaW5kTWV0aG9kKCJkdW1wUmVzb3VyY2VM
b2FkQ2FsbGJhY2tzIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpkdW1wUmVzb3VyY2VMb2FkQ2Fs
bGJhY2tzKTsKKyAgICBiaW5kTWV0aG9kKCJkdW1wU3RhdHVzQ2FsbGJhY2tzIiwgJkxheW91dFRl
c3RDb250cm9sbGVyOjpkdW1wV2luZG93U3RhdHVzQ2hhbmdlcyk7CisgICAgYmluZE1ldGhvZCgi
ZHVtcFRpdGxlQ2hhbmdlcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcFRpdGxlQ2hhbmdl
cyk7CisgICAgYmluZE1ldGhvZCgic2V0QWNjZXB0c0VkaXRpbmciLCAmTGF5b3V0VGVzdENvbnRy
b2xsZXI6OnNldEFjY2VwdHNFZGl0aW5nKTsKKyAgICBiaW5kTWV0aG9kKCJ3YWl0VW50aWxEb25l
IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjp3YWl0VW50aWxEb25lKTsKKyAgICBiaW5kTWV0aG9k
KCJub3RpZnlEb25lIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpub3RpZnlEb25lKTsKKyAgICBi
aW5kTWV0aG9kKCJxdWV1ZVJlbG9hZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6cXVldWVSZWxv
YWQpOworICAgIGJpbmRNZXRob2QoInF1ZXVlTG9hZGluZ1NjcmlwdCIsICZMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6cXVldWVMb2FkaW5nU2NyaXB0KTsKKyAgICBiaW5kTWV0aG9kKCJxdWV1ZU5vbkxv
YWRpbmdTY3JpcHQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlTm9uTG9hZGluZ1Njcmlw
dCk7CisgICAgYmluZE1ldGhvZCgicXVldWVMb2FkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpx
dWV1ZUxvYWQpOworICAgIGJpbmRNZXRob2QoInF1ZXVlQmFja05hdmlnYXRpb24iLCAmTGF5b3V0
VGVzdENvbnRyb2xsZXI6OnF1ZXVlQmFja05hdmlnYXRpb24pOworICAgIGJpbmRNZXRob2QoInF1
ZXVlRm9yd2FyZE5hdmlnYXRpb24iLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlRm9yd2Fy
ZE5hdmlnYXRpb24pOworICAgIGJpbmRNZXRob2QoIndpbmRvd0NvdW50IiwgJkxheW91dFRlc3RD
b250cm9sbGVyOjp3aW5kb3dDb3VudCk7CisgICAgYmluZE1ldGhvZCgic2V0Q2FuT3BlbldpbmRv
d3MiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldENhbk9wZW5XaW5kb3dzKTsKKyAgICBiaW5k
TWV0aG9kKCJzZXRDbG9zZVJlbWFpbmluZ1dpbmRvd3NXaGVuQ29tcGxldGUiLCAmTGF5b3V0VGVz
dENvbnRyb2xsZXI6OnNldENsb3NlUmVtYWluaW5nV2luZG93c1doZW5Db21wbGV0ZSk7CisgICAg
YmluZE1ldGhvZCgib2JqQ0lkZW50aXR5SXNFcXVhbCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6
b2JqQ0lkZW50aXR5SXNFcXVhbCk7CisgICAgYmluZE1ldGhvZCgic2V0QWx3YXlzQWNjZXB0Q29v
a2llcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWx3YXlzQWNjZXB0Q29va2llcyk7Cisg
ICAgYmluZE1ldGhvZCgic2V0V2luZG93SXNLZXkiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNl
dFdpbmRvd0lzS2V5KTsKKyAgICBiaW5kTWV0aG9kKCJzZXRUYWJLZXlDeWNsZXNUaHJvdWdoRWxl
bWVudHMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFRhYktleUN5Y2xlc1Rocm91Z2hFbGVt
ZW50cyk7CisgICAgYmluZE1ldGhvZCgic2V0VXNlclN0eWxlU2hlZXRMb2NhdGlvbiIsICZMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c2V0VXNlclN0eWxlU2hlZXRMb2NhdGlvbik7CisgICAgYmluZE1l
dGhvZCgic2V0VXNlclN0eWxlU2hlZXRFbmFibGVkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpz
ZXRVc2VyU3R5bGVTaGVldEVuYWJsZWQpOworICAgIGJpbmRNZXRob2QoInBhdGhUb0xvY2FsUmVz
b3VyY2UiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdGhUb0xvY2FsUmVzb3VyY2UpOworICAg
IGJpbmRNZXRob2QoImFkZEZpbGVUb1Bhc3RlYm9hcmRPbkRyYWciLCAmTGF5b3V0VGVzdENvbnRy
b2xsZXI6OmFkZEZpbGVUb1Bhc3RlYm9hcmRPbkRyYWcpOworICAgIGJpbmRNZXRob2QoImV4ZWND
b21tYW5kIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpleGVjQ29tbWFuZCk7CisgICAgYmluZE1l
dGhvZCgiaXNDb21tYW5kRW5hYmxlZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6aXNDb21tYW5k
RW5hYmxlZCk7CisgICAgYmluZE1ldGhvZCgic2V0UG9wdXBCbG9ja2luZ0VuYWJsZWQiLCAmTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnNldFBvcHVwQmxvY2tpbmdFbmFibGVkKTsKKyAgICBiaW5kTWV0
aG9kKCJzZXRTdG9wUHJvdmlzaW9uYWxGcmFtZUxvYWRzIiwgJkxheW91dFRlc3RDb250cm9sbGVy
OjpzZXRTdG9wUHJvdmlzaW9uYWxGcmFtZUxvYWRzKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRTbWFy
dEluc2VydERlbGV0ZUVuYWJsZWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFNtYXJ0SW5z
ZXJ0RGVsZXRlRW5hYmxlZCk7CisgICAgYmluZE1ldGhvZCgic2V0U2VsZWN0VHJhaWxpbmdXaGl0
ZXNwYWNlRW5hYmxlZCIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0U2VsZWN0VHJhaWxpbmdX
aGl0ZXNwYWNlRW5hYmxlZCk7CisgICAgYmluZE1ldGhvZCgicGF1c2VBbmltYXRpb25BdFRpbWVP
bkVsZW1lbnRXaXRoSWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNlQW5pbWF0aW9uQXRU
aW1lT25FbGVtZW50V2l0aElkKTsKKyAgICBiaW5kTWV0aG9kKCJwYXVzZVRyYW5zaXRpb25BdFRp
bWVPbkVsZW1lbnRXaXRoSWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNlVHJhbnNpdGlv
bkF0VGltZU9uRWxlbWVudFdpdGhJZCk7CisgICAgYmluZE1ldGhvZCgiZWxlbWVudERvZXNBdXRv
Q29tcGxldGVGb3JFbGVtZW50V2l0aElkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjplbGVtZW50
RG9lc0F1dG9Db21wbGV0ZUZvckVsZW1lbnRXaXRoSWQpOworICAgIGJpbmRNZXRob2QoIm51bWJl
ck9mQWN0aXZlQW5pbWF0aW9ucyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6bnVtYmVyT2ZBY3Rp
dmVBbmltYXRpb25zKTsKKyAgICBiaW5kTWV0aG9kKCJkaXNhYmxlSW1hZ2VMb2FkaW5nIiwgJkxh
eW91dFRlc3RDb250cm9sbGVyOjpkaXNhYmxlSW1hZ2VMb2FkaW5nKTsKKyAgICBiaW5kTWV0aG9k
KCJzZXRJY29uRGF0YWJhc2VFbmFibGVkIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRJY29u
RGF0YWJhc2VFbmFibGVkKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRDdXN0b21Qb2xpY3lEZWxlZ2F0
ZSIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0Q3VzdG9tUG9saWN5RGVsZWdhdGUpOworICAg
IGJpbmRNZXRob2QoIndhaXRGb3JQb2xpY3lEZWxlZ2F0ZSIsICZMYXlvdXRUZXN0Q29udHJvbGxl
cjo6d2FpdEZvclBvbGljeURlbGVnYXRlKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRXaWxsU2VuZFJl
cXVlc3RSZXR1cm5zTnVsbE9uUmVkaXJlY3QiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFdp
bGxTZW5kUmVxdWVzdFJldHVybnNOdWxsT25SZWRpcmVjdCk7CisgICAgYmluZE1ldGhvZCgic2V0
V2lsbFNlbmRSZXF1ZXN0UmV0dXJuc051bGwiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFdp
bGxTZW5kUmVxdWVzdFJldHVybnNOdWxsKTsKKyAgICBiaW5kTWV0aG9kKCJ3aGl0ZUxpc3RBY2Nl
c3NGcm9tT3JpZ2luIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjp3aGl0ZUxpc3RBY2Nlc3NGcm9t
T3JpZ2luKTsKKyAgICBiaW5kTWV0aG9kKCJjbGVhckFsbERhdGFiYXNlcyIsICZMYXlvdXRUZXN0
Q29udHJvbGxlcjo6Y2xlYXJBbGxEYXRhYmFzZXMpOworICAgIGJpbmRNZXRob2QoInNldERhdGFi
YXNlUXVvdGEiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldERhdGFiYXNlUXVvdGEpOworICAg
IGJpbmRNZXRob2QoInNldFBPU0lYTG9jYWxlIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRQ
T1NJWExvY2FsZSk7CisgICAgYmluZE1ldGhvZCgiY291bnRlclZhbHVlRm9yRWxlbWVudEJ5SWQi
LCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmNvdW50ZXJWYWx1ZUZvckVsZW1lbnRCeUlkKTsKKyAg
ICBiaW5kTWV0aG9kKCJhZGRVc2VyU2NyaXB0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjphZGRV
c2VyU2NyaXB0KTsKKyAgICBiaW5kTWV0aG9kKCJwYWdlTnVtYmVyRm9yRWxlbWVudEJ5SWQiLCAm
TGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhZ2VOdW1iZXJGb3JFbGVtZW50QnlJZCk7CisgICAgYmlu
ZE1ldGhvZCgibnVtYmVyT2ZQYWdlcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6bnVtYmVyT2ZQ
YWdlcyk7CisgICAgYmluZE1ldGhvZCgiZHVtcFNlbGVjdGlvblJlY3QiLCAmTGF5b3V0VGVzdENv
bnRyb2xsZXI6OmR1bXBTZWxlY3Rpb25SZWN0KTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJl
IHN0dWJzLgorICAgIGJpbmRNZXRob2QoImR1bXBBc1dlYkFyY2hpdmUiLCAmTGF5b3V0VGVzdENv
bnRyb2xsZXI6OmR1bXBBc1dlYkFyY2hpdmUpOworICAgIGJpbmRNZXRob2QoInNldE1haW5GcmFt
ZUlzRmlyc3RSZXNwb25kZXIiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldE1haW5GcmFtZUlz
Rmlyc3RSZXNwb25kZXIpOworICAgIGJpbmRNZXRob2QoImR1bXBTZWxlY3Rpb25SZWN0IiwgJkxh
eW91dFRlc3RDb250cm9sbGVyOjpkdW1wU2VsZWN0aW9uUmVjdCk7CisgICAgYmluZE1ldGhvZCgi
ZGlzcGxheSIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZGlzcGxheSk7CisgICAgYmluZE1ldGhv
ZCgidGVzdFJlcGFpbnQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnRlc3RSZXBhaW50KTsKKyAg
ICBiaW5kTWV0aG9kKCJyZXBhaW50U3dlZXBIb3Jpem9udGFsbHkiLCAmTGF5b3V0VGVzdENvbnRy
b2xsZXI6OnJlcGFpbnRTd2VlcEhvcml6b250YWxseSk7CisgICAgYmluZE1ldGhvZCgiY2xlYXJC
YWNrRm9yd2FyZExpc3QiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmNsZWFyQmFja0ZvcndhcmRM
aXN0KTsKKyAgICBiaW5kTWV0aG9kKCJrZWVwV2ViSGlzdG9yeSIsICZMYXlvdXRUZXN0Q29udHJv
bGxlcjo6a2VlcFdlYkhpc3RvcnkpOworICAgIGJpbmRNZXRob2QoInN0b3JlV2ViU2NyaXB0T2Jq
ZWN0IiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzdG9yZVdlYlNjcmlwdE9iamVjdCk7CisgICAg
YmluZE1ldGhvZCgiYWNjZXNzU3RvcmVkV2ViU2NyaXB0T2JqZWN0IiwgJkxheW91dFRlc3RDb250
cm9sbGVyOjphY2Nlc3NTdG9yZWRXZWJTY3JpcHRPYmplY3QpOworICAgIGJpbmRNZXRob2QoIm9i
akNDbGFzc05hbWVPZiIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6b2JqQ0NsYXNzTmFtZU9mKTsK
KyAgICBiaW5kTWV0aG9kKCJhZGREaXNhbGxvd2VkVVJMIiwgJkxheW91dFRlc3RDb250cm9sbGVy
OjphZGREaXNhbGxvd2VkVVJMKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRDYWxsQ2xvc2VPbldlYlZp
ZXdzIiwgJkxheW91dFRlc3RDb250cm9sbGVyOjpzZXRDYWxsQ2xvc2VPbldlYlZpZXdzKTsKKyAg
ICBiaW5kTWV0aG9kKCJzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkIiwgJkxheW91dFRlc3RDb250
cm9sbGVyOjpzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRV
c2VEYXNoYm9hcmRDb21wYXRpYmlsaXR5TW9kZSIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0
VXNlRGFzaGJvYXJkQ29tcGF0aWJpbGl0eU1vZGUpOworCisgICAgYmluZE1ldGhvZCgic2V0WFNT
QXVkaXRvckVuYWJsZWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFhTU0F1ZGl0b3JFbmFi
bGVkKTsKKyAgICBiaW5kTWV0aG9kKCJldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCIsICZM
YXlvdXRUZXN0Q29udHJvbGxlcjo6ZXZhbHVhdGVTY3JpcHRJbklzb2xhdGVkV29ybGQpOworICAg
IGJpbmRNZXRob2QoIm92ZXJyaWRlUHJlZmVyZW5jZSIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6
b3ZlcnJpZGVQcmVmZXJlbmNlKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRBbGxvd1VuaXZlcnNhbEFj
Y2Vzc0Zyb21GaWxlVVJMcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWxsb3dVbml2ZXJz
YWxBY2Nlc3NGcm9tRmlsZVVSTHMpOworICAgIGJpbmRNZXRob2QoInNldEFsbG93RmlsZUFjY2Vz
c0Zyb21GaWxlVVJMcyIsICZMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWxsb3dGaWxlQWNjZXNz
RnJvbUZpbGVVUkxzKTsKKyAgICBiaW5kTWV0aG9kKCJzZXRUaW1lbGluZVByb2ZpbGluZ0VuYWJs
ZWQiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFRpbWVsaW5lUHJvZmlsaW5nRW5hYmxlZCk7
CisgICAgYmluZE1ldGhvZCgiZXZhbHVhdGVJbldlYkluc3BlY3RvciIsICZMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6ZXZhbHVhdGVJbldlYkluc3BlY3Rvcik7CisgICAgYmluZE1ldGhvZCgiZm9yY2VS
ZWRTZWxlY3Rpb25Db2xvcnMiLCAmTGF5b3V0VGVzdENvbnRyb2xsZXI6OmZvcmNlUmVkU2VsZWN0
aW9uQ29sb3JzKTsKKworICAgIC8vIFRoZSBmYWxsYmFjayBtZXRob2QgaXMgY2FsbGVkIHdoZW4g
YW4gdW5rbm93biBtZXRob2QgaXMgaW52b2tlZC4KKyAgICBiaW5kRmFsbGJhY2tNZXRob2QoJkxh
eW91dFRlc3RDb250cm9sbGVyOjpmYWxsYmFja01ldGhvZCk7CisKKyAgICAvLyBTaGFyZWQgcHJv
cGVydGllcy4KKyAgICAvLyBnbG9iYWxGbGFnIGlzIHVzZWQgYnkgYSBudW1iZXIgb2YgbGF5b3V0
IHRlc3RzIGluCisgICAgLy8gTGF5b3V0VGVzdHNcaHR0cFx0ZXN0c1xzZWN1cml0eVxkYXRhVVJM
LgorICAgIGJpbmRQcm9wZXJ0eSgiZ2xvYmFsRmxhZyIsICZtX2dsb2JhbEZsYWcpOworICAgIC8v
IHdlYkhpc3RvcnlJdGVtQ291bnQgaXMgdXNlZCBieSB0ZXN0cyBpbiBMYXlvdXRUZXN0c1xodHRw
XHRlc3RzXGhpc3RvcnkKKyAgICBiaW5kUHJvcGVydHkoIndlYkhpc3RvcnlJdGVtQ291bnQiLCAm
bV93ZWJIaXN0b3J5SXRlbUNvdW50KTsKK30KKworTGF5b3V0VGVzdENvbnRyb2xsZXI6OldvcmtR
dWV1ZTo6fldvcmtRdWV1ZSgpCit7CisgICAgcmVzZXQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6V29ya1F1ZXVlOjpwcm9jZXNzV29ya1Nvb24oKQoreworICAgIGlmIChtX2Nv
bnRyb2xsZXItPm1fc2hlbGwtPndlYlZpZXdIb3N0KCktPnRvcExvYWRpbmdGcmFtZSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIC8v
IFdlIGRlbGF5IHByb2Nlc3NpbmcgcXVldWVkIHdvcmsgdG8gYXZvaWQgcmVjdXJzaW9uIHByb2Js
ZW1zLgorICAgICAgICBtX3RpbWVyLlN0YXJ0KGJhc2U6OlRpbWVEZWx0YSgpLCB0aGlzLCAmV29y
a1F1ZXVlOjpwcm9jZXNzV29yayk7CisgICAgfSBlbHNlIGlmICghbV9jb250cm9sbGVyLT5tX3dh
aXRVbnRpbERvbmUpIHsKKyAgICAgICAgbV9jb250cm9sbGVyLT5tX3NoZWxsLT50ZXN0RmluaXNo
ZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OldvcmtRdWV1ZTo6
cHJvY2Vzc1dvcmsoKQoreworICAgIFRlc3RTaGVsbCogc2hlbGwgPSBtX2NvbnRyb2xsZXItPm1f
c2hlbGw7CisgICAgLy8gUXVpdCBkb2luZyB3b3JrIG9uY2UgYSBsb2FkIGlzIGluIHByb2dyZXNz
LgorICAgIHdoaWxlICghbV9xdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYm9vbCBzdGFydGVk
TG9hZCA9IG1fcXVldWUuZmlyc3QoKS0+cnVuKHNoZWxsKTsKKyAgICAgICAgZGVsZXRlIG1fcXVl
dWUuZmlyc3QoKTsKKyAgICAgICAgbV9xdWV1ZS5yZW1vdmVGaXJzdCgpOworICAgICAgICBpZiAo
c3RhcnRlZExvYWQpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtX2Nv
bnRyb2xsZXItPm1fd2FpdFVudGlsRG9uZSAmJiAhc2hlbGwtPndlYlZpZXdIb3N0KCktPnRvcExv
YWRpbmdGcmFtZSgpKQorICAgICAgICBzaGVsbC0+dGVzdEZpbmlzaGVkKCk7Cit9CisKK3ZvaWQg
TGF5b3V0VGVzdENvbnRyb2xsZXI6OldvcmtRdWV1ZTo6cmVzZXQoKQoreworICAgIG1fZnJvemVu
ID0gZmFsc2U7CisgICAgd2hpbGUgKCFtX3F1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICBkZWxl
dGUgbV9xdWV1ZS5maXJzdCgpOworICAgICAgICBtX3F1ZXVlLnJlbW92ZUZpcnN0KCk7CisgICAg
fQorfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpXb3JrUXVldWU6OmFkZFdvcmsoV29y
a0l0ZW0qIHdvcmspCit7CisgICAgaWYgKG1fZnJvemVuKSB7CisgICAgICAgIGRlbGV0ZSB3b3Jr
OworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1fcXVldWUuYXBwZW5kKHdvcmspOworfQor
Cit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wQXNUZXh0KGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBtX2R1bXBBc1RleHQgPSB0cnVlOwor
ICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpk
dW1wRGF0YWJhc2VDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCog
cmVzdWx0KQoreworICAgIC8vIERvIG5vdGhpbmc7IHdlIGRvbid0IHVzZSB0aGlzIGZsYWcgYW55
d2hlcmUgZm9yIG5vdworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRl
c3RDb250cm9sbGVyOjpkdW1wRWRpdGluZ0NhbGxiYWNrcyhjb25zdCBDcHBBcmd1bWVudExpc3Qm
LCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgbV9kdW1wRWRpdGluZ0NhbGxiYWNrcyA9IHRy
dWU7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xs
ZXI6OmR1bXBCYWNrRm9yd2FyZExpc3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIG1fZHVtcEJhY2tGb3J3YXJkTGlzdCA9IHRydWU7CisgICAgcmVz
dWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBGcmFt
ZUxvYWRDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0
KQoreworICAgIG1fZHVtcEZyYW1lTG9hZENhbGxiYWNrcyA9IHRydWU7CisgICAgcmVzdWx0LT5z
ZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBSZXNvdXJjZUxv
YWRDYWxsYmFja3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQor
eworICAgIG1fZHVtcFJlc291cmNlTG9hZENhbGxiYWNrcyA9IHRydWU7CisgICAgcmVzdWx0LT5z
ZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBDaGlsZEZyYW1l
U2Nyb2xsUG9zaXRpb25zKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3Vs
dCkKK3sKKyAgICBtX2R1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zID0gdHJ1ZTsKKyAgICBy
ZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcENo
aWxkRnJhbWVzQXNUZXh0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3Vs
dCkKK3sKKyAgICBtX2R1bXBDaGlsZEZyYW1lc0FzVGV4dCA9IHRydWU7CisgICAgcmVzdWx0LT5z
ZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBXaW5kb3dTdGF0
dXNDaGFuZ2VzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sK
KyAgICBtX2R1bXBXaW5kb3dTdGF0dXNDaGFuZ2VzID0gdHJ1ZTsKKyAgICByZXN1bHQtPnNldE51
bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZHVtcFRpdGxlQ2hhbmdlcyhj
b25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgbV9kdW1w
VGl0bGVDaGFuZ2VzID0gdHJ1ZTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWNjZXB0c0VkaXRpbmcoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRz
LnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX2FjY2VwdHNF
ZGl0aW5nID0gYXJndW1lbnRzWzBdLnZhbHVlLmJvb2xWYWx1ZTsKKyAgICByZXN1bHQtPnNldE51
bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6d2FpdFVudGlsRG9uZShjb25z
dCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKCF3ZWJr
aXRfc3VwcG9ydDo6QmVpbmdEZWJ1Z2dlZCgpKSB7CisgICAgICAgIHdlYmtpdF9zdXBwb3J0OjpQ
b3N0RGVsYXllZFRhc2tGcm9tSGVyZSgKKyAgICAgICAgICAgIG1fdGltZW91dEZhY3RvcnkuTmV3
UnVubmFibGVNZXRob2QoJkxheW91dFRlc3RDb250cm9sbGVyOjpub3RpZnlEb25lVGltZWRPdXQp
LAorICAgICAgICAgICAgbV9zaGVsbC0+bGF5b3V0VGVzdFRpbWVvdXQoKSk7CisgICAgfQorICAg
IG1fd2FpdFVudGlsRG9uZSA9IHRydWU7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3Zv
aWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6Om5vdGlmeURvbmUoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIC8vIFRlc3QgZGlkbid0IHRpbWVvdXQuIEtp
bGwgdGhlIHRpbWVvdXQgdGltZXIuCisgICAgbV90aW1lb3V0RmFjdG9yeS5SZXZva2VBbGwoKTsK
KworICAgIGNvbXBsZXRlTm90aWZ5RG9uZShmYWxzZSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7
Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6Om5vdGlmeURvbmVUaW1lZE91dCgpCit7
CisgICAgY29tcGxldGVOb3RpZnlEb25lKHRydWUpOworfQorCit2b2lkIExheW91dFRlc3RDb250
cm9sbGVyOjpjb21wbGV0ZU5vdGlmeURvbmUoYm9vbCBpc1RpbWVvdXQpCit7CisgICAgaWYgKG1f
d2FpdFVudGlsRG9uZSAmJiAhbV9zaGVsbC0+d2ViVmlld0hvc3QoKS0+dG9wTG9hZGluZ0ZyYW1l
KCkgJiYgbV93b3JrUXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgIGlmIChpc1RpbWVvdXQpCisg
ICAgICAgICAgICBtX3NoZWxsLT50ZXN0VGltZWRPdXQoKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgbV9zaGVsbC0+dGVzdEZpbmlzaGVkKCk7CisgICAgfQorICAgIG1fd2FpdFVudGlsRG9u
ZSA9IGZhbHNlOworfQorCitjbGFzcyBXb3JrSXRlbUJhY2tGb3J3YXJkIDogcHVibGljIExheW91
dFRlc3RDb250cm9sbGVyOjpXb3JrSXRlbSB7CitwdWJsaWM6CisgICAgV29ya0l0ZW1CYWNrRm9y
d2FyZChpbnQgZGlzdGFuY2UpIDogbV9kaXN0YW5jZShkaXN0YW5jZSkge30KKyAgICBib29sIHJ1
bihUZXN0U2hlbGwqIHNoZWxsKQorICAgIHsKKyAgICAgICAgc2hlbGwtPmdvVG9PZmZzZXQobV9k
aXN0YW5jZSk7CisgICAgICAgIHJldHVybiB0cnVlOyAvLyBGSVhNRTogRGlkIGl0IHJlYWxseSBz
dGFydCBhIG5hdmlnYXRpb24/CisgICAgfQorcHJpdmF0ZToKKyAgICBpbnQgbV9kaXN0YW5jZTsK
K307CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnF1ZXVlQmFja05hdmlnYXRpb24oY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzTnVtYmVyKCkpCisg
ICAgICAgIG1fd29ya1F1ZXVlLmFkZFdvcmsobmV3IFdvcmtJdGVtQmFja0ZvcndhcmQoLWFyZ3Vt
ZW50c1swXS50b0ludDMyKCkpKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6cXVldWVGb3J3YXJkTmF2aWdhdGlvbihjb25zdCBDcHBBcmd1
bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1
bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVudHNbMF0uaXNOdW1iZXIoKSkKKyAgICAgICAgbV93
b3JrUXVldWUuYWRkV29yayhuZXcgV29ya0l0ZW1CYWNrRm9yd2FyZChhcmd1bWVudHNbMF0udG9J
bnQzMigpKSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK2NsYXNzIFdvcmtJdGVtUmVs
b2FkIDogcHVibGljIExheW91dFRlc3RDb250cm9sbGVyOjpXb3JrSXRlbSB7CitwdWJsaWM6Cisg
ICAgYm9vbCBydW4oVGVzdFNoZWxsKiBzaGVsbCkKKyAgICB7CisgICAgICAgIHNoZWxsLT5yZWxv
YWQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfTsKKwordm9pZCBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6cXVldWVSZWxvYWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIG1fd29ya1F1ZXVlLmFkZFdvcmsobmV3IFdvcmtJdGVtUmVsb2Fk
KTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKworY2xhc3MgV29ya0l0ZW1Mb2FkaW5nU2Ny
aXB0IDogcHVibGljIExheW91dFRlc3RDb250cm9sbGVyOjpXb3JrSXRlbSB7CitwdWJsaWM6Cisg
ICAgV29ya0l0ZW1Mb2FkaW5nU2NyaXB0KGNvbnN0IHN0cmluZyYgc2NyaXB0KSA6IG1fc2NyaXB0
KHNjcmlwdCkge30KKyAgICBib29sIHJ1bihUZXN0U2hlbGwqIHNoZWxsKQorICAgIHsKKyAgICAg
ICAgc2hlbGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCktPmV4ZWN1dGVTY3JpcHQoV2ViU2NyaXB0
U291cmNlKFdlYlN0cmluZzo6ZnJvbVVURjgobV9zY3JpcHQpKSk7CisgICAgICAgIHJldHVybiB0
cnVlOyAvLyBGSVhNRTogRGlkIGl0IHJlYWxseSBzdGFydCBhIG5hdmlnYXRpb24/CisgICAgfQor
cHJpdmF0ZToKKyAgICBzdHJpbmcgbV9zY3JpcHQ7Cit9OworCitjbGFzcyBXb3JrSXRlbU5vbkxv
YWRpbmdTY3JpcHQgOiBwdWJsaWMgTGF5b3V0VGVzdENvbnRyb2xsZXI6OldvcmtJdGVtIHsKK3B1
YmxpYzoKKyAgICBXb3JrSXRlbU5vbkxvYWRpbmdTY3JpcHQoY29uc3Qgc3RyaW5nJiBzY3JpcHQp
IDogbV9zY3JpcHQoc2NyaXB0KSB7fQorICAgIGJvb2wgcnVuKFRlc3RTaGVsbCogc2hlbGwpCisg
ICAgeworICAgICAgICBzaGVsbC0+d2ViVmlldygpLT5tYWluRnJhbWUoKS0+ZXhlY3V0ZVNjcmlw
dChXZWJTY3JpcHRTb3VyY2UoV2ViU3RyaW5nOjpmcm9tVVRGOChtX3NjcmlwdCkpKTsKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgIH0KK3ByaXZhdGU6CisgICAgc3RyaW5nIG1fc2NyaXB0Owor
fTsKKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cXVldWVMb2FkaW5nU2NyaXB0KGNvbnN0
IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
aWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc1N0cmluZygpKQorICAg
ICAgICBtX3dvcmtRdWV1ZS5hZGRXb3JrKG5ldyBXb3JrSXRlbUxvYWRpbmdTY3JpcHQoYXJndW1l
bnRzWzBdLnRvU3RyaW5nKCkpKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6cXVldWVOb25Mb2FkaW5nU2NyaXB0KGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3Vt
ZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc1N0cmluZygpKQorICAgICAgICBtX3dv
cmtRdWV1ZS5hZGRXb3JrKG5ldyBXb3JrSXRlbU5vbkxvYWRpbmdTY3JpcHQoYXJndW1lbnRzWzBd
LnRvU3RyaW5nKCkpKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKworY2xhc3MgV29ya0l0
ZW1Mb2FkIDogcHVibGljIExheW91dFRlc3RDb250cm9sbGVyOjpXb3JrSXRlbSB7CitwdWJsaWM6
CisgICAgV29ya0l0ZW1Mb2FkKGNvbnN0IFdlYlVSTCYgdXJsLCBjb25zdCBXZWJTdHJpbmcmIHRh
cmdldCkKKyAgICAgICAgOiBtX3VybCh1cmwpCisgICAgICAgICwgbV90YXJnZXQodGFyZ2V0KSB7
fQorICAgIGJvb2wgcnVuKFRlc3RTaGVsbCogc2hlbGwpCisgICAgeworICAgICAgICBzaGVsbC0+
d2ViVmlld0hvc3QoKS0+bG9hZFVSTEZvckZyYW1lKG1fdXJsLCBtX3RhcmdldCk7CisgICAgICAg
IHJldHVybiB0cnVlOyAvLyBGSVhNRTogRGlkIGl0IHJlYWxseSBzdGFydCBhIG5hdmlnYXRpb24/
CisgICAgfQorcHJpdmF0ZToKKyAgICBXZWJVUkwgbV91cmw7CisgICAgV2ViU3RyaW5nIG1fdGFy
Z2V0OworfTsKKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cXVldWVMb2FkKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYg
KGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc1N0cmluZygpKSB7CisgICAg
ICAgIEdVUkwgY3VycmVudFVSTCA9IG1fc2hlbGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCktPnVy
bCgpOworICAgICAgICBHVVJMIGZ1bGxVUkwgPSBjdXJyZW50VVJMLlJlc29sdmUoYXJndW1lbnRz
WzBdLnRvU3RyaW5nKCkpOworCisgICAgICAgIHN0cmluZyB0YXJnZXQgPSAiIjsKKyAgICAgICAg
aWYgKGFyZ3VtZW50cy5zaXplKCkgPiAxICYmIGFyZ3VtZW50c1sxXS5pc1N0cmluZygpKQorICAg
ICAgICAgICAgdGFyZ2V0ID0gYXJndW1lbnRzWzFdLnRvU3RyaW5nKCk7CisKKyAgICAgICAgbV93
b3JrUXVldWUuYWRkV29yayhuZXcgV29ya0l0ZW1Mb2FkKGZ1bGxVUkwsIFdlYlN0cmluZzo6ZnJv
bVVURjgodGFyZ2V0KSkpOworICAgIH0KKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9p
ZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6b2JqQ0lkZW50aXR5SXNFcXVhbChjb25zdCBDcHBBcmd1
bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1
bWVudHMuc2l6ZSgpIDwgMikgeworICAgICAgICAvLyBUaGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBk
byB0byByZXR1cm4gYW4gZXJyb3IuCisgICAgICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgICAg
ICByZXR1cm47CisgICAgfQorICAgIHJlc3VsdC0+c2V0KGFyZ3VtZW50c1swXS5pc0VxdWFsKGFy
Z3VtZW50c1sxXSkpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpyZXNldCgpCit7
CisgICAgaWYgKG1fc2hlbGwpIHsKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlldygpLT5zZXRab29t
TGV2ZWwoZmFsc2UsIDApOworICAgICAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldFRhYktleUN5
Y2xlc1Rocm91Z2hFbGVtZW50cyh0cnVlKTsKKyNpZiBkZWZpbmVkKE9TX0xJTlVYKQorICAgICAg
ICAvLyAoQ29uc3RhbnRzIGNvcGllZCBiZWNhdXNlIHdlIGNhbid0IGRlcGVuZCBvbiB0aGUgaGVh
ZGVyIHRoYXQgZGVmaW5lZAorICAgICAgICAvLyB0aGVtIGZyb20gdGhpcyBmaWxlLikKKyAgICAg
ICAgbV9zaGVsbC0+d2ViVmlldygpLT5zZXRTZWxlY3Rpb25Db2xvcnMoMHhmZjFlOTBmZiwgMHhm
ZjAwMDAwMCwgMHhmZmM4YzhjOCwgMHhmZjMyMzIzMik7CisjZW5kaWYgLy8gZGVmaW5lZChPU19M
SU5VWCkKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlldygpLT5yZW1vdmVBbGxVc2VyQ29udGVudCgp
OworICAgIH0KKyAgICBtX2R1bXBBc1RleHQgPSBmYWxzZTsKKyAgICBtX2R1bXBFZGl0aW5nQ2Fs
bGJhY2tzID0gZmFsc2U7CisgICAgbV9kdW1wRnJhbWVMb2FkQ2FsbGJhY2tzID0gZmFsc2U7Cisg
ICAgbV9kdW1wUmVzb3VyY2VMb2FkQ2FsbGJhY2tzID0gZmFsc2U7CisgICAgbV9kdW1wQmFja0Zv
cndhcmRMaXN0ID0gZmFsc2U7CisgICAgbV9kdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucyA9
IGZhbHNlOworICAgIG1fZHVtcENoaWxkRnJhbWVzQXNUZXh0ID0gZmFsc2U7CisgICAgbV9kdW1w
V2luZG93U3RhdHVzQ2hhbmdlcyA9IGZhbHNlOworICAgIG1fZHVtcFNlbGVjdGlvblJlY3QgPSBm
YWxzZTsKKyAgICBtX2R1bXBUaXRsZUNoYW5nZXMgPSBmYWxzZTsKKyAgICBtX2FjY2VwdHNFZGl0
aW5nID0gdHJ1ZTsKKyAgICBtX3dhaXRVbnRpbERvbmUgPSBmYWxzZTsKKyAgICBtX2Nhbk9wZW5X
aW5kb3dzID0gZmFsc2U7CisgICAgbV90ZXN0UmVwYWludCA9IGZhbHNlOworICAgIG1fc3dlZXBI
b3Jpem9udGFsbHkgPSBmYWxzZTsKKyAgICBtX3Nob3VsZEFkZEZpbGVUb1Bhc3RlYm9hcmQgPSBm
YWxzZTsKKyAgICBtX3N0b3BQcm92aXNpb25hbEZyYW1lTG9hZHMgPSBmYWxzZTsKKyAgICBtX2ds
b2JhbEZsYWcuc2V0KGZhbHNlKTsKKyAgICBtX3dlYkhpc3RvcnlJdGVtQ291bnQuc2V0KDApOwor
CisgICAgd2Via2l0X3N1cHBvcnQ6OlNldEFjY2VwdEFsbENvb2tpZXMoZmFsc2UpOworICAgIFdl
YlNlY3VyaXR5UG9saWN5OjpyZXNldE9yaWdpbkFjY2Vzc1doaXRlTGlzdHMoKTsKKworICAgIC8v
IFJlc2V0IHRoZSBkZWZhdWx0IHF1b3RhIGZvciBlYWNoIG9yaWdpbiB0byA1TUIKKyAgICB3ZWJr
aXRfc3VwcG9ydDo6U2V0RGF0YWJhc2VRdW90YSg1ICogMTAyNCAqIDEwMjQpOworCisgICAgc2V0
bG9jYWxlKExDX0FMTCwgIiIpOworCisgICAgaWYgKG1fY2xvc2VSZW1haW5pbmdXaW5kb3dzKQor
ICAgICAgICBtX3NoZWxsLT5jbG9zZVJlbWFpbmluZ1dpbmRvd3MoKTsKKyAgICBlbHNlCisgICAg
ICAgIG1fY2xvc2VSZW1haW5pbmdXaW5kb3dzID0gdHJ1ZTsKKyAgICBtX3dvcmtRdWV1ZS5yZXNl
dCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpsb2NhdGlvbkNoYW5nZURvbmUo
KQoreworICAgIG1fd2ViSGlzdG9yeUl0ZW1Db3VudC5zZXQobV9zaGVsbC0+bmF2aWdhdGlvbkVu
dHJ5Q291bnQoKSk7CisKKyAgICAvLyBObyBtb3JlIG5ldyB3b3JrIGFmdGVyIHRoZSBmaXJzdCBj
b21wbGV0ZSBsb2FkLgorICAgIG1fd29ya1F1ZXVlLnNldEZyb3plbih0cnVlKTsKKworICAgIGlm
ICghbV93YWl0VW50aWxEb25lKQorICAgICAgICBtX3dvcmtRdWV1ZS5wcm9jZXNzV29ya1Nvb24o
KTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cG9saWN5RGVsZWdhdGVEb25lKCkK
K3sKKyAgICBBU1NFUlQobV93YWl0VW50aWxEb25lKTsKKyAgICBtX3NoZWxsLT50ZXN0RmluaXNo
ZWQoKTsKKyAgICBtX3dhaXRVbnRpbERvbmUgPSBmYWxzZTsKK30KKwordm9pZCBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6c2V0Q2FuT3BlbldpbmRvd3MoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3Bw
VmFyaWFudCogcmVzdWx0KQoreworICAgIG1fY2FuT3BlbldpbmRvd3MgPSB0cnVlOworICAgIHJl
c3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRUYWJL
ZXlDeWNsZXNUaHJvdWdoRWxlbWVudHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMs
IENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYg
YXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldFRh
YktleUN5Y2xlc1Rocm91Z2hFbGVtZW50cyhhcmd1bWVudHNbMF0udG9Cb29sZWFuKCkpOworICAg
IHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjp3aW5k
b3dDb3VudChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7Cisg
ICAgcmVzdWx0LT5zZXQoc3RhdGljX2Nhc3Q8aW50PihtX3NoZWxsLT53aW5kb3dDb3VudCgpKSk7
Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldENsb3NlUmVtYWluaW5nV2luZG93
c1doZW5Db21wbGV0ZShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVudHNb
MF0uaXNCb29sKCkpCisgICAgICAgIG1fY2xvc2VSZW1haW5pbmdXaW5kb3dzID0gYXJndW1lbnRz
WzBdLnZhbHVlLmJvb2xWYWx1ZTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWx3YXlzQWNjZXB0Q29va2llcyhjb25zdCBDcHBBcmd1
bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1
bWVudHMuc2l6ZSgpID4gMCkKKyAgICAgICAgd2Via2l0X3N1cHBvcnQ6OlNldEFjY2VwdEFsbENv
b2tpZXMoY3BwVmFyaWFudFRvQm9vbChhcmd1bWVudHNbMF0pKTsKKyAgICByZXN1bHQtPnNldE51
bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0V2luZG93SXNLZXkoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICBpZiAoYXJndW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAg
ICAgICBtX3NoZWxsLT5zZXRGb2N1cyhtX3NoZWxsLT53ZWJWaWV3KCksIGFyZ3VtZW50c1swXS52
YWx1ZS5ib29sVmFsdWUpOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91
dFRlc3RDb250cm9sbGVyOjpzZXRVc2VyU3R5bGVTaGVldEVuYWJsZWQoY29uc3QgQ3BwQXJndW1l
bnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1l
bnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3NoZWxs
LT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldFVzZXJTdHlsZVNoZWV0TG9jYXRpb24oYXJndW1l
bnRzWzBdLnZhbHVlLmJvb2xWYWx1ZSA/IG1fdXNlclN0eWxlU2hlZXRMb2NhdGlvbiA6IFdlYlVS
TCgpKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6c2V0VXNlclN0eWxlU2hlZXRMb2NhdGlvbihjb25zdCBDcHBBcmd1bWVudExpc3QmIGFy
Z3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgp
ID4gMCAmJiBhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSkgeworICAgICAgICBtX3VzZXJTdHlsZVNo
ZWV0TG9jYXRpb24gPSBXZWJVUkwoR1VSTChUZXN0U2hlbGw6OnJld3JpdGVMb2NhbFVybChhcmd1
bWVudHNbMF0udG9TdHJpbmcoKSkpKTsKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlldygpLT5zZXR0
aW5ncygpLT5zZXRVc2VyU3R5bGVTaGVldExvY2F0aW9uKG1fdXNlclN0eWxlU2hlZXRMb2NhdGlv
bik7CisgICAgfQorICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RD
b250cm9sbGVyOjpleGVjQ29tbWFuZChjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywg
Q3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChh
cmd1bWVudHMuc2l6ZSgpIDw9IDAgfHwgIWFyZ3VtZW50c1swXS5pc1N0cmluZygpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBzdGQ6OnN0cmluZyBjb21tYW5kID0gYXJndW1lbnRzWzBdLnRvU3Ry
aW5nKCk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWUoIiIpOworICAgIC8vIElnbm9yZSB0aGUgc2Vj
b25kIHBhcmFtZXRlciAod2hpY2ggaXMgdXNlckludGVyZmFjZSkKKyAgICAvLyBzaW5jZSB0aGlz
IGNvbW1hbmQgZW11bGF0ZXMgYSBtYW51YWwgYWN0aW9uLgorICAgIGlmIChhcmd1bWVudHMuc2l6
ZSgpID49IDMgJiYgYXJndW1lbnRzWzJdLmlzU3RyaW5nKCkpCisgICAgICAgIHZhbHVlID0gYXJn
dW1lbnRzWzJdLnRvU3RyaW5nKCk7CisKKyAgICAvLyBOb3RlOiB3ZWJraXQncyB2ZXJzaW9uIGRv
ZXMgbm90IHJldHVybiB0aGUgYm9vbGVhbiwgc28gbmVpdGhlciBkbyB3ZS4KKyAgICBtX3NoZWxs
LT53ZWJWaWV3KCktPmZvY3VzZWRGcmFtZSgpLT5leGVjdXRlQ29tbWFuZChXZWJTdHJpbmc6OmZy
b21VVEY4KGNvbW1hbmQpLCBXZWJTdHJpbmc6OmZyb21VVEY4KHZhbHVlKSk7Cit9CisKK3ZvaWQg
TGF5b3V0VGVzdENvbnRyb2xsZXI6OmlzQ29tbWFuZEVuYWJsZWQoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRz
LnNpemUoKSA8PSAwIHx8ICFhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSkgeworICAgICAgICByZXN1
bHQtPnNldE51bGwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5n
IGNvbW1hbmQgPSBhcmd1bWVudHNbMF0udG9TdHJpbmcoKTsKKyAgICBib29sIHJ2ID0gbV9zaGVs
bC0+d2ViVmlldygpLT5mb2N1c2VkRnJhbWUoKS0+aXNDb21tYW5kRW5hYmxlZChXZWJTdHJpbmc6
OmZyb21VVEY4KGNvbW1hbmQpKTsKKyAgICByZXN1bHQtPnNldChydik7Cit9CisKK3ZvaWQgTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnNldFBvcHVwQmxvY2tpbmdFbmFibGVkKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3Vt
ZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc0Jvb2woKSkgeworICAgICAgICBib29s
IGJsb2NrUG9wdXBzID0gYXJndW1lbnRzWzBdLnRvQm9vbGVhbigpOworICAgICAgICBtX3NoZWxs
LT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldEphdmFTY3JpcHRDYW5PcGVuV2luZG93c0F1dG9t
YXRpY2FsbHkoIWJsb2NrUG9wdXBzKTsKKyAgICB9CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFVzZURhc2hib2FyZENvbXBhdGliaWxp
dHlNb2RlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICAvLyBXZSBoYXZlIG5vIG5lZWQgdG8gc3VwcG9ydCBEYXNoYm9hcmQgQ29tcGF0aWJpbGl0eSBN
b2RlIChtYWMtb25seSkKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6c2V0Q3VzdG9tUG9saWN5RGVsZWdhdGUoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJndW1lbnRz
LnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKSB7CisgICAgICAgIGJvb2wgZW5h
YmxlID0gYXJndW1lbnRzWzBdLnZhbHVlLmJvb2xWYWx1ZTsKKyAgICAgICAgYm9vbCBwZXJtaXNz
aXZlID0gZmFsc2U7CisgICAgICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMSAmJiBhcmd1bWVu
dHNbMV0uaXNCb29sKCkpCisgICAgICAgICAgICBwZXJtaXNzaXZlID0gYXJndW1lbnRzWzFdLnZh
bHVlLmJvb2xWYWx1ZTsKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlld0hvc3QoKS0+c2V0Q3VzdG9t
UG9saWN5RGVsZWdhdGUoZW5hYmxlLCBwZXJtaXNzaXZlKTsKKyAgICB9CisgICAgcmVzdWx0LT5z
ZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OndhaXRGb3JQb2xpY3lE
ZWxlZ2F0ZShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7Cisg
ICAgbV9zaGVsbC0+d2ViVmlld0hvc3QoKS0+d2FpdEZvclBvbGljeURlbGVnYXRlKCk7CisgICAg
bV93YWl0VW50aWxEb25lID0gdHJ1ZTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9p
ZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0V2lsbFNlbmRSZXF1ZXN0UmV0dXJuc051bGxPblJl
ZGlyZWN0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1
bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc0Jv
b2woKSkKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlld0hvc3QoKS0+c2V0QmxvY2tSZWRpcmVjdHMo
YXJndW1lbnRzWzBdLnZhbHVlLmJvb2xWYWx1ZSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFdpbGxTZW5kUmVxdWVzdFJldHVybnNO
dWxsKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQp
Cit7CisgICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc0Jvb2wo
KSkKKyAgICAgICAgbV9zaGVsbC0+d2ViVmlld0hvc3QoKS0+c2V0UmVxdWVzdFJldHVybk51bGwo
YXJndW1lbnRzWzBdLnZhbHVlLmJvb2xWYWx1ZSk7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdGhUb0xvY2FsUmVzb3VyY2UoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBy
ZXN1bHQtPnNldE51bGwoKTsKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA8PSAwIHx8ICFhcmd1
bWVudHNbMF0uaXNTdHJpbmcoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgc3RyaW5nIHVybCA9
IGFyZ3VtZW50c1swXS50b1N0cmluZygpOworI2lmIE9TKFdJTkRPV1MpCisgICAgaWYgKFN0YXJ0
c1dpdGhBU0NJSSh1cmwsICIvdG1wLyIsIHRydWUpKSB7CisgICAgICAgIC8vIFdlIHdhbnQgYSB0
ZW1wIGZpbGUuCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIHRlbXBQcmVmaXhMZW5ndGggPSA1Owor
ICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IEZJTEVOQU1FX01BWDsKKyAgICAgICAgT3duQXJy
YXlQdHI8V0NIQVI+IHRlbXBQYXRoKG5ldyBXQ0hBUltidWZmZXJTaXplXSk7CisgICAgICAgIERX
T1JEIHRlbXBMZW5ndGggPSA6OkdldFRlbXBQYXRoVyhidWZmZXJTaXplLCB0ZW1wUGF0aC5nZXQo
KSk7CisgICAgICAgIGlmICh0ZW1wTGVuZ3RoICsgdXJsLmxlbmd0aCgpIC0gdGVtcFByZWZpeExl
bmd0aCArIDEgPiBidWZmZXJTaXplKSB7CisgICAgICAgICAgICBidWZmZXJTaXplID0gdGVtcExl
bmd0aCArIHVybC5sZW5ndGgoKSAtIHRlbXBQcmVmaXhMZW5ndGggKyAxOworICAgICAgICAgICAg
dGVtcFBhdGguc2V0KG5ldyBXQ0hBUltidWZmZXJTaXplXSk7CisgICAgICAgICAgICB0ZW1wTGVu
Z3RoID0gR2V0VGVtcFBhdGhXKGJ1ZmZlclNpemUsIHRlbXBQYXRoLmdldCgpKTsKKyAgICAgICAg
ICAgIEFTU0VSVCh0ZW1wTGVuZ3RoIDwgYnVmZmVyU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAg
cmVzdWx0LT5zZXQoV2ViU3RyaW5nKHRlbXBQYXRoLmdldCgpLCB0ZW1wTGVuZ3RoKS51dGY4KCkg
KyB1cmwuc3Vic3RyKHRlbXBQcmVmaXhMZW5ndGgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0K
KyNlbmRpZgorCisgICAgLy8gU29tZSBsYXlvdXQgdGVzdHMgdXNlIGZpbGU6Ly8vLyB3aGljaCB3
ZSByZXNvbHZlIGFzIGEgVU5DIHBhdGguICBOb3JtYWxpemUKKyAgICAvLyB0aGVtIHRvIGp1c3Qg
ZmlsZTovLy8uCisgICAgd2hpbGUgKFN0YXJ0c1dpdGhBU0NJSSh1cmwsICJmaWxlOi8vLy8iLCBm
YWxzZSkpCisgICAgICAgIHVybCA9IHVybC5zdWJzdHIoMCwgOCkgKyB1cmwuc3Vic3RyKDkpOwor
ICAgIEdVUkwgbG9jYXRpb24oVGVzdFNoZWxsOjpyZXdyaXRlTG9jYWxVcmwodXJsKSk7CisgICAg
cmVzdWx0LT5zZXQobG9jYXRpb24uc3BlYygpKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6YWRkRmlsZVRvUGFzdGVib2FyZE9uRHJhZyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBD
cHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7CisgICAgbV9zaG91
bGRBZGRGaWxlVG9QYXN0ZWJvYXJkID0gdHJ1ZTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6c2V0U3RvcFByb3Zpc2lvbmFsRnJhbWVMb2Fkcyhjb25zdCBDcHBBcmd1bWVudExpc3Qm
LCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7CisgICAgbV9z
dG9wUHJvdmlzaW9uYWxGcmFtZUxvYWRzID0gdHJ1ZTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6c2V0U21hcnRJbnNlcnREZWxldGVFbmFibGVkKGNvbnN0IENwcEFyZ3VtZW50TGlz
dCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKGFyZ3VtZW50cy5z
aXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAgbV9zaGVsbC0+d2Vi
Vmlld0hvc3QoKS0+c2V0U21hcnRJbnNlcnREZWxldGVFbmFibGVkKGFyZ3VtZW50c1swXS52YWx1
ZS5ib29sVmFsdWUpOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRl
c3RDb250cm9sbGVyOjpzZXRTZWxlY3RUcmFpbGluZ1doaXRlc3BhY2VFbmFibGVkKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYg
KGFyZ3VtZW50cy5zaXplKCkgPiAwICYmIGFyZ3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAg
bV9zaGVsbC0+d2ViVmlld0hvc3QoKS0+c2V0U2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxl
ZChhcmd1bWVudHNbMF0udmFsdWUuYm9vbFZhbHVlKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsK
K30KKworYm9vbCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cGF1c2VBbmltYXRpb25BdFRpbWVPbkVs
ZW1lbnRXaXRoSWQoY29uc3QgV2ViU3RyaW5nJiBhbmltYXRpb25OYW1lLCBkb3VibGUgdGltZSwg
Y29uc3QgV2ViU3RyaW5nJiBlbGVtZW50SWQpCit7CisgICAgV2ViRnJhbWUqIHdlYkZyYW1lID0g
bV9zaGVsbC0+d2ViVmlldygpLT5tYWluRnJhbWUoKTsKKyAgICBpZiAoIXdlYkZyYW1lKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBXZWJBbmltYXRpb25Db250cm9sbGVyKiBjb250cm9s
bGVyID0gd2ViRnJhbWUtPmFuaW1hdGlvbkNvbnRyb2xsZXIoKTsKKyAgICBpZiAoIWNvbnRyb2xs
ZXIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFdlYkVsZW1lbnQgZWxlbWVudCA9IHdl
YkZyYW1lLT5kb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7CisgICAgaWYgKGVs
ZW1lbnQuaXNOdWxsKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gY29udHJv
bGxlci0+cGF1c2VBbmltYXRpb25BdFRpbWUoZWxlbWVudCwgYW5pbWF0aW9uTmFtZSwgdGltZSk7
Cit9CisKK2Jvb2wgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNlVHJhbnNpdGlvbkF0VGltZU9u
RWxlbWVudFdpdGhJZChjb25zdCBXZWJTdHJpbmcmIHByb3BlcnR5TmFtZSwgZG91YmxlIHRpbWUs
IGNvbnN0IFdlYlN0cmluZyYgZWxlbWVudElkKQoreworICAgIFdlYkZyYW1lKiB3ZWJGcmFtZSA9
IG1fc2hlbGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCF3ZWJGcmFtZSkKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgV2ViQW5pbWF0aW9uQ29udHJvbGxlciogY29udHJv
bGxlciA9IHdlYkZyYW1lLT5hbmltYXRpb25Db250cm9sbGVyKCk7CisgICAgaWYgKCFjb250cm9s
bGVyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBXZWJFbGVtZW50IGVsZW1lbnQgPSB3
ZWJGcmFtZS0+ZG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpOworICAgIGlmIChl
bGVtZW50LmlzTnVsbCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGNvbnRy
b2xsZXItPnBhdXNlVHJhbnNpdGlvbkF0VGltZShlbGVtZW50LCBwcm9wZXJ0eU5hbWUsIHRpbWUp
OworfQorCitib29sIExheW91dFRlc3RDb250cm9sbGVyOjplbGVtZW50RG9lc0F1dG9Db21wbGV0
ZUZvckVsZW1lbnRXaXRoSWQoY29uc3QgV2ViU3RyaW5nJiBlbGVtZW50SWQpCit7CisgICAgV2Vi
RnJhbWUqIHdlYkZyYW1lID0gbV9zaGVsbC0+d2ViVmlldygpLT5tYWluRnJhbWUoKTsKKyAgICBp
ZiAoIXdlYkZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBXZWJFbGVtZW50IGVs
ZW1lbnQgPSB3ZWJGcmFtZS0+ZG9jdW1lbnQoKS5nZXRFbGVtZW50QnlJZChlbGVtZW50SWQpOwor
ICAgIGlmIChlbGVtZW50LmlzTnVsbCgpIHx8ICFlbGVtZW50Lmhhc1RhZ05hbWUoImlucHV0Iikp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFdlYklucHV0RWxlbWVudCBpbnB1dEVsZW1l
bnQgPSBlbGVtZW50LnRvRWxlbWVudDxXZWJJbnB1dEVsZW1lbnQ+KCk7CisgICAgcmV0dXJuIGlu
cHV0RWxlbWVudC5hdXRvQ29tcGxldGUoKTsKK30KKworaW50IExheW91dFRlc3RDb250cm9sbGVy
OjpudW1iZXJPZkFjdGl2ZUFuaW1hdGlvbnMoKQoreworICAgIFdlYkZyYW1lKiB3ZWJGcmFtZSA9
IG1fc2hlbGwtPndlYlZpZXcoKS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKCF3ZWJGcmFtZSkKKyAg
ICAgICAgcmV0dXJuIC0xOworCisgICAgV2ViQW5pbWF0aW9uQ29udHJvbGxlciogY29udHJvbGxl
ciA9IHdlYkZyYW1lLT5hbmltYXRpb25Db250cm9sbGVyKCk7CisgICAgaWYgKCFjb250cm9sbGVy
KQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICByZXR1cm4gY29udHJvbGxlci0+bnVtYmVyT2ZB
Y3RpdmVBbmltYXRpb25zKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNl
QW5pbWF0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJn
dW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXQoZmFsc2UpOwor
ICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMiAmJiBhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSAm
JiBhcmd1bWVudHNbMV0uaXNOdW1iZXIoKSAmJiBhcmd1bWVudHNbMl0uaXNTdHJpbmcoKSkgewor
ICAgICAgICBXZWJTdHJpbmcgYW5pbWF0aW9uTmFtZSA9IGNwcFZhcmlhbnRUb1dlYlN0cmluZyhh
cmd1bWVudHNbMF0pOworICAgICAgICBkb3VibGUgdGltZSA9IGFyZ3VtZW50c1sxXS50b0RvdWJs
ZSgpOworICAgICAgICBXZWJTdHJpbmcgZWxlbWVudElkID0gY3BwVmFyaWFudFRvV2ViU3RyaW5n
KGFyZ3VtZW50c1syXSk7CisgICAgICAgIHJlc3VsdC0+c2V0KHBhdXNlQW5pbWF0aW9uQXRUaW1l
T25FbGVtZW50V2l0aElkKGFuaW1hdGlvbk5hbWUsIHRpbWUsIGVsZW1lbnRJZCkpOworICAgIH0K
K30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cGF1c2VUcmFuc2l0aW9uQXRUaW1lT25F
bGVtZW50V2l0aElkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50
KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXQoZmFsc2UpOworICAgIGlmIChhcmd1bWVudHMu
c2l6ZSgpID4gMiAmJiBhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSAmJiBhcmd1bWVudHNbMV0uaXNO
dW1iZXIoKSAmJiBhcmd1bWVudHNbMl0uaXNTdHJpbmcoKSkgeworICAgICAgICBXZWJTdHJpbmcg
cHJvcGVydHlOYW1lID0gY3BwVmFyaWFudFRvV2ViU3RyaW5nKGFyZ3VtZW50c1swXSk7CisgICAg
ICAgIGRvdWJsZSB0aW1lID0gYXJndW1lbnRzWzFdLnRvRG91YmxlKCk7CisgICAgICAgIFdlYlN0
cmluZyBlbGVtZW50SWQgPSBjcHBWYXJpYW50VG9XZWJTdHJpbmcoYXJndW1lbnRzWzJdKTsKKyAg
ICAgICAgcmVzdWx0LT5zZXQocGF1c2VUcmFuc2l0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKHBy
b3BlcnR5TmFtZSwgdGltZSwgZWxlbWVudElkKSk7CisgICAgfQorfQorCit2b2lkIExheW91dFRl
c3RDb250cm9sbGVyOjplbGVtZW50RG9lc0F1dG9Db21wbGV0ZUZvckVsZW1lbnRXaXRoSWQoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICBpZiAoYXJndW1lbnRzLnNpemUoKSAhPSAxIHx8ICFhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSkg
eworICAgICAgICByZXN1bHQtPnNldChmYWxzZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cisg
ICAgV2ViU3RyaW5nIGVsZW1lbnRJZCA9IGNwcFZhcmlhbnRUb1dlYlN0cmluZyhhcmd1bWVudHNb
MF0pOworICAgIHJlc3VsdC0+c2V0KGVsZW1lbnREb2VzQXV0b0NvbXBsZXRlRm9yRWxlbWVudFdp
dGhJZChlbGVtZW50SWQpKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bnVtYmVy
T2ZBY3RpdmVBbmltYXRpb25zKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqIHJl
c3VsdCkKK3sKKyAgICByZXN1bHQtPnNldChudW1iZXJPZkFjdGl2ZUFuaW1hdGlvbnMoKSk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmRpc2FibGVJbWFnZUxvYWRpbmcoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIG1fc2hlbGwtPndl
YlZpZXcoKS0+c2V0dGluZ3MoKS0+c2V0TG9hZHNJbWFnZXNBdXRvbWF0aWNhbGx5KGZhbHNlKTsK
KyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6
c2V0SWNvbkRhdGFiYXNlRW5hYmxlZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
KiByZXN1bHQpCit7CisgICAgLy8gV2UgZG9uJ3QgdXNlIHRoZSBXZWJLaXQgaWNvbiBkYXRhYmFz
ZS4KKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKworLy8KKy8vIFVuaW1wbGVtZW50ZWQgc3R1
YnMKKy8vCisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmR1bXBBc1dlYkFyY2hpdmUoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0
TWFpbkZyYW1lSXNGaXJzdFJlc3BvbmRlcihjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50
cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2
b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkdW1wU2VsZWN0aW9uUmVjdChjb25zdCBDcHBBcmd1
bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIG1fZHVtcFNl
bGVjdGlvblJlY3QgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExh
eW91dFRlc3RDb250cm9sbGVyOjpkaXNwbGF5KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1l
bnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgV2ViVmlld0hvc3QqIGhvc3QgPSBtX3No
ZWxsLT53ZWJWaWV3SG9zdCgpOworICAgIGNvbnN0IFdlYktpdDo6V2ViU2l6ZSYgc2l6ZSA9IG1f
c2hlbGwtPndlYlZpZXcoKS0+c2l6ZSgpOworICAgIFdlYlJlY3QgcmVjdCgwLCAwLCBzaXplLndp
ZHRoLCBzaXplLmhlaWdodCk7CisgICAgaG9zdC0+dXBkYXRlUGFpbnRSZWN0KHJlY3QpOworICAg
IGhvc3QtPnBhaW50SW52YWxpZGF0ZWRSZWdpb24oKTsKKyAgICBob3N0LT5kaXNwbGF5UmVwYWlu
dE1hc2soKTsKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6dGVzdFJlcGFpbnQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCog
cmVzdWx0KQoreworICAgIG1fdGVzdFJlcGFpbnQgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVs
bCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpyZXBhaW50U3dlZXBIb3Jpem9u
dGFsbHkoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAg
IG1fc3dlZXBIb3Jpem9udGFsbHkgPSB0cnVlOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQor
Cit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpjbGVhckJhY2tGb3J3YXJkTGlzdChjb25zdCBD
cHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJl
c3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjprZWVwV2Vi
SGlzdG9yeShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgIENwcFZhcmlhbnQqIHJl
c3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6c3RvcmVXZWJTY3JpcHRPYmplY3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1
bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30K
Kwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWNjZXNzU3RvcmVkV2ViU2NyaXB0T2JqZWN0
KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7
CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
Om9iakNDbGFzc05hbWVPZihjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFy
aWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lkIExheW91
dFRlc3RDb250cm9sbGVyOjphZGREaXNhbGxvd2VkVVJMKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYg
YXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7
Cit9Cit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRDYWxsQ2xvc2VPbldlYlZpZXdzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7Cisg
ICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNl
dFByaXZhdGVCcm93c2luZ0VuYWJsZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMs
IENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKK30KKwordm9p
ZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0WFNTQXVkaXRvckVuYWJsZWQoY29uc3QgQ3BwQXJn
dW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoYXJn
dW1lbnRzLnNpemUoKSA+IDAgJiYgYXJndW1lbnRzWzBdLmlzQm9vbCgpKQorICAgICAgICBtX3No
ZWxsLT53ZWJWaWV3KCktPnNldHRpbmdzKCktPnNldFhTU0F1ZGl0b3JFbmFibGVkKGFyZ3VtZW50
c1swXS52YWx1ZS5ib29sVmFsdWUpOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25z
dCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAg
IGlmIChhcmd1bWVudHMuc2l6ZSgpID49IDIgJiYgYXJndW1lbnRzWzBdLmlzTnVtYmVyKCkgJiYg
YXJndW1lbnRzWzFdLmlzU3RyaW5nKCkpIHsKKyAgICAgICAgV2ViU2NyaXB0U291cmNlIHNvdXJj
ZShXZWJTdHJpbmc6OmZyb21VVEY4KGFyZ3VtZW50c1sxXS50b1N0cmluZygpKSk7CisgICAgICAg
IC8vIFRoaXMgcmVsaWVzIG9uIHRoZSBpZnJhbWUgZm9jdXNpbmcgaXRzZWxmIHdoZW4gaXQgbG9h
ZHMuIFRoaXMgaXMgYSBiaXQKKyAgICAgICAgLy8gc2tldGNoeSwgYnV0IGl0IHNlZW1zIHRvIGJl
IHdoYXQgb3RoZXIgdGVzdHMgZG8uCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+Zm9jdXNl
ZEZyYW1lKCktPmV4ZWN1dGVTY3JpcHRJbklzb2xhdGVkV29ybGQoYXJndW1lbnRzWzBdLnRvSW50
MzIoKSwgJnNvdXJjZSwgMSwgMSk7CisgICAgfQorICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQor
Cit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRBbGxvd1VuaXZlcnNhbEFjY2Vzc0Zyb21G
aWxlVVJMcyhjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVz
dWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpID4gMCAmJiBhcmd1bWVudHNbMF0uaXNC
b29sKCkpCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+c2V0dGluZ3MoKS0+c2V0QWxsb3dV
bml2ZXJzYWxBY2Nlc3NGcm9tRmlsZVVSTHMoYXJndW1lbnRzWzBdLnZhbHVlLmJvb2xWYWx1ZSk7
CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OnNldEFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyhjb25zdCBDcHBBcmd1bWVudExpc3QmIGFy
Z3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgp
ID4gMCAmJiBhcmd1bWVudHNbMF0uaXNCb29sKCkpCisgICAgICAgIG1fc2hlbGwtPndlYlZpZXco
KS0+c2V0dGluZ3MoKS0+c2V0QWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVVUkxzKGFyZ3VtZW50c1sw
XS52YWx1ZS5ib29sVmFsdWUpOworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworfQorCisvLyBOZWVk
IHRoZXNlIGNvbnZlcnNpb25zIGJlY2F1c2UgdGhlIGZvcm1hdCBvZiB0aGUgdmFsdWUgZm9yIGJv
b2xlYW5zCisvLyBtYXkgdmFyeSAtIGZvciBleGFtcGxlLCBvbiBtYWMgIjEiIGFuZCAiMCIgYXJl
IHVzZWQgZm9yIGJvb2xlYW4uCitib29sIExheW91dFRlc3RDb250cm9sbGVyOjpjcHBWYXJpYW50
VG9Cb29sKGNvbnN0IENwcFZhcmlhbnQmIHZhbHVlKQoreworICAgIGlmICh2YWx1ZS5pc0Jvb2wo
KSkKKyAgICAgICAgcmV0dXJuIHZhbHVlLnRvQm9vbGVhbigpOworICAgIGlmICh2YWx1ZS5pc0lu
dDMyKCkpCisgICAgICAgIHJldHVybiB2YWx1ZS50b0ludDMyKCk7CisgICAgaWYgKHZhbHVlLmlz
U3RyaW5nKCkpIHsKKyAgICAgICAgc3RyaW5nIHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmco
KTsKKyAgICAgICAgaWYgKHZhbHVlU3RyaW5nID09ICJ0cnVlIiB8fCB2YWx1ZVN0cmluZyA9PSAi
MSIpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKHZhbHVlU3RyaW5nID09
ICJmYWxzZSIgfHwgdmFsdWVTdHJpbmcgPT0gIjAiKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgIH0KKyAgICBsb2dFcnJvclRvQ29uc29sZSgiSW52YWxpZCB2YWx1ZS4gRXhwZWN0ZWQg
Ym9vbGVhbiB2YWx1ZS4iKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgTGF5b3V0
VGVzdENvbnRyb2xsZXI6OmNwcFZhcmlhbnRUb0ludDMyKGNvbnN0IENwcFZhcmlhbnQmIHZhbHVl
KQoreworICAgIGlmICh2YWx1ZS5pc0ludDMyKCkpCisgICAgICAgIHJldHVybiB2YWx1ZS50b0lu
dDMyKCk7CisgICAgaWYgKHZhbHVlLmlzU3RyaW5nKCkpIHsKKyAgICAgICAgaW50IG51bWJlcjsK
KyAgICAgICAgaWYgKFN0cmluZ1RvSW50KHZhbHVlLnRvU3RyaW5nKCksICZudW1iZXIpKQorICAg
ICAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICB9CisgICAgbG9nRXJyb3JUb0NvbnNvbGUoIklu
dmFsaWQgdmFsdWUgZm9yIHByZWZlcmVuY2UuIEV4cGVjdGVkIGludGVnZXIgdmFsdWUuIik7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK1dlYlN0cmluZyBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y3BwVmFy
aWFudFRvV2ViU3RyaW5nKGNvbnN0IENwcFZhcmlhbnQmIHZhbHVlKQoreworICAgIGlmICghdmFs
dWUuaXNTdHJpbmcoKSkgeworICAgICAgICBsb2dFcnJvclRvQ29uc29sZSgiSW52YWxpZCB2YWx1
ZSBmb3IgcHJlZmVyZW5jZS4gRXhwZWN0ZWQgc3RyaW5nIHZhbHVlLiIpOworICAgICAgICByZXR1
cm4gV2ViU3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBXZWJTdHJpbmc6OmZyb21VVEY4KHZh
bHVlLnRvU3RyaW5nKCkpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpvdmVycmlk
ZVByZWZlcmVuY2UoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsKKyAgICBpZiAoYXJndW1lbnRzLnNp
emUoKSAhPSAyIHx8ICFhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgc3RyaW5nIGtleSA9IGFyZ3VtZW50c1swXS50b1N0cmluZygpOworICAgIENwcFZhcmlh
bnQgdmFsdWUgPSBhcmd1bWVudHNbMV07CisgICAgV2ViU2V0dGluZ3MqIHNldHRpbmdzID0gbV9z
aGVsbC0+d2ViVmlldygpLT5zZXR0aW5ncygpOworICAgIGlmIChrZXkgPT0gIldlYktpdFN0YW5k
YXJkRm9udCIpCisgICAgICAgIHNldHRpbmdzLT5zZXRTdGFuZGFyZEZvbnRGYW1pbHkoY3BwVmFy
aWFudFRvV2ViU3RyaW5nKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRGaXhl
ZEZvbnQiKQorICAgICAgICBzZXR0aW5ncy0+c2V0Rml4ZWRGb250RmFtaWx5KGNwcFZhcmlhbnRU
b1dlYlN0cmluZyh2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAiV2ViS2l0U2VyaWZGb250
IikKKyAgICAgICAgc2V0dGluZ3MtPnNldFNlcmlmRm9udEZhbWlseShjcHBWYXJpYW50VG9XZWJT
dHJpbmcodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdFNhbnNTZXJpZkZvbnQi
KQorICAgICAgICBzZXR0aW5ncy0+c2V0U2Fuc1NlcmlmRm9udEZhbWlseShjcHBWYXJpYW50VG9X
ZWJTdHJpbmcodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdEN1cnNpdmVGb250
IikKKyAgICAgICAgc2V0dGluZ3MtPnNldEN1cnNpdmVGb250RmFtaWx5KGNwcFZhcmlhbnRUb1dl
YlN0cmluZyh2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAiV2ViS2l0RmFudGFzeUZvbnQi
KQorICAgICAgICBzZXR0aW5ncy0+c2V0RmFudGFzeUZvbnRGYW1pbHkoY3BwVmFyaWFudFRvV2Vi
U3RyaW5nKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXREZWZhdWx0Rm9udFNp
emUiKQorICAgICAgICBzZXR0aW5ncy0+c2V0RGVmYXVsdEZvbnRTaXplKGNwcFZhcmlhbnRUb0lu
dDMyKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXREZWZhdWx0Rml4ZWRGb250
U2l6ZSIpCisgICAgICAgIHNldHRpbmdzLT5zZXREZWZhdWx0Rml4ZWRGb250U2l6ZShjcHBWYXJp
YW50VG9JbnQzMih2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAiV2ViS2l0TWluaW11bUZv
bnRTaXplIikKKyAgICAgICAgc2V0dGluZ3MtPnNldE1pbmltdW1Gb250U2l6ZShjcHBWYXJpYW50
VG9JbnQzMih2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAiV2ViS2l0TWluaW11bUxvZ2lj
YWxGb250U2l6ZSIpCisgICAgICAgIHNldHRpbmdzLT5zZXRNaW5pbXVtTG9naWNhbEZvbnRTaXpl
KGNwcFZhcmlhbnRUb0ludDMyKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRE
ZWZhdWx0VGV4dEVuY29kaW5nTmFtZSIpCisgICAgICAgIHNldHRpbmdzLT5zZXREZWZhdWx0VGV4
dEVuY29kaW5nTmFtZShjcHBWYXJpYW50VG9XZWJTdHJpbmcodmFsdWUpKTsKKyAgICBlbHNlIGlm
IChrZXkgPT0gIldlYktpdEphdmFTY3JpcHRFbmFibGVkIikKKyAgICAgICAgc2V0dGluZ3MtPnNl
dEphdmFTY3JpcHRFbmFibGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlm
IChrZXkgPT0gIldlYktpdFdlYlNlY3VyaXR5RW5hYmxlZCIpCisgICAgICAgIHNldHRpbmdzLT5z
ZXRXZWJTZWN1cml0eUVuYWJsZWQoY3BwVmFyaWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVsc2Ug
aWYgKGtleSA9PSAiV2ViS2l0SmF2YVNjcmlwdENhbk9wZW5XaW5kb3dzQXV0b21hdGljYWxseSIp
CisgICAgICAgIHNldHRpbmdzLT5zZXRKYXZhU2NyaXB0Q2FuT3BlbldpbmRvd3NBdXRvbWF0aWNh
bGx5KGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktp
dERpc3BsYXlJbWFnZXNLZXkiKQorICAgICAgICBzZXR0aW5ncy0+c2V0TG9hZHNJbWFnZXNBdXRv
bWF0aWNhbGx5KGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0g
IldlYktpdFBsdWdpbnNFbmFibGVkIikKKyAgICAgICAgc2V0dGluZ3MtPnNldFBsdWdpbnNFbmFi
bGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktp
dERPTVBhc3RlQWxsb3dlZFByZWZlcmVuY2VLZXkiKQorICAgICAgICBzZXR0aW5ncy0+c2V0RE9N
UGFzdGVBbGxvd2VkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkg
PT0gIldlYktpdERldmVsb3BlckV4dHJhc0VuYWJsZWRQcmVmZXJlbmNlS2V5IikKKyAgICAgICAg
c2V0dGluZ3MtPnNldERldmVsb3BlckV4dHJhc0VuYWJsZWQoY3BwVmFyaWFudFRvQm9vbCh2YWx1
ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAiV2ViS2l0U2hyaW5rc1N0YW5kYWxvbmVJbWFnZXNU
b0ZpdCIpCisgICAgICAgIHNldHRpbmdzLT5zZXRTaHJpbmtzU3RhbmRhbG9uZUltYWdlc1RvRml0
KGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktpdFRl
eHRBcmVhc0FyZVJlc2l6YWJsZSIpCisgICAgICAgIHNldHRpbmdzLT5zZXRUZXh0QXJlYXNBcmVS
ZXNpemFibGUoY3BwVmFyaWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAi
V2ViS2l0SmF2YUVuYWJsZWQiKQorICAgICAgICBzZXR0aW5ncy0+c2V0SmF2YUVuYWJsZWQoY3Bw
VmFyaWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAiV2ViS2l0VXNlc1Bh
Z2VDYWNoZVByZWZlcmVuY2VLZXkiKQorICAgICAgICBzZXR0aW5ncy0+c2V0VXNlc1BhZ2VDYWNo
ZShjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRY
U1NBdWRpdG9yRW5hYmxlZCIpCisgICAgICAgIHNldHRpbmdzLT5zZXRYU1NBdWRpdG9yRW5hYmxl
ZChjcHBWYXJpYW50VG9Cb29sKHZhbHVlKSk7CisgICAgZWxzZSBpZiAoa2V5ID09ICJXZWJLaXRM
b2NhbFN0b3JhZ2VFbmFibGVkUHJlZmVyZW5jZUtleSIpCisgICAgICAgIHNldHRpbmdzLT5zZXRM
b2NhbFN0b3JhZ2VFbmFibGVkKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlm
IChrZXkgPT0gIldlYktpdE9mZmxpbmVXZWJBcHBsaWNhdGlvbkNhY2hlRW5hYmxlZCIpCisgICAg
ICAgIHNldHRpbmdzLT5zZXRPZmZsaW5lV2ViQXBwbGljYXRpb25DYWNoZUVuYWJsZWQoY3BwVmFy
aWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVsc2UgaWYgKGtleSA9PSAiV2ViS2l0VGFiVG9MaW5r
c1ByZWZlcmVuY2VLZXkiKQorICAgICAgICBtX3NoZWxsLT53ZWJWaWV3KCktPnNldFRhYnNUb0xp
bmtzKGNwcFZhcmlhbnRUb0Jvb2wodmFsdWUpKTsKKyAgICBlbHNlIGlmIChrZXkgPT0gIldlYktp
dFdlYkdMRW5hYmxlZCIpCisgICAgICAgIHNldHRpbmdzLT5zZXRFeHBlcmltZW50YWxXZWJHTEVu
YWJsZWQoY3BwVmFyaWFudFRvQm9vbCh2YWx1ZSkpOworICAgIGVsc2UgeworICAgICAgICBzdHJp
bmcgbWVzc2FnZSgiSW52YWxpZCBuYW1lIGZvciBwcmVmZXJlbmNlOiAiKTsKKyAgICAgICAgbWVz
c2FnZS5hcHBlbmQoa2V5KTsKKyAgICAgICAgbG9nRXJyb3JUb0NvbnNvbGUobWVzc2FnZSk7Cisg
ICAgfQorfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpmYWxsYmFja01ldGhvZChjb25z
dCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcHJpbnRmKCJD
T05TT0xFIE1FU1NBR0U6IEphdmFTY3JpcHQgRVJST1I6IHVua25vd24gbWV0aG9kIGNhbGxlZCBv
biBMYXlvdXRUZXN0Q29udHJvbGxlclxuIik7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cit9CisK
K3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OndoaXRlTGlzdEFjY2Vzc0Zyb21PcmlnaW4oY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICByZXN1bHQtPnNldE51bGwoKTsKKworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpICE9IDQgfHwg
IWFyZ3VtZW50c1swXS5pc1N0cmluZygpIHx8ICFhcmd1bWVudHNbMV0uaXNTdHJpbmcoKQorICAg
ICAgICB8fCAhYXJndW1lbnRzWzJdLmlzU3RyaW5nKCkgfHwgIWFyZ3VtZW50c1szXS5pc0Jvb2wo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViS2l0OjpXZWJVUkwgdXJsKEdVUkwoYXJndW1l
bnRzWzBdLnRvU3RyaW5nKCkpKTsKKyAgICBpZiAoIXVybC5pc1ZhbGlkKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIFdlYlNlY3VyaXR5UG9saWN5Ojp3aGl0ZUxpc3RBY2Nlc3NGcm9tT3JpZ2lu
KHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBX
ZWJTdHJpbmc6OmZyb21VVEY4KGFyZ3VtZW50c1sxXS50b1N0cmluZygpKSwKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZWJTdHJpbmc6OmZyb21VVEY4
KGFyZ3VtZW50c1syXS50b1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHNbM10udG9Cb29sZWFuKCkpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpjbGVhckFsbERhdGFiYXNlcyhjb25zdCBDcHBBcmd1bWVu
dExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0
TnVsbCgpOworICAgIHdlYmtpdF9zdXBwb3J0OjpDbGVhckFsbERhdGFiYXNlcygpOworfQorCit2
b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXREYXRhYmFzZVF1b3RhKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5z
ZXROdWxsKCk7CisgICAgaWYgKChhcmd1bWVudHMuc2l6ZSgpID49IDEpICYmIGFyZ3VtZW50c1sw
XS5pc0ludDMyKCkpCisgICAgICAgIHdlYmtpdF9zdXBwb3J0OjpTZXREYXRhYmFzZVF1b3RhKGFy
Z3VtZW50c1swXS50b0ludDMyKCkpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpz
ZXRQT1NJWExvY2FsZShjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFu
dCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1bWVudHMu
c2l6ZSgpID09IDEgJiYgYXJndW1lbnRzWzBdLmlzU3RyaW5nKCkpCisgICAgICAgIHNldGxvY2Fs
ZShMQ19BTEwsIGFyZ3VtZW50c1swXS50b1N0cmluZygpLmNfc3RyKCkpOworfQorCit2b2lkIExh
eW91dFRlc3RDb250cm9sbGVyOjpjb3VudGVyVmFsdWVGb3JFbGVtZW50QnlJZChjb25zdCBDcHBB
cmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3Vs
dC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDwgMSB8fCAhYXJndW1lbnRz
WzBdLmlzU3RyaW5nKCkpCisgICAgICAgIHJldHVybjsKKyAgICBXZWJGcmFtZSogZnJhbWUgPSBt
X3NoZWxsLT53ZWJWaWV3KCktPm1haW5GcmFtZSgpOworICAgIGlmICghZnJhbWUpCisgICAgICAg
IHJldHVybjsKKyAgICBXZWJTdHJpbmcgY291bnRlclZhbHVlID0gZnJhbWUtPmNvdW50ZXJWYWx1
ZUZvckVsZW1lbnRCeUlkKGNwcFZhcmlhbnRUb1dlYlN0cmluZyhhcmd1bWVudHNbMF0pKTsKKyAg
ICBpZiAoY291bnRlclZhbHVlLmlzTnVsbCgpKQorICAgICAgICByZXR1cm47CisgICAgcmVzdWx0
LT5zZXQoY291bnRlclZhbHVlLnV0ZjgoKSk7Cit9CisKK3N0YXRpYyBib29sIHBhcnNlUGFnZVNp
emVQYXJhbWV0ZXJzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ09mZnNldCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYWdlV2lkdGhJblBpeGVscywKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBwYWdlSGVpZ2h0SW5QaXhlbHMpCit7
CisgICAgLy8gV2ViS2l0IGlzIHVzaW5nIHRoZSB3aW5kb3cgd2lkdGgvaGVpZ2h0IG9mIER1bXBS
ZW5kZXJUcmVlIGFzIHRoZQorICAgIC8vIGRlZmF1bHQgdmFsdWUgb2YgdGhlIHBhZ2Ugc2l6ZS4K
KyAgICAvLyBGSVhNRTogc2hhcmUgdGhlc2UgdmFsdWVzIHdpdGggb3RoZXIgcG9ydHMuCisgICAg
KnBhZ2VXaWR0aEluUGl4ZWxzID0gODAwOworICAgICpwYWdlSGVpZ2h0SW5QaXhlbHMgPSA2MDA7
CisgICAgc3dpdGNoIChhcmd1bWVudHMuc2l6ZSgpIC0gYXJnT2Zmc2V0KSB7CisgICAgY2FzZSAy
OgorICAgICAgICBpZiAoIWFyZ3VtZW50c1thcmdPZmZzZXRdLmlzTnVtYmVyKCkgfHwgIWFyZ3Vt
ZW50c1sxICsgYXJnT2Zmc2V0XS5pc051bWJlcigpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAqcGFnZVdpZHRoSW5QaXhlbHMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oYXJndW1l
bnRzW2FyZ09mZnNldF0udG9JbnQzMigpKTsKKyAgICAgICAgKnBhZ2VIZWlnaHRJblBpeGVscyA9
IHN0YXRpY19jYXN0PGZsb2F0Pihhcmd1bWVudHNbMSArIGFyZ09mZnNldF0udG9JbnQzMigpKTsK
KyAgICAgICAgLy8gZmFsbCB0aHJvdWdoLgorICAgIGNhc2UgMDoKKyAgICAgICAgYnJlYWs7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1
ZTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cGFnZU51bWJlckZvckVsZW1lbnRC
eUlkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJndW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQp
Cit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7CisgICAgZmxvYXQgcGFnZVdpZHRoSW5QaXhlbHMg
PSAwOworICAgIGZsb2F0IHBhZ2VIZWlnaHRJblBpeGVscyA9IDA7CisgICAgaWYgKCFwYXJzZVBh
Z2VTaXplUGFyYW1ldGVycyhhcmd1bWVudHMsIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAmcGFnZVdpZHRoSW5QaXhlbHMsICZwYWdlSGVpZ2h0SW5QaXhlbHMpKQorICAgICAg
ICByZXR1cm47CisgICAgaWYgKCFhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSkKKyAgICAgICAgcmV0
dXJuOworICAgIFdlYkZyYW1lKiBmcmFtZSA9IG1fc2hlbGwtPndlYlZpZXcoKS0+bWFpbkZyYW1l
KCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworICAgIHJlc3VsdC0+c2V0KGZy
YW1lLT5wYWdlTnVtYmVyRm9yRWxlbWVudEJ5SWQoY3BwVmFyaWFudFRvV2ViU3RyaW5nKGFyZ3Vt
ZW50c1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwYWdlV2lkdGhJblBpeGVscywgcGFnZUhlaWdodEluUGl4ZWxzKSk7Cit9CisKK3ZvaWQgTGF5
b3V0VGVzdENvbnRyb2xsZXI6Om51bWJlck9mUGFnZXMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiBh
cmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICByZXN1bHQtPnNldE51bGwoKTsK
KyAgICBmbG9hdCBwYWdlV2lkdGhJblBpeGVscyA9IDA7CisgICAgZmxvYXQgcGFnZUhlaWdodElu
UGl4ZWxzID0gMDsKKyAgICBpZiAoIXBhcnNlUGFnZVNpemVQYXJhbWV0ZXJzKGFyZ3VtZW50cywg
MCwgJnBhZ2VXaWR0aEluUGl4ZWxzLCAmcGFnZUhlaWdodEluUGl4ZWxzKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgV2ViRnJhbWUqIGZyYW1lID0gbV9zaGVsbC0+d2ViVmlldygpLT5tYWluRnJh
bWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgV2ViU2l6ZSBzaXpl
KHBhZ2VXaWR0aEluUGl4ZWxzLCBwYWdlSGVpZ2h0SW5QaXhlbHMpOworICAgIGludCBudW1iZXJP
ZlBhZ2VzID0gZnJhbWUtPnByaW50QmVnaW4oc2l6ZSk7CisgICAgZnJhbWUtPnByaW50RW5kKCk7
CisgICAgcmVzdWx0LT5zZXQobnVtYmVyT2ZQYWdlcyk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENv
bnRyb2xsZXI6OmxvZ0Vycm9yVG9Db25zb2xlKGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KQorewor
ICAgIG1fc2hlbGwtPndlYlZpZXdIb3N0KCktPmRpZEFkZE1lc3NhZ2VUb0NvbnNvbGUoCisgICAg
ICAgIFdlYkNvbnNvbGVNZXNzYWdlKFdlYkNvbnNvbGVNZXNzYWdlOjpMZXZlbEVycm9yLCBXZWJT
dHJpbmc6OmZyb21VVEY4KHRleHQpKSwKKyAgICAgICAgV2ViU3RyaW5nKCksIDApOworfQorCit2
b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRUaW1lbGluZVByb2ZpbGluZ0VuYWJsZWQoY29u
c3QgQ3BwQXJndW1lbnRMaXN0JiBhcmd1bWVudHMsIENwcFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAg
ICByZXN1bHQtPnNldE51bGwoKTsKKyAgICBpZiAoYXJndW1lbnRzLnNpemUoKSA8IDEgfHwgIWFy
Z3VtZW50c1swXS5pc0Jvb2woKSkKKyAgICAgICAgcmV0dXJuOworICAgIC8vIEZJWE1FOiBTaG91
bGQgY2FsbCBUZXN0U2hlbGxEZXZUb29sc0FnZW50OjpzZXRUaW1lbGluZVByb2ZpbGluZ0VuYWJs
ZWQoKS4KK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6ZXZhbHVhdGVJbldlYkluc3Bl
Y3Rvcihjb25zdCBDcHBBcmd1bWVudExpc3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0
KQoreworICAgIHJlc3VsdC0+c2V0TnVsbCgpOworICAgIGlmIChhcmd1bWVudHMuc2l6ZSgpIDwg
MiB8fCAhYXJndW1lbnRzWzBdLmlzSW50MzIoKSB8fCAhYXJndW1lbnRzWzFdLmlzU3RyaW5nKCkp
CisgICAgICAgIHJldHVybjsKKyAgICAvLyBGSVhNRTogU2hvdWxkIGNhbGwgVGVzdFNoZWxsRGV2
VG9vbHNBZ2VudDo6ZXZhbHVhdGVJbldlYkluc3BlY3RvcigpLgorfQorCit2b2lkIExheW91dFRl
c3RDb250cm9sbGVyOjpmb3JjZVJlZFNlbGVjdGlvbkNvbG9ycyhjb25zdCBDcHBBcmd1bWVudExp
c3QmIGFyZ3VtZW50cywgQ3BwVmFyaWFudCogcmVzdWx0KQoreworICAgIHJlc3VsdC0+c2V0TnVs
bCgpOworICAgIG1fc2hlbGwtPndlYlZpZXcoKS0+c2V0U2VsZWN0aW9uQ29sb3JzKDB4ZmZlZTAw
MDAsIDB4ZmYwMGVlMDAsIDB4ZmYwMDAwMDAsIDB4ZmZjMGMwYzApOworfQorCit2b2lkIExheW91
dFRlc3RDb250cm9sbGVyOjphZGRVc2VyU2NyaXB0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYgYXJn
dW1lbnRzLCBDcHBWYXJpYW50KiByZXN1bHQpCit7CisgICAgcmVzdWx0LT5zZXROdWxsKCk7Cisg
ICAgaWYgKGFyZ3VtZW50cy5zaXplKCkgPCAxIHx8ICFhcmd1bWVudHNbMF0uaXNTdHJpbmcoKSB8
fCAhYXJndW1lbnRzWzFdLmlzQm9vbCgpKQorICAgICAgICByZXR1cm47CisgICAgbV9zaGVsbC0+
d2ViVmlldygpLT5hZGRVc2VyU2NyaXB0KFdlYlN0cmluZzo6ZnJvbVVURjgoYXJndW1lbnRzWzBd
LnRvU3RyaW5nKCkpLCBhcmd1bWVudHNbMV0udG9Cb29sZWFuKCkpOworfQpkaWZmIC0tZ2l0IGEv
V2ViS2l0VG9vbHMvRHVtcFJlbmRlclRyZWUvY2hyb21pdW0vTGF5b3V0VGVzdENvbnRyb2xsZXIu
aCBiL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0xheW91dFRlc3RDb250cm9s
bGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE1NzJmNQotLS0gL2Rl
di9udWxsCisrKyBiL1dlYktpdFRvb2xzL0R1bXBSZW5kZXJUcmVlL2Nocm9taXVtL0xheW91dFRl
c3RDb250cm9sbGVyLmgKQEAgLTAsMCArMSw0NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTAgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAx
MCBQYXdlbCBIYWpkYW4gKHBoYWpkYW4uanJAY2hyb21pdW0ub3JnKQorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisg
KiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2Yg
aXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHBy
b2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHBy
aW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFO
RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor
ICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
SU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVD
SUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8qCisgIExheW91dFRlc3RDb250
cm9sbGVyIGNsYXNzOgorICBCb3VuZCB0byBhIEphdmFTY3JpcHQgd2luZG93LmxheW91dFRlc3RD
b250cm9sbGVyIG9iamVjdCB1c2luZyB0aGUKKyAgQ3BwQm91bmRDbGFzczo6YmluZFRvSmF2YXNj
cmlwdCgpLCB0aGlzIGFsbG93cyBsYXlvdXQgdGVzdHMgdGhhdCBhcmUgcnVuIGluCisgIHRoZSB0
ZXN0X3NoZWxsIChvciwgaW4gcHJpbmNpcGxlLCBhbnkgd2ViIHBhZ2UgbG9hZGVkIGludG8gYSBj
bGllbnQgYXBwIGJ1aWx0CisgIHdpdGggdGhpcyBjbGFzcykgdG8gY29udHJvbCB2YXJpb3VzIGFz
cGVjdHMgb2YgaG93IHRoZSB0ZXN0cyBhcmUgcnVuIGFuZCB3aGF0CisgIHNvcnQgb2Ygb3V0cHV0
IHRoZXkgcHJvZHVjZS4KKyovCisKKyNpZm5kZWYgTGF5b3V0VGVzdENvbnRyb2xsZXJfaAorI2Rl
ZmluZSBMYXlvdXRUZXN0Q29udHJvbGxlcl9oCisKKyNpbmNsdWRlICJDcHBCb3VuZENsYXNzLmgi
CisjaW5jbHVkZSAiYmFzZS90aW1lci5oIgorI2luY2x1ZGUgInB1YmxpYy9XZWJTdHJpbmcuaCIK
KyNpbmNsdWRlICJwdWJsaWMvV2ViVVJMLmgiCisjaW5jbHVkZSA8d3RmL0RlcXVlLmg+CisKK2Ns
YXNzIFRlc3RTaGVsbDsKKworY2xhc3MgTGF5b3V0VGVzdENvbnRyb2xsZXIgOiBwdWJsaWMgQ3Bw
Qm91bmRDbGFzcyB7CitwdWJsaWM6CisgICAgLy8gQnVpbGRzIHRoZSBwcm9wZXJ0eSBhbmQgbWV0
aG9kIGxpc3RzIG5lZWRlZCB0byBiaW5kIHRoaXMgY2xhc3MgdG8gYSBKUworICAgIC8vIG9iamVj
dC4KKyAgICBMYXlvdXRUZXN0Q29udHJvbGxlcihUZXN0U2hlbGwqKTsKKworICAgIC8vIFRoaXMg
ZnVuY3Rpb24gc2V0cyBhIGZsYWcgdGhhdCB0ZWxscyB0aGUgdGVzdF9zaGVsbCB0byBkdW1wIHBh
Z2VzIGFzCisgICAgLy8gcGxhaW4gdGV4dCwgcmF0aGVyIHRoYW4gYXMgYSB0ZXh0IHJlcHJlc2Vu
dGF0aW9uIG9mIHRoZSByZW5kZXJlcidzIHN0YXRlLgorICAgIC8vIEl0IHRha2VzIG5vIGFyZ3Vt
ZW50cywgYW5kIGlnbm9yZXMgYW55IHRoYXQgbWF5IGJlIHByZXNlbnQuCisgICAgdm9pZCBkdW1w
QXNUZXh0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFRo
aXMgZnVuY3Rpb24gc2hvdWxkIHNldCBhIGZsYWcgdGhhdCB0ZWxscyB0aGUgdGVzdF9zaGVsbCB0
byBwcmludCBhIGxpbmUKKyAgICAvLyBvZiBkZXNjcmlwdGl2ZSB0ZXh0IGZvciBlYWNoIGRhdGFi
YXNlIGNvbW1hbmQuICBJdCBzaG91bGQgdGFrZSBubworICAgIC8vIGFyZ3VtZW50cywgYW5kIGln
bm9yZSBhbnkgdGhhdCBtYXkgYmUgcHJlc2VudC4gSG93ZXZlciwgYXQgdGhlIG1vbWVudCwgd2UK
KyAgICAvLyBkb24ndCBoYXZlIGFueSBEQiBmdW5jdGlvbiB0aGF0IHByaW50cyBtZXNzYWdlcywg
c28gZm9yIG5vdyB0aGlzIGZ1bmN0aW9uCisgICAgLy8gZG9lc24ndCBkbyBhbnl0aGluZy4KKyAg
ICB2b2lkIGR1bXBEYXRhYmFzZUNhbGxiYWNrcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50Kik7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYSBmbGFnIHRoYXQgdGVsbHMg
dGhlIHRlc3Rfc2hlbGwgdG8gcHJpbnQgYSBsaW5lIG9mCisgICAgLy8gZGVzY3JpcHRpdmUgdGV4
dCBmb3IgZWFjaCBlZGl0aW5nIGNvbW1hbmQuICBJdCB0YWtlcyBubyBhcmd1bWVudHMsIGFuZAor
ICAgIC8vIGlnbm9yZXMgYW55IHRoYXQgbWF5IGJlIHByZXNlbnQuCisgICAgdm9pZCBkdW1wRWRp
dGluZ0NhbGxiYWNrcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAg
ICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYSBmbGFnIHRoYXQgdGVsbHMgdGhlIHRlc3Rfc2hlbGwg
dG8gcHJpbnQgYSBsaW5lIG9mCisgICAgLy8gZGVzY3JpcHRpdmUgdGV4dCBmb3IgZWFjaCBmcmFt
ZSBsb2FkIGNhbGxiYWNrLiAgSXQgdGFrZXMgbm8gYXJndW1lbnRzLCBhbmQKKyAgICAvLyBpZ25v
cmVzIGFueSB0aGF0IG1heSBiZSBwcmVzZW50LgorICAgIHZvaWQgZHVtcEZyYW1lTG9hZENhbGxi
YWNrcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBUaGlz
IGZ1bmN0aW9uIHNldHMgYSBmbGFnIHRoYXQgdGVsbHMgdGhlIHRlc3Rfc2hlbGwgdG8gcHJpbnQg
b3V0IGEgdGV4dAorICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiYWNrL2ZvcndhcmQgbGlz
dC4gIEl0IGlnbm9yZXMgYWxsIGFyZ3VtZW50cy4KKyAgICB2b2lkIGR1bXBCYWNrRm9yd2FyZExp
c3QoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gVGhpcyBm
dW5jdGlvbiBzZXRzIGEgZmxhZyB0aGF0IHRlbGxzIHRoZSB0ZXN0X3NoZWxsIHRvIHByaW50IG91
dCB0aGUKKyAgICAvLyBzY3JvbGwgb2Zmc2V0cyBvZiB0aGUgY2hpbGQgZnJhbWVzLiAgSXQgaWdu
b3JlcyBhbGwuCisgICAgdm9pZCBkdW1wQ2hpbGRGcmFtZVNjcm9sbFBvc2l0aW9ucyhjb25zdCBD
cHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNl
dHMgYSBmbGFnIHRoYXQgdGVsbHMgdGhlIHRlc3Rfc2hlbGwgdG8gcmVjdXJzaXZlbHkKKyAgICAv
LyBkdW1wIGFsbCBmcmFtZXMgYXMgcGxhaW4gdGV4dCBpZiB0aGUgZHVtcEFzVGV4dCBmbGFnIGlz
IHNldC4KKyAgICAvLyBJdCB0YWtlcyBubyBhcmd1bWVudHMsIGFuZCBpZ25vcmVzIGFueSB0aGF0
IG1heSBiZSBwcmVzZW50LgorICAgIHZvaWQgZHVtcENoaWxkRnJhbWVzQXNUZXh0KGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gc2V0
cyBhIGZsYWcgdGhhdCB0ZWxscyB0aGUgdGVzdF9zaGVsbCB0byBkdW1wIGFsbCBjYWxscworICAg
IC8vIHRvIHdpbmRvdy5zdGF0dXMoKS4KKyAgICAvLyBJdCB0YWtlcyBubyBhcmd1bWVudHMsIGFu
ZCBpZ25vcmVzIGFueSB0aGF0IG1heSBiZSBwcmVzZW50LgorICAgIHZvaWQgZHVtcFdpbmRvd1N0
YXR1c0NoYW5nZXMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAg
Ly8gV2hlbiBjYWxsZWQgd2l0aCBhIGJvb2xlYW4gYXJndW1lbnQsIHRoaXMgc2V0cyBhIGZsYWcg
dGhhdCBjb250cm9scworICAgIC8vIHdoZXRoZXIgY29udGVudC1lZGl0YWJsZSBlbGVtZW50cyBh
Y2NlcHQgZWRpdGluZyBmb2N1cyB3aGVuIGFuIGVkaXRpbmcKKyAgICAvLyBhdHRlbXB0IGlzIG1h
ZGUuIEl0IGlnbm9yZXMgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzLgorICAgIHZvaWQgc2V0QWNj
ZXB0c0VkaXRpbmcoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAg
Ly8gRnVuY3Rpb25zIGZvciBkZWFsaW5nIHdpdGggd2luZG93cy4gIEJ5IGRlZmF1bHQgd2UgYmxv
Y2sgYWxsIG5ldyB3aW5kb3dzLgorICAgIHZvaWQgd2luZG93Q291bnQoY29uc3QgQ3BwQXJndW1l
bnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgc2V0Q2FuT3BlbldpbmRvd3MoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgc2V0Q2xvc2VSZW1haW5p
bmdXaW5kb3dzV2hlbkNvbXBsZXRlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQq
KTsKKworICAgIC8vIEJ5IGRlZmF1bHQsIHRlc3RzIGVuZCB3aGVuIHBhZ2UgbG9hZCBpcyBjb21w
bGV0ZS4gIFRoZXNlIG1ldGhvZHMgYXJlIHVzZWQKKyAgICAvLyB0byBkZWxheSB0aGUgY29tcGxl
dGlvbiBvZiB0aGUgdGVzdCB1bnRpbCBub3RpZnlEb25lIGlzIGNhbGxlZC4KKyAgICB2b2lkIHdh
aXRVbnRpbERvbmUoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZv
aWQgbm90aWZ5RG9uZShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAg
dm9pZCBub3RpZnlEb25lVGltZWRPdXQoKTsKKworICAgIC8vIE1ldGhvZHMgZm9yIGFkZGluZyBh
Y3Rpb25zIHRvIHRoZSB3b3JrIHF1ZXVlLiAgVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCisgICAg
Ly8gd2FpdFVudGlsRG9uZS9ub3RpZnlEb25lIGFib3ZlLgorICAgIHZvaWQgcXVldWVCYWNrTmF2
aWdhdGlvbihjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBx
dWV1ZUZvcndhcmROYXZpZ2F0aW9uKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQq
KTsKKyAgICB2b2lkIHF1ZXVlUmVsb2FkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlh
bnQqKTsKKyAgICB2b2lkIHF1ZXVlTG9hZGluZ1NjcmlwdChjb25zdCBDcHBBcmd1bWVudExpc3Qm
LCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBxdWV1ZU5vbkxvYWRpbmdTY3JpcHQoY29uc3QgQ3Bw
QXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgcXVldWVMb2FkKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEFsdGhvdWdoIHRoaXMgaXMg
bmFtZWQgIm9iakMiIHRvIG1hdGNoIHRoZSBNYWMgdmVyc2lvbiwgaXQgYWN0dWFsbHkgdGVzdHMK
KyAgICAvLyB0aGUgaWRlbnRpdHkgb2YgaXRzIHR3byBhcmd1bWVudHMgaW4gQysrLgorICAgIHZv
aWQgb2JqQ0lkZW50aXR5SXNFcXVhbChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
Kik7CisKKyAgICAvLyBDaGFuZ2VzIHRoZSBjb29raWUgcG9saWN5IGZyb20gdGhlIGRlZmF1bHQg
dG8gYWxsb3cgYWxsIGNvb2tpZXMuCisgICAgdm9pZCBzZXRBbHdheXNBY2NlcHRDb29raWVzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEdpdmVzIGZvY3Vz
IHRvIHRoZSB3aW5kb3cuCisgICAgdm9pZCBzZXRXaW5kb3dJc0tleShjb25zdCBDcHBBcmd1bWVu
dExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBNZXRob2QgdGhhdCBjb250cm9scyB3aGV0
aGVyIHByZXNzaW5nIFRhYiBrZXkgY3ljbGVzIHRocm91Z2ggcGFnZSBlbGVtZW50cworICAgIC8v
IG9yIGluc2VydHMgYSAnXHQnIGNoYXIgaW4gdGV4dCBhcmVhCisgICAgdm9pZCBzZXRUYWJLZXlD
eWNsZXNUaHJvdWdoRWxlbWVudHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCop
OworCisgICAgLy8gUGFzc2VzIHRocm91Z2ggdG8gV2ViUHJlZmVyZW5jZXMgd2hpY2ggYWxsb3dz
IHRoZSB1c2VyIHRvIGhhdmUgYSBjdXN0b20KKyAgICAvLyBzdHlsZSBzaGVldC4KKyAgICB2b2lk
IHNldFVzZXJTdHlsZVNoZWV0RW5hYmxlZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJp
YW50Kik7CisgICAgdm9pZCBzZXRVc2VyU3R5bGVTaGVldExvY2F0aW9uKGNvbnN0IENwcEFyZ3Vt
ZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIFB1dHMgV2Via2l0IGluICJkYXNoYm9h
cmQgY29tcGF0aWJpbGl0eSBtb2RlIiwgd2hpY2ggaXMgdXNlZCBpbiBvYnNjdXJlCisgICAgLy8g
TWFjLW9ubHkgY2lyY3Vtc3RhbmNlcy4gSXQncyBub3QgcmVhbGx5IG5lY2Vzc2FyeSwgYW5kIHdp
bGwgbW9zdCBsaWtlbHkKKyAgICAvLyBuZXZlciBiZSB1c2VkIGJ5IENocm9tZSwgYnV0IHNvbWUg
bGF5b3V0IHRlc3RzIGRlcGVuZCBvbiBpdHMgcHJlc2VuY2UuCisgICAgdm9pZCBzZXRVc2VEYXNo
Ym9hcmRDb21wYXRpYmlsaXR5TW9kZShjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50
Kik7CisKKyAgICAvLyBDYXVzZXMgbmF2aWdhdGlvbiBhY3Rpb25zIGp1c3QgcHJpbnRvdXQgdGhl
IGludGVuZGVkIG5hdmlnYXRpb24gaW5zdGVhZAorICAgIC8vIG9mIHRha2luZyB5b3UgdG8gdGhl
IHBhZ2UuIFRoaXMgaXMgdXNlZCBmb3IgY2FzZXMgbGlrZSBtYWlsdG8sIHdoZXJlIHlvdQorICAg
IC8vIGRvbid0IGFjdHVhbGx5IHdhbnQgdG8gb3BlbiB0aGUgbWFpbCBwcm9ncmFtLgorICAgIHZv
aWQgc2V0Q3VzdG9tUG9saWN5RGVsZWdhdGUoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFy
aWFudCopOworCisgICAgLy8gRGVsYXlzIGNvbXBsZXRpb24gb2YgdGhlIHRlc3QgdW50aWwgdGhl
IHBvbGljeSBkZWxlZ2F0ZSBydW5zLgorICAgIHZvaWQgd2FpdEZvclBvbGljeURlbGVnYXRlKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIENhdXNlcyBXaWxs
U2VuZFJlcXVlc3QgdG8gYmxvY2sgcmVkaXJlY3RzLgorICAgIHZvaWQgc2V0V2lsbFNlbmRSZXF1
ZXN0UmV0dXJuc051bGxPblJlZGlyZWN0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlh
bnQqKTsKKworICAgIC8vIENhdXNlcyBXaWxsU2VuZFJlcXVlc3QgdG8gcmV0dXJuIGFuIGVtcHR5
IHJlcXVlc3QuCisgICAgdm9pZCBzZXRXaWxsU2VuZFJlcXVlc3RSZXR1cm5zTnVsbChjb25zdCBD
cHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBDb252ZXJ0cyBhIFVSTCBz
dGFydGluZyB3aXRoIGZpbGU6Ly8vdG1wLyB0byB0aGUgbG9jYWwgbWFwcGluZy4KKyAgICB2b2lk
IHBhdGhUb0xvY2FsUmVzb3VyY2UoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCop
OworCisgICAgLy8gU2V0cyBhIGJvb2wgc3VjaCB0aGF0IHdoZW4gYSBkcmFnIGlzIHN0YXJ0ZWQs
IHdlIGZpbGwgdGhlIGRyYWcgY2xpcGJvYXJkCisgICAgLy8gd2l0aCBhIGZha2UgZmlsZSBvYmpl
Y3QuCisgICAgdm9pZCBhZGRGaWxlVG9QYXN0ZWJvYXJkT25EcmFnKGNvbnN0IENwcEFyZ3VtZW50
TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEV4ZWN1dGVzIGFuIGludGVybmFsIGNvbW1h
bmQgKHN1cGVyc2V0IG9mIGRvY3VtZW50LmV4ZWNDb21tYW5kKCkgY29tbWFuZHMpLgorICAgIHZv
aWQgZXhlY0NvbW1hbmQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisg
ICAgLy8gQ2hlY2tzIGlmIGFuIGludGVybmFsIGNvbW1hbmQgaXMgY3VycmVudGx5IGF2YWlsYWJs
ZS4KKyAgICB2b2lkIGlzQ29tbWFuZEVuYWJsZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3Bw
VmFyaWFudCopOworCisgICAgLy8gU2V0IHRoZSBXZWJQcmVmZXJlbmNlIHRoYXQgY29udHJvbHMg
d2Via2l0J3MgcG9wdXAgYmxvY2tpbmcuCisgICAgdm9pZCBzZXRQb3B1cEJsb2NraW5nRW5hYmxl
ZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAvLyBJZiB0cnVl
LCBjYXVzZXMgcHJvdmlzaW9uYWwgZnJhbWUgbG9hZHMgdG8gYmUgc3RvcHBlZCBmb3IgdGhlIHJl
bWFpbmRlciBvZgorICAgIC8vIHRoZSB0ZXN0LgorICAgIHZvaWQgc2V0U3RvcFByb3Zpc2lvbmFs
RnJhbWVMb2Fkcyhjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAv
LyBFbmFibGUgb3IgZGlzYWJsZSBzbWFydCBpbnNlcnQvZGVsZXRlLiAgVGhpcyBpcyBlbmFibGVk
IGJ5IGRlZmF1bHQuCisgICAgdm9pZCBzZXRTbWFydEluc2VydERlbGV0ZUVuYWJsZWQoY29uc3Qg
Q3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gRW5hYmxlIG9yIGRpc2Fi
bGUgdHJhaWxpbmcgd2hpdGVzcGFjZSBzZWxlY3Rpb24gb24gZG91YmxlIGNsaWNrLgorICAgIHZv
aWQgc2V0U2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZChjb25zdCBDcHBBcmd1bWVudExp
c3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICB2b2lkIHBhdXNlQW5pbWF0aW9uQXRUaW1lT25FbGVt
ZW50V2l0aElkKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lk
IHBhdXNlVHJhbnNpdGlvbkF0VGltZU9uRWxlbWVudFdpdGhJZChjb25zdCBDcHBBcmd1bWVudExp
c3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBlbGVtZW50RG9lc0F1dG9Db21wbGV0ZUZvckVs
ZW1lbnRXaXRoSWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZv
aWQgbnVtYmVyT2ZBY3RpdmVBbmltYXRpb25zKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKworICAgIHZvaWQgZGlzYWJsZUltYWdlTG9hZGluZyhjb25zdCBDcHBBcmd1bWVu
dExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICB2b2lkIHNldEljb25EYXRhYmFzZUVuYWJsZWQo
Y29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgdm9pZCBkdW1wU2Vs
ZWN0aW9uUmVjdChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisKKyAgICAv
LyBUaGUgZm9sbG93aW5nIGFyZSBvbmx5IHN0dWJzLiAgVE9ETyhwYW1nKTogSW1wbGVtZW50IGFu
eSBvZiB0aGVzZSB0aGF0CisgICAgLy8gYXJlIG5lZWRlZCB0byBwYXNzIHRoZSBsYXlvdXQgdGVz
dHMuCisgICAgdm9pZCBkdW1wQXNXZWJBcmNoaXZlKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENw
cFZhcmlhbnQqKTsKKyAgICB2b2lkIGR1bXBUaXRsZUNoYW5nZXMoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgZHVtcFJlc291cmNlTG9hZENhbGxiYWNrcyhj
b25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBzZXRNYWluRnJh
bWVJc0ZpcnN0UmVzcG9uZGVyKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsK
KyAgICB2b2lkIGRpc3BsYXkoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOwor
ICAgIHZvaWQgdGVzdFJlcGFpbnQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCop
OworICAgIHZvaWQgcmVwYWludFN3ZWVwSG9yaXpvbnRhbGx5KGNvbnN0IENwcEFyZ3VtZW50TGlz
dCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGNsZWFyQmFja0ZvcndhcmRMaXN0KGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIGtlZXBXZWJIaXN0b3J5KGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHN0b3JlV2ViU2Ny
aXB0T2JqZWN0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lk
IGFjY2Vzc1N0b3JlZFdlYlNjcmlwdE9iamVjdChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50Kik7CisgICAgdm9pZCBvYmpDQ2xhc3NOYW1lT2YoY29uc3QgQ3BwQXJndW1lbnRMaXN0
JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgYWRkRGlzYWxsb3dlZFVSTChjb25zdCBDcHBBcmd1
bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBzZXRDYWxsQ2xvc2VPbldlYlZpZXdz
KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKyAgICB2b2lkIHNldFByaXZh
dGVCcm93c2luZ0VuYWJsZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOwor
CisgICAgdm9pZCBzZXRYU1NBdWRpdG9yRW5hYmxlZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBD
cHBWYXJpYW50Kik7CisgICAgdm9pZCBldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZChjb25z
dCBDcHBBcmd1bWVudExpc3QmLCBDcHBWYXJpYW50Kik7CisgICAgdm9pZCBvdmVycmlkZVByZWZl
cmVuY2UoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIHZvaWQgc2V0
QWxsb3dVbml2ZXJzYWxBY2Nlc3NGcm9tRmlsZVVSTHMoY29uc3QgQ3BwQXJndW1lbnRMaXN0Jiwg
Q3BwVmFyaWFudCopOworICAgIHZvaWQgc2V0QWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVVUkxzKGNv
bnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworCisgICAgLy8gVGhlIGZhbGxi
YWNrIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG5vbmV4aXN0ZW50IG1ldGhvZCBpcyBjYWxsZWQg
b24KKyAgICAvLyB0aGUgbGF5b3V0IHRlc3QgY29udHJvbGxlciBvYmplY3QuCisgICAgLy8gSXQg
aXMgdXNlZnVsbCB0byBjYXRjaCB0eXBvcyBpbiB0aGUgSmF2YVNjcmlwdCBjb2RlIChhIGZldyBs
YXlvdXQgdGVzdHMKKyAgICAvLyBkbyBoYXZlIHR5cG9zIGluIHRoZW0pIGFuZCBpdCBhbGxvd3Mg
dGhlIHNjcmlwdCB0byBjb250aW51ZSBydW5uaW5nIGluCisgICAgLy8gdGhhdCBjYXNlIChhcyB0
aGUgTWFjIGRvZXMpLgorICAgIHZvaWQgZmFsbGJhY2tNZXRob2QoY29uc3QgQ3BwQXJndW1lbnRM
aXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gQWxsb3dzIGxheW91dCB0ZXN0cyB0byBjYWxs
IFNlY3VyaXR5T3JpZ2luOjp3aGl0ZUxpc3RBY2Nlc3NGcm9tT3JpZ2luKCkuCisgICAgdm9pZCB3
aGl0ZUxpc3RBY2Nlc3NGcm9tT3JpZ2luKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlh
bnQqKTsKKworICAgIC8vIENsZWFycyBhbGwgZGF0YWJhc2VzLgorICAgIHZvaWQgY2xlYXJBbGxE
YXRhYmFzZXMoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworICAgIC8vIFNl
dHMgdGhlIGRlZmF1bHQgcXVvdGEgZm9yIGFsbCBvcmlnaW5zCisgICAgdm9pZCBzZXREYXRhYmFz
ZVF1b3RhKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIENh
bGxzIHNldGxvY2FsZShMQ19BTEwsIC4uLikgZm9yIGEgc3BlY2lmaWVkIGxvY2FsZS4KKyAgICAv
LyBSZXNldHMgYmV0d2VlbiB0ZXN0cy4KKyAgICB2b2lkIHNldFBPU0lYTG9jYWxlKGNvbnN0IENw
cEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEdldHMgdGhlIHZhbHVlIG9m
IHRoZSBjb3VudGVyIGluIHRoZSBlbGVtZW50IHNwZWNpZmllZCBieSBpdHMgSUQuCisgICAgdm9p
ZCBjb3VudGVyVmFsdWVGb3JFbGVtZW50QnlJZChjb25zdCBDcHBBcmd1bWVudExpc3QmLCBDcHBW
YXJpYW50Kik7CisKKyAgICAvLyBHZXRzIHRoZSBudW1iZXIgb2YgcGFnZSB3aGVyZSB0aGUgc3Bl
Y2lmaWVkIGVsZW1lbnQgd2lsbCBiZSBwdXQuCisgICAgdm9pZCBwYWdlTnVtYmVyRm9yRWxlbWVu
dEJ5SWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFyaWFudCopOworCisgICAgLy8gR2V0
cyB0aGUgbnVtYmVyIG9mIHBhZ2VzIHRvIGJlIHByaW50ZWQuCisgICAgdm9pZCBudW1iZXJPZlBh
Z2VzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworCisgICAgLy8gQWxs
b3dzIGxheW91dCB0ZXN0cyB0byBzdGFydCBUaW1lbGluZSBwcm9maWxpbmcuCisgICAgdm9pZCBz
ZXRUaW1lbGluZVByb2ZpbGluZ0VuYWJsZWQoY29uc3QgQ3BwQXJndW1lbnRMaXN0JiwgQ3BwVmFy
aWFudCopOworCisgICAgLy8gQWxsb3dzIGxheW91dCB0ZXN0cyB0byBleGVjIHNjcmlwdHMgYXQg
V2ViSW5zcGVjdG9yIHNpZGUuCisgICAgdm9pZCBldmFsdWF0ZUluV2ViSW5zcGVjdG9yKGNvbnN0
IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKworICAgIC8vIEZvcmNlcyB0aGUgc2Vs
ZWN0aW9uIGNvbG9ycyBmb3IgdGVzdGluZyB1bmRlciBMaW51eC4KKyAgICB2b2lkIGZvcmNlUmVk
U2VsZWN0aW9uQ29sb3JzKGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZhcmlhbnQqKTsKKwor
ICAgIC8vIEFkZHMgYSB1c2VyIHNjcmlwdCB0byBiZSBpbmplY3RlZCBpbnRvIG5ldyBkb2N1bWVu
dHMuCisgICAgdm9pZCBhZGRVc2VyU2NyaXB0KGNvbnN0IENwcEFyZ3VtZW50TGlzdCYsIENwcFZh
cmlhbnQqKTsKKworcHVibGljOgorICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgbm90
IGV4cG9zZWQgdG8gSmF2YVNjcmlwdC4KKyAgICB2b2lkIHNldFdvcmtRdWV1ZUZyb3plbihib29s
IGZyb3plbikgeyBtX3dvcmtRdWV1ZS5zZXRGcm96ZW4oZnJvemVuKTsgfQorCisgICAgYm9vbCBz
aG91bGREdW1wQXNUZXh0KCkgeyByZXR1cm4gbV9kdW1wQXNUZXh0OyB9CisgICAgYm9vbCBzaG91
bGREdW1wRWRpdGluZ0NhbGxiYWNrcygpIHsgcmV0dXJuIG1fZHVtcEVkaXRpbmdDYWxsYmFja3M7
IH0KKyAgICBib29sIHNob3VsZER1bXBGcmFtZUxvYWRDYWxsYmFja3MoKSB7IHJldHVybiBtX2R1
bXBGcmFtZUxvYWRDYWxsYmFja3M7IH0KKyAgICB2b2lkIHNldFNob3VsZER1bXBGcmFtZUxvYWRD
YWxsYmFja3MoYm9vbCB2YWx1ZSkgeyBtX2R1bXBGcmFtZUxvYWRDYWxsYmFja3MgPSB2YWx1ZTsg
fQorICAgIGJvb2wgc2hvdWxkRHVtcFJlc291cmNlTG9hZENhbGxiYWNrcygpIHtyZXR1cm4gbV9k
dW1wUmVzb3VyY2VMb2FkQ2FsbGJhY2tzOyB9CisgICAgYm9vbCBzaG91bGREdW1wU3RhdHVzQ2Fs
bGJhY2tzKCkgeyByZXR1cm4gbV9kdW1wV2luZG93U3RhdHVzQ2hhbmdlczsgfQorICAgIGJvb2wg
c2hvdWxkRHVtcFNlbGVjdGlvblJlY3QoKSB7IHJldHVybiBtX2R1bXBTZWxlY3Rpb25SZWN0OyB9
CisgICAgYm9vbCBzaG91bGREdW1wQmFja0ZvcndhcmRMaXN0KCkgeyByZXR1cm4gbV9kdW1wQmFj
a0ZvcndhcmRMaXN0OyB9CisgICAgYm9vbCBzaG91bGREdW1wVGl0bGVDaGFuZ2VzKCkgeyByZXR1
cm4gbV9kdW1wVGl0bGVDaGFuZ2VzOyB9CisgICAgYm9vbCBzaG91bGREdW1wQ2hpbGRGcmFtZVNj
cm9sbFBvc2l0aW9ucygpIHsgcmV0dXJuIG1fZHVtcENoaWxkRnJhbWVTY3JvbGxQb3NpdGlvbnM7
IH0KKyAgICBib29sIHNob3VsZER1bXBDaGlsZEZyYW1lc0FzVGV4dCgpIHsgcmV0dXJuIG1fZHVt
cENoaWxkRnJhbWVzQXNUZXh0OyB9CisgICAgYm9vbCBhY2NlcHRzRWRpdGluZygpIHsgcmV0dXJu
IG1fYWNjZXB0c0VkaXRpbmc7IH0KKyAgICBib29sIGNhbk9wZW5XaW5kb3dzKCkgeyByZXR1cm4g
bV9jYW5PcGVuV2luZG93czsgfQorICAgIGJvb2wgc2hvdWxkQWRkRmlsZVRvUGFzdGVib2FyZCgp
IHsgcmV0dXJuIG1fc2hvdWxkQWRkRmlsZVRvUGFzdGVib2FyZDsgfQorICAgIGJvb2wgc3RvcFBy
b3Zpc2lvbmFsRnJhbWVMb2FkcygpIHsgcmV0dXJuIG1fc3RvcFByb3Zpc2lvbmFsRnJhbWVMb2Fk
czsgfQorCisgICAgYm9vbCB0ZXN0UmVwYWludCgpIGNvbnN0IHsgcmV0dXJuIG1fdGVzdFJlcGFp
bnQ7IH0KKyAgICBib29sIHN3ZWVwSG9yaXpvbnRhbGx5KCkgY29uc3QgeyByZXR1cm4gbV9zd2Vl
cEhvcml6b250YWxseTsgfQorCisgICAgLy8gQ2FsbGVkIGJ5IHRoZSB3ZWJ2aWV3IGRlbGVnYXRl
IHdoZW4gdGhlIHRvcGxldmVsIGZyYW1lIGxvYWQgaXMgZG9uZS4KKyAgICB2b2lkIGxvY2F0aW9u
Q2hhbmdlRG9uZSgpOworCisgICAgLy8gQ2FsbGVkIGJ5IHRoZSB3ZWJ2aWV3IGRlbGVnYXRlIHdo
ZW4gdGhlIHBvbGljeSBkZWxlZ2F0ZSBydW5zIGlmIHRoZQorICAgIC8vIHdhaXRGb3JQb2xpY3lE
ZWxlZ2F0ZSB3YXMgY2FsbGVkLgorICAgIHZvaWQgcG9saWN5RGVsZWdhdGVEb25lKCk7CisKKyAg
ICAvLyBSZWluaXRpYWxpemVzIGFsbCBzdGF0aWMgdmFsdWVzLiAgVGhlIHJlc2V0KCkgbWV0aG9k
IHNob3VsZCBiZSBjYWxsZWQKKyAgICAvLyBiZWZvcmUgdGhlIHN0YXJ0IG9mIGVhY2ggdGVzdCAo
Y3VycmVudGx5IGZyb20KKyAgICAvLyBUZXN0U2hlbGw6OnJ1bkZpbGVUZXN0KS4KKyAgICB2b2lk
IHJlc2V0KCk7CisKKyAgICAvLyBBIHNpbmdsZSBpdGVtIGluIHRoZSB3b3JrIHF1ZXVlLgorICAg
IGNsYXNzIFdvcmtJdGVtIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfldvcmtJdGVt
KCkge30KKworICAgICAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdGFydGVkIGEgbG9hZC4K
KyAgICAgICAgdmlydHVhbCBib29sIHJ1bihUZXN0U2hlbGwqIHNoZWxsKSA9IDA7CisgICAgfTsK
KworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgV29ya0l0ZW07CisgICAgZnJpZW5kIGNsYXNz
IFdvcmtRdWV1ZTsKKworICAgIC8vIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgZXZlbnRzIHF1
ZXVlZCBieSBtZXRob2RzIGxpa2UgcXVldWVMb2FkIG9yCisgICAgLy8gcXVldWVTY3JpcHQuCisg
ICAgY2xhc3MgV29ya1F1ZXVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFdvcmtRdWV1ZShMYXlv
dXRUZXN0Q29udHJvbGxlciogY29udHJvbGxlcikgOiBtX2NvbnRyb2xsZXIoY29udHJvbGxlcikg
e30KKyAgICAgICAgdmlydHVhbCB+V29ya1F1ZXVlKCk7CisgICAgICAgIHZvaWQgcHJvY2Vzc1dv
cmtTb29uKCk7CisKKyAgICAgICAgLy8gUmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBjbGFzcyBiZXR3
ZWVuIHRlc3RzLgorICAgICAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAgICAgdm9pZCBhZGRXb3Jr
KFdvcmtJdGVtKiB3b3JrKTsKKworICAgICAgICB2b2lkIHNldEZyb3plbihib29sIGZyb3plbikg
eyBtX2Zyb3plbiA9IGZyb3plbjsgfQorICAgICAgICBib29sIGlzRW1wdHkoKSB7IHJldHVybiBt
X3F1ZXVlLmlzRW1wdHkoKTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBwcm9jZXNz
V29yaygpOworCisgICAgICAgIGJhc2U6Ok9uZVNob3RUaW1lcjxXb3JrUXVldWU+IG1fdGltZXI7
CisgICAgICAgIERlcXVlPFdvcmtJdGVtKj4gbV9xdWV1ZTsKKyAgICAgICAgYm9vbCBtX2Zyb3pl
bjsKKyAgICAgICAgTGF5b3V0VGVzdENvbnRyb2xsZXIqIG1fY29udHJvbGxlcjsKKyAgICB9Owor
CisgICAgLy8gU3VwcG9ydCBmb3Igb3ZlcnJpZGVQcmVmZXJlbmNlLgorICAgIGJvb2wgY3BwVmFy
aWFudFRvQm9vbChjb25zdCBDcHBWYXJpYW50Jik7CisgICAgaW50MzJfdCBjcHBWYXJpYW50VG9J
bnQzMihjb25zdCBDcHBWYXJpYW50Jik7CisgICAgV2ViS2l0OjpXZWJTdHJpbmcgY3BwVmFyaWFu
dFRvV2ViU3RyaW5nKGNvbnN0IENwcFZhcmlhbnQmKTsKKworICAgIHZvaWQgbG9nRXJyb3JUb0Nv
bnNvbGUoY29uc3Qgc3RkOjpzdHJpbmcmKTsKKyAgICB2b2lkIGNvbXBsZXRlTm90aWZ5RG9uZShi
b29sIGlzVGltZW91dCk7CisKKyAgICBib29sIHBhdXNlQW5pbWF0aW9uQXRUaW1lT25FbGVtZW50
V2l0aElkKGNvbnN0IFdlYktpdDo6V2ViU3RyaW5nJiBhbmltYXRpb25OYW1lLCBkb3VibGUgdGlt
ZSwgY29uc3QgV2ViS2l0OjpXZWJTdHJpbmcmIGVsZW1lbnRJZCk7CisgICAgYm9vbCBwYXVzZVRy
YW5zaXRpb25BdFRpbWVPbkVsZW1lbnRXaXRoSWQoY29uc3QgV2ViS2l0OjpXZWJTdHJpbmcmIHBy
b3BlcnR5TmFtZSwgZG91YmxlIHRpbWUsIGNvbnN0IFdlYktpdDo6V2ViU3RyaW5nJiBlbGVtZW50
SWQpOworICAgIGJvb2wgZWxlbWVudERvZXNBdXRvQ29tcGxldGVGb3JFbGVtZW50V2l0aElkKGNv
bnN0IFdlYktpdDo6V2ViU3RyaW5nJik7CisgICAgaW50IG51bWJlck9mQWN0aXZlQW5pbWF0aW9u
cygpOworCisgICAgLy8gVXNlZCBmb3IgdGVzdCB0aW1lb3V0cy4KKyAgICBTY29wZWRSdW5uYWJs
ZU1ldGhvZEZhY3Rvcnk8TGF5b3V0VGVzdENvbnRyb2xsZXI+IG1fdGltZW91dEZhY3Rvcnk7CisK
KyAgICAvLyBOb24tb3duaW5nIHBvaW50ZXIuICBUaGUgTGF5b3V0VGVzdENvbnRyb2xsZXIgaXMg
b3duZWQgYnkgdGhlIGhvc3QuCisgICAgVGVzdFNoZWxsKiBtX3NoZWxsOworCisgICAgLy8gSWYg
dHJ1ZSwgdGhlIHRlc3Rfc2hlbGwgd2lsbCBwcm9kdWNlIGEgcGxhaW4gdGV4dCBkdW1wIHJhdGhl
ciB0aGFuIGEKKyAgICAvLyB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZW5kZXJlci4KKyAg
ICBib29sIG1fZHVtcEFzVGV4dDsKKworICAgIC8vIElmIHRydWUsIHRoZSB0ZXN0X3NoZWxsIHdp
bGwgd3JpdGUgYSBkZXNjcmlwdGl2ZSBsaW5lIGZvciBlYWNoIGVkaXRpbmcKKyAgICAvLyBjb21t
YW5kLgorICAgIGJvb2wgbV9kdW1wRWRpdGluZ0NhbGxiYWNrczsKKworICAgIC8vIElmIHRydWUs
IHRoZSB0ZXN0X3NoZWxsIHdpbGwgZHJhdyB0aGUgYm91bmRzIG9mIHRoZSBjdXJyZW50IHNlbGVj
dGlvbiByZWN0CisgICAgLy8gdGFraW5nIHBvc3NpYmxlIHRyYW5zZm9ybXMgb2YgdGhlIHNlbGVj
dGlvbiByZWN0IGludG8gYWNjb3VudC4KKyAgICBib29sIG1fZHVtcFNlbGVjdGlvblJlY3Q7CisK
KyAgICAvLyBJZiB0cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxsIG91dHB1dCBhIGRlc2NyaXB0aXZl
IGxpbmUgZm9yIGVhY2ggZnJhbWUKKyAgICAvLyBsb2FkIGNhbGxiYWNrLgorICAgIGJvb2wgbV9k
dW1wRnJhbWVMb2FkQ2FsbGJhY2tzOworCisgICAgLy8gSWYgdHJ1ZSwgdGhlIHRlc3Rfc2hlbGwg
d2lsbCBvdXRwdXQgYSBkZXNjcmlwdGl2ZSBsaW5lIGZvciBlYWNoIHJlc291cmNlCisgICAgLy8g
bG9hZCBjYWxsYmFjay4KKyAgICBib29sIG1fZHVtcFJlc291cmNlTG9hZENhbGxiYWNrczsKKwor
ICAgIC8vIElmIHRydWUsIHRoZSB0ZXN0X3NoZWxsIHdpbGwgcHJvZHVjZSBhIGR1bXAgb2YgdGhl
IGJhY2sgZm9yd2FyZCBsaXN0IGFzCisgICAgLy8gd2VsbC4KKyAgICBib29sIG1fZHVtcEJhY2tG
b3J3YXJkTGlzdDsKKworICAgIC8vIElmIHRydWUsIHRoZSB0ZXN0X3NoZWxsIHdpbGwgcHJpbnQg
b3V0IHRoZSBjaGlsZCBmcmFtZSBzY3JvbGwgb2Zmc2V0cyBhcworICAgIC8vIHdlbGwuCisgICAg
Ym9vbCBtX2R1bXBDaGlsZEZyYW1lU2Nyb2xsUG9zaXRpb25zOworCisgICAgLy8gSWYgdHJ1ZSBh
bmQgaWYgZHVtcF9hc190ZXh0XyBpcyB0cnVlLCB0aGUgdGVzdF9zaGVsbCB3aWxsIHJlY3Vyc2l2
ZWx5CisgICAgLy8gZHVtcCBhbGwgZnJhbWVzIGFzIHBsYWluIHRleHQuCisgICAgYm9vbCBtX2R1
bXBDaGlsZEZyYW1lc0FzVGV4dDsKKworICAgIC8vIElmIHRydWUsIHRoZSB0ZXN0X3NoZWxsIHdp
bGwgZHVtcCBhbGwgY2hhbmdlcyB0byB3aW5kb3cuc3RhdHVzLgorICAgIGJvb2wgbV9kdW1wV2lu
ZG93U3RhdHVzQ2hhbmdlczsKKworICAgIC8vIElmIHRydWUsIG91dHB1dCBhIG1lc3NhZ2Ugd2hl
biB0aGUgcGFnZSB0aXRsZSBpcyBjaGFuZ2VkLgorICAgIGJvb2wgbV9kdW1wVGl0bGVDaGFuZ2Vz
OworCisgICAgLy8gSWYgdHJ1ZSwgdGhlIGVsZW1lbnQgd2lsbCBiZSB0cmVhdGVkIGFzIGVkaXRh
YmxlLiAgVGhpcyB2YWx1ZSBpcyByZXR1cm5lZAorICAgIC8vIGZyb20gdmFyaW91cyBlZGl0aW5n
IGNhbGxiYWNrcyB0aGF0IGFyZSBjYWxsZWQganVzdCBiZWZvcmUgZWRpdCBvcGVyYXRpb25zCisg
ICAgLy8gYXJlIGFsbG93ZWQuCisgICAgYm9vbCBtX2FjY2VwdHNFZGl0aW5nOworCisgICAgLy8g
SWYgdHJ1ZSwgbmV3IHdpbmRvd3MgY2FuIGJlIG9wZW5lZCB2aWEgamF2YXNjcmlwdCBvciBieSBw
bHVnaW5zLiAgQnkKKyAgICAvLyBkZWZhdWx0LCBzZXQgdG8gZmFsc2UgYW5kIGNhbiBiZSB0b2dn
bGVkIHRvIHRydWUgdXNpbmcKKyAgICAvLyBzZXRDYW5PcGVuV2luZG93cygpLgorICAgIGJvb2wg
bV9jYW5PcGVuV2luZG93czsKKworICAgIC8vIFdoZW4gcmVzZXQgaXMgY2FsbGVkLCBnbyB0aHJv
dWdoIGFuZCBjbG9zZSBhbGwgYnV0IHRoZSBtYWluIHRlc3Qgc2hlbGwKKyAgICAvLyB3aW5kb3cu
ICBCeSBkZWZhdWx0LCBzZXQgdG8gdHJ1ZSBidXQgdG9nZ2xlZCB0byBmYWxzZSB1c2luZworICAg
IC8vIHNldENsb3NlUmVtYWluaW5nV2luZG93c1doZW5Db21wbGV0ZSgpLgorICAgIGJvb2wgbV9j
bG9zZVJlbWFpbmluZ1dpbmRvd3M7CisKKyAgICAvLyBJZiB0cnVlLCBwaXhlbCBkdW1wIHdpbGwg
YmUgcHJvZHVjZWQgYXMgYSBzZXJpZXMgb2YgMXB4LXRhbGwsIHZpZXctd2lkZQorICAgIC8vIGlu
ZGl2aWR1YWwgcGFpbnRzIG92ZXIgdGhlIGhlaWdodCBvZiB0aGUgdmlldy4KKyAgICBib29sIG1f
dGVzdFJlcGFpbnQ7CisgICAgLy8gSWYgdHJ1ZSBhbmQgdGVzdF9yZXBhaW50XyBpcyB0cnVlIGFz
IHdlbGwsIHBpeGVsIGR1bXAgd2lsbCBiZSBwcm9kdWNlZCBhcworICAgIC8vIGEgc2VyaWVzIG9m
IDFweC13aWRlLCB2aWV3LXRhbGwgcGFpbnRzIGFjcm9zcyB0aGUgd2lkdGggb2YgdGhlIHZpZXcu
CisgICAgYm9vbCBtX3N3ZWVwSG9yaXpvbnRhbGx5OworCisgICAgLy8gSWYgdHJ1ZSBhbmQgYSBk
cmFnIHN0YXJ0cywgYWRkcyBhIGZpbGUgdG8gdGhlIGRyYWcmZHJvcCBjbGlwYm9hcmQuCisgICAg
Ym9vbCBtX3Nob3VsZEFkZEZpbGVUb1Bhc3RlYm9hcmQ7CisKKyAgICAvLyBJZiB0cnVlLCBzdG9w
cyBwcm92aXNpb25hbCBmcmFtZSBsb2FkcyBkdXJpbmcgdGhlCisgICAgLy8gRGlkU3RhcnRQcm92
aXNpb25hbExvYWRGb3JGcmFtZSBjYWxsYmFjay4KKyAgICBib29sIG1fc3RvcFByb3Zpc2lvbmFs
RnJhbWVMb2FkczsKKworICAgIC8vIElmIHRydWUsIGRvbid0IGR1bXAgb3V0cHV0IHVudGlsIG5v
dGlmeURvbmUgaXMgY2FsbGVkLgorICAgIGJvb2wgbV93YWl0VW50aWxEb25lOworCisgICAgLy8g
VG8gcHJldmVudCBpbmZpbml0ZSBsb29wcywgb25seSB0aGUgZmlyc3QgcGFnZSBvZiBhIHRlc3Qg
Y2FuIGFkZCB0byBhCisgICAgLy8gd29yayBxdWV1ZSAoc2luY2Ugd2UgbWF5IHdlbGwgY29tZSBi
YWNrIHRvIHRoYXQgc2FtZSBwYWdlKS4KKyAgICBib29sIG1fd29ya1F1ZXVlRnJvemVuOworCisg
ICAgV29ya1F1ZXVlIG1fd29ya1F1ZXVlOworCisgICAgQ3BwVmFyaWFudCBtX2dsb2JhbEZsYWc7
CisKKyAgICAvLyBCb3VuZCB2YXJpYWJsZSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHRvcCBVUkxz
IHZpc2l0ZWQuCisgICAgQ3BwVmFyaWFudCBtX3dlYkhpc3RvcnlJdGVtQ291bnQ7CisKKyAgICBX
ZWJLaXQ6OldlYlVSTCBtX3VzZXJTdHlsZVNoZWV0TG9jYXRpb247Cit9OworCisjZW5kaWYgLy8g
TGF5b3V0VGVzdENvbnRyb2xsZXJfaAo=
</data>
<flag name="review"
          id="34880"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
      

    </bug>

</bugzilla>