<?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>205712</bug_id>
          
          <creation_ts>2020-01-02 23:19:26 -0800</creation_ts>
          <short_desc>[JSC] MarkedBlock::Handle and BlockDirectory should be shrunk</short_desc>
          <delta_ts>2020-01-03 16:36:16 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Yusuke Suzuki">ysuzuki</reporter>
          <assigned_to name="Yusuke Suzuki">ysuzuki</assigned_to>
          <cc>ews-watchlist</cc>
    
    <cc>keith_miller</cc>
    
    <cc>mark.lam</cc>
    
    <cc>msaboff</cc>
    
    <cc>saam</cc>
    
    <cc>tzagallo</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1602338</commentid>
    <comment_count>0</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-02 23:19:26 -0800</bug_when>
    <thetext>[JSC] MarkedBlock::Handle and BlockDirectory should be shrunk</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602339</commentid>
    <comment_count>1</comment_count>
      <attachid>386662</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-02 23:24:51 -0800</bug_when>
    <thetext>Created attachment 386662
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602549</commentid>
    <comment_count>2</comment_count>
      <attachid>386662</attachid>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-03 12:16:20 -0800</bug_when>
    <thetext>Comment on attachment 386662
Patch

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

r=me with a suggestion.

&gt; Source/JavaScriptCore/heap/MarkedBlock.h:557
&gt; +// This function must return size_t instead of unsigned since pointer |p| is not guaranteed that this is within MarkedBlock.
&gt; +// See MarkedBlock::isAtom which can accept out-of-bound pointers.
&gt;  inline size_t MarkedBlock::atomNumber(const void* p)

Seems like isAtom() is the only case that can potential use atomNumber with a bad pointer while lots of other clients expect the pointer to be valid.  How about doing this instead?
1. rename this function to candidateAtomNumber() and change isAtom() to use it.
2. add a new inline function atomNumber() that calls candidateAtomNumber() in its implementation, ASSERT(!(atomNumber % handle().m_atomsPerCell)), and return the atomNumber() as an unsigned value.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602552</commentid>
    <comment_count>3</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-03 12:19:10 -0800</bug_when>
    <thetext>(In reply to Mark Lam from comment #2)
&gt; &gt; Source/JavaScriptCore/heap/MarkedBlock.h:557
&gt; &gt; +// This function must return size_t instead of unsigned since pointer |p| is not guaranteed that this is within MarkedBlock.
&gt; &gt; +// See MarkedBlock::isAtom which can accept out-of-bound pointers.
&gt; &gt;  inline size_t MarkedBlock::atomNumber(const void* p)
&gt; 
&gt; Seems like isAtom() is the only case that can potential use atomNumber with
&gt; a bad pointer while lots of other clients expect the pointer to be valid. 
&gt; How about doing this instead?
&gt; 1. rename this function to candidateAtomNumber() and change isAtom() to use
&gt; it.
&gt; 2. add a new inline function atomNumber() that calls candidateAtomNumber()
&gt; in its implementation, ASSERT(!(atomNumber % handle().m_atomsPerCell)), and
&gt; return the atomNumber() as an unsigned value.

One more thing: HeapUtil::findGCObjectPointersForMarking() does a test for &quot;candidate-&gt;atomNumber(alignedPointer) &gt; 0&quot; which is always true because atomNumber() returned a size_t.  This bug was not introduced by your patch, but your patch did shed a light on it.  Can you also fix that bug, or file a bug to have it revisited later?  Thanks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602589</commentid>
    <comment_count>4</comment_count>
      <attachid>386662</attachid>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-03 14:36:15 -0800</bug_when>
    <thetext>Comment on attachment 386662
Patch

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

&gt;&gt; Source/JavaScriptCore/heap/MarkedBlock.h:557
&gt;&gt;  inline size_t MarkedBlock::atomNumber(const void* p)
&gt; 
&gt; Seems like isAtom() is the only case that can potential use atomNumber with a bad pointer while lots of other clients expect the pointer to be valid.  How about doing this instead?
&gt; 1. rename this function to candidateAtomNumber() and change isAtom() to use it.
&gt; 2. add a new inline function atomNumber() that calls candidateAtomNumber() in its implementation, ASSERT(!(atomNumber % handle().m_atomsPerCell)), and return the atomNumber() as an unsigned value.

Sounds better! Fixed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602591</commentid>
    <comment_count>5</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-03 14:36:46 -0800</bug_when>
    <thetext>(In reply to Mark Lam from comment #3)
&gt; (In reply to Mark Lam from comment #2)
&gt; &gt; &gt; Source/JavaScriptCore/heap/MarkedBlock.h:557
&gt; &gt; &gt; +// This function must return size_t instead of unsigned since pointer |p| is not guaranteed that this is within MarkedBlock.
&gt; &gt; &gt; +// See MarkedBlock::isAtom which can accept out-of-bound pointers.
&gt; &gt; &gt;  inline size_t MarkedBlock::atomNumber(const void* p)
&gt; &gt; 
&gt; &gt; Seems like isAtom() is the only case that can potential use atomNumber with
&gt; &gt; a bad pointer while lots of other clients expect the pointer to be valid. 
&gt; &gt; How about doing this instead?
&gt; &gt; 1. rename this function to candidateAtomNumber() and change isAtom() to use
&gt; &gt; it.
&gt; &gt; 2. add a new inline function atomNumber() that calls candidateAtomNumber()
&gt; &gt; in its implementation, ASSERT(!(atomNumber % handle().m_atomsPerCell)), and
&gt; &gt; return the atomNumber() as an unsigned value.
&gt; 
&gt; One more thing: HeapUtil::findGCObjectPointersForMarking() does a test for
&gt; &quot;candidate-&gt;atomNumber(alignedPointer) &gt; 0&quot; which is always true because
&gt; atomNumber() returned a size_t.  This bug was not introduced by your patch,
&gt; but your patch did shed a light on it.  Can you also fix that bug, or file a
&gt; bug to have it revisited later?  Thanks.

Nice catch! Yeah, we should fix it. I&apos;ll do it in this patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602599</commentid>
    <comment_count>6</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-03 14:56:55 -0800</bug_when>
    <thetext>(In reply to Yusuke Suzuki from comment #5)
&gt; (In reply to Mark Lam from comment #3)
&gt; &gt; (In reply to Mark Lam from comment #2)
&gt; &gt; &gt; &gt; Source/JavaScriptCore/heap/MarkedBlock.h:557
&gt; &gt; &gt; &gt; +// This function must return size_t instead of unsigned since pointer |p| is not guaranteed that this is within MarkedBlock.
&gt; &gt; &gt; &gt; +// See MarkedBlock::isAtom which can accept out-of-bound pointers.
&gt; &gt; &gt; &gt;  inline size_t MarkedBlock::atomNumber(const void* p)
&gt; &gt; &gt; 
&gt; &gt; &gt; Seems like isAtom() is the only case that can potential use atomNumber with
&gt; &gt; &gt; a bad pointer while lots of other clients expect the pointer to be valid. 
&gt; &gt; &gt; How about doing this instead?
&gt; &gt; &gt; 1. rename this function to candidateAtomNumber() and change isAtom() to use
&gt; &gt; &gt; it.
&gt; &gt; &gt; 2. add a new inline function atomNumber() that calls candidateAtomNumber()
&gt; &gt; &gt; in its implementation, ASSERT(!(atomNumber % handle().m_atomsPerCell)), and
&gt; &gt; &gt; return the atomNumber() as an unsigned value.
&gt; &gt; 
&gt; &gt; One more thing: HeapUtil::findGCObjectPointersForMarking() does a test for
&gt; &gt; &quot;candidate-&gt;atomNumber(alignedPointer) &gt; 0&quot; which is always true because
&gt; &gt; atomNumber() returned a size_t.  This bug was not introduced by your patch,
&gt; &gt; but your patch did shed a light on it.  Can you also fix that bug, or file a
&gt; &gt; bug to have it revisited later?  Thanks.
&gt; 
&gt; Nice catch! Yeah, we should fix it. I&apos;ll do it in this patch.

I&apos;ll still need to understand the meaning of this original code. So I&apos;ll open a new bug for this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602606</commentid>
    <comment_count>7</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-03 15:15:15 -0800</bug_when>
    <thetext>(In reply to Yusuke Suzuki from comment #6)
&gt; (In reply to Yusuke Suzuki from comment #5)
&gt; &gt; (In reply to Mark Lam from comment #3)
&gt; &gt; &gt; (In reply to Mark Lam from comment #2)
&gt; &gt; &gt; &gt; &gt; Source/JavaScriptCore/heap/MarkedBlock.h:557
&gt; &gt; &gt; &gt; &gt; +// This function must return size_t instead of unsigned since pointer |p| is not guaranteed that this is within MarkedBlock.
&gt; &gt; &gt; &gt; &gt; +// See MarkedBlock::isAtom which can accept out-of-bound pointers.
&gt; &gt; &gt; &gt; &gt;  inline size_t MarkedBlock::atomNumber(const void* p)
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; Seems like isAtom() is the only case that can potential use atomNumber with
&gt; &gt; &gt; &gt; a bad pointer while lots of other clients expect the pointer to be valid. 
&gt; &gt; &gt; &gt; How about doing this instead?
&gt; &gt; &gt; &gt; 1. rename this function to candidateAtomNumber() and change isAtom() to use
&gt; &gt; &gt; &gt; it.
&gt; &gt; &gt; &gt; 2. add a new inline function atomNumber() that calls candidateAtomNumber()
&gt; &gt; &gt; &gt; in its implementation, ASSERT(!(atomNumber % handle().m_atomsPerCell)), and
&gt; &gt; &gt; &gt; return the atomNumber() as an unsigned value.
&gt; &gt; &gt; 
&gt; &gt; &gt; One more thing: HeapUtil::findGCObjectPointersForMarking() does a test for
&gt; &gt; &gt; &quot;candidate-&gt;atomNumber(alignedPointer) &gt; 0&quot; which is always true because
&gt; &gt; &gt; atomNumber() returned a size_t.  This bug was not introduced by your patch,
&gt; &gt; &gt; but your patch did shed a light on it.  Can you also fix that bug, or file a
&gt; &gt; &gt; bug to have it revisited later?  Thanks.
&gt; &gt; 
&gt; &gt; Nice catch! Yeah, we should fix it. I&apos;ll do it in this patch.
&gt; 
&gt; I&apos;ll still need to understand the meaning of this original code. So I&apos;ll
&gt; open a new bug for this.

Talked with Phil. This condition is checking whether the atomNumber is not zero. If the pointer is pointing the first atom, this is never pointing ButterflyEnd + sizeof(IndexingHeader) since no previous object exists (Note that MarkedBlock has footer, so the end of MarkedBlock is not usable for objects).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602649</commentid>
    <comment_count>8</comment_count>
    <who name="Mark Lam">mark.lam</who>
    <bug_when>2020-01-03 16:30:23 -0800</bug_when>
    <thetext>(In reply to Yusuke Suzuki from comment #7)
&gt; (In reply to Yusuke Suzuki from comment #6)
&gt; &gt; (In reply to Yusuke Suzuki from comment #5)
&gt; &gt; &gt; (In reply to Mark Lam from comment #3)
&gt; &gt; &gt; &gt; (In reply to Mark Lam from comment #2)
&gt; &gt; &gt; &gt; &gt; &gt; Source/JavaScriptCore/heap/MarkedBlock.h:557
&gt; &gt; &gt; &gt; &gt; &gt; +// This function must return size_t instead of unsigned since pointer |p| is not guaranteed that this is within MarkedBlock.
&gt; &gt; &gt; &gt; &gt; &gt; +// See MarkedBlock::isAtom which can accept out-of-bound pointers.
&gt; &gt; &gt; &gt; &gt; &gt;  inline size_t MarkedBlock::atomNumber(const void* p)
&gt; &gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; &gt; Seems like isAtom() is the only case that can potential use atomNumber with
&gt; &gt; &gt; &gt; &gt; a bad pointer while lots of other clients expect the pointer to be valid. 
&gt; &gt; &gt; &gt; &gt; How about doing this instead?
&gt; &gt; &gt; &gt; &gt; 1. rename this function to candidateAtomNumber() and change isAtom() to use
&gt; &gt; &gt; &gt; &gt; it.
&gt; &gt; &gt; &gt; &gt; 2. add a new inline function atomNumber() that calls candidateAtomNumber()
&gt; &gt; &gt; &gt; &gt; in its implementation, ASSERT(!(atomNumber % handle().m_atomsPerCell)), and
&gt; &gt; &gt; &gt; &gt; return the atomNumber() as an unsigned value.
&gt; &gt; &gt; &gt; 
&gt; &gt; &gt; &gt; One more thing: HeapUtil::findGCObjectPointersForMarking() does a test for
&gt; &gt; &gt; &gt; &quot;candidate-&gt;atomNumber(alignedPointer) &gt; 0&quot; which is always true because
&gt; &gt; &gt; &gt; atomNumber() returned a size_t.  This bug was not introduced by your patch,
&gt; &gt; &gt; &gt; but your patch did shed a light on it.  Can you also fix that bug, or file a
&gt; &gt; &gt; &gt; bug to have it revisited later?  Thanks.
&gt; &gt; &gt; 
&gt; &gt; &gt; Nice catch! Yeah, we should fix it. I&apos;ll do it in this patch.
&gt; &gt; 
&gt; &gt; I&apos;ll still need to understand the meaning of this original code. So I&apos;ll
&gt; &gt; open a new bug for this.
&gt; 
&gt; Talked with Phil. This condition is checking whether the atomNumber is not
&gt; zero. If the pointer is pointing the first atom, this is never pointing
&gt; ButterflyEnd + sizeof(IndexingHeader) since no previous object exists (Note
&gt; that MarkedBlock has footer, so the end of MarkedBlock is not usable for
&gt; objects).

Sorry for the noise.  I misread &gt; 0 as &gt;= 0.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602652</commentid>
    <comment_count>9</comment_count>
    <who name="Yusuke Suzuki">ysuzuki</who>
    <bug_when>2020-01-03 16:35:12 -0800</bug_when>
    <thetext>Committed r254023: &lt;https://trac.webkit.org/changeset/254023&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1602653</commentid>
    <comment_count>10</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-01-03 16:36:16 -0800</bug_when>
    <thetext>&lt;rdar://problem/58310059&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>386662</attachid>
            <date>2020-01-02 23:24:51 -0800</date>
            <delta_ts>2020-01-03 12:16:20 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-205712-20200102232450.patch</filename>
            <type>text/plain</type>
            <size>16341</size>
            <attacher name="Yusuke Suzuki">ysuzuki</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjUzOTkwCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlw
dENvcmUvQ2hhbmdlTG9nIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwppbmRleCAz
ZTU5NjZmOWQyOTA0NjFmNDQ1Y2VlZTJjNmRjMjVmZTRiM2E4ZmRmLi45NDA4YmNhMzQ2YWUyZThh
MTc3NWFlYzY0MmI0MGIzNGEzZTkxZGQ4IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKQEAgLTEs
MyArMSw0NSBAQAorMjAyMC0wMS0wMiAgWXVzdWtlIFN1enVraSAgPHlzdXp1a2lAYXBwbGUuY29t
PgorCisgICAgICAgIFtKU0NdIE1hcmtlZEJsb2NrOjpIYW5kbGUgYW5kIEJsb2NrRGlyZWN0b3J5
IHNob3VsZCBiZSBzaHJ1bmsKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTIwNTcxMgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIFRoaXMgcGF0Y2ggc2hyaW5rcyBNYXJrZWRCbG9jazo6SGFuZGxlIGFuZCBCbG9j
a0RpcmVjdG9yeSBieSBsZXZlcmFnaW5nIHRoZSBmYWN0IHRoYXQgVmVjdG9yJ3Mgc2l6ZSBhbmQg
Y2FwYWNpdHkgaXMgdW5zaWduZWQuCisgICAgICAgIEluIHRoZXNlIGRhdGEgc3RydWN0dXJlcywg
d2UgdXNlIGBzaXplX3RgIHRvIGhvbGQgYSBpbmRleCwgYnV0IHRoaXMgY2FuIGJlIGNvbnZlcnRl
ZCB0byB1bnNpZ25lZCBzaW5jZSB3ZSBndWFyYW50ZWUgdGhhdCB0aGlzCisgICAgICAgIG5ldmVy
IGV4Y2VlZHMgdW5zaWduZWQgc2luY2UgdGhlc2UgbnVtYmVycyBhcmUgZGVyaXZlZCBmcm9tIFZl
Y3RvcidzIHNpemUgLyBjYXBhY2l0eSwgb3IgaW5kZXggaW5zaWRlIE1hcmtlZEJsb2NrICh3aGlj
aCBpcyB1cAorICAgICAgICB0byA2NEtCIGluIHNvbWUgYXJjaGl0ZWN0dXJlcykuIE1hcmtlZEJs
b2NrOjpIYW5kbGUgaXMgYWxsb2NhdGVkIHBlciBNYXJrZWRCbG9jaywgYW5kIGluIEdtYWlsLCBp
dCB0YWtlcyAxTUIuIFdlIGNhbiBzYXZlCisgICAgICAgIHNvbWUgYnl0ZXMganVzdCB1c2luZyBg
dW5zaWduZWRgLiBJbiBhZGRpdGlvbiwgdGhpcyBwYXRjaCByZW1vdmVzIGBtX3ByZXZgIGFuZCBg
bV9uZXh0YCBmaWVsZHMgaW4gTWFya2VkQmxvY2s6OkhhbmRsZSBzaW5jZQorICAgICAgICBpdCBp
cyBuZXZlciB1c2VkLgorCisgICAgICAgICogaGVhcC9BdG9tSW5kaWNlcy5oOgorICAgICAgICAq
IGhlYXAvQmxvY2tEaXJlY3RvcnkuY3BwOgorICAgICAgICAoSlNDOjpCbG9ja0RpcmVjdG9yeTo6
ZmluZEJsb2NrRm9yQWxsb2NhdGlvbik6CisgICAgICAgIChKU0M6OkJsb2NrRGlyZWN0b3J5Ojph
ZGRCbG9jayk6CisgICAgICAgICogaGVhcC9Jc29DZWxsU2V0LmNwcDoKKyAgICAgICAgKEpTQzo6
SXNvQ2VsbFNldDo6YWRkU2xvdyk6CisgICAgICAgIChKU0M6Oklzb0NlbGxTZXQ6OmRpZFJlc2l6
ZUJpdHMpOgorICAgICAgICAoSlNDOjpJc29DZWxsU2V0OjpkaWRSZW1vdmVCbG9jayk6CisgICAg
ICAgICogaGVhcC9Jc29DZWxsU2V0Lmg6CisgICAgICAgICogaGVhcC9Jc29DZWxsU2V0SW5saW5l
cy5oOgorICAgICAgICAoSlNDOjpJc29DZWxsU2V0Ojpmb3JFYWNoTWFya2VkQ2VsbCk6CisgICAg
ICAgIChKU0M6Oklzb0NlbGxTZXQ6OmZvckVhY2hNYXJrZWRDZWxsSW5QYXJhbGxlbCk6CisgICAg
ICAgIChKU0M6Oklzb0NlbGxTZXQ6OmZvckVhY2hMaXZlQ2VsbCk6CisgICAgICAgICogaGVhcC9J
c29TdWJzcGFjZS5jcHA6CisgICAgICAgIChKU0M6Oklzb1N1YnNwYWNlOjpkaWRSZXNpemVCaXRz
KToKKyAgICAgICAgKEpTQzo6SXNvU3Vic3BhY2U6OmRpZFJlbW92ZUJsb2NrKToKKyAgICAgICAg
KiBoZWFwL0lzb1N1YnNwYWNlLmg6CisgICAgICAgICogaGVhcC9Mb2NhbEFsbG9jYXRvci5oOgor
ICAgICAgICAqIGhlYXAvTWFya2VkQmxvY2suY3BwOgorICAgICAgICAoSlNDOjpNYXJrZWRCbG9j
azo6SGFuZGxlOjpkaWRBZGRUb0RpcmVjdG9yeSk6CisgICAgICAgIChKU0M6Ok1hcmtlZEJsb2Nr
OjpIYW5kbGU6OmRpZFJlbW92ZUZyb21EaXJlY3RvcnkpOgorICAgICAgICAqIGhlYXAvTWFya2Vk
QmxvY2suaDoKKyAgICAgICAgKEpTQzo6TWFya2VkQmxvY2s6OkhhbmRsZTo6aW5kZXggY29uc3Qp
OgorICAgICAgICAqIGhlYXAvU3Vic3BhY2UuY3BwOgorICAgICAgICAoSlNDOjpTdWJzcGFjZTo6
ZGlkUmVzaXplQml0cyk6CisgICAgICAgIChKU0M6OlN1YnNwYWNlOjpkaWRSZW1vdmVCbG9jayk6
CisgICAgICAgICogaGVhcC9TdWJzcGFjZS5oOgorCiAyMDIwLTAxLTAyICBZdXN1a2UgU3V6dWtp
ICA8eXN1enVraUBhcHBsZS5jb20+IGFuZCBTaW1vbiBGcmFzZXIgIDxzaW1vbi5mcmFzZXJAYXBw
bGUuY29tPgogCiAgICAgICAgIEV4cGVyaW1lbnQ6IGNyZWF0ZSBsb3RzIG9mIGRpZmZlcmVudCBt
YWxsb2Mgem9uZXMgZm9yIGVhc2llciBhY2NvdW50aW5nIG9mIG1lbW9yeSB1c2UKZGlmZiAtLWdp
dCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0F0b21JbmRpY2VzLmggYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvaGVhcC9BdG9tSW5kaWNlcy5oCmluZGV4IDk3NzIxOGY3ZGRhNzI3YmNiNjBj
OTc1OGEwNjUyY2U0NWFhMzg4YWYuLmY0ZjU2ZTlmNGNjN2MwZjllYmRhNjA1YzU0ZWVlYjc4ZWFj
NjBiMzUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0F0b21JbmRpY2Vz
LmgKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvQXRvbUluZGljZXMuaApAQCAtNDAs
OCArNDAsOCBAQCBzdHJ1Y3QgQXRvbUluZGljZXMgewogICAgIH0KICAgICAKICAgICBNYXJrZWRC
bG9jayogYmxvY2s7Ci0gICAgc2l6ZV90IGJsb2NrSW5kZXg7Ci0gICAgc2l6ZV90IGF0b21OdW1i
ZXI7CisgICAgdW5zaWduZWQgYmxvY2tJbmRleDsKKyAgICB1bnNpZ25lZCBhdG9tTnVtYmVyOwog
fTsKIAogfSAvLyBuYW1lc3BhY2UgSlNDCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENv
cmUvaGVhcC9CbG9ja0RpcmVjdG9yeS5jcHAgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9C
bG9ja0RpcmVjdG9yeS5jcHAKaW5kZXggODZhMjc1YzMzMGI2NjYxOGQ4MjU1YWJmOGU4YjM3MzYy
NGQyNzk0Ny4uYThiZDMxZmViNTZkZWZiZjU3Y2VlNjAwZDkxMDM3NzZmM2MyNmI1MCAxMDA2NDQK
LS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvQmxvY2tEaXJlY3RvcnkuY3BwCisrKyBi
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0Jsb2NrRGlyZWN0b3J5LmNwcApAQCAtOTAsNyAr
OTAsNyBAQCBNYXJrZWRCbG9jazo6SGFuZGxlKiBCbG9ja0RpcmVjdG9yeTo6ZmluZEJsb2NrRm9y
QWxsb2NhdGlvbihMb2NhbEFsbG9jYXRvciYgYWxsbwogICAgICAgICBpZiAoYWxsb2NhdG9yLm1f
YWxsb2NhdGlvbkN1cnNvciA+PSBtX2Jsb2Nrcy5zaXplKCkpCiAgICAgICAgICAgICByZXR1cm4g
bnVsbHB0cjsKICAgICAgICAgCi0gICAgICAgIHNpemVfdCBibG9ja0luZGV4ID0gYWxsb2NhdG9y
Lm1fYWxsb2NhdGlvbkN1cnNvcisrOworICAgICAgICB1bnNpZ25lZCBibG9ja0luZGV4ID0gYWxs
b2NhdG9yLm1fYWxsb2NhdGlvbkN1cnNvcisrOwogICAgICAgICBNYXJrZWRCbG9jazo6SGFuZGxl
KiByZXN1bHQgPSBtX2Jsb2Nrc1tibG9ja0luZGV4XTsKICAgICAgICAgc2V0SXNDYW5BbGxvY2F0
ZUJ1dE5vdEVtcHR5KE5vTG9ja2luZ05lY2Vzc2FyeSwgYmxvY2tJbmRleCwgZmFsc2UpOwogICAg
ICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTEyLDcgKzExMiw3IEBAIE1hcmtlZEJsb2NrOjpIYW5k
bGUqIEJsb2NrRGlyZWN0b3J5Ojp0cnlBbGxvY2F0ZUJsb2NrKEhlYXAmIGhlYXApCiAKIHZvaWQg
QmxvY2tEaXJlY3Rvcnk6OmFkZEJsb2NrKE1hcmtlZEJsb2NrOjpIYW5kbGUqIGJsb2NrKQogewot
ICAgIHNpemVfdCBpbmRleDsKKyAgICB1bnNpZ25lZCBpbmRleDsKICAgICBpZiAobV9mcmVlQmxv
Y2tJbmRpY2VzLmlzRW1wdHkoKSkgewogICAgICAgICBpbmRleCA9IG1fYmxvY2tzLnNpemUoKTsK
IApkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvQmxvY2tEaXJlY3Rvcnku
aCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0Jsb2NrRGlyZWN0b3J5LmgKaW5kZXggNWJh
ZmZjMjMwNTcwYjg1YTk1M2JjNjk1MzMxNTQ5OTI1NmM0OTc2NS4uNjc0MmMzMTU4Yjk2MTY1MjRh
MmIwYTY4Y2FkNDAxNjI0NDdlZWE0MSAxMDA2NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3Jl
L2hlYXAvQmxvY2tEaXJlY3RvcnkuaAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9C
bG9ja0RpcmVjdG9yeS5oCkBAIC0xNTYsOSArMTU2LDEwIEBAIGNsYXNzIEJsb2NrRGlyZWN0b3J5
IHsKICAgICB1bnNpZ25lZCBtX2NlbGxTaXplOwogICAgIAogICAgIC8vIEFmdGVyIHlvdSBkbyBz
b21ldGhpbmcgdG8gYSBibG9jayBiYXNlZCBvbiBvbmUgb2YgdGhlc2UgY3Vyc29ycywgeW91IGNs
ZWFyIHRoZSBiaXQgaW4gdGhlCi0gICAgLy8gY29ycmVzcG9uZGluZyBiaXR2ZWN0b3IgYW5kIGxl
YXZlIHRoZSBjdXJzb3Igd2hlcmUgaXQgd2FzLgotICAgIHNpemVfdCBtX2VtcHR5Q3Vyc29yIHsg
MCB9OwotICAgIHNpemVfdCBtX3Vuc3dlcHRDdXJzb3IgeyAwIH07IC8vIFBvaW50cyB0byB0aGUg
bmV4dCBibG9jayB0aGF0IGlzIGEgY2FuZGlkYXRlIGZvciBpbmNyZW1lbnRhbCBzd2VlcGluZy4K
KyAgICAvLyBjb3JyZXNwb25kaW5nIGJpdHZlY3RvciBhbmQgbGVhdmUgdGhlIGN1cnNvciB3aGVy
ZSBpdCB3YXMuIFdlIGNhbiB1c2UgdW5zaWduZWQgaW5zdGVhZCBvZiBzaXplX3Qgc2luY2UKKyAg
ICAvLyB0aGlzIG51bWJlciBpcyBib3VuZCBieSBjYXBhY2l0eSBvZiBWZWN0b3IgbV9ibG9ja3Ms
IHdoaWNoIG11c3QgYmUgd2l0aGluIHVuc2lnbmVkLgorICAgIHVuc2lnbmVkIG1fZW1wdHlDdXJz
b3IgeyAwIH07CisgICAgdW5zaWduZWQgbV91bnN3ZXB0Q3Vyc29yIHsgMCB9OyAvLyBQb2ludHMg
dG8gdGhlIG5leHQgYmxvY2sgdGhhdCBpcyBhIGNhbmRpZGF0ZSBmb3IgaW5jcmVtZW50YWwgc3dl
ZXBpbmcuCiAgICAgCiAgICAgLy8gRklYTUU6IEFsbCBvZiB0aGVzZSBzaG91bGQgcHJvYmFibHkg
YmUgcmVmZXJlbmNlcy4KICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTY2OTg4CmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9Jc29D
ZWxsU2V0LmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0lzb0NlbGxTZXQuY3BwCmlu
ZGV4IDgwYTljZWI2YTM3OTZlOTNlNDZlMzc0MTdjOTlmMmViNjhmMGE0ODEuLjc4NmQxMTU4ZjA5
YzZkN2FlZDFlYWU1YzFlMGQyMGYzMjRkM2RkYmMgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9oZWFwL0lzb0NlbGxTZXQuY3BwCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9o
ZWFwL0lzb0NlbGxTZXQuY3BwCkBAIC04MSw3ICs4MSw3IEBAIFJlZjxTaGFyZWRUYXNrPE1hcmtl
ZEJsb2NrOjpIYW5kbGUqKCk+PiBJc29DZWxsU2V0OjpwYXJhbGxlbE5vdEVtcHR5TWFya2VkQmxv
Y2tTCiAgICAgcmV0dXJuIGFkb3B0UmVmKCpuZXcgVGFzaygqdGhpcykpOwogfQogCi1ORVZFUl9J
TkxJTkUgQml0bWFwPE1hcmtlZEJsb2NrOjphdG9tc1BlckJsb2NrPiogSXNvQ2VsbFNldDo6YWRk
U2xvdyhzaXplX3QgYmxvY2tJbmRleCkKK05FVkVSX0lOTElORSBCaXRtYXA8TWFya2VkQmxvY2s6
OmF0b21zUGVyQmxvY2s+KiBJc29DZWxsU2V0OjphZGRTbG93KHVuc2lnbmVkIGJsb2NrSW5kZXgp
CiB7CiAgICAgYXV0byBsb2NrZXIgPSBob2xkTG9jayhtX3N1YnNwYWNlLm1fZGlyZWN0b3J5Lm1f
Yml0dmVjdG9yTG9jayk7CiAgICAgYXV0byYgYml0c1B0clJlZiA9IG1fYml0c1tibG9ja0luZGV4
XTsKQEAgLTk1LDEzICs5NSwxMyBAQCBORVZFUl9JTkxJTkUgQml0bWFwPE1hcmtlZEJsb2NrOjph
dG9tc1BlckJsb2NrPiogSXNvQ2VsbFNldDo6YWRkU2xvdyhzaXplX3QgYmxvYwogICAgIHJldHVy
biBiaXRzOwogfQogCi12b2lkIElzb0NlbGxTZXQ6OmRpZFJlc2l6ZUJpdHMoc2l6ZV90IG5ld1Np
emUpCit2b2lkIElzb0NlbGxTZXQ6OmRpZFJlc2l6ZUJpdHModW5zaWduZWQgbmV3U2l6ZSkKIHsK
ICAgICBtX2Jsb2Nrc1dpdGhCaXRzLnJlc2l6ZShuZXdTaXplKTsKICAgICBtX2JpdHMuZ3Jvdyhu
ZXdTaXplKTsKIH0KIAotdm9pZCBJc29DZWxsU2V0OjpkaWRSZW1vdmVCbG9jayhzaXplX3QgYmxv
Y2tJbmRleCkKK3ZvaWQgSXNvQ2VsbFNldDo6ZGlkUmVtb3ZlQmxvY2sodW5zaWduZWQgYmxvY2tJ
bmRleCkKIHsKICAgICB7CiAgICAgICAgIGF1dG8gbG9ja2VyID0gaG9sZExvY2sobV9zdWJzcGFj
ZS5tX2RpcmVjdG9yeS5tX2JpdHZlY3RvckxvY2spOwpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFT
Y3JpcHRDb3JlL2hlYXAvSXNvQ2VsbFNldC5oIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAv
SXNvQ2VsbFNldC5oCmluZGV4IGMyOWFkZmI2MTNlMDM4ZmZkMGE0OWIxOTdkM2I5MDU2MTIxMTc1
NWQuLjc5NjA1MzUxOWM0ZTFjNjY4Mzg1N2JhZWU4MGMzZDdkYTNkMmRhZWIgMTAwNjQ0Ci0tLSBh
L1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0lzb0NlbGxTZXQuaAorKysgYi9Tb3VyY2UvSmF2
YVNjcmlwdENvcmUvaGVhcC9Jc29DZWxsU2V0LmgKQEAgLTY3LDEwICs2NywxMCBAQCBjbGFzcyBJ
c29DZWxsU2V0IDogcHVibGljIFBhY2tlZFJhd1NlbnRpbmVsTm9kZTxJc29DZWxsU2V0PiB7CiBw
cml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyBJc29TdWJzcGFjZTsKICAgICAKLSAgICBCaXRtYXA8
TWFya2VkQmxvY2s6OmF0b21zUGVyQmxvY2s+KiBhZGRTbG93KHNpemVfdCBibG9ja0luZGV4KTsK
KyAgICBCaXRtYXA8TWFya2VkQmxvY2s6OmF0b21zUGVyQmxvY2s+KiBhZGRTbG93KHVuc2lnbmVk
IGJsb2NrSW5kZXgpOwogICAgIAotICAgIHZvaWQgZGlkUmVzaXplQml0cyhzaXplX3QgbmV3U2l6
ZSk7Ci0gICAgdm9pZCBkaWRSZW1vdmVCbG9jayhzaXplX3QgYmxvY2tJbmRleCk7CisgICAgdm9p
ZCBkaWRSZXNpemVCaXRzKHVuc2lnbmVkIG5ld1NpemUpOworICAgIHZvaWQgZGlkUmVtb3ZlQmxv
Y2sodW5zaWduZWQgYmxvY2tJbmRleCk7CiAgICAgdm9pZCBzd2VlcFRvRnJlZUxpc3QoTWFya2Vk
QmxvY2s6OkhhbmRsZSopOwogICAgIHZvaWQgY2xlYXJMb3dlclRpZXJDZWxsKHVuc2lnbmVkKTsK
ICAgICAKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0lzb0NlbGxTZXRJ
bmxpbmVzLmggYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9Jc29DZWxsU2V0SW5saW5lcy5o
CmluZGV4IGRiN2U4YWNiNTYxYjFkMjJkNDc2MTY1Y2JjNDA4YmMzOGY2NTZjMmUuLjZkNjRkMmM2
ZDhkMmE0YmZiZTA3MTNiNzYyZTcyMmExOThjNDc3ZmYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZh
U2NyaXB0Q29yZS9oZWFwL0lzb0NlbGxTZXRJbmxpbmVzLmgKKysrIGIvU291cmNlL0phdmFTY3Jp
cHRDb3JlL2hlYXAvSXNvQ2VsbFNldElubGluZXMuaApAQCAtNzEsNyArNzEsNyBAQCB2b2lkIElz
b0NlbGxTZXQ6OmZvckVhY2hNYXJrZWRDZWxsKGNvbnN0IEZ1bmMmIGZ1bmMpCiB7CiAgICAgQmxv
Y2tEaXJlY3RvcnkmIGRpcmVjdG9yeSA9IG1fc3Vic3BhY2UubV9kaXJlY3Rvcnk7CiAgICAgKGRp
cmVjdG9yeS5tX2JpdHMubWFya2luZ05vdEVtcHR5KCkgJiBtX2Jsb2Nrc1dpdGhCaXRzKS5mb3JF
YWNoU2V0Qml0KAotICAgICAgICBbJl0gKHNpemVfdCBibG9ja0luZGV4KSB7CisgICAgICAgIFsm
XSAodW5zaWduZWQgYmxvY2tJbmRleCkgewogICAgICAgICAgICAgTWFya2VkQmxvY2s6OkhhbmRs
ZSogYmxvY2sgPSBkaXJlY3RvcnkubV9ibG9ja3NbYmxvY2tJbmRleF07CiAKICAgICAgICAgICAg
IGF1dG8qIGJpdHMgPSBtX2JpdHNbYmxvY2tJbmRleF0uZ2V0KCk7CkBAIC0xMDYsNyArMTA2LDcg
QEAgUmVmPFNoYXJlZFRhc2s8dm9pZChTbG90VmlzaXRvciYpPj4gSXNvQ2VsbFNldDo6Zm9yRWFj
aE1hcmtlZENlbGxJblBhcmFsbGVsKGNvbnMKICAgICAgICAgdm9pZCBydW4oU2xvdFZpc2l0b3Im
IHZpc2l0b3IpIG92ZXJyaWRlCiAgICAgICAgIHsKICAgICAgICAgICAgIHdoaWxlIChNYXJrZWRC
bG9jazo6SGFuZGxlKiBoYW5kbGUgPSBtX2Jsb2NrU291cmNlLT5ydW4oKSkgewotICAgICAgICAg
ICAgICAgIHNpemVfdCBibG9ja0luZGV4ID0gaGFuZGxlLT5pbmRleCgpOworICAgICAgICAgICAg
ICAgIHVuc2lnbmVkIGJsb2NrSW5kZXggPSBoYW5kbGUtPmluZGV4KCk7CiAgICAgICAgICAgICAg
ICAgYXV0byogYml0cyA9IG1fc2V0Lm1fYml0c1tibG9ja0luZGV4XS5nZXQoKTsKICAgICAgICAg
ICAgICAgICBoYW5kbGUtPmZvckVhY2hNYXJrZWRDZWxsKAogICAgICAgICAgICAgICAgICAgICBb
Jl0gKHNpemVfdCBhdG9tTnVtYmVyLCBIZWFwQ2VsbCogY2VsbCwgSGVhcENlbGw6OktpbmQga2lu
ZCkgLT4gSXRlcmF0aW9uU3RhdHVzIHsKQEAgLTE0Nyw3ICsxNDcsNyBAQCB2b2lkIElzb0NlbGxT
ZXQ6OmZvckVhY2hMaXZlQ2VsbChjb25zdCBGdW5jJiBmdW5jKQogewogICAgIEJsb2NrRGlyZWN0
b3J5JiBkaXJlY3RvcnkgPSBtX3N1YnNwYWNlLm1fZGlyZWN0b3J5OwogICAgIG1fYmxvY2tzV2l0
aEJpdHMuZm9yRWFjaFNldEJpdCgKLSAgICAgICAgWyZdIChzaXplX3QgYmxvY2tJbmRleCkgewor
ICAgICAgICBbJl0gKHVuc2lnbmVkIGJsb2NrSW5kZXgpIHsKICAgICAgICAgICAgIE1hcmtlZEJs
b2NrOjpIYW5kbGUqIGJsb2NrID0gZGlyZWN0b3J5Lm1fYmxvY2tzW2Jsb2NrSW5kZXhdOwogCiAg
ICAgICAgICAgICBhdXRvKiBiaXRzID0gbV9iaXRzW2Jsb2NrSW5kZXhdLmdldCgpOwpkaWZmIC0t
Z2l0IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSXNvU3Vic3BhY2UuY3BwIGIvU291cmNl
L0phdmFTY3JpcHRDb3JlL2hlYXAvSXNvU3Vic3BhY2UuY3BwCmluZGV4IDZlYzYyMTExNzFiZWE0
Y2QwYjgxNDFkM2EyMjhlNDA0NzFhYWI4ODIuLmE1ZjA4NWVkOGI0NGYyNDhlOTI2ZTJkZDAzYzNk
ZDc1YmZiNjBiNWUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0lzb1N1
YnNwYWNlLmNwcAorKysgYi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9Jc29TdWJzcGFjZS5j
cHAKQEAgLTY5LDcgKzY5LDcgQEAgdm9pZCogSXNvU3Vic3BhY2U6OmFsbG9jYXRlKFZNJiB2bSwg
c2l6ZV90IHNpemUsIEdDRGVmZXJyYWxDb250ZXh0KiBkZWZlcnJhbENvbnQKICAgICByZXR1cm4g
YWxsb2NhdGVOb25WaXJ0dWFsKHZtLCBzaXplLCBkZWZlcnJhbENvbnRleHQsIGZhaWx1cmVNb2Rl
KTsKIH0KIAotdm9pZCBJc29TdWJzcGFjZTo6ZGlkUmVzaXplQml0cyhzaXplX3QgYmxvY2tJbmRl
eCkKK3ZvaWQgSXNvU3Vic3BhY2U6OmRpZFJlc2l6ZUJpdHModW5zaWduZWQgYmxvY2tJbmRleCkK
IHsKICAgICBtX2NlbGxTZXRzLmZvckVhY2goCiAgICAgICAgIFsmXSAoSXNvQ2VsbFNldCogc2V0
KSB7CkBAIC03Nyw3ICs3Nyw3IEBAIHZvaWQgSXNvU3Vic3BhY2U6OmRpZFJlc2l6ZUJpdHMoc2l6
ZV90IGJsb2NrSW5kZXgpCiAgICAgICAgIH0pOwogfQogCi12b2lkIElzb1N1YnNwYWNlOjpkaWRS
ZW1vdmVCbG9jayhzaXplX3QgYmxvY2tJbmRleCkKK3ZvaWQgSXNvU3Vic3BhY2U6OmRpZFJlbW92
ZUJsb2NrKHVuc2lnbmVkIGJsb2NrSW5kZXgpCiB7CiAgICAgbV9jZWxsU2V0cy5mb3JFYWNoKAog
ICAgICAgICBbJl0gKElzb0NlbGxTZXQqIHNldCkgewpkaWZmIC0tZ2l0IGEvU291cmNlL0phdmFT
Y3JpcHRDb3JlL2hlYXAvSXNvU3Vic3BhY2UuaCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFw
L0lzb1N1YnNwYWNlLmgKaW5kZXggYTUxNDNiZGFlZWNiM2I5YzQyZDU4Y2RhZWI1ZjI0YjMxMzdk
MDVlOS4uMGRiZDNiMGNjMzEwZDc4ZjNmMDdmY2JjNTE1NmUzNmFlYTQzMGJiMSAxMDA2NDQKLS0t
IGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvSXNvU3Vic3BhY2UuaAorKysgYi9Tb3VyY2Uv
SmF2YVNjcmlwdENvcmUvaGVhcC9Jc29TdWJzcGFjZS5oCkBAIC01OSw4ICs1OSw4IEBAIGNsYXNz
IElzb1N1YnNwYWNlIDogcHVibGljIFN1YnNwYWNlIHsKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNs
YXNzIElzb0NlbGxTZXQ7CiAgICAgCi0gICAgdm9pZCBkaWRSZXNpemVCaXRzKHNpemVfdCBuZXdT
aXplKSBvdmVycmlkZTsKLSAgICB2b2lkIGRpZFJlbW92ZUJsb2NrKHNpemVfdCBibG9ja0luZGV4
KSBvdmVycmlkZTsKKyAgICB2b2lkIGRpZFJlc2l6ZUJpdHModW5zaWduZWQgbmV3U2l6ZSkgb3Zl
cnJpZGU7CisgICAgdm9pZCBkaWRSZW1vdmVCbG9jayh1bnNpZ25lZCBibG9ja0luZGV4KSBvdmVy
cmlkZTsKICAgICB2b2lkIGRpZEJlZ2luU3dlZXBpbmdUb0ZyZWVMaXN0KE1hcmtlZEJsb2NrOjpI
YW5kbGUqKSBvdmVycmlkZTsKICAgICAKICAgICBCbG9ja0RpcmVjdG9yeSBtX2RpcmVjdG9yeTsK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL0xvY2FsQWxsb2NhdG9yLmgg
Yi9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9Mb2NhbEFsbG9jYXRvci5oCmluZGV4IDliNjUx
YjA3MDM3NjgxNGYyYTM5N2JiMmExODZlZDcwMDA5OWQzODMuLmJkNzY4YmQ3YjBmNmYxMTU5NWFi
NzE3Y2I2OGVmNDlmY2ZmZmY4MjEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9o
ZWFwL0xvY2FsQWxsb2NhdG9yLmgKKysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTG9j
YWxBbGxvY2F0b3IuaApAQCAtNzYsNyArNzYsNyBAQCBjbGFzcyBMb2NhbEFsbG9jYXRvciA6IHB1
YmxpYyBCYXNpY1Jhd1NlbnRpbmVsTm9kZTxMb2NhbEFsbG9jYXRvcj4gewogICAgIAogICAgIC8v
IEFmdGVyIHlvdSBkbyBzb21ldGhpbmcgdG8gYSBibG9jayBiYXNlZCBvbiBvbmUgb2YgdGhlc2Ug
Y3Vyc29ycywgeW91IGNsZWFyIHRoZSBiaXQgaW4gdGhlCiAgICAgLy8gY29ycmVzcG9uZGluZyBi
aXR2ZWN0b3IgYW5kIGxlYXZlIHRoZSBjdXJzb3Igd2hlcmUgaXQgd2FzLgotICAgIHNpemVfdCBt
X2FsbG9jYXRpb25DdXJzb3IgeyAwIH07IC8vIFBvaW50cyB0byB0aGUgbmV4dCBibG9jayB0aGF0
IGlzIGEgY2FuZGlkYXRlIGZvciBhbGxvY2F0aW9uLgorICAgIHVuc2lnbmVkIG1fYWxsb2NhdGlv
bkN1cnNvciB7IDAgfTsgLy8gUG9pbnRzIHRvIHRoZSBuZXh0IGJsb2NrIHRoYXQgaXMgYSBjYW5k
aWRhdGUgZm9yIGFsbG9jYXRpb24uCiB9OwogCiBpbmxpbmUgcHRyZGlmZl90IExvY2FsQWxsb2Nh
dG9yOjpvZmZzZXRPZkZyZWVMaXN0KCkKZGlmZiAtLWdpdCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9oZWFwL01hcmtlZEJsb2NrLmNwcCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL01hcmtl
ZEJsb2NrLmNwcAppbmRleCAyOTcwMjRiNzMzNTkxZWY1M2UyY2I5Nzk5YmViNmVkODdmMDVjNTY0
Li5iNGE5YTk2ZTk4YzlmYjllNjdlZjMxMTAyMjg2NGRiNWJiYzA1NGFhIDEwMDY0NAotLS0gYS9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRCbG9jay5jcHAKKysrIGIvU291cmNlL0ph
dmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkQmxvY2suY3BwCkBAIC0zMjEsOSArMzIxLDkgQEAgdm9p
ZCBNYXJrZWRCbG9jazo6SGFuZGxlOjpyZW1vdmVGcm9tRGlyZWN0b3J5KCkKICAgICBtX2RpcmVj
dG9yeS0+cmVtb3ZlQmxvY2sodGhpcyk7CiB9CiAKLXZvaWQgTWFya2VkQmxvY2s6OkhhbmRsZTo6
ZGlkQWRkVG9EaXJlY3RvcnkoQmxvY2tEaXJlY3RvcnkqIGRpcmVjdG9yeSwgc2l6ZV90IGluZGV4
KQordm9pZCBNYXJrZWRCbG9jazo6SGFuZGxlOjpkaWRBZGRUb0RpcmVjdG9yeShCbG9ja0RpcmVj
dG9yeSogZGlyZWN0b3J5LCB1bnNpZ25lZCBpbmRleCkKIHsKLSAgICBBU1NFUlQobV9pbmRleCA9
PSBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpKTsKKyAgICBBU1NFUlQobV9pbmRl
eCA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpOwogICAgIEFTU0VSVCgh
bV9kaXJlY3RvcnkpOwogICAgIAogICAgIFJFTEVBU0VfQVNTRVJUKGRpcmVjdG9yeS0+c3Vic3Bh
Y2UoKS0+YWxpZ25lZE1lbW9yeUFsbG9jYXRvcigpID09IG1fYWxpZ25lZE1lbW9yeUFsbG9jYXRv
cik7CkBAIC0zNTMsMTAgKzM1MywxMCBAQCB2b2lkIE1hcmtlZEJsb2NrOjpIYW5kbGU6OmRpZEFk
ZFRvRGlyZWN0b3J5KEJsb2NrRGlyZWN0b3J5KiBkaXJlY3RvcnksIHNpemVfdCBpbgogCiB2b2lk
IE1hcmtlZEJsb2NrOjpIYW5kbGU6OmRpZFJlbW92ZUZyb21EaXJlY3RvcnkoKQogewotICAgIEFT
U0VSVChtX2luZGV4ICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkpOworICAg
IEFTU0VSVChtX2luZGV4ICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSk7
CiAgICAgQVNTRVJUKG1fZGlyZWN0b3J5KTsKICAgICAKLSAgICBtX2luZGV4ID0gc3RkOjpudW1l
cmljX2xpbWl0czxzaXplX3Q+OjptYXgoKTsKKyAgICBtX2luZGV4ID0gc3RkOjpudW1lcmljX2xp
bWl0czx1bnNpZ25lZD46Om1heCgpOwogICAgIG1fZGlyZWN0b3J5ID0gbnVsbHB0cjsKICAgICBi
bG9ja0Zvb3RlcigpLm1fc3Vic3BhY2UgPSBudWxscHRyOwogfQpkaWZmIC0tZ2l0IGEvU291cmNl
L0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkQmxvY2suaCBiL1NvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9oZWFwL01hcmtlZEJsb2NrLmgKaW5kZXggMmVmMGRmMTU4N2ZkOTJjOTI1Y2JlOWY0Y2FmZjU2
NWNmZGQwOWZlYS4uZTJiMDg2YWRiOTA1Njk3N2NiMThhNGFkZTY1YjFkZmJkNDQ5ZTRmZSAxMDA2
NDQKLS0tIGEvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvTWFya2VkQmxvY2suaAorKysgYi9T
b3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9NYXJrZWRCbG9jay5oCkBAIC0xOTYsMTEgKzE5Niwx
MSBAQCBjbGFzcyBNYXJrZWRCbG9jayB7CiAgICAgICAgICAgICAKICAgICAgICAgYm9vbCBpc0Zy
ZWVMaXN0ZWQoKSBjb25zdCB7IHJldHVybiBtX2lzRnJlZUxpc3RlZDsgfQogICAgICAgICAKLSAg
ICAgICAgc2l6ZV90IGluZGV4KCkgY29uc3QgeyByZXR1cm4gbV9pbmRleDsgfQorICAgICAgICB1
bnNpZ25lZCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1faW5kZXg7IH0KICAgICAgICAgCiAgICAg
ICAgIHZvaWQgcmVtb3ZlRnJvbURpcmVjdG9yeSgpOwogICAgICAgICAKLSAgICAgICAgdm9pZCBk
aWRBZGRUb0RpcmVjdG9yeShCbG9ja0RpcmVjdG9yeSosIHNpemVfdCBpbmRleCk7CisgICAgICAg
IHZvaWQgZGlkQWRkVG9EaXJlY3RvcnkoQmxvY2tEaXJlY3RvcnkqLCB1bnNpZ25lZCBpbmRleCk7
CiAgICAgICAgIHZvaWQgZGlkUmVtb3ZlRnJvbURpcmVjdG9yeSgpOwogICAgICAgICAKICAgICAg
ICAgdm9pZCogc3RhcnQoKSBjb25zdCB7IHJldHVybiAmbV9ibG9jay0+YXRvbXMoKVswXTsgfQpA
QCAtMjI5LDE4ICsyMjksMTUgQEAgY2xhc3MgTWFya2VkQmxvY2sgewogICAgICAgICAKICAgICAg
ICAgdm9pZCBzZXRJc0ZyZWVMaXN0ZWQoKTsKICAgICAgICAgCi0gICAgICAgIE1hcmtlZEJsb2Nr
OjpIYW5kbGUqIG1fcHJldiB7IG51bGxwdHIgfTsKLSAgICAgICAgTWFya2VkQmxvY2s6OkhhbmRs
ZSogbV9uZXh0IHsgbnVsbHB0ciB9OwotICAgICAgICAgICAgCi0gICAgICAgIHNpemVfdCBtX2F0
b21zUGVyQ2VsbCB7IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgfTsKLSAgICAg
ICAgc2l6ZV90IG1fZW5kQXRvbSB7IHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkg
fTsgLy8gVGhpcyBpcyBhIGZ1enp5IGVuZC4gQWx3YXlzIHRlc3QgZm9yIDwgbV9lbmRBdG9tLgor
ICAgICAgICB1bnNpZ25lZCBtX2F0b21zUGVyQ2VsbCB7IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5z
aWduZWQ+OjptYXgoKSB9OworICAgICAgICB1bnNpZ25lZCBtX2VuZEF0b20geyBzdGQ6Om51bWVy
aWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkgfTsgLy8gVGhpcyBpcyBhIGZ1enp5IGVuZC4gQWx3
YXlzIHRlc3QgZm9yIDwgbV9lbmRBdG9tLgogICAgICAgICAgICAgCiAgICAgICAgIENlbGxBdHRy
aWJ1dGVzIG1fYXR0cmlidXRlczsKICAgICAgICAgYm9vbCBtX2lzRnJlZUxpc3RlZCB7IGZhbHNl
IH07CisgICAgICAgIHVuc2lnbmVkIG1faW5kZXggeyBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2ln
bmVkPjo6bWF4KCkgfTsKIAogICAgICAgICBBbGlnbmVkTWVtb3J5QWxsb2NhdG9yKiBtX2FsaWdu
ZWRNZW1vcnlBbGxvY2F0b3IgeyBudWxscHRyIH07CiAgICAgICAgIEJsb2NrRGlyZWN0b3J5KiBt
X2RpcmVjdG9yeSB7IG51bGxwdHIgfTsKLSAgICAgICAgc2l6ZV90IG1faW5kZXggeyBzdGQ6Om51
bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIH07CiAgICAgICAgIFdlYWtTZXQgbV93ZWFrU2V0
OwogICAgICAgICAKICAgICAgICAgTWFya2VkQmxvY2sqIG1fYmxvY2sgeyBudWxscHRyIH07CkBA
IC01NTUsNiArNTUyLDggQEAgaW5saW5lIHNpemVfdCBNYXJrZWRCbG9jazo6SGFuZGxlOjpzaXpl
KCkKICAgICByZXR1cm4gbWFya0NvdW50KCkgKiBjZWxsU2l6ZSgpOwogfQogCisvLyBUaGlzIGZ1
bmN0aW9uIG11c3QgcmV0dXJuIHNpemVfdCBpbnN0ZWFkIG9mIHVuc2lnbmVkIHNpbmNlIHBvaW50
ZXIgfHB8IGlzIG5vdCBndWFyYW50ZWVkIHRoYXQgdGhpcyBpcyB3aXRoaW4gTWFya2VkQmxvY2su
CisvLyBTZWUgTWFya2VkQmxvY2s6OmlzQXRvbSB3aGljaCBjYW4gYWNjZXB0IG91dC1vZi1ib3Vu
ZCBwb2ludGVycy4KIGlubGluZSBzaXplX3QgTWFya2VkQmxvY2s6OmF0b21OdW1iZXIoY29uc3Qg
dm9pZCogcCkKIHsKICAgICByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihwKSAt
IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih0aGlzKSkgLyBhdG9tU2l6ZTsKZGlmZiAtLWdp
dCBhL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL1N1YnNwYWNlLmNwcCBiL1NvdXJjZS9KYXZh
U2NyaXB0Q29yZS9oZWFwL1N1YnNwYWNlLmNwcAppbmRleCBhYjk5ZTJkYTZjNWMzYjM1MTM2YjE3
YWU0NGU1MWJhNzhhOTg5NzMxLi42MTNiYTUyZTcyMGQwN2M5MGFmYzU1MGE5Mjg1YWZhNGJhYzcx
ZWRhIDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9TdWJzcGFjZS5jcHAK
KysrIGIvU291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvU3Vic3BhY2UuY3BwCkBAIC0xMzMsMTEg
KzEzMywxMSBAQCB2b2lkIFN1YnNwYWNlOjpzd2VlcEJsb2NrcygpCiAgICAgICAgIH0pOwogfQog
Ci12b2lkIFN1YnNwYWNlOjpkaWRSZXNpemVCaXRzKHNpemVfdCkKK3ZvaWQgU3Vic3BhY2U6OmRp
ZFJlc2l6ZUJpdHModW5zaWduZWQpCiB7CiB9CiAKLXZvaWQgU3Vic3BhY2U6OmRpZFJlbW92ZUJs
b2NrKHNpemVfdCkKK3ZvaWQgU3Vic3BhY2U6OmRpZFJlbW92ZUJsb2NrKHVuc2lnbmVkKQogewog
fQogCmRpZmYgLS1naXQgYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9TdWJzcGFjZS5oIGIv
U291cmNlL0phdmFTY3JpcHRDb3JlL2hlYXAvU3Vic3BhY2UuaAppbmRleCAzNGVhMzQxMTgzMWJl
MDg3ZTNlNTNlYmU2MDdiNGE4ZTYwM2RkZGRlLi5kNGRmOTBjMDBmMDcxYzBiMmYxNjk2ZDIwYTQw
YmY2NzdlMjlhMzE3IDEwMDY0NAotLS0gYS9Tb3VyY2UvSmF2YVNjcmlwdENvcmUvaGVhcC9TdWJz
cGFjZS5oCisrKyBiL1NvdXJjZS9KYXZhU2NyaXB0Q29yZS9oZWFwL1N1YnNwYWNlLmgKQEAgLTk3
LDggKzk3LDggQEAgY2xhc3MgU3Vic3BhY2UgewogICAgIFN1YnNwYWNlKiBuZXh0U3Vic3BhY2VJ
bkFsaWduZWRNZW1vcnlBbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBtX25leHRTdWJzcGFjZUlu
QWxpZ25lZE1lbW9yeUFsbG9jYXRvcjsgfQogICAgIHZvaWQgc2V0TmV4dFN1YnNwYWNlSW5BbGln
bmVkTWVtb3J5QWxsb2NhdG9yKFN1YnNwYWNlKiBzdWJzcGFjZSkgeyBtX25leHRTdWJzcGFjZUlu
QWxpZ25lZE1lbW9yeUFsbG9jYXRvciA9IHN1YnNwYWNlOyB9CiAgICAgCi0gICAgdmlydHVhbCB2
b2lkIGRpZFJlc2l6ZUJpdHMoc2l6ZV90IG5ld1NpemUpOwotICAgIHZpcnR1YWwgdm9pZCBkaWRS
ZW1vdmVCbG9jayhzaXplX3QgYmxvY2tJbmRleCk7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlc2l6
ZUJpdHModW5zaWduZWQgbmV3U2l6ZSk7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlbW92ZUJsb2Nr
KHVuc2lnbmVkIGJsb2NrSW5kZXgpOwogICAgIHZpcnR1YWwgdm9pZCBkaWRCZWdpblN3ZWVwaW5n
VG9GcmVlTGlzdChNYXJrZWRCbG9jazo6SGFuZGxlKik7CiAKICAgICBib29sIGlzSXNvU3Vic3Bh
Y2UoKSBjb25zdCB7IHJldHVybiBtX2lzSXNvU3Vic3BhY2U7IH0K
</data>
<flag name="review"
          id="402434"
          type_id="1"
          status="+"
          setter="mark.lam"
    />
          </attachment>
      

    </bug>

</bugzilla>