<?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>26741</bug_id>
          
          <creation_ts>2009-06-25 17:02:13 -0700</creation_ts>
          <short_desc>[Gtk] Share complex text support with Chromium Linux</short_desc>
          <delta_ts>2012-12-11 01:36:05 -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>WebKitGTK</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>DUPLICATE</resolution>
          <dup_id>92098</dup_id>
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Gtk</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Jan Alonzo">jmalonzo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>evan</cc>
    
    <cc>fujisawa.jun</cc>
    
    <cc>mrobinson</cc>
    
    <cc>ryuan.choi</cc>
    
    <cc>xan.lopez</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>128326</commentid>
    <comment_count>0</comment_count>
    <who name="Jan Alonzo">jmalonzo</who>
    <bug_when>2009-06-25 17:02:13 -0700</bug_when>
    <thetext>Bug #25068 will be adding complex text support in Chromium Linux using HarfBuzz. It would be nice if we can share the same codebase (with the exception of the Skia bits).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133096</commentid>
    <comment_count>1</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-07-20 02:53:11 -0700</bug_when>
    <thetext>Not sure, it seems more natural for us to use Pango, which already uses HarfBuzz internally AFAIK.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>143718</commentid>
    <comment_count>2</comment_count>
    <who name="Xan Lopez">xan.lopez</who>
    <bug_when>2009-08-31 14:04:08 -0700</bug_when>
    <thetext>(In reply to comment #1)
&gt; Not sure, it seems more natural for us to use Pango, which already uses
&gt; HarfBuzz internally AFAIK.

Apparently the people with a clue about this think that using Harfbuzz directly makes more sense, so disregard that :)

Some links Behdad pasted on IRC to read about the APIs we should be using to write a harfbuzz backend:

- http://behdad.org/text/
- http://lists.freedesktop.org/archives/harfbuzz/2009-August/000359.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>173690</commentid>
    <comment_count>3</comment_count>
      <attachid>45265</attachid>
    <who name="Evan Martin">evan</who>
    <bug_when>2009-12-20 02:43:30 -0800</bug_when>
    <thetext>Created attachment 45265
Rewrite of FontGtk to use harfbuzz-ng</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>173692</commentid>
    <comment_count>4</comment_count>
    <who name="Evan Martin">evan</who>
    <bug_when>2009-12-20 02:51:48 -0800</bug_when>
    <thetext>This patch seems to work, but Harfbuzz doesn&apos;t yet do any complex shaping so it&apos;s hard to know.  :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>788176</commentid>
    <comment_count>5</comment_count>
    <who name="Martin Robinson">mrobinson</who>
    <bug_when>2012-12-11 01:36:05 -0800</bug_when>
    <thetext>Evan, thanks to your initial kick in this direction, we&apos;ve finally completed this.

*** This bug has been marked as a duplicate of bug 92098 ***</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>45265</attachid>
            <date>2009-12-20 02:43:30 -0800</date>
            <delta_ts>2010-06-10 19:52:36 -0700</delta_ts>
            <desc>Rewrite of FontGtk to use harfbuzz-ng</desc>
            <filename>bug-26741-20091220024327.patch</filename>
            <type>text/plain</type>
            <size>30447</size>
            <attacher name="Evan Martin">evan</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL0dOVW1ha2VmaWxlLmFtIGIvR05VbWFrZWZpbGUuYW0KaW5kZXggMzBiNGRi
Ny4uMjQzYmM4ZiAxMDA2NDQKLS0tIGEvR05VbWFrZWZpbGUuYW0KKysrIGIvR05VbWFrZWZpbGUu
YW0KQEAgLTEwMiw2ICsxMDIsNyBAQCBjb3Jla2l0X2NmbGFncyArPSBcCiAJJChHTElCX0NGTEFH
UykgXAogCSQoR1NUUkVBTUVSX0NGTEFHUykgXAogCSQoR1RLX0NGTEFHUykgXAorCS1JJChzcmNk
aXIpL2hhcmZidXp6LW5nL3NyYyBcCiAJJChISUxET05fQ0ZMQUdTKSBcCiAJJChMSUJTT1VQX0NG
TEFHUykgXAogCSQoTElCWE1MX0NGTEFHUykgXApAQCAtMjU4LDYgKzI1OSw3IEBAIGxpYndlYmtp
dF8xXzBfbGFfTERGTEFHUyA9IFwKIGxpYndlYmtpdF8xXzBfbGFfTElCQUREID0gXAogCS1scHRo
cmVhZCBcCiAJbGliV2ViQ29yZUpTLmxhIFwKKwkkKHNyY2RpcikvaGFyZmJ1enotbmcvc3JjL2xp
YmhhcmZidXp6LmxhIFwKIAkkKHdlYmNvcmVfbGRmbGFncykgXAogCSQoQ0FJUk9fTElCUykgXAog
CSQoQ09WRVJBR0VfTERGTEFHUykgXApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9ndGsvRm9udEd0ay5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2d0ay9Gb250
R3RrLmNwcAppbmRleCA1YzMyMGUwLi4xZGJiNmY0IDEwMDY0NAotLS0gYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL2d0ay9Gb250R3RrLmNwcAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2d0ay9Gb250R3RrLmNwcApAQCAtMzcsMzMzICszNywyNDcgQEAKICNpbmNsdWRlICJTaW1w
bGVGb250RGF0YS5oIgogCiAjaW5jbHVkZSA8Y2Fpcm8uaD4KKyNpbmNsdWRlIDxjYWlyby9jYWly
by1mdC5oPgorI2luY2x1ZGUgPGZvbnRjb25maWcvZm9udGNvbmZpZy5oPgogI2luY2x1ZGUgPGdk
ay9nZGsuaD4KLSNpbmNsdWRlIDxwYW5nby9wYW5nby5oPgotI2luY2x1ZGUgPHBhbmdvL3Bhbmdv
Y2Fpcm8uaD4KLSNpZiBkZWZpbmVkKFVTRV9GUkVFVFlQRSkKLSNpbmNsdWRlIDxwYW5nby9wYW5n
b2ZjLWZvbnRtYXAuaD4KLSNlbmRpZgogCi1uYW1lc3BhY2UgV2ViQ29yZSB7CisvLyBYWFggbWFr
ZSB0aGVzZSByZWFsIGluY2x1ZGVzLgorI2luY2x1ZGUgImhiLmgiCisjaW5jbHVkZSAiaGItZ2xp
Yi5oIgorI2luY2x1ZGUgImhiLWZ0LmgiCiAKLSNkZWZpbmUgSVNfSElHSF9TVVJST0dBVEUodSkg
ICgoVUNoYXIpKHUpID49IChVQ2hhcikweGQ4MDAgJiYgKFVDaGFyKSh1KSA8PSAoVUNoYXIpMHhk
YmZmKQotI2RlZmluZSBJU19MT1dfU1VSUk9HQVRFKHUpICAoKFVDaGFyKSh1KSA+PSAoVUNoYXIp
MHhkYzAwICYmIChVQ2hhcikodSkgPD0gKFVDaGFyKTB4ZGZmZikKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKIAotc3RhdGljIHZvaWQgdXRmMTZfdG9fdXRmOChjb25zdCBVQ2hhciogYVRleHQsIGdpbnQg
YUxlbmd0aCwgY2hhciogJnRleHQsIGdpbnQgJmxlbmd0aCkKK2Jvb2wgRm9udDo6Y2FuUmV0dXJu
RmFsbGJhY2tGb250c0ZvckNvbXBsZXhUZXh0KCkKIHsKLSAgZ2Jvb2xlYW4gbmVlZF9jb3B5ID0g
RkFMU0U7Ci0gIGludCBpOworICAgIHJldHVybiBmYWxzZTsKK30KIAotICBmb3IgKGkgPSAwOyBp
IDwgYUxlbmd0aDsgaSsrKSB7Ci0gICAgaWYgKCFhVGV4dFtpXSB8fCBJU19MT1dfU1VSUk9HQVRF
KGFUZXh0W2ldKSkgewotICAgICAgbmVlZF9jb3B5ID0gVFJVRTsKLSAgICAgIGJyZWFrOwotICAg
IH0KLSAgICBlbHNlIGlmIChJU19ISUdIX1NVUlJPR0FURShhVGV4dFtpXSkpIHsKLSAgICAgIGlm
IChpIDwgYUxlbmd0aCAtIDEgJiYgSVNfTE9XX1NVUlJPR0FURShhVGV4dFtpKzFdKSkKLSAgICAg
ICAgaSsrOwotICAgICAgZWxzZSB7Ci0gICAgICAgIG5lZWRfY29weSA9IFRSVUU7Ci0gICAgICAg
IGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQorY2xhc3MgQ29tcGxleFRleHRDb250cm9sbGVy
IHsKK3B1YmxpYzoKKyAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIoY29uc3QgRm9udCYsIGNvbnN0
IFRleHRSdW4mKTsKKyAgICB+Q29tcGxleFRleHRDb250cm9sbGVyKCk7CiAKLSAgaWYgKG5lZWRf
Y29weSkgeworICAgIHZvaWQgc2hhcGUoKTsKKyAgICBoYl9idWZmZXJfdCogaGFyZmJ1enpCdWZm
ZXIoKSBjb25zdCB7IHJldHVybiBtX2J1ZmZlcjsgfQogCi0gICAgLyogUGFuZ28gZG9lc24ndCBj
b3JyZWN0bHkgaGFuZGxlIG51bHMuICBXZSBjb252ZXJ0IHRoZW0gdG8gMHhmZi4gKi8KLSAgICAv
KiBBbHNvICJ2YWxpZGF0ZSIgVVRGLTE2IHRleHQgdG8gbWFrZSBzdXJlIGNvbnZlcnNpb24gZG9l
c24ndCBmYWlsLiAqLworICAgIGNvbnN0IEZvbnQmIG1fZm9udDsKKyAgICBjb25zdCBUZXh0UnVu
JiBtX3J1bjsKKyAgICBGVF9GYWNlIG1fZnJlZXR5cGVGYWNlOworICAgIGhiX2J1ZmZlcl90KiBt
X2J1ZmZlcjsKK307CiAKLSAgICBVQ2hhciogcCA9IChVQ2hhciopZ19tZW1kdXAoYVRleHQsIGFM
ZW5ndGggKiBzaXplb2YoYVRleHRbMF0pKTsKK0NvbXBsZXhUZXh0Q29udHJvbGxlcjo6Q29tcGxl
eFRleHRDb250cm9sbGVyKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IFRleHRSdW4mIHJ1bikKKyAg
ICA6IG1fZm9udChmb250KQorICAgICwgbV9ydW4ocnVuKQorICAgICwgbV9idWZmZXIoMCkKK3sK
KyAgICBtX2ZyZWV0eXBlRmFjZSA9IGNhaXJvX2Z0X3NjYWxlZF9mb250X2xvY2tfZmFjZShtX2Zv
bnQucHJpbWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkubV9zY2FsZWRGb250KTsKKyAgICBzaGFw
ZSgpOworfQogCi0gICAgLyogZG9uJ3QgbmVlZCB0byByZXNldCBpICovCi0gICAgZm9yIChpID0g
MDsgaSA8IGFMZW5ndGg7IGkrKykgewotICAgICAgaWYgKCFwW2ldIHx8IElTX0xPV19TVVJST0dB
VEUocFtpXSkpCi0gICAgICAgIHBbaV0gPSAweEZGRkQ7Ci0gICAgICBlbHNlIGlmIChJU19ISUdI
X1NVUlJPR0FURShwW2ldKSkgewotICAgICAgICBpZiAoaSA8IGFMZW5ndGggLSAxICYmIElTX0xP
V19TVVJST0dBVEUoYVRleHRbaSsxXSkpCi0gICAgICAgICAgaSsrOwotICAgICAgICBlbHNlCi0g
ICAgICAgICAgcFtpXSA9IDB4RkZGRDsKLSAgICAgIH0KLSAgICB9CitDb21wbGV4VGV4dENvbnRy
b2xsZXI6On5Db21wbGV4VGV4dENvbnRyb2xsZXIoKQoreworICAgIGNhaXJvX2Z0X3NjYWxlZF9m
b250X3VubG9ja19mYWNlKG1fZm9udC5wcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5tX3Nj
YWxlZEZvbnQpOworICAgIGhiX2J1ZmZlcl9kZXN0cm95KG1fYnVmZmVyKTsKK30KIAotICAgIGFU
ZXh0ID0gcDsKLSAgfQordm9pZCBDb21wbGV4VGV4dENvbnRyb2xsZXI6OnNoYXBlKCkKK3sKKyAg
ICBtX2J1ZmZlciA9IGhiX2J1ZmZlcl9jcmVhdGUobV9ydW4ubGVuZ3RoKCkgLyogWFhYICovKTsK
IAotICBnbG9uZyBpdGVtc193cml0dGVuOwotICB0ZXh0ID0gZ191dGYxNl90b191dGY4KHJlaW50
ZXJwcmV0X2Nhc3Q8Y29uc3QgZ3VuaWNoYXIyKj4oYVRleHQpLCBhTGVuZ3RoLCBOVUxMLCAmaXRl
bXNfd3JpdHRlbiwgTlVMTCk7Ci0gIGxlbmd0aCA9IGl0ZW1zX3dyaXR0ZW47CisgICAgLy8gVE9E
TzogdXNlIHdlYmtpdCBjb25maWd1cmUgdGVzdCBmb3IgZ2xpYiB2cyBpY3UKKyAgICBoYl9idWZm
ZXJfc2V0X3VuaWNvZGVfZnVuY3MobV9idWZmZXIsIGhiX2dsaWJfZ2V0X3VuaWNvZGVfZnVuY3Mo
KSk7CisgICAgaGJfYnVmZmVyX3NldF9kaXJlY3Rpb24obV9idWZmZXIsIG1fcnVuLnJ0bCgpID8g
SEJfRElSRUNUSU9OX1JUTCA6IEhCX0RJUkVDVElPTl9MVFIpOworICAgIGhiX2J1ZmZlcl9hZGRf
dXRmMTYobV9idWZmZXIsIG1fcnVuLmNoYXJhY3RlcnMoKSwgbV9ydW4ubGVuZ3RoKCksIDAsIG1f
cnVuLmxlbmd0aCgpKTsgIC8vIFhYWCBmcm9tLCB0byAtIGZyb20pOwogCi0gIGlmIChuZWVkX2Nv
cHkpCi0gICAgZ19mcmVlKChncG9pbnRlcilhVGV4dCk7CisgICAgaGJfZm9udF90KiBoYXJmYnV6
ekZvbnQgPSBoYl9mdF9mb250X2NyZWF0ZShtX2ZyZWV0eXBlRmFjZSwgTlVMTCk7ICAvLyBYWFgg
ZGVzdHJveQorICAgIGhiX2ZhY2VfdCogaGFyZmJ1enpGYWNlID0gaGJfZnRfZmFjZV9jcmVhdGUo
bV9mcmVldHlwZUZhY2UsIE5VTEwpOyAvLyBYWFggaW5kZXgKIAorICAgIGhiX3NoYXBlKGhhcmZi
dXp6Rm9udCwgaGFyZmJ1enpGYWNlLCBtX2J1ZmZlciwgTlVMTCwgMCk7ICAvLyBYWFggZmVhdHVy
ZXMgdW51c2VkCiB9CiAKLXN0YXRpYyBnY2hhciogY29udmVydFVuaUNoYXJUb1VURjgoY29uc3Qg
VUNoYXIqIGNoYXJhY3RlcnMsIGdpbnQgbGVuZ3RoLCBpbnQgZnJvbSwgaW50IHRvKQorc3RhdGlj
IGRvdWJsZSBmcmVldHlwZVRvRG91YmxlKGludCB2YWx1ZSkKIHsKLSAgICBnY2hhciogdXRmOCA9
IDA7Ci0gICAgZ2ludCBuZXdfbGVuZ3RoID0gMDsKLSAgICB1dGYxNl90b191dGY4KGNoYXJhY3Rl
cnMsIGxlbmd0aCwgdXRmOCwgbmV3X2xlbmd0aCk7Ci0gICAgaWYgKCF1dGY4KQotICAgICAgICBy
ZXR1cm4gTlVMTDsKLQotICAgIGlmIChmcm9tID4gMCkgewotICAgICAgICAvLyBkaXNjYXJkIHRo
ZSBmaXJzdCAnZnJvbScgY2hhcmFjdGVycwotICAgICAgICAvLyBGSVhNRTogd2Ugc2hvdWxkIGRv
IHRoaXMgYmVmb3JlIHRoZSBjb252ZXJzaW9uIHByb2JhYmx5Ci0gICAgICAgIGdjaGFyKiBzdHJf
bGVmdCA9IGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcih1dGY4LCBmcm9tKTsKLSAgICAgICAgZ2No
YXIqIHRtcCA9IGdfc3RyZHVwKHN0cl9sZWZ0KTsKLSAgICAgICAgZ19mcmVlKHV0ZjgpOwotICAg
ICAgICB1dGY4ID0gdG1wOwotICAgIH0KLQotICAgIGdjaGFyKiBwb3MgPSB1dGY4OwotICAgIGdp
bnQgbGVuID0gc3RybGVuKHBvcyk7Ci0gICAgR1N0cmluZyogcmV0ID0gZ19zdHJpbmdfbmV3X2xl
bihOVUxMLCBsZW4pOwotCi0gICAgLy8gcmVwbGFjZSBsaW5lIGJyZWFrIGJ5IHNwYWNlCi0gICAg
d2hpbGUgKGxlbiA+IDApIHsKLSAgICAgICAgZ2ludCBpbmRleCwgc3RhcnQ7Ci0gICAgICAgIHBh
bmdvX2ZpbmRfcGFyYWdyYXBoX2JvdW5kYXJ5KHBvcywgbGVuLCAmaW5kZXgsICZzdGFydCk7Ci0g
ICAgICAgIGdfc3RyaW5nX2FwcGVuZF9sZW4ocmV0LCBwb3MsIGluZGV4KTsKLSAgICAgICAgaWYg
KGluZGV4ID09IHN0YXJ0KQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGdfc3RyaW5nX2Fw
cGVuZF9jKHJldCwgJyAnKTsKLSAgICAgICAgcG9zICs9IHN0YXJ0OwotICAgICAgICBsZW4gLT0g
c3RhcnQ7Ci0gICAgfQotICAgIHJldHVybiBnX3N0cmluZ19mcmVlKHJldCwgRkFMU0UpOworICAg
IC8vIEZyZWV0eXBlIHVzZXMgMjYuNiBmaXhlZC1wb2ludC4KKyAgICByZXR1cm4gdmFsdWUgLyA2
NC4wOwogfQogCi1zdGF0aWMgdm9pZCBzZXRQYW5nb0F0dHJpYnV0ZXMoY29uc3QgRm9udCogZm9u
dCwgY29uc3QgVGV4dFJ1biYgcnVuLCBQYW5nb0xheW91dCogbGF5b3V0KQorY2xhc3MgR2x5cGhJ
dGVyYXRvcgogewotI2lmIGRlZmluZWQoVVNFX0ZSRUVUWVBFKQotICAgIGlmIChmb250LT5wcmlt
YXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5tX3BhdHRlcm4pIHsKLSAgICAgICAgUGFuZ29Gb250
RGVzY3JpcHRpb24qIGRlc2MgPSBwYW5nb19mY19mb250X2Rlc2NyaXB0aW9uX2Zyb21fcGF0dGVy
bihmb250LT5wcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5tX3BhdHRlcm4sIEZBTFNFKTsK
LSAgICAgICAgcGFuZ29fbGF5b3V0X3NldF9mb250X2Rlc2NyaXB0aW9uKGxheW91dCwgZGVzYyk7
Ci0gICAgICAgIHBhbmdvX2ZvbnRfZGVzY3JpcHRpb25fZnJlZShkZXNjKTsKLSAgICB9Ci0jZWxp
ZiBkZWZpbmVkKFVTRV9QQU5HTykKLSAgICBpZiAoZm9udC0+cHJpbWFyeUZvbnQoKS0+cGxhdGZv
cm1EYXRhKCkubV9mb250KSB7Ci0gICAgICAgIFBhbmdvRm9udERlc2NyaXB0aW9uKiBkZXNjID0g
cGFuZ29fZm9udF9kZXNjcmliZShmb250LT5wcmltYXJ5Rm9udCgpLT5wbGF0Zm9ybURhdGEoKS5t
X2ZvbnQpOwotICAgICAgICBwYW5nb19sYXlvdXRfc2V0X2ZvbnRfZGVzY3JpcHRpb24obGF5b3V0
LCBkZXNjKTsKLSAgICAgICAgcGFuZ29fZm9udF9kZXNjcmlwdGlvbl9mcmVlKGRlc2MpOworcHVi
bGljOgorICAgIEdseXBoSXRlcmF0b3IoaGJfYnVmZmVyX3QqIGJ1ZmZlcikKKyAgICAgICAgOiBt
X2dseXBoSW5mb3MoaGJfYnVmZmVyX2dldF9nbHlwaF9pbmZvcyhidWZmZXIpKQorICAgICAgICAs
IG1fZ2x5cGhQb3NpdGlvbnMoaGJfYnVmZmVyX2dldF9nbHlwaF9wb3NpdGlvbnMoYnVmZmVyKSkK
KyAgICAgICAgLCBtX2dseXBoQ291bnQoaGJfYnVmZmVyX2dldF9sZW5ndGgoYnVmZmVyKSkKKyAg
ICAgICAgLCBtX2luZGV4KDApCisgICAgICAgICwgbV94KDApCisgICAgeyB9CisKKyAgICBib29s
IGRvbmUoKSB7CisgICAgICAgIHJldHVybiBtX2luZGV4ID49IG1fZ2x5cGhDb3VudDsKICAgICB9
Ci0jZW5kaWYKLQotICAgIHBhbmdvX2xheW91dF9zZXRfYXV0b19kaXIobGF5b3V0LCBGQUxTRSk7
CisgICAgdm9pZCBuZXh0KCk7CiAKLSAgICBQYW5nb0NvbnRleHQqIHBhbmdvQ29udGV4dCA9IHBh
bmdvX2xheW91dF9nZXRfY29udGV4dChsYXlvdXQpOwotICAgIFBhbmdvRGlyZWN0aW9uIGRpcmVj
dGlvbiA9IHJ1bi5ydGwoKSA/IFBBTkdPX0RJUkVDVElPTl9SVEwgOiBQQU5HT19ESVJFQ1RJT05f
TFRSOwotICAgIHBhbmdvX2NvbnRleHRfc2V0X2Jhc2VfZGlyKHBhbmdvQ29udGV4dCwgZGlyZWN0
aW9uKTsKLSAgICBQYW5nb0F0dHJMaXN0KiBsaXN0ID0gcGFuZ29fYXR0cl9saXN0X25ldygpOwot
ICAgIFBhbmdvQXR0cmlidXRlKiBhdHRyOworICAgIGNvbnN0IGhiX2dseXBoX2luZm9fdCYgZ2x5
cGhJbmZvKCkgY29uc3QgeyByZXR1cm4gbV9nbHlwaEluZm9zW21faW5kZXhdOyB9CisgICAgY29u
c3QgaGJfZ2x5cGhfcG9zaXRpb25fdCYgZ2x5cGhQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1f
Z2x5cGhQb3NpdGlvbnNbbV9pbmRleF07IH0KIAotICAgIGF0dHIgPSBwYW5nb19hdHRyX3NpemVf
bmV3X2Fic29sdXRlKGZvbnQtPnBpeGVsU2l6ZSgpICogUEFOR09fU0NBTEUpOwotICAgIGF0dHIt
PmVuZF9pbmRleCA9IEdfTUFYVUlOVDsKLSAgICBwYW5nb19hdHRyX2xpc3RfaW5zZXJ0X2JlZm9y
ZShsaXN0LCBhdHRyKTsKLQotICAgIGlmICghcnVuLnNwYWNpbmdEaXNhYmxlZCgpKSB7Ci0gICAg
ICAgIGF0dHIgPSBwYW5nb19hdHRyX2xldHRlcl9zcGFjaW5nX25ldyhmb250LT5sZXR0ZXJTcGFj
aW5nKCkgKiBQQU5HT19TQ0FMRSk7Ci0gICAgICAgIGF0dHItPmVuZF9pbmRleCA9IEdfTUFYVUlO
VDsKLSAgICAgICAgcGFuZ29fYXR0cl9saXN0X2luc2VydF9iZWZvcmUobGlzdCwgYXR0cik7Ci0g
ICAgfQorICAgIGNvbnN0IGhiX2dseXBoX2luZm9fdCogbV9nbHlwaEluZm9zOworICAgIGNvbnN0
IGhiX2dseXBoX3Bvc2l0aW9uX3QqIG1fZ2x5cGhQb3NpdGlvbnM7CisgICAgY29uc3QgdW5zaWdu
ZWQgbV9nbHlwaENvdW50OwogCi0gICAgLy8gUGFuZ28gZG9lcyBub3QgeWV0IHN1cHBvcnQgc3lu
dGhlc2lzaW5nIHNtYWxsIGNhcHMKLSAgICAvLyBTZWUgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9z
aG93X2J1Zy5jZ2k/aWQ9MTU2MTAKKyAgICB1bnNpZ25lZCBtX2luZGV4OworICAgIGRvdWJsZSBt
X3g7Cit9OwogCi0gICAgcGFuZ29fbGF5b3V0X3NldF9hdHRyaWJ1dGVzKGxheW91dCwgbGlzdCk7
Ci0gICAgcGFuZ29fYXR0cl9saXN0X3VucmVmKGxpc3QpOwotfQotCi1ib29sIEZvbnQ6OmNhblJl
dHVybkZhbGxiYWNrRm9udHNGb3JDb21wbGV4VGV4dCgpCit2b2lkIEdseXBoSXRlcmF0b3I6Om5l
eHQoKQogewotICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBoYl9nbHlwaF9wb3NpdGlvbl90
JiBwb3MgPSBnbHlwaFBvc2l0aW9uKCk7CisgICAgbV94ICs9IGZyZWV0eXBlVG9Eb3VibGUocG9z
LnhfYWR2YW5jZSk7CisKKyAgICArK21faW5kZXg7CisgICAgaWYgKGRvbmUoKSkKKyAgICAgICAg
cmV0dXJuOwogfQogCiB2b2lkIEZvbnQ6OmRyYXdDb21wbGV4VGV4dChHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGlu
dCBmcm9tLCBpbnQgdG8pIGNvbnN0CiB7CisgICAgY2Fpcm9fZ2x5cGhfdCBnbHlwaHNbMTAwMF07
ICAvLyBYWFgKKyAgICB7CisgICAgICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciBjb250cm9sbGVy
KCp0aGlzLCBydW4pOworICAgICAgICBmb3IgKEdseXBoSXRlcmF0b3IgaXRlcihjb250cm9sbGVy
LmhhcmZidXp6QnVmZmVyKCkpOyAhaXRlci5kb25lKCk7IGl0ZXIubmV4dCgpKSB7CisgICAgICAg
ICAgICBnbHlwaHNbaXRlci5tX2luZGV4XS5pbmRleCA9IGl0ZXIuZ2x5cGhJbmZvKCkuY29kZXBv
aW50OworICAgICAgICAgICAgY29uc3QgaGJfZ2x5cGhfcG9zaXRpb25fdCYgcG9zID0gaXRlci5n
bHlwaFBvc2l0aW9uKCk7CisgICAgICAgICAgICBnbHlwaHNbaXRlci5tX2luZGV4XS54ID0gaXRl
ci5tX3ggKyBmcmVldHlwZVRvRG91YmxlKHBvcy54X29mZnNldCk7CisgICAgICAgICAgICBnbHlw
aHNbaXRlci5tX2luZGV4XS55ID0gZnJlZXR5cGVUb0RvdWJsZShwb3MueV9vZmZzZXQpOworICAg
ICAgICB9CisgICAgfQorCiAgICAgY2Fpcm9fdCogY3IgPSBjb250ZXh0LT5wbGF0Zm9ybUNvbnRl
eHQoKTsKICAgICBjYWlyb19zYXZlKGNyKTsKICAgICBjYWlyb190cmFuc2xhdGUoY3IsIHBvaW50
LngoKSwgcG9pbnQueSgpKTsKLQotICAgIFBhbmdvTGF5b3V0KiBsYXlvdXQgPSBwYW5nb19jYWly
b19jcmVhdGVfbGF5b3V0KGNyKTsKLSAgICBzZXRQYW5nb0F0dHJpYnV0ZXModGhpcywgcnVuLCBs
YXlvdXQpOwotCi0gICAgZ2NoYXIqIHV0ZjggPSBjb252ZXJ0VW5pQ2hhclRvVVRGOChydW4uY2hh
cmFjdGVycygpLCBydW4ubGVuZ3RoKCksIDAsIHJ1bi5sZW5ndGgoKSk7Ci0gICAgcGFuZ29fbGF5
b3V0X3NldF90ZXh0KGxheW91dCwgdXRmOCwgLTEpOwotCi0gICAgLy8gT3VyIGxheW91dHMgYXJl
IHNpbmdsZSBsaW5lCi0gICAgUGFuZ29MYXlvdXRMaW5lKiBsYXlvdXRMaW5lID0gcGFuZ29fbGF5
b3V0X2dldF9saW5lX3JlYWRvbmx5KGxheW91dCwgMCk7Ci0KLSAgICBHZGtSZWdpb24qIHBhcnRp
YWxSZWdpb24gPSBOVUxMOwotICAgIGlmICh0byAtIGZyb20gIT0gcnVuLmxlbmd0aCgpKSB7Ci0g
ICAgICAgIC8vIENsaXAgdGhlIHJlZ2lvbiBvZiB0aGUgcnVuIHRvIGJlIHJlbmRlcmVkCi0gICAg
ICAgIGNoYXIqIHN0YXJ0ID0gZ191dGY4X29mZnNldF90b19wb2ludGVyKHV0ZjgsIGZyb20pOwot
ICAgICAgICBjaGFyKiBlbmQgPSBnX3V0Zjhfb2Zmc2V0X3RvX3BvaW50ZXIoc3RhcnQsIHRvIC0g
ZnJvbSk7Ci0gICAgICAgIGludCByYW5nZXNbXSA9IHtzdGFydCAtIHV0ZjgsIGVuZCAtIHV0Zjh9
OwotICAgICAgICBwYXJ0aWFsUmVnaW9uID0gZ2RrX3BhbmdvX2xheW91dF9saW5lX2dldF9jbGlw
X3JlZ2lvbihsYXlvdXRMaW5lLCAwLCAwLCByYW5nZXMsIDEpOwotICAgICAgICBnZGtfcmVnaW9u
X3NocmluayhwYXJ0aWFsUmVnaW9uLCAwLCAtcGl4ZWxTaXplKCkpOwotICAgIH0KKyAgICBjYWly
b19zZXRfc2NhbGVkX2ZvbnQoY3IsIHByaW1hcnlGb250KCktPnBsYXRmb3JtRGF0YSgpLm1fc2Nh
bGVkRm9udCk7CiAKICAgICBDb2xvciBmaWxsQ29sb3IgPSBjb250ZXh0LT5maWxsQ29sb3IoKTsK
ICAgICBmbG9hdCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYTsKLQotICAgIC8vIFRleHQgc2hhZG93
LCBpbnNwaXJlZCBieSBGb250TWFjCi0gICAgSW50U2l6ZSBzaGFkb3dTaXplOwotICAgIGludCBz
aGFkb3dCbHVyID0gMDsKLSAgICBDb2xvciBzaGFkb3dDb2xvcjsKLSAgICBib29sIGhhc1NoYWRv
dyA9IGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpID09IGNUZXh0RmlsbCAmJgotICAgICAgICBj
b250ZXh0LT5nZXRTaGFkb3coc2hhZG93U2l6ZSwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IpOwot
Ci0gICAgLy8gVE9ETzogQmx1ciBzdXBwb3J0Ci0gICAgaWYgKGhhc1NoYWRvdykgewotICAgICAg
ICAvLyBEaXNhYmxlIGdyYXBoaWNzIGNvbnRleHQgc2hhZG93cyAobm90IHlldCBpbXBsZW1lbnRl
ZCkgYW5kIHBhaW50IHRoZW0gbWFudWFsbHkKLSAgICAgICAgY29udGV4dC0+Y2xlYXJTaGFkb3co
KTsKLSAgICAgICAgQ29sb3Igc2hhZG93RmlsbENvbG9yKHNoYWRvd0NvbG9yLnJlZCgpLCBzaGFk
b3dDb2xvci5ncmVlbigpLCBzaGFkb3dDb2xvci5ibHVlKCksIHNoYWRvd0NvbG9yLmFscGhhKCkg
KiBmaWxsQ29sb3IuYWxwaGEoKSAvIDI1NSk7Ci0gICAgICAgIGNhaXJvX3NhdmUoY3IpOwotCi0g
ICAgICAgIHNoYWRvd0ZpbGxDb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsK
LSAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBo
YSk7Ci0KLSAgICAgICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCBzaGFkb3dTaXplLndpZHRoKCksIHNo
YWRvd1NpemUuaGVpZ2h0KCkpOwotCi0gICAgICAgIGlmIChwYXJ0aWFsUmVnaW9uKSB7Ci0gICAg
ICAgICAgICBnZGtfY2Fpcm9fcmVnaW9uKGNyLCBwYXJ0aWFsUmVnaW9uKTsKLSAgICAgICAgICAg
IGNhaXJvX2NsaXAoY3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFuZ29fY2Fpcm9fc2hvd19s
YXlvdXRfbGluZShjciwgbGF5b3V0TGluZSk7Ci0KLSAgICAgICAgY2Fpcm9fcmVzdG9yZShjcik7
Ci0gICAgfQotCiAgICAgZmlsbENvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEp
OwogICAgIGNhaXJvX3NldF9zb3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEp
OwotCi0gICAgaWYgKHBhcnRpYWxSZWdpb24pIHsKLSAgICAgICAgZ2RrX2NhaXJvX3JlZ2lvbihj
ciwgcGFydGlhbFJlZ2lvbik7Ci0gICAgICAgIGNhaXJvX2NsaXAoY3IpOwotICAgIH0KLQotICAg
IHBhbmdvX2NhaXJvX3Nob3dfbGF5b3V0X2xpbmUoY3IsIGxheW91dExpbmUpOwotCi0gICAgaWYg
KGNvbnRleHQtPnRleHREcmF3aW5nTW9kZSgpICYgY1RleHRTdHJva2UpIHsKLSAgICAgICAgQ29s
b3Igc3Ryb2tlQ29sb3IgPSBjb250ZXh0LT5zdHJva2VDb2xvcigpOwotICAgICAgICBzdHJva2VD
b2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKLSAgICAgICAgY2Fpcm9fc2V0
X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7Ci0gICAgICAgIHBhbmdv
X2NhaXJvX2xheW91dF9saW5lX3BhdGgoY3IsIGxheW91dExpbmUpOwotICAgICAgICBjYWlyb19z
ZXRfbGluZV93aWR0aChjciwgY29udGV4dC0+c3Ryb2tlVGhpY2tuZXNzKCkpOwotICAgICAgICBj
YWlyb19zdHJva2UoY3IpOwotICAgIH0KLQotICAgIC8vIFJlLWVuYWJsZSB0aGUgcGxhdGZvcm0g
c2hhZG93IHdlIGRpc2FibGVkIGVhcmxpZXIKLSAgICBpZiAoaGFzU2hhZG93KQotICAgICAgICBj
b250ZXh0LT5zZXRTaGFkb3coc2hhZG93U2l6ZSwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IsIERl
dmljZUNvbG9yU3BhY2UpOwotCi0gICAgLy8gUGFuZ28gc29tZXRpbWVzIGxlYXZlcyBiZWhpbmQg
cGF0aHMgd2UgZG9uJ3Qgd2FudAotICAgIGNhaXJvX25ld19wYXRoKGNyKTsKLQotICAgIGlmIChw
YXJ0aWFsUmVnaW9uKQotICAgICAgICBnZGtfcmVnaW9uX2Rlc3Ryb3kocGFydGlhbFJlZ2lvbik7
Ci0KLSAgICBnX2ZyZWUodXRmOCk7Ci0gICAgZ19vYmplY3RfdW5yZWYobGF5b3V0KTsKKyAgICBj
YWlyb19zaG93X2dseXBocyhjciwgZ2x5cGhzLCBydW4ubGVuZ3RoKCkpOyAvLyBYWFggb2JleSBm
cm9tLCB0bwogCiAgICAgY2Fpcm9fcmVzdG9yZShjcik7CiB9CiAKLS8vIFdlIHNob3VsZCBjcmVh
dGUgdGhlIGxheW91dCB3aXRoIG91ciBhY3R1YWwgY29udGV4dCBidXQgd2UgY2FuJ3QgYWNjZXNz
IGl0IGZyb20gaGVyZS4KLXN0YXRpYyBQYW5nb0xheW91dCogZ2V0RGVmYXVsdFBhbmdvTGF5b3V0
KGNvbnN0IFRleHRSdW4mIHJ1bikKLXsKLSAgICBzdGF0aWMgUGFuZ29Gb250TWFwKiBtYXAgPSBw
YW5nb19jYWlyb19mb250X21hcF9nZXRfZGVmYXVsdCgpOwotI2lmIFBBTkdPX1ZFUlNJT05fQ0hF
Q0soMSwyMSw1KQotICAgIHN0YXRpYyBQYW5nb0NvbnRleHQqIHBhbmdvQ29udGV4dCA9IHBhbmdv
X2ZvbnRfbWFwX2NyZWF0ZV9jb250ZXh0KG1hcCk7Ci0jZWxzZQotICAgIC8vIERlcHJlY2F0ZWQg
aW4gUGFuZ28gMS4yMS4KLSAgICBzdGF0aWMgUGFuZ29Db250ZXh0KiBwYW5nb0NvbnRleHQgPSBw
YW5nb19jYWlyb19mb250X21hcF9jcmVhdGVfY29udGV4dChQQU5HT19DQUlST19GT05UX01BUCht
YXApKTsKLSNlbmRpZgotICAgIFBhbmdvTGF5b3V0KiBsYXlvdXQgPSBwYW5nb19sYXlvdXRfbmV3
KHBhbmdvQ29udGV4dCk7Ci0KLSAgICByZXR1cm4gbGF5b3V0OwotfQotCiBmbG9hdCBGb250Ojpm
bG9hdFdpZHRoRm9yQ29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBIYXNoU2V0PGNvbnN0
IFNpbXBsZUZvbnREYXRhKj4qIC8qIGZhbGxiYWNrRm9udHMgKi8pIGNvbnN0CiB7Ci0gICAgaWYg
KHJ1bi5sZW5ndGgoKSA9PSAwKQotICAgICAgICByZXR1cm4gMC4wZjsKLQotICAgIFBhbmdvTGF5
b3V0KiBsYXlvdXQgPSBnZXREZWZhdWx0UGFuZ29MYXlvdXQocnVuKTsKLSAgICBzZXRQYW5nb0F0
dHJpYnV0ZXModGhpcywgcnVuLCBsYXlvdXQpOwotCi0gICAgZ2NoYXIqIHV0ZjggPSBjb252ZXJ0
VW5pQ2hhclRvVVRGOChydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3RoKCksIDAsIHJ1bi5sZW5n
dGgoKSk7Ci0gICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwgdXRmOCwgLTEpOwotCi0g
ICAgaW50IHdpZHRoOwotICAgIHBhbmdvX2xheW91dF9nZXRfcGl4ZWxfc2l6ZShsYXlvdXQsICZ3
aWR0aCwgMCk7Ci0KLSAgICBnX2ZyZWUodXRmOCk7Ci0gICAgZ19vYmplY3RfdW5yZWYobGF5b3V0
KTsKLQotICAgIHJldHVybiB3aWR0aDsKKyAgICBDb21wbGV4VGV4dENvbnRyb2xsZXIgY29udHJv
bGxlcigqdGhpcywgcnVuKTsKKyAgICBHbHlwaEl0ZXJhdG9yIGl0ZXIoY29udHJvbGxlci5oYXJm
YnV6ekJ1ZmZlcigpKTsKKyAgICBmb3IgKCA7ICFpdGVyLmRvbmUoKTsgaXRlci5uZXh0KCkpCisg
ICAgICAgIC8qIEp1c3QgYWR2YW5jaW5nIHggcG9zaXRpb24gKi87CisgICAgcmV0dXJuIGl0ZXIu
bV94OwogfQogCiBpbnQgRm9udDo6b2Zmc2V0Rm9yUG9zaXRpb25Gb3JDb21wbGV4VGV4dChjb25z
dCBUZXh0UnVuJiBydW4sIGludCB4LCBib29sIGluY2x1ZGVQYXJ0aWFsR2x5cGhzKSBjb25zdAog
ewotICAgIFBhbmdvTGF5b3V0KiBsYXlvdXQgPSBnZXREZWZhdWx0UGFuZ29MYXlvdXQocnVuKTsK
LSAgICBzZXRQYW5nb0F0dHJpYnV0ZXModGhpcywgcnVuLCBsYXlvdXQpOwotCi0gICAgZ2NoYXIq
IHV0ZjggPSBjb252ZXJ0VW5pQ2hhclRvVVRGOChydW4uY2hhcmFjdGVycygpLCBydW4ubGVuZ3Ro
KCksIDAsIHJ1bi5sZW5ndGgoKSk7Ci0gICAgcGFuZ29fbGF5b3V0X3NldF90ZXh0KGxheW91dCwg
dXRmOCwgLTEpOworICAgIENvbXBsZXhUZXh0Q29udHJvbGxlciBjb250cm9sbGVyKCp0aGlzLCBy
dW4pOwogCi0gICAgaW50IGluZGV4LCB0cmFpbGluZzsKLSAgICBwYW5nb19sYXlvdXRfeHlfdG9f
aW5kZXgobGF5b3V0LCB4ICogUEFOR09fU0NBTEUsIDEsICZpbmRleCwgJnRyYWlsaW5nKTsKLSAg
ICBnbG9uZyBvZmZzZXQgPSBnX3V0ZjhfcG9pbnRlcl90b19vZmZzZXQodXRmOCwgdXRmOCArIGlu
ZGV4KTsKLSAgICBpZiAoaW5jbHVkZVBhcnRpYWxHbHlwaHMpCi0gICAgICAgIG9mZnNldCArPSB0
cmFpbGluZzsKKyAgICBHbHlwaEl0ZXJhdG9yIGl0ZXIoY29udHJvbGxlci5oYXJmYnV6ekJ1ZmZl
cigpKTsKKyAgICB1bnNpZ25lZCBjbHVzdGVyID0gcnVuLnJ0bCgpID8gaXRlci5nbHlwaEluZm8o
KS5jbHVzdGVyICsgMSA6IDA7CisgICAgaWYgKHJ1bi5ydGwoKSkgeworICAgICAgICBmb3IgKCA7
ICFpdGVyLmRvbmUoKTsgaXRlci5uZXh0KCkpIHsKKyAgICAgICAgICAgIGRvdWJsZSBhZHZhbmNl
ID0gZnJlZXR5cGVUb0RvdWJsZShpdGVyLmdseXBoUG9zaXRpb24oKS54X2FkdmFuY2UpOworICAg
ICAgICAgICAgaWYgKHggPCBpdGVyLm1feCArIChhZHZhbmNlIC8gMikpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CiAKLSAgICBnX2ZyZWUodXRmOCk7Ci0gICAgZ19vYmplY3RfdW5yZWYobGF5b3V0
KTsKKyAgICAgICAgICAgIGNsdXN0ZXIgPSBpdGVyLmdseXBoSW5mbygpLmNsdXN0ZXI7CisgICAg
ICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKCA7ICFpdGVyLmRvbmUoKTsgaXRlci5u
ZXh0KCkpIHsKKyAgICAgICAgICAgIGNsdXN0ZXIgPSBpdGVyLmdseXBoSW5mbygpLmNsdXN0ZXI7
CiAKLSAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgZG91YmxlIGFkdmFuY2UgPSBmcmVl
dHlwZVRvRG91YmxlKGl0ZXIuZ2x5cGhQb3NpdGlvbigpLnhfYWR2YW5jZSk7CisgICAgICAgICAg
ICBpZiAoeCA8IGl0ZXIubV94ICsgKGFkdmFuY2UgLyAyKSkKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXRlci5kb25lKCkpCisgICAgICAgIGNsdXN0
ZXIgPSBydW4ucnRsKCkgPyAwIDogY2x1c3RlciArIDE7ICAvLyBSYW4gb2ZmIHRoZSBlbmQuCisg
ICAgcmV0dXJuIGNsdXN0ZXI7CiB9CiAKLUZsb2F0UmVjdCBGb250OjpzZWxlY3Rpb25SZWN0Rm9y
Q29tcGxleFRleHQoY29uc3QgVGV4dFJ1biYgcnVuLCBjb25zdCBJbnRQb2ludCYgcG9pbnQsIGlu
dCBoLCBpbnQgZnJvbSwgaW50IHRvKSBjb25zdAotewotICAgIFBhbmdvTGF5b3V0KiBsYXlvdXQg
PSBnZXREZWZhdWx0UGFuZ29MYXlvdXQocnVuKTsKLSAgICBzZXRQYW5nb0F0dHJpYnV0ZXModGhp
cywgcnVuLCBsYXlvdXQpOworY2xhc3MgSGFyZmJ1enpDbHVzdGVySXRlcmF0b3IgeworcHVibGlj
OgorICAgIEhhcmZidXp6Q2x1c3Rlckl0ZXJhdG9yKGhiX2J1ZmZlcl90KiBidWZmZXIsIGJvb2wg
cnRsKQorICAgICAgICA6IG1fYnVmZmVyKGJ1ZmZlciksIG1fcnRsKHJ0bCkKKyAgICAgICAgLCBt
X2dseXBoSW5mb3MoaGJfYnVmZmVyX2dldF9nbHlwaF9pbmZvcyhidWZmZXIpKQorICAgICAgICAs
IG1fZ2x5cGhQb3NpdGlvbnMoaGJfYnVmZmVyX2dldF9nbHlwaF9wb3NpdGlvbnMoYnVmZmVyKSkK
KyAgICAgICAgLCBtX2dseXBoQ291bnQoaGJfYnVmZmVyX2dldF9sZW5ndGgoYnVmZmVyKSkKKyAg
ICB7CisgICAgICAgIG1fY2x1c3RlciA9IDA7CisgICAgICAgIG1fZmlyc3RHbHlwaCA9IG1fcnRs
ID8gbV9nbHlwaENvdW50IC0gMSA6IDA7CisgICAgICAgIG1fbGFzdEdseXBoID0gYWR2YW5jZUNs
dXN0ZXIobV9maXJzdEdseXBoLCBtX2NsdXN0ZXIpOworICAgIH0KIAotICAgIGdjaGFyKiB1dGY4
ID0gY29udmVydFVuaUNoYXJUb1VURjgocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpLCAw
LCBydW4ubGVuZ3RoKCkpOwotICAgIHBhbmdvX2xheW91dF9zZXRfdGV4dChsYXlvdXQsIHV0Zjgs
IC0xKTsKKyAgICBpbnQgYWR2YW5jZUNsdXN0ZXIoaW50IGdseXBoLCB1bnNpZ25lZCBjdXJDbHVz
dGVyKQorICAgIHsKKyAgICAgICAgaW50IGRpcmVjdGlvbiA9IG1fcnRsID8gLTEgOiAxOworICAg
ICAgICBmb3IgKCA7IGdseXBoID49IDAgJiYgZ2x5cGggPCBtX2dseXBoQ291bnQ7IGdseXBoICs9
IGRpcmVjdGlvbikgeworICAgICAgICAgICAgaWYgKG1fZ2x5cGhJbmZvc1tnbHlwaF0uY2x1c3Rl
ciAhPSBjdXJDbHVzdGVyKQorICAgICAgICAgICAgICAgIHJldHVybiBnbHlwaDsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gZ2x5cGg7CisgICAgfQogCi0gICAgY2hhciogc3RhcnQgPSBnX3V0
Zjhfb2Zmc2V0X3RvX3BvaW50ZXIodXRmOCwgZnJvbSk7Ci0gICAgY2hhciogZW5kID0gZ191dGY4
X29mZnNldF90b19wb2ludGVyKHN0YXJ0LCB0byAtIGZyb20pOworICAgIHZvaWQgbmV4dCgpCisg
ICAgeworICAgICAgICBtX2NsdXN0ZXIgPSBtX2dseXBoSW5mb3NbbV9sYXN0R2x5cGhdLmNsdXN0
ZXI7CisgICAgICAgIG1fZmlyc3RHbHlwaCA9IG1fbGFzdEdseXBoOworICAgICAgICBpZiAoIWRv
bmUoKSkKKyAgICAgICAgICAgIG1fbGFzdEdseXBoID0gYWR2YW5jZUNsdXN0ZXIobV9maXJzdEds
eXBoLCBtX2NsdXN0ZXIpOworICAgIH0KIAotICAgIGlmIChydW4ubHRyKCkpIHsKLSAgICAgICAg
ZnJvbSA9IHN0YXJ0IC0gdXRmODsKLSAgICAgICAgdG8gPSBlbmQgLSB1dGY4OwotICAgIH0gZWxz
ZSB7Ci0gICAgICAgIGZyb20gPSBlbmQgLSB1dGY4OwotICAgICAgICB0byA9IHN0YXJ0IC0gdXRm
ODsKKyAgICBib29sIGRvbmUoKSB7CisgICAgICAgIHJldHVybiAobV9maXJzdEdseXBoIDwgMCB8
fCBtX2ZpcnN0R2x5cGggPj0gbV9nbHlwaENvdW50KTsKICAgICB9CiAKLSAgICBQYW5nb0xheW91
dExpbmUqIGxheW91dExpbmUgPSBwYW5nb19sYXlvdXRfZ2V0X2xpbmVfcmVhZG9ubHkobGF5b3V0
LCAwKTsKLSAgICBpbnQgeF9wb3M7CisgICAgZG91YmxlIHhBZHZhbmNlKCkgeworICAgICAgICBp
bnQgYWR2YW5jZSA9IDA7CisgICAgICAgIGludCBkaXJlY3Rpb24gPSBtX3J0bCA/IC0xIDogMTsK
KyAgICAgICAgZm9yIChpbnQgZ2x5cGggPSBtX2ZpcnN0R2x5cGg7IGdseXBoICE9IG1fbGFzdEds
eXBoOyBnbHlwaCArPSBkaXJlY3Rpb24pCisgICAgICAgICAgICBhZHZhbmNlICs9IG1fZ2x5cGhQ
b3NpdGlvbnNbZ2x5cGhdLnhfYWR2YW5jZTsKKyAgICAgICAgcmV0dXJuIGZyZWV0eXBlVG9Eb3Vi
bGUoYWR2YW5jZSk7CisgICAgfQogCi0gICAgeF9wb3MgPSAwOwotICAgIGlmIChmcm9tIDwgbGF5
b3V0TGluZS0+bGVuZ3RoKQotICAgICAgICBwYW5nb19sYXlvdXRfbGluZV9pbmRleF90b194KGxh
eW91dExpbmUsIGZyb20sIEZBTFNFLCAmeF9wb3MpOwotICAgIGZsb2F0IGJlZm9yZVdpZHRoID0g
UEFOR09fUElYRUxTX0ZMT09SKHhfcG9zKTsKKyAgICBoYl9idWZmZXJfdCogbV9idWZmZXI7Cisg
ICAgYm9vbCBtX3J0bDsKKyAgICBjb25zdCBoYl9nbHlwaF9pbmZvX3QqIG1fZ2x5cGhJbmZvczsK
KyAgICBjb25zdCBoYl9nbHlwaF9wb3NpdGlvbl90KiBtX2dseXBoUG9zaXRpb25zOworICAgIGNv
bnN0IGludCBtX2dseXBoQ291bnQ7CisgICAgaW50IG1fY2x1c3RlcjsKKyAgICBpbnQgbV9maXJz
dEdseXBoLCBtX2xhc3RHbHlwaDsKK307CiAKLSAgICB4X3BvcyA9IDA7Ci0gICAgaWYgKHJ1bi5s
dHIoKSB8fCB0byA8IGxheW91dExpbmUtPmxlbmd0aCkKLSAgICAgICAgcGFuZ29fbGF5b3V0X2xp
bmVfaW5kZXhfdG9feChsYXlvdXRMaW5lLCB0bywgRkFMU0UsICZ4X3Bvcyk7Ci0gICAgZmxvYXQg
YWZ0ZXJXaWR0aCA9IFBBTkdPX1BJWEVMUyh4X3Bvcyk7CitGbG9hdFJlY3QgRm9udDo6c2VsZWN0
aW9uUmVjdEZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQm
IHBvaW50LCBpbnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBDb21wbGV4VGV4
dENvbnRyb2xsZXIgY29udHJvbGxlcigqdGhpcywgcnVuKTsKKworICAgIGludCBmcm9tT2Zmc2V0
ID0gMCwgdG9PZmZzZXQgPSAtMTsKKyAgICBkb3VibGUgb2Zmc2V0ID0gMDsKKyAgICBmb3IgKEhh
cmZidXp6Q2x1c3Rlckl0ZXJhdG9yIGl0ZXIoY29udHJvbGxlci5oYXJmYnV6ekJ1ZmZlcigpLCBy
dW4ucnRsKCkpOyAhaXRlci5kb25lKCk7IGl0ZXIubmV4dCgpKSB7CisgICAgICAgIGlmIChpdGVy
Lm1fY2x1c3RlciA9PSBmcm9tKQorICAgICAgICAgICAgZnJvbU9mZnNldCA9IG9mZnNldDsKKyAg
ICAgICAgaWYgKGl0ZXIubV9jbHVzdGVyID09IHRvKQorICAgICAgICAgICAgdG9PZmZzZXQgPSBv
ZmZzZXQ7CisgICAgICAgIG9mZnNldCArPSBpdGVyLnhBZHZhbmNlKCk7CisgICAgfQorICAgIGlm
ICh0b09mZnNldCA9PSAtMSkKKyAgICAgICAgdG9PZmZzZXQgPSBvZmZzZXQ7CiAKLSAgICBnX2Zy
ZWUodXRmOCk7Ci0gICAgZ19vYmplY3RfdW5yZWYobGF5b3V0KTsKKyAgICBpZiAocnVuLnJ0bCgp
KSB7CisgICAgICAgIGZyb21PZmZzZXQgPSBvZmZzZXQgLSBmcm9tT2Zmc2V0OworICAgICAgICB0
b09mZnNldCA9IG9mZnNldCAtIHRvT2Zmc2V0OworICAgIH0KIAotICAgIHJldHVybiBGbG9hdFJl
Y3QocG9pbnQueCgpICsgYmVmb3JlV2lkdGgsIHBvaW50LnkoKSwgYWZ0ZXJXaWR0aCAtIGJlZm9y
ZVdpZHRoLCBoKTsKKyAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50LngoKSArIHN0ZDo6bWluKGZy
b21PZmZzZXQsIHRvT2Zmc2V0KSwgcG9pbnQueSgpLCBhYnMoZnJvbU9mZnNldCAtIHRvT2Zmc2V0
KSwgaCk7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZ3Rr
L0ZvbnRQYW5nby5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2d0ay9Gb250UGFuZ28u
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYTU2ZjcKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2d0ay9Gb250UGFuZ28uY3BwCkBA
IC0wLDAgKzEsMzU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVy
LCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IE1pY2hh
ZWwgRW1tZWwgbWlrZS5lbW1lbEBnbWFpbC5jb20KKyAqIENvcHlyaWdodCAoYykgMjAwNyBIaXJv
eXVraSBJa2V6b2UKKyAqIENvcHlyaWdodCAoYykgMjAwNyBLb3VoZWkgU3V0b3UKKyAqIENvcHly
aWdodCAoQykgMjAwNyBBbHAgVG9rZXIgPGFscEBhdG9rZXIuY29tPgorICogQ29weXJpZ2h0IChD
KSAyMDA4IFhhbiBMb3BleiA8eGFuQGdub21lLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBO
dWFudGkgTHRkLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRm9udC5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CisjaW5jbHVkZSAiU2ltcGxlRm9udERhdGEuaCIKKworI2luY2x1ZGUgPGNhaXJvLmg+CisjaW5j
bHVkZSA8Z2RrL2dkay5oPgorI2luY2x1ZGUgPHBhbmdvL3BhbmdvLmg+CisjaW5jbHVkZSA8cGFu
Z28vcGFuZ29jYWlyby5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNkZWZpbmUgSVNfSElH
SF9TVVJST0dBVEUodSkgICgoVUNoYXIpKHUpID49IChVQ2hhcikweGQ4MDAgJiYgKFVDaGFyKSh1
KSA8PSAoVUNoYXIpMHhkYmZmKQorI2RlZmluZSBJU19MT1dfU1VSUk9HQVRFKHUpICAoKFVDaGFy
KSh1KSA+PSAoVUNoYXIpMHhkYzAwICYmIChVQ2hhcikodSkgPD0gKFVDaGFyKTB4ZGZmZikKKwor
c3RhdGljIHZvaWQgdXRmMTZfdG9fdXRmOChjb25zdCBVQ2hhciogYVRleHQsIGdpbnQgYUxlbmd0
aCwgY2hhciogJnRleHQsIGdpbnQgJmxlbmd0aCkKK3sKKyAgZ2Jvb2xlYW4gbmVlZF9jb3B5ID0g
RkFMU0U7CisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBhTGVuZ3RoOyBpKyspIHsKKyAg
ICBpZiAoIWFUZXh0W2ldIHx8IElTX0xPV19TVVJST0dBVEUoYVRleHRbaV0pKSB7CisgICAgICBu
ZWVkX2NvcHkgPSBUUlVFOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGVsc2UgaWYgKElTX0hJ
R0hfU1VSUk9HQVRFKGFUZXh0W2ldKSkgeworICAgICAgaWYgKGkgPCBhTGVuZ3RoIC0gMSAmJiBJ
U19MT1dfU1VSUk9HQVRFKGFUZXh0W2krMV0pKQorICAgICAgICBpKys7CisgICAgICBlbHNlIHsK
KyAgICAgICAgbmVlZF9jb3B5ID0gVFJVRTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAg
fQorICB9CisKKyAgaWYgKG5lZWRfY29weSkgeworCisgICAgLyogUGFuZ28gZG9lc24ndCBjb3Jy
ZWN0bHkgaGFuZGxlIG51bHMuICBXZSBjb252ZXJ0IHRoZW0gdG8gMHhmZi4gKi8KKyAgICAvKiBB
bHNvICJ2YWxpZGF0ZSIgVVRGLTE2IHRleHQgdG8gbWFrZSBzdXJlIGNvbnZlcnNpb24gZG9lc24n
dCBmYWlsLiAqLworCisgICAgVUNoYXIqIHAgPSAoVUNoYXIqKWdfbWVtZHVwKGFUZXh0LCBhTGVu
Z3RoICogc2l6ZW9mKGFUZXh0WzBdKSk7CisKKyAgICAvKiBkb24ndCBuZWVkIHRvIHJlc2V0IGkg
Ki8KKyAgICBmb3IgKGkgPSAwOyBpIDwgYUxlbmd0aDsgaSsrKSB7CisgICAgICBpZiAoIXBbaV0g
fHwgSVNfTE9XX1NVUlJPR0FURShwW2ldKSkKKyAgICAgICAgcFtpXSA9IDB4RkZGRDsKKyAgICAg
IGVsc2UgaWYgKElTX0hJR0hfU1VSUk9HQVRFKHBbaV0pKSB7CisgICAgICAgIGlmIChpIDwgYUxl
bmd0aCAtIDEgJiYgSVNfTE9XX1NVUlJPR0FURShhVGV4dFtpKzFdKSkKKyAgICAgICAgICBpKys7
CisgICAgICAgIGVsc2UKKyAgICAgICAgICBwW2ldID0gMHhGRkZEOworICAgICAgfQorICAgIH0K
KworICAgIGFUZXh0ID0gcDsKKyAgfQorCisgIGdsb25nIGl0ZW1zX3dyaXR0ZW47CisgIHRleHQg
PSBnX3V0ZjE2X3RvX3V0ZjgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBndW5pY2hhcjIqPihhVGV4
dCksIGFMZW5ndGgsIE5VTEwsICZpdGVtc193cml0dGVuLCBOVUxMKTsKKyAgbGVuZ3RoID0gaXRl
bXNfd3JpdHRlbjsKKworICBpZiAobmVlZF9jb3B5KQorICAgIGdfZnJlZSgoZ3BvaW50ZXIpYVRl
eHQpOworCit9CisKK3N0YXRpYyBnY2hhciogY29udmVydFVuaUNoYXJUb1VURjgoY29uc3QgVUNo
YXIqIGNoYXJhY3RlcnMsIGdpbnQgbGVuZ3RoLCBpbnQgZnJvbSwgaW50IHRvKQoreworICAgIGdj
aGFyKiB1dGY4ID0gMDsKKyAgICBnaW50IG5ld19sZW5ndGggPSAwOworICAgIHV0ZjE2X3RvX3V0
ZjgoY2hhcmFjdGVycywgbGVuZ3RoLCB1dGY4LCBuZXdfbGVuZ3RoKTsKKyAgICBpZiAoIXV0Zjgp
CisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKGZyb20gPiAwKSB7CisgICAgICAgIC8v
IGRpc2NhcmQgdGhlIGZpcnN0ICdmcm9tJyBjaGFyYWN0ZXJzCisgICAgICAgIC8vIEZJWE1FOiB3
ZSBzaG91bGQgZG8gdGhpcyBiZWZvcmUgdGhlIGNvbnZlcnNpb24gcHJvYmFibHkKKyAgICAgICAg
Z2NoYXIqIHN0cl9sZWZ0ID0gZ191dGY4X29mZnNldF90b19wb2ludGVyKHV0ZjgsIGZyb20pOwor
ICAgICAgICBnY2hhciogdG1wID0gZ19zdHJkdXAoc3RyX2xlZnQpOworICAgICAgICBnX2ZyZWUo
dXRmOCk7CisgICAgICAgIHV0ZjggPSB0bXA7CisgICAgfQorCisgICAgZ2NoYXIqIHBvcyA9IHV0
Zjg7CisgICAgZ2ludCBsZW4gPSBzdHJsZW4ocG9zKTsKKyAgICBHU3RyaW5nKiByZXQgPSBnX3N0
cmluZ19uZXdfbGVuKE5VTEwsIGxlbik7CisKKyAgICAvLyByZXBsYWNlIGxpbmUgYnJlYWsgYnkg
c3BhY2UKKyAgICB3aGlsZSAobGVuID4gMCkgeworICAgICAgICBnaW50IGluZGV4LCBzdGFydDsK
KyAgICAgICAgcGFuZ29fZmluZF9wYXJhZ3JhcGhfYm91bmRhcnkocG9zLCBsZW4sICZpbmRleCwg
JnN0YXJ0KTsKKyAgICAgICAgZ19zdHJpbmdfYXBwZW5kX2xlbihyZXQsIHBvcywgaW5kZXgpOwor
ICAgICAgICBpZiAoaW5kZXggPT0gc3RhcnQpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Z19zdHJpbmdfYXBwZW5kX2MocmV0LCAnICcpOworICAgICAgICBwb3MgKz0gc3RhcnQ7CisgICAg
ICAgIGxlbiAtPSBzdGFydDsKKyAgICB9CisgICAgcmV0dXJuIGdfc3RyaW5nX2ZyZWUocmV0LCBG
QUxTRSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldFBhbmdvQXR0cmlidXRlcyhjb25zdCBGb250KiBm
b250LCBjb25zdCBUZXh0UnVuJiBydW4sIFBhbmdvTGF5b3V0KiBsYXlvdXQpCit7CisgICAgaWYg
KGZvbnQtPnByaW1hcnlGb250KCktPnBsYXRmb3JtRGF0YSgpLm1fZm9udCkgeworICAgICAgICBQ
YW5nb0ZvbnREZXNjcmlwdGlvbiogZGVzYyA9IHBhbmdvX2ZvbnRfZGVzY3JpYmUoZm9udC0+cHJp
bWFyeUZvbnQoKS0+cGxhdGZvcm1EYXRhKCkubV9mb250KTsKKyAgICAgICAgcGFuZ29fbGF5b3V0
X3NldF9mb250X2Rlc2NyaXB0aW9uKGxheW91dCwgZGVzYyk7CisgICAgICAgIHBhbmdvX2ZvbnRf
ZGVzY3JpcHRpb25fZnJlZShkZXNjKTsKKyAgICB9CisKKyAgICBwYW5nb19sYXlvdXRfc2V0X2F1
dG9fZGlyKGxheW91dCwgRkFMU0UpOworCisgICAgUGFuZ29Db250ZXh0KiBwYW5nb0NvbnRleHQg
PSBwYW5nb19sYXlvdXRfZ2V0X2NvbnRleHQobGF5b3V0KTsKKyAgICBQYW5nb0RpcmVjdGlvbiBk
aXJlY3Rpb24gPSBydW4ucnRsKCkgPyBQQU5HT19ESVJFQ1RJT05fUlRMIDogUEFOR09fRElSRUNU
SU9OX0xUUjsKKyAgICBwYW5nb19jb250ZXh0X3NldF9iYXNlX2RpcihwYW5nb0NvbnRleHQsIGRp
cmVjdGlvbik7CisgICAgUGFuZ29BdHRyTGlzdCogbGlzdCA9IHBhbmdvX2F0dHJfbGlzdF9uZXco
KTsKKyAgICBQYW5nb0F0dHJpYnV0ZSogYXR0cjsKKworICAgIGF0dHIgPSBwYW5nb19hdHRyX3Np
emVfbmV3X2Fic29sdXRlKGZvbnQtPnBpeGVsU2l6ZSgpICogUEFOR09fU0NBTEUpOworICAgIGF0
dHItPmVuZF9pbmRleCA9IEdfTUFYVUlOVDsKKyAgICBwYW5nb19hdHRyX2xpc3RfaW5zZXJ0X2Jl
Zm9yZShsaXN0LCBhdHRyKTsKKworICAgIGlmICghcnVuLnNwYWNpbmdEaXNhYmxlZCgpKSB7Cisg
ICAgICAgIGF0dHIgPSBwYW5nb19hdHRyX2xldHRlcl9zcGFjaW5nX25ldyhmb250LT5sZXR0ZXJT
cGFjaW5nKCkgKiBQQU5HT19TQ0FMRSk7CisgICAgICAgIGF0dHItPmVuZF9pbmRleCA9IEdfTUFY
VUlOVDsKKyAgICAgICAgcGFuZ29fYXR0cl9saXN0X2luc2VydF9iZWZvcmUobGlzdCwgYXR0cik7
CisgICAgfQorCisgICAgLy8gUGFuZ28gZG9lcyBub3QgeWV0IHN1cHBvcnQgc3ludGhlc2lzaW5n
IHNtYWxsIGNhcHMKKyAgICAvLyBTZWUgaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MTU2MTAKKworICAgIHBhbmdvX2xheW91dF9zZXRfYXR0cmlidXRlcyhsYXlvdXQsIGxp
c3QpOworICAgIHBhbmdvX2F0dHJfbGlzdF91bnJlZihsaXN0KTsKK30KKworYm9vbCBGb250Ojpj
YW5SZXR1cm5GYWxsYmFja0ZvbnRzRm9yQ29tcGxleFRleHQoKQoreworICAgIHJldHVybiBmYWxz
ZTsKK30KKwordm9pZCBGb250OjpkcmF3Q29tcGxleFRleHQoR3JhcGhpY3NDb250ZXh0KiBjb250
ZXh0LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBpbnQgZnJv
bSwgaW50IHRvKSBjb25zdAoreworICAgIGNhaXJvX3QqIGNyID0gY29udGV4dC0+cGxhdGZvcm1D
b250ZXh0KCk7CisgICAgY2Fpcm9fc2F2ZShjcik7CisgICAgY2Fpcm9fdHJhbnNsYXRlKGNyLCBw
b2ludC54KCksIHBvaW50LnkoKSk7CisKKyAgICBQYW5nb0xheW91dCogbGF5b3V0ID0gcGFuZ29f
Y2Fpcm9fY3JlYXRlX2xheW91dChjcik7CisgICAgc2V0UGFuZ29BdHRyaWJ1dGVzKHRoaXMsIHJ1
biwgbGF5b3V0KTsKKworICAgIGdjaGFyKiB1dGY4ID0gY29udmVydFVuaUNoYXJUb1VURjgocnVu
LmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpLCAwLCBydW4ubGVuZ3RoKCkpOworICAgIHBhbmdv
X2xheW91dF9zZXRfdGV4dChsYXlvdXQsIHV0ZjgsIC0xKTsKKworICAgIC8vIE91ciBsYXlvdXRz
IGFyZSBzaW5nbGUgbGluZQorICAgIFBhbmdvTGF5b3V0TGluZSogbGF5b3V0TGluZSA9IHBhbmdv
X2xheW91dF9nZXRfbGluZV9yZWFkb25seShsYXlvdXQsIDApOworCisgICAgR2RrUmVnaW9uKiBw
YXJ0aWFsUmVnaW9uID0gTlVMTDsKKyAgICBpZiAodG8gLSBmcm9tICE9IHJ1bi5sZW5ndGgoKSkg
eworICAgICAgICAvLyBDbGlwIHRoZSByZWdpb24gb2YgdGhlIHJ1biB0byBiZSByZW5kZXJlZAor
ICAgICAgICBjaGFyKiBzdGFydCA9IGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcih1dGY4LCBmcm9t
KTsKKyAgICAgICAgY2hhciogZW5kID0gZ191dGY4X29mZnNldF90b19wb2ludGVyKHN0YXJ0LCB0
byAtIGZyb20pOworICAgICAgICBpbnQgcmFuZ2VzW10gPSB7c3RhcnQgLSB1dGY4LCBlbmQgLSB1
dGY4fTsKKyAgICAgICAgcGFydGlhbFJlZ2lvbiA9IGdka19wYW5nb19sYXlvdXRfbGluZV9nZXRf
Y2xpcF9yZWdpb24obGF5b3V0TGluZSwgMCwgMCwgcmFuZ2VzLCAxKTsKKyAgICAgICAgZ2RrX3Jl
Z2lvbl9zaHJpbmsocGFydGlhbFJlZ2lvbiwgMCwgLXBpeGVsU2l6ZSgpKTsKKyAgICB9CisKKyAg
ICBDb2xvciBmaWxsQ29sb3IgPSBjb250ZXh0LT5maWxsQ29sb3IoKTsKKyAgICBmbG9hdCByZWQs
IGdyZWVuLCBibHVlLCBhbHBoYTsKKworICAgIC8vIFRleHQgc2hhZG93LCBpbnNwaXJlZCBieSBG
b250TWFjCisgICAgSW50U2l6ZSBzaGFkb3dTaXplOworICAgIGludCBzaGFkb3dCbHVyID0gMDsK
KyAgICBDb2xvciBzaGFkb3dDb2xvcjsKKyAgICBib29sIGhhc1NoYWRvdyA9IGNvbnRleHQtPnRl
eHREcmF3aW5nTW9kZSgpID09IGNUZXh0RmlsbCAmJgorICAgICAgICBjb250ZXh0LT5nZXRTaGFk
b3coc2hhZG93U2l6ZSwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IpOworCisgICAgLy8gVE9ETzog
Qmx1ciBzdXBwb3J0CisgICAgaWYgKGhhc1NoYWRvdykgeworICAgICAgICAvLyBEaXNhYmxlIGdy
YXBoaWNzIGNvbnRleHQgc2hhZG93cyAobm90IHlldCBpbXBsZW1lbnRlZCkgYW5kIHBhaW50IHRo
ZW0gbWFudWFsbHkKKyAgICAgICAgY29udGV4dC0+Y2xlYXJTaGFkb3coKTsKKyAgICAgICAgQ29s
b3Igc2hhZG93RmlsbENvbG9yKHNoYWRvd0NvbG9yLnJlZCgpLCBzaGFkb3dDb2xvci5ncmVlbigp
LCBzaGFkb3dDb2xvci5ibHVlKCksIHNoYWRvd0NvbG9yLmFscGhhKCkgKiBmaWxsQ29sb3IuYWxw
aGEoKSAvIDI1NSk7CisgICAgICAgIGNhaXJvX3NhdmUoY3IpOworCisgICAgICAgIHNoYWRvd0Zp
bGxDb2xvci5nZXRSR0JBKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgY2Fpcm9f
c2V0X3NvdXJjZV9yZ2JhKGNyLCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisKKyAgICAgICAg
Y2Fpcm9fdHJhbnNsYXRlKGNyLCBzaGFkb3dTaXplLndpZHRoKCksIHNoYWRvd1NpemUuaGVpZ2h0
KCkpOworCisgICAgICAgIGlmIChwYXJ0aWFsUmVnaW9uKSB7CisgICAgICAgICAgICBnZGtfY2Fp
cm9fcmVnaW9uKGNyLCBwYXJ0aWFsUmVnaW9uKTsKKyAgICAgICAgICAgIGNhaXJvX2NsaXAoY3Ip
OworICAgICAgICB9CisKKyAgICAgICAgcGFuZ29fY2Fpcm9fc2hvd19sYXlvdXRfbGluZShjciwg
bGF5b3V0TGluZSk7CisKKyAgICAgICAgY2Fpcm9fcmVzdG9yZShjcik7CisgICAgfQorCisgICAg
ZmlsbENvbG9yLmdldFJHQkEocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworICAgIGNhaXJvX3Nl
dF9zb3VyY2VfcmdiYShjciwgcmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpOworCisgICAgaWYgKHBh
cnRpYWxSZWdpb24pIHsKKyAgICAgICAgZ2RrX2NhaXJvX3JlZ2lvbihjciwgcGFydGlhbFJlZ2lv
bik7CisgICAgICAgIGNhaXJvX2NsaXAoY3IpOworICAgIH0KKworICAgIHBhbmdvX2NhaXJvX3No
b3dfbGF5b3V0X2xpbmUoY3IsIGxheW91dExpbmUpOworCisgICAgaWYgKGNvbnRleHQtPnRleHRE
cmF3aW5nTW9kZSgpICYgY1RleHRTdHJva2UpIHsKKyAgICAgICAgQ29sb3Igc3Ryb2tlQ29sb3Ig
PSBjb250ZXh0LT5zdHJva2VDb2xvcigpOworICAgICAgICBzdHJva2VDb2xvci5nZXRSR0JBKHJl
ZCwgZ3JlZW4sIGJsdWUsIGFscGhhKTsKKyAgICAgICAgY2Fpcm9fc2V0X3NvdXJjZV9yZ2JhKGNy
LCByZWQsIGdyZWVuLCBibHVlLCBhbHBoYSk7CisgICAgICAgIHBhbmdvX2NhaXJvX2xheW91dF9s
aW5lX3BhdGgoY3IsIGxheW91dExpbmUpOworICAgICAgICBjYWlyb19zZXRfbGluZV93aWR0aChj
ciwgY29udGV4dC0+c3Ryb2tlVGhpY2tuZXNzKCkpOworICAgICAgICBjYWlyb19zdHJva2UoY3Ip
OworICAgIH0KKworICAgIC8vIFJlLWVuYWJsZSB0aGUgcGxhdGZvcm0gc2hhZG93IHdlIGRpc2Fi
bGVkIGVhcmxpZXIKKyAgICBpZiAoaGFzU2hhZG93KQorICAgICAgICBjb250ZXh0LT5zZXRTaGFk
b3coc2hhZG93U2l6ZSwgc2hhZG93Qmx1ciwgc2hhZG93Q29sb3IsIERldmljZUNvbG9yU3BhY2Up
OworCisgICAgLy8gUGFuZ28gc29tZXRpbWVzIGxlYXZlcyBiZWhpbmQgcGF0aHMgd2UgZG9uJ3Qg
d2FudAorICAgIGNhaXJvX25ld19wYXRoKGNyKTsKKworICAgIGlmIChwYXJ0aWFsUmVnaW9uKQor
ICAgICAgICBnZGtfcmVnaW9uX2Rlc3Ryb3kocGFydGlhbFJlZ2lvbik7CisKKyAgICBnX2ZyZWUo
dXRmOCk7CisgICAgZ19vYmplY3RfdW5yZWYobGF5b3V0KTsKKworICAgIGNhaXJvX3Jlc3RvcmUo
Y3IpOworfQorCisvLyBXZSBzaG91bGQgY3JlYXRlIHRoZSBsYXlvdXQgd2l0aCBvdXIgYWN0dWFs
IGNvbnRleHQgYnV0IHdlIGNhbid0IGFjY2VzcyBpdCBmcm9tIGhlcmUuCitzdGF0aWMgUGFuZ29M
YXlvdXQqIGdldERlZmF1bHRQYW5nb0xheW91dChjb25zdCBUZXh0UnVuJiBydW4pCit7CisgICAg
c3RhdGljIFBhbmdvRm9udE1hcCogbWFwID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfZ2V0X2RlZmF1
bHQoKTsKKyNpZiBQQU5HT19WRVJTSU9OX0NIRUNLKDEsMjEsNSkKKyAgICBzdGF0aWMgUGFuZ29D
b250ZXh0KiBwYW5nb0NvbnRleHQgPSBwYW5nb19mb250X21hcF9jcmVhdGVfY29udGV4dChtYXAp
OworI2Vsc2UKKyAgICAvLyBEZXByZWNhdGVkIGluIFBhbmdvIDEuMjEuCisgICAgc3RhdGljIFBh
bmdvQ29udGV4dCogcGFuZ29Db250ZXh0ID0gcGFuZ29fY2Fpcm9fZm9udF9tYXBfY3JlYXRlX2Nv
bnRleHQoUEFOR09fQ0FJUk9fRk9OVF9NQVAobWFwKSk7CisjZW5kaWYKKyAgICBQYW5nb0xheW91
dCogbGF5b3V0ID0gcGFuZ29fbGF5b3V0X25ldyhwYW5nb0NvbnRleHQpOworCisgICAgcmV0dXJu
IGxheW91dDsKK30KKworZmxvYXQgRm9udDo6ZmxvYXRXaWR0aEZvckNvbXBsZXhUZXh0KGNvbnN0
IFRleHRSdW4mIHJ1biwgSGFzaFNldDxjb25zdCBTaW1wbGVGb250RGF0YSo+KiAvKiBmYWxsYmFj
a0ZvbnRzICovKSBjb25zdAoreworICAgIGlmIChydW4ubGVuZ3RoKCkgPT0gMCkKKyAgICAgICAg
cmV0dXJuIDAuMGY7CisKKyAgICBQYW5nb0xheW91dCogbGF5b3V0ID0gZ2V0RGVmYXVsdFBhbmdv
TGF5b3V0KHJ1bik7CisgICAgc2V0UGFuZ29BdHRyaWJ1dGVzKHRoaXMsIHJ1biwgbGF5b3V0KTsK
KworICAgIGdjaGFyKiB1dGY4ID0gY29udmVydFVuaUNoYXJUb1VURjgocnVuLmNoYXJhY3RlcnMo
KSwgcnVuLmxlbmd0aCgpLCAwLCBydW4ubGVuZ3RoKCkpOworICAgIHBhbmdvX2xheW91dF9zZXRf
dGV4dChsYXlvdXQsIHV0ZjgsIC0xKTsKKworICAgIGludCB3aWR0aDsKKyAgICBwYW5nb19sYXlv
dXRfZ2V0X3BpeGVsX3NpemUobGF5b3V0LCAmd2lkdGgsIDApOworCisgICAgZ19mcmVlKHV0Zjgp
OworICAgIGdfb2JqZWN0X3VucmVmKGxheW91dCk7CisKKyAgICByZXR1cm4gd2lkdGg7Cit9CisK
K2ludCBGb250OjpvZmZzZXRGb3JQb3NpdGlvbkZvckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4m
IHJ1biwgaW50IHgsIGJvb2wgaW5jbHVkZVBhcnRpYWxHbHlwaHMpIGNvbnN0Cit7CisgICAgUGFu
Z29MYXlvdXQqIGxheW91dCA9IGdldERlZmF1bHRQYW5nb0xheW91dChydW4pOworICAgIHNldFBh
bmdvQXR0cmlidXRlcyh0aGlzLCBydW4sIGxheW91dCk7CisKKyAgICBnY2hhciogdXRmOCA9IGNv
bnZlcnRVbmlDaGFyVG9VVEY4KHJ1bi5jaGFyYWN0ZXJzKCksIHJ1bi5sZW5ndGgoKSwgMCwgcnVu
Lmxlbmd0aCgpKTsKKyAgICBwYW5nb19sYXlvdXRfc2V0X3RleHQobGF5b3V0LCB1dGY4LCAtMSk7
CisKKyAgICBpbnQgaW5kZXgsIHRyYWlsaW5nOworICAgIHBhbmdvX2xheW91dF94eV90b19pbmRl
eChsYXlvdXQsIHggKiBQQU5HT19TQ0FMRSwgMSwgJmluZGV4LCAmdHJhaWxpbmcpOworICAgIGds
b25nIG9mZnNldCA9IGdfdXRmOF9wb2ludGVyX3RvX29mZnNldCh1dGY4LCB1dGY4ICsgaW5kZXgp
OworICAgIGlmIChpbmNsdWRlUGFydGlhbEdseXBocykKKyAgICAgICAgb2Zmc2V0ICs9IHRyYWls
aW5nOworCisgICAgZ19mcmVlKHV0ZjgpOworICAgIGdfb2JqZWN0X3VucmVmKGxheW91dCk7CisK
KyAgICByZXR1cm4gb2Zmc2V0OworfQorCitGbG9hdFJlY3QgRm9udDo6c2VsZWN0aW9uUmVjdEZv
ckNvbXBsZXhUZXh0KGNvbnN0IFRleHRSdW4mIHJ1biwgY29uc3QgSW50UG9pbnQmIHBvaW50LCBp
bnQgaCwgaW50IGZyb20sIGludCB0bykgY29uc3QKK3sKKyAgICBQYW5nb0xheW91dCogbGF5b3V0
ID0gZ2V0RGVmYXVsdFBhbmdvTGF5b3V0KHJ1bik7CisgICAgc2V0UGFuZ29BdHRyaWJ1dGVzKHRo
aXMsIHJ1biwgbGF5b3V0KTsKKworICAgIGdjaGFyKiB1dGY4ID0gY29udmVydFVuaUNoYXJUb1VU
RjgocnVuLmNoYXJhY3RlcnMoKSwgcnVuLmxlbmd0aCgpLCAwLCBydW4ubGVuZ3RoKCkpOworICAg
IHBhbmdvX2xheW91dF9zZXRfdGV4dChsYXlvdXQsIHV0ZjgsIC0xKTsKKworICAgIGNoYXIqIHN0
YXJ0ID0gZ191dGY4X29mZnNldF90b19wb2ludGVyKHV0ZjgsIGZyb20pOworICAgIGNoYXIqIGVu
ZCA9IGdfdXRmOF9vZmZzZXRfdG9fcG9pbnRlcihzdGFydCwgdG8gLSBmcm9tKTsKKworICAgIGlm
IChydW4ubHRyKCkpIHsKKyAgICAgICAgZnJvbSA9IHN0YXJ0IC0gdXRmODsKKyAgICAgICAgdG8g
PSBlbmQgLSB1dGY4OworICAgIH0gZWxzZSB7CisgICAgICAgIGZyb20gPSBlbmQgLSB1dGY4Owor
ICAgICAgICB0byA9IHN0YXJ0IC0gdXRmODsKKyAgICB9CisKKyAgICBQYW5nb0xheW91dExpbmUq
IGxheW91dExpbmUgPSBwYW5nb19sYXlvdXRfZ2V0X2xpbmVfcmVhZG9ubHkobGF5b3V0LCAwKTsK
KyAgICBpbnQgeF9wb3M7CisKKyAgICB4X3BvcyA9IDA7CisgICAgaWYgKGZyb20gPCBsYXlvdXRM
aW5lLT5sZW5ndGgpCisgICAgICAgIHBhbmdvX2xheW91dF9saW5lX2luZGV4X3RvX3gobGF5b3V0
TGluZSwgZnJvbSwgRkFMU0UsICZ4X3Bvcyk7CisgICAgZmxvYXQgYmVmb3JlV2lkdGggPSBQQU5H
T19QSVhFTFNfRkxPT1IoeF9wb3MpOworCisgICAgeF9wb3MgPSAwOworICAgIGlmIChydW4ubHRy
KCkgfHwgdG8gPCBsYXlvdXRMaW5lLT5sZW5ndGgpCisgICAgICAgIHBhbmdvX2xheW91dF9saW5l
X2luZGV4X3RvX3gobGF5b3V0TGluZSwgdG8sIEZBTFNFLCAmeF9wb3MpOworICAgIGZsb2F0IGFm
dGVyV2lkdGggPSBQQU5HT19QSVhFTFMoeF9wb3MpOworCisgICAgZ19mcmVlKHV0ZjgpOworICAg
IGdfb2JqZWN0X3VucmVmKGxheW91dCk7CisKKyAgICByZXR1cm4gRmxvYXRSZWN0KHBvaW50Lngo
KSArIGJlZm9yZVdpZHRoLCBwb2ludC55KCksIGFmdGVyV2lkdGggLSBiZWZvcmVXaWR0aCwgaCk7
Cit9CisKK30K
</data>

          </attachment>
      

    </bug>

</bugzilla>