<?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>38334</bug_id>
          
          <creation_ts>2010-04-29 10:53:54 -0700</creation_ts>
          <short_desc>Allow other ports to compile ATSUI and CoreText functions in SimpleFontData for Mac.</short_desc>
          <delta_ts>2010-04-30 11:47:11 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>OS X 10.5</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="Kevin Ollivier">kevino</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>eric</cc>
    
    <cc>playmobil</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>219093</commentid>
    <comment_count>0</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2010-04-29 10:53:54 -0700</bug_when>
    <thetext>Allow other ports to compile ATSUI and CoreText functions in SimpleFontData for Mac.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219099</commentid>
    <comment_count>1</comment_count>
      <attachid>54719</attachid>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2010-04-29 11:06:24 -0700</bug_when>
    <thetext>Created attachment 54719
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219109</commentid>
    <comment_count>2</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2010-04-29 11:25:02 -0700</bug_when>
    <thetext>This is needed so that wx can compile and use ComplexTextController, BTW.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219116</commentid>
    <comment_count>3</comment_count>
      <attachid>54719</attachid>
    <who name="">mitz</who>
    <bug_when>2010-04-29 11:28:47 -0700</bug_when>
    <thetext>Comment on attachment 54719
Patch

This should be done by svn cp’ing SimpleFontDataMac.mm to the two new files and removing everything but the needed methods, includes and copyright headers. The #if USE()s should go outside the namespace and the second paragraph of #includes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219233</commentid>
    <comment_count>4</comment_count>
      <attachid>54747</attachid>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2010-04-29 16:00:54 -0700</bug_when>
    <thetext>Created attachment 54747
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219236</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-29 16:03:42 -0700</bug_when>
    <thetext>Attachment 54747 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--no-squash&apos;]&quot; exit_code: 1
WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp:48:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp:74:  Use 0 instead of NULL.  [readability/null] [5]
WebCore/platform/graphics/mac/SimpleFontDataCoreText.cpp:81:  Use 0 instead of NULL.  [readability/null] [5]
Total errors found: 3 in 4 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219237</commentid>
    <comment_count>6</comment_count>
      <attachid>54747</attachid>
    <who name="">mitz</who>
    <bug_when>2010-04-29 16:05:33 -0700</bug_when>
    <thetext>Comment on attachment 54747
Patch

Is there a reason why you didn’t address my second feedback item, regarding the placement of the #if directives?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219240</commentid>
    <comment_count>7</comment_count>
      <attachid>54749</attachid>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2010-04-29 16:07:45 -0700</bug_when>
    <thetext>Created attachment 54749
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219242</commentid>
    <comment_count>8</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2010-04-29 16:08:51 -0700</bug_when>
    <thetext>(In reply to comment #6)
&gt; (From update of attachment 54747 [details])
&gt; Is there a reason why you didn’t address my second feedback item, regarding the
&gt; placement of the #if directives?

Oops, sorry, no, I just got caught up in redoing the patch and forgot about it. I&apos;ll fix and re-upload.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219243</commentid>
    <comment_count>9</comment_count>
      <attachid>54751</attachid>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2010-04-29 16:11:02 -0700</bug_when>
    <thetext>Created attachment 54751
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219381</commentid>
    <comment_count>10</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-29 23:48:07 -0700</bug_when>
    <thetext>The patch was committed as r58557, and rolled out by r58560 because of compile errors on Tiger, Leopard, and Chromium/Mac.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219382</commentid>
    <comment_count>11</comment_count>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2010-04-29 23:49:49 -0700</bug_when>
    <thetext>(In reply to comment #10)
&gt; The patch was committed as r58557, and rolled out by r58560 because of compile
&gt; errors on Tiger, Leopard, and Chromium/Mac.

Correction: Tiger was ok.  Leopard and Chromium/Mac failed.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219439</commentid>
    <comment_count>12</comment_count>
    <who name="Jeremy Moskovich">playmobil</who>
    <bug_when>2010-04-30 04:44:39 -0700</bug_when>
    <thetext>I haven&apos;t looked into the compile failures but FYI Chromium compiles with both the ATSUI &amp; Core text functionality enabled and switches the APIs used at runtime.  This, as opposed to other ports that make the decision at compile time.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219514</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-04-30 09:51:13 -0700</bug_when>
    <thetext>http://trac.webkit.org/changeset/58581 might have broken Chromium Mac Release</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>219552</commentid>
    <comment_count>14</comment_count>
    <who name="Kevin Ollivier">kevino</who>
    <bug_when>2010-04-30 11:47:11 -0700</bug_when>
    <thetext>Landed in r58581, with Chromium build fix in r58582.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54719</attachid>
            <date>2010-04-29 11:06:24 -0700</date>
            <delta_ts>2010-04-29 16:00:51 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38334-20100429110623.patch</filename>
            <type>text/plain</type>
            <size>17066</size>
            <attacher name="Kevin Ollivier">kevino</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1ODUyNSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTggQEAKKzIwMTAtMDQtMjkgIEtldmluIE9sbGl2aWVyICA8a2V2aW5vQHRoZW9s
bGl2aWVycy5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQWxsb3cgb3RoZXIgcG9ydHMgdG8gY29tcGlsZSBBVFNVSSBhbmQgQ29yZVRleHQgZnVu
Y3Rpb25zIGluIFNpbXBsZUZvbnREYXRhIGZvciBNYWMuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODMzNAorCisgICAgICAgICogV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9T
aW1wbGVGb250RGF0YUFUU1VJLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTaW1wbGVG
b250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNz
L21hYy9TaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3Jl
OjpTaW1wbGVGb250RGF0YTo6Z2V0Q1RGb250KToKKyAgICAgICAgKFdlYkNvcmU6OlNpbXBsZUZv
bnREYXRhOjpnZXRDRlN0cmluZ0F0dHJpYnV0ZXMpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBo
aWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbToKKwogMjAxMC0wNC0yOSAgTWlraGFpbCBOYWdh
bm92ICA8bW5hZ2Fub3ZAY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFJldmlld2VkIGJ5IFl1cnkg
U2VtaWtoYXRza3kuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4
cHJvagkocmV2aXNpb24gNTg1MjApCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2pl
Y3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMjgxLDYgKzI4MSw4IEBACiAJCTE1Qzc3MDk0
MTAwRDNDQTgwMDVCQTI2NyAvKiBKU1ZhbGlkaXR5U3RhdGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7
aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTVDNzcwOTIxMDBEM0NBODAwNUJBMjY3IC8q
IEpTVmFsaWRpdHlTdGF0ZS5jcHAgKi87IH07CiAJCTE1Qzc3MEE1MTAwRDQxQ0QwMDVCQTI2NyAv
KiBET01WYWxpZGl0eVN0YXRlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMTVDNzcwQTMxMDBENDFDRDAwNUJBMjY3IC8qIERPTVZhbGlkaXR5U3RhdGUu
bW0gKi87IH07CiAJCTE1Qzc3MEE2MTAwRDQxQ0QwMDVCQTI2NyAvKiBET01WYWxpZGl0eVN0YXRl
LmggaW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNUM3NzBB
NDEwMEQ0MUNEMDA1QkEyNjcgLyogRE9NVmFsaWRpdHlTdGF0ZS5oICovOyB9OworCQkxNjNFODZE
RTExODlGQjQ3MDBFRDkyMzEgLyogU2ltcGxlRm9udERhdGFBVFNVSS5jcHAgaW4gU291cmNlcyAq
LyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNjNFODZEQzExODlGQjQ3MDBFRDky
MzEgLyogU2ltcGxlRm9udERhdGFBVFNVSS5jcHAgKi87IH07CisJCTE2M0U4NkRGMTE4OUZCNDcw
MEVEOTIzMSAvKiBTaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE2M0U4NkREMTE4OUZCNDcwMEVEOTIzMSAvKiBT
aW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCAqLzsgfTsKIAkJMTg1QkNGMjgwRjMyNzlDRTAwMEVB
MjYyIC8qIFRocmVhZFRpbWVycy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZp
bGU7IGZpbGVSZWYgPSAxODVCQ0YyNjBGMzI3OUNFMDAwRUEyNjIgLyogVGhyZWFkVGltZXJzLmNw
cCAqLzsgfTsKIAkJMTg1QkNGMjkwRjMyNzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5oIGlu
IEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTg1QkNGMjcwRjMy
NzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5oICovOyB9OwogCQkxODg2MDRCMzBGMkU2NTRB
MDAwQjY0NDMgLyogRE9NVGltZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gMTg4NjA0QjEwRjJFNjU0QTAwMEI2NDQzIC8qIERPTVRpbWVyLmNwcCAq
LzsgfTsKQEAgLTU2NzcsNiArNTY3OSw4IEBACiAJCTE1Qzc3MDkyMTAwRDNDQTgwMDVCQTI2NyAv
KiBKU1ZhbGlkaXR5U3RhdGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRo
ID0gSlNWYWxpZGl0eVN0YXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTVD
NzcwQTMxMDBENDFDRDAwNUJBMjY3IC8qIERPTVZhbGlkaXR5U3RhdGUubW0gKi8gPSB7aXNhID0g
UEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBz
b3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBET01WYWxpZGl0eVN0YXRlLm1tOyBzb3VyY2VU
cmVlID0gIjxncm91cD4iOyB9OwogCQkxNUM3NzBBNDEwMEQ0MUNEMDA1QkEyNjcgLyogRE9NVmFs
aWRpdHlTdGF0ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9
IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBET01WYWxpZGl0
eVN0YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTE2M0U4NkRDMTE4OUZCNDcw
MEVEOTIzMSAvKiBTaW1wbGVGb250RGF0YUFUU1VJLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVm
ZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUu
Y3BwLmNwcDsgcGF0aCA9IFNpbXBsZUZvbnREYXRhQVRTVUkuY3BwOyBzb3VyY2VUcmVlID0gIjxn
cm91cD4iOyB9OworCQkxNjNFODZERDExODlGQjQ3MDBFRDkyMzEgLyogU2ltcGxlRm9udERhdGFD
b3JlVGV4dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0g
NDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTaW1wbGVG
b250RGF0YUNvcmVUZXh0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTg1QkNG
MjYwRjMyNzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5jcHAgKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vj
b2RlLmNwcC5jcHA7IHBhdGggPSBUaHJlYWRUaW1lcnMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OwogCQkxODVCQ0YyNzBGMzI3OUNFMDAwRUEyNjIgLyogVGhyZWFkVGltZXJzLmggKi8g
PSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmls
ZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRocmVhZFRpbWVycy5oOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkxODg2MDRCMTBGMkU2NTRBMDAwQjY0NDMgLyogRE9NVGltZXIu
Y3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RL
bm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRE9NVGltZXIuY3BwOyBz
b3VyY2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTQ2MTYsNiArMTQ2MjAsOCBAQAogCQlCMjc1
MzU0OTBCMDUzODE0MDAyQ0U2NEYgLyogbWFjICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJ
CQljaGlsZHJlbiA9ICgKKwkJCQkxNjNFODZEQzExODlGQjQ3MDBFRDkyMzEgLyogU2ltcGxlRm9u
dERhdGFBVFNVSS5jcHAgKi8sCisJCQkJMTYzRTg2REQxMTg5RkI0NzAwRUQ5MjMxIC8qIFNpbXBs
ZUZvbnREYXRhQ29yZVRleHQuY3BwICovLAogCQkJCTQ5QzdCOUZEMTA0MkQzOEMwMDA5RDQ0NyAv
KiBDYW52YXMzRExheWVyLmggKi8sCiAJCQkJNDlDN0I5RkUxMDQyRDM4QzAwMDlENDQ3IC8qIENh
bnZhczNETGF5ZXIubW0gKi8sCiAJCQkJRURFM0E0RkYwQzdBNDMwNjAwOTU2QTM3IC8qIENvbG9y
TWFjLmggKi8sCkBAIC0yMTE0NSw2ICsyMTE1MSw4IEBACiAJCQkJMEZGMjg1OTIxMTg2NDA1NDAw
N0I3Q0Q2IC8qIFJlbmRlck1hdGhNTFNxdWFyZVJvb3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJ
QjUyM0NGMDkxMTgyNjc1NDAwRUJCMjlDIC8qIFNRTFRyYW5zYWN0aW9uU3luYy5jcHAgaW4gU291
cmNlcyAqLywKIAkJCQlCNTIzQ0YwQTExODI2NzU0MDBFQkIyOUMgLyogRGF0YWJhc2VTeW5jLmNw
cCBpbiBTb3VyY2VzICovLAorCQkJCTE2M0U4NkRFMTE4OUZCNDcwMEVEOTIzMSAvKiBTaW1wbGVG
b250RGF0YUFUU1VJLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTE2M0U4NkRGMTE4OUZCNDcwMEVE
OTIzMSAvKiBTaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsK
IAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFBVFNVSS5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFB
VFNVSS5jcHAJKHJldmlzaW9uIDApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9T
aW1wbGVGb250RGF0YUFUU1VJLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw3NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBBbGV4ZXkgUHJvc2t1cnlha292
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENv
bXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRy
aWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZl
ZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0
ZW4gcGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJ
RUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1Ig
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAq
IE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8K
KworI2ltcG9ydCAiY29uZmlnLmgiCisjaW1wb3J0ICJTaW1wbGVGb250RGF0YS5oIgorCisjaW1w
b3J0ICJGb250LmgiCisjaW1wb3J0ICJGb250Q2FjaGUuaCIKKyNpbXBvcnQgIkZvbnREZXNjcmlw
dGlvbi5oIgorI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2Vz
Lmg+CisjaW1wb3J0IDxmbG9hdC5oPgorI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgorCit1c2lu
ZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisgIAorI2lmIFVTRShBVFNV
SSkKK3ZvaWQgU2ltcGxlRm9udERhdGE6OmNoZWNrU2hhcGVzQXJhYmljKCkgY29uc3QKK3sKKyAg
ICBBU1NFUlQoIW1fY2hlY2tlZFNoYXBlc0FyYWJpYyk7CisKKyAgICBtX2NoZWNrZWRTaGFwZXNB
cmFiaWMgPSB0cnVlOworICAgIAorICAgIEFUU1VGb250SUQgZm9udElEID0gbV9wbGF0Zm9ybURh
dGEubV9hdHN1Rm9udElEOworICAgIGlmICghZm9udElEKSB7CisgICAgICAgIExPR19FUlJPUigi
dW5hYmxlIHRvIGdldCBBVFNVRm9udElEIGZvciAlQCIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7
CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxl
ZCBvbmx5IG9uIGZvbnRzIHRoYXQgY29udGFpbiBBcmFiaWMgZ2x5cGhzLiBPdXIKKyAgICAvLyBo
ZXVyaXN0aWMgaXMgdGhhdCBpZiBzdWNoIGEgZm9udCBoYXMgYSBnbHlwaCBtZXRhbW9ycGhvc2lz
IHRhYmxlLCB0aGVuCisgICAgLy8gaXQgaW5jbHVkZXMgc2hhcGluZyBpbmZvcm1hdGlvbiBmb3Ig
QXJhYmljLgorICAgIEZvdXJDaGFyQ29kZSB0YWJsZXNbXSA9IHsgJ21vcngnLCAnbW9ydCcgfTsK
KyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKHRhYmxlcykgLyBzaXplb2YodGFi
bGVzWzBdKTsgKytpKSB7CisgICAgICAgIEJ5dGVDb3VudCB0YWJsZVNpemU7CisgICAgICAgIE9T
U3RhdHVzIHN0YXR1cyA9IEFUU0ZvbnRHZXRUYWJsZShmb250SUQsIHRhYmxlc1tpXSwgMCwgMCwg
MCwgJnRhYmxlU2l6ZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpIHsKKyAgICAgICAg
ICAgIG1fc2hhcGVzQXJhYmljID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorCisgICAgICAgIGlmIChzdGF0dXMgIT0ga0FUU0ludmFsaWRGb250VGFibGVBY2Nlc3MpCisg
ICAgICAgICAgICBMT0dfRVJST1IoIkFUU0ZvbnRHZXRUYWJsZSBmYWlsZWQgKCVkKSIsIHN0YXR1
cyk7CisgICAgfQorfQorI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YUNv
cmVUZXh0LmNwcAkocmV2aXNpb24gMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFj
L1NpbXBsZUZvbnREYXRhQ29yZVRleHQuY3BwCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDkyIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQcm9za3Vy
eWFrb3YKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisg
KiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBw
bGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMg
Y29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBk
ZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Ig
d3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUg
SU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRB
LCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlNpbXBsZUZvbnREYXRhLmgiCisK
KyNpbXBvcnQgIkZvbnQuaCIKKyNpbXBvcnQgIkZvbnRDYWNoZS5oIgorI2ltcG9ydCAiRm9udERl
c2NyaXB0aW9uLmgiCisjaW1wb3J0IDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2Vy
dmljZXMuaD4KKyNpbXBvcnQgPGZsb2F0Lmg+CisjaW1wb3J0IDx1bmljb2RlL3VjaGFyLmg+CisK
K3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2lmIFVTRShD
T1JFX1RFWFQpCitDVEZvbnRSZWYgU2ltcGxlRm9udERhdGE6OmdldENURm9udCgpIGNvbnN0Cit7
CisgICAgaWYgKGdldE5TRm9udCgpKQorICAgICAgICByZXR1cm4gdG9DVEZvbnRSZWYoZ2V0TlNG
b250KCkpOworICAgIGlmICghbV9DVEZvbnQpCisgICAgICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RG
b250Q3JlYXRlV2l0aEdyYXBoaWNzRm9udChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0
Zm9ybURhdGEuc2l6ZSgpLCAwLCAwKSk7CisgICAgcmV0dXJuIG1fQ1RGb250LmdldCgpOworfQor
CitDRkRpY3Rpb25hcnlSZWYgU2ltcGxlRm9udERhdGE6OmdldENGU3RyaW5nQXR0cmlidXRlcyhU
eXBlc2V0dGluZ0ZlYXR1cmVzIHR5cGVzZXR0aW5nRmVhdHVyZXMpIGNvbnN0Cit7CisgICAgdW5z
aWduZWQga2V5ID0gdHlwZXNldHRpbmdGZWF0dXJlcyArIDE7CisgICAgcGFpcjxIYXNoTWFwPHVu
c2lnbmVkLCBSZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5UmVmPiA+OjppdGVyYXRvciwgYm9vbD4gYWRk
UmVzdWx0ID0gbV9DRlN0cmluZ0F0dHJpYnV0ZXMuYWRkKGtleSwgUmV0YWluUHRyPENGRGljdGlv
bmFyeVJlZj4oKSk7CisgICAgUmV0YWluUHRyPENGRGljdGlvbmFyeVJlZj4mIGF0dHJpYnV0ZXNE
aWN0aW9uYXJ5ID0gYWRkUmVzdWx0LmZpcnN0LT5zZWNvbmQ7CisgICAgaWYgKCFhZGRSZXN1bHQu
c2Vjb25kKQorICAgICAgICByZXR1cm4gYXR0cmlidXRlc0RpY3Rpb25hcnkuZ2V0KCk7CisKKyAg
ICBib29sIGFsbG93TGlnYXR1cmVzID0gcGxhdGZvcm1EYXRhKCkuYWxsb3dzTGlnYXR1cmVzKCkg
fHwgKHR5cGVzZXR0aW5nRmVhdHVyZXMgJiBMaWdhdHVyZXMpOworCisgICAgc3RhdGljIGNvbnN0
IGludCBsaWdhdHVyZXNOb3RBbGxvd2VkVmFsdWUgPSAwOworICAgIHN0YXRpYyBDRk51bWJlclJl
ZiBsaWdhdHVyZXNOb3RBbGxvd2VkID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVs
dCwga0NGTnVtYmVySW50VHlwZSwgJmxpZ2F0dXJlc05vdEFsbG93ZWRWYWx1ZSk7CisKKyAgICBz
dGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc0FsbG93ZWRWYWx1ZSA9IDE7CisgICAgc3RhdGljIENG
TnVtYmVyUmVmIGxpZ2F0dXJlc0FsbG93ZWQgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JE
ZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAmbGlnYXR1cmVzQWxsb3dlZFZhbHVlKTsKKworICAg
IGlmICghKHR5cGVzZXR0aW5nRmVhdHVyZXMgJiBLZXJuaW5nKSkgeworICAgICAgICBzdGF0aWMg
Y29uc3QgZmxvYXQga2VybmluZ0FkanVzdG1lbnRWYWx1ZSA9IDA7CisgICAgICAgIHN0YXRpYyBD
Rk51bWJlclJlZiBrZXJuaW5nQWRqdXN0bWVudCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRv
ckRlZmF1bHQsIGtDRk51bWJlckZsb2F0VHlwZSwgJmtlcm5pbmdBZGp1c3RtZW50VmFsdWUpOwor
ICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCoga2V5c1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsg
a0NURm9udEF0dHJpYnV0ZU5hbWUsIGtDVEtlcm5BdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0
dHJpYnV0ZU5hbWUgfTsKKyAgICAgICAgY29uc3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdEaXNh
YmxlZFtdID0geyBnZXRDVEZvbnQoKSwga2VybmluZ0FkanVzdG1lbnQsIGFsbG93TGlnYXR1cmVz
CisgICAgICAgICAgICA/IGxpZ2F0dXJlc0FsbG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07
CisgICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRl
KDAsIGtleXNXaXRoS2VybmluZ0Rpc2FibGVkLCB2YWx1ZXNXaXRoS2VybmluZ0Rpc2FibGVkLAor
ICAgICAgICAgICAgc2l6ZW9mKGtleXNXaXRoS2VybmluZ0Rpc2FibGVkKSAvIHNpemVvZigqa2V5
c1dpdGhLZXJuaW5nRGlzYWJsZWQpLAorICAgICAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9u
YXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAg
IH0gZWxzZSB7CisgICAgICAgIC8vIEJ5IG9taXR0aW5nIHRoZSBrQ1RLZXJuQXR0cmlidXRlTmFt
ZSBhdHRyaWJ1dGUsIHdlIGdldCBDb3JlIFRleHQncyBzdGFuZGFyZCBrZXJuaW5nLgorICAgICAg
ICBzdGF0aWMgY29uc3Qgdm9pZCoga2V5c1dpdGhLZXJuaW5nRW5hYmxlZFtdID0geyBrQ1RGb250
QXR0cmlidXRlTmFtZSwga0NUTGlnYXR1cmVBdHRyaWJ1dGVOYW1lIH07CisgICAgICAgIGNvbnN0
IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5nRW5hYmxlZFtdID0geyBnZXRDVEZvbnQoKSwgYWxsb3dM
aWdhdHVyZXMgPyBsaWdhdHVyZXNBbGxvd2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OworICAg
ICAgICBhdHRyaWJ1dGVzRGljdGlvbmFyeS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZSgwLCBr
ZXlzV2l0aEtlcm5pbmdFbmFibGVkLCB2YWx1ZXNXaXRoS2VybmluZ0VuYWJsZWQsCisgICAgICAg
ICAgICBzaXplb2Yoa2V5c1dpdGhLZXJuaW5nRW5hYmxlZCkgLyBzaXplb2YoKmtleXNXaXRoS2Vy
bmluZ0VuYWJsZWQpLAorICAgICAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2Fs
bEJhY2tzLCAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0KKworICAg
IHJldHVybiBhdHRyaWJ1dGVzRGljdGlvbmFyeS5nZXQoKTsKK30KKyNlbmRpZgorCit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9TaW1w
bGVGb250RGF0YU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L21hYy9TaW1wbGVGb250RGF0YU1hYy5tbQkocmV2aXNpb24gNTg1MjApCisrKyBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbQkod29ya2luZyBjb3B5KQpA
QCAtNDM4LDg0ICs0MzgsNCBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZv
ckdsCiAgICAgcmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQ7CiB9
CiAKLSNpZiBVU0UoQVRTVUkpCi12b2lkIFNpbXBsZUZvbnREYXRhOjpjaGVja1NoYXBlc0FyYWJp
YygpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFtX2NoZWNrZWRTaGFwZXNBcmFiaWMpOwotCi0gICAg
bV9jaGVja2VkU2hhcGVzQXJhYmljID0gdHJ1ZTsKLSAgICAKLSAgICBBVFNVRm9udElEIGZvbnRJ
RCA9IG1fcGxhdGZvcm1EYXRhLm1fYXRzdUZvbnRJRDsKLSAgICBpZiAoIWZvbnRJRCkgewotICAg
ICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBnZXQgQVRTVUZvbnRJRCBmb3IgJUAiLCBtX3BsYXRm
b3JtRGF0YS5mb250KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gVGhpcyBm
dW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbiBmb250cyB0aGF0IGNvbnRhaW4gQXJhYmljIGdseXBo
cy4gT3VyCi0gICAgLy8gaGV1cmlzdGljIGlzIHRoYXQgaWYgc3VjaCBhIGZvbnQgaGFzIGEgZ2x5
cGggbWV0YW1vcnBob3NpcyB0YWJsZSwgdGhlbgotICAgIC8vIGl0IGluY2x1ZGVzIHNoYXBpbmcg
aW5mb3JtYXRpb24gZm9yIEFyYWJpYy4KLSAgICBGb3VyQ2hhckNvZGUgdGFibGVzW10gPSB7ICdt
b3J4JywgJ21vcnQnIH07Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHNpemVvZih0YWJs
ZXMpIC8gc2l6ZW9mKHRhYmxlc1swXSk7ICsraSkgewotICAgICAgICBCeXRlQ291bnQgdGFibGVT
aXplOwotICAgICAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0VGFibGUoZm9udElELCB0
YWJsZXNbaV0sIDAsIDAsIDAsICZ0YWJsZVNpemUpOwotICAgICAgICBpZiAoc3RhdHVzID09IG5v
RXJyKSB7Ci0gICAgICAgICAgICBtX3NoYXBlc0FyYWJpYyA9IHRydWU7Ci0gICAgICAgICAgICBy
ZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHVzICE9IGtBVFNJbnZhbGlkRm9u
dFRhYmxlQWNjZXNzKQotICAgICAgICAgICAgTE9HX0VSUk9SKCJBVFNGb250R2V0VGFibGUgZmFp
bGVkICglZCkiLCBzdGF0dXMpOwotICAgIH0KLX0KLSNlbmRpZgotCi0jaWYgVVNFKENPUkVfVEVY
VCkKLUNURm9udFJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q1RGb250KCkgY29uc3QKLXsKLSAgICBp
ZiAoZ2V0TlNGb250KCkpCi0gICAgICAgIHJldHVybiB0b0NURm9udFJlZihnZXROU0ZvbnQoKSk7
Ci0gICAgaWYgKCFtX0NURm9udCkKLSAgICAgICAgbV9DVEZvbnQuYWRvcHRDRihDVEZvbnRDcmVh
dGVXaXRoR3JhcGhpY3NGb250KG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpLCBtX3BsYXRmb3JtRGF0
YS5zaXplKCksIE5VTEwsIE5VTEwpKTsKLSAgICByZXR1cm4gbV9DVEZvbnQuZ2V0KCk7Ci19Ci0K
LUNGRGljdGlvbmFyeVJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q0ZTdHJpbmdBdHRyaWJ1dGVzKFR5
cGVzZXR0aW5nRmVhdHVyZXMgdHlwZXNldHRpbmdGZWF0dXJlcykgY29uc3QKLXsKLSAgICB1bnNp
Z25lZCBrZXkgPSB0eXBlc2V0dGluZ0ZlYXR1cmVzICsgMTsKLSAgICBwYWlyPEhhc2hNYXA8dW5z
aWduZWQsIFJldGFpblB0cjxDRkRpY3Rpb25hcnlSZWY+ID46Oml0ZXJhdG9yLCBib29sPiBhZGRS
ZXN1bHQgPSBtX0NGU3RyaW5nQXR0cmlidXRlcy5hZGQoa2V5LCBSZXRhaW5QdHI8Q0ZEaWN0aW9u
YXJ5UmVmPigpKTsKLSAgICBSZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5UmVmPiYgYXR0cmlidXRlc0Rp
Y3Rpb25hcnkgPSBhZGRSZXN1bHQuZmlyc3QtPnNlY29uZDsKLSAgICBpZiAoIWFkZFJlc3VsdC5z
ZWNvbmQpCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzRGljdGlvbmFyeS5nZXQoKTsKLQotICAg
IGJvb2wgYWxsb3dMaWdhdHVyZXMgPSBwbGF0Zm9ybURhdGEoKS5hbGxvd3NMaWdhdHVyZXMoKSB8
fCAodHlwZXNldHRpbmdGZWF0dXJlcyAmIExpZ2F0dXJlcyk7Ci0KLSAgICBzdGF0aWMgY29uc3Qg
aW50IGxpZ2F0dXJlc05vdEFsbG93ZWRWYWx1ZSA9IDA7Ci0gICAgc3RhdGljIENGTnVtYmVyUmVm
IGxpZ2F0dXJlc05vdEFsbG93ZWQgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0
LCBrQ0ZOdW1iZXJJbnRUeXBlLCAmbGlnYXR1cmVzTm90QWxsb3dlZFZhbHVlKTsKLQotICAgIHN0
YXRpYyBjb25zdCBpbnQgbGlnYXR1cmVzQWxsb3dlZFZhbHVlID0gMTsKLSAgICBzdGF0aWMgQ0ZO
dW1iZXJSZWYgbGlnYXR1cmVzQWxsb3dlZCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRl
ZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZsaWdhdHVyZXNBbGxvd2VkVmFsdWUpOwotCi0gICAg
aWYgKCEodHlwZXNldHRpbmdGZWF0dXJlcyAmIEtlcm5pbmcpKSB7Ci0gICAgICAgIHN0YXRpYyBj
b25zdCBmbG9hdCBrZXJuaW5nQWRqdXN0bWVudFZhbHVlID0gMDsKLSAgICAgICAgc3RhdGljIENG
TnVtYmVyUmVmIGtlcm5pbmdBZGp1c3RtZW50ID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9y
RGVmYXVsdCwga0NGTnVtYmVyRmxvYXRUeXBlLCAma2VybmluZ0FkanVzdG1lbnRWYWx1ZSk7Ci0g
ICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdEaXNhYmxlZFtdID0geyBr
Q1RGb250QXR0cmlidXRlTmFtZSwga0NUS2VybkF0dHJpYnV0ZU5hbWUsIGtDVExpZ2F0dXJlQXR0
cmlidXRlTmFtZSB9OwotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZXNXaXRoS2VybmluZ0Rpc2Fi
bGVkW10gPSB7IGdldENURm9udCgpLCBrZXJuaW5nQWRqdXN0bWVudCwgYWxsb3dMaWdhdHVyZXMK
LSAgICAgICAgICAgID8gbGlnYXR1cmVzQWxsb3dlZCA6IGxpZ2F0dXJlc05vdEFsbG93ZWQgfTsK
LSAgICAgICAgYXR0cmlidXRlc0RpY3Rpb25hcnkuYWRvcHRDRihDRkRpY3Rpb25hcnlDcmVhdGUo
TlVMTCwga2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQsIHZhbHVlc1dpdGhLZXJuaW5nRGlzYWJsZWQs
Ci0gICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQpIC8gc2l6ZW9mKCpr
ZXlzV2l0aEtlcm5pbmdEaXNhYmxlZCksCi0gICAgICAgICAgICAma0NGQ29weVN0cmluZ0RpY3Rp
b25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKSk7Ci0g
ICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQnkgb21pdHRpbmcgdGhlIGtDVEtlcm5BdHRyaWJ1dGVO
YW1lIGF0dHJpYnV0ZSwgd2UgZ2V0IENvcmUgVGV4dCdzIHN0YW5kYXJkIGtlcm5pbmcuCi0gICAg
ICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGtDVEZv
bnRBdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsKLSAgICAgICAgY29u
c3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGdldENURm9udCgpLCBhbGxv
d0xpZ2F0dXJlcyA/IGxpZ2F0dXJlc0FsbG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07Ci0g
ICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5V
TEwsIGtleXNXaXRoS2VybmluZ0VuYWJsZWQsIHZhbHVlc1dpdGhLZXJuaW5nRW5hYmxlZCwKLSAg
ICAgICAgICAgIHNpemVvZihrZXlzV2l0aEtlcm5pbmdFbmFibGVkKSAvIHNpemVvZigqa2V5c1dp
dGhLZXJuaW5nRW5hYmxlZCksCi0gICAgICAgICAgICAma0NGQ29weVN0cmluZ0RpY3Rpb25hcnlL
ZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKSk7Ci0gICAgfQot
Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmdldCgpOwotfQotCi0jZW5kaWYKLQog
fSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54747</attachid>
            <date>2010-04-29 16:00:54 -0700</date>
            <delta_ts>2010-04-29 16:07:42 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38334-20100429160053.patch</filename>
            <type>text/plain</type>
            <size>90608</size>
            <attacher name="Kevin Ollivier">kevino</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1ODU0NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMTAtMDQtMjkgIEtldmluIE9sbGl2aWVyICA8a2V2aW5vQHRoZW9s
bGl2aWVycy5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQWxsb3cgb3RoZXIgcG9ydHMgdG8gY29tcGlsZSBBVFNVSSBhbmQgQ29yZVRleHQgZnVu
Y3Rpb25zIGluIFNpbXBsZUZvbnREYXRhIGZvciBNYWMuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODMzNAorCisgICAgICAgICogV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9T
aW1wbGVGb250RGF0YUFUU1VJLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvU2ltcGxlRm9udERhdGFNYWMubW0uCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQuY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbS4KKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFNYWMubW06CisKIDIwMTAtMDQtMjkgIERh
biBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTaW1v
biBGcmFzZXIuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
ago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkocmV2aXNpb24gNTg1MjApCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMjgxLDYgKzI4MSw4IEBACiAJCTE1Qzc3MDk0MTAw
RDNDQTgwMDVCQTI2NyAvKiBKU1ZhbGlkaXR5U3RhdGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTVDNzcwOTIxMDBEM0NBODAwNUJBMjY3IC8qIEpT
VmFsaWRpdHlTdGF0ZS5jcHAgKi87IH07CiAJCTE1Qzc3MEE1MTAwRDQxQ0QwMDVCQTI2NyAvKiBE
T01WYWxpZGl0eVN0YXRlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMTVDNzcwQTMxMDBENDFDRDAwNUJBMjY3IC8qIERPTVZhbGlkaXR5U3RhdGUubW0g
Ki87IH07CiAJCTE1Qzc3MEE2MTAwRDQxQ0QwMDVCQTI2NyAvKiBET01WYWxpZGl0eVN0YXRlLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNUM3NzBBNDEw
MEQ0MUNEMDA1QkEyNjcgLyogRE9NVmFsaWRpdHlTdGF0ZS5oICovOyB9OworCQkxNjNFODhGNjEx
OEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERhdGFBVFNVSS5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNjNFODhGNDExOEEzOUQyMDBFRDkyMzEg
LyogU2ltcGxlRm9udERhdGFBVFNVSS5jcHAgKi87IH07CisJCTE2M0U4OEY3MTE4QTM5RDIwMEVE
OTIzMSAvKiBTaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE2M0U4OEY1MTE4QTM5RDIwMEVEOTIzMSAvKiBTaW1w
bGVGb250RGF0YUNvcmVUZXh0LmNwcCAqLzsgfTsKIAkJMTg1QkNGMjgwRjMyNzlDRTAwMEVBMjYy
IC8qIFRocmVhZFRpbWVycy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAxODVCQ0YyNjBGMzI3OUNFMDAwRUEyNjIgLyogVGhyZWFkVGltZXJzLmNwcCAq
LzsgfTsKIAkJMTg1QkNGMjkwRjMyNzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTg1QkNGMjcwRjMyNzlD
RTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5oICovOyB9OwogCQkxODg2MDRCMzBGMkU2NTRBMDAw
QjY0NDMgLyogRE9NVGltZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMTg4NjA0QjEwRjJFNjU0QTAwMEI2NDQzIC8qIERPTVRpbWVyLmNwcCAqLzsg
fTsKQEAgLTU2NzcsNiArNTY3OSw4IEBACiAJCTE1Qzc3MDkyMTAwRDNDQTgwMDVCQTI2NyAvKiBK
U1ZhbGlkaXR5U3RhdGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
SlNWYWxpZGl0eVN0YXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTVDNzcw
QTMxMDBENDFDRDAwNUJBMjY3IC8qIERPTVZhbGlkaXR5U3RhdGUubW0gKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBET01WYWxpZGl0eVN0YXRlLm1tOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkxNUM3NzBBNDEwMEQ0MUNEMDA1QkEyNjcgLyogRE9NVmFsaWRp
dHlTdGF0ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBET01WYWxpZGl0eVN0
YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTE2M0U4OEY0MTE4QTM5RDIwMEVE
OTIzMSAvKiBTaW1wbGVGb250RGF0YUFUU1VJLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IFNpbXBsZUZvbnREYXRhQVRTVUkuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQkxNjNFODhGNTExOEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERhdGFDb3Jl
VGV4dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTaW1wbGVGb250
RGF0YUNvcmVUZXh0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTg1QkNGMjYw
RjMyNzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBUaHJlYWRUaW1lcnMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQkxODVCQ0YyNzBGMzI3OUNFMDAwRUEyNjIgLyogVGhyZWFkVGltZXJzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRocmVhZFRpbWVycy5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQkxODg2MDRCMTBGMkU2NTRBMDAwQjY0NDMgLyogRE9NVGltZXIuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRE9NVGltZXIuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTQ2MTYsNiArMTQ2MjAsOCBAQAogCQlCMjc1MzU0
OTBCMDUzODE0MDAyQ0U2NEYgLyogbWFjICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQlj
aGlsZHJlbiA9ICgKKwkJCQkxNjNFODhGNDExOEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERh
dGFBVFNVSS5jcHAgKi8sCisJCQkJMTYzRTg4RjUxMThBMzlEMjAwRUQ5MjMxIC8qIFNpbXBsZUZv
bnREYXRhQ29yZVRleHQuY3BwICovLAogCQkJCTQ5QzdCOUZEMTA0MkQzOEMwMDA5RDQ0NyAvKiBD
YW52YXMzRExheWVyLmggKi8sCiAJCQkJNDlDN0I5RkUxMDQyRDM4QzAwMDlENDQ3IC8qIENhbnZh
czNETGF5ZXIubW0gKi8sCiAJCQkJRURFM0E0RkYwQzdBNDMwNjAwOTU2QTM3IC8qIENvbG9yTWFj
LmggKi8sCkBAIC0yMTE0NSw2ICsyMTE1MSw4IEBACiAJCQkJMEZGMjg1OTIxMTg2NDA1NDAwN0I3
Q0Q2IC8qIFJlbmRlck1hdGhNTFNxdWFyZVJvb3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQjUy
M0NGMDkxMTgyNjc1NDAwRUJCMjlDIC8qIFNRTFRyYW5zYWN0aW9uU3luYy5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlCNTIzQ0YwQTExODI2NzU0MDBFQkIyOUMgLyogRGF0YWJhc2VTeW5jLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCTE2M0U4OEY2MTE4QTM5RDIwMEVEOTIzMSAvKiBTaW1wbGVGb250
RGF0YUFUU1VJLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTE2M0U4OEY3MTE4QTM5RDIwMEVEOTIz
MSAvKiBTaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFBVFNVSS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFBVFNV
SS5jcHAJKHJldmlzaW9uIDU4NTIwKQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21h
Yy9TaW1wbGVGb250RGF0YU1hYy5tbTo1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQ
cm9za3VyeWFrb3YKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlNpbXBsZUZvbnREYXRh
LmgiCisKKyNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgorI2ltcG9ydCAiQ29sb3IuaCIKKyNp
bXBvcnQgIkZsb2F0UmVjdC5oIgorI2ltcG9ydCAiRm9udC5oIgorI2ltcG9ydCAiRm9udENhY2hl
LmgiCisjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKKyNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5o
IgorI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgorI2ltcG9ydCA8QXBwS2l0L0Fw
cEtpdC5oPgorI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2Vz
Lmg+CisjaW1wb3J0IDxmbG9hdC5oPgorI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgorI2ltcG9y
dCA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbXBv
cnQgPHd0Zi9SZXRhaW5QdHIuaD4KKyNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgorCitAaW50
ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQorLSAoQk9PTClfaXNGYWtlRml4ZWRQ
aXRjaDsKK0BlbmQKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworICAKK2NvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Citz
dGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRz
UGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9CisKK3N0YXRpYyBib29sIGluaXRGb250
RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCit7CisgICAgaWYgKCFmb250RGF0YS0+cGxh
dGZvcm1EYXRhKCkuY2dGb250KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKKyAgICBpZiAoQVRTVUNy
ZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SWQpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250
U3R5bGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVRTVUF0dHJpYnV0
ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7CisgICAgQnl0ZUNvdW50IHNpemUgPSBzaXplb2YoQVRT
VUZvbnRJRCk7CisgICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElkfTsKKyAg
ICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEsICZ0YWcs
ICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOworICAgIGlmIChzdGF0dXMgIT0gbm9F
cnIpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250U3R5bGUs
ICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgeworICAgICAgICBBVFNVRGlzcG9z
ZVN0eWxlKGZvbnRTdHlsZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBB
VFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7CisjZW5kaWYKKworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQoreworICAg
IERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJhY2tGb250
RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFtZV0pKTsK
KyAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOworfQorCisjaWYgIUVSUk9S
X0RJU0FCTEVECisjaWZkZWYgX19MUDY0X18KK3N0YXRpYyBOU1N0cmluZyogcGF0aEZyb21Gb250
KE5TRm9udCopCit7CisgICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90IGF2YWls
YWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2lu
ZworICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCisgICAgcmV0
dXJuIG5pbDsKK30KKyNlbHNlCitzdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChOU0ZvbnQg
KmZvbnQpCit7CisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgQVRTRm9udFJlZiBhdHNG
b250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250KHRvQ1RG
b250UmVmKGZvbnQpLCAwKSk7CisjZWxzZQorICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0
QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7CisjZW5kaWYK
KyAgICBGU1JlZiBmaWxlUmVmOworCisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgT1NT
dGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZpbGVSZWYp
OworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7CisjZWxzZQor
ICAgIEZTU3BlYyBvRmlsZTsKKyAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0RmlsZVNw
ZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQor
ICAgICAgICByZXR1cm4gbmlsOworCisgICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZvRmlsZSwg
JmZpbGVSZWYpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7
CisjZW5kaWYKKworICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKKyAgICBzdGF0
dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9NQVgpOwor
ICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCisgICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5n
V2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKKworICAgIHJldHVy
biBuaWw7Cit9CisjZW5kaWYgLy8gX19MUDY0X18KKyNlbmRpZiAvLyAhRVJST1JfRElTQUJMRUQK
Kwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyNpZmRlZiBCVUlMRElO
R19PTl9USUdFUgorICAgIG1fc3R5bGVHcm91cCA9IDA7CisjZW5kaWYKKyNpZiBVU0UoQVRTVUkp
CisgICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9
IGZhbHNlOworICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7CisjZW5kaWYKKworICAgIG1fc3lu
dGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/IDEuMGYg
OiAwLmY7CisKKyAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7CisgICAgaWYgKCFpbml0Rm9u
dERhdGEodGhpcykpIHsKKyAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQgaGFwcGVu
ZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCisgICAgICAgIC8vIFRyeSBsb29raW5nIGZvciBhbiBh
bHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCisKKyAgICAgICAgLy8gU3Bl
Y2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9mICJUaW1l
cyIuCisgICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBmYW1pbHkg
bmFtZSBpcyAiVGltZXMiLgorICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1hbCAiVGlt
ZXMiIGZhbWlseSBmb250LgorICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2ZSBhIGNv
cnJ1cHQgcmVndWxhciB2YXJpYW50LgorICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tGb250RmFt
aWx5OworICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0gaXNF
cXVhbDpAIlRpbWVzIl0pCisgICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBAIlRpbWVz
IE5ldyBSb21hbiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhbGxiYWNrRm9udEZhbWls
eSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOworICAgICAgICAKKyAgICAgICAgLy8gVHJ5IHNl
dHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgorICAgICAgICAvLyBUaGlzIGlzIGEgbGFzdCBk
aXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5nIGhhcyBn
b25lIHdyb25nLgorI2lmICFFUlJPUl9ESVNBQkxFRAorICAgICAgICBSZXRhaW5QdHI8TlNGb250
PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKKyNlbmRpZgorICAgICAgICBp
ZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0
Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250Om1fcGxh
dGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZvbnRXaXRo
TmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCldKTsKKyNp
ZiAhRVJST1JfRElTQUJMRUQKKyAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0aEZyb21G
b250KGluaXRpYWxGb250LmdldCgpKTsKKyAgICAgICAgaWYgKCFmaWxlUGF0aCkKKyAgICAgICAg
ICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOworI2VuZGlmCisgICAgICAgIGlmICghaW5pdEZv
bnREYXRhKHRoaXMpKSB7CisgICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWlseSBpc0Vx
dWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKKyAgICAgICAgICAgICAgICAvLyBPSywgY291bGRu
J3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywgZmFsbGJh
Y2sKKyAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlzIGZhaWxz
IHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KKyAgICAgICAgICAgICAgICBtX3BsYXRmb3Jt
RGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29udmVydEZv
bnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZhbWlseSgp
XSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFuZCB0aGUg
c3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgorICAgICAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIs
IGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWxl
ZFNldHVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQgdGhlIHN5
c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGluaXRp
YWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgZmFpbGVkU2V0dXAgPSB0
cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoZSBw
cm9ibGVtLgorICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwgdXNpbmcg
JUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKKyAgICAgICAgICAgIFttX3Bs
YXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBmYW1pbHlO
YW1lXSwgZmlsZVBhdGgpOworICAgIH0KKworICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB0cnkg
dG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KKyAgICAvLyBUaGlzIGlzIHByb2JhYmx5
IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWlsYWJsZS4K
KyAgICBpZiAoZmFpbGVkU2V0dXApIHsKKyAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChb
TlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2ludFNpemVd
XSk7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2luZyBzeXN0
ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7CisgICAgICAgIGluaXRGb250RGF0
YSh0aGlzKTsKKyAgICB9CisgICAgCisgICAgaW50IGlBc2NlbnQ7CisgICAgaW50IGlEZXNjZW50
OworICAgIGludCBpTGluZUdhcDsKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIHdrR2V0
Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURlc2NlbnQs
ICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7CisjZWxzZQorICAgIGlBc2NlbnQgPSBDR0ZvbnRH
ZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOworICAgIGlEZXNjZW50ID0gQ0dGb250
R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7CisgICAgaUxpbmVHYXAgPSBDR0Zv
bnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyAgICBtX3VuaXRzUGVyRW0g
PSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyNlbmRpZgor
CisgICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIGZsb2F0
IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRT
aXplOworICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3Vu
aXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5p
dHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICAvLyBXZSBuZWVk
IHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNo
IHRoZQorICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJw
YXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KKyAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBL
aXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKKyAgICAvLyBpbmNvcnJlY3Rs
eSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3Rl
YWQKKyAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCisgICAgTlNTdHJpbmcgKmZhbWls
eU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOworICAgIGlmIChbZmFt
aWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxU
b1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmluZzpAIkNv
dXJpZXIiXSkKKyAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQp
ICogMC4xNWYpICsgMC41Zik7CisgICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3Ry
aW5nOkAiR2VlemEgUHJvIl0pIHsKKyAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlwaHMgdGhh
dCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBkZXNjZW50
LiBBZGp1c3QKKyAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0ZXIgbWF0
Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25lIGxpbmUK
KyAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9mIHRoZSBu
ZXh0IGxpbmUuCisgICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7CisgICAgICAgIGZEZXNjZW50ICo9
IDIuZjsKKyAgICB9CisKKyAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7CisgICAgbV9k
ZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7CisgICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGlu
ZUdhcCk7CisgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5l
R2FwOworICAgIAorICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFsbG93IHJv
b20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCisgICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzUz
ODYxODM+CisgICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYgW2ZhbWls
eU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgeworICAgICAgICBtX2xpbmVHYXAgLT0gMyAt
IG1fZGVzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gMzsKKyAgICB9CisgICAgCisgICAgLy8g
TWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNp
emVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KKyAgICAv
LyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24n
dCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgorICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVy
byA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKKyAg
ICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7CisgICAgaWYgKHhHbHlwaCkgeworICAgICAg
ICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0Rm9yR2x5
cGg6eEdseXBoXTsKKyAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBv
ciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQorICAgICAgICAvLyBhbmQgd2Vi
IHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBs
YWlkIG91dAorICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdo
dC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAorICAgICAgICAvLyB3aGljaCBoYXMg
YW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KKyAgICAgICAgbV94SGVpZ2h0ID0gbWF4KE5TTWF4
WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV94SGVpZ2h0ID0g
W21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKK30KKyAgICAKK3N0YXRpYyBDRkRhdGFS
ZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0YSwgRm91
ckNoYXJDb2RlIHRhYmxlTmFtZSkKK3sKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIEFU
U0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3JtRGF0YS5t
X2F0c3VGb250SUQpOworCisgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICBpZiAoQVRTRm9u
dEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6ZSkgIT0g
bm9FcnIpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGTXV0YWJsZURhdGFSZWYgZGF0
YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVTaXplKTsK
KyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGRGF0YUluY3Jl
YXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7CisgICAgaWYgKEFUU0ZvbnRHZXRUYWJsZShhdHNG
b250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIoZGF0
YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7CisgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBkYXRhOworI2Vsc2UKKyAg
ICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgdGFi
bGVOYW1lKTsKKyNlbmRpZgorfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUNoYXJX
aWR0aEluaXQoKQoreworICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKKyAgICBtX21heENoYXJXaWR0
aCA9IDA7CisgICAgCisgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRvcHRDRiwg
Y29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7CisgICAgaWYgKG9z
MlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgeworICAgICAg
ICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQoKSk7Cisg
ICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJbM107Cisg
ICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldpZHRoLCBt
X3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIFJldGFp
blB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9yVGFnKG1f
cGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKKyAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0YUdldExl
bmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7CisgICAgICAgIGNvbnN0IFVJbnQ4KiBoZWFk
ID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOworICAgICAgICB1c2hvcnQgdXhN
aW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOworICAgICAgICB1c2hvcnQgdXhNYXggPSBo
ZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOworICAgICAgICBTSW50MTYgeE1pbiA9IHN0YXRpY19j
YXN0PFNJbnQxNj4odXhNaW4pOworICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19jYXN0PFNJ
bnQxNj4odXhNYXgpOworICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHhN
YXggLSB4TWluKTsKKyAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0cyhkaWZm
LCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIC8v
IEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwgcG9wdWxh
dGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KKyAgICBpbml0Q2hhcldp
ZHRocygpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQorewor
I2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgaWYgKG1fc3R5bGVHcm91cCkKKyAgICAgICAg
d2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOworI2VuZGlmCisjaWYgVVNFKEFUU1VJ
KQorICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9IG1fQVRT
VVN0eWxlTWFwLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0eWxlPjo6
aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisg
ICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7CisjZW5kaWYKK30KKworU2ltcGxl
Rm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVz
Y3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBz
Rm9udERhdGEpIHsKKyAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsKKyAgICAg
ICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6
ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKKyAgICAgICAgICAgIG1fc21hbGxDYXBz
Rm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZh
bHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhD
RVBUSU9OUzsKKyAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgp
IHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRN
YW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNpemVdKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlwZSBpbmZv
cm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRvIGEgZGlm
ZmVyZW50IHNpemUuCisgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZm9udCB0
aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgorICAgICAgICAgICAgc21hbGxDYXBzRm9udC5zZXRGb250
KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQuZm9udCgp
IHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7CisKKyAg
ICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgeworICAgICAgICAgICAgICAgIE5T
Rm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFn
ZXJdOworICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0gW2ZvbnRN
YW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOworCisgICAgICAgICAg
ICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKKyAgICAgICAgICAgICAg
ICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKKyAgICAgICAgICAgICAgICBpZiAo
bV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQorICAgICAgICAgICAgICAgICAgICBm
b250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7CisKKyAgICAgICAgICAgICAgICBOU0ZvbnRU
cmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6
c21hbGxDYXBzRm9udC5mb250KCldOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnQubV9z
eW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShzbWFsbENh
cHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fw
c0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNr
KSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKKworICAgICAg
ICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9u
dERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRU5EX0JM
T0NLX09CSkNfRVhDRVBUSU9OUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFs
bENhcHNGb250RGF0YTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0
ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIE5T
U3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcnNOb0Nv
cHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBmcmVlV2hl
bkRvbmU6Tk9dOworICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1EYXRhLmZv
bnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07CisgICAgYm9vbCByZXN1bHQg
PSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0aW9uID09
IE5TTm90Rm91bmQ7CisgICAgW3N0cmluZyByZWxlYXNlXTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgTlNGb250
KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOworICAgIC8vIFNwZWNpYWwgY2FzZSBPc2FrYS1N
b25vLgorICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIHNo
b3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCB0
aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorCisg
ICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCisgICAgLy8gQWNjb3JkaW5nIHRvIDxyZGFy
Oi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGljIGFzIGZp
eGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMtUEdvdGhp
YyBhcyBmaXhlZCBwaXRjaC4KKworICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNvcnNpdmEK
KyAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBzaG91bGQg
bm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKyAgICAvLyBOb3RlIHRo
YXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKwor
ICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOworICAgIG1fdHJlYXRBc0ZpeGVkUGl0
Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwKKyAgICAg
ICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9PSBOU09y
ZGVyZWRTYW1lKSAmJgorICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOkAi
TVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKKyAgICAgICAgICAgW25hbWUgY2FzZUlu
c2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNhbWU7Cit9
CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlw
aCBnbHlwaCkgY29uc3QKK3sKKyAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7CisjaWZuZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQ0dSZWN0IGJveDsKKyAgICBDR0ZvbnRHZXRHbHlwaEJCb3hl
cyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKKyAgICBmbG9hdCBw
b2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7CisgICAgQ0dGbG9hdCBzY2FsZSA9IHBv
aW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKKyAgICBib3VuZGluZ0JveCA9IENHUmVjdEFwcGx5QWZm
aW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUsIC1zY2Fs
ZSkpOworICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCisgICAgICAgIGJvdW5kaW5nQm94
LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQpOwor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOworI2VuZGlmCisgICAgcmV0dXJuIGJvdW5k
aW5nQm94OworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBo
KEdseXBoIGdseXBoKSBjb25zdAoreworICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3JtRGF0YSgp
LmZvbnQoKTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Cisg
ICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50
U2l6ZSwgcG9pbnRTaXplKTsKKyAgICBDR1NpemUgYWR2YW5jZTsKKyAgICBpZiAoIXdrR2V0R2x5
cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250LCAmbSwg
JmdseXBoLCAmYWR2YW5jZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY2FjaGUg
Z2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRTaXplKTsK
KyAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7CisgICAgfQorICAgIHJldHVybiBhZHZhbmNlLndp
ZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCisjaWYgVVNFKEFUU1VJKQordm9pZCBT
aW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAoreworICAgIEFTU0VSVCgh
bV9jaGVja2VkU2hhcGVzQXJhYmljKTsKKworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9IHRy
dWU7CisgICAgCisgICAgQVRTVUZvbnRJRCBmb250SUQgPSBtX3BsYXRmb3JtRGF0YS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SUQpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8g
Z2V0IEFUU1VGb250SUQgZm9yICVAIiwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb24g
Zm9udHMgdGhhdCBjb250YWluIEFyYWJpYyBnbHlwaHMuIE91cgorICAgIC8vIGhldXJpc3RpYyBp
cyB0aGF0IGlmIHN1Y2ggYSBmb250IGhhcyBhIGdseXBoIG1ldGFtb3JwaG9zaXMgdGFibGUsIHRo
ZW4KKyAgICAvLyBpdCBpbmNsdWRlcyBzaGFwaW5nIGluZm9ybWF0aW9uIGZvciBBcmFiaWMuCisg
ICAgRm91ckNoYXJDb2RlIHRhYmxlc1tdID0geyAnbW9yeCcsICdtb3J0JyB9OworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGVzKSAvIHNpemVvZih0YWJsZXNbMF0pOyAr
K2kpIHsKKyAgICAgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICAgICAgT1NTdGF0dXMgc3Rh
dHVzID0gQVRTRm9udEdldFRhYmxlKGZvbnRJRCwgdGFibGVzW2ldLCAwLCAwLCAwLCAmdGFibGVT
aXplKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgeworICAgICAgICAgICAgbV9zaGFw
ZXNBcmFiaWMgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKHN0YXR1cyAhPSBrQVRTSW52YWxpZEZvbnRUYWJsZUFjY2VzcykKKyAgICAgICAgICAg
IExPR19FUlJPUigiQVRTRm9udEdldFRhYmxlIGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICB9
Cit9CisjZW5kaWYKKworI2lmIFVTRShDT1JFX1RFWFQpCitDVEZvbnRSZWYgU2ltcGxlRm9udERh
dGE6OmdldENURm9udCgpIGNvbnN0Cit7CisgICAgaWYgKGdldE5TRm9udCgpKQorICAgICAgICBy
ZXR1cm4gdG9DVEZvbnRSZWYoZ2V0TlNGb250KCkpOworICAgIGlmICghbV9DVEZvbnQpCisgICAg
ICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNzRm9udChtX3BsYXRm
b3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cisg
ICAgcmV0dXJuIG1fQ1RGb250LmdldCgpOworfQorCitDRkRpY3Rpb25hcnlSZWYgU2ltcGxlRm9u
dERhdGE6OmdldENGU3RyaW5nQXR0cmlidXRlcyhUeXBlc2V0dGluZ0ZlYXR1cmVzIHR5cGVzZXR0
aW5nRmVhdHVyZXMpIGNvbnN0Cit7CisgICAgdW5zaWduZWQga2V5ID0gdHlwZXNldHRpbmdGZWF0
dXJlcyArIDE7CisgICAgcGFpcjxIYXNoTWFwPHVuc2lnbmVkLCBSZXRhaW5QdHI8Q0ZEaWN0aW9u
YXJ5UmVmPiA+OjppdGVyYXRvciwgYm9vbD4gYWRkUmVzdWx0ID0gbV9DRlN0cmluZ0F0dHJpYnV0
ZXMuYWRkKGtleSwgUmV0YWluUHRyPENGRGljdGlvbmFyeVJlZj4oKSk7CisgICAgUmV0YWluUHRy
PENGRGljdGlvbmFyeVJlZj4mIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5ID0gYWRkUmVzdWx0LmZpcnN0
LT5zZWNvbmQ7CisgICAgaWYgKCFhZGRSZXN1bHQuc2Vjb25kKQorICAgICAgICByZXR1cm4gYXR0
cmlidXRlc0RpY3Rpb25hcnkuZ2V0KCk7CisKKyAgICBib29sIGFsbG93TGlnYXR1cmVzID0gcGxh
dGZvcm1EYXRhKCkuYWxsb3dzTGlnYXR1cmVzKCkgfHwgKHR5cGVzZXR0aW5nRmVhdHVyZXMgJiBM
aWdhdHVyZXMpOworCisgICAgc3RhdGljIGNvbnN0IGludCBsaWdhdHVyZXNOb3RBbGxvd2VkVmFs
dWUgPSAwOworICAgIHN0YXRpYyBDRk51bWJlclJlZiBsaWdhdHVyZXNOb3RBbGxvd2VkID0gQ0ZO
dW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVySW50VHlwZSwgJmxpZ2F0
dXJlc05vdEFsbG93ZWRWYWx1ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc0Fs
bG93ZWRWYWx1ZSA9IDE7CisgICAgc3RhdGljIENGTnVtYmVyUmVmIGxpZ2F0dXJlc0FsbG93ZWQg
PSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAm
bGlnYXR1cmVzQWxsb3dlZFZhbHVlKTsKKworICAgIGlmICghKHR5cGVzZXR0aW5nRmVhdHVyZXMg
JiBLZXJuaW5nKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga2VybmluZ0FkanVzdG1l
bnRWYWx1ZSA9IDA7CisgICAgICAgIHN0YXRpYyBDRk51bWJlclJlZiBrZXJuaW5nQWRqdXN0bWVu
dCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckZsb2F0VHlw
ZSwgJmtlcm5pbmdBZGp1c3RtZW50VmFsdWUpOworICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCog
a2V5c1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsga0NURm9udEF0dHJpYnV0ZU5hbWUsIGtDVEtl
cm5BdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsKKyAgICAgICAgY29u
c3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZFtdID0geyBnZXRDVEZvbnQoKSwga2Vy
bmluZ0FkanVzdG1lbnQsIGFsbG93TGlnYXR1cmVzCisgICAgICAgICAgICA/IGxpZ2F0dXJlc0Fs
bG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07CisgICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9u
YXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0Rpc2Fi
bGVkLCB2YWx1ZXNXaXRoS2VybmluZ0Rpc2FibGVkLAorICAgICAgICAgICAgc2l6ZW9mKGtleXNX
aXRoS2VybmluZ0Rpc2FibGVkKSAvIHNpemVvZigqa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQpLAor
ICAgICAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlw
ZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEJ5
IG9taXR0aW5nIHRoZSBrQ1RLZXJuQXR0cmlidXRlTmFtZSBhdHRyaWJ1dGUsIHdlIGdldCBDb3Jl
IFRleHQncyBzdGFuZGFyZCBrZXJuaW5nLgorICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCoga2V5
c1dpdGhLZXJuaW5nRW5hYmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUTGlnYXR1
cmVBdHRyaWJ1dGVOYW1lIH07CisgICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5n
RW5hYmxlZFtdID0geyBnZXRDVEZvbnQoKSwgYWxsb3dMaWdhdHVyZXMgPyBsaWdhdHVyZXNBbGxv
d2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OworICAgICAgICBhdHRyaWJ1dGVzRGljdGlvbmFy
eS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShOVUxMLCBrZXlzV2l0aEtlcm5pbmdFbmFibGVk
LCB2YWx1ZXNXaXRoS2VybmluZ0VuYWJsZWQsCisgICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhL
ZXJuaW5nRW5hYmxlZCkgLyBzaXplb2YoKmtleXNXaXRoS2VybmluZ0VuYWJsZWQpLAorICAgICAg
ICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlwZURpY3Rp
b25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0KKworICAgIHJldHVybiBhdHRyaWJ1dGVzRGlj
dGlvbmFyeS5nZXQoKTsKK30KKworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnRE
YXRhQVRTVUkuY3BwCShyZXZpc2lvbiA1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw0MTMg
KzMwLDE1IEBACiAjaW1wb3J0ICJjb25maWcuaCIKICNpbXBvcnQgIlNpbXBsZUZvbnREYXRhLmgi
CiAKLSNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgotI2ltcG9ydCAiQ29sb3IuaCIKLSNpbXBv
cnQgIkZsb2F0UmVjdC5oIgogI2ltcG9ydCAiRm9udC5oIgogI2ltcG9ydCAiRm9udENhY2hlLmgi
CiAjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKLSNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5oIgot
I2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgotI2ltcG9ydCA8QXBwS2l0L0FwcEtp
dC5oPgogI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+
Ci0jaW1wb3J0IDxmbG9hdC5oPgotI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgogI2ltcG9ydCA8
d3RmL0Fzc2VydGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KLSNpbXBvcnQg
PHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgotCi1AaW50ZXJm
YWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQotLSAoQk9PTClfaXNGYWtlRml4ZWRQaXRj
aDsKLUBlbmQKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewot
ICAKLWNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Ci1zdGF0
aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRzUGVy
RW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9Ci0KLXN0YXRpYyBib29sIGluaXRGb250RGF0
YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCi17Ci0gICAgaWYgKCFmb250RGF0YS0+cGxhdGZv
cm1EYXRhKCkuY2dGb250KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotI2lmZGVmIEJVSUxE
SU5HX09OX1RJR0VSCi0gICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKLSAgICBpZiAoQVRTVUNyZWF0
ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5tX2F0c3VGb250
SUQ7Ci0gICAgaWYgKCFmb250SWQpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5
bGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQVRTVUF0dHJpYnV0ZVRh
ZyB0YWcgPSBrQVRTVUZvbnRUYWc7Ci0gICAgQnl0ZUNvdW50IHNpemUgPSBzaXplb2YoQVRTVUZv
bnRJRCk7Ci0gICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElkfTsKLSAgICBP
U1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEsICZ0YWcsICZz
aXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIp
IHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250U3R5bGUsICZm
b250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgewotICAgICAgICBBVFNVRGlzcG9zZVN0
eWxlKGZvbnRTdHlsZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBBVFNV
RGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiB0cnVlOwotfQot
Ci1zdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQotewotICAgIERF
RklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJhY2tGb250RmFt
aWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFtZV0pKTsKLSAg
ICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOwotfQotCi0jaWYgIUVSUk9SX0RJ
U0FCTEVECi0jaWZkZWYgX19MUDY0X18KLXN0YXRpYyBOU1N0cmluZyogcGF0aEZyb21Gb250KE5T
Rm9udCopCi17Ci0gICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90IGF2YWlsYWJs
ZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZwot
ICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCi0gICAgcmV0dXJu
IG5pbDsKLX0KLSNlbHNlCi1zdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChOU0ZvbnQgKmZv
bnQpCi17Ci0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTRm9udFJlZiBhdHNGb250
ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250KHRvQ1RGb250
UmVmKGZvbnQpLCAwKSk7Ci0jZWxzZQotICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRT
Rm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7Ci0jZW5kaWYKLSAg
ICBGU1JlZiBmaWxlUmVmOwotCi0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgT1NTdGF0
dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZpbGVSZWYpOwot
ICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBuaWw7Ci0jZWxzZQotICAg
IEZTU3BlYyBvRmlsZTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0RmlsZVNwZWNp
ZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKLSAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQotICAg
ICAgICByZXR1cm4gbmlsOwotCi0gICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZvRmlsZSwgJmZp
bGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBuaWw7Ci0j
ZW5kaWYKLQotICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKLSAgICBzdGF0dXMg
PSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9NQVgpOwotICAg
IGlmIChzdGF0dXMgPT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0
aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKLQotICAgIHJldHVybiBu
aWw7Ci19Ci0jZW5kaWYgLy8gX19MUDY0X18KLSNlbmRpZiAvLyAhRVJST1JfRElTQUJMRUQKLQot
dm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsKLSNpZmRlZiBCVUlMRElOR19P
Tl9USUdFUgotICAgIG1fc3R5bGVHcm91cCA9IDA7Ci0jZW5kaWYKLSNpZiBVU0UoQVRTVUkpCi0g
ICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOwotICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9IGZh
bHNlOwotICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7Ci0jZW5kaWYKLQotICAgIG1fc3ludGhl
dGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/IDEuMGYgOiAw
LmY7Ci0KLSAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7Ci0gICAgaWYgKCFpbml0Rm9udERh
dGEodGhpcykpIHsKLSAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQgaGFwcGVuZWQs
IGxpa2UgYSBjb3JydXB0IGZvbnQuCi0gICAgICAgIC8vIFRyeSBsb29raW5nIGZvciBhbiBhbHRl
cm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCi0KLSAgICAgICAgLy8gU3BlY2lh
bCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9mICJUaW1lcyIu
Ci0gICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBmYW1pbHkgbmFt
ZSBpcyAiVGltZXMiLgotICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1hbCAiVGltZXMi
IGZhbWlseSBmb250LgotICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2ZSBhIGNvcnJ1
cHQgcmVndWxhciB2YXJpYW50LgotICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tGb250RmFtaWx5
OwotICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0gaXNFcXVh
bDpAIlRpbWVzIl0pCi0gICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBAIlRpbWVzIE5l
dyBSb21hbiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZhbGxiYWNrRm9udEZhbWlseSA9
IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOwotICAgICAgICAKLSAgICAgICAgLy8gVHJ5IHNldHRp
bmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgotICAgICAgICAvLyBUaGlzIGlzIGEgbGFzdCBkaXRj
aCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5nIGhhcyBnb25l
IHdyb25nLgotI2lmICFFUlJPUl9ESVNBQkxFRAotICAgICAgICBSZXRhaW5QdHI8TlNGb250PiBp
bml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKLSNlbmRpZgotICAgICAgICBpZiAo
bV9wbGF0Zm9ybURhdGEuZm9udCgpKQotICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9u
dChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250Om1fcGxhdGZv
cm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZvbnRXaXRoTmFt
ZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCldKTsKLSNpZiAh
RVJST1JfRElTQUJMRUQKLSAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0aEZyb21Gb250
KGluaXRpYWxGb250LmdldCgpKTsKLSAgICAgICAgaWYgKCFmaWxlUGF0aCkKLSAgICAgICAgICAg
IGZpbGVQYXRoID0gQCJub3Qga25vd24iOwotI2VuZGlmCi0gICAgICAgIGlmICghaW5pdEZvbnRE
YXRhKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWlseSBpc0VxdWFs
OkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKLSAgICAgICAgICAgICAgICAvLyBPSywgY291bGRuJ3Qg
c2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywgZmFsbGJhY2sK
LSAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlzIGZhaWxzIHdl
IGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KLSAgICAgICAgICAgICAgICBtX3BsYXRmb3JtRGF0
YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29udmVydEZvbnQ6
bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZhbWlseSgpXSk7
Ci0gICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKLSAgICAgICAgICAg
ICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFuZCB0aGUgc3lz
dGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgotICAgICAgICAgICAgICAgICAg
ICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGlu
aXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWxlZFNl
dHVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQgdGhlIHN5c3Rl
bSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KLSAgICAgICAgICAgICAgICBMT0df
RVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGluaXRpYWxG
b250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgZmFpbGVkU2V0dXAgPSB0cnVl
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVwb3J0IHRoZSBwcm9i
bGVtLgotICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwgdXNpbmcgJUAg
aW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKLSAgICAgICAgICAgIFttX3BsYXRm
b3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBmYW1pbHlOYW1l
XSwgZmlsZVBhdGgpOwotICAgIH0KLQotICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB0cnkgdG8g
c2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KLSAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJl
Y2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWlsYWJsZS4KLSAg
ICBpZiAoZmFpbGVkU2V0dXApIHsKLSAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNG
b250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2ludFNpemVdXSk7
Ci0gICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2luZyBzeXN0ZW0g
Zm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7Ci0gICAgICAgIGluaXRGb250RGF0YSh0
aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IGlBc2NlbnQ7Ci0gICAgaW50IGlEZXNjZW50Owot
ICAgIGludCBpTGluZUdhcDsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgotICAgIHdrR2V0Rm9u
dE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURlc2NlbnQsICZp
TGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7Ci0jZWxzZQotICAgIGlBc2NlbnQgPSBDR0ZvbnRHZXRB
c2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOwotICAgIGlEZXNjZW50ID0gQ0dGb250R2V0
RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7Ci0gICAgaUxpbmVHYXAgPSBDR0ZvbnRH
ZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSAgICBtX3VuaXRzUGVyRW0gPSBD
R0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSNlbmRpZgotCi0g
ICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIGZsb2F0IGZB
c2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXpl
OwotICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3VuaXRz
UGVyRW0pICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5pdHMo
aUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0KLSAgICAvLyBXZSBuZWVkIHRv
IGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRo
ZQotICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJwYXJ0
cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KLSAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBLaXQg
YWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKLSAgICAvLyBpbmNvcnJlY3RseSBh
ZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3RlYWQK
LSAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAgTlNTdHJpbmcgKmZhbWlseU5h
bWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOwotICAgIGlmIChbZmFtaWx5
TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0
cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmluZzpAIkNvdXJp
ZXIiXSkKLSAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQpICog
MC4xNWYpICsgMC41Zik7Ci0gICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3RyaW5n
OkAiR2VlemEgUHJvIl0pIHsKLSAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlwaHMgdGhhdCBk
cmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBkZXNjZW50LiBB
ZGp1c3QKLSAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0ZXIgbWF0Y2gg
cmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25lIGxpbmUKLSAg
ICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9mIHRoZSBuZXh0
IGxpbmUuCi0gICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7Ci0gICAgICAgIGZEZXNjZW50ICo9IDIu
ZjsKLSAgICB9Ci0KLSAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7Ci0gICAgbV9kZXNj
ZW50ID0gbHJvdW5kZihmRGVzY2VudCk7Ci0gICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGluZUdh
cCk7Ci0gICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2Fw
OwotICAgIAotICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFsbG93IHJvb20g
Zm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCi0gICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzUzODYx
ODM+Ci0gICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYgW2ZhbWlseU5h
bWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgewotICAgICAgICBtX2xpbmVHYXAgLT0gMyAtIG1f
ZGVzY2VudDsKLSAgICAgICAgbV9kZXNjZW50ID0gMzsKLSAgICB9Ci0gICAgCi0gICAgLy8gTWVh
c3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNpemVz
IFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KLSAgICAvLyBV
bmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24ndCBx
dWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgotICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVybyA9
IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKLSAgICBO
U0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERhdGFG
b3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAgaWYgKHhHbHlwaCkgewotICAgICAgICBO
U1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0Rm9yR2x5cGg6
eEdseXBoXTsKLSAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBvciBo
ZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQotICAgICAgICAvLyBhbmQgd2ViIHBh
Z2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBsYWlk
IG91dAotICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdodC4g
Q2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAotICAgICAgICAvLyB3aGljaCBoYXMgYW4g
IngiIHRoYXQgaXMgN3g2IHBpeGVscy4KLSAgICAgICAgbV94SGVpZ2h0ID0gbWF4KE5TTWF4WCh4
Qm94KSwgTlNNYXhZKHhCb3gpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV94SGVpZ2h0ID0gW21f
cGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKLX0KLSAgICAKLXN0YXRpYyBDRkRhdGFSZWYg
Y29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0YSwgRm91ckNo
YXJDb2RlIHRhYmxlTmFtZSkKLXsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgotICAgIEFUU0Zv
bnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3JtRGF0YS5tX2F0
c3VGb250SUQpOwotCi0gICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKLSAgICBpZiAoQVRTRm9udEdl
dFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6ZSkgIT0gbm9F
cnIpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGTXV0YWJsZURhdGFSZWYgZGF0YSA9
IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVTaXplKTsKLSAg
ICBpZiAoIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGRGF0YUluY3JlYXNl
TGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7Ci0gICAgaWYgKEFUU0ZvbnRHZXRUYWJsZShhdHNGb250
LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIoZGF0YSks
ICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7Ci0gICAgICAgIENGUmVsZWFzZShkYXRhKTsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBkYXRhOwotI2Vsc2UKLSAgICBy
ZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgdGFibGVO
YW1lKTsKLSNlbmRpZgotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUNoYXJXaWR0
aEluaXQoKQotewotICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKLSAgICBtX21heENoYXJXaWR0aCA9
IDA7Ci0gICAgCi0gICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRvcHRDRiwgY29w
eUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7Ci0gICAgaWYgKG9zMlRh
YmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgewotICAgICAgICBj
b25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQoKSk7Ci0gICAg
ICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJbM107Ci0gICAg
ICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldpZHRoLCBtX3Vu
aXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQotICAgIFJldGFpblB0
cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9yVGFnKG1fcGxh
dGZvcm1EYXRhLCAnaGVhZCcpKTsKLSAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0YUdldExlbmd0
aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7Ci0gICAgICAgIGNvbnN0IFVJbnQ4KiBoZWFkID0g
Q0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOwotICAgICAgICB1c2hvcnQgdXhNaW4g
PSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOwotICAgICAgICB1c2hvcnQgdXhNYXggPSBoZWFk
WzQwXSAqIDI1NiArIGhlYWRbNDFdOwotICAgICAgICBTSW50MTYgeE1pbiA9IHN0YXRpY19jYXN0
PFNJbnQxNj4odXhNaW4pOwotICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19jYXN0PFNJbnQx
Nj4odXhNYXgpOwotICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHhNYXgg
LSB4TWluKTsKLSAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0cyhkaWZmLCBt
X3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQotICAgIC8vIEZh
bGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwgcG9wdWxhdGUg
dGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KLSAgICBpbml0Q2hhcldpZHRo
cygpOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQotewotI2lm
ZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgaWYgKG1fc3R5bGVHcm91cCkKLSAgICAgICAgd2tS
ZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOwotI2VuZGlmCi0jaWYgVVNFKEFUU1VJKQot
ICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9IG1fQVRTVVN0
eWxlTWFwLmVuZCgpOwotICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0eWxlPjo6aXRl
cmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAg
ICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7Ci0jZW5kaWYKLX0KLQotU2ltcGxlRm9u
dERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3Jp
cHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBpZiAoIW1fc21hbGxDYXBzRm9u
dERhdGEpIHsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7Ci0gICAgICAgICAgICBGb250
UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsKLSAgICAgICAg
ICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSAq
IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9u
dERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZhbHNl
KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBU
SU9OUzsKLSAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIHBv
aW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7Ci0gICAgICAgICAgICBGb250
UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5h
Z2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNpemVdKTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlwZSBpbmZvcm1h
dGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRvIGEgZGlmZmVy
ZW50IHNpemUuCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZm9udCB0aGF0
IHdlJ3JlIGhhbmRlZCBiYWNrLgotICAgICAgICAgICAgc21hbGxDYXBzRm9udC5zZXRGb250KGZv
bnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQuZm9udCgpIHBy
aW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7Ci0KLSAgICAg
ICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgewotICAgICAgICAgICAgICAgIE5TRm9u
dE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJd
OwotICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0gW2ZvbnRNYW5h
Z2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOwotCi0gICAgICAgICAgICAg
ICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKLSAgICAgICAgICAgICAgICAg
ICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKLSAgICAgICAgICAgICAgICBpZiAobV9w
bGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQotICAgICAgICAgICAgICAgICAgICBmb250
VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7Ci0KLSAgICAgICAgICAgICAgICBOU0ZvbnRUcmFp
dE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6c21h
bGxDYXBzRm9udC5mb250KCldOwotICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnQubV9zeW50
aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShzbWFsbENhcHNG
b250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOwotICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0Zv
bnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKSAm
JiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKLQotICAgICAgICAg
ICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9udERh
dGEoJnNtYWxsQ2Fwc0ZvbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRU5EX0JMT0NL
X09CSkNfRVhDRVBUSU9OUzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9zbWFsbENh
cHNGb250RGF0YTsKLX0KLQotYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJz
KGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAotewotICAgIE5TU3Ry
aW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcnNOb0NvcHk6
Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBmcmVlV2hlbkRv
bmU6Tk9dOwotICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1EYXRhLmZvbnQo
KSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07Ci0gICAgYm9vbCByZXN1bHQgPSBz
ZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0aW9uID09IE5T
Tm90Rm91bmQ7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci12b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCi17Ci0gICAgTlNGb250KiBm
ID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOwotICAgIC8vIFNwZWNpYWwgY2FzZSBPc2FrYS1Nb25v
LgotICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIHNob3Vs
ZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5vdGUgdGhhdCB0aGUg
QXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgotCi0gICAg
Ly8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCi0gICAgLy8gQWNjb3JkaW5nIHRvIDxyZGFyOi8v
cHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGljIGFzIGZpeGVk
IHBpdGNoLgotICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMtUEdvdGhpYyBh
cyBmaXhlZCBwaXRjaC4KLQotICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNvcnNpdmEKLSAg
ICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBzaG91bGQgbm90
IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KLSAgICAvLyBOb3RlIHRoYXQg
QXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KLQotICAg
IE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOwotICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2gg
PSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwKLSAgICAgICAg
ICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9PSBOU09yZGVy
ZWRTYW1lKSAmJgotICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOkAiTVMt
UEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKLSAgICAgICAgICAgW25hbWUgY2FzZUluc2Vu
c2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNhbWU7Ci19Ci0K
LUZsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlwaCBn
bHlwaCkgY29uc3QKLXsKLSAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7Ci0jaWZuZGVmIEJVSUxE
SU5HX09OX1RJR0VSCi0gICAgQ0dSZWN0IGJveDsKLSAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhw
bGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKLSAgICBmbG9hdCBwb2lu
dFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Ci0gICAgQ0dGbG9hdCBzY2FsZSA9IHBvaW50
U2l6ZSAvIHVuaXRzUGVyRW0oKTsKLSAgICBib3VuZGluZ0JveCA9IENHUmVjdEFwcGx5QWZmaW5l
VHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUsIC1zY2FsZSkp
OwotICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCi0gICAgICAgIGJvdW5kaW5nQm94LnNl
dFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQpOwotI2Vs
c2UKLSAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOwotI2VuZGlmCi0gICAgcmV0dXJuIGJvdW5kaW5n
Qm94OwotfQotCi1mbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEds
eXBoIGdseXBoKSBjb25zdAotewotICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3JtRGF0YSgpLmZv
bnQoKTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Ci0gICAg
Q0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50U2l6
ZSwgcG9pbnRTaXplKTsKLSAgICBDR1NpemUgYWR2YW5jZTsKLSAgICBpZiAoIXdrR2V0R2x5cGhU
cmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250LCAmbSwgJmds
eXBoLCAmYWR2YW5jZSkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY2FjaGUgZ2x5
cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRTaXplKTsKLSAg
ICAgICAgYWR2YW5jZS53aWR0aCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBhZHZhbmNlLndpZHRo
ICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQogCiAjaWYgVVNFKEFUU1VJKQogdm9pZCBTaW1w
bGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdApAQCAtNDY5LDUzICs3MSw0IEBA
IHZvaWQgU2ltcGxlRm9udERhdGE6OmNoZWNrU2hhcGVzQXJhYmljKCkKIH0KICNlbmRpZgogCi0j
aWYgVVNFKENPUkVfVEVYVCkKLUNURm9udFJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q1RGb250KCkg
Y29uc3QKLXsKLSAgICBpZiAoZ2V0TlNGb250KCkpCi0gICAgICAgIHJldHVybiB0b0NURm9udFJl
ZihnZXROU0ZvbnQoKSk7Ci0gICAgaWYgKCFtX0NURm9udCkKLSAgICAgICAgbV9DVEZvbnQuYWRv
cHRDRihDVEZvbnRDcmVhdGVXaXRoR3JhcGhpY3NGb250KG1fcGxhdGZvcm1EYXRhLmNnRm9udCgp
LCBtX3BsYXRmb3JtRGF0YS5zaXplKCksIE5VTEwsIE5VTEwpKTsKLSAgICByZXR1cm4gbV9DVEZv
bnQuZ2V0KCk7Ci19Ci0KLUNGRGljdGlvbmFyeVJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q0ZTdHJp
bmdBdHRyaWJ1dGVzKFR5cGVzZXR0aW5nRmVhdHVyZXMgdHlwZXNldHRpbmdGZWF0dXJlcykgY29u
c3QKLXsKLSAgICB1bnNpZ25lZCBrZXkgPSB0eXBlc2V0dGluZ0ZlYXR1cmVzICsgMTsKLSAgICBw
YWlyPEhhc2hNYXA8dW5zaWduZWQsIFJldGFpblB0cjxDRkRpY3Rpb25hcnlSZWY+ID46Oml0ZXJh
dG9yLCBib29sPiBhZGRSZXN1bHQgPSBtX0NGU3RyaW5nQXR0cmlidXRlcy5hZGQoa2V5LCBSZXRh
aW5QdHI8Q0ZEaWN0aW9uYXJ5UmVmPigpKTsKLSAgICBSZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5UmVm
PiYgYXR0cmlidXRlc0RpY3Rpb25hcnkgPSBhZGRSZXN1bHQuZmlyc3QtPnNlY29uZDsKLSAgICBp
ZiAoIWFkZFJlc3VsdC5zZWNvbmQpCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzRGljdGlvbmFy
eS5nZXQoKTsKLQotICAgIGJvb2wgYWxsb3dMaWdhdHVyZXMgPSBwbGF0Zm9ybURhdGEoKS5hbGxv
d3NMaWdhdHVyZXMoKSB8fCAodHlwZXNldHRpbmdGZWF0dXJlcyAmIExpZ2F0dXJlcyk7Ci0KLSAg
ICBzdGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc05vdEFsbG93ZWRWYWx1ZSA9IDA7Ci0gICAgc3Rh
dGljIENGTnVtYmVyUmVmIGxpZ2F0dXJlc05vdEFsbG93ZWQgPSBDRk51bWJlckNyZWF0ZShrQ0ZB
bGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAmbGlnYXR1cmVzTm90QWxsb3dlZFZh
bHVlKTsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQgbGlnYXR1cmVzQWxsb3dlZFZhbHVlID0gMTsK
LSAgICBzdGF0aWMgQ0ZOdW1iZXJSZWYgbGlnYXR1cmVzQWxsb3dlZCA9IENGTnVtYmVyQ3JlYXRl
KGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZsaWdhdHVyZXNBbGxvd2Vk
VmFsdWUpOwotCi0gICAgaWYgKCEodHlwZXNldHRpbmdGZWF0dXJlcyAmIEtlcm5pbmcpKSB7Ci0g
ICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrZXJuaW5nQWRqdXN0bWVudFZhbHVlID0gMDsKLSAg
ICAgICAgc3RhdGljIENGTnVtYmVyUmVmIGtlcm5pbmdBZGp1c3RtZW50ID0gQ0ZOdW1iZXJDcmVh
dGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyRmxvYXRUeXBlLCAma2VybmluZ0FkanVz
dG1lbnRWYWx1ZSk7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdE
aXNhYmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUS2VybkF0dHJpYnV0ZU5hbWUs
IGtDVExpZ2F0dXJlQXR0cmlidXRlTmFtZSB9OwotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZXNX
aXRoS2VybmluZ0Rpc2FibGVkW10gPSB7IGdldENURm9udCgpLCBrZXJuaW5nQWRqdXN0bWVudCwg
YWxsb3dMaWdhdHVyZXMKLSAgICAgICAgICAgID8gbGlnYXR1cmVzQWxsb3dlZCA6IGxpZ2F0dXJl
c05vdEFsbG93ZWQgfTsKLSAgICAgICAgYXR0cmlidXRlc0RpY3Rpb25hcnkuYWRvcHRDRihDRkRp
Y3Rpb25hcnlDcmVhdGUoTlVMTCwga2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQsIHZhbHVlc1dpdGhL
ZXJuaW5nRGlzYWJsZWQsCi0gICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhLZXJuaW5nRGlzYWJs
ZWQpIC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdEaXNhYmxlZCksCi0gICAgICAgICAgICAma0NG
Q29weVN0cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVl
Q2FsbEJhY2tzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQnkgb21pdHRpbmcgdGhlIGtD
VEtlcm5BdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSwgd2UgZ2V0IENvcmUgVGV4dCdzIHN0YW5kYXJk
IGtlcm5pbmcuCi0gICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdFbmFi
bGVkW10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUg
fTsKLSAgICAgICAgY29uc3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGdl
dENURm9udCgpLCBhbGxvd0xpZ2F0dXJlcyA/IGxpZ2F0dXJlc0FsbG93ZWQgOiBsaWdhdHVyZXNO
b3RBbGxvd2VkIH07Ci0gICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZEaWN0
aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0VuYWJsZWQsIHZhbHVlc1dpdGhLZXJu
aW5nRW5hYmxlZCwKLSAgICAgICAgICAgIHNpemVvZihrZXlzV2l0aEtlcm5pbmdFbmFibGVkKSAv
IHNpemVvZigqa2V5c1dpdGhLZXJuaW5nRW5hYmxlZCksCi0gICAgICAgICAgICAma0NGQ29weVN0
cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJh
Y2tzKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmdldCgpOwot
fQotCi0jZW5kaWYKLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFDb3JlVGV4dC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFDb3JlVGV4dC5j
cHAJKHJldmlzaW9uIDU4NTIwKQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9T
aW1wbGVGb250RGF0YU1hYy5tbTo1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQ
cm9za3VyeWFrb3YKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlNpbXBsZUZvbnREYXRh
LmgiCisKKyNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgorI2ltcG9ydCAiQ29sb3IuaCIKKyNp
bXBvcnQgIkZsb2F0UmVjdC5oIgorI2ltcG9ydCAiRm9udC5oIgorI2ltcG9ydCAiRm9udENhY2hl
LmgiCisjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKKyNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5o
IgorI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgorI2ltcG9ydCA8QXBwS2l0L0Fw
cEtpdC5oPgorI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2Vz
Lmg+CisjaW1wb3J0IDxmbG9hdC5oPgorI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgorI2ltcG9y
dCA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbXBv
cnQgPHd0Zi9SZXRhaW5QdHIuaD4KKyNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgorCitAaW50
ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQorLSAoQk9PTClfaXNGYWtlRml4ZWRQ
aXRjaDsKK0BlbmQKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworICAKK2NvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Citz
dGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRz
UGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9CisKK3N0YXRpYyBib29sIGluaXRGb250
RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCit7CisgICAgaWYgKCFmb250RGF0YS0+cGxh
dGZvcm1EYXRhKCkuY2dGb250KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKKyAgICBpZiAoQVRTVUNy
ZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SWQpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250
U3R5bGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVRTVUF0dHJpYnV0
ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7CisgICAgQnl0ZUNvdW50IHNpemUgPSBzaXplb2YoQVRT
VUZvbnRJRCk7CisgICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElkfTsKKyAg
ICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEsICZ0YWcs
ICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOworICAgIGlmIChzdGF0dXMgIT0gbm9F
cnIpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250U3R5bGUs
ICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgeworICAgICAgICBBVFNVRGlzcG9z
ZVN0eWxlKGZvbnRTdHlsZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBB
VFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7CisjZW5kaWYKKworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQoreworICAg
IERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJhY2tGb250
RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFtZV0pKTsK
KyAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOworfQorCisjaWYgIUVSUk9S
X0RJU0FCTEVECisjaWZkZWYgX19MUDY0X18KK3N0YXRpYyBOU1N0cmluZyogcGF0aEZyb21Gb250
KE5TRm9udCopCit7CisgICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90IGF2YWls
YWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2lu
ZworICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCisgICAgcmV0
dXJuIG5pbDsKK30KKyNlbHNlCitzdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChOU0ZvbnQg
KmZvbnQpCit7CisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgQVRTRm9udFJlZiBhdHNG
b250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250KHRvQ1RG
b250UmVmKGZvbnQpLCAwKSk7CisjZWxzZQorICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0
QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7CisjZW5kaWYK
KyAgICBGU1JlZiBmaWxlUmVmOworCisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgT1NT
dGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZpbGVSZWYp
OworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7CisjZWxzZQor
ICAgIEZTU3BlYyBvRmlsZTsKKyAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0RmlsZVNw
ZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQor
ICAgICAgICByZXR1cm4gbmlsOworCisgICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZvRmlsZSwg
JmZpbGVSZWYpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7
CisjZW5kaWYKKworICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKKyAgICBzdGF0
dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9NQVgpOwor
ICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCisgICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5n
V2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKKworICAgIHJldHVy
biBuaWw7Cit9CisjZW5kaWYgLy8gX19MUDY0X18KKyNlbmRpZiAvLyAhRVJST1JfRElTQUJMRUQK
Kwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyNpZmRlZiBCVUlMRElO
R19PTl9USUdFUgorICAgIG1fc3R5bGVHcm91cCA9IDA7CisjZW5kaWYKKyNpZiBVU0UoQVRTVUkp
CisgICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9
IGZhbHNlOworICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7CisjZW5kaWYKKworICAgIG1fc3lu
dGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/IDEuMGYg
OiAwLmY7CisKKyAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7CisgICAgaWYgKCFpbml0Rm9u
dERhdGEodGhpcykpIHsKKyAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQgaGFwcGVu
ZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCisgICAgICAgIC8vIFRyeSBsb29raW5nIGZvciBhbiBh
bHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCisKKyAgICAgICAgLy8gU3Bl
Y2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9mICJUaW1l
cyIuCisgICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBmYW1pbHkg
bmFtZSBpcyAiVGltZXMiLgorICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1hbCAiVGlt
ZXMiIGZhbWlseSBmb250LgorICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2ZSBhIGNv
cnJ1cHQgcmVndWxhciB2YXJpYW50LgorICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tGb250RmFt
aWx5OworICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0gaXNF
cXVhbDpAIlRpbWVzIl0pCisgICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBAIlRpbWVz
IE5ldyBSb21hbiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhbGxiYWNrRm9udEZhbWls
eSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOworICAgICAgICAKKyAgICAgICAgLy8gVHJ5IHNl
dHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgorICAgICAgICAvLyBUaGlzIGlzIGEgbGFzdCBk
aXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5nIGhhcyBn
b25lIHdyb25nLgorI2lmICFFUlJPUl9ESVNBQkxFRAorICAgICAgICBSZXRhaW5QdHI8TlNGb250
PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKKyNlbmRpZgorICAgICAgICBp
ZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0
Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250Om1fcGxh
dGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZvbnRXaXRo
TmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCldKTsKKyNp
ZiAhRVJST1JfRElTQUJMRUQKKyAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0aEZyb21G
b250KGluaXRpYWxGb250LmdldCgpKTsKKyAgICAgICAgaWYgKCFmaWxlUGF0aCkKKyAgICAgICAg
ICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOworI2VuZGlmCisgICAgICAgIGlmICghaW5pdEZv
bnREYXRhKHRoaXMpKSB7CisgICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWlseSBpc0Vx
dWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKKyAgICAgICAgICAgICAgICAvLyBPSywgY291bGRu
J3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywgZmFsbGJh
Y2sKKyAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlzIGZhaWxz
IHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KKyAgICAgICAgICAgICAgICBtX3BsYXRmb3Jt
RGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29udmVydEZv
bnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZhbWlseSgp
XSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFuZCB0aGUg
c3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgorICAgICAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIs
IGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWxl
ZFNldHVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQgdGhlIHN5
c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGluaXRp
YWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgZmFpbGVkU2V0dXAgPSB0
cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoZSBw
cm9ibGVtLgorICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwgdXNpbmcg
JUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKKyAgICAgICAgICAgIFttX3Bs
YXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBmYW1pbHlO
YW1lXSwgZmlsZVBhdGgpOworICAgIH0KKworICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB0cnkg
dG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KKyAgICAvLyBUaGlzIGlzIHByb2JhYmx5
IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWlsYWJsZS4K
KyAgICBpZiAoZmFpbGVkU2V0dXApIHsKKyAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChb
TlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2ludFNpemVd
XSk7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2luZyBzeXN0
ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7CisgICAgICAgIGluaXRGb250RGF0
YSh0aGlzKTsKKyAgICB9CisgICAgCisgICAgaW50IGlBc2NlbnQ7CisgICAgaW50IGlEZXNjZW50
OworICAgIGludCBpTGluZUdhcDsKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIHdrR2V0
Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURlc2NlbnQs
ICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7CisjZWxzZQorICAgIGlBc2NlbnQgPSBDR0ZvbnRH
ZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOworICAgIGlEZXNjZW50ID0gQ0dGb250
R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7CisgICAgaUxpbmVHYXAgPSBDR0Zv
bnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyAgICBtX3VuaXRzUGVyRW0g
PSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyNlbmRpZgor
CisgICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIGZsb2F0
IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRT
aXplOworICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3Vu
aXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5p
dHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICAvLyBXZSBuZWVk
IHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNo
IHRoZQorICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJw
YXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KKyAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBL
aXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKKyAgICAvLyBpbmNvcnJlY3Rs
eSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3Rl
YWQKKyAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCisgICAgTlNTdHJpbmcgKmZhbWls
eU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOworICAgIGlmIChbZmFt
aWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxU
b1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmluZzpAIkNv
dXJpZXIiXSkKKyAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQp
ICogMC4xNWYpICsgMC41Zik7CisgICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3Ry
aW5nOkAiR2VlemEgUHJvIl0pIHsKKyAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlwaHMgdGhh
dCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBkZXNjZW50
LiBBZGp1c3QKKyAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0ZXIgbWF0
Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25lIGxpbmUK
KyAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9mIHRoZSBu
ZXh0IGxpbmUuCisgICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7CisgICAgICAgIGZEZXNjZW50ICo9
IDIuZjsKKyAgICB9CisKKyAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7CisgICAgbV9k
ZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7CisgICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGlu
ZUdhcCk7CisgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5l
R2FwOworICAgIAorICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFsbG93IHJv
b20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCisgICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzUz
ODYxODM+CisgICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYgW2ZhbWls
eU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgeworICAgICAgICBtX2xpbmVHYXAgLT0gMyAt
IG1fZGVzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gMzsKKyAgICB9CisgICAgCisgICAgLy8g
TWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNp
emVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KKyAgICAv
LyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24n
dCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgorICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVy
byA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKKyAg
ICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7CisgICAgaWYgKHhHbHlwaCkgeworICAgICAg
ICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0Rm9yR2x5
cGg6eEdseXBoXTsKKyAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBv
ciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQorICAgICAgICAvLyBhbmQgd2Vi
IHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBs
YWlkIG91dAorICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdo
dC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAorICAgICAgICAvLyB3aGljaCBoYXMg
YW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KKyAgICAgICAgbV94SGVpZ2h0ID0gbWF4KE5TTWF4
WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV94SGVpZ2h0ID0g
W21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKK30KKyAgICAKK3N0YXRpYyBDRkRhdGFS
ZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0YSwgRm91
ckNoYXJDb2RlIHRhYmxlTmFtZSkKK3sKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIEFU
U0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3JtRGF0YS5t
X2F0c3VGb250SUQpOworCisgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICBpZiAoQVRTRm9u
dEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6ZSkgIT0g
bm9FcnIpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGTXV0YWJsZURhdGFSZWYgZGF0
YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVTaXplKTsK
KyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGRGF0YUluY3Jl
YXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7CisgICAgaWYgKEFUU0ZvbnRHZXRUYWJsZShhdHNG
b250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIoZGF0
YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7CisgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBkYXRhOworI2Vsc2UKKyAg
ICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgdGFi
bGVOYW1lKTsKKyNlbmRpZgorfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUNoYXJX
aWR0aEluaXQoKQoreworICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKKyAgICBtX21heENoYXJXaWR0
aCA9IDA7CisgICAgCisgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRvcHRDRiwg
Y29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7CisgICAgaWYgKG9z
MlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgeworICAgICAg
ICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQoKSk7Cisg
ICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJbM107Cisg
ICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldpZHRoLCBt
X3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIFJldGFp
blB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9yVGFnKG1f
cGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKKyAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0YUdldExl
bmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7CisgICAgICAgIGNvbnN0IFVJbnQ4KiBoZWFk
ID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOworICAgICAgICB1c2hvcnQgdXhN
aW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOworICAgICAgICB1c2hvcnQgdXhNYXggPSBo
ZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOworICAgICAgICBTSW50MTYgeE1pbiA9IHN0YXRpY19j
YXN0PFNJbnQxNj4odXhNaW4pOworICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19jYXN0PFNJ
bnQxNj4odXhNYXgpOworICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHhN
YXggLSB4TWluKTsKKyAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0cyhkaWZm
LCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIC8v
IEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwgcG9wdWxh
dGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KKyAgICBpbml0Q2hhcldp
ZHRocygpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQorewor
I2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgaWYgKG1fc3R5bGVHcm91cCkKKyAgICAgICAg
d2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOworI2VuZGlmCisjaWYgVVNFKEFUU1VJ
KQorICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9IG1fQVRT
VVN0eWxlTWFwLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0eWxlPjo6
aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisg
ICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7CisjZW5kaWYKK30KKworU2ltcGxl
Rm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVz
Y3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBz
Rm9udERhdGEpIHsKKyAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsKKyAgICAg
ICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6
ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKKyAgICAgICAgICAgIG1fc21hbGxDYXBz
Rm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZh
bHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhD
RVBUSU9OUzsKKyAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgp
IHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRN
YW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNpemVdKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlwZSBpbmZv
cm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRvIGEgZGlm
ZmVyZW50IHNpemUuCisgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZm9udCB0
aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgorICAgICAgICAgICAgc21hbGxDYXBzRm9udC5zZXRGb250
KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQuZm9udCgp
IHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7CisKKyAg
ICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgeworICAgICAgICAgICAgICAgIE5T
Rm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFn
ZXJdOworICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0gW2ZvbnRN
YW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOworCisgICAgICAgICAg
ICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKKyAgICAgICAgICAgICAg
ICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKKyAgICAgICAgICAgICAgICBpZiAo
bV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQorICAgICAgICAgICAgICAgICAgICBm
b250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7CisKKyAgICAgICAgICAgICAgICBOU0ZvbnRU
cmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6
c21hbGxDYXBzRm9udC5mb250KCldOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnQubV9z
eW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShzbWFsbENh
cHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fw
c0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNr
KSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKKworICAgICAg
ICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9u
dERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRU5EX0JM
T0NLX09CSkNfRVhDRVBUSU9OUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFs
bENhcHNGb250RGF0YTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0
ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIE5T
U3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcnNOb0Nv
cHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBmcmVlV2hl
bkRvbmU6Tk9dOworICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1EYXRhLmZv
bnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07CisgICAgYm9vbCByZXN1bHQg
PSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0aW9uID09
IE5TTm90Rm91bmQ7CisgICAgW3N0cmluZyByZWxlYXNlXTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgTlNGb250
KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOworICAgIC8vIFNwZWNpYWwgY2FzZSBPc2FrYS1N
b25vLgorICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIHNo
b3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCB0
aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorCisg
ICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCisgICAgLy8gQWNjb3JkaW5nIHRvIDxyZGFy
Oi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGljIGFzIGZp
eGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMtUEdvdGhp
YyBhcyBmaXhlZCBwaXRjaC4KKworICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNvcnNpdmEK
KyAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBzaG91bGQg
bm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKyAgICAvLyBOb3RlIHRo
YXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKwor
ICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOworICAgIG1fdHJlYXRBc0ZpeGVkUGl0
Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwKKyAgICAg
ICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9PSBOU09y
ZGVyZWRTYW1lKSAmJgorICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOkAi
TVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKKyAgICAgICAgICAgW25hbWUgY2FzZUlu
c2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNhbWU7Cit9
CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlw
aCBnbHlwaCkgY29uc3QKK3sKKyAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7CisjaWZuZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQ0dSZWN0IGJveDsKKyAgICBDR0ZvbnRHZXRHbHlwaEJCb3hl
cyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKKyAgICBmbG9hdCBw
b2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7CisgICAgQ0dGbG9hdCBzY2FsZSA9IHBv
aW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKKyAgICBib3VuZGluZ0JveCA9IENHUmVjdEFwcGx5QWZm
aW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUsIC1zY2Fs
ZSkpOworICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCisgICAgICAgIGJvdW5kaW5nQm94
LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQpOwor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOworI2VuZGlmCisgICAgcmV0dXJuIGJvdW5k
aW5nQm94OworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBo
KEdseXBoIGdseXBoKSBjb25zdAoreworICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3JtRGF0YSgp
LmZvbnQoKTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Cisg
ICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50
U2l6ZSwgcG9pbnRTaXplKTsKKyAgICBDR1NpemUgYWR2YW5jZTsKKyAgICBpZiAoIXdrR2V0R2x5
cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250LCAmbSwg
JmdseXBoLCAmYWR2YW5jZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY2FjaGUg
Z2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRTaXplKTsK
KyAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7CisgICAgfQorICAgIHJldHVybiBhZHZhbmNlLndp
ZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCisjaWYgVVNFKEFUU1VJKQordm9pZCBT
aW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAoreworICAgIEFTU0VSVCgh
bV9jaGVja2VkU2hhcGVzQXJhYmljKTsKKworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9IHRy
dWU7CisgICAgCisgICAgQVRTVUZvbnRJRCBmb250SUQgPSBtX3BsYXRmb3JtRGF0YS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SUQpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8g
Z2V0IEFUU1VGb250SUQgZm9yICVAIiwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb24g
Zm9udHMgdGhhdCBjb250YWluIEFyYWJpYyBnbHlwaHMuIE91cgorICAgIC8vIGhldXJpc3RpYyBp
cyB0aGF0IGlmIHN1Y2ggYSBmb250IGhhcyBhIGdseXBoIG1ldGFtb3JwaG9zaXMgdGFibGUsIHRo
ZW4KKyAgICAvLyBpdCBpbmNsdWRlcyBzaGFwaW5nIGluZm9ybWF0aW9uIGZvciBBcmFiaWMuCisg
ICAgRm91ckNoYXJDb2RlIHRhYmxlc1tdID0geyAnbW9yeCcsICdtb3J0JyB9OworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGVzKSAvIHNpemVvZih0YWJsZXNbMF0pOyAr
K2kpIHsKKyAgICAgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICAgICAgT1NTdGF0dXMgc3Rh
dHVzID0gQVRTRm9udEdldFRhYmxlKGZvbnRJRCwgdGFibGVzW2ldLCAwLCAwLCAwLCAmdGFibGVT
aXplKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgeworICAgICAgICAgICAgbV9zaGFw
ZXNBcmFiaWMgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKHN0YXR1cyAhPSBrQVRTSW52YWxpZEZvbnRUYWJsZUFjY2VzcykKKyAgICAgICAgICAg
IExPR19FUlJPUigiQVRTRm9udEdldFRhYmxlIGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICB9
Cit9CisjZW5kaWYKKworI2lmIFVTRShDT1JFX1RFWFQpCitDVEZvbnRSZWYgU2ltcGxlRm9udERh
dGE6OmdldENURm9udCgpIGNvbnN0Cit7CisgICAgaWYgKGdldE5TRm9udCgpKQorICAgICAgICBy
ZXR1cm4gdG9DVEZvbnRSZWYoZ2V0TlNGb250KCkpOworICAgIGlmICghbV9DVEZvbnQpCisgICAg
ICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNzRm9udChtX3BsYXRm
b3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cisg
ICAgcmV0dXJuIG1fQ1RGb250LmdldCgpOworfQorCitDRkRpY3Rpb25hcnlSZWYgU2ltcGxlRm9u
dERhdGE6OmdldENGU3RyaW5nQXR0cmlidXRlcyhUeXBlc2V0dGluZ0ZlYXR1cmVzIHR5cGVzZXR0
aW5nRmVhdHVyZXMpIGNvbnN0Cit7CisgICAgdW5zaWduZWQga2V5ID0gdHlwZXNldHRpbmdGZWF0
dXJlcyArIDE7CisgICAgcGFpcjxIYXNoTWFwPHVuc2lnbmVkLCBSZXRhaW5QdHI8Q0ZEaWN0aW9u
YXJ5UmVmPiA+OjppdGVyYXRvciwgYm9vbD4gYWRkUmVzdWx0ID0gbV9DRlN0cmluZ0F0dHJpYnV0
ZXMuYWRkKGtleSwgUmV0YWluUHRyPENGRGljdGlvbmFyeVJlZj4oKSk7CisgICAgUmV0YWluUHRy
PENGRGljdGlvbmFyeVJlZj4mIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5ID0gYWRkUmVzdWx0LmZpcnN0
LT5zZWNvbmQ7CisgICAgaWYgKCFhZGRSZXN1bHQuc2Vjb25kKQorICAgICAgICByZXR1cm4gYXR0
cmlidXRlc0RpY3Rpb25hcnkuZ2V0KCk7CisKKyAgICBib29sIGFsbG93TGlnYXR1cmVzID0gcGxh
dGZvcm1EYXRhKCkuYWxsb3dzTGlnYXR1cmVzKCkgfHwgKHR5cGVzZXR0aW5nRmVhdHVyZXMgJiBM
aWdhdHVyZXMpOworCisgICAgc3RhdGljIGNvbnN0IGludCBsaWdhdHVyZXNOb3RBbGxvd2VkVmFs
dWUgPSAwOworICAgIHN0YXRpYyBDRk51bWJlclJlZiBsaWdhdHVyZXNOb3RBbGxvd2VkID0gQ0ZO
dW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVySW50VHlwZSwgJmxpZ2F0
dXJlc05vdEFsbG93ZWRWYWx1ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc0Fs
bG93ZWRWYWx1ZSA9IDE7CisgICAgc3RhdGljIENGTnVtYmVyUmVmIGxpZ2F0dXJlc0FsbG93ZWQg
PSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAm
bGlnYXR1cmVzQWxsb3dlZFZhbHVlKTsKKworICAgIGlmICghKHR5cGVzZXR0aW5nRmVhdHVyZXMg
JiBLZXJuaW5nKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga2VybmluZ0FkanVzdG1l
bnRWYWx1ZSA9IDA7CisgICAgICAgIHN0YXRpYyBDRk51bWJlclJlZiBrZXJuaW5nQWRqdXN0bWVu
dCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckZsb2F0VHlw
ZSwgJmtlcm5pbmdBZGp1c3RtZW50VmFsdWUpOworICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCog
a2V5c1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsga0NURm9udEF0dHJpYnV0ZU5hbWUsIGtDVEtl
cm5BdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsKKyAgICAgICAgY29u
c3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZFtdID0geyBnZXRDVEZvbnQoKSwga2Vy
bmluZ0FkanVzdG1lbnQsIGFsbG93TGlnYXR1cmVzCisgICAgICAgICAgICA/IGxpZ2F0dXJlc0Fs
bG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07CisgICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9u
YXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0Rpc2Fi
bGVkLCB2YWx1ZXNXaXRoS2VybmluZ0Rpc2FibGVkLAorICAgICAgICAgICAgc2l6ZW9mKGtleXNX
aXRoS2VybmluZ0Rpc2FibGVkKSAvIHNpemVvZigqa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQpLAor
ICAgICAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlw
ZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEJ5
IG9taXR0aW5nIHRoZSBrQ1RLZXJuQXR0cmlidXRlTmFtZSBhdHRyaWJ1dGUsIHdlIGdldCBDb3Jl
IFRleHQncyBzdGFuZGFyZCBrZXJuaW5nLgorICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCoga2V5
c1dpdGhLZXJuaW5nRW5hYmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUTGlnYXR1
cmVBdHRyaWJ1dGVOYW1lIH07CisgICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5n
RW5hYmxlZFtdID0geyBnZXRDVEZvbnQoKSwgYWxsb3dMaWdhdHVyZXMgPyBsaWdhdHVyZXNBbGxv
d2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OworICAgICAgICBhdHRyaWJ1dGVzRGljdGlvbmFy
eS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShOVUxMLCBrZXlzV2l0aEtlcm5pbmdFbmFibGVk
LCB2YWx1ZXNXaXRoS2VybmluZ0VuYWJsZWQsCisgICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhL
ZXJuaW5nRW5hYmxlZCkgLyBzaXplb2YoKmtleXNXaXRoS2VybmluZ0VuYWJsZWQpLAorICAgICAg
ICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlwZURpY3Rp
b25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0KKworICAgIHJldHVybiBhdHRyaWJ1dGVzRGlj
dGlvbmFyeS5nZXQoKTsKK30KKworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZv
bnREYXRhQ29yZVRleHQuY3BwCShyZXZpc2lvbiA1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zMCw0NDQgKzMwLDE0IEBACiAjaW1wb3J0ICJjb25maWcuaCIKICNpbXBvcnQgIlNpbXBsZUZv
bnREYXRhLmgiCiAKLSNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgotI2ltcG9ydCAiQ29sb3Iu
aCIKLSNpbXBvcnQgIkZsb2F0UmVjdC5oIgogI2ltcG9ydCAiRm9udC5oIgogI2ltcG9ydCAiRm9u
dENhY2hlLmgiCiAjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKLSNpbXBvcnQgIlNoYXJlZEJ1
ZmZlci5oIgotI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgotI2ltcG9ydCA8QXBw
S2l0L0FwcEtpdC5oPgogI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNl
cnZpY2VzLmg+Ci0jaW1wb3J0IDxmbG9hdC5oPgotI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgot
I2ltcG9ydCA8d3RmL0Fzc2VydGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4K
LSNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgot
Ci1AaW50ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQotLSAoQk9PTClfaXNGYWtl
Rml4ZWRQaXRjaDsKLUBlbmQKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewotICAKLWNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAu
N2Y7Ci1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVk
IHVuaXRzUGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9Ci0KLXN0YXRpYyBib29sIGlu
aXRGb250RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCi17Ci0gICAgaWYgKCFmb250RGF0
YS0+cGxhdGZvcm1EYXRhKCkuY2dGb250KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotI2lm
ZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKLSAgICBpZiAo
QVRTVUNyZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5t
X2F0c3VGb250SUQ7Ci0gICAgaWYgKCFmb250SWQpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHls
ZShmb250U3R5bGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQVRTVUF0
dHJpYnV0ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7Ci0gICAgQnl0ZUNvdW50IHNpemUgPSBzaXpl
b2YoQVRTVUZvbnRJRCk7Ci0gICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElk
fTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEs
ICZ0YWcsICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOwotICAgIGlmIChzdGF0dXMg
IT0gbm9FcnIpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOwotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250
U3R5bGUsICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgewotICAgICAgICBBVFNV
RGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICBBVFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiB0
cnVlOwotfQotCi1zdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQot
ewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJh
Y2tGb250RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFt
ZV0pKTsKLSAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOwotfQotCi0jaWYg
IUVSUk9SX0RJU0FCTEVECi0jaWZkZWYgX19MUDY0X18KLXN0YXRpYyBOU1N0cmluZyogcGF0aEZy
b21Gb250KE5TRm9udCopCi17Ci0gICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90
IGF2YWlsYWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRl
YnVnZ2luZwotICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCi0g
ICAgcmV0dXJuIG5pbDsKLX0KLSNlbHNlCi1zdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChO
U0ZvbnQgKmZvbnQpCi17Ci0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTRm9udFJl
ZiBhdHNGb250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250
KHRvQ1RGb250UmVmKGZvbnQpLCAwKSk7Ci0jZWxzZQotICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9
IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7Ci0j
ZW5kaWYKLSAgICBGU1JlZiBmaWxlUmVmOwotCi0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0g
ICAgT1NTdGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZp
bGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBuaWw7Ci0j
ZWxzZQotICAgIEZTU3BlYyBvRmlsZTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0
RmlsZVNwZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKLSAgICBpZiAoc3RhdHVzICE9IG5v
RXJyKQotICAgICAgICByZXR1cm4gbmlsOwotCi0gICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZv
RmlsZSwgJmZpbGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVy
biBuaWw7Ci0jZW5kaWYKLQotICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKLSAg
ICBzdGF0dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9N
QVgpOwotICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBbTlNTdHJpbmcg
c3RyaW5nV2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKLQotICAg
IHJldHVybiBuaWw7Ci19Ci0jZW5kaWYgLy8gX19MUDY0X18KLSNlbmRpZiAvLyAhRVJST1JfRElT
QUJMRUQKLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsKLSNpZmRlZiBC
VUlMRElOR19PTl9USUdFUgotICAgIG1fc3R5bGVHcm91cCA9IDA7Ci0jZW5kaWYKLSNpZiBVU0Uo
QVRTVUkpCi0gICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOwotICAgIG1fY2hlY2tlZFNoYXBlc0Fy
YWJpYyA9IGZhbHNlOwotICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7Ci0jZW5kaWYKLQotICAg
IG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/
IDEuMGYgOiAwLmY7Ci0KLSAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7Ci0gICAgaWYgKCFp
bml0Rm9udERhdGEodGhpcykpIHsKLSAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQg
aGFwcGVuZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCi0gICAgICAgIC8vIFRyeSBsb29raW5nIGZv
ciBhbiBhbHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCi0KLSAgICAgICAg
Ly8gU3BlY2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9m
ICJUaW1lcyIuCi0gICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBm
YW1pbHkgbmFtZSBpcyAiVGltZXMiLgotICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1h
bCAiVGltZXMiIGZhbWlseSBmb250LgotICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2
ZSBhIGNvcnJ1cHQgcmVndWxhciB2YXJpYW50LgotICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tG
b250RmFtaWx5OwotICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFt
ZV0gaXNFcXVhbDpAIlRpbWVzIl0pCi0gICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBA
IlRpbWVzIE5ldyBSb21hbiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZhbGxiYWNrRm9u
dEZhbWlseSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOwotICAgICAgICAKLSAgICAgICAgLy8g
VHJ5IHNldHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgotICAgICAgICAvLyBUaGlzIGlzIGEg
bGFzdCBkaXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5n
IGhhcyBnb25lIHdyb25nLgotI2lmICFFUlJPUl9ESVNBQkxFRAotICAgICAgICBSZXRhaW5QdHI8
TlNGb250PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKLSNlbmRpZgotICAg
ICAgICBpZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQotICAgICAgICAgICAgbV9wbGF0Zm9ybURh
dGEuc2V0Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250
Om1fcGxhdGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZv
bnRXaXRoTmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCld
KTsKLSNpZiAhRVJST1JfRElTQUJMRUQKLSAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0
aEZyb21Gb250KGluaXRpYWxGb250LmdldCgpKTsKLSAgICAgICAgaWYgKCFmaWxlUGF0aCkKLSAg
ICAgICAgICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOwotI2VuZGlmCi0gICAgICAgIGlmICgh
aW5pdEZvbnREYXRhKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWls
eSBpc0VxdWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKLSAgICAgICAgICAgICAgICAvLyBPSywg
Y291bGRuJ3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywg
ZmFsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlz
IGZhaWxzIHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KLSAgICAgICAgICAgICAgICBtX3Bs
YXRmb3JtRGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29u
dmVydEZvbnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZh
bWlseSgpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFu
ZCB0aGUgc3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgotICAgICAgICAg
ICAgICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBh
dCAlQCIsIGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAg
IGZhaWxlZFNldHVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQg
dGhlIHN5c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KLSAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIs
IGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgZmFpbGVkU2V0
dXAgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVwb3J0
IHRoZSBwcm9ibGVtLgotICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwg
dXNpbmcgJUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKLSAgICAgICAgICAg
IFttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBm
YW1pbHlOYW1lXSwgZmlsZVBhdGgpOwotICAgIH0KLQotICAgIC8vIElmIGFsbCBlbHNlIGZhaWxz
LCB0cnkgdG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KLSAgICAvLyBUaGlzIGlzIHBy
b2JhYmx5IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWls
YWJsZS4KLSAgICBpZiAoZmFpbGVkU2V0dXApIHsKLSAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0
Rm9udChbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2lu
dFNpemVdXSk7Ci0gICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2lu
ZyBzeXN0ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7Ci0gICAgICAgIGluaXRG
b250RGF0YSh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IGlBc2NlbnQ7Ci0gICAgaW50IGlE
ZXNjZW50OwotICAgIGludCBpTGluZUdhcDsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgotICAg
IHdrR2V0Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURl
c2NlbnQsICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7Ci0jZWxzZQotICAgIGlBc2NlbnQgPSBD
R0ZvbnRHZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOwotICAgIGlEZXNjZW50ID0g
Q0dGb250R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7Ci0gICAgaUxpbmVHYXAg
PSBDR0ZvbnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSAgICBtX3VuaXRz
UGVyRW0gPSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSNl
bmRpZgotCi0gICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAg
IGZsb2F0IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOwotICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50
LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVF
bVRvVW5pdHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0KLSAgICAvLyBX
ZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5
IG1hdGNoIHRoZQotICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNv
dW50ZXJwYXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KLSAgICAvLyB3ZWIgc3RhbmRhcmQuIFRo
ZSBBcHBLaXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKLSAgICAvLyBpbmNv
cnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50
IGluc3RlYWQKLSAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAgTlNTdHJpbmcg
KmZhbWlseU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOwotICAgIGlm
IChbZmFtaWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlz
RXF1YWxUb1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmlu
ZzpAIkNvdXJpZXIiXSkKLSAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRl
c2NlbnQpICogMC4xNWYpICsgMC41Zik7Ci0gICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVh
bFRvU3RyaW5nOkAiR2VlemEgUHJvIl0pIHsKLSAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlw
aHMgdGhhdCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBk
ZXNjZW50LiBBZGp1c3QKLSAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0
ZXIgbWF0Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25l
IGxpbmUKLSAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9m
IHRoZSBuZXh0IGxpbmUuCi0gICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7Ci0gICAgICAgIGZEZXNj
ZW50ICo9IDIuZjsKLSAgICB9Ci0KLSAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7Ci0g
ICAgbV9kZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7Ci0gICAgbV9saW5lR2FwID0gbHJvdW5k
ZihmTGluZUdhcCk7Ci0gICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsg
bV9saW5lR2FwOwotICAgIAotICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFs
bG93IHJvb20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCi0gICAgLy8gPHJkYXI6Ly9wcm9i
bGVtLzUzODYxODM+Ci0gICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYg
W2ZhbWlseU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgewotICAgICAgICBtX2xpbmVHYXAg
LT0gMyAtIG1fZGVzY2VudDsKLSAgICAgICAgbV9kZXNjZW50ID0gMzsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5
bnRoZXNpemVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4K
LSAgICAvLyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3
ZSBkb24ndCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgotICAgIEdseXBoUGFnZSogZ2x5cGhQ
YWdlWmVybyA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2Uo
KTsKLSAgICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5n
bHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAgaWYgKHhHbHlwaCkgewot
ICAgICAgICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0
Rm9yR2x5cGg6eEdseXBoXTsKLSAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3
aWR0aCBvciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQotICAgICAgICAvLyBh
bmQgd2ViIHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2ls
bCBiZSBsYWlkIG91dAotICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRl
IGhlaWdodC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAotICAgICAgICAvLyB3aGlj
aCBoYXMgYW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KLSAgICAgICAgbV94SGVpZ2h0ID0gbWF4
KE5TTWF4WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV94SGVp
Z2h0ID0gW21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKLX0KLSAgICAKLXN0YXRpYyBD
RkRhdGFSZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0
YSwgRm91ckNoYXJDb2RlIHRhYmxlTmFtZSkKLXsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgot
ICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3Jt
RGF0YS5tX2F0c3VGb250SUQpOwotCi0gICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKLSAgICBpZiAo
QVRTRm9udEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6
ZSkgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGTXV0YWJsZURhdGFS
ZWYgZGF0YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVT
aXplKTsKLSAgICBpZiAoIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGRGF0
YUluY3JlYXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7Ci0gICAgaWYgKEFUU0ZvbnRHZXRUYWJs
ZShhdHNGb250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQ
dHIoZGF0YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7Ci0gICAgICAgIENGUmVsZWFzZShkYXRh
KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBkYXRhOwotI2Vs
c2UKLSAgICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQo
KSwgdGFibGVOYW1lKTsKLSNlbmRpZgotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9y
bUNoYXJXaWR0aEluaXQoKQotewotICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKLSAgICBtX21heENo
YXJXaWR0aCA9IDA7Ci0gICAgCi0gICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRv
cHRDRiwgY29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7Ci0gICAg
aWYgKG9zMlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgewot
ICAgICAgICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQo
KSk7Ci0gICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJb
M107Ci0gICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldp
ZHRoLCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQotICAg
IFJldGFpblB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9y
VGFnKG1fcGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKLSAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0
YUdldExlbmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7Ci0gICAgICAgIGNvbnN0IFVJbnQ4
KiBoZWFkID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOwotICAgICAgICB1c2hv
cnQgdXhNaW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOwotICAgICAgICB1c2hvcnQgdXhN
YXggPSBoZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOwotICAgICAgICBTSW50MTYgeE1pbiA9IHN0
YXRpY19jYXN0PFNJbnQxNj4odXhNaW4pOwotICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19j
YXN0PFNJbnQxNj4odXhNYXgpOwotICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8Zmxv
YXQ+KHhNYXggLSB4TWluKTsKLSAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0
cyhkaWZmLCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQot
ICAgIC8vIEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwg
cG9wdWxhdGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KLSAgICBpbml0
Q2hhcldpZHRocygpOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3ko
KQotewotI2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgaWYgKG1fc3R5bGVHcm91cCkKLSAg
ICAgICAgd2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOwotI2VuZGlmCi0jaWYgVVNF
KEFUU1VJKQotICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9
IG1fQVRTVVN0eWxlTWFwLmVuZCgpOwotICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0
eWxlPjo6aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpCi0gICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7Ci0jZW5kaWYKLX0KLQot
U2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBG
b250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBpZiAoIW1fc21h
bGxDYXBzRm9udERhdGEpIHsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7Ci0gICAgICAg
ICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsK
LSAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRh
Lm1fc2l6ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKLSAgICAgICAgICAgIG1fc21h
bGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRy
dWUsIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUzsKLSAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEu
Zm9udCgpIHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7Ci0gICAgICAg
ICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJl
ZEZvbnRNYW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNp
emVdKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlw
ZSBpbmZvcm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRv
IGEgZGlmZmVyZW50IHNpemUuCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUg
Zm9udCB0aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgotICAgICAgICAgICAgc21hbGxDYXBzRm9udC5z
ZXRGb250KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQu
Zm9udCgpIHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7
Ci0KLSAgICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgewotICAgICAgICAgICAg
ICAgIE5TRm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9u
dE1hbmFnZXJdOwotICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0g
W2ZvbnRNYW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOwotCi0gICAg
ICAgICAgICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKLSAgICAgICAg
ICAgICAgICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKLSAgICAgICAgICAgICAg
ICBpZiAobV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQotICAgICAgICAgICAgICAg
ICAgICBmb250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7Ci0KLSAgICAgICAgICAgICAgICBO
U0ZvbnRUcmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNP
ZkZvbnQ6c21hbGxDYXBzRm9udC5mb250KCldOwotICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0Zv
bnQubV9zeW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShz
bWFsbENhcHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOwotICAgICAgICAgICAgICAgIHNt
YWxsQ2Fwc0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0Zv
bnRNYXNrKSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKLQot
ICAgICAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2Fj
aGVkRm9udERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
RU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4g
bV9zbWFsbENhcHNGb250RGF0YTsKLX0KLQotYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnND
aGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAotewot
ICAgIE5TU3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3Rl
cnNOb0NvcHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBm
cmVlV2hlbkRvbmU6Tk9dOwotICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1E
YXRhLmZvbnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07Ci0gICAgYm9vbCBy
ZXN1bHQgPSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0
aW9uID09IE5TTm90Rm91bmQ7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCi17Ci0gICAg
TlNGb250KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOwotICAgIC8vIFNwZWNpYWwgY2FzZSBP
c2FrYS1Nb25vLgotICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4s
IHdlIHNob3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5vdGUg
dGhhdCB0aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNo
LgotCi0gICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCi0gICAgLy8gQWNjb3JkaW5nIHRv
IDxyZGFyOi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGlj
IGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMt
UEdvdGhpYyBhcyBmaXhlZCBwaXRjaC4KLQotICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNv
cnNpdmEKLSAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBz
aG91bGQgbm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KLSAgICAvLyBO
b3RlIHRoYXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRj
aC4KLQotICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOwotICAgIG1fdHJlYXRBc0Zp
eGVkUGl0Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwK
LSAgICAgICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9
PSBOU09yZGVyZWRTYW1lKSAmJgotICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21w
YXJlOkAiTVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKLSAgICAgICAgICAgW25hbWUg
Y2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNh
bWU7Ci19Ci0KLUZsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlw
aChHbHlwaCBnbHlwaCkgY29uc3QKLXsKLSAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7Ci0jaWZu
ZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQ0dSZWN0IGJveDsKLSAgICBDR0ZvbnRHZXRHbHlw
aEJCb3hlcyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKLSAgICBm
bG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Ci0gICAgQ0dGbG9hdCBzY2Fs
ZSA9IHBvaW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKLSAgICBib3VuZGluZ0JveCA9IENHUmVjdEFw
cGx5QWZmaW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUs
IC1zY2FsZSkpOwotICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCi0gICAgICAgIGJvdW5k
aW5nQm94LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZz
ZXQpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOwotI2VuZGlmCi0gICAgcmV0dXJu
IGJvdW5kaW5nQm94OwotfQotCi1mbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZv
ckdseXBoKEdseXBoIGdseXBoKSBjb25zdAotewotICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3Jt
RGF0YSgpLmZvbnQoKTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3Np
emU7Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxl
KHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKLSAgICBDR1NpemUgYWR2YW5jZTsKLSAgICBpZiAoIXdr
R2V0R2x5cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250
LCAmbSwgJmdseXBoLCAmYWR2YW5jZSkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8g
Y2FjaGUgZ2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRT
aXplKTsKLSAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBhZHZh
bmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQotCi0jaWYgVVNFKEFUU1VJKQot
dm9pZCBTaW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAotewotICAgIEFT
U0VSVCghbV9jaGVja2VkU2hhcGVzQXJhYmljKTsKLQotICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJp
YyA9IHRydWU7Ci0gICAgCi0gICAgQVRTVUZvbnRJRCBmb250SUQgPSBtX3BsYXRmb3JtRGF0YS5t
X2F0c3VGb250SUQ7Ci0gICAgaWYgKCFmb250SUQpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmFi
bGUgdG8gZ2V0IEFUU1VGb250SUQgZm9yICVAIiwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9u
bHkgb24gZm9udHMgdGhhdCBjb250YWluIEFyYWJpYyBnbHlwaHMuIE91cgotICAgIC8vIGhldXJp
c3RpYyBpcyB0aGF0IGlmIHN1Y2ggYSBmb250IGhhcyBhIGdseXBoIG1ldGFtb3JwaG9zaXMgdGFi
bGUsIHRoZW4KLSAgICAvLyBpdCBpbmNsdWRlcyBzaGFwaW5nIGluZm9ybWF0aW9uIGZvciBBcmFi
aWMuCi0gICAgRm91ckNoYXJDb2RlIHRhYmxlc1tdID0geyAnbW9yeCcsICdtb3J0JyB9OwotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGVzKSAvIHNpemVvZih0YWJsZXNb
MF0pOyArK2kpIHsKLSAgICAgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKLSAgICAgICAgT1NTdGF0
dXMgc3RhdHVzID0gQVRTRm9udEdldFRhYmxlKGZvbnRJRCwgdGFibGVzW2ldLCAwLCAwLCAwLCAm
dGFibGVTaXplKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgewotICAgICAgICAgICAg
bV9zaGFwZXNBcmFiaWMgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKHN0YXR1cyAhPSBrQVRTSW52YWxpZEZvbnRUYWJsZUFjY2VzcykKLSAgICAg
ICAgICAgIExPR19FUlJPUigiQVRTRm9udEdldFRhYmxlIGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsK
LSAgICB9Ci19Ci0jZW5kaWYKIAogI2lmIFVTRShDT1JFX1RFWFQpCiBDVEZvbnRSZWYgU2ltcGxl
Rm9udERhdGE6OmdldENURm9udCgpIGNvbnN0CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbQkocmV2aXNpb24gNTg1MjApCisr
KyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbQkod29y
a2luZyBjb3B5KQpAQCAtNDM4LDg0ICs0MzgsNCBAQCBmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxh
dGZvcm1XaWR0aEZvckdsCiAgICAgcmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0Jv
bGRPZmZzZXQ7CiB9CiAKLSNpZiBVU0UoQVRTVUkpCi12b2lkIFNpbXBsZUZvbnREYXRhOjpjaGVj
a1NoYXBlc0FyYWJpYygpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFtX2NoZWNrZWRTaGFwZXNBcmFi
aWMpOwotCi0gICAgbV9jaGVja2VkU2hhcGVzQXJhYmljID0gdHJ1ZTsKLSAgICAKLSAgICBBVFNV
Rm9udElEIGZvbnRJRCA9IG1fcGxhdGZvcm1EYXRhLm1fYXRzdUZvbnRJRDsKLSAgICBpZiAoIWZv
bnRJRCkgewotICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBnZXQgQVRTVUZvbnRJRCBmb3Ig
JUAiLCBtX3BsYXRmb3JtRGF0YS5mb250KCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0g
ICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbiBmb250cyB0aGF0IGNvbnRhaW4g
QXJhYmljIGdseXBocy4gT3VyCi0gICAgLy8gaGV1cmlzdGljIGlzIHRoYXQgaWYgc3VjaCBhIGZv
bnQgaGFzIGEgZ2x5cGggbWV0YW1vcnBob3NpcyB0YWJsZSwgdGhlbgotICAgIC8vIGl0IGluY2x1
ZGVzIHNoYXBpbmcgaW5mb3JtYXRpb24gZm9yIEFyYWJpYy4KLSAgICBGb3VyQ2hhckNvZGUgdGFi
bGVzW10gPSB7ICdtb3J4JywgJ21vcnQnIH07Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHNpemVvZih0YWJsZXMpIC8gc2l6ZW9mKHRhYmxlc1swXSk7ICsraSkgewotICAgICAgICBCeXRl
Q291bnQgdGFibGVTaXplOwotICAgICAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0VGFi
bGUoZm9udElELCB0YWJsZXNbaV0sIDAsIDAsIDAsICZ0YWJsZVNpemUpOwotICAgICAgICBpZiAo
c3RhdHVzID09IG5vRXJyKSB7Ci0gICAgICAgICAgICBtX3NoYXBlc0FyYWJpYyA9IHRydWU7Ci0g
ICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHVzICE9IGtB
VFNJbnZhbGlkRm9udFRhYmxlQWNjZXNzKQotICAgICAgICAgICAgTE9HX0VSUk9SKCJBVFNGb250
R2V0VGFibGUgZmFpbGVkICglZCkiLCBzdGF0dXMpOwotICAgIH0KLX0KLSNlbmRpZgotCi0jaWYg
VVNFKENPUkVfVEVYVCkKLUNURm9udFJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q1RGb250KCkgY29u
c3QKLXsKLSAgICBpZiAoZ2V0TlNGb250KCkpCi0gICAgICAgIHJldHVybiB0b0NURm9udFJlZihn
ZXROU0ZvbnQoKSk7Ci0gICAgaWYgKCFtX0NURm9udCkKLSAgICAgICAgbV9DVEZvbnQuYWRvcHRD
RihDVEZvbnRDcmVhdGVXaXRoR3JhcGhpY3NGb250KG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpLCBt
X3BsYXRmb3JtRGF0YS5zaXplKCksIE5VTEwsIE5VTEwpKTsKLSAgICByZXR1cm4gbV9DVEZvbnQu
Z2V0KCk7Ci19Ci0KLUNGRGljdGlvbmFyeVJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q0ZTdHJpbmdB
dHRyaWJ1dGVzKFR5cGVzZXR0aW5nRmVhdHVyZXMgdHlwZXNldHRpbmdGZWF0dXJlcykgY29uc3QK
LXsKLSAgICB1bnNpZ25lZCBrZXkgPSB0eXBlc2V0dGluZ0ZlYXR1cmVzICsgMTsKLSAgICBwYWly
PEhhc2hNYXA8dW5zaWduZWQsIFJldGFpblB0cjxDRkRpY3Rpb25hcnlSZWY+ID46Oml0ZXJhdG9y
LCBib29sPiBhZGRSZXN1bHQgPSBtX0NGU3RyaW5nQXR0cmlidXRlcy5hZGQoa2V5LCBSZXRhaW5Q
dHI8Q0ZEaWN0aW9uYXJ5UmVmPigpKTsKLSAgICBSZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5UmVmPiYg
YXR0cmlidXRlc0RpY3Rpb25hcnkgPSBhZGRSZXN1bHQuZmlyc3QtPnNlY29uZDsKLSAgICBpZiAo
IWFkZFJlc3VsdC5zZWNvbmQpCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzRGljdGlvbmFyeS5n
ZXQoKTsKLQotICAgIGJvb2wgYWxsb3dMaWdhdHVyZXMgPSBwbGF0Zm9ybURhdGEoKS5hbGxvd3NM
aWdhdHVyZXMoKSB8fCAodHlwZXNldHRpbmdGZWF0dXJlcyAmIExpZ2F0dXJlcyk7Ci0KLSAgICBz
dGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc05vdEFsbG93ZWRWYWx1ZSA9IDA7Ci0gICAgc3RhdGlj
IENGTnVtYmVyUmVmIGxpZ2F0dXJlc05vdEFsbG93ZWQgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxv
Y2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAmbGlnYXR1cmVzTm90QWxsb3dlZFZhbHVl
KTsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQgbGlnYXR1cmVzQWxsb3dlZFZhbHVlID0gMTsKLSAg
ICBzdGF0aWMgQ0ZOdW1iZXJSZWYgbGlnYXR1cmVzQWxsb3dlZCA9IENGTnVtYmVyQ3JlYXRlKGtD
RkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZsaWdhdHVyZXNBbGxvd2VkVmFs
dWUpOwotCi0gICAgaWYgKCEodHlwZXNldHRpbmdGZWF0dXJlcyAmIEtlcm5pbmcpKSB7Ci0gICAg
ICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrZXJuaW5nQWRqdXN0bWVudFZhbHVlID0gMDsKLSAgICAg
ICAgc3RhdGljIENGTnVtYmVyUmVmIGtlcm5pbmdBZGp1c3RtZW50ID0gQ0ZOdW1iZXJDcmVhdGUo
a0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyRmxvYXRUeXBlLCAma2VybmluZ0FkanVzdG1l
bnRWYWx1ZSk7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdEaXNh
YmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUS2VybkF0dHJpYnV0ZU5hbWUsIGtD
VExpZ2F0dXJlQXR0cmlidXRlTmFtZSB9OwotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZXNXaXRo
S2VybmluZ0Rpc2FibGVkW10gPSB7IGdldENURm9udCgpLCBrZXJuaW5nQWRqdXN0bWVudCwgYWxs
b3dMaWdhdHVyZXMKLSAgICAgICAgICAgID8gbGlnYXR1cmVzQWxsb3dlZCA6IGxpZ2F0dXJlc05v
dEFsbG93ZWQgfTsKLSAgICAgICAgYXR0cmlidXRlc0RpY3Rpb25hcnkuYWRvcHRDRihDRkRpY3Rp
b25hcnlDcmVhdGUoTlVMTCwga2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQsIHZhbHVlc1dpdGhLZXJu
aW5nRGlzYWJsZWQsCi0gICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQp
IC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdEaXNhYmxlZCksCi0gICAgICAgICAgICAma0NGQ29w
eVN0cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2Fs
bEJhY2tzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQnkgb21pdHRpbmcgdGhlIGtDVEtl
cm5BdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSwgd2UgZ2V0IENvcmUgVGV4dCdzIHN0YW5kYXJkIGtl
cm5pbmcuCi0gICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdFbmFibGVk
W10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsK
LSAgICAgICAgY29uc3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGdldENU
Rm9udCgpLCBhbGxvd0xpZ2F0dXJlcyA/IGxpZ2F0dXJlc0FsbG93ZWQgOiBsaWdhdHVyZXNOb3RB
bGxvd2VkIH07Ci0gICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9u
YXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0VuYWJsZWQsIHZhbHVlc1dpdGhLZXJuaW5n
RW5hYmxlZCwKLSAgICAgICAgICAgIHNpemVvZihrZXlzV2l0aEtlcm5pbmdFbmFibGVkKSAvIHNp
emVvZigqa2V5c1dpdGhLZXJuaW5nRW5hYmxlZCksCi0gICAgICAgICAgICAma0NGQ29weVN0cmlu
Z0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tz
KSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmdldCgpOwotfQot
Ci0jZW5kaWYKLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54749</attachid>
            <date>2010-04-29 16:07:45 -0700</date>
            <delta_ts>2010-04-29 16:10:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38334-20100429160744.patch</filename>
            <type>text/plain</type>
            <size>92495</size>
            <attacher name="Kevin Ollivier">kevino</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1ODU0NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMTAtMDQtMjkgIEtldmluIE9sbGl2aWVyICA8a2V2aW5vQHRoZW9s
bGl2aWVycy5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQWxsb3cgb3RoZXIgcG9ydHMgdG8gY29tcGlsZSBBVFNVSSBhbmQgQ29yZVRleHQgZnVu
Y3Rpb25zIGluIFNpbXBsZUZvbnREYXRhIGZvciBNYWMuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODMzNAorCisgICAgICAgICogV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9T
aW1wbGVGb250RGF0YUFUU1VJLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvU2ltcGxlRm9udERhdGFNYWMubW0uCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQuY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbS4KKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFNYWMubW06CisKIDIwMTAtMDQtMjkgIERh
biBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTaW1v
biBGcmFzZXIuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
ago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkocmV2aXNpb24gNTg1MjApCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMjgxLDYgKzI4MSw4IEBACiAJCTE1Qzc3MDk0MTAw
RDNDQTgwMDVCQTI2NyAvKiBKU1ZhbGlkaXR5U3RhdGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTVDNzcwOTIxMDBEM0NBODAwNUJBMjY3IC8qIEpT
VmFsaWRpdHlTdGF0ZS5jcHAgKi87IH07CiAJCTE1Qzc3MEE1MTAwRDQxQ0QwMDVCQTI2NyAvKiBE
T01WYWxpZGl0eVN0YXRlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMTVDNzcwQTMxMDBENDFDRDAwNUJBMjY3IC8qIERPTVZhbGlkaXR5U3RhdGUubW0g
Ki87IH07CiAJCTE1Qzc3MEE2MTAwRDQxQ0QwMDVCQTI2NyAvKiBET01WYWxpZGl0eVN0YXRlLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNUM3NzBBNDEw
MEQ0MUNEMDA1QkEyNjcgLyogRE9NVmFsaWRpdHlTdGF0ZS5oICovOyB9OworCQkxNjNFODhGNjEx
OEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERhdGFBVFNVSS5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNjNFODhGNDExOEEzOUQyMDBFRDkyMzEg
LyogU2ltcGxlRm9udERhdGFBVFNVSS5jcHAgKi87IH07CisJCTE2M0U4OEY3MTE4QTM5RDIwMEVE
OTIzMSAvKiBTaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE2M0U4OEY1MTE4QTM5RDIwMEVEOTIzMSAvKiBTaW1w
bGVGb250RGF0YUNvcmVUZXh0LmNwcCAqLzsgfTsKIAkJMTg1QkNGMjgwRjMyNzlDRTAwMEVBMjYy
IC8qIFRocmVhZFRpbWVycy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAxODVCQ0YyNjBGMzI3OUNFMDAwRUEyNjIgLyogVGhyZWFkVGltZXJzLmNwcCAq
LzsgfTsKIAkJMTg1QkNGMjkwRjMyNzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTg1QkNGMjcwRjMyNzlD
RTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5oICovOyB9OwogCQkxODg2MDRCMzBGMkU2NTRBMDAw
QjY0NDMgLyogRE9NVGltZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMTg4NjA0QjEwRjJFNjU0QTAwMEI2NDQzIC8qIERPTVRpbWVyLmNwcCAqLzsg
fTsKQEAgLTU2NzcsNiArNTY3OSw4IEBACiAJCTE1Qzc3MDkyMTAwRDNDQTgwMDVCQTI2NyAvKiBK
U1ZhbGlkaXR5U3RhdGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
SlNWYWxpZGl0eVN0YXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTVDNzcw
QTMxMDBENDFDRDAwNUJBMjY3IC8qIERPTVZhbGlkaXR5U3RhdGUubW0gKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBET01WYWxpZGl0eVN0YXRlLm1tOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkxNUM3NzBBNDEwMEQ0MUNEMDA1QkEyNjcgLyogRE9NVmFsaWRp
dHlTdGF0ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBET01WYWxpZGl0eVN0
YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTE2M0U4OEY0MTE4QTM5RDIwMEVE
OTIzMSAvKiBTaW1wbGVGb250RGF0YUFUU1VJLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IFNpbXBsZUZvbnREYXRhQVRTVUkuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQkxNjNFODhGNTExOEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERhdGFDb3Jl
VGV4dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTaW1wbGVGb250
RGF0YUNvcmVUZXh0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTg1QkNGMjYw
RjMyNzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBUaHJlYWRUaW1lcnMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQkxODVCQ0YyNzBGMzI3OUNFMDAwRUEyNjIgLyogVGhyZWFkVGltZXJzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRocmVhZFRpbWVycy5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQkxODg2MDRCMTBGMkU2NTRBMDAwQjY0NDMgLyogRE9NVGltZXIuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRE9NVGltZXIuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTQ2MTYsNiArMTQ2MjAsOCBAQAogCQlCMjc1MzU0
OTBCMDUzODE0MDAyQ0U2NEYgLyogbWFjICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQlj
aGlsZHJlbiA9ICgKKwkJCQkxNjNFODhGNDExOEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERh
dGFBVFNVSS5jcHAgKi8sCisJCQkJMTYzRTg4RjUxMThBMzlEMjAwRUQ5MjMxIC8qIFNpbXBsZUZv
bnREYXRhQ29yZVRleHQuY3BwICovLAogCQkJCTQ5QzdCOUZEMTA0MkQzOEMwMDA5RDQ0NyAvKiBD
YW52YXMzRExheWVyLmggKi8sCiAJCQkJNDlDN0I5RkUxMDQyRDM4QzAwMDlENDQ3IC8qIENhbnZh
czNETGF5ZXIubW0gKi8sCiAJCQkJRURFM0E0RkYwQzdBNDMwNjAwOTU2QTM3IC8qIENvbG9yTWFj
LmggKi8sCkBAIC0yMTE0NSw2ICsyMTE1MSw4IEBACiAJCQkJMEZGMjg1OTIxMTg2NDA1NDAwN0I3
Q0Q2IC8qIFJlbmRlck1hdGhNTFNxdWFyZVJvb3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQjUy
M0NGMDkxMTgyNjc1NDAwRUJCMjlDIC8qIFNRTFRyYW5zYWN0aW9uU3luYy5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlCNTIzQ0YwQTExODI2NzU0MDBFQkIyOUMgLyogRGF0YWJhc2VTeW5jLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCTE2M0U4OEY2MTE4QTM5RDIwMEVEOTIzMSAvKiBTaW1wbGVGb250
RGF0YUFUU1VJLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTE2M0U4OEY3MTE4QTM5RDIwMEVEOTIz
MSAvKiBTaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFBVFNVSS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFBVFNV
SS5jcHAJKHJldmlzaW9uIDU4NTIwKQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21h
Yy9TaW1wbGVGb250RGF0YU1hYy5tbTo1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQ
cm9za3VyeWFrb3YKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlNpbXBsZUZvbnREYXRh
LmgiCisKKyNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgorI2ltcG9ydCAiQ29sb3IuaCIKKyNp
bXBvcnQgIkZsb2F0UmVjdC5oIgorI2ltcG9ydCAiRm9udC5oIgorI2ltcG9ydCAiRm9udENhY2hl
LmgiCisjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKKyNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5o
IgorI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgorI2ltcG9ydCA8QXBwS2l0L0Fw
cEtpdC5oPgorI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2Vz
Lmg+CisjaW1wb3J0IDxmbG9hdC5oPgorI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgorI2ltcG9y
dCA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbXBv
cnQgPHd0Zi9SZXRhaW5QdHIuaD4KKyNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgorCitAaW50
ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQorLSAoQk9PTClfaXNGYWtlRml4ZWRQ
aXRjaDsKK0BlbmQKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworICAKK2NvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Citz
dGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRz
UGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9CisKK3N0YXRpYyBib29sIGluaXRGb250
RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCit7CisgICAgaWYgKCFmb250RGF0YS0+cGxh
dGZvcm1EYXRhKCkuY2dGb250KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKKyAgICBpZiAoQVRTVUNy
ZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SWQpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250
U3R5bGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVRTVUF0dHJpYnV0
ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7CisgICAgQnl0ZUNvdW50IHNpemUgPSBzaXplb2YoQVRT
VUZvbnRJRCk7CisgICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElkfTsKKyAg
ICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEsICZ0YWcs
ICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOworICAgIGlmIChzdGF0dXMgIT0gbm9F
cnIpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250U3R5bGUs
ICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgeworICAgICAgICBBVFNVRGlzcG9z
ZVN0eWxlKGZvbnRTdHlsZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBB
VFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7CisjZW5kaWYKKworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQoreworICAg
IERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJhY2tGb250
RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFtZV0pKTsK
KyAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOworfQorCisjaWYgIUVSUk9S
X0RJU0FCTEVECisjaWZkZWYgX19MUDY0X18KK3N0YXRpYyBOU1N0cmluZyogcGF0aEZyb21Gb250
KE5TRm9udCopCit7CisgICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90IGF2YWls
YWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2lu
ZworICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCisgICAgcmV0
dXJuIG5pbDsKK30KKyNlbHNlCitzdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChOU0ZvbnQg
KmZvbnQpCit7CisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgQVRTRm9udFJlZiBhdHNG
b250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250KHRvQ1RG
b250UmVmKGZvbnQpLCAwKSk7CisjZWxzZQorICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0
QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7CisjZW5kaWYK
KyAgICBGU1JlZiBmaWxlUmVmOworCisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgT1NT
dGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZpbGVSZWYp
OworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7CisjZWxzZQor
ICAgIEZTU3BlYyBvRmlsZTsKKyAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0RmlsZVNw
ZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQor
ICAgICAgICByZXR1cm4gbmlsOworCisgICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZvRmlsZSwg
JmZpbGVSZWYpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7
CisjZW5kaWYKKworICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKKyAgICBzdGF0
dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9NQVgpOwor
ICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCisgICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5n
V2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKKworICAgIHJldHVy
biBuaWw7Cit9CisjZW5kaWYgLy8gX19MUDY0X18KKyNlbmRpZiAvLyAhRVJST1JfRElTQUJMRUQK
Kwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyNpZmRlZiBCVUlMRElO
R19PTl9USUdFUgorICAgIG1fc3R5bGVHcm91cCA9IDA7CisjZW5kaWYKKyNpZiBVU0UoQVRTVUkp
CisgICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9
IGZhbHNlOworICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7CisjZW5kaWYKKworICAgIG1fc3lu
dGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/IDEuMGYg
OiAwLmY7CisKKyAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7CisgICAgaWYgKCFpbml0Rm9u
dERhdGEodGhpcykpIHsKKyAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQgaGFwcGVu
ZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCisgICAgICAgIC8vIFRyeSBsb29raW5nIGZvciBhbiBh
bHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCisKKyAgICAgICAgLy8gU3Bl
Y2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9mICJUaW1l
cyIuCisgICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBmYW1pbHkg
bmFtZSBpcyAiVGltZXMiLgorICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1hbCAiVGlt
ZXMiIGZhbWlseSBmb250LgorICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2ZSBhIGNv
cnJ1cHQgcmVndWxhciB2YXJpYW50LgorICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tGb250RmFt
aWx5OworICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0gaXNF
cXVhbDpAIlRpbWVzIl0pCisgICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBAIlRpbWVz
IE5ldyBSb21hbiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhbGxiYWNrRm9udEZhbWls
eSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOworICAgICAgICAKKyAgICAgICAgLy8gVHJ5IHNl
dHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgorICAgICAgICAvLyBUaGlzIGlzIGEgbGFzdCBk
aXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5nIGhhcyBn
b25lIHdyb25nLgorI2lmICFFUlJPUl9ESVNBQkxFRAorICAgICAgICBSZXRhaW5QdHI8TlNGb250
PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKKyNlbmRpZgorICAgICAgICBp
ZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0
Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250Om1fcGxh
dGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZvbnRXaXRo
TmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCldKTsKKyNp
ZiAhRVJST1JfRElTQUJMRUQKKyAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0aEZyb21G
b250KGluaXRpYWxGb250LmdldCgpKTsKKyAgICAgICAgaWYgKCFmaWxlUGF0aCkKKyAgICAgICAg
ICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOworI2VuZGlmCisgICAgICAgIGlmICghaW5pdEZv
bnREYXRhKHRoaXMpKSB7CisgICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWlseSBpc0Vx
dWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKKyAgICAgICAgICAgICAgICAvLyBPSywgY291bGRu
J3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywgZmFsbGJh
Y2sKKyAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlzIGZhaWxz
IHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KKyAgICAgICAgICAgICAgICBtX3BsYXRmb3Jt
RGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29udmVydEZv
bnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZhbWlseSgp
XSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFuZCB0aGUg
c3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgorICAgICAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIs
IGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWxl
ZFNldHVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQgdGhlIHN5
c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGluaXRp
YWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgZmFpbGVkU2V0dXAgPSB0
cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoZSBw
cm9ibGVtLgorICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwgdXNpbmcg
JUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKKyAgICAgICAgICAgIFttX3Bs
YXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBmYW1pbHlO
YW1lXSwgZmlsZVBhdGgpOworICAgIH0KKworICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB0cnkg
dG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KKyAgICAvLyBUaGlzIGlzIHByb2JhYmx5
IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWlsYWJsZS4K
KyAgICBpZiAoZmFpbGVkU2V0dXApIHsKKyAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChb
TlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2ludFNpemVd
XSk7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2luZyBzeXN0
ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7CisgICAgICAgIGluaXRGb250RGF0
YSh0aGlzKTsKKyAgICB9CisgICAgCisgICAgaW50IGlBc2NlbnQ7CisgICAgaW50IGlEZXNjZW50
OworICAgIGludCBpTGluZUdhcDsKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIHdrR2V0
Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURlc2NlbnQs
ICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7CisjZWxzZQorICAgIGlBc2NlbnQgPSBDR0ZvbnRH
ZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOworICAgIGlEZXNjZW50ID0gQ0dGb250
R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7CisgICAgaUxpbmVHYXAgPSBDR0Zv
bnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyAgICBtX3VuaXRzUGVyRW0g
PSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyNlbmRpZgor
CisgICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIGZsb2F0
IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRT
aXplOworICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3Vu
aXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5p
dHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICAvLyBXZSBuZWVk
IHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNo
IHRoZQorICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJw
YXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KKyAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBL
aXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKKyAgICAvLyBpbmNvcnJlY3Rs
eSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3Rl
YWQKKyAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCisgICAgTlNTdHJpbmcgKmZhbWls
eU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOworICAgIGlmIChbZmFt
aWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxU
b1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmluZzpAIkNv
dXJpZXIiXSkKKyAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQp
ICogMC4xNWYpICsgMC41Zik7CisgICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3Ry
aW5nOkAiR2VlemEgUHJvIl0pIHsKKyAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlwaHMgdGhh
dCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBkZXNjZW50
LiBBZGp1c3QKKyAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0ZXIgbWF0
Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25lIGxpbmUK
KyAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9mIHRoZSBu
ZXh0IGxpbmUuCisgICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7CisgICAgICAgIGZEZXNjZW50ICo9
IDIuZjsKKyAgICB9CisKKyAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7CisgICAgbV9k
ZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7CisgICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGlu
ZUdhcCk7CisgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5l
R2FwOworICAgIAorICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFsbG93IHJv
b20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCisgICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzUz
ODYxODM+CisgICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYgW2ZhbWls
eU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgeworICAgICAgICBtX2xpbmVHYXAgLT0gMyAt
IG1fZGVzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gMzsKKyAgICB9CisgICAgCisgICAgLy8g
TWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNp
emVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KKyAgICAv
LyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24n
dCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgorICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVy
byA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKKyAg
ICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7CisgICAgaWYgKHhHbHlwaCkgeworICAgICAg
ICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0Rm9yR2x5
cGg6eEdseXBoXTsKKyAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBv
ciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQorICAgICAgICAvLyBhbmQgd2Vi
IHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBs
YWlkIG91dAorICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdo
dC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAorICAgICAgICAvLyB3aGljaCBoYXMg
YW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KKyAgICAgICAgbV94SGVpZ2h0ID0gbWF4KE5TTWF4
WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV94SGVpZ2h0ID0g
W21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKK30KKyAgICAKK3N0YXRpYyBDRkRhdGFS
ZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0YSwgRm91
ckNoYXJDb2RlIHRhYmxlTmFtZSkKK3sKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIEFU
U0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3JtRGF0YS5t
X2F0c3VGb250SUQpOworCisgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICBpZiAoQVRTRm9u
dEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6ZSkgIT0g
bm9FcnIpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGTXV0YWJsZURhdGFSZWYgZGF0
YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVTaXplKTsK
KyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGRGF0YUluY3Jl
YXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7CisgICAgaWYgKEFUU0ZvbnRHZXRUYWJsZShhdHNG
b250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIoZGF0
YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7CisgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBkYXRhOworI2Vsc2UKKyAg
ICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgdGFi
bGVOYW1lKTsKKyNlbmRpZgorfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUNoYXJX
aWR0aEluaXQoKQoreworICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKKyAgICBtX21heENoYXJXaWR0
aCA9IDA7CisgICAgCisgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRvcHRDRiwg
Y29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7CisgICAgaWYgKG9z
MlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgeworICAgICAg
ICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQoKSk7Cisg
ICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJbM107Cisg
ICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldpZHRoLCBt
X3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIFJldGFp
blB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9yVGFnKG1f
cGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKKyAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0YUdldExl
bmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7CisgICAgICAgIGNvbnN0IFVJbnQ4KiBoZWFk
ID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOworICAgICAgICB1c2hvcnQgdXhN
aW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOworICAgICAgICB1c2hvcnQgdXhNYXggPSBo
ZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOworICAgICAgICBTSW50MTYgeE1pbiA9IHN0YXRpY19j
YXN0PFNJbnQxNj4odXhNaW4pOworICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19jYXN0PFNJ
bnQxNj4odXhNYXgpOworICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHhN
YXggLSB4TWluKTsKKyAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0cyhkaWZm
LCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIC8v
IEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwgcG9wdWxh
dGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KKyAgICBpbml0Q2hhcldp
ZHRocygpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQorewor
I2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgaWYgKG1fc3R5bGVHcm91cCkKKyAgICAgICAg
d2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOworI2VuZGlmCisjaWYgVVNFKEFUU1VJ
KQorICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9IG1fQVRT
VVN0eWxlTWFwLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0eWxlPjo6
aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisg
ICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7CisjZW5kaWYKK30KKworU2ltcGxl
Rm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVz
Y3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBz
Rm9udERhdGEpIHsKKyAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsKKyAgICAg
ICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6
ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKKyAgICAgICAgICAgIG1fc21hbGxDYXBz
Rm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZh
bHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhD
RVBUSU9OUzsKKyAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgp
IHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRN
YW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNpemVdKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlwZSBpbmZv
cm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRvIGEgZGlm
ZmVyZW50IHNpemUuCisgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZm9udCB0
aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgorICAgICAgICAgICAgc21hbGxDYXBzRm9udC5zZXRGb250
KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQuZm9udCgp
IHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7CisKKyAg
ICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgeworICAgICAgICAgICAgICAgIE5T
Rm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFn
ZXJdOworICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0gW2ZvbnRN
YW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOworCisgICAgICAgICAg
ICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKKyAgICAgICAgICAgICAg
ICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKKyAgICAgICAgICAgICAgICBpZiAo
bV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQorICAgICAgICAgICAgICAgICAgICBm
b250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7CisKKyAgICAgICAgICAgICAgICBOU0ZvbnRU
cmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6
c21hbGxDYXBzRm9udC5mb250KCldOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnQubV9z
eW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShzbWFsbENh
cHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fw
c0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNr
KSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKKworICAgICAg
ICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9u
dERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRU5EX0JM
T0NLX09CSkNfRVhDRVBUSU9OUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFs
bENhcHNGb250RGF0YTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0
ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIE5T
U3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcnNOb0Nv
cHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBmcmVlV2hl
bkRvbmU6Tk9dOworICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1EYXRhLmZv
bnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07CisgICAgYm9vbCByZXN1bHQg
PSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0aW9uID09
IE5TTm90Rm91bmQ7CisgICAgW3N0cmluZyByZWxlYXNlXTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgTlNGb250
KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOworICAgIC8vIFNwZWNpYWwgY2FzZSBPc2FrYS1N
b25vLgorICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIHNo
b3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCB0
aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorCisg
ICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCisgICAgLy8gQWNjb3JkaW5nIHRvIDxyZGFy
Oi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGljIGFzIGZp
eGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMtUEdvdGhp
YyBhcyBmaXhlZCBwaXRjaC4KKworICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNvcnNpdmEK
KyAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBzaG91bGQg
bm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKyAgICAvLyBOb3RlIHRo
YXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKwor
ICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOworICAgIG1fdHJlYXRBc0ZpeGVkUGl0
Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwKKyAgICAg
ICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9PSBOU09y
ZGVyZWRTYW1lKSAmJgorICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOkAi
TVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKKyAgICAgICAgICAgW25hbWUgY2FzZUlu
c2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNhbWU7Cit9
CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlw
aCBnbHlwaCkgY29uc3QKK3sKKyAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7CisjaWZuZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQ0dSZWN0IGJveDsKKyAgICBDR0ZvbnRHZXRHbHlwaEJCb3hl
cyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKKyAgICBmbG9hdCBw
b2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7CisgICAgQ0dGbG9hdCBzY2FsZSA9IHBv
aW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKKyAgICBib3VuZGluZ0JveCA9IENHUmVjdEFwcGx5QWZm
aW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUsIC1zY2Fs
ZSkpOworICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCisgICAgICAgIGJvdW5kaW5nQm94
LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQpOwor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOworI2VuZGlmCisgICAgcmV0dXJuIGJvdW5k
aW5nQm94OworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBo
KEdseXBoIGdseXBoKSBjb25zdAoreworICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3JtRGF0YSgp
LmZvbnQoKTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Cisg
ICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50
U2l6ZSwgcG9pbnRTaXplKTsKKyAgICBDR1NpemUgYWR2YW5jZTsKKyAgICBpZiAoIXdrR2V0R2x5
cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250LCAmbSwg
JmdseXBoLCAmYWR2YW5jZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY2FjaGUg
Z2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRTaXplKTsK
KyAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7CisgICAgfQorICAgIHJldHVybiBhZHZhbmNlLndp
ZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCisjaWYgVVNFKEFUU1VJKQordm9pZCBT
aW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAoreworICAgIEFTU0VSVCgh
bV9jaGVja2VkU2hhcGVzQXJhYmljKTsKKworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9IHRy
dWU7CisgICAgCisgICAgQVRTVUZvbnRJRCBmb250SUQgPSBtX3BsYXRmb3JtRGF0YS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SUQpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8g
Z2V0IEFUU1VGb250SUQgZm9yICVAIiwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb24g
Zm9udHMgdGhhdCBjb250YWluIEFyYWJpYyBnbHlwaHMuIE91cgorICAgIC8vIGhldXJpc3RpYyBp
cyB0aGF0IGlmIHN1Y2ggYSBmb250IGhhcyBhIGdseXBoIG1ldGFtb3JwaG9zaXMgdGFibGUsIHRo
ZW4KKyAgICAvLyBpdCBpbmNsdWRlcyBzaGFwaW5nIGluZm9ybWF0aW9uIGZvciBBcmFiaWMuCisg
ICAgRm91ckNoYXJDb2RlIHRhYmxlc1tdID0geyAnbW9yeCcsICdtb3J0JyB9OworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGVzKSAvIHNpemVvZih0YWJsZXNbMF0pOyAr
K2kpIHsKKyAgICAgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICAgICAgT1NTdGF0dXMgc3Rh
dHVzID0gQVRTRm9udEdldFRhYmxlKGZvbnRJRCwgdGFibGVzW2ldLCAwLCAwLCAwLCAmdGFibGVT
aXplKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgeworICAgICAgICAgICAgbV9zaGFw
ZXNBcmFiaWMgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKHN0YXR1cyAhPSBrQVRTSW52YWxpZEZvbnRUYWJsZUFjY2VzcykKKyAgICAgICAgICAg
IExPR19FUlJPUigiQVRTRm9udEdldFRhYmxlIGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICB9
Cit9CisjZW5kaWYKKworI2lmIFVTRShDT1JFX1RFWFQpCitDVEZvbnRSZWYgU2ltcGxlRm9udERh
dGE6OmdldENURm9udCgpIGNvbnN0Cit7CisgICAgaWYgKGdldE5TRm9udCgpKQorICAgICAgICBy
ZXR1cm4gdG9DVEZvbnRSZWYoZ2V0TlNGb250KCkpOworICAgIGlmICghbV9DVEZvbnQpCisgICAg
ICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNzRm9udChtX3BsYXRm
b3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cisg
ICAgcmV0dXJuIG1fQ1RGb250LmdldCgpOworfQorCitDRkRpY3Rpb25hcnlSZWYgU2ltcGxlRm9u
dERhdGE6OmdldENGU3RyaW5nQXR0cmlidXRlcyhUeXBlc2V0dGluZ0ZlYXR1cmVzIHR5cGVzZXR0
aW5nRmVhdHVyZXMpIGNvbnN0Cit7CisgICAgdW5zaWduZWQga2V5ID0gdHlwZXNldHRpbmdGZWF0
dXJlcyArIDE7CisgICAgcGFpcjxIYXNoTWFwPHVuc2lnbmVkLCBSZXRhaW5QdHI8Q0ZEaWN0aW9u
YXJ5UmVmPiA+OjppdGVyYXRvciwgYm9vbD4gYWRkUmVzdWx0ID0gbV9DRlN0cmluZ0F0dHJpYnV0
ZXMuYWRkKGtleSwgUmV0YWluUHRyPENGRGljdGlvbmFyeVJlZj4oKSk7CisgICAgUmV0YWluUHRy
PENGRGljdGlvbmFyeVJlZj4mIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5ID0gYWRkUmVzdWx0LmZpcnN0
LT5zZWNvbmQ7CisgICAgaWYgKCFhZGRSZXN1bHQuc2Vjb25kKQorICAgICAgICByZXR1cm4gYXR0
cmlidXRlc0RpY3Rpb25hcnkuZ2V0KCk7CisKKyAgICBib29sIGFsbG93TGlnYXR1cmVzID0gcGxh
dGZvcm1EYXRhKCkuYWxsb3dzTGlnYXR1cmVzKCkgfHwgKHR5cGVzZXR0aW5nRmVhdHVyZXMgJiBM
aWdhdHVyZXMpOworCisgICAgc3RhdGljIGNvbnN0IGludCBsaWdhdHVyZXNOb3RBbGxvd2VkVmFs
dWUgPSAwOworICAgIHN0YXRpYyBDRk51bWJlclJlZiBsaWdhdHVyZXNOb3RBbGxvd2VkID0gQ0ZO
dW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVySW50VHlwZSwgJmxpZ2F0
dXJlc05vdEFsbG93ZWRWYWx1ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc0Fs
bG93ZWRWYWx1ZSA9IDE7CisgICAgc3RhdGljIENGTnVtYmVyUmVmIGxpZ2F0dXJlc0FsbG93ZWQg
PSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAm
bGlnYXR1cmVzQWxsb3dlZFZhbHVlKTsKKworICAgIGlmICghKHR5cGVzZXR0aW5nRmVhdHVyZXMg
JiBLZXJuaW5nKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga2VybmluZ0FkanVzdG1l
bnRWYWx1ZSA9IDA7CisgICAgICAgIHN0YXRpYyBDRk51bWJlclJlZiBrZXJuaW5nQWRqdXN0bWVu
dCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckZsb2F0VHlw
ZSwgJmtlcm5pbmdBZGp1c3RtZW50VmFsdWUpOworICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCog
a2V5c1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsga0NURm9udEF0dHJpYnV0ZU5hbWUsIGtDVEtl
cm5BdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsKKyAgICAgICAgY29u
c3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZFtdID0geyBnZXRDVEZvbnQoKSwga2Vy
bmluZ0FkanVzdG1lbnQsIGFsbG93TGlnYXR1cmVzCisgICAgICAgICAgICA/IGxpZ2F0dXJlc0Fs
bG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07CisgICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9u
YXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0Rpc2Fi
bGVkLCB2YWx1ZXNXaXRoS2VybmluZ0Rpc2FibGVkLAorICAgICAgICAgICAgc2l6ZW9mKGtleXNX
aXRoS2VybmluZ0Rpc2FibGVkKSAvIHNpemVvZigqa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQpLAor
ICAgICAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlw
ZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEJ5
IG9taXR0aW5nIHRoZSBrQ1RLZXJuQXR0cmlidXRlTmFtZSBhdHRyaWJ1dGUsIHdlIGdldCBDb3Jl
IFRleHQncyBzdGFuZGFyZCBrZXJuaW5nLgorICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCoga2V5
c1dpdGhLZXJuaW5nRW5hYmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUTGlnYXR1
cmVBdHRyaWJ1dGVOYW1lIH07CisgICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5n
RW5hYmxlZFtdID0geyBnZXRDVEZvbnQoKSwgYWxsb3dMaWdhdHVyZXMgPyBsaWdhdHVyZXNBbGxv
d2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OworICAgICAgICBhdHRyaWJ1dGVzRGljdGlvbmFy
eS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShOVUxMLCBrZXlzV2l0aEtlcm5pbmdFbmFibGVk
LCB2YWx1ZXNXaXRoS2VybmluZ0VuYWJsZWQsCisgICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhL
ZXJuaW5nRW5hYmxlZCkgLyBzaXplb2YoKmtleXNXaXRoS2VybmluZ0VuYWJsZWQpLAorICAgICAg
ICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlwZURpY3Rp
b25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0KKworICAgIHJldHVybiBhdHRyaWJ1dGVzRGlj
dGlvbmFyeS5nZXQoKTsKK30KKworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnRE
YXRhQVRTVUkuY3BwCShyZXZpc2lvbiA1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw0MTMg
KzMwLDE1IEBACiAjaW1wb3J0ICJjb25maWcuaCIKICNpbXBvcnQgIlNpbXBsZUZvbnREYXRhLmgi
CiAKLSNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgotI2ltcG9ydCAiQ29sb3IuaCIKLSNpbXBv
cnQgIkZsb2F0UmVjdC5oIgogI2ltcG9ydCAiRm9udC5oIgogI2ltcG9ydCAiRm9udENhY2hlLmgi
CiAjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKLSNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5oIgot
I2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgotI2ltcG9ydCA8QXBwS2l0L0FwcEtp
dC5oPgogI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+
Ci0jaW1wb3J0IDxmbG9hdC5oPgotI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgogI2ltcG9ydCA8
d3RmL0Fzc2VydGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KLSNpbXBvcnQg
PHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgotCi1AaW50ZXJm
YWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQotLSAoQk9PTClfaXNGYWtlRml4ZWRQaXRj
aDsKLUBlbmQKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdlYkNvcmUgewot
ICAKLWNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Ci1zdGF0
aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRzUGVy
RW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9Ci0KLXN0YXRpYyBib29sIGluaXRGb250RGF0
YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCi17Ci0gICAgaWYgKCFmb250RGF0YS0+cGxhdGZv
cm1EYXRhKCkuY2dGb250KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotI2lmZGVmIEJVSUxE
SU5HX09OX1RJR0VSCi0gICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKLSAgICBpZiAoQVRTVUNyZWF0
ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAg
ICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5tX2F0c3VGb250
SUQ7Ci0gICAgaWYgKCFmb250SWQpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5
bGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQVRTVUF0dHJpYnV0ZVRh
ZyB0YWcgPSBrQVRTVUZvbnRUYWc7Ci0gICAgQnl0ZUNvdW50IHNpemUgPSBzaXplb2YoQVRTVUZv
bnRJRCk7Ci0gICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElkfTsKLSAgICBP
U1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEsICZ0YWcsICZz
aXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIp
IHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOwotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250U3R5bGUsICZm
b250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgewotICAgICAgICBBVFNVRGlzcG9zZVN0
eWxlKGZvbnRTdHlsZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBBVFNV
RGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiB0cnVlOwotfQot
Ci1zdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQotewotICAgIERF
RklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJhY2tGb250RmFt
aWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFtZV0pKTsKLSAg
ICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOwotfQotCi0jaWYgIUVSUk9SX0RJ
U0FCTEVECi0jaWZkZWYgX19MUDY0X18KLXN0YXRpYyBOU1N0cmluZyogcGF0aEZyb21Gb250KE5T
Rm9udCopCi17Ci0gICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90IGF2YWlsYWJs
ZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2luZwot
ICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCi0gICAgcmV0dXJu
IG5pbDsKLX0KLSNlbHNlCi1zdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChOU0ZvbnQgKmZv
bnQpCi17Ci0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTRm9udFJlZiBhdHNGb250
ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250KHRvQ1RGb250
UmVmKGZvbnQpLCAwKSk7Ci0jZWxzZQotICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRT
Rm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7Ci0jZW5kaWYKLSAg
ICBGU1JlZiBmaWxlUmVmOwotCi0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgT1NTdGF0
dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZpbGVSZWYpOwot
ICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBuaWw7Ci0jZWxzZQotICAg
IEZTU3BlYyBvRmlsZTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0RmlsZVNwZWNp
ZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKLSAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQotICAg
ICAgICByZXR1cm4gbmlsOwotCi0gICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZvRmlsZSwgJmZp
bGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBuaWw7Ci0j
ZW5kaWYKLQotICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKLSAgICBzdGF0dXMg
PSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9NQVgpOwotICAg
IGlmIChzdGF0dXMgPT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0
aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKLQotICAgIHJldHVybiBu
aWw7Ci19Ci0jZW5kaWYgLy8gX19MUDY0X18KLSNlbmRpZiAvLyAhRVJST1JfRElTQUJMRUQKLQot
dm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsKLSNpZmRlZiBCVUlMRElOR19P
Tl9USUdFUgotICAgIG1fc3R5bGVHcm91cCA9IDA7Ci0jZW5kaWYKLSNpZiBVU0UoQVRTVUkpCi0g
ICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOwotICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9IGZh
bHNlOwotICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7Ci0jZW5kaWYKLQotICAgIG1fc3ludGhl
dGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/IDEuMGYgOiAw
LmY7Ci0KLSAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7Ci0gICAgaWYgKCFpbml0Rm9udERh
dGEodGhpcykpIHsKLSAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQgaGFwcGVuZWQs
IGxpa2UgYSBjb3JydXB0IGZvbnQuCi0gICAgICAgIC8vIFRyeSBsb29raW5nIGZvciBhbiBhbHRl
cm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCi0KLSAgICAgICAgLy8gU3BlY2lh
bCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9mICJUaW1lcyIu
Ci0gICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBmYW1pbHkgbmFt
ZSBpcyAiVGltZXMiLgotICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1hbCAiVGltZXMi
IGZhbWlseSBmb250LgotICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2ZSBhIGNvcnJ1
cHQgcmVndWxhciB2YXJpYW50LgotICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tGb250RmFtaWx5
OwotICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0gaXNFcXVh
bDpAIlRpbWVzIl0pCi0gICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBAIlRpbWVzIE5l
dyBSb21hbiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZhbGxiYWNrRm9udEZhbWlseSA9
IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOwotICAgICAgICAKLSAgICAgICAgLy8gVHJ5IHNldHRp
bmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgotICAgICAgICAvLyBUaGlzIGlzIGEgbGFzdCBkaXRj
aCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5nIGhhcyBnb25l
IHdyb25nLgotI2lmICFFUlJPUl9ESVNBQkxFRAotICAgICAgICBSZXRhaW5QdHI8TlNGb250PiBp
bml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKLSNlbmRpZgotICAgICAgICBpZiAo
bV9wbGF0Zm9ybURhdGEuZm9udCgpKQotICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9u
dChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250Om1fcGxhdGZv
cm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKLSAgICAgICAgZWxz
ZQotICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZvbnRXaXRoTmFt
ZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCldKTsKLSNpZiAh
RVJST1JfRElTQUJMRUQKLSAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0aEZyb21Gb250
KGluaXRpYWxGb250LmdldCgpKTsKLSAgICAgICAgaWYgKCFmaWxlUGF0aCkKLSAgICAgICAgICAg
IGZpbGVQYXRoID0gQCJub3Qga25vd24iOwotI2VuZGlmCi0gICAgICAgIGlmICghaW5pdEZvbnRE
YXRhKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWlseSBpc0VxdWFs
OkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKLSAgICAgICAgICAgICAgICAvLyBPSywgY291bGRuJ3Qg
c2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywgZmFsbGJhY2sK
LSAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlzIGZhaWxzIHdl
IGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KLSAgICAgICAgICAgICAgICBtX3BsYXRmb3JtRGF0
YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29udmVydEZvbnQ6
bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZhbWlseSgpXSk7
Ci0gICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKLSAgICAgICAgICAg
ICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFuZCB0aGUgc3lz
dGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgotICAgICAgICAgICAgICAgICAg
ICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGlu
aXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGZhaWxlZFNl
dHVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAg
ICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQgdGhlIHN5c3Rl
bSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KLSAgICAgICAgICAgICAgICBMT0df
RVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGluaXRpYWxG
b250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgZmFpbGVkU2V0dXAgPSB0cnVl
OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVwb3J0IHRoZSBwcm9i
bGVtLgotICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwgdXNpbmcgJUAg
aW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKLSAgICAgICAgICAgIFttX3BsYXRm
b3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBmYW1pbHlOYW1l
XSwgZmlsZVBhdGgpOwotICAgIH0KLQotICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB0cnkgdG8g
c2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KLSAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGJl
Y2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWlsYWJsZS4KLSAg
ICBpZiAoZmFpbGVkU2V0dXApIHsKLSAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNG
b250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2ludFNpemVdXSk7
Ci0gICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2luZyBzeXN0ZW0g
Zm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7Ci0gICAgICAgIGluaXRGb250RGF0YSh0
aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IGlBc2NlbnQ7Ci0gICAgaW50IGlEZXNjZW50Owot
ICAgIGludCBpTGluZUdhcDsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgotICAgIHdrR2V0Rm9u
dE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURlc2NlbnQsICZp
TGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7Ci0jZWxzZQotICAgIGlBc2NlbnQgPSBDR0ZvbnRHZXRB
c2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOwotICAgIGlEZXNjZW50ID0gQ0dGb250R2V0
RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7Ci0gICAgaUxpbmVHYXAgPSBDR0ZvbnRH
ZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSAgICBtX3VuaXRzUGVyRW0gPSBD
R0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSNlbmRpZgotCi0g
ICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIGZsb2F0IGZB
c2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXpl
OwotICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3VuaXRz
UGVyRW0pICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5pdHMo
aUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0KLSAgICAvLyBXZSBuZWVkIHRv
IGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNoIHRo
ZQotICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJwYXJ0
cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KLSAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBLaXQg
YWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKLSAgICAvLyBpbmNvcnJlY3RseSBh
ZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3RlYWQK
LSAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAgTlNTdHJpbmcgKmZhbWlseU5h
bWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOwotICAgIGlmIChbZmFtaWx5
TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0
cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmluZzpAIkNvdXJp
ZXIiXSkKLSAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQpICog
MC4xNWYpICsgMC41Zik7Ci0gICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3RyaW5n
OkAiR2VlemEgUHJvIl0pIHsKLSAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlwaHMgdGhhdCBk
cmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBkZXNjZW50LiBB
ZGp1c3QKLSAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0ZXIgbWF0Y2gg
cmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25lIGxpbmUKLSAg
ICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9mIHRoZSBuZXh0
IGxpbmUuCi0gICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7Ci0gICAgICAgIGZEZXNjZW50ICo9IDIu
ZjsKLSAgICB9Ci0KLSAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7Ci0gICAgbV9kZXNj
ZW50ID0gbHJvdW5kZihmRGVzY2VudCk7Ci0gICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGluZUdh
cCk7Ci0gICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5lR2Fw
OwotICAgIAotICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFsbG93IHJvb20g
Zm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCi0gICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzUzODYx
ODM+Ci0gICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYgW2ZhbWlseU5h
bWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgewotICAgICAgICBtX2xpbmVHYXAgLT0gMyAtIG1f
ZGVzY2VudDsKLSAgICAgICAgbV9kZXNjZW50ID0gMzsKLSAgICB9Ci0gICAgCi0gICAgLy8gTWVh
c3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNpemVz
IFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KLSAgICAvLyBV
bmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24ndCBx
dWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgotICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVybyA9
IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKLSAgICBO
U0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERhdGFG
b3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAgaWYgKHhHbHlwaCkgewotICAgICAgICBO
U1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0Rm9yR2x5cGg6
eEdseXBoXTsKLSAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBvciBo
ZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQotICAgICAgICAvLyBhbmQgd2ViIHBh
Z2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBsYWlk
IG91dAotICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdodC4g
Q2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAotICAgICAgICAvLyB3aGljaCBoYXMgYW4g
IngiIHRoYXQgaXMgN3g2IHBpeGVscy4KLSAgICAgICAgbV94SGVpZ2h0ID0gbWF4KE5TTWF4WCh4
Qm94KSwgTlNNYXhZKHhCb3gpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV94SGVpZ2h0ID0gW21f
cGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKLX0KLSAgICAKLXN0YXRpYyBDRkRhdGFSZWYg
Y29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0YSwgRm91ckNo
YXJDb2RlIHRhYmxlTmFtZSkKLXsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgotICAgIEFUU0Zv
bnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3JtRGF0YS5tX2F0
c3VGb250SUQpOwotCi0gICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKLSAgICBpZiAoQVRTRm9udEdl
dFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6ZSkgIT0gbm9F
cnIpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGTXV0YWJsZURhdGFSZWYgZGF0YSA9
IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVTaXplKTsKLSAg
ICBpZiAoIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGRGF0YUluY3JlYXNl
TGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7Ci0gICAgaWYgKEFUU0ZvbnRHZXRUYWJsZShhdHNGb250
LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIoZGF0YSks
ICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7Ci0gICAgICAgIENGUmVsZWFzZShkYXRhKTsKLSAgICAg
ICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBkYXRhOwotI2Vsc2UKLSAgICBy
ZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgdGFibGVO
YW1lKTsKLSNlbmRpZgotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUNoYXJXaWR0
aEluaXQoKQotewotICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKLSAgICBtX21heENoYXJXaWR0aCA9
IDA7Ci0gICAgCi0gICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRvcHRDRiwgY29w
eUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7Ci0gICAgaWYgKG9zMlRh
YmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgewotICAgICAgICBj
b25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQoKSk7Ci0gICAg
ICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJbM107Ci0gICAg
ICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldpZHRoLCBtX3Vu
aXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQotICAgIFJldGFpblB0
cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9yVGFnKG1fcGxh
dGZvcm1EYXRhLCAnaGVhZCcpKTsKLSAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0YUdldExlbmd0
aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7Ci0gICAgICAgIGNvbnN0IFVJbnQ4KiBoZWFkID0g
Q0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOwotICAgICAgICB1c2hvcnQgdXhNaW4g
PSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOwotICAgICAgICB1c2hvcnQgdXhNYXggPSBoZWFk
WzQwXSAqIDI1NiArIGhlYWRbNDFdOwotICAgICAgICBTSW50MTYgeE1pbiA9IHN0YXRpY19jYXN0
PFNJbnQxNj4odXhNaW4pOwotICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19jYXN0PFNJbnQx
Nj4odXhNYXgpOwotICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHhNYXgg
LSB4TWluKTsKLSAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0cyhkaWZmLCBt
X3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQotICAgIC8vIEZh
bGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwgcG9wdWxhdGUg
dGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KLSAgICBpbml0Q2hhcldpZHRo
cygpOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQotewotI2lm
ZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgaWYgKG1fc3R5bGVHcm91cCkKLSAgICAgICAgd2tS
ZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOwotI2VuZGlmCi0jaWYgVVNFKEFUU1VJKQot
ICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9IG1fQVRTVVN0
eWxlTWFwLmVuZCgpOwotICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0eWxlPjo6aXRl
cmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCi0gICAg
ICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7Ci0jZW5kaWYKLX0KLQotU2ltcGxlRm9u
dERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVzY3Jp
cHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBpZiAoIW1fc21hbGxDYXBzRm9u
dERhdGEpIHsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7Ci0gICAgICAgICAgICBGb250
UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsKLSAgICAgICAg
ICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSAq
IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKLSAgICAgICAgICAgIG1fc21hbGxDYXBzRm9u
dERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZhbHNl
KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhDRVBU
SU9OUzsKLSAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIHBv
aW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7Ci0gICAgICAgICAgICBGb250
UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5h
Z2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNpemVdKTsKLSAg
ICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlwZSBpbmZvcm1h
dGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRvIGEgZGlmZmVy
ZW50IHNpemUuCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZm9udCB0aGF0
IHdlJ3JlIGhhbmRlZCBiYWNrLgotICAgICAgICAgICAgc21hbGxDYXBzRm9udC5zZXRGb250KGZv
bnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQuZm9udCgpIHBy
aW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7Ci0KLSAgICAg
ICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgewotICAgICAgICAgICAgICAgIE5TRm9u
dE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJd
OwotICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0gW2ZvbnRNYW5h
Z2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOwotCi0gICAgICAgICAgICAg
ICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKLSAgICAgICAgICAgICAgICAg
ICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKLSAgICAgICAgICAgICAgICBpZiAobV9w
bGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQotICAgICAgICAgICAgICAgICAgICBmb250
VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7Ci0KLSAgICAgICAgICAgICAgICBOU0ZvbnRUcmFp
dE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6c21h
bGxDYXBzRm9udC5mb250KCldOwotICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnQubV9zeW50
aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShzbWFsbENhcHNG
b250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOwotICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0Zv
bnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKSAm
JiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKLQotICAgICAgICAg
ICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9udERh
dGEoJnNtYWxsQ2Fwc0ZvbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRU5EX0JMT0NL
X09CSkNfRVhDRVBUSU9OUzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbV9zbWFsbENh
cHNGb250RGF0YTsKLX0KLQotYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0ZXJz
KGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAotewotICAgIE5TU3Ry
aW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcnNOb0NvcHk6
Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBmcmVlV2hlbkRv
bmU6Tk9dOwotICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1EYXRhLmZvbnQo
KSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07Ci0gICAgYm9vbCByZXN1bHQgPSBz
ZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0aW9uID09IE5T
Tm90Rm91bmQ7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQot
Ci12b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCi17Ci0gICAgTlNGb250KiBm
ID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOwotICAgIC8vIFNwZWNpYWwgY2FzZSBPc2FrYS1Nb25v
LgotICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIHNob3Vs
ZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5vdGUgdGhhdCB0aGUg
QXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgotCi0gICAg
Ly8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCi0gICAgLy8gQWNjb3JkaW5nIHRvIDxyZGFyOi8v
cHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGljIGFzIGZpeGVk
IHBpdGNoLgotICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMtUEdvdGhpYyBh
cyBmaXhlZCBwaXRjaC4KLQotICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNvcnNpdmEKLSAg
ICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBzaG91bGQgbm90
IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KLSAgICAvLyBOb3RlIHRoYXQg
QXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KLQotICAg
IE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOwotICAgIG1fdHJlYXRBc0ZpeGVkUGl0Y2gg
PSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwKLSAgICAgICAg
ICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9PSBOU09yZGVy
ZWRTYW1lKSAmJgotICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOkAiTVMt
UEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKLSAgICAgICAgICAgW25hbWUgY2FzZUluc2Vu
c2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNhbWU7Ci19Ci0K
LUZsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlwaCBn
bHlwaCkgY29uc3QKLXsKLSAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7Ci0jaWZuZGVmIEJVSUxE
SU5HX09OX1RJR0VSCi0gICAgQ0dSZWN0IGJveDsKLSAgICBDR0ZvbnRHZXRHbHlwaEJCb3hlcyhw
bGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKLSAgICBmbG9hdCBwb2lu
dFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Ci0gICAgQ0dGbG9hdCBzY2FsZSA9IHBvaW50
U2l6ZSAvIHVuaXRzUGVyRW0oKTsKLSAgICBib3VuZGluZ0JveCA9IENHUmVjdEFwcGx5QWZmaW5l
VHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUsIC1zY2FsZSkp
OwotICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCi0gICAgICAgIGJvdW5kaW5nQm94LnNl
dFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQpOwotI2Vs
c2UKLSAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOwotI2VuZGlmCi0gICAgcmV0dXJuIGJvdW5kaW5n
Qm94OwotfQotCi1mbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBoKEds
eXBoIGdseXBoKSBjb25zdAotewotICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3JtRGF0YSgpLmZv
bnQoKTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Ci0gICAg
Q0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50U2l6
ZSwgcG9pbnRTaXplKTsKLSAgICBDR1NpemUgYWR2YW5jZTsKLSAgICBpZiAoIXdrR2V0R2x5cGhU
cmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250LCAmbSwgJmds
eXBoLCAmYWR2YW5jZSkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY2FjaGUgZ2x5
cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRTaXplKTsKLSAg
ICAgICAgYWR2YW5jZS53aWR0aCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBhZHZhbmNlLndpZHRo
ICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQogCiAjaWYgVVNFKEFUU1VJKQogdm9pZCBTaW1w
bGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdApAQCAtNDY5LDUzICs3MSw0IEBA
IHZvaWQgU2ltcGxlRm9udERhdGE6OmNoZWNrU2hhcGVzQXJhYmljKCkKIH0KICNlbmRpZgogCi0j
aWYgVVNFKENPUkVfVEVYVCkKLUNURm9udFJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q1RGb250KCkg
Y29uc3QKLXsKLSAgICBpZiAoZ2V0TlNGb250KCkpCi0gICAgICAgIHJldHVybiB0b0NURm9udFJl
ZihnZXROU0ZvbnQoKSk7Ci0gICAgaWYgKCFtX0NURm9udCkKLSAgICAgICAgbV9DVEZvbnQuYWRv
cHRDRihDVEZvbnRDcmVhdGVXaXRoR3JhcGhpY3NGb250KG1fcGxhdGZvcm1EYXRhLmNnRm9udCgp
LCBtX3BsYXRmb3JtRGF0YS5zaXplKCksIE5VTEwsIE5VTEwpKTsKLSAgICByZXR1cm4gbV9DVEZv
bnQuZ2V0KCk7Ci19Ci0KLUNGRGljdGlvbmFyeVJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q0ZTdHJp
bmdBdHRyaWJ1dGVzKFR5cGVzZXR0aW5nRmVhdHVyZXMgdHlwZXNldHRpbmdGZWF0dXJlcykgY29u
c3QKLXsKLSAgICB1bnNpZ25lZCBrZXkgPSB0eXBlc2V0dGluZ0ZlYXR1cmVzICsgMTsKLSAgICBw
YWlyPEhhc2hNYXA8dW5zaWduZWQsIFJldGFpblB0cjxDRkRpY3Rpb25hcnlSZWY+ID46Oml0ZXJh
dG9yLCBib29sPiBhZGRSZXN1bHQgPSBtX0NGU3RyaW5nQXR0cmlidXRlcy5hZGQoa2V5LCBSZXRh
aW5QdHI8Q0ZEaWN0aW9uYXJ5UmVmPigpKTsKLSAgICBSZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5UmVm
PiYgYXR0cmlidXRlc0RpY3Rpb25hcnkgPSBhZGRSZXN1bHQuZmlyc3QtPnNlY29uZDsKLSAgICBp
ZiAoIWFkZFJlc3VsdC5zZWNvbmQpCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzRGljdGlvbmFy
eS5nZXQoKTsKLQotICAgIGJvb2wgYWxsb3dMaWdhdHVyZXMgPSBwbGF0Zm9ybURhdGEoKS5hbGxv
d3NMaWdhdHVyZXMoKSB8fCAodHlwZXNldHRpbmdGZWF0dXJlcyAmIExpZ2F0dXJlcyk7Ci0KLSAg
ICBzdGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc05vdEFsbG93ZWRWYWx1ZSA9IDA7Ci0gICAgc3Rh
dGljIENGTnVtYmVyUmVmIGxpZ2F0dXJlc05vdEFsbG93ZWQgPSBDRk51bWJlckNyZWF0ZShrQ0ZB
bGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAmbGlnYXR1cmVzTm90QWxsb3dlZFZh
bHVlKTsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQgbGlnYXR1cmVzQWxsb3dlZFZhbHVlID0gMTsK
LSAgICBzdGF0aWMgQ0ZOdW1iZXJSZWYgbGlnYXR1cmVzQWxsb3dlZCA9IENGTnVtYmVyQ3JlYXRl
KGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZsaWdhdHVyZXNBbGxvd2Vk
VmFsdWUpOwotCi0gICAgaWYgKCEodHlwZXNldHRpbmdGZWF0dXJlcyAmIEtlcm5pbmcpKSB7Ci0g
ICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrZXJuaW5nQWRqdXN0bWVudFZhbHVlID0gMDsKLSAg
ICAgICAgc3RhdGljIENGTnVtYmVyUmVmIGtlcm5pbmdBZGp1c3RtZW50ID0gQ0ZOdW1iZXJDcmVh
dGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyRmxvYXRUeXBlLCAma2VybmluZ0FkanVz
dG1lbnRWYWx1ZSk7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdE
aXNhYmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUS2VybkF0dHJpYnV0ZU5hbWUs
IGtDVExpZ2F0dXJlQXR0cmlidXRlTmFtZSB9OwotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZXNX
aXRoS2VybmluZ0Rpc2FibGVkW10gPSB7IGdldENURm9udCgpLCBrZXJuaW5nQWRqdXN0bWVudCwg
YWxsb3dMaWdhdHVyZXMKLSAgICAgICAgICAgID8gbGlnYXR1cmVzQWxsb3dlZCA6IGxpZ2F0dXJl
c05vdEFsbG93ZWQgfTsKLSAgICAgICAgYXR0cmlidXRlc0RpY3Rpb25hcnkuYWRvcHRDRihDRkRp
Y3Rpb25hcnlDcmVhdGUoTlVMTCwga2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQsIHZhbHVlc1dpdGhL
ZXJuaW5nRGlzYWJsZWQsCi0gICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhLZXJuaW5nRGlzYWJs
ZWQpIC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdEaXNhYmxlZCksCi0gICAgICAgICAgICAma0NG
Q29weVN0cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVl
Q2FsbEJhY2tzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQnkgb21pdHRpbmcgdGhlIGtD
VEtlcm5BdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSwgd2UgZ2V0IENvcmUgVGV4dCdzIHN0YW5kYXJk
IGtlcm5pbmcuCi0gICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdFbmFi
bGVkW10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUg
fTsKLSAgICAgICAgY29uc3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGdl
dENURm9udCgpLCBhbGxvd0xpZ2F0dXJlcyA/IGxpZ2F0dXJlc0FsbG93ZWQgOiBsaWdhdHVyZXNO
b3RBbGxvd2VkIH07Ci0gICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZEaWN0
aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0VuYWJsZWQsIHZhbHVlc1dpdGhLZXJu
aW5nRW5hYmxlZCwKLSAgICAgICAgICAgIHNpemVvZihrZXlzV2l0aEtlcm5pbmdFbmFibGVkKSAv
IHNpemVvZigqa2V5c1dpdGhLZXJuaW5nRW5hYmxlZCksCi0gICAgICAgICAgICAma0NGQ29weVN0
cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJh
Y2tzKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmdldCgpOwot
fQotCi0jZW5kaWYKLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFDb3JlVGV4dC5jcHAKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFDb3JlVGV4dC5j
cHAJKHJldmlzaW9uIDU4NTIwKQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9T
aW1wbGVGb250RGF0YU1hYy5tbTo1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQ
cm9za3VyeWFrb3YKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlNpbXBsZUZvbnREYXRh
LmgiCisKKyNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgorI2ltcG9ydCAiQ29sb3IuaCIKKyNp
bXBvcnQgIkZsb2F0UmVjdC5oIgorI2ltcG9ydCAiRm9udC5oIgorI2ltcG9ydCAiRm9udENhY2hl
LmgiCisjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKKyNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5o
IgorI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgorI2ltcG9ydCA8QXBwS2l0L0Fw
cEtpdC5oPgorI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2Vz
Lmg+CisjaW1wb3J0IDxmbG9hdC5oPgorI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgorI2ltcG9y
dCA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbXBv
cnQgPHd0Zi9SZXRhaW5QdHIuaD4KKyNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgorCitAaW50
ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQorLSAoQk9PTClfaXNGYWtlRml4ZWRQ
aXRjaDsKK0BlbmQKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworICAKK2NvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Citz
dGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRz
UGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9CisKK3N0YXRpYyBib29sIGluaXRGb250
RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCit7CisgICAgaWYgKCFmb250RGF0YS0+cGxh
dGZvcm1EYXRhKCkuY2dGb250KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKKyAgICBpZiAoQVRTVUNy
ZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SWQpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250
U3R5bGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVRTVUF0dHJpYnV0
ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7CisgICAgQnl0ZUNvdW50IHNpemUgPSBzaXplb2YoQVRT
VUZvbnRJRCk7CisgICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElkfTsKKyAg
ICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEsICZ0YWcs
ICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOworICAgIGlmIChzdGF0dXMgIT0gbm9F
cnIpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250U3R5bGUs
ICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgeworICAgICAgICBBVFNVRGlzcG9z
ZVN0eWxlKGZvbnRTdHlsZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBB
VFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7CisjZW5kaWYKKworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQoreworICAg
IERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJhY2tGb250
RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFtZV0pKTsK
KyAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOworfQorCisjaWYgIUVSUk9S
X0RJU0FCTEVECisjaWZkZWYgX19MUDY0X18KK3N0YXRpYyBOU1N0cmluZyogcGF0aEZyb21Gb250
KE5TRm9udCopCit7CisgICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90IGF2YWls
YWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2lu
ZworICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCisgICAgcmV0
dXJuIG5pbDsKK30KKyNlbHNlCitzdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChOU0ZvbnQg
KmZvbnQpCit7CisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgQVRTRm9udFJlZiBhdHNG
b250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250KHRvQ1RG
b250UmVmKGZvbnQpLCAwKSk7CisjZWxzZQorICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0
QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7CisjZW5kaWYK
KyAgICBGU1JlZiBmaWxlUmVmOworCisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgT1NT
dGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZpbGVSZWYp
OworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7CisjZWxzZQor
ICAgIEZTU3BlYyBvRmlsZTsKKyAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0RmlsZVNw
ZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQor
ICAgICAgICByZXR1cm4gbmlsOworCisgICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZvRmlsZSwg
JmZpbGVSZWYpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7
CisjZW5kaWYKKworICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKKyAgICBzdGF0
dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9NQVgpOwor
ICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCisgICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5n
V2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKKworICAgIHJldHVy
biBuaWw7Cit9CisjZW5kaWYgLy8gX19MUDY0X18KKyNlbmRpZiAvLyAhRVJST1JfRElTQUJMRUQK
Kwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyNpZmRlZiBCVUlMRElO
R19PTl9USUdFUgorICAgIG1fc3R5bGVHcm91cCA9IDA7CisjZW5kaWYKKyNpZiBVU0UoQVRTVUkp
CisgICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9
IGZhbHNlOworICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7CisjZW5kaWYKKworICAgIG1fc3lu
dGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/IDEuMGYg
OiAwLmY7CisKKyAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7CisgICAgaWYgKCFpbml0Rm9u
dERhdGEodGhpcykpIHsKKyAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQgaGFwcGVu
ZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCisgICAgICAgIC8vIFRyeSBsb29raW5nIGZvciBhbiBh
bHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCisKKyAgICAgICAgLy8gU3Bl
Y2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9mICJUaW1l
cyIuCisgICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBmYW1pbHkg
bmFtZSBpcyAiVGltZXMiLgorICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1hbCAiVGlt
ZXMiIGZhbWlseSBmb250LgorICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2ZSBhIGNv
cnJ1cHQgcmVndWxhciB2YXJpYW50LgorICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tGb250RmFt
aWx5OworICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0gaXNF
cXVhbDpAIlRpbWVzIl0pCisgICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBAIlRpbWVz
IE5ldyBSb21hbiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhbGxiYWNrRm9udEZhbWls
eSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOworICAgICAgICAKKyAgICAgICAgLy8gVHJ5IHNl
dHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgorICAgICAgICAvLyBUaGlzIGlzIGEgbGFzdCBk
aXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5nIGhhcyBn
b25lIHdyb25nLgorI2lmICFFUlJPUl9ESVNBQkxFRAorICAgICAgICBSZXRhaW5QdHI8TlNGb250
PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKKyNlbmRpZgorICAgICAgICBp
ZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0
Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250Om1fcGxh
dGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZvbnRXaXRo
TmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCldKTsKKyNp
ZiAhRVJST1JfRElTQUJMRUQKKyAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0aEZyb21G
b250KGluaXRpYWxGb250LmdldCgpKTsKKyAgICAgICAgaWYgKCFmaWxlUGF0aCkKKyAgICAgICAg
ICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOworI2VuZGlmCisgICAgICAgIGlmICghaW5pdEZv
bnREYXRhKHRoaXMpKSB7CisgICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWlseSBpc0Vx
dWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKKyAgICAgICAgICAgICAgICAvLyBPSywgY291bGRu
J3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywgZmFsbGJh
Y2sKKyAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlzIGZhaWxz
IHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KKyAgICAgICAgICAgICAgICBtX3BsYXRmb3Jt
RGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29udmVydEZv
bnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZhbWlseSgp
XSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFuZCB0aGUg
c3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgorICAgICAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIs
IGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWxl
ZFNldHVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQgdGhlIHN5
c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGluaXRp
YWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgZmFpbGVkU2V0dXAgPSB0
cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoZSBw
cm9ibGVtLgorICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwgdXNpbmcg
JUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKKyAgICAgICAgICAgIFttX3Bs
YXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBmYW1pbHlO
YW1lXSwgZmlsZVBhdGgpOworICAgIH0KKworICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB0cnkg
dG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KKyAgICAvLyBUaGlzIGlzIHByb2JhYmx5
IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWlsYWJsZS4K
KyAgICBpZiAoZmFpbGVkU2V0dXApIHsKKyAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChb
TlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2ludFNpemVd
XSk7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2luZyBzeXN0
ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7CisgICAgICAgIGluaXRGb250RGF0
YSh0aGlzKTsKKyAgICB9CisgICAgCisgICAgaW50IGlBc2NlbnQ7CisgICAgaW50IGlEZXNjZW50
OworICAgIGludCBpTGluZUdhcDsKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIHdrR2V0
Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURlc2NlbnQs
ICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7CisjZWxzZQorICAgIGlBc2NlbnQgPSBDR0ZvbnRH
ZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOworICAgIGlEZXNjZW50ID0gQ0dGb250
R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7CisgICAgaUxpbmVHYXAgPSBDR0Zv
bnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyAgICBtX3VuaXRzUGVyRW0g
PSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyNlbmRpZgor
CisgICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIGZsb2F0
IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRT
aXplOworICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3Vu
aXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5p
dHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICAvLyBXZSBuZWVk
IHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNo
IHRoZQorICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJw
YXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KKyAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBL
aXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKKyAgICAvLyBpbmNvcnJlY3Rs
eSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3Rl
YWQKKyAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCisgICAgTlNTdHJpbmcgKmZhbWls
eU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOworICAgIGlmIChbZmFt
aWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxU
b1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmluZzpAIkNv
dXJpZXIiXSkKKyAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQp
ICogMC4xNWYpICsgMC41Zik7CisgICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3Ry
aW5nOkAiR2VlemEgUHJvIl0pIHsKKyAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlwaHMgdGhh
dCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBkZXNjZW50
LiBBZGp1c3QKKyAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0ZXIgbWF0
Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25lIGxpbmUK
KyAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9mIHRoZSBu
ZXh0IGxpbmUuCisgICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7CisgICAgICAgIGZEZXNjZW50ICo9
IDIuZjsKKyAgICB9CisKKyAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7CisgICAgbV9k
ZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7CisgICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGlu
ZUdhcCk7CisgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5l
R2FwOworICAgIAorICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFsbG93IHJv
b20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCisgICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzUz
ODYxODM+CisgICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYgW2ZhbWls
eU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgeworICAgICAgICBtX2xpbmVHYXAgLT0gMyAt
IG1fZGVzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gMzsKKyAgICB9CisgICAgCisgICAgLy8g
TWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNp
emVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KKyAgICAv
LyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24n
dCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgorICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVy
byA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKKyAg
ICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7CisgICAgaWYgKHhHbHlwaCkgeworICAgICAg
ICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0Rm9yR2x5
cGg6eEdseXBoXTsKKyAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBv
ciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQorICAgICAgICAvLyBhbmQgd2Vi
IHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBs
YWlkIG91dAorICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdo
dC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAorICAgICAgICAvLyB3aGljaCBoYXMg
YW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KKyAgICAgICAgbV94SGVpZ2h0ID0gbWF4KE5TTWF4
WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV94SGVpZ2h0ID0g
W21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKK30KKyAgICAKK3N0YXRpYyBDRkRhdGFS
ZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0YSwgRm91
ckNoYXJDb2RlIHRhYmxlTmFtZSkKK3sKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIEFU
U0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3JtRGF0YS5t
X2F0c3VGb250SUQpOworCisgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICBpZiAoQVRTRm9u
dEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6ZSkgIT0g
bm9FcnIpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGTXV0YWJsZURhdGFSZWYgZGF0
YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVTaXplKTsK
KyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGRGF0YUluY3Jl
YXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7CisgICAgaWYgKEFUU0ZvbnRHZXRUYWJsZShhdHNG
b250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIoZGF0
YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7CisgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBkYXRhOworI2Vsc2UKKyAg
ICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgdGFi
bGVOYW1lKTsKKyNlbmRpZgorfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUNoYXJX
aWR0aEluaXQoKQoreworICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKKyAgICBtX21heENoYXJXaWR0
aCA9IDA7CisgICAgCisgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRvcHRDRiwg
Y29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7CisgICAgaWYgKG9z
MlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgeworICAgICAg
ICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQoKSk7Cisg
ICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJbM107Cisg
ICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldpZHRoLCBt
X3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIFJldGFp
blB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9yVGFnKG1f
cGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKKyAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0YUdldExl
bmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7CisgICAgICAgIGNvbnN0IFVJbnQ4KiBoZWFk
ID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOworICAgICAgICB1c2hvcnQgdXhN
aW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOworICAgICAgICB1c2hvcnQgdXhNYXggPSBo
ZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOworICAgICAgICBTSW50MTYgeE1pbiA9IHN0YXRpY19j
YXN0PFNJbnQxNj4odXhNaW4pOworICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19jYXN0PFNJ
bnQxNj4odXhNYXgpOworICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHhN
YXggLSB4TWluKTsKKyAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0cyhkaWZm
LCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIC8v
IEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwgcG9wdWxh
dGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KKyAgICBpbml0Q2hhcldp
ZHRocygpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQorewor
I2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgaWYgKG1fc3R5bGVHcm91cCkKKyAgICAgICAg
d2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOworI2VuZGlmCisjaWYgVVNFKEFUU1VJ
KQorICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9IG1fQVRT
VVN0eWxlTWFwLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0eWxlPjo6
aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisg
ICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7CisjZW5kaWYKK30KKworU2ltcGxl
Rm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVz
Y3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBz
Rm9udERhdGEpIHsKKyAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsKKyAgICAg
ICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6
ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKKyAgICAgICAgICAgIG1fc21hbGxDYXBz
Rm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZh
bHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhD
RVBUSU9OUzsKKyAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgp
IHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRN
YW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNpemVdKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlwZSBpbmZv
cm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRvIGEgZGlm
ZmVyZW50IHNpemUuCisgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZm9udCB0
aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgorICAgICAgICAgICAgc21hbGxDYXBzRm9udC5zZXRGb250
KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQuZm9udCgp
IHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7CisKKyAg
ICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgeworICAgICAgICAgICAgICAgIE5T
Rm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFn
ZXJdOworICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0gW2ZvbnRN
YW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOworCisgICAgICAgICAg
ICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKKyAgICAgICAgICAgICAg
ICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKKyAgICAgICAgICAgICAgICBpZiAo
bV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQorICAgICAgICAgICAgICAgICAgICBm
b250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7CisKKyAgICAgICAgICAgICAgICBOU0ZvbnRU
cmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6
c21hbGxDYXBzRm9udC5mb250KCldOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnQubV9z
eW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShzbWFsbENh
cHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fw
c0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNr
KSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKKworICAgICAg
ICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9u
dERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRU5EX0JM
T0NLX09CSkNfRVhDRVBUSU9OUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFs
bENhcHNGb250RGF0YTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0
ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIE5T
U3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcnNOb0Nv
cHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBmcmVlV2hl
bkRvbmU6Tk9dOworICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1EYXRhLmZv
bnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07CisgICAgYm9vbCByZXN1bHQg
PSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0aW9uID09
IE5TTm90Rm91bmQ7CisgICAgW3N0cmluZyByZWxlYXNlXTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgTlNGb250
KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOworICAgIC8vIFNwZWNpYWwgY2FzZSBPc2FrYS1N
b25vLgorICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIHNo
b3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCB0
aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorCisg
ICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCisgICAgLy8gQWNjb3JkaW5nIHRvIDxyZGFy
Oi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGljIGFzIGZp
eGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMtUEdvdGhp
YyBhcyBmaXhlZCBwaXRjaC4KKworICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNvcnNpdmEK
KyAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBzaG91bGQg
bm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKyAgICAvLyBOb3RlIHRo
YXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKwor
ICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOworICAgIG1fdHJlYXRBc0ZpeGVkUGl0
Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwKKyAgICAg
ICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9PSBOU09y
ZGVyZWRTYW1lKSAmJgorICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOkAi
TVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKKyAgICAgICAgICAgW25hbWUgY2FzZUlu
c2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNhbWU7Cit9
CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlw
aCBnbHlwaCkgY29uc3QKK3sKKyAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7CisjaWZuZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQ0dSZWN0IGJveDsKKyAgICBDR0ZvbnRHZXRHbHlwaEJCb3hl
cyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKKyAgICBmbG9hdCBw
b2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7CisgICAgQ0dGbG9hdCBzY2FsZSA9IHBv
aW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKKyAgICBib3VuZGluZ0JveCA9IENHUmVjdEFwcGx5QWZm
aW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUsIC1zY2Fs
ZSkpOworICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCisgICAgICAgIGJvdW5kaW5nQm94
LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQpOwor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOworI2VuZGlmCisgICAgcmV0dXJuIGJvdW5k
aW5nQm94OworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBo
KEdseXBoIGdseXBoKSBjb25zdAoreworICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3JtRGF0YSgp
LmZvbnQoKTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Cisg
ICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50
U2l6ZSwgcG9pbnRTaXplKTsKKyAgICBDR1NpemUgYWR2YW5jZTsKKyAgICBpZiAoIXdrR2V0R2x5
cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250LCAmbSwg
JmdseXBoLCAmYWR2YW5jZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY2FjaGUg
Z2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRTaXplKTsK
KyAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7CisgICAgfQorICAgIHJldHVybiBhZHZhbmNlLndp
ZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCisjaWYgVVNFKEFUU1VJKQordm9pZCBT
aW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAoreworICAgIEFTU0VSVCgh
bV9jaGVja2VkU2hhcGVzQXJhYmljKTsKKworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9IHRy
dWU7CisgICAgCisgICAgQVRTVUZvbnRJRCBmb250SUQgPSBtX3BsYXRmb3JtRGF0YS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SUQpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8g
Z2V0IEFUU1VGb250SUQgZm9yICVAIiwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb24g
Zm9udHMgdGhhdCBjb250YWluIEFyYWJpYyBnbHlwaHMuIE91cgorICAgIC8vIGhldXJpc3RpYyBp
cyB0aGF0IGlmIHN1Y2ggYSBmb250IGhhcyBhIGdseXBoIG1ldGFtb3JwaG9zaXMgdGFibGUsIHRo
ZW4KKyAgICAvLyBpdCBpbmNsdWRlcyBzaGFwaW5nIGluZm9ybWF0aW9uIGZvciBBcmFiaWMuCisg
ICAgRm91ckNoYXJDb2RlIHRhYmxlc1tdID0geyAnbW9yeCcsICdtb3J0JyB9OworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGVzKSAvIHNpemVvZih0YWJsZXNbMF0pOyAr
K2kpIHsKKyAgICAgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICAgICAgT1NTdGF0dXMgc3Rh
dHVzID0gQVRTRm9udEdldFRhYmxlKGZvbnRJRCwgdGFibGVzW2ldLCAwLCAwLCAwLCAmdGFibGVT
aXplKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgeworICAgICAgICAgICAgbV9zaGFw
ZXNBcmFiaWMgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKHN0YXR1cyAhPSBrQVRTSW52YWxpZEZvbnRUYWJsZUFjY2VzcykKKyAgICAgICAgICAg
IExPR19FUlJPUigiQVRTRm9udEdldFRhYmxlIGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICB9
Cit9CisjZW5kaWYKKworI2lmIFVTRShDT1JFX1RFWFQpCitDVEZvbnRSZWYgU2ltcGxlRm9udERh
dGE6OmdldENURm9udCgpIGNvbnN0Cit7CisgICAgaWYgKGdldE5TRm9udCgpKQorICAgICAgICBy
ZXR1cm4gdG9DVEZvbnRSZWYoZ2V0TlNGb250KCkpOworICAgIGlmICghbV9DVEZvbnQpCisgICAg
ICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNzRm9udChtX3BsYXRm
b3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cisg
ICAgcmV0dXJuIG1fQ1RGb250LmdldCgpOworfQorCitDRkRpY3Rpb25hcnlSZWYgU2ltcGxlRm9u
dERhdGE6OmdldENGU3RyaW5nQXR0cmlidXRlcyhUeXBlc2V0dGluZ0ZlYXR1cmVzIHR5cGVzZXR0
aW5nRmVhdHVyZXMpIGNvbnN0Cit7CisgICAgdW5zaWduZWQga2V5ID0gdHlwZXNldHRpbmdGZWF0
dXJlcyArIDE7CisgICAgcGFpcjxIYXNoTWFwPHVuc2lnbmVkLCBSZXRhaW5QdHI8Q0ZEaWN0aW9u
YXJ5UmVmPiA+OjppdGVyYXRvciwgYm9vbD4gYWRkUmVzdWx0ID0gbV9DRlN0cmluZ0F0dHJpYnV0
ZXMuYWRkKGtleSwgUmV0YWluUHRyPENGRGljdGlvbmFyeVJlZj4oKSk7CisgICAgUmV0YWluUHRy
PENGRGljdGlvbmFyeVJlZj4mIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5ID0gYWRkUmVzdWx0LmZpcnN0
LT5zZWNvbmQ7CisgICAgaWYgKCFhZGRSZXN1bHQuc2Vjb25kKQorICAgICAgICByZXR1cm4gYXR0
cmlidXRlc0RpY3Rpb25hcnkuZ2V0KCk7CisKKyAgICBib29sIGFsbG93TGlnYXR1cmVzID0gcGxh
dGZvcm1EYXRhKCkuYWxsb3dzTGlnYXR1cmVzKCkgfHwgKHR5cGVzZXR0aW5nRmVhdHVyZXMgJiBM
aWdhdHVyZXMpOworCisgICAgc3RhdGljIGNvbnN0IGludCBsaWdhdHVyZXNOb3RBbGxvd2VkVmFs
dWUgPSAwOworICAgIHN0YXRpYyBDRk51bWJlclJlZiBsaWdhdHVyZXNOb3RBbGxvd2VkID0gQ0ZO
dW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVySW50VHlwZSwgJmxpZ2F0
dXJlc05vdEFsbG93ZWRWYWx1ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc0Fs
bG93ZWRWYWx1ZSA9IDE7CisgICAgc3RhdGljIENGTnVtYmVyUmVmIGxpZ2F0dXJlc0FsbG93ZWQg
PSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAm
bGlnYXR1cmVzQWxsb3dlZFZhbHVlKTsKKworICAgIGlmICghKHR5cGVzZXR0aW5nRmVhdHVyZXMg
JiBLZXJuaW5nKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga2VybmluZ0FkanVzdG1l
bnRWYWx1ZSA9IDA7CisgICAgICAgIHN0YXRpYyBDRk51bWJlclJlZiBrZXJuaW5nQWRqdXN0bWVu
dCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckZsb2F0VHlw
ZSwgJmtlcm5pbmdBZGp1c3RtZW50VmFsdWUpOworICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCog
a2V5c1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsga0NURm9udEF0dHJpYnV0ZU5hbWUsIGtDVEtl
cm5BdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsKKyAgICAgICAgY29u
c3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZFtdID0geyBnZXRDVEZvbnQoKSwga2Vy
bmluZ0FkanVzdG1lbnQsIGFsbG93TGlnYXR1cmVzCisgICAgICAgICAgICA/IGxpZ2F0dXJlc0Fs
bG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07CisgICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9u
YXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0Rpc2Fi
bGVkLCB2YWx1ZXNXaXRoS2VybmluZ0Rpc2FibGVkLAorICAgICAgICAgICAgc2l6ZW9mKGtleXNX
aXRoS2VybmluZ0Rpc2FibGVkKSAvIHNpemVvZigqa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQpLAor
ICAgICAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlw
ZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEJ5
IG9taXR0aW5nIHRoZSBrQ1RLZXJuQXR0cmlidXRlTmFtZSBhdHRyaWJ1dGUsIHdlIGdldCBDb3Jl
IFRleHQncyBzdGFuZGFyZCBrZXJuaW5nLgorICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCoga2V5
c1dpdGhLZXJuaW5nRW5hYmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUTGlnYXR1
cmVBdHRyaWJ1dGVOYW1lIH07CisgICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5n
RW5hYmxlZFtdID0geyBnZXRDVEZvbnQoKSwgYWxsb3dMaWdhdHVyZXMgPyBsaWdhdHVyZXNBbGxv
d2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OworICAgICAgICBhdHRyaWJ1dGVzRGljdGlvbmFy
eS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShOVUxMLCBrZXlzV2l0aEtlcm5pbmdFbmFibGVk
LCB2YWx1ZXNXaXRoS2VybmluZ0VuYWJsZWQsCisgICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhL
ZXJuaW5nRW5hYmxlZCkgLyBzaXplb2YoKmtleXNXaXRoS2VybmluZ0VuYWJsZWQpLAorICAgICAg
ICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlwZURpY3Rp
b25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0KKworICAgIHJldHVybiBhdHRyaWJ1dGVzRGlj
dGlvbmFyeS5nZXQoKTsKK30KKworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZv
bnREYXRhQ29yZVRleHQuY3BwCShyZXZpc2lvbiA1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQuY3BwCSh3b3JraW5nIGNvcHkpCkBA
IC0zMCw0NDQgKzMwLDE0IEBACiAjaW1wb3J0ICJjb25maWcuaCIKICNpbXBvcnQgIlNpbXBsZUZv
bnREYXRhLmgiCiAKLSNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgotI2ltcG9ydCAiQ29sb3Iu
aCIKLSNpbXBvcnQgIkZsb2F0UmVjdC5oIgogI2ltcG9ydCAiRm9udC5oIgogI2ltcG9ydCAiRm9u
dENhY2hlLmgiCiAjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKLSNpbXBvcnQgIlNoYXJlZEJ1
ZmZlci5oIgotI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgotI2ltcG9ydCA8QXBw
S2l0L0FwcEtpdC5oPgogI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNl
cnZpY2VzLmg+Ci0jaW1wb3J0IDxmbG9hdC5oPgotI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgot
I2ltcG9ydCA8d3RmL0Fzc2VydGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4K
LSNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgot
Ci1AaW50ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQotLSAoQk9PTClfaXNGYWtl
Rml4ZWRQaXRjaDsKLUBlbmQKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNlIFdl
YkNvcmUgewotICAKLWNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAu
N2Y7Ci1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVk
IHVuaXRzUGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9Ci0KLXN0YXRpYyBib29sIGlu
aXRGb250RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCi17Ci0gICAgaWYgKCFmb250RGF0
YS0+cGxhdGZvcm1EYXRhKCkuY2dGb250KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQotI2lm
ZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKLSAgICBpZiAo
QVRTVUNyZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQotICAgICAgICByZXR1cm4gZmFs
c2U7Ci0KLSAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5t
X2F0c3VGb250SUQ7Ci0gICAgaWYgKCFmb250SWQpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHls
ZShmb250U3R5bGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQVRTVUF0
dHJpYnV0ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7Ci0gICAgQnl0ZUNvdW50IHNpemUgPSBzaXpl
b2YoQVRTVUZvbnRJRCk7Ci0gICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElk
fTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEs
ICZ0YWcsICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOwotICAgIGlmIChzdGF0dXMg
IT0gbm9FcnIpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOwotICAgICAg
ICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250
U3R5bGUsICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgewotICAgICAgICBBVFNV
RGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0K
LSAgICBBVFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0jZW5kaWYKLQotICAgIHJldHVybiB0
cnVlOwotfQotCi1zdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQot
ewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJh
Y2tGb250RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFt
ZV0pKTsKLSAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOwotfQotCi0jaWYg
IUVSUk9SX0RJU0FCTEVECi0jaWZkZWYgX19MUDY0X18KLXN0YXRpYyBOU1N0cmluZyogcGF0aEZy
b21Gb250KE5TRm9udCopCi17Ci0gICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90
IGF2YWlsYWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRl
YnVnZ2luZwotICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCi0g
ICAgcmV0dXJuIG5pbDsKLX0KLSNlbHNlCi1zdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChO
U0ZvbnQgKmZvbnQpCi17Ci0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTRm9udFJl
ZiBhdHNGb250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250
KHRvQ1RGb250UmVmKGZvbnQpLCAwKSk7Ci0jZWxzZQotICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9
IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7Ci0j
ZW5kaWYKLSAgICBGU1JlZiBmaWxlUmVmOwotCi0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0g
ICAgT1NTdGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZp
bGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBuaWw7Ci0j
ZWxzZQotICAgIEZTU3BlYyBvRmlsZTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0
RmlsZVNwZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKLSAgICBpZiAoc3RhdHVzICE9IG5v
RXJyKQotICAgICAgICByZXR1cm4gbmlsOwotCi0gICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZv
RmlsZSwgJmZpbGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVy
biBuaWw7Ci0jZW5kaWYKLQotICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKLSAg
ICBzdGF0dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9N
QVgpOwotICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBbTlNTdHJpbmcg
c3RyaW5nV2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKLQotICAg
IHJldHVybiBuaWw7Ci19Ci0jZW5kaWYgLy8gX19MUDY0X18KLSNlbmRpZiAvLyAhRVJST1JfRElT
QUJMRUQKLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsKLSNpZmRlZiBC
VUlMRElOR19PTl9USUdFUgotICAgIG1fc3R5bGVHcm91cCA9IDA7Ci0jZW5kaWYKLSNpZiBVU0Uo
QVRTVUkpCi0gICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOwotICAgIG1fY2hlY2tlZFNoYXBlc0Fy
YWJpYyA9IGZhbHNlOwotICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7Ci0jZW5kaWYKLQotICAg
IG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/
IDEuMGYgOiAwLmY7Ci0KLSAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7Ci0gICAgaWYgKCFp
bml0Rm9udERhdGEodGhpcykpIHsKLSAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQg
aGFwcGVuZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCi0gICAgICAgIC8vIFRyeSBsb29raW5nIGZv
ciBhbiBhbHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCi0KLSAgICAgICAg
Ly8gU3BlY2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9m
ICJUaW1lcyIuCi0gICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBm
YW1pbHkgbmFtZSBpcyAiVGltZXMiLgotICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1h
bCAiVGltZXMiIGZhbWlseSBmb250LgotICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2
ZSBhIGNvcnJ1cHQgcmVndWxhciB2YXJpYW50LgotICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tG
b250RmFtaWx5OwotICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFt
ZV0gaXNFcXVhbDpAIlRpbWVzIl0pCi0gICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBA
IlRpbWVzIE5ldyBSb21hbiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZhbGxiYWNrRm9u
dEZhbWlseSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOwotICAgICAgICAKLSAgICAgICAgLy8g
VHJ5IHNldHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgotICAgICAgICAvLyBUaGlzIGlzIGEg
bGFzdCBkaXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5n
IGhhcyBnb25lIHdyb25nLgotI2lmICFFUlJPUl9ESVNBQkxFRAotICAgICAgICBSZXRhaW5QdHI8
TlNGb250PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKLSNlbmRpZgotICAg
ICAgICBpZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQotICAgICAgICAgICAgbV9wbGF0Zm9ybURh
dGEuc2V0Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250
Om1fcGxhdGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKLSAg
ICAgICAgZWxzZQotICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZv
bnRXaXRoTmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCld
KTsKLSNpZiAhRVJST1JfRElTQUJMRUQKLSAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0
aEZyb21Gb250KGluaXRpYWxGb250LmdldCgpKTsKLSAgICAgICAgaWYgKCFmaWxlUGF0aCkKLSAg
ICAgICAgICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOwotI2VuZGlmCi0gICAgICAgIGlmICgh
aW5pdEZvbnREYXRhKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWls
eSBpc0VxdWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKLSAgICAgICAgICAgICAgICAvLyBPSywg
Y291bGRuJ3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywg
ZmFsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlz
IGZhaWxzIHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KLSAgICAgICAgICAgICAgICBtX3Bs
YXRmb3JtRGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29u
dmVydEZvbnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZh
bWlseSgpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKLSAg
ICAgICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFu
ZCB0aGUgc3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgotICAgICAgICAg
ICAgICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBh
dCAlQCIsIGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgICAg
IGZhaWxlZFNldHVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVs
c2UgewotICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQg
dGhlIHN5c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KLSAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIs
IGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgZmFpbGVkU2V0
dXAgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVwb3J0
IHRoZSBwcm9ibGVtLgotICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwg
dXNpbmcgJUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKLSAgICAgICAgICAg
IFttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBm
YW1pbHlOYW1lXSwgZmlsZVBhdGgpOwotICAgIH0KLQotICAgIC8vIElmIGFsbCBlbHNlIGZhaWxz
LCB0cnkgdG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KLSAgICAvLyBUaGlzIGlzIHBy
b2JhYmx5IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWls
YWJsZS4KLSAgICBpZiAoZmFpbGVkU2V0dXApIHsKLSAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0
Rm9udChbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2lu
dFNpemVdXSk7Ci0gICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2lu
ZyBzeXN0ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7Ci0gICAgICAgIGluaXRG
b250RGF0YSh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IGlBc2NlbnQ7Ci0gICAgaW50IGlE
ZXNjZW50OwotICAgIGludCBpTGluZUdhcDsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgotICAg
IHdrR2V0Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURl
c2NlbnQsICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7Ci0jZWxzZQotICAgIGlBc2NlbnQgPSBD
R0ZvbnRHZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOwotICAgIGlEZXNjZW50ID0g
Q0dGb250R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7Ci0gICAgaUxpbmVHYXAg
PSBDR0ZvbnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSAgICBtX3VuaXRz
UGVyRW0gPSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSNl
bmRpZgotCi0gICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAg
IGZsb2F0IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICog
cG9pbnRTaXplOwotICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50
LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVF
bVRvVW5pdHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0KLSAgICAvLyBX
ZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5
IG1hdGNoIHRoZQotICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNv
dW50ZXJwYXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KLSAgICAvLyB3ZWIgc3RhbmRhcmQuIFRo
ZSBBcHBLaXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKLSAgICAvLyBpbmNv
cnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50
IGluc3RlYWQKLSAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAgTlNTdHJpbmcg
KmZhbWlseU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOwotICAgIGlm
IChbZmFtaWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlz
RXF1YWxUb1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmlu
ZzpAIkNvdXJpZXIiXSkKLSAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRl
c2NlbnQpICogMC4xNWYpICsgMC41Zik7Ci0gICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVh
bFRvU3RyaW5nOkAiR2VlemEgUHJvIl0pIHsKLSAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlw
aHMgdGhhdCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBk
ZXNjZW50LiBBZGp1c3QKLSAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0
ZXIgbWF0Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25l
IGxpbmUKLSAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9m
IHRoZSBuZXh0IGxpbmUuCi0gICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7Ci0gICAgICAgIGZEZXNj
ZW50ICo9IDIuZjsKLSAgICB9Ci0KLSAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7Ci0g
ICAgbV9kZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7Ci0gICAgbV9saW5lR2FwID0gbHJvdW5k
ZihmTGluZUdhcCk7Ci0gICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsg
bV9saW5lR2FwOwotICAgIAotICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFs
bG93IHJvb20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCi0gICAgLy8gPHJkYXI6Ly9wcm9i
bGVtLzUzODYxODM+Ci0gICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYg
W2ZhbWlseU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgewotICAgICAgICBtX2xpbmVHYXAg
LT0gMyAtIG1fZGVzY2VudDsKLSAgICAgICAgbV9kZXNjZW50ID0gMzsKLSAgICB9Ci0gICAgCi0g
ICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5
bnRoZXNpemVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4K
LSAgICAvLyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3
ZSBkb24ndCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgotICAgIEdseXBoUGFnZSogZ2x5cGhQ
YWdlWmVybyA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2Uo
KTsKLSAgICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5n
bHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAgaWYgKHhHbHlwaCkgewot
ICAgICAgICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0
Rm9yR2x5cGg6eEdseXBoXTsKLSAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3
aWR0aCBvciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQotICAgICAgICAvLyBh
bmQgd2ViIHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2ls
bCBiZSBsYWlkIG91dAotICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRl
IGhlaWdodC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAotICAgICAgICAvLyB3aGlj
aCBoYXMgYW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KLSAgICAgICAgbV94SGVpZ2h0ID0gbWF4
KE5TTWF4WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV94SGVp
Z2h0ID0gW21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKLX0KLSAgICAKLXN0YXRpYyBD
RkRhdGFSZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0
YSwgRm91ckNoYXJDb2RlIHRhYmxlTmFtZSkKLXsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgot
ICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3Jt
RGF0YS5tX2F0c3VGb250SUQpOwotCi0gICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKLSAgICBpZiAo
QVRTRm9udEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6
ZSkgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGTXV0YWJsZURhdGFS
ZWYgZGF0YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVT
aXplKTsKLSAgICBpZiAoIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGRGF0
YUluY3JlYXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7Ci0gICAgaWYgKEFUU0ZvbnRHZXRUYWJs
ZShhdHNGb250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQ
dHIoZGF0YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7Ci0gICAgICAgIENGUmVsZWFzZShkYXRh
KTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBkYXRhOwotI2Vs
c2UKLSAgICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQo
KSwgdGFibGVOYW1lKTsKLSNlbmRpZgotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9y
bUNoYXJXaWR0aEluaXQoKQotewotICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKLSAgICBtX21heENo
YXJXaWR0aCA9IDA7Ci0gICAgCi0gICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRv
cHRDRiwgY29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7Ci0gICAg
aWYgKG9zMlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgewot
ICAgICAgICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQo
KSk7Ci0gICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJb
M107Ci0gICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldp
ZHRoLCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQotICAg
IFJldGFpblB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9y
VGFnKG1fcGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKLSAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0
YUdldExlbmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7Ci0gICAgICAgIGNvbnN0IFVJbnQ4
KiBoZWFkID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOwotICAgICAgICB1c2hv
cnQgdXhNaW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOwotICAgICAgICB1c2hvcnQgdXhN
YXggPSBoZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOwotICAgICAgICBTSW50MTYgeE1pbiA9IHN0
YXRpY19jYXN0PFNJbnQxNj4odXhNaW4pOwotICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19j
YXN0PFNJbnQxNj4odXhNYXgpOwotICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8Zmxv
YXQ+KHhNYXggLSB4TWluKTsKLSAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0
cyhkaWZmLCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQot
ICAgIC8vIEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwg
cG9wdWxhdGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KLSAgICBpbml0
Q2hhcldpZHRocygpOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3ko
KQotewotI2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgaWYgKG1fc3R5bGVHcm91cCkKLSAg
ICAgICAgd2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOwotI2VuZGlmCi0jaWYgVVNF
KEFUU1VJKQotICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9
IG1fQVRTVVN0eWxlTWFwLmVuZCgpOwotICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0
eWxlPjo6aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsr
aXQpCi0gICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7Ci0jZW5kaWYKLX0KLQot
U2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBG
b250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBpZiAoIW1fc21h
bGxDYXBzRm9udERhdGEpIHsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7Ci0gICAgICAg
ICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsK
LSAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRh
Lm1fc2l6ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKLSAgICAgICAgICAgIG1fc21h
bGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRy
dWUsIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJFR0lOX0JMT0NLX09C
SkNfRVhDRVBUSU9OUzsKLSAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEu
Zm9udCgpIHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7Ci0gICAgICAg
ICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJl
ZEZvbnRNYW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNp
emVdKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlw
ZSBpbmZvcm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRv
IGEgZGlmZmVyZW50IHNpemUuCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUg
Zm9udCB0aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgotICAgICAgICAgICAgc21hbGxDYXBzRm9udC5z
ZXRGb250KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQu
Zm9udCgpIHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7
Ci0KLSAgICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgewotICAgICAgICAgICAg
ICAgIE5TRm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9u
dE1hbmFnZXJdOwotICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0g
W2ZvbnRNYW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOwotCi0gICAg
ICAgICAgICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKLSAgICAgICAg
ICAgICAgICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKLSAgICAgICAgICAgICAg
ICBpZiAobV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQotICAgICAgICAgICAgICAg
ICAgICBmb250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7Ci0KLSAgICAgICAgICAgICAgICBO
U0ZvbnRUcmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNP
ZkZvbnQ6c21hbGxDYXBzRm9udC5mb250KCldOwotICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0Zv
bnQubV9zeW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShz
bWFsbENhcHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOwotICAgICAgICAgICAgICAgIHNt
YWxsQ2Fwc0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0Zv
bnRNYXNrKSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKLQot
ICAgICAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2Fj
aGVkRm9udERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAg
RU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4g
bV9zbWFsbENhcHNGb250RGF0YTsKLX0KLQotYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnND
aGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAotewot
ICAgIE5TU3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3Rl
cnNOb0NvcHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBm
cmVlV2hlbkRvbmU6Tk9dOwotICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1E
YXRhLmZvbnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07Ci0gICAgYm9vbCBy
ZXN1bHQgPSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0
aW9uID09IE5TTm90Rm91bmQ7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgICByZXR1cm4gcmVz
dWx0OwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCi17Ci0gICAg
TlNGb250KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOwotICAgIC8vIFNwZWNpYWwgY2FzZSBP
c2FrYS1Nb25vLgotICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4s
IHdlIHNob3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5vdGUg
dGhhdCB0aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNo
LgotCi0gICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCi0gICAgLy8gQWNjb3JkaW5nIHRv
IDxyZGFyOi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGlj
IGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMt
UEdvdGhpYyBhcyBmaXhlZCBwaXRjaC4KLQotICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNv
cnNpdmEKLSAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBz
aG91bGQgbm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KLSAgICAvLyBO
b3RlIHRoYXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRj
aC4KLQotICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOwotICAgIG1fdHJlYXRBc0Zp
eGVkUGl0Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwK
LSAgICAgICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9
PSBOU09yZGVyZWRTYW1lKSAmJgotICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21w
YXJlOkAiTVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKLSAgICAgICAgICAgW25hbWUg
Y2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNh
bWU7Ci19Ci0KLUZsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlw
aChHbHlwaCBnbHlwaCkgY29uc3QKLXsKLSAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7Ci0jaWZu
ZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQ0dSZWN0IGJveDsKLSAgICBDR0ZvbnRHZXRHbHlw
aEJCb3hlcyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKLSAgICBm
bG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Ci0gICAgQ0dGbG9hdCBzY2Fs
ZSA9IHBvaW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKLSAgICBib3VuZGluZ0JveCA9IENHUmVjdEFw
cGx5QWZmaW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUs
IC1zY2FsZSkpOwotICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCi0gICAgICAgIGJvdW5k
aW5nQm94LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZz
ZXQpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOwotI2VuZGlmCi0gICAgcmV0dXJu
IGJvdW5kaW5nQm94OwotfQotCi1mbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZv
ckdseXBoKEdseXBoIGdseXBoKSBjb25zdAotewotICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3Jt
RGF0YSgpLmZvbnQoKTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3Np
emU7Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxl
KHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKLSAgICBDR1NpemUgYWR2YW5jZTsKLSAgICBpZiAoIXdr
R2V0R2x5cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250
LCAmbSwgJmdseXBoLCAmYWR2YW5jZSkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8g
Y2FjaGUgZ2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRT
aXplKTsKLSAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBhZHZh
bmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQotCi0jaWYgVVNFKEFUU1VJKQot
dm9pZCBTaW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAotewotICAgIEFT
U0VSVCghbV9jaGVja2VkU2hhcGVzQXJhYmljKTsKLQotICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJp
YyA9IHRydWU7Ci0gICAgCi0gICAgQVRTVUZvbnRJRCBmb250SUQgPSBtX3BsYXRmb3JtRGF0YS5t
X2F0c3VGb250SUQ7Ci0gICAgaWYgKCFmb250SUQpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJ1bmFi
bGUgdG8gZ2V0IEFUU1VGb250SUQgZm9yICVAIiwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKLSAg
ICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9u
bHkgb24gZm9udHMgdGhhdCBjb250YWluIEFyYWJpYyBnbHlwaHMuIE91cgotICAgIC8vIGhldXJp
c3RpYyBpcyB0aGF0IGlmIHN1Y2ggYSBmb250IGhhcyBhIGdseXBoIG1ldGFtb3JwaG9zaXMgdGFi
bGUsIHRoZW4KLSAgICAvLyBpdCBpbmNsdWRlcyBzaGFwaW5nIGluZm9ybWF0aW9uIGZvciBBcmFi
aWMuCi0gICAgRm91ckNoYXJDb2RlIHRhYmxlc1tdID0geyAnbW9yeCcsICdtb3J0JyB9OwotICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGVzKSAvIHNpemVvZih0YWJsZXNb
MF0pOyArK2kpIHsKLSAgICAgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKLSAgICAgICAgT1NTdGF0
dXMgc3RhdHVzID0gQVRTRm9udEdldFRhYmxlKGZvbnRJRCwgdGFibGVzW2ldLCAwLCAwLCAwLCAm
dGFibGVTaXplKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgewotICAgICAgICAgICAg
bV9zaGFwZXNBcmFiaWMgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0K
LSAgICAgICAgaWYgKHN0YXR1cyAhPSBrQVRTSW52YWxpZEZvbnRUYWJsZUFjY2VzcykKLSAgICAg
ICAgICAgIExPR19FUlJPUigiQVRTRm9udEdldFRhYmxlIGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsK
LSAgICB9Ci19Ci0jZW5kaWYKIAogI2lmIFVTRShDT1JFX1RFWFQpCiBDVEZvbnRSZWYgU2ltcGxl
Rm9udERhdGE6OmdldENURm9udCgpIGNvbnN0CkBAIC00NzUsNyArNDUsNyBAQCBDVEZvbnRSZWYg
U2ltcGxlRm9udERhdGE6OmdldENURm9udCgpIGNvCiAgICAgaWYgKGdldE5TRm9udCgpKQogICAg
ICAgICByZXR1cm4gdG9DVEZvbnRSZWYoZ2V0TlNGb250KCkpOwogICAgIGlmICghbV9DVEZvbnQp
Ci0gICAgICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNzRm9udCht
X3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCBOVUxMLCBOVUxM
KSk7CisgICAgICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNzRm9u
dChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCAwLCAwKSk7
CiAgICAgcmV0dXJuIG1fQ1RGb250LmdldCgpOwogfQogCkBAIC01MDEsMTQgKzcxLDE0IEBAIENG
RGljdGlvbmFyeVJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q0ZTdHIKICAgICAgICAgc3RhdGljIGNv
bnN0IHZvaWQqIGtleXNXaXRoS2VybmluZ0Rpc2FibGVkW10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVO
YW1lLCBrQ1RLZXJuQXR0cmlidXRlTmFtZSwga0NUTGlnYXR1cmVBdHRyaWJ1dGVOYW1lIH07CiAg
ICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsgZ2V0Q1RG
b250KCksIGtlcm5pbmdBZGp1c3RtZW50LCBhbGxvd0xpZ2F0dXJlcwogICAgICAgICAgICAgPyBs
aWdhdHVyZXNBbGxvd2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OwotICAgICAgICBhdHRyaWJ1
dGVzRGljdGlvbmFyeS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShOVUxMLCBrZXlzV2l0aEtl
cm5pbmdEaXNhYmxlZCwgdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZCwKKyAgICAgICAgYXR0cmli
dXRlc0RpY3Rpb25hcnkuYWRvcHRDRihDRkRpY3Rpb25hcnlDcmVhdGUoMCwga2V5c1dpdGhLZXJu
aW5nRGlzYWJsZWQsIHZhbHVlc1dpdGhLZXJuaW5nRGlzYWJsZWQsCiAgICAgICAgICAgICBzaXpl
b2Yoa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQpIC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdEaXNh
YmxlZCksCiAgICAgICAgICAgICAma0NGQ29weVN0cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3Ms
ICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKSk7CiAgICAgfSBlbHNlIHsKICAgICAg
ICAgLy8gQnkgb21pdHRpbmcgdGhlIGtDVEtlcm5BdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSwgd2Ug
Z2V0IENvcmUgVGV4dCdzIHN0YW5kYXJkIGtlcm5pbmcuCiAgICAgICAgIHN0YXRpYyBjb25zdCB2
b2lkKiBrZXlzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVOYW1lLCBr
Q1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsKICAgICAgICAgY29uc3Qgdm9pZCogdmFsdWVzV2l0
aEtlcm5pbmdFbmFibGVkW10gPSB7IGdldENURm9udCgpLCBhbGxvd0xpZ2F0dXJlcyA/IGxpZ2F0
dXJlc0FsbG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07Ci0gICAgICAgIGF0dHJpYnV0ZXNE
aWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2Vybmlu
Z0VuYWJsZWQsIHZhbHVlc1dpdGhLZXJuaW5nRW5hYmxlZCwKKyAgICAgICAgYXR0cmlidXRlc0Rp
Y3Rpb25hcnkuYWRvcHRDRihDRkRpY3Rpb25hcnlDcmVhdGUoMCwga2V5c1dpdGhLZXJuaW5nRW5h
YmxlZCwgdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkLAogICAgICAgICAgICAgc2l6ZW9mKGtleXNX
aXRoS2VybmluZ0VuYWJsZWQpIC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdFbmFibGVkKSwKICAg
ICAgICAgICAgICZrQ0ZDb3B5U3RyaW5nRGljdGlvbmFyeUtleUNhbGxCYWNrcywgJmtDRlR5cGVE
aWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpKTsKICAgICB9CkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbQo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbQkocmV2aXNpb24gNTg1
MjApCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5t
bQkod29ya2luZyBjb3B5KQpAQCAtNDM4LDg0ICs0MzgsNCBAQCBmbG9hdCBTaW1wbGVGb250RGF0
YTo6cGxhdGZvcm1XaWR0aEZvckdsCiAgICAgcmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRo
ZXRpY0JvbGRPZmZzZXQ7CiB9CiAKLSNpZiBVU0UoQVRTVUkpCi12b2lkIFNpbXBsZUZvbnREYXRh
OjpjaGVja1NoYXBlc0FyYWJpYygpIGNvbnN0Ci17Ci0gICAgQVNTRVJUKCFtX2NoZWNrZWRTaGFw
ZXNBcmFiaWMpOwotCi0gICAgbV9jaGVja2VkU2hhcGVzQXJhYmljID0gdHJ1ZTsKLSAgICAKLSAg
ICBBVFNVRm9udElEIGZvbnRJRCA9IG1fcGxhdGZvcm1EYXRhLm1fYXRzdUZvbnRJRDsKLSAgICBp
ZiAoIWZvbnRJRCkgewotICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBnZXQgQVRTVUZvbnRJ
RCBmb3IgJUAiLCBtX3BsYXRmb3JtRGF0YS5mb250KCkpOwotICAgICAgICByZXR1cm47Ci0gICAg
fQotCi0gICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbiBmb250cyB0aGF0IGNv
bnRhaW4gQXJhYmljIGdseXBocy4gT3VyCi0gICAgLy8gaGV1cmlzdGljIGlzIHRoYXQgaWYgc3Vj
aCBhIGZvbnQgaGFzIGEgZ2x5cGggbWV0YW1vcnBob3NpcyB0YWJsZSwgdGhlbgotICAgIC8vIGl0
IGluY2x1ZGVzIHNoYXBpbmcgaW5mb3JtYXRpb24gZm9yIEFyYWJpYy4KLSAgICBGb3VyQ2hhckNv
ZGUgdGFibGVzW10gPSB7ICdtb3J4JywgJ21vcnQnIH07Ci0gICAgZm9yICh1bnNpZ25lZCBpID0g
MDsgaSA8IHNpemVvZih0YWJsZXMpIC8gc2l6ZW9mKHRhYmxlc1swXSk7ICsraSkgewotICAgICAg
ICBCeXRlQ291bnQgdGFibGVTaXplOwotICAgICAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250
R2V0VGFibGUoZm9udElELCB0YWJsZXNbaV0sIDAsIDAsIDAsICZ0YWJsZVNpemUpOwotICAgICAg
ICBpZiAoc3RhdHVzID09IG5vRXJyKSB7Ci0gICAgICAgICAgICBtX3NoYXBlc0FyYWJpYyA9IHRy
dWU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RhdHVz
ICE9IGtBVFNJbnZhbGlkRm9udFRhYmxlQWNjZXNzKQotICAgICAgICAgICAgTE9HX0VSUk9SKCJB
VFNGb250R2V0VGFibGUgZmFpbGVkICglZCkiLCBzdGF0dXMpOwotICAgIH0KLX0KLSNlbmRpZgot
Ci0jaWYgVVNFKENPUkVfVEVYVCkKLUNURm9udFJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q1RGb250
KCkgY29uc3QKLXsKLSAgICBpZiAoZ2V0TlNGb250KCkpCi0gICAgICAgIHJldHVybiB0b0NURm9u
dFJlZihnZXROU0ZvbnQoKSk7Ci0gICAgaWYgKCFtX0NURm9udCkKLSAgICAgICAgbV9DVEZvbnQu
YWRvcHRDRihDVEZvbnRDcmVhdGVXaXRoR3JhcGhpY3NGb250KG1fcGxhdGZvcm1EYXRhLmNnRm9u
dCgpLCBtX3BsYXRmb3JtRGF0YS5zaXplKCksIE5VTEwsIE5VTEwpKTsKLSAgICByZXR1cm4gbV9D
VEZvbnQuZ2V0KCk7Ci19Ci0KLUNGRGljdGlvbmFyeVJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q0ZT
dHJpbmdBdHRyaWJ1dGVzKFR5cGVzZXR0aW5nRmVhdHVyZXMgdHlwZXNldHRpbmdGZWF0dXJlcykg
Y29uc3QKLXsKLSAgICB1bnNpZ25lZCBrZXkgPSB0eXBlc2V0dGluZ0ZlYXR1cmVzICsgMTsKLSAg
ICBwYWlyPEhhc2hNYXA8dW5zaWduZWQsIFJldGFpblB0cjxDRkRpY3Rpb25hcnlSZWY+ID46Oml0
ZXJhdG9yLCBib29sPiBhZGRSZXN1bHQgPSBtX0NGU3RyaW5nQXR0cmlidXRlcy5hZGQoa2V5LCBS
ZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5UmVmPigpKTsKLSAgICBSZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5
UmVmPiYgYXR0cmlidXRlc0RpY3Rpb25hcnkgPSBhZGRSZXN1bHQuZmlyc3QtPnNlY29uZDsKLSAg
ICBpZiAoIWFkZFJlc3VsdC5zZWNvbmQpCi0gICAgICAgIHJldHVybiBhdHRyaWJ1dGVzRGljdGlv
bmFyeS5nZXQoKTsKLQotICAgIGJvb2wgYWxsb3dMaWdhdHVyZXMgPSBwbGF0Zm9ybURhdGEoKS5h
bGxvd3NMaWdhdHVyZXMoKSB8fCAodHlwZXNldHRpbmdGZWF0dXJlcyAmIExpZ2F0dXJlcyk7Ci0K
LSAgICBzdGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc05vdEFsbG93ZWRWYWx1ZSA9IDA7Ci0gICAg
c3RhdGljIENGTnVtYmVyUmVmIGxpZ2F0dXJlc05vdEFsbG93ZWQgPSBDRk51bWJlckNyZWF0ZShr
Q0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAmbGlnYXR1cmVzTm90QWxsb3dl
ZFZhbHVlKTsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQgbGlnYXR1cmVzQWxsb3dlZFZhbHVlID0g
MTsKLSAgICBzdGF0aWMgQ0ZOdW1iZXJSZWYgbGlnYXR1cmVzQWxsb3dlZCA9IENGTnVtYmVyQ3Jl
YXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZsaWdhdHVyZXNBbGxv
d2VkVmFsdWUpOwotCi0gICAgaWYgKCEodHlwZXNldHRpbmdGZWF0dXJlcyAmIEtlcm5pbmcpKSB7
Ci0gICAgICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrZXJuaW5nQWRqdXN0bWVudFZhbHVlID0gMDsK
LSAgICAgICAgc3RhdGljIENGTnVtYmVyUmVmIGtlcm5pbmdBZGp1c3RtZW50ID0gQ0ZOdW1iZXJD
cmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyRmxvYXRUeXBlLCAma2VybmluZ0Fk
anVzdG1lbnRWYWx1ZSk7Ci0gICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5p
bmdEaXNhYmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUS2VybkF0dHJpYnV0ZU5h
bWUsIGtDVExpZ2F0dXJlQXR0cmlidXRlTmFtZSB9OwotICAgICAgICBjb25zdCB2b2lkKiB2YWx1
ZXNXaXRoS2VybmluZ0Rpc2FibGVkW10gPSB7IGdldENURm9udCgpLCBrZXJuaW5nQWRqdXN0bWVu
dCwgYWxsb3dMaWdhdHVyZXMKLSAgICAgICAgICAgID8gbGlnYXR1cmVzQWxsb3dlZCA6IGxpZ2F0
dXJlc05vdEFsbG93ZWQgfTsKLSAgICAgICAgYXR0cmlidXRlc0RpY3Rpb25hcnkuYWRvcHRDRihD
RkRpY3Rpb25hcnlDcmVhdGUoTlVMTCwga2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQsIHZhbHVlc1dp
dGhLZXJuaW5nRGlzYWJsZWQsCi0gICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhLZXJuaW5nRGlz
YWJsZWQpIC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdEaXNhYmxlZCksCi0gICAgICAgICAgICAm
a0NGQ29weVN0cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZh
bHVlQ2FsbEJhY2tzKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gQnkgb21pdHRpbmcgdGhl
IGtDVEtlcm5BdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSwgd2UgZ2V0IENvcmUgVGV4dCdzIHN0YW5k
YXJkIGtlcm5pbmcuCi0gICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdF
bmFibGVkW10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5h
bWUgfTsKLSAgICAgICAgY29uc3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7
IGdldENURm9udCgpLCBhbGxvd0xpZ2F0dXJlcyA/IGxpZ2F0dXJlc0FsbG93ZWQgOiBsaWdhdHVy
ZXNOb3RBbGxvd2VkIH07Ci0gICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZE
aWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0VuYWJsZWQsIHZhbHVlc1dpdGhL
ZXJuaW5nRW5hYmxlZCwKLSAgICAgICAgICAgIHNpemVvZihrZXlzV2l0aEtlcm5pbmdFbmFibGVk
KSAvIHNpemVvZigqa2V5c1dpdGhLZXJuaW5nRW5hYmxlZCksCi0gICAgICAgICAgICAma0NGQ29w
eVN0cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2Fs
bEJhY2tzKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmdldCgp
OwotfQotCi0jZW5kaWYKLQogfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>54751</attachid>
            <date>2010-04-29 16:11:02 -0700</date>
            <delta_ts>2010-04-29 23:11:43 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-38334-20100429161101.patch</filename>
            <type>text/plain</type>
            <size>92761</size>
            <attacher name="Kevin Ollivier">kevino</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA1ODU0NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMTUgQEAKKzIwMTAtMDQtMjkgIEtldmluIE9sbGl2aWVyICA8a2V2aW5vQHRoZW9s
bGl2aWVycy5jb20+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgQWxsb3cgb3RoZXIgcG9ydHMgdG8gY29tcGlsZSBBVFNVSSBhbmQgQ29yZVRleHQgZnVu
Y3Rpb25zIGluIFNpbXBsZUZvbnREYXRhIGZvciBNYWMuCisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0zODMzNAorCisgICAgICAgICogV2ViQ29yZS54Y29k
ZXByb2ovcHJvamVjdC5wYnhwcm9qOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9T
aW1wbGVGb250RGF0YUFUU1VJLmNwcDogQ29waWVkIGZyb20gV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9tYWMvU2ltcGxlRm9udERhdGFNYWMubW0uCisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQ29yZVRleHQuY3BwOiBDb3BpZWQgZnJvbSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YU1hYy5tbS4KKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFNYWMubW06CisKIDIwMTAtMDQtMjkgIERh
biBCZXJuc3RlaW4gIDxtaXR6QGFwcGxlLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBTaW1v
biBGcmFzZXIuCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
ago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJv
agkocmV2aXNpb24gNTg1MjApCisrKyBXZWJDb3JlL1dlYkNvcmUueGNvZGVwcm9qL3Byb2plY3Qu
cGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtMjgxLDYgKzI4MSw4IEBACiAJCTE1Qzc3MDk0MTAw
RDNDQTgwMDVCQTI2NyAvKiBKU1ZhbGlkaXR5U3RhdGUuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTVDNzcwOTIxMDBEM0NBODAwNUJBMjY3IC8qIEpT
VmFsaWRpdHlTdGF0ZS5jcHAgKi87IH07CiAJCTE1Qzc3MEE1MTAwRDQxQ0QwMDVCQTI2NyAvKiBE
T01WYWxpZGl0eVN0YXRlLm1tIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBm
aWxlUmVmID0gMTVDNzcwQTMxMDBENDFDRDAwNUJBMjY3IC8qIERPTVZhbGlkaXR5U3RhdGUubW0g
Ki87IH07CiAJCTE1Qzc3MEE2MTAwRDQxQ0QwMDVCQTI2NyAvKiBET01WYWxpZGl0eVN0YXRlLmgg
aW4gSGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNUM3NzBBNDEw
MEQ0MUNEMDA1QkEyNjcgLyogRE9NVmFsaWRpdHlTdGF0ZS5oICovOyB9OworCQkxNjNFODhGNjEx
OEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERhdGFBVFNVSS5jcHAgaW4gU291cmNlcyAqLyA9
IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSAxNjNFODhGNDExOEEzOUQyMDBFRDkyMzEg
LyogU2ltcGxlRm9udERhdGFBVFNVSS5jcHAgKi87IH07CisJCTE2M0U4OEY3MTE4QTM5RDIwMEVE
OTIzMSAvKiBTaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovID0ge2lzYSA9
IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDE2M0U4OEY1MTE4QTM5RDIwMEVEOTIzMSAvKiBTaW1w
bGVGb250RGF0YUNvcmVUZXh0LmNwcCAqLzsgfTsKIAkJMTg1QkNGMjgwRjMyNzlDRTAwMEVBMjYy
IC8qIFRocmVhZFRpbWVycy5jcHAgaW4gU291cmNlcyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7
IGZpbGVSZWYgPSAxODVCQ0YyNjBGMzI3OUNFMDAwRUEyNjIgLyogVGhyZWFkVGltZXJzLmNwcCAq
LzsgfTsKIAkJMTg1QkNGMjkwRjMyNzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5oIGluIEhl
YWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gMTg1QkNGMjcwRjMyNzlD
RTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5oICovOyB9OwogCQkxODg2MDRCMzBGMkU2NTRBMDAw
QjY0NDMgLyogRE9NVGltZXIuY3BwIGluIFNvdXJjZXMgKi8gPSB7aXNhID0gUEJYQnVpbGRGaWxl
OyBmaWxlUmVmID0gMTg4NjA0QjEwRjJFNjU0QTAwMEI2NDQzIC8qIERPTVRpbWVyLmNwcCAqLzsg
fTsKQEAgLTU2NzcsNiArNTY3OSw4IEBACiAJCTE1Qzc3MDkyMTAwRDNDQTgwMDVCQTI2NyAvKiBK
U1ZhbGlkaXR5U3RhdGUuY3BwICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNv
ZGluZyA9IDQ7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0g
SlNWYWxpZGl0eVN0YXRlLmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTVDNzcw
QTMxMDBENDFDRDAwNUJBMjY3IC8qIERPTVZhbGlkaXR5U3RhdGUubW0gKi8gPSB7aXNhID0gUEJY
RmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3Vy
Y2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBET01WYWxpZGl0eVN0YXRlLm1tOyBzb3VyY2VUcmVl
ID0gIjxncm91cD4iOyB9OwogCQkxNUM3NzBBNDEwMEQ0MUNEMDA1QkEyNjcgLyogRE9NVmFsaWRp
dHlTdGF0ZS5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7
IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNlY29kZS5jLmg7IHBhdGggPSBET01WYWxpZGl0eVN0
YXRlLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTE2M0U4OEY0MTE4QTM5RDIwMEVE
OTIzMSAvKiBTaW1wbGVGb250RGF0YUFUU1VJLmNwcCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJl
bmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuY3Bw
LmNwcDsgcGF0aCA9IFNpbXBsZUZvbnREYXRhQVRTVUkuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91
cD4iOyB9OworCQkxNjNFODhGNTExOEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERhdGFDb3Jl
VGV4dC5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsg
bGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmNwcC5jcHA7IHBhdGggPSBTaW1wbGVGb250
RGF0YUNvcmVUZXh0LmNwcDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgfTsKIAkJMTg1QkNGMjYw
RjMyNzlDRTAwMEVBMjYyIC8qIFRocmVhZFRpbWVycy5jcHAgKi8gPSB7aXNhID0gUEJYRmlsZVJl
ZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmNwcC5jcHA7IHBhdGggPSBUaHJlYWRUaW1lcnMuY3BwOyBzb3VyY2VUcmVlID0gIjxncm91cD4i
OyB9OwogCQkxODVCQ0YyNzBGMzI3OUNFMDAwRUEyNjIgLyogVGhyZWFkVGltZXJzLmggKi8gPSB7
aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IFRocmVhZFRpbWVycy5oOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQkxODg2MDRCMTBGMkU2NTRBMDAwQjY0NDMgLyogRE9NVGltZXIuY3Bw
ICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVFbmNvZGluZyA9IDQ7IGxhc3RLbm93
bkZpbGVUeXBlID0gc291cmNlY29kZS5jcHAuY3BwOyBwYXRoID0gRE9NVGltZXIuY3BwOyBzb3Vy
Y2VUcmVlID0gIjxncm91cD4iOyB9OwpAQCAtMTQ2MTYsNiArMTQ2MjAsOCBAQAogCQlCMjc1MzU0
OTBCMDUzODE0MDAyQ0U2NEYgLyogbWFjICovID0gewogCQkJaXNhID0gUEJYR3JvdXA7CiAJCQlj
aGlsZHJlbiA9ICgKKwkJCQkxNjNFODhGNDExOEEzOUQyMDBFRDkyMzEgLyogU2ltcGxlRm9udERh
dGFBVFNVSS5jcHAgKi8sCisJCQkJMTYzRTg4RjUxMThBMzlEMjAwRUQ5MjMxIC8qIFNpbXBsZUZv
bnREYXRhQ29yZVRleHQuY3BwICovLAogCQkJCTQ5QzdCOUZEMTA0MkQzOEMwMDA5RDQ0NyAvKiBD
YW52YXMzRExheWVyLmggKi8sCiAJCQkJNDlDN0I5RkUxMDQyRDM4QzAwMDlENDQ3IC8qIENhbnZh
czNETGF5ZXIubW0gKi8sCiAJCQkJRURFM0E0RkYwQzdBNDMwNjAwOTU2QTM3IC8qIENvbG9yTWFj
LmggKi8sCkBAIC0yMTE0NSw2ICsyMTE1MSw4IEBACiAJCQkJMEZGMjg1OTIxMTg2NDA1NDAwN0I3
Q0Q2IC8qIFJlbmRlck1hdGhNTFNxdWFyZVJvb3QuY3BwIGluIFNvdXJjZXMgKi8sCiAJCQkJQjUy
M0NGMDkxMTgyNjc1NDAwRUJCMjlDIC8qIFNRTFRyYW5zYWN0aW9uU3luYy5jcHAgaW4gU291cmNl
cyAqLywKIAkJCQlCNTIzQ0YwQTExODI2NzU0MDBFQkIyOUMgLyogRGF0YWJhc2VTeW5jLmNwcCBp
biBTb3VyY2VzICovLAorCQkJCTE2M0U4OEY2MTE4QTM5RDIwMEVEOTIzMSAvKiBTaW1wbGVGb250
RGF0YUFUU1VJLmNwcCBpbiBTb3VyY2VzICovLAorCQkJCTE2M0U4OEY3MTE4QTM5RDIwMEVEOTIz
MSAvKiBTaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcCBpbiBTb3VyY2VzICovLAogCQkJKTsKIAkJ
CXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDogV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFBVFNVSS5jcHAKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFBVFNV
SS5jcHAJKHJldmlzaW9uIDU4NTIwKQkoZnJvbSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21h
Yy9TaW1wbGVGb250RGF0YU1hYy5tbTo1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1LCAyMDA2IEFwcGxlIENvbXB1dGVyLCBJ
bmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFsZXhleSBQ
cm9za3VyeWFrb3YKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4gIE5laXRoZXIgdGhlIG5hbWUg
b2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0aGUgbmFtZXMgb2YKKyAqICAg
ICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9k
dWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMg
cHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIlNpbXBsZUZvbnREYXRh
LmgiCisKKyNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgorI2ltcG9ydCAiQ29sb3IuaCIKKyNp
bXBvcnQgIkZsb2F0UmVjdC5oIgorI2ltcG9ydCAiRm9udC5oIgorI2ltcG9ydCAiRm9udENhY2hl
LmgiCisjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKKyNpbXBvcnQgIlNoYXJlZEJ1ZmZlci5o
IgorI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgorI2ltcG9ydCA8QXBwS2l0L0Fw
cEtpdC5oPgorI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2Vz
Lmg+CisjaW1wb3J0IDxmbG9hdC5oPgorI2ltcG9ydCA8dW5pY29kZS91Y2hhci5oPgorI2ltcG9y
dCA8d3RmL0Fzc2VydGlvbnMuaD4KKyNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKyNpbXBv
cnQgPHd0Zi9SZXRhaW5QdHIuaD4KKyNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5oPgorCitAaW50
ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQorLSAoQk9PTClfaXNGYWtlRml4ZWRQ
aXRjaDsKK0BlbmQKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworICAKK2NvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9IDAuN2Y7Citz
dGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2lnbmVkIHVuaXRz
UGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9CisKK3N0YXRpYyBib29sIGluaXRGb250
RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCit7CisgICAgaWYgKCFmb250RGF0YS0+cGxh
dGZvcm1EYXRhKCkuY2dGb250KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworI2lmZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKKyAgICBpZiAoQVRTVUNy
ZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SWQpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250
U3R5bGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQVRTVUF0dHJpYnV0
ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7CisgICAgQnl0ZUNvdW50IHNpemUgPSBzaXplb2YoQVRT
VUZvbnRJRCk7CisgICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9udElkfTsKKyAg
ICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUsIDEsICZ0YWcs
ICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOworICAgIGlmIChzdGF0dXMgIT0gbm9F
cnIpIHsKKyAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChmb250U3R5bGUs
ICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgeworICAgICAgICBBVFNVRGlzcG9z
ZVN0eWxlKGZvbnRTdHlsZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBB
VFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7CisjZW5kaWYKKworICAgIHJldHVybiB0cnVlOwor
fQorCitzdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lkKQoreworICAg
IERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFsbGJhY2tGb250
RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5TmFtZV0pKTsK
KyAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOworfQorCisjaWYgIUVSUk9S
X0RJU0FCTEVECisjaWZkZWYgX19MUDY0X18KK3N0YXRpYyBOU1N0cmluZyogcGF0aEZyb21Gb250
KE5TRm9udCopCit7CisgICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMgbm90IGF2YWls
YWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9yIGRlYnVnZ2lu
ZworICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUuCisgICAgcmV0
dXJuIG5pbDsKK30KKyNlbHNlCitzdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9udChOU0ZvbnQg
KmZvbnQpCit7CisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgQVRTRm9udFJlZiBhdHNG
b250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1Gb250KHRvQ1RG
b250UmVmKGZvbnQpLCAwKSk7CisjZWxzZQorICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0
QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7CisjZW5kaWYK
KyAgICBGU1JlZiBmaWxlUmVmOworCisjaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgT1NT
dGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwgJmZpbGVSZWYp
OworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7CisjZWxzZQor
ICAgIEZTU3BlYyBvRmlsZTsKKyAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0RmlsZVNw
ZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKKyAgICBpZiAoc3RhdHVzICE9IG5vRXJyKQor
ICAgICAgICByZXR1cm4gbmlsOworCisgICAgc3RhdHVzID0gRlNwTWFrZUZTUmVmKCZvRmlsZSwg
JmZpbGVSZWYpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7
CisjZW5kaWYKKworICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsKKyAgICBzdGF0
dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFUSF9NQVgpOwor
ICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCisgICAgICAgIHJldHVybiBbTlNTdHJpbmcgc3RyaW5n
V2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKKworICAgIHJldHVy
biBuaWw7Cit9CisjZW5kaWYgLy8gX19MUDY0X18KKyNlbmRpZiAvLyAhRVJST1JfRElTQUJMRUQK
Kwordm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKK3sKKyNpZmRlZiBCVUlMRElO
R19PTl9USUdFUgorICAgIG1fc3R5bGVHcm91cCA9IDA7CisjZW5kaWYKKyNpZiBVU0UoQVRTVUkp
CisgICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9
IGZhbHNlOworICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7CisjZW5kaWYKKworICAgIG1fc3lu
dGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCA/IDEuMGYg
OiAwLmY7CisKKyAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7CisgICAgaWYgKCFpbml0Rm9u
dERhdGEodGhpcykpIHsKKyAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBiYWQgaGFwcGVu
ZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCisgICAgICAgIC8vIFRyeSBsb29raW5nIGZvciBhbiBh
bHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCisKKyAgICAgICAgLy8gU3Bl
Y2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNlIG9mICJUaW1l
cyIuCisgICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9zZSBmYW1pbHkg
bmFtZSBpcyAiVGltZXMiLgorICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5vcm1hbCAiVGlt
ZXMiIGZhbWlseSBmb250LgorICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8gaGF2ZSBhIGNv
cnJ1cHQgcmVndWxhciB2YXJpYW50LgorICAgICAgICBOU1N0cmluZyAqZmFsbGJhY2tGb250RmFt
aWx5OworICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0gaXNF
cXVhbDpAIlRpbWVzIl0pCisgICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkgPSBAIlRpbWVz
IE5ldyBSb21hbiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZhbGxiYWNrRm9udEZhbWls
eSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOworICAgICAgICAKKyAgICAgICAgLy8gVHJ5IHNl
dHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgorICAgICAgICAvLyBUaGlzIGlzIGEgbGFzdCBk
aXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRoaW5nIGhhcyBn
b25lIHdyb25nLgorI2lmICFFUlJPUl9ESVNBQkxFRAorICAgICAgICBSZXRhaW5QdHI8TlNGb250
PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKKyNlbmRpZgorICAgICAgICBp
ZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0
Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250Om1fcGxh
dGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250IGZvbnRXaXRo
TmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXplKCldKTsKKyNp
ZiAhRVJST1JfRElTQUJMRUQKKyAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0gcGF0aEZyb21G
b250KGluaXRpYWxGb250LmdldCgpKTsKKyAgICAgICAgaWYgKCFmaWxlUGF0aCkKKyAgICAgICAg
ICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOworI2VuZGlmCisgICAgICAgIGlmICghaW5pdEZv
bnREYXRhKHRoaXMpKSB7CisgICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZhbWlseSBpc0Vx
dWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKKyAgICAgICAgICAgICAgICAvLyBPSywgY291bGRu
J3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1lcywgZmFsbGJh
Y2sKKyAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0aGlzIGZhaWxz
IHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KKyAgICAgICAgICAgICAgICBtX3BsYXRmb3Jt
RGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0gY29udmVydEZv
bnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9udEZhbWlseSgp
XSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKKyAgICAgICAg
ICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4sIGFuZCB0aGUg
c3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgorICAgICAgICAgICAgICAg
ICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIs
IGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgICAgIGZhaWxl
ZFNldHVwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBhbmQgdGhlIHN5
c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KKyAgICAgICAgICAgICAgICBM
T0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAlQCIsIGluaXRp
YWxGb250LmdldCgpLCBmaWxlUGF0aCk7CisgICAgICAgICAgICAgICAgZmFpbGVkU2V0dXAgPSB0
cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRoZSBw
cm9ibGVtLgorICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3RlZCwgdXNpbmcg
JUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKKyAgICAgICAgICAgIFttX3Bs
YXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQoKSBmYW1pbHlO
YW1lXSwgZmlsZVBhdGgpOworICAgIH0KKworICAgIC8vIElmIGFsbCBlbHNlIGZhaWxzLCB0cnkg
dG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KKyAgICAvLyBUaGlzIGlzIHByb2JhYmx5
IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2YWlsYWJsZS4K
KyAgICBpZiAoZmFpbGVkU2V0dXApIHsKKyAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChb
TlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBwb2ludFNpemVd
XSk7CisgICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1c2luZyBzeXN0
ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7CisgICAgICAgIGluaXRGb250RGF0
YSh0aGlzKTsKKyAgICB9CisgICAgCisgICAgaW50IGlBc2NlbnQ7CisgICAgaW50IGlEZXNjZW50
OworICAgIGludCBpTGluZUdhcDsKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIHdrR2V0
Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAmaURlc2NlbnQs
ICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7CisjZWxzZQorICAgIGlBc2NlbnQgPSBDR0ZvbnRH
ZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOworICAgIGlEZXNjZW50ID0gQ0dGb250
R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7CisgICAgaUxpbmVHYXAgPSBDR0Zv
bnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyAgICBtX3VuaXRzUGVyRW0g
PSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKKyNlbmRpZgor
CisgICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIGZsb2F0
IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRT
aXplOworICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNjZW50LCBtX3Vu
aXRzUGVyRW0pICogcG9pbnRTaXplOworICAgIGZsb2F0IGZMaW5lR2FwID0gc2NhbGVFbVRvVW5p
dHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisKKyAgICAvLyBXZSBuZWVk
IHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9zZWx5IG1hdGNo
IHRoZQorICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0IGNvdW50ZXJw
YXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KKyAgICAvLyB3ZWIgc3RhbmRhcmQuIFRoZSBBcHBL
aXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKKyAgICAvLyBpbmNvcnJlY3Rs
eSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3RtZW50IGluc3Rl
YWQKKyAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCisgICAgTlNTdHJpbmcgKmZhbWls
eU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOworICAgIGlmIChbZmFt
aWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxU
b1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0cmluZzpAIkNv
dXJpZXIiXSkKKyAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsgZkRlc2NlbnQp
ICogMC4xNWYpICsgMC41Zik7CisgICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3Ry
aW5nOkAiR2VlemEgUHJvIl0pIHsKKyAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBnbHlwaHMgdGhh
dCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRoZSBkZXNjZW50
LiBBZGp1c3QKKyAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBiZXR0ZXIgbWF0
Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Ygb25lIGxpbmUK
KyAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9wIG9mIHRoZSBu
ZXh0IGxpbmUuCisgICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7CisgICAgICAgIGZEZXNjZW50ICo9
IDIuZjsKKyAgICB9CisKKyAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7CisgICAgbV9k
ZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7CisgICAgbV9saW5lR2FwID0gbHJvdW5kZihmTGlu
ZUdhcCk7CisgICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50ICsgbV9saW5l
R2FwOworICAgIAorICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRvIGFsbG93IHJv
b20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCisgICAgLy8gPHJkYXI6Ly9wcm9ibGVtLzUz
ODYxODM+CisgICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMgJiYgW2ZhbWls
eU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgeworICAgICAgICBtX2xpbmVHYXAgLT0gMyAt
IG1fZGVzY2VudDsKKyAgICAgICAgbV9kZXNjZW50ID0gMzsKKyAgICB9CisgICAgCisgICAgLy8g
TWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0IHN5bnRoZXNp
emVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9udC4KKyAgICAv
LyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBzbyB3ZSBkb24n
dCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgorICAgIEdseXBoUGFnZSogZ2x5cGhQYWdlWmVy
byA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBhZ2UoKTsKKyAg
ICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJvLT5nbHlwaERh
dGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7CisgICAgaWYgKHhHbHlwaCkgeworICAgICAg
ICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdSZWN0Rm9yR2x5
cGg6eEdseXBoXTsKKyAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhlciB3aWR0aCBv
ciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQorICAgICAgICAvLyBhbmQgd2Vi
IHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGggd2lsbCBiZSBs
YWlkIG91dAorICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3VyYXRlIGhlaWdo
dC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAorICAgICAgICAvLyB3aGljaCBoYXMg
YW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KKyAgICAgICAgbV94SGVpZ2h0ID0gbWF4KE5TTWF4
WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKKyAgICB9IGVsc2UKKyAgICAgICAgbV94SGVpZ2h0ID0g
W21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKK30KKyAgICAKK3N0YXRpYyBDRkRhdGFS
ZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3JtRGF0YSwgRm91
ckNoYXJDb2RlIHRhYmxlTmFtZSkKK3sKKyNpZmRlZiBCVUlMRElOR19PTl9USUdFUgorICAgIEFU
U0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRmb3JtRGF0YS5t
X2F0c3VGb250SUQpOworCisgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICBpZiAoQVRTRm9u
dEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxlU2l6ZSkgIT0g
bm9FcnIpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGTXV0YWJsZURhdGFSZWYgZGF0
YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFibGVTaXplKTsK
KyAgICBpZiAoIWRhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIAorICAgIENGRGF0YUluY3Jl
YXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7CisgICAgaWYgKEFUU0ZvbnRHZXRUYWJsZShhdHNG
b250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIoZGF0
YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7CisgICAgICAgIENGUmVsZWFzZShkYXRhKTsKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIAorICAgIHJldHVybiBkYXRhOworI2Vsc2UKKyAg
ICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgdGFi
bGVOYW1lKTsKKyNlbmRpZgorfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybUNoYXJX
aWR0aEluaXQoKQoreworICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKKyAgICBtX21heENoYXJXaWR0
aCA9IDA7CisgICAgCisgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUoQWRvcHRDRiwg
Y29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7CisgICAgaWYgKG9z
MlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkgeworICAgICAg
ICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5nZXQoKSk7Cisg
ICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBvczJbM107Cisg
ICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hhcldpZHRoLCBt
X3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIFJldGFp
blB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9yVGFnKG1f
cGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKKyAgICBpZiAoaGVhZFRhYmxlICYmIENGRGF0YUdldExl
bmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7CisgICAgICAgIGNvbnN0IFVJbnQ4KiBoZWFk
ID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOworICAgICAgICB1c2hvcnQgdXhN
aW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOworICAgICAgICB1c2hvcnQgdXhNYXggPSBo
ZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOworICAgICAgICBTSW50MTYgeE1pbiA9IHN0YXRpY19j
YXN0PFNJbnQxNj4odXhNaW4pOworICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRpY19jYXN0PFNJ
bnQxNj4odXhNYXgpOworICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHhN
YXggLSB4TWluKTsKKyAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9Vbml0cyhkaWZm
LCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOworICAgIH0KKworICAgIC8v
IEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdpbGwgcG9wdWxh
dGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KKyAgICBpbml0Q2hhcldp
ZHRocygpOworfQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ryb3koKQorewor
I2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgaWYgKG1fc3R5bGVHcm91cCkKKyAgICAgICAg
d2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOworI2VuZGlmCisjaWYgVVNFKEFUU1VJ
KQorICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVuZCA9IG1fQVRT
VVN0eWxlTWFwLmVuZCgpOworICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRTVVN0eWxlPjo6
aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisg
ICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7CisjZW5kaWYKK30KKworU2ltcGxl
Rm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25zdCBGb250RGVz
Y3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKK3sKKyAgICBpZiAoIW1fc21hbGxDYXBz
Rm9udERhdGEpIHsKKyAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRhKTsKKyAgICAg
ICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6
ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKKyAgICAgICAgICAgIG1fc21hbGxDYXBz
Rm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEsIHRydWUsIGZh
bHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJFR0lOX0JMT0NLX09CSkNfRVhD
RVBUSU9OUzsKKyAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgp
IHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7CisgICAgICAgICAgICBG
b250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRN
YW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXplOnNpemVdKTsK
KyAgICAgICAgICAgIAorICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUgdHlwZSBpbmZv
cm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250IHRvIGEgZGlm
ZmVyZW50IHNpemUuCisgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZm9udCB0
aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgorICAgICAgICAgICAgc21hbGxDYXBzRm9udC5zZXRGb250
KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0ZvbnQuZm9udCgp
IHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250XSk7CisKKyAg
ICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgeworICAgICAgICAgICAgICAgIE5T
Rm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFn
ZXJdOworICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRzID0gW2ZvbnRN
YW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOworCisgICAgICAgICAg
ICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKKyAgICAgICAgICAgICAg
ICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKKyAgICAgICAgICAgICAgICBpZiAo
bV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQorICAgICAgICAgICAgICAgICAgICBm
b250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7CisKKyAgICAgICAgICAgICAgICBOU0ZvbnRU
cmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6
c21hbGxDYXBzRm9udC5mb250KCldOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnQubV9z
eW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYgIShzbWFsbENh
cHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOworICAgICAgICAgICAgICAgIHNtYWxsQ2Fw
c0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNr
KSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsKKworICAgICAg
ICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0Q2FjaGVkRm9u
dERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRU5EX0JM
T0NLX09CSkNfRVhDRVBUSU9OUzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbV9zbWFs
bENhcHNGb250RGF0YTsKK30KKworYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFpbnNDaGFyYWN0
ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAoreworICAgIE5T
U3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJhY3RlcnNOb0Nv
cHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0aCBmcmVlV2hl
bkRvbmU6Tk9dOworICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZvcm1EYXRhLmZv
bnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07CisgICAgYm9vbCByZXN1bHQg
PSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxvY2F0aW9uID09
IE5TTm90Rm91bmQ7CisgICAgW3N0cmluZyByZWxlYXNlXTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCit2b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCit7CisgICAgTlNGb250
KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOworICAgIC8vIFNwZWNpYWwgY2FzZSBPc2FrYS1N
b25vLgorICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIHNo
b3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCB0
aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgorCisg
ICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCisgICAgLy8gQWNjb3JkaW5nIHRvIDxyZGFy
Oi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290aGljIGFzIGZp
eGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQgTVMtUEdvdGhp
YyBhcyBmaXhlZCBwaXRjaC4KKworICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlwZUNvcnNpdmEK
KyAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3ZSBzaG91bGQg
bm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKyAgICAvLyBOb3RlIHRo
YXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KKwor
ICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOworICAgIG1fdHJlYXRBc0ZpeGVkUGl0
Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0gfHwKKyAgICAg
ICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9PSBOU09y
ZGVyZWRTYW1lKSAmJgorICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOkAi
TVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKKyAgICAgICAgICAgW25hbWUgY2FzZUlu
c2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJlZFNhbWU7Cit9
CisKK0Zsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JHbHlwaChHbHlw
aCBnbHlwaCkgY29uc3QKK3sKKyAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7CisjaWZuZGVmIEJV
SUxESU5HX09OX1RJR0VSCisgICAgQ0dSZWN0IGJveDsKKyAgICBDR0ZvbnRHZXRHbHlwaEJCb3hl
cyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKKyAgICBmbG9hdCBw
b2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7CisgICAgQ0dGbG9hdCBzY2FsZSA9IHBv
aW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKKyAgICBib3VuZGluZ0JveCA9IENHUmVjdEFwcGx5QWZm
aW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2NhbGUsIC1zY2Fs
ZSkpOworICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCisgICAgICAgIGJvdW5kaW5nQm94
LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRPZmZzZXQpOwor
I2Vsc2UKKyAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOworI2VuZGlmCisgICAgcmV0dXJuIGJvdW5k
aW5nQm94OworfQorCitmbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0aEZvckdseXBo
KEdseXBoIGdseXBoKSBjb25zdAoreworICAgIE5TRm9udCogZm9udCA9IHBsYXRmb3JtRGF0YSgp
LmZvbnQoKTsKKyAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Cisg
ICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNjYWxlKHBvaW50
U2l6ZSwgcG9pbnRTaXplKTsKKyAgICBDR1NpemUgYWR2YW5jZTsKKyAgICBpZiAoIXdrR2V0R2x5
cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBmb250LCAmbSwg
JmdseXBoLCAmYWR2YW5jZSkpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUgdG8gY2FjaGUg
Z2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9pbnRTaXplKTsK
KyAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7CisgICAgfQorICAgIHJldHVybiBhZHZhbmNlLndp
ZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OworfQorCisjaWYgVVNFKEFUU1VJKQordm9pZCBT
aW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAoreworICAgIEFTU0VSVCgh
bV9jaGVja2VkU2hhcGVzQXJhYmljKTsKKworICAgIG1fY2hlY2tlZFNoYXBlc0FyYWJpYyA9IHRy
dWU7CisgICAgCisgICAgQVRTVUZvbnRJRCBmb250SUQgPSBtX3BsYXRmb3JtRGF0YS5tX2F0c3VG
b250SUQ7CisgICAgaWYgKCFmb250SUQpIHsKKyAgICAgICAgTE9HX0VSUk9SKCJ1bmFibGUgdG8g
Z2V0IEFUU1VGb250SUQgZm9yICVAIiwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgb24g
Zm9udHMgdGhhdCBjb250YWluIEFyYWJpYyBnbHlwaHMuIE91cgorICAgIC8vIGhldXJpc3RpYyBp
cyB0aGF0IGlmIHN1Y2ggYSBmb250IGhhcyBhIGdseXBoIG1ldGFtb3JwaG9zaXMgdGFibGUsIHRo
ZW4KKyAgICAvLyBpdCBpbmNsdWRlcyBzaGFwaW5nIGluZm9ybWF0aW9uIGZvciBBcmFiaWMuCisg
ICAgRm91ckNoYXJDb2RlIHRhYmxlc1tdID0geyAnbW9yeCcsICdtb3J0JyB9OworICAgIGZvciAo
dW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGVzKSAvIHNpemVvZih0YWJsZXNbMF0pOyAr
K2kpIHsKKyAgICAgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKKyAgICAgICAgT1NTdGF0dXMgc3Rh
dHVzID0gQVRTRm9udEdldFRhYmxlKGZvbnRJRCwgdGFibGVzW2ldLCAwLCAwLCAwLCAmdGFibGVT
aXplKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgeworICAgICAgICAgICAgbV9zaGFw
ZXNBcmFiaWMgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAg
ICAgaWYgKHN0YXR1cyAhPSBrQVRTSW52YWxpZEZvbnRUYWJsZUFjY2VzcykKKyAgICAgICAgICAg
IExPR19FUlJPUigiQVRTRm9udEdldFRhYmxlIGZhaWxlZCAoJWQpIiwgc3RhdHVzKTsKKyAgICB9
Cit9CisjZW5kaWYKKworI2lmIFVTRShDT1JFX1RFWFQpCitDVEZvbnRSZWYgU2ltcGxlRm9udERh
dGE6OmdldENURm9udCgpIGNvbnN0Cit7CisgICAgaWYgKGdldE5TRm9udCgpKQorICAgICAgICBy
ZXR1cm4gdG9DVEZvbnRSZWYoZ2V0TlNGb250KCkpOworICAgIGlmICghbV9DVEZvbnQpCisgICAg
ICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNzRm9udChtX3BsYXRm
b3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCBOVUxMLCBOVUxMKSk7Cisg
ICAgcmV0dXJuIG1fQ1RGb250LmdldCgpOworfQorCitDRkRpY3Rpb25hcnlSZWYgU2ltcGxlRm9u
dERhdGE6OmdldENGU3RyaW5nQXR0cmlidXRlcyhUeXBlc2V0dGluZ0ZlYXR1cmVzIHR5cGVzZXR0
aW5nRmVhdHVyZXMpIGNvbnN0Cit7CisgICAgdW5zaWduZWQga2V5ID0gdHlwZXNldHRpbmdGZWF0
dXJlcyArIDE7CisgICAgcGFpcjxIYXNoTWFwPHVuc2lnbmVkLCBSZXRhaW5QdHI8Q0ZEaWN0aW9u
YXJ5UmVmPiA+OjppdGVyYXRvciwgYm9vbD4gYWRkUmVzdWx0ID0gbV9DRlN0cmluZ0F0dHJpYnV0
ZXMuYWRkKGtleSwgUmV0YWluUHRyPENGRGljdGlvbmFyeVJlZj4oKSk7CisgICAgUmV0YWluUHRy
PENGRGljdGlvbmFyeVJlZj4mIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5ID0gYWRkUmVzdWx0LmZpcnN0
LT5zZWNvbmQ7CisgICAgaWYgKCFhZGRSZXN1bHQuc2Vjb25kKQorICAgICAgICByZXR1cm4gYXR0
cmlidXRlc0RpY3Rpb25hcnkuZ2V0KCk7CisKKyAgICBib29sIGFsbG93TGlnYXR1cmVzID0gcGxh
dGZvcm1EYXRhKCkuYWxsb3dzTGlnYXR1cmVzKCkgfHwgKHR5cGVzZXR0aW5nRmVhdHVyZXMgJiBM
aWdhdHVyZXMpOworCisgICAgc3RhdGljIGNvbnN0IGludCBsaWdhdHVyZXNOb3RBbGxvd2VkVmFs
dWUgPSAwOworICAgIHN0YXRpYyBDRk51bWJlclJlZiBsaWdhdHVyZXNOb3RBbGxvd2VkID0gQ0ZO
dW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVySW50VHlwZSwgJmxpZ2F0
dXJlc05vdEFsbG93ZWRWYWx1ZSk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc0Fs
bG93ZWRWYWx1ZSA9IDE7CisgICAgc3RhdGljIENGTnVtYmVyUmVmIGxpZ2F0dXJlc0FsbG93ZWQg
PSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAm
bGlnYXR1cmVzQWxsb3dlZFZhbHVlKTsKKworICAgIGlmICghKHR5cGVzZXR0aW5nRmVhdHVyZXMg
JiBLZXJuaW5nKSkgeworICAgICAgICBzdGF0aWMgY29uc3QgZmxvYXQga2VybmluZ0FkanVzdG1l
bnRWYWx1ZSA9IDA7CisgICAgICAgIHN0YXRpYyBDRk51bWJlclJlZiBrZXJuaW5nQWRqdXN0bWVu
dCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckZsb2F0VHlw
ZSwgJmtlcm5pbmdBZGp1c3RtZW50VmFsdWUpOworICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCog
a2V5c1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsga0NURm9udEF0dHJpYnV0ZU5hbWUsIGtDVEtl
cm5BdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsKKyAgICAgICAgY29u
c3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZFtdID0geyBnZXRDVEZvbnQoKSwga2Vy
bmluZ0FkanVzdG1lbnQsIGFsbG93TGlnYXR1cmVzCisgICAgICAgICAgICA/IGxpZ2F0dXJlc0Fs
bG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07CisgICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9u
YXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0Rpc2Fi
bGVkLCB2YWx1ZXNXaXRoS2VybmluZ0Rpc2FibGVkLAorICAgICAgICAgICAgc2l6ZW9mKGtleXNX
aXRoS2VybmluZ0Rpc2FibGVkKSAvIHNpemVvZigqa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQpLAor
ICAgICAgICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlw
ZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEJ5
IG9taXR0aW5nIHRoZSBrQ1RLZXJuQXR0cmlidXRlTmFtZSBhdHRyaWJ1dGUsIHdlIGdldCBDb3Jl
IFRleHQncyBzdGFuZGFyZCBrZXJuaW5nLgorICAgICAgICBzdGF0aWMgY29uc3Qgdm9pZCoga2V5
c1dpdGhLZXJuaW5nRW5hYmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUTGlnYXR1
cmVBdHRyaWJ1dGVOYW1lIH07CisgICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5n
RW5hYmxlZFtdID0geyBnZXRDVEZvbnQoKSwgYWxsb3dMaWdhdHVyZXMgPyBsaWdhdHVyZXNBbGxv
d2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OworICAgICAgICBhdHRyaWJ1dGVzRGljdGlvbmFy
eS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShOVUxMLCBrZXlzV2l0aEtlcm5pbmdFbmFibGVk
LCB2YWx1ZXNXaXRoS2VybmluZ0VuYWJsZWQsCisgICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhL
ZXJuaW5nRW5hYmxlZCkgLyBzaXplb2YoKmtleXNXaXRoS2VybmluZ0VuYWJsZWQpLAorICAgICAg
ICAgICAgJmtDRkNvcHlTdHJpbmdEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzLCAma0NGVHlwZURpY3Rp
b25hcnlWYWx1ZUNhbGxCYWNrcykpOworICAgIH0KKworICAgIHJldHVybiBhdHRyaWJ1dGVzRGlj
dGlvbmFyeS5nZXQoKTsKK30KKworI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKSW5k
ZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3Bw
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnRE
YXRhQVRTVUkuY3BwCShyZXZpc2lvbiA1ODUyMCkKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvbWFjL1NpbXBsZUZvbnREYXRhQVRTVUkuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMCw0MTUg
KzMwLDE4IEBACiAjaW1wb3J0ICJjb25maWcuaCIKICNpbXBvcnQgIlNpbXBsZUZvbnREYXRhLmgi
CiAKLSNpbXBvcnQgIkJsb2NrRXhjZXB0aW9ucy5oIgotI2ltcG9ydCAiQ29sb3IuaCIKLSNpbXBv
cnQgIkZsb2F0UmVjdC5oIgorI2lmIFVTRShBVFNVSSkKKwogI2ltcG9ydCAiRm9udC5oIgogI2lt
cG9ydCAiRm9udENhY2hlLmgiCiAjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKLSNpbXBvcnQg
IlNoYXJlZEJ1ZmZlci5oIgotI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgotI2lt
cG9ydCA8QXBwS2l0L0FwcEtpdC5oPgogI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBs
aWNhdGlvblNlcnZpY2VzLmg+Ci0jaW1wb3J0IDxmbG9hdC5oPgotI2ltcG9ydCA8dW5pY29kZS91
Y2hhci5oPgogI2ltcG9ydCA8d3RmL0Fzc2VydGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9TdGRMaWJF
eHRyYXMuaD4KLSNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBvcnQgPHd0Zi9VbnVzZWRQ
YXJhbS5oPgotCi1AaW50ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQotLSAoQk9P
TClfaXNGYWtlRml4ZWRQaXRjaDsKLUBlbmQKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFt
ZXNwYWNlIFdlYkNvcmUgewotICAKLWNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlw
bGllciA9IDAuN2Y7Ci1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgs
IHVuc2lnbmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9Ci0KLXN0YXRp
YyBib29sIGluaXRGb250RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCi17Ci0gICAgaWYg
KCFmb250RGF0YS0+cGxhdGZvcm1EYXRhKCkuY2dGb250KCkpCi0gICAgICAgIHJldHVybiBmYWxz
ZTsKLQotI2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsK
LSAgICBpZiAoQVRTVUNyZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQotICAgICAgICBy
ZXR1cm4gZmFsc2U7Ci0KLSAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9y
bURhdGEoKS5tX2F0c3VGb250SUQ7Ci0gICAgaWYgKCFmb250SWQpIHsKLSAgICAgICAgQVRTVURp
c3Bvc2VTdHlsZShmb250U3R5bGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0g
ICAgQVRTVUF0dHJpYnV0ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7Ci0gICAgQnl0ZUNvdW50IHNp
emUgPSBzaXplb2YoQVRTVUZvbnRJRCk7Ci0gICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9
IHsmZm9udElkfTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250
U3R5bGUsIDEsICZ0YWcsICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOwotICAgIGlm
IChzdGF0dXMgIT0gbm9FcnIpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUp
OwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHdrR2V0QVRTU3R5bGVH
cm91cChmb250U3R5bGUsICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgewotICAg
ICAgICBBVFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsK
LSAgICB9Ci0KLSAgICBBVFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0jZW5kaWYKLQotICAg
IHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWls
eSh2b2lkKQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwg
d2ViRmFsbGJhY2tGb250RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0g
ZmFtaWx5TmFtZV0pKTsKLSAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOwot
fQotCi0jaWYgIUVSUk9SX0RJU0FCTEVECi0jaWZkZWYgX19MUDY0X18KLXN0YXRpYyBOU1N0cmlu
ZyogcGF0aEZyb21Gb250KE5TRm9udCopCi17Ci0gICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZv
bnQgaXMgbm90IGF2YWlsYWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVz
ZWQgZm9yIGRlYnVnZ2luZwotICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2Vw
dGFibGUuCi0gICAgcmV0dXJuIG5pbDsKLX0KLSNlbHNlCi1zdGF0aWMgTlNTdHJpbmcqIHBhdGhG
cm9tRm9udChOU0ZvbnQgKmZvbnQpCi17Ci0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAg
QVRTRm9udFJlZiBhdHNGb250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxh
dGZvcm1Gb250KHRvQ1RGb250UmVmKGZvbnQpLCAwKSk7Ci0jZWxzZQotICAgIEFUU0ZvbnRSZWYg
YXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChm
b250KSk7Ci0jZW5kaWYKLSAgICBGU1JlZiBmaWxlUmVmOwotCi0jaWZuZGVmIEJVSUxESU5HX09O
X1RJR0VSCi0gICAgT1NTdGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRz
Rm9udCwgJmZpbGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVy
biBuaWw7Ci0jZWxzZQotICAgIEZTU3BlYyBvRmlsZTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBB
VFNGb250R2V0RmlsZVNwZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKLSAgICBpZiAoc3Rh
dHVzICE9IG5vRXJyKQotICAgICAgICByZXR1cm4gbmlsOwotCi0gICAgc3RhdHVzID0gRlNwTWFr
ZUZTUmVmKCZvRmlsZSwgJmZpbGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAg
ICAgIHJldHVybiBuaWw7Ci0jZW5kaWYKLQotICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhf
TUFYXTsKLSAgICBzdGF0dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZl
ciwgUEFUSF9NQVgpOwotICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBb
TlNTdHJpbmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVy
XTsKLQotICAgIHJldHVybiBuaWw7Ci19Ci0jZW5kaWYgLy8gX19MUDY0X18KLSNlbmRpZiAvLyAh
RVJST1JfRElTQUJMRUQKLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsK
LSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgotICAgIG1fc3R5bGVHcm91cCA9IDA7Ci0jZW5kaWYK
LSNpZiBVU0UoQVRTVUkpCi0gICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOwotICAgIG1fY2hlY2tl
ZFNoYXBlc0FyYWJpYyA9IGZhbHNlOwotICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7Ci0jZW5k
aWYKLQotICAgIG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhl
dGljQm9sZCA/IDEuMGYgOiAwLmY7Ci0KLSAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7Ci0g
ICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKLSAgICAgICAgLy8gQWNrISBTb21ldGhpbmcg
dmVyeSBiYWQgaGFwcGVuZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCi0gICAgICAgIC8vIFRyeSBs
b29raW5nIGZvciBhbiBhbHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCi0K
LSAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGlu
IHBsYWNlIG9mICJUaW1lcyIuCi0gICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9u
dCB3aG9zZSBmYW1pbHkgbmFtZSBpcyAiVGltZXMiLgotICAgICAgICAvLyBJdCBvdmVycmlkZXMg
dGhlIG5vcm1hbCAiVGltZXMiIGZhbWlseSBmb250LgotICAgICAgICAvLyBJdCBhbHNvIGFwcGVh
cnMgdG8gaGF2ZSBhIGNvcnJ1cHQgcmVndWxhciB2YXJpYW50LgotICAgICAgICBOU1N0cmluZyAq
ZmFsbGJhY2tGb250RmFtaWx5OwotICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkg
ZmFtaWx5TmFtZV0gaXNFcXVhbDpAIlRpbWVzIl0pCi0gICAgICAgICAgICBmYWxsYmFja0ZvbnRG
YW1pbHkgPSBAIlRpbWVzIE5ldyBSb21hbiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZh
bGxiYWNrRm9udEZhbWlseSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOwotICAgICAgICAKLSAg
ICAgICAgLy8gVHJ5IHNldHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgotICAgICAgICAvLyBU
aGlzIGlzIGEgbGFzdCBkaXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4g
c29tZXRoaW5nIGhhcyBnb25lIHdyb25nLgotI2lmICFFUlJPUl9ESVNBQkxFRAotICAgICAgICBS
ZXRhaW5QdHI8TlNGb250PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKLSNl
bmRpZgotICAgICAgICBpZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQotICAgICAgICAgICAgbV9w
bGF0Zm9ybURhdGEuc2V0Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNv
bnZlcnRGb250Om1fcGxhdGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1p
bHldKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChb
TlNGb250IGZvbnRXaXRoTmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0
YS5zaXplKCldKTsKLSNpZiAhRVJST1JfRElTQUJMRUQKLSAgICAgICAgTlNTdHJpbmcgKmZpbGVQ
YXRoID0gcGF0aEZyb21Gb250KGluaXRpYWxGb250LmdldCgpKTsKLSAgICAgICAgaWYgKCFmaWxl
UGF0aCkKLSAgICAgICAgICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOwotI2VuZGlmCi0gICAg
ICAgIGlmICghaW5pdEZvbnREYXRhKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAoW2ZhbGxiYWNr
Rm9udEZhbWlseSBpc0VxdWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKLSAgICAgICAgICAgICAg
ICAvLyBPSywgY291bGRuJ3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0
byBUaW1lcywgZmFsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQu
ICBJZiB0aGlzIGZhaWxzIHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KLSAgICAgICAgICAg
ICAgICBtX3BsYXRmb3JtRGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFu
YWdlcl0gY29udmVydEZvbnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxi
YWNrRm9udEZhbWlseSgpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhp
cykpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcg
Um9tYW4sIGFuZCB0aGUgc3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgot
ICAgICAgICAgICAgICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGgg
Zm9udCAlQCBhdCAlQCIsIGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAg
ICAgICAgICAgIGZhaWxlZFNldHVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAg
ICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQg
Zm9udCBhbmQgdGhlIHN5c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KLSAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAl
QCBhdCAlQCIsIGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAg
ZmFpbGVkU2V0dXAgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAg
Ly8gUmVwb3J0IHRoZSBwcm9ibGVtLgotICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBk
ZXRlY3RlZCwgdXNpbmcgJUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKLSAg
ICAgICAgICAgIFttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9u
dC5nZXQoKSBmYW1pbHlOYW1lXSwgZmlsZVBhdGgpOwotICAgIH0KLQotICAgIC8vIElmIGFsbCBl
bHNlIGZhaWxzLCB0cnkgdG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KLSAgICAvLyBU
aGlzIGlzIHByb2JhYmx5IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90
aCB1bmF2YWlsYWJsZS4KLSAgICBpZiAoZmFpbGVkU2V0dXApIHsKLSAgICAgICAgbV9wbGF0Zm9y
bURhdGEuc2V0Rm9udChbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZv
bnQoKSBwb2ludFNpemVdXSk7Ci0gICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBm
b250LCB1c2luZyBzeXN0ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7Ci0gICAg
ICAgIGluaXRGb250RGF0YSh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IGlBc2NlbnQ7Ci0g
ICAgaW50IGlEZXNjZW50OwotICAgIGludCBpTGluZUdhcDsKLSNpZmRlZiBCVUlMRElOR19PTl9U
SUdFUgotICAgIHdrR2V0Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNj
ZW50LCAmaURlc2NlbnQsICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7Ci0jZWxzZQotICAgIGlB
c2NlbnQgPSBDR0ZvbnRHZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOwotICAgIGlE
ZXNjZW50ID0gQ0dGb250R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7Ci0gICAg
aUxpbmVHYXAgPSBDR0ZvbnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSAg
ICBtX3VuaXRzUGVyRW0gPSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9u
dCgpKTsKLSNlbmRpZgotCi0gICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9z
aXplOwotICAgIGZsb2F0IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRz
UGVyRW0pICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRz
KGlEZXNjZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZMaW5lR2Fw
ID0gc2NhbGVFbVRvVW5pdHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0K
LSAgICAvLyBXZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0
byBjbG9zZWx5IG1hdGNoIHRoZQotICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWlj
cm9zb2Z0IGNvdW50ZXJwYXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KLSAgICAvLyB3ZWIgc3Rh
bmRhcmQuIFRoZSBBcHBLaXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKLSAg
ICAvLyBpbmNvcnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBh
ZGp1c3RtZW50IGluc3RlYWQKLSAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAg
TlNTdHJpbmcgKmZhbWlseU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVd
OwotICAgIGlmIChbZmFtaWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1p
bHlOYW1lIGlzRXF1YWxUb1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1
YWxUb1N0cmluZzpAIkNvdXJpZXIiXSkKLSAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNj
ZW50ICsgZkRlc2NlbnQpICogMC4xNWYpICsgMC41Zik7Ci0gICAgZWxzZSBpZiAoW2ZhbWlseU5h
bWUgaXNFcXVhbFRvU3RyaW5nOkAiR2VlemEgUHJvIl0pIHsKLSAgICAgICAgLy8gR2VlemEgUHJv
IGhhcyBnbHlwaHMgdGhhdCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJl
bG93IHRoZSBkZXNjZW50LiBBZGp1c3QKLSAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmlj
cyB0byBiZXR0ZXIgbWF0Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0
b20gb2Ygb25lIGxpbmUKLSAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0
aGUgdG9wIG9mIHRoZSBuZXh0IGxpbmUuCi0gICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7Ci0gICAg
ICAgIGZEZXNjZW50ICo9IDIuZjsKLSAgICB9Ci0KLSAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFz
Y2VudCk7Ci0gICAgbV9kZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7Ci0gICAgbV9saW5lR2Fw
ID0gbHJvdW5kZihmTGluZUdhcCk7Ci0gICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9k
ZXNjZW50ICsgbV9saW5lR2FwOwotICAgIAotICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRy
aWNzIHRvIGFsbG93IHJvb20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCi0gICAgLy8gPHJk
YXI6Ly9wcm9ibGVtLzUzODYxODM+Ci0gICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2Fw
ID49IDMgJiYgW2ZhbWlseU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgewotICAgICAgICBt
X2xpbmVHYXAgLT0gMyAtIG1fZGVzY2VudDsKLSAgICAgICAgbV9kZXNjZW50ID0gMzsKLSAgICB9
Ci0gICAgCi0gICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2Ug
QXBwS2l0IHN5bnRoZXNpemVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0
aGUgZm9udC4KLSAgICAvLyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZv
ciB1cyBzbyB3ZSBkb24ndCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgotICAgIEdseXBoUGFn
ZSogZ2x5cGhQYWdlWmVybyA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywg
MCktPnBhZ2UoKTsKLSAgICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBh
Z2VaZXJvLT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAgaWYgKHhH
bHlwaCkgewotICAgICAgICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91
bmRpbmdSZWN0Rm9yR2x5cGg6eEdseXBoXTsKLSAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9m
IGVpdGhlciB3aWR0aCBvciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQotICAg
ICAgICAvLyBhbmQgd2ViIHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Ig
d2lkdGggd2lsbCBiZSBsYWlkIG91dAotICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFu
IGFjY3VyYXRlIGhlaWdodC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAotICAgICAg
ICAvLyB3aGljaCBoYXMgYW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KLSAgICAgICAgbV94SGVp
Z2h0ID0gbWF4KE5TTWF4WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKLSAgICB9IGVsc2UKLSAgICAg
ICAgbV94SGVpZ2h0ID0gW21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKLX0KLSAgICAK
LXN0YXRpYyBDRkRhdGFSZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBs
YXRmb3JtRGF0YSwgRm91ckNoYXJDb2RlIHRhYmxlTmFtZSkKLXsKLSNpZmRlZiBCVUlMRElOR19P
Tl9USUdFUgotICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250
KHBsYXRmb3JtRGF0YS5tX2F0c3VGb250SUQpOwotCi0gICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsK
LSAgICBpZiAoQVRTRm9udEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwg
JnRhYmxlU2l6ZSkgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGTXV0
YWJsZURhdGFSZWYgZGF0YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVs
dCwgdGFibGVTaXplKTsKLSAgICBpZiAoIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotICAgIAot
ICAgIENGRGF0YUluY3JlYXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7Ci0gICAgaWYgKEFUU0Zv
bnRHZXRUYWJsZShhdHNGb250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0
YWJsZUJ5dGVQdHIoZGF0YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7Ci0gICAgICAgIENGUmVs
ZWFzZShkYXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBk
YXRhOwotI2Vsc2UKLSAgICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0
YS5jZ0ZvbnQoKSwgdGFibGVOYW1lKTsKLSNlbmRpZgotfQotCi12b2lkIFNpbXBsZUZvbnREYXRh
OjpwbGF0Zm9ybUNoYXJXaWR0aEluaXQoKQotewotICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKLSAg
ICBtX21heENoYXJXaWR0aCA9IDA7Ci0gICAgCi0gICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3My
VGFibGUoQWRvcHRDRiwgY29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzIn
KSk7Ci0gICAgaWYgKG9zMlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkg
Pj0gNCkgewotICAgICAgICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJU
YWJsZS5nZXQoKSk7Ci0gICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAy
NTYgKyBvczJbM107Ci0gICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3My
QXZnQ2hhcldpZHRoLCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAg
IH0KLQotICAgIFJldGFpblB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9u
dFRhYmxlRm9yVGFnKG1fcGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKLSAgICBpZiAoaGVhZFRhYmxl
ICYmIENGRGF0YUdldExlbmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7Ci0gICAgICAgIGNv
bnN0IFVJbnQ4KiBoZWFkID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOwotICAg
ICAgICB1c2hvcnQgdXhNaW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOwotICAgICAgICB1
c2hvcnQgdXhNYXggPSBoZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOwotICAgICAgICBTSW50MTYg
eE1pbiA9IHN0YXRpY19jYXN0PFNJbnQxNj4odXhNaW4pOwotICAgICAgICBTSW50MTYgeE1heCA9
IHN0YXRpY19jYXN0PFNJbnQxNj4odXhNYXgpOwotICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGlj
X2Nhc3Q8ZmxvYXQ+KHhNYXggLSB4TWluKTsKLSAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2Fs
ZUVtVG9Vbml0cyhkaWZmLCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwot
ICAgIH0KLQotICAgIC8vIEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdo
aWNoIHdpbGwgcG9wdWxhdGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4K
LSAgICBpbml0Q2hhcldpZHRocygpOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9y
bURlc3Ryb3koKQotewotI2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgaWYgKG1fc3R5bGVH
cm91cCkKLSAgICAgICAgd2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOwotI2VuZGlm
Ci0jaWYgVVNFKEFUU1VJKQotICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJh
dG9yIGVuZCA9IG1fQVRTVVN0eWxlTWFwLmVuZCgpOwotICAgIGZvciAoSGFzaE1hcDx1bnNpZ25l
ZCwgQVRTVVN0eWxlPjo6aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAh
PSBlbmQ7ICsraXQpCi0gICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7Ci0jZW5k
aWYKLX0KLQotU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0
YShjb25zdCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBp
ZiAoIW1fc21hbGxDYXBzRm9udERhdGEpIHsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7
Ci0gICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZv
cm1EYXRhKTsKLSAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fw
c0ZvbnREYXRhLm1fc2l6ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKLSAgICAgICAg
ICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9u
dERhdGEsIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJFR0lO
X0JMT0NLX09CSkNfRVhDRVBUSU9OUzsKLSAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0
Zm9ybURhdGEuZm9udCgpIHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7
Ci0gICAgICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5h
Z2VyIHNoYXJlZEZvbnRNYW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkg
dG9TaXplOnNpemVdKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0
cyB0aGUgdHlwZSBpbmZvcm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQg
YSBmb250IHRvIGEgZGlmZmVyZW50IHNpemUuCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZp
eCB1cCB0aGUgZm9udCB0aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgotICAgICAgICAgICAgc21hbGxD
YXBzRm9udC5zZXRGb250KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxs
Q2Fwc0ZvbnQuZm9udCgpIHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3Jl
ZW5Gb250XSk7Ci0KLSAgICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgewotICAg
ICAgICAgICAgICAgIE5TRm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIg
c2hhcmVkRm9udE1hbmFnZXJdOwotICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250
VHJhaXRzID0gW2ZvbnRNYW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCld
OwotCi0gICAgICAgICAgICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkK
LSAgICAgICAgICAgICAgICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKLSAgICAg
ICAgICAgICAgICBpZiAobV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQotICAgICAg
ICAgICAgICAgICAgICBmb250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7Ci0KLSAgICAgICAg
ICAgICAgICBOU0ZvbnRUcmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdl
ciB0cmFpdHNPZkZvbnQ6c21hbGxDYXBzRm9udC5mb250KCldOwotICAgICAgICAgICAgICAgIHNt
YWxsQ2Fwc0ZvbnQubV9zeW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFz
aykgJiYgIShzbWFsbENhcHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOwotICAgICAgICAg
ICAgICAgIHNtYWxsQ2Fwc0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBO
U0l0YWxpY0ZvbnRNYXNrKSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRN
YXNrKTsKLQotICAgICAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUo
KS0+Z2V0Q2FjaGVkRm9udERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOwotICAgICAgICAgICAgfQotICAg
ICAgICAgICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUzsKLSAgICAgICAgfQotICAgIH0KLSAg
ICByZXR1cm4gbV9zbWFsbENhcHNGb250RGF0YTsKLX0KLQotYm9vbCBTaW1wbGVGb250RGF0YTo6
Y29udGFpbnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBj
b25zdAotewotICAgIE5TU3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0
aENoYXJhY3RlcnNOb0NvcHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3Ro
Omxlbmd0aCBmcmVlV2hlbkRvbmU6Tk9dOwotICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21f
cGxhdGZvcm1EYXRhLmZvbnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07Ci0g
ICAgYm9vbCByZXN1bHQgPSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpz
ZXRdLmxvY2F0aW9uID09IE5TTm90Rm91bmQ7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgICBy
ZXR1cm4gcmVzdWx0OwotfQogCi12b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgp
Ci17Ci0gICAgTlNGb250KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOwotICAgIC8vIFNwZWNp
YWwgY2FzZSBPc2FrYS1Nb25vLgotICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0v
Mzk5OTQ2Nz4sIHdlIHNob3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgotICAg
IC8vIE5vdGUgdGhhdCB0aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZp
eGVkIHBpdGNoLgotCi0gICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCi0gICAgLy8gQWNj
b3JkaW5nIHRvIDxyZGFyOi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBN
Uy1QR290aGljIGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyBy
ZXBvcnQgTVMtUEdvdGhpYyBhcyBmaXhlZCBwaXRjaC4KLQotICAgIC8vIFNwZWNpYWwgY2FzZSBN
b25vdHlwZUNvcnNpdmEKLSAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3
MDQ+LCB3ZSBzaG91bGQgbm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4K
LSAgICAvLyBOb3RlIHRoYXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBm
aXhlZCBwaXRjaC4KLQotICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOwotICAgIG1f
dHJlYXRBc0ZpeGVkUGl0Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQ
aXRjaF0gfHwKLSAgICAgICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWth
LU1vbm8iXSA9PSBOU09yZGVyZWRTYW1lKSAmJgotICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5z
aXRpdmVDb21wYXJlOkAiTVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKLSAgICAgICAg
ICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5T
T3JkZXJlZFNhbWU7Ci19Ci0KLUZsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3Vu
ZHNGb3JHbHlwaChHbHlwaCBnbHlwaCkgY29uc3QKLXsKLSAgICBGbG9hdFJlY3QgYm91bmRpbmdC
b3g7Ci0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQ0dSZWN0IGJveDsKLSAgICBDR0Zv
bnRHZXRHbHlwaEJCb3hlcyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94
KTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Ci0gICAgQ0dG
bG9hdCBzY2FsZSA9IHBvaW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKLSAgICBib3VuZGluZ0JveCA9
IENHUmVjdEFwcGx5QWZmaW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2Nh
bGUoc2NhbGUsIC1zY2FsZSkpOwotICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCi0gICAg
ICAgIGJvdW5kaW5nQm94LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRp
Y0JvbGRPZmZzZXQpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOwotI2VuZGlmCi0g
ICAgcmV0dXJuIGJvdW5kaW5nQm94OwotfQotCi1mbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZv
cm1XaWR0aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAotewotICAgIE5TRm9udCogZm9udCA9
IHBsYXRmb3JtRGF0YSgpLmZvbnQoKTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURh
dGEoKS5tX3NpemU7Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3Jt
TWFrZVNjYWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKLSAgICBDR1NpemUgYWR2YW5jZTsKLSAg
ICBpZiAoIXdrR2V0R2x5cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9u
dCgpLCBmb250LCAmbSwgJmdseXBoLCAmYWR2YW5jZSkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJV
bmFibGUgdG8gY2FjaGUgZ2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1l
XSwgcG9pbnRTaXplKTsKLSAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7Ci0gICAgfQotICAgIHJl
dHVybiBhZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQotCi0jaWYgVVNF
KEFUU1VJKQogdm9pZCBTaW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAog
ewogICAgIEFTU0VSVCghbV9jaGVja2VkU2hhcGVzQXJhYmljKTsKQEAgLTQ2Nyw1NSArNzAsNyBA
QCB2b2lkIFNpbXBsZUZvbnREYXRhOjpjaGVja1NoYXBlc0FyYWJpYygpCiAgICAgICAgICAgICBM
T0dfRVJST1IoIkFUU0ZvbnRHZXRUYWJsZSBmYWlsZWQgKCVkKSIsIHN0YXR1cyk7CiAgICAgfQog
fQotI2VuZGlmCi0KLSNpZiBVU0UoQ09SRV9URVhUKQotQ1RGb250UmVmIFNpbXBsZUZvbnREYXRh
OjpnZXRDVEZvbnQoKSBjb25zdAotewotICAgIGlmIChnZXROU0ZvbnQoKSkKLSAgICAgICAgcmV0
dXJuIHRvQ1RGb250UmVmKGdldE5TRm9udCgpKTsKLSAgICBpZiAoIW1fQ1RGb250KQotICAgICAg
ICBtX0NURm9udC5hZG9wdENGKENURm9udENyZWF0ZVdpdGhHcmFwaGljc0ZvbnQobV9wbGF0Zm9y
bURhdGEuY2dGb250KCksIG1fcGxhdGZvcm1EYXRhLnNpemUoKSwgTlVMTCwgTlVMTCkpOwotICAg
IHJldHVybiBtX0NURm9udC5nZXQoKTsKLX0KLQotQ0ZEaWN0aW9uYXJ5UmVmIFNpbXBsZUZvbnRE
YXRhOjpnZXRDRlN0cmluZ0F0dHJpYnV0ZXMoVHlwZXNldHRpbmdGZWF0dXJlcyB0eXBlc2V0dGlu
Z0ZlYXR1cmVzKSBjb25zdAotewotICAgIHVuc2lnbmVkIGtleSA9IHR5cGVzZXR0aW5nRmVhdHVy
ZXMgKyAxOwotICAgIHBhaXI8SGFzaE1hcDx1bnNpZ25lZCwgUmV0YWluUHRyPENGRGljdGlvbmFy
eVJlZj4gPjo6aXRlcmF0b3IsIGJvb2w+IGFkZFJlc3VsdCA9IG1fQ0ZTdHJpbmdBdHRyaWJ1dGVz
LmFkZChrZXksIFJldGFpblB0cjxDRkRpY3Rpb25hcnlSZWY+KCkpOwotICAgIFJldGFpblB0cjxD
RkRpY3Rpb25hcnlSZWY+JiBhdHRyaWJ1dGVzRGljdGlvbmFyeSA9IGFkZFJlc3VsdC5maXJzdC0+
c2Vjb25kOwotICAgIGlmICghYWRkUmVzdWx0LnNlY29uZCkKLSAgICAgICAgcmV0dXJuIGF0dHJp
YnV0ZXNEaWN0aW9uYXJ5LmdldCgpOwotCi0gICAgYm9vbCBhbGxvd0xpZ2F0dXJlcyA9IHBsYXRm
b3JtRGF0YSgpLmFsbG93c0xpZ2F0dXJlcygpIHx8ICh0eXBlc2V0dGluZ0ZlYXR1cmVzICYgTGln
YXR1cmVzKTsKLQotICAgIHN0YXRpYyBjb25zdCBpbnQgbGlnYXR1cmVzTm90QWxsb3dlZFZhbHVl
ID0gMDsKLSAgICBzdGF0aWMgQ0ZOdW1iZXJSZWYgbGlnYXR1cmVzTm90QWxsb3dlZCA9IENGTnVt
YmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZsaWdhdHVy
ZXNOb3RBbGxvd2VkVmFsdWUpOwogCi0gICAgc3RhdGljIGNvbnN0IGludCBsaWdhdHVyZXNBbGxv
d2VkVmFsdWUgPSAxOwotICAgIHN0YXRpYyBDRk51bWJlclJlZiBsaWdhdHVyZXNBbGxvd2VkID0g
Q0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVySW50VHlwZSwgJmxp
Z2F0dXJlc0FsbG93ZWRWYWx1ZSk7Ci0KLSAgICBpZiAoISh0eXBlc2V0dGluZ0ZlYXR1cmVzICYg
S2VybmluZykpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGZsb2F0IGtlcm5pbmdBZGp1c3RtZW50
VmFsdWUgPSAwOwotICAgICAgICBzdGF0aWMgQ0ZOdW1iZXJSZWYga2VybmluZ0FkanVzdG1lbnQg
PSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJGbG9hdFR5cGUs
ICZrZXJuaW5nQWRqdXN0bWVudFZhbHVlKTsKLSAgICAgICAgc3RhdGljIGNvbnN0IHZvaWQqIGtl
eXNXaXRoS2VybmluZ0Rpc2FibGVkW10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVOYW1lLCBrQ1RLZXJu
QXR0cmlidXRlTmFtZSwga0NUTGlnYXR1cmVBdHRyaWJ1dGVOYW1lIH07Ci0gICAgICAgIGNvbnN0
IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsgZ2V0Q1RGb250KCksIGtlcm5p
bmdBZGp1c3RtZW50LCBhbGxvd0xpZ2F0dXJlcwotICAgICAgICAgICAgPyBsaWdhdHVyZXNBbGxv
d2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OwotICAgICAgICBhdHRyaWJ1dGVzRGljdGlvbmFy
eS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShOVUxMLCBrZXlzV2l0aEtlcm5pbmdEaXNhYmxl
ZCwgdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZCwKLSAgICAgICAgICAgIHNpemVvZihrZXlzV2l0
aEtlcm5pbmdEaXNhYmxlZCkgLyBzaXplb2YoKmtleXNXaXRoS2VybmluZ0Rpc2FibGVkKSwKLSAg
ICAgICAgICAgICZrQ0ZDb3B5U3RyaW5nRGljdGlvbmFyeUtleUNhbGxCYWNrcywgJmtDRlR5cGVE
aWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBCeSBv
bWl0dGluZyB0aGUga0NUS2VybkF0dHJpYnV0ZU5hbWUgYXR0cmlidXRlLCB3ZSBnZXQgQ29yZSBU
ZXh0J3Mgc3RhbmRhcmQga2VybmluZy4KLSAgICAgICAgc3RhdGljIGNvbnN0IHZvaWQqIGtleXNX
aXRoS2VybmluZ0VuYWJsZWRbXSA9IHsga0NURm9udEF0dHJpYnV0ZU5hbWUsIGtDVExpZ2F0dXJl
QXR0cmlidXRlTmFtZSB9OwotICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZXNXaXRoS2VybmluZ0Vu
YWJsZWRbXSA9IHsgZ2V0Q1RGb250KCksIGFsbG93TGlnYXR1cmVzID8gbGlnYXR1cmVzQWxsb3dl
ZCA6IGxpZ2F0dXJlc05vdEFsbG93ZWQgfTsKLSAgICAgICAgYXR0cmlidXRlc0RpY3Rpb25hcnku
YWRvcHRDRihDRkRpY3Rpb25hcnlDcmVhdGUoTlVMTCwga2V5c1dpdGhLZXJuaW5nRW5hYmxlZCwg
dmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkLAotICAgICAgICAgICAgc2l6ZW9mKGtleXNXaXRoS2Vy
bmluZ0VuYWJsZWQpIC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdFbmFibGVkKSwKLSAgICAgICAg
ICAgICZrQ0ZDb3B5U3RyaW5nRGljdGlvbmFyeUtleUNhbGxCYWNrcywgJmtDRlR5cGVEaWN0aW9u
YXJ5VmFsdWVDYWxsQmFja3MpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYXR0cmlidXRlc0RpY3Rp
b25hcnkuZ2V0KCk7Ci19Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCiAKICNlbmRpZgotCi19IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9T
aW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL21hYy9TaW1wbGVGb250RGF0YUNvcmVUZXh0LmNwcAkocmV2aXNpb24gNTg1MjAp
CShmcm9tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhTWFjLm1t
OjU4NTIwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFD
b3JlVGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MjEgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDUsIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgQWxleGV5IFByb3NrdXJ5YWtvdgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwg
SW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMg
bWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAg
ICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1p
c3Npb24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElU
UyBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbXBv
cnQgImNvbmZpZy5oIgorI2ltcG9ydCAiU2ltcGxlRm9udERhdGEuaCIKKworI2ltcG9ydCAiQmxv
Y2tFeGNlcHRpb25zLmgiCisjaW1wb3J0ICJDb2xvci5oIgorI2ltcG9ydCAiRmxvYXRSZWN0Lmgi
CisjaW1wb3J0ICJGb250LmgiCisjaW1wb3J0ICJGb250Q2FjaGUuaCIKKyNpbXBvcnQgIkZvbnRE
ZXNjcmlwdGlvbi5oIgorI2ltcG9ydCAiU2hhcmVkQnVmZmVyLmgiCisjaW1wb3J0ICJXZWJDb3Jl
U3lzdGVtSW50ZXJmYWNlLmgiCisjaW1wb3J0IDxBcHBLaXQvQXBwS2l0Lmg+CisjaW1wb3J0IDxB
cHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KKyNpbXBvcnQgPGZsb2F0
Lmg+CisjaW1wb3J0IDx1bmljb2RlL3VjaGFyLmg+CisjaW1wb3J0IDx3dGYvQXNzZXJ0aW9ucy5o
PgorI2ltcG9ydCA8d3RmL1N0ZExpYkV4dHJhcy5oPgorI2ltcG9ydCA8d3RmL1JldGFpblB0ci5o
PgorI2ltcG9ydCA8d3RmL1VudXNlZFBhcmFtLmg+CisKK0BpbnRlcmZhY2UgTlNGb250IChXZWJB
cHBLaXRTZWNyZXRBUEkpCistIChCT09MKV9pc0Zha2VGaXhlZFBpdGNoOworQGVuZAorCit1c2lu
ZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisgIAorY29uc3QgZmxvYXQg
c21hbGxDYXBzRm9udFNpemVNdWx0aXBsaWVyID0gMC43ZjsKK3N0YXRpYyBpbmxpbmUgZmxvYXQg
c2NhbGVFbVRvVW5pdHMoZmxvYXQgeCwgdW5zaWduZWQgdW5pdHNQZXJFbSkgeyByZXR1cm4geCAv
IHVuaXRzUGVyRW07IH0KKworc3RhdGljIGJvb2wgaW5pdEZvbnREYXRhKFNpbXBsZUZvbnREYXRh
KiBmb250RGF0YSkKK3sKKyAgICBpZiAoIWZvbnREYXRhLT5wbGF0Zm9ybURhdGEoKS5jZ0ZvbnQo
KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisjaWZkZWYgQlVJTERJTkdfT05fVElHRVIKKyAg
ICBBVFNVU3R5bGUgZm9udFN0eWxlOworICAgIGlmIChBVFNVQ3JlYXRlU3R5bGUoJmZvbnRTdHls
ZSkgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEFUU1VGb250SUQgZm9u
dElkID0gZm9udERhdGEtPnBsYXRmb3JtRGF0YSgpLm1fYXRzdUZvbnRJRDsKKyAgICBpZiAoIWZv
bnRJZCkgeworICAgICAgICBBVFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7CisgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBVFNVQXR0cmlidXRlVGFnIHRhZyA9IGtBVFNVRm9u
dFRhZzsKKyAgICBCeXRlQ291bnQgc2l6ZSA9IHNpemVvZihBVFNVRm9udElEKTsKKyAgICBBVFNV
Rm9udElEICp2YWx1ZUFycmF5WzFdID0geyZmb250SWR9OworICAgIE9TU3RhdHVzIHN0YXR1cyA9
IEFUU1VTZXRBdHRyaWJ1dGVzKGZvbnRTdHlsZSwgMSwgJnRhZywgJnNpemUsICh2b2lkKiBjb25z
dCopdmFsdWVBcnJheSk7CisgICAgaWYgKHN0YXR1cyAhPSBub0VycikgeworICAgICAgICBBVFNV
RGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisK
KyAgICBpZiAod2tHZXRBVFNTdHlsZUdyb3VwKGZvbnRTdHlsZSwgJmZvbnREYXRhLT5tX3N0eWxl
R3JvdXApICE9IG5vRXJyKSB7CisgICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoZm9udFN0eWxlKTsK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFUU1VEaXNwb3NlU3R5bGUoZm9u
dFN0eWxlKTsKKyNlbmRpZgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBOU1N0cmlu
ZyAqd2ViRmFsbGJhY2tGb250RmFtaWx5KHZvaWQpCit7CisgICAgREVGSU5FX1NUQVRJQ19MT0NB
TChSZXRhaW5QdHI8TlNTdHJpbmc+LCB3ZWJGYWxsYmFja0ZvbnRGYW1pbHksIChbW05TRm9udCBz
eXN0ZW1Gb250T2ZTaXplOjE2LjBmXSBmYW1pbHlOYW1lXSkpOworICAgIHJldHVybiB3ZWJGYWxs
YmFja0ZvbnRGYW1pbHkuZ2V0KCk7Cit9CisKKyNpZiAhRVJST1JfRElTQUJMRUQKKyNpZmRlZiBf
X0xQNjRfXworc3RhdGljIE5TU3RyaW5nKiBwYXRoRnJvbUZvbnQoTlNGb250KikKK3sKKyAgICAv
LyBGTUdldEFUU0ZvbnRSZWZGcm9tRm9udCBpcyBub3QgYXZhaWxhYmxlIGluIDY0LWJpdC4gQXMg
cGF0aEZyb21Gb250IGlzIG9ubHkgdXNlZCBmb3IgZGVidWdnaW5nCisgICAgLy8gcHVycG9zZXMs
IHJldHVybmluZyBuaWwgaXMgYWNjZXB0YWJsZS4KKyAgICByZXR1cm4gbmlsOworfQorI2Vsc2UK
K3N0YXRpYyBOU1N0cmluZyogcGF0aEZyb21Gb250KE5TRm9udCAqZm9udCkKK3sKKyNpZm5kZWYg
QlVJTERJTkdfT05fVElHRVIKKyAgICBBVFNGb250UmVmIGF0c0ZvbnQgPSBGTUdldEFUU0ZvbnRS
ZWZGcm9tRm9udChDVEZvbnRHZXRQbGF0Zm9ybUZvbnQodG9DVEZvbnRSZWYoZm9udCksIDApKTsK
KyNlbHNlCisgICAgQVRTRm9udFJlZiBhdHNGb250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQo
d2tHZXROU0ZvbnRBVFNVRm9udElkKGZvbnQpKTsKKyNlbmRpZgorICAgIEZTUmVmIGZpbGVSZWY7
CisKKyNpZm5kZWYgQlVJTERJTkdfT05fVElHRVIKKyAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNG
b250R2V0RmlsZVJlZmVyZW5jZShhdHNGb250LCAmZmlsZVJlZik7CisgICAgaWYgKHN0YXR1cyAh
PSBub0VycikKKyAgICAgICAgcmV0dXJuIG5pbDsKKyNlbHNlCisgICAgRlNTcGVjIG9GaWxlOwor
ICAgIE9TU3RhdHVzIHN0YXR1cyA9IEFUU0ZvbnRHZXRGaWxlU3BlY2lmaWNhdGlvbihhdHNGb250
LCAmb0ZpbGUpOworICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCisgICAgICAgIHJldHVybiBuaWw7
CisKKyAgICBzdGF0dXMgPSBGU3BNYWtlRlNSZWYoJm9GaWxlLCAmZmlsZVJlZik7CisgICAgaWYg
KHN0YXR1cyAhPSBub0VycikKKyAgICAgICAgcmV0dXJuIG5pbDsKKyNlbmRpZgorCisgICAgVUlu
dDggZmlsZVBhdGhCdWZmZXJbUEFUSF9NQVhdOworICAgIHN0YXR1cyA9IEZTUmVmTWFrZVBhdGgo
JmZpbGVSZWYsIGZpbGVQYXRoQnVmZmVyLCBQQVRIX01BWCk7CisgICAgaWYgKHN0YXR1cyA9PSBu
b0VycikKKyAgICAgICAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzooY29u
c3QgY2hhciopZmlsZVBhdGhCdWZmZXJdOworCisgICAgcmV0dXJuIG5pbDsKK30KKyNlbmRpZiAv
LyBfX0xQNjRfXworI2VuZGlmIC8vICFFUlJPUl9ESVNBQkxFRAorCit2b2lkIFNpbXBsZUZvbnRE
YXRhOjpwbGF0Zm9ybUluaXQoKQoreworI2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgbV9z
dHlsZUdyb3VwID0gMDsKKyNlbmRpZgorI2lmIFVTRShBVFNVSSkKKyAgICBtX0FUU1VNaXJyb3Jz
ID0gZmFsc2U7CisgICAgbV9jaGVja2VkU2hhcGVzQXJhYmljID0gZmFsc2U7CisgICAgbV9zaGFw
ZXNBcmFiaWMgPSBmYWxzZTsKKyNlbmRpZgorCisgICAgbV9zeW50aGV0aWNCb2xkT2Zmc2V0ID0g
bV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNCb2xkID8gMS4wZiA6IDAuZjsKKworICAgIGJvb2wg
ZmFpbGVkU2V0dXAgPSBmYWxzZTsKKyAgICBpZiAoIWluaXRGb250RGF0YSh0aGlzKSkgeworICAg
ICAgICAvLyBBY2shIFNvbWV0aGluZyB2ZXJ5IGJhZCBoYXBwZW5lZCwgbGlrZSBhIGNvcnJ1cHQg
Zm9udC4KKyAgICAgICAgLy8gVHJ5IGxvb2tpbmcgZm9yIGFuIGFsdGVybmF0ZSAnYmFzZScgZm9u
dCBmb3IgdGhpcyByZW5kZXJlci4KKworICAgICAgICAvLyBTcGVjaWFsIGNhc2UgaGFjayB0byB1
c2UgIlRpbWVzIE5ldyBSb21hbiIgaW4gcGxhY2Ugb2YgIlRpbWVzIi4KKyAgICAgICAgLy8gIlRp
bWVzIFJPIiBpcyBhIGNvbW1vbiBmb250IHdob3NlIGZhbWlseSBuYW1lIGlzICJUaW1lcyIuCisg
ICAgICAgIC8vIEl0IG92ZXJyaWRlcyB0aGUgbm9ybWFsICJUaW1lcyIgZmFtaWx5IGZvbnQuCisg
ICAgICAgIC8vIEl0IGFsc28gYXBwZWFycyB0byBoYXZlIGEgY29ycnVwdCByZWd1bGFyIHZhcmlh
bnQuCisgICAgICAgIE5TU3RyaW5nICpmYWxsYmFja0ZvbnRGYW1pbHk7CisgICAgICAgIGlmIChb
W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBmYW1pbHlOYW1lXSBpc0VxdWFsOkAiVGltZXMiXSkKKyAg
ICAgICAgICAgIGZhbGxiYWNrRm9udEZhbWlseSA9IEAiVGltZXMgTmV3IFJvbWFuIjsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgZmFsbGJhY2tGb250RmFtaWx5ID0gd2ViRmFsbGJhY2tGb250
RmFtaWx5KCk7CisgICAgICAgIAorICAgICAgICAvLyBUcnkgc2V0dGluZyB1cCB0aGUgYWx0ZXJu
YXRlIGZvbnQuCisgICAgICAgIC8vIFRoaXMgaXMgYSBsYXN0IGRpdGNoIGVmZm9ydCB0byB1c2Ug
YSBzdWJzdGl0dXRlIGZvbnQgd2hlbiBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcuCisjaWYgIUVS
Uk9SX0RJU0FCTEVECisgICAgICAgIFJldGFpblB0cjxOU0ZvbnQ+IGluaXRpYWxGb250ID0gbV9w
bGF0Zm9ybURhdGEuZm9udCgpOworI2VuZGlmCisgICAgICAgIGlmIChtX3BsYXRmb3JtRGF0YS5m
b250KCkpCisgICAgICAgICAgICBtX3BsYXRmb3JtRGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdl
ciBzaGFyZWRGb250TWFuYWdlcl0gY29udmVydEZvbnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRv
RmFtaWx5OmZhbGxiYWNrRm9udEZhbWlseV0pOworICAgICAgICBlbHNlCisgICAgICAgICAgICBt
X3BsYXRmb3JtRGF0YS5zZXRGb250KFtOU0ZvbnQgZm9udFdpdGhOYW1lOmZhbGxiYWNrRm9udEZh
bWlseSBzaXplOm1fcGxhdGZvcm1EYXRhLnNpemUoKV0pOworI2lmICFFUlJPUl9ESVNBQkxFRAor
ICAgICAgICBOU1N0cmluZyAqZmlsZVBhdGggPSBwYXRoRnJvbUZvbnQoaW5pdGlhbEZvbnQuZ2V0
KCkpOworICAgICAgICBpZiAoIWZpbGVQYXRoKQorICAgICAgICAgICAgZmlsZVBhdGggPSBAIm5v
dCBrbm93biI7CisjZW5kaWYKKyAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsKKyAg
ICAgICAgICAgIGlmIChbZmFsbGJhY2tGb250RmFtaWx5IGlzRXF1YWw6QCJUaW1lcyBOZXcgUm9t
YW4iXSkgeworICAgICAgICAgICAgICAgIC8vIE9LLCBjb3VsZG4ndCBzZXR1cCBUaW1lcyBOZXcg
Um9tYW4gYXMgYW4gYWx0ZXJuYXRlIHRvIFRpbWVzLCBmYWxsYmFjaworICAgICAgICAgICAgICAg
IC8vIG9uIHRoZSBzeXN0ZW0gZm9udC4gIElmIHRoaXMgZmFpbHMgd2UgaGF2ZSBubyBhbHRlcm5h
dGl2ZSBsZWZ0LgorICAgICAgICAgICAgICAgIG1fcGxhdGZvcm1EYXRhLnNldEZvbnQoW1tOU0Zv
bnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5m
b250KCkgdG9GYW1pbHk6d2ViRmFsbGJhY2tGb250RmFtaWx5KCldKTsKKyAgICAgICAgICAgICAg
ICBpZiAoIWluaXRGb250RGF0YSh0aGlzKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSB0
cmllZCwgVGltZXMsIFRpbWVzIE5ldyBSb21hbiwgYW5kIHRoZSBzeXN0ZW0gZm9udC4gTm8gam95
LiBXZSBoYXZlIHRvIGdpdmUgdXAuCisgICAgICAgICAgICAgICAgICAgIExPR19FUlJPUigidW5h
YmxlIHRvIGluaXRpYWxpemUgd2l0aCBmb250ICVAIGF0ICVAIiwgaW5pdGlhbEZvbnQuZ2V0KCks
IGZpbGVQYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFpbGVkU2V0dXAgPSB0cnVlOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8g
V2UgdHJpZWQgdGhlIHJlcXVlc3RlZCBmb250IGFuZCB0aGUgc3lzdGVtIGZvbnQuIE5vIGpveS4g
V2UgaGF2ZSB0byBnaXZlIHVwLgorICAgICAgICAgICAgICAgIExPR19FUlJPUigidW5hYmxlIHRv
IGluaXRpYWxpemUgd2l0aCBmb250ICVAIGF0ICVAIiwgaW5pdGlhbEZvbnQuZ2V0KCksIGZpbGVQ
YXRoKTsKKyAgICAgICAgICAgICAgICBmYWlsZWRTZXR1cCA9IHRydWU7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdGhlIHByb2JsZW0uCisgICAgICAgIExP
R19FUlJPUigiQ29ycnVwdCBmb250IGRldGVjdGVkLCB1c2luZyAlQCBpbiBwbGFjZSBvZiAlQCBs
b2NhdGVkIGF0IFwiJUBcIi4iLAorICAgICAgICAgICAgW21fcGxhdGZvcm1EYXRhLmZvbnQoKSBm
YW1pbHlOYW1lXSwgW2luaXRpYWxGb250LmdldCgpIGZhbWlseU5hbWVdLCBmaWxlUGF0aCk7Cisg
ICAgfQorCisgICAgLy8gSWYgYWxsIGVsc2UgZmFpbHMsIHRyeSB0byBzZXQgdXAgdXNpbmcgdGhl
IHN5c3RlbSBmb250LgorICAgIC8vIFRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZSBUaW1lcyBhbmQg
VGltZXMgTmV3IFJvbWFuIGFyZSBib3RoIHVuYXZhaWxhYmxlLgorICAgIGlmIChmYWlsZWRTZXR1
cCkgeworICAgICAgICBtX3BsYXRmb3JtRGF0YS5zZXRGb250KFtOU0ZvbnQgc3lzdGVtRm9udE9m
U2l6ZTpbbV9wbGF0Zm9ybURhdGEuZm9udCgpIHBvaW50U2l6ZV1dKTsKKyAgICAgICAgTE9HX0VS
Uk9SKCJmYWlsZWQgdG8gc2V0IHVwIGZvbnQsIHVzaW5nIHN5c3RlbSBmb250ICVzIiwgbV9wbGF0
Zm9ybURhdGEuZm9udCgpKTsKKyAgICAgICAgaW5pdEZvbnREYXRhKHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICBpbnQgaUFzY2VudDsKKyAgICBpbnQgaURlc2NlbnQ7CisgICAgaW50IGlMaW5lR2Fw
OworI2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgd2tHZXRGb250TWV0cmljcyhtX3BsYXRm
b3JtRGF0YS5jZ0ZvbnQoKSwgJmlBc2NlbnQsICZpRGVzY2VudCwgJmlMaW5lR2FwLCAmbV91bml0
c1BlckVtKTsKKyNlbHNlCisgICAgaUFzY2VudCA9IENHRm9udEdldEFzY2VudChtX3BsYXRmb3Jt
RGF0YS5jZ0ZvbnQoKSk7CisgICAgaURlc2NlbnQgPSBDR0ZvbnRHZXREZXNjZW50KG1fcGxhdGZv
cm1EYXRhLmNnRm9udCgpKTsKKyAgICBpTGluZUdhcCA9IENHRm9udEdldExlYWRpbmcobV9wbGF0
Zm9ybURhdGEuY2dGb250KCkpOworICAgIG1fdW5pdHNQZXJFbSA9IENHRm9udEdldFVuaXRzUGVy
RW0obV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOworI2VuZGlmCisKKyAgICBmbG9hdCBwb2ludFNp
emUgPSBtX3BsYXRmb3JtRGF0YS5tX3NpemU7CisgICAgZmxvYXQgZkFzY2VudCA9IHNjYWxlRW1U
b1VuaXRzKGlBc2NlbnQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7CisgICAgZmxvYXQgZkRl
c2NlbnQgPSAtc2NhbGVFbVRvVW5pdHMoaURlc2NlbnQsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNp
emU7CisgICAgZmxvYXQgZkxpbmVHYXAgPSBzY2FsZUVtVG9Vbml0cyhpTGluZUdhcCwgbV91bml0
c1BlckVtKSAqIHBvaW50U2l6ZTsKKworICAgIC8vIFdlIG5lZWQgdG8gYWRqdXN0IFRpbWVzLCBI
ZWx2ZXRpY2EsIGFuZCBDb3VyaWVyIHRvIGNsb3NlbHkgbWF0Y2ggdGhlCisgICAgLy8gdmVydGlj
YWwgbWV0cmljcyBvZiB0aGVpciBNaWNyb3NvZnQgY291bnRlcnBhcnRzIHRoYXQgYXJlIHRoZSBk
ZSBmYWN0bworICAgIC8vIHdlYiBzdGFuZGFyZC4gVGhlIEFwcEtpdCBhZGp1c3RtZW50IG9mIDIw
JSBpcyB0b28gYmlnIGFuZCBpcworICAgIC8vIGluY29ycmVjdGx5IGFkZGVkIHRvIGxpbmUgc3Bh
Y2luZywgc28gd2UgdXNlIGEgMTUlIGFkanVzdG1lbnQgaW5zdGVhZAorICAgIC8vIGFuZCBhZGQg
aXQgdG8gdGhlIGFzY2VudC4KKyAgICBOU1N0cmluZyAqZmFtaWx5TmFtZSA9IFttX3BsYXRmb3Jt
RGF0YS5mb250KCkgZmFtaWx5TmFtZV07CisgICAgaWYgKFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0
cmluZzpAIlRpbWVzIl0gfHwgW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3RyaW5nOkAiSGVsdmV0aWNh
Il0gfHwgW2ZhbWlseU5hbWUgaXNFcXVhbFRvU3RyaW5nOkAiQ291cmllciJdKQorICAgICAgICBm
QXNjZW50ICs9IGZsb29yZigoKGZBc2NlbnQgKyBmRGVzY2VudCkgKiAwLjE1ZikgKyAwLjVmKTsK
KyAgICBlbHNlIGlmIChbZmFtaWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJHZWV6YSBQcm8iXSkg
eworICAgICAgICAvLyBHZWV6YSBQcm8gaGFzIGdseXBocyB0aGF0IGRyYXcgc2xpZ2h0bHkgYWJv
dmUgdGhlIGFzY2VudCBvciBmYXIgYmVsb3cgdGhlIGRlc2NlbnQuIEFkanVzdAorICAgICAgICAv
LyB0aG9zZSB2ZXJ0aWNhbCBtZXRyaWNzIHRvIGJldHRlciBtYXRjaCByZWFsaXR5LCBzbyB0aGF0
IGRpYWNyaXRpY3MgYXQgdGhlIGJvdHRvbSBvZiBvbmUgbGluZQorICAgICAgICAvLyBkbyBub3Qg
b3ZlcmxhcCBkaWFjcml0aWNzIGF0IHRoZSB0b3Agb2YgdGhlIG5leHQgbGluZS4KKyAgICAgICAg
ZkFzY2VudCAqPSAxLjA4ZjsKKyAgICAgICAgZkRlc2NlbnQgKj0gMi5mOworICAgIH0KKworICAg
IG1fYXNjZW50ID0gbHJvdW5kZihmQXNjZW50KTsKKyAgICBtX2Rlc2NlbnQgPSBscm91bmRmKGZE
ZXNjZW50KTsKKyAgICBtX2xpbmVHYXAgPSBscm91bmRmKGZMaW5lR2FwKTsKKyAgICBtX2xpbmVT
cGFjaW5nID0gbV9hc2NlbnQgKyBtX2Rlc2NlbnQgKyBtX2xpbmVHYXA7CisgICAgCisgICAgLy8g
SGFjayBIaXJhZ2lubyBsaW5lIG1ldHJpY3MgdG8gYWxsb3cgcm9vbSBmb3IgbWFya2VkIHRleHQg
dW5kZXJsaW5lcy4KKyAgICAvLyA8cmRhcjovL3Byb2JsZW0vNTM4NjE4Mz4KKyAgICBpZiAobV9k
ZXNjZW50IDwgMyAmJiBtX2xpbmVHYXAgPj0gMyAmJiBbZmFtaWx5TmFtZSBoYXNQcmVmaXg6QCJI
aXJhZ2lubyJdKSB7CisgICAgICAgIG1fbGluZUdhcCAtPSAzIC0gbV9kZXNjZW50OworICAgICAg
ICBtX2Rlc2NlbnQgPSAzOworICAgIH0KKyAgICAKKyAgICAvLyBNZWFzdXJlIHRoZSBhY3R1YWwg
Y2hhcmFjdGVyICJ4IiwgYmVjYXVzZSBBcHBLaXQgc3ludGhlc2l6ZXMgWCBoZWlnaHQgcmF0aGVy
IHRoYW4gZ2V0dGluZyBpdCBmcm9tIHRoZSBmb250LgorICAgIC8vIFVuZm9ydHVuYXRlbHksIE5T
Rm9udCB3aWxsIHJvdW5kIHRoaXMgZm9yIHVzIHNvIHdlIGRvbid0IHF1aXRlIGdldCB0aGUgcmln
aHQgdmFsdWUuCisgICAgR2x5cGhQYWdlKiBnbHlwaFBhZ2VaZXJvID0gR2x5cGhQYWdlVHJlZU5v
ZGU6OmdldFJvb3RDaGlsZCh0aGlzLCAwKS0+cGFnZSgpOworICAgIE5TR2x5cGggeEdseXBoID0g
Z2x5cGhQYWdlWmVybyA/IGdseXBoUGFnZVplcm8tPmdseXBoRGF0YUZvckNoYXJhY3RlcigneCcp
LmdseXBoIDogMDsKKyAgICBpZiAoeEdseXBoKSB7CisgICAgICAgIE5TUmVjdCB4Qm94ID0gW21f
cGxhdGZvcm1EYXRhLmZvbnQoKSBib3VuZGluZ1JlY3RGb3JHbHlwaDp4R2x5cGhdOworICAgICAg
ICAvLyBVc2UgdGhlIG1heGltdW0gb2YgZWl0aGVyIHdpZHRoIG9yIGhlaWdodCBiZWNhdXNlICJ4
IiBpcyBuZWFybHkgc3F1YXJlCisgICAgICAgIC8vIGFuZCB3ZWIgcGFnZXMgdGhhdCBmb29saXNo
bHkgdXNlIHRoaXMgbWV0cmljIGZvciB3aWR0aCB3aWxsIGJlIGxhaWQgb3V0CisgICAgICAgIC8v
IHBvb3JseSBpZiB3ZSByZXR1cm4gYW4gYWNjdXJhdGUgaGVpZ2h0LiBDbGFzc2ljIGNhc2UgaXMg
VGltZXMgMTMgcG9pbnQsCisgICAgICAgIC8vIHdoaWNoIGhhcyBhbiAieCIgdGhhdCBpcyA3eDYg
cGl4ZWxzLgorICAgICAgICBtX3hIZWlnaHQgPSBtYXgoTlNNYXhYKHhCb3gpLCBOU01heFkoeEJv
eCkpOworICAgIH0gZWxzZQorICAgICAgICBtX3hIZWlnaHQgPSBbbV9wbGF0Zm9ybURhdGEuZm9u
dCgpIHhIZWlnaHRdOworfQorICAgIAorc3RhdGljIENGRGF0YVJlZiBjb3B5Rm9udFRhYmxlRm9y
VGFnKEZvbnRQbGF0Zm9ybURhdGEgcGxhdGZvcm1EYXRhLCBGb3VyQ2hhckNvZGUgdGFibGVOYW1l
KQoreworI2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCisgICAgQVRTRm9udFJlZiBhdHNGb250ID0g
Rk1HZXRBVFNGb250UmVmRnJvbUZvbnQocGxhdGZvcm1EYXRhLm1fYXRzdUZvbnRJRCk7CisKKyAg
ICBCeXRlQ291bnQgdGFibGVTaXplOworICAgIGlmIChBVFNGb250R2V0VGFibGUoYXRzRm9udCwg
dGFibGVOYW1lLCAwLCAwLCBOVUxMLCAmdGFibGVTaXplKSAhPSBub0VycikKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgCisgICAgQ0ZNdXRhYmxlRGF0YVJlZiBkYXRhID0gQ0ZEYXRhQ3JlYXRlTXV0
YWJsZShrQ0ZBbGxvY2F0b3JEZWZhdWx0LCB0YWJsZVNpemUpOworICAgIGlmICghZGF0YSkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgCisgICAgQ0ZEYXRhSW5jcmVhc2VMZW5ndGgoZGF0YSwgdGFi
bGVTaXplKTsKKyAgICBpZiAoQVRTRm9udEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwg
dGFibGVTaXplLCBDRkRhdGFHZXRNdXRhYmxlQnl0ZVB0cihkYXRhKSwgJnRhYmxlU2l6ZSkgIT0g
bm9FcnIpIHsKKyAgICAgICAgQ0ZSZWxlYXNlKGRhdGEpOworICAgICAgICByZXR1cm4gMDsKKyAg
ICB9CisgICAgCisgICAgcmV0dXJuIGRhdGE7CisjZWxzZQorICAgIHJldHVybiBDR0ZvbnRDb3B5
VGFibGVGb3JUYWcocGxhdGZvcm1EYXRhLmNnRm9udCgpLCB0YWJsZU5hbWUpOworI2VuZGlmCit9
CisKK3ZvaWQgU2ltcGxlRm9udERhdGE6OnBsYXRmb3JtQ2hhcldpZHRoSW5pdCgpCit7CisgICAg
bV9hdmdDaGFyV2lkdGggPSAwOworICAgIG1fbWF4Q2hhcldpZHRoID0gMDsKKyAgICAKKyAgICBS
ZXRhaW5QdHI8Q0ZEYXRhUmVmPiBvczJUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxlRm9yVGFn
KG1fcGxhdGZvcm1EYXRhLCAnT1MvMicpKTsKKyAgICBpZiAob3MyVGFibGUgJiYgQ0ZEYXRhR2V0
TGVuZ3RoKG9zMlRhYmxlLmdldCgpKSA+PSA0KSB7CisgICAgICAgIGNvbnN0IFVJbnQ4KiBvczIg
PSBDRkRhdGFHZXRCeXRlUHRyKG9zMlRhYmxlLmdldCgpKTsKKyAgICAgICAgU0ludDE2IG9zMkF2
Z0NoYXJXaWR0aCA9IG9zMlsyXSAqIDI1NiArIG9zMlszXTsKKyAgICAgICAgbV9hdmdDaGFyV2lk
dGggPSBzY2FsZUVtVG9Vbml0cyhvczJBdmdDaGFyV2lkdGgsIG1fdW5pdHNQZXJFbSkgKiBtX3Bs
YXRmb3JtRGF0YS5tX3NpemU7CisgICAgfQorCisgICAgUmV0YWluUHRyPENGRGF0YVJlZj4gaGVh
ZFRhYmxlKEFkb3B0Q0YsIGNvcHlGb250VGFibGVGb3JUYWcobV9wbGF0Zm9ybURhdGEsICdoZWFk
JykpOworICAgIGlmIChoZWFkVGFibGUgJiYgQ0ZEYXRhR2V0TGVuZ3RoKGhlYWRUYWJsZS5nZXQo
KSkgPj0gNDIpIHsKKyAgICAgICAgY29uc3QgVUludDgqIGhlYWQgPSBDRkRhdGFHZXRCeXRlUHRy
KGhlYWRUYWJsZS5nZXQoKSk7CisgICAgICAgIHVzaG9ydCB1eE1pbiA9IGhlYWRbMzZdICogMjU2
ICsgaGVhZFszN107CisgICAgICAgIHVzaG9ydCB1eE1heCA9IGhlYWRbNDBdICogMjU2ICsgaGVh
ZFs0MV07CisgICAgICAgIFNJbnQxNiB4TWluID0gc3RhdGljX2Nhc3Q8U0ludDE2Pih1eE1pbik7
CisgICAgICAgIFNJbnQxNiB4TWF4ID0gc3RhdGljX2Nhc3Q8U0ludDE2Pih1eE1heCk7CisgICAg
ICAgIGZsb2F0IGRpZmYgPSBzdGF0aWNfY2FzdDxmbG9hdD4oeE1heCAtIHhNaW4pOworICAgICAg
ICBtX21heENoYXJXaWR0aCA9IHNjYWxlRW1Ub1VuaXRzKGRpZmYsIG1fdW5pdHNQZXJFbSkgKiBt
X3BsYXRmb3JtRGF0YS5tX3NpemU7CisgICAgfQorCisgICAgLy8gRmFsbGJhY2sgdG8gYSBjcm9z
cy1wbGF0Zm9ybSBlc3RpbWF0ZSwgd2hpY2ggd2lsbCBwb3B1bGF0ZSB0aGVzZSB2YWx1ZXMgaWYg
dGhleSBhcmUgbm9uLXBvc2l0aXZlLgorICAgIGluaXRDaGFyV2lkdGhzKCk7Cit9CisKK3ZvaWQg
U2ltcGxlRm9udERhdGE6OnBsYXRmb3JtRGVzdHJveSgpCit7CisjaWZkZWYgQlVJTERJTkdfT05f
VElHRVIKKyAgICBpZiAobV9zdHlsZUdyb3VwKQorICAgICAgICB3a1JlbGVhc2VTdHlsZUdyb3Vw
KG1fc3R5bGVHcm91cCk7CisjZW5kaWYKKyNpZiBVU0UoQVRTVUkpCisgICAgSGFzaE1hcDx1bnNp
Z25lZCwgQVRTVVN0eWxlPjo6aXRlcmF0b3IgZW5kID0gbV9BVFNVU3R5bGVNYXAuZW5kKCk7Cisg
ICAgZm9yIChIYXNoTWFwPHVuc2lnbmVkLCBBVFNVU3R5bGU+OjppdGVyYXRvciBpdCA9IG1fQVRT
VVN0eWxlTWFwLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgQVRTVURpc3Bvc2VT
dHlsZShpdC0+c2Vjb25kKTsKKyNlbmRpZgorfQorCitTaW1wbGVGb250RGF0YSogU2ltcGxlRm9u
dERhdGE6OnNtYWxsQ2Fwc0ZvbnREYXRhKGNvbnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2Ny
aXB0aW9uKSBjb25zdAoreworICAgIGlmICghbV9zbWFsbENhcHNGb250RGF0YSkgeworICAgICAg
ICBpZiAoaXNDdXN0b21Gb250KCkpIHsKKyAgICAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEgc21h
bGxDYXBzRm9udERhdGEobV9wbGF0Zm9ybURhdGEpOworICAgICAgICAgICAgc21hbGxDYXBzRm9u
dERhdGEubV9zaXplID0gc21hbGxDYXBzRm9udERhdGEubV9zaXplICogc21hbGxDYXBzRm9udFNp
emVNdWx0aXBsaWVyOworICAgICAgICAgICAgbV9zbWFsbENhcHNGb250RGF0YSA9IG5ldyBTaW1w
bGVGb250RGF0YShzbWFsbENhcHNGb250RGF0YSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgQkVHSU5fQkxPQ0tfT0JKQ19FWENFUFRJT05TOworICAgICAgICAg
ICAgZmxvYXQgc2l6ZSA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgcG9pbnRTaXplXSAqIHNtYWxs
Q2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKKyAgICAgICAgICAgIEZvbnRQbGF0Zm9ybURhdGEgc21h
bGxDYXBzRm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRGb250
Om1fcGxhdGZvcm1EYXRhLmZvbnQoKSB0b1NpemU6c2l6ZV0pOworICAgICAgICAgICAgCisgICAg
ICAgICAgICAvLyBBcHBLaXQgcmVzZXRzIHRoZSB0eXBlIGluZm9ybWF0aW9uIChzY3JlZW4vcHJp
bnRlcikgd2hlbiB5b3UgY29udmVydCBhIGZvbnQgdG8gYSBkaWZmZXJlbnQgc2l6ZS4KKyAgICAg
ICAgICAgIC8vIFdlIGhhdmUgdG8gZml4IHVwIHRoZSBmb250IHRoYXQgd2UncmUgaGFuZGVkIGJh
Y2suCisgICAgICAgICAgICBzbWFsbENhcHNGb250LnNldEZvbnQoZm9udERlc2NyaXB0aW9uLnVz
ZVByaW50ZXJGb250KCkgPyBbc21hbGxDYXBzRm9udC5mb250KCkgcHJpbnRlckZvbnRdIDogW3Nt
YWxsQ2Fwc0ZvbnQuZm9udCgpIHNjcmVlbkZvbnRdKTsKKworICAgICAgICAgICAgaWYgKHNtYWxs
Q2Fwc0ZvbnQuZm9udCgpKSB7CisgICAgICAgICAgICAgICAgTlNGb250TWFuYWdlciAqZm9udE1h
bmFnZXIgPSBbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl07CisgICAgICAgICAgICAg
ICAgTlNGb250VHJhaXRNYXNrIGZvbnRUcmFpdHMgPSBbZm9udE1hbmFnZXIgdHJhaXRzT2ZGb250
Om1fcGxhdGZvcm1EYXRhLmZvbnQoKV07CisKKyAgICAgICAgICAgICAgICBpZiAobV9wbGF0Zm9y
bURhdGEubV9zeW50aGV0aWNCb2xkKQorICAgICAgICAgICAgICAgICAgICBmb250VHJhaXRzIHw9
IE5TQm9sZEZvbnRNYXNrOworICAgICAgICAgICAgICAgIGlmIChtX3BsYXRmb3JtRGF0YS5tX3N5
bnRoZXRpY09ibGlxdWUpCisgICAgICAgICAgICAgICAgICAgIGZvbnRUcmFpdHMgfD0gTlNJdGFs
aWNGb250TWFzazsKKworICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBzbWFsbENhcHNG
b250VHJhaXRzID0gW2ZvbnRNYW5hZ2VyIHRyYWl0c09mRm9udDpzbWFsbENhcHNGb250LmZvbnQo
KV07CisgICAgICAgICAgICAgICAgc21hbGxDYXBzRm9udC5tX3N5bnRoZXRpY0JvbGQgPSAoZm9u
dFRyYWl0cyAmIE5TQm9sZEZvbnRNYXNrKSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0Jv
bGRGb250TWFzayk7CisgICAgICAgICAgICAgICAgc21hbGxDYXBzRm9udC5tX3N5bnRoZXRpY09i
bGlxdWUgPSAoZm9udFRyYWl0cyAmIE5TSXRhbGljRm9udE1hc2spICYmICEoc21hbGxDYXBzRm9u
dFRyYWl0cyAmIE5TSXRhbGljRm9udE1hc2spOworCisgICAgICAgICAgICAgICAgbV9zbWFsbENh
cHNGb250RGF0YSA9IGZvbnRDYWNoZSgpLT5nZXRDYWNoZWRGb250RGF0YSgmc21hbGxDYXBzRm9u
dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFTkRfQkxPQ0tfT0JKQ19FWENFUFRJT05T
OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtX3NtYWxsQ2Fwc0ZvbnREYXRhOworfQor
Citib29sIFNpbXBsZUZvbnREYXRhOjpjb250YWluc0NoYXJhY3RlcnMoY29uc3QgVUNoYXIqIGNo
YXJhY3RlcnMsIGludCBsZW5ndGgpIGNvbnN0Cit7CisgICAgTlNTdHJpbmcgKnN0cmluZyA9IFtb
TlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoQ2hhcmFjdGVyc05vQ29weTpjb25zdF9jYXN0PHVuaWNo
YXIqPihjaGFyYWN0ZXJzKSBsZW5ndGg6bGVuZ3RoIGZyZWVXaGVuRG9uZTpOT107CisgICAgTlND
aGFyYWN0ZXJTZXQgKnNldCA9IFtbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGNvdmVyZWRDaGFyYWN0
ZXJTZXRdIGludmVydGVkU2V0XTsKKyAgICBib29sIHJlc3VsdCA9IHNldCAmJiBbc3RyaW5nIHJh
bmdlT2ZDaGFyYWN0ZXJGcm9tU2V0OnNldF0ubG9jYXRpb24gPT0gTlNOb3RGb3VuZDsKKyAgICBb
c3RyaW5nIHJlbGVhc2VdOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgU2ltcGxlRm9u
dERhdGE6OmRldGVybWluZVBpdGNoKCkKK3sKKyAgICBOU0ZvbnQqIGYgPSBtX3BsYXRmb3JtRGF0
YS5mb250KCk7CisgICAgLy8gU3BlY2lhbCBjYXNlIE9zYWthLU1vbm8uCisgICAgLy8gQWNjb3Jk
aW5nIHRvIDxyZGFyOi8vcHJvYmxlbS8zOTk5NDY3Piwgd2Ugc2hvdWxkIHRyZWF0IE9zYWthLU1v
bm8gYXMgZml4ZWQgcGl0Y2guCisgICAgLy8gTm90ZSB0aGF0IHRoZSBBcHBLaXQgZG9lcyBub3Qg
cmVwb3J0IE9zYWthLU1vbm8gYXMgZml4ZWQgcGl0Y2guCisKKyAgICAvLyBTcGVjaWFsIGNhc2Ug
TVMtUEdvdGhpYy4KKyAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzQwMzI5Mzg+
LCB3ZSBzaG91bGQgbm90IHRyZWF0IE1TLVBHb3RoaWMgYXMgZml4ZWQgcGl0Y2guCisgICAgLy8g
Tm90ZSB0aGF0IEFwcEtpdCBkb2VzIHJlcG9ydCBNUy1QR290aGljIGFzIGZpeGVkIHBpdGNoLgor
CisgICAgLy8gU3BlY2lhbCBjYXNlIE1vbm90eXBlQ29yc2l2YQorICAgIC8vIEFjY29yZGluZyB0
byA8cmRhcjovL3Byb2JsZW0vNTQ1NDcwND4sIHdlIHNob3VsZCBub3QgdHJlYXQgTW9ub3R5cGVD
b3JzaXZhIGFzIGZpeGVkIHBpdGNoLgorICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBv
cnQgTW9ub3R5cGVDb3JzaXZhIGFzIGZpeGVkIHBpdGNoLgorCisgICAgTlNTdHJpbmcgKm5hbWUg
PSBbZiBmb250TmFtZV07CisgICAgbV90cmVhdEFzRml4ZWRQaXRjaCA9IChbZiBpc0ZpeGVkUGl0
Y2hdIHx8IFtmIF9pc0Zha2VGaXhlZFBpdGNoXSB8fAorICAgICAgICAgICBbbmFtZSBjYXNlSW5z
ZW5zaXRpdmVDb21wYXJlOkAiT3Nha2EtTW9ubyJdID09IE5TT3JkZXJlZFNhbWUpICYmCisgICAg
ICAgICAgIFtuYW1lIGNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU6QCJNUy1QR290aGljIl0gIT0gTlNP
cmRlcmVkU2FtZSAmJgorICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOkAi
TW9ub3R5cGVDb3JzaXZhIl0gIT0gTlNPcmRlcmVkU2FtZTsKK30KKworRmxvYXRSZWN0IFNpbXBs
ZUZvbnREYXRhOjpwbGF0Zm9ybUJvdW5kc0ZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAorewor
ICAgIEZsb2F0UmVjdCBib3VuZGluZ0JveDsKKyNpZm5kZWYgQlVJTERJTkdfT05fVElHRVIKKyAg
ICBDR1JlY3QgYm94OworICAgIENHRm9udEdldEdseXBoQkJveGVzKHBsYXRmb3JtRGF0YSgpLmNn
Rm9udCgpLCAmZ2x5cGgsIDEsICZib3gpOworICAgIGZsb2F0IHBvaW50U2l6ZSA9IHBsYXRmb3Jt
RGF0YSgpLm1fc2l6ZTsKKyAgICBDR0Zsb2F0IHNjYWxlID0gcG9pbnRTaXplIC8gdW5pdHNQZXJF
bSgpOworICAgIGJvdW5kaW5nQm94ID0gQ0dSZWN0QXBwbHlBZmZpbmVUcmFuc2Zvcm0oYm94LCBD
R0FmZmluZVRyYW5zZm9ybU1ha2VTY2FsZShzY2FsZSwgLXNjYWxlKSk7CisgICAgaWYgKG1fc3lu
dGhldGljQm9sZE9mZnNldCkKKyAgICAgICAgYm91bmRpbmdCb3guc2V0V2lkdGgoYm91bmRpbmdC
b3gud2lkdGgoKSArIG1fc3ludGhldGljQm9sZE9mZnNldCk7CisjZWxzZQorICAgIFVOVVNFRF9Q
QVJBTShnbHlwaCk7CisjZW5kaWYKKyAgICByZXR1cm4gYm91bmRpbmdCb3g7Cit9CisKK2Zsb2F0
IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9yR2x5cGgoR2x5cGggZ2x5cGgpIGNvbnN0
Cit7CisgICAgTlNGb250KiBmb250ID0gcGxhdGZvcm1EYXRhKCkuZm9udCgpOworICAgIGZsb2F0
IHBvaW50U2l6ZSA9IHBsYXRmb3JtRGF0YSgpLm1fc2l6ZTsKKyAgICBDR0FmZmluZVRyYW5zZm9y
bSBtID0gQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUocG9pbnRTaXplLCBwb2ludFNpemUpOwor
ICAgIENHU2l6ZSBhZHZhbmNlOworICAgIGlmICghd2tHZXRHbHlwaFRyYW5zZm9ybWVkQWR2YW5j
ZXMocGxhdGZvcm1EYXRhKCkuY2dGb250KCksIGZvbnQsICZtLCAmZ2x5cGgsICZhZHZhbmNlKSkg
eworICAgICAgICBMT0dfRVJST1IoIlVuYWJsZSB0byBjYWNoZSBnbHlwaCB3aWR0aHMgZm9yICVA
ICVmIiwgW2ZvbnQgZGlzcGxheU5hbWVdLCBwb2ludFNpemUpOworICAgICAgICBhZHZhbmNlLndp
ZHRoID0gMDsKKyAgICB9CisgICAgcmV0dXJuIGFkdmFuY2Uud2lkdGggKyBtX3N5bnRoZXRpY0Jv
bGRPZmZzZXQ7Cit9CisKKyNpZiBVU0UoQVRTVUkpCit2b2lkIFNpbXBsZUZvbnREYXRhOjpjaGVj
a1NoYXBlc0FyYWJpYygpIGNvbnN0Cit7CisgICAgQVNTRVJUKCFtX2NoZWNrZWRTaGFwZXNBcmFi
aWMpOworCisgICAgbV9jaGVja2VkU2hhcGVzQXJhYmljID0gdHJ1ZTsKKyAgICAKKyAgICBBVFNV
Rm9udElEIGZvbnRJRCA9IG1fcGxhdGZvcm1EYXRhLm1fYXRzdUZvbnRJRDsKKyAgICBpZiAoIWZv
bnRJRCkgeworICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBnZXQgQVRTVUZvbnRJRCBmb3Ig
JUAiLCBtX3BsYXRmb3JtRGF0YS5mb250KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisg
ICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBvbiBmb250cyB0aGF0IGNvbnRhaW4g
QXJhYmljIGdseXBocy4gT3VyCisgICAgLy8gaGV1cmlzdGljIGlzIHRoYXQgaWYgc3VjaCBhIGZv
bnQgaGFzIGEgZ2x5cGggbWV0YW1vcnBob3NpcyB0YWJsZSwgdGhlbgorICAgIC8vIGl0IGluY2x1
ZGVzIHNoYXBpbmcgaW5mb3JtYXRpb24gZm9yIEFyYWJpYy4KKyAgICBGb3VyQ2hhckNvZGUgdGFi
bGVzW10gPSB7ICdtb3J4JywgJ21vcnQnIH07CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHNpemVvZih0YWJsZXMpIC8gc2l6ZW9mKHRhYmxlc1swXSk7ICsraSkgeworICAgICAgICBCeXRl
Q291bnQgdGFibGVTaXplOworICAgICAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250R2V0VGFi
bGUoZm9udElELCB0YWJsZXNbaV0sIDAsIDAsIDAsICZ0YWJsZVNpemUpOworICAgICAgICBpZiAo
c3RhdHVzID09IG5vRXJyKSB7CisgICAgICAgICAgICBtX3NoYXBlc0FyYWJpYyA9IHRydWU7Cisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdHVzICE9IGtB
VFNJbnZhbGlkRm9udFRhYmxlQWNjZXNzKQorICAgICAgICAgICAgTE9HX0VSUk9SKCJBVFNGb250
R2V0VGFibGUgZmFpbGVkICglZCkiLCBzdGF0dXMpOworICAgIH0KK30KKyNlbmRpZgorCisjaWYg
VVNFKENPUkVfVEVYVCkKK0NURm9udFJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q1RGb250KCkgY29u
c3QKK3sKKyAgICBpZiAoZ2V0TlNGb250KCkpCisgICAgICAgIHJldHVybiB0b0NURm9udFJlZihn
ZXROU0ZvbnQoKSk7CisgICAgaWYgKCFtX0NURm9udCkKKyAgICAgICAgbV9DVEZvbnQuYWRvcHRD
RihDVEZvbnRDcmVhdGVXaXRoR3JhcGhpY3NGb250KG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpLCBt
X3BsYXRmb3JtRGF0YS5zaXplKCksIE5VTEwsIE5VTEwpKTsKKyAgICByZXR1cm4gbV9DVEZvbnQu
Z2V0KCk7Cit9CisKK0NGRGljdGlvbmFyeVJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q0ZTdHJpbmdB
dHRyaWJ1dGVzKFR5cGVzZXR0aW5nRmVhdHVyZXMgdHlwZXNldHRpbmdGZWF0dXJlcykgY29uc3QK
K3sKKyAgICB1bnNpZ25lZCBrZXkgPSB0eXBlc2V0dGluZ0ZlYXR1cmVzICsgMTsKKyAgICBwYWly
PEhhc2hNYXA8dW5zaWduZWQsIFJldGFpblB0cjxDRkRpY3Rpb25hcnlSZWY+ID46Oml0ZXJhdG9y
LCBib29sPiBhZGRSZXN1bHQgPSBtX0NGU3RyaW5nQXR0cmlidXRlcy5hZGQoa2V5LCBSZXRhaW5Q
dHI8Q0ZEaWN0aW9uYXJ5UmVmPigpKTsKKyAgICBSZXRhaW5QdHI8Q0ZEaWN0aW9uYXJ5UmVmPiYg
YXR0cmlidXRlc0RpY3Rpb25hcnkgPSBhZGRSZXN1bHQuZmlyc3QtPnNlY29uZDsKKyAgICBpZiAo
IWFkZFJlc3VsdC5zZWNvbmQpCisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzRGljdGlvbmFyeS5n
ZXQoKTsKKworICAgIGJvb2wgYWxsb3dMaWdhdHVyZXMgPSBwbGF0Zm9ybURhdGEoKS5hbGxvd3NM
aWdhdHVyZXMoKSB8fCAodHlwZXNldHRpbmdGZWF0dXJlcyAmIExpZ2F0dXJlcyk7CisKKyAgICBz
dGF0aWMgY29uc3QgaW50IGxpZ2F0dXJlc05vdEFsbG93ZWRWYWx1ZSA9IDA7CisgICAgc3RhdGlj
IENGTnVtYmVyUmVmIGxpZ2F0dXJlc05vdEFsbG93ZWQgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxv
Y2F0b3JEZWZhdWx0LCBrQ0ZOdW1iZXJJbnRUeXBlLCAmbGlnYXR1cmVzTm90QWxsb3dlZFZhbHVl
KTsKKworICAgIHN0YXRpYyBjb25zdCBpbnQgbGlnYXR1cmVzQWxsb3dlZFZhbHVlID0gMTsKKyAg
ICBzdGF0aWMgQ0ZOdW1iZXJSZWYgbGlnYXR1cmVzQWxsb3dlZCA9IENGTnVtYmVyQ3JlYXRlKGtD
RkFsbG9jYXRvckRlZmF1bHQsIGtDRk51bWJlckludFR5cGUsICZsaWdhdHVyZXNBbGxvd2VkVmFs
dWUpOworCisgICAgaWYgKCEodHlwZXNldHRpbmdGZWF0dXJlcyAmIEtlcm5pbmcpKSB7CisgICAg
ICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrZXJuaW5nQWRqdXN0bWVudFZhbHVlID0gMDsKKyAgICAg
ICAgc3RhdGljIENGTnVtYmVyUmVmIGtlcm5pbmdBZGp1c3RtZW50ID0gQ0ZOdW1iZXJDcmVhdGUo
a0NGQWxsb2NhdG9yRGVmYXVsdCwga0NGTnVtYmVyRmxvYXRUeXBlLCAma2VybmluZ0FkanVzdG1l
bnRWYWx1ZSk7CisgICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdEaXNh
YmxlZFtdID0geyBrQ1RGb250QXR0cmlidXRlTmFtZSwga0NUS2VybkF0dHJpYnV0ZU5hbWUsIGtD
VExpZ2F0dXJlQXR0cmlidXRlTmFtZSB9OworICAgICAgICBjb25zdCB2b2lkKiB2YWx1ZXNXaXRo
S2VybmluZ0Rpc2FibGVkW10gPSB7IGdldENURm9udCgpLCBrZXJuaW5nQWRqdXN0bWVudCwgYWxs
b3dMaWdhdHVyZXMKKyAgICAgICAgICAgID8gbGlnYXR1cmVzQWxsb3dlZCA6IGxpZ2F0dXJlc05v
dEFsbG93ZWQgfTsKKyAgICAgICAgYXR0cmlidXRlc0RpY3Rpb25hcnkuYWRvcHRDRihDRkRpY3Rp
b25hcnlDcmVhdGUoTlVMTCwga2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQsIHZhbHVlc1dpdGhLZXJu
aW5nRGlzYWJsZWQsCisgICAgICAgICAgICBzaXplb2Yoa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQp
IC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdEaXNhYmxlZCksCisgICAgICAgICAgICAma0NGQ29w
eVN0cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2Fs
bEJhY2tzKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gQnkgb21pdHRpbmcgdGhlIGtDVEtl
cm5BdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSwgd2UgZ2V0IENvcmUgVGV4dCdzIHN0YW5kYXJkIGtl
cm5pbmcuCisgICAgICAgIHN0YXRpYyBjb25zdCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdFbmFibGVk
W10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVOYW1lLCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsK
KyAgICAgICAgY29uc3Qgdm9pZCogdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGdldENU
Rm9udCgpLCBhbGxvd0xpZ2F0dXJlcyA/IGxpZ2F0dXJlc0FsbG93ZWQgOiBsaWdhdHVyZXNOb3RB
bGxvd2VkIH07CisgICAgICAgIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9u
YXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2VybmluZ0VuYWJsZWQsIHZhbHVlc1dpdGhLZXJuaW5n
RW5hYmxlZCwKKyAgICAgICAgICAgIHNpemVvZihrZXlzV2l0aEtlcm5pbmdFbmFibGVkKSAvIHNp
emVvZigqa2V5c1dpdGhLZXJuaW5nRW5hYmxlZCksCisgICAgICAgICAgICAma0NGQ29weVN0cmlu
Z0RpY3Rpb25hcnlLZXlDYWxsQmFja3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tz
KSk7CisgICAgfQorCisgICAgcmV0dXJuIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmdldCgpOworfQor
CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFDb3JlVGV4dC5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxlRm9udERhdGFDb3JlVGV4dC5jcHAJ
KHJldmlzaW9uIDU4NTIwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvU2ltcGxl
Rm9udERhdGFDb3JlVGV4dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMwLDQ1MiArMzAsMjMgQEAK
ICNpbXBvcnQgImNvbmZpZy5oIgogI2ltcG9ydCAiU2ltcGxlRm9udERhdGEuaCIKIAotI2ltcG9y
dCAiQmxvY2tFeGNlcHRpb25zLmgiCi0jaW1wb3J0ICJDb2xvci5oIgotI2ltcG9ydCAiRmxvYXRS
ZWN0LmgiCisjaWYgVVNFKENPUkVfVEVYVCkKKwogI2ltcG9ydCAiRm9udC5oIgogI2ltcG9ydCAi
Rm9udENhY2hlLmgiCiAjaW1wb3J0ICJGb250RGVzY3JpcHRpb24uaCIKLSNpbXBvcnQgIlNoYXJl
ZEJ1ZmZlci5oIgotI2ltcG9ydCAiV2ViQ29yZVN5c3RlbUludGVyZmFjZS5oIgotI2ltcG9ydCA8
QXBwS2l0L0FwcEtpdC5oPgogI2ltcG9ydCA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlv
blNlcnZpY2VzLmg+Ci0jaW1wb3J0IDxmbG9hdC5oPgotI2ltcG9ydCA8dW5pY29kZS91Y2hhci5o
PgotI2ltcG9ydCA8d3RmL0Fzc2VydGlvbnMuaD4KLSNpbXBvcnQgPHd0Zi9TdGRMaWJFeHRyYXMu
aD4KLSNpbXBvcnQgPHd0Zi9SZXRhaW5QdHIuaD4KLSNpbXBvcnQgPHd0Zi9VbnVzZWRQYXJhbS5o
PgotCi1AaW50ZXJmYWNlIE5TRm9udCAoV2ViQXBwS2l0U2VjcmV0QVBJKQotLSAoQk9PTClfaXNG
YWtlRml4ZWRQaXRjaDsKLUBlbmQKIAogdXNpbmcgbmFtZXNwYWNlIHN0ZDsKIAogbmFtZXNwYWNl
IFdlYkNvcmUgewotICAKLWNvbnN0IGZsb2F0IHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllciA9
IDAuN2Y7Ci1zdGF0aWMgaW5saW5lIGZsb2F0IHNjYWxlRW1Ub1VuaXRzKGZsb2F0IHgsIHVuc2ln
bmVkIHVuaXRzUGVyRW0pIHsgcmV0dXJuIHggLyB1bml0c1BlckVtOyB9Ci0KLXN0YXRpYyBib29s
IGluaXRGb250RGF0YShTaW1wbGVGb250RGF0YSogZm9udERhdGEpCi17Ci0gICAgaWYgKCFmb250
RGF0YS0+cGxhdGZvcm1EYXRhKCkuY2dGb250KCkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLQot
I2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTVVN0eWxlIGZvbnRTdHlsZTsKLSAgICBp
ZiAoQVRTVUNyZWF0ZVN0eWxlKCZmb250U3R5bGUpICE9IG5vRXJyKQotICAgICAgICByZXR1cm4g
ZmFsc2U7Ci0KLSAgICBBVFNVRm9udElEIGZvbnRJZCA9IGZvbnREYXRhLT5wbGF0Zm9ybURhdGEo
KS5tX2F0c3VGb250SUQ7Ci0gICAgaWYgKCFmb250SWQpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VT
dHlsZShmb250U3R5bGUpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQVRT
VUF0dHJpYnV0ZVRhZyB0YWcgPSBrQVRTVUZvbnRUYWc7Ci0gICAgQnl0ZUNvdW50IHNpemUgPSBz
aXplb2YoQVRTVUZvbnRJRCk7Ci0gICAgQVRTVUZvbnRJRCAqdmFsdWVBcnJheVsxXSA9IHsmZm9u
dElkfTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNVU2V0QXR0cmlidXRlcyhmb250U3R5bGUs
IDEsICZ0YWcsICZzaXplLCAodm9pZCogY29uc3QqKXZhbHVlQXJyYXkpOwotICAgIGlmIChzdGF0
dXMgIT0gbm9FcnIpIHsKLSAgICAgICAgQVRTVURpc3Bvc2VTdHlsZShmb250U3R5bGUpOwotICAg
ICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHdrR2V0QVRTU3R5bGVHcm91cChm
b250U3R5bGUsICZmb250RGF0YS0+bV9zdHlsZUdyb3VwKSAhPSBub0VycikgewotICAgICAgICBB
VFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9
Ci0KLSAgICBBVFNVRGlzcG9zZVN0eWxlKGZvbnRTdHlsZSk7Ci0jZW5kaWYKLQotICAgIHJldHVy
biB0cnVlOwotfQotCi1zdGF0aWMgTlNTdHJpbmcgKndlYkZhbGxiYWNrRm9udEZhbWlseSh2b2lk
KQotewotICAgIERFRklORV9TVEFUSUNfTE9DQUwoUmV0YWluUHRyPE5TU3RyaW5nPiwgd2ViRmFs
bGJhY2tGb250RmFtaWx5LCAoW1tOU0ZvbnQgc3lzdGVtRm9udE9mU2l6ZToxNi4wZl0gZmFtaWx5
TmFtZV0pKTsKLSAgICByZXR1cm4gd2ViRmFsbGJhY2tGb250RmFtaWx5LmdldCgpOwotfQotCi0j
aWYgIUVSUk9SX0RJU0FCTEVECi0jaWZkZWYgX19MUDY0X18KLXN0YXRpYyBOU1N0cmluZyogcGF0
aEZyb21Gb250KE5TRm9udCopCi17Ci0gICAgLy8gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQgaXMg
bm90IGF2YWlsYWJsZSBpbiA2NC1iaXQuIEFzIHBhdGhGcm9tRm9udCBpcyBvbmx5IHVzZWQgZm9y
IGRlYnVnZ2luZwotICAgIC8vIHB1cnBvc2VzLCByZXR1cm5pbmcgbmlsIGlzIGFjY2VwdGFibGUu
Ci0gICAgcmV0dXJuIG5pbDsKLX0KLSNlbHNlCi1zdGF0aWMgTlNTdHJpbmcqIHBhdGhGcm9tRm9u
dChOU0ZvbnQgKmZvbnQpCi17Ci0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQVRTRm9u
dFJlZiBhdHNGb250ID0gRk1HZXRBVFNGb250UmVmRnJvbUZvbnQoQ1RGb250R2V0UGxhdGZvcm1G
b250KHRvQ1RGb250UmVmKGZvbnQpLCAwKSk7Ci0jZWxzZQotICAgIEFUU0ZvbnRSZWYgYXRzRm9u
dCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHdrR2V0TlNGb250QVRTVUZvbnRJZChmb250KSk7
Ci0jZW5kaWYKLSAgICBGU1JlZiBmaWxlUmVmOwotCi0jaWZuZGVmIEJVSUxESU5HX09OX1RJR0VS
Ci0gICAgT1NTdGF0dXMgc3RhdHVzID0gQVRTRm9udEdldEZpbGVSZWZlcmVuY2UoYXRzRm9udCwg
JmZpbGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBuaWw7
Ci0jZWxzZQotICAgIEZTU3BlYyBvRmlsZTsKLSAgICBPU1N0YXR1cyBzdGF0dXMgPSBBVFNGb250
R2V0RmlsZVNwZWNpZmljYXRpb24oYXRzRm9udCwgJm9GaWxlKTsKLSAgICBpZiAoc3RhdHVzICE9
IG5vRXJyKQotICAgICAgICByZXR1cm4gbmlsOwotCi0gICAgc3RhdHVzID0gRlNwTWFrZUZTUmVm
KCZvRmlsZSwgJmZpbGVSZWYpOwotICAgIGlmIChzdGF0dXMgIT0gbm9FcnIpCi0gICAgICAgIHJl
dHVybiBuaWw7Ci0jZW5kaWYKIAotICAgIFVJbnQ4IGZpbGVQYXRoQnVmZmVyW1BBVEhfTUFYXTsK
LSAgICBzdGF0dXMgPSBGU1JlZk1ha2VQYXRoKCZmaWxlUmVmLCBmaWxlUGF0aEJ1ZmZlciwgUEFU
SF9NQVgpOwotICAgIGlmIChzdGF0dXMgPT0gbm9FcnIpCi0gICAgICAgIHJldHVybiBbTlNTdHJp
bmcgc3RyaW5nV2l0aFVURjhTdHJpbmc6KGNvbnN0IGNoYXIqKWZpbGVQYXRoQnVmZmVyXTsKLQot
ICAgIHJldHVybiBuaWw7Ci19Ci0jZW5kaWYgLy8gX19MUDY0X18KLSNlbmRpZiAvLyAhRVJST1Jf
RElTQUJMRUQKLQotdm9pZCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Jbml0KCkKLXsKLSNpZmRl
ZiBCVUlMRElOR19PTl9USUdFUgotICAgIG1fc3R5bGVHcm91cCA9IDA7Ci0jZW5kaWYKLSNpZiBV
U0UoQVRTVUkpCi0gICAgbV9BVFNVTWlycm9ycyA9IGZhbHNlOwotICAgIG1fY2hlY2tlZFNoYXBl
c0FyYWJpYyA9IGZhbHNlOwotICAgIG1fc2hhcGVzQXJhYmljID0gZmFsc2U7Ci0jZW5kaWYKLQot
ICAgIG1fc3ludGhldGljQm9sZE9mZnNldCA9IG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9s
ZCA/IDEuMGYgOiAwLmY7Ci0KLSAgICBib29sIGZhaWxlZFNldHVwID0gZmFsc2U7Ci0gICAgaWYg
KCFpbml0Rm9udERhdGEodGhpcykpIHsKLSAgICAgICAgLy8gQWNrISBTb21ldGhpbmcgdmVyeSBi
YWQgaGFwcGVuZWQsIGxpa2UgYSBjb3JydXB0IGZvbnQuCi0gICAgICAgIC8vIFRyeSBsb29raW5n
IGZvciBhbiBhbHRlcm5hdGUgJ2Jhc2UnIGZvbnQgZm9yIHRoaXMgcmVuZGVyZXIuCi0KLSAgICAg
ICAgLy8gU3BlY2lhbCBjYXNlIGhhY2sgdG8gdXNlICJUaW1lcyBOZXcgUm9tYW4iIGluIHBsYWNl
IG9mICJUaW1lcyIuCi0gICAgICAgIC8vICJUaW1lcyBSTyIgaXMgYSBjb21tb24gZm9udCB3aG9z
ZSBmYW1pbHkgbmFtZSBpcyAiVGltZXMiLgotICAgICAgICAvLyBJdCBvdmVycmlkZXMgdGhlIG5v
cm1hbCAiVGltZXMiIGZhbWlseSBmb250LgotICAgICAgICAvLyBJdCBhbHNvIGFwcGVhcnMgdG8g
aGF2ZSBhIGNvcnJ1cHQgcmVndWxhciB2YXJpYW50LgotICAgICAgICBOU1N0cmluZyAqZmFsbGJh
Y2tGb250RmFtaWx5OwotICAgICAgICBpZiAoW1ttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5
TmFtZV0gaXNFcXVhbDpAIlRpbWVzIl0pCi0gICAgICAgICAgICBmYWxsYmFja0ZvbnRGYW1pbHkg
PSBAIlRpbWVzIE5ldyBSb21hbiI7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIGZhbGxiYWNr
Rm9udEZhbWlseSA9IHdlYkZhbGxiYWNrRm9udEZhbWlseSgpOwotICAgICAgICAKLSAgICAgICAg
Ly8gVHJ5IHNldHRpbmcgdXAgdGhlIGFsdGVybmF0ZSBmb250LgotICAgICAgICAvLyBUaGlzIGlz
IGEgbGFzdCBkaXRjaCBlZmZvcnQgdG8gdXNlIGEgc3Vic3RpdHV0ZSBmb250IHdoZW4gc29tZXRo
aW5nIGhhcyBnb25lIHdyb25nLgotI2lmICFFUlJPUl9ESVNBQkxFRAotICAgICAgICBSZXRhaW5Q
dHI8TlNGb250PiBpbml0aWFsRm9udCA9IG1fcGxhdGZvcm1EYXRhLmZvbnQoKTsKLSNlbmRpZgot
ICAgICAgICBpZiAobV9wbGF0Zm9ybURhdGEuZm9udCgpKQotICAgICAgICAgICAgbV9wbGF0Zm9y
bURhdGEuc2V0Rm9udChbW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdIGNvbnZlcnRG
b250Om1fcGxhdGZvcm1EYXRhLmZvbnQoKSB0b0ZhbWlseTpmYWxsYmFja0ZvbnRGYW1pbHldKTsK
LSAgICAgICAgZWxzZQotICAgICAgICAgICAgbV9wbGF0Zm9ybURhdGEuc2V0Rm9udChbTlNGb250
IGZvbnRXaXRoTmFtZTpmYWxsYmFja0ZvbnRGYW1pbHkgc2l6ZTptX3BsYXRmb3JtRGF0YS5zaXpl
KCldKTsKLSNpZiAhRVJST1JfRElTQUJMRUQKLSAgICAgICAgTlNTdHJpbmcgKmZpbGVQYXRoID0g
cGF0aEZyb21Gb250KGluaXRpYWxGb250LmdldCgpKTsKLSAgICAgICAgaWYgKCFmaWxlUGF0aCkK
LSAgICAgICAgICAgIGZpbGVQYXRoID0gQCJub3Qga25vd24iOwotI2VuZGlmCi0gICAgICAgIGlm
ICghaW5pdEZvbnREYXRhKHRoaXMpKSB7Ci0gICAgICAgICAgICBpZiAoW2ZhbGxiYWNrRm9udEZh
bWlseSBpc0VxdWFsOkAiVGltZXMgTmV3IFJvbWFuIl0pIHsKLSAgICAgICAgICAgICAgICAvLyBP
SywgY291bGRuJ3Qgc2V0dXAgVGltZXMgTmV3IFJvbWFuIGFzIGFuIGFsdGVybmF0ZSB0byBUaW1l
cywgZmFsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBvbiB0aGUgc3lzdGVtIGZvbnQuICBJZiB0
aGlzIGZhaWxzIHdlIGhhdmUgbm8gYWx0ZXJuYXRpdmUgbGVmdC4KLSAgICAgICAgICAgICAgICBt
X3BsYXRmb3JtRGF0YS5zZXRGb250KFtbTlNGb250TWFuYWdlciBzaGFyZWRGb250TWFuYWdlcl0g
Y29udmVydEZvbnQ6bV9wbGF0Zm9ybURhdGEuZm9udCgpIHRvRmFtaWx5OndlYkZhbGxiYWNrRm9u
dEZhbWlseSgpXSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFpbml0Rm9udERhdGEodGhpcykpIHsK
LSAgICAgICAgICAgICAgICAgICAgLy8gV2UgdHJpZWQsIFRpbWVzLCBUaW1lcyBOZXcgUm9tYW4s
IGFuZCB0aGUgc3lzdGVtIGZvbnQuIE5vIGpveS4gV2UgaGF2ZSB0byBnaXZlIHVwLgotICAgICAg
ICAgICAgICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAl
QCBhdCAlQCIsIGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAg
ICAgIGZhaWxlZFNldHVwID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9
IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIFdlIHRyaWVkIHRoZSByZXF1ZXN0ZWQgZm9udCBh
bmQgdGhlIHN5c3RlbSBmb250LiBObyBqb3kuIFdlIGhhdmUgdG8gZ2l2ZSB1cC4KLSAgICAgICAg
ICAgICAgICBMT0dfRVJST1IoInVuYWJsZSB0byBpbml0aWFsaXplIHdpdGggZm9udCAlQCBhdCAl
QCIsIGluaXRpYWxGb250LmdldCgpLCBmaWxlUGF0aCk7Ci0gICAgICAgICAgICAgICAgZmFpbGVk
U2V0dXAgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVw
b3J0IHRoZSBwcm9ibGVtLgotICAgICAgICBMT0dfRVJST1IoIkNvcnJ1cHQgZm9udCBkZXRlY3Rl
ZCwgdXNpbmcgJUAgaW4gcGxhY2Ugb2YgJUAgbG9jYXRlZCBhdCBcIiVAXCIuIiwKLSAgICAgICAg
ICAgIFttX3BsYXRmb3JtRGF0YS5mb250KCkgZmFtaWx5TmFtZV0sIFtpbml0aWFsRm9udC5nZXQo
KSBmYW1pbHlOYW1lXSwgZmlsZVBhdGgpOwotICAgIH0KLQotICAgIC8vIElmIGFsbCBlbHNlIGZh
aWxzLCB0cnkgdG8gc2V0IHVwIHVzaW5nIHRoZSBzeXN0ZW0gZm9udC4KLSAgICAvLyBUaGlzIGlz
IHByb2JhYmx5IGJlY2F1c2UgVGltZXMgYW5kIFRpbWVzIE5ldyBSb21hbiBhcmUgYm90aCB1bmF2
YWlsYWJsZS4KLSAgICBpZiAoZmFpbGVkU2V0dXApIHsKLSAgICAgICAgbV9wbGF0Zm9ybURhdGEu
c2V0Rm9udChbTlNGb250IHN5c3RlbUZvbnRPZlNpemU6W21fcGxhdGZvcm1EYXRhLmZvbnQoKSBw
b2ludFNpemVdXSk7Ci0gICAgICAgIExPR19FUlJPUigiZmFpbGVkIHRvIHNldCB1cCBmb250LCB1
c2luZyBzeXN0ZW0gZm9udCAlcyIsIG1fcGxhdGZvcm1EYXRhLmZvbnQoKSk7Ci0gICAgICAgIGlu
aXRGb250RGF0YSh0aGlzKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IGlBc2NlbnQ7Ci0gICAgaW50
IGlEZXNjZW50OwotICAgIGludCBpTGluZUdhcDsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdFUgot
ICAgIHdrR2V0Rm9udE1ldHJpY3MobV9wbGF0Zm9ybURhdGEuY2dGb250KCksICZpQXNjZW50LCAm
aURlc2NlbnQsICZpTGluZUdhcCwgJm1fdW5pdHNQZXJFbSk7Ci0jZWxzZQotICAgIGlBc2NlbnQg
PSBDR0ZvbnRHZXRBc2NlbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCkpOwotICAgIGlEZXNjZW50
ID0gQ0dGb250R2V0RGVzY2VudChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSk7Ci0gICAgaUxpbmVH
YXAgPSBDR0ZvbnRHZXRMZWFkaW5nKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsKLSAgICBtX3Vu
aXRzUGVyRW0gPSBDR0ZvbnRHZXRVbml0c1BlckVtKG1fcGxhdGZvcm1EYXRhLmNnRm9udCgpKTsK
LSNlbmRpZgotCi0gICAgZmxvYXQgcG9pbnRTaXplID0gbV9wbGF0Zm9ybURhdGEubV9zaXplOwot
ICAgIGZsb2F0IGZBc2NlbnQgPSBzY2FsZUVtVG9Vbml0cyhpQXNjZW50LCBtX3VuaXRzUGVyRW0p
ICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZEZXNjZW50ID0gLXNjYWxlRW1Ub1VuaXRzKGlEZXNj
ZW50LCBtX3VuaXRzUGVyRW0pICogcG9pbnRTaXplOwotICAgIGZsb2F0IGZMaW5lR2FwID0gc2Nh
bGVFbVRvVW5pdHMoaUxpbmVHYXAsIG1fdW5pdHNQZXJFbSkgKiBwb2ludFNpemU7Ci0KLSAgICAv
LyBXZSBuZWVkIHRvIGFkanVzdCBUaW1lcywgSGVsdmV0aWNhLCBhbmQgQ291cmllciB0byBjbG9z
ZWx5IG1hdGNoIHRoZQotICAgIC8vIHZlcnRpY2FsIG1ldHJpY3Mgb2YgdGhlaXIgTWljcm9zb2Z0
IGNvdW50ZXJwYXJ0cyB0aGF0IGFyZSB0aGUgZGUgZmFjdG8KLSAgICAvLyB3ZWIgc3RhbmRhcmQu
IFRoZSBBcHBLaXQgYWRqdXN0bWVudCBvZiAyMCUgaXMgdG9vIGJpZyBhbmQgaXMKLSAgICAvLyBp
bmNvcnJlY3RseSBhZGRlZCB0byBsaW5lIHNwYWNpbmcsIHNvIHdlIHVzZSBhIDE1JSBhZGp1c3Rt
ZW50IGluc3RlYWQKLSAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBhc2NlbnQuCi0gICAgTlNTdHJp
bmcgKmZhbWlseU5hbWUgPSBbbV9wbGF0Zm9ybURhdGEuZm9udCgpIGZhbWlseU5hbWVdOwotICAg
IGlmIChbZmFtaWx5TmFtZSBpc0VxdWFsVG9TdHJpbmc6QCJUaW1lcyJdIHx8IFtmYW1pbHlOYW1l
IGlzRXF1YWxUb1N0cmluZzpAIkhlbHZldGljYSJdIHx8IFtmYW1pbHlOYW1lIGlzRXF1YWxUb1N0
cmluZzpAIkNvdXJpZXIiXSkKLSAgICAgICAgZkFzY2VudCArPSBmbG9vcmYoKChmQXNjZW50ICsg
ZkRlc2NlbnQpICogMC4xNWYpICsgMC41Zik7Ci0gICAgZWxzZSBpZiAoW2ZhbWlseU5hbWUgaXNF
cXVhbFRvU3RyaW5nOkAiR2VlemEgUHJvIl0pIHsKLSAgICAgICAgLy8gR2VlemEgUHJvIGhhcyBn
bHlwaHMgdGhhdCBkcmF3IHNsaWdodGx5IGFib3ZlIHRoZSBhc2NlbnQgb3IgZmFyIGJlbG93IHRo
ZSBkZXNjZW50LiBBZGp1c3QKLSAgICAgICAgLy8gdGhvc2UgdmVydGljYWwgbWV0cmljcyB0byBi
ZXR0ZXIgbWF0Y2ggcmVhbGl0eSwgc28gdGhhdCBkaWFjcml0aWNzIGF0IHRoZSBib3R0b20gb2Yg
b25lIGxpbmUKLSAgICAgICAgLy8gZG8gbm90IG92ZXJsYXAgZGlhY3JpdGljcyBhdCB0aGUgdG9w
IG9mIHRoZSBuZXh0IGxpbmUuCi0gICAgICAgIGZBc2NlbnQgKj0gMS4wOGY7Ci0gICAgICAgIGZE
ZXNjZW50ICo9IDIuZjsKLSAgICB9Ci0KLSAgICBtX2FzY2VudCA9IGxyb3VuZGYoZkFzY2VudCk7
Ci0gICAgbV9kZXNjZW50ID0gbHJvdW5kZihmRGVzY2VudCk7Ci0gICAgbV9saW5lR2FwID0gbHJv
dW5kZihmTGluZUdhcCk7Ci0gICAgbV9saW5lU3BhY2luZyA9IG1fYXNjZW50ICsgbV9kZXNjZW50
ICsgbV9saW5lR2FwOwotICAgIAotICAgIC8vIEhhY2sgSGlyYWdpbm8gbGluZSBtZXRyaWNzIHRv
IGFsbG93IHJvb20gZm9yIG1hcmtlZCB0ZXh0IHVuZGVybGluZXMuCi0gICAgLy8gPHJkYXI6Ly9w
cm9ibGVtLzUzODYxODM+Ci0gICAgaWYgKG1fZGVzY2VudCA8IDMgJiYgbV9saW5lR2FwID49IDMg
JiYgW2ZhbWlseU5hbWUgaGFzUHJlZml4OkAiSGlyYWdpbm8iXSkgewotICAgICAgICBtX2xpbmVH
YXAgLT0gMyAtIG1fZGVzY2VudDsKLSAgICAgICAgbV9kZXNjZW50ID0gMzsKLSAgICB9Ci0gICAg
Ci0gICAgLy8gTWVhc3VyZSB0aGUgYWN0dWFsIGNoYXJhY3RlciAieCIsIGJlY2F1c2UgQXBwS2l0
IHN5bnRoZXNpemVzIFggaGVpZ2h0IHJhdGhlciB0aGFuIGdldHRpbmcgaXQgZnJvbSB0aGUgZm9u
dC4KLSAgICAvLyBVbmZvcnR1bmF0ZWx5LCBOU0ZvbnQgd2lsbCByb3VuZCB0aGlzIGZvciB1cyBz
byB3ZSBkb24ndCBxdWl0ZSBnZXQgdGhlIHJpZ2h0IHZhbHVlLgotICAgIEdseXBoUGFnZSogZ2x5
cGhQYWdlWmVybyA9IEdseXBoUGFnZVRyZWVOb2RlOjpnZXRSb290Q2hpbGQodGhpcywgMCktPnBh
Z2UoKTsKLSAgICBOU0dseXBoIHhHbHlwaCA9IGdseXBoUGFnZVplcm8gPyBnbHlwaFBhZ2VaZXJv
LT5nbHlwaERhdGFGb3JDaGFyYWN0ZXIoJ3gnKS5nbHlwaCA6IDA7Ci0gICAgaWYgKHhHbHlwaCkg
ewotICAgICAgICBOU1JlY3QgeEJveCA9IFttX3BsYXRmb3JtRGF0YS5mb250KCkgYm91bmRpbmdS
ZWN0Rm9yR2x5cGg6eEdseXBoXTsKLSAgICAgICAgLy8gVXNlIHRoZSBtYXhpbXVtIG9mIGVpdGhl
ciB3aWR0aCBvciBoZWlnaHQgYmVjYXVzZSAieCIgaXMgbmVhcmx5IHNxdWFyZQotICAgICAgICAv
LyBhbmQgd2ViIHBhZ2VzIHRoYXQgZm9vbGlzaGx5IHVzZSB0aGlzIG1ldHJpYyBmb3Igd2lkdGgg
d2lsbCBiZSBsYWlkIG91dAotICAgICAgICAvLyBwb29ybHkgaWYgd2UgcmV0dXJuIGFuIGFjY3Vy
YXRlIGhlaWdodC4gQ2xhc3NpYyBjYXNlIGlzIFRpbWVzIDEzIHBvaW50LAotICAgICAgICAvLyB3
aGljaCBoYXMgYW4gIngiIHRoYXQgaXMgN3g2IHBpeGVscy4KLSAgICAgICAgbV94SGVpZ2h0ID0g
bWF4KE5TTWF4WCh4Qm94KSwgTlNNYXhZKHhCb3gpKTsKLSAgICB9IGVsc2UKLSAgICAgICAgbV94
SGVpZ2h0ID0gW21fcGxhdGZvcm1EYXRhLmZvbnQoKSB4SGVpZ2h0XTsKLX0KLSAgICAKLXN0YXRp
YyBDRkRhdGFSZWYgY29weUZvbnRUYWJsZUZvclRhZyhGb250UGxhdGZvcm1EYXRhIHBsYXRmb3Jt
RGF0YSwgRm91ckNoYXJDb2RlIHRhYmxlTmFtZSkKLXsKLSNpZmRlZiBCVUlMRElOR19PTl9USUdF
UgotICAgIEFUU0ZvbnRSZWYgYXRzRm9udCA9IEZNR2V0QVRTRm9udFJlZkZyb21Gb250KHBsYXRm
b3JtRGF0YS5tX2F0c3VGb250SUQpOwotCi0gICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKLSAgICBp
ZiAoQVRTRm9udEdldFRhYmxlKGF0c0ZvbnQsIHRhYmxlTmFtZSwgMCwgMCwgTlVMTCwgJnRhYmxl
U2l6ZSkgIT0gbm9FcnIpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENGTXV0YWJsZURh
dGFSZWYgZGF0YSA9IENGRGF0YUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgdGFi
bGVTaXplKTsKLSAgICBpZiAoIWRhdGEpCi0gICAgICAgIHJldHVybiAwOwotICAgIAotICAgIENG
RGF0YUluY3JlYXNlTGVuZ3RoKGRhdGEsIHRhYmxlU2l6ZSk7Ci0gICAgaWYgKEFUU0ZvbnRHZXRU
YWJsZShhdHNGb250LCB0YWJsZU5hbWUsIDAsIHRhYmxlU2l6ZSwgQ0ZEYXRhR2V0TXV0YWJsZUJ5
dGVQdHIoZGF0YSksICZ0YWJsZVNpemUpICE9IG5vRXJyKSB7Ci0gICAgICAgIENGUmVsZWFzZShk
YXRhKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBkYXRhOwot
I2Vsc2UKLSAgICByZXR1cm4gQ0dGb250Q29weVRhYmxlRm9yVGFnKHBsYXRmb3JtRGF0YS5jZ0Zv
bnQoKSwgdGFibGVOYW1lKTsKLSNlbmRpZgotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0
Zm9ybUNoYXJXaWR0aEluaXQoKQotewotICAgIG1fYXZnQ2hhcldpZHRoID0gMDsKLSAgICBtX21h
eENoYXJXaWR0aCA9IDA7Ci0gICAgCi0gICAgUmV0YWluUHRyPENGRGF0YVJlZj4gb3MyVGFibGUo
QWRvcHRDRiwgY29weUZvbnRUYWJsZUZvclRhZyhtX3BsYXRmb3JtRGF0YSwgJ09TLzInKSk7Ci0g
ICAgaWYgKG9zMlRhYmxlICYmIENGRGF0YUdldExlbmd0aChvczJUYWJsZS5nZXQoKSkgPj0gNCkg
ewotICAgICAgICBjb25zdCBVSW50OCogb3MyID0gQ0ZEYXRhR2V0Qnl0ZVB0cihvczJUYWJsZS5n
ZXQoKSk7Ci0gICAgICAgIFNJbnQxNiBvczJBdmdDaGFyV2lkdGggPSBvczJbMl0gKiAyNTYgKyBv
czJbM107Ci0gICAgICAgIG1fYXZnQ2hhcldpZHRoID0gc2NhbGVFbVRvVW5pdHMob3MyQXZnQ2hh
cldpZHRoLCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0KLQot
ICAgIFJldGFpblB0cjxDRkRhdGFSZWY+IGhlYWRUYWJsZShBZG9wdENGLCBjb3B5Rm9udFRhYmxl
Rm9yVGFnKG1fcGxhdGZvcm1EYXRhLCAnaGVhZCcpKTsKLSAgICBpZiAoaGVhZFRhYmxlICYmIENG
RGF0YUdldExlbmd0aChoZWFkVGFibGUuZ2V0KCkpID49IDQyKSB7Ci0gICAgICAgIGNvbnN0IFVJ
bnQ4KiBoZWFkID0gQ0ZEYXRhR2V0Qnl0ZVB0cihoZWFkVGFibGUuZ2V0KCkpOwotICAgICAgICB1
c2hvcnQgdXhNaW4gPSBoZWFkWzM2XSAqIDI1NiArIGhlYWRbMzddOwotICAgICAgICB1c2hvcnQg
dXhNYXggPSBoZWFkWzQwXSAqIDI1NiArIGhlYWRbNDFdOwotICAgICAgICBTSW50MTYgeE1pbiA9
IHN0YXRpY19jYXN0PFNJbnQxNj4odXhNaW4pOwotICAgICAgICBTSW50MTYgeE1heCA9IHN0YXRp
Y19jYXN0PFNJbnQxNj4odXhNYXgpOwotICAgICAgICBmbG9hdCBkaWZmID0gc3RhdGljX2Nhc3Q8
ZmxvYXQ+KHhNYXggLSB4TWluKTsKLSAgICAgICAgbV9tYXhDaGFyV2lkdGggPSBzY2FsZUVtVG9V
bml0cyhkaWZmLCBtX3VuaXRzUGVyRW0pICogbV9wbGF0Zm9ybURhdGEubV9zaXplOwotICAgIH0K
LQotICAgIC8vIEZhbGxiYWNrIHRvIGEgY3Jvc3MtcGxhdGZvcm0gZXN0aW1hdGUsIHdoaWNoIHdp
bGwgcG9wdWxhdGUgdGhlc2UgdmFsdWVzIGlmIHRoZXkgYXJlIG5vbi1wb3NpdGl2ZS4KLSAgICBp
bml0Q2hhcldpZHRocygpOwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybURlc3Ry
b3koKQotewotI2lmZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgaWYgKG1fc3R5bGVHcm91cCkK
LSAgICAgICAgd2tSZWxlYXNlU3R5bGVHcm91cChtX3N0eWxlR3JvdXApOwotI2VuZGlmCi0jaWYg
VVNFKEFUU1VJKQotICAgIEhhc2hNYXA8dW5zaWduZWQsIEFUU1VTdHlsZT46Oml0ZXJhdG9yIGVu
ZCA9IG1fQVRTVVN0eWxlTWFwLmVuZCgpOwotICAgIGZvciAoSGFzaE1hcDx1bnNpZ25lZCwgQVRT
VVN0eWxlPjo6aXRlcmF0b3IgaXQgPSBtX0FUU1VTdHlsZU1hcC5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpCi0gICAgICAgIEFUU1VEaXNwb3NlU3R5bGUoaXQtPnNlY29uZCk7Ci0jZW5kaWYKLX0K
LQotU2ltcGxlRm9udERhdGEqIFNpbXBsZUZvbnREYXRhOjpzbWFsbENhcHNGb250RGF0YShjb25z
dCBGb250RGVzY3JpcHRpb24mIGZvbnREZXNjcmlwdGlvbikgY29uc3QKLXsKLSAgICBpZiAoIW1f
c21hbGxDYXBzRm9udERhdGEpIHsKLSAgICAgICAgaWYgKGlzQ3VzdG9tRm9udCgpKSB7Ci0gICAg
ICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnREYXRhKG1fcGxhdGZvcm1EYXRh
KTsKLSAgICAgICAgICAgIHNtYWxsQ2Fwc0ZvbnREYXRhLm1fc2l6ZSA9IHNtYWxsQ2Fwc0ZvbnRE
YXRhLm1fc2l6ZSAqIHNtYWxsQ2Fwc0ZvbnRTaXplTXVsdGlwbGllcjsKLSAgICAgICAgICAgIG1f
c21hbGxDYXBzRm9udERhdGEgPSBuZXcgU2ltcGxlRm9udERhdGEoc21hbGxDYXBzRm9udERhdGEs
IHRydWUsIGZhbHNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEJFR0lOX0JMT0NL
X09CSkNfRVhDRVBUSU9OUzsKLSAgICAgICAgICAgIGZsb2F0IHNpemUgPSBbbV9wbGF0Zm9ybURh
dGEuZm9udCgpIHBvaW50U2l6ZV0gKiBzbWFsbENhcHNGb250U2l6ZU11bHRpcGxpZXI7Ci0gICAg
ICAgICAgICBGb250UGxhdGZvcm1EYXRhIHNtYWxsQ2Fwc0ZvbnQoW1tOU0ZvbnRNYW5hZ2VyIHNo
YXJlZEZvbnRNYW5hZ2VyXSBjb252ZXJ0Rm9udDptX3BsYXRmb3JtRGF0YS5mb250KCkgdG9TaXpl
OnNpemVdKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gQXBwS2l0IHJlc2V0cyB0aGUg
dHlwZSBpbmZvcm1hdGlvbiAoc2NyZWVuL3ByaW50ZXIpIHdoZW4geW91IGNvbnZlcnQgYSBmb250
IHRvIGEgZGlmZmVyZW50IHNpemUuCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0
aGUgZm9udCB0aGF0IHdlJ3JlIGhhbmRlZCBiYWNrLgotICAgICAgICAgICAgc21hbGxDYXBzRm9u
dC5zZXRGb250KGZvbnREZXNjcmlwdGlvbi51c2VQcmludGVyRm9udCgpID8gW3NtYWxsQ2Fwc0Zv
bnQuZm9udCgpIHByaW50ZXJGb250XSA6IFtzbWFsbENhcHNGb250LmZvbnQoKSBzY3JlZW5Gb250
XSk7Ci0KLSAgICAgICAgICAgIGlmIChzbWFsbENhcHNGb250LmZvbnQoKSkgewotICAgICAgICAg
ICAgICAgIE5TRm9udE1hbmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVk
Rm9udE1hbmFnZXJdOwotICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayBmb250VHJhaXRz
ID0gW2ZvbnRNYW5hZ2VyIHRyYWl0c09mRm9udDptX3BsYXRmb3JtRGF0YS5mb250KCldOwotCi0g
ICAgICAgICAgICAgICAgaWYgKG1fcGxhdGZvcm1EYXRhLm1fc3ludGhldGljQm9sZCkKLSAgICAg
ICAgICAgICAgICAgICAgZm9udFRyYWl0cyB8PSBOU0JvbGRGb250TWFzazsKLSAgICAgICAgICAg
ICAgICBpZiAobV9wbGF0Zm9ybURhdGEubV9zeW50aGV0aWNPYmxpcXVlKQotICAgICAgICAgICAg
ICAgICAgICBmb250VHJhaXRzIHw9IE5TSXRhbGljRm9udE1hc2s7Ci0KLSAgICAgICAgICAgICAg
ICBOU0ZvbnRUcmFpdE1hc2sgc21hbGxDYXBzRm9udFRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFp
dHNPZkZvbnQ6c21hbGxDYXBzRm9udC5mb250KCldOwotICAgICAgICAgICAgICAgIHNtYWxsQ2Fw
c0ZvbnQubV9zeW50aGV0aWNCb2xkID0gKGZvbnRUcmFpdHMgJiBOU0JvbGRGb250TWFzaykgJiYg
IShzbWFsbENhcHNGb250VHJhaXRzICYgTlNCb2xkRm9udE1hc2spOwotICAgICAgICAgICAgICAg
IHNtYWxsQ2Fwc0ZvbnQubV9zeW50aGV0aWNPYmxpcXVlID0gKGZvbnRUcmFpdHMgJiBOU0l0YWxp
Y0ZvbnRNYXNrKSAmJiAhKHNtYWxsQ2Fwc0ZvbnRUcmFpdHMgJiBOU0l0YWxpY0ZvbnRNYXNrKTsK
LQotICAgICAgICAgICAgICAgIG1fc21hbGxDYXBzRm9udERhdGEgPSBmb250Q2FjaGUoKS0+Z2V0
Q2FjaGVkRm9udERhdGEoJnNtYWxsQ2Fwc0ZvbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAg
ICAgRU5EX0JMT0NLX09CSkNfRVhDRVBUSU9OUzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1
cm4gbV9zbWFsbENhcHNGb250RGF0YTsKLX0KLQotYm9vbCBTaW1wbGVGb250RGF0YTo6Y29udGFp
bnNDaGFyYWN0ZXJzKGNvbnN0IFVDaGFyKiBjaGFyYWN0ZXJzLCBpbnQgbGVuZ3RoKSBjb25zdAot
ewotICAgIE5TU3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aENoYXJh
Y3RlcnNOb0NvcHk6Y29uc3RfY2FzdDx1bmljaGFyKj4oY2hhcmFjdGVycykgbGVuZ3RoOmxlbmd0
aCBmcmVlV2hlbkRvbmU6Tk9dOwotICAgIE5TQ2hhcmFjdGVyU2V0ICpzZXQgPSBbW21fcGxhdGZv
cm1EYXRhLmZvbnQoKSBjb3ZlcmVkQ2hhcmFjdGVyU2V0XSBpbnZlcnRlZFNldF07Ci0gICAgYm9v
bCByZXN1bHQgPSBzZXQgJiYgW3N0cmluZyByYW5nZU9mQ2hhcmFjdGVyRnJvbVNldDpzZXRdLmxv
Y2F0aW9uID09IE5TTm90Rm91bmQ7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgICByZXR1cm4g
cmVzdWx0OwotfQotCi12b2lkIFNpbXBsZUZvbnREYXRhOjpkZXRlcm1pbmVQaXRjaCgpCi17Ci0g
ICAgTlNGb250KiBmID0gbV9wbGF0Zm9ybURhdGEuZm9udCgpOwotICAgIC8vIFNwZWNpYWwgY2Fz
ZSBPc2FrYS1Nb25vLgotICAgIC8vIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2
Nz4sIHdlIHNob3VsZCB0cmVhdCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5v
dGUgdGhhdCB0aGUgQXBwS2l0IGRvZXMgbm90IHJlcG9ydCBPc2FrYS1Nb25vIGFzIGZpeGVkIHBp
dGNoLgotCi0gICAgLy8gU3BlY2lhbCBjYXNlIE1TLVBHb3RoaWMuCi0gICAgLy8gQWNjb3JkaW5n
IHRvIDxyZGFyOi8vcHJvYmxlbS80MDMyOTM4Piwgd2Ugc2hvdWxkIG5vdCB0cmVhdCBNUy1QR290
aGljIGFzIGZpeGVkIHBpdGNoLgotICAgIC8vIE5vdGUgdGhhdCBBcHBLaXQgZG9lcyByZXBvcnQg
TVMtUEdvdGhpYyBhcyBmaXhlZCBwaXRjaC4KLQotICAgIC8vIFNwZWNpYWwgY2FzZSBNb25vdHlw
ZUNvcnNpdmEKLSAgICAvLyBBY2NvcmRpbmcgdG8gPHJkYXI6Ly9wcm9ibGVtLzU0NTQ3MDQ+LCB3
ZSBzaG91bGQgbm90IHRyZWF0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBwaXRjaC4KLSAgICAv
LyBOb3RlIHRoYXQgQXBwS2l0IGRvZXMgcmVwb3J0IE1vbm90eXBlQ29yc2l2YSBhcyBmaXhlZCBw
aXRjaC4KLQotICAgIE5TU3RyaW5nICpuYW1lID0gW2YgZm9udE5hbWVdOwotICAgIG1fdHJlYXRB
c0ZpeGVkUGl0Y2ggPSAoW2YgaXNGaXhlZFBpdGNoXSB8fCBbZiBfaXNGYWtlRml4ZWRQaXRjaF0g
fHwKLSAgICAgICAgICAgW25hbWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8i
XSA9PSBOU09yZGVyZWRTYW1lKSAmJgotICAgICAgICAgICBbbmFtZSBjYXNlSW5zZW5zaXRpdmVD
b21wYXJlOkAiTVMtUEdvdGhpYyJdICE9IE5TT3JkZXJlZFNhbWUgJiYKLSAgICAgICAgICAgW25h
bWUgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk1vbm90eXBlQ29yc2l2YSJdICE9IE5TT3JkZXJl
ZFNhbWU7Ci19Ci0KLUZsb2F0UmVjdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1Cb3VuZHNGb3JH
bHlwaChHbHlwaCBnbHlwaCkgY29uc3QKLXsKLSAgICBGbG9hdFJlY3QgYm91bmRpbmdCb3g7Ci0j
aWZuZGVmIEJVSUxESU5HX09OX1RJR0VSCi0gICAgQ0dSZWN0IGJveDsKLSAgICBDR0ZvbnRHZXRH
bHlwaEJCb3hlcyhwbGF0Zm9ybURhdGEoKS5jZ0ZvbnQoKSwgJmdseXBoLCAxLCAmYm94KTsKLSAg
ICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5tX3NpemU7Ci0gICAgQ0dGbG9hdCBz
Y2FsZSA9IHBvaW50U2l6ZSAvIHVuaXRzUGVyRW0oKTsKLSAgICBib3VuZGluZ0JveCA9IENHUmVj
dEFwcGx5QWZmaW5lVHJhbnNmb3JtKGJveCwgQ0dBZmZpbmVUcmFuc2Zvcm1NYWtlU2NhbGUoc2Nh
bGUsIC1zY2FsZSkpOwotICAgIGlmIChtX3N5bnRoZXRpY0JvbGRPZmZzZXQpCi0gICAgICAgIGJv
dW5kaW5nQm94LnNldFdpZHRoKGJvdW5kaW5nQm94LndpZHRoKCkgKyBtX3N5bnRoZXRpY0JvbGRP
ZmZzZXQpOwotI2Vsc2UKLSAgICBVTlVTRURfUEFSQU0oZ2x5cGgpOwotI2VuZGlmCi0gICAgcmV0
dXJuIGJvdW5kaW5nQm94OwotfQotCi1mbG9hdCBTaW1wbGVGb250RGF0YTo6cGxhdGZvcm1XaWR0
aEZvckdseXBoKEdseXBoIGdseXBoKSBjb25zdAotewotICAgIE5TRm9udCogZm9udCA9IHBsYXRm
b3JtRGF0YSgpLmZvbnQoKTsKLSAgICBmbG9hdCBwb2ludFNpemUgPSBwbGF0Zm9ybURhdGEoKS5t
X3NpemU7Ci0gICAgQ0dBZmZpbmVUcmFuc2Zvcm0gbSA9IENHQWZmaW5lVHJhbnNmb3JtTWFrZVNj
YWxlKHBvaW50U2l6ZSwgcG9pbnRTaXplKTsKLSAgICBDR1NpemUgYWR2YW5jZTsKLSAgICBpZiAo
IXdrR2V0R2x5cGhUcmFuc2Zvcm1lZEFkdmFuY2VzKHBsYXRmb3JtRGF0YSgpLmNnRm9udCgpLCBm
b250LCAmbSwgJmdseXBoLCAmYWR2YW5jZSkpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJVbmFibGUg
dG8gY2FjaGUgZ2x5cGggd2lkdGhzIGZvciAlQCAlZiIsIFtmb250IGRpc3BsYXlOYW1lXSwgcG9p
bnRTaXplKTsKLSAgICAgICAgYWR2YW5jZS53aWR0aCA9IDA7Ci0gICAgfQotICAgIHJldHVybiBh
ZHZhbmNlLndpZHRoICsgbV9zeW50aGV0aWNCb2xkT2Zmc2V0OwotfQotCi0jaWYgVVNFKEFUU1VJ
KQotdm9pZCBTaW1wbGVGb250RGF0YTo6Y2hlY2tTaGFwZXNBcmFiaWMoKSBjb25zdAotewotICAg
IEFTU0VSVCghbV9jaGVja2VkU2hhcGVzQXJhYmljKTsKLQotICAgIG1fY2hlY2tlZFNoYXBlc0Fy
YWJpYyA9IHRydWU7Ci0gICAgCi0gICAgQVRTVUZvbnRJRCBmb250SUQgPSBtX3BsYXRmb3JtRGF0
YS5tX2F0c3VGb250SUQ7Ci0gICAgaWYgKCFmb250SUQpIHsKLSAgICAgICAgTE9HX0VSUk9SKCJ1
bmFibGUgdG8gZ2V0IEFUU1VGb250SUQgZm9yICVAIiwgbV9wbGF0Zm9ybURhdGEuZm9udCgpKTsK
LSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVk
IG9ubHkgb24gZm9udHMgdGhhdCBjb250YWluIEFyYWJpYyBnbHlwaHMuIE91cgotICAgIC8vIGhl
dXJpc3RpYyBpcyB0aGF0IGlmIHN1Y2ggYSBmb250IGhhcyBhIGdseXBoIG1ldGFtb3JwaG9zaXMg
dGFibGUsIHRoZW4KLSAgICAvLyBpdCBpbmNsdWRlcyBzaGFwaW5nIGluZm9ybWF0aW9uIGZvciBB
cmFiaWMuCi0gICAgRm91ckNoYXJDb2RlIHRhYmxlc1tdID0geyAnbW9yeCcsICdtb3J0JyB9Owot
ICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGVzKSAvIHNpemVvZih0YWJs
ZXNbMF0pOyArK2kpIHsKLSAgICAgICAgQnl0ZUNvdW50IHRhYmxlU2l6ZTsKLSAgICAgICAgT1NT
dGF0dXMgc3RhdHVzID0gQVRTRm9udEdldFRhYmxlKGZvbnRJRCwgdGFibGVzW2ldLCAwLCAwLCAw
LCAmdGFibGVTaXplKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBub0VycikgewotICAgICAgICAg
ICAgbV9zaGFwZXNBcmFiaWMgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9
Ci0KLSAgICAgICAgaWYgKHN0YXR1cyAhPSBrQVRTSW52YWxpZEZvbnRUYWJsZUFjY2VzcykKLSAg
ICAgICAgICAgIExPR19FUlJPUigiQVRTRm9udEdldFRhYmxlIGZhaWxlZCAoJWQpIiwgc3RhdHVz
KTsKLSAgICB9Ci19Ci0jZW5kaWYKLQotI2lmIFVTRShDT1JFX1RFWFQpCiBDVEZvbnRSZWYgU2lt
cGxlRm9udERhdGE6OmdldENURm9udCgpIGNvbnN0CiB7CiAgICAgaWYgKGdldE5TRm9udCgpKQog
ICAgICAgICByZXR1cm4gdG9DVEZvbnRSZWYoZ2V0TlNGb250KCkpOwogICAgIGlmICghbV9DVEZv
bnQpCi0gICAgICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNzRm9u
dChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCBOVUxMLCBO
VUxMKSk7CisgICAgICAgIG1fQ1RGb250LmFkb3B0Q0YoQ1RGb250Q3JlYXRlV2l0aEdyYXBoaWNz
Rm9udChtX3BsYXRmb3JtRGF0YS5jZ0ZvbnQoKSwgbV9wbGF0Zm9ybURhdGEuc2l6ZSgpLCAwLCAw
KSk7CiAgICAgcmV0dXJuIG1fQ1RGb250LmdldCgpOwogfQogCkBAIC01MDEsMTQgKzcyLDE0IEBA
IENGRGljdGlvbmFyeVJlZiBTaW1wbGVGb250RGF0YTo6Z2V0Q0ZTdHIKICAgICAgICAgc3RhdGlj
IGNvbnN0IHZvaWQqIGtleXNXaXRoS2VybmluZ0Rpc2FibGVkW10gPSB7IGtDVEZvbnRBdHRyaWJ1
dGVOYW1lLCBrQ1RLZXJuQXR0cmlidXRlTmFtZSwga0NUTGlnYXR1cmVBdHRyaWJ1dGVOYW1lIH07
CiAgICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5nRGlzYWJsZWRbXSA9IHsgZ2V0
Q1RGb250KCksIGtlcm5pbmdBZGp1c3RtZW50LCBhbGxvd0xpZ2F0dXJlcwogICAgICAgICAgICAg
PyBsaWdhdHVyZXNBbGxvd2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9OwotICAgICAgICBhdHRy
aWJ1dGVzRGljdGlvbmFyeS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShOVUxMLCBrZXlzV2l0
aEtlcm5pbmdEaXNhYmxlZCwgdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZCwKKyAgICAgICAgYXR0
cmlidXRlc0RpY3Rpb25hcnkuYWRvcHRDRihDRkRpY3Rpb25hcnlDcmVhdGUoMCwga2V5c1dpdGhL
ZXJuaW5nRGlzYWJsZWQsIHZhbHVlc1dpdGhLZXJuaW5nRGlzYWJsZWQsCiAgICAgICAgICAgICBz
aXplb2Yoa2V5c1dpdGhLZXJuaW5nRGlzYWJsZWQpIC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdE
aXNhYmxlZCksCiAgICAgICAgICAgICAma0NGQ29weVN0cmluZ0RpY3Rpb25hcnlLZXlDYWxsQmFj
a3MsICZrQ0ZUeXBlRGljdGlvbmFyeVZhbHVlQ2FsbEJhY2tzKSk7CiAgICAgfSBlbHNlIHsKICAg
ICAgICAgLy8gQnkgb21pdHRpbmcgdGhlIGtDVEtlcm5BdHRyaWJ1dGVOYW1lIGF0dHJpYnV0ZSwg
d2UgZ2V0IENvcmUgVGV4dCdzIHN0YW5kYXJkIGtlcm5pbmcuCiAgICAgICAgIHN0YXRpYyBjb25z
dCB2b2lkKiBrZXlzV2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGtDVEZvbnRBdHRyaWJ1dGVOYW1l
LCBrQ1RMaWdhdHVyZUF0dHJpYnV0ZU5hbWUgfTsKICAgICAgICAgY29uc3Qgdm9pZCogdmFsdWVz
V2l0aEtlcm5pbmdFbmFibGVkW10gPSB7IGdldENURm9udCgpLCBhbGxvd0xpZ2F0dXJlcyA/IGxp
Z2F0dXJlc0FsbG93ZWQgOiBsaWdhdHVyZXNOb3RBbGxvd2VkIH07Ci0gICAgICAgIGF0dHJpYnV0
ZXNEaWN0aW9uYXJ5LmFkb3B0Q0YoQ0ZEaWN0aW9uYXJ5Q3JlYXRlKE5VTEwsIGtleXNXaXRoS2Vy
bmluZ0VuYWJsZWQsIHZhbHVlc1dpdGhLZXJuaW5nRW5hYmxlZCwKKyAgICAgICAgYXR0cmlidXRl
c0RpY3Rpb25hcnkuYWRvcHRDRihDRkRpY3Rpb25hcnlDcmVhdGUoMCwga2V5c1dpdGhLZXJuaW5n
RW5hYmxlZCwgdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkLAogICAgICAgICAgICAgc2l6ZW9mKGtl
eXNXaXRoS2VybmluZ0VuYWJsZWQpIC8gc2l6ZW9mKCprZXlzV2l0aEtlcm5pbmdFbmFibGVkKSwK
ICAgICAgICAgICAgICZrQ0ZDb3B5U3RyaW5nRGljdGlvbmFyeUtleUNhbGxCYWNrcywgJmtDRlR5
cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpKTsKICAgICB9CkBAIC01MTYsNiArODcsNiBAQCBD
RkRpY3Rpb25hcnlSZWYgU2ltcGxlRm9udERhdGE6OmdldENGU3RyCiAgICAgcmV0dXJuIGF0dHJp
YnV0ZXNEaWN0aW9uYXJ5LmdldCgpOwogfQogCi0jZW5kaWYKLQogfSAvLyBuYW1lc3BhY2UgV2Vi
Q29yZQorCisjZW5kaWYKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBs
ZUZvbnREYXRhTWFjLm1tCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
bWFjL1NpbXBsZUZvbnREYXRhTWFjLm1tCShyZXZpc2lvbiA1ODUyMCkKKysrIFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvbWFjL1NpbXBsZUZvbnREYXRhTWFjLm1tCSh3b3JraW5nIGNvcHkpCkBA
IC00MzgsODQgKzQzOCw0IEBAIGZsb2F0IFNpbXBsZUZvbnREYXRhOjpwbGF0Zm9ybVdpZHRoRm9y
R2wKICAgICByZXR1cm4gYWR2YW5jZS53aWR0aCArIG1fc3ludGhldGljQm9sZE9mZnNldDsKIH0K
IAotI2lmIFVTRShBVFNVSSkKLXZvaWQgU2ltcGxlRm9udERhdGE6OmNoZWNrU2hhcGVzQXJhYmlj
KCkgY29uc3QKLXsKLSAgICBBU1NFUlQoIW1fY2hlY2tlZFNoYXBlc0FyYWJpYyk7Ci0KLSAgICBt
X2NoZWNrZWRTaGFwZXNBcmFiaWMgPSB0cnVlOwotICAgIAotICAgIEFUU1VGb250SUQgZm9udElE
ID0gbV9wbGF0Zm9ybURhdGEubV9hdHN1Rm9udElEOwotICAgIGlmICghZm9udElEKSB7Ci0gICAg
ICAgIExPR19FUlJPUigidW5hYmxlIHRvIGdldCBBVFNVRm9udElEIGZvciAlQCIsIG1fcGxhdGZv
cm1EYXRhLmZvbnQoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGZ1
bmN0aW9uIGlzIGNhbGxlZCBvbmx5IG9uIGZvbnRzIHRoYXQgY29udGFpbiBBcmFiaWMgZ2x5cGhz
LiBPdXIKLSAgICAvLyBoZXVyaXN0aWMgaXMgdGhhdCBpZiBzdWNoIGEgZm9udCBoYXMgYSBnbHlw
aCBtZXRhbW9ycGhvc2lzIHRhYmxlLCB0aGVuCi0gICAgLy8gaXQgaW5jbHVkZXMgc2hhcGluZyBp
bmZvcm1hdGlvbiBmb3IgQXJhYmljLgotICAgIEZvdXJDaGFyQ29kZSB0YWJsZXNbXSA9IHsgJ21v
cngnLCAnbW9ydCcgfTsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKHRhYmxl
cykgLyBzaXplb2YodGFibGVzWzBdKTsgKytpKSB7Ci0gICAgICAgIEJ5dGVDb3VudCB0YWJsZVNp
emU7Ci0gICAgICAgIE9TU3RhdHVzIHN0YXR1cyA9IEFUU0ZvbnRHZXRUYWJsZShmb250SUQsIHRh
Ymxlc1tpXSwgMCwgMCwgMCwgJnRhYmxlU2l6ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gbm9F
cnIpIHsKLSAgICAgICAgICAgIG1fc2hhcGVzQXJhYmljID0gdHJ1ZTsKLSAgICAgICAgICAgIHJl
dHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdGF0dXMgIT0ga0FUU0ludmFsaWRGb250
VGFibGVBY2Nlc3MpCi0gICAgICAgICAgICBMT0dfRVJST1IoIkFUU0ZvbnRHZXRUYWJsZSBmYWls
ZWQgKCVkKSIsIHN0YXR1cyk7Ci0gICAgfQotfQotI2VuZGlmCi0KLSNpZiBVU0UoQ09SRV9URVhU
KQotQ1RGb250UmVmIFNpbXBsZUZvbnREYXRhOjpnZXRDVEZvbnQoKSBjb25zdAotewotICAgIGlm
IChnZXROU0ZvbnQoKSkKLSAgICAgICAgcmV0dXJuIHRvQ1RGb250UmVmKGdldE5TRm9udCgpKTsK
LSAgICBpZiAoIW1fQ1RGb250KQotICAgICAgICBtX0NURm9udC5hZG9wdENGKENURm9udENyZWF0
ZVdpdGhHcmFwaGljc0ZvbnQobV9wbGF0Zm9ybURhdGEuY2dGb250KCksIG1fcGxhdGZvcm1EYXRh
LnNpemUoKSwgTlVMTCwgTlVMTCkpOwotICAgIHJldHVybiBtX0NURm9udC5nZXQoKTsKLX0KLQot
Q0ZEaWN0aW9uYXJ5UmVmIFNpbXBsZUZvbnREYXRhOjpnZXRDRlN0cmluZ0F0dHJpYnV0ZXMoVHlw
ZXNldHRpbmdGZWF0dXJlcyB0eXBlc2V0dGluZ0ZlYXR1cmVzKSBjb25zdAotewotICAgIHVuc2ln
bmVkIGtleSA9IHR5cGVzZXR0aW5nRmVhdHVyZXMgKyAxOwotICAgIHBhaXI8SGFzaE1hcDx1bnNp
Z25lZCwgUmV0YWluUHRyPENGRGljdGlvbmFyeVJlZj4gPjo6aXRlcmF0b3IsIGJvb2w+IGFkZFJl
c3VsdCA9IG1fQ0ZTdHJpbmdBdHRyaWJ1dGVzLmFkZChrZXksIFJldGFpblB0cjxDRkRpY3Rpb25h
cnlSZWY+KCkpOwotICAgIFJldGFpblB0cjxDRkRpY3Rpb25hcnlSZWY+JiBhdHRyaWJ1dGVzRGlj
dGlvbmFyeSA9IGFkZFJlc3VsdC5maXJzdC0+c2Vjb25kOwotICAgIGlmICghYWRkUmVzdWx0LnNl
Y29uZCkKLSAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXNEaWN0aW9uYXJ5LmdldCgpOwotCi0gICAg
Ym9vbCBhbGxvd0xpZ2F0dXJlcyA9IHBsYXRmb3JtRGF0YSgpLmFsbG93c0xpZ2F0dXJlcygpIHx8
ICh0eXBlc2V0dGluZ0ZlYXR1cmVzICYgTGlnYXR1cmVzKTsKLQotICAgIHN0YXRpYyBjb25zdCBp
bnQgbGlnYXR1cmVzTm90QWxsb3dlZFZhbHVlID0gMDsKLSAgICBzdGF0aWMgQ0ZOdW1iZXJSZWYg
bGlnYXR1cmVzTm90QWxsb3dlZCA9IENGTnVtYmVyQ3JlYXRlKGtDRkFsbG9jYXRvckRlZmF1bHQs
IGtDRk51bWJlckludFR5cGUsICZsaWdhdHVyZXNOb3RBbGxvd2VkVmFsdWUpOwotCi0gICAgc3Rh
dGljIGNvbnN0IGludCBsaWdhdHVyZXNBbGxvd2VkVmFsdWUgPSAxOwotICAgIHN0YXRpYyBDRk51
bWJlclJlZiBsaWdhdHVyZXNBbGxvd2VkID0gQ0ZOdW1iZXJDcmVhdGUoa0NGQWxsb2NhdG9yRGVm
YXVsdCwga0NGTnVtYmVySW50VHlwZSwgJmxpZ2F0dXJlc0FsbG93ZWRWYWx1ZSk7Ci0KLSAgICBp
ZiAoISh0eXBlc2V0dGluZ0ZlYXR1cmVzICYgS2VybmluZykpIHsKLSAgICAgICAgc3RhdGljIGNv
bnN0IGZsb2F0IGtlcm5pbmdBZGp1c3RtZW50VmFsdWUgPSAwOwotICAgICAgICBzdGF0aWMgQ0ZO
dW1iZXJSZWYga2VybmluZ0FkanVzdG1lbnQgPSBDRk51bWJlckNyZWF0ZShrQ0ZBbGxvY2F0b3JE
ZWZhdWx0LCBrQ0ZOdW1iZXJGbG9hdFR5cGUsICZrZXJuaW5nQWRqdXN0bWVudFZhbHVlKTsKLSAg
ICAgICAgc3RhdGljIGNvbnN0IHZvaWQqIGtleXNXaXRoS2VybmluZ0Rpc2FibGVkW10gPSB7IGtD
VEZvbnRBdHRyaWJ1dGVOYW1lLCBrQ1RLZXJuQXR0cmlidXRlTmFtZSwga0NUTGlnYXR1cmVBdHRy
aWJ1dGVOYW1lIH07Ci0gICAgICAgIGNvbnN0IHZvaWQqIHZhbHVlc1dpdGhLZXJuaW5nRGlzYWJs
ZWRbXSA9IHsgZ2V0Q1RGb250KCksIGtlcm5pbmdBZGp1c3RtZW50LCBhbGxvd0xpZ2F0dXJlcwot
ICAgICAgICAgICAgPyBsaWdhdHVyZXNBbGxvd2VkIDogbGlnYXR1cmVzTm90QWxsb3dlZCB9Owot
ICAgICAgICBhdHRyaWJ1dGVzRGljdGlvbmFyeS5hZG9wdENGKENGRGljdGlvbmFyeUNyZWF0ZShO
VUxMLCBrZXlzV2l0aEtlcm5pbmdEaXNhYmxlZCwgdmFsdWVzV2l0aEtlcm5pbmdEaXNhYmxlZCwK
LSAgICAgICAgICAgIHNpemVvZihrZXlzV2l0aEtlcm5pbmdEaXNhYmxlZCkgLyBzaXplb2YoKmtl
eXNXaXRoS2VybmluZ0Rpc2FibGVkKSwKLSAgICAgICAgICAgICZrQ0ZDb3B5U3RyaW5nRGljdGlv
bmFyeUtleUNhbGxCYWNrcywgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpKTsKLSAg
ICB9IGVsc2UgewotICAgICAgICAvLyBCeSBvbWl0dGluZyB0aGUga0NUS2VybkF0dHJpYnV0ZU5h
bWUgYXR0cmlidXRlLCB3ZSBnZXQgQ29yZSBUZXh0J3Mgc3RhbmRhcmQga2VybmluZy4KLSAgICAg
ICAgc3RhdGljIGNvbnN0IHZvaWQqIGtleXNXaXRoS2VybmluZ0VuYWJsZWRbXSA9IHsga0NURm9u
dEF0dHJpYnV0ZU5hbWUsIGtDVExpZ2F0dXJlQXR0cmlidXRlTmFtZSB9OwotICAgICAgICBjb25z
dCB2b2lkKiB2YWx1ZXNXaXRoS2VybmluZ0VuYWJsZWRbXSA9IHsgZ2V0Q1RGb250KCksIGFsbG93
TGlnYXR1cmVzID8gbGlnYXR1cmVzQWxsb3dlZCA6IGxpZ2F0dXJlc05vdEFsbG93ZWQgfTsKLSAg
ICAgICAgYXR0cmlidXRlc0RpY3Rpb25hcnkuYWRvcHRDRihDRkRpY3Rpb25hcnlDcmVhdGUoTlVM
TCwga2V5c1dpdGhLZXJuaW5nRW5hYmxlZCwgdmFsdWVzV2l0aEtlcm5pbmdFbmFibGVkLAotICAg
ICAgICAgICAgc2l6ZW9mKGtleXNXaXRoS2VybmluZ0VuYWJsZWQpIC8gc2l6ZW9mKCprZXlzV2l0
aEtlcm5pbmdFbmFibGVkKSwKLSAgICAgICAgICAgICZrQ0ZDb3B5U3RyaW5nRGljdGlvbmFyeUtl
eUNhbGxCYWNrcywgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpKTsKLSAgICB9Ci0K
LSAgICByZXR1cm4gYXR0cmlidXRlc0RpY3Rpb25hcnkuZ2V0KCk7Ci19Ci0KLSNlbmRpZgotCiB9
IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="38780"
          type_id="1"
          status="+"
          setter="mitz"
    />
          </attachment>
      

    </bug>

</bugzilla>