<?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>27525</bug_id>
          
          <creation_ts>2009-07-21 16:48:47 -0700</creation_ts>
          <short_desc>Fix error handling in dedicated worker and worker context.</short_desc>
          <delta_ts>2009-07-27 10:46:37 -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>WebCore JavaScript</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</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>
          <dependson>27515</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jian Li">jianli</reporter>
          <assigned_to name="Jian Li">jianli</assigned_to>
          <cc>ap</cc>
    
    <cc>levin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>133655</commentid>
    <comment_count>0</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-07-21 16:48:47 -0700</bug_when>
    <thetext>Fix error handling in dedicated worker and worker context to adhere to the Web Worker spec (http://www.whatwg.org/specs/web-workers/current-work/#runtime-script-errors):

  Whenever an uncaught runtime script error occurs in one of the worker&apos;s scripts, if the error did not occur while handling a previous script error, the user agent must report the error using the WorkerGlobalScope object&apos;s onerror attribute. 

  For dedicated workers, if the error is still not handled afterwards, or if the error occurred while handling a previous script error, the user agent must queue a task to fire a worker error event at the Worker object associated with the worker.

  When the user agent is to fire a worker error event at a Worker object, it must dispatch an event that uses the ErrorEvent interface, with the name error, that doesn&apos;t bubble and is cancelable, with its message, filename, and lineno attributes set appropriately. The default action of this event depends on whether the Worker object is itself in a worker. If it is, and that worker is also a dedicated worker, then the user agent must again queue a task to fire a worker error event at the Worker object associated with that worker. Otherwise, then the error should be reported to the user.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133801</commentid>
    <comment_count>1</comment_count>
      <attachid>33268</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-07-22 10:29:29 -0700</bug_when>
    <thetext>Created attachment 33268
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134487</commentid>
    <comment_count>2</comment_count>
      <attachid>33268</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-24 03:04:16 -0700</bug_when>
    <thetext>Comment on attachment 33268
Proposed Patch

Thanks for taking this on.  It is a pretty complicated area as such I have quite a few comments some of which may just require educating me :)


&gt; diff --git a/LayoutTests/fast/workers/resources/worker-script-error-not-handled1.js b/LayoutTests/fast/workers/resources/worker-script-error-not-handled1.js

What do you think about
   /LayoutTests/fast/workers/resources/worker-script-error-unhandled.js
?

(Just an idea)


&gt; diff --git a/LayoutTests/fast/workers/resources/worker-script-error-not-handled2.js b/LayoutTests/fast/workers/resources/worker-script-error-not-handled2.js
&gt; @@ -0,0 +1,7 @@
&gt; +onerror = function(message, url, lineno)
&gt; +{
&gt; +    postMessage(&quot;onerror invoked for a script that has script error &apos;&quot; + message + &quot;&apos; at line &quot; + lineno);
&gt; +    return true;
&gt; +}
&gt; +
&gt; +foo.bar = 0;

This is handled in some sense but allowed to bubble.  What do you think about 
  LayoutTests/fast/workers/resources/worker-script-error-bubbled.js
?


&gt; diff --git a/LayoutTests/fast/workers/worker-constructor.html b/LayoutTests/fast/workers/worker-constructor.html
...
&gt; +
&gt; +function test10()
&gt; +{
&gt; +    try {
&gt; +        var worker = new Worker(&quot;resources/worker-script-error-not-handled2.js&quot;);
&gt; +        worker.onerror = function(evt) {
&gt; +            log(&quot;PASS: onerror invoked for a script that has script error &apos;&quot; + evt.message + &quot;&apos; at line &quot; + evt.lineno + &quot;.&quot;);
&gt; +            runNextTest();
&gt; +        }

Why doesn&apos;t this test capture and log the message from &quot;worker-script-error-not-handled2.js&quot;?

&gt; +function test11()

Need to add a test that cancels the event received on the worker object.

I see some advantages of this format (test#), but now that there are 11 tests with this format, I find it a bit less readable.  Here&apos;s why:

1. The tests end up with non descript names, and it is hard for me to quickly tell what unique thing each is trying to test. Instead I&apos;d recommend getting rid of runNextTest and just calling each test from the previous tests.  It is not much more fragile (one must check that each test calls the next and that the last test logs DONE and calls layoutTestController.notifyDone();).

2. It feels like it led to more tests to this same file. It would be good if the new tests were in a new file based on what they are testing.  The new tests are about script errors and on error handling.  They should be in a test with a name that represents that as opposed to &quot;worker-constructor.html&quot;



&gt; diff --git a/WebCore/bindings/js/JSEventListener.cpp b/WebCore/bindings/js/JSEventListener.cpp
&gt; +bool JSEventListener::reportError(const String&amp; message, const String&amp; url, int lineNumber)
...
&gt; +
&gt; +    globalObject-&gt;globalData()-&gt;timeoutChecker.start();
&gt; +    JSValue retval = call(exec, jsFunction, callType, callData, thisValue, args);

retvalue -&gt; returnValue?

&gt; +    globalObject-&gt;globalData()-&gt;timeoutChecker.stop();
&gt; +
&gt; +    if (exec-&gt;hadException()) {
&gt; +        reportCurrentException(exec);

Does this do the following: 
 &quot;if the error occurred while handling a previous script error, the user agent must queue a task to fire a worker error event at the Worker object associated with the worker.&quot;
?

If not, why not?

&gt; +        return true;
&gt; +    }
&gt; +    
&gt; +    bool retvalbool;

How about bubbleEvent (instead of retvalbool)?

&gt; +    return retval.getBoolean(retvalbool) &amp;&amp; !retvalbool;


&gt; diff --git a/WebCore/bindings/js/JSEventListener.h b/WebCore/bindings/js/JSEventListener.h
&gt; +        virtual bool reportError(const String&amp; message, const String&amp; url, int);

It would be helpful to fill in the param name for the int.

&gt; diff --git a/WebCore/dom/EventListener.h b/WebCore/dom/EventListener.h
&gt; +        // Return true to indicate that the error is handled.
&gt; +        virtual bool reportError(const String&amp; /*message*/, const String&amp; /*url*/, int) { return false; }

It would be helpful to fill in the param name for the int.


&gt; diff --git a/WebCore/workers/WorkerContext.cpp b/WebCore/workers/WorkerContext.cpp
&gt;  void WorkerContext::reportException(const String&amp; errorMessage, int lineNumber, const String&amp; sourceURL)
&gt;  {
&gt; -    m_thread-&gt;workerObjectProxy().postExceptionToWorkerObject(errorMessage, lineNumber, sourceURL);
&gt; +    bool errorHandled = false;
&gt; +    if (m_onerrorListener)
&gt; +        errorHandled = m_onerrorListener-&gt;reportError(errorMessage, sourceURL, lineNumber);
&gt; +
&gt; +    if (!errorHandled)
&gt; +        m_thread-&gt;workerObjectProxy().postExceptionToWorkerObject(errorMessage, lineNumber, sourceURL);

For Document::reportException, only logs the message to the console
    if (DOMWindow* window = domWindow())
        window-&gt;console()-&gt;addMessage(JSMessageSource, LogMessageType, ErrorMessageLevel, errorMessage, lineNumber, sourceURL);

So when done in a Document callers of ScriptExecutionContext::reportException are simply doing this.  So far in workers, the
message was simply proxies to the Document which did its normal thing. 

Now this calls the on error listener first.  Who calls this api in workers and is this the correct thing to do for all of them? (Seems likely but it would be good to track this down and be sure.  Then can we add tests for the error handling for them to verify that the error is being reported so your fix does get regressed?)


Does every place that called this want to do the dispatch script error event?


&gt; diff --git a/WebCore/workers/WorkerMessagingProxy.cpp b/WebCore/workers/WorkerMessagingProxy.cpp
&gt;      virtual void performTask(ScriptExecutionContext* context)
&gt;      {
&gt; -        if (!m_messagingProxy-&gt;askedToTerminate())
&gt; +        Worker* workerObject = m_messagingProxy-&gt;workerObject();
&gt; +        if (!workerObject || m_messagingProxy-&gt;askedToTerminate())
&gt; +            return;
&gt; +
&gt; +        if (workerObject-&gt;onerror())
&gt; +            workerObject-&gt;dispatchScriptErrorEvent(m_errorMessage, m_sourceURL, m_lineNumber);
&gt; +        else
&gt;              context-&gt;reportException(m_errorMessage, m_lineNumber, m_sourceURL);
According to the web workers spec:

&quot;When the user agent is to fire a worker error event at a Worker object, it must dispatch an event that uses the ErrorEvent interface, with the name error, that doesn&apos;t bubble and is cancelable, with its message, filename, and lineno attributes set appropriately. The default action of this event depends on whether the Worker object is itself in a worker. If it is, and that worker is also a dedicated worker, then the user agent must again queue a task to fire a worker error event at the Worker object associated with that worker. Otherwise, then the error should be reported to the user.&quot;

It sounds like this event should go to ScriptExecutionContext::reportException (&quot;reported to the user&quot;) unless it was cancelled.

Thanks again for this and for dealing with my volume of comments here :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134673</commentid>
    <comment_count>3</comment_count>
      <attachid>33474</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-07-24 15:22:00 -0700</bug_when>
    <thetext>Created attachment 33474
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134675</commentid>
    <comment_count>4</comment_count>
      <attachid>33474</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-24 15:40:34 -0700</bug_when>
    <thetext>Comment on attachment 33474
Proposed Patch

Just found out that Jian is doing a few more changes to this , so canceling the review request for him.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134677</commentid>
    <comment_count>5</comment_count>
      <attachid>33475</attachid>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-07-24 16:19:11 -0700</bug_when>
    <thetext>Created attachment 33475
Proposed Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134678</commentid>
    <comment_count>6</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-07-24 16:21:48 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 33268 [details])
&gt; Thanks for taking this on.  It is a pretty complicated area as such I have
&gt; quite a few comments some of which may just require educating me :)
&gt; 
&gt; 
&gt; &gt; diff --git a/LayoutTests/fast/workers/resources/worker-script-error-not-handled1.js b/LayoutTests/fast/workers/resources/worker-script-error-not-handled1.js
&gt; 
&gt; What do you think about
&gt;    /LayoutTests/fast/workers/resources/worker-script-error-unhandled.js
&gt; ?
&gt; 
&gt; (Just an idea)
&gt; 
Done.
&gt; 
&gt; &gt; diff --git a/LayoutTests/fast/workers/resources/worker-script-error-not-handled2.js b/LayoutTests/fast/workers/resources/worker-script-error-not-handled2.js
&gt; &gt; @@ -0,0 +1,7 @@
&gt; &gt; +onerror = function(message, url, lineno)
&gt; &gt; +{
&gt; &gt; +    postMessage(&quot;onerror invoked for a script that has script error &apos;&quot; + message + &quot;&apos; at line &quot; + lineno);
&gt; &gt; +    return true;
&gt; &gt; +}
&gt; &gt; +
&gt; &gt; +foo.bar = 0;
&gt; 
&gt; This is handled in some sense but allowed to bubble.  What do you think about 
&gt;   LayoutTests/fast/workers/resources/worker-script-error-bubbled.js
&gt; ?
Done.
&gt; 
&gt; 
&gt; &gt; diff --git a/LayoutTests/fast/workers/worker-constructor.html b/LayoutTests/fast/workers/worker-constructor.html
&gt; ...
&gt; &gt; +
&gt; &gt; +function test10()
&gt; &gt; +{
&gt; &gt; +    try {
&gt; &gt; +        var worker = new Worker(&quot;resources/worker-script-error-not-handled2.js&quot;);
&gt; &gt; +        worker.onerror = function(evt) {
&gt; &gt; +            log(&quot;PASS: onerror invoked for a script that has script error &apos;&quot; + evt.message + &quot;&apos; at line &quot; + evt.lineno + &quot;.&quot;);
&gt; &gt; +            runNextTest();
&gt; &gt; +        }
&gt; 
&gt; Why doesn&apos;t this test capture and log the message from
&gt; &quot;worker-script-error-not-handled2.js&quot;?
&gt; 
Fixed.
&gt; &gt; +function test11()
&gt; 
&gt; Need to add a test that cancels the event received on the worker object.
&gt; 
&gt; I see some advantages of this format (test#), but now that there are 11 tests
&gt; with this format, I find it a bit less readable.  Here&apos;s why:
&gt; 
&gt; 1. The tests end up with non descript names, and it is hard for me to quickly
&gt; tell what unique thing each is trying to test. Instead I&apos;d recommend getting
&gt; rid of runNextTest and just calling each test from the previous tests.  It is
&gt; not much more fragile (one must check that each test calls the next and that
&gt; the last test logs DONE and calls layoutTestController.notifyDone();).
&gt; 
&gt; 2. It feels like it led to more tests to this same file. It would be good if
&gt; the new tests were in a new file based on what they are testing.  The new tests
&gt; are about script errors and on error handling.  They should be in a test with a
&gt; name that represents that as opposed to &quot;worker-constructor.html&quot;
&gt; 
Changed to maintain a list of meaningful function names, as we discussed.
&gt; 
&gt; 
&gt; &gt; diff --git a/WebCore/bindings/js/JSEventListener.cpp b/WebCore/bindings/js/JSEventListener.cpp
&gt; &gt; +bool JSEventListener::reportError(const String&amp; message, const String&amp; url, int lineNumber)
&gt; ...
&gt; &gt; +
&gt; &gt; +    globalObject-&gt;globalData()-&gt;timeoutChecker.start();
&gt; &gt; +    JSValue retval = call(exec, jsFunction, callType, callData, thisValue, args);
&gt; 
&gt; retvalue -&gt; returnValue?
Done.
&gt; 
&gt; &gt; +    globalObject-&gt;globalData()-&gt;timeoutChecker.stop();
&gt; &gt; +
&gt; &gt; +    if (exec-&gt;hadException()) {
&gt; &gt; +        reportCurrentException(exec);
&gt; 
&gt; Does this do the following: 
&gt;  &quot;if the error occurred while handling a previous script error, the user agent
&gt; must queue a task to fire a worker error event at the Worker object associated
&gt; with the worker.&quot;
&gt; ?
&gt; 
&gt; If not, why not?
Fixed. Also added one more test case for it.
&gt; 
&gt; &gt; +        return true;
&gt; &gt; +    }
&gt; &gt; +    
&gt; &gt; +    bool retvalbool;
&gt; 
&gt; How about bubbleEvent (instead of retvalbool)?
&gt; 
Done.
&gt; &gt; +    return retval.getBoolean(retvalbool) &amp;&amp; !retvalbool;
&gt; 
&gt; 
&gt; &gt; diff --git a/WebCore/bindings/js/JSEventListener.h b/WebCore/bindings/js/JSEventListener.h
&gt; &gt; +        virtual bool reportError(const String&amp; message, const String&amp; url, int);
&gt; 
&gt; It would be helpful to fill in the param name for the int.
&gt; 
Done.
&gt; &gt; diff --git a/WebCore/dom/EventListener.h b/WebCore/dom/EventListener.h
&gt; &gt; +        // Return true to indicate that the error is handled.
&gt; &gt; +        virtual bool reportError(const String&amp; /*message*/, const String&amp; /*url*/, int) { return false; }
&gt; 
&gt; It would be helpful to fill in the param name for the int.
&gt; 
Done.
&gt; 
&gt; &gt; diff --git a/WebCore/workers/WorkerContext.cpp b/WebCore/workers/WorkerContext.cpp
&gt; &gt;  void WorkerContext::reportException(const String&amp; errorMessage, int lineNumber, const String&amp; sourceURL)
&gt; &gt;  {
&gt; &gt; -    m_thread-&gt;workerObjectProxy().postExceptionToWorkerObject(errorMessage, lineNumber, sourceURL);
&gt; &gt; +    bool errorHandled = false;
&gt; &gt; +    if (m_onerrorListener)
&gt; &gt; +        errorHandled = m_onerrorListener-&gt;reportError(errorMessage, sourceURL, lineNumber);
&gt; &gt; +
&gt; &gt; +    if (!errorHandled)
&gt; &gt; +        m_thread-&gt;workerObjectProxy().postExceptionToWorkerObject(errorMessage, lineNumber, sourceURL);
&gt; 
&gt; For Document::reportException, only logs the message to the console
&gt;     if (DOMWindow* window = domWindow())
&gt;         window-&gt;console()-&gt;addMessage(JSMessageSource, LogMessageType,
&gt; ErrorMessageLevel, errorMessage, lineNumber, sourceURL);
&gt; 
&gt; So when done in a Document callers of ScriptExecutionContext::reportException
&gt; are simply doing this.  So far in workers, the
&gt; message was simply proxies to the Document which did its normal thing. 
&gt; 
&gt; Now this calls the on error listener first.  Who calls this api in workers and
&gt; is this the correct thing to do for all of them? (Seems likely but it would be
&gt; good to track this down and be sure.  Then can we add tests for the error
&gt; handling for them to verify that the error is being reported so your fix does
&gt; get regressed?)
&gt; 
WorkerScriptController::evaluate().
&gt; 
&gt; Does every place that called this want to do the dispatch script error event?
&gt; 
Yes.
&gt; 
&gt; &gt; diff --git a/WebCore/workers/WorkerMessagingProxy.cpp b/WebCore/workers/WorkerMessagingProxy.cpp
&gt; &gt;      virtual void performTask(ScriptExecutionContext* context)
&gt; &gt;      {
&gt; &gt; -        if (!m_messagingProxy-&gt;askedToTerminate())
&gt; &gt; +        Worker* workerObject = m_messagingProxy-&gt;workerObject();
&gt; &gt; +        if (!workerObject || m_messagingProxy-&gt;askedToTerminate())
&gt; &gt; +            return;
&gt; &gt; +
&gt; &gt; +        if (workerObject-&gt;onerror())
&gt; &gt; +            workerObject-&gt;dispatchScriptErrorEvent(m_errorMessage, m_sourceURL, m_lineNumber);
&gt; &gt; +        else
&gt; &gt;              context-&gt;reportException(m_errorMessage, m_lineNumber, m_sourceURL);
&gt; According to the web workers spec:
&gt; 
&gt; &quot;When the user agent is to fire a worker error event at a Worker object, it
&gt; must dispatch an event that uses the ErrorEvent interface, with the name error,
&gt; that doesn&apos;t bubble and is cancelable, with its message, filename, and lineno
&gt; attributes set appropriately. The default action of this event depends on
&gt; whether the Worker object is itself in a worker. If it is, and that worker is
&gt; also a dedicated worker, then the user agent must again queue a task to fire a
&gt; worker error event at the Worker object associated with that worker. Otherwise,
&gt; then the error should be reported to the user.&quot;
&gt; 
&gt; It sounds like this event should go to ScriptExecutionContext::reportException
&gt; (&quot;reported to the user&quot;) unless it was cancelled.
&gt; 
Fixed.

&gt; Thanks again for this and for dealing with my volume of comments here :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134680</commentid>
    <comment_count>7</comment_count>
      <attachid>33475</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-07-24 16:36:31 -0700</bug_when>
    <thetext>Comment on attachment 33475
Proposed Patch

Thanks Jian!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>134942</commentid>
    <comment_count>8</comment_count>
    <who name="Jian Li">jianli</who>
    <bug_when>2009-07-27 10:46:37 -0700</bug_when>
    <thetext>Committed as http://trac.webkit.org/changeset/46419</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33268</attachid>
            <date>2009-07-22 10:29:29 -0700</date>
            <delta_ts>2009-07-24 15:22:00 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>27525</filename>
            <type>text/plain</type>
            <size>12735</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCA5ZDNhMjFhLi43YmMxOGQ0IDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTcgQEAKKzIwMDktMDct
MjIgIEppYW4gTGkgIDxqaWFubGlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIExheW91dCB0ZXN0cyBmb3IgZml4aW5nIGVycm9y
IGhhbmRsaW5nIGluIGRlZGljYXRlZCB3b3JrZXIgYW5kIHdvcmtlciBjb250ZXh0LgorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MjUKKworICAgICAg
ICAqIGZhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLWludmFsaWQtc3ludGF4LmpzOiBBZGRl
ZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJyb3It
aGFuZGxlZC5qczogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3Jr
ZXItc2NyaXB0LWVycm9yLW5vdC1oYW5kbGVkMS5qczogQWRkZWQuCisgICAgICAgICogZmFzdC93
b3JrZXJzL3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLW5vdC1oYW5kbGVkMi5qczogQWRk
ZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3dvcmtlci1jb25zdHJ1Y3Rvci1leHBlY3RlZC50
eHQ6CisgICAgICAgICogZmFzdC93b3JrZXJzL3dvcmtlci1jb25zdHJ1Y3Rvci5odG1sOgorCiAy
MDA5LTA3LTIxICBTaW1vbiBIYXVzbWFubiAgPHNpbW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBUb3IgQXJuZSBWZXN0YsO4LgpkaWZmIC0tZ2l0IGEvTGF5b3V0
VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItaW52YWxpZC1zeW50YXguanMgYi9M
YXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1pbnZhbGlkLXN5bnRheC5q
cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzRlZWE2Ci0tLSAvZGV2L251
bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItaW52YWxp
ZC1zeW50YXguanMKQEAgLTAsMCArMSBAQAorSW52YWxpZCBzeW50YXguCmRpZmYgLS1naXQgYS9M
YXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJyb3ItaGFu
ZGxlZC5qcyBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLXNjcmlw
dC1lcnJvci1oYW5kbGVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUw
ZDkwNzcKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3Vy
Y2VzL3dvcmtlci1zY3JpcHQtZXJyb3ItaGFuZGxlZC5qcwpAQCAtMCwwICsxLDcgQEAKK29uZXJy
b3IgPSBmdW5jdGlvbihtZXNzYWdlLCB1cmwsIGxpbmVubykKK3sKKyAgICBwb3N0TWVzc2FnZSgi
b25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0IGhhcyBzY3JpcHQgZXJyb3IgJyIgKyBt
ZXNzYWdlICsgIicgYXQgbGluZSAiICsgbGluZW5vKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K2Zvby5iYXIgPSAwOwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291
cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLW5vdC1oYW5kbGVkMS5qcyBiL0xheW91dFRlc3RzL2Zh
c3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1lcnJvci1ub3QtaGFuZGxlZDEuanMK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE2NjA1ZAotLS0gL2Rldi9udWxs
CisrKyBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1l
cnJvci1ub3QtaGFuZGxlZDEuanMKQEAgLTAsMCArMSBAQAorZm9vLmJhciA9IDA7CmRpZmYgLS1n
aXQgYS9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJy
b3Itbm90LWhhbmRsZWQyLmpzIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93
b3JrZXItc2NyaXB0LWVycm9yLW5vdC1oYW5kbGVkMi5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi5hMjBkNDEwCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFz
dC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLW5vdC1oYW5kbGVkMi5qcwpA
QCAtMCwwICsxLDcgQEAKK29uZXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlLCB1cmwsIGxpbmVubykK
K3sKKyAgICBwb3N0TWVzc2FnZSgib25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0IGhh
cyBzY3JpcHQgZXJyb3IgJyIgKyBtZXNzYWdlICsgIicgYXQgbGluZSAiICsgbGluZW5vKTsKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworZm9vLmJhciA9IDA7CmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0
cy9mYXN0L3dvcmtlcnMvd29ya2VyLWNvbnN0cnVjdG9yLWV4cGVjdGVkLnR4dCBiL0xheW91dFRl
c3RzL2Zhc3Qvd29ya2Vycy93b3JrZXItY29uc3RydWN0b3ItZXhwZWN0ZWQudHh0CmluZGV4IDMx
MWUxOWIuLjhjNmRkNjQgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy93b3Jr
ZXItY29uc3RydWN0b3ItZXhwZWN0ZWQudHh0CisrKyBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vy
cy93b3JrZXItY29uc3RydWN0b3ItZXhwZWN0ZWQudHh0CkBAIC03LDUgKzcsOSBAQCBQQVNTOiBv
bmVycm9yIGludm9rZWQgZm9yIGFuIGVtcHR5IHNjcmlwdCBVUkwuCiBQQVNTOiBvbmVycm9yIGlu
dm9rZWQgZm9yIGFuIGludmFsaWQgc2NyaXB0IFVSTC4KIFBBU1M6IG9uZXJyb3IgaW52b2tlZCBm
b3IgYSBzY3JpcHQgdGhhdCBjb3VsZCBub3QgYmUgbG9hZGVkLgogUEFTUzogU3VjY2Vzc2Z1bGx5
IGNyZWF0ZWQgd29ya2VyLgorUEFTUzogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0
IGhhcyBpbnZhbGlkIHN5bnRheC4KK1BBU1M6IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQg
dGhhdCBoYXMgc2NyaXB0IGVycm9yICdSZWZlcmVuY2VFcnJvcjogQ2FuJ3QgZmluZCB2YXJpYWJs
ZTogZm9vJyBhdCBsaW5lIDEuCitQQVNTOiBvbmVycm9yIGludm9rZWQgZm9yIGEgc2NyaXB0IHRo
YXQgaGFzIHNjcmlwdCBlcnJvciAnUmVmZXJlbmNlRXJyb3I6IENhbid0IGZpbmQgdmFyaWFibGU6
IGZvbycgYXQgbGluZSA3LgorUEFTUzogbWVzc2FnZSByZWNlaXZlZCBmcm9tIFdvcmtlckdsb2Jh
bFNjb3BlLm9uZXJyb3I6IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBoYXMgc2Ny
aXB0IGVycm9yICdSZWZlcmVuY2VFcnJvcjogQ2FuJ3QgZmluZCB2YXJpYWJsZTogZm9vJyBhdCBs
aW5lIDcuCiBET05FCiAKZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy93b3Jr
ZXItY29uc3RydWN0b3IuaHRtbCBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy93b3JrZXItY29u
c3RydWN0b3IuaHRtbAppbmRleCA2YjY5OTI3Li5lMWQ5NTIxIDEwMDY0NAotLS0gYS9MYXlvdXRU
ZXN0cy9mYXN0L3dvcmtlcnMvd29ya2VyLWNvbnN0cnVjdG9yLmh0bWwKKysrIGIvTGF5b3V0VGVz
dHMvZmFzdC93b3JrZXJzL3dvcmtlci1jb25zdHJ1Y3Rvci5odG1sCkBAIC0xMTcsNiArMTE3LDY2
IEBAIGZ1bmN0aW9uIHRlc3Q3KCkKICAgICBydW5OZXh0VGVzdCgpOwogfQogCitmdW5jdGlvbiB0
ZXN0OCgpCit7CisgICAgdHJ5IHsKKyAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIoInJl
c291cmNlcy93b3JrZXItaW52YWxpZC1zeW50YXguanMiKTsKKyAgICAgICAgd29ya2VyLm9uZXJy
b3IgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGxvZygiUEFTUzogb25lcnJvciBpbnZva2Vk
IGZvciBhIHNjcmlwdCB0aGF0IGhhcyBpbnZhbGlkIHN5bnRheC4iKTsKKyAgICAgICAgICAgIHJ1
bk5leHRUZXN0KCk7CisgICAgICAgIH0KKyAgICB9IGNhdGNoIChleCkgeworICAgICAgICBsb2co
IkZBSUw6IHVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBleCk7CisgICAgICAgIHJ1bk5leHRUZXN0
KCk7CisgICAgfQorfQorCitmdW5jdGlvbiB0ZXN0OSgpCit7CisgICAgdHJ5IHsKKyAgICAgICAg
dmFyIHdvcmtlciA9IG5ldyBXb3JrZXIoInJlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLW5v
dC1oYW5kbGVkMS5qcyIpOworICAgICAgICB3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGV2dCkg
eworICAgICAgICAgICAgbG9nKCJQQVNTOiBvbmVycm9yIGludm9rZWQgZm9yIGEgc2NyaXB0IHRo
YXQgaGFzIHNjcmlwdCBlcnJvciAnIiArIGV2dC5tZXNzYWdlICsgIicgYXQgbGluZSAiICsgZXZ0
LmxpbmVubyArICIuIik7CisgICAgICAgICAgICBydW5OZXh0VGVzdCgpOworICAgICAgICB9Cisg
ICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgbG9nKCJGQUlMOiB1bmV4cGVjdGVkIGV4Y2VwdGlv
biAiICsgZXgpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KK30KKworZnVuY3Rpb24g
dGVzdDEwKCkKK3sKKyAgICB0cnkgeworICAgICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcigi
cmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJyb3Itbm90LWhhbmRsZWQyLmpzIik7CisgICAgICAg
IHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgICAgICBsb2coIlBBU1M6
IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBoYXMgc2NyaXB0IGVycm9yICciICsg
ZXZ0Lm1lc3NhZ2UgKyAiJyBhdCBsaW5lICIgKyBldnQubGluZW5vICsgIi4iKTsKKyAgICAgICAg
ICAgIHJ1bk5leHRUZXN0KCk7CisgICAgICAgIH0KKyAgICB9IGNhdGNoIChleCkgeworICAgICAg
ICBsb2coIkZBSUw6IHVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBleCk7CisgICAgICAgIHJ1bk5l
eHRUZXN0KCk7CisgICAgfQorfQorCitmdW5jdGlvbiB0ZXN0MTEoKQoreworICAgIHRyeSB7Cisg
ICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKCJyZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1l
cnJvci1oYW5kbGVkLmpzIik7CisgICAgICAgIHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZXZ0
KSB7CisgICAgICAgICAgICBsb2coIkZBSUw6IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQg
dGhhdCBoYXMgc2NyaXB0IGVycm9yICciICsgZXZ0Lm1lc3NhZ2UgKyAiJyBhdCBsaW5lICIgKyBl
dnQubGluZW5vICsgIi4iKTsKKyAgICAgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgICAgIH0K
KyAgICAgICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgICAg
bG9nKCJQQVNTOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gV29ya2VyR2xvYmFsU2NvcGUub25lcnJv
cjogIiArIGV2dC5kYXRhICsgIi4iKTsKKyAgICAgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAg
ICAgIH0KKyAgICB9IGNhdGNoIChleCkgeworICAgICAgICBsb2coIkZBSUw6IHVuZXhwZWN0ZWQg
ZXhjZXB0aW9uICIgKyBleCk7CisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorfQorCiBp
ZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CiAgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIuZHVtcEFzVGV4dCgpOwogICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUo
KTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5k
ZXggNTExYzI3Yi4uMDdjMmM1OCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIv
V2ViQ29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzMCBAQAorMjAwOS0wNy0yMiAgSmlhbiBMaSAg
PGppYW5saUBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgRml4IGVycm9yIGhhbmRsaW5nIGluIGRlZGljYXRlZCB3b3JrZXIgYW5k
IHdvcmtlciBjb250ZXh0LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9Mjc1MjUKKworICAgICAgICBUaGUgZm9sbG93aW5nIHByb2JsZW1zIGhhdmUgYmVl
biBmaXhlZDoKKyAgICAgICAgMSkgVGhlIHVuY2F1Z2h0IHJ1bnRpbWUgc2NyaXB0IGVycm9yIGlz
IG5vdCByZXBvcnRlZCB1c2luZyB0aGUKKyAgICAgICAgV29ya2VyR2xvYmFsU2NvcGUgb2JqZWN0
J3Mgb25lcnJvciBhdHRyaWJ1dGUuCisgICAgICAgIDIpIElmIHRoZSBlcnJvciBpcyBzdGlsbCBu
b3QgaGFuZGxlZCBhZnRlcndhcmRzIChvbmVycm9yIGF0dHJpYnV0ZQorICAgICAgICBpcyBub3Qg
ZGVmaW5lZCBhcyBhIGZ1bmN0aW9uIG9yIGl0IHJldHVybnMgdHJ1ZSksIHRoZSBlcnJvciBzaG91
bGQKKyAgICAgICAgYmUgcmVwb3J0ZWQgYmFjayB0byB0aGUgYXNzb2NpYXRlZCBXb3JrZXIgb2Jq
ZWN0IGJ5IGZpcmluZyBhbgorICAgICAgICBFcnJvckV2ZW50LgorCisgICAgICAgICogYmluZGlu
Z3MvanMvSlNFdmVudExpc3RlbmVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkpTRXZlbnRMaXN0
ZW5lcjo6cmVwb3J0RXJyb3IpOiAKKyAgICAgICAgKiBiaW5kaW5ncy9qcy9KU0V2ZW50TGlzdGVu
ZXIuaDoKKyAgICAgICAgKiBkb20vRXZlbnRMaXN0ZW5lci5oOgorICAgICAgICAoV2ViQ29yZTo6
RXZlbnRMaXN0ZW5lcjo6cmVwb3J0RXJyb3IpOiBhZGRzIGEgZnVuY3Rpb24gdG8gY2FsbCAKKyAg
ICAgICAgRXZlbnRMaXN0ZW5lciBhcyBhIGZ1bmN0aW9uIHdpdGggMyBhcmd1bWVudHMgdG8gcmVw
b3J0IGFuIGVycm9yLgorICAgICAgICAqIHdvcmtlcnMvV29ya2VyQ29udGV4dC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpXb3JrZXJDb250ZXh0OjpyZXBvcnRFeGNlcHRpb24pOgorICAgICAgICAq
IHdvcmtlcnMvV29ya2VyTWVzc2FnaW5nUHJveHkuY3BwOgorICAgICAgICAoV2ViQ29yZTo6V29y
a2VyRXhjZXB0aW9uVGFzazo6cGVyZm9ybVRhc2spOgorICAgICAgICAqIHdvcmtlcnMvV29ya2Vy
TWVzc2FnaW5nUHJveHkuaDoKKwogMjAwOS0wNy0yMSAgSmlhbiBMaSAgPGppYW5saUBjaHJvbWl1
bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgRGF2aWQgTGV2aW4uCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL2JpbmRpbmdzL2pzL0pTRXZlbnRMaXN0ZW5lci5jcHAgYi9XZWJDb3JlL2JpbmRpbmdz
L2pzL0pTRXZlbnRMaXN0ZW5lci5jcHAKaW5kZXggYjllZDY4NS4uYjY0M2ZjZiAxMDA2NDQKLS0t
IGEvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0V2ZW50TGlzdGVuZXIuY3BwCisrKyBiL1dlYkNvcmUv
YmluZGluZ3MvanMvSlNFdmVudExpc3RlbmVyLmNwcApAQCAtMTUzLDYgKzE1Myw1MiBAQCB2b2lk
IEpTRXZlbnRMaXN0ZW5lcjo6aGFuZGxlRXZlbnQoRXZlbnQqIGV2ZW50LCBib29sIGlzV2luZG93
RXZlbnQpCiAgICAgfQogfQogCitib29sIEpTRXZlbnRMaXN0ZW5lcjo6cmVwb3J0RXJyb3IoY29u
c3QgU3RyaW5nJiBtZXNzYWdlLCBjb25zdCBTdHJpbmcmIHVybCwgaW50IGxpbmVOdW1iZXIpCit7
CisgICAgSlNMb2NrIGxvY2soZmFsc2UpOworCisgICAgSlNPYmplY3QqIGpzRnVuY3Rpb24gPSB0
aGlzLT5qc0Z1bmN0aW9uKCk7CisgICAgaWYgKCFqc0Z1bmN0aW9uKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0ID0gbV9nbG9iYWxP
YmplY3Q7CisgICAgaWYgKCFnbG9iYWxPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIEV4ZWNTdGF0ZSogZXhlYyA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsRXhlYygpOworCisgICAg
Q2FsbERhdGEgY2FsbERhdGE7CisgICAgQ2FsbFR5cGUgY2FsbFR5cGUgPSBqc0Z1bmN0aW9uLT5n
ZXRDYWxsRGF0YShjYWxsRGF0YSk7CisKKyAgICBpZiAoY2FsbFR5cGUgPT0gQ2FsbFR5cGVOb25l
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBNYXJrZWRBcmd1bWVudEJ1ZmZlciBhcmdz
OworICAgIGFyZ3MuYXBwZW5kKGpzU3RyaW5nKGV4ZWMsIG1lc3NhZ2UpKTsKKyAgICBhcmdzLmFw
cGVuZChqc1N0cmluZyhleGVjLCB1cmwpKTsKKyAgICBhcmdzLmFwcGVuZChqc051bWJlcihleGVj
LCBsaW5lTnVtYmVyKSk7CisKKyAgICAvLyBJZiB0aGlzIGV2ZW50IGhhbmRsZXIgaXMgdGhlIGZp
cnN0IEphdmFTY3JpcHQgdG8gZXhlY3V0ZSwgdGhlbiB0aGUKKyAgICAvLyBkeW5hbWljIGdsb2Jh
bCBvYmplY3Qgc2hvdWxkIGJlIHNldCB0byB0aGUgZ2xvYmFsIG9iamVjdCBvZiB0aGUKKyAgICAv
LyB3aW5kb3cgaW4gd2hpY2ggdGhlIGV2ZW50IG9jY3VycmVkLgorICAgIEpTR2xvYmFsRGF0YSog
Z2xvYmFsRGF0YSA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsRGF0YSgpOworICAgIER5bmFtaWNHbG9i
YWxPYmplY3RTY29wZSBnbG9iYWxPYmplY3RTY29wZShleGVjLCBnbG9iYWxEYXRhLT5keW5hbWlj
R2xvYmFsT2JqZWN0ID8gZ2xvYmFsRGF0YS0+ZHluYW1pY0dsb2JhbE9iamVjdCA6IGdsb2JhbE9i
amVjdCk7ICAgIAorCisgICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBnbG9iYWxPYmplY3QtPnRvVGhp
c09iamVjdChleGVjKTsKKworICAgIGdsb2JhbE9iamVjdC0+Z2xvYmFsRGF0YSgpLT50aW1lb3V0
Q2hlY2tlci5zdGFydCgpOworICAgIEpTVmFsdWUgcmV0dmFsID0gY2FsbChleGVjLCBqc0Z1bmN0
aW9uLCBjYWxsVHlwZSwgY2FsbERhdGEsIHRoaXNWYWx1ZSwgYXJncyk7CisgICAgZ2xvYmFsT2Jq
ZWN0LT5nbG9iYWxEYXRhKCktPnRpbWVvdXRDaGVja2VyLnN0b3AoKTsKKworICAgIGlmIChleGVj
LT5oYWRFeGNlcHRpb24oKSkgeworICAgICAgICByZXBvcnRDdXJyZW50RXhjZXB0aW9uKGV4ZWMp
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgYm9vbCByZXR2YWxib29s
OworICAgIHJldHVybiByZXR2YWwuZ2V0Qm9vbGVhbihyZXR2YWxib29sKSAmJiAhcmV0dmFsYm9v
bDsKK30KKwogYm9vbCBKU0V2ZW50TGlzdGVuZXI6OnZpcnR1YWxpc0F0dHJpYnV0ZSgpIGNvbnN0
CiB7CiAgICAgcmV0dXJuIG1faXNBdHRyaWJ1dGU7CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRp
bmdzL2pzL0pTRXZlbnRMaXN0ZW5lci5oIGIvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0V2ZW50TGlz
dGVuZXIuaAppbmRleCBjZTM0ODMyLi5kMjQyZTYzIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRp
bmdzL2pzL0pTRXZlbnRMaXN0ZW5lci5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvanMvSlNFdmVu
dExpc3RlbmVyLmgKQEAgLTQ1LDYgKzQ1LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgIHBy
aXZhdGU6CiAgICAgICAgIHZpcnR1YWwgdm9pZCBtYXJrSlNGdW5jdGlvbigpOwogICAgICAgICB2
aXJ0dWFsIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQqLCBib29sIGlzV2luZG93RXZlbnQpOworICAg
ICAgICB2aXJ0dWFsIGJvb2wgcmVwb3J0RXJyb3IoY29uc3QgU3RyaW5nJiBtZXNzYWdlLCBjb25z
dCBTdHJpbmcmIHVybCwgaW50KTsKICAgICAgICAgdmlydHVhbCBib29sIHZpcnR1YWxpc0F0dHJp
YnV0ZSgpIGNvbnN0OwogICAgICAgICB2b2lkIGNsZWFySlNGdW5jdGlvbklubGluZSgpOwogCmRp
ZmYgLS1naXQgYS9XZWJDb3JlL2RvbS9FdmVudExpc3RlbmVyLmggYi9XZWJDb3JlL2RvbS9FdmVu
dExpc3RlbmVyLmgKaW5kZXggZGJjNDFiMi4uZTA4ODdiYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9k
b20vRXZlbnRMaXN0ZW5lci5oCisrKyBiL1dlYkNvcmUvZG9tL0V2ZW50TGlzdGVuZXIuaApAQCAt
MjEsNiArMjEsNyBAQAogI2lmbmRlZiBFdmVudExpc3RlbmVyX2gKICNkZWZpbmUgRXZlbnRMaXN0
ZW5lcl9oCiAKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgogI2luY2x1ZGUgPHd0Zi9SZWZD
b3VudGVkLmg+CiAKIG5hbWVzcGFjZSBKU0MgewpAQCAtMzUsNiArMzYsOCBAQCBuYW1lc3BhY2Ug
V2ViQ29yZSB7CiAgICAgcHVibGljOgogICAgICAgICB2aXJ0dWFsIH5FdmVudExpc3RlbmVyKCkg
eyB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVFdmVudChFdmVudCosIGJvb2wgaXNXaW5k
b3dFdmVudCA9IGZhbHNlKSA9IDA7CisgICAgICAgIC8vIFJldHVybiB0cnVlIHRvIGluZGljYXRl
IHRoYXQgdGhlIGVycm9yIGlzIGhhbmRsZWQuCisgICAgICAgIHZpcnR1YWwgYm9vbCByZXBvcnRF
cnJvcihjb25zdCBTdHJpbmcmIC8qbWVzc2FnZSovLCBjb25zdCBTdHJpbmcmIC8qdXJsKi8sIGlu
dCkgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgdmlydHVhbCBib29sIHdhc0NyZWF0ZWRGcm9t
TWFya3VwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogI2lmIFVTRShKU0MpCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3dvcmtlcnMvV29ya2VyQ29udGV4dC5jcHAgYi9XZWJDb3JlL3dvcmtlcnMv
V29ya2VyQ29udGV4dC5jcHAKaW5kZXggNWZjYzA4MC4uOTYwZGE2MyAxMDA2NDQKLS0tIGEvV2Vi
Q29yZS93b3JrZXJzL1dvcmtlckNvbnRleHQuY3BwCisrKyBiL1dlYkNvcmUvd29ya2Vycy9Xb3Jr
ZXJDb250ZXh0LmNwcApAQCAtMzYsNiArMzYsNyBAQAogI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgog
I2luY2x1ZGUgIkV2ZW50LmgiCiAjaW5jbHVkZSAiRXZlbnRFeGNlcHRpb24uaCIKKyNpbmNsdWRl
ICJFdmVudE5hbWVzLmgiCiAjaW5jbHVkZSAiTWVzc2FnZUV2ZW50LmgiCiAjaW5jbHVkZSAiTm90
SW1wbGVtZW50ZWQuaCIKICNpbmNsdWRlICJTY3JpcHRTb3VyY2VDb2RlLmgiCkBAIC0xNDMsNyAr
MTQ0LDEyIEBAIGJvb2wgV29ya2VyQ29udGV4dDo6aGFzUGVuZGluZ0FjdGl2aXR5KCkgY29uc3QK
IAogdm9pZCBXb3JrZXJDb250ZXh0OjpyZXBvcnRFeGNlcHRpb24oY29uc3QgU3RyaW5nJiBlcnJv
ck1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCkKIHsKLSAg
ICBtX3RocmVhZC0+d29ya2VyT2JqZWN0UHJveHkoKS5wb3N0RXhjZXB0aW9uVG9Xb3JrZXJPYmpl
Y3QoZXJyb3JNZXNzYWdlLCBsaW5lTnVtYmVyLCBzb3VyY2VVUkwpOworICAgIGJvb2wgZXJyb3JI
YW5kbGVkID0gZmFsc2U7CisgICAgaWYgKG1fb25lcnJvckxpc3RlbmVyKQorICAgICAgICBlcnJv
ckhhbmRsZWQgPSBtX29uZXJyb3JMaXN0ZW5lci0+cmVwb3J0RXJyb3IoZXJyb3JNZXNzYWdlLCBz
b3VyY2VVUkwsIGxpbmVOdW1iZXIpOworCisgICAgaWYgKCFlcnJvckhhbmRsZWQpCisgICAgICAg
IG1fdGhyZWFkLT53b3JrZXJPYmplY3RQcm94eSgpLnBvc3RFeGNlcHRpb25Ub1dvcmtlck9iamVj
dChlcnJvck1lc3NhZ2UsIGxpbmVOdW1iZXIsIHNvdXJjZVVSTCk7CiB9CiAKIHZvaWQgV29ya2Vy
Q29udGV4dDo6YWRkTWVzc2FnZShNZXNzYWdlRGVzdGluYXRpb24gZGVzdGluYXRpb24sIE1lc3Nh
Z2VTb3VyY2Ugc291cmNlLCBNZXNzYWdlVHlwZSB0eXBlLCBNZXNzYWdlTGV2ZWwgbGV2ZWwsIGNv
bnN0IFN0cmluZyYgbWVzc2FnZSwgdW5zaWduZWQgbGluZU51bWJlciwgY29uc3QgU3RyaW5nJiBz
b3VyY2VVUkwpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvV29ya2VyTWVzc2FnaW5nUHJv
eHkuY3BwIGIvV2ViQ29yZS93b3JrZXJzL1dvcmtlck1lc3NhZ2luZ1Byb3h5LmNwcAppbmRleCBi
NmUxNjQyLi5lODA1MmUwIDEwMDY0NAotLS0gYS9XZWJDb3JlL3dvcmtlcnMvV29ya2VyTWVzc2Fn
aW5nUHJveHkuY3BwCisrKyBiL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5j
cHAKQEAgLTEyNyw3ICsxMjcsMTMgQEAgcHJpdmF0ZToKIAogICAgIHZpcnR1YWwgdm9pZCBwZXJm
b3JtVGFzayhTY3JpcHRFeGVjdXRpb25Db250ZXh0KiBjb250ZXh0KQogICAgIHsKLSAgICAgICAg
aWYgKCFtX21lc3NhZ2luZ1Byb3h5LT5hc2tlZFRvVGVybWluYXRlKCkpCisgICAgICAgIFdvcmtl
ciogd29ya2VyT2JqZWN0ID0gbV9tZXNzYWdpbmdQcm94eS0+d29ya2VyT2JqZWN0KCk7CisgICAg
ICAgIGlmICghd29ya2VyT2JqZWN0IHx8IG1fbWVzc2FnaW5nUHJveHktPmFza2VkVG9UZXJtaW5h
dGUoKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAod29ya2VyT2JqZWN0LT5v
bmVycm9yKCkpCisgICAgICAgICAgICB3b3JrZXJPYmplY3QtPmRpc3BhdGNoU2NyaXB0RXJyb3JF
dmVudChtX2Vycm9yTWVzc2FnZSwgbV9zb3VyY2VVUkwsIG1fbGluZU51bWJlcik7CisgICAgICAg
IGVsc2UKICAgICAgICAgICAgIGNvbnRleHQtPnJlcG9ydEV4Y2VwdGlvbihtX2Vycm9yTWVzc2Fn
ZSwgbV9saW5lTnVtYmVyLCBtX3NvdXJjZVVSTCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9XZWJD
b3JlL3dvcmtlcnMvV29ya2VyTWVzc2FnaW5nUHJveHkuaCBiL1dlYkNvcmUvd29ya2Vycy9Xb3Jr
ZXJNZXNzYWdpbmdQcm94eS5oCmluZGV4IGUxM2ViMTEuLmI3MDVjYTQgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvd29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5oCisrKyBiL1dlYkNvcmUvd29ya2Vy
cy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5oCkBAIC04Miw2ICs4Miw3IEBAIG5hbWVzcGFjZSBXZWJD
b3JlIHsKICAgICBwcml2YXRlOgogICAgICAgICBmcmllbmQgY2xhc3MgTWVzc2FnZVdvcmtlclRh
c2s7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBXb3JrZXJDb250ZXh0RGVzdHJveWVkVGFzazsKKyAg
ICAgICAgZnJpZW5kIGNsYXNzIFdvcmtlckV4Y2VwdGlvblRhc2s7CiAgICAgICAgIGZyaWVuZCBj
bGFzcyBXb3JrZXJUaHJlYWRBY3Rpdml0eVJlcG9ydFRhc2s7CiAKICAgICAgICAgdmlydHVhbCB+
V29ya2VyTWVzc2FnaW5nUHJveHkoKTsK
</data>
<flag name="review"
          id="17574"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33474</attachid>
            <date>2009-07-24 15:22:00 -0700</date>
            <delta_ts>2009-07-24 15:40:34 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>27525_2</filename>
            <type>text/plain</type>
            <size>19605</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCAwZDA1ZDBjLi43M2JkNzQzIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMDktMDct
MjQgIEppYW4gTGkgIDxqaWFubGlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIExheW91dCB0ZXN0cyBmb3IgZml4aW5nIGVycm9y
IGhhbmRsaW5nIGluIGRlZGljYXRlZCB3b3JrZXIgYW5kIHdvcmtlcgorICAgICAgICBjb250ZXh0
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MjUK
KworICAgICAgICAqIGZhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLWludmFsaWQtc3ludGF4
LmpzOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1zY3Jp
cHQtZXJyb3ItYnViYmxlZC5qczogQWRkZWQuCisgICAgICAgICogZmFzdC93b3JrZXJzL3Jlc291
cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLWhhbmRsZWQuanM6IEFkZGVkLgorICAgICAgICAqIGZh
c3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1lcnJvci11bmhhbmRsZWQuanM6IEFk
ZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy93b3JrZXItY29uc3RydWN0b3IuaHRtbDoKKyAg
ICAgICAgKiBmYXN0L3dvcmtlcnMvd29ya2VyLXNjcmlwdC1lcnJvci1leHBlY3RlZC50eHQ6IEFk
ZGVkLgorICAgICAgICAqIGZhc3Qvd29ya2Vycy93b3JrZXItc2NyaXB0LWVycm9yLmh0bWw6IEFk
ZGVkLgorCiAyMDA5LTA3LTI0ICBEcmV3IFdpbHNvbiAgPGF0d2lsc29uQGdvb2dsZS5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBCYXJ0aC4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3Rz
L2Zhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLWludmFsaWQtc3ludGF4LmpzIGIvTGF5b3V0
VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItaW52YWxpZC1zeW50YXguanMKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0ZWVhNgotLS0gL2Rldi9udWxsCisr
KyBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLWludmFsaWQtc3lu
dGF4LmpzCkBAIC0wLDAgKzEgQEAKK0ludmFsaWQgc3ludGF4LgpkaWZmIC0tZ2l0IGEvTGF5b3V0
VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLWJ1YmJsZWQu
anMgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJy
b3ItYnViYmxlZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjBkNDEw
Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93
b3JrZXItc2NyaXB0LWVycm9yLWJ1YmJsZWQuanMKQEAgLTAsMCArMSw3IEBACitvbmVycm9yID0g
ZnVuY3Rpb24obWVzc2FnZSwgdXJsLCBsaW5lbm8pCit7CisgICAgcG9zdE1lc3NhZ2UoIm9uZXJy
b3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBoYXMgc2NyaXB0IGVycm9yICciICsgbWVzc2Fn
ZSArICInIGF0IGxpbmUgIiArIGxpbmVubyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Zvby5i
YXIgPSAwOwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93
b3JrZXItc2NyaXB0LWVycm9yLWhhbmRsZWQuanMgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMv
cmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJyb3ItaGFuZGxlZC5qcwpuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi41MGQ5MDc3Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVz
dHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLWhhbmRsZWQuanMK
QEAgLTAsMCArMSw3IEBACitvbmVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgdXJsLCBsaW5lbm8p
Cit7CisgICAgcG9zdE1lc3NhZ2UoIm9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBo
YXMgc2NyaXB0IGVycm9yICciICsgbWVzc2FnZSArICInIGF0IGxpbmUgIiArIGxpbmVubyk7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorCitmb28uYmFyID0gMDsKZGlmZiAtLWdpdCBhL0xheW91dFRl
c3RzL2Zhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1lcnJvci11bmhhbmRsZWQu
anMgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJy
b3ItdW5oYW5kbGVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNjYw
NWQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2Vz
L3dvcmtlci1zY3JpcHQtZXJyb3ItdW5oYW5kbGVkLmpzCkBAIC0wLDAgKzEgQEAKK2Zvby5iYXIg
PSAwOwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3dvcmtlci1jb25zdHJ1
Y3Rvci5odG1sIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3dvcmtlci1jb25zdHJ1Y3Rvci5o
dG1sCmluZGV4IDZiNjk5MjcuLjBmODNiZTEgMTAwNjQ0Ci0tLSBhL0xheW91dFRlc3RzL2Zhc3Qv
d29ya2Vycy93b3JrZXItY29uc3RydWN0b3IuaHRtbAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L3dv
cmtlcnMvd29ya2VyLWNvbnN0cnVjdG9yLmh0bWwKQEAgLTcsMTMgKzcsMjIgQEAgZnVuY3Rpb24g
bG9nKG1lc3NhZ2UpCiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdCIpLmlubmVy
SFRNTCArPSBtZXNzYWdlICsgIjxicj4iOwogfQogCit2YXIgdGVzdENhc2VzID0gWworICAgICJ0
ZXN0QXJndW1lbnRFeGNlcHRpb24iLAorICAgICJ0ZXN0UmVjdXJzaXZlV29ya2VyQ3JlYXRpb24i
LAorICAgICJ0ZXN0Tm9Bcmd1bWVudCIsCisgICAgInRlc3RFbXB0eVNjcmlwdFVybCIsCisgICAg
InRlc3RJbnZhbGlkU2NyaXB0VXJsIiwKKyAgICAidGVzdE5vdEV4aXN0ZW50U2NyaXB0VXJsIiwK
KyAgICAidGVzdFN1Y2Nlc3NXb3JrZXJDcmVhdGlvbiIsCitdOwordmFyIHRlc3RJbmRleCA9IDA7
CisKIGZ1bmN0aW9uIHJ1bk5leHRUZXN0KCkKIHsKLSAgICB0ZXN0SW5kZXgrKzsKLSAgICAvLyBM
b29wIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHRlc3RzIHRvIHJ1bgotICAgIHZhciB0ZXN0TmFt
ZSA9ICd0ZXN0JyArIHRlc3RJbmRleDsKLSAgICBpZiAod2luZG93W3Rlc3ROYW1lXSkgewotICAg
ICAgICB3aW5kb3dbdGVzdE5hbWVdKCk7CisgICAgaWYgKHRlc3RJbmRleCA8IHRlc3RDYXNlcy5s
ZW5ndGgpIHsKKyAgICAgICAgdGVzdEluZGV4Kys7CisgICAgICAgIHdpbmRvd1t0ZXN0Q2FzZXNb
dGVzdEluZGV4IC0gMV1dKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbG9nKCJET05FIik7CiAg
ICAgICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCkBAIC0yMSw3ICszMCw3IEBA
IGZ1bmN0aW9uIHJ1bk5leHRUZXN0KCkKICAgICB9CiB9CiAKLWZ1bmN0aW9uIHRlc3QxKCkKK2Z1
bmN0aW9uIHRlc3RBcmd1bWVudEV4Y2VwdGlvbigpCiB7CiAgICAgdHJ5IHsKICAgICAgICAgbmV3
IFdvcmtlcih7dG9TdHJpbmc6ZnVuY3Rpb24oKXt0aHJvdyAiZXhjZXB0aW9uIn19KQpAQCAtMzUs
NyArNDQsNyBAQCBmdW5jdGlvbiB0ZXN0MSgpCiAgICAgcnVuTmV4dFRlc3QoKTsKIH0KIAotZnVu
Y3Rpb24gdGVzdDIoKQorZnVuY3Rpb24gdGVzdFJlY3Vyc2l2ZVdvcmtlckNyZWF0aW9uKCkKIHsK
ICAgICB0cnkgewogICAgICAgICB2YXIgZm9vID0ge3RvU3RyaW5nOmZ1bmN0aW9uKCl7bmV3IFdv
cmtlcihmb28pfX0KQEAgLTQ3LDcgKzU2LDcgQEAgZnVuY3Rpb24gdGVzdDIoKQogICAgIHJ1bk5l
eHRUZXN0KCk7CiB9CiAKLWZ1bmN0aW9uIHRlc3QzKCkKK2Z1bmN0aW9uIHRlc3ROb0FyZ3VtZW50
KCkKIHsKICAgICB0cnkgewogICAgICAgICBuZXcgV29ya2VyKCk7CkBAIC01OCw3ICs2Nyw3IEBA
IGZ1bmN0aW9uIHRlc3QzKCkKICAgICBydW5OZXh0VGVzdCgpOwogfQogCi1mdW5jdGlvbiB0ZXN0
NCgpCitmdW5jdGlvbiB0ZXN0RW1wdHlTY3JpcHRVcmwoKQogewogICAgIHRyeSB7CiAgICAgICAg
IHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKCIiKTsKQEAgLTcyLDcgKzgxLDcgQEAgZnVuY3Rpb24g
dGVzdDQoKQogICAgIH0KIH0KIAotZnVuY3Rpb24gdGVzdDUoKQorZnVuY3Rpb24gdGVzdEludmFs
aWRTY3JpcHRVcmwoKQogewogICAgIHRyeSB7CiAgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29y
a2VyKCJpbnZhbGlkdXJsOi8vIik7CkBAIC04Niw3ICs5NSw3IEBAIGZ1bmN0aW9uIHRlc3Q1KCkK
ICAgICB9CiB9CiAKLWZ1bmN0aW9uIHRlc3Q2KCkKK2Z1bmN0aW9uIHRlc3ROb3RFeGlzdGVudFNj
cmlwdFVybCgpCiB7CiAgICAgdHJ5IHsKICAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIo
ImRvZXMtbm90LWV4aXN0LmpzIik7CkBAIC0xMDAsNyArMTA5LDcgQEAgZnVuY3Rpb24gdGVzdDYo
KQogICAgIH0KIH0KIAotZnVuY3Rpb24gdGVzdDcoKQorZnVuY3Rpb24gdGVzdFN1Y2Nlc3NXb3Jr
ZXJDcmVhdGlvbigpCiB7CiAgICAgdHJ5IHsKICAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3Jr
ZXIoInJlc291cmNlcy93b3JrZXItY29tbW9uLmpzIik7CkBAIC0xMjIsNyArMTMxLDYgQEAgaWYg
KHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgewogICAgIGxheW91dFRlc3RDb250cm9sbGVy
LndhaXRVbnRpbERvbmUoKTsKIH0KIAotdmFyIHRlc3RJbmRleCA9IDA7CiBydW5OZXh0VGVzdCgp
OwogCiA8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy93b3Jr
ZXItc2NyaXB0LWVycm9yLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy93
b3JrZXItc2NyaXB0LWVycm9yLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi4zZWVmMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC93
b3JrZXJzL3dvcmtlci1zY3JpcHQtZXJyb3ItZXhwZWN0ZWQudHh0CkBAIC0wLDAgKzEsMTAgQEAK
K0NPTlNPTEUgTUVTU0FHRTogbGluZSA3OiBSZWZlcmVuY2VFcnJvcjogQ2FuJ3QgZmluZCB2YXJp
YWJsZTogZm9vCitUZXN0IFdvcmtlciBzY3JpcHQgZXJyb3IgaGFuZGxpbmcgZnVuY3Rpb25hbGl0
eS4gU2hvdWxkIHByaW50IGEgc2VyaWVzIG9mIFBBU1MgbWVzc2FnZXMsIGZvbGxvd2VkIHdpdGgg
RE9ORS4KKworUEFTUzogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0IGhhcyBpbnZh
bGlkIHN5bnRheC4KK1BBU1M6IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBoYXMg
c2NyaXB0IGVycm9yICdSZWZlcmVuY2VFcnJvcjogQ2FuJ3QgZmluZCB2YXJpYWJsZTogZm9vJyBh
dCBsaW5lIDEuCitQQVNTOiBvbmVycm9yIGludm9rZWQgZm9yIGEgc2NyaXB0IHRoYXQgaGFzIHNj
cmlwdCBlcnJvciAnUmVmZXJlbmNlRXJyb3I6IENhbid0IGZpbmQgdmFyaWFibGU6IGZvbycgYXQg
bGluZSA3LgorUEFTUzogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0IGhhcyBzY3Jp
cHQgZXJyb3IgJ1JlZmVyZW5jZUVycm9yOiBDYW4ndCBmaW5kIHZhcmlhYmxlOiBmb28nIGF0IGxp
bmUgNy4KK1BBU1M6IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBXb3JrZXJHbG9iYWxTY29wZS5vbmVy
cm9yOiBvbmVycm9yIGludm9rZWQgZm9yIGEgc2NyaXB0IHRoYXQgaGFzIHNjcmlwdCBlcnJvciAn
UmVmZXJlbmNlRXJyb3I6IENhbid0IGZpbmQgdmFyaWFibGU6IGZvbycgYXQgbGluZSA3LgorRE9O
RQorCmRpZmYgLS1naXQgYS9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvd29ya2VyLXNjcmlwdC1l
cnJvci5odG1sIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3dvcmtlci1zY3JpcHQtZXJyb3Iu
aHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDUxYjMzCi0tLSAvZGV2
L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3dvcmtlci1zY3JpcHQtZXJyb3Iu
aHRtbApAQCAtMCwwICsxLDExOSBAQAorPGJvZHk+Cis8cD5UZXN0IFdvcmtlciBzY3JpcHQgZXJy
b3IgaGFuZGxpbmcgZnVuY3Rpb25hbGl0eS4gU2hvdWxkIHByaW50IGEgc2VyaWVzIG9mIFBBU1Mg
bWVzc2FnZXMsIGZvbGxvd2VkIHdpdGggRE9ORS48L3A+Cis8ZGl2IGlkPXJlc3VsdD48L2Rpdj4K
KzxzY3JpcHQ+CitmdW5jdGlvbiBsb2cobWVzc2FnZSkKK3sKKyAgICBkb2N1bWVudC5nZXRFbGVt
ZW50QnlJZCgicmVzdWx0IikuaW5uZXJIVE1MICs9IG1lc3NhZ2UgKyAiPGJyPiI7Cit9CisKK3Zh
ciB0ZXN0Q2FzZXMgPSBbCisgICAgInRlc3RJbnZhbGlkU2NyaXB0U3ludGF4IiwKKyAgICAidGVz
dFNjcmlwdEVycm9yVW5oYW5kbGVkIiwKKyAgICAidGVzdFNjcmlwdEVycm9yQnViYmxlZEFuZEhh
bmRsZWRJbldvcmtlciIsCisgICAgInRlc3RTY3JpcHRFcnJvckJ1YmJsZWRBbmRSZXBvcnRlZFRv
VXNlciIsCisgICAgInRlc3RTY3JpcHRFcnJvckhhbmRsZWQiLAorXTsKK3ZhciB0ZXN0SW5kZXgg
PSAwOworCitmdW5jdGlvbiBydW5OZXh0VGVzdCgpCit7CisgICAgaWYgKHRlc3RJbmRleCA8IHRl
c3RDYXNlcy5sZW5ndGgpIHsKKyAgICAgICAgdGVzdEluZGV4Kys7CisgICAgICAgIHdpbmRvd1t0
ZXN0Q2FzZXNbdGVzdEluZGV4IC0gMV1dKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbG9nKCJE
T05FIik7CisgICAgICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCisgICAgICAg
ICAgICBsYXlvdXRUZXN0Q29udHJvbGxlci5ub3RpZnlEb25lKCk7CisgICAgfQorfQorCitmdW5j
dGlvbiB0ZXN0SW52YWxpZFNjcmlwdFN5bnRheCgpCit7CisgICAgdHJ5IHsKKyAgICAgICAgdmFy
IHdvcmtlciA9IG5ldyBXb3JrZXIoInJlc291cmNlcy93b3JrZXItaW52YWxpZC1zeW50YXguanMi
KTsKKyAgICAgICAgd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHsKKyAgICAgICAgICAgIGxv
ZygiUEFTUzogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0IGhhcyBpbnZhbGlkIHN5
bnRheC4iKTsKKyAgICAgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGNhdGNoIChleCkgeworICAgICAgICBsb2coIkZBSUw6
IHVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBleCk7CisgICAgICAgIHJ1bk5leHRUZXN0KCk7Cisg
ICAgfQorfQorCitmdW5jdGlvbiB0ZXN0U2NyaXB0RXJyb3JVbmhhbmRsZWQoKQoreworICAgIHRy
eSB7CisgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKCJyZXNvdXJjZXMvd29ya2VyLXNj
cmlwdC1lcnJvci11bmhhbmRsZWQuanMiKTsKKyAgICAgICAgd29ya2VyLm9uZXJyb3IgPSBmdW5j
dGlvbihldnQpIHsKKyAgICAgICAgICAgIGxvZygiUEFTUzogb25lcnJvciBpbnZva2VkIGZvciBh
IHNjcmlwdCB0aGF0IGhhcyBzY3JpcHQgZXJyb3IgJyIgKyBldnQubWVzc2FnZSArICInIGF0IGxp
bmUgIiArIGV2dC5saW5lbm8gKyAiLiIpOworICAgICAgICAgICAgcnVuTmV4dFRlc3QoKTsKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKGV4KSB7Cisg
ICAgICAgIGxvZygiRkFJTDogdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4KTsKKyAgICAgICAg
cnVuTmV4dFRlc3QoKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIHRlc3RTY3JpcHRFcnJvckJ1YmJs
ZWRBbmRIYW5kbGVkSW5Xb3JrZXIoKQoreworICAgIHRyeSB7CisgICAgICAgIHZhciB3b3JrZXIg
PSBuZXcgV29ya2VyKCJyZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1lcnJvci1idWJibGVkLmpzIik7
CisgICAgICAgIHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgICAgICBs
b2coIlBBU1M6IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBoYXMgc2NyaXB0IGVy
cm9yICciICsgZXZ0Lm1lc3NhZ2UgKyAiJyBhdCBsaW5lICIgKyBldnQubGluZW5vICsgIi4iKTsK
KyAgICAgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICB9IGNhdGNoIChleCkgeworICAgICAgICBsb2coIkZBSUw6IHVuZXhwZWN0
ZWQgZXhjZXB0aW9uICIgKyBleCk7CisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorfQor
CitmdW5jdGlvbiB0ZXN0U2NyaXB0RXJyb3JCdWJibGVkQW5kUmVwb3J0ZWRUb1VzZXIoKQorewor
ICAgIHRyeSB7CisgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKCJyZXNvdXJjZXMvd29y
a2VyLXNjcmlwdC1lcnJvci1idWJibGVkLmpzIik7CisgICAgICAgIHdvcmtlci5vbmVycm9yID0g
ZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgICAgICBsb2coIlBBU1M6IG9uZXJyb3IgaW52b2tlZCBm
b3IgYSBzY3JpcHQgdGhhdCBoYXMgc2NyaXB0IGVycm9yICciICsgZXZ0Lm1lc3NhZ2UgKyAiJyBh
dCBsaW5lICIgKyBldnQubGluZW5vICsgIi4iKTsKKyAgICAgICAgICAgIHJ1bk5leHRUZXN0KCk7
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKGV4KSB7
CisgICAgICAgIGxvZygiRkFJTDogdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4KTsKKyAgICAg
ICAgcnVuTmV4dFRlc3QoKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIHRlc3RTY3JpcHRFcnJvckhh
bmRsZWQoKQoreworICAgIHRyeSB7CisgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKCJy
ZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1lcnJvci1oYW5kbGVkLmpzIik7CisgICAgICAgIHdvcmtl
ci5vbmVycm9yID0gZnVuY3Rpb24oZXZ0KSB7CisgICAgICAgICAgICBsb2coIkZBSUw6IG9uZXJy
b3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBoYXMgc2NyaXB0IGVycm9yICciICsgZXZ0Lm1l
c3NhZ2UgKyAiJyBhdCBsaW5lICIgKyBldnQubGluZW5vICsgIi4iKTsKKyAgICAgICAgICAgIHJ1
bk5leHRUZXN0KCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgICAgbG9nKCJQ
QVNTOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gV29ya2VyR2xvYmFsU2NvcGUub25lcnJvcjogIiAr
IGV2dC5kYXRhICsgIi4iKTsKKyAgICAgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgICAgIH0K
KyAgICB9IGNhdGNoIChleCkgeworICAgICAgICBsb2coIkZBSUw6IHVuZXhwZWN0ZWQgZXhjZXB0
aW9uICIgKyBleCk7CisgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgfQorfQorCitpZiAod2lu
ZG93LmxheW91dFRlc3RDb250cm9sbGVyKSB7CisgICAgbGF5b3V0VGVzdENvbnRyb2xsZXIuZHVt
cEFzVGV4dCgpOworICAgIGxheW91dFRlc3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKK30K
KworcnVuTmV4dFRlc3QoKTsKKworPC9zY3JpcHQ+Cis8L2JvZHk+CisKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzZjZDc5MS4uNDZmYmQ5
OSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2ViQ29yZS9DaGFuZ2VMb2cK
QEAgLTEsMyArMSwzOSBAQAorMjAwOS0wNy0yNCAgSmlhbiBMaSAgPGppYW5saUBjaHJvbWl1bS5v
cmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgRml4
IGVycm9yIGhhbmRsaW5nIGluIGRlZGljYXRlZCB3b3JrZXIgYW5kIHdvcmtlciBjb250ZXh0Lgor
ICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MjUKKwor
ICAgICAgICBUaGUgZm9sbG93aW5nIHByb2JsZW1zIGhhdmUgYmVlbiBmaXhlZDoKKyAgICAgICAg
MSkgVGhlIHVuY2F1Z2h0IHJ1bnRpbWUgc2NyaXB0IGVycm9yIGlzIG5vdCByZXBvcnRlZCB1c2lu
ZyB0aGUKKyAgICAgICAgV29ya2VyR2xvYmFsU2NvcGUgb2JqZWN0J3Mgb25lcnJvciBhdHRyaWJ1
dGUuCisgICAgICAgIDIpIElmIHRoZSBlcnJvciBpcyBzdGlsbCBub3QgaGFuZGxlZCBhZnRlcndh
cmRzIChvbmVycm9yIGF0dHJpYnV0ZQorICAgICAgICBpcyBub3QgZGVmaW5lZCBhcyBhIGZ1bmN0
aW9uIG9yIGl0IHJldHVybnMgdHJ1ZSksIHRoZSBlcnJvciBzaG91bGQKKyAgICAgICAgYmUgcmVw
b3J0ZWQgYmFjayB0byB0aGUgYXNzb2NpYXRlZCBXb3JrZXIgb2JqZWN0IGJ5IGZpcmluZyBhbgor
ICAgICAgICBFcnJvckV2ZW50LgorICAgICAgICAzKSBJZiB0aGUgZXJyb3IgaXMgc3RpbGwgbm90
IGhhbmRsZWQgYnkgdGhlIGFzc29jaWF0ZWQgV29ya2VyCisgICAgICAgIG9iamVjdCwgdGhlIGVy
cm9yIHNob3VsZCBiZSByZXBvcnRlZCB0byB0aGUgdXNlci4KKworICAgICAgICBUZXN0OiBmYXN0
L3dvcmtlcnMvd29ya2VyLXNjcmlwdC1lcnJvci5odG1sCisKKyAgICAgICAgKiBiaW5kaW5ncy9q
cy9KU0V2ZW50TGlzdGVuZXIuY3BwOgorICAgICAgICAoV2ViQ29yZTo6SlNFdmVudExpc3RlbmVy
OjpyZXBvcnRFcnJvcik6CisgICAgICAgICogYmluZGluZ3MvanMvSlNFdmVudExpc3RlbmVyLmg6
CisgICAgICAgICogZG9tL0V2ZW50TGlzdGVuZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6OkV2ZW50
TGlzdGVuZXI6OnJlcG9ydEVycm9yKTogYWRkcyBhIGZ1bmN0aW9uIHRvIGNhbGwKKyAgICAgICAg
RXZlbnRMaXN0ZW5lciBhcyBhIGZ1bmN0aW9uIHdpdGggMyBhcmd1bWVudHMgdG8gcmVwb3J0IGFu
IGVycm9yLgorICAgICAgICAqIHdvcmtlcnMvQWJzdHJhY3RXb3JrZXIuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6QWJzdHJhY3RXb3JrZXI6OmRpc3BhdGNoU2NyaXB0RXJyb3JFdmVudCk6CisgICAg
ICAgICogd29ya2Vycy9BYnN0cmFjdFdvcmtlci5oOgorICAgICAgICAqIHdvcmtlcnMvRGVkaWNh
dGVkV29ya2VyQ29udGV4dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpEZWRpY2F0ZWRXb3JrZXJD
b250ZXh0OjpyZXBvcnRFeGNlcHRpb24pOgorICAgICAgICAqIHdvcmtlcnMvV29ya2VyQ29udGV4
dC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpXb3JrZXJDb250ZXh0OjpyZXBvcnRFeGNlcHRpb24p
OgorICAgICAgICAqIHdvcmtlcnMvV29ya2VyTWVzc2FnaW5nUHJveHkuY3BwOgorICAgICAgICAo
V2ViQ29yZTo6V29ya2VyRXhjZXB0aW9uVGFzazo6cGVyZm9ybVRhc2spOgorICAgICAgICAqIHdv
cmtlcnMvV29ya2VyTWVzc2FnaW5nUHJveHkuaDoKKwogMjAwOS0wNy0yNCAgRHJldyBXaWxzb24g
IDxhdHdpbHNvbkBnb29nbGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGgu
CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTRXZlbnRMaXN0ZW5lci5jcHAgYi9X
ZWJDb3JlL2JpbmRpbmdzL2pzL0pTRXZlbnRMaXN0ZW5lci5jcHAKaW5kZXggYjllZDY4NS4uYTAy
M2M0ZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0V2ZW50TGlzdGVuZXIuY3Bw
CisrKyBiL1dlYkNvcmUvYmluZGluZ3MvanMvSlNFdmVudExpc3RlbmVyLmNwcApAQCAtMTUzLDYg
KzE1Myw1MiBAQCB2b2lkIEpTRXZlbnRMaXN0ZW5lcjo6aGFuZGxlRXZlbnQoRXZlbnQqIGV2ZW50
LCBib29sIGlzV2luZG93RXZlbnQpCiAgICAgfQogfQogCitib29sIEpTRXZlbnRMaXN0ZW5lcjo6
cmVwb3J0RXJyb3IoY29uc3QgU3RyaW5nJiBtZXNzYWdlLCBjb25zdCBTdHJpbmcmIHVybCwgaW50
IGxpbmVOdW1iZXIpCit7CisgICAgSlNMb2NrIGxvY2soZmFsc2UpOworCisgICAgSlNPYmplY3Qq
IGpzRnVuY3Rpb24gPSB0aGlzLT5qc0Z1bmN0aW9uKCk7CisgICAgaWYgKCFqc0Z1bmN0aW9uKQor
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsT2Jq
ZWN0ID0gbV9nbG9iYWxPYmplY3Q7CisgICAgaWYgKCFnbG9iYWxPYmplY3QpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIEV4ZWNTdGF0ZSogZXhlYyA9IGdsb2JhbE9iamVjdC0+Z2xvYmFs
RXhlYygpOworCisgICAgQ2FsbERhdGEgY2FsbERhdGE7CisgICAgQ2FsbFR5cGUgY2FsbFR5cGUg
PSBqc0Z1bmN0aW9uLT5nZXRDYWxsRGF0YShjYWxsRGF0YSk7CisKKyAgICBpZiAoY2FsbFR5cGUg
PT0gQ2FsbFR5cGVOb25lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBNYXJrZWRBcmd1
bWVudEJ1ZmZlciBhcmdzOworICAgIGFyZ3MuYXBwZW5kKGpzU3RyaW5nKGV4ZWMsIG1lc3NhZ2Up
KTsKKyAgICBhcmdzLmFwcGVuZChqc1N0cmluZyhleGVjLCB1cmwpKTsKKyAgICBhcmdzLmFwcGVu
ZChqc051bWJlcihleGVjLCBsaW5lTnVtYmVyKSk7CisKKyAgICAvLyBJZiB0aGlzIGV2ZW50IGhh
bmRsZXIgaXMgdGhlIGZpcnN0IEphdmFTY3JpcHQgdG8gZXhlY3V0ZSwgdGhlbiB0aGUKKyAgICAv
LyBkeW5hbWljIGdsb2JhbCBvYmplY3Qgc2hvdWxkIGJlIHNldCB0byB0aGUgZ2xvYmFsIG9iamVj
dCBvZiB0aGUKKyAgICAvLyB3aW5kb3cgaW4gd2hpY2ggdGhlIGV2ZW50IG9jY3VycmVkLgorICAg
IEpTR2xvYmFsRGF0YSogZ2xvYmFsRGF0YSA9IGdsb2JhbE9iamVjdC0+Z2xvYmFsRGF0YSgpOwor
ICAgIER5bmFtaWNHbG9iYWxPYmplY3RTY29wZSBnbG9iYWxPYmplY3RTY29wZShleGVjLCBnbG9i
YWxEYXRhLT5keW5hbWljR2xvYmFsT2JqZWN0ID8gZ2xvYmFsRGF0YS0+ZHluYW1pY0dsb2JhbE9i
amVjdCA6IGdsb2JhbE9iamVjdCk7ICAgIAorCisgICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBnbG9i
YWxPYmplY3QtPnRvVGhpc09iamVjdChleGVjKTsKKworICAgIGdsb2JhbE9iamVjdC0+Z2xvYmFs
RGF0YSgpLT50aW1lb3V0Q2hlY2tlci5zdGFydCgpOworICAgIEpTVmFsdWUgcmV0dXJuVmFsdWUg
PSBjYWxsKGV4ZWMsIGpzRnVuY3Rpb24sIGNhbGxUeXBlLCBjYWxsRGF0YSwgdGhpc1ZhbHVlLCBh
cmdzKTsKKyAgICBnbG9iYWxPYmplY3QtPmdsb2JhbERhdGEoKS0+dGltZW91dENoZWNrZXIuc3Rv
cCgpOworCisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKSB7CisgICAgICAgIHJlcG9ydEN1
cnJlbnRFeGNlcHRpb24oZXhlYyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAK
KyAgICBib29sIGRvTm90YnViYmxlRXZlbnQ7CisgICAgcmV0dXJuIHJldHVyblZhbHVlLmdldEJv
b2xlYW4oZG9Ob3RidWJibGVFdmVudCkgJiYgIWRvTm90YnViYmxlRXZlbnQ7Cit9CisKIGJvb2wg
SlNFdmVudExpc3RlbmVyOjp2aXJ0dWFsaXNBdHRyaWJ1dGUoKSBjb25zdAogewogICAgIHJldHVy
biBtX2lzQXR0cmlidXRlOwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0V2ZW50
TGlzdGVuZXIuaCBiL1dlYkNvcmUvYmluZGluZ3MvanMvSlNFdmVudExpc3RlbmVyLmgKaW5kZXgg
Y2UzNDgzMi4uMjQ5Nzc1MCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0V2ZW50
TGlzdGVuZXIuaAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTRXZlbnRMaXN0ZW5lci5oCkBA
IC00NSw2ICs0NSw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBwcml2YXRlOgogICAgICAg
ICB2aXJ0dWFsIHZvaWQgbWFya0pTRnVuY3Rpb24oKTsKICAgICAgICAgdmlydHVhbCB2b2lkIGhh
bmRsZUV2ZW50KEV2ZW50KiwgYm9vbCBpc1dpbmRvd0V2ZW50KTsKKyAgICAgICAgdmlydHVhbCBi
b29sIHJlcG9ydEVycm9yKGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgY29uc3QgU3RyaW5nJiB1cmws
IGludCBsaW5lTnVtYmVyKTsKICAgICAgICAgdmlydHVhbCBib29sIHZpcnR1YWxpc0F0dHJpYnV0
ZSgpIGNvbnN0OwogICAgICAgICB2b2lkIGNsZWFySlNGdW5jdGlvbklubGluZSgpOwogCmRpZmYg
LS1naXQgYS9XZWJDb3JlL2RvbS9FdmVudExpc3RlbmVyLmggYi9XZWJDb3JlL2RvbS9FdmVudExp
c3RlbmVyLmgKaW5kZXggZGJjNDFiMi4uZDI4OGM4ZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9kb20v
RXZlbnRMaXN0ZW5lci5oCisrKyBiL1dlYkNvcmUvZG9tL0V2ZW50TGlzdGVuZXIuaApAQCAtMjEs
NiArMjEsNyBAQAogI2lmbmRlZiBFdmVudExpc3RlbmVyX2gKICNkZWZpbmUgRXZlbnRMaXN0ZW5l
cl9oCiAKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgogI2luY2x1ZGUgPHd0Zi9SZWZDb3Vu
dGVkLmg+CiAKIG5hbWVzcGFjZSBKU0MgewpAQCAtMzUsNiArMzYsOCBAQCBuYW1lc3BhY2UgV2Vi
Q29yZSB7CiAgICAgcHVibGljOgogICAgICAgICB2aXJ0dWFsIH5FdmVudExpc3RlbmVyKCkgeyB9
CiAgICAgICAgIHZpcnR1YWwgdm9pZCBoYW5kbGVFdmVudChFdmVudCosIGJvb2wgaXNXaW5kb3dF
dmVudCA9IGZhbHNlKSA9IDA7CisgICAgICAgIC8vIFJldHVybiB0cnVlIHRvIGluZGljYXRlIHRo
YXQgdGhlIGVycm9yIGlzIGhhbmRsZWQuCisgICAgICAgIHZpcnR1YWwgYm9vbCByZXBvcnRFcnJv
cihjb25zdCBTdHJpbmcmIC8qbWVzc2FnZSovLCBjb25zdCBTdHJpbmcmIC8qdXJsKi8sIGludCAv
KmxpbmVOdW1iZXIqLykgeyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgdmlydHVhbCBib29sIHdh
c0NyZWF0ZWRGcm9tTWFya3VwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogI2lmIFVTRShK
U0MpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvQWJzdHJhY3RXb3JrZXIuY3BwIGIvV2Vi
Q29yZS93b3JrZXJzL0Fic3RyYWN0V29ya2VyLmNwcAppbmRleCBkNzc2NmI2Li43Y2IyYzExIDEw
MDY0NAotLS0gYS9XZWJDb3JlL3dvcmtlcnMvQWJzdHJhY3RXb3JrZXIuY3BwCisrKyBiL1dlYkNv
cmUvd29ya2Vycy9BYnN0cmFjdFdvcmtlci5jcHAKQEAgLTExNSwxOCArMTE1LDIzIEBAIHZvaWQg
QWJzdHJhY3RXb3JrZXI6OmRpc3BhdGNoTG9hZEVycm9yRXZlbnQoKQogICAgIEFTU0VSVCghZWMp
OwogfQogCi12b2lkIEFic3RyYWN0V29ya2VyOjpkaXNwYXRjaFNjcmlwdEVycm9yRXZlbnQoY29u
c3QgU3RyaW5nJiBtZXNzYWdlLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCwgaW50IGxpbmVOdW1i
ZXIpCitib29sIEFic3RyYWN0V29ya2VyOjpkaXNwYXRjaFNjcmlwdEVycm9yRXZlbnQoY29uc3Qg
U3RyaW5nJiBtZXNzYWdlLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCwgaW50IGxpbmVOdW1iZXIp
CiB7CisgICAgYm9vbCBoYW5kbGVkID0gZmFsc2U7CiAgICAgUmVmUHRyPEVycm9yRXZlbnQ+IGV2
ZW50ID0gRXJyb3JFdmVudDo6Y3JlYXRlKG1lc3NhZ2UsIHNvdXJjZVVSTCwgc3RhdGljX2Nhc3Q8
dW5zaWduZWQ+KGxpbmVOdW1iZXIpKTsKICAgICBpZiAobV9vbkVycm9yTGlzdGVuZXIpIHsKICAg
ICAgICAgZXZlbnQtPnNldFRhcmdldCh0aGlzKTsKICAgICAgICAgZXZlbnQtPnNldEN1cnJlbnRU
YXJnZXQodGhpcyk7CiAgICAgICAgIG1fb25FcnJvckxpc3RlbmVyLT5oYW5kbGVFdmVudChldmVu
dC5nZXQoKSwgdHJ1ZSk7CisgICAgICAgIGlmIChldmVudC0+ZGVmYXVsdFByZXZlbnRlZCgpKQor
ICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CiAgICAgfQogCiAgICAgRXhjZXB0aW9uQ29kZSBl
YyA9IDA7CiAgICAgZGlzcGF0Y2hFdmVudChldmVudC5yZWxlYXNlKCksIGVjKTsKICAgICBBU1NF
UlQoIWVjKTsKKworICAgIHJldHVybiBoYW5kbGVkOwogfQogCiB9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvQWJzdHJhY3RXb3JrZXIuaCBiL1dlYkNv
cmUvd29ya2Vycy9BYnN0cmFjdFdvcmtlci5oCmluZGV4IDViYzVlMmUuLjI4Y2M1MGQgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvd29ya2Vycy9BYnN0cmFjdFdvcmtlci5oCisrKyBiL1dlYkNvcmUvd29y
a2Vycy9BYnN0cmFjdFdvcmtlci5oCkBAIC01Niw3ICs1Niw3IEBAIG5hbWVzcGFjZSBXZWJDb3Jl
IHsKIAogICAgICAgICAvLyBVdGlsaXR5IHJvdXRpbmVzIHRvIGdlbmVyYXRlIGFwcHJvcHJpYXRl
IGVycm9yIGV2ZW50cyBmb3IgbG9hZGluZyBhbmQgc2NyaXB0IGV4Y2VwdGlvbnMuCiAgICAgICAg
IHZvaWQgZGlzcGF0Y2hMb2FkRXJyb3JFdmVudCgpOwotICAgICAgICB2b2lkIGRpc3BhdGNoU2Ny
aXB0RXJyb3JFdmVudChjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSwgY29uc3QgU3RyaW5nJiBz
b3VyY2VVUkwsIGludCk7CisgICAgICAgIGJvb2wgZGlzcGF0Y2hTY3JpcHRFcnJvckV2ZW50KGNv
bnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCwgaW50KTsK
IAogICAgICAgICB2b2lkIHNldE9uZXJyb3IoUGFzc1JlZlB0cjxFdmVudExpc3RlbmVyPiBldmVu
dExpc3RlbmVyKSB7IG1fb25FcnJvckxpc3RlbmVyID0gZXZlbnRMaXN0ZW5lcjsgfQogICAgICAg
ICBFdmVudExpc3RlbmVyKiBvbmVycm9yKCkgY29uc3QgeyByZXR1cm4gbV9vbkVycm9yTGlzdGVu
ZXIuZ2V0KCk7IH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvd29ya2Vycy9EZWRpY2F0ZWRXb3JrZXJD
b250ZXh0LmNwcCBiL1dlYkNvcmUvd29ya2Vycy9EZWRpY2F0ZWRXb3JrZXJDb250ZXh0LmNwcApp
bmRleCBkYWI4NTg3Li43OWY3MDY3IDEwMDY0NAotLS0gYS9XZWJDb3JlL3dvcmtlcnMvRGVkaWNh
dGVkV29ya2VyQ29udGV4dC5jcHAKKysrIGIvV2ViQ29yZS93b3JrZXJzL0RlZGljYXRlZFdvcmtl
ckNvbnRleHQuY3BwCkBAIC01NCw3ICs1NCwxMiBAQCBEZWRpY2F0ZWRXb3JrZXJDb250ZXh0Ojp+
RGVkaWNhdGVkV29ya2VyQ29udGV4dCgpCiAKIHZvaWQgRGVkaWNhdGVkV29ya2VyQ29udGV4dDo6
cmVwb3J0RXhjZXB0aW9uKGNvbnN0IFN0cmluZyYgZXJyb3JNZXNzYWdlLCBpbnQgbGluZU51bWJl
ciwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwpCiB7Ci0gICAgdGhyZWFkKCktPndvcmtlck9iamVj
dFByb3h5KCkucG9zdEV4Y2VwdGlvblRvV29ya2VyT2JqZWN0KGVycm9yTWVzc2FnZSwgbGluZU51
bWJlciwgc291cmNlVVJMKTsKKyAgICBib29sIGVycm9ySGFuZGxlZCA9IGZhbHNlOworICAgIGlm
IChvbmVycm9yKCkpCisgICAgICAgIGVycm9ySGFuZGxlZCA9IG9uZXJyb3IoKS0+cmVwb3J0RXJy
b3IoZXJyb3JNZXNzYWdlLCBzb3VyY2VVUkwsIGxpbmVOdW1iZXIpOworCisgICAgaWYgKCFlcnJv
ckhhbmRsZWQpCisgICAgICAgIHRocmVhZCgpLT53b3JrZXJPYmplY3RQcm94eSgpLnBvc3RFeGNl
cHRpb25Ub1dvcmtlck9iamVjdChlcnJvck1lc3NhZ2UsIGxpbmVOdW1iZXIsIHNvdXJjZVVSTCk7
CiB9CiAKIHZvaWQgRGVkaWNhdGVkV29ya2VyQ29udGV4dDo6cG9zdE1lc3NhZ2UoY29uc3QgU3Ry
aW5nJiBtZXNzYWdlLCBFeGNlcHRpb25Db2RlJiBlYykKZGlmZiAtLWdpdCBhL1dlYkNvcmUvd29y
a2Vycy9Xb3JrZXJDb250ZXh0LmNwcCBiL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJDb250ZXh0LmNw
cAppbmRleCA5NjVjMGE1Li4zM2Q5N2IyIDEwMDY0NAotLS0gYS9XZWJDb3JlL3dvcmtlcnMvV29y
a2VyQ29udGV4dC5jcHAKKysrIGIvV2ViQ29yZS93b3JrZXJzL1dvcmtlckNvbnRleHQuY3BwCkBA
IC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSAiRE9NV2luZG93LmgiCiAjaW5jbHVkZSAiRXZlbnQu
aCIKICNpbmNsdWRlICJFdmVudEV4Y2VwdGlvbi5oIgorI2luY2x1ZGUgIkV2ZW50TmFtZXMuaCIK
ICNpbmNsdWRlICJNZXNzYWdlUG9ydC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAj
aW5jbHVkZSAiU2NyaXB0U291cmNlQ29kZS5oIgpAQCAtMTM5LDkgKzE0MCw4IEBAIGJvb2wgV29y
a2VyQ29udGV4dDo6aGFzUGVuZGluZ0FjdGl2aXR5KCkgY29uc3QKICAgICByZXR1cm4gZmFsc2U7
CiB9CiAKLXZvaWQgV29ya2VyQ29udGV4dDo6cmVwb3J0RXhjZXB0aW9uKGNvbnN0IFN0cmluZyYg
ZXJyb3JNZXNzYWdlLCBpbnQgbGluZU51bWJlciwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwpCit2
b2lkIFdvcmtlckNvbnRleHQ6OnJlcG9ydEV4Y2VwdGlvbihjb25zdCBTdHJpbmcmLCBpbnQsIGNv
bnN0IFN0cmluZyYpCiB7Ci0gICAgbV90aHJlYWQtPndvcmtlck9iamVjdFByb3h5KCkucG9zdEV4
Y2VwdGlvblRvV29ya2VyT2JqZWN0KGVycm9yTWVzc2FnZSwgbGluZU51bWJlciwgc291cmNlVVJM
KTsKIH0KIAogdm9pZCBXb3JrZXJDb250ZXh0OjphZGRNZXNzYWdlKE1lc3NhZ2VEZXN0aW5hdGlv
biBkZXN0aW5hdGlvbiwgTWVzc2FnZVNvdXJjZSBzb3VyY2UsIE1lc3NhZ2VUeXBlIHR5cGUsIE1l
c3NhZ2VMZXZlbCBsZXZlbCwgY29uc3QgU3RyaW5nJiBtZXNzYWdlLCB1bnNpZ25lZCBsaW5lTnVt
YmVyLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCkKZGlmZiAtLWdpdCBhL1dlYkNvcmUvd29ya2Vy
cy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5jcHAgYi9XZWJDb3JlL3dvcmtlcnMvV29ya2VyTWVzc2Fn
aW5nUHJveHkuY3BwCmluZGV4IDliYWMyYzguLjU5NzFjMWQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUv
d29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5jcHAKKysrIGIvV2ViQ29yZS93b3JrZXJzL1dv
cmtlck1lc3NhZ2luZ1Byb3h5LmNwcApAQCAtMTI3LDcgKzEyNywxNSBAQCBwcml2YXRlOgogCiAg
ICAgdmlydHVhbCB2b2lkIHBlcmZvcm1UYXNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRl
eHQpCiAgICAgewotICAgICAgICBpZiAoIW1fbWVzc2FnaW5nUHJveHktPmFza2VkVG9UZXJtaW5h
dGUoKSkKKyAgICAgICAgV29ya2VyKiB3b3JrZXJPYmplY3QgPSBtX21lc3NhZ2luZ1Byb3h5LT53
b3JrZXJPYmplY3QoKTsKKyAgICAgICAgaWYgKCF3b3JrZXJPYmplY3QgfHwgbV9tZXNzYWdpbmdQ
cm94eS0+YXNrZWRUb1Rlcm1pbmF0ZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IGJvb2wgZXJyb3JIYW5kbGVkID0gZmFsc2U7CisgICAgICAgIGlmICh3b3JrZXJPYmplY3QtPm9u
ZXJyb3IoKSkKKyAgICAgICAgICAgIGVycm9ySGFuZGxlZCA9IHdvcmtlck9iamVjdC0+ZGlzcGF0
Y2hTY3JpcHRFcnJvckV2ZW50KG1fZXJyb3JNZXNzYWdlLCBtX3NvdXJjZVVSTCwgbV9saW5lTnVt
YmVyKTsKKworICAgICAgICBpZiAoIWVycm9ySGFuZGxlZCkKICAgICAgICAgICAgIGNvbnRleHQt
PnJlcG9ydEV4Y2VwdGlvbihtX2Vycm9yTWVzc2FnZSwgbV9saW5lTnVtYmVyLCBtX3NvdXJjZVVS
TCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvV29ya2VyTWVzc2FnaW5n
UHJveHkuaCBiL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5oCmluZGV4IGUx
M2ViMTEuLmI3MDVjYTQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJNZXNzYWdp
bmdQcm94eS5oCisrKyBiL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5oCkBA
IC04Miw2ICs4Miw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBwcml2YXRlOgogICAgICAg
ICBmcmllbmQgY2xhc3MgTWVzc2FnZVdvcmtlclRhc2s7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBX
b3JrZXJDb250ZXh0RGVzdHJveWVkVGFzazsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFdvcmtlckV4
Y2VwdGlvblRhc2s7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBXb3JrZXJUaHJlYWRBY3Rpdml0eVJl
cG9ydFRhc2s7CiAKICAgICAgICAgdmlydHVhbCB+V29ya2VyTWVzc2FnaW5nUHJveHkoKTsK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33475</attachid>
            <date>2009-07-24 16:19:11 -0700</date>
            <delta_ts>2009-07-24 16:36:31 -0700</delta_ts>
            <desc>Proposed Patch</desc>
            <filename>27525_3</filename>
            <type>text/plain</type>
            <size>21654</size>
            <attacher name="Jian Li">jianli</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL0NoYW5nZUxvZyBiL0xheW91dFRlc3RzL0NoYW5nZUxv
ZwppbmRleCAwZDA1ZDBjLi5kMDA2YzMyIDEwMDY0NAotLS0gYS9MYXlvdXRUZXN0cy9DaGFuZ2VM
b2cKKysrIGIvTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjEgQEAKKzIwMDktMDct
MjQgIEppYW4gTGkgIDxqaWFubGlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIExheW91dCB0ZXN0cyBmb3IgZml4aW5nIGVycm9y
IGhhbmRsaW5nIGluIGRlZGljYXRlZCB3b3JrZXIgYW5kIHdvcmtlcgorICAgICAgICBjb250ZXh0
LgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1MjUK
KworICAgICAgICAqIGZhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLWVycm9yLWluLWhhbmRs
aW5nLXNjcmlwdC1lcnJvci5qczogQWRkZWQKKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvcmVzb3Vy
Y2VzL3dvcmtlci1pbnZhbGlkLXN5bnRheC5qczogQWRkZWQuCisgICAgICAgICogZmFzdC93b3Jr
ZXJzL3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLWJ1YmJsZWQuanM6IEFkZGVkLgorICAg
ICAgICAqIGZhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1lcnJvci1oYW5kbGVk
LmpzOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1zY3Jp
cHQtZXJyb3ItdW5oYW5kbGVkLmpzOiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvd29y
a2VyLWNvbnN0cnVjdG9yLmh0bWw6CisgICAgICAgICogZmFzdC93b3JrZXJzL3dvcmtlci1zY3Jp
cHQtZXJyb3ItZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAgKiBmYXN0L3dvcmtlcnMvd29y
a2VyLXNjcmlwdC1lcnJvci5odG1sOiBBZGRlZC4KKyAgICAgICAgQWRkIHRlc3QgY2FzZXMgdG8g
Y292ZXIgZGlmZmVyZW50IHNjcmlwdCBlcnJvciBoYW5kbGluZyBzY2VuYXJpb3MuCisKIDIwMDkt
MDctMjQgIERyZXcgV2lsc29uICA8YXR3aWxzb25AZ29vZ2xlLmNvbT4KIAogICAgICAgICBSZXZp
ZXdlZCBieSBBZGFtIEJhcnRoLgpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJz
L3Jlc291cmNlcy93b3JrZXItZXJyb3ItaW4taGFuZGxpbmctc2NyaXB0LWVycm9yLmpzIGIvTGF5
b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItZXJyb3ItaW4taGFuZGxpbmct
c2NyaXB0LWVycm9yLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4Yjhk
MGMKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2Vz
L3dvcmtlci1lcnJvci1pbi1oYW5kbGluZy1zY3JpcHQtZXJyb3IuanMKQEAgLTAsMCArMSw3IEBA
CitvbmVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgdXJsLCBsaW5lbm8pCit7CisgICAgYmFyLmZv
byA9IDA7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitmb28uYmFyID0gMDsKZGlmZiAtLWdpdCBh
L0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLWludmFsaWQtc3ludGF4
LmpzIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItaW52YWxpZC1z
eW50YXguanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0ZWVhNgotLS0g
L2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2Vy
LWludmFsaWQtc3ludGF4LmpzCkBAIC0wLDAgKzEgQEAKK0ludmFsaWQgc3ludGF4LgpkaWZmIC0t
Z2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVy
cm9yLWJ1YmJsZWQuanMgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtl
ci1zY3JpcHQtZXJyb3ItYnViYmxlZC5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi5hMjBkNDEwCi0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJz
L3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLWJ1YmJsZWQuanMKQEAgLTAsMCArMSw3IEBA
CitvbmVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwgdXJsLCBsaW5lbm8pCit7CisgICAgcG9zdE1l
c3NhZ2UoIm9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBoYXMgc2NyaXB0IGVycm9y
ICciICsgbWVzc2FnZSArICInIGF0IGxpbmUgIiArIGxpbmVubyk7CisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Zvby5iYXIgPSAwOwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJz
L3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLWhhbmRsZWQuanMgYi9MYXlvdXRUZXN0cy9m
YXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJyb3ItaGFuZGxlZC5qcwpuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQ5MDc3Ci0tLSAvZGV2L251bGwKKysr
IGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3Jlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9y
LWhhbmRsZWQuanMKQEAgLTAsMCArMSw3IEBACitvbmVycm9yID0gZnVuY3Rpb24obWVzc2FnZSwg
dXJsLCBsaW5lbm8pCit7CisgICAgcG9zdE1lc3NhZ2UoIm9uZXJyb3IgaW52b2tlZCBmb3IgYSBz
Y3JpcHQgdGhhdCBoYXMgc2NyaXB0IGVycm9yICciICsgbWVzc2FnZSArICInIGF0IGxpbmUgIiAr
IGxpbmVubyk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitmb28uYmFyID0gMDsKZGlmZiAtLWdp
dCBhL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy9yZXNvdXJjZXMvd29ya2VyLXNjcmlwdC1lcnJv
ci11bmhhbmRsZWQuanMgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtlcnMvcmVzb3VyY2VzL3dvcmtl
ci1zY3JpcHQtZXJyb3ItdW5oYW5kbGVkLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjVhNjYwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9MYXlvdXRUZXN0cy9mYXN0L3dvcmtl
cnMvcmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJyb3ItdW5oYW5kbGVkLmpzCkBAIC0wLDAgKzEg
QEAKK2Zvby5iYXIgPSAwOwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3dv
cmtlci1jb25zdHJ1Y3Rvci5odG1sIGIvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3dvcmtlci1j
b25zdHJ1Y3Rvci5odG1sCmluZGV4IDZiNjk5MjcuLjBmODNiZTEgMTAwNjQ0Ci0tLSBhL0xheW91
dFRlc3RzL2Zhc3Qvd29ya2Vycy93b3JrZXItY29uc3RydWN0b3IuaHRtbAorKysgYi9MYXlvdXRU
ZXN0cy9mYXN0L3dvcmtlcnMvd29ya2VyLWNvbnN0cnVjdG9yLmh0bWwKQEAgLTcsMTMgKzcsMjIg
QEAgZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInJl
c3VsdCIpLmlubmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4iOwogfQogCit2YXIgdGVzdENhc2Vz
ID0gWworICAgICJ0ZXN0QXJndW1lbnRFeGNlcHRpb24iLAorICAgICJ0ZXN0UmVjdXJzaXZlV29y
a2VyQ3JlYXRpb24iLAorICAgICJ0ZXN0Tm9Bcmd1bWVudCIsCisgICAgInRlc3RFbXB0eVNjcmlw
dFVybCIsCisgICAgInRlc3RJbnZhbGlkU2NyaXB0VXJsIiwKKyAgICAidGVzdE5vdEV4aXN0ZW50
U2NyaXB0VXJsIiwKKyAgICAidGVzdFN1Y2Nlc3NXb3JrZXJDcmVhdGlvbiIsCitdOwordmFyIHRl
c3RJbmRleCA9IDA7CisKIGZ1bmN0aW9uIHJ1bk5leHRUZXN0KCkKIHsKLSAgICB0ZXN0SW5kZXgr
KzsKLSAgICAvLyBMb29wIHVudGlsIHRoZXJlIGFyZSBubyBtb3JlIHRlc3RzIHRvIHJ1bgotICAg
IHZhciB0ZXN0TmFtZSA9ICd0ZXN0JyArIHRlc3RJbmRleDsKLSAgICBpZiAod2luZG93W3Rlc3RO
YW1lXSkgewotICAgICAgICB3aW5kb3dbdGVzdE5hbWVdKCk7CisgICAgaWYgKHRlc3RJbmRleCA8
IHRlc3RDYXNlcy5sZW5ndGgpIHsKKyAgICAgICAgdGVzdEluZGV4Kys7CisgICAgICAgIHdpbmRv
d1t0ZXN0Q2FzZXNbdGVzdEluZGV4IC0gMV1dKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbG9n
KCJET05FIik7CiAgICAgICAgIGlmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpCkBAIC0y
MSw3ICszMCw3IEBAIGZ1bmN0aW9uIHJ1bk5leHRUZXN0KCkKICAgICB9CiB9CiAKLWZ1bmN0aW9u
IHRlc3QxKCkKK2Z1bmN0aW9uIHRlc3RBcmd1bWVudEV4Y2VwdGlvbigpCiB7CiAgICAgdHJ5IHsK
ICAgICAgICAgbmV3IFdvcmtlcih7dG9TdHJpbmc6ZnVuY3Rpb24oKXt0aHJvdyAiZXhjZXB0aW9u
In19KQpAQCAtMzUsNyArNDQsNyBAQCBmdW5jdGlvbiB0ZXN0MSgpCiAgICAgcnVuTmV4dFRlc3Qo
KTsKIH0KIAotZnVuY3Rpb24gdGVzdDIoKQorZnVuY3Rpb24gdGVzdFJlY3Vyc2l2ZVdvcmtlckNy
ZWF0aW9uKCkKIHsKICAgICB0cnkgewogICAgICAgICB2YXIgZm9vID0ge3RvU3RyaW5nOmZ1bmN0
aW9uKCl7bmV3IFdvcmtlcihmb28pfX0KQEAgLTQ3LDcgKzU2LDcgQEAgZnVuY3Rpb24gdGVzdDIo
KQogICAgIHJ1bk5leHRUZXN0KCk7CiB9CiAKLWZ1bmN0aW9uIHRlc3QzKCkKK2Z1bmN0aW9uIHRl
c3ROb0FyZ3VtZW50KCkKIHsKICAgICB0cnkgewogICAgICAgICBuZXcgV29ya2VyKCk7CkBAIC01
OCw3ICs2Nyw3IEBAIGZ1bmN0aW9uIHRlc3QzKCkKICAgICBydW5OZXh0VGVzdCgpOwogfQogCi1m
dW5jdGlvbiB0ZXN0NCgpCitmdW5jdGlvbiB0ZXN0RW1wdHlTY3JpcHRVcmwoKQogewogICAgIHRy
eSB7CiAgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKCIiKTsKQEAgLTcyLDcgKzgxLDcg
QEAgZnVuY3Rpb24gdGVzdDQoKQogICAgIH0KIH0KIAotZnVuY3Rpb24gdGVzdDUoKQorZnVuY3Rp
b24gdGVzdEludmFsaWRTY3JpcHRVcmwoKQogewogICAgIHRyeSB7CiAgICAgICAgIHZhciB3b3Jr
ZXIgPSBuZXcgV29ya2VyKCJpbnZhbGlkdXJsOi8vIik7CkBAIC04Niw3ICs5NSw3IEBAIGZ1bmN0
aW9uIHRlc3Q1KCkKICAgICB9CiB9CiAKLWZ1bmN0aW9uIHRlc3Q2KCkKK2Z1bmN0aW9uIHRlc3RO
b3RFeGlzdGVudFNjcmlwdFVybCgpCiB7CiAgICAgdHJ5IHsKICAgICAgICAgdmFyIHdvcmtlciA9
IG5ldyBXb3JrZXIoImRvZXMtbm90LWV4aXN0LmpzIik7CkBAIC0xMDAsNyArMTA5LDcgQEAgZnVu
Y3Rpb24gdGVzdDYoKQogICAgIH0KIH0KIAotZnVuY3Rpb24gdGVzdDcoKQorZnVuY3Rpb24gdGVz
dFN1Y2Nlc3NXb3JrZXJDcmVhdGlvbigpCiB7CiAgICAgdHJ5IHsKICAgICAgICAgdmFyIHdvcmtl
ciA9IG5ldyBXb3JrZXIoInJlc291cmNlcy93b3JrZXItY29tbW9uLmpzIik7CkBAIC0xMjIsNyAr
MTMxLDYgQEAgaWYgKHdpbmRvdy5sYXlvdXRUZXN0Q29udHJvbGxlcikgewogICAgIGxheW91dFRl
c3RDb250cm9sbGVyLndhaXRVbnRpbERvbmUoKTsKIH0KIAotdmFyIHRlc3RJbmRleCA9IDA7CiBy
dW5OZXh0VGVzdCgpOwogCiA8L3NjcmlwdD4KZGlmZiAtLWdpdCBhL0xheW91dFRlc3RzL2Zhc3Qv
d29ya2Vycy93b3JrZXItc2NyaXB0LWVycm9yLWV4cGVjdGVkLnR4dCBiL0xheW91dFRlc3RzL2Zh
c3Qvd29ya2Vycy93b3JrZXItc2NyaXB0LWVycm9yLWV4cGVjdGVkLnR4dApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGUyNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvTGF5b3V0
VGVzdHMvZmFzdC93b3JrZXJzL3dvcmtlci1zY3JpcHQtZXJyb3ItZXhwZWN0ZWQudHh0CkBAIC0w
LDAgKzEsMTEgQEAKK0NPTlNPTEUgTUVTU0FHRTogbGluZSA3OiBSZWZlcmVuY2VFcnJvcjogQ2Fu
J3QgZmluZCB2YXJpYWJsZTogZm9vCitUZXN0IFdvcmtlciBzY3JpcHQgZXJyb3IgaGFuZGxpbmcg
ZnVuY3Rpb25hbGl0eS4gU2hvdWxkIHByaW50IGEgc2VyaWVzIG9mIFBBU1MgbWVzc2FnZXMsIGZv
bGxvd2VkIHdpdGggRE9ORS4KKworUEFTUzogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0
aGF0IGhhcyBpbnZhbGlkIHN5bnRheC4KK1BBU1M6IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3Jp
cHQgdGhhdCBoYXMgc2NyaXB0IGVycm9yICdSZWZlcmVuY2VFcnJvcjogQ2FuJ3QgZmluZCB2YXJp
YWJsZTogZm9vJyBhdCBsaW5lIDEuCitQQVNTOiBvbmVycm9yIGludm9rZWQgZm9yIGEgc2NyaXB0
IHRoYXQgaGFzIHNjcmlwdCBlcnJvciAnUmVmZXJlbmNlRXJyb3I6IENhbid0IGZpbmQgdmFyaWFi
bGU6IGZvbycgYXQgbGluZSA3LgorUEFTUzogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0
aGF0IGhhcyBzY3JpcHQgZXJyb3IgJ1JlZmVyZW5jZUVycm9yOiBDYW4ndCBmaW5kIHZhcmlhYmxl
OiBmb28nIGF0IGxpbmUgNy4KK1BBU1M6IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhh
dCBoYXMgc2NyaXB0IGVycm9yICdSZWZlcmVuY2VFcnJvcjogQ2FuJ3QgZmluZCB2YXJpYWJsZTog
Zm9vJyBhdCBsaW5lIDcuCitQQVNTOiBtZXNzYWdlIHJlY2VpdmVkIGZyb20gV29ya2VyR2xvYmFs
U2NvcGUub25lcnJvcjogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0IGhhcyBzY3Jp
cHQgZXJyb3IgJ1JlZmVyZW5jZUVycm9yOiBDYW4ndCBmaW5kIHZhcmlhYmxlOiBmb28nIGF0IGxp
bmUgNy4KK0RPTkUKKwpkaWZmIC0tZ2l0IGEvTGF5b3V0VGVzdHMvZmFzdC93b3JrZXJzL3dvcmtl
ci1zY3JpcHQtZXJyb3IuaHRtbCBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy93b3JrZXItc2Ny
aXB0LWVycm9yLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1MDg2
OAotLS0gL2Rldi9udWxsCisrKyBiL0xheW91dFRlc3RzL2Zhc3Qvd29ya2Vycy93b3JrZXItc2Ny
aXB0LWVycm9yLmh0bWwKQEAgLTAsMCArMSwxMzUgQEAKKzxib2R5PgorPHA+VGVzdCBXb3JrZXIg
c2NyaXB0IGVycm9yIGhhbmRsaW5nIGZ1bmN0aW9uYWxpdHkuIFNob3VsZCBwcmludCBhIHNlcmll
cyBvZiBQQVNTIG1lc3NhZ2VzLCBmb2xsb3dlZCB3aXRoIERPTkUuPC9wPgorPGRpdiBpZD1yZXN1
bHQ+PC9kaXY+Cis8c2NyaXB0PgorZnVuY3Rpb24gbG9nKG1lc3NhZ2UpCit7CisgICAgZG9jdW1l
bnQuZ2V0RWxlbWVudEJ5SWQoInJlc3VsdCIpLmlubmVySFRNTCArPSBtZXNzYWdlICsgIjxicj4i
OworfQorCit2YXIgdGVzdENhc2VzID0gWworICAgICJ0ZXN0SW52YWxpZFNjcmlwdFN5bnRheCIs
CisgICAgInRlc3RTY3JpcHRFcnJvclVuaGFuZGxlZCIsCisgICAgInRlc3RFcnJvckluSGFuZGxp
bmdTY3JpcHRFcnJvciIsCisgICAgInRlc3RTY3JpcHRFcnJvckJ1YmJsZWRBbmRIYW5kbGVkSW5X
b3JrZXIiLAorICAgICJ0ZXN0U2NyaXB0RXJyb3JCdWJibGVkQW5kUmVwb3J0ZWRUb1VzZXIiLAor
ICAgICJ0ZXN0U2NyaXB0RXJyb3JIYW5kbGVkIiwKK107Cit2YXIgdGVzdEluZGV4ID0gMDsKKwor
ZnVuY3Rpb24gcnVuTmV4dFRlc3QoKQoreworICAgIGlmICh0ZXN0SW5kZXggPCB0ZXN0Q2FzZXMu
bGVuZ3RoKSB7CisgICAgICAgIHRlc3RJbmRleCsrOworICAgICAgICB3aW5kb3dbdGVzdENhc2Vz
W3Rlc3RJbmRleCAtIDFdXSgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGxvZygiRE9ORSIpOwor
ICAgICAgICBpZiAod2luZG93LmxheW91dFRlc3RDb250cm9sbGVyKQorICAgICAgICAgICAgbGF5
b3V0VGVzdENvbnRyb2xsZXIubm90aWZ5RG9uZSgpOworICAgIH0KK30KKworZnVuY3Rpb24gdGVz
dEludmFsaWRTY3JpcHRTeW50YXgoKQoreworICAgIHRyeSB7CisgICAgICAgIHZhciB3b3JrZXIg
PSBuZXcgV29ya2VyKCJyZXNvdXJjZXMvd29ya2VyLWludmFsaWQtc3ludGF4LmpzIik7CisgICAg
ICAgIHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oKSB7CisgICAgICAgICAgICBsb2coIlBBU1M6
IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQgdGhhdCBoYXMgaW52YWxpZCBzeW50YXguIik7
CisgICAgICAgICAgICBydW5OZXh0VGVzdCgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgbG9nKCJGQUlMOiB1bmV4cGVj
dGVkIGV4Y2VwdGlvbiAiICsgZXgpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KK30K
KworZnVuY3Rpb24gdGVzdFNjcmlwdEVycm9yVW5oYW5kbGVkKCkKK3sKKyAgICB0cnkgeworICAg
ICAgICB2YXIgd29ya2VyID0gbmV3IFdvcmtlcigicmVzb3VyY2VzL3dvcmtlci1zY3JpcHQtZXJy
b3ItdW5oYW5kbGVkLmpzIik7CisgICAgICAgIHdvcmtlci5vbmVycm9yID0gZnVuY3Rpb24oZXZ0
KSB7CisgICAgICAgICAgICBsb2coIlBBU1M6IG9uZXJyb3IgaW52b2tlZCBmb3IgYSBzY3JpcHQg
dGhhdCBoYXMgc2NyaXB0IGVycm9yICciICsgZXZ0Lm1lc3NhZ2UgKyAiJyBhdCBsaW5lICIgKyBl
dnQubGluZW5vICsgIi4iKTsKKyAgICAgICAgICAgIHJ1bk5leHRUZXN0KCk7CisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGNhdGNoIChleCkgeworICAgICAgICBs
b2coIkZBSUw6IHVuZXhwZWN0ZWQgZXhjZXB0aW9uICIgKyBleCk7CisgICAgICAgIHJ1bk5leHRU
ZXN0KCk7CisgICAgfQorfQorCitmdW5jdGlvbiB0ZXN0RXJyb3JJbkhhbmRsaW5nU2NyaXB0RXJy
b3IoKQoreworICAgIHRyeSB7CisgICAgICAgIHZhciB3b3JrZXIgPSBuZXcgV29ya2VyKCJyZXNv
dXJjZXMvd29ya2VyLWVycm9yLWluLWhhbmRsaW5nLXNjcmlwdC1lcnJvci5qcyIpOworICAgICAg
ICB3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGV2dCkgeworICAgICAgICAgICAgbG9nKCJQQVNT
OiBvbmVycm9yIGludm9rZWQgZm9yIGEgc2NyaXB0IHRoYXQgaGFzIHNjcmlwdCBlcnJvciAnIiAr
IGV2dC5tZXNzYWdlICsgIicgYXQgbGluZSAiICsgZXZ0LmxpbmVubyArICIuIik7CisgICAgICAg
ICAgICBydW5OZXh0VGVzdCgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgbG9nKCJGQUlMOiB1bmV4cGVjdGVkIGV4Y2Vw
dGlvbiAiICsgZXgpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KK30KKworZnVuY3Rp
b24gdGVzdFNjcmlwdEVycm9yQnViYmxlZEFuZEhhbmRsZWRJbldvcmtlcigpCit7CisgICAgdHJ5
IHsKKyAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIoInJlc291cmNlcy93b3JrZXItc2Ny
aXB0LWVycm9yLWJ1YmJsZWQuanMiKTsKKyAgICAgICAgd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlv
bihldnQpIHsKKyAgICAgICAgICAgIGxvZygiUEFTUzogb25lcnJvciBpbnZva2VkIGZvciBhIHNj
cmlwdCB0aGF0IGhhcyBzY3JpcHQgZXJyb3IgJyIgKyBldnQubWVzc2FnZSArICInIGF0IGxpbmUg
IiArIGV2dC5saW5lbm8gKyAiLiIpOworICAgICAgICAgICAgcnVuTmV4dFRlc3QoKTsKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKGV4KSB7CisgICAg
ICAgIGxvZygiRkFJTDogdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4KTsKKyAgICAgICAgcnVu
TmV4dFRlc3QoKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIHRlc3RTY3JpcHRFcnJvckJ1YmJsZWRB
bmRSZXBvcnRlZFRvVXNlcigpCit7CisgICAgdHJ5IHsKKyAgICAgICAgdmFyIHdvcmtlciA9IG5l
dyBXb3JrZXIoInJlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLWJ1YmJsZWQuanMiKTsKKyAg
ICAgICAgd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihldnQpIHsKKyAgICAgICAgICAgIGxvZygi
UEFTUzogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0IGhhcyBzY3JpcHQgZXJyb3Ig
JyIgKyBldnQubWVzc2FnZSArICInIGF0IGxpbmUgIiArIGV2dC5saW5lbm8gKyAiLiIpOworICAg
ICAgICAgICAgcnVuTmV4dFRlc3QoKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICB9CisgICAgfSBjYXRjaCAoZXgpIHsKKyAgICAgICAgbG9nKCJGQUlMOiB1bmV4cGVjdGVkIGV4
Y2VwdGlvbiAiICsgZXgpOworICAgICAgICBydW5OZXh0VGVzdCgpOworICAgIH0KK30KKworZnVu
Y3Rpb24gdGVzdFNjcmlwdEVycm9ySGFuZGxlZCgpCit7CisgICAgdHJ5IHsKKyAgICAgICAgdmFy
IHdvcmtlciA9IG5ldyBXb3JrZXIoInJlc291cmNlcy93b3JrZXItc2NyaXB0LWVycm9yLWhhbmRs
ZWQuanMiKTsKKyAgICAgICAgd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihldnQpIHsKKyAgICAg
ICAgICAgIGxvZygiRkFJTDogb25lcnJvciBpbnZva2VkIGZvciBhIHNjcmlwdCB0aGF0IGhhcyBz
Y3JpcHQgZXJyb3IgJyIgKyBldnQubWVzc2FnZSArICInIGF0IGxpbmUgIiArIGV2dC5saW5lbm8g
KyAiLiIpOworICAgICAgICAgICAgcnVuTmV4dFRlc3QoKTsKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgICAgICB3b3JrZXIub25tZXNzYWdlID0gZnVuY3Rpb24oZXZ0
KSB7CisgICAgICAgICAgICBsb2coIlBBU1M6IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBXb3JrZXJH
bG9iYWxTY29wZS5vbmVycm9yOiAiICsgZXZ0LmRhdGEgKyAiLiIpOworICAgICAgICAgICAgcnVu
TmV4dFRlc3QoKTsKKyAgICAgICAgfQorICAgIH0gY2F0Y2ggKGV4KSB7CisgICAgICAgIGxvZygi
RkFJTDogdW5leHBlY3RlZCBleGNlcHRpb24gIiArIGV4KTsKKyAgICAgICAgcnVuTmV4dFRlc3Qo
KTsKKyAgICB9Cit9CisKK2lmICh3aW5kb3cubGF5b3V0VGVzdENvbnRyb2xsZXIpIHsKKyAgICBs
YXlvdXRUZXN0Q29udHJvbGxlci5kdW1wQXNUZXh0KCk7CisgICAgbGF5b3V0VGVzdENvbnRyb2xs
ZXIud2FpdFVudGlsRG9uZSgpOworfQorCitydW5OZXh0VGVzdCgpOworCis8L3NjcmlwdD4KKzwv
Ym9keT4KKwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9DaGFuZ2VMb2cgYi9XZWJDb3JlL0NoYW5nZUxv
ZwppbmRleCA3NmNkNzkxLi5hNDYxZjQ2IDEwMDY0NAotLS0gYS9XZWJDb3JlL0NoYW5nZUxvZwor
KysgYi9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQwIEBACisyMDA5LTA3LTI0ICBKaWFu
IExpICA8amlhbmxpQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBGaXggZXJyb3IgaGFuZGxpbmcgaW4gZGVkaWNhdGVkIHdvcmtl
ciBhbmQgd29ya2VyIGNvbnRleHQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD0yNzUyNQorCisgICAgICAgIFRoZSBmb2xsb3dpbmcgcHJvYmxlbXMgaGF2
ZSBiZWVuIGZpeGVkOgorICAgICAgICAxKSBUaGUgdW5jYXVnaHQgcnVudGltZSBzY3JpcHQgZXJy
b3IgaXMgbm90IHJlcG9ydGVkIHVzaW5nIHRoZQorICAgICAgICBXb3JrZXJHbG9iYWxTY29wZSBv
YmplY3QncyBvbmVycm9yIGF0dHJpYnV0ZS4KKyAgICAgICAgMikgSWYgdGhlIGVycm9yIGlzIHN0
aWxsIG5vdCBoYW5kbGVkIGFmdGVyd2FyZHMgKG9uZXJyb3IgYXR0cmlidXRlCisgICAgICAgIGlz
IG5vdCBkZWZpbmVkIGFzIGEgZnVuY3Rpb24gb3IgaXQgcmV0dXJucyB0cnVlKSwgdGhlIGVycm9y
IHNob3VsZAorICAgICAgICBiZSByZXBvcnRlZCBiYWNrIHRvIHRoZSBhc3NvY2lhdGVkIFdvcmtl
ciBvYmplY3QgYnkgZmlyaW5nIGFuCisgICAgICAgIEVycm9yRXZlbnQuCisgICAgICAgIDMpIElm
IHRoZSBlcnJvciBpcyBzdGlsbCBub3QgaGFuZGxlZCBieSB0aGUgYXNzb2NpYXRlZCBXb3JrZXIK
KyAgICAgICAgb2JqZWN0LCB0aGUgZXJyb3Igc2hvdWxkIGJlIHJlcG9ydGVkIHRvIHRoZSB1c2Vy
LgorCisgICAgICAgIFRlc3Q6IGZhc3Qvd29ya2Vycy93b3JrZXItc2NyaXB0LWVycm9yLmh0bWwK
KworICAgICAgICAqIGJpbmRpbmdzL2pzL0pTRXZlbnRMaXN0ZW5lci5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpKU0V2ZW50TGlzdGVuZXI6OnJlcG9ydEVycm9yKToKKyAgICAgICAgKiBiaW5kaW5n
cy9qcy9KU0V2ZW50TGlzdGVuZXIuaDoKKyAgICAgICAgKiBkb20vRXZlbnRMaXN0ZW5lci5oOgor
ICAgICAgICAoV2ViQ29yZTo6RXZlbnRMaXN0ZW5lcjo6cmVwb3J0RXJyb3IpOiBhZGRzIGEgZnVu
Y3Rpb24gdG8gY2FsbAorICAgICAgICBFdmVudExpc3RlbmVyIGFzIGEgZnVuY3Rpb24gd2l0aCAz
IGFyZ3VtZW50cyB0byByZXBvcnQgYW4gZXJyb3IuCisgICAgICAgICogd29ya2Vycy9BYnN0cmFj
dFdvcmtlci5jcHA6CisgICAgICAgIChXZWJDb3JlOjpBYnN0cmFjdFdvcmtlcjo6ZGlzcGF0Y2hT
Y3JpcHRFcnJvckV2ZW50KToKKyAgICAgICAgKiB3b3JrZXJzL0Fic3RyYWN0V29ya2VyLmg6Cisg
ICAgICAgICogd29ya2Vycy9EZWRpY2F0ZWRXb3JrZXJDb250ZXh0LmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OkRlZGljYXRlZFdvcmtlckNvbnRleHQ6OnJlcG9ydEV4Y2VwdGlvbik6CisgICAgICAg
ICogd29ya2Vycy9Xb3JrZXJDb250ZXh0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OldvcmtlckNv
bnRleHQ6OnJlcG9ydEV4Y2VwdGlvbik6CisgICAgICAgICogd29ya2Vycy9Xb3JrZXJDb250ZXh0
Lmg6CisgICAgICAgICogd29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpXb3JrZXJFeGNlcHRpb25UYXNrOjpwZXJmb3JtVGFzayk6CisgICAgICAgICog
d29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5oOgorCiAyMDA5LTA3LTI0ICBEcmV3IFdpbHNv
biAgPGF0d2lsc29uQGdvb2dsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgQWRhbSBCYXJ0
aC4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvanMvSlNFdmVudExpc3RlbmVyLmNwcCBi
L1dlYkNvcmUvYmluZGluZ3MvanMvSlNFdmVudExpc3RlbmVyLmNwcAppbmRleCBiOWVkNjg1Li43
NzdhYzcxIDEwMDY0NAotLS0gYS9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTRXZlbnRMaXN0ZW5lci5j
cHAKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0V2ZW50TGlzdGVuZXIuY3BwCkBAIC0xNTMs
NiArMTUzLDUzIEBAIHZvaWQgSlNFdmVudExpc3RlbmVyOjpoYW5kbGVFdmVudChFdmVudCogZXZl
bnQsIGJvb2wgaXNXaW5kb3dFdmVudCkKICAgICB9CiB9CiAKK2Jvb2wgSlNFdmVudExpc3RlbmVy
OjpyZXBvcnRFcnJvcihjb25zdCBTdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IFN0cmluZyYgdXJsLCBp
bnQgbGluZU51bWJlcikKK3sKKyAgICBKU0xvY2sgbG9jayhmYWxzZSk7CisKKyAgICBKU09iamVj
dCoganNGdW5jdGlvbiA9IHRoaXMtPmpzRnVuY3Rpb24oKTsKKyAgICBpZiAoIWpzRnVuY3Rpb24p
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEpTRE9NR2xvYmFsT2JqZWN0KiBnbG9iYWxP
YmplY3QgPSBtX2dsb2JhbE9iamVjdDsKKyAgICBpZiAoIWdsb2JhbE9iamVjdCkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgRXhlY1N0YXRlKiBleGVjID0gZ2xvYmFsT2JqZWN0LT5nbG9i
YWxFeGVjKCk7CisKKyAgICBDYWxsRGF0YSBjYWxsRGF0YTsKKyAgICBDYWxsVHlwZSBjYWxsVHlw
ZSA9IGpzRnVuY3Rpb24tPmdldENhbGxEYXRhKGNhbGxEYXRhKTsKKworICAgIGlmIChjYWxsVHlw
ZSA9PSBDYWxsVHlwZU5vbmUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIE1hcmtlZEFy
Z3VtZW50QnVmZmVyIGFyZ3M7CisgICAgYXJncy5hcHBlbmQoanNTdHJpbmcoZXhlYywgbWVzc2Fn
ZSkpOworICAgIGFyZ3MuYXBwZW5kKGpzU3RyaW5nKGV4ZWMsIHVybCkpOworICAgIGFyZ3MuYXBw
ZW5kKGpzTnVtYmVyKGV4ZWMsIGxpbmVOdW1iZXIpKTsKKworICAgIC8vIElmIHRoaXMgZXZlbnQg
aGFuZGxlciBpcyB0aGUgZmlyc3QgSmF2YVNjcmlwdCB0byBleGVjdXRlLCB0aGVuIHRoZQorICAg
IC8vIGR5bmFtaWMgZ2xvYmFsIG9iamVjdCBzaG91bGQgYmUgc2V0IHRvIHRoZSBnbG9iYWwgb2Jq
ZWN0IG9mIHRoZQorICAgIC8vIHdpbmRvdyBpbiB3aGljaCB0aGUgZXZlbnQgb2NjdXJyZWQuCisg
ICAgSlNHbG9iYWxEYXRhKiBnbG9iYWxEYXRhID0gZ2xvYmFsT2JqZWN0LT5nbG9iYWxEYXRhKCk7
CisgICAgRHluYW1pY0dsb2JhbE9iamVjdFNjb3BlIGdsb2JhbE9iamVjdFNjb3BlKGV4ZWMsIGds
b2JhbERhdGEtPmR5bmFtaWNHbG9iYWxPYmplY3QgPyBnbG9iYWxEYXRhLT5keW5hbWljR2xvYmFs
T2JqZWN0IDogZ2xvYmFsT2JqZWN0KTsgICAgCisKKyAgICBKU1ZhbHVlIHRoaXNWYWx1ZSA9IGds
b2JhbE9iamVjdC0+dG9UaGlzT2JqZWN0KGV4ZWMpOworCisgICAgZ2xvYmFsT2JqZWN0LT5nbG9i
YWxEYXRhKCktPnRpbWVvdXRDaGVja2VyLnN0YXJ0KCk7CisgICAgSlNWYWx1ZSByZXR1cm5WYWx1
ZSA9IGNhbGwoZXhlYywganNGdW5jdGlvbiwgY2FsbFR5cGUsIGNhbGxEYXRhLCB0aGlzVmFsdWUs
IGFyZ3MpOworICAgIGdsb2JhbE9iamVjdC0+Z2xvYmFsRGF0YSgpLT50aW1lb3V0Q2hlY2tlci5z
dG9wKCk7CisKKyAgICAvLyBJZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgaGFuZGxpbmcgdGhlIHNj
cmlwdCBlcnJvciwgaXQgc2hvdWxkIGJlIGJ1YmJsZWQgdXAuCisgICAgaWYgKGV4ZWMtPmhhZEV4
Y2VwdGlvbigpKSB7CisgICAgICAgIGV4ZWMtPmNsZWFyRXhjZXB0aW9uKCk7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgYm9vbCBidWJibGVFdmVudDsKKyAgICByZXR1
cm4gcmV0dXJuVmFsdWUuZ2V0Qm9vbGVhbihidWJibGVFdmVudCkgJiYgIWJ1YmJsZUV2ZW50Owor
fQorCiBib29sIEpTRXZlbnRMaXN0ZW5lcjo6dmlydHVhbGlzQXR0cmlidXRlKCkgY29uc3QKIHsK
ICAgICByZXR1cm4gbV9pc0F0dHJpYnV0ZTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3Mv
anMvSlNFdmVudExpc3RlbmVyLmggYi9XZWJDb3JlL2JpbmRpbmdzL2pzL0pTRXZlbnRMaXN0ZW5l
ci5oCmluZGV4IGNlMzQ4MzIuLjI0OTc3NTAgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3Mv
anMvSlNFdmVudExpc3RlbmVyLmgKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy9qcy9KU0V2ZW50TGlz
dGVuZXIuaApAQCAtNDUsNiArNDUsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgcHJpdmF0
ZToKICAgICAgICAgdmlydHVhbCB2b2lkIG1hcmtKU0Z1bmN0aW9uKCk7CiAgICAgICAgIHZpcnR1
YWwgdm9pZCBoYW5kbGVFdmVudChFdmVudCosIGJvb2wgaXNXaW5kb3dFdmVudCk7CisgICAgICAg
IHZpcnR1YWwgYm9vbCByZXBvcnRFcnJvcihjb25zdCBTdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IFN0
cmluZyYgdXJsLCBpbnQgbGluZU51bWJlcik7CiAgICAgICAgIHZpcnR1YWwgYm9vbCB2aXJ0dWFs
aXNBdHRyaWJ1dGUoKSBjb25zdDsKICAgICAgICAgdm9pZCBjbGVhckpTRnVuY3Rpb25JbmxpbmUo
KTsKIApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9kb20vRXZlbnRMaXN0ZW5lci5oIGIvV2ViQ29yZS9k
b20vRXZlbnRMaXN0ZW5lci5oCmluZGV4IGRiYzQxYjIuLmQyODhjOGQgMTAwNjQ0Ci0tLSBhL1dl
YkNvcmUvZG9tL0V2ZW50TGlzdGVuZXIuaAorKysgYi9XZWJDb3JlL2RvbS9FdmVudExpc3RlbmVy
LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpZm5kZWYgRXZlbnRMaXN0ZW5lcl9oCiAjZGVmaW5lIEV2
ZW50TGlzdGVuZXJfaAogCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKICNpbmNsdWRlIDx3
dGYvUmVmQ291bnRlZC5oPgogCiBuYW1lc3BhY2UgSlNDIHsKQEAgLTM1LDYgKzM2LDggQEAgbmFt
ZXNwYWNlIFdlYkNvcmUgewogICAgIHB1YmxpYzoKICAgICAgICAgdmlydHVhbCB+RXZlbnRMaXN0
ZW5lcigpIHsgfQogICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQqLCBib29s
IGlzV2luZG93RXZlbnQgPSBmYWxzZSkgPSAwOworICAgICAgICAvLyBSZXR1cm4gdHJ1ZSB0byBp
bmRpY2F0ZSB0aGF0IHRoZSBlcnJvciBpcyBoYW5kbGVkLgorICAgICAgICB2aXJ0dWFsIGJvb2wg
cmVwb3J0RXJyb3IoY29uc3QgU3RyaW5nJiAvKm1lc3NhZ2UqLywgY29uc3QgU3RyaW5nJiAvKnVy
bCovLCBpbnQgLypsaW5lTnVtYmVyKi8pIHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgIHZpcnR1
YWwgYm9vbCB3YXNDcmVhdGVkRnJvbU1hcmt1cCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAK
ICNpZiBVU0UoSlNDKQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS93b3JrZXJzL0Fic3RyYWN0V29ya2Vy
LmNwcCBiL1dlYkNvcmUvd29ya2Vycy9BYnN0cmFjdFdvcmtlci5jcHAKaW5kZXggZDc3NjZiNi4u
N2NiMmMxMSAxMDA2NDQKLS0tIGEvV2ViQ29yZS93b3JrZXJzL0Fic3RyYWN0V29ya2VyLmNwcAor
KysgYi9XZWJDb3JlL3dvcmtlcnMvQWJzdHJhY3RXb3JrZXIuY3BwCkBAIC0xMTUsMTggKzExNSwy
MyBAQCB2b2lkIEFic3RyYWN0V29ya2VyOjpkaXNwYXRjaExvYWRFcnJvckV2ZW50KCkKICAgICBB
U1NFUlQoIWVjKTsKIH0KIAotdm9pZCBBYnN0cmFjdFdvcmtlcjo6ZGlzcGF0Y2hTY3JpcHRFcnJv
ckV2ZW50KGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwsIGlu
dCBsaW5lTnVtYmVyKQorYm9vbCBBYnN0cmFjdFdvcmtlcjo6ZGlzcGF0Y2hTY3JpcHRFcnJvckV2
ZW50KGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwsIGludCBs
aW5lTnVtYmVyKQogeworICAgIGJvb2wgaGFuZGxlZCA9IGZhbHNlOwogICAgIFJlZlB0cjxFcnJv
ckV2ZW50PiBldmVudCA9IEVycm9yRXZlbnQ6OmNyZWF0ZShtZXNzYWdlLCBzb3VyY2VVUkwsIHN0
YXRpY19jYXN0PHVuc2lnbmVkPihsaW5lTnVtYmVyKSk7CiAgICAgaWYgKG1fb25FcnJvckxpc3Rl
bmVyKSB7CiAgICAgICAgIGV2ZW50LT5zZXRUYXJnZXQodGhpcyk7CiAgICAgICAgIGV2ZW50LT5z
ZXRDdXJyZW50VGFyZ2V0KHRoaXMpOwogICAgICAgICBtX29uRXJyb3JMaXN0ZW5lci0+aGFuZGxl
RXZlbnQoZXZlbnQuZ2V0KCksIHRydWUpOworICAgICAgICBpZiAoZXZlbnQtPmRlZmF1bHRQcmV2
ZW50ZWQoKSkKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOwogICAgIH0KIAogICAgIEV4Y2Vw
dGlvbkNvZGUgZWMgPSAwOwogICAgIGRpc3BhdGNoRXZlbnQoZXZlbnQucmVsZWFzZSgpLCBlYyk7
CiAgICAgQVNTRVJUKCFlYyk7CisKKyAgICByZXR1cm4gaGFuZGxlZDsKIH0KIAogfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS93b3JrZXJzL0Fic3RyYWN0V29ya2Vy
LmggYi9XZWJDb3JlL3dvcmtlcnMvQWJzdHJhY3RXb3JrZXIuaAppbmRleCA1YmM1ZTJlLi4yOGNj
NTBkIDEwMDY0NAotLS0gYS9XZWJDb3JlL3dvcmtlcnMvQWJzdHJhY3RXb3JrZXIuaAorKysgYi9X
ZWJDb3JlL3dvcmtlcnMvQWJzdHJhY3RXb3JrZXIuaApAQCAtNTYsNyArNTYsNyBAQCBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKICAgICAgICAgLy8gVXRpbGl0eSByb3V0aW5lcyB0byBnZW5lcmF0ZSBh
cHByb3ByaWF0ZSBlcnJvciBldmVudHMgZm9yIGxvYWRpbmcgYW5kIHNjcmlwdCBleGNlcHRpb25z
LgogICAgICAgICB2b2lkIGRpc3BhdGNoTG9hZEVycm9yRXZlbnQoKTsKLSAgICAgICAgdm9pZCBk
aXNwYXRjaFNjcmlwdEVycm9yRXZlbnQoY29uc3QgU3RyaW5nJiBlcnJvck1lc3NhZ2UsIGNvbnN0
IFN0cmluZyYgc291cmNlVVJMLCBpbnQpOworICAgICAgICBib29sIGRpc3BhdGNoU2NyaXB0RXJy
b3JFdmVudChjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSwgY29uc3QgU3RyaW5nJiBzb3VyY2VV
UkwsIGludCk7CiAKICAgICAgICAgdm9pZCBzZXRPbmVycm9yKFBhc3NSZWZQdHI8RXZlbnRMaXN0
ZW5lcj4gZXZlbnRMaXN0ZW5lcikgeyBtX29uRXJyb3JMaXN0ZW5lciA9IGV2ZW50TGlzdGVuZXI7
IH0KICAgICAgICAgRXZlbnRMaXN0ZW5lciogb25lcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1fb25F
cnJvckxpc3RlbmVyLmdldCgpOyB9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvRGVkaWNh
dGVkV29ya2VyQ29udGV4dC5jcHAgYi9XZWJDb3JlL3dvcmtlcnMvRGVkaWNhdGVkV29ya2VyQ29u
dGV4dC5jcHAKaW5kZXggZGFiODU4Ny4uNzlmNzA2NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS93b3Jr
ZXJzL0RlZGljYXRlZFdvcmtlckNvbnRleHQuY3BwCisrKyBiL1dlYkNvcmUvd29ya2Vycy9EZWRp
Y2F0ZWRXb3JrZXJDb250ZXh0LmNwcApAQCAtNTQsNyArNTQsMTIgQEAgRGVkaWNhdGVkV29ya2Vy
Q29udGV4dDo6fkRlZGljYXRlZFdvcmtlckNvbnRleHQoKQogCiB2b2lkIERlZGljYXRlZFdvcmtl
ckNvbnRleHQ6OnJlcG9ydEV4Y2VwdGlvbihjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSwgaW50
IGxpbmVOdW1iZXIsIGNvbnN0IFN0cmluZyYgc291cmNlVVJMKQogewotICAgIHRocmVhZCgpLT53
b3JrZXJPYmplY3RQcm94eSgpLnBvc3RFeGNlcHRpb25Ub1dvcmtlck9iamVjdChlcnJvck1lc3Nh
Z2UsIGxpbmVOdW1iZXIsIHNvdXJjZVVSTCk7CisgICAgYm9vbCBlcnJvckhhbmRsZWQgPSBmYWxz
ZTsKKyAgICBpZiAob25lcnJvcigpKQorICAgICAgICBlcnJvckhhbmRsZWQgPSBvbmVycm9yKCkt
PnJlcG9ydEVycm9yKGVycm9yTWVzc2FnZSwgc291cmNlVVJMLCBsaW5lTnVtYmVyKTsKKworICAg
IGlmICghZXJyb3JIYW5kbGVkKQorICAgICAgICB0aHJlYWQoKS0+d29ya2VyT2JqZWN0UHJveHko
KS5wb3N0RXhjZXB0aW9uVG9Xb3JrZXJPYmplY3QoZXJyb3JNZXNzYWdlLCBsaW5lTnVtYmVyLCBz
b3VyY2VVUkwpOwogfQogCiB2b2lkIERlZGljYXRlZFdvcmtlckNvbnRleHQ6OnBvc3RNZXNzYWdl
KGNvbnN0IFN0cmluZyYgbWVzc2FnZSwgRXhjZXB0aW9uQ29kZSYgZWMpCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3dvcmtlcnMvV29ya2VyQ29udGV4dC5jcHAgYi9XZWJDb3JlL3dvcmtlcnMvV29ya2Vy
Q29udGV4dC5jcHAKaW5kZXggOTY1YzBhNS4uMDEwMDQ2NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS93
b3JrZXJzL1dvcmtlckNvbnRleHQuY3BwCisrKyBiL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJDb250
ZXh0LmNwcApAQCAtMTM5LDExICsxMzksNiBAQCBib29sIFdvcmtlckNvbnRleHQ6Omhhc1BlbmRp
bmdBY3Rpdml0eSgpIGNvbnN0CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIFdvcmtlckNv
bnRleHQ6OnJlcG9ydEV4Y2VwdGlvbihjb25zdCBTdHJpbmcmIGVycm9yTWVzc2FnZSwgaW50IGxp
bmVOdW1iZXIsIGNvbnN0IFN0cmluZyYgc291cmNlVVJMKQotewotICAgIG1fdGhyZWFkLT53b3Jr
ZXJPYmplY3RQcm94eSgpLnBvc3RFeGNlcHRpb25Ub1dvcmtlck9iamVjdChlcnJvck1lc3NhZ2Us
IGxpbmVOdW1iZXIsIHNvdXJjZVVSTCk7Ci19Ci0KIHZvaWQgV29ya2VyQ29udGV4dDo6YWRkTWVz
c2FnZShNZXNzYWdlRGVzdGluYXRpb24gZGVzdGluYXRpb24sIE1lc3NhZ2VTb3VyY2Ugc291cmNl
LCBNZXNzYWdlVHlwZSB0eXBlLCBNZXNzYWdlTGV2ZWwgbGV2ZWwsIGNvbnN0IFN0cmluZyYgbWVz
c2FnZSwgdW5zaWduZWQgbGluZU51bWJlciwgY29uc3QgU3RyaW5nJiBzb3VyY2VVUkwpCiB7CiAg
ICAgbV90aHJlYWQtPndvcmtlck9iamVjdFByb3h5KCkucG9zdENvbnNvbGVNZXNzYWdlVG9Xb3Jr
ZXJPYmplY3QoZGVzdGluYXRpb24sIHNvdXJjZSwgdHlwZSwgbGV2ZWwsIG1lc3NhZ2UsIGxpbmVO
dW1iZXIsIHNvdXJjZVVSTCk7CmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvV29ya2VyQ29u
dGV4dC5oIGIvV2ViQ29yZS93b3JrZXJzL1dvcmtlckNvbnRleHQuaAppbmRleCA4MjhjNTkyLi4y
NjY1NTNhIDEwMDY0NAotLS0gYS9XZWJDb3JlL3dvcmtlcnMvV29ya2VyQ29udGV4dC5oCisrKyBi
L1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJDb250ZXh0LmgKQEAgLTY3LDcgKzY3LDcgQEAgbmFtZXNw
YWNlIFdlYkNvcmUgewogCiAgICAgICAgIGJvb2wgaGFzUGVuZGluZ0FjdGl2aXR5KCkgY29uc3Q7
CiAKLSAgICAgICAgdmlydHVhbCB2b2lkIHJlcG9ydEV4Y2VwdGlvbihjb25zdCBTdHJpbmcmIGVy
cm9yTWVzc2FnZSwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFN0cmluZyYgc291cmNlVVJMKTsKKyAg
ICAgICAgdmlydHVhbCB2b2lkIHJlcG9ydEV4Y2VwdGlvbihjb25zdCBTdHJpbmcmIGVycm9yTWVz
c2FnZSwgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFN0cmluZyYgc291cmNlVVJMKSA9IDA7CiAgICAg
ICAgIHZpcnR1YWwgdm9pZCBhZGRNZXNzYWdlKE1lc3NhZ2VEZXN0aW5hdGlvbiwgTWVzc2FnZVNv
dXJjZSwgTWVzc2FnZVR5cGUsIE1lc3NhZ2VMZXZlbCwgY29uc3QgU3RyaW5nJiBtZXNzYWdlLCB1
bnNpZ25lZCBsaW5lTnVtYmVyLCBjb25zdCBTdHJpbmcmIHNvdXJjZVVSTCk7CiAgICAgICAgIHZp
cnR1YWwgdm9pZCByZXNvdXJjZVJldHJpZXZlZEJ5WE1MSHR0cFJlcXVlc3QodW5zaWduZWQgbG9u
ZyBpZGVudGlmaWVyLCBjb25zdCBTY3JpcHRTdHJpbmcmIHNvdXJjZVN0cmluZyk7CiAgICAgICAg
IHZpcnR1YWwgdm9pZCBzY3JpcHRJbXBvcnRlZCh1bnNpZ25lZCBsb25nIGlkZW50aWZpZXIsIGNv
bnN0IFN0cmluZyYgc291cmNlU3RyaW5nKTsKZGlmZiAtLWdpdCBhL1dlYkNvcmUvd29ya2Vycy9X
b3JrZXJNZXNzYWdpbmdQcm94eS5jcHAgYi9XZWJDb3JlL3dvcmtlcnMvV29ya2VyTWVzc2FnaW5n
UHJveHkuY3BwCmluZGV4IDliYWMyYzguLjU5NzFjMWQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvd29y
a2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5jcHAKKysrIGIvV2ViQ29yZS93b3JrZXJzL1dvcmtl
ck1lc3NhZ2luZ1Byb3h5LmNwcApAQCAtMTI3LDcgKzEyNywxNSBAQCBwcml2YXRlOgogCiAgICAg
dmlydHVhbCB2b2lkIHBlcmZvcm1UYXNrKFNjcmlwdEV4ZWN1dGlvbkNvbnRleHQqIGNvbnRleHQp
CiAgICAgewotICAgICAgICBpZiAoIW1fbWVzc2FnaW5nUHJveHktPmFza2VkVG9UZXJtaW5hdGUo
KSkKKyAgICAgICAgV29ya2VyKiB3b3JrZXJPYmplY3QgPSBtX21lc3NhZ2luZ1Byb3h5LT53b3Jr
ZXJPYmplY3QoKTsKKyAgICAgICAgaWYgKCF3b3JrZXJPYmplY3QgfHwgbV9tZXNzYWdpbmdQcm94
eS0+YXNrZWRUb1Rlcm1pbmF0ZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGJv
b2wgZXJyb3JIYW5kbGVkID0gZmFsc2U7CisgICAgICAgIGlmICh3b3JrZXJPYmplY3QtPm9uZXJy
b3IoKSkKKyAgICAgICAgICAgIGVycm9ySGFuZGxlZCA9IHdvcmtlck9iamVjdC0+ZGlzcGF0Y2hT
Y3JpcHRFcnJvckV2ZW50KG1fZXJyb3JNZXNzYWdlLCBtX3NvdXJjZVVSTCwgbV9saW5lTnVtYmVy
KTsKKworICAgICAgICBpZiAoIWVycm9ySGFuZGxlZCkKICAgICAgICAgICAgIGNvbnRleHQtPnJl
cG9ydEV4Y2VwdGlvbihtX2Vycm9yTWVzc2FnZSwgbV9saW5lTnVtYmVyLCBtX3NvdXJjZVVSTCk7
CiAgICAgfQogCmRpZmYgLS1naXQgYS9XZWJDb3JlL3dvcmtlcnMvV29ya2VyTWVzc2FnaW5nUHJv
eHkuaCBiL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5oCmluZGV4IGUxM2Vi
MTEuLmI3MDVjYTQgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQ
cm94eS5oCisrKyBiL1dlYkNvcmUvd29ya2Vycy9Xb3JrZXJNZXNzYWdpbmdQcm94eS5oCkBAIC04
Miw2ICs4Miw3IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAgICBwcml2YXRlOgogICAgICAgICBm
cmllbmQgY2xhc3MgTWVzc2FnZVdvcmtlclRhc2s7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBXb3Jr
ZXJDb250ZXh0RGVzdHJveWVkVGFzazsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFdvcmtlckV4Y2Vw
dGlvblRhc2s7CiAgICAgICAgIGZyaWVuZCBjbGFzcyBXb3JrZXJUaHJlYWRBY3Rpdml0eVJlcG9y
dFRhc2s7CiAKICAgICAgICAgdmlydHVhbCB+V29ya2VyTWVzc2FnaW5nUHJveHkoKTsK
</data>
<flag name="review"
          id="17750"
          type_id="1"
          status="+"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>