<?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>26566</bug_id>
          
          <creation_ts>2009-06-19 19:21:39 -0700</creation_ts>
          <short_desc>[Chromium] Upstream NPV8Object and V8NPUtils</short_desc>
          <delta_ts>2009-06-25 13:35:56 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>OS X 10.5</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="Albert J. Wong">ajwong</reporter>
          <assigned_to name="David Levin">levin</assigned_to>
          <cc>dglazkov</cc>
    
    <cc>levin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>127095</commentid>
    <comment_count>0</comment_count>
    <who name="Albert J. Wong">ajwong</who>
    <bug_when>2009-06-19 19:21:39 -0700</bug_when>
    <thetext>Upstreaming 
  V8NPUtils.h
  V8NPUtils.cpp
  NPV8Object.h
  NPV8Object.cpp

I didn&apos;t quite know how to handle the NPN_* functions.  It didn&apos;t seem right to rename them.  Let me know if/how they should be changed.

Also, there&apos;s a use if v8::Undefined() that I think I&apos;m supposed to do something with, but not sure what.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127097</commentid>
    <comment_count>1</comment_count>
      <attachid>31585</attachid>
    <who name="Albert J. Wong">ajwong</who>
    <bug_when>2009-06-19 19:32:22 -0700</bug_when>
    <thetext>Created attachment 31585
First try at upstream the files</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127098</commentid>
    <comment_count>2</comment_count>
    <who name="Albert J. Wong">ajwong</who>
    <bug_when>2009-06-19 19:37:21 -0700</bug_when>
    <thetext>Here is the related chromium change.

http://codereview.chromium.org/141022</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127120</commentid>
    <comment_count>3</comment_count>
      <attachid>31585</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-06-20 01:38:24 -0700</bug_when>
    <thetext>Comment on attachment 31585
First try at upstream the files

Style:
 68 static v8::Handle&lt;v8::Value&gt;* listFromVariantArgs(const NPVariant* arguments, uint32_t argumentCount, NPObject *owner)

again:
 72         const NPVariant *arg = &amp;arguments[index];

again:
 83         return v8::String::New(static_cast&lt;const char *&gt;(identifier-&gt;value.string));

Is this safe?
 85     char buf[32];
 86     sprintf(buf, &quot;%d&quot;, identifier-&gt;value.number);
 87     return v8::String::New(buf);
shouldn&apos;t that be snprintf?

Can we say local variable?
 102         object-&gt;GetInternalField(V8Custom::kDOMWrapperTypeIndex)-&gt;IsNumber() &amp;&amp;
 103         object-&gt;GetInternalField(V8Custom::kDOMWrapperTypeIndex)-&gt;Uint32Value() == V8ClassIndex::NPOBJECT) {

Early return would have been cleaner here:
     if (npobj-&gt;_class == npScriptObjectClass) {
 125         V8NPObject* object = reinterpret_cast&lt;V8NPObject*&gt;(npobj);
 126

Indent should be 4 spaces:
 140         if (methodName == NPN_GetStringIdentifier(&quot;eval&quot;)) {
 141           if (argumentCount != 1)
 142               return false;
 143           if (arguments[0].type != NPVariantType_String)
 144               return false;
 145           return NPN_Evaluate(npp, npobj, const_cast&lt;NPString*&gt;(&amp;arguments[0].value.stringValue), result);
 146         }

The comment here is useless:
 159         ASSERT(proxy);  // Must not be NULL.

listFromVariantArgs should have create in its name.  This is not clear usage at all:
 166         v8::Handle&lt;v8::Value&gt;* argv = listFromVariantArgs(arguments, argumentCount, npobj);
 167         v8::Local&lt;v8::Value&gt; resultObj = proxy-&gt;CallFunction(func, object-&gt;v8Object, argumentCount, argv);
 168         delete[] argv;

There is also now PassOwnPtr which could be used there.

Early return would again be clearer:
 193     if (npobj-&gt;_class == npScriptObjectClass) {
 194         V8NPObject* object = reinterpret_cast&lt;V8NPObject*&gt;(npobj);

Style:
 346     V8NPObject *object = reinterpret_cast&lt;V8NPObject*&gt;(npobj);

Again, ownership is unclear here:
 500             // Create list of arguments to pass to v8.
 501             v8::Handle&lt;v8::Value&gt;* argv = listFromVariantArgs(arguments, argumentCount, npobj);
 502             resultObj = proxy-&gt;NewInstance(ctor, argumentCount, argv);
 503             delete[] argv;

Useless comment:
36 namespace WebCore {
 37     class DOMWindow;
 38 } // namespace WebCore

npp is not needed as an arg name here:
 58 NPObject* npCreateV8ScriptObject(NPP npp, v8::Handle&lt;v8::Object&gt;, WebCore::DOMWindow*);

Is this ownership really correct?
 67         v8::String::Utf8Value utf8(object);
 68         char* utf8_chars = strdup(*utf8);
 69         STRINGN_TO_NPVARIANT(utf8_chars, utf8.length(), *result);

How do we know that the strdup is matched correctly with a free() call?

Wouldn&apos;t a switch work better here?
 84     if (type == NPVariantType_Int32)
 85         return v8::Integer::New(NPVARIANT_TO_INT32(*variant));
 86     if (type == NPVariantType_Double)
 87         return v8::Number::New(NPVARIANT_TO_DOUBLE(*variant));

Isn&apos;t there a safer WriteAscii call which puts the buffer length check closer to the actual buffer write?
112     int bufLen = str-&gt;Length() + 1;
 113     if (bufLen &lt;= kStackBufSize) {
 114         // Use local stack buffer to avoid heap allocations for small strings. Here we should only use the stack space for
 115         // stack_buf when it&apos;s used, not when we use the heap.
 116         char stackBuf[kStackBufSize];
 117         str-&gt;WriteAscii(stackBuf);
 118         return NPN_GetStringIdentifier(stackBuf);
 119     }

r- for the possible buffer overrun.

I find this code exteremely hard to read.  Maybe V8 is just super-verbose, or maybe NPAPI is super ugly, or maybe both.  Maybe there is something we could do to make this all legible?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127785</commentid>
    <comment_count>4</comment_count>
      <attachid>31765</attachid>
    <who name="Albert J. Wong">ajwong</who>
    <bug_when>2009-06-23 18:45:04 -0700</bug_when>
    <thetext>Created attachment 31765
address eric&apos;s comments

I tried to address all of Eric&apos;s comments.

I couldn&apos;t use a PassOwnPtr however because the delete is an array delete.  Silly C++ and its asymetric deletes. :-/

I also made a few attempts at cleaning up the code organization + factoring out common parts, but ultimately failed at all of it.  There&apos;s too much stuff going where error handling and object construction are interwoven. :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127799</commentid>
    <comment_count>5</comment_count>
      <attachid>31765</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-23 20:21:11 -0700</bug_when>
    <thetext>Comment on attachment 31765
address eric&apos;s comments

A few more items to fix up.  Almost there.


&gt; diff --git a/WebCore/bindings/v8/NPV8Object.cpp b/WebCore/bindings/v8/NPV8Object.cpp
&gt; +/*
&gt; + * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
&gt; + * Copyright (C) 2007-2009 Google, Inc.  All rights reserved.

Uses commas instead of range.  2007, 2008, 2009

&gt; +#include &lt;stdio.h&gt;

&gt; +#include &quot;NPV8Object.h&quot;
This one should be here.

&gt; +
&gt; +#include &lt;v8.h&gt;
&gt; +

&gt; +#include &quot;ChromiumBridge.h&quot;
&gt; +#include &quot;DOMWindow.h&quot;
&gt; +#include &quot;Frame.h&quot;
&gt; +#include &quot;PlatformString.h&quot;
&gt; +#include &quot;ScriptController.h&quot;
&gt; +#include &quot;V8CustomBinding.h&quot;
&gt; +#include &quot;V8Helpers.h&quot;
&gt; +#include &quot;V8NPUtils.h&quot;
&gt; +#include &quot;V8Proxy.h&quot;
&gt; +#include &quot;bindings/npruntime.h&quot;
&gt; +#include &quot;npruntime_priv.h&quot;

Sort these.

&gt; +// FIXME(mbelshe): Comments on why use malloc and free.

FIXME&apos;s never really have a name.  (Typically because one can tell who added them due to revision history, but I know that isn&apos;t true here.  Still I&apos;m not sure how much value the name has at this point.  There has been plenty of time for folks to address these.)

End result: remove the name.

&gt; +    char buffer[32];
&gt; +    snprintf(buffer, sizoef(buffer), &quot;%d&quot;, identifier-&gt;value.number);

typo: &quot;sizoef&quot;

&gt; +NPObject* npCreateV8ScriptObject(NPP npp, v8::Handle&lt;v8::Object&gt; object, WebCore::DOMWindow* root)
&gt; +{
&gt; +    v8::Local&lt;v8::Value&gt; typeIndex = object-&gt;GetInternalField(V8Custom::kDOMWrapperTypeIndex);
&gt; +    // Check to see if this object is already wrapped.
&gt; +    if (object-&gt;InternalFieldCount() == V8Custom::kNPObjectInternalFieldCount &amp;&amp;
&gt; +        typeIndex-&gt;IsNumber() &amp;&amp;
&gt; +        typeIndex-&gt;Uint32Value() == V8ClassIndex::NPOBJECT) {

&amp;&amp; go at the beginning of lines (or even better make it one line).

&gt; +    v8::Handle&lt;v8::Value&gt;* argv = createValueListFromVariantArgs(arguments, argumentCount, npObject);
&gt; +    v8::Local&lt;v8::Value&gt; resultObject = proxy-&gt;CallFunction(function, v8NpObject-&gt;v8Object, argumentCount, argv);
&gt; +    delete[] argv;
It could use a OwnArrayPtr here but for such a small scope, it feels like overkill.

&gt; +        // Create list of arguments to pass to v8.
&gt; +        v8::Handle&lt;v8::Value&gt;* argv = createValueListFromVariantArgs(arguments, argumentCount, npObject);
&gt; +        resultObject = proxy-&gt;CallFunction(function, functionObject, argumentCount, argv);
&gt; +        delete[] argv;
Same thing about OwnArrayPtr.  Just for you to consider.

&gt; +    V8NPObject *object = reinterpret_cast&lt;V8NPObject*&gt;(npObject);
incorrect * placement. (search for this because it occurs several times for &quot;V8NPObject *&quot;).

&gt; +    v8::Handle&lt;v8::Object&gt; obj(object-&gt;v8Object);
&gt; +    // FIXME(mbelshe): Verify that setting to undefined is right.

remove name in fixme.

&gt; +        // FIXME(fqian): http://b/issue?id=1210340: Use a v8::Object::Keys() method when it exists, instead of evaluating javascript.
&gt; +
&gt; +        // FIXME(mpcomplete): Figure out how to cache this helper function.  Run a helper function that collects the properties

remove name in fixme.


&gt; diff --git a/WebCore/bindings/v8/NPV8Object.h b/WebCore/bindings/v8/NPV8Object.h

&gt; + * Copyright (C) 2006-2009 Google Inc. All rights reserved.
expand range to comma separated years.

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

&gt; + * Copyright (C) 2008-2009 Google Inc. All rights reserved.

expand range to comma separated years.


&gt; +v8::Handle&lt;v8::Value&gt; convertNPVariantToV8Object(const NPVariant* variant, NPObject* npobject)
&gt; +{
&gt; +    NPVariantType type = variant-&gt;type;
&gt; +
&gt; +    switch (type) {
&gt; +    case NPVariantType_Int32:
&gt; +        return v8::Integer::New(NPVARIANT_TO_INT32(*variant));
&gt; +    case  NPVariantType_Double:
&gt; +        return v8::Number::New(NPVARIANT_TO_DOUBLE(*variant));
&gt; +    case  NPVariantType_Bool:
&gt; +        return NPVARIANT_TO_BOOLEAN(*variant) ? v8::True() : v8::False();
&gt; +    case  NPVariantType_Null:
&gt; +        return v8::Null();
&gt; +    case  NPVariantType_Void:
&gt; +        return v8::Undefined();
&gt; +    case  NPVariantType_String: {
&gt; +        NPString src = NPVARIANT_TO_STRING(*variant);
&gt; +        return v8::String::New(src.UTF8Characters, src.UTF8Length);
&gt; +    }
&gt; +    case  NPVariantType_Object: {


The two spaces after &quot;case&quot; is odd.

&gt; +
&gt; +// Helper function to create an NPN String Identifier from a v8 string.
&gt; +NPIdentifier getStringIdentifier(v8::Handle&lt;v8::String&gt; str)
str -&gt; string

&gt; +    const int kStackBufSize = 100;

Buf -&gt; buffer

&gt; +    int bufLen = str-&gt;Length() + 1;

bufLen -&gt; bufferLength

&gt; +    if (bufLen &lt;= kStackBufSize) {
&gt; +        // Use local stack buffer to avoid heap allocations for small strings. Here we should only use the stack space for
&gt; +        // stack_buf when it&apos;s used, not when we use the heap.

&quot;stack_buf&quot; may need to be updated to new name.

&gt; +        //
&gt; +        // WriteAscii is guaranteed to generate a null-terminated string because bufLen is constructed to be one greater
&gt; +        // than the string length.
&gt; +        char stackBuf[kStackBufSize];
Buf -&gt; Buffer


&gt; diff --git a/WebCore/bindings/v8/V8NPUtils.h b/WebCore/bindings/v8/V8NPUtils.h

&gt; @@ -0,0 +1,25 @@
&gt; +// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
&gt; +// Use of this source code is governed by a BSD-style license that can be
&gt; +// found in the LICENSE file.

This copyright needs to be replaced.  You can use the one from WebCore/loader/ThreadableLoader.h as good boilerplate.

&gt; +
&gt; +#include &lt;v8.h&gt;
&gt; +#include &quot;third_party/npapi/bindings/npruntime.h&quot;
&gt; +
&gt; +namespace WebCore {
&gt; +    class Frame;
&gt; +}

&quot;Frame&quot; isn&apos;t used below. Can we get rid of this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127981</commentid>
    <comment_count>6</comment_count>
      <attachid>31807</attachid>
    <who name="Albert J. Wong">ajwong</who>
    <bug_when>2009-06-24 13:43:50 -0700</bug_when>
    <thetext>Created attachment 31807
address Dave&apos;s comments. :)

This time, I verified that my compile command actually compiled the changes.  Yay!.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>127995</commentid>
    <comment_count>7</comment_count>
      <attachid>31810</attachid>
    <who name="Albert J. Wong">ajwong</who>
    <bug_when>2009-06-24 14:10:05 -0700</bug_when>
    <thetext>Created attachment 31810
Remove some of the more obvious comments, and fix * association.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128207</commentid>
    <comment_count>8</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-25 10:27:14 -0700</bug_when>
    <thetext>Assign to levin for landing.
</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>128252</commentid>
    <comment_count>9</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2009-06-25 13:35:56 -0700</bug_when>
    <thetext>Committed as http://trac.webkit.org/changeset/45189.
</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31585</attachid>
            <date>2009-06-19 19:32:22 -0700</date>
            <delta_ts>2009-06-23 18:45:04 -0700</delta_ts>
            <desc>First try at upstream the files</desc>
            <filename>v8nputils_upstream.patch</filename>
            <type>text/plain</type>
            <size>29128</size>
            <attacher name="Albert J. Wong">ajwong</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
Zjk2ZjJhMS4uZTAzNmUwMiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNyBAQAorMjAwOS0wNi0xOSAgQWxiZXJ0IEouIFdv
bmcgIDxhandvbmdAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yNjU2NgorICAgICAgICBVcHN0cmVhbSB0aGVzZSBmaWxlcyBmcm9tIHRoZSBjaHJvbWl1bSB2
OCBjb2RlLiAgTm8gdGVzdHMgd2VyZQorICAgICAgICBhZmZlY3RlZCBiZWNhdXNlIHRoaXMgaXMg
ZXNzZW50aWFsbHkgYSBjb2RlIG1vdmUuCisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9OUFY4T2Jq
ZWN0LmNwcDogQWRkZWQuCisgICAgICAgIChhbGxvY1Y4TlBPYmplY3QpOgorICAgICAgICAoZnJl
ZVY4TlBPYmplY3QpOgorICAgICAgICAobGlzdEZyb21WYXJpYW50QXJncyk6CisgICAgICAgIChu
cElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcik6CisgICAgICAgIChucENyZWF0ZVY4U2NyaXB0T2Jq
ZWN0KToKKyAgICAgICAgKE5QTl9JbnZva2UpOgorICAgICAgICAoTlBOX0ludm9rZURlZmF1bHQp
OgorICAgICAgICAoTlBOX0V2YWx1YXRlKToKKyAgICAgICAgKE5QTl9FdmFsdWF0ZUhlbHBlcik6
CisgICAgICAgIChOUE5fR2V0UHJvcGVydHkpOgorICAgICAgICAoTlBOX1NldFByb3BlcnR5KToK
KyAgICAgICAgKE5QTl9SZW1vdmVQcm9wZXJ0eSk6CisgICAgICAgIChOUE5fSGFzUHJvcGVydHkp
OgorICAgICAgICAoTlBOX0hhc01ldGhvZCk6CisgICAgICAgIChOUE5fU2V0RXhjZXB0aW9uKToK
KyAgICAgICAgKE5QTl9FbnVtZXJhdGUpOgorICAgICAgICAoTlBOX0NvbnN0cnVjdCk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvTlBWOE9iamVjdC5oOiBBZGRlZC4KKyAgICAgICAgKFByaXZhdGVJ
ZGVudGlmaWVyOjopOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4TlBVdGlscy5jcHA6IEFkZGVk
LgorICAgICAgICAoY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQpOgorICAgICAgICAoY29udmVy
dE5QVmFyaWFudFRvVjhPYmplY3QpOgorICAgICAgICAoZ2V0U3RyaW5nSWRlbnRpZmllcik6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvVjhOUFV0aWxzLmg6IEFkZGVkLgorCiAyMDA5LTA2LTE4ICBN
YXJrIFJvd2UgIDxtcm93ZUBhcHBsZS5jb20+CiAKICAgICAgICAgU3BlY3VsYXRpdmUgV2luZG93
cyBidWlsZCBmaXguCmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L05QVjhPYmplY3Qu
Y3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9OUFY4T2JqZWN0LmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi5lYThhMWE1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9i
aW5kaW5ncy92OC9OUFY4T2JqZWN0LmNwcApAQCAtMCwwICsxLDUxOSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwNCwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEdvb2dsZSwgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlIDxzdGRp
by5oPgorCisjaW5jbHVkZSA8djguaD4KKworI2luY2x1ZGUgIkNocm9taXVtQnJpZGdlLmgiCisj
aW5jbHVkZSAiRE9NV2luZG93LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJOUFY4
T2JqZWN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJTY3JpcHRD
b250cm9sbGVyLmgiCisjaW5jbHVkZSAiVjhDdXN0b21CaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhI
ZWxwZXJzLmgiCisjaW5jbHVkZSAiVjhOUFV0aWxzLmgiCisjaW5jbHVkZSAiYmluZGluZ3MvbnBy
dW50aW1lLmgiCisjaW5jbHVkZSAibnBydW50aW1lX3ByaXYuaCIKKyNpbmNsdWRlICJWOFByb3h5
LmgiCisKK3VzaW5nIFdlYkNvcmU6OnRvVjhDb250ZXh0OwordXNpbmcgV2ViQ29yZTo6dG9WOFBy
b3h5OwordXNpbmcgV2ViQ29yZTo6VjhDbGFzc0luZGV4OwordXNpbmcgV2ViQ29yZTo6VjhDdXN0
b207Cit1c2luZyBXZWJDb3JlOjpWOFByb3h5OworCisvLyBGSVhNRShtYmVsc2hlKTogQ29tbWVu
dHMgb24gd2h5IHVzZSBtYWxsb2MgYW5kIGZyZWUuCitzdGF0aWMgTlBPYmplY3QqIGFsbG9jVjhO
UE9iamVjdChOUFAsIE5QQ2xhc3MqKQoreworICAgIHJldHVybiBzdGF0aWNfY2FzdDxOUE9iamVj
dCo+KG1hbGxvYyhzaXplb2YoVjhOUE9iamVjdCkpKTsKK30KKworc3RhdGljIHZvaWQgZnJlZVY4
TlBPYmplY3QoTlBPYmplY3QqIG5wb2JqKQoreworICAgIFY4TlBPYmplY3QqIG9iamVjdCA9IHJl
aW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KG5wb2JqKTsKKyNpZm5kZWYgTkRFQlVHCisgICAg
VjhQcm94eTo6VW5yZWdpc3Rlckdsb2JhbEhhbmRsZShvYmplY3QsIG9iamVjdC0+djhPYmplY3Qp
OworI2VuZGlmCisgICAgb2JqZWN0LT52OE9iamVjdC5EaXNwb3NlKCk7CisgICAgZnJlZShvYmpl
Y3QpOworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KiBsaXN0RnJvbVZhcmlhbnRB
cmdzKGNvbnN0IE5QVmFyaWFudCogYXJndW1lbnRzLCB1aW50MzJfdCBhcmd1bWVudENvdW50LCBO
UE9iamVjdCAqb3duZXIpCit7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KiBhcmd2ID0gbmV3
IHY4OjpIYW5kbGU8djg6OlZhbHVlPlthcmd1bWVudENvdW50XTsKKyAgICBmb3IgKHVpbnQzMl90
IGluZGV4ID0gMDsgaW5kZXggPCBhcmd1bWVudENvdW50OyBpbmRleCsrKSB7CisgICAgICAgIGNv
bnN0IE5QVmFyaWFudCAqYXJnID0gJmFyZ3VtZW50c1tpbmRleF07CisgICAgICAgIGFyZ3ZbaW5k
ZXhdID0gY29udmVydE5QVmFyaWFudFRvVjhPYmplY3QoYXJnLCBvd25lcik7CisgICAgfQorICAg
IHJldHVybiBhcmd2OworfQorCisvLyBDcmVhdGUgYW4gaWRlbnRpZmllciAobnVsbCB0ZXJtaW5h
dGVkIHV0ZjggY2hhciopIGZyb20gdGhlIE5QSWRlbnRpZmllci4KK3N0YXRpYyB2ODo6TG9jYWw8
djg6OlN0cmluZz4gbnBJZGVudGlmaWVyVG9WOElkZW50aWZpZXIoTlBJZGVudGlmaWVyIG5hbWUp
Cit7CisgICAgUHJpdmF0ZUlkZW50aWZpZXIqIGlkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxQcml2
YXRlSWRlbnRpZmllcio+KG5hbWUpOworICAgIGlmIChpZGVudGlmaWVyLT5pc1N0cmluZykKKyAg
ICAgICAgcmV0dXJuIHY4OjpTdHJpbmc6Ok5ldyhzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KGlk
ZW50aWZpZXItPnZhbHVlLnN0cmluZykpOworCisgICAgY2hhciBidWZbMzJdOworICAgIHNwcmlu
dGYoYnVmLCAiJWQiLCBpZGVudGlmaWVyLT52YWx1ZS5udW1iZXIpOworICAgIHJldHVybiB2ODo6
U3RyaW5nOjpOZXcoYnVmKTsKK30KKworc3RhdGljIE5QQ2xhc3MgVjhOUE9iamVjdENsYXNzID0g
eyBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYWxsb2NWOE5QT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmcmVlVjhOUE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisvLyBOUEFQSSdzIG5wcnVudGltZSBmdW5jdGlv
bnMuCitOUENsYXNzKiBucFNjcmlwdE9iamVjdENsYXNzID0gJlY4TlBPYmplY3RDbGFzczsKKwor
TlBPYmplY3QqIG5wQ3JlYXRlVjhTY3JpcHRPYmplY3QoTlBQIG5wcCwgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0PiBvYmplY3QsIFdlYkNvcmU6OkRPTVdpbmRvdyogcm9vdCkKK3sKKyAgICAvLyBDaGVj
ayB0byBzZWUgaWYgdGhpcyBvYmplY3QgaXMgYWxyZWFkeSB3cmFwcGVkLgorICAgIGlmIChvYmpl
Y3QtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprTlBPYmplY3RJbnRlcm5hbEZp
ZWxkQ291bnQgJiYKKyAgICAgICAgb2JqZWN0LT5HZXRJbnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjpr
RE9NV3JhcHBlclR5cGVJbmRleCktPklzTnVtYmVyKCkgJiYKKyAgICAgICAgb2JqZWN0LT5HZXRJ
bnRlcm5hbEZpZWxkKFY4Q3VzdG9tOjprRE9NV3JhcHBlclR5cGVJbmRleCktPlVpbnQzMlZhbHVl
KCkgPT0gVjhDbGFzc0luZGV4OjpOUE9CSkVDVCkgeworCisgICAgICAgIE5QT2JqZWN0KiBydiA9
IFY4UHJveHk6OlRvTmF0aXZlT2JqZWN0PE5QT2JqZWN0PihWOENsYXNzSW5kZXg6Ok5QT0JKRUNU
LCBvYmplY3QpOworICAgICAgICBOUE5fUmV0YWluT2JqZWN0KHJ2KTsKKyAgICAgICAgcmV0dXJu
IHJ2OworICAgIH0KKworICAgIFY4TlBPYmplY3QqIG9iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhO
UE9iamVjdCo+KE5QTl9DcmVhdGVPYmplY3QobnBwLCAmVjhOUE9iamVjdENsYXNzKSk7CisgICAg
b2JqLT52OE9iamVjdCA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXcob2JqZWN0KTsK
KyNpZm5kZWYgTkRFQlVHCisgICAgVjhQcm94eTo6UmVnaXN0ZXJHbG9iYWxIYW5kbGUoV2ViQ29y
ZTo6TlBPQkpFQ1QsIG9iaiwgb2JqLT52OE9iamVjdCk7CisjZW5kaWYKKyAgICBvYmotPnJvb3RP
YmplY3QgPSByb290OworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE5QT2JqZWN0Kj4ob2Jq
KTsKK30KKworYm9vbCBOUE5fSW52b2tlKE5QUCBucHAsIE5QT2JqZWN0KiBucG9iaiwgTlBJZGVu
dGlmaWVyIG1ldGhvZE5hbWUsIGNvbnN0IE5QVmFyaWFudCogYXJndW1lbnRzLCB1aW50MzJfdCBh
cmd1bWVudENvdW50LCBOUFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoIW5wb2JqKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBvYmotPl9jbGFzcyA9PSBucFNjcmlwdE9i
amVjdENsYXNzKSB7CisgICAgICAgIFY4TlBPYmplY3QqIG9iamVjdCA9IHJlaW50ZXJwcmV0X2Nh
c3Q8VjhOUE9iamVjdCo+KG5wb2JqKTsKKworICAgICAgICBQcml2YXRlSWRlbnRpZmllciAqaWRl
bnRpZmllciA9IHN0YXRpY19jYXN0PFByaXZhdGVJZGVudGlmaWVyKj4obWV0aG9kTmFtZSk7Cisg
ICAgICAgIGlmICghaWRlbnRpZmllci0+aXNTdHJpbmcpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgICAgICAvLyBG
SVhNRTogc2hvdWxkIHVzZSB0aGUgcGx1Z2luJ3Mgb3duZXIgZnJhbWUgYXMgdGhlIHNlY3VyaXR5
IGNvbnRleHQuCisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4
Q29udGV4dChucHAsIG5wb2JqKTsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29w
ZShjb250ZXh0KTsKKworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgdGhlICJldmFsIiBtZXRob2Qu
CisgICAgICAgIGlmIChtZXRob2ROYW1lID09IE5QTl9HZXRTdHJpbmdJZGVudGlmaWVyKCJldmFs
IikpIHsKKyAgICAgICAgICBpZiAoYXJndW1lbnRDb3VudCAhPSAxKQorICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgICAgaWYgKGFyZ3VtZW50c1swXS50eXBlICE9IE5QVmFyaWFu
dFR5cGVfU3RyaW5nKQorICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgcmV0
dXJuIE5QTl9FdmFsdWF0ZShucHAsIG5wb2JqLCBjb25zdF9jYXN0PE5QU3RyaW5nKj4oJmFyZ3Vt
ZW50c1swXS52YWx1ZS5zdHJpbmdWYWx1ZSksIHJlc3VsdCk7CisgICAgICAgIH0KKworICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZnVuY09iaiA9IG9iamVjdC0+djhPYmplY3QtPkdldCh2
ODo6U3RyaW5nOjpOZXcoaWRlbnRpZmllci0+dmFsdWUuc3RyaW5nKSk7CisgICAgICAgIGlmIChm
dW5jT2JqLklzRW1wdHkoKSB8fCBmdW5jT2JqLT5Jc051bGwoKSkgeworICAgICAgICAgICAgTlVM
TF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgaWYgKGZ1bmNPYmotPklzVW5kZWZpbmVkKCkpIHsKKyAgICAgICAgICAg
IFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisKKyAgICAgICAgVjhQcm94eSogcHJveHkgPSB0b1Y4UHJveHkobnBvYmopOwor
ICAgICAgICBBU1NFUlQocHJveHkpOyAgLy8gTXVzdCBub3QgYmUgTlVMTC4KKworICAgICAgICAv
LyBGSVhNRTogRml4IHZhcmlhYmxlIG5hbWluZy4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2Fs
bCB0aGUgZnVuY3Rpb24gb2JqZWN0LgorICAgICAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4g
ZnVuYyA9IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPjo6Q2FzdChmdW5jT2JqKTsKKyAgICAgICAg
Ly8gQ3JlYXRlIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdjgKKyAgICAgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+KiBhcmd2ID0gbGlzdEZyb21WYXJpYW50QXJncyhhcmd1bWVudHMsIGFy
Z3VtZW50Q291bnQsIG5wb2JqKTsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcmVzdWx0
T2JqID0gcHJveHktPkNhbGxGdW5jdGlvbihmdW5jLCBvYmplY3QtPnY4T2JqZWN0LCBhcmd1bWVu
dENvdW50LCBhcmd2KTsKKyAgICAgICAgZGVsZXRlW10gYXJndjsKKworICAgICAgICAvLyBJZiB3
ZSBoYWQgYW4gZXJyb3IsIHJldHVybiBmYWxzZS4gIFRoZSBzcGVjIGlzIGEgbGl0dGxlIHVuY2xl
YXIgaGVyZSwgYnV0IHNheXMgIlJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIHdhcworICAgICAg
ICAvLyBzdWNjZXNzZnVsbHkgaW52b2tlZCIuICBJZiB3ZSBnZXQgYW4gZXJyb3IgcmV0dXJuIHZh
bHVlLCB3YXMgdGhhdCBzdWNjZXNzZnVsbHkgaW52b2tlZD8KKyAgICAgICAgaWYgKHJlc3VsdE9i
ai5Jc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gQ29u
dmVydCB0aGUgcmVzdWx0IGJhY2sgdG8gYW4gTlBWYXJpYW50LgorICAgICAgICBjb252ZXJ0VjhP
YmplY3RUb05QVmFyaWFudChyZXN1bHRPYmosIG5wb2JqLCByZXN1bHQpOworICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobnBvYmotPl9jbGFzcy0+aW52b2tlKQorICAgICAg
ICByZXR1cm4gbnBvYmotPl9jbGFzcy0+aW52b2tlKG5wb2JqLCBtZXRob2ROYW1lLCBhcmd1bWVu
dHMsIGFyZ3VtZW50Q291bnQsIHJlc3VsdCk7CisKKyAgICBWT0lEX1RPX05QVkFSSUFOVCgqcmVz
dWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRklYTUU6IEZpeCBpdCBzYW1lIGFzIE5Q
Tl9JbnZva2UgKEhhbmRsZVNjb3BlIGFuZCBzdWNoKS4KK2Jvb2wgTlBOX0ludm9rZURlZmF1bHQo
TlBQIG5wcCwgTlBPYmplY3QqIG5wb2JqLCBjb25zdCBOUFZhcmlhbnQqIGFyZ3VtZW50cywgdWlu
dDMyX3QgYXJndW1lbnRDb3VudCwgTlBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKCFucG9i
aikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG5wb2JqLT5fY2xhc3MgPT0gbnBT
Y3JpcHRPYmplY3RDbGFzcykgeworICAgICAgICBWOE5QT2JqZWN0KiBvYmplY3QgPSByZWludGVy
cHJldF9jYXN0PFY4TlBPYmplY3QqPihucG9iaik7CisKKyAgICAgICAgVk9JRF9UT19OUFZBUklB
TlQoKnJlc3VsdCk7CisKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAg
ICAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdG9WOENvbnRleHQobnBwLCBu
cG9iaik7CisgICAgICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisK
KyAgICAgICAgLy8gTG9va3VwIHRoZSBmdW5jdGlvbiBvYmplY3QuCisgICAgICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gZnVuY09iaihvYmplY3QtPnY4T2JqZWN0KTsKKyAgICAgICAgaWYgKCFm
dW5jT2JqLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAg
ICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gb2JqZWN0LgorICAgICAgICB2ODo6TG9jYWw8djg6OlZh
bHVlPiByZXN1bHRPYmo7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBmdW5jKHY4
OjpGdW5jdGlvbjo6Q2FzdCgqZnVuY09iaikpOworICAgICAgICBpZiAoIWZ1bmMtPklzTnVsbCgp
KSB7CisgICAgICAgICAgICBWOFByb3h5KiBwcm94eSA9IHRvVjhQcm94eShucG9iaik7CisgICAg
ICAgICAgICBBU1NFUlQocHJveHkpOworCisgICAgICAgICAgICAvLyBDcmVhdGUgbGlzdCBvZiBh
cmd1bWVudHMgdG8gcGFzcyB0byB2OC4KKyAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiogYXJndiA9IGxpc3RGcm9tVmFyaWFudEFyZ3MoYXJndW1lbnRzLCBhcmd1bWVudENvdW50LCBu
cG9iaik7CisgICAgICAgICAgICByZXN1bHRPYmogPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKGZ1bmMs
IGZ1bmNPYmosIGFyZ3VtZW50Q291bnQsIGFyZ3YpOworICAgICAgICAgICAgZGVsZXRlW10gYXJn
djsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGhhZCBhbiBlcnJvciwgcmV0dXJuIGZh
bHNlLiAgVGhlIHNwZWMgaXMgYSBsaXR0bGUgdW5jbGVhciBoZXJlLCBidXQgc2F5cyAiUmV0dXJu
cyB0cnVlIGlmIHRoZSBtZXRob2Qgd2FzCisgICAgICAgIC8vIHN1Y2Nlc3NmdWxseSBpbnZva2Vk
Ii4gIElmIHdlIGdldCBhbiBlcnJvciByZXR1cm4gdmFsdWUsIHdhcyB0aGF0IHN1Y2Nlc3NmdWxs
eSBpbnZva2VkPworICAgICAgICBpZiAocmVzdWx0T2JqLklzRW1wdHkoKSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBDb252ZXJ0IHRoZSByZXN1bHQgYmFjayB0byBh
biBOUFZhcmlhbnQuCisgICAgICAgIGNvbnZlcnRWOE9iamVjdFRvTlBWYXJpYW50KHJlc3VsdE9i
aiwgbnBvYmosIHJlc3VsdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlm
IChucG9iai0+X2NsYXNzLT5pbnZva2VEZWZhdWx0KQorICAgICAgICByZXR1cm4gbnBvYmotPl9j
bGFzcy0+aW52b2tlRGVmYXVsdChucG9iaiwgYXJndW1lbnRzLCBhcmd1bWVudENvdW50LCByZXN1
bHQpOworCisgICAgVk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7
Cit9CisKK2Jvb2wgTlBOX0V2YWx1YXRlKE5QUCBucHAsIE5QT2JqZWN0KiBucG9iaiwgTlBTdHJp
bmcqIG5wc2NyaXB0LCBOUFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBib29sIHBvcHVwc0FsbG93
ZWQgPSBXZWJDb3JlOjpDaHJvbWl1bUJyaWRnZTo6cG9wdXBzQWxsb3dlZChucHApOworICAgIHJl
dHVybiBOUE5fRXZhbHVhdGVIZWxwZXIobnBwLCBwb3B1cHNBbGxvd2VkLCBucG9iaiwgbnBzY3Jp
cHQsIHJlc3VsdCk7Cit9CisKK2Jvb2wgTlBOX0V2YWx1YXRlSGVscGVyKE5QUCBucHAsIGJvb2wg
cG9wdXBzQWxsb3dlZCwgTlBPYmplY3QqIG5wb2JqLCBOUFN0cmluZyogbnBzY3JpcHQsIE5QVmFy
aWFudCogcmVzdWx0KQoreworICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAgIGlm
ICghbnBvYmopCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucG9iai0+X2NsYXNz
ICE9IG5wU2NyaXB0T2JqZWN0Q2xhc3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBj
b250ZXh0ID0gdG9WOENvbnRleHQobnBwLCBucG9iaik7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0
eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBWOFByb3h5KiBwcm94eSA9IHRvVjhQ
cm94eShucG9iaik7CisgICAgQVNTRVJUKHByb3h5KTsKKworICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBzY29wZShjb250ZXh0KTsKKworICAgIFdlYkNvcmU6OlN0cmluZyBmaWxlbmFtZTsKKyAgICBp
ZiAoIXBvcHVwc0FsbG93ZWQpCisgICAgICAgIGZpbGVuYW1lID0gIm5wc2NyaXB0IjsKKworICAg
IC8vIENvbnZlcnQgVVRGLTggc3RyZWFtIHRvIFdlYkNvcmU6OlN0cmluZy4KKyAgICBXZWJDb3Jl
OjpTdHJpbmcgc2NyaXB0ID0gV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRGOChucHNjcmlwdC0+VVRG
OENoYXJhY3RlcnMsIG5wc2NyaXB0LT5VVEY4TGVuZ3RoKTsKKyAgICB2ODo6TG9jYWw8djg6OlZh
bHVlPiB2OHJlc3VsdCA9IHByb3h5LT5ldmFsdWF0ZShXZWJDb3JlOjpTY3JpcHRTb3VyY2VDb2Rl
KHNjcmlwdCwgV2ViQ29yZTo6S1VSTChmaWxlbmFtZSkpLCAwKTsKKworICAgIC8vIElmIHdlIGhh
ZCBhbiBlcnJvciwgcmV0dXJuIGZhbHNlLgorICAgIGlmICh2OHJlc3VsdC5Jc0VtcHR5KCkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnZlcnRWOE9iamVjdFRvTlBWYXJpYW50KHY4
cmVzdWx0LCBucG9iaiwgcmVzdWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOUE5f
R2V0UHJvcGVydHkoTlBQIG5wcCwgTlBPYmplY3QqIG5wb2JqLCBOUElkZW50aWZpZXIgcHJvcGVy
dHlOYW1lLCBOUFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoIW5wb2JqKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBvYmotPl9jbGFzcyA9PSBucFNjcmlwdE9iamVjdENs
YXNzKSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhO
UE9iamVjdCo+KG5wb2JqKTsKKworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7
CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dChu
cHAsIG5wb2JqKTsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0
KTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaihvYmplY3QtPnY4T2JqZWN0
KTsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdjhyZXN1bHQgPSBvYmotPkdldChucElk
ZW50aWZpZXJUb1Y4SWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpKTsKKworICAgICAgICBjb252ZXJ0
VjhPYmplY3RUb05QVmFyaWFudCh2OHJlc3VsdCwgbnBvYmosIHJlc3VsdCk7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChucG9iai0+X2NsYXNzLT5oYXNQcm9wZXJ0eSAm
JiBucG9iai0+X2NsYXNzLT5nZXRQcm9wZXJ0eSkgeworICAgICAgICBpZiAobnBvYmotPl9jbGFz
cy0+aGFzUHJvcGVydHkobnBvYmosIHByb3BlcnR5TmFtZSkpCisgICAgICAgICAgICByZXR1cm4g
bnBvYmotPl9jbGFzcy0+Z2V0UHJvcGVydHkobnBvYmosIHByb3BlcnR5TmFtZSwgcmVzdWx0KTsK
KyAgICB9CisKKyAgICBWT0lEX1RPX05QVkFSSUFOVCgqcmVzdWx0KTsKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK2Jvb2wgTlBOX1NldFByb3BlcnR5KE5QUCBucHAsIE5QT2JqZWN0KiBucG9iaiwg
TlBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSwgY29uc3QgTlBWYXJpYW50KiB2YWx1ZSkKK3sKKyAg
ICBpZiAoIW5wb2JqKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBvYmotPl9j
bGFzcyA9PSBucFNjcmlwdE9iamVjdENsYXNzKSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVj
dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KG5wb2JqKTsKKworICAgICAgICB2ODo6
SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+
IGNvbnRleHQgPSB0b1Y4Q29udGV4dChucHAsIG5wb2JqKTsKKyAgICAgICAgaWYgKGNvbnRleHQu
SXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHY4OjpDb250
ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IG9iaihvYmplY3QtPnY4T2JqZWN0KTsKKyAgICAgICAgb2JqLT5TZXQobnBJZGVudGlmaWVy
VG9WOElkZW50aWZpZXIocHJvcGVydHlOYW1lKSwKKyAgICAgICAgICAgICAgICAgY29udmVydE5Q
VmFyaWFudFRvVjhPYmplY3QodmFsdWUsIG9iamVjdC0+cm9vdE9iamVjdC0+ZnJhbWUoKS0+c2Ny
aXB0KCktPndpbmRvd1NjcmlwdE5QT2JqZWN0KCkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorCisgICAgaWYgKG5wb2JqLT5fY2xhc3MtPnNldFByb3BlcnR5KQorICAgICAgICByZXR1
cm4gbnBvYmotPl9jbGFzcy0+c2V0UHJvcGVydHkobnBvYmosIHByb3BlcnR5TmFtZSwgdmFsdWUp
OworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE5QTl9SZW1vdmVQcm9wZXJ0eShOUFAg
bnBwLCBOUE9iamVjdCogbnBvYmosIE5QSWRlbnRpZmllciBwcm9wZXJ0eU5hbWUpCit7CisgICAg
aWYgKCFucG9iaikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChucG9iai0+X2NsYXNz
ICE9IG5wU2NyaXB0T2JqZWN0Q2xhc3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFY4
TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KG5wb2JqKTsK
KworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpD
b250ZXh0PiBjb250ZXh0ID0gdG9WOENvbnRleHQobnBwLCBucG9iaik7CisgICAgaWYgKGNvbnRl
eHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgdjg6OkNvbnRleHQ6OlNj
b3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmoob2Jq
ZWN0LT52OE9iamVjdCk7CisgICAgLy8gRklYTUUobWJlbHNoZSk6IFZlcmlmeSB0aGF0IHNldHRp
bmcgdG8gdW5kZWZpbmVkIGlzIHJpZ2h0LgorICAgIG9iai0+U2V0KG5wSWRlbnRpZmllclRvVjhJ
ZGVudGlmaWVyKHByb3BlcnR5TmFtZSksIHY4OjpVbmRlZmluZWQoKSk7CisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2Jvb2wgTlBOX0hhc1Byb3BlcnR5KE5QUCBucHAsIE5QT2JqZWN0KiBucG9iaiwg
TlBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSkKK3sKKyAgICBpZiAoIW5wb2JqKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBvYmotPl9jbGFzcyA9PSBucFNjcmlwdE9iamVjdENs
YXNzKSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhO
UE9iamVjdCo+KG5wb2JqKTsKKworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7
CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dChu
cHAsIG5wb2JqKTsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7
CisKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmoob2JqZWN0LT52OE9iamVjdCk7
CisgICAgICAgIHJldHVybiBvYmotPkhhcyhucElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcihwcm9w
ZXJ0eU5hbWUpKTsKKyAgICB9CisKKyAgICBpZiAobnBvYmotPl9jbGFzcy0+aGFzUHJvcGVydHkp
CisgICAgICAgIHJldHVybiBucG9iai0+X2NsYXNzLT5oYXNQcm9wZXJ0eShucG9iaiwgcHJvcGVy
dHlOYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTlBOX0hhc01ldGhvZChOUFAg
bnBwLCBOUE9iamVjdCogbnBvYmosIE5QSWRlbnRpZmllciBtZXRob2ROYW1lKQoreworICAgIGlm
ICghbnBvYmopCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucG9iai0+X2NsYXNz
ID09IG5wU2NyaXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAgVjhOUE9iamVjdCAqb2JqZWN0ID0g
cmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBvYmopOworCisgICAgICAgIHY4OjpIYW5k
bGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29u
dGV4dCA9IHRvVjhDb250ZXh0KG5wcCwgbnBvYmopOworICAgICAgICBpZiAoY29udGV4dC5Jc0Vt
cHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHY4OjpDb250ZXh0OjpT
Y29wZSBzY29wZShjb250ZXh0KTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9i
aihvYmplY3QtPnY4T2JqZWN0KTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHByb3Ag
PSBvYmotPkdldChucElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcihtZXRob2ROYW1lKSk7CisgICAg
ICAgIHJldHVybiBwcm9wLT5Jc0Z1bmN0aW9uKCk7CisgICAgfQorCisgICAgaWYgKG5wb2JqLT5f
Y2xhc3MtPmhhc01ldGhvZCkKKyAgICAgICAgcmV0dXJuIG5wb2JqLT5fY2xhc3MtPmhhc01ldGhv
ZChucG9iaiwgbWV0aG9kTmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE5QTl9T
ZXRFeGNlcHRpb24oTlBPYmplY3QqIG5wb2JqLCBjb25zdCBOUFVURjggKm1lc3NhZ2UpCit7Cisg
ICAgaWYgKG5wb2JqLT5fY2xhc3MgIT0gbnBTY3JpcHRPYmplY3RDbGFzcykKKyAgICAgICAgcmV0
dXJuOworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4
OjpDb250ZXh0PiBjb250ZXh0ID0gdG9WOENvbnRleHQoMCwgbnBvYmopOworICAgIGlmIChjb250
ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdjg6OkNvbnRleHQ6OlNjb3Bl
IHNjb3BlKGNvbnRleHQpOworICAgIFY4UHJveHk6OlRocm93RXJyb3IoVjhQcm94eTo6R0VORVJB
TF9FUlJPUiwgbWVzc2FnZSk7Cit9CisKK2Jvb2wgTlBOX0VudW1lcmF0ZShOUFAgbnBwLCBOUE9i
amVjdCogbnBvYmosIE5QSWRlbnRpZmllcioqIGlkZW50aWZpZXIsIHVpbnQzMl90KiBjb3VudCkK
K3sKKyAgICBpZiAoIW5wb2JqKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBv
YmotPl9jbGFzcyA9PSBucFNjcmlwdE9iamVjdENsYXNzKSB7CisgICAgICAgIFY4TlBPYmplY3Qg
Km9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KG5wb2JqKTsKKworICAgICAg
ICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dChucHAsIG5wb2JqKTsKKyAgICAgICAgaWYgKGNv
bnRleHQuSXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB2ODo6
Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0PiBvYmoob2JqZWN0LT52OE9iamVjdCk7CisKKyAgICAgICAgLy8gRklYTUUoZnFpYW4p
OiBodHRwOi8vYi9pc3N1ZT9pZD0xMjEwMzQwOiBVc2UgYSB2ODo6T2JqZWN0OjpLZXlzKCkgbWV0
aG9kIHdoZW4gaXQgZXhpc3RzLCBpbnN0ZWFkIG9mIGV2YWx1YXRpbmcgamF2YXNjcmlwdC4KKwor
ICAgICAgICAvLyBGSVhNRShtcGNvbXBsZXRlKTogRmlndXJlIG91dCBob3cgdG8gY2FjaGUgdGhp
cyBoZWxwZXIgZnVuY3Rpb24uICBSdW4gYSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBjb2xsZWN0cyB0
aGUgcHJvcGVydGllcworICAgICAgICAvLyBvbiB0aGUgb2JqZWN0IGludG8gYW4gYXJyYXkuCisg
ICAgICAgIGNvbnN0IGNoYXIgZW51bWVyYXRvckNvZGVbXSA9CisgICAgICAgICAgICAiKGZ1bmN0
aW9uIChvYmopIHsiCisgICAgICAgICAgICAiICB2YXIgcHJvcHMgPSBbXTsiCisgICAgICAgICAg
ICAiICBmb3IgKHZhciBwcm9wIGluIG9iaikgeyIKKyAgICAgICAgICAgICIgICAgcHJvcHNbcHJv
cHMubGVuZ3RoXSA9IHByb3A7IgorICAgICAgICAgICAgIiAgfSIKKyAgICAgICAgICAgICIgIHJl
dHVybiBwcm9wczsiCisgICAgICAgICAgICAifSk7IjsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6
U3RyaW5nPiBzb3VyY2UgPSB2ODo6U3RyaW5nOjpOZXcoZW51bWVyYXRvckNvZGUpOworICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNjcmlwdCA9IHY4OjpTY3JpcHQ6OkNvbXBpbGUoc291
cmNlLCAwKTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGVudW1lcmF0b3JPYmogPSBz
Y3JpcHQtPlJ1bigpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZW51bWVyYXRv
ciA9IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPjo6Q2FzdChlbnVtZXJhdG9yT2JqKTsKKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3ZbXSA9IHsgb2JqIH07CisgICAgICAgIHY4OjpM
b2NhbDx2ODo6VmFsdWU+IHByb3BzT2JqID0gZW51bWVyYXRvci0+Q2FsbCh2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+OjpDYXN0KGVudW1lcmF0b3JPYmopLCBBUlJBWVNJWkVfVU5TQUZFKGFyZ3YpLCBh
cmd2KTsKKyAgICAgICAgaWYgKHByb3BzT2JqLklzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgICAgICAvLyBDb252ZXJ0IHRoZSByZXN1bHRzIGludG8gYW4gYXJyYXkg
b2YgTlBJZGVudGlmaWVycy4KKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BzID0g
djg6OkhhbmRsZTx2ODo6QXJyYXk+OjpDYXN0KHByb3BzT2JqKTsKKyAgICAgICAgKmNvdW50ID0g
cHJvcHMtPkxlbmd0aCgpOworICAgICAgICAqaWRlbnRpZmllciA9IHN0YXRpY19jYXN0PE5QSWRl
bnRpZmllcio+KG1hbGxvYyhzaXplb2YoTlBJZGVudGlmaWVyKikgKiAqY291bnQpKTsKKyAgICAg
ICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8ICpjb3VudDsgKytpKSB7CisgICAgICAgICAgICB2
ODo6TG9jYWw8djg6OlZhbHVlPiBuYW1lID0gcHJvcHMtPkdldCh2ODo6SW50ZWdlcjo6TmV3KGkp
KTsKKyAgICAgICAgICAgICgqaWRlbnRpZmllcilbaV0gPSBnZXRTdHJpbmdJZGVudGlmaWVyKHY4
OjpMb2NhbDx2ODo6U3RyaW5nPjo6Q2FzdChuYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKE5QX0NMQVNTX1NUUlVDVF9WRVJTSU9OX0hBU19F
TlVNKG5wb2JqLT5fY2xhc3MpICYmIG5wb2JqLT5fY2xhc3MtPmVudW1lcmF0ZSkKKyAgICAgICBy
ZXR1cm4gbnBvYmotPl9jbGFzcy0+ZW51bWVyYXRlKG5wb2JqLCBpZGVudGlmaWVyLCBjb3VudCk7
CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTlBOX0NvbnN0cnVjdChOUFAgbnBwLCBO
UE9iamVjdCogbnBvYmosIGNvbnN0IE5QVmFyaWFudCogYXJndW1lbnRzLCB1aW50MzJfdCBhcmd1
bWVudENvdW50LCBOUFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoIW5wb2JqKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBvYmotPl9jbGFzcyA9PSBucFNjcmlwdE9iamVj
dENsYXNzKSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8
VjhOUE9iamVjdCo+KG5wb2JqKTsKKworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2Nv
cGU7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4
dChucHAsIG5wb2JqKTsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4
dCk7CisKKyAgICAgICAgLy8gTG9va3VwIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjdG9yT2JqKG9iamVjdC0+djhPYmplY3QpOworICAg
ICAgICBpZiAoIWN0b3JPYmotPklzRnVuY3Rpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICAvLyBDYWxsIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gcmVzdWx0T2JqOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4g
Y3Rvcih2ODo6RnVuY3Rpb246OkNhc3QoKmN0b3JPYmopKTsKKyAgICAgICAgaWYgKCFjdG9yLT5J
c051bGwoKSkgeworICAgICAgICAgICAgVjhQcm94eSogcHJveHkgPSB0b1Y4UHJveHkobnBvYmop
OworICAgICAgICAgICAgQVNTRVJUKHByb3h5KTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGxp
c3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdjguCisgICAgICAgICAgICB2ODo6SGFuZGxlPHY4
OjpWYWx1ZT4qIGFyZ3YgPSBsaXN0RnJvbVZhcmlhbnRBcmdzKGFyZ3VtZW50cywgYXJndW1lbnRD
b3VudCwgbnBvYmopOworICAgICAgICAgICAgcmVzdWx0T2JqID0gcHJveHktPk5ld0luc3RhbmNl
KGN0b3IsIGFyZ3VtZW50Q291bnQsIGFyZ3YpOworICAgICAgICAgICAgZGVsZXRlW10gYXJndjsK
KyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGhhZCBhbiBlcnJvciByZXR1cm4gZmFsc2Uu
CisgICAgICAgIGlmIChyZXN1bHRPYmouSXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIC8vIENvbnZlcnQgdGhlIHJlc3VsdCBiYWNrIHRvIGFuIE5QVmFyaWFu
dC4KKyAgICAgICAgY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQocmVzdWx0T2JqLCBucG9iaiwg
cmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKE5QX0NMQVNT
X1NUUlVDVF9WRVJTSU9OX0hBU19DVE9SKG5wb2JqLT5fY2xhc3MpICYmIG5wb2JqLT5fY2xhc3Mt
PmNvbnN0cnVjdCkKKyAgICAgICAgcmV0dXJuIG5wb2JqLT5fY2xhc3MtPmNvbnN0cnVjdChucG9i
aiwgYXJndW1lbnRzLCBhcmd1bWVudENvdW50LCByZXN1bHQpOworCisgICAgcmV0dXJuIGZhbHNl
OworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9OUFY4T2JqZWN0LmggYi9XZWJD
b3JlL2JpbmRpbmdzL3Y4L05QVjhPYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi5iMDRlOTllCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9O
UFY4T2JqZWN0LmgKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0y
MDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
ICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAg
ICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMK
KyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVj
dHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
VEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFO
WSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBO
TyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgTlBWOE9iamVjdF9oCisjZGVm
aW5lIE5QVjhPYmplY3RfaAorCisjaW5jbHVkZSAiYmluZGluZ3MvbnBydW50aW1lLmgiCisjaW5j
bHVkZSA8djguaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNzIERPTVdpbmRvdzsK
K30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworZXh0ZXJuIE5QQ2xhc3MqIG5wU2NyaXB0T2JqZWN0
Q2xhc3M7CisKKy8vIEEgVjhOUE9iamVjdCBpcyBhIE5QT2JqZWN0IHdoaWNoIGNhcnJpZXMgYWRk
aXRpb25hbCBWOC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gSXQgaXMgYWxsb2NhdGVkIGFuZCBkZWFs
bG9jYXRlZCBieQorLy8gQWxsb2NWOE5QT2JqZWN0KCkgYW5kIEZyZWVWOE5QT2JqZWN0KCkgbWV0
aG9kcy4KK3N0cnVjdCBWOE5QT2JqZWN0IHsKKyAgICBOUE9iamVjdCBvYmplY3Q7CisgICAgdjg6
OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gdjhPYmplY3Q7CisgICAgV2ViQ29yZTo6RE9NV2luZG93
KiByb290T2JqZWN0OworfTsKKworc3RydWN0IFByaXZhdGVJZGVudGlmaWVyIHsKKyAgICB1bmlv
biB7CisgICAgICAgIGNvbnN0IE5QVVRGOCogc3RyaW5nOworICAgICAgICBpbnQzMl90IG51bWJl
cjsKKyAgICB9IHZhbHVlOworICAgIGJvb2wgaXNTdHJpbmc7Cit9OworCitOUE9iamVjdCogbnBD
cmVhdGVWOFNjcmlwdE9iamVjdChOUFAgbnBwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+LCBXZWJD
b3JlOjpET01XaW5kb3cqKTsKKworI2VuZGlmIC8vIE5QVjhPYmplY3RfaApkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9iaW5kaW5ncy92OC9WOE5QVXRpbHMuY3BwIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9W
OE5QVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViZTZmYmQK
LS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4TlBVdGlscy5jcHAKQEAg
LTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBHb29nbGUgSW5j
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
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlY4TlBV
dGlscy5oIgorCisjaW5jbHVkZSAiRE9NV2luZG93LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI3VuZGVmIExPRworCisjaW5jbHVkZSAiTlBWOE9i
amVjdC5oIgorI2luY2x1ZGUgIlY4TlBPYmplY3QuaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCisj
aW5jbHVkZSAibnBydW50aW1lX3ByaXYuaCIKKwordm9pZCBjb252ZXJ0VjhPYmplY3RUb05QVmFy
aWFudCh2ODo6TG9jYWw8djg6OlZhbHVlPiBvYmplY3QsIE5QT2JqZWN0KiBvd25lciwgTlBWYXJp
YW50KiByZXN1bHQpCit7CisgICAgVk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisKKyAgICAv
LyBJdCBpcyByZWFsbHkgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlYWwgd2l0aCB0
aGUgZW1wdHkgaGFuZGxlIGNhc2UgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBkaWZmZXJlbnQgYWN0
aW9ucyB0bworICAgIC8vIHRha2UgaW4gZGlmZmVyZW50IGNvbnRleHRzLgorICAgIEFTU0VSVCgh
b2JqZWN0LklzRW1wdHkoKSk7CisKKyAgICBpZiAob2JqZWN0LklzRW1wdHkoKSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKG9iamVjdC0+SXNJbnQzMigpKQorICAgICAgICBJTlQzMl9UT19O
UFZBUklBTlQob2JqZWN0LT5OdW1iZXJWYWx1ZSgpLCAqcmVzdWx0KTsKKyAgICBlbHNlIGlmIChv
YmplY3QtPklzTnVtYmVyKCkpCisgICAgICAgIERPVUJMRV9UT19OUFZBUklBTlQob2JqZWN0LT5O
dW1iZXJWYWx1ZSgpLCAqcmVzdWx0KTsKKyAgICBlbHNlIGlmIChvYmplY3QtPklzQm9vbGVhbigp
KQorICAgICAgICBCT09MRUFOX1RPX05QVkFSSUFOVChvYmplY3QtPkJvb2xlYW5WYWx1ZSgpLCAq
cmVzdWx0KTsKKyAgICBlbHNlIGlmIChvYmplY3QtPklzTnVsbCgpKQorICAgICAgICBOVUxMX1RP
X05QVkFSSUFOVCgqcmVzdWx0KTsKKyAgICBlbHNlIGlmIChvYmplY3QtPklzVW5kZWZpbmVkKCkp
CisgICAgICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAgIGVsc2UgaWYgKG9iamVj
dC0+SXNTdHJpbmcoKSkgeworICAgICAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOChvYmpl
Y3QpOworICAgICAgICBjaGFyKiB1dGY4X2NoYXJzID0gc3RyZHVwKCp1dGY4KTsKKyAgICAgICAg
U1RSSU5HTl9UT19OUFZBUklBTlQodXRmOF9jaGFycywgdXRmOC5sZW5ndGgoKSwgKnJlc3VsdCk7
CisgICAgfSBlbHNlIGlmIChvYmplY3QtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgV2ViQ29yZTo6
RE9NV2luZG93KiB3aW5kb3cgPSBXZWJDb3JlOjpWOFByb3h5OjpyZXRyaWV2ZVdpbmRvdygpOwor
ICAgICAgICBOUE9iamVjdCogbnBvYmplY3QgPSBucENyZWF0ZVY4U2NyaXB0T2JqZWN0KDAsIHY4
OjpIYW5kbGU8djg6Ok9iamVjdD46OkNhc3Qob2JqZWN0KSwgd2luZG93KTsKKyAgICAgICAgaWYg
KG5wb2JqZWN0KQorICAgICAgICAgICAgX05QTl9SZWdpc3Rlck9iamVjdChucG9iamVjdCwgb3du
ZXIpOworICAgICAgICBPQkpFQ1RfVE9fTlBWQVJJQU5UKG5wb2JqZWN0LCAqcmVzdWx0KTsKKyAg
ICB9Cit9CisKKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnROUFZhcmlhbnRUb1Y4T2Jq
ZWN0KGNvbnN0IE5QVmFyaWFudCogdmFyaWFudCwgTlBPYmplY3QqIG5wb2JqZWN0KQoreworICAg
IE5QVmFyaWFudFR5cGUgdHlwZSA9IHZhcmlhbnQtPnR5cGU7CisKKyAgICBpZiAodHlwZSA9PSBO
UFZhcmlhbnRUeXBlX0ludDMyKQorICAgICAgICByZXR1cm4gdjg6OkludGVnZXI6Ok5ldyhOUFZB
UklBTlRfVE9fSU5UMzIoKnZhcmlhbnQpKTsKKyAgICBpZiAodHlwZSA9PSBOUFZhcmlhbnRUeXBl
X0RvdWJsZSkKKyAgICAgICAgcmV0dXJuIHY4OjpOdW1iZXI6Ok5ldyhOUFZBUklBTlRfVE9fRE9V
QkxFKCp2YXJpYW50KSk7CisgICAgaWYgKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9Cb29sKQorICAg
ICAgICByZXR1cm4gTlBWQVJJQU5UX1RPX0JPT0xFQU4oKnZhcmlhbnQpID8gdjg6OlRydWUoKSA6
IHY4OjpGYWxzZSgpOworICAgIGlmICh0eXBlID09IE5QVmFyaWFudFR5cGVfTnVsbCkKKyAgICAg
ICAgcmV0dXJuIHY4OjpOdWxsKCk7CisgICAgaWYgKHR5cGUgPT0gTlBWYXJpYW50VHlwZV9Wb2lk
KQorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAgIGlmICh0eXBlID09IE5QVmFy
aWFudFR5cGVfU3RyaW5nKSB7CisgICAgICAgIE5QU3RyaW5nIHNyYyA9IE5QVkFSSUFOVF9UT19T
VFJJTkcoKnZhcmlhbnQpOworICAgICAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KHNyYy5VVEY4
Q2hhcmFjdGVycywgc3JjLlVURjhMZW5ndGgpOworICAgIH0KKyAgICBpZiAodHlwZSA9PSBOUFZh
cmlhbnRUeXBlX09iamVjdCkgeworICAgICAgICBOUE9iamVjdCogb2JqID0gTlBWQVJJQU5UX1RP
X09CSkVDVCgqdmFyaWFudCk7CisgICAgICAgIGlmIChvYmotPl9jbGFzcyA9PSBucFNjcmlwdE9i
amVjdENsYXNzKQorICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVj
dCo+KG9iaiktPnY4T2JqZWN0OworICAgICAgICByZXR1cm4gY3JlYXRlVjhPYmplY3RGb3JOUE9i
amVjdChvYmosIG5wb2JqZWN0KTsKKyAgICB9CisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsK
K30KKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBOUE4gU3RyaW5nIElkZW50aWZp
ZXIgZnJvbSBhIHY4IHN0cmluZy4KK05QSWRlbnRpZmllciBnZXRTdHJpbmdJZGVudGlmaWVyKHY4
OjpIYW5kbGU8djg6OlN0cmluZz4gc3RyKQoreworICAgIGNvbnN0IGludCBrU3RhY2tCdWZTaXpl
ID0gMTAwOworCisgICAgaW50IGJ1ZkxlbiA9IHN0ci0+TGVuZ3RoKCkgKyAxOworICAgIGlmIChi
dWZMZW4gPD0ga1N0YWNrQnVmU2l6ZSkgeworICAgICAgICAvLyBVc2UgbG9jYWwgc3RhY2sgYnVm
ZmVyIHRvIGF2b2lkIGhlYXAgYWxsb2NhdGlvbnMgZm9yIHNtYWxsIHN0cmluZ3MuIEhlcmUgd2Ug
c2hvdWxkIG9ubHkgdXNlIHRoZSBzdGFjayBzcGFjZSBmb3IKKyAgICAgICAgLy8gc3RhY2tfYnVm
IHdoZW4gaXQncyB1c2VkLCBub3Qgd2hlbiB3ZSB1c2UgdGhlIGhlYXAuCisgICAgICAgIGNoYXIg
c3RhY2tCdWZba1N0YWNrQnVmU2l6ZV07CisgICAgICAgIHN0ci0+V3JpdGVBc2NpaShzdGFja0J1
Zik7CisgICAgICAgIHJldHVybiBOUE5fR2V0U3RyaW5nSWRlbnRpZmllcihzdGFja0J1Zik7Cisg
ICAgfQorCisgICAgdjg6OlN0cmluZzo6QXNjaWlWYWx1ZSBhc2NpaShzdHIpOworICAgIHJldHVy
biBOUE5fR2V0U3RyaW5nSWRlbnRpZmllcigqYXNjaWkpOworfQpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9iaW5kaW5ncy92OC9WOE5QVXRpbHMuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhOUFV0aWxz
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA3Y2IxZQotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhOUFV0aWxzLmgKQEAgLTAsMCArMSwyNSBA
QAorLy8gQ29weXJpZ2h0IChjKSAyMDA2LTIwMDggVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBi
eSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5T
RSBmaWxlLgorCisjaWZuZGVmIFY4TlBVdGlsc19oCisjZGVmaW5lIFY4TlBVdGlsc19oCisKKyNp
bmNsdWRlIDx2OC5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L25wYXBpL2JpbmRpbmdzL25wcnVu
dGltZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgRnJhbWU7Cit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCisKKy8vIENvbnZlcnQgYSBWOCBWYWx1ZSBvZiBhbnkgdHlwZSAoc3Ry
aW5nLCBib29sLCBvYmplY3QsIGV0YykgdG8gYSBOUFZhcmlhbnQuCit2b2lkIGNvbnZlcnRWOE9i
amVjdFRvTlBWYXJpYW50KHY4OjpMb2NhbDx2ODo6VmFsdWU+IG9iamVjdCwgTlBPYmplY3QgKm93
bmVyLCBOUFZhcmlhbnQqIHJlc3VsdCk7CisKKy8vIENvbnZlcnQgYSBOUFZhcmlhbnQgKHN0cmlu
ZywgYm9vbCwgb2JqZWN0LCBldGMpIGJhY2sgdG8gYSBWOCBWYWx1ZS4gIFRoZSBvd25lciBvYmpl
Y3QgaXMgdGhlIE5QT2JqZWN0IHdoaWNoIHJlbGF0ZXMgdG8gdGhlCisvLyBvYmplY3QsIGlmIHRo
ZSBvYmplY3QgaXMgYW4gT2JqZWN0LiAgVGhlIGNyZWF0ZWQgTlBPYmplY3Qgd2lsbCBiZSB0aWVk
IHRvIHRoZSBsaWZldGltZSBvZiB0aGUgb3duZXIuCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29u
dmVydE5QVmFyaWFudFRvVjhPYmplY3QoY29uc3QgTlBWYXJpYW50KiB2YWx1ZSwgTlBPYmplY3Qq
IG93bmVyKTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBOUE4gU3RyaW5nIElk
ZW50aWZpZXIgZnJvbSBhIHY4IHN0cmluZy4KK05QSWRlbnRpZmllciBnZXRTdHJpbmdJZGVudGlm
aWVyKHY4OjpIYW5kbGU8djg6OlN0cmluZz4gc3RyKTsKKworI2VuZGlmIC8vIFY4TlBVdGlsc19o
Cg==
</data>
<flag name="review"
          id="16213"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31765</attachid>
            <date>2009-06-23 18:45:04 -0700</date>
            <delta_ts>2009-06-24 13:43:50 -0700</delta_ts>
            <desc>address eric&apos;s comments</desc>
            <filename>upstreamv8.patch</filename>
            <type>text/plain</type>
            <size>29502</size>
            <attacher name="Albert J. Wong">ajwong</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
Njk3NDhjOS4uOGRkMmNmNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNyBAQAorMjAwOS0wNi0yMyAgQWxiZXJ0IEouIFdv
bmcgIDxhandvbmdAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yNjU2NgorICAgICAgICBVcHN0cmVhbSB0aGVzZSBmaWxlcyBmcm9tIHRoZSBjaHJvbWl1bSB2
OCBjb2RlLiAgTm8gdGVzdHMgd2VyZQorICAgICAgICBhZmZlY3RlZCBiZWNhdXNlIHRoaXMgaXMg
ZXNzZW50aWFsbHkgYSBjb2RlIG1vdmUuCisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9OUFY4T2Jq
ZWN0LmNwcDogQWRkZWQuCisgICAgICAgIChhbGxvY1Y4TlBPYmplY3QpOgorICAgICAgICAoZnJl
ZVY4TlBPYmplY3QpOgorICAgICAgICAobGlzdEZyb21WYXJpYW50QXJncyk6CisgICAgICAgIChu
cElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcik6CisgICAgICAgIChucENyZWF0ZVY4U2NyaXB0T2Jq
ZWN0KToKKyAgICAgICAgKE5QTl9JbnZva2UpOgorICAgICAgICAoTlBOX0ludm9rZURlZmF1bHQp
OgorICAgICAgICAoTlBOX0V2YWx1YXRlKToKKyAgICAgICAgKE5QTl9FdmFsdWF0ZUhlbHBlcik6
CisgICAgICAgIChOUE5fR2V0UHJvcGVydHkpOgorICAgICAgICAoTlBOX1NldFByb3BlcnR5KToK
KyAgICAgICAgKE5QTl9SZW1vdmVQcm9wZXJ0eSk6CisgICAgICAgIChOUE5fSGFzUHJvcGVydHkp
OgorICAgICAgICAoTlBOX0hhc01ldGhvZCk6CisgICAgICAgIChOUE5fU2V0RXhjZXB0aW9uKToK
KyAgICAgICAgKE5QTl9FbnVtZXJhdGUpOgorICAgICAgICAoTlBOX0NvbnN0cnVjdCk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvTlBWOE9iamVjdC5oOiBBZGRlZC4KKyAgICAgICAgKFByaXZhdGVJ
ZGVudGlmaWVyOjopOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4TlBVdGlscy5jcHA6IEFkZGVk
LgorICAgICAgICAoY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQpOgorICAgICAgICAoY29udmVy
dE5QVmFyaWFudFRvVjhPYmplY3QpOgorICAgICAgICAoZ2V0U3RyaW5nSWRlbnRpZmllcik6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvVjhOUFV0aWxzLmg6IEFkZGVkLgorCiAyMDA5LTA2LTIyICBE
YXZpZCBIeWF0dCAgPGh5YXR0QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0g
V2VpbmlnLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9OUFY4T2JqZWN0LmNwcCBi
L1dlYkNvcmUvYmluZGluZ3MvdjgvTlBWOE9iamVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uMmQwYjJlNQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvTlBWOE9iamVjdC5jcHAKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDQsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBHb29nbGUsIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4K
KworI2luY2x1ZGUgPHY4Lmg+CisKKyNpbmNsdWRlICJDaHJvbWl1bUJyaWRnZS5oIgorI2luY2x1
ZGUgIkRPTVdpbmRvdy5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiTlBWOE9iamVj
dC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU2NyaXB0Q29udHJv
bGxlci5oIgorI2luY2x1ZGUgIlY4Q3VzdG9tQmluZGluZy5oIgorI2luY2x1ZGUgIlY4SGVscGVy
cy5oIgorI2luY2x1ZGUgIlY4TlBVdGlscy5oIgorI2luY2x1ZGUgIlY4UHJveHkuaCIKKyNpbmNs
dWRlICJiaW5kaW5ncy9ucHJ1bnRpbWUuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfcHJpdi5oIgor
Cit1c2luZyBXZWJDb3JlOjp0b1Y4Q29udGV4dDsKK3VzaW5nIFdlYkNvcmU6OnRvVjhQcm94eTsK
K3VzaW5nIFdlYkNvcmU6OlY4Q2xhc3NJbmRleDsKK3VzaW5nIFdlYkNvcmU6OlY4Q3VzdG9tOwor
dXNpbmcgV2ViQ29yZTo6VjhQcm94eTsKKworLy8gRklYTUUobWJlbHNoZSk6IENvbW1lbnRzIG9u
IHdoeSB1c2UgbWFsbG9jIGFuZCBmcmVlLgorc3RhdGljIE5QT2JqZWN0KiBhbGxvY1Y4TlBPYmpl
Y3QoTlBQLCBOUENsYXNzKikKK3sKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TlBPYmplY3QqPiht
YWxsb2Moc2l6ZW9mKFY4TlBPYmplY3QpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVWOE5QT2Jq
ZWN0KE5QT2JqZWN0KiBucE9iamVjdCkKK3sKKyAgICBWOE5QT2JqZWN0KiB2OE5wT2JqZWN0ID0g
cmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworI2lmbmRlZiBOREVCVUcK
KyAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFuZGxlKHY4TnBPYmplY3QsIHY4TnBPYmpl
Y3QtPnY4T2JqZWN0KTsKKyNlbmRpZgorICAgIHY4TnBPYmplY3QtPnY4T2JqZWN0LkRpc3Bvc2Uo
KTsKKyAgICBmcmVlKHY4TnBPYmplY3QpOworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+KiBjcmVhdGVWYWx1ZUxpc3RGcm9tVmFyaWFudEFyZ3MoY29uc3QgTlBWYXJpYW50KiBhcmd1
bWVudHMsIHVpbnQzMl90IGFyZ3VtZW50Q291bnQsIE5QT2JqZWN0KiBvd25lcikKK3sKKyAgICB2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIGFyZ3YgPSBuZXcgdjg6OkhhbmRsZTx2ODo6VmFsdWU+W2Fy
Z3VtZW50Q291bnRdOworICAgIGZvciAodWludDMyX3QgaW5kZXggPSAwOyBpbmRleCA8IGFyZ3Vt
ZW50Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgY29uc3QgTlBWYXJpYW50KiBhcmcgPSAmYXJn
dW1lbnRzW2luZGV4XTsKKyAgICAgICAgYXJndltpbmRleF0gPSBjb252ZXJ0TlBWYXJpYW50VG9W
OE9iamVjdChhcmcsIG93bmVyKTsKKyAgICB9CisgICAgcmV0dXJuIGFyZ3Y7Cit9CisKKy8vIENy
ZWF0ZSBhbiBpZGVudGlmaWVyIChudWxsIHRlcm1pbmF0ZWQgdXRmOCBjaGFyKikgZnJvbSB0aGUg
TlBJZGVudGlmaWVyLgorc3RhdGljIHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBucElkZW50aWZpZXJU
b1Y4SWRlbnRpZmllcihOUElkZW50aWZpZXIgbmFtZSkKK3sKKyAgICBQcml2YXRlSWRlbnRpZmll
ciogaWRlbnRpZmllciA9IHN0YXRpY19jYXN0PFByaXZhdGVJZGVudGlmaWVyKj4obmFtZSk7Cisg
ICAgaWYgKGlkZW50aWZpZXItPmlzU3RyaW5nKQorICAgICAgICByZXR1cm4gdjg6OlN0cmluZzo6
TmV3KHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihpZGVudGlmaWVyLT52YWx1ZS5zdHJpbmcpKTsK
KworICAgIGNoYXIgYnVmZmVyWzMyXTsKKyAgICBzbnByaW50ZihidWZmZXIsIHNpem9lZihidWZm
ZXIpLCAiJWQiLCBpZGVudGlmaWVyLT52YWx1ZS5udW1iZXIpOworICAgIHJldHVybiB2ODo6U3Ry
aW5nOjpOZXcoYnVmZmVyKTsKK30KKworc3RhdGljIE5QQ2xhc3MgVjhOUE9iamVjdENsYXNzID0g
eyBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgYWxsb2NWOE5QT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBmcmVlVjhOUE9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisvLyBOUEFQSSdzIG5wcnVudGltZSBmdW5jdGlv
bnMuCitOUENsYXNzKiBucFNjcmlwdE9iamVjdENsYXNzID0gJlY4TlBPYmplY3RDbGFzczsKKwor
TlBPYmplY3QqIG5wQ3JlYXRlVjhTY3JpcHRPYmplY3QoTlBQIG5wcCwgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0PiBvYmplY3QsIFdlYkNvcmU6OkRPTVdpbmRvdyogcm9vdCkKK3sKKyAgICB2ODo6TG9j
YWw8djg6OlZhbHVlPiB0eXBlSW5kZXggPSBvYmplY3QtPkdldEludGVybmFsRmllbGQoVjhDdXN0
b206OmtET01XcmFwcGVyVHlwZUluZGV4KTsKKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhpcyBv
YmplY3QgaXMgYWxyZWFkeSB3cmFwcGVkLgorICAgIGlmIChvYmplY3QtPkludGVybmFsRmllbGRD
b3VudCgpID09IFY4Q3VzdG9tOjprTlBPYmplY3RJbnRlcm5hbEZpZWxkQ291bnQgJiYKKyAgICAg
ICAgdHlwZUluZGV4LT5Jc051bWJlcigpICYmCisgICAgICAgIHR5cGVJbmRleC0+VWludDMyVmFs
dWUoKSA9PSBWOENsYXNzSW5kZXg6Ok5QT0JKRUNUKSB7CisKKyAgICAgICAgTlBPYmplY3QqIHJl
dHVyblZhbHVlID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TlBPYmplY3Q+KFY4Q2xhc3NJbmRl
eDo6TlBPQkpFQ1QsIG9iamVjdCk7CisgICAgICAgIE5QTl9SZXRhaW5PYmplY3QocmV0dXJuVmFs
dWUpOworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgVjhOUE9iamVj
dCogdjhucE9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KE5QTl9DcmVhdGVP
YmplY3QobnBwLCAmVjhOUE9iamVjdENsYXNzKSk7CisgICAgdjhucE9iamVjdC0+djhPYmplY3Qg
PSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KG9iamVjdCk7CisjaWZuZGVmIE5ERUJV
RworICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKFdlYkNvcmU6Ok5QT0JKRUNULCB2
OG5wT2JqZWN0LCB2OG5wT2JqZWN0LT52OE9iamVjdCk7CisjZW5kaWYKKyAgICB2OG5wT2JqZWN0
LT5yb290T2JqZWN0ID0gcm9vdDsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxOUE9iamVj
dCo+KHY4bnBPYmplY3QpOworfQorCitib29sIE5QTl9JbnZva2UoTlBQIG5wcCwgTlBPYmplY3Qq
IG5wT2JqZWN0LCBOUElkZW50aWZpZXIgbWV0aG9kTmFtZSwgY29uc3QgTlBWYXJpYW50KiBhcmd1
bWVudHMsIHVpbnQzMl90IGFyZ3VtZW50Q291bnQsIE5QVmFyaWFudCogcmVzdWx0KQoreworICAg
IGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVj
dC0+X2NsYXNzICE9IG5wU2NyaXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAgaWYgKG5wT2JqZWN0
LT5fY2xhc3MtPmludm9rZURlZmF1bHQpCisgICAgICAgICAgICByZXR1cm4gbnBPYmplY3QtPl9j
bGFzcy0+aW52b2tlRGVmYXVsdChucE9iamVjdCwgYXJndW1lbnRzLCBhcmd1bWVudENvdW50LCBy
ZXN1bHQpOworCisgICAgICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBWOE5QT2JqZWN0KiB2OE5wT2JqZWN0ID0gcmVpbnRl
cnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgUHJpdmF0ZUlkZW50aWZp
ZXIqIGlkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxQcml2YXRlSWRlbnRpZmllcio+KG1ldGhvZE5h
bWUpOworICAgIGlmICghaWRlbnRpZmllci0+aXNTdHJpbmcpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICAvLyBGSVhNRTogc2hv
dWxkIHVzZSB0aGUgcGx1Z2luJ3Mgb3duZXIgZnJhbWUgYXMgdGhlIHNlY3VyaXR5IGNvbnRleHQu
CisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250ZXh0KG5wcCwg
bnBPYmplY3QpOworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgLy8g
U3BlY2lhbCBjYXNlIHRoZSAiZXZhbCIgbWV0aG9kLgorICAgIGlmIChtZXRob2ROYW1lID09IE5Q
Tl9HZXRTdHJpbmdJZGVudGlmaWVyKCJldmFsIikpIHsKKyAgICAgICAgaWYgKGFyZ3VtZW50Q291
bnQgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGFyZ3VtZW50
c1swXS50eXBlICE9IE5QVmFyaWFudFR5cGVfU3RyaW5nKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICByZXR1cm4gTlBOX0V2YWx1YXRlKG5wcCwgbnBPYmplY3QsIGNvbnN0X2Nh
c3Q8TlBTdHJpbmcqPigmYXJndW1lbnRzWzBdLnZhbHVlLnN0cmluZ1ZhbHVlKSwgcmVzdWx0KTsK
KyAgICB9CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZnVuY3Rpb25PYmplY3QgPSB2OE5w
T2JqZWN0LT52OE9iamVjdC0+R2V0KHY4OjpTdHJpbmc6Ok5ldyhpZGVudGlmaWVyLT52YWx1ZS5z
dHJpbmcpKTsKKyAgICBpZiAoZnVuY3Rpb25PYmplY3QuSXNFbXB0eSgpIHx8IGZ1bmN0aW9uT2Jq
ZWN0LT5Jc051bGwoKSkgeworICAgICAgICBOVUxMX1RPX05QVkFSSUFOVCgqcmVzdWx0KTsKKyAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZnVuY3Rpb25PYmplY3QtPklzVW5k
ZWZpbmVkKCkpIHsKKyAgICAgICAgVk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWOFByb3h5KiBwcm94eSA9IHRvVjhQcm94eShu
cE9iamVjdCk7CisgICAgQVNTRVJUKHByb3h5KTsKKworICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9u
IG9iamVjdC4KKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSB2ODo6SGFu
ZGxlPHY4OjpGdW5jdGlvbj46OkNhc3QoZnVuY3Rpb25PYmplY3QpOworICAgIC8vIENyZWF0ZSBs
aXN0IG9mIGFyZ3VtZW50cyB0byBwYXNzIHRvIHY4LgorICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiogYXJndiA9IGNyZWF0ZVZhbHVlTGlzdEZyb21WYXJpYW50QXJncyhhcmd1bWVudHMsIGFyZ3Vt
ZW50Q291bnQsIG5wT2JqZWN0KTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiByZXN1bHRPYmpl
Y3QgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKGZ1bmN0aW9uLCB2OE5wT2JqZWN0LT52OE9iamVjdCwg
YXJndW1lbnRDb3VudCwgYXJndik7CisgICAgZGVsZXRlW10gYXJndjsKKworICAgIC8vIElmIHdl
IGhhZCBhbiBlcnJvciwgcmV0dXJuIGZhbHNlLiAgVGhlIHNwZWMgaXMgYSBsaXR0bGUgdW5jbGVh
ciBoZXJlLCBidXQgc2F5cyAiUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2Qgd2FzCisgICAgLy8g
c3VjY2Vzc2Z1bGx5IGludm9rZWQiLiAgSWYgd2UgZ2V0IGFuIGVycm9yIHJldHVybiB2YWx1ZSwg
d2FzIHRoYXQgc3VjY2Vzc2Z1bGx5IGludm9rZWQ/CisgICAgaWYgKHJlc3VsdE9iamVjdC5Jc0Vt
cHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIENvbnZlcnQgdGhlIHJlc3Vs
dCBiYWNrIHRvIGFuIE5QVmFyaWFudC4KKyAgICBjb252ZXJ0VjhPYmplY3RUb05QVmFyaWFudChy
ZXN1bHRPYmplY3QsIG5wT2JqZWN0LCByZXN1bHQpOworICAgIHJldHVybiB0cnVlOworfQorCisv
LyBGSVhNRTogRml4IGl0IHNhbWUgYXMgTlBOX0ludm9rZSAoSGFuZGxlU2NvcGUgYW5kIHN1Y2gp
LgorYm9vbCBOUE5fSW52b2tlRGVmYXVsdChOUFAgbnBwLCBOUE9iamVjdCogbnBPYmplY3QsIGNv
bnN0IE5QVmFyaWFudCogYXJndW1lbnRzLCB1aW50MzJfdCBhcmd1bWVudENvdW50LCBOUFZhcmlh
bnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoIW5wT2JqZWN0KQorICAgICAgICByZXR1cm4gZmFsc2U7
CisKKyAgICBpZiAobnBPYmplY3QtPl9jbGFzcyAhPSBucFNjcmlwdE9iamVjdENsYXNzKSB7Cisg
ICAgICAgIGlmIChucE9iamVjdC0+X2NsYXNzLT5pbnZva2VEZWZhdWx0KQorICAgICAgICAgICAg
cmV0dXJuIG5wT2JqZWN0LT5fY2xhc3MtPmludm9rZURlZmF1bHQobnBPYmplY3QsIGFyZ3VtZW50
cywgYXJndW1lbnRDb3VudCwgcmVzdWx0KTsKKworICAgICAgICBWT0lEX1RPX05QVkFSSUFOVCgq
cmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgVjhOUE9iamVjdCog
djhOcE9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KG5wT2JqZWN0KTsKKwor
ICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworCisgICAgdjg6OkhhbmRsZVNjb3BlIGhh
bmRsZVNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29u
dGV4dChucHAsIG5wT2JqZWN0KTsKKyAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsK
KworICAgIC8vIExvb2t1cCB0aGUgZnVuY3Rpb24gb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4gZnVuY3Rpb25PYmplY3QodjhOcE9iamVjdC0+djhPYmplY3QpOworICAgIGlmICgh
ZnVuY3Rpb25PYmplY3QtPklzRnVuY3Rpb24oKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gb2JqZWN0LgorICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+
IHJlc3VsdE9iamVjdDsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24odjg6
OkZ1bmN0aW9uOjpDYXN0KCpmdW5jdGlvbk9iamVjdCkpOworICAgIGlmICghZnVuY3Rpb24tPklz
TnVsbCgpKSB7CisgICAgICAgIFY4UHJveHkqIHByb3h5ID0gdG9WOFByb3h5KG5wT2JqZWN0KTsK
KyAgICAgICAgQVNTRVJUKHByb3h5KTsKKworICAgICAgICAvLyBDcmVhdGUgbGlzdCBvZiBhcmd1
bWVudHMgdG8gcGFzcyB0byB2OC4KKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KiBhcmd2
ID0gY3JlYXRlVmFsdWVMaXN0RnJvbVZhcmlhbnRBcmdzKGFyZ3VtZW50cywgYXJndW1lbnRDb3Vu
dCwgbnBPYmplY3QpOworICAgICAgICByZXN1bHRPYmplY3QgPSBwcm94eS0+Q2FsbEZ1bmN0aW9u
KGZ1bmN0aW9uLCBmdW5jdGlvbk9iamVjdCwgYXJndW1lbnRDb3VudCwgYXJndik7CisgICAgICAg
IGRlbGV0ZVtdIGFyZ3Y7CisgICAgfQorCisgICAgLy8gSWYgd2UgaGFkIGFuIGVycm9yLCByZXR1
cm4gZmFsc2UuICBUaGUgc3BlYyBpcyBhIGxpdHRsZSB1bmNsZWFyIGhlcmUsIGJ1dCBzYXlzICJS
ZXR1cm5zIHRydWUgaWYgdGhlIG1ldGhvZCB3YXMKKyAgICAvLyBzdWNjZXNzZnVsbHkgaW52b2tl
ZCIuICBJZiB3ZSBnZXQgYW4gZXJyb3IgcmV0dXJuIHZhbHVlLCB3YXMgdGhhdCBzdWNjZXNzZnVs
bHkgaW52b2tlZD8KKyAgICBpZiAocmVzdWx0T2JqZWN0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgLy8gQ29udmVydCB0aGUgcmVzdWx0IGJhY2sgdG8gYW4gTlBWYXJp
YW50LgorICAgIGNvbnZlcnRWOE9iamVjdFRvTlBWYXJpYW50KHJlc3VsdE9iamVjdCwgbnBPYmpl
Y3QsIHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTlBOX0V2YWx1YXRlKE5Q
UCBucHAsIE5QT2JqZWN0KiBucE9iamVjdCwgTlBTdHJpbmcqIG5wU2NyaXB0LCBOUFZhcmlhbnQq
IHJlc3VsdCkKK3sKKyAgICBib29sIHBvcHVwc0FsbG93ZWQgPSBXZWJDb3JlOjpDaHJvbWl1bUJy
aWRnZTo6cG9wdXBzQWxsb3dlZChucHApOworICAgIHJldHVybiBOUE5fRXZhbHVhdGVIZWxwZXIo
bnBwLCBwb3B1cHNBbGxvd2VkLCBucE9iamVjdCwgbnBTY3JpcHQsIHJlc3VsdCk7Cit9CisKK2Jv
b2wgTlBOX0V2YWx1YXRlSGVscGVyKE5QUCBucHAsIGJvb2wgcG9wdXBzQWxsb3dlZCwgTlBPYmpl
Y3QqIG5wT2JqZWN0LCBOUFN0cmluZyogbnBTY3JpcHQsIE5QVmFyaWFudCogcmVzdWx0KQorewor
ICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAgIGlmICghbnBPYmplY3QpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzICE9IG5wU2NyaXB0
T2JqZWN0Q2xhc3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHY4OjpIYW5kbGVTY29w
ZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdG9W
OENvbnRleHQobnBwLCBucE9iamVjdCk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBWOFByb3h5KiBwcm94eSA9IHRvVjhQcm94eShucE9i
amVjdCk7CisgICAgQVNTRVJUKHByb3h5KTsKKworICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29w
ZShjb250ZXh0KTsKKworICAgIFdlYkNvcmU6OlN0cmluZyBmaWxlbmFtZTsKKyAgICBpZiAoIXBv
cHVwc0FsbG93ZWQpCisgICAgICAgIGZpbGVuYW1lID0gIm5wU2NyaXB0IjsKKworICAgIC8vIENv
bnZlcnQgVVRGLTggc3RyZWFtIHRvIFdlYkNvcmU6OlN0cmluZy4KKyAgICBXZWJDb3JlOjpTdHJp
bmcgc2NyaXB0ID0gV2ViQ29yZTo6U3RyaW5nOjpmcm9tVVRGOChucFNjcmlwdC0+VVRGOENoYXJh
Y3RlcnMsIG5wU2NyaXB0LT5VVEY4TGVuZ3RoKTsKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2
OHJlc3VsdCA9IHByb3h5LT5ldmFsdWF0ZShXZWJDb3JlOjpTY3JpcHRTb3VyY2VDb2RlKHNjcmlw
dCwgV2ViQ29yZTo6S1VSTChmaWxlbmFtZSkpLCAwKTsKKworICAgIC8vIElmIHdlIGhhZCBhbiBl
cnJvciwgcmV0dXJuIGZhbHNlLgorICAgIGlmICh2OHJlc3VsdC5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGNvbnZlcnRWOE9iamVjdFRvTlBWYXJpYW50KHY4cmVzdWx0
LCBucE9iamVjdCwgcmVzdWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOUE5fR2V0
UHJvcGVydHkoTlBQIG5wcCwgTlBPYmplY3QqIG5wT2JqZWN0LCBOUElkZW50aWZpZXIgcHJvcGVy
dHlOYW1lLCBOUFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoIW5wT2JqZWN0KQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBPYmplY3QtPl9jbGFzcyA9PSBucFNjcmlwdE9i
amVjdENsYXNzKSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0X2Nh
c3Q8VjhOUE9iamVjdCo+KG5wT2JqZWN0KTsKKworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaGFu
ZGxlU2NvcGU7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4
Q29udGV4dChucHAsIG5wT2JqZWN0KTsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHY4OjpDb250ZXh0OjpTY29wZSBz
Y29wZShjb250ZXh0KTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaihvYmpl
Y3QtPnY4T2JqZWN0KTsKKyAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdjhyZXN1bHQgPSBv
YmotPkdldChucElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpKTsKKworICAg
ICAgICBjb252ZXJ0VjhPYmplY3RUb05QVmFyaWFudCh2OHJlc3VsdCwgbnBPYmplY3QsIHJlc3Vs
dCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChucE9iamVjdC0+X2Ns
YXNzLT5oYXNQcm9wZXJ0eSAmJiBucE9iamVjdC0+X2NsYXNzLT5nZXRQcm9wZXJ0eSkgeworICAg
ICAgICBpZiAobnBPYmplY3QtPl9jbGFzcy0+aGFzUHJvcGVydHkobnBPYmplY3QsIHByb3BlcnR5
TmFtZSkpCisgICAgICAgICAgICByZXR1cm4gbnBPYmplY3QtPl9jbGFzcy0+Z2V0UHJvcGVydHko
bnBPYmplY3QsIHByb3BlcnR5TmFtZSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBWT0lEX1RPX05Q
VkFSSUFOVCgqcmVzdWx0KTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTlBOX1NldFBy
b3BlcnR5KE5QUCBucHAsIE5QT2JqZWN0KiBucE9iamVjdCwgTlBJZGVudGlmaWVyIHByb3BlcnR5
TmFtZSwgY29uc3QgTlBWYXJpYW50KiB2YWx1ZSkKK3sKKyAgICBpZiAoIW5wT2JqZWN0KQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBPYmplY3QtPl9jbGFzcyA9PSBucFNjcmlw
dE9iamVjdENsYXNzKSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0
X2Nhc3Q8VjhOUE9iamVjdCo+KG5wT2JqZWN0KTsKKworICAgICAgICB2ODo6SGFuZGxlU2NvcGUg
aGFuZGxlU2NvcGU7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0
b1Y4Q29udGV4dChucHAsIG5wT2JqZWN0KTsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgp
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBzY29wZShjb250ZXh0KTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaihv
YmplY3QtPnY4T2JqZWN0KTsKKyAgICAgICAgb2JqLT5TZXQobnBJZGVudGlmaWVyVG9WOElkZW50
aWZpZXIocHJvcGVydHlOYW1lKSwKKyAgICAgICAgICAgICAgICAgY29udmVydE5QVmFyaWFudFRv
VjhPYmplY3QodmFsdWUsIG9iamVjdC0+cm9vdE9iamVjdC0+ZnJhbWUoKS0+c2NyaXB0KCktPndp
bmRvd1NjcmlwdE5QT2JqZWN0KCkpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisg
ICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MtPnNldFByb3BlcnR5KQorICAgICAgICByZXR1cm4gbnBP
YmplY3QtPl9jbGFzcy0+c2V0UHJvcGVydHkobnBPYmplY3QsIHByb3BlcnR5TmFtZSwgdmFsdWUp
OworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE5QTl9SZW1vdmVQcm9wZXJ0eShOUFAg
bnBwLCBOUE9iamVjdCogbnBPYmplY3QsIE5QSWRlbnRpZmllciBwcm9wZXJ0eU5hbWUpCit7Cisg
ICAgaWYgKCFucE9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChucE9iamVj
dC0+X2NsYXNzICE9IG5wU2NyaXB0T2JqZWN0Q2xhc3MpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIFY4TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+
KG5wT2JqZWN0KTsKKworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6
SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdG9WOENvbnRleHQobnBwLCBucE9iamVjdCk7
CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
djg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0PiBvYmoob2JqZWN0LT52OE9iamVjdCk7CisgICAgLy8gRklYTUUobWJlbHNoZSk6IFZl
cmlmeSB0aGF0IHNldHRpbmcgdG8gdW5kZWZpbmVkIGlzIHJpZ2h0LgorICAgIG9iai0+U2V0KG5w
SWRlbnRpZmllclRvVjhJZGVudGlmaWVyKHByb3BlcnR5TmFtZSksIHY4OjpVbmRlZmluZWQoKSk7
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTlBOX0hhc1Byb3BlcnR5KE5QUCBucHAsIE5Q
T2JqZWN0KiBucE9iamVjdCwgTlBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSkKK3sKKyAgICBpZiAo
IW5wT2JqZWN0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAobnBPYmplY3QtPl9j
bGFzcyA9PSBucFNjcmlwdE9iamVjdENsYXNzKSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVj
dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KG5wT2JqZWN0KTsKKworICAgICAgICB2
ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRl
eHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dChucHAsIG5wT2JqZWN0KTsKKyAgICAgICAgaWYgKGNv
bnRleHQuSXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB2ODo6
Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0PiBvYmoob2JqZWN0LT52OE9iamVjdCk7CisgICAgICAgIHJldHVybiBvYmotPkhhcyhu
cElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcihwcm9wZXJ0eU5hbWUpKTsKKyAgICB9CisKKyAgICBp
ZiAobnBPYmplY3QtPl9jbGFzcy0+aGFzUHJvcGVydHkpCisgICAgICAgIHJldHVybiBucE9iamVj
dC0+X2NsYXNzLT5oYXNQcm9wZXJ0eShucE9iamVjdCwgcHJvcGVydHlOYW1lKTsKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK2Jvb2wgTlBOX0hhc01ldGhvZChOUFAgbnBwLCBOUE9iamVjdCogbnBP
YmplY3QsIE5QSWRlbnRpZmllciBtZXRob2ROYW1lKQoreworICAgIGlmICghbnBPYmplY3QpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzID09IG5wU2Ny
aXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAgVjhOUE9iamVjdCAqb2JqZWN0ID0gcmVpbnRlcnBy
ZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgICAgIHY4OjpIYW5kbGVTY29w
ZSBoYW5kbGVTY29wZTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9
IHRvVjhDb250ZXh0KG5wcCwgbnBPYmplY3QpOworICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5
KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBzY29wZShjb250ZXh0KTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaihv
YmplY3QtPnY4T2JqZWN0KTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHByb3AgPSBv
YmotPkdldChucElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcihtZXRob2ROYW1lKSk7CisgICAgICAg
IHJldHVybiBwcm9wLT5Jc0Z1bmN0aW9uKCk7CisgICAgfQorCisgICAgaWYgKG5wT2JqZWN0LT5f
Y2xhc3MtPmhhc01ldGhvZCkKKyAgICAgICAgcmV0dXJuIG5wT2JqZWN0LT5fY2xhc3MtPmhhc01l
dGhvZChucE9iamVjdCwgbWV0aG9kTmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lk
IE5QTl9TZXRFeGNlcHRpb24oTlBPYmplY3QqIG5wT2JqZWN0LCBjb25zdCBOUFVURjggKm1lc3Nh
Z2UpCit7CisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MgIT0gbnBTY3JpcHRPYmplY3RDbGFzcykK
KyAgICAgICAgcmV0dXJuOworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdG9WOENvbnRleHQoMCwgbnBPYmplY3Qp
OworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdjg6
OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworICAgIFY4UHJveHk6OlRocm93RXJyb3Io
VjhQcm94eTo6R0VORVJBTF9FUlJPUiwgbWVzc2FnZSk7Cit9CisKK2Jvb2wgTlBOX0VudW1lcmF0
ZShOUFAgbnBwLCBOUE9iamVjdCogbnBPYmplY3QsIE5QSWRlbnRpZmllcioqIGlkZW50aWZpZXIs
IHVpbnQzMl90KiBjb3VudCkKK3sKKyAgICBpZiAoIW5wT2JqZWN0KQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAobnBPYmplY3QtPl9jbGFzcyA9PSBucFNjcmlwdE9iamVjdENsYXNz
KSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9i
amVjdCo+KG5wT2JqZWN0KTsKKworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7
CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dChu
cHAsIG5wT2JqZWN0KTsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4
dCk7CisKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmoob2JqZWN0LT52OE9iamVj
dCk7CisKKyAgICAgICAgLy8gRklYTUUoZnFpYW4pOiBodHRwOi8vYi9pc3N1ZT9pZD0xMjEwMzQw
OiBVc2UgYSB2ODo6T2JqZWN0OjpLZXlzKCkgbWV0aG9kIHdoZW4gaXQgZXhpc3RzLCBpbnN0ZWFk
IG9mIGV2YWx1YXRpbmcgamF2YXNjcmlwdC4KKworICAgICAgICAvLyBGSVhNRShtcGNvbXBsZXRl
KTogRmlndXJlIG91dCBob3cgdG8gY2FjaGUgdGhpcyBoZWxwZXIgZnVuY3Rpb24uICBSdW4gYSBo
ZWxwZXIgZnVuY3Rpb24gdGhhdCBjb2xsZWN0cyB0aGUgcHJvcGVydGllcworICAgICAgICAvLyBv
biB0aGUgb2JqZWN0IGludG8gYW4gYXJyYXkuCisgICAgICAgIGNvbnN0IGNoYXIgZW51bWVyYXRv
ckNvZGVbXSA9CisgICAgICAgICAgICAiKGZ1bmN0aW9uIChvYmopIHsiCisgICAgICAgICAgICAi
ICB2YXIgcHJvcHMgPSBbXTsiCisgICAgICAgICAgICAiICBmb3IgKHZhciBwcm9wIGluIG9iaikg
eyIKKyAgICAgICAgICAgICIgICAgcHJvcHNbcHJvcHMubGVuZ3RoXSA9IHByb3A7IgorICAgICAg
ICAgICAgIiAgfSIKKyAgICAgICAgICAgICIgIHJldHVybiBwcm9wczsiCisgICAgICAgICAgICAi
fSk7IjsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6U3RyaW5nPiBzb3VyY2UgPSB2ODo6U3RyaW5n
OjpOZXcoZW51bWVyYXRvckNvZGUpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpTY3JpcHQ+IHNj
cmlwdCA9IHY4OjpTY3JpcHQ6OkNvbXBpbGUoc291cmNlLCAwKTsKKyAgICAgICAgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGVudW1lcmF0b3JPYmogPSBzY3JpcHQtPlJ1bigpOworICAgICAgICB2ODo6
SGFuZGxlPHY4OjpGdW5jdGlvbj4gZW51bWVyYXRvciA9IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9u
Pjo6Q2FzdChlbnVtZXJhdG9yT2JqKTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFy
Z3ZbXSA9IHsgb2JqIH07CisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHByb3BzT2JqID0g
ZW51bWVyYXRvci0+Q2FsbCh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KGVudW1lcmF0b3JP
YmopLCBBUlJBWVNJWkVfVU5TQUZFKGFyZ3YpLCBhcmd2KTsKKyAgICAgICAgaWYgKHByb3BzT2Jq
LklzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBDb252
ZXJ0IHRoZSByZXN1bHRzIGludG8gYW4gYXJyYXkgb2YgTlBJZGVudGlmaWVycy4KKyAgICAgICAg
djg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BzID0gdjg6OkhhbmRsZTx2ODo6QXJyYXk+OjpDYXN0
KHByb3BzT2JqKTsKKyAgICAgICAgKmNvdW50ID0gcHJvcHMtPkxlbmd0aCgpOworICAgICAgICAq
aWRlbnRpZmllciA9IHN0YXRpY19jYXN0PE5QSWRlbnRpZmllcio+KG1hbGxvYyhzaXplb2YoTlBJ
ZGVudGlmaWVyKikgKiAqY291bnQpKTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8
ICpjb3VudDsgKytpKSB7CisgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiBuYW1lID0g
cHJvcHMtPkdldCh2ODo6SW50ZWdlcjo6TmV3KGkpKTsKKyAgICAgICAgICAgICgqaWRlbnRpZmll
cilbaV0gPSBnZXRTdHJpbmdJZGVudGlmaWVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPjo6Q2FzdChu
YW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYg
KE5QX0NMQVNTX1NUUlVDVF9WRVJTSU9OX0hBU19FTlVNKG5wT2JqZWN0LT5fY2xhc3MpICYmIG5w
T2JqZWN0LT5fY2xhc3MtPmVudW1lcmF0ZSkKKyAgICAgICByZXR1cm4gbnBPYmplY3QtPl9jbGFz
cy0+ZW51bWVyYXRlKG5wT2JqZWN0LCBpZGVudGlmaWVyLCBjb3VudCk7CisKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK2Jvb2wgTlBOX0NvbnN0cnVjdChOUFAgbnBwLCBOUE9iamVjdCogbnBPYmpl
Y3QsIGNvbnN0IE5QVmFyaWFudCogYXJndW1lbnRzLCB1aW50MzJfdCBhcmd1bWVudENvdW50LCBO
UFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBpZiAoIW5wT2JqZWN0KQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBpZiAobnBPYmplY3QtPl9jbGFzcyA9PSBucFNjcmlwdE9iamVjdENsYXNz
KSB7CisgICAgICAgIFY4TlBPYmplY3QgKm9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9i
amVjdCo+KG5wT2JqZWN0KTsKKworICAgICAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7
CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dChu
cHAsIG5wT2JqZWN0KTsKKyAgICAgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4
dCk7CisKKyAgICAgICAgLy8gTG9va3VwIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjdG9yT2JqKG9iamVjdC0+djhPYmplY3QpOworICAg
ICAgICBpZiAoIWN0b3JPYmotPklzRnVuY3Rpb24oKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgICAgICAvLyBDYWxsIHRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gcmVzdWx0T2JqZWN0OworICAgICAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlv
bj4gY3Rvcih2ODo6RnVuY3Rpb246OkNhc3QoKmN0b3JPYmopKTsKKyAgICAgICAgaWYgKCFjdG9y
LT5Jc051bGwoKSkgeworICAgICAgICAgICAgVjhQcm94eSogcHJveHkgPSB0b1Y4UHJveHkobnBP
YmplY3QpOworICAgICAgICAgICAgQVNTRVJUKHByb3h5KTsKKworICAgICAgICAgICAgLy8gQ3Jl
YXRlIGxpc3Qgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdjguCisgICAgICAgICAgICB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4qIGFyZ3YgPSBjcmVhdGVWYWx1ZUxpc3RGcm9tVmFyaWFudEFyZ3MoYXJn
dW1lbnRzLCBhcmd1bWVudENvdW50LCBucE9iamVjdCk7CisgICAgICAgICAgICByZXN1bHRPYmpl
Y3QgPSBwcm94eS0+TmV3SW5zdGFuY2UoY3RvciwgYXJndW1lbnRDb3VudCwgYXJndik7CisgICAg
ICAgICAgICBkZWxldGVbXSBhcmd2OworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgaGFk
IGFuIGVycm9yIHJldHVybiBmYWxzZS4KKyAgICAgICAgaWYgKHJlc3VsdE9iamVjdC5Jc0VtcHR5
KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gQ29udmVydCB0aGUg
cmVzdWx0IGJhY2sgdG8gYW4gTlBWYXJpYW50LgorICAgICAgICBjb252ZXJ0VjhPYmplY3RUb05Q
VmFyaWFudChyZXN1bHRPYmplY3QsIG5wT2JqZWN0LCByZXN1bHQpOworICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoTlBfQ0xBU1NfU1RSVUNUX1ZFUlNJT05fSEFTX0NUT1Io
bnBPYmplY3QtPl9jbGFzcykgJiYgbnBPYmplY3QtPl9jbGFzcy0+Y29uc3RydWN0KQorICAgICAg
ICByZXR1cm4gbnBPYmplY3QtPl9jbGFzcy0+Y29uc3RydWN0KG5wT2JqZWN0LCBhcmd1bWVudHMs
IGFyZ3VtZW50Q291bnQsIHJlc3VsdCk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CmRpZmYgLS1n
aXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L05QVjhPYmplY3QuaCBiL1dlYkNvcmUvYmluZGluZ3Mv
djgvTlBWOE9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YTAy
NjkKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L05QVjhPYmplY3QuaApA
QCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LTIwMDkgR29vZ2xlIElu
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
VUNIIERBTUFHRS4KKyAqLworI2lmbmRlZiBOUFY4T2JqZWN0X2gKKyNkZWZpbmUgTlBWOE9iamVj
dF9oCisKKyNpbmNsdWRlICJiaW5kaW5ncy9ucHJ1bnRpbWUuaCIKKyNpbmNsdWRlIDx2OC5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgRE9NV2luZG93OworfQorCitleHRlcm4g
TlBDbGFzcyogbnBTY3JpcHRPYmplY3RDbGFzczsKKworLy8gQSBWOE5QT2JqZWN0IGlzIGEgTlBP
YmplY3Qgd2hpY2ggY2FycmllcyBhZGRpdGlvbmFsIFY4LXNwZWNpZmljIGluZm9ybWF0aW9uLiBJ
dCBpcyBhbGxvY2F0ZWQgYW5kIGRlYWxsb2NhdGVkIGJ5CisvLyBBbGxvY1Y4TlBPYmplY3QoKSBh
bmQgRnJlZVY4TlBPYmplY3QoKSBtZXRob2RzLgorc3RydWN0IFY4TlBPYmplY3QgeworICAgIE5Q
T2JqZWN0IG9iamVjdDsKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB2OE9iamVjdDsK
KyAgICBXZWJDb3JlOjpET01XaW5kb3cqIHJvb3RPYmplY3Q7Cit9OworCitzdHJ1Y3QgUHJpdmF0
ZUlkZW50aWZpZXIgeworICAgIHVuaW9uIHsKKyAgICAgICAgY29uc3QgTlBVVEY4KiBzdHJpbmc7
CisgICAgICAgIGludDMyX3QgbnVtYmVyOworICAgIH0gdmFsdWU7CisgICAgYm9vbCBpc1N0cmlu
ZzsKK307CisKK05QT2JqZWN0KiBucENyZWF0ZVY4U2NyaXB0T2JqZWN0KE5QUCwgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiwgV2ViQ29yZTo6RE9NV2luZG93Kik7CisKKyNlbmRpZiAvLyBOUFY4T2Jq
ZWN0X2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhOUFV0aWxzLmNwcCBiL1dl
YkNvcmUvYmluZGluZ3MvdjgvVjhOUFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwLi43ZDRlNjZiCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92
OC9WOE5QVXRpbHMuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA4LTIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgor
ICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9m
IGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBw
cm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBw
cmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBB
TkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QK
KyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
IElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BF
Q0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisKKyNpbmNsdWRlICJWOE5QVXRpbHMuaCIKKworI2luY2x1ZGUgIkRPTVdpbmRvdy5oIgorI2lu
Y2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyN1bmRlZiBMT0cK
KworI2luY2x1ZGUgIk5QVjhPYmplY3QuaCIKKyNpbmNsdWRlICJWOE5QT2JqZWN0LmgiCisjaW5j
bHVkZSAiVjhQcm94eS5oIgorI2luY2x1ZGUgIm5wcnVudGltZV9wcml2LmgiCisKK3ZvaWQgY29u
dmVydFY4T2JqZWN0VG9OUFZhcmlhbnQodjg6OkxvY2FsPHY4OjpWYWx1ZT4gb2JqZWN0LCBOUE9i
amVjdCogb3duZXIsIE5QVmFyaWFudCogcmVzdWx0KQoreworICAgIFZPSURfVE9fTlBWQVJJQU5U
KCpyZXN1bHQpOworCisgICAgLy8gSXQgaXMgcmVhbGx5IHRoZSBjYWxsZXIncyByZXNwb25zaWJp
bGl0eSB0byBkZWFsIHdpdGggdGhlIGVtcHR5IGhhbmRsZSBjYXNlIGJlY2F1c2UgdGhlcmUgY291
bGQgYmUgZGlmZmVyZW50IGFjdGlvbnMgdG8KKyAgICAvLyB0YWtlIGluIGRpZmZlcmVudCBjb250
ZXh0cy4KKyAgICBBU1NFUlQoIW9iamVjdC5Jc0VtcHR5KCkpOworCisgICAgaWYgKG9iamVjdC5J
c0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChvYmplY3QtPklzSW50MzIoKSkK
KyAgICAgICAgSU5UMzJfVE9fTlBWQVJJQU5UKG9iamVjdC0+TnVtYmVyVmFsdWUoKSwgKnJlc3Vs
dCk7CisgICAgZWxzZSBpZiAob2JqZWN0LT5Jc051bWJlcigpKQorICAgICAgICBET1VCTEVfVE9f
TlBWQVJJQU5UKG9iamVjdC0+TnVtYmVyVmFsdWUoKSwgKnJlc3VsdCk7CisgICAgZWxzZSBpZiAo
b2JqZWN0LT5Jc0Jvb2xlYW4oKSkKKyAgICAgICAgQk9PTEVBTl9UT19OUFZBUklBTlQob2JqZWN0
LT5Cb29sZWFuVmFsdWUoKSwgKnJlc3VsdCk7CisgICAgZWxzZSBpZiAob2JqZWN0LT5Jc051bGwo
KSkKKyAgICAgICAgTlVMTF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisgICAgZWxzZSBpZiAob2Jq
ZWN0LT5Jc1VuZGVmaW5lZCgpKQorICAgICAgICBWT0lEX1RPX05QVkFSSUFOVCgqcmVzdWx0KTsK
KyAgICBlbHNlIGlmIChvYmplY3QtPklzU3RyaW5nKCkpIHsKKyAgICAgICAgdjg6OlN0cmluZzo6
VXRmOFZhbHVlIHV0Zjgob2JqZWN0KTsKKyAgICAgICAgY2hhciogdXRmOF9jaGFycyA9IHN0cmR1
cCgqdXRmOCk7CisgICAgICAgIFNUUklOR05fVE9fTlBWQVJJQU5UKHV0ZjhfY2hhcnMsIHV0Zjgu
bGVuZ3RoKCksICpyZXN1bHQpOworICAgIH0gZWxzZSBpZiAob2JqZWN0LT5Jc09iamVjdCgpKSB7
CisgICAgICAgIFdlYkNvcmU6OkRPTVdpbmRvdyogd2luZG93ID0gV2ViQ29yZTo6VjhQcm94eTo6
cmV0cmlldmVXaW5kb3coKTsKKyAgICAgICAgTlBPYmplY3QqIG5wb2JqZWN0ID0gbnBDcmVhdGVW
OFNjcmlwdE9iamVjdCgwLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KG9iamVjdCksIHdp
bmRvdyk7CisgICAgICAgIGlmIChucG9iamVjdCkKKyAgICAgICAgICAgIF9OUE5fUmVnaXN0ZXJP
YmplY3QobnBvYmplY3QsIG93bmVyKTsKKyAgICAgICAgT0JKRUNUX1RPX05QVkFSSUFOVChucG9i
amVjdCwgKnJlc3VsdCk7CisgICAgfQorfQorCisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252
ZXJ0TlBWYXJpYW50VG9WOE9iamVjdChjb25zdCBOUFZhcmlhbnQqIHZhcmlhbnQsIE5QT2JqZWN0
KiBucG9iamVjdCkKK3sKKyAgICBOUFZhcmlhbnRUeXBlIHR5cGUgPSB2YXJpYW50LT50eXBlOwor
CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX0ludDMyOgorICAg
ICAgICByZXR1cm4gdjg6OkludGVnZXI6Ok5ldyhOUFZBUklBTlRfVE9fSU5UMzIoKnZhcmlhbnQp
KTsKKyAgICBjYXNlICBOUFZhcmlhbnRUeXBlX0RvdWJsZToKKyAgICAgICAgcmV0dXJuIHY4OjpO
dW1iZXI6Ok5ldyhOUFZBUklBTlRfVE9fRE9VQkxFKCp2YXJpYW50KSk7CisgICAgY2FzZSAgTlBW
YXJpYW50VHlwZV9Cb29sOgorICAgICAgICByZXR1cm4gTlBWQVJJQU5UX1RPX0JPT0xFQU4oKnZh
cmlhbnQpID8gdjg6OlRydWUoKSA6IHY4OjpGYWxzZSgpOworICAgIGNhc2UgIE5QVmFyaWFudFR5
cGVfTnVsbDoKKyAgICAgICAgcmV0dXJuIHY4OjpOdWxsKCk7CisgICAgY2FzZSAgTlBWYXJpYW50
VHlwZV9Wb2lkOgorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAgIGNhc2UgIE5Q
VmFyaWFudFR5cGVfU3RyaW5nOiB7CisgICAgICAgIE5QU3RyaW5nIHNyYyA9IE5QVkFSSUFOVF9U
T19TVFJJTkcoKnZhcmlhbnQpOworICAgICAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KHNyYy5V
VEY4Q2hhcmFjdGVycywgc3JjLlVURjhMZW5ndGgpOworICAgIH0KKyAgICBjYXNlICBOUFZhcmlh
bnRUeXBlX09iamVjdDogeworICAgICAgICBOUE9iamVjdCogb2JqID0gTlBWQVJJQU5UX1RPX09C
SkVDVCgqdmFyaWFudCk7CisgICAgICAgIGlmIChvYmotPl9jbGFzcyA9PSBucFNjcmlwdE9iamVj
dENsYXNzKQorICAgICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+
KG9iaiktPnY4T2JqZWN0OworICAgICAgICByZXR1cm4gY3JlYXRlVjhPYmplY3RGb3JOUE9iamVj
dChvYmosIG5wb2JqZWN0KTsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIHY4
OjpVbmRlZmluZWQoKTsKKyAgICB9Cit9CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUg
YW4gTlBOIFN0cmluZyBJZGVudGlmaWVyIGZyb20gYSB2OCBzdHJpbmcuCitOUElkZW50aWZpZXIg
Z2V0U3RyaW5nSWRlbnRpZmllcih2ODo6SGFuZGxlPHY4OjpTdHJpbmc+IHN0cikKK3sKKyAgICBj
b25zdCBpbnQga1N0YWNrQnVmU2l6ZSA9IDEwMDsKKworICAgIGludCBidWZMZW4gPSBzdHItPkxl
bmd0aCgpICsgMTsKKyAgICBpZiAoYnVmTGVuIDw9IGtTdGFja0J1ZlNpemUpIHsKKyAgICAgICAg
Ly8gVXNlIGxvY2FsIHN0YWNrIGJ1ZmZlciB0byBhdm9pZCBoZWFwIGFsbG9jYXRpb25zIGZvciBz
bWFsbCBzdHJpbmdzLiBIZXJlIHdlIHNob3VsZCBvbmx5IHVzZSB0aGUgc3RhY2sgc3BhY2UgZm9y
CisgICAgICAgIC8vIHN0YWNrX2J1ZiB3aGVuIGl0J3MgdXNlZCwgbm90IHdoZW4gd2UgdXNlIHRo
ZSBoZWFwLgorICAgICAgICAvLworICAgICAgICAvLyBXcml0ZUFzY2lpIGlzIGd1YXJhbnRlZWQg
dG8gZ2VuZXJhdGUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJlY2F1c2UgYnVmTGVuIGlzIGNv
bnN0cnVjdGVkIHRvIGJlIG9uZSBncmVhdGVyCisgICAgICAgIC8vIHRoYW4gdGhlIHN0cmluZyBs
ZW5ndGguCisgICAgICAgIGNoYXIgc3RhY2tCdWZba1N0YWNrQnVmU2l6ZV07CisgICAgICAgIHN0
ci0+V3JpdGVBc2NpaShzdGFja0J1ZiwgMCwgYnVmTGVuKTsKKyAgICAgICAgcmV0dXJuIE5QTl9H
ZXRTdHJpbmdJZGVudGlmaWVyKHN0YWNrQnVmKTsKKyAgICB9CisKKyAgICB2ODo6U3RyaW5nOjpB
c2NpaVZhbHVlIGFzY2lpKHN0cik7CisgICAgcmV0dXJuIE5QTl9HZXRTdHJpbmdJZGVudGlmaWVy
KCphc2NpaSk7Cit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4TlBVdGlscy5o
IGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOE5QVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi43YjgyNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5n
cy92OC9WOE5QVXRpbHMuaApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMDYt
MjAwOCBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBv
ZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhh
dCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpZm5kZWYgVjhOUFV0
aWxzX2gKKyNkZWZpbmUgVjhOUFV0aWxzX2gKKworI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSAi
dGhpcmRfcGFydHkvbnBhcGkvYmluZGluZ3MvbnBydW50aW1lLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKyAgICBjbGFzcyBGcmFtZTsKK30KKworLy8gQ29udmVydCBhIFY4IFZhbHVlIG9mIGFu
eSB0eXBlIChzdHJpbmcsIGJvb2wsIG9iamVjdCwgZXRjKSB0byBhIE5QVmFyaWFudC4KK3ZvaWQg
Y29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQodjg6OkxvY2FsPHY4OjpWYWx1ZT4sIE5QT2JqZWN0
KiwgTlBWYXJpYW50Kik7CisKKy8vIENvbnZlcnQgYSBOUFZhcmlhbnQgKHN0cmluZywgYm9vbCwg
b2JqZWN0LCBldGMpIGJhY2sgdG8gYSBWOCBWYWx1ZS4gIFRoZSBvd25lciBvYmplY3QgaXMgdGhl
IE5QT2JqZWN0IHdoaWNoIHJlbGF0ZXMgdG8gdGhlCisvLyBvYmplY3QsIGlmIHRoZSBvYmplY3Qg
aXMgYW4gT2JqZWN0LiAgVGhlIGNyZWF0ZWQgTlBPYmplY3Qgd2lsbCBiZSB0aWVkIHRvIHRoZSBs
aWZldGltZSBvZiB0aGUgb3duZXIuCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydE5QVmFy
aWFudFRvVjhPYmplY3QoY29uc3QgTlBWYXJpYW50KiwgTlBPYmplY3QqKTsKKworLy8gSGVscGVy
IGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBOUE4gU3RyaW5nIElkZW50aWZpZXIgZnJvbSBhIHY4IHN0
cmluZy4KK05QSWRlbnRpZmllciBnZXRTdHJpbmdJZGVudGlmaWVyKHY4OjpIYW5kbGU8djg6OlN0
cmluZz4pOworCisjZW5kaWYgLy8gVjhOUFV0aWxzX2gK
</data>
<flag name="review"
          id="16355"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31807</attachid>
            <date>2009-06-24 13:43:50 -0700</date>
            <delta_ts>2009-06-24 14:10:05 -0700</delta_ts>
            <desc>address Dave&apos;s comments. :)</desc>
            <filename>v8upstream.patch</filename>
            <type>text/plain</type>
            <size>30897</size>
            <attacher name="Albert J. Wong">ajwong</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
Njk3NDhjOS4uOGRkMmNmNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNyBAQAorMjAwOS0wNi0yMyAgQWxiZXJ0IEouIFdv
bmcgIDxhandvbmdAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yNjU2NgorICAgICAgICBVcHN0cmVhbSB0aGVzZSBmaWxlcyBmcm9tIHRoZSBjaHJvbWl1bSB2
OCBjb2RlLiAgTm8gdGVzdHMgd2VyZQorICAgICAgICBhZmZlY3RlZCBiZWNhdXNlIHRoaXMgaXMg
ZXNzZW50aWFsbHkgYSBjb2RlIG1vdmUuCisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9OUFY4T2Jq
ZWN0LmNwcDogQWRkZWQuCisgICAgICAgIChhbGxvY1Y4TlBPYmplY3QpOgorICAgICAgICAoZnJl
ZVY4TlBPYmplY3QpOgorICAgICAgICAobGlzdEZyb21WYXJpYW50QXJncyk6CisgICAgICAgIChu
cElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcik6CisgICAgICAgIChucENyZWF0ZVY4U2NyaXB0T2Jq
ZWN0KToKKyAgICAgICAgKE5QTl9JbnZva2UpOgorICAgICAgICAoTlBOX0ludm9rZURlZmF1bHQp
OgorICAgICAgICAoTlBOX0V2YWx1YXRlKToKKyAgICAgICAgKE5QTl9FdmFsdWF0ZUhlbHBlcik6
CisgICAgICAgIChOUE5fR2V0UHJvcGVydHkpOgorICAgICAgICAoTlBOX1NldFByb3BlcnR5KToK
KyAgICAgICAgKE5QTl9SZW1vdmVQcm9wZXJ0eSk6CisgICAgICAgIChOUE5fSGFzUHJvcGVydHkp
OgorICAgICAgICAoTlBOX0hhc01ldGhvZCk6CisgICAgICAgIChOUE5fU2V0RXhjZXB0aW9uKToK
KyAgICAgICAgKE5QTl9FbnVtZXJhdGUpOgorICAgICAgICAoTlBOX0NvbnN0cnVjdCk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvTlBWOE9iamVjdC5oOiBBZGRlZC4KKyAgICAgICAgKFByaXZhdGVJ
ZGVudGlmaWVyOjopOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4TlBVdGlscy5jcHA6IEFkZGVk
LgorICAgICAgICAoY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQpOgorICAgICAgICAoY29udmVy
dE5QVmFyaWFudFRvVjhPYmplY3QpOgorICAgICAgICAoZ2V0U3RyaW5nSWRlbnRpZmllcik6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvVjhOUFV0aWxzLmg6IEFkZGVkLgorCiAyMDA5LTA2LTIyICBE
YXZpZCBIeWF0dCAgPGh5YXR0QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0g
V2VpbmlnLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9OUFY4T2JqZWN0LmNwcCBi
L1dlYkNvcmUvYmluZGluZ3MvdjgvTlBWOE9iamVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uNDI3NTc2MgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvTlBWOE9iamVjdC5jcHAKQEAgLTAsMCArMSw1MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDQsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDkgR29vZ2xlLCBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIk5Q
VjhPYmplY3QuaCIKKworI2luY2x1ZGUgIkNocm9taXVtQnJpZGdlLmgiCisjaW5jbHVkZSAiRE9N
V2luZG93LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJPd25BcnJheVB0ci5oIgor
I2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU2NyaXB0Q29udHJvbGxlci5o
IgorI2luY2x1ZGUgIlY4Q3VzdG9tQmluZGluZy5oIgorI2luY2x1ZGUgIlY4SGVscGVycy5oIgor
I2luY2x1ZGUgIlY4TlBVdGlscy5oIgorI2luY2x1ZGUgIlY4UHJveHkuaCIKKyNpbmNsdWRlICJi
aW5kaW5ncy9ucHJ1bnRpbWUuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfcHJpdi5oIgorCisjaW5j
bHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx2OC5oPgorCit1c2luZyBXZWJDb3JlOjp0b1Y4Q29u
dGV4dDsKK3VzaW5nIFdlYkNvcmU6OnRvVjhQcm94eTsKK3VzaW5nIFdlYkNvcmU6OlY4Q2xhc3NJ
bmRleDsKK3VzaW5nIFdlYkNvcmU6OlY4Q3VzdG9tOwordXNpbmcgV2ViQ29yZTo6VjhQcm94eTsK
KworLy8gRklYTUU6IENvbW1lbnRzIG9uIHdoeSB1c2UgbWFsbG9jIGFuZCBmcmVlLgorc3RhdGlj
IE5QT2JqZWN0KiBhbGxvY1Y4TlBPYmplY3QoTlBQLCBOUENsYXNzKikKK3sKKyAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8TlBPYmplY3QqPihtYWxsb2Moc2l6ZW9mKFY4TlBPYmplY3QpKSk7Cit9CisK
K3N0YXRpYyB2b2lkIGZyZWVWOE5QT2JqZWN0KE5QT2JqZWN0KiBucE9iamVjdCkKK3sKKyAgICBW
OE5QT2JqZWN0KiB2OE5wT2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBP
YmplY3QpOworI2lmbmRlZiBOREVCVUcKKyAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFu
ZGxlKHY4TnBPYmplY3QsIHY4TnBPYmplY3QtPnY4T2JqZWN0KTsKKyNlbmRpZgorICAgIHY4TnBP
YmplY3QtPnY4T2JqZWN0LkRpc3Bvc2UoKTsKKyAgICBmcmVlKHY4TnBPYmplY3QpOworfQorCitz
dGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KiBjcmVhdGVWYWx1ZUxpc3RGcm9tVmFyaWFudEFy
Z3MoY29uc3QgTlBWYXJpYW50KiBhcmd1bWVudHMsIHVpbnQzMl90IGFyZ3VtZW50Q291bnQsIE5Q
T2JqZWN0KiBvd25lcikKK3sKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIGFyZ3YgPSBuZXcg
djg6OkhhbmRsZTx2ODo6VmFsdWU+W2FyZ3VtZW50Q291bnRdOworICAgIGZvciAodWludDMyX3Qg
aW5kZXggPSAwOyBpbmRleCA8IGFyZ3VtZW50Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgY29u
c3QgTlBWYXJpYW50KiBhcmcgPSAmYXJndW1lbnRzW2luZGV4XTsKKyAgICAgICAgYXJndltpbmRl
eF0gPSBjb252ZXJ0TlBWYXJpYW50VG9WOE9iamVjdChhcmcsIG93bmVyKTsKKyAgICB9CisgICAg
cmV0dXJuIGFyZ3Y7Cit9CisKKy8vIENyZWF0ZSBhbiBpZGVudGlmaWVyIChudWxsIHRlcm1pbmF0
ZWQgdXRmOCBjaGFyKikgZnJvbSB0aGUgTlBJZGVudGlmaWVyLgorc3RhdGljIHY4OjpMb2NhbDx2
ODo6U3RyaW5nPiBucElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcihOUElkZW50aWZpZXIgbmFtZSkK
K3sKKyAgICBQcml2YXRlSWRlbnRpZmllciogaWRlbnRpZmllciA9IHN0YXRpY19jYXN0PFByaXZh
dGVJZGVudGlmaWVyKj4obmFtZSk7CisgICAgaWYgKGlkZW50aWZpZXItPmlzU3RyaW5nKQorICAg
ICAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihpZGVu
dGlmaWVyLT52YWx1ZS5zdHJpbmcpKTsKKworICAgIGNoYXIgYnVmZmVyWzMyXTsKKyAgICBzbnBy
aW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQiLCBpZGVudGlmaWVyLT52YWx1ZS5udW1i
ZXIpOworICAgIHJldHVybiB2ODo6U3RyaW5nOjpOZXcoYnVmZmVyKTsKK30KKworc3RhdGljIE5Q
Q2xhc3MgVjhOUE9iamVjdENsYXNzID0geyBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NWOE5QT2JqZWN0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlVjhOUE9iamVjdCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisvLyBO
UEFQSSdzIG5wcnVudGltZSBmdW5jdGlvbnMuCitOUENsYXNzKiBucFNjcmlwdE9iamVjdENsYXNz
ID0gJlY4TlBPYmplY3RDbGFzczsKKworTlBPYmplY3QqIG5wQ3JlYXRlVjhTY3JpcHRPYmplY3Qo
TlBQIG5wcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QsIFdlYkNvcmU6OkRPTVdpbmRv
dyogcm9vdCkKK3sKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB0eXBlSW5kZXggPSBvYmplY3Qt
PkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyVHlwZUluZGV4KTsKKyAgICAv
LyBDaGVjayB0byBzZWUgaWYgdGhpcyBvYmplY3QgaXMgYWxyZWFkeSB3cmFwcGVkLgorICAgIGlm
IChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprTlBPYmplY3RJbnRl
cm5hbEZpZWxkQ291bnQgJiYgdHlwZUluZGV4LT5Jc051bWJlcigpICYmIHR5cGVJbmRleC0+VWlu
dDMyVmFsdWUoKSA9PSBWOENsYXNzSW5kZXg6Ok5QT0JKRUNUKSB7CisKKyAgICAgICAgTlBPYmpl
Y3QqIHJldHVyblZhbHVlID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TlBPYmplY3Q+KFY4Q2xh
c3NJbmRleDo6TlBPQkpFQ1QsIG9iamVjdCk7CisgICAgICAgIE5QTl9SZXRhaW5PYmplY3QocmV0
dXJuVmFsdWUpOworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgVjhO
UE9iamVjdCogdjhucE9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KE5QTl9D
cmVhdGVPYmplY3QobnBwLCAmVjhOUE9iamVjdENsYXNzKSk7CisgICAgdjhucE9iamVjdC0+djhP
YmplY3QgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KG9iamVjdCk7CisjaWZuZGVm
IE5ERUJVRworICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKFdlYkNvcmU6Ok5QT0JK
RUNULCB2OG5wT2JqZWN0LCB2OG5wT2JqZWN0LT52OE9iamVjdCk7CisjZW5kaWYKKyAgICB2OG5w
T2JqZWN0LT5yb290T2JqZWN0ID0gcm9vdDsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxO
UE9iamVjdCo+KHY4bnBPYmplY3QpOworfQorCitib29sIE5QTl9JbnZva2UoTlBQIG5wcCwgTlBP
YmplY3QqIG5wT2JqZWN0LCBOUElkZW50aWZpZXIgbWV0aG9kTmFtZSwgY29uc3QgTlBWYXJpYW50
KiBhcmd1bWVudHMsIHVpbnQzMl90IGFyZ3VtZW50Q291bnQsIE5QVmFyaWFudCogcmVzdWx0KQor
eworICAgIGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChu
cE9iamVjdC0+X2NsYXNzICE9IG5wU2NyaXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAgaWYgKG5w
T2JqZWN0LT5fY2xhc3MtPmludm9rZURlZmF1bHQpCisgICAgICAgICAgICByZXR1cm4gbnBPYmpl
Y3QtPl9jbGFzcy0+aW52b2tlRGVmYXVsdChucE9iamVjdCwgYXJndW1lbnRzLCBhcmd1bWVudENv
dW50LCByZXN1bHQpOworCisgICAgICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBWOE5QT2JqZWN0KiB2OE5wT2JqZWN0ID0g
cmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgUHJpdmF0ZUlk
ZW50aWZpZXIqIGlkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxQcml2YXRlSWRlbnRpZmllcio+KG1l
dGhvZE5hbWUpOworICAgIGlmICghaWRlbnRpZmllci0+aXNTdHJpbmcpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICAvLyBGSVhN
RTogc2hvdWxkIHVzZSB0aGUgcGx1Z2luJ3Mgb3duZXIgZnJhbWUgYXMgdGhlIHNlY3VyaXR5IGNv
bnRleHQuCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250ZXh0
KG5wcCwgbnBPYmplY3QpOworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisg
ICAgLy8gU3BlY2lhbCBjYXNlIHRoZSAiZXZhbCIgbWV0aG9kLgorICAgIGlmIChtZXRob2ROYW1l
ID09IE5QTl9HZXRTdHJpbmdJZGVudGlmaWVyKCJldmFsIikpIHsKKyAgICAgICAgaWYgKGFyZ3Vt
ZW50Q291bnQgIT0gMSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKGFy
Z3VtZW50c1swXS50eXBlICE9IE5QVmFyaWFudFR5cGVfU3RyaW5nKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gTlBOX0V2YWx1YXRlKG5wcCwgbnBPYmplY3QsIGNv
bnN0X2Nhc3Q8TlBTdHJpbmcqPigmYXJndW1lbnRzWzBdLnZhbHVlLnN0cmluZ1ZhbHVlKSwgcmVz
dWx0KTsKKyAgICB9CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZnVuY3Rpb25PYmplY3Qg
PSB2OE5wT2JqZWN0LT52OE9iamVjdC0+R2V0KHY4OjpTdHJpbmc6Ok5ldyhpZGVudGlmaWVyLT52
YWx1ZS5zdHJpbmcpKTsKKyAgICBpZiAoZnVuY3Rpb25PYmplY3QuSXNFbXB0eSgpIHx8IGZ1bmN0
aW9uT2JqZWN0LT5Jc051bGwoKSkgeworICAgICAgICBOVUxMX1RPX05QVkFSSUFOVCgqcmVzdWx0
KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoZnVuY3Rpb25PYmplY3Qt
PklzVW5kZWZpbmVkKCkpIHsKKyAgICAgICAgVk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7Cisg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWOFByb3h5KiBwcm94eSA9IHRvVjhQ
cm94eShucE9iamVjdCk7CisgICAgQVNTRVJUKHByb3h5KTsKKworICAgIC8vIENhbGwgdGhlIGZ1
bmN0aW9uIG9iamVjdC4KKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gZnVuY3Rpb24gPSB2
ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj46OkNhc3QoZnVuY3Rpb25PYmplY3QpOworICAgIC8vIENy
ZWF0ZSBsaXN0IG9mIGFyZ3VtZW50cyB0byBwYXNzIHRvIHY4LgorICAgIE93bkFycmF5UHRyPHY4
OjpIYW5kbGU8djg6OlZhbHVlPiA+IGFyZ3YoY3JlYXRlVmFsdWVMaXN0RnJvbVZhcmlhbnRBcmdz
KGFyZ3VtZW50cywgYXJndW1lbnRDb3VudCwgbnBPYmplY3QpKTsKKyAgICB2ODo6TG9jYWw8djg6
OlZhbHVlPiByZXN1bHRPYmplY3QgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKGZ1bmN0aW9uLCB2OE5w
T2JqZWN0LT52OE9iamVjdCwgYXJndW1lbnRDb3VudCwgYXJndi5nZXQoKSk7CisKKyAgICAvLyBJ
ZiB3ZSBoYWQgYW4gZXJyb3IsIHJldHVybiBmYWxzZS4gIFRoZSBzcGVjIGlzIGEgbGl0dGxlIHVu
Y2xlYXIgaGVyZSwgYnV0IHNheXMgIlJldHVybnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIHdhcworICAg
IC8vIHN1Y2Nlc3NmdWxseSBpbnZva2VkIi4gIElmIHdlIGdldCBhbiBlcnJvciByZXR1cm4gdmFs
dWUsIHdhcyB0aGF0IHN1Y2Nlc3NmdWxseSBpbnZva2VkPworICAgIGlmIChyZXN1bHRPYmplY3Qu
SXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDb252ZXJ0IHRoZSBy
ZXN1bHQgYmFjayB0byBhbiBOUFZhcmlhbnQuCisgICAgY29udmVydFY4T2JqZWN0VG9OUFZhcmlh
bnQocmVzdWx0T2JqZWN0LCBucE9iamVjdCwgcmVzdWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworLy8gRklYTUU6IEZpeCBpdCBzYW1lIGFzIE5QTl9JbnZva2UgKEhhbmRsZVNjb3BlIGFuZCBz
dWNoKS4KK2Jvb2wgTlBOX0ludm9rZURlZmF1bHQoTlBQIG5wcCwgTlBPYmplY3QqIG5wT2JqZWN0
LCBjb25zdCBOUFZhcmlhbnQqIGFyZ3VtZW50cywgdWludDMyX3QgYXJndW1lbnRDb3VudCwgTlBW
YXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKCFucE9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MgIT0gbnBTY3JpcHRPYmplY3RDbGFzcykg
eworICAgICAgICBpZiAobnBPYmplY3QtPl9jbGFzcy0+aW52b2tlRGVmYXVsdCkKKyAgICAgICAg
ICAgIHJldHVybiBucE9iamVjdC0+X2NsYXNzLT5pbnZva2VEZWZhdWx0KG5wT2JqZWN0LCBhcmd1
bWVudHMsIGFyZ3VtZW50Q291bnQsIHJlc3VsdCk7CisKKyAgICAgICAgVk9JRF9UT19OUFZBUklB
TlQoKnJlc3VsdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIFY4TlBPYmpl
Y3QqIHY4TnBPYmplY3QgPSByZWludGVycHJldF9jYXN0PFY4TlBPYmplY3QqPihucE9iamVjdCk7
CisKKyAgICBWT0lEX1RPX05QVkFSSUFOVCgqcmVzdWx0KTsKKworICAgIHY4OjpIYW5kbGVTY29w
ZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdG9W
OENvbnRleHQobnBwLCBucE9iamVjdCk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKQorICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4
dCk7CisKKyAgICAvLyBMb29rdXAgdGhlIGZ1bmN0aW9uIG9iamVjdC4KKyAgICB2ODo6SGFuZGxl
PHY4OjpPYmplY3Q+IGZ1bmN0aW9uT2JqZWN0KHY4TnBPYmplY3QtPnY4T2JqZWN0KTsKKyAgICBp
ZiAoIWZ1bmN0aW9uT2JqZWN0LT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIC8vIENhbGwgdGhlIGZ1bmN0aW9uIG9iamVjdC4KKyAgICB2ODo6TG9jYWw8djg6OlZh
bHVlPiByZXN1bHRPYmplY3Q7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGZ1bmN0aW9u
KHY4OjpGdW5jdGlvbjo6Q2FzdCgqZnVuY3Rpb25PYmplY3QpKTsKKyAgICBpZiAoIWZ1bmN0aW9u
LT5Jc051bGwoKSkgeworICAgICAgICBWOFByb3h5KiBwcm94eSA9IHRvVjhQcm94eShucE9iamVj
dCk7CisgICAgICAgIEFTU0VSVChwcm94eSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGxpc3Qgb2Yg
YXJndW1lbnRzIHRvIHBhc3MgdG8gdjguCisgICAgICAgIE93bkFycmF5UHRyPHY4OjpIYW5kbGU8
djg6OlZhbHVlPiA+IGFyZ3YoY3JlYXRlVmFsdWVMaXN0RnJvbVZhcmlhbnRBcmdzKGFyZ3VtZW50
cywgYXJndW1lbnRDb3VudCwgbnBPYmplY3QpKTsKKyAgICAgICAgcmVzdWx0T2JqZWN0ID0gcHJv
eHktPkNhbGxGdW5jdGlvbihmdW5jdGlvbiwgZnVuY3Rpb25PYmplY3QsIGFyZ3VtZW50Q291bnQs
IGFyZ3YuZ2V0KCkpOworICAgIH0KKyAgICAvLyBJZiB3ZSBoYWQgYW4gZXJyb3IsIHJldHVybiBm
YWxzZS4gIFRoZSBzcGVjIGlzIGEgbGl0dGxlIHVuY2xlYXIgaGVyZSwgYnV0IHNheXMgIlJldHVy
bnMgdHJ1ZSBpZiB0aGUgbWV0aG9kIHdhcworICAgIC8vIHN1Y2Nlc3NmdWxseSBpbnZva2VkIi4g
IElmIHdlIGdldCBhbiBlcnJvciByZXR1cm4gdmFsdWUsIHdhcyB0aGF0IHN1Y2Nlc3NmdWxseSBp
bnZva2VkPworICAgIGlmIChyZXN1bHRPYmplY3QuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAvLyBDb252ZXJ0IHRoZSByZXN1bHQgYmFjayB0byBhbiBOUFZhcmlhbnQu
CisgICAgY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQocmVzdWx0T2JqZWN0LCBucE9iamVjdCwg
cmVzdWx0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOUE5fRXZhbHVhdGUoTlBQIG5w
cCwgTlBPYmplY3QqIG5wT2JqZWN0LCBOUFN0cmluZyogbnBTY3JpcHQsIE5QVmFyaWFudCogcmVz
dWx0KQoreworICAgIGJvb2wgcG9wdXBzQWxsb3dlZCA9IFdlYkNvcmU6OkNocm9taXVtQnJpZGdl
Ojpwb3B1cHNBbGxvd2VkKG5wcCk7CisgICAgcmV0dXJuIE5QTl9FdmFsdWF0ZUhlbHBlcihucHAs
IHBvcHVwc0FsbG93ZWQsIG5wT2JqZWN0LCBucFNjcmlwdCwgcmVzdWx0KTsKK30KKworYm9vbCBO
UE5fRXZhbHVhdGVIZWxwZXIoTlBQIG5wcCwgYm9vbCBwb3B1cHNBbGxvd2VkLCBOUE9iamVjdCog
bnBPYmplY3QsIE5QU3RyaW5nKiBucFNjcmlwdCwgTlBWYXJpYW50KiByZXN1bHQpCit7CisgICAg
Vk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisgICAgaWYgKCFucE9iamVjdCkKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworCisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MgIT0gbnBTY3JpcHRPYmpl
Y3RDbGFzcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdjg6OkhhbmRsZVNjb3BlIGhh
bmRsZVNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29u
dGV4dChucHAsIG5wT2JqZWN0KTsKKyAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIFY4UHJveHkqIHByb3h5ID0gdG9WOFByb3h5KG5wT2JqZWN0
KTsKKyAgICBBU1NFUlQocHJveHkpOworCisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNv
bnRleHQpOworCisgICAgV2ViQ29yZTo6U3RyaW5nIGZpbGVuYW1lOworICAgIGlmICghcG9wdXBz
QWxsb3dlZCkKKyAgICAgICAgZmlsZW5hbWUgPSAibnBTY3JpcHQiOworCisgICAgLy8gQ29udmVy
dCBVVEYtOCBzdHJlYW0gdG8gV2ViQ29yZTo6U3RyaW5nLgorICAgIFdlYkNvcmU6OlN0cmluZyBz
Y3JpcHQgPSBXZWJDb3JlOjpTdHJpbmc6OmZyb21VVEY4KG5wU2NyaXB0LT5VVEY4Q2hhcmFjdGVy
cywgbnBTY3JpcHQtPlVURjhMZW5ndGgpOworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHY4cmVz
dWx0ID0gcHJveHktPmV2YWx1YXRlKFdlYkNvcmU6OlNjcmlwdFNvdXJjZUNvZGUoc2NyaXB0LCBX
ZWJDb3JlOjpLVVJMKGZpbGVuYW1lKSksIDApOworCisgICAgLy8gSWYgd2UgaGFkIGFuIGVycm9y
LCByZXR1cm4gZmFsc2UuCisgICAgaWYgKHY4cmVzdWx0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQodjhyZXN1bHQsIG5w
T2JqZWN0LCByZXN1bHQpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE5QTl9HZXRQcm9w
ZXJ0eShOUFAgbnBwLCBOUE9iamVjdCogbnBPYmplY3QsIE5QSWRlbnRpZmllciBwcm9wZXJ0eU5h
bWUsIE5QVmFyaWFudCogcmVzdWx0KQoreworICAgIGlmICghbnBPYmplY3QpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzID09IG5wU2NyaXB0T2JqZWN0
Q2xhc3MpIHsKKyAgICAgICAgVjhOUE9iamVjdCogb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxW
OE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVT
Y29wZTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250
ZXh0KG5wcCwgbnBPYmplY3QpOworICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3Bl
KGNvbnRleHQpOworCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqKG9iamVjdC0+
djhPYmplY3QpOworICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2OHJlc3VsdCA9IG9iai0+
R2V0KG5wSWRlbnRpZmllclRvVjhJZGVudGlmaWVyKHByb3BlcnR5TmFtZSkpOworCisgICAgICAg
IGNvbnZlcnRWOE9iamVjdFRvTlBWYXJpYW50KHY4cmVzdWx0LCBucE9iamVjdCwgcmVzdWx0KTsK
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3Mt
Pmhhc1Byb3BlcnR5ICYmIG5wT2JqZWN0LT5fY2xhc3MtPmdldFByb3BlcnR5KSB7CisgICAgICAg
IGlmIChucE9iamVjdC0+X2NsYXNzLT5oYXNQcm9wZXJ0eShucE9iamVjdCwgcHJvcGVydHlOYW1l
KSkKKyAgICAgICAgICAgIHJldHVybiBucE9iamVjdC0+X2NsYXNzLT5nZXRQcm9wZXJ0eShucE9i
amVjdCwgcHJvcGVydHlOYW1lLCByZXN1bHQpOworICAgIH0KKworICAgIFZPSURfVE9fTlBWQVJJ
QU5UKCpyZXN1bHQpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBOUE5fU2V0UHJvcGVy
dHkoTlBQIG5wcCwgTlBPYmplY3QqIG5wT2JqZWN0LCBOUElkZW50aWZpZXIgcHJvcGVydHlOYW1l
LCBjb25zdCBOUFZhcmlhbnQqIHZhbHVlKQoreworICAgIGlmICghbnBPYmplY3QpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzID09IG5wU2NyaXB0T2Jq
ZWN0Q2xhc3MpIHsKKyAgICAgICAgVjhOUE9iamVjdCAqb2JqZWN0ID0gcmVpbnRlcnByZXRfY2Fz
dDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5k
bGVTY29wZTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhD
b250ZXh0KG5wcCwgbnBPYmplY3QpOworICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNj
b3BlKGNvbnRleHQpOworCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqKG9iamVj
dC0+djhPYmplY3QpOworICAgICAgICBvYmotPlNldChucElkZW50aWZpZXJUb1Y4SWRlbnRpZmll
cihwcm9wZXJ0eU5hbWUpLAorICAgICAgICAgICAgICAgICBjb252ZXJ0TlBWYXJpYW50VG9WOE9i
amVjdCh2YWx1ZSwgb2JqZWN0LT5yb290T2JqZWN0LT5mcmFtZSgpLT5zY3JpcHQoKS0+d2luZG93
U2NyaXB0TlBPYmplY3QoKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBp
ZiAobnBPYmplY3QtPl9jbGFzcy0+c2V0UHJvcGVydHkpCisgICAgICAgIHJldHVybiBucE9iamVj
dC0+X2NsYXNzLT5zZXRQcm9wZXJ0eShucE9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZSk7CisK
KyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTlBOX1JlbW92ZVByb3BlcnR5KE5QUCBucHAs
IE5QT2JqZWN0KiBucE9iamVjdCwgTlBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSkKK3sKKyAgICBp
ZiAoIW5wT2JqZWN0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG5wT2JqZWN0LT5f
Y2xhc3MgIT0gbnBTY3JpcHRPYmplY3RDbGFzcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgVjhOUE9iamVjdCAqb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBP
YmplY3QpOworCisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpIYW5k
bGU8djg6OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dChucHAsIG5wT2JqZWN0KTsKKyAg
ICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB2ODo6
Q29udGV4dDo6U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmpl
Y3Q+IG9iaihvYmplY3QtPnY4T2JqZWN0KTsKKyAgICAvLyBGSVhNRTogVmVyaWZ5IHRoYXQgc2V0
dGluZyB0byB1bmRlZmluZWQgaXMgcmlnaHQuCisgICAgb2JqLT5TZXQobnBJZGVudGlmaWVyVG9W
OElkZW50aWZpZXIocHJvcGVydHlOYW1lKSwgdjg6OlVuZGVmaW5lZCgpKTsKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworYm9vbCBOUE5fSGFzUHJvcGVydHkoTlBQIG5wcCwgTlBPYmplY3QqIG5wT2Jq
ZWN0LCBOUElkZW50aWZpZXIgcHJvcGVydHlOYW1lKQoreworICAgIGlmICghbnBPYmplY3QpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzID09IG5wU2Ny
aXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAgVjhOUE9iamVjdCAqb2JqZWN0ID0gcmVpbnRlcnBy
ZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgICAgIHY4OjpIYW5kbGVTY29w
ZSBoYW5kbGVTY29wZTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9
IHRvVjhDb250ZXh0KG5wcCwgbnBPYmplY3QpOworICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5
KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHY4OjpDb250ZXh0OjpTY29w
ZSBzY29wZShjb250ZXh0KTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaihv
YmplY3QtPnY4T2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIG9iai0+SGFzKG5wSWRlbnRpZmllclRv
VjhJZGVudGlmaWVyKHByb3BlcnR5TmFtZSkpOworICAgIH0KKworICAgIGlmIChucE9iamVjdC0+
X2NsYXNzLT5oYXNQcm9wZXJ0eSkKKyAgICAgICAgcmV0dXJuIG5wT2JqZWN0LT5fY2xhc3MtPmhh
c1Byb3BlcnR5KG5wT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOworICAgIHJldHVybiBmYWxzZTsKK30K
KworYm9vbCBOUE5fSGFzTWV0aG9kKE5QUCBucHAsIE5QT2JqZWN0KiBucE9iamVjdCwgTlBJZGVu
dGlmaWVyIG1ldGhvZE5hbWUpCit7CisgICAgaWYgKCFucE9iamVjdCkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MgPT0gbnBTY3JpcHRPYmplY3RDbGFz
cykgeworICAgICAgICBWOE5QT2JqZWN0ICpvYmplY3QgPSByZWludGVycHJldF9jYXN0PFY4TlBP
YmplY3QqPihucE9iamVjdCk7CisKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3Bl
OworICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdG9WOENvbnRleHQo
bnBwLCBucE9iamVjdCk7CisgICAgICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRl
eHQpOworCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqKG9iamVjdC0+djhPYmpl
Y3QpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcHJvcCA9IG9iai0+R2V0KG5wSWRl
bnRpZmllclRvVjhJZGVudGlmaWVyKG1ldGhvZE5hbWUpKTsKKyAgICAgICAgcmV0dXJuIHByb3At
PklzRnVuY3Rpb24oKTsKKyAgICB9CisKKyAgICBpZiAobnBPYmplY3QtPl9jbGFzcy0+aGFzTWV0
aG9kKQorICAgICAgICByZXR1cm4gbnBPYmplY3QtPl9jbGFzcy0+aGFzTWV0aG9kKG5wT2JqZWN0
LCBtZXRob2ROYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTlBOX1NldEV4Y2Vw
dGlvbihOUE9iamVjdCogbnBPYmplY3QsIGNvbnN0IE5QVVRGOCAqbWVzc2FnZSkKK3sKKyAgICBp
ZiAobnBPYmplY3QtPl9jbGFzcyAhPSBucFNjcmlwdE9iamVjdENsYXNzKQorICAgICAgICByZXR1
cm47CisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6
OkNvbnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dCgwLCBucE9iamVjdCk7CisgICAgaWYgKGNv
bnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICB2ODo6Q29udGV4dDo6U2Nv
cGUgc2NvcGUoY29udGV4dCk7CisgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpHRU5F
UkFMX0VSUk9SLCBtZXNzYWdlKTsKK30KKworYm9vbCBOUE5fRW51bWVyYXRlKE5QUCBucHAsIE5Q
T2JqZWN0KiBucE9iamVjdCwgTlBJZGVudGlmaWVyKiogaWRlbnRpZmllciwgdWludDMyX3QqIGNv
dW50KQoreworICAgIGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IGlmIChucE9iamVjdC0+X2NsYXNzID09IG5wU2NyaXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAg
VjhOUE9iamVjdCAqb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmpl
Y3QpOworCisgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICAgICAgdjg6
OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250ZXh0KG5wcCwgbnBPYmplY3Qp
OworICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKworICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaihvYmplY3QtPnY4T2JqZWN0KTsKKworICAgICAg
ICAvLyBGSVhNRTogaHR0cDovL2IvaXNzdWU/aWQ9MTIxMDM0MDogVXNlIGEgdjg6Ok9iamVjdDo6
S2V5cygpIG1ldGhvZCB3aGVuIGl0IGV4aXN0cywgaW5zdGVhZCBvZiBldmFsdWF0aW5nIGphdmFz
Y3JpcHQuCisKKyAgICAgICAgLy8gRklYTUU6IEZpZ3VyZSBvdXQgaG93IHRvIGNhY2hlIHRoaXMg
aGVscGVyIGZ1bmN0aW9uLiAgUnVuIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY29sbGVjdHMgdGhl
IHByb3BlcnRpZXMKKyAgICAgICAgLy8gb24gdGhlIG9iamVjdCBpbnRvIGFuIGFycmF5LgorICAg
ICAgICBjb25zdCBjaGFyIGVudW1lcmF0b3JDb2RlW10gPQorICAgICAgICAgICAgIihmdW5jdGlv
biAob2JqKSB7IgorICAgICAgICAgICAgIiAgdmFyIHByb3BzID0gW107IgorICAgICAgICAgICAg
IiAgZm9yICh2YXIgcHJvcCBpbiBvYmopIHsiCisgICAgICAgICAgICAiICAgIHByb3BzW3Byb3Bz
Lmxlbmd0aF0gPSBwcm9wOyIKKyAgICAgICAgICAgICIgIH0iCisgICAgICAgICAgICAiICByZXR1
cm4gcHJvcHM7IgorICAgICAgICAgICAgIn0pOyI7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0
cmluZz4gc291cmNlID0gdjg6OlN0cmluZzo6TmV3KGVudW1lcmF0b3JDb2RlKTsKKyAgICAgICAg
djg6OkhhbmRsZTx2ODo6U2NyaXB0PiBzY3JpcHQgPSB2ODo6U2NyaXB0OjpDb21waWxlKHNvdXJj
ZSwgMCk7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBlbnVtZXJhdG9yT2JqID0gc2Ny
aXB0LT5SdW4oKTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGVudW1lcmF0b3Ig
PSB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj46OkNhc3QoZW51bWVyYXRvck9iaik7CisgICAgICAg
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhcmd2W10gPSB7IG9iaiB9OworICAgICAgICB2ODo6TG9j
YWw8djg6OlZhbHVlPiBwcm9wc09iaiA9IGVudW1lcmF0b3ItPkNhbGwodjg6OkhhbmRsZTx2ODo6
T2JqZWN0Pjo6Q2FzdChlbnVtZXJhdG9yT2JqKSwgQVJSQVlTSVpFX1VOU0FGRShhcmd2KSwgYXJn
dik7CisgICAgICAgIGlmIChwcm9wc09iai5Jc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzdWx0cyBpbnRvIGFuIGFycmF5IG9m
IE5QSWRlbnRpZmllcnMuCisgICAgICAgIHY4OjpIYW5kbGU8djg6OkFycmF5PiBwcm9wcyA9IHY4
OjpIYW5kbGU8djg6OkFycmF5Pjo6Q2FzdChwcm9wc09iaik7CisgICAgICAgICpjb3VudCA9IHBy
b3BzLT5MZW5ndGgoKTsKKyAgICAgICAgKmlkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxOUElkZW50
aWZpZXIqPihtYWxsb2Moc2l6ZW9mKE5QSWRlbnRpZmllciopICogKmNvdW50KSk7CisgICAgICAg
IGZvciAodWludDMyX3QgaSA9IDA7IGkgPCAqY291bnQ7ICsraSkgeworICAgICAgICAgICAgdjg6
OkxvY2FsPHY4OjpWYWx1ZT4gbmFtZSA9IHByb3BzLT5HZXQodjg6OkludGVnZXI6Ok5ldyhpKSk7
CisgICAgICAgICAgICAoKmlkZW50aWZpZXIpW2ldID0gZ2V0U3RyaW5nSWRlbnRpZmllcih2ODo6
TG9jYWw8djg6OlN0cmluZz46OkNhc3QobmFtZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIGlmIChOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTl9IQVNfRU5V
TShucE9iamVjdC0+X2NsYXNzKSAmJiBucE9iamVjdC0+X2NsYXNzLT5lbnVtZXJhdGUpCisgICAg
ICAgcmV0dXJuIG5wT2JqZWN0LT5fY2xhc3MtPmVudW1lcmF0ZShucE9iamVjdCwgaWRlbnRpZmll
ciwgY291bnQpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE5QTl9Db25zdHJ1Y3Qo
TlBQIG5wcCwgTlBPYmplY3QqIG5wT2JqZWN0LCBjb25zdCBOUFZhcmlhbnQqIGFyZ3VtZW50cywg
dWludDMyX3QgYXJndW1lbnRDb3VudCwgTlBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKCFu
cE9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG5wT2JqZWN0LT5fY2xh
c3MgPT0gbnBTY3JpcHRPYmplY3RDbGFzcykgeworICAgICAgICBWOE5QT2JqZWN0ICpvYmplY3Qg
PSByZWludGVycHJldF9jYXN0PFY4TlBPYmplY3QqPihucE9iamVjdCk7CisKKyAgICAgICAgdjg6
OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0
PiBjb250ZXh0ID0gdG9WOENvbnRleHQobnBwLCBucE9iamVjdCk7CisgICAgICAgIGlmIChjb250
ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdjg6OkNv
bnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgICAgIC8vIExvb2t1cCB0aGUgY29u
c3RydWN0b3IgZnVuY3Rpb24uCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gY3Rvck9i
aihvYmplY3QtPnY4T2JqZWN0KTsKKyAgICAgICAgaWYgKCFjdG9yT2JqLT5Jc0Z1bmN0aW9uKCkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgY29uc3Ry
dWN0b3IuCisgICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJlc3VsdE9iamVjdDsKKyAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGN0b3Iodjg6OkZ1bmN0aW9uOjpDYXN0KCpjdG9y
T2JqKSk7CisgICAgICAgIGlmICghY3Rvci0+SXNOdWxsKCkpIHsKKyAgICAgICAgICAgIFY4UHJv
eHkqIHByb3h5ID0gdG9WOFByb3h5KG5wT2JqZWN0KTsKKyAgICAgICAgICAgIEFTU0VSVChwcm94
eSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBsaXN0IG9mIGFyZ3VtZW50cyB0byBwYXNzIHRv
IHY4LgorICAgICAgICAgICAgT3duQXJyYXlQdHI8djg6OkhhbmRsZTx2ODo6VmFsdWU+ID4gYXJn
dihjcmVhdGVWYWx1ZUxpc3RGcm9tVmFyaWFudEFyZ3MoYXJndW1lbnRzLCBhcmd1bWVudENvdW50
LCBucE9iamVjdCkpOworICAgICAgICAgICAgcmVzdWx0T2JqZWN0ID0gcHJveHktPk5ld0luc3Rh
bmNlKGN0b3IsIGFyZ3VtZW50Q291bnQsIGFyZ3YuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAg
ICAgLy8gSWYgd2UgaGFkIGFuIGVycm9yIHJldHVybiBmYWxzZS4KKyAgICAgICAgaWYgKHJlc3Vs
dE9iamVjdC5Jc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAg
Ly8gQ29udmVydCB0aGUgcmVzdWx0IGJhY2sgdG8gYW4gTlBWYXJpYW50LgorICAgICAgICBjb252
ZXJ0VjhPYmplY3RUb05QVmFyaWFudChyZXN1bHRPYmplY3QsIG5wT2JqZWN0LCByZXN1bHQpOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoTlBfQ0xBU1NfU1RSVUNUX1ZF
UlNJT05fSEFTX0NUT1IobnBPYmplY3QtPl9jbGFzcykgJiYgbnBPYmplY3QtPl9jbGFzcy0+Y29u
c3RydWN0KQorICAgICAgICByZXR1cm4gbnBPYmplY3QtPl9jbGFzcy0+Y29uc3RydWN0KG5wT2Jq
ZWN0LCBhcmd1bWVudHMsIGFyZ3VtZW50Q291bnQsIHJlc3VsdCk7CisKKyAgICByZXR1cm4gZmFs
c2U7Cit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRpbmdzL3Y4L05QVjhPYmplY3QuaCBiL1dl
YkNvcmUvYmluZGluZ3MvdjgvTlBWOE9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjY1YTdjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4
L05QVjhPYmplY3QuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2
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
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKyNpZm5kZWYgTlBW
OE9iamVjdF9oCisjZGVmaW5lIE5QVjhPYmplY3RfaAorCisjaW5jbHVkZSAiYmluZGluZ3MvbnBy
dW50aW1lLmgiCisjaW5jbHVkZSA8djguaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNs
YXNzIERPTVdpbmRvdzsKK30KKworZXh0ZXJuIE5QQ2xhc3MqIG5wU2NyaXB0T2JqZWN0Q2xhc3M7
CisKKy8vIEEgVjhOUE9iamVjdCBpcyBhIE5QT2JqZWN0IHdoaWNoIGNhcnJpZXMgYWRkaXRpb25h
bCBWOC1zcGVjaWZpYyBpbmZvcm1hdGlvbi4gSXQgaXMgYWxsb2NhdGVkIGFuZCBkZWFsbG9jYXRl
ZCBieQorLy8gQWxsb2NWOE5QT2JqZWN0KCkgYW5kIEZyZWVWOE5QT2JqZWN0KCkgbWV0aG9kcy4K
K3N0cnVjdCBWOE5QT2JqZWN0IHsKKyAgICBOUE9iamVjdCBvYmplY3Q7CisgICAgdjg6OlBlcnNp
c3RlbnQ8djg6Ok9iamVjdD4gdjhPYmplY3Q7CisgICAgV2ViQ29yZTo6RE9NV2luZG93KiByb290
T2JqZWN0OworfTsKKworc3RydWN0IFByaXZhdGVJZGVudGlmaWVyIHsKKyAgICB1bmlvbiB7Cisg
ICAgICAgIGNvbnN0IE5QVVRGOCogc3RyaW5nOworICAgICAgICBpbnQzMl90IG51bWJlcjsKKyAg
ICB9IHZhbHVlOworICAgIGJvb2wgaXNTdHJpbmc7Cit9OworCitOUE9iamVjdCogbnBDcmVhdGVW
OFNjcmlwdE9iamVjdChOUFAsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4sIFdlYkNvcmU6OkRPTVdp
bmRvdyopOworCisjZW5kaWYgLy8gTlBWOE9iamVjdF9oCmRpZmYgLS1naXQgYS9XZWJDb3JlL2Jp
bmRpbmdzL3Y4L1Y4TlBVdGlscy5jcHAgYi9XZWJDb3JlL2JpbmRpbmdzL3Y4L1Y4TlBVdGlscy5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkyZGIxMgotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhOUFV0aWxzLmNwcApAQCAtMCwwICsxLDEy
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0
OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
CisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9m
IEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJl
IHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhp
cyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBB
TkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlS
SUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERB
VEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIlY4TlBVdGlscy5oIgor
CisjaW5jbHVkZSAiRE9NV2luZG93LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgorI3VuZGVmIExPRworCisjaW5jbHVkZSAiTlBWOE9iamVjdC5oIgor
I2luY2x1ZGUgIlY4TlBPYmplY3QuaCIKKyNpbmNsdWRlICJWOFByb3h5LmgiCisjaW5jbHVkZSAi
bnBydW50aW1lX3ByaXYuaCIKKwordm9pZCBjb252ZXJ0VjhPYmplY3RUb05QVmFyaWFudCh2ODo6
TG9jYWw8djg6OlZhbHVlPiBvYmplY3QsIE5QT2JqZWN0KiBvd25lciwgTlBWYXJpYW50KiByZXN1
bHQpCit7CisgICAgVk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisKKyAgICAvLyBJdCBpcyBy
ZWFsbHkgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGRlYWwgd2l0aCB0aGUgZW1wdHkg
aGFuZGxlIGNhc2UgYmVjYXVzZSB0aGVyZSBjb3VsZCBiZSBkaWZmZXJlbnQgYWN0aW9ucyB0bwor
ICAgIC8vIHRha2UgaW4gZGlmZmVyZW50IGNvbnRleHRzLgorICAgIEFTU0VSVCghb2JqZWN0Lklz
RW1wdHkoKSk7CisKKyAgICBpZiAob2JqZWN0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKG9iamVjdC0+SXNJbnQzMigpKQorICAgICAgICBJTlQzMl9UT19OUFZBUklBTlQo
b2JqZWN0LT5OdW1iZXJWYWx1ZSgpLCAqcmVzdWx0KTsKKyAgICBlbHNlIGlmIChvYmplY3QtPklz
TnVtYmVyKCkpCisgICAgICAgIERPVUJMRV9UT19OUFZBUklBTlQob2JqZWN0LT5OdW1iZXJWYWx1
ZSgpLCAqcmVzdWx0KTsKKyAgICBlbHNlIGlmIChvYmplY3QtPklzQm9vbGVhbigpKQorICAgICAg
ICBCT09MRUFOX1RPX05QVkFSSUFOVChvYmplY3QtPkJvb2xlYW5WYWx1ZSgpLCAqcmVzdWx0KTsK
KyAgICBlbHNlIGlmIChvYmplY3QtPklzTnVsbCgpKQorICAgICAgICBOVUxMX1RPX05QVkFSSUFO
VCgqcmVzdWx0KTsKKyAgICBlbHNlIGlmIChvYmplY3QtPklzVW5kZWZpbmVkKCkpCisgICAgICAg
IFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAgIGVsc2UgaWYgKG9iamVjdC0+SXNTdHJp
bmcoKSkgeworICAgICAgICB2ODo6U3RyaW5nOjpVdGY4VmFsdWUgdXRmOChvYmplY3QpOworICAg
ICAgICBjaGFyKiB1dGY4X2NoYXJzID0gc3RyZHVwKCp1dGY4KTsKKyAgICAgICAgU1RSSU5HTl9U
T19OUFZBUklBTlQodXRmOF9jaGFycywgdXRmOC5sZW5ndGgoKSwgKnJlc3VsdCk7CisgICAgfSBl
bHNlIGlmIChvYmplY3QtPklzT2JqZWN0KCkpIHsKKyAgICAgICAgV2ViQ29yZTo6RE9NV2luZG93
KiB3aW5kb3cgPSBXZWJDb3JlOjpWOFByb3h5OjpyZXRyaWV2ZVdpbmRvdygpOworICAgICAgICBO
UE9iamVjdCogbnBvYmplY3QgPSBucENyZWF0ZVY4U2NyaXB0T2JqZWN0KDAsIHY4OjpIYW5kbGU8
djg6Ok9iamVjdD46OkNhc3Qob2JqZWN0KSwgd2luZG93KTsKKyAgICAgICAgaWYgKG5wb2JqZWN0
KQorICAgICAgICAgICAgX05QTl9SZWdpc3Rlck9iamVjdChucG9iamVjdCwgb3duZXIpOworICAg
ICAgICBPQkpFQ1RfVE9fTlBWQVJJQU5UKG5wb2JqZWN0LCAqcmVzdWx0KTsKKyAgICB9Cit9CisK
Kwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnZlcnROUFZhcmlhbnRUb1Y4T2JqZWN0KGNvbnN0
IE5QVmFyaWFudCogdmFyaWFudCwgTlBPYmplY3QqIG5wb2JqZWN0KQoreworICAgIE5QVmFyaWFu
dFR5cGUgdHlwZSA9IHZhcmlhbnQtPnR5cGU7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBj
YXNlIE5QVmFyaWFudFR5cGVfSW50MzI6CisgICAgICAgIHJldHVybiB2ODo6SW50ZWdlcjo6TmV3
KE5QVkFSSUFOVF9UT19JTlQzMigqdmFyaWFudCkpOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9E
b3VibGU6CisgICAgICAgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcoTlBWQVJJQU5UX1RPX0RPVUJM
RSgqdmFyaWFudCkpOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9Cb29sOgorICAgICAgICByZXR1
cm4gTlBWQVJJQU5UX1RPX0JPT0xFQU4oKnZhcmlhbnQpID8gdjg6OlRydWUoKSA6IHY4OjpGYWxz
ZSgpOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9OdWxsOgorICAgICAgICByZXR1cm4gdjg6Ok51
bGwoKTsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfVm9pZDoKKyAgICAgICAgcmV0dXJuIHY4OjpV
bmRlZmluZWQoKTsKKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfU3RyaW5nOiB7CisgICAgICAgIE5Q
U3RyaW5nIHNyYyA9IE5QVkFSSUFOVF9UT19TVFJJTkcoKnZhcmlhbnQpOworICAgICAgICByZXR1
cm4gdjg6OlN0cmluZzo6TmV3KHNyYy5VVEY4Q2hhcmFjdGVycywgc3JjLlVURjhMZW5ndGgpOwor
ICAgIH0KKyAgICBjYXNlIE5QVmFyaWFudFR5cGVfT2JqZWN0OiB7CisgICAgICAgIE5QT2JqZWN0
KiBvYmogPSBOUFZBUklBTlRfVE9fT0JKRUNUKCp2YXJpYW50KTsKKyAgICAgICAgaWYgKG9iai0+
X2NsYXNzID09IG5wU2NyaXB0T2JqZWN0Q2xhc3MpCisgICAgICAgICAgICByZXR1cm4gcmVpbnRl
cnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4ob2JqKS0+djhPYmplY3Q7CisgICAgICAgIHJldHVybiBj
cmVhdGVWOE9iamVjdEZvck5QT2JqZWN0KG9iaiwgbnBvYmplY3QpOworICAgIH0KKyAgICBkZWZh
dWx0OgorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAgIH0KK30KKworLy8gSGVs
cGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBOUE4gU3RyaW5nIElkZW50aWZpZXIgZnJvbSBhIHY4
IHN0cmluZy4KK05QSWRlbnRpZmllciBnZXRTdHJpbmdJZGVudGlmaWVyKHY4OjpIYW5kbGU8djg6
OlN0cmluZz4gc3RyKQoreworICAgIGNvbnN0IGludCBrU3RhY2tCdWZmZXJTaXplID0gMTAwOwor
CisgICAgaW50IGJ1ZmZlckxlbmd0aCA9IHN0ci0+TGVuZ3RoKCkgKyAxOworICAgIGlmIChidWZm
ZXJMZW5ndGggPD0ga1N0YWNrQnVmZmVyU2l6ZSkgeworICAgICAgICAvLyBVc2UgbG9jYWwgc3Rh
Y2sgYnVmZmVyIHRvIGF2b2lkIGhlYXAgYWxsb2NhdGlvbnMgZm9yIHNtYWxsIHN0cmluZ3MuIEhl
cmUgd2Ugc2hvdWxkIG9ubHkgdXNlIHRoZSBzdGFjayBzcGFjZSBmb3IKKyAgICAgICAgLy8gc3Rh
Y2tCdWZmZXIgd2hlbiBpdCdzIHVzZWQsIG5vdCB3aGVuIHdlIHVzZSB0aGUgaGVhcC4KKyAgICAg
ICAgLy8KKyAgICAgICAgLy8gV3JpdGVBc2NpaSBpcyBndWFyYW50ZWVkIHRvIGdlbmVyYXRlIGEg
bnVsbC10ZXJtaW5hdGVkIHN0cmluZyBiZWNhdXNlIGJ1ZmZlckxlbmd0aCBpcyBjb25zdHJ1Y3Rl
ZCB0byBiZSBvbmUgZ3JlYXRlcgorICAgICAgICAvLyB0aGFuIHRoZSBzdHJpbmcgbGVuZ3RoLgor
ICAgICAgICBjaGFyIHN0YWNrQnVmZmVyW2tTdGFja0J1ZmZlclNpemVdOworICAgICAgICBzdHIt
PldyaXRlQXNjaWkoc3RhY2tCdWZmZXIsIDAsIGJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHJldHVy
biBOUE5fR2V0U3RyaW5nSWRlbnRpZmllcihzdGFja0J1ZmZlcik7CisgICAgfQorCisgICAgdjg6
OlN0cmluZzo6QXNjaWlWYWx1ZSBhc2NpaShzdHIpOworICAgIHJldHVybiBOUE5fR2V0U3RyaW5n
SWRlbnRpZmllcigqYXNjaWkpOworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9W
OE5QVXRpbHMuaCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhOUFV0aWxzLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhNzRiMwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvYmluZGluZ3MvdjgvVjhOUFV0aWxzLmgKQEAgLTAsMCArMSw0NiBAQAorLyogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3LCAyMDA4LCAyMDA5IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICog
ICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRo
ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK
KyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIElu
Yy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBl
bmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklC
VVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBP
V05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
CisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2lmbmRlZiBWOE5QVXRpbHNfaAorI2RlZmluZSBWOE5QVXRpbHNfaAorCisjaW5jbHVkZSA8djgu
aD4KKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9ucGFwaS9iaW5kaW5ncy9ucHJ1bnRpbWUuaCIKKwor
Ly8gQ29udmVydCBhIFY4IFZhbHVlIG9mIGFueSB0eXBlIChzdHJpbmcsIGJvb2wsIG9iamVjdCwg
ZXRjKSB0byBhIE5QVmFyaWFudC4KK3ZvaWQgY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQodjg6
OkxvY2FsPHY4OjpWYWx1ZT4sIE5QT2JqZWN0KiwgTlBWYXJpYW50Kik7CisKKy8vIENvbnZlcnQg
YSBOUFZhcmlhbnQgKHN0cmluZywgYm9vbCwgb2JqZWN0LCBldGMpIGJhY2sgdG8gYSBWOCBWYWx1
ZS4gIFRoZSBvd25lciBvYmplY3QgaXMgdGhlIE5QT2JqZWN0IHdoaWNoIHJlbGF0ZXMgdG8gdGhl
CisvLyBvYmplY3QsIGlmIHRoZSBvYmplY3QgaXMgYW4gT2JqZWN0LiAgVGhlIGNyZWF0ZWQgTlBP
YmplY3Qgd2lsbCBiZSB0aWVkIHRvIHRoZSBsaWZldGltZSBvZiB0aGUgb3duZXIuCit2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gY29udmVydE5QVmFyaWFudFRvVjhPYmplY3QoY29uc3QgTlBWYXJpYW50
KiwgTlBPYmplY3QqKTsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSBhbiBOUE4gU3Ry
aW5nIElkZW50aWZpZXIgZnJvbSBhIHY4IHN0cmluZy4KK05QSWRlbnRpZmllciBnZXRTdHJpbmdJ
ZGVudGlmaWVyKHY4OjpIYW5kbGU8djg6OlN0cmluZz4pOworCisjZW5kaWYgLy8gVjhOUFV0aWxz
X2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>31810</attachid>
            <date>2009-06-24 14:10:05 -0700</date>
            <delta_ts>2009-06-24 17:47:56 -0700</delta_ts>
            <desc>Remove some of the more obvious comments, and fix * association.</desc>
            <filename>v8upstream.patch</filename>
            <type>text/plain</type>
            <size>30392</size>
            <attacher name="Albert J. Wong">ajwong</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
Njk3NDhjOS4uOGRkMmNmNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwzNyBAQAorMjAwOS0wNi0yMyAgQWxiZXJ0IEouIFdv
bmcgIDxhandvbmdAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAo
T09QUyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD0yNjU2NgorICAgICAgICBVcHN0cmVhbSB0aGVzZSBmaWxlcyBmcm9tIHRoZSBjaHJvbWl1bSB2
OCBjb2RlLiAgTm8gdGVzdHMgd2VyZQorICAgICAgICBhZmZlY3RlZCBiZWNhdXNlIHRoaXMgaXMg
ZXNzZW50aWFsbHkgYSBjb2RlIG1vdmUuCisKKyAgICAgICAgKiBiaW5kaW5ncy92OC9OUFY4T2Jq
ZWN0LmNwcDogQWRkZWQuCisgICAgICAgIChhbGxvY1Y4TlBPYmplY3QpOgorICAgICAgICAoZnJl
ZVY4TlBPYmplY3QpOgorICAgICAgICAobGlzdEZyb21WYXJpYW50QXJncyk6CisgICAgICAgIChu
cElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcik6CisgICAgICAgIChucENyZWF0ZVY4U2NyaXB0T2Jq
ZWN0KToKKyAgICAgICAgKE5QTl9JbnZva2UpOgorICAgICAgICAoTlBOX0ludm9rZURlZmF1bHQp
OgorICAgICAgICAoTlBOX0V2YWx1YXRlKToKKyAgICAgICAgKE5QTl9FdmFsdWF0ZUhlbHBlcik6
CisgICAgICAgIChOUE5fR2V0UHJvcGVydHkpOgorICAgICAgICAoTlBOX1NldFByb3BlcnR5KToK
KyAgICAgICAgKE5QTl9SZW1vdmVQcm9wZXJ0eSk6CisgICAgICAgIChOUE5fSGFzUHJvcGVydHkp
OgorICAgICAgICAoTlBOX0hhc01ldGhvZCk6CisgICAgICAgIChOUE5fU2V0RXhjZXB0aW9uKToK
KyAgICAgICAgKE5QTl9FbnVtZXJhdGUpOgorICAgICAgICAoTlBOX0NvbnN0cnVjdCk6CisgICAg
ICAgICogYmluZGluZ3MvdjgvTlBWOE9iamVjdC5oOiBBZGRlZC4KKyAgICAgICAgKFByaXZhdGVJ
ZGVudGlmaWVyOjopOgorICAgICAgICAqIGJpbmRpbmdzL3Y4L1Y4TlBVdGlscy5jcHA6IEFkZGVk
LgorICAgICAgICAoY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQpOgorICAgICAgICAoY29udmVy
dE5QVmFyaWFudFRvVjhPYmplY3QpOgorICAgICAgICAoZ2V0U3RyaW5nSWRlbnRpZmllcik6Cisg
ICAgICAgICogYmluZGluZ3MvdjgvVjhOUFV0aWxzLmg6IEFkZGVkLgorCiAyMDA5LTA2LTIyICBE
YXZpZCBIeWF0dCAgPGh5YXR0QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTYW0g
V2VpbmlnLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9iaW5kaW5ncy92OC9OUFY4T2JqZWN0LmNwcCBi
L1dlYkNvcmUvYmluZGluZ3MvdjgvTlBWOE9iamVjdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uMjMyOThmNQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmluZGlu
Z3MvdjgvTlBWOE9iamVjdC5jcHAKQEAgLTAsMCArMSw1MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDQsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDgsIDIwMDkgR29vZ2xlLCBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIk5Q
VjhPYmplY3QuaCIKKworI2luY2x1ZGUgIkNocm9taXVtQnJpZGdlLmgiCisjaW5jbHVkZSAiRE9N
V2luZG93LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJPd25BcnJheVB0ci5oIgor
I2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU2NyaXB0Q29udHJvbGxlci5o
IgorI2luY2x1ZGUgIlY4Q3VzdG9tQmluZGluZy5oIgorI2luY2x1ZGUgIlY4SGVscGVycy5oIgor
I2luY2x1ZGUgIlY4TlBVdGlscy5oIgorI2luY2x1ZGUgIlY4UHJveHkuaCIKKyNpbmNsdWRlICJi
aW5kaW5ncy9ucHJ1bnRpbWUuaCIKKyNpbmNsdWRlICJucHJ1bnRpbWVfcHJpdi5oIgorCisjaW5j
bHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx2OC5oPgorCit1c2luZyBXZWJDb3JlOjp0b1Y4Q29u
dGV4dDsKK3VzaW5nIFdlYkNvcmU6OnRvVjhQcm94eTsKK3VzaW5nIFdlYkNvcmU6OlY4Q2xhc3NJ
bmRleDsKK3VzaW5nIFdlYkNvcmU6OlY4Q3VzdG9tOwordXNpbmcgV2ViQ29yZTo6VjhQcm94eTsK
KworLy8gRklYTUU6IENvbW1lbnRzIG9uIHdoeSB1c2UgbWFsbG9jIGFuZCBmcmVlLgorc3RhdGlj
IE5QT2JqZWN0KiBhbGxvY1Y4TlBPYmplY3QoTlBQLCBOUENsYXNzKikKK3sKKyAgICByZXR1cm4g
c3RhdGljX2Nhc3Q8TlBPYmplY3QqPihtYWxsb2Moc2l6ZW9mKFY4TlBPYmplY3QpKSk7Cit9CisK
K3N0YXRpYyB2b2lkIGZyZWVWOE5QT2JqZWN0KE5QT2JqZWN0KiBucE9iamVjdCkKK3sKKyAgICBW
OE5QT2JqZWN0KiB2OE5wT2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBP
YmplY3QpOworI2lmbmRlZiBOREVCVUcKKyAgICBWOFByb3h5OjpVbnJlZ2lzdGVyR2xvYmFsSGFu
ZGxlKHY4TnBPYmplY3QsIHY4TnBPYmplY3QtPnY4T2JqZWN0KTsKKyNlbmRpZgorICAgIHY4TnBP
YmplY3QtPnY4T2JqZWN0LkRpc3Bvc2UoKTsKKyAgICBmcmVlKHY4TnBPYmplY3QpOworfQorCitz
dGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+KiBjcmVhdGVWYWx1ZUxpc3RGcm9tVmFyaWFudEFy
Z3MoY29uc3QgTlBWYXJpYW50KiBhcmd1bWVudHMsIHVpbnQzMl90IGFyZ3VtZW50Q291bnQsIE5Q
T2JqZWN0KiBvd25lcikKK3sKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4qIGFyZ3YgPSBuZXcg
djg6OkhhbmRsZTx2ODo6VmFsdWU+W2FyZ3VtZW50Q291bnRdOworICAgIGZvciAodWludDMyX3Qg
aW5kZXggPSAwOyBpbmRleCA8IGFyZ3VtZW50Q291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgY29u
c3QgTlBWYXJpYW50KiBhcmcgPSAmYXJndW1lbnRzW2luZGV4XTsKKyAgICAgICAgYXJndltpbmRl
eF0gPSBjb252ZXJ0TlBWYXJpYW50VG9WOE9iamVjdChhcmcsIG93bmVyKTsKKyAgICB9CisgICAg
cmV0dXJuIGFyZ3Y7Cit9CisKKy8vIENyZWF0ZSBhbiBpZGVudGlmaWVyIChudWxsIHRlcm1pbmF0
ZWQgdXRmOCBjaGFyKikgZnJvbSB0aGUgTlBJZGVudGlmaWVyLgorc3RhdGljIHY4OjpMb2NhbDx2
ODo6U3RyaW5nPiBucElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcihOUElkZW50aWZpZXIgbmFtZSkK
K3sKKyAgICBQcml2YXRlSWRlbnRpZmllciogaWRlbnRpZmllciA9IHN0YXRpY19jYXN0PFByaXZh
dGVJZGVudGlmaWVyKj4obmFtZSk7CisgICAgaWYgKGlkZW50aWZpZXItPmlzU3RyaW5nKQorICAg
ICAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPihpZGVu
dGlmaWVyLT52YWx1ZS5zdHJpbmcpKTsKKworICAgIGNoYXIgYnVmZmVyWzMyXTsKKyAgICBzbnBy
aW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJWQiLCBpZGVudGlmaWVyLT52YWx1ZS5udW1i
ZXIpOworICAgIHJldHVybiB2ODo6U3RyaW5nOjpOZXcoYnVmZmVyKTsKK30KKworc3RhdGljIE5Q
Q2xhc3MgVjhOUE9iamVjdENsYXNzID0geyBOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTiwKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NWOE5QT2JqZWN0LAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlVjhOUE9iamVjdCwKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCisvLyBO
UEFQSSdzIG5wcnVudGltZSBmdW5jdGlvbnMuCitOUENsYXNzKiBucFNjcmlwdE9iamVjdENsYXNz
ID0gJlY4TlBPYmplY3RDbGFzczsKKworTlBPYmplY3QqIG5wQ3JlYXRlVjhTY3JpcHRPYmplY3Qo
TlBQIG5wcCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3QsIFdlYkNvcmU6OkRPTVdpbmRv
dyogcm9vdCkKK3sKKyAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB0eXBlSW5kZXggPSBvYmplY3Qt
PkdldEludGVybmFsRmllbGQoVjhDdXN0b206OmtET01XcmFwcGVyVHlwZUluZGV4KTsKKyAgICAv
LyBDaGVjayB0byBzZWUgaWYgdGhpcyBvYmplY3QgaXMgYWxyZWFkeSB3cmFwcGVkLgorICAgIGlm
IChvYmplY3QtPkludGVybmFsRmllbGRDb3VudCgpID09IFY4Q3VzdG9tOjprTlBPYmplY3RJbnRl
cm5hbEZpZWxkQ291bnQgJiYgdHlwZUluZGV4LT5Jc051bWJlcigpICYmIHR5cGVJbmRleC0+VWlu
dDMyVmFsdWUoKSA9PSBWOENsYXNzSW5kZXg6Ok5QT0JKRUNUKSB7CisKKyAgICAgICAgTlBPYmpl
Y3QqIHJldHVyblZhbHVlID0gVjhQcm94eTo6VG9OYXRpdmVPYmplY3Q8TlBPYmplY3Q+KFY4Q2xh
c3NJbmRleDo6TlBPQkpFQ1QsIG9iamVjdCk7CisgICAgICAgIE5QTl9SZXRhaW5PYmplY3QocmV0
dXJuVmFsdWUpOworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorCisgICAgVjhO
UE9iamVjdCogdjhucE9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VjhOUE9iamVjdCo+KE5QTl9D
cmVhdGVPYmplY3QobnBwLCAmVjhOUE9iamVjdENsYXNzKSk7CisgICAgdjhucE9iamVjdC0+djhP
YmplY3QgPSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KG9iamVjdCk7CisjaWZuZGVm
IE5ERUJVRworICAgIFY4UHJveHk6OlJlZ2lzdGVyR2xvYmFsSGFuZGxlKFdlYkNvcmU6Ok5QT0JK
RUNULCB2OG5wT2JqZWN0LCB2OG5wT2JqZWN0LT52OE9iamVjdCk7CisjZW5kaWYKKyAgICB2OG5w
T2JqZWN0LT5yb290T2JqZWN0ID0gcm9vdDsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxO
UE9iamVjdCo+KHY4bnBPYmplY3QpOworfQorCitib29sIE5QTl9JbnZva2UoTlBQIG5wcCwgTlBP
YmplY3QqIG5wT2JqZWN0LCBOUElkZW50aWZpZXIgbWV0aG9kTmFtZSwgY29uc3QgTlBWYXJpYW50
KiBhcmd1bWVudHMsIHVpbnQzMl90IGFyZ3VtZW50Q291bnQsIE5QVmFyaWFudCogcmVzdWx0KQor
eworICAgIGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChu
cE9iamVjdC0+X2NsYXNzICE9IG5wU2NyaXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAgaWYgKG5w
T2JqZWN0LT5fY2xhc3MtPmludm9rZURlZmF1bHQpCisgICAgICAgICAgICByZXR1cm4gbnBPYmpl
Y3QtPl9jbGFzcy0+aW52b2tlRGVmYXVsdChucE9iamVjdCwgYXJndW1lbnRzLCBhcmd1bWVudENv
dW50LCByZXN1bHQpOworCisgICAgICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBWOE5QT2JqZWN0KiB2OE5wT2JqZWN0ID0g
cmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgUHJpdmF0ZUlk
ZW50aWZpZXIqIGlkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxQcml2YXRlSWRlbnRpZmllcio+KG1l
dGhvZE5hbWUpOworICAgIGlmICghaWRlbnRpZmllci0+aXNTdHJpbmcpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICAvLyBGSVhN
RTogc2hvdWxkIHVzZSB0aGUgcGx1Z2luJ3Mgb3duZXIgZnJhbWUgYXMgdGhlIHNlY3VyaXR5IGNv
bnRleHQuCisgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250ZXh0
KG5wcCwgbnBPYmplY3QpOworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworCisgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisg
ICAgaWYgKG1ldGhvZE5hbWUgPT0gTlBOX0dldFN0cmluZ0lkZW50aWZpZXIoImV2YWwiKSkgewor
ICAgICAgICBpZiAoYXJndW1lbnRDb3VudCAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICBpZiAoYXJndW1lbnRzWzBdLnR5cGUgIT0gTlBWYXJpYW50VHlwZV9TdHJpbmcp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBOUE5fRXZhbHVhdGUo
bnBwLCBucE9iamVjdCwgY29uc3RfY2FzdDxOUFN0cmluZyo+KCZhcmd1bWVudHNbMF0udmFsdWUu
c3RyaW5nVmFsdWUpLCByZXN1bHQpOworICAgIH0KKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBmdW5jdGlvbk9iamVjdCA9IHY4TnBPYmplY3QtPnY4T2JqZWN0LT5HZXQodjg6OlN0cmluZzo6
TmV3KGlkZW50aWZpZXItPnZhbHVlLnN0cmluZykpOworICAgIGlmIChmdW5jdGlvbk9iamVjdC5J
c0VtcHR5KCkgfHwgZnVuY3Rpb25PYmplY3QtPklzTnVsbCgpKSB7CisgICAgICAgIE5VTExfVE9f
TlBWQVJJQU5UKCpyZXN1bHQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlm
IChmdW5jdGlvbk9iamVjdC0+SXNVbmRlZmluZWQoKSkgeworICAgICAgICBWT0lEX1RPX05QVkFS
SUFOVCgqcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFY4UHJv
eHkqIHByb3h5ID0gdG9WOFByb3h5KG5wT2JqZWN0KTsKKyAgICBBU1NFUlQocHJveHkpOworCisg
ICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24gb2JqZWN0LgorICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0
aW9uPiBmdW5jdGlvbiA9IHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPjo6Q2FzdChmdW5jdGlvbk9i
amVjdCk7CisgICAgT3duQXJyYXlQdHI8djg6OkhhbmRsZTx2ODo6VmFsdWU+ID4gYXJndihjcmVh
dGVWYWx1ZUxpc3RGcm9tVmFyaWFudEFyZ3MoYXJndW1lbnRzLCBhcmd1bWVudENvdW50LCBucE9i
amVjdCkpOworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJlc3VsdE9iamVjdCA9IHByb3h5LT5D
YWxsRnVuY3Rpb24oZnVuY3Rpb24sIHY4TnBPYmplY3QtPnY4T2JqZWN0LCBhcmd1bWVudENvdW50
LCBhcmd2LmdldCgpKTsKKworICAgIC8vIElmIHdlIGhhZCBhbiBlcnJvciwgcmV0dXJuIGZhbHNl
LiAgVGhlIHNwZWMgaXMgYSBsaXR0bGUgdW5jbGVhciBoZXJlLCBidXQgc2F5cyAiUmV0dXJucyB0
cnVlIGlmIHRoZSBtZXRob2Qgd2FzCisgICAgLy8gc3VjY2Vzc2Z1bGx5IGludm9rZWQiLiAgSWYg
d2UgZ2V0IGFuIGVycm9yIHJldHVybiB2YWx1ZSwgd2FzIHRoYXQgc3VjY2Vzc2Z1bGx5IGludm9r
ZWQ/CisgICAgaWYgKHJlc3VsdE9iamVjdC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGNvbnZlcnRWOE9iamVjdFRvTlBWYXJpYW50KHJlc3VsdE9iamVjdCwgbnBPYmpl
Y3QsIHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZJWE1FOiBGaXggaXQgc2Ft
ZSBhcyBOUE5fSW52b2tlIChIYW5kbGVTY29wZSBhbmQgc3VjaCkuCitib29sIE5QTl9JbnZva2VE
ZWZhdWx0KE5QUCBucHAsIE5QT2JqZWN0KiBucE9iamVjdCwgY29uc3QgTlBWYXJpYW50KiBhcmd1
bWVudHMsIHVpbnQzMl90IGFyZ3VtZW50Q291bnQsIE5QVmFyaWFudCogcmVzdWx0KQoreworICAg
IGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVj
dC0+X2NsYXNzICE9IG5wU2NyaXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAgaWYgKG5wT2JqZWN0
LT5fY2xhc3MtPmludm9rZURlZmF1bHQpCisgICAgICAgICAgICByZXR1cm4gbnBPYmplY3QtPl9j
bGFzcy0+aW52b2tlRGVmYXVsdChucE9iamVjdCwgYXJndW1lbnRzLCBhcmd1bWVudENvdW50LCBy
ZXN1bHQpOworCisgICAgICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBWOE5QT2JqZWN0KiB2OE5wT2JqZWN0ID0gcmVpbnRl
cnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgVk9JRF9UT19OUFZBUklB
TlQoKnJlc3VsdCk7CisKKyAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisgICAgdjg6
OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250ZXh0KG5wcCwgbnBPYmplY3Qp
OworICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisg
ICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgLy8gTG9va3VwIHRo
ZSBmdW5jdGlvbiBvYmplY3QgYW5kIGNhbGwgaXQuCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0
PiBmdW5jdGlvbk9iamVjdCh2OE5wT2JqZWN0LT52OE9iamVjdCk7CisgICAgaWYgKCFmdW5jdGlv
bk9iamVjdC0+SXNGdW5jdGlvbigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB2ODo6
TG9jYWw8djg6OlZhbHVlPiByZXN1bHRPYmplY3Q7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rp
b24+IGZ1bmN0aW9uKHY4OjpGdW5jdGlvbjo6Q2FzdCgqZnVuY3Rpb25PYmplY3QpKTsKKyAgICBp
ZiAoIWZ1bmN0aW9uLT5Jc051bGwoKSkgeworICAgICAgICBWOFByb3h5KiBwcm94eSA9IHRvVjhQ
cm94eShucE9iamVjdCk7CisgICAgICAgIEFTU0VSVChwcm94eSk7CisKKyAgICAgICAgT3duQXJy
YXlQdHI8djg6OkhhbmRsZTx2ODo6VmFsdWU+ID4gYXJndihjcmVhdGVWYWx1ZUxpc3RGcm9tVmFy
aWFudEFyZ3MoYXJndW1lbnRzLCBhcmd1bWVudENvdW50LCBucE9iamVjdCkpOworICAgICAgICBy
ZXN1bHRPYmplY3QgPSBwcm94eS0+Q2FsbEZ1bmN0aW9uKGZ1bmN0aW9uLCBmdW5jdGlvbk9iamVj
dCwgYXJndW1lbnRDb3VudCwgYXJndi5nZXQoKSk7CisgICAgfQorICAgIC8vIElmIHdlIGhhZCBh
biBlcnJvciwgcmV0dXJuIGZhbHNlLiAgVGhlIHNwZWMgaXMgYSBsaXR0bGUgdW5jbGVhciBoZXJl
LCBidXQgc2F5cyAiUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2Qgd2FzCisgICAgLy8gc3VjY2Vz
c2Z1bGx5IGludm9rZWQiLiAgSWYgd2UgZ2V0IGFuIGVycm9yIHJldHVybiB2YWx1ZSwgd2FzIHRo
YXQgc3VjY2Vzc2Z1bGx5IGludm9rZWQ/CisgICAgaWYgKHJlc3VsdE9iamVjdC5Jc0VtcHR5KCkp
CisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnZlcnRWOE9iamVjdFRvTlBWYXJpYW50
KHJlc3VsdE9iamVjdCwgbnBPYmplY3QsIHJlc3VsdCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisK
K2Jvb2wgTlBOX0V2YWx1YXRlKE5QUCBucHAsIE5QT2JqZWN0KiBucE9iamVjdCwgTlBTdHJpbmcq
IG5wU2NyaXB0LCBOUFZhcmlhbnQqIHJlc3VsdCkKK3sKKyAgICBib29sIHBvcHVwc0FsbG93ZWQg
PSBXZWJDb3JlOjpDaHJvbWl1bUJyaWRnZTo6cG9wdXBzQWxsb3dlZChucHApOworICAgIHJldHVy
biBOUE5fRXZhbHVhdGVIZWxwZXIobnBwLCBwb3B1cHNBbGxvd2VkLCBucE9iamVjdCwgbnBTY3Jp
cHQsIHJlc3VsdCk7Cit9CisKK2Jvb2wgTlBOX0V2YWx1YXRlSGVscGVyKE5QUCBucHAsIGJvb2wg
cG9wdXBzQWxsb3dlZCwgTlBPYmplY3QqIG5wT2JqZWN0LCBOUFN0cmluZyogbnBTY3JpcHQsIE5Q
VmFyaWFudCogcmVzdWx0KQoreworICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1bHQpOworICAg
IGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVj
dC0+X2NsYXNzICE9IG5wU2NyaXB0T2JqZWN0Q2xhc3MpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6SGFuZGxlPHY4OjpD
b250ZXh0PiBjb250ZXh0ID0gdG9WOENvbnRleHQobnBwLCBucE9iamVjdCk7CisgICAgaWYgKGNv
bnRleHQuSXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBWOFByb3h5KiBw
cm94eSA9IHRvVjhQcm94eShucE9iamVjdCk7CisgICAgQVNTRVJUKHByb3h5KTsKKworICAgIHY4
OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKworICAgIFdlYkNvcmU6OlN0cmluZyBm
aWxlbmFtZTsKKyAgICBpZiAoIXBvcHVwc0FsbG93ZWQpCisgICAgICAgIGZpbGVuYW1lID0gIm5w
U2NyaXB0IjsKKworICAgIFdlYkNvcmU6OlN0cmluZyBzY3JpcHQgPSBXZWJDb3JlOjpTdHJpbmc6
OmZyb21VVEY4KG5wU2NyaXB0LT5VVEY4Q2hhcmFjdGVycywgbnBTY3JpcHQtPlVURjhMZW5ndGgp
OworICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHY4cmVzdWx0ID0gcHJveHktPmV2YWx1YXRlKFdl
YkNvcmU6OlNjcmlwdFNvdXJjZUNvZGUoc2NyaXB0LCBXZWJDb3JlOjpLVVJMKGZpbGVuYW1lKSks
IDApOworCisgICAgaWYgKHY4cmVzdWx0LklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNl
OworCisgICAgY29udmVydFY4T2JqZWN0VG9OUFZhcmlhbnQodjhyZXN1bHQsIG5wT2JqZWN0LCBy
ZXN1bHQpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE5QTl9HZXRQcm9wZXJ0eShOUFAg
bnBwLCBOUE9iamVjdCogbnBPYmplY3QsIE5QSWRlbnRpZmllciBwcm9wZXJ0eU5hbWUsIE5QVmFy
aWFudCogcmVzdWx0KQoreworICAgIGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxz
ZTsKKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzID09IG5wU2NyaXB0T2JqZWN0Q2xhc3MpIHsK
KyAgICAgICAgVjhOUE9iamVjdCogb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0
Kj4obnBPYmplY3QpOworCisgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAg
ICAgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250ZXh0KG5wcCwg
bnBPYmplY3QpOworICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQp
OworCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqKG9iamVjdC0+djhPYmplY3Qp
OworICAgICAgICB2ODo6TG9jYWw8djg6OlZhbHVlPiB2OHJlc3VsdCA9IG9iai0+R2V0KG5wSWRl
bnRpZmllclRvVjhJZGVudGlmaWVyKHByb3BlcnR5TmFtZSkpOworCisgICAgICAgIGNvbnZlcnRW
OE9iamVjdFRvTlBWYXJpYW50KHY4cmVzdWx0LCBucE9iamVjdCwgcmVzdWx0KTsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MtPmhhc1Byb3Bl
cnR5ICYmIG5wT2JqZWN0LT5fY2xhc3MtPmdldFByb3BlcnR5KSB7CisgICAgICAgIGlmIChucE9i
amVjdC0+X2NsYXNzLT5oYXNQcm9wZXJ0eShucE9iamVjdCwgcHJvcGVydHlOYW1lKSkKKyAgICAg
ICAgICAgIHJldHVybiBucE9iamVjdC0+X2NsYXNzLT5nZXRQcm9wZXJ0eShucE9iamVjdCwgcHJv
cGVydHlOYW1lLCByZXN1bHQpOworICAgIH0KKworICAgIFZPSURfVE9fTlBWQVJJQU5UKCpyZXN1
bHQpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBOUE5fU2V0UHJvcGVydHkoTlBQIG5w
cCwgTlBPYmplY3QqIG5wT2JqZWN0LCBOUElkZW50aWZpZXIgcHJvcGVydHlOYW1lLCBjb25zdCBO
UFZhcmlhbnQqIHZhbHVlKQoreworICAgIGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBm
YWxzZTsKKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzID09IG5wU2NyaXB0T2JqZWN0Q2xhc3Mp
IHsKKyAgICAgICAgVjhOUE9iamVjdCogb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxWOE5QT2Jq
ZWN0Kj4obnBPYmplY3QpOworCisgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsK
KyAgICAgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250ZXh0KG5w
cCwgbnBPYmplY3QpOworICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRl
eHQpOworCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqKG9iamVjdC0+djhPYmpl
Y3QpOworICAgICAgICBvYmotPlNldChucElkZW50aWZpZXJUb1Y4SWRlbnRpZmllcihwcm9wZXJ0
eU5hbWUpLAorICAgICAgICAgICAgICAgICBjb252ZXJ0TlBWYXJpYW50VG9WOE9iamVjdCh2YWx1
ZSwgb2JqZWN0LT5yb290T2JqZWN0LT5mcmFtZSgpLT5zY3JpcHQoKS0+d2luZG93U2NyaXB0TlBP
YmplY3QoKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAobnBPYmpl
Y3QtPl9jbGFzcy0+c2V0UHJvcGVydHkpCisgICAgICAgIHJldHVybiBucE9iamVjdC0+X2NsYXNz
LT5zZXRQcm9wZXJ0eShucE9iamVjdCwgcHJvcGVydHlOYW1lLCB2YWx1ZSk7CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK2Jvb2wgTlBOX1JlbW92ZVByb3BlcnR5KE5QUCBucHAsIE5QT2JqZWN0
KiBucE9iamVjdCwgTlBJZGVudGlmaWVyIHByb3BlcnR5TmFtZSkKK3sKKyAgICBpZiAoIW5wT2Jq
ZWN0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MgIT0g
bnBTY3JpcHRPYmplY3RDbGFzcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVjhOUE9i
amVjdCogb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOwor
CisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IGNvbnRleHQgPSB0b1Y4Q29udGV4dChucHAsIG5wT2JqZWN0KTsKKyAgICBpZiAoY29u
dGV4dC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB2ODo6Q29udGV4dDo6
U2NvcGUgc2NvcGUoY29udGV4dCk7CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaihv
YmplY3QtPnY4T2JqZWN0KTsKKyAgICAvLyBGSVhNRTogVmVyaWZ5IHRoYXQgc2V0dGluZyB0byB1
bmRlZmluZWQgaXMgcmlnaHQuCisgICAgb2JqLT5TZXQobnBJZGVudGlmaWVyVG9WOElkZW50aWZp
ZXIocHJvcGVydHlOYW1lKSwgdjg6OlVuZGVmaW5lZCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30K
KworYm9vbCBOUE5fSGFzUHJvcGVydHkoTlBQIG5wcCwgTlBPYmplY3QqIG5wT2JqZWN0LCBOUElk
ZW50aWZpZXIgcHJvcGVydHlOYW1lKQoreworICAgIGlmICghbnBPYmplY3QpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzID09IG5wU2NyaXB0T2JqZWN0
Q2xhc3MpIHsKKyAgICAgICAgVjhOUE9iamVjdCogb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxW
OE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisgICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVT
Y29wZTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250
ZXh0KG5wcCwgbnBPYmplY3QpOworICAgICAgICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShj
b250ZXh0KTsKKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaihvYmplY3QtPnY4
T2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIG9iai0+SGFzKG5wSWRlbnRpZmllclRvVjhJZGVudGlm
aWVyKHByb3BlcnR5TmFtZSkpOworICAgIH0KKworICAgIGlmIChucE9iamVjdC0+X2NsYXNzLT5o
YXNQcm9wZXJ0eSkKKyAgICAgICAgcmV0dXJuIG5wT2JqZWN0LT5fY2xhc3MtPmhhc1Byb3BlcnR5
KG5wT2JqZWN0LCBwcm9wZXJ0eU5hbWUpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBO
UE5fSGFzTWV0aG9kKE5QUCBucHAsIE5QT2JqZWN0KiBucE9iamVjdCwgTlBJZGVudGlmaWVyIG1l
dGhvZE5hbWUpCit7CisgICAgaWYgKCFucE9iamVjdCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MgPT0gbnBTY3JpcHRPYmplY3RDbGFzcykgeworICAg
ICAgICBWOE5QT2JqZWN0KiBvYmplY3QgPSByZWludGVycHJldF9jYXN0PFY4TlBPYmplY3QqPihu
cE9iamVjdCk7CisKKyAgICAgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0ID0gdG9WOENvbnRleHQobnBwLCBucE9i
amVjdCk7CisgICAgICAgIGlmIChjb250ZXh0LklzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNjb3BlIHNjb3BlKGNvbnRleHQpOworCisg
ICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gb2JqKG9iamVjdC0+djhPYmplY3QpOworICAg
ICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcHJvcCA9IG9iai0+R2V0KG5wSWRlbnRpZmllclRv
VjhJZGVudGlmaWVyKG1ldGhvZE5hbWUpKTsKKyAgICAgICAgcmV0dXJuIHByb3AtPklzRnVuY3Rp
b24oKTsKKyAgICB9CisKKyAgICBpZiAobnBPYmplY3QtPl9jbGFzcy0+aGFzTWV0aG9kKQorICAg
ICAgICByZXR1cm4gbnBPYmplY3QtPl9jbGFzcy0+aGFzTWV0aG9kKG5wT2JqZWN0LCBtZXRob2RO
YW1lKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgTlBOX1NldEV4Y2VwdGlvbihOUE9i
amVjdCogbnBPYmplY3QsIGNvbnN0IE5QVVRGOCAqbWVzc2FnZSkKK3sKKyAgICBpZiAobnBPYmpl
Y3QtPl9jbGFzcyAhPSBucFNjcmlwdE9iamVjdENsYXNzKQorICAgICAgICByZXR1cm47CisgICAg
djg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+
IGNvbnRleHQgPSB0b1Y4Q29udGV4dCgwLCBucE9iamVjdCk7CisgICAgaWYgKGNvbnRleHQuSXNF
bXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICB2ODo6Q29udGV4dDo6U2NvcGUgc2NvcGUo
Y29udGV4dCk7CisgICAgVjhQcm94eTo6VGhyb3dFcnJvcihWOFByb3h5OjpHRU5FUkFMX0VSUk9S
LCBtZXNzYWdlKTsKK30KKworYm9vbCBOUE5fRW51bWVyYXRlKE5QUCBucHAsIE5QT2JqZWN0KiBu
cE9iamVjdCwgTlBJZGVudGlmaWVyKiogaWRlbnRpZmllciwgdWludDMyX3QqIGNvdW50KQorewor
ICAgIGlmICghbnBPYmplY3QpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChucE9i
amVjdC0+X2NsYXNzID09IG5wU2NyaXB0T2JqZWN0Q2xhc3MpIHsKKyAgICAgICAgVjhOUE9iamVj
dCogb2JqZWN0ID0gcmVpbnRlcnByZXRfY2FzdDxWOE5QT2JqZWN0Kj4obnBPYmplY3QpOworCisg
ICAgICAgIHY4OjpIYW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICAgICAgdjg6OkhhbmRsZTx2
ODo6Q29udGV4dD4gY29udGV4dCA9IHRvVjhDb250ZXh0KG5wcCwgbnBPYmplY3QpOworICAgICAg
ICBpZiAoY29udGV4dC5Jc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIHY4OjpDb250ZXh0OjpTY29wZSBzY29wZShjb250ZXh0KTsKKworICAgICAgICB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IG9iaihvYmplY3QtPnY4T2JqZWN0KTsKKworICAgICAgICAvLyBGSVhN
RTogaHR0cDovL2IvaXNzdWU/aWQ9MTIxMDM0MDogVXNlIGEgdjg6Ok9iamVjdDo6S2V5cygpIG1l
dGhvZCB3aGVuIGl0IGV4aXN0cywgaW5zdGVhZCBvZiBldmFsdWF0aW5nIGphdmFzY3JpcHQuCisK
KyAgICAgICAgLy8gRklYTUU6IEZpZ3VyZSBvdXQgaG93IHRvIGNhY2hlIHRoaXMgaGVscGVyIGZ1
bmN0aW9uLiAgUnVuIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY29sbGVjdHMgdGhlIHByb3BlcnRp
ZXMKKyAgICAgICAgLy8gb24gdGhlIG9iamVjdCBpbnRvIGFuIGFycmF5LgorICAgICAgICBjb25z
dCBjaGFyIGVudW1lcmF0b3JDb2RlW10gPQorICAgICAgICAgICAgIihmdW5jdGlvbiAob2JqKSB7
IgorICAgICAgICAgICAgIiAgdmFyIHByb3BzID0gW107IgorICAgICAgICAgICAgIiAgZm9yICh2
YXIgcHJvcCBpbiBvYmopIHsiCisgICAgICAgICAgICAiICAgIHByb3BzW3Byb3BzLmxlbmd0aF0g
PSBwcm9wOyIKKyAgICAgICAgICAgICIgIH0iCisgICAgICAgICAgICAiICByZXR1cm4gcHJvcHM7
IgorICAgICAgICAgICAgIn0pOyI7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gc291
cmNlID0gdjg6OlN0cmluZzo6TmV3KGVudW1lcmF0b3JDb2RlKTsKKyAgICAgICAgdjg6OkhhbmRs
ZTx2ODo6U2NyaXB0PiBzY3JpcHQgPSB2ODo6U2NyaXB0OjpDb21waWxlKHNvdXJjZSwgMCk7Cisg
ICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBlbnVtZXJhdG9yT2JqID0gc2NyaXB0LT5SdW4o
KTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb24+IGVudW1lcmF0b3IgPSB2ODo6SGFu
ZGxlPHY4OjpGdW5jdGlvbj46OkNhc3QoZW51bWVyYXRvck9iaik7CisgICAgICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBhcmd2W10gPSB7IG9iaiB9OworICAgICAgICB2ODo6TG9jYWw8djg6OlZh
bHVlPiBwcm9wc09iaiA9IGVudW1lcmF0b3ItPkNhbGwodjg6OkhhbmRsZTx2ODo6T2JqZWN0Pjo6
Q2FzdChlbnVtZXJhdG9yT2JqKSwgQVJSQVlTSVpFX1VOU0FGRShhcmd2KSwgYXJndik7CisgICAg
ICAgIGlmIChwcm9wc09iai5Jc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAgICAgLy8gQ29udmVydCB0aGUgcmVzdWx0cyBpbnRvIGFuIGFycmF5IG9mIE5QSWRlbnRp
ZmllcnMuCisgICAgICAgIHY4OjpIYW5kbGU8djg6OkFycmF5PiBwcm9wcyA9IHY4OjpIYW5kbGU8
djg6OkFycmF5Pjo6Q2FzdChwcm9wc09iaik7CisgICAgICAgICpjb3VudCA9IHByb3BzLT5MZW5n
dGgoKTsKKyAgICAgICAgKmlkZW50aWZpZXIgPSBzdGF0aWNfY2FzdDxOUElkZW50aWZpZXIqPiht
YWxsb2Moc2l6ZW9mKE5QSWRlbnRpZmllciopICogKmNvdW50KSk7CisgICAgICAgIGZvciAodWlu
dDMyX3QgaSA9IDA7IGkgPCAqY291bnQ7ICsraSkgeworICAgICAgICAgICAgdjg6OkxvY2FsPHY4
OjpWYWx1ZT4gbmFtZSA9IHByb3BzLT5HZXQodjg6OkludGVnZXI6Ok5ldyhpKSk7CisgICAgICAg
ICAgICAoKmlkZW50aWZpZXIpW2ldID0gZ2V0U3RyaW5nSWRlbnRpZmllcih2ODo6TG9jYWw8djg6
OlN0cmluZz46OkNhc3QobmFtZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKworICAgIGlmIChOUF9DTEFTU19TVFJVQ1RfVkVSU0lPTl9IQVNfRU5VTShucE9iamVj
dC0+X2NsYXNzKSAmJiBucE9iamVjdC0+X2NsYXNzLT5lbnVtZXJhdGUpCisgICAgICAgcmV0dXJu
IG5wT2JqZWN0LT5fY2xhc3MtPmVudW1lcmF0ZShucE9iamVjdCwgaWRlbnRpZmllciwgY291bnQp
OworCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIE5QTl9Db25zdHJ1Y3QoTlBQIG5wcCwg
TlBPYmplY3QqIG5wT2JqZWN0LCBjb25zdCBOUFZhcmlhbnQqIGFyZ3VtZW50cywgdWludDMyX3Qg
YXJndW1lbnRDb3VudCwgTlBWYXJpYW50KiByZXN1bHQpCit7CisgICAgaWYgKCFucE9iamVjdCkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKG5wT2JqZWN0LT5fY2xhc3MgPT0gbnBT
Y3JpcHRPYmplY3RDbGFzcykgeworICAgICAgICBWOE5QT2JqZWN0KiBvYmplY3QgPSByZWludGVy
cHJldF9jYXN0PFY4TlBPYmplY3QqPihucE9iamVjdCk7CisKKyAgICAgICAgdjg6OkhhbmRsZVNj
b3BlIGhhbmRsZVNjb3BlOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0
ID0gdG9WOENvbnRleHQobnBwLCBucE9iamVjdCk7CisgICAgICAgIGlmIChjb250ZXh0LklzRW1w
dHkoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdjg6OkNvbnRleHQ6OlNj
b3BlIHNjb3BlKGNvbnRleHQpOworCisgICAgICAgIC8vIExvb2t1cCB0aGUgY29uc3RydWN0b3Ig
ZnVuY3Rpb24uCisgICAgICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gY3Rvck9iaihvYmplY3Qt
PnY4T2JqZWN0KTsKKyAgICAgICAgaWYgKCFjdG9yT2JqLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gQ2FsbCB0aGUgY29uc3RydWN0b3IuCisg
ICAgICAgIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHJlc3VsdE9iamVjdDsKKyAgICAgICAgdjg6Okhh
bmRsZTx2ODo6RnVuY3Rpb24+IGN0b3Iodjg6OkZ1bmN0aW9uOjpDYXN0KCpjdG9yT2JqKSk7Cisg
ICAgICAgIGlmICghY3Rvci0+SXNOdWxsKCkpIHsKKyAgICAgICAgICAgIFY4UHJveHkqIHByb3h5
ID0gdG9WOFByb3h5KG5wT2JqZWN0KTsKKyAgICAgICAgICAgIEFTU0VSVChwcm94eSk7CisKKyAg
ICAgICAgICAgIE93bkFycmF5UHRyPHY4OjpIYW5kbGU8djg6OlZhbHVlPiA+IGFyZ3YoY3JlYXRl
VmFsdWVMaXN0RnJvbVZhcmlhbnRBcmdzKGFyZ3VtZW50cywgYXJndW1lbnRDb3VudCwgbnBPYmpl
Y3QpKTsKKyAgICAgICAgICAgIHJlc3VsdE9iamVjdCA9IHByb3h5LT5OZXdJbnN0YW5jZShjdG9y
LCBhcmd1bWVudENvdW50LCBhcmd2LmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChy
ZXN1bHRPYmplY3QuSXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
ICAgIGNvbnZlcnRWOE9iamVjdFRvTlBWYXJpYW50KHJlc3VsdE9iamVjdCwgbnBPYmplY3QsIHJl
c3VsdCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChOUF9DTEFTU19T
VFJVQ1RfVkVSU0lPTl9IQVNfQ1RPUihucE9iamVjdC0+X2NsYXNzKSAmJiBucE9iamVjdC0+X2Ns
YXNzLT5jb25zdHJ1Y3QpCisgICAgICAgIHJldHVybiBucE9iamVjdC0+X2NsYXNzLT5jb25zdHJ1
Y3QobnBPYmplY3QsIGFyZ3VtZW50cywgYXJndW1lbnRDb3VudCwgcmVzdWx0KTsKKworICAgIHJl
dHVybiBmYWxzZTsKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvYmluZGluZ3MvdjgvTlBWOE9iamVj
dC5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9OUFY4T2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uNjVhN2NjZgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvYmlu
ZGluZ3MvdjgvTlBWOE9iamVjdC5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAg
ICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhl
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQor
ICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5j
LiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJV
VE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9X
TkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkK
KyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworI2lm
bmRlZiBOUFY4T2JqZWN0X2gKKyNkZWZpbmUgTlBWOE9iamVjdF9oCisKKyNpbmNsdWRlICJiaW5k
aW5ncy9ucHJ1bnRpbWUuaCIKKyNpbmNsdWRlIDx2OC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisgICAgY2xhc3MgRE9NV2luZG93OworfQorCitleHRlcm4gTlBDbGFzcyogbnBTY3JpcHRPYmpl
Y3RDbGFzczsKKworLy8gQSBWOE5QT2JqZWN0IGlzIGEgTlBPYmplY3Qgd2hpY2ggY2FycmllcyBh
ZGRpdGlvbmFsIFY4LXNwZWNpZmljIGluZm9ybWF0aW9uLiBJdCBpcyBhbGxvY2F0ZWQgYW5kIGRl
YWxsb2NhdGVkIGJ5CisvLyBBbGxvY1Y4TlBPYmplY3QoKSBhbmQgRnJlZVY4TlBPYmplY3QoKSBt
ZXRob2RzLgorc3RydWN0IFY4TlBPYmplY3QgeworICAgIE5QT2JqZWN0IG9iamVjdDsKKyAgICB2
ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiB2OE9iamVjdDsKKyAgICBXZWJDb3JlOjpET01XaW5k
b3cqIHJvb3RPYmplY3Q7Cit9OworCitzdHJ1Y3QgUHJpdmF0ZUlkZW50aWZpZXIgeworICAgIHVu
aW9uIHsKKyAgICAgICAgY29uc3QgTlBVVEY4KiBzdHJpbmc7CisgICAgICAgIGludDMyX3QgbnVt
YmVyOworICAgIH0gdmFsdWU7CisgICAgYm9vbCBpc1N0cmluZzsKK307CisKK05QT2JqZWN0KiBu
cENyZWF0ZVY4U2NyaXB0T2JqZWN0KE5QUCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiwgV2ViQ29y
ZTo6RE9NV2luZG93Kik7CisKKyNlbmRpZiAvLyBOUFY4T2JqZWN0X2gKZGlmZiAtLWdpdCBhL1dl
YkNvcmUvYmluZGluZ3MvdjgvVjhOUFV0aWxzLmNwcCBiL1dlYkNvcmUvYmluZGluZ3MvdjgvVjhO
UFV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTJkYjEyCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOE5QVXRpbHMuY3BwCkBAIC0w
LDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHly
aWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhl
IG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9t
CisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNz
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBI
T0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAq
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBU
SEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiVjhOUFV0
aWxzLmgiCisKKyNpbmNsdWRlICJET01XaW5kb3cuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2lu
Y2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjdW5kZWYgTE9HCisKKyNpbmNsdWRlICJOUFY4T2Jq
ZWN0LmgiCisjaW5jbHVkZSAiVjhOUE9iamVjdC5oIgorI2luY2x1ZGUgIlY4UHJveHkuaCIKKyNp
bmNsdWRlICJucHJ1bnRpbWVfcHJpdi5oIgorCit2b2lkIGNvbnZlcnRWOE9iamVjdFRvTlBWYXJp
YW50KHY4OjpMb2NhbDx2ODo6VmFsdWU+IG9iamVjdCwgTlBPYmplY3QqIG93bmVyLCBOUFZhcmlh
bnQqIHJlc3VsdCkKK3sKKyAgICBWT0lEX1RPX05QVkFSSUFOVCgqcmVzdWx0KTsKKworICAgIC8v
IEl0IGlzIHJlYWxseSB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZGVhbCB3aXRoIHRo
ZSBlbXB0eSBoYW5kbGUgY2FzZSBiZWNhdXNlIHRoZXJlIGNvdWxkIGJlIGRpZmZlcmVudCBhY3Rp
b25zIHRvCisgICAgLy8gdGFrZSBpbiBkaWZmZXJlbnQgY29udGV4dHMuCisgICAgQVNTRVJUKCFv
YmplY3QuSXNFbXB0eSgpKTsKKworICAgIGlmIChvYmplY3QuSXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBpZiAob2JqZWN0LT5Jc0ludDMyKCkpCisgICAgICAgIElOVDMyX1RPX05Q
VkFSSUFOVChvYmplY3QtPk51bWJlclZhbHVlKCksICpyZXN1bHQpOworICAgIGVsc2UgaWYgKG9i
amVjdC0+SXNOdW1iZXIoKSkKKyAgICAgICAgRE9VQkxFX1RPX05QVkFSSUFOVChvYmplY3QtPk51
bWJlclZhbHVlKCksICpyZXN1bHQpOworICAgIGVsc2UgaWYgKG9iamVjdC0+SXNCb29sZWFuKCkp
CisgICAgICAgIEJPT0xFQU5fVE9fTlBWQVJJQU5UKG9iamVjdC0+Qm9vbGVhblZhbHVlKCksICpy
ZXN1bHQpOworICAgIGVsc2UgaWYgKG9iamVjdC0+SXNOdWxsKCkpCisgICAgICAgIE5VTExfVE9f
TlBWQVJJQU5UKCpyZXN1bHQpOworICAgIGVsc2UgaWYgKG9iamVjdC0+SXNVbmRlZmluZWQoKSkK
KyAgICAgICAgVk9JRF9UT19OUFZBUklBTlQoKnJlc3VsdCk7CisgICAgZWxzZSBpZiAob2JqZWN0
LT5Jc1N0cmluZygpKSB7CisgICAgICAgIHY4OjpTdHJpbmc6OlV0ZjhWYWx1ZSB1dGY4KG9iamVj
dCk7CisgICAgICAgIGNoYXIqIHV0ZjhfY2hhcnMgPSBzdHJkdXAoKnV0ZjgpOworICAgICAgICBT
VFJJTkdOX1RPX05QVkFSSUFOVCh1dGY4X2NoYXJzLCB1dGY4Lmxlbmd0aCgpLCAqcmVzdWx0KTsK
KyAgICB9IGVsc2UgaWYgKG9iamVjdC0+SXNPYmplY3QoKSkgeworICAgICAgICBXZWJDb3JlOjpE
T01XaW5kb3cqIHdpbmRvdyA9IFdlYkNvcmU6OlY4UHJveHk6OnJldHJpZXZlV2luZG93KCk7Cisg
ICAgICAgIE5QT2JqZWN0KiBucG9iamVjdCA9IG5wQ3JlYXRlVjhTY3JpcHRPYmplY3QoMCwgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0Pjo6Q2FzdChvYmplY3QpLCB3aW5kb3cpOworICAgICAgICBpZiAo
bnBvYmplY3QpCisgICAgICAgICAgICBfTlBOX1JlZ2lzdGVyT2JqZWN0KG5wb2JqZWN0LCBvd25l
cik7CisgICAgICAgIE9CSkVDVF9UT19OUFZBUklBTlQobnBvYmplY3QsICpyZXN1bHQpOworICAg
IH0KK30KKworCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydE5QVmFyaWFudFRvVjhPYmpl
Y3QoY29uc3QgTlBWYXJpYW50KiB2YXJpYW50LCBOUE9iamVjdCogbnBvYmplY3QpCit7CisgICAg
TlBWYXJpYW50VHlwZSB0eXBlID0gdmFyaWFudC0+dHlwZTsKKworICAgIHN3aXRjaCAodHlwZSkg
eworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9JbnQzMjoKKyAgICAgICAgcmV0dXJuIHY4OjpJbnRl
Z2VyOjpOZXcoTlBWQVJJQU5UX1RPX0lOVDMyKCp2YXJpYW50KSk7CisgICAgY2FzZSBOUFZhcmlh
bnRUeXBlX0RvdWJsZToKKyAgICAgICAgcmV0dXJuIHY4OjpOdW1iZXI6Ok5ldyhOUFZBUklBTlRf
VE9fRE9VQkxFKCp2YXJpYW50KSk7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX0Jvb2w6CisgICAg
ICAgIHJldHVybiBOUFZBUklBTlRfVE9fQk9PTEVBTigqdmFyaWFudCkgPyB2ODo6VHJ1ZSgpIDog
djg6OkZhbHNlKCk7CisgICAgY2FzZSBOUFZhcmlhbnRUeXBlX051bGw6CisgICAgICAgIHJldHVy
biB2ODo6TnVsbCgpOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9Wb2lkOgorICAgICAgICByZXR1
cm4gdjg6OlVuZGVmaW5lZCgpOworICAgIGNhc2UgTlBWYXJpYW50VHlwZV9TdHJpbmc6IHsKKyAg
ICAgICAgTlBTdHJpbmcgc3JjID0gTlBWQVJJQU5UX1RPX1NUUklORygqdmFyaWFudCk7CisgICAg
ICAgIHJldHVybiB2ODo6U3RyaW5nOjpOZXcoc3JjLlVURjhDaGFyYWN0ZXJzLCBzcmMuVVRGOExl
bmd0aCk7CisgICAgfQorICAgIGNhc2UgTlBWYXJpYW50VHlwZV9PYmplY3Q6IHsKKyAgICAgICAg
TlBPYmplY3QqIG9iaiA9IE5QVkFSSUFOVF9UT19PQkpFQ1QoKnZhcmlhbnQpOworICAgICAgICBp
ZiAob2JqLT5fY2xhc3MgPT0gbnBTY3JpcHRPYmplY3RDbGFzcykKKyAgICAgICAgICAgIHJldHVy
biByZWludGVycHJldF9jYXN0PFY4TlBPYmplY3QqPihvYmopLT52OE9iamVjdDsKKyAgICAgICAg
cmV0dXJuIGNyZWF0ZVY4T2JqZWN0Rm9yTlBPYmplY3Qob2JqLCBucG9iamVjdCk7CisgICAgfQor
ICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisgICAgfQorfQor
CisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGFuIE5QTiBTdHJpbmcgSWRlbnRpZmllciBm
cm9tIGEgdjggc3RyaW5nLgorTlBJZGVudGlmaWVyIGdldFN0cmluZ0lkZW50aWZpZXIodjg6Okhh
bmRsZTx2ODo6U3RyaW5nPiBzdHIpCit7CisgICAgY29uc3QgaW50IGtTdGFja0J1ZmZlclNpemUg
PSAxMDA7CisKKyAgICBpbnQgYnVmZmVyTGVuZ3RoID0gc3RyLT5MZW5ndGgoKSArIDE7CisgICAg
aWYgKGJ1ZmZlckxlbmd0aCA8PSBrU3RhY2tCdWZmZXJTaXplKSB7CisgICAgICAgIC8vIFVzZSBs
b2NhbCBzdGFjayBidWZmZXIgdG8gYXZvaWQgaGVhcCBhbGxvY2F0aW9ucyBmb3Igc21hbGwgc3Ry
aW5ncy4gSGVyZSB3ZSBzaG91bGQgb25seSB1c2UgdGhlIHN0YWNrIHNwYWNlIGZvcgorICAgICAg
ICAvLyBzdGFja0J1ZmZlciB3aGVuIGl0J3MgdXNlZCwgbm90IHdoZW4gd2UgdXNlIHRoZSBoZWFw
LgorICAgICAgICAvLworICAgICAgICAvLyBXcml0ZUFzY2lpIGlzIGd1YXJhbnRlZWQgdG8gZ2Vu
ZXJhdGUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGJlY2F1c2UgYnVmZmVyTGVuZ3RoIGlzIGNv
bnN0cnVjdGVkIHRvIGJlIG9uZSBncmVhdGVyCisgICAgICAgIC8vIHRoYW4gdGhlIHN0cmluZyBs
ZW5ndGguCisgICAgICAgIGNoYXIgc3RhY2tCdWZmZXJba1N0YWNrQnVmZmVyU2l6ZV07CisgICAg
ICAgIHN0ci0+V3JpdGVBc2NpaShzdGFja0J1ZmZlciwgMCwgYnVmZmVyTGVuZ3RoKTsKKyAgICAg
ICAgcmV0dXJuIE5QTl9HZXRTdHJpbmdJZGVudGlmaWVyKHN0YWNrQnVmZmVyKTsKKyAgICB9CisK
KyAgICB2ODo6U3RyaW5nOjpBc2NpaVZhbHVlIGFzY2lpKHN0cik7CisgICAgcmV0dXJuIE5QTl9H
ZXRTdHJpbmdJZGVudGlmaWVyKCphc2NpaSk7Cit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL2JpbmRp
bmdzL3Y4L1Y4TlBVdGlscy5oIGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOE5QVXRpbHMuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmE3NGIzCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9iaW5kaW5ncy92OC9WOE5QVXRpbHMuaApAQCAtMCwwICsxLDQ2IEBACisvKiBD
b3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgR29vZ2xlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoK
KyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgor
ICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBH
b29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1
c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5E
IENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNV
TEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklH
SFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaWZuZGVmIFY4TlBVdGlsc19oCisjZGVmaW5lIFY4TlBVdGlsc19oCisKKyNpbmNs
dWRlIDx2OC5oPgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L25wYXBpL2JpbmRpbmdzL25wcnVudGlt
ZS5oIgorCisvLyBDb252ZXJ0IGEgVjggVmFsdWUgb2YgYW55IHR5cGUgKHN0cmluZywgYm9vbCwg
b2JqZWN0LCBldGMpIHRvIGEgTlBWYXJpYW50Lgordm9pZCBjb252ZXJ0VjhPYmplY3RUb05QVmFy
aWFudCh2ODo6TG9jYWw8djg6OlZhbHVlPiwgTlBPYmplY3QqLCBOUFZhcmlhbnQqKTsKKworLy8g
Q29udmVydCBhIE5QVmFyaWFudCAoc3RyaW5nLCBib29sLCBvYmplY3QsIGV0YykgYmFjayB0byBh
IFY4IFZhbHVlLiAgVGhlIG93bmVyIG9iamVjdCBpcyB0aGUgTlBPYmplY3Qgd2hpY2ggcmVsYXRl
cyB0byB0aGUKKy8vIG9iamVjdCwgaWYgdGhlIG9iamVjdCBpcyBhbiBPYmplY3QuICBUaGUgY3Jl
YXRlZCBOUE9iamVjdCB3aWxsIGJlIHRpZWQgdG8gdGhlIGxpZmV0aW1lIG9mIHRoZSBvd25lci4K
K3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0TlBWYXJpYW50VG9WOE9iamVjdChjb25zdCBO
UFZhcmlhbnQqLCBOUE9iamVjdCopOworCisvLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGFu
IE5QTiBTdHJpbmcgSWRlbnRpZmllciBmcm9tIGEgdjggc3RyaW5nLgorTlBJZGVudGlmaWVyIGdl
dFN0cmluZ0lkZW50aWZpZXIodjg6OkhhbmRsZTx2ODo6U3RyaW5nPik7CisKKyNlbmRpZiAvLyBW
OE5QVXRpbHNfaAo=
</data>
<flag name="review"
          id="16393"
          type_id="1"
          status="+"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>