<?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>269199</bug_id>
          
          <creation_ts>2024-02-12 08:45:27 -0800</creation_ts>
          <short_desc>AX: Replace is&lt;T&gt; downcast&lt;t&gt; with dynamicDowncast&lt;T&gt; uncheckedDowncast&lt;T&gt; when appropriate.</short_desc>
          <delta_ts>2024-02-12 21:00:31 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Accessibility</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Andres Gonzalez">andresg_22</reporter>
          <assigned_to name="Andres Gonzalez">andresg_22</assigned_to>
          <cc>aboxhall</cc>
    
    <cc>andresg_22</cc>
    
    <cc>apinheiro</cc>
    
    <cc>cfleizach</cc>
    
    <cc>dmazzoni</cc>
    
    <cc>ews-watchlist</cc>
    
    <cc>jcraig</cc>
    
    <cc>samuel_white</cc>
    
    <cc>tyler_w</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>2012725</commentid>
    <comment_count>0</comment_count>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-02-12 08:45:27 -0800</bug_when>
    <thetext>.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2012727</commentid>
    <comment_count>1</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2024-02-12 08:46:06 -0800</bug_when>
    <thetext>&lt;rdar://problem/122804785&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2012730</commentid>
    <comment_count>2</comment_count>
      <attachid>469826</attachid>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-02-12 08:51:39 -0800</bug_when>
    <thetext>Created attachment 469826
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2012741</commentid>
    <comment_count>3</comment_count>
      <attachid>469826</attachid>
    <who name="Tyler Wilcock">tyler_w</who>
    <bug_when>2024-02-12 09:24:48 -0800</bug_when>
    <thetext>Comment on attachment 469826
Patch

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

&gt; COMMIT_MESSAGE:9
&gt; +is&lt;T&gt; followed by downcast&lt;t&gt; has a performance impact since it is performing the type check twice. In those cases the code can be re-wtitten using dynamicDonwcast&lt;T&gt;. In other cases where we are certain that the downcast is returning the correct type, we should use uncheckedDowncast. This patch makes these changes in some of the accessibility core code. More similar changes in subsequent patches. this patch also include some code cleanup and more adoption of smart mpointer to replace raw pointers.

typos:

re-wtitten
dynamicDonwcast
mpointer

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:183
&gt; +        continuation = uncheckedDowncast&lt;RenderInline&gt;(*continuation).continuation();

I get this downcast existed before this patch...but I can&apos;t understand why it&apos;s safe not to type-check here. Furthermore, isn&apos;t the downcast unnecessary? continuation() exists on RenderBoxModelObject, so by my reading we shouldn&apos;t need it?

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:203
&gt; +        firstChild = firstChildInContinuation(uncheckedDowncast&lt;RenderInline&gt;(renderer));

Rather than doing an unchecked downcast, can we make firstChildInContinuation take a RenderBoxModelObject?

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:451
&gt; +    WeakPtr renderInline = dynamicDowncast&lt;RenderInline&gt;(renderer);
&gt; +    if (renderInline &amp;&amp; !renderer.isReplacedOrInlineBlock())
&gt; +        return renderInline-&gt;continuation();

The work we perform to cast here is not used if !renderer.isReplacedOrInlineBlock().

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:718
&gt; +                auto&amp; altText = renderTextFragment-&gt;altText();

const auto&amp;?

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:721
&gt; +                return renderTextFragment ? renderTextFragment-&gt;contentString() : String();

Do we need a null-check here? Entering this block is predicated on renderTextFragment being non-null, and I don&apos;t think acquiring a reference to a string via altText() will ever invalidate the WeakPtr.

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:724
&gt; +            return renderText ? renderText-&gt;text() : String();

Do we need a null-check here? Entering this block is predicated on renderText being non-null.

&gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:1375
&gt; -    if (!m_renderer || !is&lt;RenderView&gt;(*m_renderer))
&gt; +    if (!m_renderer)
&gt;          return 0;
&gt; -    return downcast&lt;RenderView&gt;(*m_renderer).frameView().layoutContext().layoutCount();
&gt; +
&gt; +    auto* view = dynamicDowncast&lt;RenderView&gt;(*m_renderer);
&gt; +    return view ? view-&gt;frameView().layoutContext().layoutCount() : 0;

Can write this more succinctly:

auto* view = dynamicDowncast&lt;RenderView&gt;(m_renderer.get());
return view ? view-&gt;frameView().layoutContext().layoutCount() : 0;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2012816</commentid>
    <comment_count>4</comment_count>
      <attachid>469835</attachid>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-02-12 11:47:29 -0800</bug_when>
    <thetext>Created attachment 469835
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2012820</commentid>
    <comment_count>5</comment_count>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-02-12 11:56:29 -0800</bug_when>
    <thetext>(In reply to Tyler Wilcock from comment #3)
&gt; Comment on attachment 469826 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=469826&amp;action=review
&gt; 
&gt; &gt; COMMIT_MESSAGE:9
&gt; &gt; +is&lt;T&gt; followed by downcast&lt;t&gt; has a performance impact since it is performing the type check twice. In those cases the code can be re-wtitten using dynamicDonwcast&lt;T&gt;. In other cases where we are certain that the downcast is returning the correct type, we should use uncheckedDowncast. This patch makes these changes in some of the accessibility core code. More similar changes in subsequent patches. this patch also include some code cleanup and more adoption of smart mpointer to replace raw pointers.
&gt; 
&gt; typos:
&gt; 
&gt; re-wtitten
&gt; dynamicDonwcast
&gt; mpointer

Fixed.
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:183
&gt; &gt; +        continuation = uncheckedDowncast&lt;RenderInline&gt;(*continuation).continuation();
&gt; 
&gt; I get this downcast existed before this patch...but I can&apos;t understand why
&gt; it&apos;s safe not to type-check here. Furthermore, isn&apos;t the downcast
&gt; unnecessary? continuation() exists on RenderBoxModelObject, so by my reading
&gt; we shouldn&apos;t need it?

Fixed.
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:203
&gt; &gt; +        firstChild = firstChildInContinuation(uncheckedDowncast&lt;RenderInline&gt;(renderer));
&gt; 
&gt; Rather than doing an unchecked downcast, can we make
&gt; firstChildInContinuation take a RenderBoxModelObject?

Changed the type of the param to firstChildInContinuation but we still need a cast here since renderer is a RenderObject.

&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:451
&gt; &gt; +    WeakPtr renderInline = dynamicDowncast&lt;RenderInline&gt;(renderer);
&gt; &gt; +    if (renderInline &amp;&amp; !renderer.isReplacedOrInlineBlock())
&gt; &gt; +        return renderInline-&gt;continuation();
&gt; 
&gt; The work we perform to cast here is not used if
&gt; !renderer.isReplacedOrInlineBlock().

Fixed.
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:718
&gt; &gt; +                auto&amp; altText = renderTextFragment-&gt;altText();
&gt; 
&gt; const auto&amp;?

Fixed.
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:721
&gt; &gt; +                return renderTextFragment ? renderTextFragment-&gt;contentString() : String();
&gt; 
&gt; Do we need a null-check here? Entering this block is predicated on
&gt; renderTextFragment being non-null, and I don&apos;t think acquiring a reference
&gt; to a string via altText() will ever invalidate the WeakPtr.

I&apos;d rather keep the null-check here since altText() may not be a trivial method.
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:724
&gt; &gt; +            return renderText ? renderText-&gt;text() : String();
&gt; 
&gt; Do we need a null-check here? Entering this block is predicated on
&gt; renderText being non-null.

Likewise here.
&gt; 
&gt; &gt; Source/WebCore/accessibility/AccessibilityRenderObject.cpp:1375
&gt; &gt; -    if (!m_renderer || !is&lt;RenderView&gt;(*m_renderer))
&gt; &gt; +    if (!m_renderer)
&gt; &gt;          return 0;
&gt; &gt; -    return downcast&lt;RenderView&gt;(*m_renderer).frameView().layoutContext().layoutCount();
&gt; &gt; +
&gt; &gt; +    auto* view = dynamicDowncast&lt;RenderView&gt;(*m_renderer);
&gt; &gt; +    return view ? view-&gt;frameView().layoutContext().layoutCount() : 0;
&gt; 
&gt; Can write this more succinctly:
&gt; 
&gt; auto* view = dynamicDowncast&lt;RenderView&gt;(m_renderer.get());
&gt; return view ? view-&gt;frameView().layoutContext().layoutCount() : 0;

Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2012935</commentid>
    <comment_count>6</comment_count>
      <attachid>469838</attachid>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-02-12 15:50:48 -0800</bug_when>
    <thetext>Created attachment 469838
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2012967</commentid>
    <comment_count>7</comment_count>
      <attachid>469839</attachid>
    <who name="Andres Gonzalez">andresg_22</who>
    <bug_when>2024-02-12 16:48:47 -0800</bug_when>
    <thetext>Created attachment 469839
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>2013026</commentid>
    <comment_count>8</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2024-02-12 21:00:29 -0800</bug_when>
    <thetext>Committed 274522@main (cfef85306eb0): &lt;https://commits.webkit.org/274522@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 469839.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>469826</attachid>
            <date>2024-02-12 08:51:39 -0800</date>
            <delta_ts>2024-02-12 11:47:25 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-269199-20240212115138.patch</filename>
            <type>text/plain</type>
            <size>37099</size>
            <attacher name="Andres Gonzalez">andresg_22</attacher>
            
              <data encoding="base64">RnJvbSAwODY4Y2FiOGQ3NjZjOWZlN2UxYzAyNTk2MjY4NGQwYzI3ZGI0MDAzIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXMgR29uemFsZXogPGFuZHJlc2dfMjJAYXBwbGUuY29t
PgpEYXRlOiBTYXQsIDEwIEZlYiAyMDI0IDE1OjE4OjMwIC0wNTAwClN1YmplY3Q6IFtQQVRDSF0g
QVg6IFJlcGxhY2UgaXM8VD4gZG93bmNhc3Q8dD4gd2l0aCBkeW5hbWljRG93bmNhc3Q8VD4KIHVu
Y2hlY2tlZERvd25jYXN0PFQ+IHdoZW4gYXBwcm9wcmlhdGUuCiBodHRwczovL2J1Z3Mud2Via2l0
Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY5MTk5IDxyZGFyOi8vcHJvYmxlbS8xMjI4MDQ3ODU+CgpS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KClRoaXMgaXMgYSBmb2xsb3cgdXAgdG8gaHR0cHM6
Ly9jb21taXRzLndlYmtpdC5vcmcvMjcyMjk2QG1haW4uCgppczxUPiBmb2xsb3dlZCBieSBkb3du
Y2FzdDx0PiBoYXMgYSBwZXJmb3JtYW5jZSBpbXBhY3Qgc2luY2UgaXQgaXMgcGVyZm9ybWluZyB0
aGUgdHlwZSBjaGVjayB0d2ljZS4gSW4gdGhvc2UgY2FzZXMgdGhlIGNvZGUgY2FuIGJlIHJlLXd0
aXR0ZW4gdXNpbmcgZHluYW1pY0RvbndjYXN0PFQ+LiBJbiBvdGhlciBjYXNlcyB3aGVyZSB3ZSBh
cmUgY2VydGFpbiB0aGF0IHRoZSBkb3duY2FzdCBpcyByZXR1cm5pbmcgdGhlIGNvcnJlY3QgdHlw
ZSwgd2Ugc2hvdWxkIHVzZSB1bmNoZWNrZWREb3duY2FzdC4gVGhpcyBwYXRjaCBtYWtlcyB0aGVz
ZSBjaGFuZ2VzIGluIHNvbWUgb2YgdGhlIGFjY2Vzc2liaWxpdHkgY29yZSBjb2RlLiBNb3JlIHNp
bWlsYXIgY2hhbmdlcyBpbiBzdWJzZXF1ZW50IHBhdGNoZXMuIHRoaXMgcGF0Y2ggYWxzbyBpbmNs
dWRlIHNvbWUgY29kZSBjbGVhbnVwIGFuZCBtb3JlIGFkb3B0aW9uIG9mIHNtYXJ0IG1wb2ludGVy
IHRvIHJlcGxhY2UgcmF3IHBvaW50ZXJzLgoKKiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5
L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwOgooV2ViQ29yZTo6Zmlyc3RDaGlsZEluQ29u
dGludWF0aW9uKToKKFdlYkNvcmU6OmZpcnN0Q2hpbGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbik6
CihXZWJDb3JlOjpsYXN0Q2hpbGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbik6CihXZWJDb3JlOjpz
dGFydE9mQ29udGludWF0aW9ucyk6CihXZWJDb3JlOjplbmRPZkNvbnRpbnVhdGlvbnMpOgooV2Vi
Q29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cHJldmlvdXNTaWJsaW5nIGNvbnN0KToK
KFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Om5leHRTaWJsaW5nIGNvbnN0KToK
KFdlYkNvcmU6Om5leHRDb250aW51YXRpb24pOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6cGFyZW50T2JqZWN0IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3Q6OmFuY2hvckVsZW1lbnQgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJl
bmRlck9iamVjdDo6dGV4dFVuZGVyRWxlbWVudCBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0Ojpib3VuZGluZ0JveFJlY3QgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdDo6ZWxlbWVudFBhdGggY29uc3QpOgooV2ViQ29yZTo6QWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdDo6Y29tcHV0ZUFjY2Vzc2liaWxpdHlJc0lnbm9yZWQgY29uc3Qp
OgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6bGF5b3V0Q291bnQgY29uc3Qp
OgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c2VsZWN0ZWRUZXh0IGNvbnN0
KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNlbGVjdGVkVGV4dFJhbmdl
IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Omluc2VydGlvblBv
aW50TGluZU51bWJlciBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
OjpzZXRTZWxlY3RlZFRleHRSYW5nZSk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0Ojpkb2N1bWVudExpbmtzKToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6
OndpZGdldEZvckF0dGFjaG1lbnRWaWV3IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlS
ZW5kZXJPYmplY3Q6OnZpc2libGVQb3NpdGlvbkZvckluZGV4IGNvbnN0KToKKFdlYkNvcmU6OkFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uIGNvbnN0KToK
KFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNldFNlbGVjdGVkVmlzaWJsZVBv
c2l0aW9uUmFuZ2UgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6
YWNjZXNzaWJpbGl0eUhpdFRlc3QgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6YWRkSW1hZ2VNYXBDaGlsZHJlbik6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVu
ZGVyT2JqZWN0OjphZGRUZXh0RmllbGRDaGlsZHJlbik6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjptYXJrZXJSZW5kZXJlciBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0OjpzZWN1cmVGaWVsZFZhbHVlIGNvbnN0KToKKiBTb3VyY2UvV2ViQ29y
ZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlTY3JvbGxWaWV3LmNwcDoKKFdlYkNvcmU6OkFj
Y2Vzc2liaWxpdHlTY3JvbGxWaWV3OjpBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldyk6CihXZWJDb3Jl
OjpBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6YWRkQ2hpbGRTY3JvbGxiYXIpOgooV2ViQ29yZTo6
QWNjZXNzaWJpbGl0eVNjcm9sbFZpZXc6OmRvY3VtZW50RnJhbWVWaWV3IGNvbnN0KToKKFdlYkNv
cmU6OkFjY2Vzc2liaWxpdHlTY3JvbGxWaWV3OjpwYXJlbnRPYmplY3QgY29uc3QpOgotLS0KIC4u
Li9BY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0LmNwcCAgICAgICAgICAgICB8IDI3MCArKysrKysr
KystLS0tLS0tLS0KIC4uLi9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlTY3JvbGxWaWV3LmNw
cCB8ICAyOCArLQogMiBmaWxlcyBjaGFuZ2VkLCAxNTQgaW5zZXJ0aW9ucygrKSwgMTQ0IGRlbGV0
aW9ucygtKQoKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0Fj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3QuY3BwCmluZGV4IGJiNjg2MDdkOWI3Yy4uOTQyMTY4MzA2
MzA5IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3QuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNj
ZXNzaWJpbGl0eVJlbmRlck9iamVjdC5jcHAKQEAgLTE3MSwxNCArMTcxLDE2IEBAIHN0YXRpYyBp
bmxpbmUgYm9vbCBpc0lubGluZVdpdGhDb250aW51YXRpb24oUmVuZGVyT2JqZWN0JiByZW5kZXJl
cikKIAogc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGZpcnN0Q2hpbGRJbkNvbnRpbnVhdGlv
bihSZW5kZXJJbmxpbmUmIHJlbmRlcmVyKQogewotICAgIGF1dG8qIGNvbnRpbnVhdGlvbiA9IHJl
bmRlcmVyLmNvbnRpbnVhdGlvbigpOworICAgIFdlYWtQdHIgY29udGludWF0aW9uID0gcmVuZGVy
ZXIuY29udGludWF0aW9uKCk7CiAKICAgICB3aGlsZSAoY29udGludWF0aW9uKSB7CiAgICAgICAg
IGlmIChpczxSZW5kZXJCbG9jaz4oKmNvbnRpbnVhdGlvbikpCi0gICAgICAgICAgICByZXR1cm4g
Y29udGludWF0aW9uOwotICAgICAgICBpZiAoUmVuZGVyT2JqZWN0KiBjaGlsZCA9IGNvbnRpbnVh
dGlvbi0+Zmlyc3RDaGlsZCgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbi5nZXQo
KTsKKworICAgICAgICBpZiAoYXV0byogY2hpbGQgPSBjb250aW51YXRpb24tPmZpcnN0Q2hpbGQo
KSkKICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAgICAgY29udGludWF0aW9uID0gZG93
bmNhc3Q8UmVuZGVySW5saW5lPigqY29udGludWF0aW9uKS5jb250aW51YXRpb24oKTsKKworICAg
ICAgICBjb250aW51YXRpb24gPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJJbmxpbmU+KCpjb250
aW51YXRpb24pLmNvbnRpbnVhdGlvbigpOwogICAgIH0KIAogICAgIHJldHVybiBudWxscHRyOwpA
QCAtMTkxLDExICsxOTMsMTQgQEAgc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGZpcnN0Q2hp
bGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QmIHJlbmQKICAgICAvLyBXZSBk
b24ndCB3YW50IHRvIGluY2x1ZGUgdGhlIGVuZCBvZiBhIGNvbnRpbnVhdGlvbiBhcyB0aGUgZmly
c3RDaGlsZCBvZiB0aGUKICAgICAvLyBhbm9ueW1vdXMgcGFyZW50LCBiZWNhdXNlIGV2ZXJ5dGhp
bmcgaGFzIGFscmVhZHkgYmVlbiBsaW5rZWQgdXAgdmlhIGNvbnRpbnVhdGlvbi4KICAgICAvLyBD
U1MgZmlyc3QtbGV0dGVyIHNlbGVjdG9yIGlzIGFuIGV4YW1wbGUgb2YgdGhpcyBjYXNlLgotICAg
IGlmIChyZW5kZXJlci5pc0Fub255bW91cygpICYmIGlzPFJlbmRlcklubGluZT4oZmlyc3RDaGls
ZCkgJiYgZG93bmNhc3Q8UmVuZGVySW5saW5lPigqZmlyc3RDaGlsZCkuaXNDb250aW51YXRpb24o
KSkKLSAgICAgICAgZmlyc3RDaGlsZCA9IG51bGxwdHI7Ci0gICAgCisgICAgaWYgKHJlbmRlcmVy
LmlzQW5vbnltb3VzKCkpIHsKKyAgICAgICAgYXV0byogcmVuZGVySW5saW5lID0gZHluYW1pY0Rv
d25jYXN0PFJlbmRlcklubGluZT4oZmlyc3RDaGlsZCk7CisgICAgICAgIGlmIChyZW5kZXJJbmxp
bmUgJiYgcmVuZGVySW5saW5lLT5pc0NvbnRpbnVhdGlvbigpKQorICAgICAgICAgICAgZmlyc3RD
aGlsZCA9IG51bGxwdHI7CisgICAgfQorCiAgICAgaWYgKCFmaXJzdENoaWxkICYmIGlzSW5saW5l
V2l0aENvbnRpbnVhdGlvbihyZW5kZXJlcikpCi0gICAgICAgIGZpcnN0Q2hpbGQgPSBmaXJzdENo
aWxkSW5Db250aW51YXRpb24oZG93bmNhc3Q8UmVuZGVySW5saW5lPihyZW5kZXJlcikpOworICAg
ICAgICBmaXJzdENoaWxkID0gZmlyc3RDaGlsZEluQ29udGludWF0aW9uKHVuY2hlY2tlZERvd25j
YXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIpKTsKIAogICAgIHJldHVybiBmaXJzdENoaWxkOwog
fQpAQCAtMjA2LDE1ICsyMTEsMTYgQEAgc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGxhc3RD
aGlsZENvbnNpZGVyaW5nQ29udGludWF0aW9uKFJlbmRlck9iamVjdCYgcmVuZGUKICAgICBpZiAo
IWlzPFJlbmRlcklubGluZT4ocmVuZGVyZXIpICYmICFpczxSZW5kZXJCbG9jaz4ocmVuZGVyZXIp
KQogICAgICAgICByZXR1cm4gJnJlbmRlcmVyOwogCi0gICAgUmVuZGVyT2JqZWN0KiBsYXN0Q2hp
bGQgPSBkb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIpLmxhc3RDaGlsZCgp
OwotICAgIGZvciAoYXV0byogY3VycmVudCA9ICZkb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVj
dD4ocmVuZGVyZXIpOyBjdXJyZW50OyApIHsKLSAgICAgICAgaWYgKFJlbmRlck9iamVjdCogbmV3
TGFzdENoaWxkID0gY3VycmVudC0+bGFzdENoaWxkKCkpCisgICAgYXV0byYgYm94TW9kZWxPYmpl
Y3QgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIpOwor
ICAgIFdlYWtQdHIgbGFzdENoaWxkID0gYm94TW9kZWxPYmplY3QubGFzdENoaWxkKCk7CisgICAg
Zm9yIChhdXRvKiBjdXJyZW50ID0gJmJveE1vZGVsT2JqZWN0OyBjdXJyZW50OyApIHsKKyAgICAg
ICAgaWYgKGF1dG8qIG5ld0xhc3RDaGlsZCA9IGN1cnJlbnQtPmxhc3RDaGlsZCgpKQogICAgICAg
ICAgICAgbGFzdENoaWxkID0gbmV3TGFzdENoaWxkOwogCiAgICAgICAgIGN1cnJlbnQgPSBjdXJy
ZW50LT5pbmxpbmVDb250aW51YXRpb24oKTsKICAgICB9CiAKLSAgICByZXR1cm4gbGFzdENoaWxk
OworICAgIHJldHVybiBsYXN0Q2hpbGQuZ2V0KCk7CiB9CiAKIEFjY2Vzc2liaWxpdHlPYmplY3Qq
IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmZpcnN0Q2hpbGQoKSBjb25zdApAQCAtMjUxLDE2
ICsyNTcsMTYgQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dDo6bGFzdENoaWxkKCkgY29uc3QKIAogc3RhdGljIGlubGluZSBSZW5kZXJJbmxpbmUqIHN0YXJ0
T2ZDb250aW51YXRpb25zKFJlbmRlck9iamVjdCYgcmVuZGVyZXIpCiB7Ci0gICAgYXV0byogcmVu
ZGVyRWxlbWVudCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJFbGVtZW50PihyZW5kZXJlcik7Cisg
ICAgV2Vha1B0ciByZW5kZXJFbGVtZW50ID0gZHluYW1pY0Rvd25jYXN0PFJlbmRlckVsZW1lbnQ+
KHJlbmRlcmVyKTsKICAgICBpZiAoIXJlbmRlckVsZW1lbnQpCiAgICAgICAgIHJldHVybiBudWxs
cHRyOworCiAgICAgaWYgKGlzPFJlbmRlcklubGluZT4oKnJlbmRlckVsZW1lbnQpICYmIHJlbmRl
ckVsZW1lbnQtPmlzQ29udGludWF0aW9uKCkgJiYgaXM8UmVuZGVySW5saW5lPihyZW5kZXJFbGVt
ZW50LT5lbGVtZW50KCktPnJlbmRlcmVyKCkpKQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVu
ZGVySW5saW5lPihyZW5kZXJlci5ub2RlKCktPnJlbmRlcmVyKCkpOworICAgICAgICByZXR1cm4g
dW5jaGVja2VkRG93bmNhc3Q8UmVuZGVySW5saW5lPihyZW5kZXJlci5ub2RlKCktPnJlbmRlcmVy
KCkpOwogCiAgICAgLy8gQmxvY2tzIHdpdGggYSBwcmV2aW91cyBjb250aW51YXRpb24gYWx3YXlz
IGhhdmUgYSBuZXh0IGNvbnRpbnVhdGlvbgogICAgIGlmIChhdXRvKiByZW5kZXJCbG9jayA9IGR5
bmFtaWNEb3duY2FzdDxSZW5kZXJCbG9jaz4oKnJlbmRlckVsZW1lbnQpOyByZW5kZXJCbG9jayAm
JiByZW5kZXJCbG9jay0+aW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIHJldHVybiBkb3du
Y2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlckJsb2NrLT5pbmxpbmVDb250aW51YXRpb24oKS0+ZWxl
bWVudCgpLT5yZW5kZXJlcigpKTsKLQorICAgICAgICByZXR1cm4gdW5jaGVja2VkRG93bmNhc3Q8
UmVuZGVySW5saW5lPihyZW5kZXJCbG9jay0+aW5saW5lQ29udGludWF0aW9uKCktPmVsZW1lbnQo
KS0+cmVuZGVyZXIoKSk7CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKQEAgLTI2OSw3ICsyNzUs
NyBAQCBzdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogZW5kT2ZDb250aW51YXRpb25zKFJlbmRl
ck9iamVjdCYgcmVuZGVyZXIpCiAgICAgaWYgKCFpczxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKSAm
JiAhaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKICAgICAgICAgcmV0dXJuICZyZW5kZXJlcjsK
IAotICAgIGF1dG8qIHByZXZpb3VzID0gJmRvd25jYXN0PFJlbmRlckJveE1vZGVsT2JqZWN0Pihy
ZW5kZXJlcik7CisgICAgYXV0byogcHJldmlvdXMgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJC
b3hNb2RlbE9iamVjdD4oJnJlbmRlcmVyKTsKICAgICBmb3IgKGF1dG8qIGN1cnJlbnQgPSBwcmV2
aW91czsgY3VycmVudDsgKSB7CiAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKICAgICAgICAg
Y3VycmVudCA9IGN1cnJlbnQtPmlubGluZUNvbnRpbnVhdGlvbigpOwpAQCAtMzIyLDE0ICszMjgs
MTQgQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cHJl
dmlvdXNTaWJsaW5nKCkgY29uc3QKICAgICAvLyBDYXNlIDE6IFRoZSBub2RlIGlzIGEgYmxvY2sg
YW5kIGlzIGFuIGlubGluZSdzIGNvbnRpbnVhdGlvbi4gSW4gdGhhdCBjYXNlLCB0aGUgaW5saW5l
J3MKICAgICAvLyBsYXN0IGNoaWxkIGlzIG91ciBwcmV2aW91cyBzaWJsaW5nIChvciBmdXJ0aGVy
IGJhY2sgaW4gdGhlIGNvbnRpbnVhdGlvbiBjaGFpbikKICAgICBSZW5kZXJJbmxpbmUqIHN0YXJ0
T2ZDb250czsKLSAgICBpZiAoaXM8UmVuZGVyQm94PigqbV9yZW5kZXJlcikgJiYgKHN0YXJ0T2ZD
b250cyA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCptX3JlbmRlcmVyKSkpCisgICAgV2Vha1B0ciBy
ZW5kZXJCbG9jayA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJCbG9jaz4oKm1fcmVuZGVyZXIpOwor
ICAgIGlmIChyZW5kZXJCbG9jayAmJiAoc3RhcnRPZkNvbnRzID0gc3RhcnRPZkNvbnRpbnVhdGlv
bnMoKm1fcmVuZGVyZXIpKSkKICAgICAgICAgcHJldmlvdXNTaWJsaW5nID0gY2hpbGRCZWZvcmVD
b25zaWRlcmluZ0NvbnRpbnVhdGlvbnMoc3RhcnRPZkNvbnRzLCByZW5kZXJlcigpKTsKIAogICAg
IC8vIENhc2UgMjogQW5vbnltb3VzIGJsb2NrIHBhcmVudCBvZiB0aGUgZW5kIG9mIGEgY29udGlu
dWF0aW9uIC0gc2tpcCBhbGwgdGhlIHdheSB0byBiZWZvcmUKICAgICAvLyB0aGUgcGFyZW50IG9m
IHRoZSBzdGFydCwgc2luY2UgZXZlcnl0aGluZyBpbiBiZXR3ZWVuIHdpbGwgYmUgbGlua2VkIHVw
IHZpYSB0aGUgY29udGludWF0aW9uLgotICAgIGVsc2UgaWYgKG1fcmVuZGVyZXItPmlzQW5vbnlt
b3VzQmxvY2soKSAmJiBmaXJzdENoaWxkSXNJbmxpbmVDb250aW51YXRpb24oZG93bmNhc3Q8UmVu
ZGVyQmxvY2s+KCptX3JlbmRlcmVyKSkpIHsKLSAgICAgICAgUmVuZGVyQmxvY2smIHJlbmRlckJs
b2NrID0gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKTsKLSAgICAgICAgYXV0byog
Zmlyc3RQYXJlbnQgPSBzdGFydE9mQ29udGludWF0aW9ucygqcmVuZGVyQmxvY2suZmlyc3RDaGls
ZCgpKS0+cGFyZW50KCk7CisgICAgZWxzZSBpZiAocmVuZGVyQmxvY2sgJiYgbV9yZW5kZXJlci0+
aXNBbm9ueW1vdXNCbG9jaygpICYmIGZpcnN0Q2hpbGRJc0lubGluZUNvbnRpbnVhdGlvbigqcmVu
ZGVyQmxvY2spKSB7CisgICAgICAgIGF1dG8qIGZpcnN0UGFyZW50ID0gc3RhcnRPZkNvbnRpbnVh
dGlvbnMoKnJlbmRlckJsb2NrLT5maXJzdENoaWxkKCkpLT5wYXJlbnQoKTsKICAgICAgICAgQVNT
RVJUKGZpcnN0UGFyZW50KTsKICAgICAgICAgd2hpbGUgKGZpcnN0Q2hpbGRJc0lubGluZUNvbnRp
bnVhdGlvbigqZmlyc3RQYXJlbnQpKQogICAgICAgICAgICAgZmlyc3RQYXJlbnQgPSBzdGFydE9m
Q29udGludWF0aW9ucygqZmlyc3RQYXJlbnQtPmZpcnN0Q2hpbGQoKSktPnBhcmVudCgpOwpAQCAt
MzczLDEzICszNzksMTQgQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6bmV4dFNpYmxpbmcoKSBjb25zdAogICAgIC8vIENhc2UgMTogbm9kZSBpcyBhIGJs
b2NrIGFuZCBoYXMgYW4gaW5saW5lIGNvbnRpbnVhdGlvbi4gTmV4dCBzaWJsaW5nIGlzIHRoZSBp
bmxpbmUgY29udGludWF0aW9uJ3MKICAgICAvLyBmaXJzdCBjaGlsZC4KICAgICBSZW5kZXJJbmxp
bmUqIGlubGluZUNvbnRpbnVhdGlvbjsKLSAgICBpZiAoaXM8UmVuZGVyQmxvY2s+KCptX3JlbmRl
cmVyKSAmJiAoaW5saW5lQ29udGludWF0aW9uID0gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3Jl
bmRlcmVyKS5pbmxpbmVDb250aW51YXRpb24oKSkpCisgICAgV2Vha1B0ciByZW5kZXJCbG9jayA9
IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJCbG9jaz4oKm1fcmVuZGVyZXIpOworICAgIGlmIChyZW5k
ZXJCbG9jayAmJiAoaW5saW5lQ29udGludWF0aW9uID0gcmVuZGVyQmxvY2stPmlubGluZUNvbnRp
bnVhdGlvbigpKSkKICAgICAgICAgbmV4dFNpYmxpbmcgPSBmaXJzdENoaWxkQ29uc2lkZXJpbmdD
b250aW51YXRpb24oKmlubGluZUNvbnRpbnVhdGlvbik7CiAKICAgICAvLyBDYXNlIDI6IEFub255
bW91cyBibG9jayBwYXJlbnQgb2YgdGhlIHN0YXJ0IG9mIGEgY29udGludWF0aW9uIC0gc2tpcCBh
bGwgdGhlIHdheSB0bwogICAgIC8vIGFmdGVyIHRoZSBwYXJlbnQgb2YgdGhlIGVuZCwgc2luY2Ug
ZXZlcnl0aGluZyBpbiBiZXR3ZWVuIHdpbGwgYmUgbGlua2VkIHVwIHZpYSB0aGUgY29udGludWF0
aW9uLgotICAgIGVsc2UgaWYgKG1fcmVuZGVyZXItPmlzQW5vbnltb3VzQmxvY2soKSAmJiBsYXN0
Q2hpbGRIYXNDb250aW51YXRpb24oZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKSkp
IHsKLSAgICAgICAgUmVuZGVyRWxlbWVudCogbGFzdFBhcmVudCA9IGVuZE9mQ29udGludWF0aW9u
cygqZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKS5sYXN0Q2hpbGQoKSktPnBhcmVu
dCgpOworICAgIGVsc2UgaWYgKHJlbmRlckJsb2NrICYmIG1fcmVuZGVyZXItPmlzQW5vbnltb3Vz
QmxvY2soKSAmJiBsYXN0Q2hpbGRIYXNDb250aW51YXRpb24oKnJlbmRlckJsb2NrKSkgeworICAg
ICAgICBhdXRvKiBsYXN0UGFyZW50ID0gZW5kT2ZDb250aW51YXRpb25zKCpyZW5kZXJCbG9jay0+
bGFzdENoaWxkKCkpLT5wYXJlbnQoKTsKICAgICAgICAgQVNTRVJUKGxhc3RQYXJlbnQpOwogICAg
ICAgICB3aGlsZSAobGFzdENoaWxkSGFzQ29udGludWF0aW9uKCpsYXN0UGFyZW50KSkKICAgICAg
ICAgICAgIGxhc3RQYXJlbnQgPSBlbmRPZkNvbnRpbnVhdGlvbnMoKmxhc3RQYXJlbnQtPmxhc3RD
aGlsZCgpKS0+cGFyZW50KCk7CkBAIC0zOTksNyArNDA2LDcgQEAgQWNjZXNzaWJpbGl0eU9iamVj
dCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6bmV4dFNpYmxpbmcoKSBjb25zdAogICAgIC8v
IENhc2UgNS4xOiBBZnRlciBjYXNlIDQsICh0aGUgZWxlbWVudCB3YXMgaW5saW5lIHcvIGNvbnRp
bnVhdGlvbiBidXQgaGFkIG5vIHNpYmxpbmcpLCB0aGVuIGNoZWNrIGl0J3MgcGFyZW50LgogICAg
IGlmICghbmV4dFNpYmxpbmcgJiYgbV9yZW5kZXJlci0+cGFyZW50KCkgJiYgaXNJbmxpbmVXaXRo
Q29udGludWF0aW9uKCptX3JlbmRlcmVyLT5wYXJlbnQoKSkpIHsKICAgICAgICAgYXV0byYgY29u
dGludWF0aW9uID0gKmRvd25jYXN0PFJlbmRlcklubGluZT4oKm1fcmVuZGVyZXItPnBhcmVudCgp
KS5jb250aW51YXRpb24oKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gQ2FzZSA1YTogY29udGlu
dWF0aW9uIGlzIGEgYmxvY2sgLSBpbiB0aGlzIGNhc2UgdGhlIGJsb2NrIGl0c2VsZiBpcyB0aGUg
bmV4dCBzaWJsaW5nLgogICAgICAgICBpZiAoaXM8UmVuZGVyQmxvY2s+KGNvbnRpbnVhdGlvbikp
CiAgICAgICAgICAgICBuZXh0U2libGluZyA9ICZjb250aW51YXRpb247CkBAIC00MzksMTEgKzQ0
NiwxMiBAQCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpu
ZXh0U2libGluZygpIGNvbnN0CiAKIHN0YXRpYyBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENv
bnRpbnVhdGlvbihSZW5kZXJPYmplY3QmIHJlbmRlcmVyKQogewotICAgIGlmIChpczxSZW5kZXJJ
bmxpbmU+KHJlbmRlcmVyKSAmJiAhcmVuZGVyZXIuaXNSZXBsYWNlZE9ySW5saW5lQmxvY2soKSkK
LSAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIpLmNvbnRpbnVh
dGlvbigpOwotICAgIGlmIChpczxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpKQotICAgICAgICByZXR1
cm4gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKS5pbmxpbmVDb250aW51YXRpb24oKTsK
LSAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBXZWFrUHRyIHJlbmRlcklubGluZSA9IGR5bmFtaWNE
b3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKTsKKyAgICBpZiAocmVuZGVySW5saW5lICYm
ICFyZW5kZXJlci5pc1JlcGxhY2VkT3JJbmxpbmVCbG9jaygpKQorICAgICAgICByZXR1cm4gcmVu
ZGVySW5saW5lLT5jb250aW51YXRpb24oKTsKKworICAgIGF1dG8qIHJlbmRlckJsb2NrID0gZHlu
YW1pY0Rvd25jYXN0PFJlbmRlckJsb2NrPihyZW5kZXJlcik7CisgICAgcmV0dXJuIHJlbmRlckJs
b2NrID8gcmVuZGVyQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpIDogbnVsbHB0cjsKIH0KICAg
ICAKIFJlbmRlck9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cmVuZGVyUGFyZW50
T2JqZWN0KCkgY29uc3QKQEAgLTUzNyw4ICs1NDUsOCBAQCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBB
Y2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpwYXJlbnRPYmplY3QoKSBjb25zdAogICAgIC8vIEV4
cG9zZSBtYXJrZXJzIHRoYXQgYXJlIG5vdCBkaXJlY3QgY2hpbGRyZW4gb2YgYSBsaXN0IGl0ZW0g
dG9vLgogICAgIGlmIChtX3JlbmRlcmVyLT5pc1JlbmRlckxpc3RNYXJrZXIoKSkgewogICAgICAg
ICBpZiAoYXV0byogbGlzdEl0ZW0gPSBhbmNlc3RvcnNPZlR5cGU8UmVuZGVyTGlzdEl0ZW0+KCpt
X3JlbmRlcmVyKS5maXJzdCgpKSB7Ci0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBw
YXJlbnQgPSBheE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRlKGxpc3RJdGVtKTsKLSAgICAgICAg
ICAgIGlmIChkb3duY2FzdDxBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0PigqcGFyZW50KS5tYXJr
ZXJSZW5kZXJlcigpID09IG1fcmVuZGVyZXIpCisgICAgICAgICAgICBhdXRvKiBwYXJlbnQgPSBh
eE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRlKGxpc3RJdGVtKTsKKyAgICAgICAgICAgIGlmICh1
bmNoZWNrZWREb3duY2FzdDxBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0PihwYXJlbnQpLm1hcmtl
clJlbmRlcmVyKCkgPT0gbV9yZW5kZXJlcikKICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50
OwogICAgICAgICB9CiAgICAgfQpAQCAtNTQ2LDExICs1NTQsMTEgQEAgQWNjZXNzaWJpbGl0eU9i
amVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cGFyZW50T2JqZWN0KCkgY29uc3QKIAog
ICAgIGlmIChhdXRvKiBwYXJlbnRPYmplY3QgPSByZW5kZXJQYXJlbnRPYmplY3QoKSkKICAgICAg
ICAgcmV0dXJuIGNhY2hlLT5nZXRPckNyZWF0ZShwYXJlbnRPYmplY3QpOwotICAgIAorCiAgICAg
Ly8gV2ViQXJlYSdzIHBhcmVudCBzaG91bGQgYmUgdGhlIHNjcm9sbCB2aWV3IGNvbnRhaW5pbmcg
aXQuCiAgICAgaWYgKGlzV2ViQXJlYSgpKQogICAgICAgICByZXR1cm4gY2FjaGUtPmdldE9yQ3Jl
YXRlKCZtX3JlbmRlcmVyLT52aWV3KCkuZnJhbWVWaWV3KCkpOwotICAgIAorCiAgICAgcmV0dXJu
IG51bGxwdHI7CiB9CiAKQEAgLTU4MywzMiArNTkxLDM2IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3Q6OmFuY2hvckVsZW1lbnQoKSBjb25zdAogewogICAgIGlmICghbV9yZW5k
ZXJlcikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgCi0gICAgQVhPYmplY3RDYWNoZSog
Y2FjaGUgPSBheE9iamVjdENhY2hlKCk7CisKKyAgICBXZWFrUHRyIGNhY2hlID0gYXhPYmplY3RD
YWNoZSgpOwogICAgIGlmICghY2FjaGUpCiAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgIAor
CiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50UmVuZGVyZXI7Ci0gICAgCisKICAgICAvLyBTZWFy
Y2ggdXAgdGhlIHJlbmRlciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUu
ICBEZWZlciB0byBhbiBlYXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgogICAgIGZvciAoY3Vy
cmVudFJlbmRlcmVyID0gcmVuZGVyZXIoKTsgY3VycmVudFJlbmRlcmVyICYmICFjdXJyZW50UmVu
ZGVyZXItPm5vZGUoKTsgY3VycmVudFJlbmRlcmVyID0gY3VycmVudFJlbmRlcmVyLT5wYXJlbnQo
KSkgewogICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkpIHsK
LSAgICAgICAgICAgIGlmIChSZW5kZXJPYmplY3QqIGNvbnRpbnVhdGlvbiA9IGRvd25jYXN0PFJl
bmRlckJsb2NrPigqY3VycmVudFJlbmRlcmVyKS5jb250aW51YXRpb24oKSkKKyAgICAgICAgICAg
IGlmIChhdXRvKiBjb250aW51YXRpb24gPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJCbG9jaz4o
KmN1cnJlbnRSZW5kZXJlcikuY29udGludWF0aW9uKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJu
IGNhY2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7CiAgICAg
ICAgIH0KICAgICB9Ci0gICAgCi0gICAgLy8gYmFpbCBpZiBub25lIGZvdW5kCisKKyAgICAvLyBC
YWlsIGlmIG5vbmUgZm91bmQuCiAgICAgaWYgKCFjdXJyZW50UmVuZGVyZXIpCiAgICAgICAgIHJl
dHVybiBudWxscHRyOwotICAgIAotICAgIC8vIHNlYXJjaCB1cCB0aGUgRE9NIHRyZWUgZm9yIGFu
IGFuY2hvciBlbGVtZW50Ci0gICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgYW55IG5vbi1p
bWFnZSB3aXRoIGFuIGFuY2hvciBpcyBhbiBIVE1MQW5jaG9yRWxlbWVudAotICAgIGZvciAoTm9k
ZSogbm9kZSA9IGN1cnJlbnRSZW5kZXJlci0+bm9kZSgpOyBub2RlOyBub2RlID0gbm9kZS0+cGFy
ZW50Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChpczxIVE1MQW5jaG9yRWxlbWVudD4oKm5vZGUpIHx8
IChub2RlLT5yZW5kZXJlcigpICYmIGNhY2hlLT5nZXRPckNyZWF0ZShub2RlLT5yZW5kZXJlcigp
KS0+aXNMaW5rKCkpKQotICAgICAgICAgICAgcmV0dXJuIGRvd25jYXN0PEVsZW1lbnQ+KG5vZGUp
OworCisgICAgLy8gU2VhcmNoIHVwIHRoZSBET00gdHJlZSBmb3IgYW4gYW5jaG9yIGVsZW1lbnQu
CisgICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgYW55IG5vbi1pbWFnZSB3aXRoIGFuIGFu
Y2hvciBpcyBhbiBIVE1MQW5jaG9yRWxlbWVudC4KKyAgICBmb3IgKFJlZlB0ciBub2RlID0gY3Vy
cmVudFJlbmRlcmVyLT5ub2RlKCk7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpIHsK
KyAgICAgICAgaWYgKGF1dG8qIGFuY2hvciA9IGR5bmFtaWNEb3duY2FzdDxIVE1MQW5jaG9yRWxl
bWVudD4obm9kZS5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gYW5jaG9yOworCisgICAgICAg
IGF1dG8qIG9iamVjdCA9IGNhY2hlID8gY2FjaGUtPmdldE9yQ3JlYXRlKG5vZGUtPnJlbmRlcmVy
KCkpIDogbnVsbHB0cjsKKyAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QtPmlzTGluaygpKQor
ICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNEb3duY2FzdDxFbGVtZW50Pigqbm9kZSk7CiAgICAg
fQotICAgIAorCiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKQEAgLTY1NCw5ICs2NjYsOSBAQCBT
dHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6dGV4dFVuZGVyRWxlbWVudChBY2Nlc3Np
YmlsaXR5VGV4dFVuZGVyRWxlbWVudAogICAgIGlmICghbV9yZW5kZXJlcikKICAgICAgICAgcmV0
dXJuIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0Ojp0ZXh0VW5kZXJFbGVtZW50KG1vZGUpOwogCi0g
ICAgaWYgKGlzPFJlbmRlckZpbGVVcGxvYWRDb250cm9sPigqbV9yZW5kZXJlcikpCi0gICAgICAg
IHJldHVybiBkb3duY2FzdDxSZW5kZXJGaWxlVXBsb2FkQ29udHJvbD4oKm1fcmVuZGVyZXIpLmJ1
dHRvblZhbHVlKCk7Ci0gICAgCisgICAgaWYgKGF1dG8qIGZpbGVVcGxvYWQgPSBkeW5hbWljRG93
bmNhc3Q8UmVuZGVyRmlsZVVwbG9hZENvbnRyb2w+KCptX3JlbmRlcmVyKSkKKyAgICAgICAgcmV0
dXJuIGZpbGVVcGxvYWQtPmJ1dHRvblZhbHVlKCk7CisKICAgICAvLyBSZWZsZWN0IHdoZW4gYSBj
b250ZW50IGF1dGhvciBoYXMgZXhwbGljaXRseSBtYXJrZWQgYSBsaW5lIGJyZWFrLgogICAgIGlm
IChtX3JlbmRlcmVyLT5pc0JSKCkpCiAgICAgICAgIHJldHVybiAiXG4iX3M7CkBAIC02OTcsMjQg
KzcwOSwyMiBAQCBTdHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6dGV4dFVuZGVyRWxl
bWVudChBY2Nlc3NpYmlsaXR5VGV4dFVuZGVyRWxlbWVudAogICAgICAgICAgICAgICAgIHJldHVy
biBwbGFpblRleHQoKnRleHRSYW5nZSwgdGV4dEl0ZXJhdG9yQmVoYXZpb3JGb3JUZXh0UmFuZ2Uo
KSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICAvLyBTb21ldGlt
ZXMgdGV4dCBmcmFnbWVudHMgZG9uJ3QgaGF2ZSBOb2RlcyBhc3NvY2lhdGVkIHdpdGggdGhlbSAo
bGlrZSB3aGVuCiAgICAgICAgIC8vIENTUyBjb250ZW50IGlzIHVzZWQgdG8gaW5zZXJ0IHRleHQg
b3Igd2hlbiBhIFJlbmRlckNvdW50ZXIgaXMgdXNlZC4pCi0gICAgICAgIGlmIChpczxSZW5kZXJU
ZXh0PigqbV9yZW5kZXJlcikpIHsKLSAgICAgICAgICAgIFJlbmRlclRleHQmIHJlbmRlclRleHRP
YmplY3QgPSBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcik7Ci0gICAgICAgICAgICBp
ZiAoaXM8UmVuZGVyVGV4dEZyYWdtZW50PihyZW5kZXJUZXh0T2JqZWN0KSkgewotICAgICAgICAg
ICAgICAgIFJlbmRlclRleHRGcmFnbWVudCYgcmVuZGVyVGV4dEZyYWdtZW50ID0gZG93bmNhc3Q8
UmVuZGVyVGV4dEZyYWdtZW50PihyZW5kZXJUZXh0T2JqZWN0KTsKKyAgICAgICAgaWYgKFdlYWtQ
dHIgcmVuZGVyVGV4dCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcikp
IHsKKyAgICAgICAgICAgIGlmIChXZWFrUHRyIHJlbmRlclRleHRGcmFnbWVudCA9IGR5bmFtaWNE
b3duY2FzdDxSZW5kZXJUZXh0RnJhZ21lbnQ+KCpyZW5kZXJUZXh0KSkgewogICAgICAgICAgICAg
ICAgIC8vIFRoZSBhbHQgYXR0cmlidXRlIG1heSBiZSBzZXQgb24gYSB0ZXh0IGZyYWdtZW50IHRo
cm91Z2ggQ1NTLCB3aGljaCBzaG91bGQgYmUgaG9ub3JlZC4KLSAgICAgICAgICAgICAgICBjb25z
dCBTdHJpbmcmIGFsdFRleHQgPSByZW5kZXJUZXh0RnJhZ21lbnQuYWx0VGV4dCgpOworICAgICAg
ICAgICAgICAgIGF1dG8mIGFsdFRleHQgPSByZW5kZXJUZXh0RnJhZ21lbnQtPmFsdFRleHQoKTsK
ICAgICAgICAgICAgICAgICBpZiAoIWFsdFRleHQuaXNFbXB0eSgpKQogICAgICAgICAgICAgICAg
ICAgICByZXR1cm4gYWx0VGV4dDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyVGV4dEZy
YWdtZW50LmNvbnRlbnRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyVGV4
dEZyYWdtZW50ID8gcmVuZGVyVGV4dEZyYWdtZW50LT5jb250ZW50U3RyaW5nKCkgOiBTdHJpbmco
KTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRleHRPYmplY3Qu
dGV4dCgpOworICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRleHQgPyByZW5kZXJUZXh0LT50ZXh0
KCkgOiBTdHJpbmcoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBBY2Nl
c3NpYmlsaXR5Tm9kZU9iamVjdDo6dGV4dFVuZGVyRWxlbWVudChtb2RlKTsKIH0KIApAQCAtODIz
LDQ2ICs4MzMsNDUgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpvZmZzZXRCb3Vu
ZGluZ0JveEZvclJlbW90ZVNWR0VsZW1lbnQoTGF5b3V0UmVjdCYKICAgICAgICAgfQogICAgIH0K
IH0KLSAgICAKKwogTGF5b3V0UmVjdCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpib3VuZGlu
Z0JveFJlY3QoKSBjb25zdAogewotICAgIFJlbmRlck9iamVjdCogb2JqID0gcmVuZGVyZXIoKTsK
LSAgICAKLSAgICBpZiAoIW9iaikKKyAgICBXZWFrUHRyIHJlbmRlcmVyID0gdGhpcy0+cmVuZGVy
ZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyKQogICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eU5v
ZGVPYmplY3Q6OmJvdW5kaW5nQm94UmVjdCgpOwotICAgIAotICAgIGlmIChvYmotPm5vZGUoKSkg
Ly8gSWYgd2UgYXJlIGEgY29udGludWF0aW9uLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0byB1c2Ug
dGhlIHByaW1hcnkgcmVuZGVyZXIuCi0gICAgICAgIG9iaiA9IG9iai0+bm9kZSgpLT5yZW5kZXJl
cigpOwotICAgIAorCisgICAgaWYgKHJlbmRlcmVyLT5ub2RlKCkpIC8vIElmIHdlIGFyZSBhIGNv
bnRpbnVhdGlvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gdXNlIHRoZSBwcmltYXJ5IHJlbmRl
cmVyLgorICAgICAgICByZW5kZXJlciA9IHJlbmRlcmVyLT5ub2RlKCktPnJlbmRlcmVyKCk7CisK
ICAgICAvLyBhYnNvbHV0ZUZvY3VzUmluZ1F1YWRzIHdpbGwgcXVlcnkgdGhlIGhpZXJhcmNoeSBi
ZWxvdyB0aGlzIGVsZW1lbnQsIHdoaWNoIGZvciBsYXJnZSB3ZWJwYWdlcyBjYW4gYmUgdmVyeSBz
bG93LgogICAgIC8vIEZvciBhIHdlYiBhcmVhLCB3aGljaCB3aWxsIGhhdmUgdGhlIG1vc3QgZWxl
bWVudHMgb2YgYW55IGVsZW1lbnQsIGFic29sdXRlUXVhZHMgc2hvdWxkIGJlIHVzZWQuCiAgICAg
Ly8gV2Ugc2hvdWxkIGFsc28gdXNlIGFic29sdXRlUXVhZHMgZm9yIFNWRyBlbGVtZW50cywgb3Ro
ZXJ3aXNlIHRyYW5zZm9ybXMgd29uJ3QgYmUgYXBwbGllZC4KICAgICBWZWN0b3I8RmxvYXRRdWFk
PiBxdWFkczsKICAgICBib29sIGlzU1ZHUm9vdCA9IGZhbHNlOwogCi0gICAgaWYgKG9iai0+aXNS
ZW5kZXJPckxlZ2FjeVJlbmRlclNWR1Jvb3QoKSkKKyAgICBpZiAocmVuZGVyZXItPmlzUmVuZGVy
T3JMZWdhY3lSZW5kZXJTVkdSb290KCkpCiAgICAgICAgIGlzU1ZHUm9vdCA9IHRydWU7CiAKLSAg
ICBpZiAoaXM8UmVuZGVyVGV4dD4oKm9iaikpCi0gICAgICAgIHF1YWRzID0gZG93bmNhc3Q8UmVu
ZGVyVGV4dD4oKm9iaikuYWJzb2x1dGVRdWFkc0NsaXBwZWRUb0VsbGlwc2lzKCk7CisgICAgaWYg
KGF1dG8qIHJlbmRlclRleHQgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyVGV4dD4oKnJlbmRlcmVy
KSkKKyAgICAgICAgcXVhZHMgPSByZW5kZXJUZXh0LT5hYnNvbHV0ZVF1YWRzQ2xpcHBlZFRvRWxs
aXBzaXMoKTsKICAgICBlbHNlIGlmIChpc1dlYkFyZWEoKSB8fCBpc1NWR1Jvb3QpCi0gICAgICAg
IG9iai0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7CisgICAgICAgIHJlbmRlcmVyLT5hYnNvbHV0ZVF1
YWRzKHF1YWRzKTsKICAgICBlbHNlCi0gICAgICAgIG9iai0+YWJzb2x1dGVGb2N1c1JpbmdRdWFk
cyhxdWFkcyk7Ci0gICAgCi0gICAgTGF5b3V0UmVjdCByZXN1bHQgPSBib3VuZGluZ0JveEZvclF1
YWRzKG9iaiwgcXVhZHMpOworICAgICAgICByZW5kZXJlci0+YWJzb2x1dGVGb2N1c1JpbmdRdWFk
cyhxdWFkcyk7CisKKyAgICBMYXlvdXRSZWN0IHJlc3VsdCA9IGJvdW5kaW5nQm94Rm9yUXVhZHMo
cmVuZGVyZXIuZ2V0KCksIHF1YWRzKTsKIAogICAgIERvY3VtZW50KiBkb2N1bWVudCA9IHRoaXMt
PmRvY3VtZW50KCk7CiAgICAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LT5pc1NWR0RvY3VtZW50
KCkpCiAgICAgICAgIG9mZnNldEJvdW5kaW5nQm94Rm9yUmVtb3RlU1ZHRWxlbWVudChyZXN1bHQp
OwotICAgIAorCiAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHdlYiBhcmVhIHNob3VsZCBiZSB0aGUg
Y29udGVudCBzaXplLCBub3QgdGhlIGNsaXBwZWQgc2l6ZS4KICAgICBpZiAoaXNXZWJBcmVhKCkp
Ci0gICAgICAgIHJlc3VsdC5zZXRTaXplKG9iai0+dmlldygpLmZyYW1lVmlldygpLmNvbnRlbnRz
U2l6ZSgpKTsKLSAgICAKKyAgICAgICAgcmVzdWx0LnNldFNpemUocmVuZGVyZXItPnZpZXcoKS5m
cmFtZVZpZXcoKS5jb250ZW50c1NpemUoKSk7CisKICAgICByZXR1cm4gcmVzdWx0OwogfQotICAg
IAorCiBib29sIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnN1cHBvcnRzUGF0aCgpIGNvbnN0
CiB7CiAgICAgcmV0dXJuIGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKCkpIHx8IChyZW5kZXJlcigp
ICYmIHJlbmRlcmVyKCktPmlzUmVuZGVyT3JMZWdhY3lSZW5kZXJTVkdTaGFwZSgpKTsKQEAgLTg3
MCwxMiArODc5LDE1IEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c3VwcG9ydHNQ
YXRoKCkgY29uc3QKIAogUGF0aCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjplbGVtZW50UGF0
aCgpIGNvbnN0CiB7Ci0gICAgaWYgKGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKCkpKSB7CisgICAg
aWYgKCFtX3JlbmRlcmVyKQorICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6
OmVsZW1lbnRQYXRoKCk7CisKKyAgICBpZiAoYXV0byogcmVuZGVyVGV4dCA9IGR5bmFtaWNEb3du
Y2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcikpIHsKICAgICAgICAgVmVjdG9yPExheW91dFJl
Y3Q+IHJlY3RzOwotICAgICAgICBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcikuYm91
bmRpbmdSZWN0cyhyZWN0cywgZmxvb3JlZExheW91dFBvaW50KG1fcmVuZGVyZXItPmxvY2FsVG9B
YnNvbHV0ZSgpKSk7CisgICAgICAgIHJlbmRlclRleHQtPmJvdW5kaW5nUmVjdHMocmVjdHMsIGZs
b29yZWRMYXlvdXRQb2ludChtX3JlbmRlcmVyLT5sb2NhbFRvQWJzb2x1dGUoKSkpOwogICAgICAg
ICAvLyBJZiBvbmx5IDEgcmVjdCwgZG9uJ3QgY29tcHV0ZSBwYXRoIHNpbmNlIHRoZSBib3VuZGlu
ZyByZWN0IHdpbGwgYmUgZ29vZCBlbm91Z2guCiAgICAgICAgIGlmIChyZWN0cy5zaXplKCkgPCAy
KQotICAgICAgICAgICAgcmV0dXJuIFBhdGgoKTsKKyAgICAgICAgICAgIHJldHVybiB7IH07CiAK
ICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcGF0aCBvbmx5IGlmIHRoaXMgaXMgdGhlIGxhc3QgcGFy
dCBvZiBhIGxpbmUgZm9sbG93ZWQgYnkgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lLgog
ICAgICAgICBjb25zdCBhdXRvJiBzdHlsZSA9IG1fcmVuZGVyZXItPnN0eWxlKCk7CkBAIC04OTUs
NyArOTA3LDcgQEAgUGF0aCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjplbGVtZW50UGF0aCgp
IGNvbnN0CiAgICAgICAgICAgICB1bmlvblJlY3QudW5pdGUocmVjdHNbaV0pOwogICAgICAgICB9
CiAgICAgICAgIGlmICghbmVlZHNQYXRoKQotICAgICAgICAgICAgcmV0dXJuIFBhdGgoKTsKKyAg
ICAgICAgICAgIHJldHVybiB7IH07CiAKICAgICAgICAgZmxvYXQgb3V0bGluZU9mZnNldCA9IHN0
eWxlLm91dGxpbmVPZmZzZXQoKTsKICAgICAgICAgZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IgPSBt
X3JlbmRlcmVyLT5kb2N1bWVudCgpLmRldmljZVNjYWxlRmFjdG9yKCk7CkBAIC05MDgsOCArOTIw
LDggQEAgUGF0aCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjplbGVtZW50UGF0aCgpIGNvbnN0
CiAgICAgICAgIHJldHVybiBQYXRoVXRpbGl0aWVzOjpwYXRoV2l0aFNocmlua1dyYXBwZWRSZWN0
cyhwaXhlbFNuYXBwZWRSZWN0cywgMCk7CiAgICAgfQogCi0gICAgaWYgKGlzPExlZ2FjeVJlbmRl
clNWR1NoYXBlPihyZW5kZXJlcigpKSAmJiBkb3duY2FzdDxMZWdhY3lSZW5kZXJTVkdTaGFwZT4o
Km1fcmVuZGVyZXIpLmhhc1BhdGgoKSkgewotICAgICAgICBQYXRoIHBhdGggPSBkb3duY2FzdDxM
ZWdhY3lSZW5kZXJTVkdTaGFwZT4oKm1fcmVuZGVyZXIpLnBhdGgoKTsKKyAgICBpZiAoYXV0byog
cmVuZGVyU1ZHU2hhcGUgPSBkeW5hbWljRG93bmNhc3Q8TGVnYWN5UmVuZGVyU1ZHU2hhcGU+KCpt
X3JlbmRlcmVyKTsgcmVuZGVyU1ZHU2hhcGUgJiYgcmVuZGVyU1ZHU2hhcGUtPmhhc1BhdGgoKSkg
eworICAgICAgICBQYXRoIHBhdGggPSByZW5kZXJTVkdTaGFwZS0+cGF0aCgpOwogCiAgICAgICAg
IGF1dG8qIGNhY2hlID0gYXhPYmplY3RDYWNoZSgpOwogICAgICAgICBpZiAoIWNhY2hlKQpAQCAt
OTI1LDggKzkzNyw4IEBAIFBhdGggQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZWxlbWVudFBh
dGgoKSBjb25zdAogICAgIH0KIAogI2lmIEVOQUJMRShMQVlFUl9CQVNFRF9TVkdfRU5HSU5FKQot
ICAgIGlmIChpczxSZW5kZXJTVkdTaGFwZT4ocmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVy
U1ZHU2hhcGU+KCptX3JlbmRlcmVyKS5oYXNQYXRoKCkpIHsKLSAgICAgICAgUGF0aCBwYXRoID0g
ZG93bmNhc3Q8UmVuZGVyU1ZHU2hhcGU+KCptX3JlbmRlcmVyKS5wYXRoKCk7CisgICAgaWYgKGF1
dG8qIHJlbmRlclNWR1NoYXBlID0gZHluYW1pY0Rvd25jYXN0PFJlbmRlclNWR1NoYXBlPigqbV9y
ZW5kZXJlcik7IHJlbmRlclNWR1NoYXBlICYmIHJlbmRlclNWR1NoYXBlLT5oYXNQYXRoKCkpIHsK
KyAgICAgICAgUGF0aCBwYXRoID0gcmVuZGVyU1ZHU2hhcGUtPnBhdGgoKTsKIAogICAgICAgICBh
dXRvKiBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUoKTsKICAgICAgICAgaWYgKCFjYWNoZSkKQEAgLTk0
MSw3ICs5NTMsNyBAQCBQYXRoIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmVsZW1lbnRQYXRo
KCkgY29uc3QKICAgICB9CiAjZW5kaWYKIAotICAgIHJldHVybiBQYXRoKCk7CisgICAgcmV0dXJu
IHsgfTsKIH0KIAogI2lmIEVOQUJMRShBUFBMRV9QQVkpCkBAIC0xMjAzLDcgKzEyMTUsNyBAQCBi
b29sIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmNvbXB1dGVBY2Nlc3NpYmlsaXR5SXNJZ25v
cmVkKCkgY29uc3QKIAogICAgICAgICAvLyB3ZWJraXQub3JnL2IvMTczODcwIC0gSWYgYW4gaW1h
Z2UgaGFzIG90aGVyIGFsdGVybmF0aXZlIHRleHQsIGRvbid0IGlnbm9yZSBpdCBpZiBhbHQgdGV4
dCBpcyBlbXB0eS4KICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBzaG91bGQgcHJvY2VzcyB0aXRs
ZSBhbmQgYXJpYS1sYWJlbCBmaXJzdC4KLSAgICAgICAgCisKICAgICAgICAgLy8gSWYgYW4gaW1h
Z2UgaGFzIHRoZSB0aXRsZSBvciBsYWJlbCBhdHRyaWJ1dGVzLCBhY2Nlc3NpYmlsaXR5IHNob3Vs
ZCBiZSBsZW5pZW50IGFuZCBhbGxvdyBpdCB0byBhcHBlYXIgaW4gdGhlIGhpZXJhcmNoeSAoYWNj
b3JkaW5nIHRvIFdBSS1BUklBKS4KICAgICAgICAgaWYgKCFnZXRBdHRyaWJ1dGUodGl0bGVBdHRy
KS5pc0VtcHR5KCkgfHwgIWdldEF0dHJpYnV0ZShhcmlhX2xhYmVsQXR0cikuaXNFbXB0eSgpKQog
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTIxMSw5ICsxMjIzLDkgQEAgYm9vbCBBY2Nl
c3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpjb21wdXRlQWNjZXNzaWJpbGl0eUlzSWdub3JlZCgpIGNv
bnN0CiAgICAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSBSZW5kZXJJbWFnZSdzIGFsdFRleHQgKHdo
aWNoIGNhbiBiZSBzZXQgdGhyb3VnaCBhIHN0eWxlIHNoZWV0LCBvciBjb21lIGZyb20gdGhlIEVs
ZW1lbnQpLgogICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGlzIGlzIG5vdCBhIG5hdGl2ZSBpbWFn
ZSwgZmFsbGJhY2sgdG8gdGhlIGF0dHJpYnV0ZSBvbiB0aGUgRWxlbWVudC4KICAgICAgICAgQWNj
ZXNzaWJpbGl0eU9iamVjdEluY2x1c2lvbiBhbHRUZXh0SW5jbHVzaW9uID0gQWNjZXNzaWJpbGl0
eU9iamVjdEluY2x1c2lvbjo6RGVmYXVsdEJlaGF2aW9yOwotICAgICAgICBib29sIGlzUmVuZGVy
SW1hZ2UgPSBpczxSZW5kZXJJbWFnZT4ocmVuZGVyZXIoKSk7Ci0gICAgICAgIGlmIChpc1JlbmRl
ckltYWdlKQotICAgICAgICAgICAgYWx0VGV4dEluY2x1c2lvbiA9IG9iamVjdEluY2x1c2lvbkZy
b21BbHRUZXh0KGRvd25jYXN0PFJlbmRlckltYWdlPigqbV9yZW5kZXJlcikuYWx0VGV4dCgpKTsK
KyAgICAgICAgV2Vha1B0ciBpbWFnZSA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJJbWFnZT4oKm1f
cmVuZGVyZXIpOworICAgICAgICBpZiAoaW1hZ2UpCisgICAgICAgICAgICBhbHRUZXh0SW5jbHVz
aW9uID0gb2JqZWN0SW5jbHVzaW9uRnJvbUFsdFRleHQoaW1hZ2UtPmFsdFRleHQoKSk7CiAgICAg
ICAgIGVsc2UKICAgICAgICAgICAgIGFsdFRleHRJbmNsdXNpb24gPSBvYmplY3RJbmNsdXNpb25G
cm9tQWx0VGV4dChnZXRBdHRyaWJ1dGUoYWx0QXR0cikuc3RyaW5nKCkpOwogCkBAIC0xMjIyLDE1
ICsxMjM0LDE0IEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6Y29tcHV0ZUFjY2Vz
c2liaWxpdHlJc0lnbm9yZWQoKSBjb25zdAogICAgICAgICBpZiAoYWx0VGV4dEluY2x1c2lvbiA9
PSBBY2Nlc3NpYmlsaXR5T2JqZWN0SW5jbHVzaW9uOjpJbmNsdWRlT2JqZWN0KQogICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGlmIChpc1JlbmRlckltYWdlKSB7CisgICAgICAg
IGlmIChpbWFnZSkgewogICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG9uZS1kaW1lbnNpb25hbCBp
bWFnZQotICAgICAgICAgICAgUmVuZGVySW1hZ2UmIGltYWdlID0gZG93bmNhc3Q8UmVuZGVySW1h
Z2U+KCptX3JlbmRlcmVyKTsKLSAgICAgICAgICAgIGlmIChpbWFnZS5oZWlnaHQoKSA8PSAxIHx8
IGltYWdlLndpZHRoKCkgPD0gMSkKKyAgICAgICAgICAgIGlmIChpbWFnZS0+aGVpZ2h0KCkgPD0g
MSB8fCBpbWFnZS0+d2lkdGgoKSA8PSAxKQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwog
CiAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHJlbmRlcmVkIGltYWdlIHdhcyBzdHJldGNo
ZWQgZnJvbSBvbmUtZGltZW5zaW9uYWwgZmlsZSBpbWFnZQotICAgICAgICAgICAgaWYgKGltYWdl
LmNhY2hlZEltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICBMYXlvdXRTaXplIGltYWdlU2l6ZSA9
IGltYWdlLmNhY2hlZEltYWdlKCktPmltYWdlU2l6ZUZvclJlbmRlcmVyKCZpbWFnZSwgaW1hZ2Uu
dmlldygpLnpvb21GYWN0b3IoKSk7CisgICAgICAgICAgICBpZiAoaW1hZ2UtPmNhY2hlZEltYWdl
KCkpIHsKKyAgICAgICAgICAgICAgICBMYXlvdXRTaXplIGltYWdlU2l6ZSA9IGltYWdlLT5jYWNo
ZWRJbWFnZSgpLT5pbWFnZVNpemVGb3JSZW5kZXJlcihpbWFnZS5nZXQoKSwgaW1hZ2UtPnZpZXco
KS56b29tRmFjdG9yKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZVNpemUuaGVpZ2h0
KCkgPD0gMSB8fCBpbWFnZVNpemUud2lkdGgoKSA8PSAxOwogICAgICAgICAgICAgfQogICAgICAg
ICB9CkBAIC0xMjczLDE3ICsxMjg0LDE3IEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dDo6Y29tcHV0ZUFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSBjb25zdAogICAgIGlmIChpc01hdGhF
bGVtZW50KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICNlbmRpZgotICAgIAotICAgIGlmIChp
czxSZW5kZXJCbG9ja0Zsb3c+KCptX3JlbmRlcmVyKSAmJiBtX3JlbmRlcmVyLT5jaGlsZHJlbklu
bGluZSgpICYmICFjYW5TZXRGb2N1c0F0dHJpYnV0ZSgpKQotICAgICAgICByZXR1cm4gIWRvd25j
YXN0PFJlbmRlckJsb2NrRmxvdz4oKm1fcmVuZGVyZXIpLmhhc0xpbmVzKCkgJiYgIW1vdXNlQnV0
dG9uTGlzdGVuZXIoKTsKLSAgICAKKworICAgIFdlYWtQdHIgYmxvY2tGbG93ID0gZHluYW1pY0Rv
d25jYXN0PFJlbmRlckJsb2NrRmxvdz4oKm1fcmVuZGVyZXIpOworICAgIGlmIChibG9ja0Zsb3cg
JiYgbV9yZW5kZXJlci0+Y2hpbGRyZW5JbmxpbmUoKSAmJiAhY2FuU2V0Rm9jdXNBdHRyaWJ1dGUo
KSkKKyAgICAgICAgcmV0dXJuICFibG9ja0Zsb3ctPmhhc0xpbmVzKCkgJiYgIW1vdXNlQnV0dG9u
TGlzdGVuZXIoKTsKKwogICAgIGlmIChpc0NhbnZhcygpKSB7CiAgICAgICAgIGlmIChjYW52YXNI
YXNGYWxsYmFja0NvbnRlbnQoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAg
ICBpZiAoaXM8UmVuZGVyQm94PigqbV9yZW5kZXJlcikpIHsKLSAgICAgICAgICAgIGF1dG8mIGNh
bnZhc0JveCA9IGRvd25jYXN0PFJlbmRlckJveD4oKm1fcmVuZGVyZXIpOwotICAgICAgICAgICAg
aWYgKGNhbnZhc0JveC5oZWlnaHQoKSA8PSAxIHx8IGNhbnZhc0JveC53aWR0aCgpIDw9IDEpCisg
ICAgICAgIGlmIChXZWFrUHRyIGNhbnZhc0JveCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJCb3g+
KCptX3JlbmRlcmVyKSkgeworICAgICAgICAgICAgaWYgKGNhbnZhc0JveC0+aGVpZ2h0KCkgPD0g
MSB8fCBjYW52YXNCb3gtPndpZHRoKCkgPD0gMSkKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKICAgICAgICAgfQogICAgICAgICAvLyBPdGhlcndpc2UgZmFsbCB0aHJvdWdoOyB1c2UgcHJl
c2VuY2Ugb2YgaGVscCB0ZXh0LCB0aXRsZSwgb3IgZGVzY3JpcHRpb24gdG8gZGVjaWRlLgpAQCAt
MTM1Nyw5ICsxMzY4LDExIEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6Y29tcHV0
ZUFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSBjb25zdAogCiBpbnQgQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6bGF5b3V0Q291bnQoKSBjb25zdAogewotICAgIGlmICghbV9yZW5kZXJlciB8fCAh
aXM8UmVuZGVyVmlldz4oKm1fcmVuZGVyZXIpKQorICAgIGlmICghbV9yZW5kZXJlcikKICAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlclZpZXc+KCptX3JlbmRlcmVy
KS5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0Q291bnQoKTsKKworICAgIGF1dG8q
IHZpZXcgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyVmlldz4oKm1fcmVuZGVyZXIpOworICAgIHJl
dHVybiB2aWV3ID8gdmlldy0+ZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dENvdW50
KCkgOiAwOwogfQogCiBDaGFyYWN0ZXJSYW5nZSBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpk
b2N1bWVudEJhc2VkU2VsZWN0ZWRUZXh0UmFuZ2UoKSBjb25zdApAQCAtMTM4MywxMiArMTM5Niwx
MiBAQCBTdHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c2VsZWN0ZWRUZXh0KCkgY29u
c3QKICAgICAKICAgICBpZiAoaXNTZWN1cmVGaWVsZCgpKQogICAgICAgICByZXR1cm4gU3RyaW5n
KCk7IC8vIG5lZWQgdG8gcmV0dXJuIHNvbWV0aGluZyBkaXN0aW5jdCBmcm9tIGVtcHR5IHN0cmlu
ZwotICAgIAorCiAgICAgaWYgKGlzTmF0aXZlVGV4dENvbnRyb2woKSkgewotICAgICAgICBIVE1M
VGV4dEZvcm1Db250cm9sRWxlbWVudCYgdGV4dENvbnRyb2wgPSBkb3duY2FzdDxSZW5kZXJUZXh0
Q29udHJvbD4oKm1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKKyAgICAgICAg
YXV0byYgdGV4dENvbnRyb2wgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4o
Km1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKICAgICAgICAgcmV0dXJuIHRl
eHRDb250cm9sLnNlbGVjdGVkVGV4dCgpOwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBkb0FY
U3RyaW5nRm9yUmFuZ2UoZG9jdW1lbnRCYXNlZFNlbGVjdGVkVGV4dFJhbmdlKCkpOwogfQogCkBA
IC0xNDAxLDcgKzE0MTQsNyBAQCBDaGFyYWN0ZXJSYW5nZSBBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0OjpzZWxlY3RlZFRleHRSYW5nZSgpIGNvbnN0CiAKICAgICAvLyBVc2UgdGhlIHRleHQgY29u
dHJvbCBuYXRpdmUgcmFuZ2UgaWYgaXQncyBhIG5hdGl2ZSBvYmplY3QuCiAgICAgaWYgKGlzTmF0
aXZlVGV4dENvbnRyb2woKSkgewotICAgICAgICBhdXRvJiB0ZXh0Q29udHJvbCA9IGRvd25jYXN0
PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgp
OworICAgICAgICBhdXRvJiB0ZXh0Q29udHJvbCA9IHVuY2hlY2tlZERvd25jYXN0PFJlbmRlclRl
eHRDb250cm9sPigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpOwogICAgICAg
ICByZXR1cm4geyB0ZXh0Q29udHJvbC5zZWxlY3Rpb25TdGFydCgpLCB0ZXh0Q29udHJvbC5zZWxl
Y3Rpb25FbmQoKSAtIHRleHRDb250cm9sLnNlbGVjdGlvblN0YXJ0KCkgfTsKICAgICB9CiAKQEAg
LTE0NzYsNyArMTQ4OSw3IEBAIGludCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjppbnNlcnRp
b25Qb2ludExpbmVOdW1iZXIoKSBjb25zdAogCiAgICAgLy8gVXNlIHRoZSB0ZXh0IGNvbnRyb2wg
bmF0aXZlIHJhbmdlIGlmIGl0J3MgYSBuYXRpdmUgb2JqZWN0LgogICAgIGlmIChpc05hdGl2ZVRl
eHRDb250cm9sKCkpIHsKLSAgICAgICAgYXV0byYgdGV4dENvbnRyb2wgPSBkb3duY2FzdDxSZW5k
ZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKKyAg
ICAgICAgYXV0byYgdGV4dENvbnRyb2wgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJUZXh0Q29u
dHJvbD4oKm1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKICAgICAgICAgaW50
IHN0YXJ0ID0gdGV4dENvbnRyb2wuc2VsZWN0aW9uU3RhcnQoKTsKICAgICAgICAgaW50IGVuZCA9
IHRleHRDb250cm9sLnNlbGVjdGlvbkVuZCgpOwogCkBAIC0xNTI2LDcgKzE1MzksNyBAQCB2b2lk
IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNldFNlbGVjdGVkVGV4dFJhbmdlKENoYXJhY3Rl
clJhbmdlJiYgcmFuZ2UpCiAgICAgICAgIGNsaWVudC0+d2lsbENoYW5nZVNlbGVjdGlvbkZvckFj
Y2Vzc2liaWxpdHkoKTsKIAogICAgIGlmIChpc05hdGl2ZVRleHRDb250cm9sKCkpIHsKLSAgICAg
ICAgSFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQmIHRleHRDb250cm9sID0gZG93bmNhc3Q8UmVu
ZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7Cisg
ICAgICAgIGF1dG8mIHRleHRDb250cm9sID0gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyVGV4dENv
bnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7CiAgICAgICAgIHRl
eHRDb250cm9sLnNldFNlbGVjdGlvblJhbmdlKHJhbmdlLmxvY2F0aW9uLCByYW5nZS5sb2NhdGlv
biArIHJhbmdlLmxlbmd0aCk7CiAgICAgfSBlbHNlIGlmIChtX3JlbmRlcmVyKSB7CiAgICAgICAg
IEFTU0VSVChub2RlKCkpOwpAQCAtMTY0OSw4ICsxNjYyLDggQEAgQVhDb3JlT2JqZWN0OjpBY2Nl
c3NpYmlsaXR5Q2hpbGRyZW5WZWN0b3IgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZG9jdW1l
bnRMaW4KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBX
ZSBjb3VsZG4ndCByZXRyaWV2ZSB0aGUgYWxyZWFkeSBleGlzdGluZyBpbWFnZS1tYXAgbGlua3Mg
ZnJvbSB0aGUgcGFyZW50IGltYWdlLCBzbyBjcmVhdGUgYSBuZXcgb25lLgogICAgICAgICAgICAg
ICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoIlVuZXhwZWN0ZWRseSBtaXNzaW5nIGltYWdlLW1h
cCBsaW5rIHBhcmVudCBBWCBvYmplY3QuIik7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGFy
ZWFPYmplY3QgPSBkb3duY2FzdDxBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rPigqYXhPYmplY3RD
YWNoZSgpLT5jcmVhdGUoQWNjZXNzaWJpbGl0eVJvbGU6OkltYWdlTWFwTGluaykpOwotICAgICAg
ICAgICAgICAgICAgICBhcmVhT2JqZWN0LnNldEhUTUxBcmVhRWxlbWVudChkb3duY2FzdDxIVE1M
QXJlYUVsZW1lbnQ+KGN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byYgYXJlYU9i
amVjdCA9IHVuY2hlY2tlZERvd25jYXN0PEFjY2Vzc2liaWxpdHlJbWFnZU1hcExpbms+KCpheE9i
amVjdENhY2hlKCktPmNyZWF0ZShBY2Nlc3NpYmlsaXR5Um9sZTo6SW1hZ2VNYXBMaW5rKSk7Cisg
ICAgICAgICAgICAgICAgICAgIGFyZWFPYmplY3Quc2V0SFRNTEFyZWFFbGVtZW50KHVuY2hlY2tl
ZERvd25jYXN0PEhUTUxBcmVhRWxlbWVudD4oY3VycmVudCkpOwogICAgICAgICAgICAgICAgICAg
ICBhcmVhT2JqZWN0LnNldEhUTUxNYXBFbGVtZW50KHBhcmVudE1hcCk7CiAgICAgICAgICAgICAg
ICAgICAgIGFyZWFPYmplY3Quc2V0UGFyZW50KGFjY2Vzc2liaWxpdHlQYXJlbnRGb3JJbWFnZU1h
cChwYXJlbnRNYXApKTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgmYXJlYU9i
amVjdCk7CkBAIC0xNjc0LDE0ICsxNjg3LDE1IEBAIFdpZGdldCogQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6d2lkZ2V0Rm9yQXR0YWNobWVudFZpZXcoKSBjb25zdAogewogICAgIGlmICghaXNB
dHRhY2htZW50KCkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgIHJldHVybiBkb3duY2Fz
dDxSZW5kZXJXaWRnZXQ+KCptX3JlbmRlcmVyKS53aWRnZXQoKTsKKyAgICBhdXRvKiByZW5kZXJX
aWRnZXQgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyV2lkZ2V0PigqbV9yZW5kZXJlcik7CisgICAg
cmV0dXJuIHJlbmRlcldpZGdldCA/IHJlbmRlcldpZGdldC0+d2lkZ2V0KCkgOiBudWxscHRyOwog
fQogCiBWaXNpYmxlUG9zaXRpb24gQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6dmlzaWJsZVBv
c2l0aW9uRm9ySW5kZXgoaW50IGluZGV4KSBjb25zdAogewogICAgIGlmIChtX3JlbmRlcmVyKSB7
CiAgICAgICAgIGlmIChpc05hdGl2ZVRleHRDb250cm9sKCkpIHsKLSAgICAgICAgICAgIGF1dG8m
IHRleHRDb250cm9sID0gZG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50
ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7CisgICAgICAgICAgICBhdXRvJiB0ZXh0Q29udHJvbCA9
IHVuY2hlY2tlZERvd25jYXN0PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5kZXJlcikudGV4dEZv
cm1Db250cm9sRWxlbWVudCgpOwogICAgICAgICAgICAgcmV0dXJuIHRleHRDb250cm9sLnZpc2li
bGVQb3NpdGlvbkZvckluZGV4KHN0ZDo6Y2xhbXAoaW5kZXgsIDAsIHN0YXRpY19jYXN0PGludD4o
dGV4dENvbnRyb2wudmFsdWUoKS5sZW5ndGgoKSkpKTsKICAgICAgICAgfQogCkBAIC0xNjk1LDcg
KzE3MDksNyBAQCBpbnQgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6aW5kZXhGb3JWaXNpYmxl
UG9zaXRpb24oY29uc3QgVmlzaWJsZVBvc2l0aW9uJiBwbwogewogICAgIGlmIChtX3JlbmRlcmVy
KSB7CiAgICAgICAgIGlmIChpc05hdGl2ZVRleHRDb250cm9sKCkpCi0gICAgICAgICAgICByZXR1
cm4gZG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRy
b2xFbGVtZW50KCkuaW5kZXhGb3JWaXNpYmxlUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAg
ICAgcmV0dXJuIHVuY2hlY2tlZERvd25jYXN0PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5kZXJl
cikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpLmluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKHBvc2l0
aW9uKTsKIAogICAgICAgICBpZiAoIWFsbG93c1RleHRSYW5nZXMoKSAmJiAhaXM8UmVuZGVyVGV4
dD4oKm1fcmVuZGVyZXIpKQogICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNzcwLDcgKzE3ODQs
NyBAQCB2b2lkIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNldFNlbGVjdGVkVmlzaWJsZVBv
c2l0aW9uUmFuZ2UoY29uc3QgVmlzaWJsZVBvcwogICAgIGlmIChpc05hdGl2ZVRleHRDb250cm9s
KCkpIHsKICAgICAgICAgLy8gaXNOYXRpdmVUZXh0Q29udHJvbCByZXR1cm5zIHRydWUgb25seSBp
ZiB0aGlzLT5ub2RlKCkgaXM8SFRNTFRleHRBcmVhRWxlbWVudD4gb3IgaXM8SFRNTElucHV0RWxl
bWVudD4uCiAgICAgICAgIC8vIFNpbmNlIGJvdGggSFRNTFRleHRBcmVhRWxlbWVudCBhbmQgSFRN
TElucHV0RWxlbWVudCBkZXJpdmUgZnJvbSBIVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudCwgaXQg
aXMgc2FmZSB0byBkb3duY2FzdCBoZXJlLgotICAgICAgICBhdXRvKiB0ZXh0Q29udHJvbCA9IGRv
d25jYXN0PEhUTUxUZXh0Rm9ybUNvbnRyb2xFbGVtZW50Pihub2RlKCkpOworICAgICAgICBhdXRv
KiB0ZXh0Q29udHJvbCA9IHVuY2hlY2tlZERvd25jYXN0PEhUTUxUZXh0Rm9ybUNvbnRyb2xFbGVt
ZW50Pihub2RlKCkpOwogICAgICAgICBpbnQgc3RhcnQgPSB0ZXh0Q29udHJvbC0+aW5kZXhGb3JW
aXNpYmxlUG9zaXRpb24ocmFuZ2Uuc3RhcnQpOwogICAgICAgICBpbnQgZW5kID0gdGV4dENvbnRy
b2wtPmluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKHJhbmdlLmVuZCk7CiAKQEAgLTIwMDAsMTQgKzIw
MTQsMTQgQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6
YWNjZXNzaWJpbGl0eUhpdFRlc3QoY29uc3QgSW50UG8KIHsKICAgICBpZiAoIW1fcmVuZGVyZXIg
fHwgIW1fcmVuZGVyZXItPmhhc0xheWVyKCkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwotICAg
IAorCiAgICAgbV9yZW5kZXJlci0+ZG9jdW1lbnQoKS51cGRhdGVMYXlvdXQoKTsKIAogICAgIGlm
ICghbV9yZW5kZXJlciB8fCAhbV9yZW5kZXJlci0+aGFzTGF5ZXIoKSkKICAgICAgICAgcmV0dXJu
IG51bGxwdHI7CiAKLSAgICBSZW5kZXJMYXllciogbGF5ZXIgPSBkb3duY2FzdDxSZW5kZXJCb3g+
KCptX3JlbmRlcmVyKS5sYXllcigpOwotICAgICAKKyAgICBhdXRvKiBsYXllciA9IHVuY2hlY2tl
ZERvd25jYXN0PFJlbmRlckJveD4oKm1fcmVuZGVyZXIpLmxheWVyKCk7CisKICAgICBjb25zdGV4
cHIgT3B0aW9uU2V0PEhpdFRlc3RSZXF1ZXN0OjpUeXBlPiBoaXRUeXBlIHsgSGl0VGVzdFJlcXVl
c3Q6OlR5cGU6OlJlYWRPbmx5LCBIaXRUZXN0UmVxdWVzdDo6VHlwZTo6QWN0aXZlLCBIaXRUZXN0
UmVxdWVzdDo6VHlwZTo6QWNjZXNzaWJpbGl0eUhpdFRlc3QgfTsKICAgICBIaXRUZXN0UmVzdWx0
IGhpdFRlc3RSZXN1bHQgeyBwb2ludCB9OwogICAgIGxheWVyLT5oaXRUZXN0KGhpdFR5cGUsIGhp
dFRlc3RSZXN1bHQpOwpAQCAtMjI4Myw3ICsyMjk3LDcgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVu
ZGVyT2JqZWN0OjphZGRJbWFnZU1hcENoaWxkcmVuKCkKICAgICAgICAgLy8gYWRkIGFuIDxhcmVh
PiBlbGVtZW50IGZvciB0aGlzIGNoaWxkIGlmIGl0IGhhcyBhIGxpbmsKICAgICAgICAgaWYgKCFh
cmVhLmlzTGluaygpKQogICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGF1dG8mIGFyZWFP
YmplY3QgPSBkb3duY2FzdDxBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rPigqYXhPYmplY3RDYWNo
ZSgpLT5jcmVhdGUoQWNjZXNzaWJpbGl0eVJvbGU6OkltYWdlTWFwTGluaykpOworICAgICAgICBh
dXRvJiBhcmVhT2JqZWN0ID0gdW5jaGVja2VkRG93bmNhc3Q8QWNjZXNzaWJpbGl0eUltYWdlTWFw
TGluaz4oKmF4T2JqZWN0Q2FjaGUoKS0+Y3JlYXRlKEFjY2Vzc2liaWxpdHlSb2xlOjpJbWFnZU1h
cExpbmspKTsKICAgICAgICAgYXJlYU9iamVjdC5zZXRIVE1MQXJlYUVsZW1lbnQoJmFyZWEpOwog
ICAgICAgICBhcmVhT2JqZWN0LnNldEhUTUxNYXBFbGVtZW50KG1hcC5nZXQoKSk7CiAgICAgICAg
IGFyZWFPYmplY3Quc2V0UGFyZW50KHRoaXMpOwpAQCAtMjMwNCw3ICsyMzE4LDcgQEAgdm9pZCBB
Y2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjphZGRUZXh0RmllbGRDaGlsZHJlbigpCiAgICAgaWYg
KCFzcGluQnV0dG9uRWxlbWVudCkKICAgICAgICAgcmV0dXJuOwogCi0gICAgYXV0byYgYXhTcGlu
QnV0dG9uID0gZG93bmNhc3Q8QWNjZXNzaWJpbGl0eVNwaW5CdXR0b24+KCpheE9iamVjdENhY2hl
KCktPmNyZWF0ZShBY2Nlc3NpYmlsaXR5Um9sZTo6U3BpbkJ1dHRvbikpOworICAgIGF1dG8mIGF4
U3BpbkJ1dHRvbiA9IHVuY2hlY2tlZERvd25jYXN0PEFjY2Vzc2liaWxpdHlTcGluQnV0dG9uPigq
YXhPYmplY3RDYWNoZSgpLT5jcmVhdGUoQWNjZXNzaWJpbGl0eVJvbGU6OlNwaW5CdXR0b24pKTsK
ICAgICBheFNwaW5CdXR0b24uc2V0U3BpbkJ1dHRvbkVsZW1lbnQoc3BpbkJ1dHRvbkVsZW1lbnQp
OwogICAgIGF4U3BpbkJ1dHRvbi5zZXRQYXJlbnQodGhpcyk7CiAgICAgYWRkQ2hpbGQoJmF4U3Bp
bkJ1dHRvbik7CkBAIC0yNDg4LDcgKzI1MDIsNyBAQCBSZW5kZXJPYmplY3QqIEFjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3Q6Om1hcmtlclJlbmRlcmVyKCkgY29uc3QKICAgICBpZiAoYWNjZXNzaWJp
bGl0eUlzSWdub3JlZCgpIHx8ICFpc0xpc3RJdGVtKCkgfHwgIW1fcmVuZGVyZXIgfHwgIW1fcmVu
ZGVyZXItPmlzUmVuZGVyTGlzdEl0ZW0oKSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAg
ICByZXR1cm4gZG93bmNhc3Q8UmVuZGVyTGlzdEl0ZW0+KCptX3JlbmRlcmVyKS5tYXJrZXJSZW5k
ZXJlcigpOworICAgIHJldHVybiB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJMaXN0SXRlbT4oKm1f
cmVuZGVyZXIpLm1hcmtlclJlbmRlcmVyKCk7CiB9CiAKIHZvaWQgQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6YWRkTGlzdEl0ZW1NYXJrZXIoKQpAQCAtMjY4MCwxMyArMjY5NCwxMSBAQCBTdHJp
bmcgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c2VjdXJlRmllbGRWYWx1ZSgpIGNvbnN0CiAg
ICAgLy8gTG9vayBmb3IgdGhlIFJlbmRlclRleHQgb2JqZWN0IGluIHRoZSBSZW5kZXJPYmplY3Qg
dHJlZSBmb3IgdGhpcyBpbnB1dCBmaWVsZC4KICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0g
bm9kZSgpLT5yZW5kZXJlcigpOwogICAgIHdoaWxlIChyZW5kZXJlciAmJiAhaXM8UmVuZGVyVGV4
dD4ocmVuZGVyZXIpKQotICAgICAgICByZW5kZXJlciA9IGRvd25jYXN0PFJlbmRlckVsZW1lbnQ+
KCpyZW5kZXJlcikuZmlyc3RDaGlsZCgpOwotCi0gICAgaWYgKCFpczxSZW5kZXJUZXh0PihyZW5k
ZXJlcikpCi0gICAgICAgIHJldHVybiBTdHJpbmcoKTsKKyAgICAgICAgcmVuZGVyZXIgPSB1bmNo
ZWNrZWREb3duY2FzdDxSZW5kZXJFbGVtZW50PigqcmVuZGVyZXIpLmZpcnN0Q2hpbGQoKTsKIAor
ICAgIGF1dG8qIHJlbmRlclRleHQgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyVGV4dD4ocmVuZGVy
ZXIpOwogICAgIC8vIFJldHVybiB0aGUgdGV4dCB0aGF0IGlzIGFjdHVhbGx5IGJlaW5nIHJlbmRl
cmVkIGluIHRoZSBpbnB1dCBmaWVsZC4KLSAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVyVGV4dD4o
KnJlbmRlcmVyKS50ZXh0V2l0aG91dENvbnZlcnRpbmdCYWNrc2xhc2hUb1llblN5bWJvbCgpOwor
ICAgIHJldHVybiByZW5kZXJUZXh0ID8gcmVuZGVyVGV4dC0+dGV4dFdpdGhvdXRDb252ZXJ0aW5n
QmFja3NsYXNoVG9ZZW5TeW1ib2woKSA6IFN0cmluZygpOwogfQogCiBTY3JvbGxhYmxlQXJlYSog
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6Z2V0U2Nyb2xsYWJsZUFyZWFJZlNjcm9sbGFibGUo
KSBjb25zdApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3Np
YmlsaXR5U2Nyb2xsVmlldy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vz
c2liaWxpdHlTY3JvbGxWaWV3LmNwcAppbmRleCA2YmM4NDFlYmIwNjcuLjJiYmMzMDg3YjlmOCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5U2Ny
b2xsVmlldy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmls
aXR5U2Nyb2xsVmlldy5jcHAKQEAgLTQwLDggKzQwLDggQEAgQWNjZXNzaWJpbGl0eVNjcm9sbFZp
ZXc6OkFjY2Vzc2liaWxpdHlTY3JvbGxWaWV3KFNjcm9sbFZpZXcqIHZpZXcpCiAgICAgOiBtX3Nj
cm9sbFZpZXcodmlldykKICAgICAsIG1fY2hpbGRyZW5EaXJ0eShmYWxzZSkKIHsKLSAgICBpZiAo
aXM8TG9jYWxGcmFtZVZpZXc+KHZpZXcpKQotICAgICAgICBtX2ZyYW1lT3duZXJFbGVtZW50ID0g
ZG93bmNhc3Q8TG9jYWxGcmFtZVZpZXc+KCp2aWV3KS5mcmFtZSgpLm93bmVyRWxlbWVudCgpOwor
ICAgIGlmIChhdXRvKiBsb2NhbEZyYW1lVmlldyA9IGR5bmFtaWNEb3duY2FzdDxMb2NhbEZyYW1l
Vmlldz4odmlldykpCisgICAgICAgIG1fZnJhbWVPd25lckVsZW1lbnQgPSBsb2NhbEZyYW1lVmll
dy0+ZnJhbWUoKS5vd25lckVsZW1lbnQoKTsKIH0KIAogQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXc6
On5BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldygpCkBAIC0xNjMsMTIgKzE2MywxMiBAQCBBY2Nlc3Np
YmlsaXR5U2Nyb2xsYmFyKiBBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6YWRkQ2hpbGRTY3JvbGxi
YXIoU2Nyb2xsYmFyKiBzYwogewogICAgIGlmICghc2Nyb2xsYmFyKQogICAgICAgICByZXR1cm4g
bnVsbHB0cjsKLSAgICAKLSAgICBBWE9iamVjdENhY2hlKiBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUo
KTsKKworICAgIFdlYWtQdHIgY2FjaGUgPSBheE9iamVjdENhY2hlKCk7CiAgICAgaWYgKCFjYWNo
ZSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBhdXRvJiBzY3JvbGxCYXJPYmplY3Qg
PSBkb3duY2FzdDxBY2Nlc3NpYmlsaXR5U2Nyb2xsYmFyPigqY2FjaGUtPmdldE9yQ3JlYXRlKHNj
cm9sbGJhcikpOworICAgIGF1dG8mIHNjcm9sbEJhck9iamVjdCA9IHVuY2hlY2tlZERvd25jYXN0
PEFjY2Vzc2liaWxpdHlTY3JvbGxiYXI+KCpjYWNoZS0+Z2V0T3JDcmVhdGUoc2Nyb2xsYmFyKSk7
CiAgICAgc2Nyb2xsQmFyT2JqZWN0LnNldFBhcmVudCh0aGlzKTsKICAgICBhZGRDaGlsZCgmc2Ny
b2xsQmFyT2JqZWN0KTsKICAgICByZXR1cm4gJnNjcm9sbEJhck9iamVjdDsKQEAgLTI0MiwyOCAr
MjQyLDI2IEBAIERvY3VtZW50KiBBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6ZG9jdW1lbnQoKSBj
b25zdAogCiBMb2NhbEZyYW1lVmlldyogQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXc6OmRvY3VtZW50
RnJhbWVWaWV3KCkgY29uc3QKIHsKLSAgICBpZiAoaXM8TG9jYWxGcmFtZVZpZXc+KG1fc2Nyb2xs
VmlldykpCi0gICAgICAgIHJldHVybiBkb3duY2FzdDxMb2NhbEZyYW1lVmlldz4obV9zY3JvbGxW
aWV3LmdldCgpKTsKKyAgICBpZiAoYXV0byogbG9jYWxGcmFtZVZpZXcgPSBkeW5hbWljRG93bmNh
c3Q8TG9jYWxGcmFtZVZpZXc+KG1fc2Nyb2xsVmlldy5nZXQoKSkpCisgICAgICAgIHJldHVybiBs
b2NhbEZyYW1lVmlldzsKIAogICAgIGlmIChtX2ZyYW1lT3duZXJFbGVtZW50ICYmIG1fZnJhbWVP
d25lckVsZW1lbnQtPmNvbnRlbnREb2N1bWVudCgpKQogICAgICAgICByZXR1cm4gbV9mcmFtZU93
bmVyRWxlbWVudC0+Y29udGVudERvY3VtZW50KCktPnZpZXcoKTsKLQogICAgIHJldHVybiBudWxs
cHRyOwogfQogCiBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6
cGFyZW50T2JqZWN0KCkgY29uc3QKIHsKLSAgICBBWE9iamVjdENhY2hlKiBjYWNoZSA9IGF4T2Jq
ZWN0Q2FjaGUoKTsKKyAgICBXZWFrUHRyIGNhY2hlID0gYXhPYmplY3RDYWNoZSgpOwogICAgIGlm
ICghY2FjaGUpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgSFRNTEZyYW1lT3duZXJF
bGVtZW50KiBvd25lciA9IG1fZnJhbWVPd25lckVsZW1lbnQuZ2V0KCk7Ci0gICAgaWYgKGlzPExv
Y2FsRnJhbWVWaWV3PihtX3Njcm9sbFZpZXcpKQotICAgICAgICBvd25lciA9IGRvd25jYXN0PExv
Y2FsRnJhbWVWaWV3PigqbV9zY3JvbGxWaWV3KS5mcmFtZSgpLm93bmVyRWxlbWVudCgpOwotCi0g
ICAgaWYgKG93bmVyICYmIG93bmVyLT5yZW5kZXJlcigpKQotICAgICAgICByZXR1cm4gY2FjaGUt
PmdldE9yQ3JlYXRlKG93bmVyKTsKKyAgICBXZWFrUHRyIG93bmVyID0gbV9mcmFtZU93bmVyRWxl
bWVudC5nZXQoKTsKKyAgICBpZiAoYXV0byogbG9jYWxGcmFtZVZpZXcgPSBkeW5hbWljRG93bmNh
c3Q8TG9jYWxGcmFtZVZpZXc+KG1fc2Nyb2xsVmlldy5nZXQoKSkpCisgICAgICAgIG93bmVyID0g
bG9jYWxGcmFtZVZpZXctPmZyYW1lKCkub3duZXJFbGVtZW50KCk7CiAKKyAgICBpZiAoY2FjaGUg
JiYgb3duZXIgJiYgb3duZXItPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiBjYWNoZS0+Z2V0
T3JDcmVhdGUob3duZXIuZ2V0KCkpOwogICAgIHJldHVybiBudWxscHRyOwogfQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>469835</attachid>
            <date>2024-02-12 11:47:29 -0800</date>
            <delta_ts>2024-02-12 15:50:45 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-269199-20240212144727.patch</filename>
            <type>text/plain</type>
            <size>37190</size>
            <attacher name="Andres Gonzalez">andresg_22</attacher>
            
              <data encoding="base64">RnJvbSBjY2UwYzVhZGNjYWRiYTNkOTMzNGUxODRlMzg1NzQ0ZDA3NTZjY2NhIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXMgR29uemFsZXogPGFuZHJlc2dfMjJAYXBwbGUuY29t
PgpEYXRlOiBTYXQsIDEwIEZlYiAyMDI0IDE1OjE4OjMwIC0wNTAwClN1YmplY3Q6IFtQQVRDSF0g
QVg6IFJlcGxhY2UgaXM8VD4gZG93bmNhc3Q8dD4gd2l0aCBkeW5hbWljRG93bmNhc3Q8VD4KIHVu
Y2hlY2tlZERvd25jYXN0PFQ+IHdoZW4gYXBwcm9wcmlhdGUgKHBhcnQgMSkuCiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY5MTk5IDxyZGFyOi8vcHJvYmxlbS8xMjI4
MDQ3ODU+CgpSZXZpZXdlZCBieSBUeWxlciBXaWxjb2NrLgoKVGhpcyBpcyBhIGZvbGxvdyB1cCB0
byBodHRwczovL2NvbW1pdHMud2Via2l0Lm9yZy8yNzIyOTZAbWFpbi4KCmlzPFQ+IGZvbGxvd2Vk
IGJ5IGRvd25jYXN0PFQ+IGhhcyBhIHBlcmZvcm1hbmNlIGltcGFjdCBzaW5jZSBpdCB0eXBlLWNo
ZWNrcyB0d2ljZS4gSW4gdGhvc2UgY2FzZXMsIHRoZSBjb2RlIGNhbiBiZSB3cml0dGVuIHVzaW5n
IGR5bmFtaWNEb253Y2FzdDxUPi4gSW4gb3RoZXIgY2FzZXMgd2hlcmUgd2UgYXJlIGNlcnRhaW4g
dGhhdCB0aGUgZG93bmNhc3QgaXMgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IHR5cGUsIHdlIHNob3Vs
ZCB1c2UgdW5jaGVja2VkRG93bmNhc3QuIFRoaXMgcGF0Y2ggbWFrZXMgdGhlc2UgY2hhbmdlcyBp
biBzb21lIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IGNvcmUgY29kZS4gTW9yZSBzaW1pbGFyIGNoYW5n
ZXMgaW4gc3Vic2VxdWVudCBwYXRjaGVzLiB0aGlzIHBhdGNoIGFsc28gaW5jbHVkZSBzb21lIGNv
ZGUgY2xlYW51cCBhbmQgbW9yZSBhZG9wdGlvbiBvZiBzbWFydCBwb2ludGVyIHRvIHJlcGxhY2Ug
cmF3IHBvaW50ZXJzLgoKKiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3QuY3BwOgooV2ViQ29yZTo6Zmlyc3RDaGlsZEluQ29udGludWF0aW9uKToK
KFdlYkNvcmU6OmZpcnN0Q2hpbGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbik6CihXZWJDb3JlOjps
YXN0Q2hpbGRDb25zaWRlcmluZ0NvbnRpbnVhdGlvbik6CihXZWJDb3JlOjpzdGFydE9mQ29udGlu
dWF0aW9ucyk6CihXZWJDb3JlOjplbmRPZkNvbnRpbnVhdGlvbnMpOgooV2ViQ29yZTo6QWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdDo6cHJldmlvdXNTaWJsaW5nIGNvbnN0KToKKFdlYkNvcmU6OkFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Om5leHRTaWJsaW5nIGNvbnN0KToKKFdlYkNvcmU6Om5l
eHRDb250aW51YXRpb24pOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cGFy
ZW50T2JqZWN0IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFu
Y2hvckVsZW1lbnQgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6
dGV4dFVuZGVyRWxlbWVudCBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0Ojpib3VuZGluZ0JveFJlY3QgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6ZWxlbWVudFBhdGggY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6Y29tcHV0ZUFjY2Vzc2liaWxpdHlJc0lnbm9yZWQgY29uc3QpOgooV2ViQ29yZTo6
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6bGF5b3V0Q291bnQgY29uc3QpOgooV2ViQ29yZTo6
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c2VsZWN0ZWRUZXh0IGNvbnN0KToKKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNlbGVjdGVkVGV4dFJhbmdlIGNvbnN0KToKKFdl
YkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Omluc2VydGlvblBvaW50TGluZU51bWJl
ciBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzZXRTZWxlY3Rl
ZFRleHRSYW5nZSk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpkb2N1bWVu
dExpbmtzKToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OndpZGdldEZvckF0
dGFjaG1lbnRWaWV3IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6
OnZpc2libGVQb3NpdGlvbkZvckluZGV4IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlS
ZW5kZXJPYmplY3Q6OmluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uIGNvbnN0KToKKFdlYkNvcmU6OkFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNldFNlbGVjdGVkVmlzaWJsZVBvc2l0aW9uUmFuZ2Ug
Y29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6YWNjZXNzaWJpbGl0
eUhpdFRlc3QgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6YWRk
SW1hZ2VNYXBDaGlsZHJlbik6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojph
ZGRUZXh0RmllbGRDaGlsZHJlbik6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
OjptYXJrZXJSZW5kZXJlciBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0OjpzZWN1cmVGaWVsZFZhbHVlIGNvbnN0KToKKiBTb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmls
aXR5L0FjY2Vzc2liaWxpdHlTY3JvbGxWaWV3LmNwcDoKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlT
Y3JvbGxWaWV3OjpBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldyk6CihXZWJDb3JlOjpBY2Nlc3NpYmls
aXR5U2Nyb2xsVmlldzo6YWRkQ2hpbGRTY3JvbGxiYXIpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0
eVNjcm9sbFZpZXc6OmRvY3VtZW50RnJhbWVWaWV3IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2li
aWxpdHlTY3JvbGxWaWV3OjpwYXJlbnRPYmplY3QgY29uc3QpOgotLS0KIC4uLi9BY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0LmNwcCAgICAgICAgICAgICB8IDI3MyArKysrKysrKystLS0tLS0tLS0K
IC4uLi9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlTY3JvbGxWaWV3LmNwcCB8ICAyOCArLQog
MiBmaWxlcyBjaGFuZ2VkLCAxNTQgaW5zZXJ0aW9ucygrKSwgMTQ3IGRlbGV0aW9ucygtKQoKZGlm
ZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlS
ZW5kZXJPYmplY3QuY3BwCmluZGV4IGJiNjg2MDdkOWI3Yy4uNjg5NDc5YmNhZjUwIDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3QuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVJl
bmRlck9iamVjdC5jcHAKQEAgLTE2OSwxNiArMTY5LDE3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBp
c0lubGluZVdpdGhDb250aW51YXRpb24oUmVuZGVyT2JqZWN0JiByZW5kZXJlcikKICAgICByZXR1
cm4gcmVuZGVySW5saW5lICYmIHJlbmRlcklubGluZS0+Y29udGludWF0aW9uKCk7CiB9CiAKLXN0
YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkSW5Db250aW51YXRpb24oUmVuZGVy
SW5saW5lJiByZW5kZXJlcikKK3N0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxk
SW5Db250aW51YXRpb24oUmVuZGVyQm94TW9kZWxPYmplY3QmIHJlbmRlcmVyKQogewotICAgIGF1
dG8qIGNvbnRpbnVhdGlvbiA9IHJlbmRlcmVyLmNvbnRpbnVhdGlvbigpOwotCisgICAgV2Vha1B0
ciBjb250aW51YXRpb24gPSByZW5kZXJlci5jb250aW51YXRpb24oKTsKICAgICB3aGlsZSAoY29u
dGludWF0aW9uKSB7CiAgICAgICAgIGlmIChpczxSZW5kZXJCbG9jaz4oKmNvbnRpbnVhdGlvbikp
Ci0gICAgICAgICAgICByZXR1cm4gY29udGludWF0aW9uOwotICAgICAgICBpZiAoUmVuZGVyT2Jq
ZWN0KiBjaGlsZCA9IGNvbnRpbnVhdGlvbi0+Zmlyc3RDaGlsZCgpKQorICAgICAgICAgICAgcmV0
dXJuIGNvbnRpbnVhdGlvbi5nZXQoKTsKKworICAgICAgICBpZiAoYXV0byogY2hpbGQgPSBjb250
aW51YXRpb24tPmZpcnN0Q2hpbGQoKSkKICAgICAgICAgICAgIHJldHVybiBjaGlsZDsKLSAgICAg
ICAgY29udGludWF0aW9uID0gZG93bmNhc3Q8UmVuZGVySW5saW5lPigqY29udGludWF0aW9uKS5j
b250aW51YXRpb24oKTsKKworICAgICAgICBjb250aW51YXRpb24gPSBjb250aW51YXRpb24tPmNv
bnRpbnVhdGlvbigpOwogICAgIH0KIAogICAgIHJldHVybiBudWxscHRyOwpAQCAtMTkxLDExICsx
OTIsMTQgQEAgc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGZpcnN0Q2hpbGRDb25zaWRlcmlu
Z0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QmIHJlbmQKICAgICAvLyBXZSBkb24ndCB3YW50IHRv
IGluY2x1ZGUgdGhlIGVuZCBvZiBhIGNvbnRpbnVhdGlvbiBhcyB0aGUgZmlyc3RDaGlsZCBvZiB0
aGUKICAgICAvLyBhbm9ueW1vdXMgcGFyZW50LCBiZWNhdXNlIGV2ZXJ5dGhpbmcgaGFzIGFscmVh
ZHkgYmVlbiBsaW5rZWQgdXAgdmlhIGNvbnRpbnVhdGlvbi4KICAgICAvLyBDU1MgZmlyc3QtbGV0
dGVyIHNlbGVjdG9yIGlzIGFuIGV4YW1wbGUgb2YgdGhpcyBjYXNlLgotICAgIGlmIChyZW5kZXJl
ci5pc0Fub255bW91cygpICYmIGlzPFJlbmRlcklubGluZT4oZmlyc3RDaGlsZCkgJiYgZG93bmNh
c3Q8UmVuZGVySW5saW5lPigqZmlyc3RDaGlsZCkuaXNDb250aW51YXRpb24oKSkKLSAgICAgICAg
Zmlyc3RDaGlsZCA9IG51bGxwdHI7Ci0gICAgCisgICAgaWYgKHJlbmRlcmVyLmlzQW5vbnltb3Vz
KCkpIHsKKyAgICAgICAgYXV0byogcmVuZGVySW5saW5lID0gZHluYW1pY0Rvd25jYXN0PFJlbmRl
cklubGluZT4oZmlyc3RDaGlsZCk7CisgICAgICAgIGlmIChyZW5kZXJJbmxpbmUgJiYgcmVuZGVy
SW5saW5lLT5pc0NvbnRpbnVhdGlvbigpKQorICAgICAgICAgICAgZmlyc3RDaGlsZCA9IG51bGxw
dHI7CisgICAgfQorCiAgICAgaWYgKCFmaXJzdENoaWxkICYmIGlzSW5saW5lV2l0aENvbnRpbnVh
dGlvbihyZW5kZXJlcikpCi0gICAgICAgIGZpcnN0Q2hpbGQgPSBmaXJzdENoaWxkSW5Db250aW51
YXRpb24oZG93bmNhc3Q8UmVuZGVySW5saW5lPihyZW5kZXJlcikpOworICAgICAgICBmaXJzdENo
aWxkID0gZmlyc3RDaGlsZEluQ29udGludWF0aW9uKHVuY2hlY2tlZERvd25jYXN0PFJlbmRlcklu
bGluZT4ocmVuZGVyZXIpKTsKIAogICAgIHJldHVybiBmaXJzdENoaWxkOwogfQpAQCAtMjA2LDE1
ICsyMTAsMTYgQEAgc3RhdGljIGlubGluZSBSZW5kZXJPYmplY3QqIGxhc3RDaGlsZENvbnNpZGVy
aW5nQ29udGludWF0aW9uKFJlbmRlck9iamVjdCYgcmVuZGUKICAgICBpZiAoIWlzPFJlbmRlcklu
bGluZT4ocmVuZGVyZXIpICYmICFpczxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpKQogICAgICAgICBy
ZXR1cm4gJnJlbmRlcmVyOwogCi0gICAgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGQgPSBkb3duY2Fz
dDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIpLmxhc3RDaGlsZCgpOwotICAgIGZvciAo
YXV0byogY3VycmVudCA9ICZkb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIp
OyBjdXJyZW50OyApIHsKLSAgICAgICAgaWYgKFJlbmRlck9iamVjdCogbmV3TGFzdENoaWxkID0g
Y3VycmVudC0+bGFzdENoaWxkKCkpCisgICAgYXV0byYgYm94TW9kZWxPYmplY3QgPSB1bmNoZWNr
ZWREb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIpOworICAgIFdlYWtQdHIg
bGFzdENoaWxkID0gYm94TW9kZWxPYmplY3QubGFzdENoaWxkKCk7CisgICAgZm9yIChhdXRvKiBj
dXJyZW50ID0gJmJveE1vZGVsT2JqZWN0OyBjdXJyZW50OyApIHsKKyAgICAgICAgaWYgKGF1dG8q
IG5ld0xhc3RDaGlsZCA9IGN1cnJlbnQtPmxhc3RDaGlsZCgpKQogICAgICAgICAgICAgbGFzdENo
aWxkID0gbmV3TGFzdENoaWxkOwogCiAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LT5pbmxpbmVD
b250aW51YXRpb24oKTsKICAgICB9CiAKLSAgICByZXR1cm4gbGFzdENoaWxkOworICAgIHJldHVy
biBsYXN0Q2hpbGQuZ2V0KCk7CiB9CiAKIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3Q6OmZpcnN0Q2hpbGQoKSBjb25zdApAQCAtMjUxLDE2ICsyNTYsMTYgQEAg
QWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6bGFzdENoaWxk
KCkgY29uc3QKIAogc3RhdGljIGlubGluZSBSZW5kZXJJbmxpbmUqIHN0YXJ0T2ZDb250aW51YXRp
b25zKFJlbmRlck9iamVjdCYgcmVuZGVyZXIpCiB7Ci0gICAgYXV0byogcmVuZGVyRWxlbWVudCA9
IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJFbGVtZW50PihyZW5kZXJlcik7CisgICAgV2Vha1B0ciBy
ZW5kZXJFbGVtZW50ID0gZHluYW1pY0Rvd25jYXN0PFJlbmRlckVsZW1lbnQ+KHJlbmRlcmVyKTsK
ICAgICBpZiAoIXJlbmRlckVsZW1lbnQpCiAgICAgICAgIHJldHVybiBudWxscHRyOworCiAgICAg
aWYgKGlzPFJlbmRlcklubGluZT4oKnJlbmRlckVsZW1lbnQpICYmIHJlbmRlckVsZW1lbnQtPmlz
Q29udGludWF0aW9uKCkgJiYgaXM8UmVuZGVySW5saW5lPihyZW5kZXJFbGVtZW50LT5lbGVtZW50
KCktPnJlbmRlcmVyKCkpKQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVySW5saW5lPihy
ZW5kZXJlci5ub2RlKCktPnJlbmRlcmVyKCkpOworICAgICAgICByZXR1cm4gdW5jaGVja2VkRG93
bmNhc3Q8UmVuZGVySW5saW5lPihyZW5kZXJlci5ub2RlKCktPnJlbmRlcmVyKCkpOwogCiAgICAg
Ly8gQmxvY2tzIHdpdGggYSBwcmV2aW91cyBjb250aW51YXRpb24gYWx3YXlzIGhhdmUgYSBuZXh0
IGNvbnRpbnVhdGlvbgogICAgIGlmIChhdXRvKiByZW5kZXJCbG9jayA9IGR5bmFtaWNEb3duY2Fz
dDxSZW5kZXJCbG9jaz4oKnJlbmRlckVsZW1lbnQpOyByZW5kZXJCbG9jayAmJiByZW5kZXJCbG9j
ay0+aW5saW5lQ29udGludWF0aW9uKCkpCi0gICAgICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJJ
bmxpbmU+KHJlbmRlckJsb2NrLT5pbmxpbmVDb250aW51YXRpb24oKS0+ZWxlbWVudCgpLT5yZW5k
ZXJlcigpKTsKLQorICAgICAgICByZXR1cm4gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVySW5saW5l
PihyZW5kZXJCbG9jay0+aW5saW5lQ29udGludWF0aW9uKCktPmVsZW1lbnQoKS0+cmVuZGVyZXIo
KSk7CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKQEAgLTI2OSw3ICsyNzQsNyBAQCBzdGF0aWMg
aW5saW5lIFJlbmRlck9iamVjdCogZW5kT2ZDb250aW51YXRpb25zKFJlbmRlck9iamVjdCYgcmVu
ZGVyZXIpCiAgICAgaWYgKCFpczxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKSAmJiAhaXM8UmVuZGVy
QmxvY2s+KHJlbmRlcmVyKSkKICAgICAgICAgcmV0dXJuICZyZW5kZXJlcjsKIAotICAgIGF1dG8q
IHByZXZpb3VzID0gJmRvd25jYXN0PFJlbmRlckJveE1vZGVsT2JqZWN0PihyZW5kZXJlcik7Cisg
ICAgYXV0byogcHJldmlvdXMgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVj
dD4oJnJlbmRlcmVyKTsKICAgICBmb3IgKGF1dG8qIGN1cnJlbnQgPSBwcmV2aW91czsgY3VycmVu
dDsgKSB7CiAgICAgICAgIHByZXZpb3VzID0gY3VycmVudDsKICAgICAgICAgY3VycmVudCA9IGN1
cnJlbnQtPmlubGluZUNvbnRpbnVhdGlvbigpOwpAQCAtMzIyLDE0ICszMjcsMTQgQEAgQWNjZXNz
aWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cHJldmlvdXNTaWJsaW5n
KCkgY29uc3QKICAgICAvLyBDYXNlIDE6IFRoZSBub2RlIGlzIGEgYmxvY2sgYW5kIGlzIGFuIGlu
bGluZSdzIGNvbnRpbnVhdGlvbi4gSW4gdGhhdCBjYXNlLCB0aGUgaW5saW5lJ3MKICAgICAvLyBs
YXN0IGNoaWxkIGlzIG91ciBwcmV2aW91cyBzaWJsaW5nIChvciBmdXJ0aGVyIGJhY2sgaW4gdGhl
IGNvbnRpbnVhdGlvbiBjaGFpbikKICAgICBSZW5kZXJJbmxpbmUqIHN0YXJ0T2ZDb250czsKLSAg
ICBpZiAoaXM8UmVuZGVyQm94PigqbV9yZW5kZXJlcikgJiYgKHN0YXJ0T2ZDb250cyA9IHN0YXJ0
T2ZDb250aW51YXRpb25zKCptX3JlbmRlcmVyKSkpCisgICAgV2Vha1B0ciByZW5kZXJCbG9jayA9
IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJCbG9jaz4oKm1fcmVuZGVyZXIpOworICAgIGlmIChyZW5k
ZXJCbG9jayAmJiAoc3RhcnRPZkNvbnRzID0gc3RhcnRPZkNvbnRpbnVhdGlvbnMoKm1fcmVuZGVy
ZXIpKSkKICAgICAgICAgcHJldmlvdXNTaWJsaW5nID0gY2hpbGRCZWZvcmVDb25zaWRlcmluZ0Nv
bnRpbnVhdGlvbnMoc3RhcnRPZkNvbnRzLCByZW5kZXJlcigpKTsKIAogICAgIC8vIENhc2UgMjog
QW5vbnltb3VzIGJsb2NrIHBhcmVudCBvZiB0aGUgZW5kIG9mIGEgY29udGludWF0aW9uIC0gc2tp
cCBhbGwgdGhlIHdheSB0byBiZWZvcmUKICAgICAvLyB0aGUgcGFyZW50IG9mIHRoZSBzdGFydCwg
c2luY2UgZXZlcnl0aGluZyBpbiBiZXR3ZWVuIHdpbGwgYmUgbGlua2VkIHVwIHZpYSB0aGUgY29u
dGludWF0aW9uLgotICAgIGVsc2UgaWYgKG1fcmVuZGVyZXItPmlzQW5vbnltb3VzQmxvY2soKSAm
JiBmaXJzdENoaWxkSXNJbmxpbmVDb250aW51YXRpb24oZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCpt
X3JlbmRlcmVyKSkpIHsKLSAgICAgICAgUmVuZGVyQmxvY2smIHJlbmRlckJsb2NrID0gZG93bmNh
c3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKTsKLSAgICAgICAgYXV0byogZmlyc3RQYXJlbnQg
PSBzdGFydE9mQ29udGludWF0aW9ucygqcmVuZGVyQmxvY2suZmlyc3RDaGlsZCgpKS0+cGFyZW50
KCk7CisgICAgZWxzZSBpZiAocmVuZGVyQmxvY2sgJiYgbV9yZW5kZXJlci0+aXNBbm9ueW1vdXNC
bG9jaygpICYmIGZpcnN0Q2hpbGRJc0lubGluZUNvbnRpbnVhdGlvbigqcmVuZGVyQmxvY2spKSB7
CisgICAgICAgIGF1dG8qIGZpcnN0UGFyZW50ID0gc3RhcnRPZkNvbnRpbnVhdGlvbnMoKnJlbmRl
ckJsb2NrLT5maXJzdENoaWxkKCkpLT5wYXJlbnQoKTsKICAgICAgICAgQVNTRVJUKGZpcnN0UGFy
ZW50KTsKICAgICAgICAgd2hpbGUgKGZpcnN0Q2hpbGRJc0lubGluZUNvbnRpbnVhdGlvbigqZmly
c3RQYXJlbnQpKQogICAgICAgICAgICAgZmlyc3RQYXJlbnQgPSBzdGFydE9mQ29udGludWF0aW9u
cygqZmlyc3RQYXJlbnQtPmZpcnN0Q2hpbGQoKSktPnBhcmVudCgpOwpAQCAtMzczLDEzICszNzgs
MTQgQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6bmV4
dFNpYmxpbmcoKSBjb25zdAogICAgIC8vIENhc2UgMTogbm9kZSBpcyBhIGJsb2NrIGFuZCBoYXMg
YW4gaW5saW5lIGNvbnRpbnVhdGlvbi4gTmV4dCBzaWJsaW5nIGlzIHRoZSBpbmxpbmUgY29udGlu
dWF0aW9uJ3MKICAgICAvLyBmaXJzdCBjaGlsZC4KICAgICBSZW5kZXJJbmxpbmUqIGlubGluZUNv
bnRpbnVhdGlvbjsKLSAgICBpZiAoaXM8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKSAmJiAoaW5s
aW5lQ29udGludWF0aW9uID0gZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKS5pbmxp
bmVDb250aW51YXRpb24oKSkpCisgICAgV2Vha1B0ciByZW5kZXJCbG9jayA9IGR5bmFtaWNEb3du
Y2FzdDxSZW5kZXJCbG9jaz4oKm1fcmVuZGVyZXIpOworICAgIGlmIChyZW5kZXJCbG9jayAmJiAo
aW5saW5lQ29udGludWF0aW9uID0gcmVuZGVyQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpKSkK
ICAgICAgICAgbmV4dFNpYmxpbmcgPSBmaXJzdENoaWxkQ29uc2lkZXJpbmdDb250aW51YXRpb24o
KmlubGluZUNvbnRpbnVhdGlvbik7CiAKICAgICAvLyBDYXNlIDI6IEFub255bW91cyBibG9jayBw
YXJlbnQgb2YgdGhlIHN0YXJ0IG9mIGEgY29udGludWF0aW9uIC0gc2tpcCBhbGwgdGhlIHdheSB0
bwogICAgIC8vIGFmdGVyIHRoZSBwYXJlbnQgb2YgdGhlIGVuZCwgc2luY2UgZXZlcnl0aGluZyBp
biBiZXR3ZWVuIHdpbGwgYmUgbGlua2VkIHVwIHZpYSB0aGUgY29udGludWF0aW9uLgotICAgIGVs
c2UgaWYgKG1fcmVuZGVyZXItPmlzQW5vbnltb3VzQmxvY2soKSAmJiBsYXN0Q2hpbGRIYXNDb250
aW51YXRpb24oZG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKSkpIHsKLSAgICAgICAg
UmVuZGVyRWxlbWVudCogbGFzdFBhcmVudCA9IGVuZE9mQ29udGludWF0aW9ucygqZG93bmNhc3Q8
UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKS5sYXN0Q2hpbGQoKSktPnBhcmVudCgpOworICAgIGVs
c2UgaWYgKHJlbmRlckJsb2NrICYmIG1fcmVuZGVyZXItPmlzQW5vbnltb3VzQmxvY2soKSAmJiBs
YXN0Q2hpbGRIYXNDb250aW51YXRpb24oKnJlbmRlckJsb2NrKSkgeworICAgICAgICBhdXRvKiBs
YXN0UGFyZW50ID0gZW5kT2ZDb250aW51YXRpb25zKCpyZW5kZXJCbG9jay0+bGFzdENoaWxkKCkp
LT5wYXJlbnQoKTsKICAgICAgICAgQVNTRVJUKGxhc3RQYXJlbnQpOwogICAgICAgICB3aGlsZSAo
bGFzdENoaWxkSGFzQ29udGludWF0aW9uKCpsYXN0UGFyZW50KSkKICAgICAgICAgICAgIGxhc3RQ
YXJlbnQgPSBlbmRPZkNvbnRpbnVhdGlvbnMoKmxhc3RQYXJlbnQtPmxhc3RDaGlsZCgpKS0+cGFy
ZW50KCk7CkBAIC0zOTksNyArNDA1LDcgQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdDo6bmV4dFNpYmxpbmcoKSBjb25zdAogICAgIC8vIENhc2UgNS4xOiBB
ZnRlciBjYXNlIDQsICh0aGUgZWxlbWVudCB3YXMgaW5saW5lIHcvIGNvbnRpbnVhdGlvbiBidXQg
aGFkIG5vIHNpYmxpbmcpLCB0aGVuIGNoZWNrIGl0J3MgcGFyZW50LgogICAgIGlmICghbmV4dFNp
YmxpbmcgJiYgbV9yZW5kZXJlci0+cGFyZW50KCkgJiYgaXNJbmxpbmVXaXRoQ29udGludWF0aW9u
KCptX3JlbmRlcmVyLT5wYXJlbnQoKSkpIHsKICAgICAgICAgYXV0byYgY29udGludWF0aW9uID0g
KmRvd25jYXN0PFJlbmRlcklubGluZT4oKm1fcmVuZGVyZXItPnBhcmVudCgpKS5jb250aW51YXRp
b24oKTsKLSAgICAgICAgCisKICAgICAgICAgLy8gQ2FzZSA1YTogY29udGludWF0aW9uIGlzIGEg
YmxvY2sgLSBpbiB0aGlzIGNhc2UgdGhlIGJsb2NrIGl0c2VsZiBpcyB0aGUgbmV4dCBzaWJsaW5n
LgogICAgICAgICBpZiAoaXM8UmVuZGVyQmxvY2s+KGNvbnRpbnVhdGlvbikpCiAgICAgICAgICAg
ICBuZXh0U2libGluZyA9ICZjb250aW51YXRpb247CkBAIC00MzksMTEgKzQ0NSwxMyBAQCBBY2Nl
c3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpuZXh0U2libGluZygp
IGNvbnN0CiAKIHN0YXRpYyBSZW5kZXJCb3hNb2RlbE9iamVjdCogbmV4dENvbnRpbnVhdGlvbihS
ZW5kZXJPYmplY3QmIHJlbmRlcmVyKQogewotICAgIGlmIChpczxSZW5kZXJJbmxpbmU+KHJlbmRl
cmVyKSAmJiAhcmVuZGVyZXIuaXNSZXBsYWNlZE9ySW5saW5lQmxvY2soKSkKLSAgICAgICAgcmV0
dXJuIGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIpLmNvbnRpbnVhdGlvbigpOwotICAg
IGlmIChpczxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpKQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8
UmVuZGVyQmxvY2s+KHJlbmRlcmVyKS5pbmxpbmVDb250aW51YXRpb24oKTsKLSAgICByZXR1cm4g
bnVsbHB0cjsKKyAgICBpZiAoIXJlbmRlcmVyLmlzUmVwbGFjZWRPcklubGluZUJsb2NrKCkpIHsK
KyAgICAgICAgaWYgKGF1dG8qIHJlbmRlcklubGluZSA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJJ
bmxpbmU+KHJlbmRlcmVyKSkKKyAgICAgICAgICAgIHJldHVybiByZW5kZXJJbmxpbmUtPmNvbnRp
bnVhdGlvbigpOworICAgIH0KKworICAgIGF1dG8qIHJlbmRlckJsb2NrID0gZHluYW1pY0Rvd25j
YXN0PFJlbmRlckJsb2NrPihyZW5kZXJlcik7CisgICAgcmV0dXJuIHJlbmRlckJsb2NrID8gcmVu
ZGVyQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpIDogbnVsbHB0cjsKIH0KICAgICAKIFJlbmRl
ck9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cmVuZGVyUGFyZW50T2JqZWN0KCkg
Y29uc3QKQEAgLTUzNyw4ICs1NDUsOCBAQCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0OjpwYXJlbnRPYmplY3QoKSBjb25zdAogICAgIC8vIEV4cG9zZSBtYXJr
ZXJzIHRoYXQgYXJlIG5vdCBkaXJlY3QgY2hpbGRyZW4gb2YgYSBsaXN0IGl0ZW0gdG9vLgogICAg
IGlmIChtX3JlbmRlcmVyLT5pc1JlbmRlckxpc3RNYXJrZXIoKSkgewogICAgICAgICBpZiAoYXV0
byogbGlzdEl0ZW0gPSBhbmNlc3RvcnNPZlR5cGU8UmVuZGVyTGlzdEl0ZW0+KCptX3JlbmRlcmVy
KS5maXJzdCgpKSB7Ci0gICAgICAgICAgICBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBwYXJlbnQgPSBh
eE9iamVjdENhY2hlKCktPmdldE9yQ3JlYXRlKGxpc3RJdGVtKTsKLSAgICAgICAgICAgIGlmIChk
b3duY2FzdDxBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0PigqcGFyZW50KS5tYXJrZXJSZW5kZXJl
cigpID09IG1fcmVuZGVyZXIpCisgICAgICAgICAgICBhdXRvKiBwYXJlbnQgPSBheE9iamVjdENh
Y2hlKCktPmdldE9yQ3JlYXRlKGxpc3RJdGVtKTsKKyAgICAgICAgICAgIGlmICh1bmNoZWNrZWRE
b3duY2FzdDxBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0PihwYXJlbnQpLm1hcmtlclJlbmRlcmVy
KCkgPT0gbV9yZW5kZXJlcikKICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50OwogICAgICAg
ICB9CiAgICAgfQpAQCAtNTQ2LDExICs1NTQsMTEgQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNj
ZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cGFyZW50T2JqZWN0KCkgY29uc3QKIAogICAgIGlmIChh
dXRvKiBwYXJlbnRPYmplY3QgPSByZW5kZXJQYXJlbnRPYmplY3QoKSkKICAgICAgICAgcmV0dXJu
IGNhY2hlLT5nZXRPckNyZWF0ZShwYXJlbnRPYmplY3QpOwotICAgIAorCiAgICAgLy8gV2ViQXJl
YSdzIHBhcmVudCBzaG91bGQgYmUgdGhlIHNjcm9sbCB2aWV3IGNvbnRhaW5pbmcgaXQuCiAgICAg
aWYgKGlzV2ViQXJlYSgpKQogICAgICAgICByZXR1cm4gY2FjaGUtPmdldE9yQ3JlYXRlKCZtX3Jl
bmRlcmVyLT52aWV3KCkuZnJhbWVWaWV3KCkpOwotICAgIAorCiAgICAgcmV0dXJuIG51bGxwdHI7
CiB9CiAKQEAgLTU4MywzMiArNTkxLDM2IEBAIEVsZW1lbnQqIEFjY2Vzc2liaWxpdHlSZW5kZXJP
YmplY3Q6OmFuY2hvckVsZW1lbnQoKSBjb25zdAogewogICAgIGlmICghbV9yZW5kZXJlcikKICAg
ICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgCi0gICAgQVhPYmplY3RDYWNoZSogY2FjaGUgPSBh
eE9iamVjdENhY2hlKCk7CisKKyAgICBXZWFrUHRyIGNhY2hlID0gYXhPYmplY3RDYWNoZSgpOwog
ICAgIGlmICghY2FjaGUpCiAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgIAorCiAgICAgUmVu
ZGVyT2JqZWN0KiBjdXJyZW50UmVuZGVyZXI7Ci0gICAgCisKICAgICAvLyBTZWFyY2ggdXAgdGhl
IHJlbmRlciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5vZGUuICBEZWZlciB0
byBhbiBlYXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgogICAgIGZvciAoY3VycmVudFJlbmRl
cmVyID0gcmVuZGVyZXIoKTsgY3VycmVudFJlbmRlcmVyICYmICFjdXJyZW50UmVuZGVyZXItPm5v
ZGUoKTsgY3VycmVudFJlbmRlcmVyID0gY3VycmVudFJlbmRlcmVyLT5wYXJlbnQoKSkgewogICAg
ICAgICBpZiAoY3VycmVudFJlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkpIHsKLSAgICAgICAg
ICAgIGlmIChSZW5kZXJPYmplY3QqIGNvbnRpbnVhdGlvbiA9IGRvd25jYXN0PFJlbmRlckJsb2Nr
PigqY3VycmVudFJlbmRlcmVyKS5jb250aW51YXRpb24oKSkKKyAgICAgICAgICAgIGlmIChhdXRv
KiBjb250aW51YXRpb24gPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJCbG9jaz4oKmN1cnJlbnRS
ZW5kZXJlcikuY29udGludWF0aW9uKCkpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLT5n
ZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7CiAgICAgICAgIH0KICAg
ICB9Ci0gICAgCi0gICAgLy8gYmFpbCBpZiBub25lIGZvdW5kCisKKyAgICAvLyBCYWlsIGlmIG5v
bmUgZm91bmQuCiAgICAgaWYgKCFjdXJyZW50UmVuZGVyZXIpCiAgICAgICAgIHJldHVybiBudWxs
cHRyOwotICAgIAotICAgIC8vIHNlYXJjaCB1cCB0aGUgRE9NIHRyZWUgZm9yIGFuIGFuY2hvciBl
bGVtZW50Ci0gICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgYW55IG5vbi1pbWFnZSB3aXRo
IGFuIGFuY2hvciBpcyBhbiBIVE1MQW5jaG9yRWxlbWVudAotICAgIGZvciAoTm9kZSogbm9kZSA9
IGN1cnJlbnRSZW5kZXJlci0+bm9kZSgpOyBub2RlOyBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgp
KSB7Ci0gICAgICAgIGlmIChpczxIVE1MQW5jaG9yRWxlbWVudD4oKm5vZGUpIHx8IChub2RlLT5y
ZW5kZXJlcigpICYmIGNhY2hlLT5nZXRPckNyZWF0ZShub2RlLT5yZW5kZXJlcigpKS0+aXNMaW5r
KCkpKQotICAgICAgICAgICAgcmV0dXJuIGRvd25jYXN0PEVsZW1lbnQ+KG5vZGUpOworCisgICAg
Ly8gU2VhcmNoIHVwIHRoZSBET00gdHJlZSBmb3IgYW4gYW5jaG9yIGVsZW1lbnQuCisgICAgLy8g
Tk9URTogdGhpcyBhc3N1bWVzIHRoYXQgYW55IG5vbi1pbWFnZSB3aXRoIGFuIGFuY2hvciBpcyBh
biBIVE1MQW5jaG9yRWxlbWVudC4KKyAgICBmb3IgKFJlZlB0ciBub2RlID0gY3VycmVudFJlbmRl
cmVyLT5ub2RlKCk7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkpIHsKKyAgICAgICAg
aWYgKGF1dG8qIGFuY2hvciA9IGR5bmFtaWNEb3duY2FzdDxIVE1MQW5jaG9yRWxlbWVudD4obm9k
ZS5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gYW5jaG9yOworCisgICAgICAgIGF1dG8qIG9i
amVjdCA9IGNhY2hlID8gY2FjaGUtPmdldE9yQ3JlYXRlKG5vZGUtPnJlbmRlcmVyKCkpIDogbnVs
bHB0cjsKKyAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QtPmlzTGluaygpKQorICAgICAgICAg
ICAgcmV0dXJuIGR5bmFtaWNEb3duY2FzdDxFbGVtZW50Pigqbm9kZSk7CiAgICAgfQotICAgIAor
CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKQEAgLTY1NCw5ICs2NjYsOSBAQCBTdHJpbmcgQWNj
ZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6dGV4dFVuZGVyRWxlbWVudChBY2Nlc3NpYmlsaXR5VGV4
dFVuZGVyRWxlbWVudAogICAgIGlmICghbV9yZW5kZXJlcikKICAgICAgICAgcmV0dXJuIEFjY2Vz
c2liaWxpdHlOb2RlT2JqZWN0Ojp0ZXh0VW5kZXJFbGVtZW50KG1vZGUpOwogCi0gICAgaWYgKGlz
PFJlbmRlckZpbGVVcGxvYWRDb250cm9sPigqbV9yZW5kZXJlcikpCi0gICAgICAgIHJldHVybiBk
b3duY2FzdDxSZW5kZXJGaWxlVXBsb2FkQ29udHJvbD4oKm1fcmVuZGVyZXIpLmJ1dHRvblZhbHVl
KCk7Ci0gICAgCisgICAgaWYgKGF1dG8qIGZpbGVVcGxvYWQgPSBkeW5hbWljRG93bmNhc3Q8UmVu
ZGVyRmlsZVVwbG9hZENvbnRyb2w+KCptX3JlbmRlcmVyKSkKKyAgICAgICAgcmV0dXJuIGZpbGVV
cGxvYWQtPmJ1dHRvblZhbHVlKCk7CisKICAgICAvLyBSZWZsZWN0IHdoZW4gYSBjb250ZW50IGF1
dGhvciBoYXMgZXhwbGljaXRseSBtYXJrZWQgYSBsaW5lIGJyZWFrLgogICAgIGlmIChtX3JlbmRl
cmVyLT5pc0JSKCkpCiAgICAgICAgIHJldHVybiAiXG4iX3M7CkBAIC02OTcsMjQgKzcwOSwyMiBA
QCBTdHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6dGV4dFVuZGVyRWxlbWVudChBY2Nl
c3NpYmlsaXR5VGV4dFVuZGVyRWxlbWVudAogICAgICAgICAgICAgICAgIHJldHVybiBwbGFpblRl
eHQoKnRleHRSYW5nZSwgdGV4dEl0ZXJhdG9yQmVoYXZpb3JGb3JUZXh0UmFuZ2UoKSk7CiAgICAg
ICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICAvLyBTb21ldGltZXMgdGV4dCBm
cmFnbWVudHMgZG9uJ3QgaGF2ZSBOb2RlcyBhc3NvY2lhdGVkIHdpdGggdGhlbSAobGlrZSB3aGVu
CiAgICAgICAgIC8vIENTUyBjb250ZW50IGlzIHVzZWQgdG8gaW5zZXJ0IHRleHQgb3Igd2hlbiBh
IFJlbmRlckNvdW50ZXIgaXMgdXNlZC4pCi0gICAgICAgIGlmIChpczxSZW5kZXJUZXh0PigqbV9y
ZW5kZXJlcikpIHsKLSAgICAgICAgICAgIFJlbmRlclRleHQmIHJlbmRlclRleHRPYmplY3QgPSBk
b3duY2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcik7Ci0gICAgICAgICAgICBpZiAoaXM8UmVu
ZGVyVGV4dEZyYWdtZW50PihyZW5kZXJUZXh0T2JqZWN0KSkgewotICAgICAgICAgICAgICAgIFJl
bmRlclRleHRGcmFnbWVudCYgcmVuZGVyVGV4dEZyYWdtZW50ID0gZG93bmNhc3Q8UmVuZGVyVGV4
dEZyYWdtZW50PihyZW5kZXJUZXh0T2JqZWN0KTsKKyAgICAgICAgaWYgKFdlYWtQdHIgcmVuZGVy
VGV4dCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcikpIHsKKyAgICAg
ICAgICAgIGlmIChXZWFrUHRyIHJlbmRlclRleHRGcmFnbWVudCA9IGR5bmFtaWNEb3duY2FzdDxS
ZW5kZXJUZXh0RnJhZ21lbnQ+KCpyZW5kZXJUZXh0KSkgewogICAgICAgICAgICAgICAgIC8vIFRo
ZSBhbHQgYXR0cmlidXRlIG1heSBiZSBzZXQgb24gYSB0ZXh0IGZyYWdtZW50IHRocm91Z2ggQ1NT
LCB3aGljaCBzaG91bGQgYmUgaG9ub3JlZC4KLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcm
IGFsdFRleHQgPSByZW5kZXJUZXh0RnJhZ21lbnQuYWx0VGV4dCgpOworICAgICAgICAgICAgICAg
IGNvbnN0IGF1dG8mIGFsdFRleHQgPSByZW5kZXJUZXh0RnJhZ21lbnQtPmFsdFRleHQoKTsKICAg
ICAgICAgICAgICAgICBpZiAoIWFsdFRleHQuaXNFbXB0eSgpKQogICAgICAgICAgICAgICAgICAg
ICByZXR1cm4gYWx0VGV4dDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyVGV4dEZyYWdt
ZW50LmNvbnRlbnRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyVGV4dEZy
YWdtZW50ID8gcmVuZGVyVGV4dEZyYWdtZW50LT5jb250ZW50U3RyaW5nKCkgOiBTdHJpbmcoKTsK
ICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRleHRPYmplY3QudGV4
dCgpOworICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRleHQgPyByZW5kZXJUZXh0LT50ZXh0KCkg
OiBTdHJpbmcoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBBY2Nlc3Np
YmlsaXR5Tm9kZU9iamVjdDo6dGV4dFVuZGVyRWxlbWVudChtb2RlKTsKIH0KIApAQCAtODIzLDQ2
ICs4MzMsNDUgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpvZmZzZXRCb3VuZGlu
Z0JveEZvclJlbW90ZVNWR0VsZW1lbnQoTGF5b3V0UmVjdCYKICAgICAgICAgfQogICAgIH0KIH0K
LSAgICAKKwogTGF5b3V0UmVjdCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpib3VuZGluZ0Jv
eFJlY3QoKSBjb25zdAogewotICAgIFJlbmRlck9iamVjdCogb2JqID0gcmVuZGVyZXIoKTsKLSAg
ICAKLSAgICBpZiAoIW9iaikKKyAgICBXZWFrUHRyIHJlbmRlcmVyID0gdGhpcy0+cmVuZGVyZXIo
KTsKKyAgICBpZiAoIXJlbmRlcmVyKQogICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eU5vZGVP
YmplY3Q6OmJvdW5kaW5nQm94UmVjdCgpOwotICAgIAotICAgIGlmIChvYmotPm5vZGUoKSkgLy8g
SWYgd2UgYXJlIGEgY29udGludWF0aW9uLCB3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0byB1c2UgdGhl
IHByaW1hcnkgcmVuZGVyZXIuCi0gICAgICAgIG9iaiA9IG9iai0+bm9kZSgpLT5yZW5kZXJlcigp
OwotICAgIAorCisgICAgaWYgKHJlbmRlcmVyLT5ub2RlKCkpIC8vIElmIHdlIGFyZSBhIGNvbnRp
bnVhdGlvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gdXNlIHRoZSBwcmltYXJ5IHJlbmRlcmVy
LgorICAgICAgICByZW5kZXJlciA9IHJlbmRlcmVyLT5ub2RlKCktPnJlbmRlcmVyKCk7CisKICAg
ICAvLyBhYnNvbHV0ZUZvY3VzUmluZ1F1YWRzIHdpbGwgcXVlcnkgdGhlIGhpZXJhcmNoeSBiZWxv
dyB0aGlzIGVsZW1lbnQsIHdoaWNoIGZvciBsYXJnZSB3ZWJwYWdlcyBjYW4gYmUgdmVyeSBzbG93
LgogICAgIC8vIEZvciBhIHdlYiBhcmVhLCB3aGljaCB3aWxsIGhhdmUgdGhlIG1vc3QgZWxlbWVu
dHMgb2YgYW55IGVsZW1lbnQsIGFic29sdXRlUXVhZHMgc2hvdWxkIGJlIHVzZWQuCiAgICAgLy8g
V2Ugc2hvdWxkIGFsc28gdXNlIGFic29sdXRlUXVhZHMgZm9yIFNWRyBlbGVtZW50cywgb3RoZXJ3
aXNlIHRyYW5zZm9ybXMgd29uJ3QgYmUgYXBwbGllZC4KICAgICBWZWN0b3I8RmxvYXRRdWFkPiBx
dWFkczsKICAgICBib29sIGlzU1ZHUm9vdCA9IGZhbHNlOwogCi0gICAgaWYgKG9iai0+aXNSZW5k
ZXJPckxlZ2FjeVJlbmRlclNWR1Jvb3QoKSkKKyAgICBpZiAocmVuZGVyZXItPmlzUmVuZGVyT3JM
ZWdhY3lSZW5kZXJTVkdSb290KCkpCiAgICAgICAgIGlzU1ZHUm9vdCA9IHRydWU7CiAKLSAgICBp
ZiAoaXM8UmVuZGVyVGV4dD4oKm9iaikpCi0gICAgICAgIHF1YWRzID0gZG93bmNhc3Q8UmVuZGVy
VGV4dD4oKm9iaikuYWJzb2x1dGVRdWFkc0NsaXBwZWRUb0VsbGlwc2lzKCk7CisgICAgaWYgKGF1
dG8qIHJlbmRlclRleHQgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyVGV4dD4oKnJlbmRlcmVyKSkK
KyAgICAgICAgcXVhZHMgPSByZW5kZXJUZXh0LT5hYnNvbHV0ZVF1YWRzQ2xpcHBlZFRvRWxsaXBz
aXMoKTsKICAgICBlbHNlIGlmIChpc1dlYkFyZWEoKSB8fCBpc1NWR1Jvb3QpCi0gICAgICAgIG9i
ai0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7CisgICAgICAgIHJlbmRlcmVyLT5hYnNvbHV0ZVF1YWRz
KHF1YWRzKTsKICAgICBlbHNlCi0gICAgICAgIG9iai0+YWJzb2x1dGVGb2N1c1JpbmdRdWFkcyhx
dWFkcyk7Ci0gICAgCi0gICAgTGF5b3V0UmVjdCByZXN1bHQgPSBib3VuZGluZ0JveEZvclF1YWRz
KG9iaiwgcXVhZHMpOworICAgICAgICByZW5kZXJlci0+YWJzb2x1dGVGb2N1c1JpbmdRdWFkcyhx
dWFkcyk7CisKKyAgICBMYXlvdXRSZWN0IHJlc3VsdCA9IGJvdW5kaW5nQm94Rm9yUXVhZHMocmVu
ZGVyZXIuZ2V0KCksIHF1YWRzKTsKIAogICAgIERvY3VtZW50KiBkb2N1bWVudCA9IHRoaXMtPmRv
Y3VtZW50KCk7CiAgICAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LT5pc1NWR0RvY3VtZW50KCkp
CiAgICAgICAgIG9mZnNldEJvdW5kaW5nQm94Rm9yUmVtb3RlU1ZHRWxlbWVudChyZXN1bHQpOwot
ICAgIAorCiAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHdlYiBhcmVhIHNob3VsZCBiZSB0aGUgY29u
dGVudCBzaXplLCBub3QgdGhlIGNsaXBwZWQgc2l6ZS4KICAgICBpZiAoaXNXZWJBcmVhKCkpCi0g
ICAgICAgIHJlc3VsdC5zZXRTaXplKG9iai0+dmlldygpLmZyYW1lVmlldygpLmNvbnRlbnRzU2l6
ZSgpKTsKLSAgICAKKyAgICAgICAgcmVzdWx0LnNldFNpemUocmVuZGVyZXItPnZpZXcoKS5mcmFt
ZVZpZXcoKS5jb250ZW50c1NpemUoKSk7CisKICAgICByZXR1cm4gcmVzdWx0OwogfQotICAgIAor
CiBib29sIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnN1cHBvcnRzUGF0aCgpIGNvbnN0CiB7
CiAgICAgcmV0dXJuIGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKCkpIHx8IChyZW5kZXJlcigpICYm
IHJlbmRlcmVyKCktPmlzUmVuZGVyT3JMZWdhY3lSZW5kZXJTVkdTaGFwZSgpKTsKQEAgLTg3MCwx
MiArODc5LDE1IEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c3VwcG9ydHNQYXRo
KCkgY29uc3QKIAogUGF0aCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjplbGVtZW50UGF0aCgp
IGNvbnN0CiB7Ci0gICAgaWYgKGlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKCkpKSB7CisgICAgaWYg
KCFtX3JlbmRlcmVyKQorICAgICAgICByZXR1cm4gQWNjZXNzaWJpbGl0eU5vZGVPYmplY3Q6OmVs
ZW1lbnRQYXRoKCk7CisKKyAgICBpZiAoYXV0byogcmVuZGVyVGV4dCA9IGR5bmFtaWNEb3duY2Fz
dDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcikpIHsKICAgICAgICAgVmVjdG9yPExheW91dFJlY3Q+
IHJlY3RzOwotICAgICAgICBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcikuYm91bmRp
bmdSZWN0cyhyZWN0cywgZmxvb3JlZExheW91dFBvaW50KG1fcmVuZGVyZXItPmxvY2FsVG9BYnNv
bHV0ZSgpKSk7CisgICAgICAgIHJlbmRlclRleHQtPmJvdW5kaW5nUmVjdHMocmVjdHMsIGZsb29y
ZWRMYXlvdXRQb2ludChtX3JlbmRlcmVyLT5sb2NhbFRvQWJzb2x1dGUoKSkpOwogICAgICAgICAv
LyBJZiBvbmx5IDEgcmVjdCwgZG9uJ3QgY29tcHV0ZSBwYXRoIHNpbmNlIHRoZSBib3VuZGluZyBy
ZWN0IHdpbGwgYmUgZ29vZCBlbm91Z2guCiAgICAgICAgIGlmIChyZWN0cy5zaXplKCkgPCAyKQot
ICAgICAgICAgICAgcmV0dXJuIFBhdGgoKTsKKyAgICAgICAgICAgIHJldHVybiB7IH07CiAKICAg
ICAgICAgLy8gQ29tcHV0ZSB0aGUgcGF0aCBvbmx5IGlmIHRoaXMgaXMgdGhlIGxhc3QgcGFydCBv
ZiBhIGxpbmUgZm9sbG93ZWQgYnkgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lLgogICAg
ICAgICBjb25zdCBhdXRvJiBzdHlsZSA9IG1fcmVuZGVyZXItPnN0eWxlKCk7CkBAIC04OTUsNyAr
OTA3LDcgQEAgUGF0aCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjplbGVtZW50UGF0aCgpIGNv
bnN0CiAgICAgICAgICAgICB1bmlvblJlY3QudW5pdGUocmVjdHNbaV0pOwogICAgICAgICB9CiAg
ICAgICAgIGlmICghbmVlZHNQYXRoKQotICAgICAgICAgICAgcmV0dXJuIFBhdGgoKTsKKyAgICAg
ICAgICAgIHJldHVybiB7IH07CiAKICAgICAgICAgZmxvYXQgb3V0bGluZU9mZnNldCA9IHN0eWxl
Lm91dGxpbmVPZmZzZXQoKTsKICAgICAgICAgZmxvYXQgZGV2aWNlU2NhbGVGYWN0b3IgPSBtX3Jl
bmRlcmVyLT5kb2N1bWVudCgpLmRldmljZVNjYWxlRmFjdG9yKCk7CkBAIC05MDgsOCArOTIwLDgg
QEAgUGF0aCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjplbGVtZW50UGF0aCgpIGNvbnN0CiAg
ICAgICAgIHJldHVybiBQYXRoVXRpbGl0aWVzOjpwYXRoV2l0aFNocmlua1dyYXBwZWRSZWN0cyhw
aXhlbFNuYXBwZWRSZWN0cywgMCk7CiAgICAgfQogCi0gICAgaWYgKGlzPExlZ2FjeVJlbmRlclNW
R1NoYXBlPihyZW5kZXJlcigpKSAmJiBkb3duY2FzdDxMZWdhY3lSZW5kZXJTVkdTaGFwZT4oKm1f
cmVuZGVyZXIpLmhhc1BhdGgoKSkgewotICAgICAgICBQYXRoIHBhdGggPSBkb3duY2FzdDxMZWdh
Y3lSZW5kZXJTVkdTaGFwZT4oKm1fcmVuZGVyZXIpLnBhdGgoKTsKKyAgICBpZiAoYXV0byogcmVu
ZGVyU1ZHU2hhcGUgPSBkeW5hbWljRG93bmNhc3Q8TGVnYWN5UmVuZGVyU1ZHU2hhcGU+KCptX3Jl
bmRlcmVyKTsgcmVuZGVyU1ZHU2hhcGUgJiYgcmVuZGVyU1ZHU2hhcGUtPmhhc1BhdGgoKSkgewor
ICAgICAgICBQYXRoIHBhdGggPSByZW5kZXJTVkdTaGFwZS0+cGF0aCgpOwogCiAgICAgICAgIGF1
dG8qIGNhY2hlID0gYXhPYmplY3RDYWNoZSgpOwogICAgICAgICBpZiAoIWNhY2hlKQpAQCAtOTI1
LDggKzkzNyw4IEBAIFBhdGggQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZWxlbWVudFBhdGgo
KSBjb25zdAogICAgIH0KIAogI2lmIEVOQUJMRShMQVlFUl9CQVNFRF9TVkdfRU5HSU5FKQotICAg
IGlmIChpczxSZW5kZXJTVkdTaGFwZT4ocmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8UmVuZGVyU1ZH
U2hhcGU+KCptX3JlbmRlcmVyKS5oYXNQYXRoKCkpIHsKLSAgICAgICAgUGF0aCBwYXRoID0gZG93
bmNhc3Q8UmVuZGVyU1ZHU2hhcGU+KCptX3JlbmRlcmVyKS5wYXRoKCk7CisgICAgaWYgKGF1dG8q
IHJlbmRlclNWR1NoYXBlID0gZHluYW1pY0Rvd25jYXN0PFJlbmRlclNWR1NoYXBlPigqbV9yZW5k
ZXJlcik7IHJlbmRlclNWR1NoYXBlICYmIHJlbmRlclNWR1NoYXBlLT5oYXNQYXRoKCkpIHsKKyAg
ICAgICAgUGF0aCBwYXRoID0gcmVuZGVyU1ZHU2hhcGUtPnBhdGgoKTsKIAogICAgICAgICBhdXRv
KiBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUoKTsKICAgICAgICAgaWYgKCFjYWNoZSkKQEAgLTk0MSw3
ICs5NTMsNyBAQCBQYXRoIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmVsZW1lbnRQYXRoKCkg
Y29uc3QKICAgICB9CiAjZW5kaWYKIAotICAgIHJldHVybiBQYXRoKCk7CisgICAgcmV0dXJuIHsg
fTsKIH0KIAogI2lmIEVOQUJMRShBUFBMRV9QQVkpCkBAIC0xMjAzLDcgKzEyMTUsNyBAQCBib29s
IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmNvbXB1dGVBY2Nlc3NpYmlsaXR5SXNJZ25vcmVk
KCkgY29uc3QKIAogICAgICAgICAvLyB3ZWJraXQub3JnL2IvMTczODcwIC0gSWYgYW4gaW1hZ2Ug
aGFzIG90aGVyIGFsdGVybmF0aXZlIHRleHQsIGRvbid0IGlnbm9yZSBpdCBpZiBhbHQgdGV4dCBp
cyBlbXB0eS4KICAgICAgICAgLy8gVGhpcyBtZWFucyB3ZSBzaG91bGQgcHJvY2VzcyB0aXRsZSBh
bmQgYXJpYS1sYWJlbCBmaXJzdC4KLSAgICAgICAgCisKICAgICAgICAgLy8gSWYgYW4gaW1hZ2Ug
aGFzIHRoZSB0aXRsZSBvciBsYWJlbCBhdHRyaWJ1dGVzLCBhY2Nlc3NpYmlsaXR5IHNob3VsZCBi
ZSBsZW5pZW50IGFuZCBhbGxvdyBpdCB0byBhcHBlYXIgaW4gdGhlIGhpZXJhcmNoeSAoYWNjb3Jk
aW5nIHRvIFdBSS1BUklBKS4KICAgICAgICAgaWYgKCFnZXRBdHRyaWJ1dGUodGl0bGVBdHRyKS5p
c0VtcHR5KCkgfHwgIWdldEF0dHJpYnV0ZShhcmlhX2xhYmVsQXR0cikuaXNFbXB0eSgpKQogICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTIxMSw5ICsxMjIzLDkgQEAgYm9vbCBBY2Nlc3Np
YmlsaXR5UmVuZGVyT2JqZWN0Ojpjb21wdXRlQWNjZXNzaWJpbGl0eUlzSWdub3JlZCgpIGNvbnN0
CiAgICAgICAgIC8vIEZpcnN0IGNoZWNrIHRoZSBSZW5kZXJJbWFnZSdzIGFsdFRleHQgKHdoaWNo
IGNhbiBiZSBzZXQgdGhyb3VnaCBhIHN0eWxlIHNoZWV0LCBvciBjb21lIGZyb20gdGhlIEVsZW1l
bnQpLgogICAgICAgICAvLyBIb3dldmVyLCBpZiB0aGlzIGlzIG5vdCBhIG5hdGl2ZSBpbWFnZSwg
ZmFsbGJhY2sgdG8gdGhlIGF0dHJpYnV0ZSBvbiB0aGUgRWxlbWVudC4KICAgICAgICAgQWNjZXNz
aWJpbGl0eU9iamVjdEluY2x1c2lvbiBhbHRUZXh0SW5jbHVzaW9uID0gQWNjZXNzaWJpbGl0eU9i
amVjdEluY2x1c2lvbjo6RGVmYXVsdEJlaGF2aW9yOwotICAgICAgICBib29sIGlzUmVuZGVySW1h
Z2UgPSBpczxSZW5kZXJJbWFnZT4ocmVuZGVyZXIoKSk7Ci0gICAgICAgIGlmIChpc1JlbmRlcklt
YWdlKQotICAgICAgICAgICAgYWx0VGV4dEluY2x1c2lvbiA9IG9iamVjdEluY2x1c2lvbkZyb21B
bHRUZXh0KGRvd25jYXN0PFJlbmRlckltYWdlPigqbV9yZW5kZXJlcikuYWx0VGV4dCgpKTsKKyAg
ICAgICAgV2Vha1B0ciBpbWFnZSA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJJbWFnZT4oKm1fcmVu
ZGVyZXIpOworICAgICAgICBpZiAoaW1hZ2UpCisgICAgICAgICAgICBhbHRUZXh0SW5jbHVzaW9u
ID0gb2JqZWN0SW5jbHVzaW9uRnJvbUFsdFRleHQoaW1hZ2UtPmFsdFRleHQoKSk7CiAgICAgICAg
IGVsc2UKICAgICAgICAgICAgIGFsdFRleHRJbmNsdXNpb24gPSBvYmplY3RJbmNsdXNpb25Gcm9t
QWx0VGV4dChnZXRBdHRyaWJ1dGUoYWx0QXR0cikuc3RyaW5nKCkpOwogCkBAIC0xMjIyLDE1ICsx
MjM0LDE0IEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6Y29tcHV0ZUFjY2Vzc2li
aWxpdHlJc0lnbm9yZWQoKSBjb25zdAogICAgICAgICBpZiAoYWx0VGV4dEluY2x1c2lvbiA9PSBB
Y2Nlc3NpYmlsaXR5T2JqZWN0SW5jbHVzaW9uOjpJbmNsdWRlT2JqZWN0KQogICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGlmIChpc1JlbmRlckltYWdlKSB7CisgICAgICAgIGlm
IChpbWFnZSkgewogICAgICAgICAgICAgLy8gY2hlY2sgZm9yIG9uZS1kaW1lbnNpb25hbCBpbWFn
ZQotICAgICAgICAgICAgUmVuZGVySW1hZ2UmIGltYWdlID0gZG93bmNhc3Q8UmVuZGVySW1hZ2U+
KCptX3JlbmRlcmVyKTsKLSAgICAgICAgICAgIGlmIChpbWFnZS5oZWlnaHQoKSA8PSAxIHx8IGlt
YWdlLndpZHRoKCkgPD0gMSkKKyAgICAgICAgICAgIGlmIChpbWFnZS0+aGVpZ2h0KCkgPD0gMSB8
fCBpbWFnZS0+d2lkdGgoKSA8PSAxKQogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogCiAg
ICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHJlbmRlcmVkIGltYWdlIHdhcyBzdHJldGNoZWQg
ZnJvbSBvbmUtZGltZW5zaW9uYWwgZmlsZSBpbWFnZQotICAgICAgICAgICAgaWYgKGltYWdlLmNh
Y2hlZEltYWdlKCkpIHsKLSAgICAgICAgICAgICAgICBMYXlvdXRTaXplIGltYWdlU2l6ZSA9IGlt
YWdlLmNhY2hlZEltYWdlKCktPmltYWdlU2l6ZUZvclJlbmRlcmVyKCZpbWFnZSwgaW1hZ2Uudmll
dygpLnpvb21GYWN0b3IoKSk7CisgICAgICAgICAgICBpZiAoaW1hZ2UtPmNhY2hlZEltYWdlKCkp
IHsKKyAgICAgICAgICAgICAgICBMYXlvdXRTaXplIGltYWdlU2l6ZSA9IGltYWdlLT5jYWNoZWRJ
bWFnZSgpLT5pbWFnZVNpemVGb3JSZW5kZXJlcihpbWFnZS5nZXQoKSwgaW1hZ2UtPnZpZXcoKS56
b29tRmFjdG9yKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBpbWFnZVNpemUuaGVpZ2h0KCkg
PD0gMSB8fCBpbWFnZVNpemUud2lkdGgoKSA8PSAxOwogICAgICAgICAgICAgfQogICAgICAgICB9
CkBAIC0xMjczLDE3ICsxMjg0LDE3IEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6
Y29tcHV0ZUFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSBjb25zdAogICAgIGlmIChpc01hdGhFbGVt
ZW50KCkpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICNlbmRpZgotICAgIAotICAgIGlmIChpczxS
ZW5kZXJCbG9ja0Zsb3c+KCptX3JlbmRlcmVyKSAmJiBtX3JlbmRlcmVyLT5jaGlsZHJlbklubGlu
ZSgpICYmICFjYW5TZXRGb2N1c0F0dHJpYnV0ZSgpKQotICAgICAgICByZXR1cm4gIWRvd25jYXN0
PFJlbmRlckJsb2NrRmxvdz4oKm1fcmVuZGVyZXIpLmhhc0xpbmVzKCkgJiYgIW1vdXNlQnV0dG9u
TGlzdGVuZXIoKTsKLSAgICAKKworICAgIFdlYWtQdHIgYmxvY2tGbG93ID0gZHluYW1pY0Rvd25j
YXN0PFJlbmRlckJsb2NrRmxvdz4oKm1fcmVuZGVyZXIpOworICAgIGlmIChibG9ja0Zsb3cgJiYg
bV9yZW5kZXJlci0+Y2hpbGRyZW5JbmxpbmUoKSAmJiAhY2FuU2V0Rm9jdXNBdHRyaWJ1dGUoKSkK
KyAgICAgICAgcmV0dXJuICFibG9ja0Zsb3ctPmhhc0xpbmVzKCkgJiYgIW1vdXNlQnV0dG9uTGlz
dGVuZXIoKTsKKwogICAgIGlmIChpc0NhbnZhcygpKSB7CiAgICAgICAgIGlmIChjYW52YXNIYXNG
YWxsYmFja0NvbnRlbnQoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBp
ZiAoaXM8UmVuZGVyQm94PigqbV9yZW5kZXJlcikpIHsKLSAgICAgICAgICAgIGF1dG8mIGNhbnZh
c0JveCA9IGRvd25jYXN0PFJlbmRlckJveD4oKm1fcmVuZGVyZXIpOwotICAgICAgICAgICAgaWYg
KGNhbnZhc0JveC5oZWlnaHQoKSA8PSAxIHx8IGNhbnZhc0JveC53aWR0aCgpIDw9IDEpCisgICAg
ICAgIGlmIChXZWFrUHRyIGNhbnZhc0JveCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJCb3g+KCpt
X3JlbmRlcmVyKSkgeworICAgICAgICAgICAgaWYgKGNhbnZhc0JveC0+aGVpZ2h0KCkgPD0gMSB8
fCBjYW52YXNCb3gtPndpZHRoKCkgPD0gMSkKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
ICAgICAgICAgfQogICAgICAgICAvLyBPdGhlcndpc2UgZmFsbCB0aHJvdWdoOyB1c2UgcHJlc2Vu
Y2Ugb2YgaGVscCB0ZXh0LCB0aXRsZSwgb3IgZGVzY3JpcHRpb24gdG8gZGVjaWRlLgpAQCAtMTM1
Nyw5ICsxMzY4LDggQEAgYm9vbCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpjb21wdXRlQWNj
ZXNzaWJpbGl0eUlzSWdub3JlZCgpIGNvbnN0CiAKIGludCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0OjpsYXlvdXRDb3VudCgpIGNvbnN0CiB7Ci0gICAgaWYgKCFtX3JlbmRlcmVyIHx8ICFpczxS
ZW5kZXJWaWV3PigqbV9yZW5kZXJlcikpCi0gICAgICAgIHJldHVybiAwOwotICAgIHJldHVybiBk
b3duY2FzdDxSZW5kZXJWaWV3PigqbV9yZW5kZXJlcikuZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4
dCgpLmxheW91dENvdW50KCk7CisgICAgYXV0byogdmlldyA9IGR5bmFtaWNEb3duY2FzdDxSZW5k
ZXJWaWV3PihtX3JlbmRlcmVyLmdldCgpKTsKKyAgICByZXR1cm4gdmlldyA/IHZpZXctPmZyYW1l
VmlldygpLmxheW91dENvbnRleHQoKS5sYXlvdXRDb3VudCgpIDogMDsKIH0KIAogQ2hhcmFjdGVy
UmFuZ2UgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZG9jdW1lbnRCYXNlZFNlbGVjdGVkVGV4
dFJhbmdlKCkgY29uc3QKQEAgLTEzODMsMTIgKzEzOTMsMTIgQEAgU3RyaW5nIEFjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3Q6OnNlbGVjdGVkVGV4dCgpIGNvbnN0CiAgICAgCiAgICAgaWYgKGlzU2Vj
dXJlRmllbGQoKSkKICAgICAgICAgcmV0dXJuIFN0cmluZygpOyAvLyBuZWVkIHRvIHJldHVybiBz
b21ldGhpbmcgZGlzdGluY3QgZnJvbSBlbXB0eSBzdHJpbmcKLSAgICAKKwogICAgIGlmIChpc05h
dGl2ZVRleHRDb250cm9sKCkpIHsKLSAgICAgICAgSFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQm
IHRleHRDb250cm9sID0gZG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50
ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7CisgICAgICAgIGF1dG8mIHRleHRDb250cm9sID0gdW5j
aGVja2VkRG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNv
bnRyb2xFbGVtZW50KCk7CiAgICAgICAgIHJldHVybiB0ZXh0Q29udHJvbC5zZWxlY3RlZFRleHQo
KTsKICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gZG9BWFN0cmluZ0ZvclJhbmdlKGRvY3VtZW50
QmFzZWRTZWxlY3RlZFRleHRSYW5nZSgpKTsKIH0KIApAQCAtMTQwMSw3ICsxNDExLDcgQEAgQ2hh
cmFjdGVyUmFuZ2UgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c2VsZWN0ZWRUZXh0UmFuZ2Uo
KSBjb25zdAogCiAgICAgLy8gVXNlIHRoZSB0ZXh0IGNvbnRyb2wgbmF0aXZlIHJhbmdlIGlmIGl0
J3MgYSBuYXRpdmUgb2JqZWN0LgogICAgIGlmIChpc05hdGl2ZVRleHRDb250cm9sKCkpIHsKLSAg
ICAgICAgYXV0byYgdGV4dENvbnRyb2wgPSBkb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1f
cmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKKyAgICAgICAgYXV0byYgdGV4dENv
bnRyb2wgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVyZXIp
LnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKICAgICAgICAgcmV0dXJuIHsgdGV4dENvbnRyb2wu
c2VsZWN0aW9uU3RhcnQoKSwgdGV4dENvbnRyb2wuc2VsZWN0aW9uRW5kKCkgLSB0ZXh0Q29udHJv
bC5zZWxlY3Rpb25TdGFydCgpIH07CiAgICAgfQogCkBAIC0xNDc2LDcgKzE0ODYsNyBAQCBpbnQg
QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6aW5zZXJ0aW9uUG9pbnRMaW5lTnVtYmVyKCkgY29u
c3QKIAogICAgIC8vIFVzZSB0aGUgdGV4dCBjb250cm9sIG5hdGl2ZSByYW5nZSBpZiBpdCdzIGEg
bmF0aXZlIG9iamVjdC4KICAgICBpZiAoaXNOYXRpdmVUZXh0Q29udHJvbCgpKSB7Ci0gICAgICAg
IGF1dG8mIHRleHRDb250cm9sID0gZG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRl
cmVyKS50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7CisgICAgICAgIGF1dG8mIHRleHRDb250cm9s
ID0gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0
Rm9ybUNvbnRyb2xFbGVtZW50KCk7CiAgICAgICAgIGludCBzdGFydCA9IHRleHRDb250cm9sLnNl
bGVjdGlvblN0YXJ0KCk7CiAgICAgICAgIGludCBlbmQgPSB0ZXh0Q29udHJvbC5zZWxlY3Rpb25F
bmQoKTsKIApAQCAtMTUyNiw3ICsxNTM2LDcgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0OjpzZXRTZWxlY3RlZFRleHRSYW5nZShDaGFyYWN0ZXJSYW5nZSYmIHJhbmdlKQogICAgICAg
ICBjbGllbnQtPndpbGxDaGFuZ2VTZWxlY3Rpb25Gb3JBY2Nlc3NpYmlsaXR5KCk7CiAKICAgICBp
ZiAoaXNOYXRpdmVUZXh0Q29udHJvbCgpKSB7Ci0gICAgICAgIEhUTUxUZXh0Rm9ybUNvbnRyb2xF
bGVtZW50JiB0ZXh0Q29udHJvbCA9IGRvd25jYXN0PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5k
ZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpOworICAgICAgICBhdXRvJiB0ZXh0Q29udHJv
bCA9IHVuY2hlY2tlZERvd25jYXN0PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5kZXJlcikudGV4
dEZvcm1Db250cm9sRWxlbWVudCgpOwogICAgICAgICB0ZXh0Q29udHJvbC5zZXRTZWxlY3Rpb25S
YW5nZShyYW5nZS5sb2NhdGlvbiwgcmFuZ2UubG9jYXRpb24gKyByYW5nZS5sZW5ndGgpOwogICAg
IH0gZWxzZSBpZiAobV9yZW5kZXJlcikgewogICAgICAgICBBU1NFUlQobm9kZSgpKTsKQEAgLTE2
NDksOCArMTY1OSw4IEBAIEFYQ29yZU9iamVjdDo6QWNjZXNzaWJpbGl0eUNoaWxkcmVuVmVjdG9y
IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmRvY3VtZW50TGluCiAgICAgICAgICAgICAgICAg
fSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY291bGRuJ3QgcmV0cmlldmUgdGhl
IGFscmVhZHkgZXhpc3RpbmcgaW1hZ2UtbWFwIGxpbmtzIGZyb20gdGhlIHBhcmVudCBpbWFnZSwg
c28gY3JlYXRlIGEgbmV3IG9uZS4KICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05PVF9SRUFD
SEVEKCJVbmV4cGVjdGVkbHkgbWlzc2luZyBpbWFnZS1tYXAgbGluayBwYXJlbnQgQVggb2JqZWN0
LiIpOwotICAgICAgICAgICAgICAgICAgICBhdXRvJiBhcmVhT2JqZWN0ID0gZG93bmNhc3Q8QWNj
ZXNzaWJpbGl0eUltYWdlTWFwTGluaz4oKmF4T2JqZWN0Q2FjaGUoKS0+Y3JlYXRlKEFjY2Vzc2li
aWxpdHlSb2xlOjpJbWFnZU1hcExpbmspKTsKLSAgICAgICAgICAgICAgICAgICAgYXJlYU9iamVj
dC5zZXRIVE1MQXJlYUVsZW1lbnQoZG93bmNhc3Q8SFRNTEFyZWFFbGVtZW50PihjdXJyZW50KSk7
CisgICAgICAgICAgICAgICAgICAgIGF1dG8mIGFyZWFPYmplY3QgPSB1bmNoZWNrZWREb3duY2Fz
dDxBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rPigqYXhPYmplY3RDYWNoZSgpLT5jcmVhdGUoQWNj
ZXNzaWJpbGl0eVJvbGU6OkltYWdlTWFwTGluaykpOworICAgICAgICAgICAgICAgICAgICBhcmVh
T2JqZWN0LnNldEhUTUxBcmVhRWxlbWVudCh1bmNoZWNrZWREb3duY2FzdDxIVE1MQXJlYUVsZW1l
bnQ+KGN1cnJlbnQpKTsKICAgICAgICAgICAgICAgICAgICAgYXJlYU9iamVjdC5zZXRIVE1MTWFw
RWxlbWVudChwYXJlbnRNYXApOwogICAgICAgICAgICAgICAgICAgICBhcmVhT2JqZWN0LnNldFBh
cmVudChhY2Nlc3NpYmlsaXR5UGFyZW50Rm9ySW1hZ2VNYXAocGFyZW50TWFwKSk7CiAgICAgICAg
ICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJmFyZWFPYmplY3QpOwpAQCAtMTY3NCwxNCArMTY4
NCwxNSBAQCBXaWRnZXQqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OndpZGdldEZvckF0dGFj
aG1lbnRWaWV3KCkgY29uc3QKIHsKICAgICBpZiAoIWlzQXR0YWNobWVudCgpKQogICAgICAgICBy
ZXR1cm4gbnVsbHB0cjsKLSAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVyV2lkZ2V0PigqbV9yZW5k
ZXJlcikud2lkZ2V0KCk7CisgICAgYXV0byogcmVuZGVyV2lkZ2V0ID0gZHluYW1pY0Rvd25jYXN0
PFJlbmRlcldpZGdldD4oKm1fcmVuZGVyZXIpOworICAgIHJldHVybiByZW5kZXJXaWRnZXQgPyBy
ZW5kZXJXaWRnZXQtPndpZGdldCgpIDogbnVsbHB0cjsKIH0KIAogVmlzaWJsZVBvc2l0aW9uIEFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnZpc2libGVQb3NpdGlvbkZvckluZGV4KGludCBpbmRl
eCkgY29uc3QKIHsKICAgICBpZiAobV9yZW5kZXJlcikgewogICAgICAgICBpZiAoaXNOYXRpdmVU
ZXh0Q29udHJvbCgpKSB7Ci0gICAgICAgICAgICBhdXRvJiB0ZXh0Q29udHJvbCA9IGRvd25jYXN0
PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgp
OworICAgICAgICAgICAgYXV0byYgdGV4dENvbnRyb2wgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5k
ZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKICAg
ICAgICAgICAgIHJldHVybiB0ZXh0Q29udHJvbC52aXNpYmxlUG9zaXRpb25Gb3JJbmRleChzdGQ6
OmNsYW1wKGluZGV4LCAwLCBzdGF0aWNfY2FzdDxpbnQ+KHRleHRDb250cm9sLnZhbHVlKCkubGVu
Z3RoKCkpKSk7CiAgICAgICAgIH0KIApAQCAtMTY5NSw3ICsxNzA2LDcgQEAgaW50IEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3Q6OmluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKGNvbnN0IFZpc2libGVQ
b3NpdGlvbiYgcG8KIHsKICAgICBpZiAobV9yZW5kZXJlcikgewogICAgICAgICBpZiAoaXNOYXRp
dmVUZXh0Q29udHJvbCgpKQotICAgICAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlclRleHRD
b250cm9sPigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpLmluZGV4Rm9yVmlz
aWJsZVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiB1bmNoZWNrZWREb3du
Y2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1l
bnQoKS5pbmRleEZvclZpc2libGVQb3NpdGlvbihwb3NpdGlvbik7CiAKICAgICAgICAgaWYgKCFh
bGxvd3NUZXh0UmFuZ2VzKCkgJiYgIWlzPFJlbmRlclRleHQ+KCptX3JlbmRlcmVyKSkKICAgICAg
ICAgICAgIHJldHVybiAwOwpAQCAtMTc3MCw3ICsxNzgxLDcgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjpzZXRTZWxlY3RlZFZpc2libGVQb3NpdGlvblJhbmdlKGNvbnN0IFZpc2li
bGVQb3MKICAgICBpZiAoaXNOYXRpdmVUZXh0Q29udHJvbCgpKSB7CiAgICAgICAgIC8vIGlzTmF0
aXZlVGV4dENvbnRyb2wgcmV0dXJucyB0cnVlIG9ubHkgaWYgdGhpcy0+bm9kZSgpIGlzPEhUTUxU
ZXh0QXJlYUVsZW1lbnQ+IG9yIGlzPEhUTUxJbnB1dEVsZW1lbnQ+LgogICAgICAgICAvLyBTaW5j
ZSBib3RoIEhUTUxUZXh0QXJlYUVsZW1lbnQgYW5kIEhUTUxJbnB1dEVsZW1lbnQgZGVyaXZlIGZy
b20gSFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQsIGl0IGlzIHNhZmUgdG8gZG93bmNhc3QgaGVy
ZS4KLSAgICAgICAgYXV0byogdGV4dENvbnRyb2wgPSBkb3duY2FzdDxIVE1MVGV4dEZvcm1Db250
cm9sRWxlbWVudD4obm9kZSgpKTsKKyAgICAgICAgYXV0byogdGV4dENvbnRyb2wgPSB1bmNoZWNr
ZWREb3duY2FzdDxIVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudD4obm9kZSgpKTsKICAgICAgICAg
aW50IHN0YXJ0ID0gdGV4dENvbnRyb2wtPmluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKHJhbmdlLnN0
YXJ0KTsKICAgICAgICAgaW50IGVuZCA9IHRleHRDb250cm9sLT5pbmRleEZvclZpc2libGVQb3Np
dGlvbihyYW5nZS5lbmQpOwogCkBAIC0yMDAwLDE0ICsyMDExLDE0IEBAIEFjY2Vzc2liaWxpdHlP
YmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFjY2Vzc2liaWxpdHlIaXRUZXN0KGNv
bnN0IEludFBvCiB7CiAgICAgaWYgKCFtX3JlbmRlcmVyIHx8ICFtX3JlbmRlcmVyLT5oYXNMYXll
cigpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAKKwogICAgIG1fcmVuZGVyZXItPmRv
Y3VtZW50KCkudXBkYXRlTGF5b3V0KCk7CiAKICAgICBpZiAoIW1fcmVuZGVyZXIgfHwgIW1fcmVu
ZGVyZXItPmhhc0xheWVyKCkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgUmVuZGVy
TGF5ZXIqIGxheWVyID0gZG93bmNhc3Q8UmVuZGVyQm94PigqbV9yZW5kZXJlcikubGF5ZXIoKTsK
LSAgICAgCisgICAgYXV0byogbGF5ZXIgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJCb3g+KCpt
X3JlbmRlcmVyKS5sYXllcigpOworCiAgICAgY29uc3RleHByIE9wdGlvblNldDxIaXRUZXN0UmVx
dWVzdDo6VHlwZT4gaGl0VHlwZSB7IEhpdFRlc3RSZXF1ZXN0OjpUeXBlOjpSZWFkT25seSwgSGl0
VGVzdFJlcXVlc3Q6OlR5cGU6OkFjdGl2ZSwgSGl0VGVzdFJlcXVlc3Q6OlR5cGU6OkFjY2Vzc2li
aWxpdHlIaXRUZXN0IH07CiAgICAgSGl0VGVzdFJlc3VsdCBoaXRUZXN0UmVzdWx0IHsgcG9pbnQg
fTsKICAgICBsYXllci0+aGl0VGVzdChoaXRUeXBlLCBoaXRUZXN0UmVzdWx0KTsKQEAgLTIyODMs
NyArMjI5NCw3IEBAIHZvaWQgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6YWRkSW1hZ2VNYXBD
aGlsZHJlbigpCiAgICAgICAgIC8vIGFkZCBhbiA8YXJlYT4gZWxlbWVudCBmb3IgdGhpcyBjaGls
ZCBpZiBpdCBoYXMgYSBsaW5rCiAgICAgICAgIGlmICghYXJlYS5pc0xpbmsoKSkKICAgICAgICAg
ICAgIGNvbnRpbnVlOwotICAgICAgICBhdXRvJiBhcmVhT2JqZWN0ID0gZG93bmNhc3Q8QWNjZXNz
aWJpbGl0eUltYWdlTWFwTGluaz4oKmF4T2JqZWN0Q2FjaGUoKS0+Y3JlYXRlKEFjY2Vzc2liaWxp
dHlSb2xlOjpJbWFnZU1hcExpbmspKTsKKyAgICAgICAgYXV0byYgYXJlYU9iamVjdCA9IHVuY2hl
Y2tlZERvd25jYXN0PEFjY2Vzc2liaWxpdHlJbWFnZU1hcExpbms+KCpheE9iamVjdENhY2hlKCkt
PmNyZWF0ZShBY2Nlc3NpYmlsaXR5Um9sZTo6SW1hZ2VNYXBMaW5rKSk7CiAgICAgICAgIGFyZWFP
YmplY3Quc2V0SFRNTEFyZWFFbGVtZW50KCZhcmVhKTsKICAgICAgICAgYXJlYU9iamVjdC5zZXRI
VE1MTWFwRWxlbWVudChtYXAuZ2V0KCkpOwogICAgICAgICBhcmVhT2JqZWN0LnNldFBhcmVudCh0
aGlzKTsKQEAgLTIzMDQsNyArMjMxNSw3IEBAIHZvaWQgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dDo6YWRkVGV4dEZpZWxkQ2hpbGRyZW4oKQogICAgIGlmICghc3BpbkJ1dHRvbkVsZW1lbnQpCiAg
ICAgICAgIHJldHVybjsKIAotICAgIGF1dG8mIGF4U3BpbkJ1dHRvbiA9IGRvd25jYXN0PEFjY2Vz
c2liaWxpdHlTcGluQnV0dG9uPigqYXhPYmplY3RDYWNoZSgpLT5jcmVhdGUoQWNjZXNzaWJpbGl0
eVJvbGU6OlNwaW5CdXR0b24pKTsKKyAgICBhdXRvJiBheFNwaW5CdXR0b24gPSB1bmNoZWNrZWRE
b3duY2FzdDxBY2Nlc3NpYmlsaXR5U3BpbkJ1dHRvbj4oKmF4T2JqZWN0Q2FjaGUoKS0+Y3JlYXRl
KEFjY2Vzc2liaWxpdHlSb2xlOjpTcGluQnV0dG9uKSk7CiAgICAgYXhTcGluQnV0dG9uLnNldFNw
aW5CdXR0b25FbGVtZW50KHNwaW5CdXR0b25FbGVtZW50KTsKICAgICBheFNwaW5CdXR0b24uc2V0
UGFyZW50KHRoaXMpOwogICAgIGFkZENoaWxkKCZheFNwaW5CdXR0b24pOwpAQCAtMjQ4OCw3ICsy
NDk5LDcgQEAgUmVuZGVyT2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjptYXJrZXJS
ZW5kZXJlcigpIGNvbnN0CiAgICAgaWYgKGFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSB8fCAhaXNM
aXN0SXRlbSgpIHx8ICFtX3JlbmRlcmVyIHx8ICFtX3JlbmRlcmVyLT5pc1JlbmRlckxpc3RJdGVt
KCkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwogCi0gICAgcmV0dXJuIGRvd25jYXN0PFJlbmRl
ckxpc3RJdGVtPigqbV9yZW5kZXJlcikubWFya2VyUmVuZGVyZXIoKTsKKyAgICByZXR1cm4gdW5j
aGVja2VkRG93bmNhc3Q8UmVuZGVyTGlzdEl0ZW0+KCptX3JlbmRlcmVyKS5tYXJrZXJSZW5kZXJl
cigpOwogfQogCiB2b2lkIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFkZExpc3RJdGVtTWFy
a2VyKCkKQEAgLTI2ODAsMTMgKzI2OTEsMTEgQEAgU3RyaW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJP
YmplY3Q6OnNlY3VyZUZpZWxkVmFsdWUoKSBjb25zdAogICAgIC8vIExvb2sgZm9yIHRoZSBSZW5k
ZXJUZXh0IG9iamVjdCBpbiB0aGUgUmVuZGVyT2JqZWN0IHRyZWUgZm9yIHRoaXMgaW5wdXQgZmll
bGQuCiAgICAgUmVuZGVyT2JqZWN0KiByZW5kZXJlciA9IG5vZGUoKS0+cmVuZGVyZXIoKTsKICAg
ICB3aGlsZSAocmVuZGVyZXIgJiYgIWlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKSkKLSAgICAgICAg
cmVuZGVyZXIgPSBkb3duY2FzdDxSZW5kZXJFbGVtZW50PigqcmVuZGVyZXIpLmZpcnN0Q2hpbGQo
KTsKLQotICAgIGlmICghaXM8UmVuZGVyVGV4dD4ocmVuZGVyZXIpKQotICAgICAgICByZXR1cm4g
U3RyaW5nKCk7CisgICAgICAgIHJlbmRlcmVyID0gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyRWxl
bWVudD4oKnJlbmRlcmVyKS5maXJzdENoaWxkKCk7CiAKKyAgICBhdXRvKiByZW5kZXJUZXh0ID0g
ZHluYW1pY0Rvd25jYXN0PFJlbmRlclRleHQ+KHJlbmRlcmVyKTsKICAgICAvLyBSZXR1cm4gdGhl
IHRleHQgdGhhdCBpcyBhY3R1YWxseSBiZWluZyByZW5kZXJlZCBpbiB0aGUgaW5wdXQgZmllbGQu
Ci0gICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlclRleHQ+KCpyZW5kZXJlcikudGV4dFdpdGhvdXRD
b252ZXJ0aW5nQmFja3NsYXNoVG9ZZW5TeW1ib2woKTsKKyAgICByZXR1cm4gcmVuZGVyVGV4dCA/
IHJlbmRlclRleHQtPnRleHRXaXRob3V0Q29udmVydGluZ0JhY2tzbGFzaFRvWWVuU3ltYm9sKCkg
OiBTdHJpbmcoKTsKIH0KIAogU2Nyb2xsYWJsZUFyZWEqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3Q6OmdldFNjcm9sbGFibGVBcmVhSWZTY3JvbGxhYmxlKCkgY29uc3QKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXcuY3BwIGIv
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldy5jcHAK
aW5kZXggNmJjODQxZWJiMDY3Li4yYmJjMzA4N2I5ZjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXcuY3BwCisrKyBiL1NvdXJj
ZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXcuY3BwCkBAIC00
MCw4ICs0MCw4IEBAIEFjY2Vzc2liaWxpdHlTY3JvbGxWaWV3OjpBY2Nlc3NpYmlsaXR5U2Nyb2xs
VmlldyhTY3JvbGxWaWV3KiB2aWV3KQogICAgIDogbV9zY3JvbGxWaWV3KHZpZXcpCiAgICAgLCBt
X2NoaWxkcmVuRGlydHkoZmFsc2UpCiB7Ci0gICAgaWYgKGlzPExvY2FsRnJhbWVWaWV3Pih2aWV3
KSkKLSAgICAgICAgbV9mcmFtZU93bmVyRWxlbWVudCA9IGRvd25jYXN0PExvY2FsRnJhbWVWaWV3
PigqdmlldykuZnJhbWUoKS5vd25lckVsZW1lbnQoKTsKKyAgICBpZiAoYXV0byogbG9jYWxGcmFt
ZVZpZXcgPSBkeW5hbWljRG93bmNhc3Q8TG9jYWxGcmFtZVZpZXc+KHZpZXcpKQorICAgICAgICBt
X2ZyYW1lT3duZXJFbGVtZW50ID0gbG9jYWxGcmFtZVZpZXctPmZyYW1lKCkub3duZXJFbGVtZW50
KCk7CiB9CiAKIEFjY2Vzc2liaWxpdHlTY3JvbGxWaWV3Ojp+QWNjZXNzaWJpbGl0eVNjcm9sbFZp
ZXcoKQpAQCAtMTYzLDEyICsxNjMsMTIgQEAgQWNjZXNzaWJpbGl0eVNjcm9sbGJhciogQWNjZXNz
aWJpbGl0eVNjcm9sbFZpZXc6OmFkZENoaWxkU2Nyb2xsYmFyKFNjcm9sbGJhciogc2MKIHsKICAg
ICBpZiAoIXNjcm9sbGJhcikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgCi0gICAgQVhP
YmplY3RDYWNoZSogY2FjaGUgPSBheE9iamVjdENhY2hlKCk7CisKKyAgICBXZWFrUHRyIGNhY2hl
ID0gYXhPYmplY3RDYWNoZSgpOwogICAgIGlmICghY2FjaGUpCiAgICAgICAgIHJldHVybiBudWxs
cHRyOwogCi0gICAgYXV0byYgc2Nyb2xsQmFyT2JqZWN0ID0gZG93bmNhc3Q8QWNjZXNzaWJpbGl0
eVNjcm9sbGJhcj4oKmNhY2hlLT5nZXRPckNyZWF0ZShzY3JvbGxiYXIpKTsKKyAgICBhdXRvJiBz
Y3JvbGxCYXJPYmplY3QgPSB1bmNoZWNrZWREb3duY2FzdDxBY2Nlc3NpYmlsaXR5U2Nyb2xsYmFy
PigqY2FjaGUtPmdldE9yQ3JlYXRlKHNjcm9sbGJhcikpOwogICAgIHNjcm9sbEJhck9iamVjdC5z
ZXRQYXJlbnQodGhpcyk7CiAgICAgYWRkQ2hpbGQoJnNjcm9sbEJhck9iamVjdCk7CiAgICAgcmV0
dXJuICZzY3JvbGxCYXJPYmplY3Q7CkBAIC0yNDIsMjggKzI0MiwyNiBAQCBEb2N1bWVudCogQWNj
ZXNzaWJpbGl0eVNjcm9sbFZpZXc6OmRvY3VtZW50KCkgY29uc3QKIAogTG9jYWxGcmFtZVZpZXcq
IEFjY2Vzc2liaWxpdHlTY3JvbGxWaWV3Ojpkb2N1bWVudEZyYW1lVmlldygpIGNvbnN0CiB7Ci0g
ICAgaWYgKGlzPExvY2FsRnJhbWVWaWV3PihtX3Njcm9sbFZpZXcpKQotICAgICAgICByZXR1cm4g
ZG93bmNhc3Q8TG9jYWxGcmFtZVZpZXc+KG1fc2Nyb2xsVmlldy5nZXQoKSk7CisgICAgaWYgKGF1
dG8qIGxvY2FsRnJhbWVWaWV3ID0gZHluYW1pY0Rvd25jYXN0PExvY2FsRnJhbWVWaWV3PihtX3Nj
cm9sbFZpZXcuZ2V0KCkpKQorICAgICAgICByZXR1cm4gbG9jYWxGcmFtZVZpZXc7CiAKICAgICBp
ZiAobV9mcmFtZU93bmVyRWxlbWVudCAmJiBtX2ZyYW1lT3duZXJFbGVtZW50LT5jb250ZW50RG9j
dW1lbnQoKSkKICAgICAgICAgcmV0dXJuIG1fZnJhbWVPd25lckVsZW1lbnQtPmNvbnRlbnREb2N1
bWVudCgpLT52aWV3KCk7Ci0KICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAogQWNjZXNzaWJpbGl0
eU9iamVjdCogQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXc6OnBhcmVudE9iamVjdCgpIGNvbnN0CiB7
Ci0gICAgQVhPYmplY3RDYWNoZSogY2FjaGUgPSBheE9iamVjdENhY2hlKCk7CisgICAgV2Vha1B0
ciBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUoKTsKICAgICBpZiAoIWNhY2hlKQogICAgICAgICByZXR1
cm4gbnVsbHB0cjsKIAotICAgIEhUTUxGcmFtZU93bmVyRWxlbWVudCogb3duZXIgPSBtX2ZyYW1l
T3duZXJFbGVtZW50LmdldCgpOwotICAgIGlmIChpczxMb2NhbEZyYW1lVmlldz4obV9zY3JvbGxW
aWV3KSkKLSAgICAgICAgb3duZXIgPSBkb3duY2FzdDxMb2NhbEZyYW1lVmlldz4oKm1fc2Nyb2xs
VmlldykuZnJhbWUoKS5vd25lckVsZW1lbnQoKTsKLQotICAgIGlmIChvd25lciAmJiBvd25lci0+
cmVuZGVyZXIoKSkKLSAgICAgICAgcmV0dXJuIGNhY2hlLT5nZXRPckNyZWF0ZShvd25lcik7Cisg
ICAgV2Vha1B0ciBvd25lciA9IG1fZnJhbWVPd25lckVsZW1lbnQuZ2V0KCk7CisgICAgaWYgKGF1
dG8qIGxvY2FsRnJhbWVWaWV3ID0gZHluYW1pY0Rvd25jYXN0PExvY2FsRnJhbWVWaWV3PihtX3Nj
cm9sbFZpZXcuZ2V0KCkpKQorICAgICAgICBvd25lciA9IGxvY2FsRnJhbWVWaWV3LT5mcmFtZSgp
Lm93bmVyRWxlbWVudCgpOwogCisgICAgaWYgKGNhY2hlICYmIG93bmVyICYmIG93bmVyLT5yZW5k
ZXJlcigpKQorICAgICAgICByZXR1cm4gY2FjaGUtPmdldE9yQ3JlYXRlKG93bmVyLmdldCgpKTsK
ICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>469838</attachid>
            <date>2024-02-12 15:50:48 -0800</date>
            <delta_ts>2024-02-12 16:48:44 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-269199-20240212185047.patch</filename>
            <type>text/plain</type>
            <size>37024</size>
            <attacher name="Andres Gonzalez">andresg_22</attacher>
            
              <data encoding="base64">RnJvbSA4NzQyNDNhYjg5NTkwZjg5ZDlkNjg3Njc3ZjA3YWM3ZGQ0ZDc5OGYwIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXMgR29uemFsZXogPGFuZHJlc2dfMjJAYXBwbGUuY29t
PgpEYXRlOiBTYXQsIDEwIEZlYiAyMDI0IDE1OjE4OjMwIC0wNTAwClN1YmplY3Q6IFtQQVRDSF0g
QVg6IFJlcGxhY2UgaXM8VD4gZG93bmNhc3Q8VD4gd2l0aCBkeW5hbWljRG93bmNhc3Q8VD4KIHVu
Y2hlY2tlZERvd25jYXN0PFQ+IHdoZW4gYXBwcm9wcmlhdGUgKHBhcnQgMSkuCiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY5MTk5IDxyZGFyOi8vcHJvYmxlbS8xMjI4
MDQ3ODU+CgpSZXZpZXdlZCBieSBUeWxlciBXaWxjb2NrLgoKVGhpcyBpcyBhIGZvbGxvdyB1cCB0
byBodHRwczovL2NvbW1pdHMud2Via2l0Lm9yZy8yNzIyOTZAbWFpbi4KCmlzPFQ+IGZvbGxvd2Vk
IGJ5IGRvd25jYXN0PFQ+IGhhcyBhIHBlcmZvcm1hbmNlIGltcGFjdCBzaW5jZSBpdCB0eXBlLWNo
ZWNrcyB0d2ljZS4gSW4gdGhvc2UgY2FzZXMsIHRoZSBjb2RlIGNhbiBiZSB3cml0dGVuIHVzaW5n
IGR5bmFtaWNEb253Y2FzdDxUPi4gSW4gb3RoZXIgY2FzZXMgd2hlcmUgd2UgYXJlIGNlcnRhaW4g
dGhhdCB0aGUgZG93bmNhc3QgaXMgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IHR5cGUsIHdlIHNob3Vs
ZCB1c2UgdW5jaGVja2VkRG93bmNhc3QuIFRoaXMgcGF0Y2ggbWFrZXMgdGhlc2UgY2hhbmdlcyBp
biBzb21lIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IGNvcmUgY29kZS4gTW9yZSBzaW1pbGFyIGNoYW5n
ZXMgaW4gc3Vic2VxdWVudCBwYXRjaGVzLiB0aGlzIHBhdGNoIGFsc28gaW5jbHVkZXMgc29tZSBj
b2RlIGNsZWFudXAgYW5kIG1vcmUgYWRvcHRpb24gb2Ygc21hcnQgcG9pbnRlciB0byByZXBsYWNl
IHJhdyBwb2ludGVycy4KCiogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0LmNwcDoKKFdlYkNvcmU6OmZpcnN0Q2hpbGRJbkNvbnRpbnVhdGlvbik6
CihXZWJDb3JlOjpmaXJzdENoaWxkQ29uc2lkZXJpbmdDb250aW51YXRpb24pOgooV2ViQ29yZTo6
bGFzdENoaWxkQ29uc2lkZXJpbmdDb250aW51YXRpb24pOgooV2ViQ29yZTo6c3RhcnRPZkNvbnRp
bnVhdGlvbnMpOgooV2ViQ29yZTo6ZW5kT2ZDb250aW51YXRpb25zKToKKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlSZW5kZXJPYmplY3Q6OnByZXZpb3VzU2libGluZyBjb25zdCk6CihXZWJDb3JlOjpB
Y2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpuZXh0U2libGluZyBjb25zdCk6CihXZWJDb3JlOjpu
ZXh0Q29udGludWF0aW9uKToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnBh
cmVudE9iamVjdCBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojph
bmNob3JFbGVtZW50IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6
OnRleHRVbmRlckVsZW1lbnQgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdDo6Ym91bmRpbmdCb3hSZWN0IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3Q6OmVsZW1lbnRQYXRoIGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3Q6OmNvbXB1dGVBY2Nlc3NpYmlsaXR5SXNJZ25vcmVkIGNvbnN0KToKKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmxheW91dENvdW50IGNvbnN0KToKKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNlbGVjdGVkVGV4dCBjb25zdCk6CihXZWJDb3Jl
OjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzZWxlY3RlZFRleHRSYW5nZSBjb25zdCk6CihX
ZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjppbnNlcnRpb25Qb2ludExpbmVOdW1i
ZXIgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c2V0U2VsZWN0
ZWRUZXh0UmFuZ2UpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZG9jdW1l
bnRMaW5rcyk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojp3aWRnZXRGb3JB
dHRhY2htZW50VmlldyBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
Ojp2aXNpYmxlUG9zaXRpb25Gb3JJbmRleCBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjppbmRleEZvclZpc2libGVQb3NpdGlvbiBjb25zdCk6CihXZWJDb3JlOjpB
Y2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzZXRTZWxlY3RlZFZpc2libGVQb3NpdGlvblJhbmdl
IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFjY2Vzc2liaWxp
dHlIaXRUZXN0IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFk
ZEltYWdlTWFwQ2hpbGRyZW4pOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6
YWRkVGV4dEZpZWxkQ2hpbGRyZW4pOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dDo6bWFya2VyUmVuZGVyZXIgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdDo6c2VjdXJlRmllbGRWYWx1ZSBjb25zdCk6CiogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJp
bGl0eS9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldy5jcHA6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
U2Nyb2xsVmlldzo6QWNjZXNzaWJpbGl0eVNjcm9sbFZpZXcpOgooV2ViQ29yZTo6QWNjZXNzaWJp
bGl0eVNjcm9sbFZpZXc6OmFkZENoaWxkU2Nyb2xsYmFyKToKKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlTY3JvbGxWaWV3Ojpkb2N1bWVudEZyYW1lVmlldyBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3Np
YmlsaXR5U2Nyb2xsVmlldzo6cGFyZW50T2JqZWN0IGNvbnN0KToKLS0tCiAuLi4vQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdC5jcHAgICAgICAgICAgICAgfCAyNzEgKysrKysrKysrLS0tLS0tLS0t
CiAuLi4vYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldy5jcHAgfCAgMjggKy0K
IDIgZmlsZXMgY2hhbmdlZCwgMTUzIGluc2VydGlvbnMoKyksIDE0NiBkZWxldGlvbnMoLSkKCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3QuY3BwIGIvU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0LmNwcAppbmRleCA0OGQzZGFkYWUzYzEuLjdiOGIyMzczYmYzMiAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlS
ZW5kZXJPYmplY3QuY3BwCkBAIC0xNzAsMTYgKzE3MCwxNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wg
aXNJbmxpbmVXaXRoQ29udGludWF0aW9uKFJlbmRlck9iamVjdCYgcmVuZGVyZXIpCiAgICAgcmV0
dXJuIHJlbmRlcklubGluZSAmJiByZW5kZXJJbmxpbmUtPmNvbnRpbnVhdGlvbigpOwogfQogCi1z
dGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogZmlyc3RDaGlsZEluQ29udGludWF0aW9uKFJlbmRl
cklubGluZSYgcmVuZGVyZXIpCitzdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogZmlyc3RDaGls
ZEluQ29udGludWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0JiByZW5kZXJlcikKIHsKLSAgICBh
dXRvKiBjb250aW51YXRpb24gPSByZW5kZXJlci5jb250aW51YXRpb24oKTsKLQorICAgIFdlYWtQ
dHIgY29udGludWF0aW9uID0gcmVuZGVyZXIuY29udGludWF0aW9uKCk7CiAgICAgd2hpbGUgKGNv
bnRpbnVhdGlvbikgewogICAgICAgICBpZiAoaXM8UmVuZGVyQmxvY2s+KCpjb250aW51YXRpb24p
KQotICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbjsKLSAgICAgICAgaWYgKFJlbmRlck9i
amVjdCogY2hpbGQgPSBjb250aW51YXRpb24tPmZpcnN0Q2hpbGQoKSkKKyAgICAgICAgICAgIHJl
dHVybiBjb250aW51YXRpb24uZ2V0KCk7CisKKyAgICAgICAgaWYgKGF1dG8qIGNoaWxkID0gY29u
dGludWF0aW9uLT5maXJzdENoaWxkKCkpCiAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAg
ICAgIGNvbnRpbnVhdGlvbiA9IGRvd25jYXN0PFJlbmRlcklubGluZT4oKmNvbnRpbnVhdGlvbiku
Y29udGludWF0aW9uKCk7CisKKyAgICAgICAgY29udGludWF0aW9uID0gY29udGludWF0aW9uLT5j
b250aW51YXRpb24oKTsKICAgICB9CiAKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTE5MiwxMSAr
MTkzLDE0IEBAIHN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkQ29uc2lkZXJp
bmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0JiByZW5kCiAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0
byBpbmNsdWRlIHRoZSBlbmQgb2YgYSBjb250aW51YXRpb24gYXMgdGhlIGZpcnN0Q2hpbGQgb2Yg
dGhlCiAgICAgLy8gYW5vbnltb3VzIHBhcmVudCwgYmVjYXVzZSBldmVyeXRoaW5nIGhhcyBhbHJl
YWR5IGJlZW4gbGlua2VkIHVwIHZpYSBjb250aW51YXRpb24uCiAgICAgLy8gQ1NTIGZpcnN0LWxl
dHRlciBzZWxlY3RvciBpcyBhbiBleGFtcGxlIG9mIHRoaXMgY2FzZS4KLSAgICBpZiAocmVuZGVy
ZXIuaXNBbm9ueW1vdXMoKSAmJiBpczxSZW5kZXJJbmxpbmU+KGZpcnN0Q2hpbGQpICYmIGRvd25j
YXN0PFJlbmRlcklubGluZT4oKmZpcnN0Q2hpbGQpLmlzQ29udGludWF0aW9uKCkpCi0gICAgICAg
IGZpcnN0Q2hpbGQgPSBudWxscHRyOwotICAgIAorICAgIGlmIChyZW5kZXJlci5pc0Fub255bW91
cygpKSB7CisgICAgICAgIGF1dG8qIHJlbmRlcklubGluZSA9IGR5bmFtaWNEb3duY2FzdDxSZW5k
ZXJJbmxpbmU+KGZpcnN0Q2hpbGQpOworICAgICAgICBpZiAocmVuZGVySW5saW5lICYmIHJlbmRl
cklubGluZS0+aXNDb250aW51YXRpb24oKSkKKyAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBudWxs
cHRyOworICAgIH0KKwogICAgIGlmICghZmlyc3RDaGlsZCAmJiBpc0lubGluZVdpdGhDb250aW51
YXRpb24ocmVuZGVyZXIpKQotICAgICAgICBmaXJzdENoaWxkID0gZmlyc3RDaGlsZEluQ29udGlu
dWF0aW9uKGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIpKTsKKyAgICAgICAgZmlyc3RD
aGlsZCA9IGZpcnN0Q2hpbGRJbkNvbnRpbnVhdGlvbih1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJJ
bmxpbmU+KHJlbmRlcmVyKSk7CiAKICAgICByZXR1cm4gZmlyc3RDaGlsZDsKIH0KQEAgLTIwNywx
NSArMjExLDE2IEBAIHN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGRDb25zaWRl
cmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QmIHJlbmRlCiAgICAgaWYgKCFpczxSZW5kZXJJ
bmxpbmU+KHJlbmRlcmVyKSAmJiAhaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKICAgICAgICAg
cmV0dXJuICZyZW5kZXJlcjsKIAotICAgIFJlbmRlck9iamVjdCogbGFzdENoaWxkID0gZG93bmNh
c3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KHJlbmRlcmVyKS5sYXN0Q2hpbGQoKTsKLSAgICBmb3Ig
KGF1dG8qIGN1cnJlbnQgPSAmZG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KHJlbmRlcmVy
KTsgY3VycmVudDsgKSB7Ci0gICAgICAgIGlmIChSZW5kZXJPYmplY3QqIG5ld0xhc3RDaGlsZCA9
IGN1cnJlbnQtPmxhc3RDaGlsZCgpKQorICAgIGF1dG8mIGJveE1vZGVsT2JqZWN0ID0gdW5jaGVj
a2VkRG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KHJlbmRlcmVyKTsKKyAgICBXZWFrUHRy
IGxhc3RDaGlsZCA9IGJveE1vZGVsT2JqZWN0Lmxhc3RDaGlsZCgpOworICAgIGZvciAoYXV0byog
Y3VycmVudCA9ICZib3hNb2RlbE9iamVjdDsgY3VycmVudDsgKSB7CisgICAgICAgIGlmIChhdXRv
KiBuZXdMYXN0Q2hpbGQgPSBjdXJyZW50LT5sYXN0Q2hpbGQoKSkKICAgICAgICAgICAgIGxhc3RD
aGlsZCA9IG5ld0xhc3RDaGlsZDsKIAogICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+aW5saW5l
Q29udGludWF0aW9uKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGxhc3RDaGlsZDsKKyAgICByZXR1
cm4gbGFzdENoaWxkLmdldCgpOwogfQogCiBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0OjpmaXJzdENoaWxkKCkgY29uc3QKQEAgLTI1MiwxNiArMjU3LDE2IEBA
IEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Omxhc3RDaGls
ZCgpIGNvbnN0CiAKIHN0YXRpYyBpbmxpbmUgUmVuZGVySW5saW5lKiBzdGFydE9mQ29udGludWF0
aW9ucyhSZW5kZXJPYmplY3QmIHJlbmRlcmVyKQogewotICAgIGF1dG8qIHJlbmRlckVsZW1lbnQg
PSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyRWxlbWVudD4ocmVuZGVyZXIpOworICAgIFdlYWtQdHIg
cmVuZGVyRWxlbWVudCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJFbGVtZW50PihyZW5kZXJlcik7
CiAgICAgaWYgKCFyZW5kZXJFbGVtZW50KQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAg
IGlmIChpczxSZW5kZXJJbmxpbmU+KCpyZW5kZXJFbGVtZW50KSAmJiByZW5kZXJFbGVtZW50LT5p
c0NvbnRpbnVhdGlvbigpICYmIGlzPFJlbmRlcklubGluZT4ocmVuZGVyRWxlbWVudC0+ZWxlbWVu
dCgpLT5yZW5kZXJlcigpKSkKLSAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlcklubGluZT4o
cmVuZGVyZXIubm9kZSgpLT5yZW5kZXJlcigpKTsKKyAgICAgICAgcmV0dXJuIHVuY2hlY2tlZERv
d25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIubm9kZSgpLT5yZW5kZXJlcigpKTsKIAogICAg
IC8vIEJsb2NrcyB3aXRoIGEgcHJldmlvdXMgY29udGludWF0aW9uIGFsd2F5cyBoYXZlIGEgbmV4
dCBjb250aW51YXRpb24KICAgICBpZiAoYXV0byogcmVuZGVyQmxvY2sgPSBkeW5hbWljRG93bmNh
c3Q8UmVuZGVyQmxvY2s+KCpyZW5kZXJFbGVtZW50KTsgcmVuZGVyQmxvY2sgJiYgcmVuZGVyQmxv
Y2stPmlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVy
SW5saW5lPihyZW5kZXJCbG9jay0+aW5saW5lQ29udGludWF0aW9uKCktPmVsZW1lbnQoKS0+cmVu
ZGVyZXIoKSk7Ci0KKyAgICAgICAgcmV0dXJuIHVuY2hlY2tlZERvd25jYXN0PFJlbmRlcklubGlu
ZT4ocmVuZGVyQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpLT5lbGVtZW50KCktPnJlbmRlcmVy
KCkpOwogICAgIHJldHVybiBudWxscHRyOwogfQogCkBAIC0yNzAsNyArMjc1LDcgQEAgc3RhdGlj
IGlubGluZSBSZW5kZXJPYmplY3QqIGVuZE9mQ29udGludWF0aW9ucyhSZW5kZXJPYmplY3QmIHJl
bmRlcmVyKQogICAgIGlmICghaXM8UmVuZGVySW5saW5lPihyZW5kZXJlcikgJiYgIWlzPFJlbmRl
ckJsb2NrPihyZW5kZXJlcikpCiAgICAgICAgIHJldHVybiAmcmVuZGVyZXI7CiAKLSAgICBhdXRv
KiBwcmV2aW91cyA9ICZkb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIpOwor
ICAgIGF1dG8qIHByZXZpb3VzID0gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmpl
Y3Q+KCZyZW5kZXJlcik7CiAgICAgZm9yIChhdXRvKiBjdXJyZW50ID0gcHJldmlvdXM7IGN1cnJl
bnQ7ICkgewogICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgICAgICAgIGN1cnJlbnQgPSBj
dXJyZW50LT5pbmxpbmVDb250aW51YXRpb24oKTsKQEAgLTMyMywxNCArMzI4LDE0IEBAIEFjY2Vz
c2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnByZXZpb3VzU2libGlu
ZygpIGNvbnN0CiAgICAgLy8gQ2FzZSAxOiBUaGUgbm9kZSBpcyBhIGJsb2NrIGFuZCBpcyBhbiBp
bmxpbmUncyBjb250aW51YXRpb24uIEluIHRoYXQgY2FzZSwgdGhlIGlubGluZSdzCiAgICAgLy8g
bGFzdCBjaGlsZCBpcyBvdXIgcHJldmlvdXMgc2libGluZyAob3IgZnVydGhlciBiYWNrIGluIHRo
ZSBjb250aW51YXRpb24gY2hhaW4pCiAgICAgUmVuZGVySW5saW5lKiBzdGFydE9mQ29udHM7Ci0g
ICAgaWYgKGlzPFJlbmRlckJveD4oKm1fcmVuZGVyZXIpICYmIChzdGFydE9mQ29udHMgPSBzdGFy
dE9mQ29udGludWF0aW9ucygqbV9yZW5kZXJlcikpKQorICAgIFdlYWtQdHIgcmVuZGVyQmxvY2sg
PSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKTsKKyAgICBpZiAocmVu
ZGVyQmxvY2sgJiYgKHN0YXJ0T2ZDb250cyA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCptX3JlbmRl
cmVyKSkpCiAgICAgICAgIHByZXZpb3VzU2libGluZyA9IGNoaWxkQmVmb3JlQ29uc2lkZXJpbmdD
b250aW51YXRpb25zKHN0YXJ0T2ZDb250cywgcmVuZGVyZXIoKSk7CiAKICAgICAvLyBDYXNlIDI6
IEFub255bW91cyBibG9jayBwYXJlbnQgb2YgdGhlIGVuZCBvZiBhIGNvbnRpbnVhdGlvbiAtIHNr
aXAgYWxsIHRoZSB3YXkgdG8gYmVmb3JlCiAgICAgLy8gdGhlIHBhcmVudCBvZiB0aGUgc3RhcnQs
IHNpbmNlIGV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3aWxsIGJlIGxpbmtlZCB1cCB2aWEgdGhlIGNv
bnRpbnVhdGlvbi4KLSAgICBlbHNlIGlmIChtX3JlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkg
JiYgZmlyc3RDaGlsZElzSW5saW5lQ29udGludWF0aW9uKGRvd25jYXN0PFJlbmRlckJsb2NrPigq
bV9yZW5kZXJlcikpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrJiByZW5kZXJCbG9jayA9IGRvd25j
YXN0PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcik7Ci0gICAgICAgIGF1dG8qIGZpcnN0UGFyZW50
ID0gc3RhcnRPZkNvbnRpbnVhdGlvbnMoKnJlbmRlckJsb2NrLmZpcnN0Q2hpbGQoKSktPnBhcmVu
dCgpOworICAgIGVsc2UgaWYgKHJlbmRlckJsb2NrICYmIG1fcmVuZGVyZXItPmlzQW5vbnltb3Vz
QmxvY2soKSAmJiBmaXJzdENoaWxkSXNJbmxpbmVDb250aW51YXRpb24oKnJlbmRlckJsb2NrKSkg
eworICAgICAgICBhdXRvKiBmaXJzdFBhcmVudCA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCpyZW5k
ZXJCbG9jay0+Zmlyc3RDaGlsZCgpKS0+cGFyZW50KCk7CiAgICAgICAgIEFTU0VSVChmaXJzdFBh
cmVudCk7CiAgICAgICAgIHdoaWxlIChmaXJzdENoaWxkSXNJbmxpbmVDb250aW51YXRpb24oKmZp
cnN0UGFyZW50KSkKICAgICAgICAgICAgIGZpcnN0UGFyZW50ID0gc3RhcnRPZkNvbnRpbnVhdGlv
bnMoKmZpcnN0UGFyZW50LT5maXJzdENoaWxkKCkpLT5wYXJlbnQoKTsKQEAgLTM3NCwxMyArMzc5
LDE0IEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Om5l
eHRTaWJsaW5nKCkgY29uc3QKICAgICAvLyBDYXNlIDE6IG5vZGUgaXMgYSBibG9jayBhbmQgaGFz
IGFuIGlubGluZSBjb250aW51YXRpb24uIE5leHQgc2libGluZyBpcyB0aGUgaW5saW5lIGNvbnRp
bnVhdGlvbidzCiAgICAgLy8gZmlyc3QgY2hpbGQuCiAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVD
b250aW51YXRpb247Ci0gICAgaWYgKGlzPFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcikgJiYgKGlu
bGluZUNvbnRpbnVhdGlvbiA9IGRvd25jYXN0PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcikuaW5s
aW5lQ29udGludWF0aW9uKCkpKQorICAgIFdlYWtQdHIgcmVuZGVyQmxvY2sgPSBkeW5hbWljRG93
bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKTsKKyAgICBpZiAocmVuZGVyQmxvY2sgJiYg
KGlubGluZUNvbnRpbnVhdGlvbiA9IHJlbmRlckJsb2NrLT5pbmxpbmVDb250aW51YXRpb24oKSkp
CiAgICAgICAgIG5leHRTaWJsaW5nID0gZmlyc3RDaGlsZENvbnNpZGVyaW5nQ29udGludWF0aW9u
KCppbmxpbmVDb250aW51YXRpb24pOwogCiAgICAgLy8gQ2FzZSAyOiBBbm9ueW1vdXMgYmxvY2sg
cGFyZW50IG9mIHRoZSBzdGFydCBvZiBhIGNvbnRpbnVhdGlvbiAtIHNraXAgYWxsIHRoZSB3YXkg
dG8KICAgICAvLyBhZnRlciB0aGUgcGFyZW50IG9mIHRoZSBlbmQsIHNpbmNlIGV2ZXJ5dGhpbmcg
aW4gYmV0d2VlbiB3aWxsIGJlIGxpbmtlZCB1cCB2aWEgdGhlIGNvbnRpbnVhdGlvbi4KLSAgICBl
bHNlIGlmIChtX3JlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkgJiYgbGFzdENoaWxkSGFzQ29u
dGludWF0aW9uKGRvd25jYXN0PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcikpKSB7Ci0gICAgICAg
IFJlbmRlckVsZW1lbnQqIGxhc3RQYXJlbnQgPSBlbmRPZkNvbnRpbnVhdGlvbnMoKmRvd25jYXN0
PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcikubGFzdENoaWxkKCkpLT5wYXJlbnQoKTsKKyAgICBl
bHNlIGlmIChyZW5kZXJCbG9jayAmJiBtX3JlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkgJiYg
bGFzdENoaWxkSGFzQ29udGludWF0aW9uKCpyZW5kZXJCbG9jaykpIHsKKyAgICAgICAgYXV0byog
bGFzdFBhcmVudCA9IGVuZE9mQ29udGludWF0aW9ucygqcmVuZGVyQmxvY2stPmxhc3RDaGlsZCgp
KS0+cGFyZW50KCk7CiAgICAgICAgIEFTU0VSVChsYXN0UGFyZW50KTsKICAgICAgICAgd2hpbGUg
KGxhc3RDaGlsZEhhc0NvbnRpbnVhdGlvbigqbGFzdFBhcmVudCkpCiAgICAgICAgICAgICBsYXN0
UGFyZW50ID0gZW5kT2ZDb250aW51YXRpb25zKCpsYXN0UGFyZW50LT5sYXN0Q2hpbGQoKSktPnBh
cmVudCgpOwpAQCAtNDAwLDcgKzQwNiw3IEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3Q6Om5leHRTaWJsaW5nKCkgY29uc3QKICAgICAvLyBDYXNlIDUuMTog
QWZ0ZXIgY2FzZSA0LCAodGhlIGVsZW1lbnQgd2FzIGlubGluZSB3LyBjb250aW51YXRpb24gYnV0
IGhhZCBubyBzaWJsaW5nKSwgdGhlbiBjaGVjayBpdCdzIHBhcmVudC4KICAgICBpZiAoIW5leHRT
aWJsaW5nICYmIG1fcmVuZGVyZXItPnBhcmVudCgpICYmIGlzSW5saW5lV2l0aENvbnRpbnVhdGlv
bigqbV9yZW5kZXJlci0+cGFyZW50KCkpKSB7CiAgICAgICAgIGF1dG8mIGNvbnRpbnVhdGlvbiA9
ICpkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX3JlbmRlcmVyLT5wYXJlbnQoKSkuY29udGludWF0
aW9uKCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIENhc2UgNWE6IGNvbnRpbnVhdGlvbiBpcyBh
IGJsb2NrIC0gaW4gdGhpcyBjYXNlIHRoZSBibG9jayBpdHNlbGYgaXMgdGhlIG5leHQgc2libGlu
Zy4KICAgICAgICAgaWYgKGlzPFJlbmRlckJsb2NrPihjb250aW51YXRpb24pKQogICAgICAgICAg
ICAgbmV4dFNpYmxpbmcgPSAmY29udGludWF0aW9uOwpAQCAtNDQwLDExICs0NDYsMTMgQEAgQWNj
ZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6bmV4dFNpYmxpbmco
KSBjb25zdAogCiBzdGF0aWMgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRDb250aW51YXRpb24o
UmVuZGVyT2JqZWN0JiByZW5kZXJlcikKIHsKLSAgICBpZiAoaXM8UmVuZGVySW5saW5lPihyZW5k
ZXJlcikgJiYgIXJlbmRlcmVyLmlzUmVwbGFjZWRPcklubGluZUJsb2NrKCkpCi0gICAgICAgIHJl
dHVybiBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKS5jb250aW51YXRpb24oKTsKLSAg
ICBpZiAoaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKLSAgICAgICAgcmV0dXJuIGRvd25jYXN0
PFJlbmRlckJsb2NrPihyZW5kZXJlcikuaW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgcmV0dXJu
IG51bGxwdHI7CisgICAgaWYgKCFyZW5kZXJlci5pc1JlcGxhY2VkT3JJbmxpbmVCbG9jaygpKSB7
CisgICAgICAgIGlmIChhdXRvKiByZW5kZXJJbmxpbmUgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVy
SW5saW5lPihyZW5kZXJlcikpCisgICAgICAgICAgICByZXR1cm4gcmVuZGVySW5saW5lLT5jb250
aW51YXRpb24oKTsKKyAgICB9CisKKyAgICBhdXRvKiByZW5kZXJCbG9jayA9IGR5bmFtaWNEb3du
Y2FzdDxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpOworICAgIHJldHVybiByZW5kZXJCbG9jayA/IHJl
bmRlckJsb2NrLT5pbmxpbmVDb250aW51YXRpb24oKSA6IG51bGxwdHI7CiB9CiAgICAgCiBSZW5k
ZXJPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnJlbmRlclBhcmVudE9iamVjdCgp
IGNvbnN0CkBAIC01MzgsOCArNTQ2LDggQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdDo6cGFyZW50T2JqZWN0KCkgY29uc3QKICAgICAvLyBFeHBvc2UgbWFy
a2VycyB0aGF0IGFyZSBub3QgZGlyZWN0IGNoaWxkcmVuIG9mIGEgbGlzdCBpdGVtIHRvby4KICAg
ICBpZiAobV9yZW5kZXJlci0+aXNSZW5kZXJMaXN0TWFya2VyKCkpIHsKICAgICAgICAgaWYgKGF1
dG8qIGxpc3RJdGVtID0gYW5jZXN0b3JzT2ZUeXBlPFJlbmRlckxpc3RJdGVtPigqbV9yZW5kZXJl
cikuZmlyc3QoKSkgewotICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogcGFyZW50ID0g
YXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZShsaXN0SXRlbSk7Ci0gICAgICAgICAgICBpZiAo
ZG93bmNhc3Q8QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdD4oKnBhcmVudCkubWFya2VyUmVuZGVy
ZXIoKSA9PSBtX3JlbmRlcmVyKQorICAgICAgICAgICAgYXV0byogcGFyZW50ID0gYXhPYmplY3RD
YWNoZSgpLT5nZXRPckNyZWF0ZShsaXN0SXRlbSk7CisgICAgICAgICAgICBpZiAodW5jaGVja2Vk
RG93bmNhc3Q8QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdD4ocGFyZW50KS5tYXJrZXJSZW5kZXJl
cigpID09IG1fcmVuZGVyZXIpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudDsKICAgICAg
ICAgfQogICAgIH0KQEAgLTU0NywxMSArNTU1LDExIEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnBhcmVudE9iamVjdCgpIGNvbnN0CiAKICAgICBpZiAo
YXV0byogcGFyZW50T2JqZWN0ID0gcmVuZGVyUGFyZW50T2JqZWN0KCkpCiAgICAgICAgIHJldHVy
biBjYWNoZS0+Z2V0T3JDcmVhdGUocGFyZW50T2JqZWN0KTsKLSAgICAKKwogICAgIC8vIFdlYkFy
ZWEncyBwYXJlbnQgc2hvdWxkIGJlIHRoZSBzY3JvbGwgdmlldyBjb250YWluaW5nIGl0LgogICAg
IGlmIChpc1dlYkFyZWEoKSkKICAgICAgICAgcmV0dXJuIGNhY2hlLT5nZXRPckNyZWF0ZSgmbV9y
ZW5kZXJlci0+dmlldygpLmZyYW1lVmlldygpKTsKLSAgICAKKwogICAgIHJldHVybiBudWxscHRy
OwogfQogCkBAIC01ODQsMzIgKzU5MiwzNiBAQCBFbGVtZW50KiBBY2Nlc3NpYmlsaXR5UmVuZGVy
T2JqZWN0OjphbmNob3JFbGVtZW50KCkgY29uc3QKIHsKICAgICBpZiAoIW1fcmVuZGVyZXIpCiAg
ICAgICAgIHJldHVybiBudWxscHRyOwotICAgIAotICAgIEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0g
YXhPYmplY3RDYWNoZSgpOworCisgICAgV2Vha1B0ciBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUoKTsK
ICAgICBpZiAoIWNhY2hlKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAKKwogICAgIFJl
bmRlck9iamVjdCogY3VycmVudFJlbmRlcmVyOwotICAgIAorCiAgICAgLy8gU2VhcmNoIHVwIHRo
ZSByZW5kZXIgdHJlZSBmb3IgYSBSZW5kZXJPYmplY3Qgd2l0aCBhIERPTSBub2RlLiAgRGVmZXIg
dG8gYW4gZWFybGllciBjb250aW51YXRpb24sIHRob3VnaC4KICAgICBmb3IgKGN1cnJlbnRSZW5k
ZXJlciA9IHJlbmRlcmVyKCk7IGN1cnJlbnRSZW5kZXJlciAmJiAhY3VycmVudFJlbmRlcmVyLT5u
b2RlKCk7IGN1cnJlbnRSZW5kZXJlciA9IGN1cnJlbnRSZW5kZXJlci0+cGFyZW50KCkpIHsKICAg
ICAgICAgaWYgKGN1cnJlbnRSZW5kZXJlci0+aXNBbm9ueW1vdXNCbG9jaygpKSB7Ci0gICAgICAg
ICAgICBpZiAoUmVuZGVyT2JqZWN0KiBjb250aW51YXRpb24gPSBkb3duY2FzdDxSZW5kZXJCbG9j
az4oKmN1cnJlbnRSZW5kZXJlcikuY29udGludWF0aW9uKCkpCisgICAgICAgICAgICBpZiAoYXV0
byogY29udGludWF0aW9uID0gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyQmxvY2s+KCpjdXJyZW50
UmVuZGVyZXIpLmNvbnRpbnVhdGlvbigpKQogICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZS0+
Z2V0T3JDcmVhdGUoY29udGludWF0aW9uKS0+YW5jaG9yRWxlbWVudCgpOwogICAgICAgICB9CiAg
ICAgfQotICAgIAotICAgIC8vIGJhaWwgaWYgbm9uZSBmb3VuZAorCisgICAgLy8gQmFpbCBpZiBu
b25lIGZvdW5kLgogICAgIGlmICghY3VycmVudFJlbmRlcmVyKQogICAgICAgICByZXR1cm4gbnVs
bHB0cjsKLSAgICAKLSAgICAvLyBzZWFyY2ggdXAgdGhlIERPTSB0cmVlIGZvciBhbiBhbmNob3Ig
ZWxlbWVudAotICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0aGF0IGFueSBub24taW1hZ2Ugd2l0
aCBhbiBhbmNob3IgaXMgYW4gSFRNTEFuY2hvckVsZW1lbnQKLSAgICBmb3IgKE5vZGUqIG5vZGUg
PSBjdXJyZW50UmVuZGVyZXItPm5vZGUoKTsgbm9kZTsgbm9kZSA9IG5vZGUtPnBhcmVudE5vZGUo
KSkgewotICAgICAgICBpZiAoaXM8SFRNTEFuY2hvckVsZW1lbnQ+KCpub2RlKSB8fCAobm9kZS0+
cmVuZGVyZXIoKSAmJiBjYWNoZS0+Z2V0T3JDcmVhdGUobm9kZS0+cmVuZGVyZXIoKSktPmlzTGlu
aygpKSkKLSAgICAgICAgICAgIHJldHVybiBkb3duY2FzdDxFbGVtZW50Pihub2RlKTsKKworICAg
IC8vIFNlYXJjaCB1cCB0aGUgRE9NIHRyZWUgZm9yIGFuIGFuY2hvciBlbGVtZW50LgorICAgIC8v
IE5PVEU6IHRoaXMgYXNzdW1lcyB0aGF0IGFueSBub24taW1hZ2Ugd2l0aCBhbiBhbmNob3IgaXMg
YW4gSFRNTEFuY2hvckVsZW1lbnQuCisgICAgZm9yIChSZWZQdHIgbm9kZSA9IGN1cnJlbnRSZW5k
ZXJlci0+bm9kZSgpOyBub2RlOyBub2RlID0gbm9kZS0+cGFyZW50Tm9kZSgpKSB7CisgICAgICAg
IGlmIChhdXRvKiBhbmNob3IgPSBkeW5hbWljRG93bmNhc3Q8SFRNTEFuY2hvckVsZW1lbnQ+KG5v
ZGUuZ2V0KCkpKQorICAgICAgICAgICAgcmV0dXJuIGFuY2hvcjsKKworICAgICAgICBhdXRvKiBv
YmplY3QgPSBjYWNoZSA/IGNhY2hlLT5nZXRPckNyZWF0ZShub2RlLT5yZW5kZXJlcigpKSA6IG51
bGxwdHI7CisgICAgICAgIGlmIChvYmplY3QgJiYgb2JqZWN0LT5pc0xpbmsoKSkKKyAgICAgICAg
ICAgIHJldHVybiBkeW5hbWljRG93bmNhc3Q8RWxlbWVudD4oKm5vZGUpOwogICAgIH0KLSAgICAK
KwogICAgIHJldHVybiBudWxscHRyOwogfQogCkBAIC02NTUsOSArNjY3LDkgQEAgU3RyaW5nIEFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnRleHRVbmRlckVsZW1lbnQoQWNjZXNzaWJpbGl0eVRl
eHRVbmRlckVsZW1lbnQKICAgICBpZiAoIW1fcmVuZGVyZXIpCiAgICAgICAgIHJldHVybiBBY2Nl
c3NpYmlsaXR5Tm9kZU9iamVjdDo6dGV4dFVuZGVyRWxlbWVudChtb2RlKTsKIAotICAgIGlmIChp
czxSZW5kZXJGaWxlVXBsb2FkQ29udHJvbD4oKm1fcmVuZGVyZXIpKQotICAgICAgICByZXR1cm4g
ZG93bmNhc3Q8UmVuZGVyRmlsZVVwbG9hZENvbnRyb2w+KCptX3JlbmRlcmVyKS5idXR0b25WYWx1
ZSgpOwotICAgIAorICAgIGlmIChhdXRvKiBmaWxlVXBsb2FkID0gZHluYW1pY0Rvd25jYXN0PFJl
bmRlckZpbGVVcGxvYWRDb250cm9sPigqbV9yZW5kZXJlcikpCisgICAgICAgIHJldHVybiBmaWxl
VXBsb2FkLT5idXR0b25WYWx1ZSgpOworCiAgICAgLy8gUmVmbGVjdCB3aGVuIGEgY29udGVudCBh
dXRob3IgaGFzIGV4cGxpY2l0bHkgbWFya2VkIGEgbGluZSBicmVhay4KICAgICBpZiAobV9yZW5k
ZXJlci0+aXNCUigpKQogICAgICAgICByZXR1cm4gIlxuIl9zOwpAQCAtNjk4LDI0ICs3MTAsMjIg
QEAgU3RyaW5nIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnRleHRVbmRlckVsZW1lbnQoQWNj
ZXNzaWJpbGl0eVRleHRVbmRlckVsZW1lbnQKICAgICAgICAgICAgICAgICByZXR1cm4gcGxhaW5U
ZXh0KCp0ZXh0UmFuZ2UsIHRleHRJdGVyYXRvckJlaGF2aW9yRm9yVGV4dFJhbmdlKCkpOwogICAg
ICAgICAgICAgfQogICAgICAgICB9Ci0gICAgCisKICAgICAgICAgLy8gU29tZXRpbWVzIHRleHQg
ZnJhZ21lbnRzIGRvbid0IGhhdmUgTm9kZXMgYXNzb2NpYXRlZCB3aXRoIHRoZW0gKGxpa2Ugd2hl
bgogICAgICAgICAvLyBDU1MgY29udGVudCBpcyB1c2VkIHRvIGluc2VydCB0ZXh0IG9yIHdoZW4g
YSBSZW5kZXJDb3VudGVyIGlzIHVzZWQuKQotICAgICAgICBpZiAoaXM8UmVuZGVyVGV4dD4oKm1f
cmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICBSZW5kZXJUZXh0JiByZW5kZXJUZXh0T2JqZWN0ID0g
ZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fcmVuZGVyZXIpOwotICAgICAgICAgICAgaWYgKGlzPFJl
bmRlclRleHRGcmFnbWVudD4ocmVuZGVyVGV4dE9iamVjdCkpIHsKLSAgICAgICAgICAgICAgICBS
ZW5kZXJUZXh0RnJhZ21lbnQmIHJlbmRlclRleHRGcmFnbWVudCA9IGRvd25jYXN0PFJlbmRlclRl
eHRGcmFnbWVudD4ocmVuZGVyVGV4dE9iamVjdCk7CisgICAgICAgIGlmIChXZWFrUHRyIHJlbmRl
clRleHQgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fcmVuZGVyZXIpKSB7CisgICAg
ICAgICAgICBpZiAoV2Vha1B0ciByZW5kZXJUZXh0RnJhZ21lbnQgPSBkeW5hbWljRG93bmNhc3Q8
UmVuZGVyVGV4dEZyYWdtZW50PigqcmVuZGVyVGV4dCkpIHsKICAgICAgICAgICAgICAgICAvLyBU
aGUgYWx0IGF0dHJpYnV0ZSBtYXkgYmUgc2V0IG9uIGEgdGV4dCBmcmFnbWVudCB0aHJvdWdoIENT
Uywgd2hpY2ggc2hvdWxkIGJlIGhvbm9yZWQuCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5n
JiBhbHRUZXh0ID0gcmVuZGVyVGV4dEZyYWdtZW50LmFsdFRleHQoKTsKKyAgICAgICAgICAgICAg
ICBjb25zdCBhdXRvJiBhbHRUZXh0ID0gcmVuZGVyVGV4dEZyYWdtZW50LT5hbHRUZXh0KCk7CiAg
ICAgICAgICAgICAgICAgaWYgKCFhbHRUZXh0LmlzRW1wdHkoKSkKICAgICAgICAgICAgICAgICAg
ICAgcmV0dXJuIGFsdFRleHQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRleHRGcmFn
bWVudC5jb250ZW50U3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRleHRG
cmFnbWVudCA/IHJlbmRlclRleHRGcmFnbWVudC0+Y29udGVudFN0cmluZygpIDogU3RyaW5nKCk7
CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHJldHVybiByZW5kZXJUZXh0T2JqZWN0LnRl
eHQoKTsKKyAgICAgICAgICAgIHJldHVybiByZW5kZXJUZXh0ID8gcmVuZGVyVGV4dC0+dGV4dCgp
IDogU3RyaW5nKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgCisKICAgICByZXR1cm4gQWNjZXNz
aWJpbGl0eU5vZGVPYmplY3Q6OnRleHRVbmRlckVsZW1lbnQobW9kZSk7CiB9CiAKQEAgLTgyNCw0
MyArODM0LDQyIEBAIHZvaWQgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6b2Zmc2V0Qm91bmRp
bmdCb3hGb3JSZW1vdGVTVkdFbGVtZW50KExheW91dFJlY3QmCiAgICAgICAgIH0KICAgICB9CiB9
Ci0gICAgCisKIExheW91dFJlY3QgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6Ym91bmRpbmdC
b3hSZWN0KCkgY29uc3QKIHsKLSAgICBSZW5kZXJPYmplY3QqIG9iaiA9IHJlbmRlcmVyKCk7Ci0g
ICAgCi0gICAgaWYgKCFvYmopCisgICAgV2Vha1B0ciByZW5kZXJlciA9IHRoaXMtPnJlbmRlcmVy
KCk7CisgICAgaWYgKCFyZW5kZXJlcikKICAgICAgICAgcmV0dXJuIEFjY2Vzc2liaWxpdHlOb2Rl
T2JqZWN0Ojpib3VuZGluZ0JveFJlY3QoKTsKLSAgICAKLSAgICBpZiAob2JqLT5ub2RlKCkpIC8v
IElmIHdlIGFyZSBhIGNvbnRpbnVhdGlvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gdXNlIHRo
ZSBwcmltYXJ5IHJlbmRlcmVyLgotICAgICAgICBvYmogPSBvYmotPm5vZGUoKS0+cmVuZGVyZXIo
KTsKLSAgICAKKworICAgIGlmIChyZW5kZXJlci0+bm9kZSgpKSAvLyBJZiB3ZSBhcmUgYSBjb250
aW51YXRpb24sIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRvIHVzZSB0aGUgcHJpbWFyeSByZW5kZXJl
ci4KKyAgICAgICAgcmVuZGVyZXIgPSByZW5kZXJlci0+bm9kZSgpLT5yZW5kZXJlcigpOworCiAg
ICAgLy8gYWJzb2x1dGVGb2N1c1JpbmdRdWFkcyB3aWxsIHF1ZXJ5IHRoZSBoaWVyYXJjaHkgYmVs
b3cgdGhpcyBlbGVtZW50LCB3aGljaCBmb3IgbGFyZ2Ugd2VicGFnZXMgY2FuIGJlIHZlcnkgc2xv
dy4KICAgICAvLyBGb3IgYSB3ZWIgYXJlYSwgd2hpY2ggd2lsbCBoYXZlIHRoZSBtb3N0IGVsZW1l
bnRzIG9mIGFueSBlbGVtZW50LCBhYnNvbHV0ZVF1YWRzIHNob3VsZCBiZSB1c2VkLgogICAgIC8v
IFdlIHNob3VsZCBhbHNvIHVzZSBhYnNvbHV0ZVF1YWRzIGZvciBTVkcgZWxlbWVudHMsIG90aGVy
d2lzZSB0cmFuc2Zvcm1zIHdvbid0IGJlIGFwcGxpZWQuCiAgICAgVmVjdG9yPEZsb2F0UXVhZD4g
cXVhZHM7CiAgICAgYm9vbCBpc1NWR1Jvb3QgPSBmYWxzZTsKIAotICAgIGlmIChvYmotPmlzUmVu
ZGVyT3JMZWdhY3lSZW5kZXJTVkdSb290KCkpCisgICAgaWYgKHJlbmRlcmVyLT5pc1JlbmRlck9y
TGVnYWN5UmVuZGVyU1ZHUm9vdCgpKQogICAgICAgICBpc1NWR1Jvb3QgPSB0cnVlOwogCi0gICAg
aWYgKGlzPFJlbmRlclRleHQ+KCpvYmopKQotICAgICAgICBxdWFkcyA9IGRvd25jYXN0PFJlbmRl
clRleHQ+KCpvYmopLmFic29sdXRlUXVhZHNDbGlwcGVkVG9FbGxpcHNpcygpOworICAgIGlmIChh
dXRvKiByZW5kZXJUZXh0ID0gZHluYW1pY0Rvd25jYXN0PFJlbmRlclRleHQ+KCpyZW5kZXJlcikp
CisgICAgICAgIHF1YWRzID0gcmVuZGVyVGV4dC0+YWJzb2x1dGVRdWFkc0NsaXBwZWRUb0VsbGlw
c2lzKCk7CiAgICAgZWxzZSBpZiAoaXNXZWJBcmVhKCkgfHwgaXNTVkdSb290KQotICAgICAgICBv
YmotPmFic29sdXRlUXVhZHMocXVhZHMpOworICAgICAgICByZW5kZXJlci0+YWJzb2x1dGVRdWFk
cyhxdWFkcyk7CiAgICAgZWxzZQotICAgICAgICBvYmotPmFic29sdXRlRm9jdXNSaW5nUXVhZHMo
cXVhZHMpOwotICAgIAotICAgIExheW91dFJlY3QgcmVzdWx0ID0gYm91bmRpbmdCb3hGb3JRdWFk
cyhvYmosIHF1YWRzKTsKKyAgICAgICAgcmVuZGVyZXItPmFic29sdXRlRm9jdXNSaW5nUXVhZHMo
cXVhZHMpOworCisgICAgTGF5b3V0UmVjdCByZXN1bHQgPSBib3VuZGluZ0JveEZvclF1YWRzKHJl
bmRlcmVyLmdldCgpLCBxdWFkcyk7CiAKICAgICBEb2N1bWVudCogZG9jdW1lbnQgPSB0aGlzLT5k
b2N1bWVudCgpOwogICAgIGlmIChkb2N1bWVudCAmJiBkb2N1bWVudC0+aXNTVkdEb2N1bWVudCgp
KQogICAgICAgICBvZmZzZXRCb3VuZGluZ0JveEZvclJlbW90ZVNWR0VsZW1lbnQocmVzdWx0KTsK
LSAgICAKKwogICAgIC8vIFRoZSBzaXplIG9mIHRoZSB3ZWIgYXJlYSBzaG91bGQgYmUgdGhlIGNv
bnRlbnQgc2l6ZSwgbm90IHRoZSBjbGlwcGVkIHNpemUuCiAgICAgaWYgKGlzV2ViQXJlYSgpKQot
ICAgICAgICByZXN1bHQuc2V0U2l6ZShvYmotPnZpZXcoKS5mcmFtZVZpZXcoKS5jb250ZW50c1Np
emUoKSk7Ci0gICAgCisgICAgICAgIHJlc3VsdC5zZXRTaXplKHJlbmRlcmVyLT52aWV3KCkuZnJh
bWVWaWV3KCkuY29udGVudHNTaXplKCkpOworCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAt
ODc3LDEyICs4ODYsMTUgQEAgYm9vbCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzdXBwb3J0
c1BhdGgoKSBjb25zdAogCiBQYXRoIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmVsZW1lbnRQ
YXRoKCkgY29uc3QKIHsKLSAgICBpZiAoaXM8UmVuZGVyVGV4dD4ocmVuZGVyZXIoKSkpIHsKKyAg
ICBpZiAoIW1fcmVuZGVyZXIpCisgICAgICAgIHJldHVybiBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVj
dDo6ZWxlbWVudFBhdGgoKTsKKworICAgIGlmIChhdXRvKiByZW5kZXJUZXh0ID0gZHluYW1pY0Rv
d25jYXN0PFJlbmRlclRleHQ+KCptX3JlbmRlcmVyKSkgewogICAgICAgICBWZWN0b3I8TGF5b3V0
UmVjdD4gcmVjdHM7Ci0gICAgICAgIGRvd25jYXN0PFJlbmRlclRleHQ+KCptX3JlbmRlcmVyKS5i
b3VuZGluZ1JlY3RzKHJlY3RzLCBmbG9vcmVkTGF5b3V0UG9pbnQobV9yZW5kZXJlci0+bG9jYWxU
b0Fic29sdXRlKCkpKTsKKyAgICAgICAgcmVuZGVyVGV4dC0+Ym91bmRpbmdSZWN0cyhyZWN0cywg
Zmxvb3JlZExheW91dFBvaW50KG1fcmVuZGVyZXItPmxvY2FsVG9BYnNvbHV0ZSgpKSk7CiAgICAg
ICAgIC8vIElmIG9ubHkgMSByZWN0LCBkb24ndCBjb21wdXRlIHBhdGggc2luY2UgdGhlIGJvdW5k
aW5nIHJlY3Qgd2lsbCBiZSBnb29kIGVub3VnaC4KICAgICAgICAgaWYgKHJlY3RzLnNpemUoKSA8
IDIpCi0gICAgICAgICAgICByZXR1cm4gUGF0aCgpOworICAgICAgICAgICAgcmV0dXJuIHsgfTsK
IAogICAgICAgICAvLyBDb21wdXRlIHRoZSBwYXRoIG9ubHkgaWYgdGhpcyBpcyB0aGUgbGFzdCBw
YXJ0IG9mIGEgbGluZSBmb2xsb3dlZCBieSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IGxpbmUu
CiAgICAgICAgIGNvbnN0IGF1dG8mIHN0eWxlID0gbV9yZW5kZXJlci0+c3R5bGUoKTsKQEAgLTkw
Miw3ICs5MTQsNyBAQCBQYXRoIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmVsZW1lbnRQYXRo
KCkgY29uc3QKICAgICAgICAgICAgIHVuaW9uUmVjdC51bml0ZShyZWN0c1tpXSk7CiAgICAgICAg
IH0KICAgICAgICAgaWYgKCFuZWVkc1BhdGgpCi0gICAgICAgICAgICByZXR1cm4gUGF0aCgpOwor
ICAgICAgICAgICAgcmV0dXJuIHsgfTsKIAogICAgICAgICBmbG9hdCBvdXRsaW5lT2Zmc2V0ID0g
c3R5bGUub3V0bGluZU9mZnNldCgpOwogICAgICAgICBmbG9hdCBkZXZpY2VTY2FsZUZhY3RvciA9
IG1fcmVuZGVyZXItPmRvY3VtZW50KCkuZGV2aWNlU2NhbGVGYWN0b3IoKTsKQEAgLTkxNSw4ICs5
MjcsOCBAQCBQYXRoIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmVsZW1lbnRQYXRoKCkgY29u
c3QKICAgICAgICAgcmV0dXJuIFBhdGhVdGlsaXRpZXM6OnBhdGhXaXRoU2hyaW5rV3JhcHBlZFJl
Y3RzKHBpeGVsU25hcHBlZFJlY3RzLCAwKTsKICAgICB9CiAKLSAgICBpZiAoaXM8TGVnYWN5UmVu
ZGVyU1ZHU2hhcGU+KHJlbmRlcmVyKCkpICYmIGRvd25jYXN0PExlZ2FjeVJlbmRlclNWR1NoYXBl
PigqbV9yZW5kZXJlcikuaGFzUGF0aCgpKSB7Ci0gICAgICAgIFBhdGggcGF0aCA9IGRvd25jYXN0
PExlZ2FjeVJlbmRlclNWR1NoYXBlPigqbV9yZW5kZXJlcikucGF0aCgpOworICAgIGlmIChhdXRv
KiByZW5kZXJTVkdTaGFwZSA9IGR5bmFtaWNEb3duY2FzdDxMZWdhY3lSZW5kZXJTVkdTaGFwZT4o
Km1fcmVuZGVyZXIpOyByZW5kZXJTVkdTaGFwZSAmJiByZW5kZXJTVkdTaGFwZS0+aGFzUGF0aCgp
KSB7CisgICAgICAgIFBhdGggcGF0aCA9IHJlbmRlclNWR1NoYXBlLT5wYXRoKCk7CiAKICAgICAg
ICAgYXV0byogY2FjaGUgPSBheE9iamVjdENhY2hlKCk7CiAgICAgICAgIGlmICghY2FjaGUpCkBA
IC05MzIsOCArOTQ0LDggQEAgUGF0aCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjplbGVtZW50
UGF0aCgpIGNvbnN0CiAgICAgfQogCiAjaWYgRU5BQkxFKExBWUVSX0JBU0VEX1NWR19FTkdJTkUp
Ci0gICAgaWYgKGlzPFJlbmRlclNWR1NoYXBlPihyZW5kZXJlcigpKSAmJiBkb3duY2FzdDxSZW5k
ZXJTVkdTaGFwZT4oKm1fcmVuZGVyZXIpLmhhc1BhdGgoKSkgewotICAgICAgICBQYXRoIHBhdGgg
PSBkb3duY2FzdDxSZW5kZXJTVkdTaGFwZT4oKm1fcmVuZGVyZXIpLnBhdGgoKTsKKyAgICBpZiAo
YXV0byogcmVuZGVyU1ZHU2hhcGUgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyU1ZHU2hhcGU+KCpt
X3JlbmRlcmVyKTsgcmVuZGVyU1ZHU2hhcGUgJiYgcmVuZGVyU1ZHU2hhcGUtPmhhc1BhdGgoKSkg
eworICAgICAgICBQYXRoIHBhdGggPSByZW5kZXJTVkdTaGFwZS0+cGF0aCgpOwogCiAgICAgICAg
IGF1dG8qIGNhY2hlID0gYXhPYmplY3RDYWNoZSgpOwogICAgICAgICBpZiAoIWNhY2hlKQpAQCAt
OTQ4LDcgKzk2MCw3IEBAIFBhdGggQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZWxlbWVudFBh
dGgoKSBjb25zdAogICAgIH0KICNlbmRpZgogCi0gICAgcmV0dXJuIFBhdGgoKTsKKyAgICByZXR1
cm4geyB9OwogfQogCiAjaWYgRU5BQkxFKEFQUExFX1BBWSkKQEAgLTEyMTAsNyArMTIyMiw3IEBA
IGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6Y29tcHV0ZUFjY2Vzc2liaWxpdHlJc0ln
bm9yZWQoKSBjb25zdAogCiAgICAgICAgIC8vIHdlYmtpdC5vcmcvYi8xNzM4NzAgLSBJZiBhbiBp
bWFnZSBoYXMgb3RoZXIgYWx0ZXJuYXRpdmUgdGV4dCwgZG9uJ3QgaWdub3JlIGl0IGlmIGFsdCB0
ZXh0IGlzIGVtcHR5LgogICAgICAgICAvLyBUaGlzIG1lYW5zIHdlIHNob3VsZCBwcm9jZXNzIHRp
dGxlIGFuZCBhcmlhLWxhYmVsIGZpcnN0LgotICAgICAgICAKKwogICAgICAgICAvLyBJZiBhbiBp
bWFnZSBoYXMgdGhlIHRpdGxlIG9yIGxhYmVsIGF0dHJpYnV0ZXMsIGFjY2Vzc2liaWxpdHkgc2hv
dWxkIGJlIGxlbmllbnQgYW5kIGFsbG93IGl0IHRvIGFwcGVhciBpbiB0aGUgaGllcmFyY2h5IChh
Y2NvcmRpbmcgdG8gV0FJLUFSSUEpLgogICAgICAgICBpZiAoIWdldEF0dHJpYnV0ZSh0aXRsZUF0
dHIpLmlzRW1wdHkoKSB8fCAhZ2V0QXR0cmlidXRlKGFyaWFfbGFiZWxBdHRyKS5pc0VtcHR5KCkp
CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMjE4LDkgKzEyMzAsOSBAQCBib29sIEFj
Y2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmNvbXB1dGVBY2Nlc3NpYmlsaXR5SXNJZ25vcmVkKCkg
Y29uc3QKICAgICAgICAgLy8gRmlyc3QgY2hlY2sgdGhlIFJlbmRlckltYWdlJ3MgYWx0VGV4dCAo
d2hpY2ggY2FuIGJlIHNldCB0aHJvdWdoIGEgc3R5bGUgc2hlZXQsIG9yIGNvbWUgZnJvbSB0aGUg
RWxlbWVudCkuCiAgICAgICAgIC8vIEhvd2V2ZXIsIGlmIHRoaXMgaXMgbm90IGEgbmF0aXZlIGlt
YWdlLCBmYWxsYmFjayB0byB0aGUgYXR0cmlidXRlIG9uIHRoZSBFbGVtZW50LgogICAgICAgICBB
Y2Nlc3NpYmlsaXR5T2JqZWN0SW5jbHVzaW9uIGFsdFRleHRJbmNsdXNpb24gPSBBY2Nlc3NpYmls
aXR5T2JqZWN0SW5jbHVzaW9uOjpEZWZhdWx0QmVoYXZpb3I7Ci0gICAgICAgIGJvb2wgaXNSZW5k
ZXJJbWFnZSA9IGlzPFJlbmRlckltYWdlPihyZW5kZXJlcigpKTsKLSAgICAgICAgaWYgKGlzUmVu
ZGVySW1hZ2UpCi0gICAgICAgICAgICBhbHRUZXh0SW5jbHVzaW9uID0gb2JqZWN0SW5jbHVzaW9u
RnJvbUFsdFRleHQoZG93bmNhc3Q8UmVuZGVySW1hZ2U+KCptX3JlbmRlcmVyKS5hbHRUZXh0KCkp
OworICAgICAgICBXZWFrUHRyIGltYWdlID0gZHluYW1pY0Rvd25jYXN0PFJlbmRlckltYWdlPigq
bV9yZW5kZXJlcik7CisgICAgICAgIGlmIChpbWFnZSkKKyAgICAgICAgICAgIGFsdFRleHRJbmNs
dXNpb24gPSBvYmplY3RJbmNsdXNpb25Gcm9tQWx0VGV4dChpbWFnZS0+YWx0VGV4dCgpKTsKICAg
ICAgICAgZWxzZQogICAgICAgICAgICAgYWx0VGV4dEluY2x1c2lvbiA9IG9iamVjdEluY2x1c2lv
bkZyb21BbHRUZXh0KGdldEF0dHJpYnV0ZShhbHRBdHRyKS5zdHJpbmcoKSk7CiAKQEAgLTEyMjks
MTUgKzEyNDEsMTQgQEAgYm9vbCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpjb21wdXRlQWNj
ZXNzaWJpbGl0eUlzSWdub3JlZCgpIGNvbnN0CiAgICAgICAgIGlmIChhbHRUZXh0SW5jbHVzaW9u
ID09IEFjY2Vzc2liaWxpdHlPYmplY3RJbmNsdXNpb246OkluY2x1ZGVPYmplY3QpCiAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CiAKLSAgICAgICAgaWYgKGlzUmVuZGVySW1hZ2UpIHsKKyAgICAg
ICAgaWYgKGltYWdlKSB7CiAgICAgICAgICAgICAvLyBjaGVjayBmb3Igb25lLWRpbWVuc2lvbmFs
IGltYWdlCi0gICAgICAgICAgICBSZW5kZXJJbWFnZSYgaW1hZ2UgPSBkb3duY2FzdDxSZW5kZXJJ
bWFnZT4oKm1fcmVuZGVyZXIpOwotICAgICAgICAgICAgaWYgKGltYWdlLmhlaWdodCgpIDw9IDEg
fHwgaW1hZ2Uud2lkdGgoKSA8PSAxKQorICAgICAgICAgICAgaWYgKGltYWdlLT5oZWlnaHQoKSA8
PSAxIHx8IGltYWdlLT53aWR0aCgpIDw9IDEpCiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7
CiAKICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgcmVuZGVyZWQgaW1hZ2Ugd2FzIHN0cmV0
Y2hlZCBmcm9tIG9uZS1kaW1lbnNpb25hbCBmaWxlIGltYWdlCi0gICAgICAgICAgICBpZiAoaW1h
Z2UuY2FjaGVkSW1hZ2UoKSkgewotICAgICAgICAgICAgICAgIExheW91dFNpemUgaW1hZ2VTaXpl
ID0gaW1hZ2UuY2FjaGVkSW1hZ2UoKS0+aW1hZ2VTaXplRm9yUmVuZGVyZXIoJmltYWdlLCBpbWFn
ZS52aWV3KCkuem9vbUZhY3RvcigpKTsKKyAgICAgICAgICAgIGlmIChpbWFnZS0+Y2FjaGVkSW1h
Z2UoKSkgeworICAgICAgICAgICAgICAgIExheW91dFNpemUgaW1hZ2VTaXplID0gaW1hZ2UtPmNh
Y2hlZEltYWdlKCktPmltYWdlU2l6ZUZvclJlbmRlcmVyKGltYWdlLmdldCgpLCBpbWFnZS0+dmll
dygpLnpvb21GYWN0b3IoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGltYWdlU2l6ZS5oZWln
aHQoKSA8PSAxIHx8IGltYWdlU2l6ZS53aWR0aCgpIDw9IDE7CiAgICAgICAgICAgICB9CiAgICAg
ICAgIH0KQEAgLTEyODAsMTcgKzEyOTEsMTcgQEAgYm9vbCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0Ojpjb21wdXRlQWNjZXNzaWJpbGl0eUlzSWdub3JlZCgpIGNvbnN0CiAgICAgaWYgKGlzTWF0
aEVsZW1lbnQoKSkKICAgICAgICAgcmV0dXJuIGZhbHNlOwogI2VuZGlmCi0gICAgCi0gICAgaWYg
KGlzPFJlbmRlckJsb2NrRmxvdz4oKm1fcmVuZGVyZXIpICYmIG1fcmVuZGVyZXItPmNoaWxkcmVu
SW5saW5lKCkgJiYgIWNhblNldEZvY3VzQXR0cmlidXRlKCkpCi0gICAgICAgIHJldHVybiAhZG93
bmNhc3Q8UmVuZGVyQmxvY2tGbG93PigqbV9yZW5kZXJlcikuaGFzTGluZXMoKSAmJiAhbW91c2VC
dXR0b25MaXN0ZW5lcigpOwotICAgIAorCisgICAgV2Vha1B0ciBibG9ja0Zsb3cgPSBkeW5hbWlj
RG93bmNhc3Q8UmVuZGVyQmxvY2tGbG93PigqbV9yZW5kZXJlcik7CisgICAgaWYgKGJsb2NrRmxv
dyAmJiBtX3JlbmRlcmVyLT5jaGlsZHJlbklubGluZSgpICYmICFjYW5TZXRGb2N1c0F0dHJpYnV0
ZSgpKQorICAgICAgICByZXR1cm4gIWJsb2NrRmxvdy0+aGFzTGluZXMoKSAmJiAhbW91c2VCdXR0
b25MaXN0ZW5lcigpOworCiAgICAgaWYgKGlzQ2FudmFzKCkpIHsKICAgICAgICAgaWYgKGNhbnZh
c0hhc0ZhbGxiYWNrQ29udGVudCgpKQogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogCi0gICAg
ICAgIGlmIChpczxSZW5kZXJCb3g+KCptX3JlbmRlcmVyKSkgewotICAgICAgICAgICAgYXV0byYg
Y2FudmFzQm94ID0gZG93bmNhc3Q8UmVuZGVyQm94PigqbV9yZW5kZXJlcik7Ci0gICAgICAgICAg
ICBpZiAoY2FudmFzQm94LmhlaWdodCgpIDw9IDEgfHwgY2FudmFzQm94LndpZHRoKCkgPD0gMSkK
KyAgICAgICAgaWYgKFdlYWtQdHIgY2FudmFzQm94ID0gZHluYW1pY0Rvd25jYXN0PFJlbmRlckJv
eD4oKm1fcmVuZGVyZXIpKSB7CisgICAgICAgICAgICBpZiAoY2FudmFzQm94LT5oZWlnaHQoKSA8
PSAxIHx8IGNhbnZhc0JveC0+d2lkdGgoKSA8PSAxKQogICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIE90aGVyd2lzZSBmYWxsIHRocm91Z2g7IHVzZSBw
cmVzZW5jZSBvZiBoZWxwIHRleHQsIHRpdGxlLCBvciBkZXNjcmlwdGlvbiB0byBkZWNpZGUuCkBA
IC0xMzY0LDkgKzEzNzUsOCBAQCBib29sIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmNvbXB1
dGVBY2Nlc3NpYmlsaXR5SXNJZ25vcmVkKCkgY29uc3QKIAogaW50IEFjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3Q6OmxheW91dENvdW50KCkgY29uc3QKIHsKLSAgICBpZiAoIW1fcmVuZGVyZXIgfHwg
IWlzPFJlbmRlclZpZXc+KCptX3JlbmRlcmVyKSkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgcmV0
dXJuIGRvd25jYXN0PFJlbmRlclZpZXc+KCptX3JlbmRlcmVyKS5mcmFtZVZpZXcoKS5sYXlvdXRD
b250ZXh0KCkubGF5b3V0Q291bnQoKTsKKyAgICBhdXRvKiB2aWV3ID0gZHluYW1pY0Rvd25jYXN0
PFJlbmRlclZpZXc+KG1fcmVuZGVyZXIuZ2V0KCkpOworICAgIHJldHVybiB2aWV3ID8gdmlldy0+
ZnJhbWVWaWV3KCkubGF5b3V0Q29udGV4dCgpLmxheW91dENvdW50KCkgOiAwOwogfQogCiBDaGFy
YWN0ZXJSYW5nZSBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpkb2N1bWVudEJhc2VkU2VsZWN0
ZWRUZXh0UmFuZ2UoKSBjb25zdApAQCAtMTM5MCwxMiArMTQwMCwxMiBAQCBTdHJpbmcgQWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdDo6c2VsZWN0ZWRUZXh0KCkgY29uc3QKICAgICAKICAgICBpZiAo
aXNTZWN1cmVGaWVsZCgpKQogICAgICAgICByZXR1cm4gU3RyaW5nKCk7IC8vIG5lZWQgdG8gcmV0
dXJuIHNvbWV0aGluZyBkaXN0aW5jdCBmcm9tIGVtcHR5IHN0cmluZwotICAgIAorCiAgICAgaWYg
KGlzTmF0aXZlVGV4dENvbnRyb2woKSkgewotICAgICAgICBIVE1MVGV4dEZvcm1Db250cm9sRWxl
bWVudCYgdGV4dENvbnRyb2wgPSBkb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVy
ZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKKyAgICAgICAgYXV0byYgdGV4dENvbnRyb2wg
PSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVyZXIpLnRleHRG
b3JtQ29udHJvbEVsZW1lbnQoKTsKICAgICAgICAgcmV0dXJuIHRleHRDb250cm9sLnNlbGVjdGVk
VGV4dCgpOwogICAgIH0KLSAgICAKKwogICAgIHJldHVybiBkb0FYU3RyaW5nRm9yUmFuZ2UoZG9j
dW1lbnRCYXNlZFNlbGVjdGVkVGV4dFJhbmdlKCkpOwogfQogCkBAIC0xNDA4LDcgKzE0MTgsNyBA
QCBDaGFyYWN0ZXJSYW5nZSBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzZWxlY3RlZFRleHRS
YW5nZSgpIGNvbnN0CiAKICAgICAvLyBVc2UgdGhlIHRleHQgY29udHJvbCBuYXRpdmUgcmFuZ2Ug
aWYgaXQncyBhIG5hdGl2ZSBvYmplY3QuCiAgICAgaWYgKGlzTmF0aXZlVGV4dENvbnRyb2woKSkg
ewotICAgICAgICBhdXRvJiB0ZXh0Q29udHJvbCA9IGRvd25jYXN0PFJlbmRlclRleHRDb250cm9s
PigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpOworICAgICAgICBhdXRvJiB0
ZXh0Q29udHJvbCA9IHVuY2hlY2tlZERvd25jYXN0PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5k
ZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpOwogICAgICAgICByZXR1cm4geyB0ZXh0Q29u
dHJvbC5zZWxlY3Rpb25TdGFydCgpLCB0ZXh0Q29udHJvbC5zZWxlY3Rpb25FbmQoKSAtIHRleHRD
b250cm9sLnNlbGVjdGlvblN0YXJ0KCkgfTsKICAgICB9CiAKQEAgLTE0ODMsNyArMTQ5Myw3IEBA
IGludCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjppbnNlcnRpb25Qb2ludExpbmVOdW1iZXIo
KSBjb25zdAogCiAgICAgLy8gVXNlIHRoZSB0ZXh0IGNvbnRyb2wgbmF0aXZlIHJhbmdlIGlmIGl0
J3MgYSBuYXRpdmUgb2JqZWN0LgogICAgIGlmIChpc05hdGl2ZVRleHRDb250cm9sKCkpIHsKLSAg
ICAgICAgYXV0byYgdGV4dENvbnRyb2wgPSBkb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1f
cmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKKyAgICAgICAgYXV0byYgdGV4dENv
bnRyb2wgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVyZXIp
LnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKICAgICAgICAgaW50IHN0YXJ0ID0gdGV4dENvbnRy
b2wuc2VsZWN0aW9uU3RhcnQoKTsKICAgICAgICAgaW50IGVuZCA9IHRleHRDb250cm9sLnNlbGVj
dGlvbkVuZCgpOwogCkBAIC0xNTMzLDcgKzE1NDMsNyBAQCB2b2lkIEFjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3Q6OnNldFNlbGVjdGVkVGV4dFJhbmdlKENoYXJhY3RlclJhbmdlJiYgcmFuZ2UpCiAg
ICAgICAgIGNsaWVudC0+d2lsbENoYW5nZVNlbGVjdGlvbkZvckFjY2Vzc2liaWxpdHkoKTsKIAog
ICAgIGlmIChpc05hdGl2ZVRleHRDb250cm9sKCkpIHsKLSAgICAgICAgSFRNTFRleHRGb3JtQ29u
dHJvbEVsZW1lbnQmIHRleHRDb250cm9sID0gZG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCpt
X3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7CisgICAgICAgIGF1dG8mIHRleHRD
b250cm9sID0gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVy
KS50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7CiAgICAgICAgIHRleHRDb250cm9sLnNldFNlbGVj
dGlvblJhbmdlKHJhbmdlLmxvY2F0aW9uLCByYW5nZS5sb2NhdGlvbiArIHJhbmdlLmxlbmd0aCk7
CiAgICAgfSBlbHNlIGlmIChtX3JlbmRlcmVyKSB7CiAgICAgICAgIEFTU0VSVChub2RlKCkpOwpA
QCAtMTY1Niw4ICsxNjY2LDggQEAgQVhDb3JlT2JqZWN0OjpBY2Nlc3NpYmlsaXR5Q2hpbGRyZW5W
ZWN0b3IgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZG9jdW1lbnRMaW4KICAgICAgICAgICAg
ICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBXZSBjb3VsZG4ndCByZXRyaWV2
ZSB0aGUgYWxyZWFkeSBleGlzdGluZyBpbWFnZS1tYXAgbGlua3MgZnJvbSB0aGUgcGFyZW50IGlt
YWdlLCBzbyBjcmVhdGUgYSBuZXcgb25lLgogICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTk9U
X1JFQUNIRUQoIlVuZXhwZWN0ZWRseSBtaXNzaW5nIGltYWdlLW1hcCBsaW5rIHBhcmVudCBBWCBv
YmplY3QuIik7Ci0gICAgICAgICAgICAgICAgICAgIGF1dG8mIGFyZWFPYmplY3QgPSBkb3duY2Fz
dDxBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rPigqYXhPYmplY3RDYWNoZSgpLT5jcmVhdGUoQWNj
ZXNzaWJpbGl0eVJvbGU6OkltYWdlTWFwTGluaykpOwotICAgICAgICAgICAgICAgICAgICBhcmVh
T2JqZWN0LnNldEhUTUxBcmVhRWxlbWVudChkb3duY2FzdDxIVE1MQXJlYUVsZW1lbnQ+KGN1cnJl
bnQpKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byYgYXJlYU9iamVjdCA9IHVuY2hlY2tlZERv
d25jYXN0PEFjY2Vzc2liaWxpdHlJbWFnZU1hcExpbms+KCpheE9iamVjdENhY2hlKCktPmNyZWF0
ZShBY2Nlc3NpYmlsaXR5Um9sZTo6SW1hZ2VNYXBMaW5rKSk7CisgICAgICAgICAgICAgICAgICAg
IGFyZWFPYmplY3Quc2V0SFRNTEFyZWFFbGVtZW50KHVuY2hlY2tlZERvd25jYXN0PEhUTUxBcmVh
RWxlbWVudD4oY3VycmVudCkpOwogICAgICAgICAgICAgICAgICAgICBhcmVhT2JqZWN0LnNldEhU
TUxNYXBFbGVtZW50KHBhcmVudE1hcCk7CiAgICAgICAgICAgICAgICAgICAgIGFyZWFPYmplY3Qu
c2V0UGFyZW50KGFjY2Vzc2liaWxpdHlQYXJlbnRGb3JJbWFnZU1hcChwYXJlbnRNYXApKTsKICAg
ICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgmYXJlYU9iamVjdCk7CkBAIC0xNjgxLDE0
ICsxNjkxLDE1IEBAIFdpZGdldCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6d2lkZ2V0Rm9y
QXR0YWNobWVudFZpZXcoKSBjb25zdAogewogICAgIGlmICghaXNBdHRhY2htZW50KCkpCiAgICAg
ICAgIHJldHVybiBudWxscHRyOwotICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJXaWRnZXQ+KCpt
X3JlbmRlcmVyKS53aWRnZXQoKTsKKyAgICBhdXRvKiByZW5kZXJXaWRnZXQgPSBkeW5hbWljRG93
bmNhc3Q8UmVuZGVyV2lkZ2V0PigqbV9yZW5kZXJlcik7CisgICAgcmV0dXJuIHJlbmRlcldpZGdl
dCA/IHJlbmRlcldpZGdldC0+d2lkZ2V0KCkgOiBudWxscHRyOwogfQogCiBWaXNpYmxlUG9zaXRp
b24gQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6dmlzaWJsZVBvc2l0aW9uRm9ySW5kZXgoaW50
IGluZGV4KSBjb25zdAogewogICAgIGlmIChtX3JlbmRlcmVyKSB7CiAgICAgICAgIGlmIChpc05h
dGl2ZVRleHRDb250cm9sKCkpIHsKLSAgICAgICAgICAgIGF1dG8mIHRleHRDb250cm9sID0gZG93
bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRyb2xFbGVt
ZW50KCk7CisgICAgICAgICAgICBhdXRvJiB0ZXh0Q29udHJvbCA9IHVuY2hlY2tlZERvd25jYXN0
PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgp
OwogICAgICAgICAgICAgcmV0dXJuIHRleHRDb250cm9sLnZpc2libGVQb3NpdGlvbkZvckluZGV4
KHN0ZDo6Y2xhbXAoaW5kZXgsIDAsIHN0YXRpY19jYXN0PGludD4odGV4dENvbnRyb2wudmFsdWUo
KS5sZW5ndGgoKSkpKTsKICAgICAgICAgfQogCkBAIC0xNzAyLDcgKzE3MTMsNyBAQCBpbnQgQWNj
ZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6aW5kZXhGb3JWaXNpYmxlUG9zaXRpb24oY29uc3QgVmlz
aWJsZVBvc2l0aW9uJiBwbwogewogICAgIGlmIChtX3JlbmRlcmVyKSB7CiAgICAgICAgIGlmIChp
c05hdGl2ZVRleHRDb250cm9sKCkpCi0gICAgICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVy
VGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCkuaW5kZXhG
b3JWaXNpYmxlUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgcmV0dXJuIHVuY2hlY2tl
ZERvd25jYXN0PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9s
RWxlbWVudCgpLmluZGV4Rm9yVmlzaWJsZVBvc2l0aW9uKHBvc2l0aW9uKTsKIAogICAgICAgICBp
ZiAoIWFsbG93c1RleHRSYW5nZXMoKSAmJiAhaXM8UmVuZGVyVGV4dD4oKm1fcmVuZGVyZXIpKQog
ICAgICAgICAgICAgcmV0dXJuIDA7CkBAIC0xNzc3LDcgKzE3ODgsNyBAQCB2b2lkIEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3Q6OnNldFNlbGVjdGVkVmlzaWJsZVBvc2l0aW9uUmFuZ2UoY29uc3Qg
VmlzaWJsZVBvcwogICAgIGlmIChpc05hdGl2ZVRleHRDb250cm9sKCkpIHsKICAgICAgICAgLy8g
aXNOYXRpdmVUZXh0Q29udHJvbCByZXR1cm5zIHRydWUgb25seSBpZiB0aGlzLT5ub2RlKCkgaXM8
SFRNTFRleHRBcmVhRWxlbWVudD4gb3IgaXM8SFRNTElucHV0RWxlbWVudD4uCiAgICAgICAgIC8v
IFNpbmNlIGJvdGggSFRNTFRleHRBcmVhRWxlbWVudCBhbmQgSFRNTElucHV0RWxlbWVudCBkZXJp
dmUgZnJvbSBIVE1MVGV4dEZvcm1Db250cm9sRWxlbWVudCwgaXQgaXMgc2FmZSB0byBkb3duY2Fz
dCBoZXJlLgotICAgICAgICBhdXRvKiB0ZXh0Q29udHJvbCA9IGRvd25jYXN0PEhUTUxUZXh0Rm9y
bUNvbnRyb2xFbGVtZW50Pihub2RlKCkpOworICAgICAgICBhdXRvKiB0ZXh0Q29udHJvbCA9IHVu
Y2hlY2tlZERvd25jYXN0PEhUTUxUZXh0Rm9ybUNvbnRyb2xFbGVtZW50Pihub2RlKCkpOwogICAg
ICAgICBpbnQgc3RhcnQgPSB0ZXh0Q29udHJvbC0+aW5kZXhGb3JWaXNpYmxlUG9zaXRpb24ocmFu
Z2Uuc3RhcnQpOwogICAgICAgICBpbnQgZW5kID0gdGV4dENvbnRyb2wtPmluZGV4Rm9yVmlzaWJs
ZVBvc2l0aW9uKHJhbmdlLmVuZCk7CiAKQEAgLTIwMDcsMTQgKzIwMTgsMTQgQEAgQWNjZXNzaWJp
bGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6YWNjZXNzaWJpbGl0eUhpdFRl
c3QoY29uc3QgSW50UG8KIHsKICAgICBpZiAoIW1fcmVuZGVyZXIgfHwgIW1fcmVuZGVyZXItPmhh
c0xheWVyKCkpCiAgICAgICAgIHJldHVybiBudWxscHRyOwotICAgIAorCiAgICAgbV9yZW5kZXJl
ci0+ZG9jdW1lbnQoKS51cGRhdGVMYXlvdXQoKTsKIAogICAgIGlmICghbV9yZW5kZXJlciB8fCAh
bV9yZW5kZXJlci0+aGFzTGF5ZXIoKSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBS
ZW5kZXJMYXllciogbGF5ZXIgPSBkb3duY2FzdDxSZW5kZXJCb3g+KCptX3JlbmRlcmVyKS5sYXll
cigpOwotICAgICAKKyAgICBhdXRvKiBsYXllciA9IHVuY2hlY2tlZERvd25jYXN0PFJlbmRlckJv
eD4oKm1fcmVuZGVyZXIpLmxheWVyKCk7CisKICAgICBjb25zdGV4cHIgT3B0aW9uU2V0PEhpdFRl
c3RSZXF1ZXN0OjpUeXBlPiBoaXRUeXBlIHsgSGl0VGVzdFJlcXVlc3Q6OlR5cGU6OlJlYWRPbmx5
LCBIaXRUZXN0UmVxdWVzdDo6VHlwZTo6QWN0aXZlLCBIaXRUZXN0UmVxdWVzdDo6VHlwZTo6QWNj
ZXNzaWJpbGl0eUhpdFRlc3QgfTsKICAgICBIaXRUZXN0UmVzdWx0IGhpdFRlc3RSZXN1bHQgeyBw
b2ludCB9OwogICAgIGxheWVyLT5oaXRUZXN0KGhpdFR5cGUsIGhpdFRlc3RSZXN1bHQpOwpAQCAt
MjI5MCw3ICsyMzAxLDcgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjphZGRJbWFn
ZU1hcENoaWxkcmVuKCkKICAgICAgICAgLy8gYWRkIGFuIDxhcmVhPiBlbGVtZW50IGZvciB0aGlz
IGNoaWxkIGlmIGl0IGhhcyBhIGxpbmsKICAgICAgICAgaWYgKCFhcmVhLmlzTGluaygpKQogICAg
ICAgICAgICAgY29udGludWU7Ci0gICAgICAgIGF1dG8mIGFyZWFPYmplY3QgPSBkb3duY2FzdDxB
Y2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rPigqYXhPYmplY3RDYWNoZSgpLT5jcmVhdGUoQWNjZXNz
aWJpbGl0eVJvbGU6OkltYWdlTWFwTGluaykpOworICAgICAgICBhdXRvJiBhcmVhT2JqZWN0ID0g
dW5jaGVja2VkRG93bmNhc3Q8QWNjZXNzaWJpbGl0eUltYWdlTWFwTGluaz4oKmF4T2JqZWN0Q2Fj
aGUoKS0+Y3JlYXRlKEFjY2Vzc2liaWxpdHlSb2xlOjpJbWFnZU1hcExpbmspKTsKICAgICAgICAg
YXJlYU9iamVjdC5zZXRIVE1MQXJlYUVsZW1lbnQoJmFyZWEpOwogICAgICAgICBhcmVhT2JqZWN0
LnNldEhUTUxNYXBFbGVtZW50KG1hcC5nZXQoKSk7CiAgICAgICAgIGFyZWFPYmplY3Quc2V0UGFy
ZW50KHRoaXMpOwpAQCAtMjMxMSw3ICsyMzIyLDcgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVy
T2JqZWN0OjphZGRUZXh0RmllbGRDaGlsZHJlbigpCiAgICAgaWYgKCFzcGluQnV0dG9uRWxlbWVu
dCkKICAgICAgICAgcmV0dXJuOwogCi0gICAgYXV0byYgYXhTcGluQnV0dG9uID0gZG93bmNhc3Q8
QWNjZXNzaWJpbGl0eVNwaW5CdXR0b24+KCpheE9iamVjdENhY2hlKCktPmNyZWF0ZShBY2Nlc3Np
YmlsaXR5Um9sZTo6U3BpbkJ1dHRvbikpOworICAgIGF1dG8mIGF4U3BpbkJ1dHRvbiA9IHVuY2hl
Y2tlZERvd25jYXN0PEFjY2Vzc2liaWxpdHlTcGluQnV0dG9uPigqYXhPYmplY3RDYWNoZSgpLT5j
cmVhdGUoQWNjZXNzaWJpbGl0eVJvbGU6OlNwaW5CdXR0b24pKTsKICAgICBheFNwaW5CdXR0b24u
c2V0U3BpbkJ1dHRvbkVsZW1lbnQoc3BpbkJ1dHRvbkVsZW1lbnQpOwogICAgIGF4U3BpbkJ1dHRv
bi5zZXRQYXJlbnQodGhpcyk7CiAgICAgYWRkQ2hpbGQoJmF4U3BpbkJ1dHRvbik7CkBAIC0yNDk1
LDcgKzI1MDYsNyBAQCBSZW5kZXJPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Om1h
cmtlclJlbmRlcmVyKCkgY29uc3QKICAgICBpZiAoYWNjZXNzaWJpbGl0eUlzSWdub3JlZCgpIHx8
ICFpc0xpc3RJdGVtKCkgfHwgIW1fcmVuZGVyZXIgfHwgIW1fcmVuZGVyZXItPmlzUmVuZGVyTGlz
dEl0ZW0oKSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICByZXR1cm4gZG93bmNhc3Q8
UmVuZGVyTGlzdEl0ZW0+KCptX3JlbmRlcmVyKS5tYXJrZXJSZW5kZXJlcigpOworICAgIHJldHVy
biB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJMaXN0SXRlbT4oKm1fcmVuZGVyZXIpLm1hcmtlclJl
bmRlcmVyKCk7CiB9CiAKIHZvaWQgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6YWRkTGlzdEl0
ZW1NYXJrZXIoKQpAQCAtMjY4NywxMyArMjY5OCwxMSBAQCBTdHJpbmcgQWNjZXNzaWJpbGl0eVJl
bmRlck9iamVjdDo6c2VjdXJlRmllbGRWYWx1ZSgpIGNvbnN0CiAgICAgLy8gTG9vayBmb3IgdGhl
IFJlbmRlclRleHQgb2JqZWN0IGluIHRoZSBSZW5kZXJPYmplY3QgdHJlZSBmb3IgdGhpcyBpbnB1
dCBmaWVsZC4KICAgICBSZW5kZXJPYmplY3QqIHJlbmRlcmVyID0gbm9kZSgpLT5yZW5kZXJlcigp
OwogICAgIHdoaWxlIChyZW5kZXJlciAmJiAhaXM8UmVuZGVyVGV4dD4ocmVuZGVyZXIpKQotICAg
ICAgICByZW5kZXJlciA9IGRvd25jYXN0PFJlbmRlckVsZW1lbnQ+KCpyZW5kZXJlcikuZmlyc3RD
aGlsZCgpOwotCi0gICAgaWYgKCFpczxSZW5kZXJUZXh0PihyZW5kZXJlcikpCi0gICAgICAgIHJl
dHVybiBTdHJpbmcoKTsKKyAgICAgICAgcmVuZGVyZXIgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5k
ZXJFbGVtZW50PigqcmVuZGVyZXIpLmZpcnN0Q2hpbGQoKTsKIAorICAgIGF1dG8qIHJlbmRlclRl
eHQgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyVGV4dD4ocmVuZGVyZXIpOwogICAgIC8vIFJldHVy
biB0aGUgdGV4dCB0aGF0IGlzIGFjdHVhbGx5IGJlaW5nIHJlbmRlcmVkIGluIHRoZSBpbnB1dCBm
aWVsZC4KLSAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVyVGV4dD4oKnJlbmRlcmVyKS50ZXh0V2l0
aG91dENvbnZlcnRpbmdCYWNrc2xhc2hUb1llblN5bWJvbCgpOworICAgIHJldHVybiByZW5kZXJU
ZXh0ID8gcmVuZGVyVGV4dC0+dGV4dFdpdGhvdXRDb252ZXJ0aW5nQmFja3NsYXNoVG9ZZW5TeW1i
b2woKSA6IFN0cmluZygpOwogfQogCiBTY3JvbGxhYmxlQXJlYSogQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6Z2V0U2Nyb2xsYWJsZUFyZWFJZlNjcm9sbGFibGUoKSBjb25zdApkaWZmIC0tZ2l0
IGEvU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldy5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlTY3JvbGxWaWV3
LmNwcAppbmRleCA2YmM4NDFlYmIwNjcuLjJiYmMzMDg3YjlmOCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldy5jcHAKKysrIGIv
U291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldy5jcHAK
QEAgLTQwLDggKzQwLDggQEAgQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXc6OkFjY2Vzc2liaWxpdHlT
Y3JvbGxWaWV3KFNjcm9sbFZpZXcqIHZpZXcpCiAgICAgOiBtX3Njcm9sbFZpZXcodmlldykKICAg
ICAsIG1fY2hpbGRyZW5EaXJ0eShmYWxzZSkKIHsKLSAgICBpZiAoaXM8TG9jYWxGcmFtZVZpZXc+
KHZpZXcpKQotICAgICAgICBtX2ZyYW1lT3duZXJFbGVtZW50ID0gZG93bmNhc3Q8TG9jYWxGcmFt
ZVZpZXc+KCp2aWV3KS5mcmFtZSgpLm93bmVyRWxlbWVudCgpOworICAgIGlmIChhdXRvKiBsb2Nh
bEZyYW1lVmlldyA9IGR5bmFtaWNEb3duY2FzdDxMb2NhbEZyYW1lVmlldz4odmlldykpCisgICAg
ICAgIG1fZnJhbWVPd25lckVsZW1lbnQgPSBsb2NhbEZyYW1lVmlldy0+ZnJhbWUoKS5vd25lckVs
ZW1lbnQoKTsKIH0KIAogQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXc6On5BY2Nlc3NpYmlsaXR5U2Ny
b2xsVmlldygpCkBAIC0xNjMsMTIgKzE2MywxMiBAQCBBY2Nlc3NpYmlsaXR5U2Nyb2xsYmFyKiBB
Y2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6YWRkQ2hpbGRTY3JvbGxiYXIoU2Nyb2xsYmFyKiBzYwog
ewogICAgIGlmICghc2Nyb2xsYmFyKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICAKLSAg
ICBBWE9iamVjdENhY2hlKiBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUoKTsKKworICAgIFdlYWtQdHIg
Y2FjaGUgPSBheE9iamVjdENhY2hlKCk7CiAgICAgaWYgKCFjYWNoZSkKICAgICAgICAgcmV0dXJu
IG51bGxwdHI7CiAKLSAgICBhdXRvJiBzY3JvbGxCYXJPYmplY3QgPSBkb3duY2FzdDxBY2Nlc3Np
YmlsaXR5U2Nyb2xsYmFyPigqY2FjaGUtPmdldE9yQ3JlYXRlKHNjcm9sbGJhcikpOworICAgIGF1
dG8mIHNjcm9sbEJhck9iamVjdCA9IHVuY2hlY2tlZERvd25jYXN0PEFjY2Vzc2liaWxpdHlTY3Jv
bGxiYXI+KCpjYWNoZS0+Z2V0T3JDcmVhdGUoc2Nyb2xsYmFyKSk7CiAgICAgc2Nyb2xsQmFyT2Jq
ZWN0LnNldFBhcmVudCh0aGlzKTsKICAgICBhZGRDaGlsZCgmc2Nyb2xsQmFyT2JqZWN0KTsKICAg
ICByZXR1cm4gJnNjcm9sbEJhck9iamVjdDsKQEAgLTI0MiwyOCArMjQyLDI2IEBAIERvY3VtZW50
KiBBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6ZG9jdW1lbnQoKSBjb25zdAogCiBMb2NhbEZyYW1l
VmlldyogQWNjZXNzaWJpbGl0eVNjcm9sbFZpZXc6OmRvY3VtZW50RnJhbWVWaWV3KCkgY29uc3QK
IHsKLSAgICBpZiAoaXM8TG9jYWxGcmFtZVZpZXc+KG1fc2Nyb2xsVmlldykpCi0gICAgICAgIHJl
dHVybiBkb3duY2FzdDxMb2NhbEZyYW1lVmlldz4obV9zY3JvbGxWaWV3LmdldCgpKTsKKyAgICBp
ZiAoYXV0byogbG9jYWxGcmFtZVZpZXcgPSBkeW5hbWljRG93bmNhc3Q8TG9jYWxGcmFtZVZpZXc+
KG1fc2Nyb2xsVmlldy5nZXQoKSkpCisgICAgICAgIHJldHVybiBsb2NhbEZyYW1lVmlldzsKIAog
ICAgIGlmIChtX2ZyYW1lT3duZXJFbGVtZW50ICYmIG1fZnJhbWVPd25lckVsZW1lbnQtPmNvbnRl
bnREb2N1bWVudCgpKQogICAgICAgICByZXR1cm4gbV9mcmFtZU93bmVyRWxlbWVudC0+Y29udGVu
dERvY3VtZW50KCktPnZpZXcoKTsKLQogICAgIHJldHVybiBudWxscHRyOwogfQogCiBBY2Nlc3Np
YmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6cGFyZW50T2JqZWN0KCkgY29u
c3QKIHsKLSAgICBBWE9iamVjdENhY2hlKiBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUoKTsKKyAgICBX
ZWFrUHRyIGNhY2hlID0gYXhPYmplY3RDYWNoZSgpOwogICAgIGlmICghY2FjaGUpCiAgICAgICAg
IHJldHVybiBudWxscHRyOwogCi0gICAgSFRNTEZyYW1lT3duZXJFbGVtZW50KiBvd25lciA9IG1f
ZnJhbWVPd25lckVsZW1lbnQuZ2V0KCk7Ci0gICAgaWYgKGlzPExvY2FsRnJhbWVWaWV3PihtX3Nj
cm9sbFZpZXcpKQotICAgICAgICBvd25lciA9IGRvd25jYXN0PExvY2FsRnJhbWVWaWV3PigqbV9z
Y3JvbGxWaWV3KS5mcmFtZSgpLm93bmVyRWxlbWVudCgpOwotCi0gICAgaWYgKG93bmVyICYmIG93
bmVyLT5yZW5kZXJlcigpKQotICAgICAgICByZXR1cm4gY2FjaGUtPmdldE9yQ3JlYXRlKG93bmVy
KTsKKyAgICBXZWFrUHRyIG93bmVyID0gbV9mcmFtZU93bmVyRWxlbWVudC5nZXQoKTsKKyAgICBp
ZiAoYXV0byogbG9jYWxGcmFtZVZpZXcgPSBkeW5hbWljRG93bmNhc3Q8TG9jYWxGcmFtZVZpZXc+
KG1fc2Nyb2xsVmlldy5nZXQoKSkpCisgICAgICAgIG93bmVyID0gbG9jYWxGcmFtZVZpZXctPmZy
YW1lKCkub3duZXJFbGVtZW50KCk7CiAKKyAgICBpZiAoY2FjaGUgJiYgb3duZXIgJiYgb3duZXIt
PnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiBjYWNoZS0+Z2V0T3JDcmVhdGUob3duZXIuZ2V0
KCkpOwogICAgIHJldHVybiBudWxscHRyOwogfQogCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>469839</attachid>
            <date>2024-02-12 16:48:47 -0800</date>
            <delta_ts>2024-02-12 21:00:30 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-269199-20240212194846.patch</filename>
            <type>text/plain</type>
            <size>37035</size>
            <attacher name="Andres Gonzalez">andresg_22</attacher>
            
              <data encoding="base64">RnJvbSBjN2VlMTQwZWU1ODY3NGE3NTQ5ODU0NDZiZGMzOGY0ODM0NjFiYjliIE1vbiBTZXAgMTcg
MDA6MDA6MDAgMjAwMQpGcm9tOiBBbmRyZXMgR29uemFsZXogPGFuZHJlc2dfMjJAYXBwbGUuY29t
PgpEYXRlOiBTYXQsIDEwIEZlYiAyMDI0IDE1OjE4OjMwIC0wNTAwClN1YmplY3Q6IFtQQVRDSF0g
QVg6IFJlcGxhY2UgaXM8VD4gZG93bmNhc3Q8VD4gd2l0aCBkeW5hbWljRG93bmNhc3Q8VD4KIHVu
Y2hlY2tlZERvd25jYXN0PFQ+IHdoZW4gYXBwcm9wcmlhdGUgKHBhcnQgMSkuCiBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjY5MTk5IDxyZGFyOi8vcHJvYmxlbS8xMjI4
MDQ3ODU+CgpSZXZpZXdlZCBieSBUeWxlciBXaWxjb2NrLgoKVGhpcyBpcyBhIGZvbGxvdyB1cCB0
byBodHRwczovL2NvbW1pdHMud2Via2l0Lm9yZy8yNzIyOTZAbWFpbi4KCmlzPFQ+IGZvbGxvd2Vk
IGJ5IGRvd25jYXN0PFQ+IGhhcyBhIHBlcmZvcm1hbmNlIGltcGFjdCBzaW5jZSBpdCB0eXBlLWNo
ZWNrcyB0d2ljZS4gSW4gdGhvc2UgY2FzZXMsIHRoZSBjb2RlIGNhbiBiZSB3cml0dGVuIHVzaW5n
IGR5bmFtaWNEb253Y2FzdDxUPi4gSW4gb3RoZXIgY2FzZXMgd2hlcmUgd2UgYXJlIGNlcnRhaW4g
dGhhdCB0aGUgZG93bmNhc3QgaXMgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IHR5cGUsIHdlIHNob3Vs
ZCB1c2UgdW5jaGVja2VkRG93bmNhc3QuIFRoaXMgcGF0Y2ggbWFrZXMgdGhlc2UgY2hhbmdlcyBp
biBzb21lIG9mIHRoZSBhY2Nlc3NpYmlsaXR5IGNvcmUgY29kZS4gTW9yZSBzaW1pbGFyIGNoYW5n
ZXMgaW4gc3Vic2VxdWVudCBwYXRjaGVzLiB0aGlzIHBhdGNoIGFsc28gaW5jbHVkZXMgc29tZSBj
b2RlIGNsZWFudXAgYW5kIG1vcmUgYWRvcHRpb24gb2Ygc21hcnQgcG9pbnRlciB0byByZXBsYWNl
IHJhdyBwb2ludGVycy4KCiogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0LmNwcDoKKFdlYkNvcmU6OmZpcnN0Q2hpbGRJbkNvbnRpbnVhdGlvbik6
CihXZWJDb3JlOjpmaXJzdENoaWxkQ29uc2lkZXJpbmdDb250aW51YXRpb24pOgooV2ViQ29yZTo6
bGFzdENoaWxkQ29uc2lkZXJpbmdDb250aW51YXRpb24pOgooV2ViQ29yZTo6c3RhcnRPZkNvbnRp
bnVhdGlvbnMpOgooV2ViQ29yZTo6ZW5kT2ZDb250aW51YXRpb25zKToKKFdlYkNvcmU6OkFjY2Vz
c2liaWxpdHlSZW5kZXJPYmplY3Q6OnByZXZpb3VzU2libGluZyBjb25zdCk6CihXZWJDb3JlOjpB
Y2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpuZXh0U2libGluZyBjb25zdCk6CihXZWJDb3JlOjpu
ZXh0Q29udGludWF0aW9uKToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnBh
cmVudE9iamVjdCBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojph
bmNob3JFbGVtZW50IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6
OnRleHRVbmRlckVsZW1lbnQgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdDo6Ym91bmRpbmdCb3hSZWN0IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3Q6OmVsZW1lbnRQYXRoIGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3Q6OmNvbXB1dGVBY2Nlc3NpYmlsaXR5SXNJZ25vcmVkIGNvbnN0KToKKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmxheW91dENvdW50IGNvbnN0KToKKFdlYkNvcmU6
OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNlbGVjdGVkVGV4dCBjb25zdCk6CihXZWJDb3Jl
OjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzZWxlY3RlZFRleHRSYW5nZSBjb25zdCk6CihX
ZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjppbnNlcnRpb25Qb2ludExpbmVOdW1i
ZXIgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c2V0U2VsZWN0
ZWRUZXh0UmFuZ2UpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZG9jdW1l
bnRMaW5rcyk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojp3aWRnZXRGb3JB
dHRhY2htZW50VmlldyBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
Ojp2aXNpYmxlUG9zaXRpb25Gb3JJbmRleCBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0OjppbmRleEZvclZpc2libGVQb3NpdGlvbiBjb25zdCk6CihXZWJDb3JlOjpB
Y2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzZXRTZWxlY3RlZFZpc2libGVQb3NpdGlvblJhbmdl
IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFjY2Vzc2liaWxp
dHlIaXRUZXN0IGNvbnN0KToKKFdlYkNvcmU6OkFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmFk
ZEltYWdlTWFwQ2hpbGRyZW4pOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6
YWRkVGV4dEZpZWxkQ2hpbGRyZW4pOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dDo6bWFya2VyUmVuZGVyZXIgY29uc3QpOgooV2ViQ29yZTo6QWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdDo6c2VjdXJlRmllbGRWYWx1ZSBjb25zdCk6CiogU291cmNlL1dlYkNvcmUvYWNjZXNzaWJp
bGl0eS9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldy5jcHA6CihXZWJDb3JlOjpBY2Nlc3NpYmlsaXR5
U2Nyb2xsVmlldzo6QWNjZXNzaWJpbGl0eVNjcm9sbFZpZXcpOgooV2ViQ29yZTo6QWNjZXNzaWJp
bGl0eVNjcm9sbFZpZXc6OmFkZENoaWxkU2Nyb2xsYmFyKToKKFdlYkNvcmU6OkFjY2Vzc2liaWxp
dHlTY3JvbGxWaWV3Ojpkb2N1bWVudEZyYW1lVmlldyBjb25zdCk6CihXZWJDb3JlOjpBY2Nlc3Np
YmlsaXR5U2Nyb2xsVmlldzo6cGFyZW50T2JqZWN0IGNvbnN0KToKLS0tCiAuLi4vQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdC5jcHAgICAgICAgICAgICAgfCAyNzEgKysrKysrKysrLS0tLS0tLS0t
CiAuLi4vYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldy5jcHAgfCAgMjggKy0K
IDIgZmlsZXMgY2hhbmdlZCwgMTUzIGluc2VydGlvbnMoKyksIDE0NiBkZWxldGlvbnMoLSkKCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlSZW5k
ZXJPYmplY3QuY3BwIGIvU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5
UmVuZGVyT2JqZWN0LmNwcAppbmRleCA0OGQzZGFkYWUzYzEuLmVlOGFiZWMzZDdiNSAxMDA2NDQK
LS0tIGEvU291cmNlL1dlYkNvcmUvYWNjZXNzaWJpbGl0eS9BY2Nlc3NpYmlsaXR5UmVuZGVyT2Jq
ZWN0LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlS
ZW5kZXJPYmplY3QuY3BwCkBAIC0xNzAsMTYgKzE3MCwxNyBAQCBzdGF0aWMgaW5saW5lIGJvb2wg
aXNJbmxpbmVXaXRoQ29udGludWF0aW9uKFJlbmRlck9iamVjdCYgcmVuZGVyZXIpCiAgICAgcmV0
dXJuIHJlbmRlcklubGluZSAmJiByZW5kZXJJbmxpbmUtPmNvbnRpbnVhdGlvbigpOwogfQogCi1z
dGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogZmlyc3RDaGlsZEluQ29udGludWF0aW9uKFJlbmRl
cklubGluZSYgcmVuZGVyZXIpCitzdGF0aWMgaW5saW5lIFJlbmRlck9iamVjdCogZmlyc3RDaGls
ZEluQ29udGludWF0aW9uKFJlbmRlckJveE1vZGVsT2JqZWN0JiByZW5kZXJlcikKIHsKLSAgICBh
dXRvKiBjb250aW51YXRpb24gPSByZW5kZXJlci5jb250aW51YXRpb24oKTsKLQorICAgIFdlYWtQ
dHIgY29udGludWF0aW9uID0gcmVuZGVyZXIuY29udGludWF0aW9uKCk7CiAgICAgd2hpbGUgKGNv
bnRpbnVhdGlvbikgewogICAgICAgICBpZiAoaXM8UmVuZGVyQmxvY2s+KCpjb250aW51YXRpb24p
KQotICAgICAgICAgICAgcmV0dXJuIGNvbnRpbnVhdGlvbjsKLSAgICAgICAgaWYgKFJlbmRlck9i
amVjdCogY2hpbGQgPSBjb250aW51YXRpb24tPmZpcnN0Q2hpbGQoKSkKKyAgICAgICAgICAgIHJl
dHVybiBjb250aW51YXRpb24uZ2V0KCk7CisKKyAgICAgICAgaWYgKGF1dG8qIGNoaWxkID0gY29u
dGludWF0aW9uLT5maXJzdENoaWxkKCkpCiAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7Ci0gICAg
ICAgIGNvbnRpbnVhdGlvbiA9IGRvd25jYXN0PFJlbmRlcklubGluZT4oKmNvbnRpbnVhdGlvbiku
Y29udGludWF0aW9uKCk7CisKKyAgICAgICAgY29udGludWF0aW9uID0gY29udGludWF0aW9uLT5j
b250aW51YXRpb24oKTsKICAgICB9CiAKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTE5MiwxMSAr
MTkzLDE0IEBAIHN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBmaXJzdENoaWxkQ29uc2lkZXJp
bmdDb250aW51YXRpb24oUmVuZGVyT2JqZWN0JiByZW5kCiAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0
byBpbmNsdWRlIHRoZSBlbmQgb2YgYSBjb250aW51YXRpb24gYXMgdGhlIGZpcnN0Q2hpbGQgb2Yg
dGhlCiAgICAgLy8gYW5vbnltb3VzIHBhcmVudCwgYmVjYXVzZSBldmVyeXRoaW5nIGhhcyBhbHJl
YWR5IGJlZW4gbGlua2VkIHVwIHZpYSBjb250aW51YXRpb24uCiAgICAgLy8gQ1NTIGZpcnN0LWxl
dHRlciBzZWxlY3RvciBpcyBhbiBleGFtcGxlIG9mIHRoaXMgY2FzZS4KLSAgICBpZiAocmVuZGVy
ZXIuaXNBbm9ueW1vdXMoKSAmJiBpczxSZW5kZXJJbmxpbmU+KGZpcnN0Q2hpbGQpICYmIGRvd25j
YXN0PFJlbmRlcklubGluZT4oKmZpcnN0Q2hpbGQpLmlzQ29udGludWF0aW9uKCkpCi0gICAgICAg
IGZpcnN0Q2hpbGQgPSBudWxscHRyOwotICAgIAorICAgIGlmIChyZW5kZXJlci5pc0Fub255bW91
cygpKSB7CisgICAgICAgIGF1dG8qIHJlbmRlcklubGluZSA9IGR5bmFtaWNEb3duY2FzdDxSZW5k
ZXJJbmxpbmU+KGZpcnN0Q2hpbGQpOworICAgICAgICBpZiAocmVuZGVySW5saW5lICYmIHJlbmRl
cklubGluZS0+aXNDb250aW51YXRpb24oKSkKKyAgICAgICAgICAgIGZpcnN0Q2hpbGQgPSBudWxs
cHRyOworICAgIH0KKwogICAgIGlmICghZmlyc3RDaGlsZCAmJiBpc0lubGluZVdpdGhDb250aW51
YXRpb24ocmVuZGVyZXIpKQotICAgICAgICBmaXJzdENoaWxkID0gZmlyc3RDaGlsZEluQ29udGlu
dWF0aW9uKGRvd25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIpKTsKKyAgICAgICAgZmlyc3RD
aGlsZCA9IGZpcnN0Q2hpbGRJbkNvbnRpbnVhdGlvbih1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJJ
bmxpbmU+KHJlbmRlcmVyKSk7CiAKICAgICByZXR1cm4gZmlyc3RDaGlsZDsKIH0KQEAgLTIwNywx
NSArMjExLDE2IEBAIHN0YXRpYyBpbmxpbmUgUmVuZGVyT2JqZWN0KiBsYXN0Q2hpbGRDb25zaWRl
cmluZ0NvbnRpbnVhdGlvbihSZW5kZXJPYmplY3QmIHJlbmRlCiAgICAgaWYgKCFpczxSZW5kZXJJ
bmxpbmU+KHJlbmRlcmVyKSAmJiAhaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKICAgICAgICAg
cmV0dXJuICZyZW5kZXJlcjsKIAotICAgIFJlbmRlck9iamVjdCogbGFzdENoaWxkID0gZG93bmNh
c3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KHJlbmRlcmVyKS5sYXN0Q2hpbGQoKTsKLSAgICBmb3Ig
KGF1dG8qIGN1cnJlbnQgPSAmZG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KHJlbmRlcmVy
KTsgY3VycmVudDsgKSB7Ci0gICAgICAgIGlmIChSZW5kZXJPYmplY3QqIG5ld0xhc3RDaGlsZCA9
IGN1cnJlbnQtPmxhc3RDaGlsZCgpKQorICAgIGF1dG8mIGJveE1vZGVsT2JqZWN0ID0gdW5jaGVj
a2VkRG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmplY3Q+KHJlbmRlcmVyKTsKKyAgICBXZWFrUHRy
IGxhc3RDaGlsZCA9IGJveE1vZGVsT2JqZWN0Lmxhc3RDaGlsZCgpOworICAgIGZvciAoYXV0byog
Y3VycmVudCA9ICZib3hNb2RlbE9iamVjdDsgY3VycmVudDsgKSB7CisgICAgICAgIGlmIChhdXRv
KiBuZXdMYXN0Q2hpbGQgPSBjdXJyZW50LT5sYXN0Q2hpbGQoKSkKICAgICAgICAgICAgIGxhc3RD
aGlsZCA9IG5ld0xhc3RDaGlsZDsKIAogICAgICAgICBjdXJyZW50ID0gY3VycmVudC0+aW5saW5l
Q29udGludWF0aW9uKCk7CiAgICAgfQogCi0gICAgcmV0dXJuIGxhc3RDaGlsZDsKKyAgICByZXR1
cm4gbGFzdENoaWxkLmdldCgpOwogfQogCiBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmls
aXR5UmVuZGVyT2JqZWN0OjpmaXJzdENoaWxkKCkgY29uc3QKQEAgLTI1MiwxNiArMjU3LDE2IEBA
IEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Omxhc3RDaGls
ZCgpIGNvbnN0CiAKIHN0YXRpYyBpbmxpbmUgUmVuZGVySW5saW5lKiBzdGFydE9mQ29udGludWF0
aW9ucyhSZW5kZXJPYmplY3QmIHJlbmRlcmVyKQogewotICAgIGF1dG8qIHJlbmRlckVsZW1lbnQg
PSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyRWxlbWVudD4ocmVuZGVyZXIpOworICAgIFdlYWtQdHIg
cmVuZGVyRWxlbWVudCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJFbGVtZW50PihyZW5kZXJlcik7
CiAgICAgaWYgKCFyZW5kZXJFbGVtZW50KQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKKwogICAg
IGlmIChpczxSZW5kZXJJbmxpbmU+KCpyZW5kZXJFbGVtZW50KSAmJiByZW5kZXJFbGVtZW50LT5p
c0NvbnRpbnVhdGlvbigpICYmIGlzPFJlbmRlcklubGluZT4ocmVuZGVyRWxlbWVudC0+ZWxlbWVu
dCgpLT5yZW5kZXJlcigpKSkKLSAgICAgICAgcmV0dXJuIGRvd25jYXN0PFJlbmRlcklubGluZT4o
cmVuZGVyZXIubm9kZSgpLT5yZW5kZXJlcigpKTsKKyAgICAgICAgcmV0dXJuIHVuY2hlY2tlZERv
d25jYXN0PFJlbmRlcklubGluZT4ocmVuZGVyZXIubm9kZSgpLT5yZW5kZXJlcigpKTsKIAogICAg
IC8vIEJsb2NrcyB3aXRoIGEgcHJldmlvdXMgY29udGludWF0aW9uIGFsd2F5cyBoYXZlIGEgbmV4
dCBjb250aW51YXRpb24KICAgICBpZiAoYXV0byogcmVuZGVyQmxvY2sgPSBkeW5hbWljRG93bmNh
c3Q8UmVuZGVyQmxvY2s+KCpyZW5kZXJFbGVtZW50KTsgcmVuZGVyQmxvY2sgJiYgcmVuZGVyQmxv
Y2stPmlubGluZUNvbnRpbnVhdGlvbigpKQotICAgICAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVy
SW5saW5lPihyZW5kZXJCbG9jay0+aW5saW5lQ29udGludWF0aW9uKCktPmVsZW1lbnQoKS0+cmVu
ZGVyZXIoKSk7Ci0KKyAgICAgICAgcmV0dXJuIHVuY2hlY2tlZERvd25jYXN0PFJlbmRlcklubGlu
ZT4ocmVuZGVyQmxvY2stPmlubGluZUNvbnRpbnVhdGlvbigpLT5lbGVtZW50KCktPnJlbmRlcmVy
KCkpOwogICAgIHJldHVybiBudWxscHRyOwogfQogCkBAIC0yNzAsNyArMjc1LDcgQEAgc3RhdGlj
IGlubGluZSBSZW5kZXJPYmplY3QqIGVuZE9mQ29udGludWF0aW9ucyhSZW5kZXJPYmplY3QmIHJl
bmRlcmVyKQogICAgIGlmICghaXM8UmVuZGVySW5saW5lPihyZW5kZXJlcikgJiYgIWlzPFJlbmRl
ckJsb2NrPihyZW5kZXJlcikpCiAgICAgICAgIHJldHVybiAmcmVuZGVyZXI7CiAKLSAgICBhdXRv
KiBwcmV2aW91cyA9ICZkb3duY2FzdDxSZW5kZXJCb3hNb2RlbE9iamVjdD4ocmVuZGVyZXIpOwor
ICAgIGF1dG8qIHByZXZpb3VzID0gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyQm94TW9kZWxPYmpl
Y3Q+KCZyZW5kZXJlcik7CiAgICAgZm9yIChhdXRvKiBjdXJyZW50ID0gcHJldmlvdXM7IGN1cnJl
bnQ7ICkgewogICAgICAgICBwcmV2aW91cyA9IGN1cnJlbnQ7CiAgICAgICAgIGN1cnJlbnQgPSBj
dXJyZW50LT5pbmxpbmVDb250aW51YXRpb24oKTsKQEAgLTMyMywxNCArMzI4LDE0IEBAIEFjY2Vz
c2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnByZXZpb3VzU2libGlu
ZygpIGNvbnN0CiAgICAgLy8gQ2FzZSAxOiBUaGUgbm9kZSBpcyBhIGJsb2NrIGFuZCBpcyBhbiBp
bmxpbmUncyBjb250aW51YXRpb24uIEluIHRoYXQgY2FzZSwgdGhlIGlubGluZSdzCiAgICAgLy8g
bGFzdCBjaGlsZCBpcyBvdXIgcHJldmlvdXMgc2libGluZyAob3IgZnVydGhlciBiYWNrIGluIHRo
ZSBjb250aW51YXRpb24gY2hhaW4pCiAgICAgUmVuZGVySW5saW5lKiBzdGFydE9mQ29udHM7Ci0g
ICAgaWYgKGlzPFJlbmRlckJveD4oKm1fcmVuZGVyZXIpICYmIChzdGFydE9mQ29udHMgPSBzdGFy
dE9mQ29udGludWF0aW9ucygqbV9yZW5kZXJlcikpKQorICAgIFdlYWtQdHIgcmVuZGVyQmxvY2sg
PSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKTsKKyAgICBpZiAocmVu
ZGVyQmxvY2sgJiYgKHN0YXJ0T2ZDb250cyA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCptX3JlbmRl
cmVyKSkpCiAgICAgICAgIHByZXZpb3VzU2libGluZyA9IGNoaWxkQmVmb3JlQ29uc2lkZXJpbmdD
b250aW51YXRpb25zKHN0YXJ0T2ZDb250cywgcmVuZGVyZXIoKSk7CiAKICAgICAvLyBDYXNlIDI6
IEFub255bW91cyBibG9jayBwYXJlbnQgb2YgdGhlIGVuZCBvZiBhIGNvbnRpbnVhdGlvbiAtIHNr
aXAgYWxsIHRoZSB3YXkgdG8gYmVmb3JlCiAgICAgLy8gdGhlIHBhcmVudCBvZiB0aGUgc3RhcnQs
IHNpbmNlIGV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3aWxsIGJlIGxpbmtlZCB1cCB2aWEgdGhlIGNv
bnRpbnVhdGlvbi4KLSAgICBlbHNlIGlmIChtX3JlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkg
JiYgZmlyc3RDaGlsZElzSW5saW5lQ29udGludWF0aW9uKGRvd25jYXN0PFJlbmRlckJsb2NrPigq
bV9yZW5kZXJlcikpKSB7Ci0gICAgICAgIFJlbmRlckJsb2NrJiByZW5kZXJCbG9jayA9IGRvd25j
YXN0PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcik7Ci0gICAgICAgIGF1dG8qIGZpcnN0UGFyZW50
ID0gc3RhcnRPZkNvbnRpbnVhdGlvbnMoKnJlbmRlckJsb2NrLmZpcnN0Q2hpbGQoKSktPnBhcmVu
dCgpOworICAgIGVsc2UgaWYgKHJlbmRlckJsb2NrICYmIG1fcmVuZGVyZXItPmlzQW5vbnltb3Vz
QmxvY2soKSAmJiBmaXJzdENoaWxkSXNJbmxpbmVDb250aW51YXRpb24oKnJlbmRlckJsb2NrKSkg
eworICAgICAgICBhdXRvKiBmaXJzdFBhcmVudCA9IHN0YXJ0T2ZDb250aW51YXRpb25zKCpyZW5k
ZXJCbG9jay0+Zmlyc3RDaGlsZCgpKS0+cGFyZW50KCk7CiAgICAgICAgIEFTU0VSVChmaXJzdFBh
cmVudCk7CiAgICAgICAgIHdoaWxlIChmaXJzdENoaWxkSXNJbmxpbmVDb250aW51YXRpb24oKmZp
cnN0UGFyZW50KSkKICAgICAgICAgICAgIGZpcnN0UGFyZW50ID0gc3RhcnRPZkNvbnRpbnVhdGlv
bnMoKmZpcnN0UGFyZW50LT5maXJzdENoaWxkKCkpLT5wYXJlbnQoKTsKQEAgLTM3NCwxMyArMzc5
LDE0IEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Om5l
eHRTaWJsaW5nKCkgY29uc3QKICAgICAvLyBDYXNlIDE6IG5vZGUgaXMgYSBibG9jayBhbmQgaGFz
IGFuIGlubGluZSBjb250aW51YXRpb24uIE5leHQgc2libGluZyBpcyB0aGUgaW5saW5lIGNvbnRp
bnVhdGlvbidzCiAgICAgLy8gZmlyc3QgY2hpbGQuCiAgICAgUmVuZGVySW5saW5lKiBpbmxpbmVD
b250aW51YXRpb247Ci0gICAgaWYgKGlzPFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcikgJiYgKGlu
bGluZUNvbnRpbnVhdGlvbiA9IGRvd25jYXN0PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcikuaW5s
aW5lQ29udGludWF0aW9uKCkpKQorICAgIFdlYWtQdHIgcmVuZGVyQmxvY2sgPSBkeW5hbWljRG93
bmNhc3Q8UmVuZGVyQmxvY2s+KCptX3JlbmRlcmVyKTsKKyAgICBpZiAocmVuZGVyQmxvY2sgJiYg
KGlubGluZUNvbnRpbnVhdGlvbiA9IHJlbmRlckJsb2NrLT5pbmxpbmVDb250aW51YXRpb24oKSkp
CiAgICAgICAgIG5leHRTaWJsaW5nID0gZmlyc3RDaGlsZENvbnNpZGVyaW5nQ29udGludWF0aW9u
KCppbmxpbmVDb250aW51YXRpb24pOwogCiAgICAgLy8gQ2FzZSAyOiBBbm9ueW1vdXMgYmxvY2sg
cGFyZW50IG9mIHRoZSBzdGFydCBvZiBhIGNvbnRpbnVhdGlvbiAtIHNraXAgYWxsIHRoZSB3YXkg
dG8KICAgICAvLyBhZnRlciB0aGUgcGFyZW50IG9mIHRoZSBlbmQsIHNpbmNlIGV2ZXJ5dGhpbmcg
aW4gYmV0d2VlbiB3aWxsIGJlIGxpbmtlZCB1cCB2aWEgdGhlIGNvbnRpbnVhdGlvbi4KLSAgICBl
bHNlIGlmIChtX3JlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkgJiYgbGFzdENoaWxkSGFzQ29u
dGludWF0aW9uKGRvd25jYXN0PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcikpKSB7Ci0gICAgICAg
IFJlbmRlckVsZW1lbnQqIGxhc3RQYXJlbnQgPSBlbmRPZkNvbnRpbnVhdGlvbnMoKmRvd25jYXN0
PFJlbmRlckJsb2NrPigqbV9yZW5kZXJlcikubGFzdENoaWxkKCkpLT5wYXJlbnQoKTsKKyAgICBl
bHNlIGlmIChyZW5kZXJCbG9jayAmJiBtX3JlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkgJiYg
bGFzdENoaWxkSGFzQ29udGludWF0aW9uKCpyZW5kZXJCbG9jaykpIHsKKyAgICAgICAgYXV0byog
bGFzdFBhcmVudCA9IGVuZE9mQ29udGludWF0aW9ucygqcmVuZGVyQmxvY2stPmxhc3RDaGlsZCgp
KS0+cGFyZW50KCk7CiAgICAgICAgIEFTU0VSVChsYXN0UGFyZW50KTsKICAgICAgICAgd2hpbGUg
KGxhc3RDaGlsZEhhc0NvbnRpbnVhdGlvbigqbGFzdFBhcmVudCkpCiAgICAgICAgICAgICBsYXN0
UGFyZW50ID0gZW5kT2ZDb250aW51YXRpb25zKCpsYXN0UGFyZW50LT5sYXN0Q2hpbGQoKSktPnBh
cmVudCgpOwpAQCAtNDAwLDcgKzQwNiw3IEBAIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3Q6Om5leHRTaWJsaW5nKCkgY29uc3QKICAgICAvLyBDYXNlIDUuMTog
QWZ0ZXIgY2FzZSA0LCAodGhlIGVsZW1lbnQgd2FzIGlubGluZSB3LyBjb250aW51YXRpb24gYnV0
IGhhZCBubyBzaWJsaW5nKSwgdGhlbiBjaGVjayBpdCdzIHBhcmVudC4KICAgICBpZiAoIW5leHRT
aWJsaW5nICYmIG1fcmVuZGVyZXItPnBhcmVudCgpICYmIGlzSW5saW5lV2l0aENvbnRpbnVhdGlv
bigqbV9yZW5kZXJlci0+cGFyZW50KCkpKSB7CiAgICAgICAgIGF1dG8mIGNvbnRpbnVhdGlvbiA9
ICpkb3duY2FzdDxSZW5kZXJJbmxpbmU+KCptX3JlbmRlcmVyLT5wYXJlbnQoKSkuY29udGludWF0
aW9uKCk7Ci0gICAgICAgIAorCiAgICAgICAgIC8vIENhc2UgNWE6IGNvbnRpbnVhdGlvbiBpcyBh
IGJsb2NrIC0gaW4gdGhpcyBjYXNlIHRoZSBibG9jayBpdHNlbGYgaXMgdGhlIG5leHQgc2libGlu
Zy4KICAgICAgICAgaWYgKGlzPFJlbmRlckJsb2NrPihjb250aW51YXRpb24pKQogICAgICAgICAg
ICAgbmV4dFNpYmxpbmcgPSAmY29udGludWF0aW9uOwpAQCAtNDQwLDExICs0NDYsMTMgQEAgQWNj
ZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6bmV4dFNpYmxpbmco
KSBjb25zdAogCiBzdGF0aWMgUmVuZGVyQm94TW9kZWxPYmplY3QqIG5leHRDb250aW51YXRpb24o
UmVuZGVyT2JqZWN0JiByZW5kZXJlcikKIHsKLSAgICBpZiAoaXM8UmVuZGVySW5saW5lPihyZW5k
ZXJlcikgJiYgIXJlbmRlcmVyLmlzUmVwbGFjZWRPcklubGluZUJsb2NrKCkpCi0gICAgICAgIHJl
dHVybiBkb3duY2FzdDxSZW5kZXJJbmxpbmU+KHJlbmRlcmVyKS5jb250aW51YXRpb24oKTsKLSAg
ICBpZiAoaXM8UmVuZGVyQmxvY2s+KHJlbmRlcmVyKSkKLSAgICAgICAgcmV0dXJuIGRvd25jYXN0
PFJlbmRlckJsb2NrPihyZW5kZXJlcikuaW5saW5lQ29udGludWF0aW9uKCk7Ci0gICAgcmV0dXJu
IG51bGxwdHI7CisgICAgaWYgKCFyZW5kZXJlci5pc1JlcGxhY2VkT3JJbmxpbmVCbG9jaygpKSB7
CisgICAgICAgIGlmIChhdXRvKiByZW5kZXJJbmxpbmUgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVy
SW5saW5lPihyZW5kZXJlcikpCisgICAgICAgICAgICByZXR1cm4gcmVuZGVySW5saW5lLT5jb250
aW51YXRpb24oKTsKKyAgICB9CisKKyAgICBhdXRvKiByZW5kZXJCbG9jayA9IGR5bmFtaWNEb3du
Y2FzdDxSZW5kZXJCbG9jaz4ocmVuZGVyZXIpOworICAgIHJldHVybiByZW5kZXJCbG9jayA/IHJl
bmRlckJsb2NrLT5pbmxpbmVDb250aW51YXRpb24oKSA6IG51bGxwdHI7CiB9CiAgICAgCiBSZW5k
ZXJPYmplY3QqIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnJlbmRlclBhcmVudE9iamVjdCgp
IGNvbnN0CkBAIC01MzgsOCArNTQ2LDggQEAgQWNjZXNzaWJpbGl0eU9iamVjdCogQWNjZXNzaWJp
bGl0eVJlbmRlck9iamVjdDo6cGFyZW50T2JqZWN0KCkgY29uc3QKICAgICAvLyBFeHBvc2UgbWFy
a2VycyB0aGF0IGFyZSBub3QgZGlyZWN0IGNoaWxkcmVuIG9mIGEgbGlzdCBpdGVtIHRvby4KICAg
ICBpZiAobV9yZW5kZXJlci0+aXNSZW5kZXJMaXN0TWFya2VyKCkpIHsKICAgICAgICAgaWYgKGF1
dG8qIGxpc3RJdGVtID0gYW5jZXN0b3JzT2ZUeXBlPFJlbmRlckxpc3RJdGVtPigqbV9yZW5kZXJl
cikuZmlyc3QoKSkgewotICAgICAgICAgICAgQWNjZXNzaWJpbGl0eU9iamVjdCogcGFyZW50ID0g
YXhPYmplY3RDYWNoZSgpLT5nZXRPckNyZWF0ZShsaXN0SXRlbSk7Ci0gICAgICAgICAgICBpZiAo
ZG93bmNhc3Q8QWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdD4oKnBhcmVudCkubWFya2VyUmVuZGVy
ZXIoKSA9PSBtX3JlbmRlcmVyKQorICAgICAgICAgICAgYXV0byogcGFyZW50ID0gYXhPYmplY3RD
YWNoZSgpLT5nZXRPckNyZWF0ZShsaXN0SXRlbSk7CisgICAgICAgICAgICBpZiAocGFyZW50ICYm
IHVuY2hlY2tlZERvd25jYXN0PEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q+KCpwYXJlbnQpLm1h
cmtlclJlbmRlcmVyKCkgPT0gbV9yZW5kZXJlcikKICAgICAgICAgICAgICAgICByZXR1cm4gcGFy
ZW50OwogICAgICAgICB9CiAgICAgfQpAQCAtNTQ3LDExICs1NTUsMTEgQEAgQWNjZXNzaWJpbGl0
eU9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6cGFyZW50T2JqZWN0KCkgY29uc3QK
IAogICAgIGlmIChhdXRvKiBwYXJlbnRPYmplY3QgPSByZW5kZXJQYXJlbnRPYmplY3QoKSkKICAg
ICAgICAgcmV0dXJuIGNhY2hlLT5nZXRPckNyZWF0ZShwYXJlbnRPYmplY3QpOwotICAgIAorCiAg
ICAgLy8gV2ViQXJlYSdzIHBhcmVudCBzaG91bGQgYmUgdGhlIHNjcm9sbCB2aWV3IGNvbnRhaW5p
bmcgaXQuCiAgICAgaWYgKGlzV2ViQXJlYSgpKQogICAgICAgICByZXR1cm4gY2FjaGUtPmdldE9y
Q3JlYXRlKCZtX3JlbmRlcmVyLT52aWV3KCkuZnJhbWVWaWV3KCkpOwotICAgIAorCiAgICAgcmV0
dXJuIG51bGxwdHI7CiB9CiAKQEAgLTU4NCwzMiArNTkyLDM2IEBAIEVsZW1lbnQqIEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3Q6OmFuY2hvckVsZW1lbnQoKSBjb25zdAogewogICAgIGlmICghbV9y
ZW5kZXJlcikKICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgCi0gICAgQVhPYmplY3RDYWNo
ZSogY2FjaGUgPSBheE9iamVjdENhY2hlKCk7CisKKyAgICBXZWFrUHRyIGNhY2hlID0gYXhPYmpl
Y3RDYWNoZSgpOwogICAgIGlmICghY2FjaGUpCiAgICAgICAgIHJldHVybiBudWxscHRyOwotICAg
IAorCiAgICAgUmVuZGVyT2JqZWN0KiBjdXJyZW50UmVuZGVyZXI7Ci0gICAgCisKICAgICAvLyBT
ZWFyY2ggdXAgdGhlIHJlbmRlciB0cmVlIGZvciBhIFJlbmRlck9iamVjdCB3aXRoIGEgRE9NIG5v
ZGUuICBEZWZlciB0byBhbiBlYXJsaWVyIGNvbnRpbnVhdGlvbiwgdGhvdWdoLgogICAgIGZvciAo
Y3VycmVudFJlbmRlcmVyID0gcmVuZGVyZXIoKTsgY3VycmVudFJlbmRlcmVyICYmICFjdXJyZW50
UmVuZGVyZXItPm5vZGUoKTsgY3VycmVudFJlbmRlcmVyID0gY3VycmVudFJlbmRlcmVyLT5wYXJl
bnQoKSkgewogICAgICAgICBpZiAoY3VycmVudFJlbmRlcmVyLT5pc0Fub255bW91c0Jsb2NrKCkp
IHsKLSAgICAgICAgICAgIGlmIChSZW5kZXJPYmplY3QqIGNvbnRpbnVhdGlvbiA9IGRvd25jYXN0
PFJlbmRlckJsb2NrPigqY3VycmVudFJlbmRlcmVyKS5jb250aW51YXRpb24oKSkKKyAgICAgICAg
ICAgIGlmIChhdXRvKiBjb250aW51YXRpb24gPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJCbG9j
az4oKmN1cnJlbnRSZW5kZXJlcikuY29udGludWF0aW9uKCkpCiAgICAgICAgICAgICAgICAgcmV0
dXJuIGNhY2hlLT5nZXRPckNyZWF0ZShjb250aW51YXRpb24pLT5hbmNob3JFbGVtZW50KCk7CiAg
ICAgICAgIH0KICAgICB9Ci0gICAgCi0gICAgLy8gYmFpbCBpZiBub25lIGZvdW5kCisKKyAgICAv
LyBCYWlsIGlmIG5vbmUgZm91bmQuCiAgICAgaWYgKCFjdXJyZW50UmVuZGVyZXIpCiAgICAgICAg
IHJldHVybiBudWxscHRyOwotICAgIAotICAgIC8vIHNlYXJjaCB1cCB0aGUgRE9NIHRyZWUgZm9y
IGFuIGFuY2hvciBlbGVtZW50Ci0gICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgYW55IG5v
bi1pbWFnZSB3aXRoIGFuIGFuY2hvciBpcyBhbiBIVE1MQW5jaG9yRWxlbWVudAotICAgIGZvciAo
Tm9kZSogbm9kZSA9IGN1cnJlbnRSZW5kZXJlci0+bm9kZSgpOyBub2RlOyBub2RlID0gbm9kZS0+
cGFyZW50Tm9kZSgpKSB7Ci0gICAgICAgIGlmIChpczxIVE1MQW5jaG9yRWxlbWVudD4oKm5vZGUp
IHx8IChub2RlLT5yZW5kZXJlcigpICYmIGNhY2hlLT5nZXRPckNyZWF0ZShub2RlLT5yZW5kZXJl
cigpKS0+aXNMaW5rKCkpKQotICAgICAgICAgICAgcmV0dXJuIGRvd25jYXN0PEVsZW1lbnQ+KG5v
ZGUpOworCisgICAgLy8gU2VhcmNoIHVwIHRoZSBET00gdHJlZSBmb3IgYW4gYW5jaG9yIGVsZW1l
bnQuCisgICAgLy8gTk9URTogdGhpcyBhc3N1bWVzIHRoYXQgYW55IG5vbi1pbWFnZSB3aXRoIGFu
IGFuY2hvciBpcyBhbiBIVE1MQW5jaG9yRWxlbWVudC4KKyAgICBmb3IgKFJlZlB0ciBub2RlID0g
Y3VycmVudFJlbmRlcmVyLT5ub2RlKCk7IG5vZGU7IG5vZGUgPSBub2RlLT5wYXJlbnROb2RlKCkp
IHsKKyAgICAgICAgaWYgKGF1dG8qIGFuY2hvciA9IGR5bmFtaWNEb3duY2FzdDxIVE1MQW5jaG9y
RWxlbWVudD4obm9kZS5nZXQoKSkpCisgICAgICAgICAgICByZXR1cm4gYW5jaG9yOworCisgICAg
ICAgIGF1dG8qIG9iamVjdCA9IGNhY2hlID8gY2FjaGUtPmdldE9yQ3JlYXRlKG5vZGUtPnJlbmRl
cmVyKCkpIDogbnVsbHB0cjsKKyAgICAgICAgaWYgKG9iamVjdCAmJiBvYmplY3QtPmlzTGluaygp
KQorICAgICAgICAgICAgcmV0dXJuIGR5bmFtaWNEb3duY2FzdDxFbGVtZW50Pigqbm9kZSk7CiAg
ICAgfQotICAgIAorCiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKQEAgLTY1NSw5ICs2NjcsOSBA
QCBTdHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6dGV4dFVuZGVyRWxlbWVudChBY2Nl
c3NpYmlsaXR5VGV4dFVuZGVyRWxlbWVudAogICAgIGlmICghbV9yZW5kZXJlcikKICAgICAgICAg
cmV0dXJuIEFjY2Vzc2liaWxpdHlOb2RlT2JqZWN0Ojp0ZXh0VW5kZXJFbGVtZW50KG1vZGUpOwog
Ci0gICAgaWYgKGlzPFJlbmRlckZpbGVVcGxvYWRDb250cm9sPigqbV9yZW5kZXJlcikpCi0gICAg
ICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJGaWxlVXBsb2FkQ29udHJvbD4oKm1fcmVuZGVyZXIp
LmJ1dHRvblZhbHVlKCk7Ci0gICAgCisgICAgaWYgKGF1dG8qIGZpbGVVcGxvYWQgPSBkeW5hbWlj
RG93bmNhc3Q8UmVuZGVyRmlsZVVwbG9hZENvbnRyb2w+KCptX3JlbmRlcmVyKSkKKyAgICAgICAg
cmV0dXJuIGZpbGVVcGxvYWQtPmJ1dHRvblZhbHVlKCk7CisKICAgICAvLyBSZWZsZWN0IHdoZW4g
YSBjb250ZW50IGF1dGhvciBoYXMgZXhwbGljaXRseSBtYXJrZWQgYSBsaW5lIGJyZWFrLgogICAg
IGlmIChtX3JlbmRlcmVyLT5pc0JSKCkpCiAgICAgICAgIHJldHVybiAiXG4iX3M7CkBAIC02OTgs
MjQgKzcxMCwyMiBAQCBTdHJpbmcgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6dGV4dFVuZGVy
RWxlbWVudChBY2Nlc3NpYmlsaXR5VGV4dFVuZGVyRWxlbWVudAogICAgICAgICAgICAgICAgIHJl
dHVybiBwbGFpblRleHQoKnRleHRSYW5nZSwgdGV4dEl0ZXJhdG9yQmVoYXZpb3JGb3JUZXh0UmFu
Z2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAKKwogICAgICAgICAvLyBTb21l
dGltZXMgdGV4dCBmcmFnbWVudHMgZG9uJ3QgaGF2ZSBOb2RlcyBhc3NvY2lhdGVkIHdpdGggdGhl
bSAobGlrZSB3aGVuCiAgICAgICAgIC8vIENTUyBjb250ZW50IGlzIHVzZWQgdG8gaW5zZXJ0IHRl
eHQgb3Igd2hlbiBhIFJlbmRlckNvdW50ZXIgaXMgdXNlZC4pCi0gICAgICAgIGlmIChpczxSZW5k
ZXJUZXh0PigqbV9yZW5kZXJlcikpIHsKLSAgICAgICAgICAgIFJlbmRlclRleHQmIHJlbmRlclRl
eHRPYmplY3QgPSBkb3duY2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJlcik7Ci0gICAgICAgICAg
ICBpZiAoaXM8UmVuZGVyVGV4dEZyYWdtZW50PihyZW5kZXJUZXh0T2JqZWN0KSkgewotICAgICAg
ICAgICAgICAgIFJlbmRlclRleHRGcmFnbWVudCYgcmVuZGVyVGV4dEZyYWdtZW50ID0gZG93bmNh
c3Q8UmVuZGVyVGV4dEZyYWdtZW50PihyZW5kZXJUZXh0T2JqZWN0KTsKKyAgICAgICAgaWYgKFdl
YWtQdHIgcmVuZGVyVGV4dCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJUZXh0PigqbV9yZW5kZXJl
cikpIHsKKyAgICAgICAgICAgIGlmIChXZWFrUHRyIHJlbmRlclRleHRGcmFnbWVudCA9IGR5bmFt
aWNEb3duY2FzdDxSZW5kZXJUZXh0RnJhZ21lbnQ+KCpyZW5kZXJUZXh0KSkgewogICAgICAgICAg
ICAgICAgIC8vIFRoZSBhbHQgYXR0cmlidXRlIG1heSBiZSBzZXQgb24gYSB0ZXh0IGZyYWdtZW50
IHRocm91Z2ggQ1NTLCB3aGljaCBzaG91bGQgYmUgaG9ub3JlZC4KLSAgICAgICAgICAgICAgICBj
b25zdCBTdHJpbmcmIGFsdFRleHQgPSByZW5kZXJUZXh0RnJhZ21lbnQuYWx0VGV4dCgpOworICAg
ICAgICAgICAgICAgIGNvbnN0IGF1dG8mIGFsdFRleHQgPSByZW5kZXJUZXh0RnJhZ21lbnQtPmFs
dFRleHQoKTsKICAgICAgICAgICAgICAgICBpZiAoIWFsdFRleHQuaXNFbXB0eSgpKQogICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gYWx0VGV4dDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVu
ZGVyVGV4dEZyYWdtZW50LmNvbnRlbnRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
cmVuZGVyVGV4dEZyYWdtZW50ID8gcmVuZGVyVGV4dEZyYWdtZW50LT5jb250ZW50U3RyaW5nKCkg
OiBTdHJpbmcoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRl
eHRPYmplY3QudGV4dCgpOworICAgICAgICAgICAgcmV0dXJuIHJlbmRlclRleHQgPyByZW5kZXJU
ZXh0LT50ZXh0KCkgOiBTdHJpbmcoKTsKICAgICAgICAgfQogICAgIH0KLSAgICAKKwogICAgIHJl
dHVybiBBY2Nlc3NpYmlsaXR5Tm9kZU9iamVjdDo6dGV4dFVuZGVyRWxlbWVudChtb2RlKTsKIH0K
IApAQCAtODI0LDQzICs4MzQsNDIgQEAgdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpv
ZmZzZXRCb3VuZGluZ0JveEZvclJlbW90ZVNWR0VsZW1lbnQoTGF5b3V0UmVjdCYKICAgICAgICAg
fQogICAgIH0KIH0KLSAgICAKKwogTGF5b3V0UmVjdCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
Ojpib3VuZGluZ0JveFJlY3QoKSBjb25zdAogewotICAgIFJlbmRlck9iamVjdCogb2JqID0gcmVu
ZGVyZXIoKTsKLSAgICAKLSAgICBpZiAoIW9iaikKKyAgICBXZWFrUHRyIHJlbmRlcmVyID0gdGhp
cy0+cmVuZGVyZXIoKTsKKyAgICBpZiAoIXJlbmRlcmVyKQogICAgICAgICByZXR1cm4gQWNjZXNz
aWJpbGl0eU5vZGVPYmplY3Q6OmJvdW5kaW5nQm94UmVjdCgpOwotICAgIAotICAgIGlmIChvYmot
Pm5vZGUoKSkgLy8gSWYgd2UgYXJlIGEgY29udGludWF0aW9uLCB3ZSB3YW50IHRvIG1ha2Ugc3Vy
ZSB0byB1c2UgdGhlIHByaW1hcnkgcmVuZGVyZXIuCi0gICAgICAgIG9iaiA9IG9iai0+bm9kZSgp
LT5yZW5kZXJlcigpOwotICAgIAorCisgICAgaWYgKHJlbmRlcmVyLT5ub2RlKCkpIC8vIElmIHdl
IGFyZSBhIGNvbnRpbnVhdGlvbiwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdG8gdXNlIHRoZSBwcmlt
YXJ5IHJlbmRlcmVyLgorICAgICAgICByZW5kZXJlciA9IHJlbmRlcmVyLT5ub2RlKCktPnJlbmRl
cmVyKCk7CisKICAgICAvLyBhYnNvbHV0ZUZvY3VzUmluZ1F1YWRzIHdpbGwgcXVlcnkgdGhlIGhp
ZXJhcmNoeSBiZWxvdyB0aGlzIGVsZW1lbnQsIHdoaWNoIGZvciBsYXJnZSB3ZWJwYWdlcyBjYW4g
YmUgdmVyeSBzbG93LgogICAgIC8vIEZvciBhIHdlYiBhcmVhLCB3aGljaCB3aWxsIGhhdmUgdGhl
IG1vc3QgZWxlbWVudHMgb2YgYW55IGVsZW1lbnQsIGFic29sdXRlUXVhZHMgc2hvdWxkIGJlIHVz
ZWQuCiAgICAgLy8gV2Ugc2hvdWxkIGFsc28gdXNlIGFic29sdXRlUXVhZHMgZm9yIFNWRyBlbGVt
ZW50cywgb3RoZXJ3aXNlIHRyYW5zZm9ybXMgd29uJ3QgYmUgYXBwbGllZC4KICAgICBWZWN0b3I8
RmxvYXRRdWFkPiBxdWFkczsKICAgICBib29sIGlzU1ZHUm9vdCA9IGZhbHNlOwogCi0gICAgaWYg
KG9iai0+aXNSZW5kZXJPckxlZ2FjeVJlbmRlclNWR1Jvb3QoKSkKKyAgICBpZiAocmVuZGVyZXIt
PmlzUmVuZGVyT3JMZWdhY3lSZW5kZXJTVkdSb290KCkpCiAgICAgICAgIGlzU1ZHUm9vdCA9IHRy
dWU7CiAKLSAgICBpZiAoaXM8UmVuZGVyVGV4dD4oKm9iaikpCi0gICAgICAgIHF1YWRzID0gZG93
bmNhc3Q8UmVuZGVyVGV4dD4oKm9iaikuYWJzb2x1dGVRdWFkc0NsaXBwZWRUb0VsbGlwc2lzKCk7
CisgICAgaWYgKGF1dG8qIHJlbmRlclRleHQgPSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyVGV4dD4o
KnJlbmRlcmVyKSkKKyAgICAgICAgcXVhZHMgPSByZW5kZXJUZXh0LT5hYnNvbHV0ZVF1YWRzQ2xp
cHBlZFRvRWxsaXBzaXMoKTsKICAgICBlbHNlIGlmIChpc1dlYkFyZWEoKSB8fCBpc1NWR1Jvb3Qp
Ci0gICAgICAgIG9iai0+YWJzb2x1dGVRdWFkcyhxdWFkcyk7CisgICAgICAgIHJlbmRlcmVyLT5h
YnNvbHV0ZVF1YWRzKHF1YWRzKTsKICAgICBlbHNlCi0gICAgICAgIG9iai0+YWJzb2x1dGVGb2N1
c1JpbmdRdWFkcyhxdWFkcyk7Ci0gICAgCi0gICAgTGF5b3V0UmVjdCByZXN1bHQgPSBib3VuZGlu
Z0JveEZvclF1YWRzKG9iaiwgcXVhZHMpOworICAgICAgICByZW5kZXJlci0+YWJzb2x1dGVGb2N1
c1JpbmdRdWFkcyhxdWFkcyk7CisKKyAgICBMYXlvdXRSZWN0IHJlc3VsdCA9IGJvdW5kaW5nQm94
Rm9yUXVhZHMocmVuZGVyZXIuZ2V0KCksIHF1YWRzKTsKIAogICAgIERvY3VtZW50KiBkb2N1bWVu
dCA9IHRoaXMtPmRvY3VtZW50KCk7CiAgICAgaWYgKGRvY3VtZW50ICYmIGRvY3VtZW50LT5pc1NW
R0RvY3VtZW50KCkpCiAgICAgICAgIG9mZnNldEJvdW5kaW5nQm94Rm9yUmVtb3RlU1ZHRWxlbWVu
dChyZXN1bHQpOwotICAgIAorCiAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHdlYiBhcmVhIHNob3Vs
ZCBiZSB0aGUgY29udGVudCBzaXplLCBub3QgdGhlIGNsaXBwZWQgc2l6ZS4KICAgICBpZiAoaXNX
ZWJBcmVhKCkpCi0gICAgICAgIHJlc3VsdC5zZXRTaXplKG9iai0+dmlldygpLmZyYW1lVmlldygp
LmNvbnRlbnRzU2l6ZSgpKTsKLSAgICAKKyAgICAgICAgcmVzdWx0LnNldFNpemUocmVuZGVyZXIt
PnZpZXcoKS5mcmFtZVZpZXcoKS5jb250ZW50c1NpemUoKSk7CisKICAgICByZXR1cm4gcmVzdWx0
OwogfQogCkBAIC04NzcsMTIgKzg4NiwxNSBAQCBib29sIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3Q6OnN1cHBvcnRzUGF0aCgpIGNvbnN0CiAKIFBhdGggQWNjZXNzaWJpbGl0eVJlbmRlck9iamVj
dDo6ZWxlbWVudFBhdGgoKSBjb25zdAogewotICAgIGlmIChpczxSZW5kZXJUZXh0PihyZW5kZXJl
cigpKSkgeworICAgIGlmICghbV9yZW5kZXJlcikKKyAgICAgICAgcmV0dXJuIEFjY2Vzc2liaWxp
dHlOb2RlT2JqZWN0OjplbGVtZW50UGF0aCgpOworCisgICAgaWYgKGF1dG8qIHJlbmRlclRleHQg
PSBkeW5hbWljRG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1fcmVuZGVyZXIpKSB7CiAgICAgICAgIFZl
Y3RvcjxMYXlvdXRSZWN0PiByZWN0czsKLSAgICAgICAgZG93bmNhc3Q8UmVuZGVyVGV4dD4oKm1f
cmVuZGVyZXIpLmJvdW5kaW5nUmVjdHMocmVjdHMsIGZsb29yZWRMYXlvdXRQb2ludChtX3JlbmRl
cmVyLT5sb2NhbFRvQWJzb2x1dGUoKSkpOworICAgICAgICByZW5kZXJUZXh0LT5ib3VuZGluZ1Jl
Y3RzKHJlY3RzLCBmbG9vcmVkTGF5b3V0UG9pbnQobV9yZW5kZXJlci0+bG9jYWxUb0Fic29sdXRl
KCkpKTsKICAgICAgICAgLy8gSWYgb25seSAxIHJlY3QsIGRvbid0IGNvbXB1dGUgcGF0aCBzaW5j
ZSB0aGUgYm91bmRpbmcgcmVjdCB3aWxsIGJlIGdvb2QgZW5vdWdoLgogICAgICAgICBpZiAocmVj
dHMuc2l6ZSgpIDwgMikKLSAgICAgICAgICAgIHJldHVybiBQYXRoKCk7CisgICAgICAgICAgICBy
ZXR1cm4geyB9OwogCiAgICAgICAgIC8vIENvbXB1dGUgdGhlIHBhdGggb25seSBpZiB0aGlzIGlz
IHRoZSBsYXN0IHBhcnQgb2YgYSBsaW5lIGZvbGxvd2VkIGJ5IHRoZSBiZWdpbm5pbmcgb2YgdGhl
IG5leHQgbGluZS4KICAgICAgICAgY29uc3QgYXV0byYgc3R5bGUgPSBtX3JlbmRlcmVyLT5zdHls
ZSgpOwpAQCAtOTAyLDcgKzkxNCw3IEBAIFBhdGggQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6
ZWxlbWVudFBhdGgoKSBjb25zdAogICAgICAgICAgICAgdW5pb25SZWN0LnVuaXRlKHJlY3RzW2ld
KTsKICAgICAgICAgfQogICAgICAgICBpZiAoIW5lZWRzUGF0aCkKLSAgICAgICAgICAgIHJldHVy
biBQYXRoKCk7CisgICAgICAgICAgICByZXR1cm4geyB9OwogCiAgICAgICAgIGZsb2F0IG91dGxp
bmVPZmZzZXQgPSBzdHlsZS5vdXRsaW5lT2Zmc2V0KCk7CiAgICAgICAgIGZsb2F0IGRldmljZVNj
YWxlRmFjdG9yID0gbV9yZW5kZXJlci0+ZG9jdW1lbnQoKS5kZXZpY2VTY2FsZUZhY3RvcigpOwpA
QCAtOTE1LDggKzkyNyw4IEBAIFBhdGggQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6ZWxlbWVu
dFBhdGgoKSBjb25zdAogICAgICAgICByZXR1cm4gUGF0aFV0aWxpdGllczo6cGF0aFdpdGhTaHJp
bmtXcmFwcGVkUmVjdHMocGl4ZWxTbmFwcGVkUmVjdHMsIDApOwogICAgIH0KIAotICAgIGlmIChp
czxMZWdhY3lSZW5kZXJTVkdTaGFwZT4ocmVuZGVyZXIoKSkgJiYgZG93bmNhc3Q8TGVnYWN5UmVu
ZGVyU1ZHU2hhcGU+KCptX3JlbmRlcmVyKS5oYXNQYXRoKCkpIHsKLSAgICAgICAgUGF0aCBwYXRo
ID0gZG93bmNhc3Q8TGVnYWN5UmVuZGVyU1ZHU2hhcGU+KCptX3JlbmRlcmVyKS5wYXRoKCk7Cisg
ICAgaWYgKGF1dG8qIHJlbmRlclNWR1NoYXBlID0gZHluYW1pY0Rvd25jYXN0PExlZ2FjeVJlbmRl
clNWR1NoYXBlPigqbV9yZW5kZXJlcik7IHJlbmRlclNWR1NoYXBlICYmIHJlbmRlclNWR1NoYXBl
LT5oYXNQYXRoKCkpIHsKKyAgICAgICAgUGF0aCBwYXRoID0gcmVuZGVyU1ZHU2hhcGUtPnBhdGgo
KTsKIAogICAgICAgICBhdXRvKiBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUoKTsKICAgICAgICAgaWYg
KCFjYWNoZSkKQEAgLTkzMiw4ICs5NDQsOCBAQCBQYXRoIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3Q6OmVsZW1lbnRQYXRoKCkgY29uc3QKICAgICB9CiAKICNpZiBFTkFCTEUoTEFZRVJfQkFTRURf
U1ZHX0VOR0lORSkKLSAgICBpZiAoaXM8UmVuZGVyU1ZHU2hhcGU+KHJlbmRlcmVyKCkpICYmIGRv
d25jYXN0PFJlbmRlclNWR1NoYXBlPigqbV9yZW5kZXJlcikuaGFzUGF0aCgpKSB7Ci0gICAgICAg
IFBhdGggcGF0aCA9IGRvd25jYXN0PFJlbmRlclNWR1NoYXBlPigqbV9yZW5kZXJlcikucGF0aCgp
OworICAgIGlmIChhdXRvKiByZW5kZXJTVkdTaGFwZSA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJT
VkdTaGFwZT4oKm1fcmVuZGVyZXIpOyByZW5kZXJTVkdTaGFwZSAmJiByZW5kZXJTVkdTaGFwZS0+
aGFzUGF0aCgpKSB7CisgICAgICAgIFBhdGggcGF0aCA9IHJlbmRlclNWR1NoYXBlLT5wYXRoKCk7
CiAKICAgICAgICAgYXV0byogY2FjaGUgPSBheE9iamVjdENhY2hlKCk7CiAgICAgICAgIGlmICgh
Y2FjaGUpCkBAIC05NDgsNyArOTYwLDcgQEAgUGF0aCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
OjplbGVtZW50UGF0aCgpIGNvbnN0CiAgICAgfQogI2VuZGlmCiAKLSAgICByZXR1cm4gUGF0aCgp
OworICAgIHJldHVybiB7IH07CiB9CiAKICNpZiBFTkFCTEUoQVBQTEVfUEFZKQpAQCAtMTIxMCw3
ICsxMjIyLDcgQEAgYm9vbCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpjb21wdXRlQWNjZXNz
aWJpbGl0eUlzSWdub3JlZCgpIGNvbnN0CiAKICAgICAgICAgLy8gd2Via2l0Lm9yZy9iLzE3Mzg3
MCAtIElmIGFuIGltYWdlIGhhcyBvdGhlciBhbHRlcm5hdGl2ZSB0ZXh0LCBkb24ndCBpZ25vcmUg
aXQgaWYgYWx0IHRleHQgaXMgZW1wdHkuCiAgICAgICAgIC8vIFRoaXMgbWVhbnMgd2Ugc2hvdWxk
IHByb2Nlc3MgdGl0bGUgYW5kIGFyaWEtbGFiZWwgZmlyc3QuCi0gICAgICAgIAorCiAgICAgICAg
IC8vIElmIGFuIGltYWdlIGhhcyB0aGUgdGl0bGUgb3IgbGFiZWwgYXR0cmlidXRlcywgYWNjZXNz
aWJpbGl0eSBzaG91bGQgYmUgbGVuaWVudCBhbmQgYWxsb3cgaXQgdG8gYXBwZWFyIGluIHRoZSBo
aWVyYXJjaHkgKGFjY29yZGluZyB0byBXQUktQVJJQSkuCiAgICAgICAgIGlmICghZ2V0QXR0cmli
dXRlKHRpdGxlQXR0cikuaXNFbXB0eSgpIHx8ICFnZXRBdHRyaWJ1dGUoYXJpYV9sYWJlbEF0dHIp
LmlzRW1wdHkoKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEyMTgsOSArMTIzMCw5
IEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6Y29tcHV0ZUFjY2Vzc2liaWxpdHlJ
c0lnbm9yZWQoKSBjb25zdAogICAgICAgICAvLyBGaXJzdCBjaGVjayB0aGUgUmVuZGVySW1hZ2Un
cyBhbHRUZXh0ICh3aGljaCBjYW4gYmUgc2V0IHRocm91Z2ggYSBzdHlsZSBzaGVldCwgb3IgY29t
ZSBmcm9tIHRoZSBFbGVtZW50KS4KICAgICAgICAgLy8gSG93ZXZlciwgaWYgdGhpcyBpcyBub3Qg
YSBuYXRpdmUgaW1hZ2UsIGZhbGxiYWNrIHRvIHRoZSBhdHRyaWJ1dGUgb24gdGhlIEVsZW1lbnQu
CiAgICAgICAgIEFjY2Vzc2liaWxpdHlPYmplY3RJbmNsdXNpb24gYWx0VGV4dEluY2x1c2lvbiA9
IEFjY2Vzc2liaWxpdHlPYmplY3RJbmNsdXNpb246OkRlZmF1bHRCZWhhdmlvcjsKLSAgICAgICAg
Ym9vbCBpc1JlbmRlckltYWdlID0gaXM8UmVuZGVySW1hZ2U+KHJlbmRlcmVyKCkpOwotICAgICAg
ICBpZiAoaXNSZW5kZXJJbWFnZSkKLSAgICAgICAgICAgIGFsdFRleHRJbmNsdXNpb24gPSBvYmpl
Y3RJbmNsdXNpb25Gcm9tQWx0VGV4dChkb3duY2FzdDxSZW5kZXJJbWFnZT4oKm1fcmVuZGVyZXIp
LmFsdFRleHQoKSk7CisgICAgICAgIFdlYWtQdHIgaW1hZ2UgPSBkeW5hbWljRG93bmNhc3Q8UmVu
ZGVySW1hZ2U+KCptX3JlbmRlcmVyKTsKKyAgICAgICAgaWYgKGltYWdlKQorICAgICAgICAgICAg
YWx0VGV4dEluY2x1c2lvbiA9IG9iamVjdEluY2x1c2lvbkZyb21BbHRUZXh0KGltYWdlLT5hbHRU
ZXh0KCkpOwogICAgICAgICBlbHNlCiAgICAgICAgICAgICBhbHRUZXh0SW5jbHVzaW9uID0gb2Jq
ZWN0SW5jbHVzaW9uRnJvbUFsdFRleHQoZ2V0QXR0cmlidXRlKGFsdEF0dHIpLnN0cmluZygpKTsK
IApAQCAtMTIyOSwxNSArMTI0MSwxNCBAQCBib29sIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6
OmNvbXB1dGVBY2Nlc3NpYmlsaXR5SXNJZ25vcmVkKCkgY29uc3QKICAgICAgICAgaWYgKGFsdFRl
eHRJbmNsdXNpb24gPT0gQWNjZXNzaWJpbGl0eU9iamVjdEluY2x1c2lvbjo6SW5jbHVkZU9iamVj
dCkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKIAotICAgICAgICBpZiAoaXNSZW5kZXJJbWFn
ZSkgeworICAgICAgICBpZiAoaW1hZ2UpIHsKICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBvbmUt
ZGltZW5zaW9uYWwgaW1hZ2UKLSAgICAgICAgICAgIFJlbmRlckltYWdlJiBpbWFnZSA9IGRvd25j
YXN0PFJlbmRlckltYWdlPigqbV9yZW5kZXJlcik7Ci0gICAgICAgICAgICBpZiAoaW1hZ2UuaGVp
Z2h0KCkgPD0gMSB8fCBpbWFnZS53aWR0aCgpIDw9IDEpCisgICAgICAgICAgICBpZiAoaW1hZ2Ut
PmhlaWdodCgpIDw9IDEgfHwgaW1hZ2UtPndpZHRoKCkgPD0gMSkKICAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKIAogICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciByZW5kZXJlZCBpbWFn
ZSB3YXMgc3RyZXRjaGVkIGZyb20gb25lLWRpbWVuc2lvbmFsIGZpbGUgaW1hZ2UKLSAgICAgICAg
ICAgIGlmIChpbWFnZS5jYWNoZWRJbWFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgTGF5b3V0U2l6
ZSBpbWFnZVNpemUgPSBpbWFnZS5jYWNoZWRJbWFnZSgpLT5pbWFnZVNpemVGb3JSZW5kZXJlcigm
aW1hZ2UsIGltYWdlLnZpZXcoKS56b29tRmFjdG9yKCkpOworICAgICAgICAgICAgaWYgKGltYWdl
LT5jYWNoZWRJbWFnZSgpKSB7CisgICAgICAgICAgICAgICAgTGF5b3V0U2l6ZSBpbWFnZVNpemUg
PSBpbWFnZS0+Y2FjaGVkSW1hZ2UoKS0+aW1hZ2VTaXplRm9yUmVuZGVyZXIoaW1hZ2UuZ2V0KCks
IGltYWdlLT52aWV3KCkuem9vbUZhY3RvcigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gaW1h
Z2VTaXplLmhlaWdodCgpIDw9IDEgfHwgaW1hZ2VTaXplLndpZHRoKCkgPD0gMTsKICAgICAgICAg
ICAgIH0KICAgICAgICAgfQpAQCAtMTI4MCwxNyArMTI5MSwxNyBAQCBib29sIEFjY2Vzc2liaWxp
dHlSZW5kZXJPYmplY3Q6OmNvbXB1dGVBY2Nlc3NpYmlsaXR5SXNJZ25vcmVkKCkgY29uc3QKICAg
ICBpZiAoaXNNYXRoRWxlbWVudCgpKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAjZW5kaWYKLSAg
ICAKLSAgICBpZiAoaXM8UmVuZGVyQmxvY2tGbG93PigqbV9yZW5kZXJlcikgJiYgbV9yZW5kZXJl
ci0+Y2hpbGRyZW5JbmxpbmUoKSAmJiAhY2FuU2V0Rm9jdXNBdHRyaWJ1dGUoKSkKLSAgICAgICAg
cmV0dXJuICFkb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCptX3JlbmRlcmVyKS5oYXNMaW5lcygp
ICYmICFtb3VzZUJ1dHRvbkxpc3RlbmVyKCk7Ci0gICAgCisKKyAgICBXZWFrUHRyIGJsb2NrRmxv
dyA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJCbG9ja0Zsb3c+KCptX3JlbmRlcmVyKTsKKyAgICBp
ZiAoYmxvY2tGbG93ICYmIG1fcmVuZGVyZXItPmNoaWxkcmVuSW5saW5lKCkgJiYgIWNhblNldEZv
Y3VzQXR0cmlidXRlKCkpCisgICAgICAgIHJldHVybiAhYmxvY2tGbG93LT5oYXNMaW5lcygpICYm
ICFtb3VzZUJ1dHRvbkxpc3RlbmVyKCk7CisKICAgICBpZiAoaXNDYW52YXMoKSkgewogICAgICAg
ICBpZiAoY2FudmFzSGFzRmFsbGJhY2tDb250ZW50KCkpCiAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CiAKLSAgICAgICAgaWYgKGlzPFJlbmRlckJveD4oKm1fcmVuZGVyZXIpKSB7Ci0gICAgICAg
ICAgICBhdXRvJiBjYW52YXNCb3ggPSBkb3duY2FzdDxSZW5kZXJCb3g+KCptX3JlbmRlcmVyKTsK
LSAgICAgICAgICAgIGlmIChjYW52YXNCb3guaGVpZ2h0KCkgPD0gMSB8fCBjYW52YXNCb3gud2lk
dGgoKSA8PSAxKQorICAgICAgICBpZiAoV2Vha1B0ciBjYW52YXNCb3ggPSBkeW5hbWljRG93bmNh
c3Q8UmVuZGVyQm94PigqbV9yZW5kZXJlcikpIHsKKyAgICAgICAgICAgIGlmIChjYW52YXNCb3gt
PmhlaWdodCgpIDw9IDEgfHwgY2FudmFzQm94LT53aWR0aCgpIDw9IDEpCiAgICAgICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICAgICAgLy8gT3RoZXJ3aXNlIGZhbGwgdGhy
b3VnaDsgdXNlIHByZXNlbmNlIG9mIGhlbHAgdGV4dCwgdGl0bGUsIG9yIGRlc2NyaXB0aW9uIHRv
IGRlY2lkZS4KQEAgLTEzNjQsOSArMTM3NSw4IEBAIGJvb2wgQWNjZXNzaWJpbGl0eVJlbmRlck9i
amVjdDo6Y29tcHV0ZUFjY2Vzc2liaWxpdHlJc0lnbm9yZWQoKSBjb25zdAogCiBpbnQgQWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdDo6bGF5b3V0Q291bnQoKSBjb25zdAogewotICAgIGlmICghbV9y
ZW5kZXJlciB8fCAhaXM8UmVuZGVyVmlldz4oKm1fcmVuZGVyZXIpKQotICAgICAgICByZXR1cm4g
MDsKLSAgICByZXR1cm4gZG93bmNhc3Q8UmVuZGVyVmlldz4oKm1fcmVuZGVyZXIpLmZyYW1lVmll
dygpLmxheW91dENvbnRleHQoKS5sYXlvdXRDb3VudCgpOworICAgIGF1dG8qIHZpZXcgPSBkeW5h
bWljRG93bmNhc3Q8UmVuZGVyVmlldz4obV9yZW5kZXJlci5nZXQoKSk7CisgICAgcmV0dXJuIHZp
ZXcgPyB2aWV3LT5mcmFtZVZpZXcoKS5sYXlvdXRDb250ZXh0KCkubGF5b3V0Q291bnQoKSA6IDA7
CiB9CiAKIENoYXJhY3RlclJhbmdlIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OmRvY3VtZW50
QmFzZWRTZWxlY3RlZFRleHRSYW5nZSgpIGNvbnN0CkBAIC0xMzkwLDEyICsxNDAwLDEyIEBAIFN0
cmluZyBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzZWxlY3RlZFRleHQoKSBjb25zdAogICAg
IAogICAgIGlmIChpc1NlY3VyZUZpZWxkKCkpCiAgICAgICAgIHJldHVybiBTdHJpbmcoKTsgLy8g
bmVlZCB0byByZXR1cm4gc29tZXRoaW5nIGRpc3RpbmN0IGZyb20gZW1wdHkgc3RyaW5nCi0gICAg
CisKICAgICBpZiAoaXNOYXRpdmVUZXh0Q29udHJvbCgpKSB7Ci0gICAgICAgIEhUTUxUZXh0Rm9y
bUNvbnRyb2xFbGVtZW50JiB0ZXh0Q29udHJvbCA9IGRvd25jYXN0PFJlbmRlclRleHRDb250cm9s
PigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpOworICAgICAgICBhdXRvJiB0
ZXh0Q29udHJvbCA9IHVuY2hlY2tlZERvd25jYXN0PFJlbmRlclRleHRDb250cm9sPigqbV9yZW5k
ZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpOwogICAgICAgICByZXR1cm4gdGV4dENvbnRy
b2wuc2VsZWN0ZWRUZXh0KCk7CiAgICAgfQotICAgIAorCiAgICAgcmV0dXJuIGRvQVhTdHJpbmdG
b3JSYW5nZShkb2N1bWVudEJhc2VkU2VsZWN0ZWRUZXh0UmFuZ2UoKSk7CiB9CiAKQEAgLTE0MDgs
NyArMTQxOCw3IEBAIENoYXJhY3RlclJhbmdlIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6OnNl
bGVjdGVkVGV4dFJhbmdlKCkgY29uc3QKIAogICAgIC8vIFVzZSB0aGUgdGV4dCBjb250cm9sIG5h
dGl2ZSByYW5nZSBpZiBpdCdzIGEgbmF0aXZlIG9iamVjdC4KICAgICBpZiAoaXNOYXRpdmVUZXh0
Q29udHJvbCgpKSB7Ci0gICAgICAgIGF1dG8mIHRleHRDb250cm9sID0gZG93bmNhc3Q8UmVuZGVy
VGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7CisgICAg
ICAgIGF1dG8mIHRleHRDb250cm9sID0gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyVGV4dENvbnRy
b2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRyb2xFbGVtZW50KCk7CiAgICAgICAgIHJldHVy
biB7IHRleHRDb250cm9sLnNlbGVjdGlvblN0YXJ0KCksIHRleHRDb250cm9sLnNlbGVjdGlvbkVu
ZCgpIC0gdGV4dENvbnRyb2wuc2VsZWN0aW9uU3RhcnQoKSB9OwogICAgIH0KIApAQCAtMTQ4Myw3
ICsxNDkzLDcgQEAgaW50IEFjY2Vzc2liaWxpdHlSZW5kZXJPYmplY3Q6Omluc2VydGlvblBvaW50
TGluZU51bWJlcigpIGNvbnN0CiAKICAgICAvLyBVc2UgdGhlIHRleHQgY29udHJvbCBuYXRpdmUg
cmFuZ2UgaWYgaXQncyBhIG5hdGl2ZSBvYmplY3QuCiAgICAgaWYgKGlzTmF0aXZlVGV4dENvbnRy
b2woKSkgewotICAgICAgICBhdXRvJiB0ZXh0Q29udHJvbCA9IGRvd25jYXN0PFJlbmRlclRleHRD
b250cm9sPigqbV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpOworICAgICAgICBh
dXRvJiB0ZXh0Q29udHJvbCA9IHVuY2hlY2tlZERvd25jYXN0PFJlbmRlclRleHRDb250cm9sPigq
bV9yZW5kZXJlcikudGV4dEZvcm1Db250cm9sRWxlbWVudCgpOwogICAgICAgICBpbnQgc3RhcnQg
PSB0ZXh0Q29udHJvbC5zZWxlY3Rpb25TdGFydCgpOwogICAgICAgICBpbnQgZW5kID0gdGV4dENv
bnRyb2wuc2VsZWN0aW9uRW5kKCk7CiAKQEAgLTE1MzMsNyArMTU0Myw3IEBAIHZvaWQgQWNjZXNz
aWJpbGl0eVJlbmRlck9iamVjdDo6c2V0U2VsZWN0ZWRUZXh0UmFuZ2UoQ2hhcmFjdGVyUmFuZ2Um
JiByYW5nZSkKICAgICAgICAgY2xpZW50LT53aWxsQ2hhbmdlU2VsZWN0aW9uRm9yQWNjZXNzaWJp
bGl0eSgpOwogCiAgICAgaWYgKGlzTmF0aXZlVGV4dENvbnRyb2woKSkgewotICAgICAgICBIVE1M
VGV4dEZvcm1Db250cm9sRWxlbWVudCYgdGV4dENvbnRyb2wgPSBkb3duY2FzdDxSZW5kZXJUZXh0
Q29udHJvbD4oKm1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKKyAgICAgICAg
YXV0byYgdGV4dENvbnRyb2wgPSB1bmNoZWNrZWREb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4o
Km1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1lbnQoKTsKICAgICAgICAgdGV4dENvbnRy
b2wuc2V0U2VsZWN0aW9uUmFuZ2UocmFuZ2UubG9jYXRpb24sIHJhbmdlLmxvY2F0aW9uICsgcmFu
Z2UubGVuZ3RoKTsKICAgICB9IGVsc2UgaWYgKG1fcmVuZGVyZXIpIHsKICAgICAgICAgQVNTRVJU
KG5vZGUoKSk7CkBAIC0xNjU2LDggKzE2NjYsOCBAQCBBWENvcmVPYmplY3Q6OkFjY2Vzc2liaWxp
dHlDaGlsZHJlblZlY3RvciBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojpkb2N1bWVudExpbgog
ICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxk
bid0IHJldHJpZXZlIHRoZSBhbHJlYWR5IGV4aXN0aW5nIGltYWdlLW1hcCBsaW5rcyBmcm9tIHRo
ZSBwYXJlbnQgaW1hZ2UsIHNvIGNyZWF0ZSBhIG5ldyBvbmUuCiAgICAgICAgICAgICAgICAgICAg
IEFTU0VSVF9OT1RfUkVBQ0hFRCgiVW5leHBlY3RlZGx5IG1pc3NpbmcgaW1hZ2UtbWFwIGxpbmsg
cGFyZW50IEFYIG9iamVjdC4iKTsKLSAgICAgICAgICAgICAgICAgICAgYXV0byYgYXJlYU9iamVj
dCA9IGRvd25jYXN0PEFjY2Vzc2liaWxpdHlJbWFnZU1hcExpbms+KCpheE9iamVjdENhY2hlKCkt
PmNyZWF0ZShBY2Nlc3NpYmlsaXR5Um9sZTo6SW1hZ2VNYXBMaW5rKSk7Ci0gICAgICAgICAgICAg
ICAgICAgIGFyZWFPYmplY3Quc2V0SFRNTEFyZWFFbGVtZW50KGRvd25jYXN0PEhUTUxBcmVhRWxl
bWVudD4oY3VycmVudCkpOworICAgICAgICAgICAgICAgICAgICBhdXRvJiBhcmVhT2JqZWN0ID0g
dW5jaGVja2VkRG93bmNhc3Q8QWNjZXNzaWJpbGl0eUltYWdlTWFwTGluaz4oKmF4T2JqZWN0Q2Fj
aGUoKS0+Y3JlYXRlKEFjY2Vzc2liaWxpdHlSb2xlOjpJbWFnZU1hcExpbmspKTsKKyAgICAgICAg
ICAgICAgICAgICAgYXJlYU9iamVjdC5zZXRIVE1MQXJlYUVsZW1lbnQodW5jaGVja2VkRG93bmNh
c3Q8SFRNTEFyZWFFbGVtZW50PihjdXJyZW50KSk7CiAgICAgICAgICAgICAgICAgICAgIGFyZWFP
YmplY3Quc2V0SFRNTE1hcEVsZW1lbnQocGFyZW50TWFwKTsKICAgICAgICAgICAgICAgICAgICAg
YXJlYU9iamVjdC5zZXRQYXJlbnQoYWNjZXNzaWJpbGl0eVBhcmVudEZvckltYWdlTWFwKHBhcmVu
dE1hcCkpOwogICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCZhcmVhT2JqZWN0KTsK
QEAgLTE2ODEsMTQgKzE2OTEsMTUgQEAgV2lkZ2V0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
Ojp3aWRnZXRGb3JBdHRhY2htZW50VmlldygpIGNvbnN0CiB7CiAgICAgaWYgKCFpc0F0dGFjaG1l
bnQoKSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgcmV0dXJuIGRvd25jYXN0PFJlbmRl
cldpZGdldD4oKm1fcmVuZGVyZXIpLndpZGdldCgpOworICAgIGF1dG8qIHJlbmRlcldpZGdldCA9
IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJXaWRnZXQ+KCptX3JlbmRlcmVyKTsKKyAgICByZXR1cm4g
cmVuZGVyV2lkZ2V0ID8gcmVuZGVyV2lkZ2V0LT53aWRnZXQoKSA6IG51bGxwdHI7CiB9CiAKIFZp
c2libGVQb3NpdGlvbiBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0Ojp2aXNpYmxlUG9zaXRpb25G
b3JJbmRleChpbnQgaW5kZXgpIGNvbnN0CiB7CiAgICAgaWYgKG1fcmVuZGVyZXIpIHsKICAgICAg
ICAgaWYgKGlzTmF0aXZlVGV4dENvbnRyb2woKSkgewotICAgICAgICAgICAgYXV0byYgdGV4dENv
bnRyb2wgPSBkb3duY2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVyZXIpLnRleHRGb3Jt
Q29udHJvbEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGF1dG8mIHRleHRDb250cm9sID0gdW5jaGVj
a2VkRG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0Rm9ybUNvbnRy
b2xFbGVtZW50KCk7CiAgICAgICAgICAgICByZXR1cm4gdGV4dENvbnRyb2wudmlzaWJsZVBvc2l0
aW9uRm9ySW5kZXgoc3RkOjpjbGFtcChpbmRleCwgMCwgc3RhdGljX2Nhc3Q8aW50Pih0ZXh0Q29u
dHJvbC52YWx1ZSgpLmxlbmd0aCgpKSkpOwogICAgICAgICB9CiAKQEAgLTE3MDIsNyArMTcxMyw3
IEBAIGludCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjppbmRleEZvclZpc2libGVQb3NpdGlv
bihjb25zdCBWaXNpYmxlUG9zaXRpb24mIHBvCiB7CiAgICAgaWYgKG1fcmVuZGVyZXIpIHsKICAg
ICAgICAgaWYgKGlzTmF0aXZlVGV4dENvbnRyb2woKSkKLSAgICAgICAgICAgIHJldHVybiBkb3du
Y2FzdDxSZW5kZXJUZXh0Q29udHJvbD4oKm1fcmVuZGVyZXIpLnRleHRGb3JtQ29udHJvbEVsZW1l
bnQoKS5pbmRleEZvclZpc2libGVQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICByZXR1
cm4gdW5jaGVja2VkRG93bmNhc3Q8UmVuZGVyVGV4dENvbnRyb2w+KCptX3JlbmRlcmVyKS50ZXh0
Rm9ybUNvbnRyb2xFbGVtZW50KCkuaW5kZXhGb3JWaXNpYmxlUG9zaXRpb24ocG9zaXRpb24pOwog
CiAgICAgICAgIGlmICghYWxsb3dzVGV4dFJhbmdlcygpICYmICFpczxSZW5kZXJUZXh0PigqbV9y
ZW5kZXJlcikpCiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTE3NzcsNyArMTc4OCw3IEBAIHZv
aWQgQWNjZXNzaWJpbGl0eVJlbmRlck9iamVjdDo6c2V0U2VsZWN0ZWRWaXNpYmxlUG9zaXRpb25S
YW5nZShjb25zdCBWaXNpYmxlUG9zCiAgICAgaWYgKGlzTmF0aXZlVGV4dENvbnRyb2woKSkgewog
ICAgICAgICAvLyBpc05hdGl2ZVRleHRDb250cm9sIHJldHVybnMgdHJ1ZSBvbmx5IGlmIHRoaXMt
Pm5vZGUoKSBpczxIVE1MVGV4dEFyZWFFbGVtZW50PiBvciBpczxIVE1MSW5wdXRFbGVtZW50Pi4K
ICAgICAgICAgLy8gU2luY2UgYm90aCBIVE1MVGV4dEFyZWFFbGVtZW50IGFuZCBIVE1MSW5wdXRF
bGVtZW50IGRlcml2ZSBmcm9tIEhUTUxUZXh0Rm9ybUNvbnRyb2xFbGVtZW50LCBpdCBpcyBzYWZl
IHRvIGRvd25jYXN0IGhlcmUuCi0gICAgICAgIGF1dG8qIHRleHRDb250cm9sID0gZG93bmNhc3Q8
SFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQ+KG5vZGUoKSk7CisgICAgICAgIGF1dG8qIHRleHRD
b250cm9sID0gdW5jaGVja2VkRG93bmNhc3Q8SFRNTFRleHRGb3JtQ29udHJvbEVsZW1lbnQ+KG5v
ZGUoKSk7CiAgICAgICAgIGludCBzdGFydCA9IHRleHRDb250cm9sLT5pbmRleEZvclZpc2libGVQ
b3NpdGlvbihyYW5nZS5zdGFydCk7CiAgICAgICAgIGludCBlbmQgPSB0ZXh0Q29udHJvbC0+aW5k
ZXhGb3JWaXNpYmxlUG9zaXRpb24ocmFuZ2UuZW5kKTsKIApAQCAtMjAwNywxNCArMjAxOCwxNCBA
QCBBY2Nlc3NpYmlsaXR5T2JqZWN0KiBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0OjphY2Nlc3Np
YmlsaXR5SGl0VGVzdChjb25zdCBJbnRQbwogewogICAgIGlmICghbV9yZW5kZXJlciB8fCAhbV9y
ZW5kZXJlci0+aGFzTGF5ZXIoKSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgCisKICAg
ICBtX3JlbmRlcmVyLT5kb2N1bWVudCgpLnVwZGF0ZUxheW91dCgpOwogCiAgICAgaWYgKCFtX3Jl
bmRlcmVyIHx8ICFtX3JlbmRlcmVyLT5oYXNMYXllcigpKQogICAgICAgICByZXR1cm4gbnVsbHB0
cjsKIAotICAgIFJlbmRlckxheWVyKiBsYXllciA9IGRvd25jYXN0PFJlbmRlckJveD4oKm1fcmVu
ZGVyZXIpLmxheWVyKCk7Ci0gICAgIAorICAgIGF1dG8qIGxheWVyID0gdW5jaGVja2VkRG93bmNh
c3Q8UmVuZGVyQm94PigqbV9yZW5kZXJlcikubGF5ZXIoKTsKKwogICAgIGNvbnN0ZXhwciBPcHRp
b25TZXQ8SGl0VGVzdFJlcXVlc3Q6OlR5cGU+IGhpdFR5cGUgeyBIaXRUZXN0UmVxdWVzdDo6VHlw
ZTo6UmVhZE9ubHksIEhpdFRlc3RSZXF1ZXN0OjpUeXBlOjpBY3RpdmUsIEhpdFRlc3RSZXF1ZXN0
OjpUeXBlOjpBY2Nlc3NpYmlsaXR5SGl0VGVzdCB9OwogICAgIEhpdFRlc3RSZXN1bHQgaGl0VGVz
dFJlc3VsdCB7IHBvaW50IH07CiAgICAgbGF5ZXItPmhpdFRlc3QoaGl0VHlwZSwgaGl0VGVzdFJl
c3VsdCk7CkBAIC0yMjkwLDcgKzIzMDEsNyBAQCB2b2lkIEFjY2Vzc2liaWxpdHlSZW5kZXJPYmpl
Y3Q6OmFkZEltYWdlTWFwQ2hpbGRyZW4oKQogICAgICAgICAvLyBhZGQgYW4gPGFyZWE+IGVsZW1l
bnQgZm9yIHRoaXMgY2hpbGQgaWYgaXQgaGFzIGEgbGluawogICAgICAgICBpZiAoIWFyZWEuaXNM
aW5rKCkpCiAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgYXV0byYgYXJlYU9iamVjdCA9
IGRvd25jYXN0PEFjY2Vzc2liaWxpdHlJbWFnZU1hcExpbms+KCpheE9iamVjdENhY2hlKCktPmNy
ZWF0ZShBY2Nlc3NpYmlsaXR5Um9sZTo6SW1hZ2VNYXBMaW5rKSk7CisgICAgICAgIGF1dG8mIGFy
ZWFPYmplY3QgPSB1bmNoZWNrZWREb3duY2FzdDxBY2Nlc3NpYmlsaXR5SW1hZ2VNYXBMaW5rPigq
YXhPYmplY3RDYWNoZSgpLT5jcmVhdGUoQWNjZXNzaWJpbGl0eVJvbGU6OkltYWdlTWFwTGluaykp
OwogICAgICAgICBhcmVhT2JqZWN0LnNldEhUTUxBcmVhRWxlbWVudCgmYXJlYSk7CiAgICAgICAg
IGFyZWFPYmplY3Quc2V0SFRNTE1hcEVsZW1lbnQobWFwLmdldCgpKTsKICAgICAgICAgYXJlYU9i
amVjdC5zZXRQYXJlbnQodGhpcyk7CkBAIC0yMzExLDcgKzIzMjIsNyBAQCB2b2lkIEFjY2Vzc2li
aWxpdHlSZW5kZXJPYmplY3Q6OmFkZFRleHRGaWVsZENoaWxkcmVuKCkKICAgICBpZiAoIXNwaW5C
dXR0b25FbGVtZW50KQogICAgICAgICByZXR1cm47CiAKLSAgICBhdXRvJiBheFNwaW5CdXR0b24g
PSBkb3duY2FzdDxBY2Nlc3NpYmlsaXR5U3BpbkJ1dHRvbj4oKmF4T2JqZWN0Q2FjaGUoKS0+Y3Jl
YXRlKEFjY2Vzc2liaWxpdHlSb2xlOjpTcGluQnV0dG9uKSk7CisgICAgYXV0byYgYXhTcGluQnV0
dG9uID0gdW5jaGVja2VkRG93bmNhc3Q8QWNjZXNzaWJpbGl0eVNwaW5CdXR0b24+KCpheE9iamVj
dENhY2hlKCktPmNyZWF0ZShBY2Nlc3NpYmlsaXR5Um9sZTo6U3BpbkJ1dHRvbikpOwogICAgIGF4
U3BpbkJ1dHRvbi5zZXRTcGluQnV0dG9uRWxlbWVudChzcGluQnV0dG9uRWxlbWVudCk7CiAgICAg
YXhTcGluQnV0dG9uLnNldFBhcmVudCh0aGlzKTsKICAgICBhZGRDaGlsZCgmYXhTcGluQnV0dG9u
KTsKQEAgLTI0OTUsNyArMjUwNiw3IEBAIFJlbmRlck9iamVjdCogQWNjZXNzaWJpbGl0eVJlbmRl
ck9iamVjdDo6bWFya2VyUmVuZGVyZXIoKSBjb25zdAogICAgIGlmIChhY2Nlc3NpYmlsaXR5SXNJ
Z25vcmVkKCkgfHwgIWlzTGlzdEl0ZW0oKSB8fCAhbV9yZW5kZXJlciB8fCAhbV9yZW5kZXJlci0+
aXNSZW5kZXJMaXN0SXRlbSgpKQogICAgICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIHJldHVy
biBkb3duY2FzdDxSZW5kZXJMaXN0SXRlbT4oKm1fcmVuZGVyZXIpLm1hcmtlclJlbmRlcmVyKCk7
CisgICAgcmV0dXJuIHVuY2hlY2tlZERvd25jYXN0PFJlbmRlckxpc3RJdGVtPigqbV9yZW5kZXJl
cikubWFya2VyUmVuZGVyZXIoKTsKIH0KIAogdm9pZCBBY2Nlc3NpYmlsaXR5UmVuZGVyT2JqZWN0
OjphZGRMaXN0SXRlbU1hcmtlcigpCkBAIC0yNjg3LDEzICsyNjk4LDExIEBAIFN0cmluZyBBY2Nl
c3NpYmlsaXR5UmVuZGVyT2JqZWN0OjpzZWN1cmVGaWVsZFZhbHVlKCkgY29uc3QKICAgICAvLyBM
b29rIGZvciB0aGUgUmVuZGVyVGV4dCBvYmplY3QgaW4gdGhlIFJlbmRlck9iamVjdCB0cmVlIGZv
ciB0aGlzIGlucHV0IGZpZWxkLgogICAgIFJlbmRlck9iamVjdCogcmVuZGVyZXIgPSBub2RlKCkt
PnJlbmRlcmVyKCk7CiAgICAgd2hpbGUgKHJlbmRlcmVyICYmICFpczxSZW5kZXJUZXh0PihyZW5k
ZXJlcikpCi0gICAgICAgIHJlbmRlcmVyID0gZG93bmNhc3Q8UmVuZGVyRWxlbWVudD4oKnJlbmRl
cmVyKS5maXJzdENoaWxkKCk7Ci0KLSAgICBpZiAoIWlzPFJlbmRlclRleHQ+KHJlbmRlcmVyKSkK
LSAgICAgICAgcmV0dXJuIFN0cmluZygpOworICAgICAgICByZW5kZXJlciA9IHVuY2hlY2tlZERv
d25jYXN0PFJlbmRlckVsZW1lbnQ+KCpyZW5kZXJlcikuZmlyc3RDaGlsZCgpOwogCisgICAgYXV0
byogcmVuZGVyVGV4dCA9IGR5bmFtaWNEb3duY2FzdDxSZW5kZXJUZXh0PihyZW5kZXJlcik7CiAg
ICAgLy8gUmV0dXJuIHRoZSB0ZXh0IHRoYXQgaXMgYWN0dWFsbHkgYmVpbmcgcmVuZGVyZWQgaW4g
dGhlIGlucHV0IGZpZWxkLgotICAgIHJldHVybiBkb3duY2FzdDxSZW5kZXJUZXh0PigqcmVuZGVy
ZXIpLnRleHRXaXRob3V0Q29udmVydGluZ0JhY2tzbGFzaFRvWWVuU3ltYm9sKCk7CisgICAgcmV0
dXJuIHJlbmRlclRleHQgPyByZW5kZXJUZXh0LT50ZXh0V2l0aG91dENvbnZlcnRpbmdCYWNrc2xh
c2hUb1llblN5bWJvbCgpIDogU3RyaW5nKCk7CiB9CiAKIFNjcm9sbGFibGVBcmVhKiBBY2Nlc3Np
YmlsaXR5UmVuZGVyT2JqZWN0OjpnZXRTY3JvbGxhYmxlQXJlYUlmU2Nyb2xsYWJsZSgpIGNvbnN0
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlT
Y3JvbGxWaWV3LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2FjY2Vzc2liaWxpdHkvQWNjZXNzaWJpbGl0
eVNjcm9sbFZpZXcuY3BwCmluZGV4IDZiYzg0MWViYjA2Ny4uMmJiYzMwODdiOWY4IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlTY3JvbGxWaWV3
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9hY2Nlc3NpYmlsaXR5L0FjY2Vzc2liaWxpdHlTY3Jv
bGxWaWV3LmNwcApAQCAtNDAsOCArNDAsOCBAQCBBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6QWNj
ZXNzaWJpbGl0eVNjcm9sbFZpZXcoU2Nyb2xsVmlldyogdmlldykKICAgICA6IG1fc2Nyb2xsVmll
dyh2aWV3KQogICAgICwgbV9jaGlsZHJlbkRpcnR5KGZhbHNlKQogewotICAgIGlmIChpczxMb2Nh
bEZyYW1lVmlldz4odmlldykpCi0gICAgICAgIG1fZnJhbWVPd25lckVsZW1lbnQgPSBkb3duY2Fz
dDxMb2NhbEZyYW1lVmlldz4oKnZpZXcpLmZyYW1lKCkub3duZXJFbGVtZW50KCk7CisgICAgaWYg
KGF1dG8qIGxvY2FsRnJhbWVWaWV3ID0gZHluYW1pY0Rvd25jYXN0PExvY2FsRnJhbWVWaWV3Pih2
aWV3KSkKKyAgICAgICAgbV9mcmFtZU93bmVyRWxlbWVudCA9IGxvY2FsRnJhbWVWaWV3LT5mcmFt
ZSgpLm93bmVyRWxlbWVudCgpOwogfQogCiBBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6fkFjY2Vz
c2liaWxpdHlTY3JvbGxWaWV3KCkKQEAgLTE2MywxMiArMTYzLDEyIEBAIEFjY2Vzc2liaWxpdHlT
Y3JvbGxiYXIqIEFjY2Vzc2liaWxpdHlTY3JvbGxWaWV3OjphZGRDaGlsZFNjcm9sbGJhcihTY3Jv
bGxiYXIqIHNjCiB7CiAgICAgaWYgKCFzY3JvbGxiYXIpCiAgICAgICAgIHJldHVybiBudWxscHRy
OwotICAgIAotICAgIEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0gYXhPYmplY3RDYWNoZSgpOworCisg
ICAgV2Vha1B0ciBjYWNoZSA9IGF4T2JqZWN0Q2FjaGUoKTsKICAgICBpZiAoIWNhY2hlKQogICAg
ICAgICByZXR1cm4gbnVsbHB0cjsKIAotICAgIGF1dG8mIHNjcm9sbEJhck9iamVjdCA9IGRvd25j
YXN0PEFjY2Vzc2liaWxpdHlTY3JvbGxiYXI+KCpjYWNoZS0+Z2V0T3JDcmVhdGUoc2Nyb2xsYmFy
KSk7CisgICAgYXV0byYgc2Nyb2xsQmFyT2JqZWN0ID0gdW5jaGVja2VkRG93bmNhc3Q8QWNjZXNz
aWJpbGl0eVNjcm9sbGJhcj4oKmNhY2hlLT5nZXRPckNyZWF0ZShzY3JvbGxiYXIpKTsKICAgICBz
Y3JvbGxCYXJPYmplY3Quc2V0UGFyZW50KHRoaXMpOwogICAgIGFkZENoaWxkKCZzY3JvbGxCYXJP
YmplY3QpOwogICAgIHJldHVybiAmc2Nyb2xsQmFyT2JqZWN0OwpAQCAtMjQyLDI4ICsyNDIsMjYg
QEAgRG9jdW1lbnQqIEFjY2Vzc2liaWxpdHlTY3JvbGxWaWV3Ojpkb2N1bWVudCgpIGNvbnN0CiAK
IExvY2FsRnJhbWVWaWV3KiBBY2Nlc3NpYmlsaXR5U2Nyb2xsVmlldzo6ZG9jdW1lbnRGcmFtZVZp
ZXcoKSBjb25zdAogewotICAgIGlmIChpczxMb2NhbEZyYW1lVmlldz4obV9zY3JvbGxWaWV3KSkK
LSAgICAgICAgcmV0dXJuIGRvd25jYXN0PExvY2FsRnJhbWVWaWV3PihtX3Njcm9sbFZpZXcuZ2V0
KCkpOworICAgIGlmIChhdXRvKiBsb2NhbEZyYW1lVmlldyA9IGR5bmFtaWNEb3duY2FzdDxMb2Nh
bEZyYW1lVmlldz4obV9zY3JvbGxWaWV3LmdldCgpKSkKKyAgICAgICAgcmV0dXJuIGxvY2FsRnJh
bWVWaWV3OwogCiAgICAgaWYgKG1fZnJhbWVPd25lckVsZW1lbnQgJiYgbV9mcmFtZU93bmVyRWxl
bWVudC0+Y29udGVudERvY3VtZW50KCkpCiAgICAgICAgIHJldHVybiBtX2ZyYW1lT3duZXJFbGVt
ZW50LT5jb250ZW50RG9jdW1lbnQoKS0+dmlldygpOwotCiAgICAgcmV0dXJuIG51bGxwdHI7CiB9
CiAKIEFjY2Vzc2liaWxpdHlPYmplY3QqIEFjY2Vzc2liaWxpdHlTY3JvbGxWaWV3OjpwYXJlbnRP
YmplY3QoKSBjb25zdAogewotICAgIEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0gYXhPYmplY3RDYWNo
ZSgpOworICAgIFdlYWtQdHIgY2FjaGUgPSBheE9iamVjdENhY2hlKCk7CiAgICAgaWYgKCFjYWNo
ZSkKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAKLSAgICBIVE1MRnJhbWVPd25lckVsZW1lbnQq
IG93bmVyID0gbV9mcmFtZU93bmVyRWxlbWVudC5nZXQoKTsKLSAgICBpZiAoaXM8TG9jYWxGcmFt
ZVZpZXc+KG1fc2Nyb2xsVmlldykpCi0gICAgICAgIG93bmVyID0gZG93bmNhc3Q8TG9jYWxGcmFt
ZVZpZXc+KCptX3Njcm9sbFZpZXcpLmZyYW1lKCkub3duZXJFbGVtZW50KCk7Ci0KLSAgICBpZiAo
b3duZXIgJiYgb3duZXItPnJlbmRlcmVyKCkpCi0gICAgICAgIHJldHVybiBjYWNoZS0+Z2V0T3JD
cmVhdGUob3duZXIpOworICAgIFdlYWtQdHIgb3duZXIgPSBtX2ZyYW1lT3duZXJFbGVtZW50Lmdl
dCgpOworICAgIGlmIChhdXRvKiBsb2NhbEZyYW1lVmlldyA9IGR5bmFtaWNEb3duY2FzdDxMb2Nh
bEZyYW1lVmlldz4obV9zY3JvbGxWaWV3LmdldCgpKSkKKyAgICAgICAgb3duZXIgPSBsb2NhbEZy
YW1lVmlldy0+ZnJhbWUoKS5vd25lckVsZW1lbnQoKTsKIAorICAgIGlmIChjYWNoZSAmJiBvd25l
ciAmJiBvd25lci0+cmVuZGVyZXIoKSkKKyAgICAgICAgcmV0dXJuIGNhY2hlLT5nZXRPckNyZWF0
ZShvd25lci5nZXQoKSk7CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAK
</data>

          </attachment>
      

    </bug>

</bugzilla>