<?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>142977</bug_id>
          
          <creation_ts>2015-03-23 13:15:29 -0700</creation_ts>
          <short_desc>Add case insensitive checks to DFA bytecode</short_desc>
          <delta_ts>2015-03-25 16:06:39 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebCore Misc.</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=142514</see_also>
          <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="Alex Christensen">achristensen</reporter>
          <assigned_to name="Alex Christensen">achristensen</assigned_to>
          <cc>benjamin</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1079355</commentid>
    <comment_count>0</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-23 13:15:29 -0700</bug_when>
    <thetext>Many of the DFANodes have transitions that are case-insensitive, and most of the transitions are text.  Making case-insensitive checks would reduce the byte code size by up to 50%.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079358</commentid>
    <comment_count>1</comment_count>
      <attachid>249255</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-23 13:20:40 -0700</bug_when>
    <thetext>Created attachment 249255
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079520</commentid>
    <comment_count>2</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-23 17:32:53 -0700</bug_when>
    <thetext>In a large-ish real-life-ish test case, this reduced the byte code size from 93925673 to 61499201, so a memory reduction of about 30%.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079552</commentid>
    <comment_count>3</comment_count>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-03-23 21:39:52 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; In a large-ish real-life-ish test case, this reduced the byte code size from
&gt; 93925673 to 61499201, so a memory reduction of about 30%.

Awesome!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079553</commentid>
    <comment_count>4</comment_count>
      <attachid>249255</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-03-23 21:54:59 -0700</bug_when>
    <thetext>Comment on attachment 249255
Patch

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

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:-82
&gt; -    ASSERT_WITH_MESSAGE(lowValue != highValue, &quot;A single value check should be emitted for single values.&quot;);

This is odd. Is the assert no longer valid?

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:117
&gt; +    for (uint16_t i = 0; i &lt; 128; i++) {

uint16_t here.

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:128
&gt; +    uint8_t rangeMin;
&gt; +    bool hasRangeMin = false;
&gt; +    for (uint8_t i = 0; i &lt; 128; i++) {

uint8_t here

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:136
&gt; +                if (rangeMin &gt;= &apos;A&apos; &amp;&amp; rangeMax &lt;= &apos;Z&apos;) {

Note that in WebKit, toASCIILower() is faster than toASCIIUpper(), the convention is to use lowercase for the reference.

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:138
&gt; +                    for (uint16_t rangeIndex = rangeMin; rangeIndex &lt;= rangeMax; rangeIndex++) {

Back to uint16_t here

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:139
&gt; +                        if (destinations[rangeMin] != destinations[rangeIndex + &apos;a&apos; - &apos;A&apos;]) {

You can just use toASCIILower() on the rangeIndex to get its lowercase value.

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:150
&gt; +                        destinations[rangeIndex + &apos;a&apos; - &apos;A&apos;] = noDestination;

ditto.

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:168
&gt; -        compileCheckForRange(rangeMin, 127, rangeDestination);
&gt; +        ranges.append(Range(rangeMin, 127, destinations[rangeMin], true));

It is really weird to have a loop tail completely different from the loop body.
I think a comment with your rationale would be useful here.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079992</commentid>
    <comment_count>5</comment_count>
      <attachid>249255</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-25 11:15:34 -0700</bug_when>
    <thetext>Comment on attachment 249255
Patch

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

I&apos;ll upload another patch for re-reviewing a few things.

&gt;&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:117
&gt;&gt; +    for (uint16_t i = 0; i &lt; 128; i++) {
&gt; 
&gt; uint16_t here.

The keys of node.transitions are uint16_ts.

&gt;&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:128
&gt;&gt; +    for (uint8_t i = 0; i &lt; 128; i++) {
&gt; 
&gt; uint8_t here

These could be chars, but I thought it looks confusing to rely on char overflow:
for (char i = 0; i &gt; 0; ++i)

&gt;&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:136
&gt;&gt; +                if (rangeMin &gt;= &apos;A&apos; &amp;&amp; rangeMax &lt;= &apos;Z&apos;) {
&gt; 
&gt; Note that in WebKit, toASCIILower() is faster than toASCIIUpper(), the convention is to use lowercase for the reference.

Is that because char toASCIILower uses a lookup table?  That eliminates any conditional checks, and the table would be well-cached in the CPU.  Cool!
I&apos;ll use toASCIILower in the interpreter, but when compiling it would actually be faster to just add an immediate value of 32 rather than lookup a value in the table.  I&apos;ll use those functions to be consistent, though, because the performance gains would not be significant here, but it might be worth looking into in some places.

&gt;&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:138
&gt;&gt; +                    for (uint16_t rangeIndex = rangeMin; rangeIndex &lt;= rangeMax; rangeIndex++) {
&gt; 
&gt; Back to uint16_t here

Unintentional.  Should be uint8_t.

&gt;&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:168
&gt;&gt; +        ranges.append(Range(rangeMin, 127, destinations[rangeMin], true));
&gt; 
&gt; It is really weird to have a loop tail completely different from the loop body.
&gt; I think a comment with your rationale would be useful here.

It&apos;s *your* rationale.  You wrote this in the first place.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1079993</commentid>
    <comment_count>6</comment_count>
      <attachid>249416</attachid>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-25 11:17:25 -0700</bug_when>
    <thetext>Created attachment 249416
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1080081</commentid>
    <comment_count>7</comment_count>
      <attachid>249416</attachid>
    <who name="Benjamin Poulain">benjamin</who>
    <bug_when>2015-03-25 16:02:22 -0700</bug_when>
    <thetext>Comment on attachment 249416
Patch

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

&gt; Source/WebCore/contentextensions/DFABytecodeCompiler.cpp:171
&gt; +        // Ranges are appended after passing the end of them.
&gt; +        // If a range goes to 127, we will have an uncommitted rangeMin because the loop does not check 128.

Oh, ok, that&apos;s not what I meant :)

What I meant is explaining why you don&apos;t need to check for caseInsensitive ranges in this case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1080083</commentid>
    <comment_count>8</comment_count>
    <who name="Alex Christensen">achristensen</who>
    <bug_when>2015-03-25 16:06:39 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/181980</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>249255</attachid>
            <date>2015-03-23 13:20:40 -0700</date>
            <delta_ts>2015-03-25 11:17:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-142977-20150323132004.patch</filename>
            <type>text/plain</type>
            <size>15504</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MTg2MSkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDE1LTAzLTIzICBBbGV4IENo
cmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgQWRkIGNhc2Ut
aW5zZW5zaXRpdmUgY2hlY2tzIHRvIERGQSBieXRlY29kZS4KKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0Mjk3NworCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNv
ZGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNpb25zOjppbnN0cnVjdGlvblNp
emVXaXRoQXJndW1lbnRzKToKKyAgICAgICAgKiBjb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29k
ZUNvbXBpbGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNpb25zOjpERkFC
eXRlY29kZUNvbXBpbGVyOjplbWl0Q2hlY2tWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpDb250
ZW50RXh0ZW5zaW9uczo6REZBQnl0ZWNvZGVDb21waWxlcjo6ZW1pdENoZWNrVmFsdWVSYW5nZSk6
CisgICAgICAgIEFkZCBjYXNlLWluc2Vuc2l0aXZlIGJ5dGVjb2RlLgorICAgICAgICAoV2ViQ29y
ZTo6Q29udGVudEV4dGVuc2lvbnM6OkRGQUJ5dGVjb2RlQ29tcGlsZXI6OmNvbXBpbGVOb2RlVHJh
bnNpdGlvbnMpOgorICAgICAgICBDaGVjayB0byBzZWUgaWYgY2FzZS1pbnNlbnNpdGl2ZSBieXRl
Y29kZXMgY2FuIGJlIHVzZWQuCisgICAgICAgIChXZWJDb3JlOjpDb250ZW50RXh0ZW5zaW9uczo6
REZBQnl0ZWNvZGVDb21waWxlcjo6Y29tcGlsZUNoZWNrRm9yUmFuZ2UpOgorICAgICAgICAqIGNv
bnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRlbnRFeHRlbnNpb25zOjpERkFCeXRlY29kZUNvbXBpbGVyOjpSYW5nZTo6UmFuZ2UpOgor
ICAgICAgICBBZGRlZCBSYW5nZSBzdHJ1Y3R1cmUgdG8gYmUgYWJsZSB0byBjb3VudCB0aGUgcmFu
Z2VzIGluIGEgZnV0dXJlIHBhdGNoIGRlY2lkaW5nIGlmIHdlIHdhbnQgdG8gdXNlIGp1bXAgdGFi
bGVzLgorICAgICAgICAqIGNvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlSW50ZXJwcmV0ZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGVudEV4dGVuc2lvbnM6OkRGQUJ5dGVjb2RlSW50
ZXJwcmV0ZXI6OmludGVycHJldCk6CisgICAgICAgIEludGVycHJldCBjYXNlLWluc2Vuc2l0aXZl
IGJ5dGVjb2Rlcy4KKwogMjAxNS0wMy0yMyAgSmVyIE5vYmxlICA8amVyLm5vYmxlQGFwcGxlLmNv
bT4KIAogICAgICAgICBbaU9TXSBBY2Nlc3NpYmlsaXR5IGNyYXNoaW5nIGJlY2F1c2UgTWVkaWFQ
bGF5ZXIgaXMgbGF5aW5nIG91dCBVSSBvZmYgdGhlIG1haW4gdGhyZWFkCkluZGV4OiBTb3VyY2Uv
V2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29kZS5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlLmgJKHJldmlzaW9uIDE4
MTc2NSkKKysrIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlLmgJ
KHdvcmtpbmcgY29weSkKQEAgLTM5LDEzICszOSwxNSBAQCBlbnVtIGNsYXNzIERGQUJ5dGVjb2Rl
SW5zdHJ1Y3Rpb24gOiB1aW50CiAgICAgLy8gQ2hlY2tWYWx1ZSBoYXMgdHdvIGFyZ3VtZW50czoK
ICAgICAvLyBUaGUgdmFsdWUgdG8gY2hlY2sgKDEgYnl0ZSksCiAgICAgLy8gVGhlIGluZGV4IHRv
IGp1bXAgdG8gaWYgdGhlIHZhbHVlcyBhcmUgZXF1YWwgKDQgYnl0ZXMpLgotICAgIENoZWNrVmFs
dWUsCisgICAgQ2hlY2tWYWx1ZUNhc2VJbnNlbnNpdGl2ZSwKKyAgICBDaGVja1ZhbHVlQ2FzZVNl
bnNpdGl2ZSwKIAogICAgIC8vIEp1bXAgdG8gYW4gb2Zmc2V0IGlmIHRoZSBpbnB1dCB2YWx1ZSBp
cyB3aXRoaW4gYSBjZXJ0YWluIHJhbmdlLgogICAgIC8vIFRoZSBsb3dlciB2YWx1ZSAoMSBieXRl
KS4KICAgICAvLyBUaGUgaGlnaGVyIHZhbHVlICgxIGJ5dGUpLgogICAgIC8vIFRoZSBpbmRleCB0
byBqdW1wIHRvIGlmIHRoZSB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgKDQgYnl0ZXMpLgotICAgIENo
ZWNrVmFsdWVSYW5nZSwKKyAgICBDaGVja1ZhbHVlUmFuZ2VDYXNlSW5zZW5zaXRpdmUsCisgICAg
Q2hlY2tWYWx1ZVJhbmdlQ2FzZVNlbnNpdGl2ZSwKIAogICAgIC8vIEFwcGVuZEFjdGlvbiBoYXMg
b25lIGFyZ3VtZW50OgogICAgIC8vIFRoZSBhY3Rpb24gdG8gYXBwZW5kICg0IGJ5dGVzKS4KQEAg
LTY3LDkgKzY5LDExIEBAIGVudW0gY2xhc3MgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbiA6IHVpbnQK
IHN0YXRpYyBpbmxpbmUgc2l6ZV90IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMoREZBQnl0
ZWNvZGVJbnN0cnVjdGlvbiBpbnN0cnVjdGlvbikKIHsKICAgICBzd2l0Y2ggKGluc3RydWN0aW9u
KSB7Ci0gICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlOgorICAgIGNh
c2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZUNhc2VTZW5zaXRpdmU6CisgICAg
Y2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlQ2FzZUluc2Vuc2l0aXZlOgog
ICAgICAgICByZXR1cm4gc2l6ZW9mKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24pICsgc2l6ZW9mKHVp
bnQ4X3QpICsgc2l6ZW9mKHVuc2lnbmVkKTsKLSAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rp
b246OkNoZWNrVmFsdWVSYW5nZToKKyAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNo
ZWNrVmFsdWVSYW5nZUNhc2VTZW5zaXRpdmU6CisgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0
aW9uOjpDaGVja1ZhbHVlUmFuZ2VDYXNlSW5zZW5zaXRpdmU6CiAgICAgICAgIHJldHVybiBzaXpl
b2YoREZBQnl0ZWNvZGVJbnN0cnVjdGlvbikgKyBzaXplb2YodWludDhfdCkgKyBzaXplb2YodWlu
dDhfdCkgKyBzaXplb2YodW5zaWduZWQpOwogICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlv
bjo6QXBwZW5kQWN0aW9uOgogICAgICAgICByZXR1cm4gc2l6ZW9mKERGQUJ5dGVjb2RlSW5zdHJ1
Y3Rpb24pICsgc2l6ZW9mKHVuc2lnbmVkKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRl
eHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9X
ZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIuY3BwCShyZXZpc2lv
biAxODE3NjUpCisrKyBTb3VyY2UvV2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29k
ZUNvbXBpbGVyLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNjksMjQgKzY5LDIzIEBAIHZvaWQgREZB
Qnl0ZWNvZGVDb21waWxlcjo6ZW1pdEp1bXAodW5zaWcKICAgICBhcHBlbmQ8dW5zaWduZWQ+KG1f
Ynl0ZWNvZGUsIDApOyAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgc2V0IHdoZW4gbGlua2luZy4KIH0K
IAotdm9pZCBERkFCeXRlY29kZUNvbXBpbGVyOjplbWl0Q2hlY2tWYWx1ZSh1aW50OF90IHZhbHVl
LCB1bnNpZ25lZCBkZXN0aW5hdGlvbk5vZGVJbmRleCkKK3ZvaWQgREZBQnl0ZWNvZGVDb21waWxl
cjo6ZW1pdENoZWNrVmFsdWUodWludDhfdCB2YWx1ZSwgdW5zaWduZWQgZGVzdGluYXRpb25Ob2Rl
SW5kZXgsIGJvb2wgY2FzZVNlbnNpdGl2ZSkKIHsKLSAgICBhcHBlbmQ8REZBQnl0ZWNvZGVJbnN0
cnVjdGlvbj4obV9ieXRlY29kZSwgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZSk7
CisgICAgYXBwZW5kPERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24+KG1fYnl0ZWNvZGUsIGNhc2VTZW5z
aXRpdmUgPyBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlQ2FzZVNlbnNpdGl2ZSA6
IERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWVDYXNlSW5zZW5zaXRpdmUpOwogICAg
IGFwcGVuZDx1aW50OF90PihtX2J5dGVjb2RlLCB2YWx1ZSk7CiAgICAgbV9saW5rUmVjb3Jkcy5h
cHBlbmQoc3RkOjptYWtlX3BhaXIobV9ieXRlY29kZS5zaXplKCksIGRlc3RpbmF0aW9uTm9kZUlu
ZGV4KSk7CiAgICAgYXBwZW5kPHVuc2lnbmVkPihtX2J5dGVjb2RlLCAwKTsgLy8gVGhpcyB2YWx1
ZSB3aWxsIGJlIHNldCB3aGVuIGxpbmtpbmcuCiB9CiAKLXZvaWQgREZBQnl0ZWNvZGVDb21waWxl
cjo6ZW1pdENoZWNrVmFsdWVSYW5nZSh1aW50OF90IGxvd1ZhbHVlLCB1aW50OF90IGhpZ2hWYWx1
ZSwgdW5zaWduZWQgZGVzdGluYXRpb25Ob2RlSW5kZXgpCit2b2lkIERGQUJ5dGVjb2RlQ29tcGls
ZXI6OmVtaXRDaGVja1ZhbHVlUmFuZ2UodWludDhfdCBsb3dWYWx1ZSwgdWludDhfdCBoaWdoVmFs
dWUsIHVuc2lnbmVkIGRlc3RpbmF0aW9uTm9kZUluZGV4LCBib29sIGNhc2VTZW5zaXRpdmUpCiB7
Ci0gICAgQVNTRVJUX1dJVEhfTUVTU0FHRShsb3dWYWx1ZSAhPSBoaWdoVmFsdWUsICJBIHNpbmds
ZSB2YWx1ZSBjaGVjayBzaG91bGQgYmUgZW1pdHRlZCBmb3Igc2luZ2xlIHZhbHVlcy4iKTsKICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKGxvd1ZhbHVlIDwgaGlnaFZhbHVlLCAiVGhlIGluc3RydWN0
aW9uIHNlbWFudGljIGltcG9zZSBsb3dWYWx1ZSBpcyBzbWFsbGVyIHRoYW4gaGlnaFZhbHVlLiIp
OwogCi0gICAgYXBwZW5kPERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24+KG1fYnl0ZWNvZGUsIERGQUJ5
dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWVSYW5nZSk7CisgICAgYXBwZW5kPERGQUJ5dGVj
b2RlSW5zdHJ1Y3Rpb24+KG1fYnl0ZWNvZGUsIGNhc2VTZW5zaXRpdmUgPyBERkFCeXRlY29kZUlu
c3RydWN0aW9uOjpDaGVja1ZhbHVlUmFuZ2VDYXNlU2Vuc2l0aXZlIDogREZBQnl0ZWNvZGVJbnN0
cnVjdGlvbjo6Q2hlY2tWYWx1ZVJhbmdlQ2FzZUluc2Vuc2l0aXZlKTsKICAgICBhcHBlbmQ8dWlu
dDhfdD4obV9ieXRlY29kZSwgbG93VmFsdWUpOwogICAgIGFwcGVuZDx1aW50OF90PihtX2J5dGVj
b2RlLCBoaWdoVmFsdWUpOwogICAgIG1fbGlua1JlY29yZHMuYXBwZW5kKHN0ZDo6bWFrZV9wYWly
KG1fYnl0ZWNvZGUuc2l6ZSgpLCBkZXN0aW5hdGlvbk5vZGVJbmRleCkpOwotICAgIGFwcGVuZDx1
bnNpZ25lZD4obV9ieXRlY29kZSwgMCk7CisgICAgYXBwZW5kPHVuc2lnbmVkPihtX2J5dGVjb2Rl
LCAwKTsgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHNldCB3aGVuIGxpbmtpbmcuCiB9CiAKIHZvaWQg
REZBQnl0ZWNvZGVDb21waWxlcjo6ZW1pdFRlcm1pbmF0ZSgpCkBAIC0xMTMsNTYgKzExMiw3OCBA
QCB2b2lkIERGQUJ5dGVjb2RlQ29tcGlsZXI6OmNvbXBpbGVOb2RlKHVuCiAKIHZvaWQgREZBQnl0
ZWNvZGVDb21waWxlcjo6Y29tcGlsZU5vZGVUcmFuc2l0aW9ucyhjb25zdCBERkFOb2RlJiBub2Rl
KQogewotICAgIGJvb2wgaGFzUmFuZ2VNaW4gPSBmYWxzZTsKLSAgICB1aW50MTZfdCByYW5nZU1p
bjsKLSAgICB1bnNpZ25lZCByYW5nZURlc3RpbmF0aW9uID0gMDsKKyAgICB1bnNpZ25lZCBkZXN0
aW5hdGlvbnNbMTI4XTsKKyAgICBjb25zdCB1bnNpZ25lZCBub0Rlc3RpbmF0aW9uID0gc3RkOjpu
dW1lcmljX2xpbWl0czx1bnNpZ25lZD46Om1heCgpOworICAgIGZvciAodWludDE2X3QgaSA9IDA7
IGkgPCAxMjg7IGkrKykgeworICAgICAgICBhdXRvIGl0ID0gbm9kZS50cmFuc2l0aW9ucy5maW5k
KGkpOworICAgICAgICBpZiAoaXQgPT0gbm9kZS50cmFuc2l0aW9ucy5lbmQoKSkKKyAgICAgICAg
ICAgIGRlc3RpbmF0aW9uc1tpXSA9IG5vRGVzdGluYXRpb247CisgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgIGRlc3RpbmF0aW9uc1tpXSA9IGl0LT52YWx1ZTsKKyAgICB9CiAKLSAgICBmb3IgKHVu
c2lnbmVkIGNoYXIgaSA9IDA7IGkgPCAxMjg7ICsraSkgewotICAgICAgICBhdXRvIHRyYW5zaXRp
b25JdGVyYXRvciA9IG5vZGUudHJhbnNpdGlvbnMuZmluZChpKTsKLSAgICAgICAgaWYgKHRyYW5z
aXRpb25JdGVyYXRvciA9PSBub2RlLnRyYW5zaXRpb25zLmVuZCgpKSB7Ci0gICAgICAgICAgICBp
ZiAoaGFzUmFuZ2VNaW4pIHsKLSAgICAgICAgICAgICAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKCEo
bm9kZS5oYXNGYWxsYmFja1RyYW5zaXRpb24gJiYgbm9kZS5mYWxsYmFja1RyYW5zaXRpb24gPT0g
cmFuZ2VEZXN0aW5hdGlvbiksICJJbmRpdmlkdWFsIHRyYW5zaXRpb25zIHRvIHRoZSBmYWxsYmFj
ayB0cmFuc2l0aW9ucyBzaG91bGQgaGF2ZSBiZWVuIGVsaW1pbmF0ZWQgYnkgdGhlIG9wdGltaXpl
ci4iKTsKLQotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgbGFzdEhpZ2hWYWx1ZSA9IGkg
LSAxOwotICAgICAgICAgICAgICAgIGNvbXBpbGVDaGVja0ZvclJhbmdlKHJhbmdlTWluLCBsYXN0
SGlnaFZhbHVlLCByYW5nZURlc3RpbmF0aW9uKTsKLSAgICAgICAgICAgICAgICBoYXNSYW5nZU1p
biA9IGZhbHNlOworICAgIFZlY3RvcjxSYW5nZT4gcmFuZ2VzOworICAgIHVpbnQ4X3QgcmFuZ2VN
aW47CisgICAgYm9vbCBoYXNSYW5nZU1pbiA9IGZhbHNlOworICAgIGZvciAodWludDhfdCBpID0g
MDsgaSA8IDEyODsgaSsrKSB7CisgICAgICAgIGlmIChoYXNSYW5nZU1pbikgeworICAgICAgICAg
ICAgQVNTRVJUX1dJVEhfTUVTU0FHRSghKG5vZGUuaGFzRmFsbGJhY2tUcmFuc2l0aW9uICYmIG5v
ZGUuZmFsbGJhY2tUcmFuc2l0aW9uID09IGRlc3RpbmF0aW9uc1tyYW5nZU1pbl0pLCAiSW5kaXZp
ZHVhbCB0cmFuc2l0aW9ucyB0byB0aGUgZmFsbGJhY2sgdHJhbnNpdGlvbnMgc2hvdWxkIGhhdmUg
YmVlbiBlbGltaW5hdGVkIGJ5IHRoZSBvcHRpbWl6ZXIuIik7CisgICAgICAgICAgICBpZiAoZGVz
dGluYXRpb25zW2ldICE9IGRlc3RpbmF0aW9uc1tyYW5nZU1pbl0pIHsKKworICAgICAgICAgICAg
ICAgIC8vIFRoaXMgaXMgdGhlIGVuZCBvZiBhIHJhbmdlLiBDaGVjayBpZiBpdCBjYW4gYmUgY2Fz
ZSBpbnNlbnNpdGl2ZS4KKyAgICAgICAgICAgICAgICB1aW50OF90IHJhbmdlTWF4ID0gaSAtIDE7
CisgICAgICAgICAgICAgICAgYm9vbCBjYXNlU2Vuc2l0aXZlID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICBpZiAocmFuZ2VNaW4gPj0gJ0EnICYmIHJhbmdlTWF4IDw9ICdaJykgeworICAgICAgICAg
ICAgICAgICAgICBjYXNlU2Vuc2l0aXZlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGZv
ciAodWludDE2X3QgcmFuZ2VJbmRleCA9IHJhbmdlTWluOyByYW5nZUluZGV4IDw9IHJhbmdlTWF4
OyByYW5nZUluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlv
bnNbcmFuZ2VNaW5dICE9IGRlc3RpbmF0aW9uc1tyYW5nZUluZGV4ICsgJ2EnIC0gJ0EnXSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IGlmICghY2FzZVNlbnNpdGl2ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbGwgdGhl
IGxvd2VyLWNhc2UgZGVzdGluYXRpb25zIGFyZSB0aGUgc2FtZSBhcyB0aGUgdXBwZXItY2FzZSBk
ZXN0aW5hdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gdGhleSB3aWxsIGJlIGNv
dmVyZWQgYnkgYSBjYXNlLWluc2Vuc2l0aXZlIHJhbmdlIGFuZCB3aWxsIG5vdCBuZWVkIHRoZWly
IG93biByYW5nZS4KKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50OF90IHJhbmdlSW5kZXgg
PSByYW5nZU1pbjsgcmFuZ2VJbmRleCA8PSByYW5nZU1heDsgcmFuZ2VJbmRleCsrKSB7CisgICAg
ICAgICAgICAgICAgICAgICAgICBBU1NFUlQoZGVzdGluYXRpb25zW3JhbmdlTWluXSA9PSBkZXN0
aW5hdGlvbnNbcmFuZ2VJbmRleCArICdhJyAtICdBJ10pOworICAgICAgICAgICAgICAgICAgICAg
ICAgZGVzdGluYXRpb25zW3JhbmdlSW5kZXggKyAnYScgLSAnQSddID0gbm9EZXN0aW5hdGlvbjsK
KyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
ICAgIHJhbmdlcy5hcHBlbmQoUmFuZ2UocmFuZ2VNaW4sIHJhbmdlTWF4LCBkZXN0aW5hdGlvbnNb
cmFuZ2VNaW5dLCBjYXNlU2Vuc2l0aXZlKSk7CisgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0
aW9uc1tpXSA9PSBub0Rlc3RpbmF0aW9uKQorICAgICAgICAgICAgICAgICAgICBoYXNSYW5nZU1p
biA9IGZhbHNlOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmFu
Z2VNaW4gPSBpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAg
IH0KLQotICAgICAgICBpZiAoIWhhc1JhbmdlTWluKSB7Ci0gICAgICAgICAgICBoYXNSYW5nZU1p
biA9IHRydWU7Ci0gICAgICAgICAgICByYW5nZU1pbiA9IHRyYW5zaXRpb25JdGVyYXRvci0+a2V5
OwotICAgICAgICAgICAgcmFuZ2VEZXN0aW5hdGlvbiA9IHRyYW5zaXRpb25JdGVyYXRvci0+dmFs
dWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAodHJhbnNpdGlvbkl0ZXJhdG9y
LT52YWx1ZSA9PSByYW5nZURlc3RpbmF0aW9uKQotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwot
Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGxhc3RIaWdoVmFsdWUgPSBpIC0gMTsKLSAgICAg
ICAgICAgIGNvbXBpbGVDaGVja0ZvclJhbmdlKHJhbmdlTWluLCBsYXN0SGlnaFZhbHVlLCByYW5n
ZURlc3RpbmF0aW9uKTsKLSAgICAgICAgICAgIHJhbmdlTWluID0gaTsKLSAgICAgICAgICAgIHJh
bmdlRGVzdGluYXRpb24gPSB0cmFuc2l0aW9uSXRlcmF0b3ItPnZhbHVlOworICAgICAgICAgICAg
aWYgKGRlc3RpbmF0aW9uc1tpXSAhPSBub0Rlc3RpbmF0aW9uKSB7CisgICAgICAgICAgICAgICAg
cmFuZ2VNaW4gPSBpOworICAgICAgICAgICAgICAgIGhhc1JhbmdlTWluID0gdHJ1ZTsKKyAgICAg
ICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBpZiAoaGFzUmFuZ2VNaW4pCi0gICAgICAg
IGNvbXBpbGVDaGVja0ZvclJhbmdlKHJhbmdlTWluLCAxMjcsIHJhbmdlRGVzdGluYXRpb24pOwor
ICAgICAgICByYW5nZXMuYXBwZW5kKFJhbmdlKHJhbmdlTWluLCAxMjcsIGRlc3RpbmF0aW9uc1ty
YW5nZU1pbl0sIHRydWUpKTsKIAorICAgIGZvciAoY29uc3QgYXV0byYgcmFuZ2UgOiByYW5nZXMp
CisgICAgICAgIGNvbXBpbGVDaGVja0ZvclJhbmdlKHJhbmdlKTsKICAgICBpZiAobm9kZS5oYXNG
YWxsYmFja1RyYW5zaXRpb24pCiAgICAgICAgIGVtaXRKdW1wKG5vZGUuZmFsbGJhY2tUcmFuc2l0
aW9uKTsKICAgICBlbHNlCiAgICAgICAgIGVtaXRUZXJtaW5hdGUoKTsKIH0KIAotdm9pZCBERkFC
eXRlY29kZUNvbXBpbGVyOjpjb21waWxlQ2hlY2tGb3JSYW5nZSh1aW50MTZfdCBsb3dWYWx1ZSwg
dWludDE2X3QgaGlnaFZhbHVlLCB1bnNpZ25lZCBkZXN0aW5hdGlvbk5vZGVJbmRleCkKK3ZvaWQg
REZBQnl0ZWNvZGVDb21waWxlcjo6Y29tcGlsZUNoZWNrRm9yUmFuZ2UoY29uc3QgUmFuZ2UmIHJh
bmdlKQogewotICAgIEFTU0VSVF9XSVRIX01FU1NBR0UobG93VmFsdWUgPCAxMjgsICJUaGUgREZB
IGVuZ2luZSBvbmx5IHN1cHBvcnRzIHRoZSBBU0NJSSBhbHBoYWJldC4iKTsKLSAgICBBU1NFUlRf
V0lUSF9NRVNTQUdFKGhpZ2hWYWx1ZSA8IDEyOCwgIlRoZSBERkEgZW5naW5lIG9ubHkgc3VwcG9y
dHMgdGhlIEFTQ0lJIGFscGhhYmV0LiIpOwotICAgIEFTU0VSVChsb3dWYWx1ZSA8PSBoaWdoVmFs
dWUpOworICAgIEFTU0VSVF9XSVRIX01FU1NBR0UocmFuZ2UubWF4IDwgMTI4LCAiVGhlIERGQSBl
bmdpbmUgb25seSBzdXBwb3J0cyB0aGUgQVNDSUkgYWxwaGFiZXQuIik7CisgICAgQVNTRVJUKHJh
bmdlLm1pbiA8PSByYW5nZS5tYXgpOwogCi0gICAgaWYgKGxvd1ZhbHVlID09IGhpZ2hWYWx1ZSkK
LSAgICAgICAgZW1pdENoZWNrVmFsdWUobG93VmFsdWUsIGRlc3RpbmF0aW9uTm9kZUluZGV4KTsK
KyAgICBpZiAocmFuZ2UubWluID09IHJhbmdlLm1heCkKKyAgICAgICAgZW1pdENoZWNrVmFsdWUo
cmFuZ2UubWluLCByYW5nZS5kZXN0aW5hdGlvbiwgcmFuZ2UuY2FzZVNlbnNpdGl2ZSk7CiAgICAg
ZWxzZQotICAgICAgICBlbWl0Q2hlY2tWYWx1ZVJhbmdlKGxvd1ZhbHVlLCBoaWdoVmFsdWUsIGRl
c3RpbmF0aW9uTm9kZUluZGV4KTsKKyAgICAgICAgZW1pdENoZWNrVmFsdWVSYW5nZShyYW5nZS5t
aW4sIHJhbmdlLm1heCwgcmFuZ2UuZGVzdGluYXRpb24sIHJhbmdlLmNhc2VTZW5zaXRpdmUpOwog
fQogCiB2b2lkIERGQUJ5dGVjb2RlQ29tcGlsZXI6OmNvbXBpbGUoKQpJbmRleDogU291cmNlL1dl
YkNvcmUvY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNvZGVDb21waWxlci5oCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIu
aAkocmV2aXNpb24gMTgxNzY1KQorKysgU291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMv
REZBQnl0ZWNvZGVDb21waWxlci5oCSh3b3JraW5nIGNvcHkpCkBAIC00OSwxNSArNDksMjggQEAg
cHVibGljOgogICAgIHZvaWQgY29tcGlsZSgpOwogCiBwcml2YXRlOgorICAgIHN0cnVjdCBSYW5n
ZSB7CisgICAgICAgIFJhbmdlKHVpbnQ4X3QgbWluLCB1aW50OF90IG1heCwgdW5zaWduZWQgZGVz
dGluYXRpb24sIGJvb2wgY2FzZVNlbnNpdGl2ZSkKKyAgICAgICAgICAgIDogbWluKG1pbikKKyAg
ICAgICAgICAgICwgbWF4KG1heCkKKyAgICAgICAgICAgICwgZGVzdGluYXRpb24oZGVzdGluYXRp
b24pCisgICAgICAgICAgICAsIGNhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZSkKKyAgICAgICAg
eworICAgICAgICB9CisgICAgICAgIHVpbnQ4X3QgbWluOworICAgICAgICB1aW50OF90IG1heDsK
KyAgICAgICAgdW5zaWduZWQgZGVzdGluYXRpb247CisgICAgICAgIGJvb2wgY2FzZVNlbnNpdGl2
ZTsKKyAgICB9OwogICAgIHZvaWQgY29tcGlsZU5vZGUodW5zaWduZWQpOwogICAgIHZvaWQgY29t
cGlsZU5vZGVUcmFuc2l0aW9ucyhjb25zdCBERkFOb2RlJik7Ci0gICAgdm9pZCBjb21waWxlQ2hl
Y2tGb3JSYW5nZSh1aW50MTZfdCBsb3dWYWx1ZSwgdWludDE2X3QgaGlnaFZhbHVlLCB1bnNpZ25l
ZCBkZXN0aW5hdGlvbk5vZGVJbmRleCk7CisgICAgdm9pZCBjb21waWxlQ2hlY2tGb3JSYW5nZShj
b25zdCBSYW5nZSYpOwogCiAgICAgdm9pZCBlbWl0QXBwZW5kQWN0aW9uKHVuc2lnbmVkKTsKICAg
ICB2b2lkIGVtaXRUZXN0RmxhZ3NBbmRBcHBlbmRBY3Rpb24odWludDE2X3QgZmxhZ3MsIHVuc2ln
bmVkKTsKICAgICB2b2lkIGVtaXRKdW1wKHVuc2lnbmVkIGRlc3RpbmF0aW9uTm9kZUluZGV4KTsK
LSAgICB2b2lkIGVtaXRDaGVja1ZhbHVlKHVpbnQ4X3QgdmFsdWUsIHVuc2lnbmVkIGRlc3RpbmF0
aW9uTm9kZUluZGV4KTsKLSAgICB2b2lkIGVtaXRDaGVja1ZhbHVlUmFuZ2UodWludDhfdCBsb3dW
YWx1ZSwgdWludDhfdCBoaWdoVmFsdWUsIHVuc2lnbmVkIGRlc3RpbmF0aW9uTm9kZUluZGV4KTsK
KyAgICB2b2lkIGVtaXRDaGVja1ZhbHVlKHVpbnQ4X3QgdmFsdWUsIHVuc2lnbmVkIGRlc3RpbmF0
aW9uTm9kZUluZGV4LCBib29sIGNhc2VTZW5zaXRpdmUpOworICAgIHZvaWQgZW1pdENoZWNrVmFs
dWVSYW5nZSh1aW50OF90IGxvd1ZhbHVlLCB1aW50OF90IGhpZ2hWYWx1ZSwgdW5zaWduZWQgZGVz
dGluYXRpb25Ob2RlSW5kZXgsIGJvb2wgY2FzZVNlbnNpdGl2ZSk7CiAgICAgdm9pZCBlbWl0VGVy
bWluYXRlKCk7CiAKICAgICBWZWN0b3I8REZBQnl0ZWNvZGU+JiBtX2J5dGVjb2RlOwpJbmRleDog
U291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNvZGVJbnRlcnByZXRlci5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL1dlYkNvcmUvY29udGVudGV4dGVuc2lvbnMvREZBQnl0
ZWNvZGVJbnRlcnByZXRlci5jcHAJKHJldmlzaW9uIDE4MTc2NSkKKysrIFNvdXJjZS9XZWJDb3Jl
L2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlSW50ZXJwcmV0ZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC03MiwyNSArNzIsMzYgQEAgREZBQnl0ZWNvZGVJbnRlcnByZXRlcjo6QWN0aW9ucyBE
RkFCeXRlYwogICAgICAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OlRlcm1pbmF0ZToK
ICAgICAgICAgICAgIHJldHVybiBhY3Rpb25zOwogCi0gICAgICAgIGNhc2UgREZBQnl0ZWNvZGVJ
bnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZToKKyAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0
aW9uOjpDaGVja1ZhbHVlQ2FzZVNlbnNpdGl2ZToKKyAgICAgICAgY2FzZSBERkFCeXRlY29kZUlu
c3RydWN0aW9uOjpDaGVja1ZhbHVlQ2FzZUluc2Vuc2l0aXZlOiB7CiAgICAgICAgICAgICBpZiAo
dXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcpCiAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlv
bnM7CiAKKyAgICAgICAgICAgIGNoYXIgY2hhcmFjdGVyID0gdXJsW3VybEluZGV4XTsKKyAgICAg
ICAgICAgIGlmIChzdGF0aWNfY2FzdDxERkFCeXRlY29kZUluc3RydWN0aW9uPihtX2J5dGVjb2Rl
W3Byb2dyYW1Db3VudGVyXSkgPT0gREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZUNh
c2VJbnNlbnNpdGl2ZSkKKyAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB0b0FTQ0lJVXBwZXIo
Y2hhcmFjdGVyKTsKKwogICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBuZXh0IGNo
YXJhY3RlciBpbiB0aGUgdXJsIGlzIHRoZSB2YWx1ZSBzdG9yZWQgd2l0aCB0aGUgYnl0ZWNvZGUu
Ci0gICAgICAgICAgICBpZiAodXJsW3VybEluZGV4XSA9PSBnZXRCaXRzPHVpbnQ4X3Q+KG1fYnl0
ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyICsgc2l6ZW9mKERGQUJ5dGVj
b2RlKSkpIHsKKyAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT0gZ2V0Qml0czx1aW50OF90Piht
X2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFC
eXRlY29kZSkpKSB7CiAgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgPSBnZXRCaXRzPHVu
c2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNp
emVvZihERkFCeXRlY29kZSkgKyBzaXplb2YodWludDhfdCkpOwotICAgICAgICAgICAgICAgIGlm
ICghdXJsW3VybEluZGV4XSkKKyAgICAgICAgICAgICAgICBpZiAoIWNoYXJhY3RlcikKICAgICAg
ICAgICAgICAgICAgICAgdXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcgPSB0cnVlOwogICAgICAg
ICAgICAgICAgIHVybEluZGV4Kys7IC8vIFRoaXMgcmVwcmVzZW50cyBhbiBlZGdlIGluIHRoZSBE
RkEuCiAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBwcm9ncmFtQ291bnRlciAr
PSBpbnN0cnVjdGlvblNpemVXaXRoQXJndW1lbnRzKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNo
ZWNrVmFsdWUpOworICAgICAgICAgICAgICAgIHByb2dyYW1Db3VudGVyICs9IGluc3RydWN0aW9u
U2l6ZVdpdGhBcmd1bWVudHMoREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZUNhc2VT
ZW5zaXRpdmUpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KIAotICAgICAgICBjYXNl
IERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWVSYW5nZTogeworICAgICAgICBjYXNl
IERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWVSYW5nZUNhc2VTZW5zaXRpdmU6Cisg
ICAgICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZVJhbmdlQ2FzZUlu
c2Vuc2l0aXZlOiB7CiAgICAgICAgICAgICBpZiAodXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcp
CiAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGlvbnM7CiAKICAgICAgICAgICAgIGNoYXIgY2hh
cmFjdGVyID0gdXJsW3VybEluZGV4XTsKKyAgICAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxERkFC
eXRlY29kZUluc3RydWN0aW9uPihtX2J5dGVjb2RlW3Byb2dyYW1Db3VudGVyXSkgPT0gREZBQnl0
ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZVJhbmdlQ2FzZUluc2Vuc2l0aXZlKQorICAgICAg
ICAgICAgICAgIGNoYXJhY3RlciA9IHRvQVNDSUlVcHBlcihjaGFyYWN0ZXIpOworCisgICAgICAg
ICAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSB1cmwgaXMg
aW4gdGhlIHJhbmdlIHN0b3JlZCB3aXRoIHRoZSBieXRlY29kZS4KICAgICAgICAgICAgIGlmIChj
aGFyYWN0ZXIgPj0gZ2V0Qml0czx1aW50OF90PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3Ro
LCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRlY29kZSkpCiAgICAgICAgICAgICAgICAg
JiYgY2hhcmFjdGVyIDw9IGdldEJpdHM8dWludDhfdD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxl
bmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQ4
X3QpKSkgewogICAgICAgICAgICAgICAgIHByb2dyYW1Db3VudGVyID0gZ2V0Qml0czx1bnNpZ25l
ZD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2Yo
REZBQnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQ4X3QpICsgc2l6ZW9mKHVpbnQ4X3QpKTsKQEAgLTk4
LDcgKzEwOSw3IEBAIERGQUJ5dGVjb2RlSW50ZXJwcmV0ZXI6OkFjdGlvbnMgREZBQnl0ZWMKICAg
ICAgICAgICAgICAgICAgICAgdXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcgPSB0cnVlOwogICAg
ICAgICAgICAgICAgIHVybEluZGV4Kys7IC8vIFRoaXMgcmVwcmVzZW50cyBhbiBlZGdlIGluIHRo
ZSBERkEuCiAgICAgICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgICAgICBwcm9ncmFtQ291bnRl
ciArPSBpbnN0cnVjdGlvblNpemVXaXRoQXJndW1lbnRzKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246
OkNoZWNrVmFsdWVSYW5nZSk7CisgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5z
dHJ1Y3Rpb25TaXplV2l0aEFyZ3VtZW50cyhERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1Zh
bHVlUmFuZ2VDYXNlU2Vuc2l0aXZlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>249416</attachid>
            <date>2015-03-25 11:17:25 -0700</date>
            <delta_ts>2015-03-25 16:02:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-142977-20150325111648.patch</filename>
            <type>text/plain</type>
            <size>16534</size>
            <attacher name="Alex Christensen">achristensen</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvV2Vi
Q29yZS9DaGFuZ2VMb2cJKHJldmlzaW9uIDE4MTk2NCkKKysrIFNvdXJjZS9XZWJDb3JlL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI2IEBACisyMDE1LTAzLTI1ICBBbGV4IENo
cmlzdGVuc2VuICA8YWNocmlzdGVuc2VuQHdlYmtpdC5vcmc+CisKKyAgICAgICAgQWRkIGNhc2Ut
aW5zZW5zaXRpdmUgY2hlY2tzIHRvIERGQSBieXRlY29kZS4KKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE0Mjk3NworCisgICAgICAgIFJldmlld2VkIGJ5
IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogY29udGVudGV4dGVuc2lvbnMvREZBQnl0ZWNv
ZGUuaDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNpb25zOjppbnN0cnVjdGlvblNp
emVXaXRoQXJndW1lbnRzKToKKyAgICAgICAgKiBjb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29k
ZUNvbXBpbGVyLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OkNvbnRlbnRFeHRlbnNpb25zOjpERkFC
eXRlY29kZUNvbXBpbGVyOjplbWl0Q2hlY2tWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpDb250
ZW50RXh0ZW5zaW9uczo6REZBQnl0ZWNvZGVDb21waWxlcjo6ZW1pdENoZWNrVmFsdWVSYW5nZSk6
CisgICAgICAgIEFkZCBjYXNlLWluc2Vuc2l0aXZlIGJ5dGVjb2RlLgorICAgICAgICAoV2ViQ29y
ZTo6Q29udGVudEV4dGVuc2lvbnM6OkRGQUJ5dGVjb2RlQ29tcGlsZXI6OmNvbXBpbGVOb2RlVHJh
bnNpdGlvbnMpOgorICAgICAgICBDaGVjayB0byBzZWUgaWYgY2FzZS1pbnNlbnNpdGl2ZSBieXRl
Y29kZXMgY2FuIGJlIHVzZWQuCisgICAgICAgIChXZWJDb3JlOjpDb250ZW50RXh0ZW5zaW9uczo6
REZBQnl0ZWNvZGVDb21waWxlcjo6Y29tcGlsZUNoZWNrRm9yUmFuZ2UpOgorICAgICAgICAqIGNv
bnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIuaDoKKyAgICAgICAgKFdlYkNvcmU6
OkNvbnRlbnRFeHRlbnNpb25zOjpERkFCeXRlY29kZUNvbXBpbGVyOjpSYW5nZTo6UmFuZ2UpOgor
ICAgICAgICBBZGRlZCBSYW5nZSBzdHJ1Y3R1cmUgdG8gYmUgYWJsZSB0byBjb3VudCB0aGUgcmFu
Z2VzIGluIGEgZnV0dXJlIHBhdGNoIGRlY2lkaW5nIGlmIHdlIHdhbnQgdG8gdXNlIGp1bXAgdGFi
bGVzLgorICAgICAgICAqIGNvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlSW50ZXJwcmV0ZXIu
Y3BwOgorICAgICAgICAoV2ViQ29yZTo6Q29udGVudEV4dGVuc2lvbnM6OkRGQUJ5dGVjb2RlSW50
ZXJwcmV0ZXI6OmludGVycHJldCk6CisgICAgICAgIEludGVycHJldCBjYXNlLWluc2Vuc2l0aXZl
IGJ5dGVjb2Rlcy4KKwogMjAxNS0wMy0yNSAgQWxleCBDaHJpc3RlbnNlbiAgPGFjaHJpc3RlbnNl
bkB3ZWJraXQub3JnPgogCiAgICAgICAgIFtDb250ZW50IEV4dGVuc2lvbnNdIEFkZCBtdWx0aS1E
RkEgY29tcGlsaW5nIGFuZCBpbnRlcnByZXRpbmcuCkluZGV4OiBTb3VyY2UvV2ViQ29yZS9jb250
ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29kZS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3Jl
L2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlLmgJKHJldmlzaW9uIDE4MTk2MykKKysrIFNv
dXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTM5LDEzICszOSwxNSBAQCBlbnVtIGNsYXNzIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24g
OiB1aW50CiAgICAgLy8gQ2hlY2tWYWx1ZSBoYXMgdHdvIGFyZ3VtZW50czoKICAgICAvLyBUaGUg
dmFsdWUgdG8gY2hlY2sgKDEgYnl0ZSksCiAgICAgLy8gVGhlIGluZGV4IHRvIGp1bXAgdG8gaWYg
dGhlIHZhbHVlcyBhcmUgZXF1YWwgKDQgYnl0ZXMpLgotICAgIENoZWNrVmFsdWUsCisgICAgQ2hl
Y2tWYWx1ZUNhc2VJbnNlbnNpdGl2ZSwKKyAgICBDaGVja1ZhbHVlQ2FzZVNlbnNpdGl2ZSwKIAog
ICAgIC8vIEp1bXAgdG8gYW4gb2Zmc2V0IGlmIHRoZSBpbnB1dCB2YWx1ZSBpcyB3aXRoaW4gYSBj
ZXJ0YWluIHJhbmdlLgogICAgIC8vIFRoZSBsb3dlciB2YWx1ZSAoMSBieXRlKS4KICAgICAvLyBU
aGUgaGlnaGVyIHZhbHVlICgxIGJ5dGUpLgogICAgIC8vIFRoZSBpbmRleCB0byBqdW1wIHRvIGlm
IHRoZSB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgKDQgYnl0ZXMpLgotICAgIENoZWNrVmFsdWVSYW5n
ZSwKKyAgICBDaGVja1ZhbHVlUmFuZ2VDYXNlSW5zZW5zaXRpdmUsCisgICAgQ2hlY2tWYWx1ZVJh
bmdlQ2FzZVNlbnNpdGl2ZSwKIAogICAgIC8vIEFwcGVuZEFjdGlvbiBoYXMgb25lIGFyZ3VtZW50
OgogICAgIC8vIFRoZSBhY3Rpb24gdG8gYXBwZW5kICg0IGJ5dGVzKS4KQEAgLTY3LDkgKzY5LDEx
IEBAIGVudW0gY2xhc3MgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbiA6IHVpbnQKIHN0YXRpYyBpbmxp
bmUgc2l6ZV90IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMoREZBQnl0ZWNvZGVJbnN0cnVj
dGlvbiBpbnN0cnVjdGlvbikKIHsKICAgICBzd2l0Y2ggKGluc3RydWN0aW9uKSB7Ci0gICAgY2Fz
ZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlOgorICAgIGNhc2UgREZBQnl0ZWNv
ZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZUNhc2VTZW5zaXRpdmU6CisgICAgY2FzZSBERkFCeXRl
Y29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlQ2FzZUluc2Vuc2l0aXZlOgogICAgICAgICByZXR1
cm4gc2l6ZW9mKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24pICsgc2l6ZW9mKHVpbnQ4X3QpICsgc2l6
ZW9mKHVuc2lnbmVkKTsKLSAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFs
dWVSYW5nZToKKyAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWVSYW5n
ZUNhc2VTZW5zaXRpdmU6CisgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1Zh
bHVlUmFuZ2VDYXNlSW5zZW5zaXRpdmU6CiAgICAgICAgIHJldHVybiBzaXplb2YoREZBQnl0ZWNv
ZGVJbnN0cnVjdGlvbikgKyBzaXplb2YodWludDhfdCkgKyBzaXplb2YodWludDhfdCkgKyBzaXpl
b2YodW5zaWduZWQpOwogICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6QXBwZW5kQWN0
aW9uOgogICAgICAgICByZXR1cm4gc2l6ZW9mKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24pICsgc2l6
ZW9mKHVuc2lnbmVkKTsKSW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RG
QUJ5dGVjb2RlQ29tcGlsZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2NvbnRl
bnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIuY3BwCShyZXZpc2lvbiAxODE5NjQpCisr
KyBTb3VyY2UvV2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29kZUNvbXBpbGVyLmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNjksMjQgKzY5LDIzIEBAIHZvaWQgREZBQnl0ZWNvZGVDb21w
aWxlcjo6ZW1pdEp1bXAodW5zaWcKICAgICBhcHBlbmQ8dW5zaWduZWQ+KG1fYnl0ZWNvZGUsIDAp
OyAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgc2V0IHdoZW4gbGlua2luZy4KIH0KIAotdm9pZCBERkFC
eXRlY29kZUNvbXBpbGVyOjplbWl0Q2hlY2tWYWx1ZSh1aW50OF90IHZhbHVlLCB1bnNpZ25lZCBk
ZXN0aW5hdGlvbk5vZGVJbmRleCkKK3ZvaWQgREZBQnl0ZWNvZGVDb21waWxlcjo6ZW1pdENoZWNr
VmFsdWUodWludDhfdCB2YWx1ZSwgdW5zaWduZWQgZGVzdGluYXRpb25Ob2RlSW5kZXgsIGJvb2wg
Y2FzZVNlbnNpdGl2ZSkKIHsKLSAgICBhcHBlbmQ8REZBQnl0ZWNvZGVJbnN0cnVjdGlvbj4obV9i
eXRlY29kZSwgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZSk7CisgICAgYXBwZW5k
PERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24+KG1fYnl0ZWNvZGUsIGNhc2VTZW5zaXRpdmUgPyBERkFC
eXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlQ2FzZVNlbnNpdGl2ZSA6IERGQUJ5dGVjb2Rl
SW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWVDYXNlSW5zZW5zaXRpdmUpOwogICAgIGFwcGVuZDx1aW50
OF90PihtX2J5dGVjb2RlLCB2YWx1ZSk7CiAgICAgbV9saW5rUmVjb3Jkcy5hcHBlbmQoc3RkOjpt
YWtlX3BhaXIobV9ieXRlY29kZS5zaXplKCksIGRlc3RpbmF0aW9uTm9kZUluZGV4KSk7CiAgICAg
YXBwZW5kPHVuc2lnbmVkPihtX2J5dGVjb2RlLCAwKTsgLy8gVGhpcyB2YWx1ZSB3aWxsIGJlIHNl
dCB3aGVuIGxpbmtpbmcuCiB9CiAKLXZvaWQgREZBQnl0ZWNvZGVDb21waWxlcjo6ZW1pdENoZWNr
VmFsdWVSYW5nZSh1aW50OF90IGxvd1ZhbHVlLCB1aW50OF90IGhpZ2hWYWx1ZSwgdW5zaWduZWQg
ZGVzdGluYXRpb25Ob2RlSW5kZXgpCit2b2lkIERGQUJ5dGVjb2RlQ29tcGlsZXI6OmVtaXRDaGVj
a1ZhbHVlUmFuZ2UodWludDhfdCBsb3dWYWx1ZSwgdWludDhfdCBoaWdoVmFsdWUsIHVuc2lnbmVk
IGRlc3RpbmF0aW9uTm9kZUluZGV4LCBib29sIGNhc2VTZW5zaXRpdmUpCiB7Ci0gICAgQVNTRVJU
X1dJVEhfTUVTU0FHRShsb3dWYWx1ZSAhPSBoaWdoVmFsdWUsICJBIHNpbmdsZSB2YWx1ZSBjaGVj
ayBzaG91bGQgYmUgZW1pdHRlZCBmb3Igc2luZ2xlIHZhbHVlcy4iKTsKLSAgICBBU1NFUlRfV0lU
SF9NRVNTQUdFKGxvd1ZhbHVlIDwgaGlnaFZhbHVlLCAiVGhlIGluc3RydWN0aW9uIHNlbWFudGlj
IGltcG9zZSBsb3dWYWx1ZSBpcyBzbWFsbGVyIHRoYW4gaGlnaFZhbHVlLiIpOworICAgIEFTU0VS
VF9XSVRIX01FU1NBR0UobG93VmFsdWUgPCBoaWdoVmFsdWUsICJUaGUgaW5zdHJ1Y3Rpb24gc2Vt
YW50aWMgaW1wb3NlIGxvd1ZhbHVlIGlzIHN0cmljdGx5IGxlc3MgdGhhbiBoaWdoVmFsdWUuIik7
CiAKLSAgICBhcHBlbmQ8REZBQnl0ZWNvZGVJbnN0cnVjdGlvbj4obV9ieXRlY29kZSwgREZBQnl0
ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZVJhbmdlKTsKKyAgICBhcHBlbmQ8REZBQnl0ZWNv
ZGVJbnN0cnVjdGlvbj4obV9ieXRlY29kZSwgY2FzZVNlbnNpdGl2ZSA/IERGQUJ5dGVjb2RlSW5z
dHJ1Y3Rpb246OkNoZWNrVmFsdWVSYW5nZUNhc2VTZW5zaXRpdmUgOiBERkFCeXRlY29kZUluc3Ry
dWN0aW9uOjpDaGVja1ZhbHVlUmFuZ2VDYXNlSW5zZW5zaXRpdmUpOwogICAgIGFwcGVuZDx1aW50
OF90PihtX2J5dGVjb2RlLCBsb3dWYWx1ZSk7CiAgICAgYXBwZW5kPHVpbnQ4X3Q+KG1fYnl0ZWNv
ZGUsIGhpZ2hWYWx1ZSk7CiAgICAgbV9saW5rUmVjb3Jkcy5hcHBlbmQoc3RkOjptYWtlX3BhaXIo
bV9ieXRlY29kZS5zaXplKCksIGRlc3RpbmF0aW9uTm9kZUluZGV4KSk7Ci0gICAgYXBwZW5kPHVu
c2lnbmVkPihtX2J5dGVjb2RlLCAwKTsKKyAgICBhcHBlbmQ8dW5zaWduZWQ+KG1fYnl0ZWNvZGUs
IDApOyAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgc2V0IHdoZW4gbGlua2luZy4KIH0KIAogdm9pZCBE
RkFCeXRlY29kZUNvbXBpbGVyOjplbWl0VGVybWluYXRlKCkKQEAgLTExMyw1NiArMTEyLDgzIEBA
IHZvaWQgREZBQnl0ZWNvZGVDb21waWxlcjo6Y29tcGlsZU5vZGUodW4KIAogdm9pZCBERkFCeXRl
Y29kZUNvbXBpbGVyOjpjb21waWxlTm9kZVRyYW5zaXRpb25zKGNvbnN0IERGQU5vZGUmIG5vZGUp
CiB7Ci0gICAgYm9vbCBoYXNSYW5nZU1pbiA9IGZhbHNlOwotICAgIHVpbnQxNl90IHJhbmdlTWlu
OwotICAgIHVuc2lnbmVkIHJhbmdlRGVzdGluYXRpb24gPSAwOworICAgIHVuc2lnbmVkIGRlc3Rp
bmF0aW9uc1sxMjhdOworICAgIGNvbnN0IHVuc2lnbmVkIG5vRGVzdGluYXRpb24gPSBzdGQ6Om51
bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7CisgICAgZm9yICh1aW50MTZfdCBpID0gMDsg
aSA8IDEyODsgaSsrKSB7CisgICAgICAgIGF1dG8gaXQgPSBub2RlLnRyYW5zaXRpb25zLmZpbmQo
aSk7CisgICAgICAgIGlmIChpdCA9PSBub2RlLnRyYW5zaXRpb25zLmVuZCgpKQorICAgICAgICAg
ICAgZGVzdGluYXRpb25zW2ldID0gbm9EZXN0aW5hdGlvbjsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgZGVzdGluYXRpb25zW2ldID0gaXQtPnZhbHVlOworICAgIH0KIAotICAgIGZvciAodW5z
aWduZWQgY2hhciBpID0gMDsgaSA8IDEyODsgKytpKSB7Ci0gICAgICAgIGF1dG8gdHJhbnNpdGlv
bkl0ZXJhdG9yID0gbm9kZS50cmFuc2l0aW9ucy5maW5kKGkpOwotICAgICAgICBpZiAodHJhbnNp
dGlvbkl0ZXJhdG9yID09IG5vZGUudHJhbnNpdGlvbnMuZW5kKCkpIHsKLSAgICAgICAgICAgIGlm
IChoYXNSYW5nZU1pbikgewotICAgICAgICAgICAgICAgIEFTU0VSVF9XSVRIX01FU1NBR0UoIShu
b2RlLmhhc0ZhbGxiYWNrVHJhbnNpdGlvbiAmJiBub2RlLmZhbGxiYWNrVHJhbnNpdGlvbiA9PSBy
YW5nZURlc3RpbmF0aW9uKSwgIkluZGl2aWR1YWwgdHJhbnNpdGlvbnMgdG8gdGhlIGZhbGxiYWNr
IHRyYW5zaXRpb25zIHNob3VsZCBoYXZlIGJlZW4gZWxpbWluYXRlZCBieSB0aGUgb3B0aW1pemVy
LiIpOwotCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBsYXN0SGlnaFZhbHVlID0gaSAt
IDE7Ci0gICAgICAgICAgICAgICAgY29tcGlsZUNoZWNrRm9yUmFuZ2UocmFuZ2VNaW4sIGxhc3RI
aWdoVmFsdWUsIHJhbmdlRGVzdGluYXRpb24pOwotICAgICAgICAgICAgICAgIGhhc1JhbmdlTWlu
ID0gZmFsc2U7CisgICAgVmVjdG9yPFJhbmdlPiByYW5nZXM7CisgICAgdWludDhfdCByYW5nZU1p
bjsKKyAgICBib29sIGhhc1JhbmdlTWluID0gZmFsc2U7CisgICAgZm9yICh1aW50OF90IGkgPSAw
OyBpIDwgMTI4OyBpKyspIHsKKyAgICAgICAgaWYgKGhhc1JhbmdlTWluKSB7CisgICAgICAgICAg
ICBBU1NFUlRfV0lUSF9NRVNTQUdFKCEobm9kZS5oYXNGYWxsYmFja1RyYW5zaXRpb24gJiYgbm9k
ZS5mYWxsYmFja1RyYW5zaXRpb24gPT0gZGVzdGluYXRpb25zW3JhbmdlTWluXSksICJJbmRpdmlk
dWFsIHRyYW5zaXRpb25zIHRvIHRoZSBmYWxsYmFjayB0cmFuc2l0aW9ucyBzaG91bGQgaGF2ZSBi
ZWVuIGVsaW1pbmF0ZWQgYnkgdGhlIG9wdGltaXplci4iKTsKKyAgICAgICAgICAgIGlmIChkZXN0
aW5hdGlvbnNbaV0gIT0gZGVzdGluYXRpb25zW3JhbmdlTWluXSkgeworCisgICAgICAgICAgICAg
ICAgLy8gVGhpcyBpcyB0aGUgZW5kIG9mIGEgcmFuZ2UuIENoZWNrIGlmIGl0IGNhbiBiZSBjYXNl
IGluc2Vuc2l0aXZlLgorICAgICAgICAgICAgICAgIHVpbnQ4X3QgcmFuZ2VNYXggPSBpIC0gMTsK
KyAgICAgICAgICAgICAgICBib29sIGNhc2VTZW5zaXRpdmUgPSB0cnVlOworICAgICAgICAgICAg
ICAgIGlmIChyYW5nZU1pbiA+PSAnQScgJiYgcmFuZ2VNYXggPD0gJ1onKSB7CisgICAgICAgICAg
ICAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgZm9y
ICh1aW50OF90IHJhbmdlSW5kZXggPSByYW5nZU1pbjsgcmFuZ2VJbmRleCA8PSByYW5nZU1heDsg
cmFuZ2VJbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25z
W3JhbmdlTWluXSAhPSBkZXN0aW5hdGlvbnNbdG9BU0NJSUxvd2VyKHJhbmdlSW5kZXgpXSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VTZW5zaXRpdmUgPSB0cnVlOworICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAg
ICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGFsbCB0
aGUgbG93ZXItY2FzZSBkZXN0aW5hdGlvbnMgYXJlIHRoZSBzYW1lIGFzIHRoZSB1cHBlci1jYXNl
IGRlc3RpbmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0aGV5IHdpbGwgYmUg
Y292ZXJlZCBieSBhIGNhc2UtaW5zZW5zaXRpdmUgcmFuZ2UgYW5kIHdpbGwgbm90IG5lZWQgdGhl
aXIgb3duIHJhbmdlLgorICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQ4X3QgcmFuZ2VJbmRl
eCA9IHJhbmdlTWluOyByYW5nZUluZGV4IDw9IHJhbmdlTWF4OyByYW5nZUluZGV4KyspIHsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVChkZXN0aW5hdGlvbnNbcmFuZ2VNaW5dID09IGRl
c3RpbmF0aW9uc1t0b0FTQ0lJTG93ZXIocmFuZ2VJbmRleCldKTsKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGRlc3RpbmF0aW9uc1t0b0FTQ0lJTG93ZXIocmFuZ2VJbmRleCldID0gbm9EZXN0aW5h
dGlvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByYW5nZXMu
YXBwZW5kKFJhbmdlKHRvQVNDSUlMb3dlcihyYW5nZU1pbiksIHRvQVNDSUlMb3dlcihyYW5nZU1h
eCksIGRlc3RpbmF0aW9uc1tyYW5nZU1pbl0sIGNhc2VTZW5zaXRpdmUpKTsKKyAgICAgICAgICAg
ICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmFuZ2VzLmFwcGVuZChSYW5nZShyYW5n
ZU1pbiwgcmFuZ2VNYXgsIGRlc3RpbmF0aW9uc1tyYW5nZU1pbl0sIGNhc2VTZW5zaXRpdmUpKTsK
KworICAgICAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbnNbaV0gPT0gbm9EZXN0aW5hdGlvbikK
KyAgICAgICAgICAgICAgICAgICAgaGFzUmFuZ2VNaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAg
ICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJhbmdlTWluID0gaTsKICAgICAgICAgICAgIH0K
LSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFoYXNSYW5n
ZU1pbikgewotICAgICAgICAgICAgaGFzUmFuZ2VNaW4gPSB0cnVlOwotICAgICAgICAgICAgcmFu
Z2VNaW4gPSB0cmFuc2l0aW9uSXRlcmF0b3ItPmtleTsKLSAgICAgICAgICAgIHJhbmdlRGVzdGlu
YXRpb24gPSB0cmFuc2l0aW9uSXRlcmF0b3ItPnZhbHVlOwogICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgaWYgKHRyYW5zaXRpb25JdGVyYXRvci0+dmFsdWUgPT0gcmFuZ2VEZXN0aW5hdGlv
bikKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLQotICAgICAgICAgICAgdW5zaWduZWQgY2hh
ciBsYXN0SGlnaFZhbHVlID0gaSAtIDE7Ci0gICAgICAgICAgICBjb21waWxlQ2hlY2tGb3JSYW5n
ZShyYW5nZU1pbiwgbGFzdEhpZ2hWYWx1ZSwgcmFuZ2VEZXN0aW5hdGlvbik7Ci0gICAgICAgICAg
ICByYW5nZU1pbiA9IGk7Ci0gICAgICAgICAgICByYW5nZURlc3RpbmF0aW9uID0gdHJhbnNpdGlv
bkl0ZXJhdG9yLT52YWx1ZTsKKyAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbnNbaV0gIT0gbm9E
ZXN0aW5hdGlvbikgeworICAgICAgICAgICAgICAgIHJhbmdlTWluID0gaTsKKyAgICAgICAgICAg
ICAgICBoYXNSYW5nZU1pbiA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9
Ci0gICAgaWYgKGhhc1JhbmdlTWluKQotICAgICAgICBjb21waWxlQ2hlY2tGb3JSYW5nZShyYW5n
ZU1pbiwgMTI3LCByYW5nZURlc3RpbmF0aW9uKTsKKyAgICBpZiAoaGFzUmFuZ2VNaW4pIHsKKyAg
ICAgICAgLy8gUmFuZ2VzIGFyZSBhcHBlbmRlZCBhZnRlciBwYXNzaW5nIHRoZSBlbmQgb2YgdGhl
bS4KKyAgICAgICAgLy8gSWYgYSByYW5nZSBnb2VzIHRvIDEyNywgd2Ugd2lsbCBoYXZlIGFuIHVu
Y29tbWl0dGVkIHJhbmdlTWluIGJlY2F1c2UgdGhlIGxvb3AgZG9lcyBub3QgY2hlY2sgMTI4Lgor
ICAgICAgICByYW5nZXMuYXBwZW5kKFJhbmdlKHJhbmdlTWluLCAxMjcsIGRlc3RpbmF0aW9uc1ty
YW5nZU1pbl0sIHRydWUpKTsKKyAgICB9CiAKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHJhbmdlIDog
cmFuZ2VzKQorICAgICAgICBjb21waWxlQ2hlY2tGb3JSYW5nZShyYW5nZSk7CiAgICAgaWYgKG5v
ZGUuaGFzRmFsbGJhY2tUcmFuc2l0aW9uKQogICAgICAgICBlbWl0SnVtcChub2RlLmZhbGxiYWNr
VHJhbnNpdGlvbik7CiAgICAgZWxzZQogICAgICAgICBlbWl0VGVybWluYXRlKCk7CiB9CiAKLXZv
aWQgREZBQnl0ZWNvZGVDb21waWxlcjo6Y29tcGlsZUNoZWNrRm9yUmFuZ2UodWludDE2X3QgbG93
VmFsdWUsIHVpbnQxNl90IGhpZ2hWYWx1ZSwgdW5zaWduZWQgZGVzdGluYXRpb25Ob2RlSW5kZXgp
Cit2b2lkIERGQUJ5dGVjb2RlQ29tcGlsZXI6OmNvbXBpbGVDaGVja0ZvclJhbmdlKGNvbnN0IFJh
bmdlJiByYW5nZSkKIHsKLSAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKGxvd1ZhbHVlIDwgMTI4LCAi
VGhlIERGQSBlbmdpbmUgb25seSBzdXBwb3J0cyB0aGUgQVNDSUkgYWxwaGFiZXQuIik7Ci0gICAg
QVNTRVJUX1dJVEhfTUVTU0FHRShoaWdoVmFsdWUgPCAxMjgsICJUaGUgREZBIGVuZ2luZSBvbmx5
IHN1cHBvcnRzIHRoZSBBU0NJSSBhbHBoYWJldC4iKTsKLSAgICBBU1NFUlQobG93VmFsdWUgPD0g
aGlnaFZhbHVlKTsKKyAgICBBU1NFUlRfV0lUSF9NRVNTQUdFKHJhbmdlLm1heCA8IDEyOCwgIlRo
ZSBERkEgZW5naW5lIG9ubHkgc3VwcG9ydHMgdGhlIEFTQ0lJIGFscGhhYmV0LiIpOworICAgIEFT
U0VSVChyYW5nZS5taW4gPD0gcmFuZ2UubWF4KTsKIAotICAgIGlmIChsb3dWYWx1ZSA9PSBoaWdo
VmFsdWUpCi0gICAgICAgIGVtaXRDaGVja1ZhbHVlKGxvd1ZhbHVlLCBkZXN0aW5hdGlvbk5vZGVJ
bmRleCk7CisgICAgaWYgKHJhbmdlLm1pbiA9PSByYW5nZS5tYXgpCisgICAgICAgIGVtaXRDaGVj
a1ZhbHVlKHJhbmdlLm1pbiwgcmFuZ2UuZGVzdGluYXRpb24sIHJhbmdlLmNhc2VTZW5zaXRpdmUp
OwogICAgIGVsc2UKLSAgICAgICAgZW1pdENoZWNrVmFsdWVSYW5nZShsb3dWYWx1ZSwgaGlnaFZh
bHVlLCBkZXN0aW5hdGlvbk5vZGVJbmRleCk7CisgICAgICAgIGVtaXRDaGVja1ZhbHVlUmFuZ2Uo
cmFuZ2UubWluLCByYW5nZS5tYXgsIHJhbmdlLmRlc3RpbmF0aW9uLCByYW5nZS5jYXNlU2Vuc2l0
aXZlKTsKIH0KIAogdm9pZCBERkFCeXRlY29kZUNvbXBpbGVyOjpjb21waWxlKCkKSW5kZXg6IFNv
dXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIuaAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBTb3VyY2UvV2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29kZUNv
bXBpbGVyLmgJKHJldmlzaW9uIDE4MTk2MykKKysrIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRl
bnNpb25zL0RGQUJ5dGVjb2RlQ29tcGlsZXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDksMTUgKzQ5
LDI4IEBAIHB1YmxpYzoKICAgICB2b2lkIGNvbXBpbGUoKTsKIAogcHJpdmF0ZToKKyAgICBzdHJ1
Y3QgUmFuZ2UgeworICAgICAgICBSYW5nZSh1aW50OF90IG1pbiwgdWludDhfdCBtYXgsIHVuc2ln
bmVkIGRlc3RpbmF0aW9uLCBib29sIGNhc2VTZW5zaXRpdmUpCisgICAgICAgICAgICA6IG1pbiht
aW4pCisgICAgICAgICAgICAsIG1heChtYXgpCisgICAgICAgICAgICAsIGRlc3RpbmF0aW9uKGRl
c3RpbmF0aW9uKQorICAgICAgICAgICAgLCBjYXNlU2Vuc2l0aXZlKGNhc2VTZW5zaXRpdmUpCisg
ICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICB1aW50OF90IG1pbjsKKyAgICAgICAgdWludDhf
dCBtYXg7CisgICAgICAgIHVuc2lnbmVkIGRlc3RpbmF0aW9uOworICAgICAgICBib29sIGNhc2VT
ZW5zaXRpdmU7CisgICAgfTsKICAgICB2b2lkIGNvbXBpbGVOb2RlKHVuc2lnbmVkKTsKICAgICB2
b2lkIGNvbXBpbGVOb2RlVHJhbnNpdGlvbnMoY29uc3QgREZBTm9kZSYpOwotICAgIHZvaWQgY29t
cGlsZUNoZWNrRm9yUmFuZ2UodWludDE2X3QgbG93VmFsdWUsIHVpbnQxNl90IGhpZ2hWYWx1ZSwg
dW5zaWduZWQgZGVzdGluYXRpb25Ob2RlSW5kZXgpOworICAgIHZvaWQgY29tcGlsZUNoZWNrRm9y
UmFuZ2UoY29uc3QgUmFuZ2UmKTsKIAogICAgIHZvaWQgZW1pdEFwcGVuZEFjdGlvbih1bnNpZ25l
ZCk7CiAgICAgdm9pZCBlbWl0VGVzdEZsYWdzQW5kQXBwZW5kQWN0aW9uKHVpbnQxNl90IGZsYWdz
LCB1bnNpZ25lZCk7CiAgICAgdm9pZCBlbWl0SnVtcCh1bnNpZ25lZCBkZXN0aW5hdGlvbk5vZGVJ
bmRleCk7Ci0gICAgdm9pZCBlbWl0Q2hlY2tWYWx1ZSh1aW50OF90IHZhbHVlLCB1bnNpZ25lZCBk
ZXN0aW5hdGlvbk5vZGVJbmRleCk7Ci0gICAgdm9pZCBlbWl0Q2hlY2tWYWx1ZVJhbmdlKHVpbnQ4
X3QgbG93VmFsdWUsIHVpbnQ4X3QgaGlnaFZhbHVlLCB1bnNpZ25lZCBkZXN0aW5hdGlvbk5vZGVJ
bmRleCk7CisgICAgdm9pZCBlbWl0Q2hlY2tWYWx1ZSh1aW50OF90IHZhbHVlLCB1bnNpZ25lZCBk
ZXN0aW5hdGlvbk5vZGVJbmRleCwgYm9vbCBjYXNlU2Vuc2l0aXZlKTsKKyAgICB2b2lkIGVtaXRD
aGVja1ZhbHVlUmFuZ2UodWludDhfdCBsb3dWYWx1ZSwgdWludDhfdCBoaWdoVmFsdWUsIHVuc2ln
bmVkIGRlc3RpbmF0aW9uTm9kZUluZGV4LCBib29sIGNhc2VTZW5zaXRpdmUpOwogICAgIHZvaWQg
ZW1pdFRlcm1pbmF0ZSgpOwogCiAgICAgVmVjdG9yPERGQUJ5dGVjb2RlPiYgbV9ieXRlY29kZTsK
SW5kZXg6IFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25zL0RGQUJ5dGVjb2RlSW50ZXJw
cmV0ZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9XZWJDb3JlL2NvbnRlbnRleHRlbnNpb25z
L0RGQUJ5dGVjb2RlSW50ZXJwcmV0ZXIuY3BwCShyZXZpc2lvbiAxODE5NjQpCisrKyBTb3VyY2Uv
V2ViQ29yZS9jb250ZW50ZXh0ZW5zaW9ucy9ERkFCeXRlY29kZUludGVycHJldGVyLmNwcAkod29y
a2luZyBjb3B5KQpAQCAtODUsMzMgKzg1LDQ2IEBAIERGQUJ5dGVjb2RlSW50ZXJwcmV0ZXI6OkFj
dGlvbnMgREZBQnl0ZWMKICAgICAgICAgICAgIGNhc2UgREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6
VGVybWluYXRlOgogICAgICAgICAgICAgICAgIGdvdG8gbmV4dERGQTsKICAgICAgICAgICAgICAg
ICAgICAgCi0gICAgICAgICAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFs
dWU6CisgICAgICAgICAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNrVmFsdWVD
YXNlU2Vuc2l0aXZlOgorICAgICAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpD
aGVja1ZhbHVlQ2FzZUluc2Vuc2l0aXZlOiB7CiAgICAgICAgICAgICAgICAgaWYgKHVybEluZGV4
SXNBZnRlckVuZE9mU3RyaW5nKQogICAgICAgICAgICAgICAgICAgICBnb3RvIG5leHRERkE7CiAK
KyAgICAgICAgICAgICAgICBjaGFyIGNoYXJhY3RlciA9IHVybFt1cmxJbmRleF07CisgICAgICAg
ICAgICAgICAgaWYgKHN0YXRpY19jYXN0PERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24+KG1fYnl0ZWNv
ZGVbcHJvZ3JhbUNvdW50ZXJdKSA9PSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVl
Q2FzZUluc2Vuc2l0aXZlKQorICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgPSB0b0FTQ0lJ
TG93ZXIoY2hhcmFjdGVyKTsKKwogICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0
aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHVybCBpcyB0aGUgdmFsdWUgc3RvcmVkIHdpdGggdGhl
IGJ5dGVjb2RlLgotICAgICAgICAgICAgICAgIGlmICh1cmxbdXJsSW5kZXhdID09IGdldEJpdHM8
dWludDhfdD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0aCwgcHJvZ3JhbUNvdW50ZXIgKyBz
aXplb2YoREZBQnl0ZWNvZGUpKSkgeworICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPT0g
Z2V0Qml0czx1aW50OF90PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291
bnRlciArIHNpemVvZihERkFCeXRlY29kZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgIHByb2dy
YW1Db3VudGVyID0gZ2V0Qml0czx1bnNpZ25lZD4obV9ieXRlY29kZSwgbV9ieXRlY29kZUxlbmd0
aCwgcHJvZ3JhbUNvdW50ZXIgKyBzaXplb2YoREZBQnl0ZWNvZGUpICsgc2l6ZW9mKHVpbnQ4X3Qp
KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCF1cmxbdXJsSW5kZXhdKQorICAgICAgICAgICAg
ICAgICAgICBpZiAoIWNoYXJhY3RlcikKICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZGV4
SXNBZnRlckVuZE9mU3RyaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgdXJsSW5kZXgr
KzsgLy8gVGhpcyByZXByZXNlbnRzIGFuIGVkZ2UgaW4gdGhlIERGQS4KLSAgICAgICAgICAgICAg
ICB9IGVsc2UKLSAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rp
b25TaXplV2l0aEFyZ3VtZW50cyhERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlKTsK
KyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm9ncmFtQ291
bnRlciArPSBpbnN0cnVjdGlvblNpemVXaXRoQXJndW1lbnRzKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rp
b246OkNoZWNrVmFsdWVDYXNlU2Vuc2l0aXZlKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJU
KGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMoREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hl
Y2tWYWx1ZUNhc2VTZW5zaXRpdmUpID09IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMoREZB
Qnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZUNhc2VJbnNlbnNpdGl2ZSkpOworICAgICAg
ICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAg
ICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBjYXNlIERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246
OkNoZWNrVmFsdWVSYW5nZTogeworICAgICAgICAgICAgY2FzZSBERkFCeXRlY29kZUluc3RydWN0
aW9uOjpDaGVja1ZhbHVlUmFuZ2VDYXNlU2Vuc2l0aXZlOgorICAgICAgICAgICAgY2FzZSBERkFC
eXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlUmFuZ2VDYXNlSW5zZW5zaXRpdmU6IHsKICAg
ICAgICAgICAgICAgICBpZiAodXJsSW5kZXhJc0FmdGVyRW5kT2ZTdHJpbmcpCiAgICAgICAgICAg
ICAgICAgICAgIGdvdG8gbmV4dERGQTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
ICBjaGFyIGNoYXJhY3RlciA9IHVybFt1cmxJbmRleF07CisgICAgICAgICAgICAgICAgaWYgKHN0
YXRpY19jYXN0PERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb24+KG1fYnl0ZWNvZGVbcHJvZ3JhbUNvdW50
ZXJdKSA9PSBERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlUmFuZ2VDYXNlSW5zZW5z
aXRpdmUpCisgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciA9IHRvQVNDSUlMb3dlcihjaGFy
YWN0ZXIpOwogICAgICAgICAgICAgICAgIGlmIChjaGFyYWN0ZXIgPj0gZ2V0Qml0czx1aW50OF90
PihtX2J5dGVjb2RlLCBtX2J5dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihE
RkFCeXRlY29kZSkpCiAgICAgICAgICAgICAgICAgICAgICYmIGNoYXJhY3RlciA8PSBnZXRCaXRz
PHVpbnQ4X3Q+KG1fYnl0ZWNvZGUsIG1fYnl0ZWNvZGVMZW5ndGgsIHByb2dyYW1Db3VudGVyICsg
c2l6ZW9mKERGQUJ5dGVjb2RlKSArIHNpemVvZih1aW50OF90KSkpIHsKICAgICAgICAgICAgICAg
ICAgICAgcHJvZ3JhbUNvdW50ZXIgPSBnZXRCaXRzPHVuc2lnbmVkPihtX2J5dGVjb2RlLCBtX2J5
dGVjb2RlTGVuZ3RoLCBwcm9ncmFtQ291bnRlciArIHNpemVvZihERkFCeXRlY29kZSkgKyBzaXpl
b2YodWludDhfdCkgKyBzaXplb2YodWludDhfdCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAo
IWNoYXJhY3RlcikKICAgICAgICAgICAgICAgICAgICAgICAgIHVybEluZGV4SXNBZnRlckVuZE9m
U3RyaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgdXJsSW5kZXgrKzsgLy8gVGhpcyBy
ZXByZXNlbnRzIGFuIGVkZ2UgaW4gdGhlIERGQS4KLSAgICAgICAgICAgICAgICB9IGVsc2UKLSAg
ICAgICAgICAgICAgICAgICAgcHJvZ3JhbUNvdW50ZXIgKz0gaW5zdHJ1Y3Rpb25TaXplV2l0aEFy
Z3VtZW50cyhERkFCeXRlY29kZUluc3RydWN0aW9uOjpDaGVja1ZhbHVlUmFuZ2UpOworICAgICAg
ICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByb2dyYW1Db3VudGVyICs9
IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMoREZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hl
Y2tWYWx1ZVJhbmdlQ2FzZVNlbnNpdGl2ZSk7CisgICAgICAgICAgICAgICAgICAgIEFTU0VSVChp
bnN0cnVjdGlvblNpemVXaXRoQXJndW1lbnRzKERGQUJ5dGVjb2RlSW5zdHJ1Y3Rpb246OkNoZWNr
VmFsdWVSYW5nZUNhc2VTZW5zaXRpdmUpID09IGluc3RydWN0aW9uU2l6ZVdpdGhBcmd1bWVudHMo
REZBQnl0ZWNvZGVJbnN0cnVjdGlvbjo6Q2hlY2tWYWx1ZVJhbmdlQ2FzZUluc2Vuc2l0aXZlKSk7
CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAg
fQogCg==
</data>
<flag name="review"
          id="274225"
          type_id="1"
          status="+"
          setter="benjamin"
    />
          </attachment>
      

    </bug>

</bugzilla>