<?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>64930</bug_id>
          
          <creation_ts>2011-07-21 03:21:56 -0700</creation_ts>
          <short_desc>[Chromium] Port harfbuzz code to new harfbuzz-ng API</short_desc>
          <delta_ts>2012-01-27 01:21:52 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>69826</dup_id>
          
          <bug_file_loc>http://crbug.com/68551</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="Kenichi Ishibashi">bashi</reporter>
          <assigned_to name="Kenichi Ishibashi">bashi</assigned_to>
          <cc>efidler</cc>
    
    <cc>evan</cc>
    
    <cc>jshin</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>440333</commentid>
    <comment_count>0</comment_count>
    <who name="Kenichi Ishibashi">bashi</who>
    <bug_when>2011-07-21 03:21:56 -0700</bug_when>
    <thetext>This is the WebKit bug entry for http://crbug.com/68551.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440341</commentid>
    <comment_count>1</comment_count>
      <attachid>101571</attachid>
    <who name="Kenichi Ishibashi">bashi</who>
    <bug_when>2011-07-21 04:10:10 -0700</bug_when>
    <thetext>Created attachment 101571
WIP Patch V0</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440343</commentid>
    <comment_count>2</comment_count>
    <who name="Kenichi Ishibashi">bashi</who>
    <bug_when>2011-07-21 04:11:41 -0700</bug_when>
    <thetext>(In reply to comment #1)
&gt; Created an attachment (id=101571) [details]
&gt; WIP Patch V0

Not intended for review, but comments and suggestions are highly appreciated.

Some notes for the WIP patch:
- Using harfbuzz-ng revision: f6fd3780e12b23ff7ed3743497c8996e71dcb064
- Need to update src/third_party/harfbuzz-ng to the above revision in chromium working copy to compile this patch.
- Indic/South East Asian(SEA) scripts are not rendered correctly because harfbuzz-ng doesn&apos;t support these script yet.
- I don&apos;t see performance regression on page cycler test intl1, but selectionRect() remarkably slow than the old harfbuzz. I took a profile and found BEInt::operator&lt;Type&gt;() in hb-open-type-private.hh takes a lot of time.

I&apos;d like to ask some advices:
- Would it be worth maintain both harfbuzz and harfbuzz-ng for a while, at least harfbuzz-ng can render Indic/SEA script correctly?
- If it&apos;s worth doing, how should we maintain them?  Adding a compile flag, or adding switching mechanism them depends on scripts to be shaped?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440502</commentid>
    <comment_count>3</comment_count>
    <who name="Jungshik Shin">jshin</who>
    <bug_when>2011-07-21 11:18:56 -0700</bug_when>
    <thetext>I&apos;m not sure how to proceed, but what&apos;s certain is that we can&apos;t switch to hb-ng until Indic and SE Asian scripts are supported by hb-ng.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440884</commentid>
    <comment_count>4</comment_count>
      <attachid>101707</attachid>
    <who name="Kenichi Ishibashi">bashi</who>
    <bug_when>2011-07-22 02:14:44 -0700</bug_when>
    <thetext>Created attachment 101707
WIP Patch V1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>440885</commentid>
    <comment_count>5</comment_count>
    <who name="Kenichi Ishibashi">bashi</who>
    <bug_when>2011-07-22 02:16:43 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt; Created an attachment (id=101707) [details]
&gt; WIP Patch V1

Add USE(HARFBUZZ_NG) macro to maintain both old harfbuzz and harfbuzz-ng. Still work in progress.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>543887</commentid>
    <comment_count>6</comment_count>
    <who name="Kenichi Ishibashi">bashi</who>
    <bug_when>2012-01-27 01:21:52 -0800</bug_when>
    <thetext>

*** This bug has been marked as a duplicate of bug 69826 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>101571</attachid>
            <date>2011-07-21 04:10:10 -0700</date>
            <delta_ts>2011-07-22 02:14:38 -0700</delta_ts>
            <desc>WIP Patch V0</desc>
            <filename>bug-64930-20110721201008.patch</filename>
            <type>text/plain</type>
            <size>54673</size>
            <attacher name="Kenichi Ishibashi">bashi</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTE0MTMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4LmNwcCBi
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29u
dHJvbGxlckxpbnV4LmNwcAppbmRleCBkZDBiMWFjODgxYWZjYjRmNDA1YjlmOTQ0MDdlNGVjNTVm
NTJjNjkwLi5jMzliMjViOTQ2ODNjNjljMGJlMTlkMGUxMDAzNmMzM2E3ODVhMGQ1IDEwMDY0NAot
LS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4
dENvbnRyb2xsZXJMaW51eC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguY3BwCkBAIC0xLDUgKzEsNSBA
QAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAxMCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCwxMCArMzQsNyBA
QAogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgogI2luY2x1ZGUgIkZvbnQuaCIKICNpbmNsdWRlICJU
ZXh0UnVuLmgiCi0KLWV4dGVybiAiQyIgewotI2luY2x1ZGUgImhhcmZidXp6LXVuaWNvZGUuaCIK
LX0KKyNpbmNsdWRlICJoYi5oIgogCiAjaW5jbHVkZSA8dW5pY29kZS9ub3JtbHpyLmg+CiAKQEAg
LTQ2LDM3ICs0MywxOSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAvLyBIYXJmYnV6eiB1c2VzIDI2
LjYgZml4ZWQgcG9pbnQgdmFsdWVzIGZvciBwaXhlbCBvZmZzZXRzLiBIb3dldmVyLCB3ZSBkb24n
dAogLy8gaGFuZGxlIHN1YnBpeGVsIHBvc2l0aW9uaW5nIHNvIHRoaXMgZnVuY3Rpb24gaXMgdXNl
ZCB0byB0cnVuY2F0ZSBIYXJmYnV6egogLy8gdmFsdWVzIHRvIGEgbnVtYmVyIG9mIHBpeGVscy4K
LXN0YXRpYyBpbnQgdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKEhCX0ZpeGVkIHZhbHVlKQor
c3RhdGljIGlubGluZSBkb3VibGUgdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKGhiX3Bvc2l0
aW9uX3QgdmFsdWUpCiB7Ci0gICAgcmV0dXJuIHZhbHVlID4+IDY7CisgICAgcmV0dXJuIChkb3Vi
bGUpdmFsdWUgLyA2NC4wOwogfQogCiBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0
Q29udHJvbGxlcihjb25zdCBUZXh0UnVuJiBydW4sIGludCBzdGFydGluZ1gsIGludCBzdGFydGlu
Z1ksIHVuc2lnbmVkIHdvcmRTcGFjaW5nLCB1bnNpZ25lZCBsZXR0ZXJTcGFjaW5nLCB1bnNpZ25l
ZCBwYWRkaW5nLCBjb25zdCBGb250KiBmb250KQogICAgIDogbV9mb250KGZvbnQpCisgICAgLCBt
X2luZGV4T2ZDdXJyZW50U2NyaXB0UnVuKDApCisgICAgLCBtX2luZGV4T2ZOZXh0U2NyaXB0UnVu
KDApCisgICAgLCBtX29mZnNldFgoc3RhcnRpbmdYKQorICAgICwgbV9zdGFydGluZ1koc3RhcnRp
bmdZKQogICAgICwgbV9ydW4oZ2V0Tm9ybWFsaXplZFRleHRSdW4ocnVuLCBtX25vcm1hbGl6ZWRS
dW4sIG1fbm9ybWFsaXplZEJ1ZmZlcikpCiB7Ci0gICAgLy8gRG8gbm90IHVzZSB8cnVufCBpbnNp
ZGUgdGhpcyBjb25zdHJ1Y3Rvci4gVXNlIHxtX3J1bnwgaW5zdGVhZC4KLQotICAgIG1lbXNldCgm
bV9pdGVtLCAwLCBzaXplb2YobV9pdGVtKSk7Ci0gICAgLy8gV2UgY2Fubm90IGtub3csIGFoZWFk
IG9mIHRpbWUsIGhvdyBtYW55IGdseXBocyBhIGdpdmVuIHNjcmlwdCBydW4KLSAgICAvLyB3aWxs
IHByb2R1Y2UuIFdlIHRha2UgYSBndWVzcyB0aGF0IHNjcmlwdCBydW5zIHdpbGwgbm90IHByb2R1
Y2UgbW9yZQotICAgIC8vIHRoYW4gdHdpY2UgYXMgbWFueSBnbHlwaHMgYXMgdGhlcmUgYXJlIGNv
ZGUgcG9pbnRzIHBsdXMgYSBiaXQgb2YKLSAgICAvLyBwYWRkaW5nIGFuZCBmYWxsYmFjayBpZiB3
ZSBmaW5kIHRoYXQgd2UgYXJlIHdyb25nLgotICAgIGNyZWF0ZUdseXBoQXJyYXlzKChtX3J1bi5s
ZW5ndGgoKSArIDIpICogMik7Ci0KLSAgICBtX2l0ZW0ubG9nX2NsdXN0ZXJzID0gbmV3IHVuc2ln
bmVkIHNob3J0W21fcnVuLmxlbmd0aCgpXTsKLQotICAgIG1faXRlbS5mYWNlID0gMDsKLSAgICBt
X2l0ZW0uZm9udCA9IGFsbG9jSGFyZmJ1enpGb250KCk7Ci0KLSAgICBtX2l0ZW0uaXRlbS5iaWRp
TGV2ZWwgPSBtX3J1bi5ydGwoKTsKLQotICAgIG1faXRlbS5zdHJpbmcgPSBtX3J1bi5jaGFyYWN0
ZXJzKCk7Ci0gICAgbV9pdGVtLnN0cmluZ0xlbmd0aCA9IG1fcnVuLmxlbmd0aCgpOwotCi0gICAg
cmVzZXQoc3RhcnRpbmdYKTsKLSAgICBtX3N0YXJ0aW5nWSA9IHN0YXJ0aW5nWTsKLQogICAgIHNl
dFdvcmRTcGFjaW5nQWRqdXN0bWVudCh3b3JkU3BhY2luZyk7CiAgICAgc2V0TGV0dGVyU3BhY2lu
Z0FkanVzdG1lbnQobGV0dGVyU3BhY2luZyk7CiAgICAgc2V0UGFkZGluZyhwYWRkaW5nKTsKQEAg
LTg0LDI0ICs2MywyNCBAQCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OkNvbXBsZXhUZXh0Q29udHJv
bGxlcihjb25zdCBUZXh0UnVuJiBydW4sIGludCBzdGFydGluZ1gsCiAKIENvbXBsZXhUZXh0Q29u
dHJvbGxlcjo6fkNvbXBsZXhUZXh0Q29udHJvbGxlcigpCiB7Ci0gICAgZmFzdEZyZWUobV9pdGVt
LmZvbnQpOwotICAgIGRlbGV0ZUdseXBoQXJyYXlzKCk7Ci0gICAgZGVsZXRlW10gbV9pdGVtLmxv
Z19jbHVzdGVyczsKK30KKworY29uc3QgRm9udFBsYXRmb3JtRGF0YSogQ29tcGxleFRleHRDb250
cm9sbGVyOjpmb250UGxhdGZvcm1EYXRhRm9yU2NyaXB0UnVuKCkKK3sKKyAgICByZXR1cm4gJm1f
Y3VycmVudEZvbnREYXRhLT5mb250RGF0YUZvckNoYXJhY3RlcignICcpLT5wbGF0Zm9ybURhdGEo
KTsKIH0KIAogYm9vbCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmlzV29yZEJyZWFrKHVuc2lnbmVk
IGluZGV4KQogewotICAgIHJldHVybiBpbmRleCAmJiBpc0NvZGVwb2ludFNwYWNlKG1faXRlbS5z
dHJpbmdbaW5kZXhdKSAmJiAhaXNDb2RlcG9pbnRTcGFjZShtX2l0ZW0uc3RyaW5nW2luZGV4IC0g
MV0pOworICAgIHJldHVybiBpbmRleCAmJiBpc0NvZGVwb2ludFNwYWNlKG1fcnVuW2luZGV4XSkg
JiYgIWlzQ29kZXBvaW50U3BhY2UobV9ydW5baW5kZXggLSAxXSk7CiB9CiAKLWludCBDb21wbGV4
VGV4dENvbnRyb2xsZXI6OmRldGVybWluZVdvcmRCcmVha1NwYWNpbmcodW5zaWduZWQgbG9nQ2x1
c3RlcnNJbmRleCkKK2ludCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRldGVybWluZVdvcmRCcmVh
a1NwYWNpbmcodW5zaWduZWQgb2Zmc2V0KQogeworICAgIC8vIHxvZmZzZXR8IGlzIGFuIGluZGV4
IG9mIHRoZSBjdXJyZW50IHNjcmlwdCBydW4uCisgICAgQVNTRVJUKG9mZnNldCA8IG1faW5kZXhP
Zk5leHRTY3JpcHRSdW4gLSBtX2luZGV4T2ZDdXJyZW50U2NyaXB0UnVuKTsKICAgICBpbnQgd29y
ZEJyZWFrU3BhY2luZyA9IDA7Ci0gICAgLy8gVGhlIGZpcnN0IGhhbGYgb2YgdGhlIGNvbmp1bmN0
aW9uIHdvcmtzIGFyb3VuZCB0aGUgY2FzZSB3aGVyZQotICAgIC8vIG91dHB1dCBnbHlwaHMgYXJl
bid0IGFzc29jaWF0ZWQgd2l0aCBhbnkgY29kZXBvaW50cyBieSB0aGUKLSAgICAvLyBjbHVzdGVy
cyBsb2cuCi0gICAgaWYgKGxvZ0NsdXN0ZXJzSW5kZXggPCBtX2l0ZW0uaXRlbS5sZW5ndGgKLSAg
ICAgICAgJiYgaXNXb3JkQnJlYWsobV9pdGVtLml0ZW0ucG9zICsgbG9nQ2x1c3RlcnNJbmRleCkp
IHsKKyAgICBpZiAoaXNXb3JkQnJlYWsobV9pbmRleE9mQ3VycmVudFNjcmlwdFJ1biArIG9mZnNl
dCkpIHsKICAgICAgICAgd29yZEJyZWFrU3BhY2luZyA9IG1fd29yZFNwYWNpbmdBZGp1c3RtZW50
OwogCiAgICAgICAgIGlmIChtX3BhZGRpbmcgPiAwKSB7CkBAIC0xMzEsNyArMTEwLDcgQEAgdm9p
ZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNldFBhZGRpbmcoaW50IHBhZGRpbmcpCiAgICAgLy8g
YW55LgogICAgIHVuc2lnbmVkIG51bVdvcmRCcmVha3MgPSAwOwogCi0gICAgZm9yICh1bnNpZ25l
ZCBpID0gMDsgaSA8IG1faXRlbS5zdHJpbmdMZW5ndGg7IGkrKykgeworICAgIGZvciAoaW50IGkg
PSAwOyBpIDwgbV9ydW4ubGVuZ3RoKCk7IGkrKykgewogICAgICAgICBpZiAoaXNXb3JkQnJlYWso
aSkpCiAgICAgICAgICAgICBudW1Xb3JkQnJlYWtzKys7CiAgICAgfQpAQCAtMTQyLDIxMiArMTIx
LDEzOSBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2V0UGFkZGluZyhpbnQgcGFkZGlu
ZykKICAgICAgICAgbV9wYWRQZXJXb3JkQnJlYWsgPSAwOwogfQogCi12b2lkIENvbXBsZXhUZXh0
Q29udHJvbGxlcjo6cmVzZXQoaW50IG9mZnNldCkKK2Zsb2F0IENvbXBsZXhUZXh0Q29udHJvbGxl
cjo6d2lkdGhPZkZ1bGxSdW4oKQogewotICAgIG1faW5kZXhPZk5leHRTY3JpcHRSdW4gPSAwOwot
ICAgIG1fb2Zmc2V0WCA9IG9mZnNldDsKLX0KKyAgICBmbG9hdCB3aWR0aFN1bSA9IDA7CisgICAg
d2hpbGUgKG5leHRTY3JpcHRSdW4oKSkKKyAgICAgICAgd2lkdGhTdW0gKz0gd2lkdGgoKTsKIAot
dm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNldHVwRm9yUlRMKCkKLXsKLSAgICBpbnQgcGFk
ZGluZyA9IG1fcGFkZGluZzsKLSAgICAvLyBGSVhNRTogdGhpcyBjYXVzZXMgdXMgdG8gc2hhcGUg
dGhlIHRleHQgdHdpY2UgLS0gb25jZSB0byBjb21wdXRlIHRoZSB3aWR0aCBhbmQgdGhlbiBhZ2Fp
bgotICAgIC8vIGJlbG93IHdoZW4gYWN0dWFsbHkgcmVuZGVyaW5nLiBDaGFuZ2UgQ29tcGxleFRl
eHRDb250cm9sbGVyIHRvIG1hdGNoIHBsYXRmb3JtL21hYyBhbmQKLSAgICAvLyBwbGF0Zm9ybS9j
aHJvbWl1bS93aW4gYnkgaGF2aW5nIGl0IHN0b3JlIHRoZSBzaGFwZWQgcnVucywgc28gd2UgY2Fu
IHJldXNlIHRoZSByZXN1bHRzLgotICAgIHJlc2V0KG1fb2Zmc2V0WCArIHdpZHRoT2ZGdWxsUnVu
KCkpOwotICAgIC8vIFdlIG5lZWQgdG8gc2V0IHRoZSBwYWRkaW5nIGFnYWluIGJlY2F1c2UgQ29t
cGxleFRleHRDb250cm9sbGVyIGxheW91dCBjb25zdW1lZCB0aGUgdmFsdWUuCi0gICAgLy8gRml4
aW5nIHRoZSBhYm92ZSBwcm9ibGVtIHdvdWxkIGhlbHAgaGVyZSB0b28uCi0gICAgc2V0UGFkZGlu
ZyhwYWRkaW5nKTsKKyAgICByZXR1cm4gd2lkdGhTdW07CiB9CiAKIC8vIEFkdmFuY2UgdG8gdGhl
IG5leHQgc2NyaXB0IHJ1biwgcmV0dXJuaW5nIGZhbHNlIHdoZW4gdGhlIGVuZCBvZiB0aGUKIC8v
IFRleHRSdW4gaGFzIGJlZW4gcmVhY2hlZC4KIGJvb2wgQ29tcGxleFRleHRDb250cm9sbGVyOjpu
ZXh0U2NyaXB0UnVuKCkKIHsKLSAgICAvLyBFbnN1cmUgd2UncmUgbm90IHBvaW50aW5nIGF0IHRo
ZSBzbWFsbCBjYXBzIGJ1ZmZlci4KLSAgICBtX2l0ZW0uc3RyaW5nID0gbV9ydW4uY2hhcmFjdGVy
cygpOwotCi0gICAgaWYgKCFoYl91dGYxNl9zY3JpcHRfcnVuX25leHQoMCwgJm1faXRlbS5pdGVt
LCBtX3J1bi5jaGFyYWN0ZXJzKCksIG1fcnVuLmxlbmd0aCgpLCAmbV9pbmRleE9mTmV4dFNjcmlw
dFJ1bikpCisgICAgdW5zaWduZWQgcnVuVGV4dExlbmd0aCA9IG1fcnVuLmxlbmd0aCgpOworICAg
IGlmIChtX2luZGV4T2ZOZXh0U2NyaXB0UnVuID49IHJ1blRleHRMZW5ndGgpCiAgICAgICAgIHJl
dHVybiBmYWxzZTsKIAotICAgIC8vIEl0IGlzIGFjdHVhbGx5IHdyb25nIHRvIGNvbnNpZGVyIHNj
cmlwdCBydW5zIGF0IGFsbCBpbiB0aGlzIGNvZGUuCi0gICAgLy8gT3RoZXIgV2ViS2l0IGNvZGUg
KGUuZy4gTWFjKSBzZWdtZW50cyBjb21wbGV4IHRleHQganVzdCBieSBmaW5kaW5nCi0gICAgLy8g
dGhlIGxvbmdlc3Qgc3BhbiBvZiB0ZXh0IGNvdmVyZWQgYnkgYSBzaW5nbGUgZm9udC4KLSAgICAv
LyBCdXQgd2UgY3VycmVudGx5IG5lZWQgdG8gY2FsbCBoYl91dGYxNl9zY3JpcHRfcnVuX25leHQg
YW55d2F5IHRvIGZpbGwKLSAgICAvLyBpbiB0aGUgaGFyZmJ1enogZGF0YSBzdHJ1Y3R1cmVzIHRv
IGUuZy4gcGljayB0aGUgY29ycmVjdCBzY3JpcHQncyBzaGFwZXIuCi0gICAgLy8gU28gd2UgYWxs
b3cgdGhhdCB0byBydW4gZmlyc3QsIHRoZW4gZG8gYSBzZWNvbmQgcGFzcyBvdmVyIHRoZSByYW5n
ZSBpdAotICAgIC8vIGZvdW5kIGFuZCB0YWtlIHRoZSBsYXJnZXN0IHN1YnJlZ2lvbiB0aGF0IHN0
YXlzIHdpdGhpbiBhIHNpbmdsZSBmb250LgotICAgIG1fY3VycmVudEZvbnREYXRhID0gbV9mb250
LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIobV9pdGVtLnN0cmluZ1ttX2l0ZW0uaXRlbS5wb3NdLCBm
YWxzZSkuZm9udERhdGE7CisgICAgbV9pbmRleE9mQ3VycmVudFNjcmlwdFJ1biA9IG1faW5kZXhP
Zk5leHRTY3JpcHRSdW47CisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSB0ZXh0IHRvIHRha2Ug
dGhlIGxhcmdldCBzdWJyZWdpb24gdGhhdCBzdGF5cyB3aXRoaW4KKyAgICAvLyBhIHNpbmdsZSBm
b250LgorICAgIGNvbnN0IFVDaGFyKiBydW5UZXh0ID0gbV9ydW4uY2hhcmFjdGVycygpOworICAg
IG1fY3VycmVudEZvbnREYXRhID0gbV9mb250LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIocnVuVGV4
dFttX2luZGV4T2ZDdXJyZW50U2NyaXB0UnVuXSwgZmFsc2UpLmZvbnREYXRhOwogICAgIHVuc2ln
bmVkIGVuZE9mUnVuOwotICAgIGZvciAoZW5kT2ZSdW4gPSAxOyBlbmRPZlJ1biA8IG1faXRlbS5p
dGVtLmxlbmd0aDsgKytlbmRPZlJ1bikgewotICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSog
bmV4dEZvbnREYXRhID0gbV9mb250LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIobV9pdGVtLnN0cmlu
Z1ttX2l0ZW0uaXRlbS5wb3MgKyBlbmRPZlJ1bl0sIGZhbHNlKS5mb250RGF0YTsKKyAgICBmb3Ig
KGVuZE9mUnVuID0gbV9pbmRleE9mQ3VycmVudFNjcmlwdFJ1biArIDE7IGVuZE9mUnVuIDwgcnVu
VGV4dExlbmd0aDsgKytlbmRPZlJ1bikgeworICAgICAgICBjb25zdCBTaW1wbGVGb250RGF0YSog
bmV4dEZvbnREYXRhID0gbV9mb250LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIocnVuVGV4dFtlbmRP
ZlJ1bl0sIGZhbHNlKS5mb250RGF0YTsKICAgICAgICAgaWYgKG5leHRGb250RGF0YSAhPSBtX2N1
cnJlbnRGb250RGF0YSkKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLSAgICBtX2l0ZW0uaXRl
bS5sZW5ndGggPSBlbmRPZlJ1bjsKLSAgICBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuID0gbV9pdGVt
Lml0ZW0ucG9zICsgZW5kT2ZSdW47CisgICAgbV9pbmRleE9mTmV4dFNjcmlwdFJ1biA9IGVuZE9m
UnVuOwogCi0gICAgc2V0dXBGb250Rm9yU2NyaXB0UnVuKCk7Ci0gICAgc2hhcGVHbHlwaHMoKTsK
LSAgICBzZXRHbHlwaFBvc2l0aW9ucyhydGwoKSk7CisgICAgc2V0dXBTY3JpcHRSdW4oKTsKKyAg
ICBzaGFwZVNjcmlwdFJ1bigpOworICAgIGlmIChtX2N1cnJlbnRTY3JpcHRSdW4tPm51bUdseXBo
cygpKQorICAgICAgICBzZXRHbHlwaFBvc2l0aW9ucygpOwogCiAgICAgcmV0dXJuIHRydWU7CiB9
CiAKLWZsb2F0IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6d2lkdGhPZkZ1bGxSdW4oKQotewotICAg
IGZsb2F0IHdpZHRoU3VtID0gMDsKLSAgICB3aGlsZSAobmV4dFNjcmlwdFJ1bigpKQotICAgICAg
ICB3aWR0aFN1bSArPSB3aWR0aCgpOwotCi0gICAgcmV0dXJuIHdpZHRoU3VtOwotfQotCi12b2lk
IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2V0dXBGb250Rm9yU2NyaXB0UnVuKCkKK3ZvaWQgQ29t
cGxleFRleHRDb250cm9sbGVyOjpzZXR1cFNjcmlwdFJ1bigpCiB7CisgICAgU3RyaW5nIHRleHQg
PSBTdHJpbmcobV9ydW4uY2hhcmFjdGVycygpICsgbV9pbmRleE9mQ3VycmVudFNjcmlwdFJ1biwg
bV9pbmRleE9mTmV4dFNjcmlwdFJ1biAtIG1faW5kZXhPZkN1cnJlbnRTY3JpcHRSdW4pOwogICAg
IEZvbnREYXRhVmFyaWFudCBmb250RGF0YVZhcmlhbnQgPSBBdXRvVmFyaWFudDsKICAgICAvLyBE
ZXRlcm1pbmUgaWYgdGhpcyBzY3JpcHQgcnVuIG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBzbWFs
bCBjYXBzLgogICAgIC8vIG5leHRTY3JpcHRSdW4oKSB3aWxsIGFsd2F5cyBzZW5kIHVzIGEgcnVu
IG9mIHRoZSBzYW1lIGNhc2UsIGJlY2F1c2UgYQogICAgIC8vIGNhc2UgY2hhbmdlIHdoaWxlIGlu
IHNtYWxsLWNhcHMgbW9kZSBhbHdheXMgcmVzdWx0cyBpbiBkaWZmZXJlbnQKICAgICAvLyBGb250
RGF0YSwgc28gd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBmaXJzdCBjaGFyYWN0ZXIncyBjYXNl
LgotICAgIGlmIChtX2ZvbnQtPmlzU21hbGxDYXBzKCkgJiYgdV9pc2xvd2VyKG1faXRlbS5zdHJp
bmdbbV9pdGVtLml0ZW0ucG9zXSkpIHsKLSAgICAgICAgbV9zbWFsbENhcHNTdHJpbmcgPSBTdHJp
bmcobV9ydW4uZGF0YShtX2l0ZW0uaXRlbS5wb3MpLCBtX2l0ZW0uaXRlbS5sZW5ndGgpOwotICAg
ICAgICBtX3NtYWxsQ2Fwc1N0cmluZy5tYWtlVXBwZXIoKTsKLSAgICAgICAgbV9pdGVtLnN0cmlu
ZyA9IG1fc21hbGxDYXBzU3RyaW5nLmNoYXJhY3RlcnMoKTsKLSAgICAgICAgbV9pdGVtLml0ZW0u
cG9zID0gMDsKKyAgICBpZiAobV9mb250LT5pc1NtYWxsQ2FwcygpICYmIHVfaXNsb3dlcih0ZXh0
WzBdKSkgeworICAgICAgICB0ZXh0Lm1ha2VVcHBlcigpOwogICAgICAgICBmb250RGF0YVZhcmlh
bnQgPSBTbWFsbENhcHNWYXJpYW50OworICAgICAgICBtX2N1cnJlbnRGb250RGF0YSA9IG1fZm9u
dC0+Z2x5cGhEYXRhRm9yQ2hhcmFjdGVyKHRleHRbMF0sIGZhbHNlLCBmb250RGF0YVZhcmlhbnQp
LmZvbnREYXRhOwogICAgIH0KLSAgICBjb25zdCBGb250RGF0YSogZm9udERhdGEgPSBtX2ZvbnQt
PmdseXBoRGF0YUZvckNoYXJhY3RlcihtX2l0ZW0uc3RyaW5nW21faXRlbS5pdGVtLnBvc10sIGZh
bHNlLCBmb250RGF0YVZhcmlhbnQpLmZvbnREYXRhOwotICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURh
dGEmIHBsYXRmb3JtRGF0YSA9IGZvbnREYXRhLT5mb250RGF0YUZvckNoYXJhY3RlcignICcpLT5w
bGF0Zm9ybURhdGEoKTsKLSAgICBtX2l0ZW0uZmFjZSA9IHBsYXRmb3JtRGF0YS5oYXJmYnV6ekZh
Y2UoKS0+ZmFjZSgpOwotICAgIHZvaWQqIG9wYXF1ZVBsYXRmb3JtRGF0YSA9IGNvbnN0X2Nhc3Q8
Rm9udFBsYXRmb3JtRGF0YSo+KCZwbGF0Zm9ybURhdGEpOwotICAgIG1faXRlbS5mb250LT51c2Vy
RGF0YSA9IG9wYXF1ZVBsYXRmb3JtRGF0YTsKLQotICAgIGludCBzaXplID0gcGxhdGZvcm1EYXRh
LnNpemUoKTsKLSAgICBtX2l0ZW0uZm9udC0+eF9wcGVtID0gc2l6ZTsKLSAgICBtX2l0ZW0uZm9u
dC0+eV9wcGVtID0gc2l6ZTsKLSAgICAvLyB4XyBhbmQgeV9zY2FsZSBhcmUgdGhlIGNvbnZlcnNp
b24gZmFjdG9ycyBmcm9tIGZvbnQgZGVzaWduIHNwYWNlIChmRW1TaXplKSB0byAxLzY0dGggb2Yg
ZGV2aWNlIHBpeGVscyBpbiAxNi4xNiBmb3JtYXQuCi0gICAgY29uc3QgaW50IGRldmljZVBpeGVs
RnJhY3Rpb24gPSA2NDsKLSAgICBjb25zdCBpbnQgbXVsdGlwbHlGb3IxNkRvdDE2ID0gMSA8PCAx
NjsKLSAgICBpbnQgc2NhbGUgPSBkZXZpY2VQaXhlbEZyYWN0aW9uICogc2l6ZSAqIG11bHRpcGx5
Rm9yMTZEb3QxNiAvIHBsYXRmb3JtRGF0YS5lbVNpemVJbkZvbnRVbml0cygpOwotICAgIG1faXRl
bS5mb250LT54X3NjYWxlID0gc2NhbGU7Ci0gICAgbV9pdGVtLmZvbnQtPnlfc2NhbGUgPSBzY2Fs
ZTsKLX0KLQotdm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmRlbGV0ZUdseXBoQXJyYXlzKCkK
LXsKLSAgICBkZWxldGVbXSBtX2l0ZW0uZ2x5cGhzOwotICAgIGRlbGV0ZVtdIG1faXRlbS5hdHRy
aWJ1dGVzOwotICAgIGRlbGV0ZVtdIG1faXRlbS5hZHZhbmNlczsKLSAgICBkZWxldGVbXSBtX2l0
ZW0ub2Zmc2V0czsKLSAgICBkZWxldGVbXSBtX2dseXBoczE2OwotICAgIGRlbGV0ZVtdIG1fcG9z
aXRpb25zOwotfQotCi12b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Y3JlYXRlR2x5cGhBcnJh
eXMoaW50IHNpemUpCi17Ci0gICAgbV9pdGVtLmdseXBocyA9IG5ldyBIQl9HbHlwaFtzaXplXTsK
LSAgICBtX2l0ZW0uYXR0cmlidXRlcyA9IG5ldyBIQl9HbHlwaEF0dHJpYnV0ZXNbc2l6ZV07Ci0g
ICAgbV9pdGVtLmFkdmFuY2VzID0gbmV3IEhCX0ZpeGVkW3NpemVdOwotICAgIG1faXRlbS5vZmZz
ZXRzID0gbmV3IEhCX0ZpeGVkUG9pbnRbc2l6ZV07Ci0KLSAgICBtX2dseXBoczE2ID0gbmV3IHVp
bnQxNl90W3NpemVdOwotICAgIG1fcG9zaXRpb25zID0gbmV3IFNrUG9pbnRbc2l6ZV07Ci0KLSAg
ICBtX2l0ZW0ubnVtX2dseXBocyA9IHNpemU7Ci0gICAgbV9nbHlwaHNBcnJheUNhcGFjaXR5ID0g
c2l6ZTsgLy8gU2F2ZSB0aGUgR2x5cGhBcnJheXMgc2l6ZS4KLSAgICByZXNldEdseXBoQXJyYXlz
KCk7CisgICAgbV9waXhlbFdpZHRoID0gMDsKKyAgICBtX2N1cnJlbnRTY3JpcHRSdW4gPSBIYXJm
YnV6elNjcmlwdFJ1bjo6Y3JlYXRlKHRleHQsIG1fY3VycmVudEZvbnREYXRhKTsKIH0KIAotdm9p
ZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnJlc2V0R2x5cGhBcnJheXMoKQordm9pZCBDb21wbGV4
VGV4dENvbnRyb2xsZXI6OnNoYXBlU2NyaXB0UnVuKCkKIHsKLSAgICBpbnQgc2l6ZSA9IG1faXRl
bS5udW1fZ2x5cGhzOwotICAgIC8vIEFsbCB0aGUgdHlwZXMgaGVyZSBkb24ndCBoYXZlIHBvaW50
ZXJzLiBJdCBpcyBzYWZlIHRvIHJlc2V0IHRvCi0gICAgLy8gemVybyB1bmxlc3MgSGFyZmJ1enog
YnJlYWtzIHRoZSBjb21wYXRpYmlsaXR5IGluIHRoZSBmdXR1cmUuCi0gICAgbWVtc2V0KG1faXRl
bS5nbHlwaHMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGgpKTsKLSAgICBtZW1zZXQobV9pdGVt
LmF0dHJpYnV0ZXMsIDAsIHNpemUgKiBzaXplb2YoSEJfR2x5cGhBdHRyaWJ1dGVzKSk7Ci0gICAg
bWVtc2V0KG1faXRlbS5hZHZhbmNlcywgMCwgc2l6ZSAqIHNpemVvZihIQl9GaXhlZCkpOwotICAg
IG1lbXNldChtX2l0ZW0ub2Zmc2V0cywgMCwgc2l6ZSAqIHNpemVvZihIQl9GaXhlZFBvaW50KSk7
Ci0gICAgbWVtc2V0KG1fZ2x5cGhzMTYsIDAsIHNpemUgKiBzaXplb2YodWludDE2X3QpKTsKLSAg
ICBtZW1zZXQobV9wb3NpdGlvbnMsIDAsIHNpemUgKiBzaXplb2YoU2tQb2ludCkpOwotfQotCi12
b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2hhcGVHbHlwaHMoKQotewotICAgIC8vIEhCX1No
YXBlSXRlbSgpIHJlc2V0cyBtX2l0ZW0ubnVtX2dseXBocy4gSWYgdGhlIHByZXZpb3VzIGNhbGwg
dG8KLSAgICAvLyBIQl9TaGFwZUl0ZW0oKSB1c2VkIGxlc3Mgc3BhY2UgdGhhbiB3YXMgYXZhaWxh
YmxlLCB0aGUgY2FwYWNpdHkgb2YKLSAgICAvLyB0aGUgYXJyYXkgbWF5IGJlIGxhcmdlciB0aGFu
IHRoZSBjdXJyZW50IHZhbHVlIG9mIG1faXRlbS5udW1fZ2x5cGhzLgotICAgIC8vIFNvLCB3ZSBu
ZWVkIHRvIHJlc2V0IHRoZSBudW1fZ2x5cGhzIHRvIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXku
Ci0gICAgbV9pdGVtLm51bV9nbHlwaHMgPSBtX2dseXBoc0FycmF5Q2FwYWNpdHk7Ci0gICAgcmVz
ZXRHbHlwaEFycmF5cygpOwotICAgIHdoaWxlICghSEJfU2hhcGVJdGVtKCZtX2l0ZW0pKSB7Ci0g
ICAgICAgIC8vIFdlIG92ZXJmbG93ZWQgb3VyIGFycmF5cy4gUmVzaXplIGFuZCByZXRyeS4KLSAg
ICAgICAgLy8gSEJfU2hhcGVJdGVtIGZpbGxzIGluIG1faXRlbS5udW1fZ2x5cGhzIHdpdGggdGhl
IG5lZWRlZCBzaXplLgotICAgICAgICBkZWxldGVHbHlwaEFycmF5cygpOwotICAgICAgICAvLyBU
aGUgfCsgMXwgaGVyZSBpcyBhIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIEhhcmZidXp6OiB0aGUg
S2htZXIKLSAgICAgICAgLy8gc2hhcGVyIChhdCBsZWFzdCkgY2FuIGZhaWwgYmVjYXVzZSBvZiBp
bnN1ZmZpY2llbnQgZ2x5cGggYnVmZmVycwotICAgICAgICAvLyBhbmQgcmVxdWVzdCAwIGFkZGl0
aW9uYWwgZ2x5cGhzOiB0aHJvd2luZyB1cyBpbnRvIGFuIGluZmluaXRlCi0gICAgICAgIC8vIGxv
b3AuCi0gICAgICAgIGNyZWF0ZUdseXBoQXJyYXlzKG1faXRlbS5udW1fZ2x5cGhzICsgMSk7Cisg
ICAgbV9jdXJyZW50U2NyaXB0UnVuLT5zaGFwZUdseXBocygpOworCisgICAgLy8gSXRlcmF0ZSB0
aHJvdWdoIHRoZSBzaGFwaW5nIHJlc3VsdCB0byBmaWxsIHRoZSBsb2dDbHVzdGVycworICAgIGhi
X2dseXBoX2luZm9fdCogZ2x5cGhJbmZvcyA9IG1fY3VycmVudFNjcmlwdFJ1bi0+Z2x5cGhJbmZv
cygpOworICAgIHVuc2lnbmVkIHNob3J0KiBsb2dDbHVzdGVycyA9IG1fY3VycmVudFNjcmlwdFJ1
bi0+bG9nQ2x1c3RlcnMoKTsKKyAgICB1bnNpZ25lZCBudW1HbHlwaHMgPSBtX2N1cnJlbnRTY3Jp
cHRSdW4tPm51bUdseXBocygpOworICAgIHVuc2lnbmVkIGluZGV4ID0gMDsKKyAgICB3aGlsZSAo
aW5kZXggPCBudW1HbHlwaHMpIHsKKyAgICAgICAgdW5zaWduZWQgbmV4dEluZGV4ID0gaW5kZXgg
KyAxOworICAgICAgICB3aGlsZSAobmV4dEluZGV4IDwgbnVtR2x5cGhzICYmIGdseXBoSW5mb3Nb
aW5kZXhdLmNsdXN0ZXIgPT0gZ2x5cGhJbmZvc1tuZXh0SW5kZXhdLmNsdXN0ZXIpCisgICAgICAg
ICAgICArK25leHRJbmRleDsKKyAgICAgICAgaWYgKHJ0bCgpKSB7CisgICAgICAgICAgICBpbnQg
bmV4dENsdXN0ZXIgPSBuZXh0SW5kZXggPCBudW1HbHlwaHMgPyBnbHlwaEluZm9zW25leHRJbmRl
eF0uY2x1c3RlciA6IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IGdseXBoSW5mb3NbaW5k
ZXhdLmNsdXN0ZXI7IGogPiBuZXh0Q2x1c3RlcjsgLS1qKQorICAgICAgICAgICAgICAgIGxvZ0Ns
dXN0ZXJzW2pdID0gaW5kZXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1bnNpZ25l
ZCBuZXh0Q2x1c3RlciA9IG5leHRJbmRleCA8IG51bUdseXBocyA/IGdseXBoSW5mb3NbbmV4dElu
ZGV4XS5jbHVzdGVyIDogbV9jdXJyZW50U2NyaXB0UnVuLT5udW1Db2RlUG9pbnRzKCk7CisgICAg
ICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSBnbHlwaEluZm9zW2luZGV4XS5jbHVzdGVyOyBqIDwg
bmV4dENsdXN0ZXI7ICsraikKKyAgICAgICAgICAgICAgICBsb2dDbHVzdGVyc1tqXSA9IGluZGV4
OworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gbmV4dEluZGV4OwogICAgIH0KIH0KIAotdm9p
ZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNldEdseXBoUG9zaXRpb25zKGJvb2wgaXNSVEwpCit2
b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2V0R2x5cGhQb3NpdGlvbnMoKQogewotICAgIGNv
bnN0IGRvdWJsZSBydGxGbGlwID0gaXNSVEwgPyAtMSA6IDE7Ci0gICAgZG91YmxlIHBvc2l0aW9u
ID0gMDsKLQotICAgIC8vIGxvZ0NsdXN0ZXJzSW5kZXggaW5kZXhlcyBsb2dDbHVzdGVycyBmb3Ig
dGhlIGZpcnN0IGNvZGVwb2ludCBvZiB0aGUgY3VycmVudCBnbHlwaC4KLSAgICAvLyBFYWNoIHRp
bWUgd2UgYWR2YW5jZSBhIGdseXBoLCB3ZSBza2lwIG92ZXIgYWxsIHRoZSBjb2RlcG9pbnRzIHRo
YXQgY29udHJpYnV0ZWQgdG8gdGhlIGN1cnJlbnQgZ2x5cGguCi0gICAgaW50IGxvZ0NsdXN0ZXJz
SW5kZXggPSAwOwotCi0gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBnbHlwaHMgaW4gbG9naWNh
bCBvcmRlciwgZmxpcHBpbmcgZm9yIFJUTCB3aGVyZSBuZWNlc3NhcnkuCi0gICAgLy8gR2x5cGhz
IGFyZSBwb3NpdGlvbmVkIHN0YXJ0aW5nIGZyb20gbV9vZmZzZXRYOyBpbiBSVEwgbW9kZSB0aGV5
IGdvIGxlZnR3YXJkcyBmcm9tIHRoZXJlLgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9p
dGVtLm51bV9nbHlwaHM7ICsraSkgewotICAgICAgICB3aGlsZSAoc3RhdGljX2Nhc3Q8dW5zaWdu
ZWQ+KGxvZ0NsdXN0ZXJzSW5kZXgpIDwgbV9pdGVtLml0ZW0ubGVuZ3RoICYmIG1faXRlbS5sb2df
Y2x1c3RlcnNbbG9nQ2x1c3RlcnNJbmRleF0gPCBpKQotICAgICAgICAgICAgbG9nQ2x1c3RlcnNJ
bmRleCsrOwotCisgICAgaGJfZ2x5cGhfaW5mb190KiBnbHlwaEluZm9zID0gbV9jdXJyZW50U2Ny
aXB0UnVuLT5nbHlwaEluZm9zKCk7CisgICAgaGJfZ2x5cGhfcG9zaXRpb25fdCogZ2x5cGhQb3Np
dGlvbnMgPSBtX2N1cnJlbnRTY3JpcHRSdW4tPmdseXBoUG9zaXRpb25zKCk7CisgICAgdW5zaWdu
ZWQgbnVtR2x5cGhzID0gbV9jdXJyZW50U2NyaXB0UnVuLT5udW1HbHlwaHMoKTsKKyAgICB1aW50
MTZfdCogZ2x5cGhzID0gbV9jdXJyZW50U2NyaXB0UnVuLT5nbHlwaHMoKTsKKyAgICBTa1BvaW50
KiBwb3NpdGlvbnMgPSBtX2N1cnJlbnRTY3JpcHRSdW4tPnBvc2l0aW9ucygpOworCisgICAgLy8g
SXRlcmF0ZSB0aHJvdWdoIHRoZSBnbHlwaHMgaW4gcGh5c2ljYWwgb3JkZXIsIG5vIG5lZWQgZmxp
cHBpbmcgZm9yIFJUTC4KKyAgICAvLyBHbHlwaHMgYXJlIHBvc2l0aW9uZWQgc3RhcnRpbmcgZnJv
bSBtX29mZnNldFg7IHRoZXkgYWx3YXlzIGdvIHJpZ2h0d2FyZHMgZnJvbSB0aGVyZSwgaW5jbHVk
aW5nIFJUTCBtb2RlLgorICAgIGRvdWJsZSB0b3RhbEFkdmFuY2UgPSAwOworICAgIHVuc2lnbmVk
IGxhc3RDbHVzdGVyID0gZ2x5cGhJbmZvc1swXS5jbHVzdGVyOworICAgIGZvciAoc2l6ZV90IGkg
PSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpIHsKICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZ2x5
cGggaXMganVzdCBhZnRlciBhIHNwYWNlLCBhZGQgaW4gdGhlIHdvcmQgc3BhY2luZy4KLSAgICAg
ICAgcG9zaXRpb24gKz0gZGV0ZXJtaW5lV29yZEJyZWFrU3BhY2luZyhsb2dDbHVzdGVyc0luZGV4
KTsKKyAgICAgICAgaWYgKCFsYXN0Q2x1c3RlciB8fCBsYXN0Q2x1c3RlciAhPSBnbHlwaEluZm9z
W2ldLmNsdXN0ZXIpCisgICAgICAgICAgICB0b3RhbEFkdmFuY2UgKz0gZGV0ZXJtaW5lV29yZEJy
ZWFrU3BhY2luZyhnbHlwaEluZm9zW2ldLmNsdXN0ZXIpOwogCi0gICAgICAgIG1fZ2x5cGhzMTZb
aV0gPSBtX2l0ZW0uZ2x5cGhzW2ldOwotICAgICAgICBkb3VibGUgb2Zmc2V0WCA9IHRydW5jYXRl
Rml4ZWRQb2ludFRvSW50ZWdlcihtX2l0ZW0ub2Zmc2V0c1tpXS54KTsKLSAgICAgICAgZG91Ymxl
IG9mZnNldFkgPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLm9mZnNldHNbaV0u
eSk7Ci0gICAgICAgIGRvdWJsZSBhZHZhbmNlID0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2Vy
KG1faXRlbS5hZHZhbmNlc1tpXSk7Ci0gICAgICAgIGlmIChpc1JUTCkKLSAgICAgICAgICAgIG9m
ZnNldFggLT0gYWR2YW5jZTsKKyAgICAgICAgZ2x5cGhzW2ldID0gZ2x5cGhJbmZvc1tpXS5jb2Rl
cG9pbnQ7CisgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRl
Z2VyKGdseXBoUG9zaXRpb25zW2ldLnhfb2Zmc2V0KTsKKyAgICAgICAgZG91YmxlIG9mZnNldFkg
PSAtdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKGdseXBoUG9zaXRpb25zW2ldLnlfb2Zmc2V0
KTsKKyAgICAgICAgZG91YmxlIGFkdmFuY2UgPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIo
Z2x5cGhQb3NpdGlvbnNbaV0ueF9hZHZhbmNlKTsKIAotICAgICAgICBtX3Bvc2l0aW9uc1tpXS5z
ZXQobV9vZmZzZXRYICsgKHBvc2l0aW9uICogcnRsRmxpcCkgKyBvZmZzZXRYLAotICAgICAgICAg
ICAgICAgICAgICAgICAgICAgbV9zdGFydGluZ1kgKyBvZmZzZXRZKTsKKyAgICAgICAgcG9zaXRp
b25zW2ldLnNldChtX29mZnNldFggKyB0b3RhbEFkdmFuY2UgKyBvZmZzZXRYLAorICAgICAgICAg
ICAgICAgICAgICAgICAgIG1fc3RhcnRpbmdZICsgb2Zmc2V0WSk7CiAKLSAgICAgICAgaWYgKG1f
Y3VycmVudEZvbnREYXRhLT5pc1plcm9XaWR0aFNwYWNlR2x5cGgobV9nbHlwaHMxNltpXSkpCisg
ICAgICAgIGlmIChtX2N1cnJlbnRGb250RGF0YS0+aXNaZXJvV2lkdGhTcGFjZUdseXBoKGdseXBo
c1tpXSkpCiAgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICAvLyBBdCB0aGUgZW5kIG9m
IGVhY2ggY2x1c3RlciwgYWRkIGluIHRoZSBsZXR0ZXIgc3BhY2luZy4KLSAgICAgICAgaWYgKGkg
KyAxID09IG1faXRlbS5udW1fZ2x5cGhzIHx8IG1faXRlbS5hdHRyaWJ1dGVzW2kgKyAxXS5jbHVz
dGVyU3RhcnQpCi0gICAgICAgICAgICBwb3NpdGlvbiArPSBtX2xldHRlclNwYWNpbmc7CisgICAg
ICAgIGlmIChsYXN0Q2x1c3RlciAhPSBnbHlwaEluZm9zW2ldLmNsdXN0ZXIpCisgICAgICAgICAg
ICB0b3RhbEFkdmFuY2UgKz0gbV9sZXR0ZXJTcGFjaW5nOwogCi0gICAgICAgIHBvc2l0aW9uICs9
IGFkdmFuY2U7CisgICAgICAgIHRvdGFsQWR2YW5jZSArPSBhZHZhbmNlOworICAgICAgICBsYXN0
Q2x1c3RlciA9IGdseXBoSW5mb3NbaV0uY2x1c3RlcjsKICAgICB9Ci0gICAgbV9waXhlbFdpZHRo
ID0gc3RkOjptYXgocG9zaXRpb24sIDAuMCk7Ci0gICAgbV9vZmZzZXRYICs9IG1fcGl4ZWxXaWR0
aCAqIHJ0bEZsaXA7CisgICAgbV9waXhlbFdpZHRoID0gc3RkOjptYXgodG90YWxBZHZhbmNlLCAw
LjApOworICAgIG1fb2Zmc2V0WCArPSBtX3BpeGVsV2lkdGg7CiB9CiAKLXZvaWQgQ29tcGxleFRl
eHRDb250cm9sbGVyOjpub3JtYWxpemVTcGFjZXNBbmRNaXJyb3JDaGFycyhjb25zdCBVQ2hhciog
c291cmNlLCBib29sIHJ0bCwgVUNoYXIqIGRlc3RpbmF0aW9uLCBpbnQgbGVuZ3RoKQordm9pZCBD
b21wbGV4VGV4dENvbnRyb2xsZXI6Om5vcm1hbGl6ZVNwYWNlcyhjb25zdCBVQ2hhciogc291cmNl
LCBib29sIHJ0bCwgVUNoYXIqIGRlc3RpbmF0aW9uLCBpbnQgbGVuZ3RoKQogewogICAgIGludCBw
b3NpdGlvbiA9IDA7CiAgICAgYm9vbCBlcnJvciA9IGZhbHNlOwotICAgIC8vIEl0ZXJhdGUgY2hh
cmFjdGVycyBpbiBzb3VyY2UgYW5kIG1pcnJvciBjaGFyYWN0ZXIgaWYgbmVlZGVkLgorICAgIC8v
IEl0ZXJhdGUgY2hhcmFjdGVycyBpbiBzb3VyY2UgYW5kIG5vcm1hbGl6ZSBzcGFjZXMgaWYgbmVl
ZGVkLgogICAgIHdoaWxlIChwb3NpdGlvbiA8IGxlbmd0aCkgewogICAgICAgICBVQ2hhcjMyIGNo
YXJhY3RlcjsKICAgICAgICAgaW50IG5leHRQb3NpdGlvbiA9IHBvc2l0aW9uOwogICAgICAgICBV
MTZfTkVYVChzb3VyY2UsIG5leHRQb3NpdGlvbiwgbGVuZ3RoLCBjaGFyYWN0ZXIpOwogICAgICAg
ICBpZiAoRm9udDo6dHJlYXRBc1NwYWNlKGNoYXJhY3RlcikpCiAgICAgICAgICAgICBjaGFyYWN0
ZXIgPSAnICc7Ci0gICAgICAgIGVsc2UgaWYgKEZvbnQ6OnRyZWF0QXNaZXJvV2lkdGhTcGFjZShj
aGFyYWN0ZXIpKQorICAgICAgICBlbHNlIGlmIChGb250Ojp0cmVhdEFzWmVyb1dpZHRoU3BhY2VJ
bkNvbXBsZXhTY3JpcHQoY2hhcmFjdGVyKSkKICAgICAgICAgICAgIGNoYXJhY3RlciA9IHplcm9X
aWR0aFNwYWNlOwotICAgICAgICBlbHNlIGlmIChydGwpCi0gICAgICAgICAgICBjaGFyYWN0ZXIg
PSB1X2NoYXJNaXJyb3IoY2hhcmFjdGVyKTsKICAgICAgICAgVTE2X0FQUEVORChkZXN0aW5hdGlv
biwgcG9zaXRpb24sIGxlbmd0aCwgY2hhcmFjdGVyLCBlcnJvcik7CiAgICAgICAgIEFTU0VSVCgh
ZXJyb3IpOwogICAgICAgICBwb3NpdGlvbiA9IG5leHRQb3NpdGlvbjsKQEAgLTM1Niw3ICsyNjIs
NyBAQCB2b2lkIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6bm9ybWFsaXplU3BhY2VzQW5kTWlycm9y
Q2hhcnMoY29uc3QgVUNoYXIqIHNvdXJjZSwgYgogCiBjb25zdCBUZXh0UnVuJiBDb21wbGV4VGV4
dENvbnRyb2xsZXI6OmdldE5vcm1hbGl6ZWRUZXh0UnVuKGNvbnN0IFRleHRSdW4mIG9yaWdpbmFs
UnVuLCBPd25QdHI8VGV4dFJ1bj4mIG5vcm1hbGl6ZWRSdW4sIE93bkFycmF5UHRyPFVDaGFyPiYg
bm9ybWFsaXplZEJ1ZmZlcikKIHsKLSAgICAvLyBOb3JtYWxpemUgdGhlIHRleHQgcnVuIGluIHRo
cmVlIHdheXM6CisgICAgLy8gTm9ybWFsaXplIHRoZSB0ZXh0IHJ1biBpbiB0d28gd2F5czoKICAg
ICAvLyAxKSBDb252ZXJ0IHRoZSB8b3JpZ2luYWxSdW58IHRvIE5GQyBub3JtYWxpemVkIGZvcm0g
aWYgY29tYmluaW5nIGRpYWNyaXRpY2FsIG1hcmtzCiAgICAgLy8gKFUrMDMwMC4uKSBhcmUgdXNl
ZCBpbiB0aGUgcnVuLiBUaGlzIGNvbnZlcnNpb24gaXMgbmVjZXNzYXJ5IHNpbmNlIG1vc3QgT3Bl
blR5cGUKICAgICAvLyBmb250cyAoZS5nLiwgQXJpYWwpIGRvbid0IGhhdmUgc3Vic3RpdHV0aW9u
IHJ1bGVzIGZvciB0aGUgZGlhY3JpdGljYWwgbWFya3MgaW4KQEAgLTM2OCw3ICsyNzQsNiBAQCBj
b25zdCBUZXh0UnVuJiBDb21wbGV4VGV4dENvbnRyb2xsZXI6OmdldE5vcm1hbGl6ZWRUZXh0UnVu
KGNvbnN0IFRleHRSdW4mIG9yaWdpbgogICAgIC8vIEhhcmZidXp6IHdpbGwgZG8gdGhlIHNhbWUg
dGhpbmcgZm9yIHVzIHVzaW5nIHRoZSBHU1VCIHRhYmxlLgogICAgIC8vIDIpIENvbnZlcnQgc3Bh
Y2luZyBjaGFyYWN0ZXJzIGludG8gcGxhaW4gc3BhY2VzLCBhcyBzb21lIGZvbnRzIHdpbGwgcHJv
dmlkZSBnbHlwaHMKICAgICAvLyBmb3IgY2hhcmFjdGVycyBsaWtlICdcbicgb3RoZXJ3aXNlLgot
ICAgIC8vIDMpIENvbnZlcnQgbWlycm9yZWQgY2hhcmFjdGVycyBzdWNoIGFzIHBhcmVudGhlc2lz
IGZvciBydGwgdGV4dC4KIAogICAgIC8vIENvbnZlcnQgdG8gTkZDIGZvcm0gaWYgdGhlIHRleHQg
aGFzIGRpYWNyaXRpY2FsIG1hcmtzLgogICAgIGljdTo6VW5pY29kZVN0cmluZyBub3JtYWxpemVk
U3RyaW5nOwpAQCAtMzg2LDcgKzI5MSw3IEBAIGNvbnN0IFRleHRSdW4mIENvbXBsZXhUZXh0Q29u
dHJvbGxlcjo6Z2V0Tm9ybWFsaXplZFRleHRSdW4oY29uc3QgVGV4dFJ1biYgb3JpZ2luCiAgICAg
ICAgIH0KICAgICB9CiAKLSAgICAvLyBOb3JtYWxpemUgc3BhY2UgYW5kIG1pcnJvciBwYXJlbnRo
ZXNpcyBmb3IgcnRsIHRleHQuCisgICAgLy8gTm9ybWFsaXplIHNwYWNlLgogICAgIGludCBub3Jt
YWxpemVkQnVmZmVyTGVuZ3RoOwogICAgIGNvbnN0IFVDaGFyKiBzb3VyY2VUZXh0OwogICAgIGlm
IChub3JtYWxpemVkU3RyaW5nLmlzRW1wdHkoKSkgewpAQCAtMzk5LDcgKzMwNCw3IEBAIGNvbnN0
IFRleHRSdW4mIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Z2V0Tm9ybWFsaXplZFRleHRSdW4oY29u
c3QgVGV4dFJ1biYgb3JpZ2luCiAKICAgICBub3JtYWxpemVkQnVmZmVyID0gYWRvcHRBcnJheVB0
cihuZXcgVUNoYXJbbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCArIDFdKTsKIAotICAgIG5vcm1hbGl6
ZVNwYWNlc0FuZE1pcnJvckNoYXJzKHNvdXJjZVRleHQsIG9yaWdpbmFsUnVuLnJ0bCgpLCBub3Jt
YWxpemVkQnVmZmVyLmdldCgpLCBub3JtYWxpemVkQnVmZmVyTGVuZ3RoKTsKKyAgICBub3JtYWxp
emVTcGFjZXMoc291cmNlVGV4dCwgb3JpZ2luYWxSdW4ucnRsKCksIG5vcm1hbGl6ZWRCdWZmZXIu
Z2V0KCksIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgpOwogCiAgICAgbm9ybWFsaXplZFJ1biA9IGFk
b3B0UHRyKG5ldyBUZXh0UnVuKG9yaWdpbmFsUnVuKSk7CiAgICAgbm9ybWFsaXplZFJ1bi0+c2V0
VGV4dChub3JtYWxpemVkQnVmZmVyLmdldCgpLCBub3JtYWxpemVkQnVmZmVyTGVuZ3RoKTsKQEAg
LTQwOCw5MyArMzEzLDg0IEBAIGNvbnN0IFRleHRSdW4mIENvbXBsZXhUZXh0Q29udHJvbGxlcjo6
Z2V0Tm9ybWFsaXplZFRleHRSdW4oY29uc3QgVGV4dFJ1biYgb3JpZ2luCiAKIGludCBDb21wbGV4
VGV4dENvbnRyb2xsZXI6OmdseXBoSW5kZXhGb3JYUG9zaXRpb25JblNjcmlwdFJ1bihpbnQgdGFy
Z2V0WCkgY29uc3QKIHsKKyAgICBBU1NFUlQoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRhcmdldFgp
IDw9IG1fb2Zmc2V0WCArIG1fcGl4ZWxXaWR0aCk7CiAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRo
ZSBnbHlwaHMgaW4gbG9naWNhbCBvcmRlciwgc2VlaW5nIHdoZXRoZXIgdGFyZ2V0WCBmYWxscyBi
ZXR3ZWVuIHRoZSBwcmV2aW91cwogICAgIC8vIHBvc2l0aW9uIGFuZCBoYWxmd2F5IHRocm91Z2gg
dGhlIGN1cnJlbnQgZ2x5cGguCi0gICAgLy8gRklYTUU6IHRoaXMgY29kZSBwcm9iYWJseSBiZWxv
bmdzIGluIENvbXBsZXhUZXh0Q29udHJvbGxlci4KLSAgICBpbnQgbGFzdFggPSBvZmZzZXRYKCkg
LSAocnRsKCkgPyAtbV9waXhlbFdpZHRoIDogbV9waXhlbFdpZHRoKTsKLSAgICBmb3IgKGludCBn
bHlwaEluZGV4ID0gMDsgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGdseXBoSW5kZXgpIDwgbGVuZ3Ro
KCk7ICsrZ2x5cGhJbmRleCkgewotICAgICAgICBpbnQgYWR2YW5jZSA9IHRydW5jYXRlRml4ZWRQ
b2ludFRvSW50ZWdlcihtX2l0ZW0uYWR2YW5jZXNbZ2x5cGhJbmRleF0pOwotICAgICAgICBpbnQg
bmV4dFggPSBzdGF0aWNfY2FzdDxpbnQ+KHBvc2l0aW9ucygpW2dseXBoSW5kZXhdLngoKSkgKyBh
ZHZhbmNlIC8gMjsKKyAgICBTa1BvaW50KiBwb3NpdGlvbnMgPSBtX2N1cnJlbnRTY3JpcHRSdW4t
PnBvc2l0aW9ucygpOworICAgIGhiX2dseXBoX3Bvc2l0aW9uX3QqIGdseXBoUG9zaXRpb25zID0g
bV9jdXJyZW50U2NyaXB0UnVuLT5nbHlwaFBvc2l0aW9ucygpOworICAgIGludCBsYXN0WCA9IHJ0
bCgpID8gbV9waXhlbFdpZHRoIDogMDsKKyAgICB1bnNpZ25lZCBudW1HbHlwaHMgPSBtX2N1cnJl
bnRTY3JpcHRSdW4tPm51bUdseXBocygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBu
dW1HbHlwaHM7ICsraSkgeworICAgICAgICB1bnNpZ25lZCBnbHlwaEluZGV4ID0gcnRsKCkgPyBu
dW1HbHlwaHMgLSBpIC0gMSA6IGk7CisgICAgICAgIGludCBhZHZhbmNlID0gdHJ1bmNhdGVGaXhl
ZFBvaW50VG9JbnRlZ2VyKGdseXBoUG9zaXRpb25zW2dseXBoSW5kZXhdLnhfYWR2YW5jZSk7Cisg
ICAgICAgIGludCBuZXh0WCA9IHBvc2l0aW9uc1tnbHlwaEluZGV4XS54KCkgKyBhZHZhbmNlIC8g
MjsKICAgICAgICAgaWYgKHN0ZDo6bWluKG5leHRYLCBsYXN0WCkgPD0gdGFyZ2V0WCAmJiB0YXJn
ZXRYIDw9IHN0ZDo6bWF4KG5leHRYLCBsYXN0WCkpCiAgICAgICAgICAgICByZXR1cm4gZ2x5cGhJ
bmRleDsKICAgICAgICAgbGFzdFggPSBuZXh0WDsKICAgICB9CiAKLSAgICByZXR1cm4gbGVuZ3Ro
KCkgLSAxOworICAgIHJldHVybiBydGwoKSA/IDAgOiBudW1HbHlwaHMgLSAxOwogfQogCiBpbnQg
Q29tcGxleFRleHRDb250cm9sbGVyOjpvZmZzZXRGb3JQb3NpdGlvbihpbnQgdGFyZ2V0WCkKIHsK
ICAgICB1bnNpZ25lZCBiYXNlUG9zaXRpb24gPSAwOwogCi0gICAgaW50IHggPSBvZmZzZXRYKCk7
CisgICAgaW50IHggPSBtX29mZnNldFg7CiAgICAgd2hpbGUgKG5leHRTY3JpcHRSdW4oKSkgewot
ICAgICAgICBpbnQgbmV4dFggPSBvZmZzZXRYKCk7CisgICAgICAgIGludCBuZXh0WCA9IG1fb2Zm
c2V0WDsKIAogICAgICAgICBpZiAoc3RkOjptaW4oeCwgbmV4dFgpIDw9IHRhcmdldFggJiYgdGFy
Z2V0WCA8PSBzdGQ6Om1heCh4LCBuZXh0WCkpIHsKICAgICAgICAgICAgIC8vIFRoZSB4IHZhbHVl
IGluIHF1ZXN0aW9uIGlzIHdpdGhpbiB0aGlzIHNjcmlwdCBydW4uCi0gICAgICAgICAgICBjb25z
dCBpbnQgZ2x5cGhJbmRleCA9IGdseXBoSW5kZXhGb3JYUG9zaXRpb25JblNjcmlwdFJ1bih0YXJn
ZXRYKTsKLQotICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIGdseXBoIGluZGV4LCB3
ZSBoYXZlIHRvIHR1cm4gdGhhdCBpbnRvIGEKLSAgICAgICAgICAgIC8vIGNvZGUtcG9pbnQgaW5k
ZXguIEJlY2F1c2Ugb2YgbGlnYXR1cmVzLCBzZXZlcmFsIGNvZGUtcG9pbnRzIG1heQotICAgICAg
ICAgICAgLy8gaGF2ZSBnb25lIGludG8gYSBzaW5nbGUgZ2x5cGguIFdlIGl0ZXJhdGUgb3ZlciB0
aGUgY2x1c3RlcnMgbG9nCi0gICAgICAgICAgICAvLyBhbmQgZmluZCB0aGUgZmlyc3QgY29kZS1w
b2ludCB3aGljaCBjb250cmlidXRlZCB0byB0aGUgZ2x5cGguCi0KLSAgICAgICAgICAgIC8vIFNv
bWUgc2hhcGVycyAoaS5lLiBLaG1lcikgd2lsbCBwcm9kdWNlIGNsdXN0ZXIgbG9ncyB3aGljaCBy
ZXBvcnQKLSAgICAgICAgICAgIC8vIHRoYXQgL25vLyBjb2RlIHBvaW50cyBjb250cmlidXRlZCB0
byBjZXJ0YWluIGdseXBocy4gQmVjYXVzZSBvZgotICAgICAgICAgICAgLy8gdGhpcywgd2UgdGFr
ZSBhbnkgY29kZSBwb2ludCB3aGljaCBjb250cmlidXRlZCB0byB0aGUgZ2x5cGggaW4KLSAgICAg
ICAgICAgIC8vIHF1ZXN0aW9uLCBvciBhbnkgc3Vic2VxdWVudCBnbHlwaC4gSWYgd2UgcnVuIG9m
ZiB0aGUgZW5kLCB0aGVuCi0gICAgICAgICAgICAvLyB3ZSB0YWtlIHRoZSBsYXN0IGNvZGUgcG9p
bnQuCi0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgbnVtQ29kZVBvaW50cygp
OyArK2opIHsKLSAgICAgICAgICAgICAgICBpZiAobV9pdGVtLmxvZ19jbHVzdGVyc1tqXSA+PSBn
bHlwaEluZGV4KQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZVBvc2l0aW9uICsgajsK
LSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIGJhc2VQb3NpdGlvbiArIG51bUNv
ZGVQb2ludHMoKSAtIDE7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBnbHlwaEluZGV4ID0g
Z2x5cGhJbmRleEZvclhQb3NpdGlvbkluU2NyaXB0UnVuKHRhcmdldFgpOworICAgICAgICAgICAg
QVNTRVJUKGdseXBoSW5kZXggPCBtX2N1cnJlbnRTY3JpcHRSdW4tPm51bUdseXBocygpKTsKKyAg
ICAgICAgICAgIHJldHVybiBiYXNlUG9zaXRpb24gKyBtX2N1cnJlbnRTY3JpcHRSdW4tPmdseXBo
SW5mb3MoKVtnbHlwaEluZGV4XS5jbHVzdGVyOwogICAgICAgICB9Ci0KLSAgICAgICAgYmFzZVBv
c2l0aW9uICs9IG51bUNvZGVQb2ludHMoKTsKKyAgICAgICAgYmFzZVBvc2l0aW9uICs9IG1fY3Vy
cmVudFNjcmlwdFJ1bi0+bnVtQ29kZVBvaW50cygpOwogICAgIH0KIAogICAgIHJldHVybiBiYXNl
UG9zaXRpb247CiB9CiAKK2ludCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnhQb3NpdGlvbkZvck9m
ZnNldEluU2NyaXB0UnVuKHVuc2lnbmVkIG9mZnNldCkgY29uc3QKK3sKKyAgICBBU1NFUlQob2Zm
c2V0IDwgbV9jdXJyZW50U2NyaXB0UnVuLT5udW1Db2RlUG9pbnRzKCkpOworICAgIHVuc2lnbmVk
IGdseXBoSW5kZXggPSBtX2N1cnJlbnRTY3JpcHRSdW4tPmxvZ0NsdXN0ZXJzKClbb2Zmc2V0XTsK
KyAgICBBU1NFUlQoZ2x5cGhJbmRleCA8IG1fY3VycmVudFNjcmlwdFJ1bi0+bnVtR2x5cGhzKCkp
OworICAgIGludCBwb3NpdGlvbiA9IG1fY3VycmVudFNjcmlwdFJ1bi0+cG9zaXRpb25zKClbZ2x5
cGhJbmRleF0ueCgpOworICAgIGlmIChydGwoKSkKKyAgICAgICAgcG9zaXRpb24gKz0gdHJ1bmNh
dGVGaXhlZFBvaW50VG9JbnRlZ2VyKG1fY3VycmVudFNjcmlwdFJ1bi0+Z2x5cGhQb3NpdGlvbnMo
KVtnbHlwaEluZGV4XS54X2FkdmFuY2UpOworICAgIHJldHVybiBwb3NpdGlvbjsKK30KKwogRmxv
YXRSZWN0IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2VsZWN0aW9uUmVjdChjb25zdCBGbG9hdFBv
aW50JiBwb2ludCwgaW50IGhlaWdodCwgaW50IGZyb20sIGludCB0bykKIHsKICAgICBpbnQgZnJv
bVggPSAtMSwgdG9YID0gLTE7Ci0gICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBzY3JpcHQgcnVu
cyBpbiBsb2dpY2FsIG9yZGVyLCBzZWFyY2hpbmcgZm9yIHRoZSBydW4gY292ZXJpbmcgdGhlIHBv
c2l0aW9ucyBvZiBpbnRlcmVzdC4KKyAgICBpbnQgc3RhcnRYID0gbV9vZmZzZXRYOworICAgIC8v
IEl0ZXJhdGUgdGhyb3VnaCB0aGUgc2NyaXB0IHJ1bnMgaW4gcGh5c2ljYWwgb3JkZXIsIHNlYXJj
aGluZyBmb3IgdGhlIHJ1biBjb3ZlcmluZyB0aGUgcG9zaXRpb25zIG9mIGludGVyZXN0LgogICAg
IHdoaWxlIChuZXh0U2NyaXB0UnVuKCkgJiYgKGZyb21YID09IC0xIHx8IHRvWCA9PSAtMSkpIHsK
LSAgICAgICAgaWYgKGZyb21YID09IC0xICYmIGZyb20gPj0gMCAmJiBzdGF0aWNfY2FzdDx1bnNp
Z25lZD4oZnJvbSkgPCBudW1Db2RlUG9pbnRzKCkpIHsKLSAgICAgICAgICAgIC8vIHxmcm9tfCBp
cyB3aXRoaW4gdGhpcyBzY3JpcHQgcnVuLiBTbyB3ZSBpbmRleCB0aGUgY2x1c3RlcnMgbG9nIHRv
Ci0gICAgICAgICAgICAvLyBmaW5kIHdoaWNoIGdseXBoIHRoaXMgY29kZS1wb2ludCBjb250cmli
dXRlZCB0byBhbmQgZmluZCBpdHMgeAotICAgICAgICAgICAgLy8gcG9zaXRpb24uCi0gICAgICAg
ICAgICBpbnQgZ2x5cGggPSBtX2l0ZW0ubG9nX2NsdXN0ZXJzW2Zyb21dOwotICAgICAgICAgICAg
ZnJvbVggPSBwb3NpdGlvbnMoKVtnbHlwaF0ueCgpOwotICAgICAgICAgICAgaWYgKHJ0bCgpKQot
ICAgICAgICAgICAgICAgIGZyb21YICs9IHRydW5jYXRlRml4ZWRQb2ludFRvSW50ZWdlcihtX2l0
ZW0uYWR2YW5jZXNbZ2x5cGhdKTsKLSAgICAgICAgfSBlbHNlCi0gICAgICAgICAgICBmcm9tIC09
IG51bUNvZGVQb2ludHMoKTsKLQotICAgICAgICBpZiAodG9YID09IC0xICYmIHRvID49IDAgJiYg
c3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRvKSA8IG51bUNvZGVQb2ludHMoKSkgewotICAgICAgICAg
ICAgaW50IGdseXBoID0gbV9pdGVtLmxvZ19jbHVzdGVyc1t0b107Ci0gICAgICAgICAgICB0b1gg
PSBwb3NpdGlvbnMoKVtnbHlwaF0ueCgpOwotICAgICAgICAgICAgaWYgKHJ0bCgpKQotICAgICAg
ICAgICAgICAgIHRvWCArPSB0cnVuY2F0ZUZpeGVkUG9pbnRUb0ludGVnZXIobV9pdGVtLmFkdmFu
Y2VzW2dseXBoXSk7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgdG8gLT0gbnVtQ29kZVBv
aW50cygpOworICAgICAgICB1bnNpZ25lZCBudW1Db2RlUG9pbnRzID0gbV9jdXJyZW50U2NyaXB0
UnVuLT5udW1Db2RlUG9pbnRzKCk7CisgICAgICAgIGlmIChmcm9tWCA9PSAtMSAmJiBmcm9tID49
IDAgJiYgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGZyb20pIDwgbnVtQ29kZVBvaW50cykKKyAgICAg
ICAgICAgIGZyb21YID0geFBvc2l0aW9uRm9yT2Zmc2V0SW5TY3JpcHRSdW4oZnJvbSk7CisgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgIGZyb20gLT0gbnVtQ29kZVBvaW50czsKKworICAgICAgICBp
ZiAodG9YID09IC0xICYmIHRvID49IDAgJiYgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHRvKSA8IG51
bUNvZGVQb2ludHMpCisgICAgICAgICAgICB0b1ggPSB4UG9zaXRpb25Gb3JPZmZzZXRJblNjcmlw
dFJ1bih0byk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRvIC09IG51bUNvZGVQb2ludHM7
CiAgICAgfQogCiAgICAgLy8gVGhlIHBvc2l0aW9uIGluIHF1ZXN0aW9uIG1pZ2h0IGJlIGp1c3Qg
YWZ0ZXIgdGhlIHRleHQuCiAgICAgaWYgKGZyb21YID09IC0xKQotICAgICAgICBmcm9tWCA9IG9m
ZnNldFgoKTsKKyAgICAgICAgZnJvbVggPSBzdGFydFg7CiAgICAgaWYgKHRvWCA9PSAtMSkKLSAg
ICAgICAgdG9YID0gb2Zmc2V0WCgpOworICAgICAgICB0b1ggPSBydGwoKSA/IHN0YXJ0WCA6IG1f
b2Zmc2V0WDsKIAogICAgIEFTU0VSVChmcm9tWCAhPSAtMSAmJiB0b1ggIT0gLTEpOwogCiAgICAg
aWYgKGZyb21YIDwgdG9YKQogICAgICAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIGZy
b21YLCBwb2ludC55KCksIHRvWCAtIGZyb21YLCBoZWlnaHQpOwotCiAgICAgcmV0dXJuIEZsb2F0
UmVjdChwb2ludC54KCkgKyB0b1gsIHBvaW50LnkoKSwgZnJvbVggLSB0b1gsIGhlaWdodCk7CiB9
CiAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0NvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4LmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xsZXJMaW51eC5oCmluZGV4IGUxZWQz
ZDhkZDIyMDhkMjU5YzA0NzNiMjc1MGQ0ZGZmN2I0MGM0OGIuLjIxM2NlOGNjNmJiZDE2ZGJhM2Yw
NTJjZTU0M2E2YzVhOTcyMjY1NmYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJvbGxlckxpbnV4LmgKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9s
bGVyTGludXguaApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMTAgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoYykgMjAxMSBHb29n
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zIGFyZQpAQCAtMzYsMTAgKzM2LDYgQEAKICNpbmNsdWRlICJTa1NjYWxhci5oIgogI2luY2x1
ZGUgIlRleHRSdW4uaCIKIAotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiaGFyZmJ1enotc2hhcGVy
LmgiCi19Ci0KICNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CiAjaW5jbHVkZSA8d3RmL093bkFy
cmF5UHRyLmg+CiAjaW5jbHVkZSA8d3RmL093blB0ci5oPgpAQCAtNzMsNyArNjksOCBAQCBwdWJs
aWM6CiAgICAgLy8gc2V0UGFkZGluZyBzZXRzIGEgbnVtYmVyIG9mIHBpeGVscyB0byBiZSBkaXN0
cmlidXRlZCBhY3Jvc3MgdGhlIFRleHRSdW4uCiAgICAgLy8gV2ViS2l0IHVzZXMgdGhpcyB0byBq
dXN0aWZ5IHRleHQuCiAgICAgdm9pZCBzZXRQYWRkaW5nKGludCk7Ci0gICAgdm9pZCByZXNldChp
bnQgb2Zmc2V0KTsKKyAgICAvLyBGSVhNRTogUmVtb3ZlIGFmdGVyIGhhcmZidXp6IHRyYW5zaXRp
b24gaXMgY29tcGxldGVkLgorICAgIHZvaWQgcmVzZXQoaW50IG9mZnNldCkgeyB9CiAgICAgLy8g
QWR2YW5jZSB0byB0aGUgbmV4dCBzY3JpcHQgcnVuLCByZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGUg
ZW5kIG9mIHRoZQogICAgIC8vIFRleHRSdW4gaGFzIGJlZW4gcmVhY2hlZC4KICAgICBib29sIG5l
eHRTY3JpcHRSdW4oKTsKQEAgLTg4LDI2ICs4NSwyNiBAQCBwdWJsaWM6CiAgICAgLy8gb2YgV2lk
dGhJdGVyYXRvcjo6YWR2YW5jZS4KICAgICB2b2lkIHNldExldHRlclNwYWNpbmdBZGp1c3RtZW50
KGludCBsZXR0ZXJTcGFjaW5nQWRqdXN0bWVudCkgeyBtX2xldHRlclNwYWNpbmcgPSBsZXR0ZXJT
cGFjaW5nQWRqdXN0bWVudDsgfQogICAgIGludCBsZXR0ZXJTcGFjaW5nKCkgY29uc3QgeyByZXR1
cm4gbV9sZXR0ZXJTcGFjaW5nOyB9Ci0KLSAgICB2b2lkIHNldHVwRm9yUlRMKCk7CisgICAgLy8g
RklYTUU6IFJlbW92ZSBhZnRlciBoYXJmYnV6eiB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlZC4KKyAg
ICB2b2lkIHNldHVwRm9yUlRMKCkgeyB9CiAgICAgYm9vbCBydGwoKSBjb25zdCB7IHJldHVybiBt
X3J1bi5ydGwoKTsgfQotICAgIGNvbnN0IHVpbnQxNl90KiBnbHlwaHMoKSBjb25zdCB7IHJldHVy
biBtX2dseXBoczE2OyB9CisgICAgY29uc3QgdWludDE2X3QqIGdseXBocygpIGNvbnN0IHsgcmV0
dXJuIG1fY3VycmVudFNjcmlwdFJ1bi0+Z2x5cGhzKCk7IH0KIAogICAgIC8vIFJldHVybiB0aGUg
bGVuZ3RoIG9mIHRoZSBhcnJheSByZXR1cm5lZCBieSB8Z2x5cGhzfAotICAgIGNvbnN0IHVuc2ln
bmVkIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIG1faXRlbS5udW1fZ2x5cGhzOyB9CisgICAgY29u
c3QgdW5zaWduZWQgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50U2NyaXB0UnVuLT5u
dW1HbHlwaHMoKTsgfQogCiAgICAgLy8gUmV0dXJuIHRoZSBvZmZzZXQgZm9yIGVhY2ggb2YgdGhl
IGdseXBocy4gTm90ZSB0aGF0IHRoaXMgaXMgdHJhbnNsYXRlZAogICAgIC8vIGJ5IHRoZSBjdXJy
ZW50IHggb2Zmc2V0IGFuZCB0aGF0IHRoZSB4IG9mZnNldCBpcyB1cGRhdGVkIGZvciBlYWNoIHNj
cmlwdAogICAgIC8vIHJ1bi4KLSAgICBjb25zdCBTa1BvaW50KiBwb3NpdGlvbnMoKSBjb25zdCB7
IHJldHVybiBtX3Bvc2l0aW9uczsgfQorICAgIGNvbnN0IFNrUG9pbnQqIHBvc2l0aW9ucygpIGNv
bnN0IHsgcmV0dXJuIG1fY3VycmVudFNjcmlwdFJ1bi0+cG9zaXRpb25zKCk7IH0KIAogICAgIC8v
IHJldHVybiB0aGUgbnVtYmVyIG9mIGNvZGUgcG9pbnRzIGluIHRoZSBjdXJyZW50IHNjcmlwdCBy
dW4KLSAgICBjb25zdCB1bnNpZ25lZCBudW1Db2RlUG9pbnRzKCkgY29uc3QgeyByZXR1cm4gbV9p
dGVtLml0ZW0ubGVuZ3RoOyB9CisgICAgY29uc3QgdW5zaWduZWQgbnVtQ29kZVBvaW50cygpIGNv
bnN0IHsgcmV0dXJuIG1fY3VycmVudFNjcmlwdFJ1bi0+bnVtQ29kZVBvaW50cygpOyB9CiAKICAg
ICAvLyBSZXR1cm4gdGhlIGN1cnJlbnQgcGl4ZWwgcG9zaXRpb24gb2YgdGhlIGNvbnRyb2xsZXIu
CiAgICAgY29uc3QgdW5zaWduZWQgb2Zmc2V0WCgpIGNvbnN0IHsgcmV0dXJuIG1fb2Zmc2V0WDsg
fQogCi0gICAgY29uc3QgRm9udFBsYXRmb3JtRGF0YSogZm9udFBsYXRmb3JtRGF0YUZvclNjcmlw
dFJ1bigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KG1faXRl
bS5mb250LT51c2VyRGF0YSk7IH0KKyAgICBjb25zdCBGb250UGxhdGZvcm1EYXRhKiBmb250UGxh
dGZvcm1EYXRhRm9yU2NyaXB0UnVuKCk7CiAKICAgICBpbnQgb2Zmc2V0Rm9yUG9zaXRpb24oaW50
KTsKICAgICBGbG9hdFJlY3Qgc2VsZWN0aW9uUmVjdChjb25zdCBGbG9hdFBvaW50JiwgaW50IGhl
aWdodCwgaW50IGZyb20gLCBpbnQgdG8pOwpAQCAtMTE2LDM1ICsxMTMsMzEgQEAgcHJpdmF0ZToK
ICAgICAvLyBSZXR1cm4gdGhlIHdpZHRoIChpbiBweCkgb2YgdGhlIGN1cnJlbnQgc2NyaXB0IHJ1
bi4KICAgICB1bnNpZ25lZCB3aWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1fcGl4ZWxXaWR0aDsgfQog
Ci0gICAgdm9pZCBzZXR1cEZvbnRGb3JTY3JpcHRSdW4oKTsKLSAgICB2b2lkIGRlbGV0ZUdseXBo
QXJyYXlzKCk7Ci0gICAgdm9pZCBjcmVhdGVHbHlwaEFycmF5cyhpbnQpOwotICAgIHZvaWQgcmVz
ZXRHbHlwaEFycmF5cygpOwotICAgIHZvaWQgc2hhcGVHbHlwaHMoKTsKLSAgICB2b2lkIHNldEds
eXBoUG9zaXRpb25zKGJvb2wpOworICAgIHZvaWQgc2V0dXBTY3JpcHRSdW4oKTsKKyAgICB2b2lk
IHNoYXBlU2NyaXB0UnVuKCk7CisgICAgdm9pZCBzZXRHbHlwaFBvc2l0aW9ucygpOwogCi0gICAg
c3RhdGljIHZvaWQgbm9ybWFsaXplU3BhY2VzQW5kTWlycm9yQ2hhcnMoY29uc3QgVUNoYXIqIHNv
dXJjZSwgYm9vbCBydGwsIFVDaGFyKiBkZXN0aW5hdGlvbiwgaW50IGxlbmd0aCk7CisgICAgc3Rh
dGljIHZvaWQgbm9ybWFsaXplU3BhY2VzKGNvbnN0IFVDaGFyKiBzb3VyY2UsIGJvb2wgcnRsLCBV
Q2hhciogZGVzdGluYXRpb24sIGludCBsZW5ndGgpOwogICAgIHN0YXRpYyBjb25zdCBUZXh0UnVu
JiBnZXROb3JtYWxpemVkVGV4dFJ1bihjb25zdCBUZXh0UnVuJiBvcmlnaW5hbFJ1biwgT3duUHRy
PFRleHRSdW4+JiBub3JtYWxpemVkUnVuLCBPd25BcnJheVB0cjxVQ2hhcj4mIG5vcm1hbGl6ZWRC
dWZmZXIpOwogCiAgICAgLy8gVGhpcyBtYXRjaGVzIHRoZSBsb2dpYyBpbiBSZW5kZXJCbG9jazo6
ZmluZE5leHRMaW5lQnJlYWsKLSAgICBzdGF0aWMgYm9vbCBpc0NvZGVwb2ludFNwYWNlKEhCX1VD
aGFyMTYgYykgeyByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnOyB9CisgICAgc3RhdGljIGJv
b2wgaXNDb2RlcG9pbnRTcGFjZShVQ2hhciBjKSB7IHJldHVybiBjID09ICcgJyB8fCBjID09ICdc
dCc7IH0KIAogICAgIGludCBnbHlwaEluZGV4Rm9yWFBvc2l0aW9uSW5TY3JpcHRSdW4oaW50IHRh
cmdldFgpIGNvbnN0OworICAgIGludCB4UG9zaXRpb25Gb3JPZmZzZXRJblNjcmlwdFJ1bih1bnNp
Z25lZCBvZmZzZXQpIGNvbnN0OwogCiAgICAgY29uc3QgRm9udCogY29uc3QgbV9mb250OwogICAg
IGNvbnN0IFNpbXBsZUZvbnREYXRhKiBtX2N1cnJlbnRGb250RGF0YTsKLSAgICBIQl9TaGFwZXJJ
dGVtIG1faXRlbTsKLSAgICB1aW50MTZfdCogbV9nbHlwaHMxNjsgLy8gQSB2ZWN0b3Igb2YgMTYt
Yml0IGdseXBoIGlkcy4KLSAgICBTa1BvaW50KiBtX3Bvc2l0aW9uczsgLy8gQSB2ZWN0b3Igb2Yg
cG9zaXRpb25zIGZvciBlYWNoIGdseXBoLgotICAgIHNzaXplX3QgbV9pbmRleE9mTmV4dFNjcmlw
dFJ1bjsgLy8gSW5kZXhlcyB0aGUgc2NyaXB0IHJ1biBpbiB8bV9ydW58LgotICAgIGludCBtX29m
ZnNldFg7IC8vIE9mZnNldCBpbiBwaXhlbHMgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHNjcmlw
dCBydW4uCi0gICAgaW50IG1fc3RhcnRpbmdZOyAvLyBUaGUgWSBzdGFydGluZyBwb2ludCBvZiB0
aGUgc2NyaXB0IHJ1bi4KKyAgICBzc2l6ZV90IG1faW5kZXhPZkN1cnJlbnRTY3JpcHRSdW47Cisg
ICAgc3NpemVfdCBtX2luZGV4T2ZOZXh0U2NyaXB0UnVuOworICAgIHVuc2lnbmVkIG1fb2Zmc2V0
WDsgLy8gT2Zmc2V0IGluIHBpeGVscyB0byB0aGUgc3RhcnQgb2YgdGhlIG5leHQgc2NyaXB0IHJ1
bi4KKyAgICB1bnNpZ25lZCBtX3N0YXJ0aW5nWTsgLy8gVGhlIFkgc3RhcnRpbmcgcG9pbnQgb2Yg
dGhlIHNjcmlwdCBydW4uCiAgICAgdW5zaWduZWQgbV9waXhlbFdpZHRoOyAvLyBXaWR0aCAoaW4g
cHgpIG9mIHRoZSBjdXJyZW50IHNjcmlwdCBydW4uCi0gICAgdW5zaWduZWQgbV9nbHlwaHNBcnJh
eUNhcGFjaXR5OyAvLyBDdXJyZW50IHNpemUgb2YgYWxsIHRoZSBIYXJmYnV6eiBhcnJheXMuCiAK
ICAgICBPd25QdHI8VGV4dFJ1bj4gbV9ub3JtYWxpemVkUnVuOwogICAgIE93bkFycmF5UHRyPFVD
aGFyPiBtX25vcm1hbGl6ZWRCdWZmZXI7IC8vIEEgYnVmZmVyIGZvciBub3JtYWxpemVkIHJ1bi4K
ICAgICBjb25zdCBUZXh0UnVuJiBtX3J1bjsKKyAgICBPd25QdHI8SGFyZmJ1enpTY3JpcHRSdW4+
IG1fY3VycmVudFNjcmlwdFJ1bjsKICAgICBpbnQgbV93b3JkU3BhY2luZ0FkanVzdG1lbnQ7IC8v
IGRlbHRhIGFkanVzdG1lbnQgKHBpeGVscykgZm9yIGVhY2ggd29yZCBicmVhay4KICAgICBmbG9h
dCBtX3BhZGRpbmc7IC8vIHBpeGVscyB0byBiZSBkaXN0cmlidXRlZCBvdmVyIHRoZSBsaW5lIGF0
IHdvcmQgYnJlYWtzLgogICAgIGZsb2F0IG1fcGFkUGVyV29yZEJyZWFrOyAvLyBwaXhlbHMgdG8g
YmUgYWRkZWQgdG8gZWFjaCB3b3JkIGJyZWFrLgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSGFyZmJ1enpTa2lhLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0hhcmZidXp6U2tpYS5jcHAKaW5kZXggYjk0
ZWQxYTg5ZmI3Y2RlZjdhYmNlMWI3ZmRmOTAyODk2MTZmNDUwNi4uMzMxZWM2OTFiMWE0MTk0YjIy
NDk1MGJjZWE5MjY4MjJlZjQ0MTc3ZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvY2hyb21pdW0vSGFyZmJ1enpTa2lhLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEuY3BwCkBAIC0xLDUgKzEs
NSBAQAogLyoKLSAqIENvcHlyaWdodCAoYykgMjAwOSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMCw4ICszMCwx
MCBAQAogCiAjaW5jbHVkZSAiY29uZmlnLmgiCiAKKyNpbmNsdWRlICJIYXJmYnV6elNraWEuaCIK
KwogI2luY2x1ZGUgIkZvbnRQbGF0Zm9ybURhdGEuaCIKLSNpbmNsdWRlICJ3dGYvT3duQXJyYXlQ
dHIuaCIKKyNpbmNsdWRlICJTaW1wbGVGb250RGF0YS5oIgogCiAjaW5jbHVkZSAiU2tGb250SG9z
dC5oIgogI2luY2x1ZGUgIlNrUGFpbnQuaCIKQEAgLTM5LDIwMSArNDEsMjM0IEBACiAjaW5jbHVk
ZSAiU2tQb2ludC5oIgogI2luY2x1ZGUgIlNrUmVjdC5oIgogI2luY2x1ZGUgIlNrVXRpbHMuaCIK
LQotZXh0ZXJuICJDIiB7Ci0jaW5jbHVkZSAiaGFyZmJ1enotc2hhcGVyLmgiCi19Ci0KLS8vIFRo
aXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBjYWxsYmFja3Mgd2hpY2ggSGFyZmJ1enogcmVxdWlyZXMg
YnkgdXNpbmcgU2tpYQotLy8gY2FsbHMuIFNlZSB0aGUgSGFyZmJ1enogc291cmNlIGZvciByZWZl
cmVuY2VzIGFib3V0IHdoYXQgdGhlc2UgY2FsbGJhY2tzIGRvLgorI2luY2x1ZGUgImhiLWdsaWIu
aCIKKyNpbmNsdWRlICJoYi1vdC1sYXlvdXQuaCIKKyNpbmNsdWRlICJoYi5oIgorI2luY2x1ZGUg
PHd0Zi9Pd25BcnJheVB0ci5oPgogCiBuYW1lc3BhY2UgV2ViQ29yZSB7CiAKLXN0YXRpYyBIQl9G
aXhlZCBTa2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKFNrU2NhbGFyIHZhbHVlKQorc3RhdGljIGhi
X3Bvc2l0aW9uX3QgU2tpYVNjYWxhclRvSGFyZmJ1enpQb3NpdGlvbihTa1NjYWxhciB2YWx1ZSkK
IHsKLSAgICAvLyBIQl9GaXhlZCBpcyBhIDI2LjYgZml4ZWQgcG9pbnQgZm9ybWF0LgorICAgIC8v
IGhiX3Bvc2l0aW9uX3QgaXMgYSAyNi42IGZpeGVkIHBvaW50IGZvcm1hdC4KICAgICByZXR1cm4g
dmFsdWUgKiA2NDsKIH0KIAotc3RhdGljIEhCX0Jvb2wgc3RyaW5nVG9HbHlwaHMoSEJfRm9udCBo
YkZvbnQsIGNvbnN0IEhCX1VDaGFyMTYqIGNoYXJhY3RlcnMsIGhiX3VpbnQzMiBsZW5ndGgsIEhC
X0dseXBoKiBnbHlwaHMsIGhiX3VpbnQzMiogZ2x5cGhzU2l6ZSwgSEJfQm9vbCBpc1JUTCkKK3N0
YXRpYyB2b2lkIFNraWFHZXRHbHlwaFdpZHRoQW5kRXh0ZW50cyhTa1BhaW50KiBwYWludCwgaGJf
Y29kZXBvaW50X3QgY29kZXBvaW50LCBoYl9wb3NpdGlvbl90KiB3aWR0aCwgaGJfZ2x5cGhfZXh0
ZW50c190KiBleHRlbnRzKQogewotICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZvbnQgPSByZWludGVy
cHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPihoYkZvbnQtPnVzZXJEYXRhKTsKLSAgICBTa1Bh
aW50IHBhaW50OwotCi0gICAgZm9udC0+c2V0dXBQYWludCgmcGFpbnQpOwotICAgIHBhaW50LnNl
dFRleHRFbmNvZGluZyhTa1BhaW50OjprVVRGMTZfVGV4dEVuY29kaW5nKTsKLQotICAgIHVuc2ln
bmVkIGNvZGVwb2ludHMgPSAwOwotICAgIGZvciAoaGJfdWludDMyIGkgPSAwOyBpIDwgbGVuZ3Ro
OyBpKyspIHsKLSAgICAgICAgaWYgKCFTa1VURjE2X0lzSGlnaFN1cnJvZ2F0ZShjaGFyYWN0ZXJz
W2ldKSkKLSAgICAgICAgICAgIGNvZGVwb2ludHMrKzsKLSAgICAgICAgaWYgKGNvZGVwb2ludHMg
PiAqZ2x5cGhzU2l6ZSkKLSAgICAgICAgICAgIHJldHVybiAwOworICAgIHBhaW50LT5zZXRUZXh0
RW5jb2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKKworICAgIFNrU2NhbGFy
IHNrV2lkdGg7CisgICAgU2tSZWN0IHNrQm91bmRzOworICAgIHVpbnQxNl90IGdseXBoID0gY29k
ZXBvaW50OworCisgICAgcGFpbnQtPmdldFRleHRXaWR0aHMoJmdseXBoLCBzaXplb2YoZ2x5cGgp
LCAmc2tXaWR0aCwgJnNrQm91bmRzKTsKKyAgICBpZiAod2lkdGgpCisgICAgICAgICp3aWR0aCA9
IFNraWFTY2FsYXJUb0hhcmZidXp6UG9zaXRpb24oc2tXaWR0aCk7CisgICAgaWYgKGV4dGVudHMp
IHsKKyAgICAgICAgZXh0ZW50cy0+eF9iZWFyaW5nID0gU2tpYVNjYWxhclRvSGFyZmJ1enpQb3Np
dGlvbihza0JvdW5kcy5mTGVmdCk7CisgICAgICAgIGV4dGVudHMtPnlfYmVhcmluZyA9IFNraWFT
Y2FsYXJUb0hhcmZidXp6UG9zaXRpb24oc2tCb3VuZHMuZlRvcCk7CisgICAgICAgIGV4dGVudHMt
PndpZHRoID0gU2tpYVNjYWxhclRvSGFyZmJ1enpQb3NpdGlvbihza0JvdW5kcy53aWR0aCgpKTsK
KyAgICAgICAgZXh0ZW50cy0+aGVpZ2h0ID0gU2tpYVNjYWxhclRvSGFyZmJ1enpQb3NpdGlvbihz
a0JvdW5kcy5oZWlnaHQoKSk7CiAgICAgfQorfQogCi0gICAgaW50IG51bUdseXBocyA9IHBhaW50
LnRleHRUb0dseXBocyhjaGFyYWN0ZXJzLCBsZW5ndGggKiBzaXplb2YodWludDE2X3QpLCByZWlu
dGVycHJldF9jYXN0PHVpbnQxNl90Kj4oZ2x5cGhzKSk7CisvLyBPdXIgaW1wbGVtZW50YXRpb24g
b2YgdGhlIGNhbGxiYWNrcyB3aGljaCBIYXJmYnV6eiByZXF1aXJlcyBieSB1c2luZyBTa2lhCisv
LyBjYWxscy4gU2VlIHRoZSBIYXJmYnV6eiBzb3VyY2UgZm9yIHJlZmVyZW5jZXMgYWJvdXQgd2hh
dCB0aGVzZSBjYWxsYmFja3MgZG8uCiAKLSAgICAvLyBIQl9HbHlwaCBpcyAzMi1iaXQsIGJ1dCBT
a2lhIG91dHB1dHMgb25seSAxNi1iaXQgbnVtYmVycy4gU28gb3VyCi0gICAgLy8gfGdseXBoc3wg
YXJyYXkgbmVlZHMgdG8gYmUgY29udmVydGVkLgotICAgIGZvciAoaW50IGkgPSBudW1HbHlwaHMg
LSAxOyBpID49IDA7IC0taSkgewotICAgICAgICB1aW50MTZfdCB2YWx1ZTsKLSAgICAgICAgLy8g
V2UgdXNlIGEgbWVtY3B5IHRvIGF2b2lkIGJyZWFraW5nIHN0cmljdCBhbGlhc2luZyBydWxlcy4K
LSAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZ2x5cGhzKSAr
IHNpemVvZih1aW50MTZfdCkgKiBpLCBzaXplb2YodWludDE2X3QpKTsKLSAgICAgICAgZ2x5cGhz
W2ldID0gdmFsdWU7Ci0gICAgfQorc3RhdGljIGhiX2Jvb2xfdCBoYXJmYnV6ekdldEdseXBoKGhi
X2ZvbnRfdCogaGJGb250LCB2b2lkKiBmb250RGF0YSwgaGJfY29kZXBvaW50X3QgdW5pY29kZSwg
aGJfY29kZXBvaW50X3QgdmFyaWF0aW9uU2VsZWN0b3IsIGhiX2NvZGVwb2ludF90KiBnbHlwaCwg
dm9pZCogdXNlckRhdGEpCit7CisgICAgRm9udFBsYXRmb3JtRGF0YSogZm9udCA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KGZvbnREYXRhKTsKKyAgICBTa1BhaW50IHBhaW50
OwogCi0gICAgKmdseXBoc1NpemUgPSBudW1HbHlwaHM7Ci0gICAgcmV0dXJuIDE7CisgICAgZm9u
dC0+c2V0dXBQYWludCgmcGFpbnQpOworICAgIHBhaW50LnNldFRleHRFbmNvZGluZyhTa1BhaW50
OjprVVRGMTZfVGV4dEVuY29kaW5nKTsKKyAgICB1aW50MTZfdCB0ZXh0WzRdOworICAgIHNpemVf
dCBsZW5ndGggPSBTa1VURjE2X0Zyb21VbmljaGFyKHVuaWNvZGUsIHRleHQpOworICAgIHVpbnQx
Nl90IGdseXBoMTY7CisgICAgcGFpbnQudGV4dFRvR2x5cGhzKHRleHQsIGxlbmd0aCwgJmdseXBo
MTYpOworICAgICpnbHlwaCA9IGdseXBoMTY7CisgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRp
YyB2b2lkIGdseXBoc1RvQWR2YW5jZXMoSEJfRm9udCBoYkZvbnQsIGNvbnN0IEhCX0dseXBoKiBn
bHlwaHMsIGhiX3VpbnQzMiBudW1HbHlwaHMsIEhCX0ZpeGVkKiBhZHZhbmNlcywgaW50IGZsYWdz
KQorc3RhdGljIGhiX3Bvc2l0aW9uX3QgaGFyZmJ1enpHZXRHbHlwaEhvcml6b250YWxBZHZhbmNl
KGhiX2ZvbnRfdCogaGJGb250LCB2b2lkKiBmb250RGF0YSwgaGJfY29kZXBvaW50X3QgZ2x5cGgs
IHZvaWQqIHVzZXJEYXRhKQogewotICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZvbnQgPSByZWludGVy
cHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPihoYkZvbnQtPnVzZXJEYXRhKTsKKyAgICBGb250
UGxhdGZvcm1EYXRhKiBmb250ID0gcmVpbnRlcnByZXRfY2FzdDxGb250UGxhdGZvcm1EYXRhKj4o
Zm9udERhdGEpOworICAgIGhiX3Bvc2l0aW9uX3QgYWR2YW5jZSA9IDA7CiAgICAgU2tQYWludCBw
YWludDsKIAogICAgIGZvbnQtPnNldHVwUGFpbnQoJnBhaW50KTsKLSAgICBwYWludC5zZXRUZXh0
RW5jb2RpbmcoU2tQYWludDo6a0dseXBoSURfVGV4dEVuY29kaW5nKTsKLQotICAgIE93bkFycmF5
UHRyPHVpbnQxNl90PiBnbHlwaHMxNiA9IGFkb3B0QXJyYXlQdHIobmV3IHVpbnQxNl90W251bUds
eXBoc10pOwotICAgIGlmICghZ2x5cGhzMTYuZ2V0KCkpCi0gICAgICAgIHJldHVybjsKLSAgICBm
b3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kpCi0gICAgICAgIGdseXBoczE2
W2ldID0gZ2x5cGhzW2ldOwotICAgIHBhaW50LmdldFRleHRXaWR0aHMoZ2x5cGhzMTYuZ2V0KCks
IG51bUdseXBocyAqIHNpemVvZih1aW50MTZfdCksIHJlaW50ZXJwcmV0X2Nhc3Q8U2tTY2FsYXIq
PihhZHZhbmNlcykpOwotCi0gICAgLy8gVGhlIHxhZHZhbmNlc3wgdmFsdWVzIHdoaWNoIFNraWEg
b3V0cHV0cyBhcmUgU2tTY2FsYXJzLCB3aGljaCBhcmUgZmxvYXRzCi0gICAgLy8gaW4gQ2hyb21p
dW0uIEhvd2V2ZXIsIEhhcmZidXp6IHdhbnRzIHRoZW0gaW4gMjYuNiBmaXhlZCBwb2ludCBmb3Jt
YXQuCi0gICAgLy8gVGhlc2UgdHdvIGZvcm1hdHMgYXJlIGJvdGggMzItYml0cyBsb25nLgotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgewotICAgICAgICBmbG9h
dCB2YWx1ZTsKLSAgICAgICAgLy8gV2UgdXNlIGEgbWVtY3B5IHRvIGF2b2lkIGJyZWFraW5nIHN0
cmljdCBhbGlhc2luZyBydWxlcy4KLSAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgcmVpbnRlcnByZXRf
Y2FzdDxjaGFyKj4oYWR2YW5jZXMpICsgc2l6ZW9mKGZsb2F0KSAqIGksIHNpemVvZihmbG9hdCkp
OwotICAgICAgICBhZHZhbmNlc1tpXSA9IFNraWFTY2FsYXJUb0hhcmZidXp6Rml4ZWQodmFsdWUp
OwotICAgIH0KKyAgICBTa2lhR2V0R2x5cGhXaWR0aEFuZEV4dGVudHMoJnBhaW50LCBnbHlwaCwg
JmFkdmFuY2UsIDApOworICAgIHJldHVybiBhZHZhbmNlOwogfQogCi1zdGF0aWMgSEJfQm9vbCBj
YW5SZW5kZXIoSEJfRm9udCBoYkZvbnQsIGNvbnN0IEhCX1VDaGFyMTYqIGNoYXJhY3RlcnMsIGhi
X3VpbnQzMiBsZW5ndGgpCitzdGF0aWMgaGJfcG9zaXRpb25fdCBoYXJmYnV6ekdldEdseXBoVmVy
dGljYWxBZHZhbmNlKGhiX2ZvbnRfdCogaGJGb250LCB2b2lkKiBmb250RGF0YSwgaGJfY29kZXBv
aW50X3QgZ2x5cGgsIHZvaWQqIHVzZXJEYXRhKQogewotICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZv
bnQgPSByZWludGVycHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPihoYkZvbnQtPnVzZXJEYXRh
KTsKLSAgICBTa1BhaW50IHBhaW50OworICAgIC8vIEZJWE1FOiBDYW4ndCBzdXBwb3J0IHZlcnRp
Y2FsIGFkdmFuY2UgZm9yIG5vdyBiZWNhdXNlIFNraWEgZG9lc24ndCBwcm92aWRlIHN1Y2ggZmVh
dHVyZXMuCisgICAgcmV0dXJuIDA7Cit9CiAKLSAgICBmb250LT5zZXR1cFBhaW50KCZwYWludCk7
Ci0gICAgcGFpbnQuc2V0VGV4dEVuY29kaW5nKFNrUGFpbnQ6OmtVVEYxNl9UZXh0RW5jb2Rpbmcp
Oworc3RhdGljIGhiX2Jvb2xfdCBoYXJmYnV6ekdldEdseXBoSG9yaXpvbnRhbE9yaWdpbihoYl9m
b250X3QqIGhiRm9udCwgdm9pZCogZm9udERhdGEsIGhiX2NvZGVwb2ludF90IGdseXBoLCBoYl9w
b3NpdGlvbl90KiB4LCBoYl9wb3NpdGlvbl90KiB5LCB2b2lkKiB1c2VyRGF0YSkKK3sKKyAgICAv
LyBKdXN0IHJldHVybiB0cnVlLCBmb2xsb3dpbmcgdGhlIHdheSB0aGF0IEhhcmZidXp6LUZyZWVU
eXBlCisgICAgLy8gaW1wbGVtZW50YXRpb24gZG9lcy4KKyAgICByZXR1cm4gdHJ1ZTsKK30KIAot
ICAgIE93bkFycmF5UHRyPHVpbnQxNl90PiBnbHlwaHMxNiA9IGFkb3B0QXJyYXlQdHIobmV3IHVp
bnQxNl90W2xlbmd0aF0pOwotICAgIGlmICghZ2x5cGhzMTYuZ2V0KCkpCi0gICAgICAgIHJldHVy
biAwOwotICAgIGludCBudW1HbHlwaHMgPSBwYWludC50ZXh0VG9HbHlwaHMoY2hhcmFjdGVycywg
bGVuZ3RoICogc2l6ZW9mKHVpbnQxNl90KSwgZ2x5cGhzMTYuZ2V0KCkpOwotCi0gICAgYm9vbCBj
YW5SZW5kZXIgPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtR2x5cGhzOyArK2kp
IHsKLSAgICAgICAgaWYgKCFnbHlwaHMxNltpXSkgewotICAgICAgICAgICAgY2FuUmVuZGVyID0g
ZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KK3N0YXRpYyBoYl9i
b29sX3QgaGFyZmJ1enpHZXRHbHlwaFZlcnRpY2FsT3JpZ2luKGhiX2ZvbnRfdCogaGJGb250LCB2
b2lkKiBmb250RGF0YSwgaGJfY29kZXBvaW50X3QgZ2x5cGgsIGhiX3Bvc2l0aW9uX3QqIHgsIGhi
X3Bvc2l0aW9uX3QqIHksIHZvaWQqIHVzZXJEYXRhKQoreworICAgIC8vIEZJWE1FOiBDYW4ndCBz
dXBwb3J0IHZlcnRpY2FsIG9yaWdpbiBmb3Igbm93IGJlY2F1c2UgU2tpYSBkb2Vzbid0IHByb3Zp
ZGUgc3VjaCBmZWF0dXJlcy4KKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKLSAgICByZXR1cm4gY2Fu
UmVuZGVyOworc3RhdGljIGhiX3Bvc2l0aW9uX3QgaGFyZmJ1enpHZXRHbHlwaEhvcml6b250YWxL
ZXJuaW5nKGhiX2ZvbnRfdCogaGJGb250LCB2b2lkKiBmb250RGF0YSwgaGJfY29kZXBvaW50X3Qg
bGVmdEdseXBoLCBoYl9jb2RlcG9pbnRfdCByaWdodEdseXBoLCB2b2lkKiB1c2VyRGF0YSkKK3sK
KyAgICAvLyBGSVhNRTogV2UgbWlnaHQgd2FudCB0byBoYXZlIGEgU2tpYSBBUEkgd2hpY2ggYWxs
b3dzIHVzIHRvIGdldCBrZXJuaW5nIGZyb20gdGhlIGZvbnQgdG8gaW1wbGVtZW50IHRoaXMgY2Fs
bGJhY2suCisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBIQl9FcnJvciBnZXRPdXRsaW5lUG9p
bnQoSEJfRm9udCBoYkZvbnQsIEhCX0dseXBoIGdseXBoLCBpbnQgZmxhZ3MsIGhiX3VpbnQzMiBw
b2ludCwgSEJfRml4ZWQqIHhQb3MsIEhCX0ZpeGVkKiB5UG9zLCBoYl91aW50MzIqIHJlc3VsdGlu
Z051bVBvaW50cykKK3N0YXRpYyBoYl9wb3NpdGlvbl90IGhhcmZidXp6R2V0R2x5cGhWZXJ0aWNh
bEtlcm5pbmcoaGJfZm9udF90KiBoYkZvbnQsIHZvaWQqIGZvbnREYXRhLCBoYl9jb2RlcG9pbnRf
dCB0b3BHbHlwaCwgaGJfY29kZXBvaW50X3QgYm90dG9tR2x5cGgsIHZvaWQqIHVzZXJEYXRhKQog
ewotICAgIC8vIFdlIGNhbm5vdCBwcm92aWRlIHRoZSByaWdodCBwb3NpdGlvbiBvZiBvdXRsaW5l
IHBvaW50cyBmcm9tIHBvaW50IGluZGV4LgotICAgIC8vIEp1c3QgcmV0dXJuIEhCX0Vycl9PayB3
aXRoIHJlc3VsdGluZ051bVBvaW50cyA9IDAgc28gdGhhdCBoYXJmYnV6egotICAgIC8vIGZhbGxz
IGJhY2sgb24gdXNpbmcgZGVzaWduIGNvb3JkaW5hdGUgdmFsdWUgcGFpci4KLSAgICAvLyBTZWUg
aHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTYwMDc5IGZvciBtb3JlIGRl
dGFpbHMuCi0gICAgKnJlc3VsdGluZ051bVBvaW50cyA9IDA7Ci0gICAgcmV0dXJuIEhCX0Vycl9P
azsKKyAgICAvLyBXb24ndCBzdXBwb3J0IHZlcnRpY2FsIGtlcm5pbmcgYmVjYXVzZSBGcmVlVHlw
ZSBkb2Vzbid0IHN1cHBvcnQgaXQuCisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGdl
dEdseXBoTWV0cmljcyhIQl9Gb250IGhiRm9udCwgSEJfR2x5cGggZ2x5cGgsIEhCX0dseXBoTWV0
cmljcyogbWV0cmljcykKK3N0YXRpYyBoYl9ib29sX3QgaGFyZmJ1enpHZXRHbHlwaEV4dGVudHMo
aGJfZm9udF90KiBoYkZvbnQsIHZvaWQqIGZvbnREYXRhLCBoYl9jb2RlcG9pbnRfdCBnbHlwaCwg
aGJfZ2x5cGhfZXh0ZW50c190KiBleHRlbnRzLCB2b2lkKiB1c2VyRGF0YSkKIHsKLSAgICBGb250
UGxhdGZvcm1EYXRhKiBmb250ID0gcmVpbnRlcnByZXRfY2FzdDxGb250UGxhdGZvcm1EYXRhKj4o
aGJGb250LT51c2VyRGF0YSk7CisgICAgRm9udFBsYXRmb3JtRGF0YSogZm9udCA9IHJlaW50ZXJw
cmV0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KGZvbnREYXRhKTsKICAgICBTa1BhaW50IHBhaW50
OwogCiAgICAgZm9udC0+c2V0dXBQYWludCgmcGFpbnQpOwotICAgIHBhaW50LnNldFRleHRFbmNv
ZGluZyhTa1BhaW50OjprR2x5cGhJRF9UZXh0RW5jb2RpbmcpOwotICAgIHVpbnQxNl90IGdseXBo
MTYgPSBnbHlwaDsKLSAgICBTa1NjYWxhciB3aWR0aDsKLSAgICBTa1JlY3QgYm91bmRzOwotICAg
IHBhaW50LmdldFRleHRXaWR0aHMoJmdseXBoMTYsIHNpemVvZihnbHlwaDE2KSwgJndpZHRoLCAm
Ym91bmRzKTsKKyAgICBTa2lhR2V0R2x5cGhXaWR0aEFuZEV4dGVudHMoJnBhaW50LCBnbHlwaCwg
MCwgZXh0ZW50cyk7CisgICAgcmV0dXJuIHRydWU7Cit9CiAKLSAgICBtZXRyaWNzLT54ID0gU2tp
YVNjYWxhclRvSGFyZmJ1enpGaXhlZChib3VuZHMuZkxlZnQpOwotICAgIG1ldHJpY3MtPnkgPSBT
a2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKGJvdW5kcy5mVG9wKTsKLSAgICBtZXRyaWNzLT53aWR0
aCA9IFNraWFTY2FsYXJUb0hhcmZidXp6Rml4ZWQoYm91bmRzLndpZHRoKCkpOwotICAgIG1ldHJp
Y3MtPmhlaWdodCA9IFNraWFTY2FsYXJUb0hhcmZidXp6Rml4ZWQoYm91bmRzLmhlaWdodCgpKTsK
K3N0YXRpYyBoYl9ib29sX3QgaGFyZmJ1enpHZXRHbHlwaENvbnRvdXJQb2ludChoYl9mb250X3Qq
IGhiRm9udCwgdm9pZCogZm9udERhdGEsIGhiX2NvZGVwb2ludF90IGdseXBoLCB1bnNpZ25lZCBp
bnQgcG9pbnRJbmRleCwgaGJfcG9zaXRpb25fdCogeCwgaGJfcG9zaXRpb25fdCogeSwgdm9pZCog
dXNlckRhdGEpCit7CisgICAgLy8gV2UgY2FuJ3Qgc3VwcG9ydCB0aGlzLiAoU2tpYSBkb2Vzbid0
IHByb3ZpZGUgdGhlIGZlYXR1cmUpCisgICAgcmV0dXJuIGZhbHNlOworfQogCi0gICAgbWV0cmlj
cy0+eE9mZnNldCA9IFNraWFTY2FsYXJUb0hhcmZidXp6Rml4ZWQod2lkdGgpOwotICAgIC8vIFdl
IGNhbid0IGFjdHVhbGx5IGdldCB0aGUgfHl8IGNvcnJlY3QgYmVjYXVzZSBTa2lhIGRvZXNuJ3Qg
ZXhwb3J0Ci0gICAgLy8gdGhlIHZlcnRpY2FsIGFkdmFuY2UuIEhvd2V2ZXIsIG5vciB3ZSBkbyBl
dmVyIHJlbmRlciB2ZXJ0aWNhbCB0ZXh0IGF0Ci0gICAgLy8gdGhlIG1vbWVudCBzbyBpdCdzIHVu
aW1wb3J0YW50LgotICAgIG1ldHJpY3MtPnlPZmZzZXQgPSAwOworc3RhdGljIGhiX2ZvbnRfZnVu
Y3NfdCogaGFyZmJ1enpTa2lhRm9udEZ1bmNzID0gMDsKKworc3RhdGljIGhiX2ZvbnRfZnVuY3Nf
dCogaGFyZmJ1enpTa2lhR2V0Rm9udEZ1bmNzKCkKK3sKKyAgICBpZiAoIWhhcmZidXp6U2tpYUZv
bnRGdW5jcykgeworICAgICAgICBoYXJmYnV6elNraWFGb250RnVuY3MgPSBoYl9mb250X2Z1bmNz
X2NyZWF0ZSgpOworICAgICAgICBoYl9mb250X2Z1bmNzX3NldF9nbHlwaF9mdW5jKGhhcmZidXp6
U2tpYUZvbnRGdW5jcywgaGFyZmJ1enpHZXRHbHlwaCwgMCwgMCk7CisgICAgICAgIGhiX2ZvbnRf
ZnVuY3Nfc2V0X2dseXBoX2hfYWR2YW5jZV9mdW5jKGhhcmZidXp6U2tpYUZvbnRGdW5jcywgaGFy
ZmJ1enpHZXRHbHlwaEhvcml6b250YWxBZHZhbmNlLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9m
dW5jc19zZXRfZ2x5cGhfdl9hZHZhbmNlX2Z1bmMoaGFyZmJ1enpTa2lhRm9udEZ1bmNzLCBoYXJm
YnV6ekdldEdseXBoVmVydGljYWxBZHZhbmNlLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9mdW5j
c19zZXRfZ2x5cGhfaF9vcmlnaW5fZnVuYyhoYXJmYnV6elNraWFGb250RnVuY3MsIGhhcmZidXp6
R2V0R2x5cGhIb3Jpem9udGFsT3JpZ2luLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9mdW5jc19z
ZXRfZ2x5cGhfdl9vcmlnaW5fZnVuYyhoYXJmYnV6elNraWFGb250RnVuY3MsIGhhcmZidXp6R2V0
R2x5cGhWZXJ0aWNhbE9yaWdpbiwgMCwgMCk7CisgICAgICAgIGhiX2ZvbnRfZnVuY3Nfc2V0X2ds
eXBoX2hfa2VybmluZ19mdW5jKGhhcmZidXp6U2tpYUZvbnRGdW5jcywgaGFyZmJ1enpHZXRHbHlw
aEhvcml6b250YWxLZXJuaW5nLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9mdW5jc19zZXRfZ2x5
cGhfdl9rZXJuaW5nX2Z1bmMoaGFyZmJ1enpTa2lhRm9udEZ1bmNzLCBoYXJmYnV6ekdldEdseXBo
VmVydGljYWxLZXJuaW5nLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9mdW5jc19zZXRfZ2x5cGhf
ZXh0ZW50c19mdW5jKGhhcmZidXp6U2tpYUZvbnRGdW5jcywgaGFyZmJ1enpHZXRHbHlwaEV4dGVu
dHMsIDAsIDApOworICAgICAgICBoYl9mb250X2Z1bmNzX3NldF9nbHlwaF9jb250b3VyX3BvaW50
X2Z1bmMoaGFyZmJ1enpTa2lhRm9udEZ1bmNzLCBoYXJmYnV6ekdldEdseXBoQ29udG91clBvaW50
LCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIGhhcmZidXp6U2tpYUZvbnRGdW5jczsKIH0KIAot
c3RhdGljIEhCX0ZpeGVkIGdldEZvbnRNZXRyaWMoSEJfRm9udCBoYkZvbnQsIEhCX0ZvbnRNZXRy
aWMgbWV0cmljKQorc3RhdGljIGhiX2Jsb2JfdCogaGFyZmJ1enpTa2lhR2V0VGFibGUoaGJfZmFj
ZV90KiBmYWNlLCBoYl90YWdfdCB0YWcsIHZvaWQqIHVzZXJEYXRhKQogewotICAgIEZvbnRQbGF0
Zm9ybURhdGEqIGZvbnQgPSByZWludGVycHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPihoYkZv
bnQtPnVzZXJEYXRhKTsKLSAgICBTa1BhaW50IHBhaW50OworICAgIEZvbnRQbGF0Zm9ybURhdGEq
IGZvbnQgPSByZWludGVycHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPih1c2VyRGF0YSk7Cisg
ICAgCisgICAgY29uc3Qgc2l6ZV90IHRhYmxlU2l6ZSA9IFNrRm9udEhvc3Q6OkdldFRhYmxlU2l6
ZShmb250LT51bmlxdWVJRCgpLCB0YWcpOworICAgIGlmICghdGFibGVTaXplKQorICAgICAgICBy
ZXR1cm4gMDsKIAotICAgIGZvbnQtPnNldHVwUGFpbnQoJnBhaW50KTsKLSAgICBTa1BhaW50OjpG
b250TWV0cmljcyBza2lhTWV0cmljczsKLSAgICBwYWludC5nZXRGb250TWV0cmljcygmc2tpYU1l
dHJpY3MpOwotCi0gICAgc3dpdGNoIChtZXRyaWMpIHsKLSAgICBjYXNlIEhCX0ZvbnRBc2NlbnQ6
Ci0gICAgICAgIHJldHVybiBTa2lhU2NhbGFyVG9IYXJmYnV6ekZpeGVkKC1za2lhTWV0cmljcy5m
QXNjZW50KTsKLSAgICAvLyBXZSBkb24ndCBzdXBwb3J0IGdldHRpbmcgdGhlIHJlc3Qgb2YgdGhl
IG1ldHJpY3MgYW5kIEhhcmZidXp6IGRvZXNuJ3Qgc2VlbSB0byBuZWVkIHRoZW0uCi0gICAgZGVm
YXVsdDoKKyAgICBjaGFyKiBidWZmZXIgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihmYXN0TWFs
bG9jKHRhYmxlU2l6ZSkpOworICAgIGlmICghYnVmZmVyKQogICAgICAgICByZXR1cm4gMDsKLSAg
ICB9CisgICAgc2l6ZV90IGFjdHVhbFNpemUgPSBTa0ZvbnRIb3N0OjpHZXRUYWJsZURhdGEoZm9u
dC0+dW5pcXVlSUQoKSwgdGFnLCAwLCB0YWJsZVNpemUsIGJ1ZmZlcik7CisgICAgaWYgKHRhYmxl
U2l6ZSAhPSBhY3R1YWxTaXplKQorICAgICAgICByZXR1cm4gMDsKKyAgICAKKyAgICByZXR1cm4g
aGJfYmxvYl9jcmVhdGUoKGNvbnN0IGNoYXIqKWJ1ZmZlciwgdGFibGVTaXplLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICBIQl9NRU1PUllfTU9ERV9XUklUQUJMRSwgYnVmZmVyLCBmYXN0RnJl
ZSk7CiB9CiAKLUhCX0ZvbnRDbGFzcyBoYXJmYnV6elNraWFDbGFzcyA9IHsKLSAgICBzdHJpbmdU
b0dseXBocywKLSAgICBnbHlwaHNUb0FkdmFuY2VzLAotICAgIGNhblJlbmRlciwKLSAgICBnZXRP
dXRsaW5lUG9pbnQsCi0gICAgZ2V0R2x5cGhNZXRyaWNzLAotICAgIGdldEZvbnRNZXRyaWMsCi19
OworSGFyZmJ1enpGYWNlOjpIYXJmYnV6ekZhY2UoRm9udFBsYXRmb3JtRGF0YSogcGxhdGZvcm1E
YXRhKQorICAgIDogbV9wbGF0Zm9ybURhdGEocGxhdGZvcm1EYXRhKQoreworICAgIG1fZmFjZSA9
IGhiX2ZhY2VfY3JlYXRlX2Zvcl90YWJsZXMoaGFyZmJ1enpTa2lhR2V0VGFibGUsIG1fcGxhdGZv
cm1EYXRhLCAwKTsKK30KIAotSEJfRm9udF8qIGFsbG9jSGFyZmJ1enpGb250KCkKK0hhcmZidXp6
RmFjZTo6fkhhcmZidXp6RmFjZSgpCiB7Ci0gICAgSEJfRm9udF8qIGZvbnQgPSByZWludGVycHJl
dF9jYXN0PEhCX0ZvbnRfKj4oZmFzdE1hbGxvYyhzaXplb2YoSEJfRm9udF8pKSk7Ci0gICAgbWVt
c2V0KGZvbnQsIDAsIHNpemVvZihIQl9Gb250XykpOwotICAgIGZvbnQtPmtsYXNzID0gJmhhcmZi
dXp6U2tpYUNsYXNzOwotICAgIGZvbnQtPnVzZXJEYXRhID0gMDsKKyAgICBoYl9mYWNlX2Rlc3Ry
b3kobV9mYWNlKTsKK30KIAotICAgIHJldHVybiBmb250OworSGFyZmJ1enpTY3JpcHRSdW46Okhh
cmZidXp6U2NyaXB0UnVuKGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEq
IGZvbnREYXRhKQorICAgIDogbV90ZXh0KHRleHQpCisgICAgLCBtX2ZvbnREYXRhKGZvbnREYXRh
KQorICAgICwgbV9nbHlwaHMoMCkKKyAgICAsIG1fcG9zaXRpb25zKDApCisgICAgLCBtX2xvZ0Ns
dXN0ZXJzKDApCit7CisgICAgbV9oYXJmYnV6ekJ1ZmZlciA9IGhiX2J1ZmZlcl9jcmVhdGUobV90
ZXh0Lmxlbmd0aCgpKTsKKyAgICBoYl9idWZmZXJfc2V0X3VuaWNvZGVfZnVuY3MobV9oYXJmYnV6
ekJ1ZmZlciwgaGJfZ2xpYl9nZXRfdW5pY29kZV9mdW5jcygpKTsKKyAgICBoYl9idWZmZXJfYWRk
X3V0ZjE2KG1faGFyZmJ1enpCdWZmZXIsIG1fdGV4dC5jaGFyYWN0ZXJzKCksIG1fdGV4dC5sZW5n
dGgoKSwgMCwgbV90ZXh0Lmxlbmd0aCgpKTsKIH0KIAotSEJfRXJyb3IgaGFyZmJ1enpTa2lhR2V0
VGFibGUodm9pZCogdm9pZGZhY2UsIGNvbnN0IEhCX1RhZyB0YWcsIEhCX0J5dGUqIGJ1ZmZlciwg
SEJfVUludCogbGVuKQorSGFyZmJ1enpTY3JpcHRSdW46On5IYXJmYnV6elNjcmlwdFJ1bigpCiB7
Ci0gICAgRm9udFBsYXRmb3JtRGF0YSogZm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRm
b3JtRGF0YSo+KHZvaWRmYWNlKTsKKyAgICBkZWxldGVbXSBtX2dseXBoczsKKyAgICBkZWxldGVb
XSBtX3Bvc2l0aW9uczsKKyAgICBkZWxldGVbXSBtX2xvZ0NsdXN0ZXJzOworICAgIGhiX2J1ZmZl
cl9kZXN0cm95KG1faGFyZmJ1enpCdWZmZXIpOworfQogCi0gICAgY29uc3Qgc2l6ZV90IHRhYmxl
U2l6ZSA9IFNrRm9udEhvc3Q6OkdldFRhYmxlU2l6ZShmb250LT51bmlxdWVJRCgpLCB0YWcpOwot
ICAgIGlmICghdGFibGVTaXplKQotICAgICAgICByZXR1cm4gSEJfRXJyX0ludmFsaWRfQXJndW1l
bnQ7Ci0gICAgLy8gSWYgSGFyZmJ1enogc3BlY2lmaWVkIGEgTlVMTCBidWZmZXIgdGhlbiBpdCdz
IGFza2luZyBmb3IgdGhlIHNpemUgb2YgdGhlIHRhYmxlLgotICAgIGlmICghYnVmZmVyKSB7Ci0g
ICAgICAgICpsZW4gPSB0YWJsZVNpemU7Ci0gICAgICAgIHJldHVybiBIQl9FcnJfT2s7Cit2b2lk
IEhhcmZidXp6U2NyaXB0UnVuOjpzaGFwZUdseXBocygpCit7CisgICAgaGJfZm9udF90KiBoYXJm
YnV6ekZvbnQgPSBjcmVhdGVIYXJmYnV6ekZvbnQoKTsKKyAgICBoYl9zaGFwZShoYXJmYnV6ekZv
bnQsIG1faGFyZmJ1enpCdWZmZXIsIDAsIDApOworICAgIGhiX2ZvbnRfZGVzdHJveShoYXJmYnV6
ekZvbnQpOworICAgIG1fbnVtR2x5cGhzID0gaGJfYnVmZmVyX2dldF9sZW5ndGgobV9oYXJmYnV6
ekJ1ZmZlcik7CisgICAgaWYgKG1fbnVtR2x5cGhzKSB7CisgICAgICAgIG1fZ2x5cGhzID0gbmV3
IHVpbnQxNl90W21fbnVtR2x5cGhzXTsKKyAgICAgICAgbV9wb3NpdGlvbnMgPSBuZXcgU2tQb2lu
dFttX251bUdseXBoc107CisgICAgICAgIG1fbG9nQ2x1c3RlcnMgPSBuZXcgdW5zaWduZWQgc2hv
cnRbbV90ZXh0Lmxlbmd0aCgpXTsKICAgICB9Cit9CiAKLSAgICBpZiAoKmxlbiA8IHRhYmxlU2l6
ZSkKLSAgICAgICAgcmV0dXJuIEhCX0Vycl9JbnZhbGlkX0FyZ3VtZW50OwotICAgIFNrRm9udEhv
c3Q6OkdldFRhYmxlRGF0YShmb250LT51bmlxdWVJRCgpLCB0YWcsIDAsIHRhYmxlU2l6ZSwgYnVm
ZmVyKTsKLSAgICByZXR1cm4gSEJfRXJyX09rOwordm9pZCBIYXJmYnV6elNjcmlwdFJ1bjo6Zmls
bEdseXBoc1dpdGhWZXJ0aWNhbFN1YnN0aXR1dGlvbih1aW50MTZfdCogZ2x5cGhzLCB1bnNpZ25l
ZCBsZW5ndGgpCit7CisgICAgaGJfZm9udF90KiBoYXJmYnV6ekZvbnQgPSBjcmVhdGVIYXJmYnV6
ekZvbnQoKTsKKyAgICBoYl9idWZmZXJfc2V0X2RpcmVjdGlvbihtX2hhcmZidXp6QnVmZmVyLCBI
Ql9ESVJFQ1RJT05fVFRCKTsKKyAgICAvLyBGSVhNRTogV2UgbWF5IG5lZWQgdG8gY2FsbCBoYl9i
dWZmZXJfc2V0X3NjcmlwdCgpIHRvIG9idGFpbiBhcHByb3ByaWF0ZQorICAgIC8vIHZlcnRpY2Fs
IGdseXBocy4gVW5sZXNzIHNldHRpbmcgdGhlIHNjcmlwdCBjb3JyZWN0bHksIEhhcmZidXp6LW5n
IGNhbm5vdAorICAgIC8vIHN1YnN0aXR1dGUgdmVydGljYWwgZ2x5cGhzIGFzIGV4cGVjdGVkLiBI
b3dldmVyLCB3ZSBjYW4ndCBzZXQgdGhlIHNjcmlwdAorICAgIC8vIGJlY2F1c2UgdGhlcmUgaXMg
bm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNjcmlwdCBvZiB0aGUgYnVmZmVyIGhlcmUuCisgICAg
aGJfc2hhcGUoaGFyZmJ1enpGb250LCBtX2hhcmZidXp6QnVmZmVyLCAwLCAwKTsKKyAgICBoYl9m
b250X2Rlc3Ryb3koaGFyZmJ1enpGb250KTsKKworICAgIGhiX2dseXBoX2luZm9fdCogaW5mb3Mg
PSBnbHlwaEluZm9zKCk7CisgICAgbV9udW1HbHlwaHMgPSBoYl9idWZmZXJfZ2V0X2xlbmd0aCht
X2hhcmZidXp6QnVmZmVyKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbV9udW1HbHlw
aHMgJiYgaSA8IGxlbmd0aDsgKytpKQorICAgICAgICBnbHlwaHNbaV0gPSBpbmZvc1tpXS5jb2Rl
cG9pbnQ7CiB9CiAKLUhhcmZidXp6RmFjZTo6SGFyZmJ1enpGYWNlKEZvbnRQbGF0Zm9ybURhdGEq
IHBsYXRmb3JtRGF0YSkKK2hiX2dseXBoX2luZm9fdCogSGFyZmJ1enpTY3JpcHRSdW46OmdseXBo
SW5mb3MoKQogewotICAgIG1faGFyZmJ1enpGYWNlID0gSEJfTmV3RmFjZShwbGF0Zm9ybURhdGEs
IGhhcmZidXp6U2tpYUdldFRhYmxlKTsKKyAgICByZXR1cm4gaGJfYnVmZmVyX2dldF9nbHlwaF9p
bmZvcyhtX2hhcmZidXp6QnVmZmVyLCAwKTsKIH0KIAotSGFyZmJ1enpGYWNlOjp+SGFyZmJ1enpG
YWNlKCkKK2hiX2dseXBoX3Bvc2l0aW9uX3QqIEhhcmZidXp6U2NyaXB0UnVuOjpnbHlwaFBvc2l0
aW9ucygpCit7CisgICAgcmV0dXJuIGhiX2J1ZmZlcl9nZXRfZ2x5cGhfcG9zaXRpb25zKG1faGFy
ZmJ1enpCdWZmZXIsIDApOworfQorCitoYl9mb250X3QqIEhhcmZidXp6U2NyaXB0UnVuOjpjcmVh
dGVIYXJmYnV6ekZvbnQoKQogewotICAgIEhCX0ZyZWVGYWNlKG1faGFyZmJ1enpGYWNlKTsKKyAg
ICBGb250UGxhdGZvcm1EYXRhKiBvcGFxdWVQbGF0Zm9ybURhdGEgPSBjb25zdF9jYXN0PEZvbnRQ
bGF0Zm9ybURhdGEqPigmbV9mb250RGF0YS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIoJyAnKS0+cGxh
dGZvcm1EYXRhKCkpOworICAgIGhiX2ZvbnRfdCogaGFyZmJ1enpGb250ID0gaGJfZm9udF9jcmVh
dGUob3BhcXVlUGxhdGZvcm1EYXRhLT5oYXJmYnV6ekZhY2UoKS0+ZmFjZSgpKTsKKyAgICBoYl9m
b250X3NldF9mdW5jcyhoYXJmYnV6ekZvbnQsIGhhcmZidXp6U2tpYUdldEZvbnRGdW5jcygpLCBv
cGFxdWVQbGF0Zm9ybURhdGEsIDAgLyogZGVzdHJveSovKTsKKyAgICBmbG9hdCBzaXplID0gb3Bh
cXVlUGxhdGZvcm1EYXRhLT5zaXplKCk7CisgICAgaGJfZm9udF9zZXRfcHBlbShoYXJmYnV6ekZv
bnQsIHNpemUsIHNpemUpOworICAgIGNvbnN0IGludCBtdWx0aXBseUZvcjE2RG90MTYgPSAxIDw8
IDE2OworICAgIGludCBzY2FsZSA9IHNpemUgKiBtdWx0aXBseUZvcjE2RG90MTYgLyAxMDAwOwor
ICAgIGhiX2ZvbnRfc2V0X3NjYWxlKGhhcmZidXp6Rm9udCwgc2NhbGUsIHNjYWxlKTsKKyAgICBy
ZXR1cm4gaGFyZmJ1enpGb250OwogfQogCiB9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSGFyZmJ1enpT
a2lhLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6
elNraWEuaAppbmRleCA5M2RjNzE4MjQwODUxNjdlMmU0ZjcxM2NiMTY2Nzk5OWMwMDRjYTdkLi5l
YTJlZjIwMDJlZGY1NTU1OGJkZmJhMzVkZWUwYmYyZTE5ZGU3MWQwIDEwMDY0NAotLS0gYS9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEuaAorKysg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEu
aApAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDksIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIEdvb2dsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJl
CkBAIC0zMSwxNSArMzEsNjUgQEAKICNpZm5kZWYgSGFyZmJ1enpTa2lhX2gKICNkZWZpbmUgSGFy
ZmJ1enpTa2lhX2gKIAorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUGFz
c093blB0ci5oPgogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAjaW5jbHVkZSA8d3RmL1Jl
ZlB0ci5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1dURlN0cmluZy5oPgogCi1zdHJ1Y3QgSEJfRmFj
ZVJlY187Ci1zdHJ1Y3QgSEJfRm9udF87CitjbGFzcyBTa1BvaW50OworCitzdHJ1Y3QgX2hiX2Zh
Y2VfdDsKK3N0cnVjdCBfaGJfZm9udF90Oworc3RydWN0IF9oYl9idWZmZXJfdDsKK3N0cnVjdCBf
aGJfZ2x5cGhfaW5mb190Oworc3RydWN0IF9oYl9nbHlwaF9wb3NpdGlvbl90OworCit0eXBlZGVm
IF9oYl9mYWNlX3QgaGJfZmFjZV90OwordHlwZWRlZiBfaGJfZm9udF90IGhiX2ZvbnRfdDsKK3R5
cGVkZWYgX2hiX2J1ZmZlcl90IGhiX2J1ZmZlcl90OwordHlwZWRlZiBfaGJfZ2x5cGhfaW5mb190
IGhiX2dseXBoX2luZm9fdDsKK3R5cGVkZWYgX2hiX2dseXBoX3Bvc2l0aW9uX3QgaGJfZ2x5cGhf
cG9zaXRpb25fdDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewogCiBjbGFzcyBGb250UGxhdGZvcm1E
YXRhOworY2xhc3MgU2ltcGxlRm9udERhdGE7CisKK2NsYXNzIEhhcmZidXp6U2NyaXB0UnVuIHsK
K3B1YmxpYzoKKyAgICBzdGF0aWMgUGFzc093blB0cjxIYXJmYnV6elNjcmlwdFJ1bj4gY3JlYXRl
KGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UHRyPEhhcmZidXp6U2NyaXB0UnVuPihuZXcgSGFyZmJ1
enpTY3JpcHRSdW4odGV4dCwgZm9udERhdGEpKTsKKyAgICB9CisgICAgfkhhcmZidXp6U2NyaXB0
UnVuKCk7CisKKyAgICB2b2lkIHNoYXBlR2x5cGhzKCk7CisgICAgdW5zaWduZWQgbnVtR2x5cGhz
KCkgeyByZXR1cm4gbV9udW1HbHlwaHM7IH0KKyAgICB1aW50MTZfdCogZ2x5cGhzKCkgeyByZXR1
cm4gbV9nbHlwaHM7IH0KKyAgICBTa1BvaW50KiBwb3NpdGlvbnMoKSB7IHJldHVybiBtX3Bvc2l0
aW9uczsgfQorICAgIHVuc2lnbmVkIG51bUNvZGVQb2ludHMoKSB7IHJldHVybiBtX3RleHQubGVu
Z3RoKCk7IH0KKyAgICB1bnNpZ25lZCBzaG9ydCogbG9nQ2x1c3RlcnMoKSB7IHJldHVybiBtX2xv
Z0NsdXN0ZXJzOyB9CisgICAgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhKCkgeyByZXR1
cm4gbV9mb250RGF0YTsgfQorICAgIGhiX2dseXBoX2luZm9fdCogZ2x5cGhJbmZvcygpOworICAg
IGhiX2dseXBoX3Bvc2l0aW9uX3QqIGdseXBoUG9zaXRpb25zKCk7CisKKyAgICB2b2lkIGZpbGxH
bHlwaHNXaXRoVmVydGljYWxTdWJzdGl0dXRpb24odWludDE2X3QqIGJ1ZmZlciwgdW5zaWduZWQg
bGVuZ3RoKTsKKworcHJpdmF0ZToKKyAgICBIYXJmYnV6elNjcmlwdFJ1bihjb25zdCBTdHJpbmcm
IHRleHQsIGNvbnN0IFNpbXBsZUZvbnREYXRhKik7CisKKyAgICBoYl9mb250X3QqIGNyZWF0ZUhh
cmZidXp6Rm9udCgpOworICAgIHZvaWQgc2V0dXBMb2dDbHVzdGVycygpOworCisgICAgU3RyaW5n
IG1fdGV4dDsgLy8gVGhlIHRleHQgdG8gYmUgc2hhcGVkLgorICAgIGNvbnN0IFNpbXBsZUZvbnRE
YXRhKiBtX2ZvbnREYXRhOworICAgIHVuc2lnbmVkIG1fbnVtR2x5cGhzOworICAgIHVpbnQxNl90
KiBtX2dseXBoczsgLy8gVGhlIHNoYXBpbmcgcmVzdWx0LgorICAgIFNrUG9pbnQqIG1fcG9zaXRp
b25zOyAvLyBUaGUgcG9zaXRpb25zIG9uIHdoaWNoIGdseXBocyBzaG91bGQgYmUgcmVuZGVyZXJl
ZC4KKyAgICB1bnNpZ25lZCBzaG9ydCogbV9sb2dDbHVzdGVyczsKKyAgICBoYl9idWZmZXJfdCog
bV9oYXJmYnV6ekJ1ZmZlcjsgLy8gVGhlIGFzc29jaWF0ZSBoYXJmYnV6eiBidWZmZXIuCit9Owog
CiBjbGFzcyBIYXJmYnV6ekZhY2UgOiBwdWJsaWMgUmVmQ291bnRlZDxIYXJmYnV6ekZhY2U+IHsK
IHB1YmxpYzoKQEAgLTQ3LDIxICs5NywxOCBAQCBwdWJsaWM6CiAgICAgewogICAgICAgICByZXR1
cm4gYWRvcHRSZWYobmV3IEhhcmZidXp6RmFjZShwbGF0Zm9ybURhdGEpKTsKICAgICB9Ci0KICAg
ICB+SGFyZmJ1enpGYWNlKCk7CiAKLSAgICBIQl9GYWNlUmVjXyogZmFjZSgpIGNvbnN0IHsgcmV0
dXJuIG1faGFyZmJ1enpGYWNlOyB9CisgICAgaGJfZmFjZV90KiBmYWNlKCkgY29uc3QgeyByZXR1
cm4gbV9mYWNlOyB9CisgICAgRm9udFBsYXRmb3JtRGF0YSogcGxhdGZvcm1EYXRhKCkgY29uc3Qg
eyByZXR1cm4gbV9wbGF0Zm9ybURhdGE7IH0KIAogcHJpdmF0ZToKICAgICBleHBsaWNpdCBIYXJm
YnV6ekZhY2UoRm9udFBsYXRmb3JtRGF0YSopOwogCi0gICAgSEJfRmFjZVJlY18qIG1faGFyZmJ1
enpGYWNlOworICAgIGhiX2ZhY2VfdCogbV9mYWNlOworICAgIEZvbnRQbGF0Zm9ybURhdGEqIG1f
cGxhdGZvcm1EYXRhOwogfTsKIAotLy8gRklYTUU6IFJlbW92ZSB0aGlzIGFzeW1tZXRyaWMgYWxs
b2MvZnJlZSBmdW5jdGlvbi4KLS8vIFdlJ2xsIHJlbW92ZSB0aGlzIG9uY2Ugd2UgbW92ZSB0byB0
aGUgbmV3IEhhcmZidXp6IEFQSS4KLUhCX0ZvbnRfKiBhbGxvY0hhcmZidXp6Rm9udCgpOwotCiB9
ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR2x5cGhQYWdlVHJlZU5vZGVTa2lhLmNwcCBiL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR2x5cGhQYWdlVHJlZU5vZGVTa2lh
LmNwcAppbmRleCA0MDYxZjc0ZGIxNDY1MzQ1YzEwODhhZTZhZWUwY2NhNzJmNjkwMmFhLi4yMjJj
ZWY1ZjAyNjgzNTdlYzhhN2M5NTAxMzRiZTVmYzE0OTEwY2YxIDEwMDY0NAotLS0gYS9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9za2lhL0dseXBoUGFnZVRyZWVOb2RlU2tpYS5jcHAK
KysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HbHlwaFBhZ2VUcmVl
Tm9kZVNraWEuY3BwCkBAIC0zOSw3MiArMzksNDYgQEAKICNpbmNsdWRlICJTa1BhaW50LmgiCiAj
aW5jbHVkZSAiU2tVdGlscy5oIgogCi1leHRlcm4gIkMiIHsKLSNpbmNsdWRlICJoYXJmYnV6ei1z
aGFwZXIuaCIKLX0KLQogbmFtZXNwYWNlIFdlYkNvcmUgewogCi1zdGF0aWMgaW50IHN1YnN0aXR1
dGVXaXRoVmVydGljYWxHbHlwaHMoY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhLCB1aW50
MTZfdCogZ2x5cGhzLCB1bnNpZ25lZCBidWZmZXJMZW5ndGgpCi17Ci0gICAgSEJfRmFjZVJlY18q
IGhiRmFjZSA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5oYXJmYnV6ekZhY2UoKS0+ZmFjZSgp
OwotICAgIGlmICghaGJGYWNlLT5nc3ViKSB7Ci0gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIEdT
VUIgdGFibGUsIHRyZWF0IGl0IGFzIG5vdCBjb3ZlcmVkCi0gICAgICAgIHJldHVybiAwWGZmZmY7
Ci0gICAgfQotCi0gICAgSEJfQnVmZmVyIGJ1ZmZlcjsKLSAgICBoYl9idWZmZXJfbmV3KCZidWZm
ZXIpOwotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBidWZmZXJMZW5ndGg7ICsraSkKLSAg
ICAgICAgaGJfYnVmZmVyX2FkZF9nbHlwaChidWZmZXIsIGdseXBoc1tpXSwgMCwgaSk7Ci0KLSAg
ICBIQl9VU2hvcnQgc2NyaXB0SW5kZXg7Ci0gICAgSEJfVVNob3J0IGZlYXR1cmVJbmRleDsKLQot
ICAgIEhCX0dTVUJfU2VsZWN0X1NjcmlwdChoYkZhY2UtPmdzdWIsIEhCX01BS0VfVEFHKCdEJywg
J0YnLCAnTCcsICdUJyksICZzY3JpcHRJbmRleCk7Ci0gICAgSEJfR1NVQl9TZWxlY3RfRmVhdHVy
ZShoYkZhY2UtPmdzdWIsIEhCX01BS0VfVEFHKCd2JywgJ2UnLCAncicsICd0JyksIHNjcmlwdElu
ZGV4LCAweGZmZmYsICZmZWF0dXJlSW5kZXgpOwotICAgIEhCX0dTVUJfQWRkX0ZlYXR1cmUoaGJG
YWNlLT5nc3ViLCBmZWF0dXJlSW5kZXgsIDEpOwotICAgIEhCX0dTVUJfU2VsZWN0X0ZlYXR1cmUo
aGJGYWNlLT5nc3ViLCBIQl9NQUtFX1RBRygndicsICdyJywgJ3QnLCAnMicpLCBzY3JpcHRJbmRl
eCwgMHhmZmZmLCAmZmVhdHVyZUluZGV4KTsKLSAgICBIQl9HU1VCX0FkZF9GZWF0dXJlKGhiRmFj
ZS0+Z3N1YiwgZmVhdHVyZUluZGV4LCAxKTsKLQotICAgIGludCBlcnJvciA9IEhCX0dTVUJfQXBw
bHlfU3RyaW5nKGhiRmFjZS0+Z3N1YiwgYnVmZmVyKTsKLSAgICBpZiAoIWVycm9yKSB7Ci0gICAg
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBidWZmZXJMZW5ndGg7ICsraSkKLSAgICAgICAg
ICAgIGdseXBoc1tpXSA9IHN0YXRpY19jYXN0PEdseXBoPihidWZmZXItPm91dF9zdHJpbmdbaV0u
Z2luZGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycm9yOwotfQotCiBib29sIEdseXBoUGFnZTo6
ZmlsbCh1bnNpZ25lZCBvZmZzZXQsIHVuc2lnbmVkIGxlbmd0aCwgVUNoYXIqIGJ1ZmZlciwgdW5z
aWduZWQgYnVmZmVyTGVuZ3RoLCBjb25zdCBTaW1wbGVGb250RGF0YSogZm9udERhdGEpCiB7CiAg
ICAgaWYgKFNrVVRGMTZfSXNIaWdoU3Vycm9nYXRlKGJ1ZmZlcltidWZmZXJMZW5ndGgtMV0pKSB7
CiAgICAgICAgIFNrRGVidWdmKCIlcyBsYXN0IGNoYXIgaXMgaGlnaC1zdXJyb2dhdGUiLCBfX0ZV
TkNUSU9OX18pOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIAotICAgIFNrUGFp
bnQgcGFpbnQ7Ci0gICAgZm9udERhdGEtPnBsYXRmb3JtRGF0YSgpLnNldHVwUGFpbnQoJnBhaW50
KTsKLSAgICBwYWludC5zZXRUZXh0RW5jb2RpbmcoU2tQYWludDo6a1VURjE2X1RleHRFbmNvZGlu
Zyk7Ci0gICAgCi0gICAgU2tBdXRvU1RNYWxsb2MgPEdseXBoUGFnZTo6c2l6ZSwgdWludDE2X3Q+
IGdseXBoU3RvcmFnZShsZW5ndGgpOwotICAgIHVpbnQxNl90KiBnbHlwaHMgPSBnbHlwaFN0b3Jh
Z2UuZ2V0KCk7Ci0gICAgLy8gdGV4dFRvR2x5cGhzIHRha2VzIGEgYnl0ZSBjb3VudCwgbm90IGEg
Z2x5cGggY291bnQgc28gd2UgbXVsdGlwbHkgYnkgdHdvLgotICAgIHVuc2lnbmVkIGNvdW50ID0g
cGFpbnQudGV4dFRvR2x5cGhzKGJ1ZmZlciwgYnVmZmVyTGVuZ3RoICogMiwgZ2x5cGhzKTsKLSAg
ICBpZiAoY291bnQgIT0gbGVuZ3RoKSB7Ci0gICAgICAgIFNrRGVidWdmKCIlcyBjb3VudCAhPSBs
ZW5ndGhcbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9CiAK
KyAgICBib29sIGxvb2tWYXJpYW50cyA9IGZhbHNlOwogICAgIGlmIChmb250RGF0YS0+aGFzVmVy
dGljYWxHbHlwaHMoKSkgewotICAgICAgICBib29sIGxvb2tWYXJpYW50cyA9IGZhbHNlOwogICAg
ICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYnVmZmVyTGVuZ3RoOyArK2kpIHsKICAgICAg
ICAgICAgIGlmICghRm9udDo6aXNDSktJZGVvZ3JhcGgoYnVmZmVyW2ldKSkgewogICAgICAgICAg
ICAgICAgIGxvb2tWYXJpYW50cyA9IHRydWU7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAg
ICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGxvb2tWYXJpYW50cykKLSAgICAg
ICAgICAgIHN1YnN0aXR1dGVXaXRoVmVydGljYWxHbHlwaHMoZm9udERhdGEsIGdseXBocywgYnVm
ZmVyTGVuZ3RoKTsKKyAgICB9CisKKyAgICBTa0F1dG9TVE1hbGxvYyA8R2x5cGhQYWdlOjpzaXpl
LCB1aW50MTZfdD4gZ2x5cGhTdG9yYWdlKGxlbmd0aCk7CisgICAgdWludDE2X3QqIGdseXBocyA9
IGdseXBoU3RvcmFnZS5nZXQoKTsKKyAgICBpZiAobG9va1ZhcmlhbnRzKSB7CisgICAgICAgIFN0
cmluZyB0ZXh0KGJ1ZmZlciwgYnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgT3duUHRyPEhhcmZidXp6
U2NyaXB0UnVuPiBydW4gPSBIYXJmYnV6elNjcmlwdFJ1bjo6Y3JlYXRlKHRleHQsIGZvbnREYXRh
KTsKKyAgICAgICAgcnVuLT5maWxsR2x5cGhzV2l0aFZlcnRpY2FsU3Vic3RpdHV0aW9uKGdseXBo
cywgbGVuZ3RoKTsKKyAgICAgICAgaWYgKHJ1bi0+bnVtR2x5cGhzKCkgIT0gbGVuZ3RoKSB7Cisg
ICAgICAgICAgICBTa0RlYnVnZigiJXMgbnVtR2x5cGhzICE9IGxlbmd0aFxuIiwgX19GVU5DVElP
Tl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7
CisgICAgICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgICAgIGZvbnREYXRhLT5wbGF0Zm9ybURhdGEo
KS5zZXR1cFBhaW50KCZwYWludCk7CisgICAgICAgIHBhaW50LnNldFRleHRFbmNvZGluZyhTa1Bh
aW50OjprVVRGMTZfVGV4dEVuY29kaW5nKTsKKworICAgICAgICAvLyB0ZXh0VG9HbHlwaHMgdGFr
ZXMgYSBieXRlIGNvdW50LCBub3QgYSBnbHlwaCBjb3VudCBzbyB3ZSBtdWx0aXBseSBieSB0d28u
CisgICAgICAgIHVuc2lnbmVkIGNvdW50ID0gcGFpbnQudGV4dFRvR2x5cGhzKGJ1ZmZlciwgYnVm
ZmVyTGVuZ3RoICogMiwgZ2x5cGhzKTsKKyAgICAgICAgaWYgKGNvdW50ICE9IGxlbmd0aCkgewor
ICAgICAgICAgICAgU2tEZWJ1Z2YoIiVzIGNvdW50ICE9IGxlbmd0aFxuIiwgX19GVU5DVElPTl9f
KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHVu
c2lnbmVkIGFsbEdseXBocyA9IDA7IC8vIHRyYWNrIGlmIGFueSBvZiB0aGUgZ2x5cGhJRHMgYXJl
IG5vbi16ZXJvCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>101707</attachid>
            <date>2011-07-22 02:14:44 -0700</date>
            <delta_ts>2011-07-22 02:14:44 -0700</delta_ts>
            <desc>WIP Patch V1</desc>
            <filename>bug-64930-20110722181443.patch</filename>
            <type>text/plain</type>
            <size>49178</size>
            <attacher name="Kenichi Ishibashi">bashi</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTE1MzAKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dl
YkNvcmUuZ3lwL1dlYkNvcmUuZ3lwIGIvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29y
ZS5neXAKaW5kZXggMWYyZDY3MjZjZmQ1ZWNmYzdkNGNjZDQwMTRhMDJmNzAzODMxMDYyYi4uOWVh
NTAzMjExYWVkNjNlMjBhMWE0ZTA0YWFlZWJiYzdlZjM4ZjUyOCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvV2ViQ29yZS5neXAvV2ViQ29yZS5neXAKKysrIGIvU291cmNlL1dlYkNvcmUvV2Vi
Q29yZS5neXAvV2ViQ29yZS5neXAKQEAgLTEzNTksNyArMTM1OSw3IEBACiAgICAgICAgIFsnZXhj
bHVkZScsICdwbGF0Zm9ybS90ZXh0L1RleHRFbmNvZGluZ0RldGVjdG9yTm9uZVxcLmNwcCQnXSwK
ICAgICAgIF0sCiAgICAgICAnY29uZGl0aW9ucyc6IFsKLSAgICAgICAgWyd0b29sa2l0X3VzZXNf
Z3RrID09IDEnLCB7CisgICAgICAgIFsndG9vbGtpdF91c2VzX2d0ayA9PSAxIGFuZCB1c2VfaGFy
ZmJ1enpfbmc9PTAnLCB7CiAgICAgICAgICAgJ3NvdXJjZXMvJzogWwogICAgICAgICAgICAgIyBD
aGVycnktcGljayBmaWxlcyBleGNsdWRlZCBieSB0aGUgYnJvYWRlciByZWd1bGFyIGV4cHJlc3Np
b25zIGFib3ZlLgogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2Nocm9taXVtL0tl
eUNvZGVDb252ZXJzaW9uR3RrXFwuY3BwJCddLApAQCAtMTM2OCw2ICsxMzY4LDIzIEBACiAgICAg
ICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udExpbnV4
XFwuY3BwJCddLAogICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eFxcLmNwcCQnXSwKICAgICAgICAgICAgIFsnaW5j
bHVkZScsICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaW1wbGVGb250RGF0YUxpbnV4XFwu
Y3BwJCddLAorICAgICAgICAgICAgWydleGNsdWRlJywgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9t
aXVtL0hhcmZidXp6TmdTa2lhXFwuY3BwJCddLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2Rl
cGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KGNocm9taXVtX3NyY19kaXIpL3RoaXJkX3Bh
cnR5L2hhcmZidXp6L2hhcmZidXp6Lmd5cDpoYXJmYnV6eicsCisgICAgICAgICAgXSwKKyAgICAg
ICAgfV0sCisgICAgICAgICMgRklYTUU6IFJlbW92ZSBhZnRlciBzd2l0Y2hpbmcgdG8gaGItbmcg
aXMgY29tcGxldGVkLgorICAgICAgICBbJ3Rvb2xraXRfdXNlc19ndGs9PTEgYW5kIHVzZV9oYXJm
YnV6el9uZz09MScsIHsKKyAgICAgICAgICAnc291cmNlcy8nOiBbCisgICAgICAgICAgICBbJ2lu
Y2x1ZGUnLCAncGxhdGZvcm0vY2hyb21pdW0vS2V5Q29kZUNvbnZlcnNpb25HdGtcXC5jcHAkJ10s
CisgICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ29t
cGxleFRleHRDb250cm9sbGVyTmdMaW51eFxcLihjcHB8aCkkJ10sCisgICAgICAgICAgICBbJ2lu
Y2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlTGludXhcXC5jcHAk
J10sCisgICAgICAgICAgICBbJ2luY2x1ZGUnLCAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Rm9udExpbnV4XFwuY3BwJCddLAorICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0ZvbnRQbGF0Zm9ybURhdGFMaW51eFxcLmNwcCQnXSwKKyAgICAgICAg
ICAgIFsnaW5jbHVkZScsICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9TaW1wbGVGb250RGF0
YUxpbnV4XFwuY3BwJCddLAorICAgICAgICAgICAgWydpbmNsdWRlJywgJ3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0hhcmZidXp6TmdTa2lhXFwuKGNwcHxoKSQnXSwKKyAgICAgICAgICAgIFsn
ZXhjbHVkZScsICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWFcXC5jcHAk
J10sCiAgICAgICAgICAgXSwKICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAg
ICAgJzwoY2hyb21pdW1fc3JjX2RpcikvdGhpcmRfcGFydHkvaGFyZmJ1enovaGFyZmJ1enouZ3lw
OmhhcmZidXp6JywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaSBiL1Nv
dXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQppbmRleCA1YTgzMDM1Njg2NDdiODE3MGNiYThjOTU3
Y2NhZTE4NzEzNWFhNjY5Li41ZWU3YTFhZTQzNmQ2MjAzOWE0ZDAyZjJhOTExYjg5YTQwOGY5MzZi
IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKKysrIGIvU291cmNlL1dl
YkNvcmUvV2ViQ29yZS5neXBpCkBAIC00MDgwLDYgKzQwODAsOCBAQAogICAgICAgICAgICAgJ3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NhbnZhczJETGF5ZXJDaHJvbWl1bS5oJywKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9DYW52YXNMYXllckNocm9taXVtLmNw
cCcsCiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vQ2FudmFzTGF5ZXJD
aHJvbWl1bS5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21w
bGV4VGV4dENvbnRyb2xsZXJOZ0xpbnV4LmNwcCcsCisgICAgICAgICAgICAncGxhdGZvcm0vZ3Jh
cGhpY3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTmdMaW51eC5oJywKICAgICAgICAg
ICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xsZXJMaW51
eC5jcHAnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhU
ZXh0Q29udHJvbGxlckxpbnV4LmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0NvbnRlbnRMYXllckNocm9taXVtLmNwcCcsCkBAIC00MTA1LDYgKzQxMDcsOCBAQAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0dseXBoUGFnZVRyZWVOb2Rl
Q2hyb21pdW1XaW4uY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1
bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uY3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9HcmFwaGljc0xheWVyQ2hyb21pdW0uaCcsCisgICAgICAgICAgICAncGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSGFyZmJ1enpOZ1NraWEuY3BwJywKKyAgICAgICAgICAg
ICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6ek5nU2tpYS5oJywKICAgICAgICAg
ICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEuY3BwJywKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEuaCcsCiAgICAg
ICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSWNvbkNocm9taXVtLmNwcCcsCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21w
bGV4VGV4dENvbnRyb2xsZXJMaW51eC5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvY2hyb21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTGludXguaAppbmRleCBlMWVkM2Q4ZGQy
MjA4ZDI1OWMwNDczYjI3NTBkNGRmZjdiNDBjNDhiLi4xY2U3YmFmMDAyYzI4ZGQxNmFjYzQwZDgz
OTllOTE5N2U4NGE1Mjk0IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xsZXJMaW51eC5oCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJvbGxlckxp
bnV4LmgKQEAgLTMxLDYgKzMxLDEwIEBACiAjaWZuZGVmIENvbXBsZXhUZXh0Q29udHJvbGxlckxp
bnV4X2gKICNkZWZpbmUgQ29tcGxleFRleHRDb250cm9sbGVyTGludXhfaAogCisjaWYgVVNFKEhB
UkZCVVpaX05HKQorI2luY2x1ZGUgIkNvbXBsZXhUZXh0Q29udHJvbGxlck5nTGludXguaCIKKyNl
bHNlCisKICNpbmNsdWRlICJIYXJmYnV6elNraWEuaCIKICNpbmNsdWRlICJTa1BvaW50LmgiCiAj
aW5jbHVkZSAiU2tTY2FsYXIuaCIKQEAgLTE1OCw0ICsxNjIsNiBAQCBwcml2YXRlOgogCiB9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCiAKKyNlbmRpZiAvLyBVU0UoSEFSRkJVWlpfTkcpCisKICNlbmRp
ZiAvLyBDb21wbGV4VGV4dENvbnRyb2xsZXJMaW51eF9oCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xsZXJOZ0xp
bnV4LmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBs
ZXhUZXh0Q29udHJvbGxlck5nTGludXguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmMzOWIyNWI5NDY4M2M2OWMw
YmUxOWQwZTEwMDM2YzMzYTc4NWEwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9Db21wbGV4VGV4dENvbnRyb2xsZXJOZ0xpbnV4
LmNwcApAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBHb29nbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
IGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBj
b3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVy
IHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQg
ZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklH
SFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywg
VEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
CisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVE
IFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb21w
bGV4VGV4dENvbnRyb2xsZXJMaW51eC5oIgorCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5j
bHVkZSAiRm9udC5oIgorI2luY2x1ZGUgIlRleHRSdW4uaCIKKyNpbmNsdWRlICJoYi5oIgorCisj
aW5jbHVkZSA8dW5pY29kZS9ub3JtbHpyLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8g
SGFyZmJ1enogdXNlcyAyNi42IGZpeGVkIHBvaW50IHZhbHVlcyBmb3IgcGl4ZWwgb2Zmc2V0cy4g
SG93ZXZlciwgd2UgZG9uJ3QKKy8vIGhhbmRsZSBzdWJwaXhlbCBwb3NpdGlvbmluZyBzbyB0aGlz
IGZ1bmN0aW9uIGlzIHVzZWQgdG8gdHJ1bmNhdGUgSGFyZmJ1enoKKy8vIHZhbHVlcyB0byBhIG51
bWJlciBvZiBwaXhlbHMuCitzdGF0aWMgaW5saW5lIGRvdWJsZSB0cnVuY2F0ZUZpeGVkUG9pbnRU
b0ludGVnZXIoaGJfcG9zaXRpb25fdCB2YWx1ZSkKK3sKKyAgICByZXR1cm4gKGRvdWJsZSl2YWx1
ZSAvIDY0LjA7Cit9CisKK0NvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxleFRleHRDb250cm9s
bGVyKGNvbnN0IFRleHRSdW4mIHJ1biwgaW50IHN0YXJ0aW5nWCwgaW50IHN0YXJ0aW5nWSwgdW5z
aWduZWQgd29yZFNwYWNpbmcsIHVuc2lnbmVkIGxldHRlclNwYWNpbmcsIHVuc2lnbmVkIHBhZGRp
bmcsIGNvbnN0IEZvbnQqIGZvbnQpCisgICAgOiBtX2ZvbnQoZm9udCkKKyAgICAsIG1faW5kZXhP
ZkN1cnJlbnRTY3JpcHRSdW4oMCkKKyAgICAsIG1faW5kZXhPZk5leHRTY3JpcHRSdW4oMCkKKyAg
ICAsIG1fb2Zmc2V0WChzdGFydGluZ1gpCisgICAgLCBtX3N0YXJ0aW5nWShzdGFydGluZ1kpCisg
ICAgLCBtX3J1bihnZXROb3JtYWxpemVkVGV4dFJ1bihydW4sIG1fbm9ybWFsaXplZFJ1biwgbV9u
b3JtYWxpemVkQnVmZmVyKSkKK3sKKyAgICBzZXRXb3JkU3BhY2luZ0FkanVzdG1lbnQod29yZFNw
YWNpbmcpOworICAgIHNldExldHRlclNwYWNpbmdBZGp1c3RtZW50KGxldHRlclNwYWNpbmcpOwor
ICAgIHNldFBhZGRpbmcocGFkZGluZyk7Cit9CisKK0NvbXBsZXhUZXh0Q29udHJvbGxlcjo6fkNv
bXBsZXhUZXh0Q29udHJvbGxlcigpCit7Cit9CisKK2NvbnN0IEZvbnRQbGF0Zm9ybURhdGEqIENv
bXBsZXhUZXh0Q29udHJvbGxlcjo6Zm9udFBsYXRmb3JtRGF0YUZvclNjcmlwdFJ1bigpCit7Cisg
ICAgcmV0dXJuICZtX2N1cnJlbnRGb250RGF0YS0+Zm9udERhdGFGb3JDaGFyYWN0ZXIoJyAnKS0+
cGxhdGZvcm1EYXRhKCk7Cit9CisKK2Jvb2wgQ29tcGxleFRleHRDb250cm9sbGVyOjppc1dvcmRC
cmVhayh1bnNpZ25lZCBpbmRleCkKK3sKKyAgICByZXR1cm4gaW5kZXggJiYgaXNDb2RlcG9pbnRT
cGFjZShtX3J1bltpbmRleF0pICYmICFpc0NvZGVwb2ludFNwYWNlKG1fcnVuW2luZGV4IC0gMV0p
OworfQorCitpbnQgQ29tcGxleFRleHRDb250cm9sbGVyOjpkZXRlcm1pbmVXb3JkQnJlYWtTcGFj
aW5nKHVuc2lnbmVkIG9mZnNldCkKK3sKKyAgICAvLyB8b2Zmc2V0fCBpcyBhbiBpbmRleCBvZiB0
aGUgY3VycmVudCBzY3JpcHQgcnVuLgorICAgIEFTU0VSVChvZmZzZXQgPCBtX2luZGV4T2ZOZXh0
U2NyaXB0UnVuIC0gbV9pbmRleE9mQ3VycmVudFNjcmlwdFJ1bik7CisgICAgaW50IHdvcmRCcmVh
a1NwYWNpbmcgPSAwOworICAgIGlmIChpc1dvcmRCcmVhayhtX2luZGV4T2ZDdXJyZW50U2NyaXB0
UnVuICsgb2Zmc2V0KSkgeworICAgICAgICB3b3JkQnJlYWtTcGFjaW5nID0gbV93b3JkU3BhY2lu
Z0FkanVzdG1lbnQ7CisKKyAgICAgICAgaWYgKG1fcGFkZGluZyA+IDApIHsKKyAgICAgICAgICAg
IGludCB0b1BhZCA9IHJvdW5kZihtX3BhZFBlcldvcmRCcmVhayArIG1fcGFkRXJyb3IpOworICAg
ICAgICAgICAgbV9wYWRFcnJvciArPSBtX3BhZFBlcldvcmRCcmVhayAtIHRvUGFkOworCisgICAg
ICAgICAgICBpZiAobV9wYWRkaW5nIDwgdG9QYWQpCisgICAgICAgICAgICAgICAgdG9QYWQgPSBt
X3BhZGRpbmc7CisgICAgICAgICAgICBtX3BhZGRpbmcgLT0gdG9QYWQ7CisgICAgICAgICAgICB3
b3JkQnJlYWtTcGFjaW5nICs9IHRvUGFkOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB3
b3JkQnJlYWtTcGFjaW5nOworfQorCisvLyBzZXRQYWRkaW5nIHNldHMgYSBudW1iZXIgb2YgcGl4
ZWxzIHRvIGJlIGRpc3RyaWJ1dGVkIGFjcm9zcyB0aGUgVGV4dFJ1bi4KKy8vIFdlYktpdCB1c2Vz
IHRoaXMgdG8ganVzdGlmeSB0ZXh0Lgordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNldFBh
ZGRpbmcoaW50IHBhZGRpbmcpCit7CisgICAgbV9wYWRkaW5nID0gcGFkZGluZzsKKyAgICBtX3Bh
ZEVycm9yID0gMDsKKyAgICBpZiAoIW1fcGFkZGluZykKKyAgICAgICAgcmV0dXJuOworCisgICAg
Ly8gSWYgd2UgaGF2ZSBwYWRkaW5nIHRvIGRpc3RyaWJ1dGUsIHRoZW4gd2UgdHJ5IHRvIGdpdmUg
YW4gZXF1YWwKKyAgICAvLyBhbW91bnQgdG8gZWFjaCBzcGFjZS4gVGhlIGxhc3Qgc3BhY2UgZ2V0
cyB0aGUgc21hbGxlciBhbW91bnQsIGlmCisgICAgLy8gYW55LgorICAgIHVuc2lnbmVkIG51bVdv
cmRCcmVha3MgPSAwOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3J1bi5sZW5ndGgoKTsg
aSsrKSB7CisgICAgICAgIGlmIChpc1dvcmRCcmVhayhpKSkKKyAgICAgICAgICAgIG51bVdvcmRC
cmVha3MrKzsKKyAgICB9CisKKyAgICBpZiAobnVtV29yZEJyZWFrcykKKyAgICAgICAgbV9wYWRQ
ZXJXb3JkQnJlYWsgPSBtX3BhZGRpbmcgLyBudW1Xb3JkQnJlYWtzOworICAgIGVsc2UKKyAgICAg
ICAgbV9wYWRQZXJXb3JkQnJlYWsgPSAwOworfQorCitmbG9hdCBDb21wbGV4VGV4dENvbnRyb2xs
ZXI6OndpZHRoT2ZGdWxsUnVuKCkKK3sKKyAgICBmbG9hdCB3aWR0aFN1bSA9IDA7CisgICAgd2hp
bGUgKG5leHRTY3JpcHRSdW4oKSkKKyAgICAgICAgd2lkdGhTdW0gKz0gd2lkdGgoKTsKKworICAg
IHJldHVybiB3aWR0aFN1bTsKK30KKworLy8gQWR2YW5jZSB0byB0aGUgbmV4dCBzY3JpcHQgcnVu
LCByZXR1cm5pbmcgZmFsc2Ugd2hlbiB0aGUgZW5kIG9mIHRoZQorLy8gVGV4dFJ1biBoYXMgYmVl
biByZWFjaGVkLgorYm9vbCBDb21wbGV4VGV4dENvbnRyb2xsZXI6Om5leHRTY3JpcHRSdW4oKQor
eworICAgIHVuc2lnbmVkIHJ1blRleHRMZW5ndGggPSBtX3J1bi5sZW5ndGgoKTsKKyAgICBpZiAo
bV9pbmRleE9mTmV4dFNjcmlwdFJ1biA+PSBydW5UZXh0TGVuZ3RoKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisKKyAgICBtX2luZGV4T2ZDdXJyZW50U2NyaXB0UnVuID0gbV9pbmRleE9mTmV4dFNj
cmlwdFJ1bjsKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRleHQgdG8gdGFrZSB0aGUgbGFy
Z2V0IHN1YnJlZ2lvbiB0aGF0IHN0YXlzIHdpdGhpbgorICAgIC8vIGEgc2luZ2xlIGZvbnQuCisg
ICAgY29uc3QgVUNoYXIqIHJ1blRleHQgPSBtX3J1bi5jaGFyYWN0ZXJzKCk7CisgICAgbV9jdXJy
ZW50Rm9udERhdGEgPSBtX2ZvbnQtPmdseXBoRGF0YUZvckNoYXJhY3RlcihydW5UZXh0W21faW5k
ZXhPZkN1cnJlbnRTY3JpcHRSdW5dLCBmYWxzZSkuZm9udERhdGE7CisgICAgdW5zaWduZWQgZW5k
T2ZSdW47CisgICAgZm9yIChlbmRPZlJ1biA9IG1faW5kZXhPZkN1cnJlbnRTY3JpcHRSdW4gKyAx
OyBlbmRPZlJ1biA8IHJ1blRleHRMZW5ndGg7ICsrZW5kT2ZSdW4pIHsKKyAgICAgICAgY29uc3Qg
U2ltcGxlRm9udERhdGEqIG5leHRGb250RGF0YSA9IG1fZm9udC0+Z2x5cGhEYXRhRm9yQ2hhcmFj
dGVyKHJ1blRleHRbZW5kT2ZSdW5dLCBmYWxzZSkuZm9udERhdGE7CisgICAgICAgIGlmIChuZXh0
Rm9udERhdGEgIT0gbV9jdXJyZW50Rm9udERhdGEpCisgICAgICAgICAgICBicmVhazsKKyAgICB9
CisgICAgbV9pbmRleE9mTmV4dFNjcmlwdFJ1biA9IGVuZE9mUnVuOworCisgICAgc2V0dXBTY3Jp
cHRSdW4oKTsKKyAgICBzaGFwZVNjcmlwdFJ1bigpOworICAgIGlmIChtX2N1cnJlbnRTY3JpcHRS
dW4tPm51bUdseXBocygpKQorICAgICAgICBzZXRHbHlwaFBvc2l0aW9ucygpOworCisgICAgcmV0
dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpzZXR1cFNjcmlwdFJ1
bigpCit7CisgICAgU3RyaW5nIHRleHQgPSBTdHJpbmcobV9ydW4uY2hhcmFjdGVycygpICsgbV9p
bmRleE9mQ3VycmVudFNjcmlwdFJ1biwgbV9pbmRleE9mTmV4dFNjcmlwdFJ1biAtIG1faW5kZXhP
ZkN1cnJlbnRTY3JpcHRSdW4pOworICAgIEZvbnREYXRhVmFyaWFudCBmb250RGF0YVZhcmlhbnQg
PSBBdXRvVmFyaWFudDsKKyAgICAvLyBEZXRlcm1pbmUgaWYgdGhpcyBzY3JpcHQgcnVuIG5lZWRz
IHRvIGJlIGNvbnZlcnRlZCB0byBzbWFsbCBjYXBzLgorICAgIC8vIG5leHRTY3JpcHRSdW4oKSB3
aWxsIGFsd2F5cyBzZW5kIHVzIGEgcnVuIG9mIHRoZSBzYW1lIGNhc2UsIGJlY2F1c2UgYQorICAg
IC8vIGNhc2UgY2hhbmdlIHdoaWxlIGluIHNtYWxsLWNhcHMgbW9kZSBhbHdheXMgcmVzdWx0cyBp
biBkaWZmZXJlbnQKKyAgICAvLyBGb250RGF0YSwgc28gd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRo
ZSBmaXJzdCBjaGFyYWN0ZXIncyBjYXNlLgorICAgIGlmIChtX2ZvbnQtPmlzU21hbGxDYXBzKCkg
JiYgdV9pc2xvd2VyKHRleHRbMF0pKSB7CisgICAgICAgIHRleHQubWFrZVVwcGVyKCk7CisgICAg
ICAgIGZvbnREYXRhVmFyaWFudCA9IFNtYWxsQ2Fwc1ZhcmlhbnQ7CisgICAgICAgIG1fY3VycmVu
dEZvbnREYXRhID0gbV9mb250LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIodGV4dFswXSwgZmFsc2Us
IGZvbnREYXRhVmFyaWFudCkuZm9udERhdGE7CisgICAgfQorICAgIG1fcGl4ZWxXaWR0aCA9IDA7
CisgICAgbV9jdXJyZW50U2NyaXB0UnVuID0gSGFyZmJ1enpTY3JpcHRSdW46OmNyZWF0ZSh0ZXh0
LCBtX2N1cnJlbnRGb250RGF0YSk7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpz
aGFwZVNjcmlwdFJ1bigpCit7CisgICAgbV9jdXJyZW50U2NyaXB0UnVuLT5zaGFwZUdseXBocygp
OworCisgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBzaGFwaW5nIHJlc3VsdCB0byBmaWxsIHRo
ZSBsb2dDbHVzdGVycworICAgIGhiX2dseXBoX2luZm9fdCogZ2x5cGhJbmZvcyA9IG1fY3VycmVu
dFNjcmlwdFJ1bi0+Z2x5cGhJbmZvcygpOworICAgIHVuc2lnbmVkIHNob3J0KiBsb2dDbHVzdGVy
cyA9IG1fY3VycmVudFNjcmlwdFJ1bi0+bG9nQ2x1c3RlcnMoKTsKKyAgICB1bnNpZ25lZCBudW1H
bHlwaHMgPSBtX2N1cnJlbnRTY3JpcHRSdW4tPm51bUdseXBocygpOworICAgIHVuc2lnbmVkIGlu
ZGV4ID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCBudW1HbHlwaHMpIHsKKyAgICAgICAgdW5zaWdu
ZWQgbmV4dEluZGV4ID0gaW5kZXggKyAxOworICAgICAgICB3aGlsZSAobmV4dEluZGV4IDwgbnVt
R2x5cGhzICYmIGdseXBoSW5mb3NbaW5kZXhdLmNsdXN0ZXIgPT0gZ2x5cGhJbmZvc1tuZXh0SW5k
ZXhdLmNsdXN0ZXIpCisgICAgICAgICAgICArK25leHRJbmRleDsKKyAgICAgICAgaWYgKHJ0bCgp
KSB7CisgICAgICAgICAgICBpbnQgbmV4dENsdXN0ZXIgPSBuZXh0SW5kZXggPCBudW1HbHlwaHMg
PyBnbHlwaEluZm9zW25leHRJbmRleF0uY2x1c3RlciA6IC0xOworICAgICAgICAgICAgZm9yIChp
bnQgaiA9IGdseXBoSW5mb3NbaW5kZXhdLmNsdXN0ZXI7IGogPiBuZXh0Q2x1c3RlcjsgLS1qKQor
ICAgICAgICAgICAgICAgIGxvZ0NsdXN0ZXJzW2pdID0gaW5kZXg7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICB1bnNpZ25lZCBuZXh0Q2x1c3RlciA9IG5leHRJbmRleCA8IG51bUdseXBo
cyA/IGdseXBoSW5mb3NbbmV4dEluZGV4XS5jbHVzdGVyIDogbV9jdXJyZW50U2NyaXB0UnVuLT5u
dW1Db2RlUG9pbnRzKCk7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSBnbHlwaEluZm9z
W2luZGV4XS5jbHVzdGVyOyBqIDwgbmV4dENsdXN0ZXI7ICsraikKKyAgICAgICAgICAgICAgICBs
b2dDbHVzdGVyc1tqXSA9IGluZGV4OworICAgICAgICB9CisgICAgICAgIGluZGV4ID0gbmV4dElu
ZGV4OworICAgIH0KK30KKwordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNldEdseXBoUG9z
aXRpb25zKCkKK3sKKyAgICBoYl9nbHlwaF9pbmZvX3QqIGdseXBoSW5mb3MgPSBtX2N1cnJlbnRT
Y3JpcHRSdW4tPmdseXBoSW5mb3MoKTsKKyAgICBoYl9nbHlwaF9wb3NpdGlvbl90KiBnbHlwaFBv
c2l0aW9ucyA9IG1fY3VycmVudFNjcmlwdFJ1bi0+Z2x5cGhQb3NpdGlvbnMoKTsKKyAgICB1bnNp
Z25lZCBudW1HbHlwaHMgPSBtX2N1cnJlbnRTY3JpcHRSdW4tPm51bUdseXBocygpOworICAgIHVp
bnQxNl90KiBnbHlwaHMgPSBtX2N1cnJlbnRTY3JpcHRSdW4tPmdseXBocygpOworICAgIFNrUG9p
bnQqIHBvc2l0aW9ucyA9IG1fY3VycmVudFNjcmlwdFJ1bi0+cG9zaXRpb25zKCk7CisKKyAgICAv
LyBJdGVyYXRlIHRocm91Z2ggdGhlIGdseXBocyBpbiBwaHlzaWNhbCBvcmRlciwgbm8gbmVlZCBm
bGlwcGluZyBmb3IgUlRMLgorICAgIC8vIEdseXBocyBhcmUgcG9zaXRpb25lZCBzdGFydGluZyBm
cm9tIG1fb2Zmc2V0WDsgdGhleSBhbHdheXMgZ28gcmlnaHR3YXJkcyBmcm9tIHRoZXJlLCBpbmNs
dWRpbmcgUlRMIG1vZGUuCisgICAgZG91YmxlIHRvdGFsQWR2YW5jZSA9IDA7CisgICAgdW5zaWdu
ZWQgbGFzdENsdXN0ZXIgPSBnbHlwaEluZm9zWzBdLmNsdXN0ZXI7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkgeworICAgICAgICAvLyBJZiB0aGUgY3VycmVudCBn
bHlwaCBpcyBqdXN0IGFmdGVyIGEgc3BhY2UsIGFkZCBpbiB0aGUgd29yZCBzcGFjaW5nLgorICAg
ICAgICBpZiAoIWxhc3RDbHVzdGVyIHx8IGxhc3RDbHVzdGVyICE9IGdseXBoSW5mb3NbaV0uY2x1
c3RlcikKKyAgICAgICAgICAgIHRvdGFsQWR2YW5jZSArPSBkZXRlcm1pbmVXb3JkQnJlYWtTcGFj
aW5nKGdseXBoSW5mb3NbaV0uY2x1c3Rlcik7CisKKyAgICAgICAgZ2x5cGhzW2ldID0gZ2x5cGhJ
bmZvc1tpXS5jb2RlcG9pbnQ7CisgICAgICAgIGRvdWJsZSBvZmZzZXRYID0gdHJ1bmNhdGVGaXhl
ZFBvaW50VG9JbnRlZ2VyKGdseXBoUG9zaXRpb25zW2ldLnhfb2Zmc2V0KTsKKyAgICAgICAgZG91
YmxlIG9mZnNldFkgPSAtdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2VyKGdseXBoUG9zaXRpb25z
W2ldLnlfb2Zmc2V0KTsKKyAgICAgICAgZG91YmxlIGFkdmFuY2UgPSB0cnVuY2F0ZUZpeGVkUG9p
bnRUb0ludGVnZXIoZ2x5cGhQb3NpdGlvbnNbaV0ueF9hZHZhbmNlKTsKKworICAgICAgICBwb3Np
dGlvbnNbaV0uc2V0KG1fb2Zmc2V0WCArIHRvdGFsQWR2YW5jZSArIG9mZnNldFgsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgbV9zdGFydGluZ1kgKyBvZmZzZXRZKTsKKworICAgICAgICBpZiAo
bV9jdXJyZW50Rm9udERhdGEtPmlzWmVyb1dpZHRoU3BhY2VHbHlwaChnbHlwaHNbaV0pKQorICAg
ICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gQXQgdGhlIGVuZCBvZiBlYWNoIGNsdXN0
ZXIsIGFkZCBpbiB0aGUgbGV0dGVyIHNwYWNpbmcuCisgICAgICAgIGlmIChsYXN0Q2x1c3RlciAh
PSBnbHlwaEluZm9zW2ldLmNsdXN0ZXIpCisgICAgICAgICAgICB0b3RhbEFkdmFuY2UgKz0gbV9s
ZXR0ZXJTcGFjaW5nOworCisgICAgICAgIHRvdGFsQWR2YW5jZSArPSBhZHZhbmNlOworICAgICAg
ICBsYXN0Q2x1c3RlciA9IGdseXBoSW5mb3NbaV0uY2x1c3RlcjsKKyAgICB9CisgICAgbV9waXhl
bFdpZHRoID0gc3RkOjptYXgodG90YWxBZHZhbmNlLCAwLjApOworICAgIG1fb2Zmc2V0WCArPSBt
X3BpeGVsV2lkdGg7Cit9CisKK3ZvaWQgQ29tcGxleFRleHRDb250cm9sbGVyOjpub3JtYWxpemVT
cGFjZXMoY29uc3QgVUNoYXIqIHNvdXJjZSwgYm9vbCBydGwsIFVDaGFyKiBkZXN0aW5hdGlvbiwg
aW50IGxlbmd0aCkKK3sKKyAgICBpbnQgcG9zaXRpb24gPSAwOworICAgIGJvb2wgZXJyb3IgPSBm
YWxzZTsKKyAgICAvLyBJdGVyYXRlIGNoYXJhY3RlcnMgaW4gc291cmNlIGFuZCBub3JtYWxpemUg
c3BhY2VzIGlmIG5lZWRlZC4KKyAgICB3aGlsZSAocG9zaXRpb24gPCBsZW5ndGgpIHsKKyAgICAg
ICAgVUNoYXIzMiBjaGFyYWN0ZXI7CisgICAgICAgIGludCBuZXh0UG9zaXRpb24gPSBwb3NpdGlv
bjsKKyAgICAgICAgVTE2X05FWFQoc291cmNlLCBuZXh0UG9zaXRpb24sIGxlbmd0aCwgY2hhcmFj
dGVyKTsKKyAgICAgICAgaWYgKEZvbnQ6OnRyZWF0QXNTcGFjZShjaGFyYWN0ZXIpKQorICAgICAg
ICAgICAgY2hhcmFjdGVyID0gJyAnOworICAgICAgICBlbHNlIGlmIChGb250Ojp0cmVhdEFzWmVy
b1dpZHRoU3BhY2VJbkNvbXBsZXhTY3JpcHQoY2hhcmFjdGVyKSkKKyAgICAgICAgICAgIGNoYXJh
Y3RlciA9IHplcm9XaWR0aFNwYWNlOworICAgICAgICBVMTZfQVBQRU5EKGRlc3RpbmF0aW9uLCBw
b3NpdGlvbiwgbGVuZ3RoLCBjaGFyYWN0ZXIsIGVycm9yKTsKKyAgICAgICAgQVNTRVJUKCFlcnJv
cik7CisgICAgICAgIHBvc2l0aW9uID0gbmV4dFBvc2l0aW9uOworICAgIH0KK30KKworY29uc3Qg
VGV4dFJ1biYgQ29tcGxleFRleHRDb250cm9sbGVyOjpnZXROb3JtYWxpemVkVGV4dFJ1bihjb25z
dCBUZXh0UnVuJiBvcmlnaW5hbFJ1biwgT3duUHRyPFRleHRSdW4+JiBub3JtYWxpemVkUnVuLCBP
d25BcnJheVB0cjxVQ2hhcj4mIG5vcm1hbGl6ZWRCdWZmZXIpCit7CisgICAgLy8gTm9ybWFsaXpl
IHRoZSB0ZXh0IHJ1biBpbiB0d28gd2F5czoKKyAgICAvLyAxKSBDb252ZXJ0IHRoZSB8b3JpZ2lu
YWxSdW58IHRvIE5GQyBub3JtYWxpemVkIGZvcm0gaWYgY29tYmluaW5nIGRpYWNyaXRpY2FsIG1h
cmtzCisgICAgLy8gKFUrMDMwMC4uKSBhcmUgdXNlZCBpbiB0aGUgcnVuLiBUaGlzIGNvbnZlcnNp
b24gaXMgbmVjZXNzYXJ5IHNpbmNlIG1vc3QgT3BlblR5cGUKKyAgICAvLyBmb250cyAoZS5nLiwg
QXJpYWwpIGRvbid0IGhhdmUgc3Vic3RpdHV0aW9uIHJ1bGVzIGZvciB0aGUgZGlhY3JpdGljYWwg
bWFya3MgaW4KKyAgICAvLyB0aGVpciBHU1VCIHRhYmxlcy4KKyAgICAvLworICAgIC8vIE5vdGUg
dGhhdCB3ZSBkb24ndCB1c2UgdGhlIGljdTo6Tm9ybWFsaXplcjo6aXNOb3JtYWxpemVkKFVOT1JN
X05GQykgQVBJIGhlcmUgc2luY2UKKyAgICAvLyB0aGUgQVBJIHJldHVybnMgRkFMU0UgKD0gbm90
IG5vcm1hbGl6ZWQpIGZvciBjb21wbGV4IHJ1bnMgdGhhdCBkb24ndCByZXF1aXJlIE5GQworICAg
IC8vIG5vcm1hbGl6YXRpb24gKGUuZy4sIEFyYWJpYyB0ZXh0KS4gVW5sZXNzIHRoZSBydW4gY29u
dGFpbnMgdGhlIGRpYWNyaXRpY2FsIG1hcmtzLAorICAgIC8vIEhhcmZidXp6IHdpbGwgZG8gdGhl
IHNhbWUgdGhpbmcgZm9yIHVzIHVzaW5nIHRoZSBHU1VCIHRhYmxlLgorICAgIC8vIDIpIENvbnZl
cnQgc3BhY2luZyBjaGFyYWN0ZXJzIGludG8gcGxhaW4gc3BhY2VzLCBhcyBzb21lIGZvbnRzIHdp
bGwgcHJvdmlkZSBnbHlwaHMKKyAgICAvLyBmb3IgY2hhcmFjdGVycyBsaWtlICdcbicgb3RoZXJ3
aXNlLgorCisgICAgLy8gQ29udmVydCB0byBORkMgZm9ybSBpZiB0aGUgdGV4dCBoYXMgZGlhY3Jp
dGljYWwgbWFya3MuCisgICAgaWN1OjpVbmljb2RlU3RyaW5nIG5vcm1hbGl6ZWRTdHJpbmc7Cisg
ICAgVUVycm9yQ29kZSBlcnJvciA9IFVfWkVST19FUlJPUjsKKworICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgb3JpZ2luYWxSdW4ubGVuZ3RoKCk7ICsraSkgeworICAgICAgICBVQ2hhciBjaCA9IG9y
aWdpbmFsUnVuW2ldOworICAgICAgICBpZiAoOjp1YmxvY2tfZ2V0Q29kZShjaCkgPT0gVUJMT0NL
X0NPTUJJTklOR19ESUFDUklUSUNBTF9NQVJLUykgeworICAgICAgICAgICAgaWN1OjpOb3JtYWxp
emVyOjpub3JtYWxpemUoaWN1OjpVbmljb2RlU3RyaW5nKG9yaWdpbmFsUnVuLmNoYXJhY3RlcnMo
KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsUnVuLmxl
bmd0aCgpKSwgVU5PUk1fTkZDLCAwIC8qIG5vIG9wdGlvbnMgKi8sCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkU3RyaW5nLCBlcnJvcik7CisgICAgICAg
ICAgICBpZiAoVV9GQUlMVVJFKGVycm9yKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2lu
YWxSdW47CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5v
cm1hbGl6ZSBzcGFjZS4KKyAgICBpbnQgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aDsKKyAgICBjb25z
dCBVQ2hhciogc291cmNlVGV4dDsKKyAgICBpZiAobm9ybWFsaXplZFN0cmluZy5pc0VtcHR5KCkp
IHsKKyAgICAgICAgbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCA9IG9yaWdpbmFsUnVuLmxlbmd0aCgp
OworICAgICAgICBzb3VyY2VUZXh0ID0gb3JpZ2luYWxSdW4uY2hhcmFjdGVycygpOworICAgIH0g
ZWxzZSB7CisgICAgICAgIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGggPSBub3JtYWxpemVkU3RyaW5n
Lmxlbmd0aCgpOworICAgICAgICBzb3VyY2VUZXh0ID0gbm9ybWFsaXplZFN0cmluZy5nZXRCdWZm
ZXIoKTsKKyAgICB9CisKKyAgICBub3JtYWxpemVkQnVmZmVyID0gYWRvcHRBcnJheVB0cihuZXcg
VUNoYXJbbm9ybWFsaXplZEJ1ZmZlckxlbmd0aCArIDFdKTsKKworICAgIG5vcm1hbGl6ZVNwYWNl
cyhzb3VyY2VUZXh0LCBvcmlnaW5hbFJ1bi5ydGwoKSwgbm9ybWFsaXplZEJ1ZmZlci5nZXQoKSwg
bm9ybWFsaXplZEJ1ZmZlckxlbmd0aCk7CisKKyAgICBub3JtYWxpemVkUnVuID0gYWRvcHRQdHIo
bmV3IFRleHRSdW4ob3JpZ2luYWxSdW4pKTsKKyAgICBub3JtYWxpemVkUnVuLT5zZXRUZXh0KG5v
cm1hbGl6ZWRCdWZmZXIuZ2V0KCksIG5vcm1hbGl6ZWRCdWZmZXJMZW5ndGgpOworICAgIHJldHVy
biAqbm9ybWFsaXplZFJ1bjsKK30KKworaW50IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6Z2x5cGhJ
bmRleEZvclhQb3NpdGlvbkluU2NyaXB0UnVuKGludCB0YXJnZXRYKSBjb25zdAoreworICAgIEFT
U0VSVChzdGF0aWNfY2FzdDx1bnNpZ25lZD4odGFyZ2V0WCkgPD0gbV9vZmZzZXRYICsgbV9waXhl
bFdpZHRoKTsKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIGdseXBocyBpbiBsb2dpY2FsIG9y
ZGVyLCBzZWVpbmcgd2hldGhlciB0YXJnZXRYIGZhbGxzIGJldHdlZW4gdGhlIHByZXZpb3VzCisg
ICAgLy8gcG9zaXRpb24gYW5kIGhhbGZ3YXkgdGhyb3VnaCB0aGUgY3VycmVudCBnbHlwaC4KKyAg
ICBTa1BvaW50KiBwb3NpdGlvbnMgPSBtX2N1cnJlbnRTY3JpcHRSdW4tPnBvc2l0aW9ucygpOwor
ICAgIGhiX2dseXBoX3Bvc2l0aW9uX3QqIGdseXBoUG9zaXRpb25zID0gbV9jdXJyZW50U2NyaXB0
UnVuLT5nbHlwaFBvc2l0aW9ucygpOworICAgIGludCBsYXN0WCA9IHJ0bCgpID8gbV9waXhlbFdp
ZHRoIDogMDsKKyAgICB1bnNpZ25lZCBudW1HbHlwaHMgPSBtX2N1cnJlbnRTY3JpcHRSdW4tPm51
bUdseXBocygpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1HbHlwaHM7ICsraSkg
eworICAgICAgICB1bnNpZ25lZCBnbHlwaEluZGV4ID0gcnRsKCkgPyBudW1HbHlwaHMgLSBpIC0g
MSA6IGk7CisgICAgICAgIGludCBhZHZhbmNlID0gdHJ1bmNhdGVGaXhlZFBvaW50VG9JbnRlZ2Vy
KGdseXBoUG9zaXRpb25zW2dseXBoSW5kZXhdLnhfYWR2YW5jZSk7CisgICAgICAgIGludCBuZXh0
WCA9IHBvc2l0aW9uc1tnbHlwaEluZGV4XS54KCkgKyBhZHZhbmNlIC8gMjsKKyAgICAgICAgaWYg
KHN0ZDo6bWluKG5leHRYLCBsYXN0WCkgPD0gdGFyZ2V0WCAmJiB0YXJnZXRYIDw9IHN0ZDo6bWF4
KG5leHRYLCBsYXN0WCkpCisgICAgICAgICAgICByZXR1cm4gZ2x5cGhJbmRleDsKKyAgICAgICAg
bGFzdFggPSBuZXh0WDsKKyAgICB9CisKKyAgICByZXR1cm4gcnRsKCkgPyAwIDogbnVtR2x5cGhz
IC0gMTsKK30KKworaW50IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6b2Zmc2V0Rm9yUG9zaXRpb24o
aW50IHRhcmdldFgpCit7CisgICAgdW5zaWduZWQgYmFzZVBvc2l0aW9uID0gMDsKKworICAgIGlu
dCB4ID0gbV9vZmZzZXRYOworICAgIHdoaWxlIChuZXh0U2NyaXB0UnVuKCkpIHsKKyAgICAgICAg
aW50IG5leHRYID0gbV9vZmZzZXRYOworCisgICAgICAgIGlmIChzdGQ6Om1pbih4LCBuZXh0WCkg
PD0gdGFyZ2V0WCAmJiB0YXJnZXRYIDw9IHN0ZDo6bWF4KHgsIG5leHRYKSkgeworICAgICAgICAg
ICAgLy8gVGhlIHggdmFsdWUgaW4gcXVlc3Rpb24gaXMgd2l0aGluIHRoaXMgc2NyaXB0IHJ1bi4K
KyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGdseXBoSW5kZXggPSBnbHlwaEluZGV4Rm9yWFBv
c2l0aW9uSW5TY3JpcHRSdW4odGFyZ2V0WCk7CisgICAgICAgICAgICBBU1NFUlQoZ2x5cGhJbmRl
eCA8IG1fY3VycmVudFNjcmlwdFJ1bi0+bnVtR2x5cGhzKCkpOworICAgICAgICAgICAgcmV0dXJu
IGJhc2VQb3NpdGlvbiArIG1fY3VycmVudFNjcmlwdFJ1bi0+Z2x5cGhJbmZvcygpW2dseXBoSW5k
ZXhdLmNsdXN0ZXI7CisgICAgICAgIH0KKyAgICAgICAgYmFzZVBvc2l0aW9uICs9IG1fY3VycmVu
dFNjcmlwdFJ1bi0+bnVtQ29kZVBvaW50cygpOworICAgIH0KKworICAgIHJldHVybiBiYXNlUG9z
aXRpb247Cit9CisKK2ludCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnhQb3NpdGlvbkZvck9mZnNl
dEluU2NyaXB0UnVuKHVuc2lnbmVkIG9mZnNldCkgY29uc3QKK3sKKyAgICBBU1NFUlQob2Zmc2V0
IDwgbV9jdXJyZW50U2NyaXB0UnVuLT5udW1Db2RlUG9pbnRzKCkpOworICAgIHVuc2lnbmVkIGds
eXBoSW5kZXggPSBtX2N1cnJlbnRTY3JpcHRSdW4tPmxvZ0NsdXN0ZXJzKClbb2Zmc2V0XTsKKyAg
ICBBU1NFUlQoZ2x5cGhJbmRleCA8IG1fY3VycmVudFNjcmlwdFJ1bi0+bnVtR2x5cGhzKCkpOwor
ICAgIGludCBwb3NpdGlvbiA9IG1fY3VycmVudFNjcmlwdFJ1bi0+cG9zaXRpb25zKClbZ2x5cGhJ
bmRleF0ueCgpOworICAgIGlmIChydGwoKSkKKyAgICAgICAgcG9zaXRpb24gKz0gdHJ1bmNhdGVG
aXhlZFBvaW50VG9JbnRlZ2VyKG1fY3VycmVudFNjcmlwdFJ1bi0+Z2x5cGhQb3NpdGlvbnMoKVtn
bHlwaEluZGV4XS54X2FkdmFuY2UpOworICAgIHJldHVybiBwb3NpdGlvbjsKK30KKworRmxvYXRS
ZWN0IENvbXBsZXhUZXh0Q29udHJvbGxlcjo6c2VsZWN0aW9uUmVjdChjb25zdCBGbG9hdFBvaW50
JiBwb2ludCwgaW50IGhlaWdodCwgaW50IGZyb20sIGludCB0bykKK3sKKyAgICBpbnQgZnJvbVgg
PSAtMSwgdG9YID0gLTE7CisgICAgaW50IHN0YXJ0WCA9IG1fb2Zmc2V0WDsKKyAgICAvLyBJdGVy
YXRlIHRocm91Z2ggdGhlIHNjcmlwdCBydW5zIGluIHBoeXNpY2FsIG9yZGVyLCBzZWFyY2hpbmcg
Zm9yIHRoZSBydW4gY292ZXJpbmcgdGhlIHBvc2l0aW9ucyBvZiBpbnRlcmVzdC4KKyAgICB3aGls
ZSAobmV4dFNjcmlwdFJ1bigpICYmIChmcm9tWCA9PSAtMSB8fCB0b1ggPT0gLTEpKSB7CisgICAg
ICAgIHVuc2lnbmVkIG51bUNvZGVQb2ludHMgPSBtX2N1cnJlbnRTY3JpcHRSdW4tPm51bUNvZGVQ
b2ludHMoKTsKKyAgICAgICAgaWYgKGZyb21YID09IC0xICYmIGZyb20gPj0gMCAmJiBzdGF0aWNf
Y2FzdDx1bnNpZ25lZD4oZnJvbSkgPCBudW1Db2RlUG9pbnRzKQorICAgICAgICAgICAgZnJvbVgg
PSB4UG9zaXRpb25Gb3JPZmZzZXRJblNjcmlwdFJ1bihmcm9tKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgZnJvbSAtPSBudW1Db2RlUG9pbnRzOworCisgICAgICAgIGlmICh0b1ggPT0gLTEg
JiYgdG8gPj0gMCAmJiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4odG8pIDwgbnVtQ29kZVBvaW50cykK
KyAgICAgICAgICAgIHRvWCA9IHhQb3NpdGlvbkZvck9mZnNldEluU2NyaXB0UnVuKHRvKTsKKyAg
ICAgICAgZWxzZQorICAgICAgICAgICAgdG8gLT0gbnVtQ29kZVBvaW50czsKKyAgICB9CisKKyAg
ICAvLyBUaGUgcG9zaXRpb24gaW4gcXVlc3Rpb24gbWlnaHQgYmUganVzdCBhZnRlciB0aGUgdGV4
dC4KKyAgICBpZiAoZnJvbVggPT0gLTEpCisgICAgICAgIGZyb21YID0gc3RhcnRYOworICAgIGlm
ICh0b1ggPT0gLTEpCisgICAgICAgIHRvWCA9IHJ0bCgpID8gc3RhcnRYIDogbV9vZmZzZXRYOwor
CisgICAgQVNTRVJUKGZyb21YICE9IC0xICYmIHRvWCAhPSAtMSk7CisKKyAgICBpZiAoZnJvbVgg
PCB0b1gpCisgICAgICAgIHJldHVybiBGbG9hdFJlY3QocG9pbnQueCgpICsgZnJvbVgsIHBvaW50
LnkoKSwgdG9YIC0gZnJvbVgsIGhlaWdodCk7CisgICAgcmV0dXJuIEZsb2F0UmVjdChwb2ludC54
KCkgKyB0b1gsIHBvaW50LnkoKSwgZnJvbVggLSB0b1gsIGhlaWdodCk7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJvbGxlck5nTGludXguaCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0NvbXBsZXhUZXh0Q29udHJvbGxlck5nTGlu
dXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwLi45MDc2OGFlMDU4NTUzN2MyNmU0MGQ3ZWQ0OWY3MDJlM2U3ZTFiMmJi
Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hy
b21pdW0vQ29tcGxleFRleHRDb250cm9sbGVyTmdMaW51eC5oCkBAIC0wLDAgKzEsMTU0IEBACisv
KgorICogQ29weXJpZ2h0IChjKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAg
ICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAq
IGRpc3RyaWJ1dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4g
bm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRv
cnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdp
dGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRP
UlMKKyAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05F
UiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisg
KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lm
bmRlZiBDb21wbGV4VGV4dENvbnRyb2xsZXJOZ0xpbnV4X2gKKyNkZWZpbmUgQ29tcGxleFRleHRD
b250cm9sbGVyTmdMaW51eF9oCisKKyNpbmNsdWRlICJIYXJmYnV6elNraWEuaCIKKyNpbmNsdWRl
ICJTa1BvaW50LmgiCisjaW5jbHVkZSAiU2tTY2FsYXIuaCIKKyNpbmNsdWRlICJUZXh0UnVuLmgi
CisKKyNpbmNsdWRlIDx1bmljb2RlL3VjaGFyLmg+CisjaW5jbHVkZSA8d3RmL093bkFycmF5UHRy
Lmg+CisjaW5jbHVkZSA8d3RmL093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Ns
YXNzIEZvbnQ7CitjbGFzcyBGb250UGxhdGZvcm1EYXRhOworY2xhc3MgU2ltcGxlRm9udERhdGE7
CisKKy8vIENvbXBsZXhUZXh0Q29udHJvbGxlciB3YWxrcyBhIFRleHRSdW4gYW5kIHByZXNlbnRz
IGVhY2ggc2NyaXB0IHJ1biBpbiBzZXF1ZW5jZS4gQQorLy8gVGV4dFJ1biBpcyBhIHNlcXVlbmNl
IG9mIGNvZGUtcG9pbnRzIHdpdGggdGhlIHNhbWUgZW1iZWRkaW5nIGxldmVsIChpLmUuIHRoZXkK
Ky8vIGFyZSBhbGwgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0KS4gQSBzY3JpcHQgcnVu
IGlzIGEgc3Vic2VxdWVuY2Ugd2hlcmUKKy8vIGFsbCB0aGUgY2hhcmFjdGVycyBoYXZlIHRoZSBz
YW1lIHNjcmlwdCAoZS5nLiBBcmFiaWMsIFRoYWkgZXRjKS4gU2hhcGluZyBpcworLy8gb25seSBl
dmVyIGRvbmUgd2l0aCBzY3JpcHQgcnVucyBzaW5jZSB0aGUgc2hhcGVycyBvbmx5IGtub3cgaG93
IHRvIGRlYWwgd2l0aAorLy8gYSBzaW5nbGUgc2NyaXB0LgorLy8KKy8vIEl0ZXJhdGlvbiBpcyBh
bHdheXMgaW4gbG9naWNhbCAoYWthIHJlYWRpbmcpIG9yZGVyLiBGb3IgUlRMIHRleHQgdGhhdCBt
ZWFucworLy8gdGhlIHJpZ2h0bW9zdCBwYXJ0IG9mIHRoZSB0ZXh0IHdpbGwgYmUgZmlyc3QuCisv
LworLy8gT25jZSB5b3UgaGF2ZSBzZXR1cCB0aGUgb2JqZWN0LCBjYWxsIHxuZXh0U2NyaXB0UnVu
fCB0byBnZXQgdGhlIGZpcnN0IHNjcmlwdAorLy8gcnVuLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNl
IHdoZW4gdGhlIGl0ZXJhdGlvbiBpcyBjb21wbGV0ZS4gQXQgYW55IHRpbWUgeW91CisvLyBjYW4g
Y2FsbCB8cmVzZXR8IHRvIHN0YXJ0IG92ZXIgYWdhaW4uCitjbGFzcyBDb21wbGV4VGV4dENvbnRy
b2xsZXIgeworcHVibGljOgorICAgIENvbXBsZXhUZXh0Q29udHJvbGxlcihjb25zdCBUZXh0UnVu
JiwgaW50IHN0YXJ0aW5nWCwgaW50IHN0YXJ0aW5nWSwgdW5zaWduZWQgd29yZFNwYWNpbmcsIHVu
c2lnbmVkIGxldHRlclNwYWNpbmcsIHVuc2lnbmVkIHBhZGRpbmcsIGNvbnN0IEZvbnQqKTsKKyAg
ICB+Q29tcGxleFRleHRDb250cm9sbGVyKCk7CisKKyAgICBib29sIGlzV29yZEJyZWFrKHVuc2ln
bmVkKTsKKyAgICBpbnQgZGV0ZXJtaW5lV29yZEJyZWFrU3BhY2luZyh1bnNpZ25lZCk7CisgICAg
Ly8gc2V0UGFkZGluZyBzZXRzIGEgbnVtYmVyIG9mIHBpeGVscyB0byBiZSBkaXN0cmlidXRlZCBh
Y3Jvc3MgdGhlIFRleHRSdW4uCisgICAgLy8gV2ViS2l0IHVzZXMgdGhpcyB0byBqdXN0aWZ5IHRl
eHQuCisgICAgdm9pZCBzZXRQYWRkaW5nKGludCk7CisgICAgLy8gRklYTUU6IFJlbW92ZSBhZnRl
ciBoYXJmYnV6eiB0cmFuc2l0aW9uIGlzIGNvbXBsZXRlZC4KKyAgICB2b2lkIHJlc2V0KGludCBv
ZmZzZXQpIHsgfQorICAgIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgc2NyaXB0IHJ1biwgcmV0dXJu
aW5nIGZhbHNlIHdoZW4gdGhlIGVuZCBvZiB0aGUKKyAgICAvLyBUZXh0UnVuIGhhcyBiZWVuIHJl
YWNoZWQuCisgICAgYm9vbCBuZXh0U2NyaXB0UnVuKCk7CisgICAgZmxvYXQgd2lkdGhPZkZ1bGxS
dW4oKTsKKworICAgIC8vIHNldFdvcmRTcGFjaW5nQWRqdXN0bWVudCBzZXRzIGEgZGVsdGEgKGlu
IHBpeGVscykgd2hpY2ggaXMgYXBwbGllZCBhdAorICAgIC8vIGVhY2ggd29yZCBicmVhayBpbiB0
aGUgVGV4dFJ1bi4KKyAgICB2b2lkIHNldFdvcmRTcGFjaW5nQWRqdXN0bWVudChpbnQgd29yZFNw
YWNpbmdBZGp1c3RtZW50KSB7IG1fd29yZFNwYWNpbmdBZGp1c3RtZW50ID0gd29yZFNwYWNpbmdB
ZGp1c3RtZW50OyB9CisKKyAgICAvLyBzZXRMZXR0ZXJTcGFjaW5nQWRqdXN0bWVudCBzZXRzIGFu
IGFkZGl0aW9uYWwgbnVtYmVyIG9mIHBpeGVscyB0aGF0IGlzCisgICAgLy8gYWRkZWQgdG8gdGhl
IGFkdmFuY2UgYWZ0ZXIgZWFjaCBvdXRwdXQgY2x1c3Rlci4gVGhpcyBtYXRjaGVzIHRoZSBiZWhh
dmlvdXIKKyAgICAvLyBvZiBXaWR0aEl0ZXJhdG9yOjphZHZhbmNlLgorICAgIHZvaWQgc2V0TGV0
dGVyU3BhY2luZ0FkanVzdG1lbnQoaW50IGxldHRlclNwYWNpbmdBZGp1c3RtZW50KSB7IG1fbGV0
dGVyU3BhY2luZyA9IGxldHRlclNwYWNpbmdBZGp1c3RtZW50OyB9CisgICAgaW50IGxldHRlclNw
YWNpbmcoKSBjb25zdCB7IHJldHVybiBtX2xldHRlclNwYWNpbmc7IH0KKyAgICAvLyBGSVhNRTog
UmVtb3ZlIGFmdGVyIGhhcmZidXp6IHRyYW5zaXRpb24gaXMgY29tcGxldGVkLgorICAgIHZvaWQg
c2V0dXBGb3JSVEwoKSB7IH0KKyAgICBib29sIHJ0bCgpIGNvbnN0IHsgcmV0dXJuIG1fcnVuLnJ0
bCgpOyB9CisgICAgY29uc3QgdWludDE2X3QqIGdseXBocygpIGNvbnN0IHsgcmV0dXJuIG1fY3Vy
cmVudFNjcmlwdFJ1bi0+Z2x5cGhzKCk7IH0KKworICAgIC8vIFJldHVybiB0aGUgbGVuZ3RoIG9m
IHRoZSBhcnJheSByZXR1cm5lZCBieSB8Z2x5cGhzfAorICAgIGNvbnN0IHVuc2lnbmVkIGxlbmd0
aCgpIGNvbnN0IHsgcmV0dXJuIG1fY3VycmVudFNjcmlwdFJ1bi0+bnVtR2x5cGhzKCk7IH0KKwor
ICAgIC8vIFJldHVybiB0aGUgb2Zmc2V0IGZvciBlYWNoIG9mIHRoZSBnbHlwaHMuIE5vdGUgdGhh
dCB0aGlzIGlzIHRyYW5zbGF0ZWQKKyAgICAvLyBieSB0aGUgY3VycmVudCB4IG9mZnNldCBhbmQg
dGhhdCB0aGUgeCBvZmZzZXQgaXMgdXBkYXRlZCBmb3IgZWFjaCBzY3JpcHQKKyAgICAvLyBydW4u
CisgICAgY29uc3QgU2tQb2ludCogcG9zaXRpb25zKCkgY29uc3QgeyByZXR1cm4gbV9jdXJyZW50
U2NyaXB0UnVuLT5wb3NpdGlvbnMoKTsgfQorCisgICAgLy8gcmV0dXJuIHRoZSBudW1iZXIgb2Yg
Y29kZSBwb2ludHMgaW4gdGhlIGN1cnJlbnQgc2NyaXB0IHJ1bgorICAgIGNvbnN0IHVuc2lnbmVk
IG51bUNvZGVQb2ludHMoKSBjb25zdCB7IHJldHVybiBtX2N1cnJlbnRTY3JpcHRSdW4tPm51bUNv
ZGVQb2ludHMoKTsgfQorCisgICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IHBpeGVsIHBvc2l0aW9u
IG9mIHRoZSBjb250cm9sbGVyLgorICAgIGNvbnN0IHVuc2lnbmVkIG9mZnNldFgoKSBjb25zdCB7
IHJldHVybiBtX29mZnNldFg7IH0KKworICAgIGNvbnN0IEZvbnRQbGF0Zm9ybURhdGEqIGZvbnRQ
bGF0Zm9ybURhdGFGb3JTY3JpcHRSdW4oKTsKKworICAgIGludCBvZmZzZXRGb3JQb3NpdGlvbihp
bnQpOworICAgIEZsb2F0UmVjdCBzZWxlY3Rpb25SZWN0KGNvbnN0IEZsb2F0UG9pbnQmLCBpbnQg
aGVpZ2h0LCBpbnQgZnJvbSAsIGludCB0byk7CisKK3ByaXZhdGU6CisgICAgLy8gUmV0dXJuIHRo
ZSB3aWR0aCAoaW4gcHgpIG9mIHRoZSBjdXJyZW50IHNjcmlwdCBydW4uCisgICAgdW5zaWduZWQg
d2lkdGgoKSBjb25zdCB7IHJldHVybiBtX3BpeGVsV2lkdGg7IH0KKworICAgIHZvaWQgc2V0dXBT
Y3JpcHRSdW4oKTsKKyAgICB2b2lkIHNoYXBlU2NyaXB0UnVuKCk7CisgICAgdm9pZCBzZXRHbHlw
aFBvc2l0aW9ucygpOworCisgICAgc3RhdGljIHZvaWQgbm9ybWFsaXplU3BhY2VzKGNvbnN0IFVD
aGFyKiBzb3VyY2UsIGJvb2wgcnRsLCBVQ2hhciogZGVzdGluYXRpb24sIGludCBsZW5ndGgpOwor
ICAgIHN0YXRpYyBjb25zdCBUZXh0UnVuJiBnZXROb3JtYWxpemVkVGV4dFJ1bihjb25zdCBUZXh0
UnVuJiBvcmlnaW5hbFJ1biwgT3duUHRyPFRleHRSdW4+JiBub3JtYWxpemVkUnVuLCBPd25BcnJh
eVB0cjxVQ2hhcj4mIG5vcm1hbGl6ZWRCdWZmZXIpOworCisgICAgLy8gVGhpcyBtYXRjaGVzIHRo
ZSBsb2dpYyBpbiBSZW5kZXJCbG9jazo6ZmluZE5leHRMaW5lQnJlYWsKKyAgICBzdGF0aWMgYm9v
bCBpc0NvZGVwb2ludFNwYWNlKFVDaGFyIGMpIHsgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0
JzsgfQorCisgICAgaW50IGdseXBoSW5kZXhGb3JYUG9zaXRpb25JblNjcmlwdFJ1bihpbnQgdGFy
Z2V0WCkgY29uc3Q7CisgICAgaW50IHhQb3NpdGlvbkZvck9mZnNldEluU2NyaXB0UnVuKHVuc2ln
bmVkIG9mZnNldCkgY29uc3Q7CisKKyAgICBjb25zdCBGb250KiBjb25zdCBtX2ZvbnQ7CisgICAg
Y29uc3QgU2ltcGxlRm9udERhdGEqIG1fY3VycmVudEZvbnREYXRhOworICAgIHNzaXplX3QgbV9p
bmRleE9mQ3VycmVudFNjcmlwdFJ1bjsKKyAgICBzc2l6ZV90IG1faW5kZXhPZk5leHRTY3JpcHRS
dW47CisgICAgdW5zaWduZWQgbV9vZmZzZXRYOyAvLyBPZmZzZXQgaW4gcGl4ZWxzIHRvIHRoZSBz
dGFydCBvZiB0aGUgbmV4dCBzY3JpcHQgcnVuLgorICAgIHVuc2lnbmVkIG1fc3RhcnRpbmdZOyAv
LyBUaGUgWSBzdGFydGluZyBwb2ludCBvZiB0aGUgc2NyaXB0IHJ1bi4KKyAgICB1bnNpZ25lZCBt
X3BpeGVsV2lkdGg7IC8vIFdpZHRoIChpbiBweCkgb2YgdGhlIGN1cnJlbnQgc2NyaXB0IHJ1bi4K
KworICAgIE93blB0cjxUZXh0UnVuPiBtX25vcm1hbGl6ZWRSdW47CisgICAgT3duQXJyYXlQdHI8
VUNoYXI+IG1fbm9ybWFsaXplZEJ1ZmZlcjsgLy8gQSBidWZmZXIgZm9yIG5vcm1hbGl6ZWQgcnVu
LgorICAgIGNvbnN0IFRleHRSdW4mIG1fcnVuOworICAgIE93blB0cjxIYXJmYnV6elNjcmlwdFJ1
bj4gbV9jdXJyZW50U2NyaXB0UnVuOworICAgIGludCBtX3dvcmRTcGFjaW5nQWRqdXN0bWVudDsg
Ly8gZGVsdGEgYWRqdXN0bWVudCAocGl4ZWxzKSBmb3IgZWFjaCB3b3JkIGJyZWFrLgorICAgIGZs
b2F0IG1fcGFkZGluZzsgLy8gcGl4ZWxzIHRvIGJlIGRpc3RyaWJ1dGVkIG92ZXIgdGhlIGxpbmUg
YXQgd29yZCBicmVha3MuCisgICAgZmxvYXQgbV9wYWRQZXJXb3JkQnJlYWs7IC8vIHBpeGVscyB0
byBiZSBhZGRlZCB0byBlYWNoIHdvcmQgYnJlYWsuCisgICAgZmxvYXQgbV9wYWRFcnJvcjsgLy8g
fG1fcGFkUGVyV29yZEJyZWFrfCBtaWdodCBoYXZlIGEgZnJhY3Rpb25hbCBjb21wb25lbnQuCisg
ICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2Ugb25seSBhZGQgYSB3aG9sZSBudW1iZXIg
b2YgcGFkZGluZyBwaXhlbHMgYXQKKyAgICAgICAgICAgICAgICAgICAgICAvLyBlYWNoIHdvcmQg
YnJlYWsgd2UgYWNjdW11bGF0ZSBlcnJvci4gVGhpcyBpcyB0aGUKKyAgICAgICAgICAgICAgICAg
ICAgICAvLyBudW1iZXIgb2YgcGl4ZWxzIHRoYXQgd2UgYXJlIGJlaGluZCBzbyBmYXIuCisgICAg
aW50IG1fbGV0dGVyU3BhY2luZzsgLy8gcGl4ZWxzIHRvIGJlIGFkZGVkIGFmdGVyIGVhY2ggZ2x5
cGguCisgICAgU3RyaW5nIG1fc21hbGxDYXBzU3RyaW5nOyAvLyBzdWJzdHJpbmcgb2YgbV9ydW4g
Y29udmVydGVkIHRvIHNtYWxsIGNhcHMuCit9OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisK
KyNlbmRpZiAvLyBDb21wbGV4VGV4dENvbnRyb2xsZXJOZ0xpbnV4X2gKZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0hhcmZidXp6TmdTa2lhLmNw
cCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0hhcmZidXp6TmdT
a2lhLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5lMmYxYmNiMzkyOGQzZjI4Y2I2NzZkMGRjN2ZkOGY1NTQ1OWFk
YzAyCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2hyb21pdW0vSGFyZmJ1enpOZ1NraWEuY3BwCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQ29w
eXJpZ2h0IChjKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisgKiBtZXQ6CisgKgorICogICAgICogUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAqIGluIHRoZSBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAqIGRpc3RyaWJ1
dGlvbi4KKyAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBu
YW1lcyBvZiBpdHMKKyAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHBy
b21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3Bl
Y2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAqICJB
UyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UCisgKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKyAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgKiBPV05FUiBPUiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwK
KyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisgKiBUSEVPUlkg
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorCisjaW5jbHVkZSAiSGFyZmJ1enpTa2lhLmgiCisKKyNpbmNsdWRlICJGb250UGxh
dGZvcm1EYXRhLmgiCisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKworI2luY2x1ZGUgIlNr
Rm9udEhvc3QuaCIKKyNpbmNsdWRlICJTa1BhaW50LmgiCisjaW5jbHVkZSAiU2tQYXRoLmgiCisj
aW5jbHVkZSAiU2tQb2ludC5oIgorI2luY2x1ZGUgIlNrUmVjdC5oIgorI2luY2x1ZGUgIlNrVXRp
bHMuaCIKKyNpbmNsdWRlICJoYi1nbGliLmgiCisjaW5jbHVkZSAiaGItb3QtbGF5b3V0LmgiCisj
aW5jbHVkZSAiaGIuaCIKKyNpbmNsdWRlIDx3dGYvT3duQXJyYXlQdHIuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitzdGF0aWMgaGJfcG9zaXRpb25fdCBTa2lhU2NhbGFyVG9IYXJmYnV6elBv
c2l0aW9uKFNrU2NhbGFyIHZhbHVlKQoreworICAgIC8vIGhiX3Bvc2l0aW9uX3QgaXMgYSAyNi42
IGZpeGVkIHBvaW50IGZvcm1hdC4KKyAgICByZXR1cm4gdmFsdWUgKiA2NDsKK30KKworc3RhdGlj
IHZvaWQgU2tpYUdldEdseXBoV2lkdGhBbmRFeHRlbnRzKFNrUGFpbnQqIHBhaW50LCBoYl9jb2Rl
cG9pbnRfdCBjb2RlcG9pbnQsIGhiX3Bvc2l0aW9uX3QqIHdpZHRoLCBoYl9nbHlwaF9leHRlbnRz
X3QqIGV4dGVudHMpCit7CisgICAgcGFpbnQtPnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprR2x5
cGhJRF9UZXh0RW5jb2RpbmcpOworCisgICAgU2tTY2FsYXIgc2tXaWR0aDsKKyAgICBTa1JlY3Qg
c2tCb3VuZHM7CisgICAgdWludDE2X3QgZ2x5cGggPSBjb2RlcG9pbnQ7CisKKyAgICBwYWludC0+
Z2V0VGV4dFdpZHRocygmZ2x5cGgsIHNpemVvZihnbHlwaCksICZza1dpZHRoLCAmc2tCb3VuZHMp
OworICAgIGlmICh3aWR0aCkKKyAgICAgICAgKndpZHRoID0gU2tpYVNjYWxhclRvSGFyZmJ1enpQ
b3NpdGlvbihza1dpZHRoKTsKKyAgICBpZiAoZXh0ZW50cykgeworICAgICAgICBleHRlbnRzLT54
X2JlYXJpbmcgPSBTa2lhU2NhbGFyVG9IYXJmYnV6elBvc2l0aW9uKHNrQm91bmRzLmZMZWZ0KTsK
KyAgICAgICAgZXh0ZW50cy0+eV9iZWFyaW5nID0gU2tpYVNjYWxhclRvSGFyZmJ1enpQb3NpdGlv
bihza0JvdW5kcy5mVG9wKTsKKyAgICAgICAgZXh0ZW50cy0+d2lkdGggPSBTa2lhU2NhbGFyVG9I
YXJmYnV6elBvc2l0aW9uKHNrQm91bmRzLndpZHRoKCkpOworICAgICAgICBleHRlbnRzLT5oZWln
aHQgPSBTa2lhU2NhbGFyVG9IYXJmYnV6elBvc2l0aW9uKHNrQm91bmRzLmhlaWdodCgpKTsKKyAg
ICB9Cit9CisKKy8vIE91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2FsbGJhY2tzIHdoaWNoIEhh
cmZidXp6IHJlcXVpcmVzIGJ5IHVzaW5nIFNraWEKKy8vIGNhbGxzLiBTZWUgdGhlIEhhcmZidXp6
IHNvdXJjZSBmb3IgcmVmZXJlbmNlcyBhYm91dCB3aGF0IHRoZXNlIGNhbGxiYWNrcyBkby4KKwor
c3RhdGljIGhiX2Jvb2xfdCBoYXJmYnV6ekdldEdseXBoKGhiX2ZvbnRfdCogaGJGb250LCB2b2lk
KiBmb250RGF0YSwgaGJfY29kZXBvaW50X3QgdW5pY29kZSwgaGJfY29kZXBvaW50X3QgdmFyaWF0
aW9uU2VsZWN0b3IsIGhiX2NvZGVwb2ludF90KiBnbHlwaCwgdm9pZCogdXNlckRhdGEpCit7Cisg
ICAgRm9udFBsYXRmb3JtRGF0YSogZm9udCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Rm9udFBsYXRmb3Jt
RGF0YSo+KGZvbnREYXRhKTsKKyAgICBTa1BhaW50IHBhaW50OworCisgICAgZm9udC0+c2V0dXBQ
YWludCgmcGFpbnQpOworICAgIHBhaW50LnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprVVRGMTZf
VGV4dEVuY29kaW5nKTsKKyAgICB1aW50MTZfdCB0ZXh0WzRdOworICAgIHNpemVfdCBsZW5ndGgg
PSBTa1VURjE2X0Zyb21VbmljaGFyKHVuaWNvZGUsIHRleHQpOworICAgIHVpbnQxNl90IGdseXBo
MTY7CisgICAgcGFpbnQudGV4dFRvR2x5cGhzKHRleHQsIGxlbmd0aCwgJmdseXBoMTYpOworICAg
ICpnbHlwaCA9IGdseXBoMTY7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBoYl9wb3Np
dGlvbl90IGhhcmZidXp6R2V0R2x5cGhIb3Jpem9udGFsQWR2YW5jZShoYl9mb250X3QqIGhiRm9u
dCwgdm9pZCogZm9udERhdGEsIGhiX2NvZGVwb2ludF90IGdseXBoLCB2b2lkKiB1c2VyRGF0YSkK
K3sKKyAgICBGb250UGxhdGZvcm1EYXRhKiBmb250ID0gcmVpbnRlcnByZXRfY2FzdDxGb250UGxh
dGZvcm1EYXRhKj4oZm9udERhdGEpOworICAgIGhiX3Bvc2l0aW9uX3QgYWR2YW5jZSA9IDA7Cisg
ICAgU2tQYWludCBwYWludDsKKworICAgIGZvbnQtPnNldHVwUGFpbnQoJnBhaW50KTsKKyAgICBT
a2lhR2V0R2x5cGhXaWR0aEFuZEV4dGVudHMoJnBhaW50LCBnbHlwaCwgJmFkdmFuY2UsIDApOwor
ICAgIHJldHVybiBhZHZhbmNlOworfQorCitzdGF0aWMgaGJfcG9zaXRpb25fdCBoYXJmYnV6ekdl
dEdseXBoVmVydGljYWxBZHZhbmNlKGhiX2ZvbnRfdCogaGJGb250LCB2b2lkKiBmb250RGF0YSwg
aGJfY29kZXBvaW50X3QgZ2x5cGgsIHZvaWQqIHVzZXJEYXRhKQoreworICAgIC8vIEZJWE1FOiBD
YW4ndCBzdXBwb3J0IHZlcnRpY2FsIGFkdmFuY2UgZm9yIG5vdyBiZWNhdXNlIFNraWEgZG9lc24n
dCBwcm92aWRlIHN1Y2ggZmVhdHVyZXMuCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBoYl9i
b29sX3QgaGFyZmJ1enpHZXRHbHlwaEhvcml6b250YWxPcmlnaW4oaGJfZm9udF90KiBoYkZvbnQs
IHZvaWQqIGZvbnREYXRhLCBoYl9jb2RlcG9pbnRfdCBnbHlwaCwgaGJfcG9zaXRpb25fdCogeCwg
aGJfcG9zaXRpb25fdCogeSwgdm9pZCogdXNlckRhdGEpCit7CisgICAgLy8gSnVzdCByZXR1cm4g
dHJ1ZSwgZm9sbG93aW5nIHRoZSB3YXkgdGhhdCBIYXJmYnV6ei1GcmVlVHlwZQorICAgIC8vIGlt
cGxlbWVudGF0aW9uIGRvZXMuCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBoYl9ib29s
X3QgaGFyZmJ1enpHZXRHbHlwaFZlcnRpY2FsT3JpZ2luKGhiX2ZvbnRfdCogaGJGb250LCB2b2lk
KiBmb250RGF0YSwgaGJfY29kZXBvaW50X3QgZ2x5cGgsIGhiX3Bvc2l0aW9uX3QqIHgsIGhiX3Bv
c2l0aW9uX3QqIHksIHZvaWQqIHVzZXJEYXRhKQoreworICAgIC8vIEZJWE1FOiBDYW4ndCBzdXBw
b3J0IHZlcnRpY2FsIG9yaWdpbiBmb3Igbm93IGJlY2F1c2UgU2tpYSBkb2Vzbid0IHByb3ZpZGUg
c3VjaCBmZWF0dXJlcy4KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBoYl9wb3NpdGlv
bl90IGhhcmZidXp6R2V0R2x5cGhIb3Jpem9udGFsS2VybmluZyhoYl9mb250X3QqIGhiRm9udCwg
dm9pZCogZm9udERhdGEsIGhiX2NvZGVwb2ludF90IGxlZnRHbHlwaCwgaGJfY29kZXBvaW50X3Qg
cmlnaHRHbHlwaCwgdm9pZCogdXNlckRhdGEpCit7CisgICAgLy8gRklYTUU6IFdlIG1pZ2h0IHdh
bnQgdG8gaGF2ZSBhIFNraWEgQVBJIHdoaWNoIGFsbG93cyB1cyB0byBnZXQga2VybmluZyBmcm9t
IHRoZSBmb250IHRvIGltcGxlbWVudCB0aGlzIGNhbGxiYWNrLgorICAgIHJldHVybiAwOworfQor
CitzdGF0aWMgaGJfcG9zaXRpb25fdCBoYXJmYnV6ekdldEdseXBoVmVydGljYWxLZXJuaW5nKGhi
X2ZvbnRfdCogaGJGb250LCB2b2lkKiBmb250RGF0YSwgaGJfY29kZXBvaW50X3QgdG9wR2x5cGgs
IGhiX2NvZGVwb2ludF90IGJvdHRvbUdseXBoLCB2b2lkKiB1c2VyRGF0YSkKK3sKKyAgICAvLyBX
b24ndCBzdXBwb3J0IHZlcnRpY2FsIGtlcm5pbmcgYmVjYXVzZSBGcmVlVHlwZSBkb2Vzbid0IHN1
cHBvcnQgaXQuCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBoYl9ib29sX3QgaGFyZmJ1enpH
ZXRHbHlwaEV4dGVudHMoaGJfZm9udF90KiBoYkZvbnQsIHZvaWQqIGZvbnREYXRhLCBoYl9jb2Rl
cG9pbnRfdCBnbHlwaCwgaGJfZ2x5cGhfZXh0ZW50c190KiBleHRlbnRzLCB2b2lkKiB1c2VyRGF0
YSkKK3sKKyAgICBGb250UGxhdGZvcm1EYXRhKiBmb250ID0gcmVpbnRlcnByZXRfY2FzdDxGb250
UGxhdGZvcm1EYXRhKj4oZm9udERhdGEpOworICAgIFNrUGFpbnQgcGFpbnQ7CisKKyAgICBmb250
LT5zZXR1cFBhaW50KCZwYWludCk7CisgICAgU2tpYUdldEdseXBoV2lkdGhBbmRFeHRlbnRzKCZw
YWludCwgZ2x5cGgsIDAsIGV4dGVudHMpOworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMg
aGJfYm9vbF90IGhhcmZidXp6R2V0R2x5cGhDb250b3VyUG9pbnQoaGJfZm9udF90KiBoYkZvbnQs
IHZvaWQqIGZvbnREYXRhLCBoYl9jb2RlcG9pbnRfdCBnbHlwaCwgdW5zaWduZWQgaW50IHBvaW50
SW5kZXgsIGhiX3Bvc2l0aW9uX3QqIHgsIGhiX3Bvc2l0aW9uX3QqIHksIHZvaWQqIHVzZXJEYXRh
KQoreworICAgIC8vIFdlIGNhbid0IHN1cHBvcnQgdGhpcy4gKFNraWEgZG9lc24ndCBwcm92aWRl
IHRoZSBmZWF0dXJlKQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGhiX2ZvbnRfZnVu
Y3NfdCogaGFyZmJ1enpTa2lhRm9udEZ1bmNzID0gMDsKKworc3RhdGljIGhiX2ZvbnRfZnVuY3Nf
dCogaGFyZmJ1enpTa2lhR2V0Rm9udEZ1bmNzKCkKK3sKKyAgICBpZiAoIWhhcmZidXp6U2tpYUZv
bnRGdW5jcykgeworICAgICAgICBoYXJmYnV6elNraWFGb250RnVuY3MgPSBoYl9mb250X2Z1bmNz
X2NyZWF0ZSgpOworICAgICAgICBoYl9mb250X2Z1bmNzX3NldF9nbHlwaF9mdW5jKGhhcmZidXp6
U2tpYUZvbnRGdW5jcywgaGFyZmJ1enpHZXRHbHlwaCwgMCwgMCk7CisgICAgICAgIGhiX2ZvbnRf
ZnVuY3Nfc2V0X2dseXBoX2hfYWR2YW5jZV9mdW5jKGhhcmZidXp6U2tpYUZvbnRGdW5jcywgaGFy
ZmJ1enpHZXRHbHlwaEhvcml6b250YWxBZHZhbmNlLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9m
dW5jc19zZXRfZ2x5cGhfdl9hZHZhbmNlX2Z1bmMoaGFyZmJ1enpTa2lhRm9udEZ1bmNzLCBoYXJm
YnV6ekdldEdseXBoVmVydGljYWxBZHZhbmNlLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9mdW5j
c19zZXRfZ2x5cGhfaF9vcmlnaW5fZnVuYyhoYXJmYnV6elNraWFGb250RnVuY3MsIGhhcmZidXp6
R2V0R2x5cGhIb3Jpem9udGFsT3JpZ2luLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9mdW5jc19z
ZXRfZ2x5cGhfdl9vcmlnaW5fZnVuYyhoYXJmYnV6elNraWFGb250RnVuY3MsIGhhcmZidXp6R2V0
R2x5cGhWZXJ0aWNhbE9yaWdpbiwgMCwgMCk7CisgICAgICAgIGhiX2ZvbnRfZnVuY3Nfc2V0X2ds
eXBoX2hfa2VybmluZ19mdW5jKGhhcmZidXp6U2tpYUZvbnRGdW5jcywgaGFyZmJ1enpHZXRHbHlw
aEhvcml6b250YWxLZXJuaW5nLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9mdW5jc19zZXRfZ2x5
cGhfdl9rZXJuaW5nX2Z1bmMoaGFyZmJ1enpTa2lhRm9udEZ1bmNzLCBoYXJmYnV6ekdldEdseXBo
VmVydGljYWxLZXJuaW5nLCAwLCAwKTsKKyAgICAgICAgaGJfZm9udF9mdW5jc19zZXRfZ2x5cGhf
ZXh0ZW50c19mdW5jKGhhcmZidXp6U2tpYUZvbnRGdW5jcywgaGFyZmJ1enpHZXRHbHlwaEV4dGVu
dHMsIDAsIDApOworICAgICAgICBoYl9mb250X2Z1bmNzX3NldF9nbHlwaF9jb250b3VyX3BvaW50
X2Z1bmMoaGFyZmJ1enpTa2lhRm9udEZ1bmNzLCBoYXJmYnV6ekdldEdseXBoQ29udG91clBvaW50
LCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIGhhcmZidXp6U2tpYUZvbnRGdW5jczsKK30KKwor
c3RhdGljIGhiX2Jsb2JfdCogaGFyZmJ1enpTa2lhR2V0VGFibGUoaGJfZmFjZV90KiBmYWNlLCBo
Yl90YWdfdCB0YWcsIHZvaWQqIHVzZXJEYXRhKQoreworICAgIEZvbnRQbGF0Zm9ybURhdGEqIGZv
bnQgPSByZWludGVycHJldF9jYXN0PEZvbnRQbGF0Zm9ybURhdGEqPih1c2VyRGF0YSk7CisKKyAg
ICBjb25zdCBzaXplX3QgdGFibGVTaXplID0gU2tGb250SG9zdDo6R2V0VGFibGVTaXplKGZvbnQt
PnVuaXF1ZUlEKCksIHRhZyk7CisgICAgaWYgKCF0YWJsZVNpemUpCisgICAgICAgIHJldHVybiAw
OworCisgICAgY2hhciogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZmFzdE1hbGxv
Yyh0YWJsZVNpemUpKTsKKyAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
c2l6ZV90IGFjdHVhbFNpemUgPSBTa0ZvbnRIb3N0OjpHZXRUYWJsZURhdGEoZm9udC0+dW5pcXVl
SUQoKSwgdGFnLCAwLCB0YWJsZVNpemUsIGJ1ZmZlcik7CisgICAgaWYgKHRhYmxlU2l6ZSAhPSBh
Y3R1YWxTaXplKQorICAgICAgICByZXR1cm4gMDsKKworICAgIHJldHVybiBoYl9ibG9iX2NyZWF0
ZSgoY29uc3QgY2hhciopYnVmZmVyLCB0YWJsZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgIEhCX01FTU9SWV9NT0RFX1dSSVRBQkxFLCBidWZmZXIsIGZhc3RGcmVlKTsKK30KKworSGFy
ZmJ1enpGYWNlOjpIYXJmYnV6ekZhY2UoRm9udFBsYXRmb3JtRGF0YSogcGxhdGZvcm1EYXRhKQor
ICAgIDogbV9wbGF0Zm9ybURhdGEocGxhdGZvcm1EYXRhKQoreworICAgIG1fZmFjZSA9IGhiX2Zh
Y2VfY3JlYXRlX2Zvcl90YWJsZXMoaGFyZmJ1enpTa2lhR2V0VGFibGUsIG1fcGxhdGZvcm1EYXRh
LCAwKTsKK30KKworSGFyZmJ1enpGYWNlOjp+SGFyZmJ1enpGYWNlKCkKK3sKKyAgICBoYl9mYWNl
X2Rlc3Ryb3kobV9mYWNlKTsKK30KKworSGFyZmJ1enpTY3JpcHRSdW46OkhhcmZidXp6U2NyaXB0
UnVuKGNvbnN0IFN0cmluZyYgdGV4dCwgY29uc3QgU2ltcGxlRm9udERhdGEqIGZvbnREYXRhKQor
ICAgIDogbV90ZXh0KHRleHQpCisgICAgLCBtX2ZvbnREYXRhKGZvbnREYXRhKQorICAgICwgbV9n
bHlwaHMoMCkKKyAgICAsIG1fcG9zaXRpb25zKDApCisgICAgLCBtX2xvZ0NsdXN0ZXJzKDApCit7
CisgICAgbV9oYXJmYnV6ekJ1ZmZlciA9IGhiX2J1ZmZlcl9jcmVhdGUobV90ZXh0Lmxlbmd0aCgp
KTsKKyAgICBoYl9idWZmZXJfc2V0X3VuaWNvZGVfZnVuY3MobV9oYXJmYnV6ekJ1ZmZlciwgaGJf
Z2xpYl9nZXRfdW5pY29kZV9mdW5jcygpKTsKKyAgICBoYl9idWZmZXJfYWRkX3V0ZjE2KG1faGFy
ZmJ1enpCdWZmZXIsIG1fdGV4dC5jaGFyYWN0ZXJzKCksIG1fdGV4dC5sZW5ndGgoKSwgMCwgbV90
ZXh0Lmxlbmd0aCgpKTsKK30KKworSGFyZmJ1enpTY3JpcHRSdW46On5IYXJmYnV6elNjcmlwdFJ1
bigpCit7CisgICAgZGVsZXRlW10gbV9nbHlwaHM7CisgICAgZGVsZXRlW10gbV9wb3NpdGlvbnM7
CisgICAgZGVsZXRlW10gbV9sb2dDbHVzdGVyczsKKyAgICBoYl9idWZmZXJfZGVzdHJveShtX2hh
cmZidXp6QnVmZmVyKTsKK30KKwordm9pZCBIYXJmYnV6elNjcmlwdFJ1bjo6c2hhcGVHbHlwaHMo
KQoreworICAgIGhiX2ZvbnRfdCogaGFyZmJ1enpGb250ID0gY3JlYXRlSGFyZmJ1enpGb250KCk7
CisgICAgaGJfc2hhcGUoaGFyZmJ1enpGb250LCBtX2hhcmZidXp6QnVmZmVyLCAwLCAwKTsKKyAg
ICBoYl9mb250X2Rlc3Ryb3koaGFyZmJ1enpGb250KTsKKyAgICBtX251bUdseXBocyA9IGhiX2J1
ZmZlcl9nZXRfbGVuZ3RoKG1faGFyZmJ1enpCdWZmZXIpOworICAgIGlmIChtX251bUdseXBocykg
eworICAgICAgICBtX2dseXBocyA9IG5ldyB1aW50MTZfdFttX251bUdseXBoc107CisgICAgICAg
IG1fcG9zaXRpb25zID0gbmV3IFNrUG9pbnRbbV9udW1HbHlwaHNdOworICAgICAgICBtX2xvZ0Ns
dXN0ZXJzID0gbmV3IHVuc2lnbmVkIHNob3J0W21fdGV4dC5sZW5ndGgoKV07CisgICAgfQorfQor
CisvLyBGSVhNRTogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBzY3JpcHQgd2hpY2gg
aGFzICd2ZXJ0JyBvciAndnJ0MicKKy8vIGZlYXR1cmVzIGluIHRoZSBmb250LiBTdWJzdGl0dXRp
b24gbWF5IGZhaWwgd2hlbiBzdWJzdGl0dXRlIGdseXBocyBhcmUgbm90CisvLyBpbiB0aGUgZmly
c3Qgc2NyaXB0Lgorc3RhdGljIGhiX3NjcmlwdF90IGZpbmRTY3JpcHRGb3JWZXJ0aWNhbEdseXBo
U3Vic3RpdHV0aW9uKGhiX2ZhY2VfdCogZmFjZSkKK3sKKyAgICBzdGF0aWMgY29uc3QgdW5zaWdu
ZWQgbWF4VGFnQ291bnQgPSAzMjsKKyAgICBzdGF0aWMgY29uc3QgaGJfdGFnX3QgdmVydEZlYXR1
cmVUYWdzW10gPSB7CisgICAgICAgIEhCX1RBRygndicsICdlJywgJ3InLCAndCcpLAorICAgICAg
ICBIQl9UQUcoJ3YnLCAncicsICd0JywgJzInKQorICAgIH07CisKKyAgICB1bnNpZ25lZCBzY3Jp
cHRDb3VudCA9IG1heFRhZ0NvdW50OworICAgIGhiX3RhZ190IHNjcmlwdFRhZ3NbbWF4VGFnQ291
bnRdOworICAgIGhiX290X2xheW91dF90YWJsZV9nZXRfc2NyaXB0X3RhZ3MoZmFjZSwgSEJfT1Rf
VEFHX0dTVUIsIDAsICZzY3JpcHRDb3VudCwgc2NyaXB0VGFncyk7CisgICAgZm9yICh1bnNpZ25l
ZCBzY3JpcHRJbmRleCA9IDA7IHNjcmlwdEluZGV4IDwgc2NyaXB0Q291bnQ7ICsrc2NyaXB0SW5k
ZXgpIHsKKyAgICAgICAgdW5zaWduZWQgbGFuZ3VhZ2VDb3VudCA9IG1heFRhZ0NvdW50OworICAg
ICAgICBoYl90YWdfdCBsYW5ndWFnZVRhZ3NbbWF4VGFnQ291bnRdOworICAgICAgICBoYl9vdF9s
YXlvdXRfc2NyaXB0X2dldF9sYW5ndWFnZV90YWdzKGZhY2UsIEhCX09UX1RBR19HU1VCLCBzY3Jp
cHRJbmRleCwgMCwgJmxhbmd1YWdlQ291bnQsIGxhbmd1YWdlVGFncyk7CisgICAgICAgIGZvciAo
dW5zaWduZWQgbGFuZ3VhZ2VJbmRleCA9IDA7IGxhbmd1YWdlSW5kZXggPCBsYW5ndWFnZUNvdW50
OyArK2xhbmd1YWdlQ291bnQpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBzaXplb2YodmVydEZlYXR1cmVUYWdzKSAvIHNpemVvZih2ZXJ0RmVhdHVyZVRhZ3NbMF0pOyAr
K2kpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBmZWF0dXJlSW5kZXg7CisgICAgICAgICAg
ICAgICAgaWYgKGhiX290X2xheW91dF9sYW5ndWFnZV9maW5kX2ZlYXR1cmUoZmFjZSwgSEJfT1Rf
VEFHX0dTVUIsIHNjcmlwdEluZGV4LCBsYW5ndWFnZUluZGV4LCB2ZXJ0RmVhdHVyZVRhZ3NbaV0s
ICZmZWF0dXJlSW5kZXgpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGJfb3RfdGFnX3Rv
X3NjcmlwdChzY3JpcHRUYWdzW3NjcmlwdEluZGV4XSk7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICB9CisgICAgcmV0dXJuIEhCX1NDUklQVF9JTlZBTElEOworfQorCit2b2lkIEhhcmZi
dXp6U2NyaXB0UnVuOjpmaWxsR2x5cGhzV2l0aFZlcnRpY2FsU3Vic3RpdHV0aW9uKHVpbnQxNl90
KiBnbHlwaHMsIHVuc2lnbmVkIGxlbmd0aCkKK3sKKyAgICBoYl9mb250X3QqIGhhcmZidXp6Rm9u
dCA9IGNyZWF0ZUhhcmZidXp6Rm9udCgpOworICAgIGhiX2J1ZmZlcl9zZXRfZGlyZWN0aW9uKG1f
aGFyZmJ1enpCdWZmZXIsIEhCX0RJUkVDVElPTl9UVEIpOworICAgIGhiX2J1ZmZlcl9zZXRfc2Ny
aXB0KG1faGFyZmJ1enpCdWZmZXIsIGZpbmRTY3JpcHRGb3JWZXJ0aWNhbEdseXBoU3Vic3RpdHV0
aW9uKG1fZm9udERhdGEtPnBsYXRmb3JtRGF0YSgpLmhhcmZidXp6RmFjZSgpLT5mYWNlKCkpKTsK
KyAgICBoYl9zaGFwZShoYXJmYnV6ekZvbnQsIG1faGFyZmJ1enpCdWZmZXIsIDAsIDApOworICAg
IGhiX2ZvbnRfZGVzdHJveShoYXJmYnV6ekZvbnQpOworCisgICAgaGJfZ2x5cGhfaW5mb190KiBp
bmZvcyA9IGdseXBoSW5mb3MoKTsKKyAgICBtX251bUdseXBocyA9IGhiX2J1ZmZlcl9nZXRfbGVu
Z3RoKG1faGFyZmJ1enpCdWZmZXIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBtX251
bUdseXBocyAmJiBpIDwgbGVuZ3RoOyArK2kpCisgICAgICAgIGdseXBoc1tpXSA9IGluZm9zW2ld
LmNvZGVwb2ludDsKK30KKworaGJfZ2x5cGhfaW5mb190KiBIYXJmYnV6elNjcmlwdFJ1bjo6Z2x5
cGhJbmZvcygpCit7CisgICAgcmV0dXJuIGhiX2J1ZmZlcl9nZXRfZ2x5cGhfaW5mb3MobV9oYXJm
YnV6ekJ1ZmZlciwgMCk7Cit9CisKK2hiX2dseXBoX3Bvc2l0aW9uX3QqIEhhcmZidXp6U2NyaXB0
UnVuOjpnbHlwaFBvc2l0aW9ucygpCit7CisgICAgcmV0dXJuIGhiX2J1ZmZlcl9nZXRfZ2x5cGhf
cG9zaXRpb25zKG1faGFyZmJ1enpCdWZmZXIsIDApOworfQorCitoYl9mb250X3QqIEhhcmZidXp6
U2NyaXB0UnVuOjpjcmVhdGVIYXJmYnV6ekZvbnQoKQoreworICAgIEZvbnRQbGF0Zm9ybURhdGEq
IG9wYXF1ZVBsYXRmb3JtRGF0YSA9IGNvbnN0X2Nhc3Q8Rm9udFBsYXRmb3JtRGF0YSo+KCZtX2Zv
bnREYXRhLT5mb250RGF0YUZvckNoYXJhY3RlcignICcpLT5wbGF0Zm9ybURhdGEoKSk7CisgICAg
aGJfZm9udF90KiBoYXJmYnV6ekZvbnQgPSBoYl9mb250X2NyZWF0ZShvcGFxdWVQbGF0Zm9ybURh
dGEtPmhhcmZidXp6RmFjZSgpLT5mYWNlKCkpOworICAgIGhiX2ZvbnRfc2V0X2Z1bmNzKGhhcmZi
dXp6Rm9udCwgaGFyZmJ1enpTa2lhR2V0Rm9udEZ1bmNzKCksIG9wYXF1ZVBsYXRmb3JtRGF0YSwg
MCAvKiBkZXN0cm95Ki8pOworICAgIGZsb2F0IHNpemUgPSBvcGFxdWVQbGF0Zm9ybURhdGEtPnNp
emUoKTsKKyAgICBoYl9mb250X3NldF9wcGVtKGhhcmZidXp6Rm9udCwgc2l6ZSwgc2l6ZSk7Cisg
ICAgY29uc3QgaW50IG11bHRpcGx5Rm9yMTZEb3QxNiA9IDEgPDwgMTY7CisgICAgaW50IHNjYWxl
ID0gc2l6ZSAqIG11bHRpcGx5Rm9yMTZEb3QxNiAvIDEwMDA7CisgICAgaGJfZm9udF9zZXRfc2Nh
bGUoaGFyZmJ1enpGb250LCBzY2FsZSwgc2NhbGUpOworICAgIHJldHVybiBoYXJmYnV6ekZvbnQ7
Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0hhcmZidXp6TmdTa2lhLmggYi9Tb3VyY2UvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6ek5nU2tpYS5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjYxMDI1ZDdjYjZkOTJiNWQ2YjExMzIzODg4NTc5YjE2MzQxNTQzYTMKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6
ek5nU2tpYS5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCBH
b29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAg
KiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
CisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBO
ZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBj
b250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRl
cml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBD
T1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRF
RCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBM
SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgSGFyZmJ1enpOZ1NraWFfaAorI2Rl
ZmluZSBIYXJmYnV6ek5nU2tpYV9oCisKKyNpbmNsdWRlIDx3dGYvT3duUHRyLmg+CisjaW5jbHVk
ZSA8d3RmL1Bhc3NPd25QdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1
ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9XVEZTdHJpbmcuaD4KKworY2xh
c3MgU2tQb2ludDsKKworc3RydWN0IF9oYl9mYWNlX3Q7CitzdHJ1Y3QgX2hiX2ZvbnRfdDsKK3N0
cnVjdCBfaGJfYnVmZmVyX3Q7CitzdHJ1Y3QgX2hiX2dseXBoX2luZm9fdDsKK3N0cnVjdCBfaGJf
Z2x5cGhfcG9zaXRpb25fdDsKKwordHlwZWRlZiBfaGJfZmFjZV90IGhiX2ZhY2VfdDsKK3R5cGVk
ZWYgX2hiX2ZvbnRfdCBoYl9mb250X3Q7Cit0eXBlZGVmIF9oYl9idWZmZXJfdCBoYl9idWZmZXJf
dDsKK3R5cGVkZWYgX2hiX2dseXBoX2luZm9fdCBoYl9nbHlwaF9pbmZvX3Q7Cit0eXBlZGVmIF9o
Yl9nbHlwaF9wb3NpdGlvbl90IGhiX2dseXBoX3Bvc2l0aW9uX3Q7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworY2xhc3MgRm9udFBsYXRmb3JtRGF0YTsKK2NsYXNzIFNpbXBsZUZvbnREYXRhOwor
CitjbGFzcyBIYXJmYnV6elNjcmlwdFJ1biB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NPd25Q
dHI8SGFyZmJ1enpTY3JpcHRSdW4+IGNyZWF0ZShjb25zdCBTdHJpbmcmIHRleHQsIGNvbnN0IFNp
bXBsZUZvbnREYXRhKiBmb250RGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFB0cjxI
YXJmYnV6elNjcmlwdFJ1bj4obmV3IEhhcmZidXp6U2NyaXB0UnVuKHRleHQsIGZvbnREYXRhKSk7
CisgICAgfQorICAgIH5IYXJmYnV6elNjcmlwdFJ1bigpOworCisgICAgdm9pZCBzaGFwZUdseXBo
cygpOworICAgIHVuc2lnbmVkIG51bUdseXBocygpIHsgcmV0dXJuIG1fbnVtR2x5cGhzOyB9Cisg
ICAgdWludDE2X3QqIGdseXBocygpIHsgcmV0dXJuIG1fZ2x5cGhzOyB9CisgICAgU2tQb2ludCog
cG9zaXRpb25zKCkgeyByZXR1cm4gbV9wb3NpdGlvbnM7IH0KKyAgICB1bnNpZ25lZCBudW1Db2Rl
UG9pbnRzKCkgeyByZXR1cm4gbV90ZXh0Lmxlbmd0aCgpOyB9CisgICAgdW5zaWduZWQgc2hvcnQq
IGxvZ0NsdXN0ZXJzKCkgeyByZXR1cm4gbV9sb2dDbHVzdGVyczsgfQorICAgIGNvbnN0IFNpbXBs
ZUZvbnREYXRhKiBmb250RGF0YSgpIHsgcmV0dXJuIG1fZm9udERhdGE7IH0KKyAgICBoYl9nbHlw
aF9pbmZvX3QqIGdseXBoSW5mb3MoKTsKKyAgICBoYl9nbHlwaF9wb3NpdGlvbl90KiBnbHlwaFBv
c2l0aW9ucygpOworCisgICAgdm9pZCBmaWxsR2x5cGhzV2l0aFZlcnRpY2FsU3Vic3RpdHV0aW9u
KHVpbnQxNl90KiBidWZmZXIsIHVuc2lnbmVkIGxlbmd0aCk7CisKK3ByaXZhdGU6CisgICAgSGFy
ZmJ1enpTY3JpcHRSdW4oY29uc3QgU3RyaW5nJiB0ZXh0LCBjb25zdCBTaW1wbGVGb250RGF0YSop
OworCisgICAgaGJfZm9udF90KiBjcmVhdGVIYXJmYnV6ekZvbnQoKTsKKyAgICB2b2lkIHNldHVw
TG9nQ2x1c3RlcnMoKTsKKworICAgIFN0cmluZyBtX3RleHQ7IC8vIFRoZSB0ZXh0IHRvIGJlIHNo
YXBlZC4KKyAgICBjb25zdCBTaW1wbGVGb250RGF0YSogbV9mb250RGF0YTsKKyAgICB1bnNpZ25l
ZCBtX251bUdseXBoczsKKyAgICB1aW50MTZfdCogbV9nbHlwaHM7IC8vIFRoZSBzaGFwaW5nIHJl
c3VsdC4KKyAgICBTa1BvaW50KiBtX3Bvc2l0aW9uczsgLy8gVGhlIHBvc2l0aW9ucyBvbiB3aGlj
aCBnbHlwaHMgc2hvdWxkIGJlIHJlbmRlcmVyZWQuCisgICAgdW5zaWduZWQgc2hvcnQqIG1fbG9n
Q2x1c3RlcnM7CisgICAgaGJfYnVmZmVyX3QqIG1faGFyZmJ1enpCdWZmZXI7IC8vIFRoZSBhc3Nv
Y2lhdGUgaGFyZmJ1enogYnVmZmVyLgorfTsKKworY2xhc3MgSGFyZmJ1enpGYWNlIDogcHVibGlj
IFJlZkNvdW50ZWQ8SGFyZmJ1enpGYWNlPiB7CitwdWJsaWM6CisgICAgc3RhdGljIFBhc3NSZWZQ
dHI8SGFyZmJ1enpGYWNlPiBjcmVhdGUoRm9udFBsYXRmb3JtRGF0YSogcGxhdGZvcm1EYXRhKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBIYXJmYnV6ekZhY2UocGxhdGZvcm1E
YXRhKSk7CisgICAgfQorICAgIH5IYXJmYnV6ekZhY2UoKTsKKworICAgIGhiX2ZhY2VfdCogZmFj
ZSgpIGNvbnN0IHsgcmV0dXJuIG1fZmFjZTsgfQorICAgIEZvbnRQbGF0Zm9ybURhdGEqIHBsYXRm
b3JtRGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1fcGxhdGZvcm1EYXRhOyB9CisKK3ByaXZhdGU6Cisg
ICAgZXhwbGljaXQgSGFyZmJ1enpGYWNlKEZvbnRQbGF0Zm9ybURhdGEqKTsKKworICAgIGhiX2Zh
Y2VfdCogbV9mYWNlOworICAgIEZvbnRQbGF0Zm9ybURhdGEqIG1fcGxhdGZvcm1EYXRhOworfTsK
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gSGFyZmJ1enpOZ1NraWFfaApk
aWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vSGFy
ZmJ1enpTa2lhLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9I
YXJmYnV6elNraWEuaAppbmRleCA5M2RjNzE4MjQwODUxNjdlMmU0ZjcxM2NiMTY2Nzk5OWMwMDRj
YTdkLi4zOTBkZDQyMDVkOGY1ZGIwZDdkZTI1YjQyYmJkZjE2ZmNjOWM5ODFlIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6elNraWEu
aAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9IYXJmYnV6
elNraWEuaApAQCAtMzEsNiArMzEsMTAgQEAKICNpZm5kZWYgSGFyZmJ1enpTa2lhX2gKICNkZWZp
bmUgSGFyZmJ1enpTa2lhX2gKIAorI2lmIFVTRShIQVJGQlVaWl9ORykKKyNpbmNsdWRlICJIYXJm
YnV6ek5nU2tpYS5oIgorI2Vsc2UKKwogI2luY2x1ZGUgPHd0Zi9SZWZDb3VudGVkLmg+CiAjaW5j
bHVkZSA8d3RmL1JlZlB0ci5oPgogCkBAIC02NCw0ICs2OCw2IEBAIEhCX0ZvbnRfKiBhbGxvY0hh
cmZidXp6Rm9udCgpOwogCiB9ICAvLyBuYW1lc3BhY2UgV2ViQ29yZQogCisjZW5kaWYgLy8gVVNF
KEhBUkZCVVpaX05HKQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3NraWEvR2x5cGhQYWdlVHJlZU5vZGVTa2lhLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL3NraWEvR2x5cGhQYWdlVHJlZU5vZGVTa2lhLmNwcAppbmRl
eCA0MDYxZjc0ZGIxNDY1MzQ1YzEwODhhZTZhZWUwY2NhNzJmNjkwMmFhLi45OWUyMjAxNzMyM2Zj
NGU4OWUxZTBjMzI0ODcxM2NjOGYwMjhiMGNiIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9za2lhL0dseXBoUGFnZVRyZWVOb2RlU2tpYS5jcHAKKysrIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvc2tpYS9HbHlwaFBhZ2VUcmVlTm9kZVNraWEu
Y3BwCkBAIC0zOSwxMiArMzksNjQgQEAKICNpbmNsdWRlICJTa1BhaW50LmgiCiAjaW5jbHVkZSAi
U2tVdGlscy5oIgogCisjaWYgIVVTRShIQVJGQlVaWl9ORykKIGV4dGVybiAiQyIgewogI2luY2x1
ZGUgImhhcmZidXp6LXNoYXBlci5oIgogfQorI2VuZGlmIC8vICFVU0UoSEFSRkJVWlpfTkcpCiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorI2lmIFVTRShIQVJGQlVaWl9ORykKK2Jvb2wgR2x5cGhQ
YWdlOjpmaWxsKHVuc2lnbmVkIG9mZnNldCwgdW5zaWduZWQgbGVuZ3RoLCBVQ2hhciogYnVmZmVy
LCB1bnNpZ25lZCBidWZmZXJMZW5ndGgsIGNvbnN0IFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSkK
K3sKKyAgICBpZiAoU2tVVEYxNl9Jc0hpZ2hTdXJyb2dhdGUoYnVmZmVyW2J1ZmZlckxlbmd0aC0x
XSkpIHsKKyAgICAgICAgU2tEZWJ1Z2YoIiVzIGxhc3QgY2hhciBpcyBoaWdoLXN1cnJvZ2F0ZSIs
IF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29s
IGxvb2tWYXJpYW50cyA9IGZhbHNlOworICAgIGlmIChmb250RGF0YS0+aGFzVmVydGljYWxHbHlw
aHMoKSkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgYnVmZmVyTGVuZ3RoOyAr
K2kpIHsKKyAgICAgICAgICAgIGlmICghRm9udDo6aXNDSktJZGVvZ3JhcGgoYnVmZmVyW2ldKSkg
eworICAgICAgICAgICAgICAgIGxvb2tWYXJpYW50cyA9IHRydWU7CisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTa0F1dG9T
VE1hbGxvYyA8R2x5cGhQYWdlOjpzaXplLCB1aW50MTZfdD4gZ2x5cGhTdG9yYWdlKGxlbmd0aCk7
CisgICAgdWludDE2X3QqIGdseXBocyA9IGdseXBoU3RvcmFnZS5nZXQoKTsKKyAgICBpZiAobG9v
a1ZhcmlhbnRzKSB7CisgICAgICAgIFN0cmluZyB0ZXh0KGJ1ZmZlciwgYnVmZmVyTGVuZ3RoKTsK
KyAgICAgICAgT3duUHRyPEhhcmZidXp6U2NyaXB0UnVuPiBydW4gPSBIYXJmYnV6elNjcmlwdFJ1
bjo6Y3JlYXRlKHRleHQsIGZvbnREYXRhKTsKKyAgICAgICAgcnVuLT5maWxsR2x5cGhzV2l0aFZl
cnRpY2FsU3Vic3RpdHV0aW9uKGdseXBocywgbGVuZ3RoKTsKKyAgICAgICAgaWYgKHJ1bi0+bnVt
R2x5cGhzKCkgIT0gbGVuZ3RoKSB7CisgICAgICAgICAgICBTa0RlYnVnZigiJXMgbnVtR2x5cGhz
ICE9IGxlbmd0aFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIFNrUGFpbnQgcGFpbnQ7CisgICAgICAg
IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5zZXR1cFBhaW50KCZwYWludCk7CisgICAgICAgIHBh
aW50LnNldFRleHRFbmNvZGluZyhTa1BhaW50OjprVVRGMTZfVGV4dEVuY29kaW5nKTsKKworICAg
ICAgICAvLyB0ZXh0VG9HbHlwaHMgdGFrZXMgYSBieXRlIGNvdW50LCBub3QgYSBnbHlwaCBjb3Vu
dCBzbyB3ZSBtdWx0aXBseSBieSB0d28uCisgICAgICAgIHVuc2lnbmVkIGNvdW50ID0gcGFpbnQu
dGV4dFRvR2x5cGhzKGJ1ZmZlciwgYnVmZmVyTGVuZ3RoICogMiwgZ2x5cGhzKTsKKyAgICAgICAg
aWYgKGNvdW50ICE9IGxlbmd0aCkgeworICAgICAgICAgICAgU2tEZWJ1Z2YoIiVzIGNvdW50ICE9
IGxlbmd0aFxuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgIH0KKworICAgIHVuc2lnbmVkIGFsbEdseXBocyA9IDA7IC8vIHRyYWNrIGlm
IGFueSBvZiB0aGUgZ2x5cGhJRHMgYXJlIG5vbi16ZXJvCisgICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgIHNldEdseXBoRGF0YUZvckluZGV4KG9mZnNl
dCArIGksIGdseXBoc1tpXSwgZ2x5cGhzW2ldID8gZm9udERhdGEgOiAwKTsKKyAgICAgICAgYWxs
R2x5cGhzIHw9IGdseXBoc1tpXTsKKyAgICB9CisKKyAgICByZXR1cm4gYWxsR2x5cGhzOworfQor
I2Vsc2UKIHN0YXRpYyBpbnQgc3Vic3RpdHV0ZVdpdGhWZXJ0aWNhbEdseXBocyhjb25zdCBTaW1w
bGVGb250RGF0YSogZm9udERhdGEsIHVpbnQxNl90KiBnbHlwaHMsIHVuc2lnbmVkIGJ1ZmZlckxl
bmd0aCkKIHsKICAgICBIQl9GYWNlUmVjXyogaGJGYWNlID0gZm9udERhdGEtPnBsYXRmb3JtRGF0
YSgpLmhhcmZidXp6RmFjZSgpLT5mYWNlKCk7CkBAIC0xMTUsNSArMTY3LDYgQEAgYm9vbCBHbHlw
aFBhZ2U6OmZpbGwodW5zaWduZWQgb2Zmc2V0LCB1bnNpZ25lZCBsZW5ndGgsIFVDaGFyKiBidWZm
ZXIsIHVuc2lnbmVkIGIKIAogICAgIHJldHVybiBhbGxHbHlwaHMgIT0gMDsKIH0KKyNlbmRpZiAv
LyBVU0UoSEFSRkJVWlpfTkcpCiAKIH0gIC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL2ZlYXR1cmVzLmd5cGkgYi9Tb3VyY2UvV2ViS2l0L2No
cm9taXVtL2ZlYXR1cmVzLmd5cGkKaW5kZXggNDNkYjQ4MzQyZGYzYTJjMzBiNWU0MDRlYWU2MGVh
NWE4MmIwNzkzOC4uNjliZTVjMjRiMTE2NTM0ODcxYTM0OTNkNzliYjgzZGM4ODI4ZWEyZiAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9mZWF0dXJlcy5neXBpCisrKyBiL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vZmVhdHVyZXMuZ3lwaQpAQCAtMTEwLDYgKzExMCw3IEBACiAgICAg
ICAnZW5hYmxlX3RvdWNoX2ljb25fbG9hZGluZyUnIDogMCwKICAgICAgICdlbmFibGVfc21vb3Ro
X3Njcm9sbGluZyUnOiAwLAogICAgICAgJ2VuYWJsZV9jc3MzX2ZsZXhib3glJzogMCwKKyAgICAg
ICd1c2VfaGFyZmJ1enpfbmclJzogMCwKICAgICB9LAogICAgICd1c2VfYWNjZWxlcmF0ZWRfY29t
cG9zaXRpbmclJzogJzwodXNlX2FjY2VsZXJhdGVkX2NvbXBvc2l0aW5nKScsCiAgICAgJ3VzZV90
aHJlYWRlZF9jb21wb3NpdGluZyUnOiAnPCh1c2VfdGhyZWFkZWRfY29tcG9zaXRpbmcpJywKQEAg
LTE2NCw2ICsxNjUsMTEgQEAKICAgICAgICAgICAnRU5BQkxFX0NTUzNfRkxFWEJPWD0xJywKICAg
ICAgICAgXSwKICAgICAgIH1dLAorICAgICAgWyd1c2VfaGFyZmJ1enpfbmc9PTEnLCB7CisgICAg
ICAgICdmZWF0dXJlX2RlZmluZXMnOiBbCisgICAgICAgICAgJ1dURl9VU0VfSEFSRkJVWlpfTkc9
MScsCisgICAgICAgIF0sCisgICAgICB9XSwKICAgICBdLAogICB9LAogfQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>