<?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>129065</bug_id>
          
          <creation_ts>2014-02-19 14:47:09 -0800</creation_ts>
          <short_desc>Render tree construction is O(N^2) in number of siblings</short_desc>
          <delta_ts>2014-03-26 11:38:54 -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>Layout and Rendering</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>http://jsfiddle.net/vwG2J/2/</bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Maciej Stachowiak">mjs</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>aroben</cc>
    
    <cc>bjonesbe</cc>
    
    <cc>dbates</cc>
    
    <cc>koivisto</cc>
    
    <cc>lvidacs.u-szeged</cc>
    
    <cc>ossy</cc>
    
    <cc>sergio</cc>
    
    <cc>sun.shin</cc>
    
    <cc>tgergely.u-szeged</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>982554</commentid>
    <comment_count>0</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2014-02-19 14:47:09 -0800</bug_when>
    <thetext>Render tree construction is O(N^2) in the number of sibling nodes.

Here is a test case and JSFiddle link demonstrating the issue; if you create 10x as many nodes, the time growth is approximately quadratic, rather than linear.

var t = Date.now();
for (var i = 0; i &lt; 5000; ++i)
  document.body.appendChild(document.createElement(&apos;div&apos;));
document.body.offsetTop;
document.body.textContent = Date.now() - t;

http://jsfiddle.net/vwG2J/2/


Blink fixed this by assembling the Render tree (approximately) backwards:
https://codereview.chromium.org/24350009


I am not sure offhand if this is the best or only solution.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>982556</commentid>
    <comment_count>1</comment_count>
    <who name="Maciej Stachowiak">mjs</who>
    <bug_when>2014-02-19 14:48:48 -0800</bug_when>
    <thetext>&lt;rdar://problem/16114572&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>994205</commentid>
    <comment_count>2</comment_count>
      <attachid>227760</attachid>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2014-03-25 09:22:11 -0700</bug_when>
    <thetext>Created attachment 227760
patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>994210</commentid>
    <comment_count>3</comment_count>
      <attachid>227760</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-03-25 09:36:10 -0700</bug_when>
    <thetext>Comment on attachment 227760
patch

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

The approach here looks good. The details are a little confusing.

&gt; Source/WebCore/style/StyleResolveTree.cpp:7
&gt; + * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012, 2013, 2014 Apple Inc. All rights reserved.

We learned recently that year ranges are OK. So this should say:

    2004-2010, 2012-2014

&gt; Source/WebCore/style/StyleResolveTree.cpp:75
&gt; +    RenderObject* before;

The name “before” here is not so great. We name the other member “parent”, not “above” or “containing”, despite the fact that it’s not really the parent of anything. I think this might be clearer as “nextSibling”.

&gt; Source/WebCore/style/StyleResolveTree.cpp:76
&gt; +    bool isValid;

I don’t think that from this name it’s clear that isValid is specifically about the before field. I think it should probably be named nextSiblingPointerIsValid.

I find that the rules for when a RenderTreePosition is valid and when it might not be are confusing.

&gt; Source/WebCore/style/StyleResolveTree.cpp:78
&gt; +    unsigned assertCount;

I would call this assertionLimitCounter.

&gt; Source/WebCore/style/StyleResolveTree.cpp:237
&gt; +static void computeRenderTreePositionIfNeeded(RenderTreePosition&amp; renderTreePosition, const Node&amp; node, ContainerNode&amp; renderingParentNode)

I don’t think the IfNeeded suffix in these two function names helps. I would just take it out.

&gt; Source/WebCore/style/StyleResolveTree.cpp:249
&gt; +static void invalidateRenderTreePositionIfNeeded(RenderTreePosition&amp; renderTreePosition, const Node&amp; node)

I don’t think the IfNeeded suffix in these two function names helps. I would just take it out.

&gt; Source/WebCore/style/StyleResolveTree.cpp:280
&gt; +    ASSERT(renderTreePosition.isValid);

Making the position a little more of a class would be good. Then the assertion that the pointer is valid could be a part of the getter rather than something we assert here, but use elsewhere.

&gt; Source/WebCore/style/StyleResolveTree.cpp:285
&gt; +        insertionPosition.before = parentFlowRenderer-&gt;nextRendererForElement(element);

It’s strange and subtle that we rely on the fact that isValid is already set here.

&gt; LayoutTests/fast/css/sibling-renderer-On2.html:11
&gt; +shouldBe(&quot;timeRenderTreeCreation(5000) &lt; 20 * timeRenderTreeCreation(500)&quot;, &quot;true&quot;);

I’m surprised you made a custom test here. I would have suggested instead doing a LayoutTests/perf test; those are designed to check that things are linear.

But perhaps the number &quot;20&quot; here is related to the the number &quot;20&quot; in the assertion limit count for debug builds?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>994213</commentid>
    <comment_count>4</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2014-03-25 09:41:56 -0700</bug_when>
    <thetext>&gt; I’m surprised you made a custom test here. I would have suggested instead doing a LayoutTests/perf test; those are designed to check that things are linear.

I didn&apos;t know about LayoutTests/perf. It is not immediately obvious to me how they are better but I&apos;ll move/refactor the test.

&gt; But perhaps the number &quot;20&quot; here is related to the the number &quot;20&quot; in the assertion limit count for debug builds?

No it isn&apos;t.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>994657</commentid>
    <comment_count>5</comment_count>
    <who name="Antti Koivisto">koivisto</who>
    <bug_when>2014-03-26 11:38:43 -0700</bug_when>
    <thetext>https://trac.webkit.org/r166303

Factored RenderTreePosition to be more of a class.
Moved the test to LayoutTests/perf but didn&apos;t use magnitude-perf.js as it seemed unsuitable for a something that requires a relatively long testing function (it calls the function many times).</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>227760</attachid>
            <date>2014-03-25 09:22:11 -0700</date>
            <delta_ts>2014-03-25 09:36:10 -0700</delta_ts>
            <desc>patch</desc>
            <filename>style-resolve-context-4.patch</filename>
            <type>text/plain</type>
            <size>27907</size>
            <attacher name="Antti Koivisto">koivisto</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE2NjIzNCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDQxIEBACisyMDE0LTAzLTI1ICBBbnR0aSBL
b2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4KKworICAgICAgICBSZW5kZXIgdHJlZSBjb25zdHJ1
Y3Rpb24gaXMgTyhOXjIpIGluIG51bWJlciBvZiBzaWJsaW5ncworICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI5MDY1CisKKyAgICAgICAgUmV2aWV3ZWQg
YnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBXaGVuIGFkZGluZyBhIG5ldyBy
ZW5kZXJlciB0byB0aGUgdHJlZSB3ZSB3b3VsZCBzZWFyY2ggZm9yIHRoZSBjb3JyZWN0IHJlbmRl
ciB0cmVlCisgICAgICAgIHBvc2l0aW9uIGJ5IHRyYXZlcnNpbmcgRE9NIGNoaWxkcmVuIGZvcndh
cmQgdG8gZmluZCBzb21ldGhpbmcgdGhhdCBhbHJlYWR5IGhhcyBhIHJlbmRlcmVyLgorICAgICAg
ICBJbiBjb21tb24gY2FzZSB0aGVyZSBpcyBubyBzdWNoIHJlbmRlcmVyLiBUaGlzIHdvdWxkIGJl
IHJlcGVhdGVkIGZvciBlYWNoIGluc2VydGVkIHJlbmRlcmVyCisgICAgICAgIGxlYWRpbmcgdG8g
TyhuXjIpIGluIHJlc3BlY3QgdG8gY2hpbGQgbm9kZSBjb3VudC4KKyAgICAgICAgCisgICAgICAg
IFRoaXMgcGF0Y2ggY2FjaGVzIHRoZSBjb21wdXRlZCByZW5kZXIgdHJlZSBpbnNlcnRpb24gcG9z
aXRpb24gYW5kIHBhc3NlcyBpdCB0byBzaWJsaW5ncy4KKyAgICAgICAgVW50aWwgdGhlIGNhY2hl
ZCBwb3NpdGlvbiBpcyByZWFjaGVkIGl0IGNhbiBiZSB1c2VkIGZvciBhbGwgbmV3IHJlbmRlcmVy
cy4KKworICAgICAgICBUZXN0OiBmYXN0L2Nzcy9zaWJsaW5nLXJlbmRlcmVyLU9uMi5odG1sCisK
KyAgICAgICAgKiBzdHlsZS9TdHlsZVJlc29sdmVUcmVlLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6
OlN0eWxlOjpSZW5kZXJUcmVlUG9zaXRpb246OlJlbmRlclRyZWVQb3NpdGlvbik6CisgICAgICAg
IChXZWJDb3JlOjpTdHlsZTo6c3R5bGVGb3JFbGVtZW50KToKKyAgICAgICAgKFdlYkNvcmU6OlN0
eWxlOjplbGVtZW50SW5zaWRlUmVnaW9uTmVlZHNSZW5kZXJlcik6CisgICAgICAgIChXZWJDb3Jl
OjpTdHlsZTo6Y29tcHV0ZVJlbmRlclRyZWVQb3NpdGlvbklmTmVlZGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlOjppbnZhbGlkYXRlUmVuZGVyVHJlZVBvc2l0aW9uSWZOZWVkZWQpOgorICAg
ICAgICAoV2ViQ29yZTo6U3R5bGU6OmNyZWF0ZVJlbmRlcmVySWZOZWVkZWQpOgorICAgICAgICAo
V2ViQ29yZTo6U3R5bGU6OmNyZWF0ZVRleHRSZW5kZXJlcklmTmVlZGVkKToKKyAgICAgICAgKFdl
YkNvcmU6OlN0eWxlOjphdHRhY2hUZXh0UmVuZGVyZXIpOgorICAgICAgICAoV2ViQ29yZTo6U3R5
bGU6OnVwZGF0ZVRleHRSZW5kZXJlckFmdGVyQ29udGVudENoYW5nZSk6CisgICAgICAgIChXZWJD
b3JlOjpTdHlsZTo6YXR0YWNoQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGU6OmF0
dGFjaERpc3RyaWJ1dGVkQ2hpbGRyZW4pOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGU6OmF0dGFj
aFNoYWRvd1Jvb3QpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGU6OmF0dGFjaEJlZm9yZU9yQWZ0
ZXJQc2V1ZG9FbGVtZW50SWZOZWVkZWQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGU6OmF0dGFj
aFJlbmRlclRyZWUpOgorICAgICAgICAoV2ViQ29yZTo6U3R5bGU6OnJlc29sdmVMb2NhbCk6Cisg
ICAgICAgIChXZWJDb3JlOjpTdHlsZTo6cmVzb2x2ZVRleHROb2RlKToKKyAgICAgICAgKFdlYkNv
cmU6OlN0eWxlOjpyZXNvbHZlU2hhZG93VHJlZSk6CisgICAgICAgIChXZWJDb3JlOjpTdHlsZTo6
dXBkYXRlQmVmb3JlT3JBZnRlclBzZXVkb0VsZW1lbnQpOgorICAgICAgICAoV2ViQ29yZTo6U3R5
bGU6OnJlc29sdmVUcmVlKToKKwogMjAxNC0wMy0yNSAgR2Fib3IgUmFwY3NhbnlpICA8cmdhYm9y
QHdlYmtpdC5vcmc+CiAKICAgICAgICAgW0FSTTY0XSBHTlUgYXNzZW1ibGVyIGZhaWxzIGluIFRy
YW5zZm9ybWF0aW9uTWF0cml4OjptdWx0aXBseQpJbmRleDogU291cmNlL1dlYkNvcmUvc3R5bGUv
U3R5bGVSZXNvbHZlVHJlZS5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvc3R5bGUv
U3R5bGVSZXNvbHZlVHJlZS5jcHAJKHJldmlzaW9uIDE2NjE3MykKKysrIFNvdXJjZS9XZWJDb3Jl
L3N0eWxlL1N0eWxlUmVzb2x2ZVRyZWUuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00LDcgKzQsNyBA
QAogICogICAgICAgICAgIChDKSAyMDAxIFBldGVyIEtlbGx5IChwbWtAcG9zdC5jb20pCiAgKiAg
ICAgICAgICAgKEMpIDIwMDEgRGlyayBNdWVsbGVyIChtdWVsbGVyQGtkZS5vcmcpCiAgKiAgICAg
ICAgICAgKEMpIDIwMDcgRGF2aWQgU21pdGggKGNhdGZpc2gubWFuQGdtYWlsLmNvbSkKLSAqIENv
cHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSwgMjAxMCwgMjAx
MiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgsIDIwMDksIDIwMTAsIDIwMTIsIDIwMTMsIDIw
MTQgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICogICAgICAgICAgIChDKSAyMDA3
IEVyaWMgU2VpZGVsIChlcmljQHdlYmtpdC5vcmcpCiAgKgogICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgpAQCAtNjEsMTEgKzYx
LDI5IEBAIG5hbWVzcGFjZSBTdHlsZSB7CiAKIGVudW0gRGV0YWNoVHlwZSB7IE5vcm1hbERldGFj
aCwgUmVhdHRhY2hEZXRhY2ggfTsKIAotc3RhdGljIHZvaWQgYXR0YWNoUmVuZGVyVHJlZShFbGVt
ZW50JiwgQ29udGFpbmVyTm9kZSYgcmVuZGVyaW5nUGFyZW50Tm9kZSwgUGFzc1JlZlB0cjxSZW5k
ZXJTdHlsZT4pOwotc3RhdGljIHZvaWQgYXR0YWNoVGV4dFJlbmRlcmVyKFRleHQmLCBDb250YWlu
ZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlKTsKK3N0cnVjdCBSZW5kZXJUcmVlUG9zaXRpb24g
eworICAgIFJlbmRlclRyZWVQb3NpdGlvbihSZW5kZXJFbGVtZW50KiBwYXJlbnQpCisgICAgICAg
IDogcGFyZW50KHBhcmVudCkKKyAgICAgICAgLCBiZWZvcmUobnVsbHB0cikKKyAgICAgICAgLCBp
c1ZhbGlkKGZhbHNlKQorI2lmICFBU1NFUlRfRElTQUJMRUQKKyAgICAgICAgLCBhc3NlcnRDb3Vu
dCgwKQorI2VuZGlmCisgICAgeyB9CisKKyAgICBSZW5kZXJFbGVtZW50KiBwYXJlbnQ7CisgICAg
UmVuZGVyT2JqZWN0KiBiZWZvcmU7CisgICAgYm9vbCBpc1ZhbGlkOworI2lmICFBU1NFUlRfRElT
QUJMRUQKKyAgICB1bnNpZ25lZCBhc3NlcnRDb3VudDsKKyNlbmRpZgorfTsKKworc3RhdGljIHZv
aWQgYXR0YWNoUmVuZGVyVHJlZShFbGVtZW50JiwgQ29udGFpbmVyTm9kZSYgcmVuZGVyaW5nUGFy
ZW50Tm9kZSwgUmVuZGVyVHJlZVBvc2l0aW9uJiwgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4pOwor
c3RhdGljIHZvaWQgYXR0YWNoVGV4dFJlbmRlcmVyKFRleHQmLCBDb250YWluZXJOb2RlJiByZW5k
ZXJpbmdQYXJlbnROb2RlLCBSZW5kZXJUcmVlUG9zaXRpb24mKTsKIHN0YXRpYyB2b2lkIGRldGFj
aFJlbmRlclRyZWUoRWxlbWVudCYsIERldGFjaFR5cGUpOwotc3RhdGljIHZvaWQgcmVzb2x2ZVRl
eHROb2RlKFRleHQmLCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlKTsKLXN0YXRp
YyB2b2lkIHJlc29sdmVUcmVlKEVsZW1lbnQmLCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJl
bnROb2RlLCBDaGFuZ2UpOworc3RhdGljIHZvaWQgcmVzb2x2ZVRleHROb2RlKFRleHQmLCBDb250
YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlLCBSZW5kZXJUcmVlUG9zaXRpb24mKTsKK3N0
YXRpYyB2b2lkIHJlc29sdmVUcmVlKEVsZW1lbnQmLCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQ
YXJlbnROb2RlLCBSZW5kZXJUcmVlUG9zaXRpb24mLCBDaGFuZ2UpOwogCiBDaGFuZ2UgZGV0ZXJt
aW5lQ2hhbmdlKGNvbnN0IFJlbmRlclN0eWxlKiBzMSwgY29uc3QgUmVuZGVyU3R5bGUqIHMyKQog
ewpAQCAtMTY1LDE3ICsxODMsMTggQEAgc3RhdGljIGJvb2wgc2hvdWxkQ3JlYXRlUmVuZGVyZXIo
Y29uc3QgRQogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgUGFzc1JlZjxSZW5kZXJTdHls
ZT4gc3R5bGVGb3JFbGVtZW50KEVsZW1lbnQmIGVsZW1lbnQsIFJlbmRlclN0eWxlJiBwYXJlbnRT
dHlsZSkKK3N0YXRpYyBQYXNzUmVmPFJlbmRlclN0eWxlPiBzdHlsZUZvckVsZW1lbnQoRWxlbWVu
dCYgZWxlbWVudCwgQ29udGFpbmVyTm9kZSYgcmVuZGVyaW5nUGFyZW50Tm9kZSkKIHsKLSAgICBp
ZiAoZWxlbWVudC5oYXNDdXN0b21TdHlsZVJlc29sdmVDYWxsYmFja3MoKSkgewotICAgICAgICBp
ZiAoUmVmUHRyPFJlbmRlclN0eWxlPiBzdHlsZSA9IGVsZW1lbnQuY3VzdG9tU3R5bGVGb3JSZW5k
ZXJlcihwYXJlbnRTdHlsZSkpCisgICAgUmVuZGVyU3R5bGUqIHBhcmVudFN0eWxlID0gcmVuZGVy
aW5nUGFyZW50Tm9kZS5yZW5kZXJTdHlsZSgpOworICAgIGlmIChlbGVtZW50Lmhhc0N1c3RvbVN0
eWxlUmVzb2x2ZUNhbGxiYWNrcygpICYmIHBhcmVudFN0eWxlKSB7CisgICAgICAgIGlmIChSZWZQ
dHI8UmVuZGVyU3R5bGU+IHN0eWxlID0gZWxlbWVudC5jdXN0b21TdHlsZUZvclJlbmRlcmVyKCpw
YXJlbnRTdHlsZSkpCiAgICAgICAgICAgICByZXR1cm4gc3R5bGUucmVsZWFzZU5vbk51bGwoKTsK
ICAgICB9Ci0gICAgcmV0dXJuIGVsZW1lbnQuZG9jdW1lbnQoKS5lbnN1cmVTdHlsZVJlc29sdmVy
KCkuc3R5bGVGb3JFbGVtZW50KCZlbGVtZW50LCAmcGFyZW50U3R5bGUpOworICAgIHJldHVybiBl
bGVtZW50LmRvY3VtZW50KCkuZW5zdXJlU3R5bGVSZXNvbHZlcigpLnN0eWxlRm9yRWxlbWVudCgm
ZWxlbWVudCwgcGFyZW50U3R5bGUpOwogfQogCiAvLyBDaGVjayB0aGUgc3BlY2lmaWMgY2FzZSBv
ZiBlbGVtZW50cyB0aGF0IGFyZSBjaGlsZHJlbiBvZiByZWdpb25zIGJ1dCBhcmUgZmxvd2VkIGlu
dG8gYSBmbG93IHRocmVhZCB0aGVtc2VsdmVzLgotc3RhdGljIGJvb2wgZWxlbWVudEluc2lkZVJl
Z2lvbk5lZWRzUmVuZGVyZXIoRWxlbWVudCYgZWxlbWVudCwgY29uc3QgQ29udGFpbmVyTm9kZSYg
cmVuZGVyaW5nUGFyZW50Tm9kZSwgUmVmUHRyPFJlbmRlclN0eWxlPiYgc3R5bGUpCitzdGF0aWMg
Ym9vbCBlbGVtZW50SW5zaWRlUmVnaW9uTmVlZHNSZW5kZXJlcihFbGVtZW50JiBlbGVtZW50LCBD
b250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlLCBSZWZQdHI8UmVuZGVyU3R5bGU+JiBz
dHlsZSkKIHsKICNpZiBFTkFCTEUoQ1NTX1JFR0lPTlMpCiAgICAgLy8gVGhlIHBhcmVudCBvZiBh
IHJlZ2lvbiBzaG91bGQgYWx3YXlzIGJlIGFuIGVsZW1lbnQuCkBAIC0xODcsNyArMjA2LDcgQEAg
c3RhdGljIGJvb2wgZWxlbWVudEluc2lkZVJlZ2lvbk5lZWRzUmVuZAogICAgICAgICByZXR1cm4g
ZmFsc2U7CiAKICAgICBpZiAoIXN0eWxlKQotICAgICAgICBzdHlsZSA9IHN0eWxlRm9yRWxlbWVu
dChlbGVtZW50LCAqcmVuZGVyaW5nUGFyZW50Tm9kZS5yZW5kZXJTdHlsZSgpKTsKKyAgICAgICAg
c3R5bGUgPSBzdHlsZUZvckVsZW1lbnQoZWxlbWVudCwgcmVuZGVyaW5nUGFyZW50Tm9kZSk7CiAK
ICAgICAvLyBDaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQgd2lsbCBvbmx5IGJlIGFsbG93ZWQgdG8g
YmUgZmxvd2VkIGludG8gb3RoZXIgZmxvdy10aHJlYWRzIGlmIGRpc3BsYXkgaXMgTk9UIG5vbmUu
CiAgICAgaWYgKGVsZW1lbnQucmVuZGVyZXJJc05lZWRlZCgqc3R5bGUpKQpAQCAtMjE1LDcgKzIz
NCwyNyBAQCBzdGF0aWMgUmVuZGVyTmFtZWRGbG93VGhyZWFkKiBtb3ZlVG9GbG93CiB9CiAjZW5k
aWYKIAotc3RhdGljIHZvaWQgY3JlYXRlUmVuZGVyZXJJZk5lZWRlZChFbGVtZW50JiBlbGVtZW50
LCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlLCBQYXNzUmVmUHRyPFJlbmRlclN0
eWxlPiByZXNvbHZlZFN0eWxlKQorc3RhdGljIHZvaWQgY29tcHV0ZVJlbmRlclRyZWVQb3NpdGlv
bklmTmVlZGVkKFJlbmRlclRyZWVQb3NpdGlvbiYgcmVuZGVyVHJlZVBvc2l0aW9uLCBjb25zdCBO
b2RlJiBub2RlLCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlKQoreworICAgIEFT
U0VSVCghbm9kZS5yZW5kZXJlcigpKTsKKyAgICBpZiAocmVuZGVyVHJlZVBvc2l0aW9uLmlzVmFs
aWQpIHsKKyAgICAgICAgLy8gU3RvcCB2YWxpZGF0aW5nIGF0IHNvbWUgcG9pbnQgc28gdGhlIGFz
c2VydCBkb2Vzbid0IG1ha2UgdXMgTyhOXjIpIG9uIGRlYnVnIGJ1aWxkcy4KKyAgICAgICAgQVNT
RVJUKCsrcmVuZGVyVHJlZVBvc2l0aW9uLmFzc2VydENvdW50ID4gMjAgfHwgbmV4dFNpYmxpbmdS
ZW5kZXJlcihub2RlLCByZW5kZXJpbmdQYXJlbnROb2RlKSA9PSByZW5kZXJUcmVlUG9zaXRpb24u
YmVmb3JlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICByZW5kZXJUcmVlUG9zaXRpb24u
YmVmb3JlID0gbmV4dFNpYmxpbmdSZW5kZXJlcihub2RlLCByZW5kZXJpbmdQYXJlbnROb2RlKTsK
KyAgICByZW5kZXJUcmVlUG9zaXRpb24uaXNWYWxpZCA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lk
IGludmFsaWRhdGVSZW5kZXJUcmVlUG9zaXRpb25JZk5lZWRlZChSZW5kZXJUcmVlUG9zaXRpb24m
IHJlbmRlclRyZWVQb3NpdGlvbiwgY29uc3QgTm9kZSYgbm9kZSkKK3sKKyAgICBpZiAoIXJlbmRl
clRyZWVQb3NpdGlvbi5pc1ZhbGlkKQorICAgICAgICByZXR1cm47CisgICAgaWYgKG5vZGUucmVu
ZGVyZXIoKSAmJiByZW5kZXJUcmVlUG9zaXRpb24uYmVmb3JlID09IG5vZGUucmVuZGVyZXIoKSkK
KyAgICAgICAgcmVuZGVyVHJlZVBvc2l0aW9uLmlzVmFsaWQgPSBmYWxzZTsKK30KKworc3RhdGlj
IHZvaWQgY3JlYXRlUmVuZGVyZXJJZk5lZWRlZChFbGVtZW50JiBlbGVtZW50LCBDb250YWluZXJO
b2RlJiByZW5kZXJpbmdQYXJlbnROb2RlLCBSZW5kZXJUcmVlUG9zaXRpb24mIHJlbmRlclRyZWVQ
b3NpdGlvbiwgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gcmVzb2x2ZWRTdHlsZSkKIHsKICAgICBB
U1NFUlQoIWVsZW1lbnQucmVuZGVyZXIoKSk7CiAKQEAgLTIyNyw3ICsyNjYsNyBAQCBzdGF0aWMg
dm9pZCBjcmVhdGVSZW5kZXJlcklmTmVlZGVkKEVsZW1lCiAgICAgICAgIHJldHVybjsKIAogICAg
IGlmICghc3R5bGUpCi0gICAgICAgIHN0eWxlID0gc3R5bGVGb3JFbGVtZW50KGVsZW1lbnQsICpy
ZW5kZXJpbmdQYXJlbnROb2RlLnJlbmRlclN0eWxlKCkpOworICAgICAgICBzdHlsZSA9IHN0eWxl
Rm9yRWxlbWVudChlbGVtZW50LCByZW5kZXJpbmdQYXJlbnROb2RlKTsKIAogICAgIFJlbmRlck5h
bWVkRmxvd1RocmVhZCogcGFyZW50Rmxvd1JlbmRlcmVyID0gMDsKICNpZiBFTkFCTEUoQ1NTX1JF
R0lPTlMpCkBAIC0yMzcsMjggKzI3NiwyNiBAQCBzdGF0aWMgdm9pZCBjcmVhdGVSZW5kZXJlcklm
TmVlZGVkKEVsZW1lCiAgICAgaWYgKCFlbGVtZW50LnJlbmRlcmVySXNOZWVkZWQoKnN0eWxlKSkK
ICAgICAgICAgcmV0dXJuOwogCi0gICAgUmVuZGVyRWxlbWVudCogcGFyZW50UmVuZGVyZXI7Ci0g
ICAgUmVuZGVyT2JqZWN0KiBuZXh0UmVuZGVyZXI7CisgICAgY29tcHV0ZVJlbmRlclRyZWVQb3Np
dGlvbklmTmVlZGVkKHJlbmRlclRyZWVQb3NpdGlvbiwgZWxlbWVudCwgcmVuZGVyaW5nUGFyZW50
Tm9kZSk7CisgICAgQVNTRVJUKHJlbmRlclRyZWVQb3NpdGlvbi5pc1ZhbGlkKTsKKworICAgIFJl
bmRlclRyZWVQb3NpdGlvbiBpbnNlcnRpb25Qb3NpdGlvbiA9IHJlbmRlclRyZWVQb3NpdGlvbjsK
ICAgICBpZiAocGFyZW50Rmxvd1JlbmRlcmVyKSB7Ci0gICAgICAgIHBhcmVudFJlbmRlcmVyID0g
cGFyZW50Rmxvd1JlbmRlcmVyOwotICAgICAgICBuZXh0UmVuZGVyZXIgPSBwYXJlbnRGbG93UmVu
ZGVyZXItPm5leHRSZW5kZXJlckZvckVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfSBlbHNlIHsKLSAg
ICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBwYXRoIEVsZW1lbnQgb25seSwgaGFuZGxlIHRoZSBy
b290IHNwZWNpYWwgY2FzZSBzZXBhcmF0ZWx5LgotICAgICAgICBwYXJlbnRSZW5kZXJlciA9IHJl
bmRlcmluZ1BhcmVudE5vZGUucmVuZGVyZXIoKTsKLSAgICAgICAgbmV4dFJlbmRlcmVyID0gbmV4
dFNpYmxpbmdSZW5kZXJlcihlbGVtZW50LCByZW5kZXJpbmdQYXJlbnROb2RlKTsKKyAgICAgICAg
aW5zZXJ0aW9uUG9zaXRpb24ucGFyZW50ID0gcGFyZW50Rmxvd1JlbmRlcmVyOworICAgICAgICBp
bnNlcnRpb25Qb3NpdGlvbi5iZWZvcmUgPSBwYXJlbnRGbG93UmVuZGVyZXItPm5leHRSZW5kZXJl
ckZvckVsZW1lbnQoZWxlbWVudCk7CiAgICAgfQogCiAgICAgUmVuZGVyRWxlbWVudCogbmV3UmVu
ZGVyZXIgPSBlbGVtZW50LmNyZWF0ZUVsZW1lbnRSZW5kZXJlcihzdHlsZS5yZWxlYXNlTm9uTnVs
bCgpKS5sZWFrUHRyKCk7CiAgICAgaWYgKCFuZXdSZW5kZXJlcikKICAgICAgICAgcmV0dXJuOwot
ICAgIGlmICghcGFyZW50UmVuZGVyZXItPmlzQ2hpbGRBbGxvd2VkKCpuZXdSZW5kZXJlciwgbmV3
UmVuZGVyZXItPnN0eWxlKCkpKSB7CisgICAgaWYgKCFpbnNlcnRpb25Qb3NpdGlvbi5wYXJlbnQt
PmlzQ2hpbGRBbGxvd2VkKCpuZXdSZW5kZXJlciwgbmV3UmVuZGVyZXItPnN0eWxlKCkpKSB7CiAg
ICAgICAgIG5ld1JlbmRlcmVyLT5kZXN0cm95KCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAK
ICAgICAvLyBNYWtlIHN1cmUgdGhlIFJlbmRlck9iamVjdCBhbHJlYWR5IGtub3dzIGl0IGlzIGdv
aW5nIHRvIGJlIGFkZGVkIHRvIGEgUmVuZGVyRmxvd1RocmVhZCBiZWZvcmUgd2Ugc2V0IHRoZSBz
dHlsZQogICAgIC8vIGZvciB0aGUgZmlyc3QgdGltZS4gT3RoZXJ3aXNlIGNvZGUgdXNpbmcgaW5S
ZW5kZXJGbG93VGhyZWFkKCkgaW4gdGhlIHN0eWxlV2lsbENoYW5nZSBhbmQgc3R5bGVEaWRDaGFu
Z2Ugd2lsbCBmYWlsLgotICAgIG5ld1JlbmRlcmVyLT5zZXRGbG93VGhyZWFkU3RhdGUocGFyZW50
UmVuZGVyZXItPmZsb3dUaHJlYWRTdGF0ZSgpKTsKKyAgICBuZXdSZW5kZXJlci0+c2V0Rmxvd1Ro
cmVhZFN0YXRlKGluc2VydGlvblBvc2l0aW9uLnBhcmVudC0+Zmxvd1RocmVhZFN0YXRlKCkpOwog
CiAgICAgLy8gQ29kZSBiZWxvdyB1cGRhdGVBbmltYXRpb25zKCkgY2FuIGRlcGVuZCBvbiBFbGVt
ZW50OjpyZW5kZXJlcigpIGFscmVhZHkgYmVpbmcgc2V0LgogICAgIGVsZW1lbnQuc2V0UmVuZGVy
ZXIobmV3UmVuZGVyZXIpOwpAQCAtMjcyLDEzICszMDksMTMgQEAgc3RhdGljIHZvaWQgY3JlYXRl
UmVuZGVyZXJJZk5lZWRlZChFbGVtZQogI2lmIEVOQUJMRShGVUxMU0NSRUVOX0FQSSkKICAgICBE
b2N1bWVudCYgZG9jdW1lbnQgPSBlbGVtZW50LmRvY3VtZW50KCk7CiAgICAgaWYgKGRvY3VtZW50
LndlYmtpdElzRnVsbFNjcmVlbigpICYmIGRvY3VtZW50LndlYmtpdEN1cnJlbnRGdWxsU2NyZWVu
RWxlbWVudCgpID09ICZlbGVtZW50KSB7Ci0gICAgICAgIG5ld1JlbmRlcmVyID0gUmVuZGVyRnVs
bFNjcmVlbjo6d3JhcFJlbmRlcmVyKG5ld1JlbmRlcmVyLCBwYXJlbnRSZW5kZXJlciwgZG9jdW1l
bnQpOworICAgICAgICBuZXdSZW5kZXJlciA9IFJlbmRlckZ1bGxTY3JlZW46OndyYXBSZW5kZXJl
cihuZXdSZW5kZXJlciwgaW5zZXJ0aW9uUG9zaXRpb24ucGFyZW50LCBkb2N1bWVudCk7CiAgICAg
ICAgIGlmICghbmV3UmVuZGVyZXIpCiAgICAgICAgICAgICByZXR1cm47CiAgICAgfQogI2VuZGlm
CiAgICAgLy8gTm90ZTogQWRkaW5nIG5ld1JlbmRlcmVyIGluc3RlYWQgb2YgcmVuZGVyZXIoKS4g
cmVuZGVyZXIoKSBtYXkgYmUgYSBjaGlsZCBvZiBuZXdSZW5kZXJlci4KLSAgICBwYXJlbnRSZW5k
ZXJlci0+YWRkQ2hpbGQobmV3UmVuZGVyZXIsIG5leHRSZW5kZXJlcik7CisgICAgaW5zZXJ0aW9u
UG9zaXRpb24ucGFyZW50LT5hZGRDaGlsZChuZXdSZW5kZXJlciwgaW5zZXJ0aW9uUG9zaXRpb24u
YmVmb3JlKTsKIH0KIAogc3RhdGljIFJlbmRlck9iamVjdCogcHJldmlvdXNTaWJsaW5nUmVuZGVy
ZXIoY29uc3QgVGV4dCYgdGV4dE5vZGUpCkBAIC0zNjcsMzQgKzQwNCwzNSBAQCBzdGF0aWMgYm9v
bCB0ZXh0UmVuZGVyZXJJc05lZWRlZChjb25zdCBUCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0
YXRpYyB2b2lkIGNyZWF0ZVRleHRSZW5kZXJlcklmTmVlZGVkKFRleHQmIHRleHROb2RlLCBDb250
YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlKQorc3RhdGljIHZvaWQgY3JlYXRlVGV4dFJl
bmRlcmVySWZOZWVkZWQoVGV4dCYgdGV4dE5vZGUsIENvbnRhaW5lck5vZGUmIHJlbmRlcmluZ1Bh
cmVudE5vZGUsIFJlbmRlclRyZWVQb3NpdGlvbiYgcmVuZGVyVHJlZVBvc2l0aW9uKQogewogICAg
IEFTU0VSVCghdGV4dE5vZGUucmVuZGVyZXIoKSk7CiAKICAgICBpZiAoIXRleHRSZW5kZXJlcklz
TmVlZGVkKHRleHROb2RlLCByZW5kZXJpbmdQYXJlbnROb2RlKSkKICAgICAgICAgcmV0dXJuOwot
ICAgIFJlbmRlckVsZW1lbnQmIHBhcmVudFJlbmRlcmVyID0gKnJlbmRlcmluZ1BhcmVudE5vZGUu
cmVuZGVyZXIoKTsKLSAgICBjb25zdCBhdXRvJiBzdHlsZSA9IHBhcmVudFJlbmRlcmVyLnN0eWxl
KCk7CisgICAgY29uc3QgYXV0byYgc3R5bGUgPSAqcmVuZGVyaW5nUGFyZW50Tm9kZS5yZW5kZXJT
dHlsZSgpOwogCiAgICAgYXV0byBuZXdSZW5kZXJlciA9IHRleHROb2RlLmNyZWF0ZVRleHRSZW5k
ZXJlcihzdHlsZSk7CiAgICAgQVNTRVJUKG5ld1JlbmRlcmVyKTsKIAotICAgIGlmICghcGFyZW50
UmVuZGVyZXIuaXNDaGlsZEFsbG93ZWQoKm5ld1JlbmRlcmVyLCBzdHlsZSkpCisgICAgY29tcHV0
ZVJlbmRlclRyZWVQb3NpdGlvbklmTmVlZGVkKHJlbmRlclRyZWVQb3NpdGlvbiwgdGV4dE5vZGUs
IHJlbmRlcmluZ1BhcmVudE5vZGUpOworICAgIEFTU0VSVChyZW5kZXJUcmVlUG9zaXRpb24uaXNW
YWxpZCk7CisKKyAgICBpZiAoIXJlbmRlclRyZWVQb3NpdGlvbi5wYXJlbnQtPmlzQ2hpbGRBbGxv
d2VkKCpuZXdSZW5kZXJlciwgc3R5bGUpKQogICAgICAgICByZXR1cm47CiAKICAgICAvLyBNYWtl
IHN1cmUgdGhlIFJlbmRlck9iamVjdCBhbHJlYWR5IGtub3dzIGl0IGlzIGdvaW5nIHRvIGJlIGFk
ZGVkIHRvIGEgUmVuZGVyRmxvd1RocmVhZCBiZWZvcmUgd2Ugc2V0IHRoZSBzdHlsZQogICAgIC8v
IGZvciB0aGUgZmlyc3QgdGltZS4gT3RoZXJ3aXNlIGNvZGUgdXNpbmcgaW5SZW5kZXJGbG93VGhy
ZWFkKCkgaW4gdGhlIHN0eWxlV2lsbENoYW5nZSBhbmQgc3R5bGVEaWRDaGFuZ2Ugd2lsbCBmYWls
LgotICAgIG5ld1JlbmRlcmVyLT5zZXRGbG93VGhyZWFkU3RhdGUocGFyZW50UmVuZGVyZXIuZmxv
d1RocmVhZFN0YXRlKCkpOworICAgIG5ld1JlbmRlcmVyLT5zZXRGbG93VGhyZWFkU3RhdGUocmVu
ZGVyVHJlZVBvc2l0aW9uLnBhcmVudC0+Zmxvd1RocmVhZFN0YXRlKCkpOwogCi0gICAgUmVuZGVy
T2JqZWN0KiBuZXh0UmVuZGVyZXIgPSBuZXh0U2libGluZ1JlbmRlcmVyKHRleHROb2RlLCByZW5k
ZXJpbmdQYXJlbnROb2RlKTsKICAgICB0ZXh0Tm9kZS5zZXRSZW5kZXJlcihuZXdSZW5kZXJlci5n
ZXQoKSk7CiAgICAgLy8gUGFyZW50IHRha2VzIGNhcmUgb2YgdGhlIGFuaW1hdGlvbnMsIG5vIG5l
ZWQgdG8gY2FsbCBzZXRBbmltYXRhYmxlU3R5bGUuCi0gICAgcGFyZW50UmVuZGVyZXIuYWRkQ2hp
bGQobmV3UmVuZGVyZXIubGVha1B0cigpLCBuZXh0UmVuZGVyZXIpOworICAgIHJlbmRlclRyZWVQ
b3NpdGlvbi5wYXJlbnQtPmFkZENoaWxkKG5ld1JlbmRlcmVyLmxlYWtQdHIoKSwgcmVuZGVyVHJl
ZVBvc2l0aW9uLmJlZm9yZSk7CiB9CiAKLXZvaWQgYXR0YWNoVGV4dFJlbmRlcmVyKFRleHQmIHRl
eHROb2RlLCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnQpCit2b2lkIGF0dGFjaFRleHRS
ZW5kZXJlcihUZXh0JiB0ZXh0Tm9kZSwgQ29udGFpbmVyTm9kZSYgcmVuZGVyaW5nUGFyZW50Tm9k
ZSwgUmVuZGVyVHJlZVBvc2l0aW9uJiByZW5kZXJUcmVlUG9zaXRpb24pCiB7Ci0gICAgY3JlYXRl
VGV4dFJlbmRlcmVySWZOZWVkZWQodGV4dE5vZGUsIHJlbmRlcmluZ1BhcmVudCk7CisgICAgY3Jl
YXRlVGV4dFJlbmRlcmVySWZOZWVkZWQodGV4dE5vZGUsIHJlbmRlcmluZ1BhcmVudE5vZGUsIHJl
bmRlclRyZWVQb3NpdGlvbik7CiAKICAgICB0ZXh0Tm9kZS5jbGVhck5lZWRzU3R5bGVSZWNhbGMo
KTsKIH0KQEAgLTQxMyw1NCArNDUxLDYxIEBAIHZvaWQgdXBkYXRlVGV4dFJlbmRlcmVyQWZ0ZXJD
b250ZW50Q2hhbmcKICAgICAgICAgcmV0dXJuOwogCiAgICAgYm9vbCBoYWRSZW5kZXJlciA9IHRl
eHROb2RlLnJlbmRlcmVyKCk7Ci0gICAgcmVzb2x2ZVRleHROb2RlKHRleHROb2RlLCAqcmVuZGVy
aW5nUGFyZW50Tm9kZSk7CisKKyAgICBSZW5kZXJUcmVlUG9zaXRpb24gcmVuZGVyVHJlZVBvc2l0
aW9uKHJlbmRlcmluZ1BhcmVudE5vZGUtPnJlbmRlcmVyKCkpOworICAgIHJlc29sdmVUZXh0Tm9k
ZSh0ZXh0Tm9kZSwgKnJlbmRlcmluZ1BhcmVudE5vZGUsIHJlbmRlclRyZWVQb3NpdGlvbik7CiAK
ICAgICBpZiAoaGFkUmVuZGVyZXIgJiYgdGV4dE5vZGUucmVuZGVyZXIoKSkKICAgICAgICAgdGV4
dE5vZGUucmVuZGVyZXIoKS0+c2V0VGV4dFdpdGhPZmZzZXQodGV4dE5vZGUuZGF0YUltcGwoKSwg
b2Zmc2V0T2ZSZXBsYWNlZERhdGEsIGxlbmd0aE9mUmVwbGFjZWREYXRhKTsKIH0KIAotc3RhdGlj
IHZvaWQgYXR0YWNoQ2hpbGRyZW4oQ29udGFpbmVyTm9kZSYgY3VycmVudCwgQ29udGFpbmVyTm9k
ZSYgcmVuZGVyaW5nUGFyZW50Tm9kZSkKK3N0YXRpYyB2b2lkIGF0dGFjaENoaWxkcmVuKENvbnRh
aW5lck5vZGUmIGN1cnJlbnQsIENvbnRhaW5lck5vZGUmIHJlbmRlcmluZ1BhcmVudE5vZGUsIFJl
bmRlclRyZWVQb3NpdGlvbiYgcmVuZGVyVHJlZVBvc2l0aW9uKQogewogICAgIGZvciAoTm9kZSog
Y2hpbGQgPSBjdXJyZW50LmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHRT
aWJsaW5nKCkpIHsKICAgICAgICAgQVNTRVJUKCghY2hpbGQtPnJlbmRlcmVyKCkgfHwgY2hpbGQt
PmluTmFtZWRGbG93KCkpIHx8IGN1cnJlbnQuc2hhZG93Um9vdCgpKTsKKyAgICAgICAgaW52YWxp
ZGF0ZVJlbmRlclRyZWVQb3NpdGlvbklmTmVlZGVkKHJlbmRlclRyZWVQb3NpdGlvbiwgKmNoaWxk
KTsKICAgICAgICAgaWYgKGNoaWxkLT5yZW5kZXJlcigpKQogICAgICAgICAgICAgY29udGludWU7
CiAgICAgICAgIGlmIChjaGlsZC0+aXNUZXh0Tm9kZSgpKSB7Ci0gICAgICAgICAgICBhdHRhY2hU
ZXh0UmVuZGVyZXIoKnRvVGV4dChjaGlsZCksIHJlbmRlcmluZ1BhcmVudE5vZGUpOworICAgICAg
ICAgICAgYXR0YWNoVGV4dFJlbmRlcmVyKCp0b1RleHQoY2hpbGQpLCByZW5kZXJpbmdQYXJlbnRO
b2RlLCByZW5kZXJUcmVlUG9zaXRpb24pOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAg
IH0KICAgICAgICAgaWYgKGNoaWxkLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgICAgICBhdHRh
Y2hSZW5kZXJUcmVlKCp0b0VsZW1lbnQoY2hpbGQpLCByZW5kZXJpbmdQYXJlbnROb2RlLCBudWxs
cHRyKTsKKyAgICAgICAgICAgIGF0dGFjaFJlbmRlclRyZWUoKnRvRWxlbWVudChjaGlsZCksIHJl
bmRlcmluZ1BhcmVudE5vZGUsIHJlbmRlclRyZWVQb3NpdGlvbiwgbnVsbHB0cik7CiAgICAgfQog
fQogCi1zdGF0aWMgdm9pZCBhdHRhY2hEaXN0cmlidXRlZENoaWxkcmVuKEluc2VydGlvblBvaW50
JiBpbnNlcnRpb25Qb2ludCwgQ29udGFpbmVyTm9kZSYgcmVuZGVyaW5nUGFyZW50Tm9kZSkKK3N0
YXRpYyB2b2lkIGF0dGFjaERpc3RyaWJ1dGVkQ2hpbGRyZW4oSW5zZXJ0aW9uUG9pbnQmIGluc2Vy
dGlvblBvaW50LCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlLCBSZW5kZXJUcmVl
UG9zaXRpb24mIHJlbmRlclRyZWVQb3NpdGlvbikKIHsKICAgICBpZiAoU2hhZG93Um9vdCogc2hh
ZG93Um9vdCA9IGluc2VydGlvblBvaW50LmNvbnRhaW5pbmdTaGFkb3dSb290KCkpCiAgICAgICAg
IENvbnRlbnREaXN0cmlidXRvcjo6ZW5zdXJlRGlzdHJpYnV0aW9uKHNoYWRvd1Jvb3QpOwogCiAg
ICAgZm9yIChOb2RlKiBjdXJyZW50ID0gaW5zZXJ0aW9uUG9pbnQuZmlyc3REaXN0cmlidXRlZCgp
OyBjdXJyZW50OyBjdXJyZW50ID0gaW5zZXJ0aW9uUG9pbnQubmV4dERpc3RyaWJ1dGVkVG8oY3Vy
cmVudCkpIHsKKyAgICAgICAgaW52YWxpZGF0ZVJlbmRlclRyZWVQb3NpdGlvbklmTmVlZGVkKHJl
bmRlclRyZWVQb3NpdGlvbiwgKmN1cnJlbnQpOwogICAgICAgICBpZiAoY3VycmVudC0+aXNUZXh0
Tm9kZSgpKSB7CiAgICAgICAgICAgICBpZiAoY3VycmVudC0+cmVuZGVyZXIoKSkKICAgICAgICAg
ICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIGF0dGFjaFRleHRSZW5kZXJlcigqdG9UZXh0
KGN1cnJlbnQpLCByZW5kZXJpbmdQYXJlbnROb2RlKTsKKyAgICAgICAgICAgIGF0dGFjaFRleHRS
ZW5kZXJlcigqdG9UZXh0KGN1cnJlbnQpLCByZW5kZXJpbmdQYXJlbnROb2RlLCByZW5kZXJUcmVl
UG9zaXRpb24pOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgaWYg
KGN1cnJlbnQtPmlzRWxlbWVudE5vZGUoKSkgewogICAgICAgICAgICAgRWxlbWVudCYgY3VycmVu
dEVsZW1lbnQgPSB0b0VsZW1lbnQoKmN1cnJlbnQpOwogICAgICAgICAgICAgaWYgKGN1cnJlbnRF
bGVtZW50LnJlbmRlcmVyKCkpCiAgICAgICAgICAgICAgICAgZGV0YWNoUmVuZGVyVHJlZShjdXJy
ZW50RWxlbWVudCk7Ci0gICAgICAgICAgICBhdHRhY2hSZW5kZXJUcmVlKGN1cnJlbnRFbGVtZW50
LCByZW5kZXJpbmdQYXJlbnROb2RlLCBudWxscHRyKTsKKyAgICAgICAgICAgIGF0dGFjaFJlbmRl
clRyZWUoY3VycmVudEVsZW1lbnQsIHJlbmRlcmluZ1BhcmVudE5vZGUsIHJlbmRlclRyZWVQb3Np
dGlvbiwgbnVsbHB0cik7CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gVXNlIGFjdHVhbCBjaGls
ZHJlbiBhcyBmYWxsYmFjayBjb250ZW50LgogICAgIGlmICghaW5zZXJ0aW9uUG9pbnQuaGFzRGlz
dHJpYnV0aW9uKCkpCi0gICAgICAgIGF0dGFjaENoaWxkcmVuKGluc2VydGlvblBvaW50LCByZW5k
ZXJpbmdQYXJlbnROb2RlKTsKKyAgICAgICAgYXR0YWNoQ2hpbGRyZW4oaW5zZXJ0aW9uUG9pbnQs
IHJlbmRlcmluZ1BhcmVudE5vZGUsIHJlbmRlclRyZWVQb3NpdGlvbik7CiB9CiAKIHN0YXRpYyB2
b2lkIGF0dGFjaFNoYWRvd1Jvb3QoU2hhZG93Um9vdCYgc2hhZG93Um9vdCkKIHsKLSAgICBhdHRh
Y2hDaGlsZHJlbihzaGFkb3dSb290LCAqc2hhZG93Um9vdC5ob3N0RWxlbWVudCgpKTsKKyAgICBB
U1NFUlQoc2hhZG93Um9vdC5ob3N0RWxlbWVudCgpKTsKKworICAgIFJlbmRlclRyZWVQb3NpdGlv
biByZW5kZXJUcmVlUG9zaXRpb24oc2hhZG93Um9vdC5ob3N0RWxlbWVudCgpLT5yZW5kZXJlcigp
KTsKKyAgICBhdHRhY2hDaGlsZHJlbihzaGFkb3dSb290LCAqc2hhZG93Um9vdC5ob3N0RWxlbWVu
dCgpLCByZW5kZXJUcmVlUG9zaXRpb24pOwogCiAgICAgc2hhZG93Um9vdC5jbGVhck5lZWRzU3R5
bGVSZWNhbGMoKTsKICAgICBzaGFkb3dSb290LmNsZWFyQ2hpbGROZWVkc1N0eWxlUmVjYWxjKCk7
CkBAIC01MDcsMTYgKzU1MiwxNiBAQCBzdGF0aWMgYm9vbCBuZWVkc1BzZXVkb0VsZW1lbnQoRWxl
bWVudCYgCiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyB2b2lkIGF0dGFjaEJlZm9yZU9y
QWZ0ZXJQc2V1ZG9FbGVtZW50SWZOZWVkZWQoRWxlbWVudCYgY3VycmVudCwgUHNldWRvSWQgcHNl
dWRvSWQpCitzdGF0aWMgdm9pZCBhdHRhY2hCZWZvcmVPckFmdGVyUHNldWRvRWxlbWVudElmTmVl
ZGVkKEVsZW1lbnQmIGN1cnJlbnQsIFBzZXVkb0lkIHBzZXVkb0lkLCBSZW5kZXJUcmVlUG9zaXRp
b24mIHJlbmRlclRyZWVQb3NpdGlvbikKIHsKICAgICBpZiAoIW5lZWRzUHNldWRvRWxlbWVudChj
dXJyZW50LCBwc2V1ZG9JZCkpCiAgICAgICAgIHJldHVybjsKICAgICBSZWZQdHI8UHNldWRvRWxl
bWVudD4gcHNldWRvRWxlbWVudCA9IFBzZXVkb0VsZW1lbnQ6OmNyZWF0ZShjdXJyZW50LCBwc2V1
ZG9JZCk7CiAgICAgc2V0QmVmb3JlT3JBZnRlclBzZXVkb0VsZW1lbnQoY3VycmVudCwgcHNldWRv
RWxlbWVudCwgcHNldWRvSWQpOwotICAgIGF0dGFjaFJlbmRlclRyZWUoKnBzZXVkb0VsZW1lbnQs
IGN1cnJlbnQsIG51bGxwdHIpOworICAgIGF0dGFjaFJlbmRlclRyZWUoKnBzZXVkb0VsZW1lbnQs
IGN1cnJlbnQsIHJlbmRlclRyZWVQb3NpdGlvbiwgbnVsbHB0cik7CiB9CiAKLXN0YXRpYyB2b2lk
IGF0dGFjaFJlbmRlclRyZWUoRWxlbWVudCYgY3VycmVudCwgQ29udGFpbmVyTm9kZSYgcmVuZGVy
aW5nUGFyZW50Tm9kZSwgUGFzc1JlZlB0cjxSZW5kZXJTdHlsZT4gcmVzb2x2ZWRTdHlsZSkKK3N0
YXRpYyB2b2lkIGF0dGFjaFJlbmRlclRyZWUoRWxlbWVudCYgY3VycmVudCwgQ29udGFpbmVyTm9k
ZSYgcmVuZGVyaW5nUGFyZW50Tm9kZSwgUmVuZGVyVHJlZVBvc2l0aW9uJiByZW5kZXJUcmVlUG9z
aXRpb24sIFBhc3NSZWZQdHI8UmVuZGVyU3R5bGU+IHJlc29sdmVkU3R5bGUpCiB7CiAgICAgUG9z
dFJlc29sdXRpb25DYWxsYmFja0Rpc2FibGVyIGNhbGxiYWNrRGlzYWJsZXIoY3VycmVudC5kb2N1
bWVudCgpKTsKICAgICBXaWRnZXRIaWVyYXJjaHlVcGRhdGVzU3VzcGVuc2lvblNjb3BlIHN1c3Bl
bmRXaWRnZXRIaWVyYXJjaHlVcGRhdGVzOwpAQCAtNTI0LDE1ICs1NjksMTYgQEAgc3RhdGljIHZv
aWQgYXR0YWNoUmVuZGVyVHJlZShFbGVtZW50JiBjdQogICAgIGlmIChjdXJyZW50Lmhhc0N1c3Rv
bVN0eWxlUmVzb2x2ZUNhbGxiYWNrcygpKQogICAgICAgICBjdXJyZW50LndpbGxBdHRhY2hSZW5k
ZXJlcnMoKTsKIAotICAgIGNyZWF0ZVJlbmRlcmVySWZOZWVkZWQoY3VycmVudCwgcmVuZGVyaW5n
UGFyZW50Tm9kZSwgcmVzb2x2ZWRTdHlsZSk7CisgICAgY3JlYXRlUmVuZGVyZXJJZk5lZWRlZChj
dXJyZW50LCByZW5kZXJpbmdQYXJlbnROb2RlLCByZW5kZXJUcmVlUG9zaXRpb24sIHJlc29sdmVk
U3R5bGUpOwogCiAgICAgaWYgKGN1cnJlbnQucGFyZW50RWxlbWVudCgpICYmIGN1cnJlbnQucGFy
ZW50RWxlbWVudCgpLT5pc0luQ2FudmFzU3VidHJlZSgpKQogICAgICAgICBjdXJyZW50LnNldElz
SW5DYW52YXNTdWJ0cmVlKHRydWUpOwogCi0gICAgYXR0YWNoQmVmb3JlT3JBZnRlclBzZXVkb0Vs
ZW1lbnRJZk5lZWRlZChjdXJyZW50LCBCRUZPUkUpOwotCiAgICAgU3R5bGVSZXNvbHZlclBhcmVu
dFB1c2hlciBwYXJlbnRQdXNoZXIoJmN1cnJlbnQpOwogCisgICAgUmVuZGVyVHJlZVBvc2l0aW9u
IGNoaWxkUmVuZGVyVHJlZVBvc2l0aW9uKGN1cnJlbnQucmVuZGVyZXIoKSk7CisgICAgYXR0YWNo
QmVmb3JlT3JBZnRlclBzZXVkb0VsZW1lbnRJZk5lZWRlZChjdXJyZW50LCBCRUZPUkUsIGNoaWxk
UmVuZGVyVHJlZVBvc2l0aW9uKTsKKwogICAgIGlmIChTaGFkb3dSb290KiBzaGFkb3dSb290ID0g
Y3VycmVudC5zaGFkb3dSb290KCkpIHsKICAgICAgICAgcGFyZW50UHVzaGVyLnB1c2goKTsKICAg
ICAgICAgYXR0YWNoU2hhZG93Um9vdCgqc2hhZG93Um9vdCk7CkBAIC01NDAsOSArNTg2LDkgQEAg
c3RhdGljIHZvaWQgYXR0YWNoUmVuZGVyVHJlZShFbGVtZW50JiBjdQogICAgICAgICBwYXJlbnRQ
dXNoZXIucHVzaCgpOwogCiAgICAgaWYgKGlzSW5zZXJ0aW9uUG9pbnQoY3VycmVudCkpCi0gICAg
ICAgIGF0dGFjaERpc3RyaWJ1dGVkQ2hpbGRyZW4odG9JbnNlcnRpb25Qb2ludChjdXJyZW50KSwg
cmVuZGVyaW5nUGFyZW50Tm9kZSk7CisgICAgICAgIGF0dGFjaERpc3RyaWJ1dGVkQ2hpbGRyZW4o
dG9JbnNlcnRpb25Qb2ludChjdXJyZW50KSwgcmVuZGVyaW5nUGFyZW50Tm9kZSwgcmVuZGVyVHJl
ZVBvc2l0aW9uKTsKICAgICBlbHNlCi0gICAgICAgIGF0dGFjaENoaWxkcmVuKGN1cnJlbnQsIGN1
cnJlbnQpOworICAgICAgICBhdHRhY2hDaGlsZHJlbihjdXJyZW50LCBjdXJyZW50LCBjaGlsZFJl
bmRlclRyZWVQb3NpdGlvbik7CiAKICAgICBjdXJyZW50LmNsZWFyTmVlZHNTdHlsZVJlY2FsYygp
OwogICAgIGN1cnJlbnQuY2xlYXJDaGlsZE5lZWRzU3R5bGVSZWNhbGMoKTsKQEAgLTU1MCw3ICs1
OTYsNyBAQCBzdGF0aWMgdm9pZCBhdHRhY2hSZW5kZXJUcmVlKEVsZW1lbnQmIGN1CiAgICAgaWYg
KEFYT2JqZWN0Q2FjaGUqIGNhY2hlID0gY3VycmVudC5kb2N1bWVudCgpLmF4T2JqZWN0Q2FjaGUo
KSkKICAgICAgICAgY2FjaGUtPnVwZGF0ZUNhY2hlQWZ0ZXJOb2RlSXNBdHRhY2hlZCgmY3VycmVu
dCk7CiAKLSAgICBhdHRhY2hCZWZvcmVPckFmdGVyUHNldWRvRWxlbWVudElmTmVlZGVkKGN1cnJl
bnQsIEFGVEVSKTsKKyAgICBhdHRhY2hCZWZvcmVPckFmdGVyUHNldWRvRWxlbWVudElmTmVlZGVk
KGN1cnJlbnQsIEFGVEVSLCBjaGlsZFJlbmRlclRyZWVQb3NpdGlvbik7CiAKICAgICBjdXJyZW50
LnVwZGF0ZUZvY3VzQXBwZWFyYW5jZUFmdGVyQXR0YWNoSWZOZWVkZWQoKTsKICAgICAKQEAgLTY1
Miw3ICs2OTgsNyBAQCBzdGF0aWMgYm9vbCBwc2V1ZG9TdHlsZUNhY2hlSXNJbnZhbGlkKFJlCiAg
ICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgQ2hhbmdlIHJlc29sdmVMb2NhbChFbGVtZW50
JiBjdXJyZW50LCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlLCBDaGFuZ2UgaW5o
ZXJpdGVkQ2hhbmdlKQorc3RhdGljIENoYW5nZSByZXNvbHZlTG9jYWwoRWxlbWVudCYgY3VycmVu
dCwgQ29udGFpbmVyTm9kZSYgcmVuZGVyaW5nUGFyZW50Tm9kZSwgUmVuZGVyVHJlZVBvc2l0aW9u
JiByZW5kZXJUcmVlUG9zaXRpb24sIENoYW5nZSBpbmhlcml0ZWRDaGFuZ2UpCiB7CiAgICAgQ2hh
bmdlIGxvY2FsQ2hhbmdlID0gRGV0YWNoOwogICAgIFJlZlB0cjxSZW5kZXJTdHlsZT4gbmV3U3R5
bGU7CkBAIC02NjAsMTMgKzcwNiwxMyBAQCBzdGF0aWMgQ2hhbmdlIHJlc29sdmVMb2NhbChFbGVt
ZW50JiBjdXJyCiAKICAgICBEb2N1bWVudCYgZG9jdW1lbnQgPSBjdXJyZW50LmRvY3VtZW50KCk7
CiAgICAgaWYgKGN1cnJlbnRTdHlsZSAmJiBjdXJyZW50LnN0eWxlQ2hhbmdlVHlwZSgpICE9IFJl
Y29uc3RydWN0UmVuZGVyVHJlZSkgewotICAgICAgICBuZXdTdHlsZSA9IHN0eWxlRm9yRWxlbWVu
dChjdXJyZW50LCAqcmVuZGVyaW5nUGFyZW50Tm9kZS5yZW5kZXJTdHlsZSgpKTsKKyAgICAgICAg
bmV3U3R5bGUgPSBzdHlsZUZvckVsZW1lbnQoY3VycmVudCwgcmVuZGVyaW5nUGFyZW50Tm9kZSk7
CiAgICAgICAgIGxvY2FsQ2hhbmdlID0gZGV0ZXJtaW5lQ2hhbmdlKGN1cnJlbnRTdHlsZS5nZXQo
KSwgbmV3U3R5bGUuZ2V0KCkpOwogICAgIH0KICAgICBpZiAobG9jYWxDaGFuZ2UgPT0gRGV0YWNo
KSB7CiAgICAgICAgIGlmIChjdXJyZW50LnJlbmRlcmVyKCkgfHwgY3VycmVudC5pbk5hbWVkRmxv
dygpKQogICAgICAgICAgICAgZGV0YWNoUmVuZGVyVHJlZShjdXJyZW50LCBSZWF0dGFjaERldGFj
aCk7Ci0gICAgICAgIGF0dGFjaFJlbmRlclRyZWUoY3VycmVudCwgcmVuZGVyaW5nUGFyZW50Tm9k
ZSwgbmV3U3R5bGUucmVsZWFzZSgpKTsKKyAgICAgICAgYXR0YWNoUmVuZGVyVHJlZShjdXJyZW50
LCByZW5kZXJpbmdQYXJlbnROb2RlLCByZW5kZXJUcmVlUG9zaXRpb24sIG5ld1N0eWxlLnJlbGVh
c2UoKSk7CiAgICAgICAgIGludmFsaWRhdGVXaGl0ZXNwYWNlT25seVRleHRTaWJsaW5nc0FmdGVy
QXR0YWNoSWZOZWVkZWQoY3VycmVudCk7CiAKICAgICAgICAgcmV0dXJuIERldGFjaDsKQEAgLTY5
OCw3ICs3NDQsNyBAQCBzdGF0aWMgQ2hhbmdlIHJlc29sdmVMb2NhbChFbGVtZW50JiBjdXJyCiAg
ICAgcmV0dXJuIGxvY2FsQ2hhbmdlOwogfQogCi12b2lkIHJlc29sdmVUZXh0Tm9kZShUZXh0JiB0
ZXh0LCBDb250YWluZXJOb2RlJiByZW5kZXJpbmdQYXJlbnROb2RlKQordm9pZCByZXNvbHZlVGV4
dE5vZGUoVGV4dCYgdGV4dCwgQ29udGFpbmVyTm9kZSYgcmVuZGVyaW5nUGFyZW50Tm9kZSwgUmVu
ZGVyVHJlZVBvc2l0aW9uJiByZW5kZXJUcmVlUG9zaXRpb24pCiB7CiAgICAgdGV4dC5jbGVhck5l
ZWRzU3R5bGVSZWNhbGMoKTsKIApAQCAtNzEzLDM1ICs3NTksMzggQEAgdm9pZCByZXNvbHZlVGV4
dE5vZGUoVGV4dCYgdGV4dCwgQ29udGFpbgogICAgIH0KICAgICBpZiAoIW5lZWRzUmVuZGVyZXIp
CiAgICAgICAgIHJldHVybjsKLSAgICBhdHRhY2hUZXh0UmVuZGVyZXIodGV4dCwgcmVuZGVyaW5n
UGFyZW50Tm9kZSk7CisgICAgYXR0YWNoVGV4dFJlbmRlcmVyKHRleHQsIHJlbmRlcmluZ1BhcmVu
dE5vZGUsIHJlbmRlclRyZWVQb3NpdGlvbik7CiAgICAgaW52YWxpZGF0ZVdoaXRlc3BhY2VPbmx5
VGV4dFNpYmxpbmdzQWZ0ZXJBdHRhY2hJZk5lZWRlZCh0ZXh0KTsKIH0KIAotc3RhdGljIHZvaWQg
cmVzb2x2ZVNoYWRvd1RyZWUoU2hhZG93Um9vdCYgc2hhZG93Um9vdCwgU3R5bGU6OkNoYW5nZSBj
aGFuZ2UpCitzdGF0aWMgdm9pZCByZXNvbHZlU2hhZG93VHJlZShTaGFkb3dSb290JiBzaGFkb3dS
b290LCBFbGVtZW50JiBob3N0LCBTdHlsZTo6Q2hhbmdlIGNoYW5nZSkKIHsKKyAgICBBU1NFUlQo
c2hhZG93Um9vdC5ob3N0RWxlbWVudCgpID09ICZob3N0KTsKKyAgICBSZW5kZXJUcmVlUG9zaXRp
b24gcmVuZGVyVHJlZVBvc2l0aW9uKGhvc3QucmVuZGVyZXIoKSk7CiAgICAgZm9yIChOb2RlKiBj
aGlsZCA9IHNoYWRvd1Jvb3QuZmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4
dFNpYmxpbmcoKSkgeworICAgICAgICBpbnZhbGlkYXRlUmVuZGVyVHJlZVBvc2l0aW9uSWZOZWVk
ZWQocmVuZGVyVHJlZVBvc2l0aW9uLCAqY2hpbGQpOwogICAgICAgICBpZiAoY2hpbGQtPmlzVGV4
dE5vZGUoKSAmJiBjaGlsZC0+bmVlZHNTdHlsZVJlY2FsYygpKSB7Ci0gICAgICAgICAgICByZXNv
bHZlVGV4dE5vZGUoKnRvVGV4dChjaGlsZCksICpzaGFkb3dSb290Lmhvc3RFbGVtZW50KCkpOwor
ICAgICAgICAgICAgcmVzb2x2ZVRleHROb2RlKCp0b1RleHQoY2hpbGQpLCBob3N0LCByZW5kZXJU
cmVlUG9zaXRpb24pOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAg
aWYgKGNoaWxkLT5pc0VsZW1lbnROb2RlKCkpCi0gICAgICAgICAgICByZXNvbHZlVHJlZSgqdG9F
bGVtZW50KGNoaWxkKSwgKnNoYWRvd1Jvb3QuaG9zdEVsZW1lbnQoKSwgY2hhbmdlKTsKKyAgICAg
ICAgICAgIHJlc29sdmVUcmVlKCp0b0VsZW1lbnQoY2hpbGQpLCBob3N0LCByZW5kZXJUcmVlUG9z
aXRpb24sIGNoYW5nZSk7CiAgICAgfQogCiAgICAgc2hhZG93Um9vdC5jbGVhck5lZWRzU3R5bGVS
ZWNhbGMoKTsKICAgICBzaGFkb3dSb290LmNsZWFyQ2hpbGROZWVkc1N0eWxlUmVjYWxjKCk7CiB9
CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZUJlZm9yZU9yQWZ0ZXJQc2V1ZG9FbGVtZW50KEVsZW1lbnQm
IGN1cnJlbnQsIENoYW5nZSBjaGFuZ2UsIFBzZXVkb0lkIHBzZXVkb0lkKQorc3RhdGljIHZvaWQg
dXBkYXRlQmVmb3JlT3JBZnRlclBzZXVkb0VsZW1lbnQoRWxlbWVudCYgY3VycmVudCwgQ2hhbmdl
IGNoYW5nZSwgUHNldWRvSWQgcHNldWRvSWQsIFJlbmRlclRyZWVQb3NpdGlvbiYgcmVuZGVyVHJl
ZVBvc2l0aW9uKQogewogICAgIGlmIChQc2V1ZG9FbGVtZW50KiBleGlzdGluZ1BzZXVkb0VsZW1l
bnQgPSBiZWZvcmVPckFmdGVyUHNldWRvRWxlbWVudChjdXJyZW50LCBwc2V1ZG9JZCkpIHsKICAg
ICAgICAgaWYgKG5lZWRzUHNldWRvRWxlbWVudChjdXJyZW50LCBwc2V1ZG9JZCkpCi0gICAgICAg
ICAgICByZXNvbHZlVHJlZSgqZXhpc3RpbmdQc2V1ZG9FbGVtZW50LCBjdXJyZW50LCBjdXJyZW50
Lm5lZWRzU3R5bGVSZWNhbGMoKSA/IEZvcmNlIDogY2hhbmdlKTsKKyAgICAgICAgICAgIHJlc29s
dmVUcmVlKCpleGlzdGluZ1BzZXVkb0VsZW1lbnQsIGN1cnJlbnQsIHJlbmRlclRyZWVQb3NpdGlv
biwgY3VycmVudC5uZWVkc1N0eWxlUmVjYWxjKCkgPyBGb3JjZSA6IGNoYW5nZSk7CiAgICAgICAg
IGVsc2UKICAgICAgICAgICAgIGNsZWFyQmVmb3JlT3JBZnRlclBzZXVkb0VsZW1lbnQoY3VycmVu
dCwgcHNldWRvSWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGF0dGFjaEJlZm9yZU9y
QWZ0ZXJQc2V1ZG9FbGVtZW50SWZOZWVkZWQoY3VycmVudCwgcHNldWRvSWQpOworICAgIGF0dGFj
aEJlZm9yZU9yQWZ0ZXJQc2V1ZG9FbGVtZW50SWZOZWVkZWQoY3VycmVudCwgcHNldWRvSWQsIHJl
bmRlclRyZWVQb3NpdGlvbik7CiB9CiAKICNpZiBQTEFURk9STShJT1MpCkBAIC03OTYsNyArODQ1
LDcgQEAgcHJpdmF0ZToKIH07CiAjZW5kaWYgLy8gUExBVEZPUk0oSU9TKQogCi12b2lkIHJlc29s
dmVUcmVlKEVsZW1lbnQmIGN1cnJlbnQsIENvbnRhaW5lck5vZGUmIHJlbmRlcmluZ1BhcmVudE5v
ZGUsIENoYW5nZSBjaGFuZ2UpCit2b2lkIHJlc29sdmVUcmVlKEVsZW1lbnQmIGN1cnJlbnQsIENv
bnRhaW5lck5vZGUmIHJlbmRlcmluZ1BhcmVudE5vZGUsIFJlbmRlclRyZWVQb3NpdGlvbiYgcmVu
ZGVyVHJlZVBvc2l0aW9uLCBDaGFuZ2UgY2hhbmdlKQogewogICAgIEFTU0VSVChjaGFuZ2UgIT0g
RGV0YWNoKTsKIApAQCAtODE3LDcgKzg2Niw3IEBAIHZvaWQgcmVzb2x2ZVRyZWUoRWxlbWVudCYg
Y3VycmVudCwgQ29udGEKICAgICAgICAgY3VycmVudC5yZXNldENvbXB1dGVkU3R5bGUoKTsKIAog
ICAgIGlmIChoYXNQYXJlbnRTdHlsZSAmJiAoY2hhbmdlID49IEluaGVyaXQgfHwgY3VycmVudC5u
ZWVkc1N0eWxlUmVjYWxjKCkpKQotICAgICAgICBjaGFuZ2UgPSByZXNvbHZlTG9jYWwoY3VycmVu
dCwgcmVuZGVyaW5nUGFyZW50Tm9kZSwgY2hhbmdlKTsKKyAgICAgICAgY2hhbmdlID0gcmVzb2x2
ZUxvY2FsKGN1cnJlbnQsIHJlbmRlcmluZ1BhcmVudE5vZGUsIHJlbmRlclRyZWVQb3NpdGlvbiwg
Y2hhbmdlKTsKIAogICAgIGlmIChjaGFuZ2UgIT0gRGV0YWNoKSB7CiAgICAgICAgIFN0eWxlUmVz
b2x2ZXJQYXJlbnRQdXNoZXIgcGFyZW50UHVzaGVyKCZjdXJyZW50KTsKQEAgLTgyNSwxMSArODc0
LDEyIEBAIHZvaWQgcmVzb2x2ZVRyZWUoRWxlbWVudCYgY3VycmVudCwgQ29udGEKICAgICAgICAg
aWYgKFNoYWRvd1Jvb3QqIHNoYWRvd1Jvb3QgPSBjdXJyZW50LnNoYWRvd1Jvb3QoKSkgewogICAg
ICAgICAgICAgaWYgKGNoYW5nZSA+PSBJbmhlcml0IHx8IHNoYWRvd1Jvb3QtPmNoaWxkTmVlZHNT
dHlsZVJlY2FsYygpIHx8IHNoYWRvd1Jvb3QtPm5lZWRzU3R5bGVSZWNhbGMoKSkgewogICAgICAg
ICAgICAgICAgIHBhcmVudFB1c2hlci5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZVNo
YWRvd1RyZWUoKnNoYWRvd1Jvb3QsIGNoYW5nZSk7CisgICAgICAgICAgICAgICAgcmVzb2x2ZVNo
YWRvd1RyZWUoKnNoYWRvd1Jvb3QsIGN1cnJlbnQsIGNoYW5nZSk7CiAgICAgICAgICAgICB9CiAg
ICAgICAgIH0KIAotICAgICAgICB1cGRhdGVCZWZvcmVPckFmdGVyUHNldWRvRWxlbWVudChjdXJy
ZW50LCBjaGFuZ2UsIEJFRk9SRSk7CisgICAgICAgIFJlbmRlclRyZWVQb3NpdGlvbiBjaGlsZFJl
bmRlclRyZWVQb3NpdGlvbihjdXJyZW50LnJlbmRlcmVyKCkpOworICAgICAgICB1cGRhdGVCZWZv
cmVPckFmdGVyUHNldWRvRWxlbWVudChjdXJyZW50LCBjaGFuZ2UsIEJFRk9SRSwgY2hpbGRSZW5k
ZXJUcmVlUG9zaXRpb24pOwogCiAgICAgICAgIC8vIEZJWE1FOiBUaGlzIGNoZWNrIGlzIGdvb2Qg
ZW5vdWdoIGZvciA6aG92ZXIgKyBmb28sIGJ1dCBpdCBpcyBub3QgZ29vZCBlbm91Z2ggZm9yIDpo
b3ZlciArIGZvbyArIGJhci4KICAgICAgICAgLy8gRm9yIG5vdyB3ZSB3aWxsIGp1c3Qgd29ycnkg
YWJvdXQgdGhlIGNvbW1vbiBjYXNlLCBzaW5jZSBpdCdzIGEgbG90IHRyaWNraWVyIHRvIGdldCB0
aGUgc2Vjb25kIGNhc2UgcmlnaHQKQEAgLTgzNyw4ICs4ODcsOSBAQCB2b2lkIHJlc29sdmVUcmVl
KEVsZW1lbnQmIGN1cnJlbnQsIENvbnRhCiAgICAgICAgIGJvb2wgZm9yY2VDaGVja09mTmV4dEVs
ZW1lbnRTaWJsaW5nID0gZmFsc2U7CiAgICAgICAgIGJvb2wgZm9yY2VDaGVja09mQW55RWxlbWVu
dFNpYmxpbmcgPSBmYWxzZTsKICAgICAgICAgZm9yIChOb2RlKiBjaGlsZCA9IGN1cnJlbnQuZmly
c3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dFNpYmxpbmcoKSkgeworICAgICAg
ICAgICAgaW52YWxpZGF0ZVJlbmRlclRyZWVQb3NpdGlvbklmTmVlZGVkKGNoaWxkUmVuZGVyVHJl
ZVBvc2l0aW9uLCAqY2hpbGQpOwogICAgICAgICAgICAgaWYgKGNoaWxkLT5pc1RleHROb2RlKCkg
JiYgY2hpbGQtPm5lZWRzU3R5bGVSZWNhbGMoKSkgewotICAgICAgICAgICAgICAgIHJlc29sdmVU
ZXh0Tm9kZSgqdG9UZXh0KGNoaWxkKSwgY3VycmVudCk7CisgICAgICAgICAgICAgICAgcmVzb2x2
ZVRleHROb2RlKCp0b1RleHQoY2hpbGQpLCBjdXJyZW50LCBjaGlsZFJlbmRlclRyZWVQb3NpdGlv
bik7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAg
ICBpZiAoIWNoaWxkLT5pc0VsZW1lbnROb2RlKCkpCkBAIC04NDksMTMgKzkwMCwxMyBAQCB2b2lk
IHJlc29sdmVUcmVlKEVsZW1lbnQmIGN1cnJlbnQsIENvbnRhCiAgICAgICAgICAgICAgICAgY2hp
bGRFbGVtZW50LT5zZXROZWVkc1N0eWxlUmVjYWxjKCk7CiAgICAgICAgICAgICBpZiAoY2hhbmdl
ID49IEluaGVyaXQgfHwgY2hpbGRFbGVtZW50LT5jaGlsZE5lZWRzU3R5bGVSZWNhbGMoKSB8fCBj
aGlsZEVsZW1lbnQtPm5lZWRzU3R5bGVSZWNhbGMoKSkgewogICAgICAgICAgICAgICAgIHBhcmVu
dFB1c2hlci5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgcmVzb2x2ZVRyZWUoKmNoaWxkRWxlbWVu
dCwgY3VycmVudCwgY2hhbmdlKTsKKyAgICAgICAgICAgICAgICByZXNvbHZlVHJlZSgqY2hpbGRF
bGVtZW50LCBjdXJyZW50LCBjaGlsZFJlbmRlclRyZWVQb3NpdGlvbiwgY2hhbmdlKTsKICAgICAg
ICAgICAgIH0KICAgICAgICAgICAgIGZvcmNlQ2hlY2tPZk5leHRFbGVtZW50U2libGluZyA9IGNo
aWxkUnVsZXNDaGFuZ2VkICYmIGhhc0RpcmVjdEFkamFjZW50UnVsZXM7CiAgICAgICAgICAgICBm
b3JjZUNoZWNrT2ZBbnlFbGVtZW50U2libGluZyA9IGZvcmNlQ2hlY2tPZkFueUVsZW1lbnRTaWJs
aW5nIHx8IChjaGlsZFJ1bGVzQ2hhbmdlZCAmJiBoYXNJbmRpcmVjdEFkamFjZW50UnVsZXMpOwog
ICAgICAgICB9CiAKLSAgICAgICAgdXBkYXRlQmVmb3JlT3JBZnRlclBzZXVkb0VsZW1lbnQoY3Vy
cmVudCwgY2hhbmdlLCBBRlRFUik7CisgICAgICAgIHVwZGF0ZUJlZm9yZU9yQWZ0ZXJQc2V1ZG9F
bGVtZW50KGN1cnJlbnQsIGNoYW5nZSwgQUZURVIsIGNoaWxkUmVuZGVyVHJlZVBvc2l0aW9uKTsK
ICAgICB9CiAKICAgICBjdXJyZW50LmNsZWFyTmVlZHNTdHlsZVJlY2FsYygpOwpAQCAtODkwLDcg
Kzk0MSw4IEBAIHZvaWQgcmVzb2x2ZVRyZWUoRG9jdW1lbnQmIGRvY3VtZW50LCBDaGEKICAgICAg
ICAgcmV0dXJuOwogICAgIGlmIChjaGFuZ2UgPCBJbmhlcml0ICYmICFkb2N1bWVudEVsZW1lbnQt
PmNoaWxkTmVlZHNTdHlsZVJlY2FsYygpICYmICFkb2N1bWVudEVsZW1lbnQtPm5lZWRzU3R5bGVS
ZWNhbGMoKSkKICAgICAgICAgcmV0dXJuOwotICAgIHJlc29sdmVUcmVlKCpkb2N1bWVudEVsZW1l
bnQsIGRvY3VtZW50LCBjaGFuZ2UpOworICAgIFJlbmRlclRyZWVQb3NpdGlvbiByZW5kZXJUcmVl
UG9zaXRpb24oZG9jdW1lbnQucmVuZGVyVmlldygpKTsKKyAgICByZXNvbHZlVHJlZSgqZG9jdW1l
bnRFbGVtZW50LCBkb2N1bWVudCwgcmVuZGVyVHJlZVBvc2l0aW9uLCBjaGFuZ2UpOwogfQogCiB2
b2lkIGRldGFjaFJlbmRlclRyZWUoRWxlbWVudCYgZWxlbWVudCkKSW5kZXg6IExheW91dFRlc3Rz
L0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9DaGFuZ2VMb2cJKHJldmlzaW9u
IDE2NjIzNCkKKysrIExheW91dFRlc3RzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDEzIEBACisyMDE0LTAzLTI1ICBBbnR0aSBLb2l2aXN0byAgPGFudHRpQGFwcGxlLmNvbT4K
KworICAgICAgICBSZW5kZXIgdHJlZSBjb25zdHJ1Y3Rpb24gaXMgTyhOXjIpIGluIG51bWJlciBv
ZiBzaWJsaW5ncworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/
aWQ9MTI5MDY1CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAg
ICAgKiBmYXN0L2Nzcy9zaWJsaW5nLXJlbmRlcmVyLU9uMi1leHBlY3RlZC50eHQ6IEFkZGVkLgor
ICAgICAgICAqIGZhc3QvY3NzL3NpYmxpbmctcmVuZGVyZXItT24yLmh0bWw6IEFkZGVkLgorCiAy
MDE0LTAzLTIwICBTZXJnaW8gVmlsbGFyIFNlbmluICA8c3ZpbGxhckBpZ2FsaWEuY29tPgogCiAg
ICAgICAgIFtDU1MgR3JpZCBMYXlvdXRdIFZlcnRpY2FsIHJlY3RhbmdsZXMgbm90IGNvbnNpZGVy
ZWQgYXMgdmFsaWQgZ3JpZCBhcmVhcwpJbmRleDogTGF5b3V0VGVzdHMvZmFzdC9jc3Mvc2libGlu
Zy1yZW5kZXJlci1PbjItZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2Zh
c3QvY3NzL3NpYmxpbmctcmVuZGVyZXItT24yLWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysr
IExheW91dFRlc3RzL2Zhc3QvY3NzL3NpYmxpbmctcmVuZGVyZXItT24yLWV4cGVjdGVkLnR4dAko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUgQEAKK1BBU1MgdGltZVJlbmRlclRyZWVDcmVhdGlv
big1MDAwKSA8IDIwICogdGltZVJlbmRlclRyZWVDcmVhdGlvbig1MDApIGlzIHRydWUKK1BBU1Mg
c3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVTVCBDT01QTEVURQorCkluZGV4OiBMYXlv
dXRUZXN0cy9mYXN0L2Nzcy9zaWJsaW5nLXJlbmRlcmVyLU9uMi5odG1sCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IExheW91dFRlc3RzL2Zhc3QvY3NzL3NpYmxpbmctcmVuZGVyZXItT24yLmh0bWwJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9mYXN0L2Nzcy9zaWJsaW5nLXJlbmRlcmVyLU9uMi5odG1sCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTMgQEAKKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJj
ZXMvanMtdGVzdC1wcmUuanMiPjwvc2NyaXB0PgorPGJvZHk+Cis8c2NyaXB0PgorZnVuY3Rpb24g
dGltZVJlbmRlclRyZWVDcmVhdGlvbihjb3VudCkgeworICAgIHZhciB0ID0gRGF0ZS5ub3coKTsK
KyAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyArK2kpCisgICAgICAgIGRvY3VtZW50LmJv
ZHkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOworICAgIGRvY3Vt
ZW50LmJvZHkub2Zmc2V0VG9wOworICAgIHJldHVybiBEYXRlLm5vdygpIC0gdDsKK30KK3Nob3Vs
ZEJlKCJ0aW1lUmVuZGVyVHJlZUNyZWF0aW9uKDUwMDApIDwgMjAgKiB0aW1lUmVuZGVyVHJlZUNy
ZWF0aW9uKDUwMCkiLCAidHJ1ZSIpOworPC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVz
b3VyY2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cg==
</data>
<flag name="review"
          id="252001"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
      

    </bug>

</bugzilla>