<?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>103175</bug_id>
          
          <creation_ts>2012-11-24 04:28:31 -0800</creation_ts>
          <short_desc>Make renderer construction less generic</short_desc>
          <delta_ts>2012-11-25 09:01:46 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>DOM</component>
          <version>528+ (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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Antti Koivisto">koivisto</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>cmarcelo</cc>
    
    <cc>dglazkov</cc>
    
    <cc>eric</cc>
    
    <cc>esprehn</cc>
    
    <cc>jchaffraix</cc>
    
    <cc>kling</cc>
    
    <cc>ojan</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>774813</commentid>
    <comment_count>0</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-24 04:28:31 -0800</bug_when>
    <thetext>The renderer construction code currently operates on Nodes and is very generic. In reality only Element and Text nodes can have renderers and the Text case is much simpler.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774817</commentid>
    <comment_count>1</comment_count>
      <attachid>175855</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-24 06:08:38 -0800</bug_when>
    <thetext>Created attachment 175855
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774831</commentid>
    <comment_count>2</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-11-24 07:46:11 -0800</bug_when>
    <thetext>Curious if you see a perf effect from this change.  Several of the microbenchmarks in PerformanceTests, including Parser/html5-full-render.html hit render creation pretty hard.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774837</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-11-24 08:31:21 -0800</bug_when>
    <thetext>I guess in my initial reading, I&apos;m not really for or against this change.  It doesn&apos;t seem much simpler to me.  But I like the idea of someone trying to make all of this ancient code simpler/faster.  I&apos;m just not sure what your end goal here is. :)

I agree that there are only two cases of interest (text and element nodes), and that should always be the case.  So perhaps special casing them (as you&apos;ve done here) instead of generic dispatch on Node is a better approach.

I guess I&apos;m just asking to learn more of your thoughts/plans.  :)

I&apos;m happy to r+ this patch once understanding a bit more context.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774843</commentid>
    <comment_count>4</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-24 09:04:05 -0800</bug_when>
    <thetext>It is not simpler as such. The goal is to tighten the code so that it statically describes what is possible and what is not. Beyond the architectural improvement, the end goals include

- Make it go faster. The current code is unnecessarily branchy because it is overly generic.
- Use lazy attach during parsing to reduce unnecessary style recalcs. To do this efficiently we need to change the renderer construction in ways that benefit from reduced genericity.
- Get rid of the Text nodes in common case. We should synthesize them on DOM access only. This requires separating the text construction path.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774852</commentid>
    <comment_count>5</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-11-24 09:57:37 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; It is not simpler as such. The goal is to tighten the code so that it statically describes what is possible and what is not. 

Even without these goals, I think tighening up the code is a big win. I really like the direction of this change. 

I cringe a little at the code duplication between createRendererForElementIfNeeded and createRendererForTextIfNeeded. I think you could get rid of much of it by adding a couple static helper functions?

&gt; Beyond the architectural improvement, the end goals include
&gt; 
&gt; - Make it go faster. The current code is unnecessarily branchy because it is overly generic.
&gt; - Use lazy attach during parsing to reduce unnecessary style recalcs. To do this efficiently we need to change the renderer construction in ways that benefit from reduced genericity.
&gt; - Get rid of the Text nodes in common case. We should synthesize them on DOM access only. This requires separating the text construction path.

These are great goals! I wonder with the latter goal if we could even take it a step further and get rid of the C++ side object entirely and just have the javascript wrapper. Obviously, this would be a followup step. The big difficulty with this would be dealing with editing/selections since those can be inside Text nodes. Maybe we could have a lighter-weight thing inside editing/selection to handle text without actually creating the Nodes, but that sounds tricky.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774853</commentid>
    <comment_count>6</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-24 10:02:47 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; I cringe a little at the code duplication between createRendererForElementIfNeeded and createRendererForTextIfNeeded. I think you could get rid of much of it by adding a couple static helper functions?

I tried some helper functions but they didn&apos;t seem particularly helpful in the end. I think this can be simplified more by taking the refactoring bit further. This is not meant to be the end state.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774861</commentid>
    <comment_count>7</comment_count>
    <who name="Ojan Vafai">ojan</who>
    <bug_when>2012-11-24 11:15:49 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; I tried some helper functions but they didn&apos;t seem particularly helpful in the end. I think this can be simplified more by taking the refactoring bit further. This is not meant to be the end state.

Fair enough.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774864</commentid>
    <comment_count>8</comment_count>
      <attachid>175855</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2012-11-24 11:30:47 -0800</bug_when>
    <thetext>Comment on attachment 175855
patch

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

Thank you *very* much for such a clear explanation.  And thank you again for working on this.  core rendering like this still needs a lot of love. :(

&gt; Source/WebCore/dom/CharacterData.cpp:95
&gt; +        toText(this)-&gt;updateTextRenderer(oldLength, 0);

This is such a horribly cryptic method name/calling-convention.  (Not your fault.  Just hope we make it clearer some day.)

&gt; Source/WebCore/dom/Element.cpp:1102
&gt; +    return (document()-&gt;documentElement() == this) || (context.style()-&gt;display() != NONE);

I didn&apos;t know that the body always got a render?  Interesting.

&gt; Source/WebCore/dom/Text.cpp:311
&gt; +    if (!textRenderer || !textRendererIsNeeded(NodeRenderingContext(this, textRenderer-&gt;style()))) {
&gt; +        reattach();

I&apos;m slightly confused by this re-attach here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774870</commentid>
    <comment_count>9</comment_count>
    <who name="Elliott Sprehn">esprehn</who>
    <bug_when>2012-11-24 11:48:41 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; (From update of attachment 175855 [details])
&gt; ...
&gt; &gt; Source/WebCore/dom/Element.cpp:1102
&gt; &gt; +    return (document()-&gt;documentElement() == this) || (context.style()-&gt;display() != NONE);
&gt; 
&gt; I didn&apos;t know that the body always got a render?  Interesting.

That&apos;s actually the document element so it would be the &lt;html&gt; element, but that&apos;s broken right now. See: https://bugs.webkit.org/show_bug.cgi?id=102975#c10</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774872</commentid>
    <comment_count>10</comment_count>
      <attachid>175855</attachid>
    <who name="Elliott Sprehn">esprehn</who>
    <bug_when>2012-11-24 12:06:04 -0800</bug_when>
    <thetext>Comment on attachment 175855
patch

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

&gt; Source/WebCore/dom/NodeRenderingContext.cpp:217
&gt;      moveToFlowThreadIfNeeded();

You should remove isElementNode() check in moveToFlowThreadIfNeeded() since we never call it on non-elements with this patch.

&gt; Source/WebCore/dom/NodeRenderingContext.cpp:219
&gt; +    if (!element-&gt;rendererIsNeeded(*this)) {

Can we either rename this elementRendererIsNeeded to match the new createRendererForElementIfNeeded or leave the method name alone for createRendererIfNeeded (as you have textRendererIsNeeded and createTextRenderer)? We lose the parity in the methods from this patch.

&gt; Source/WebCore/dom/Text.cpp:306
&gt; +{

The old version of this method was shorter and seemed easier to understand.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774988</commentid>
    <comment_count>11</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-25 08:55:20 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/135668</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774991</commentid>
    <comment_count>12</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-25 08:58:56 -0800</bug_when>
    <thetext>&gt; &gt; Source/WebCore/dom/Text.cpp:311
&gt; &gt; +    if (!textRenderer || !textRendererIsNeeded(NodeRenderingContext(this, textRenderer-&gt;style()))) {
&gt; &gt; +        reattach();
&gt; 
&gt; I&apos;m slightly confused by this re-attach here.

The change in text content may change the result of textRendererIsNeeded, requiring either addition or removal of the renderer. More optimal version would check if the change actually had such impact before reattaching. I suppose it has not been a real world problem so far.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>774994</commentid>
    <comment_count>13</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2012-11-25 09:01:46 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; You should remove isElementNode() check in moveToFlowThreadIfNeeded() since we never call it on non-elements with this patch.

Done.

&gt; Can we either rename this elementRendererIsNeeded to match the new createRendererForElementIfNeeded or leave the method name alone for createRendererIfNeeded (as you have textRendererIsNeeded and createTextRenderer)? We lose the parity in the methods from this patch.

We don&apos;t usually prefix member functions with the class type. Only reason I did it for Text was to avoid confusing these non-virtual calls with with the virtual Element functions.

&gt; The old version of this method was shorter and seemed easier to understand.

Shortness is a non-goal and I obviously disagree with the &apos;easier to understand&apos; part.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>175855</attachid>
            <date>2012-11-24 06:08:38 -0800</date>
            <delta_ts>2012-11-24 12:06:04 -0800</delta_ts>
            <desc>patch</desc>
            <filename>text-renderer-creation-4.patch</filename>
            <type>text/plain</type>
            <size>20815</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDEzNTY0NykKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDY4IEBACisyMDEyLTExLTI0ICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBNYWtlIHJlbmRlcmVyIGNvbnN0
cnVjdGlvbiBsZXNzIGdlbmVyaWMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hv
d19idWcuY2dpP2lkPTEwMzE3NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEp
LgorCisgICAgICAgIFRoZSByZW5kZXJlciBjb25zdHJ1Y3Rpb24gY29kZSBjdXJyZW50bHkgb3Bl
cmF0ZXMgb24gTm9kZXMgYW5kIGlzIHZlcnkgZ2VuZXJpYy4gSW4gcmVhbGl0eQorICAgICAgICBv
bmx5IEVsZW1lbnQgYW5kIFRleHQgbm9kZXMgY2FuIGhhdmUgcmVuZGVyZXJzIGFuZCB0aGUgVGV4
dCBjYXNlIGlzIG11Y2ggc2ltcGxlci4KKworICAgICAgICAqIGRvbS9DaGFyYWN0ZXJEYXRhLmNw
cDoKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3RlckRhdGE6OnBhcnNlckFwcGVuZERhdGEpOgor
ICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6c2V0RGF0YUFuZFVwZGF0ZSk6CisgICAg
ICAgIChXZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkNoYXJhY3RlckRhdGE6OnJlbmRlcmVy
SXNOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6Q2hhcmFjdGVyRGF0YTo6Y3JlYXRlUmVuZGVy
ZXIpOgorICAgICAgICAqIGRvbS9DaGFyYWN0ZXJEYXRhLmg6CisgICAgICAgIChDaGFyYWN0ZXJE
YXRhKToKKyAgICAgICAgKiBkb20vQ29udGFpbmVyTm9kZS5oOgorICAgICAgICAoV2ViQ29yZTo6
Q29udGFpbmVyTm9kZTo6Y2hpbGRTaG91bGRDcmVhdGVSZW5kZXJlcik6CisgICAgICAgIAorICAg
ICAgICAgICAgTW92ZSBjaGlsZFNob3VsZENyZWF0ZVJlbmRlcmVyIGZyb20gTm9kZSB0byBDb250
YWluZXJOb2RlLgorCisgICAgICAgIChDb250YWluZXJOb2RlKToKKyAgICAgICAgKiBkb20vRWxl
bWVudC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpFbGVtZW50OjpyZW5kZXJlcklzTmVlZGVkKToK
KyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoV2ViQ29yZTo6RWxlbWVudDo6YXR0YWNoKToK
KyAgICAgICAgKFdlYkNvcmU6OkVsZW1lbnQ6OmNoaWxkU2hvdWxkQ3JlYXRlUmVuZGVyZXIpOgor
ICAgICAgICAqIGRvbS9FbGVtZW50Lmg6CisgICAgICAgIAorICAgICAgICAgICAgTW92ZSByZW5k
ZXJlcklzTmVlZGVkIGFuZCBjcmVhdGVSZW5kZXJlciBmcm9tIE5vZGUgdG8gRWxlbWVudC4KKwor
ICAgICAgICAoRWxlbWVudCk6CisgICAgICAgICogZG9tL05vZGUuY3BwOgorICAgICAgICAoV2Vi
Q29yZTo6Tm9kZTo6YXR0YWNoKToKKyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAqIGRvbS9O
b2RlLmg6CisgICAgICAgIChOb2RlKToKKyAgICAgICAgKiBkb20vTm9kZVJlbmRlcmluZ0NvbnRl
eHQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Tm9kZVJlbmRlcmluZ0NvbnRleHQ6OmNyZWF0ZVJl
bmRlcmVyRm9yRWxlbWVudElmTmVlZGVkKToKKyAgICAgICAgKFdlYkNvcmU6Ok5vZGVSZW5kZXJp
bmdDb250ZXh0OjpjcmVhdGVSZW5kZXJlckZvclRleHRJZk5lZWRlZCk6CisgICAgICAgIAorICAg
ICAgICAgICAgU2VwYXJhdGUgdGhlIEVsZW1lbnQgYW5kIFRleHQgcmVuZGVyZXIgY3JlYXRpb24g
cGF0aHMuIEJvdGggYXJlIGxlc3MgYnJhbmNoeS4KKyAgICAgICAgICAgIFRoZSBUZXh0IHBhdGgg
aXMgbXVjaCBzaW1wbGVyIGFuZCBhdm9pZHMgYSBidW5jaCBvZiB2aXJ0dWFsIGNhbGxzLgorCisg
ICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKiBkb20vTm9kZVJlbmRlcmluZ0NvbnRleHQuaDoK
KyAgICAgICAgKE5vZGVSZW5kZXJpbmdDb250ZXh0KToKKyAgICAgICAgKiBkb20vVGV4dC5jcHA6
CisgICAgICAgIChXZWJDb3JlOjpUZXh0Ojp0ZXh0UmVuZGVyZXJJc05lZWRlZCk6CisgICAgICAg
IChXZWJDb3JlOjpUZXh0OjpjcmVhdGVUZXh0UmVuZGVyZXJJZk5lZWRlZCk6CisgICAgICAgIChX
ZWJDb3JlKToKKyAgICAgICAgKFdlYkNvcmU6OlRleHQ6OmNyZWF0ZVRleHRSZW5kZXJlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXh0OjphdHRhY2gpOgorICAgICAgICAoV2ViQ29yZTo6VGV4dDo6
dXBkYXRlVGV4dFJlbmRlcmVyKToKKyAgICAgICAgKiBkb20vVGV4dC5oOgorICAgICAgICAKKyAg
ICAgICAgICAgICAgICBBZGQgbm9uLXZpcnR1YWwgVGV4dCBzcGVjaWZpYyBmdW5jdGlvbnMuCisK
KyAgICAgICAgKFdlYkNvcmUpOgorICAgICAgICAoVGV4dCk6CisgICAgICAgICogcmVuZGVyaW5n
L1JlbmRlckJsb2NrLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlJlbmRlckJsb2NrOjpjbG9uZSk6
CisKIDIwMTItMTEtMjMgIEthbmdpbCBIYW4gIDxrYW5naWwuaGFuQHNhbXN1bmcuY29tPgogCiAg
ICAgICAgIEZpeCB1bnVzZWQgcGFyYW1ldGVyIGNvbXBpbGUgd2FybmluZ3MKSW5kZXg6IFNvdXJj
ZS9XZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9kb20vQ2hhcmFjdGVyRGF0YS5jcHAJKHJldmlzaW9uIDEzNTYxOCkKKysrIFNvdXJjZS9X
ZWJDb3JlL2RvbS9DaGFyYWN0ZXJEYXRhLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzIsNiArMzIs
NyBAQAogI2luY2x1ZGUgIk5vZGVSZW5kZXJpbmdDb250ZXh0LmgiCiAjaW5jbHVkZSAiUmVuZGVy
VGV4dC5oIgogI2luY2x1ZGUgIlN0eWxlSW5oZXJpdGVkRGF0YS5oIgorI2luY2x1ZGUgIlRleHQu
aCIKICNpbmNsdWRlICJUZXh0QnJlYWtJdGVyYXRvci5oIgogI2luY2x1ZGUgIldlYkNvcmVNZW1v
cnlJbnN0cnVtZW50YXRpb24uaCIKIApAQCAtODksNyArOTAsMTAgQEAgdW5zaWduZWQgQ2hhcmFj
dGVyRGF0YTo6cGFyc2VyQXBwZW5kRGF0YQogICAgIGVsc2UKICAgICAgICAgbV9kYXRhLmFwcGVu
ZChzdHJpbmcuY2hhcmFjdGVyczE2KCkgKyBvZmZzZXQsIGNoYXJhY3Rlckxlbmd0aExpbWl0KTsK
IAotICAgIHVwZGF0ZVJlbmRlcmVyKG9sZExlbmd0aCwgMCk7CisgICAgQVNTRVJUKCFyZW5kZXJl
cigpIHx8IGlzVGV4dE5vZGUoKSk7CisgICAgaWYgKGlzVGV4dE5vZGUoKSkKKyAgICAgICAgdG9U
ZXh0KHRoaXMpLT51cGRhdGVUZXh0UmVuZGVyZXIob2xkTGVuZ3RoLCAwKTsKKwogICAgIGRvY3Vt
ZW50KCktPmluY0RPTVRyZWVWZXJzaW9uKCk7CiAgICAgLy8gV2UgZG9uJ3QgY2FsbCBkaXNwYXRj
aE1vZGlmaWVkRXZlbnQgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdGhlCiAgICAgLy8gcGFy
c2VyIHRvIGRpc3BhdGNoIERPTSBtdXRhdGlvbiBldmVudHMuCkBAIC0xOTMsNyArMTk3LDkgQEAg
dm9pZCBDaGFyYWN0ZXJEYXRhOjpzZXREYXRhQW5kVXBkYXRlKGNvbgogICAgIFN0cmluZyBvbGRE
YXRhID0gbV9kYXRhOwogICAgIG1fZGF0YSA9IG5ld0RhdGE7CiAKLSAgICB1cGRhdGVSZW5kZXJl
cihvZmZzZXRPZlJlcGxhY2VkRGF0YSwgb2xkTGVuZ3RoKTsKKyAgICBBU1NFUlQoIXJlbmRlcmVy
KCkgfHwgaXNUZXh0Tm9kZSgpKTsKKyAgICBpZiAoaXNUZXh0Tm9kZSgpKQorICAgICAgICB0b1Rl
eHQodGhpcyktPnVwZGF0ZVRleHRSZW5kZXJlcihvZmZzZXRPZlJlcGxhY2VkRGF0YSwgb2xkTGVu
Z3RoKTsKIAogICAgIGlmIChkb2N1bWVudCgpLT5mcmFtZSgpKQogICAgICAgICBkb2N1bWVudCgp
LT5mcmFtZSgpLT5zZWxlY3Rpb24oKS0+dGV4dFdhc1JlcGxhY2VkKHRoaXMsIG9mZnNldE9mUmVw
bGFjZWREYXRhLCBvbGRMZW5ndGgsIG5ld0xlbmd0aCk7CkBAIC0yMDIsMTQgKzIwOCw2IEBAIHZv
aWQgQ2hhcmFjdGVyRGF0YTo6c2V0RGF0YUFuZFVwZGF0ZShjb24KICAgICBkaXNwYXRjaE1vZGlm
aWVkRXZlbnQob2xkRGF0YSk7CiB9CiAKLXZvaWQgQ2hhcmFjdGVyRGF0YTo6dXBkYXRlUmVuZGVy
ZXIodW5zaWduZWQgb2Zmc2V0T2ZSZXBsYWNlZERhdGEsIHVuc2lnbmVkIGxlbmd0aE9mUmVwbGFj
ZWREYXRhKQotewotICAgIGlmICgoIXJlbmRlcmVyKCkgfHwgIXJlbmRlcmVySXNOZWVkZWQoTm9k
ZVJlbmRlcmluZ0NvbnRleHQodGhpcywgcmVuZGVyZXIoKS0+c3R5bGUoKSkpKSAmJiBhdHRhY2hl
ZCgpKQotICAgICAgICByZWF0dGFjaCgpOwotICAgIGVsc2UgaWYgKHJlbmRlcmVyKCkpCi0gICAg
ICAgIHRvUmVuZGVyVGV4dChyZW5kZXJlcigpKS0+c2V0VGV4dFdpdGhPZmZzZXQobV9kYXRhLmlt
cGwoKSwgb2Zmc2V0T2ZSZXBsYWNlZERhdGEsIGxlbmd0aE9mUmVwbGFjZWREYXRhKTsKLX0KLQog
dm9pZCBDaGFyYWN0ZXJEYXRhOjpkaXNwYXRjaE1vZGlmaWVkRXZlbnQoY29uc3QgU3RyaW5nJiBv
bGREYXRhKQogewogI2lmIEVOQUJMRShNVVRBVElPTl9PQlNFUlZFUlMpCkBAIC0yNDUsMTMgKzI0
Myw2IEBAIGludCBDaGFyYWN0ZXJEYXRhOjptYXhDaGFyYWN0ZXJPZmZzZXQoKSAKICAgICByZXR1
cm4gc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgoKSk7CiB9CiAKLWJvb2wgQ2hhcmFjdGVyRGF0YTo6
cmVuZGVyZXJJc05lZWRlZChjb25zdCBOb2RlUmVuZGVyaW5nQ29udGV4dCYgY29udGV4dCkKLXsK
LSAgICBpZiAoIW1fZGF0YSB8fCAhbGVuZ3RoKCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAg
ICByZXR1cm4gTm9kZTo6cmVuZGVyZXJJc05lZWRlZChjb250ZXh0KTsKLX0KLQogYm9vbCBDaGFy
YWN0ZXJEYXRhOjpvZmZzZXRJbkNoYXJhY3RlcnMoKSBjb25zdAogewogICAgIHJldHVybiB0cnVl
OwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0NoYXJhY3RlckRhdGEuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBTb3VyY2UvV2ViQ29yZS9kb20vQ2hhcmFjdGVyRGF0YS5oCShyZXZpc2lvbiAxMzU2MTgpCisr
KyBTb3VyY2UvV2ViQ29yZS9kb20vQ2hhcmFjdGVyRGF0YS5oCSh3b3JraW5nIGNvcHkpCkBAIC01
Nyw4ICs1Nyw2IEBAIHByb3RlY3RlZDoKICAgICAgICAgQVNTRVJUKHR5cGUgPT0gQ3JlYXRlT3Ro
ZXIgfHwgdHlwZSA9PSBDcmVhdGVUZXh0IHx8IHR5cGUgPT0gQ3JlYXRlRWRpdGluZ1RleHQpOwog
ICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGNvbnN0IE5vZGVSZW5k
ZXJpbmdDb250ZXh0Jik7Ci0KICAgICB2b2lkIHNldERhdGFXaXRob3V0VXBkYXRlKGNvbnN0IFN0
cmluZyYgZGF0YSkKICAgICB7CiAgICAgICAgIEFTU0VSVCghZGF0YS5pc051bGwoKSk7CkBAIC03
Myw3ICs3MSw2IEBAIHByaXZhdGU6CiAgICAgdmlydHVhbCBpbnQgbWF4Q2hhcmFjdGVyT2Zmc2V0
KCkgY29uc3Q7CiAgICAgdmlydHVhbCBib29sIG9mZnNldEluQ2hhcmFjdGVycygpIGNvbnN0Owog
ICAgIHZvaWQgc2V0RGF0YUFuZFVwZGF0ZShjb25zdCBTdHJpbmcmLCB1bnNpZ25lZCBvZmZzZXRP
ZlJlcGxhY2VkRGF0YSwgdW5zaWduZWQgb2xkTGVuZ3RoLCB1bnNpZ25lZCBuZXdMZW5ndGgpOwot
ICAgIHZvaWQgdXBkYXRlUmVuZGVyZXIodW5zaWduZWQgb2Zmc2V0T2ZSZXBsYWNlZERhdGEsIHVu
c2lnbmVkIGxlbmd0aE9mUmVwbGFjZWREYXRhKTsKICAgICB2b2lkIGNoZWNrQ2hhckRhdGFPcGVy
YXRpb24odW5zaWduZWQgb2Zmc2V0LCBFeGNlcHRpb25Db2RlJik7CiAKICAgICBTdHJpbmcgbV9k
YXRhOwpJbmRleDogU291cmNlL1dlYkNvcmUvZG9tL0NvbnRhaW5lck5vZGUuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9kZS5oCShyZXZpc2lvbiAxMzU2MTgp
CisrKyBTb3VyY2UvV2ViQ29yZS9kb20vQ29udGFpbmVyTm9kZS5oCSh3b3JraW5nIGNvcHkpCkBA
IC0xMzEsNiArMTMxLDggQEAgcHVibGljOgogCiAgICAgdm9pZCBkaXNjb25uZWN0RGVzY2VuZGFu
dEZyYW1lcygpOwogCisgICAgdmlydHVhbCBib29sIGNoaWxkU2hvdWxkQ3JlYXRlUmVuZGVyZXIo
Y29uc3QgTm9kZVJlbmRlcmluZ0NvbnRleHQmKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKICAg
ICAvLyBNb3JlIGVmZmljaWVudCB2ZXJzaW9ucyBvZiB0aGVzZSB0d28gZnVuY3Rpb25zIGZvciB0
aGUgY2FzZSB3aGVyZSB3ZSBhcmUgc3RhcnRpbmcgd2l0aCBhIENvbnRhaW5lck5vZGUuCiAgICAg
Tm9kZSogdHJhdmVyc2VOZXh0Tm9kZSgpIGNvbnN0OwogICAgIE5vZGUqIHRyYXZlcnNlTmV4dE5v
ZGUoY29uc3QgTm9kZSogc3RheVdpdGhpbikgY29uc3Q7CkluZGV4OiBTb3VyY2UvV2ViQ29yZS9k
b20vRWxlbWVudC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQu
Y3BwCShyZXZpc2lvbiAxMzU2MTgpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vRWxlbWVudC5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTEwOTcsNiArMTA5NywxMSBAQCBjb25zdCBRdWFsaWZpZWROYW1l
JiBFbGVtZW50OjppbWFnZVNvdXJjCiAgICAgcmV0dXJuIHNyY0F0dHI7CiB9CiAKK2Jvb2wgRWxl
bWVudDo6cmVuZGVyZXJJc05lZWRlZChjb25zdCBOb2RlUmVuZGVyaW5nQ29udGV4dCYgY29udGV4
dCkKK3sKKyAgICByZXR1cm4gKGRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVudCgpID09IHRoaXMp
IHx8IChjb250ZXh0LnN0eWxlKCktPmRpc3BsYXkoKSAhPSBOT05FKTsKK30KKwogUmVuZGVyT2Jq
ZWN0KiBFbGVtZW50OjpjcmVhdGVSZW5kZXJlcihSZW5kZXJBcmVuYSogYXJlbmEsIFJlbmRlclN0
eWxlKiBzdHlsZSkKIHsKICAgICBpZiAoZG9jdW1lbnQoKS0+ZG9jdW1lbnRFbGVtZW50KCkgPT0g
dGhpcyAmJiBzdHlsZS0+ZGlzcGxheSgpID09IE5PTkUpIHsKQEAgLTExODQsMTIgKzExODksMTgg
QEAgdm9pZCBFbGVtZW50OjpyZW1vdmVkRnJvbShDb250YWluZXJOb2RlKgogICAgIENvbnRhaW5l
ck5vZGU6OnJlbW92ZWRGcm9tKGluc2VydGlvblBvaW50KTsKIH0KIAordm9pZCBFbGVtZW50Ojpj
cmVhdGVSZW5kZXJlcklmTmVlZGVkKCkKK3sKKyAgICBOb2RlUmVuZGVyaW5nQ29udGV4dCh0aGlz
KS5jcmVhdGVSZW5kZXJlckZvckVsZW1lbnRJZk5lZWRlZCgpOworfQorCiB2b2lkIEVsZW1lbnQ6
OmF0dGFjaCgpCiB7CiAgICAgc3VzcGVuZFBvc3RBdHRhY2hDYWxsYmFja3MoKTsKICAgICBXaWRn
ZXRIaWVyYXJjaHlVcGRhdGVzU3VzcGVuc2lvblNjb3BlIHN1c3BlbmRXaWRnZXRIaWVyYXJjaHlV
cGRhdGVzOwogCiAgICAgY3JlYXRlUmVuZGVyZXJJZk5lZWRlZCgpOworCiAgICAgU3R5bGVSZXNv
bHZlclBhcmVudFB1c2hlciBwYXJlbnRQdXNoZXIodGhpcyk7CiAKICAgICBpZiAocGFyZW50RWxl
bWVudCgpICYmIHBhcmVudEVsZW1lbnQoKS0+aXNJbkNhbnZhc1N1YnRyZWUoKSkKQEAgLTIxNDAs
NyArMjE1MSw3IEBAIGJvb2wgRWxlbWVudDo6Y2hpbGRTaG91bGRDcmVhdGVSZW5kZXJlcigKICAg
ICBpZiAoY2hpbGRDb250ZXh0Lm5vZGUoKS0+aXNTVkdFbGVtZW50KCkpCiAgICAgICAgIHJldHVy
biBjaGlsZENvbnRleHQubm9kZSgpLT5oYXNUYWdOYW1lKFNWR05hbWVzOjpzdmdUYWcpIHx8IGlz
U1ZHRWxlbWVudCgpOwogCi0gICAgcmV0dXJuIE5vZGU6OmNoaWxkU2hvdWxkQ3JlYXRlUmVuZGVy
ZXIoY2hpbGRDb250ZXh0KTsKKyAgICByZXR1cm4gQ29udGFpbmVyTm9kZTo6Y2hpbGRTaG91bGRD
cmVhdGVSZW5kZXJlcihjaGlsZENvbnRleHQpOwogfQogI2VuZGlmCiAgICAgCkBAIC0yNTMwLDcg
KzI1NDEsNiBAQCBQYXNzUmVmUHRyPFJlbmRlclN0eWxlPiBFbGVtZW50OjpjdXN0b21TCiAgICAg
cmV0dXJuIDA7CiB9CiAKLQogdm9pZCBFbGVtZW50OjpjbG9uZUF0dHJpYnV0ZXNGcm9tRWxlbWVu
dChjb25zdCBFbGVtZW50JiBvdGhlcikKIHsKICAgICBpZiAoaGFzU3ludGhldGljQXR0ckNoaWxk
Tm9kZXMoKSkKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2RvbS9FbGVtZW50LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAkocmV2aXNpb24gMTM1NjE4KQorKysgU291
cmNlL1dlYkNvcmUvZG9tL0VsZW1lbnQuaAkod29ya2luZyBjb3B5KQpAQCAtMjcwLDYgKzI3MCw3
IEBAIHB1YmxpYzoKICAgICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7CiAgICAgdmlydHVhbCB2b2lk
IGRldGFjaCgpOwogICAgIHZpcnR1YWwgUmVuZGVyT2JqZWN0KiBjcmVhdGVSZW5kZXJlcihSZW5k
ZXJBcmVuYSosIFJlbmRlclN0eWxlKik7CisgICAgdmlydHVhbCBib29sIHJlbmRlcmVySXNOZWVk
ZWQoY29uc3QgTm9kZVJlbmRlcmluZ0NvbnRleHQmKTsKICAgICB2b2lkIHJlY2FsY1N0eWxlKFN0
eWxlQ2hhbmdlID0gTm9DaGFuZ2UpOwogCiAgICAgRWxlbWVudFNoYWRvdyogc2hhZG93KCkgY29u
c3Q7CkBAIC00MjUsNyArNDI2LDcgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBpc1NwZWxs
Q2hlY2tpbmdFbmFibGVkKCkgY29uc3Q7CiAKICAgICBQYXNzUmVmUHRyPFdlYktpdEFuaW1hdGlv
bkxpc3Q+IHdlYmtpdEdldEFuaW1hdGlvbnMoKSBjb25zdDsKLSAgICAKKwogICAgIFBhc3NSZWZQ
dHI8UmVuZGVyU3R5bGU+IHN0eWxlRm9yUmVuZGVyZXIoKTsKIAogICAgIFJlbmRlclJlZ2lvbiog
cmVuZGVyUmVnaW9uKCkgY29uc3Q7CkBAIC01MzAsMTMgKzUzMSwxNCBAQCBwcml2YXRlOgogCiAg
ICAgYm9vbCBzaG91bGRJbnZhbGlkYXRlRGlzdHJpYnV0aW9uV2hlbkF0dHJpYnV0ZUNoYW5nZWQo
RWxlbWVudFNoYWRvdyosIGNvbnN0IFF1YWxpZmllZE5hbWUmLCBjb25zdCBBdG9taWNTdHJpbmcm
KTsKIAotcHJpdmF0ZToKICAgICBFbGVtZW50UmFyZURhdGEqIGVsZW1lbnRSYXJlRGF0YSgpIGNv
bnN0OwogICAgIEVsZW1lbnRSYXJlRGF0YSogZW5zdXJlRWxlbWVudFJhcmVEYXRhKCk7CiAKICAg
ICB2b2lkIGRldGFjaEFsbEF0dHJOb2Rlc0Zyb21FbGVtZW50KCk7CiAgICAgdm9pZCBkZXRhY2hB
dHRyTm9kZUZyb21FbGVtZW50V2l0aFZhbHVlKEF0dHIqLCBjb25zdCBBdG9taWNTdHJpbmcmIHZh
bHVlKTsKIAorICAgIHZvaWQgY3JlYXRlUmVuZGVyZXJJZk5lZWRlZCgpOworCiAgICAgUmVmUHRy
PEVsZW1lbnRBdHRyaWJ1dGVEYXRhPiBtX2F0dHJpYnV0ZURhdGE7CiB9OwogICAgIApJbmRleDog
U291cmNlL1dlYkNvcmUvZG9tL05vZGUuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2RvbS9Ob2RlLmNwcAkocmV2aXNpb24gMTM1NjE4KQorKysgU291cmNlL1dlYkNvcmUvZG9tL05v
ZGUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xMjY3LDcgKzEyNjcsNyBAQCB2b2lkIE5vZGU6OmF0
dGFjaCgpCiAKICAgICAvLyBGSVhNRTogVGhpcyBpcyBPKE5eMikgZm9yIHRoZSBpbm5lckhUTUwg
Y2FzZSwgd2hlcmUgYWxsIGNoaWxkcmVuIGFyZSByZXBsYWNlZCBhdCBvbmNlIChhbmQgbm90IGF0
dGFjaGVkKS4KICAgICAvLyBJZiB0aGlzIG5vZGUgZ290IGEgcmVuZGVyZXIgaXQgbWF5IGJlIHRo
ZSBwcmV2aW91c1JlbmRlcmVyKCkgb2Ygc2libGluZyB0ZXh0IG5vZGVzIGFuZCB0aHVzIGFmZmVj
dCB0aGUKLSAgICAvLyByZXN1bHQgb2YgVGV4dDo6cmVuZGVyZXJJc05lZWRlZCgpIGZvciB0aG9z
ZSBub2Rlcy4KKyAgICAvLyByZXN1bHQgb2YgVGV4dDo6dGV4dFJlbmRlcmVySXNOZWVkZWQoKSBm
b3IgdGhvc2Ugbm9kZXMuCiAgICAgaWYgKHJlbmRlcmVyKCkpIHsKICAgICAgICAgZm9yIChOb2Rl
KiBuZXh0ID0gbmV4dFNpYmxpbmcoKTsgbmV4dDsgbmV4dCA9IG5leHQtPm5leHRTaWJsaW5nKCkp
IHsKICAgICAgICAgICAgIGlmIChuZXh0LT5yZW5kZXJlcigpKQpAQCAtMTI3NSw3ICsxMjc1LDcg
QEAgdm9pZCBOb2RlOjphdHRhY2goKQogICAgICAgICAgICAgaWYgKCFuZXh0LT5hdHRhY2hlZCgp
KQogICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gQXNzdW1lIHRoaXMgbWVhbnMgbm9uZSBvZiB0
aGUgZm9sbG93aW5nIHNpYmxpbmdzIGFyZSBhdHRhY2hlZC4KICAgICAgICAgICAgIGlmIChuZXh0
LT5pc1RleHROb2RlKCkpCi0gICAgICAgICAgICAgICAgbmV4dC0+Y3JlYXRlUmVuZGVyZXJJZk5l
ZWRlZCgpOworICAgICAgICAgICAgICAgIHRvVGV4dChuZXh0KS0+Y3JlYXRlVGV4dFJlbmRlcmVy
SWZOZWVkZWQoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTM5NSwyMiArMTM5NSw2IEBAIENv
bnRhaW5lck5vZGUqIE5vZGU6OnBhcmVudE5vZGVGb3JSZW5kZXIKICAgICByZXR1cm4gTm9kZVJl
bmRlcmluZ0NvbnRleHQodGhpcykucGFyZW50Tm9kZUZvclJlbmRlcmluZ0FuZFN0eWxlKCk7CiB9
CiAKLXZvaWQgTm9kZTo6Y3JlYXRlUmVuZGVyZXJJZk5lZWRlZCgpCi17Ci0gICAgTm9kZVJlbmRl
cmluZ0NvbnRleHQodGhpcykuY3JlYXRlUmVuZGVyZXJJZk5lZWRlZCgpOwotfQotCi1ib29sIE5v
ZGU6OnJlbmRlcmVySXNOZWVkZWQoY29uc3QgTm9kZVJlbmRlcmluZ0NvbnRleHQmIGNvbnRleHQp
Ci17Ci0gICAgcmV0dXJuIChkb2N1bWVudCgpLT5kb2N1bWVudEVsZW1lbnQoKSA9PSB0aGlzKSB8
fCAoY29udGV4dC5zdHlsZSgpLT5kaXNwbGF5KCkgIT0gTk9ORSk7Ci19Ci0KLVJlbmRlck9iamVj
dCogTm9kZTo6Y3JlYXRlUmVuZGVyZXIoUmVuZGVyQXJlbmEqLCBSZW5kZXJTdHlsZSopCi17Ci0g
ICAgQVNTRVJUX05PVF9SRUFDSEVEKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIFJlbmRlclN0eWxl
KiBOb2RlOjp2aXJ0dWFsQ29tcHV0ZWRTdHlsZShQc2V1ZG9JZCBwc2V1ZG9FbGVtZW50U3BlY2lm
aWVyKQogewogICAgIHJldHVybiBwYXJlbnRPckhvc3ROb2RlKCkgPyBwYXJlbnRPckhvc3ROb2Rl
KCktPmNvbXB1dGVkU3R5bGUocHNldWRvRWxlbWVudFNwZWNpZmllcikgOiAwOwpJbmRleDogU291
cmNlL1dlYkNvcmUvZG9tL05vZGUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20v
Tm9kZS5oCShyZXZpc2lvbiAxMzU2MTgpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vTm9kZS5oCSh3
b3JraW5nIGNvcHkpCkBAIC01MzksMTAgKzUzOSw2IEBAIHB1YmxpYzoKIAogICAgIHZvaWQgcmVh
dHRhY2goKTsKICAgICB2b2lkIHJlYXR0YWNoSWZBdHRhY2hlZCgpOwotICAgIHZvaWQgY3JlYXRl
UmVuZGVyZXJJZk5lZWRlZCgpOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGNv
bnN0IE5vZGVSZW5kZXJpbmdDb250ZXh0Jik7Ci0gICAgdmlydHVhbCBib29sIGNoaWxkU2hvdWxk
Q3JlYXRlUmVuZGVyZXIoY29uc3QgTm9kZVJlbmRlcmluZ0NvbnRleHQmKSBjb25zdCB7IHJldHVy
biB0cnVlOyB9Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGNyZWF0ZVJlbmRlcmVyKFJlbmRl
ckFyZW5hKiwgUmVuZGVyU3R5bGUqKTsKICAgICBDb250YWluZXJOb2RlKiBwYXJlbnROb2RlRm9y
UmVuZGVyaW5nQW5kU3R5bGUoKTsKICAgICAKICAgICAvLyBXcmFwcGVyIGZvciBub2RlcyB0aGF0
IGRvbid0IGhhdmUgYSByZW5kZXJlciwgYnV0IHN0aWxsIGNhY2hlIHRoZSBzdHlsZSAobGlrZSBI
VE1MT3B0aW9uRWxlbWVudCkuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9kb20vTm9kZVJlbmRlcmlu
Z0NvbnRleHQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2RvbS9Ob2RlUmVuZGVy
aW5nQ29udGV4dC5jcHAJKHJldmlzaW9uIDEzNTYxOCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9O
b2RlUmVuZGVyaW5nQ29udGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM4LDkgKzM4LDExIEBA
CiAjaW5jbHVkZSAiUmVuZGVyRnVsbFNjcmVlbi5oIgogI2luY2x1ZGUgIlJlbmRlck5hbWVkRmxv
d1RocmVhZC5oIgogI2luY2x1ZGUgIlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlJlbmRlclRl
eHQuaCIKICNpbmNsdWRlICJSZW5kZXJWaWV3LmgiCiAjaW5jbHVkZSAiU2hhZG93Um9vdC5oIgog
I2luY2x1ZGUgIlN0eWxlSW5oZXJpdGVkRGF0YS5oIgorI2luY2x1ZGUgIlRleHQuaCIKIAogI2lm
IEVOQUJMRShTVkcpCiAjaW5jbHVkZSAiU1ZHTmFtZXMuaCIKQEAgLTIwMSwyMSArMjAzLDIxIEBA
IHN0YXRpYyB2b2lkIGFkanVzdEluc2VydGlvblBvaW50Rm9yVG9wTGEKIH0KICNlbmRpZgogCi12
b2lkIE5vZGVSZW5kZXJpbmdDb250ZXh0OjpjcmVhdGVSZW5kZXJlcklmTmVlZGVkKCkKK3ZvaWQg
Tm9kZVJlbmRlcmluZ0NvbnRleHQ6OmNyZWF0ZVJlbmRlcmVyRm9yRWxlbWVudElmTmVlZGVkKCkK
IHsKICAgICBBU1NFUlQoIW1fbm9kZS0+cmVuZGVyZXIoKSk7CiAKKyAgICBFbGVtZW50KiBlbGVt
ZW50ID0gdG9FbGVtZW50KG1fbm9kZSk7CisKICAgICBpZiAoIXNob3VsZENyZWF0ZVJlbmRlcmVy
KCkpCiAgICAgICAgIHJldHVybjsKLSAgICBFbGVtZW50KiBlbGVtZW50ID0gbV9ub2RlLT5pc0Vs
ZW1lbnROb2RlKCkgPyB0b0VsZW1lbnQobV9ub2RlKSA6IDA7Ci0gICAgCi0gICAgbV9zdHlsZSA9
IGVsZW1lbnQgPyBlbGVtZW50LT5zdHlsZUZvclJlbmRlcmVyKCkgOiBwYXJlbnRSZW5kZXJlcigp
LT5zdHlsZSgpOworICAgIG1fc3R5bGUgPSBlbGVtZW50LT5zdHlsZUZvclJlbmRlcmVyKCk7CiAg
ICAgQVNTRVJUKG1fc3R5bGUpOwogCiAgICAgbW92ZVRvRmxvd1RocmVhZElmTmVlZGVkKCk7CiAK
LSAgICBpZiAoIW1fbm9kZS0+cmVuZGVyZXJJc05lZWRlZCgqdGhpcykpIHsKLSAgICAgICAgaWYg
KGVsZW1lbnQgJiYgbV9zdHlsZS0+YWZmZWN0ZWRCeUVtcHR5KCkpCisgICAgaWYgKCFlbGVtZW50
LT5yZW5kZXJlcklzTmVlZGVkKCp0aGlzKSkgeworICAgICAgICBpZiAobV9zdHlsZS0+YWZmZWN0
ZWRCeUVtcHR5KCkpCiAgICAgICAgICAgICBlbGVtZW50LT5zZXRTdHlsZUFmZmVjdGVkQnlFbXB0
eSgpOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMjIzLDIzICsyMjUsMjMgQEAgdm9pZCBO
b2RlUmVuZGVyaW5nQ29udGV4dDo6Y3JlYXRlUmVuZGVyZQogICAgIFJlbmRlck9iamVjdCogbmV4
dFJlbmRlcmVyID0gdGhpcy0+bmV4dFJlbmRlcmVyKCk7CiAKICNpZiBFTkFCTEUoRElBTE9HX0VM
RU1FTlQpCi0gICAgaWYgKGVsZW1lbnQgJiYgZWxlbWVudC0+aXNJblRvcExheWVyKCkpCisgICAg
aWYgKGVsZW1lbnQtPmlzSW5Ub3BMYXllcigpKQogICAgICAgICBhZGp1c3RJbnNlcnRpb25Qb2lu
dEZvclRvcExheWVyRWxlbWVudChlbGVtZW50LCBwYXJlbnRSZW5kZXJlciwgbmV4dFJlbmRlcmVy
KTsKICNlbmRpZgogCi0gICAgRG9jdW1lbnQqIGRvY3VtZW50ID0gbV9ub2RlLT5kb2N1bWVudCgp
OwotICAgIFJlbmRlck9iamVjdCogbmV3UmVuZGVyZXIgPSBtX25vZGUtPmNyZWF0ZVJlbmRlcmVy
KGRvY3VtZW50LT5yZW5kZXJBcmVuYSgpLCBtX3N0eWxlLmdldCgpKTsKKyAgICBEb2N1bWVudCog
ZG9jdW1lbnQgPSBlbGVtZW50LT5kb2N1bWVudCgpOworICAgIFJlbmRlck9iamVjdCogbmV3UmVu
ZGVyZXIgPSBlbGVtZW50LT5jcmVhdGVSZW5kZXJlcihkb2N1bWVudC0+cmVuZGVyQXJlbmEoKSwg
bV9zdHlsZS5nZXQoKSk7CiAgICAgaWYgKCFuZXdSZW5kZXJlcikKICAgICAgICAgcmV0dXJuOwog
ICAgIGlmICghcGFyZW50UmVuZGVyZXItPmlzQ2hpbGRBbGxvd2VkKG5ld1JlbmRlcmVyLCBtX3N0
eWxlLmdldCgpKSkgewogICAgICAgICBuZXdSZW5kZXJlci0+ZGVzdHJveSgpOwogICAgICAgICBy
ZXR1cm47CiAgICAgfQotICAgIG1fbm9kZS0+c2V0UmVuZGVyZXIobmV3UmVuZGVyZXIpOworICAg
IGVsZW1lbnQtPnNldFJlbmRlcmVyKG5ld1JlbmRlcmVyKTsKICAgICBuZXdSZW5kZXJlci0+c2V0
QW5pbWF0YWJsZVN0eWxlKG1fc3R5bGUucmVsZWFzZSgpKTsgLy8gc2V0QW5pbWF0YWJsZVN0eWxl
KCkgY2FuIGRlcGVuZCBvbiByZW5kZXJlcigpIGFscmVhZHkgYmVpbmcgc2V0LgogCiAjaWYgRU5B
QkxFKEZVTExTQ1JFRU5fQVBJKQotICAgIGlmIChkb2N1bWVudC0+d2Via2l0SXNGdWxsU2NyZWVu
KCkgJiYgZG9jdW1lbnQtPndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpID09IG1fbm9k
ZSkgeworICAgIGlmIChkb2N1bWVudC0+d2Via2l0SXNGdWxsU2NyZWVuKCkgJiYgZG9jdW1lbnQt
PndlYmtpdEN1cnJlbnRGdWxsU2NyZWVuRWxlbWVudCgpID09IGVsZW1lbnQpIHsKICAgICAgICAg
bmV3UmVuZGVyZXIgPSBSZW5kZXJGdWxsU2NyZWVuOjp3cmFwUmVuZGVyZXIobmV3UmVuZGVyZXIs
IHBhcmVudFJlbmRlcmVyLCBkb2N1bWVudCk7CiAgICAgICAgIGlmICghbmV3UmVuZGVyZXIpCiAg
ICAgICAgICAgICByZXR1cm47CkBAIC0yNDksNCArMjUxLDMzIEBAIHZvaWQgTm9kZVJlbmRlcmlu
Z0NvbnRleHQ6OmNyZWF0ZVJlbmRlcmUKICAgICBwYXJlbnRSZW5kZXJlci0+YWRkQ2hpbGQobmV3
UmVuZGVyZXIsIG5leHRSZW5kZXJlcik7CiB9CiAKK3ZvaWQgTm9kZVJlbmRlcmluZ0NvbnRleHQ6
OmNyZWF0ZVJlbmRlcmVyRm9yVGV4dElmTmVlZGVkKCkKK3sKKyAgICBBU1NFUlQoIW1fbm9kZS0+
cmVuZGVyZXIoKSk7CisKKyAgICBUZXh0KiB0ZXh0Tm9kZSA9IHRvVGV4dChtX25vZGUpOworCisg
ICAgaWYgKCFzaG91bGRDcmVhdGVSZW5kZXJlcigpKQorICAgICAgICByZXR1cm47CisgICAgUmVu
ZGVyT2JqZWN0KiBwYXJlbnRSZW5kZXJlciA9IHRoaXMtPnBhcmVudFJlbmRlcmVyKCk7CisgICAg
QVNTRVJUKHBhcmVudFJlbmRlcmVyKTsKKyAgICBtX3N0eWxlID0gcGFyZW50UmVuZGVyZXItPnN0
eWxlKCk7CisKKyAgICBpZiAoIXRleHROb2RlLT50ZXh0UmVuZGVyZXJJc05lZWRlZCgqdGhpcykp
CisgICAgICAgIHJldHVybjsKKyAgICBEb2N1bWVudCogZG9jdW1lbnQgPSB0ZXh0Tm9kZS0+ZG9j
dW1lbnQoKTsKKyAgICBSZW5kZXJUZXh0KiBuZXdSZW5kZXJlciA9IHRleHROb2RlLT5jcmVhdGVU
ZXh0UmVuZGVyZXIoZG9jdW1lbnQtPnJlbmRlckFyZW5hKCksIG1fc3R5bGUuZ2V0KCkpOworICAg
IGlmICghbmV3UmVuZGVyZXIpCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoIXBhcmVudFJlbmRl
cmVyLT5pc0NoaWxkQWxsb3dlZChuZXdSZW5kZXJlciwgbV9zdHlsZS5nZXQoKSkpIHsKKyAgICAg
ICAgbmV3UmVuZGVyZXItPmRlc3Ryb3koKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBS
ZW5kZXJPYmplY3QqIG5leHRSZW5kZXJlciA9IHRoaXMtPm5leHRSZW5kZXJlcigpOworICAgIHRl
eHROb2RlLT5zZXRSZW5kZXJlcihuZXdSZW5kZXJlcik7CisgICAgLy8gUmVuZGVyVGV4dCBkb2Vz
IG5vdCBhbmltYXRlLCBubyBuZWVkIHRvIGNhbGwgc2V0QW5pbWF0YWJsZVN0eWxlLgorICAgIG5l
d1JlbmRlcmVyLT5zZXRTdHlsZShtX3N0eWxlLnJlbGVhc2UoKSk7CisgICAgcGFyZW50UmVuZGVy
ZXItPmFkZENoaWxkKG5ld1JlbmRlcmVyLCBuZXh0UmVuZGVyZXIpOworfQorCiB9CkluZGV4OiBT
b3VyY2UvV2ViQ29yZS9kb20vTm9kZVJlbmRlcmluZ0NvbnRleHQuaAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBT
b3VyY2UvV2ViQ29yZS9kb20vTm9kZVJlbmRlcmluZ0NvbnRleHQuaAkocmV2aXNpb24gMTM1NjE4
KQorKysgU291cmNlL1dlYkNvcmUvZG9tL05vZGVSZW5kZXJpbmdDb250ZXh0LmgJKHdvcmtpbmcg
Y29weSkKQEAgLTQ4LDcgKzQ4LDggQEAgcHVibGljOgogICAgIE5vZGVSZW5kZXJpbmdDb250ZXh0
KE5vZGUqLCBSZW5kZXJTdHlsZSopOwogICAgIH5Ob2RlUmVuZGVyaW5nQ29udGV4dCgpOwogCi0g
ICAgdm9pZCBjcmVhdGVSZW5kZXJlcklmTmVlZGVkKCk7CisgICAgdm9pZCBjcmVhdGVSZW5kZXJl
ckZvclRleHRJZk5lZWRlZCgpOworICAgIHZvaWQgY3JlYXRlUmVuZGVyZXJGb3JFbGVtZW50SWZO
ZWVkZWQoKTsKIAogICAgIE5vZGUqIG5vZGUoKSBjb25zdDsKICAgICBDb250YWluZXJOb2RlKiBw
YXJlbnROb2RlRm9yUmVuZGVyaW5nQW5kU3R5bGUoKSBjb25zdDsKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL2RvbS9UZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9kb20vVGV4dC5j
cHAJKHJldmlzaW9uIDEzNTYxOCkKKysrIFNvdXJjZS9XZWJDb3JlL2RvbS9UZXh0LmNwcAkod29y
a2luZyBjb3B5KQpAQCAtMTk1LDExICsxOTUsMTUgQEAgUGFzc1JlZlB0cjxOb2RlPiBUZXh0Ojpj
bG9uZU5vZGUoYm9vbCAvKgogICAgIHJldHVybiBjcmVhdGUoZG9jdW1lbnQoKSwgZGF0YSgpKTsK
IH0KIAotYm9vbCBUZXh0OjpyZW5kZXJlcklzTmVlZGVkKGNvbnN0IE5vZGVSZW5kZXJpbmdDb250
ZXh0JiBjb250ZXh0KQorYm9vbCBUZXh0Ojp0ZXh0UmVuZGVyZXJJc05lZWRlZChjb25zdCBOb2Rl
UmVuZGVyaW5nQ29udGV4dCYgY29udGV4dCkKIHsKICAgICBpZiAoaXNFZGl0aW5nVGV4dCgpKQog
ICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoIUNoYXJhY3RlckRhdGE6OnJlbmRlcmVySXNO
ZWVkZWQoY29udGV4dCkpCisKKyAgICBpZiAoIWxlbmd0aCgpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBpZiAoY29udGV4dC5zdHlsZSgpLT5kaXNwbGF5KCkgPT0gTk9ORSkKICAgICAg
ICAgcmV0dXJuIGZhbHNlOwogCiAgICAgYm9vbCBvbmx5V1MgPSBjb250YWluc09ubHlXaGl0ZXNw
YWNlKCk7CkBAIC0yNTIsMTMgKzI1NiwxNyBAQCBzdGF0aWMgYm9vbCBpc1NWR1RleHQoVGV4dCog
dGV4dCkKIH0KICNlbmRpZgogCi1SZW5kZXJPYmplY3QqIFRleHQ6OmNyZWF0ZVJlbmRlcmVyKFJl
bmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqIHN0eWxlKQordm9pZCBUZXh0OjpjcmVhdGVU
ZXh0UmVuZGVyZXJJZk5lZWRlZCgpCit7CisgICAgTm9kZVJlbmRlcmluZ0NvbnRleHQodGhpcyku
Y3JlYXRlUmVuZGVyZXJGb3JUZXh0SWZOZWVkZWQoKTsKK30KKworUmVuZGVyVGV4dCogVGV4dDo6
Y3JlYXRlVGV4dFJlbmRlcmVyKFJlbmRlckFyZW5hKiBhcmVuYSwgUmVuZGVyU3R5bGUqIHN0eWxl
KQogewogI2lmIEVOQUJMRShTVkcpCiAgICAgaWYgKGlzU1ZHVGV4dCh0aGlzKSB8fCBpc1NWR1No
YWRvd1RleHQodGhpcykpCiAgICAgICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJTVkdJbmxp
bmVUZXh0KHRoaXMsIGRhdGFJbXBsKCkpOwogI2VuZGlmCi0KICAgICBpZiAoc3R5bGUtPmhhc1Rl
eHRDb21iaW5lKCkpCiAgICAgICAgIHJldHVybiBuZXcgKGFyZW5hKSBSZW5kZXJDb21iaW5lVGV4
dCh0aGlzLCBkYXRhSW1wbCgpKTsKIApAQCAtMjY3LDE0ICsyNzUsMTMgQEAgUmVuZGVyT2JqZWN0
KiBUZXh0OjpjcmVhdGVSZW5kZXJlcihSZW5kZQogCiB2b2lkIFRleHQ6OmF0dGFjaCgpCiB7Ci0g
ICAgY3JlYXRlUmVuZGVyZXJJZk5lZWRlZCgpOworICAgIGNyZWF0ZVRleHRSZW5kZXJlcklmTmVl
ZGVkKCk7CiAgICAgQ2hhcmFjdGVyRGF0YTo6YXR0YWNoKCk7CiB9CiAKIHZvaWQgVGV4dDo6cmVj
YWxjVGV4dFN0eWxlKFN0eWxlQ2hhbmdlIGNoYW5nZSkKIHsKLSAgICBSZW5kZXJPYmplY3QqIHJl
bmRlcmVyID0gdGhpcy0+cmVuZGVyZXIoKTsKLQorICAgIFJlbmRlclRleHQqIHJlbmRlcmVyID0g
dG9SZW5kZXJUZXh0KHRoaXMtPnJlbmRlcmVyKCkpOwogICAgIC8vIFRoZSBvbmx5IHRpbWUgd2Ug
aGF2ZSBhIHJlbmRlcmVyIGFuZCBvdXIgcGFyZW50IGRvZXNuJ3QgaXMgaWYgb3VyIHBhcmVudAog
ICAgIC8vIGlzIGEgc2hhZG93IHJvb3QuCiAgICAgaWYgKGNoYW5nZSAhPSBOb0NoYW5nZSAmJiBy
ZW5kZXJlcikgewpAQCAtMjg3LDE1ICsyOTQsMjYgQEAgdm9pZCBUZXh0OjpyZWNhbGNUZXh0U3R5
bGUoU3R5bGVDaGFuZ2UgYwogICAgIH0KIAogICAgIGlmIChuZWVkc1N0eWxlUmVjYWxjKCkpIHsK
LSAgICAgICAgaWYgKHJlbmRlcmVyKSB7Ci0gICAgICAgICAgICBpZiAocmVuZGVyZXItPmlzVGV4
dCgpKQotICAgICAgICAgICAgICAgIHRvUmVuZGVyVGV4dChyZW5kZXJlciktPnNldFRleHQoZGF0
YUltcGwoKSk7Ci0gICAgICAgIH0gZWxzZQorICAgICAgICBpZiAocmVuZGVyZXIpCisgICAgICAg
ICAgICByZW5kZXJlci0+c2V0VGV4dChkYXRhSW1wbCgpKTsKKyAgICAgICAgZWxzZQogICAgICAg
ICAgICAgcmVhdHRhY2goKTsKICAgICB9CiAgICAgY2xlYXJOZWVkc1N0eWxlUmVjYWxjKCk7CiB9
CiAKK3ZvaWQgVGV4dDo6dXBkYXRlVGV4dFJlbmRlcmVyKHVuc2lnbmVkIG9mZnNldE9mUmVwbGFj
ZWREYXRhLCB1bnNpZ25lZCBsZW5ndGhPZlJlcGxhY2VkRGF0YSkKK3sKKyAgICBpZiAoIWF0dGFj
aGVkKCkpCisgICAgICAgIHJldHVybjsKKyAgICBSZW5kZXJUZXh0KiB0ZXh0UmVuZGVyZXIgPSB0
b1JlbmRlclRleHQocmVuZGVyZXIoKSk7CisgICAgaWYgKCF0ZXh0UmVuZGVyZXIgfHwgIXRleHRS
ZW5kZXJlcklzTmVlZGVkKE5vZGVSZW5kZXJpbmdDb250ZXh0KHRoaXMsIHRleHRSZW5kZXJlci0+
c3R5bGUoKSkpKSB7CisgICAgICAgIHJlYXR0YWNoKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisgICAgdGV4dFJlbmRlcmVyLT5zZXRUZXh0V2l0aE9mZnNldChkYXRhSW1wbCgpLCBvZmZzZXRP
ZlJlcGxhY2VkRGF0YSwgbGVuZ3RoT2ZSZXBsYWNlZERhdGEpOworfQorCiBib29sIFRleHQ6OmNo
aWxkVHlwZUFsbG93ZWQoTm9kZVR5cGUpIGNvbnN0CiB7CiAgICAgcmV0dXJuIGZhbHNlOwpJbmRl
eDogU291cmNlL1dlYkNvcmUvZG9tL1RleHQuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29y
ZS9kb20vVGV4dC5oCShyZXZpc2lvbiAxMzU2MTgpCisrKyBTb3VyY2UvV2ViQ29yZS9kb20vVGV4
dC5oCSh3b3JraW5nIGNvcHkpCkBAIC0yNiw3ICsyNiw5IEBACiAjaW5jbHVkZSAiQ2hhcmFjdGVy
RGF0YS5oIgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7Ci0gICAgCisKK2NsYXNzIFJlbmRlclRleHQ7
CisKIGNsYXNzIFRleHQgOiBwdWJsaWMgQ2hhcmFjdGVyRGF0YSB7CiBwdWJsaWM6CiAgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIGRlZmF1bHRMZW5ndGhMaW1pdCA9IDEgPDwgMTY7CkBAIC00Myw2
ICs0NSwxMCBAQCBwdWJsaWM6CiAgICAgUGFzc1JlZlB0cjxUZXh0PiByZXBsYWNlV2hvbGVUZXh0
KGNvbnN0IFN0cmluZyYsIEV4Y2VwdGlvbkNvZGUmKTsKICAgICAKICAgICB2b2lkIHJlY2FsY1Rl
eHRTdHlsZShTdHlsZUNoYW5nZSk7CisgICAgdm9pZCBjcmVhdGVUZXh0UmVuZGVyZXJJZk5lZWRl
ZCgpOworICAgIGJvb2wgdGV4dFJlbmRlcmVySXNOZWVkZWQoY29uc3QgTm9kZVJlbmRlcmluZ0Nv
bnRleHQmKTsKKyAgICBSZW5kZXJUZXh0KiBjcmVhdGVUZXh0UmVuZGVyZXIoUmVuZGVyQXJlbmEq
LCBSZW5kZXJTdHlsZSopOworICAgIHZvaWQgdXBkYXRlVGV4dFJlbmRlcmVyKHVuc2lnbmVkIG9m
ZnNldE9mUmVwbGFjZWREYXRhLCB1bnNpZ25lZCBsZW5ndGhPZlJlcGxhY2VkRGF0YSk7CiAKICAg
ICB2aXJ0dWFsIHZvaWQgYXR0YWNoKCk7CiAgICAgCkBAIC01OCw4ICs2NCw2IEBAIHByaXZhdGU6
CiAgICAgdmlydHVhbCBTdHJpbmcgbm9kZU5hbWUoKSBjb25zdDsKICAgICB2aXJ0dWFsIE5vZGVU
eXBlIG5vZGVUeXBlKCkgY29uc3Q7CiAgICAgdmlydHVhbCBQYXNzUmVmUHRyPE5vZGU+IGNsb25l
Tm9kZShib29sIGRlZXApOwotICAgIHZpcnR1YWwgYm9vbCByZW5kZXJlcklzTmVlZGVkKGNvbnN0
IE5vZGVSZW5kZXJpbmdDb250ZXh0Jik7Ci0gICAgdmlydHVhbCBSZW5kZXJPYmplY3QqIGNyZWF0
ZVJlbmRlcmVyKFJlbmRlckFyZW5hKiwgUmVuZGVyU3R5bGUqKTsKICAgICB2aXJ0dWFsIGJvb2wg
Y2hpbGRUeXBlQWxsb3dlZChOb2RlVHlwZSkgY29uc3Q7CiAKICAgICB2aXJ0dWFsIFBhc3NSZWZQ
dHI8VGV4dD4gdmlydHVhbENyZWF0ZShjb25zdCBTdHJpbmcmKTsKSW5kZXg6IFNvdXJjZS9XZWJD
b3JlL3JlbmRlcmluZy9SZW5kZXJCbG9jay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkocmV2aXNpb24gMTM1NjE4KQorKysgU291cmNl
L1dlYkNvcmUvcmVuZGVyaW5nL1JlbmRlckJsb2NrLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNTYw
LDcgKzU2MCw3IEBAIFJlbmRlckJsb2NrKiBSZW5kZXJCbG9jazo6Y2xvbmUoKSBjb25zdAogICAg
ICAgICBjbG9uZUJsb2NrLT5zZXRDaGlsZHJlbklubGluZShjaGlsZHJlbklubGluZSgpKTsKICAg
ICB9CiAgICAgZWxzZSB7Ci0gICAgICAgIFJlbmRlck9iamVjdCogY2xvbmVSZW5kZXJlciA9IG5v
ZGUoKS0+Y3JlYXRlUmVuZGVyZXIocmVuZGVyQXJlbmEoKSwgc3R5bGUoKSk7CisgICAgICAgIFJl
bmRlck9iamVjdCogY2xvbmVSZW5kZXJlciA9IHRvRWxlbWVudChub2RlKCkpLT5jcmVhdGVSZW5k
ZXJlcihyZW5kZXJBcmVuYSgpLCBzdHlsZSgpKTsKICAgICAgICAgY2xvbmVCbG9jayA9IHRvUmVu
ZGVyQmxvY2soY2xvbmVSZW5kZXJlcik7CiAgICAgICAgIGNsb25lQmxvY2stPnNldFN0eWxlKHN0
eWxlKCkpOwogCg==
</data>
<flag name="review"
          id="191432"
          type_id="1"
          status="+"
          setter="ojan"
    />
          </attachment>
      

    </bug>

</bugzilla>