<?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>24459</bug_id>
          
          <creation_ts>2009-03-09 01:42:48 -0700</creation_ts>
          <short_desc>Add v8 bindings for event.</short_desc>
          <delta_ts>2009-03-11 14:56:09 -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>WebKit Misc.</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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="David Levin">levin</reporter>
          <assigned_to name="David Levin">levin</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>112802</commentid>
    <comment_count>0</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-03-09 01:42:48 -0700</bug_when>
    <thetext>See summary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>112804</commentid>
    <comment_count>1</comment_count>
      <attachid>28410</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-03-09 01:53:48 -0700</bug_when>
    <thetext>Created attachment 28410
Proposed fix.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>113026</commentid>
    <comment_count>2</comment_count>
      <attachid>28410</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-03-10 11:30:42 -0700</bug_when>
    <thetext>Comment on attachment 28410
Proposed fix.

I don&apos;t think we really want/need this logging code:
 41 #define IF_DEVEL(stmt) ((void) 0)

These should be set using C++ constructor syntax:
52     // Get the position in the source if any.
 53     m_lineNumber = 0;
 54     m_columnNumber = 0;

Lots of variables with teh wrong naming style: event_symbol should be eventSymbol.

Unfortunatly I have to run catch a train atm.  Dimitri definitely knows the style quite well tehse days and could help you pick out many of the style issues in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>113029</commentid>
    <comment_count>3</comment_count>
      <attachid>28410</attachid>
    <who name="Dimitri Glazkov (Google)">dglazkov</who>
    <bug_when>2009-03-10 11:42:13 -0700</bug_when>
    <thetext>Comment on attachment 28410
Proposed fix.

I made a first pass, need Eric&apos;s blessing. Overall, it looks good, aside from style issues.

The only concern is the use of empty V8 return value and figuring out what that actually means. In my experience, this is V8 interceptor-related and I added notHandledByInterceptor() helper to make the value more descriptive. So that&apos;s a great &quot;learn V8 bindings&quot; assignment for ya :)

&gt; +        * bindings/v8/custom/V8AbstractEventListener.cpp: Added.
&gt; +        (WebCore::V8AbstractEventListener::V8AbstractEventListener):
&gt; +        (WebCore::V8AbstractEventListener::HandleEventHelper):
&gt; +        (WebCore::V8AbstractEventListener::handleEvent):
&gt; +        (WebCore::V8AbstractEventListener::DisposeListenerObject):
&gt; +        (WebCore::V8AbstractEventListener::GetReceiverObject):

Here and below: no need to keep method names for newly added files unless you have a valuable comment that goes with them.

&gt; diff --git a/WebCore/bindings/v8/custom/V8AbstractEventListener.cpp b/WebCore/bindings/v8/custom/V8AbstractEventListener.cpp
&gt; +
&gt; +#include &quot;config.h&quot;
&gt; +

No line break needed.

&gt; +#include &quot;V8AbstractEventListener.h&quot;

&gt; +#define IF_DEVEL(stmt) ((void) 0)
I don&apos;t think we need this macro. It looks like a carryover from some debugging exercise.

&gt; +
&gt; +void V8AbstractEventListener::HandleEventHelper(v8::Handle&lt;v8::Context&gt; context, Event* event, bool isWindowEvent)

*Helper is a bad name. Perhaps invokeEventHandler?

&gt; +    // Enter the V8 context in which to perform the event handling.
&gt; +    v8::Context::Scope scope(context);
&gt; +
&gt; +    // Get the V8 wrapper for the event object.
&gt; +    v8::Handle&lt;v8::Value&gt; jsevent = V8Proxy::EventToV8Object(event);

jsEvent

&gt; +    // For compatibility, we store the event object as a property on the window called &quot;event&quot;.  Because this is the global namespace, we save away any
&gt; +    // existing &quot;event&quot; property, and then restore it after executing the javascript handler.
&gt; +    v8::Local&lt;v8::String&gt; event_symbol = v8::String::NewSymbol(&quot;event&quot;);

eventSymbil

&gt; +    v8::Local&lt;v8::Value&gt; saved_evt;

savedEvent

&gt; +    v8::Local&lt;v8::Value&gt; ret;

returnValue

&gt; +
&gt; +    {
&gt; +        // Catch exceptions thrown in the event handler so they do not propagate to javascript code that caused the event to fire.
&gt; +        // Setting and getting the &apos;event&apos; property on the global object can throw exceptions as well (for instance if accessors that
&gt; +        // throw exceptions are defined for &apos;event&apos; using __defineGetter__ and __defineSetter__ on the global object).
&gt; +        v8::TryCatch try_catch;

tryCatch

&gt; +        try_catch.SetVerbose(true);
&gt; +
&gt; +        // Save the old &apos;event&apos; property so we can restore it later.
&gt; +        saved_evt = context-&gt;Global()-&gt;Get(event_symbol);
&gt; +        try_catch.Reset();
&gt; +
&gt; +        // Make the event available in the window object.
&gt; +        //
&gt; +        // TODO: This does not work as in safari if the window.event property is already set. We need to make sure that property

TODO-&gt;FIXME. In Safari? That seems like a strange comment. Perhaps the author meant &quot;with JSC bindings?&quot;

&gt; +        // access is intercepted correctly.
&gt; +        context-&gt;Global()-&gt;Set(event_symbol, jsevent);
&gt; +        try_catch.Reset();
&gt; +
&gt; +        // Call the event handler.
&gt; +        ret = CallListenerFunction(jsevent, event, isWindowEvent);

callListenerFunction

&gt; +        try_catch.Reset();
&gt; +
&gt; +        // Restore the old event. This must be done for all exit paths through this method.
&gt; +        if (saved_evt.IsEmpty())
&gt; +            context-&gt;Global()-&gt;Set(event_symbol, v8::Undefined());
&gt; +        else
&gt; +            context-&gt;Global()-&gt;Set(event_symbol, saved_evt);
&gt; +        try_catch.Reset();
&gt; +    }
&gt; +
&gt; +    ASSERT(!V8Proxy::HandleOutOfMemory() || ret.IsEmpty());
&gt; +
&gt; +    if (ret.IsEmpty())
&gt; +        return;

Is the check below needed?

&gt; +    if (!ret.IsEmpty()) {
&gt; +        if (!ret-&gt;IsNull() &amp;&amp; !ret-&gt;IsUndefined() &amp;&amp; event-&gt;storesResultAsString())
&gt; +            event-&gt;storeResult(ToWebCoreString(ret));

toWebCoreString

&gt; +    v8::HandleScope handle_scope;

handleScope

&gt; +    v8::Handle&lt;v8::Context&gt; context = V8Proxy::GetContext(m_frame);
&gt; +    if (context.IsEmpty())
&gt; +        return;
&gt; +
&gt; +    // m_frame can removed by the callback function, protect it until the callback function returns.
&gt; +    RefPtr&lt;Frame&gt; protector(m_frame);
&gt; +
&gt; +    IF_DEVEL(log_info(frame, &quot;Handling DOM event&quot;, m_frame-&gt;document()-&gt;URL()));
&gt; +
&gt; +    HandleEventHelper(context, event, isWindowEvent);
&gt; +
&gt; +    Document::updateDocumentsRendering();
&gt; +}
&gt; +
&gt; +void V8AbstractEventListener::DisposeListenerObject()

disposeListenerObject

&gt; +{
&gt; +    if (!m_listener.IsEmpty()) {
&gt; +#ifndef NDEBUG
&gt; +        V8Proxy::UnregisterGlobalHandle(this, m_listener);
&gt; +#endif
&gt; +        m_listener.Dispose();
&gt; +        m_listener.Clear();
&gt; +    }
&gt; +}
&gt; +
&gt; +v8::Local&lt;v8::Object&gt; V8AbstractEventListener::GetReceiverObject(Event* event, bool isWindowEvent)
&gt; +{

getReceiverObject

&gt; +    if (!m_listener.IsEmpty() &amp;&amp; !m_listener-&gt;IsFunction())
&gt; +        return v8::Local&lt;v8::Object&gt;::New(m_listener);
&gt; +
&gt; +    if (isWindowEvent)
&gt; +        return v8::Context::GetCurrent()-&gt;Global();
&gt; +
&gt; +    EventTarget* target = event-&gt;currentTarget();
&gt; +    v8::Handle&lt;v8::Value&gt; value = V8Proxy::EventTargetToV8Object(target);
&gt; +    if (value.IsEmpty())
&gt; +        return v8::Local&lt;v8::Object&gt;();

Is this interceptor-related? If so, we should use notHandledByInterceptor();

&gt; +    return v8::Local&lt;v8::Object&gt;::New(v8::Handle&lt;v8::Object&gt;::Cast(value));
&gt; +}
&gt; +

&gt; +        // Call listener function.
&gt; +        virtual v8::Local&lt;v8::Value&gt; CallListenerFunction(v8::Handle&lt;v8::Value&gt; jsevent, Event*, bool isWindowEvent) = 0;

callListenerFunction

&gt; diff --git a/WebCore/bindings/v8/custom/V8AttrCustom.cpp b/WebCore/bindings/v8/custom/V8AttrCustom.cpp
&gt;   *
&gt;   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
&gt; - * &quot;AS IS&quot; AND ANY EXPRESS OR iframeLIED WARRANTIES, INCLUDING, BUT NOT
&gt; - * LIMITED TO, THE iframeLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt; + * &quot;AS IS&quot; AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
&gt; + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
&gt;   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT

Whoopsie! :)

&gt; diff --git a/WebCore/bindings/v8/custom/V8CustomEventListener.cpp b/WebCore/bindings/v8/custom/V8CustomEventListener.cpp

&gt; +{
&gt; +    // It could be disposed already.
&gt; +    if (m_listener.IsEmpty())
&gt; +        return v8::Local&lt;v8::Function&gt;();

Same interceptor concern,

&gt; +v8::Local&lt;v8::Value&gt; V8EventListener::CallListenerFunction(v8::Handle&lt;v8::Value&gt; jsevent, Event* event, bool isWindowEvent) {
&gt; +    v8::Local&lt;v8::Function&gt; handler_func = GetListenerFunction();

handlerFunction

&gt; diff --git a/WebCore/bindings/v8/custom/V8LazyEventListener.cpp b/WebCore/bindings/v8/custom/V8LazyEventListener.cpp
&gt; +#define IF_DEVEL(stmt) ((void) 0)

Not needed.

&gt; +
&gt; +    {
&gt; +        // Switch to the contex of m_frame
&gt; +        v8::HandleScope handle_scope;

handleScope

&gt; +        if (context.IsEmpty()) return v8::Local&lt;v8::Function&gt;();

return indented on next line.

&gt; +                v8::Local&lt;v8::Function&gt; listener_func = v8::Local&lt;v8::Function&gt;::Cast(value);

listenerFunction

&gt; +v8::Local&lt;v8::Value&gt; V8LazyEventListener::CallListenerFunction(v8::Handle&lt;v8::Value&gt; jsevent, Event* event, bool isWindowEvent)

jsEvent

&gt; +        // Switch to the contex of m_frame
&gt; +        v8::HandleScope handle_scope;

handleScope

&gt; +                // Set the function name.
&gt; +                m_wrappedFunction-&gt;SetName(v8::String::New(FromWebCoreString(m_functionName), m_functionName.length()));

Let&apos;s define a fromWebCoreString wrapper in V8Binding.h, so that we could temporarily use both upper and lowercase, just like toWebCoreString

&gt; diff --git a/WebCore/bindings/v8/custom/V8LazyEventListener.h b/WebCore/bindings/v8/custom/V8LazyEventListener.h
&gt; +static void WeakObjectEventListenerCallback(v8::Persistent&lt;v8::Value&gt; obj, void* para)

parameter?

&gt; +    v8::HandleScope handle_scope;

handleScope

&gt; +    v8::Handle&lt;v8::Context&gt; context = m_proxy-&gt;GetContext();
&gt; +v8::Local&lt;v8::Value&gt; V8WorkerContextEventListener::CallListenerFunction(v8::Handle&lt;v8::Value&gt; jsevent, Event* event, bool isWindowEvent)
&gt; +{
&gt; +    v8::Local&lt;v8::Function&gt; handler_func = GetListenerFunction();

handlerFunction.

&gt; diff --git a/WebCore/bindings/v8/custom/V8WorkerContextEventListener.h b/WebCore/bindings/v8/custom/V8WorkerContextEventListener.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>113071</commentid>
    <comment_count>4</comment_count>
      <attachid>28453</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-03-10 15:40:42 -0700</bug_when>
    <thetext>Created attachment 28453
Proposed fix.

I think I&apos;ve addressed all style issues.

&gt; The only concern is the use of empty V8 return value and figuring out what that actually means. 
As we found out for these cases, it is how V8 returns &apos;null&apos;.  Usually it means not-found.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>113233</commentid>
    <comment_count>5</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-03-11 14:56:09 -0700</bug_when>
    <thetext>Committed r41600.

</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28410</attachid>
            <date>2009-03-09 01:53:48 -0700</date>
            <delta_ts>2009-03-10 15:40:42 -0700</delta_ts>
            <desc>Proposed fix.</desc>
            <filename>bug24459.txt</filename>
            <type>text/plain</type>
            <size>48316</size>
            <attacher name="David Levin">levin</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NGJlMTY0MS4uOGFlZGIwNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw2MiBAQAorMjAwOS0wMy0wOSAgRGF2aWQgTGV2aW4g
IDxsZXZpbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgQnVnIDI0NDU5OiBBZGQgdjggYmluZGluZ3MgZm9yIGV2ZW50LgorICAg
ICAgICA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0NDU5PgorCisg
ICAgICAgIEFkZGluZyBjdXN0b20gZXZlbnQgYmluZGluZ3MuCisKKyAgICAgICAgKiBiaW5kaW5n
cy92OC9jdXN0b20vVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuY3BwOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjpWOEFic3RyYWN0RXZlbnRMaXN0ZW5l
cik6CisgICAgICAgIChXZWJDb3JlOjpWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6SGFuZGxlRXZl
bnRIZWxwZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6Omhh
bmRsZUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjpE
aXNwb3NlTGlzdGVuZXJPYmplY3QpOgorICAgICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50
TGlzdGVuZXI6OkdldFJlY2VpdmVyT2JqZWN0KToKKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0
b20vVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpW
OEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6flY4QWJzdHJhY3RFdmVudExpc3RlbmVyKToKKyAgICAg
ICAgKFdlYkNvcmU6OlY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjpmcmFtZSk6CisgICAgICAgIChX
ZWJDb3JlOjpWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6R2V0TGlzdGVuZXJPYmplY3QpOgorICAg
ICAgICAoV2ViQ29yZTo6VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6OmRpc2Nvbm5lY3RlZCk6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4QXR0ckN1c3RvbS5jcHA6CisgICAgICAgIEZp
eGVkIG1lc3NlZCB1cCBjb3B5cmlnaHQgaGVhZGVyLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1
c3RvbS9WOEN1c3RvbUV2ZW50TGlzdGVuZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6
OlY4RXZlbnRMaXN0ZW5lcjo6VjhFdmVudExpc3RlbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlY4
RXZlbnRMaXN0ZW5lcjo6flY4RXZlbnRMaXN0ZW5lcik6CisgICAgICAgIChXZWJDb3JlOjpWOEV2
ZW50TGlzdGVuZXI6OkdldExpc3RlbmVyRnVuY3Rpb24pOgorICAgICAgICAoV2ViQ29yZTo6VjhF
dmVudExpc3RlbmVyOjpDYWxsTGlzdGVuZXJGdW5jdGlvbik6CisgICAgICAgICogYmluZGluZ3Mv
djgvY3VzdG9tL1Y4Q3VzdG9tRXZlbnRMaXN0ZW5lci5oOgorICAgICAgICAoV2ViQ29yZTo6VjhF
dmVudExpc3RlbmVyOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6VjhFdmVudExpc3RlbmVy
Ojppc0lubGluZSk6CisgICAgICAgIChXZWJDb3JlOjpWOEV2ZW50TGlzdGVuZXI6OmRpc2Nvbm5l
Y3RGcmFtZSk6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4RWxlbWVudEN1c3RvbS5j
cHA6CisgICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4TGF6eUV2ZW50TGlzdGVuZXIuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKFdlYkNvcmU6OlY4TGF6eUV2ZW50TGlzdGVuZXI6OlY4TGF6eUV2
ZW50TGlzdGVuZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhMYXp5RXZlbnRMaXN0ZW5lcjo6flY4
TGF6eUV2ZW50TGlzdGVuZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhMYXp5RXZlbnRMaXN0ZW5l
cjo6R2V0TGlzdGVuZXJGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpWOExhenlFdmVudExp
c3RlbmVyOjpDYWxsTGlzdGVuZXJGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpWOExhenlF
dmVudExpc3RlbmVyOjpHZXRXcmFwcGVkTGlzdGVuZXJGdW5jdGlvbik6CisgICAgICAgICogYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4TGF6eUV2ZW50TGlzdGVuZXIuaDogQWRkZWQuCisgICAgICAgIChX
ZWJDb3JlOjpWOExhenlFdmVudExpc3RlbmVyOjpjcmVhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
VjhMYXp5RXZlbnRMaXN0ZW5lcjo6aXNJbmxpbmUpOgorICAgICAgICAoV2ViQ29yZTo6VjhMYXp5
RXZlbnRMaXN0ZW5lcjo6R2V0TGlzdGVuZXJPYmplY3QpOgorICAgICAgICAqIGJpbmRpbmdzL3Y4
L2N1c3RvbS9WOE9iamVjdEV2ZW50TGlzdGVuZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKFdlYkNv
cmU6OldlYWtPYmplY3RFdmVudExpc3RlbmVyQ2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6
VjhPYmplY3RFdmVudExpc3RlbmVyOjpWOE9iamVjdEV2ZW50TGlzdGVuZXIpOgorICAgICAgICAo
V2ViQ29yZTo6VjhPYmplY3RFdmVudExpc3RlbmVyOjp+VjhPYmplY3RFdmVudExpc3RlbmVyKToK
KyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhPYmplY3RFdmVudExpc3RlbmVyLmg6IEFk
ZGVkLgorICAgICAgICAoV2ViQ29yZTo6VjhPYmplY3RFdmVudExpc3RlbmVyOjpjcmVhdGUpOgor
ICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVy
LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpWOFdvcmtlckNvbnRleHRFdmVudExpc3Rl
bmVyOjpWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyKToKKyAgICAgICAgKFdlYkNvcmU6OlY4
V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXI6On5WOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVy
KToKKyAgICAgICAgKFdlYkNvcmU6OlY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXI6OmhhbmRs
ZUV2ZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXI6
OkNhbGxMaXN0ZW5lckZ1bmN0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OlY4V29ya2VyQ29udGV4
dEV2ZW50TGlzdGVuZXI6OkdldFJlY2VpdmVyT2JqZWN0KToKKyAgICAgICAgKiBiaW5kaW5ncy92
OC9jdXN0b20vVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5oOiBBZGRlZC4KKyAgICAgICAg
KFdlYkNvcmU6OlY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXI6OmNyZWF0ZSk6CisgICAgICAg
IChXZWJDb3JlOjpWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyOjpkaXNjb25uZWN0ZWQpOgor
ICAgICAgICAoV2ViQ29yZTo6VjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcjo6ZGlzY29ubmVj
dCk6CisKIDIwMDktMDMtMDggIE1hcmsgUm93ZSAgPG1yb3dlQGFwcGxlLmNvbT4KIAogICAgICAg
ICBSZXZpZXdlZCBEYW4gQmVybnN0ZWluLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92
OC9jdXN0b20vVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAuLmFlODE2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSwxNzMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgR29vZ2xlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBh
cmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29w
eXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0
aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0
b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZy
b20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hU
IEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRI
RSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgor
ICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxM
IFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBU
TywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJWOEFi
c3RyYWN0RXZlbnRMaXN0ZW5lci5oIgorCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRl
ICJFdmVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiVG9rZW5pemVyLmgiCisj
aW5jbHVkZSAiVjhCaW5kaW5nLmgiCisKKyNkZWZpbmUgSUZfREVWRUwoc3RtdCkgKCh2b2lkKSAw
KQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyOjpWOEFi
c3RyYWN0RXZlbnRMaXN0ZW5lcihGcmFtZSogZnJhbWUsIGJvb2wgaXNJbmxpbmUpCisgICAgOiBt
X2lzSW5saW5lKGlzSW5saW5lKQorICAgICwgbV9mcmFtZShmcmFtZSkKK3sKKyAgICBpZiAoIW1f
ZnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEdldCB0aGUgcG9zaXRpb24gaW4gdGhl
IHNvdXJjZSBpZiBhbnkuCisgICAgbV9saW5lTnVtYmVyID0gMDsKKyAgICBtX2NvbHVtbk51bWJl
ciA9IDA7CisgICAgaWYgKG1faXNJbmxpbmUgJiYgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dG9rZW5p
emVyKCkpIHsKKyAgICAgICAgbV9saW5lTnVtYmVyID0gbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dG9r
ZW5pemVyKCktPmxpbmVOdW1iZXIoKTsKKyAgICAgICAgbV9jb2x1bW5OdW1iZXIgPSBtX2ZyYW1l
LT5kb2N1bWVudCgpLT50b2tlbml6ZXIoKS0+Y29sdW1uTnVtYmVyKCk7CisgICAgfQorfQorCit2
b2lkIFY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjpIYW5kbGVFdmVudEhlbHBlcih2ODo6SGFuZGxl
PHY4OjpDb250ZXh0PiBjb250ZXh0LCBFdmVudCogZXZlbnQsIGJvb2wgaXNXaW5kb3dFdmVudCkK
K3sKKyAgICAvLyBFbnRlciB0aGUgVjggY29udGV4dCBpbiB3aGljaCB0byBwZXJmb3JtIHRoZSBl
dmVudCBoYW5kbGluZy4KKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisK
KyAgICAvLyBHZXQgdGhlIFY4IHdyYXBwZXIgZm9yIHRoZSBldmVudCBvYmplY3QuCisgICAgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IGpzZXZlbnQgPSBWOFByb3h5OjpFdmVudFRvVjhPYmplY3QoZXZl
bnQpOworCisgICAgLy8gRm9yIGNvbXBhdGliaWxpdHksIHdlIHN0b3JlIHRoZSBldmVudCBvYmpl
Y3QgYXMgYSBwcm9wZXJ0eSBvbiB0aGUgd2luZG93IGNhbGxlZCAiZXZlbnQiLiAgQmVjYXVzZSB0
aGlzIGlzIHRoZSBnbG9iYWwgbmFtZXNwYWNlLCB3ZSBzYXZlIGF3YXkgYW55CisgICAgLy8gZXhp
c3RpbmcgImV2ZW50IiBwcm9wZXJ0eSwgYW5kIHRoZW4gcmVzdG9yZSBpdCBhZnRlciBleGVjdXRp
bmcgdGhlIGphdmFzY3JpcHQgaGFuZGxlci4KKyAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gZXZl
bnRfc3ltYm9sID0gdjg6OlN0cmluZzo6TmV3U3ltYm9sKCJldmVudCIpOworICAgIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IHNhdmVkX2V2dDsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXQ7CisK
KyAgICB7CisgICAgICAgIC8vIENhdGNoIGV4Y2VwdGlvbnMgdGhyb3duIGluIHRoZSBldmVudCBo
YW5kbGVyIHNvIHRoZXkgZG8gbm90IHByb3BhZ2F0ZSB0byBqYXZhc2NyaXB0IGNvZGUgdGhhdCBj
YXVzZWQgdGhlIGV2ZW50IHRvIGZpcmUuCisgICAgICAgIC8vIFNldHRpbmcgYW5kIGdldHRpbmcg
dGhlICdldmVudCcgcHJvcGVydHkgb24gdGhlIGdsb2JhbCBvYmplY3QgY2FuIHRocm93IGV4Y2Vw
dGlvbnMgYXMgd2VsbCAoZm9yIGluc3RhbmNlIGlmIGFjY2Vzc29ycyB0aGF0CisgICAgICAgIC8v
IHRocm93IGV4Y2VwdGlvbnMgYXJlIGRlZmluZWQgZm9yICdldmVudCcgdXNpbmcgX19kZWZpbmVH
ZXR0ZXJfXyBhbmQgX19kZWZpbmVTZXR0ZXJfXyBvbiB0aGUgZ2xvYmFsIG9iamVjdCkuCisgICAg
ICAgIHY4OjpUcnlDYXRjaCB0cnlfY2F0Y2g7CisgICAgICAgIHRyeV9jYXRjaC5TZXRWZXJib3Nl
KHRydWUpOworCisgICAgICAgIC8vIFNhdmUgdGhlIG9sZCAnZXZlbnQnIHByb3BlcnR5IHNvIHdl
IGNhbiByZXN0b3JlIGl0IGxhdGVyLgorICAgICAgICBzYXZlZF9ldnQgPSBjb250ZXh0LT5HbG9i
YWwoKS0+R2V0KGV2ZW50X3N5bWJvbCk7CisgICAgICAgIHRyeV9jYXRjaC5SZXNldCgpOworCisg
ICAgICAgIC8vIE1ha2UgdGhlIGV2ZW50IGF2YWlsYWJsZSBpbiB0aGUgd2luZG93IG9iamVjdC4K
KyAgICAgICAgLy8KKyAgICAgICAgLy8gVE9ETzogVGhpcyBkb2VzIG5vdCB3b3JrIGFzIGluIHNh
ZmFyaSBpZiB0aGUgd2luZG93LmV2ZW50IHByb3BlcnR5IGlzIGFscmVhZHkgc2V0LiBXZSBuZWVk
IHRvIG1ha2Ugc3VyZSB0aGF0IHByb3BlcnR5CisgICAgICAgIC8vIGFjY2VzcyBpcyBpbnRlcmNl
cHRlZCBjb3JyZWN0bHkuCisgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQoZXZlbnRfc3lt
Ym9sLCBqc2V2ZW50KTsKKyAgICAgICAgdHJ5X2NhdGNoLlJlc2V0KCk7CisKKyAgICAgICAgLy8g
Q2FsbCB0aGUgZXZlbnQgaGFuZGxlci4KKyAgICAgICAgcmV0ID0gQ2FsbExpc3RlbmVyRnVuY3Rp
b24oanNldmVudCwgZXZlbnQsIGlzV2luZG93RXZlbnQpOworICAgICAgICB0cnlfY2F0Y2guUmVz
ZXQoKTsKKworICAgICAgICAvLyBSZXN0b3JlIHRoZSBvbGQgZXZlbnQuIFRoaXMgbXVzdCBiZSBk
b25lIGZvciBhbGwgZXhpdCBwYXRocyB0aHJvdWdoIHRoaXMgbWV0aG9kLgorICAgICAgICBpZiAo
c2F2ZWRfZXZ0LklzRW1wdHkoKSkKKyAgICAgICAgICAgIGNvbnRleHQtPkdsb2JhbCgpLT5TZXQo
ZXZlbnRfc3ltYm9sLCB2ODo6VW5kZWZpbmVkKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBjb250ZXh0LT5HbG9iYWwoKS0+U2V0KGV2ZW50X3N5bWJvbCwgc2F2ZWRfZXZ0KTsKKyAgICAg
ICAgdHJ5X2NhdGNoLlJlc2V0KCk7CisgICAgfQorCisgICAgQVNTRVJUKCFWOFByb3h5OjpIYW5k
bGVPdXRPZk1lbW9yeSgpIHx8IHJldC5Jc0VtcHR5KCkpOworCisgICAgaWYgKHJldC5Jc0VtcHR5
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghcmV0LklzRW1wdHkoKSkgeworICAgICAg
ICBpZiAoIXJldC0+SXNOdWxsKCkgJiYgIXJldC0+SXNVbmRlZmluZWQoKSAmJiBldmVudC0+c3Rv
cmVzUmVzdWx0QXNTdHJpbmcoKSkKKyAgICAgICAgICAgIGV2ZW50LT5zdG9yZVJlc3VsdChUb1dl
YkNvcmVTdHJpbmcocmV0KSk7CisKKyAgICAgICAgLy8gUHJldmVudCBkZWZhdWx0IGFjdGlvbiBp
ZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGZhbHNlOworICAgICAgICAvLyBGSVhNRTogQWRkIGV4YW1w
bGUsIGFuZCByZWZlcmVuY2UgdG8gYnVnIGVudHJ5LgorICAgICAgICBpZiAobV9pc0lubGluZSAm
JiByZXQtPklzQm9vbGVhbigpICYmICFyZXQtPkJvb2xlYW5WYWx1ZSgpKQorICAgICAgICAgICAg
ZXZlbnQtPnByZXZlbnREZWZhdWx0KCk7CisgICAgfQorfQorCit2b2lkIFY4QWJzdHJhY3RFdmVu
dExpc3RlbmVyOjpoYW5kbGVFdmVudChFdmVudCogZXZlbnQsIGJvb2wgaXNXaW5kb3dFdmVudCkK
K3sKKyAgICAvLyBFdmVudExpc3RlbmVyIGNvdWxkIGJlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBm
cmFtZS4KKyAgICBpZiAoZGlzY29ubmVjdGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IFRoZSBjYWxsYmFjayBmdW5jdGlvbiBvbiBYTUxIdHRwUmVxdWVzdCBjYW4gY2xlYXIgdGhlIGV2
ZW50IGxpc3RlbmVyIGFuZCBkZXN0cm95cyAndGhpcycgb2JqZWN0LiBLZWVwIGEgbG9jYWwgcmVm
ZXJlbmNlIG9mIGl0LgorICAgIC8vIFNlZSBpc3N1ZSA4ODk4MjkuCisgICAgUmVmUHRyPFY4QWJz
dHJhY3RFdmVudExpc3RlbmVyPiBzZWxmKHRoaXMpOworCisgICAgdjg6OkhhbmRsZVNjb3BlIGhh
bmRsZV9zY29wZTsKKworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFBy
b3h5OjpHZXRDb250ZXh0KG1fZnJhbWUpOworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuOworCisgICAgLy8gbV9mcmFtZSBjYW4gcmVtb3ZlZCBieSB0aGUgY2FsbGJh
Y2sgZnVuY3Rpb24sIHByb3RlY3QgaXQgdW50aWwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHJldHVy
bnMuCisgICAgUmVmUHRyPEZyYW1lPiBwcm90ZWN0b3IobV9mcmFtZSk7CisKKyAgICBJRl9ERVZF
TChsb2dfaW5mbyhmcmFtZSwgIkhhbmRsaW5nIERPTSBldmVudCIsIG1fZnJhbWUtPmRvY3VtZW50
KCktPlVSTCgpKSk7CisKKyAgICBIYW5kbGVFdmVudEhlbHBlcihjb250ZXh0LCBldmVudCwgaXNX
aW5kb3dFdmVudCk7CisKKyAgICBEb2N1bWVudDo6dXBkYXRlRG9jdW1lbnRzUmVuZGVyaW5nKCk7
Cit9CisKK3ZvaWQgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXI6OkRpc3Bvc2VMaXN0ZW5lck9iamVj
dCgpCit7CisgICAgaWYgKCFtX2xpc3RlbmVyLklzRW1wdHkoKSkgeworI2lmbmRlZiBOREVCVUcK
KyAgICAgICAgVjhQcm94eTo6VW5yZWdpc3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2xpc3RlbmVy
KTsKKyNlbmRpZgorICAgICAgICBtX2xpc3RlbmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgbV9saXN0
ZW5lci5DbGVhcigpOworICAgIH0KK30KKwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IFY4QWJzdHJh
Y3RFdmVudExpc3RlbmVyOjpHZXRSZWNlaXZlck9iamVjdChFdmVudCogZXZlbnQsIGJvb2wgaXNX
aW5kb3dFdmVudCkKK3sKKyAgICBpZiAoIW1fbGlzdGVuZXIuSXNFbXB0eSgpICYmICFtX2xpc3Rl
bmVyLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD46
Ok5ldyhtX2xpc3RlbmVyKTsKKworICAgIGlmIChpc1dpbmRvd0V2ZW50KQorICAgICAgICByZXR1
cm4gdjg6OkNvbnRleHQ6OkdldEN1cnJlbnQoKS0+R2xvYmFsKCk7CisKKyAgICBFdmVudFRhcmdl
dCogdGFyZ2V0ID0gZXZlbnQtPmN1cnJlbnRUYXJnZXQoKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gdmFsdWUgPSBWOFByb3h5OjpFdmVudFRhcmdldFRvVjhPYmplY3QodGFyZ2V0KTsKKyAg
ICBpZiAodmFsdWUuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmpl
Y3Q+KCk7CisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KHY4OjpIYW5kbGU8
djg6Ok9iamVjdD46OkNhc3QodmFsdWUpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhBYnN0cmFjdEV2ZW50TGlz
dGVuZXIuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4QWJzdHJhY3RFdmVudExpc3Rl
bmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3MmNmMAotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4QWJzdHJhY3RFdmVudExp
c3RlbmVyLmgKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIw
MDcsIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0
aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5h
bWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJv
bW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVj
aWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFT
IElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAor
ICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaWZuZGVmIFY4QWJz
dHJhY3RFdmVudExpc3RlbmVyX2gKKyNkZWZpbmUgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXJfaAor
CisjaW5jbHVkZSAiRXZlbnRMaXN0ZW5lci5oIgorI2luY2x1ZGUgPHY4Lmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEV2ZW50OworICAgIGNsYXNzIEZyYW1lOworCisgICAg
Ly8gVGhlcmUgYXJlIHR3byBraW5kcyBvZiBldmVudCBsaXN0ZW5lcnM6IEhUTUwgb3Igbm9uLUhN
VEwuIG9ubG9hZCwgb25mb2N1cywgZXRjIChhdHRyaWJ1dGVzKSBhcmUgYWx3YXlzIEhUTUwgZXZl
bnQgaGFuZGxlciB0eXBlOworICAgIC8vIEV2ZW50IGxpc3RlbmVycyBhZGRlZCBieSBXaW5kb3cu
YWRkRXZlbnRMaXN0ZW5lciBvciBFdmVudFRhcmdldE5vZGU6OmFkZEV2ZW50TGlzdGVuZXIgYXJl
IG5vbi1IVE1MIHR5cGUuCisgICAgLy8KKyAgICAvLyBXaHkgZG9lcyB0aGlzIG1hdHRlcj8KKyAg
ICAvLyBXZWJLaXQgZG9lcyBub3QgYWxsb3cgZHVwbGljYXRlZCBIVE1MIGV2ZW50IGhhbmRsZXJz
IG9mIHRoZSBzYW1lIHR5cGUsIGJ1dCBBTExPV3MgZHVwbGljYXRlZCBub24tSFRNTCBldmVudCBo
YW5kbGVycy4KKyAgICBjbGFzcyBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lciA6IHB1YmxpYyBFdmVu
dExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgflY4QWJzdHJhY3RFdmVu
dExpc3RlbmVyKCkgeyB9CisKKyAgICAgICAgLy8gUmV0dXJucyB0aGUgb3duZXIgZnJhbWUgb2Yg
dGhlIGxpc3RlbmVyLgorICAgICAgICBGcmFtZSogZnJhbWUoKSB7IHJldHVybiBtX2ZyYW1lOyB9
CisKKyAgICAgICAgLy8gSGFuZGxlIGV2ZW50LgorICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxl
RXZlbnQoRXZlbnQqLCBib29sIGlzV2luZG93RXZlbnQpOworCisgICAgICAgIHZvaWQgSGFuZGxl
RXZlbnRIZWxwZXIodjg6OkhhbmRsZTx2ODo6Q29udGV4dD4sIEV2ZW50KiwgYm9vbCBpc1dpbmRv
d0V2ZW50KTsKKworICAgICAgICAvLyBSZXR1cm5zIHRoZSBsaXN0ZW5lciBvYmplY3QsIGVpdGhl
ciBhIGZ1bmN0aW9uIG9yIGFuIG9iamVjdC4KKyAgICAgICAgdmlydHVhbCB2ODo6TG9jYWw8djg6
Ok9iamVjdD4gR2V0TGlzdGVuZXJPYmplY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gdjg6Okxv
Y2FsPHY4OjpPYmplY3Q+OjpOZXcobV9saXN0ZW5lcik7CisgICAgICAgIH0KKworICAgICAgICAv
LyBEaXNwb3NlIGxpc3RlbmVyIG9iamVjdCBhbmQgY2xlYXIgdGhlIGhhbmRsZS4KKyAgICAgICAg
dm9pZCBEaXNwb3NlTGlzdGVuZXJPYmplY3QoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgZGlz
Y29ubmVjdGVkKCkgY29uc3QgeyByZXR1cm4gIW1fZnJhbWU7IH0KKworICAgIHByb3RlY3RlZDoK
KyAgICAgICAgLy8gTGlzdGVuZXIgb2JqZWN0LgorICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6
T2JqZWN0PiBtX2xpc3RlbmVyOworCisgICAgICAgIC8vIEZsYWdzIHRoaXMgaXMgYW4gSFRNTCB0
eXBlIGxpc3RlbmVyLgorICAgICAgICBib29sIG1faXNJbmxpbmU7CisKKyAgICBwcml2YXRlOgor
ICAgICAgICBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcihGcmFtZSosIGJvb2wgaXNJbmxpbmUpOwor
CisgICAgICAgIC8vIENhbGwgbGlzdGVuZXIgZnVuY3Rpb24uCisgICAgICAgIHZpcnR1YWwgdjg6
OkxvY2FsPHY4OjpWYWx1ZT4gQ2FsbExpc3RlbmVyRnVuY3Rpb24odjg6OkhhbmRsZTx2ODo6VmFs
dWU+IGpzZXZlbnQsIEV2ZW50KiwgYm9vbCBpc1dpbmRvd0V2ZW50KSA9IDA7CisKKyAgICAgICAg
Ly8gR2V0IHRoZSByZWNlaXZlciBvYmplY3QgdG8gdXNlIGZvciBldmVudCBsaXN0ZW5lciBjYWxs
LgorICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gR2V0UmVjZWl2ZXJPYmplY3QoRXZlbnQq
LCBib29sIGlzV2luZG93RXZlbnQpOworCisgICAgICAgIC8vIEZyYW1lIHRvIHdoaWNoIHRoZSBl
dmVudCBsaXN0ZW5lciBpcyBhdHRhY2hlZCB0by4gQW4gZXZlbnQgbGlzdGVuZXIgbXVzdCBiZSBk
ZXN0cm95ZWQgYmVmb3JlIGl0cyBvd25lciBmcmFtZSBpcyAKKyAgICAgICAgLy8gZGVsZXRlZC4g
U2VlIGZhc3QvZG9tL3JlcGxhY2VDaGlsZC5odG1sCisgICAgICAgIC8vIEZJWE1FOiB0aGlzIGNv
dWxkIGhvbGQgbV9mcmFtZSBsaXZlIHVudGlsIHRoZSBldmVudCBsaXN0ZW5lciBpcyBkZWxldGVk
LgorICAgICAgICBGcmFtZSogbV9mcmFtZTsKKworICAgICAgICAvLyBQb3NpdGlvbiBpbiB0aGUg
SFRNTCBzb3VyY2UgZm9yIEhUTUwgZXZlbnQgbGlzdGVuZXJzLgorICAgICAgICBpbnQgbV9saW5l
TnVtYmVyOworICAgICAgICBpbnQgbV9jb2x1bW5OdW1iZXI7CisKKyAgICAgICAgZnJpZW5kIGNs
YXNzIFY4RXZlbnRMaXN0ZW5lcjsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFY4T2JqZWN0RXZlbnRM
aXN0ZW5lcjsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFY4TGF6eUV2ZW50TGlzdGVuZXI7CisgICAg
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVjhBYnN0cmFjdEV2ZW50
TGlzdGVuZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhBdHRy
Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4QXR0ckN1c3RvbS5jcHAK
aW5kZXggMTg0YzVkOS4uZjM0YTQ0MSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhBdHRyQ3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9W
OEF0dHJDdXN0b20uY3BwCkBAIC0xNiw4ICsxNiw4IEBACiAgKiB0aGlzIHNvZnR3YXJlIHdpdGhv
dXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogICoKICAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMK
LSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIGlmcmFtZUxJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgaWZyYW1lTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqICJBUyBJUyIgQU5EIEFOWSBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1J
VEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IKICAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiAgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICAqIFNQRUNJQUwsIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tRXZlbnRMaXN0ZW5l
ci5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbUV2ZW50TGlzdGVuZXIu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZWE3YjYKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbUV2ZW50TGlzdGVu
ZXIuY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcs
IDIwMDgsIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9u
LgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVz
IG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90
ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZp
YyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElT
IiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICog
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpbmNsdWRlICJWOEN1c3RvbUV2ZW50TGlzdGVuZXIuaCIKKworI2luY2x1ZGUgIlY4
UHJveHkuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitWOEV2ZW50TGlzdGVuZXI6OlY4RXZl
bnRMaXN0ZW5lcihGcmFtZSogZnJhbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBsaXN0ZW5lciwg
Ym9vbCBpc0lubGluZSkKKyAgICA6IFY4QWJzdHJhY3RFdmVudExpc3RlbmVyKGZyYW1lLCBpc0lu
bGluZSkKK3sKKyAgICBtX2xpc3RlbmVyID0gdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD46Ok5l
dyhsaXN0ZW5lcik7CisjaWZuZGVmIE5ERUJVRworICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFs
SGFuZGxlKEVWRU5UX0xJU1RFTkVSLCB0aGlzLCBtX2xpc3RlbmVyKTsKKyNlbmRpZgorfQorCitW
OEV2ZW50TGlzdGVuZXI6On5WOEV2ZW50TGlzdGVuZXIoKQoreworICAgIGlmIChtX2ZyYW1lKSB7
CisgICAgICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobV9mcmFtZSk7Cisg
ICAgICAgIGlmIChwcm94eSkKKyAgICAgICAgICAgIHByb3h5LT5SZW1vdmVWOEV2ZW50TGlzdGVu
ZXIodGhpcyk7CisgICAgfQorCisgICAgRGlzcG9zZUxpc3RlbmVyT2JqZWN0KCk7Cit9CisKK3Y4
OjpMb2NhbDx2ODo6RnVuY3Rpb24+IFY4RXZlbnRMaXN0ZW5lcjo6R2V0TGlzdGVuZXJGdW5jdGlv
bigpCit7CisgICAgLy8gSXQgY291bGQgYmUgZGlzcG9zZWQgYWxyZWFkeS4KKyAgICBpZiAobV9s
aXN0ZW5lci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkZ1bmN0aW9u
PigpOworCisgICAgaWYgKG1fbGlzdGVuZXItPklzRnVuY3Rpb24oKSkKKyAgICAgICAgcmV0dXJu
IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpOZXcodjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9u
Pjo6Q2FzdChtX2xpc3RlbmVyKSk7CisKKyAgICBpZiAobV9saXN0ZW5lci0+SXNPYmplY3QoKSkg
eworICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wID0gbV9saXN0ZW5lci0+R2V0KHY4
OjpTdHJpbmc6Ok5ld1N5bWJvbCgiaGFuZGxlRXZlbnQiKSk7CisgICAgICAgIGlmIChwcm9wLT5J
c0Z1bmN0aW9uKCkpCisgICAgICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj46
OkNhc3QocHJvcCk7CisgICAgfQorCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+
KCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4RXZlbnRMaXN0ZW5lcjo6Q2FsbExpc3Rl
bmVyRnVuY3Rpb24odjg6OkhhbmRsZTx2ODo6VmFsdWU+IGpzZXZlbnQsIEV2ZW50KiBldmVudCwg
Ym9vbCBpc1dpbmRvd0V2ZW50KSB7CisgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gaGFuZGxl
cl9mdW5jID0gR2V0TGlzdGVuZXJGdW5jdGlvbigpOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0
PiByZWNlaXZlciA9IEdldFJlY2VpdmVyT2JqZWN0KGV2ZW50LCBpc1dpbmRvd0V2ZW50KTsKKyAg
ICBpZiAoaGFuZGxlcl9mdW5jLklzRW1wdHkoKSB8fCByZWNlaXZlci5Jc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworCisgICAgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IHBhcmFtZXRlcnNbMV0gPSB7IGpzZXZlbnQgfTsKKworICAgIFY4UHJveHkqIHByb3h5
ID0gVjhQcm94eTo6cmV0cmlldmUobV9mcmFtZSk7CisgICAgcmV0dXJuIHByb3h5LT5DYWxsRnVu
Y3Rpb24oaGFuZGxlcl9mdW5jLCByZWNlaXZlciwgMSwgcGFyYW1ldGVycyk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4Q3VzdG9tRXZlbnRMaXN0ZW5lci5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhD
dXN0b21FdmVudExpc3RlbmVyLmgKaW5kZXggOWMwMThkMi4uOTE2YzU3YiAxMDA2NDQKLS0tIGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21FdmVudExpc3RlbmVyLmgKKysrIGIv
V2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhDdXN0b21FdmVudExpc3RlbmVyLmgKQEAgLTEs
MTAgKzEsMTAgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KLSAqIAorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAy
MDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgogICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCiAgKiBtZXQ6Ci0gKiAKKyAqCiAgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgogICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQpAQCAtMTQsNyArMTQsNyBAQAogICogICAgICogTmVpdGhlciB0aGUgbmFtZSBv
ZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogICogY29udHJpYnV0b3JzIG1heSBi
ZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KICAqIHRo
aXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0g
KiAKKyAqCiAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9M
REVSUyBBTkQgQ09OVFJJQlVUT1JTCiAgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogICogTElNSVRFRCBUTywgVEhFIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCkBAIC0z
MSw4ICszMSwzOSBAQAogI2lmbmRlZiBWOEN1c3RvbUV2ZW50TGlzdGVuZXJfaAogI2RlZmluZSBW
OEN1c3RvbUV2ZW50TGlzdGVuZXJfaAogCi0vLyBGSVhNRTogVGhpcyBpcyBhIHRlbXBvcmFyeSBm
b3J3YXJkaW5nIGhlYWRlciB1bnRpbCBhbGwgYmluZGluZ3MgaGF2ZSBtaWdyYXRlZAotLy8gb3Zl
ciBhbmQgdjhfZXZlbnRzIGFjdHVhbGx5IGJlY29tZXMgVjhDdXN0b21FdmVudExpc3RlbmVyLgot
I2luY2x1ZGUgInY4X2V2ZW50cy5oIgorI2luY2x1ZGUgIlY4QWJzdHJhY3RFdmVudExpc3RlbmVy
LmgiCisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBFdmVudDsKKyAgICBjbGFzcyBGcmFtZTsKKwor
ICAgIC8vIFY4RXZlbnRMaXN0ZW5lciBpcyBhIHdyYXBwZXIgb2YgYSBKUyBvYmplY3QgaW1wbGVt
ZW50cyBFdmVudExpc3RlbmVyIGludGVyZmFjZSAoaGFzIGhhbmRsZUV2ZW50KGV2ZW50KSBtZXRo
b2QpLCBvciBhIEpTIGZ1bmN0aW9uCisgICAgLy8gdGhhdCBjYW4gaGFuZGxlIHRoZSBldmVudC4K
KyAgICBjbGFzcyBWOEV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgVjhBYnN0cmFjdEV2ZW50TGlzdGVu
ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdGljIFBhc3NSZWZQdHI8VjhFdmVudExpc3Rl
bmVyPiBjcmVhdGUoRnJhbWUqIGZyYW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbGlzdGVuZXIs
IGJvb2wgaXNJbmxpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZG9wdFJlZihu
ZXcgVjhFdmVudExpc3RlbmVyKGZyYW1lLCBsaXN0ZW5lciwgaXNJbmxpbmUpKTsKKyAgICAgICAg
fQorCisgICAgICAgIFY4RXZlbnRMaXN0ZW5lcihGcmFtZSosIHY4OjpMb2NhbDx2ODo6T2JqZWN0
PiBsaXN0ZW5lciwgYm9vbCBpc0lubGluZSk7CisgICAgICAgIHZpcnR1YWwgflY4RXZlbnRMaXN0
ZW5lcigpOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNJbmxpbmUoKSBjb25zdCB7IHJldHVybiBt
X2lzSW5saW5lOyB9CisKKyAgICAgICAgLy8gRGV0YWNoIHRoZSBsaXN0ZW5lciBmcm9tIGl0cyBv
d25lciBmcmFtZS4KKyAgICAgICAgdm9pZCBkaXNjb25uZWN0RnJhbWUoKSB7IG1fZnJhbWUgPSAw
OyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IEdl
dExpc3RlbmVyRnVuY3Rpb24oKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIC8vIENhbGwgbGlz
dGVuZXIgZnVuY3Rpb24uCisgICAgICAgIHZpcnR1YWwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gQ2Fs
bExpc3RlbmVyRnVuY3Rpb24odjg6OkhhbmRsZTx2ODo6VmFsdWU+IGpzZXZlbnQsIEV2ZW50Kiwg
Ym9vbCBpc1dpbmRvd0V2ZW50KTsKKyAgICB9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAK
ICNlbmRpZiAvLyBWOEN1c3RvbUV2ZW50TGlzdGVuZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhFbGVtZW50Q3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4RWxlbWVudEN1c3RvbS5jcHAKaW5kZXggYjE5MzYxMC4uOTYyNTEwNyAxMDA2
NDQKLS0tIGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhFbGVtZW50Q3VzdG9tLmNwcAor
KysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEVsZW1lbnRDdXN0b20uY3BwCkBAIC0z
NCw2ICszNCw3IEBACiAjaW5jbHVkZSAiQXR0ci5oIgogI2luY2x1ZGUgIkNTU0hlbHBlci5oIgog
I2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRXZlbnRMaXN0ZW5lci5oIgogI2luY2x1
ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKICNpbmNsdWRlICJIVE1MRnJhbWVFbGVtZW50QmFzZS5oIgog
I2luY2x1ZGUgIkhUTUxOYW1lcy5oIgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhMYXp5RXZlbnRMaXN0ZW5lci5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3Rv
bS9WOExhenlFdmVudExpc3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi4wY2M1Njg0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhMYXp5RXZlbnRMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAq
CisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICog
aW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29n
bGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2Vk
IHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29m
dHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENP
TlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQK
KyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBP
UiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJWOExhenlFdmVudExpc3RlbmVy
LmgiCisKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgorI2luY2x1
ZGUgIlY4UHJveHkuaCIKKworI2RlZmluZSBJRl9ERVZFTChzdG10KSAoKHZvaWQpIDApCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworVjhMYXp5RXZlbnRMaXN0ZW5lcjo6VjhMYXp5RXZlbnRMaXN0
ZW5lcihGcmFtZSAqZnJhbWUsIGNvbnN0IFN0cmluZyYgY29kZSwgY29uc3QgU3RyaW5nJiBmdW5j
dGlvbk5hbWUpCisgICAgOiBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcihmcmFtZSwgdHJ1ZSkKKyAg
ICAsIG1fY29kZShjb2RlKQorICAgICwgbV9mdW5jdGlvbk5hbWUoZnVuY3Rpb25OYW1lKQorICAg
ICwgbV9jb21waWxlZChmYWxzZSkKKyAgICAsIG1fd3JhcHBlZEZ1bmN0aW9uQ29tcGlsZWQoZmFs
c2UpCit7Cit9CisKK1Y4TGF6eUV2ZW50TGlzdGVuZXI6On5WOExhenlFdmVudExpc3RlbmVyKCkK
K3sKKyAgICBEaXNwb3NlTGlzdGVuZXJPYmplY3QoKTsKKworICAgIC8vIERpc3Bvc2Ugd3JhcHBl
ZCBmdW5jdGlvbgorICAgIGlmICghbV93cmFwcGVkRnVuY3Rpb24uSXNFbXB0eSgpKSB7CisjaWZu
ZGVmIE5ERUJVRworICAgICAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHRoaXMs
IG1fd3JhcHBlZEZ1bmN0aW9uKTsKKyNlbmRpZgorICAgICAgICBtX3dyYXBwZWRGdW5jdGlvbi5E
aXNwb3NlKCk7CisgICAgICAgIG1fd3JhcHBlZEZ1bmN0aW9uLkNsZWFyKCk7CisgICAgfQorfQor
Cit2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBWOExhenlFdmVudExpc3RlbmVyOjpHZXRMaXN0ZW5l
ckZ1bmN0aW9uKCkKK3sKKyAgICBpZiAobV9jb21waWxlZCkgeworICAgICAgICBBU1NFUlQobV9s
aXN0ZW5lci5Jc0VtcHR5KCkgfHwgbV9saXN0ZW5lci0+SXNGdW5jdGlvbigpKTsKKyAgICAgICAg
cmV0dXJuIG1fbGlzdGVuZXIuSXNFbXB0eSgpID8gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4oKSA6
IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpOZXcodjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9u
Pjo6Q2FzdChtX2xpc3RlbmVyKSk7CisgICAgfQorCisgICAgbV9jb21waWxlZCA9IHRydWU7CisK
KyAgICBBU1NFUlQobV9mcmFtZSk7CisKKyAgICB7CisgICAgICAgIC8vIFN3aXRjaCB0byB0aGUg
Y29udGV4IG9mIG1fZnJhbWUKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZV9zY29wZTsK
KworICAgICAgICAvLyBVc2UgdGhlIG91dGVyIHNjb3BlIHRvIGhvbGQgY29udGV4dC4KKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJveHk6OkdldENvbnRleHQo
bV9mcmFtZSk7CisgICAgICAgIC8vIEJhaWwgb3V0IGlmIHdlIGNvdWxkIG5vdCBnZXQgdGhlIGNv
bnRleHQuCisgICAgICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkgcmV0dXJuIHY4OjpMb2NhbDx2
ODo6RnVuY3Rpb24+KCk7CisKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRl
eHQpOworCisgICAgICAgIC8vIFdyYXAgZnVuY3Rpb24gYXJvdW5kIHRoZSBldmVudCBjb2RlLiAg
VGhlIHBhcmVudGhlc2lzIGFyb3VuZAorICAgICAgICAvLyB0aGUgZnVuY3Rpb24gYXJlIG5lZWRl
ZCBzbyB0aGF0IGV2YWx1YXRpbmcgdGhlIGNvZGUgeWllbGRzCisgICAgICAgIC8vIHRoZSBmdW5j
dGlvbiB2YWx1ZS4gIFdpdGhvdXQgdGhlIHBhcmVudGhlc2lzIHRoZSBmdW5jdGlvbgorICAgICAg
ICAvLyB2YWx1ZSBpcyB0aHJvd24gYXdheS4KKworICAgICAgICAvLyBNYWtlIGl0IGFuIGFub255
bW91cyBmdW5jdGlvbiB0byBhdm9pZCBuYW1lIGNvbmZsaWN0IGZvciBjYXNlcyBsaWtlCisgICAg
ICAgIC8vIDxib2R5IG9ubG9hZD0nb25sb2FkKCknPgorICAgICAgICAvLyA8c2NyaXB0PiBmdW5j
dGlvbiBvbmxvYWQoKSB7IGFsZXJ0KCdoaScpOyB9IDwvc2NyaXB0Pi4KKyAgICAgICAgLy8gU2V0
IGZ1bmN0aW9uIG5hbWUgdG8gZnVuY3Rpb24gb2JqZWN0IGluc3RlYWQuCisgICAgICAgIC8vIFNl
ZSBpc3N1ZSA5NDQ2OTAuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBFQ01BU2NyaXB0IHNw
ZWMgc2F5cyAodmVyeSBvYmxpcXVlbHkpIHRoYXQgdGhlIHBhcmFtZXRlciB0bworICAgICAgICAv
LyBhbiBldmVudCBoYW5kbGVyIGlzIG5hbWVkICJldnQiLgorICAgICAgICBTdHJpbmcgY29kZSA9
ICIoZnVuY3Rpb24gKGV2dCkge1xuIjsKKyAgICAgICAgY29kZS5hcHBlbmQobV9jb2RlKTsKKyAg
ICAgICAgY29kZS5hcHBlbmQoIn0pIik7CisKKyAgICAgICAgSUZfREVWRUwobG9nX2luZm8oZnJh
bWUsIGNvZGUsICI8Z2V0TGlzdGVuZXI+IikpOworCisgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0
cmluZz4gY29kZUV4dGVybmFsU3RyaW5nID0gdjhFeHRlcm5hbFN0cmluZyhjb2RlKTsKKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQgPSBWOFByb3h5OjpDb21waWxlU2NyaXB0
KGNvZGVFeHRlcm5hbFN0cmluZywgbV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCksIG1fbGluZU51
bWJlciAtIDEpOworICAgICAgICBpZiAoIXNjcmlwdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAg
IFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobV9mcmFtZSk7CisgICAgICAgICAg
ICBBU1NFUlQocHJveHkpOyAgLy8gbXVzdCBiZSB2YWxpZCBhdCB0aGlzIHBvaW50CisgICAgICAg
ICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSA9IHByb3h5LT5SdW5TY3JpcHQoc2NyaXB0
LCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoIXZhbHVlLklzRW1wdHkoKSkgeworICAgICAgICAg
ICAgICAgIEFTU0VSVCh2YWx1ZS0+SXNGdW5jdGlvbigpKTsKKyAgICAgICAgICAgICAgICB2ODo6
TG9jYWw8djg6OkZ1bmN0aW9uPiBsaXN0ZW5lcl9mdW5jID0gdjg6OkxvY2FsPHY4OjpGdW5jdGlv
bj46OkNhc3QodmFsdWUpOworICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZnVuY3Rpb24gbmFt
ZS4KKyAgICAgICAgICAgICAgICBsaXN0ZW5lcl9mdW5jLT5TZXROYW1lKHY4OjpTdHJpbmc6Ok5l
dyhGcm9tV2ViQ29yZVN0cmluZyhtX2Z1bmN0aW9uTmFtZSksIG1fZnVuY3Rpb25OYW1lLmxlbmd0
aCgpKSk7CisKKyAgICAgICAgICAgICAgICBtX2xpc3RlbmVyID0gdjg6OlBlcnNpc3RlbnQ8djg6
OkZ1bmN0aW9uPjo6TmV3KGxpc3RlbmVyX2Z1bmMpOworI2lmbmRlZiBOREVCVUcKKyAgICAgICAg
ICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRsZShFVkVOVF9MSVNURU5FUiwgdGhp
cywgbV9saXN0ZW5lcik7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0g
IC8vIGVuZCBvZiBIYW5kbGVTY29wZQorCisgICAgQVNTRVJUKG1fbGlzdGVuZXIuSXNFbXB0eSgp
IHx8IG1fbGlzdGVuZXItPklzRnVuY3Rpb24oKSk7CisgICAgcmV0dXJuIG1fbGlzdGVuZXIuSXNF
bXB0eSgpID8gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4oKSA6IHY4OjpMb2NhbDx2ODo6RnVuY3Rp
b24+OjpOZXcodjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6Q2FzdChtX2xpc3RlbmVyKSk7
Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4TGF6eUV2ZW50TGlzdGVuZXI6OkNhbGxMaXN0
ZW5lckZ1bmN0aW9uKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc2V2ZW50LCBFdmVudCogZXZlbnQs
IGJvb2wgaXNXaW5kb3dFdmVudCkKK3sKKyAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBoYW5k
bGVyRnVuY3Rpb24gPSBHZXRXcmFwcGVkTGlzdGVuZXJGdW5jdGlvbigpOworICAgIHY4OjpMb2Nh
bDx2ODo6T2JqZWN0PiByZWNlaXZlciA9IEdldFJlY2VpdmVyT2JqZWN0KGV2ZW50LCBpc1dpbmRv
d0V2ZW50KTsKKyAgICBpZiAoaGFuZGxlckZ1bmN0aW9uLklzRW1wdHkoKSB8fCByZWNlaXZlci5J
c0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZhbHVlPigpOworCisgICAg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IHBhcmFtZXRlcnNbMV0gPSB7IGpzZXZlbnQgfTsKKworICAg
IFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobV9mcmFtZSk7CisgICAgcmV0dXJu
IHByb3h5LT5DYWxsRnVuY3Rpb24oaGFuZGxlckZ1bmN0aW9uLCByZWNlaXZlciwgMSwgcGFyYW1l
dGVycyk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IFY4TGF6eUV2ZW50TGlzdGVuZXI6
OkdldFdyYXBwZWRMaXN0ZW5lckZ1bmN0aW9uKCkKK3sKKyAgICBpZiAobV93cmFwcGVkRnVuY3Rp
b25Db21waWxlZCkgeworICAgICAgICBBU1NFUlQobV93cmFwcGVkRnVuY3Rpb24uSXNFbXB0eSgp
IHx8IG1fd3JhcHBlZEZ1bmN0aW9uLT5Jc0Z1bmN0aW9uKCkpOworICAgICAgICByZXR1cm4gbV93
cmFwcGVkRnVuY3Rpb24uSXNFbXB0eSgpID8gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4oKSA6IHY4
OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpOZXcobV93cmFwcGVkRnVuY3Rpb24pOworICAgIH0KKwor
ICAgIG1fd3JhcHBlZEZ1bmN0aW9uQ29tcGlsZWQgPSB0cnVlOworCisgICAgeworICAgICAgICAv
LyBTd2l0Y2ggdG8gdGhlIGNvbnRleCBvZiBtX2ZyYW1lCisgICAgICAgIHY4OjpIYW5kbGVTY29w
ZSBoYW5kbGVfc2NvcGU7CisKKyAgICAgICAgLy8gVXNlIHRoZSBvdXRlciBzY29wZSB0byBob2xk
IGNvbnRleHQuCisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBWOFBy
b3h5OjpHZXRDb250ZXh0KG1fZnJhbWUpOworICAgICAgICAvLyBCYWlsIG91dCBpZiB3ZSBjYW5u
b3QgZ2V0IHRoZSBjb250ZXh0LgorICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAg
ICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4oKTsKKworICAgICAgICB2ODo6
Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICAgICAgLy8gRklYTUU6IGNhY2hl
IHRoZSB3cmFwcGVyIGZ1bmN0aW9uLgorICAgICAgICBTdHJpbmcgY29kZSA9ICIoZnVuY3Rpb24g
KGV2dCkge1xuIjsKKworICAgICAgICAvLyBOb2RlcyBvdGhlciB0aGFuIHRoZSBkb2N1bWVudCBv
YmplY3QsIHdoZW4gZXhlY3V0aW5nIGlubGluZSBldmVudCBoYW5kbGVycyBwdXNoIGRvY3VtZW50
LCBmb3JtLCBhbmQgdGhlIHRhcmdldCBub2RlIG9uIHRoZSBzY29wZSBjaGFpbi4KKyAgICAgICAg
Ly8gV2UgZG8gdGhpcyBieSB1c2luZyAnd2l0aCcgc3RhdGVtZW50LgorICAgICAgICAvLyBTZWUg
Y2hyb21lL2Zhc3QvZm9ybXMvZm9ybS1hY3Rpb24uaHRtbAorICAgICAgICAvLyAgICAgY2hyb21l
L2Zhc3QvZm9ybXMvc2VsZWN0ZWQtaW5kZXgtdmFsdWUuaHRtbAorICAgICAgICAvLyAgICAgYmFz
ZS9mYXN0L292ZXJmbG93L29uc2Nyb2xsLWxheWVyLXNlbGYtZGVzdHJ1Y3QuaHRtbAorICAgICAg
ICBjb2RlLmFwcGVuZCgiICB3aXRoICh0aGlzLm93bmVyRG9jdW1lbnQgPyB0aGlzLm93bmVyRG9j
dW1lbnQgOiB7fSkge1xuIik7CisgICAgICAgIGNvZGUuYXBwZW5kKCIgICAgd2l0aCAodGhpcy5m
b3JtID8gdGhpcy5mb3JtIDoge30pIHtcbiIpOworICAgICAgICBjb2RlLmFwcGVuZCgiICAgICAg
d2l0aCAodGhpcykge1xuIik7CisgICAgICAgIGNvZGUuYXBwZW5kKCIgICAgICAgIHJldHVybiAo
ZnVuY3Rpb24oZXZ0KXsiKTsKKyAgICAgICAgY29kZS5hcHBlbmQobV9jb2RlKTsKKyAgICAgICAg
Y29kZS5hcHBlbmQoIn0pLmNhbGwodGhpcywgZXZ0KTtcbiIpOworICAgICAgICBjb2RlLmFwcGVu
ZCgiICAgICAgfVxuIik7CisgICAgICAgIGNvZGUuYXBwZW5kKCIgICAgfVxuIik7CisgICAgICAg
IGNvZGUuYXBwZW5kKCIgIH1cbiIpOworICAgICAgICBjb2RlLmFwcGVuZCgifSkiKTsKKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBjb2RlRXh0ZXJuYWxTdHJpbmcgPSB2OEV4dGVybmFs
U3RyaW5nKGNvZGUpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4
UHJveHk6OkNvbXBpbGVTY3JpcHQoY29kZUV4dGVybmFsU3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVu
dCgpLT51cmwoKSwgbV9saW5lTnVtYmVyIC0gNCk7CisgICAgICAgIGlmICghc2NyaXB0LklzRW1w
dHkoKSkgeworICAgICAgICAgICAgVjhQcm94eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZSht
X2ZyYW1lKTsKKyAgICAgICAgICAgIEFTU0VSVChwcm94eSk7CisgICAgICAgICAgICB2ODo6TG9j
YWw8djg6OlZhbHVlPiB2YWx1ZSA9IHByb3h5LT5SdW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7Cisg
ICAgICAgICAgICBpZiAoIXZhbHVlLklzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFTU0VS
VCh2YWx1ZS0+SXNGdW5jdGlvbigpKTsKKworICAgICAgICAgICAgICAgIG1fd3JhcHBlZEZ1bmN0
aW9uID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6TmV3KHY4OjpMb2NhbDx2ODo6RnVu
Y3Rpb24+OjpDYXN0KHZhbHVlKSk7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgICAgIFY4
UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKEVWRU5UX0xJU1RFTkVSLCB0aGlzLCBtX3dyYXBw
ZWRGdW5jdGlvbik7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGZ1bmN0aW9u
IG5hbWUuCisgICAgICAgICAgICAgICAgbV93cmFwcGVkRnVuY3Rpb24tPlNldE5hbWUodjg6OlN0
cmluZzo6TmV3KEZyb21XZWJDb3JlU3RyaW5nKG1fZnVuY3Rpb25OYW1lKSwgbV9mdW5jdGlvbk5h
bWUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gIC8vIGVuZCBv
ZiBsb2NhbCBzY29wZQorCisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpOZXco
bV93cmFwcGVkRnVuY3Rpb24pOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOExhenlFdmVudExpc3RlbmVyLmggYi9X
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOExhenlFdmVudExpc3RlbmVyLmgKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxYzkxNAotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4TGF6eUV2ZW50TGlzdGVuZXIuaApAQCAtMCwwICsx
LDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAq
IGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRo
ZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBw
ZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlS
SUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBT
SEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlU
RUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWOExhenlFdmVudExpc3RlbmVyX2gKKyNk
ZWZpbmUgVjhMYXp5RXZlbnRMaXN0ZW5lcl9oCisKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5o
IgorI2luY2x1ZGUgIlY4QWJzdHJhY3RFdmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSA8djguaD4K
KyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAg
ICBjbGFzcyBFdmVudDsKKyAgICBjbGFzcyBGcmFtZTsKKworICAgIC8vIFY4TGF6eUV2ZW50TGlz
dGVuZXIgaXMgYSB3cmFwcGVyIGZvciBhIEphdmFTY3JpcHQgY29kZSBzdHJpbmcgdGhhdCBpcyBj
b21waWxlZCBhbmQgZXZhbHVhdGVkIHdoZW4gYW4gZXZlbnQgaXMgZmlyZWQuCisgICAgLy8gQSBW
OExhenlFdmVudExpc3RlbmVyIGlzIGFsd2F5cyBhIEhUTUwgZXZlbnQgaGFuZGxlci4KKyAgICBj
bGFzcyBWOExhenlFdmVudExpc3RlbmVyIDogcHVibGljIFY4QWJzdHJhY3RFdmVudExpc3RlbmVy
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFY4TGF6eUV2ZW50TGlz
dGVuZXI+IGNyZWF0ZShGcmFtZSogZnJhbWUsIGNvbnN0IFN0cmluZyYgY29kZSwgY29uc3QgU3Ry
aW5nJiBmdW5jdGlvbk5hbWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgVjhMYXp5RXZlbnRMaXN0ZW5lcihmcmFtZSwgY29kZSwgZnVuY3Rpb25OYW1lKSk7Cisg
ICAgICAgIH0KKyAgICAgICAgVjhMYXp5RXZlbnRMaXN0ZW5lcihGcmFtZSosIGNvbnN0IFN0cmlu
ZyYgY29kZSwgY29uc3QgU3RyaW5nJiBmdW5jdGlvbk5hbWUpOworICAgICAgICB2aXJ0dWFsIH5W
OExhenlFdmVudExpc3RlbmVyKCk7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0lubGluZSgpIGNv
bnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgICAgICAvLyBGb3IgbGF6eSBldmVudCBsaXN0ZW5l
ciwgdGhlIGxpc3RlbmVyIG9iamVjdCBpcyB0aGUgc2FtZSBhcyBpdHMgbGlzdGVuZXIKKyAgICAg
ICAgLy8gZnVuY3Rpb24gd2l0aG91dCBhZGRpdGlvbmFsIHNjb3BlIGNoYWlucy4KKyAgICAgICAg
dmlydHVhbCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gR2V0TGlzdGVuZXJPYmplY3QoKSB7IHJldHVy
biBHZXRXcmFwcGVkTGlzdGVuZXJGdW5jdGlvbigpOyB9CisKKyAgICBwcml2YXRlOgorICAgICAg
ICBTdHJpbmcgbV9jb2RlOworICAgICAgICBTdHJpbmcgbV9mdW5jdGlvbk5hbWU7ICAvLyBmdW5j
dGlvbiBuYW1lCisgICAgICAgIGJvb2wgbV9jb21waWxlZDsKKworICAgICAgICAvLyBJZiB0aGUg
ZXZlbnQgbGlzdGVuZXIgaXMgb24gYSBub24tZG9jdW1lbnQgZG9tIG5vZGUsIHdlIGNvbXBpbGUg
dGhlIGZ1bmN0aW9uIHdpdGggc29tZSBpbXBsaWNpdCBzY29wZSBjaGFpbnMgYmVmb3JlIGl0Lgor
ICAgICAgICBib29sIG1fd3JhcHBlZEZ1bmN0aW9uQ29tcGlsZWQ7CisgICAgICAgIHY4OjpQZXJz
aXN0ZW50PHY4OjpGdW5jdGlvbj4gbV93cmFwcGVkRnVuY3Rpb247CisKKyAgICAgICAgdjg6Okxv
Y2FsPHY4OjpGdW5jdGlvbj4gR2V0V3JhcHBlZExpc3RlbmVyRnVuY3Rpb24oKTsKKworICAgICAg
ICB2aXJ0dWFsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IENhbGxMaXN0ZW5lckZ1bmN0aW9uKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBqc2V2ZW50LCBFdmVudCosIGJvb2wgaXNXaW5kb3dFdmVudCk7CisK
KyAgICAgICAgdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gR2V0TGlzdGVuZXJGdW5jdGlvbigpOwor
ICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFY4TGF6eUV2ZW50
TGlzdGVuZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhPYmpl
Y3RFdmVudExpc3RlbmVyLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4T2JqZWN0
RXZlbnRMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMw
ODI2OAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4T2Jq
ZWN0RXZlbnRMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAg
ICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisg
KiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMu
IG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3
aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVU
T1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dO
RVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQor
ICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlY4T2JqZWN0RXZlbnRMaXN0ZW5lci5oIgor
CisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworc3RhdGljIHZvaWQgV2Vha09iamVjdEV2ZW50TGlzdGVuZXJDYWxsYmFjayh2
ODo6UGVyc2lzdGVudDx2ODo6VmFsdWU+IG9iaiwgdm9pZCogcGFyYSkKK3sKKyAgICBWOE9iamVj
dEV2ZW50TGlzdGVuZXIqIGxpc3RlbmVyID0gc3RhdGljX2Nhc3Q8VjhPYmplY3RFdmVudExpc3Rl
bmVyKj4ocGFyYSk7CisKKyAgICAvLyBSZW1vdmUgdGhlIHdyYXBwZXIKKyAgICBGcmFtZSogZnJh
bWUgPSBsaXN0ZW5lci0+ZnJhbWUoKTsKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgVjhQcm94
eSogcHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7CisgICAgICAgIGlmIChwcm94eSkK
KyAgICAgICAgICAgIHByb3h5LT5SZW1vdmVPYmplY3RFdmVudExpc3RlbmVyKGxpc3RlbmVyKTsK
KworICAgICAgICAvLyBCZWNhdXNlIHRoZSBsaXN0ZW5lciBpcyBubyBsb25nZXIgaW4gdGhlIGxp
c3QsIGl0IG11c3QgYmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGZyYW1lIHRvIGF2b2lkIGRhbmds
aW5nIGZyYW1lIHBvaW50ZXIKKyAgICAgICAgLy8gaW4gdGhlIGRlc3RydWN0b3IuCisgICAgICAg
IGxpc3RlbmVyLT5kaXNjb25uZWN0RnJhbWUoKTsKKyAgICB9CisKKyAgICAvLyBEaXNwb3NlIHRo
ZSBsaXN0ZW5lciBvYmplY3QuCisgICAgbGlzdGVuZXItPkRpc3Bvc2VMaXN0ZW5lck9iamVjdCgp
OworfQorCitWOE9iamVjdEV2ZW50TGlzdGVuZXI6OlY4T2JqZWN0RXZlbnRMaXN0ZW5lcihGcmFt
ZSogZnJhbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBsaXN0ZW5lciwgYm9vbCBpc0lubGluZSkK
KyAgICA6IFY4RXZlbnRMaXN0ZW5lcihmcmFtZSwgbGlzdGVuZXIsIGlzSW5saW5lKQoreworICAg
IG1fbGlzdGVuZXIuTWFrZVdlYWsodGhpcywgV2Vha09iamVjdEV2ZW50TGlzdGVuZXJDYWxsYmFj
ayk7Cit9CisKK1Y4T2JqZWN0RXZlbnRMaXN0ZW5lcjo6flY4T2JqZWN0RXZlbnRMaXN0ZW5lcigp
Cit7CisgICAgaWYgKG1fZnJhbWUpIHsKKyAgICAgICAgQVNTRVJUKCFtX2xpc3RlbmVyLklzRW1w
dHkoKSk7CisgICAgICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobV9mcmFt
ZSk7CisgICAgICAgIGlmIChwcm94eSkKKyAgICAgICAgICAgIHByb3h5LT5SZW1vdmVPYmplY3RF
dmVudExpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIERpc3Bvc2VMaXN0ZW5lck9iamVjdCgp
OworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRp
bmdzL3Y4L2N1c3RvbS9WOE9iamVjdEV2ZW50TGlzdGVuZXIuaCBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvY3VzdG9tL1Y4T2JqZWN0RXZlbnRMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjg5MjcxYzkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOE9iamVjdEV2ZW50TGlzdGVuZXIuaApAQCAtMCwwICsxLDU1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEdvb2dsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBt
ZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUg
b2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkg
YmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0
aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJT
IEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFS
VElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09Q
WVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICog
REFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2lmbmRlZiBWOE9iamVjdEV2ZW50TGlzdGVuZXJfaAorI2RlZmluZSBWOE9i
amVjdEV2ZW50TGlzdGVuZXJfaAorCisjaW5jbHVkZSAiVjhDdXN0b21FdmVudExpc3RlbmVyLmgi
CisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0ci5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBGcmFtZTsKKworICAgIC8vIFY4T2JqZWN0RXZlbnRM
aXN0ZW5lciBpcyBhIHNwZWNpYWwgbGlzdGVuZXIgd3JhcHBlciBmb3Igb2JqZWN0cyBub3QgaW4g
dGhlIERPTS4gIEl0IGtlZXBzIHRoZSBKUyBsaXN0ZW5lciBhcyBhIHdlYWsgcG9pbnRlci4KKyAg
ICBjbGFzcyBWOE9iamVjdEV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgVjhFdmVudExpc3RlbmVyIHsK
KyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFY4T2JqZWN0RXZlbnRMaXN0
ZW5lcj4gY3JlYXRlKEZyYW1lKiBmcmFtZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGxpc3RlbmVy
LCBib29sIGlzSW5saW5lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYo
bmV3IFY4T2JqZWN0RXZlbnRMaXN0ZW5lcihmcmFtZSwgbGlzdGVuZXIsIGlzSW5saW5lKSk7Cisg
ICAgICAgIH0KKyAgICAgICAgVjhPYmplY3RFdmVudExpc3RlbmVyKEZyYW1lKiwgdjg6OkxvY2Fs
PHY4OjpPYmplY3Q+IGxpc3RlbmVyLCBib29sIGlzSW5saW5lKTsKKyAgICAgICAgdmlydHVhbCB+
VjhPYmplY3RFdmVudExpc3RlbmVyKCk7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCisjZW5kaWYgLy8gVk9iamVjdEV2ZW50TGlzdGVuZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5jcHAgYi9X
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTgxNWM4Ci0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDb250ZXh0RXZlbnRM
aXN0ZW5lci5jcHAKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYs
IDIwMDcsIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJp
YnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhl
IG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3Ig
cHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBz
cGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICog
IkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9S
WSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisKKyNpZiBFTkFCTEUoV09SS0VSUykKKworI2luY2x1ZGUgIlY4V29ya2VyQ29u
dGV4dEV2ZW50TGlzdGVuZXIuaCIKKworI2luY2x1ZGUgIkV2ZW50LmgiCisjaW5jbHVkZSAiV29y
a2VyQ29udGV4dEV4ZWN1dGlvblByb3h5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworVjhX
b3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcjo6VjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcihX
b3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkqIHByb3h5LCB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
bGlzdGVuZXIsIGJvb2wgaXNJbmxpbmUpCisgICAgOiBWOE9iamVjdEV2ZW50TGlzdGVuZXIoMCwg
bGlzdGVuZXIsIGlzSW5saW5lKQorICAgICwgbV9wcm94eShwcm94eSkKK3sKK30KKworVjhXb3Jr
ZXJDb250ZXh0RXZlbnRMaXN0ZW5lcjo6flY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIoKQor
eworICAgIGlmIChtX3Byb3h5KQorICAgICAgICBtX3Byb3h5LT5SZW1vdmVFdmVudExpc3RlbmVy
KHRoaXMpOworICAgIERpc3Bvc2VMaXN0ZW5lck9iamVjdCgpOworfQorCit2b2lkIFY4V29ya2Vy
Q29udGV4dEV2ZW50TGlzdGVuZXI6OmhhbmRsZUV2ZW50KEV2ZW50KiBldmVudCwgYm9vbCBpc1dp
bmRvd0V2ZW50KQoreworICAgIC8vIEV2ZW50TGlzdGVuZXIgY291bGQgYmUgZGlzY29ubmVjdGVk
IGZyb20gdGhlIGZyYW1lLgorICAgIGlmIChkaXNjb25uZWN0ZWQoKSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9uIFhNTEh0dHBSZXF1ZXN0IGNhbiBj
bGVhciB0aGUgZXZlbnQgbGlzdGVuZXIgYW5kIGRlc3Ryb3lzICd0aGlzJyBvYmplY3QuIEtlZXAg
YSBsb2NhbCByZWZlcmVuY2Ugb2YgaXQuCisgICAgLy8gU2VlIGlzc3VlIDg4OTgyOQorICAgIFJl
ZlB0cjxWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcj4gc2VsZih0aGlzKTsKKworICAgIHY4OjpIYW5k
bGVTY29wZSBoYW5kbGVfc2NvcGU7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250
ZXh0ID0gbV9wcm94eS0+R2V0Q29udGV4dCgpOworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgSGFuZGxlRXZlbnRIZWxwZXIoY29udGV4dCwgZXZlbnQs
IGlzV2luZG93RXZlbnQpOworfQorCit2ODo6TG9jYWw8djg6OlZhbHVlPiBWOFdvcmtlckNvbnRl
eHRFdmVudExpc3RlbmVyOjpDYWxsTGlzdGVuZXJGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4ganNldmVudCwgRXZlbnQqIGV2ZW50LCBib29sIGlzV2luZG93RXZlbnQpCit7CisgICAgdjg6
OkxvY2FsPHY4OjpGdW5jdGlvbj4gaGFuZGxlcl9mdW5jID0gR2V0TGlzdGVuZXJGdW5jdGlvbigp
OworICAgIGlmIChoYW5kbGVyX2Z1bmMuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdjg6Okxv
Y2FsPHY4OjpWYWx1ZT4oKTsKKworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiByZWNlaXZlciA9
IEdldFJlY2VpdmVyT2JqZWN0KGV2ZW50LCBpc1dpbmRvd0V2ZW50KTsKKyAgICB2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gcGFyYW1ldGVyc1sxXSA9IHtqc2V2ZW50fTsKKyAgICB2ODo6TG9jYWw8djg6
OlZhbHVlPiByZXN1bHQgPSBoYW5kbGVyX2Z1bmMtPkNhbGwocmVjZWl2ZXIsIDEsIHBhcmFtZXRl
cnMpOworCisgICAgbV9wcm94eS0+VHJhY2tFdmVudChldmVudCk7CisKKyAgICByZXR1cm4gcmVz
dWx0OworfQorCit2ODo6TG9jYWw8djg6Ok9iamVjdD4gVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0
ZW5lcjo6R2V0UmVjZWl2ZXJPYmplY3QoRXZlbnQqIGV2ZW50LCBib29sIGlzV2luZG93RXZlbnQp
Cit7CisgICAgaWYgKCFtX2xpc3RlbmVyLklzRW1wdHkoKSAmJiAhbV9saXN0ZW5lci0+SXNGdW5j
dGlvbigpKQorICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcobV9saXN0
ZW5lcik7CisKKyAgICBpZiAoaXNXaW5kb3dFdmVudCkKKyAgICAgICAgcmV0dXJuIHY4OjpDb250
ZXh0OjpHZXRDdXJyZW50KCktPkdsb2JhbCgpOworCisgICAgRXZlbnRUYXJnZXQqIHRhcmdldCA9
IGV2ZW50LT5jdXJyZW50VGFyZ2V0KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVl
ID0gV29ya2VyQ29udGV4dEV4ZWN1dGlvblByb3h5OjpFdmVudFRhcmdldFRvVjhPYmplY3QodGFy
Z2V0KTsKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdjg6OkxvY2Fs
PHY4OjpPYmplY3Q+KCk7CisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KHY4
OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUpKTsKK30KKworfSAvLyBuYW1lc3BhY2Ug
V2ViQ29yZQorCisjZW5kaWYgLy8gV09SS0VSUwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5n
cy92OC9jdXN0b20vVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5oIGIvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5oCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTI3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyLmgKQEAg
LTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAw
OSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAg
KiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisg
KiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVjhXb3JrZXJDb250ZXh0RXZl
bnRMaXN0ZW5lcl9oCisjZGVmaW5lIFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXJfaAorCisj
aWYgRU5BQkxFKFdPUktFUlMpCisKKyNpbmNsdWRlICJWOE9iamVjdEV2ZW50TGlzdGVuZXIuaCIK
KyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEV2ZW50OworICAgIGNsYXNzIFdvcmtlckNvbnRleHRF
eGVjdXRpb25Qcm94eTsKKworICAgIGNsYXNzIFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIg
OiBwdWJsaWMgVjhPYmplY3RFdmVudExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0
YXRpYyBQYXNzUmVmUHRyPFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXI+IGNyZWF0ZShXb3Jr
ZXJDb250ZXh0RXhlY3V0aW9uUHJveHkqIHByb3h5LCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbGlz
dGVuZXIsIGJvb2wgaXNJbmxpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZG9w
dFJlZihuZXcgVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcihwcm94eSwgbGlzdGVuZXIsIGlz
SW5saW5lKSk7CisgICAgICAgIH0KKyAgICAgICAgVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5l
cihXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkqLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbGlz
dGVuZXIsIGJvb2wgaXNJbmxpbmUpOworCisgICAgICAgIHZpcnR1YWwgflY4V29ya2VyQ29udGV4
dEV2ZW50TGlzdGVuZXIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50
KiwgYm9vbCBpc1dpbmRvd0V2ZW50KTsKKyAgICAgICAgdmlydHVhbCBib29sIGRpc2Nvbm5lY3Rl
ZCgpIGNvbnN0IHsgcmV0dXJuICFtX3Byb3h5OyB9CisKKyAgICAgICAgdm9pZCBkaXNjb25uZWN0
KCkgeyBtX3Byb3h5ID0gMDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB2ODo6
TG9jYWw8djg6OlZhbHVlPiBDYWxsTGlzdGVuZXJGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4ganNldmVudCwgRXZlbnQqLCBib29sIGlzV2luZG93RXZlbnQpOworICAgICAgICB2ODo6TG9j
YWw8djg6Ok9iamVjdD4gR2V0UmVjZWl2ZXJPYmplY3QoRXZlbnQqLCBib29sIGlzV2luZG93RXZl
bnQpOworICAgICAgICBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkqIG1fcHJveHk7CisgICAg
fTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gV09SS0VSUworCisjZW5k
aWYgLy8gVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>28453</attachid>
            <date>2009-03-10 15:40:42 -0700</date>
            <delta_ts>2009-03-11 13:54:11 -0700</delta_ts>
            <desc>Proposed fix.</desc>
            <filename>bug24459.txt</filename>
            <type>text/plain</type>
            <size>46879</size>
            <attacher name="David Levin">levin</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NGJlMTY0MS4uYTYxZGY5MiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwyNyBAQAorMjAwOS0wMy0wOSAgRGF2aWQgTGV2aW4g
IDxsZXZpbkBjaHJvbWl1bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BT
ISkuCisKKyAgICAgICAgQnVnIDI0NDU5OiBBZGQgdjggYmluZGluZ3MgZm9yIGV2ZW50LgorICAg
ICAgICA8aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI0NDU5PgorCisg
ICAgICAgIEFkZGluZyBjdXN0b20gZXZlbnQgYmluZGluZ3MuCisKKyAgICAgICAgKiBiaW5kaW5n
cy92OC9jdXN0b20vVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBiaW5kaW5ncy92OC9jdXN0b20vVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuaDogQWRkZWQuCisg
ICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4QXR0ckN1c3RvbS5jcHA6CisgICAgICAgIEZp
eGVkIG1lc3NlZCB1cCBjb3B5cmlnaHQgaGVhZGVyLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1
c3RvbS9WOEN1c3RvbUV2ZW50TGlzdGVuZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBiaW5kaW5n
cy92OC9jdXN0b20vVjhDdXN0b21FdmVudExpc3RlbmVyLmg6CisgICAgICAgIFJlcGxhY2VkIGZv
cndhcmRpbmcgaGVhZGVyIHdpdGggdGhlIHJlYWwgaW1wbGVtZW50YXRpb24uCisgICAgICAgICog
YmluZGluZ3MvdjgvY3VzdG9tL1Y4RWxlbWVudEN1c3RvbS5jcHA6CisgICAgICAgICogYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4TGF6eUV2ZW50TGlzdGVuZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBi
aW5kaW5ncy92OC9jdXN0b20vVjhMYXp5RXZlbnRMaXN0ZW5lci5oOiBBZGRlZC4KKyAgICAgICAg
KiBiaW5kaW5ncy92OC9jdXN0b20vVjhPYmplY3RFdmVudExpc3RlbmVyLmNwcDogQWRkZWQuCisg
ICAgICAgICogYmluZGluZ3MvdjgvY3VzdG9tL1Y4T2JqZWN0RXZlbnRMaXN0ZW5lci5oOiBBZGRl
ZC4KKyAgICAgICAgKiBiaW5kaW5ncy92OC9jdXN0b20vVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0
ZW5lci5jcHA6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3Y4L2N1c3RvbS9WOFdvcmtlckNv
bnRleHRFdmVudExpc3RlbmVyLmg6IEFkZGVkLgorCiAyMDA5LTAzLTA4ICBNYXJrIFJvd2UgIDxt
cm93ZUBhcHBsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgRGFuIEJlcm5zdGVpbi4KZGlmZiAt
LWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhCaW5kaW5nLmggYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L1Y4QmluZGluZy5oCmluZGV4IDYzNDdhNWYuLjlmY2UzZjIgMTAwNjQ0Ci0tLSBhL1dlYkNv
cmUvYmluZGluZ3MvdjgvVjhCaW5kaW5nLmgKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOEJp
bmRpbmcuaApAQCAtMzcsNyArMzcsNyBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLSAgICAv
LyBGSVhNRTogUmVtb3ZlIG9uY2UgbWlncmF0aW9uIGlzIGNvbXBsZXRlCisgICAgLy8gRklYTUU6
IFJlbW92ZSBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KICAgICBpbmxpbmUgaW50IHRvSW50
MzIodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQogICAgIHsKICAgICAgICAgcmV0dXJuIFRv
SW50MzIodmFsdWUpOwpAQCAtNDgsMTMgKzQ4LDE5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0Pih2YWx1ZS0+TnVtYmVyVmFsdWUoKSk7CiAg
ICAgfQogCi0gICAgLy8gRklYTUU6IFJlbW92ZSBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZQor
ICAgIC8vIEZJWE1FOiBSZW1vdmUgb25jZSBtaWdyYXRpb24gaXMgY29tcGxldGUuCiAgICAgaW5s
aW5lIFN0cmluZyB0b1dlYkNvcmVTdHJpbmcodjg6OkhhbmRsZTx2ODo6VmFsdWU+IG9iaikKICAg
ICB7CiAgICAgICAgIHJldHVybiBUb1dlYkNvcmVTdHJpbmcob2JqKTsKICAgICB9CiAKLSAgICAv
LyBGSVhNRTogUmVuYW1lIHZhbHVlVG9TdHJpbmdXaXRoTnVsbENoZWNrIG9uY2UgbWlncmF0aW9u
IGlzIGNvbXBsZXRlCisgICAgLy8gRklYTUU6IFJlbW92ZSBvbmNlIG1pZ3JhdGlvbiBpcyBjb21w
bGV0ZS4KKyAgICBpbmxpbmUgY29uc3QgdWludDE2X3QqIGZyb21XZWJDb3JlU3RyaW5nKGNvbnN0
IFN0cmluZyYgc3RyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEZyb21XZWJDb3JlU3RyaW5nKHN0
cik7CisgICAgfQorCisgICAgLy8gRklYTUU6IFJlbmFtZSB2YWx1ZVRvU3RyaW5nV2l0aE51bGxD
aGVjayBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZS4KICAgICBpbmxpbmUgU3RyaW5nIHRvV2Vi
Q29yZVN0cmluZ1dpdGhOdWxsQ2hlY2sodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKQogICAg
IHsKICAgICAgICAgcmV0dXJuIHZhbHVlVG9TdHJpbmdXaXRoTnVsbENoZWNrKHZhbHVlKTsKZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4QWJzdHJhY3RFdmVudExpc3Rl
bmVyLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4QWJzdHJhY3RFdmVudExpc3Rl
bmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjdkNmIzCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhBYnN0cmFjdEV2ZW50
TGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3LCAyMDA4LCAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlY4QWJzdHJhY3RFdmVudExpc3RlbmVyLmgiCisKKyNpbmNs
dWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkV2ZW50LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIK
KyNpbmNsdWRlICJUb2tlbml6ZXIuaCIKKyNpbmNsdWRlICJWOEJpbmRpbmcuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcjo6VjhBYnN0cmFjdEV2ZW50
TGlzdGVuZXIoRnJhbWUqIGZyYW1lLCBib29sIGlzSW5saW5lKQorICAgIDogbV9pc0lubGluZShp
c0lubGluZSkKKyAgICAsIG1fZnJhbWUoZnJhbWUpCisgICAgLCBtX2xpbmVOdW1iZXIoMCkKKyAg
ICAsIG1fY29sdW1uTnVtYmVyKDApCit7CisgICAgaWYgKCFtX2ZyYW1lKQorICAgICAgICByZXR1
cm47CisKKyAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIGluIHRoZSBzb3VyY2UgaWYgYW55LgorICAg
IGlmIChtX2lzSW5saW5lICYmIG1fZnJhbWUtPmRvY3VtZW50KCktPnRva2VuaXplcigpKSB7Cisg
ICAgICAgIG1fbGluZU51bWJlciA9IG1fZnJhbWUtPmRvY3VtZW50KCktPnRva2VuaXplcigpLT5s
aW5lTnVtYmVyKCk7CisgICAgICAgIG1fY29sdW1uTnVtYmVyID0gbV9mcmFtZS0+ZG9jdW1lbnQo
KS0+dG9rZW5pemVyKCktPmNvbHVtbk51bWJlcigpOworICAgIH0KK30KKwordm9pZCBWOEFic3Ry
YWN0RXZlbnRMaXN0ZW5lcjo6aW52b2tlRXZlbnRIYW5kbGVyKHY4OjpIYW5kbGU8djg6OkNvbnRl
eHQ+IGNvbnRleHQsIEV2ZW50KiBldmVudCwgYm9vbCBpc1dpbmRvd0V2ZW50KQoreworICAgIC8v
IEVudGVyIHRoZSBWOCBjb250ZXh0IGluIHdoaWNoIHRvIHBlcmZvcm0gdGhlIGV2ZW50IGhhbmRs
aW5nLgorICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKworICAgIC8vIEdl
dCB0aGUgVjggd3JhcHBlciBmb3IgdGhlIGV2ZW50IG9iamVjdC4KKyAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4ganNFdmVudCA9IFY4UHJveHk6OkV2ZW50VG9WOE9iamVjdChldmVudCk7CisKKyAg
ICAvLyBGb3IgY29tcGF0aWJpbGl0eSwgd2Ugc3RvcmUgdGhlIGV2ZW50IG9iamVjdCBhcyBhIHBy
b3BlcnR5IG9uIHRoZSB3aW5kb3cgY2FsbGVkICJldmVudCIuICBCZWNhdXNlIHRoaXMgaXMgdGhl
IGdsb2JhbCBuYW1lc3BhY2UsIHdlIHNhdmUgYXdheSBhbnkKKyAgICAvLyBleGlzdGluZyAiZXZl
bnQiIHByb3BlcnR5LCBhbmQgdGhlbiByZXN0b3JlIGl0IGFmdGVyIGV4ZWN1dGluZyB0aGUgamF2
YXNjcmlwdCBoYW5kbGVyLgorICAgIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBldmVudFN5bWJvbCA9
IHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgiZXZlbnQiKTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVl
PiByZXR1cm5WYWx1ZTsKKworICAgIHsKKyAgICAgICAgLy8gQ2F0Y2ggZXhjZXB0aW9ucyB0aHJv
d24gaW4gdGhlIGV2ZW50IGhhbmRsZXIgc28gdGhleSBkbyBub3QgcHJvcGFnYXRlIHRvIGphdmFz
Y3JpcHQgY29kZSB0aGF0IGNhdXNlZCB0aGUgZXZlbnQgdG8gZmlyZS4KKyAgICAgICAgLy8gU2V0
dGluZyBhbmQgZ2V0dGluZyB0aGUgJ2V2ZW50JyBwcm9wZXJ0eSBvbiB0aGUgZ2xvYmFsIG9iamVj
dCBjYW4gdGhyb3cgZXhjZXB0aW9ucyBhcyB3ZWxsIChmb3IgaW5zdGFuY2UgaWYgYWNjZXNzb3Jz
IHRoYXQKKyAgICAgICAgLy8gdGhyb3cgZXhjZXB0aW9ucyBhcmUgZGVmaW5lZCBmb3IgJ2V2ZW50
JyB1c2luZyBfX2RlZmluZUdldHRlcl9fIGFuZCBfX2RlZmluZVNldHRlcl9fIG9uIHRoZSBnbG9i
YWwgb2JqZWN0KS4KKyAgICAgICAgdjg6OlRyeUNhdGNoIHRyeUNhdGNoOworICAgICAgICB0cnlD
YXRjaC5TZXRWZXJib3NlKHRydWUpOworCisgICAgICAgIC8vIFNhdmUgdGhlIG9sZCAnZXZlbnQn
IHByb3BlcnR5IHNvIHdlIGNhbiByZXN0b3JlIGl0IGxhdGVyLgorICAgICAgICB2ODo6TG9jYWw8
djg6OlZhbHVlPiBzYXZlZEV2ZW50ID0gY29udGV4dC0+R2xvYmFsKCktPkdldChldmVudFN5bWJv
bCk7CisgICAgICAgIHRyeUNhdGNoLlJlc2V0KCk7CisKKyAgICAgICAgLy8gTWFrZSB0aGUgZXZl
bnQgYXZhaWxhYmxlIGluIHRoZSB3aW5kb3cgb2JqZWN0LgorICAgICAgICAvLworICAgICAgICAv
LyBGSVhNRTogVGhpcyBkb2VzIG5vdCB3b3JrIGFzIGl0IGRvZXMgd2l0aCBqc2MgYmluZGluZ3Mg
aWYgdGhlIHdpbmRvdy5ldmVudCBwcm9wZXJ0eSBpcyBhbHJlYWR5IHNldC4gV2UgbmVlZCB0byBt
YWtlIHN1cmUgdGhhdCBwcm9wZXJ0eQorICAgICAgICAvLyBhY2Nlc3MgaXMgaW50ZXJjZXB0ZWQg
Y29ycmVjdGx5LgorICAgICAgICBjb250ZXh0LT5HbG9iYWwoKS0+U2V0KGV2ZW50U3ltYm9sLCBq
c0V2ZW50KTsKKyAgICAgICAgdHJ5Q2F0Y2guUmVzZXQoKTsKKworICAgICAgICAvLyBDYWxsIHRo
ZSBldmVudCBoYW5kbGVyLgorICAgICAgICByZXR1cm5WYWx1ZSA9IGNhbGxMaXN0ZW5lckZ1bmN0
aW9uKGpzRXZlbnQsIGV2ZW50LCBpc1dpbmRvd0V2ZW50KTsKKyAgICAgICAgdHJ5Q2F0Y2guUmVz
ZXQoKTsKKworICAgICAgICAvLyBSZXN0b3JlIHRoZSBvbGQgZXZlbnQuIFRoaXMgbXVzdCBiZSBk
b25lIGZvciBhbGwgZXhpdCBwYXRocyB0aHJvdWdoIHRoaXMgbWV0aG9kLgorICAgICAgICBpZiAo
c2F2ZWRFdmVudC5Jc0VtcHR5KCkpCisgICAgICAgICAgICBjb250ZXh0LT5HbG9iYWwoKS0+U2V0
KGV2ZW50U3ltYm9sLCB2ODo6VW5kZWZpbmVkKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICBjb250ZXh0LT5HbG9iYWwoKS0+U2V0KGV2ZW50U3ltYm9sLCBzYXZlZEV2ZW50KTsKKyAgICAg
ICAgdHJ5Q2F0Y2guUmVzZXQoKTsKKyAgICB9CisKKyAgICBBU1NFUlQoIVY4UHJveHk6OkhhbmRs
ZU91dE9mTWVtb3J5KCkgfHwgcmV0dXJuVmFsdWUuSXNFbXB0eSgpKTsKKworICAgIGlmIChyZXR1
cm5WYWx1ZS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICghcmV0dXJuVmFs
dWUtPklzTnVsbCgpICYmICFyZXR1cm5WYWx1ZS0+SXNVbmRlZmluZWQoKSAmJiBldmVudC0+c3Rv
cmVzUmVzdWx0QXNTdHJpbmcoKSkKKyAgICAgICAgZXZlbnQtPnN0b3JlUmVzdWx0KHRvV2ViQ29y
ZVN0cmluZyhyZXR1cm5WYWx1ZSkpOworCisgICAgLy8gUHJldmVudCBkZWZhdWx0IGFjdGlvbiBp
ZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGZhbHNlOworICAgIC8vIEZJWE1FOiBBZGQgZXhhbXBsZSwg
YW5kIHJlZmVyZW5jZSB0byBidWcgZW50cnkuCisgICAgaWYgKG1faXNJbmxpbmUgJiYgcmV0dXJu
VmFsdWUtPklzQm9vbGVhbigpICYmICFyZXR1cm5WYWx1ZS0+Qm9vbGVhblZhbHVlKCkpCisgICAg
ICAgIGV2ZW50LT5wcmV2ZW50RGVmYXVsdCgpOworfQorCit2b2lkIFY4QWJzdHJhY3RFdmVudExp
c3RlbmVyOjpoYW5kbGVFdmVudChFdmVudCogZXZlbnQsIGJvb2wgaXNXaW5kb3dFdmVudCkKK3sK
KyAgICAvLyBFdmVudExpc3RlbmVyIGNvdWxkIGJlIGRpc2Nvbm5lY3RlZCBmcm9tIHRoZSBmcmFt
ZS4KKyAgICBpZiAoZGlzY29ubmVjdGVkKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIFRo
ZSBjYWxsYmFjayBmdW5jdGlvbiBvbiBYTUxIdHRwUmVxdWVzdCBjYW4gY2xlYXIgdGhlIGV2ZW50
IGxpc3RlbmVyIGFuZCBkZXN0cm95cyAndGhpcycgb2JqZWN0LiBLZWVwIGEgbG9jYWwgcmVmZXJl
bmNlIHRvIGl0LgorICAgIC8vIFNlZSBpc3N1ZSA4ODk4MjkuCisgICAgUmVmUHRyPFY4QWJzdHJh
Y3RFdmVudExpc3RlbmVyPiBwcm90ZWN0KHRoaXMpOworCisgICAgdjg6OkhhbmRsZVNjb3BlIGhh
bmRsZVNjb3BlOworCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IFY4UHJv
eHk6OkdldENvbnRleHQobV9mcmFtZSk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICAvLyBtX2ZyYW1lIGNhbiByZW1vdmVkIGJ5IHRoZSBjYWxsYmFj
ayBmdW5jdGlvbiwgcHJvdGVjdCBpdCB1bnRpbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJu
cy4KKyAgICBSZWZQdHI8RnJhbWU+IHByb3RlY3RGcmFtZShtX2ZyYW1lKTsKKworICAgIGludm9r
ZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudCwgaXNXaW5kb3dFdmVudCk7CisKKyAgICBEb2N1
bWVudDo6dXBkYXRlRG9jdW1lbnRzUmVuZGVyaW5nKCk7Cit9CisKK3ZvaWQgVjhBYnN0cmFjdEV2
ZW50TGlzdGVuZXI6OmRpc3Bvc2VMaXN0ZW5lck9iamVjdCgpCit7CisgICAgaWYgKCFtX2xpc3Rl
bmVyLklzRW1wdHkoKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgVjhQcm94eTo6VW5yZWdp
c3Rlckdsb2JhbEhhbmRsZSh0aGlzLCBtX2xpc3RlbmVyKTsKKyNlbmRpZgorICAgICAgICBtX2xp
c3RlbmVyLkRpc3Bvc2UoKTsKKyAgICAgICAgbV9saXN0ZW5lci5DbGVhcigpOworICAgIH0KK30K
Kwordjg6OkxvY2FsPHY4OjpPYmplY3Q+IFY4QWJzdHJhY3RFdmVudExpc3RlbmVyOjpnZXRSZWNl
aXZlck9iamVjdChFdmVudCogZXZlbnQsIGJvb2wgaXNXaW5kb3dFdmVudCkKK3sKKyAgICBpZiAo
IW1fbGlzdGVuZXIuSXNFbXB0eSgpICYmICFtX2xpc3RlbmVyLT5Jc0Z1bmN0aW9uKCkpCisgICAg
ICAgIHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyhtX2xpc3RlbmVyKTsKKworICAg
IGlmIChpc1dpbmRvd0V2ZW50KQorICAgICAgICByZXR1cm4gdjg6OkNvbnRleHQ6OkdldEN1cnJl
bnQoKS0+R2xvYmFsKCk7CisKKyAgICBFdmVudFRhcmdldCogdGFyZ2V0ID0gZXZlbnQtPmN1cnJl
bnRUYXJnZXQoKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUgPSBWOFByb3h5OjpF
dmVudFRhcmdldFRvVjhPYmplY3QodGFyZ2V0KTsKKyAgICBpZiAodmFsdWUuSXNFbXB0eSgpKQor
ICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+KCk7CisgICAgcmV0dXJuIHY4OjpM
b2NhbDx2ODo6T2JqZWN0Pjo6TmV3KHY4OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3QodmFsdWUp
KTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5k
aW5ncy92OC9jdXN0b20vVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIuaCBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvY3VzdG9tL1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uMmEzYjdlNwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4QWJzdHJhY3RFdmVudExpc3RlbmVyLmgKQEAgLTAsMCArMSw5OCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXJfaAorI2Rl
ZmluZSBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcl9oCisKKyNpbmNsdWRlICJFdmVudExpc3RlbmVy
LmgiCisjaW5jbHVkZSA8djguaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3Mg
RXZlbnQ7CisgICAgY2xhc3MgRnJhbWU7CisKKyAgICAvLyBUaGVyZSBhcmUgdHdvIGtpbmRzIG9m
IGV2ZW50IGxpc3RlbmVyczogSFRNTCBvciBub24tSE1UTC4gb25sb2FkLCBvbmZvY3VzLCBldGMg
KGF0dHJpYnV0ZXMpIGFyZSBhbHdheXMgSFRNTCBldmVudCBoYW5kbGVyIHR5cGU7CisgICAgLy8g
RXZlbnQgbGlzdGVuZXJzIGFkZGVkIGJ5IFdpbmRvdy5hZGRFdmVudExpc3RlbmVyIG9yIEV2ZW50
VGFyZ2V0Tm9kZTo6YWRkRXZlbnRMaXN0ZW5lciBhcmUgbm9uLUhUTUwgdHlwZS4KKyAgICAvLwor
ICAgIC8vIFdoeSBkb2VzIHRoaXMgbWF0dGVyPworICAgIC8vIFdlYktpdCBkb2VzIG5vdCBhbGxv
dyBkdXBsaWNhdGVkIEhUTUwgZXZlbnQgaGFuZGxlcnMgb2YgdGhlIHNhbWUgdHlwZSwgYnV0IEFM
TE9XcyBkdXBsaWNhdGVkIG5vbi1IVE1MIGV2ZW50IGhhbmRsZXJzLgorICAgIGNsYXNzIFY4QWJz
dHJhY3RFdmVudExpc3RlbmVyIDogcHVibGljIEV2ZW50TGlzdGVuZXIgeworICAgIHB1YmxpYzoK
KyAgICAgICAgdmlydHVhbCB+VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIoKSB7IH0KKworICAgICAg
ICAvLyBSZXR1cm5zIHRoZSBvd25lciBmcmFtZSBvZiB0aGUgbGlzdGVuZXIuCisgICAgICAgIEZy
YW1lKiBmcmFtZSgpIHsgcmV0dXJuIG1fZnJhbWU7IH0KKworICAgICAgICB2aXJ0dWFsIHZvaWQg
aGFuZGxlRXZlbnQoRXZlbnQqLCBib29sIGlzV2luZG93RXZlbnQpOworICAgICAgICB2b2lkIGlu
dm9rZUV2ZW50SGFuZGxlcih2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiwgRXZlbnQqLCBib29sIGlz
V2luZG93RXZlbnQpOworCisgICAgICAgIC8vIFJldHVybnMgdGhlIGxpc3RlbmVyIG9iamVjdCwg
ZWl0aGVyIGEgZnVuY3Rpb24gb3IgYW4gb2JqZWN0LgorICAgICAgICB2aXJ0dWFsIHY4OjpMb2Nh
bDx2ODo6T2JqZWN0PiBnZXRMaXN0ZW5lck9iamVjdCgpCisgICAgICAgIHsKKyAgICAgICAgICAg
IHJldHVybiB2ODo6TG9jYWw8djg6Ok9iamVjdD46Ok5ldyhtX2xpc3RlbmVyKTsKKyAgICAgICAg
fQorCisgICAgICAgIC8vIERpc3Bvc2UgbGlzdGVuZXIgb2JqZWN0IGFuZCBjbGVhciB0aGUgaGFu
ZGxlLgorICAgICAgICB2b2lkIGRpc3Bvc2VMaXN0ZW5lck9iamVjdCgpOworCisgICAgICAgIHZp
cnR1YWwgYm9vbCBkaXNjb25uZWN0ZWQoKSBjb25zdCB7IHJldHVybiAhbV9mcmFtZTsgfQorCisg
ICAgcHJvdGVjdGVkOgorICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiBtX2xpc3Rl
bmVyOworCisgICAgICAgIC8vIEluZGljYXRlcyBpZiB0aGlzIGlzIGFuIEhUTUwgdHlwZSBsaXN0
ZW5lci4KKyAgICAgICAgYm9vbCBtX2lzSW5saW5lOworCisgICAgcHJpdmF0ZToKKyAgICAgICAg
VjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIoRnJhbWUqLCBib29sIGlzSW5saW5lKTsKKworICAgICAg
ICB2aXJ0dWFsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGNhbGxMaXN0ZW5lckZ1bmN0aW9uKHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBqc2V2ZW50LCBFdmVudCosIGJvb2wgaXNXaW5kb3dFdmVudCkgPSAw
OworCisgICAgICAgIC8vIEdldCB0aGUgcmVjZWl2ZXIgb2JqZWN0IHRvIHVzZSBmb3IgZXZlbnQg
bGlzdGVuZXIgY2FsbC4KKyAgICAgICAgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGdldFJlY2VpdmVy
T2JqZWN0KEV2ZW50KiwgYm9vbCBpc1dpbmRvd0V2ZW50KTsKKworICAgICAgICAvLyBGcmFtZSB0
byB3aGljaCB0aGUgZXZlbnQgbGlzdGVuZXIgaXMgYXR0YWNoZWQgdG8uIEFuIGV2ZW50IGxpc3Rl
bmVyIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSBpdHMgb3duZXIgZnJhbWUgaXMKKyAgICAgICAg
Ly8gZGVsZXRlZC4gU2VlIGZhc3QvZG9tL3JlcGxhY2VDaGlsZC5odG1sCisgICAgICAgIC8vIEZJ
WE1FOiB0aGlzIGNvdWxkIGhvbGQgbV9mcmFtZSBsaXZlIHVudGlsIHRoZSBldmVudCBsaXN0ZW5l
ciBpcyBkZWxldGVkLgorICAgICAgICBGcmFtZSogbV9mcmFtZTsKKworICAgICAgICAvLyBQb3Np
dGlvbiBpbiB0aGUgSFRNTCBzb3VyY2UgZm9yIEhUTUwgZXZlbnQgbGlzdGVuZXJzLgorICAgICAg
ICBpbnQgbV9saW5lTnVtYmVyOworICAgICAgICBpbnQgbV9jb2x1bW5OdW1iZXI7CisKKyAgICAg
ICAgZnJpZW5kIGNsYXNzIFY4RXZlbnRMaXN0ZW5lcjsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFY4
T2JqZWN0RXZlbnRMaXN0ZW5lcjsKKyAgICAgICAgZnJpZW5kIGNsYXNzIFY4TGF6eUV2ZW50TGlz
dGVuZXI7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVjhB
YnN0cmFjdEV2ZW50TGlzdGVuZXJfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9j
dXN0b20vVjhBdHRyQ3VzdG9tLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4QXR0
ckN1c3RvbS5jcHAKaW5kZXggMTg0YzVkOS4uZjM0YTQ0MSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9i
aW5kaW5ncy92OC9jdXN0b20vVjhBdHRyQ3VzdG9tLmNwcAorKysgYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOEF0dHJDdXN0b20uY3BwCkBAIC0xNiw4ICsxNiw4IEBACiAgKiB0aGlzIHNv
ZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogICoKICAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBD
T05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIGlmcmFtZUxJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgaWZyYW1lTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqICJBUyBJ
UyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IKICAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCiAgKiBPV05FUiBPUiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICAq
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9t
RXZlbnRMaXN0ZW5lci5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbUV2
ZW50TGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Yzgz
MjgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3Rv
bUV2ZW50TGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICog
ZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBu
b3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0
aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9S
UworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVS
IE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAq
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVjhDdXN0b21FdmVudExpc3RlbmVyLmgiCisKKyNp
bmNsdWRlICJWOFByb3h5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworVjhFdmVudExpc3Rl
bmVyOjpWOEV2ZW50TGlzdGVuZXIoRnJhbWUqIGZyYW1lLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4g
bGlzdGVuZXIsIGJvb2wgaXNJbmxpbmUpCisgICAgOiBWOEFic3RyYWN0RXZlbnRMaXN0ZW5lcihm
cmFtZSwgaXNJbmxpbmUpCit7CisgICAgbV9saXN0ZW5lciA9IHY4OjpQZXJzaXN0ZW50PHY4OjpP
YmplY3Q+OjpOZXcobGlzdGVuZXIpOworI2lmbmRlZiBOREVCVUcKKyAgICBWOFByb3h5OjpSZWdp
c3Rlckdsb2JhbEhhbmRsZShFVkVOVF9MSVNURU5FUiwgdGhpcywgbV9saXN0ZW5lcik7CisjZW5k
aWYKK30KKworVjhFdmVudExpc3RlbmVyOjp+VjhFdmVudExpc3RlbmVyKCkKK3sKKyAgICBpZiAo
bV9mcmFtZSkgeworICAgICAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1f
ZnJhbWUpOworICAgICAgICBpZiAocHJveHkpCisgICAgICAgICAgICBwcm94eS0+UmVtb3ZlVjhF
dmVudExpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIGRpc3Bvc2VMaXN0ZW5lck9iamVjdCgp
OworfQorCit2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBWOEV2ZW50TGlzdGVuZXI6OmdldExpc3Rl
bmVyRnVuY3Rpb24oKQoreworICAgIC8vIEhhcyB0aGUgbGlzdGVuZXIgYmVlbiBkaXNwb3NlZD8K
KyAgICBpZiAobV9saXN0ZW5lci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8
djg6OkZ1bmN0aW9uPigpOworCisgICAgaWYgKG1fbGlzdGVuZXItPklzRnVuY3Rpb24oKSkKKyAg
ICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpOZXcodjg6OlBlcnNpc3RlbnQ8
djg6OkZ1bmN0aW9uPjo6Q2FzdChtX2xpc3RlbmVyKSk7CisKKyAgICBpZiAobV9saXN0ZW5lci0+
SXNPYmplY3QoKSkgeworICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBwcm9wZXJ0eSA9IG1f
bGlzdGVuZXItPkdldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woImhhbmRsZUV2ZW50IikpOworICAg
ICAgICBpZiAocHJvcGVydHktPklzRnVuY3Rpb24oKSkKKyAgICAgICAgICAgIHJldHVybiB2ODo6
TG9jYWw8djg6OkZ1bmN0aW9uPjo6Q2FzdChwcm9wZXJ0eSk7CisgICAgfQorCisgICAgcmV0dXJu
IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+KCk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4
RXZlbnRMaXN0ZW5lcjo6Y2FsbExpc3RlbmVyRnVuY3Rpb24odjg6OkhhbmRsZTx2ODo6VmFsdWU+
IGpzRXZlbnQsIEV2ZW50KiBldmVudCwgYm9vbCBpc1dpbmRvd0V2ZW50KQoreworICAgIHY4OjpM
b2NhbDx2ODo6RnVuY3Rpb24+IGhhbmRsZXJGdW5jdGlvbiA9IGdldExpc3RlbmVyRnVuY3Rpb24o
KTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcmVjZWl2ZXIgPSBnZXRSZWNlaXZlck9iamVj
dChldmVudCwgaXNXaW5kb3dFdmVudCk7CisgICAgaWYgKGhhbmRsZXJGdW5jdGlvbi5Jc0VtcHR5
KCkgfHwgcmVjZWl2ZXIuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpW
YWx1ZT4oKTsKKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBwYXJhbWV0ZXJzWzFdID0geyBq
c0V2ZW50IH07CisKKyAgICBWOFByb3h5KiBwcm94eSA9IFY4UHJveHk6OnJldHJpZXZlKG1fZnJh
bWUpOworICAgIHJldHVybiBwcm94eS0+Q2FsbEZ1bmN0aW9uKGhhbmRsZXJGdW5jdGlvbiwgcmVj
ZWl2ZXIsIDEsIHBhcmFtZXRlcnMpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYg
LS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOEN1c3RvbUV2ZW50TGlzdGVuZXIu
aCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4Q3VzdG9tRXZlbnRMaXN0ZW5lci5oCmlu
ZGV4IDljMDE4ZDIuLjFlNjEzZDAgMTAwNjQ0Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4Q3VzdG9tRXZlbnRMaXN0ZW5lci5oCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4Q3VzdG9tRXZlbnRMaXN0ZW5lci5oCkBAIC0xLDEwICsxLDEwIEBACiAvKgotICogQ29w
eXJpZ2h0IChDKSAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiAKKyAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogICogbWV0
OgotICogCisgKgogICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAqICAgICAqIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKQEAgLTE0LDcgKzE0
LDcgQEAKICAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKICAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCiAgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICogCisgKgogICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwog
ICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QKICAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgpAQCAtMzEsOCArMzEsMzggQEAKICNpZm5kZWYg
VjhDdXN0b21FdmVudExpc3RlbmVyX2gKICNkZWZpbmUgVjhDdXN0b21FdmVudExpc3RlbmVyX2gK
IAotLy8gRklYTUU6IFRoaXMgaXMgYSB0ZW1wb3JhcnkgZm9yd2FyZGluZyBoZWFkZXIgdW50aWwg
YWxsIGJpbmRpbmdzIGhhdmUgbWlncmF0ZWQKLS8vIG92ZXIgYW5kIHY4X2V2ZW50cyBhY3R1YWxs
eSBiZWNvbWVzIFY4Q3VzdG9tRXZlbnRMaXN0ZW5lci4KLSNpbmNsdWRlICJ2OF9ldmVudHMuaCIK
KyNpbmNsdWRlICJWOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5oIgorI2luY2x1ZGUgPHY4Lmg+Cisj
aW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAg
Y2xhc3MgRXZlbnQ7CisgICAgY2xhc3MgRnJhbWU7CisKKyAgICAvLyBWOEV2ZW50TGlzdGVuZXIg
aXMgYSB3cmFwcGVyIG9mIGEgSlMgb2JqZWN0IGltcGxlbWVudHMgRXZlbnRMaXN0ZW5lciBpbnRl
cmZhY2UgKGhhcyBoYW5kbGVFdmVudChldmVudCkgbWV0aG9kKSwgb3IgYSBKUyBmdW5jdGlvbgor
ICAgIC8vIHRoYXQgY2FuIGhhbmRsZSB0aGUgZXZlbnQuCisgICAgY2xhc3MgVjhFdmVudExpc3Rl
bmVyIDogcHVibGljIFY4QWJzdHJhY3RFdmVudExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAg
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFY4RXZlbnRMaXN0ZW5lcj4gY3JlYXRlKEZyYW1lKiBmcmFt
ZSwgdjg6OkxvY2FsPHY4OjpPYmplY3Q+IGxpc3RlbmVyLCBib29sIGlzSW5saW5lKQorICAgICAg
ICB7CisgICAgICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3IFY4RXZlbnRMaXN0ZW5lcihmcmFt
ZSwgbGlzdGVuZXIsIGlzSW5saW5lKSk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGJv
b2wgaXNJbmxpbmUoKSBjb25zdCB7IHJldHVybiBtX2lzSW5saW5lOyB9CisKKyAgICAgICAgLy8g
RGV0YWNoIHRoZSBsaXN0ZW5lciBmcm9tIGl0cyBvd25lciBmcmFtZS4KKyAgICAgICAgdm9pZCBk
aXNjb25uZWN0RnJhbWUoKSB7IG1fZnJhbWUgPSAwOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAg
ICAgIFY4RXZlbnRMaXN0ZW5lcihGcmFtZSosIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBsaXN0ZW5l
ciwgYm9vbCBpc0lubGluZSk7CisgICAgICAgIHZpcnR1YWwgflY4RXZlbnRMaXN0ZW5lcigpOwor
ICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBnZXRMaXN0ZW5lckZ1bmN0aW9uKCk7CisK
KyAgICBwcml2YXRlOgorICAgICAgICB2aXJ0dWFsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IGNhbGxM
aXN0ZW5lckZ1bmN0aW9uKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50LCBFdmVudCosIGJv
b2wgaXNXaW5kb3dFdmVudCk7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAj
ZW5kaWYgLy8gVjhDdXN0b21FdmVudExpc3RlbmVyX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvY3VzdG9tL1Y4RWxlbWVudEN1c3RvbS5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4
L2N1c3RvbS9WOEVsZW1lbnRDdXN0b20uY3BwCmluZGV4IGIxOTM2MTAuLjk2MjUxMDcgMTAwNjQ0
Ci0tLSBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4RWxlbWVudEN1c3RvbS5jcHAKKysr
IGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhFbGVtZW50Q3VzdG9tLmNwcApAQCAtMzQs
NiArMzQsNyBAQAogI2luY2x1ZGUgIkF0dHIuaCIKICNpbmNsdWRlICJDU1NIZWxwZXIuaCIKICNp
bmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkV2ZW50TGlzdGVuZXIuaCIKICNpbmNsdWRl
ICJFeGNlcHRpb25Db2RlLmgiCiAjaW5jbHVkZSAiSFRNTEZyYW1lRWxlbWVudEJhc2UuaCIKICNp
bmNsdWRlICJIVE1MTmFtZXMuaCIKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvY3Vz
dG9tL1Y4TGF6eUV2ZW50TGlzdGVuZXIuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhMYXp5RXZlbnRMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uY2RmZTlkZgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4TGF6eUV2ZW50TGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgor
ICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGlu
IHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xl
IEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0
byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05U
UklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisg
KiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlY4TGF6eUV2ZW50TGlzdGVuZXIuaCIK
KworI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiVjhCaW5kaW5nLmgiCisjaW5jbHVkZSAi
VjhQcm94eS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Y4TGF6eUV2ZW50TGlzdGVuZXI6
OlY4TGF6eUV2ZW50TGlzdGVuZXIoRnJhbWUgKmZyYW1lLCBjb25zdCBTdHJpbmcmIGNvZGUsIGNv
bnN0IFN0cmluZyYgZnVuY3Rpb25OYW1lKQorICAgIDogVjhBYnN0cmFjdEV2ZW50TGlzdGVuZXIo
ZnJhbWUsIHRydWUpCisgICAgLCBtX2NvZGUoY29kZSkKKyAgICAsIG1fZnVuY3Rpb25OYW1lKGZ1
bmN0aW9uTmFtZSkKKyAgICAsIG1fY29tcGlsZWQoZmFsc2UpCisgICAgLCBtX3dyYXBwZWRGdW5j
dGlvbkNvbXBpbGVkKGZhbHNlKQoreworfQorCitWOExhenlFdmVudExpc3RlbmVyOjp+VjhMYXp5
RXZlbnRMaXN0ZW5lcigpCit7CisgICAgZGlzcG9zZUxpc3RlbmVyT2JqZWN0KCk7CisKKyAgICAv
LyBEaXNwb3NlIHdyYXBwZWQgZnVuY3Rpb24KKyAgICBpZiAoIW1fd3JhcHBlZEZ1bmN0aW9uLklz
RW1wdHkoKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgICAgVjhQcm94eTo6VW5yZWdpc3Rlckds
b2JhbEhhbmRsZSh0aGlzLCBtX3dyYXBwZWRGdW5jdGlvbik7CisjZW5kaWYKKyAgICAgICAgbV93
cmFwcGVkRnVuY3Rpb24uRGlzcG9zZSgpOworICAgICAgICBtX3dyYXBwZWRGdW5jdGlvbi5DbGVh
cigpOworICAgIH0KK30KKwordjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4gVjhMYXp5RXZlbnRMaXN0
ZW5lcjo6Z2V0TGlzdGVuZXJGdW5jdGlvbigpCit7CisgICAgaWYgKG1fY29tcGlsZWQpIHsKKyAg
ICAgICAgQVNTRVJUKG1fbGlzdGVuZXIuSXNFbXB0eSgpIHx8IG1fbGlzdGVuZXItPklzRnVuY3Rp
b24oKSk7CisgICAgICAgIHJldHVybiBtX2xpc3RlbmVyLklzRW1wdHkoKSA/IHY4OjpMb2NhbDx2
ODo6RnVuY3Rpb24+KCkgOiB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6TmV3KHY4OjpQZXJzaXN0
ZW50PHY4OjpGdW5jdGlvbj46OkNhc3QobV9saXN0ZW5lcikpOworICAgIH0KKworICAgIG1fY29t
cGlsZWQgPSB0cnVlOworCisgICAgQVNTRVJUKG1fZnJhbWUpOworCisgICAgeworICAgICAgICAv
LyBTd2l0Y2ggdG8gdGhlIGNvbnRleHQgb2YgbV9mcmFtZS4KKyAgICAgICAgdjg6OkhhbmRsZVNj
b3BlIGhhbmRsZVNjb3BlOworCisgICAgICAgIC8vIFVzZSB0aGUgb3V0ZXIgc2NvcGUgdG8gaG9s
ZCBjb250ZXh0LgorICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gVjhQ
cm94eTo6R2V0Q29udGV4dChtX2ZyYW1lKTsKKyAgICAgICAgLy8gQmFpbCBvdXQgaWYgd2UgY291
bGQgbm90IGdldCB0aGUgY29udGV4dC4KKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQor
ICAgICAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+KCk7CisKKyAgICAgICAg
djg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgICAgIC8vIFdyYXAgZnVu
Y3Rpb24gYXJvdW5kIHRoZSBldmVudCBjb2RlLiAgVGhlIHBhcmVudGhlc2lzIGFyb3VuZCB0aGUg
ZnVuY3Rpb24gYXJlIG5lZWRlZCBzbyB0aGF0IGV2YWx1YXRpbmcgdGhlIGNvZGUgeWllbGRzCisg
ICAgICAgIC8vIHRoZSBmdW5jdGlvbiB2YWx1ZS4gIFdpdGhvdXQgdGhlIHBhcmVudGhlc2lzIHRo
ZSBmdW5jdGlvbiB2YWx1ZSBpcyB0aHJvd24gYXdheS4KKworICAgICAgICAvLyBNYWtlIGl0IGFu
IGFub255bW91cyBmdW5jdGlvbiB0byBhdm9pZCBuYW1lIGNvbmZsaWN0IGZvciBjYXNlcyBsaWtl
CisgICAgICAgIC8vIDxib2R5IG9ubG9hZD0nb25sb2FkKCknPgorICAgICAgICAvLyA8c2NyaXB0
PiBmdW5jdGlvbiBvbmxvYWQoKSB7IGFsZXJ0KCdoaScpOyB9IDwvc2NyaXB0Pi4KKyAgICAgICAg
Ly8gU2V0IGZ1bmN0aW9uIG5hbWUgdG8gZnVuY3Rpb24gb2JqZWN0IGluc3RlYWQuCisgICAgICAg
IC8vIFNlZSBpc3N1ZSA5NDQ2OTAuCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZSBFQ01BU2Ny
aXB0IHNwZWMgc2F5cyAodmVyeSBvYmxpcXVlbHkpIHRoYXQgdGhlIHBhcmFtZXRlciB0byBhbiBl
dmVudCBoYW5kbGVyIGlzIG5hbWVkICJldnQiLgorICAgICAgICBTdHJpbmcgY29kZSA9ICIoZnVu
Y3Rpb24gKGV2dCkge1xuIjsKKyAgICAgICAgY29kZS5hcHBlbmQobV9jb2RlKTsKKyAgICAgICAg
Y29kZS5hcHBlbmQoIn0pIik7CisKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBjb2Rl
RXh0ZXJuYWxTdHJpbmcgPSB2OEV4dGVybmFsU3RyaW5nKGNvZGUpOworICAgICAgICB2ODo6SGFu
ZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IFY4UHJveHk6OkNvbXBpbGVTY3JpcHQoY29kZUV4dGVy
bmFsU3RyaW5nLCBtX2ZyYW1lLT5kb2N1bWVudCgpLT51cmwoKSwgbV9saW5lTnVtYmVyIC0gMSk7
CisgICAgICAgIGlmICghc2NyaXB0LklzRW1wdHkoKSkgeworICAgICAgICAgICAgVjhQcm94eSog
cHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShtX2ZyYW1lKTsKKyAgICAgICAgICAgIEFTU0VSVChw
cm94eSk7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSA9IHByb3h5LT5S
dW5TY3JpcHQoc2NyaXB0LCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoIXZhbHVlLklzRW1wdHko
KSkgeworICAgICAgICAgICAgICAgIEFTU0VSVCh2YWx1ZS0+SXNGdW5jdGlvbigpKTsKKyAgICAg
ICAgICAgICAgICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBsaXN0ZW5lckZ1bmN0aW9uID0gdjg6
OkxvY2FsPHY4OjpGdW5jdGlvbj46OkNhc3QodmFsdWUpOworICAgICAgICAgICAgICAgIGxpc3Rl
bmVyRnVuY3Rpb24tPlNldE5hbWUodjg6OlN0cmluZzo6TmV3KEZyb21XZWJDb3JlU3RyaW5nKG1f
ZnVuY3Rpb25OYW1lKSwgbV9mdW5jdGlvbk5hbWUubGVuZ3RoKCkpKTsKKworICAgICAgICAgICAg
ICAgIG1fbGlzdGVuZXIgPSB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+OjpOZXcobGlzdGVu
ZXJGdW5jdGlvbik7CisjaWZuZGVmIE5ERUJVRworICAgICAgICAgICAgICAgIFY4UHJveHk6OlJl
Z2lzdGVyR2xvYmFsSGFuZGxlKEVWRU5UX0xJU1RFTkVSLCB0aGlzLCBtX2xpc3RlbmVyKTsKKyNl
bmRpZgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQVNTRVJUKG1fbGlz
dGVuZXIuSXNFbXB0eSgpIHx8IG1fbGlzdGVuZXItPklzRnVuY3Rpb24oKSk7CisgICAgcmV0dXJu
IG1fbGlzdGVuZXIuSXNFbXB0eSgpID8gdjg6OkxvY2FsPHY4OjpGdW5jdGlvbj4oKSA6IHY4OjpM
b2NhbDx2ODo6RnVuY3Rpb24+OjpOZXcodjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6Q2Fz
dChtX2xpc3RlbmVyKSk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6VmFsdWU+IFY4TGF6eUV2ZW50TGlz
dGVuZXI6OmNhbGxMaXN0ZW5lckZ1bmN0aW9uKHY4OjpIYW5kbGU8djg6OlZhbHVlPiBqc0V2ZW50
LCBFdmVudCogZXZlbnQsIGJvb2wgaXNXaW5kb3dFdmVudCkKK3sKKyAgICB2ODo6TG9jYWw8djg6
OkZ1bmN0aW9uPiBoYW5kbGVyRnVuY3Rpb24gPSBnZXRXcmFwcGVkTGlzdGVuZXJGdW5jdGlvbigp
OworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiByZWNlaXZlciA9IGdldFJlY2VpdmVyT2JqZWN0
KGV2ZW50LCBpc1dpbmRvd0V2ZW50KTsKKyAgICBpZiAoaGFuZGxlckZ1bmN0aW9uLklzRW1wdHko
KSB8fCByZWNlaXZlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiB2ODo6TG9jYWw8djg6OlZh
bHVlPigpOworCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBhcmFtZXRlcnNbMV0gPSB7IGpz
RXZlbnQgfTsKKworICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6cmV0cmlldmUobV9mcmFt
ZSk7CisgICAgcmV0dXJuIHByb3h5LT5DYWxsRnVuY3Rpb24oaGFuZGxlckZ1bmN0aW9uLCByZWNl
aXZlciwgMSwgcGFyYW1ldGVycyk7Cit9CisKK3Y4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IFY4TGF6
eUV2ZW50TGlzdGVuZXI6OmdldFdyYXBwZWRMaXN0ZW5lckZ1bmN0aW9uKCkKK3sKKyAgICBpZiAo
bV93cmFwcGVkRnVuY3Rpb25Db21waWxlZCkgeworICAgICAgICBBU1NFUlQobV93cmFwcGVkRnVu
Y3Rpb24uSXNFbXB0eSgpIHx8IG1fd3JhcHBlZEZ1bmN0aW9uLT5Jc0Z1bmN0aW9uKCkpOworICAg
ICAgICByZXR1cm4gbV93cmFwcGVkRnVuY3Rpb24uSXNFbXB0eSgpID8gdjg6OkxvY2FsPHY4OjpG
dW5jdGlvbj4oKSA6IHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+OjpOZXcobV93cmFwcGVkRnVuY3Rp
b24pOworICAgIH0KKworICAgIG1fd3JhcHBlZEZ1bmN0aW9uQ29tcGlsZWQgPSB0cnVlOworCisg
ICAgeworICAgICAgICAvLyBTd2l0Y2ggdG8gdGhlIGNvbnRleHQgb2YgbV9mcmFtZS4KKyAgICAg
ICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworCisgICAgICAgIC8vIFVzZSB0aGUgb3V0
ZXIgc2NvcGUgdG8gaG9sZCBjb250ZXh0LgorICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0
PiBjb250ZXh0ID0gVjhQcm94eTo6R2V0Q29udGV4dChtX2ZyYW1lKTsKKyAgICAgICAgLy8gQmFp
bCBvdXQgaWYgd2UgY2Fubm90IGdldCB0aGUgY29udGV4dC4KKyAgICAgICAgaWYgKGNvbnRleHQu
SXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+KCk7
CisKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgICAg
IC8vIEZJWE1FOiBjYWNoZSB0aGUgd3JhcHBlciBmdW5jdGlvbi4KKyAgICAgICAgU3RyaW5nIGNv
ZGUgPSAiKGZ1bmN0aW9uIChldnQpIHtcbiI7CisKKyAgICAgICAgLy8gTm9kZXMgb3RoZXIgdGhh
biB0aGUgZG9jdW1lbnQgb2JqZWN0LCB3aGVuIGV4ZWN1dGluZyBpbmxpbmUgZXZlbnQgaGFuZGxl
cnMgcHVzaCBkb2N1bWVudCwgZm9ybSwgYW5kIHRoZSB0YXJnZXQgbm9kZSBvbiB0aGUgc2NvcGUg
Y2hhaW4uCisgICAgICAgIC8vIFdlIGRvIHRoaXMgYnkgdXNpbmcgJ3dpdGgnIHN0YXRlbWVudC4K
KyAgICAgICAgLy8gU2VlIGNocm9tZS9mYXN0L2Zvcm1zL2Zvcm0tYWN0aW9uLmh0bWwKKyAgICAg
ICAgLy8gICAgIGNocm9tZS9mYXN0L2Zvcm1zL3NlbGVjdGVkLWluZGV4LXZhbHVlLmh0bWwKKyAg
ICAgICAgLy8gICAgIGJhc2UvZmFzdC9vdmVyZmxvdy9vbnNjcm9sbC1sYXllci1zZWxmLWRlc3Ry
dWN0Lmh0bWwKKyAgICAgICAgY29kZS5hcHBlbmQoIiAgd2l0aCAodGhpcy5vd25lckRvY3VtZW50
ID8gdGhpcy5vd25lckRvY3VtZW50IDoge30pIHtcbiIpOworICAgICAgICBjb2RlLmFwcGVuZCgi
ICAgIHdpdGggKHRoaXMuZm9ybSA/IHRoaXMuZm9ybSA6IHt9KSB7XG4iKTsKKyAgICAgICAgY29k
ZS5hcHBlbmQoIiAgICAgIHdpdGggKHRoaXMpIHtcbiIpOworICAgICAgICBjb2RlLmFwcGVuZCgi
ICAgICAgICByZXR1cm4gKGZ1bmN0aW9uKGV2dCl7Iik7CisgICAgICAgIGNvZGUuYXBwZW5kKG1f
Y29kZSk7CisgICAgICAgIGNvZGUuYXBwZW5kKCJ9KS5jYWxsKHRoaXMsIGV2dCk7XG4iKTsKKyAg
ICAgICAgY29kZS5hcHBlbmQoIiAgICAgIH1cbiIpOworICAgICAgICBjb2RlLmFwcGVuZCgiICAg
IH1cbiIpOworICAgICAgICBjb2RlLmFwcGVuZCgiICB9XG4iKTsKKyAgICAgICAgY29kZS5hcHBl
bmQoIn0pIik7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gY29kZUV4dGVybmFsU3Ry
aW5nID0gdjhFeHRlcm5hbFN0cmluZyhjb2RlKTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6U2Ny
aXB0PiBzY3JpcHQgPSBWOFByb3h5OjpDb21waWxlU2NyaXB0KGNvZGVFeHRlcm5hbFN0cmluZywg
bV9mcmFtZS0+ZG9jdW1lbnQoKS0+dXJsKCksIG1fbGluZU51bWJlciAtIDQpOworICAgICAgICBp
ZiAoIXNjcmlwdC5Jc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFY4UHJveHkqIHByb3h5ID0gVjhQ
cm94eTo6cmV0cmlldmUobV9mcmFtZSk7CisgICAgICAgICAgICBBU1NFUlQocHJveHkpOworICAg
ICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUgPSBwcm94eS0+UnVuU2NyaXB0KHNj
cmlwdCwgZmFsc2UpOworICAgICAgICAgICAgaWYgKCF2YWx1ZS5Jc0VtcHR5KCkpIHsKKyAgICAg
ICAgICAgICAgICBBU1NFUlQodmFsdWUtPklzRnVuY3Rpb24oKSk7CisKKyAgICAgICAgICAgICAg
ICBtX3dyYXBwZWRGdW5jdGlvbiA9IHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvbj46Ok5ldyh2
ODo6TG9jYWw8djg6OkZ1bmN0aW9uPjo6Q2FzdCh2YWx1ZSkpOworI2lmbmRlZiBOREVCVUcKKyAg
ICAgICAgICAgICAgICBWOFByb3h5OjpSZWdpc3Rlckdsb2JhbEhhbmRsZShFVkVOVF9MSVNURU5F
UiwgdGhpcywgbV93cmFwcGVkRnVuY3Rpb24pOworI2VuZGlmCisgICAgICAgICAgICAgICAgbV93
cmFwcGVkRnVuY3Rpb24tPlNldE5hbWUodjg6OlN0cmluZzo6TmV3KGZyb21XZWJDb3JlU3RyaW5n
KG1fZnVuY3Rpb25OYW1lKSwgbV9mdW5jdGlvbk5hbWUubGVuZ3RoKCkpKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB2ODo6TG9jYWw8djg6OkZ1bmN0aW9u
Pjo6TmV3KG1fd3JhcHBlZEZ1bmN0aW9uKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhMYXp5RXZlbnRMaXN0ZW5l
ci5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhMYXp5RXZlbnRMaXN0ZW5lci5oCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2JlMzQKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOExhenlFdmVudExpc3RlbmVyLmgKQEAg
LTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAw
OSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAg
KiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisg
KiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3Rz
IGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdy
aXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRI
RSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8g
RVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisg
KiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVjhMYXp5RXZlbnRMaXN0ZW5l
cl9oCisjZGVmaW5lIFY4TGF6eUV2ZW50TGlzdGVuZXJfaAorCisjaW5jbHVkZSAiUGxhdGZvcm1T
dHJpbmcuaCIKKyNpbmNsdWRlICJWOEFic3RyYWN0RXZlbnRMaXN0ZW5lci5oIgorI2luY2x1ZGUg
PHY4Lmg+CisjaW5jbHVkZSA8d3RmL1Bhc3NSZWZQdHIuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCisgICAgY2xhc3MgRXZlbnQ7CisgICAgY2xhc3MgRnJhbWU7CisKKyAgICAvLyBWOExhenlF
dmVudExpc3RlbmVyIGlzIGEgd3JhcHBlciBmb3IgYSBKYXZhU2NyaXB0IGNvZGUgc3RyaW5nIHRo
YXQgaXMgY29tcGlsZWQgYW5kIGV2YWx1YXRlZCB3aGVuIGFuIGV2ZW50IGlzIGZpcmVkLgorICAg
IC8vIEEgVjhMYXp5RXZlbnRMaXN0ZW5lciBpcyBhbHdheXMgYSBIVE1MIGV2ZW50IGhhbmRsZXIu
CisgICAgY2xhc3MgVjhMYXp5RXZlbnRMaXN0ZW5lciA6IHB1YmxpYyBWOEFic3RyYWN0RXZlbnRM
aXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0aWMgUGFzc1JlZlB0cjxWOExhenlF
dmVudExpc3RlbmVyPiBjcmVhdGUoRnJhbWUqIGZyYW1lLCBjb25zdCBTdHJpbmcmIGNvZGUsIGNv
bnN0IFN0cmluZyYgZnVuY3Rpb25OYW1lKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4g
YWRvcHRSZWYobmV3IFY4TGF6eUV2ZW50TGlzdGVuZXIoZnJhbWUsIGNvZGUsIGZ1bmN0aW9uTmFt
ZSkpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSW5saW5lKCkgY29uc3Qg
eyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAgIC8vIEZvciBsYXp5IGV2ZW50IGxpc3RlbmVyLCB0
aGUgbGlzdGVuZXIgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIGl0cyBsaXN0ZW5lcgorICAgICAgICAv
LyBmdW5jdGlvbiB3aXRob3V0IGFkZGl0aW9uYWwgc2NvcGUgY2hhaW5zLgorICAgICAgICB2aXJ0
dWFsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBnZXRMaXN0ZW5lck9iamVjdCgpIHsgcmV0dXJuIGdl
dFdyYXBwZWRMaXN0ZW5lckZ1bmN0aW9uKCk7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFY4
TGF6eUV2ZW50TGlzdGVuZXIoRnJhbWUqLCBjb25zdCBTdHJpbmcmIGNvZGUsIGNvbnN0IFN0cmlu
ZyYgZnVuY3Rpb25OYW1lKTsKKyAgICAgICAgdmlydHVhbCB+VjhMYXp5RXZlbnRMaXN0ZW5lcigp
OworCisgICAgICAgIFN0cmluZyBtX2NvZGU7CisgICAgICAgIFN0cmluZyBtX2Z1bmN0aW9uTmFt
ZTsKKyAgICAgICAgYm9vbCBtX2NvbXBpbGVkOworCisgICAgICAgIC8vIElmIHRoZSBldmVudCBs
aXN0ZW5lciBpcyBvbiBhIG5vbi1kb2N1bWVudCBkb20gbm9kZSwgd2UgY29tcGlsZSB0aGUgZnVu
Y3Rpb24gd2l0aCBzb21lIGltcGxpY2l0IHNjb3BlIGNoYWlucyBiZWZvcmUgaXQuCisgICAgICAg
IGJvb2wgbV93cmFwcGVkRnVuY3Rpb25Db21waWxlZDsKKyAgICAgICAgdjg6OlBlcnNpc3RlbnQ8
djg6OkZ1bmN0aW9uPiBtX3dyYXBwZWRGdW5jdGlvbjsKKworICAgICAgICB2ODo6TG9jYWw8djg6
OkZ1bmN0aW9uPiBnZXRXcmFwcGVkTGlzdGVuZXJGdW5jdGlvbigpOworCisgICAgICAgIHZpcnR1
YWwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gY2FsbExpc3RlbmVyRnVuY3Rpb24odjg6OkhhbmRsZTx2
ODo6VmFsdWU+IGpzRXZlbnQsIEV2ZW50KiwgYm9vbCBpc1dpbmRvd0V2ZW50KTsKKworICAgICAg
ICB2ODo6TG9jYWw8djg6OkZ1bmN0aW9uPiBnZXRMaXN0ZW5lckZ1bmN0aW9uKCk7CisgICAgfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gVjhMYXp5RXZlbnRMaXN0ZW5l
cl9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE9iamVjdEV2ZW50
TGlzdGVuZXIuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhPYmplY3RFdmVudExp
c3RlbmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ5NjJhCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20vVjhPYmplY3RFdmVu
dExpc3RlbmVyLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA3LCAyMDA4LCAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3Ry
aWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRo
ZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9y
IHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQg
c3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAq
ICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVP
UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIlY4T2JqZWN0RXZlbnRMaXN0ZW5lci5oIgorCisjaW5jbHVk
ZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
Kworc3RhdGljIHZvaWQgd2Vha09iamVjdEV2ZW50TGlzdGVuZXJDYWxsYmFjayh2ODo6UGVyc2lz
dGVudDx2ODo6VmFsdWU+LCB2b2lkKiBwYXJhbWV0ZXIpCit7CisgICAgVjhPYmplY3RFdmVudExp
c3RlbmVyKiBsaXN0ZW5lciA9IHN0YXRpY19jYXN0PFY4T2JqZWN0RXZlbnRMaXN0ZW5lcio+KHBh
cmFtZXRlcik7CisKKyAgICAvLyBSZW1vdmUgdGhlIHdyYXBwZXIKKyAgICBGcmFtZSogZnJhbWUg
PSBsaXN0ZW5lci0+ZnJhbWUoKTsKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgVjhQcm94eSog
cHJveHkgPSBWOFByb3h5OjpyZXRyaWV2ZShmcmFtZSk7CisgICAgICAgIGlmIChwcm94eSkKKyAg
ICAgICAgICAgIHByb3h5LT5SZW1vdmVPYmplY3RFdmVudExpc3RlbmVyKGxpc3RlbmVyKTsKKwor
ICAgICAgICAvLyBCZWNhdXNlIHRoZSBsaXN0ZW5lciBpcyBubyBsb25nZXIgaW4gdGhlIGxpc3Qs
IGl0IG11c3QgYmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGZyYW1lIHRvIGF2b2lkIGRhbmdsaW5n
IGZyYW1lIHBvaW50ZXIKKyAgICAgICAgLy8gaW4gdGhlIGRlc3RydWN0b3IuCisgICAgICAgIGxp
c3RlbmVyLT5kaXNjb25uZWN0RnJhbWUoKTsKKyAgICB9CisgICAgbGlzdGVuZXItPmRpc3Bvc2VM
aXN0ZW5lck9iamVjdCgpOworfQorCitWOE9iamVjdEV2ZW50TGlzdGVuZXI6OlY4T2JqZWN0RXZl
bnRMaXN0ZW5lcihGcmFtZSogZnJhbWUsIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBsaXN0ZW5lciwg
Ym9vbCBpc0lubGluZSkKKyAgICA6IFY4RXZlbnRMaXN0ZW5lcihmcmFtZSwgbGlzdGVuZXIsIGlz
SW5saW5lKQoreworICAgIG1fbGlzdGVuZXIuTWFrZVdlYWsodGhpcywgd2Vha09iamVjdEV2ZW50
TGlzdGVuZXJDYWxsYmFjayk7Cit9CisKK1Y4T2JqZWN0RXZlbnRMaXN0ZW5lcjo6flY4T2JqZWN0
RXZlbnRMaXN0ZW5lcigpCit7CisgICAgaWYgKG1fZnJhbWUpIHsKKyAgICAgICAgQVNTRVJUKCFt
X2xpc3RlbmVyLklzRW1wdHkoKSk7CisgICAgICAgIFY4UHJveHkqIHByb3h5ID0gVjhQcm94eTo6
cmV0cmlldmUobV9mcmFtZSk7CisgICAgICAgIGlmIChwcm94eSkKKyAgICAgICAgICAgIHByb3h5
LT5SZW1vdmVPYmplY3RFdmVudExpc3RlbmVyKHRoaXMpOworICAgIH0KKworICAgIGRpc3Bvc2VM
aXN0ZW5lck9iamVjdCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQg
YS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE9iamVjdEV2ZW50TGlzdGVuZXIuaCBiL1dl
YkNvcmUvYmluZGluZ3MvdjgvY3VzdG9tL1Y4T2JqZWN0RXZlbnRMaXN0ZW5lci5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMWJkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOE9iamVjdEV2ZW50TGlzdGVuZXIuaApAQCAtMCww
ICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEdv
b2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAq
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUK
KyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5l
aXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNv
bnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVy
aXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRl
biBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENP
UFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVO
VCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJ
TUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBWOE9iamVjdEV2ZW50TGlzdGVuZXJf
aAorI2RlZmluZSBWOE9iamVjdEV2ZW50TGlzdGVuZXJfaAorCisjaW5jbHVkZSAiVjhDdXN0b21F
dmVudExpc3RlbmVyLmgiCisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx3dGYvUGFzc1JlZlB0
ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBGcmFtZTsKKworICAgIC8v
IFY4T2JqZWN0RXZlbnRMaXN0ZW5lciBpcyBhIHNwZWNpYWwgbGlzdGVuZXIgd3JhcHBlciBmb3Ig
b2JqZWN0cyBub3QgaW4gdGhlIERPTS4gIEl0IGtlZXBzIHRoZSBKUyBsaXN0ZW5lciBhcyBhIHdl
YWsgcG9pbnRlci4KKyAgICBjbGFzcyBWOE9iamVjdEV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgVjhF
dmVudExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBQYXNzUmVmUHRyPFY4
T2JqZWN0RXZlbnRMaXN0ZW5lcj4gY3JlYXRlKEZyYW1lKiBmcmFtZSwgdjg6OkxvY2FsPHY4OjpP
YmplY3Q+IGxpc3RlbmVyLCBib29sIGlzSW5saW5lKQorICAgICAgICB7CisgICAgICAgICAgICBy
ZXR1cm4gYWRvcHRSZWYobmV3IFY4T2JqZWN0RXZlbnRMaXN0ZW5lcihmcmFtZSwgbGlzdGVuZXIs
IGlzSW5saW5lKSk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFY4T2JqZWN0
RXZlbnRMaXN0ZW5lcihGcmFtZSosIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBsaXN0ZW5lciwgYm9v
bCBpc0lubGluZSk7CisgICAgICAgIHZpcnR1YWwgflY4T2JqZWN0RXZlbnRMaXN0ZW5lcigpOwor
ICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmIC8vIFY4T2JqZWN0RXZl
bnRMaXN0ZW5lcl9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L2N1c3RvbS9WOFdv
cmtlckNvbnRleHRFdmVudExpc3RlbmVyLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvY3VzdG9t
L1Y4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjI0ZDUwMDIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyLmNwcApAQCAtMCwwICsxLDEw
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2lmIEVOQUJMRShX
T1JLRVJTKQorCisjaW5jbHVkZSAiVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5oIgorCisj
aW5jbHVkZSAiRXZlbnQuaCIKKyNpbmNsdWRlICJXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHku
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVy
OjpWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyKFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94
eSogcHJveHksIHY4OjpMb2NhbDx2ODo6T2JqZWN0PiBsaXN0ZW5lciwgYm9vbCBpc0lubGluZSkK
KyAgICA6IFY4T2JqZWN0RXZlbnRMaXN0ZW5lcigwLCBsaXN0ZW5lciwgaXNJbmxpbmUpCisgICAg
LCBtX3Byb3h5KHByb3h5KQoreworfQorCitWOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyOjp+
VjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcigpCit7CisgICAgaWYgKG1fcHJveHkpCisgICAg
ICAgIG1fcHJveHktPlJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcyk7CisgICAgZGlzcG9zZUxpc3Rl
bmVyT2JqZWN0KCk7Cit9CisKK3ZvaWQgVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcjo6aGFu
ZGxlRXZlbnQoRXZlbnQqIGV2ZW50LCBib29sIGlzV2luZG93RXZlbnQpCit7CisgICAgLy8gSXMg
dGhlIEV2ZW50TGlzdGVuZXIgZGlzY29ubmVjdGVkIGZyb20gdGhlIGZyYW1lPworICAgIGlmIChk
aXNjb25uZWN0ZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gVGhlIGNhbGxiYWNrIGZ1
bmN0aW9uIG9uIFhNTEh0dHBSZXF1ZXN0IGNhbiBjbGVhciB0aGUgZXZlbnQgbGlzdGVuZXIgYW5k
IGRlc3Ryb3lzICd0aGlzJyBvYmplY3QuIEtlZXAgYSBsb2NhbCByZWZlcmVuY2UgdG8gaXQuCisg
ICAgLy8gU2VlIGlzc3VlIDg4OTgyOS4KKyAgICBSZWZQdHI8VjhBYnN0cmFjdEV2ZW50TGlzdGVu
ZXI+IHByb3RlY3QodGhpcyk7CisKKyAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisK
KyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gbV9wcm94eS0+R2V0Q29udGV4
dCgpOworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aW52b2tlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50LCBpc1dpbmRvd0V2ZW50KTsKK30KKwor
djg6OkxvY2FsPHY4OjpWYWx1ZT4gVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcjo6Y2FsbExp
c3RlbmVyRnVuY3Rpb24odjg6OkhhbmRsZTx2ODo6VmFsdWU+IGpzRXZlbnQsIEV2ZW50KiBldmVu
dCwgYm9vbCBpc1dpbmRvd0V2ZW50KQoreworICAgIHY4OjpMb2NhbDx2ODo6RnVuY3Rpb24+IGhh
bmRsZXJGdW5jdGlvbiA9IGdldExpc3RlbmVyRnVuY3Rpb24oKTsKKyAgICBpZiAoaGFuZGxlckZ1
bmN0aW9uLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6VmFsdWU+KCk7
CisKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdD4gcmVjZWl2ZXIgPSBnZXRSZWNlaXZlck9iamVj
dChldmVudCwgaXNXaW5kb3dFdmVudCk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHBhcmFt
ZXRlcnNbMV0gPSB7IGpzRXZlbnQgfTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHQg
PSBoYW5kbGVyRnVuY3Rpb24tPkNhbGwocmVjZWl2ZXIsIDEsIHBhcmFtZXRlcnMpOworCisgICAg
bV9wcm94eS0+VHJhY2tFdmVudChldmVudCk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2
ODo6TG9jYWw8djg6Ok9iamVjdD4gVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcjo6Z2V0UmVj
ZWl2ZXJPYmplY3QoRXZlbnQqIGV2ZW50LCBib29sIGlzV2luZG93RXZlbnQpCit7CisgICAgaWYg
KCFtX2xpc3RlbmVyLklzRW1wdHkoKSAmJiAhbV9saXN0ZW5lci0+SXNGdW5jdGlvbigpKQorICAg
ICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+OjpOZXcobV9saXN0ZW5lcik7CisKKyAg
ICBpZiAoaXNXaW5kb3dFdmVudCkKKyAgICAgICAgcmV0dXJuIHY4OjpDb250ZXh0OjpHZXRDdXJy
ZW50KCktPkdsb2JhbCgpOworCisgICAgRXZlbnRUYXJnZXQqIHRhcmdldCA9IGV2ZW50LT5jdXJy
ZW50VGFyZ2V0KCk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlID0gV29ya2VyQ29u
dGV4dEV4ZWN1dGlvblByb3h5OjpFdmVudFRhcmdldFRvVjhPYmplY3QodGFyZ2V0KTsKKyAgICBp
ZiAodmFsdWUuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gdjg6OkxvY2FsPHY4OjpPYmplY3Q+
KCk7CisgICAgcmV0dXJuIHY4OjpMb2NhbDx2ODo6T2JqZWN0Pjo6TmV3KHY4OjpIYW5kbGU8djg6
Ok9iamVjdD46OkNhc3QodmFsdWUpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisj
ZW5kaWYgLy8gV09SS0VSUwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0b20v
VjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9jdXN0
b20vVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjg1ZGFlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdz
L3Y4L2N1c3RvbS9WOFdvcmtlckNvbnRleHRFdmVudExpc3RlbmVyLmgKQEAgLTAsMCArMSw2OSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBHb29nbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFy
ZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5
cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRo
ZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRv
cnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJv
bQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlz
c2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQg
SE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhF
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisg
KiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwg
VEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRP
LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcl9o
CisjZGVmaW5lIFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXJfaAorCisjaWYgRU5BQkxFKFdP
UktFUlMpCisKKyNpbmNsdWRlICJWOE9iamVjdEV2ZW50TGlzdGVuZXIuaCIKKyNpbmNsdWRlIDx2
OC5oPgorI2luY2x1ZGUgPHd0Zi9QYXNzUmVmUHRyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworICAgIGNsYXNzIEV2ZW50OworICAgIGNsYXNzIFdvcmtlckNvbnRleHRFeGVjdXRpb25Qcm94
eTsKKworICAgIGNsYXNzIFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXIgOiBwdWJsaWMgVjhP
YmplY3RFdmVudExpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0YXRpYyBQYXNzUmVm
UHRyPFY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVuZXI+IGNyZWF0ZShXb3JrZXJDb250ZXh0RXhl
Y3V0aW9uUHJveHkqIHByb3h5LCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbGlzdGVuZXIsIGJvb2wg
aXNJbmxpbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgVjhX
b3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcihwcm94eSwgbGlzdGVuZXIsIGlzSW5saW5lKSk7Cisg
ICAgICAgIH0KKyAgICAgICAgVjhXb3JrZXJDb250ZXh0RXZlbnRMaXN0ZW5lcihXb3JrZXJDb250
ZXh0RXhlY3V0aW9uUHJveHkqLCB2ODo6TG9jYWw8djg6Ok9iamVjdD4gbGlzdGVuZXIsIGJvb2wg
aXNJbmxpbmUpOworCisgICAgICAgIHZpcnR1YWwgflY4V29ya2VyQ29udGV4dEV2ZW50TGlzdGVu
ZXIoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50KiwgYm9vbCBpc1dp
bmRvd0V2ZW50KTsKKyAgICAgICAgdmlydHVhbCBib29sIGRpc2Nvbm5lY3RlZCgpIGNvbnN0IHsg
cmV0dXJuICFtX3Byb3h5OyB9CisKKyAgICAgICAgdm9pZCBkaXNjb25uZWN0KCkgeyBtX3Byb3h5
ID0gMDsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdmlydHVhbCB2ODo6TG9jYWw8djg6OlZh
bHVlPiBjYWxsTGlzdGVuZXJGdW5jdGlvbih2ODo6SGFuZGxlPHY4OjpWYWx1ZT4ganNFdmVudCwg
RXZlbnQqLCBib29sIGlzV2luZG93RXZlbnQpOworICAgICAgICB2ODo6TG9jYWw8djg6Ok9iamVj
dD4gZ2V0UmVjZWl2ZXJPYmplY3QoRXZlbnQqLCBib29sIGlzV2luZG93RXZlbnQpOworICAgICAg
ICBXb3JrZXJDb250ZXh0RXhlY3V0aW9uUHJveHkqIG1fcHJveHk7CisgICAgfTsKKworfSAvLyBu
YW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gV09SS0VSUworCisjZW5kaWYgLy8gVjhXb3Jr
ZXJDb250ZXh0RXZlbnRMaXN0ZW5lcl9oCg==
</data>
<flag name="review"
          id="13952"
          type_id="1"
          status="+"
          setter="dglazkov"
    />
          </attachment>
      

    </bug>

</bugzilla>