<?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>172880</bug_id>
          
          <creation_ts>2017-06-02 16:35:10 -0700</creation_ts>
          <short_desc>bmalloc: Small and large objects should share memory</short_desc>
          <delta_ts>2017-06-05 21:40:42 -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>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></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Geoffrey Garen">ggaren</reporter>
          <assigned_to name="Geoffrey Garen">ggaren</assigned_to>
          <cc>bugs-noreply</cc>
    
    <cc>clopez</cc>
    
    <cc>msaboff</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1315278</commentid>
    <comment_count>0</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-02 16:35:10 -0700</bug_when>
    <thetext>bmalloc: Small and large objects should share memory</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1315288</commentid>
    <comment_count>1</comment_count>
      <attachid>311885</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-02 16:52:59 -0700</bug_when>
    <thetext>Created attachment 311885
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1315290</commentid>
    <comment_count>2</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-02 16:54:27 -0700</bug_when>
    <thetext>Benchmark results:

~/OpenSource/Source/bmalloc&gt; ~/OpenSource/PerformanceTests/MallocBench/run-malloc-benchmarks --memory_warning Baseline:~/OpenSource/WebKitBuildBaseline/Release/ Patch:~/OpenSource/WebKitBuild/Release/
                                                                                     
                                                                Baseline                               Patch                                   Δ
Peak Memory:
    reddit_memory_warning --runs 0                              15,320kB                            15,268kB                      ^ 1.0x smaller
    flickr_memory_warning --runs 0                              27,980kB                            27,296kB                     ^ 1.03x smaller
    theverge_memory_warning --runs 0                            28,256kB                            28,300kB                       ! 1.0x bigger

    &lt;geometric mean&gt;                                            22,965kB                            22,763kB                     ^ 1.01x smaller
    &lt;arithmetic mean&gt;                                           23,852kB                            23,621kB                     ^ 1.01x smaller
    &lt;harmonic mean&gt;                                             21,993kB                            21,823kB                     ^ 1.01x smaller

Memory at End:
    reddit_memory_warning --runs 0                               8,880kB                             8,804kB                     ^ 1.01x smaller
    flickr_memory_warning --runs 0                              12,144kB                            12,140kB                      ^ 1.0x smaller
    theverge_memory_warning --runs 0                            20,900kB                            20,944kB                       ! 1.0x bigger

    &lt;geometric mean&gt;                                            13,111kB                            13,081kB                      ^ 1.0x smaller
    &lt;arithmetic mean&gt;                                           13,975kB                            13,963kB                      ^ 1.0x smaller
    &lt;harmonic mean&gt;                                             12,356kB                            12,310kB                      ^ 1.0x smaller

=====
~/OpenSource/Source/bmalloc&gt; ~/OpenSource/PerformanceTests/MallocBench/run-malloc-benchmarks --memory Baseline:~/OpenSource/WebKitBuildBaseline/Release/ Patch:~/OpenSource/WebKitBuild/Release/
                                                                                
                                  Baseline                Patch                    Δ
Peak Memory:
    facebook --runs 0             73,492kB             75,292kB       ! 1.02x bigger
    reddit --runs 0               15,360kB             15,348kB       ^ 1.0x smaller
    flickr --runs 0               27,856kB             28,208kB       ! 1.01x bigger
    theverge --runs 0             28,304kB             28,888kB       ! 1.02x bigger
    nimlang --runs 0             119,808kB            107,236kB      ^ 1.12x smaller

    &lt;geometric mean&gt;              40,325kB             39,888kB      ^ 1.01x smaller
    &lt;arithmetic mean&gt;             52,964kB             50,994kB      ^ 1.04x smaller
    &lt;harmonic mean&gt;               31,588kB             31,680kB        ! 1.0x bigger

Memory at End:
    facebook --runs 0              2,764kB              2,392kB      ^ 1.16x smaller
    reddit --runs 0                1,824kB              1,632kB      ^ 1.12x smaller
    flickr --runs 0                2,800kB              2,532kB      ^ 1.11x smaller
    theverge --runs 0              2,852kB              2,560kB      ^ 1.11x smaller
    nimlang --runs 0               8,556kB              8,392kB      ^ 1.02x smaller

    &lt;geometric mean&gt;               3,217kB              2,920kB       ^ 1.1x smaller
    &lt;arithmetic mean&gt;              3,759kB              3,502kB      ^ 1.07x smaller
    &lt;harmonic mean&gt;                2,882kB              2,583kB      ^ 1.12x smaller

=====
~/OpenSource/Source/bmalloc&gt; 



~/OpenSource/Source/bmalloc&gt;  ~/OpenSource/PerformanceTests/MallocBench/run-malloc-benchmarks Baseline:~/OpenSource/WebKitBuildBaseline/Release/ Patch:~/OpenSource/WebKitBuild/Release/
                                                                                
                                                      Baseline                          Patch                              Δ
Execution Time:
    churn                                                 81ms                           81ms                               
    list_allocate                                         75ms                           74ms                 ^ 1.01x faster
    tree_allocate                                         80ms                           83ms                 ! 1.04x slower
    tree_churn                                            99ms                           90ms                  ^ 1.1x faster
    fragment                                              72ms                           74ms                 ! 1.03x slower
    fragment_iterate                                      80ms                           81ms                 ! 1.01x slower
    medium                                               157ms                          164ms                 ! 1.04x slower
    big                                                  138ms                          143ms                 ! 1.04x slower
    facebook                                             228ms                          234ms                 ! 1.03x slower
    reddit                                               115ms                          119ms                 ! 1.03x slower
    flickr                                               125ms                          118ms                 ^ 1.06x faster
    theverge                                             154ms                          157ms                 ! 1.02x slower
    nimlang                                              127ms                          125ms                 ^ 1.02x faster
    message_one                                          195ms                          192ms                 ^ 1.02x faster
    message_many                                         120ms                          125ms                 ! 1.04x slower
    churn --parallel                                      38ms                           38ms                               
    list_allocate --parallel                              71ms                           71ms                               
    tree_allocate --parallel                              87ms                           87ms                               
    tree_churn --parallel                                 91ms                           90ms                 ^ 1.01x faster
    fragment --parallel                                   54ms                           55ms                 ! 1.02x slower
    fragment_iterate --parallel                           34ms                           34ms                               
    medium --parallel                                    167ms                          159ms                 ^ 1.05x faster
    big --parallel                                       159ms                          155ms                 ^ 1.03x faster
    facebook --parallel                                  676ms                          642ms                 ^ 1.05x faster
    reddit --parallel                                    327ms                          321ms                 ^ 1.02x faster
    flickr --parallel                                    324ms                          321ms                 ^ 1.01x faster
    theverge --parallel                                  441ms                          431ms                 ^ 1.02x faster

    &lt;geometric mean&gt;                                     123ms                          123ms                  ^ 1.0x faster
    &lt;arithmetic mean&gt;                                    160ms                          158ms                 ^ 1.01x faster
    &lt;harmonic mean&gt;                                      100ms                          100ms                  ! 1.0x slower

Peak Memory:
    churn                                              2,308kB                        2,300kB                 ^ 1.0x smaller
    list_allocate                                      3,580kB                        3,588kB                  ! 1.0x bigger
    tree_allocate                                      6,944kB                        7,400kB                 ! 1.07x bigger
    tree_churn                                         6,184kB                        6,208kB                  ! 1.0x bigger
    fragment                                           8,484kB                        9,452kB                 ! 1.11x bigger
    fragment_iterate                                  27,072kB                       27,112kB                  ! 1.0x bigger
    medium                                         1,183,944kB                    1,190,800kB                 ! 1.01x bigger
    big                                            1,085,132kB                    1,090,592kB                 ! 1.01x bigger
    facebook                                          74,412kB                       81,216kB                 ! 1.09x bigger
    reddit                                            15,432kB                       15,388kB                 ^ 1.0x smaller
    flickr                                            27,936kB                       29,384kB                 ! 1.05x bigger
    theverge                                          28,436kB                       28,952kB                 ! 1.02x bigger
    nimlang                                          175,228kB                      167,908kB                ^ 1.04x smaller
    message_one                                        6,828kB                        6,624kB                ^ 1.03x smaller
    message_many                                       4,712kB                        4,604kB                ^ 1.02x smaller
    churn --parallel                                   2,412kB                        2,396kB                ^ 1.01x smaller
    list_allocate --parallel                           3,644kB                        3,692kB                 ! 1.01x bigger
    tree_allocate --parallel                           4,748kB                        4,768kB                  ! 1.0x bigger
    tree_churn --parallel                              4,400kB                        4,420kB                  ! 1.0x bigger
    fragment --parallel                                8,584kB                        9,556kB                 ! 1.11x bigger
    fragment_iterate --parallel                       27,196kB                       27,996kB                 ! 1.03x bigger
    medium --parallel                              1,182,568kB                    1,192,292kB                 ! 1.01x bigger
    big --parallel                                 1,082,116kB                    1,083,532kB                  ! 1.0x bigger
    facebook --parallel                              280,920kB                      280,972kB                  ! 1.0x bigger
    reddit --parallel                                 53,828kB                       56,428kB                 ! 1.05x bigger
    flickr --parallel                                102,724kB                      103,980kB                 ! 1.01x bigger
    theverge --parallel                              107,100kB                      110,152kB                 ! 1.03x bigger

    &lt;geometric mean&gt;                                  29,516kB                       30,058kB                 ! 1.02x bigger
    &lt;arithmetic mean&gt;                                204,329kB                      205,619kB                 ! 1.01x bigger
    &lt;harmonic mean&gt;                                    8,965kB                        9,059kB                 ! 1.01x bigger

Memory at End:
    churn                                                492kB                          472kB                ^ 1.04x smaller
    list_allocate                                        488kB                          472kB                ^ 1.03x smaller
    tree_allocate                                        516kB                          464kB                ^ 1.11x smaller
    tree_churn                                           480kB                          456kB                ^ 1.05x smaller
    fragment                                             528kB                          472kB                ^ 1.12x smaller
    fragment_iterate                                     684kB                          472kB                ^ 1.45x smaller
    medium                                            12,088kB                          532kB               ^ 22.72x smaller
    big                                                1,276kB                          536kB                ^ 2.38x smaller
    facebook                                           2,896kB                        2,528kB                ^ 1.15x smaller
    reddit                                             1,888kB                        1,664kB                ^ 1.13x smaller
    flickr                                             2,872kB                        2,664kB                ^ 1.08x smaller
    theverge                                           2,972kB                        2,624kB                ^ 1.13x smaller
    nimlang                                           58,248kB                       58,644kB                 ! 1.01x bigger
    message_one                                          780kB                          748kB                ^ 1.04x smaller
    message_many                                       1,196kB                        1,212kB                 ! 1.01x bigger
    churn --parallel                                     576kB                          560kB                ^ 1.03x smaller
    list_allocate --parallel                             604kB                          632kB                 ! 1.05x bigger
    tree_allocate --parallel                             768kB                          804kB                 ! 1.05x bigger
    tree_churn --parallel                                872kB                          812kB                ^ 1.07x smaller
    fragment --parallel                                  804kB                          824kB                 ! 1.02x bigger
    fragment_iterate --parallel                          852kB                          656kB                 ^ 1.3x smaller
    medium --parallel                                 17,084kB                        8,472kB                ^ 2.02x smaller
    big --parallel                                    19,708kB                       30,400kB                 ! 1.54x bigger
    facebook --parallel                               11,916kB                       11,984kB                 ! 1.01x bigger
    reddit --parallel                                  6,880kB                        7,044kB                 ! 1.02x bigger
    flickr --parallel                                 11,620kB                       11,564kB                 ^ 1.0x smaller
    theverge --parallel                               11,320kB                       11,048kB                ^ 1.02x smaller

    &lt;geometric mean&gt;                                   2,098kB                        1,698kB                ^ 1.24x smaller
    &lt;arithmetic mean&gt;                                  6,311kB                        5,880kB                ^ 1.07x smaller
    &lt;harmonic mean&gt;                                    1,089kB                          911kB                 ^ 1.2x smaller</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1315469</commentid>
    <comment_count>3</comment_count>
      <attachid>311885</attachid>
    <who name="Sam Weinig">sam</who>
    <bug_when>2017-06-03 13:09:28 -0700</bug_when>
    <thetext>Comment on attachment 311885
Patch

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

&gt; Source/bmalloc/ChangeLog:10
&gt; +        This reduces our high-watermark memory usage on JetStream on macOS
&gt; +        by 10%-20%.

Very nice!

Probably worth stating there performance change or that it had no effect.

Also, I would find it useful (and future readers of the code might as well) to have an explanation up top of the changes in the algorithm,

&gt; Source/bmalloc/ChangeLog:20
&gt; +        (bmalloc::forEachPage):A new helper function for iterating the pages

Missing space after the : which is personally killing me.

&gt; Source/bmalloc/ChangeLog:47
&gt; +        (bmalloc::Heap::deallocateSmallLine):  Updated for new APIs. Note that
&gt; +        we save one chunk per page class a little cache. This avoids churn

I don&apos;t follow the second sentence.  I feel like maybe a word or some punctuation is missing.

&gt; Source/bmalloc/bmalloc/Chunk.h:85
&gt; +    for (Object it = begin; it + pageSize &lt;= end; it = it + pageSize)

I&apos;m not sure what your auto usage is like in bmalloc, but, you could replace Object it with auto it.

&gt; Source/bmalloc/bmalloc/Heap.cpp:172
&gt; +        for (auto chunk = m_freePages[pageClass].begin(); chunk != m_freePages[pageClass].end(); ++chunk) {
&gt; +            for (auto page = chunk-&gt;freePages().begin(); page != chunk-&gt;freePages().end(); ++page) {

I think these two loops could be simplified to:

for (auto&amp; chunk : m_freePages[pageClass]) {
    for (auto&amp; page = chunk.freePages()) {
        ...
    }
}

&gt; Source/bmalloc/bmalloc/Heap.cpp:183
&gt; +    for (size_t pageClass = 0; pageClass &lt; pageClassCount; pageClass++) {

We usually use ++pageClass.

&gt; Source/bmalloc/bmalloc/LargeRange.h:54
&gt; +    size_t physicalSize() const { return m_physicalSize; } // True physical size can be larger.

This comment is confusing. Perhaps you could clarify what &quot;True physical size&quot; is and why it can be larger.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1315848</commentid>
    <comment_count>4</comment_count>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2017-06-05 19:21:13 -0700</bug_when>
    <thetext>Committed r217811: &lt;http://trac.webkit.org/changeset/217811&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1315889</commentid>
    <comment_count>5</comment_count>
    <who name="Carlos Alberto Lopez Perez">clopez</who>
    <bug_when>2017-06-05 21:40:42 -0700</bug_when>
    <thetext>(In reply to Geoffrey Garen from comment #4)
&gt; Committed r217811: &lt;http://trac.webkit.org/changeset/217811&gt;

It seems this fails to build with GCC-4.9 (our minimum version of the supported compiler on WebKitGTK+).

The log: https://build.webkit.org/builders/GTK%20Linux%2064-bit%20Release%20Debian%20Stable%20%28Build%29/builds/2454/steps/compile-webkit/logs/stdio</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>311885</attachid>
            <date>2017-06-02 16:52:59 -0700</date>
            <delta_ts>2017-06-03 13:09:28 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-172880-20170602165258.patch</filename>
            <type>text/plain</type>
            <size>26195</size>
            <attacher name="Geoffrey Garen">ggaren</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9ibWFsbG9jL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1h
bGxvYy9DaGFuZ2VMb2cJKHJldmlzaW9uIDIxNzc0MSkKKysrIFNvdXJjZS9ibWFsbG9jL0NoYW5n
ZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDEwMyBAQAorMjAxNy0wNi0wMiAgR2VvZmZy
ZXkgR2FyZW4gIDxnZ2FyZW5AYXBwbGUuY29tPgorCisgICAgICAgIGJtYWxsb2M6IFNtYWxsIGFu
ZCBsYXJnZSBvYmplY3RzIHNob3VsZCBzaGFyZSBtZW1vcnkKKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE3Mjg4MAorICAgICAgICA8cmRhcjovL3Byb2Js
ZW0vMzE0OTQ3MzI+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgVGhpcyByZWR1Y2VzIG91ciBoaWdoLXdhdGVybWFyayBtZW1vcnkgdXNhZ2Ugb24gSmV0
U3RyZWFtIG9uIG1hY09TCisgICAgICAgIGJ5IDEwJS0yMCUuCisKKyAgICAgICAgKiBibWFsbG9j
L0NodW5rLmg6CisgICAgICAgIChibWFsbG9jOjpDaHVuazo6cmVmKToKKyAgICAgICAgKGJtYWxs
b2M6OkNodW5rOjpkZXJlZik6CisgICAgICAgIChibWFsbG9jOjpDaHVuazo6cmVmQ291bnQpOgor
ICAgICAgICAoYm1hbGxvYzo6Q2h1bms6OmZyZWVQYWdlcyk6IFdlIGtlZXAgYSBmcmVlIGxpc3Qg
cGVyIGNodW5rIGFuZCByZWZjb3VudAorICAgICAgICBlYWNoIGNodW5rIHNvIHdlIGNhbiBub3Rp
Y2Ugd2hlbiBhIGNodW5rIGJlY29tZXMgZW1wdHksIGFuZCByZXR1cm4gaXQKKyAgICAgICAgdG8g
dGhlIGxhcmdlIGFsbG9jYXRvci4KKworICAgICAgICAoYm1hbGxvYzo6Zm9yRWFjaFBhZ2UpOkEg
bmV3IGhlbHBlciBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIHRoZSBwYWdlcworICAgICAgICBpbiBh
IENodW5rLgorCisgICAgICAgIChibWFsbG9jOjpDaHVuazo6Q2h1bmspOiBVc2UgZm9yRWFjaFBh
Z2UgaW5zdGVhZCBvZiBtYW51YWwgaXRlcmF0aW9uLgorICAgICAgICBVc2UgeyB9IGluaXRpYWxp
emF0aW9uIGJlY2F1c2Ugd2UgZG9uJ3QgZ2V0IHplcm8taW5pdGlhbGl6ZWQgYnkgdGhlIE9TCisg
ICAgICAgIGFueW1vcmUuCisKKyAgICAgICAgKiBibWFsbG9jL0hlYXAuY3BwOgorICAgICAgICAo
Ym1hbGxvYzo6SGVhcDo6SGVhcCk6CisgICAgICAgIChibWFsbG9jOjpIZWFwOjpjb25jdXJyZW50
U2NhdmVuZ2UpOgorICAgICAgICAoYm1hbGxvYzo6SGVhcDo6c2NhdmVuZ2UpOiBEb24ndCBib3Ro
ZXIgdW5sb2NraW5nIHdoaWxlIHNjYXZlbmdpbmcuIEkKKyAgICAgICAgd2Fzbid0IGFibGUgdG8g
c2hvdyBpdCB0byBiZSBhIGNvbnNpc3RlbnQgc3BlZWR1cC4gQSBtb3JlIHByb21pc2luZworICAg
ICAgICBhcHByb2FjaCwgaWYgd2UgZmluZCBhIG1vdGl2YXRpbmcgZXhhbXBsZSwgaXMgZm9yIHRo
ZSBzY2F2ZW5nZXIgdG8gZ2l2ZQorICAgICAgICB1cCBhbmQgcmV0dXJuIGVhcmx5IGlmIGFueSBv
dGhlciBjbGllbnQgaXMgd2FpdGluZyBvbiB0aGUgbG9jay4KKworICAgICAgICAoYm1hbGxvYzo6
SGVhcDo6YWxsb2NhdGVTbWFsbENodW5rKTogTmV3IGhlbHBlciBmdW5jdGlvbiBmb3IgYWxsb2Nh
dGluZworICAgICAgICBhIHNtYWxsIGNodW5rLiBJdCBhbGxvY2F0ZXMgdGhyb3VnaCB0aGUgbGFy
Z2UgYWxsb2NhdG9yIHRvIGZhY2lsaXRhdGUKKyAgICAgICAgc2hhcmluZy4gV2Ugc3RpbGwgYWxs
b2NhdGUgYSBjaHVuayBhdCBhIHRpbWUgaW5zdGVhZCBvZiBhIHBhZ2UgYXQgYSB0aW1lLgorICAg
ICAgICBTdXJwcmlzaW5nbHksIG1vcmUgcHJlY2lzZSBwYWdlLWF0LWEtdGltZSBhbGxvY2F0aW9u
IGlzIHdvcnNlIGZvciBtZW1vcnkKKyAgICAgICAgdXNlIGJlY2F1c2Ugb2YgZnJhZ21lbnRhdGlv
bi4gU2VncmVnYXRlZCBmaXQgaXMgYSBwb3dlcmZ1bCBvcHRpbWl6YXRpb24uCisKKyAgICAgICAg
KGJtYWxsb2M6OkhlYXA6OmRlYWxsb2NhdGVTbWFsbENodW5rKTogTmV3IGhlbHBlciBmdW5jdGlv
biBmb3IgZGVhbGxvY2F0aW5nCisgICAgICAgIGEgc21hbGwgY2h1bmsuCisKKyAgICAgICAgKGJt
YWxsb2M6OkhlYXA6OmFsbG9jYXRlU21hbGxQYWdlKTogVXBkYXRlZCBmb3IgbmV3IEFQSXMuCisK
KyAgICAgICAgKGJtYWxsb2M6OkhlYXA6OmRlYWxsb2NhdGVTbWFsbExpbmUpOiAgVXBkYXRlZCBm
b3IgbmV3IEFQSXMuIE5vdGUgdGhhdAorICAgICAgICB3ZSBzYXZlIG9uZSBjaHVuayBwZXIgcGFn
ZSBjbGFzcyBhIGxpdHRsZSBjYWNoZS4gVGhpcyBhdm9pZHMgY2h1cm4KKyAgICAgICAgaW4gdGhl
IGxhcmdlIGFsbG9jYXRvciB3aGVuIHlvdSBmcmVlKG1hbGxvYyhYKSkuCisKKyAgICAgICAgKGJt
YWxsb2M6OkhlYXA6OmFsbG9jYXRlU21hbGxCdW1wUmFuZ2VzQnlNZXRhZGF0YSk6CisgICAgICAg
IChibWFsbG9jOjpIZWFwOjphbGxvY2F0ZVNtYWxsQnVtcFJhbmdlc0J5T2JqZWN0KToKKyAgICAg
ICAgKGJtYWxsb2M6OkhlYXA6OnRyeUFsbG9jYXRlTGFyZ2UpOgorICAgICAgICAoYm1hbGxvYzo6
SGVhcDo6c2NhdmVuZ2VTbWFsbFBhZ2VzKTogRGVsZXRlZC4KKyAgICAgICAgKGJtYWxsb2M6Okhl
YXA6OnNjYXZlbmdlTGFyZ2VPYmplY3RzKTogRGVsZXRlZC4KKyAgICAgICAgKiBibWFsbG9jL0hl
YXAuaDoKKworICAgICAgICAqIGJtYWxsb2MvTGFyZ2VNYXAuaDoKKyAgICAgICAgKGJtYWxsb2M6
OkxhcmdlTWFwOjpiZWdpbik6CisgICAgICAgIChibWFsbG9jOjpMYXJnZU1hcDo6ZW5kKTogQWRk
ZWQgaXRlcmF0aW9uIGhlbHBlcnMgZm9yIHNjYXZlbmdpbmcuCisKKyAgICAgICAgKiBibWFsbG9j
L0xhcmdlUmFuZ2UuaDoKKyAgICAgICAgKGJtYWxsb2M6OkxhcmdlUmFuZ2U6OnBoeXNpY2FsU2l6
ZSk6IEFkZGVkIGEgY29tbWVudCBhYm91dCBzb21ldGhpbmcKKyAgICAgICAgdGhhdCBJIGNvbmZ1
c2VkIG15c2VsZiBhYm91dCBpbiB0aGlzIHBhdGNoLgorCisgICAgICAgICogYm1hbGxvYy9MaXN0
Lmg6CisgICAgICAgIChibWFsbG9jOjpMaXN0OjppdGVyYXRvcjo6b3BlcmF0b3IqKToKKyAgICAg
ICAgKGJtYWxsb2M6Okxpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvci0+KToKKyAgICAgICAgKGJtYWxs
b2M6Okxpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvciE9KToKKyAgICAgICAgKGJtYWxsb2M6Okxpc3Q6
Oml0ZXJhdG9yOjpvcGVyYXRvcisrKToKKyAgICAgICAgKGJtYWxsb2M6Okxpc3Q6OmJlZ2luKToK
KyAgICAgICAgKGJtYWxsb2M6Okxpc3Q6OmVuZCk6CisgICAgICAgIChibWFsbG9jOjpMaXN0Ojpw
dXNoRnJvbnQpOgorICAgICAgICAoYm1hbGxvYzo6TGlzdDo6cmVtb3ZlKToKKyAgICAgICAgKGJt
YWxsb2M6Okxpc3ROb2RlOjpMaXN0Tm9kZSk6IERlbGV0ZWQuIEFkZGVkIGl0ZXJhdGlvbiBoZWxw
ZXJzIGZvcgorICAgICAgICBzY2F2ZW5naW5nLiBDaGFuZ2VkIHRoZSBkZWZhdWx0IHN0YXRlIG9m
IGEgTm9kZSB0byBudWxsIHBvaW50ZXJzIGluc3RlYWQKKyAgICAgICAgb2Ygc2VsZiBwb2ludGVy
cyB0byBkaXN0aW5ndWlzaCB0aGUgbnVsbCBub2RlIGZyb20gdGhlIGVtcHR5IG5vZGUgZm9yCisg
ICAgICAgIGVhc2llciBkZWJ1Z2dpbmcuCisKKyAgICAgICAgKiBibWFsbG9jL1NpemVzLmg6IENo
YW5nZWQgdGhlIGNodW5rIHNpemUgdG8gMU1CIHRvIGluY3JlYXNlIHRoZSBjaGFuY2VzCisgICAg
ICAgIG9mIGEgY2h1bmsgYmVjb21pbmcgZnJlZSBhbmQgcmVjeWNsYWJsZS4KKworICAgICAgICAq
IGJtYWxsb2MvU21hbGxQYWdlLmg6CisgICAgICAgIChibWFsbG9jOjpTbWFsbFBhZ2U6Omhhc1Bo
eXNpY2FsUGFnZXMpOgorICAgICAgICAoYm1hbGxvYzo6U21hbGxQYWdlOjpzZXRIYXNQaHlzaWNh
bFBhZ2VzKTogVHJhY2sgcGh5c2ljYWwgc3RhdGUgYnkgcGFnZQorICAgICAgICBpbnN0ZWFkIG9m
IGltcGxpY2l0bHkgYnkgd2hpY2ggbGlzdCBhIHBhZ2UgaXMgaW4uIEl0J3Mgc2ltcGxlciBub3QK
KyAgICAgICAgdG8gaGF2ZSB0byBtb3ZlIGNodW5rcyBhbmQgcGFnZXMgYmV0d2VlbiBwaHlzaWNh
bCB2cyB2aXJ0dWFsIGxpc3RzLgorCisgICAgICAgIChibWFsbG9jOjpTbWFsbFBhZ2U6OlNtYWxs
UGFnZSk6IERlbGV0ZWQuCisKKyAgICAgICAgKiBibWFsbG9jL1ZNSGVhcC5jcHA6CisgICAgICAg
IChibWFsbG9jOjpWTUhlYXA6OnRyeUFsbG9jYXRlTGFyZ2VDaHVuayk6CisgICAgICAgIChibWFs
bG9jOjpWTUhlYXA6OmFsbG9jYXRlU21hbGxDaHVuayk6IERlbGV0ZWQuCisgICAgICAgICogYm1h
bGxvYy9WTUhlYXAuaDoKKyAgICAgICAgKGJtYWxsb2M6OlZNSGVhcDo6YWxsb2NhdGVTbWFsbFBh
Z2UpOiBEZWxldGVkLgorICAgICAgICAoYm1hbGxvYzo6Vk1IZWFwOjpkZWFsbG9jYXRlU21hbGxQ
YWdlKTogRGVsZXRlZC4gU21hbGwgY2h1bmsgYWxsb2NhdGlvbgorICAgICAgICBqdXN0IGZvcndh
cmRzIHRvIHRoZSBsYXJnZSBhbGxvY2F0b3Igbm93LgorCisgICAgICAgICogYm1hbGxvYy9ibWFs
bG9jLmg6CisgICAgICAgIChibWFsbG9jOjphcGk6OnNjYXZlbmdlKToKKwogMjAxNy0wNS0yOCAg
RGFuIEJlcm5zdGVpbiAgPG1pdHpAYXBwbGUuY29tPgogCiAgICAgICAgIFtYY29kZV0gQUxXQVlT
X1NFQVJDSF9VU0VSX1BBVEhTIGlzIHNldCB0byBZRVMKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2Jt
YWxsb2MvQ2h1bmsuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0NodW5r
LmgJKHJldmlzaW9uIDIxNzU4MSkKKysrIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvQ2h1bmsuaAko
d29ya2luZyBjb3B5KQpAQCAtMzUsMTEgKzM1LDE1IEBACiAKIG5hbWVzcGFjZSBibWFsbG9jIHsK
IAotY2xhc3MgQ2h1bmsgeworY2xhc3MgQ2h1bmsgOiBwdWJsaWMgTGlzdE5vZGU8Q2h1bms+IHsK
IHB1YmxpYzoKICAgICBzdGF0aWMgQ2h1bmsqIGdldCh2b2lkKik7CiAKLSAgICBDaHVuayhzdGQ6
OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+Jik7CisgICAgQ2h1bmsoc2l6ZV90IHBhZ2VTaXplKTsK
KyAgICAKKyAgICB2b2lkIHJlZigpIHsgKyttX3JlZkNvdW50OyB9CisgICAgdm9pZCBkZXJlZigp
IHsgQkFTU0VSVChtX3JlZkNvdW50KTsgLS1tX3JlZkNvdW50OyB9CisgICAgdW5zaWduZWQgcmVm
Q291bnQoKSB7IHJldHVybiBtX3JlZkNvdW50OyB9CiAKICAgICBzaXplX3Qgb2Zmc2V0KHZvaWQq
KTsKIApAQCAtNTAsMTAgKzU0LDE1IEBAIHB1YmxpYzoKICAgICBjaGFyKiBieXRlcygpIHsgcmV0
dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHRoaXMpOyB9CiAgICAgU21hbGxMaW5lKiBsaW5l
cygpIHsgcmV0dXJuICZtX2xpbmVzWzBdOyB9CiAgICAgU21hbGxQYWdlKiBwYWdlcygpIHsgcmV0
dXJuICZtX3BhZ2VzWzBdOyB9CisgICAgCisgICAgTGlzdDxTbWFsbFBhZ2U+JiBmcmVlUGFnZXMo
KSB7IHJldHVybiBtX2ZyZWVQYWdlczsgfQogCiBwcml2YXRlOgotICAgIHN0ZDo6YXJyYXk8U21h
bGxMaW5lLCBjaHVua1NpemUgLyBzbWFsbExpbmVTaXplPiBtX2xpbmVzOwotICAgIHN0ZDo6YXJy
YXk8U21hbGxQYWdlLCBjaHVua1NpemUgLyBzbWFsbFBhZ2VTaXplPiBtX3BhZ2VzOworICAgIHNp
emVfdCBtX3JlZkNvdW50IHsgfTsKKyAgICBMaXN0PFNtYWxsUGFnZT4gbV9mcmVlUGFnZXMgeyB9
OworCisgICAgc3RkOjphcnJheTxTbWFsbExpbmUsIGNodW5rU2l6ZSAvIHNtYWxsTGluZVNpemU+
IG1fbGluZXMgeyB9OworICAgIHN0ZDo6YXJyYXk8U21hbGxQYWdlLCBjaHVua1NpemUgLyBzbWFs
bFBhZ2VTaXplPiBtX3BhZ2VzIHsgfTsKIH07CiAKIHN0cnVjdCBDaHVua0hhc2ggewpAQCAtNjQs
OCArNzMsMjYgQEAgc3RydWN0IENodW5rSGFzaCB7CiAgICAgfQogfTsKIAotaW5saW5lIENodW5r
OjpDaHVuayhzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JikKK3RlbXBsYXRlPHR5cGVuYW1l
IEZ1bmN0aW9uPiB2b2lkIGZvckVhY2hQYWdlKENodW5rKiBjaHVuaywgc2l6ZV90IHBhZ2VTaXpl
LCBGdW5jdGlvbiBmdW5jdGlvbikKK3sKKyAgICAvLyBXZSBhbGlnbiB0byBhdCBsZWFzdCB0aGUg
cGFnZSBzaXplIHNvIHdlIGNhbiBzZXJ2aWNlIGFsaWduZWQgYWxsb2NhdGlvbnMKKyAgICAvLyBh
dCBlcXVhbCBhbmQgc21hbGxlciBwb3dlcnMgb2YgdHdvLCBhbmQgYWxzbyBzbyB3ZSBjYW4gdm1E
ZWFsbG9jYXRlUGh5c2ljYWxQYWdlcygpLgorICAgIHNpemVfdCBtZXRhZGF0YVNpemUgPSByb3Vu
ZFVwVG9NdWx0aXBsZU9mTm9uUG93ZXJPZlR3byhwYWdlU2l6ZSwgc2l6ZW9mKENodW5rKSk7CisK
KyAgICBPYmplY3QgYmVnaW4oY2h1bmssIG1ldGFkYXRhU2l6ZSk7CisgICAgT2JqZWN0IGVuZChj
aHVuaywgY2h1bmtTaXplKTsKKworICAgIGZvciAoT2JqZWN0IGl0ID0gYmVnaW47IGl0ICsgcGFn
ZVNpemUgPD0gZW5kOyBpdCA9IGl0ICsgcGFnZVNpemUpCisgICAgICAgIGZ1bmN0aW9uKGl0LnBh
Z2UoKSk7Cit9CisKK2lubGluZSBDaHVuazo6Q2h1bmsoc2l6ZV90IHBhZ2VTaXplKQogeworICAg
IHNpemVfdCBzbWFsbFBhZ2VDb3VudCA9IHBhZ2VTaXplIC8gc21hbGxQYWdlU2l6ZTsKKyAgICBm
b3JFYWNoUGFnZSh0aGlzLCBwYWdlU2l6ZSwgWyZdKFNtYWxsUGFnZSogcGFnZSkgeworICAgICAg
ICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNtYWxsUGFnZUNvdW50OyArK2kpCisgICAgICAgICAg
ICBwYWdlW2ldLnNldFNsaWRlKGkpOworICAgIH0pOwogfQogCiBpbmxpbmUgQ2h1bmsqIENodW5r
OjpnZXQodm9pZCogYWRkcmVzcykKSW5kZXg6IFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvSGVhcC5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9IZWFwLmNwcAkocmV2aXNp
b24gMjE3NTgxKQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxvYy9IZWFwLmNwcAkod29ya2luZyBj
b3B5KQpAQCAtNjgsNyArNjgsNyBAQCBIZWFwOjpIZWFwKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNN
dXRleD4mCiAgICAgYXV0byBxdWV1ZSA9IGRpc3BhdGNoX3F1ZXVlX2NyZWF0ZSgiV2ViS2l0IE1h
bGxvYyBNZW1vcnkgUHJlc3N1cmUgSGFuZGxlciIsIERJU1BBVENIX1FVRVVFX1NFUklBTCk7CiAg
ICAgbV9wcmVzc3VyZUhhbmRsZXJEaXNwYXRjaFNvdXJjZSA9IGRpc3BhdGNoX3NvdXJjZV9jcmVh
dGUoRElTUEFUQ0hfU09VUkNFX1RZUEVfTUVNT1JZUFJFU1NVUkUsIDAsIERJU1BBVENIX01FTU9S
WVBSRVNTVVJFX0NSSVRJQ0FMLCBxdWV1ZSk7CiAgICAgZGlzcGF0Y2hfc291cmNlX3NldF9ldmVu
dF9oYW5kbGVyKG1fcHJlc3N1cmVIYW5kbGVyRGlzcGF0Y2hTb3VyY2UsIF57Ci0gICAgICAgIHN0
ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0ZXg+IGxvY2soUGVyUHJvY2VzczxIZWFwPjo6bXV0ZXgo
KSk7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4gbG9jayhQZXJQcm9jZXNz
PEhlYXA+OjptdXRleCgpKTsKICAgICAgICAgc2NhdmVuZ2UobG9jayk7CiAgICAgfSk7CiAgICAg
ZGlzcGF0Y2hfcmVzdW1lKG1fcHJlc3N1cmVIYW5kbGVyRGlzcGF0Y2hTb3VyY2UpOwpAQCAtMTUw
LDcgKzE1MCw3IEBAIHZvaWQgSGVhcDo6dXBkYXRlTWVtb3J5SW5Vc2VQYXJhbWV0ZXJzKCkKIAog
dm9pZCBIZWFwOjpjb25jdXJyZW50U2NhdmVuZ2UoKQogewotICAgIHN0ZDo6dW5pcXVlX2xvY2s8
U3RhdGljTXV0ZXg+IGxvY2soUGVyUHJvY2VzczxIZWFwPjo6bXV0ZXgoKSk7CisgICAgc3RkOjps
b2NrX2d1YXJkPFN0YXRpY011dGV4PiBsb2NrKFBlclByb2Nlc3M8SGVhcD46Om11dGV4KCkpOwog
CiAjaWYgQk9TKERBUldJTikKICAgICBwdGhyZWFkX3NldF9xb3NfY2xhc3Nfc2VsZl9ucChtX3Jl
cXVlc3RlZFNjYXZlbmdlclRocmVhZFFPU0NsYXNzLCAwKTsKQEAgLTE2NSwzNiArMTY1LDMwIEBA
IHZvaWQgSGVhcDo6Y29uY3VycmVudFNjYXZlbmdlKCkKICAgICBzY2F2ZW5nZShsb2NrKTsKIH0K
IAotdm9pZCBIZWFwOjpzY2F2ZW5nZShzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9j
aykKLXsKLSAgICBzY2F2ZW5nZVNtYWxsUGFnZXMobG9jayk7Ci0gICAgc2NhdmVuZ2VMYXJnZU9i
amVjdHMobG9jayk7Ci19Ci0gICAgCi12b2lkIEhlYXA6OnNjYXZlbmdlU21hbGxQYWdlcyhzdGQ6
OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaykKK3ZvaWQgSGVhcDo6c2NhdmVuZ2Uoc3Rk
Ojpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYpCiB7CiAgICAgZm9yIChzaXplX3QgcGFnZUNsYXNz
ID0gMDsgcGFnZUNsYXNzIDwgcGFnZUNsYXNzQ291bnQ7IHBhZ2VDbGFzcysrKSB7Ci0gICAgICAg
IGF1dG8mIHNtYWxsUGFnZXMgPSBtX3NtYWxsUGFnZXNbcGFnZUNsYXNzXTsKKyAgICAgICAgZm9y
IChhdXRvIGNodW5rID0gbV9mcmVlUGFnZXNbcGFnZUNsYXNzXS5iZWdpbigpOyBjaHVuayAhPSBt
X2ZyZWVQYWdlc1twYWdlQ2xhc3NdLmVuZCgpOyArK2NodW5rKSB7CisgICAgICAgICAgICBmb3Ig
KGF1dG8gcGFnZSA9IGNodW5rLT5mcmVlUGFnZXMoKS5iZWdpbigpOyBwYWdlICE9IGNodW5rLT5m
cmVlUGFnZXMoKS5lbmQoKTsgKytwYWdlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFwYWdlLT5o
YXNQaHlzaWNhbFBhZ2VzKCkpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogCi0gICAg
ICAgIHdoaWxlICghc21hbGxQYWdlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIFNtYWxsUGFn
ZSogcGFnZSA9IHNtYWxsUGFnZXMucG9wKCk7Ci0gICAgICAgICAgICBtX3ZtSGVhcC5kZWFsbG9j
YXRlU21hbGxQYWdlKGxvY2ssIHBhZ2VDbGFzcywgcGFnZSk7CisgICAgICAgICAgICAgICAgdm1E
ZWFsbG9jYXRlUGh5c2ljYWxQYWdlc1Nsb3BweShwYWdlLT5iZWdpbigpLT5iZWdpbigpLCBwYWdl
U2l6ZShwYWdlQ2xhc3MpKTsKKworICAgICAgICAgICAgICAgIHBhZ2UtPnNldEhhc1BoeXNpY2Fs
UGFnZXMoZmFsc2UpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotfQorICAgIAor
ICAgIGZvciAoc2l6ZV90IHBhZ2VDbGFzcyA9IDA7IHBhZ2VDbGFzcyA8IHBhZ2VDbGFzc0NvdW50
OyBwYWdlQ2xhc3MrKykgeworICAgICAgICB3aGlsZSAoIW1fY2h1bmtDYWNoZVtwYWdlQ2xhc3Nd
LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIGRlYWxsb2NhdGVTbWFsbENodW5rKG1fY2h1bmtDYWNo
ZVtwYWdlQ2xhc3NdLnBvcCgpLCBwYWdlQ2xhc3MpOworICAgIH0KIAotdm9pZCBIZWFwOjpzY2F2
ZW5nZUxhcmdlT2JqZWN0cyhzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaykKLXsK
LSAgICBhdXRvJiByYW5nZXMgPSBtX2xhcmdlRnJlZS5yYW5nZXMoKTsKLSAgICBmb3IgKHNpemVf
dCBpID0gcmFuZ2VzLnNpemUoKTsgaS0tID4gMDsgaSA9IHN0ZDo6bWluKGksIHJhbmdlcy5zaXpl
KCkpKSB7Ci0gICAgICAgIGF1dG8gcmFuZ2UgPSByYW5nZXMucG9wKGkpOwotICAgICAgICAKLSAg
ICAgICAgbG9jay51bmxvY2soKTsKKyAgICBmb3IgKGF1dG8mIHJhbmdlIDogbV9sYXJnZUZyZWUp
IHsKICAgICAgICAgdm1EZWFsbG9jYXRlUGh5c2ljYWxQYWdlc1Nsb3BweShyYW5nZS5iZWdpbigp
LCByYW5nZS5zaXplKCkpOwotICAgICAgICBsb2NrLmxvY2soKTsKIAogICAgICAgICByYW5nZS5z
ZXRQaHlzaWNhbFNpemUoMCk7Ci0gICAgICAgIHJhbmdlcy5wdXNoKHJhbmdlKTsKICAgICB9CiB9
CiAKQEAgLTIyNywyMiArMjIxLDc4IEBAIHZvaWQgSGVhcDo6c2NoZWR1bGVTY2F2ZW5nZXIoc2l6
ZV90IGJ5dGUKICAgICBtX3NjYXZlbmdlci5ydW5Tb29uKCk7CiB9CiAKK3ZvaWQgSGVhcDo6YWxs
b2NhdGVTbWFsbENodW5rKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mIGxvY2ssIHNpemVf
dCBwYWdlQ2xhc3MpCit7CisgICAgc2l6ZV90IHBhZ2VTaXplID0gYm1hbGxvYzo6cGFnZVNpemUo
cGFnZUNsYXNzKTsKKworICAgIENodW5rKiBjaHVuayA9IFsmXSgpIHsKKyAgICAgICAgaWYgKCFt
X2NodW5rQ2FjaGVbcGFnZUNsYXNzXS5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1cm4gbV9j
aHVua0NhY2hlW3BhZ2VDbGFzc10ucG9wKCk7CisKKyAgICAgICAgdm9pZCogbWVtb3J5ID0gYWxs
b2NhdGVMYXJnZShsb2NrLCBjaHVua1NpemUsIGNodW5rU2l6ZSk7CisKKyAgICAgICAgQ2h1bmsq
IGNodW5rID0gbmV3IChtZW1vcnkpIENodW5rKHBhZ2VTaXplKTsKKworICAgICAgICBtX29iamVj
dFR5cGVzLnNldChjaHVuaywgT2JqZWN0VHlwZTo6U21hbGwpOworCisgICAgICAgIGZvckVhY2hQ
YWdlKGNodW5rLCBwYWdlU2l6ZSwgWyZdKFNtYWxsUGFnZSogcGFnZSkgeworICAgICAgICAgICAg
cGFnZS0+c2V0SGFzUGh5c2ljYWxQYWdlcyh0cnVlKTsKKyAgICAgICAgICAgIHBhZ2UtPnNldEhh
c0ZyZWVMaW5lcyhsb2NrLCB0cnVlKTsKKyAgICAgICAgICAgIGNodW5rLT5mcmVlUGFnZXMoKS5w
dXNoKHBhZ2UpOworICAgICAgICB9KTsKKyAgICAgICAgCisgICAgICAgIHNjaGVkdWxlU2NhdmVu
Z2VyKDApOworCisgICAgICAgIHJldHVybiBjaHVuazsKKyAgICB9KCk7CisgICAgCisgICAgbV9m
cmVlUGFnZXNbcGFnZUNsYXNzXS5wdXNoKGNodW5rKTsKK30KKwordm9pZCBIZWFwOjpkZWFsbG9j
YXRlU21hbGxDaHVuayhDaHVuayogY2h1bmssIHNpemVfdCBwYWdlQ2xhc3MpCit7CisgICAgbV9v
YmplY3RUeXBlcy5zZXQoY2h1bmssIE9iamVjdFR5cGU6OkxhcmdlKTsKKyAgICAKKyAgICBzaXpl
X3Qgc2l6ZSA9IG1fbGFyZ2VBbGxvY2F0ZWQucmVtb3ZlKGNodW5rKTsKKworICAgIGJvb2wgaGFz
UGh5c2ljYWxQYWdlcyA9IHRydWU7CisgICAgZm9yRWFjaFBhZ2UoY2h1bmssIHBhZ2VTaXplKHBh
Z2VDbGFzcyksIFsmXShTbWFsbFBhZ2UqIHBhZ2UpIHsKKyAgICAgICAgaWYgKCFwYWdlLT5oYXNQ
aHlzaWNhbFBhZ2VzKCkpCisgICAgICAgICAgICBoYXNQaHlzaWNhbFBhZ2VzID0gZmFsc2U7Cisg
ICAgfSk7CisgICAgc2l6ZV90IHBoeXNpY2FsU2l6ZSA9IGhhc1BoeXNpY2FsUGFnZXMgPyBzaXpl
IDogMDsKKworICAgIG1fbGFyZ2VGcmVlLmFkZChMYXJnZVJhbmdlKGNodW5rLCBzaXplLCBwaHlz
aWNhbFNpemUpKTsKK30KKwogU21hbGxQYWdlKiBIZWFwOjphbGxvY2F0ZVNtYWxsUGFnZShzdGQ6
OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiBsb2NrLCBzaXplX3Qgc2l6ZUNsYXNzKQogewotICAg
IGlmICghbV9zbWFsbFBhZ2VzV2l0aEZyZWVMaW5lc1tzaXplQ2xhc3NdLmlzRW1wdHkoKSkKLSAg
ICAgICAgcmV0dXJuIG1fc21hbGxQYWdlc1dpdGhGcmVlTGluZXNbc2l6ZUNsYXNzXS5wb3BGcm9u
dCgpOworICAgIGlmICghbV9mcmVlTGluZXNbc2l6ZUNsYXNzXS5pc0VtcHR5KCkpCisgICAgICAg
IHJldHVybiBtX2ZyZWVMaW5lc1tzaXplQ2xhc3NdLnBvcEZyb250KCk7CiAKICAgICBtX2lzR3Jv
d2luZyA9IHRydWU7CiAgICAgCiAgICAgU21hbGxQYWdlKiBwYWdlID0gWyZdKCkgewogICAgICAg
ICBzaXplX3QgcGFnZUNsYXNzID0gbV9wYWdlQ2xhc3Nlc1tzaXplQ2xhc3NdOwotICAgICAgICBp
ZiAoIW1fc21hbGxQYWdlc1twYWdlQ2xhc3NdLmlzRW1wdHkoKSkKLSAgICAgICAgICAgIHJldHVy
biBtX3NtYWxsUGFnZXNbcGFnZUNsYXNzXS5wb3AoKTsKLQotICAgICAgICBzY2hlZHVsZVNjYXZl
bmdlcklmVW5kZXJNZW1vcnlQcmVzc3VyZShwYWdlU2l6ZShwYWdlQ2xhc3MpKTsKICAgICAgICAg
Ci0gICAgICAgIFNtYWxsUGFnZSogcGFnZSA9IG1fdm1IZWFwLmFsbG9jYXRlU21hbGxQYWdlKGxv
Y2ssIHBhZ2VDbGFzcyk7Ci0gICAgICAgIG1fb2JqZWN0VHlwZXMuc2V0KENodW5rOjpnZXQocGFn
ZSksIE9iamVjdFR5cGU6OlNtYWxsKTsKKyAgICAgICAgaWYgKG1fZnJlZVBhZ2VzW3BhZ2VDbGFz
c10uaXNFbXB0eSgpKQorICAgICAgICAgICAgYWxsb2NhdGVTbWFsbENodW5rKGxvY2ssIHBhZ2VD
bGFzcyk7CisKKyAgICAgICAgQ2h1bmsqIGNodW5rID0gbV9mcmVlUGFnZXNbcGFnZUNsYXNzXS50
YWlsKCk7CisKKyAgICAgICAgY2h1bmstPnJlZigpOworCisgICAgICAgIFNtYWxsUGFnZSogcGFn
ZSA9IGNodW5rLT5mcmVlUGFnZXMoKS5wb3AoKTsKKyAgICAgICAgaWYgKGNodW5rLT5mcmVlUGFn
ZXMoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICBtX2ZyZWVQYWdlc1twYWdlQ2xhc3NdLnJlbW92
ZShjaHVuayk7CisKKyAgICAgICAgaWYgKCFwYWdlLT5oYXNQaHlzaWNhbFBhZ2VzKCkpIHsKKyAg
ICAgICAgICAgIHNjaGVkdWxlU2NhdmVuZ2VySWZVbmRlck1lbW9yeVByZXNzdXJlKHBhZ2VTaXpl
KHBhZ2VDbGFzcykpOworCisgICAgICAgICAgICB2bUFsbG9jYXRlUGh5c2ljYWxQYWdlc1Nsb3Bw
eShwYWdlLT5iZWdpbigpLT5iZWdpbigpLCBwYWdlU2l6ZShwYWdlQ2xhc3MpKTsKKyAgICAgICAg
ICAgIHBhZ2UtPnNldEhhc1BoeXNpY2FsUGFnZXModHJ1ZSk7CisgICAgICAgIH0KKwogICAgICAg
ICByZXR1cm4gcGFnZTsKICAgICB9KCk7CiAKQEAgLTI1OCw3ICszMDgsNyBAQCB2b2lkIEhlYXA6
OmRlYWxsb2NhdGVTbWFsbExpbmUoc3RkOjpsb2NrCiAKICAgICBpZiAoIXBhZ2UtPmhhc0ZyZWVM
aW5lcyhsb2NrKSkgewogICAgICAgICBwYWdlLT5zZXRIYXNGcmVlTGluZXMobG9jaywgdHJ1ZSk7
Ci0gICAgICAgIG1fc21hbGxQYWdlc1dpdGhGcmVlTGluZXNbcGFnZS0+c2l6ZUNsYXNzKCldLnB1
c2gocGFnZSk7CisgICAgICAgIG1fZnJlZUxpbmVzW3BhZ2UtPnNpemVDbGFzcygpXS5wdXNoKHBh
Z2UpOwogICAgIH0KIAogICAgIGlmIChwYWdlLT5yZWZDb3VudChsb2NrKSkKQEAgLTI2Nyw4ICsz
MTcsMjMgQEAgdm9pZCBIZWFwOjpkZWFsbG9jYXRlU21hbGxMaW5lKHN0ZDo6bG9jawogICAgIHNp
emVfdCBzaXplQ2xhc3MgPSBwYWdlLT5zaXplQ2xhc3MoKTsKICAgICBzaXplX3QgcGFnZUNsYXNz
ID0gbV9wYWdlQ2xhc3Nlc1tzaXplQ2xhc3NdOwogCi0gICAgbV9zbWFsbFBhZ2VzV2l0aEZyZWVM
aW5lc1tzaXplQ2xhc3NdLnJlbW92ZShwYWdlKTsKLSAgICBtX3NtYWxsUGFnZXNbcGFnZUNsYXNz
XS5wdXNoKHBhZ2UpOworICAgIG1fZnJlZUxpbmVzW3NpemVDbGFzc10ucmVtb3ZlKHBhZ2UpOwor
ICAgIAorICAgIENodW5rKiBjaHVuayA9IENodW5rOjpnZXQocGFnZSk7CisgICAgaWYgKGNodW5r
LT5mcmVlUGFnZXMoKS5pc0VtcHR5KCkpCisgICAgICAgIG1fZnJlZVBhZ2VzW3BhZ2VDbGFzc10u
cHVzaChjaHVuayk7CisgICAgY2h1bmstPmZyZWVQYWdlcygpLnB1c2gocGFnZSk7CisKKyAgICBj
aHVuay0+ZGVyZWYoKTsKKworICAgIGlmICghY2h1bmstPnJlZkNvdW50KCkpIHsKKyAgICAgICAg
bV9mcmVlUGFnZXNbcGFnZUNsYXNzXS5yZW1vdmUoY2h1bmspOworCisgICAgICAgIGlmICghbV9j
aHVua0NhY2hlW3BhZ2VDbGFzc10uaXNFbXB0eSgpKQorICAgICAgICAgICAgZGVhbGxvY2F0ZVNt
YWxsQ2h1bmsobV9jaHVua0NhY2hlW3BhZ2VDbGFzc10ucG9wKCksIHBhZ2VDbGFzcyk7CisKKyAg
ICAgICAgbV9jaHVua0NhY2hlW3BhZ2VDbGFzc10ucHVzaChjaHVuayk7CisgICAgfQogICAgIAog
ICAgIHNjaGVkdWxlU2NhdmVuZ2VyKHBhZ2VTaXplKHBhZ2VDbGFzcykpOwogfQpAQCAtMzIxLDcg
KzM4Niw3IEBAIHZvaWQgSGVhcDo6YWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU1ldGEKIAogICAg
ICAgICAvLyBJbiBhIGZyYWdtZW50ZWQgcGFnZSwgc29tZSBmcmVlIHJhbmdlcyBtaWdodCBub3Qg
Zml0IGluIHRoZSBjYWNoZS4KICAgICAgICAgaWYgKHJhbmdlQ2FjaGUuc2l6ZSgpID09IHJhbmdl
Q2FjaGUuY2FwYWNpdHkoKSkgewotICAgICAgICAgICAgbV9zbWFsbFBhZ2VzV2l0aEZyZWVMaW5l
c1tzaXplQ2xhc3NdLnB1c2gocGFnZSk7CisgICAgICAgICAgICBtX2ZyZWVMaW5lc1tzaXplQ2xh
c3NdLnB1c2gocGFnZSk7CiAgICAgICAgICAgICBCQVNTRVJUKGFsbG9jYXRvci5jYW5BbGxvY2F0
ZSgpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMzc1LDcgKzQ0MCw3IEBA
IHZvaWQgSGVhcDo6YWxsb2NhdGVTbWFsbEJ1bXBSYW5nZXNCeU9iamUKIAogICAgICAgICAvLyBJ
biBhIGZyYWdtZW50ZWQgcGFnZSwgc29tZSBmcmVlIHJhbmdlcyBtaWdodCBub3QgZml0IGluIHRo
ZSBjYWNoZS4KICAgICAgICAgaWYgKHJhbmdlQ2FjaGUuc2l6ZSgpID09IHJhbmdlQ2FjaGUuY2Fw
YWNpdHkoKSkgewotICAgICAgICAgICAgbV9zbWFsbFBhZ2VzV2l0aEZyZWVMaW5lc1tzaXplQ2xh
c3NdLnB1c2gocGFnZSk7CisgICAgICAgICAgICBtX2ZyZWVMaW5lc1tzaXplQ2xhc3NdLnB1c2go
cGFnZSk7CiAgICAgICAgICAgICBCQVNTRVJUKGFsbG9jYXRvci5jYW5BbGxvY2F0ZSgpKTsKICAg
ICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtNDI2LDcgKzQ5MSw3IEBAIExhcmdlUmFu
Z2UgSGVhcDo6c3BsaXRBbmRBbGxvY2F0ZShMYXJnZVIKICAgICByZXR1cm4gcmFuZ2U7CiB9CiAK
LXZvaWQqIEhlYXA6OnRyeUFsbG9jYXRlTGFyZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4
PiYgbG9jaywgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNpemUpCit2b2lkKiBIZWFwOjp0cnlB
bGxvY2F0ZUxhcmdlKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBzaXplX3QgYWxpZ25t
ZW50LCBzaXplX3Qgc2l6ZSkKIHsKICAgICBCQVNTRVJUKGlzUG93ZXJPZlR3byhhbGlnbm1lbnQp
KTsKIApAQCAtNDQ0LDExICs1MDksMTIgQEAgdm9pZCogSGVhcDo6dHJ5QWxsb2NhdGVMYXJnZShz
dGQ6OmxvY2tfZwogCiAgICAgTGFyZ2VSYW5nZSByYW5nZSA9IG1fbGFyZ2VGcmVlLnJlbW92ZShh
bGlnbm1lbnQsIHNpemUpOwogICAgIGlmICghcmFuZ2UpIHsKLSAgICAgICAgcmFuZ2UgPSBtX3Zt
SGVhcC50cnlBbGxvY2F0ZUxhcmdlQ2h1bmsobG9jaywgYWxpZ25tZW50LCBzaXplKTsKKyAgICAg
ICAgcmFuZ2UgPSBtX3ZtSGVhcC50cnlBbGxvY2F0ZUxhcmdlQ2h1bmsoYWxpZ25tZW50LCBzaXpl
KTsKICAgICAgICAgaWYgKCFyYW5nZSkKICAgICAgICAgICAgIHJldHVybiBudWxscHRyOwogCiAg
ICAgICAgIG1fbGFyZ2VGcmVlLmFkZChyYW5nZSk7CisKICAgICAgICAgcmFuZ2UgPSBtX2xhcmdl
RnJlZS5yZW1vdmUoYWxpZ25tZW50LCBzaXplKTsKICAgICB9CiAKSW5kZXg6IFNvdXJjZS9ibWFs
bG9jL2JtYWxsb2MvSGVhcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2Mv
SGVhcC5oCShyZXZpc2lvbiAyMTc1ODEpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL0hlYXAu
aAkod29ya2luZyBjb3B5KQpAQCAtNzAsNyArNzAsNyBAQCBwdWJsaWM6CiAgICAgc2l6ZV90IGxh
cmdlU2l6ZShzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+Jiwgdm9pZCopOwogICAgIHZvaWQg
c2hyaW5rTGFyZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYsIGNvbnN0IFJhbmdlJiwg
c2l6ZV90KTsKIAotICAgIHZvaWQgc2NhdmVuZ2Uoc3RkOjp1bmlxdWVfbG9jazxTdGF0aWNNdXRl
eD4mKTsKKyAgICB2b2lkIHNjYXZlbmdlKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mKTsK
IAogICAgIHNpemVfdCBtZW1vcnlGb290cHJpbnQoKTsKICAgICBkb3VibGUgcGVyY2VudEF2YWls
YWJsZU1lbW9yeUluVXNlKCk7CkBAIC0xMDAsOSArMTAwLDExIEBAIHByaXZhdGU6CiAgICAgICAg
IHNpemVfdCBzaXplQ2xhc3MsIEJ1bXBBbGxvY2F0b3ImLCBCdW1wUmFuZ2VDYWNoZSYpOwogCiAg
ICAgU21hbGxQYWdlKiBhbGxvY2F0ZVNtYWxsUGFnZShzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0
ZXg+Jiwgc2l6ZV90IHNpemVDbGFzcyk7Ci0KICAgICB2b2lkIGRlYWxsb2NhdGVTbWFsbExpbmUo
c3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYsIE9iamVjdCk7CiAKKyAgICB2b2lkIGFsbG9j
YXRlU21hbGxDaHVuayhzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+Jiwgc2l6ZV90IHBhZ2VD
bGFzcyk7CisgICAgdm9pZCBkZWFsbG9jYXRlU21hbGxDaHVuayhDaHVuayosIHNpemVfdCBwYWdl
Q2xhc3MpOworCiAgICAgdm9pZCBtZXJnZUxhcmdlKEJlZ2luVGFnKiYsIEVuZFRhZyomLCBSYW5n
ZSYpOwogICAgIHZvaWQgbWVyZ2VMYXJnZUxlZnQoRW5kVGFnKiYsIEJlZ2luVGFnKiYsIFJhbmdl
JiwgYm9vbCYgaW5WTUhlYXApOwogICAgIHZvaWQgbWVyZ2VMYXJnZVJpZ2h0KEVuZFRhZyomLCBC
ZWdpblRhZyomLCBSYW5nZSYsIGJvb2wmIGluVk1IZWFwKTsKQEAgLTExMyw4ICsxMTUsNiBAQCBw
cml2YXRlOgogICAgIHZvaWQgc2NoZWR1bGVTY2F2ZW5nZXJJZlVuZGVyTWVtb3J5UHJlc3N1cmUo
c2l6ZV90KTsKICAgICAKICAgICB2b2lkIGNvbmN1cnJlbnRTY2F2ZW5nZSgpOwotICAgIHZvaWQg
c2NhdmVuZ2VTbWFsbFBhZ2VzKHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0ZXg+Jik7Ci0gICAg
dm9pZCBzY2F2ZW5nZUxhcmdlT2JqZWN0cyhzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYp
OwogICAgIAogI2lmIEJQTEFURk9STShJT1MpCiAgICAgdm9pZCB1cGRhdGVNZW1vcnlJblVzZVBh
cmFtZXRlcnMoKTsKQEAgLTEyNCw4ICsxMjQsOSBAQCBwcml2YXRlOgogICAgIFZlY3RvcjxMaW5l
TWV0YWRhdGE+IG1fc21hbGxMaW5lTWV0YWRhdGE7CiAgICAgc3RkOjphcnJheTxzaXplX3QsIHNp
emVDbGFzc0NvdW50PiBtX3BhZ2VDbGFzc2VzOwogCi0gICAgc3RkOjphcnJheTxMaXN0PFNtYWxs
UGFnZT4sIHNpemVDbGFzc0NvdW50PiBtX3NtYWxsUGFnZXNXaXRoRnJlZUxpbmVzOwotICAgIHN0
ZDo6YXJyYXk8TGlzdDxTbWFsbFBhZ2U+LCBwYWdlQ2xhc3NDb3VudD4gbV9zbWFsbFBhZ2VzOwor
ICAgIHN0ZDo6YXJyYXk8TGlzdDxTbWFsbFBhZ2U+LCBzaXplQ2xhc3NDb3VudD4gbV9mcmVlTGlu
ZXM7CisgICAgc3RkOjphcnJheTxMaXN0PENodW5rPiwgcGFnZUNsYXNzQ291bnQ+IG1fZnJlZVBh
Z2VzOworICAgIHN0ZDo6YXJyYXk8TGlzdDxDaHVuaz4sIHBhZ2VDbGFzc0NvdW50PiBtX2NodW5r
Q2FjaGU7CiAKICAgICBNYXA8dm9pZCosIHNpemVfdCwgTGFyZ2VPYmplY3RIYXNoPiBtX2xhcmdl
QWxsb2NhdGVkOwogICAgIExhcmdlTWFwIG1fbGFyZ2VGcmVlOwpJbmRleDogU291cmNlL2JtYWxs
b2MvYm1hbGxvYy9MYXJnZU1hcC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxs
b2MvTGFyZ2VNYXAuaAkocmV2aXNpb24gMjE3NTgxKQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxv
Yy9MYXJnZU1hcC5oCSh3b3JraW5nIGNvcHkpCkBAIC0zNCw2ICszNCw5IEBAIG5hbWVzcGFjZSBi
bWFsbG9jIHsKIAogY2xhc3MgTGFyZ2VNYXAgewogcHVibGljOgorICAgIExhcmdlUmFuZ2UqIGJl
Z2luKCkgeyByZXR1cm4gbV9mcmVlLmJlZ2luKCk7IH0KKyAgICBMYXJnZVJhbmdlKiBlbmQoKSB7
IHJldHVybiBtX2ZyZWUuZW5kKCk7IH0KKwogICAgIHZvaWQgYWRkKGNvbnN0IExhcmdlUmFuZ2Um
KTsKICAgICBMYXJnZVJhbmdlIHJlbW92ZShzaXplX3QgYWxpZ25tZW50LCBzaXplX3QpOwogICAg
IFZlY3RvcjxMYXJnZVJhbmdlPiYgcmFuZ2VzKCkgeyByZXR1cm4gbV9mcmVlOyB9CkluZGV4OiBT
b3VyY2UvYm1hbGxvYy9ibWFsbG9jL0xhcmdlUmFuZ2UuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2Uv
Ym1hbGxvYy9ibWFsbG9jL0xhcmdlUmFuZ2UuaAkocmV2aXNpb24gMjE3NTgxKQorKysgU291cmNl
L2JtYWxsb2MvYm1hbGxvYy9MYXJnZVJhbmdlLmgJKHdvcmtpbmcgY29weSkKQEAgLTUxLDcgKzUx
LDcgQEAgcHVibGljOgogICAgIHsKICAgICB9CiAKLSAgICBzaXplX3QgcGh5c2ljYWxTaXplKCkg
Y29uc3QgeyByZXR1cm4gbV9waHlzaWNhbFNpemU7IH0KKyAgICBzaXplX3QgcGh5c2ljYWxTaXpl
KCkgY29uc3QgeyByZXR1cm4gbV9waHlzaWNhbFNpemU7IH0gLy8gVHJ1ZSBwaHlzaWNhbCBzaXpl
IGNhbiBiZSBsYXJnZXIuCiAgICAgdm9pZCBzZXRQaHlzaWNhbFNpemUoc2l6ZV90IHBoeXNpY2Fs
U2l6ZSkgeyBtX3BoeXNpY2FsU2l6ZSA9IHBoeXNpY2FsU2l6ZTsgfQogCiAgICAgc3RkOjpwYWly
PExhcmdlUmFuZ2UsIExhcmdlUmFuZ2U+IHNwbGl0KHNpemVfdCkgY29uc3Q7CkluZGV4OiBTb3Vy
Y2UvYm1hbGxvYy9ibWFsbG9jL0xpc3QuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9i
bWFsbG9jL0xpc3QuaAkocmV2aXNpb24gMjE3NTgxKQorKysgU291cmNlL2JtYWxsb2MvYm1hbGxv
Yy9MaXN0LmgJKHdvcmtpbmcgY29weSkKQEAgLTMwLDI0ICszMCwzNyBAQCBuYW1lc3BhY2UgYm1h
bGxvYyB7CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBzdHJ1Y3QgTGlzdE5vZGUgewotICAgIExp
c3ROb2RlKCkKLSAgICAgICAgOiBwcmV2KHRoaXMpCi0gICAgICAgICwgbmV4dCh0aGlzKQotICAg
IHsKLSAgICB9Ci0KLSAgICBMaXN0Tm9kZTxUPiogcHJldjsKLSAgICBMaXN0Tm9kZTxUPiogbmV4
dDsKKyAgICBMaXN0Tm9kZTxUPiogcHJldiB7IG51bGxwdHIgfTsKKyAgICBMaXN0Tm9kZTxUPiog
bmV4dCB7IG51bGxwdHIgfTsKIH07CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBjbGFzcyBMaXN0
IHsKICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2Rlc3RydWN0aWJsZTxUPjo6
dmFsdWUsICJMaXN0IG11c3QgaGF2ZSBhIHRyaXZpYWwgZGVzdHJ1Y3Rvci4iKTsKKworICAgIHN0
cnVjdCBpdGVyYXRvciB7CisgICAgICAgIFQgb3BlcmF0b3IqKCkgeyByZXR1cm4gKnN0YXRpY19j
YXN0PFQqPihtX25vZGUpOyB9CisgICAgICAgIFQqIG9wZXJhdG9yLT4oKSB7IHJldHVybiBzdGF0
aWNfY2FzdDxUKj4obV9ub2RlKTsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBp
dGVyYXRvciYgb3RoZXIpIHsgcmV0dXJuIG1fbm9kZSAhPSBvdGhlci5tX25vZGU7IH0KKworICAg
ICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1fbm9k
ZSA9IG1fbm9kZS0+bmV4dDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQor
ICAgICAgICAKKyAgICAgICAgTGlzdE5vZGU8VD4qIG1fbm9kZTsKKyAgICB9OworCiBwdWJsaWM6
CiAgICAgYm9vbCBpc0VtcHR5KCkgeyByZXR1cm4gbV9yb290Lm5leHQgPT0gJm1fcm9vdDsgfQog
CiAgICAgVCogaGVhZCgpIHsgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihtX3Jvb3QubmV4dCk7IH0K
ICAgICBUKiB0YWlsKCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KG1fcm9vdC5wcmV2KTsgfQor
ICAgIAorICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IgeyBtX3Jvb3QubmV4
dCB9OyB9CisgICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IgeyAmbV9yb290IH07
IH0KIAogICAgIHZvaWQgcHVzaChUKiBub2RlKQogICAgIHsKQEAgLTU1LDYgKzY4LDEyIEBAIHB1
YmxpYzoKICAgICAgICAgaW5zZXJ0QWZ0ZXIoaXQsIG5vZGUpOwogICAgIH0KIAorICAgIHZvaWQg
cHVzaEZyb250KFQqIG5vZGUpCisgICAgeworICAgICAgICBMaXN0Tm9kZTxUPiogaXQgPSAmbV9y
b290OworICAgICAgICBpbnNlcnRBZnRlcihpdCwgbm9kZSk7CisgICAgfQorCiAgICAgVCogcG9w
KCkKICAgICB7CiAgICAgICAgIExpc3ROb2RlPFQ+KiByZXN1bHQgPSB0YWlsKCk7CkBAIC04OSwx
MiArMTA4LDEyIEBAIHB1YmxpYzoKICAgICAgICAgbmV4dC0+cHJldiA9IHByZXY7CiAgICAgICAg
IHByZXYtPm5leHQgPSBuZXh0OwogICAgICAgICAKLSAgICAgICAgbm9kZS0+cHJldiA9IG5vZGU7
Ci0gICAgICAgIG5vZGUtPm5leHQgPSBub2RlOworICAgICAgICBub2RlLT5wcmV2ID0gbnVsbHB0
cjsKKyAgICAgICAgbm9kZS0+bmV4dCA9IG51bGxwdHI7CiAgICAgfQogCiBwcml2YXRlOgotICAg
IExpc3ROb2RlPFQ+IG1fcm9vdDsKKyAgICBMaXN0Tm9kZTxUPiBtX3Jvb3QgeyAmbV9yb290LCAm
bV9yb290IH07CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBibWFsbG9jCkluZGV4OiBTb3VyY2UvYm1h
bGxvYy9ibWFsbG9jL1NpemVzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxv
Yy9TaXplcy5oCShyZXZpc2lvbiAyMTc1ODEpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL1Np
emVzLmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDcgKzQ2LDcgQEAgbmFtZXNwYWNlIFNpemVzIHsK
ICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsaWdubWVudCA9IDg7CiAgICAgc3RhdGljIGNvbnN0
IHNpemVfdCBhbGlnbm1lbnRNYXNrID0gYWxpZ25tZW50IC0gMXVsOwogCi0gICAgc3RhdGljIGNv
bnN0IHNpemVfdCBjaHVua1NpemUgPSAyICogTUI7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBj
aHVua1NpemUgPSAxICogTUI7CiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBjaHVua01hc2sgPSB+
KGNodW5rU2l6ZSAtIDF1bCk7CiAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IHNtYWxsTGluZVNp
emUgPSAyNTY7CkluZGV4OiBTb3VyY2UvYm1hbGxvYy9ibWFsbG9jL1NtYWxsUGFnZS5oCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvU21hbGxQYWdlLmgJKHJldmlzaW9uIDIx
NzU4MSkKKysrIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvU21hbGxQYWdlLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTM2LDExICszNiw2IEBAIG5hbWVzcGFjZSBibWFsbG9jIHsKIAogY2xhc3MgU21hbGxQ
YWdlIDogcHVibGljIExpc3ROb2RlPFNtYWxsUGFnZT4gewogcHVibGljOgotICAgIFNtYWxsUGFn
ZSgpCi0gICAgICAgIDogbV9oYXNGcmVlTGluZXModHJ1ZSkKLSAgICB7Ci0gICAgfQotCiAgICAg
dm9pZCByZWYoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYpOwogICAgIGJvb2wgZGVyZWYo
c3RkOjpsb2NrX2d1YXJkPFN0YXRpY011dGV4PiYpOwogICAgIHVuc2lnbmVkIHJlZkNvdW50KHN0
ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mKSB7IHJldHVybiBtX3JlZkNvdW50OyB9CkBAIC01
MSw2ICs0Niw5IEBAIHB1YmxpYzoKICAgICBib29sIGhhc0ZyZWVMaW5lcyhzdGQ6OmxvY2tfZ3Vh
cmQ8U3RhdGljTXV0ZXg+JikgY29uc3QgeyByZXR1cm4gbV9oYXNGcmVlTGluZXM7IH0KICAgICB2
b2lkIHNldEhhc0ZyZWVMaW5lcyhzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiwgYm9vbCBo
YXNGcmVlTGluZXMpIHsgbV9oYXNGcmVlTGluZXMgPSBoYXNGcmVlTGluZXM7IH0KICAgICAKKyAg
ICBib29sIGhhc1BoeXNpY2FsUGFnZXMoKSB7IHJldHVybiBtX2hhc1BoeXNpY2FsUGFnZXM7IH0K
KyAgICB2b2lkIHNldEhhc1BoeXNpY2FsUGFnZXMoYm9vbCBoYXNQaHlzaWNhbFBhZ2VzKSB7IG1f
aGFzUGh5c2ljYWxQYWdlcyA9IGhhc1BoeXNpY2FsUGFnZXM7IH0KKyAgICAKICAgICBTbWFsbExp
bmUqIGJlZ2luKCk7CiAKICAgICB1bnNpZ25lZCBjaGFyIHNsaWRlKCkgY29uc3QgeyByZXR1cm4g
bV9zbGlkZTsgfQpAQCAtNTgsNiArNTYsNyBAQCBwdWJsaWM6CiAgICAgCiBwcml2YXRlOgogICAg
IHVuc2lnbmVkIGNoYXIgbV9oYXNGcmVlTGluZXM6IDE7CisgICAgdW5zaWduZWQgY2hhciBtX2hh
c1BoeXNpY2FsUGFnZXM6IDE7CiAgICAgdW5zaWduZWQgY2hhciBtX3JlZkNvdW50OiA3OwogICAg
IHVuc2lnbmVkIGNoYXIgbV9zaXplQ2xhc3M7CiAgICAgdW5zaWduZWQgY2hhciBtX3NsaWRlOwpJ
bmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9WTUhlYXAuY3BwCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9ibWFsbG9jL2JtYWxsb2MvVk1IZWFwLmNwcAkocmV2aXNpb24gMjE3NTgxKQorKysgU291
cmNlL2JtYWxsb2MvYm1hbGxvYy9WTUhlYXAuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw3ICsy
OSw3IEBACiAKIG5hbWVzcGFjZSBibWFsbG9jIHsKIAotTGFyZ2VSYW5nZSBWTUhlYXA6OnRyeUFs
bG9jYXRlTGFyZ2VDaHVuayhzdGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+Jiwgc2l6ZV90IGFs
aWdubWVudCwgc2l6ZV90IHNpemUpCitMYXJnZVJhbmdlIFZNSGVhcDo6dHJ5QWxsb2NhdGVMYXJn
ZUNodW5rKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplKQogewogICAgIC8vIFdlIGFsbG9j
YXRlIFZNIGluIGFsaWduZWQgbXVsdGlwbGVzIHRvIGluY3JlYXNlIHRoZSBjaGFuY2VzIHRoYXQK
ICAgICAvLyB0aGUgT1Mgd2lsbCBwcm92aWRlIGNvbnRpZ3VvdXMgcmFuZ2VzIHRoYXQgd2UgY2Fu
IG1lcmdlLgpAQCAtNTYsNDYgKzU2LDQgQEAgTGFyZ2VSYW5nZSBWTUhlYXA6OnRyeUFsbG9jYXRl
TGFyZ2VDaHVuawogICAgIHJldHVybiBMYXJnZVJhbmdlKGNodW5rLT5ieXRlcygpLCBzaXplLCAw
KTsKIH0KIAotdm9pZCBWTUhlYXA6OmFsbG9jYXRlU21hbGxDaHVuayhzdGQ6OmxvY2tfZ3VhcmQ8
U3RhdGljTXV0ZXg+JiBsb2NrLCBzaXplX3QgcGFnZUNsYXNzKQotewotICAgIHNpemVfdCBwYWdl
U2l6ZSA9IGJtYWxsb2M6OnBhZ2VTaXplKHBhZ2VDbGFzcyk7Ci0gICAgc2l6ZV90IHNtYWxsUGFn
ZUNvdW50ID0gcGFnZVNpemUgLyBzbWFsbFBhZ2VTaXplOwotCi0gICAgdm9pZCogbWVtb3J5ID0g
dm1BbGxvY2F0ZShjaHVua1NpemUsIGNodW5rU2l6ZSk7Ci0gICAgQ2h1bmsqIGNodW5rID0gc3Rh
dGljX2Nhc3Q8Q2h1bmsqPihtZW1vcnkpOwotCi0gICAgLy8gV2UgYWxpZ24gdG8gb3VyIHBhZ2Ug
c2l6ZSBpbiBvcmRlciB0byBob25vciBPUyBBUElzIGFuZCBpbiBvcmRlciB0bwotICAgIC8vIGd1
YXJhbnRlZSB0aGF0IHdlIGNhbiBzZXJ2aWNlIGFsaWduZWQgYWxsb2NhdGlvbiByZXF1ZXN0cyBh
dCBlcXVhbAotICAgIC8vIGFuZCBzbWFsbGVyIHBvd2VycyBvZiB0d28uCi0gICAgc2l6ZV90IHZt
UGFnZVNpemUgPSByb3VuZFVwVG9NdWx0aXBsZU9mKGJtYWxsb2M6OnZtUGFnZVNpemUoKSwgcGFn
ZVNpemUpOwotICAgIHNpemVfdCBtZXRhZGF0YVNpemUgPSByb3VuZFVwVG9NdWx0aXBsZU9mTm9u
UG93ZXJPZlR3byh2bVBhZ2VTaXplLCBzaXplb2YoQ2h1bmspKTsKLQotICAgIE9iamVjdCBiZWdp
bihjaHVuaywgbWV0YWRhdGFTaXplKTsKLSAgICBPYmplY3QgZW5kKGNodW5rLCBjaHVua1NpemUp
OwotCi0gICAgLy8gRXN0YWJsaXNoIGd1YXJkIHBhZ2VzIGJlZm9yZSB3cml0aW5nIHRvIENodW5r
IG1lbW9yeSB0byB3b3JrIGFyb3VuZAotICAgIC8vIGFuIGVkZ2UgY2FzZSBpbiB0aGUgRGFyd2lu
IFZNIHN5c3RlbSAoPHJkYXI6Ly9wcm9ibGVtLzI1OTEwMDk4PikuCi0gICAgdm1SZXZva2VQZXJt
aXNzaW9ucyhiZWdpbi5hZGRyZXNzKCksIHZtUGFnZVNpemUpOwotICAgIHZtUmV2b2tlUGVybWlz
c2lvbnMoZW5kLmFkZHJlc3MoKSAtIHZtUGFnZVNpemUsIHZtUGFnZVNpemUpOwotICAgIAotICAg
IGJlZ2luID0gYmVnaW4gKyB2bVBhZ2VTaXplOwotICAgIGVuZCA9IGVuZCAtIHZtUGFnZVNpemU7
Ci0gICAgQkFTU0VSVChiZWdpbiA8PSBlbmQgJiYgZW5kLm9mZnNldCgpIC0gYmVnaW4ub2Zmc2V0
KCkgPj0gcGFnZVNpemUpOwotCi0gICAgbmV3IChjaHVuaykgQ2h1bmsobG9jayk7Ci0KLSNpZiBC
T1MoREFSV0lOKQotICAgIG1fem9uZS5hZGRSYW5nZShSYW5nZShiZWdpbi5hZGRyZXNzKCksIGVu
ZC5hZGRyZXNzKCkgLSBiZWdpbi5hZGRyZXNzKCkpKTsKLSNlbmRpZgotCi0gICAgZm9yIChPYmpl
Y3QgaXQgPSBiZWdpbjsgaXQgKyBwYWdlU2l6ZSA8PSBlbmQ7IGl0ID0gaXQgKyBwYWdlU2l6ZSkg
ewotICAgICAgICBTbWFsbFBhZ2UqIHBhZ2UgPSBpdC5wYWdlKCk7Ci0KLSAgICAgICAgZm9yIChz
aXplX3QgaSA9IDA7IGkgPCBzbWFsbFBhZ2VDb3VudDsgKytpKQotICAgICAgICAgICAgcGFnZVtp
XS5zZXRTbGlkZShpKTsKLQotICAgICAgICBtX3NtYWxsUGFnZXNbcGFnZUNsYXNzXS5wdXNoKHBh
Z2UpOwotICAgIH0KLX0KLQogfSAvLyBuYW1lc3BhY2UgYm1hbGxvYwpJbmRleDogU291cmNlL2Jt
YWxsb2MvYm1hbGxvYy9WTUhlYXAuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvYm1hbGxvYy9ibWFs
bG9jL1ZNSGVhcC5oCShyZXZpc2lvbiAyMTc1ODEpCisrKyBTb3VyY2UvYm1hbGxvYy9ibWFsbG9j
L1ZNSGVhcC5oCSh3b3JraW5nIGNvcHkpCkBAIC00NSw0MCArNDUsMTQgQEAgdHlwZWRlZiBlbnVt
IHsgU3luYywgQXN5bmMgfSBTY2F2ZW5nZU1vZAogCiBjbGFzcyBWTUhlYXAgewogcHVibGljOgot
ICAgIFNtYWxsUGFnZSogYWxsb2NhdGVTbWFsbFBhZ2Uoc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011
dGV4PiYsIHNpemVfdCk7Ci0gICAgdm9pZCBkZWFsbG9jYXRlU21hbGxQYWdlKHN0ZDo6dW5pcXVl
X2xvY2s8U3RhdGljTXV0ZXg+Jiwgc2l6ZV90LCBTbWFsbFBhZ2UqKTsKLQotICAgIExhcmdlUmFu
Z2UgdHJ5QWxsb2NhdGVMYXJnZUNodW5rKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBz
aXplX3QgYWxpZ25tZW50LCBzaXplX3QpOworICAgIExhcmdlUmFuZ2UgdHJ5QWxsb2NhdGVMYXJn
ZUNodW5rKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCk7CiAgICAgCiBwcml2YXRlOgotICAgIHZv
aWQgYWxsb2NhdGVTbWFsbENodW5rKHN0ZDo6bG9ja19ndWFyZDxTdGF0aWNNdXRleD4mLCBzaXpl
X3QpOwotCi0gICAgc3RkOjphcnJheTxMaXN0PFNtYWxsUGFnZT4sIHBhZ2VDbGFzc0NvdW50PiBt
X3NtYWxsUGFnZXM7Ci0gICAgCiAjaWYgQk9TKERBUldJTikKICAgICBab25lIG1fem9uZTsKICNl
bmRpZgogfTsKIAotaW5saW5lIFNtYWxsUGFnZSogVk1IZWFwOjphbGxvY2F0ZVNtYWxsUGFnZShz
dGQ6OmxvY2tfZ3VhcmQ8U3RhdGljTXV0ZXg+JiBsb2NrLCBzaXplX3QgcGFnZUNsYXNzKQotewot
ICAgIGlmIChtX3NtYWxsUGFnZXNbcGFnZUNsYXNzXS5pc0VtcHR5KCkpCi0gICAgICAgIGFsbG9j
YXRlU21hbGxDaHVuayhsb2NrLCBwYWdlQ2xhc3MpOwotCi0gICAgU21hbGxQYWdlKiBwYWdlID0g
bV9zbWFsbFBhZ2VzW3BhZ2VDbGFzc10ucG9wKCk7Ci0gICAgdm1BbGxvY2F0ZVBoeXNpY2FsUGFn
ZXNTbG9wcHkocGFnZS0+YmVnaW4oKS0+YmVnaW4oKSwgcGFnZVNpemUocGFnZUNsYXNzKSk7Ci0g
ICAgcmV0dXJuIHBhZ2U7Ci19Ci0KLWlubGluZSB2b2lkIFZNSGVhcDo6ZGVhbGxvY2F0ZVNtYWxs
UGFnZShzdGQ6OnVuaXF1ZV9sb2NrPFN0YXRpY011dGV4PiYgbG9jaywgc2l6ZV90IHBhZ2VDbGFz
cywgU21hbGxQYWdlKiBwYWdlKQotewotICAgIGxvY2sudW5sb2NrKCk7Ci0gICAgdm1EZWFsbG9j
YXRlUGh5c2ljYWxQYWdlc1Nsb3BweShwYWdlLT5iZWdpbigpLT5iZWdpbigpLCBwYWdlU2l6ZShw
YWdlQ2xhc3MpKTsKLSAgICBsb2NrLmxvY2soKTsKLSAgICAKLSAgICBtX3NtYWxsUGFnZXNbcGFn
ZUNsYXNzXS5wdXNoKHBhZ2UpOwotfQotCiB9IC8vIG5hbWVzcGFjZSBibWFsbG9jCiAKICNlbmRp
ZiAvLyBWTUhlYXBfaApJbmRleDogU291cmNlL2JtYWxsb2MvYm1hbGxvYy9ibWFsbG9jLmgKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gU291cmNlL2JtYWxsb2MvYm1hbGxvYy9ibWFsbG9jLmgJKHJldmlzaW9uIDIx
NzU4MSkKKysrIFNvdXJjZS9ibWFsbG9jL2JtYWxsb2MvYm1hbGxvYy5oCSh3b3JraW5nIGNvcHkp
CkBAIC03Niw3ICs3Niw3IEBAIGlubGluZSB2b2lkIHNjYXZlbmdlKCkKIHsKICAgICBzY2F2ZW5n
ZVRoaXNUaHJlYWQoKTsKIAotICAgIHN0ZDo6dW5pcXVlX2xvY2s8U3RhdGljTXV0ZXg+IGxvY2so
UGVyUHJvY2VzczxIZWFwPjo6bXV0ZXgoKSk7CisgICAgc3RkOjpsb2NrX2d1YXJkPFN0YXRpY011
dGV4PiBsb2NrKFBlclByb2Nlc3M8SGVhcD46Om11dGV4KCkpOwogICAgIFBlclByb2Nlc3M8SGVh
cD46OmdldCgpLT5zY2F2ZW5nZShsb2NrKTsKIH0KIAo=
</data>
<flag name="review"
          id="332836"
          type_id="1"
          status="+"
          setter="sam"
    />
          </attachment>
      

    </bug>

</bugzilla>