<?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>23436</bug_id>
          
          <creation_ts>2009-01-20 11:15:46 -0800</creation_ts>
          <short_desc>Upstream rendering/RenderThemeChromium*</short_desc>
          <delta_ts>2009-01-20 11:39:41 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Darin Fisher (:fishd, Google)">fishd</reporter>
          <assigned_to name="Darin Fisher (:fishd, Google)">fishd</assigned_to>
          
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>106347</commentid>
    <comment_count>0</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-20 11:15:46 -0800</bug_when>
    <thetext>Upstream rendering/RenderThemeChromium*

From here:
http://src.chromium.org/viewvc/chrome/trunk/deps/third_party/WebKit/WebCore/rendering/</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106349</commentid>
    <comment_count>1</comment_count>
      <attachid>26865</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-20 11:24:19 -0800</bug_when>
    <thetext>Created attachment 26865
v1 patch

These files are forks of the corresponding RenderTheme{Win,Mac,Gtk} files.  Our changes are significant, and so it would be nice to refactor some things in order to make it possible to share what we can with other ports.  That is work that is easier to do once all files live in the same repository.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106353</commentid>
    <comment_count>2</comment_count>
      <attachid>26865</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-01-20 11:34:36 -0800</bug_when>
    <thetext>Comment on attachment 26865
v1 patch

Looks fine.  rs=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>106356</commentid>
    <comment_count>3</comment_count>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2009-01-20 11:39:41 -0800</bug_when>
    <thetext>http://trac.webkit.org/changeset/40062</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26865</attachid>
            <date>2009-01-20 11:24:19 -0800</date>
            <delta_ts>2009-01-20 11:34:36 -0800</delta_ts>
            <desc>v1 patch</desc>
            <filename>theme_1.diff</filename>
            <type>text/plain</type>
            <size>144946</size>
            <attacher name="Darin Fisher (:fishd, Google)">fishd</attacher>
            
              <data encoding="base64">SW5kZXg6IENoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBDaGFuZ2VMb2cJKHJldmlzaW9uIDQwMDYw
KQorKysgQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTcgQEAKKzIwMDktMDEt
MjAgIERhcmluIEZpc2hlciAgPGRhcmluQGNocm9taXVtLm9yZz4KKworICAgICAgICBSZXZpZXdl
ZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MjM0MzYKKyAgICAgICAgVXBzdHJlYW0gcmVuZGVyaW5nL1JlbmRlclRo
ZW1lQ2hyb21pdW0qCisKKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bUd0
ay5jcHA6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtR3Rr
Lmg6IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtTWFjLmg6
IEFkZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtTWFjLm1tOiBB
ZGRlZC4KKyAgICAgICAgKiByZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bVdpbi5jcHA6IEFk
ZGVkLgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtV2luLmg6IEFkZGVk
LgorCiAyMDA5LTAxLTIwICBEYXJpbiBBZGxlciAgPGRhcmluQGFwcGxlLmNvbT4KIAogICAgICAg
ICBSZXZpZXdlZCBieSBNYXJrIFJvd2UuCkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJv
bWl1bUd0ay5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1H
dGsuY3BwCShyZXZpc2lvbiAwKQorKysgcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1HdGsu
Y3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDUzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwNyBBcHBsZSBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxwIFRva2VyIDxhbHBAYXRv
a2VyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBDb2xsYWJvcmEgTHRkLgorICogQ29weXJp
Z2h0IChDKSAyMDA4LCAyMDA5IEdvb2dsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZy
ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl
cgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZ
OyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElU
WSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxl
IENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiUmVuZGVyVGhlbWVDaHJvbWl1bUd0ay5oIgorCisjaW5jbHVkZSAiQ2hyb21pdW1C
cmlkZ2UuaCIKKyNpbmNsdWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJQbGF0
Zm9ybUNvbnRleHRTa2lhLmgiCisjaW5jbHVkZSAiUmVuZGVyT2JqZWN0LmgiCisjaW5jbHVkZSAi
U2Nyb2xsYmFyVGhlbWUuaCIKKyNpbmNsdWRlICJndGtkcmF3aW5nLmgiCisjaW5jbHVkZSAiR2Rr
U2tpYS5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVkZSAiVXNl
ckFnZW50U3R5bGVTaGVldHMuaCIKKworI2luY2x1ZGUgPGdkay9nZGsuaD4KKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCitlbnVtIFBhZGRpbmdUeXBlIHsKKyAgICBUb3BQYWRkaW5nLAorICAgIFJp
Z2h0UGFkZGluZywKKyAgICBCb3R0b21QYWRkaW5nLAorICAgIExlZnRQYWRkaW5nCit9OworCitz
dGF0aWMgY29uc3QgaW50IHN0eWxlZE1lbnVMaXN0SW50ZXJuYWxQYWRkaW5nWzRdID0geyAxLCA0
LCAxLCA0IH07CisKKy8vIFRoZSBkZWZhdWx0IHZhcmlhYmxlLXdpZHRoIGZvbnQgc2l6ZS4gIFdl
IHVzZSB0aGlzIGFzIHRoZSBkZWZhdWx0IGZvbnQKKy8vIHNpemUgZm9yIHRoZSAic3lzdGVtIGZv
bnQiLCBhbmQgYXMgYSBiYXNlIHNpemUgKHdoaWNoIHdlIHRoZW4gc2hyaW5rKSBmb3IKKy8vIGZv
cm0gY29udHJvbCBmb250cy4KK3N0YXRpYyBmbG9hdCBEZWZhdWx0Rm9udFNpemUgPSAxNi4wOwor
CitzdGF0aWMgQ29sb3IgbWFrZUNvbG9yKGNvbnN0IEdka0NvbG9yJiBjKQoreworICAgIHJldHVy
biBDb2xvcihtYWtlUkdCKGMucmVkID4+IDgsIGMuZ3JlZW4gPj4gOCwgYy5ibHVlID4+IDgpKTsK
K30KKworLy8gV2UgYWltIHRvIG1hdGNoIElFIGhlcmUuCisvLyAtSUUgdXNlcyBhIGZvbnQgYmFz
ZWQgb24gdGhlIGVuY29kaW5nIGFzIHRoZSBkZWZhdWx0IGZvbnQgZm9yIGZvcm0gY29udHJvbHMu
CisvLyAtR2Vja28gdXNlcyBNUyBTaGVsbCBEbGcgKGFjdHVhbGx5IGNhbGxzIEdldFN0b2NrT2Jq
ZWN0KERFRkFVTFRfR1VJX0ZPTlQpLAorLy8gd2hpY2ggcmV0dXJucyBNUyBTaGVsbCBEbGcpCisv
LyAtU2FmYXJpIHVzZXMgTHVjaWRhIEdyYW5kZS4KKy8vCisvLyBGSVhNRTogVGhlIG9ubHkgY2Fz
ZSB3aGVyZSB3ZSBrbm93IHdlIGRvbid0IG1hdGNoIElFIGlzIGZvciBBTlNJIGVuY29kaW5ncy4K
Ky8vIElFIHVzZXMgTVMgU2hlbGwgRGxnIHRoZXJlLCB3aGljaCB3ZSByZW5kZXIgaW5jb3JyZWN0
bHkgYXQgY2VydGFpbiBwaXhlbAorLy8gc2l6ZXMgKGUuZy4gMTVweCkuIFNvLCBmb3Igbm93IHdl
IGp1c3QgdXNlIEFyaWFsLgorc3RhdGljIGNvbnN0IGNoYXIqIGRlZmF1bHRHVUlGb250KERvY3Vt
ZW50KiBkb2N1bWVudCkKK3sKKyAgICByZXR1cm4gIkFyaWFsIjsKK30KKworLy8gQ29udmVydHMg
cG9pbnRzIHRvIHBpeGVscy4gIE9uZSBwb2ludCBpcyAxLzcyIG9mIGFuIGluY2guCitzdGF0aWMg
ZmxvYXQgcG9pbnRzVG9QaXhlbHMoZmxvYXQgcG9pbnRzKQoreworICAgIHN0YXRpYyBmbG9hdCBw
aXhlbHNQZXJJbmNoID0gMC4wZjsKKyAgICBpZiAoIXBpeGVsc1BlckluY2gpIHsKKyAgICAgICAg
R2RrU2NyZWVuKiBzY3JlZW4gPSBnZGtfc2NyZWVuX2dldF9kZWZhdWx0KCk7CisgICAgICAgIC8v
IEZJWE1FOiAgSSdtIGdldHRpbmcgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIG9mIH43NSBhbmQgfjEw
MCwKKyAgICAgICAgLy8gYW5kIGl0J3MgbWFraW5nIG15IGZvbnRzIGxvb2sgYWxsIHdyb25nLiAg
RmlndXJlIHRoaXMgb3V0LgorI2lmIDAKKyAgICAgICAgaWYgKHNjcmVlbikKKyAgICAgICAgICAg
IHBpeGVsc1BlckluY2ggPSBnZGtfc2NyZWVuX2dldF9yZXNvbHV0aW9uKHNjcmVlbik7CisgICAg
ICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgcGl4ZWxzUGVySW5jaCA9IDk2LjBmOyAvLyBN
YXRjaCB0aGUgZGVmYXVsdCB3ZSBzZXQgb24gV2luZG93cy4KKyAgICB9CisKKyAgICBzdGF0aWMg
Y29uc3QgZmxvYXQgcG9pbnRzUGVySW5jaCA9IDcyLjBmOworICAgIHJldHVybiBwb2ludHMgLyBw
b2ludHNQZXJJbmNoICogcGl4ZWxzUGVySW5jaDsKK30KKworc3RhdGljIHZvaWQgc2V0U2l6ZUlm
QXV0byhSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IEludFNpemUmIHNpemUpCit7CisgICAgaWYg
KHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRX
aWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpLCBGaXhlZCkpOworICAgIGlmIChzdHlsZS0+aGVpZ2h0
KCkuaXNBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0
KCksIEZpeGVkKSk7Cit9CisKK3N0YXRpYyBib29sIHN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQg
YXBwZWFyYW5jZSkKK3sKKyAgICBzd2l0Y2ggKGFwcGVhcmFuY2UpIHsKKyAgICBjYXNlIFB1c2hC
dXR0b25QYXJ0OgorICAgIGNhc2UgQnV0dG9uUGFydDoKKyAgICBjYXNlIFRleHRGaWVsZFBhcnQ6
CisgICAgY2FzZSBUZXh0QXJlYVBhcnQ6CisgICAgY2FzZSBTZWFyY2hGaWVsZFBhcnQ6CisgICAg
Y2FzZSBNZW51bGlzdFBhcnQ6CisgICAgY2FzZSBSYWRpb1BhcnQ6CisgICAgY2FzZSBDaGVja2Jv
eFBhcnQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICB9Cit9CisKK3N0YXRpYyBHdGtUZXh0RGlyZWN0aW9uIGd0a1RleHREaXJl
Y3Rpb24oVGV4dERpcmVjdGlvbiBkaXJlY3Rpb24pCit7CisgICAgc3dpdGNoIChkaXJlY3Rpb24p
IHsKKyAgICBjYXNlIFJUTDoKKyAgICAgICAgcmV0dXJuIEdUS19URVhUX0RJUl9SVEw7CisgICAg
Y2FzZSBMVFI6CisgICAgICAgIHJldHVybiBHVEtfVEVYVF9ESVJfTFRSOworICAgIGRlZmF1bHQ6
CisgICAgICAgIHJldHVybiBHVEtfVEVYVF9ESVJfTk9ORTsKKyAgICB9Cit9CisKK3N0YXRpYyB2
b2lkIHNldE1velN0YXRlKFJlbmRlclRoZW1lKiB0aGVtZSwgR3RrV2lkZ2V0U3RhdGUqIHN0YXRl
LCBSZW5kZXJPYmplY3QqIG8pCit7CisgICAgc3RhdGUtPmFjdGl2ZSA9IHRoZW1lLT5pc1ByZXNz
ZWQobyk7CisgICAgc3RhdGUtPmZvY3VzZWQgPSB0aGVtZS0+aXNGb2N1c2VkKG8pOworICAgIHN0
YXRlLT5pbkhvdmVyID0gdGhlbWUtPmlzSG92ZXJlZChvKTsKKyAgICAvLyBGSVhNRTogRGlzYWJs
ZWQgZG9lcyBub3QgYWx3YXlzIGdpdmUgdGhlIGNvcnJlY3QgYXBwZWFyYW5jZSBmb3IgUmVhZE9u
bHkKKyAgICBzdGF0ZS0+ZGlzYWJsZWQgPSAhdGhlbWUtPmlzRW5hYmxlZChvKSB8fCB0aGVtZS0+
aXNSZWFkT25seUNvbnRyb2wobyk7CisgICAgc3RhdGUtPmlzRGVmYXVsdCA9IGZhbHNlOworICAg
IHN0YXRlLT5jYW5EZWZhdWx0ID0gZmFsc2U7CisgICAgc3RhdGUtPmRlcHJlc3NlZCA9IGZhbHNl
OworfQorCitzdGF0aWMgYm9vbCBwYWludE1veldpZGdldChSZW5kZXJUaGVtZSogdGhlbWUsIEd0
a1RoZW1lV2lkZ2V0VHlwZSB0eXBlLCBSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVj
dDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIFBhaW50aW5n
IGlzIGRpc2FibGVkIHNvIGp1c3QgY2xhaW0gdG8gaGF2ZSBzdWNjZWVkZWQKKyAgICBpZiAoaS5j
b250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
IEd0a1dpZGdldFN0YXRlIG1velN0YXRlOworICAgIHNldE1velN0YXRlKHRoZW1lLCAmbW96U3Rh
dGUsIG8pOworCisgICAgaW50IGZsYWdzOworCisgICAgLy8gV2UgbWlnaHQgd2FudCB0byBtYWtl
IHNldHRpbmcgZmxhZ3MgdGhlIGNhbGxlcidzIGpvYiBhdCBzb21lIHBvaW50IHJhdGhlciB0aGFu
IGRvaW5nIGl0IGhlcmUuCisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBNT1pfR1RLX0JV
VFRPTjoKKyAgICAgICAgZmxhZ3MgPSBHVEtfUkVMSUVGX05PUk1BTDsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBNT1pfR1RLX0NIRUNLQlVUVE9OOgorICAgIGNhc2UgTU9aX0dUS19SQURJT0JV
VFRPTjoKKyAgICAgICAgZmxhZ3MgPSB0aGVtZS0+aXNDaGVja2VkKG8pOworICAgICAgICBicmVh
azsKKyAgICBkZWZhdWx0OgorICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIGJyZWFrOworICAg
IH0KKworICAgIFBsYXRmb3JtQ29udGV4dFNraWEqIHBjcyA9IGkuY29udGV4dC0+cGxhdGZvcm1D
b250ZXh0KCk7CisgICAgU2tDYW52YXMqIGNhbnZhcyA9IHBjcy0+Y2FudmFzKCk7CisgICAgaWYg
KCFjYW52YXMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEdka1JlY3RhbmdsZSBnZGtS
ZWN0OworICAgIGdka1JlY3QueCA9IHJlY3QueCgpOworICAgIGdka1JlY3QueSA9IHJlY3QueSgp
OworICAgIGdka1JlY3Qud2lkdGggPSByZWN0LndpZHRoKCk7CisgICAgZ2RrUmVjdC5oZWlnaHQg
PSByZWN0LmhlaWdodCgpOworCisgICAgLy8gZ2V0VG90YWxDbGlwIHJldHVybnMgdGhlIGN1cnJl
bnRseSBzZXQgY2xpcCByZWdpb24gaW4gZGV2aWNlIGNvb3JkaW5hdGVzLAorICAgIC8vIHNvIHdl
IGhhdmUgdG8gYXBwbHkgdGhlIGN1cnJlbnQgdHJhbnNmb3JtIChhY3R1YWxseSB3ZSBvbmx5IHN1
cHBvcnQgdHJhbnNsYXRpb25zKQorICAgIC8vIHRvIGdldCB0aGUgcGFnZSBjb29yZGluYXRlcyB0
aGF0IG91ciBndGsgd2lkZ2V0IHJlbmRlcmluZyBleHBlY3RzLgorICAgIC8vIFdlIGludmVydCBp
dCBiZWNhdXNlIHdlIHdhbnQgdG8gbWFwIGZyb20gZGV2aWNlIGNvb3JkaW5hdGVzIHRvIHBhZ2Ug
Y29vcmRpbmF0ZXMuCisgICAgY29uc3QgU2tJUmVjdCBjbGlwUmVnaW9uID0gY2FudmFzLT5nZXRU
b3RhbENsaXAoKS5nZXRCb3VuZHMoKTsKKyAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBjdG0gPSBp
LmNvbnRleHQtPmdldENUTSgpLmludmVyc2UoKTsKKyAgICBJbnRQb2ludCBwb3MgPSBjdG0ubWFw
UG9pbnQoSW50UG9pbnQoU2tTY2FsYXJSb3VuZChjbGlwUmVnaW9uLmZMZWZ0KSwgU2tTY2FsYXJS
b3VuZChjbGlwUmVnaW9uLmZUb3ApKSk7CisgICAgR2RrUmVjdGFuZ2xlIGdka0NsaXBSZWN0Owor
ICAgIGdka0NsaXBSZWN0LnggPSBwb3MueCgpOworICAgIGdka0NsaXBSZWN0LnkgPSBwb3MueSgp
OworICAgIGdka0NsaXBSZWN0LndpZHRoID0gY2xpcFJlZ2lvbi53aWR0aCgpOworICAgIGdka0Ns
aXBSZWN0LmhlaWdodCA9IGNsaXBSZWdpb24uaGVpZ2h0KCk7CisKKyAgICAvLyBtb3pfZ3RrX3dp
ZGdldF9wYWludCB3aWxsIHBhaW50IG91dHNpZGUgdGhlIGJvdW5kcyBvZiBnZGtSZWN0IHVubGVz
cyB3ZSBmdXJ0aGVyIHJlc3RyaWN0IHxnZGtDbGlwUmVjdHwuCisgICAgZ2RrX3JlY3RhbmdsZV9p
bnRlcnNlY3QoJmdka1JlY3QsICZnZGtDbGlwUmVjdCwgJmdka0NsaXBSZWN0KTsKKworICAgIEd0
a1RleHREaXJlY3Rpb24gZGlyZWN0aW9uID0gZ3RrVGV4dERpcmVjdGlvbihvLT5zdHlsZSgpLT5k
aXJlY3Rpb24oKSk7CisKKyAgICByZXR1cm4gbW96X2d0a193aWRnZXRfcGFpbnQodHlwZSwgcGNz
LT5nZGtfc2tpYSgpLCAmZ2RrUmVjdCwgJmdka0NsaXBSZWN0LCAmbW96U3RhdGUsIGZsYWdzLCBk
aXJlY3Rpb24pICE9IE1PWl9HVEtfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZ3RrU3R5bGVT
ZXRDYWxsYmFjayhHdGtXaWRnZXQqIHdpZGdldCwgR3RrU3R5bGUqIHByZXZpb3VzLCBSZW5kZXJU
aGVtZSogcmVuZGVyVGhlbWUpCit7CisgICAgLy8gRklYTUU6IE1ha2Ugc3VyZSB0aGlzIGZ1bmN0
aW9uIGRvZXNuJ3QgZ2V0IGNhbGxlZCBtYW55IHRpbWVzIGZvciBhIHNpbmdsZSBHVEsrIHN0eWxl
IGNoYW5nZSBzaWduYWwuCisgICAgcmVuZGVyVGhlbWUtPnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdl
KCk7Cit9CisKK3N0YXRpYyBkb3VibGUgcXVlcnlTeXN0ZW1CbGlua0ludGVydmFsKGRvdWJsZSBk
ZWZhdWx0SW50ZXJ2YWwpCit7CisgICAgR3RrU2V0dGluZ3MqIHNldHRpbmdzID0gZ3RrX3NldHRp
bmdzX2dldF9kZWZhdWx0KCk7CisKKyAgICBnYm9vbGVhbiBzaG91bGRCbGluazsKKyAgICBnaW50
IHRpbWU7CisKKyAgICBnX29iamVjdF9nZXQoc2V0dGluZ3MsICJndGstY3Vyc29yLWJsaW5rIiwg
JnNob3VsZEJsaW5rLCAiZ3RrLWN1cnNvci1ibGluay10aW1lIiwgJnRpbWUsIE5VTEwpOworCisg
ICAgaWYgKCFzaG91bGRCbGluaykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gdGlt
ZSAvIDEwMDAuMDsKK30KKworLy8gSW1wbGVtZW50IFdlYkNvcmU6OnRoZW1lKCkgZm9yIGdldHRp
bmcgdGhlIGdsb2JhbCBSZW5kZXJUaGVtZS4KK1JlbmRlclRoZW1lKiB0aGVtZSgpCit7CisgICAg
c3RhdGljIFJlbmRlclRoZW1lQ2hyb21pdW1HdGsgZ3RrVGhlbWU7CisgICAgcmV0dXJuICZndGtU
aGVtZTsKK30KKworUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6UmVuZGVyVGhlbWVDaHJvbWl1bUd0
aygpCisgICAgOiBtX2d0a1dpbmRvdygwKQorICAgICwgbV9ndGtDb250YWluZXIoMCkKKyAgICAs
IG1fZ3RrRW50cnkoMCkKKyAgICAsIG1fZ3RrVHJlZVZpZXcoMCkKK3sKK30KKworLy8gVXNlIHRo
ZSBXaW5kb3dzIHN0eWxlIHNoZWV0cyB0byBtYXRjaCB0aGVpciBtZXRyaWNzLgorU3RyaW5nIFJl
bmRlclRoZW1lQ2hyb21pdW1HdGs6OmV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKQoreworICAgIHJl
dHVybiBTdHJpbmcodGhlbWVXaW5Vc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2YodGhlbWVXaW5V
c2VyQWdlbnRTdHlsZVNoZWV0KSk7Cit9CisKK1N0cmluZyBSZW5kZXJUaGVtZUNocm9taXVtR3Rr
OjpleHRyYVF1aXJrc1N0eWxlU2hlZXQoKQoreworICAgIHJldHVybiBTdHJpbmcodGhlbWVXaW5R
dWlya3NVc2VyQWdlbnRTdHlsZVNoZWV0LCBzaXplb2YodGhlbWVXaW5RdWlya3NVc2VyQWdlbnRT
dHlsZVNoZWV0KSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6c3VwcG9ydHNG
b2N1c1JpbmcoY29uc3QgUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIHJldHVybiBz
dXBwb3J0c0ZvY3VzKHN0eWxlLT5hcHBlYXJhbmNlKCkpOworfQorCitDb2xvciBSZW5kZXJUaGVt
ZUNocm9taXVtR3RrOjpwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNv
bnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRyeSgpOworICAgIHJldHVybiBt
YWtlQ29sb3Iod2lkZ2V0LT5zdHlsZS0+YmFzZVtHVEtfU1RBVEVfU0VMRUNURURdKTsKK30KKwor
Q29sb3IgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6cGxhdGZvcm1JbmFjdGl2ZVNlbGVjdGlvbkJh
Y2tncm91bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtFbnRy
eSgpOworICAgIHJldHVybiBtYWtlQ29sb3Iod2lkZ2V0LT5zdHlsZS0+YmFzZVtHVEtfU1RBVEVf
QUNUSVZFXSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6OnBsYXRmb3JtQWN0
aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBHdGtXaWRnZXQqIHdp
ZGdldCA9IGd0a0VudHJ5KCk7CisgICAgcmV0dXJuIG1ha2VDb2xvcih3aWRnZXQtPnN0eWxlLT50
ZXh0W0dUS19TVEFURV9TRUxFQ1RFRF0pOworfQorCitDb2xvciBSZW5kZXJUaGVtZUNocm9taXVt
R3RrOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sK
KyAgICBHdGtXaWRnZXQqIHdpZGdldCA9IGd0a0VudHJ5KCk7CisgICAgcmV0dXJuIG1ha2VDb2xv
cih3aWRnZXQtPnN0eWxlLT50ZXh0W0dUS19TVEFURV9BQ1RJVkVdKTsKK30KKworQ29sb3IgUmVu
ZGVyVGhlbWVDaHJvbWl1bUd0azo6cGxhdGZvcm1UZXh0U2VhcmNoSGlnaGxpZ2h0Q29sb3IoKSBj
b25zdAoreworICAgIHJldHVybiBDb2xvcigyNTUsIDI1NSwgMTUwKTsKK30KKworZG91YmxlIFJl
bmRlclRoZW1lQ2hyb21pdW1HdGs6OmNhcmV0QmxpbmtJbnRlcnZhbCgpIGNvbnN0Cit7CisgICAg
Ly8gRGlzYWJsZSB0aGUgYmxpbmtpbmcgY2FyZXQgaW4gbGF5b3V0IHRlc3QgbW9kZSwgYXMgaXQg
aW50cm9kdWNlcworICAgIC8vIGEgcmFjZSBjb25kaXRpb24gZm9yIHRoZSBwaXhlbCB0ZXN0cy4g
aHR0cDovL2IvMTE5ODQ0MAorICAgIGlmIChDaHJvbWl1bUJyaWRnZTo6bGF5b3V0VGVzdE1vZGUo
KSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBXZSBjYWNoZSB0aGUgaW50ZXJ2YWwgc28g
d2UgZG9uJ3QgaGF2ZSB0byByZXBlYXRlZGx5IHJlcXVlc3QgaXQgZnJvbSBndGsuCisgICAgc3Rh
dGljIGRvdWJsZSBibGlua0ludGVydmFsID0gcXVlcnlTeXN0ZW1CbGlua0ludGVydmFsKFJlbmRl
clRoZW1lOjpjYXJldEJsaW5rSW50ZXJ2YWwoKSk7CisgICAgcmV0dXJuIGJsaW5rSW50ZXJ2YWw7
Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6c3lzdGVtRm9udChpbnQgcHJvcElk
LCBEb2N1bWVudCogZG9jdW1lbnQsIEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uKSBj
b25zdAoreworICAgIGNvbnN0IGNoYXIqIGZhY2VOYW1lID0gMDsKKyAgICBmbG9hdCBmb250U2l6
ZSA9IDA7CisgICAgLy8gRklYTUU6IHNlZSBhbHNvIFJlbmRlclRoZW1lQ2hyb21pdW1XaW4uY3Bw
CisgICAgc3dpdGNoIChwcm9wSWQpIHsKKyAgICBjYXNlIENTU1ZhbHVlTWVudToKKyAgICBjYXNl
IENTU1ZhbHVlU3RhdHVzQmFyOgorICAgIGNhc2UgQ1NTVmFsdWVTbWFsbENhcHRpb246CisgICAg
ICAgIC8vIHRyaWdnZXJlZCBieSBMYXlvdXRUZXN0cy9mYXN0L2Nzcy9jc3MyLXN5c3RlbS1mb250
cy5odG1sCisgICAgICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgICAgIGJyZWFrOworICAgIGNh
c2UgQ1NTVmFsdWVXZWJraXRNaW5pQ29udHJvbDoKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0U21h
bGxDb250cm9sOgorICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRDb250cm9sOgorICAgICAgICBmYWNl
TmFtZSA9IGRlZmF1bHRHVUlGb250KGRvY3VtZW50KTsKKyAgICAgICAgLy8gV2h5IDIgcG9pbnRz
IHNtYWxsZXI/ICBCZWNhdXNlIHRoYXQncyB3aGF0IEdlY2tvIGRvZXMuCisgICAgICAgIGZvbnRT
aXplID0gRGVmYXVsdEZvbnRTaXplIC0gcG9pbnRzVG9QaXhlbHMoMik7CisgICAgICAgIGJyZWFr
OworICAgIGRlZmF1bHQ6CisgICAgICAgIGZhY2VOYW1lID0gZGVmYXVsdEdVSUZvbnQoZG9jdW1l
bnQpOworICAgICAgICBmb250U2l6ZSA9IERlZmF1bHRGb250U2l6ZTsKKyAgICB9CisKKyAgICAv
LyBPbmx5IHVwZGF0ZSBpZiB0aGUgc2l6ZSBtYWtlcyBzZW5zZS4KKyAgICBpZiAoZm9udFNpemUg
PiAwKSB7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5maXJzdEZhbWlseSgpLnNldEZhbWlseShm
YWNlTmFtZSk7CisgICAgICAgIGZvbnREZXNjcmlwdGlvbi5zZXRTcGVjaWZpZWRTaXplKGZvbnRT
aXplKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldElzQWJzb2x1dGVTaXplKHRydWUpOwor
ICAgICAgICBmb250RGVzY3JpcHRpb24uc2V0R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246
Ok5vRmFtaWx5KTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldFdlaWdodChGb250V2VpZ2h0
Tm9ybWFsKTsKKyAgICAgICAgZm9udERlc2NyaXB0aW9uLnNldEl0YWxpYyhmYWxzZSk7CisgICAg
fQorfQorCitpbnQgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6bWluaW11bU1lbnVMaXN0U2l6ZShS
ZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgUmVu
ZGVyVGhlbWVDaHJvbWl1bUd0azo6cGFpbnRDaGVja2JveChSZW5kZXJPYmplY3QqIG8sIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAg
IHJldHVybiBwYWludE1veldpZGdldCh0aGlzLCBNT1pfR1RLX0NIRUNLQlVUVE9OLCBvLCBpLCBy
ZWN0KTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtR3RrOjpzZXRDaGVja2JveFNpemUo
UmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIElmIHRoZSB3aWR0aCBhbmQgaGVp
Z2h0IGFyZSBib3RoIHNwZWNpZmllZCwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCisgICAg
aWYgKCFzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0
KCkuaXNBdXRvKCkpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZJWE1FOiAgQSBoYXJkLWNv
ZGVkIHNpemUgb2YgMTMgaXMgdXNlZC4gIFRoaXMgaXMgd3JvbmcgYnV0IG5lY2Vzc2FyeSBmb3Ig
bm93LiAgSXQgbWF0Y2hlcyBGaXJlZm94LgorICAgIC8vIEF0IGRpZmZlcmVudCBEUEkgc2V0dGlu
Z3Mgb24gV2luZG93cywgcXVlcnlpbmcgdGhlIHRoZW1lIGdpdmVzIHlvdSBhIGxhcmdlciBzaXpl
IHRoYXQgYWNjb3VudHMgZm9yCisgICAgLy8gdGhlIGhpZ2hlciBEUEkuICBVbnRpbCBvdXIgZW50
aXJlIGVuZ2luZSBob25vcnMgYSBEUEkgc2V0dGluZyBvdGhlciB0aGFuIDk2LCB3ZSBjYW4ndCBy
ZWx5IG9uIHRoZSB0aGVtZSdzCisgICAgLy8gbWV0cmljcy4KKyAgICBjb25zdCBJbnRTaXplIHNp
emUoMTMsIDEzKTsKKyAgICBzZXRTaXplSWZBdXRvKHN0eWxlLCBzaXplKTsKK30KKworYm9vbCBS
ZW5kZXJUaGVtZUNocm9taXVtR3RrOjpwYWludFJhZGlvKFJlbmRlck9iamVjdCogbywgY29uc3Qg
UmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAg
cmV0dXJuIHBhaW50TW96V2lkZ2V0KHRoaXMsIE1PWl9HVEtfUkFESU9CVVRUT04sIG8sIGksIHJl
Y3QpOworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6OnNldFJhZGlvU2l6ZShSZW5k
ZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgLy8gVXNlIHNhbWUgc2l6aW5nIGZvciByYWRp
byBib3ggYXMgY2hlY2tib3guCisgICAgc2V0Q2hlY2tib3hTaXplKHN0eWxlKTsKK30KKworYm9v
bCBSZW5kZXJUaGVtZUNocm9taXVtR3RrOjpwYWludEJ1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNv
bnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQorewor
ICAgIHJldHVybiBwYWludE1veldpZGdldCh0aGlzLCBNT1pfR1RLX0JVVFRPTiwgbywgaSwgcmVj
dCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6cGFpbnRUZXh0RmllbGQoUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4gcGFpbnRNb3pXaWRnZXQodGhpcywgTU9aX0dUS19F
TlRSWSwgbywgaSwgcmVjdCk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6cGFp
bnRTZWFyY2hGaWVsZChSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJ
bmZvJiBpLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludFRleHRGaWVs
ZChvLCBpLCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtR3RrOjpwYWludFNl
YXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4g
cGFpbnRNb3pXaWRnZXQodGhpcywgTU9aX0dUS19DSEVDS01FTlVJVEVNLCBvLCBpLCByZWN0KTsK
K30KKworYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtR3RrOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0
c0J1dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBp
LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIHJldHVybiBwYWludE1veldpZGdldCh0aGlz
LCBNT1pfR1RLX0RST1BET1dOX0FSUk9XLCBvLCBpLCByZWN0KTsKK30KKworYm9vbCBSZW5kZXJU
aGVtZUNocm9taXVtR3RrOjpwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVj
dCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgcmV0dXJuIHBhaW50TW96V2lkZ2V0KHRoaXMsIE1PWl9HVEtfQ0hFQ0tNRU5V
SVRFTSwgbywgaSwgcmVjdCk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6YWRq
dXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUq
IHN0eWxlLCBXZWJDb3JlOjpFbGVtZW50KiBlKSBjb25zdAoreworICAgIC8vIEhlaWdodCBpcyBs
b2NrZWQgdG8gYXV0byBvbiBhbGwgYnJvd3NlcnMuCisgICAgc3R5bGUtPnNldExpbmVIZWlnaHQo
UmVuZGVyU3R5bGU6OmluaXRpYWxMaW5lSGVpZ2h0KCkpOworfQorCitib29sIFJlbmRlclRoZW1l
Q2hyb21pdW1HdGs6OnBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICByZXR1cm4g
cGFpbnRNb3pXaWRnZXQodGhpcywgTU9aX0dUS19EUk9QRE9XTiwgbywgaSwgcmVjdCk7Cit9CisK
K3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6YWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShD
U1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBl
KSBjb25zdAoreworICAgIGFkanVzdE1lbnVMaXN0U3R5bGUoc2VsZWN0b3IsIHN0eWxlLCBlKTsK
K30KKworLy8gVXNlZCB0byBwYWludCBzdHlsZWQgbWVudWxpc3RzIChpLmUuIHdpdGggYSBub24t
ZGVmYXVsdCBib3JkZXIpCitib29sIFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6OnBhaW50TWVudUxp
c3RCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
aSwgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICByZXR1cm4gcGFpbnRNZW51TGlzdChvLCBpLCBy
KTsKK30KKworaW50IFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5n
TGVmdChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1lbnVMaXN0SW50
ZXJuYWxQYWRkaW5nKHN0eWxlLCBMZWZ0UGFkZGluZyk7Cit9CisKK2ludCBSZW5kZXJUaGVtZUNo
cm9taXVtR3RrOjpwb3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxlKiBzdHlsZSkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbWVudUxpc3RJbnRlcm5hbFBhZGRpbmcoc3R5bGUsIFJpZ2h0
UGFkZGluZyk7Cit9CisKK2ludCBSZW5kZXJUaGVtZUNocm9taXVtR3RrOjpwb3B1cEludGVybmFs
UGFkZGluZ1RvcChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1lbnVM
aXN0SW50ZXJuYWxQYWRkaW5nKHN0eWxlLCBUb3BQYWRkaW5nKTsKK30KKworaW50IFJlbmRlclRo
ZW1lQ2hyb21pdW1HdGs6OnBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRlclN0eWxlKiBz
dHlsZSkgY29uc3QKK3sKKyAgICByZXR1cm4gbWVudUxpc3RJbnRlcm5hbFBhZGRpbmcoc3R5bGUs
IEJvdHRvbVBhZGRpbmcpOworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6OmFkanVz
dEJ1dHRvbklubmVyU3R5bGUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIFRo
aXMgaW5uZXIgcGFkZGluZyBtYXRjaGVzIEZpcmVmb3guCisgICAgc3R5bGUtPnNldFBhZGRpbmdU
b3AoTGVuZ3RoKDEsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdSaWdodChMZW5ndGgo
MywgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ0JvdHRvbShMZW5ndGgoMSwgRml4ZWQp
KTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ0xlZnQoTGVuZ3RoKDMsIEZpeGVkKSk7Cit9CisKK2Jv
b2wgUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6Y29udHJvbFN1cHBvcnRzVGludHMoY29uc3QgUmVu
ZGVyT2JqZWN0KiBvKSBjb25zdAoreworICAgIHJldHVybiBpc0VuYWJsZWQobyk7Cit9CisKK0Nv
bG9yIFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6OmFjdGl2ZUxpc3RCb3hTZWxlY3Rpb25CYWNrZ3Jv
dW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCogd2lkZ2V0ID0gZ3RrVHJlZVZpZXco
KTsKKyAgICByZXR1cm4gbWFrZUNvbG9yKHdpZGdldC0+c3R5bGUtPmJhc2VbR1RLX1NUQVRFX1NF
TEVDVEVEXSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6OmFjdGl2ZUxpc3RC
b3hTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAoreworICAgIEd0a1dpZGdldCogd2lk
Z2V0ID0gZ3RrVHJlZVZpZXcoKTsKKyAgICByZXR1cm4gbWFrZUNvbG9yKHdpZGdldC0+c3R5bGUt
PnRleHRbR1RLX1NUQVRFX1NFTEVDVEVEXSk7Cit9CisKK0NvbG9yIFJlbmRlclRoZW1lQ2hyb21p
dW1HdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0Cit7
CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygpOworICAgIHJldHVybiBtYWtl
Q29sb3Iod2lkZ2V0LT5zdHlsZS0+YmFzZVtHVEtfU1RBVEVfQUNUSVZFXSk7Cit9CisKK0NvbG9y
IFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6OmluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91
bmRDb2xvcigpIGNvbnN0Cit7CisgICAgR3RrV2lkZ2V0KiB3aWRnZXQgPSBndGtUcmVlVmlldygp
OworICAgIHJldHVybiBtYWtlQ29sb3Iod2lkZ2V0LT5zdHlsZS0+dGV4dFtHVEtfU1RBVEVfQUNU
SVZFXSk7Cit9CisKK0d0a1dpZGdldCogUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6Z3RrRW50cnko
KSBjb25zdAoreworICAgIGlmIChtX2d0a0VudHJ5KQorICAgICAgICByZXR1cm4gbV9ndGtFbnRy
eTsKKworICAgIG1fZ3RrRW50cnkgPSBndGtfZW50cnlfbmV3KCk7CisgICAgZ19zaWduYWxfY29u
bmVjdChtX2d0a0VudHJ5LCAic3R5bGUtc2V0IiwgR19DQUxMQkFDSyhndGtTdHlsZVNldENhbGxi
YWNrKSwgdGhlbWUoKSk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoZ3RrQ29udGFpbmVyKCksIG1f
Z3RrRW50cnkpOworICAgIGd0a193aWRnZXRfcmVhbGl6ZShtX2d0a0VudHJ5KTsKKworICAgIHJl
dHVybiBtX2d0a0VudHJ5OworfQorCitHdGtXaWRnZXQqIFJlbmRlclRoZW1lQ2hyb21pdW1HdGs6
Omd0a1RyZWVWaWV3KCkgY29uc3QKK3sKKyAgICBpZiAobV9ndGtUcmVlVmlldykKKyAgICAgICAg
cmV0dXJuIG1fZ3RrVHJlZVZpZXc7CisKKyAgICBtX2d0a1RyZWVWaWV3ID0gZ3RrX3RyZWVfdmll
d19uZXcoKTsKKyAgICBnX3NpZ25hbF9jb25uZWN0KG1fZ3RrVHJlZVZpZXcsICJzdHlsZS1zZXQi
LCBHX0NBTExCQUNLKGd0a1N0eWxlU2V0Q2FsbGJhY2spLCB0aGVtZSgpKTsKKyAgICBndGtfY29u
dGFpbmVyX2FkZChndGtDb250YWluZXIoKSwgbV9ndGtUcmVlVmlldyk7CisgICAgZ3RrX3dpZGdl
dF9yZWFsaXplKG1fZ3RrVHJlZVZpZXcpOworCisgICAgcmV0dXJuIG1fZ3RrVHJlZVZpZXc7Cit9
CisKK0d0a0NvbnRhaW5lciogUmVuZGVyVGhlbWVDaHJvbWl1bUd0azo6Z3RrQ29udGFpbmVyKCkg
Y29uc3QKK3sKKyAgICBpZiAobV9ndGtDb250YWluZXIpCisgICAgICAgIHJldHVybiBtX2d0a0Nv
bnRhaW5lcjsKKworICAgIG1fZ3RrV2luZG93ID0gZ3RrX3dpbmRvd19uZXcoR1RLX1dJTkRPV19Q
T1BVUCk7CisgICAgbV9ndGtDb250YWluZXIgPSBHVEtfQ09OVEFJTkVSKGd0a19maXhlZF9uZXco
KSk7CisgICAgZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUihtX2d0a1dpbmRvdyksIEdU
S19XSURHRVQobV9ndGtDb250YWluZXIpKTsKKyAgICBndGtfd2lkZ2V0X3JlYWxpemUobV9ndGtX
aW5kb3cpOworCisgICAgcmV0dXJuIG1fZ3RrQ29udGFpbmVyOworfQorCitpbnQgUmVuZGVyVGhl
bWVDaHJvbWl1bUd0azo6bWVudUxpc3RJbnRlcm5hbFBhZGRpbmcoUmVuZGVyU3R5bGUqIHN0eWxl
LCBpbnQgcGFkZGluZ1R5cGUpIGNvbnN0Cit7CisgICAgLy8gVGhpcyBpbnRlcm5hbCBwYWRkaW5n
IGlzIGluIGFkZGl0aW9uIHRvIHRoZSB1c2VyLXN1cHBsaWVkIHBhZGRpbmcuCisgICAgLy8gTWF0
Y2hlcyB0aGUgRkYgYmVoYXZpb3IuCisgICAgaW50IHBhZGRpbmcgPSBzdHlsZWRNZW51TGlzdElu
dGVybmFsUGFkZGluZ1twYWRkaW5nVHlwZV07CisKKyAgICAvLyBSZXNlcnZlIHRoZSBzcGFjZSBm
b3IgcmlnaHQgYXJyb3cgaGVyZS4gVGhlIHJlc3Qgb2YgdGhlIHBhZGRpbmcgaXMKKyAgICAvLyBz
ZXQgYnkgYWRqdXN0TWVudUxpc3RTdHlsZSwgc2luY2UgUG9wTWVudVdpbi5jcHAgdXNlcyB0aGUg
cGFkZGluZyBmcm9tCisgICAgLy8gUmVuZGVyTWVudUxpc3QgdG8gbGF5IG91dCB0aGUgaW5kaXZp
ZHVhbCBpdGVtcyBpbiB0aGUgcG9wdXAuCisgICAgLy8gSWYgdGhlIE1lbnVMaXN0IGFjdHVhbGx5
IGhhcyBhcHBlYXJhbmNlICJOb0FwcGVhcmFuY2UiLCB0aGVuIHRoYXQgbWVhbnMKKyAgICAvLyB3
ZSBkb24ndCBkcmF3IGEgYnV0dG9uLCBzbyBkb24ndCByZXNlcnZlIHNwYWNlIGZvciBpdC4KKyAg
ICBjb25zdCBpbnQgYmFyX3R5cGUgPSBzdHlsZS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gUmlnaHRQ
YWRkaW5nIDogTGVmdFBhZGRpbmc7CisgICAgaWYgKHBhZGRpbmdUeXBlID09IGJhcl90eXBlICYm
IHN0eWxlLT5hcHBlYXJhbmNlKCkgIT0gTm9Db250cm9sUGFydCkKKyAgICAgICAgcGFkZGluZyAr
PSBTY3JvbGxiYXJUaGVtZTo6bmF0aXZlVGhlbWUoKS0+c2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisK
KyAgICByZXR1cm4gcGFkZGluZzsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDog
cmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1HdGsuaAo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJp
bmcvUmVuZGVyVGhlbWVDaHJvbWl1bUd0ay5oCShyZXZpc2lvbiAwKQorKysgcmVuZGVyaW5nL1Jl
bmRlclRoZW1lQ2hyb21pdW1HdGsuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMzYgQEAKKy8q
CisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IHByb2plY3QuCisgKgorICogQ29w
eXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDYgTWljaGFlbCBFbW1lbCBtaWtlLmVtbWVsQGdtYWlsLmNvbQorICogQ29weXJpZ2h0IChDKSAy
MDA3IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQWxw
IFRva2VyIDxhbHBAYXRva2VyLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwgMjAwOSBHb29n
bGUsIEluYy4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFJlbmRlclRoZW1l
Q2hyb21pdW1HdGtfaAorI2RlZmluZSBSZW5kZXJUaGVtZUNocm9taXVtR3RrX2gKKworI2luY2x1
ZGUgIlJlbmRlclRoZW1lLmgiCisKKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworICAgIGNsYXNzIFJlbmRlclRoZW1lQ2hyb21pdW1HdGsgOiBwdWJsaWMgUmVu
ZGVyVGhlbWUgeworICAgIHB1YmxpYzoKKyAgICAgICAgUmVuZGVyVGhlbWVDaHJvbWl1bUd0aygp
OworICAgICAgICB+UmVuZGVyVGhlbWVDaHJvbWl1bUd0aygpIHsgfQorCisgICAgICAgIHZpcnR1
YWwgU3RyaW5nIGV4dHJhRGVmYXVsdFN0eWxlU2hlZXQoKTsKKyAgICAgICAgdmlydHVhbCBTdHJp
bmcgZXh0cmFRdWlya3NTdHlsZVNoZWV0KCk7CisKKyAgICAgICAgLy8gQSBtZXRob2QgYXNraW5n
IGlmIHRoZSB0aGVtZSdzIGNvbnRyb2xzIGFjdHVhbGx5IGNhcmUgYWJvdXQgcmVkcmF3aW5nIHdo
ZW4gaG92ZXJlZC4KKyAgICAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzSG92ZXIoY29uc3QgUmVu
ZGVyU3R5bGUqKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgLy8gQSBtZXRob2Qg
YXNraW5nIGlmIHRoZSB0aGVtZSBpcyBhYmxlIHRvIGRyYXcgdGhlIGZvY3VzIHJpbmcuCisgICAg
ICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSopIGNv
bnN0OworCisgICAgICAgIC8vIFRoZSBwbGF0Zm9ybSBzZWxlY3Rpb24gY29sb3IuCisgICAgICAg
IHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBj
b25zdDsKKyAgICAgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uQmFj
a2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1BY3Rp
dmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBDb2xv
ciBwbGF0Zm9ybUluYWN0aXZlU2VsZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3Q7CisgICAg
ICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1UZXh0U2VhcmNoSGlnaGxpZ2h0Q29sb3IoKSBjb25z
dDsKKworICAgICAgICB2aXJ0dWFsIGRvdWJsZSBjYXJldEJsaW5rSW50ZXJ2YWwoKSBjb25zdDsK
KworICAgICAgICAvLyBTeXN0ZW0gZm9udHMuCisgICAgICAgIHZpcnR1YWwgdm9pZCBzeXN0ZW1G
b250KGludCBwcm9wSWQsIERvY3VtZW50KiwgRm9udERlc2NyaXB0aW9uJikgY29uc3Q7CisKKyAg
ICAgICAgdmlydHVhbCBpbnQgbWluaW11bU1lbnVMaXN0U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0
OworCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludENoZWNrYm94KFJlbmRlck9iamVjdCosIGNv
bnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgICAgICB2
aXJ0dWFsIHZvaWQgc2V0Q2hlY2tib3hTaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICAg
ICAgdmlydHVhbCBib29sIHBhaW50UmFkaW8oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBz
ZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUqKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIGJvb2wg
cGFpbnRCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8m
LCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxk
KFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50
UmVjdCYpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFRleHRBcmVhKFJlbmRlck9iamVj
dCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIp
IHsgcmV0dXJuIHBhaW50VGV4dEZpZWxkKG8sIGksIHIpOyB9CisKKyAgICAgICAgdmlydHVhbCBi
b29sIHBhaW50U2VhcmNoRmllbGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQ
YWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50
U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCBib29s
IHBhaW50U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgICAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRTZWFyY2hGaWVsZENhbmNlbEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5k
ZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICAvLyBNZW51
TGlzdCByZWZlcnMgdG8gYW4gdW5zdHlsZWQgbWVudWxpc3QgKG1lYW5pbmcgYSBtZW51bGlzdCB3
aXRob3V0CisgICAgICAgIC8vIGJhY2tncm91bmQtY29sb3Igb3IgYm9yZGVyIHNldCkgYW5kIE1l
bnVMaXN0QnV0dG9uIHJlZmVycyB0byBhIHN0eWxlZAorICAgICAgICAvLyBtZW51bGlzdCAoYSBt
ZW51bGlzdCB3aXRoIGJhY2tncm91bmQtY29sb3Igb3IgYm9yZGVyIHNldCkuIFRoZXkgaGF2ZQor
ICAgICAgICAvLyB0aGlzIGRpc3RpbmN0aW9uIHRvIHN1cHBvcnQgc2hvd2luZyBhcXVhIHN0eWxl
IHRoZW1lcyB3aGVuZXZlciB0aGV5CisgICAgICAgIC8vIHBvc3NpYmx5IGNhbiwgd2hpY2ggaXMg
c29tZXRoaW5nIHdlIGRvbid0IHdhbnQgdG8gcmVwbGljYXRlLgorICAgICAgICAvLworICAgICAg
ICAvLyBJbiBzaG9ydCwgd2UgZWl0aGVyIGdvIGRvd24gdGhlIE1lbnVMaXN0IGNvZGUgcGF0aCBv
ciB0aGUgTWVudUxpc3RCdXR0b24KKyAgICAgICAgLy8gY29kZXBhdGguIFdlIG5ldmVyIGdvIGRv
d24gYm90aC4gQW5kIGluIGJvdGggY2FzZXMsIHRoZXkgcmVuZGVyIHRoZQorICAgICAgICAvLyBl
bnRpcmUgbWVudWxpc3QuCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RNZW51TGlzdFN0eWxl
KENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICAg
ICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3QoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwgdm9p
ZCBhZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHls
ZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVudUxpc3RC
dXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25z
dCBJbnRSZWN0Jik7CisKKyAgICAgICAgLy8gVGhlc2UgbWV0aG9kcyBkZWZpbmUgdGhlIHBhZGRp
bmcgZm9yIHRoZSBNZW51TGlzdCdzIGlubmVyIGJsb2NrLgorICAgICAgICB2aXJ0dWFsIGludCBw
b3B1cEludGVybmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICAgICAgdmly
dHVhbCBpbnQgcG9wdXBJbnRlcm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSopIGNvbnN0Owor
ICAgICAgICB2aXJ0dWFsIGludCBwb3B1cEludGVybmFsUGFkZGluZ1RvcChSZW5kZXJTdHlsZSop
IGNvbnN0OworICAgICAgICB2aXJ0dWFsIGludCBwb3B1cEludGVybmFsUGFkZGluZ0JvdHRvbShS
ZW5kZXJTdHlsZSopIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RCdXR0b25J
bm5lclN0eWxlKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3Q7CisKKyAgICAgICAgLy8gQSBtZXRo
b2QgYXNraW5nIGlmIHRoZSBjb250cm9sIGNoYW5nZXMgaXRzIHRpbnQgd2hlbiB0aGUgd2luZG93
IGhhcyBmb2N1cyBvciBub3QuCisgICAgICAgIHZpcnR1YWwgYm9vbCBjb250cm9sU3VwcG9ydHNU
aW50cyhjb25zdCBSZW5kZXJPYmplY3QqKSBjb25zdDsKKworICAgICAgICAvLyBBIGdlbmVyYWwg
bWV0aG9kIGFza2luZyBpZiBhbnkgY29udHJvbCB0aW50aW5nIGlzIHN1cHBvcnRlZCBhdCBhbGwu
CisgICAgICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0NvbnRyb2xUaW50cygpIGNvbnN0IHsgcmV0
dXJuIHRydWU7IH0KKworICAgICAgICAvLyBMaXN0IEJveCBzZWxlY3Rpb24gY29sb3IKKyAgICAg
ICAgdmlydHVhbCBDb2xvciBhY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkg
Y29uc3Q7CisgICAgICAgIHZpcnR1YWwgQ29sb3IgYWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVn
cm91bmRDb2xvcigpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIENvbG9yIGluYWN0aXZlTGlzdEJv
eFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIENvbG9y
IGluYWN0aXZlTGlzdEJveFNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworCisgICAg
cHJpdmF0ZToKKyAgICAgICAgLy8gSG9sZCB0aGUgc3RhdGUKKyAgICAgICAgR3RrV2lkZ2V0KiBn
dGtFbnRyeSgpIGNvbnN0OworICAgICAgICBHdGtXaWRnZXQqIGd0a1RyZWVWaWV3KCkgY29uc3Q7
CisKKyAgICAgICAgLy8gVW5tYXBwZWQgR2RrV2luZG93IGhhdmluZyBhIGNvbnRhaW5lci4gVGhp
cyBpcyBob2xkaW5nIGFsbCBvdXIgZmFrZSB3aWRnZXRzCisgICAgICAgIEd0a0NvbnRhaW5lciog
Z3RrQ29udGFpbmVyKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBpbnQgbWVudUxp
c3RJbnRlcm5hbFBhZGRpbmcoUmVuZGVyU3R5bGUqLCBpbnQgcGFkZGluZ1R5cGUpIGNvbnN0Owor
CisgICAgICAgIG11dGFibGUgR3RrV2lkZ2V0KiBtX2d0a1dpbmRvdzsKKyAgICAgICAgbXV0YWJs
ZSBHdGtDb250YWluZXIqIG1fZ3RrQ29udGFpbmVyOworICAgICAgICBtdXRhYmxlIEd0a1dpZGdl
dCogbV9ndGtFbnRyeTsKKyAgICAgICAgbXV0YWJsZSBHdGtXaWRnZXQqIG1fZ3RrVHJlZVZpZXc7
CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYKSW5kZXg6IHJlbmRl
cmluZy9SZW5kZXJUaGVtZUNocm9taXVtTWFjLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gcmVuZGVyaW5nL1Jl
bmRlclRoZW1lQ2hyb21pdW1NYWMuaAkocmV2aXNpb24gMCkKKysrIHJlbmRlcmluZy9SZW5kZXJU
aGVtZUNocm9taXVtTWFjLmgJKHJldmlzaW9uIDApCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICog
VGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHRoZW1lIGltcGxlbWVudGF0aW9uIGZvciBmb3JtIGNv
bnRyb2xzIGluIFdlYkNvcmUuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEFwcGxlIENvbXB1
dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xlLCBJbmMuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisj
aWZuZGVmIFJlbmRlclRoZW1lQ2hyb21pdW1NYWNfaAorI2RlZmluZSBSZW5kZXJUaGVtZUNocm9t
aXVtTWFjX2gKKworI2ltcG9ydCAiUmVuZGVyVGhlbWUuaCIKKyNpbXBvcnQgPHd0Zi9IYXNoTWFw
Lmg+CisjaW1wb3J0IDx3dGYvUmV0YWluUHRyLmg+CisKKyNpZmRlZiBfX09CSkNfXworQGNsYXNz
IFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyOworI2Vsc2UKK2NsYXNzIFdl
YkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyOworI2VuZGlmCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIFJlbmRlclN0eWxlOworCisgICAgY2xhc3MgUmVuZGVy
VGhlbWVDaHJvbWl1bU1hYyA6IHB1YmxpYyBSZW5kZXJUaGVtZSB7CisgICAgcHVibGljOgorICAg
ICAgICBSZW5kZXJUaGVtZUNocm9taXVtTWFjKCk7CisgICAgICAgIHZpcnR1YWwgflJlbmRlclRo
ZW1lQ2hyb21pdW1NYWMoKTsKKworICAgICAgICAvLyBBIG1ldGhvZCB0byBvYnRhaW4gdGhlIGJh
c2VsaW5lIHBvc2l0aW9uIGZvciBhICJsZWFmIiBjb250cm9sLiAgVGhpcyB3aWxsIG9ubHkgYmUg
dXNlZCBpZiBhIGJhc2VsaW5lCisgICAgICAgIC8vIHBvc2l0aW9uIGNhbm5vdCBiZSBkZXRlcm1p
bmVkIGJ5IGV4YW1pbmluZyBjaGlsZCBjb250ZW50LiBDaGVja2JveGVzIGFuZCByYWRpbyBidXR0
b25zIGFyZSBleGFtcGxlcyBvZgorICAgICAgICAvLyBjb250cm9scyB0aGF0IG5lZWQgdG8gZG8g
dGhpcy4KKyAgICAgICAgdmlydHVhbCBpbnQgYmFzZWxpbmVQb3NpdGlvbihjb25zdCBSZW5kZXJP
YmplY3QqKSBjb25zdDsKKworICAgICAgICAvLyBBIG1ldGhvZCBhc2tpbmcgaWYgdGhlIGNvbnRy
b2wgY2hhbmdlcyBpdHMgdGludCB3aGVuIHRoZSB3aW5kb3cgaGFzIGZvY3VzIG9yIG5vdC4KKyAg
ICAgICAgdmlydHVhbCBib29sIGNvbnRyb2xTdXBwb3J0c1RpbnRzKGNvbnN0IFJlbmRlck9iamVj
dCopIGNvbnN0OworCisgICAgICAgIC8vIEEgZ2VuZXJhbCBtZXRob2QgYXNraW5nIGlmIGFueSBj
b250cm9sIHRpbnRpbmcgaXMgc3VwcG9ydGVkIGF0IGFsbC4KKyAgICAgICAgdmlydHVhbCBib29s
IHN1cHBvcnRzQ29udHJvbFRpbnRzKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgICAg
IHZpcnR1YWwgdm9pZCBhZGp1c3RSZXBhaW50UmVjdChjb25zdCBSZW5kZXJPYmplY3QqLCBJbnRS
ZWN0Jik7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzQ29udHJvbFN0eWxlZChjb25zdCBSZW5k
ZXJTdHlsZSosIGNvbnN0IEJvcmRlckRhdGEmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIGNvbnN0IEZpbGxMYXllciYsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29sb3Ip
IGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgQ29sb3IgcGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25C
YWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUlu
YWN0aXZlU2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwg
Q29sb3IgYWN0aXZlTGlzdEJveFNlbGVjdGlvbkJhY2tncm91bmRDb2xvcigpIGNvbnN0OworICAg
ICAgICAKKyAgICAgICAgdmlydHVhbCB2b2lkIHBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7CisK
KyAgICAgICAgLy8gU3lzdGVtIGZvbnRzLgorICAgICAgICB2aXJ0dWFsIHZvaWQgc3lzdGVtRm9u
dChpbnQgY3NzVmFsdWVJZCwgRG9jdW1lbnQqLCBGb250RGVzY3JpcHRpb24mKSBjb25zdDsKKwor
ICAgICAgICB2aXJ0dWFsIGludCBtaW5pbXVtTWVudUxpc3RTaXplKFJlbmRlclN0eWxlKikgY29u
c3Q7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRlclRodW1iU2l6ZShSZW5kZXJP
YmplY3QqKSBjb25zdDsKKyAgICAgICAgCisgICAgICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJu
YWxQYWRkaW5nTGVmdChSZW5kZXJTdHlsZSopIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGludCBw
b3B1cEludGVybmFsUGFkZGluZ1JpZ2h0KFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgICAgIHZp
cnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5nVG9wKFJlbmRlclN0eWxlKikgY29uc3Q7Cisg
ICAgICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5nQm90dG9tKFJlbmRlclN0eWxl
KikgY29uc3Q7CisgICAgICAgIAorICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRDYXBzTG9ja0lu
ZGljYXRvcihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0dWFsIENvbG9yIHN5c3RlbUNvbG9yKGludCBj
c3NWYWx1ZUlkKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gTWV0aG9kcyBm
b3IgZWFjaCBhcHBlYXJhbmNlIHZhbHVlLgorICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRDaGVj
a2JveChSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0
IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldENoZWNrYm94U2l6ZShSZW5kZXJT
dHlsZSopIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFJhZGlvKFJlbmRlck9i
amVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOwor
ICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmFkaW9TaXplKFJlbmRlclN0eWxlKikgY29uc3Q7CisK
KyAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3Iq
LCBSZW5kZXJTdHlsZSosIFdlYkNvcmU6OkVsZW1lbnQqKSBjb25zdDsKKyAgICAgICAgdmlydHVh
bCBib29sIHBhaW50QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFp
bnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0QnV0dG9u
U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludFRl
eHRGaWVsZChSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNv
bnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFRleHRGaWVsZFN0eWxl
KENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKworICAg
ICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRUZXh0QXJlYShSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5k
ZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCB2
b2lkIGFkanVzdFRleHRBcmVhU3R5bGUoQ1NTU3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwg
RWxlbWVudCopIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJl
bmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNl
bGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisKKyAgICAgICAgdmlydHVh
bCBib29sIHBhaW50TWVudUxpc3RCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBh
ZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSos
IEVsZW1lbnQqKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRTbGlkZXJUcmFj
ayhSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IElu
dFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFkanVzdFNsaWRlclRyYWNrU3R5bGUoQ1NT
U3R5bGVTZWxlY3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworCisgICAgICAg
IHZpcnR1YWwgYm9vbCBwYWludFNsaWRlclRodW1iKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgICAgICB2aXJ0dWFsIHZv
aWQgYWRqdXN0U2xpZGVyVGh1bWJTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUq
LCBFbGVtZW50KikgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmll
bGQoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJ
bnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZFN0eWxlKENT
U1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKworICAgICAg
ICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRDYW5jZWxCdXR0b25TdHlsZShDU1NTdHls
ZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgICAgIHZpcnR1
YWwgYm9vbCBwYWludFNlYXJjaEZpZWxkQ2FuY2VsQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgICAgIHZp
cnR1YWwgdm9pZCBhZGp1c3RTZWFyY2hGaWVsZERlY29yYXRpb25TdHlsZShDU1NTdHlsZVNlbGVj
dG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgYm9v
bCBwYWludFNlYXJjaEZpZWxkRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJP
YmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0dWFsIHZv
aWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvblN0eWxlKENTU1N0eWxlU2VsZWN0
b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBib29s
IHBhaW50U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqLCBjb25zdCBS
ZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICB2aXJ0
dWFsIHZvaWQgYWRqdXN0U2VhcmNoRmllbGRSZXN1bHRzQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxl
Y3RvciosIFJlbmRlclN0eWxlKiwgRWxlbWVudCopIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJv
b2wgcGFpbnRTZWFyY2hGaWVsZFJlc3VsdHNCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVu
ZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisKKyAgICAgICAgdmlydHVh
bCBib29sIHBhaW50TWVkaWFGdWxsc2NyZWVuQnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFJl
bmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworICAgICAgICB2aXJ0dWFs
IGJvb2wgcGFpbnRNZWRpYVBsYXlCdXR0b24oUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwgYm9vbCBw
YWludE1lZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVk
aWFTZWVrQmFja0J1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFT
ZWVrRm9yd2FyZEJ1dHRvbihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYsIGNvbnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFT
bGlkZXJUcmFjayhSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYs
IGNvbnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50TWVkaWFTbGlkZXJU
aHVtYihSZW5kZXJPYmplY3QqLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYsIGNvbnN0
IEludFJlY3QmKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIEludFJlY3QgaW5mbGF0ZVJlY3Qo
Y29uc3QgSW50UmVjdCYsIGNvbnN0IEludFNpemUmLCBjb25zdCBpbnQqIG1hcmdpbnMsIGZsb2F0
IHpvb21MZXZlbCA9IDEuMGYpIGNvbnN0OworCisgICAgICAgIC8vIEdldCB0aGUgY29udHJvbCBz
aXplIGJhc2VkIG9mZiB0aGUgZm9udC4gIFVzZWQgYnkgc29tZSBvZiB0aGUgY29udHJvbHMgKGxp
a2UgYnV0dG9ucykuCisgICAgICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNpemVGb3JGb250KFJl
bmRlclN0eWxlKikgY29uc3Q7CisgICAgICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNpemVGb3JT
eXN0ZW1Gb250KFJlbmRlclN0eWxlKikgY29uc3Q7CisgICAgICAgIHZvaWQgc2V0Q29udHJvbFNp
emUoTlNDZWxsKiwgY29uc3QgSW50U2l6ZSogc2l6ZXMsIGNvbnN0IEludFNpemUmIG1pblNpemUs
IGZsb2F0IHpvb21MZXZlbCA9IDEuMGYpOworICAgICAgICB2b2lkIHNldFNpemVGcm9tRm9udChS
ZW5kZXJTdHlsZSosIGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdDsKKyAgICAgICAgSW50U2l6
ZSBzaXplRm9yRm9udChSZW5kZXJTdHlsZSosIGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdDsK
KyAgICAgICAgSW50U2l6ZSBzaXplRm9yU3lzdGVtRm9udChSZW5kZXJTdHlsZSosIGNvbnN0IElu
dFNpemUqIHNpemVzKSBjb25zdDsKKyAgICAgICAgdm9pZCBzZXRGb250RnJvbUNvbnRyb2xTaXpl
KENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSosIE5TQ29udHJvbFNpemUpIGNvbnN0Owor
CisgICAgICAgIHZvaWQgdXBkYXRlQ2hlY2tlZFN0YXRlKE5TQ2VsbCosIGNvbnN0IFJlbmRlck9i
amVjdCopOworICAgICAgICB2b2lkIHVwZGF0ZUVuYWJsZWRTdGF0ZShOU0NlbGwqLCBjb25zdCBS
ZW5kZXJPYmplY3QqKTsKKyAgICAgICAgdm9pZCB1cGRhdGVGb2N1c2VkU3RhdGUoTlNDZWxsKiwg
Y29uc3QgUmVuZGVyT2JqZWN0Kik7CisgICAgICAgIHZvaWQgdXBkYXRlUHJlc3NlZFN0YXRlKE5T
Q2VsbCosIGNvbnN0IFJlbmRlck9iamVjdCopOworCisgICAgICAgIC8vIEhlbHBlcnMgZm9yIGFk
anVzdGluZyBhcHBlYXJhbmNlIGFuZCBmb3IgcGFpbnRpbmcKKyAgICAgICAgY29uc3QgSW50U2l6
ZSogY2hlY2tib3hTaXplcygpIGNvbnN0OworICAgICAgICBjb25zdCBpbnQqIGNoZWNrYm94TWFy
Z2lucygpIGNvbnN0OworICAgICAgICB2b2lkIHNldENoZWNrYm94Q2VsbFN0YXRlKGNvbnN0IFJl
bmRlck9iamVjdCosIGNvbnN0IEludFJlY3QmKTsKKworICAgICAgICBjb25zdCBJbnRTaXplKiBy
YWRpb1NpemVzKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IGludCogcmFkaW9NYXJnaW5zKCkgY29u
c3Q7CisgICAgICAgIHZvaWQgc2V0UmFkaW9DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0Kiwg
Y29uc3QgSW50UmVjdCYpOworCisgICAgICAgIHZvaWQgc2V0QnV0dG9uUGFkZGluZ0Zyb21Db250
cm9sU2l6ZShSZW5kZXJTdHlsZSosIE5TQ29udHJvbFNpemUpIGNvbnN0OworICAgICAgICBjb25z
dCBJbnRTaXplKiBidXR0b25TaXplcygpIGNvbnN0OworICAgICAgICBjb25zdCBpbnQqIGJ1dHRv
bk1hcmdpbnMoKSBjb25zdDsKKyAgICAgICAgdm9pZCBzZXRCdXR0b25DZWxsU3RhdGUoY29uc3Qg
UmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVjdCYpOworCisgICAgICAgIHZvaWQgc2V0UG9wdXBC
dXR0b25DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiwgY29uc3QgSW50UmVjdCYpOworICAg
ICAgICBjb25zdCBJbnRTaXplKiBwb3B1cEJ1dHRvblNpemVzKCkgY29uc3Q7CisgICAgICAgIGNv
bnN0IGludCogcG9wdXBCdXR0b25NYXJnaW5zKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IGludCog
cG9wdXBCdXR0b25QYWRkaW5nKE5TQ29udHJvbFNpemUpIGNvbnN0OworICAgICAgICB2b2lkIHBh
aW50TWVudUxpc3RCdXR0b25HcmFkaWVudHMoUmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIGNvbnN0IEludFNpemUq
IG1lbnVMaXN0U2l6ZXMoKSBjb25zdDsKKworICAgICAgICBjb25zdCBJbnRTaXplKiBzZWFyY2hG
aWVsZFNpemVzKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IEludFNpemUqIGNhbmNlbEJ1dHRvblNp
emVzKCkgY29uc3Q7CisgICAgICAgIGNvbnN0IEludFNpemUqIHJlc3VsdHNCdXR0b25TaXplcygp
IGNvbnN0OworICAgICAgICB2b2lkIHNldFNlYXJjaENlbGxTdGF0ZShSZW5kZXJPYmplY3QqLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZvaWQgc2V0U2VhcmNoRmllbGRTaXplKFJlbmRlclN0
eWxlKikgY29uc3Q7CisgICAgICAgIAorICAgICAgICBOU0J1dHRvbkNlbGwqIGNoZWNrYm94KCkg
Y29uc3Q7CisgICAgICAgIE5TQnV0dG9uQ2VsbCogcmFkaW8oKSBjb25zdDsKKyAgICAgICAgTlNC
dXR0b25DZWxsKiBidXR0b24oKSBjb25zdDsKKyAgICAgICAgTlNQb3BVcEJ1dHRvbkNlbGwqIHBv
cHVwQnV0dG9uKCkgY29uc3Q7CisgICAgICAgIE5TU2VhcmNoRmllbGRDZWxsKiBzZWFyY2goKSBj
b25zdDsKKyAgICAgICAgTlNNZW51KiBzZWFyY2hNZW51VGVtcGxhdGUoKSBjb25zdDsKKyAgICAg
ICAgTlNTbGlkZXJDZWxsKiBzbGlkZXJUaHVtYkhvcml6b250YWwoKSBjb25zdDsKKyAgICAgICAg
TlNTbGlkZXJDZWxsKiBzbGlkZXJUaHVtYlZlcnRpY2FsKCkgY29uc3Q7CisKKyAgICBwcml2YXRl
OgorICAgICAgICBtdXRhYmxlIFJldGFpblB0cjxOU0J1dHRvbkNlbGw+IG1fY2hlY2tib3g7Cisg
ICAgICAgIG11dGFibGUgUmV0YWluUHRyPE5TQnV0dG9uQ2VsbD4gbV9yYWRpbzsKKyAgICAgICAg
bXV0YWJsZSBSZXRhaW5QdHI8TlNCdXR0b25DZWxsPiBtX2J1dHRvbjsKKyAgICAgICAgbXV0YWJs
ZSBSZXRhaW5QdHI8TlNQb3BVcEJ1dHRvbkNlbGw+IG1fcG9wdXBCdXR0b247CisgICAgICAgIG11
dGFibGUgUmV0YWluUHRyPE5TU2VhcmNoRmllbGRDZWxsPiBtX3NlYXJjaDsKKyAgICAgICAgbXV0
YWJsZSBSZXRhaW5QdHI8TlNNZW51PiBtX3NlYXJjaE1lbnVUZW1wbGF0ZTsKKyAgICAgICAgbXV0
YWJsZSBSZXRhaW5QdHI8TlNTbGlkZXJDZWxsPiBtX3NsaWRlclRodW1iSG9yaXpvbnRhbDsKKyAg
ICAgICAgbXV0YWJsZSBSZXRhaW5QdHI8TlNTbGlkZXJDZWxsPiBtX3NsaWRlclRodW1iVmVydGlj
YWw7CisKKyAgICAgICAgYm9vbCBtX2lzU2xpZGVyVGh1bWJIb3Jpem9udGFsUHJlc3NlZDsKKyAg
ICAgICAgYm9vbCBtX2lzU2xpZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQ7CisKKyAgICAgICAgbXV0
YWJsZSBIYXNoTWFwPGludCwgUkdCQTMyPiBtX3N5c3RlbUNvbG9yQ2FjaGU7CisKKyAgICAgICAg
UmV0YWluUHRyPFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyPiBtX25vdGlm
aWNhdGlvbk9ic2VydmVyOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmCkluZGV4OiByZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bU1hYy5tbQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bU1hYy5tbQkocmV2aXNpb24gMCkKKysr
IHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtTWFjLm1tCShyZXZpc2lvbiAwKQpAQCAtMCww
ICsxLDE5NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUsIDIwMDYsIDIwMDcsIDIwMDgg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4LCAy
MDA5IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24g
MiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZl
IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4s
IDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqLworCisvLyBGSVhNRTogd2Ugc3RpbGwgbmVlZCB0byBmaWd1cmUgb3V0IGlm
IHBhc3NpbmcgYSBudWxsIHZpZXcgdG8gdGhlIGNlbGwKKy8vIGRyYXdpbmcgcm91dGluZXMgd2ls
bCB3b3JrLiBJIGV4cGVjdCBub3QsIGFuZCBpZiB0aGF0J3MgdGhlIGNhc2Ugd2UnbGwgaGF2ZQor
Ly8gdG8gZmlndXJlIG91dCBzb21ldGhpbmcgZWxzZS4gRm9yIG5vdywgYXQgbGVhc3QgbGVhdmUg
dGhlIGxpbmVzIGNvbW1lbnRlZAorLy8gaW4sIGJ1dCB0aGUgcHJvY3VyZW1lbnQgb2YgdGhlIHZp
ZXcgaWYgMCdkLgorCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlJlbmRlclRoZW1lQ2hy
b21pdW1NYWMuaCIKKworI2ltcG9ydCA8Q2FyYm9uL0NhcmJvbi5oPgorI2ltcG9ydCA8Q29jb2Ev
Q29jb2EuaD4KKyNpbXBvcnQgPG1hdGguaD4KKworI2ltcG9ydCAiQml0bWFwSW1hZ2UuaCIKKyNp
bXBvcnQgIkNTU1N0eWxlU2VsZWN0b3IuaCIKKyNpbXBvcnQgIkNTU1ZhbHVlS2V5d29yZHMuaCIK
KyNpbXBvcnQgIkRvY3VtZW50LmgiCisjaW1wb3J0ICJFbGVtZW50LmgiCisjaW1wb3J0ICJGb3Vu
ZGF0aW9uRXh0cmFzLmgiCisjaW1wb3J0ICJGcmFtZVZpZXcuaCIKKyNpbXBvcnQgIkdyYXBoaWNz
Q29udGV4dC5oIgorI2ltcG9ydCAiSFRNTElucHV0RWxlbWVudC5oIgorI2ltcG9ydCAiSFRNTE1l
ZGlhRWxlbWVudC5oIgorI2ltcG9ydCAiSFRNTE5hbWVzLmgiCisjaW1wb3J0ICJJbWFnZS5oIgor
I2ltcG9ydCAiTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0LmgiCisjaW1wb3J0ICJNZWRpYUNv
bnRyb2xFbGVtZW50cy5oIgorI2ltcG9ydCAiUmVuZGVyU2xpZGVyLmgiCisjaW1wb3J0ICJSZW5k
ZXJWaWV3LmgiCisjaW1wb3J0ICJTaGFyZWRCdWZmZXIuaCIKKyNpbXBvcnQgIldlYkNvcmVTeXN0
ZW1JbnRlcmZhY2UuaCIKKyNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KKworI2lmZGVmIEJVSUxE
SU5HX09OX1RJR0VSCit0eXBlZGVmIGludCBOU0ludGVnZXI7Cit0eXBlZGVmIHVuc2lnbmVkIE5T
VUludGVnZXI7CisjZW5kaWYKKwordXNpbmcgc3RkOjptaW47CisKKy8vIFRoZSBtZXRob2RzIGlu
IHRoaXMgZmlsZSBhcmUgc3BlY2lmaWMgdG8gdGhlIE1hYyBPUyBYIHBsYXRmb3JtLgorCisvLyBG
SVhNRTogVGhlIHBsYXRmb3JtLWluZGVwZW5kZW50IGNvZGUgaW4gdGhpcyBjbGFzcyBzaG91bGQg
YmUgZmFjdG9yZWQgb3V0IGFuZCBtZXJnZWQgd2l0aCBSZW5kZXJUaGVtZVNhZmFyaS4gCisKK0Bp
bnRlcmZhY2UgV2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0aW9uT2JzZXJ2ZXIgOiBOU09iamVj
dAoreworICAgIFdlYkNvcmU6OlJlbmRlclRoZW1lICpfdGhlbWU7Cit9CisKKy0gKGlkKWluaXRX
aXRoVGhlbWU6KFdlYkNvcmU6OlJlbmRlclRoZW1lICopdGhlbWU7CistICh2b2lkKXN5c3RlbUNv
bG9yc0RpZENoYW5nZTooTlNOb3RpZmljYXRpb24gKilub3RpZmljYXRpb247CisKK0BlbmQKKwor
QGltcGxlbWVudGF0aW9uIFdlYkNvcmVSZW5kZXJUaGVtZU5vdGlmaWNhdGlvbk9ic2VydmVyCisK
Ky0gKGlkKWluaXRXaXRoVGhlbWU6KFdlYkNvcmU6OlJlbmRlclRoZW1lICopdGhlbWUKK3sKKyAg
ICBbc3VwZXIgaW5pdF07CisgICAgX3RoZW1lID0gdGhlbWU7CisgICAgCisgICAgcmV0dXJuIHNl
bGY7Cit9CisKKy0gKHZvaWQpc3lzdGVtQ29sb3JzRGlkQ2hhbmdlOihOU05vdGlmaWNhdGlvbiAq
KW5vdGlmaWNhdGlvbgoreworICAgIEFTU0VSVChbW25vdGlmaWNhdGlvbiBuYW1lXSBpc0VxdWFs
VG9TdHJpbmc6TlNTeXN0ZW1Db2xvcnNEaWRDaGFuZ2VOb3RpZmljYXRpb25dKTsKKyAgICBfdGhl
bWUtPnBsYXRmb3JtQ29sb3JzRGlkQ2hhbmdlKCk7Cit9CisKK0BlbmQKKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCit1c2luZyBuYW1lc3BhY2UgSFRNTE5hbWVzOworCitlbnVtIHsKKyAgICBUb3BN
YXJnaW4sCisgICAgUmlnaHRNYXJnaW4sCisgICAgQm90dG9tTWFyZ2luLAorICAgIExlZnRNYXJn
aW4KK307CisKK2VudW0geworICAgIFRvcFBhZGRpbmcsCisgICAgUmlnaHRQYWRkaW5nLAorICAg
IEJvdHRvbVBhZGRpbmcsCisgICAgTGVmdFBhZGRpbmcKK307CisKKy8vIEluIG91ciBNYWMgcG9y
dCwgd2UgZG9uJ3QgZGVmaW5lIFBMQVRGT1JNKE1BQykgYW5kIHRodXMgZG9uJ3QgcGljayB1cCB0
aGUKKy8vIHxvcGVyYXRvciBOU1JlY3QoKXwgb24gV2ViQ29yZTo6SW50UmVjdCBhbmQgRmxvYXRS
ZWN0LiBUaGlzIHN1YnN0aXR1ZXMgZm9yCisvLyB0aGF0IG1pc3NpbmcgY29udmVyc2lvbiBvcGVy
YXRvci4KK05TUmVjdCBJbnRSZWN0VG9OU1JlY3QoY29uc3QgSW50UmVjdCAmIHJlY3QpCit7Cisg
ICAgcmV0dXJuIE5TTWFrZVJlY3QocmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJl
Y3QuaGVpZ2h0KCkpOworfQorCitOU1JlY3QgRmxvYXRSZWN0VG9OU1JlY3QoY29uc3QgRmxvYXRS
ZWN0ICYgcmVjdCkKK3sKKyAgICByZXR1cm4gTlNNYWtlUmVjdChyZWN0LngoKSwgcmVjdC55KCks
IHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Cit9CisKK0ludFJlY3QgTlNSZWN0VG9JbnRS
ZWN0KGNvbnN0IE5TUmVjdCAmIHJlY3QpCit7CisgICAgcmV0dXJuIEludFJlY3QocmVjdC5vcmln
aW4ueCwgcmVjdC5vcmlnaW4ueSwgcmVjdC5zaXplLndpZHRoLCByZWN0LnNpemUuaGVpZ2h0KTsK
K30KKworUmVuZGVyVGhlbWUqIHRoZW1lKCkKK3sKKyAgICBzdGF0aWMgUmVuZGVyVGhlbWVDaHJv
bWl1bU1hYyogbWFjVGhlbWUgPSBuZXcgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzsKKyAgICByZXR1
cm4gbWFjVGhlbWU7Cit9CisKK1JlbmRlclRoZW1lQ2hyb21pdW1NYWM6OlJlbmRlclRoZW1lQ2hy
b21pdW1NYWMoKQorICAgIDogbV9pc1NsaWRlclRodW1iSG9yaXpvbnRhbFByZXNzZWQoZmFsc2Up
CisgICAgLCBtX2lzU2xpZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQoZmFsc2UpCisgICAgLCBtX25v
dGlmaWNhdGlvbk9ic2VydmVyKEFkb3B0TlMsIFtbV2ViQ29yZVJlbmRlclRoZW1lTm90aWZpY2F0
aW9uT2JzZXJ2ZXIgYWxsb2NdIGluaXRXaXRoVGhlbWU6dGhpc10pCit7CisgICAgW1tOU05vdGlm
aWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSBhZGRPYnNlcnZlcjptX25vdGlmaWNhdGlvbk9i
c2VydmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHNlbGVjdG9yOkBzZWxlY3RvcihzeXN0ZW1Db2xvcnNEaWRDaGFuZ2U6KQor
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgbmFtZTpOU1N5c3RlbUNvbG9yc0RpZENoYW5nZU5vdGlmaWNhdGlvbgorICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDpuaWxd
OworfQorCitSZW5kZXJUaGVtZUNocm9taXVtTWFjOjp+UmVuZGVyVGhlbWVDaHJvbWl1bU1hYygp
Cit7CisgICAgW1tOU05vdGlmaWNhdGlvbkNlbnRlciBkZWZhdWx0Q2VudGVyXSByZW1vdmVPYnNl
cnZlcjptX25vdGlmaWNhdGlvbk9ic2VydmVyLmdldCgpXTsKK30KKworQ29sb3IgUmVuZGVyVGhl
bWVDaHJvbWl1bU1hYzo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBj
b25zdAoreworICAgIE5TQ29sb3IqIGNvbG9yID0gW1tOU0NvbG9yIHNlbGVjdGVkVGV4dEJhY2tn
cm91bmRDb2xvcl0gY29sb3JVc2luZ0NvbG9yU3BhY2VOYW1lOk5TRGV2aWNlUkdCQ29sb3JTcGFj
ZV07CisgICAgcmV0dXJuIENvbG9yKHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgcmVk
Q29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgZ3JlZW5Db21wb25l
bnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBibHVlQ29tcG9uZW50XSkpOwor
fQorCitDb2xvciBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpwbGF0Zm9ybUluYWN0aXZlU2VsZWN0
aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBOU0NvbG9yKiBjb2xvciA9IFtbTlND
b2xvciBzZWNvbmRhcnlTZWxlY3RlZENvbnRyb2xDb2xvcl0gY29sb3JVc2luZ0NvbG9yU3BhY2VO
YW1lOk5TRGV2aWNlUkdCQ29sb3JTcGFjZV07CisgICAgcmV0dXJuIENvbG9yKHN0YXRpY19jYXN0
PGludD4oMjU1LjAgKiBbY29sb3IgcmVkQ29tcG9uZW50XSksIHN0YXRpY19jYXN0PGludD4oMjU1
LjAgKiBbY29sb3IgZ3JlZW5Db21wb25lbnRdKSwgc3RhdGljX2Nhc3Q8aW50PigyNTUuMCAqIFtj
b2xvciBibHVlQ29tcG9uZW50XSkpOworfQorCitDb2xvciBSZW5kZXJUaGVtZUNocm9taXVtTWFj
OjphY3RpdmVMaXN0Qm94U2VsZWN0aW9uQmFja2dyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICBO
U0NvbG9yKiBjb2xvciA9IFtbTlNDb2xvciBhbHRlcm5hdGVTZWxlY3RlZENvbnRyb2xDb2xvcl0g
Y29sb3JVc2luZ0NvbG9yU3BhY2VOYW1lOk5TRGV2aWNlUkdCQ29sb3JTcGFjZV07CisgICAgcmV0
dXJuIENvbG9yKHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgcmVkQ29tcG9uZW50XSks
IHN0YXRpY19jYXN0PGludD4oMjU1LjAgKiBbY29sb3IgZ3JlZW5Db21wb25lbnRdKSwgc3RhdGlj
X2Nhc3Q8aW50PigyNTUuMCAqIFtjb2xvciBibHVlQ29tcG9uZW50XSkpOworfQorCitzdGF0aWMg
Rm9udFdlaWdodCB0b0ZvbnRXZWlnaHQoTlNJbnRlZ2VyIGFwcEtpdEZvbnRXZWlnaHQpCit7Cisg
ICAgQVNTRVJUKGFwcEtpdEZvbnRXZWlnaHQgPiAwICYmIGFwcEtpdEZvbnRXZWlnaHQgPCAxNSk7
CisgICAgaWYgKGFwcEtpdEZvbnRXZWlnaHQgPiAxNCkKKyAgICAgICAgYXBwS2l0Rm9udFdlaWdo
dCA9IDE0OworICAgIGVsc2UgaWYgKGFwcEtpdEZvbnRXZWlnaHQgPCAxKQorICAgICAgICBhcHBL
aXRGb250V2VpZ2h0ID0gMTsKKworICAgIHN0YXRpYyBGb250V2VpZ2h0IGZvbnRXZWlnaHRzW10g
PSB7CisgICAgICAgIEZvbnRXZWlnaHQxMDAsCisgICAgICAgIEZvbnRXZWlnaHQxMDAsCisgICAg
ICAgIEZvbnRXZWlnaHQyMDAsCisgICAgICAgIEZvbnRXZWlnaHQzMDAsCisgICAgICAgIEZvbnRX
ZWlnaHQ0MDAsCisgICAgICAgIEZvbnRXZWlnaHQ1MDAsCisgICAgICAgIEZvbnRXZWlnaHQ2MDAs
CisgICAgICAgIEZvbnRXZWlnaHQ2MDAsCisgICAgICAgIEZvbnRXZWlnaHQ3MDAsCisgICAgICAg
IEZvbnRXZWlnaHQ4MDAsCisgICAgICAgIEZvbnRXZWlnaHQ4MDAsCisgICAgICAgIEZvbnRXZWln
aHQ5MDAsCisgICAgICAgIEZvbnRXZWlnaHQ5MDAsCisgICAgICAgIEZvbnRXZWlnaHQ5MDAKKyAg
ICB9OworICAgIHJldHVybiBmb250V2VpZ2h0c1thcHBLaXRGb250V2VpZ2h0IC0gMV07Cit9CisK
K3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6c3lzdGVtRm9udChpbnQgY3NzVmFsdWVJZCwg
RG9jdW1lbnQqIGRvY3VtZW50LCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29u
c3QKK3sKKyAgICBzdGF0aWMgRm9udERlc2NyaXB0aW9uIHN5c3RlbUZvbnQ7CisgICAgc3RhdGlj
IEZvbnREZXNjcmlwdGlvbiBzbWFsbFN5c3RlbUZvbnQ7CisgICAgc3RhdGljIEZvbnREZXNjcmlw
dGlvbiBtZW51Rm9udDsKKyAgICBzdGF0aWMgRm9udERlc2NyaXB0aW9uIGxhYmVsRm9udDsKKyAg
ICBzdGF0aWMgRm9udERlc2NyaXB0aW9uIG1pbmlDb250cm9sRm9udDsKKyAgICBzdGF0aWMgRm9u
dERlc2NyaXB0aW9uIHNtYWxsQ29udHJvbEZvbnQ7CisgICAgc3RhdGljIEZvbnREZXNjcmlwdGlv
biBjb250cm9sRm9udDsKKworICAgIEZvbnREZXNjcmlwdGlvbiogY2FjaGVkRGVzYzsKKyAgICBO
U0ZvbnQqIGZvbnQgPSBuaWw7CisgICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7CisgICAgY2FzZSBD
U1NWYWx1ZVNtYWxsQ2FwdGlvbjoKKyAgICAgICAgY2FjaGVkRGVzYyA9ICZzbWFsbFN5c3RlbUZv
bnQ7CisgICAgICAgIGlmICghc21hbGxTeXN0ZW1Gb250LmlzQWJzb2x1dGVTaXplKCkpCisgICAg
ICAgICAgICBmb250ID0gW05TRm9udCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc21hbGxTeXN0
ZW1Gb250U2l6ZV1dOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1ZhbHVlTWVudToKKyAg
ICAgICAgY2FjaGVkRGVzYyA9ICZtZW51Rm9udDsKKyAgICAgICAgaWYgKCFtZW51Rm9udC5pc0Fi
c29sdXRlU2l6ZSgpKQorICAgICAgICAgICAgZm9udCA9IFtOU0ZvbnQgbWVudUZvbnRPZlNpemU6
W05TRm9udCBzeXN0ZW1Gb250U2l6ZV1dOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1Zh
bHVlU3RhdHVzQmFyOgorICAgICAgICBjYWNoZWREZXNjID0gJmxhYmVsRm9udDsKKyAgICAgICAg
aWYgKCFsYWJlbEZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAgICAgICAgIGZvbnQgPSBbTlNG
b250IGxhYmVsRm9udE9mU2l6ZTpbTlNGb250IGxhYmVsRm9udFNpemVdXTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtpdE1pbmlDb250cm9sOgorICAgICAgICBjYWNoZWRE
ZXNjID0gJm1pbmlDb250cm9sRm9udDsKKyAgICAgICAgaWYgKCFtaW5pQ29udHJvbEZvbnQuaXNB
YnNvbHV0ZVNpemUoKSkKKyAgICAgICAgICAgIGZvbnQgPSBbTlNGb250IHN5c3RlbUZvbnRPZlNp
emU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXplOk5TTWluaUNvbnRyb2xTaXpl
XV07CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTVmFsdWVXZWJraXRTbWFsbENvbnRyb2w6
CisgICAgICAgIGNhY2hlZERlc2MgPSAmc21hbGxDb250cm9sRm9udDsKKyAgICAgICAgaWYgKCFz
bWFsbENvbnRyb2xGb250LmlzQWJzb2x1dGVTaXplKCkpCisgICAgICAgICAgICBmb250ID0gW05T
Rm9udCBzeXN0ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250cm9sU2l6
ZTpOU1NtYWxsQ29udHJvbFNpemVdXTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NWYWx1
ZVdlYmtpdENvbnRyb2w6CisgICAgICAgIGNhY2hlZERlc2MgPSAmY29udHJvbEZvbnQ7CisgICAg
ICAgIGlmICghY29udHJvbEZvbnQuaXNBYnNvbHV0ZVNpemUoKSkKKyAgICAgICAgICAgIGZvbnQg
PSBbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRy
b2xTaXplOk5TUmVndWxhckNvbnRyb2xTaXplXV07CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1
bHQ6CisgICAgICAgIGNhY2hlZERlc2MgPSAmc3lzdGVtRm9udDsKKyAgICAgICAgaWYgKCFzeXN0
ZW1Gb250LmlzQWJzb2x1dGVTaXplKCkpCisgICAgICAgICAgICBmb250ID0gW05TRm9udCBzeXN0
ZW1Gb250T2ZTaXplOltOU0ZvbnQgc3lzdGVtRm9udFNpemVdXTsKKyAgICB9CisKKyAgICBpZiAo
Zm9udCkgeworICAgICAgICBOU0ZvbnRNYW5hZ2VyICpmb250TWFuYWdlciA9IFtOU0ZvbnRNYW5h
Z2VyIHNoYXJlZEZvbnRNYW5hZ2VyXTsKKyAgICAgICAgY2FjaGVkRGVzYy0+c2V0SXNBYnNvbHV0
ZVNpemUodHJ1ZSk7CisgICAgICAgIGNhY2hlZERlc2MtPnNldEdlbmVyaWNGYW1pbHkoRm9udERl
c2NyaXB0aW9uOjpOb0ZhbWlseSk7CisgICAgICAgIGNhY2hlZERlc2MtPmZpcnN0RmFtaWx5KCku
c2V0RmFtaWx5KFtmb250IGZhbWlseU5hbWVdKTsKKyAgICAgICAgY2FjaGVkRGVzYy0+c2V0U3Bl
Y2lmaWVkU2l6ZShbZm9udCBwb2ludFNpemVdKTsKKyAgICAgICAgY2FjaGVkRGVzYy0+c2V0V2Vp
Z2h0KHRvRm9udFdlaWdodChbZm9udE1hbmFnZXIgd2VpZ2h0T2ZGb250OmZvbnRdKSk7CisgICAg
ICAgIGNhY2hlZERlc2MtPnNldEl0YWxpYyhbZm9udE1hbmFnZXIgdHJhaXRzT2ZGb250OmZvbnRd
ICYgTlNJdGFsaWNGb250TWFzayk7CisgICAgfQorICAgIGZvbnREZXNjcmlwdGlvbiA9ICpjYWNo
ZWREZXNjOworfQorCitzdGF0aWMgUkdCQTMyIGNvbnZlcnROU0NvbG9yVG9Db2xvcihOU0NvbG9y
ICpjb2xvcikKK3sKKyAgICBOU0NvbG9yICpjb2xvckluQ29sb3JTcGFjZSA9IFtjb2xvciBjb2xv
clVzaW5nQ29sb3JTcGFjZU5hbWU6TlNDYWxpYnJhdGVkUkdCQ29sb3JTcGFjZV07CisgICAgaWYg
KGNvbG9ySW5Db2xvclNwYWNlKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUgc2NhbGVG
YWN0b3IgPSBuZXh0YWZ0ZXIoMjU2LjAsIDAuMCk7CisgICAgICAgIHJldHVybiBtYWtlUkdCKHN0
YXRpY19jYXN0PGludD4oc2NhbGVGYWN0b3IgKiBbY29sb3JJbkNvbG9yU3BhY2UgcmVkQ29tcG9u
ZW50XSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNjYWxlRmFjdG9yICogW2NvbG9y
SW5Db2xvclNwYWNlIGdyZWVuQ29tcG9uZW50XSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxp
bnQ+KHNjYWxlRmFjdG9yICogW2NvbG9ySW5Db2xvclNwYWNlIGJsdWVDb21wb25lbnRdKSk7Cisg
ICAgfQorCisgICAgLy8gVGhpcyBjb252ZXJzaW9uIGFib3ZlIGNhbiBmYWlsIGlmIHRoZSBOU0Nv
bG9yIGluIHF1ZXN0aW9uIGlzIGFuIE5TUGF0dGVybkNvbG9yIAorICAgIC8vIChhcyBtYW55IHN5
c3RlbSBjb2xvcnMgYXJlKS4gVGhlc2UgY29sb3JzIGFyZSBhY3R1YWxseSBhIHJlcGVhdGluZyBw
YXR0ZXJuCisgICAgLy8gbm90IGp1c3QgYSBzb2xpZCBjb2xvci4gVG8gd29yayBhcm91bmQgdGhp
cyB3ZSBzaW1wbHkgZHJhdyBhIDF4MSBpbWFnZSBvZgorICAgIC8vIHRoZSBjb2xvciBhbmQgdXNl
IHRoYXQgcGl4ZWwncyBjb2xvci4gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIHVzZSBhbiBhdmVyYWdl
IG9mCisgICAgLy8gdGhlIGNvbG9ycyBpbiB0aGUgcGF0dGVybiBpbnN0ZWFkLgorICAgIE5TQml0
bWFwSW1hZ2VSZXAgKm9mZnNjcmVlblJlcCA9IFtbTlNCaXRtYXBJbWFnZVJlcCBhbGxvY10gaW5p
dFdpdGhCaXRtYXBEYXRhUGxhbmVzOm5pbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNXaWRl
OjEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzSGlnaDoxCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJp
dHNQZXJTYW1wbGU6OAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlclBpeGVsOjQKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBoYXNBbHBoYTpZRVMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BsYW5h
cjpOTworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGNvbG9yU3BhY2VOYW1lOk5TQ2FsaWJyYXRlZFJHQkNvbG9y
U3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1BlclJvdzo0CisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBiaXRzUGVyUGl4ZWw6MzJdOworCisgICAgW05TR3JhcGhpY3NDb250ZXh0IHNhdmVHcmFwaGlj
c1N0YXRlXTsKKyAgICBbTlNHcmFwaGljc0NvbnRleHQgc2V0Q3VycmVudENvbnRleHQ6W05TR3Jh
cGhpY3NDb250ZXh0IGdyYXBoaWNzQ29udGV4dFdpdGhCaXRtYXBJbWFnZVJlcDpvZmZzY3JlZW5S
ZXBdXTsKKyAgICBOU0VyYXNlUmVjdChOU01ha2VSZWN0KDAsIDAsIDEsIDEpKTsKKyAgICBbY29s
b3IgZHJhd1N3YXRjaEluUmVjdDpOU01ha2VSZWN0KDAsIDAsIDEsIDEpXTsKKyAgICBbTlNHcmFw
aGljc0NvbnRleHQgcmVzdG9yZUdyYXBoaWNzU3RhdGVdOworCisgICAgTlNVSW50ZWdlciBwaXhl
bFs0XTsKKyAgICBbb2Zmc2NyZWVuUmVwIGdldFBpeGVsOnBpeGVsIGF0WDowIHk6MF07CisKKyAg
ICBbb2Zmc2NyZWVuUmVwIHJlbGVhc2VdOworCisgICAgcmV0dXJuIG1ha2VSR0IocGl4ZWxbMF0s
IHBpeGVsWzFdLCBwaXhlbFsyXSk7Cit9CisKK3N0YXRpYyBSR0JBMzIgbWVudUJhY2tncm91bmRD
b2xvcigpCit7CisgICAgTlNCaXRtYXBJbWFnZVJlcCAqb2Zmc2NyZWVuUmVwID0gW1tOU0JpdG1h
cEltYWdlUmVwIGFsbG9jXSBpbml0V2l0aEJpdG1hcERhdGFQbGFuZXM6bmlsCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIHBpeGVsc1dpZGU6MQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHNIaWdoOjEK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZTo4CisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVz
UGVyUGl4ZWw6NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FscGhhOllFUworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIGlzUGxhbmFyOk5PCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JTcGFjZU5hbWU6
TlNDYWxpYnJhdGVkUkdCQ29sb3JTcGFjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzUGVyUm93
OjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJQaXhlbDozMl07CisKKyAgICBDR0NvbnRleHRS
ZWYgY29udGV4dCA9IHN0YXRpY19jYXN0PENHQ29udGV4dFJlZj4oW1tOU0dyYXBoaWNzQ29udGV4
dCBncmFwaGljc0NvbnRleHRXaXRoQml0bWFwSW1hZ2VSZXA6b2Zmc2NyZWVuUmVwXSBncmFwaGlj
c1BvcnRdKTsKKyAgICBDR1JlY3QgcmVjdCA9IENHUmVjdE1ha2UoMCwgMCwgMSwgMSk7CisgICAg
SElUaGVtZU1lbnVEcmF3SW5mbyBkcmF3SW5mbzsKKyAgICBkcmF3SW5mby52ZXJzaW9uID0gIDA7
CisgICAgZHJhd0luZm8ubWVudVR5cGUgPSBrVGhlbWVNZW51VHlwZVBvcFVwOworICAgIEhJVGhl
bWVEcmF3TWVudUJhY2tncm91bmQoJnJlY3QsICZkcmF3SW5mbywgY29udGV4dCwga0hJVGhlbWVP
cmllbnRhdGlvbkludmVydGVkKTsKKworICAgIE5TVUludGVnZXIgcGl4ZWxbNF07CisgICAgW29m
ZnNjcmVlblJlcCBnZXRQaXhlbDpwaXhlbCBhdFg6MCB5OjBdOworCisgICAgW29mZnNjcmVlblJl
cCByZWxlYXNlXTsKKworICAgIHJldHVybiBtYWtlUkdCKHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4
ZWxbMl0pOworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBsYXRmb3JtQ29sb3Jz
RGlkQ2hhbmdlKCkKK3sKKyAgICBtX3N5c3RlbUNvbG9yQ2FjaGUuY2xlYXIoKTsKKyAgICBSZW5k
ZXJUaGVtZTo6cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKK30KKworQ29sb3IgUmVuZGVyVGhl
bWVDaHJvbWl1bU1hYzo6c3lzdGVtQ29sb3IoaW50IGNzc1ZhbHVlSWQpIGNvbnN0Cit7CisgICAg
aWYgKG1fc3lzdGVtQ29sb3JDYWNoZS5jb250YWlucyhjc3NWYWx1ZUlkKSkKKyAgICAgICAgcmV0
dXJuIG1fc3lzdGVtQ29sb3JDYWNoZS5nZXQoY3NzVmFsdWVJZCk7CisgICAgCisgICAgQ29sb3Ig
Y29sb3I7CisgICAgc3dpdGNoIChjc3NWYWx1ZUlkKSB7CisgICAgY2FzZSBDU1NWYWx1ZUFjdGl2
ZWJvcmRlcjoKKyAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3Ig
a2V5Ym9hcmRGb2N1c0luZGljYXRvckNvbG9yXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Ug
Q1NTVmFsdWVBY3RpdmVjYXB0aW9uOgorICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9D
b2xvcihbTlNDb2xvciB3aW5kb3dGcmFtZVRleHRDb2xvcl0pOworICAgICAgICBicmVhazsKKyAg
ICBjYXNlIENTU1ZhbHVlQXBwd29ya3NwYWNlOgorICAgICAgICBjb2xvciA9IGNvbnZlcnROU0Nv
bG9yVG9Db2xvcihbTlNDb2xvciBoZWFkZXJDb2xvcl0pOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIENTU1ZhbHVlQmFja2dyb3VuZDoKKyAgICAgICAgLy8gVXNlIHRoZW1lIGluZGVwZW5kZW50
IGRlZmF1bHQKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbmZhY2U6Cisg
ICAgICAgIC8vIFdlIHVzZSB0aGlzIHZhbHVlIGluc3RlYWQgb2YgTlNDb2xvcidzIGNvbnRyb2xD
b2xvciB0byBhdm9pZCB3ZWJzaXRlIGluY29tcGF0aWJpbGl0aWVzLgorICAgICAgICAvLyBXZSBt
YXkgd2FudCB0byBjaGFuZ2UgdGhpcyB0byB1c2UgdGhlIE5TQ29sb3IgaW4gZnV0dXJlLgorICAg
ICAgICBjb2xvciA9IDB4RkZDMEMwQzA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTVmFs
dWVCdXR0b25oaWdobGlnaHQ6CisgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9y
KFtOU0NvbG9yIGNvbnRyb2xIaWdobGlnaHRDb2xvcl0pOworICAgICAgICBicmVhazsKKyAgICBj
YXNlIENTU1ZhbHVlQnV0dG9uc2hhZG93OgorICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9y
VG9Db2xvcihbTlNDb2xvciBjb250cm9sU2hhZG93Q29sb3JdKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBDU1NWYWx1ZUJ1dHRvbnRleHQ6CisgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29s
b3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xUZXh0Q29sb3JdKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBDU1NWYWx1ZUNhcHRpb250ZXh0OgorICAgICAgICBjb2xvciA9IGNvbnZlcnROU0Nv
bG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0Q29sb3JdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBDU1NWYWx1ZUdyYXl0ZXh0OgorICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xv
cihbTlNDb2xvciBkaXNhYmxlZENvbnRyb2xUZXh0Q29sb3JdKTsKKyAgICAgICAgYnJlYWs7Cisg
ICAgY2FzZSBDU1NWYWx1ZUhpZ2hsaWdodDoKKyAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xv
clRvQ29sb3IoW05TQ29sb3Igc2VsZWN0ZWRUZXh0QmFja2dyb3VuZENvbG9yXSk7CisgICAgICAg
IGJyZWFrOworICAgIGNhc2UgQ1NTVmFsdWVIaWdobGlnaHR0ZXh0OgorICAgICAgICBjb2xvciA9
IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBzZWxlY3RlZFRleHRDb2xvcl0pOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIENTU1ZhbHVlSW5hY3RpdmVib3JkZXI6CisgICAgICAgIGNv
bG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0NvbG9yIGNvbnRyb2xCYWNrZ3JvdW5kQ29s
b3JdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NWYWx1ZUluYWN0aXZlY2FwdGlvbjoK
KyAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgY29udHJvbEJh
Y2tncm91bmRDb2xvcl0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1ZhbHVlSW5hY3Rp
dmVjYXB0aW9udGV4dDoKKyAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05T
Q29sb3IgdGV4dENvbG9yXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTVmFsdWVJbmZv
YmFja2dyb3VuZDoKKyAgICAgICAgLy8gVGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBOU0NvbG9y
IGZvciB0aGlzIHNvIHdlIHVzZSBhIGhhcmQgY29kZWQgdmFsdWUuCisgICAgICAgIGNvbG9yID0g
MHhGRkZCRkNDNTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NWYWx1ZUluZm90ZXh0Ogor
ICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB0ZXh0Q29sb3Jd
KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NWYWx1ZU1lbnU6CisgICAgICAgIGNvbG9y
ID0gbWVudUJhY2tncm91bmRDb2xvcigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1Zh
bHVlTWVudXRleHQ6CisgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0Nv
bG9yIHNlbGVjdGVkTWVudUl0ZW1UZXh0Q29sb3JdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2Fz
ZSBDU1NWYWx1ZVNjcm9sbGJhcjoKKyAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29s
b3IoW05TQ29sb3Igc2Nyb2xsQmFyQ29sb3JdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBD
U1NWYWx1ZVRleHQ6CisgICAgICAgIGNvbG9yID0gY29udmVydE5TQ29sb3JUb0NvbG9yKFtOU0Nv
bG9yIHRleHRDb2xvcl0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1ZhbHVlVGhyZWVk
ZGFya3NoYWRvdzoKKyAgICAgICAgY29sb3IgPSBjb252ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29s
b3IgY29udHJvbERhcmtTaGFkb3dDb2xvcl0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENT
U1ZhbHVlVGhyZWVkc2hhZG93OgorICAgICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xv
cihbTlNDb2xvciBzaGFkb3dDb2xvcl0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1Zh
bHVlVGhyZWVkZmFjZToKKyAgICAgICAgLy8gV2UgdXNlIHRoaXMgdmFsdWUgaW5zdGVhZCBvZiBO
U0NvbG9yJ3MgY29udHJvbENvbG9yIHRvIGF2b2lkIHdlYnNpdGUgaW5jb21wYXRpYmlsaXRpZXMu
CisgICAgICAgIC8vIFdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzIHRvIHVzZSB0aGUgTlNDb2xv
ciBpbiBmdXR1cmUuCisgICAgICAgIGNvbG9yID0gMHhGRkMwQzBDMDsKKyAgICAgICAgYnJlYWs7
CisgICAgY2FzZSBDU1NWYWx1ZVRocmVlZGhpZ2hsaWdodDoKKyAgICAgICAgY29sb3IgPSBjb252
ZXJ0TlNDb2xvclRvQ29sb3IoW05TQ29sb3IgaGlnaGxpZ2h0Q29sb3JdKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBDU1NWYWx1ZVRocmVlZGxpZ2h0c2hhZG93OgorICAgICAgICBjb2xvciA9
IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciBjb250cm9sTGlnaHRIaWdobGlnaHRDb2xv
cl0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIENTU1ZhbHVlV2luZG93OgorICAgICAgICBj
b2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB3aW5kb3dCYWNrZ3JvdW5kQ29s
b3JdKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDU1NWYWx1ZVdpbmRvd2ZyYW1lOgorICAg
ICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB3aW5kb3dGcmFtZUNv
bG9yXSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTVmFsdWVXaW5kb3d0ZXh0OgorICAg
ICAgICBjb2xvciA9IGNvbnZlcnROU0NvbG9yVG9Db2xvcihbTlNDb2xvciB3aW5kb3dGcmFtZVRl
eHRDb2xvcl0pOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIWNvbG9yLmlzVmFs
aWQoKSkKKyAgICAgICAgY29sb3IgPSBSZW5kZXJUaGVtZTo6c3lzdGVtQ29sb3IoY3NzVmFsdWVJ
ZCk7CisKKyAgICBpZiAoY29sb3IuaXNWYWxpZCgpKQorICAgICAgICBtX3N5c3RlbUNvbG9yQ2Fj
aGUuc2V0KGNzc1ZhbHVlSWQsIGNvbG9yLnJnYigpKTsKKworICAgIHJldHVybiBjb2xvcjsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjppc0NvbnRyb2xTdHlsZWQoY29uc3QgUmVu
ZGVyU3R5bGUqIHN0eWxlLCBjb25zdCBCb3JkZXJEYXRhJiBib3JkZXIsCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxsTGF5ZXImIGJhY2tncm91
bmQsIGNvbnN0IENvbG9yJiBiYWNrZ3JvdW5kQ29sb3IpIGNvbnN0Cit7CisgICAgaWYgKHN0eWxl
LT5hcHBlYXJhbmNlKCkgPT0gVGV4dEZpZWxkUGFydCB8fCBzdHlsZS0+YXBwZWFyYW5jZSgpID09
IFRleHRBcmVhUGFydCB8fCBzdHlsZS0+YXBwZWFyYW5jZSgpID09IExpc3Rib3hQYXJ0KQorICAg
ICAgICByZXR1cm4gc3R5bGUtPmJvcmRlcigpICE9IGJvcmRlcjsKKyAgICAgICAgCisgICAgLy8g
RklYTUU6IFRoaXMgaXMgaG9ycmlibGUsIGJ1dCB0aGVyZSBpcyBub3QgbXVjaCBlbHNlIHRoYXQg
Y2FuIGJlIGRvbmUuICBNZW51IGxpc3RzIGNhbm5vdCBkcmF3IHByb3Blcmx5IHdoZW4KKyAgICAv
LyBzY2FsZWQuICBUaGV5IGNhbid0IHJlYWxseSBkcmF3IHByb3Blcmx5IHdoZW4gdHJhbnNmb3Jt
ZWQgZWl0aGVyLiAgV2UgY2FuJ3QgZGV0ZWN0IHRoZSB0cmFuc2Zvcm0gY2FzZSBhdCBzdHlsZQor
ICAgIC8vIGFkanVzdG1lbnQgdGltZSBzbyB0aGF0IHdpbGwganVzdCBoYXZlIHRvIHN0YXkgYnJv
a2VuLiAgV2UgY2FuIGhvd2V2ZXIgZGV0ZWN0IHRoYXQgd2UncmUgem9vbWluZy4gIElmIHpvb21p
bmcKKyAgICAvLyBpcyBpbiBlZmZlY3Qgd2UgdHJlYXQgaXQgbGlrZSB0aGUgY29udHJvbCBpcyBz
dHlsZWQuCisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0ICYmIHN0
eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gMS4wZikKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAg
ICByZXR1cm4gUmVuZGVyVGhlbWU6OmlzQ29udHJvbFN0eWxlZChzdHlsZSwgYm9yZGVyLCBiYWNr
Z3JvdW5kLCBiYWNrZ3JvdW5kQ29sb3IpOworfQorCisvLyBGSVhNRTogVXNlIHRoZSBjb2RlIGZy
b20gdGhlIG9sZCB1cHN0cmVhbSB2ZXJzaW9uLCBiZWZvcmUgaXQgd2FzIGNvbnZlcnRlZCB0byB0
aGUgbmV3IHRoZW1lIEFQSSBpbiByMzc3MzEuCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6
OmFkanVzdFJlcGFpbnRSZWN0KGNvbnN0IFJlbmRlck9iamVjdCogbywgSW50UmVjdCYgcikKK3sK
KyAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCk7CisKKyAg
ICBzd2l0Y2ggKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSkgeworICAgIGNhc2UgQ2hlY2tib3hQ
YXJ0OiB7CisgICAgICAgIC8vIFNpbmNlIHdlIHF1ZXJ5IHRoZSBwcm90b3R5cGUgY2VsbCwgd2Ug
bmVlZCB0byB1cGRhdGUgaXRzIHN0YXRlIHRvIG1hdGNoLgorICAgICAgICBzZXRDaGVja2JveENl
bGxTdGF0ZShvLCByKTsKKworICAgICAgICAvLyBXZSBpbmZsYXRlIHRoZSByZWN0IGFzIG5lZWRl
ZCB0byBhY2NvdW50IGZvciBwYWRkaW5nIGluY2x1ZGVkIGluIHRoZSBjZWxsIHRvIGFjY29tbW9k
YXRlIHRoZSBjaGVja2JveAorICAgICAgICAvLyBzaGFkb3ciIGFuZCB0aGUgY2hlY2suICBXZSBk
b24ndCBjb25zaWRlciB0aGlzIHBhcnQgb2YgdGhlIGJvdW5kcyBvZiB0aGUgY29udHJvbCBpbiBX
ZWJLaXQuCisgICAgICAgIEludFNpemUgc2l6ZSA9IGNoZWNrYm94U2l6ZXMoKVtbY2hlY2tib3go
KSBjb250cm9sU2l6ZV1dOworICAgICAgICBzaXplLnNldEhlaWdodChzaXplLmhlaWdodCgpICog
em9vbUxldmVsKTsKKyAgICAgICAgc2l6ZS5zZXRXaWR0aChzaXplLndpZHRoKCkgKiB6b29tTGV2
ZWwpOworICAgICAgICByID0gaW5mbGF0ZVJlY3Qociwgc2l6ZSwgY2hlY2tib3hNYXJnaW5zKCks
IHpvb21MZXZlbCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFJhZGlvUGFydDog
eworICAgICAgICAvLyBTaW5jZSB3ZSBxdWVyeSB0aGUgcHJvdG90eXBlIGNlbGwsIHdlIG5lZWQg
dG8gdXBkYXRlIGl0cyBzdGF0ZSB0byBtYXRjaC4KKyAgICAgICAgc2V0UmFkaW9DZWxsU3RhdGUo
bywgcik7CisKKyAgICAgICAgLy8gV2UgaW5mbGF0ZSB0aGUgcmVjdCBhcyBuZWVkZWQgdG8gYWNj
b3VudCBmb3IgcGFkZGluZyBpbmNsdWRlZCBpbiB0aGUgY2VsbCB0byBhY2NvbW1vZGF0ZSB0aGUg
Y2hlY2tib3gKKyAgICAgICAgLy8gc2hhZG93IiBhbmQgdGhlIGNoZWNrLiAgV2UgZG9uJ3QgY29u
c2lkZXIgdGhpcyBwYXJ0IG9mIHRoZSBib3VuZHMgb2YgdGhlIGNvbnRyb2wgaW4gV2ViS2l0Lgor
ICAgICAgICBJbnRTaXplIHNpemUgPSByYWRpb1NpemVzKClbW3JhZGlvKCkgY29udHJvbFNpemVd
XTsKKyAgICAgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7Cisg
ICAgICAgIHNpemUuc2V0V2lkdGgoc2l6ZS53aWR0aCgpICogem9vbUxldmVsKTsKKyAgICAgICAg
ciA9IGluZmxhdGVSZWN0KHIsIHNpemUsIHJhZGlvTWFyZ2lucygpLCB6b29tTGV2ZWwpOworICAg
ICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQdXNoQnV0dG9uUGFydDoKKyAgICBjYXNlIERl
ZmF1bHRCdXR0b25QYXJ0OgorICAgIGNhc2UgQnV0dG9uUGFydDogeworICAgICAgICAvLyBTaW5j
ZSB3ZSBxdWVyeSB0aGUgcHJvdG90eXBlIGNlbGwsIHdlIG5lZWQgdG8gdXBkYXRlIGl0cyBzdGF0
ZSB0byBtYXRjaC4KKyAgICAgICAgc2V0QnV0dG9uQ2VsbFN0YXRlKG8sIHIpOworCisgICAgICAg
IC8vIFdlIGluZmxhdGUgdGhlIHJlY3QgYXMgbmVlZGVkIHRvIGFjY291bnQgZm9yIHBhZGRpbmcg
aW5jbHVkZWQgaW4gdGhlIGNlbGwgdG8gYWNjb21tb2RhdGUgdGhlIGNoZWNrYm94CisgICAgICAg
IC8vIHNoYWRvdyIgYW5kIHRoZSBjaGVjay4gIFdlIGRvbid0IGNvbnNpZGVyIHRoaXMgcGFydCBv
ZiB0aGUgYm91bmRzIG9mIHRoZSBjb250cm9sIGluIFdlYktpdC4KKyAgICAgICAgaWYgKFtidXR0
b24oKSBiZXplbFN0eWxlXSA9PSBOU1JvdW5kZWRCZXplbFN0eWxlKSB7CisgICAgICAgICAgICBJ
bnRTaXplIHNpemUgPSBidXR0b25TaXplcygpW1tidXR0b24oKSBjb250cm9sU2l6ZV1dOworICAg
ICAgICAgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7CisgICAg
ICAgICAgICBzaXplLnNldFdpZHRoKHIud2lkdGgoKSk7CisgICAgICAgICAgICByID0gaW5mbGF0
ZVJlY3Qociwgc2l6ZSwgYnV0dG9uTWFyZ2lucygpLCB6b29tTGV2ZWwpOworICAgICAgICB9Cisg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1lbnVsaXN0UGFydDogeworICAgICAgICBz
ZXRQb3B1cEJ1dHRvbkNlbGxTdGF0ZShvLCByKTsKKyAgICAgICAgSW50U2l6ZSBzaXplID0gcG9w
dXBCdXR0b25TaXplcygpW1twb3B1cEJ1dHRvbigpIGNvbnRyb2xTaXplXV07CisgICAgICAgIHNp
emUuc2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkgKiB6b29tTGV2ZWwpOworICAgICAgICBzaXplLnNl
dFdpZHRoKHIud2lkdGgoKSk7CisgICAgICAgIHIgPSBpbmZsYXRlUmVjdChyLCBzaXplLCBwb3B1
cEJ1dHRvbk1hcmdpbnMoKSwgem9vbUxldmVsKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworSW50UmVjdCBSZW5kZXJUaGVt
ZUNocm9taXVtTWFjOjppbmZsYXRlUmVjdChjb25zdCBJbnRSZWN0JiByLCBjb25zdCBJbnRTaXpl
JiBzaXplLCBjb25zdCBpbnQqIG1hcmdpbnMsIGZsb2F0IHpvb21MZXZlbCkgY29uc3QKK3sKKyAg
ICAvLyBPbmx5IGRvIHRoZSBpbmZsYXRpb24gaWYgdGhlIGF2YWlsYWJsZSB3aWR0aC9oZWlnaHQg
YXJlIHRvbyBzbWFsbC4gIE90aGVyd2lzZSB0cnkgdG8KKyAgICAvLyBmaXQgdGhlIGdsb3cvY2hl
Y2sgc3BhY2UgaW50byB0aGUgYXZhaWxhYmxlIGJveCdzIHdpZHRoL2hlaWdodC4KKyAgICBpbnQg
d2lkdGhEZWx0YSA9IHIud2lkdGgoKSAtIChzaXplLndpZHRoKCkgKyBtYXJnaW5zW0xlZnRNYXJn
aW5dICogem9vbUxldmVsICsgbWFyZ2luc1tSaWdodE1hcmdpbl0gKiB6b29tTGV2ZWwpOworICAg
IGludCBoZWlnaHREZWx0YSA9IHIuaGVpZ2h0KCkgLSAoc2l6ZS5oZWlnaHQoKSArIG1hcmdpbnNb
VG9wTWFyZ2luXSAqIHpvb21MZXZlbCArIG1hcmdpbnNbQm90dG9tTWFyZ2luXSAqIHpvb21MZXZl
bCk7CisgICAgSW50UmVjdCByZXN1bHQocik7CisgICAgaWYgKHdpZHRoRGVsdGEgPCAwKSB7Cisg
ICAgICAgIHJlc3VsdC5zZXRYKHJlc3VsdC54KCkgLSBtYXJnaW5zW0xlZnRNYXJnaW5dICogem9v
bUxldmVsKTsKKyAgICAgICAgcmVzdWx0LnNldFdpZHRoKHJlc3VsdC53aWR0aCgpIC0gd2lkdGhE
ZWx0YSk7CisgICAgfQorICAgIGlmIChoZWlnaHREZWx0YSA8IDApIHsKKyAgICAgICAgcmVzdWx0
LnNldFkocmVzdWx0LnkoKSAtIG1hcmdpbnNbVG9wTWFyZ2luXSAqIHpvb21MZXZlbCk7CisgICAg
ICAgIHJlc3VsdC5zZXRIZWlnaHQocmVzdWx0LmhlaWdodCgpIC0gaGVpZ2h0RGVsdGEpOworICAg
IH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6
OnVwZGF0ZUNoZWNrZWRTdGF0ZShOU0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykK
K3sKKyAgICBib29sIG9sZEluZGV0ZXJtaW5hdGUgPSBbY2VsbCBzdGF0ZV0gPT0gTlNNaXhlZFN0
YXRlOworICAgIGJvb2wgaW5kZXRlcm1pbmF0ZSA9IGlzSW5kZXRlcm1pbmF0ZShvKTsKKyAgICBi
b29sIGNoZWNrZWQgPSBpc0NoZWNrZWQobyk7CisKKyAgICBpZiAob2xkSW5kZXRlcm1pbmF0ZSAh
PSBpbmRldGVybWluYXRlKSB7CisgICAgICAgIFtjZWxsIHNldFN0YXRlOmluZGV0ZXJtaW5hdGUg
PyBOU01peGVkU3RhdGUgOiAoY2hlY2tlZCA/IE5TT25TdGF0ZSA6IE5TT2ZmU3RhdGUpXTsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgb2xkQ2hlY2tlZCA9IFtjZWxsIHN0YXRl
XSA9PSBOU09uU3RhdGU7CisgICAgaWYgKGNoZWNrZWQgIT0gb2xkQ2hlY2tlZCkKKyAgICAgICAg
W2NlbGwgc2V0U3RhdGU6Y2hlY2tlZCA/IE5TT25TdGF0ZSA6IE5TT2ZmU3RhdGVdOworfQorCit2
b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnVwZGF0ZUVuYWJsZWRTdGF0ZShOU0NlbGwqIGNl
bGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykKK3sKKyAgICBib29sIG9sZEVuYWJsZWQgPSBbY2Vs
bCBpc0VuYWJsZWRdOworICAgIGJvb2wgZW5hYmxlZCA9IGlzRW5hYmxlZChvKTsKKyAgICBpZiAo
ZW5hYmxlZCAhPSBvbGRFbmFibGVkKQorICAgICAgICBbY2VsbCBzZXRFbmFibGVkOmVuYWJsZWRd
OworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnVwZGF0ZUZvY3VzZWRTdGF0ZShO
U0NlbGwqIGNlbGwsIGNvbnN0IFJlbmRlck9iamVjdCogbykKK3sKKyAgICBib29sIG9sZEZvY3Vz
ZWQgPSBbY2VsbCBzaG93c0ZpcnN0UmVzcG9uZGVyXTsKKyAgICBib29sIGZvY3VzZWQgPSBpc0Zv
Y3VzZWQobykgJiYgby0+c3R5bGUoKS0+b3V0bGluZVN0eWxlSXNBdXRvKCk7CisgICAgaWYgKGZv
Y3VzZWQgIT0gb2xkRm9jdXNlZCkKKyAgICAgICAgW2NlbGwgc2V0U2hvd3NGaXJzdFJlc3BvbmRl
cjpmb2N1c2VkXTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjp1cGRhdGVQcmVz
c2VkU3RhdGUoTlNDZWxsKiBjZWxsLCBjb25zdCBSZW5kZXJPYmplY3QqIG8pCit7CisgICAgYm9v
bCBvbGRQcmVzc2VkID0gW2NlbGwgaXNIaWdobGlnaHRlZF07CisgICAgYm9vbCBwcmVzc2VkID0g
KG8tPmVsZW1lbnQoKSAmJiBvLT5lbGVtZW50KCktPmFjdGl2ZSgpKTsKKyAgICBpZiAocHJlc3Nl
ZCAhPSBvbGRQcmVzc2VkKQorICAgICAgICBbY2VsbCBzZXRIaWdobGlnaHRlZDpwcmVzc2VkXTsK
K30KKworLy8gRklYTUU6IFRoaXMgdXNlZCB0byBiZSBpbiB0aGUgdXBzdHJlYW0gdmVyc2lvbiB1
bnRpbCBpdCB3YXMgY29udmVydGVkIHRvIHRoZSBuZXcgdGhlbWUgQVBJIGluIHIzNzczMS4KK2lu
dCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpiYXNlbGluZVBvc2l0aW9uKGNvbnN0IFJlbmRlck9i
amVjdCogbykgY29uc3QKK3sKKyAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IENo
ZWNrYm94UGFydCB8fCBvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gUmFkaW9QYXJ0KQorICAg
ICAgICByZXR1cm4gby0+bWFyZ2luVG9wKCkgKyBvLT5oZWlnaHQoKSAtIDIgKiBvLT5zdHlsZSgp
LT5lZmZlY3RpdmVab29tKCk7IC8vIFRoZSBiYXNlbGluZSBpcyAycHggdXAgZnJvbSB0aGUgYm90
dG9tIG9mIHRoZSBjaGVja2JveC9yYWRpbyBpbiBBcHBLaXQuCisgICAgcmV0dXJuIFJlbmRlclRo
ZW1lOjpiYXNlbGluZVBvc2l0aW9uKG8pOworfQorCitib29sIFJlbmRlclRoZW1lQ2hyb21pdW1N
YWM6OmNvbnRyb2xTdXBwb3J0c1RpbnRzKGNvbnN0IFJlbmRlck9iamVjdCogbykgY29uc3QKK3sK
KyAgICAvLyBBbiBhbHRlcm5hdGUgd2F5IHRvIGltcGxlbWVudCB0aGlzIHdvdWxkIGJlIHRvIGdl
dCB0aGUgYXBwcm9wcmlhdGUgY2VsbCBvYmplY3QKKyAgICAvLyBhbmQgY2FsbCB0aGUgcHJpdmF0
ZSBfbmVlZFJlZHJhd09uV2luZG93Q2hhbmdlZEtleVN0YXRlIG1ldGhvZC4gQW4gYWR2YW50YWdl
IG9mCisgICAgLy8gdGhhdCB3b3VsZCBiZSB0aGF0IHdlIHdvdWxkIG1hdGNoIEFwcEtpdCBiZWhh
dmlvciBtb3JlIGNsb3NlbHksIGJ1dCBhIGRpc2FkdmFudGFnZQorICAgIC8vIHdvdWxkIGJlIHRo
YXQgd2Ugd291bGQgcmVseSBvbiBhbiBBcHBLaXQgU1BJIG1ldGhvZC4KKworICAgIGlmICghaXNF
bmFibGVkKG8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDaGVja2JveGVzIG9u
bHkgaGF2ZSB0aW50IHdoZW4gY2hlY2tlZC4KKyAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5j
ZSgpID09IENoZWNrYm94UGFydCkKKyAgICAgICAgcmV0dXJuIGlzQ2hlY2tlZChvKTsKKworICAg
IC8vIEZvciBub3cgYXNzdW1lIG90aGVyIGNvbnRyb2xzIGhhdmUgdGludCBpZiBlbmFibGVkLgor
ICAgIHJldHVybiB0cnVlOworfQorCitOU0NvbnRyb2xTaXplIFJlbmRlclRoZW1lQ2hyb21pdW1N
YWM6OmNvbnRyb2xTaXplRm9yRm9udChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAg
aW50IGZvbnRTaXplID0gc3R5bGUtPmZvbnRTaXplKCk7CisgICAgaWYgKGZvbnRTaXplID49IDE2
KQorICAgICAgICByZXR1cm4gTlNSZWd1bGFyQ29udHJvbFNpemU7CisgICAgaWYgKGZvbnRTaXpl
ID49IDExKQorICAgICAgICByZXR1cm4gTlNTbWFsbENvbnRyb2xTaXplOworICAgIHJldHVybiBO
U01pbmlDb250cm9sU2l6ZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpzZXRD
b250cm9sU2l6ZShOU0NlbGwqIGNlbGwsIGNvbnN0IEludFNpemUqIHNpemVzLCBjb25zdCBJbnRT
aXplJiBtaW5TaXplLCBmbG9hdCB6b29tTGV2ZWwpCit7CisgICAgTlNDb250cm9sU2l6ZSBzaXpl
OworICAgIGlmIChtaW5TaXplLndpZHRoKCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplc1tOU1Jl
Z3VsYXJDb250cm9sU2l6ZV0ud2lkdGgoKSAqIHpvb21MZXZlbCkgJiYKKyAgICAgICAgbWluU2l6
ZS5oZWlnaHQoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVzW05TUmVndWxhckNvbnRyb2xTaXpl
XS5oZWlnaHQoKSAqIHpvb21MZXZlbCkpCisgICAgICAgIHNpemUgPSBOU1JlZ3VsYXJDb250cm9s
U2l6ZTsKKyAgICBlbHNlIGlmIChtaW5TaXplLndpZHRoKCkgPj0gc3RhdGljX2Nhc3Q8aW50Pihz
aXplc1tOU1NtYWxsQ29udHJvbFNpemVdLndpZHRoKCkgKiB6b29tTGV2ZWwpICYmCisgICAgICAg
ICAgICAgbWluU2l6ZS5oZWlnaHQoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVzW05TU21hbGxD
b250cm9sU2l6ZV0uaGVpZ2h0KCkgKiB6b29tTGV2ZWwpKQorICAgICAgICBzaXplID0gTlNTbWFs
bENvbnRyb2xTaXplOworICAgIGVsc2UKKyAgICAgICAgc2l6ZSA9IE5TTWluaUNvbnRyb2xTaXpl
OworICAgIGlmIChzaXplICE9IFtjZWxsIGNvbnRyb2xTaXplXSkgLy8gT25seSB1cGRhdGUgaWYg
d2UgaGF2ZSB0bywgc2luY2UgQXBwS2l0IGRvZXMgd29yayBldmVuIGlmIHRoZSBzaXplIGlzIHRo
ZSBzYW1lLgorICAgICAgICBbY2VsbCBzZXRDb250cm9sU2l6ZTpzaXplXTsKK30KKworSW50U2l6
ZSBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpzaXplRm9yRm9udChSZW5kZXJTdHlsZSogc3R5bGUs
IGNvbnN0IEludFNpemUqIHNpemVzKSBjb25zdAoreworICAgIGlmIChzdHlsZS0+ZWZmZWN0aXZl
Wm9vbSgpICE9IDEuMGYpIHsKKyAgICAgICAgSW50U2l6ZSByZXN1bHQgPSBzaXplc1tjb250cm9s
U2l6ZUZvckZvbnQoc3R5bGUpXTsKKyAgICAgICAgcmV0dXJuIEludFNpemUocmVzdWx0LndpZHRo
KCkgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpLCByZXN1bHQuaGVpZ2h0KCkgKiBzdHlsZS0+ZWZm
ZWN0aXZlWm9vbSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHNpemVzW2NvbnRyb2xTaXplRm9yRm9u
dChzdHlsZSldOworfQorCitJbnRTaXplIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnNpemVGb3JT
eXN0ZW1Gb250KFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgSW50U2l6ZSogc2l6ZXMpIGNvbnN0
Cit7CisgICAgaWYgKHN0eWxlLT5lZmZlY3RpdmVab29tKCkgIT0gMS4wZikgeworICAgICAgICBJ
bnRTaXplIHJlc3VsdCA9IHNpemVzW2NvbnRyb2xTaXplRm9yU3lzdGVtRm9udChzdHlsZSldOwor
ICAgICAgICByZXR1cm4gSW50U2l6ZShyZXN1bHQud2lkdGgoKSAqIHN0eWxlLT5lZmZlY3RpdmVa
b29tKCksIHJlc3VsdC5oZWlnaHQoKSAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCkpOworICAgIH0K
KyAgICByZXR1cm4gc2l6ZXNbY29udHJvbFNpemVGb3JTeXN0ZW1Gb250KHN0eWxlKV07Cit9CisK
K3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6c2V0U2l6ZUZyb21Gb250KFJlbmRlclN0eWxl
KiBzdHlsZSwgY29uc3QgSW50U2l6ZSogc2l6ZXMpIGNvbnN0Cit7CisgICAgLy8gRklYTUU6IENo
ZWNrIGlzIGZsYXdlZCwgc2luY2UgaXQgZG9lc24ndCB0YWtlIG1pbi13aWR0aC9tYXgtd2lkdGgg
aW50byBhY2NvdW50LgorICAgIEludFNpemUgc2l6ZSA9IHNpemVGb3JGb250KHN0eWxlLCBzaXpl
cyk7CisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkgJiYgc2l6ZS53
aWR0aCgpID4gMCkKKyAgICAgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCks
IEZpeGVkKSk7CisgICAgaWYgKHN0eWxlLT5oZWlnaHQoKS5pc0F1dG8oKSAmJiBzaXplLmhlaWdo
dCgpID4gMCkKKyAgICAgICAgc3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwg
Rml4ZWQpKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpzZXRGb250RnJvbUNv
bnRyb2xTaXplKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUs
IE5TQ29udHJvbFNpemUgY29udHJvbFNpemUpIGNvbnN0Cit7CisgICAgRm9udERlc2NyaXB0aW9u
IGZvbnREZXNjcmlwdGlvbjsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0SXNBYnNvbHV0ZVNpemUo
dHJ1ZSk7CisgICAgZm9udERlc2NyaXB0aW9uLnNldEdlbmVyaWNGYW1pbHkoRm9udERlc2NyaXB0
aW9uOjpTZXJpZkZhbWlseSk7CisKKyAgICBOU0ZvbnQqIGZvbnQgPSBbTlNGb250IHN5c3RlbUZv
bnRPZlNpemU6W05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXplOmNvbnRyb2xTaXpl
XV07CisgICAgZm9udERlc2NyaXB0aW9uLmZpcnN0RmFtaWx5KCkuc2V0RmFtaWx5KFtmb250IGZh
bWlseU5hbWVdKTsKKyAgICBmb250RGVzY3JpcHRpb24uc2V0Q29tcHV0ZWRTaXplKFtmb250IHBv
aW50U2l6ZV0gKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpKTsKKyAgICBmb250RGVzY3JpcHRpb24u
c2V0U3BlY2lmaWVkU2l6ZShbZm9udCBwb2ludFNpemVdICogc3R5bGUtPmVmZmVjdGl2ZVpvb20o
KSk7CisKKyAgICAvLyBSZXNldCBsaW5lIGhlaWdodAorICAgIHN0eWxlLT5zZXRMaW5lSGVpZ2h0
KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgpKTsKKworICAgIGlmIChzdHlsZS0+c2V0
Rm9udERlc2NyaXB0aW9uKGZvbnREZXNjcmlwdGlvbikpCisgICAgICAgIHN0eWxlLT5mb250KCku
dXBkYXRlKDApOworfQorCitOU0NvbnRyb2xTaXplIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OmNv
bnRyb2xTaXplRm9yU3lzdGVtRm9udChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAg
aW50IGZvbnRTaXplID0gc3R5bGUtPmZvbnRTaXplKCk7CisgICAgaWYgKGZvbnRTaXplID49IFtO
U0ZvbnQgc3lzdGVtRm9udFNpemVGb3JDb250cm9sU2l6ZTpOU1JlZ3VsYXJDb250cm9sU2l6ZV0p
CisgICAgICAgIHJldHVybiBOU1JlZ3VsYXJDb250cm9sU2l6ZTsKKyAgICBpZiAoZm9udFNpemUg
Pj0gW05TRm9udCBzeXN0ZW1Gb250U2l6ZUZvckNvbnRyb2xTaXplOk5TU21hbGxDb250cm9sU2l6
ZV0pCisgICAgICAgIHJldHVybiBOU1NtYWxsQ29udHJvbFNpemU7CisgICAgcmV0dXJuIE5TTWlu
aUNvbnRyb2xTaXplOworfQorCisvLyBGSVhNRTogVGhpcyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0
cmVhbSB2ZXJzaW9uIHVudGlsIGl0IHdhcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkg
aW4gcjM3NzMxLgorYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpwYWludENoZWNrYm94KFJl
bmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywg
Y29uc3QgSW50UmVjdCYgcikKK3sKKyAgICAvLyBEZXRlcm1pbmUgdGhlIHdpZHRoIGFuZCBoZWln
aHQgbmVlZGVkIGZvciB0aGUgY29udHJvbCBhbmQgcHJlcGFyZSB0aGUgY2VsbCBmb3IgcGFpbnRp
bmcuCisgICAgc2V0Q2hlY2tib3hDZWxsU3RhdGUobywgcik7CisKKyAgICBwYWludEluZm8uY29u
dGV4dC0+c2F2ZSgpOworCisgICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0
aXZlWm9vbSgpOworCisgICAgLy8gV2UgaW5mbGF0ZSB0aGUgcmVjdCBhcyBuZWVkZWQgdG8gYWNj
b3VudCBmb3IgcGFkZGluZyBpbmNsdWRlZCBpbiB0aGUgY2VsbCB0byBhY2NvbW1vZGF0ZSB0aGUg
Y2hlY2tib3gKKyAgICAvLyBzaGFkb3ciIGFuZCB0aGUgY2hlY2suICBXZSBkb24ndCBjb25zaWRl
ciB0aGlzIHBhcnQgb2YgdGhlIGJvdW5kcyBvZiB0aGUgY29udHJvbCBpbiBXZWJLaXQuCisgICAg
TlNCdXR0b25DZWxsKiBjaGVja2JveCA9IHRoaXMtPmNoZWNrYm94KCk7CisgICAgSW50U2l6ZSBz
aXplID0gY2hlY2tib3hTaXplcygpW1tjaGVja2JveCBjb250cm9sU2l6ZV1dOworICAgIHNpemUu
c2V0V2lkdGgoc2l6ZS53aWR0aCgpICogem9vbUxldmVsKTsKKyAgICBzaXplLnNldEhlaWdodChz
aXplLmhlaWdodCgpICogem9vbUxldmVsKTsKKyAgICBJbnRSZWN0IGluZmxhdGVkUmVjdCA9IGlu
ZmxhdGVSZWN0KHIsIHNpemUsIGNoZWNrYm94TWFyZ2lucygpLCB6b29tTGV2ZWwpOworICAgIAor
ICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikgeworICAgICAgICBpbmZsYXRlZFJlY3Quc2V0V2lk
dGgoaW5mbGF0ZWRSZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOworICAgICAgICBpbmZsYXRlZFJl
Y3Quc2V0SGVpZ2h0KGluZmxhdGVkUmVjdC5oZWlnaHQoKSAvIHpvb21MZXZlbCk7CisgICAgICAg
IHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoaW5mbGF0ZWRSZWN0LngoKSwgaW5mbGF0ZWRS
ZWN0LnkoKSk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9v
bUxldmVsLCB6b29tTGV2ZWwpKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0
ZSgtaW5mbGF0ZWRSZWN0LngoKSwgLWluZmxhdGVkUmVjdC55KCkpOworICAgIH0KKyAgICAKKyAg
ICBbY2hlY2tib3ggZHJhd1dpdGhGcmFtZTpOU1JlY3QoSW50UmVjdFRvTlNSZWN0KGluZmxhdGVk
UmVjdCkpIGluVmlldzpuaWxdOworICAgIFtjaGVja2JveCBzZXRDb250cm9sVmlldzpuaWxdOwor
CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIHJldHVybiBmYWxzZTsK
K30KKworLy8gRklYTUU6IFRoaXMgdXNlZCB0byBiZSBpbiB0aGUgdXBzdHJlYW0gdmVyc2lvbiB1
bnRpbCBpdCB3YXMgY29udmVydGVkIHRvIHRoZSBuZXcgdGhlbWUgQVBJIGluIHIzNzczMS4KK2Nv
bnN0IEludFNpemUqIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OmNoZWNrYm94U2l6ZXMoKSBjb25z
dAoreworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDE0LCAx
NCksIEludFNpemUoMTIsIDEyKSwgSW50U2l6ZSgxMCwgMTApIH07CisgICAgcmV0dXJuIHNpemVz
OworfQorCisvLyBGSVhNRTogVGhpcyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJzaW9u
IHVudGlsIGl0IHdhcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMxLgor
Y29uc3QgaW50KiBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpjaGVja2JveE1hcmdpbnMoKSBjb25z
dAoreworICAgIHN0YXRpYyBjb25zdCBpbnQgbWFyZ2luc1szXVs0XSA9CisgICAgeworICAgICAg
ICB7IDMsIDQsIDQsIDIgfSwKKyAgICAgICAgeyA0LCAzLCAzLCAzIH0sCisgICAgICAgIHsgNCwg
MywgMywgMyB9LAorICAgIH07CisgICAgcmV0dXJuIG1hcmdpbnNbW2NoZWNrYm94KCkgY29udHJv
bFNpemVdXTsKK30KKworLy8gRklYTUU6IFRoaXMgdXNlZCB0byBiZSBpbiB0aGUgdXBzdHJlYW0g
dmVyc2lvbiB1bnRpbCBpdCB3YXMgY29udmVydGVkIHRvIHRoZSBuZXcgdGhlbWUgQVBJIGluIHIz
NzczMS4KK3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6c2V0Q2hlY2tib3hDZWxsU3RhdGUo
Y29uc3QgUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5TQnV0dG9u
Q2VsbCogY2hlY2tib3ggPSB0aGlzLT5jaGVja2JveCgpOworCisgICAgLy8gU2V0IHRoZSBjb250
cm9sIHNpemUgYmFzZWQgb2ZmIHRoZSByZWN0YW5nbGUgd2UncmUgcGFpbnRpbmcgaW50by4KKyAg
ICBzZXRDb250cm9sU2l6ZShjaGVja2JveCwgY2hlY2tib3hTaXplcygpLCByLnNpemUoKSwgby0+
c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsKKworICAgIC8vIFVwZGF0ZSB0aGUgdmFyaW91cyBz
dGF0ZXMgd2UgcmVzcG9uZCB0by4KKyAgICB1cGRhdGVDaGVja2VkU3RhdGUoY2hlY2tib3gsIG8p
OworICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZShjaGVja2JveCwgbyk7CisgICAgdXBkYXRlUHJlc3Nl
ZFN0YXRlKGNoZWNrYm94LCBvKTsKKyAgICB1cGRhdGVGb2N1c2VkU3RhdGUoY2hlY2tib3gsIG8p
OworfQorCisvLyBGSVhNRTogVGhpcyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJzaW9u
IHVudGlsIGl0IHdhcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMxLgor
dm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUq
IHN0eWxlKSBjb25zdAoreworICAgIC8vIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3Ro
IHNwZWNpZmllZCwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCisgICAgaWYgKCFzdHlsZS0+
d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFVzZSB0aGUgZm9udCBzaXplIHRvIGRldGVybWlu
ZSB0aGUgaW50cmluc2ljIHdpZHRoIG9mIHRoZSBjb250cm9sLgorICAgIHNldFNpemVGcm9tRm9u
dChzdHlsZSwgY2hlY2tib3hTaXplcygpKTsKK30KKworLy8gRklYTUU6IFRoaXMgdXNlZCB0byBi
ZSBpbiB0aGUgdXBzdHJlYW0gdmVyc2lvbiB1bnRpbCBpdCB3YXMgY29udmVydGVkIHRvIHRoZSBu
ZXcgdGhlbWUgQVBJIGluIHIzNzczMS4KK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cGFp
bnRSYWRpbyhSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBw
YWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgLy8gRGV0ZXJtaW5lIHRoZSB3aWR0
aCBhbmQgaGVpZ2h0IG5lZWRlZCBmb3IgdGhlIGNvbnRyb2wgYW5kIHByZXBhcmUgdGhlIGNlbGwg
Zm9yIHBhaW50aW5nLgorICAgIHNldFJhZGlvQ2VsbFN0YXRlKG8sIHIpOworCisgICAgcGFpbnRJ
bmZvLmNvbnRleHQtPnNhdmUoKTsKKworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxlKCkt
PmVmZmVjdGl2ZVpvb20oKTsKKworICAgIC8vIFdlIGluZmxhdGUgdGhlIHJlY3QgYXMgbmVlZGVk
IHRvIGFjY291bnQgZm9yIHBhZGRpbmcgaW5jbHVkZWQgaW4gdGhlIGNlbGwgdG8gYWNjb21tb2Rh
dGUgdGhlIGNoZWNrYm94CisgICAgLy8gc2hhZG93IiBhbmQgdGhlIGNoZWNrLiAgV2UgZG9uJ3Qg
Y29uc2lkZXIgdGhpcyBwYXJ0IG9mIHRoZSBib3VuZHMgb2YgdGhlIGNvbnRyb2wgaW4gV2ViS2l0
LgorICAgIE5TQnV0dG9uQ2VsbCogcmFkaW8gPSB0aGlzLT5yYWRpbygpOworICAgIEludFNpemUg
c2l6ZSA9IHJhZGlvU2l6ZXMoKVtbcmFkaW8gY29udHJvbFNpemVdXTsKKyAgICBzaXplLnNldFdp
ZHRoKHNpemUud2lkdGgoKSAqIHpvb21MZXZlbCk7CisgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5o
ZWlnaHQoKSAqIHpvb21MZXZlbCk7CisgICAgSW50UmVjdCBpbmZsYXRlZFJlY3QgPSBpbmZsYXRl
UmVjdChyLCBzaXplLCByYWRpb01hcmdpbnMoKSwgem9vbUxldmVsKTsKKyAgICAKKyAgICBpZiAo
em9vbUxldmVsICE9IDEuMGYpIHsKKyAgICAgICAgaW5mbGF0ZWRSZWN0LnNldFdpZHRoKGluZmxh
dGVkUmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgaW5mbGF0ZWRSZWN0LnNldEhl
aWdodChpbmZsYXRlZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOworICAgICAgICBwYWludElu
Zm8uY29udGV4dC0+dHJhbnNsYXRlKGluZmxhdGVkUmVjdC54KCksIGluZmxhdGVkUmVjdC55KCkp
OworICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHpvb21MZXZlbCwg
em9vbUxldmVsKSk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xhdGUoLWluZmxh
dGVkUmVjdC54KCksIC1pbmZsYXRlZFJlY3QueSgpKTsKKyAgICB9CisKKyAgICBbcmFkaW8gZHJh
d1dpdGhGcmFtZTpOU1JlY3QoSW50UmVjdFRvTlNSZWN0KGluZmxhdGVkUmVjdCkpIGluVmlldzpu
aWxdOworICAgIFtyYWRpbyBzZXRDb250cm9sVmlldzpuaWxdOworCisgICAgcGFpbnRJbmZvLmNv
bnRleHQtPnJlc3RvcmUoKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gRklYTUU6IFRo
aXMgdXNlZCB0byBiZSBpbiB0aGUgdXBzdHJlYW0gdmVyc2lvbiB1bnRpbCBpdCB3YXMgY29udmVy
dGVkIHRvIHRoZSBuZXcgdGhlbWUgQVBJIGluIHIzNzczMS4KK2NvbnN0IEludFNpemUqIFJlbmRl
clRoZW1lQ2hyb21pdW1NYWM6OnJhZGlvU2l6ZXMoKSBjb25zdAoreworICAgIHN0YXRpYyBjb25z
dCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDE0LCAxNSksIEludFNpemUoMTIsIDEzKSwg
SW50U2l6ZSgxMCwgMTApIH07CisgICAgcmV0dXJuIHNpemVzOworfQorCisvLyBGSVhNRTogVGhp
cyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJzaW9uIHVudGlsIGl0IHdhcyBjb252ZXJ0
ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMxLgorY29uc3QgaW50KiBSZW5kZXJUaGVt
ZUNocm9taXVtTWFjOjpyYWRpb01hcmdpbnMoKSBjb25zdAoreworICAgIHN0YXRpYyBjb25zdCBp
bnQgbWFyZ2luc1szXVs0XSA9CisgICAgeworICAgICAgICB7IDIsIDIsIDQsIDIgfSwKKyAgICAg
ICAgeyAzLCAyLCAzLCAyIH0sCisgICAgICAgIHsgMSwgMCwgMiwgMCB9LAorICAgIH07CisgICAg
cmV0dXJuIG1hcmdpbnNbW3JhZGlvKCkgY29udHJvbFNpemVdXTsKK30KKworLy8gRklYTUU6IFRo
aXMgdXNlZCB0byBiZSBpbiB0aGUgdXBzdHJlYW0gdmVyc2lvbiB1bnRpbCBpdCB3YXMgY29udmVy
dGVkIHRvIHRoZSBuZXcgdGhlbWUgQVBJIGluIHIzNzczMS4KK3ZvaWQgUmVuZGVyVGhlbWVDaHJv
bWl1bU1hYzo6c2V0UmFkaW9DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBJ
bnRSZWN0JiByKQoreworICAgIE5TQnV0dG9uQ2VsbCogcmFkaW8gPSB0aGlzLT5yYWRpbygpOwor
CisgICAgLy8gU2V0IHRoZSBjb250cm9sIHNpemUgYmFzZWQgb2ZmIHRoZSByZWN0YW5nbGUgd2Un
cmUgcGFpbnRpbmcgaW50by4KKyAgICBzZXRDb250cm9sU2l6ZShyYWRpbywgcmFkaW9TaXplcygp
LCByLnNpemUoKSwgby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpKTsKKworICAgIC8vIFVwZGF0
ZSB0aGUgdmFyaW91cyBzdGF0ZXMgd2UgcmVzcG9uZCB0by4KKyAgICB1cGRhdGVDaGVja2VkU3Rh
dGUocmFkaW8sIG8pOworICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZShyYWRpbywgbyk7CisgICAgdXBk
YXRlUHJlc3NlZFN0YXRlKHJhZGlvLCBvKTsKKyAgICB1cGRhdGVGb2N1c2VkU3RhdGUocmFkaW8s
IG8pOworfQorCisvLyBGSVhNRTogVGhpcyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJz
aW9uIHVudGlsIGl0IHdhcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMx
Lgordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpzZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUq
IHN0eWxlKSBjb25zdAoreworICAgIC8vIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3Ro
IHNwZWNpZmllZCwgdGhlbiB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCisgICAgaWYgKCFzdHlsZS0+
d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkp
CisgICAgICAgIHJldHVybjsKKworICAgIC8vIFVzZSB0aGUgZm9udCBzaXplIHRvIGRldGVybWlu
ZSB0aGUgaW50cmluc2ljIHdpZHRoIG9mIHRoZSBjb250cm9sLgorICAgIHNldFNpemVGcm9tRm9u
dChzdHlsZSwgcmFkaW9TaXplcygpKTsKK30KKworLy8gRklYTUU6IFRoaXMgdXNlZCB0byBiZSBp
biB0aGUgdXBzdHJlYW0gdmVyc2lvbiB1bnRpbCBpdCB3YXMgY29udmVydGVkIHRvIHRoZSBuZXcg
dGhlbWUgQVBJIGluIHIzNzczMS4KK3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6c2V0QnV0
dG9uUGFkZGluZ0Zyb21Db250cm9sU2l6ZShSZW5kZXJTdHlsZSogc3R5bGUsIE5TQ29udHJvbFNp
emUgc2l6ZSkgY29uc3QKK3sKKyAgICAvLyBKdXN0IHVzZSA4cHguICBBcHBLaXQgd2FudHMgdG8g
dXNlIDExcHggZm9yIG1pbmkgYnV0dG9ucywgYnV0IHRoYXQgcGFkZGluZyBpcyBqdXN0IHRvbyBs
YXJnZQorICAgIC8vIGZvciByZWFsLXdvcmxkIFdlYiBzaXRlcyAoY3JlYXRpbmcgYSBodWdlIG5l
Y2Vzc2FyeSBtaW5pbXVtIHdpZHRoIGZvciBidXR0b25zIHdob3NlIHNwYWNlIGlzCisgICAgLy8g
YnkgZGVmaW5pdGlvbiBjb25zdHJhaW5lZCwgc2luY2Ugd2Ugc2VsZWN0IG1pbmkgb25seSBmb3Ig
c21hbGwgY3JhbXBlZCBlbnZpcm9ubWVudHMuCisgICAgLy8gVGhpcyBhbHNvIGd1YXJhbnRlZXMg
dGhlIEhUTUw0IDxidXR0b24+IHdpbGwgbWF0Y2ggb3VyIHJlbmRlcmluZyBieSBkZWZhdWx0LCBz
aW5jZSB3ZSdyZSB1c2luZyBhIGNvbnNpc3RlbnQKKyAgICAvLyBwYWRkaW5nLgorICAgIGNvbnN0
IGludCBwYWRkaW5nID0gOCAqIHN0eWxlLT5lZmZlY3RpdmVab29tKCk7CisgICAgc3R5bGUtPnNl
dFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRQYWRk
aW5nUmlnaHQoTGVuZ3RoKHBhZGRpbmcsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdU
b3AoTGVuZ3RoKDAsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0b20oTGVuZ3Ro
KDAsIEZpeGVkKSk7Cit9CisKKy8vIEZJWE1FOiBUaGlzIHVzZWQgdG8gYmUgaW4gdGhlIHVwc3Ry
ZWFtIHZlcnNpb24gdW50aWwgaXQgd2FzIGNvbnZlcnRlZCB0byB0aGUgbmV3IHRoZW1lIEFQSSBp
biByMzc3MzEuCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OmFkanVzdEJ1dHRvblN0eWxl
KENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQq
IGUpIGNvbnN0Cit7CisgICAgLy8gVGhlcmUgYXJlIHRocmVlIGFwcGVhcmFuY2UgY29uc3RhbnRz
IGZvciBidXR0b25zLgorICAgIC8vICgxKSBQdXNoLWJ1dHRvbiBpcyB0aGUgY29uc3RhbnQgZm9y
IHRoZSBkZWZhdWx0IEFxdWEgc3lzdGVtIGJ1dHRvbi4gIFB1c2ggYnV0dG9ucyB3aWxsIG5vdCBz
Y2FsZSB2ZXJ0aWNhbGx5IGFuZCB3aWxsIG5vdCBhbGxvdworICAgIC8vIGN1c3RvbSBmb250cyBv
ciBjb2xvcnMuICA8aW5wdXQ+cyB1c2UgdGhpcyBjb25zdGFudC4gIFRoaXMgYnV0dG9uIHdpbGwg
YWxsb3cgY3VzdG9tIGNvbG9ycyBhbmQgZm9udCB3ZWlnaHRzL3ZhcmlhbnRzIGJ1dCB3b24ndAor
ICAgIC8vIHNjYWxlIHZlcnRpY2FsbHkuCisgICAgLy8gKDIpIHNxdWFyZS1idXR0b24gaXMgdGhl
IGNvbnN0YW50IGZvciB0aGUgc3F1YXJlIGJ1dHRvbi4gIFRoaXMgYnV0dG9uIHdpbGwgYWxsb3cg
Y3VzdG9tIGZvbnRzIGFuZCBjb2xvcnMgYW5kIHdpbGwgc2NhbGUgdmVydGljYWxseS4KKyAgICAv
LyAoMykgQnV0dG9uIGlzIHRoZSBjb25zdGFudCB0aGF0IG1lYW5zICJwaWNrIHRoZSBiZXN0IGJ1
dHRvbiBhcyBhcHByb3ByaWF0ZS4iICA8YnV0dG9uPnMgdXNlIHRoaXMgY29uc3RhbnQuICBUaGlz
IGJ1dHRvbiB3aWxsCisgICAgLy8gYWxzbyBzY2FsZSB2ZXJ0aWNhbGx5IGFuZCBhbGxvdyBjdXN0
b20gZm9udHMgYW5kIGNvbG9ycy4gIEl0IHdpbGwgYXR0ZW1wdCB0byB1c2UgQXF1YSBpZiBwb3Nz
aWJsZSBhbmQgd2lsbCBtYWtlIHRoaXMgZGV0ZXJtaW5hdGlvbgorICAgIC8vIHNvbGVseSBvbiB0
aGUgcmVjdGFuZ2xlIG9mIHRoZSBjb250cm9sLgorCisgICAgLy8gRGV0ZXJtaW5lIG91ciBjb250
cm9sIHNpemUgYmFzZWQgb2ZmIG91ciBmb250LgorICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNp
emUgPSBjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpOworCisgICAgaWYgKHN0eWxlLT5hcHBlYXJh
bmNlKCkgPT0gUHVzaEJ1dHRvblBhcnQpIHsKKyAgICAgICAgLy8gRGl0Y2ggdGhlIGJvcmRlci4K
KyAgICAgICAgc3R5bGUtPnJlc2V0Qm9yZGVyKCk7CisKKyAgICAgICAgLy8gSGVpZ2h0IGlzIGxv
Y2tlZCB0byBhdXRvLgorICAgICAgICBzdHlsZS0+c2V0SGVpZ2h0KExlbmd0aChBdXRvKSk7CisK
KyAgICAgICAgLy8gV2hpdGUtc3BhY2UgaXMgbG9ja2VkIHRvIHByZQorICAgICAgICBzdHlsZS0+
c2V0V2hpdGVTcGFjZShQUkUpOworCisgICAgICAgIC8vIFNldCB0aGUgYnV0dG9uJ3MgdmVydGlj
YWwgc2l6ZS4KKyAgICAgICAgc2V0QnV0dG9uU2l6ZShzdHlsZSk7CisKKyAgICAgICAgLy8gQWRk
IGluIHRoZSBwYWRkaW5nIHRoYXQgd2UnZCBsaWtlIHRvIHVzZS4KKyAgICAgICAgc2V0QnV0dG9u
UGFkZGluZ0Zyb21Db250cm9sU2l6ZShzdHlsZSwgY29udHJvbFNpemUpOworCisgICAgICAgIC8v
IE91ciBmb250IGlzIGxvY2tlZCB0byB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIGZvbnQgc2l6ZSBm
b3IgdGhlIGNvbnRyb2wuICBUbyBjbGFyaWZ5LCB3ZSBmaXJzdCB1c2UgdGhlIENTUy1zcGVjaWZp
ZWQgZm9udCB0byBmaWd1cmUgb3V0CisgICAgICAgIC8vIGEgcmVhc29uYWJsZSBjb250cm9sIHNp
emUsIGJ1dCBvbmNlIHRoYXQgY29udHJvbCBzaXplIGlzIGRldGVybWluZWQsIHdlIHRocm93IHRo
YXQgZm9udCBhd2F5IGFuZCB1c2UgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgIC8vIHN5c3RlbSBm
b250IGZvciB0aGUgY29udHJvbCBzaXplIGluc3RlYWQuCisgICAgICAgIHNldEZvbnRGcm9tQ29u
dHJvbFNpemUoc2VsZWN0b3IsIHN0eWxlLCBjb250cm9sU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgLy8gU2V0IGEgbWluLWhlaWdodCBzbyB0aGF0IHdlIGNhbid0IGdldCBzbWFsbGVyIHRo
YW4gdGhlIG1pbmkgYnV0dG9uLgorICAgICAgICBzdHlsZS0+c2V0TWluSGVpZ2h0KExlbmd0aChz
dGF0aWNfY2FzdDxpbnQ+KDE1ICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKSksIEZpeGVkKSk7CisK
KyAgICAgICAgLy8gUmVzZXQgdGhlIHRvcCBhbmQgYm90dG9tIGJvcmRlcnMuCisgICAgICAgIHN0
eWxlLT5yZXNldEJvcmRlclRvcCgpOworICAgICAgICBzdHlsZS0+cmVzZXRCb3JkZXJCb3R0b20o
KTsKKyAgICB9CisKKyAgICBzdHlsZS0+c2V0Qm94U2hhZG93KDApOworfQorCisvLyBGSVhNRTog
VGhpcyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJzaW9uIHVudGlsIGl0IHdhcyBjb252
ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMxLgorY29uc3QgSW50U2l6ZSogUmVu
ZGVyVGhlbWVDaHJvbWl1bU1hYzo6YnV0dG9uU2l6ZXMoKSBjb25zdAoreworICAgIHN0YXRpYyBj
b25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDAsIDIxKSwgSW50U2l6ZSgwLCAxOCks
IEludFNpemUoMCwgMTUpIH07CisgICAgcmV0dXJuIHNpemVzOworfQorCisvLyBGSVhNRTogVGhp
cyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJzaW9uIHVudGlsIGl0IHdhcyBjb252ZXJ0
ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMxLgorY29uc3QgaW50KiBSZW5kZXJUaGVt
ZUNocm9taXVtTWFjOjpidXR0b25NYXJnaW5zKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3Qg
aW50IG1hcmdpbnNbM11bNF0gPQorICAgIHsKKyAgICAgICAgeyA0LCA2LCA3LCA2IH0sCisgICAg
ICAgIHsgNCwgNSwgNiwgNSB9LAorICAgICAgICB7IDAsIDEsIDEsIDEgfSwKKyAgICB9OworICAg
IHJldHVybiBtYXJnaW5zW1tidXR0b24oKSBjb250cm9sU2l6ZV1dOworfQorCisvLyBGSVhNRTog
VGhpcyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJzaW9uIHVudGlsIGl0IHdhcyBjb252
ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMxLgordm9pZCBSZW5kZXJUaGVtZUNo
cm9taXVtTWFjOjpzZXRCdXR0b25TaXplKFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAg
ICAvLyBJZiB0aGUgd2lkdGggYW5kIGhlaWdodCBhcmUgYm90aCBzcGVjaWZpZWQsIHRoZW4gd2Ug
aGF2ZSBub3RoaW5nIHRvIGRvLgorICAgIGlmICghc3R5bGUtPndpZHRoKCkuaXNJbnRyaW5zaWNP
ckF1dG8oKSAmJiAhc3R5bGUtPmhlaWdodCgpLmlzQXV0bygpKQorICAgICAgICByZXR1cm47CisK
KyAgICAvLyBVc2UgdGhlIGZvbnQgc2l6ZSB0byBkZXRlcm1pbmUgdGhlIGludHJpbnNpYyB3aWR0
aCBvZiB0aGUgY29udHJvbC4KKyAgICBzZXRTaXplRnJvbUZvbnQoc3R5bGUsIGJ1dHRvblNpemVz
KCkpOworfQorCisvLyBGSVhNRTogVGhpcyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJz
aW9uIHVudGlsIGl0IHdhcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMx
Lgordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpzZXRCdXR0b25DZWxsU3RhdGUoY29uc3Qg
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIE5TQnV0dG9uQ2VsbCog
YnV0dG9uID0gdGhpcy0+YnV0dG9uKCk7CisKKyAgICAvLyBTZXQgdGhlIGNvbnRyb2wgc2l6ZSBi
YXNlZCBvZmYgdGhlIHJlY3RhbmdsZSB3ZSdyZSBwYWludGluZyBpbnRvLgorICAgIGlmIChvLT5z
dHlsZSgpLT5hcHBlYXJhbmNlKCkgPT0gU3F1YXJlQnV0dG9uUGFydCB8fAorICAgICAgICByLmhl
aWdodCgpID4gYnV0dG9uU2l6ZXMoKVtOU1JlZ3VsYXJDb250cm9sU2l6ZV0uaGVpZ2h0KCkgKiBv
LT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkpIHsKKyAgICAgICAgLy8gVXNlIHRoZSBzcXVhcmUg
YnV0dG9uCisgICAgICAgIGlmIChbYnV0dG9uIGJlemVsU3R5bGVdICE9IE5TU2hhZG93bGVzc1Nx
dWFyZUJlemVsU3R5bGUpCisgICAgICAgICAgICBbYnV0dG9uIHNldEJlemVsU3R5bGU6TlNTaGFk
b3dsZXNzU3F1YXJlQmV6ZWxTdHlsZV07CisgICAgfSBlbHNlIGlmIChbYnV0dG9uIGJlemVsU3R5
bGVdICE9IE5TUm91bmRlZEJlemVsU3R5bGUpCisgICAgICAgIFtidXR0b24gc2V0QmV6ZWxTdHls
ZTpOU1JvdW5kZWRCZXplbFN0eWxlXTsKKworICAgIHNldENvbnRyb2xTaXplKGJ1dHRvbiwgYnV0
dG9uU2l6ZXMoKSwgci5zaXplKCksIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSk7CisKKyAg
ICBOU1dpbmRvdyAqd2luZG93ID0gW25pbCB3aW5kb3ddOworICAgIEJPT0wgaXNEZWZhdWx0QnV0
dG9uID0gKGlzRGVmYXVsdChvKSAmJiBbd2luZG93IGlzS2V5V2luZG93XSk7CisgICAgW2J1dHRv
biBzZXRLZXlFcXVpdmFsZW50Oihpc0RlZmF1bHRCdXR0b24gPyBAIlxyIiA6IEAiIildOworCisg
ICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNwb25kIHRvLgorICAgIHVwZGF0
ZUNoZWNrZWRTdGF0ZShidXR0b24sIG8pOworICAgIHVwZGF0ZUVuYWJsZWRTdGF0ZShidXR0b24s
IG8pOworICAgIHVwZGF0ZVByZXNzZWRTdGF0ZShidXR0b24sIG8pOworICAgIHVwZGF0ZUZvY3Vz
ZWRTdGF0ZShidXR0b24sIG8pOworfQorCisvLyBGSVhNRTogVGhpcyB1c2VkIHRvIGJlIGluIHRo
ZSB1cHN0cmVhbSB2ZXJzaW9uIHVudGlsIGl0IHdhcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVt
ZSBBUEkgaW4gcjM3NzMxLgorYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpwYWludEJ1dHRv
bihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludElu
Zm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgTlNCdXR0b25DZWxsKiBidXR0b24gPSB0aGlz
LT5idXR0b24oKTsKKyAgICBMb2NhbEN1cnJlbnRHcmFwaGljc0NvbnRleHQgbG9jYWxDb250ZXh0
KHBhaW50SW5mby5jb250ZXh0KTsKKworICAgIC8vIERldGVybWluZSB0aGUgd2lkdGggYW5kIGhl
aWdodCBuZWVkZWQgZm9yIHRoZSBjb250cm9sIGFuZCBwcmVwYXJlIHRoZSBjZWxsIGZvciBwYWlu
dGluZy4KKyAgICBzZXRCdXR0b25DZWxsU3RhdGUobywgcik7CisKKyAgICBwYWludEluZm8uY29u
dGV4dC0+c2F2ZSgpOworCisgICAgLy8gV2UgaW5mbGF0ZSB0aGUgcmVjdCBhcyBuZWVkZWQgdG8g
YWNjb3VudCBmb3IgcGFkZGluZyBpbmNsdWRlZCBpbiB0aGUgY2VsbCB0byBhY2NvbW1vZGF0ZSB0
aGUgYnV0dG9uCisgICAgLy8gc2hhZG93LiAgV2UgZG9uJ3QgY29uc2lkZXIgdGhpcyBwYXJ0IG9m
IHRoZSBib3VuZHMgb2YgdGhlIGNvbnRyb2wgaW4gV2ViS2l0LgorICAgIGZsb2F0IHpvb21MZXZl
bCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBJbnRTaXplIHNpemUgPSBidXR0
b25TaXplcygpW1tidXR0b24gY29udHJvbFNpemVdXTsKKyAgICBzaXplLnNldFdpZHRoKHIud2lk
dGgoKSk7CisgICAgc2l6ZS5zZXRIZWlnaHQoc2l6ZS5oZWlnaHQoKSAqIHpvb21MZXZlbCk7Cisg
ICAgSW50UmVjdCBpbmZsYXRlZFJlY3QgPSByOworICAgIGlmIChbYnV0dG9uIGJlemVsU3R5bGVd
ID09IE5TUm91bmRlZEJlemVsU3R5bGUpIHsKKyAgICAgICAgLy8gQ2VudGVyIHRoZSBidXR0b24g
d2l0aGluIHRoZSBhdmFpbGFibGUgc3BhY2UuCisgICAgICAgIGlmIChpbmZsYXRlZFJlY3QuaGVp
Z2h0KCkgPiBzaXplLmhlaWdodCgpKSB7CisgICAgICAgICAgICBpbmZsYXRlZFJlY3Quc2V0WShp
bmZsYXRlZFJlY3QueSgpICsgKGluZmxhdGVkUmVjdC5oZWlnaHQoKSAtIHNpemUuaGVpZ2h0KCkp
IC8gMik7CisgICAgICAgICAgICBpbmZsYXRlZFJlY3Quc2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkp
OworICAgICAgICB9CisKKyAgICAgICAgLy8gTm93IGluZmxhdGUgaXQgdG8gYWNjb3VudCBmb3Ig
dGhlIHNoYWRvdy4KKyAgICAgICAgaW5mbGF0ZWRSZWN0ID0gaW5mbGF0ZVJlY3QoaW5mbGF0ZWRS
ZWN0LCBzaXplLCBidXR0b25NYXJnaW5zKCksIHpvb21MZXZlbCk7CisKKyAgICAgICAgaWYgKHpv
b21MZXZlbCAhPSAxLjBmKSB7CisgICAgICAgICAgICBpbmZsYXRlZFJlY3Quc2V0V2lkdGgoaW5m
bGF0ZWRSZWN0LndpZHRoKCkgLyB6b29tTGV2ZWwpOworICAgICAgICAgICAgaW5mbGF0ZWRSZWN0
LnNldEhlaWdodChpbmZsYXRlZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOworICAgICAgICAg
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZShpbmZsYXRlZFJlY3QueCgpLCBpbmZsYXRl
ZFJlY3QueSgpKTsKKyAgICAgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT5zY2FsZShGbG9hdFNp
emUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKKyAgICAgICAgICAgIHBhaW50SW5mby5jb250ZXh0
LT50cmFuc2xhdGUoLWluZmxhdGVkUmVjdC54KCksIC1pbmZsYXRlZFJlY3QueSgpKTsKKyAgICAg
ICAgfQorICAgIH0gCisKKyAgICBOU1ZpZXcgKnZpZXcgPSBuaWw7CisgICAgTlNXaW5kb3cgKndp
bmRvdyA9IFt2aWV3IHdpbmRvd107CisgICAgTlNCdXR0b25DZWxsICpwcmV2aW91c0RlZmF1bHRC
dXR0b25DZWxsID0gW3dpbmRvdyBkZWZhdWx0QnV0dG9uQ2VsbF07CisKKyAgICBpZiAoaXNEZWZh
dWx0KG8pICYmIFt3aW5kb3cgaXNLZXlXaW5kb3ddKSB7CisgICAgICAgIFt3aW5kb3cgc2V0RGVm
YXVsdEJ1dHRvbkNlbGw6YnV0dG9uXTsKKyAgICAgICAgd2tBZHZhbmNlRGVmYXVsdEJ1dHRvblB1
bHNlQW5pbWF0aW9uKGJ1dHRvbik7CisgICAgfSBlbHNlIGlmIChbcHJldmlvdXNEZWZhdWx0QnV0
dG9uQ2VsbCBpc0VxdWFsOmJ1dHRvbl0pCisgICAgICAgIFt3aW5kb3cgc2V0RGVmYXVsdEJ1dHRv
bkNlbGw6bmlsXTsKKworICAgIFtidXR0b24gZHJhd1dpdGhGcmFtZTpOU1JlY3QoSW50UmVjdFRv
TlNSZWN0KGluZmxhdGVkUmVjdCkpIGluVmlldzp2aWV3XTsKKyAgICBbYnV0dG9uIHNldENvbnRy
b2xWaWV3Om5pbF07CisKKyAgICBpZiAoIVtwcmV2aW91c0RlZmF1bHRCdXR0b25DZWxsIGlzRXF1
YWw6YnV0dG9uXSkKKyAgICAgICAgW3dpbmRvdyBzZXREZWZhdWx0QnV0dG9uQ2VsbDpwcmV2aW91
c0RlZmF1bHRCdXR0b25DZWxsXTsKKworICAgIHBhaW50SW5mby5jb250ZXh0LT5yZXN0b3JlKCk7
CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6
cGFpbnRUZXh0RmllbGQoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50
SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIExvY2FsQ3VycmVudEdy
YXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworICAgIHdrRHJh
d0JlemVsZWRUZXh0RmllbGRDZWxsKEludFJlY3RUb05TUmVjdChyKSwgaXNFbmFibGVkKG8pICYm
ICFpc1JlYWRPbmx5Q29udHJvbChvKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJl
bmRlclRoZW1lQ2hyb21pdW1NYWM6OmFkanVzdFRleHRGaWVsZFN0eWxlKENTU1N0eWxlU2VsZWN0
b3IqLCBSZW5kZXJTdHlsZSosIEVsZW1lbnQqKSBjb25zdAoreworfQorCitib29sIFJlbmRlclRo
ZW1lQ2hyb21pdW1NYWM6OnBhaW50Q2Fwc0xvY2tJbmRpY2F0b3IoUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
KQoreworICAgIGlmIChwYWludEluZm8uY29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2Nh
bENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworICAgIHdrRHJhd0NhcHNMb2NrSW5kaWNhdG9y
KHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgcik7CisgICAgCisgICAgcmV0
dXJuIGZhbHNlOworfQorCitib29sIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBhaW50VGV4dEFy
ZWEoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJ
bmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4
dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworICAgIHdrRHJhd0JlemVsZWRUZXh0
QXJlYShJbnRSZWN0VG9OU1JlY3QociksIGlzRW5hYmxlZChvKSAmJiAhaXNSZWFkT25seUNvbnRy
b2wobykpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVt
TWFjOjphZGp1c3RUZXh0QXJlYVN0eWxlKENTU1N0eWxlU2VsZWN0b3IqLCBSZW5kZXJTdHlsZSos
IEVsZW1lbnQqKSBjb25zdAoreworfQorCitjb25zdCBpbnQqIFJlbmRlclRoZW1lQ2hyb21pdW1N
YWM6OnBvcHVwQnV0dG9uTWFyZ2lucygpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0IGludCBt
YXJnaW5zWzNdWzRdID0KKyAgICB7CisgICAgICAgIHsgMCwgMywgMSwgMyB9LAorICAgICAgICB7
IDAsIDMsIDIsIDMgfSwKKyAgICAgICAgeyAwLCAxLCAwLCAxIH0KKyAgICB9OworICAgIHJldHVy
biBtYXJnaW5zW1twb3B1cEJ1dHRvbigpIGNvbnRyb2xTaXplXV07Cit9CisKK2NvbnN0IEludFNp
emUqIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBvcHVwQnV0dG9uU2l6ZXMoKSBjb25zdAorewor
ICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXplKDAsIDIxKSwgSW50
U2l6ZSgwLCAxOCksIEludFNpemUoMCwgMTUpIH07CisgICAgcmV0dXJuIHNpemVzOworfQorCitj
b25zdCBpbnQqIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBvcHVwQnV0dG9uUGFkZGluZyhOU0Nv
bnRyb2xTaXplIHNpemUpIGNvbnN0Cit7CisgICAgc3RhdGljIGNvbnN0IGludCBwYWRkaW5nWzNd
WzRdID0KKyAgICB7CisgICAgICAgIHsgMiwgMjYsIDMsIDggfSwKKyAgICAgICAgeyAyLCAyMywg
MywgOCB9LAorICAgICAgICB7IDIsIDIyLCAzLCAxMCB9CisgICAgfTsKKyAgICByZXR1cm4gcGFk
ZGluZ1tzaXplXTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpwYWludE1lbnVM
aXN0KFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIHBhaW50
SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBzZXRQb3B1cEJ1dHRvbkNlbGxTdGF0ZShv
LCByKTsKKworICAgIE5TUG9wVXBCdXR0b25DZWxsKiBwb3B1cEJ1dHRvbiA9IHRoaXMtPnBvcHVw
QnV0dG9uKCk7CisKKyAgICBmbG9hdCB6b29tTGV2ZWwgPSBvLT5zdHlsZSgpLT5lZmZlY3RpdmVa
b29tKCk7CisgICAgSW50U2l6ZSBzaXplID0gcG9wdXBCdXR0b25TaXplcygpW1twb3B1cEJ1dHRv
biBjb250cm9sU2l6ZV1dOworICAgIHNpemUuc2V0SGVpZ2h0KHNpemUuaGVpZ2h0KCkgKiB6b29t
TGV2ZWwpOworICAgIHNpemUuc2V0V2lkdGgoci53aWR0aCgpKTsKKworICAgIC8vIE5vdyBpbmZs
YXRlIGl0IHRvIGFjY291bnQgZm9yIHRoZSBzaGFkb3cuCisgICAgSW50UmVjdCBpbmZsYXRlZFJl
Y3QgPSByOworICAgIGlmIChyLndpZHRoKCkgPj0gbWluaW11bU1lbnVMaXN0U2l6ZShvLT5zdHls
ZSgpKSkKKyAgICAgICAgaW5mbGF0ZWRSZWN0ID0gaW5mbGF0ZVJlY3QoaW5mbGF0ZWRSZWN0LCBz
aXplLCBwb3B1cEJ1dHRvbk1hcmdpbnMoKSwgem9vbUxldmVsKTsKKworICAgIHBhaW50SW5mby5j
b250ZXh0LT5zYXZlKCk7CisgICAgCisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgLy8g
T24gTGVvcGFyZCwgdGhlIGNlbGwgd2lsbCBkcmF3IG91dHNpZGUgb2YgdGhlIGdpdmVuIHJlY3Qs
IHNvIHdlIGhhdmUgdG8gY2xpcCB0byB0aGUgcmVjdAorICAgIHBhaW50SW5mby5jb250ZXh0LT5j
bGlwKGluZmxhdGVkUmVjdCk7CisjZW5kaWYKKworICAgIGlmICh6b29tTGV2ZWwgIT0gMS4wZikg
eworICAgICAgICBpbmZsYXRlZFJlY3Quc2V0V2lkdGgoaW5mbGF0ZWRSZWN0LndpZHRoKCkgLyB6
b29tTGV2ZWwpOworICAgICAgICBpbmZsYXRlZFJlY3Quc2V0SGVpZ2h0KGluZmxhdGVkUmVjdC5o
ZWlnaHQoKSAvIHpvb21MZXZlbCk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFuc2xh
dGUoaW5mbGF0ZWRSZWN0LngoKSwgaW5mbGF0ZWRSZWN0LnkoKSk7CisgICAgICAgIHBhaW50SW5m
by5jb250ZXh0LT5zY2FsZShGbG9hdFNpemUoem9vbUxldmVsLCB6b29tTGV2ZWwpKTsKKyAgICAg
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnRyYW5zbGF0ZSgtaW5mbGF0ZWRSZWN0LngoKSwgLWluZmxh
dGVkUmVjdC55KCkpOworICAgIH0KKworICAgIFtwb3B1cEJ1dHRvbiBkcmF3V2l0aEZyYW1lOklu
dFJlY3RUb05TUmVjdChpbmZsYXRlZFJlY3QpIGluVmlldzpuaWxdOworICAgIFtwb3B1cEJ1dHRv
biBzZXRDb250cm9sVmlldzpuaWxdOworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUo
KTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGNvbnN0IGZsb2F0IGJhc2VGb250
U2l6ZSA9IDExLjBmOworc3RhdGljIGNvbnN0IGZsb2F0IGJhc2VBcnJvd0hlaWdodCA9IDQuMGY7
CitzdGF0aWMgY29uc3QgZmxvYXQgYmFzZUFycm93V2lkdGggPSA1LjBmOworc3RhdGljIGNvbnN0
IGZsb2F0IGJhc2VTcGFjZUJldHdlZW5BcnJvd3MgPSAyLjBmOworc3RhdGljIGNvbnN0IGludCBh
cnJvd1BhZGRpbmdMZWZ0ID0gNjsKK3N0YXRpYyBjb25zdCBpbnQgYXJyb3dQYWRkaW5nUmlnaHQg
PSA2Oworc3RhdGljIGNvbnN0IGludCBwYWRkaW5nQmVmb3JlU2VwYXJhdG9yID0gNDsKK3N0YXRp
YyBjb25zdCBpbnQgYmFzZUJvcmRlclJhZGl1cyA9IDU7CitzdGF0aWMgY29uc3QgaW50IHN0eWxl
ZFBvcHVwUGFkZGluZ0xlZnQgPSA4Oworc3RhdGljIGNvbnN0IGludCBzdHlsZWRQb3B1cFBhZGRp
bmdUb3AgPSAxOworc3RhdGljIGNvbnN0IGludCBzdHlsZWRQb3B1cFBhZGRpbmdCb3R0b20gPSAy
OworCitzdGF0aWMgdm9pZCBUb3BHcmFkaWVudEludGVycG9sYXRlKHZvaWQqIGluZm8sIGNvbnN0
IENHRmxvYXQqIGluRGF0YSwgQ0dGbG9hdCogb3V0RGF0YSkKK3sKKyAgICBzdGF0aWMgZmxvYXQg
ZGFya1s0XSA9IHsgMS4wZiwgMS4wZiwgMS4wZiwgMC40ZiB9OworICAgIHN0YXRpYyBmbG9hdCBs
aWdodFs0XSA9IHsgMS4wZiwgMS4wZiwgMS4wZiwgMC4xNWYgfTsKKyAgICBmbG9hdCBhID0gaW5E
YXRhWzBdOworICAgIGludCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQorICAg
ICAgICBvdXREYXRhW2ldID0gKDEuMGYgLSBhKSAqIGRhcmtbaV0gKyBhICogbGlnaHRbaV07Cit9
CisKK3N0YXRpYyB2b2lkIEJvdHRvbUdyYWRpZW50SW50ZXJwb2xhdGUodm9pZCogaW5mbywgY29u
c3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zsb2F0KiBvdXREYXRhKQoreworICAgIHN0YXRpYyBmbG9h
dCBkYXJrWzRdID0geyAxLjBmLCAxLjBmLCAxLjBmLCAwLjBmIH07CisgICAgc3RhdGljIGZsb2F0
IGxpZ2h0WzRdID0geyAxLjBmLCAxLjBmLCAxLjBmLCAwLjNmIH07CisgICAgZmxvYXQgYSA9IGlu
RGF0YVswXTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAg
ICAgICAgb3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJrW2ldICsgYSAqIGxpZ2h0W2ldOwor
fQorCitzdGF0aWMgdm9pZCBNYWluR3JhZGllbnRJbnRlcnBvbGF0ZSh2b2lkKiBpbmZvLCBjb25z
dCBDR0Zsb2F0KiBpbkRhdGEsIENHRmxvYXQqIG91dERhdGEpCit7CisgICAgc3RhdGljIGZsb2F0
IGRhcmtbNF0gPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuMTVmIH07CisgICAgc3RhdGljIGZsb2F0
IGxpZ2h0WzRdID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmIH07CisgICAgZmxvYXQgYSA9IGlu
RGF0YVswXTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAg
ICAgICAgb3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJrW2ldICsgYSAqIGxpZ2h0W2ldOwor
fQorCitzdGF0aWMgdm9pZCBUcmFja0dyYWRpZW50SW50ZXJwb2xhdGUodm9pZCogaW5mbywgY29u
c3QgQ0dGbG9hdCogaW5EYXRhLCBDR0Zsb2F0KiBvdXREYXRhKQoreworICAgIHN0YXRpYyBmbG9h
dCBkYXJrWzRdID0geyAwLjBmLCAwLjBmLCAwLjBmLCAwLjY3OGYgfTsKKyAgICBzdGF0aWMgZmxv
YXQgbGlnaHRbNF0gPSB7IDAuMGYsIDAuMGYsIDAuMGYsIDAuMTNmIH07CisgICAgZmxvYXQgYSA9
IGluRGF0YVswXTsKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykK
KyAgICAgICAgb3V0RGF0YVtpXSA9ICgxLjBmIC0gYSkgKiBkYXJrW2ldICsgYSAqIGxpZ2h0W2ld
OworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBhaW50TWVudUxpc3RCdXR0b25H
cmFkaWVudHMoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIENHQ29udGV4dFJlZiBjb250ZXh0
ID0gcGFpbnRJbmZvLmNvbnRleHQtPnBsYXRmb3JtQ29udGV4dCgpOworCisgICAgcGFpbnRJbmZv
LmNvbnRleHQtPnNhdmUoKTsKKworICAgIGludCByYWRpdXMgPSBvLT5zdHlsZSgpLT5ib3JkZXJU
b3BMZWZ0UmFkaXVzKCkud2lkdGgoKTsKKworICAgIFJldGFpblB0cjxDR0NvbG9yU3BhY2VSZWY+
IGNzcGFjZShBZG9wdENGLCBDR0NvbG9yU3BhY2VDcmVhdGVEZXZpY2VSR0IoKSk7CisKKyAgICBG
bG9hdFJlY3QgdG9wR3JhZGllbnQoci54KCksIHIueSgpLCByLndpZHRoKCksIHIuaGVpZ2h0KCkg
LyAyLjBmKTsKKyAgICBzdHJ1Y3QgQ0dGdW5jdGlvbkNhbGxiYWNrcyB0b3BDYWxsYmFja3MgPSB7
IDAsIFRvcEdyYWRpZW50SW50ZXJwb2xhdGUsIE5VTEwgfTsKKyAgICBSZXRhaW5QdHI8Q0dGdW5j
dGlvblJlZj4gdG9wRnVuY3Rpb24oQWRvcHRDRiwgQ0dGdW5jdGlvbkNyZWF0ZShOVUxMLCAxLCBO
VUxMLCA0LCBOVUxMLCAmdG9wQ2FsbGJhY2tzKSk7CisgICAgUmV0YWluUHRyPENHU2hhZGluZ1Jl
Zj4gdG9wU2hhZGluZyhBZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UuZ2V0KCks
IENHUG9pbnRNYWtlKHRvcEdyYWRpZW50LngoKSwgdG9wR3JhZGllbnQueSgpKSwgQ0dQb2ludE1h
a2UodG9wR3JhZGllbnQueCgpLCB0b3BHcmFkaWVudC5ib3R0b20oKSksIHRvcEZ1bmN0aW9uLmdl
dCgpLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIEZsb2F0UmVjdCBib3R0b21HcmFkaWVudChyLngo
KSArIHJhZGl1cywgci55KCkgKyByLmhlaWdodCgpIC8gMi4wZiwgci53aWR0aCgpIC0gMi4wZiAq
IHJhZGl1cywgci5oZWlnaHQoKSAvIDIuMGYpOworICAgIHN0cnVjdCBDR0Z1bmN0aW9uQ2FsbGJh
Y2tzIGJvdHRvbUNhbGxiYWNrcyA9IHsgMCwgQm90dG9tR3JhZGllbnRJbnRlcnBvbGF0ZSwgTlVM
TCB9OworICAgIFJldGFpblB0cjxDR0Z1bmN0aW9uUmVmPiBib3R0b21GdW5jdGlvbihBZG9wdENG
LCBDR0Z1bmN0aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQsIE5VTEwsICZib3R0b21DYWxsYmFj
a3MpKTsKKyAgICBSZXRhaW5QdHI8Q0dTaGFkaW5nUmVmPiBib3R0b21TaGFkaW5nKEFkb3B0Q0Ys
IENHU2hhZGluZ0NyZWF0ZUF4aWFsKGNzcGFjZS5nZXQoKSwgQ0dQb2ludE1ha2UoYm90dG9tR3Jh
ZGllbnQueCgpLCAgYm90dG9tR3JhZGllbnQueSgpKSwgQ0dQb2ludE1ha2UoYm90dG9tR3JhZGll
bnQueCgpLCBib3R0b21HcmFkaWVudC5ib3R0b20oKSksIGJvdHRvbUZ1bmN0aW9uLmdldCgpLCBm
YWxzZSwgZmFsc2UpKTsKKworICAgIHN0cnVjdCBDR0Z1bmN0aW9uQ2FsbGJhY2tzIG1haW5DYWxs
YmFja3MgPSB7IDAsIE1haW5HcmFkaWVudEludGVycG9sYXRlLCBOVUxMIH07CisgICAgUmV0YWlu
UHRyPENHRnVuY3Rpb25SZWY+IG1haW5GdW5jdGlvbihBZG9wdENGLCBDR0Z1bmN0aW9uQ3JlYXRl
KE5VTEwsIDEsIE5VTEwsIDQsIE5VTEwsICZtYWluQ2FsbGJhY2tzKSk7CisgICAgUmV0YWluUHRy
PENHU2hhZGluZ1JlZj4gbWFpblNoYWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5nQ3JlYXRlQXhpYWwo
Y3NwYWNlLmdldCgpLCBDR1BvaW50TWFrZShyLngoKSwgIHIueSgpKSwgQ0dQb2ludE1ha2Uoci54
KCksIHIuYm90dG9tKCkpLCBtYWluRnVuY3Rpb24uZ2V0KCksIGZhbHNlLCBmYWxzZSkpOworCisg
ICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gbGVmdFNoYWRpbmcoQWRvcHRDRiwgQ0dTaGFkaW5n
Q3JlYXRlQXhpYWwoY3NwYWNlLmdldCgpLCBDR1BvaW50TWFrZShyLngoKSwgIHIueSgpKSwgQ0dQ
b2ludE1ha2Uoci54KCkgKyByYWRpdXMsIHIueSgpKSwgbWFpbkZ1bmN0aW9uLmdldCgpLCBmYWxz
ZSwgZmFsc2UpKTsKKworICAgIFJldGFpblB0cjxDR1NoYWRpbmdSZWY+IHJpZ2h0U2hhZGluZyhB
ZG9wdENGLCBDR1NoYWRpbmdDcmVhdGVBeGlhbChjc3BhY2UuZ2V0KCksIENHUG9pbnRNYWtlKHIu
cmlnaHQoKSwgIHIueSgpKSwgQ0dQb2ludE1ha2Uoci5yaWdodCgpIC0gcmFkaXVzLCByLnkoKSks
IG1haW5GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNlKSk7CisgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnNhdmUoKTsKKyAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIHIpOworICAgIHBh
aW50SW5mby5jb250ZXh0LT5hZGRSb3VuZGVkUmVjdENsaXAociwKKyAgICAgICAgby0+c3R5bGUo
KS0+Ym9yZGVyVG9wTGVmdFJhZGl1cygpLCBvLT5zdHlsZSgpLT5ib3JkZXJUb3BSaWdodFJhZGl1
cygpLAorICAgICAgICBvLT5zdHlsZSgpLT5ib3JkZXJCb3R0b21MZWZ0UmFkaXVzKCksIG8tPnN0
eWxlKCktPmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKCkpOworICAgIENHQ29udGV4dERyYXdTaGFk
aW5nKGNvbnRleHQsIG1haW5TaGFkaW5nLmdldCgpKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+
cmVzdG9yZSgpOworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBDR0NvbnRl
eHRDbGlwVG9SZWN0KGNvbnRleHQsIHRvcEdyYWRpZW50KTsKKyAgICBwYWludEluZm8uY29udGV4
dC0+YWRkUm91bmRlZFJlY3RDbGlwKGVuY2xvc2luZ0ludFJlY3QodG9wR3JhZGllbnQpLAorICAg
ICAgICBvLT5zdHlsZSgpLT5ib3JkZXJUb3BMZWZ0UmFkaXVzKCksIG8tPnN0eWxlKCktPmJvcmRl
clRvcFJpZ2h0UmFkaXVzKCksCisgICAgICAgIEludFNpemUoKSwgSW50U2l6ZSgpKTsKKyAgICBD
R0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCB0b3BTaGFkaW5nLmdldCgpKTsKKyAgICBwYWlu
dEluZm8uY29udGV4dC0+cmVzdG9yZSgpOworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUo
KTsKKyAgICBDR0NvbnRleHRDbGlwVG9SZWN0KGNvbnRleHQsIGJvdHRvbUdyYWRpZW50KTsKKyAg
ICBwYWludEluZm8uY29udGV4dC0+YWRkUm91bmRlZFJlY3RDbGlwKGVuY2xvc2luZ0ludFJlY3Qo
Ym90dG9tR3JhZGllbnQpLAorICAgICAgICBJbnRTaXplKCksIEludFNpemUoKSwKKyAgICAgICAg
by0+c3R5bGUoKS0+Ym9yZGVyQm90dG9tTGVmdFJhZGl1cygpLCBvLT5zdHlsZSgpLT5ib3JkZXJC
b3R0b21SaWdodFJhZGl1cygpKTsKKyAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBi
b3R0b21TaGFkaW5nLmdldCgpKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9yZSgpOwor
CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKyAgICBDR0NvbnRleHRDbGlwVG9SZWN0
KGNvbnRleHQsIHIpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5hZGRSb3VuZGVkUmVjdENsaXAo
ciwKKyAgICAgICAgby0+c3R5bGUoKS0+Ym9yZGVyVG9wTGVmdFJhZGl1cygpLCBvLT5zdHlsZSgp
LT5ib3JkZXJUb3BSaWdodFJhZGl1cygpLAorICAgICAgICBvLT5zdHlsZSgpLT5ib3JkZXJCb3R0
b21MZWZ0UmFkaXVzKCksIG8tPnN0eWxlKCktPmJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzKCkpOwor
ICAgIENHQ29udGV4dERyYXdTaGFkaW5nKGNvbnRleHQsIGxlZnRTaGFkaW5nLmdldCgpKTsKKyAg
ICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCByaWdodFNoYWRpbmcuZ2V0KCkpOworICAg
IHBhaW50SW5mby5jb250ZXh0LT5yZXN0b3JlKCk7CisKKyAgICBwYWludEluZm8uY29udGV4dC0+
cmVzdG9yZSgpOworfQorCitib29sIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBhaW50TWVudUxp
c3RCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYg
cGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworICAgIHBhaW50SW5mby5jb250ZXh0LT5z
YXZlKCk7CisKKyAgICBJbnRSZWN0IGJvdW5kcyA9IEludFJlY3Qoci54KCkgKyBvLT5zdHlsZSgp
LT5ib3JkZXJMZWZ0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci55KCkg
KyBvLT5zdHlsZSgpLT5ib3JkZXJUb3BXaWR0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICByLndpZHRoKCkgLSBvLT5zdHlsZSgpLT5ib3JkZXJMZWZ0V2lkdGgoKSAtIG8tPnN0eWxl
KCktPmJvcmRlclJpZ2h0V2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5o
ZWlnaHQoKSAtIG8tPnN0eWxlKCktPmJvcmRlclRvcFdpZHRoKCkgLSBvLT5zdHlsZSgpLT5ib3Jk
ZXJCb3R0b21XaWR0aCgpKTsKKyAgICAvLyBEcmF3IHRoZSBncmFkaWVudHMgdG8gZ2l2ZSB0aGUg
c3R5bGVkIHBvcHVwIG1lbnUgYSBidXR0b24gYXBwZWFyYW5jZQorICAgIHBhaW50TWVudUxpc3RC
dXR0b25HcmFkaWVudHMobywgcGFpbnRJbmZvLCBib3VuZHMpOworCisgICAgLy8gU2luY2Ugd2Ug
YWN0dWFsbHkga25vdyB0aGUgc2l6ZSBvZiB0aGUgY29udHJvbCBoZXJlLCB3ZSByZXN0cmljdCB0
aGUgZm9udCBzY2FsZSB0byBtYWtlIHN1cmUgdGhlIGFycm93cyB3aWxsIGZpdCB2ZXJ0aWNhbGx5
IGluIHRoZSBib3VuZHMKKyAgICBmbG9hdCBmb250U2NhbGUgPSBtaW4oby0+c3R5bGUoKS0+Zm9u
dFNpemUoKSAvIGJhc2VGb250U2l6ZSwgYm91bmRzLmhlaWdodCgpIC8gKGJhc2VBcnJvd0hlaWdo
dCAqIDIgKyBiYXNlU3BhY2VCZXR3ZWVuQXJyb3dzKSk7CisgICAgZmxvYXQgY2VudGVyWSA9IGJv
dW5kcy55KCkgKyBib3VuZHMuaGVpZ2h0KCkgLyAyLjBmOworICAgIGZsb2F0IGFycm93SGVpZ2h0
ID0gYmFzZUFycm93SGVpZ2h0ICogZm9udFNjYWxlOworICAgIGZsb2F0IGFycm93V2lkdGggPSBi
YXNlQXJyb3dXaWR0aCAqIGZvbnRTY2FsZTsKKyAgICBmbG9hdCBsZWZ0RWRnZSA9IGJvdW5kcy5y
aWdodCgpIC0gYXJyb3dQYWRkaW5nUmlnaHQgKiBvLT5zdHlsZSgpLT5lZmZlY3RpdmVab29tKCkg
LSBhcnJvd1dpZHRoOworICAgIGZsb2F0IHNwYWNlQmV0d2VlbkFycm93cyA9IGJhc2VTcGFjZUJl
dHdlZW5BcnJvd3MgKiBmb250U2NhbGU7CisKKyAgICBpZiAoYm91bmRzLndpZHRoKCkgPCBhcnJv
d1dpZHRoICsgYXJyb3dQYWRkaW5nTGVmdCAqIG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIHBhaW50SW5mby5jb250ZXh0LT5zZXRG
aWxsQ29sb3Ioby0+c3R5bGUoKS0+Y29sb3IoKSk7CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNl
dFN0cm9rZVN0eWxlKE5vU3Ryb2tlKTsKKworICAgIEZsb2F0UG9pbnQgYXJyb3cxWzNdOworICAg
IGFycm93MVswXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UsIGNlbnRlclkgLSBzcGFjZUJldHdlZW5B
cnJvd3MgLyAyLjBmKTsKKyAgICBhcnJvdzFbMV0gPSBGbG9hdFBvaW50KGxlZnRFZGdlICsgYXJy
b3dXaWR0aCwgY2VudGVyWSAtIHNwYWNlQmV0d2VlbkFycm93cyAvIDIuMGYpOworICAgIGFycm93
MVsyXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBhcnJvd1dpZHRoIC8gMi4wZiwgY2VudGVyWSAt
IHNwYWNlQmV0d2VlbkFycm93cyAvIDIuMGYgLSBhcnJvd0hlaWdodCk7CisKKyAgICAvLyBEcmF3
IHRoZSB0b3AgYXJyb3cKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0NvbnZleFBvbHlnb24o
MywgYXJyb3cxLCB0cnVlKTsKKworICAgIEZsb2F0UG9pbnQgYXJyb3cyWzNdOworICAgIGFycm93
MlswXSA9IEZsb2F0UG9pbnQobGVmdEVkZ2UsIGNlbnRlclkgKyBzcGFjZUJldHdlZW5BcnJvd3Mg
LyAyLjBmKTsKKyAgICBhcnJvdzJbMV0gPSBGbG9hdFBvaW50KGxlZnRFZGdlICsgYXJyb3dXaWR0
aCwgY2VudGVyWSArIHNwYWNlQmV0d2VlbkFycm93cyAvIDIuMGYpOworICAgIGFycm93MlsyXSA9
IEZsb2F0UG9pbnQobGVmdEVkZ2UgKyBhcnJvd1dpZHRoIC8gMi4wZiwgY2VudGVyWSArIHNwYWNl
QmV0d2VlbkFycm93cyAvIDIuMGYgKyBhcnJvd0hlaWdodCk7CisKKyAgICAvLyBEcmF3IHRoZSBi
b3R0b20gYXJyb3cKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0NvbnZleFBvbHlnb24oMywg
YXJyb3cyLCB0cnVlKTsKKworICAgIENvbG9yIGxlZnRTZXBhcmF0b3JDb2xvcigwLCAwLCAwLCA0
MCk7CisgICAgQ29sb3IgcmlnaHRTZXBhcmF0b3JDb2xvcigyNTUsIDI1NSwgMjU1LCA0MCk7CisK
KyAgICAvLyBGSVhNRTogU2hvdWxkIHRoZSBzZXBhcmF0b3IgdGhpY2tuZXNzIGFuZCBzcGFjZSBi
ZSBzY2FsZWQgdXAgYnkgZm9udFNjYWxlPworICAgIGludCBzZXBhcmF0b3JTcGFjZSA9IDI7IC8v
IERlbGliZXJhdGVseSBpZ25vcmVzIHpvb20gc2luY2UgaXQgbG9va3MgbmljZXIgaWYgaXQgc3Rh
eXMgdGhpbi4KKyAgICBpbnQgbGVmdEVkZ2VPZlNlcGFyYXRvciA9IHN0YXRpY19jYXN0PGludD4o
bGVmdEVkZ2UgLSBhcnJvd1BhZGRpbmdMZWZ0ICogby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgp
KTsgLy8gRklYTUU6IFJvdW5kPworCisgICAgLy8gRHJhdyB0aGUgc2VwYXJhdG9yIHRvIHRoZSBs
ZWZ0IG9mIHRoZSBhcnJvd3MKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlVGhpY2tu
ZXNzKDEuMGYpOyAvLyBEZWxpYmVyYXRlbHkgaWdub3JlcyB6b29tIHNpbmNlIGl0IGxvb2tzIG5p
Y2VyIGlmIGl0IHN0YXlzIHRoaW4uCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZVN0
eWxlKFNvbGlkU3Ryb2tlKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+c2V0U3Ryb2tlQ29sb3Io
bGVmdFNlcGFyYXRvckNvbG9yKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+ZHJhd0xpbmUoSW50
UG9pbnQobGVmdEVkZ2VPZlNlcGFyYXRvciwgYm91bmRzLnkoKSksCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIEludFBvaW50KGxlZnRFZGdlT2ZTZXBhcmF0b3IsIGJvdW5kcy5ib3R0
b20oKSkpOworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNldFN0cm9rZUNvbG9yKHJpZ2h0U2Vw
YXJhdG9yQ29sb3IpOworICAgIHBhaW50SW5mby5jb250ZXh0LT5kcmF3TGluZShJbnRQb2ludChs
ZWZ0RWRnZU9mU2VwYXJhdG9yICsgc2VwYXJhdG9yU3BhY2UsIGJvdW5kcy55KCkpLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRQb2ludChsZWZ0RWRnZU9mU2VwYXJhdG9yICsg
c2VwYXJhdG9yU3BhY2UsIGJvdW5kcy5ib3R0b20oKSkpOworCisgICAgcGFpbnRJbmZvLmNvbnRl
eHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBjb25zdCBJbnRT
aXplKiBtZW51TGlzdEJ1dHRvblNpemVzKCkKK3sKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBz
aXplc1szXSA9IHsgSW50U2l6ZSgwLCAyMSksIEludFNpemUoMCwgMTgpLCBJbnRTaXplKDAsIDE1
KSB9OworICAgIHJldHVybiBzaXplczsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFj
OjphZGp1c3RNZW51TGlzdFN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJT
dHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgTlNDb250cm9sU2l6ZSBjb250
cm9sU2l6ZSA9IGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSk7CisKKyAgICBzdHlsZS0+cmVzZXRC
b3JkZXIoKTsKKyAgICBzdHlsZS0+cmVzZXRQYWRkaW5nKCk7CisgICAgCisgICAgLy8gSGVpZ2h0
IGlzIGxvY2tlZCB0byBhdXRvLgorICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKEF1dG8pKTsK
KworICAgIC8vIFdoaXRlLXNwYWNlIGlzIGxvY2tlZCB0byBwcmUKKyAgICBzdHlsZS0+c2V0V2hp
dGVTcGFjZShQUkUpOworCisgICAgLy8gU2V0IHRoZSBmb3JlZ3JvdW5kIGNvbG9yIHRvIGJsYWNr
IG9yIGdyYXkgd2hlbiB3ZSBoYXZlIHRoZSBhcXVhIGxvb2suCisgICAgLy8gQ2FzdCB0byBSR0Iz
MiBpcyB0byB3b3JrIGFyb3VuZCBhIGNvbXBpbGVyIGJ1Zy4KKyAgICBzdHlsZS0+c2V0Q29sb3Io
ZS0+aXNFbmFibGVkKCkgPyBzdGF0aWNfY2FzdDxSR0JBMzI+KENvbG9yOjpibGFjaykgOiBDb2xv
cjo6ZGFya0dyYXkpOworCisgICAgLy8gU2V0IHRoZSBidXR0b24ncyB2ZXJ0aWNhbCBzaXplLgor
ICAgIHNldFNpemVGcm9tRm9udChzdHlsZSwgbWVudUxpc3RCdXR0b25TaXplcygpKTsKKworICAg
IC8vIE91ciBmb250IGlzIGxvY2tlZCB0byB0aGUgYXBwcm9wcmlhdGUgc3lzdGVtIGZvbnQgc2l6
ZSBmb3IgdGhlIGNvbnRyb2wuICBUbyBjbGFyaWZ5LCB3ZSBmaXJzdCB1c2UgdGhlIENTUy1zcGVj
aWZpZWQgZm9udCB0byBmaWd1cmUgb3V0CisgICAgLy8gYSByZWFzb25hYmxlIGNvbnRyb2wgc2l6
ZSwgYnV0IG9uY2UgdGhhdCBjb250cm9sIHNpemUgaXMgZGV0ZXJtaW5lZCwgd2UgdGhyb3cgdGhh
dCBmb250IGF3YXkgYW5kIHVzZSB0aGUgYXBwcm9wcmlhdGUKKyAgICAvLyBzeXN0ZW0gZm9udCBm
b3IgdGhlIGNvbnRyb2wgc2l6ZSBpbnN0ZWFkLgorICAgIHNldEZvbnRGcm9tQ29udHJvbFNpemUo
c2VsZWN0b3IsIHN0eWxlLCBjb250cm9sU2l6ZSk7CisKKyAgICBzdHlsZS0+c2V0Qm94U2hhZG93
KDApOworfQorCitpbnQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cG9wdXBJbnRlcm5hbFBhZGRp
bmdMZWZ0KFJlbmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICBpZiAoc3R5bGUtPmFwcGVh
cmFuY2UoKSA9PSBNZW51bGlzdFBhcnQpCisgICAgICAgIHJldHVybiBwb3B1cEJ1dHRvblBhZGRp
bmcoY29udHJvbFNpemVGb3JGb250KHN0eWxlKSlbTGVmdFBhZGRpbmddICogc3R5bGUtPmVmZmVj
dGl2ZVpvb20oKTsKKyAgICBpZiAoc3R5bGUtPmFwcGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRv
blBhcnQpCisgICAgICAgIHJldHVybiBzdHlsZWRQb3B1cFBhZGRpbmdMZWZ0ICogc3R5bGUtPmVm
ZmVjdGl2ZVpvb20oKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IFJlbmRlclRoZW1lQ2hyb21p
dW1NYWM6OnBvcHVwSW50ZXJuYWxQYWRkaW5nUmlnaHQoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25z
dAoreworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5jZSgpID09IE1lbnVsaXN0UGFydCkKKyAgICAg
ICAgcmV0dXJuIHBvcHVwQnV0dG9uUGFkZGluZyhjb250cm9sU2l6ZUZvckZvbnQoc3R5bGUpKVtS
aWdodFBhZGRpbmddICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBpZiAoc3R5bGUtPmFw
cGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRvblBhcnQpIHsKKyAgICAgICAgZmxvYXQgZm9udFNj
YWxlID0gc3R5bGUtPmZvbnRTaXplKCkgLyBiYXNlRm9udFNpemU7CisgICAgICAgIGZsb2F0IGFy
cm93V2lkdGggPSBiYXNlQXJyb3dXaWR0aCAqIGZvbnRTY2FsZTsKKyAgICAgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGludD4oY2VpbGYoYXJyb3dXaWR0aCArIChhcnJvd1BhZGRpbmdMZWZ0ICsgYXJy
b3dQYWRkaW5nUmlnaHQgKyBwYWRkaW5nQmVmb3JlU2VwYXJhdG9yKSAqIHN0eWxlLT5lZmZlY3Rp
dmVab29tKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBSZW5kZXJUaGVtZUNo
cm9taXVtTWFjOjpwb3B1cEludGVybmFsUGFkZGluZ1RvcChSZW5kZXJTdHlsZSogc3R5bGUpIGNv
bnN0Cit7CisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RQYXJ0KQorICAg
ICAgICByZXR1cm4gcG9wdXBCdXR0b25QYWRkaW5nKGNvbnRyb2xTaXplRm9yRm9udChzdHlsZSkp
W1RvcFBhZGRpbmddICogc3R5bGUtPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBpZiAoc3R5bGUtPmFw
cGVhcmFuY2UoKSA9PSBNZW51bGlzdEJ1dHRvblBhcnQpCisgICAgICAgIHJldHVybiBzdHlsZWRQ
b3B1cFBhZGRpbmdUb3AgKiBzdHlsZS0+ZWZmZWN0aXZlWm9vbSgpOworICAgIHJldHVybiAwOwor
fQorCitpbnQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cG9wdXBJbnRlcm5hbFBhZGRpbmdCb3R0
b20oUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIGlmIChzdHlsZS0+YXBwZWFyYW5j
ZSgpID09IE1lbnVsaXN0UGFydCkKKyAgICAgICAgcmV0dXJuIHBvcHVwQnV0dG9uUGFkZGluZyhj
b250cm9sU2l6ZUZvckZvbnQoc3R5bGUpKVtCb3R0b21QYWRkaW5nXSAqIHN0eWxlLT5lZmZlY3Rp
dmVab29tKCk7CisgICAgaWYgKHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gTWVudWxpc3RCdXR0b25Q
YXJ0KQorICAgICAgICByZXR1cm4gc3R5bGVkUG9wdXBQYWRkaW5nQm90dG9tICogc3R5bGUtPmVm
ZmVjdGl2ZVpvb20oKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9t
aXVtTWFjOjphZGp1c3RNZW51TGlzdEJ1dHRvblN0eWxlKENTU1N0eWxlU2VsZWN0b3IqIHNlbGVj
dG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0Cit7CisgICAgZmxvYXQg
Zm9udFNjYWxlID0gc3R5bGUtPmZvbnRTaXplKCkgLyBiYXNlRm9udFNpemU7CisKKyAgICBzdHls
ZS0+cmVzZXRQYWRkaW5nKCk7CisgICAgc3R5bGUtPnNldEJvcmRlclJhZGl1cyhJbnRTaXplKGlu
dChiYXNlQm9yZGVyUmFkaXVzICsgZm9udFNjYWxlIC0gMSksIGludChiYXNlQm9yZGVyUmFkaXVz
ICsgZm9udFNjYWxlIC0gMSkpKTsgLy8gRklYTUU6IFJvdW5kIHVwPworCisgICAgY29uc3QgaW50
IG1pbkhlaWdodCA9IDE1OworICAgIHN0eWxlLT5zZXRNaW5IZWlnaHQoTGVuZ3RoKG1pbkhlaWdo
dCwgRml4ZWQpKTsKKyAgICAKKyAgICBzdHlsZS0+c2V0TGluZUhlaWdodChSZW5kZXJTdHlsZTo6
aW5pdGlhbExpbmVIZWlnaHQoKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6
c2V0UG9wdXBCdXR0b25DZWxsU3RhdGUoY29uc3QgUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBJbnRS
ZWN0JiByKQoreworICAgIE5TUG9wVXBCdXR0b25DZWxsKiBwb3B1cEJ1dHRvbiA9IHRoaXMtPnBv
cHVwQnV0dG9uKCk7CisKKyAgICAvLyBTZXQgdGhlIGNvbnRyb2wgc2l6ZSBiYXNlZCBvZmYgdGhl
IHJlY3RhbmdsZSB3ZSdyZSBwYWludGluZyBpbnRvLgorICAgIHNldENvbnRyb2xTaXplKHBvcHVw
QnV0dG9uLCBwb3B1cEJ1dHRvblNpemVzKCksIHIuc2l6ZSgpLCBvLT5zdHlsZSgpLT5lZmZlY3Rp
dmVab29tKCkpOworCisgICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNwb25k
IHRvLgorICAgIHVwZGF0ZUNoZWNrZWRTdGF0ZShwb3B1cEJ1dHRvbiwgbyk7CisgICAgdXBkYXRl
RW5hYmxlZFN0YXRlKHBvcHVwQnV0dG9uLCBvKTsKKyAgICB1cGRhdGVQcmVzc2VkU3RhdGUocG9w
dXBCdXR0b24sIG8pOworICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShwb3B1cEJ1dHRvbiwgbyk7Cit9
CisKK2NvbnN0IEludFNpemUqIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6Om1lbnVMaXN0U2l6ZXMo
KSBjb25zdAoreworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNpemVzWzNdID0geyBJbnRTaXpl
KDksIDApLCBJbnRTaXplKDUsIDApLCBJbnRTaXplKDAsIDApIH07CisgICAgcmV0dXJuIHNpemVz
OworfQorCitpbnQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6bWluaW11bU1lbnVMaXN0U2l6ZShS
ZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHNpemVGb3JTeXN0ZW1Gb250
KHN0eWxlLCBtZW51TGlzdFNpemVzKCkpLndpZHRoKCk7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQg
dHJhY2tXaWR0aCA9IDU7CitzdGF0aWMgY29uc3QgaW50IHRyYWNrUmFkaXVzID0gMjsKKwordm9p
ZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjphZGp1c3RTbGlkZXJUcmFja1N0eWxlKENTU1N0eWxl
U2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0
Cit7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdygwKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUNo
cm9taXVtTWFjOjpwYWludFNsaWRlclRyYWNrKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVy
T2JqZWN0OjpQYWludEluZm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBJ
bnRSZWN0IGJvdW5kcyA9IHI7CisgICAgZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZm
ZWN0aXZlWm9vbSgpOworICAgIGZsb2F0IHpvb21lZFRyYWNrV2lkdGggPSB0cmFja1dpZHRoICog
em9vbUxldmVsOworCisgICAgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSAgU2xpZGVy
SG9yaXpvbnRhbFBhcnQgfHwgby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09ICBNZWRpYVNsaWRl
clBhcnQpIHsKKyAgICAgICAgYm91bmRzLnNldEhlaWdodCh6b29tZWRUcmFja1dpZHRoKTsKKyAg
ICAgICAgYm91bmRzLnNldFkoci55KCkgKyByLmhlaWdodCgpIC8gMiAtIHpvb21lZFRyYWNrV2lk
dGggLyAyKTsKKyAgICB9IGVsc2UgaWYgKG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlk
ZXJWZXJ0aWNhbFBhcnQpIHsKKyAgICAgICAgYm91bmRzLnNldFdpZHRoKHpvb21lZFRyYWNrV2lk
dGgpOworICAgICAgICBib3VuZHMuc2V0WChyLngoKSArIHIud2lkdGgoKSAvIDIgLSB6b29tZWRU
cmFja1dpZHRoIC8gMik7CisgICAgfQorCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0
IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgQ0dDb250ZXh0UmVmIGNvbnRl
eHQgPSBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCk7CisgICAgUmV0YWluUHRy
PENHQ29sb3JTcGFjZVJlZj4gY3NwYWNlKEFkb3B0Q0YsIENHQ29sb3JTcGFjZUNyZWF0ZURldmlj
ZVJHQigpKTsKKworICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7CisgICAgQ0dDb250ZXh0
Q2xpcFRvUmVjdChjb250ZXh0LCBib3VuZHMpOworCisgICAgc3RydWN0IENHRnVuY3Rpb25DYWxs
YmFja3MgbWFpbkNhbGxiYWNrcyA9IHsgMCwgVHJhY2tHcmFkaWVudEludGVycG9sYXRlLCBOVUxM
IH07CisgICAgUmV0YWluUHRyPENHRnVuY3Rpb25SZWY+IG1haW5GdW5jdGlvbihBZG9wdENGLCBD
R0Z1bmN0aW9uQ3JlYXRlKE5VTEwsIDEsIE5VTEwsIDQsIE5VTEwsICZtYWluQ2FsbGJhY2tzKSk7
CisgICAgUmV0YWluUHRyPENHU2hhZGluZ1JlZj4gbWFpblNoYWRpbmc7CisgICAgaWYgKG8tPnN0
eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBTbGlkZXJWZXJ0aWNhbFBhcnQpCisgICAgICAgIG1haW5T
aGFkaW5nLmFkb3B0Q0YoQ0dTaGFkaW5nQ3JlYXRlQXhpYWwoY3NwYWNlLmdldCgpLCBDR1BvaW50
TWFrZShib3VuZHMueCgpLCAgYm91bmRzLmJvdHRvbSgpKSwgQ0dQb2ludE1ha2UoYm91bmRzLnJp
Z2h0KCksIGJvdW5kcy5ib3R0b20oKSksIG1haW5GdW5jdGlvbi5nZXQoKSwgZmFsc2UsIGZhbHNl
KSk7CisgICAgZWxzZQorICAgICAgICBtYWluU2hhZGluZy5hZG9wdENGKENHU2hhZGluZ0NyZWF0
ZUF4aWFsKGNzcGFjZS5nZXQoKSwgQ0dQb2ludE1ha2UoYm91bmRzLngoKSwgIGJvdW5kcy55KCkp
LCBDR1BvaW50TWFrZShib3VuZHMueCgpLCBib3VuZHMuYm90dG9tKCkpLCBtYWluRnVuY3Rpb24u
Z2V0KCksIGZhbHNlLCBmYWxzZSkpOworCisgICAgSW50U2l6ZSByYWRpdXModHJhY2tSYWRpdXMs
IHRyYWNrUmFkaXVzKTsKKyAgICBwYWludEluZm8uY29udGV4dC0+YWRkUm91bmRlZFJlY3RDbGlw
KGJvdW5kcywKKyAgICAgICAgcmFkaXVzLCByYWRpdXMsCisgICAgICAgIHJhZGl1cywgcmFkaXVz
KTsKKyAgICBDR0NvbnRleHREcmF3U2hhZGluZyhjb250ZXh0LCBtYWluU2hhZGluZy5nZXQoKSk7
CisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICAKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6YWRqdXN0U2xpZGVyVGh1bWJT
dHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVt
ZW50KiBlKSBjb25zdAoreworICAgIHN0eWxlLT5zZXRCb3hTaGFkb3coMCk7Cit9CisKK3N0YXRp
YyBjb25zdCBmbG9hdCB2ZXJ0aWNhbFNsaWRlckhlaWdodFBhZGRpbmcgPSAwLjFmOworCitib29s
IFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBhaW50U2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBv
LCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByKQoreworICAgIEFTU0VSVChvLT5wYXJlbnQoKS0+aXNTbGlkZXIoKSk7CisKKyAgICBOU1Ns
aWRlckNlbGwqIHNsaWRlclRodW1iQ2VsbCA9IG8tPnN0eWxlKCktPmFwcGVhcmFuY2UoKSA9PSBT
bGlkZXJUaHVtYlZlcnRpY2FsUGFydAorICAgICAgICA/IHNsaWRlclRodW1iVmVydGljYWwoKQor
ICAgICAgICA6IHNsaWRlclRodW1iSG9yaXpvbnRhbCgpOworCisgICAgTG9jYWxDdXJyZW50R3Jh
cGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisKKyAgICAvLyBV
cGRhdGUgdGhlIHZhcmlvdXMgc3RhdGVzIHdlIHJlc3BvbmQgdG8uCisgICAgdXBkYXRlRW5hYmxl
ZFN0YXRlKHNsaWRlclRodW1iQ2VsbCwgby0+cGFyZW50KCkpOworICAgIHVwZGF0ZUZvY3VzZWRT
dGF0ZShzbGlkZXJUaHVtYkNlbGwsIG8tPnBhcmVudCgpKTsKKworICAgIC8vIFVwZGF0ZSB0aGUg
cHJlc3NlZCBzdGF0ZSB1c2luZyB0aGUgTlNDZWxsIHRyYWNraW5nIG1ldGhvZHMsIHNpbmNlIHRo
YXQncyBob3cgTlNTbGlkZXJDZWxsIGtlZXBzIHRyYWNrIG9mIGl0LgorICAgIGJvb2wgb2xkUHJl
c3NlZDsKKyAgICBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVy
dGljYWxQYXJ0KQorICAgICAgICBvbGRQcmVzc2VkID0gbV9pc1NsaWRlclRodW1iVmVydGljYWxQ
cmVzc2VkOworICAgIGVsc2UKKyAgICAgICAgb2xkUHJlc3NlZCA9IG1faXNTbGlkZXJUaHVtYkhv
cml6b250YWxQcmVzc2VkOworCisgICAgYm9vbCBwcmVzc2VkID0gc3RhdGljX2Nhc3Q8UmVuZGVy
U2xpZGVyKj4oby0+cGFyZW50KCkpLT5pbkRyYWdNb2RlKCk7CisKKyAgICBpZiAoby0+c3R5bGUo
KS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KQorICAgICAgICBtX2lz
U2xpZGVyVGh1bWJWZXJ0aWNhbFByZXNzZWQgPSBwcmVzc2VkOworICAgIGVsc2UKKyAgICAgICAg
bV9pc1NsaWRlclRodW1iSG9yaXpvbnRhbFByZXNzZWQgPSBwcmVzc2VkOworCisgICAgaWYgKHBy
ZXNzZWQgIT0gb2xkUHJlc3NlZCkgeworICAgICAgICBpZiAocHJlc3NlZCkKKyAgICAgICAgICAg
IFtzbGlkZXJUaHVtYkNlbGwgc3RhcnRUcmFja2luZ0F0Ok5TUG9pbnQoKSBpblZpZXc6bmlsXTsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgW3NsaWRlclRodW1iQ2VsbCBzdG9wVHJhY2tpbmc6
TlNQb2ludCgpIGF0Ok5TUG9pbnQoKSBpblZpZXc6bmlsIG1vdXNlSXNVcDpZRVNdOworICAgIH0K
KworICAgIEZsb2F0UmVjdCBib3VuZHMgPSByOworICAgIC8vIE1ha2UgdGhlIGhlaWdodCBvZiB0
aGUgdmVydGljYWwgc2xpZGVyIHNsaWdodGx5IGxhcmdlciBzbyBOU1NsaWRlckNlbGwgd2lsbCBk
cmF3IGEgdmVydGljYWwgc2xpZGVyLgorICAgIGlmIChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkg
PT0gU2xpZGVyVGh1bWJWZXJ0aWNhbFBhcnQpCisgICAgICAgIGJvdW5kcy5zZXRIZWlnaHQoYm91
bmRzLmhlaWdodCgpICsgdmVydGljYWxTbGlkZXJIZWlnaHRQYWRkaW5nICogby0+c3R5bGUoKS0+
ZWZmZWN0aXZlWm9vbSgpKTsKKworICAgIHBhaW50SW5mby5jb250ZXh0LT5zYXZlKCk7CisgICAg
ZmxvYXQgem9vbUxldmVsID0gby0+c3R5bGUoKS0+ZWZmZWN0aXZlWm9vbSgpOworICAgIAorICAg
IEZsb2F0UmVjdCB1bnpvb21lZFJlY3QgPSBib3VuZHM7CisgICAgaWYgKHpvb21MZXZlbCAhPSAx
LjBmKSB7CisgICAgICAgIHVuem9vbWVkUmVjdC5zZXRXaWR0aCh1bnpvb21lZFJlY3Qud2lkdGgo
KSAvIHpvb21MZXZlbCk7CisgICAgICAgIHVuem9vbWVkUmVjdC5zZXRIZWlnaHQodW56b29tZWRS
ZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnRy
YW5zbGF0ZSh1bnpvb21lZFJlY3QueCgpLCB1bnpvb21lZFJlY3QueSgpKTsKKyAgICAgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkpOwor
ICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC11bnpvb21lZFJlY3QueCgpLCAt
dW56b29tZWRSZWN0LnkoKSk7CisgICAgfQorCisgICAgW3NsaWRlclRodW1iQ2VsbCBkcmF3V2l0
aEZyYW1lOkZsb2F0UmVjdFRvTlNSZWN0KHVuem9vbWVkUmVjdCkgaW5WaWV3Om5pbF07CisgICAg
W3NsaWRlclRodW1iQ2VsbCBzZXRDb250cm9sVmlldzpuaWxdOworCisgICAgcGFpbnRJbmZvLmNv
bnRleHQtPnJlc3RvcmUoKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworY29uc3QgaW50IHNs
aWRlclRodW1iV2lkdGggPSAxNTsKK2NvbnN0IGludCBzbGlkZXJUaHVtYkhlaWdodCA9IDE1Owor
Y29uc3QgaW50IG1lZGlhU2xpZGVyVGh1bWJXaWR0aCA9IDEzOworY29uc3QgaW50IG1lZGlhU2xp
ZGVyVGh1bWJIZWlnaHQgPSAxNDsKKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjphZGp1
c3RTbGlkZXJUaHVtYlNpemUoUmVuZGVyT2JqZWN0KiBvKSBjb25zdAoreworICAgIGZsb2F0IHpv
b21MZXZlbCA9IG8tPnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKyAgICBpZiAoby0+c3R5bGUo
KS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iSG9yaXpvbnRhbFBhcnQgfHwgby0+c3R5bGUo
KS0+YXBwZWFyYW5jZSgpID09IFNsaWRlclRodW1iVmVydGljYWxQYXJ0KSB7CisgICAgICAgIG8t
PnN0eWxlKCktPnNldFdpZHRoKExlbmd0aChzdGF0aWNfY2FzdDxpbnQ+KHNsaWRlclRodW1iV2lk
dGggKiB6b29tTGV2ZWwpLCBGaXhlZCkpOworICAgICAgICBvLT5zdHlsZSgpLT5zZXRIZWlnaHQo
TGVuZ3RoKHN0YXRpY19jYXN0PGludD4oc2xpZGVyVGh1bWJIZWlnaHQgKiB6b29tTGV2ZWwpLCBG
aXhlZCkpOworICAgIH0gZWxzZSBpZiAoby0+c3R5bGUoKS0+YXBwZWFyYW5jZSgpID09IE1lZGlh
U2xpZGVyVGh1bWJQYXJ0KSB7CisgICAgICAgIG8tPnN0eWxlKCktPnNldFdpZHRoKExlbmd0aCht
ZWRpYVNsaWRlclRodW1iV2lkdGgsIEZpeGVkKSk7CisgICAgICAgIG8tPnN0eWxlKCktPnNldEhl
aWdodChMZW5ndGgobWVkaWFTbGlkZXJUaHVtYkhlaWdodCwgRml4ZWQpKTsKKyAgICB9Cit9CisK
K2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cGFpbnRTZWFyY2hGaWVsZChSZW5kZXJPYmpl
Y3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IElu
dFJlY3QmIHIpCit7CisgICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJj
aCgpOworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJ
bmZvLmNvbnRleHQpOworCisgICAgc2V0U2VhcmNoQ2VsbFN0YXRlKG8sIHIpOworCisgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxl
KCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIEludFJlY3QgdW56b29tZWRSZWN0ID0gcjsKKyAg
ICAKKyAgICBpZiAoem9vbUxldmVsICE9IDEuMGYpIHsKKyAgICAgICAgdW56b29tZWRSZWN0LnNl
dFdpZHRoKHVuem9vbWVkUmVjdC53aWR0aCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgdW56b29t
ZWRSZWN0LnNldEhlaWdodCh1bnpvb21lZFJlY3QuaGVpZ2h0KCkgLyB6b29tTGV2ZWwpOworICAg
ICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKHVuem9vbWVkUmVjdC54KCksIHVuem9v
bWVkUmVjdC55KCkpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+c2NhbGUoRmxvYXRTaXpl
KHpvb21MZXZlbCwgem9vbUxldmVsKSk7CisgICAgICAgIHBhaW50SW5mby5jb250ZXh0LT50cmFu
c2xhdGUoLXVuem9vbWVkUmVjdC54KCksIC11bnpvb21lZFJlY3QueSgpKTsKKyAgICB9CisKKyAg
ICAvLyBTZXQgdGhlIHNlYXJjaCBidXR0b24gdG8gbmlsIGJlZm9yZSBkcmF3aW5nLiAgVGhlbiBy
ZXNldCBpdCBzbyB3ZSBjYW4gZHJhdyBpdCBsYXRlci4KKyAgICBbc2VhcmNoIHNldFNlYXJjaEJ1
dHRvbkNlbGw6bmlsXTsKKworICAgIFtzZWFyY2ggZHJhd1dpdGhGcmFtZTpOU1JlY3QoSW50UmVj
dFRvTlNSZWN0KHVuem9vbWVkUmVjdCkpIGluVmlldzpuaWxdOworI2lmZGVmIEJVSUxESU5HX09O
X1RJR0VSCisgICAgaWYgKFtzZWFyY2ggc2hvd3NGaXJzdFJlc3BvbmRlcl0pCisgICAgICAgIHdr
RHJhd1RleHRGaWVsZENlbGxGb2N1c1Jpbmcoc2VhcmNoLCBOU1JlY3QodW56b29tZWRSZWN0KSk7
CisjZW5kaWYKKworICAgIFtzZWFyY2ggc2V0Q29udHJvbFZpZXc6bmlsXTsKKyAgICBbc2VhcmNo
IHJlc2V0U2VhcmNoQnV0dG9uQ2VsbF07CisKKyAgICBwYWludEluZm8uY29udGV4dC0+cmVzdG9y
ZSgpOworCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1N
YWM6OnNldFNlYXJjaENlbGxTdGF0ZShSZW5kZXJPYmplY3QqIG8sIGNvbnN0IEludFJlY3QmIHIp
Cit7CisgICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJjaCgpOworCisg
ICAgW3NlYXJjaCBzZXRDb250cm9sU2l6ZTpjb250cm9sU2l6ZUZvckZvbnQoby0+c3R5bGUoKSld
OworCisgICAgLy8gVXBkYXRlIHRoZSB2YXJpb3VzIHN0YXRlcyB3ZSByZXNwb25kIHRvLgorICAg
IHVwZGF0ZUVuYWJsZWRTdGF0ZShzZWFyY2gsIG8pOworICAgIHVwZGF0ZUZvY3VzZWRTdGF0ZShz
ZWFyY2gsIG8pOworfQorCitjb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpz
ZWFyY2hGaWVsZFNpemVzKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXpl
c1szXSA9IHsgSW50U2l6ZSgwLCAyMiksIEludFNpemUoMCwgMTkpLCBJbnRTaXplKDAsIDE3KSB9
OworICAgIHJldHVybiBzaXplczsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpz
ZXRTZWFyY2hGaWVsZFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIElm
IHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwgdGhlbiB3ZSBoYXZlIG5v
dGhpbmcgdG8gZG8uCisgICAgaWYgKCFzdHlsZS0+d2lkdGgoKS5pc0ludHJpbnNpY09yQXV0bygp
ICYmICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAg
ICAvLyBVc2UgdGhlIGZvbnQgc2l6ZSB0byBkZXRlcm1pbmUgdGhlIGludHJpbnNpYyB3aWR0aCBv
ZiB0aGUgY29udHJvbC4KKyAgICBzZXRTaXplRnJvbUZvbnQoc3R5bGUsIHNlYXJjaEZpZWxkU2l6
ZXMoKSk7Cit9CisKK3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6YWRqdXN0U2VhcmNoRmll
bGRTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxlY3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBF
bGVtZW50KiBlKSBjb25zdAoreworICAgIC8vIE92ZXJyaWRlIGJvcmRlci4KKyAgICBzdHlsZS0+
cmVzZXRCb3JkZXIoKTsKKyAgICBjb25zdCBzaG9ydCBib3JkZXJXaWR0aCA9IDIgKiBzdHlsZS0+
ZWZmZWN0aXZlWm9vbSgpOworICAgIHN0eWxlLT5zZXRCb3JkZXJMZWZ0V2lkdGgoYm9yZGVyV2lk
dGgpOworICAgIHN0eWxlLT5zZXRCb3JkZXJMZWZ0U3R5bGUoSU5TRVQpOworICAgIHN0eWxlLT5z
ZXRCb3JkZXJSaWdodFdpZHRoKGJvcmRlcldpZHRoKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyUmln
aHRTdHlsZShJTlNFVCk7CisgICAgc3R5bGUtPnNldEJvcmRlckJvdHRvbVdpZHRoKGJvcmRlcldp
ZHRoKTsKKyAgICBzdHlsZS0+c2V0Qm9yZGVyQm90dG9tU3R5bGUoSU5TRVQpOworICAgIHN0eWxl
LT5zZXRCb3JkZXJUb3BXaWR0aChib3JkZXJXaWR0aCk7CisgICAgc3R5bGUtPnNldEJvcmRlclRv
cFN0eWxlKElOU0VUKTsgICAgCisgICAgCisgICAgLy8gT3ZlcnJpZGUgaGVpZ2h0LgorICAgIHN0
eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKEF1dG8pKTsKKyAgICBzZXRTZWFyY2hGaWVsZFNpemUoc3R5
bGUpOworICAgIAorICAgIC8vIE92ZXJyaWRlIHBhZGRpbmcgc2l6ZSB0byBtYXRjaCBBcHBLaXQg
dGV4dCBwb3NpdGlvbmluZy4KKyAgICBjb25zdCBpbnQgcGFkZGluZyA9IDEgKiBzdHlsZS0+ZWZm
ZWN0aXZlWm9vbSgpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nTGVmdChMZW5ndGgocGFkZGluZywg
Rml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChwYWRkaW5nLCBGaXhl
ZCkpOworICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOwor
ICAgIHN0eWxlLT5zZXRQYWRkaW5nQm90dG9tKExlbmd0aChwYWRkaW5nLCBGaXhlZCkpOworICAg
IAorICAgIE5TQ29udHJvbFNpemUgY29udHJvbFNpemUgPSBjb250cm9sU2l6ZUZvckZvbnQoc3R5
bGUpOworICAgIHNldEZvbnRGcm9tQ29udHJvbFNpemUoc2VsZWN0b3IsIHN0eWxlLCBjb250cm9s
U2l6ZSk7CisKKyAgICBzdHlsZS0+c2V0Qm94U2hhZG93KDApOworfQorCitib29sIFJlbmRlclRo
ZW1lQ2hyb21pdW1NYWM6OnBhaW50U2VhcmNoRmllbGRDYW5jZWxCdXR0b24oUmVuZGVyT2JqZWN0
KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRS
ZWN0JiByKQoreworICAgIE5vZGUqIGlucHV0ID0gby0+bm9kZSgpLT5zaGFkb3dBbmNlc3Rvck5v
ZGUoKTsKKyAgICBzZXRTZWFyY2hDZWxsU3RhdGUoaW5wdXQtPnJlbmRlcmVyKCksIHIpOworCisg
ICAgTlNTZWFyY2hGaWVsZENlbGwqIHNlYXJjaCA9IHRoaXMtPnNlYXJjaCgpOworCisgICAgdXBk
YXRlUHJlc3NlZFN0YXRlKFtzZWFyY2ggY2FuY2VsQnV0dG9uQ2VsbF0sIG8pOworCisgICAgcGFp
bnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8tPnN0eWxl
KCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIE5TUmVjdCBib3VuZHMgPSBbc2VhcmNoIGNhbmNl
bEJ1dHRvblJlY3RGb3JCb3VuZHM6TlNSZWN0KEludFJlY3RUb05TUmVjdChpbnB1dC0+cmVuZGVy
ZXIoKS0+YWJzb2x1dGVCb3VuZGluZ0JveFJlY3QoKSkpXTsKKyAgICAKKyAgICBJbnRSZWN0IHVu
em9vbWVkUmVjdChOU1JlY3RUb0ludFJlY3QoYm91bmRzKSk7CisgICAgaWYgKHpvb21MZXZlbCAh
PSAxLjBmKSB7CisgICAgICAgIHVuem9vbWVkUmVjdC5zZXRXaWR0aCh1bnpvb21lZFJlY3Qud2lk
dGgoKSAvIHpvb21MZXZlbCk7CisgICAgICAgIHVuem9vbWVkUmVjdC5zZXRIZWlnaHQodW56b29t
ZWRSZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgcGFpbnRJbmZvLmNvbnRleHQt
PnRyYW5zbGF0ZSh1bnpvb21lZFJlY3QueCgpLCB1bnpvb21lZFJlY3QueSgpKTsKKyAgICAgICAg
cGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21MZXZlbCkp
OworICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC11bnpvb21lZFJlY3QueCgp
LCAtdW56b29tZWRSZWN0LnkoKSk7CisgICAgfQorCisgICAgW1tzZWFyY2ggY2FuY2VsQnV0dG9u
Q2VsbF0gZHJhd1dpdGhGcmFtZTpJbnRSZWN0VG9OU1JlY3QodW56b29tZWRSZWN0KSBpblZpZXc6
bmlsXTsKKyAgICBbW3NlYXJjaCBjYW5jZWxCdXR0b25DZWxsXSBzZXRDb250cm9sVmlldzpuaWxd
OworCisgICAgcGFpbnRJbmZvLmNvbnRleHQtPnJlc3RvcmUoKTsKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2NvbnN0IEludFNpemUqIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OmNhbmNlbEJ1dHRv
blNpemVzKCkgY29uc3QKK3sKKyAgICBzdGF0aWMgY29uc3QgSW50U2l6ZSBzaXplc1szXSA9IHsg
SW50U2l6ZSgxNiwgMTMpLCBJbnRTaXplKDEzLCAxMSksIEludFNpemUoMTMsIDkpIH07CisgICAg
cmV0dXJuIHNpemVzOworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OmFkanVzdFNl
YXJjaEZpZWxkQ2FuY2VsQnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJl
bmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3sKKyAgICBJbnRTaXplIHNpemUg
PSBzaXplRm9yU3lzdGVtRm9udChzdHlsZSwgY2FuY2VsQnV0dG9uU2l6ZXMoKSk7CisgICAgc3R5
bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNl
dEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0Qm94
U2hhZG93KDApOworfQorCitjb25zdCBJbnRTaXplKiBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpy
ZXN1bHRzQnV0dG9uU2l6ZXMoKSBjb25zdAoreworICAgIHN0YXRpYyBjb25zdCBJbnRTaXplIHNp
emVzWzNdID0geyBJbnRTaXplKDE5LCAxMyksIEludFNpemUoMTcsIDExKSwgSW50U2l6ZSgxNywg
OSkgfTsKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQgZW1wdHlSZXN1
bHRzT2Zmc2V0ID0gOTsKK3ZvaWQgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6YWRqdXN0U2VhcmNo
RmllbGREZWNvcmF0aW9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0
eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3sKKyAgICBJbnRTaXplIHNpemUgPSBzaXpl
Rm9yU3lzdGVtRm9udChzdHlsZSwgcmVzdWx0c0J1dHRvblNpemVzKCkpOworICAgIHN0eWxlLT5z
ZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpIC0gZW1wdHlSZXN1bHRzT2Zmc2V0LCBGaXhlZCkp
OworICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3RoKHNpemUuaGVpZ2h0KCksIEZpeGVkKSk7Cisg
ICAgc3R5bGUtPnNldEJveFNoYWRvdygwKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUNocm9taXVt
TWFjOjpwYWludFNlYXJjaEZpZWxkRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJl
bmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OmFkanVz
dFNlYXJjaEZpZWxkUmVzdWx0c0RlY29yYXRpb25TdHlsZShDU1NTdHlsZVNlbGVjdG9yKiBzZWxl
Y3RvciwgUmVuZGVyU3R5bGUqIHN0eWxlLCBFbGVtZW50KiBlKSBjb25zdAoreworICAgIEludFNp
emUgc2l6ZSA9IHNpemVGb3JTeXN0ZW1Gb250KHN0eWxlLCByZXN1bHRzQnV0dG9uU2l6ZXMoKSk7
CisgICAgc3R5bGUtPnNldFdpZHRoKExlbmd0aChzaXplLndpZHRoKCksIEZpeGVkKSk7CisgICAg
c3R5bGUtPnNldEhlaWdodChMZW5ndGgoc2l6ZS5oZWlnaHQoKSwgRml4ZWQpKTsKKyAgICBzdHls
ZS0+c2V0Qm94U2hhZG93KDApOworfQorCitib29sIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OnBh
aW50U2VhcmNoRmllbGRSZXN1bHRzRGVjb3JhdGlvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJl
bmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7Cisg
ICAgTm9kZSogaW5wdXQgPSBvLT5ub2RlKCktPnNoYWRvd0FuY2VzdG9yTm9kZSgpOworICAgIHNl
dFNlYXJjaENlbGxTdGF0ZShpbnB1dC0+cmVuZGVyZXIoKSwgcik7CisKKyAgICBOU1NlYXJjaEZp
ZWxkQ2VsbCogc2VhcmNoID0gdGhpcy0+c2VhcmNoKCk7CisKKyAgICBpZiAoW3NlYXJjaCBzZWFy
Y2hNZW51VGVtcGxhdGVdICE9IG5pbCkKKyAgICAgICAgW3NlYXJjaCBzZXRTZWFyY2hNZW51VGVt
cGxhdGU6bmlsXTsKKworICAgIE5TUmVjdCBib3VuZHMgPSBbc2VhcmNoIHNlYXJjaEJ1dHRvblJl
Y3RGb3JCb3VuZHM6TlNSZWN0KEludFJlY3RUb05TUmVjdChpbnB1dC0+cmVuZGVyZXIoKS0+YWJz
b2x1dGVCb3VuZGluZ0JveFJlY3QoKSkpXTsKKyAgICBbW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxs
XSBkcmF3V2l0aEZyYW1lOmJvdW5kcyBpblZpZXc6bmlsXTsKKyAgICBbW3NlYXJjaCBzZWFyY2hC
dXR0b25DZWxsXSBzZXRDb250cm9sVmlldzpuaWxdOworICAgIHJldHVybiBmYWxzZTsKK30KKwor
c3RhdGljIGNvbnN0IGludCByZXN1bHRzQXJyb3dXaWR0aCA9IDU7Cit2b2lkIFJlbmRlclRoZW1l
Q2hyb21pdW1NYWM6OmFkanVzdFNlYXJjaEZpZWxkUmVzdWx0c0J1dHRvblN0eWxlKENTU1N0eWxl
U2VsZWN0b3IqIHNlbGVjdG9yLCBSZW5kZXJTdHlsZSogc3R5bGUsIEVsZW1lbnQqIGUpIGNvbnN0
Cit7CisgICAgSW50U2l6ZSBzaXplID0gc2l6ZUZvclN5c3RlbUZvbnQoc3R5bGUsIHJlc3VsdHNC
dXR0b25TaXplcygpKTsKKyAgICBzdHlsZS0+c2V0V2lkdGgoTGVuZ3RoKHNpemUud2lkdGgoKSAr
IHJlc3VsdHNBcnJvd1dpZHRoLCBGaXhlZCkpOworICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KHNpemUuaGVpZ2h0KCksIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldEJveFNoYWRvdygwKTsKK30K
KworYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpwYWludFNlYXJjaEZpZWxkUmVzdWx0c0J1
dHRvbihSZW5kZXJPYmplY3QqIG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWlu
dEluZm8sIGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgTm9kZSogaW5wdXQgPSBvLT5ub2RlKCkt
PnNoYWRvd0FuY2VzdG9yTm9kZSgpOworICAgIHNldFNlYXJjaENlbGxTdGF0ZShpbnB1dC0+cmVu
ZGVyZXIoKSwgcik7CisKKyAgICBOU1NlYXJjaEZpZWxkQ2VsbCogc2VhcmNoID0gdGhpcy0+c2Vh
cmNoKCk7CisKKyAgICBpZiAoIVtzZWFyY2ggc2VhcmNoTWVudVRlbXBsYXRlXSkKKyAgICAgICAg
W3NlYXJjaCBzZXRTZWFyY2hNZW51VGVtcGxhdGU6c2VhcmNoTWVudVRlbXBsYXRlKCldOworCisg
ICAgcGFpbnRJbmZvLmNvbnRleHQtPnNhdmUoKTsKKworICAgIGZsb2F0IHpvb21MZXZlbCA9IG8t
PnN0eWxlKCktPmVmZmVjdGl2ZVpvb20oKTsKKworICAgIE5TUmVjdCBib3VuZHMgPSBbc2VhcmNo
IHNlYXJjaEJ1dHRvblJlY3RGb3JCb3VuZHM6TlNSZWN0KEludFJlY3RUb05TUmVjdChpbnB1dC0+
cmVuZGVyZXIoKS0+YWJzb2x1dGVCb3VuZGluZ0JveFJlY3QoKSkpXTsKKyAgICAKKyAgICBJbnRS
ZWN0IHVuem9vbWVkUmVjdChOU1JlY3RUb0ludFJlY3QoYm91bmRzKSk7CisgICAgaWYgKHpvb21M
ZXZlbCAhPSAxLjBmKSB7CisgICAgICAgIHVuem9vbWVkUmVjdC5zZXRXaWR0aCh1bnpvb21lZFJl
Y3Qud2lkdGgoKSAvIHpvb21MZXZlbCk7CisgICAgICAgIHVuem9vbWVkUmVjdC5zZXRIZWlnaHQo
dW56b29tZWRSZWN0LmhlaWdodCgpIC8gem9vbUxldmVsKTsKKyAgICAgICAgcGFpbnRJbmZvLmNv
bnRleHQtPnRyYW5zbGF0ZSh1bnpvb21lZFJlY3QueCgpLCB1bnpvb21lZFJlY3QueSgpKTsKKyAg
ICAgICAgcGFpbnRJbmZvLmNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZSh6b29tTGV2ZWwsIHpvb21M
ZXZlbCkpOworICAgICAgICBwYWludEluZm8uY29udGV4dC0+dHJhbnNsYXRlKC11bnpvb21lZFJl
Y3QueCgpLCAtdW56b29tZWRSZWN0LnkoKSk7CisgICAgfQorCisgICAgW1tzZWFyY2ggc2VhcmNo
QnV0dG9uQ2VsbF0gZHJhd1dpdGhGcmFtZTpJbnRSZWN0VG9OU1JlY3QodW56b29tZWRSZWN0KSBp
blZpZXc6bmlsXTsKKyAgICBbW3NlYXJjaCBzZWFyY2hCdXR0b25DZWxsXSBzZXRDb250cm9sVmll
dzpuaWxdOworICAgIAorICAgIHBhaW50SW5mby5jb250ZXh0LT5yZXN0b3JlKCk7CisKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cGFpbnRNZWRp
YUZ1bGxzY3JlZW5CdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBh
aW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiByKQoreworI2lmIEVOQUJMRShWSURF
TykKKyAgICBOb2RlKiBub2RlID0gby0+ZWxlbWVudCgpOworICAgIGlmICghbm9kZSkKKyAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250ZXh0IGxvY2Fs
Q29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgd2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFG
dWxsc2NyZWVuQnV0dG9uLCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHIs
IG5vZGUtPmFjdGl2ZSgpKTsKKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBS
ZW5kZXJUaGVtZUNocm9taXVtTWFjOjpwYWludE1lZGlhTXV0ZUJ1dHRvbihSZW5kZXJPYmplY3Qq
IG8sIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJl
Y3QmIHIpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIE5vZGUqIG5vZGUgPSBvLT5lbGVtZW50
KCk7CisgICAgTm9kZSogbWVkaWFOb2RlID0gbm9kZSA/IG5vZGUtPnNoYWRvd0FuY2VzdG9yTm9k
ZSgpIDogMDsKKyAgICBpZiAoIW1lZGlhTm9kZSB8fCAoIW1lZGlhTm9kZS0+aGFzVGFnTmFtZSh2
aWRlb1RhZykgJiYgIW1lZGlhTm9kZS0+aGFzVGFnTmFtZShhdWRpb1RhZykpKQorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBzdGF0
aWNfY2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obWVkaWFOb2RlKTsKKyAgICBpZiAoIW1lZGlhRWxl
bWVudCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIAorICAgIExvY2FsQ3VycmVudEdyYXBo
aWNzQ29udGV4dCBsb2NhbENvbnRleHQocGFpbnRJbmZvLmNvbnRleHQpOworICAgIHdrRHJhd01l
ZGlhVUlQYXJ0KG1lZGlhRWxlbWVudC0+bXV0ZWQoKSA/IE1lZGlhVW5NdXRlQnV0dG9uIDogTWVk
aWFNdXRlQnV0dG9uLCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHIsIG5v
ZGUtPmFjdGl2ZSgpKTsKKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZUNocm9taXVtTWFjOjpwYWludE1lZGlhUGxheUJ1dHRvbihSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3Qm
IHIpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIE5vZGUqIG5vZGUgPSBvLT5lbGVtZW50KCk7
CisgICAgTm9kZSogbWVkaWFOb2RlID0gbm9kZSA/IG5vZGUtPnNoYWRvd0FuY2VzdG9yTm9kZSgp
IDogMDsKKyAgICBpZiAoIW1lZGlhTm9kZSB8fCAoIW1lZGlhTm9kZS0+aGFzVGFnTmFtZSh2aWRl
b1RhZykgJiYgIW1lZGlhTm9kZS0+aGFzVGFnTmFtZShhdWRpb1RhZykpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBzdGF0aWNf
Y2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obWVkaWFOb2RlKTsKKyAgICBpZiAoIW1lZGlhRWxlbWVu
dCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJyZW50R3JhcGhpY3NDb250
ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgd2tEcmF3TWVkaWFVSVBh
cnQobWVkaWFFbGVtZW50LT5jYW5QbGF5KCkgPyBNZWRpYVBsYXlCdXR0b24gOiBNZWRpYVBhdXNl
QnV0dG9uLCBwYWludEluZm8uY29udGV4dC0+cGxhdGZvcm1Db250ZXh0KCksIHIsIG5vZGUtPmFj
dGl2ZSgpKTsKKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5kZXJUaGVt
ZUNocm9taXVtTWFjOjpwYWludE1lZGlhU2Vla0JhY2tCdXR0b24oUmVuZGVyT2JqZWN0KiBvLCBj
b25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0JiBy
KQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBOb2RlKiBub2RlID0gby0+ZWxlbWVudCgpOwor
ICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJyZW50
R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAgd2tE
cmF3TWVkaWFVSVBhcnQoTWVkaWFTZWVrQmFja0J1dHRvbiwgcGFpbnRJbmZvLmNvbnRleHQtPnBs
YXRmb3JtQ29udGV4dCgpLCByLCBub2RlLT5hY3RpdmUoKSk7CisjZW5kaWYKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cGFpbnRNZWRpYVNlZWtG
b3J3YXJkQnV0dG9uKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludElu
Zm8mIHBhaW50SW5mbywgY29uc3QgSW50UmVjdCYgcikKK3sKKyNpZiBFTkFCTEUoVklERU8pCisg
ICAgTm9kZSogbm9kZSA9IG8tPmVsZW1lbnQoKTsKKyAgICBpZiAoIW5vZGUpCisgICAgICAgIHJl
dHVybiBmYWxzZTsKKworICAgIExvY2FsQ3VycmVudEdyYXBoaWNzQ29udGV4dCBsb2NhbENvbnRl
eHQocGFpbnRJbmZvLmNvbnRleHQpOworICAgIHdrRHJhd01lZGlhVUlQYXJ0KE1lZGlhU2Vla0Zv
cndhcmRCdXR0b24sIHBhaW50SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgciwgbm9k
ZS0+YWN0aXZlKCkpOworI2VuZGlmCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFJlbmRl
clRoZW1lQ2hyb21pdW1NYWM6OnBhaW50TWVkaWFTbGlkZXJUcmFjayhSZW5kZXJPYmplY3QqIG8s
IGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiBwYWludEluZm8sIGNvbnN0IEludFJlY3Qm
IHIpCit7CisjaWYgRU5BQkxFKFZJREVPKQorICAgIE5vZGUqIG5vZGUgPSBvLT5lbGVtZW50KCk7
CisgICAgTm9kZSogbWVkaWFOb2RlID0gbm9kZSA/IG5vZGUtPnNoYWRvd0FuY2VzdG9yTm9kZSgp
IDogMDsKKyAgICBpZiAoIW1lZGlhTm9kZSB8fCAoIW1lZGlhTm9kZS0+aGFzVGFnTmFtZSh2aWRl
b1RhZykgJiYgIW1lZGlhTm9kZS0+aGFzVGFnTmFtZShhdWRpb1RhZykpKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBIVE1MTWVkaWFFbGVtZW50KiBtZWRpYUVsZW1lbnQgPSBzdGF0aWNf
Y2FzdDxIVE1MTWVkaWFFbGVtZW50Kj4obWVkaWFOb2RlKTsKKyAgICBpZiAoIW1lZGlhRWxlbWVu
dCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZmxvYXQgdGltZUxvYWRlZCA9IDA7Cisg
ICAgZmxvYXQgY3VycmVudFRpbWUgPSAwOworICAgIGZsb2F0IGR1cmF0aW9uID0gMDsKKyAgICBp
ZiAoTWVkaWFQbGF5ZXIqIHBsYXllciA9IG1lZGlhRWxlbWVudC0+cGxheWVyKCkpIHsKKyAgICAg
ICAgZHVyYXRpb24gPSBwbGF5ZXItPmR1cmF0aW9uKCk7CisgICAgICAgIHRpbWVMb2FkZWQgPSBw
bGF5ZXItPm1heFRpbWVCdWZmZXJlZCgpOworICAgICAgICBjdXJyZW50VGltZSA9IHBsYXllci0+
Y3VycmVudFRpbWUoKTsKKyAgICB9CisKKyAgICB3a0RyYXdNZWRpYVNsaWRlclRyYWNrKHBhaW50
SW5mby5jb250ZXh0LT5wbGF0Zm9ybUNvbnRleHQoKSwgciwgdGltZUxvYWRlZCwgY3VycmVudFRp
bWUsIGR1cmF0aW9uKTsKKyNlbmRpZgorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBSZW5k
ZXJUaGVtZUNocm9taXVtTWFjOjpwYWludE1lZGlhU2xpZGVyVGh1bWIoUmVuZGVyT2JqZWN0KiBv
LCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgcGFpbnRJbmZvLCBjb25zdCBJbnRSZWN0
JiByKQoreworI2lmIEVOQUJMRShWSURFTykKKyAgICBOb2RlKiBub2RlID0gby0+ZWxlbWVudCgp
OworICAgIGlmICghbm9kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgTG9jYWxDdXJy
ZW50R3JhcGhpY3NDb250ZXh0IGxvY2FsQ29udGV4dChwYWludEluZm8uY29udGV4dCk7CisgICAg
d2tEcmF3TWVkaWFVSVBhcnQoTWVkaWFTbGlkZXJUaHVtYiwgcGFpbnRJbmZvLmNvbnRleHQtPnBs
YXRmb3JtQ29udGV4dCgpLCByLCBub2RlLT5hY3RpdmUoKSk7CisjZW5kaWYKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKKy8vIEZJWE1FOiBUaGlzIHVzZWQgdG8gYmUgaW4gdGhlIHVwc3RyZWFtIHZl
cnNpb24gdW50aWwgaXQgd2FzIGNvbnZlcnRlZCB0byB0aGUgbmV3IHRoZW1lIEFQSSBpbiByMzc3
MzEuCitOU0J1dHRvbkNlbGwqIFJlbmRlclRoZW1lQ2hyb21pdW1NYWM6OmNoZWNrYm94KCkgY29u
c3QKK3sKKyAgICBpZiAoIW1fY2hlY2tib3gpIHsKKyAgICAgICAgbV9jaGVja2JveC5hZG9wdE5T
KFtbTlNCdXR0b25DZWxsIGFsbG9jXSBpbml0XSk7CisgICAgICAgIFttX2NoZWNrYm94LmdldCgp
IHNldEJ1dHRvblR5cGU6TlNTd2l0Y2hCdXR0b25dOworICAgICAgICBbbV9jaGVja2JveC5nZXQo
KSBzZXRUaXRsZTpuaWxdOworICAgICAgICBbbV9jaGVja2JveC5nZXQoKSBzZXRBbGxvd3NNaXhl
ZFN0YXRlOllFU107CisgICAgICAgIFttX2NoZWNrYm94LmdldCgpIHNldEZvY3VzUmluZ1R5cGU6
TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbV9jaGVj
a2JveC5nZXQoKTsKK30KKworLy8gRklYTUU6IFRoaXMgdXNlZCB0byBiZSBpbiB0aGUgdXBzdHJl
YW0gdmVyc2lvbiB1bnRpbCBpdCB3YXMgY29udmVydGVkIHRvIHRoZSBuZXcgdGhlbWUgQVBJIGlu
IHIzNzczMS4KK05TQnV0dG9uQ2VsbCogUmVuZGVyVGhlbWVDaHJvbWl1bU1hYzo6cmFkaW8oKSBj
b25zdAoreworICAgIGlmICghbV9yYWRpbykgeworICAgICAgICBtX3JhZGlvLmFkb3B0TlMoW1tO
U0J1dHRvbkNlbGwgYWxsb2NdIGluaXRdKTsKKyAgICAgICAgW21fcmFkaW8uZ2V0KCkgc2V0QnV0
dG9uVHlwZTpOU1JhZGlvQnV0dG9uXTsKKyAgICAgICAgW21fcmFkaW8uZ2V0KCkgc2V0VGl0bGU6
bmlsXTsKKyAgICAgICAgW21fcmFkaW8uZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmlu
Z1R5cGVFeHRlcmlvcl07CisgICAgfQorICAgIAorICAgIHJldHVybiBtX3JhZGlvLmdldCgpOwor
fQorCisvLyBGSVhNRTogVGhpcyB1c2VkIHRvIGJlIGluIHRoZSB1cHN0cmVhbSB2ZXJzaW9uIHVu
dGlsIGl0IHdhcyBjb252ZXJ0ZWQgdG8gdGhlIG5ldyB0aGVtZSBBUEkgaW4gcjM3NzMxLgorTlNC
dXR0b25DZWxsKiBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpidXR0b24oKSBjb25zdAoreworICAg
IGlmICghbV9idXR0b24pIHsKKyAgICAgICAgbV9idXR0b24uYWRvcHROUyhbW05TQnV0dG9uQ2Vs
bCBhbGxvY10gaW5pdF0pOworICAgICAgICBbbV9idXR0b24uZ2V0KCkgc2V0VGl0bGU6bmlsXTsK
KyAgICAgICAgW21fYnV0dG9uLmdldCgpIHNldEJ1dHRvblR5cGU6TlNNb21lbnRhcnlQdXNoSW5C
dXR0b25dOworICAgIH0KKyAgICAKKyAgICByZXR1cm4gbV9idXR0b24uZ2V0KCk7Cit9CisKK05T
UG9wVXBCdXR0b25DZWxsKiBSZW5kZXJUaGVtZUNocm9taXVtTWFjOjpwb3B1cEJ1dHRvbigpIGNv
bnN0Cit7CisgICAgaWYgKCFtX3BvcHVwQnV0dG9uKSB7CisgICAgICAgIG1fcG9wdXBCdXR0b24u
YWRvcHROUyhbW05TUG9wVXBCdXR0b25DZWxsIGFsbG9jXSBpbml0VGV4dENlbGw6QCIiIHB1bGxz
RG93bjpOT10pOworICAgICAgICBbbV9wb3B1cEJ1dHRvbi5nZXQoKSBzZXRVc2VzSXRlbUZyb21N
ZW51Ok5PXTsKKyAgICAgICAgW21fcG9wdXBCdXR0b24uZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpO
U0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07CisgICAgfQorICAgIAorICAgIHJldHVybiBtX3BvcHVw
QnV0dG9uLmdldCgpOworfQorCitOU1NlYXJjaEZpZWxkQ2VsbCogUmVuZGVyVGhlbWVDaHJvbWl1
bU1hYzo6c2VhcmNoKCkgY29uc3QKK3sKKyAgICBpZiAoIW1fc2VhcmNoKSB7CisgICAgICAgIG1f
c2VhcmNoLmFkb3B0TlMoW1tOU1NlYXJjaEZpZWxkQ2VsbCBhbGxvY10gaW5pdFRleHRDZWxsOkAi
Il0pOworICAgICAgICBbbV9zZWFyY2guZ2V0KCkgc2V0QmV6ZWxTdHlsZTpOU1RleHRGaWVsZFJv
dW5kZWRCZXplbF07CisgICAgICAgIFttX3NlYXJjaC5nZXQoKSBzZXRCZXplbGVkOllFU107Cisg
ICAgICAgIFttX3NlYXJjaC5nZXQoKSBzZXRFZGl0YWJsZTpZRVNdOworICAgICAgICBbbV9zZWFy
Y2guZ2V0KCkgc2V0Rm9jdXNSaW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07CisgICAg
fQorCisgICAgcmV0dXJuIG1fc2VhcmNoLmdldCgpOworfQorCitOU01lbnUqIFJlbmRlclRoZW1l
Q2hyb21pdW1NYWM6OnNlYXJjaE1lbnVUZW1wbGF0ZSgpIGNvbnN0Cit7CisgICAgaWYgKCFtX3Nl
YXJjaE1lbnVUZW1wbGF0ZSkKKyAgICAgICAgbV9zZWFyY2hNZW51VGVtcGxhdGUuYWRvcHROUyhb
W05TTWVudSBhbGxvY10gaW5pdFdpdGhUaXRsZTpAIiJdKTsKKworICAgIHJldHVybiBtX3NlYXJj
aE1lbnVUZW1wbGF0ZS5nZXQoKTsKK30KKworTlNTbGlkZXJDZWxsKiBSZW5kZXJUaGVtZUNocm9t
aXVtTWFjOjpzbGlkZXJUaHVtYkhvcml6b250YWwoKSBjb25zdAoreworICAgIGlmICghbV9zbGlk
ZXJUaHVtYkhvcml6b250YWwpIHsKKyAgICAgICAgbV9zbGlkZXJUaHVtYkhvcml6b250YWwuYWRv
cHROUyhbW05TU2xpZGVyQ2VsbCBhbGxvY10gaW5pdF0pOworICAgICAgICBbbV9zbGlkZXJUaHVt
Ykhvcml6b250YWwuZ2V0KCkgc2V0VGl0bGU6bmlsXTsKKyAgICAgICAgW21fc2xpZGVyVGh1bWJI
b3Jpem9udGFsLmdldCgpIHNldFNsaWRlclR5cGU6TlNMaW5lYXJTbGlkZXJdOworICAgICAgICBb
bV9zbGlkZXJUaHVtYkhvcml6b250YWwuZ2V0KCkgc2V0Q29udHJvbFNpemU6TlNTbWFsbENvbnRy
b2xTaXplXTsKKyAgICAgICAgW21fc2xpZGVyVGh1bWJIb3Jpem9udGFsLmdldCgpIHNldEZvY3Vz
UmluZ1R5cGU6TlNGb2N1c1JpbmdUeXBlRXh0ZXJpb3JdOworICAgIH0KKyAgICAKKyAgICByZXR1
cm4gbV9zbGlkZXJUaHVtYkhvcml6b250YWwuZ2V0KCk7Cit9CisKK05TU2xpZGVyQ2VsbCogUmVu
ZGVyVGhlbWVDaHJvbWl1bU1hYzo6c2xpZGVyVGh1bWJWZXJ0aWNhbCgpIGNvbnN0Cit7CisgICAg
aWYgKCFtX3NsaWRlclRodW1iVmVydGljYWwpIHsKKyAgICAgICAgbV9zbGlkZXJUaHVtYlZlcnRp
Y2FsLmFkb3B0TlMoW1tOU1NsaWRlckNlbGwgYWxsb2NdIGluaXRdKTsKKyAgICAgICAgW21fc2xp
ZGVyVGh1bWJWZXJ0aWNhbC5nZXQoKSBzZXRUaXRsZTpuaWxdOworICAgICAgICBbbV9zbGlkZXJU
aHVtYlZlcnRpY2FsLmdldCgpIHNldFNsaWRlclR5cGU6TlNMaW5lYXJTbGlkZXJdOworICAgICAg
ICBbbV9zbGlkZXJUaHVtYlZlcnRpY2FsLmdldCgpIHNldENvbnRyb2xTaXplOk5TU21hbGxDb250
cm9sU2l6ZV07CisgICAgICAgIFttX3NsaWRlclRodW1iVmVydGljYWwuZ2V0KCkgc2V0Rm9jdXNS
aW5nVHlwZTpOU0ZvY3VzUmluZ1R5cGVFeHRlcmlvcl07CisgICAgfQorICAgIAorICAgIHJldHVy
biBtX3NsaWRlclRodW1iVmVydGljYWwuZ2V0KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKSW5kZXg6IHJlbmRlcmluZy9SZW5kZXJUaGVtZUNocm9taXVtV2luLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bVdpbi5jcHAJKHJldmlzaW9uIDApCisr
KyByZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bVdpbi5jcHAJKHJldmlzaW9uIDApCkBAIC0w
LDAgKzEsNjE0IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBwcm9q
ZWN0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLgorICog
Q29weXJpZ2h0IChDKSAyMDA4LCAyMDA5IEdvb2dsZSwgSW5jLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJv
c3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiUmVuZGVyVGhlbWVDaHJvbWl1bVdpbi5oIgorCisjaW5jbHVkZSA8d2luZG93
cy5oPgorI2luY2x1ZGUgPHV4dGhlbWUuaD4KKyNpbmNsdWRlIDx2c3N5bTMyLmg+CisKKyNpbmNs
dWRlICJDaHJvbWl1bUJyaWRnZS5oIgorI2luY2x1ZGUgIkNTU1N0eWxlU2hlZXQuaCIKKyNpbmNs
dWRlICJDU1NWYWx1ZUtleXdvcmRzLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRl
ICJGb250U2VsZWN0b3IuaCIKKyNpbmNsdWRlICJGb250VXRpbHNDaHJvbWl1bVdpbi5oIgorI2lu
Y2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCisj
aW5jbHVkZSAiU2tpYVV0aWxzLmgiCisjaW5jbHVkZSAiVGhlbWVIZWxwZXJDaHJvbWl1bVdpbi5o
IgorI2luY2x1ZGUgIlVzZXJBZ2VudFN0eWxlU2hlZXRzLmgiCisjaW5jbHVkZSAiV2luZG93c1Zl
cnNpb24uaCIKKworLy8gRklYTUU6IFRoaXMgZGVwZW5kZW5jeSBzaG91bGQgZXZlbnR1YWxseSBi
ZSByZW1vdmVkLgorI2luY2x1ZGUgPHNraWEvZXh0L3NraWFfdXRpbHNfd2luLmg+CisKKyNkZWZp
bmUgU0laRU9GX1NUUlVDVF9XSVRIX1NQRUNJRklFRF9MQVNUX01FTUJFUihzdHJ1Y3ROYW1lLCBt
ZW1iZXIpIFwKKyAgICBvZmZzZXRvZihzdHJ1Y3ROYW1lLCBtZW1iZXIpICsgXAorICAgIChzaXpl
b2Ygc3RhdGljX2Nhc3Q8c3RydWN0TmFtZSo+KDApLT5tZW1iZXIpCisjZGVmaW5lIE5PTkNMSUVO
VE1FVFJJQ1NfU0laRV9QUkVfVklTVEEgXAorICAgIFNJWkVPRl9TVFJVQ1RfV0lUSF9TUEVDSUZJ
RURfTEFTVF9NRU1CRVIoTk9OQ0xJRU5UTUVUUklDUywgbGZNZXNzYWdlRm9udCkKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitzdGF0aWMgdm9pZCBnZXROb25DbGllbnRNZXRyaWNzKE5PTkNMSUVO
VE1FVFJJQ1MqIG1ldHJpY3MpIHsKKyAgICBzdGF0aWMgVUlOVCBzaXplID0gV2ViQ29yZTo6aXNW
aXN0YU9yTmV3ZXIoKSA/CisgICAgICAgIHNpemVvZihOT05DTElFTlRNRVRSSUNTKSA6IE5PTkNM
SUVOVE1FVFJJQ1NfU0laRV9QUkVfVklTVEE7CisgICAgbWV0cmljcy0+Y2JTaXplID0gc2l6ZTsK
KyAgICBib29sIHN1Y2Nlc3MgPSAhIVN5c3RlbVBhcmFtZXRlcnNJbmZvKFNQSV9HRVROT05DTElF
TlRNRVRSSUNTLCBzaXplLCBtZXRyaWNzLCAwKTsKKyAgICBBU1NFUlQoc3VjY2Vzcyk7Cit9CisK
K2VudW0gUGFkZGluZ1R5cGUgeworICAgIFRvcFBhZGRpbmcsCisgICAgUmlnaHRQYWRkaW5nLAor
ICAgIEJvdHRvbVBhZGRpbmcsCisgICAgTGVmdFBhZGRpbmcKK307CisKK3N0YXRpYyBjb25zdCBp
bnQgc3R5bGVkTWVudUxpc3RJbnRlcm5hbFBhZGRpbmdbNF0gPSB7IDEsIDQsIDEsIDQgfTsKKwor
Ly8gVGhlIGRlZmF1bHQgdmFyaWFibGUtd2lkdGggZm9udCBzaXplLiAgV2UgdXNlIHRoaXMgYXMg
dGhlIGRlZmF1bHQgZm9udAorLy8gc2l6ZSBmb3IgdGhlICJzeXN0ZW0gZm9udCIsIGFuZCBhcyBh
IGJhc2Ugc2l6ZSAod2hpY2ggd2UgdGhlbiBzaHJpbmspIGZvcgorLy8gZm9ybSBjb250cm9sIGZv
bnRzLgorc3RhdGljIGZsb2F0IGRlZmF1bHRGb250U2l6ZSA9IDE2LjA7CisKK3N0YXRpYyBGb250
RGVzY3JpcHRpb24gc21hbGxTeXN0ZW1Gb250Oworc3RhdGljIEZvbnREZXNjcmlwdGlvbiBtZW51
Rm9udDsKK3N0YXRpYyBGb250RGVzY3JpcHRpb24gbGFiZWxGb250OworCitib29sIFJlbmRlclRo
ZW1lQ2hyb21pdW1XaW46Om1fZmluZEluUGFnZU1vZGUgPSBmYWxzZTsKKworLy8gSW50ZXJuYWwg
c3RhdGljIGhlbHBlciBmdW5jdGlvbnMuICBXZSBkb24ndCBwdXQgdGhlbSBpbiBhbiBhbm9ueW1v
dXMKKy8vIG5hbWVzcGFjZSBzbyB0aGV5IGhhdmUgZWFzaWVyIGFjY2VzcyB0byB0aGUgV2ViQ29y
ZSBuYW1lc3BhY2UuCisKK3N0YXRpYyBib29sIHN1cHBvcnRzRm9jdXMoQ29udHJvbFBhcnQgYXBw
ZWFyYW5jZSkKK3sKKyAgICBzd2l0Y2ggKGFwcGVhcmFuY2UpIHsKKyAgICBjYXNlIFB1c2hCdXR0
b25QYXJ0OgorICAgIGNhc2UgQnV0dG9uUGFydDoKKyAgICBjYXNlIERlZmF1bHRCdXR0b25QYXJ0
OgorICAgIGNhc2UgVGV4dEZpZWxkUGFydDoKKyAgICBjYXNlIFRleHRBcmVhUGFydDoKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZv
aWQgc2V0Rml4ZWRQYWRkaW5nKFJlbmRlclN0eWxlKiBzdHlsZSwgY29uc3QgaW50IHBhZGRpbmdb
NF0pCit7CisgICAgc3R5bGUtPnNldFBhZGRpbmdMZWZ0KExlbmd0aChwYWRkaW5nW0xlZnRQYWRk
aW5nXSwgRml4ZWQpKTsKKyAgICBzdHlsZS0+c2V0UGFkZGluZ1JpZ2h0KExlbmd0aChwYWRkaW5n
W1JpZ2h0UGFkZGluZ10sIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdUb3AoTGVuZ3Ro
KHBhZGRpbmdbVG9wUGFkZGluZ10sIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBhZGRpbmdCb3R0
b20oTGVuZ3RoKHBhZGRpbmdbQm90dG9tUGFkZGluZ10sIEZpeGVkKSk7Cit9CisKKy8vIFJldHVy
biB0aGUgaGVpZ2h0IG9mIHN5c3RlbSBmb250IHxmb250fCBpbiBwaXhlbHMuICBXZSB1c2UgdGhp
cyBzaXplIGJ5CisvLyBkZWZhdWx0IGZvciBzb21lIG5vbi1mb3JtLWNvbnRyb2wgZWxlbWVudHMu
CitzdGF0aWMgZmxvYXQgc3lzdGVtRm9udFNpemUoY29uc3QgTE9HRk9OVCYgZm9udCkKK3sKKyAg
ICBmbG9hdCBzaXplID0gLWZvbnQubGZIZWlnaHQ7CisgICAgaWYgKHNpemUgPCAwKSB7CisgICAg
ICAgIEhGT05UIGhGb250ID0gQ3JlYXRlRm9udEluZGlyZWN0KCZmb250KTsKKyAgICAgICAgaWYg
KGhGb250KSB7CisgICAgICAgICAgICBIREMgaGRjID0gR2V0REMoMCk7ICAvLyBXaGF0IGFib3V0
IHByaW50aW5nPyAgSXMgdGhpcyB0aGUgcmlnaHQgREM/CisgICAgICAgICAgICBpZiAoaGRjKSB7
CisgICAgICAgICAgICAgICAgSEdESU9CSiBoT2JqZWN0ID0gU2VsZWN0T2JqZWN0KGhkYywgaEZv
bnQpOworICAgICAgICAgICAgICAgIFRFWFRNRVRSSUMgdG07CisgICAgICAgICAgICAgICAgR2V0
VGV4dE1ldHJpY3MoaGRjLCAmdG0pOworICAgICAgICAgICAgICAgIFNlbGVjdE9iamVjdChoZGMs
IGhPYmplY3QpOworICAgICAgICAgICAgICAgIFJlbGVhc2VEQygwLCBoZGMpOworICAgICAgICAg
ICAgICAgIHNpemUgPSB0bS50bUFzY2VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERl
bGV0ZU9iamVjdChoRm9udCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGUgImNvZGVw
YWdlIDkzNiIgYml0IGhlcmUgaXMgZnJvbSBHZWNrbzsgYXBwYXJlbnRseSB0aGlzIGhlbHBzIG1h
a2UKKyAgICAvLyBmb250cyBtb3JlIGxlZ2libGUgaW4gU2ltcGxpZmllZCBDaGluZXNlIHdoZXJl
IHRoZSBkZWZhdWx0IGZvbnQgc2l6ZSBpcworICAgIC8vIHRvbyBzbWFsbC4KKyAgICAvLworICAg
IC8vIEZJWE1FOiBodHRwOi8vYi8xMTE5ODgzIFNpbmNlIHRoaXMgaXMgb25seSB1c2VkIGZvciAi
c21hbGwgY2FwdGlvbiIsCisgICAgLy8gIm1lbnUiLCBhbmQgInN0YXR1cyBiYXIiIG9iamVjdHMs
IEknbSBub3Qgc3VyZSBob3cgbXVjaCB0aGlzIGV2ZW4KKyAgICAvLyBtYXR0ZXJzLiAgUGx1cyB0
aGUgR2Vja28gcGF0Y2ggd2VudCBpbiBiYWNrIGluIDIwMDIsIGFuZCBtYXliZSB0aGlzCisgICAg
Ly8gaXNuJ3QgZXZlbiByZWxldmFudCBhbnltb3JlLiAgV2Ugc2hvdWxkIGludmVzdGlnYXRlIHdo
ZXRoZXIgdGhpcyBzaG91bGQKKyAgICAvLyBiZSByZW1vdmVkLCBvciBwZXJoYXBzIGJyb2FkZW5l
ZCB0byBiZSAiYW55IENKSyBsb2NhbGUiLgorICAgIC8vCisgICAgcmV0dXJuICgoc2l6ZSA8IDEy
LjBmKSAmJiAoR2V0QUNQKCkgPT0gOTM2KSkgPyAxMi4wZiA6IHNpemU7Cit9CisKKy8vIFdlIGFp
bSB0byBtYXRjaCBJRSBoZXJlLgorLy8gLUlFIHVzZXMgYSBmb250IGJhc2VkIG9uIHRoZSBlbmNv
ZGluZyBhcyB0aGUgZGVmYXVsdCBmb250IGZvciBmb3JtIGNvbnRyb2xzLgorLy8gLUdlY2tvIHVz
ZXMgTVMgU2hlbGwgRGxnIChhY3R1YWxseSBjYWxscyBHZXRTdG9ja09iamVjdChERUZBVUxUX0dV
SV9GT05UKSwKKy8vIHdoaWNoIHJldHVybnMgTVMgU2hlbGwgRGxnKQorLy8gLVNhZmFyaSB1c2Vz
IEx1Y2lkYSBHcmFuZGUuCisvLworLy8gRklYTUU6IFRoZSBvbmx5IGNhc2Ugd2hlcmUgd2Uga25v
dyB3ZSBkb24ndCBtYXRjaCBJRSBpcyBmb3IgQU5TSSBlbmNvZGluZ3MuCisvLyBJRSB1c2VzIE1T
IFNoZWxsIERsZyB0aGVyZSwgd2hpY2ggd2UgcmVuZGVyIGluY29ycmVjdGx5IGF0IGNlcnRhaW4g
cGl4ZWwKKy8vIHNpemVzIChlLmcuIDE1cHgpLiBTbywgZm9yIG5vdyB3ZSBqdXN0IHVzZSBBcmlh
bC4KK3N0YXRpYyB3Y2hhcl90KiBkZWZhdWx0R1VJRm9udChEb2N1bWVudCogZG9jdW1lbnQpCit7
CisgICAgVVNjcmlwdENvZGUgZG9taW5hbnRTY3JpcHQgPSBkb2N1bWVudC0+ZG9taW5hbnRTY3Jp
cHQoKTsKKyAgICBjb25zdCB3Y2hhcl90KiBmYW1pbHkgPSBOVUxMOworCisgICAgLy8gRklYTUU6
IFNwZWNpYWwtY2FzaW5nIG9mIExhdGluL0dyZWVlay9DeXJpbGxpYyBzaG91bGQgZ28gYXdheSBv
bmNlCisgICAgLy8gR2V0Rm9udEZhbWlseUZvclNjcmlwdCBpcyBlbmhhbmNlZCB0byBzdXBwb3J0
IEdlbmVyaWNGYW1pbHlUeXBlIGZvcgorICAgIC8vIHJlYWwuIEZvciBub3csIHdlIG1ha2Ugc3Vy
ZSB0aGF0IHdlIHVzZSBBcmlhbCB0byBtYXRjaCBJRSBmb3IgdGhvc2UKKyAgICAvLyBzY3JpcHRz
LgorICAgIGlmIChkb21pbmFudFNjcmlwdCAhPSBVU0NSSVBUX0xBVElOICYmCisgICAgICAgIGRv
bWluYW50U2NyaXB0ICE9IFVTQ1JJUFRfQ1lSSUxMSUMgJiYKKyAgICAgICAgZG9taW5hbnRTY3Jp
cHQgIT0gVVNDUklQVF9HUkVFSyAmJgorICAgICAgICBkb21pbmFudFNjcmlwdCAhPSBVU0NSSVBU
X0lOVkFMSURfQ09ERSkgeworICAgICAgICBmYW1pbHkgPSBnZXRGb250RmFtaWx5Rm9yU2NyaXB0
KGRvbWluYW50U2NyaXB0LCBGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKKyAgICAgICAgaWYg
KGZhbWlseSkKKyAgICAgICAgICAgIHJldHVybiBjb25zdF9jYXN0PHdjaGFyX3QqPihmYW1pbHkp
OworICAgIH0KKyAgICByZXR1cm4gTCJBcmlhbCI7Cit9CisKKy8vIENvbnZlcnRzIHxwb2ludHN8
IHRvIHBpeGVscy4gIE9uZSBwb2ludCBpcyAxLzcyIG9mIGFuIGluY2guCitzdGF0aWMgZmxvYXQg
cG9pbnRzVG9QaXhlbHMoZmxvYXQgcG9pbnRzKQoreworICAgIHN0YXRpYyBmbG9hdCBwaXhlbHNQ
ZXJJbmNoID0gMC4wZjsKKyAgICBpZiAoIXBpeGVsc1BlckluY2gpIHsKKyAgICAgICAgSERDIGhk
YyA9IEdldERDKDApOyAgLy8gV2hhdCBhYm91dCBwcmludGluZz8gIElzIHRoaXMgdGhlIHJpZ2h0
IERDPworICAgICAgICBpZiAoaGRjKSB7ICAvLyBDYW4gdGhpcyBldmVyIGFjdHVhbGx5IGJlIE5V
TEw/CisgICAgICAgICAgICBwaXhlbHNQZXJJbmNoID0gR2V0RGV2aWNlQ2FwcyhoZGMsIExPR1BJ
WEVMU1kpOworICAgICAgICAgICAgUmVsZWFzZURDKDAsIGhkYyk7CisgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICBwaXhlbHNQZXJJbmNoID0gOTYuMGY7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICBzdGF0aWMgY29uc3QgZmxvYXQgcG9pbnRzUGVySW5jaCA9IDcyLjBmOworICAgIHJldHVy
biBwb2ludHMgLyBwb2ludHNQZXJJbmNoICogcGl4ZWxzUGVySW5jaDsKK30KKworc3RhdGljIHZv
aWQgc2V0U2l6ZUlmQXV0byhSZW5kZXJTdHlsZSogc3R5bGUsIGNvbnN0IEludFNpemUmIHNpemUp
Cit7CisgICAgaWYgKHN0eWxlLT53aWR0aCgpLmlzSW50cmluc2ljT3JBdXRvKCkpCisgICAgICAg
IHN0eWxlLT5zZXRXaWR0aChMZW5ndGgoc2l6ZS53aWR0aCgpLCBGaXhlZCkpOworICAgIGlmIChz
dHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCisgICAgICAgIHN0eWxlLT5zZXRIZWlnaHQoTGVuZ3Ro
KHNpemUuaGVpZ2h0KCksIEZpeGVkKSk7Cit9CisKK3N0YXRpYyBkb3VibGUgcXVlcnlTeXN0ZW1C
bGlua0ludGVydmFsKGRvdWJsZSBkZWZhdWx0SW50ZXJ2YWwpCit7CisgICAgVUlOVCBibGlua1Rp
bWUgPSBHZXRDYXJldEJsaW5rVGltZSgpOworICAgIGlmIChibGlua1RpbWUgPT0gMCkKKyAgICAg
ICAgcmV0dXJuIGRlZmF1bHRJbnRlcnZhbDsKKyAgICBpZiAoYmxpbmtUaW1lID09IElORklOSVRF
KQorICAgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gYmxpbmtUaW1lIC8gMTAwMC4wOworfQor
CisvLyBJbXBsZW1lbnQgV2ViQ29yZTo6dGhlbWUoKSBmb3IgZ2V0dGluZyB0aGUgZ2xvYmFsIFJl
bmRlclRoZW1lLgorUmVuZGVyVGhlbWUqIHRoZW1lKCkKK3sKKyAgICBzdGF0aWMgUmVuZGVyVGhl
bWVDaHJvbWl1bVdpbiB3aW5UaGVtZTsKKyAgICByZXR1cm4gJndpblRoZW1lOworfQorCitTdHJp
bmcgUmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6ZXh0cmFEZWZhdWx0U3R5bGVTaGVldCgpCit7Cisg
ICAgcmV0dXJuIFN0cmluZyh0aGVtZVdpblVzZXJBZ2VudFN0eWxlU2hlZXQsIHNpemVvZih0aGVt
ZVdpblVzZXJBZ2VudFN0eWxlU2hlZXQpKTsKK30KKworU3RyaW5nIFJlbmRlclRoZW1lQ2hyb21p
dW1XaW46OmV4dHJhUXVpcmtzU3R5bGVTaGVldCgpCit7CisgICAgcmV0dXJuIFN0cmluZyh0aGVt
ZVdpblF1aXJrc1VzZXJBZ2VudFN0eWxlU2hlZXQsIHNpemVvZih0aGVtZVdpblF1aXJrc1VzZXJB
Z2VudFN0eWxlU2hlZXQpKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpzdXBw
b3J0c0ZvY3VzUmluZyhjb25zdCBSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAvLyBM
ZXQgd2Via2l0IGRyYXcgb25lIG9mIGl0cyBoYWxvIHJpbmdzIGFyb3VuZCBhbnkgZm9jdXNlZCBl
bGVtZW50LAorICAgLy8gZXhjZXB0IHB1c2ggYnV0dG9ucy4gRm9yIGJ1dHRvbnMgd2UgdXNlIHRo
ZSB3aW5kb3dzIFBCU19ERUZBVUxURUQKKyAgIC8vIHN0eWxpbmcgdG8gZ2l2ZSBpdCBhIGJsdWUg
Ym9yZGVyLgorICAgcmV0dXJuIHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gQnV0dG9uUGFydAorICAg
ICAgIHx8IHN0eWxlLT5hcHBlYXJhbmNlKCkgPT0gUHVzaEJ1dHRvblBhcnQ7Cit9CisKK0NvbG9y
IFJlbmRlclRoZW1lQ2hyb21pdW1XaW46OnBsYXRmb3JtQWN0aXZlU2VsZWN0aW9uQmFja2dyb3Vu
ZENvbG9yKCkgY29uc3QKK3sKKyAgICBpZiAoQ2hyb21pdW1CcmlkZ2U6OmxheW91dFRlc3RNb2Rl
KCkpCisgICAgICAgIHJldHVybiBDb2xvcigiIzAwMDBGRiIpOyAgLy8gUm95YWwgYmx1ZS4KKyAg
ICBpZiAobV9maW5kSW5QYWdlTW9kZSkKKyAgICAgICAgcmV0dXJuIENvbG9yKDI1NSwgMTUwLCA1
MCwgMjAwKTsgIC8vIE9yYW5nZS4KKyAgICBDT0xPUlJFRiBjb2xvciA9IEdldFN5c0NvbG9yKENP
TE9SX0hJR0hMSUdIVCk7CisgICAgcmV0dXJuIENvbG9yKEdldFJWYWx1ZShjb2xvciksIEdldEdW
YWx1ZShjb2xvciksIEdldEJWYWx1ZShjb2xvciksIDI1NSk7Cit9CisKK0NvbG9yIFJlbmRlclRo
ZW1lQ2hyb21pdW1XaW46OnBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3Io
KSBjb25zdAoreworICAgIGlmIChDaHJvbWl1bUJyaWRnZTo6bGF5b3V0VGVzdE1vZGUoKSkKKyAg
ICAgICAgcmV0dXJuIENvbG9yKCIjOTk5OTk5Iik7ICAvLyBNZWRpdW0gZ3JheS4KKyAgICBpZiAo
bV9maW5kSW5QYWdlTW9kZSkKKyAgICAgICAgcmV0dXJuIENvbG9yKDI1NSwgMTUwLCA1MCwgMjAw
KTsgIC8vIE9yYW5nZS4KKyAgICBDT0xPUlJFRiBjb2xvciA9IEdldFN5c0NvbG9yKENPTE9SX0dS
QVlURVhUKTsKKyAgICByZXR1cm4gQ29sb3IoR2V0UlZhbHVlKGNvbG9yKSwgR2V0R1ZhbHVlKGNv
bG9yKSwgR2V0QlZhbHVlKGNvbG9yKSwgMjU1KTsKK30KKworQ29sb3IgUmVuZGVyVGhlbWVDaHJv
bWl1bVdpbjo6cGxhdGZvcm1BY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29sb3IoKSBjb25zdAor
eworICAgIGlmIChDaHJvbWl1bUJyaWRnZTo6bGF5b3V0VGVzdE1vZGUoKSkKKyAgICAgICAgcmV0
dXJuIENvbG9yKCIjRkZGRkNDIik7ICAvLyBQYWxlIHllbGxvdy4KKyAgICBDT0xPUlJFRiBjb2xv
ciA9IEdldFN5c0NvbG9yKENPTE9SX0hJR0hMSUdIVFRFWFQpOworICAgIHJldHVybiBDb2xvcihH
ZXRSVmFsdWUoY29sb3IpLCBHZXRHVmFsdWUoY29sb3IpLCBHZXRCVmFsdWUoY29sb3IpLCAyNTUp
OworfQorCitDb2xvciBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwbGF0Zm9ybUluYWN0aXZlU2Vs
ZWN0aW9uRm9yZWdyb3VuZENvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gQ29sb3I6OndoaXRl
OworfQorCitDb2xvciBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwbGF0Zm9ybVRleHRTZWFyY2hI
aWdobGlnaHRDb2xvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIENvbG9yKDI1NSwgMjU1LCAxNTAp
OworfQorCitkb3VibGUgUmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6Y2FyZXRCbGlua0ludGVydmFs
KCkgY29uc3QKK3sKKyAgICAvLyBEaXNhYmxlIHRoZSBibGlua2luZyBjYXJldCBpbiBsYXlvdXQg
dGVzdCBtb2RlLCBhcyBpdCBpbnRyb2R1Y2VzCisgICAgLy8gYSByYWNlIGNvbmRpdGlvbiBmb3Ig
dGhlIHBpeGVsIHRlc3RzLiBodHRwOi8vYi8xMTk4NDQwCisgICAgaWYgKENocm9taXVtQnJpZGdl
OjpsYXlvdXRUZXN0TW9kZSgpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vIFRoaXMgaW52
b2x2ZXMgYSBzeXN0ZW0gY2FsbCwgc28gd2UgY2FjaGUgdGhlIHJlc3VsdC4KKyAgICBzdGF0aWMg
ZG91YmxlIGJsaW5rSW50ZXJ2YWwgPSBxdWVyeVN5c3RlbUJsaW5rSW50ZXJ2YWwoUmVuZGVyVGhl
bWU6OmNhcmV0QmxpbmtJbnRlcnZhbCgpKTsKKyAgICByZXR1cm4gYmxpbmtJbnRlcnZhbDsKK30K
Kwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpzeXN0ZW1Gb250KGludCBwcm9wSWQsIERv
Y3VtZW50KiBkb2N1bWVudCwgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24pIGNvbnN0
Cit7CisgICAgLy8gVGhpcyBsb2dpYyBvd2VzIG11Y2ggdG8gUmVuZGVyVGhlbWVTYWZhcmkuY3Bw
LgorICAgIEZvbnREZXNjcmlwdGlvbiogY2FjaGVkRGVzYyA9IE5VTEw7CisgICAgd2NoYXJfdCog
ZmFjZU5hbWUgPSAwOworICAgIGZsb2F0IGZvbnRTaXplID0gMDsKKyAgICBzd2l0Y2ggKHByb3BJ
ZCkgeworICAgIGNhc2UgQ1NTVmFsdWVTbWFsbENhcHRpb246CisgICAgICAgIGNhY2hlZERlc2Mg
PSAmc21hbGxTeXN0ZW1Gb250OworICAgICAgICBpZiAoIXNtYWxsU3lzdGVtRm9udC5pc0Fic29s
dXRlU2l6ZSgpKSB7CisgICAgICAgICAgICBOT05DTElFTlRNRVRSSUNTIG1ldHJpY3M7CisgICAg
ICAgICAgICBnZXROb25DbGllbnRNZXRyaWNzKCZtZXRyaWNzKTsKKyAgICAgICAgICAgIGZhY2VO
YW1lID0gbWV0cmljcy5sZlNtQ2FwdGlvbkZvbnQubGZGYWNlTmFtZTsKKyAgICAgICAgICAgIGZv
bnRTaXplID0gc3lzdGVtRm9udFNpemUobWV0cmljcy5sZlNtQ2FwdGlvbkZvbnQpOworICAgICAg
ICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ1NTVmFsdWVNZW51OgorICAgICAgICBjYWNo
ZWREZXNjID0gJm1lbnVGb250OworICAgICAgICBpZiAoIW1lbnVGb250LmlzQWJzb2x1dGVTaXpl
KCkpIHsKKyAgICAgICAgICAgIE5PTkNMSUVOVE1FVFJJQ1MgbWV0cmljczsKKyAgICAgICAgICAg
IGdldE5vbkNsaWVudE1ldHJpY3MoJm1ldHJpY3MpOworICAgICAgICAgICAgZmFjZU5hbWUgPSBt
ZXRyaWNzLmxmTWVudUZvbnQubGZGYWNlTmFtZTsKKyAgICAgICAgICAgIGZvbnRTaXplID0gc3lz
dGVtRm9udFNpemUobWV0cmljcy5sZk1lbnVGb250KTsKKyAgICAgICAgfQorICAgICAgICBicmVh
azsKKyAgICBjYXNlIENTU1ZhbHVlU3RhdHVzQmFyOgorICAgICAgICBjYWNoZWREZXNjID0gJmxh
YmVsRm9udDsKKyAgICAgICAgaWYgKCFsYWJlbEZvbnQuaXNBYnNvbHV0ZVNpemUoKSkgeworICAg
ICAgICAgICAgTk9OQ0xJRU5UTUVUUklDUyBtZXRyaWNzOworICAgICAgICAgICAgZ2V0Tm9uQ2xp
ZW50TWV0cmljcygmbWV0cmljcyk7CisgICAgICAgICAgICBmYWNlTmFtZSA9IG1ldHJpY3MubGZT
dGF0dXNGb250LmxmRmFjZU5hbWU7CisgICAgICAgICAgICBmb250U2l6ZSA9IHN5c3RlbUZvbnRT
aXplKG1ldHJpY3MubGZTdGF0dXNGb250KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAg
ICBjYXNlIENTU1ZhbHVlV2Via2l0TWluaUNvbnRyb2w6CisgICAgY2FzZSBDU1NWYWx1ZVdlYmtp
dFNtYWxsQ29udHJvbDoKKyAgICBjYXNlIENTU1ZhbHVlV2Via2l0Q29udHJvbDoKKyAgICAgICAg
ZmFjZU5hbWUgPSBkZWZhdWx0R1VJRm9udChkb2N1bWVudCk7CisgICAgICAgIC8vIFdoeSAyIHBv
aW50cyBzbWFsbGVyPyAgQmVjYXVzZSB0aGF0J3Mgd2hhdCBHZWNrbyBkb2VzLgorICAgICAgICBm
b250U2l6ZSA9IGRlZmF1bHRGb250U2l6ZSAtIHBvaW50c1RvUGl4ZWxzKDIpOworICAgICAgICBi
cmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBmYWNlTmFtZSA9IGRlZmF1bHRHVUlGb250KGRv
Y3VtZW50KTsKKyAgICAgICAgZm9udFNpemUgPSBkZWZhdWx0Rm9udFNpemU7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKworICAgIGlmICghY2FjaGVkRGVzYykKKyAgICAgICAgY2FjaGVkRGVzYyA9
ICZmb250RGVzY3JpcHRpb247CisKKyAgICBpZiAoZm9udFNpemUpIHsKKyAgICAgICAgQVNTRVJU
KGZhY2VOYW1lKTsKKyAgICAgICAgY2FjaGVkRGVzYy0+Zmlyc3RGYW1pbHkoKS5zZXRGYW1pbHko
QXRvbWljU3RyaW5nKGZhY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgd2NzbGVuKGZhY2VOYW1lKSkpOworICAgICAgICBjYWNo
ZWREZXNjLT5zZXRJc0Fic29sdXRlU2l6ZSh0cnVlKTsKKyAgICAgICAgY2FjaGVkRGVzYy0+c2V0
R2VuZXJpY0ZhbWlseShGb250RGVzY3JpcHRpb246Ok5vRmFtaWx5KTsKKyAgICAgICAgY2FjaGVk
RGVzYy0+c2V0U3BlY2lmaWVkU2l6ZShmb250U2l6ZSk7CisgICAgICAgIGNhY2hlZERlc2MtPnNl
dFdlaWdodChGb250V2VpZ2h0Tm9ybWFsKTsKKyAgICAgICAgY2FjaGVkRGVzYy0+c2V0SXRhbGlj
KGZhbHNlKTsKKyAgICB9CisgICAgZm9udERlc2NyaXB0aW9uID0gKmNhY2hlZERlc2M7Cit9CisK
K2ludCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjptaW5pbXVtTWVudUxpc3RTaXplKFJlbmRlclN0
eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBSZW5kZXJUaGVt
ZUNocm9taXVtV2luOjpzZXRDaGVja2JveFNpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAor
eworICAgIC8vIElmIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBib3RoIHNwZWNpZmllZCwgdGhl
biB3ZSBoYXZlIG5vdGhpbmcgdG8gZG8uCisgICAgaWYgKCFzdHlsZS0+d2lkdGgoKS5pc0ludHJp
bnNpY09yQXV0bygpICYmICFzdHlsZS0+aGVpZ2h0KCkuaXNBdXRvKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIC8vIEZJWE1FOiAgQSBoYXJkLWNvZGVkIHNpemUgb2YgMTMgaXMgdXNlZC4gIFRo
aXMgaXMgd3JvbmcgYnV0IG5lY2Vzc2FyeQorICAgIC8vIGZvciBub3cuICBJdCBtYXRjaGVzIEZp
cmVmb3guICBBdCBkaWZmZXJlbnQgRFBJIHNldHRpbmdzIG9uIFdpbmRvd3MsCisgICAgLy8gcXVl
cnlpbmcgdGhlIHRoZW1lIGdpdmVzIHlvdSBhIGxhcmdlciBzaXplIHRoYXQgYWNjb3VudHMgZm9y
IHRoZSBoaWdoZXIKKyAgICAvLyBEUEkuICBVbnRpbCBvdXIgZW50aXJlIGVuZ2luZSBob25vcnMg
YSBEUEkgc2V0dGluZyBvdGhlciB0aGFuIDk2LCB3ZQorICAgIC8vIGNhbid0IHJlbHkgb24gdGhl
IHRoZW1lJ3MgbWV0cmljcy4KKyAgICBjb25zdCBJbnRTaXplIHNpemUoMTMsIDEzKTsKKyAgICBz
ZXRTaXplSWZBdXRvKHN0eWxlLCBzaXplKTsKK30KKwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVt
V2luOjpzZXRSYWRpb1NpemUoUmVuZGVyU3R5bGUqIHN0eWxlKSBjb25zdAoreworICAgIC8vIFVz
ZSBzYW1lIHNpemluZyBmb3IgcmFkaW8gYm94IGFzIGNoZWNrYm94LgorICAgIHNldENoZWNrYm94
U2l6ZShzdHlsZSk7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cGFpbnRCdXR0
b24oUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29u
c3QgSW50UmVjdCYgcikKK3sKKyAgICBjb25zdCBUaGVtZURhdGEmIHRoZW1lRGF0YSA9IGdldFRo
ZW1lRGF0YShvKTsKKworICAgIFdlYkNvcmU6OlRoZW1lSGVscGVyV2luIGhlbHBlcihpLmNvbnRl
eHQsIHIpOworICAgIENocm9taXVtQnJpZGdlOjpwYWludEJ1dHRvbihoZWxwZXIuY29udGV4dCgp
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZURhdGEubV9wYXJ0LAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVtZURhdGEubV9zdGF0ZSwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgdGhlbWVEYXRhLm1fY2xhc3NpY1N0YXRlLAorICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXIucmVjdCgpKTsKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK2Jvb2wgUmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cGFpbnRUZXh0RmllbGQoUmVu
ZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3QgSW50
UmVjdCYgcikKK3sKKyAgICByZXR1cm4gcGFpbnRUZXh0RmllbGRJbnRlcm5hbChvLCBpLCByLCB0
cnVlKTsKK30KKworYm9vbCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludFNlYXJjaEZpZWxk
KFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0
IEludFJlY3QmIHIpCit7CisgICAgcmV0dXJuIHBhaW50VGV4dEZpZWxkKG8sIGksIHIpOworfQor
Cit2b2lkIFJlbmRlclRoZW1lQ2hyb21pdW1XaW46OmFkanVzdE1lbnVMaXN0U3R5bGUoQ1NTU3R5
bGVTZWxlY3Rvciogc2VsZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29u
c3QKK3sKKyAgICAvLyBIZWlnaHQgaXMgbG9ja2VkIHRvIGF1dG8gb24gYWxsIGJyb3dzZXJzLgor
ICAgIHN0eWxlLT5zZXRMaW5lSGVpZ2h0KFJlbmRlclN0eWxlOjppbml0aWFsTGluZUhlaWdodCgp
KTsKK30KKworLy8gVXNlZCB0byBwYWludCB1bnN0eWxlZCBtZW51bGlzdHMgKGkuZS4gd2l0aCB0
aGUgZGVmYXVsdCBib3JkZXIpCitib29sIFJlbmRlclRoZW1lQ2hyb21pdW1XaW46OnBhaW50TWVu
dUxpc3QoUmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwg
Y29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBpbnQgYm9yZGVyUmlnaHQgPSBvLT5ib3JkZXJSaWdo
dCgpOworICAgIGludCBib3JkZXJMZWZ0ID0gby0+Ym9yZGVyTGVmdCgpOworICAgIGludCBib3Jk
ZXJUb3AgPSBvLT5ib3JkZXJUb3AoKTsKKyAgICBpbnQgYm9yZGVyQm90dG9tID0gby0+Ym9yZGVy
Qm90dG9tKCk7CisKKyAgICAvLyBJZiBhbGwgdGhlIGJvcmRlcnMgYXJlIDAsIHRoZW4gdGVsbCBz
a2lhIG5vdCB0byBwYWludCB0aGUgYm9yZGVyIG9uIHRoZQorICAgIC8vIHRleHRmaWVsZC4gIEZJ
WE1FOiBodHRwOi8vYi8xMjEwMDE3IEZpZ3VyZSBvdXQgaG93IHRvIGdldCBXaW5kb3dzIHRvIG5v
dAorICAgIC8vIGRyYXcgaW5kaXZpZHVhbCBib3JkZXJzIGFuZCB0aGVuIHBhc3MgdGhhdCB0byBz
a2lhIHNvIHdlIGNhbiBhdm9pZAorICAgIC8vIGRyYXdpbmcgYW55IGJvcmRlcnMgdGhhdCBhcmUg
c2V0IHRvIDAuIEZvciBub24temVybyBib3JkZXJzLCB3ZSBkcmF3IHRoZQorICAgIC8vIGJvcmRl
ciwgYnV0IHdlYmtpdCBqdXN0IGRyYXdzIG92ZXIgaXQuCisgICAgYm9vbCBkcmF3RWRnZXMgPSAh
KGJvcmRlclJpZ2h0ID09IDAgJiYgYm9yZGVyTGVmdCA9PSAwICYmIGJvcmRlclRvcCA9PSAwICYm
IGJvcmRlckJvdHRvbSA9PSAwKTsKKworICAgIHBhaW50VGV4dEZpZWxkSW50ZXJuYWwobywgaSwg
ciwgZHJhd0VkZ2VzKTsKKworICAgIC8vIFRha2UgcGFkZGluZyBhbmQgYm9yZGVyIGludG8gYWNj
b3VudC4gIElmIHRoZSBNZW51TGlzdCBpcyBzbWFsbGVyIHRoYW4KKyAgICAvLyB0aGUgc2l6ZSBv
ZiBhIGJ1dHRvbiwgbWFrZSBzdXJlIHRvIHNocmluayBpdCBhcHByb3ByaWF0ZWx5IGFuZCBub3Qg
cHV0CisgICAgLy8gaXRzIHggcG9zaXRpb24gdG8gdGhlIGxlZnQgb2YgdGhlIG1lbnVsaXN0Lgor
ICAgIGNvbnN0IGludCBidXR0b25XaWR0aCA9IEdldFN5c3RlbU1ldHJpY3MoU01fQ1hWU0NST0xM
KTsKKyAgICBpbnQgc3BhY2luZ0xlZnQgPSBib3JkZXJMZWZ0ICsgby0+cGFkZGluZ0xlZnQoKTsK
KyAgICBpbnQgc3BhY2luZ1JpZ2h0ID0gYm9yZGVyUmlnaHQgKyBvLT5wYWRkaW5nUmlnaHQoKTsK
KyAgICBpbnQgc3BhY2luZ1RvcCA9IGJvcmRlclRvcCArIG8tPnBhZGRpbmdUb3AoKTsKKyAgICBp
bnQgc3BhY2luZ0JvdHRvbSA9IGJvcmRlckJvdHRvbSArIG8tPnBhZGRpbmdCb3R0b20oKTsKKwor
ICAgIGludCBidXR0b25YOworICAgIGlmIChyLnJpZ2h0KCkgLSByLngoKSA8IGJ1dHRvbldpZHRo
KQorICAgICAgICBidXR0b25YID0gci54KCk7CisgICAgZWxzZQorICAgICAgICBidXR0b25YID0g
by0+c3R5bGUoKS0+ZGlyZWN0aW9uKCkgPT0gTFRSID8gci5yaWdodCgpIC0gc3BhY2luZ1JpZ2h0
IC0gYnV0dG9uV2lkdGggOiByLngoKSArIHNwYWNpbmdMZWZ0OworCisgICAgLy8gQ29tcHV0ZSB0
aGUgcmVjdGFuZ2xlIG9mIHRoZSBidXR0b24gaW4gdGhlIGRlc3RpbmF0aW9uIGltYWdlLgorICAg
IEludFJlY3QgcmVjdChidXR0b25YLAorICAgICAgICAgICAgICAgICByLnkoKSArIHNwYWNpbmdU
b3AsCisgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGJ1dHRvbldpZHRoLCByLnJpZ2h0KCkgLSBy
LngoKSksCisgICAgICAgICAgICAgICAgIHIuaGVpZ2h0KCkgLSAoc3BhY2luZ1RvcCArIHNwYWNp
bmdCb3R0b20pKTsKKworICAgIC8vIEdldCB0aGUgY29ycmVjdCB0aGVtZSBkYXRhIGZvciBhIHRl
eHRmaWVsZCBhbmQgcGFpbnQgdGhlIG1lbnUuCisgICAgV2ViQ29yZTo6VGhlbWVIZWxwZXJXaW4g
aGVscGVyKGkuY29udGV4dCwgcmVjdCk7CisgICAgQ2hyb21pdW1CcmlkZ2U6OnBhaW50TWVudUxp
c3QoaGVscGVyLmNvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBD
UF9EUk9QRE9XTkJVVFRPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRl
cm1pbmVTdGF0ZShvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1p
bmVDbGFzc2ljU3RhdGUobyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVs
cGVyLnJlY3QoKSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFJlbmRlclRoZW1lQ2hy
b21pdW1XaW46OmFkanVzdE1lbnVMaXN0QnV0dG9uU3R5bGUoQ1NTU3R5bGVTZWxlY3Rvciogc2Vs
ZWN0b3IsIFJlbmRlclN0eWxlKiBzdHlsZSwgRWxlbWVudCogZSkgY29uc3QKK3sKKyAgICBhZGp1
c3RNZW51TGlzdFN0eWxlKHNlbGVjdG9yLCBzdHlsZSwgZSk7Cit9CisKKy8vIFVzZWQgdG8gcGFp
bnQgc3R5bGVkIG1lbnVsaXN0cyAoaS5lLiB3aXRoIGEgbm9uLWRlZmF1bHQgYm9yZGVyKQorYm9v
bCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVj
dCogbywgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIp
Cit7CisgICAgcmV0dXJuIHBhaW50TWVudUxpc3QobywgaSwgcik7Cit9CisKK2ludCBSZW5kZXJU
aGVtZUNocm9taXVtV2luOjpwb3B1cEludGVybmFsUGFkZGluZ0xlZnQoUmVuZGVyU3R5bGUqIHN0
eWxlKSBjb25zdAoreworICAgIHJldHVybiBtZW51TGlzdEludGVybmFsUGFkZGluZyhzdHlsZSwg
TGVmdFBhZGRpbmcpOworfQorCitpbnQgUmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cG9wdXBJbnRl
cm5hbFBhZGRpbmdSaWdodChSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1lbnVMaXN0SW50ZXJuYWxQYWRkaW5nKHN0eWxlLCBSaWdodFBhZGRpbmcpOworfQorCitpbnQg
UmVuZGVyVGhlbWVDaHJvbWl1bVdpbjo6cG9wdXBJbnRlcm5hbFBhZGRpbmdUb3AoUmVuZGVyU3R5
bGUqIHN0eWxlKSBjb25zdAoreworICAgIHJldHVybiBtZW51TGlzdEludGVybmFsUGFkZGluZyhz
dHlsZSwgVG9wUGFkZGluZyk7Cit9CisKK2ludCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpwb3B1
cEludGVybmFsUGFkZGluZ0JvdHRvbShSZW5kZXJTdHlsZSogc3R5bGUpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1lbnVMaXN0SW50ZXJuYWxQYWRkaW5nKHN0eWxlLCBCb3R0b21QYWRkaW5nKTsKK30K
Kwordm9pZCBSZW5kZXJUaGVtZUNocm9taXVtV2luOjphZGp1c3RCdXR0b25Jbm5lclN0eWxlKFJl
bmRlclN0eWxlKiBzdHlsZSkgY29uc3QKK3sKKyAgICAvLyBUaGlzIGlubmVyIHBhZGRpbmcgbWF0
Y2hlcyBGaXJlZm94LgorICAgIHN0eWxlLT5zZXRQYWRkaW5nVG9wKExlbmd0aCgxLCBGaXhlZCkp
OworICAgIHN0eWxlLT5zZXRQYWRkaW5nUmlnaHQoTGVuZ3RoKDMsIEZpeGVkKSk7CisgICAgc3R5
bGUtPnNldFBhZGRpbmdCb3R0b20oTGVuZ3RoKDEsIEZpeGVkKSk7CisgICAgc3R5bGUtPnNldFBh
ZGRpbmdMZWZ0KExlbmd0aCgzLCBGaXhlZCkpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgUmVuZGVy
VGhlbWVDaHJvbWl1bVdpbjo6c2V0RGVmYXVsdEZvbnRTaXplKGludCBmb250U2l6ZSkgeworICAg
IGRlZmF1bHRGb250U2l6ZSA9IHN0YXRpY19jYXN0PGZsb2F0Pihmb250U2l6ZSk7CisKKyAgICAv
LyBSZXNldCBjYWNoZWQgZm9udHMuCisgICAgc21hbGxTeXN0ZW1Gb250ID0gbWVudUZvbnQgPSBs
YWJlbEZvbnQgPSBGb250RGVzY3JpcHRpb24oKTsKK30KKwordW5zaWduZWQgUmVuZGVyVGhlbWVD
aHJvbWl1bVdpbjo6ZGV0ZXJtaW5lU3RhdGUoUmVuZGVyT2JqZWN0KiBvKQoreworICAgIHVuc2ln
bmVkIHJlc3VsdCA9IFRTX05PUk1BTDsKKyAgICBDb250cm9sUGFydCBhcHBlYXJhbmNlID0gby0+
c3R5bGUoKS0+YXBwZWFyYW5jZSgpOworICAgIGlmICghaXNFbmFibGVkKG8pKQorICAgICAgICBy
ZXN1bHQgPSBUU19ESVNBQkxFRDsKKyAgICBlbHNlIGlmIChpc1JlYWRPbmx5Q29udHJvbChvKSAm
JiAoVGV4dEZpZWxkUGFydCA9PSBhcHBlYXJhbmNlIHx8IFRleHRBcmVhUGFydCA9PSBhcHBlYXJh
bmNlKSkKKyAgICAgICAgcmVzdWx0ID0gRVRTX1JFQURPTkxZOyAvLyBSZWFkb25seSBpcyBzdXBw
b3J0ZWQgb24gdGV4dGZpZWxkcy4KKyAgICBlbHNlIGlmIChpc1ByZXNzZWQobykpIC8vIEFjdGl2
ZSBvdmVycmlkZXMgaG92ZXIgYW5kIGZvY3VzZWQuCisgICAgICAgIHJlc3VsdCA9IFRTX1BSRVNT
RUQ7CisgICAgZWxzZSBpZiAoc3VwcG9ydHNGb2N1cyhhcHBlYXJhbmNlKSAmJiBpc0ZvY3VzZWQo
bykpCisgICAgICAgIHJlc3VsdCA9IEVUU19GT0NVU0VEOworICAgIGVsc2UgaWYgKGlzSG92ZXJl
ZChvKSkKKyAgICAgICAgcmVzdWx0ID0gVFNfSE9UOworICAgIGlmIChpc0NoZWNrZWQobykpCisg
ICAgICAgIHJlc3VsdCArPSA0OyAvLyA0IHVuY2hlY2tlZCBzdGF0ZXMsIDQgY2hlY2tlZCBzdGF0
ZXMuCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordW5zaWduZWQgUmVuZGVyVGhlbWVDaHJvbWl1
bVdpbjo6ZGV0ZXJtaW5lQ2xhc3NpY1N0YXRlKFJlbmRlck9iamVjdCogbykKK3sKKyAgICB1bnNp
Z25lZCByZXN1bHQgPSAwOworICAgIGlmICghaXNFbmFibGVkKG8pKQorICAgICAgICByZXN1bHQg
PSBERkNTX0lOQUNUSVZFOworICAgIGVsc2UgaWYgKGlzUHJlc3NlZChvKSkgLy8gQWN0aXZlIHN1
cGVyc2VkZXMgaG92ZXIKKyAgICAgICAgcmVzdWx0ID0gREZDU19QVVNIRUQ7CisgICAgZWxzZSBp
ZiAoaXNIb3ZlcmVkKG8pKQorICAgICAgICByZXN1bHQgPSBERkNTX0hPVDsKKyAgICBpZiAoaXND
aGVja2VkKG8pKQorICAgICAgICByZXN1bHQgfD0gREZDU19DSEVDS0VEOworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK1RoZW1lRGF0YSBSZW5kZXJUaGVtZUNocm9taXVtV2luOjpnZXRUaGVtZURh
dGEoUmVuZGVyT2JqZWN0KiBvKQoreworICAgIFRoZW1lRGF0YSByZXN1bHQ7CisgICAgc3dpdGNo
IChvLT5zdHlsZSgpLT5hcHBlYXJhbmNlKCkpIHsKKyAgICBjYXNlIFB1c2hCdXR0b25QYXJ0Ogor
ICAgIGNhc2UgQnV0dG9uUGFydDoKKyAgICAgICAgcmVzdWx0Lm1fcGFydCA9IEJQX1BVU0hCVVRU
T047CisgICAgICAgIHJlc3VsdC5tX2NsYXNzaWNTdGF0ZSA9IERGQ1NfQlVUVE9OUFVTSDsKKyAg
ICAgICAgYnJlYWs7CisgICAgY2FzZSBDaGVja2JveFBhcnQ6CisgICAgICAgIHJlc3VsdC5tX3Bh
cnQgPSBCUF9DSEVDS0JPWDsKKyAgICAgICAgcmVzdWx0Lm1fY2xhc3NpY1N0YXRlID0gREZDU19C
VVRUT05DSEVDSzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSYWRpb1BhcnQ6CisgICAgICAg
IHJlc3VsdC5tX3BhcnQgPSBCUF9SQURJT0JVVFRPTjsKKyAgICAgICAgcmVzdWx0Lm1fY2xhc3Np
Y1N0YXRlID0gREZDU19CVVRUT05SQURJTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBMaXN0
Ym94UGFydDoKKyAgICBjYXNlIE1lbnVsaXN0UGFydDoKKyAgICBjYXNlIFRleHRGaWVsZFBhcnQ6
CisgICAgY2FzZSBUZXh0QXJlYVBhcnQ6CisgICAgICAgIHJlc3VsdC5tX3BhcnQgPSBFVFNfTk9S
TUFMOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXN1bHQubV9zdGF0ZSA9IGRldGVy
bWluZVN0YXRlKG8pOworICAgIHJlc3VsdC5tX2NsYXNzaWNTdGF0ZSB8PSBkZXRlcm1pbmVDbGFz
c2ljU3RhdGUobyk7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitib29sIFJlbmRlclRoZW1l
Q2hyb21pdW1XaW46OnBhaW50VGV4dEZpZWxkSW50ZXJuYWwoUmVuZGVyT2JqZWN0KiBvLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZW5kZXJPYmpl
Y3Q6OlBhaW50SW5mbyYgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgY29uc3QgSW50UmVjdCYgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgYm9vbCBkcmF3RWRnZXMpCit7CisgICAgLy8gTmFzdHkgaGFjayB0byBtYWtl
IHVzIG5vdCBwYWludCB0aGUgYm9yZGVyIG9uIHRleHQgZmllbGRzIHdpdGggYQorICAgIC8vIGJv
cmRlci1yYWRpdXMuIFdlYmtpdCBwYWludHMgZWxlbWVudHMgd2l0aCBib3JkZXItcmFkaXVzIGZv
ciB1cy4KKyAgICAvLyBGSVhNRTogR2V0IHJpZCBvZiB0aGlzIGlmLWNoZWNrIG9uY2Ugd2UgY2Fu
IHByb3Blcmx5IGNsaXAgcm91bmRlZAorICAgIC8vIGJvcmRlcnM6IGh0dHA6Ly9iLzExMTI2MDQg
YW5kIGh0dHA6Ly9iLzExMDg2MzUKKyAgICAvLyBGSVhNRTogbWFrZSBzdXJlIHdlIGRvIHRoZSBy
aWdodCB0aGluZyBpZiBjc3MgYmFja2dyb3VuZC1jbGlwIGlzIHNldC4KKyAgICBpZiAoby0+c3R5
bGUoKS0+aGFzQm9yZGVyUmFkaXVzKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNv
bnN0IFRoZW1lRGF0YSYgdGhlbWVEYXRhID0gZ2V0VGhlbWVEYXRhKG8pOworCisgICAgV2ViQ29y
ZTo6VGhlbWVIZWxwZXJXaW4gaGVscGVyKGkuY29udGV4dCwgcik7CisgICAgQ2hyb21pdW1Ccmlk
Z2U6OnBhaW50VGV4dEZpZWxkKGhlbHBlci5jb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIHRoZW1lRGF0YS5tX3BhcnQsCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHRoZW1lRGF0YS5tX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICB0aGVtZURhdGEubV9jbGFzc2ljU3RhdGUsCisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGhlbHBlci5yZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgIG8tPnN0eWxlKCktPmJhY2tncm91bmRDb2xvcigpLAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICBkcmF3RWRnZXMpOworICAgIHJldHVybiBmYWxzZTsKK30KKworaW50IFJlbmRlclRoZW1l
Q2hyb21pdW1XaW46Om1lbnVMaXN0SW50ZXJuYWxQYWRkaW5nKFJlbmRlclN0eWxlKiBzdHlsZSwg
aW50IHBhZGRpbmdUeXBlKSBjb25zdAoreworICAgIC8vIFRoaXMgaW50ZXJuYWwgcGFkZGluZyBp
cyBpbiBhZGRpdGlvbiB0byB0aGUgdXNlci1zdXBwbGllZCBwYWRkaW5nLgorICAgIC8vIE1hdGNo
ZXMgdGhlIEZGIGJlaGF2aW9yLgorICAgIGludCBwYWRkaW5nID0gc3R5bGVkTWVudUxpc3RJbnRl
cm5hbFBhZGRpbmdbcGFkZGluZ1R5cGVdOworCisgICAgLy8gUmVzZXJ2ZSB0aGUgc3BhY2UgZm9y
IHJpZ2h0IGFycm93IGhlcmUuIFRoZSByZXN0IG9mIHRoZSBwYWRkaW5nIGlzIHNldAorICAgIC8v
IGJ5IGFkanVzdE1lbnVMaXN0U3R5bGUsIHNpbmNlIFBvcHVwTWVudUNocm9taXVtLmNwcCB1c2Vz
IHRoZSBwYWRkaW5nCisgICAgLy8gZnJvbSBSZW5kZXJNZW51TGlzdCB0byBsYXkgb3V0IHRoZSBp
bmRpdmlkdWFsIGl0ZW1zIGluIHRoZSBwb3B1cC4gIElmCisgICAgLy8gdGhlIE1lbnVMaXN0IGFj
dHVhbGx5IGhhcyBhcHBlYXJhbmNlICJOb0FwcGVhcmFuY2UiLCB0aGVuIHRoYXQgbWVhbnMgd2UK
KyAgICAvLyBkb24ndCBkcmF3IGEgYnV0dG9uLCBzbyBkb24ndCByZXNlcnZlIHNwYWNlIGZvciBp
dC4KKyAgICBjb25zdCBpbnQgYmFyVHlwZSA9IHN0eWxlLT5kaXJlY3Rpb24oKSA9PSBMVFIgPyBS
aWdodFBhZGRpbmcgOiBMZWZ0UGFkZGluZzsKKyAgICBpZiAocGFkZGluZ1R5cGUgPT0gYmFyVHlw
ZSAmJiBzdHlsZS0+YXBwZWFyYW5jZSgpICE9IE5vQ29udHJvbFBhcnQpCisgICAgICAgIHBhZGRp
bmcgKz0gU2Nyb2xsYmFyVGhlbWU6Om5hdGl2ZVRoZW1lKCktPnNjcm9sbGJhclRoaWNrbmVzcygp
OworCisgICAgcmV0dXJuIHBhZGRpbmc7Cit9CisKKy8vIHN0YXRpYwordm9pZCBSZW5kZXJUaGVt
ZUNocm9taXVtV2luOjpzZXRGaW5kSW5QYWdlTW9kZShib29sIGVuYWJsZSkgeworICBpZiAobV9m
aW5kSW5QYWdlTW9kZSA9PSBlbmFibGUpCisgICAgICByZXR1cm47CisKKyAgbV9maW5kSW5QYWdl
TW9kZSA9IGVuYWJsZTsKKyAgdGhlbWUoKS0+cGxhdGZvcm1Db2xvcnNEaWRDaGFuZ2UoKTsKK30K
KworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hy
b21pdW1XaW4uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSByZW5kZXJpbmcvUmVuZGVyVGhlbWVDaHJvbWl1bVdp
bi5oCShyZXZpc2lvbiAwKQorKysgcmVuZGVyaW5nL1JlbmRlclRoZW1lQ2hyb21pdW1XaW4uaAko
cmV2aXNpb24gMCkKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBv
ZiB0aGUgV2ViS2l0IHByb2plY3QuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENv
bXB1dGVyLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIDIwMDkgR29vZ2xlLCBJbmMuCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLwor
CisjaWZuZGVmIFJlbmRlclRoZW1lQ2hyb21pdW1XaW5faAorI2RlZmluZSBSZW5kZXJUaGVtZUNo
cm9taXVtV2luX2gKKworI2luY2x1ZGUgIlJlbmRlclRoZW1lLmgiCisKKyNpZiBXSU4zMgordHlw
ZWRlZiB2b2lkKiBIQU5ETEU7Cit0eXBlZGVmIHN0cnVjdCBISU5TVEFOQ0VfXyogSElOU1RBTkNF
OwordHlwZWRlZiBISU5TVEFOQ0UgSE1PRFVMRTsKKyNlbmRpZgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKKyAgICBzdHJ1Y3QgVGhlbWVEYXRhIHsKKyAgICAgICAgVGhlbWVEYXRhKCkgOiBtX3Bh
cnQoMCksIG1fc3RhdGUoMCksIG1fY2xhc3NpY1N0YXRlKDApIHt9CisKKyAgICAgICAgdW5zaWdu
ZWQgbV9wYXJ0OworICAgICAgICB1bnNpZ25lZCBtX3N0YXRlOworICAgICAgICB1bnNpZ25lZCBt
X2NsYXNzaWNTdGF0ZTsKKyAgICB9OworCisgICAgY2xhc3MgUmVuZGVyVGhlbWVDaHJvbWl1bVdp
biA6IHB1YmxpYyBSZW5kZXJUaGVtZSB7CisgICAgcHVibGljOgorICAgICAgICBSZW5kZXJUaGVt
ZUNocm9taXVtV2luKCkgeyB9CisgICAgICAgIH5SZW5kZXJUaGVtZUNocm9taXVtV2luKCkgeyB9
CisKKyAgICAgICAgdmlydHVhbCBTdHJpbmcgZXh0cmFEZWZhdWx0U3R5bGVTaGVldCgpOworICAg
ICAgICB2aXJ0dWFsIFN0cmluZyBleHRyYVF1aXJrc1N0eWxlU2hlZXQoKTsKKworICAgICAgICAv
LyBBIG1ldGhvZCBhc2tpbmcgaWYgdGhlIHRoZW1lJ3MgY29udHJvbHMgYWN0dWFsbHkgY2FyZSBh
Ym91dCByZWRyYXdpbmcgd2hlbiBob3ZlcmVkLgorICAgICAgICB2aXJ0dWFsIGJvb2wgc3VwcG9y
dHNIb3Zlcihjb25zdCBSZW5kZXJTdHlsZSopIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAg
ICAgICAvLyBBIG1ldGhvZCBhc2tpbmcgaWYgdGhlIHRoZW1lIGlzIGFibGUgdG8gZHJhdyB0aGUg
Zm9jdXMgcmluZy4KKyAgICAgICAgdmlydHVhbCBib29sIHN1cHBvcnRzRm9jdXNSaW5nKGNvbnN0
IFJlbmRlclN0eWxlKikgY29uc3Q7CisKKyAgICAgICAgLy8gVGhlIHBsYXRmb3JtIHNlbGVjdGlv
biBjb2xvci4KKyAgICAgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkJh
Y2tncm91bmRDb2xvcigpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtSW5h
Y3RpdmVTZWxlY3Rpb25CYWNrZ3JvdW5kQ29sb3IoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBD
b2xvciBwbGF0Zm9ybUFjdGl2ZVNlbGVjdGlvbkZvcmVncm91bmRDb2xvcigpIGNvbnN0OworICAg
ICAgICB2aXJ0dWFsIENvbG9yIHBsYXRmb3JtSW5hY3RpdmVTZWxlY3Rpb25Gb3JlZ3JvdW5kQ29s
b3IoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBDb2xvciBwbGF0Zm9ybVRleHRTZWFyY2hIaWdo
bGlnaHRDb2xvcigpIGNvbnN0OworCisgICAgICAgIHZpcnR1YWwgZG91YmxlIGNhcmV0QmxpbmtJ
bnRlcnZhbCgpIGNvbnN0OworCisgICAgICAgIC8vIFN5c3RlbSBmb250cy4KKyAgICAgICAgdmly
dHVhbCB2b2lkIHN5c3RlbUZvbnQoaW50IHByb3BJZCwgRG9jdW1lbnQqLCBGb250RGVzY3JpcHRp
b24mKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIGludCBtaW5pbXVtTWVudUxpc3RTaXplKFJl
bmRlclN0eWxlKikgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50Q2hlY2tib3go
UmVuZGVyT2JqZWN0KiBvLCBjb25zdCBSZW5kZXJPYmplY3Q6OlBhaW50SW5mbyYgaSwgY29uc3Qg
SW50UmVjdCYgcikgeyByZXR1cm4gcGFpbnRCdXR0b24obywgaSwgcik7IH0KKyAgICAgICAgdmly
dHVhbCB2b2lkIHNldENoZWNrYm94U2l6ZShSZW5kZXJTdHlsZSopIGNvbnN0OworCisgICAgICAg
IHZpcnR1YWwgYm9vbCBwYWludFJhZGlvKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpIHsgcmV0dXJuIHBhaW50QnV0dG9u
KG8sIGksIHIpOyB9CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSYWRpb1NpemUoUmVuZGVyU3R5
bGUqKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgcGFpbnRCdXR0b24oUmVuZGVyT2Jq
ZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRSZWN0Jik7CisK
KyAgICAgICAgdmlydHVhbCBib29sIHBhaW50VGV4dEZpZWxkKFJlbmRlck9iamVjdCosIGNvbnN0
IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgICAgIHZp
cnR1YWwgYm9vbCBwYWludFRleHRBcmVhKFJlbmRlck9iamVjdCogbywgY29uc3QgUmVuZGVyT2Jq
ZWN0OjpQYWludEluZm8mIGksIGNvbnN0IEludFJlY3QmIHIpIHsgcmV0dXJuIHBhaW50VGV4dEZp
ZWxkKG8sIGksIHIpOyB9CisKKyAgICAgICAgdmlydHVhbCBib29sIHBhaW50U2VhcmNoRmllbGQo
UmVuZGVyT2JqZWN0KiwgY29uc3QgUmVuZGVyT2JqZWN0OjpQYWludEluZm8mLCBjb25zdCBJbnRS
ZWN0Jik7CisKKyAgICAgICAgLy8gTWVudUxpc3QgcmVmZXJzIHRvIGFuIHVuc3R5bGVkIG1lbnVs
aXN0IChtZWFuaW5nIGEgbWVudWxpc3Qgd2l0aG91dAorICAgICAgICAvLyBiYWNrZ3JvdW5kLWNv
bG9yIG9yIGJvcmRlciBzZXQpIGFuZCBNZW51TGlzdEJ1dHRvbiByZWZlcnMgdG8gYSBzdHlsZWQK
KyAgICAgICAgLy8gbWVudWxpc3QgKGEgbWVudWxpc3Qgd2l0aCBiYWNrZ3JvdW5kLWNvbG9yIG9y
IGJvcmRlciBzZXQpLiBUaGV5IGhhdmUKKyAgICAgICAgLy8gdGhpcyBkaXN0aW5jdGlvbiB0byBz
dXBwb3J0IHNob3dpbmcgYXF1YSBzdHlsZSB0aGVtZXMgd2hlbmV2ZXIgdGhleQorICAgICAgICAv
LyBwb3NzaWJseSBjYW4sIHdoaWNoIGlzIHNvbWV0aGluZyB3ZSBkb24ndCB3YW50IHRvIHJlcGxp
Y2F0ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW4gc2hvcnQsIHdlIGVpdGhlciBnbyBkb3du
IHRoZSBNZW51TGlzdCBjb2RlIHBhdGggb3IgdGhlIE1lbnVMaXN0QnV0dG9uCisgICAgICAgIC8v
IGNvZGVwYXRoLiBXZSBuZXZlciBnbyBkb3duIGJvdGguIEFuZCBpbiBib3RoIGNhc2VzLCB0aGV5
IHJlbmRlciB0aGUKKyAgICAgICAgLy8gZW50aXJlIG1lbnVsaXN0LgorICAgICAgICB2aXJ0dWFs
IHZvaWQgYWRqdXN0TWVudUxpc3RTdHlsZShDU1NTdHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUq
LCBFbGVtZW50KikgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgYm9vbCBwYWludE1lbnVMaXN0KFJl
bmRlck9iamVjdCosIGNvbnN0IFJlbmRlck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVj
dCYpOworICAgICAgICB2aXJ0dWFsIHZvaWQgYWRqdXN0TWVudUxpc3RCdXR0b25TdHlsZShDU1NT
dHlsZVNlbGVjdG9yKiwgUmVuZGVyU3R5bGUqLCBFbGVtZW50KikgY29uc3Q7CisgICAgICAgIHZp
cnR1YWwgYm9vbCBwYWludE1lbnVMaXN0QnV0dG9uKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYpOworCisgICAgICAgIC8vIFRoZXNl
IG1ldGhvZHMgZGVmaW5lIHRoZSBwYWRkaW5nIGZvciB0aGUgTWVudUxpc3QncyBpbm5lciBibG9j
ay4KKyAgICAgICAgdmlydHVhbCBpbnQgcG9wdXBJbnRlcm5hbFBhZGRpbmdMZWZ0KFJlbmRlclN0
eWxlKikgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgaW50IHBvcHVwSW50ZXJuYWxQYWRkaW5nUmln
aHQoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBpbnQgcG9wdXBJbnRlcm5h
bFBhZGRpbmdUb3AoUmVuZGVyU3R5bGUqKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBpbnQgcG9w
dXBJbnRlcm5hbFBhZGRpbmdCb3R0b20oUmVuZGVyU3R5bGUqKSBjb25zdDsKKworICAgICAgICB2
aXJ0dWFsIHZvaWQgYWRqdXN0QnV0dG9uSW5uZXJTdHlsZShSZW5kZXJTdHlsZSopIGNvbnN0Owor
CisgICAgICAgIC8vIFByb3ZpZGUgYSB3YXkgdG8gcGFzcyB0aGUgZGVmYXVsdCBmb250IHNpemUg
ZnJvbSB0aGUgU2V0dGluZ3Mgb2JqZWN0CisgICAgICAgIC8vIHRvIHRoZSByZW5kZXIgdGhlbWUu
ICBGSVhNRTogaHR0cDovL2IvMTEyOTE4NiBBIGNsZWFuZXIgd2F5IHdvdWxkIGJlCisgICAgICAg
IC8vIHRvIHJlbW92ZSB0aGUgZGVmYXVsdCBmb250IHNpemUgZnJvbSB0aGlzIG9iamVjdCBhbmQg
aGF2ZSBjYWxsZXJzCisgICAgICAgIC8vIHRoYXQgbmVlZCB0aGUgdmFsdWUgdG8gZ2V0IGl0IGRp
cmVjdGx5IGZyb20gdGhlIGFwcHJvcHJpYXRlIFNldHRpbmdzCisgICAgICAgIC8vIG9iamVjdC4K
KyAgICAgICAgc3RhdGljIHZvaWQgc2V0RGVmYXVsdEZvbnRTaXplKGludCk7CisKKyAgICAgICAg
Ly8gRW5hYmxlcy9EaXNhYmxlcyBGaW5kSW5QYWdlIG1vZGUsIHdoaWNoIChpZiBlbmFibGVkKSBv
dmVycmlkZXMgdGhlCisgICAgICAgIC8vIHNlbGVjdGlvbiByZWN0IGNvbG9yIHRvIGJlIG9yYW5n
ZS4KKyAgICAgICAgc3RhdGljIHZvaWQgc2V0RmluZEluUGFnZU1vZGUoYm9vbCk7CisKKyAgICBw
cml2YXRlOgorICAgICAgICB1bnNpZ25lZCBkZXRlcm1pbmVTdGF0ZShSZW5kZXJPYmplY3QqKTsK
KyAgICAgICAgdW5zaWduZWQgZGV0ZXJtaW5lQ2xhc3NpY1N0YXRlKFJlbmRlck9iamVjdCopOwor
CisgICAgICAgIFRoZW1lRGF0YSBnZXRUaGVtZURhdGEoUmVuZGVyT2JqZWN0Kik7CisKKyAgICAg
ICAgYm9vbCBwYWludFRleHRGaWVsZEludGVybmFsKFJlbmRlck9iamVjdCosIGNvbnN0IFJlbmRl
ck9iamVjdDo6UGFpbnRJbmZvJiwgY29uc3QgSW50UmVjdCYsIGJvb2wpOworCisgICAgICAgIGlu
dCBtZW51TGlzdEludGVybmFsUGFkZGluZyhSZW5kZXJTdHlsZSosIGludCBwYWRkaW5nVHlwZSkg
Y29uc3Q7CisKKyAgICAgICAgLy8gQSBmbGFnIHNwZWNpZnlpbmcgd2hldGhlciB3ZSBhcmUgaW4g
RmluZC1pbi1wYWdlIG1vZGUgb3Igbm90LgorICAgICAgICBzdGF0aWMgYm9vbCBtX2ZpbmRJblBh
Z2VNb2RlOworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2VuZGlmCg==
</data>
<flag name="review"
          id="12847"
          type_id="1"
          status="+"
          setter="eric"
    />
          </attachment>
      

    </bug>

</bugzilla>