<?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>137539</bug_id>
          
          <creation_ts>2014-10-08 15:17:41 -0700</creation_ts>
          <short_desc>[Mac] Spending too much time mapping desired font families to available ones</short_desc>
          <delta_ts>2014-10-09 12:06:07 -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>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>137454</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Chris Dumez">cdumez</reporter>
          <assigned_to name="Chris Dumez">cdumez</assigned_to>
          <cc>barraclough</cc>
    
    <cc>commit-queue</cc>
    
    <cc>darin</cc>
    
    <cc>enrica</cc>
    
    <cc>ggaren</cc>
    
    <cc>mmaxfield</cc>
    
    <cc>rniwa</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1040423</commentid>
    <comment_count>0</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-08 15:17:41 -0700</bug_when>
    <thetext>While profiling the load of weather.com, I noticed that we are spending quite a bit of time trying to map the font family requested to a font that is available on the system. The process involves:
1. Doing a linear search of all the installed font families and do a case-insensitive string comparison for each of them until we find a match
2. If we don&apos;t find a match, do another linear search of the fonts postscript names this time

This process is costly and the fonts requested by weather.com are not available, causing us to do 2 linear searches and a lot of string comparisons (accounting for ~2% of the WebProcess CPU time for the page load). As a result, we end up spending ~90ms in internalFontWithFamily() when loading weather.com.

Based on my testing, if we kept a cache of the mapping between desired font families and available font families, we could cut the time spent in internalFontWithFamily() in half (~45ms).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040424</commentid>
    <comment_count>1</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-08 15:18:03 -0700</bug_when>
    <thetext>&lt;rdar://problem/18545368&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040427</commentid>
    <comment_count>2</comment_count>
      <attachid>239498</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-08 15:37:04 -0700</bug_when>
    <thetext>Created attachment 239498
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040446</commentid>
    <comment_count>3</comment_count>
      <attachid>239498</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2014-10-08 17:21:19 -0700</bug_when>
    <thetext>Comment on attachment 239498
Patch

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

&gt; Source/WebCore/platform/mac/WebFontCache.mm:124
&gt; +    static NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];

There&apos;s no way you can do this with WTF types instead? :\

&gt; Source/WebCore/platform/mac/WebFontCache.mm:160
&gt; +        CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), nullptr, fontCacheRegisteredFontsChangedNotificationCallback, kCTFontManagerRegisteredFontsChangedNotification, nullptr, CFNotificationSuspensionBehaviorDeliverImmediately);

We already do this in FontCache, and I&apos;m wary of setting up too many independent handlers. Can you plumb the call from FontCache?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040447</commentid>
    <comment_count>4</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2014-10-08 17:22:37 -0700</bug_when>
    <thetext>Unofficial r=me, given my comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040448</commentid>
    <comment_count>5</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-08 17:34:57 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 239498 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=239498&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/platform/mac/WebFontCache.mm:124
&gt; &gt; +    static NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
&gt; 
&gt; There&apos;s no way you can do this with WTF types instead? :\

I discussed this with Geoffrey earlier. The issue is that if I used a WTF::HashMap, I&apos;d have to convert the key from NSString* to WTF::String, which is currently cheap (involves copying the raw string data).

&gt; 
&gt; &gt; Source/WebCore/platform/mac/WebFontCache.mm:160
&gt; &gt; +        CFNotificationCenterAddObserver(CFNotificationCenterGetLocalCenter(), nullptr, fontCacheRegisteredFontsChangedNotificationCallback, kCTFontManagerRegisteredFontsChangedNotification, nullptr, CFNotificationSuspensionBehaviorDeliverImmediately);
&gt; 
&gt; We already do this in FontCache, and I&apos;m wary of setting up too many independent handlers. Can you plumb the call from FontCache?

Yes, there is already a handler in FontCacheMac.mm and I have thought of reusing that one. The issue is that I will then need to add a new invalidateCache() ObjC API to WebFontCache. Would that be fine? How about third party using that API, wouldn&apos;t that break them if they did not call invalidateCache() when needed?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040449</commentid>
    <comment_count>6</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-08 17:35:41 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (In reply to comment #3)
&gt; &gt; (From update of attachment 239498 [details] [details])
&gt; &gt; View in context: https://bugs.webkit.org/attachment.cgi?id=239498&amp;action=review
&gt; &gt; 
&gt; &gt; &gt; Source/WebCore/platform/mac/WebFontCache.mm:124
&gt; &gt; &gt; +    static NSMutableDictionary *dictionary = [[NSMutableDictionary alloc] init];
&gt; &gt; 
&gt; &gt; There&apos;s no way you can do this with WTF types instead? :\
&gt; 
&gt; I discussed this with Geoffrey earlier. The issue is that if I used a WTF::HashMap, I&apos;d have to convert the key from NSString* to WTF::String, which is currently cheap (involves copying the raw string data).

*not* cheap, sorry.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040468</commentid>
    <comment_count>7</comment_count>
      <attachid>239498</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-08 20:31:22 -0700</bug_when>
    <thetext>Comment on attachment 239498
Patch

After discussing this offline with Myles, we decided to have FontCacheMac invalidate WebFontCache since it already listens for font registration changes. New patch iteration incoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040469</commentid>
    <comment_count>8</comment_count>
      <attachid>239513</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-08 20:34:33 -0700</bug_when>
    <thetext>Created attachment 239513
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040560</commentid>
    <comment_count>9</comment_count>
      <attachid>239513</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2014-10-09 09:05:47 -0700</bug_when>
    <thetext>Comment on attachment 239513
Patch

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

OK to land as is. A few ideas for improvements.

&gt; Source/WebCore/platform/graphics/mac/FontCacheMac.mm:57
&gt; +    [WebFontCache invalidate];

I think it’s a little indirect that WebFontCache is only properly invalidated if WebCore::FontCache is allocated. I suppose that in practice this is not a problem, but it’s sort of an indirect dependency that could possibly be made slightly more direct. I could imagine adding a call to fontCache() to the desiredFamilyToAvailableFamilyDictionary() function, for example, with a comment explaining the reason and the side effect.

&gt; Source/WebCore/platform/mac/WebFontCache.mm:132
&gt; +    if ([desiredFamilyToAvailableFamilyDictionary() count] == maxCacheSize) {

Might be faster to put the dictionary into a local variable rather than calling the function at least two times.

&gt; Source/WebCore/platform/mac/WebFontCache.mm:134
&gt; +        NSEnumerator *keyEnumerator = [desiredFamilyToAvailableFamilyDictionary() keyEnumerator];
&gt; +        [desiredFamilyToAvailableFamilyDictionary() removeObjectForKey: [keyEnumerator nextObject]];

Fast enumeration would probably be more efficient and I think reads a little better.

    for (NSString *key in desiredFamilyToAvailableFamilyDictionary()) {
        [desiredFamilyToAvailableFamilyDictionary() removeObjectForKey:key];
        break;
    }

&gt; Source/WebCore/platform/mac/WebFontCache.mm:139
&gt; +    if (availableFamily)
&gt; +        [desiredFamilyToAvailableFamilyDictionary() setObject:availableFamily forKey:desiredFamily];
&gt; +    else
&gt; +        [desiredFamilyToAvailableFamilyDictionary() setObject:@&quot;&quot; forKey:desiredFamily];

Seems a little wordy this way. Might read better like this:

    [desiredFamilyToAvailableFamilyDictionary() setObject:availableFamily ?: @&quot;&quot; forKey:desiredFamily];

Or like this:

    NSString *value = availableFamily ? availableFamily : @&quot;&quot;;
    [desiredFamilyToAvailableFamilyDictionary() setObject:value forKey:desiredFamily];

Could also consider representing null in the dictionary as NSNull rather than with an empty string. Downside is you’d have to use id rather than NSString * when getting values out of the dictionary. Upside is that NSNull is a more logical direct mapping to/from nil than the empty string is.

&gt; Source/WebCore/platform/mac/WebFontCache.mm:194
&gt;      NSFontManager *fontManager = [NSFontManager sharedFontManager];

I’d put this down where it’s used in the non-cached case; seems a little ugly to do this even in the cached case.

And on reflection, I think this function would be more readable broken into three pieces:

1) A function that maps a desired family name to an available family name, without caching.
2) A function that finds a desired family name to an available family name, with caching, that calls (1) in the &quot;not yet in cache&quot; case.
3) A function that finds an NSFont, which calls (2).

I won’t insist on this refactoring, but I do think it could make the code easier to read.

&gt; Source/WebCore/platform/mac/WebFontCache.mm:200
&gt; +            // Already tried mapping the desired font to an available one in the past and failed, so
&gt; +            // don&apos;t try again.

It&apos;s good to have a comment here, but this one seems a little too wordy. The idea that we cache failures as well as successes is a normal part of the memoization pattern; I wish there was a more straightforward way of separating “it was cached” from “the cached value happens to be null” that makes this look less like a special case, and more like “decoding empty string and turning it into nil”.

&gt; Source/WebCore/platform/mac/WebFontCache.mm:208
&gt; +        NSEnumerator *e = [[fontManager availableFontFamilies] objectEnumerator];
&gt; +        while ((availableFamily = [e nextObject])) {

Could use fast enumeration:

    for (availableFamily in [fontManager availableFontFamilies]) {

&gt; Source/WebCore/platform/mac/WebFontCache.mm:219
&gt; +            NSEnumerator *availableFonts = [[fontManager availableFonts] objectEnumerator];
&gt; +            NSString *availableFont;
&gt; +            NSFont *nameMatchedFont = nil;
&gt; +            NSFontTraitMask desiredTraitsForNameMatch = desiredTraits | (desiredWeight &gt;= 7 ? NSBoldFontMask : 0);
&gt; +            while ((availableFont = [availableFonts nextObject])) {

Could use fast enumeration:

    for (NSString *availableFont in [fontManager availableFonts]) {</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040586</commentid>
    <comment_count>10</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-09 10:11:35 -0700</bug_when>
    <thetext>&gt; And on reflection, I think this function would be more readable broken into three pieces:
&gt; 
&gt; 1) A function that maps a desired family name to an available family name, without caching.
&gt; 2) A function that finds a desired family name to an available family name, with caching, that calls (1) in the &quot;not yet in cache&quot; case.
&gt; 3) A function that finds an NSFont, which calls (2).
&gt; 
&gt; I won’t insist on this refactoring, but I do think it could make the code easier to read.

This sounds like a nice proposal, I will propose this refactoring in a follow-up patch to keep the patch size small.

I will include your other smaller suggestions in this patch before landing though.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040597</commentid>
    <comment_count>11</comment_count>
      <attachid>239513</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2014-10-09 10:39:23 -0700</bug_when>
    <thetext>Comment on attachment 239513
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/mac/FontCacheMac.mm:57
&gt;&gt; +    [WebFontCache invalidate];
&gt; 
&gt; I think it’s a little indirect that WebFontCache is only properly invalidated if WebCore::FontCache is allocated. I suppose that in practice this is not a problem, but it’s sort of an indirect dependency that could possibly be made slightly more direct. I could imagine adding a call to fontCache() to the desiredFamilyToAvailableFamilyDictionary() function, for example, with a comment explaining the reason and the side effect.

I thought that I should document here that cdumez chose this design at my request given my work regarding WebFontCache (https://bugs.webkit.org/show_bug.cgi?id=134752)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040600</commentid>
    <comment_count>12</comment_count>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-09 10:44:22 -0700</bug_when>
    <thetext>(In reply to comment #9)
&gt; (From update of attachment 239513 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=239513&amp;action=review
&gt; 
&gt; OK to land as is. A few ideas for improvements.
&gt; 
&gt; &gt; Source/WebCore/platform/graphics/mac/FontCacheMac.mm:57
&gt; &gt; +    [WebFontCache invalidate];
&gt; 
&gt; I think it’s a little indirect that WebFontCache is only properly invalidated if WebCore::FontCache is allocated. I suppose that in practice this is not a problem, but it’s sort of an indirect dependency that could possibly be made slightly more direct. I could imagine adding a call to fontCache() to the desiredFamilyToAvailableFamilyDictionary() function, for example, with a comment explaining the reason and the side effect.

It is actually if FontCache::getCachedFontPlatformData() is called (not if FontCache is allocated). It is in getCachedFontPlatformData() that we construct the FontPlatformDataCache and call platformInit() to register the callback. My understanding after talking with Myles is that this is relatively safe because callers should go via FontCache instead of accessing WebFontCache directly. There was an exception to that in WebKit but Myles is taking care of fixing it and have that code use FontCache instead (https://bugs.webkit.org/show_bug.cgi?id=137550).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040603</commentid>
    <comment_count>13</comment_count>
      <attachid>239550</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-09 10:51:04 -0700</bug_when>
    <thetext>Created attachment 239550
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040606</commentid>
    <comment_count>14</comment_count>
      <attachid>239513</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-09 10:53:22 -0700</bug_when>
    <thetext>Comment on attachment 239513
Patch

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

&gt;&gt; Source/WebCore/platform/mac/WebFontCache.mm:132
&gt;&gt; +    if ([desiredFamilyToAvailableFamilyDictionary() count] == maxCacheSize) {
&gt; 
&gt; Might be faster to put the dictionary into a local variable rather than calling the function at least two times.

Done.

&gt;&gt; Source/WebCore/platform/mac/WebFontCache.mm:134
&gt;&gt; +        [desiredFamilyToAvailableFamilyDictionary() removeObjectForKey: [keyEnumerator nextObject]];
&gt; 
&gt; Fast enumeration would probably be more efficient and I think reads a little better.
&gt; 
&gt;     for (NSString *key in desiredFamilyToAvailableFamilyDictionary()) {
&gt;         [desiredFamilyToAvailableFamilyDictionary() removeObjectForKey:key];
&gt;         break;
&gt;     }

Done.

&gt;&gt; Source/WebCore/platform/mac/WebFontCache.mm:139
&gt;&gt; +        [desiredFamilyToAvailableFamilyDictionary() setObject:@&quot;&quot; forKey:desiredFamily];
&gt; 
&gt; Seems a little wordy this way. Might read better like this:
&gt; 
&gt;     [desiredFamilyToAvailableFamilyDictionary() setObject:availableFamily ?: @&quot;&quot; forKey:desiredFamily];
&gt; 
&gt; Or like this:
&gt; 
&gt;     NSString *value = availableFamily ? availableFamily : @&quot;&quot;;
&gt;     [desiredFamilyToAvailableFamilyDictionary() setObject:value forKey:desiredFamily];
&gt; 
&gt; Could also consider representing null in the dictionary as NSNull rather than with an empty string. Downside is you’d have to use id rather than NSString * when getting values out of the dictionary. Upside is that NSNull is a more logical direct mapping to/from nil than the empty string is.

Done. Went with the second proposal and NSNull.

&gt;&gt; Source/WebCore/platform/mac/WebFontCache.mm:194
&gt;&gt;      NSFontManager *fontManager = [NSFontManager sharedFontManager];
&gt; 
&gt; I’d put this down where it’s used in the non-cached case; seems a little ugly to do this even in the cached case.
&gt; 
&gt; And on reflection, I think this function would be more readable broken into three pieces:
&gt; 
&gt; 1) A function that maps a desired family name to an available family name, without caching.
&gt; 2) A function that finds a desired family name to an available family name, with caching, that calls (1) in the &quot;not yet in cache&quot; case.
&gt; 3) A function that finds an NSFont, which calls (2).
&gt; 
&gt; I won’t insist on this refactoring, but I do think it could make the code easier to read.

Putting this off this later since Myles plans to kill WebFontCache.

&gt;&gt; Source/WebCore/platform/mac/WebFontCache.mm:200
&gt;&gt; +            // don&apos;t try again.
&gt; 
&gt; It&apos;s good to have a comment here, but this one seems a little too wordy. The idea that we cache failures as well as successes is a normal part of the memoization pattern; I wish there was a more straightforward way of separating “it was cached” from “the cached value happens to be null” that makes this look less like a special case, and more like “decoding empty string and turning it into nil”.

Reduced the comment size and used NSNull instead of empty NString.

&gt;&gt; Source/WebCore/platform/mac/WebFontCache.mm:208
&gt;&gt; +        while ((availableFamily = [e nextObject])) {
&gt; 
&gt; Could use fast enumeration:
&gt; 
&gt;     for (availableFamily in [fontManager availableFontFamilies]) {

Done.

&gt;&gt; Source/WebCore/platform/mac/WebFontCache.mm:219
&gt;&gt; +            while ((availableFont = [availableFonts nextObject])) {
&gt; 
&gt; Could use fast enumeration:
&gt; 
&gt;     for (NSString *availableFont in [fontManager availableFonts]) {

Done.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040607</commentid>
    <comment_count>15</comment_count>
      <attachid>239551</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2014-10-09 10:55:18 -0700</bug_when>
    <thetext>Created attachment 239551
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040619</commentid>
    <comment_count>16</comment_count>
      <attachid>239551</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2014-10-09 11:28:53 -0700</bug_when>
    <thetext>Comment on attachment 239551
Patch

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

&gt; Source/WebCore/platform/mac/WebFontCache.mm:133
&gt; +    if ([familyMapping count] == maxCacheSize) {

Might as well make this &lt;= since ASSERTS only get hit in debug builds. Your call, though; it&apos;s probably fine either way.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040626</commentid>
    <comment_count>17</comment_count>
      <attachid>239551</attachid>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2014-10-09 12:05:58 -0700</bug_when>
    <thetext>Comment on attachment 239551
Patch

Clearing flags on attachment: 239551

Committed r174516: &lt;http://trac.webkit.org/changeset/174516&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1040627</commentid>
    <comment_count>18</comment_count>
    <who name="WebKit Commit Bot">commit-queue</who>
    <bug_when>2014-10-09 12:06:07 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>239498</attachid>
            <date>2014-10-08 15:37:04 -0700</date>
            <delta_ts>2014-10-08 20:45:05 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-137539-20141008153707.patch</filename>
            <type>text/plain</type>
            <size>9811</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTc0NDU5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggMTM0YTlkODVjNjU0NWU1
OWRjZGM0YTYzNGU2NWEyYzBkOTNhZWUxMS4uMmRlOTA5MDc2NWYyODNmNzkyYWNiNTg5OTRjMjIx
OGEyYjkzYzk0NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDQ1IEBACiAyMDE0LTEwLTA4ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CiAKKyAgICAgICAgW01hY10gU3BlbmRpbmcgdG9v
IG11Y2ggdGltZSBtYXBwaW5nIGRlc2lyZWQgZm9udCBmYW1pbGllcyB0byBhdmFpbGFibGUgb25l
cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3NTM5
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2hpbGUg
cHJvZmlsaW5nIHRoZSBsb2FkIG9mIHdlYXRoZXIuY29tLCBJIG5vdGljZWQgdGhhdCB3ZSBhcmUg
c3BlbmRpbmcKKyAgICAgICAgcXVpdGUgYSBiaXQgb2YgdGltZSB0cnlpbmcgdG8gbWFwIHRoZSBm
b250IGZhbWlseSByZXF1ZXN0ZWQgdG8gYSBmb250CisgICAgICAgIHRoYXQgaXMgYXZhaWxhYmxl
IG9uIHRoZSBzeXN0ZW0uIFRoZSBwcm9jZXNzIGludm9sdmVzOgorICAgICAgICAxLiBEb2luZyBh
IGxpbmVhciBzZWFyY2ggb2YgYWxsIHRoZSBpbnN0YWxsZWQgZm9udCBmYW1pbGllcyBhbmQgZG8g
YQorICAgICAgICAgICBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uIGZvciBlYWNo
IG9mIHRoZW0gdW50aWwgd2UgZmluZCBhCisgICAgICAgICAgIG1hdGNoLAorICAgICAgICAyLiBU
aGVuLCBpZiB3ZSBkb24ndCBmaW5kIGEgbWF0Y2gsIGRvIGFub3RoZXIgbGluZWFyIHNlYXJjaCBv
ZiB0aGUKKyAgICAgICAgICAgZm9udHMnIHBvc3RzY3JpcHQgbmFtZXMgdGhpcyB0aW1lIGFuZCBk
byBhZ2FpbiBhIGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24g
Zm9yIGVhY2ggb2YgdGhlbS4KKworICAgICAgICBUaGlzIHByb2Nlc3MgaXMgY29zdGx5IGFuZCB0
aGUgZm9udHMgcmVxdWVzdGVkIGJ5IHdlYXRoZXIuY29tIGFyZSBub3QKKyAgICAgICAgYXZhaWxh
YmxlLCBjYXVzaW5nIHVzIHRvIGRvIDIgbGluZWFyIHNlYXJjaGVzIGFuZCBhIGxvdCBvZiBzdHJp
bmcKKyAgICAgICAgY29tcGFyaXNvbnMgKGFjY291bnRpbmcgZm9yIH4yJSBvZiB0aGUgV2ViUHJv
Y2VzcyBDUFUgdGltZSBmb3IgdGhlIHBhZ2UKKyAgICAgICAgbG9hZCkuIEFzIGEgcmVzdWx0LCB3
ZSBlbmQgdXAgc3BlbmRpbmcgfjkwbXMgaW4KKyAgICAgICAgaW50ZXJuYWxGb250V2l0aEZhbWls
eSgpIHdoZW4gbG9hZGluZyB3ZWF0aGVyLmNvbS4KKworICAgICAgICBUaGlzIHBhdGNoIGludHJv
ZHVjZXMgYSBjYWNoZSBmb3IgdGhlIG1hcHBpbmcgYmV0d2VlbiBkZXNpcmVkIGZvbnQKKyAgICAg
ICAgZmFtaWxpZXMgYW5kIGF2YWlsYWJsZSBmb250IGZhbWlsaWVzLiBUaGlzIGN1dHMgdGhlIHRp
bWUgc3BlbnQgaW4KKyAgICAgICAgaW50ZXJuYWxGb250V2l0aEZhbWlseSgpIGluIGhhbGYgKH40
NW1zKS4gVGhlIGNhY2hlIGdldHMgaW52YWxpZGF0ZWQKKyAgICAgICAgd2hlbiBmb250cyBhcmUg
aW5zdGFsbGVkIC8gdW5pbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBzbyB3ZSBkb24ndCBicmVhawor
ICAgICAgICB0aGF0IHNjZW5hcmlvLiBUaGUgY2FjaGUgaXMgYWxzbyBsaW1pdGVkIGluIHNpemUg
dG8gYXZvaWQgdXNpbmcgdG9vCisgICAgICAgIG11Y2ggbWVtb3J5LgorCisgICAgICAgIE5vIG5l
dyB0ZXN0cywgYnV0IG1hbnVhbCB0ZXN0aW5nIG1ha2luZyBzdXJlIHRoZSBjYWNoZSBnZXRzIGlu
dmFsaWRhdGVkCisgICAgICAgIHdoZW4gaW5zdGFsbGluZyBhIGZvbnQgb24gdGhlIHN5c3RlbS4K
KworICAgICAgICAqIHBsYXRmb3JtL21hYy9XZWJGb250Q2FjaGUubW06CisgICAgICAgIChkZXNp
cmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlEaWN0aW9uYXJ5KToKKyAgICAgICAgKGludmFsaWRh
dGVDYWNoZSk6CisgICAgICAgIChmb250Q2FjaGVSZWdpc3RlcmVkRm9udHNDaGFuZ2VkTm90aWZp
Y2F0aW9uQ2FsbGJhY2spOgorICAgICAgICAocmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFi
bGVGYW1pbHlNYXBwaW5nKToKKyAgICAgICAgKCtbV2ViRm9udENhY2hlIGludGVybmFsRm9udFdp
dGhGYW1pbHk6dHJhaXRzOndlaWdodDpzaXplOl0pOgorCisyMDE0LTEwLTA4ICBDaHJpcyBEdW1l
eiAgPGNkdW1lekBhcHBsZS5jb20+CisKICAgICAgICAgVW5yZXZpZXdlZCBidWlsZCBmaXggYWZ0
ZXIgcjE3NDQ1Ni4KIAogICAgICAgICBJIHdhcyBjb21wYXJpbmcgYSBzaWduZWQgaW50IHRvIGFu
IHVuc2lnbmVkIG9uZS4KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9X
ZWJGb250Q2FjaGUubW0gYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViRm9udENhY2hl
Lm1tCmluZGV4IDU4YTVmMjRhMzQ3YTY4M2MzZDdmOTc2ZmYwOWVmOTk1MmQzNjQ4YTkuLjI1MGUx
MThlMjRiZTM2MTVlODEyMGYxODIyZDdlZTQ0NDNlNWQ2MGEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJGb250Q2FjaGUubW0KKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5tbQpAQCAtMzUsNiArMzUsNyBAQAogI2ltcG9ydCA8
QXBwS2l0L0FwcEtpdC5oPgogI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+CiAjaW1w
b3J0IDxtYXRoLmg+CisjaW1wb3J0IDx3dGYvTWFpblRocmVhZC5oPgogCiB1c2luZyBuYW1lc3Bh
Y2UgV2ViQ29yZTsKIApAQCAtMTE1LDYgKzExNiw1MiBAQCBzdGF0aWMgaW5saW5lIEZvbnRUcmFp
dHNNYXNrIHRvVHJhaXRzTWFzayhOU0ZvbnRUcmFpdE1hc2sgYXBwS2l0VHJhaXRzLCBOU0ludGVn
ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb250V2VpZ2h0OTAwTWFzaykp
OwogfQogCisvLyBLZWVwIGEgY2FjaGUgZm9yIG1hcHBpbmcgZGVzaXJlZCBmb250IGZhbWlsaWVz
IHRvIGZvbnQgZmFtaWxpZXMgYWN0dWFsbHkKKy8vIGF2YWlsYWJsZSBvbiB0aGUgc3lzdGVtIGZv
ciBwZXJmb3JtYW5jZS4KK3N0YXRpYyBOU011dGFibGVEaWN0aW9uYXJ5KiBkZXNpcmVkRmFtaWx5
VG9BdmFpbGFibGVGYW1pbHlEaWN0aW9uYXJ5KCkKK3sKKyAgICBBU1NFUlQoaXNNYWluVGhyZWFk
KCkpOworICAgIHN0YXRpYyBOU011dGFibGVEaWN0aW9uYXJ5ICpkaWN0aW9uYXJ5ID0gW1tOU011
dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKKyAgICByZXR1cm4gZGljdGlvbmFyeTsKK30K
KworLy8gVGhlICJ2b2lkKiIgcGFyYW1ldGVyIG1ha2VzIHRoZSBmdW5jdGlvbiBtYXRjaCB0aGUg
cHJvdG90eXBlIGZvciBjYWxsYmFja3MgZnJvbSBjYWxsT25NYWluVGhyZWFkLgorc3RhdGljIHZv
aWQgaW52YWxpZGF0ZUNhY2hlKHZvaWQqKQoreworICAgIGlmICghaXNNYWluVGhyZWFkKCkpIHsK
KyAgICAgICAgY2FsbE9uTWFpblRocmVhZCgmaW52YWxpZGF0ZUNhY2hlLCAwKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKyAgICBbZGVzaXJlZEZhbWlseVRvQXZhaWxhYmxlRmFtaWx5RGljdGlv
bmFyeSgpIHJlbW92ZUFsbE9iamVjdHNdOworfQorCitzdGF0aWMgdm9pZCBmb250Q2FjaGVSZWdp
c3RlcmVkRm9udHNDaGFuZ2VkTm90aWZpY2F0aW9uQ2FsbGJhY2soQ0ZOb3RpZmljYXRpb25DZW50
ZXJSZWYsIHZvaWQqLCBDRlN0cmluZ1JlZiBuYW1lLCBjb25zdCB2b2lkICosIENGRGljdGlvbmFy
eVJlZikKK3sKKyAgICBBU1NFUlRfVU5VU0VEKG5hbWUsIENGRXF1YWwobmFtZSwga0NURm9udE1h
bmFnZXJSZWdpc3RlcmVkRm9udHNDaGFuZ2VkTm90aWZpY2F0aW9uKSk7CisgICAgaW52YWxpZGF0
ZUNhY2hlKDApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVtZW1iZXJEZXNpcmVkRmFtaWx5
VG9BdmFpbGFibGVGYW1pbHlNYXBwaW5nKE5TU3RyaW5nKiBkZXNpcmVkRmFtaWx5LCBOU1N0cmlu
ZyogYXZhaWxhYmxlRmFtaWx5KQoreworICAgIHN0YXRpYyBib29sIGlzTGlzdGVuaW5nRm9yUmVn
aXN0ZXJlZEZvbnRDaGFuZ2VzID0gZmFsc2U7CisgICAgc3RhdGljIGNvbnN0IE5TVUludGVnZXIg
bWF4Q2FjaGVTaXplID0gMTI4OworICAgIEFTU0VSVChbZGVzaXJlZEZhbWlseVRvQXZhaWxhYmxl
RmFtaWx5RGljdGlvbmFyeSgpIGNvdW50XSA8PSBtYXhDYWNoZVNpemUpOworICAgIGlmIChbZGVz
aXJlZEZhbWlseVRvQXZhaWxhYmxlRmFtaWx5RGljdGlvbmFyeSgpIGNvdW50XSA9PSBtYXhDYWNo
ZVNpemUpIHsKKyAgICAgICAgTlNFbnVtZXJhdG9yICprZXlFbnVtZXJhdG9yID0gW2Rlc2lyZWRG
YW1pbHlUb0F2YWlsYWJsZUZhbWlseURpY3Rpb25hcnkoKSBrZXlFbnVtZXJhdG9yXTsKKyAgICAg
ICAgW2Rlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURpY3Rpb25hcnkoKSByZW1vdmVPYmpl
Y3RGb3JLZXk6IFtrZXlFbnVtZXJhdG9yIG5leHRPYmplY3RdXTsKKyAgICB9CisgICAgaWYgKGF2
YWlsYWJsZUZhbWlseSkKKyAgICAgICAgW2Rlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURp
Y3Rpb25hcnkoKSBzZXRPYmplY3Q6YXZhaWxhYmxlRmFtaWx5IGZvcktleTpkZXNpcmVkRmFtaWx5
XTsKKyAgICBlbHNlCisgICAgICAgIFtkZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlEaWN0
aW9uYXJ5KCkgc2V0T2JqZWN0OkAiIiBmb3JLZXk6ZGVzaXJlZEZhbWlseV07CisKKyAgICBpZiAo
IWlzTGlzdGVuaW5nRm9yUmVnaXN0ZXJlZEZvbnRDaGFuZ2VzKSB7CisgICAgICAgIC8vIExpc3Rl
biBmb3IgZm9udCByZWdpc3RyYXRpb24gY2hhbmdlcyB0byBpbnZhbGlkYXRlIHRoZSBjYWNoZSB3
aGVuIG5lZWRlZC4KKyAgICAgICAgQ0ZOb3RpZmljYXRpb25DZW50ZXJBZGRPYnNlcnZlcihDRk5v
dGlmaWNhdGlvbkNlbnRlckdldExvY2FsQ2VudGVyKCksIG51bGxwdHIsIGZvbnRDYWNoZVJlZ2lz
dGVyZWRGb250c0NoYW5nZWROb3RpZmljYXRpb25DYWxsYmFjaywga0NURm9udE1hbmFnZXJSZWdp
c3RlcmVkRm9udHNDaGFuZ2VkTm90aWZpY2F0aW9uLCBudWxscHRyLCBDRk5vdGlmaWNhdGlvblN1
c3BlbnNpb25CZWhhdmlvckRlbGl2ZXJJbW1lZGlhdGVseSk7CisgICAgICAgIGlzTGlzdGVuaW5n
Rm9yUmVnaXN0ZXJlZEZvbnRDaGFuZ2VzID0gdHJ1ZTsKKyAgICB9Cit9CisKIEBpbXBsZW1lbnRh
dGlvbiBXZWJGb250Q2FjaGUKIAogKyAodm9pZClnZXRUcmFpdHM6KFZlY3Rvcjx1bnNpZ25lZD4m
KXRyYWl0c01hc2tzIGluRmFtaWx5OihOU1N0cmluZyAqKWRlc2lyZWRGYW1pbHkKQEAgLTE2OSwz
OSArMjE2LDUxIEBAIHN0YXRpYyBpbmxpbmUgRm9udFRyYWl0c01hc2sgdG9UcmFpdHNNYXNrKE5T
Rm9udFRyYWl0TWFzayBhcHBLaXRUcmFpdHMsIE5TSW50ZWdlCiAKICAgICBOU0ZvbnRNYW5hZ2Vy
ICpmb250TWFuYWdlciA9IFtOU0ZvbnRNYW5hZ2VyIHNoYXJlZEZvbnRNYW5hZ2VyXTsKIAotICAg
IC8vIERvIGEgc2ltcGxlIGNhc2UgaW5zZW5zaXRpdmUgc2VhcmNoIGZvciBhIG1hdGNoaW5nIGZv
bnQgZmFtaWx5LgotICAgIC8vIE5TRm9udE1hbmFnZXIgcmVxdWlyZXMgZXhhY3QgbmFtZSBtYXRj
aGVzLgotICAgIC8vIFRoaXMgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIG9mIG1hdGNoaW5nIGFyaWFs
IHRvIEFyaWFsLCBldGMuLCBidXQgcGVyaGFwcyBub3QgYWxsIHRoZSBpc3N1ZXMuCi0gICAgTlNF
bnVtZXJhdG9yICplID0gW1tmb250TWFuYWdlciBhdmFpbGFibGVGb250RmFtaWxpZXNdIG9iamVj
dEVudW1lcmF0b3JdOwotICAgIE5TU3RyaW5nICphdmFpbGFibGVGYW1pbHk7Ci0gICAgd2hpbGUg
KChhdmFpbGFibGVGYW1pbHkgPSBbZSBuZXh0T2JqZWN0XSkpIHsKLSAgICAgICAgaWYgKFtkZXNp
cmVkRmFtaWx5IGNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU6YXZhaWxhYmxlRmFtaWx5XSA9PSBOU09y
ZGVyZWRTYW1lKQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKCFhdmFpbGFi
bGVGYW1pbHkpIHsKLSAgICAgICAgLy8gTWF0Y2ggYnkgUG9zdFNjcmlwdCBuYW1lLgotICAgICAg
ICBOU0VudW1lcmF0b3IgKmF2YWlsYWJsZUZvbnRzID0gW1tmb250TWFuYWdlciBhdmFpbGFibGVG
b250c10gb2JqZWN0RW51bWVyYXRvcl07Ci0gICAgICAgIE5TU3RyaW5nICphdmFpbGFibGVGb250
OwotICAgICAgICBOU0ZvbnQgKm5hbWVNYXRjaGVkRm9udCA9IG5pbDsKLSAgICAgICAgTlNGb250
VHJhaXRNYXNrIGRlc2lyZWRUcmFpdHNGb3JOYW1lTWF0Y2ggPSBkZXNpcmVkVHJhaXRzIHwgKGRl
c2lyZWRXZWlnaHQgPj0gNyA/IE5TQm9sZEZvbnRNYXNrIDogMCk7Ci0gICAgICAgIHdoaWxlICgo
YXZhaWxhYmxlRm9udCA9IFthdmFpbGFibGVGb250cyBuZXh0T2JqZWN0XSkpIHsKLSAgICAgICAg
ICAgIGlmIChbZGVzaXJlZEZhbWlseSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOmF2YWlsYWJsZUZv
bnRdID09IE5TT3JkZXJlZFNhbWUpIHsKLSAgICAgICAgICAgICAgICBuYW1lTWF0Y2hlZEZvbnQg
PSBbTlNGb250IGZvbnRXaXRoTmFtZTphdmFpbGFibGVGb250IHNpemU6c2l6ZV07Ci0KLSAgICAg
ICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgT3Nha2EtTW9uby4gIEFjY29yZGluZyB0byA8cmRh
cjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIG5lZWQgdG8gCi0gICAgICAgICAgICAgICAgLy8gdHJl
YXQgT3Nha2EtTW9ubyBhcyBmaXhlZCBwaXRjaC4KLSAgICAgICAgICAgICAgICBpZiAoW2Rlc2ly
ZWRGYW1pbHkgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1vbm8iXSA9PSBOU09yZGVy
ZWRTYW1lICYmIGRlc2lyZWRUcmFpdHNGb3JOYW1lTWF0Y2ggPT0gMCkKLSAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIG5hbWVNYXRjaGVkRm9udDsKLQotICAgICAgICAgICAgICAgIE5TRm9udFRy
YWl0TWFzayB0cmFpdHMgPSBbZm9udE1hbmFnZXIgdHJhaXRzT2ZGb250Om5hbWVNYXRjaGVkRm9u
dF07Ci0gICAgICAgICAgICAgICAgaWYgKCh0cmFpdHMgJiBkZXNpcmVkVHJhaXRzRm9yTmFtZU1h
dGNoKSA9PSBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoKQotICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gW2ZvbnRNYW5hZ2VyIGNvbnZlcnRGb250Om5hbWVNYXRjaGVkRm9udCB0b0hhdmVUcmFp
dDpkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoXTsKLQotICAgICAgICAgICAgICAgIGF2YWlsYWJs
ZUZhbWlseSA9IFtuYW1lTWF0Y2hlZEZvbnQgZmFtaWx5TmFtZV07CisgICAgTlNTdHJpbmcgKmF2
YWlsYWJsZUZhbWlseSA9IFtkZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlEaWN0aW9uYXJ5
KCkgb2JqZWN0Rm9yS2V5OmRlc2lyZWRGYW1pbHldOworICAgIGlmIChhdmFpbGFibGVGYW1pbHkp
IHsKKyAgICAgICAgaWYgKCFbYXZhaWxhYmxlRmFtaWx5IGxlbmd0aF0pIHsKKyAgICAgICAgICAg
IC8vIEFscmVhZHkgdHJpZWQgbWFwcGluZyB0aGUgZGVzaXJlZCBmb250IHRvIGFuIGF2YWlsYWJs
ZSBvbmUgaW4gdGhlIHBhc3QgYW5kIGZhaWxlZCwgc28KKyAgICAgICAgICAgIC8vIGRvbid0IHRy
eSBhZ2Fpbi4KKyAgICAgICAgICAgIHJldHVybiBuaWw7CisgICAgICAgIH0KKyAgICB9IGVsc2Ug
eworICAgICAgICAvLyBEbyBhIHNpbXBsZSBjYXNlIGluc2Vuc2l0aXZlIHNlYXJjaCBmb3IgYSBt
YXRjaGluZyBmb250IGZhbWlseS4KKyAgICAgICAgLy8gTlNGb250TWFuYWdlciByZXF1aXJlcyBl
eGFjdCBuYW1lIG1hdGNoZXMuCisgICAgICAgIC8vIFRoaXMgYWRkcmVzc2VzIHRoZSBwcm9ibGVt
IG9mIG1hdGNoaW5nIGFyaWFsIHRvIEFyaWFsLCBldGMuLCBidXQgcGVyaGFwcyBub3QgYWxsIHRo
ZSBpc3N1ZXMuCisgICAgICAgIE5TRW51bWVyYXRvciAqZSA9IFtbZm9udE1hbmFnZXIgYXZhaWxh
YmxlRm9udEZhbWlsaWVzXSBvYmplY3RFbnVtZXJhdG9yXTsKKyAgICAgICAgd2hpbGUgKChhdmFp
bGFibGVGYW1pbHkgPSBbZSBuZXh0T2JqZWN0XSkpIHsKKyAgICAgICAgICAgIGlmIChbZGVzaXJl
ZEZhbWlseSBjYXNlSW5zZW5zaXRpdmVDb21wYXJlOmF2YWlsYWJsZUZhbWlseV0gPT0gTlNPcmRl
cmVkU2FtZSkKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlm
ICghYXZhaWxhYmxlRmFtaWx5KSB7CisgICAgICAgICAgICAvLyBNYXRjaCBieSBQb3N0U2NyaXB0
IG5hbWUuCisgICAgICAgICAgICBOU0VudW1lcmF0b3IgKmF2YWlsYWJsZUZvbnRzID0gW1tmb250
TWFuYWdlciBhdmFpbGFibGVGb250c10gb2JqZWN0RW51bWVyYXRvcl07CisgICAgICAgICAgICBO
U1N0cmluZyAqYXZhaWxhYmxlRm9udDsKKyAgICAgICAgICAgIE5TRm9udCAqbmFtZU1hdGNoZWRG
b250ID0gbmlsOworICAgICAgICAgICAgTlNGb250VHJhaXRNYXNrIGRlc2lyZWRUcmFpdHNGb3JO
YW1lTWF0Y2ggPSBkZXNpcmVkVHJhaXRzIHwgKGRlc2lyZWRXZWlnaHQgPj0gNyA/IE5TQm9sZEZv
bnRNYXNrIDogMCk7CisgICAgICAgICAgICB3aGlsZSAoKGF2YWlsYWJsZUZvbnQgPSBbYXZhaWxh
YmxlRm9udHMgbmV4dE9iamVjdF0pKSB7CisgICAgICAgICAgICAgICAgaWYgKFtkZXNpcmVkRmFt
aWx5IGNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU6YXZhaWxhYmxlRm9udF0gPT0gTlNPcmRlcmVkU2Ft
ZSkgeworICAgICAgICAgICAgICAgICAgICBuYW1lTWF0Y2hlZEZvbnQgPSBbTlNGb250IGZvbnRX
aXRoTmFtZTphdmFpbGFibGVGb250IHNpemU6c2l6ZV07CisKKyAgICAgICAgICAgICAgICAgICAg
Ly8gU3BlY2lhbCBjYXNlIE9zYWthLU1vbm8uIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0v
Mzk5OTQ2Nz4sIHdlIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgT3Nha2Et
TW9ubyBhcyBmaXhlZCBwaXRjaC4KKyAgICAgICAgICAgICAgICAgICAgaWYgKFtkZXNpcmVkRmFt
aWx5IGNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU6QCJPc2FrYS1Nb25vIl0gPT0gTlNPcmRlcmVkU2Ft
ZSAmJiAhZGVzaXJlZFRyYWl0c0Zvck5hbWVNYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAg
IHJldHVybiBuYW1lTWF0Y2hlZEZvbnQ7CisKKyAgICAgICAgICAgICAgICAgICAgTlNGb250VHJh
aXRNYXNrIHRyYWl0cyA9IFtmb250TWFuYWdlciB0cmFpdHNPZkZvbnQ6bmFtZU1hdGNoZWRGb250
XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0cmFpdHMgJiBkZXNpcmVkVHJhaXRzRm9yTmFt
ZU1hdGNoKSA9PSBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoKQorICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIFtmb250TWFuYWdlciBjb252ZXJ0Rm9udDpuYW1lTWF0Y2hlZEZvbnQgdG9I
YXZlVHJhaXQ6ZGVzaXJlZFRyYWl0c0Zvck5hbWVNYXRjaF07CisKKyAgICAgICAgICAgICAgICAg
ICAgYXZhaWxhYmxlRmFtaWx5ID0gW25hbWVNYXRjaGVkRm9udCBmYW1pbHlOYW1lXTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQog
ICAgICAgICB9CisKKyAgICAgICAgcmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1p
bHlNYXBwaW5nKGRlc2lyZWRGYW1pbHksIGF2YWlsYWJsZUZhbWlseSk7CisgICAgICAgIGlmICgh
YXZhaWxhYmxlRmFtaWx5KQorICAgICAgICAgICAgcmV0dXJuIG5pbDsKICAgICB9CiAKICAgICAv
LyBGb3VuZCBhIGZhbWlseSwgbm93IGZpZ3VyZSBvdXQgd2hhdCB3ZWlnaHQgYW5kIHRyYWl0cyB0
byB1c2UuCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>239513</attachid>
            <date>2014-10-08 20:34:33 -0700</date>
            <delta_ts>2014-10-09 10:53:22 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-137539-20141008203435.patch</filename>
            <type>text/plain</type>
            <size>10746</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTc0NDk0CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNTQ4YjlkOGM2YThjY2Q1
OTUyYmI3YTlmMmQzMjYwYjlhZTZlMzQzNC4uZjY2YTQ3N2RmMWFiOWQwMDAwMzk5YjAwMWE2MjFm
NDg2OWU5ZmNmMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ1IEBACisyMDE0LTEwLTA4ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgW01hY10gU3BlbmRpbmcgdG9v
IG11Y2ggdGltZSBtYXBwaW5nIGRlc2lyZWQgZm9udCBmYW1pbGllcyB0byBhdmFpbGFibGUgb25l
cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3NTM5
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgV2hpbGUg
cHJvZmlsaW5nIHRoZSBsb2FkIG9mIHdlYXRoZXIuY29tLCBJIG5vdGljZWQgdGhhdCB3ZSBhcmUg
c3BlbmRpbmcKKyAgICAgICAgcXVpdGUgYSBiaXQgb2YgdGltZSB0cnlpbmcgdG8gbWFwIHRoZSBm
b250IGZhbWlseSByZXF1ZXN0ZWQgdG8gYSBmb250CisgICAgICAgIHRoYXQgaXMgYXZhaWxhYmxl
IG9uIHRoZSBzeXN0ZW0uIFRoZSBwcm9jZXNzIGludm9sdmVzOgorICAgICAgICAxLiBEb2luZyBh
IGxpbmVhciBzZWFyY2ggb2YgYWxsIHRoZSBpbnN0YWxsZWQgZm9udCBmYW1pbGllcyBhbmQgZG8g
YQorICAgICAgICAgICBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uIGZvciBlYWNo
IG9mIHRoZW0gdW50aWwgd2UgZmluZCBhCisgICAgICAgICAgIG1hdGNoLAorICAgICAgICAyLiBU
aGVuLCBpZiB3ZSBkb24ndCBmaW5kIGEgbWF0Y2gsIGRvIGFub3RoZXIgbGluZWFyIHNlYXJjaCBv
ZiB0aGUKKyAgICAgICAgICAgZm9udHMnIHBvc3RzY3JpcHQgbmFtZXMgdGhpcyB0aW1lIGFuZCBk
byBhZ2FpbiBhIGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24g
Zm9yIGVhY2ggb2YgdGhlbS4KKworICAgICAgICBUaGlzIHByb2Nlc3MgaXMgY29zdGx5IGFuZCB0
aGUgZm9udHMgcmVxdWVzdGVkIGJ5IHdlYXRoZXIuY29tIGFyZSBub3QKKyAgICAgICAgYXZhaWxh
YmxlLCBjYXVzaW5nIHVzIHRvIGRvIDIgbGluZWFyIHNlYXJjaGVzIGFuZCBhIGxvdCBvZiBzdHJp
bmcKKyAgICAgICAgY29tcGFyaXNvbnMgKGFjY291bnRpbmcgZm9yIH4yJSBvZiB0aGUgV2ViUHJv
Y2VzcyBDUFUgdGltZSBmb3IgdGhlIHBhZ2UKKyAgICAgICAgbG9hZCkuIEFzIGEgcmVzdWx0LCB3
ZSBlbmQgdXAgc3BlbmRpbmcgfjkwbXMgaW4KKyAgICAgICAgaW50ZXJuYWxGb250V2l0aEZhbWls
eSgpIHdoZW4gbG9hZGluZyB3ZWF0aGVyLmNvbS4KKworICAgICAgICBUaGlzIHBhdGNoIGludHJv
ZHVjZXMgYSBjYWNoZSBmb3IgdGhlIG1hcHBpbmcgYmV0d2VlbiBkZXNpcmVkIGZvbnQKKyAgICAg
ICAgZmFtaWxpZXMgYW5kIGF2YWlsYWJsZSBmb250IGZhbWlsaWVzLiBUaGlzIGN1dHMgdGhlIHRp
bWUgc3BlbnQgaW4KKyAgICAgICAgaW50ZXJuYWxGb250V2l0aEZhbWlseSgpIGluIGhhbGYgKH40
NW1zKS4gVGhlIGNhY2hlIGdldHMgaW52YWxpZGF0ZWQKKyAgICAgICAgd2hlbiBmb250cyBhcmUg
aW5zdGFsbGVkIC8gdW5pbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBzbyB3ZSBkb24ndCBicmVhawor
ICAgICAgICB0aGF0IHNjZW5hcmlvLiBUaGUgY2FjaGUgaXMgYWxzbyBsaW1pdGVkIGluIHNpemUg
dG8gYXZvaWQgdXNpbmcgdG9vCisgICAgICAgIG11Y2ggbWVtb3J5LgorCisgICAgICAgIE5vIG5l
dyB0ZXN0cywgYnV0IG1hbnVhbCB0ZXN0aW5nIG1ha2luZyBzdXJlIHRoZSBjYWNoZSBnZXRzIGlu
dmFsaWRhdGVkCisgICAgICAgIHdoZW4gaW5zdGFsbGluZyBhIGZvbnQgb24gdGhlIHN5c3RlbS4K
KworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVNYWMubW06CisgICAg
ICAgIChXZWJDb3JlOjppbnZhbGlkYXRlRm9udENhY2hlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9t
YWMvV2ViRm9udENhY2hlLmg6CisgICAgICAgICogcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5t
bToKKyAgICAgICAgKGRlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURpY3Rpb25hcnkpOgor
ICAgICAgICAocmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlNYXBwaW5nKToK
KyAgICAgICAgKCtbV2ViRm9udENhY2hlIGludGVybmFsRm9udFdpdGhGYW1pbHk6dHJhaXRzOndl
aWdodDpzaXplOl0pOgorICAgICAgICAoK1tXZWJGb250Q2FjaGUgaW52YWxpZGF0ZV0pOgorCiAy
MDE0LTEwLTA4ICBNeWxlcyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CiAKICAg
ICAgICAgVW5yZXZpZXdlZCBidWlsZCBmaXggYWZ0ZXIgcjE3NDQ4MC4gQnJva2UgaU9TIGJ1aWxk
LgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRD
YWNoZU1hYy5tbSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2Fj
aGVNYWMubW0KaW5kZXggM2I4ZDY1NDAzNjk3YTJiNDUwYjRiMTBiNGE5OTc0ODkwMDBlOGE4MS4u
YTg3N2YyNjM0NjQ1ZGNiNzk5NjYxYzEyMTFkN2MxZjRjMWMyMDA3MyAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRDYWNoZU1hYy5tbQorKysgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9tYWMvRm9udENhY2hlTWFjLm1tCkBAIC01
NCw2ICs1NCw3IEBAIHN0YXRpYyB2b2lkIGludmFsaWRhdGVGb250Q2FjaGUodm9pZCopCiAgICAg
ICAgIHJldHVybjsKICAgICB9CiAgICAgZm9udENhY2hlKCkuaW52YWxpZGF0ZSgpOworICAgIFtX
ZWJGb250Q2FjaGUgaW52YWxpZGF0ZV07CiB9CiAKIHN0YXRpYyB2b2lkIGZvbnRDYWNoZVJlZ2lz
dGVyZWRGb250c0NoYW5nZWROb3RpZmljYXRpb25DYWxsYmFjayhDRk5vdGlmaWNhdGlvbkNlbnRl
clJlZiwgdm9pZCogb2JzZXJ2ZXIsIENGU3RyaW5nUmVmIG5hbWUsIGNvbnN0IHZvaWQgKiwgQ0ZE
aWN0aW9uYXJ5UmVmKQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dl
YkZvbnRDYWNoZS5oIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5o
CmluZGV4IDUzNWU2NGExZDAxODQ0YjBjNjdjMDlkNjMxMmJjMTU0MzVhZjUxNGMuLjRjMjAxODRj
ZmM2ZDY5OGY3OGZjYTM5ZGQ1ZDE0MDEzZmVjZWYxNWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJD
b3JlL3BsYXRmb3JtL21hYy9XZWJGb250Q2FjaGUuaAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9tYWMvV2ViRm9udENhY2hlLmgKQEAgLTMyLDYgKzMyLDcgQEAgV0VCQ09SRV9FWFBPUlQg
QGludGVyZmFjZSBXZWJGb250Q2FjaGUgOiBOU09iamVjdAogKyAoTlNGb250ICopZm9udFdpdGhG
YW1pbHk6KE5TU3RyaW5nICopZGVzaXJlZEZhbWlseSB0cmFpdHM6KE5TRm9udFRyYWl0TWFzaylk
ZXNpcmVkVHJhaXRzIHdlaWdodDooaW50KWRlc2lyZWRXZWlnaHQgc2l6ZTooZmxvYXQpc2l6ZSBz
aG91bGRBdXRvQWN0aXZhdGVJZk5lZWRlZDooQk9PTClzaG91bGRBdXRvQWN0aXZhdGVJZk5lZWRl
ZDsKICsgKE5TRm9udCAqKWZvbnRXaXRoRmFtaWx5OihOU1N0cmluZyAqKWRlc2lyZWRGYW1pbHkg
dHJhaXRzOihOU0ZvbnRUcmFpdE1hc2spZGVzaXJlZFRyYWl0cyB3ZWlnaHQ6KGludClkZXNpcmVk
V2VpZ2h0IHNpemU6KGZsb2F0KXNpemU7CiArICh2b2lkKWdldFRyYWl0czooVmVjdG9yPHVuc2ln
bmVkPiYpdHJhaXRzTWFza3MgaW5GYW1pbHk6KE5TU3RyaW5nICopZGVzaXJlZEZhbWlseTsKKysg
KHZvaWQpaW52YWxpZGF0ZTsKIAogLy8gVGhpcyBvbGRlciB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZh
Y2UgaXMgcmVsaWVkIHVwb24gYnkgc29tZSBjbGllbnRzLiBXZWJDb3JlIGRvZXNuJ3QgdXNlIGl0
LgogKyAoTlNGb250ICopZm9udFdpdGhGYW1pbHk6KE5TU3RyaW5nICopZGVzaXJlZEZhbWlseSB0
cmFpdHM6KE5TRm9udFRyYWl0TWFzaylkZXNpcmVkVHJhaXRzIHNpemU6KGZsb2F0KXNpemU7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViRm9udENhY2hlLm1tIGIv
U291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5tbQppbmRleCA1OGE1ZjI0
YTM0N2E2ODNjM2Q3Zjk3NmZmMDllZjk5NTJkMzY0OGE5Li4xYmY2NTE1OTI2OTQ1ZWJkZmU3ZmMw
OWY4NzU5MGQ4YzZmMjIyOGUxIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9t
YWMvV2ViRm9udENhY2hlLm1tCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJG
b250Q2FjaGUubW0KQEAgLTM1LDYgKzM1LDcgQEAKICNpbXBvcnQgPEFwcEtpdC9BcHBLaXQuaD4K
ICNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgogI2ltcG9ydCA8bWF0aC5oPgorI2lt
cG9ydCA8d3RmL01haW5UaHJlYWQuaD4KIAogdXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CiAKQEAg
LTExNSw2ICsxMTYsMjkgQEAgc3RhdGljIGlubGluZSBGb250VHJhaXRzTWFzayB0b1RyYWl0c01h
c2soTlNGb250VHJhaXRNYXNrIGFwcEtpdFRyYWl0cywgTlNJbnRlZ2UKICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgRm9udFdlaWdodDkwME1hc2spKTsKIH0KIAorLy8gS2VlcCBh
IGNhY2hlIGZvciBtYXBwaW5nIGRlc2lyZWQgZm9udCBmYW1pbGllcyB0byBmb250IGZhbWlsaWVz
IGFjdHVhbGx5CisvLyBhdmFpbGFibGUgb24gdGhlIHN5c3RlbSBmb3IgcGVyZm9ybWFuY2UuCitz
dGF0aWMgTlNNdXRhYmxlRGljdGlvbmFyeSogZGVzaXJlZEZhbWlseVRvQXZhaWxhYmxlRmFtaWx5
RGljdGlvbmFyeSgpCit7CisgICAgQVNTRVJUKGlzTWFpblRocmVhZCgpKTsKKyAgICBzdGF0aWMg
TlNNdXRhYmxlRGljdGlvbmFyeSAqZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBh
bGxvY10gaW5pdF07CisgICAgcmV0dXJuIGRpY3Rpb25hcnk7Cit9CisKK3N0YXRpYyBpbmxpbmUg
dm9pZCByZW1lbWJlckRlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseU1hcHBpbmcoTlNTdHJp
bmcqIGRlc2lyZWRGYW1pbHksIE5TU3RyaW5nKiBhdmFpbGFibGVGYW1pbHkpCit7CisgICAgc3Rh
dGljIGNvbnN0IE5TVUludGVnZXIgbWF4Q2FjaGVTaXplID0gMTI4OworICAgIEFTU0VSVChbZGVz
aXJlZEZhbWlseVRvQXZhaWxhYmxlRmFtaWx5RGljdGlvbmFyeSgpIGNvdW50XSA8PSBtYXhDYWNo
ZVNpemUpOworICAgIGlmIChbZGVzaXJlZEZhbWlseVRvQXZhaWxhYmxlRmFtaWx5RGljdGlvbmFy
eSgpIGNvdW50XSA9PSBtYXhDYWNoZVNpemUpIHsKKyAgICAgICAgTlNFbnVtZXJhdG9yICprZXlF
bnVtZXJhdG9yID0gW2Rlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURpY3Rpb25hcnkoKSBr
ZXlFbnVtZXJhdG9yXTsKKyAgICAgICAgW2Rlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURp
Y3Rpb25hcnkoKSByZW1vdmVPYmplY3RGb3JLZXk6IFtrZXlFbnVtZXJhdG9yIG5leHRPYmplY3Rd
XTsKKyAgICB9CisgICAgaWYgKGF2YWlsYWJsZUZhbWlseSkKKyAgICAgICAgW2Rlc2lyZWRGYW1p
bHlUb0F2YWlsYWJsZUZhbWlseURpY3Rpb25hcnkoKSBzZXRPYmplY3Q6YXZhaWxhYmxlRmFtaWx5
IGZvcktleTpkZXNpcmVkRmFtaWx5XTsKKyAgICBlbHNlCisgICAgICAgIFtkZXNpcmVkRmFtaWx5
VG9BdmFpbGFibGVGYW1pbHlEaWN0aW9uYXJ5KCkgc2V0T2JqZWN0OkAiIiBmb3JLZXk6ZGVzaXJl
ZEZhbWlseV07Cit9CisKIEBpbXBsZW1lbnRhdGlvbiBXZWJGb250Q2FjaGUKIAogKyAodm9pZCln
ZXRUcmFpdHM6KFZlY3Rvcjx1bnNpZ25lZD4mKXRyYWl0c01hc2tzIGluRmFtaWx5OihOU1N0cmlu
ZyAqKWRlc2lyZWRGYW1pbHkKQEAgLTE2OSwzOSArMTkzLDUxIEBAICsgKE5TRm9udCAqKWludGVy
bmFsRm9udFdpdGhGYW1pbHk6KE5TU3RyaW5nICopZGVzaXJlZEZhbWlseSB0cmFpdHM6KE5TRm9u
dFRyYWl0CiAKICAgICBOU0ZvbnRNYW5hZ2VyICpmb250TWFuYWdlciA9IFtOU0ZvbnRNYW5hZ2Vy
IHNoYXJlZEZvbnRNYW5hZ2VyXTsKIAotICAgIC8vIERvIGEgc2ltcGxlIGNhc2UgaW5zZW5zaXRp
dmUgc2VhcmNoIGZvciBhIG1hdGNoaW5nIGZvbnQgZmFtaWx5LgotICAgIC8vIE5TRm9udE1hbmFn
ZXIgcmVxdWlyZXMgZXhhY3QgbmFtZSBtYXRjaGVzLgotICAgIC8vIFRoaXMgYWRkcmVzc2VzIHRo
ZSBwcm9ibGVtIG9mIG1hdGNoaW5nIGFyaWFsIHRvIEFyaWFsLCBldGMuLCBidXQgcGVyaGFwcyBu
b3QgYWxsIHRoZSBpc3N1ZXMuCi0gICAgTlNFbnVtZXJhdG9yICplID0gW1tmb250TWFuYWdlciBh
dmFpbGFibGVGb250RmFtaWxpZXNdIG9iamVjdEVudW1lcmF0b3JdOwotICAgIE5TU3RyaW5nICph
dmFpbGFibGVGYW1pbHk7Ci0gICAgd2hpbGUgKChhdmFpbGFibGVGYW1pbHkgPSBbZSBuZXh0T2Jq
ZWN0XSkpIHsKLSAgICAgICAgaWYgKFtkZXNpcmVkRmFtaWx5IGNhc2VJbnNlbnNpdGl2ZUNvbXBh
cmU6YXZhaWxhYmxlRmFtaWx5XSA9PSBOU09yZGVyZWRTYW1lKQotICAgICAgICAgICAgYnJlYWs7
Ci0gICAgfQotCi0gICAgaWYgKCFhdmFpbGFibGVGYW1pbHkpIHsKLSAgICAgICAgLy8gTWF0Y2gg
YnkgUG9zdFNjcmlwdCBuYW1lLgotICAgICAgICBOU0VudW1lcmF0b3IgKmF2YWlsYWJsZUZvbnRz
ID0gW1tmb250TWFuYWdlciBhdmFpbGFibGVGb250c10gb2JqZWN0RW51bWVyYXRvcl07Ci0gICAg
ICAgIE5TU3RyaW5nICphdmFpbGFibGVGb250OwotICAgICAgICBOU0ZvbnQgKm5hbWVNYXRjaGVk
Rm9udCA9IG5pbDsKLSAgICAgICAgTlNGb250VHJhaXRNYXNrIGRlc2lyZWRUcmFpdHNGb3JOYW1l
TWF0Y2ggPSBkZXNpcmVkVHJhaXRzIHwgKGRlc2lyZWRXZWlnaHQgPj0gNyA/IE5TQm9sZEZvbnRN
YXNrIDogMCk7Ci0gICAgICAgIHdoaWxlICgoYXZhaWxhYmxlRm9udCA9IFthdmFpbGFibGVGb250
cyBuZXh0T2JqZWN0XSkpIHsKLSAgICAgICAgICAgIGlmIChbZGVzaXJlZEZhbWlseSBjYXNlSW5z
ZW5zaXRpdmVDb21wYXJlOmF2YWlsYWJsZUZvbnRdID09IE5TT3JkZXJlZFNhbWUpIHsKLSAgICAg
ICAgICAgICAgICBuYW1lTWF0Y2hlZEZvbnQgPSBbTlNGb250IGZvbnRXaXRoTmFtZTphdmFpbGFi
bGVGb250IHNpemU6c2l6ZV07Ci0KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgT3Nh
a2EtTW9uby4gIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIG5lZWQg
dG8gCi0gICAgICAgICAgICAgICAgLy8gdHJlYXQgT3Nha2EtTW9ubyBhcyBmaXhlZCBwaXRjaC4K
LSAgICAgICAgICAgICAgICBpZiAoW2Rlc2lyZWRGYW1pbHkgY2FzZUluc2Vuc2l0aXZlQ29tcGFy
ZTpAIk9zYWthLU1vbm8iXSA9PSBOU09yZGVyZWRTYW1lICYmIGRlc2lyZWRUcmFpdHNGb3JOYW1l
TWF0Y2ggPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXRjaGVkRm9udDsK
LQotICAgICAgICAgICAgICAgIE5TRm9udFRyYWl0TWFzayB0cmFpdHMgPSBbZm9udE1hbmFnZXIg
dHJhaXRzT2ZGb250Om5hbWVNYXRjaGVkRm9udF07Ci0gICAgICAgICAgICAgICAgaWYgKCh0cmFp
dHMgJiBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoKSA9PSBkZXNpcmVkVHJhaXRzRm9yTmFtZU1h
dGNoKQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gW2ZvbnRNYW5hZ2VyIGNvbnZlcnRGb250
Om5hbWVNYXRjaGVkRm9udCB0b0hhdmVUcmFpdDpkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoXTsK
LQotICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZhbWlseSA9IFtuYW1lTWF0Y2hlZEZvbnQgZmFt
aWx5TmFtZV07CisgICAgTlNTdHJpbmcgKmF2YWlsYWJsZUZhbWlseSA9IFtkZXNpcmVkRmFtaWx5
VG9BdmFpbGFibGVGYW1pbHlEaWN0aW9uYXJ5KCkgb2JqZWN0Rm9yS2V5OmRlc2lyZWRGYW1pbHld
OworICAgIGlmIChhdmFpbGFibGVGYW1pbHkpIHsKKyAgICAgICAgaWYgKCFbYXZhaWxhYmxlRmFt
aWx5IGxlbmd0aF0pIHsKKyAgICAgICAgICAgIC8vIEFscmVhZHkgdHJpZWQgbWFwcGluZyB0aGUg
ZGVzaXJlZCBmb250IHRvIGFuIGF2YWlsYWJsZSBvbmUgaW4gdGhlIHBhc3QgYW5kIGZhaWxlZCwg
c28KKyAgICAgICAgICAgIC8vIGRvbid0IHRyeSBhZ2Fpbi4KKyAgICAgICAgICAgIHJldHVybiBu
aWw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBEbyBhIHNpbXBsZSBjYXNl
IGluc2Vuc2l0aXZlIHNlYXJjaCBmb3IgYSBtYXRjaGluZyBmb250IGZhbWlseS4KKyAgICAgICAg
Ly8gTlNGb250TWFuYWdlciByZXF1aXJlcyBleGFjdCBuYW1lIG1hdGNoZXMuCisgICAgICAgIC8v
IFRoaXMgYWRkcmVzc2VzIHRoZSBwcm9ibGVtIG9mIG1hdGNoaW5nIGFyaWFsIHRvIEFyaWFsLCBl
dGMuLCBidXQgcGVyaGFwcyBub3QgYWxsIHRoZSBpc3N1ZXMuCisgICAgICAgIE5TRW51bWVyYXRv
ciAqZSA9IFtbZm9udE1hbmFnZXIgYXZhaWxhYmxlRm9udEZhbWlsaWVzXSBvYmplY3RFbnVtZXJh
dG9yXTsKKyAgICAgICAgd2hpbGUgKChhdmFpbGFibGVGYW1pbHkgPSBbZSBuZXh0T2JqZWN0XSkp
IHsKKyAgICAgICAgICAgIGlmIChbZGVzaXJlZEZhbWlseSBjYXNlSW5zZW5zaXRpdmVDb21wYXJl
OmF2YWlsYWJsZUZhbWlseV0gPT0gTlNPcmRlcmVkU2FtZSkKICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYXZhaWxhYmxlRmFtaWx5KSB7CisgICAgICAg
ICAgICAvLyBNYXRjaCBieSBQb3N0U2NyaXB0IG5hbWUuCisgICAgICAgICAgICBOU0VudW1lcmF0
b3IgKmF2YWlsYWJsZUZvbnRzID0gW1tmb250TWFuYWdlciBhdmFpbGFibGVGb250c10gb2JqZWN0
RW51bWVyYXRvcl07CisgICAgICAgICAgICBOU1N0cmluZyAqYXZhaWxhYmxlRm9udDsKKyAgICAg
ICAgICAgIE5TRm9udCAqbmFtZU1hdGNoZWRGb250ID0gbmlsOworICAgICAgICAgICAgTlNGb250
VHJhaXRNYXNrIGRlc2lyZWRUcmFpdHNGb3JOYW1lTWF0Y2ggPSBkZXNpcmVkVHJhaXRzIHwgKGRl
c2lyZWRXZWlnaHQgPj0gNyA/IE5TQm9sZEZvbnRNYXNrIDogMCk7CisgICAgICAgICAgICB3aGls
ZSAoKGF2YWlsYWJsZUZvbnQgPSBbYXZhaWxhYmxlRm9udHMgbmV4dE9iamVjdF0pKSB7CisgICAg
ICAgICAgICAgICAgaWYgKFtkZXNpcmVkRmFtaWx5IGNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU6YXZh
aWxhYmxlRm9udF0gPT0gTlNPcmRlcmVkU2FtZSkgeworICAgICAgICAgICAgICAgICAgICBuYW1l
TWF0Y2hlZEZvbnQgPSBbTlNGb250IGZvbnRXaXRoTmFtZTphdmFpbGFibGVGb250IHNpemU6c2l6
ZV07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIE9zYWthLU1vbm8uIEFj
Y29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIG5lZWQgdG8KKyAgICAgICAg
ICAgICAgICAgICAgLy8gdHJlYXQgT3Nha2EtTW9ubyBhcyBmaXhlZCBwaXRjaC4KKyAgICAgICAg
ICAgICAgICAgICAgaWYgKFtkZXNpcmVkRmFtaWx5IGNhc2VJbnNlbnNpdGl2ZUNvbXBhcmU6QCJP
c2FrYS1Nb25vIl0gPT0gTlNPcmRlcmVkU2FtZSAmJiAhZGVzaXJlZFRyYWl0c0Zvck5hbWVNYXRj
aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lTWF0Y2hlZEZvbnQ7CisKKyAg
ICAgICAgICAgICAgICAgICAgTlNGb250VHJhaXRNYXNrIHRyYWl0cyA9IFtmb250TWFuYWdlciB0
cmFpdHNPZkZvbnQ6bmFtZU1hdGNoZWRGb250XTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh0
cmFpdHMgJiBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoKSA9PSBkZXNpcmVkVHJhaXRzRm9yTmFt
ZU1hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtmb250TWFuYWdlciBjb252
ZXJ0Rm9udDpuYW1lTWF0Y2hlZEZvbnQgdG9IYXZlVHJhaXQ6ZGVzaXJlZFRyYWl0c0Zvck5hbWVN
YXRjaF07CisKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRmFtaWx5ID0gW25hbWVNYXRj
aGVkRm9udCBmYW1pbHlOYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgcmVtZW1iZXJE
ZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlNYXBwaW5nKGRlc2lyZWRGYW1pbHksIGF2YWls
YWJsZUZhbWlseSk7CisgICAgICAgIGlmICghYXZhaWxhYmxlRmFtaWx5KQorICAgICAgICAgICAg
cmV0dXJuIG5pbDsKICAgICB9CiAKICAgICAvLyBGb3VuZCBhIGZhbWlseSwgbm93IGZpZ3VyZSBv
dXQgd2hhdCB3ZWlnaHQgYW5kIHRyYWl0cyB0byB1c2UuCkBAIC0zMDAsNCArMzM2LDggQEAgKyAo
TlNGb250ICopZm9udFdpdGhGYW1pbHk6KE5TU3RyaW5nICopZGVzaXJlZEZhbWlseSB0cmFpdHM6
KE5TRm9udFRyYWl0TWFzaylkZXMKICAgICByZXR1cm4gW3NlbGYgZm9udFdpdGhGYW1pbHk6ZGVz
aXJlZEZhbWlseSB0cmFpdHM6ZGVzaXJlZFRyYWl0cyB3ZWlnaHQ6ZGVzaXJlZFdlaWdodCBzaXpl
OnNpemUgc2hvdWxkQXV0b0FjdGl2YXRlSWZOZWVkZWQ6WUVTXTsKIH0KIAorKyAodm9pZClpbnZh
bGlkYXRlCit7CisgICAgW2Rlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURpY3Rpb25hcnko
KSByZW1vdmVBbGxPYmplY3RzXTsKK30KIEBlbmQK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>239550</attachid>
            <date>2014-10-09 10:51:04 -0700</date>
            <delta_ts>2014-10-09 10:55:13 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-137539-20141009105107.patch</filename>
            <type>text/plain</type>
            <size>10983</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTc0NTA1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjJlNDczZDViZjJkYWZi
MTc2NmJkMDFlZmFiZWRjZWZjYWIwYTBlZS4uMmIwNDIwYTFhZjVhMzcwNGM4ZDMwOThhMmU4YzU3
NjVjNjQ1NWYxZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ1IEBACisyMDE0LTEwLTA5ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgW01hY10gU3BlbmRpbmcgdG9v
IG11Y2ggdGltZSBtYXBwaW5nIGRlc2lyZWQgZm9udCBmYW1pbGllcyB0byBhdmFpbGFibGUgb25l
cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3NTM5
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCisKKyAgICAgICAgV2hpbGUgcHJv
ZmlsaW5nIHRoZSBsb2FkIG9mIHdlYXRoZXIuY29tLCBJIG5vdGljZWQgdGhhdCB3ZSBhcmUgc3Bl
bmRpbmcKKyAgICAgICAgcXVpdGUgYSBiaXQgb2YgdGltZSB0cnlpbmcgdG8gbWFwIHRoZSBmb250
IGZhbWlseSByZXF1ZXN0ZWQgdG8gYSBmb250CisgICAgICAgIHRoYXQgaXMgYXZhaWxhYmxlIG9u
IHRoZSBzeXN0ZW0uIFRoZSBwcm9jZXNzIGludm9sdmVzOgorICAgICAgICAxLiBEb2luZyBhIGxp
bmVhciBzZWFyY2ggb2YgYWxsIHRoZSBpbnN0YWxsZWQgZm9udCBmYW1pbGllcyBhbmQgZG8gYQor
ICAgICAgICAgICBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uIGZvciBlYWNoIG9m
IHRoZW0gdW50aWwgd2UgZmluZCBhCisgICAgICAgICAgIG1hdGNoLAorICAgICAgICAyLiBUaGVu
LCBpZiB3ZSBkb24ndCBmaW5kIGEgbWF0Y2gsIGRvIGFub3RoZXIgbGluZWFyIHNlYXJjaCBvZiB0
aGUKKyAgICAgICAgICAgZm9udHMnIHBvc3RzY3JpcHQgbmFtZXMgdGhpcyB0aW1lIGFuZCBkbyBh
Z2FpbiBhIGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24gZm9y
IGVhY2ggb2YgdGhlbS4KKworICAgICAgICBUaGlzIHByb2Nlc3MgaXMgY29zdGx5IGFuZCB0aGUg
Zm9udHMgcmVxdWVzdGVkIGJ5IHdlYXRoZXIuY29tIGFyZSBub3QKKyAgICAgICAgYXZhaWxhYmxl
LCBjYXVzaW5nIHVzIHRvIGRvIDIgbGluZWFyIHNlYXJjaGVzIGFuZCBhIGxvdCBvZiBzdHJpbmcK
KyAgICAgICAgY29tcGFyaXNvbnMgKGFjY291bnRpbmcgZm9yIH4yJSBvZiB0aGUgV2ViUHJvY2Vz
cyBDUFUgdGltZSBmb3IgdGhlIHBhZ2UKKyAgICAgICAgbG9hZCkuIEFzIGEgcmVzdWx0LCB3ZSBl
bmQgdXAgc3BlbmRpbmcgfjkwbXMgaW4KKyAgICAgICAgaW50ZXJuYWxGb250V2l0aEZhbWlseSgp
IHdoZW4gbG9hZGluZyB3ZWF0aGVyLmNvbS4KKworICAgICAgICBUaGlzIHBhdGNoIGludHJvZHVj
ZXMgYSBjYWNoZSBmb3IgdGhlIG1hcHBpbmcgYmV0d2VlbiBkZXNpcmVkIGZvbnQKKyAgICAgICAg
ZmFtaWxpZXMgYW5kIGF2YWlsYWJsZSBmb250IGZhbWlsaWVzLiBUaGlzIGN1dHMgdGhlIHRpbWUg
c3BlbnQgaW4KKyAgICAgICAgaW50ZXJuYWxGb250V2l0aEZhbWlseSgpIGluIGhhbGYgKH40NW1z
KS4gVGhlIGNhY2hlIGdldHMgaW52YWxpZGF0ZWQKKyAgICAgICAgd2hlbiBmb250cyBhcmUgaW5z
dGFsbGVkIC8gdW5pbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBzbyB3ZSBkb24ndCBicmVhaworICAg
ICAgICB0aGF0IHNjZW5hcmlvLiBUaGUgY2FjaGUgaXMgYWxzbyBsaW1pdGVkIGluIHNpemUgdG8g
YXZvaWQgdXNpbmcgdG9vCisgICAgICAgIG11Y2ggbWVtb3J5LgorCisgICAgICAgIE5vIG5ldyB0
ZXN0cywgYnV0IG1hbnVhbCB0ZXN0aW5nIG1ha2luZyBzdXJlIHRoZSBjYWNoZSBnZXRzIGludmFs
aWRhdGVkCisgICAgICAgIHdoZW4gaW5zdGFsbGluZyBhIGZvbnQgb24gdGhlIHN5c3RlbS4KKwor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVNYWMubW06CisgICAgICAg
IChXZWJDb3JlOjppbnZhbGlkYXRlRm9udENhY2hlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMv
V2ViRm9udENhY2hlLmg6CisgICAgICAgICogcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5tbToK
KyAgICAgICAgKGRlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURpY3Rpb25hcnkpOgorICAg
ICAgICAocmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlNYXBwaW5nKToKKyAg
ICAgICAgKCtbV2ViRm9udENhY2hlIGludGVybmFsRm9udFdpdGhGYW1pbHk6dHJhaXRzOndlaWdo
dDpzaXplOl0pOgorICAgICAgICAoK1tXZWJGb250Q2FjaGUgaW52YWxpZGF0ZV0pOgorCiAyMDE0
LTEwLTA5ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNvbT4KIAogICAg
ICAgICBMYXllcmluZyB2aW9sYXRpb246IE1lZGlhUGxheWVyIHNob3VsZCBub3QgcmVmZXJlbmNl
L3VzZSBGcmFtZVZpZXcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL21hYy9Gb250Q2FjaGVNYWMubW0gYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvRm9udENhY2hlTWFjLm1tCmluZGV4IDNiOGQ2NTQwMzY5N2EyYjQ1MGI0YjEwYjRhOTk3
NDg5MDAwZThhODEuLmE4NzdmMjYzNDY0NWRjYjc5OTY2MWMxMjExZDdjMWY0YzFjMjAwNzMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVN
YWMubW0KKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRDYWNo
ZU1hYy5tbQpAQCAtNTQsNiArNTQsNyBAQCBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlRm9udENhY2hl
KHZvaWQqKQogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGZvbnRDYWNoZSgpLmludmFsaWRh
dGUoKTsKKyAgICBbV2ViRm9udENhY2hlIGludmFsaWRhdGVdOwogfQogCiBzdGF0aWMgdm9pZCBm
b250Q2FjaGVSZWdpc3RlcmVkRm9udHNDaGFuZ2VkTm90aWZpY2F0aW9uQ2FsbGJhY2soQ0ZOb3Rp
ZmljYXRpb25DZW50ZXJSZWYsIHZvaWQqIG9ic2VydmVyLCBDRlN0cmluZ1JlZiBuYW1lLCBjb25z
dCB2b2lkICosIENGRGljdGlvbmFyeVJlZikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL21hYy9XZWJGb250Q2FjaGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9X
ZWJGb250Q2FjaGUuaAppbmRleCA1MzVlNjRhMWQwMTg0NGIwYzY3YzA5ZDYzMTJiYzE1NDM1YWY1
MTRjLi40YzIwMTg0Y2ZjNmQ2OThmNzhmY2EzOWRkNWQxNDAxM2ZlY2VmMTVhIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViRm9udENhY2hlLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5oCkBAIC0zMiw2ICszMiw3IEBAIFdF
QkNPUkVfRVhQT1JUIEBpbnRlcmZhY2UgV2ViRm9udENhY2hlIDogTlNPYmplY3QKICsgKE5TRm9u
dCAqKWZvbnRXaXRoRmFtaWx5OihOU1N0cmluZyAqKWRlc2lyZWRGYW1pbHkgdHJhaXRzOihOU0Zv
bnRUcmFpdE1hc2spZGVzaXJlZFRyYWl0cyB3ZWlnaHQ6KGludClkZXNpcmVkV2VpZ2h0IHNpemU6
KGZsb2F0KXNpemUgc2hvdWxkQXV0b0FjdGl2YXRlSWZOZWVkZWQ6KEJPT0wpc2hvdWxkQXV0b0Fj
dGl2YXRlSWZOZWVkZWQ7CiArIChOU0ZvbnQgKilmb250V2l0aEZhbWlseTooTlNTdHJpbmcgKilk
ZXNpcmVkRmFtaWx5IHRyYWl0czooTlNGb250VHJhaXRNYXNrKWRlc2lyZWRUcmFpdHMgd2VpZ2h0
OihpbnQpZGVzaXJlZFdlaWdodCBzaXplOihmbG9hdClzaXplOwogKyAodm9pZClnZXRUcmFpdHM6
KFZlY3Rvcjx1bnNpZ25lZD4mKXRyYWl0c01hc2tzIGluRmFtaWx5OihOU1N0cmluZyAqKWRlc2ly
ZWRGYW1pbHk7CisrICh2b2lkKWludmFsaWRhdGU7CiAKIC8vIFRoaXMgb2xkZXIgdmVyc2lvbiBv
ZiB0aGUgaW50ZXJmYWNlIGlzIHJlbGllZCB1cG9uIGJ5IHNvbWUgY2xpZW50cy4gV2ViQ29yZSBk
b2Vzbid0IHVzZSBpdC4KICsgKE5TRm9udCAqKWZvbnRXaXRoRmFtaWx5OihOU1N0cmluZyAqKWRl
c2lyZWRGYW1pbHkgdHJhaXRzOihOU0ZvbnRUcmFpdE1hc2spZGVzaXJlZFRyYWl0cyBzaXplOihm
bG9hdClzaXplOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkZv
bnRDYWNoZS5tbSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJGb250Q2FjaGUubW0K
aW5kZXggNThhNWYyNGEzNDdhNjgzYzNkN2Y5NzZmZjA5ZWY5OTUyZDM2NDhhOS4uZTJmNDBkM2Nm
MGU5MDBjZGQyYjcyOTk4ZWRjZGRmNTRlNzBlYTBlYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5tbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9tYWMvV2ViRm9udENhY2hlLm1tCkBAIC0zNSw2ICszNSw3IEBACiAjaW1wb3J0IDxBcHBL
aXQvQXBwS2l0Lmg+CiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQg
PG1hdGguaD4KKyNpbXBvcnQgPHd0Zi9NYWluVGhyZWFkLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBX
ZWJDb3JlOwogCkBAIC0xMTUsNiArMTE2LDMwIEBAIHN0YXRpYyBpbmxpbmUgRm9udFRyYWl0c01h
c2sgdG9UcmFpdHNNYXNrKE5TRm9udFRyYWl0TWFzayBhcHBLaXRUcmFpdHMsIE5TSW50ZWdlCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRXZWlnaHQ5MDBNYXNrKSk7CiB9
CiAKKy8vIEtlZXAgYSBjYWNoZSBmb3IgbWFwcGluZyBkZXNpcmVkIGZvbnQgZmFtaWxpZXMgdG8g
Zm9udCBmYW1pbGllcyBhY3R1YWxseQorLy8gYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0gZm9yIHBl
cmZvcm1hbmNlLgorc3RhdGljIE5TTXV0YWJsZURpY3Rpb25hcnkqIGRlc2lyZWRGYW1pbHlUb0F2
YWlsYWJsZUZhbWlseURpY3Rpb25hcnkoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisgICAgc3RhdGljIE5TTXV0YWJsZURpY3Rpb25hcnkgKmRpY3Rpb25hcnkgPSBbW05TTXV0YWJs
ZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOworICAgIHJldHVybiBkaWN0aW9uYXJ5OworfQorCitz
dGF0aWMgaW5saW5lIHZvaWQgcmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlN
YXBwaW5nKE5TU3RyaW5nKiBkZXNpcmVkRmFtaWx5LCBOU1N0cmluZyogYXZhaWxhYmxlRmFtaWx5
KQoreworICAgIHN0YXRpYyBjb25zdCBOU1VJbnRlZ2VyIG1heENhY2hlU2l6ZSA9IDEyODsKKyAg
ICBOU011dGFibGVEaWN0aW9uYXJ5KiBmYW1pbHlNYXBwaW5nID0gZGVzaXJlZEZhbWlseVRvQXZh
aWxhYmxlRmFtaWx5RGljdGlvbmFyeSgpOworICAgIEFTU0VSVChbZmFtaWx5TWFwcGluZyBjb3Vu
dF0gPD0gbWF4Q2FjaGVTaXplKTsKKyAgICBpZiAoW2ZhbWlseU1hcHBpbmcgY291bnRdID09IG1h
eENhY2hlU2l6ZSkgeworICAgICAgICBmb3IgKE5TU3RyaW5nICprZXkgaW4gZmFtaWx5TWFwcGlu
ZykgeworICAgICAgICAgICAgW2ZhbWlseU1hcHBpbmcgcmVtb3ZlT2JqZWN0Rm9yS2V5OmtleV07
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZCB2YWx1ZSA9IGF2
YWlsYWJsZUZhbWlseSA/IGF2YWlsYWJsZUZhbWlseSA6IFtOU051bGwgbnVsbF07CisgICAgW2Zh
bWlseU1hcHBpbmcgc2V0T2JqZWN0OnZhbHVlIGZvcktleTpkZXNpcmVkRmFtaWx5XTsKK30KKwog
QGltcGxlbWVudGF0aW9uIFdlYkZvbnRDYWNoZQogCiArICh2b2lkKWdldFRyYWl0czooVmVjdG9y
PHVuc2lnbmVkPiYpdHJhaXRzTWFza3MgaW5GYW1pbHk6KE5TU3RyaW5nICopZGVzaXJlZEZhbWls
eQpAQCAtMTYwLDQ4ICsxODUsNTUgQEAgc3RhdGljIGlubGluZSBGb250VHJhaXRzTWFzayB0b1Ry
YWl0c01hc2soTlNGb250VHJhaXRNYXNrIGFwcEtpdFRyYWl0cywgTlNJbnRlZ2UKIC8vIHdlIHRo
ZW4gZG8gYSBzZWFyY2ggYmFzZWQgb24gdGhlIGZhbWlseSBuYW1lcyBvZiB0aGUgaW5zdGFsbGVk
IGZvbnRzLgogKyAoTlNGb250ICopaW50ZXJuYWxGb250V2l0aEZhbWlseTooTlNTdHJpbmcgKilk
ZXNpcmVkRmFtaWx5IHRyYWl0czooTlNGb250VHJhaXRNYXNrKWRlc2lyZWRUcmFpdHMgd2VpZ2h0
OihpbnQpZGVzaXJlZFdlaWdodCBzaXplOihmbG9hdClzaXplCiB7Ci0KICAgICBpZiAoc3RyaW5n
SXNDYXNlSW5zZW5zaXRpdmVFcXVhbFRvU3RyaW5nKGRlc2lyZWRGYW1pbHksIEAiLXdlYmtpdC1z
eXN0ZW0tZm9udCIpCiAgICAgICAgIHx8IHN0cmluZ0lzQ2FzZUluc2Vuc2l0aXZlRXF1YWxUb1N0
cmluZyhkZXNpcmVkRmFtaWx5LCBAIi1hcHBsZS1zeXN0ZW0tZm9udCIpKSB7CiAgICAgICAgIC8v
IFdlIGlnbm9yZSBpdGFsaWMgZm9yIHN5c3RlbSBmb250LgogICAgICAgICByZXR1cm4gKGRlc2ly
ZWRXZWlnaHQgPj0gNykgPyBbTlNGb250IGJvbGRTeXN0ZW1Gb250T2ZTaXplOnNpemVdIDogW05T
Rm9udCBzeXN0ZW1Gb250T2ZTaXplOnNpemVdOwogICAgIH0KIAotICAgIE5TRm9udE1hbmFnZXIg
KmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdOwotCi0gICAg
Ly8gRG8gYSBzaW1wbGUgY2FzZSBpbnNlbnNpdGl2ZSBzZWFyY2ggZm9yIGEgbWF0Y2hpbmcgZm9u
dCBmYW1pbHkuCi0gICAgLy8gTlNGb250TWFuYWdlciByZXF1aXJlcyBleGFjdCBuYW1lIG1hdGNo
ZXMuCi0gICAgLy8gVGhpcyBhZGRyZXNzZXMgdGhlIHByb2JsZW0gb2YgbWF0Y2hpbmcgYXJpYWwg
dG8gQXJpYWwsIGV0Yy4sIGJ1dCBwZXJoYXBzIG5vdCBhbGwgdGhlIGlzc3Vlcy4KLSAgICBOU0Vu
dW1lcmF0b3IgKmUgPSBbW2ZvbnRNYW5hZ2VyIGF2YWlsYWJsZUZvbnRGYW1pbGllc10gb2JqZWN0
RW51bWVyYXRvcl07Ci0gICAgTlNTdHJpbmcgKmF2YWlsYWJsZUZhbWlseTsKLSAgICB3aGlsZSAo
KGF2YWlsYWJsZUZhbWlseSA9IFtlIG5leHRPYmplY3RdKSkgewotICAgICAgICBpZiAoW2Rlc2ly
ZWRGYW1pbHkgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTphdmFpbGFibGVGYW1pbHldID09IE5TT3Jk
ZXJlZFNhbWUpCi0gICAgICAgICAgICBicmVhazsKKyAgICBpZCBjYWNoZWRBdmFpbGFibGVGYW1p
bHkgPSBbZGVzaXJlZEZhbWlseVRvQXZhaWxhYmxlRmFtaWx5RGljdGlvbmFyeSgpIG9iamVjdEZv
cktleTpkZXNpcmVkRmFtaWx5XTsKKyAgICBpZiAoY2FjaGVkQXZhaWxhYmxlRmFtaWx5ID09IFtO
U051bGwgbnVsbF0pIHsKKyAgICAgICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoaXMgZm9udCBpcyBu
b3QgYXZhaWxhYmxlLgorICAgICAgICByZXR1cm4gbmlsOwogICAgIH0KIAorICAgIE5TRm9udE1h
bmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdOwor
ICAgIE5TU3RyaW5nICphdmFpbGFibGVGYW1pbHkgPSBjYWNoZWRBdmFpbGFibGVGYW1pbHk7CiAg
ICAgaWYgKCFhdmFpbGFibGVGYW1pbHkpIHsKLSAgICAgICAgLy8gTWF0Y2ggYnkgUG9zdFNjcmlw
dCBuYW1lLgotICAgICAgICBOU0VudW1lcmF0b3IgKmF2YWlsYWJsZUZvbnRzID0gW1tmb250TWFu
YWdlciBhdmFpbGFibGVGb250c10gb2JqZWN0RW51bWVyYXRvcl07Ci0gICAgICAgIE5TU3RyaW5n
ICphdmFpbGFibGVGb250OwotICAgICAgICBOU0ZvbnQgKm5hbWVNYXRjaGVkRm9udCA9IG5pbDsK
LSAgICAgICAgTlNGb250VHJhaXRNYXNrIGRlc2lyZWRUcmFpdHNGb3JOYW1lTWF0Y2ggPSBkZXNp
cmVkVHJhaXRzIHwgKGRlc2lyZWRXZWlnaHQgPj0gNyA/IE5TQm9sZEZvbnRNYXNrIDogMCk7Ci0g
ICAgICAgIHdoaWxlICgoYXZhaWxhYmxlRm9udCA9IFthdmFpbGFibGVGb250cyBuZXh0T2JqZWN0
XSkpIHsKLSAgICAgICAgICAgIGlmIChbZGVzaXJlZEZhbWlseSBjYXNlSW5zZW5zaXRpdmVDb21w
YXJlOmF2YWlsYWJsZUZvbnRdID09IE5TT3JkZXJlZFNhbWUpIHsKLSAgICAgICAgICAgICAgICBu
YW1lTWF0Y2hlZEZvbnQgPSBbTlNGb250IGZvbnRXaXRoTmFtZTphdmFpbGFibGVGb250IHNpemU6
c2l6ZV07Ci0KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgT3Nha2EtTW9uby4gIEFj
Y29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIG5lZWQgdG8gCi0gICAgICAg
ICAgICAgICAgLy8gdHJlYXQgT3Nha2EtTW9ubyBhcyBmaXhlZCBwaXRjaC4KLSAgICAgICAgICAg
ICAgICBpZiAoW2Rlc2lyZWRGYW1pbHkgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1v
bm8iXSA9PSBOU09yZGVyZWRTYW1lICYmIGRlc2lyZWRUcmFpdHNGb3JOYW1lTWF0Y2ggPT0gMCkK
LSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXRjaGVkRm9udDsKLQotICAgICAgICAg
ICAgICAgIE5TRm9udFRyYWl0TWFzayB0cmFpdHMgPSBbZm9udE1hbmFnZXIgdHJhaXRzT2ZGb250
Om5hbWVNYXRjaGVkRm9udF07Ci0gICAgICAgICAgICAgICAgaWYgKCh0cmFpdHMgJiBkZXNpcmVk
VHJhaXRzRm9yTmFtZU1hdGNoKSA9PSBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoKQotICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gW2ZvbnRNYW5hZ2VyIGNvbnZlcnRGb250Om5hbWVNYXRjaGVk
Rm9udCB0b0hhdmVUcmFpdDpkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoXTsKLQotICAgICAgICAg
ICAgICAgIGF2YWlsYWJsZUZhbWlseSA9IFtuYW1lTWF0Y2hlZEZvbnQgZmFtaWx5TmFtZV07Cisg
ICAgICAgIC8vIERvIGEgc2ltcGxlIGNhc2UgaW5zZW5zaXRpdmUgc2VhcmNoIGZvciBhIG1hdGNo
aW5nIGZvbnQgZmFtaWx5LgorICAgICAgICAvLyBOU0ZvbnRNYW5hZ2VyIHJlcXVpcmVzIGV4YWN0
IG5hbWUgbWF0Y2hlcy4KKyAgICAgICAgLy8gVGhpcyBhZGRyZXNzZXMgdGhlIHByb2JsZW0gb2Yg
bWF0Y2hpbmcgYXJpYWwgdG8gQXJpYWwsIGV0Yy4sIGJ1dCBwZXJoYXBzIG5vdCBhbGwgdGhlIGlz
c3Vlcy4KKyAgICAgICAgZm9yIChhdmFpbGFibGVGYW1pbHkgaW4gW2ZvbnRNYW5hZ2VyIGF2YWls
YWJsZUZvbnRGYW1pbGllc10pIHsKKyAgICAgICAgICAgIGlmIChbZGVzaXJlZEZhbWlseSBjYXNl
SW5zZW5zaXRpdmVDb21wYXJlOmF2YWlsYWJsZUZhbWlseV0gPT0gTlNPcmRlcmVkU2FtZSkKICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYXZhaWxhYmxl
RmFtaWx5KSB7CisgICAgICAgICAgICAvLyBNYXRjaCBieSBQb3N0U2NyaXB0IG5hbWUuCisgICAg
ICAgICAgICBOU0ZvbnQgKm5hbWVNYXRjaGVkRm9udCA9IG5pbDsKKyAgICAgICAgICAgIE5TRm9u
dFRyYWl0TWFzayBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoID0gZGVzaXJlZFRyYWl0cyB8IChk
ZXNpcmVkV2VpZ2h0ID49IDcgPyBOU0JvbGRGb250TWFzayA6IDApOworICAgICAgICAgICAgZm9y
IChOU1N0cmluZyAqYXZhaWxhYmxlRm9udCBpbiBbZm9udE1hbmFnZXIgYXZhaWxhYmxlRm9udHNd
KSB7CisgICAgICAgICAgICAgICAgaWYgKFtkZXNpcmVkRmFtaWx5IGNhc2VJbnNlbnNpdGl2ZUNv
bXBhcmU6YXZhaWxhYmxlRm9udF0gPT0gTlNPcmRlcmVkU2FtZSkgeworICAgICAgICAgICAgICAg
ICAgICBuYW1lTWF0Y2hlZEZvbnQgPSBbTlNGb250IGZvbnRXaXRoTmFtZTphdmFpbGFibGVGb250
IHNpemU6c2l6ZV07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIE9zYWth
LU1vbm8uIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIG5lZWQgdG8K
KyAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgT3Nha2EtTW9ubyBhcyBmaXhlZCBwaXRjaC4K
KyAgICAgICAgICAgICAgICAgICAgaWYgKFtkZXNpcmVkRmFtaWx5IGNhc2VJbnNlbnNpdGl2ZUNv
bXBhcmU6QCJPc2FrYS1Nb25vIl0gPT0gTlNPcmRlcmVkU2FtZSAmJiAhZGVzaXJlZFRyYWl0c0Zv
ck5hbWVNYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lTWF0Y2hlZEZv
bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgTlNGb250VHJhaXRNYXNrIHRyYWl0cyA9IFtmb250
TWFuYWdlciB0cmFpdHNPZkZvbnQ6bmFtZU1hdGNoZWRGb250XTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCh0cmFpdHMgJiBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoKSA9PSBkZXNpcmVkVHJh
aXRzRm9yTmFtZU1hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtmb250TWFu
YWdlciBjb252ZXJ0Rm9udDpuYW1lTWF0Y2hlZEZvbnQgdG9IYXZlVHJhaXQ6ZGVzaXJlZFRyYWl0
c0Zvck5hbWVNYXRjaF07CisKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRmFtaWx5ID0g
W25hbWVNYXRjaGVkRm9udCBmYW1pbHlOYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAg
cmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlNYXBwaW5nKGRlc2lyZWRGYW1p
bHksIGF2YWlsYWJsZUZhbWlseSk7CisgICAgICAgIGlmICghYXZhaWxhYmxlRmFtaWx5KQorICAg
ICAgICAgICAgcmV0dXJuIG5pbDsKICAgICB9CiAKICAgICAvLyBGb3VuZCBhIGZhbWlseSwgbm93
IGZpZ3VyZSBvdXQgd2hhdCB3ZWlnaHQgYW5kIHRyYWl0cyB0byB1c2UuCkBAIC0zMDAsNCArMzMy
LDggQEAgc3RhdGljIGlubGluZSBGb250VHJhaXRzTWFzayB0b1RyYWl0c01hc2soTlNGb250VHJh
aXRNYXNrIGFwcEtpdFRyYWl0cywgTlNJbnRlZ2UKICAgICByZXR1cm4gW3NlbGYgZm9udFdpdGhG
YW1pbHk6ZGVzaXJlZEZhbWlseSB0cmFpdHM6ZGVzaXJlZFRyYWl0cyB3ZWlnaHQ6ZGVzaXJlZFdl
aWdodCBzaXplOnNpemUgc2hvdWxkQXV0b0FjdGl2YXRlSWZOZWVkZWQ6WUVTXTsKIH0KIAorKyAo
dm9pZClpbnZhbGlkYXRlCit7CisgICAgW2Rlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURp
Y3Rpb25hcnkoKSByZW1vdmVBbGxPYmplY3RzXTsKK30KIEBlbmQK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>239551</attachid>
            <date>2014-10-09 10:55:18 -0700</date>
            <delta_ts>2014-10-09 12:05:58 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-137539-20141009105521.patch</filename>
            <type>text/plain</type>
            <size>10983</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTc0NTA1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZjJlNDczZDViZjJkYWZi
MTc2NmJkMDFlZmFiZWRjZWZjYWIwYTBlZS4uMmIwNDIwYTFhZjVhMzcwNGM4ZDMwOThhMmU4YzU3
NjVjNjQ1NWYxZSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDQ1IEBACisyMDE0LTEwLTA5ICBDaHJp
cyBEdW1leiAgPGNkdW1lekBhcHBsZS5jb20+CisKKyAgICAgICAgW01hY10gU3BlbmRpbmcgdG9v
IG11Y2ggdGltZSBtYXBwaW5nIGRlc2lyZWQgZm9udCBmYW1pbGllcyB0byBhdmFpbGFibGUgb25l
cworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3NTM5
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgRGFyaW4gQWRsZXIuCisKKyAgICAgICAgV2hpbGUgcHJv
ZmlsaW5nIHRoZSBsb2FkIG9mIHdlYXRoZXIuY29tLCBJIG5vdGljZWQgdGhhdCB3ZSBhcmUgc3Bl
bmRpbmcKKyAgICAgICAgcXVpdGUgYSBiaXQgb2YgdGltZSB0cnlpbmcgdG8gbWFwIHRoZSBmb250
IGZhbWlseSByZXF1ZXN0ZWQgdG8gYSBmb250CisgICAgICAgIHRoYXQgaXMgYXZhaWxhYmxlIG9u
IHRoZSBzeXN0ZW0uIFRoZSBwcm9jZXNzIGludm9sdmVzOgorICAgICAgICAxLiBEb2luZyBhIGxp
bmVhciBzZWFyY2ggb2YgYWxsIHRoZSBpbnN0YWxsZWQgZm9udCBmYW1pbGllcyBhbmQgZG8gYQor
ICAgICAgICAgICBjYXNlLWluc2Vuc2l0aXZlIHN0cmluZyBjb21wYXJpc29uIGZvciBlYWNoIG9m
IHRoZW0gdW50aWwgd2UgZmluZCBhCisgICAgICAgICAgIG1hdGNoLAorICAgICAgICAyLiBUaGVu
LCBpZiB3ZSBkb24ndCBmaW5kIGEgbWF0Y2gsIGRvIGFub3RoZXIgbGluZWFyIHNlYXJjaCBvZiB0
aGUKKyAgICAgICAgICAgZm9udHMnIHBvc3RzY3JpcHQgbmFtZXMgdGhpcyB0aW1lIGFuZCBkbyBh
Z2FpbiBhIGNhc2UtaW5zZW5zaXRpdmUKKyAgICAgICAgICAgc3RyaW5nIGNvbXBhcmlzb24gZm9y
IGVhY2ggb2YgdGhlbS4KKworICAgICAgICBUaGlzIHByb2Nlc3MgaXMgY29zdGx5IGFuZCB0aGUg
Zm9udHMgcmVxdWVzdGVkIGJ5IHdlYXRoZXIuY29tIGFyZSBub3QKKyAgICAgICAgYXZhaWxhYmxl
LCBjYXVzaW5nIHVzIHRvIGRvIDIgbGluZWFyIHNlYXJjaGVzIGFuZCBhIGxvdCBvZiBzdHJpbmcK
KyAgICAgICAgY29tcGFyaXNvbnMgKGFjY291bnRpbmcgZm9yIH4yJSBvZiB0aGUgV2ViUHJvY2Vz
cyBDUFUgdGltZSBmb3IgdGhlIHBhZ2UKKyAgICAgICAgbG9hZCkuIEFzIGEgcmVzdWx0LCB3ZSBl
bmQgdXAgc3BlbmRpbmcgfjkwbXMgaW4KKyAgICAgICAgaW50ZXJuYWxGb250V2l0aEZhbWlseSgp
IHdoZW4gbG9hZGluZyB3ZWF0aGVyLmNvbS4KKworICAgICAgICBUaGlzIHBhdGNoIGludHJvZHVj
ZXMgYSBjYWNoZSBmb3IgdGhlIG1hcHBpbmcgYmV0d2VlbiBkZXNpcmVkIGZvbnQKKyAgICAgICAg
ZmFtaWxpZXMgYW5kIGF2YWlsYWJsZSBmb250IGZhbWlsaWVzLiBUaGlzIGN1dHMgdGhlIHRpbWUg
c3BlbnQgaW4KKyAgICAgICAgaW50ZXJuYWxGb250V2l0aEZhbWlseSgpIGluIGhhbGYgKH40NW1z
KS4gVGhlIGNhY2hlIGdldHMgaW52YWxpZGF0ZWQKKyAgICAgICAgd2hlbiBmb250cyBhcmUgaW5z
dGFsbGVkIC8gdW5pbnN0YWxsZWQgb24gdGhlIHN5c3RlbSBzbyB3ZSBkb24ndCBicmVhaworICAg
ICAgICB0aGF0IHNjZW5hcmlvLiBUaGUgY2FjaGUgaXMgYWxzbyBsaW1pdGVkIGluIHNpemUgdG8g
YXZvaWQgdXNpbmcgdG9vCisgICAgICAgIG11Y2ggbWVtb3J5LgorCisgICAgICAgIE5vIG5ldyB0
ZXN0cywgYnV0IG1hbnVhbCB0ZXN0aW5nIG1ha2luZyBzdXJlIHRoZSBjYWNoZSBnZXRzIGludmFs
aWRhdGVkCisgICAgICAgIHdoZW4gaW5zdGFsbGluZyBhIGZvbnQgb24gdGhlIHN5c3RlbS4KKwor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVNYWMubW06CisgICAgICAg
IChXZWJDb3JlOjppbnZhbGlkYXRlRm9udENhY2hlKToKKyAgICAgICAgKiBwbGF0Zm9ybS9tYWMv
V2ViRm9udENhY2hlLmg6CisgICAgICAgICogcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5tbToK
KyAgICAgICAgKGRlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURpY3Rpb25hcnkpOgorICAg
ICAgICAocmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlNYXBwaW5nKToKKyAg
ICAgICAgKCtbV2ViRm9udENhY2hlIGludGVybmFsRm9udFdpdGhGYW1pbHk6dHJhaXRzOndlaWdo
dDpzaXplOl0pOgorICAgICAgICAoK1tXZWJGb250Q2FjaGUgaW52YWxpZGF0ZV0pOgorCiAyMDE0
LTEwLTA5ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNvbT4KIAogICAg
ICAgICBMYXllcmluZyB2aW9sYXRpb246IE1lZGlhUGxheWVyIHNob3VsZCBub3QgcmVmZXJlbmNl
L3VzZSBGcmFtZVZpZXcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL21hYy9Gb250Q2FjaGVNYWMubW0gYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9tYWMvRm9udENhY2hlTWFjLm1tCmluZGV4IDNiOGQ2NTQwMzY5N2EyYjQ1MGI0YjEwYjRhOTk3
NDg5MDAwZThhODEuLmE4NzdmMjYzNDY0NWRjYjc5OTY2MWMxMjExZDdjMWY0YzFjMjAwNzMgMTAw
NjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL21hYy9Gb250Q2FjaGVN
YWMubW0KKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvbWFjL0ZvbnRDYWNo
ZU1hYy5tbQpAQCAtNTQsNiArNTQsNyBAQCBzdGF0aWMgdm9pZCBpbnZhbGlkYXRlRm9udENhY2hl
KHZvaWQqKQogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGZvbnRDYWNoZSgpLmludmFsaWRh
dGUoKTsKKyAgICBbV2ViRm9udENhY2hlIGludmFsaWRhdGVdOwogfQogCiBzdGF0aWMgdm9pZCBm
b250Q2FjaGVSZWdpc3RlcmVkRm9udHNDaGFuZ2VkTm90aWZpY2F0aW9uQ2FsbGJhY2soQ0ZOb3Rp
ZmljYXRpb25DZW50ZXJSZWYsIHZvaWQqIG9ic2VydmVyLCBDRlN0cmluZ1JlZiBuYW1lLCBjb25z
dCB2b2lkICosIENGRGljdGlvbmFyeVJlZikKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL21hYy9XZWJGb250Q2FjaGUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9X
ZWJGb250Q2FjaGUuaAppbmRleCA1MzVlNjRhMWQwMTg0NGIwYzY3YzA5ZDYzMTJiYzE1NDM1YWY1
MTRjLi40YzIwMTg0Y2ZjNmQ2OThmNzhmY2EzOWRkNWQxNDAxM2ZlY2VmMTVhIDEwMDY0NAotLS0g
YS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9tYWMvV2ViRm9udENhY2hlLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5oCkBAIC0zMiw2ICszMiw3IEBAIFdF
QkNPUkVfRVhQT1JUIEBpbnRlcmZhY2UgV2ViRm9udENhY2hlIDogTlNPYmplY3QKICsgKE5TRm9u
dCAqKWZvbnRXaXRoRmFtaWx5OihOU1N0cmluZyAqKWRlc2lyZWRGYW1pbHkgdHJhaXRzOihOU0Zv
bnRUcmFpdE1hc2spZGVzaXJlZFRyYWl0cyB3ZWlnaHQ6KGludClkZXNpcmVkV2VpZ2h0IHNpemU6
KGZsb2F0KXNpemUgc2hvdWxkQXV0b0FjdGl2YXRlSWZOZWVkZWQ6KEJPT0wpc2hvdWxkQXV0b0Fj
dGl2YXRlSWZOZWVkZWQ7CiArIChOU0ZvbnQgKilmb250V2l0aEZhbWlseTooTlNTdHJpbmcgKilk
ZXNpcmVkRmFtaWx5IHRyYWl0czooTlNGb250VHJhaXRNYXNrKWRlc2lyZWRUcmFpdHMgd2VpZ2h0
OihpbnQpZGVzaXJlZFdlaWdodCBzaXplOihmbG9hdClzaXplOwogKyAodm9pZClnZXRUcmFpdHM6
KFZlY3Rvcjx1bnNpZ25lZD4mKXRyYWl0c01hc2tzIGluRmFtaWx5OihOU1N0cmluZyAqKWRlc2ly
ZWRGYW1pbHk7CisrICh2b2lkKWludmFsaWRhdGU7CiAKIC8vIFRoaXMgb2xkZXIgdmVyc2lvbiBv
ZiB0aGUgaW50ZXJmYWNlIGlzIHJlbGllZCB1cG9uIGJ5IHNvbWUgY2xpZW50cy4gV2ViQ29yZSBk
b2Vzbid0IHVzZSBpdC4KICsgKE5TRm9udCAqKWZvbnRXaXRoRmFtaWx5OihOU1N0cmluZyAqKWRl
c2lyZWRGYW1pbHkgdHJhaXRzOihOU0ZvbnRUcmFpdE1hc2spZGVzaXJlZFRyYWl0cyBzaXplOihm
bG9hdClzaXplOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vbWFjL1dlYkZv
bnRDYWNoZS5tbSBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL21hYy9XZWJGb250Q2FjaGUubW0K
aW5kZXggNThhNWYyNGEzNDdhNjgzYzNkN2Y5NzZmZjA5ZWY5OTUyZDM2NDhhOS4uYWNhOTllNGY4
ZWFjMTIyZTMwYmI4ZGNiMmEyNjRkNmE0YTg4N2RmNCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNv
cmUvcGxhdGZvcm0vbWFjL1dlYkZvbnRDYWNoZS5tbQorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0
Zm9ybS9tYWMvV2ViRm9udENhY2hlLm1tCkBAIC0zNSw2ICszNSw3IEBACiAjaW1wb3J0IDxBcHBL
aXQvQXBwS2l0Lmg+CiAjaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KICNpbXBvcnQg
PG1hdGguaD4KKyNpbXBvcnQgPHd0Zi9NYWluVGhyZWFkLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBX
ZWJDb3JlOwogCkBAIC0xMTUsNiArMTE2LDMwIEBAIHN0YXRpYyBpbmxpbmUgRm9udFRyYWl0c01h
c2sgdG9UcmFpdHNNYXNrKE5TRm9udFRyYWl0TWFzayBhcHBLaXRUcmFpdHMsIE5TSW50ZWdlCiAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRXZWlnaHQ5MDBNYXNrKSk7CiB9
CiAKKy8vIEtlZXAgYSBjYWNoZSBmb3IgbWFwcGluZyBkZXNpcmVkIGZvbnQgZmFtaWxpZXMgdG8g
Zm9udCBmYW1pbGllcyBhY3R1YWxseQorLy8gYXZhaWxhYmxlIG9uIHRoZSBzeXN0ZW0gZm9yIHBl
cmZvcm1hbmNlLgorc3RhdGljIE5TTXV0YWJsZURpY3Rpb25hcnkqIGRlc2lyZWRGYW1pbHlUb0F2
YWlsYWJsZUZhbWlseURpY3Rpb25hcnkoKQoreworICAgIEFTU0VSVChpc01haW5UaHJlYWQoKSk7
CisgICAgc3RhdGljIE5TTXV0YWJsZURpY3Rpb25hcnkgKmRpY3Rpb25hcnkgPSBbW05TTXV0YWJs
ZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOworICAgIHJldHVybiBkaWN0aW9uYXJ5OworfQorCitz
dGF0aWMgaW5saW5lIHZvaWQgcmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlN
YXBwaW5nKE5TU3RyaW5nKiBkZXNpcmVkRmFtaWx5LCBOU1N0cmluZyogYXZhaWxhYmxlRmFtaWx5
KQoreworICAgIHN0YXRpYyBjb25zdCBOU1VJbnRlZ2VyIG1heENhY2hlU2l6ZSA9IDEyODsKKyAg
ICBOU011dGFibGVEaWN0aW9uYXJ5ICpmYW1pbHlNYXBwaW5nID0gZGVzaXJlZEZhbWlseVRvQXZh
aWxhYmxlRmFtaWx5RGljdGlvbmFyeSgpOworICAgIEFTU0VSVChbZmFtaWx5TWFwcGluZyBjb3Vu
dF0gPD0gbWF4Q2FjaGVTaXplKTsKKyAgICBpZiAoW2ZhbWlseU1hcHBpbmcgY291bnRdID09IG1h
eENhY2hlU2l6ZSkgeworICAgICAgICBmb3IgKE5TU3RyaW5nICprZXkgaW4gZmFtaWx5TWFwcGlu
ZykgeworICAgICAgICAgICAgW2ZhbWlseU1hcHBpbmcgcmVtb3ZlT2JqZWN0Rm9yS2V5OmtleV07
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZCB2YWx1ZSA9IGF2
YWlsYWJsZUZhbWlseSA/IGF2YWlsYWJsZUZhbWlseSA6IFtOU051bGwgbnVsbF07CisgICAgW2Zh
bWlseU1hcHBpbmcgc2V0T2JqZWN0OnZhbHVlIGZvcktleTpkZXNpcmVkRmFtaWx5XTsKK30KKwog
QGltcGxlbWVudGF0aW9uIFdlYkZvbnRDYWNoZQogCiArICh2b2lkKWdldFRyYWl0czooVmVjdG9y
PHVuc2lnbmVkPiYpdHJhaXRzTWFza3MgaW5GYW1pbHk6KE5TU3RyaW5nICopZGVzaXJlZEZhbWls
eQpAQCAtMTYwLDQ4ICsxODUsNTUgQEAgc3RhdGljIGlubGluZSBGb250VHJhaXRzTWFzayB0b1Ry
YWl0c01hc2soTlNGb250VHJhaXRNYXNrIGFwcEtpdFRyYWl0cywgTlNJbnRlZ2UKIC8vIHdlIHRo
ZW4gZG8gYSBzZWFyY2ggYmFzZWQgb24gdGhlIGZhbWlseSBuYW1lcyBvZiB0aGUgaW5zdGFsbGVk
IGZvbnRzLgogKyAoTlNGb250ICopaW50ZXJuYWxGb250V2l0aEZhbWlseTooTlNTdHJpbmcgKilk
ZXNpcmVkRmFtaWx5IHRyYWl0czooTlNGb250VHJhaXRNYXNrKWRlc2lyZWRUcmFpdHMgd2VpZ2h0
OihpbnQpZGVzaXJlZFdlaWdodCBzaXplOihmbG9hdClzaXplCiB7Ci0KICAgICBpZiAoc3RyaW5n
SXNDYXNlSW5zZW5zaXRpdmVFcXVhbFRvU3RyaW5nKGRlc2lyZWRGYW1pbHksIEAiLXdlYmtpdC1z
eXN0ZW0tZm9udCIpCiAgICAgICAgIHx8IHN0cmluZ0lzQ2FzZUluc2Vuc2l0aXZlRXF1YWxUb1N0
cmluZyhkZXNpcmVkRmFtaWx5LCBAIi1hcHBsZS1zeXN0ZW0tZm9udCIpKSB7CiAgICAgICAgIC8v
IFdlIGlnbm9yZSBpdGFsaWMgZm9yIHN5c3RlbSBmb250LgogICAgICAgICByZXR1cm4gKGRlc2ly
ZWRXZWlnaHQgPj0gNykgPyBbTlNGb250IGJvbGRTeXN0ZW1Gb250T2ZTaXplOnNpemVdIDogW05T
Rm9udCBzeXN0ZW1Gb250T2ZTaXplOnNpemVdOwogICAgIH0KIAotICAgIE5TRm9udE1hbmFnZXIg
KmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdOwotCi0gICAg
Ly8gRG8gYSBzaW1wbGUgY2FzZSBpbnNlbnNpdGl2ZSBzZWFyY2ggZm9yIGEgbWF0Y2hpbmcgZm9u
dCBmYW1pbHkuCi0gICAgLy8gTlNGb250TWFuYWdlciByZXF1aXJlcyBleGFjdCBuYW1lIG1hdGNo
ZXMuCi0gICAgLy8gVGhpcyBhZGRyZXNzZXMgdGhlIHByb2JsZW0gb2YgbWF0Y2hpbmcgYXJpYWwg
dG8gQXJpYWwsIGV0Yy4sIGJ1dCBwZXJoYXBzIG5vdCBhbGwgdGhlIGlzc3Vlcy4KLSAgICBOU0Vu
dW1lcmF0b3IgKmUgPSBbW2ZvbnRNYW5hZ2VyIGF2YWlsYWJsZUZvbnRGYW1pbGllc10gb2JqZWN0
RW51bWVyYXRvcl07Ci0gICAgTlNTdHJpbmcgKmF2YWlsYWJsZUZhbWlseTsKLSAgICB3aGlsZSAo
KGF2YWlsYWJsZUZhbWlseSA9IFtlIG5leHRPYmplY3RdKSkgewotICAgICAgICBpZiAoW2Rlc2ly
ZWRGYW1pbHkgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTphdmFpbGFibGVGYW1pbHldID09IE5TT3Jk
ZXJlZFNhbWUpCi0gICAgICAgICAgICBicmVhazsKKyAgICBpZCBjYWNoZWRBdmFpbGFibGVGYW1p
bHkgPSBbZGVzaXJlZEZhbWlseVRvQXZhaWxhYmxlRmFtaWx5RGljdGlvbmFyeSgpIG9iamVjdEZv
cktleTpkZXNpcmVkRmFtaWx5XTsKKyAgICBpZiAoY2FjaGVkQXZhaWxhYmxlRmFtaWx5ID09IFtO
U051bGwgbnVsbF0pIHsKKyAgICAgICAgLy8gV2UgYWxyZWFkeSBrbm93IHRoaXMgZm9udCBpcyBu
b3QgYXZhaWxhYmxlLgorICAgICAgICByZXR1cm4gbmlsOwogICAgIH0KIAorICAgIE5TRm9udE1h
bmFnZXIgKmZvbnRNYW5hZ2VyID0gW05TRm9udE1hbmFnZXIgc2hhcmVkRm9udE1hbmFnZXJdOwor
ICAgIE5TU3RyaW5nICphdmFpbGFibGVGYW1pbHkgPSBjYWNoZWRBdmFpbGFibGVGYW1pbHk7CiAg
ICAgaWYgKCFhdmFpbGFibGVGYW1pbHkpIHsKLSAgICAgICAgLy8gTWF0Y2ggYnkgUG9zdFNjcmlw
dCBuYW1lLgotICAgICAgICBOU0VudW1lcmF0b3IgKmF2YWlsYWJsZUZvbnRzID0gW1tmb250TWFu
YWdlciBhdmFpbGFibGVGb250c10gb2JqZWN0RW51bWVyYXRvcl07Ci0gICAgICAgIE5TU3RyaW5n
ICphdmFpbGFibGVGb250OwotICAgICAgICBOU0ZvbnQgKm5hbWVNYXRjaGVkRm9udCA9IG5pbDsK
LSAgICAgICAgTlNGb250VHJhaXRNYXNrIGRlc2lyZWRUcmFpdHNGb3JOYW1lTWF0Y2ggPSBkZXNp
cmVkVHJhaXRzIHwgKGRlc2lyZWRXZWlnaHQgPj0gNyA/IE5TQm9sZEZvbnRNYXNrIDogMCk7Ci0g
ICAgICAgIHdoaWxlICgoYXZhaWxhYmxlRm9udCA9IFthdmFpbGFibGVGb250cyBuZXh0T2JqZWN0
XSkpIHsKLSAgICAgICAgICAgIGlmIChbZGVzaXJlZEZhbWlseSBjYXNlSW5zZW5zaXRpdmVDb21w
YXJlOmF2YWlsYWJsZUZvbnRdID09IE5TT3JkZXJlZFNhbWUpIHsKLSAgICAgICAgICAgICAgICBu
YW1lTWF0Y2hlZEZvbnQgPSBbTlNGb250IGZvbnRXaXRoTmFtZTphdmFpbGFibGVGb250IHNpemU6
c2l6ZV07Ci0KLSAgICAgICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgT3Nha2EtTW9uby4gIEFj
Y29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIG5lZWQgdG8gCi0gICAgICAg
ICAgICAgICAgLy8gdHJlYXQgT3Nha2EtTW9ubyBhcyBmaXhlZCBwaXRjaC4KLSAgICAgICAgICAg
ICAgICBpZiAoW2Rlc2lyZWRGYW1pbHkgY2FzZUluc2Vuc2l0aXZlQ29tcGFyZTpAIk9zYWthLU1v
bm8iXSA9PSBOU09yZGVyZWRTYW1lICYmIGRlc2lyZWRUcmFpdHNGb3JOYW1lTWF0Y2ggPT0gMCkK
LSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXRjaGVkRm9udDsKLQotICAgICAgICAg
ICAgICAgIE5TRm9udFRyYWl0TWFzayB0cmFpdHMgPSBbZm9udE1hbmFnZXIgdHJhaXRzT2ZGb250
Om5hbWVNYXRjaGVkRm9udF07Ci0gICAgICAgICAgICAgICAgaWYgKCh0cmFpdHMgJiBkZXNpcmVk
VHJhaXRzRm9yTmFtZU1hdGNoKSA9PSBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoKQotICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gW2ZvbnRNYW5hZ2VyIGNvbnZlcnRGb250Om5hbWVNYXRjaGVk
Rm9udCB0b0hhdmVUcmFpdDpkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoXTsKLQotICAgICAgICAg
ICAgICAgIGF2YWlsYWJsZUZhbWlseSA9IFtuYW1lTWF0Y2hlZEZvbnQgZmFtaWx5TmFtZV07Cisg
ICAgICAgIC8vIERvIGEgc2ltcGxlIGNhc2UgaW5zZW5zaXRpdmUgc2VhcmNoIGZvciBhIG1hdGNo
aW5nIGZvbnQgZmFtaWx5LgorICAgICAgICAvLyBOU0ZvbnRNYW5hZ2VyIHJlcXVpcmVzIGV4YWN0
IG5hbWUgbWF0Y2hlcy4KKyAgICAgICAgLy8gVGhpcyBhZGRyZXNzZXMgdGhlIHByb2JsZW0gb2Yg
bWF0Y2hpbmcgYXJpYWwgdG8gQXJpYWwsIGV0Yy4sIGJ1dCBwZXJoYXBzIG5vdCBhbGwgdGhlIGlz
c3Vlcy4KKyAgICAgICAgZm9yIChhdmFpbGFibGVGYW1pbHkgaW4gW2ZvbnRNYW5hZ2VyIGF2YWls
YWJsZUZvbnRGYW1pbGllc10pIHsKKyAgICAgICAgICAgIGlmIChbZGVzaXJlZEZhbWlseSBjYXNl
SW5zZW5zaXRpdmVDb21wYXJlOmF2YWlsYWJsZUZhbWlseV0gPT0gTlNPcmRlcmVkU2FtZSkKICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghYXZhaWxhYmxl
RmFtaWx5KSB7CisgICAgICAgICAgICAvLyBNYXRjaCBieSBQb3N0U2NyaXB0IG5hbWUuCisgICAg
ICAgICAgICBOU0ZvbnQgKm5hbWVNYXRjaGVkRm9udCA9IG5pbDsKKyAgICAgICAgICAgIE5TRm9u
dFRyYWl0TWFzayBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoID0gZGVzaXJlZFRyYWl0cyB8IChk
ZXNpcmVkV2VpZ2h0ID49IDcgPyBOU0JvbGRGb250TWFzayA6IDApOworICAgICAgICAgICAgZm9y
IChOU1N0cmluZyAqYXZhaWxhYmxlRm9udCBpbiBbZm9udE1hbmFnZXIgYXZhaWxhYmxlRm9udHNd
KSB7CisgICAgICAgICAgICAgICAgaWYgKFtkZXNpcmVkRmFtaWx5IGNhc2VJbnNlbnNpdGl2ZUNv
bXBhcmU6YXZhaWxhYmxlRm9udF0gPT0gTlNPcmRlcmVkU2FtZSkgeworICAgICAgICAgICAgICAg
ICAgICBuYW1lTWF0Y2hlZEZvbnQgPSBbTlNGb250IGZvbnRXaXRoTmFtZTphdmFpbGFibGVGb250
IHNpemU6c2l6ZV07CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIE9zYWth
LU1vbm8uIEFjY29yZGluZyB0byA8cmRhcjovL3Byb2JsZW0vMzk5OTQ2Nz4sIHdlIG5lZWQgdG8K
KyAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgT3Nha2EtTW9ubyBhcyBmaXhlZCBwaXRjaC4K
KyAgICAgICAgICAgICAgICAgICAgaWYgKFtkZXNpcmVkRmFtaWx5IGNhc2VJbnNlbnNpdGl2ZUNv
bXBhcmU6QCJPc2FrYS1Nb25vIl0gPT0gTlNPcmRlcmVkU2FtZSAmJiAhZGVzaXJlZFRyYWl0c0Zv
ck5hbWVNYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lTWF0Y2hlZEZv
bnQ7CisKKyAgICAgICAgICAgICAgICAgICAgTlNGb250VHJhaXRNYXNrIHRyYWl0cyA9IFtmb250
TWFuYWdlciB0cmFpdHNPZkZvbnQ6bmFtZU1hdGNoZWRGb250XTsKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKCh0cmFpdHMgJiBkZXNpcmVkVHJhaXRzRm9yTmFtZU1hdGNoKSA9PSBkZXNpcmVkVHJh
aXRzRm9yTmFtZU1hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtmb250TWFu
YWdlciBjb252ZXJ0Rm9udDpuYW1lTWF0Y2hlZEZvbnQgdG9IYXZlVHJhaXQ6ZGVzaXJlZFRyYWl0
c0Zvck5hbWVNYXRjaF07CisKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRmFtaWx5ID0g
W25hbWVNYXRjaGVkRm9udCBmYW1pbHlOYW1lXTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAg
cmVtZW1iZXJEZXNpcmVkRmFtaWx5VG9BdmFpbGFibGVGYW1pbHlNYXBwaW5nKGRlc2lyZWRGYW1p
bHksIGF2YWlsYWJsZUZhbWlseSk7CisgICAgICAgIGlmICghYXZhaWxhYmxlRmFtaWx5KQorICAg
ICAgICAgICAgcmV0dXJuIG5pbDsKICAgICB9CiAKICAgICAvLyBGb3VuZCBhIGZhbWlseSwgbm93
IGZpZ3VyZSBvdXQgd2hhdCB3ZWlnaHQgYW5kIHRyYWl0cyB0byB1c2UuCkBAIC0zMDAsNCArMzMy
LDggQEAgc3RhdGljIGlubGluZSBGb250VHJhaXRzTWFzayB0b1RyYWl0c01hc2soTlNGb250VHJh
aXRNYXNrIGFwcEtpdFRyYWl0cywgTlNJbnRlZ2UKICAgICByZXR1cm4gW3NlbGYgZm9udFdpdGhG
YW1pbHk6ZGVzaXJlZEZhbWlseSB0cmFpdHM6ZGVzaXJlZFRyYWl0cyB3ZWlnaHQ6ZGVzaXJlZFdl
aWdodCBzaXplOnNpemUgc2hvdWxkQXV0b0FjdGl2YXRlSWZOZWVkZWQ6WUVTXTsKIH0KIAorKyAo
dm9pZClpbnZhbGlkYXRlCit7CisgICAgW2Rlc2lyZWRGYW1pbHlUb0F2YWlsYWJsZUZhbWlseURp
Y3Rpb25hcnkoKSByZW1vdmVBbGxPYmplY3RzXTsKK30KIEBlbmQK
</data>

          </attachment>
      

    </bug>

</bugzilla>