<?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>158217</bug_id>
          
          <creation_ts>2016-05-30 16:38:55 -0700</creation_ts>
          <short_desc>Clean up / modernize iOS text autosizing code</short_desc>
          <delta_ts>2016-06-14 16:47:10 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>158765</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Dumez">cdumez</reporter>
          <assigned_to name="Chris Dumez">cdumez</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>esprehn+autocc</cc>
    
    <cc>glenn</cc>
    
    <cc>kangil.han</cc>
    
    <cc>koivisto</cc>
    
    <cc>kondapallykalyan</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1197689</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-05-30 16:38:55 -0700</bug_when>
    <thetext>Clean up / modernize iOS text autosizing code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197695</commentid>
    <comment_count>1</comment_count>
      <attachid>280115</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-05-30 17:01:41 -0700</bug_when>
    <thetext>Created attachment 280115
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197706</commentid>
    <comment_count>2</comment_count>
      <attachid>280115</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-05-30 20:02:44 -0700</bug_when>
    <thetext>Comment on attachment 280115
Patch

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

Should change the header file to use #pragma once.

&gt; Source/WebCore/ChangeLog:25
&gt; +        - Rename node to textNode for clarity.

Not sure we need this change.

&gt; Source/WebCore/dom/Document.cpp:5290
&gt; +    auto addResult = m_textAutoSizedNodes.ensure(TextAutoSizingKey(textNode.renderer()-&gt;style()), [] {
&gt; +        return std::make_unique&lt;TextAutoSizingValue&gt;();
&gt;      });

We only need to clone the RenderStyle if we are actually allocating a new entry in the table, but the way the code works, we always make and destroy a TextAutoSizingKey every time even if it’s already in the table; that’s a lot of extra cloning! Instead of ensure, we should use the add with a hash translator to accomplish this. And we should get rid of the TextAutoSizingKey entirely and have the keys just be unique_ptr&lt;RenderStyle&gt;.

&gt; Source/WebCore/dom/Document.cpp:5294
&gt;  void Document::validateAutoSizingNodes()

This is not a great use of the name &quot;validate&quot;. I would call this updateAutoSizingNodes, I think.

&gt; Source/WebCore/dom/Document.h:1697
&gt; +    typedef HashMap&lt;TextAutoSizingKey, std::unique_ptr&lt;TextAutoSizingValue&gt;, TextAutoSizingHash, TextAutoSizingTraits&gt; TextAutoSizingMap;

Is there a reason the values need to be heap allocated instead of stored in the map? I understand that these are sets, but can’t we modify them in place inside the map?

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:93
&gt;      float averageSize = roundf(cumulativeSize / m_autoSizedNodes.size());

Should be std::round instead of roundf.

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:106
&gt; +            averageSize = roundf(specifiedSize * maxScaleIncrease);

std::round

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:166
&gt; +        auto* renderText = node-&gt;renderer();

I think a good name for this is renderer. No need to name it after the class.

&gt; Source/WebCore/rendering/TextAutoSizing.h:52
&gt;      std::unique_ptr&lt;RenderStyle&gt; m_style;

Seems like TextAutoSizingKey is actually std::unique_ptr&lt;RenderStyle&gt;. Not sure it should be a class at all. Maybe just hash table traits.

&gt; Source/WebCore/rendering/TextAutoSizing.h:96
&gt;      HashSet&lt;RefPtr&lt;Text&gt;&gt; m_autoSizedNodes;

This should be HashSet&lt;Ref&gt; rather than HashSet&lt;RefPtr&gt;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197721</commentid>
    <comment_count>3</comment_count>
      <attachid>280115</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-05-30 22:08:22 -0700</bug_when>
    <thetext>Comment on attachment 280115
Patch

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

&gt;&gt; Source/WebCore/ChangeLog:25
&gt;&gt; +        - Rename node to textNode for clarity.
&gt; 
&gt; Not sure we need this change.

Ok.

&gt;&gt; Source/WebCore/dom/Document.cpp:5290
&gt;&gt;      });
&gt; 
&gt; We only need to clone the RenderStyle if we are actually allocating a new entry in the table, but the way the code works, we always make and destroy a TextAutoSizingKey every time even if it’s already in the table; that’s a lot of extra cloning! Instead of ensure, we should use the add with a hash translator to accomplish this. And we should get rid of the TextAutoSizingKey entirely and have the keys just be unique_ptr&lt;RenderStyle&gt;.

Great idea, I will add a HashTranslator.

&gt;&gt; Source/WebCore/dom/Document.cpp:5294
&gt;&gt;  void Document::validateAutoSizingNodes()
&gt; 
&gt; This is not a great use of the name &quot;validate&quot;. I would call this updateAutoSizingNodes, I think.

Ok

&gt;&gt; Source/WebCore/dom/Document.h:1697
&gt;&gt; +    typedef HashMap&lt;TextAutoSizingKey, std::unique_ptr&lt;TextAutoSizingValue&gt;, TextAutoSizingHash, TextAutoSizingTraits&gt; TextAutoSizingMap;
&gt; 
&gt; Is there a reason the values need to be heap allocated instead of stored in the map? I understand that these are sets, but can’t we modify them in place inside the map?

Ok.

&gt;&gt; Source/WebCore/rendering/TextAutoSizing.cpp:93
&gt;&gt;      float averageSize = roundf(cumulativeSize / m_autoSizedNodes.size());
&gt; 
&gt; Should be std::round instead of roundf.

Ok

&gt;&gt; Source/WebCore/rendering/TextAutoSizing.cpp:166
&gt;&gt; +        auto* renderText = node-&gt;renderer();
&gt; 
&gt; I think a good name for this is renderer. No need to name it after the class.

This seemed to be the convention in rendering code but OK.

&gt;&gt; Source/WebCore/rendering/TextAutoSizing.h:52
&gt;&gt;      std::unique_ptr&lt;RenderStyle&gt; m_style;
&gt; 
&gt; Seems like TextAutoSizingKey is actually std::unique_ptr&lt;RenderStyle&gt;. Not sure it should be a class at all. Maybe just hash table traits.

Sounds like a good idea but I&apos;d rather not take on this task in this patch.

&gt;&gt; Source/WebCore/rendering/TextAutoSizing.h:96
&gt;&gt;      HashSet&lt;RefPtr&lt;Text&gt;&gt; m_autoSizedNodes;
&gt; 
&gt; This should be HashSet&lt;Ref&gt; rather than HashSet&lt;RefPtr&gt;.

Sadly, Ref&lt;&gt; does not play well with HashSet and HashMap AFAIK. It does not have an operator==() or a default constructor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197723</commentid>
    <comment_count>4</comment_count>
      <attachid>280119</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-05-30 22:21:11 -0700</bug_when>
    <thetext>Created attachment 280119
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197727</commentid>
    <comment_count>5</comment_count>
      <attachid>280119</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-05-30 23:51:07 -0700</bug_when>
    <thetext>Comment on attachment 280119
Patch

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

A few last comments.

&gt; Source/WebCore/dom/Document.cpp:5288
&gt; +    auto addResult = m_textAutoSizedNodes.add&lt;TextAutoSizingHashTranslator&gt;(node.renderer()-&gt;style(), TextAutoSizingValue());

A little sad that we have to create/destroy the empty HashSet every time here. I wonder what the best trick for avoiding that is. I can think of three tricks off hand:

1) Add a version of HashMap::add with the hash translator that uses an empty value for the new hash map entry if any and does not require a value argument be passed in.
2) Add a version of HashMap::ensure with the hash translator.
3) Instead of being a map, m_textAutoSizedNodes could be a HashSet with a mutable HashSet inside the set values. We would combine TextAutoSizingKey and TextAutoSizingValue into a single class. Would probably have to add HashSet::removeIf too.

&gt; Source/WebCore/dom/Document.h:49
&gt; +#include &quot;TextAutoSizing.h&quot;

Always sad for build times when we add another include to Document.h.

&gt; Source/WebCore/dom/Document.h:1697
&gt; +    typedef HashMap&lt;TextAutoSizingKey, TextAutoSizingValue, TextAutoSizingHash, TextAutoSizingTraits&gt; TextAutoSizingMap;

Could switch to using; we prefer that to typedef now in every case, I think.

&gt; Source/WebCore/dom/Document.h:1698
&gt;      TextAutoSizingMap m_textAutoSizedNodes;

Kind of strange that all the functions and the typedef call these &quot;auto sizing nodes&quot;, but the data member is named &quot;auto sized nodes&quot;.

&gt; Source/WebCore/rendering/TextAutoSizing.cpp:52
&gt; +    new (NotNull, std::addressof(m_style)) std::unique_ptr&lt;RenderStyle&gt;(reinterpret_cast&lt;RenderStyle*&gt;(-1));

I would have preferred to write this:

    HashTraits&lt;std::unique_ptr&lt;RenderStyle&gt;&gt;::constructDeletedValue(m_style);

&gt; Source/WebCore/rendering/TextAutoSizing.h:50
&gt; +    bool isDeleted() const { return m_style.get() == reinterpret_cast&lt;RenderStyle*&gt;(-1); }

I’d rather see:

    bool isDeleted() const { return HashTraits&lt;std::unique_ptr&lt;RenderStyle&gt;&gt;::isDeletedValue(m_style); }

&gt; Source/WebCore/rendering/TextAutoSizing.h:103
&gt; +struct TextAutoSizingHashTranslator {
&gt; +    static unsigned hash(const RenderStyle&amp; style)
&gt; +    {
&gt; +        return style.hashForTextAutosizing();
&gt; +    }
&gt; +
&gt; +    static bool equal(const TextAutoSizingKey&amp; key, const RenderStyle&amp; style)
&gt; +    {
&gt; +        if (key.isDeleted() || !key.style())
&gt; +            return false;
&gt; +        return key.style()-&gt;equalForTextAutosizing(style);
&gt; +    }
&gt; +
&gt; +    static void translate(TextAutoSizingKey&amp; key, const RenderStyle&amp; style, unsigned hash)
&gt; +    {
&gt; +        key = TextAutoSizingKey(style, hash);
&gt; +    }
&gt; +};

This does not need to be in a header. How about moving it inside TextAutoSizing.cpp?

Also, I think you could use initializer list style when setting the value of the key in the translate function.

I would have written the equal function as an &amp;&amp; expression instead of an if statement.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197728</commentid>
    <comment_count>6</comment_count>
      <attachid>280119</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2016-05-30 23:52:27 -0700</bug_when>
    <thetext>Comment on attachment 280119
Patch

None of my comments are &quot;don’t land this yet&quot; comments; all just ideas to make the code even better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197899</commentid>
    <comment_count>7</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-05-31 13:00:22 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; Comment on attachment 280119 [details]
&gt; Patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=280119&amp;action=review
&gt; 
&gt; A few last comments.
&gt; 
&gt; &gt; Source/WebCore/dom/Document.cpp:5288
&gt; &gt; +    auto addResult = m_textAutoSizedNodes.add&lt;TextAutoSizingHashTranslator&gt;(node.renderer()-&gt;style(), TextAutoSizingValue());
&gt; 
&gt; A little sad that we have to create/destroy the empty HashSet every time
&gt; here. I wonder what the best trick for avoiding that is. I can think of
&gt; three tricks off hand:
&gt; 
&gt; 1) Add a version of HashMap::add with the hash translator that uses an empty
&gt; value for the new hash map entry if any and does not require a value
&gt; argument be passed in.
&gt; 2) Add a version of HashMap::ensure with the hash translator.
&gt; 3) Instead of being a map, m_textAutoSizedNodes could be a HashSet with a
&gt; mutable HashSet inside the set values. We would combine TextAutoSizingKey
&gt; and TextAutoSizingValue into a single class. Would probably have to add
&gt; HashSet::removeIf too.

4) Go back to using a std::unique_ptr&lt;&gt;() for values as in the original code and call add() with nullptr?

This seems the simplest.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197901</commentid>
    <comment_count>8</comment_count>
      <attachid>280119</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-05-31 13:07:35 -0700</bug_when>
    <thetext>Comment on attachment 280119
Patch

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

&gt;&gt; Source/WebCore/dom/Document.h:49
&gt;&gt; +#include &quot;TextAutoSizing.h&quot;
&gt; 
&gt; Always sad for build times when we add another include to Document.h.

The issue is that we need the hash traits for text autosizing in Document.h but I thought, those traits should really not be in Document.h.
To decrease build time, I guess we could move those traits to their own header (e.g. TextAutoSizingHashTraits.h) and include this header here instead? What do you think?

&gt;&gt; Source/WebCore/dom/Document.h:1697
&gt;&gt; +    typedef HashMap&lt;TextAutoSizingKey, TextAutoSizingValue, TextAutoSizingHash, TextAutoSizingTraits&gt; TextAutoSizingMap;
&gt; 
&gt; Could switch to using; we prefer that to typedef now in every case, I think.

Ok.

&gt;&gt; Source/WebCore/dom/Document.h:1698
&gt;&gt;      TextAutoSizingMap m_textAutoSizedNodes;
&gt; 
&gt; Kind of strange that all the functions and the typedef call these &quot;auto sizing nodes&quot;, but the data member is named &quot;auto sized nodes&quot;.

Ok, I can harmonize.

&gt;&gt; Source/WebCore/rendering/TextAutoSizing.cpp:52
&gt;&gt; +    new (NotNull, std::addressof(m_style)) std::unique_ptr&lt;RenderStyle&gt;(reinterpret_cast&lt;RenderStyle*&gt;(-1));
&gt; 
&gt; I would have preferred to write this:
&gt; 
&gt;     HashTraits&lt;std::unique_ptr&lt;RenderStyle&gt;&gt;::constructDeletedValue(m_style);

Good idea.

&gt;&gt; Source/WebCore/rendering/TextAutoSizing.h:50
&gt;&gt; +    bool isDeleted() const { return m_style.get() == reinterpret_cast&lt;RenderStyle*&gt;(-1); }
&gt; 
&gt; I’d rather see:
&gt; 
&gt;     bool isDeleted() const { return HashTraits&lt;std::unique_ptr&lt;RenderStyle&gt;&gt;::isDeletedValue(m_style); }

Good idea.

&gt;&gt; Source/WebCore/rendering/TextAutoSizing.h:103
&gt;&gt; +};
&gt; 
&gt; This does not need to be in a header. How about moving it inside TextAutoSizing.cpp?
&gt; 
&gt; Also, I think you could use initializer list style when setting the value of the key in the translate function.
&gt; 
&gt; I would have written the equal function as an &amp;&amp; expression instead of an if statement.

If it is not in the header, how can we use it from Document.cpp? Did you want to move it to Document.cpp instead? Or did you want me to keep the struct in the header and move the implementation out of line in TextAutoSizing.cpp?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197931</commentid>
    <comment_count>9</comment_count>
      <attachid>280175</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2016-05-31 13:53:03 -0700</bug_when>
    <thetext>Created attachment 280175
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197998</commentid>
    <comment_count>10</comment_count>
      <attachid>280175</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-05-31 15:49:44 -0700</bug_when>
    <thetext>Comment on attachment 280175
Patch

Clearing flags on attachment: 280175

Committed r201534: &lt;http://trac.webkit.org/changeset/201534&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1197999</commentid>
    <comment_count>11</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2016-05-31 15:49:49 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>280115</attachid>
            <date>2016-05-30 17:01:41 -0700</date>
            <delta_ts>2016-05-30 22:21:07 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-158217-20160530170256.patch</filename>
            <type>text/plain</type>
            <size>19206</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjAxNDk1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzUwZjkxOGU2MTdjZDE4
ODIxNjA1OGIxNzYwNzI0MDFjODcwZDRiNi4uZDVmYTQ4M2FhMWZiM2EyNDFlYjk5MWYxY2NmN2Nm
MWE5OGMzZmQ0NiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDg4IEBACisyMDE2LTA1LTMwICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgQ2xlYW4gdXAgLyBtb2Rlcm5p
emUgaU9TIHRleHQgYXV0b3NpemluZyBjb2RlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNTgyMTcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBDbGVhbiB1cCAvIG1vZGVybml6ZSBpT1MgdGV4dCBhdXRvc2l6
aW5nIGNvZGUuCisKKyAgICAgICAgSSB0aGluayBpT1MgdGV4dCBhdXRvc2l6aW5nIGNvZGUgaXMg
dG9vIGludHJ1c2l2ZSBpbnNpZGUgdGhlIFJlbmRlclN0eWxlCisgICAgICAgIGNsYXNzIGJ1dCBJ
IGhhdmUgbm90IHVwZGF0ZWQgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIHlldCB0byBsaW1pdCBwYXRj
aAorICAgICAgICBzaXplLiBUaGlzIHBhdGNoIGZvY3VzZXMgb24gdGhlIFRleHRBdXRvU2l6aW5n
LiogYW5kIHRleHQgYXV0b3NpemluZworICAgICAgICBjb2RlIGluIHRoZSBEb2N1bWVudCBjbGFz
cy4KKworICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAg
ICAgKiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4dEF1dG9TaXppbmdU
cmFpdHM6OmNvbnN0cnVjdERlbGV0ZWRWYWx1ZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3Jl
OjpUZXh0QXV0b1NpemluZ1RyYWl0czo6aXNEZWxldGVkVmFsdWUpOiBEZWxldGVkLgorICAgICAg
ICBNb3ZlIFRleHRBdXRvU2l6aW5nVHJhaXRzIHRvIHRoZSBUZXh0QXV0b1NpemluZyBoZWFkZXIg
dG8KKyAgICAgICAgcHJvbW90ZSByZXVzZSBhbmQgbWFrZSB0aGUgdGV4dCBhdXRvc2l6aW5nIGNv
ZGUgYSBsaXR0bGUgbGVzcworICAgICAgICBpbnRydXNpdmUuCisKKyAgICAgICAgKFdlYkNvcmU6
OkRvY3VtZW50OjphZGRBdXRvU2l6aW5nTm9kZSk6CisgICAgICAgIC0gRHJvcCBsb2NhbCAna2V5
JyB2YXJpYWJsZSBhcyBpdCBpcyBvbmx5IHVzZWQgb25jZS4KKyAgICAgICAgLSBSZW5hbWUgbm9k
ZSB0byB0ZXh0Tm9kZSBmb3IgY2xhcml0eS4KKyAgICAgICAgLSBVc2Ugc3RkOjptYWtlX3VuaXF1
ZTw+IHRvIGNvbnN0cnVjdCB0aGUgVGV4dEF1dG9TaXppbmdWYWx1ZQorICAgICAgICAgIGFzIGl0
IGlzIG5vIGxvbmdlciByZWYtY291bnRlZC4KKworICAgICAgICAoV2ViQ29yZTo6RG9jdW1lbnQ6
OnZhbGlkYXRlQXV0b1NpemluZ05vZGVzKToKKyAgICAgICAgSXRlcmF0ZSBvdmVyIHRoZSB0ZXh0
QXV0b3NpemVkTm9kZXMgSGFzaE1hcCBvbmx5IG9uY2UgaW5zdGVhZAorICAgICAgICBvZiB0d2lj
ZS4gVGV4dEF1dG9TaXppbmdWYWx1ZTo6YWRqdXN0VGV4dE5vZGVTaXplcygpIHdhcyB1cGRhdGVk
CisgICAgICAgIHRvIHJldHVybiBhbiBlbnVtIGNsYXNzIHNvIHdlIGtub3cgZnJvbSB0aGF0IHZh
bHVlIGlmIHdlIGNhbgorICAgICAgICByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIEhhc2hTZXQg
b3Igbm90LCB3aXRob3V0IGhhdmluZyB0byByZWx5CisgICAgICAgIG9uIFRleHRBdXRvU2l6aW5n
VmFsdWU6Om51bU5vZGVzKCksIHdoaWNoIEkgcmVtb3ZlZCBpbiB0aGlzCisgICAgICAgIHBhdGNo
LgorCisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6Y2xlYXJBdXRvU2l6aW5nTm9kZXMpOgor
ICAgICAgICBVcGRhdGVkIHRoZSBUZXh0QXV0b1NpemluZ1ZhbHVlIGRlc3RydWN0b3IgdG8gY2Fs
bCByZXNldCgpIHNvCisgICAgICAgIHdlIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBjYWxsIHJl
c2V0KCkgb24gZWFjaCB2YWx1ZSBiZWZvcmUKKyAgICAgICAgY2xlYXJpbmcgdGhlIHRleHRBdXRv
c2l6ZWROb2RlcyBIYXNoTWFwLgorCisgICAgICAgICogZG9tL0RvY3VtZW50Lmg6CisgICAgICAg
IC0gTW92ZSBUZXh0QXV0b1NpemluZ1RyYWl0cyB0byB0aGUgVGV4dEF1dG9zaXppbmcgaGVhZGVy
LgorICAgICAgICAtIFJlbmFtZSByZXNldEF1dG9zaXppbmdOb2RlcygpIHRvIGNsZWFyQXV0b1Np
emluZ05vZGVzKCkgYXMKKyAgICAgICAgICB0aGUgbWV0aG9kIG5vdyBvbmx5IGNsZWFycyB0aGUg
dGV4dEF1dG9zaXplZE5vZGVzIEhhc2hNYXAKKyAgICAgICAgICBhbmQgcmVzZXQoKSBpcyBub3cg
YW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGZvcgorICAgICAgICAgIFRleHRBdXRvU2l6aW5nVmFs
dWUuCisKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyRWxlbWVudC5jcHA6CisgICAgICAgIChX
ZWJDb3JlOjpSZW5kZXJFbGVtZW50OjpyZXNldFRleHRBdXRvc2l6aW5nKToKKyAgICAgICAgQ2Fs
bCBjbGVhckF1dG9TaXppbmdOb2RlcygpIGFzIGl0IHdhcyByZW5hbWVkLgorCisgICAgICAgICog
cmVuZGVyaW5nL1RleHRBdXRvU2l6aW5nLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRv
U2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleSk6CisgICAgICAgIC0gVXNlIHZhbHVlIG9mIC0x
IGZvciBzdGQ6OnVuaXF1ZV9wdHIgbV9zdHlsZSBtZW1iZXIgZm9yIGRpc3Rpbmd1aXNoaW5nCisg
ICAgICAgIGEgSGFzaFRhYmxlIGRlbGV0ZWQgdmFsdWUsIGluc3RlYWQgb2YgaGF2aW5nIGFuIGV4
dHJhIG1faXNEZWxldGVkCisgICAgICAgIGRhdGEgbWVtYmVyIGZvciB0aGlzIHB1cnBvc2UuCisg
ICAgICAgIC0gVGFrZSBSZW5kZXJTdHlsZSBwYXJhbWV0ZXIgYnkgcmVmZXJlbmNlIGFuZCBkcm9w
IHRoZSBudWxsIGNoZWNrIGFzIHRoZQorICAgICAgICAgIGNhbGwgc2l0ZSBjYW4gbmV2ZXIgcGFz
cyBudWxscHRyLgorCisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ1ZhbHVlOjphZGRU
ZXh0Tm9kZSk6CisgICAgICAgIC0gUmVuYW1lIGFkZE5vZGUoKSB0byBhZGRUZXh0Tm9kZSgpIGZv
ciBjbGFyaXR5LgorCisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ1ZhbHVlOjp+VGV4
dEF1dG9TaXppbmdWYWx1ZSk6CisgICAgICAgIFVwZGF0ZSBkZXN0cnVjdG9yIHRvIGNhbGwgcmVz
ZXQoKSBzbyB0aGF0IHRoZSBEb2N1bWVudCBkb2VzIG5vdCBoYXZlIHRvCisgICAgICAgIGNhbGwg
aXQgZXhwbGljaXRseSBhbmQgY2FuIGluc3RlYWQganVzdCBjbGVhciB0aGUgSGFzaE1hcCwgd2hp
Y2ggd2lsbAorICAgICAgICBkZXN0cm95IHRoZSBUZXh0QXV0b1NpemluZ1ZhbHVlIG9iamVjdHMu
CisKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRvU2l6aW5nVmFsdWU6OnJlc2V0KToKKyAgICAg
ICAgUmVuYW1lIHRleHQgdG8gcmVuZGVyVGV4dCBmb3IgY2xhcml0eS4KKworICAgICAgICAqIHJl
bmRlcmluZy9UZXh0QXV0b1NpemluZy5oOgorICAgICAgICAtIE1ha2UgVGV4dEF1dG9TaXppbmdW
YWx1ZSBhcyBmYXN0IGFsbG9jYXRlZC4KKyAgICAgICAgLSBVcGRhdGUgVGV4dEF1dG9TaXppbmdW
YWx1ZSB0byBubyBsb25nZXIgYmUgcmVmY291bnRlZCBhcyBvd25lcnNoaXAgaXMgbmV2ZXIKKyAg
ICAgICAgICBzaGFyZWQuIFRoZSBEb2N1bWVudCBvd25zIHRob3NlLgorICAgICAgICAtIERyb3Ag
dGhlIGZhY3RvcnkgZnVuY3Rpb24gZm9yIFRleHRBdXRvU2l6aW5nVmFsdWUgYW5kIG1ha2UgdGhl
IGNvbnN0cnVjdG9yCisgICAgICAgICAgcHVibGljIG5vdyB0aGF0IHRoZSBjbGFzcyBpcyBubyBs
b25nZXIgcmVmY291bnRlZC4KKyAgICAgICAgLSBNYWtlIHJlc2V0KCkgbWV0aG9kIHByaXZhdGUg
bm93IHRoYXQgaXQgaXMgY2FsbGVkIGZyb20gdGhlIGRlc3RydWN0b3IgYW5kCisgICAgICAgICAg
dGhlIERvY3VtZW50IGlzIG5vIGxvbmdlciBleHBlY3RlZCB0byBleHBsaWNpdGx5IGNhbGwgaXQu
CisgICAgICAgIC0gVXBkYXRlIGFkanVzdFRleHROb2RlU2l6ZXMoKSB0byByZXR1cm4gYSBTdGls
bEhhc05vZGVzIGVudW0gY2xhc3MgYW5kIHRoZQorICAgICAgICAgIERvY3VtZW50IGNhbiByZWx5
IG9uIHRoZSBkZXRlcm1pbmUgaWYgaXQgY2FuIGRyb3AgdGhlIFRleHRBdXRvU2l6aW5nVmFsdWUK
KyAgICAgICAgICBmcm9tIGl0cyBIYXNoTWFwIChhbmQgdGhlcmVmb3JlIGRlc3Ryb3kgdGhlIG9i
amVjdCkuCisgICAgICAgIC0gRHJvcCBudW1Ob2RlcygpIG1ldGhvZCBhcyBpdCBpcyBubyBsb25n
ZXIgbmVlZGVkLgorCisKIDIwMTYtMDUtMjggIENocmlzIER1bWV6ICA8Y2R1bWV6QGFwcGxlLmNv
bT4KIAogICAgICAgICBUZW1wbGF0aXplIE5vbmNvcHlhYmxlRnVuY3Rpb24gY2xhc3Mgc2ltaWxh
cmx5IHRvIHN0ZDo6ZnVuY3Rpb24KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvaiBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVw
cm9qL3Byb2plY3QucGJ4cHJvagppbmRleCBmMjlhNDRiNDIzZjRmYmFmZGVhMjk5MjdmMDhjNmYw
YzAwYmJmNjIyLi45YWQ2ZDVjYmU0YTZmNWEyMWM2NjhjOTRjYzc5ODBlZDU4NDc4ZTUyIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2oK
KysrIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhwcm9qCkBA
IC00NzQsNyArNDc0LDcgQEAKIAkJMEY1NERDRTExODgwRjkwMTAwM0VFREJCIC8qIERPTUdlc3R1
cmVFdmVudC5tbSBpbiBTb3VyY2VzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9
IDBGNTREQ0RFMTg4MEY5MDEwMDNFRURCQiAvKiBET01HZXN0dXJlRXZlbnQubW0gKi87IH07CiAJ
CTBGNTREQ0UyMTg4MEY5MDEwMDNFRURCQiAvKiBET01HZXN0dXJlRXZlbnRJbnRlcm5hbC5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1NERDREYxODgw
RjkwMTAwM0VFREJCIC8qIERPTUdlc3R1cmVFdmVudEludGVybmFsLmggKi87IH07CiAJCTBGNTRE
Q0U1MTg4MTA1MUQwMDNFRURCQiAvKiBUZXh0QXV0b1NpemluZy5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjU0RENFMzE4ODEwNTFEMDAzRUVEQkIg
LyogVGV4dEF1dG9TaXppbmcuY3BwICovOyB9OwotCQkwRjU0RENFNjE4ODEwNTFEMDAzRUVEQkIg
LyogVGV4dEF1dG9TaXppbmcuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDBGNTREQ0U0MTg4MTA1MUQwMDNFRURCQiAvKiBUZXh0QXV0b1NpemluZy5oICov
OyB9OworCQkwRjU0RENFNjE4ODEwNTFEMDAzRUVEQkIgLyogVGV4dEF1dG9TaXppbmcuaCBpbiBI
ZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTREQ0U0MTg4MTA1
MUQwMDNFRURCQiAvKiBUZXh0QXV0b1NpemluZy5oICovOyBzZXR0aW5ncyA9IHtBVFRSSUJVVEVT
ID0gKFByaXZhdGUsICk7IH07IH07CiAJCTBGNTRERDA4MTg4MUQ1RjUwMDNFRURCQiAvKiBUb3Vj
aC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1NERE
MDUxODgxRDVGNTAwM0VFREJCIC8qIFRvdWNoLmggKi87IH07CiAJCTBGNTRERDA5MTg4MUQ1RjUw
MDNFRURCQiAvKiBUb3VjaEV2ZW50LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwRjU0REQwNjE4ODFENUY1MDAzRUVEQkIgLyogVG91Y2hFdmVudC5oICov
OyB9OwogCQkwRjU0REQwQTE4ODFENUY1MDAzRUVEQkIgLyogVG91Y2hMaXN0LmggaW4gSGVhZGVy
cyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjU0REQwNzE4ODFENUY1MDAz
RUVEQkIgLyogVG91Y2hMaXN0LmggKi87IH07CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9k
b20vRG9jdW1lbnQuY3BwIGIvU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmNwcAppbmRleCA2
YzZiMzFjNTA3YmY1MGQ2ZTY0OTliZThlNjZiZWY2M2E1N2UwZDE1Li5mZjNjMGY0YzBiNjI3NTEx
NTIxYjk3MzFiM2MxODA0NGVmNmI5NmI2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20v
RG9jdW1lbnQuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKQEAgLTIy
MywxMCArMjIzLDYgQEAKICNpbmNsdWRlICJHZXN0dXJlRXZlbnQuaCIKICNlbmRpZgogCi0jaWYg
RU5BQkxFKElPU19URVhUX0FVVE9TSVpJTkcpCi0jaW5jbHVkZSAiVGV4dEF1dG9TaXppbmcuaCIK
LSNlbmRpZgotCiAjaWYgRU5BQkxFKE1BVEhNTCkKICNpbmNsdWRlICJNYXRoTUxFbGVtZW50Lmgi
CiAjaW5jbHVkZSAiTWF0aE1MRWxlbWVudEZhY3RvcnkuaCIKQEAgLTQyNSwxOCArNDIxLDYgQEAg
c3RhdGljIHZvaWQgcHJpbnROYXZpZ2F0aW9uRXJyb3JNZXNzYWdlKEZyYW1lKiBmcmFtZSwgY29u
c3QgVVJMJiBhY3RpdmVVUkwsIGNvbnMKIAogdWludDY0X3QgRG9jdW1lbnQ6OnNfZ2xvYmFsVHJl
ZVZlcnNpb24gPSAwOwogCi0jaWYgRU5BQkxFKElPU19URVhUX0FVVE9TSVpJTkcpCi12b2lkIFRl
eHRBdXRvU2l6aW5nVHJhaXRzOjpjb25zdHJ1Y3REZWxldGVkVmFsdWUoVGV4dEF1dG9TaXppbmdL
ZXkmIHNsb3QpCi17Ci0gICAgbmV3ICgmc2xvdCkgVGV4dEF1dG9TaXppbmdLZXkoVGV4dEF1dG9T
aXppbmdLZXk6OkRlbGV0ZWQpOwotfQotCi1ib29sIFRleHRBdXRvU2l6aW5nVHJhaXRzOjppc0Rl
bGV0ZWRWYWx1ZShjb25zdCBUZXh0QXV0b1NpemluZ0tleSYgdmFsdWUpCi17Ci0gICAgcmV0dXJu
IHZhbHVlLmlzRGVsZXRlZCgpOwotfQotI2VuZGlmCi0KIEhhc2hTZXQ8RG9jdW1lbnQqPiYgRG9j
dW1lbnQ6OmFsbERvY3VtZW50cygpCiB7CiAgICAgc3RhdGljIE5ldmVyRGVzdHJveWVkPEhhc2hT
ZXQ8RG9jdW1lbnQqPj4gZG9jdW1lbnRzOwpAQCAtNTI5OCwzNSArNTI4MiwyNCBAQCBIVE1MQ2Fu
dmFzRWxlbWVudCogRG9jdW1lbnQ6OmdldENTU0NhbnZhc0VsZW1lbnQoY29uc3QgU3RyaW5nJiBu
YW1lKQogCiAjaWYgRU5BQkxFKElPU19URVhUX0FVVE9TSVpJTkcpCiAKLXZvaWQgRG9jdW1lbnQ6
OmFkZEF1dG9TaXppbmdOb2RlKFRleHQmIG5vZGUsIGZsb2F0IGNhbmRpZGF0ZVNpemUpCit2b2lk
IERvY3VtZW50OjphZGRBdXRvU2l6aW5nTm9kZShUZXh0JiB0ZXh0Tm9kZSwgZmxvYXQgY2FuZGlk
YXRlU2l6ZSkKIHsKLSAgICBMT0coVGV4dEF1dG9zaXppbmcsICIgYWRkQXV0b1NpemluZ05vZGUg
JXAgY2FuZGlkYXRlU2l6ZT0lZiIsICZub2RlLCBjYW5kaWRhdGVTaXplKTsKLQotICAgIFRleHRB
dXRvU2l6aW5nS2V5IGtleSgmbm9kZS5yZW5kZXJlcigpLT5zdHlsZSgpKTsKLSAgICBhdXRvIGFk
ZFJlc3VsdCA9IG1fdGV4dEF1dG9TaXplZE5vZGVzLmVuc3VyZShXVEZNb3ZlKGtleSksIFtdIHsK
LSAgICAgICAgcmV0dXJuIFRleHRBdXRvU2l6aW5nVmFsdWU6OmNyZWF0ZSgpOworICAgIExPRyhU
ZXh0QXV0b3NpemluZywgIiBhZGRBdXRvU2l6aW5nTm9kZSAlcCBjYW5kaWRhdGVTaXplPSVmIiwg
JnRleHROb2RlLCBjYW5kaWRhdGVTaXplKTsKKyAgICBhdXRvIGFkZFJlc3VsdCA9IG1fdGV4dEF1
dG9TaXplZE5vZGVzLmVuc3VyZShUZXh0QXV0b1NpemluZ0tleSh0ZXh0Tm9kZS5yZW5kZXJlcigp
LT5zdHlsZSgpKSwgW10geworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxUZXh0QXV0
b1NpemluZ1ZhbHVlPigpOwogICAgIH0pOwotICAgIGFkZFJlc3VsdC5pdGVyYXRvci0+dmFsdWUt
PmFkZE5vZGUobm9kZSwgY2FuZGlkYXRlU2l6ZSk7CisgICAgYWRkUmVzdWx0Lml0ZXJhdG9yLT52
YWx1ZS0+YWRkVGV4dE5vZGUodGV4dE5vZGUsIGNhbmRpZGF0ZVNpemUpOwogfQogCiB2b2lkIERv
Y3VtZW50Ojp2YWxpZGF0ZUF1dG9TaXppbmdOb2RlcygpCiB7Ci0gICAgVmVjdG9yPFRleHRBdXRv
U2l6aW5nS2V5PiBub2Rlc0ZvclJlbW92YWw7Ci0gICAgZm9yIChhdXRvJiBrZXlWYWx1ZVBhaXIg
OiBtX3RleHRBdXRvU2l6ZWROb2RlcykgewotICAgICAgICBUZXh0QXV0b1NpemluZ1ZhbHVlKiB2
YWx1ZSA9IGtleVZhbHVlUGFpci52YWx1ZS5nZXQoKTsKLSAgICAgICAgLy8gVXBkYXRlIGFsbCB0
aGUgbm9kZXMgaW4gdGhlIGNvbGxlY3Rpb24gdG8gcmVmbGVjdCB0aGUgbmV3Ci0gICAgICAgIC8v
IGNhbmRpZGF0ZSBzaXplLgotICAgICAgICB2YWx1ZS0+YWRqdXN0Tm9kZVNpemVzKCk7Ci0gICAg
fQogICAgIG1fdGV4dEF1dG9TaXplZE5vZGVzLnJlbW92ZUlmKFtdKGF1dG8mIGtleUFuZFZhbHVl
KSB7Ci0gICAgICAgIHJldHVybiAha2V5QW5kVmFsdWUudmFsdWUtPm51bU5vZGVzKCk7CisgICAg
ICAgIHJldHVybiBrZXlBbmRWYWx1ZS52YWx1ZS0+YWRqdXN0VGV4dE5vZGVTaXplcygpID09IFRl
eHRBdXRvU2l6aW5nVmFsdWU6OlN0aWxsSGFzTm9kZXM6Ok5vOwogICAgIH0pOwogfQogICAgIAot
dm9pZCBEb2N1bWVudDo6cmVzZXRBdXRvU2l6aW5nTm9kZXMoKQordm9pZCBEb2N1bWVudDo6Y2xl
YXJBdXRvU2l6aW5nTm9kZXMoKQogewotICAgIGZvciAoYXV0byYgdmFsdWUgOiBtX3RleHRBdXRv
U2l6ZWROb2Rlcy52YWx1ZXMoKSkKLSAgICAgICAgdmFsdWUtPnJlc2V0KCk7CiAgICAgbV90ZXh0
QXV0b1NpemVkTm9kZXMuY2xlYXIoKTsKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
ZG9tL0RvY3VtZW50LmggYi9Tb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuaAppbmRleCA2NTgx
OWRmZDNiNDgxZDRkNzQzNzQ0NWFkMWM5ZmE0YjU3ZWYyYThhLi5kNWU2OWFhZWQ2Y2VkYzIzMWE2
NDQxNTg3OTI1MWE2ODQ3NDdlOTM0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vRG9j
dW1lbnQuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuaApAQCAtNDYsNiArNDYs
NyBAQAogI2luY2x1ZGUgIlN0cmluZ1dpdGhEaXJlY3Rpb24uaCIKICNpbmNsdWRlICJTdHlsZUNo
YW5nZS5oIgogI2luY2x1ZGUgIlN1cHBsZW1lbnRhYmxlLmgiCisjaW5jbHVkZSAiVGV4dEF1dG9T
aXppbmcuaCIKICNpbmNsdWRlICJUZXh0UmVzb3VyY2VEZWNvZGVyLmgiCiAjaW5jbHVkZSAiVGlt
ZXIuaCIKICNpbmNsdWRlICJUcmVlU2NvcGUuaCIKQEAgLTIxMiwxMiArMjEzLDYgQEAgY2xhc3Mg
RGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVyOwogc3RydWN0IFRleHRBdXRvU2l6aW5nSGFzaDsK
IGNsYXNzIFRleHRBdXRvU2l6aW5nS2V5OwogY2xhc3MgVGV4dEF1dG9TaXppbmdWYWx1ZTsKLQot
c3RydWN0IFRleHRBdXRvU2l6aW5nVHJhaXRzIDogV1RGOjpHZW5lcmljSGFzaFRyYWl0czxUZXh0
QXV0b1NpemluZ0tleT4gewotICAgIHN0YXRpYyBjb25zdCBib29sIGVtcHR5VmFsdWVJc1plcm8g
PSB0cnVlOwotICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdERlbGV0ZWRWYWx1ZShUZXh0QXV0b1Np
emluZ0tleSYgc2xvdCk7Ci0gICAgc3RhdGljIGJvb2wgaXNEZWxldGVkVmFsdWUoY29uc3QgVGV4
dEF1dG9TaXppbmdLZXkmIHZhbHVlKTsKLX07CiAjZW5kaWYKIAogI2lmIEVOQUJMRShNRURJQV9T
RVNTSU9OKQpAQCAtMTY5NiwxMCArMTY5MSwxMCBAQCBwcml2YXRlOgogcHVibGljOgogICAgIHZv
aWQgYWRkQXV0b1NpemluZ05vZGUoVGV4dCYsIGZsb2F0IHNpemUpOwogICAgIHZvaWQgdmFsaWRh
dGVBdXRvU2l6aW5nTm9kZXMoKTsKLSAgICB2b2lkIHJlc2V0QXV0b1NpemluZ05vZGVzKCk7Cisg
ICAgdm9pZCBjbGVhckF1dG9TaXppbmdOb2RlcygpOwogCiBwcml2YXRlOgotICAgIHR5cGVkZWYg
SGFzaE1hcDxUZXh0QXV0b1NpemluZ0tleSwgUmVmUHRyPFRleHRBdXRvU2l6aW5nVmFsdWU+LCBU
ZXh0QXV0b1NpemluZ0hhc2gsIFRleHRBdXRvU2l6aW5nVHJhaXRzPiBUZXh0QXV0b1NpemluZ01h
cDsKKyAgICB0eXBlZGVmIEhhc2hNYXA8VGV4dEF1dG9TaXppbmdLZXksIHN0ZDo6dW5pcXVlX3B0
cjxUZXh0QXV0b1NpemluZ1ZhbHVlPiwgVGV4dEF1dG9TaXppbmdIYXNoLCBUZXh0QXV0b1Npemlu
Z1RyYWl0cz4gVGV4dEF1dG9TaXppbmdNYXA7CiAgICAgVGV4dEF1dG9TaXppbmdNYXAgbV90ZXh0
QXV0b1NpemVkTm9kZXM7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlckVsZW1lbnQuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
ckVsZW1lbnQuY3BwCmluZGV4IDNlYzNmZDI5ODc4MTU4OWU4YzZkM2M5Y2Q4NDYyYzYyOGJjNzM3
MzguLjlhNDBlMTY3MTU2YmRjZWU0ZmRkMzc4ZWY0MmNlMjRlYTA2YWEwZDEgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJFbGVtZW50LmNwcAorKysgYi9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRWxlbWVudC5jcHAKQEAgLTIyMjUsNyArMjIyNSw3IEBA
IHZvaWQgUmVuZGVyRWxlbWVudDo6cmVzZXRUZXh0QXV0b3NpemluZygpCiAKICAgICBMT0coVGV4
dEF1dG9zaXppbmcsICJSZW5kZXJFbGVtZW50OjpyZXNldFRleHRBdXRvc2l6aW5nKCkiKTsKIAot
ICAgIGRvY3VtZW50LT5yZXNldEF1dG9TaXppbmdOb2RlcygpOworICAgIGRvY3VtZW50LT5jbGVh
ckF1dG9TaXppbmdOb2RlcygpOwogCiAgICAgVmVjdG9yPGludD4gZGVwdGhTdGFjazsKICAgICBp
bnQgY3VycmVudERlcHRoID0gMDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9UZXh0QXV0b1NpemluZy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9T
aXppbmcuY3BwCmluZGV4IDNiZGQ3YWI4ZGI2NTQyZmRhY2M0OWM0MjYyYzA2OWViODRmZmI3NTEu
LmYxNjkyN2MwODgzZTI1ZDlkZmI0ZDk4OGRiZDY2MmE4ZDFiMWFmNGYgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1NpemluZy5jcHAKKysrIGIvU291cmNlL1dl
YkNvcmUvcmVuZGVyaW5nL1RleHRBdXRvU2l6aW5nLmNwcApAQCAtNDgsNzkgKzQ4LDcwIEBAIHN0
YXRpYyBSZW5kZXJTdHlsZSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKGNvbnN0IFJlbmRlclN0
eWxlJiBjdXJyZW50U3R5bGUpCiB9CiAKIFRleHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1Npemlu
Z0tleShEZWxldGVkVGFnKQotICAgIDogbV9pc0RlbGV0ZWQodHJ1ZSkKIHsKKyAgICBuZXcgKE5v
dE51bGwsIHN0ZDo6YWRkcmVzc29mKG1fc3R5bGUpKSBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyU3R5
bGU+KHJlaW50ZXJwcmV0X2Nhc3Q8UmVuZGVyU3R5bGUqPigtMSkpOwogfQogCi1UZXh0QXV0b1Np
emluZ0tleTo6VGV4dEF1dG9TaXppbmdLZXkoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlKQotICAg
IDogbV9zdHlsZShzdHlsZSA/IFJlbmRlclN0eWxlOjpjbG9uZVB0cigqc3R5bGUpIDogbnVsbHB0
cikKK1RleHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleShjb25zdCBSZW5kZXJTdHls
ZSYgc3R5bGUpCisgICAgOiBtX3N0eWxlKFJlbmRlclN0eWxlOjpjbG9uZVB0cihzdHlsZSkpIC8v
IEZJWE1FOiBUaGlzIHNlZW1zIHZlcnkgaW5lZmZpY2llbnQuCiB7CiB9CiAKLWludCBUZXh0QXV0
b1NpemluZ1ZhbHVlOjpudW1Ob2RlcygpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1fYXV0b1NpemVk
Tm9kZXMuc2l6ZSgpOwotfQotCi12b2lkIFRleHRBdXRvU2l6aW5nVmFsdWU6OmFkZE5vZGUoVGV4
dCYgbm9kZSwgZmxvYXQgc2l6ZSkKK3ZvaWQgVGV4dEF1dG9TaXppbmdWYWx1ZTo6YWRkVGV4dE5v
ZGUoVGV4dCYgbm9kZSwgZmxvYXQgc2l6ZSkKIHsKICAgICBub2RlLnJlbmRlcmVyKCktPnNldENh
bmRpZGF0ZUNvbXB1dGVkVGV4dFNpemUoc2l6ZSk7CiAgICAgbV9hdXRvU2l6ZWROb2Rlcy5hZGQo
Jm5vZGUpOwogfQogCi0jZGVmaW5lIE1BWF9TQ0FMRV9JTkNSRUFTRSAxLjdmCitzdGF0aWMgY29u
c3QgZmxvYXQgbWF4U2NhbGVJbmNyZWFzZSA9IDEuN2Y7CiAKLWJvb2wgVGV4dEF1dG9TaXppbmdW
YWx1ZTo6YWRqdXN0Tm9kZVNpemVzKCkKK2F1dG8gVGV4dEF1dG9TaXppbmdWYWx1ZTo6YWRqdXN0
VGV4dE5vZGVTaXplcygpIC0+IFN0aWxsSGFzTm9kZXMKIHsKLSAgICBib29sIGRpZFJlbW92ZU9i
amVjdHMgPSBmYWxzZTsKLQotICAgIC8vIFJlbW92ZSBzdGFsZSBub2Rlcy4gIE5vZGVzIG1heSBo
YXZlIGhhZCB0aGVpciByZW5kZXJlcnMgZGV0YWNoZWQuICBXZSdsbAotICAgIC8vIGFsc28gbmVl
ZCB0byByZW1vdmUgdGhlIHN0eWxlIGZyb20gdGhlIGRvY3VtZW50cyBtX3RleHRBdXRvU2l6ZWRO
b2RlcwotICAgIC8vIGNvbGxlY3Rpb24uICBSZXR1cm4gdHJ1ZSBpbmRpY2F0ZXMgd2UgbmVlZCB0
byBkbyB0aGF0IHJlbW92YWwuCisgICAgLy8gUmVtb3ZlIHN0YWxlIG5vZGVzLiBOb2RlcyBtYXkg
aGF2ZSBoYWQgdGhlaXIgcmVuZGVyZXJzIGRldGFjaGVkLiBXZSdsbCBhbHNvIG5lZWQgdG8gcmVt
b3ZlIHRoZSBzdHlsZSBmcm9tIHRoZSBkb2N1bWVudHMgbV90ZXh0QXV0b1NpemVkTm9kZXMKKyAg
ICAvLyBjb2xsZWN0aW9uLiBSZXR1cm4gdHJ1ZSBpbmRpY2F0ZXMgd2UgbmVlZCB0byBkbyB0aGF0
IHJlbW92YWwuCiAgICAgVmVjdG9yPFRleHQqPiBub2Rlc0ZvclJlbW92YWw7Ci0gICAgZm9yIChh
dXRvJiBub2RlIDogbV9hdXRvU2l6ZWROb2RlcykgewotICAgICAgICBhdXRvKiB0ZXh0ID0gbm9k
ZS0+cmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKCF0ZXh0IHx8ICF0ZXh0LT5zdHlsZSgpLnRleHRT
aXplQWRqdXN0KCkuaXNBdXRvKCkgfHwgIXRleHQtPmNhbmRpZGF0ZUNvbXB1dGVkVGV4dFNpemUo
KSkgewotICAgICAgICAgICAgbm9kZXNGb3JSZW1vdmFsLmFwcGVuZChub2RlLmdldCgpKTsKLSAg
ICAgICAgICAgIGRpZFJlbW92ZU9iamVjdHMgPSB0cnVlOwotICAgICAgICB9CisgICAgZm9yIChh
dXRvJiB0ZXh0Tm9kZSA6IG1fYXV0b1NpemVkTm9kZXMpIHsKKyAgICAgICAgYXV0byogcmVuZGVy
VGV4dCA9IHRleHROb2RlLT5yZW5kZXJlcigpOworICAgICAgICBpZiAoIXJlbmRlclRleHQgfHwg
IXJlbmRlclRleHQtPnN0eWxlKCkudGV4dFNpemVBZGp1c3QoKS5pc0F1dG8oKSB8fCAhcmVuZGVy
VGV4dC0+Y2FuZGlkYXRlQ29tcHV0ZWRUZXh0U2l6ZSgpKQorICAgICAgICAgICAgbm9kZXNGb3JS
ZW1vdmFsLmFwcGVuZCh0ZXh0Tm9kZS5nZXQoKSk7CiAgICAgfQogCiAgICAgZm9yIChhdXRvJiBu
b2RlIDogbm9kZXNGb3JSZW1vdmFsKQogICAgICAgICBtX2F1dG9TaXplZE5vZGVzLnJlbW92ZShu
b2RlKTsKIAotICAgIC8vIElmIHdlIG9ubHkgaGF2ZSBvbmUgcGllY2Ugb2YgdGV4dCB3aXRoIHRo
ZSBzdHlsZSBvbiB0aGUgcGFnZSBkb24ndAotICAgIC8vIGFkanVzdCBpdCdzIHNpemUuCisgICAg
U3RpbGxIYXNOb2RlcyBzdGlsbEhhc05vZGVzID0gbV9hdXRvU2l6ZWROb2Rlcy5pc0VtcHR5KCkg
PyBTdGlsbEhhc05vZGVzOjpObyA6IFN0aWxsSGFzTm9kZXM6OlllczsKKworICAgIC8vIElmIHdl
IG9ubHkgaGF2ZSBvbmUgcGllY2Ugb2YgdGV4dCB3aXRoIHRoZSBzdHlsZSBvbiB0aGUgcGFnZSBk
b24ndCBhZGp1c3QgaXQncyBzaXplLgogICAgIGlmIChtX2F1dG9TaXplZE5vZGVzLnNpemUoKSA8
PSAxKQotICAgICAgICByZXR1cm4gZGlkUmVtb3ZlT2JqZWN0czsKKyAgICAgICAgcmV0dXJuIHN0
aWxsSGFzTm9kZXM7CiAKLSAgICAvLyBDb21wdXRlIGF2ZXJhZ2Ugc2l6ZQorICAgIC8vIENvbXB1
dGUgYXZlcmFnZSBzaXplLgogICAgIGZsb2F0IGN1bXVsYXRpdmVTaXplID0gMDsKICAgICBmb3Ig
KGF1dG8mIG5vZGUgOiBtX2F1dG9TaXplZE5vZGVzKQogICAgICAgICBjdW11bGF0aXZlU2l6ZSAr
PSBub2RlLT5yZW5kZXJlcigpLT5jYW5kaWRhdGVDb21wdXRlZFRleHRTaXplKCk7CiAKICAgICBm
bG9hdCBhdmVyYWdlU2l6ZSA9IHJvdW5kZihjdW11bGF0aXZlU2l6ZSAvIG1fYXV0b1NpemVkTm9k
ZXMuc2l6ZSgpKTsKIAotICAgIC8vIEFkanVzdCBzaXplcworICAgIC8vIEFkanVzdCBzaXplcy4K
ICAgICBib29sIGZpcnN0UGFzcyA9IHRydWU7CiAgICAgZm9yIChhdXRvJiBub2RlIDogbV9hdXRv
U2l6ZWROb2RlcykgewotICAgICAgICBhdXRvKiB0ZXh0ID0gbm9kZS0+cmVuZGVyZXIoKTsKLSAg
ICAgICAgaWYgKCF0ZXh0IHx8IHRleHQtPnN0eWxlKCkuZm9udERlc2NyaXB0aW9uKCkuY29tcHV0
ZWRTaXplKCkgPT0gYXZlcmFnZVNpemUpCisgICAgICAgIGF1dG8mIHJlbmRlclRleHQgPSAqbm9k
ZS0+cmVuZGVyZXIoKTsKKyAgICAgICAgaWYgKHJlbmRlclRleHQuc3R5bGUoKS5mb250RGVzY3Jp
cHRpb24oKS5jb21wdXRlZFNpemUoKSA9PSBhdmVyYWdlU2l6ZSkKICAgICAgICAgICAgIGNvbnRp
bnVlOwogCi0gICAgICAgIGZsb2F0IHNwZWNpZmllZFNpemUgPSB0ZXh0LT5zdHlsZSgpLmZvbnRE
ZXNjcmlwdGlvbigpLnNwZWNpZmllZFNpemUoKTsKKyAgICAgICAgZmxvYXQgc3BlY2lmaWVkU2l6
ZSA9IHJlbmRlclRleHQuc3R5bGUoKS5mb250RGVzY3JpcHRpb24oKS5zcGVjaWZpZWRTaXplKCk7
CiAgICAgICAgIGZsb2F0IHNjYWxlQ2hhbmdlID0gYXZlcmFnZVNpemUgLyBzcGVjaWZpZWRTaXpl
OwotICAgICAgICBpZiAoc2NhbGVDaGFuZ2UgPiBNQVhfU0NBTEVfSU5DUkVBU0UgJiYgZmlyc3RQ
YXNzKSB7CisgICAgICAgIGlmIChzY2FsZUNoYW5nZSA+IG1heFNjYWxlSW5jcmVhc2UgJiYgZmly
c3RQYXNzKSB7CiAgICAgICAgICAgICBmaXJzdFBhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIGF2
ZXJhZ2VTaXplID0gcm91bmRmKHNwZWNpZmllZFNpemUgKiBNQVhfU0NBTEVfSU5DUkVBU0UpOwor
ICAgICAgICAgICAgYXZlcmFnZVNpemUgPSByb3VuZGYoc3BlY2lmaWVkU2l6ZSAqIG1heFNjYWxl
SW5jcmVhc2UpOwogICAgICAgICAgICAgc2NhbGVDaGFuZ2UgPSBhdmVyYWdlU2l6ZSAvIHNwZWNp
ZmllZFNpemU7CiAgICAgICAgIH0KIAogICAgICAgICBMT0coVGV4dEF1dG9zaXppbmcsICIgIGFk
anVzdCBub2RlIHNpemUgJXAgZmlyc3RQYXNzPSVkIGF2ZXJhZ2VTaXplPSVmIHNjYWxlQ2hhbmdl
PSVmIiwgbm9kZS5nZXQoKSwgZmlyc3RQYXNzLCBhdmVyYWdlU2l6ZSwgc2NhbGVDaGFuZ2UpOwog
Ci0gICAgICAgIGF1dG8qIHBhcmVudFJlbmRlcmVyID0gdGV4dC0+cGFyZW50KCk7CisgICAgICAg
IGF1dG8qIHBhcmVudFJlbmRlcmVyID0gcmVuZGVyVGV4dC5wYXJlbnQoKTsKIAotICAgICAgICBh
dXRvIHN0eWxlID0gY2xvbmVSZW5kZXJTdHlsZVdpdGhTdGF0ZSh0ZXh0LT5zdHlsZSgpKTsKKyAg
ICAgICAgYXV0byBzdHlsZSA9IGNsb25lUmVuZGVyU3R5bGVXaXRoU3RhdGUocmVuZGVyVGV4dC5z
dHlsZSgpKTsKICAgICAgICAgYXV0byBmb250RGVzY3JpcHRpb24gPSBzdHlsZS5mb250RGVzY3Jp
cHRpb24oKTsKICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShhdmVyYWdl
U2l6ZSk7CiAgICAgICAgIHN0eWxlLnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24p
OwpAQCAtMTYxLDI2ICsxNTIsMzEgQEAgYm9vbCBUZXh0QXV0b1NpemluZ1ZhbHVlOjphZGp1c3RO
b2RlU2l6ZXMoKQogICAgICAgICBwYXJlbnRSZW5kZXJlci0+c2V0U3R5bGUoV1RGTW92ZShuZXdQ
YXJlbnRTdHlsZSkpOwogICAgIH0KIAotICAgIHJldHVybiBkaWRSZW1vdmVPYmplY3RzOworICAg
IHJldHVybiBzdGlsbEhhc05vZGVzOworfQorCitUZXh0QXV0b1NpemluZ1ZhbHVlOjp+VGV4dEF1
dG9TaXppbmdWYWx1ZSgpCit7CisgICAgcmVzZXQoKTsKIH0KIAogdm9pZCBUZXh0QXV0b1Npemlu
Z1ZhbHVlOjpyZXNldCgpCiB7CiAgICAgZm9yIChhdXRvJiBub2RlIDogbV9hdXRvU2l6ZWROb2Rl
cykgewotICAgICAgICBhdXRvKiB0ZXh0ID0gbm9kZS0+cmVuZGVyZXIoKTsKLSAgICAgICAgaWYg
KCF0ZXh0KQorICAgICAgICBhdXRvKiByZW5kZXJUZXh0ID0gbm9kZS0+cmVuZGVyZXIoKTsKKyAg
ICAgICAgaWYgKCFyZW5kZXJUZXh0KQogICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAg
YXV0byogcGFyZW50UmVuZGVyZXIgPSB0ZXh0LT5wYXJlbnQoKTsKKyAgICAgICAgYXV0byogcGFy
ZW50UmVuZGVyZXIgPSByZW5kZXJUZXh0LT5wYXJlbnQoKTsKICAgICAgICAgaWYgKCFwYXJlbnRS
ZW5kZXJlcikKICAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIC8vIFJlc2V0IHRoZSBm
b250IHNpemUgYmFjayB0byB0aGUgb3JpZ2luYWwgc3BlY2lmaWVkIHNpemUKLSAgICAgICAgYXV0
byBmb250RGVzY3JpcHRpb24gPSB0ZXh0LT5zdHlsZSgpLmZvbnREZXNjcmlwdGlvbigpOworICAg
ICAgICBhdXRvIGZvbnREZXNjcmlwdGlvbiA9IHJlbmRlclRleHQtPnN0eWxlKCkuZm9udERlc2Ny
aXB0aW9uKCk7CiAgICAgICAgIGZsb2F0IG9yaWdpbmFsU2l6ZSA9IGZvbnREZXNjcmlwdGlvbi5z
cGVjaWZpZWRTaXplKCk7CiAgICAgICAgIGlmIChmb250RGVzY3JpcHRpb24uY29tcHV0ZWRTaXpl
KCkgIT0gb3JpZ2luYWxTaXplKSB7CiAgICAgICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0Q29t
cHV0ZWRTaXplKG9yaWdpbmFsU2l6ZSk7Ci0gICAgICAgICAgICBhdXRvIHN0eWxlID0gY2xvbmVS
ZW5kZXJTdHlsZVdpdGhTdGF0ZSh0ZXh0LT5zdHlsZSgpKTsKKyAgICAgICAgICAgIGF1dG8gc3R5
bGUgPSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKHJlbmRlclRleHQtPnN0eWxlKCkpOwogICAg
ICAgICAgICAgc3R5bGUuc2V0Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbik7CiAgICAg
ICAgICAgICBzdHlsZS5mb250Q2FzY2FkZSgpLnVwZGF0ZSgmbm9kZS0+ZG9jdW1lbnQoKS5mb250
U2VsZWN0b3IoKSk7CiAgICAgICAgICAgICBwYXJlbnRSZW5kZXJlci0+c2V0U3R5bGUoV1RGTW92
ZShzdHlsZSkpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1RleHRBdXRv
U2l6aW5nLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaAppbmRl
eCA3N2FmMWVjNmRkNWRmODc1MzIyMWVlYmNiMWYwZmRhN2NmNjI3NTc5Li5iNTMwMjFiMTI3OGFk
ZDgyZjQ0NmMwNGViMTg1MzA2YzcxMmIxYzIwIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9y
ZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
VGV4dEF1dG9TaXppbmcuaApAQCAtNDMsMTcgKzQzLDEzIEBAIHB1YmxpYzoKICAgICBUZXh0QXV0
b1NpemluZ0tleSgpID0gZGVmYXVsdDsKICAgICBlbnVtIERlbGV0ZWRUYWcgeyBEZWxldGVkIH07
CiAgICAgZXhwbGljaXQgVGV4dEF1dG9TaXppbmdLZXkoRGVsZXRlZFRhZyk7Ci0gICAgZXhwbGlj
aXQgVGV4dEF1dG9TaXppbmdLZXkoY29uc3QgUmVuZGVyU3R5bGUqKTsKLSAgICBUZXh0QXV0b1Np
emluZ0tleShUZXh0QXV0b1NpemluZ0tleSYmKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgVGV4
dEF1dG9TaXppbmdLZXkoY29uc3QgUmVuZGVyU3R5bGUmKTsKIAotICAgIFRleHRBdXRvU2l6aW5n
S2V5JiBvcGVyYXRvcj0oVGV4dEF1dG9TaXppbmdLZXkmJikgPSBkZWZhdWx0OwotCi0gICAgY29u
c3QgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQot
ICAgIGlubGluZSBib29sIGlzRGVsZXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNEZWxldGVkOyB9
CisgICAgY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyBBU1NFUlQoIWlzRGVsZXRl
ZCgpKTsgcmV0dXJuIG1fc3R5bGUuZ2V0KCk7IH0KKyAgICBib29sIGlzRGVsZXRlZCgpIGNvbnN0
IHsgcmV0dXJuIG1fc3R5bGUuZ2V0KCkgPT0gcmVpbnRlcnByZXRfY2FzdDxSZW5kZXJTdHlsZSo+
KC0xKTsgfQogCiBwcml2YXRlOgogICAgIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJTdHlsZT4gbV9z
dHlsZTsKLSAgICBib29sIG1faXNEZWxldGVkIHsgZmFsc2UgfTsKIH07CiAKIGlubGluZSBib29s
IG9wZXJhdG9yPT0oY29uc3QgVGV4dEF1dG9TaXppbmdLZXkmIGEsIGNvbnN0IFRleHRBdXRvU2l6
aW5nS2V5JiBiKQpAQCAtNzEsMTkgKzY3LDMyIEBAIHN0cnVjdCBUZXh0QXV0b1NpemluZ0hhc2gg
ewogICAgIHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0g
dHJ1ZTsKIH07CiAKLWNsYXNzIFRleHRBdXRvU2l6aW5nVmFsdWUgOiBwdWJsaWMgUmVmQ291bnRl
ZDxUZXh0QXV0b1NpemluZ1ZhbHVlPiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxUZXh0QXV0
b1NpemluZ1ZhbHVlPiBjcmVhdGUoKQorc3RydWN0IFRleHRBdXRvU2l6aW5nVHJhaXRzIDogV1RG
OjpHZW5lcmljSGFzaFRyYWl0czxUZXh0QXV0b1NpemluZ0tleT4geworICAgIHN0YXRpYyBjb25z
dCBib29sIGVtcHR5VmFsdWVJc1plcm8gPSB0cnVlOworICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVj
dERlbGV0ZWRWYWx1ZShUZXh0QXV0b1NpemluZ0tleSYgc2xvdCkKKyAgICB7CisgICAgICAgIG5l
dyAoTm90TnVsbCwgJnNsb3QpIFRleHRBdXRvU2l6aW5nS2V5KFRleHRBdXRvU2l6aW5nS2V5OjpE
ZWxldGVkKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgaXNEZWxldGVkVmFsdWUoY29uc3QgVGV4
dEF1dG9TaXppbmdLZXkmIHZhbHVlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpu
ZXcgVGV4dEF1dG9TaXppbmdWYWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZS5pc0RlbGV0ZWQo
KTsKICAgICB9Cit9OworCitjbGFzcyBUZXh0QXV0b1NpemluZ1ZhbHVlIHsKKyAgICBXVEZfTUFL
RV9GQVNUX0FMTE9DQVRFRDsKK3B1YmxpYzoKKyAgICBUZXh0QXV0b1NpemluZ1ZhbHVlKCkgPSBk
ZWZhdWx0OworICAgIH5UZXh0QXV0b1NpemluZ1ZhbHVlKCk7CisKKyAgICB2b2lkIGFkZFRleHRO
b2RlKFRleHQmLCBmbG9hdCBzaXplKTsKKworICAgIGVudW0gY2xhc3MgU3RpbGxIYXNOb2RlcyB7
IE5vLCBZZXMgfTsKKyAgICBTdGlsbEhhc05vZGVzIGFkanVzdFRleHROb2RlU2l6ZXMoKTsKIAot
ICAgIHZvaWQgYWRkTm9kZShUZXh0JiwgZmxvYXQgc2l6ZSk7Ci0gICAgYm9vbCBhZGp1c3ROb2Rl
U2l6ZXMoKTsKLSAgICBpbnQgbnVtTm9kZXMoKSBjb25zdDsKLSAgICB2b2lkIHJlc2V0KCk7CiBw
cml2YXRlOgotICAgIFRleHRBdXRvU2l6aW5nVmFsdWUoKSB7IH0KKyAgICB2b2lkIHJlc2V0KCk7
CisKICAgICBIYXNoU2V0PFJlZlB0cjxUZXh0Pj4gbV9hdXRvU2l6ZWROb2RlczsKIH07CiAK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>280119</attachid>
            <date>2016-05-30 22:21:11 -0700</date>
            <delta_ts>2016-05-31 13:52:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-158217-20160530222227.patch</filename>
            <type>text/plain</type>
            <size>25520</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjAxNDk1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzUwZjkxOGU2MTdjZDE4
ODIxNjA1OGIxNzYwNzI0MDFjODcwZDRiNi4uNWIzN2UxNGE5NjE5MzQ4OGM2ZDM2ZjljY2Y0NTE3
ZjBmMTk4YTFiZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDg3IEBACisyMDE2LTA1LTMwICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgQ2xlYW4gdXAgLyBtb2Rlcm5p
emUgaU9TIHRleHQgYXV0b3NpemluZyBjb2RlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNTgyMTcKKworICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBB
ZGxlci4KKworICAgICAgICBDbGVhbiB1cCAvIG1vZGVybml6ZSBpT1MgdGV4dCBhdXRvc2l6aW5n
IGNvZGUuCisKKyAgICAgICAgSSB0aGluayBpT1MgdGV4dCBhdXRvc2l6aW5nIGNvZGUgaXMgdG9v
IGludHJ1c2l2ZSBpbnNpZGUgdGhlIFJlbmRlclN0eWxlCisgICAgICAgIGNsYXNzIGJ1dCBJIGhh
dmUgbm90IHVwZGF0ZWQgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIHlldCB0byBsaW1pdCBwYXRjaAor
ICAgICAgICBzaXplLiBUaGlzIHBhdGNoIGZvY3VzZXMgb24gdGhlIFRleHRBdXRvU2l6aW5nLiog
YW5kIHRleHQgYXV0b3NpemluZworICAgICAgICBjb2RlIGluIHRoZSBEb2N1bWVudCBjbGFzcy4K
KworICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAg
KiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4dEF1dG9TaXppbmdUcmFp
dHM6OmNvbnN0cnVjdERlbGV0ZWRWYWx1ZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpU
ZXh0QXV0b1NpemluZ1RyYWl0czo6aXNEZWxldGVkVmFsdWUpOiBEZWxldGVkLgorICAgICAgICBN
b3ZlIFRleHRBdXRvU2l6aW5nVHJhaXRzIHRvIHRoZSBUZXh0QXV0b1NpemluZyBoZWFkZXIgdG8K
KyAgICAgICAgcHJvbW90ZSByZXVzZSBhbmQgbWFrZSB0aGUgdGV4dCBhdXRvc2l6aW5nIGNvZGUg
YSBsaXR0bGUgbGVzcworICAgICAgICBpbnRydXNpdmUuCisKKyAgICAgICAgKFdlYkNvcmU6OkRv
Y3VtZW50OjphZGRBdXRvU2l6aW5nTm9kZSk6CisgICAgICAgIC0gRHJvcCBsb2NhbCAna2V5JyB2
YXJpYWJsZSBhcyBpdCBpcyBvbmx5IHVzZWQgb25jZS4KKyAgICAgICAgLSBVc2Ugc3RkOjptYWtl
X3VuaXF1ZTw+IHRvIGNvbnN0cnVjdCB0aGUgVGV4dEF1dG9TaXppbmdWYWx1ZQorICAgICAgICAg
IGFzIGl0IGlzIG5vIGxvbmdlciByZWYtY291bnRlZC4KKworICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnQ6OnZhbGlkYXRlQXV0b1NpemluZ05vZGVzKToKKyAgICAgICAgSXRlcmF0ZSBvdmVyIHRo
ZSB0ZXh0QXV0b3NpemVkTm9kZXMgSGFzaE1hcCBvbmx5IG9uY2UgaW5zdGVhZAorICAgICAgICBv
ZiB0d2ljZS4gVGV4dEF1dG9TaXppbmdWYWx1ZTo6YWRqdXN0VGV4dE5vZGVTaXplcygpIHdhcyB1
cGRhdGVkCisgICAgICAgIHRvIHJldHVybiBhbiBlbnVtIGNsYXNzIHNvIHdlIGtub3cgZnJvbSB0
aGF0IHZhbHVlIGlmIHdlIGNhbgorICAgICAgICByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIEhh
c2hTZXQgb3Igbm90LCB3aXRob3V0IGhhdmluZyB0byByZWx5CisgICAgICAgIG9uIFRleHRBdXRv
U2l6aW5nVmFsdWU6Om51bU5vZGVzKCksIHdoaWNoIEkgcmVtb3ZlZCBpbiB0aGlzCisgICAgICAg
IHBhdGNoLgorCisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6Y2xlYXJBdXRvU2l6aW5nTm9k
ZXMpOgorICAgICAgICBVcGRhdGVkIHRoZSBUZXh0QXV0b1NpemluZ1ZhbHVlIGRlc3RydWN0b3Ig
dG8gY2FsbCByZXNldCgpIHNvCisgICAgICAgIHdlIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBj
YWxsIHJlc2V0KCkgb24gZWFjaCB2YWx1ZSBiZWZvcmUKKyAgICAgICAgY2xlYXJpbmcgdGhlIHRl
eHRBdXRvc2l6ZWROb2RlcyBIYXNoTWFwLgorCisgICAgICAgICogZG9tL0RvY3VtZW50Lmg6Cisg
ICAgICAgIC0gTW92ZSBUZXh0QXV0b1NpemluZ1RyYWl0cyB0byB0aGUgVGV4dEF1dG9zaXppbmcg
aGVhZGVyLgorICAgICAgICAtIFJlbmFtZSByZXNldEF1dG9zaXppbmdOb2RlcygpIHRvIGNsZWFy
QXV0b1NpemluZ05vZGVzKCkgYXMKKyAgICAgICAgICB0aGUgbWV0aG9kIG5vdyBvbmx5IGNsZWFy
cyB0aGUgdGV4dEF1dG9zaXplZE5vZGVzIEhhc2hNYXAKKyAgICAgICAgICBhbmQgcmVzZXQoKSBp
cyBub3cgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGZvcgorICAgICAgICAgIFRleHRBdXRvU2l6
aW5nVmFsdWUuCisKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyRWxlbWVudC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJFbGVtZW50OjpyZXNldFRleHRBdXRvc2l6aW5nKToKKyAgICAg
ICAgQ2FsbCBjbGVhckF1dG9TaXppbmdOb2RlcygpIGFzIGl0IHdhcyByZW5hbWVkLgorCisgICAg
ICAgICogcmVuZGVyaW5nL1RleHRBdXRvU2l6aW5nLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleSk6CisgICAgICAgIC0gVXNlIHZhbHVl
IG9mIC0xIGZvciBzdGQ6OnVuaXF1ZV9wdHIgbV9zdHlsZSBtZW1iZXIgZm9yIGRpc3Rpbmd1aXNo
aW5nCisgICAgICAgIGEgSGFzaFRhYmxlIGRlbGV0ZWQgdmFsdWUsIGluc3RlYWQgb2YgaGF2aW5n
IGFuIGV4dHJhIG1faXNEZWxldGVkCisgICAgICAgIGRhdGEgbWVtYmVyIGZvciB0aGlzIHB1cnBv
c2UuCisgICAgICAgIC0gVGFrZSBSZW5kZXJTdHlsZSBwYXJhbWV0ZXIgYnkgcmVmZXJlbmNlIGFu
ZCBkcm9wIHRoZSBudWxsIGNoZWNrIGFzIHRoZQorICAgICAgICAgIGNhbGwgc2l0ZSBjYW4gbmV2
ZXIgcGFzcyBudWxscHRyLgorCisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ1ZhbHVl
OjphZGRUZXh0Tm9kZSk6CisgICAgICAgIC0gUmVuYW1lIGFkZE5vZGUoKSB0byBhZGRUZXh0Tm9k
ZSgpIGZvciBjbGFyaXR5LgorCisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ1ZhbHVl
Ojp+VGV4dEF1dG9TaXppbmdWYWx1ZSk6CisgICAgICAgIFVwZGF0ZSBkZXN0cnVjdG9yIHRvIGNh
bGwgcmVzZXQoKSBzbyB0aGF0IHRoZSBEb2N1bWVudCBkb2VzIG5vdCBoYXZlIHRvCisgICAgICAg
IGNhbGwgaXQgZXhwbGljaXRseSBhbmQgY2FuIGluc3RlYWQganVzdCBjbGVhciB0aGUgSGFzaE1h
cCwgd2hpY2ggd2lsbAorICAgICAgICBkZXN0cm95IHRoZSBUZXh0QXV0b1NpemluZ1ZhbHVlIG9i
amVjdHMuCisKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRvU2l6aW5nVmFsdWU6OnJlc2V0KToK
KyAgICAgICAgUmVuYW1lIHRleHQgdG8gcmVuZGVyZXIgZm9yIGNsYXJpdHkuCisKKyAgICAgICAg
KiByZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaDoKKyAgICAgICAgLSBNYWtlIFRleHRBdXRvU2l6
aW5nVmFsdWUgYXMgZmFzdCBhbGxvY2F0ZWQuCisgICAgICAgIC0gVXBkYXRlIFRleHRBdXRvU2l6
aW5nVmFsdWUgdG8gbm8gbG9uZ2VyIGJlIHJlZmNvdW50ZWQgYXMgb3duZXJzaGlwIGlzIG5ldmVy
CisgICAgICAgICAgc2hhcmVkLiBUaGUgRG9jdW1lbnQgb3ducyB0aG9zZS4KKyAgICAgICAgLSBE
cm9wIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBUZXh0QXV0b1NpemluZ1ZhbHVlIGFuZCBtYWtl
IHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICAgIHB1YmxpYyBub3cgdGhhdCB0aGUgY2xhc3MgaXMg
bm8gbG9uZ2VyIHJlZmNvdW50ZWQuCisgICAgICAgIC0gTWFrZSByZXNldCgpIG1ldGhvZCBwcml2
YXRlIG5vdyB0aGF0IGl0IGlzIGNhbGxlZCBmcm9tIHRoZSBkZXN0cnVjdG9yIGFuZAorICAgICAg
ICAgIHRoZSBEb2N1bWVudCBpcyBubyBsb25nZXIgZXhwZWN0ZWQgdG8gZXhwbGljaXRseSBjYWxs
IGl0LgorICAgICAgICAtIFVwZGF0ZSBhZGp1c3RUZXh0Tm9kZVNpemVzKCkgdG8gcmV0dXJuIGEg
U3RpbGxIYXNOb2RlcyBlbnVtIGNsYXNzIGFuZCB0aGUKKyAgICAgICAgICBEb2N1bWVudCBjYW4g
cmVseSBvbiB0aGUgZGV0ZXJtaW5lIGlmIGl0IGNhbiBkcm9wIHRoZSBUZXh0QXV0b1NpemluZ1Zh
bHVlCisgICAgICAgICAgZnJvbSBpdHMgSGFzaE1hcCAoYW5kIHRoZXJlZm9yZSBkZXN0cm95IHRo
ZSBvYmplY3QpLgorICAgICAgICAtIERyb3AgbnVtTm9kZXMoKSBtZXRob2QgYXMgaXQgaXMgbm8g
bG9uZ2VyIG5lZWRlZC4KKworCiAyMDE2LTA1LTI4ICBDaHJpcyBEdW1leiAgPGNkdW1lekBhcHBs
ZS5jb20+CiAKICAgICAgICAgVGVtcGxhdGl6ZSBOb25jb3B5YWJsZUZ1bmN0aW9uIGNsYXNzIHNp
bWlsYXJseSB0byBzdGQ6OmZ1bmN0aW9uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggZjI5YTQ0YjQyM2Y0ZmJhZmRlYTI5OTI3ZjA4
YzZmMGMwMGJiZjYyMi4uOWFkNmQ1Y2JlNGE2ZjVhMjFjNjY4Yzk0Y2M3OTgwZWQ1ODQ3OGU1MiAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agpAQCAtNDc0LDcgKzQ3NCw3IEBACiAJCTBGNTREQ0UxMTg4MEY5MDEwMDNFRURCQiAvKiBET01H
ZXN0dXJlRXZlbnQubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSAwRjU0RENERTE4ODBGOTAxMDAzRUVEQkIgLyogRE9NR2VzdHVyZUV2ZW50Lm1tICovOyB9
OwogCQkwRjU0RENFMjE4ODBGOTAxMDAzRUVEQkIgLyogRE9NR2VzdHVyZUV2ZW50SW50ZXJuYWwu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTREQ0RG
MTg4MEY5MDEwMDNFRURCQiAvKiBET01HZXN0dXJlRXZlbnRJbnRlcm5hbC5oICovOyB9OwogCQkw
RjU0RENFNTE4ODEwNTFEMDAzRUVEQkIgLyogVGV4dEF1dG9TaXppbmcuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1NERDRTMxODgxMDUxRDAwM0VF
REJCIC8qIFRleHRBdXRvU2l6aW5nLmNwcCAqLzsgfTsKLQkJMEY1NERDRTYxODgxMDUxRDAwM0VF
REJCIC8qIFRleHRBdXRvU2l6aW5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwRjU0RENFNDE4ODEwNTFEMDAzRUVEQkIgLyogVGV4dEF1dG9TaXppbmcu
aCAqLzsgfTsKKwkJMEY1NERDRTYxODgxMDUxRDAwM0VFREJCIC8qIFRleHRBdXRvU2l6aW5nLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjU0RENFNDE4
ODEwNTFEMDAzRUVEQkIgLyogVGV4dEF1dG9TaXppbmcuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwRjU0REQwODE4ODFENUY1MDAzRUVEQkIgLyog
VG91Y2guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBG
NTRERDA1MTg4MUQ1RjUwMDNFRURCQiAvKiBUb3VjaC5oICovOyB9OwogCQkwRjU0REQwOTE4ODFE
NUY1MDAzRUVEQkIgLyogVG91Y2hFdmVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMEY1NEREMDYxODgxRDVGNTAwM0VFREJCIC8qIFRvdWNoRXZlbnQu
aCAqLzsgfTsKIAkJMEY1NEREMEExODgxRDVGNTAwM0VFREJCIC8qIFRvdWNoTGlzdC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1NEREMDcxODgxRDVG
NTAwM0VFREJCIC8qIFRvdWNoTGlzdC5oICovOyB9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvZG9tL0RvY3VtZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKaW5k
ZXggNmM2YjMxYzUwN2JmNTBkNmU2NDk5YmU4ZTY2YmVmNjNhNTdlMGQxNS4uMjc0Y2FmN2U3YjFm
NDg0NTQ3NDI3ZWI2OTQ2ZmFlNGI2ZmIyY2EzMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
ZG9tL0RvY3VtZW50LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCkBA
IC0yMjMsMTAgKzIyMyw2IEBACiAjaW5jbHVkZSAiR2VzdHVyZUV2ZW50LmgiCiAjZW5kaWYKIAot
I2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQotI2luY2x1ZGUgIlRleHRBdXRvU2l6aW5n
LmgiCi0jZW5kaWYKLQogI2lmIEVOQUJMRShNQVRITUwpCiAjaW5jbHVkZSAiTWF0aE1MRWxlbWVu
dC5oIgogI2luY2x1ZGUgIk1hdGhNTEVsZW1lbnRGYWN0b3J5LmgiCkBAIC00MjUsMTggKzQyMSw2
IEBAIHN0YXRpYyB2b2lkIHByaW50TmF2aWdhdGlvbkVycm9yTWVzc2FnZShGcmFtZSogZnJhbWUs
IGNvbnN0IFVSTCYgYWN0aXZlVVJMLCBjb25zCiAKIHVpbnQ2NF90IERvY3VtZW50OjpzX2dsb2Jh
bFRyZWVWZXJzaW9uID0gMDsKIAotI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQotdm9p
ZCBUZXh0QXV0b1NpemluZ1RyYWl0czo6Y29uc3RydWN0RGVsZXRlZFZhbHVlKFRleHRBdXRvU2l6
aW5nS2V5JiBzbG90KQotewotICAgIG5ldyAoJnNsb3QpIFRleHRBdXRvU2l6aW5nS2V5KFRleHRB
dXRvU2l6aW5nS2V5OjpEZWxldGVkKTsKLX0KLQotYm9vbCBUZXh0QXV0b1NpemluZ1RyYWl0czo6
aXNEZWxldGVkVmFsdWUoY29uc3QgVGV4dEF1dG9TaXppbmdLZXkmIHZhbHVlKQotewotICAgIHJl
dHVybiB2YWx1ZS5pc0RlbGV0ZWQoKTsKLX0KLSNlbmRpZgotCiBIYXNoU2V0PERvY3VtZW50Kj4m
IERvY3VtZW50OjphbGxEb2N1bWVudHMoKQogewogICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxI
YXNoU2V0PERvY3VtZW50Kj4+IGRvY3VtZW50czsKQEAgLTUzMDEsMzIgKzUyODUsMTkgQEAgSFRN
TENhbnZhc0VsZW1lbnQqIERvY3VtZW50OjpnZXRDU1NDYW52YXNFbGVtZW50KGNvbnN0IFN0cmlu
ZyYgbmFtZSkKIHZvaWQgRG9jdW1lbnQ6OmFkZEF1dG9TaXppbmdOb2RlKFRleHQmIG5vZGUsIGZs
b2F0IGNhbmRpZGF0ZVNpemUpCiB7CiAgICAgTE9HKFRleHRBdXRvc2l6aW5nLCAiIGFkZEF1dG9T
aXppbmdOb2RlICVwIGNhbmRpZGF0ZVNpemU9JWYiLCAmbm9kZSwgY2FuZGlkYXRlU2l6ZSk7Ci0K
LSAgICBUZXh0QXV0b1NpemluZ0tleSBrZXkoJm5vZGUucmVuZGVyZXIoKS0+c3R5bGUoKSk7Ci0g
ICAgYXV0byBhZGRSZXN1bHQgPSBtX3RleHRBdXRvU2l6ZWROb2Rlcy5lbnN1cmUoV1RGTW92ZShr
ZXkpLCBbXSB7Ci0gICAgICAgIHJldHVybiBUZXh0QXV0b1NpemluZ1ZhbHVlOjpjcmVhdGUoKTsK
LSAgICB9KTsKLSAgICBhZGRSZXN1bHQuaXRlcmF0b3ItPnZhbHVlLT5hZGROb2RlKG5vZGUsIGNh
bmRpZGF0ZVNpemUpOworICAgIGF1dG8gYWRkUmVzdWx0ID0gbV90ZXh0QXV0b1NpemVkTm9kZXMu
YWRkPFRleHRBdXRvU2l6aW5nSGFzaFRyYW5zbGF0b3I+KG5vZGUucmVuZGVyZXIoKS0+c3R5bGUo
KSwgVGV4dEF1dG9TaXppbmdWYWx1ZSgpKTsKKyAgICBhZGRSZXN1bHQuaXRlcmF0b3ItPnZhbHVl
LmFkZFRleHROb2RlKG5vZGUsIGNhbmRpZGF0ZVNpemUpOwogfQogCi12b2lkIERvY3VtZW50Ojp2
YWxpZGF0ZUF1dG9TaXppbmdOb2RlcygpCit2b2lkIERvY3VtZW50Ojp1cGRhdGVBdXRvU2l6aW5n
Tm9kZXMoKQogewotICAgIFZlY3RvcjxUZXh0QXV0b1NpemluZ0tleT4gbm9kZXNGb3JSZW1vdmFs
OwotICAgIGZvciAoYXV0byYga2V5VmFsdWVQYWlyIDogbV90ZXh0QXV0b1NpemVkTm9kZXMpIHsK
LSAgICAgICAgVGV4dEF1dG9TaXppbmdWYWx1ZSogdmFsdWUgPSBrZXlWYWx1ZVBhaXIudmFsdWUu
Z2V0KCk7Ci0gICAgICAgIC8vIFVwZGF0ZSBhbGwgdGhlIG5vZGVzIGluIHRoZSBjb2xsZWN0aW9u
IHRvIHJlZmxlY3QgdGhlIG5ldwotICAgICAgICAvLyBjYW5kaWRhdGUgc2l6ZS4KLSAgICAgICAg
dmFsdWUtPmFkanVzdE5vZGVTaXplcygpOwotICAgIH0KICAgICBtX3RleHRBdXRvU2l6ZWROb2Rl
cy5yZW1vdmVJZihbXShhdXRvJiBrZXlBbmRWYWx1ZSkgewotICAgICAgICByZXR1cm4gIWtleUFu
ZFZhbHVlLnZhbHVlLT5udW1Ob2RlcygpOworICAgICAgICByZXR1cm4ga2V5QW5kVmFsdWUudmFs
dWUuYWRqdXN0VGV4dE5vZGVTaXplcygpID09IFRleHRBdXRvU2l6aW5nVmFsdWU6OlN0aWxsSGFz
Tm9kZXM6Ok5vOwogICAgIH0pOwogfQogICAgIAotdm9pZCBEb2N1bWVudDo6cmVzZXRBdXRvU2l6
aW5nTm9kZXMoKQordm9pZCBEb2N1bWVudDo6Y2xlYXJBdXRvU2l6aW5nTm9kZXMoKQogewotICAg
IGZvciAoYXV0byYgdmFsdWUgOiBtX3RleHRBdXRvU2l6ZWROb2Rlcy52YWx1ZXMoKSkKLSAgICAg
ICAgdmFsdWUtPnJlc2V0KCk7CiAgICAgbV90ZXh0QXV0b1NpemVkTm9kZXMuY2xlYXIoKTsKIH0K
IApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvZG9tL0RvY3VtZW50LmggYi9Tb3VyY2UvV2Vi
Q29yZS9kb20vRG9jdW1lbnQuaAppbmRleCA2NTgxOWRmZDNiNDgxZDRkNzQzNzQ0NWFkMWM5ZmE0
YjU3ZWYyYThhLi40MWQ0ZGJmYjBkNzZmYjVmYzQxNWFjM2FmOTUwMThkYzdmNGQ1YTUyIDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuaAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9kb20vRG9jdW1lbnQuaApAQCAtNDYsNiArNDYsNyBAQAogI2luY2x1ZGUgIlN0cmluZ1dpdGhE
aXJlY3Rpb24uaCIKICNpbmNsdWRlICJTdHlsZUNoYW5nZS5oIgogI2luY2x1ZGUgIlN1cHBsZW1l
bnRhYmxlLmgiCisjaW5jbHVkZSAiVGV4dEF1dG9TaXppbmcuaCIKICNpbmNsdWRlICJUZXh0UmVz
b3VyY2VEZWNvZGVyLmgiCiAjaW5jbHVkZSAiVGltZXIuaCIKICNpbmNsdWRlICJUcmVlU2NvcGUu
aCIKQEAgLTIxMiwxMiArMjEzLDYgQEAgY2xhc3MgRGV2aWNlT3JpZW50YXRpb25Db250cm9sbGVy
Owogc3RydWN0IFRleHRBdXRvU2l6aW5nSGFzaDsKIGNsYXNzIFRleHRBdXRvU2l6aW5nS2V5Owog
Y2xhc3MgVGV4dEF1dG9TaXppbmdWYWx1ZTsKLQotc3RydWN0IFRleHRBdXRvU2l6aW5nVHJhaXRz
IDogV1RGOjpHZW5lcmljSGFzaFRyYWl0czxUZXh0QXV0b1NpemluZ0tleT4gewotICAgIHN0YXRp
YyBjb25zdCBib29sIGVtcHR5VmFsdWVJc1plcm8gPSB0cnVlOwotICAgIHN0YXRpYyB2b2lkIGNv
bnN0cnVjdERlbGV0ZWRWYWx1ZShUZXh0QXV0b1NpemluZ0tleSYgc2xvdCk7Ci0gICAgc3RhdGlj
IGJvb2wgaXNEZWxldGVkVmFsdWUoY29uc3QgVGV4dEF1dG9TaXppbmdLZXkmIHZhbHVlKTsKLX07
CiAjZW5kaWYKIAogI2lmIEVOQUJMRShNRURJQV9TRVNTSU9OKQpAQCAtMTY5NSwxMSArMTY5MCwx
MSBAQCBwcml2YXRlOgogI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQogcHVibGljOgog
ICAgIHZvaWQgYWRkQXV0b1NpemluZ05vZGUoVGV4dCYsIGZsb2F0IHNpemUpOwotICAgIHZvaWQg
dmFsaWRhdGVBdXRvU2l6aW5nTm9kZXMoKTsKLSAgICB2b2lkIHJlc2V0QXV0b1NpemluZ05vZGVz
KCk7CisgICAgdm9pZCB1cGRhdGVBdXRvU2l6aW5nTm9kZXMoKTsKKyAgICB2b2lkIGNsZWFyQXV0
b1NpemluZ05vZGVzKCk7CiAKIHByaXZhdGU6Ci0gICAgdHlwZWRlZiBIYXNoTWFwPFRleHRBdXRv
U2l6aW5nS2V5LCBSZWZQdHI8VGV4dEF1dG9TaXppbmdWYWx1ZT4sIFRleHRBdXRvU2l6aW5nSGFz
aCwgVGV4dEF1dG9TaXppbmdUcmFpdHM+IFRleHRBdXRvU2l6aW5nTWFwOworICAgIHR5cGVkZWYg
SGFzaE1hcDxUZXh0QXV0b1NpemluZ0tleSwgVGV4dEF1dG9TaXppbmdWYWx1ZSwgVGV4dEF1dG9T
aXppbmdIYXNoLCBUZXh0QXV0b1NpemluZ1RyYWl0cz4gVGV4dEF1dG9TaXppbmdNYXA7CiAgICAg
VGV4dEF1dG9TaXppbmdNYXAgbV90ZXh0QXV0b1NpemVkTm9kZXM7CiAjZW5kaWYKIApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckVsZW1lbnQuY3BwIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckVsZW1lbnQuY3BwCmluZGV4IDNlYzNmZDI5ODc4MTU4
OWU4YzZkM2M5Y2Q4NDYyYzYyOGJjNzM3MzguLmJhZDJiZTBlNWRjZjY0MjlkOTJlNGYzYTU4ZjY2
YjE2Njc2Yjc4ZTkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJF
bGVtZW50LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRWxlbWVudC5j
cHAKQEAgLTIyMTQsNyArMjIxNCw3IEBAIHZvaWQgUmVuZGVyRWxlbWVudDo6YWRqdXN0Q29tcHV0
ZWRGb250U2l6ZXNPbkJsb2NrcyhmbG9hdCBzaXplLCBmbG9hdCB2aXNpYmxlV2lkCiAgICAgfQog
CiAgICAgLy8gUmVtb3ZlIHN0eWxlIGZyb20gYXV0by1zaXppbmcgdGFibGUgdGhhdCBhcmUgbm8g
bG9uZ2VyIHZhbGlkLgotICAgIGRvY3VtZW50LT52YWxpZGF0ZUF1dG9TaXppbmdOb2RlcygpOwor
ICAgIGRvY3VtZW50LT51cGRhdGVBdXRvU2l6aW5nTm9kZXMoKTsKIH0KIAogdm9pZCBSZW5kZXJF
bGVtZW50OjpyZXNldFRleHRBdXRvc2l6aW5nKCkKQEAgLTIyMjUsNyArMjIyNSw3IEBAIHZvaWQg
UmVuZGVyRWxlbWVudDo6cmVzZXRUZXh0QXV0b3NpemluZygpCiAKICAgICBMT0coVGV4dEF1dG9z
aXppbmcsICJSZW5kZXJFbGVtZW50OjpyZXNldFRleHRBdXRvc2l6aW5nKCkiKTsKIAotICAgIGRv
Y3VtZW50LT5yZXNldEF1dG9TaXppbmdOb2RlcygpOworICAgIGRvY3VtZW50LT5jbGVhckF1dG9T
aXppbmdOb2RlcygpOwogCiAgICAgVmVjdG9yPGludD4gZGVwdGhTdGFjazsKICAgICBpbnQgY3Vy
cmVudERlcHRoID0gMDsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0
QXV0b1NpemluZy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcu
Y3BwCmluZGV4IDNiZGQ3YWI4ZGI2NTQyZmRhY2M0OWM0MjYyYzA2OWViODRmZmI3NTEuLjE1Zjc0
Y2VhNjFjMjFiZGJmNTVhYWQwZGE4MGVmMWRmNDM5MjY1ZDEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1NpemluZy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cmVuZGVyaW5nL1RleHRBdXRvU2l6aW5nLmNwcApAQCAtNDgsNzkgKzQ4LDcxIEBAIHN0YXRpYyBS
ZW5kZXJTdHlsZSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKGNvbnN0IFJlbmRlclN0eWxlJiBj
dXJyZW50U3R5bGUpCiB9CiAKIFRleHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleShE
ZWxldGVkVGFnKQotICAgIDogbV9pc0RlbGV0ZWQodHJ1ZSkKIHsKKyAgICBuZXcgKE5vdE51bGws
IHN0ZDo6YWRkcmVzc29mKG1fc3R5bGUpKSBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyU3R5bGU+KHJl
aW50ZXJwcmV0X2Nhc3Q8UmVuZGVyU3R5bGUqPigtMSkpOwogfQogCi1UZXh0QXV0b1NpemluZ0tl
eTo6VGV4dEF1dG9TaXppbmdLZXkoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlKQotICAgIDogbV9z
dHlsZShzdHlsZSA/IFJlbmRlclN0eWxlOjpjbG9uZVB0cigqc3R5bGUpIDogbnVsbHB0cikKK1Rl
eHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleShjb25zdCBSZW5kZXJTdHlsZSYgc3R5
bGUsIHVuc2lnbmVkIGhhc2gpCisgICAgOiBtX3N0eWxlKFJlbmRlclN0eWxlOjpjbG9uZVB0cihz
dHlsZSkpIC8vIEZJWE1FOiBUaGlzIHNlZW1zIHZlcnkgaW5lZmZpY2llbnQuCisgICAgLCBtX2hh
c2goaGFzaCkKIHsKIH0KIAotaW50IFRleHRBdXRvU2l6aW5nVmFsdWU6Om51bU5vZGVzKCkgY29u
c3QKLXsKLSAgICByZXR1cm4gbV9hdXRvU2l6ZWROb2Rlcy5zaXplKCk7Ci19Ci0KLXZvaWQgVGV4
dEF1dG9TaXppbmdWYWx1ZTo6YWRkTm9kZShUZXh0JiBub2RlLCBmbG9hdCBzaXplKQordm9pZCBU
ZXh0QXV0b1NpemluZ1ZhbHVlOjphZGRUZXh0Tm9kZShUZXh0JiBub2RlLCBmbG9hdCBzaXplKQog
ewogICAgIG5vZGUucmVuZGVyZXIoKS0+c2V0Q2FuZGlkYXRlQ29tcHV0ZWRUZXh0U2l6ZShzaXpl
KTsKICAgICBtX2F1dG9TaXplZE5vZGVzLmFkZCgmbm9kZSk7CiB9CiAKLSNkZWZpbmUgTUFYX1ND
QUxFX0lOQ1JFQVNFIDEuN2YKK3N0YXRpYyBjb25zdCBmbG9hdCBtYXhTY2FsZUluY3JlYXNlID0g
MS43ZjsKIAotYm9vbCBUZXh0QXV0b1NpemluZ1ZhbHVlOjphZGp1c3ROb2RlU2l6ZXMoKQorYXV0
byBUZXh0QXV0b1NpemluZ1ZhbHVlOjphZGp1c3RUZXh0Tm9kZVNpemVzKCkgLT4gU3RpbGxIYXNO
b2RlcwogewotICAgIGJvb2wgZGlkUmVtb3ZlT2JqZWN0cyA9IGZhbHNlOwotCi0gICAgLy8gUmVt
b3ZlIHN0YWxlIG5vZGVzLiAgTm9kZXMgbWF5IGhhdmUgaGFkIHRoZWlyIHJlbmRlcmVycyBkZXRh
Y2hlZC4gIFdlJ2xsCi0gICAgLy8gYWxzbyBuZWVkIHRvIHJlbW92ZSB0aGUgc3R5bGUgZnJvbSB0
aGUgZG9jdW1lbnRzIG1fdGV4dEF1dG9TaXplZE5vZGVzCi0gICAgLy8gY29sbGVjdGlvbi4gIFJl
dHVybiB0cnVlIGluZGljYXRlcyB3ZSBuZWVkIHRvIGRvIHRoYXQgcmVtb3ZhbC4KKyAgICAvLyBS
ZW1vdmUgc3RhbGUgbm9kZXMuIE5vZGVzIG1heSBoYXZlIGhhZCB0aGVpciByZW5kZXJlcnMgZGV0
YWNoZWQuIFdlJ2xsIGFsc28gbmVlZCB0byByZW1vdmUgdGhlIHN0eWxlIGZyb20gdGhlIGRvY3Vt
ZW50cyBtX3RleHRBdXRvU2l6ZWROb2RlcworICAgIC8vIGNvbGxlY3Rpb24uIFJldHVybiB0cnVl
IGluZGljYXRlcyB3ZSBuZWVkIHRvIGRvIHRoYXQgcmVtb3ZhbC4KICAgICBWZWN0b3I8VGV4dCo+
IG5vZGVzRm9yUmVtb3ZhbDsKLSAgICBmb3IgKGF1dG8mIG5vZGUgOiBtX2F1dG9TaXplZE5vZGVz
KSB7Ci0gICAgICAgIGF1dG8qIHRleHQgPSBub2RlLT5yZW5kZXJlcigpOwotICAgICAgICBpZiAo
IXRleHQgfHwgIXRleHQtPnN0eWxlKCkudGV4dFNpemVBZGp1c3QoKS5pc0F1dG8oKSB8fCAhdGV4
dC0+Y2FuZGlkYXRlQ29tcHV0ZWRUZXh0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBub2Rlc0ZvclJl
bW92YWwuYXBwZW5kKG5vZGUuZ2V0KCkpOwotICAgICAgICAgICAgZGlkUmVtb3ZlT2JqZWN0cyA9
IHRydWU7Ci0gICAgICAgIH0KKyAgICBmb3IgKGF1dG8mIHRleHROb2RlIDogbV9hdXRvU2l6ZWRO
b2RlcykgeworICAgICAgICBhdXRvKiByZW5kZXJlciA9IHRleHROb2RlLT5yZW5kZXJlcigpOwor
ICAgICAgICBpZiAoIXJlbmRlcmVyIHx8ICFyZW5kZXJlci0+c3R5bGUoKS50ZXh0U2l6ZUFkanVz
dCgpLmlzQXV0bygpIHx8ICFyZW5kZXJlci0+Y2FuZGlkYXRlQ29tcHV0ZWRUZXh0U2l6ZSgpKQor
ICAgICAgICAgICAgbm9kZXNGb3JSZW1vdmFsLmFwcGVuZCh0ZXh0Tm9kZS5nZXQoKSk7CiAgICAg
fQogCiAgICAgZm9yIChhdXRvJiBub2RlIDogbm9kZXNGb3JSZW1vdmFsKQogICAgICAgICBtX2F1
dG9TaXplZE5vZGVzLnJlbW92ZShub2RlKTsKIAotICAgIC8vIElmIHdlIG9ubHkgaGF2ZSBvbmUg
cGllY2Ugb2YgdGV4dCB3aXRoIHRoZSBzdHlsZSBvbiB0aGUgcGFnZSBkb24ndAotICAgIC8vIGFk
anVzdCBpdCdzIHNpemUuCisgICAgU3RpbGxIYXNOb2RlcyBzdGlsbEhhc05vZGVzID0gbV9hdXRv
U2l6ZWROb2Rlcy5pc0VtcHR5KCkgPyBTdGlsbEhhc05vZGVzOjpObyA6IFN0aWxsSGFzTm9kZXM6
OlllczsKKworICAgIC8vIElmIHdlIG9ubHkgaGF2ZSBvbmUgcGllY2Ugb2YgdGV4dCB3aXRoIHRo
ZSBzdHlsZSBvbiB0aGUgcGFnZSBkb24ndCBhZGp1c3QgaXQncyBzaXplLgogICAgIGlmIChtX2F1
dG9TaXplZE5vZGVzLnNpemUoKSA8PSAxKQotICAgICAgICByZXR1cm4gZGlkUmVtb3ZlT2JqZWN0
czsKKyAgICAgICAgcmV0dXJuIHN0aWxsSGFzTm9kZXM7CiAKLSAgICAvLyBDb21wdXRlIGF2ZXJh
Z2Ugc2l6ZQorICAgIC8vIENvbXB1dGUgYXZlcmFnZSBzaXplLgogICAgIGZsb2F0IGN1bXVsYXRp
dmVTaXplID0gMDsKICAgICBmb3IgKGF1dG8mIG5vZGUgOiBtX2F1dG9TaXplZE5vZGVzKQogICAg
ICAgICBjdW11bGF0aXZlU2l6ZSArPSBub2RlLT5yZW5kZXJlcigpLT5jYW5kaWRhdGVDb21wdXRl
ZFRleHRTaXplKCk7CiAKLSAgICBmbG9hdCBhdmVyYWdlU2l6ZSA9IHJvdW5kZihjdW11bGF0aXZl
U2l6ZSAvIG1fYXV0b1NpemVkTm9kZXMuc2l6ZSgpKTsKKyAgICBmbG9hdCBhdmVyYWdlU2l6ZSA9
IHN0ZDo6cm91bmQoY3VtdWxhdGl2ZVNpemUgLyBtX2F1dG9TaXplZE5vZGVzLnNpemUoKSk7CiAK
LSAgICAvLyBBZGp1c3Qgc2l6ZXMKKyAgICAvLyBBZGp1c3Qgc2l6ZXMuCiAgICAgYm9vbCBmaXJz
dFBhc3MgPSB0cnVlOwogICAgIGZvciAoYXV0byYgbm9kZSA6IG1fYXV0b1NpemVkTm9kZXMpIHsK
LSAgICAgICAgYXV0byogdGV4dCA9IG5vZGUtPnJlbmRlcmVyKCk7Ci0gICAgICAgIGlmICghdGV4
dCB8fCB0ZXh0LT5zdHlsZSgpLmZvbnREZXNjcmlwdGlvbigpLmNvbXB1dGVkU2l6ZSgpID09IGF2
ZXJhZ2VTaXplKQorICAgICAgICBhdXRvJiByZW5kZXJlciA9ICpub2RlLT5yZW5kZXJlcigpOwor
ICAgICAgICBpZiAocmVuZGVyZXIuc3R5bGUoKS5mb250RGVzY3JpcHRpb24oKS5jb21wdXRlZFNp
emUoKSA9PSBhdmVyYWdlU2l6ZSkKICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAgICAgIGZs
b2F0IHNwZWNpZmllZFNpemUgPSB0ZXh0LT5zdHlsZSgpLmZvbnREZXNjcmlwdGlvbigpLnNwZWNp
ZmllZFNpemUoKTsKKyAgICAgICAgZmxvYXQgc3BlY2lmaWVkU2l6ZSA9IHJlbmRlcmVyLnN0eWxl
KCkuZm9udERlc2NyaXB0aW9uKCkuc3BlY2lmaWVkU2l6ZSgpOwogICAgICAgICBmbG9hdCBzY2Fs
ZUNoYW5nZSA9IGF2ZXJhZ2VTaXplIC8gc3BlY2lmaWVkU2l6ZTsKLSAgICAgICAgaWYgKHNjYWxl
Q2hhbmdlID4gTUFYX1NDQUxFX0lOQ1JFQVNFICYmIGZpcnN0UGFzcykgeworICAgICAgICBpZiAo
c2NhbGVDaGFuZ2UgPiBtYXhTY2FsZUluY3JlYXNlICYmIGZpcnN0UGFzcykgewogICAgICAgICAg
ICAgZmlyc3RQYXNzID0gZmFsc2U7Ci0gICAgICAgICAgICBhdmVyYWdlU2l6ZSA9IHJvdW5kZihz
cGVjaWZpZWRTaXplICogTUFYX1NDQUxFX0lOQ1JFQVNFKTsKKyAgICAgICAgICAgIGF2ZXJhZ2VT
aXplID0gc3RkOjpyb3VuZChzcGVjaWZpZWRTaXplICogbWF4U2NhbGVJbmNyZWFzZSk7CiAgICAg
ICAgICAgICBzY2FsZUNoYW5nZSA9IGF2ZXJhZ2VTaXplIC8gc3BlY2lmaWVkU2l6ZTsKICAgICAg
ICAgfQogCiAgICAgICAgIExPRyhUZXh0QXV0b3NpemluZywgIiAgYWRqdXN0IG5vZGUgc2l6ZSAl
cCBmaXJzdFBhc3M9JWQgYXZlcmFnZVNpemU9JWYgc2NhbGVDaGFuZ2U9JWYiLCBub2RlLmdldCgp
LCBmaXJzdFBhc3MsIGF2ZXJhZ2VTaXplLCBzY2FsZUNoYW5nZSk7CiAKLSAgICAgICAgYXV0byog
cGFyZW50UmVuZGVyZXIgPSB0ZXh0LT5wYXJlbnQoKTsKKyAgICAgICAgYXV0byogcGFyZW50UmVu
ZGVyZXIgPSByZW5kZXJlci5wYXJlbnQoKTsKIAotICAgICAgICBhdXRvIHN0eWxlID0gY2xvbmVS
ZW5kZXJTdHlsZVdpdGhTdGF0ZSh0ZXh0LT5zdHlsZSgpKTsKKyAgICAgICAgYXV0byBzdHlsZSA9
IGNsb25lUmVuZGVyU3R5bGVXaXRoU3RhdGUocmVuZGVyZXIuc3R5bGUoKSk7CiAgICAgICAgIGF1
dG8gZm9udERlc2NyaXB0aW9uID0gc3R5bGUuZm9udERlc2NyaXB0aW9uKCk7CiAgICAgICAgIGZv
bnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUoYXZlcmFnZVNpemUpOwogICAgICAgICBzdHls
ZS5zZXRGb250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKQEAgLTE2MSwyNiArMTUzLDMx
IEBAIGJvb2wgVGV4dEF1dG9TaXppbmdWYWx1ZTo6YWRqdXN0Tm9kZVNpemVzKCkKICAgICAgICAg
cGFyZW50UmVuZGVyZXItPnNldFN0eWxlKFdURk1vdmUobmV3UGFyZW50U3R5bGUpKTsKICAgICB9
CiAKLSAgICByZXR1cm4gZGlkUmVtb3ZlT2JqZWN0czsKKyAgICByZXR1cm4gc3RpbGxIYXNOb2Rl
czsKK30KKworVGV4dEF1dG9TaXppbmdWYWx1ZTo6flRleHRBdXRvU2l6aW5nVmFsdWUoKQorewor
ICAgIHJlc2V0KCk7CiB9CiAKIHZvaWQgVGV4dEF1dG9TaXppbmdWYWx1ZTo6cmVzZXQoKQogewog
ICAgIGZvciAoYXV0byYgbm9kZSA6IG1fYXV0b1NpemVkTm9kZXMpIHsKLSAgICAgICAgYXV0byog
dGV4dCA9IG5vZGUtPnJlbmRlcmVyKCk7Ci0gICAgICAgIGlmICghdGV4dCkKKyAgICAgICAgYXV0
byogcmVuZGVyZXIgPSBub2RlLT5yZW5kZXJlcigpOworICAgICAgICBpZiAoIXJlbmRlcmVyKQog
ICAgICAgICAgICAgY29udGludWU7CiAKLSAgICAgICAgYXV0byogcGFyZW50UmVuZGVyZXIgPSB0
ZXh0LT5wYXJlbnQoKTsKKyAgICAgICAgYXV0byogcGFyZW50UmVuZGVyZXIgPSByZW5kZXJlci0+
cGFyZW50KCk7CiAgICAgICAgIGlmICghcGFyZW50UmVuZGVyZXIpCiAgICAgICAgICAgICBjb250
aW51ZTsKIAogICAgICAgICAvLyBSZXNldCB0aGUgZm9udCBzaXplIGJhY2sgdG8gdGhlIG9yaWdp
bmFsIHNwZWNpZmllZCBzaXplCi0gICAgICAgIGF1dG8gZm9udERlc2NyaXB0aW9uID0gdGV4dC0+
c3R5bGUoKS5mb250RGVzY3JpcHRpb24oKTsKKyAgICAgICAgYXV0byBmb250RGVzY3JpcHRpb24g
PSByZW5kZXJlci0+c3R5bGUoKS5mb250RGVzY3JpcHRpb24oKTsKICAgICAgICAgZmxvYXQgb3Jp
Z2luYWxTaXplID0gZm9udERlc2NyaXB0aW9uLnNwZWNpZmllZFNpemUoKTsKICAgICAgICAgaWYg
KGZvbnREZXNjcmlwdGlvbi5jb21wdXRlZFNpemUoKSAhPSBvcmlnaW5hbFNpemUpIHsKICAgICAg
ICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRDb21wdXRlZFNpemUob3JpZ2luYWxTaXplKTsKLSAg
ICAgICAgICAgIGF1dG8gc3R5bGUgPSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKHRleHQtPnN0
eWxlKCkpOworICAgICAgICAgICAgYXV0byBzdHlsZSA9IGNsb25lUmVuZGVyU3R5bGVXaXRoU3Rh
dGUocmVuZGVyZXItPnN0eWxlKCkpOwogICAgICAgICAgICAgc3R5bGUuc2V0Rm9udERlc2NyaXB0
aW9uKGZvbnREZXNjcmlwdGlvbik7CiAgICAgICAgICAgICBzdHlsZS5mb250Q2FzY2FkZSgpLnVw
ZGF0ZSgmbm9kZS0+ZG9jdW1lbnQoKS5mb250U2VsZWN0b3IoKSk7CiAgICAgICAgICAgICBwYXJl
bnRSZW5kZXJlci0+c2V0U3R5bGUoV1RGTW92ZShzdHlsZSkpOwpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1RleHRBdXRvU2l6aW5nLmggYi9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvVGV4dEF1dG9TaXppbmcuaAppbmRleCA3N2FmMWVjNmRkNWRmODc1MzIyMWVlYmNiMWYw
ZmRhN2NmNjI3NTc5Li5mYjVkYmJkODljOWQ1NmYwNTY2OTAzYjZlMWZiNjFkZWNhMDk5MmVlIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaApAQCAtMjMsOCArMjMs
NyBAQAogICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCiAKLSNpZm5kZWYg
VGV4dEF1dG9TaXppbmdfaAotI2RlZmluZSBUZXh0QXV0b1NpemluZ19oCisjcHJhZ21hIG9uY2UK
IAogI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQogCkBAIC0zOCwyMiArMzcsMjMgQEAg
bmFtZXNwYWNlIFdlYkNvcmUgewogY2xhc3MgRG9jdW1lbnQ7CiBjbGFzcyBUZXh0OwogCisvLyBG
SVhNRTogV2UgY2FuIHByb2JhYmx5IGdldCByaWQgb2YgdGhpcyBjbGFzcyBlbnRpcmVseSBhbmQg
dXNlIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJTdHlsZT4gYXMga2V5CisvLyBhcyBsb25nIGFzIHdl
IHVzZSB0aGUgcmlnaHQgaGFzaCB0cmFpdHMuCiBjbGFzcyBUZXh0QXV0b1NpemluZ0tleSB7CiBw
dWJsaWM6CiAgICAgVGV4dEF1dG9TaXppbmdLZXkoKSA9IGRlZmF1bHQ7CiAgICAgZW51bSBEZWxl
dGVkVGFnIHsgRGVsZXRlZCB9OwogICAgIGV4cGxpY2l0IFRleHRBdXRvU2l6aW5nS2V5KERlbGV0
ZWRUYWcpOwotICAgIGV4cGxpY2l0IFRleHRBdXRvU2l6aW5nS2V5KGNvbnN0IFJlbmRlclN0eWxl
Kik7Ci0gICAgVGV4dEF1dG9TaXppbmdLZXkoVGV4dEF1dG9TaXppbmdLZXkmJikgPSBkZWZhdWx0
OworICAgIFRleHRBdXRvU2l6aW5nS2V5KGNvbnN0IFJlbmRlclN0eWxlJiwgdW5zaWduZWQgaGFz
aCk7CiAKLSAgICBUZXh0QXV0b1NpemluZ0tleSYgb3BlcmF0b3I9KFRleHRBdXRvU2l6aW5nS2V5
JiYpID0gZGVmYXVsdDsKKyAgICBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUoKSBjb25zdCB7IEFT
U0VSVCghaXNEZWxldGVkKCkpOyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQorICAgIGJvb2wgaXNE
ZWxldGVkKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKSA9PSByZWludGVycHJldF9jYXN0
PFJlbmRlclN0eWxlKj4oLTEpOyB9CiAKLSAgICBjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUoKSBj
b25zdCB7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9Ci0gICAgaW5saW5lIGJvb2wgaXNEZWxldGVk
KCkgY29uc3QgeyByZXR1cm4gbV9pc0RlbGV0ZWQ7IH0KKyAgICB1bnNpZ25lZCBoYXNoKCkgY29u
c3QgeyByZXR1cm4gbV9oYXNoOyB9CiAKIHByaXZhdGU6CiAgICAgc3RkOjp1bmlxdWVfcHRyPFJl
bmRlclN0eWxlPiBtX3N0eWxlOwotICAgIGJvb2wgbV9pc0RlbGV0ZWQgeyBmYWxzZSB9OworICAg
IHVuc2lnbmVkIG1faGFzaCB7IDAgfTsKIH07CiAKIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29u
c3QgVGV4dEF1dG9TaXppbmdLZXkmIGEsIGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBiKQpAQCAt
NjIsMzMgKzYyLDYzIEBAIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVGV4dEF1dG9TaXpp
bmdLZXkmIGEsIGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBiKQogICAgICAgICByZXR1cm4gZmFs
c2U7CiAgICAgaWYgKCFhLnN0eWxlKCkgfHwgIWIuc3R5bGUoKSkKICAgICAgICAgcmV0dXJuIGEu
c3R5bGUoKSA9PSBiLnN0eWxlKCk7Ci0gICAgcmV0dXJuIGEuc3R5bGUoKS0+ZXF1YWxGb3JUZXh0
QXV0b3NpemluZyhiLnN0eWxlKCkpOworICAgIHJldHVybiBhLnN0eWxlKCktPmVxdWFsRm9yVGV4
dEF1dG9zaXppbmcoKmIuc3R5bGUoKSk7CiB9CiAKIHN0cnVjdCBUZXh0QXV0b1NpemluZ0hhc2gg
ewotICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBrZXkp
IHsgcmV0dXJuIGtleS5zdHlsZSgpLT5oYXNoRm9yVGV4dEF1dG9zaXppbmcoKTsgfQorICAgIHN0
YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBrZXkpIHsgcmV0dXJu
IGtleS5oYXNoKCk7IH0KICAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBUZXh0QXV0b1Npemlu
Z0tleSYgYSwgY29uc3QgVGV4dEF1dG9TaXppbmdLZXkmIGIpIHsgcmV0dXJuIGEgPT0gYjsgfQog
ICAgIHN0YXRpYyBjb25zdCBib29sIHNhZmVUb0NvbXBhcmVUb0VtcHR5T3JEZWxldGVkID0gdHJ1
ZTsKIH07CiAKLWNsYXNzIFRleHRBdXRvU2l6aW5nVmFsdWUgOiBwdWJsaWMgUmVmQ291bnRlZDxU
ZXh0QXV0b1NpemluZ1ZhbHVlPiB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIFJlZjxUZXh0QXV0b1Np
emluZ1ZhbHVlPiBjcmVhdGUoKQorc3RydWN0IFRleHRBdXRvU2l6aW5nVHJhaXRzIDogV1RGOjpH
ZW5lcmljSGFzaFRyYWl0czxUZXh0QXV0b1NpemluZ0tleT4geworICAgIHN0YXRpYyBjb25zdCBi
b29sIGVtcHR5VmFsdWVJc1plcm8gPSB0cnVlOworICAgIHN0YXRpYyB2b2lkIGNvbnN0cnVjdERl
bGV0ZWRWYWx1ZShUZXh0QXV0b1NpemluZ0tleSYgc2xvdCkKKyAgICB7CisgICAgICAgIG5ldyAo
Tm90TnVsbCwgJnNsb3QpIFRleHRBdXRvU2l6aW5nS2V5KFRleHRBdXRvU2l6aW5nS2V5OjpEZWxl
dGVkKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgaXNEZWxldGVkVmFsdWUoY29uc3QgVGV4dEF1
dG9TaXppbmdLZXkmIHZhbHVlKQogICAgIHsKLSAgICAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcg
VGV4dEF1dG9TaXppbmdWYWx1ZSk7CisgICAgICAgIHJldHVybiB2YWx1ZS5pc0RlbGV0ZWQoKTsK
ICAgICB9Cit9OworCitzdHJ1Y3QgVGV4dEF1dG9TaXppbmdIYXNoVHJhbnNsYXRvciB7CisgICAg
c3RhdGljIHVuc2lnbmVkIGhhc2goY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHN0eWxlLmhhc2hGb3JUZXh0QXV0b3NpemluZygpOworICAgIH0KKworICAg
IHN0YXRpYyBib29sIGVxdWFsKGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBrZXksIGNvbnN0IFJl
bmRlclN0eWxlJiBzdHlsZSkKKyAgICB7CisgICAgICAgIGlmIChrZXkuaXNEZWxldGVkKCkgfHwg
IWtleS5zdHlsZSgpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4g
a2V5LnN0eWxlKCktPmVxdWFsRm9yVGV4dEF1dG9zaXppbmcoc3R5bGUpOworICAgIH0KKworICAg
IHN0YXRpYyB2b2lkIHRyYW5zbGF0ZShUZXh0QXV0b1NpemluZ0tleSYga2V5LCBjb25zdCBSZW5k
ZXJTdHlsZSYgc3R5bGUsIHVuc2lnbmVkIGhhc2gpCisgICAgeworICAgICAgICBrZXkgPSBUZXh0
QXV0b1NpemluZ0tleShzdHlsZSwgaGFzaCk7CisgICAgfQorfTsKKworY2xhc3MgVGV4dEF1dG9T
aXppbmdWYWx1ZSB7CisgICAgV1RGX01BS0VfRkFTVF9BTExPQ0FURUQ7CitwdWJsaWM6CisgICAg
VGV4dEF1dG9TaXppbmdWYWx1ZSgpID0gZGVmYXVsdDsKKyAgICB+VGV4dEF1dG9TaXppbmdWYWx1
ZSgpOworCisgICAgdm9pZCBhZGRUZXh0Tm9kZShUZXh0JiwgZmxvYXQgc2l6ZSk7CisKKyAgICBl
bnVtIGNsYXNzIFN0aWxsSGFzTm9kZXMgeyBObywgWWVzIH07CisgICAgU3RpbGxIYXNOb2RlcyBh
ZGp1c3RUZXh0Tm9kZVNpemVzKCk7CiAKLSAgICB2b2lkIGFkZE5vZGUoVGV4dCYsIGZsb2F0IHNp
emUpOwotICAgIGJvb2wgYWRqdXN0Tm9kZVNpemVzKCk7Ci0gICAgaW50IG51bU5vZGVzKCkgY29u
c3Q7Ci0gICAgdm9pZCByZXNldCgpOwogcHJpdmF0ZToKLSAgICBUZXh0QXV0b1NpemluZ1ZhbHVl
KCkgeyB9CisgICAgdm9pZCByZXNldCgpOworCiAgICAgSGFzaFNldDxSZWZQdHI8VGV4dD4+IG1f
YXV0b1NpemVkTm9kZXM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZiAv
LyBFTkFCTEUoSU9TX1RFWFRfQVVUT1NJWklORykKLQotI2VuZGlmIC8vIFRleHRBdXRvU2l6aW5n
X2gKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHls
ZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUvUmVuZGVyU3R5bGUuY3BwCmlu
ZGV4IDFhOWIyMDA3OTgxOWQwN2FmMjAxM2E2NWFiZmE3ZGJhM2VhZTc0MzguLmI1MDFiYzY4Yjhl
ODc4MjI4YTU0YTgwZGIzZTNhNjQyMjMwMGYwMTMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3Jl
L3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHlsZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVu
ZGVyaW5nL3N0eWxlL1JlbmRlclN0eWxlLmNwcApAQCAtNDA1LDI2ICs0MDUsMjYgQEAgdW5zaWdu
ZWQgUmVuZGVyU3R5bGU6Omhhc2hGb3JUZXh0QXV0b3NpemluZygpIGNvbnN0CiAgICAgcmV0dXJu
IGhhc2g7CiB9CiAKLWJvb2wgUmVuZGVyU3R5bGU6OmVxdWFsRm9yVGV4dEF1dG9zaXppbmcoY29u
c3QgUmVuZGVyU3R5bGUqIG90aGVyKSBjb25zdAotewotICAgIHJldHVybiByYXJlTm9uSW5oZXJp
dGVkRGF0YS0+bV9hcHBlYXJhbmNlID09IG90aGVyLT5yYXJlTm9uSW5oZXJpdGVkRGF0YS0+bV9h
cHBlYXJhbmNlCi0gICAgICAgICYmIHJhcmVOb25Jbmhlcml0ZWREYXRhLT5tYXJnaW5CZWZvcmVD
b2xsYXBzZSA9PSBvdGhlci0+cmFyZU5vbkluaGVyaXRlZERhdGEtPm1hcmdpbkJlZm9yZUNvbGxh
cHNlCi0gICAgICAgICYmIHJhcmVOb25Jbmhlcml0ZWREYXRhLT5tYXJnaW5BZnRlckNvbGxhcHNl
ID09IG90aGVyLT5yYXJlTm9uSW5oZXJpdGVkRGF0YS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZQotICAg
ICAgICAmJiByYXJlTm9uSW5oZXJpdGVkRGF0YS0+bGluZUNsYW1wID09IG90aGVyLT5yYXJlTm9u
SW5oZXJpdGVkRGF0YS0+bGluZUNsYW1wCi0gICAgICAgICYmIHJhcmVJbmhlcml0ZWREYXRhLT50
ZXh0U2l6ZUFkanVzdCA9PSBvdGhlci0+cmFyZUluaGVyaXRlZERhdGEtPnRleHRTaXplQWRqdXN0
Ci0gICAgICAgICYmIHJhcmVJbmhlcml0ZWREYXRhLT5vdmVyZmxvd1dyYXAgPT0gb3RoZXItPnJh
cmVJbmhlcml0ZWREYXRhLT5vdmVyZmxvd1dyYXAKLSAgICAgICAgJiYgcmFyZUluaGVyaXRlZERh
dGEtPm5ic3BNb2RlID09IG90aGVyLT5yYXJlSW5oZXJpdGVkRGF0YS0+bmJzcE1vZGUKLSAgICAg
ICAgJiYgcmFyZUluaGVyaXRlZERhdGEtPmxpbmVCcmVhayA9PSBvdGhlci0+cmFyZUluaGVyaXRl
ZERhdGEtPmxpbmVCcmVhawotICAgICAgICAmJiByYXJlSW5oZXJpdGVkRGF0YS0+dGV4dFNlY3Vy
aXR5ID09IG90aGVyLT5yYXJlSW5oZXJpdGVkRGF0YS0+dGV4dFNlY3VyaXR5Ci0gICAgICAgICYm
IGluaGVyaXRlZC0+c3BlY2lmaWVkTGluZUhlaWdodCA9PSBvdGhlci0+aW5oZXJpdGVkLT5zcGVj
aWZpZWRMaW5lSGVpZ2h0Ci0gICAgICAgICYmIGluaGVyaXRlZC0+Zm9udENhc2NhZGUuZXF1YWxG
b3JUZXh0QXV0b1NpemluZyhvdGhlci0+aW5oZXJpdGVkLT5mb250Q2FzY2FkZSkKLSAgICAgICAg
JiYgaW5oZXJpdGVkLT5ob3Jpem9udGFsX2JvcmRlcl9zcGFjaW5nID09IG90aGVyLT5pbmhlcml0
ZWQtPmhvcml6b250YWxfYm9yZGVyX3NwYWNpbmcKLSAgICAgICAgJiYgaW5oZXJpdGVkLT52ZXJ0
aWNhbF9ib3JkZXJfc3BhY2luZyA9PSBvdGhlci0+aW5oZXJpdGVkLT52ZXJ0aWNhbF9ib3JkZXJf
c3BhY2luZwotICAgICAgICAmJiBpbmhlcml0ZWRfZmxhZ3MuX2JveF9kaXJlY3Rpb24gPT0gb3Ro
ZXItPmluaGVyaXRlZF9mbGFncy5fYm94X2RpcmVjdGlvbgotICAgICAgICAmJiBpbmhlcml0ZWRf
ZmxhZ3MubV9ydGxPcmRlcmluZyA9PSBvdGhlci0+aW5oZXJpdGVkX2ZsYWdzLm1fcnRsT3JkZXJp
bmcKLSAgICAgICAgJiYgbm9uaW5oZXJpdGVkX2ZsYWdzLnBvc2l0aW9uKCkgPT0gb3RoZXItPm5v
bmluaGVyaXRlZF9mbGFncy5wb3NpdGlvbigpCi0gICAgICAgICYmIG5vbmluaGVyaXRlZF9mbGFn
cy5mbG9hdGluZygpID09IG90aGVyLT5ub25pbmhlcml0ZWRfZmxhZ3MuZmxvYXRpbmcoKQotICAg
ICAgICAmJiByYXJlTm9uSW5oZXJpdGVkRGF0YS0+dGV4dE92ZXJmbG93ID09IG90aGVyLT5yYXJl
Tm9uSW5oZXJpdGVkRGF0YS0+dGV4dE92ZXJmbG93OworYm9vbCBSZW5kZXJTdHlsZTo6ZXF1YWxG
b3JUZXh0QXV0b3NpemluZyhjb25zdCBSZW5kZXJTdHlsZSYgb3RoZXIpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHJhcmVOb25Jbmhlcml0ZWREYXRhLT5tX2FwcGVhcmFuY2UgPT0gb3RoZXIucmFyZU5v
bkluaGVyaXRlZERhdGEtPm1fYXBwZWFyYW5jZQorICAgICAgICAmJiByYXJlTm9uSW5oZXJpdGVk
RGF0YS0+bWFyZ2luQmVmb3JlQ29sbGFwc2UgPT0gb3RoZXIucmFyZU5vbkluaGVyaXRlZERhdGEt
Pm1hcmdpbkJlZm9yZUNvbGxhcHNlCisgICAgICAgICYmIHJhcmVOb25Jbmhlcml0ZWREYXRhLT5t
YXJnaW5BZnRlckNvbGxhcHNlID09IG90aGVyLnJhcmVOb25Jbmhlcml0ZWREYXRhLT5tYXJnaW5B
ZnRlckNvbGxhcHNlCisgICAgICAgICYmIHJhcmVOb25Jbmhlcml0ZWREYXRhLT5saW5lQ2xhbXAg
PT0gb3RoZXIucmFyZU5vbkluaGVyaXRlZERhdGEtPmxpbmVDbGFtcAorICAgICAgICAmJiByYXJl
SW5oZXJpdGVkRGF0YS0+dGV4dFNpemVBZGp1c3QgPT0gb3RoZXIucmFyZUluaGVyaXRlZERhdGEt
PnRleHRTaXplQWRqdXN0CisgICAgICAgICYmIHJhcmVJbmhlcml0ZWREYXRhLT5vdmVyZmxvd1dy
YXAgPT0gb3RoZXIucmFyZUluaGVyaXRlZERhdGEtPm92ZXJmbG93V3JhcAorICAgICAgICAmJiBy
YXJlSW5oZXJpdGVkRGF0YS0+bmJzcE1vZGUgPT0gb3RoZXIucmFyZUluaGVyaXRlZERhdGEtPm5i
c3BNb2RlCisgICAgICAgICYmIHJhcmVJbmhlcml0ZWREYXRhLT5saW5lQnJlYWsgPT0gb3RoZXIu
cmFyZUluaGVyaXRlZERhdGEtPmxpbmVCcmVhaworICAgICAgICAmJiByYXJlSW5oZXJpdGVkRGF0
YS0+dGV4dFNlY3VyaXR5ID09IG90aGVyLnJhcmVJbmhlcml0ZWREYXRhLT50ZXh0U2VjdXJpdHkK
KyAgICAgICAgJiYgaW5oZXJpdGVkLT5zcGVjaWZpZWRMaW5lSGVpZ2h0ID09IG90aGVyLmluaGVy
aXRlZC0+c3BlY2lmaWVkTGluZUhlaWdodAorICAgICAgICAmJiBpbmhlcml0ZWQtPmZvbnRDYXNj
YWRlLmVxdWFsRm9yVGV4dEF1dG9TaXppbmcob3RoZXIuaW5oZXJpdGVkLT5mb250Q2FzY2FkZSkK
KyAgICAgICAgJiYgaW5oZXJpdGVkLT5ob3Jpem9udGFsX2JvcmRlcl9zcGFjaW5nID09IG90aGVy
LmluaGVyaXRlZC0+aG9yaXpvbnRhbF9ib3JkZXJfc3BhY2luZworICAgICAgICAmJiBpbmhlcml0
ZWQtPnZlcnRpY2FsX2JvcmRlcl9zcGFjaW5nID09IG90aGVyLmluaGVyaXRlZC0+dmVydGljYWxf
Ym9yZGVyX3NwYWNpbmcKKyAgICAgICAgJiYgaW5oZXJpdGVkX2ZsYWdzLl9ib3hfZGlyZWN0aW9u
ID09IG90aGVyLmluaGVyaXRlZF9mbGFncy5fYm94X2RpcmVjdGlvbgorICAgICAgICAmJiBpbmhl
cml0ZWRfZmxhZ3MubV9ydGxPcmRlcmluZyA9PSBvdGhlci5pbmhlcml0ZWRfZmxhZ3MubV9ydGxP
cmRlcmluZworICAgICAgICAmJiBub25pbmhlcml0ZWRfZmxhZ3MucG9zaXRpb24oKSA9PSBvdGhl
ci5ub25pbmhlcml0ZWRfZmxhZ3MucG9zaXRpb24oKQorICAgICAgICAmJiBub25pbmhlcml0ZWRf
ZmxhZ3MuZmxvYXRpbmcoKSA9PSBvdGhlci5ub25pbmhlcml0ZWRfZmxhZ3MuZmxvYXRpbmcoKQor
ICAgICAgICAmJiByYXJlTm9uSW5oZXJpdGVkRGF0YS0+dGV4dE92ZXJmbG93ID09IG90aGVyLnJh
cmVOb25Jbmhlcml0ZWREYXRhLT50ZXh0T3ZlcmZsb3c7CiB9CiAKICNlbmRpZiAvLyBFTkFCTEUo
SU9TX1RFWFRfQVVUT1NJWklORykKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9zdHlsZS9SZW5kZXJTdHlsZS5oIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlL1Jl
bmRlclN0eWxlLmgKaW5kZXggNzRhNDVkOGFlZDFiY2U3M2Y4ODZmYTgxZTM5ZDFkOTE0NWI1ZDNh
My4uZjAyMjM3ODk3ZWNjZjY1ZTU1M2YxODk2ZmYwZWQwNTQzMjkwYjYxZSAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlL1JlbmRlclN0eWxlLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlL1JlbmRlclN0eWxlLmgKQEAgLTE4NjIsNyArMTg2Miw3
IEBAIHB1YmxpYzoKIAogI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQogICAgIHVpbnQz
Ml90IGhhc2hGb3JUZXh0QXV0b3NpemluZygpIGNvbnN0OwotICAgIGJvb2wgZXF1YWxGb3JUZXh0
QXV0b3NpemluZyhjb25zdCBSZW5kZXJTdHlsZSAqb3RoZXIpIGNvbnN0OworICAgIGJvb2wgZXF1
YWxGb3JUZXh0QXV0b3NpemluZyhjb25zdCBSZW5kZXJTdHlsZSYpIGNvbnN0OwogI2VuZGlmCiAK
ICAgICBTdHlsZURpZmZlcmVuY2UgZGlmZihjb25zdCBSZW5kZXJTdHlsZSYsIHVuc2lnbmVkJiBj
aGFuZ2VkQ29udGV4dFNlbnNpdGl2ZVByb3BlcnRpZXMpIGNvbnN0Owo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>280175</attachid>
            <date>2016-05-31 13:53:03 -0700</date>
            <delta_ts>2016-05-31 15:49:44 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-158217-20160531135419.patch</filename>
            <type>text/plain</type>
            <size>26898</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjAxNDk1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzUwZjkxOGU2MTdjZDE4
ODIxNjA1OGIxNzYwNzI0MDFjODcwZDRiNi4uNWIzN2UxNGE5NjE5MzQ4OGM2ZDM2ZjljY2Y0NTE3
ZjBmMTk4YTFiZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDg3IEBACisyMDE2LTA1LTMwICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgQ2xlYW4gdXAgLyBtb2Rlcm5p
emUgaU9TIHRleHQgYXV0b3NpemluZyBjb2RlCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQu
b3JnL3Nob3dfYnVnLmNnaT9pZD0xNTgyMTcKKworICAgICAgICBSZXZpZXdlZCBieSBEYXJpbiBB
ZGxlci4KKworICAgICAgICBDbGVhbiB1cCAvIG1vZGVybml6ZSBpT1MgdGV4dCBhdXRvc2l6aW5n
IGNvZGUuCisKKyAgICAgICAgSSB0aGluayBpT1MgdGV4dCBhdXRvc2l6aW5nIGNvZGUgaXMgdG9v
IGludHJ1c2l2ZSBpbnNpZGUgdGhlIFJlbmRlclN0eWxlCisgICAgICAgIGNsYXNzIGJ1dCBJIGhh
dmUgbm90IHVwZGF0ZWQgdGhpcyBwYXJ0IG9mIHRoZSBjb2RlIHlldCB0byBsaW1pdCBwYXRjaAor
ICAgICAgICBzaXplLiBUaGlzIHBhdGNoIGZvY3VzZXMgb24gdGhlIFRleHRBdXRvU2l6aW5nLiog
YW5kIHRleHQgYXV0b3NpemluZworICAgICAgICBjb2RlIGluIHRoZSBEb2N1bWVudCBjbGFzcy4K
KworICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvajoKKyAgICAgICAg
KiBkb20vRG9jdW1lbnQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6VGV4dEF1dG9TaXppbmdUcmFp
dHM6OmNvbnN0cnVjdERlbGV0ZWRWYWx1ZSk6IERlbGV0ZWQuCisgICAgICAgIChXZWJDb3JlOjpU
ZXh0QXV0b1NpemluZ1RyYWl0czo6aXNEZWxldGVkVmFsdWUpOiBEZWxldGVkLgorICAgICAgICBN
b3ZlIFRleHRBdXRvU2l6aW5nVHJhaXRzIHRvIHRoZSBUZXh0QXV0b1NpemluZyBoZWFkZXIgdG8K
KyAgICAgICAgcHJvbW90ZSByZXVzZSBhbmQgbWFrZSB0aGUgdGV4dCBhdXRvc2l6aW5nIGNvZGUg
YSBsaXR0bGUgbGVzcworICAgICAgICBpbnRydXNpdmUuCisKKyAgICAgICAgKFdlYkNvcmU6OkRv
Y3VtZW50OjphZGRBdXRvU2l6aW5nTm9kZSk6CisgICAgICAgIC0gRHJvcCBsb2NhbCAna2V5JyB2
YXJpYWJsZSBhcyBpdCBpcyBvbmx5IHVzZWQgb25jZS4KKyAgICAgICAgLSBVc2Ugc3RkOjptYWtl
X3VuaXF1ZTw+IHRvIGNvbnN0cnVjdCB0aGUgVGV4dEF1dG9TaXppbmdWYWx1ZQorICAgICAgICAg
IGFzIGl0IGlzIG5vIGxvbmdlciByZWYtY291bnRlZC4KKworICAgICAgICAoV2ViQ29yZTo6RG9j
dW1lbnQ6OnZhbGlkYXRlQXV0b1NpemluZ05vZGVzKToKKyAgICAgICAgSXRlcmF0ZSBvdmVyIHRo
ZSB0ZXh0QXV0b3NpemVkTm9kZXMgSGFzaE1hcCBvbmx5IG9uY2UgaW5zdGVhZAorICAgICAgICBv
ZiB0d2ljZS4gVGV4dEF1dG9TaXppbmdWYWx1ZTo6YWRqdXN0VGV4dE5vZGVTaXplcygpIHdhcyB1
cGRhdGVkCisgICAgICAgIHRvIHJldHVybiBhbiBlbnVtIGNsYXNzIHNvIHdlIGtub3cgZnJvbSB0
aGF0IHZhbHVlIGlmIHdlIGNhbgorICAgICAgICByZW1vdmUgdGhlIHZhbHVlIGZyb20gdGhlIEhh
c2hTZXQgb3Igbm90LCB3aXRob3V0IGhhdmluZyB0byByZWx5CisgICAgICAgIG9uIFRleHRBdXRv
U2l6aW5nVmFsdWU6Om51bU5vZGVzKCksIHdoaWNoIEkgcmVtb3ZlZCBpbiB0aGlzCisgICAgICAg
IHBhdGNoLgorCisgICAgICAgIChXZWJDb3JlOjpEb2N1bWVudDo6Y2xlYXJBdXRvU2l6aW5nTm9k
ZXMpOgorICAgICAgICBVcGRhdGVkIHRoZSBUZXh0QXV0b1NpemluZ1ZhbHVlIGRlc3RydWN0b3Ig
dG8gY2FsbCByZXNldCgpIHNvCisgICAgICAgIHdlIGRvbid0IGhhdmUgdG8gZXhwbGljaXRseSBj
YWxsIHJlc2V0KCkgb24gZWFjaCB2YWx1ZSBiZWZvcmUKKyAgICAgICAgY2xlYXJpbmcgdGhlIHRl
eHRBdXRvc2l6ZWROb2RlcyBIYXNoTWFwLgorCisgICAgICAgICogZG9tL0RvY3VtZW50Lmg6Cisg
ICAgICAgIC0gTW92ZSBUZXh0QXV0b1NpemluZ1RyYWl0cyB0byB0aGUgVGV4dEF1dG9zaXppbmcg
aGVhZGVyLgorICAgICAgICAtIFJlbmFtZSByZXNldEF1dG9zaXppbmdOb2RlcygpIHRvIGNsZWFy
QXV0b1NpemluZ05vZGVzKCkgYXMKKyAgICAgICAgICB0aGUgbWV0aG9kIG5vdyBvbmx5IGNsZWFy
cyB0aGUgdGV4dEF1dG9zaXplZE5vZGVzIEhhc2hNYXAKKyAgICAgICAgICBhbmQgcmVzZXQoKSBp
cyBub3cgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIGZvcgorICAgICAgICAgIFRleHRBdXRvU2l6
aW5nVmFsdWUuCisKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyRWxlbWVudC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpSZW5kZXJFbGVtZW50OjpyZXNldFRleHRBdXRvc2l6aW5nKToKKyAgICAg
ICAgQ2FsbCBjbGVhckF1dG9TaXppbmdOb2RlcygpIGFzIGl0IHdhcyByZW5hbWVkLgorCisgICAg
ICAgICogcmVuZGVyaW5nL1RleHRBdXRvU2l6aW5nLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlRl
eHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleSk6CisgICAgICAgIC0gVXNlIHZhbHVl
IG9mIC0xIGZvciBzdGQ6OnVuaXF1ZV9wdHIgbV9zdHlsZSBtZW1iZXIgZm9yIGRpc3Rpbmd1aXNo
aW5nCisgICAgICAgIGEgSGFzaFRhYmxlIGRlbGV0ZWQgdmFsdWUsIGluc3RlYWQgb2YgaGF2aW5n
IGFuIGV4dHJhIG1faXNEZWxldGVkCisgICAgICAgIGRhdGEgbWVtYmVyIGZvciB0aGlzIHB1cnBv
c2UuCisgICAgICAgIC0gVGFrZSBSZW5kZXJTdHlsZSBwYXJhbWV0ZXIgYnkgcmVmZXJlbmNlIGFu
ZCBkcm9wIHRoZSBudWxsIGNoZWNrIGFzIHRoZQorICAgICAgICAgIGNhbGwgc2l0ZSBjYW4gbmV2
ZXIgcGFzcyBudWxscHRyLgorCisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ1ZhbHVl
OjphZGRUZXh0Tm9kZSk6CisgICAgICAgIC0gUmVuYW1lIGFkZE5vZGUoKSB0byBhZGRUZXh0Tm9k
ZSgpIGZvciBjbGFyaXR5LgorCisgICAgICAgIChXZWJDb3JlOjpUZXh0QXV0b1NpemluZ1ZhbHVl
Ojp+VGV4dEF1dG9TaXppbmdWYWx1ZSk6CisgICAgICAgIFVwZGF0ZSBkZXN0cnVjdG9yIHRvIGNh
bGwgcmVzZXQoKSBzbyB0aGF0IHRoZSBEb2N1bWVudCBkb2VzIG5vdCBoYXZlIHRvCisgICAgICAg
IGNhbGwgaXQgZXhwbGljaXRseSBhbmQgY2FuIGluc3RlYWQganVzdCBjbGVhciB0aGUgSGFzaE1h
cCwgd2hpY2ggd2lsbAorICAgICAgICBkZXN0cm95IHRoZSBUZXh0QXV0b1NpemluZ1ZhbHVlIG9i
amVjdHMuCisKKyAgICAgICAgKFdlYkNvcmU6OlRleHRBdXRvU2l6aW5nVmFsdWU6OnJlc2V0KToK
KyAgICAgICAgUmVuYW1lIHRleHQgdG8gcmVuZGVyZXIgZm9yIGNsYXJpdHkuCisKKyAgICAgICAg
KiByZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaDoKKyAgICAgICAgLSBNYWtlIFRleHRBdXRvU2l6
aW5nVmFsdWUgYXMgZmFzdCBhbGxvY2F0ZWQuCisgICAgICAgIC0gVXBkYXRlIFRleHRBdXRvU2l6
aW5nVmFsdWUgdG8gbm8gbG9uZ2VyIGJlIHJlZmNvdW50ZWQgYXMgb3duZXJzaGlwIGlzIG5ldmVy
CisgICAgICAgICAgc2hhcmVkLiBUaGUgRG9jdW1lbnQgb3ducyB0aG9zZS4KKyAgICAgICAgLSBE
cm9wIHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBUZXh0QXV0b1NpemluZ1ZhbHVlIGFuZCBtYWtl
IHRoZSBjb25zdHJ1Y3RvcgorICAgICAgICAgIHB1YmxpYyBub3cgdGhhdCB0aGUgY2xhc3MgaXMg
bm8gbG9uZ2VyIHJlZmNvdW50ZWQuCisgICAgICAgIC0gTWFrZSByZXNldCgpIG1ldGhvZCBwcml2
YXRlIG5vdyB0aGF0IGl0IGlzIGNhbGxlZCBmcm9tIHRoZSBkZXN0cnVjdG9yIGFuZAorICAgICAg
ICAgIHRoZSBEb2N1bWVudCBpcyBubyBsb25nZXIgZXhwZWN0ZWQgdG8gZXhwbGljaXRseSBjYWxs
IGl0LgorICAgICAgICAtIFVwZGF0ZSBhZGp1c3RUZXh0Tm9kZVNpemVzKCkgdG8gcmV0dXJuIGEg
U3RpbGxIYXNOb2RlcyBlbnVtIGNsYXNzIGFuZCB0aGUKKyAgICAgICAgICBEb2N1bWVudCBjYW4g
cmVseSBvbiB0aGUgZGV0ZXJtaW5lIGlmIGl0IGNhbiBkcm9wIHRoZSBUZXh0QXV0b1NpemluZ1Zh
bHVlCisgICAgICAgICAgZnJvbSBpdHMgSGFzaE1hcCAoYW5kIHRoZXJlZm9yZSBkZXN0cm95IHRo
ZSBvYmplY3QpLgorICAgICAgICAtIERyb3AgbnVtTm9kZXMoKSBtZXRob2QgYXMgaXQgaXMgbm8g
bG9uZ2VyIG5lZWRlZC4KKworCiAyMDE2LTA1LTI4ICBDaHJpcyBEdW1leiAgPGNkdW1lekBhcHBs
ZS5jb20+CiAKICAgICAgICAgVGVtcGxhdGl6ZSBOb25jb3B5YWJsZUZ1bmN0aW9uIGNsYXNzIHNp
bWlsYXJseSB0byBzdGQ6OmZ1bmN0aW9uCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJD
b3JlLnhjb2RlcHJvai9wcm9qZWN0LnBieHByb2ogYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLnhj
b2RlcHJvai9wcm9qZWN0LnBieHByb2oKaW5kZXggZjI5YTQ0YjQyM2Y0ZmJhZmRlYTI5OTI3ZjA4
YzZmMGMwMGJiZjYyMi4uOWFkNmQ1Y2JlNGE2ZjVhMjFjNjY4Yzk0Y2M3OTgwZWQ1ODQ3OGU1MiAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS54Y29kZXByb2ovcHJvamVjdC5wYnhw
cm9qCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agpAQCAtNDc0LDcgKzQ3NCw3IEBACiAJCTBGNTREQ0UxMTg4MEY5MDEwMDNFRURCQiAvKiBET01H
ZXN0dXJlRXZlbnQubW0gaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVS
ZWYgPSAwRjU0RENERTE4ODBGOTAxMDAzRUVEQkIgLyogRE9NR2VzdHVyZUV2ZW50Lm1tICovOyB9
OwogCQkwRjU0RENFMjE4ODBGOTAxMDAzRUVEQkIgLyogRE9NR2VzdHVyZUV2ZW50SW50ZXJuYWwu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBGNTREQ0RG
MTg4MEY5MDEwMDNFRURCQiAvKiBET01HZXN0dXJlRXZlbnRJbnRlcm5hbC5oICovOyB9OwogCQkw
RjU0RENFNTE4ODEwNTFEMDAzRUVEQkIgLyogVGV4dEF1dG9TaXppbmcuY3BwIGluIFNvdXJjZXMg
Ki8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1NERDRTMxODgxMDUxRDAwM0VF
REJCIC8qIFRleHRBdXRvU2l6aW5nLmNwcCAqLzsgfTsKLQkJMEY1NERDRTYxODgxMDUxRDAwM0VF
REJCIC8qIFRleHRBdXRvU2l6aW5nLmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAwRjU0RENFNDE4ODEwNTFEMDAzRUVEQkIgLyogVGV4dEF1dG9TaXppbmcu
aCAqLzsgfTsKKwkJMEY1NERDRTYxODgxMDUxRDAwM0VFREJCIC8qIFRleHRBdXRvU2l6aW5nLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAwRjU0RENFNDE4
ODEwNTFEMDAzRUVEQkIgLyogVGV4dEF1dG9TaXppbmcuaCAqLzsgc2V0dGluZ3MgPSB7QVRUUklC
VVRFUyA9IChQcml2YXRlLCApOyB9OyB9OwogCQkwRjU0REQwODE4ODFENUY1MDAzRUVEQkIgLyog
VG91Y2guaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDBG
NTRERDA1MTg4MUQ1RjUwMDNFRURCQiAvKiBUb3VjaC5oICovOyB9OwogCQkwRjU0REQwOTE4ODFE
NUY1MDAzRUVEQkIgLyogVG91Y2hFdmVudC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVp
bGRGaWxlOyBmaWxlUmVmID0gMEY1NEREMDYxODgxRDVGNTAwM0VFREJCIC8qIFRvdWNoRXZlbnQu
aCAqLzsgfTsKIAkJMEY1NEREMEExODgxRDVGNTAwM0VFREJCIC8qIFRvdWNoTGlzdC5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMEY1NEREMDcxODgxRDVG
NTAwM0VFREJCIC8qIFRvdWNoTGlzdC5oICovOyB9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNv
cmUvZG9tL0RvY3VtZW50LmNwcCBiL1NvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5jcHAKaW5k
ZXggNmM2YjMxYzUwN2JmNTBkNmU2NDk5YmU4ZTY2YmVmNjNhNTdlMGQxNS4uNjE2N2M3MmJiOTE5
NTE5NDUwM2NhYzA1NTI3YjkyMTVlNWU4MTU2ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUv
ZG9tL0RvY3VtZW50LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuY3BwCkBA
IC0yMjMsMTAgKzIyMyw2IEBACiAjaW5jbHVkZSAiR2VzdHVyZUV2ZW50LmgiCiAjZW5kaWYKIAot
I2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQotI2luY2x1ZGUgIlRleHRBdXRvU2l6aW5n
LmgiCi0jZW5kaWYKLQogI2lmIEVOQUJMRShNQVRITUwpCiAjaW5jbHVkZSAiTWF0aE1MRWxlbWVu
dC5oIgogI2luY2x1ZGUgIk1hdGhNTEVsZW1lbnRGYWN0b3J5LmgiCkBAIC00MjUsMTggKzQyMSw2
IEBAIHN0YXRpYyB2b2lkIHByaW50TmF2aWdhdGlvbkVycm9yTWVzc2FnZShGcmFtZSogZnJhbWUs
IGNvbnN0IFVSTCYgYWN0aXZlVVJMLCBjb25zCiAKIHVpbnQ2NF90IERvY3VtZW50OjpzX2dsb2Jh
bFRyZWVWZXJzaW9uID0gMDsKIAotI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQotdm9p
ZCBUZXh0QXV0b1NpemluZ1RyYWl0czo6Y29uc3RydWN0RGVsZXRlZFZhbHVlKFRleHRBdXRvU2l6
aW5nS2V5JiBzbG90KQotewotICAgIG5ldyAoJnNsb3QpIFRleHRBdXRvU2l6aW5nS2V5KFRleHRB
dXRvU2l6aW5nS2V5OjpEZWxldGVkKTsKLX0KLQotYm9vbCBUZXh0QXV0b1NpemluZ1RyYWl0czo6
aXNEZWxldGVkVmFsdWUoY29uc3QgVGV4dEF1dG9TaXppbmdLZXkmIHZhbHVlKQotewotICAgIHJl
dHVybiB2YWx1ZS5pc0RlbGV0ZWQoKTsKLX0KLSNlbmRpZgotCiBIYXNoU2V0PERvY3VtZW50Kj4m
IERvY3VtZW50OjphbGxEb2N1bWVudHMoKQogewogICAgIHN0YXRpYyBOZXZlckRlc3Ryb3llZDxI
YXNoU2V0PERvY3VtZW50Kj4+IGRvY3VtZW50czsKQEAgLTUyOTgsMzUgKzUyODIsMjQgQEAgSFRN
TENhbnZhc0VsZW1lbnQqIERvY3VtZW50OjpnZXRDU1NDYW52YXNFbGVtZW50KGNvbnN0IFN0cmlu
ZyYgbmFtZSkKIAogI2lmIEVOQUJMRShJT1NfVEVYVF9BVVRPU0laSU5HKQogCi12b2lkIERvY3Vt
ZW50OjphZGRBdXRvU2l6aW5nTm9kZShUZXh0JiBub2RlLCBmbG9hdCBjYW5kaWRhdGVTaXplKQor
dm9pZCBEb2N1bWVudDo6YWRkQXV0b1NpemVkTm9kZShUZXh0JiBub2RlLCBmbG9hdCBjYW5kaWRh
dGVTaXplKQogewotICAgIExPRyhUZXh0QXV0b3NpemluZywgIiBhZGRBdXRvU2l6aW5nTm9kZSAl
cCBjYW5kaWRhdGVTaXplPSVmIiwgJm5vZGUsIGNhbmRpZGF0ZVNpemUpOwotCi0gICAgVGV4dEF1
dG9TaXppbmdLZXkga2V5KCZub2RlLnJlbmRlcmVyKCktPnN0eWxlKCkpOwotICAgIGF1dG8gYWRk
UmVzdWx0ID0gbV90ZXh0QXV0b1NpemVkTm9kZXMuZW5zdXJlKFdURk1vdmUoa2V5KSwgW10gewot
ICAgICAgICByZXR1cm4gVGV4dEF1dG9TaXppbmdWYWx1ZTo6Y3JlYXRlKCk7Ci0gICAgfSk7Ci0g
ICAgYWRkUmVzdWx0Lml0ZXJhdG9yLT52YWx1ZS0+YWRkTm9kZShub2RlLCBjYW5kaWRhdGVTaXpl
KTsKKyAgICBMT0coVGV4dEF1dG9zaXppbmcsICIgYWRkQXV0b1NpemVkTm9kZSAlcCBjYW5kaWRh
dGVTaXplPSVmIiwgJm5vZGUsIGNhbmRpZGF0ZVNpemUpOworICAgIGF1dG8gYWRkUmVzdWx0ID0g
bV90ZXh0QXV0b1NpemVkTm9kZXMuYWRkPFRleHRBdXRvU2l6aW5nSGFzaFRyYW5zbGF0b3I+KG5v
ZGUucmVuZGVyZXIoKS0+c3R5bGUoKSwgbnVsbHB0cik7CisgICAgaWYgKGFkZFJlc3VsdC5pc05l
d0VudHJ5KQorICAgICAgICBhZGRSZXN1bHQuaXRlcmF0b3ItPnZhbHVlID0gc3RkOjptYWtlX3Vu
aXF1ZTxUZXh0QXV0b1NpemluZ1ZhbHVlPigpOworICAgIGFkZFJlc3VsdC5pdGVyYXRvci0+dmFs
dWUtPmFkZFRleHROb2RlKG5vZGUsIGNhbmRpZGF0ZVNpemUpOwogfQogCi12b2lkIERvY3VtZW50
Ojp2YWxpZGF0ZUF1dG9TaXppbmdOb2RlcygpCit2b2lkIERvY3VtZW50Ojp1cGRhdGVBdXRvU2l6
ZWROb2RlcygpCiB7Ci0gICAgVmVjdG9yPFRleHRBdXRvU2l6aW5nS2V5PiBub2Rlc0ZvclJlbW92
YWw7Ci0gICAgZm9yIChhdXRvJiBrZXlWYWx1ZVBhaXIgOiBtX3RleHRBdXRvU2l6ZWROb2Rlcykg
ewotICAgICAgICBUZXh0QXV0b1NpemluZ1ZhbHVlKiB2YWx1ZSA9IGtleVZhbHVlUGFpci52YWx1
ZS5nZXQoKTsKLSAgICAgICAgLy8gVXBkYXRlIGFsbCB0aGUgbm9kZXMgaW4gdGhlIGNvbGxlY3Rp
b24gdG8gcmVmbGVjdCB0aGUgbmV3Ci0gICAgICAgIC8vIGNhbmRpZGF0ZSBzaXplLgotICAgICAg
ICB2YWx1ZS0+YWRqdXN0Tm9kZVNpemVzKCk7Ci0gICAgfQogICAgIG1fdGV4dEF1dG9TaXplZE5v
ZGVzLnJlbW92ZUlmKFtdKGF1dG8mIGtleUFuZFZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAha2V5
QW5kVmFsdWUudmFsdWUtPm51bU5vZGVzKCk7CisgICAgICAgIHJldHVybiBrZXlBbmRWYWx1ZS52
YWx1ZS0+YWRqdXN0VGV4dE5vZGVTaXplcygpID09IFRleHRBdXRvU2l6aW5nVmFsdWU6OlN0aWxs
SGFzTm9kZXM6Ok5vOwogICAgIH0pOwogfQogICAgIAotdm9pZCBEb2N1bWVudDo6cmVzZXRBdXRv
U2l6aW5nTm9kZXMoKQordm9pZCBEb2N1bWVudDo6Y2xlYXJBdXRvU2l6ZWROb2RlcygpCiB7Ci0g
ICAgZm9yIChhdXRvJiB2YWx1ZSA6IG1fdGV4dEF1dG9TaXplZE5vZGVzLnZhbHVlcygpKQotICAg
ICAgICB2YWx1ZS0+cmVzZXQoKTsKICAgICBtX3RleHRBdXRvU2l6ZWROb2Rlcy5jbGVhcigpOwog
fQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9kb20vRG9jdW1lbnQuaCBiL1NvdXJjZS9X
ZWJDb3JlL2RvbS9Eb2N1bWVudC5oCmluZGV4IDY1ODE5ZGZkM2I0ODFkNGQ3NDM3NDQ1YWQxYzlm
YTRiNTdlZjJhOGEuLmMwMGVhY2Q4ODc3YjczNGFjNDUzMWUxOWUxMjhkYzJmMzE4MTY5ZDMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2RvbS9Eb2N1bWVudC5oCisrKyBiL1NvdXJjZS9XZWJD
b3JlL2RvbS9Eb2N1bWVudC5oCkBAIC00Niw2ICs0Niw3IEBACiAjaW5jbHVkZSAiU3RyaW5nV2l0
aERpcmVjdGlvbi5oIgogI2luY2x1ZGUgIlN0eWxlQ2hhbmdlLmgiCiAjaW5jbHVkZSAiU3VwcGxl
bWVudGFibGUuaCIKKyNpbmNsdWRlICJUZXh0QXV0b1NpemluZy5oIgogI2luY2x1ZGUgIlRleHRS
ZXNvdXJjZURlY29kZXIuaCIKICNpbmNsdWRlICJUaW1lci5oIgogI2luY2x1ZGUgIlRyZWVTY29w
ZS5oIgpAQCAtMjEyLDEyICsyMTMsNiBAQCBjbGFzcyBEZXZpY2VPcmllbnRhdGlvbkNvbnRyb2xs
ZXI7CiBzdHJ1Y3QgVGV4dEF1dG9TaXppbmdIYXNoOwogY2xhc3MgVGV4dEF1dG9TaXppbmdLZXk7
CiBjbGFzcyBUZXh0QXV0b1NpemluZ1ZhbHVlOwotCi1zdHJ1Y3QgVGV4dEF1dG9TaXppbmdUcmFp
dHMgOiBXVEY6OkdlbmVyaWNIYXNoVHJhaXRzPFRleHRBdXRvU2l6aW5nS2V5PiB7Ci0gICAgc3Rh
dGljIGNvbnN0IGJvb2wgZW1wdHlWYWx1ZUlzWmVybyA9IHRydWU7Ci0gICAgc3RhdGljIHZvaWQg
Y29uc3RydWN0RGVsZXRlZFZhbHVlKFRleHRBdXRvU2l6aW5nS2V5JiBzbG90KTsKLSAgICBzdGF0
aWMgYm9vbCBpc0RlbGV0ZWRWYWx1ZShjb25zdCBUZXh0QXV0b1NpemluZ0tleSYgdmFsdWUpOwot
fTsKICNlbmRpZgogCiAjaWYgRU5BQkxFKE1FRElBX1NFU1NJT04pCkBAIC0xNjk0LDEyICsxNjg5
LDEyIEBAIHByaXZhdGU6CiAKICNpZiBFTkFCTEUoSU9TX1RFWFRfQVVUT1NJWklORykKIHB1Ymxp
YzoKLSAgICB2b2lkIGFkZEF1dG9TaXppbmdOb2RlKFRleHQmLCBmbG9hdCBzaXplKTsKLSAgICB2
b2lkIHZhbGlkYXRlQXV0b1NpemluZ05vZGVzKCk7Ci0gICAgdm9pZCByZXNldEF1dG9TaXppbmdO
b2RlcygpOworICAgIHZvaWQgYWRkQXV0b1NpemVkTm9kZShUZXh0JiwgZmxvYXQgc2l6ZSk7Cisg
ICAgdm9pZCB1cGRhdGVBdXRvU2l6ZWROb2RlcygpOworICAgIHZvaWQgY2xlYXJBdXRvU2l6ZWRO
b2RlcygpOwogCiBwcml2YXRlOgotICAgIHR5cGVkZWYgSGFzaE1hcDxUZXh0QXV0b1NpemluZ0tl
eSwgUmVmUHRyPFRleHRBdXRvU2l6aW5nVmFsdWU+LCBUZXh0QXV0b1NpemluZ0hhc2gsIFRleHRB
dXRvU2l6aW5nVHJhaXRzPiBUZXh0QXV0b1NpemluZ01hcDsKKyAgICB1c2luZyBUZXh0QXV0b1Np
emluZ01hcCA9IEhhc2hNYXA8VGV4dEF1dG9TaXppbmdLZXksIHN0ZDo6dW5pcXVlX3B0cjxUZXh0
QXV0b1NpemluZ1ZhbHVlPiwgVGV4dEF1dG9TaXppbmdIYXNoLCBUZXh0QXV0b1NpemluZ1RyYWl0
cz47CiAgICAgVGV4dEF1dG9TaXppbmdNYXAgbV90ZXh0QXV0b1NpemVkTm9kZXM7CiAjZW5kaWYK
IApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrRmxvdy5j
cHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyQmxvY2tGbG93LmNwcAppbmRleCA1
ZDdlY2RhMzQzNzA3NDE0ODI3ZTYwZTc0ZGE2NzQ4NmRkNmYyZTRjLi45YjhkNzIwMjU1YzYzNDI2
ZjJjZDViOThlYzVmOTRlNzFiNWE2YTMyIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyQmxvY2tGbG93LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcv
UmVuZGVyQmxvY2tGbG93LmNwcApAQCAtMzgxNyw3ICszODE3LDcgQEAgdm9pZCBSZW5kZXJCbG9j
a0Zsb3c6OmFkanVzdENvbXB1dGVkRm9udFNpemVzKGZsb2F0IHNpemUsIGZsb2F0IHZpc2libGVX
aWR0aCkKICAgICAgICAgICAgIGZsb2F0IGxpbmVUZXh0TXVsdGlwbGllciA9IGxpbmVDb3VudCA9
PSBPTkVfTElORSA/IG9uZUxpbmVUZXh0TXVsdGlwbGllcihzcGVjaWZpZWRTaXplKSA6IHRleHRN
dWx0aXBsaWVyKHNwZWNpZmllZFNpemUpOwogICAgICAgICAgICAgZmxvYXQgY2FuZGlkYXRlTmV3
U2l6ZSA9IHJvdW5kZihzdGQ6Om1pbihtaW5Gb250U2l6ZSwgc3BlY2lmaWVkU2l6ZSAqIGxpbmVU
ZXh0TXVsdGlwbGllcikpOwogICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZU5ld1NpemUgPiBzcGVj
aWZpZWRTaXplICYmIGNhbmRpZGF0ZU5ld1NpemUgIT0gZm9udERlc2NyaXB0aW9uLmNvbXB1dGVk
U2l6ZSgpICYmIHRleHQudGV4dE5vZGUoKSAmJiBvbGRTdHlsZS50ZXh0U2l6ZUFkanVzdCgpLmlz
QXV0bygpKQotICAgICAgICAgICAgICAgIGRvY3VtZW50KCkuYWRkQXV0b1NpemluZ05vZGUoKnRl
eHQudGV4dE5vZGUoKSwgY2FuZGlkYXRlTmV3U2l6ZSk7CisgICAgICAgICAgICAgICAgZG9jdW1l
bnQoKS5hZGRBdXRvU2l6ZWROb2RlKCp0ZXh0LnRleHROb2RlKCksIGNhbmRpZGF0ZU5ld1NpemUp
OwogICAgICAgICB9CiAKICAgICAgICAgZGVzY2VuZGFudCA9IFJlbmRlck9iamVjdFRyYXZlcnNh
bDo6bmV4dFNraXBwaW5nQ2hpbGRyZW4odGV4dCwgdGhpcyk7CmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyRWxlbWVudC5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyRWxlbWVudC5jcHAKaW5kZXggM2VjM2ZkMjk4NzgxNTg5ZThjNmQzYzljZDg0
NjJjNjI4YmM3MzczOC4uMTQ1NmMxOTVlYjM4NmY3ZDE4MjI5MDMyNThiZWVlNTc4M2Q4YzFlMCAx
MDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckVsZW1lbnQuY3BwCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJFbGVtZW50LmNwcApAQCAtMjIxNCw3
ICsyMjE0LDcgQEAgdm9pZCBSZW5kZXJFbGVtZW50OjphZGp1c3RDb21wdXRlZEZvbnRTaXplc09u
QmxvY2tzKGZsb2F0IHNpemUsIGZsb2F0IHZpc2libGVXaWQKICAgICB9CiAKICAgICAvLyBSZW1v
dmUgc3R5bGUgZnJvbSBhdXRvLXNpemluZyB0YWJsZSB0aGF0IGFyZSBubyBsb25nZXIgdmFsaWQu
Ci0gICAgZG9jdW1lbnQtPnZhbGlkYXRlQXV0b1NpemluZ05vZGVzKCk7CisgICAgZG9jdW1lbnQt
PnVwZGF0ZUF1dG9TaXplZE5vZGVzKCk7CiB9CiAKIHZvaWQgUmVuZGVyRWxlbWVudDo6cmVzZXRU
ZXh0QXV0b3NpemluZygpCkBAIC0yMjI1LDcgKzIyMjUsNyBAQCB2b2lkIFJlbmRlckVsZW1lbnQ6
OnJlc2V0VGV4dEF1dG9zaXppbmcoKQogCiAgICAgTE9HKFRleHRBdXRvc2l6aW5nLCAiUmVuZGVy
RWxlbWVudDo6cmVzZXRUZXh0QXV0b3NpemluZygpIik7CiAKLSAgICBkb2N1bWVudC0+cmVzZXRB
dXRvU2l6aW5nTm9kZXMoKTsKKyAgICBkb2N1bWVudC0+Y2xlYXJBdXRvU2l6ZWROb2RlcygpOwog
CiAgICAgVmVjdG9yPGludD4gZGVwdGhTdGFjazsKICAgICBpbnQgY3VycmVudERlcHRoID0gMDsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1NpemluZy5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuY3BwCmluZGV4IDNiZGQ3
YWI4ZGI2NTQyZmRhY2M0OWM0MjYyYzA2OWViODRmZmI3NTEuLjdiZDZkZTg4OGUzMzg3NDYwMjRm
YjEyNjQ3MGY1Nzk5MzlhYTViOGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9UZXh0QXV0b1NpemluZy5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL1RleHRB
dXRvU2l6aW5nLmNwcApAQCAtNDgsNzkgKzQ4LDcxIEBAIHN0YXRpYyBSZW5kZXJTdHlsZSBjbG9u
ZVJlbmRlclN0eWxlV2l0aFN0YXRlKGNvbnN0IFJlbmRlclN0eWxlJiBjdXJyZW50U3R5bGUpCiB9
CiAKIFRleHRBdXRvU2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleShEZWxldGVkVGFnKQotICAg
IDogbV9pc0RlbGV0ZWQodHJ1ZSkKIHsKKyAgICBIYXNoVHJhaXRzPHN0ZDo6dW5pcXVlX3B0cjxS
ZW5kZXJTdHlsZT4+Ojpjb25zdHJ1Y3REZWxldGVkVmFsdWUobV9zdHlsZSk7CiB9CiAKLVRleHRB
dXRvU2l6aW5nS2V5OjpUZXh0QXV0b1NpemluZ0tleShjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUp
Ci0gICAgOiBtX3N0eWxlKHN0eWxlID8gUmVuZGVyU3R5bGU6OmNsb25lUHRyKCpzdHlsZSkgOiBu
dWxscHRyKQorVGV4dEF1dG9TaXppbmdLZXk6OlRleHRBdXRvU2l6aW5nS2V5KGNvbnN0IFJlbmRl
clN0eWxlJiBzdHlsZSwgdW5zaWduZWQgaGFzaCkKKyAgICA6IG1fc3R5bGUoUmVuZGVyU3R5bGU6
OmNsb25lUHRyKHN0eWxlKSkgLy8gRklYTUU6IFRoaXMgc2VlbXMgdmVyeSBpbmVmZmljaWVudC4K
KyAgICAsIG1faGFzaChoYXNoKQogewogfQogCi1pbnQgVGV4dEF1dG9TaXppbmdWYWx1ZTo6bnVt
Tm9kZXMoKSBjb25zdAotewotICAgIHJldHVybiBtX2F1dG9TaXplZE5vZGVzLnNpemUoKTsKLX0K
LQotdm9pZCBUZXh0QXV0b1NpemluZ1ZhbHVlOjphZGROb2RlKFRleHQmIG5vZGUsIGZsb2F0IHNp
emUpCit2b2lkIFRleHRBdXRvU2l6aW5nVmFsdWU6OmFkZFRleHROb2RlKFRleHQmIG5vZGUsIGZs
b2F0IHNpemUpCiB7CiAgICAgbm9kZS5yZW5kZXJlcigpLT5zZXRDYW5kaWRhdGVDb21wdXRlZFRl
eHRTaXplKHNpemUpOwogICAgIG1fYXV0b1NpemVkTm9kZXMuYWRkKCZub2RlKTsKIH0KIAotI2Rl
ZmluZSBNQVhfU0NBTEVfSU5DUkVBU0UgMS43Zgorc3RhdGljIGNvbnN0IGZsb2F0IG1heFNjYWxl
SW5jcmVhc2UgPSAxLjdmOwogCi1ib29sIFRleHRBdXRvU2l6aW5nVmFsdWU6OmFkanVzdE5vZGVT
aXplcygpCithdXRvIFRleHRBdXRvU2l6aW5nVmFsdWU6OmFkanVzdFRleHROb2RlU2l6ZXMoKSAt
PiBTdGlsbEhhc05vZGVzCiB7Ci0gICAgYm9vbCBkaWRSZW1vdmVPYmplY3RzID0gZmFsc2U7Ci0K
LSAgICAvLyBSZW1vdmUgc3RhbGUgbm9kZXMuICBOb2RlcyBtYXkgaGF2ZSBoYWQgdGhlaXIgcmVu
ZGVyZXJzIGRldGFjaGVkLiAgV2UnbGwKLSAgICAvLyBhbHNvIG5lZWQgdG8gcmVtb3ZlIHRoZSBz
dHlsZSBmcm9tIHRoZSBkb2N1bWVudHMgbV90ZXh0QXV0b1NpemVkTm9kZXMKLSAgICAvLyBjb2xs
ZWN0aW9uLiAgUmV0dXJuIHRydWUgaW5kaWNhdGVzIHdlIG5lZWQgdG8gZG8gdGhhdCByZW1vdmFs
LgorICAgIC8vIFJlbW92ZSBzdGFsZSBub2Rlcy4gTm9kZXMgbWF5IGhhdmUgaGFkIHRoZWlyIHJl
bmRlcmVycyBkZXRhY2hlZC4gV2UnbGwgYWxzbyBuZWVkIHRvIHJlbW92ZSB0aGUgc3R5bGUgZnJv
bSB0aGUgZG9jdW1lbnRzIG1fdGV4dEF1dG9TaXplZE5vZGVzCisgICAgLy8gY29sbGVjdGlvbi4g
UmV0dXJuIHRydWUgaW5kaWNhdGVzIHdlIG5lZWQgdG8gZG8gdGhhdCByZW1vdmFsLgogICAgIFZl
Y3RvcjxUZXh0Kj4gbm9kZXNGb3JSZW1vdmFsOwotICAgIGZvciAoYXV0byYgbm9kZSA6IG1fYXV0
b1NpemVkTm9kZXMpIHsKLSAgICAgICAgYXV0byogdGV4dCA9IG5vZGUtPnJlbmRlcmVyKCk7Ci0g
ICAgICAgIGlmICghdGV4dCB8fCAhdGV4dC0+c3R5bGUoKS50ZXh0U2l6ZUFkanVzdCgpLmlzQXV0
bygpIHx8ICF0ZXh0LT5jYW5kaWRhdGVDb21wdXRlZFRleHRTaXplKCkpIHsKLSAgICAgICAgICAg
IG5vZGVzRm9yUmVtb3ZhbC5hcHBlbmQobm9kZS5nZXQoKSk7Ci0gICAgICAgICAgICBkaWRSZW1v
dmVPYmplY3RzID0gdHJ1ZTsKLSAgICAgICAgfQorICAgIGZvciAoYXV0byYgdGV4dE5vZGUgOiBt
X2F1dG9TaXplZE5vZGVzKSB7CisgICAgICAgIGF1dG8qIHJlbmRlcmVyID0gdGV4dE5vZGUtPnJl
bmRlcmVyKCk7CisgICAgICAgIGlmICghcmVuZGVyZXIgfHwgIXJlbmRlcmVyLT5zdHlsZSgpLnRl
eHRTaXplQWRqdXN0KCkuaXNBdXRvKCkgfHwgIXJlbmRlcmVyLT5jYW5kaWRhdGVDb21wdXRlZFRl
eHRTaXplKCkpCisgICAgICAgICAgICBub2Rlc0ZvclJlbW92YWwuYXBwZW5kKHRleHROb2RlLmdl
dCgpKTsKICAgICB9CiAKICAgICBmb3IgKGF1dG8mIG5vZGUgOiBub2Rlc0ZvclJlbW92YWwpCiAg
ICAgICAgIG1fYXV0b1NpemVkTm9kZXMucmVtb3ZlKG5vZGUpOwogCi0gICAgLy8gSWYgd2Ugb25s
eSBoYXZlIG9uZSBwaWVjZSBvZiB0ZXh0IHdpdGggdGhlIHN0eWxlIG9uIHRoZSBwYWdlIGRvbid0
Ci0gICAgLy8gYWRqdXN0IGl0J3Mgc2l6ZS4KKyAgICBTdGlsbEhhc05vZGVzIHN0aWxsSGFzTm9k
ZXMgPSBtX2F1dG9TaXplZE5vZGVzLmlzRW1wdHkoKSA/IFN0aWxsSGFzTm9kZXM6Ok5vIDogU3Rp
bGxIYXNOb2Rlczo6WWVzOworCisgICAgLy8gSWYgd2Ugb25seSBoYXZlIG9uZSBwaWVjZSBvZiB0
ZXh0IHdpdGggdGhlIHN0eWxlIG9uIHRoZSBwYWdlIGRvbid0IGFkanVzdCBpdCdzIHNpemUuCiAg
ICAgaWYgKG1fYXV0b1NpemVkTm9kZXMuc2l6ZSgpIDw9IDEpCi0gICAgICAgIHJldHVybiBkaWRS
ZW1vdmVPYmplY3RzOworICAgICAgICByZXR1cm4gc3RpbGxIYXNOb2RlczsKIAotICAgIC8vIENv
bXB1dGUgYXZlcmFnZSBzaXplCisgICAgLy8gQ29tcHV0ZSBhdmVyYWdlIHNpemUuCiAgICAgZmxv
YXQgY3VtdWxhdGl2ZVNpemUgPSAwOwogICAgIGZvciAoYXV0byYgbm9kZSA6IG1fYXV0b1NpemVk
Tm9kZXMpCiAgICAgICAgIGN1bXVsYXRpdmVTaXplICs9IG5vZGUtPnJlbmRlcmVyKCktPmNhbmRp
ZGF0ZUNvbXB1dGVkVGV4dFNpemUoKTsKIAotICAgIGZsb2F0IGF2ZXJhZ2VTaXplID0gcm91bmRm
KGN1bXVsYXRpdmVTaXplIC8gbV9hdXRvU2l6ZWROb2Rlcy5zaXplKCkpOworICAgIGZsb2F0IGF2
ZXJhZ2VTaXplID0gc3RkOjpyb3VuZChjdW11bGF0aXZlU2l6ZSAvIG1fYXV0b1NpemVkTm9kZXMu
c2l6ZSgpKTsKIAotICAgIC8vIEFkanVzdCBzaXplcworICAgIC8vIEFkanVzdCBzaXplcy4KICAg
ICBib29sIGZpcnN0UGFzcyA9IHRydWU7CiAgICAgZm9yIChhdXRvJiBub2RlIDogbV9hdXRvU2l6
ZWROb2RlcykgewotICAgICAgICBhdXRvKiB0ZXh0ID0gbm9kZS0+cmVuZGVyZXIoKTsKLSAgICAg
ICAgaWYgKCF0ZXh0IHx8IHRleHQtPnN0eWxlKCkuZm9udERlc2NyaXB0aW9uKCkuY29tcHV0ZWRT
aXplKCkgPT0gYXZlcmFnZVNpemUpCisgICAgICAgIGF1dG8mIHJlbmRlcmVyID0gKm5vZGUtPnJl
bmRlcmVyKCk7CisgICAgICAgIGlmIChyZW5kZXJlci5zdHlsZSgpLmZvbnREZXNjcmlwdGlvbigp
LmNvbXB1dGVkU2l6ZSgpID09IGF2ZXJhZ2VTaXplKQogICAgICAgICAgICAgY29udGludWU7CiAK
LSAgICAgICAgZmxvYXQgc3BlY2lmaWVkU2l6ZSA9IHRleHQtPnN0eWxlKCkuZm9udERlc2NyaXB0
aW9uKCkuc3BlY2lmaWVkU2l6ZSgpOworICAgICAgICBmbG9hdCBzcGVjaWZpZWRTaXplID0gcmVu
ZGVyZXIuc3R5bGUoKS5mb250RGVzY3JpcHRpb24oKS5zcGVjaWZpZWRTaXplKCk7CiAgICAgICAg
IGZsb2F0IHNjYWxlQ2hhbmdlID0gYXZlcmFnZVNpemUgLyBzcGVjaWZpZWRTaXplOwotICAgICAg
ICBpZiAoc2NhbGVDaGFuZ2UgPiBNQVhfU0NBTEVfSU5DUkVBU0UgJiYgZmlyc3RQYXNzKSB7Cisg
ICAgICAgIGlmIChzY2FsZUNoYW5nZSA+IG1heFNjYWxlSW5jcmVhc2UgJiYgZmlyc3RQYXNzKSB7
CiAgICAgICAgICAgICBmaXJzdFBhc3MgPSBmYWxzZTsKLSAgICAgICAgICAgIGF2ZXJhZ2VTaXpl
ID0gcm91bmRmKHNwZWNpZmllZFNpemUgKiBNQVhfU0NBTEVfSU5DUkVBU0UpOworICAgICAgICAg
ICAgYXZlcmFnZVNpemUgPSBzdGQ6OnJvdW5kKHNwZWNpZmllZFNpemUgKiBtYXhTY2FsZUluY3Jl
YXNlKTsKICAgICAgICAgICAgIHNjYWxlQ2hhbmdlID0gYXZlcmFnZVNpemUgLyBzcGVjaWZpZWRT
aXplOwogICAgICAgICB9CiAKICAgICAgICAgTE9HKFRleHRBdXRvc2l6aW5nLCAiICBhZGp1c3Qg
bm9kZSBzaXplICVwIGZpcnN0UGFzcz0lZCBhdmVyYWdlU2l6ZT0lZiBzY2FsZUNoYW5nZT0lZiIs
IG5vZGUuZ2V0KCksIGZpcnN0UGFzcywgYXZlcmFnZVNpemUsIHNjYWxlQ2hhbmdlKTsKIAotICAg
ICAgICBhdXRvKiBwYXJlbnRSZW5kZXJlciA9IHRleHQtPnBhcmVudCgpOworICAgICAgICBhdXRv
KiBwYXJlbnRSZW5kZXJlciA9IHJlbmRlcmVyLnBhcmVudCgpOwogCi0gICAgICAgIGF1dG8gc3R5
bGUgPSBjbG9uZVJlbmRlclN0eWxlV2l0aFN0YXRlKHRleHQtPnN0eWxlKCkpOworICAgICAgICBh
dXRvIHN0eWxlID0gY2xvbmVSZW5kZXJTdHlsZVdpdGhTdGF0ZShyZW5kZXJlci5zdHlsZSgpKTsK
ICAgICAgICAgYXV0byBmb250RGVzY3JpcHRpb24gPSBzdHlsZS5mb250RGVzY3JpcHRpb24oKTsK
ICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShhdmVyYWdlU2l6ZSk7CiAg
ICAgICAgIHN0eWxlLnNldEZvbnREZXNjcmlwdGlvbihmb250RGVzY3JpcHRpb24pOwpAQCAtMTYx
LDI2ICsxNTMsMzEgQEAgYm9vbCBUZXh0QXV0b1NpemluZ1ZhbHVlOjphZGp1c3ROb2RlU2l6ZXMo
KQogICAgICAgICBwYXJlbnRSZW5kZXJlci0+c2V0U3R5bGUoV1RGTW92ZShuZXdQYXJlbnRTdHls
ZSkpOwogICAgIH0KIAotICAgIHJldHVybiBkaWRSZW1vdmVPYmplY3RzOworICAgIHJldHVybiBz
dGlsbEhhc05vZGVzOworfQorCitUZXh0QXV0b1NpemluZ1ZhbHVlOjp+VGV4dEF1dG9TaXppbmdW
YWx1ZSgpCit7CisgICAgcmVzZXQoKTsKIH0KIAogdm9pZCBUZXh0QXV0b1NpemluZ1ZhbHVlOjpy
ZXNldCgpCiB7CiAgICAgZm9yIChhdXRvJiBub2RlIDogbV9hdXRvU2l6ZWROb2RlcykgewotICAg
ICAgICBhdXRvKiB0ZXh0ID0gbm9kZS0+cmVuZGVyZXIoKTsKLSAgICAgICAgaWYgKCF0ZXh0KQor
ICAgICAgICBhdXRvKiByZW5kZXJlciA9IG5vZGUtPnJlbmRlcmVyKCk7CisgICAgICAgIGlmICgh
cmVuZGVyZXIpCiAgICAgICAgICAgICBjb250aW51ZTsKIAotICAgICAgICBhdXRvKiBwYXJlbnRS
ZW5kZXJlciA9IHRleHQtPnBhcmVudCgpOworICAgICAgICBhdXRvKiBwYXJlbnRSZW5kZXJlciA9
IHJlbmRlcmVyLT5wYXJlbnQoKTsKICAgICAgICAgaWYgKCFwYXJlbnRSZW5kZXJlcikKICAgICAg
ICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIC8vIFJlc2V0IHRoZSBmb250IHNpemUgYmFjayB0
byB0aGUgb3JpZ2luYWwgc3BlY2lmaWVkIHNpemUKLSAgICAgICAgYXV0byBmb250RGVzY3JpcHRp
b24gPSB0ZXh0LT5zdHlsZSgpLmZvbnREZXNjcmlwdGlvbigpOworICAgICAgICBhdXRvIGZvbnRE
ZXNjcmlwdGlvbiA9IHJlbmRlcmVyLT5zdHlsZSgpLmZvbnREZXNjcmlwdGlvbigpOwogICAgICAg
ICBmbG9hdCBvcmlnaW5hbFNpemUgPSBmb250RGVzY3JpcHRpb24uc3BlY2lmaWVkU2l6ZSgpOwog
ICAgICAgICBpZiAoZm9udERlc2NyaXB0aW9uLmNvbXB1dGVkU2l6ZSgpICE9IG9yaWdpbmFsU2l6
ZSkgewogICAgICAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldENvbXB1dGVkU2l6ZShvcmlnaW5h
bFNpemUpOwotICAgICAgICAgICAgYXV0byBzdHlsZSA9IGNsb25lUmVuZGVyU3R5bGVXaXRoU3Rh
dGUodGV4dC0+c3R5bGUoKSk7CisgICAgICAgICAgICBhdXRvIHN0eWxlID0gY2xvbmVSZW5kZXJT
dHlsZVdpdGhTdGF0ZShyZW5kZXJlci0+c3R5bGUoKSk7CiAgICAgICAgICAgICBzdHlsZS5zZXRG
b250RGVzY3JpcHRpb24oZm9udERlc2NyaXB0aW9uKTsKICAgICAgICAgICAgIHN0eWxlLmZvbnRD
YXNjYWRlKCkudXBkYXRlKCZub2RlLT5kb2N1bWVudCgpLmZvbnRTZWxlY3RvcigpKTsKICAgICAg
ICAgICAgIHBhcmVudFJlbmRlcmVyLT5zZXRTdHlsZShXVEZNb3ZlKHN0eWxlKSk7CmRpZmYgLS1n
aXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvVGV4dEF1dG9TaXppbmcuaCBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1NpemluZy5oCmluZGV4IDc3YWYxZWM2ZGQ1ZGY4NzUz
MjIxZWViY2IxZjBmZGE3Y2Y2Mjc1NzkuLjU3YjQ3Y2IwNmJiMzQ5MjE3NGFiZTYxN2NlYzkyN2I1
MzA0OTU4NjIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1Np
emluZy5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9UZXh0QXV0b1NpemluZy5oCkBA
IC0yMyw4ICsyMyw3IEBACiAgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAgKi8K
IAotI2lmbmRlZiBUZXh0QXV0b1NpemluZ19oCi0jZGVmaW5lIFRleHRBdXRvU2l6aW5nX2gKKyNw
cmFnbWEgb25jZQogCiAjaWYgRU5BQkxFKElPU19URVhUX0FVVE9TSVpJTkcpCiAKQEAgLTM4LDIy
ICszNywyMyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiBjbGFzcyBEb2N1bWVudDsKIGNsYXNzIFRl
eHQ7CiAKKy8vIEZJWE1FOiBXZSBjYW4gcHJvYmFibHkgZ2V0IHJpZCBvZiB0aGlzIGNsYXNzIGVu
dGlyZWx5IGFuZCB1c2Ugc3RkOjp1bmlxdWVfcHRyPFJlbmRlclN0eWxlPiBhcyBrZXkKKy8vIGFz
IGxvbmcgYXMgd2UgdXNlIHRoZSByaWdodCBoYXNoIHRyYWl0cy4KIGNsYXNzIFRleHRBdXRvU2l6
aW5nS2V5IHsKIHB1YmxpYzoKICAgICBUZXh0QXV0b1NpemluZ0tleSgpID0gZGVmYXVsdDsKICAg
ICBlbnVtIERlbGV0ZWRUYWcgeyBEZWxldGVkIH07CiAgICAgZXhwbGljaXQgVGV4dEF1dG9TaXpp
bmdLZXkoRGVsZXRlZFRhZyk7Ci0gICAgZXhwbGljaXQgVGV4dEF1dG9TaXppbmdLZXkoY29uc3Qg
UmVuZGVyU3R5bGUqKTsKLSAgICBUZXh0QXV0b1NpemluZ0tleShUZXh0QXV0b1NpemluZ0tleSYm
KSA9IGRlZmF1bHQ7CisgICAgVGV4dEF1dG9TaXppbmdLZXkoY29uc3QgUmVuZGVyU3R5bGUmLCB1
bnNpZ25lZCBoYXNoKTsKIAotICAgIFRleHRBdXRvU2l6aW5nS2V5JiBvcGVyYXRvcj0oVGV4dEF1
dG9TaXppbmdLZXkmJikgPSBkZWZhdWx0OworICAgIGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSgp
IGNvbnN0IHsgQVNTRVJUKCFpc0RlbGV0ZWQoKSk7IHJldHVybiBtX3N0eWxlLmdldCgpOyB9Cisg
ICAgYm9vbCBpc0RlbGV0ZWQoKSBjb25zdCB7IHJldHVybiBIYXNoVHJhaXRzPHN0ZDo6dW5pcXVl
X3B0cjxSZW5kZXJTdHlsZT4+Ojppc0RlbGV0ZWRWYWx1ZShtX3N0eWxlKTsgfQogCi0gICAgY29u
c3QgUmVuZGVyU3R5bGUqIHN0eWxlKCkgY29uc3QgeyByZXR1cm4gbV9zdHlsZS5nZXQoKTsgfQot
ICAgIGlubGluZSBib29sIGlzRGVsZXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1faXNEZWxldGVkOyB9
CisgICAgdW5zaWduZWQgaGFzaCgpIGNvbnN0IHsgcmV0dXJuIG1faGFzaDsgfQogCiBwcml2YXRl
OgogICAgIHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJTdHlsZT4gbV9zdHlsZTsKLSAgICBib29sIG1f
aXNEZWxldGVkIHsgZmFsc2UgfTsKKyAgICB1bnNpZ25lZCBtX2hhc2ggeyAwIH07CiB9OwogCiBp
bmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBhLCBjb25zdCBU
ZXh0QXV0b1NpemluZ0tleSYgYikKQEAgLTYyLDMzICs2Miw2MyBAQCBpbmxpbmUgYm9vbCBvcGVy
YXRvcj09KGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiBhLCBjb25zdCBUZXh0QXV0b1NpemluZ0tl
eSYgYikKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIGlmICghYS5zdHlsZSgpIHx8ICFiLnN0
eWxlKCkpCiAgICAgICAgIHJldHVybiBhLnN0eWxlKCkgPT0gYi5zdHlsZSgpOwotICAgIHJldHVy
biBhLnN0eWxlKCktPmVxdWFsRm9yVGV4dEF1dG9zaXppbmcoYi5zdHlsZSgpKTsKKyAgICByZXR1
cm4gYS5zdHlsZSgpLT5lcXVhbEZvclRleHRBdXRvc2l6aW5nKCpiLnN0eWxlKCkpOwogfQogCiBz
dHJ1Y3QgVGV4dEF1dG9TaXppbmdIYXNoIHsKLSAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25z
dCBUZXh0QXV0b1NpemluZ0tleSYga2V5KSB7IHJldHVybiBrZXkuc3R5bGUoKS0+aGFzaEZvclRl
eHRBdXRvc2l6aW5nKCk7IH0KKyAgICBzdGF0aWMgdW5zaWduZWQgaGFzaChjb25zdCBUZXh0QXV0
b1NpemluZ0tleSYga2V5KSB7IHJldHVybiBrZXkuaGFzaCgpOyB9CiAgICAgc3RhdGljIGJvb2wg
ZXF1YWwoY29uc3QgVGV4dEF1dG9TaXppbmdLZXkmIGEsIGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5
JiBiKSB7IHJldHVybiBhID09IGI7IH0KICAgICBzdGF0aWMgY29uc3QgYm9vbCBzYWZlVG9Db21w
YXJlVG9FbXB0eU9yRGVsZXRlZCA9IHRydWU7CiB9OwogCi1jbGFzcyBUZXh0QXV0b1NpemluZ1Zh
bHVlIDogcHVibGljIFJlZkNvdW50ZWQ8VGV4dEF1dG9TaXppbmdWYWx1ZT4gewotcHVibGljOgot
ICAgIHN0YXRpYyBSZWY8VGV4dEF1dG9TaXppbmdWYWx1ZT4gY3JlYXRlKCkKK3N0cnVjdCBUZXh0
QXV0b1NpemluZ1RyYWl0cyA6IFdURjo6R2VuZXJpY0hhc2hUcmFpdHM8VGV4dEF1dG9TaXppbmdL
ZXk+IHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCBlbXB0eVZhbHVlSXNaZXJvID0gdHJ1ZTsKKyAg
ICBzdGF0aWMgdm9pZCBjb25zdHJ1Y3REZWxldGVkVmFsdWUoVGV4dEF1dG9TaXppbmdLZXkmIHNs
b3QpCisgICAgeworICAgICAgICBuZXcgKE5vdE51bGwsICZzbG90KSBUZXh0QXV0b1NpemluZ0tl
eShUZXh0QXV0b1NpemluZ0tleTo6RGVsZXRlZCk7CisgICAgfQorICAgIHN0YXRpYyBib29sIGlz
RGVsZXRlZFZhbHVlKGNvbnN0IFRleHRBdXRvU2l6aW5nS2V5JiB2YWx1ZSkKICAgICB7Ci0gICAg
ICAgIHJldHVybiBhZG9wdFJlZigqbmV3IFRleHRBdXRvU2l6aW5nVmFsdWUpOworICAgICAgICBy
ZXR1cm4gdmFsdWUuaXNEZWxldGVkKCk7CiAgICAgfQorfTsKKworc3RydWN0IFRleHRBdXRvU2l6
aW5nSGFzaFRyYW5zbGF0b3IgeworICAgIHN0YXRpYyB1bnNpZ25lZCBoYXNoKGNvbnN0IFJlbmRl
clN0eWxlJiBzdHlsZSkKKyAgICB7CisgICAgICAgIHJldHVybiBzdHlsZS5oYXNoRm9yVGV4dEF1
dG9zaXppbmcoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBlcXVhbChjb25zdCBUZXh0QXV0
b1NpemluZ0tleSYga2V5LCBjb25zdCBSZW5kZXJTdHlsZSYgc3R5bGUpCisgICAgeworICAgICAg
ICBpZiAoa2V5LmlzRGVsZXRlZCgpIHx8ICFrZXkuc3R5bGUoKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGtleS5zdHlsZSgpLT5lcXVhbEZvclRleHRBdXRvc2l6
aW5nKHN0eWxlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCB0cmFuc2xhdGUoVGV4dEF1dG9T
aXppbmdLZXkmIGtleSwgY29uc3QgUmVuZGVyU3R5bGUmIHN0eWxlLCB1bnNpZ25lZCBoYXNoKQor
ICAgIHsKKyAgICAgICAga2V5ID0geyBzdHlsZSwgaGFzaCB9OworICAgIH0KK307CisKK2NsYXNz
IFRleHRBdXRvU2l6aW5nVmFsdWUgeworICAgIFdURl9NQUtFX0ZBU1RfQUxMT0NBVEVEOworcHVi
bGljOgorICAgIFRleHRBdXRvU2l6aW5nVmFsdWUoKSA9IGRlZmF1bHQ7CisgICAgflRleHRBdXRv
U2l6aW5nVmFsdWUoKTsKKworICAgIHZvaWQgYWRkVGV4dE5vZGUoVGV4dCYsIGZsb2F0IHNpemUp
OworCisgICAgZW51bSBjbGFzcyBTdGlsbEhhc05vZGVzIHsgTm8sIFllcyB9OworICAgIFN0aWxs
SGFzTm9kZXMgYWRqdXN0VGV4dE5vZGVTaXplcygpOwogCi0gICAgdm9pZCBhZGROb2RlKFRleHQm
LCBmbG9hdCBzaXplKTsKLSAgICBib29sIGFkanVzdE5vZGVTaXplcygpOwotICAgIGludCBudW1O
b2RlcygpIGNvbnN0OwotICAgIHZvaWQgcmVzZXQoKTsKIHByaXZhdGU6Ci0gICAgVGV4dEF1dG9T
aXppbmdWYWx1ZSgpIHsgfQorICAgIHZvaWQgcmVzZXQoKTsKKwogICAgIEhhc2hTZXQ8UmVmUHRy
PFRleHQ+PiBtX2F1dG9TaXplZE5vZGVzOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQog
CiAjZW5kaWYgLy8gRU5BQkxFKElPU19URVhUX0FVVE9TSVpJTkcpCi0KLSNlbmRpZiAvLyBUZXh0
QXV0b1NpemluZ19oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUv
UmVuZGVyU3R5bGUuY3BwIGIvU291cmNlL1dlYkNvcmUvcmVuZGVyaW5nL3N0eWxlL1JlbmRlclN0
eWxlLmNwcAppbmRleCAxYTliMjAwNzk4MTlkMDdhZjIwMTNhNjVhYmZhN2RiYTNlYWU3NDM4Li5i
NTAxYmM2OGI4ZTg3ODIyOGE1NGE4MGRiM2UzYTY0MjIzMDBmMDEzIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9yZW5kZXJpbmcvc3R5bGUvUmVuZGVyU3R5bGUuY3BwCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHlsZS5jcHAKQEAgLTQwNSwyNiArNDA1LDI2
IEBAIHVuc2lnbmVkIFJlbmRlclN0eWxlOjpoYXNoRm9yVGV4dEF1dG9zaXppbmcoKSBjb25zdAog
ICAgIHJldHVybiBoYXNoOwogfQogCi1ib29sIFJlbmRlclN0eWxlOjplcXVhbEZvclRleHRBdXRv
c2l6aW5nKGNvbnN0IFJlbmRlclN0eWxlKiBvdGhlcikgY29uc3QKLXsKLSAgICByZXR1cm4gcmFy
ZU5vbkluaGVyaXRlZERhdGEtPm1fYXBwZWFyYW5jZSA9PSBvdGhlci0+cmFyZU5vbkluaGVyaXRl
ZERhdGEtPm1fYXBwZWFyYW5jZQotICAgICAgICAmJiByYXJlTm9uSW5oZXJpdGVkRGF0YS0+bWFy
Z2luQmVmb3JlQ29sbGFwc2UgPT0gb3RoZXItPnJhcmVOb25Jbmhlcml0ZWREYXRhLT5tYXJnaW5C
ZWZvcmVDb2xsYXBzZQotICAgICAgICAmJiByYXJlTm9uSW5oZXJpdGVkRGF0YS0+bWFyZ2luQWZ0
ZXJDb2xsYXBzZSA9PSBvdGhlci0+cmFyZU5vbkluaGVyaXRlZERhdGEtPm1hcmdpbkFmdGVyQ29s
bGFwc2UKLSAgICAgICAgJiYgcmFyZU5vbkluaGVyaXRlZERhdGEtPmxpbmVDbGFtcCA9PSBvdGhl
ci0+cmFyZU5vbkluaGVyaXRlZERhdGEtPmxpbmVDbGFtcAotICAgICAgICAmJiByYXJlSW5oZXJp
dGVkRGF0YS0+dGV4dFNpemVBZGp1c3QgPT0gb3RoZXItPnJhcmVJbmhlcml0ZWREYXRhLT50ZXh0
U2l6ZUFkanVzdAotICAgICAgICAmJiByYXJlSW5oZXJpdGVkRGF0YS0+b3ZlcmZsb3dXcmFwID09
IG90aGVyLT5yYXJlSW5oZXJpdGVkRGF0YS0+b3ZlcmZsb3dXcmFwCi0gICAgICAgICYmIHJhcmVJ
bmhlcml0ZWREYXRhLT5uYnNwTW9kZSA9PSBvdGhlci0+cmFyZUluaGVyaXRlZERhdGEtPm5ic3BN
b2RlCi0gICAgICAgICYmIHJhcmVJbmhlcml0ZWREYXRhLT5saW5lQnJlYWsgPT0gb3RoZXItPnJh
cmVJbmhlcml0ZWREYXRhLT5saW5lQnJlYWsKLSAgICAgICAgJiYgcmFyZUluaGVyaXRlZERhdGEt
PnRleHRTZWN1cml0eSA9PSBvdGhlci0+cmFyZUluaGVyaXRlZERhdGEtPnRleHRTZWN1cml0eQot
ICAgICAgICAmJiBpbmhlcml0ZWQtPnNwZWNpZmllZExpbmVIZWlnaHQgPT0gb3RoZXItPmluaGVy
aXRlZC0+c3BlY2lmaWVkTGluZUhlaWdodAotICAgICAgICAmJiBpbmhlcml0ZWQtPmZvbnRDYXNj
YWRlLmVxdWFsRm9yVGV4dEF1dG9TaXppbmcob3RoZXItPmluaGVyaXRlZC0+Zm9udENhc2NhZGUp
Ci0gICAgICAgICYmIGluaGVyaXRlZC0+aG9yaXpvbnRhbF9ib3JkZXJfc3BhY2luZyA9PSBvdGhl
ci0+aW5oZXJpdGVkLT5ob3Jpem9udGFsX2JvcmRlcl9zcGFjaW5nCi0gICAgICAgICYmIGluaGVy
aXRlZC0+dmVydGljYWxfYm9yZGVyX3NwYWNpbmcgPT0gb3RoZXItPmluaGVyaXRlZC0+dmVydGlj
YWxfYm9yZGVyX3NwYWNpbmcKLSAgICAgICAgJiYgaW5oZXJpdGVkX2ZsYWdzLl9ib3hfZGlyZWN0
aW9uID09IG90aGVyLT5pbmhlcml0ZWRfZmxhZ3MuX2JveF9kaXJlY3Rpb24KLSAgICAgICAgJiYg
aW5oZXJpdGVkX2ZsYWdzLm1fcnRsT3JkZXJpbmcgPT0gb3RoZXItPmluaGVyaXRlZF9mbGFncy5t
X3J0bE9yZGVyaW5nCi0gICAgICAgICYmIG5vbmluaGVyaXRlZF9mbGFncy5wb3NpdGlvbigpID09
IG90aGVyLT5ub25pbmhlcml0ZWRfZmxhZ3MucG9zaXRpb24oKQotICAgICAgICAmJiBub25pbmhl
cml0ZWRfZmxhZ3MuZmxvYXRpbmcoKSA9PSBvdGhlci0+bm9uaW5oZXJpdGVkX2ZsYWdzLmZsb2F0
aW5nKCkKLSAgICAgICAgJiYgcmFyZU5vbkluaGVyaXRlZERhdGEtPnRleHRPdmVyZmxvdyA9PSBv
dGhlci0+cmFyZU5vbkluaGVyaXRlZERhdGEtPnRleHRPdmVyZmxvdzsKK2Jvb2wgUmVuZGVyU3R5
bGU6OmVxdWFsRm9yVGV4dEF1dG9zaXppbmcoY29uc3QgUmVuZGVyU3R5bGUmIG90aGVyKSBjb25z
dAoreworICAgIHJldHVybiByYXJlTm9uSW5oZXJpdGVkRGF0YS0+bV9hcHBlYXJhbmNlID09IG90
aGVyLnJhcmVOb25Jbmhlcml0ZWREYXRhLT5tX2FwcGVhcmFuY2UKKyAgICAgICAgJiYgcmFyZU5v
bkluaGVyaXRlZERhdGEtPm1hcmdpbkJlZm9yZUNvbGxhcHNlID09IG90aGVyLnJhcmVOb25Jbmhl
cml0ZWREYXRhLT5tYXJnaW5CZWZvcmVDb2xsYXBzZQorICAgICAgICAmJiByYXJlTm9uSW5oZXJp
dGVkRGF0YS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZSA9PSBvdGhlci5yYXJlTm9uSW5oZXJpdGVkRGF0
YS0+bWFyZ2luQWZ0ZXJDb2xsYXBzZQorICAgICAgICAmJiByYXJlTm9uSW5oZXJpdGVkRGF0YS0+
bGluZUNsYW1wID09IG90aGVyLnJhcmVOb25Jbmhlcml0ZWREYXRhLT5saW5lQ2xhbXAKKyAgICAg
ICAgJiYgcmFyZUluaGVyaXRlZERhdGEtPnRleHRTaXplQWRqdXN0ID09IG90aGVyLnJhcmVJbmhl
cml0ZWREYXRhLT50ZXh0U2l6ZUFkanVzdAorICAgICAgICAmJiByYXJlSW5oZXJpdGVkRGF0YS0+
b3ZlcmZsb3dXcmFwID09IG90aGVyLnJhcmVJbmhlcml0ZWREYXRhLT5vdmVyZmxvd1dyYXAKKyAg
ICAgICAgJiYgcmFyZUluaGVyaXRlZERhdGEtPm5ic3BNb2RlID09IG90aGVyLnJhcmVJbmhlcml0
ZWREYXRhLT5uYnNwTW9kZQorICAgICAgICAmJiByYXJlSW5oZXJpdGVkRGF0YS0+bGluZUJyZWFr
ID09IG90aGVyLnJhcmVJbmhlcml0ZWREYXRhLT5saW5lQnJlYWsKKyAgICAgICAgJiYgcmFyZUlu
aGVyaXRlZERhdGEtPnRleHRTZWN1cml0eSA9PSBvdGhlci5yYXJlSW5oZXJpdGVkRGF0YS0+dGV4
dFNlY3VyaXR5CisgICAgICAgICYmIGluaGVyaXRlZC0+c3BlY2lmaWVkTGluZUhlaWdodCA9PSBv
dGhlci5pbmhlcml0ZWQtPnNwZWNpZmllZExpbmVIZWlnaHQKKyAgICAgICAgJiYgaW5oZXJpdGVk
LT5mb250Q2FzY2FkZS5lcXVhbEZvclRleHRBdXRvU2l6aW5nKG90aGVyLmluaGVyaXRlZC0+Zm9u
dENhc2NhZGUpCisgICAgICAgICYmIGluaGVyaXRlZC0+aG9yaXpvbnRhbF9ib3JkZXJfc3BhY2lu
ZyA9PSBvdGhlci5pbmhlcml0ZWQtPmhvcml6b250YWxfYm9yZGVyX3NwYWNpbmcKKyAgICAgICAg
JiYgaW5oZXJpdGVkLT52ZXJ0aWNhbF9ib3JkZXJfc3BhY2luZyA9PSBvdGhlci5pbmhlcml0ZWQt
PnZlcnRpY2FsX2JvcmRlcl9zcGFjaW5nCisgICAgICAgICYmIGluaGVyaXRlZF9mbGFncy5fYm94
X2RpcmVjdGlvbiA9PSBvdGhlci5pbmhlcml0ZWRfZmxhZ3MuX2JveF9kaXJlY3Rpb24KKyAgICAg
ICAgJiYgaW5oZXJpdGVkX2ZsYWdzLm1fcnRsT3JkZXJpbmcgPT0gb3RoZXIuaW5oZXJpdGVkX2Zs
YWdzLm1fcnRsT3JkZXJpbmcKKyAgICAgICAgJiYgbm9uaW5oZXJpdGVkX2ZsYWdzLnBvc2l0aW9u
KCkgPT0gb3RoZXIubm9uaW5oZXJpdGVkX2ZsYWdzLnBvc2l0aW9uKCkKKyAgICAgICAgJiYgbm9u
aW5oZXJpdGVkX2ZsYWdzLmZsb2F0aW5nKCkgPT0gb3RoZXIubm9uaW5oZXJpdGVkX2ZsYWdzLmZs
b2F0aW5nKCkKKyAgICAgICAgJiYgcmFyZU5vbkluaGVyaXRlZERhdGEtPnRleHRPdmVyZmxvdyA9
PSBvdGhlci5yYXJlTm9uSW5oZXJpdGVkRGF0YS0+dGV4dE92ZXJmbG93OwogfQogCiAjZW5kaWYg
Ly8gRU5BQkxFKElPU19URVhUX0FVVE9TSVpJTkcpCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29y
ZS9yZW5kZXJpbmcvc3R5bGUvUmVuZGVyU3R5bGUuaCBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmlu
Zy9zdHlsZS9SZW5kZXJTdHlsZS5oCmluZGV4IDc0YTQ1ZDhhZWQxYmNlNzNmODg2ZmE4MWUzOWQx
ZDkxNDViNWQzYTMuLmYwMjIzNzg5N2VjY2Y2NWU1NTNmMTg5NmZmMGVkMDU0MzI5MGI2MWUgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHlsZS5oCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3JlbmRlcmluZy9zdHlsZS9SZW5kZXJTdHlsZS5oCkBAIC0xODYy
LDcgKzE4NjIsNyBAQCBwdWJsaWM6CiAKICNpZiBFTkFCTEUoSU9TX1RFWFRfQVVUT1NJWklORykK
ICAgICB1aW50MzJfdCBoYXNoRm9yVGV4dEF1dG9zaXppbmcoKSBjb25zdDsKLSAgICBib29sIGVx
dWFsRm9yVGV4dEF1dG9zaXppbmcoY29uc3QgUmVuZGVyU3R5bGUgKm90aGVyKSBjb25zdDsKKyAg
ICBib29sIGVxdWFsRm9yVGV4dEF1dG9zaXppbmcoY29uc3QgUmVuZGVyU3R5bGUmKSBjb25zdDsK
ICNlbmRpZgogCiAgICAgU3R5bGVEaWZmZXJlbmNlIGRpZmYoY29uc3QgUmVuZGVyU3R5bGUmLCB1
bnNpZ25lZCYgY2hhbmdlZENvbnRleHRTZW5zaXRpdmVQcm9wZXJ0aWVzKSBjb25zdDsK
</data>

          </attachment>
      

    </bug>

</bugzilla>