<?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>25770</bug_id>
          
          <creation_ts>2009-05-13 17:06:00 -0700</creation_ts>
          <short_desc>[chromium] Crash in FontFallbackList::determinePitch(const Font* font)</short_desc>
          <delta_ts>2011-01-13 22:16:52 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>CSS</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>Windows XP</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="Eric Seidel (no email)">eric</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>commit-queue</cc>
    
    <cc>hbono</cc>
    
    <cc>hyatt</cc>
    
    <cc>levin</cc>
    
    <cc>mitz</cc>
    
    <cc>sfalken</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>121166</commentid>
    <comment_count>0</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-13 17:06:00 -0700</bug_when>
    <thetext>Chrome is seeing reports of a few crashes in:

void FontFallbackList::determinePitch(const Font* font) const
{
    const FontData* fontData = primaryFont(font);
    if (!fontData-&gt;isSegmented()) // CRASH RIGHT HERE
        m_pitch = static_cast&lt;const SimpleFontData*&gt;(fontData)-&gt;pitch();
    else {
        const SegmentedFontData* segmentedFontData = static_cast&lt;const SegmentedFontData*&gt;(fontData);
        unsigned numRanges = segmentedFontData-&gt;numRanges();
        if (numRanges == 1)
            m_pitch = segmentedFontData-&gt;rangeAt(0).fontData()-&gt;pitch();
        else
            m_pitch = VariablePitch;
    }
}

is it ever possible/legal for primaryFont(font) to return null?  It certainly looks like it can.  But I&apos;m not sure if that&apos;s because Chrome is doing something wrong, or if because determinePitch() is making bad assumptions about primaryFont()?

If the primaryFont() assumption is wrong, then this crasher probably hits Safari too, but I don&apos;t know how I would reproduce it.


For context:

    const SimpleFontData* primaryFont() const {
        if (!m_cachedPrimaryFont)
            cachePrimaryFont();
        return m_cachedPrimaryFont;
    }

void Font::cachePrimaryFont() const
{
    ASSERT(m_fontList);
    ASSERT(!m_cachedPrimaryFont);
    m_cachedPrimaryFont = m_fontList-&gt;primaryFont(this)-&gt;fontDataForCharacter(&apos; &apos;);
}

    const SimpleFontData* fontDataForCharacter(UChar32 c) const
    {
        return m_glyphFontData[indexForCharacter(c)];
    }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>121169</commentid>
    <comment_count>1</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-05-13 17:12:28 -0700</bug_when>
    <thetext>Sorry, the crash reports are internal (probably for similar reasons to why Apple&apos;s crash reports are), but here is the link for posterity:
http://crash/reportview?product=Chrome&amp;version=2.0.180.0&amp;signature=WebCore%3A%3AFontFallbackList%3A%3AdeterminePitch(WebCore%3A%3AFont+const+*)-67F854</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>307127</commentid>
    <comment_count>2</comment_count>
    <who name="Hironori Bono">hbono</who>
    <bug_when>2010-11-09 19:51:58 -0800</bug_when>
    <thetext>Greetings,

This issue somehow fall-backs to me. :)

(In reply to comment #0)
&gt; is it ever possible/legal for primaryFont(font) to return null?  It certainly looks like it can.  But I&apos;m not sure if that&apos;s because Chrome is doing something wrong, or if because determinePitch() is making bad assumptions about primaryFont()?
&gt; If the primaryFont() assumption is wrong, then this crasher probably hits Safari too, but I don&apos;t know how I would reproduce it.

Yes, it is possible on Windows Chrome as I wrote in &lt;http://crbug.com/59707&gt;. This crash happens on a PC that satisfies all the following conditions:
1. a last-resort font (&quot;Arial&quot;, &quot;Time New Roman&quot;, or &quot;Courier New&quot;) is corrupted, and;
2. FontCache::getFontData() calls FontCache::getLastResortFallbackFont() to use the corrupted last-resort font.

One of its reproduction steps is listed below:
1. Delete &quot;Arial&quot;, &quot;Times New Roman&quot;, and &quot;Courier New&quot; fonts from the &quot;C:\WINDOWS\Fonts&quot; folder on Windows XP. (We cannot delete them on Vista or 7 because they are protected by Windows.)
2. Start Chrome.
(I recommend to try this on a virtual machine because it is very dangerous.)

I think this crash is a problem of our FontCache::getLastResortFallbackFont() implementation for Windows that may choose a corrupted font. (We also try choosing DEFAULT_GUI_FONT and non-client metrics fonts, which Windows ensures they are sane, as Windows Safari does?)

Regards,

Hironori Bono</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>310730</commentid>
    <comment_count>3</comment_count>
      <attachid>74209</attachid>
    <who name="Hironori Bono">hbono</who>
    <bug_when>2010-11-18 00:00:38 -0800</bug_when>
    <thetext>Created attachment 74209
A copy-and-paste fix

Greetings,

This change just copied some font-fallback code from &quot;WebCore/platform/graphics/win/FontCacheWin.cpp&quot; to &quot;WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp&quot; to fix this Chromium crash. (As far as I tested with my reproduction steps, this change fixes this crash.) Unfortunately, I do not have any ideas how to write a layout test for this crash because it happens only on a PC that do not have some system fonts corrupted.

Regards,

Hironori Bono</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315360</commentid>
    <comment_count>4</comment_count>
      <attachid>74209</attachid>
    <who name="Darin Fisher (:fishd, Google)">fishd</who>
    <bug_when>2010-11-30 15:41:19 -0800</bug_when>
    <thetext>Comment on attachment 74209
A copy-and-paste fix

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

R=me, but it sure would be nice to find a way to share code with the PLATFORM(WIN) port.

&gt; WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:426
&gt; +static SimpleFontData* fontDataFromDescriptionAndLogFont(FontCache* fontCache, const FontDescription&amp; fontDescription, const LOGFONT&amp; font, wchar_t* outFontFamilyName)

nit: it is normally nice to put helper functions at the top of the file, so as not
to break up the flow of class method implementations.  this doesn&apos;t cause a readability
problem in this case, but often once a static method is added like this, it becomes
an invitation for more people to add static functions like this, and pretty soon the
organization of a .cpp file is lost.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315526</commentid>
    <comment_count>5</comment_count>
    <who name="Hironori Bono">hbono</who>
    <bug_when>2010-11-30 22:03:53 -0800</bug_when>
    <thetext>(In reply to comment #4)
&gt; (From update of attachment 74209 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=74209&amp;action=review
&gt; 
&gt; R=me, but it sure would be nice to find a way to share code with the PLATFORM(WIN) port.
&gt; 
&gt; &gt; WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:426
&gt; &gt; +static SimpleFontData* fontDataFromDescriptionAndLogFont(FontCache* fontCache, const FontDescription&amp; fontDescription, const LOGFONT&amp; font, wchar_t* outFontFamilyName)
&gt; 
&gt; nit: it is normally nice to put helper functions at the top of the file, so
&gt; as not to break up the flow of class method implementations.  this doesn&apos;t
&gt; cause a readability problem in this case, but often once a static method is
&gt; added like this, it becomes an invitation for more people to add static
&gt; functions like this, and pretty soon the organization of a .cpp file is lost.

Thank you for your comment. Even though I realize this is a coding style of Chromium and I don&apos;t have any objections, I would like to write an excuse why I put this function there. In brief, I have put this function there just because I thought this is a style for this file. It seems this file arranges its functions (including static ones) in the same order as the ones in &apos;FontCacheWin.cpp&apos;. To keep this order consistency, I thought I needed to put fontDataFromDescriptionAndLogFont() to the same place (i.e. between FontCache::getSimilarFontPlatformData() and FontCache::getLastResortFallbackFont()).
In fact, this file has some other static functions inserted between FontCache methods, such as charactersAreAllASCII(), lookupAltName(), etc. Do we need refactoring for this file so we can move all these static functions in this file at the beginning of this file?

Regards,

Hironori Bono</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315535</commentid>
    <comment_count>6</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-11-30 22:24:31 -0800</bug_when>
    <thetext>(In reply to comment #5)
&gt; Do we need refactoring for this file so we can move all these static functions in this file at the beginning of this file?

Short answer: Sounds good.

Long answer:

I appreciate your goal of following the file&apos;s current style. However, here&apos;s a simple outlook that is slightly different:
1. WebKit has no stated style on this matter.
2. This file is solely used by Chromium (and thus almost always only modified by chromium folks).

Since there is no conflict between the two styles and Chromium has a standard practice here that makes readability easier for Chromium folks, I&apos;d try to follow its standard. 

Feel free to submit a *different* patch that fixes places in this file where it doesn&apos;t meet this practice. (cc me and) I&apos;m happy to r+ such a change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315988</commentid>
    <comment_count>7</comment_count>
      <attachid>75345</attachid>
    <who name="Hironori Bono">hbono</who>
    <bug_when>2010-12-01 18:50:24 -0800</bug_when>
    <thetext>Created attachment 75345
A copy-and-paste fix (including refactoring)

(In reply to comment #6)
&gt; (In reply to comment #5)
&gt; &gt; Do we need refactoring for this file so we can move all these static functions in this file at the beginning of this file?
&gt; 
&gt; Short answer: Sounds good.

Thank you for your comment. I have moved all the static functions at the beginning of this file because it is pretty easy. (That is, the functionality is the same as the previous one.) Is it possible to take another look?

Regards,

Hironori Bono</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>315989</commentid>
    <comment_count>8</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-12-01 18:53:01 -0800</bug_when>
    <thetext>Attachment 75345 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;WebCore/ChangeLog&apos;, u&apos;WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp&apos;]&quot; exit_code: 1
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:335:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:336:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:337:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:338:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:339:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:340:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:341:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:342:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:343:  One space before end of line comments  [whitespace/comments] [5]
WebCore/platform/graphics/chromium/FontCacheChromiumWin.cpp:399:  This { should be at the end of the previous line  [whitespace/braces] [4]
Total errors found: 10 in 2 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>315999</commentid>
    <comment_count>9</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-12-01 20:07:02 -0800</bug_when>
    <thetext>(In reply to comment #7)
&gt; Created an attachment (id=75345) [details]
&gt; A copy-and-paste fix (including refactoring)
&gt; 
&gt; (In reply to comment #6)
&gt; &gt; (In reply to comment #5)
&gt; &gt; &gt; Do we need refactoring for this file so we can move all these static functions in this file at the beginning of this file?
&gt; &gt; 
&gt; &gt; Short answer: Sounds good.
&gt; 
&gt; Thank you for your comment. I have moved all the static functions at the beginning of this file because it is pretty easy. (That is, the functionality is the same as the previous one.) Is it possible to take another look?

Please just commit the previous patch as it was (with the fixed) and then do the clean up in a separate patch. Otherwise by putting all of this in one patch, it hides what the fix was for the bug. 

When someone goes back in the history of the file to determine why a line of code changed, they will see a patch that says &quot;Move static functions to top of file to match chromium style with no code changes&quot; or something like that, and they can skip over that change.

If they happen to get to a line that was added/changed for &quot;Crash in FontFallbackList::determinePitch(const Font* font)&quot;, then they will know it was fixing that issue (and not related to a code rearrangement).

I say all this due to experiences where I&apos;ve been the person digging through the history of files.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316001</commentid>
    <comment_count>10</comment_count>
      <attachid>75345</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-12-01 20:07:29 -0800</bug_when>
    <thetext>Comment on attachment 75345
A copy-and-paste fix (including refactoring)

See my previous comment. Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316015</commentid>
    <comment_count>11</comment_count>
    <who name="Hironori Bono">hbono</who>
    <bug_when>2010-12-01 22:23:51 -0800</bug_when>
    <thetext>(In reply to comment #9)
&gt; Please just commit the previous patch as it was (with the fixed) and then do the clean up in a separate patch. Otherwise by putting all of this in one patch, it hides what the fix was for the bug. 

Unfortunately, I cannot commit WebKit changes because I&apos;m not a WebKit committer. Can you commit the previous patch on my behalf?

Regards,

Hironori Bono</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316023</commentid>
    <comment_count>12</comment_count>
      <attachid>74209</attachid>
    <who name="David Levin">levin</who>
    <bug_when>2010-12-01 22:57:30 -0800</bug_when>
    <thetext>Comment on attachment 74209
A copy-and-paste fix

Ok, cq+&apos;ing this. I subsequent patch should address the static function issue throughout the file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316024</commentid>
    <comment_count>13</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-12-01 22:58:58 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; Can you commit the previous patch on my behalf?

Ok, I cq+&apos;ed it. Please file another bug after it lands and attach a patch to clean up the file in general as you were doing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316047</commentid>
    <comment_count>14</comment_count>
      <attachid>74209</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-12-02 01:54:39 -0800</bug_when>
    <thetext>Comment on attachment 74209
A copy-and-paste fix

Clearing flags on attachment: 74209

Committed r73116: &lt;http://trac.webkit.org/changeset/73116&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>316048</commentid>
    <comment_count>15</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2010-12-02 01:54:45 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>317729</commentid>
    <comment_count>16</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2010-12-06 11:07:24 -0800</bug_when>
    <thetext>(In reply to comment #13)
&gt; (In reply to comment #11)
&gt; &gt; Can you commit the previous patch on my behalf?
&gt; 
&gt; Ok, I cq+&apos;ed it. Please file another bug after it lands and attach a patch to clean up the file in general as you were doing.

Where is the patch to clean up the file?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>318017</commentid>
    <comment_count>17</comment_count>
    <who name="Hironori Bono">hbono</who>
    <bug_when>2010-12-06 19:36:48 -0800</bug_when>
    <thetext>(In reply to comment #16)
&gt; Where is the patch to clean up the file?

Thank you for your notification. I have filed Bug 50611 &lt;http://webkit.org/b/50611&gt; and uploaded a refactoring change there.

Regards,

Hironori Bono</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>333548</commentid>
    <comment_count>18</comment_count>
    <who name="Hironori Bono">hbono</who>
    <bug_when>2011-01-12 22:10:22 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; (In reply to comment #16)
&gt; &gt; Where is the patch to clean up the file?
&gt; 
&gt; Thank you for your notification. I have filed Bug 50611 &lt;http://webkit.org/b/50611&gt; and uploaded a refactoring change there.
&gt; 
&gt; Regards,
&gt; 
&gt; Hironori Bono

Unfortunately, this crash still happens after Chrome merged this change and I would like to post another change, which just adds a list of fallback fonts in FontCache::getLastResortFallbackFont(). Is it better to file another bug for this change, or re-open this bug?

Regards,

Hironori Bono</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>333582</commentid>
    <comment_count>19</comment_count>
    <who name="David Levin">levin</who>
    <bug_when>2011-01-13 01:00:34 -0800</bug_when>
    <thetext>(In reply to comment #18)
&gt; (In reply to comment #17)
&gt; &gt; (In reply to comment #16)
&gt; &gt; &gt; Where is the patch to clean up the file?
&gt; &gt; 
&gt; &gt; Thank you for your notification. I have filed Bug 50611 &lt;http://webkit.org/b/50611&gt; and uploaded a refactoring change there.
&gt; &gt; 
&gt; &gt; Regards,
&gt; &gt; 
&gt; &gt; Hironori Bono
&gt; 
&gt; Unfortunately, this crash still happens after Chrome merged this change and I would like to post another change, which just adds a list of fallback fonts in FontCache::getLastResortFallbackFont(). Is it better to file another bug for this change, or re-open this bug?
&gt; 
&gt; Regards,
&gt; 
&gt; Hironori Bono



Hmm good question. I would go with a new bug since bugs in webkit ~= code reviews in chromium. You wouldn&apos;t try to repro an old code review and start putting in new patches The old comments would make it more confusing. (Feel free to reference this bug in the new one.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>334118</commentid>
    <comment_count>20</comment_count>
    <who name="Hironori Bono">hbono</who>
    <bug_when>2011-01-13 22:16:52 -0800</bug_when>
    <thetext>(In reply to comment #19)

&gt; Hmm good question. I would go with a new bug since bugs in webkit ~= code reviews in chromium. You wouldn&apos;t try to repro an old code review and start putting in new patches The old comments would make it more confusing. (Feel free to reference this bug in the new one.)

Thank you for your suggestion. I have filed Bug 52422 &lt;http://webkit.org/b/52422&gt; and uploaded another speculative fix.

Regards,

Hironori Bono</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>74209</attachid>
            <date>2010-11-18 00:00:38 -0800</date>
            <delta_ts>2010-12-02 01:54:39 -0800</delta_ts>
            <desc>A copy-and-paste fix</desc>
            <filename>issue25770-patch0.txt</filename>
            <type>text/plain</type>
            <size>4531</size>
            <attacher name="Hironori Bono">hbono</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MjI3NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjEgQEAKKzIwMTAtMTEtMTcgIEhpcm9ub3JpIEJvbm8gIDxoYm9ub0BjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0Nocm9taXVtXSBGaXggcG9zc2libGUgY3Jhc2hlcyBpbiBGb250RmFsbGJhY2tGb250OjpkZXRl
cm1pbmVQaXRjaCgpLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MjU3NzAKKworICAgICAgICBXaGVuIGFsbCBvZiAiQXJpYWwiLCAiQ291cmllciBOZXci
LCBhbmQgIlRpbWVzIE5ldyBSb21hbiIgZm9udHMgYXJlIGNvcnJ1cHRlZCwKKyAgICAgICAgRm9u
dENhY2hlOjpnZXRMYXN0UmVzb3J0RmFsbGJhY2tGb250KCkgcmV0dXJucyAwIGFuZCBpdCBjYXVz
ZXMgdGhpcyBjcmFzaC4gVG8KKyAgICAgICAgYXZvaWQgdGhpcyBjcmFzaCwgdGhpcyBjaGFuZ2Ug
ZmFsbHMgYmFjayB0byBzeXN0ZW0gZm9udHMgKFdpbmRvd3MgZW5zdXJlcyB0aGV5CisgICAgICAg
IGFyZSBzYW5lKSBhcyBXaW4gU2FmYXJpIGRvZXMuIFVuZm9ydHVuYXRlbHksIEkgZG9uJ3QgaGF2
ZSBhbnkgaWRlYXMgaG93IEkgY2FuCisgICAgICAgIHdyaXRlIGEgbGF5b3V0IHRlc3QgZm9yIHRo
aXMgaXNzdWUgYmVjYXVzZSB0aGlzIGNyYXNoIGhhcHBlbnMgb24gYSBQQyBzb21lIG9mCisgICAg
ICAgIGl0cyBzeXN0ZW0gZm9udHMgYXJlIGNvcnJ1cHRlZC4KKworICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcDoKKyAgICAgICAgKFdl
YkNvcmU6OmZvbnREYXRhRnJvbURlc2NyaXB0aW9uQW5kTG9nRm9udCk6CisgICAgICAgIChXZWJD
b3JlOjpGb250Q2FjaGU6OmdldExhc3RSZXNvcnRGYWxsYmFja0ZvbnQpOgorCiAyMDEwLTExLTE3
ICBTaGVyaWZmIEJvdCAgPHdlYmtpdC5yZXZpZXcuYm90QGdtYWlsLmNvbT4KIAogICAgICAgICBV
bnJldmlld2VkLCByb2xsaW5nIG91dCByNzIyMjguCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNw
cAkocmV2aXNpb24gNzIyNzMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIyLDYgKzQyMiwx
NSBAQCBTaW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRTaW1pbGFyRm9uCiAgICAgcmV0dXJu
IDA7CiB9CiAKKy8vIFRyaWVzIHRoZSBnaXZlbiBmb250IGFuZCBzYXZlIGl0IHxvdXRGb250RmFt
aWx5TmFtZXwgaWYgaXQgc3VjY2VlZHMuCitzdGF0aWMgU2ltcGxlRm9udERhdGEqIGZvbnREYXRh
RnJvbURlc2NyaXB0aW9uQW5kTG9nRm9udChGb250Q2FjaGUqIGZvbnRDYWNoZSwgY29uc3QgRm9u
dERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGNvbnN0IExPR0ZPTlQmIGZvbnQsIHdjaGFy
X3QqIG91dEZvbnRGYW1pbHlOYW1lKQoreworICAgIFNpbXBsZUZvbnREYXRhKiBmb250RGF0YSA9
IGZvbnRDYWNoZS0+Z2V0Q2FjaGVkRm9udERhdGEoZm9udERlc2NyaXB0aW9uLCBmb250LmxmRmFj
ZU5hbWUpOworICAgIGlmIChmb250RGF0YSkKKyAgICAgICAgbWVtY3B5KG91dEZvbnRGYW1pbHlO
YW1lLCBmb250LmxmRmFjZU5hbWUsIHNpemVvZihmb250LmxmRmFjZU5hbWUpKTsKKyAgICByZXR1
cm4gZm9udERhdGE7Cit9CisKIFNpbXBsZUZvbnREYXRhKiBGb250Q2FjaGU6OmdldExhc3RSZXNv
cnRGYWxsYmFja0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbikKIHsKICAg
ICBGb250RGVzY3JpcHRpb246OkdlbmVyaWNGYW1pbHlUeXBlIGdlbmVyaWMgPSBkZXNjcmlwdGlv
bi5nZW5lcmljRmFtaWx5KCk7CkBAIC00MzksNyArNDQ4LDQzIEBAIFNpbXBsZUZvbnREYXRhKiBG
b250Q2FjaGU6OmdldExhc3RSZXNvcnQKICAgICBlbHNlIGlmIChnZW5lcmljID09IEZvbnREZXNj
cmlwdGlvbjo6TW9ub3NwYWNlRmFtaWx5KQogICAgICAgICBmb250U3RyID0gY291cmllclN0cjsK
IAotICAgIHJldHVybiBnZXRDYWNoZWRGb250RGF0YShkZXNjcmlwdGlvbiwgZm9udFN0cik7Cisg
ICAgU2ltcGxlRm9udERhdGEqIHNpbXBsZUZvbnQgPSBnZXRDYWNoZWRGb250RGF0YShkZXNjcmlw
dGlvbiwgZm9udFN0cik7CisgICAgaWYgKHNpbXBsZUZvbnQpCisgICAgICAgIHJldHVybiBzaW1w
bGVGb250OworCisgICAgLy8gRmFsbCBiYWNrIHRvIHN5c3RlbSBmb250cyBhcyBXaW4gU2FmYXJp
IGRvZXMgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIG11c3QKKyAgICAvLyByZXR1cm4gYSB2YWxpZCBm
b250LiBPbmNlIHdlIGZpbmQgYSB2YWxpZCBzeXN0ZW0gZm9udCwgd2Ugc2F2ZSBpdHMgbmFtZQor
ICAgIC8vIHRvIGEgc3RhdGljIHZhcmlhYmxlIGFuZCB1c2UgaXQgdG8gcHJldmVudCB0cnlpbmcg
c3lzdGVtIGZvbnRzIGFnYWluLgorICAgIHN0YXRpYyB3Y2hhcl90IGZhbGxiYWNrRm9udE5hbWVb
TEZfRkFDRVNJWkVdID0gezB9OworICAgIGlmIChmYWxsYmFja0ZvbnROYW1lWzBdKQorICAgICAg
ICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoZGVzY3JpcHRpb24sIGZhbGxiYWNrRm9udE5hbWUp
OworCisgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBERUZBVUxUX0dVSV9GT05UIGlmIG5vIGtub3du
IFVuaWNvZGUgZm9udHMgYXJlIGF2YWlsYWJsZS4KKyAgICBpZiAoSEZPTlQgZGVmYXVsdEdVSUZv
bnQgPSBzdGF0aWNfY2FzdDxIRk9OVD4oR2V0U3RvY2tPYmplY3QoREVGQVVMVF9HVUlfRk9OVCkp
KSB7CisgICAgICAgIExPR0ZPTlQgZGVmYXVsdEdVSUxvZ0ZvbnQ7CisgICAgICAgIEdldE9iamVj
dChkZWZhdWx0R1VJRm9udCwgc2l6ZW9mKGRlZmF1bHRHVUlMb2dGb250KSwgJmRlZmF1bHRHVUlM
b2dGb250KTsKKyAgICAgICAgaWYgKHNpbXBsZUZvbnQgPSBmb250RGF0YUZyb21EZXNjcmlwdGlv
bkFuZExvZ0ZvbnQodGhpcywgZGVzY3JpcHRpb24sIGRlZmF1bHRHVUlMb2dGb250LCBmYWxsYmFj
a0ZvbnROYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVGb250OworICAgIH0KKworICAg
IC8vIEZhbGwgYmFjayB0byBOb24tY2xpZW50IG1ldHJpY3MgZm9udHMuCisgICAgTk9OQ0xJRU5U
TUVUUklDUyBub25DbGllbnRNZXRyaWNzID0gezB9OworICAgIG5vbkNsaWVudE1ldHJpY3MuY2JT
aXplID0gc2l6ZW9mKG5vbkNsaWVudE1ldHJpY3MpOworICAgIGlmIChTeXN0ZW1QYXJhbWV0ZXJz
SW5mbyhTUElfR0VUTk9OQ0xJRU5UTUVUUklDUywgc2l6ZW9mKG5vbkNsaWVudE1ldHJpY3MpLCAm
bm9uQ2xpZW50TWV0cmljcywgMCkpIHsKKyAgICAgICAgaWYgKHNpbXBsZUZvbnQgPSBmb250RGF0
YUZyb21EZXNjcmlwdGlvbkFuZExvZ0ZvbnQodGhpcywgZGVzY3JpcHRpb24sIG5vbkNsaWVudE1l
dHJpY3MubGZNZXNzYWdlRm9udCwgZmFsbGJhY2tGb250TmFtZSkpCisgICAgICAgICAgICByZXR1
cm4gc2ltcGxlRm9udDsKKyAgICAgICAgaWYgKHNpbXBsZUZvbnQgPSBmb250RGF0YUZyb21EZXNj
cmlwdGlvbkFuZExvZ0ZvbnQodGhpcywgZGVzY3JpcHRpb24sIG5vbkNsaWVudE1ldHJpY3MubGZN
ZW51Rm9udCwgZmFsbGJhY2tGb250TmFtZSkpCisgICAgICAgICAgICByZXR1cm4gc2ltcGxlRm9u
dDsKKyAgICAgICAgaWYgKHNpbXBsZUZvbnQgPSBmb250RGF0YUZyb21EZXNjcmlwdGlvbkFuZExv
Z0ZvbnQodGhpcywgZGVzY3JpcHRpb24sIG5vbkNsaWVudE1ldHJpY3MubGZTdGF0dXNGb250LCBm
YWxsYmFja0ZvbnROYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVGb250OworICAgICAg
ICBpZiAoc2ltcGxlRm9udCA9IGZvbnREYXRhRnJvbURlc2NyaXB0aW9uQW5kTG9nRm9udCh0aGlz
LCBkZXNjcmlwdGlvbiwgbm9uQ2xpZW50TWV0cmljcy5sZkNhcHRpb25Gb250LCBmYWxsYmFja0Zv
bnROYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVGb250OworICAgICAgICBpZiAoc2lt
cGxlRm9udCA9IGZvbnREYXRhRnJvbURlc2NyaXB0aW9uQW5kTG9nRm9udCh0aGlzLCBkZXNjcmlw
dGlvbiwgbm9uQ2xpZW50TWV0cmljcy5sZlNtQ2FwdGlvbkZvbnQsIGZhbGxiYWNrRm9udE5hbWUp
KQorICAgICAgICAgICAgcmV0dXJuIHNpbXBsZUZvbnQ7CisgICAgfQorCisgICAgQVNTRVJUX05P
VF9SRUFDSEVEKCk7CisgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBMT05HIHRvR0RJRm9udFdl
aWdodChGb250V2VpZ2h0IGZvbnRXZWlnaHQpCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>75345</attachid>
            <date>2010-12-01 18:50:24 -0800</date>
            <delta_ts>2010-12-01 20:07:28 -0800</delta_ts>
            <desc>A copy-and-paste fix (including refactoring)</desc>
            <filename>issue25770-patch1.txt</filename>
            <type>text/plain</type>
            <size>11092</size>
            <attacher name="Hironori Bono">hbono</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiA3MzA5NCkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjcgQEAKKzIwMTAtMTItMDEgIEhpcm9ub3JpIEJvbm8gIDxoYm9ub0BjaHJvbWl1
bS5vcmc+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0Nocm9taXVtXSBGaXggcG9zc2libGUgY3Jhc2hlcyBpbiBGb250RmFsbGJhY2tGb250OjpkZXRl
cm1pbmVQaXRjaCgpLgorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MjU3NzAKKworICAgICAgICBXaGVuIGFsbCBvZiAiQXJpYWwiLCAiQ291cmllciBOZXci
LCBhbmQgIlRpbWVzIE5ldyBSb21hbiIgZm9udHMgYXJlIGNvcnJ1cHRlZCwKKyAgICAgICAgRm9u
dENhY2hlOjpnZXRMYXN0UmVzb3J0RmFsbGJhY2tGb250KCkgcmV0dXJucyAwIGFuZCBpdCBjYXVz
ZXMgdGhpcyBjcmFzaC4gVG8KKyAgICAgICAgYXZvaWQgdGhpcyBjcmFzaCwgdGhpcyBjaGFuZ2Ug
ZmFsbHMgYmFjayB0byBzeXN0ZW0gZm9udHMgKFdpbmRvd3MgZW5zdXJlcyB0aGV5CisgICAgICAg
IGFyZSBzYW5lKSBhcyBXaW4gU2FmYXJpIGRvZXMuIFVuZm9ydHVuYXRlbHksIEkgZG9uJ3QgaGF2
ZSBhbnkgaWRlYXMgaG93IEkgY2FuCisgICAgICAgIHdyaXRlIGEgbGF5b3V0IHRlc3QgZm9yIHRo
aXMgaXNzdWUgYmVjYXVzZSB0aGlzIGNyYXNoIGhhcHBlbnMgb25seSBvbiBhIFBDIHNvbWUKKyAg
ICAgICAgb2YgaXRzIHN5c3RlbSBmb250cyBhcmUgY29ycnVwdGVkLgorCisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vRm9udENhY2hlQ2hyb21pdW1XaW4uY3BwOgorICAgICAg
ICAoZm9udENvbnRhaW5zQ2hhcmFjdGVyKToKKyAgICAgICAgKGZvbnREYXRhRnJvbURlc2NyaXB0
aW9uQW5kTG9nRm9udCk6CisgICAgICAgICh0b0dESUZvbnRXZWlnaHQpOgorICAgICAgICAoRmls
bExvZ0ZvbnQpOgorICAgICAgICAoVHJhaXRzSW5GYW1pbHlQcm9jRGF0YTo6VHJhaXRzSW5GYW1p
bHlQcm9jRGF0YSk6CisgICAgICAgICh0cmFpdHNJbkZhbWlseUVudW1Qcm9jKToKKyAgICAgICAg
KFdlYkNvcmU6OkZvbnRDYWNoZTo6cGxhdGZvcm1Jbml0KToKKyAgICAgICAgKFdlYkNvcmU6OkZv
bnRDYWNoZTo6Z2V0TGFzdFJlc29ydEZhbGxiYWNrRm9udCk6CisKIDIwMTAtMTItMDEgIEdlb2Zm
cmV5IEdhcmVuICA8Z2dhcmVuQGFwcGxlLmNvbT4KIAogICAgICAgICBCdWlsZCBmaXg6IEFkZGVk
IGEgZm9yd2FyZGluZyBoZWFkZXIuCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2No
cm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNoZUNocm9taXVtV2luLmNwcAkocmV2aXNp
b24gNzMwODgpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL0ZvbnRDYWNo
ZUNocm9taXVtV2luLmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDYsMTQgKzQ2LDcgQEAKICNpbmNs
dWRlIDxtbGFuZy5oPgogCiB1c2luZyBzdGQ6Om1pbjsKLQotbmFtZXNwYWNlIFdlYkNvcmUKLXsK
LQotdm9pZCBGb250Q2FjaGU6OnBsYXRmb3JtSW5pdCgpCi17Ci0gICAgLy8gTm90IG5lZWRlZCBv
biBXaW5kb3dzLgotfQordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKIC8vIEZJWE1FOiBjb25z
aWRlciBhZGRpbmcgdG8gV2ViS2l0IFN0cmluZyBjbGFzcwogc3RhdGljIGJvb2wgY2hhcmFjdGVy
c0FyZUFsbEFTQ0lJKGNvbnN0IFN0cmluZyYgcykKQEAgLTI3MSw4ICsyNjQsNyBAQCBzdGF0aWMg
SEZPTlQgY3JlYXRlRm9udEluZGlyZWN0QW5kR2V0V2luCiAvLyBoYXMgYSBkaWZmZXJlbnQgcmVw
ZXJ0b2lyZSBmcm9tIGFub3RoZXIgZmFjZSBvZiB0aGUgc2FtZSBmYW1pbHkuIAogdHlwZWRlZiBI
YXNoTWFwPGNvbnN0IHdjaGFyX3QqLCBpY3U6OlVuaWNvZGVTZXQqPiBGb250Q21hcENhY2hlOwog
Ci1zdGF0aWMgYm9vbCBmb250Q29udGFpbnNDaGFyYWN0ZXIoY29uc3QgRm9udFBsYXRmb3JtRGF0
YSogZm9udERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2No
YXJfdCogZmFtaWx5LCBVQ2hhcjMyIGNoYXJhY3RlcikKK3N0YXRpYyBib29sIGZvbnRDb250YWlu
c0NoYXJhY3Rlcihjb25zdCBGb250UGxhdGZvcm1EYXRhKiBmb250RGF0YSwgY29uc3Qgd2NoYXJf
dCogZmFtaWx5LCBVQ2hhcjMyIGNoYXJhY3RlcikKIHsKICAgICAvLyBGSVhNRTogRm9yIG5vbi1C
TVAgY2hhcmFjdGVycywgR2V0Rm9udFVuaWNvZGVSYW5nZXMgaXMgb2YKICAgICAvLyBubyB1c2Uu
IFdlIGhhdmUgdG8gcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBjbWFwIHRhYmxlIG9mIGEgZm9udC4K
QEAgLTMyOSw2ICszMjEsODggQEAgc3RhdGljIGJvb2wgZm9udENvbnRhaW5zQ2hhcmFjdGVyKGNv
bnN0IAogICAgIHJldHVybiBjbWFwLT5jb250YWlucyhjaGFyYWN0ZXIpOwogfQogCitzdGF0aWMg
U2ltcGxlRm9udERhdGEqIGZvbnREYXRhRnJvbURlc2NyaXB0aW9uQW5kTG9nRm9udChGb250Q2Fj
aGUqIGZvbnRDYWNoZSwgY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRpb24sIGNv
bnN0IExPR0ZPTlQmIGZvbnQsIHdjaGFyX3QqIG91dEZvbnRGYW1pbHlOYW1lKQoreworICAgIFNp
bXBsZUZvbnREYXRhKiBmb250RGF0YSA9IGZvbnRDYWNoZS0+Z2V0Q2FjaGVkRm9udERhdGEoZm9u
dERlc2NyaXB0aW9uLCBmb250LmxmRmFjZU5hbWUpOworICAgIGlmIChmb250RGF0YSkKKyAgICAg
ICAgbWVtY3B5KG91dEZvbnRGYW1pbHlOYW1lLCBmb250LmxmRmFjZU5hbWUsIHNpemVvZihmb250
LmxmRmFjZU5hbWUpKTsKKyAgICByZXR1cm4gZm9udERhdGE7Cit9CisKK3N0YXRpYyBMT05HIHRv
R0RJRm9udFdlaWdodChGb250V2VpZ2h0IGZvbnRXZWlnaHQpCit7CisgICAgc3RhdGljIExPTkcg
Z2RpRm9udFdlaWdodHNbXSA9IHsKKyAgICAgICAgRldfVEhJTiwgICAgICAgIC8vIEZvbnRXZWln
aHQxMDAKKyAgICAgICAgRldfRVhUUkFMSUdIVCwgIC8vIEZvbnRXZWlnaHQyMDAKKyAgICAgICAg
RldfTElHSFQsICAgICAgIC8vIEZvbnRXZWlnaHQzMDAKKyAgICAgICAgRldfTk9STUFMLCAgICAg
IC8vIEZvbnRXZWlnaHQ0MDAKKyAgICAgICAgRldfTUVESVVNLCAgICAgIC8vIEZvbnRXZWlnaHQ1
MDAKKyAgICAgICAgRldfU0VNSUJPTEQsICAgIC8vIEZvbnRXZWlnaHQ2MDAKKyAgICAgICAgRldf
Qk9MRCwgICAgICAgIC8vIEZvbnRXZWlnaHQ3MDAKKyAgICAgICAgRldfRVhUUkFCT0xELCAgIC8v
IEZvbnRXZWlnaHQ4MDAKKyAgICAgICAgRldfSEVBVlkgICAgICAgIC8vIEZvbnRXZWlnaHQ5MDAK
KyAgICB9OworICAgIHJldHVybiBnZGlGb250V2VpZ2h0c1tmb250V2VpZ2h0XTsKK30KKworc3Rh
dGljIHZvaWQgRmlsbExvZ0ZvbnQoY29uc3QgRm9udERlc2NyaXB0aW9uJiBmb250RGVzY3JpcHRp
b24sIExPR0ZPTlQqIHdpbmZvbnQpCit7CisgICAgLy8gVGhlIHNpemUgaGVyZSBsb29rcyB1bnVz
dWFsLiAgVGhlIG5lZ2F0aXZlIG51bWJlciBpcyBpbnRlbnRpb25hbC4KKyAgICAvLyBVbmxpa2Ug
V2ViS2l0IHRydW5rLCB3ZSBkb24ndCBtdWx0aXBseSB0aGUgc2l6ZSBieSAzMi4gIFRoYXQgc2Vl
bXMgdG8gYmUKKyAgICAvLyBzb21lIGtpbmQgb2YgYXJ0aWZhY3Qgb2YgdGhlaXIgQ0cgYmFja2Vu
ZCwgb3Igc29tZXRoaW5nLgorICAgIHdpbmZvbnQtPmxmSGVpZ2h0ID0gLWZvbnREZXNjcmlwdGlv
bi5jb21wdXRlZFBpeGVsU2l6ZSgpOworICAgIHdpbmZvbnQtPmxmV2lkdGggPSAwOworICAgIHdp
bmZvbnQtPmxmRXNjYXBlbWVudCA9IDA7CisgICAgd2luZm9udC0+bGZPcmllbnRhdGlvbiA9IDA7
CisgICAgd2luZm9udC0+bGZVbmRlcmxpbmUgPSBmYWxzZTsKKyAgICB3aW5mb250LT5sZlN0cmlr
ZU91dCA9IGZhbHNlOworICAgIHdpbmZvbnQtPmxmQ2hhclNldCA9IERFRkFVTFRfQ0hBUlNFVDsK
KyAgICB3aW5mb250LT5sZk91dFByZWNpc2lvbiA9IE9VVF9UVF9PTkxZX1BSRUNJUzsKKyAgICB3
aW5mb250LT5sZlF1YWxpdHkgPSBDaHJvbWl1bUJyaWRnZTo6bGF5b3V0VGVzdE1vZGUoKSA/IE5P
TkFOVElBTElBU0VEX1FVQUxJVFkgOiBERUZBVUxUX1FVQUxJVFk7IC8vIEhvbm9yIHVzZXIncyBk
ZXNrdG9wIHNldHRpbmdzLgorICAgIHdpbmZvbnQtPmxmUGl0Y2hBbmRGYW1pbHkgPSBERUZBVUxU
X1BJVENIIHwgRkZfRE9OVENBUkU7CisgICAgd2luZm9udC0+bGZJdGFsaWMgPSBmb250RGVzY3Jp
cHRpb24uaXRhbGljKCk7CisgICAgd2luZm9udC0+bGZXZWlnaHQgPSB0b0dESUZvbnRXZWlnaHQo
Zm9udERlc2NyaXB0aW9uLndlaWdodCgpKTsKK30KKworc3RydWN0IFRyYWl0c0luRmFtaWx5UHJv
Y0RhdGEgeworICAgIFRyYWl0c0luRmFtaWx5UHJvY0RhdGEoY29uc3QgQXRvbWljU3RyaW5nJiBm
YW1pbHlOYW1lKQorICAgICAgICA6IG1fZmFtaWx5TmFtZShmYW1pbHlOYW1lKQorICAgIHsKKyAg
ICB9CisKKyAgICBjb25zdCBBdG9taWNTdHJpbmcmIG1fZmFtaWx5TmFtZTsKKyAgICBIYXNoU2V0
PHVuc2lnbmVkPiBtX3RyYWl0c01hc2tzOworfTsKKworc3RhdGljIGludCBDQUxMQkFDSyB0cmFp
dHNJbkZhbWlseUVudW1Qcm9jKENPTlNUIExPR0ZPTlQqIGxvZ0ZvbnQsIENPTlNUIFRFWFRNRVRS
SUMqIG1ldHJpY3MsIERXT1JEIGZvbnRUeXBlLCBMUEFSQU0gbFBhcmFtKQoreworICAgIFRyYWl0
c0luRmFtaWx5UHJvY0RhdGEqIHByb2NEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxUcmFpdHNJbkZh
bWlseVByb2NEYXRhKj4obFBhcmFtKTsKKworICAgIHVuc2lnbmVkIHRyYWl0c01hc2sgPSAwOwor
ICAgIHRyYWl0c01hc2sgfD0gbG9nRm9udC0+bGZJdGFsaWMgPyBGb250U3R5bGVJdGFsaWNNYXNr
IDogRm9udFN0eWxlTm9ybWFsTWFzazsKKyAgICB0cmFpdHNNYXNrIHw9IEZvbnRWYXJpYW50Tm9y
bWFsTWFzazsKKyAgICBMT05HIHdlaWdodCA9IGxvZ0ZvbnQtPmxmV2VpZ2h0OworICAgIHRyYWl0
c01hc2sgfD0gd2VpZ2h0ID09IEZXX1RISU4gPyBGb250V2VpZ2h0MTAwTWFzayA6CisgICAgICAg
IHdlaWdodCA9PSBGV19FWFRSQUxJR0hUID8gRm9udFdlaWdodDIwME1hc2sgOgorICAgICAgICB3
ZWlnaHQgPT0gRldfTElHSFQgPyBGb250V2VpZ2h0MzAwTWFzayA6CisgICAgICAgIHdlaWdodCA9
PSBGV19OT1JNQUwgPyBGb250V2VpZ2h0NDAwTWFzayA6CisgICAgICAgIHdlaWdodCA9PSBGV19N
RURJVU0gPyBGb250V2VpZ2h0NTAwTWFzayA6CisgICAgICAgIHdlaWdodCA9PSBGV19TRU1JQk9M
RCA/IEZvbnRXZWlnaHQ2MDBNYXNrIDoKKyAgICAgICAgd2VpZ2h0ID09IEZXX0JPTEQgPyBGb250
V2VpZ2h0NzAwTWFzayA6CisgICAgICAgIHdlaWdodCA9PSBGV19FWFRSQUJPTEQgPyBGb250V2Vp
Z2h0ODAwTWFzayA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250V2VpZ2h0
OTAwTWFzazsKKyAgICBwcm9jRGF0YS0+bV90cmFpdHNNYXNrcy5hZGQodHJhaXRzTWFzayk7Cisg
ICAgcmV0dXJuIDE7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlCit7CisKK3ZvaWQgRm9udENhY2hl
OjpwbGF0Zm9ybUluaXQoKQoreworICAgIC8vIE5vdCBuZWVkZWQgb24gV2luZG93cy4KK30KKwog
Ly8gR2l2ZW4gdGhlIGRlc2lyZWQgYmFzZSBmb250LCB0aGlzIHdpbGwgY3JlYXRlIGEgU2ltcGxl
Rm9udERhdGEgZm9yIGEgc3BlY2lmaWMKIC8vIGZvbnQgdGhhdCBjYW4gYmUgdXNlZCB0byByZW5k
ZXIgdGhlIGdpdmVuIHJhbmdlIG9mIGNoYXJhY3RlcnMuCiBjb25zdCBTaW1wbGVGb250RGF0YSog
Rm9udENhY2hlOjpnZXRGb250RGF0YUZvckNoYXJhY3RlcnMoY29uc3QgRm9udCYgZm9udCwgY29u
c3QgVUNoYXIqIGNoYXJhY3RlcnMsIGludCBsZW5ndGgpCkBAIC00MzgsNzMgKzUxMiw0MiBAQCBT
aW1wbGVGb250RGF0YSogRm9udENhY2hlOjpnZXRMYXN0UmVzb3J0CiAgICAgZWxzZSBpZiAoZ2Vu
ZXJpYyA9PSBGb250RGVzY3JpcHRpb246Ok1vbm9zcGFjZUZhbWlseSkKICAgICAgICAgZm9udFN0
ciA9IGNvdXJpZXJTdHI7CiAKLSAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoZGVzY3JpcHRp
b24sIGZvbnRTdHIpOwotfQotCi1zdGF0aWMgTE9ORyB0b0dESUZvbnRXZWlnaHQoRm9udFdlaWdo
dCBmb250V2VpZ2h0KQotewotICAgIHN0YXRpYyBMT05HIGdkaUZvbnRXZWlnaHRzW10gPSB7Ci0g
ICAgICAgIEZXX1RISU4sICAgICAgICAvLyBGb250V2VpZ2h0MTAwCi0gICAgICAgIEZXX0VYVFJB
TElHSFQsICAvLyBGb250V2VpZ2h0MjAwCi0gICAgICAgIEZXX0xJR0hULCAgICAgICAvLyBGb250
V2VpZ2h0MzAwCi0gICAgICAgIEZXX05PUk1BTCwgICAgICAvLyBGb250V2VpZ2h0NDAwCi0gICAg
ICAgIEZXX01FRElVTSwgICAgICAvLyBGb250V2VpZ2h0NTAwCi0gICAgICAgIEZXX1NFTUlCT0xE
LCAgICAvLyBGb250V2VpZ2h0NjAwCi0gICAgICAgIEZXX0JPTEQsICAgICAgICAvLyBGb250V2Vp
Z2h0NzAwCi0gICAgICAgIEZXX0VYVFJBQk9MRCwgICAvLyBGb250V2VpZ2h0ODAwCi0gICAgICAg
IEZXX0hFQVZZICAgICAgICAvLyBGb250V2VpZ2h0OTAwCi0gICAgfTsKLSAgICByZXR1cm4gZ2Rp
Rm9udFdlaWdodHNbZm9udFdlaWdodF07Ci19Ci0KLXN0YXRpYyB2b2lkIEZpbGxMb2dGb250KGNv
bnN0IEZvbnREZXNjcmlwdGlvbiYgZm9udERlc2NyaXB0aW9uLCBMT0dGT05UKiB3aW5mb250KQot
ewotICAgIC8vIFRoZSBzaXplIGhlcmUgbG9va3MgdW51c3VhbC4gIFRoZSBuZWdhdGl2ZSBudW1i
ZXIgaXMgaW50ZW50aW9uYWwuCi0gICAgLy8gVW5saWtlIFdlYktpdCB0cnVuaywgd2UgZG9uJ3Qg
bXVsdGlwbHkgdGhlIHNpemUgYnkgMzIuICBUaGF0IHNlZW1zIHRvIGJlCi0gICAgLy8gc29tZSBr
aW5kIG9mIGFydGlmYWN0IG9mIHRoZWlyIENHIGJhY2tlbmQsIG9yIHNvbWV0aGluZy4KLSAgICB3
aW5mb250LT5sZkhlaWdodCA9IC1mb250RGVzY3JpcHRpb24uY29tcHV0ZWRQaXhlbFNpemUoKTsK
LSAgICB3aW5mb250LT5sZldpZHRoID0gMDsKLSAgICB3aW5mb250LT5sZkVzY2FwZW1lbnQgPSAw
OwotICAgIHdpbmZvbnQtPmxmT3JpZW50YXRpb24gPSAwOwotICAgIHdpbmZvbnQtPmxmVW5kZXJs
aW5lID0gZmFsc2U7Ci0gICAgd2luZm9udC0+bGZTdHJpa2VPdXQgPSBmYWxzZTsKLSAgICB3aW5m
b250LT5sZkNoYXJTZXQgPSBERUZBVUxUX0NIQVJTRVQ7Ci0gICAgd2luZm9udC0+bGZPdXRQcmVj
aXNpb24gPSBPVVRfVFRfT05MWV9QUkVDSVM7Ci0gICAgd2luZm9udC0+bGZRdWFsaXR5ID0gQ2hy
b21pdW1CcmlkZ2U6OmxheW91dFRlc3RNb2RlKCkgPyBOT05BTlRJQUxJQVNFRF9RVUFMSVRZIDog
REVGQVVMVF9RVUFMSVRZOyAvLyBIb25vciB1c2VyJ3MgZGVza3RvcCBzZXR0aW5ncy4KLSAgICB3
aW5mb250LT5sZlBpdGNoQW5kRmFtaWx5ID0gREVGQVVMVF9QSVRDSCB8IEZGX0RPTlRDQVJFOwot
ICAgIHdpbmZvbnQtPmxmSXRhbGljID0gZm9udERlc2NyaXB0aW9uLml0YWxpYygpOwotICAgIHdp
bmZvbnQtPmxmV2VpZ2h0ID0gdG9HRElGb250V2VpZ2h0KGZvbnREZXNjcmlwdGlvbi53ZWlnaHQo
KSk7Ci19Ci0KLXN0cnVjdCBUcmFpdHNJbkZhbWlseVByb2NEYXRhIHsKLSAgICBUcmFpdHNJbkZh
bWlseVByb2NEYXRhKGNvbnN0IEF0b21pY1N0cmluZyYgZmFtaWx5TmFtZSkKLSAgICAgICAgOiBt
X2ZhbWlseU5hbWUoZmFtaWx5TmFtZSkKLSAgICB7CisgICAgU2ltcGxlRm9udERhdGEqIHNpbXBs
ZUZvbnQgPSBnZXRDYWNoZWRGb250RGF0YShkZXNjcmlwdGlvbiwgZm9udFN0cik7CisgICAgaWYg
KHNpbXBsZUZvbnQpCisgICAgICByZXR1cm4gc2ltcGxlRm9udDsKKworICAgIC8vIEZhbGwgYmFj
ayB0byBzeXN0ZW0gZm9udHMgYXMgV2luIFNhZmFyaSBkb2VzIGJlY2F1c2UgdGhpcyBmdW5jdGlv
biBtdXN0IHJldHVybiBhIHZhbGlkIGZvbnQuCisgICAgLy8gV2hlbiB3ZSBmaW5kIGEgdmFsaWQg
c3lzdGVtIGZvbnQsIHdlIHNhdmUgaXRzIG5hbWUgdG8gYSBzdGF0aWMgdmFyaWFibGUgdG8gcHJl
dmVudCB0cnlpbmcgc3lzdGVtIGZvbnRzIGFnYWluLgorICAgIHN0YXRpYyB3Y2hhcl90IGZhbGxi
YWNrRm9udE5hbWVbTEZfRkFDRVNJWkVdID0gezB9OworICAgIGlmIChmYWxsYmFja0ZvbnROYW1l
WzBdKQorICAgICAgICByZXR1cm4gZ2V0Q2FjaGVkRm9udERhdGEoZGVzY3JpcHRpb24sIGZhbGxi
YWNrRm9udE5hbWUpOworCisgICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBERUZBVUxUX0dVSV9GT05U
IGlmIG5vIGtub3duIFVuaWNvZGUgZm9udHMgYXJlIGF2YWlsYWJsZS4KKyAgICBpZiAoSEZPTlQg
ZGVmYXVsdEdVSUZvbnQgPSBzdGF0aWNfY2FzdDxIRk9OVD4oR2V0U3RvY2tPYmplY3QoREVGQVVM
VF9HVUlfRk9OVCkpKSB7CisgICAgICAgIExPR0ZPTlQgZGVmYXVsdEdVSUxvZ0ZvbnQ7CisgICAg
ICAgIEdldE9iamVjdChkZWZhdWx0R1VJRm9udCwgc2l6ZW9mKGRlZmF1bHRHVUlMb2dGb250KSwg
JmRlZmF1bHRHVUlMb2dGb250KTsKKyAgICAgICAgaWYgKHNpbXBsZUZvbnQgPSBmb250RGF0YUZy
b21EZXNjcmlwdGlvbkFuZExvZ0ZvbnQodGhpcywgZGVzY3JpcHRpb24sIGRlZmF1bHRHVUlMb2dG
b250LCBmYWxsYmFja0ZvbnROYW1lKSkKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVGb250Owog
ICAgIH0KIAotICAgIGNvbnN0IEF0b21pY1N0cmluZyYgbV9mYW1pbHlOYW1lOwotICAgIEhhc2hT
ZXQ8dW5zaWduZWQ+IG1fdHJhaXRzTWFza3M7Ci19OwotCi1zdGF0aWMgaW50IENBTExCQUNLIHRy
YWl0c0luRmFtaWx5RW51bVByb2MoQ09OU1QgTE9HRk9OVCogbG9nRm9udCwgQ09OU1QgVEVYVE1F
VFJJQyogbWV0cmljcywgRFdPUkQgZm9udFR5cGUsIExQQVJBTSBsUGFyYW0pCi17Ci0gICAgVHJh
aXRzSW5GYW1pbHlQcm9jRGF0YSogcHJvY0RhdGEgPSByZWludGVycHJldF9jYXN0PFRyYWl0c0lu
RmFtaWx5UHJvY0RhdGEqPihsUGFyYW0pOworICAgIC8vIEZhbGwgYmFjayB0byBOb24tY2xpZW50
IG1ldHJpY3MgZm9udHMuCisgICAgTk9OQ0xJRU5UTUVUUklDUyBub25DbGllbnRNZXRyaWNzID0g
ezB9OworICAgIG5vbkNsaWVudE1ldHJpY3MuY2JTaXplID0gc2l6ZW9mKG5vbkNsaWVudE1ldHJp
Y3MpOworICAgIGlmIChTeXN0ZW1QYXJhbWV0ZXJzSW5mbyhTUElfR0VUTk9OQ0xJRU5UTUVUUklD
Uywgc2l6ZW9mKG5vbkNsaWVudE1ldHJpY3MpLCAmbm9uQ2xpZW50TWV0cmljcywgMCkpIHsKKyAg
ICAgICAgaWYgKHNpbXBsZUZvbnQgPSBmb250RGF0YUZyb21EZXNjcmlwdGlvbkFuZExvZ0ZvbnQo
dGhpcywgZGVzY3JpcHRpb24sIG5vbkNsaWVudE1ldHJpY3MubGZNZXNzYWdlRm9udCwgZmFsbGJh
Y2tGb250TmFtZSkpCisgICAgICAgICAgICByZXR1cm4gc2ltcGxlRm9udDsKKyAgICAgICAgaWYg
KHNpbXBsZUZvbnQgPSBmb250RGF0YUZyb21EZXNjcmlwdGlvbkFuZExvZ0ZvbnQodGhpcywgZGVz
Y3JpcHRpb24sIG5vbkNsaWVudE1ldHJpY3MubGZNZW51Rm9udCwgZmFsbGJhY2tGb250TmFtZSkp
CisgICAgICAgICAgICByZXR1cm4gc2ltcGxlRm9udDsKKyAgICAgICAgaWYgKHNpbXBsZUZvbnQg
PSBmb250RGF0YUZyb21EZXNjcmlwdGlvbkFuZExvZ0ZvbnQodGhpcywgZGVzY3JpcHRpb24sIG5v
bkNsaWVudE1ldHJpY3MubGZTdGF0dXNGb250LCBmYWxsYmFja0ZvbnROYW1lKSkKKyAgICAgICAg
ICAgIHJldHVybiBzaW1wbGVGb250OworICAgICAgICBpZiAoc2ltcGxlRm9udCA9IGZvbnREYXRh
RnJvbURlc2NyaXB0aW9uQW5kTG9nRm9udCh0aGlzLCBkZXNjcmlwdGlvbiwgbm9uQ2xpZW50TWV0
cmljcy5sZkNhcHRpb25Gb250LCBmYWxsYmFja0ZvbnROYW1lKSkKKyAgICAgICAgICAgIHJldHVy
biBzaW1wbGVGb250OworICAgICAgICBpZiAoc2ltcGxlRm9udCA9IGZvbnREYXRhRnJvbURlc2Ny
aXB0aW9uQW5kTG9nRm9udCh0aGlzLCBkZXNjcmlwdGlvbiwgbm9uQ2xpZW50TWV0cmljcy5sZlNt
Q2FwdGlvbkZvbnQsIGZhbGxiYWNrRm9udE5hbWUpKQorICAgICAgICAgICAgcmV0dXJuIHNpbXBs
ZUZvbnQ7CisgICAgfQogCi0gICAgdW5zaWduZWQgdHJhaXRzTWFzayA9IDA7Ci0gICAgdHJhaXRz
TWFzayB8PSBsb2dGb250LT5sZkl0YWxpYyA/IEZvbnRTdHlsZUl0YWxpY01hc2sgOiBGb250U3R5
bGVOb3JtYWxNYXNrOwotICAgIHRyYWl0c01hc2sgfD0gRm9udFZhcmlhbnROb3JtYWxNYXNrOwot
ICAgIExPTkcgd2VpZ2h0ID0gbG9nRm9udC0+bGZXZWlnaHQ7Ci0gICAgdHJhaXRzTWFzayB8PSB3
ZWlnaHQgPT0gRldfVEhJTiA/IEZvbnRXZWlnaHQxMDBNYXNrIDoKLSAgICAgICAgd2VpZ2h0ID09
IEZXX0VYVFJBTElHSFQgPyBGb250V2VpZ2h0MjAwTWFzayA6Ci0gICAgICAgIHdlaWdodCA9PSBG
V19MSUdIVCA/IEZvbnRXZWlnaHQzMDBNYXNrIDoKLSAgICAgICAgd2VpZ2h0ID09IEZXX05PUk1B
TCA/IEZvbnRXZWlnaHQ0MDBNYXNrIDoKLSAgICAgICAgd2VpZ2h0ID09IEZXX01FRElVTSA/IEZv
bnRXZWlnaHQ1MDBNYXNrIDoKLSAgICAgICAgd2VpZ2h0ID09IEZXX1NFTUlCT0xEID8gRm9udFdl
aWdodDYwME1hc2sgOgotICAgICAgICB3ZWlnaHQgPT0gRldfQk9MRCA/IEZvbnRXZWlnaHQ3MDBN
YXNrIDoKLSAgICAgICAgd2VpZ2h0ID09IEZXX0VYVFJBQk9MRCA/IEZvbnRXZWlnaHQ4MDBNYXNr
IDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRXZWlnaHQ5MDBNYXNrOwot
ICAgIHByb2NEYXRhLT5tX3RyYWl0c01hc2tzLmFkZCh0cmFpdHNNYXNrKTsKLSAgICByZXR1cm4g
MTsKKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKIH0KIAogdm9pZCBG
b250Q2FjaGU6OmdldFRyYWl0c0luRmFtaWx5KGNvbnN0IEF0b21pY1N0cmluZyYgZmFtaWx5TmFt
ZSwgVmVjdG9yPHVuc2lnbmVkPiYgdHJhaXRzTWFza3MpCg==
</data>
<flag name="review"
          id="66130"
          type_id="1"
          status="-"
          setter="levin"
    />
          </attachment>
      

    </bug>

</bugzilla>