<?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>215057</bug_id>
          
          <creation_ts>2020-08-01 01:36:24 -0700</creation_ts>
          <short_desc>Add glyph origins member to GlyphBuffer</short_desc>
          <delta_ts>2020-08-04 16:14:41 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>WebKit 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>
          
          <blocked>206208</blocked>
    
    <blocked>214769</blocked>
    
    <blocked>215059</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Myles C. Maxfield">mmaxfield</reporter>
          <assigned_to name="Myles C. Maxfield">mmaxfield</assigned_to>
          <cc>darin</cc>
    
    <cc>dino</cc>
    
    <cc>jonlee</cc>
    
    <cc>simon.fraser</cc>
    
    <cc>thorton</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>zalan</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1677106</commentid>
    <comment_count>0</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-01 01:36:24 -0700</bug_when>
    <thetext>Add glyph offsets member to GlyphBuffer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677107</commentid>
    <comment_count>1</comment_count>
      <attachid>405780</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-01 01:42:42 -0700</bug_when>
    <thetext>Created attachment 405780
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677196</commentid>
    <comment_count>2</comment_count>
      <attachid>405780</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-08-01 20:55:20 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

This business where we derive structure from platform structures seems a little strange. Seems like we could do this with some helper functions instead.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677448</commentid>
    <comment_count>3</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-03 15:27:13 -0700</bug_when>
    <thetext>(In reply to Darin Adler from comment #2)
&gt; Comment on attachment 405780 [details]
&gt; Patch
&gt; 
&gt; derive structure from platform structures

Can you explain a little more what you mean by this?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677449</commentid>
    <comment_count>4</comment_count>
      <attachid>405780</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-08-03 15:28:58 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt; +struct GlyphBufferOrigin : CGPoint {

This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677560</commentid>
    <comment_count>5</comment_count>
      <attachid>405780</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-03 21:09:46 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt; 
&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.

Ah, I understand now.

What kind of helper functions did you have in mind?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677561</commentid>
    <comment_count>6</comment_count>
      <attachid>405780</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-03 21:15:09 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt;&gt; 
&gt;&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.
&gt; 
&gt; Ah, I understand now.
&gt; 
&gt; What kind of helper functions did you have in mind?

I can think of three possibilities:

1) Typedef CGPoint to something like NativePoint, and make freestanding functions that accept and perform operations on NativePoint
2) Make GlyphBufferOrigin own a CGPoint, rather than be a CGPoint
3) Keep it as it is now: GlyphBufferOrigin is a CGPoint

Which of these do you think is best? (And why?)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677567</commentid>
    <comment_count>7</comment_count>
      <attachid>405902</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-03 22:08:45 -0700</bug_when>
    <thetext>Created attachment 405902
Rebased</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677568</commentid>
    <comment_count>8</comment_count>
      <attachid>405903</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-03 22:11:05 -0700</bug_when>
    <thetext>Created attachment 405903
Rebased</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677651</commentid>
    <comment_count>9</comment_count>
      <attachid>405780</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-08-04 10:05:21 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt;&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt;&gt;&gt; 
&gt;&gt;&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.
&gt;&gt; 
&gt;&gt; Ah, I understand now.
&gt;&gt; 
&gt;&gt; What kind of helper functions did you have in mind?
&gt; 
&gt; I can think of three possibilities:
&gt; 
&gt; 1) Typedef CGPoint to something like NativePoint, and make freestanding functions that accept and perform operations on NativePoint
&gt; 2) Make GlyphBufferOrigin own a CGPoint, rather than be a CGPoint
&gt; 3) Keep it as it is now: GlyphBufferOrigin is a CGPoint
&gt; 
&gt; Which of these do you think is best? (And why?)

I would prefer (2).

But also not sure of the bigger picture. Is GlyphBufferOrigin a cross-platform abstraction? If so, then does it’s platform-independent  interface involve CGFloat?

I’d like to see what the cross-platform abstraction is and see some examples of platform-independent code using it.

I’ve noticed our platform layer current has a lot of cross-platform non-abstraction. Supposedly platform-independent types and typedefs that don’t actually enable any shared platform-independent code.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677652</commentid>
    <comment_count>10</comment_count>
      <attachid>405903</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-08-04 10:05:55 -0700</bug_when>
    <thetext>Comment on attachment 405903
Rebased

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

&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:319
&gt; +        GlyphBufferOrigin origin = m_origins[index1];

auto</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677662</commentid>
    <comment_count>11</comment_count>
      <attachid>405780</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-04 10:32:49 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt;&gt;&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.
&gt;&gt;&gt; 
&gt;&gt;&gt; Ah, I understand now.
&gt;&gt;&gt; 
&gt;&gt;&gt; What kind of helper functions did you have in mind?
&gt;&gt; 
&gt;&gt; I can think of three possibilities:
&gt;&gt; 
&gt;&gt; 1) Typedef CGPoint to something like NativePoint, and make freestanding functions that accept and perform operations on NativePoint
&gt;&gt; 2) Make GlyphBufferOrigin own a CGPoint, rather than be a CGPoint
&gt;&gt; 3) Keep it as it is now: GlyphBufferOrigin is a CGPoint
&gt;&gt; 
&gt;&gt; Which of these do you think is best? (And why?)
&gt; 
&gt; I would prefer (2).
&gt; 
&gt; But also not sure of the bigger picture. Is GlyphBufferOrigin a cross-platform abstraction? If so, then does it’s platform-independent  interface involve CGFloat?
&gt; 
&gt; I’d like to see what the cross-platform abstraction is and see some examples of platform-independent code using it.
&gt; 
&gt; I’ve noticed our platform layer current has a lot of cross-platform non-abstraction. Supposedly platform-independent types and typedefs that don’t actually enable any shared platform-independent code.

&gt; Is GlyphBufferOrigin a cross-platform abstraction?

Yes. Cocoa ports use CGPoint so it can be passed directly to CTFontShapeGlyphs() or CTFontTransformGlyphsWIthLanguage(). Other ports use FloatPoint, and convert the FloatPoints to the platform-specific types (whatever Harfbuzz requires) later.

&gt; If so, then does its platform-independent interface involve CGFloat?

Yes, but it shouldn&apos;t. I can fix it.

&gt; I’d like to see what the cross-platform abstraction is and see some examples of platform-independent code using it.

FontCascade::drawGlyphBuffer() is one example.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677686</commentid>
    <comment_count>12</comment_count>
      <attachid>405780</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-04 12:20:08 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt;&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt;&gt;&gt;&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Ah, I understand now.
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; What kind of helper functions did you have in mind?
&gt;&gt;&gt; 
&gt;&gt;&gt; I can think of three possibilities:
&gt;&gt;&gt; 
&gt;&gt;&gt; 1) Typedef CGPoint to something like NativePoint, and make freestanding functions that accept and perform operations on NativePoint
&gt;&gt;&gt; 2) Make GlyphBufferOrigin own a CGPoint, rather than be a CGPoint
&gt;&gt;&gt; 3) Keep it as it is now: GlyphBufferOrigin is a CGPoint
&gt;&gt;&gt; 
&gt;&gt;&gt; Which of these do you think is best? (And why?)
&gt;&gt; 
&gt;&gt; I would prefer (2).
&gt;&gt; 
&gt;&gt; But also not sure of the bigger picture. Is GlyphBufferOrigin a cross-platform abstraction? If so, then does it’s platform-independent  interface involve CGFloat?
&gt;&gt; 
&gt;&gt; I’d like to see what the cross-platform abstraction is and see some examples of platform-independent code using it.
&gt;&gt; 
&gt;&gt; I’ve noticed our platform layer current has a lot of cross-platform non-abstraction. Supposedly platform-independent types and typedefs that don’t actually enable any shared platform-independent code.
&gt; 
&gt; 

Aha! I tried (2) but got:

error: static_cast from &apos;const WebCore::GlyphBufferAdvance *&apos; to &apos;const CGSize *&apos;, which are not related by inheritance, is not allowed

This makes total sense, and I think the weird inheritance thing less bad than a call to reinterpret_cast. I&apos;ll keep (3) and commit.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677693</commentid>
    <comment_count>13</comment_count>
      <attachid>405780</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-08-04 12:33:06 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt;&gt;&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt;&gt;&gt;&gt;&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; Ah, I understand now.
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; What kind of helper functions did you have in mind?
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; I can think of three possibilities:
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; 1) Typedef CGPoint to something like NativePoint, and make freestanding functions that accept and perform operations on NativePoint
&gt;&gt;&gt;&gt; 2) Make GlyphBufferOrigin own a CGPoint, rather than be a CGPoint
&gt;&gt;&gt;&gt; 3) Keep it as it is now: GlyphBufferOrigin is a CGPoint
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Which of these do you think is best? (And why?)
&gt;&gt;&gt; 
&gt;&gt;&gt; I would prefer (2).
&gt;&gt;&gt; 
&gt;&gt;&gt; But also not sure of the bigger picture. Is GlyphBufferOrigin a cross-platform abstraction? If so, then does it’s platform-independent  interface involve CGFloat?
&gt;&gt;&gt; 
&gt;&gt;&gt; I’d like to see what the cross-platform abstraction is and see some examples of platform-independent code using it.
&gt;&gt;&gt; 
&gt;&gt;&gt; I’ve noticed our platform layer current has a lot of cross-platform non-abstraction. Supposedly platform-independent types and typedefs that don’t actually enable any shared platform-independent code.
&gt;&gt; 
&gt;&gt; 
&gt; 
&gt; Aha! I tried (2) but got:
&gt; 
&gt; error: static_cast from &apos;const WebCore::GlyphBufferAdvance *&apos; to &apos;const CGSize *&apos;, which are not related by inheritance, is not allowed
&gt; 
&gt; This makes total sense, and I think the weird inheritance thing less bad than a call to reinterpret_cast. I&apos;ll keep (3) and commit.

This shows that we have something very unsafe going on.

We have an array of GlyphBufferAdvance and we pass it to something expecting an array of CGSize. This works only if we have added no data members. If I added a bool to GlyphBufferAdvance we’d have a lot of failures.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677694</commentid>
    <comment_count>14</comment_count>
      <attachid>405780</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2020-08-04 12:34:56 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; Ah, I understand now.
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; What kind of helper functions did you have in mind?
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; I can think of three possibilities:
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; 1) Typedef CGPoint to something like NativePoint, and make freestanding functions that accept and perform operations on NativePoint
&gt;&gt;&gt;&gt;&gt; 2) Make GlyphBufferOrigin own a CGPoint, rather than be a CGPoint
&gt;&gt;&gt;&gt;&gt; 3) Keep it as it is now: GlyphBufferOrigin is a CGPoint
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; Which of these do you think is best? (And why?)
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; I would prefer (2).
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; But also not sure of the bigger picture. Is GlyphBufferOrigin a cross-platform abstraction? If so, then does it’s platform-independent  interface involve CGFloat?
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; I’d like to see what the cross-platform abstraction is and see some examples of platform-independent code using it.
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; I’ve noticed our platform layer current has a lot of cross-platform non-abstraction. Supposedly platform-independent types and typedefs that don’t actually enable any shared platform-independent code.
&gt;&gt;&gt; 
&gt;&gt;&gt; 
&gt;&gt; 
&gt;&gt; Aha! I tried (2) but got:
&gt;&gt; 
&gt;&gt; error: static_cast from &apos;const WebCore::GlyphBufferAdvance *&apos; to &apos;const CGSize *&apos;, which are not related by inheritance, is not allowed
&gt;&gt; 
&gt;&gt; This makes total sense, and I think the weird inheritance thing less bad than a call to reinterpret_cast. I&apos;ll keep (3) and commit.
&gt; 
&gt; This shows that we have something very unsafe going on.
&gt; 
&gt; We have an array of GlyphBufferAdvance and we pass it to something expecting an array of CGSize. This works only if we have added no data members. If I added a bool to GlyphBufferAdvance we’d have a lot of failures.

We should use (1).

GlyphBufferAdvance should be:

    using GlyphBufferAdvance = FloatSize;

and

    using GlyphBufferAdvance = CGSize;

on different platforms. Then we should use non-member functions for the things we need to do in cross-platform code that are different between these two.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677726</commentid>
    <comment_count>15</comment_count>
      <attachid>405780</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-04 14:26:07 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt; Ah, I understand now.
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt; What kind of helper functions did you have in mind?
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; I can think of three possibilities:
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; 1) Typedef CGPoint to something like NativePoint, and make freestanding functions that accept and perform operations on NativePoint
&gt;&gt;&gt;&gt;&gt;&gt; 2) Make GlyphBufferOrigin own a CGPoint, rather than be a CGPoint
&gt;&gt;&gt;&gt;&gt;&gt; 3) Keep it as it is now: GlyphBufferOrigin is a CGPoint
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; Which of these do you think is best? (And why?)
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; I would prefer (2).
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; But also not sure of the bigger picture. Is GlyphBufferOrigin a cross-platform abstraction? If so, then does it’s platform-independent  interface involve CGFloat?
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; I’d like to see what the cross-platform abstraction is and see some examples of platform-independent code using it.
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; I’ve noticed our platform layer current has a lot of cross-platform non-abstraction. Supposedly platform-independent types and typedefs that don’t actually enable any shared platform-independent code.
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt; 
&gt;&gt;&gt; Aha! I tried (2) but got:
&gt;&gt;&gt; 
&gt;&gt;&gt; error: static_cast from &apos;const WebCore::GlyphBufferAdvance *&apos; to &apos;const CGSize *&apos;, which are not related by inheritance, is not allowed
&gt;&gt;&gt; 
&gt;&gt;&gt; This makes total sense, and I think the weird inheritance thing less bad than a call to reinterpret_cast. I&apos;ll keep (3) and commit.
&gt;&gt; 
&gt;&gt; This shows that we have something very unsafe going on.
&gt;&gt; 
&gt;&gt; We have an array of GlyphBufferAdvance and we pass it to something expecting an array of CGSize. This works only if we have added no data members. If I added a bool to GlyphBufferAdvance we’d have a lot of failures.
&gt; 
&gt; We should use (1).
&gt; 
&gt; GlyphBufferAdvance should be:
&gt; 
&gt;     using GlyphBufferAdvance = FloatSize;
&gt; 
&gt; and
&gt; 
&gt;     using GlyphBufferAdvance = CGSize;
&gt; 
&gt; on different platforms. Then we should use non-member functions for the things we need to do in cross-platform code that are different between these two.

Right, the current code is unsafe. I agree that (1) is better than (3).

I did what you suggested, but it turned out to be quite a lot of changes - more than the rest of the patch. So, rather than pollute this one, I&apos;m going to post a second patch to a new bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677756</commentid>
    <comment_count>16</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-04 15:02:36 -0700</bug_when>
    <thetext>Committed r265261: &lt;https://trac.webkit.org/changeset/265261&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677758</commentid>
    <comment_count>17</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2020-08-04 15:03:22 -0700</bug_when>
    <thetext>&lt;rdar://problem/66543482&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1677794</commentid>
    <comment_count>18</comment_count>
      <attachid>405780</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2020-08-04 16:14:41 -0700</bug_when>
    <thetext>Comment on attachment 405780
Patch

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

&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Source/WebCore/platform/graphics/GlyphBuffer.h:107
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; +struct GlyphBufferOrigin : CGPoint {
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; This is an example of deriving a structure from the Cocoa structure &quot;CGPoint&quot;. That’s what I meant by &quot;deriving structures from platform structures&quot;.
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; Ah, I understand now.
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt; What kind of helper functions did you have in mind?
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt; I can think of three possibilities:
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 1) Typedef CGPoint to something like NativePoint, and make freestanding functions that accept and perform operations on NativePoint
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 2) Make GlyphBufferOrigin own a CGPoint, rather than be a CGPoint
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 3) Keep it as it is now: GlyphBufferOrigin is a CGPoint
&gt;&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt;&gt; Which of these do you think is best? (And why?)
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; I would prefer (2).
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; But also not sure of the bigger picture. Is GlyphBufferOrigin a cross-platform abstraction? If so, then does it’s platform-independent  interface involve CGFloat?
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; I’d like to see what the cross-platform abstraction is and see some examples of platform-independent code using it.
&gt;&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt;&gt; I’ve noticed our platform layer current has a lot of cross-platform non-abstraction. Supposedly platform-independent types and typedefs that don’t actually enable any shared platform-independent code.
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; Aha! I tried (2) but got:
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; error: static_cast from &apos;const WebCore::GlyphBufferAdvance *&apos; to &apos;const CGSize *&apos;, which are not related by inheritance, is not allowed
&gt;&gt;&gt;&gt; 
&gt;&gt;&gt;&gt; This makes total sense, and I think the weird inheritance thing less bad than a call to reinterpret_cast. I&apos;ll keep (3) and commit.
&gt;&gt;&gt; 
&gt;&gt;&gt; This shows that we have something very unsafe going on.
&gt;&gt;&gt; 
&gt;&gt;&gt; We have an array of GlyphBufferAdvance and we pass it to something expecting an array of CGSize. This works only if we have added no data members. If I added a bool to GlyphBufferAdvance we’d have a lot of failures.
&gt;&gt; 
&gt;&gt; We should use (1).
&gt;&gt; 
&gt;&gt; GlyphBufferAdvance should be:
&gt;&gt; 
&gt;&gt;     using GlyphBufferAdvance = FloatSize;
&gt;&gt; 
&gt;&gt; and
&gt;&gt; 
&gt;&gt;     using GlyphBufferAdvance = CGSize;
&gt;&gt; 
&gt;&gt; on different platforms. Then we should use non-member functions for the things we need to do in cross-platform code that are different between these two.
&gt; 
&gt; Right, the current code is unsafe. I agree that (1) is better than (3).
&gt; 
&gt; I did what you suggested, but it turned out to be quite a lot of changes - more than the rest of the patch. So, rather than pollute this one, I&apos;m going to post a second patch to a new bug.

https://bugs.webkit.org/show_bug.cgi?id=215143</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>405780</attachid>
            <date>2020-08-01 01:42:42 -0700</date>
            <delta_ts>2020-08-01 20:55:20 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-215057-20200801014241.patch</filename>
            <type>text/plain</type>
            <size>13554</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjY1MTcxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNzQzMzUzZmU1ZThjOTRh
NWQ1ZmNkOTgzNTc4YWNmOTQzYTIzM2M5Mi4uNzBmYmJiNDc0MzhiMTA2MGFiNjVlYWRiNDhmMjMy
N2VkNWIxZjFlYSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYwIEBACisyMDIwLTA4LTAxICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIGdseXBo
IG9yaWdpbnMgbWVtYmVyIHRvIEdseXBoQnVmZmVyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTUwNTcKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKE9PUFMhKS4KKworICAgICAgICBUaGlzIGlzIGluIHByZXBhcmF0aW9uIGZvciBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE0NzY5CisgICAgICAgIGFuZCBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA2MjA4LgorCisgICAgICAgIFRo
ZSBzb2x1dGlvbiBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIx
NDc2OSByZXF1aXJlcyBhcHBseWluZworICAgICAgICBsZXR0ZXItc3BhY2luZyBhZnRlciB0ZXh0
IHNoYXBpbmcuIFRvZGF5LCB3ZSBhcHBseSBsZXR0ZXItc3BhY2luZyBiZWZvcmUgdGV4dAorICAg
ICAgICBzaGFwaW5nLCB3aGljaCBpcyB3cm9uZy4gSG93ZXZlciwgaWYgd2Ugd2FudCB0byBhcHBs
eSBsZXR0ZXItc3BhY2luZyBhZnRlciB0ZXh0CisgICAgICAgIHNoYXBpbmcsIHdlIG5lZWQgdG8g
dXNlIENURm9udFNoYXBlR2x5cGhzKCksIHdoaWNoIG91dHB1dHMgZ2x5cGggb3JpZ2lucyBpbgor
ICAgICAgICBhZGRpdGlvbiB0byBnbHlwaCBhZHZhbmNlcy4gQWRkaW5nIGEgZ2x5cGggb3JpZ2lu
cyBmaWVsZCB0byBHbHlwaEJ1ZmZlciBhbGxvd3MgdXMKKyAgICAgICAgdG8gZmxhdHRlbiB0aGVz
ZSBvcmlnaW5zIGF0IHRoZSBhcHByb3ByaWF0ZSBwbGFjZXMuCisKKyAgICAgICAgVGhpcyBwYXRj
aCBpcyBtZWFudCB0byBiZSBhcHBsaWVkIG9uIHRvcCBvZgorICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE1MDUxLCB3aGljaCBkZWNyZWFzZXMgdGhlIGlu
bGluZSBzaXplcworICAgICAgICBvZiB0aGVzZSB2ZWN0b3IgbWVtYmVycyBmcm9tIDIwNDggdG8g
MTAyNC4gSSBtZWFzdXJlZCB0aGUgbWVkaWFuIGFuZCBtZWFuIG9mIHRoZXNlCisgICAgICAgIHN0
cmluZ3MgaW4gb3VyIFBhZ2UgTG9hZCBUZXN0IHRvIGJlIDYgYW5kIDcuNCwgd2hpY2ggaW5kaWNh
dGVzIHdlIHdlcmUgYmVpbmcgd2lsZGx5CisgICAgICAgIGluZWZmaWNpZW50IHdpdGggdGhlIG1l
bWJlcnMgb2YgR2x5cGhCdWZmZXIuIERlY3JlYXNpbmcgdGhlc2UgaW5saW5lIHNpemVzIG1lYW5z
CisgICAgICAgIHdlJ3JlIG5vdyB1c2luZyBsZXNzIG1lbW9yeSB0aGFuIHdlIHdlcmUgYmVmb3Jl
LgorCisgICAgICAgIE5vIG5ldyB0ZXN0cyBiZWNhc3VlIHRoZXJlIGlzIG5vIGJlaGF2aW9yIGNo
YW5nZSB5ZXQuIFRoaXMgcGF0Y2gganVzdCBhZGRzIHRoZQorICAgICAgICBmaWVsZC4gVGhlIG5l
eHQgcGF0Y2ggd2lsbCBob29rIHVwIENURm9udFNoYXBlR2x5cGhzKCkgaXRzZWxmLgorCisgICAg
ICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6Rm9udENhc2NhZGU6OmRyYXdUZXh0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRD
YXNjYWRlOjpkcmF3RW1waGFzaXNNYXJrcyBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpGb250
Q2FzY2FkZTo6ZGlzcGxheUxpc3RGb3JUZXh0UnVuIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6
OkZvbnRDYXNjYWRlOjpkcmF3R2x5cGhCdWZmZXIgY29uc3QpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL0dseXBoQnVmZmVyLmg6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlckFk
dmFuY2U6OkdseXBoQnVmZmVyQWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZl
ck9yaWdpbjo6R2x5cGhCdWZmZXJPcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZm
ZXJPcmlnaW46Om9wZXJhdG9yIEZsb2F0UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhC
dWZmZXJPcmlnaW46OnNldFgpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46
OnNldFkpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OnggY29uc3QpOgor
ICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OnkgY29uc3QpOgorICAgICAgICAo
V2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OmVuY29kZSBjb25zdCk6CisgICAgICAgIChXZWJD
b3JlOjpHbHlwaEJ1ZmZlck9yaWdpbjo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBo
QnVmZmVyOjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6b3JpZ2lucyk6
CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6b3JpZ2lucyBjb25zdCk6CisgICAgICAg
IChXZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6YWRkKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVm
ZmVyOjpyZW1vdmUpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXI6Om1ha2VIb2xlKToK
KyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVmZmVyOjpzaHJpbmspOgorICAgICAgICAoV2ViQ29y
ZTo6R2x5cGhCdWZmZXI6OmZsYXR0ZW4pOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXI6
OmlzRmxhdHRlbmVkIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVmZmVyOjpzd2Fw
KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwOgorICAg
ICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpEaXNwbGF5TGlzdDo6RHJhd0dseXBoczo6Z2VuZXJhdGVHbHlwaEJ1ZmZl
ciBjb25zdCk6CisKIDIwMjAtMDctMzEgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFw
cGxlLmNvbT4KIAogICAgICAgICBDbGVhbiB1cCB0ZXh0IGxheW91dCBjb2RlIGEgYml0CmRpZmYg
LS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5jcHAg
Yi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5jcHAKaW5kZXgg
Njg4MDcyNjAzYzAxMzFmMmI2YmU1MGNmZTA3ZjMzMjY3N2VjODg0YS4uODcyYzM3NTRjMGYwNTQx
ODg1YjYyZGIzYzJmZDhjMTJmOTNiYTM3NyAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmNwcApAQCAtMjk3LDYgKzI5Nyw3IEBAIGZsb2F0IEZv
bnRDYXNjYWRlOjpkcmF3VGV4dChHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIGNvbnN0IFRleHRS
dW4mIHJ1biwgY29uc3QKIHsKICAgICB1bnNpZ25lZCBkZXN0aW5hdGlvbiA9IHRvLnZhbHVlT3Io
cnVuLmxlbmd0aCgpKTsKICAgICBhdXRvIGdseXBoQnVmZmVyID0gbGF5b3V0VGV4dChjb2RlUGF0
aChydW4sIGZyb20sIHRvKSwgcnVuLCBmcm9tLCBkZXN0aW5hdGlvbik7CisgICAgZ2x5cGhCdWZm
ZXIuZmxhdHRlbigpOwogICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludCA9IHBvaW50ICsgRmxvYXRT
aXplKGdseXBoQnVmZmVyLmluaXRpYWxBZHZhbmNlKCkpOwogICAgIC8vIFdlIGNvdWxkbid0IGdl
bmVyYXRlIGFueSBnbHlwaHMgZm9yIHRoZSBydW4uIEdpdmUgdXAuCiAgICAgaWYgKGdseXBoQnVm
ZmVyLmlzRW1wdHkoKSkKQEAgLTMxNSw2ICszMTYsNyBAQCB2b2lkIEZvbnRDYXNjYWRlOjpkcmF3
RW1waGFzaXNNYXJrcyhHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1
bgogICAgIHVuc2lnbmVkIGRlc3RpbmF0aW9uID0gdG8udmFsdWVPcihydW4ubGVuZ3RoKCkpOwog
CiAgICAgYXV0byBnbHlwaEJ1ZmZlciA9IGxheW91dFRleHQoY29kZVBhdGgocnVuLCBmcm9tLCB0
byksIHJ1biwgZnJvbSwgZGVzdGluYXRpb24sIFNob3VsZFNhdmVPZmZzZXRzOjpObywgRm9yVGV4
dEVtcGhhc2lzT3JOb3Q6OkZvclRleHRFbXBoYXNpcyk7CisgICAgZ2x5cGhCdWZmZXIuZmxhdHRl
bigpOwogCiAgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuOwpA
QCAtMzM0LDYgKzMzNiw3IEBAIHN0ZDo6dW5pcXVlX3B0cjxEaXNwbGF5TGlzdDo6RGlzcGxheUxp
c3Q+IEZvbnRDYXNjYWRlOjpkaXNwbGF5TGlzdEZvclRleHRSdW4oR3JhCiAgICAgICAgIGNvZGVQ
YXRoVG9Vc2UgPSBDb21wbGV4OwogCiAgICAgYXV0byBnbHlwaEJ1ZmZlciA9IGxheW91dFRleHQo
Y29kZVBhdGhUb1VzZSwgcnVuLCBmcm9tLCBkZXN0aW5hdGlvbik7CisgICAgZ2x5cGhCdWZmZXIu
ZmxhdHRlbigpOwogICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludCA9IHRvRmxvYXRQb2ludChGbG9h
dFNpemUoZ2x5cGhCdWZmZXIuaW5pdGlhbEFkdmFuY2UoKSkpOwogICAgIC8vIFdlIGNvdWxkbid0
IGdlbmVyYXRlIGFueSBnbHlwaHMgZm9yIHRoZSBydW4uIEdpdmUgdXAuCiAgICAgaWYgKGdseXBo
QnVmZmVyLmlzRW1wdHkoKSkKQEAgLTE0NDksNyArMTQ1Miw3IEBAIGlubGluZSBib29sIHNob3Vs
ZERyYXdJZkxvYWRpbmcoY29uc3QgRm9udCYgZm9udCwgRm9udENhc2NhZGU6OkN1c3RvbUZvbnRO
b3RSZWFkCiAKIHZvaWQgRm9udENhc2NhZGU6OmRyYXdHbHlwaEJ1ZmZlcihHcmFwaGljc0NvbnRl
eHQmIGNvbnRleHQsIGNvbnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgRmxvYXRQb2ludCYg
cG9pbnQsIEN1c3RvbUZvbnROb3RSZWFkeUFjdGlvbiBjdXN0b21Gb250Tm90UmVhZHlBY3Rpb24p
IGNvbnN0CiB7Ci0gICAgLy8gRHJhdyBlYWNoIGNvbnRpZ3VvdXMgcnVuIG9mIGdseXBocyB0aGF0
IHVzZSB0aGUgc2FtZSBmb250IGRhdGEuCisgICAgQVNTRVJUKGdseXBoQnVmZmVyLmlzRmxhdHRl
bmVkKCkpOwogICAgIGNvbnN0IEZvbnQqIGZvbnREYXRhID0gZ2x5cGhCdWZmZXIuZm9udEF0KDAp
OwogICAgIEZsb2F0UG9pbnQgc3RhcnRQb2ludCA9IHBvaW50OwogICAgIGZsb2F0IG5leHRYID0g
c3RhcnRQb2ludC54KCkgKyBnbHlwaEJ1ZmZlci5hZHZhbmNlQXQoMCkud2lkdGgoKTsKQEAgLTE0
OTUsNiArMTQ5OCw3IEBAIGlubGluZSBzdGF0aWMgZmxvYXQgb2Zmc2V0VG9NaWRkbGVPZkdseXBo
QXRJbmRleChjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsCiAKIHZvaWQgRm9udENhc2Nh
ZGU6OmRyYXdFbXBoYXNpc01hcmtzKEdyYXBoaWNzQ29udGV4dCYgY29udGV4dCwgY29uc3QgR2x5
cGhCdWZmZXImIGdseXBoQnVmZmVyLCBjb25zdCBBdG9tU3RyaW5nJiBtYXJrLCBjb25zdCBGbG9h
dFBvaW50JiBwb2ludCkgY29uc3QKIHsKKyAgICBBU1NFUlQoZ2x5cGhCdWZmZXIuaXNGbGF0dGVu
ZWQoKSk7CiAgICAgT3B0aW9uYWw8R2x5cGhEYXRhPiBtYXJrR2x5cGhEYXRhID0gZ2V0RW1waGFz
aXNNYXJrR2x5cGhEYXRhKG1hcmspOwogICAgIGlmICghbWFya0dseXBoRGF0YSkKICAgICAgICAg
cmV0dXJuOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5
cGhCdWZmZXIuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoQnVmZmVy
LmgKaW5kZXggZTQ1YjY4MWYxMjM3M2MzMDM4Y2Y4YjZiN2JhMzEzNDQ1YmM1MzRjOC4uMjFlZTVm
YTMwOTRmYjMxNjczYmVlNDAyYjRjY2QyNjJjNWQzNjJmZiAxMDA2NDQKLS0tIGEvU291cmNlL1dl
YkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhCdWZmZXIuaAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlwaEJ1ZmZlci5oCkBAIC01Myw3ICs1MywxMCBAQCB0eXBl
ZGVmIEdseXBoIEdseXBoQnVmZmVyR2x5cGg7CiAjaWYgVVNFKENHKQogc3RydWN0IEdseXBoQnVm
ZmVyQWR2YW5jZSA6IENHU2l6ZSB7CiBwdWJsaWM6Ci0gICAgR2x5cGhCdWZmZXJBZHZhbmNlKCkg
OiBDR1NpemUoQ0dTaXplWmVybykgeyB9CisgICAgR2x5cGhCdWZmZXJBZHZhbmNlKCkKKyAgICAg
ICAgOiBDR1NpemUoQ0dTaXplWmVybykKKyAgICB7CisgICAgfQogICAgIEdseXBoQnVmZmVyQWR2
YW5jZShDR1NpemUgc2l6ZSkKICAgICAgICAgOiBDR1NpemUoc2l6ZSkKICAgICB7CkBAIC0xMDAs
OCArMTAzLDYyIEBAIE9wdGlvbmFsPEdseXBoQnVmZmVyQWR2YW5jZT4gR2x5cGhCdWZmZXJBZHZh
bmNlOjpkZWNvZGUoRGVjb2RlciYgZGVjb2RlcikKIAogICAgIHJldHVybiBHbHlwaEJ1ZmZlckFk
dmFuY2UoQ0dTaXplTWFrZSgqd2lkdGgsICpoZWlnaHQpKTsKIH0KKworc3RydWN0IEdseXBoQnVm
ZmVyT3JpZ2luIDogQ0dQb2ludCB7CitwdWJsaWM6CisgICAgR2x5cGhCdWZmZXJPcmlnaW4oKQor
ICAgICAgICA6IENHUG9pbnQoQ0dQb2ludFplcm8pCisgICAgeworICAgIH0KKyAgICBHbHlwaEJ1
ZmZlck9yaWdpbihDR1BvaW50IHBvaW50KQorICAgICAgICA6IENHUG9pbnQocG9pbnQpCisgICAg
eworICAgIH0KKyAgICBHbHlwaEJ1ZmZlck9yaWdpbihGbG9hdFBvaW50IHBvaW50KQorICAgICAg
ICA6IENHUG9pbnQocG9pbnQpCisgICAgeworICAgIH0KKyAgICBHbHlwaEJ1ZmZlck9yaWdpbihm
bG9hdCB4LCBmbG9hdCB5KQorICAgICAgICA6IENHUG9pbnQoQ0dQb2ludE1ha2UoeCwgeSkpCisg
ICAgeworICAgIH0KKworICAgIHRlbXBsYXRlPGNsYXNzIEVuY29kZXI+IHZvaWQgZW5jb2RlKEVu
Y29kZXImKSBjb25zdDsKKyAgICB0ZW1wbGF0ZTxjbGFzcyBEZWNvZGVyPiBzdGF0aWMgT3B0aW9u
YWw8R2x5cGhCdWZmZXJPcmlnaW4+IGRlY29kZShEZWNvZGVyJik7CisKKyAgICBvcGVyYXRvciBG
bG9hdFBvaW50KCkgeyByZXR1cm4geyBzdGF0aWNfY2FzdDxmbG9hdD4odGhpcy0+Q0dQb2ludDo6
eCksIHN0YXRpY19jYXN0PGZsb2F0Pih0aGlzLT5DR1BvaW50Ojp5KSB9OyB9CisKKyAgICB2b2lk
IHNldFgoQ0dGbG9hdCB4KSB7IHRoaXMtPkNHUG9pbnQ6OnggPSB4OyB9CisgICAgdm9pZCBzZXRZ
KENHRmxvYXQgeSkgeyB0aGlzLT5DR1BvaW50Ojp5ID0geTsgfQorICAgIENHRmxvYXQgeCgpIGNv
bnN0IHsgcmV0dXJuIHRoaXMtPkNHUG9pbnQ6Ong7IH0KKyAgICBDR0Zsb2F0IHkoKSBjb25zdCB7
IHJldHVybiB0aGlzLT5DR1BvaW50Ojp5OyB9Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBFbmNvZGVy
Pgordm9pZCBHbHlwaEJ1ZmZlck9yaWdpbjo6ZW5jb2RlKEVuY29kZXImIGVuY29kZXIpIGNvbnN0
Cit7CisgICAgZW5jb2RlciA8PCB4KCk7CisgICAgZW5jb2RlciA8PCB5KCk7Cit9CisKK3RlbXBs
YXRlPGNsYXNzIERlY29kZXI+CitPcHRpb25hbDxHbHlwaEJ1ZmZlck9yaWdpbj4gR2x5cGhCdWZm
ZXJPcmlnaW46OmRlY29kZShEZWNvZGVyJiBkZWNvZGVyKQoreworICAgIE9wdGlvbmFsPENHRmxv
YXQ+IHg7CisgICAgZGVjb2RlciA+PiB4OworICAgIGlmICgheCkKKyAgICAgICAgcmV0dXJuIFdU
Rjo6bnVsbG9wdDsKKworICAgIE9wdGlvbmFsPENHRmxvYXQ+IHk7CisgICAgZGVjb2RlciA+PiB5
OworICAgIGlmICgheSkKKyAgICAgICAgcmV0dXJuIFdURjo6bnVsbG9wdDsKKworICAgIHJldHVy
biBHbHlwaEJ1ZmZlck9yaWdpbihDR1BvaW50TWFrZSgqeCwgKnkpKTsKK30KICNlbHNlCi10eXBl
ZGVmIEZsb2F0U2l6ZSBHbHlwaEJ1ZmZlckFkdmFuY2U7Cit1c2luZyBHbHlwaEJ1ZmZlckFkdmFu
Y2UgPSBGbG9hdFNpemU7Cit1c2luZyBHbHlwaEJ1ZmZlck9yaWdpbiA9IEZsb2F0UG9pbnQ7CiAj
ZW5kaWYKIAogaW5saW5lIEZsb2F0U2l6ZSB0b0Zsb2F0U2l6ZShjb25zdCBHbHlwaEJ1ZmZlckFk
dmFuY2UmIGEpCkBAIC0xMTksMTQgKzE3NiwxNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9udHMu
Y2xlYXIoKTsKICAgICAgICAgbV9nbHlwaHMuY2xlYXIoKTsKICAgICAgICAgbV9hZHZhbmNlcy5j
bGVhcigpOworICAgICAgICBtX29yaWdpbnMuY2xlYXIoKTsKICAgICAgICAgaWYgKG1fb2Zmc2V0
c0luU3RyaW5nKQogICAgICAgICAgICAgbV9vZmZzZXRzSW5TdHJpbmctPmNsZWFyKCk7CiAgICAg
fQogCiAgICAgR2x5cGhCdWZmZXJHbHlwaCogZ2x5cGhzKHVuc2lnbmVkIGZyb20pIHsgcmV0dXJu
IG1fZ2x5cGhzLmRhdGEoKSArIGZyb207IH0KICAgICBHbHlwaEJ1ZmZlckFkdmFuY2UqIGFkdmFu
Y2VzKHVuc2lnbmVkIGZyb20pIHsgcmV0dXJuIG1fYWR2YW5jZXMuZGF0YSgpICsgZnJvbTsgfQor
ICAgIEdseXBoQnVmZmVyT3JpZ2luKiBvcmlnaW5zKHVuc2lnbmVkIGZyb20pIHsgcmV0dXJuIG1f
b3JpZ2lucy5kYXRhKCkgKyBmcm9tOyB9CiAgICAgY29uc3QgR2x5cGhCdWZmZXJHbHlwaCogZ2x5
cGhzKHVuc2lnbmVkIGZyb20pIGNvbnN0IHsgcmV0dXJuIG1fZ2x5cGhzLmRhdGEoKSArIGZyb207
IH0KICAgICBjb25zdCBHbHlwaEJ1ZmZlckFkdmFuY2UqIGFkdmFuY2VzKHVuc2lnbmVkIGZyb20p
IGNvbnN0IHsgcmV0dXJuIG1fYWR2YW5jZXMuZGF0YSgpICsgZnJvbTsgfQorICAgIGNvbnN0IEds
eXBoQnVmZmVyT3JpZ2luKiBvcmlnaW5zKHVuc2lnbmVkIGZyb20pIGNvbnN0IHsgcmV0dXJuIG1f
b3JpZ2lucy5kYXRhKCkgKyBmcm9tOyB9CiAKICAgICBjb25zdCBGb250KiBmb250QXQodW5zaWdu
ZWQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fZm9udHNbaW5kZXhdOyB9CiAKQEAgLTE1OSw2ICsy
MTksNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZ2x5cGhzLmFwcGVuZChnbHlwaCk7CiAKICAgICAg
ICAgbV9hZHZhbmNlcy5hcHBlbmQoYWR2YW5jZSk7CisgICAgICAgIG1fb3JpZ2lucy5hcHBlbmQo
R2x5cGhCdWZmZXJPcmlnaW4oKSk7CiAgICAgICAgIAogICAgICAgICBpZiAob2Zmc2V0SW5TdHJp
bmcgIT0gbm9PZmZzZXQgJiYgbV9vZmZzZXRzSW5TdHJpbmcpCiAgICAgICAgICAgICBtX29mZnNl
dHNJblN0cmluZy0+YXBwZW5kKG9mZnNldEluU3RyaW5nKTsKQEAgLTE2OSw2ICsyMzAsNyBAQCBw
dWJsaWM6CiAgICAgICAgIG1fZm9udHMucmVtb3ZlKGxvY2F0aW9uLCBsZW5ndGgpOwogICAgICAg
ICBtX2dseXBocy5yZW1vdmUobG9jYXRpb24sIGxlbmd0aCk7CiAgICAgICAgIG1fYWR2YW5jZXMu
cmVtb3ZlKGxvY2F0aW9uLCBsZW5ndGgpOworICAgICAgICBtX29yaWdpbnMucmVtb3ZlKGxvY2F0
aW9uLCBsZW5ndGgpOwogICAgICAgICBpZiAobV9vZmZzZXRzSW5TdHJpbmcpCiAgICAgICAgICAg
ICBtX29mZnNldHNJblN0cmluZy0+cmVtb3ZlKGxvY2F0aW9uLCBsZW5ndGgpOwogICAgIH0KQEAg
LTE4MCw2ICsyNDIsNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9udHMuaW5zZXJ0VmVjdG9yKGxv
Y2F0aW9uLCBWZWN0b3I8Y29uc3QgRm9udCo+KGxlbmd0aCwgZm9udCkpOwogICAgICAgICBtX2ds
eXBocy5pbnNlcnRWZWN0b3IobG9jYXRpb24sIFZlY3RvcjxHbHlwaEJ1ZmZlckdseXBoPihsZW5n
dGgsIDB4RkZGRikpOwogICAgICAgICBtX2FkdmFuY2VzLmluc2VydFZlY3Rvcihsb2NhdGlvbiwg
VmVjdG9yPEdseXBoQnVmZmVyQWR2YW5jZT4obGVuZ3RoLCBHbHlwaEJ1ZmZlckFkdmFuY2UoMCwg
MCkpKTsKKyAgICAgICAgbV9vcmlnaW5zLmluc2VydFZlY3Rvcihsb2NhdGlvbiwgVmVjdG9yPEds
eXBoQnVmZmVyT3JpZ2luPihsZW5ndGgsIEdseXBoQnVmZmVyT3JpZ2luKCkpKTsKICAgICAgICAg
aWYgKG1fb2Zmc2V0c0luU3RyaW5nKQogICAgICAgICAgICAgbV9vZmZzZXRzSW5TdHJpbmctPmlu
c2VydFZlY3Rvcihsb2NhdGlvbiwgVmVjdG9yPHVuc2lnbmVkPihsZW5ndGgsIDApKTsKICAgICB9
CkBAIC0yMjEsMTAgKzI4NCwzNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9udHMuc2hyaW5rKHRy
dW5jYXRpb25Qb2ludCk7CiAgICAgICAgIG1fZ2x5cGhzLnNocmluayh0cnVuY2F0aW9uUG9pbnQp
OwogICAgICAgICBtX2FkdmFuY2VzLnNocmluayh0cnVuY2F0aW9uUG9pbnQpOworICAgICAgICBt
X29yaWdpbnMuc2hyaW5rKHRydW5jYXRpb25Qb2ludCk7CiAgICAgICAgIGlmIChtX29mZnNldHNJ
blN0cmluZykKICAgICAgICAgICAgIG1fb2Zmc2V0c0luU3RyaW5nLT5zaHJpbmsodHJ1bmNhdGlv
blBvaW50KTsKICAgICB9CiAKKyAgICAvLyBGb250Q2FzY2FkZTo6bGF5b3V0VGV4dCgpIHJldHVy
bnMgYSBHbHlwaEJ1ZmZlciB3aGljaCBpbmNsdWRlcyBsYXlvdXQgaW5mb3JtYXRpb24gdGhhdCBp
cyBzcGxpdAorICAgIC8vIGludG8gImFkdmFuY2VzIiBhbmQgIm9yaWdpbnMiLiBTZWUgdGhlIEFT
Q0lJLWFydCBkaWFncmFtIGluIENvbXBsZXhUZXh0Q29udHJvbGxlci5oCisgICAgLy8gSW4gb3Jk
ZXIgdG8gZ2V0IHBhaW50IGFkdmFuY2VzLCB3ZSBuZWVkIHRvIHJ1biB0aGlzICJmbGF0dGVuIiBv
cGVyYXRpb24uCisgICAgLy8gVGhpcyBtZXJnZXMgdGhlIGxheW91dCBhZHZhbmNlcyBhbmQgb3Jp
Z2lucyB0b2dldGhlciwKKyAgICAvLyBsZWF2ZXMgdGhlIHBhaW50IGFkdmFuY2VzIGluIHRoZSAi
bV9hZHZhbmNlcyIgZmllbGQsCisgICAgLy8gYW5kIHplcm9zLW91dCB0aGUgb3JpZ2lucyBpbiB0
aGUgIm1fb3JpZ2lucyIgZmllbGQuCisgICAgdm9pZCBmbGF0dGVuKCkKKyAgICB7CisgICAgICAg
IGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICAgICAgbV9h
ZHZhbmNlc1tpXSA9IEdseXBoQnVmZmVyQWR2YW5jZSgKKyAgICAgICAgICAgICAgICAtbV9vcmln
aW5zW2ldLngoKSArIG1fYWR2YW5jZXNbaV0ud2lkdGgoKSArIChpICsgMSA8IHNpemUoKSA/IG1f
b3JpZ2luc1tpICsgMV0ueCgpIDogMCksCisgICAgICAgICAgICAgICAgLW1fb3JpZ2luc1tpXS55
KCkgKyBtX2FkdmFuY2VzW2ldLmhlaWdodCgpICsgKGkgKyAxIDwgc2l6ZSgpID8gbV9vcmlnaW5z
W2kgKyAxXS55KCkgOiAwKQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIG1fb3JpZ2luc1tp
XSA9IEdseXBoQnVmZmVyT3JpZ2luKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlz
RmxhdHRlbmVkKCkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkg
PCBzaXplKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKG1fb3JpZ2luc1tpXSAhPSBHbHlwaEJ1
ZmZlck9yaWdpbigpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgdm9pZCBzd2FwKHVu
c2lnbmVkIGluZGV4MSwgdW5zaWduZWQgaW5kZXgyKQogICAgIHsKQEAgLTIzOSwxMSArMzI5LDE2
IEBAIHByaXZhdGU6CiAgICAgICAgIEdseXBoQnVmZmVyQWR2YW5jZSBzID0gbV9hZHZhbmNlc1tp
bmRleDFdOwogICAgICAgICBtX2FkdmFuY2VzW2luZGV4MV0gPSBtX2FkdmFuY2VzW2luZGV4Ml07
CiAgICAgICAgIG1fYWR2YW5jZXNbaW5kZXgyXSA9IHM7CisKKyAgICAgICAgR2x5cGhCdWZmZXJP
cmlnaW4gbyA9IG1fb3JpZ2luc1tpbmRleDFdOworICAgICAgICBtX29yaWdpbnNbaW5kZXgxXSA9
IG1fb3JpZ2luc1tpbmRleDJdOworICAgICAgICBtX29yaWdpbnNbaW5kZXgyXSA9IG87CiAgICAg
fQogCiAgICAgVmVjdG9yPGNvbnN0IEZvbnQqLCAyMDQ4PiBtX2ZvbnRzOwogICAgIFZlY3RvcjxH
bHlwaEJ1ZmZlckdseXBoLCAyMDQ4PiBtX2dseXBoczsKICAgICBWZWN0b3I8R2x5cGhCdWZmZXJB
ZHZhbmNlLCAyMDQ4PiBtX2FkdmFuY2VzOworICAgIFZlY3RvcjxHbHlwaEJ1ZmZlck9yaWdpbiwg
MjA0OD4gbV9vcmlnaW5zOwogICAgIEdseXBoQnVmZmVyQWR2YW5jZSBtX2luaXRpYWxBZHZhbmNl
OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxWZWN0b3I8dW5zaWduZWQsIDIwNDg+PiBtX29mZnNldHNJ
blN0cmluZzsKIH07CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9HcmFwaGljc0NvbnRleHQuY3BwIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
R3JhcGhpY3NDb250ZXh0LmNwcAppbmRleCBlNDgwZDA4NTRhODI4OTVlMjI3NjM1MGFhODg2MzFm
MjM1YTM2YWQyLi5jNWU4ZDM4OTc0ODE4M2FmNDc3OGQ5MmFmZjg2M2I3YzFkMWE1ODU5IDEwMDY0
NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQu
Y3BwCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4
dC5jcHAKQEAgLTY3MSw2ICs2NzEsNyBAQCBmbG9hdCBHcmFwaGljc0NvbnRleHQ6OmRyYXdUZXh0
KGNvbnN0IEZvbnRDYXNjYWRlJiBmb250LCBjb25zdCBUZXh0UnVuJiBydW4sIGNvbgogCiB2b2lk
IEdyYXBoaWNzQ29udGV4dDo6ZHJhd0dseXBocyhjb25zdCBGb250JiBmb250LCBjb25zdCBHbHlw
aEJ1ZmZlciYgYnVmZmVyLCB1bnNpZ25lZCBmcm9tLCB1bnNpZ25lZCBudW1HbHlwaHMsIGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50LCBGb250U21vb3RoaW5nTW9kZSBmb250U21vb3RoaW5nTW9kZSkK
IHsKKyAgICBBU1NFUlQoYnVmZmVyLmlzRmxhdHRlbmVkKCkpOwogICAgIGlmIChwYWludGluZ0Rp
c2FibGVkKCkpCiAgICAgICAgIHJldHVybjsKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRlbXMuY3BwIGIvU291
cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRl
bXMuY3BwCmluZGV4IGUyMjYxNzAzZTRiYzBiOWFhZjUwNTNiMzQ3YThmYzhmMDEwOWE0NzMuLjll
MDA3MDQzOGE3MTExOTNlODdkYzI5ZTM3MmNkNTAxZWMzZTE5YzAgMTAwNjQ0Ci0tLSBhL1NvdXJj
ZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdEl0ZW1z
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMv
RGlzcGxheUxpc3RJdGVtcy5jcHAKQEAgLTU0Myw5ICs1NDMsOCBAQCBEcmF3R2x5cGhzOjp+RHJh
d0dseXBocygpID0gZGVmYXVsdDsKIGlubGluZSBHbHlwaEJ1ZmZlciBEcmF3R2x5cGhzOjpnZW5l
cmF0ZUdseXBoQnVmZmVyKCkgY29uc3QKIHsKICAgICBHbHlwaEJ1ZmZlciByZXN1bHQ7Ci0gICAg
Zm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2dseXBocy5zaXplKCk7ICsraSkgeworICAgIGZvciAo
c2l6ZV90IGkgPSAwOyBpIDwgbV9nbHlwaHMuc2l6ZSgpOyArK2kpCiAgICAgICAgIHJlc3VsdC5h
ZGQobV9nbHlwaHNbaV0sICZtX2ZvbnQuZ2V0KCksIG1fYWR2YW5jZXNbaV0sIEdseXBoQnVmZmVy
Ojpub09mZnNldCk7Ci0gICAgfQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAK
</data>
<flag name="review"
          id="421180"
          type_id="1"
          status="+"
          setter="darin"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>405902</attachid>
            <date>2020-08-03 22:08:45 -0700</date>
            <delta_ts>2020-08-03 22:10:50 -0700</delta_ts>
            <desc>Rebased</desc>
            <filename>bug-215057-20200803220844.patch</filename>
            <type>text/plain</type>
            <size>13700</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjY1MjQxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2VmODFmYWFhNzlhMTFl
NjZlODllNTk0MTE3NmZkZWYzMTRjYjg5ZS4uNTEyNWVjMzQ5ZTFlMTZmY2IwMGZmNGFhMTMxMDk2
OGRlNDJhNjAxZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYwIEBACisyMDIwLTA4LTAzICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIGdseXBo
IG9yaWdpbnMgbWVtYmVyIHRvIEdseXBoQnVmZmVyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTUwNTcKKworICAgICAgICBSZXZpZXdlZCBieSBEYXJp
biBBZGxlci4KKworICAgICAgICBUaGlzIGlzIGluIHByZXBhcmF0aW9uIGZvciBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE0NzY5CisgICAgICAgIGFuZCBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA2MjA4LgorCisgICAgICAgIFRoZSBz
b2x1dGlvbiBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxNDc2
OSByZXF1aXJlcyBhcHBseWluZworICAgICAgICBsZXR0ZXItc3BhY2luZyBhZnRlciB0ZXh0IHNo
YXBpbmcuIFRvZGF5LCB3ZSBhcHBseSBsZXR0ZXItc3BhY2luZyBiZWZvcmUgdGV4dAorICAgICAg
ICBzaGFwaW5nLCB3aGljaCBpcyB3cm9uZy4gSG93ZXZlciwgaWYgd2Ugd2FudCB0byBhcHBseSBs
ZXR0ZXItc3BhY2luZyBhZnRlciB0ZXh0CisgICAgICAgIHNoYXBpbmcsIHdlIG5lZWQgdG8gdXNl
IENURm9udFNoYXBlR2x5cGhzKCksIHdoaWNoIG91dHB1dHMgZ2x5cGggb3JpZ2lucyBpbgorICAg
ICAgICBhZGRpdGlvbiB0byBnbHlwaCBhZHZhbmNlcy4gQWRkaW5nIGEgZ2x5cGggb3JpZ2lucyBm
aWVsZCB0byBHbHlwaEJ1ZmZlciBhbGxvd3MgdXMKKyAgICAgICAgdG8gZmxhdHRlbiB0aGVzZSBv
cmlnaW5zIGF0IHRoZSBhcHByb3ByaWF0ZSBwbGFjZXMuCisKKyAgICAgICAgVGhpcyBwYXRjaCBp
cyBtZWFudCB0byBiZSBhcHBsaWVkIG9uIHRvcCBvZgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE1MDUxLCB3aGljaCBkZWNyZWFzZXMgdGhlIGlubGlu
ZSBzaXplcworICAgICAgICBvZiB0aGVzZSB2ZWN0b3IgbWVtYmVycyBmcm9tIDIwNDggdG8gMTAy
NC4gSSBtZWFzdXJlZCB0aGUgbWVkaWFuIGFuZCBtZWFuIG9mIHRoZXNlCisgICAgICAgIHN0cmlu
Z3MgaW4gb3VyIFBhZ2UgTG9hZCBUZXN0IHRvIGJlIDYgYW5kIDcuNCwgd2hpY2ggaW5kaWNhdGVz
IHdlIHdlcmUgYmVpbmcgd2lsZGx5CisgICAgICAgIGluZWZmaWNpZW50IHdpdGggdGhlIG1lbWJl
cnMgb2YgR2x5cGhCdWZmZXIuIERlY3JlYXNpbmcgdGhlc2UgaW5saW5lIHNpemVzIG1lYW5zCisg
ICAgICAgIHdlJ3JlIG5vdyB1c2luZyBsZXNzIG1lbW9yeSB0aGFuIHdlIHdlcmUgYmVmb3JlLgor
CisgICAgICAgIE5vIG5ldyB0ZXN0cyBiZWNhc3VlIHRoZXJlIGlzIG5vIGJlaGF2aW9yIGNoYW5n
ZSB5ZXQuIFRoaXMgcGF0Y2gganVzdCBhZGRzIHRoZQorICAgICAgICBmaWVsZC4gVGhlIG5leHQg
cGF0Y2ggd2lsbCBob29rIHVwIENURm9udFNoYXBlR2x5cGhzKCkgaXRzZWxmLgorCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Rm9udENhc2NhZGU6OmRyYXdUZXh0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNj
YWRlOjpkcmF3RW1waGFzaXNNYXJrcyBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2Fz
Y2FkZTo6ZGlzcGxheUxpc3RGb3JUZXh0UnVuIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkZv
bnRDYXNjYWRlOjpkcmF3R2x5cGhCdWZmZXIgY29uc3QpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL0dseXBoQnVmZmVyLmg6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlckFkdmFu
Y2U6OkdseXBoQnVmZmVyQWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlck9y
aWdpbjo6R2x5cGhCdWZmZXJPcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJP
cmlnaW46Om9wZXJhdG9yIEZsb2F0UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZm
ZXJPcmlnaW46OnNldFgpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OnNl
dFkpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OnggY29uc3QpOgorICAg
ICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OnkgY29uc3QpOgorICAgICAgICAoV2Vi
Q29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OmVuY29kZSBjb25zdCk6CisgICAgICAgIChXZWJDb3Jl
OjpHbHlwaEJ1ZmZlck9yaWdpbjo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVm
ZmVyOjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6b3JpZ2lucyk6Cisg
ICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6b3JpZ2lucyBjb25zdCk6CisgICAgICAgIChX
ZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6YWRkKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVmZmVy
OjpyZW1vdmUpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXI6Om1ha2VIb2xlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdseXBoQnVmZmVyOjpzaHJpbmspOgorICAgICAgICAoV2ViQ29yZTo6
R2x5cGhCdWZmZXI6OmZsYXR0ZW4pOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXI6Omlz
RmxhdHRlbmVkIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVmZmVyOjpzd2FwKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpEaXNwbGF5TGlzdDo6RHJhd0dseXBoczo6Z2VuZXJhdGVHbHlwaEJ1ZmZlciBj
b25zdCk6CisKIDIwMjAtMDgtMDMgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxl
LmNvbT4KIAogICAgICAgICBVbmNvbmRpdGlvbmFsbHkgcmVjb3JkIHN0cmluZyBvZmZzZXRzIGlu
IHRoZSBmYXN0IHRleHQgY29kZXBhdGgKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0ZvbnRDYXNjYWRlLmNwcAppbmRleCBkZDg4Mzg2OGM0YTg1YWNiODUyZjdkZTMzMWRk
NTQ1NWRhNmE3MWVhLi44MGZhYmIzMmFkYmY2OWNjMWU0ODBiMTdiZDFjNjk5Yzg5ZGY0MjZjIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3Bw
CkBAIC0yOTcsNiArMjk3LDcgQEAgRmxvYXRTaXplIEZvbnRDYXNjYWRlOjpkcmF3VGV4dChHcmFw
aGljc0NvbnRleHQmIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY28KIHsKICAgICB1bnNp
Z25lZCBkZXN0aW5hdGlvbiA9IHRvLnZhbHVlT3IocnVuLmxlbmd0aCgpKTsKICAgICBhdXRvIGds
eXBoQnVmZmVyID0gbGF5b3V0VGV4dChjb2RlUGF0aChydW4sIGZyb20sIHRvKSwgcnVuLCBmcm9t
LCBkZXN0aW5hdGlvbik7CisgICAgZ2x5cGhCdWZmZXIuZmxhdHRlbigpOwogCiAgICAgaWYgKGds
eXBoQnVmZmVyLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIEZsb2F0U2l6ZSgpOwpAQCAtMzE0
LDYgKzMxNSw3IEBAIHZvaWQgRm9udENhc2NhZGU6OmRyYXdFbXBoYXNpc01hcmtzKEdyYXBoaWNz
Q29udGV4dCYgY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuCiAgICAgdW5zaWduZWQgZGVzdGlu
YXRpb24gPSB0by52YWx1ZU9yKHJ1bi5sZW5ndGgoKSk7CiAKICAgICBhdXRvIGdseXBoQnVmZmVy
ID0gbGF5b3V0VGV4dChjb2RlUGF0aChydW4sIGZyb20sIHRvKSwgcnVuLCBmcm9tLCBkZXN0aW5h
dGlvbiwgRm9yVGV4dEVtcGhhc2lzT3JOb3Q6OkZvclRleHRFbXBoYXNpcyk7CisgICAgZ2x5cGhC
dWZmZXIuZmxhdHRlbigpOwogCiAgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKICAgICAg
ICAgcmV0dXJuOwpAQCAtMzMzLDYgKzMzNSw3IEBAIHN0ZDo6dW5pcXVlX3B0cjxEaXNwbGF5TGlz
dDo6RGlzcGxheUxpc3Q+IEZvbnRDYXNjYWRlOjpkaXNwbGF5TGlzdEZvclRleHRSdW4oR3JhCiAg
ICAgICAgIGNvZGVQYXRoVG9Vc2UgPSBDb21wbGV4OwogCiAgICAgYXV0byBnbHlwaEJ1ZmZlciA9
IGxheW91dFRleHQoY29kZVBhdGhUb1VzZSwgcnVuLCBmcm9tLCBkZXN0aW5hdGlvbik7CisgICAg
Z2x5cGhCdWZmZXIuZmxhdHRlbigpOwogCiAgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xNDQyLDcgKzE0NDUsNyBAQCBpbmxpbmUgYm9v
bCBzaG91bGREcmF3SWZMb2FkaW5nKGNvbnN0IEZvbnQmIGZvbnQsIEZvbnRDYXNjYWRlOjpDdXN0
b21Gb250Tm90UmVhZAogCiB2b2lkIEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhCdWZmZXIoR3JhcGhp
Y3NDb250ZXh0JiBjb250ZXh0LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIEZsb2F0
UG9pbnQmIHBvaW50LCBDdXN0b21Gb250Tm90UmVhZHlBY3Rpb24gY3VzdG9tRm9udE5vdFJlYWR5
QWN0aW9uKSBjb25zdAogewotICAgIC8vIERyYXcgZWFjaCBjb250aWd1b3VzIHJ1biBvZiBnbHlw
aHMgdGhhdCB1c2UgdGhlIHNhbWUgZm9udCBkYXRhLgorICAgIEFTU0VSVChnbHlwaEJ1ZmZlci5p
c0ZsYXR0ZW5lZCgpKTsKICAgICBjb25zdCBGb250KiBmb250RGF0YSA9IGdseXBoQnVmZmVyLmZv
bnRBdCgwKTsKICAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQgPSBwb2ludDsKICAgICBmbG9hdCBu
ZXh0WCA9IHN0YXJ0UG9pbnQueCgpICsgZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KDApLndpZHRoKCk7
CkBAIC0xNDg4LDYgKzE0OTEsNyBAQCBpbmxpbmUgc3RhdGljIGZsb2F0IG9mZnNldFRvTWlkZGxl
T2ZHbHlwaEF0SW5kZXgoY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLAogCiB2b2lkIEZv
bnRDYXNjYWRlOjpkcmF3RW1waGFzaXNNYXJrcyhHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIGNv
bnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgY29uc3QgQXRvbVN0cmluZyYgbWFyaywgY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0CiB7CisgICAgQVNTRVJUKGdseXBoQnVmZmVyLmlz
RmxhdHRlbmVkKCkpOwogICAgIE9wdGlvbmFsPEdseXBoRGF0YT4gbWFya0dseXBoRGF0YSA9IGdl
dEVtcGhhc2lzTWFya0dseXBoRGF0YShtYXJrKTsKICAgICBpZiAoIW1hcmtHbHlwaERhdGEpCiAg
ICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0dseXBoQnVmZmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlw
aEJ1ZmZlci5oCmluZGV4IDkwZjdkNDc4YzI5MjBiNzA2ZjFkZWFiNzIxMTNjYjFmODc5ZGE2Y2Uu
LjE2MTAyODVkMGUyMmJkN2E2NDVhYjc1MWMyZmRjYzQ0NTA5NmE0MTYgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoQnVmZmVyLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhCdWZmZXIuaApAQCAtNTUsNyArNTUsMTAg
QEAgdHlwZWRlZiBHbHlwaCBHbHlwaEJ1ZmZlckdseXBoOwogCiBzdHJ1Y3QgR2x5cGhCdWZmZXJB
ZHZhbmNlIDogQ0dTaXplIHsKIHB1YmxpYzoKLSAgICBHbHlwaEJ1ZmZlckFkdmFuY2UoKSA6IENH
U2l6ZShDR1NpemVaZXJvKSB7IH0KKyAgICBHbHlwaEJ1ZmZlckFkdmFuY2UoKQorICAgICAgICA6
IENHU2l6ZShDR1NpemVaZXJvKQorICAgIHsKKyAgICB9CiAgICAgR2x5cGhCdWZmZXJBZHZhbmNl
KENHU2l6ZSBzaXplKQogICAgICAgICA6IENHU2l6ZShzaXplKQogICAgIHsKQEAgLTEwMywxMSAr
MTA2LDY1IEBAIE9wdGlvbmFsPEdseXBoQnVmZmVyQWR2YW5jZT4gR2x5cGhCdWZmZXJBZHZhbmNl
OjpkZWNvZGUoRGVjb2RlciYgZGVjb2RlcikKICAgICByZXR1cm4gR2x5cGhCdWZmZXJBZHZhbmNl
KENHU2l6ZU1ha2UoKndpZHRoLCAqaGVpZ2h0KSk7CiB9CiAKK3N0cnVjdCBHbHlwaEJ1ZmZlck9y
aWdpbiA6IENHUG9pbnQgeworcHVibGljOgorICAgIEdseXBoQnVmZmVyT3JpZ2luKCkKKyAgICAg
ICAgOiBDR1BvaW50KENHUG9pbnRaZXJvKQorICAgIHsKKyAgICB9CisgICAgR2x5cGhCdWZmZXJP
cmlnaW4oQ0dQb2ludCBwb2ludCkKKyAgICAgICAgOiBDR1BvaW50KHBvaW50KQorICAgIHsKKyAg
ICB9CisgICAgR2x5cGhCdWZmZXJPcmlnaW4oRmxvYXRQb2ludCBwb2ludCkKKyAgICAgICAgOiBD
R1BvaW50KHBvaW50KQorICAgIHsKKyAgICB9CisgICAgR2x5cGhCdWZmZXJPcmlnaW4oZmxvYXQg
eCwgZmxvYXQgeSkKKyAgICAgICAgOiBDR1BvaW50KENHUG9pbnRNYWtlKHgsIHkpKQorICAgIHsK
KyAgICB9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBFbmNvZGVyPiB2b2lkIGVuY29kZShFbmNvZGVy
JikgY29uc3Q7CisgICAgdGVtcGxhdGU8Y2xhc3MgRGVjb2Rlcj4gc3RhdGljIE9wdGlvbmFsPEds
eXBoQnVmZmVyT3JpZ2luPiBkZWNvZGUoRGVjb2RlciYpOworCisgICAgb3BlcmF0b3IgRmxvYXRQ
b2ludCgpIHsgcmV0dXJuIHsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRoaXMtPkNHUG9pbnQ6OngpLCBz
dGF0aWNfY2FzdDxmbG9hdD4odGhpcy0+Q0dQb2ludDo6eSkgfTsgfQorCisgICAgdm9pZCBzZXRY
KENHRmxvYXQgeCkgeyB0aGlzLT5DR1BvaW50Ojp4ID0geDsgfQorICAgIHZvaWQgc2V0WShDR0Zs
b2F0IHkpIHsgdGhpcy0+Q0dQb2ludDo6eSA9IHk7IH0KKyAgICBDR0Zsb2F0IHgoKSBjb25zdCB7
IHJldHVybiB0aGlzLT5DR1BvaW50Ojp4OyB9CisgICAgQ0dGbG9hdCB5KCkgY29uc3QgeyByZXR1
cm4gdGhpcy0+Q0dQb2ludDo6eTsgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgRW5jb2Rlcj4KK3Zv
aWQgR2x5cGhCdWZmZXJPcmlnaW46OmVuY29kZShFbmNvZGVyJiBlbmNvZGVyKSBjb25zdAorewor
ICAgIGVuY29kZXIgPDwgeCgpOworICAgIGVuY29kZXIgPDwgeSgpOworfQorCit0ZW1wbGF0ZTxj
bGFzcyBEZWNvZGVyPgorT3B0aW9uYWw8R2x5cGhCdWZmZXJPcmlnaW4+IEdseXBoQnVmZmVyT3Jp
Z2luOjpkZWNvZGUoRGVjb2RlciYgZGVjb2RlcikKK3sKKyAgICBPcHRpb25hbDxDR0Zsb2F0PiB4
OworICAgIGRlY29kZXIgPj4geDsKKyAgICBpZiAoIXgpCisgICAgICAgIHJldHVybiBXVEY6Om51
bGxvcHQ7CisKKyAgICBPcHRpb25hbDxDR0Zsb2F0PiB5OworICAgIGRlY29kZXIgPj4geTsKKyAg
ICBpZiAoIXkpCisgICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7CisKKyAgICByZXR1cm4gR2x5
cGhCdWZmZXJPcmlnaW4oQ0dQb2ludE1ha2UoKngsICp5KSk7Cit9CisKIHVzaW5nIEdseXBoQnVm
ZmVyU3RyaW5nT2Zmc2V0ID0gQ0ZJbmRleDsKIAogI2Vsc2UKIAogdXNpbmcgR2x5cGhCdWZmZXJB
ZHZhbmNlID0gRmxvYXRTaXplOwordXNpbmcgR2x5cGhCdWZmZXJPcmlnaW4gPSBGbG9hdFBvaW50
OwogdXNpbmcgR2x5cGhCdWZmZXJTdHJpbmdPZmZzZXQgPSB1bnNpZ25lZDsKIAogI2VuZGlmIC8v
ICNpZiBVU0UoQ0cpCkBAIC0xMjcsMTYgKzE4NCwxOSBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9u
dHMuY2xlYXIoKTsKICAgICAgICAgbV9nbHlwaHMuY2xlYXIoKTsKICAgICAgICAgbV9hZHZhbmNl
cy5jbGVhcigpOworICAgICAgICBtX29yaWdpbnMuY2xlYXIoKTsKICAgICAgICAgbV9vZmZzZXRz
SW5TdHJpbmcuY2xlYXIoKTsKICAgICB9CiAKICAgICBjb25zdCBGb250KiogZm9udHModW5zaWdu
ZWQgZnJvbSkgeyByZXR1cm4gbV9mb250cy5kYXRhKCkgKyBmcm9tOyB9CiAgICAgR2x5cGhCdWZm
ZXJHbHlwaCogZ2x5cGhzKHVuc2lnbmVkIGZyb20pIHsgcmV0dXJuIG1fZ2x5cGhzLmRhdGEoKSAr
IGZyb207IH0KICAgICBHbHlwaEJ1ZmZlckFkdmFuY2UqIGFkdmFuY2VzKHVuc2lnbmVkIGZyb20p
IHsgcmV0dXJuIG1fYWR2YW5jZXMuZGF0YSgpICsgZnJvbTsgfQorICAgIEdseXBoQnVmZmVyT3Jp
Z2luKiBvcmlnaW5zKHVuc2lnbmVkIGZyb20pIHsgcmV0dXJuIG1fb3JpZ2lucy5kYXRhKCkgKyBm
cm9tOyB9CiAgICAgR2x5cGhCdWZmZXJTdHJpbmdPZmZzZXQqIG9mZnNldHNJblN0cmluZyh1bnNp
Z25lZCBmcm9tKSB7IHJldHVybiBtX29mZnNldHNJblN0cmluZy5kYXRhKCkgKyBmcm9tOyB9CiAg
ICAgY29uc3QgRm9udCogY29uc3QgKiBmb250cyh1bnNpZ25lZCBmcm9tKSBjb25zdCB7IHJldHVy
biBtX2ZvbnRzLmRhdGEoKSArIGZyb207IH0KICAgICBjb25zdCBHbHlwaEJ1ZmZlckdseXBoKiBn
bHlwaHModW5zaWduZWQgZnJvbSkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHMuZGF0YSgpICsgZnJv
bTsgfQogICAgIGNvbnN0IEdseXBoQnVmZmVyQWR2YW5jZSogYWR2YW5jZXModW5zaWduZWQgZnJv
bSkgY29uc3QgeyByZXR1cm4gbV9hZHZhbmNlcy5kYXRhKCkgKyBmcm9tOyB9CisgICAgY29uc3Qg
R2x5cGhCdWZmZXJPcmlnaW4qIG9yaWdpbnModW5zaWduZWQgZnJvbSkgY29uc3QgeyByZXR1cm4g
bV9vcmlnaW5zLmRhdGEoKSArIGZyb207IH0KICAgICBjb25zdCBHbHlwaEJ1ZmZlclN0cmluZ09m
ZnNldCogb2Zmc2V0c0luU3RyaW5nKHVuc2lnbmVkIGZyb20pIGNvbnN0IHsgcmV0dXJuIG1fb2Zm
c2V0c0luU3RyaW5nLmRhdGEoKSArIGZyb207IH0KIAogICAgIGNvbnN0IEZvbnQqIGZvbnRBdCh1
bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9mb250c1tpbmRleF07IH0KQEAgLTE2MSw2
ICsyMjEsNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9udHMuYXBwZW5kKGZvbnQpOwogICAgICAg
ICBtX2dseXBocy5hcHBlbmQoZ2x5cGgpOwogICAgICAgICBtX2FkdmFuY2VzLmFwcGVuZChhZHZh
bmNlKTsKKyAgICAgICAgbV9vcmlnaW5zLmFwcGVuZChHbHlwaEJ1ZmZlck9yaWdpbigpKTsKICAg
ICAgICAgbV9vZmZzZXRzSW5TdHJpbmcuYXBwZW5kKG9mZnNldEluU3RyaW5nKTsKICAgICB9CiAK
QEAgLTE2OSw2ICsyMzAsNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9udHMucmVtb3ZlKGxvY2F0
aW9uLCBsZW5ndGgpOwogICAgICAgICBtX2dseXBocy5yZW1vdmUobG9jYXRpb24sIGxlbmd0aCk7
CiAgICAgICAgIG1fYWR2YW5jZXMucmVtb3ZlKGxvY2F0aW9uLCBsZW5ndGgpOworICAgICAgICBt
X29yaWdpbnMucmVtb3ZlKGxvY2F0aW9uLCBsZW5ndGgpOwogICAgICAgICBtX29mZnNldHNJblN0
cmluZy5yZW1vdmUobG9jYXRpb24sIGxlbmd0aCk7CiAgICAgfQogCkBAIC0xNzksNiArMjQxLDcg
QEAgcHVibGljOgogICAgICAgICBtX2ZvbnRzLmluc2VydFZlY3Rvcihsb2NhdGlvbiwgVmVjdG9y
PGNvbnN0IEZvbnQqPihsZW5ndGgsIGZvbnQpKTsKICAgICAgICAgbV9nbHlwaHMuaW5zZXJ0VmVj
dG9yKGxvY2F0aW9uLCBWZWN0b3I8R2x5cGhCdWZmZXJHbHlwaD4obGVuZ3RoLCAweEZGRkYpKTsK
ICAgICAgICAgbV9hZHZhbmNlcy5pbnNlcnRWZWN0b3IobG9jYXRpb24sIFZlY3RvcjxHbHlwaEJ1
ZmZlckFkdmFuY2U+KGxlbmd0aCwgR2x5cGhCdWZmZXJBZHZhbmNlKDAsIDApKSk7CisgICAgICAg
IG1fb3JpZ2lucy5pbnNlcnRWZWN0b3IobG9jYXRpb24sIFZlY3RvcjxHbHlwaEJ1ZmZlck9yaWdp
bj4obGVuZ3RoLCBHbHlwaEJ1ZmZlck9yaWdpbigpKSk7CiAgICAgICAgIG1fb2Zmc2V0c0luU3Ry
aW5nLmluc2VydFZlY3Rvcihsb2NhdGlvbiwgVmVjdG9yPEdseXBoQnVmZmVyU3RyaW5nT2Zmc2V0
PihsZW5ndGgsIDApKTsKICAgICB9CiAKQEAgLTIwOCw5ICsyNzEsMzYgQEAgcHVibGljOgogICAg
ICAgICBtX2ZvbnRzLnNocmluayh0cnVuY2F0aW9uUG9pbnQpOwogICAgICAgICBtX2dseXBocy5z
aHJpbmsodHJ1bmNhdGlvblBvaW50KTsKICAgICAgICAgbV9hZHZhbmNlcy5zaHJpbmsodHJ1bmNh
dGlvblBvaW50KTsKKyAgICAgICAgbV9vcmlnaW5zLnNocmluayh0cnVuY2F0aW9uUG9pbnQpOwog
ICAgICAgICBtX29mZnNldHNJblN0cmluZy5zaHJpbmsodHJ1bmNhdGlvblBvaW50KTsKICAgICB9
CiAKKyAgICAvLyBGb250Q2FzY2FkZTo6bGF5b3V0VGV4dCgpIHJldHVybnMgYSBHbHlwaEJ1ZmZl
ciB3aGljaCBpbmNsdWRlcyBsYXlvdXQgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGxpdAorICAgIC8v
IGludG8gImFkdmFuY2VzIiBhbmQgIm9yaWdpbnMiLiBTZWUgdGhlIEFTQ0lJLWFydCBkaWFncmFt
IGluIENvbXBsZXhUZXh0Q29udHJvbGxlci5oCisgICAgLy8gSW4gb3JkZXIgdG8gZ2V0IHBhaW50
IGFkdmFuY2VzLCB3ZSBuZWVkIHRvIHJ1biB0aGlzICJmbGF0dGVuIiBvcGVyYXRpb24uCisgICAg
Ly8gVGhpcyBtZXJnZXMgdGhlIGxheW91dCBhZHZhbmNlcyBhbmQgb3JpZ2lucyB0b2dldGhlciwK
KyAgICAvLyBsZWF2ZXMgdGhlIHBhaW50IGFkdmFuY2VzIGluIHRoZSAibV9hZHZhbmNlcyIgZmll
bGQsCisgICAgLy8gYW5kIHplcm9zLW91dCB0aGUgb3JpZ2lucyBpbiB0aGUgIm1fb3JpZ2lucyIg
ZmllbGQuCisgICAgdm9pZCBmbGF0dGVuKCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICAgICAgbV9hZHZhbmNlc1tpXSA9IEds
eXBoQnVmZmVyQWR2YW5jZSgKKyAgICAgICAgICAgICAgICAtbV9vcmlnaW5zW2ldLngoKSArIG1f
YWR2YW5jZXNbaV0ud2lkdGgoKSArIChpICsgMSA8IHNpemUoKSA/IG1fb3JpZ2luc1tpICsgMV0u
eCgpIDogMCksCisgICAgICAgICAgICAgICAgLW1fb3JpZ2luc1tpXS55KCkgKyBtX2FkdmFuY2Vz
W2ldLmhlaWdodCgpICsgKGkgKyAxIDwgc2l6ZSgpID8gbV9vcmlnaW5zW2kgKyAxXS55KCkgOiAw
KQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIG1fb3JpZ2luc1tpXSA9IEdseXBoQnVmZmVy
T3JpZ2luKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzRmxhdHRlbmVkKCkgY29u
c3QKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplKCk7ICsraSkg
eworICAgICAgICAgICAgaWYgKG1fb3JpZ2luc1tpXSAhPSBHbHlwaEJ1ZmZlck9yaWdpbigpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgdm9pZCBzd2FwKHVuc2lnbmVkIGluZGV4MSwg
dW5zaWduZWQgaW5kZXgyKQogICAgIHsKQEAgLTIyNiw2ICszMTYsMTAgQEAgcHJpdmF0ZToKICAg
ICAgICAgbV9hZHZhbmNlc1tpbmRleDFdID0gbV9hZHZhbmNlc1tpbmRleDJdOwogICAgICAgICBt
X2FkdmFuY2VzW2luZGV4Ml0gPSBhZHZhbmNlOwogCisgICAgICAgIEdseXBoQnVmZmVyT3JpZ2lu
IG9yaWdpbiA9IG1fb3JpZ2luc1tpbmRleDFdOworICAgICAgICBtX29yaWdpbnNbaW5kZXgxXSA9
IG1fb3JpZ2luc1tpbmRleDJdOworICAgICAgICBtX29yaWdpbnNbaW5kZXgyXSA9IG9yaWdpbjsK
KwogICAgICAgICBHbHlwaEJ1ZmZlclN0cmluZ09mZnNldCBvZmZzZXQgPSBtX29mZnNldHNJblN0
cmluZ1tpbmRleDFdOwogICAgICAgICBtX29mZnNldHNJblN0cmluZ1tpbmRleDFdID0gbV9vZmZz
ZXRzSW5TdHJpbmdbaW5kZXgyXTsKICAgICAgICAgbV9vZmZzZXRzSW5TdHJpbmdbaW5kZXgyXSA9
IG9mZnNldDsKQEAgLTIzNCw2ICszMjgsNyBAQCBwcml2YXRlOgogICAgIFZlY3Rvcjxjb25zdCBG
b250KiwgMTAyND4gbV9mb250czsKICAgICBWZWN0b3I8R2x5cGhCdWZmZXJHbHlwaCwgMTAyND4g
bV9nbHlwaHM7CiAgICAgVmVjdG9yPEdseXBoQnVmZmVyQWR2YW5jZSwgMTAyND4gbV9hZHZhbmNl
czsKKyAgICBWZWN0b3I8R2x5cGhCdWZmZXJPcmlnaW4sIDIwNDg+IG1fb3JpZ2luczsKICAgICBW
ZWN0b3I8R2x5cGhCdWZmZXJTdHJpbmdPZmZzZXQsIDEwMjQ+IG1fb2Zmc2V0c0luU3RyaW5nOwog
ICAgIEdseXBoQnVmZmVyQWR2YW5jZSBtX2luaXRpYWxBZHZhbmNlOwogfTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCmluZGV4
IGE4NGY2MjljYWE1OTRiNjM2NTBjMGMyYzQyNDZjMGEzOWI2MDJmZjguLjc1M2EzMjc2ZWY5Njg1
N2NhZWUyZmI4NDkzMDYwN2JiN2JlZTY2YWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcApAQCAtNjcxLDYgKzY3MSw3IEBA
IEZsb2F0U2l6ZSBHcmFwaGljc0NvbnRleHQ6OmRyYXdUZXh0KGNvbnN0IEZvbnRDYXNjYWRlJiBm
b250LCBjb25zdCBUZXh0UnVuJiBydW4sCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3R2x5
cGhzKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBidWZmZXIsIHVuc2lnbmVk
IGZyb20sIHVuc2lnbmVkIG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIEZvbnRT
bW9vdGhpbmdNb2RlIGZvbnRTbW9vdGhpbmdNb2RlKQogeworICAgIEFTU0VSVChidWZmZXIuaXNG
bGF0dGVuZWQoKSk7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJu
OwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5
bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5jcHAKaW5kZXggZTIyNjE3MDNlNGJj
MGI5YWFmNTA1M2IzNDdhOGZjOGYwMTA5YTQ3My4uOWUwMDcwNDM4YTcxMTE5M2U4N2RjMjllMzcy
Y2Q1MDFlYzNlMTljMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRlbXMuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdEl0ZW1zLmNwcApAQCAt
NTQzLDkgKzU0Myw4IEBAIERyYXdHbHlwaHM6On5EcmF3R2x5cGhzKCkgPSBkZWZhdWx0OwogaW5s
aW5lIEdseXBoQnVmZmVyIERyYXdHbHlwaHM6OmdlbmVyYXRlR2x5cGhCdWZmZXIoKSBjb25zdAog
ewogICAgIEdseXBoQnVmZmVyIHJlc3VsdDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
Z2x5cGhzLnNpemUoKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2dseXBo
cy5zaXplKCk7ICsraSkKICAgICAgICAgcmVzdWx0LmFkZChtX2dseXBoc1tpXSwgJm1fZm9udC5n
ZXQoKSwgbV9hZHZhbmNlc1tpXSwgR2x5cGhCdWZmZXI6Om5vT2Zmc2V0KTsKLSAgICB9CiAgICAg
cmV0dXJuIHJlc3VsdDsKIH0KIAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>405903</attachid>
            <date>2020-08-03 22:11:05 -0700</date>
            <delta_ts>2020-08-04 15:02:46 -0700</delta_ts>
            <desc>Rebased</desc>
            <filename>bug-215057-20200803221104.patch</filename>
            <type>text/plain</type>
            <size>13700</size>
            <attacher name="Myles C. Maxfield">mmaxfield</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjY1MjQxCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggN2VmODFmYWFhNzlhMTFl
NjZlODllNTk0MTE3NmZkZWYzMTRjYjg5ZS4uNTEyNWVjMzQ5ZTFlMTZmY2IwMGZmNGFhMTMxMDk2
OGRlNDJhNjAxZiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDYwIEBACisyMDIwLTA4LTAzICBNeWxl
cyBDLiBNYXhmaWVsZCAgPG1tYXhmaWVsZEBhcHBsZS5jb20+CisKKyAgICAgICAgQWRkIGdseXBo
IG9yaWdpbnMgbWVtYmVyIHRvIEdseXBoQnVmZmVyCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMTUwNTcKKworICAgICAgICBSZXZpZXdlZCBieSBEYXJp
biBBZGxlci4KKworICAgICAgICBUaGlzIGlzIGluIHByZXBhcmF0aW9uIGZvciBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE0NzY5CisgICAgICAgIGFuZCBodHRwczov
L2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjA2MjA4LgorCisgICAgICAgIFRoZSBz
b2x1dGlvbiBmb3IgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIxNDc2
OSByZXF1aXJlcyBhcHBseWluZworICAgICAgICBsZXR0ZXItc3BhY2luZyBhZnRlciB0ZXh0IHNo
YXBpbmcuIFRvZGF5LCB3ZSBhcHBseSBsZXR0ZXItc3BhY2luZyBiZWZvcmUgdGV4dAorICAgICAg
ICBzaGFwaW5nLCB3aGljaCBpcyB3cm9uZy4gSG93ZXZlciwgaWYgd2Ugd2FudCB0byBhcHBseSBs
ZXR0ZXItc3BhY2luZyBhZnRlciB0ZXh0CisgICAgICAgIHNoYXBpbmcsIHdlIG5lZWQgdG8gdXNl
IENURm9udFNoYXBlR2x5cGhzKCksIHdoaWNoIG91dHB1dHMgZ2x5cGggb3JpZ2lucyBpbgorICAg
ICAgICBhZGRpdGlvbiB0byBnbHlwaCBhZHZhbmNlcy4gQWRkaW5nIGEgZ2x5cGggb3JpZ2lucyBm
aWVsZCB0byBHbHlwaEJ1ZmZlciBhbGxvd3MgdXMKKyAgICAgICAgdG8gZmxhdHRlbiB0aGVzZSBv
cmlnaW5zIGF0IHRoZSBhcHByb3ByaWF0ZSBwbGFjZXMuCisKKyAgICAgICAgVGhpcyBwYXRjaCBp
cyBtZWFudCB0byBiZSBhcHBsaWVkIG9uIHRvcCBvZgorICAgICAgICBodHRwczovL2J1Z3Mud2Vi
a2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjE1MDUxLCB3aGljaCBkZWNyZWFzZXMgdGhlIGlubGlu
ZSBzaXplcworICAgICAgICBvZiB0aGVzZSB2ZWN0b3IgbWVtYmVycyBmcm9tIDIwNDggdG8gMTAy
NC4gSSBtZWFzdXJlZCB0aGUgbWVkaWFuIGFuZCBtZWFuIG9mIHRoZXNlCisgICAgICAgIHN0cmlu
Z3MgaW4gb3VyIFBhZ2UgTG9hZCBUZXN0IHRvIGJlIDYgYW5kIDcuNCwgd2hpY2ggaW5kaWNhdGVz
IHdlIHdlcmUgYmVpbmcgd2lsZGx5CisgICAgICAgIGluZWZmaWNpZW50IHdpdGggdGhlIG1lbWJl
cnMgb2YgR2x5cGhCdWZmZXIuIERlY3JlYXNpbmcgdGhlc2UgaW5saW5lIHNpemVzIG1lYW5zCisg
ICAgICAgIHdlJ3JlIG5vdyB1c2luZyBsZXNzIG1lbW9yeSB0aGFuIHdlIHdlcmUgYmVmb3JlLgor
CisgICAgICAgIE5vIG5ldyB0ZXN0cyBiZWNhc3VlIHRoZXJlIGlzIG5vIGJlaGF2aW9yIGNoYW5n
ZSB5ZXQuIFRoaXMgcGF0Y2gganVzdCBhZGRzIHRoZQorICAgICAgICBmaWVsZC4gVGhlIG5leHQg
cGF0Y2ggd2lsbCBob29rIHVwIENURm9udFNoYXBlR2x5cGhzKCkgaXRzZWxmLgorCisgICAgICAg
ICogcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3BwOgorICAgICAgICAoV2ViQ29yZTo6
Rm9udENhc2NhZGU6OmRyYXdUZXh0IGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkZvbnRDYXNj
YWRlOjpkcmF3RW1waGFzaXNNYXJrcyBjb25zdCk6CisgICAgICAgIChXZWJDb3JlOjpGb250Q2Fz
Y2FkZTo6ZGlzcGxheUxpc3RGb3JUZXh0UnVuIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkZv
bnRDYXNjYWRlOjpkcmF3R2x5cGhCdWZmZXIgY29uc3QpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL0dseXBoQnVmZmVyLmg6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlckFkdmFu
Y2U6OkdseXBoQnVmZmVyQWR2YW5jZSk6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlck9y
aWdpbjo6R2x5cGhCdWZmZXJPcmlnaW4pOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJP
cmlnaW46Om9wZXJhdG9yIEZsb2F0UG9pbnQpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZm
ZXJPcmlnaW46OnNldFgpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OnNl
dFkpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OnggY29uc3QpOgorICAg
ICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OnkgY29uc3QpOgorICAgICAgICAoV2Vi
Q29yZTo6R2x5cGhCdWZmZXJPcmlnaW46OmVuY29kZSBjb25zdCk6CisgICAgICAgIChXZWJDb3Jl
OjpHbHlwaEJ1ZmZlck9yaWdpbjo6ZGVjb2RlKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVm
ZmVyOjpjbGVhcik6CisgICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6b3JpZ2lucyk6Cisg
ICAgICAgIChXZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6b3JpZ2lucyBjb25zdCk6CisgICAgICAgIChX
ZWJDb3JlOjpHbHlwaEJ1ZmZlcjo6YWRkKToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVmZmVy
OjpyZW1vdmUpOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXI6Om1ha2VIb2xlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkdseXBoQnVmZmVyOjpzaHJpbmspOgorICAgICAgICAoV2ViQ29yZTo6
R2x5cGhCdWZmZXI6OmZsYXR0ZW4pOgorICAgICAgICAoV2ViQ29yZTo6R2x5cGhCdWZmZXI6Omlz
RmxhdHRlbmVkIGNvbnN0KToKKyAgICAgICAgKFdlYkNvcmU6OkdseXBoQnVmZmVyOjpzd2FwKToK
KyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwOgorICAgICAg
ICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0OjpkcmF3R2x5cGhzKToKKyAgICAgICAgKiBwbGF0
Zm9ybS9ncmFwaGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5jcHA6CisgICAgICAg
IChXZWJDb3JlOjpEaXNwbGF5TGlzdDo6RHJhd0dseXBoczo6Z2VuZXJhdGVHbHlwaEJ1ZmZlciBj
b25zdCk6CisKIDIwMjAtMDgtMDMgIE15bGVzIEMuIE1heGZpZWxkICA8bW1heGZpZWxkQGFwcGxl
LmNvbT4KIAogICAgICAgICBVbmNvbmRpdGlvbmFsbHkgcmVjb3JkIHN0cmluZyBvZmZzZXRzIGlu
IHRoZSBmYXN0IHRleHQgY29kZXBhdGgKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL0ZvbnRDYXNjYWRlLmNwcCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL0ZvbnRDYXNjYWRlLmNwcAppbmRleCBkZDg4Mzg2OGM0YTg1YWNiODUyZjdkZTMzMWRk
NTQ1NWRhNmE3MWVhLi44MGZhYmIzMmFkYmY2OWNjMWU0ODBiMTdiZDFjNjk5Yzg5ZGY0MjZjIDEw
MDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9Gb250Q2FzY2FkZS5j
cHAKKysrIGIvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvRm9udENhc2NhZGUuY3Bw
CkBAIC0yOTcsNiArMjk3LDcgQEAgRmxvYXRTaXplIEZvbnRDYXNjYWRlOjpkcmF3VGV4dChHcmFw
aGljc0NvbnRleHQmIGNvbnRleHQsIGNvbnN0IFRleHRSdW4mIHJ1biwgY28KIHsKICAgICB1bnNp
Z25lZCBkZXN0aW5hdGlvbiA9IHRvLnZhbHVlT3IocnVuLmxlbmd0aCgpKTsKICAgICBhdXRvIGds
eXBoQnVmZmVyID0gbGF5b3V0VGV4dChjb2RlUGF0aChydW4sIGZyb20sIHRvKSwgcnVuLCBmcm9t
LCBkZXN0aW5hdGlvbik7CisgICAgZ2x5cGhCdWZmZXIuZmxhdHRlbigpOwogCiAgICAgaWYgKGds
eXBoQnVmZmVyLmlzRW1wdHkoKSkKICAgICAgICAgcmV0dXJuIEZsb2F0U2l6ZSgpOwpAQCAtMzE0
LDYgKzMxNSw3IEBAIHZvaWQgRm9udENhc2NhZGU6OmRyYXdFbXBoYXNpc01hcmtzKEdyYXBoaWNz
Q29udGV4dCYgY29udGV4dCwgY29uc3QgVGV4dFJ1biYgcnVuCiAgICAgdW5zaWduZWQgZGVzdGlu
YXRpb24gPSB0by52YWx1ZU9yKHJ1bi5sZW5ndGgoKSk7CiAKICAgICBhdXRvIGdseXBoQnVmZmVy
ID0gbGF5b3V0VGV4dChjb2RlUGF0aChydW4sIGZyb20sIHRvKSwgcnVuLCBmcm9tLCBkZXN0aW5h
dGlvbiwgRm9yVGV4dEVtcGhhc2lzT3JOb3Q6OkZvclRleHRFbXBoYXNpcyk7CisgICAgZ2x5cGhC
dWZmZXIuZmxhdHRlbigpOwogCiAgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkKICAgICAg
ICAgcmV0dXJuOwpAQCAtMzMzLDYgKzMzNSw3IEBAIHN0ZDo6dW5pcXVlX3B0cjxEaXNwbGF5TGlz
dDo6RGlzcGxheUxpc3Q+IEZvbnRDYXNjYWRlOjpkaXNwbGF5TGlzdEZvclRleHRSdW4oR3JhCiAg
ICAgICAgIGNvZGVQYXRoVG9Vc2UgPSBDb21wbGV4OwogCiAgICAgYXV0byBnbHlwaEJ1ZmZlciA9
IGxheW91dFRleHQoY29kZVBhdGhUb1VzZSwgcnVuLCBmcm9tLCBkZXN0aW5hdGlvbik7CisgICAg
Z2x5cGhCdWZmZXIuZmxhdHRlbigpOwogCiAgICAgaWYgKGdseXBoQnVmZmVyLmlzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xNDQyLDcgKzE0NDUsNyBAQCBpbmxpbmUgYm9v
bCBzaG91bGREcmF3SWZMb2FkaW5nKGNvbnN0IEZvbnQmIGZvbnQsIEZvbnRDYXNjYWRlOjpDdXN0
b21Gb250Tm90UmVhZAogCiB2b2lkIEZvbnRDYXNjYWRlOjpkcmF3R2x5cGhCdWZmZXIoR3JhcGhp
Y3NDb250ZXh0JiBjb250ZXh0LCBjb25zdCBHbHlwaEJ1ZmZlciYgZ2x5cGhCdWZmZXIsIEZsb2F0
UG9pbnQmIHBvaW50LCBDdXN0b21Gb250Tm90UmVhZHlBY3Rpb24gY3VzdG9tRm9udE5vdFJlYWR5
QWN0aW9uKSBjb25zdAogewotICAgIC8vIERyYXcgZWFjaCBjb250aWd1b3VzIHJ1biBvZiBnbHlw
aHMgdGhhdCB1c2UgdGhlIHNhbWUgZm9udCBkYXRhLgorICAgIEFTU0VSVChnbHlwaEJ1ZmZlci5p
c0ZsYXR0ZW5lZCgpKTsKICAgICBjb25zdCBGb250KiBmb250RGF0YSA9IGdseXBoQnVmZmVyLmZv
bnRBdCgwKTsKICAgICBGbG9hdFBvaW50IHN0YXJ0UG9pbnQgPSBwb2ludDsKICAgICBmbG9hdCBu
ZXh0WCA9IHN0YXJ0UG9pbnQueCgpICsgZ2x5cGhCdWZmZXIuYWR2YW5jZUF0KDApLndpZHRoKCk7
CkBAIC0xNDg4LDYgKzE0OTEsNyBAQCBpbmxpbmUgc3RhdGljIGZsb2F0IG9mZnNldFRvTWlkZGxl
T2ZHbHlwaEF0SW5kZXgoY29uc3QgR2x5cGhCdWZmZXImIGdseXBoQnVmZmVyLAogCiB2b2lkIEZv
bnRDYXNjYWRlOjpkcmF3RW1waGFzaXNNYXJrcyhHcmFwaGljc0NvbnRleHQmIGNvbnRleHQsIGNv
bnN0IEdseXBoQnVmZmVyJiBnbHlwaEJ1ZmZlciwgY29uc3QgQXRvbVN0cmluZyYgbWFyaywgY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQpIGNvbnN0CiB7CisgICAgQVNTRVJUKGdseXBoQnVmZmVyLmlz
RmxhdHRlbmVkKCkpOwogICAgIE9wdGlvbmFsPEdseXBoRGF0YT4gbWFya0dseXBoRGF0YSA9IGdl
dEVtcGhhc2lzTWFya0dseXBoRGF0YShtYXJrKTsKICAgICBpZiAoIW1hcmtHbHlwaERhdGEpCiAg
ICAgICAgIHJldHVybjsKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL0dseXBoQnVmZmVyLmggYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HbHlw
aEJ1ZmZlci5oCmluZGV4IDkwZjdkNDc4YzI5MjBiNzA2ZjFkZWFiNzIxMTNjYjFmODc5ZGE2Y2Uu
LjY4N2Y5M2MxNDdkMjgxYWY1OTQxMDk3YWQzNjIyNTQ2M2FmMzU0OGUgMTAwNjQ0Ci0tLSBhL1Nv
dXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dseXBoQnVmZmVyLmgKKysrIGIvU291cmNl
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR2x5cGhCdWZmZXIuaApAQCAtNTUsNyArNTUsMTAg
QEAgdHlwZWRlZiBHbHlwaCBHbHlwaEJ1ZmZlckdseXBoOwogCiBzdHJ1Y3QgR2x5cGhCdWZmZXJB
ZHZhbmNlIDogQ0dTaXplIHsKIHB1YmxpYzoKLSAgICBHbHlwaEJ1ZmZlckFkdmFuY2UoKSA6IENH
U2l6ZShDR1NpemVaZXJvKSB7IH0KKyAgICBHbHlwaEJ1ZmZlckFkdmFuY2UoKQorICAgICAgICA6
IENHU2l6ZShDR1NpemVaZXJvKQorICAgIHsKKyAgICB9CiAgICAgR2x5cGhCdWZmZXJBZHZhbmNl
KENHU2l6ZSBzaXplKQogICAgICAgICA6IENHU2l6ZShzaXplKQogICAgIHsKQEAgLTEwMywxMSAr
MTA2LDY1IEBAIE9wdGlvbmFsPEdseXBoQnVmZmVyQWR2YW5jZT4gR2x5cGhCdWZmZXJBZHZhbmNl
OjpkZWNvZGUoRGVjb2RlciYgZGVjb2RlcikKICAgICByZXR1cm4gR2x5cGhCdWZmZXJBZHZhbmNl
KENHU2l6ZU1ha2UoKndpZHRoLCAqaGVpZ2h0KSk7CiB9CiAKK3N0cnVjdCBHbHlwaEJ1ZmZlck9y
aWdpbiA6IENHUG9pbnQgeworcHVibGljOgorICAgIEdseXBoQnVmZmVyT3JpZ2luKCkKKyAgICAg
ICAgOiBDR1BvaW50KENHUG9pbnRaZXJvKQorICAgIHsKKyAgICB9CisgICAgR2x5cGhCdWZmZXJP
cmlnaW4oQ0dQb2ludCBwb2ludCkKKyAgICAgICAgOiBDR1BvaW50KHBvaW50KQorICAgIHsKKyAg
ICB9CisgICAgR2x5cGhCdWZmZXJPcmlnaW4oRmxvYXRQb2ludCBwb2ludCkKKyAgICAgICAgOiBD
R1BvaW50KHBvaW50KQorICAgIHsKKyAgICB9CisgICAgR2x5cGhCdWZmZXJPcmlnaW4oZmxvYXQg
eCwgZmxvYXQgeSkKKyAgICAgICAgOiBDR1BvaW50KENHUG9pbnRNYWtlKHgsIHkpKQorICAgIHsK
KyAgICB9CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBFbmNvZGVyPiB2b2lkIGVuY29kZShFbmNvZGVy
JikgY29uc3Q7CisgICAgdGVtcGxhdGU8Y2xhc3MgRGVjb2Rlcj4gc3RhdGljIE9wdGlvbmFsPEds
eXBoQnVmZmVyT3JpZ2luPiBkZWNvZGUoRGVjb2RlciYpOworCisgICAgb3BlcmF0b3IgRmxvYXRQ
b2ludCgpIHsgcmV0dXJuIHsgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRoaXMtPkNHUG9pbnQ6OngpLCBz
dGF0aWNfY2FzdDxmbG9hdD4odGhpcy0+Q0dQb2ludDo6eSkgfTsgfQorCisgICAgdm9pZCBzZXRY
KENHRmxvYXQgeCkgeyB0aGlzLT5DR1BvaW50Ojp4ID0geDsgfQorICAgIHZvaWQgc2V0WShDR0Zs
b2F0IHkpIHsgdGhpcy0+Q0dQb2ludDo6eSA9IHk7IH0KKyAgICBDR0Zsb2F0IHgoKSBjb25zdCB7
IHJldHVybiB0aGlzLT5DR1BvaW50Ojp4OyB9CisgICAgQ0dGbG9hdCB5KCkgY29uc3QgeyByZXR1
cm4gdGhpcy0+Q0dQb2ludDo6eTsgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgRW5jb2Rlcj4KK3Zv
aWQgR2x5cGhCdWZmZXJPcmlnaW46OmVuY29kZShFbmNvZGVyJiBlbmNvZGVyKSBjb25zdAorewor
ICAgIGVuY29kZXIgPDwgeCgpOworICAgIGVuY29kZXIgPDwgeSgpOworfQorCit0ZW1wbGF0ZTxj
bGFzcyBEZWNvZGVyPgorT3B0aW9uYWw8R2x5cGhCdWZmZXJPcmlnaW4+IEdseXBoQnVmZmVyT3Jp
Z2luOjpkZWNvZGUoRGVjb2RlciYgZGVjb2RlcikKK3sKKyAgICBPcHRpb25hbDxDR0Zsb2F0PiB4
OworICAgIGRlY29kZXIgPj4geDsKKyAgICBpZiAoIXgpCisgICAgICAgIHJldHVybiBXVEY6Om51
bGxvcHQ7CisKKyAgICBPcHRpb25hbDxDR0Zsb2F0PiB5OworICAgIGRlY29kZXIgPj4geTsKKyAg
ICBpZiAoIXkpCisgICAgICAgIHJldHVybiBXVEY6Om51bGxvcHQ7CisKKyAgICByZXR1cm4gR2x5
cGhCdWZmZXJPcmlnaW4oQ0dQb2ludE1ha2UoKngsICp5KSk7Cit9CisKIHVzaW5nIEdseXBoQnVm
ZmVyU3RyaW5nT2Zmc2V0ID0gQ0ZJbmRleDsKIAogI2Vsc2UKIAogdXNpbmcgR2x5cGhCdWZmZXJB
ZHZhbmNlID0gRmxvYXRTaXplOwordXNpbmcgR2x5cGhCdWZmZXJPcmlnaW4gPSBGbG9hdFBvaW50
OwogdXNpbmcgR2x5cGhCdWZmZXJTdHJpbmdPZmZzZXQgPSB1bnNpZ25lZDsKIAogI2VuZGlmIC8v
ICNpZiBVU0UoQ0cpCkBAIC0xMjcsMTYgKzE4NCwxOSBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9u
dHMuY2xlYXIoKTsKICAgICAgICAgbV9nbHlwaHMuY2xlYXIoKTsKICAgICAgICAgbV9hZHZhbmNl
cy5jbGVhcigpOworICAgICAgICBtX29yaWdpbnMuY2xlYXIoKTsKICAgICAgICAgbV9vZmZzZXRz
SW5TdHJpbmcuY2xlYXIoKTsKICAgICB9CiAKICAgICBjb25zdCBGb250KiogZm9udHModW5zaWdu
ZWQgZnJvbSkgeyByZXR1cm4gbV9mb250cy5kYXRhKCkgKyBmcm9tOyB9CiAgICAgR2x5cGhCdWZm
ZXJHbHlwaCogZ2x5cGhzKHVuc2lnbmVkIGZyb20pIHsgcmV0dXJuIG1fZ2x5cGhzLmRhdGEoKSAr
IGZyb207IH0KICAgICBHbHlwaEJ1ZmZlckFkdmFuY2UqIGFkdmFuY2VzKHVuc2lnbmVkIGZyb20p
IHsgcmV0dXJuIG1fYWR2YW5jZXMuZGF0YSgpICsgZnJvbTsgfQorICAgIEdseXBoQnVmZmVyT3Jp
Z2luKiBvcmlnaW5zKHVuc2lnbmVkIGZyb20pIHsgcmV0dXJuIG1fb3JpZ2lucy5kYXRhKCkgKyBm
cm9tOyB9CiAgICAgR2x5cGhCdWZmZXJTdHJpbmdPZmZzZXQqIG9mZnNldHNJblN0cmluZyh1bnNp
Z25lZCBmcm9tKSB7IHJldHVybiBtX29mZnNldHNJblN0cmluZy5kYXRhKCkgKyBmcm9tOyB9CiAg
ICAgY29uc3QgRm9udCogY29uc3QgKiBmb250cyh1bnNpZ25lZCBmcm9tKSBjb25zdCB7IHJldHVy
biBtX2ZvbnRzLmRhdGEoKSArIGZyb207IH0KICAgICBjb25zdCBHbHlwaEJ1ZmZlckdseXBoKiBn
bHlwaHModW5zaWduZWQgZnJvbSkgY29uc3QgeyByZXR1cm4gbV9nbHlwaHMuZGF0YSgpICsgZnJv
bTsgfQogICAgIGNvbnN0IEdseXBoQnVmZmVyQWR2YW5jZSogYWR2YW5jZXModW5zaWduZWQgZnJv
bSkgY29uc3QgeyByZXR1cm4gbV9hZHZhbmNlcy5kYXRhKCkgKyBmcm9tOyB9CisgICAgY29uc3Qg
R2x5cGhCdWZmZXJPcmlnaW4qIG9yaWdpbnModW5zaWduZWQgZnJvbSkgY29uc3QgeyByZXR1cm4g
bV9vcmlnaW5zLmRhdGEoKSArIGZyb207IH0KICAgICBjb25zdCBHbHlwaEJ1ZmZlclN0cmluZ09m
ZnNldCogb2Zmc2V0c0luU3RyaW5nKHVuc2lnbmVkIGZyb20pIGNvbnN0IHsgcmV0dXJuIG1fb2Zm
c2V0c0luU3RyaW5nLmRhdGEoKSArIGZyb207IH0KIAogICAgIGNvbnN0IEZvbnQqIGZvbnRBdCh1
bnNpZ25lZCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9mb250c1tpbmRleF07IH0KQEAgLTE2MSw2
ICsyMjEsNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9udHMuYXBwZW5kKGZvbnQpOwogICAgICAg
ICBtX2dseXBocy5hcHBlbmQoZ2x5cGgpOwogICAgICAgICBtX2FkdmFuY2VzLmFwcGVuZChhZHZh
bmNlKTsKKyAgICAgICAgbV9vcmlnaW5zLmFwcGVuZChHbHlwaEJ1ZmZlck9yaWdpbigpKTsKICAg
ICAgICAgbV9vZmZzZXRzSW5TdHJpbmcuYXBwZW5kKG9mZnNldEluU3RyaW5nKTsKICAgICB9CiAK
QEAgLTE2OSw2ICsyMzAsNyBAQCBwdWJsaWM6CiAgICAgICAgIG1fZm9udHMucmVtb3ZlKGxvY2F0
aW9uLCBsZW5ndGgpOwogICAgICAgICBtX2dseXBocy5yZW1vdmUobG9jYXRpb24sIGxlbmd0aCk7
CiAgICAgICAgIG1fYWR2YW5jZXMucmVtb3ZlKGxvY2F0aW9uLCBsZW5ndGgpOworICAgICAgICBt
X29yaWdpbnMucmVtb3ZlKGxvY2F0aW9uLCBsZW5ndGgpOwogICAgICAgICBtX29mZnNldHNJblN0
cmluZy5yZW1vdmUobG9jYXRpb24sIGxlbmd0aCk7CiAgICAgfQogCkBAIC0xNzksNiArMjQxLDcg
QEAgcHVibGljOgogICAgICAgICBtX2ZvbnRzLmluc2VydFZlY3Rvcihsb2NhdGlvbiwgVmVjdG9y
PGNvbnN0IEZvbnQqPihsZW5ndGgsIGZvbnQpKTsKICAgICAgICAgbV9nbHlwaHMuaW5zZXJ0VmVj
dG9yKGxvY2F0aW9uLCBWZWN0b3I8R2x5cGhCdWZmZXJHbHlwaD4obGVuZ3RoLCAweEZGRkYpKTsK
ICAgICAgICAgbV9hZHZhbmNlcy5pbnNlcnRWZWN0b3IobG9jYXRpb24sIFZlY3RvcjxHbHlwaEJ1
ZmZlckFkdmFuY2U+KGxlbmd0aCwgR2x5cGhCdWZmZXJBZHZhbmNlKDAsIDApKSk7CisgICAgICAg
IG1fb3JpZ2lucy5pbnNlcnRWZWN0b3IobG9jYXRpb24sIFZlY3RvcjxHbHlwaEJ1ZmZlck9yaWdp
bj4obGVuZ3RoLCBHbHlwaEJ1ZmZlck9yaWdpbigpKSk7CiAgICAgICAgIG1fb2Zmc2V0c0luU3Ry
aW5nLmluc2VydFZlY3Rvcihsb2NhdGlvbiwgVmVjdG9yPEdseXBoQnVmZmVyU3RyaW5nT2Zmc2V0
PihsZW5ndGgsIDApKTsKICAgICB9CiAKQEAgLTIwOCw5ICsyNzEsMzYgQEAgcHVibGljOgogICAg
ICAgICBtX2ZvbnRzLnNocmluayh0cnVuY2F0aW9uUG9pbnQpOwogICAgICAgICBtX2dseXBocy5z
aHJpbmsodHJ1bmNhdGlvblBvaW50KTsKICAgICAgICAgbV9hZHZhbmNlcy5zaHJpbmsodHJ1bmNh
dGlvblBvaW50KTsKKyAgICAgICAgbV9vcmlnaW5zLnNocmluayh0cnVuY2F0aW9uUG9pbnQpOwog
ICAgICAgICBtX29mZnNldHNJblN0cmluZy5zaHJpbmsodHJ1bmNhdGlvblBvaW50KTsKICAgICB9
CiAKKyAgICAvLyBGb250Q2FzY2FkZTo6bGF5b3V0VGV4dCgpIHJldHVybnMgYSBHbHlwaEJ1ZmZl
ciB3aGljaCBpbmNsdWRlcyBsYXlvdXQgaW5mb3JtYXRpb24gdGhhdCBpcyBzcGxpdAorICAgIC8v
IGludG8gImFkdmFuY2VzIiBhbmQgIm9yaWdpbnMiLiBTZWUgdGhlIEFTQ0lJLWFydCBkaWFncmFt
IGluIENvbXBsZXhUZXh0Q29udHJvbGxlci5oCisgICAgLy8gSW4gb3JkZXIgdG8gZ2V0IHBhaW50
IGFkdmFuY2VzLCB3ZSBuZWVkIHRvIHJ1biB0aGlzICJmbGF0dGVuIiBvcGVyYXRpb24uCisgICAg
Ly8gVGhpcyBtZXJnZXMgdGhlIGxheW91dCBhZHZhbmNlcyBhbmQgb3JpZ2lucyB0b2dldGhlciwK
KyAgICAvLyBsZWF2ZXMgdGhlIHBhaW50IGFkdmFuY2VzIGluIHRoZSAibV9hZHZhbmNlcyIgZmll
bGQsCisgICAgLy8gYW5kIHplcm9zLW91dCB0aGUgb3JpZ2lucyBpbiB0aGUgIm1fb3JpZ2lucyIg
ZmllbGQuCisgICAgdm9pZCBmbGF0dGVuKCkKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQg
aSA9IDA7IGkgPCBzaXplKCk7ICsraSkgeworICAgICAgICAgICAgbV9hZHZhbmNlc1tpXSA9IEds
eXBoQnVmZmVyQWR2YW5jZSgKKyAgICAgICAgICAgICAgICAtbV9vcmlnaW5zW2ldLngoKSArIG1f
YWR2YW5jZXNbaV0ud2lkdGgoKSArIChpICsgMSA8IHNpemUoKSA/IG1fb3JpZ2luc1tpICsgMV0u
eCgpIDogMCksCisgICAgICAgICAgICAgICAgLW1fb3JpZ2luc1tpXS55KCkgKyBtX2FkdmFuY2Vz
W2ldLmhlaWdodCgpICsgKGkgKyAxIDwgc2l6ZSgpID8gbV9vcmlnaW5zW2kgKyAxXS55KCkgOiAw
KQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIG1fb3JpZ2luc1tpXSA9IEdseXBoQnVmZmVy
T3JpZ2luKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGlzRmxhdHRlbmVkKCkgY29u
c3QKKyAgICB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplKCk7ICsraSkg
eworICAgICAgICAgICAgaWYgKG1fb3JpZ2luc1tpXSAhPSBHbHlwaEJ1ZmZlck9yaWdpbigpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisKIHByaXZhdGU6CiAgICAgdm9pZCBzd2FwKHVuc2lnbmVkIGluZGV4MSwg
dW5zaWduZWQgaW5kZXgyKQogICAgIHsKQEAgLTIyNiw2ICszMTYsMTAgQEAgcHJpdmF0ZToKICAg
ICAgICAgbV9hZHZhbmNlc1tpbmRleDFdID0gbV9hZHZhbmNlc1tpbmRleDJdOwogICAgICAgICBt
X2FkdmFuY2VzW2luZGV4Ml0gPSBhZHZhbmNlOwogCisgICAgICAgIEdseXBoQnVmZmVyT3JpZ2lu
IG9yaWdpbiA9IG1fb3JpZ2luc1tpbmRleDFdOworICAgICAgICBtX29yaWdpbnNbaW5kZXgxXSA9
IG1fb3JpZ2luc1tpbmRleDJdOworICAgICAgICBtX29yaWdpbnNbaW5kZXgyXSA9IG9yaWdpbjsK
KwogICAgICAgICBHbHlwaEJ1ZmZlclN0cmluZ09mZnNldCBvZmZzZXQgPSBtX29mZnNldHNJblN0
cmluZ1tpbmRleDFdOwogICAgICAgICBtX29mZnNldHNJblN0cmluZ1tpbmRleDFdID0gbV9vZmZz
ZXRzSW5TdHJpbmdbaW5kZXgyXTsKICAgICAgICAgbV9vZmZzZXRzSW5TdHJpbmdbaW5kZXgyXSA9
IG9mZnNldDsKQEAgLTIzNCw2ICszMjgsNyBAQCBwcml2YXRlOgogICAgIFZlY3Rvcjxjb25zdCBG
b250KiwgMTAyND4gbV9mb250czsKICAgICBWZWN0b3I8R2x5cGhCdWZmZXJHbHlwaCwgMTAyND4g
bV9nbHlwaHM7CiAgICAgVmVjdG9yPEdseXBoQnVmZmVyQWR2YW5jZSwgMTAyND4gbV9hZHZhbmNl
czsKKyAgICBWZWN0b3I8R2x5cGhCdWZmZXJPcmlnaW4sIDEwMjQ+IG1fb3JpZ2luczsKICAgICBW
ZWN0b3I8R2x5cGhCdWZmZXJTdHJpbmdPZmZzZXQsIDEwMjQ+IG1fb2Zmc2V0c0luU3RyaW5nOwog
ICAgIEdseXBoQnVmZmVyQWR2YW5jZSBtX2luaXRpYWxBZHZhbmNlOwogfTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuY3BwCmluZGV4
IGE4NGY2MjljYWE1OTRiNjM2NTBjMGMyYzQyNDZjMGEzOWI2MDJmZjguLjc1M2EzMjc2ZWY5Njg1
N2NhZWUyZmI4NDkzMDYwN2JiN2JlZTY2YWEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmNwcApAQCAtNjcxLDYgKzY3MSw3IEBA
IEZsb2F0U2l6ZSBHcmFwaGljc0NvbnRleHQ6OmRyYXdUZXh0KGNvbnN0IEZvbnRDYXNjYWRlJiBm
b250LCBjb25zdCBUZXh0UnVuJiBydW4sCiAKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpkcmF3R2x5
cGhzKGNvbnN0IEZvbnQmIGZvbnQsIGNvbnN0IEdseXBoQnVmZmVyJiBidWZmZXIsIHVuc2lnbmVk
IGZyb20sIHVuc2lnbmVkIG51bUdseXBocywgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIEZvbnRT
bW9vdGhpbmdNb2RlIGZvbnRTbW9vdGhpbmdNb2RlKQogeworICAgIEFTU0VSVChidWZmZXIuaXNG
bGF0dGVuZWQoKSk7CiAgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKICAgICAgICAgcmV0dXJu
OwogCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9kaXNwbGF5
bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9kaXNwbGF5bGlzdHMvRGlzcGxheUxpc3RJdGVtcy5jcHAKaW5kZXggZTIyNjE3MDNlNGJj
MGI5YWFmNTA1M2IzNDdhOGZjOGYwMTA5YTQ3My4uOWUwMDcwNDM4YTcxMTE5M2U4N2RjMjllMzcy
Y2Q1MDFlYzNlMTljMCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvZGlzcGxheWxpc3RzL0Rpc3BsYXlMaXN0SXRlbXMuY3BwCisrKyBiL1NvdXJjZS9XZWJDb3Jl
L3BsYXRmb3JtL2dyYXBoaWNzL2Rpc3BsYXlsaXN0cy9EaXNwbGF5TGlzdEl0ZW1zLmNwcApAQCAt
NTQzLDkgKzU0Myw4IEBAIERyYXdHbHlwaHM6On5EcmF3R2x5cGhzKCkgPSBkZWZhdWx0OwogaW5s
aW5lIEdseXBoQnVmZmVyIERyYXdHbHlwaHM6OmdlbmVyYXRlR2x5cGhCdWZmZXIoKSBjb25zdAog
ewogICAgIEdseXBoQnVmZmVyIHJlc3VsdDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1f
Z2x5cGhzLnNpemUoKTsgKytpKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtX2dseXBo
cy5zaXplKCk7ICsraSkKICAgICAgICAgcmVzdWx0LmFkZChtX2dseXBoc1tpXSwgJm1fZm9udC5n
ZXQoKSwgbV9hZHZhbmNlc1tpXSwgR2x5cGhCdWZmZXI6Om5vT2Zmc2V0KTsKLSAgICB9CiAgICAg
cmV0dXJuIHJlc3VsdDsKIH0KIAo=
</data>

          </attachment>
      

    </bug>

</bugzilla>