<?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>22902</bug_id>
          
          <creation_ts>2008-12-17 08:16:31 -0800</creation_ts>
          <short_desc>RenderPath clean-up for strokeBoundingBox</short_desc>
          <delta_ts>2009-01-02 13:53:29 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>SVG</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Schulze">krit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>kevino</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>102776</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2008-12-17 08:16:31 -0800</bug_when>
    <thetext>Remove the platform dependent code from RenderPath to the graphics of each plaform.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102777</commentid>
    <comment_count>1</comment_count>
      <attachid>26097</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2008-12-17 08:18:53 -0800</bug_when>
    <thetext>Created attachment 26097
Move strokeBBox code to Path

move the code to Path.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102779</commentid>
    <comment_count>2</comment_count>
      <attachid>26097</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-17 08:44:35 -0800</bug_when>
    <thetext>Comment on attachment 26097
Move strokeBBox code to Path

Hi Dirk, nice patch! I&apos;ve got some comments, that lead to r-:

&gt; +
&gt; +        Move the the boundingBox code for strokes from
&gt; +        RenderPath to Path.

Should be a bit more explicit, something like &quot;Move strokeBoundingRect functionality in Path&quot;.

&gt; Index: WebCore/platform/graphics/Path.h
&gt; +    typedef void (*StyleDecoratorCallback)(GraphicsContext*, void*);

There&apos;s already a typedef for the &quot;PathApplierFunction&quot; below, you might want to move the new typedef there as well, to group the callbacks.
Though I suggested &apos;StyleDecoratorCallback&apos; the name is flawed. How about calling it &apos;PathStyleDecoratorCallback&quot;?

&gt; +        FloatRect strokeBoundingRect(StyleDecoratorCallback callBack, void* data);

You can omit the parameter name &quot;callBack&quot;, and maybe we should change the argument order, as the apply() function has the user data &quot;void* data&quot; as first argument. Better to keep it consistent.

&gt; Index: WebCore/platform/graphics/cairo/PathCairo.cpp
&gt;  
&gt; +FloatRect Path::strokeBoundingRect(StyleDecoratorCallback callBack, void* data)
&gt; +{
&gt; +    GraphicsContext gc(platformPath()-&gt;m_cr);
&gt; +    if (callBack) {
&gt; +        (*callBack)(&amp;gc, data);
&gt; +        double x0, x1, y0, y1;
&gt; +        cairo_stroke_extents(platformPath()-&gt;m_cr, &amp;x0, &amp;y0, &amp;x1, &amp;y1);
&gt; +        return FloatRect(x0, y0, x1 - x0, y1 - y0);
&gt; +    }
&gt; +    return boundingRect();
&gt; +}
&gt; +

Okay, this is a bit flawed - we should try to calculate the stroke extents, even if there is no callback set for decorating the style. Something along the lines:
GraphicsContext gc(..);
if (callBack)
     (*callBack)(&amp;gc, data);

double x0, x1....
cairo_stroke_extents(...)
return FloatRect(..);

This way we also don&apos;t need the boundingRect() fallback.
You might as well want to store platformPath()-&gt;m_cr in a local variable, to avoid calling the function twice. Not required though.


&gt; Index: WebCore/platform/graphics/cg/PathCG.cpp
  &gt; +CGContextRef inline scratchContext()
&gt; +{
&gt; +    static CGContextRef scratch = 0;
&gt; +    if (!scratch) {
&gt; +        CFMutableDataRef empty = CFDataCreateMutable(NULL, 0);
&gt; +        CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(empty);
&gt; +        scratch = CGPDFContextCreate(consumer, NULL, NULL);
&gt; +        CGDataConsumerRelease(consumer);
&gt; +        CFRelease(empty);
&gt; +
&gt; +        CGFloat black[4] = {0, 0, 0, 1};
&gt; +        CGContextSetFillColor(scratch, black);
&gt; +        CGContextSetStrokeColor(scratch, black);
&gt; +     }
&gt; +    return scratch;
&gt; +}

I&apos;d name it &apos;static inline CGContextRef&apos; - as scratchContext() is only used in this translation unit.
Please indicate the static in the variable name &quot;static CGContextRef s_contextRef = 0;&quot;.

&gt; +FloatRect Path::strokeBoundingRect(StyleDecoratorCallback callBack, void* data)
&gt; +{
&gt; +    CGContextRef context = scratchContext();
&gt; +
&gt; +    CGContextBeginPath(context);
&gt; +    CGContextAddPath(context, platformPath());
&gt; +
&gt; +    GraphicsContext gc(context);
&gt; +    if (callBack) {
&gt; +        (*callBack)(&amp;gc, data);
&gt; +        CGContextReplacePathWithStrokedPath(context);
&gt; +        if (CGContextIsPathEmpty(context))
&gt; +            return FloatRect();
&gt; +        return FloatRect(CGContextGetPathBoundingBox(context));
&gt; +    }
&gt; +    return boundingRect();
&gt; +}


We need to call CGContextSaveGState before calling CGContextBeginPath and CGContextRestoreGState after calling CGContextGetPathBoundingBox, as the scratchContext() is shared. Consecutive calls would fail at the moment.
Same comment as for Cairo, the callBack can be null, and we still should do the CGContextReplacePath... logic.

&gt; Index: WebCore/platform/graphics/qt/GraphicsContextQt.cpp
&gt; ===================================================================
&gt; --- WebCore/platform/graphics/qt/GraphicsContextQt.cpp	(revision 39303)
&gt; +++ WebCore/platform/graphics/qt/GraphicsContextQt.cpp	(working copy)
&gt; @@ -525,6 +525,12 @@ void GraphicsContext::drawConvexPolygon(
&gt;      p-&gt;restore();
&gt;  }
&gt;  
&gt; +QPen GraphicsContext::pen()
&gt; +{
&gt; +    QPainter *p = m_data-&gt;p();
&gt; +    return p-&gt;pen();
&gt; +}
&gt; +

Qt doesn&apos;t follow the style convention? If it does, please move the star.
&apos;p&apos; can never be null? Otherwhise you might want to catch that.

&gt; Index: WebCore/platform/graphics/qt/PathQt.cpp
&gt; +FloatRect Path::strokeBoundingRect(StyleDecoratorCallback callBack, void* data)
&gt; +{
&gt; +    std::auto_ptr&lt;ImageBuffer&gt; scratchImage = ImageBuffer::create(IntSize(1, 1), false);
&gt; +    GraphicsContext* gc = scratchImage-&gt;context();
&gt; +    if (callBack) {
&gt; +        (*callBack)(gc, data);
&gt; +        QPen pen = gc-&gt;pen();
&gt; +        QPainterPathStroker stroke;
&gt; +        stroke.setWidth(pen.widthF());
&gt; +        stroke.setCapStyle(pen.capStyle());
&gt; +        stroke.setJoinStyle(pen.joinStyle());
&gt; +        stroke.setMiterLimit(pen.miterLimit());
&gt; +        stroke.setDashPattern(pen.dashPattern());
&gt; +        stroke.setDashOffset(pen.dashOffset());
&gt; +        return (stroke.createStroke(*platformPath())).boundingRect();
&gt; +    }
&gt; +    return boundingRect();
&gt; +}

Ok, same comment as for Cairo/Cg, should calculate the stroke width even without a callBack passed.
Hm, aren&apos;t we supposed to create a &apos;shared&apos; scratchContext() - maybe the same abstraction as in CG is needed?
A new scratchContext() function storing the scratch context as static?
Doesn&apos;t scratchImage even leak at the moment?

&gt; Index: WebCore/rendering/RenderPath.h
&gt; ===================================================================
&gt; --- WebCore/rendering/RenderPath.h	(revision 39303)
&gt; +++ WebCore/rendering/RenderPath.h	(working copy)
&gt; @@ -31,6 +31,7 @@
&gt;  #include &quot;FloatRect.h&quot;
&gt;  
&gt;  #include &quot;RenderObject.h&quot;
&gt; +#include &quot;RenderStyle.h&quot;

A RenderStyle class forward should be enough, no?

Thanks for starting this great cleanup work, looking forward to the next patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102787</commentid>
    <comment_count>3</comment_count>
      <attachid>26098</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2008-12-17 10:44:19 -0800</bug_when>
    <thetext>Created attachment 26098
Move strokeBBox code to Path

Made most of the suggested changes. Haven&apos;t changed the coding style on GCQt to match the rest of the code, and removed RenderSytle instead of RenderObject in RenderPath.h, paintinfo needs the object.
The shared context causes a segfault on qt. Leafing std::auto_ptr&lt;ImageBuffer&gt; for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102804</commentid>
    <comment_count>4</comment_count>
      <attachid>26100</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2008-12-17 13:23:01 -0800</bug_when>
    <thetext>Created attachment 26100
Move strokeBBox code to Path

fixes some issues and style problems. Passes all Layout and pixeltests.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>102816</commentid>
    <comment_count>5</comment_count>
      <attachid>26100</attachid>
    <who name="Darin Adler">darin</who>
    <bug_when>2008-12-17 15:05:21 -0800</bug_when>
    <thetext>Comment on attachment 26100
Move strokeBBox code to Path

&gt; +    typedef void (*PathStyleDecoratorCallback) (void*, GraphicsContext*);
&gt;      typedef void (*PathApplierFunction) (void* info, const PathElement*);

It&apos;s a little weak to use these void* pointers to pass data. A more C++ style solution would be to have these decorators and appliers be objects derived from an abstract base class.

Also, we normally don&apos;t have that space between the close parenthesis and open parentheses in other source files that define function pointer types.

It seems unnecessarily inconsistent to call the data &quot;data&quot; when calling the function, &quot;info&quot; in one function type definition, and give no name in the other function type definition. I&apos;d like to see naming that made it clear the data goes with the callback. Or even better, the object design instead of the callback design.

&gt; +static inline CGContextRef scratchContext()
&gt; +{
&gt; +    static CGContextRef s_contextRef = 0;
&gt; +    if (!s_contextRef) {
&gt; +        CFMutableDataRef empty = CFDataCreateMutable(NULL, 0);
&gt; +        CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(empty);
&gt; +        s_contextRef = CGPDFContextCreate(consumer, NULL, NULL);
&gt; +        CGDataConsumerRelease(consumer);
&gt; +        CFRelease(empty);
&gt; +
&gt; +        CGFloat black[4] = {0, 0, 0, 1};
&gt; +        CGContextSetFillColor(s_contextRef, black);
&gt; +        CGContextSetStrokeColor(s_contextRef, black);
&gt; +    }
&gt; +    return s_contextRef;
&gt; +}

This seems like a long function to inline, and has an extra branch on it. Here&apos;s how I&apos;d write it:

    static CGContextRef createScratchContext()
    {
        // lots of code
        return context;
    }

    static inline CGContextRef scratchContext()
    {
        static CGContextRef context = createScratchContext();
        return context;
    }

&gt; +FloatRect Path::strokeBoundingRect(void* data, PathStyleDecoratorCallback callBack)

If &quot;callback&quot; is one word, then it should always be one word. The &quot;B&quot; should not be capitalized.

&gt; +    return FloatRect(box);

Do you need to explicitly cast to FloatRect? Won&apos;t this be converted automatically?

&gt; +    //FIXME: We should try to use a &apos;shared Context&apos; instead of creating a new ImageBuffer
&gt; +    //       on each call.

Strange formatting here.

&gt; +struct StrokeBoundingBoxData {
&gt; +    const RenderObject* object;
&gt; +    RenderStyle* style;
&gt; +};

This struct is an implementation detail that shouldn&apos;t be in a header file.

r=me as is, but please consider some of my comments</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103134</commentid>
    <comment_count>6</comment_count>
      <attachid>26187</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2008-12-21 12:28:27 -0800</bug_when>
    <thetext>Created attachment 26187
Move strokeBBox code to Path 3

third attempt</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103135</commentid>
    <comment_count>7</comment_count>
      <attachid>26187</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-21 12:40:56 -0800</bug_when>
    <thetext>Comment on attachment 26187
Move strokeBBox code to Path 3

Nice patch, overall, r- due some subtle issues:

&gt; Index: WebCore/platform/graphics/StrokeStyleApplier.h
&gt; +    class StrokeStyleApplier {
&gt; +    public:
&gt; +        virtual ~StrokeStyleApplier() {}
&gt; +        virtual void strokeStyle(GraphicsContext*) = 0;
&gt; +    };
&gt; +}

I&apos;d rather move the destructor in a protected section, and also add a constructor - protected as well.
So only the classes deriving from StrokeStyleApplier can create/destruct it.

&gt; Index: WebCore/platform/graphics/cg/PathCG.cpp
&gt; +static CGContextRef createScratchContext()
&gt; +{
&gt; +    static CGContextRef s_contextRef = 0;
&gt; +    if (!s_contextRef) {
&gt; +        CFMutableDataRef empty = CFDataCreateMutable(NULL, 0);
&gt; +        CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(empty);
&gt; +        s_contextRef = CGPDFContextCreate(consumer, NULL, NULL);
&gt; +        CGDataConsumerRelease(consumer);
&gt; +        CFRelease(empty);
&gt; +
&gt; +        CGFloat black[4] = {0, 0, 0, 1};
&gt; +        CGContextSetFillColor(s_contextRef, black);
&gt; +        CGContextSetStrokeColor(s_contextRef, black);
&gt; +    }
&gt; +    return s_contextRef;
&gt; +}
I think, what Darin intented is to have a createScratchContext() class that only creates the CGContextRef, it is not supposed to store it.
So just rename &quot;static CGContextRef s_contextRef&quot; -&gt; &quot;CGContextRef contextRef&quot;, and return that.

&gt; Index: WebCore/rendering/RenderPath.cpp
&gt; +class StrokeBoundingRectStyleApplier : public StrokeStyleApplier {

Sorry that I suggested this bad name :-) I think &quot;StrokeStyle&quot; should remain as one word, so &quot;BoundingRectStrokeStyleApplier&quot; may sounds a bit more approriate.
Can you clean the review flag of the patch Darin already r+ed?

Keen to review the final version :-)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103136</commentid>
    <comment_count>8</comment_count>
      <attachid>26188</attachid>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2008-12-21 12:55:57 -0800</bug_when>
    <thetext>Created attachment 26188
Move strokeBBox code to Path 4

last version?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103142</commentid>
    <comment_count>9</comment_count>
      <attachid>26188</attachid>
    <who name="Nikolas Zimmermann">zimmermann</who>
    <bug_when>2008-12-21 15:14:14 -0800</bug_when>
    <thetext>Comment on attachment 26188
Move strokeBBox code to Path 4

This looks perfectly fine, r=me. Please fix two issues, before landing:

&gt; Index: WebCore/platform/graphics/StrokeStyleApplier.h
&gt; +
&gt; +    protected:
&gt; +        virtual ~StrokeStyleApplier() {}
Also add a protected constructor: &quot;StrokeStyleApplier() {}&quot; here.

&gt; Index: WebCore/platform/graphics/cg/PathCG.cpp
&gt; +static CGContextRef createScratchContext()
&gt; +{
&gt; +    CGContextRef contextRef = 0;
&gt; +    if (!contextRef) {
&gt; +        CFMutableDataRef empty = CFDataCreateMutable(NULL, 0);
&gt; +        CGDataConsumerRef consumer = CGDataConsumerCreateWithCFData(empty);
&gt; +        contextRef = CGPDFContextCreate(consumer, NULL, NULL);
&gt; +        CGDataConsumerRelease(consumer);
&gt; +        CFRelease(empty);
&gt; +
&gt; +        CGFloat black[4] = {0, 0, 0, 1};
&gt; +        CGContextSetFillColor(contextRef, black);
&gt; +        CGContextSetStrokeColor(contextRef, black);
&gt; +    }
&gt; +    return contextRef;
&gt; +}

The if (!contextRef) case should be removed, it&apos;s always true.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>103155</commentid>
    <comment_count>10</comment_count>
    <who name="Dirk Schulze">krit</who>
    <bug_when>2008-12-21 22:47:24 -0800</bug_when>
    <thetext>landed in r39427.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104172</commentid>
    <comment_count>11</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-01-02 13:39:51 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; landed in r39427.

http://trac.webkit.org/changeset/39427

This broke the WX build.

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104173</commentid>
    <comment_count>12</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-01-02 13:40:33 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; This broke the WX build.

http://build.webkit.org/waterfall

</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>104174</commentid>
    <comment_count>13</comment_count>
    <who name="David Kilzer (:ddkilzer)">ddkilzer</who>
    <bug_when>2009-01-02 13:53:29 -0800</bug_when>
    <thetext>(In reply to comment #11)
&gt; (In reply to comment #10)
&gt; &gt; landed in r39427.
&gt; 
&gt; http://trac.webkit.org/changeset/39427
&gt; 
&gt; This broke the WX build.

Added stub implementation:

$ git svn dcommit
Committing to http://svn.webkit.org/repository/webkit/trunk ...
	M	WebCore/ChangeLog
	M	WebCore/platform/graphics/wx/PathWx.cpp
Committed r39560

http://trac.webkit.org/changeset/39560

</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26097</attachid>
            <date>2008-12-17 08:18:53 -0800</date>
            <delta_ts>2008-12-17 10:44:19 -0800</delta_ts>
            <desc>Move strokeBBox code to Path</desc>
            <filename>renderpath-1.patch</filename>
            <type>text/plain</type>
            <size>13437</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTM1OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMDgtMTItMTcgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3Zl
IHRoZSB0aGUgYm91bmRpbmdCb3ggY29kZSBmb3Igc3Ryb2tlcyBmcm9tCisgICAgICAgIFJlbmRl
clBhdGggdG8gUGF0aC4KKworICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29u
dGV4dC5oOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL1BhdGguaDoKKyAgICAgICAgKiBw
bGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QYXRoQ2Fpcm8uY3BwOgorICAgICAgICAoV2ViQ29yZTo6
UGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9j
Zy9QYXRoQ0cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6c2NyYXRjaENvbnRleHQpOgorICAgICAg
ICAoV2ViQ29yZTo6UGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9y
bS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpH
cmFwaGljc0NvbnRleHQ6OnBlbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvUGF0
aFF0LmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6Cisg
ICAgICAgICogcmVuZGVyaW5nL1JlbmRlclBhdGguY3BwOgorICAgICAgICAoV2ViQ29yZTo6c3Ry
b2tlU3R5bGVDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJQYXRoOjpyZWxhdGl2
ZUJCb3gpOgorICAgICAgICAqIHJlbmRlcmluZy9SZW5kZXJQYXRoLmg6CisgICAgICAgICogc3Zn
L2dyYXBoaWNzL2NhaXJvL1JlbmRlclBhdGhDYWlyby5jcHA6CisgICAgICAgICogc3ZnL2dyYXBo
aWNzL2NnL1JlbmRlclBhdGhDZy5jcHA6CisgICAgICAgICogc3ZnL2dyYXBoaWNzL3F0L1JlbmRl
clBhdGhRdC5jcHA6CisKIDIwMDgtMTItMTYgIERhcmluIEFkbGVyICA8ZGFyaW5AYXBwbGUuY29t
PgogCiAgICAgICAgIFJldmlld2VkIGFuZCBsYW5kZWQgYnkgQ2FtZXJvbiBad2FyaWNoLgpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCShyZXZpc2lv
biAzOTMwMykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgJ
KHdvcmtpbmcgY29weSkKQEAgLTMxMiw2ICszMTIsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAj
aWYgUExBVEZPUk0oUVQpCiAgICAgICAgIGJvb2wgaW5UcmFuc3BhcmVuY3lMYXllcigpIGNvbnN0
OwogICAgICAgICBQbGF0Zm9ybVBhdGgqIGN1cnJlbnRQYXRoKCk7CisgICAgICAgIFFQZW4gcGVu
KCk7CiAjZW5kaWYKIAogI2lmIFBMQVRGT1JNKEdUSykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvUGF0aC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
UGF0aC5oCShyZXZpc2lvbiAzOTMwMykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0
aC5oCSh3b3JraW5nIGNvcHkpCkBAIC01Niw4ICs1NiwxMSBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAgICAgY2xhc3MgRmxvYXRQb2ludDsKICAgICBjbGFzcyBGbG9hdFNpemU7CiAgICAgY2xhc3Mg
RmxvYXRSZWN0OworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKICAgICBjbGFzcyBTdHJpbmc7
CiAKKyAgICB0eXBlZGVmIHZvaWQgKCpTdHlsZURlY29yYXRvckNhbGxiYWNrKShHcmFwaGljc0Nv
bnRleHQqLCB2b2lkKik7CisKICAgICBlbnVtIFdpbmRSdWxlIHsKICAgICAgICAgUlVMRV9OT05a
RVJPID0gMCwKICAgICAgICAgUlVMRV9FVkVOT0REID0gMQpAQCAtODgsNiArOTEsNyBAQCBuYW1l
c3BhY2UgV2ViQ29yZSB7CiAKICAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCBGbG9hdFBvaW50
JiwgV2luZFJ1bGUgcnVsZSA9IFJVTEVfTk9OWkVSTykgY29uc3Q7CiAgICAgICAgIEZsb2F0UmVj
dCBib3VuZGluZ1JlY3QoKSBjb25zdDsKKyAgICAgICAgRmxvYXRSZWN0IHN0cm9rZUJvdW5kaW5n
UmVjdChTdHlsZURlY29yYXRvckNhbGxiYWNrIGNhbGxCYWNrLCB2b2lkKiBkYXRhKTsKICAgICAg
ICAgCiAgICAgICAgIGZsb2F0IGxlbmd0aCgpOwogICAgICAgICBGbG9hdFBvaW50IHBvaW50QXRM
ZW5ndGgoZmxvYXQgbGVuZ3RoLCBib29sJiBvayk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2NhaXJvL1BhdGhDYWlyby5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jYWlyby9QYXRoQ2Fpcm8uY3BwCShyZXZpc2lvbiAzOTMwMykKKysrIFdlYkNv
cmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vUGF0aENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpA
QCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUg
IkNhaXJvUGF0aC5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgogI2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGxhdGZv
cm1TdHJpbmcuaCIKIApAQCAtMTg4LDYgKzE4OSwxOCBAQCBGbG9hdFJlY3QgUGF0aDo6Ym91bmRp
bmdSZWN0KCkgY29uc3QKICAgICByZXR1cm4gRmxvYXRSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEg
LSB5MCk7CiB9CiAKK0Zsb2F0UmVjdCBQYXRoOjpzdHJva2VCb3VuZGluZ1JlY3QoU3R5bGVEZWNv
cmF0b3JDYWxsYmFjayBjYWxsQmFjaywgdm9pZCogZGF0YSkKK3sKKyAgICBHcmFwaGljc0NvbnRl
eHQgZ2MocGxhdGZvcm1QYXRoKCktPm1fY3IpOworICAgIGlmIChjYWxsQmFjaykgeworICAgICAg
ICAoKmNhbGxCYWNrKSgmZ2MsIGRhdGEpOworICAgICAgICBkb3VibGUgeDAsIHgxLCB5MCwgeTE7
CisgICAgICAgIGNhaXJvX3N0cm9rZV9leHRlbnRzKHBsYXRmb3JtUGF0aCgpLT5tX2NyLCAmeDAs
ICZ5MCwgJngxLCAmeTEpOworICAgICAgICByZXR1cm4gRmxvYXRSZWN0KHgwLCB5MCwgeDEgLSB4
MCwgeTEgLSB5MCk7CisgICAgfQorICAgIHJldHVybiBib3VuZGluZ1JlY3QoKTsKK30KKwogYm9v
bCBQYXRoOjpjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkg
Y29uc3QKIHsKICAgICBpZiAoIWJvdW5kaW5nUmVjdCgpLmNvbnRhaW5zKHBvaW50KSkKSW5kZXg6
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGF0aENHLmNwcAo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL1BhdGhDRy5jcHAJKHJldmlzaW9uIDM5MzAzKQor
KysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9QYXRoQ0cuY3BwCSh3b3JraW5nIGNvcHkp
CkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVk
ZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAjaW5jbHVkZSAi
RmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW50
UmVjdC5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAKQEAgLTYyLDYgKzYzLDIyIEBA
IFBhdGgmIFBhdGg6Om9wZXJhdG9yPShjb25zdCBQYXRoJiBvdGhlcikKICAgICByZXR1cm4gKnRo
aXM7CiB9CiAKK0NHQ29udGV4dFJlZiBpbmxpbmUgc2NyYXRjaENvbnRleHQoKQoreworICAgIHN0
YXRpYyBDR0NvbnRleHRSZWYgc2NyYXRjaCA9IDA7CisgICAgaWYgKCFzY3JhdGNoKSB7CisgICAg
ICAgIENGTXV0YWJsZURhdGFSZWYgZW1wdHkgPSBDRkRhdGFDcmVhdGVNdXRhYmxlKE5VTEwsIDAp
OworICAgICAgICBDR0RhdGFDb25zdW1lclJlZiBjb25zdW1lciA9IENHRGF0YUNvbnN1bWVyQ3Jl
YXRlV2l0aENGRGF0YShlbXB0eSk7CisgICAgICAgIHNjcmF0Y2ggPSBDR1BERkNvbnRleHRDcmVh
dGUoY29uc3VtZXIsIE5VTEwsIE5VTEwpOworICAgICAgICBDR0RhdGFDb25zdW1lclJlbGVhc2Uo
Y29uc3VtZXIpOworICAgICAgICBDRlJlbGVhc2UoZW1wdHkpOworCisgICAgICAgIENHRmxvYXQg
YmxhY2tbNF0gPSB7MCwgMCwgMCwgMX07CisgICAgICAgIENHQ29udGV4dFNldEZpbGxDb2xvcihz
Y3JhdGNoLCBibGFjayk7CisgICAgICAgIENHQ29udGV4dFNldFN0cm9rZUNvbG9yKHNjcmF0Y2gs
IGJsYWNrKTsKKyAgICAgfQorICAgIHJldHVybiBzY3JhdGNoOworfQogCiBzdGF0aWMgdm9pZCBj
b3B5Q2xvc2luZ1N1YnBhdGhzQXBwbGllckZ1bmN0aW9uKHZvaWQqIGluZm8sIGNvbnN0IENHUGF0
aEVsZW1lbnQqIGVsZW1lbnQpCiB7CkBAIC0xMjMsNiArMTQwLDI0IEBAIEZsb2F0UmVjdCBQYXRo
Ojpib3VuZGluZ1JlY3QoKSBjb25zdAogICAgIHJldHVybiBDR1BhdGhHZXRCb3VuZGluZ0JveCht
X3BhdGgpOwogfQogCitGbG9hdFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0eWxlRGVj
b3JhdG9yQ2FsbGJhY2sgY2FsbEJhY2ssIHZvaWQqIGRhdGEpCit7CisgICAgQ0dDb250ZXh0UmVm
IGNvbnRleHQgPSBzY3JhdGNoQ29udGV4dCgpOworCisgICAgQ0dDb250ZXh0QmVnaW5QYXRoKGNv
bnRleHQpOworICAgIENHQ29udGV4dEFkZFBhdGgoY29udGV4dCwgcGxhdGZvcm1QYXRoKCkpOwor
CisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNvbnRleHQpOworICAgIGlmIChjYWxsQmFjaykgewor
ICAgICAgICAoKmNhbGxCYWNrKSgmZ2MsIGRhdGEpOworICAgICAgICBDR0NvbnRleHRSZXBsYWNl
UGF0aFdpdGhTdHJva2VkUGF0aChjb250ZXh0KTsKKyAgICAgICAgaWYgKENHQ29udGV4dElzUGF0
aEVtcHR5KGNvbnRleHQpKQorICAgICAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworICAgICAg
ICByZXR1cm4gRmxvYXRSZWN0KENHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveChjb250ZXh0KSk7
CisgICAgfQorICAgIHJldHVybiBib3VuZGluZ1JlY3QoKTsKK30KKwogdm9pZCBQYXRoOjptb3Zl
VG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCiB7CiAgICAgQ0dQYXRoTW92ZVRvUG9pbnQobV9w
YXRoLCAwLCBwb2ludC54KCksIHBvaW50LnkoKSk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3F0L0dyYXBoaWNzQ29udGV4dFF0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzQ29udGV4dFF0LmNwcAkocmV2aXNpb24gMzkzMDMp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L0dyYXBoaWNzQ29udGV4dFF0LmNwcAko
d29ya2luZyBjb3B5KQpAQCAtNTI1LDYgKzUyNSwxMiBAQCB2b2lkIEdyYXBoaWNzQ29udGV4dDo6
ZHJhd0NvbnZleFBvbHlnb24oCiAgICAgcC0+cmVzdG9yZSgpOwogfQogCitRUGVuIEdyYXBoaWNz
Q29udGV4dDo6cGVuKCkKK3sKKyAgICBRUGFpbnRlciAqcCA9IG1fZGF0YS0+cCgpOworICAgIHJl
dHVybiBwLT5wZW4oKTsKK30KKwogdm9pZCBHcmFwaGljc0NvbnRleHQ6OmZpbGxQYXRoKCkKIHsK
ICAgICBpZiAocGFpbnRpbmdEaXNhYmxlZCgpKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9QYXRoUXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvcXQvUGF0aFF0LmNwcAkocmV2aXNpb24gMzkzMDMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL3F0L1BhdGhRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI5LDkgKzI5LDExIEBACiAj
aW5jbHVkZSAiY29uZmlnLmgiCiAjaW5jbHVkZSAiUGF0aC5oIgogCisjaW5jbHVkZSAiQWZmaW5l
VHJhbnNmb3JtLmgiCiAjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3ND
b250ZXh0LmgiCisjaW5jbHVkZSAiSW1hZ2VCdWZmZXIuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0
cmluZy5oIgotI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgPFFQYWludGVy
UGF0aD4KICNpbmNsdWRlIDxRTWF0cml4PgogI2luY2x1ZGUgPFFTdHJpbmc+CkBAIC05Myw2ICs5
NSwyNSBAQCBGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKICAgICByZXR1cm4g
bV9wYXRoLT5ib3VuZGluZ1JlY3QoKTsKIH0KIAorRmxvYXRSZWN0IFBhdGg6OnN0cm9rZUJvdW5k
aW5nUmVjdChTdHlsZURlY29yYXRvckNhbGxiYWNrIGNhbGxCYWNrLCB2b2lkKiBkYXRhKQorewor
ICAgIHN0ZDo6YXV0b19wdHI8SW1hZ2VCdWZmZXI+IHNjcmF0Y2hJbWFnZSA9IEltYWdlQnVmZmVy
OjpjcmVhdGUoSW50U2l6ZSgxLCAxKSwgZmFsc2UpOworICAgIEdyYXBoaWNzQ29udGV4dCogZ2Mg
PSBzY3JhdGNoSW1hZ2UtPmNvbnRleHQoKTsKKyAgICBpZiAoY2FsbEJhY2spIHsKKyAgICAgICAg
KCpjYWxsQmFjaykoZ2MsIGRhdGEpOworICAgICAgICBRUGVuIHBlbiA9IGdjLT5wZW4oKTsKKyAg
ICAgICAgUVBhaW50ZXJQYXRoU3Ryb2tlciBzdHJva2U7CisgICAgICAgIHN0cm9rZS5zZXRXaWR0
aChwZW4ud2lkdGhGKCkpOworICAgICAgICBzdHJva2Uuc2V0Q2FwU3R5bGUocGVuLmNhcFN0eWxl
KCkpOworICAgICAgICBzdHJva2Uuc2V0Sm9pblN0eWxlKHBlbi5qb2luU3R5bGUoKSk7CisgICAg
ICAgIHN0cm9rZS5zZXRNaXRlckxpbWl0KHBlbi5taXRlckxpbWl0KCkpOworICAgICAgICBzdHJv
a2Uuc2V0RGFzaFBhdHRlcm4ocGVuLmRhc2hQYXR0ZXJuKCkpOworICAgICAgICBzdHJva2Uuc2V0
RGFzaE9mZnNldChwZW4uZGFzaE9mZnNldCgpKTsKKyAgICAgICAgcmV0dXJuIChzdHJva2UuY3Jl
YXRlU3Ryb2tlKCpwbGF0Zm9ybVBhdGgoKSkpLmJvdW5kaW5nUmVjdCgpOworICAgIH0KKyAgICBy
ZXR1cm4gYm91bmRpbmdSZWN0KCk7Cit9CisKIHZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0
UG9pbnQmIHBvaW50KQogewogICAgIG1fcGF0aC0+bW92ZVRvKHBvaW50KTsKSW5kZXg6IFdlYkNv
cmUvcmVuZGVyaW5nL1JlbmRlclBhdGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlclBhdGguY3BwCShyZXZpc2lvbiAzOTMwMykKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclBhdGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MywxNCArODMsMjggQEAgYm9vbCBS
ZW5kZXJQYXRoOjpmaWxsQ29udGFpbnMoY29uc3QgRmxvYQogICAgIHJldHVybiBtX3BhdGguY29u
dGFpbnMocG9pbnQsIHN0eWxlKCktPnN2Z1N0eWxlKCktPmZpbGxSdWxlKCkpOwogfQogCitzdGF0
aWMgdm9pZCBzdHJva2VTdHlsZUNhbGxiYWNrKEdyYXBoaWNzQ29udGV4dCogZ2MsIHZvaWQqIGRh
dGEpCit7CisgICAgU3Ryb2tlQm91bmRpbmdCb3hEYXRhKiBiYm94RGF0YSA9IHN0YXRpY19jYXN0
PFN0cm9rZUJvdW5kaW5nQm94RGF0YSo+KGRhdGEpOworICAgIEFTU0VSVChiYm94RGF0YSk7CisK
KyAgICBhcHBseVN0cm9rZVN0eWxlVG9Db250ZXh0KGdjLCBiYm94RGF0YS0+c3R5bGUsIGJib3hE
YXRhLT5vYmplY3QpOworfQorCiBGbG9hdFJlY3QgUmVuZGVyUGF0aDo6cmVsYXRpdmVCQm94KGJv
b2wgaW5jbHVkZVN0cm9rZSkgY29uc3QKIHsKICAgICBpZiAobV9wYXRoLmlzRW1wdHkoKSkKICAg
ICAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOwogCiAgICAgaWYgKGluY2x1ZGVTdHJva2UpIHsKLSAg
ICAgICAgaWYgKG1fc3Ryb2tlQmJveC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBtX3N0cm9rZUJi
b3ggPSBzdHJva2VCQm94KCk7CisgICAgICAgIGlmIChtX3N0cm9rZUJib3guaXNFbXB0eSgpKSB7
CisgICAgICAgICAgICBpZiAoc3R5bGUoKS0+c3ZnU3R5bGUoKS0+aGFzU3Ryb2tlKCkpIHsKKyAg
ICAgICAgICAgICAgICBTdHJva2VCb3VuZGluZ0JveERhdGEgZGF0YSA9IHsgdGhpcywgc3R5bGUo
KSB9OworICAgICAgICAgICAgICAgIG1fc3Ryb2tlQmJveCA9IG1fcGF0aC5zdHJva2VCb3VuZGlu
Z1JlY3QoJnN0cm9rZVN0eWxlQ2FsbGJhY2ssIHN0YXRpY19jYXN0PHZvaWQqPigmZGF0YSkpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG1fc3Ryb2tl
QmJveCA9IG1fcGF0aC5ib3VuZGluZ1JlY3QoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHJldHVy
biBtX3N0cm9rZUJib3g7CiAgICAgfQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUGF0
aC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclBhdGguaAkocmV2aXNp
b24gMzkzMDMpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJQYXRoLmgJKHdvcmtpbmcgY29w
eSkKQEAgLTMxLDYgKzMxLDcgQEAKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKIAogI2luY2x1ZGUg
IlJlbmRlck9iamVjdC5oIgorI2luY2x1ZGUgIlJlbmRlclN0eWxlLmgiCiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIApAQCAtMzksNiArNDAsMTEgQEAgY2xhc3MgUGF0aDsKIGNsYXNzIFJlbmRlclNW
R0NvbnRhaW5lcjsKIGNsYXNzIFNWR1N0eWxlZFRyYW5zZm9ybWFibGVFbGVtZW50OwogCitzdHJ1
Y3QgU3Ryb2tlQm91bmRpbmdCb3hEYXRhIHsKKyAgICBjb25zdCBSZW5kZXJPYmplY3QqIG9iamVj
dDsKKyAgICBSZW5kZXJTdHlsZSogc3R5bGU7Cit9OworCiBjbGFzcyBSZW5kZXJQYXRoIDogcHVi
bGljIFJlbmRlck9iamVjdAogewogcHVibGljOgpAQCAtNDYsOCArNTIsOCBAQCBwdWJsaWM6CiAg
ICAgdmlydHVhbCB+UmVuZGVyUGF0aCgpOwogCiAgICAgLy8gSGl0LWRldGVjdGlvbiBzZXBlcmF0
ZWQgZm9yIHRoZSBmaWxsIGFuZCB0aGUgc3Ryb2tlCi0gICAgdmlydHVhbCBib29sIGZpbGxDb250
YWlucyhjb25zdCBGbG9hdFBvaW50JiwgYm9vbCByZXF1aXJlc0ZpbGwgPSB0cnVlKSBjb25zdDsK
LSAgICB2aXJ0dWFsIGJvb2wgc3Ryb2tlQ29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYsIGJvb2wg
cmVxdWlyZXNTdHJva2UgPSB0cnVlKSBjb25zdDsKKyAgICBib29sIGZpbGxDb250YWlucyhjb25z
dCBGbG9hdFBvaW50JiwgYm9vbCByZXF1aXJlc0ZpbGwgPSB0cnVlKSBjb25zdDsKKyAgICBib29s
IHN0cm9rZUNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmLCBib29sIHJlcXVpcmVzU3Ryb2tlID0g
dHJ1ZSkgY29uc3Q7CiAKICAgICAvLyBSZXR1cm5zIGFuIHVuc2NhbGVkIGJvdW5kaW5nIGJveCAo
bm90IGV2ZW4gaW5jbHVkaW5nIGxvY2FsVHJhbnNmb3JtKCkpIGZvciB0aGlzIHZlY3RvciBwYXRo
CiAgICAgdmlydHVhbCBGbG9hdFJlY3QgcmVsYXRpdmVCQm94KGJvb2wgaW5jbHVkZVN0cm9rZSA9
IHRydWUpIGNvbnN0OwpAQCAtNzUsNyArODEsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29s
IG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4
LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24pOwogCiAgICAgRmxvYXRSZWN0
IGRyYXdNYXJrZXJzSWZOZWVkZWQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0Jiwg
Y29uc3QgUGF0aCYpIGNvbnN0OwotICAgIHZpcnR1YWwgRmxvYXRSZWN0IHN0cm9rZUJCb3goKSBj
b25zdDsKICAgICAKIHByaXZhdGU6CiAgICAgRmxvYXRQb2ludCBtYXBBYnNvbHV0ZVBvaW50VG9M
b2NhbChjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7CkluZGV4OiBXZWJDb3JlL3N2Zy9ncmFwaGlj
cy9jYWlyby9SZW5kZXJQYXRoQ2Fpcm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3ZnL2dy
YXBoaWNzL2NhaXJvL1JlbmRlclBhdGhDYWlyby5jcHAJKHJldmlzaW9uIDM5MzAzKQorKysgV2Vi
Q29yZS9zdmcvZ3JhcGhpY3MvY2Fpcm8vUmVuZGVyUGF0aENhaXJvLmNwcAkod29ya2luZyBjb3B5
KQpAQCAtMzYsMTcgKzM2LDQgQEAgYm9vbCBSZW5kZXJQYXRoOjpzdHJva2VDb250YWlucyhjb25z
dCBGbAogICAgIHJldHVybiBjYWlyb19pbl9zdHJva2UoY3IsIHBvaW50LngoKSwgcG9pbnQueSgp
KTsKIH0KIAotRmxvYXRSZWN0IFJlbmRlclBhdGg6OnN0cm9rZUJCb3goKSBjb25zdAotewotICAg
IC8vIFRPRE86IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbmFpdmUKLQotICAgIGNhaXJvX3QqIGNy
ID0gcGF0aCgpLnBsYXRmb3JtUGF0aCgpLT5tX2NyOwotCi0gICAgZG91YmxlIHgwLCB4MSwgeTAs
IHkxOwotICAgIGNhaXJvX3N0cm9rZV9leHRlbnRzKGNyLCAmeDAsICZ5MCwgJngxLCAmeTEpOwot
ICAgIEZsb2F0UmVjdCBiYm94ID0gRmxvYXRSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7
Ci0KLSAgICByZXR1cm4gYmJveDsKLX0KLQogfQpJbmRleDogV2ViQ29yZS9zdmcvZ3JhcGhpY3Mv
Y2cvUmVuZGVyUGF0aENnLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9ncmFwaGljcy9j
Zy9SZW5kZXJQYXRoQ2cuY3BwCShyZXZpc2lvbiAzOTMwMykKKysrIFdlYkNvcmUvc3ZnL2dyYXBo
aWNzL2NnL1JlbmRlclBhdGhDZy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQwLDE1ICs0MCw2IEBA
CiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotRmxvYXRSZWN0IFJlbmRlclBhdGg6OnN0cm9rZUJC
b3goKSBjb25zdAotewotICAgIGlmIChzdHlsZSgpLT5zdmdTdHlsZSgpLT5oYXNTdHJva2UoKSkK
LSAgICAgICAgcmV0dXJuIHN0cm9rZUJvdW5kaW5nQm94KHBhdGgoKSwgc3R5bGUoKSwgdGhpcyk7
Ci0KLSAgICByZXR1cm4gcGF0aCgpLmJvdW5kaW5nUmVjdCgpOwotfQotCi0KIGJvb2wgUmVuZGVy
UGF0aDo6c3Ryb2tlQ29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIGJvb2wgcmVxdWly
ZXNTdHJva2UpIGNvbnN0CiB7CiAgICAgaWYgKHBhdGgoKS5pc0VtcHR5KCkpCkluZGV4OiBXZWJD
b3JlL3N2Zy9ncmFwaGljcy9xdC9SZW5kZXJQYXRoUXQuY3BwCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNv
cmUvc3ZnL2dyYXBoaWNzL3F0L1JlbmRlclBhdGhRdC5jcHAJKHJldmlzaW9uIDM5MzAzKQorKysg
V2ViQ29yZS9zdmcvZ3JhcGhpY3MvcXQvUmVuZGVyUGF0aFF0LmNwcAkod29ya2luZyBjb3B5KQpA
QCAtNDIsNDggKzQyLDYgQEAgYm9vbCBSZW5kZXJQYXRoOjpzdHJva2VDb250YWlucyhjb25zdCBG
bAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIFFQYWludGVyUGF0aCBnZXRQYXRoU3Ry
b2tlKGNvbnN0IFFQYWludGVyUGF0aCAmcGF0aCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvYmplY3Qs
IGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSkKLXsgCi0gICAgUVBhaW50ZXJQYXRoU3Ryb2tlciBz
OwotICAgIHMuc2V0V2lkdGgoU1ZHUmVuZGVyU3R5bGU6OmNzc1ByaW1pdGl2ZVRvTGVuZ3RoKG9i
amVjdCwgc3R5bGUtPnN2Z1N0eWxlKCktPnN0cm9rZVdpZHRoKCksIDEuMCkpOwotCi0gICAgaWYg
KHN0eWxlLT5zdmdTdHlsZSgpLT5jYXBTdHlsZSgpID09IEJ1dHRDYXApCi0gICAgICAgIHMuc2V0
Q2FwU3R5bGUoUXQ6OkZsYXRDYXApOwotICAgIGVsc2UgaWYgKHN0eWxlLT5zdmdTdHlsZSgpLT5j
YXBTdHlsZSgpID09IFJvdW5kQ2FwKQotICAgICAgICBzLnNldENhcFN0eWxlKFF0OjpSb3VuZENh
cCk7Ci0KLSAgICBpZiAoc3R5bGUtPnN2Z1N0eWxlKCktPmpvaW5TdHlsZSgpID09IE1pdGVySm9p
bikgewotICAgICAgICBzLnNldEpvaW5TdHlsZShRdDo6TWl0ZXJKb2luKTsKLSAgICAgICAgcy5z
ZXRNaXRlckxpbWl0KChxcmVhbCkgc3R5bGUtPnN2Z1N0eWxlKCktPnN0cm9rZU1pdGVyTGltaXQo
KSk7Ci0gICAgfSBlbHNlIGlmKHN0eWxlLT5zdmdTdHlsZSgpLT5qb2luU3R5bGUoKSA9PSBSb3Vu
ZEpvaW4pCi0gICAgICAgIHMuc2V0Sm9pblN0eWxlKFF0OjpSb3VuZEpvaW4pOwotCi0gICAgY29u
c3QgRGFzaEFycmF5JiBkYXNoZXMgPSBXZWJDb3JlOjpkYXNoQXJyYXlGcm9tUmVuZGVyaW5nU3R5
bGUoc3R5bGUpOwotICAgIGRvdWJsZSBkYXNoT2Zmc2V0ID0gU1ZHUmVuZGVyU3R5bGU6OmNzc1By
aW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwgc3R5bGUtPnN2Z1N0eWxlKCktPnN0cm9rZURhc2hPZmZz
ZXQoKSwgMC4wKTsKLQotICAgIHVuc2lnbmVkIGludCBkYXNoTGVuZ3RoID0gIWRhc2hlcy5pc0Vt
cHR5KCkgPyBkYXNoZXMuc2l6ZSgpIDogMDsKLSAgICBpZihkYXNoTGVuZ3RoKSB7Ci0gICAgICAg
IFFWZWN0b3I8cXJlYWw+IHBhdHRlcm47Ci0gICAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9IChk
YXNoTGVuZ3RoICUgMikgPT0gMCA/IGRhc2hMZW5ndGggOiBkYXNoTGVuZ3RoICogMjsKLQotICAg
ICAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAg
IHBhdHRlcm4uYXBwZW5kKGRhc2hlc1tpICUgZGFzaExlbmd0aF0gLyAoZmxvYXQpcy53aWR0aCgp
KTsKLQotICAgICAgICBzLnNldERhc2hQYXR0ZXJuKHBhdHRlcm4pOwotICAgIAotICAgICAgICBR
X1VOVVNFRChkYXNoT2Zmc2V0KTsKLSAgICAgICAgLy8gVE9ETzogZGFzaC1vZmZzZXQsIGRvZXMv
d2lsbCBxdDQgQVBJIGFsbG93IGl0PyAoUm9iKQotICAgIH0KLQotICAgIHJldHVybiBzLmNyZWF0
ZVN0cm9rZShwYXRoKTsKLX0KLQotRmxvYXRSZWN0IFJlbmRlclBhdGg6OnN0cm9rZUJCb3goKSBj
b25zdAotewotICAgIFFQYWludGVyUGF0aCBvdXRsaW5lID0gZ2V0UGF0aFN0cm9rZSgqKHBhdGgo
KS5wbGF0Zm9ybVBhdGgoKSksIHRoaXMsIHN0eWxlKCkpOwotICAgIHJldHVybiBvdXRsaW5lLmJv
dW5kaW5nUmVjdCgpOwotfQotCiB9CiAKIC8vIHZpbTp0cz00Om5vZXQK
</data>
<flag name="review"
          id="12305"
          type_id="1"
          status="-"
          setter="zimmermann"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26098</attachid>
            <date>2008-12-17 10:44:19 -0800</date>
            <delta_ts>2008-12-17 13:23:01 -0800</delta_ts>
            <desc>Move strokeBBox code to Path</desc>
            <filename>renderpath-1.patch</filename>
            <type>text/plain</type>
            <size>13683</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTM1OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMDgtMTItMTcgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3Zl
IHRoZSB0aGUgcGxhdGZvcm0gZGVwZW5kZW50IHN0cm9rZUJCb3ggZnVuY3Rpb25hbGl0eSBvdXQg
b2YgUmVuZGVyUGF0aAorICAgICAgICBpbnRvIFBhdGggd2l0aCBzdHJva2VCb3VuZGluZ1JlY3Qu
CisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaDoKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9QYXRoLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvY2Fpcm8vUGF0aENhaXJvLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJv
dW5kaW5nUmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGF0aENHLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OnNjcmF0Y2hDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlBh
dGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
R3JhcGhpY3NDb250ZXh0UXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpwZW4pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L1BhdGhRdC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpQYXRoOjpzdHJva2VCb3VuZGluZ1JlY3QpOgorICAgICAgICAqIHJlbmRl
cmluZy9SZW5kZXJQYXRoLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnN0cm9rZVN0eWxlQ2FsbGJh
Y2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyUGF0aDo6cmVsYXRpdmVCQm94KToKKyAgICAg
ICAgKiByZW5kZXJpbmcvUmVuZGVyUGF0aC5oOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9jYWly
by9SZW5kZXJQYXRoQ2Fpcm8uY3BwOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9jZy9SZW5kZXJQ
YXRoQ2cuY3BwOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9xdC9SZW5kZXJQYXRoUXQuY3BwOgor
CiAyMDA4LTEyLTE2ICBEYXJpbiBBZGxlciAgPGRhcmluQGFwcGxlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBhbmQgbGFuZGVkIGJ5IENhbWVyb24gWndhcmljaC4KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAkocmV2aXNpb24gMzkzMDMpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zMTIsNiArMzEyLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogI2lmIFBMQVRGT1JNKFFU
KQogICAgICAgICBib29sIGluVHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdDsKICAgICAgICAgUGxh
dGZvcm1QYXRoKiBjdXJyZW50UGF0aCgpOworICAgICAgICBRUGVuIHBlbigpOwogI2VuZGlmCiAK
ICNpZiBQTEFURk9STShHVEspCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGgu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguaAkocmV2aXNp
b24gMzkzMDMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguaAkod29ya2luZyBj
b3B5KQpAQCAtNTYsNiArNTYsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgY2xhc3MgRmxv
YXRQb2ludDsKICAgICBjbGFzcyBGbG9hdFNpemU7CiAgICAgY2xhc3MgRmxvYXRSZWN0OworICAg
IGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKICAgICBjbGFzcyBTdHJpbmc7CiAKICAgICBlbnVtIFdp
bmRSdWxlIHsKQEAgLTc2LDYgKzc3LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBG
bG9hdFBvaW50KiBwb2ludHM7CiAgICAgfTsKIAorICAgIHR5cGVkZWYgdm9pZCAoKlBhdGhTdHls
ZURlY29yYXRvckNhbGxiYWNrKShHcmFwaGljc0NvbnRleHQqLCB2b2lkKik7CiAgICAgdHlwZWRl
ZiB2b2lkICgqUGF0aEFwcGxpZXJGdW5jdGlvbikgKHZvaWQqIGluZm8sIGNvbnN0IFBhdGhFbGVt
ZW50Kik7CiAKICAgICBjbGFzcyBQYXRoIHsKQEAgLTg4LDYgKzkwLDcgQEAgbmFtZXNwYWNlIFdl
YkNvcmUgewogCiAgICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYsIFdpbmRS
dWxlIHJ1bGUgPSBSVUxFX05PTlpFUk8pIGNvbnN0OwogICAgICAgICBGbG9hdFJlY3QgYm91bmRp
bmdSZWN0KCkgY29uc3Q7CisgICAgICAgIEZsb2F0UmVjdCBzdHJva2VCb3VuZGluZ1JlY3Qodm9p
ZCogZGF0YSwgU3R5bGVEZWNvcmF0b3JDYWxsYmFjayk7CiAgICAgICAgIAogICAgICAgICBmbG9h
dCBsZW5ndGgoKTsKICAgICAgICAgRmxvYXRQb2ludCBwb2ludEF0TGVuZ3RoKGZsb2F0IGxlbmd0
aCwgYm9vbCYgb2spOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QYXRo
Q2Fpcm8uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8v
UGF0aENhaXJvLmNwcAkocmV2aXNpb24gMzkzMDMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2NhaXJvL1BhdGhDYWlyby5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTI3LDYgKzI3LDcgQEAK
ICNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJDYWlyb1BhdGguaCIKICNp
bmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNs
dWRlICJOb3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCiAKQEAg
LTE4OCw2ICsxODksMTggQEAgRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgpIGNvbnN0CiAg
ICAgcmV0dXJuIEZsb2F0UmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOwogfQogCitGbG9h
dFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KHZvaWQqIGRhdGEsIFBhdGhTdHlsZURlY29y
YXRvckNhbGxiYWNrIGNhbGxCYWNrKQoreworICAgIGNhaXJvX3QqIGNyID0gcGxhdGZvcm1QYXRo
KCktPm1fY3I7CisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNyKTsKKyAgICBpZiAoY2FsbEJhY2sp
CisgICAgICAgICgqY2FsbEJhY2spKCZnYywgZGF0YSk7CisKKyAgICBkb3VibGUgeDAsIHgxLCB5
MCwgeTE7CisgICAgY2Fpcm9fc3Ryb2tlX2V4dGVudHMoY3IsICZ4MCwgJnkwLCAmeDEsICZ5MSk7
CisgICAgcmV0dXJuIEZsb2F0UmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOworfQorCiBi
b29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxl
KSBjb25zdAogewogICAgIGlmICghYm91bmRpbmdSZWN0KCkuY29udGFpbnMocG9pbnQpKQpJbmRl
eDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9QYXRoQ0cuY3BwCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGF0aENHLmNwcAkocmV2aXNpb24gMzkzMDMp
CisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL1BhdGhDRy5jcHAJKHdvcmtpbmcgY29w
eSkKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNs
dWRlIDxBcHBsaWNhdGlvblNlcnZpY2VzL0FwcGxpY2F0aW9uU2VydmljZXMuaD4KICNpbmNsdWRl
ICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJJ
bnRSZWN0LmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKIApAQCAtNjIsNiArNjMsMjIg
QEAgUGF0aCYgUGF0aDo6b3BlcmF0b3I9KGNvbnN0IFBhdGgmIG90aGVyKQogICAgIHJldHVybiAq
dGhpczsKIH0KIAorc3RhdGljIGlubGluZSBDR0NvbnRleHRSZWYgc2NyYXRjaENvbnRleHQoKQor
eworICAgIHN0YXRpYyBDR0NvbnRleHRSZWYgc19jb250ZXh0UmVmID0gMDsKKyAgICBpZiAoIXNf
Y29udGV4dFJlZikgeworICAgICAgICBDRk11dGFibGVEYXRhUmVmIGVtcHR5ID0gQ0ZEYXRhQ3Jl
YXRlTXV0YWJsZShOVUxMLCAwKTsKKyAgICAgICAgQ0dEYXRhQ29uc3VtZXJSZWYgY29uc3VtZXIg
PSBDR0RhdGFDb25zdW1lckNyZWF0ZVdpdGhDRkRhdGEoZW1wdHkpOworICAgICAgICBzX2NvbnRl
eHRSZWYgPSBDR1BERkNvbnRleHRDcmVhdGUoY29uc3VtZXIsIE5VTEwsIE5VTEwpOworICAgICAg
ICBDR0RhdGFDb25zdW1lclJlbGVhc2UoY29uc3VtZXIpOworICAgICAgICBDRlJlbGVhc2UoZW1w
dHkpOworCisgICAgICAgIENHRmxvYXQgYmxhY2tbNF0gPSB7MCwgMCwgMCwgMX07CisgICAgICAg
IENHQ29udGV4dFNldEZpbGxDb2xvcihzX2NvbnRleHRSZWYsIGJsYWNrKTsKKyAgICAgICAgQ0dD
b250ZXh0U2V0U3Ryb2tlQ29sb3Ioc19jb250ZXh0UmVmLCBibGFjayk7CisgICAgIH0KKyAgICBy
ZXR1cm4gc19jb250ZXh0UmVmOworfQogCiBzdGF0aWMgdm9pZCBjb3B5Q2xvc2luZ1N1YnBhdGhz
QXBwbGllckZ1bmN0aW9uKHZvaWQqIGluZm8sIGNvbnN0IENHUGF0aEVsZW1lbnQqIGVsZW1lbnQp
CiB7CkBAIC0xMjMsNiArMTQwLDI4IEBAIEZsb2F0UmVjdCBQYXRoOjpib3VuZGluZ1JlY3QoKSBj
b25zdAogICAgIHJldHVybiBDR1BhdGhHZXRCb3VuZGluZ0JveChtX3BhdGgpOwogfQogCitGbG9h
dFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KHZvaWQqIGRhdGEsIFBhdGhTdHlsZURlY29y
YXRvckNhbGxiYWNrIGNhbGxCYWNrKQoreworICAgIENHQ29udGV4dFJlZiBjb250ZXh0ID0gc2Ny
YXRjaENvbnRleHQoKTsKKworICAgIENHQ29udGV4dFNhdmVHU3RhdGUoY29udGV4dCk7CisgICAg
Q0dDb250ZXh0QmVnaW5QYXRoKGNvbnRleHQpOworICAgIENHQ29udGV4dEFkZFBhdGgoY29udGV4
dCwgcGxhdGZvcm1QYXRoKCkpOworCisgICAgR3JhcGhpY3NDb250ZXh0IGdjKGNvbnRleHQpOwor
ICAgIGlmIChjYWxsQmFjaykKKyAgICAgICAgKCpjYWxsQmFjaykoJmdjLCBkYXRhKTsKKworICAg
IENHQ29udGV4dFJlcGxhY2VQYXRoV2l0aFN0cm9rZWRQYXRoKGNvbnRleHQpOworICAgIGlmIChD
R0NvbnRleHRJc1BhdGhFbXB0eShjb250ZXh0KSkgeworICAgICAgICBDR0NvbnRleHRSZXN0b3Jl
R1N0YXRlKGNvbnRleHQpOworICAgICAgICByZXR1cm4gRmxvYXRSZWN0KCk7CisgICAgfQorICAg
IENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7CisKKyAgICByZXR1cm4gRmxvYXRSZWN0
KENHQ29udGV4dEdldFBhdGhCb3VuZGluZ0JveChjb250ZXh0KSk7Cit9CisKIHZvaWQgUGF0aDo6
bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQogewogICAgIENHUGF0aE1vdmVUb1BvaW50
KG1fcGF0aCwgMCwgcG9pbnQueCgpLCBwb2ludC55KCkpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHAJKHJldmlzaW9uIDM5
MzAzKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5j
cHAJKHdvcmtpbmcgY29weSkKQEAgLTUyNSw2ICs1MjUsMTUgQEAgdm9pZCBHcmFwaGljc0NvbnRl
eHQ6OmRyYXdDb252ZXhQb2x5Z29uKAogICAgIHAtPnJlc3RvcmUoKTsKIH0KIAorUVBlbiBHcmFw
aGljc0NvbnRleHQ6OnBlbigpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgUVBhaW50ZXIgKnAgPSBtX2RhdGEtPnAoKTsKKyAgICByZXR1cm4g
cC0+cGVuKCk7Cit9CisKIHZvaWQgR3JhcGhpY3NDb250ZXh0OjpmaWxsUGF0aCgpCiB7CiAgICAg
aWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
cXQvUGF0aFF0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0
L1BhdGhRdC5jcHAJKHJldmlzaW9uIDM5MzAzKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9QYXRoUXQuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0yOSw5ICsyOSwxMSBAQAogI2luY2x1
ZGUgImNvbmZpZy5oIgogI2luY2x1ZGUgIlBhdGguaCIKIAorI2luY2x1ZGUgIkFmZmluZVRyYW5z
Zm9ybS5oIgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4
dC5oIgorI2luY2x1ZGUgIkltYWdlQnVmZmVyLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcu
aCIKLSNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlIDxRUGFpbnRlclBhdGg+
CiAjaW5jbHVkZSA8UU1hdHJpeD4KICNpbmNsdWRlIDxRU3RyaW5nPgpAQCAtOTMsNiArOTUsMjYg
QEAgRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgpIGNvbnN0CiAgICAgcmV0dXJuIG1fcGF0
aC0+Ym91bmRpbmdSZWN0KCk7CiB9CiAKK0Zsb2F0UmVjdCBQYXRoOjpzdHJva2VCb3VuZGluZ1Jl
Y3Qodm9pZCogZGF0YSwgUGF0aFN0eWxlRGVjb3JhdG9yQ2FsbGJhY2sgY2FsbEJhY2spCit7Cisg
ICAgLy9GSVhNRTogV2Ugc2hvdWxkIHRyeSB0byB1c2UgYSAnc2hhcmVkIENvbnRleHQnIGluc3Rl
YWQgb2YgY3JlYXRpbmcgYSBuZXcgSW1hZ2VCdWZmZXIKKyAgICAvLyAgICAgICBvbiBlYWNoIGNh
bGwuCisgICAgc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gc2NyYXRjaEltYWdlID0gSW1hZ2VC
dWZmZXI6OmNyZWF0ZShJbnRTaXplKDEsIDEpLCBmYWxzZSk7CisgICAgR3JhcGhpY3NDb250ZXh0
KiBnYyA9IHNjcmF0Y2hJbWFnZS0+Y29udGV4dCgpOworICAgIFFQYWludGVyUGF0aFN0cm9rZXIg
c3Ryb2tlOworICAgIGlmIChjYWxsQmFjaykgeworICAgICAgICAoKmNhbGxCYWNrKShnYywgZGF0
YSk7CisgICAgICAgIFFQZW4gcGVuID0gZ2MtPnBlbigpOworICAgICAgICBzdHJva2Uuc2V0V2lk
dGgocGVuLndpZHRoRigpKTsKKyAgICAgICAgc3Ryb2tlLnNldENhcFN0eWxlKHBlbi5jYXBTdHls
ZSgpKTsKKyAgICAgICAgc3Ryb2tlLnNldEpvaW5TdHlsZShwZW4uam9pblN0eWxlKCkpOworICAg
ICAgICBzdHJva2Uuc2V0TWl0ZXJMaW1pdChwZW4ubWl0ZXJMaW1pdCgpKTsKKyAgICAgICAgc3Ry
b2tlLnNldERhc2hQYXR0ZXJuKHBlbi5kYXNoUGF0dGVybigpKTsKKyAgICAgICAgc3Ryb2tlLnNl
dERhc2hPZmZzZXQocGVuLmRhc2hPZmZzZXQoKSk7CisgICAgfQorICAgIHJldHVybiAoc3Ryb2tl
LmNyZWF0ZVN0cm9rZSgqcGxhdGZvcm1QYXRoKCkpKS5ib3VuZGluZ1JlY3QoKTsKK30KKwogdm9p
ZCBQYXRoOjptb3ZlVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCiB7CiAgICAgbV9wYXRoLT5t
b3ZlVG8ocG9pbnQpOwpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUGF0aC5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUGF0aC5jcHAJKHJldmlzaW9uIDM5
MzAzKQorKysgV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUGF0aC5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTgzLDE0ICs4MywyOCBAQCBib29sIFJlbmRlclBhdGg6OmZpbGxDb250YWlucyhjb25zdCBG
bG9hCiAgICAgcmV0dXJuIG1fcGF0aC5jb250YWlucyhwb2ludCwgc3R5bGUoKS0+c3ZnU3R5bGUo
KS0+ZmlsbFJ1bGUoKSk7CiB9CiAKK3N0YXRpYyB2b2lkIHN0cm9rZVN0eWxlQ2FsbGJhY2soR3Jh
cGhpY3NDb250ZXh0KiBnYywgdm9pZCogZGF0YSkKK3sKKyAgICBTdHJva2VCb3VuZGluZ0JveERh
dGEqIGJib3hEYXRhID0gc3RhdGljX2Nhc3Q8U3Ryb2tlQm91bmRpbmdCb3hEYXRhKj4oZGF0YSk7
CisgICAgQVNTRVJUKGJib3hEYXRhKTsKKworICAgIGFwcGx5U3Ryb2tlU3R5bGVUb0NvbnRleHQo
Z2MsIGJib3hEYXRhLT5zdHlsZSwgYmJveERhdGEtPm9iamVjdCk7Cit9CisKIEZsb2F0UmVjdCBS
ZW5kZXJQYXRoOjpyZWxhdGl2ZUJCb3goYm9vbCBpbmNsdWRlU3Ryb2tlKSBjb25zdAogewogICAg
IGlmIChtX3BhdGguaXNFbXB0eSgpKQogICAgICAgICByZXR1cm4gRmxvYXRSZWN0KCk7CiAKICAg
ICBpZiAoaW5jbHVkZVN0cm9rZSkgewotICAgICAgICBpZiAobV9zdHJva2VCYm94LmlzRW1wdHko
KSkKLSAgICAgICAgICAgIG1fc3Ryb2tlQmJveCA9IHN0cm9rZUJCb3goKTsKKyAgICAgICAgaWYg
KG1fc3Ryb2tlQmJveC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChzdHlsZSgpLT5zdmdT
dHlsZSgpLT5oYXNTdHJva2UoKSkgeworICAgICAgICAgICAgICAgIFN0cm9rZUJvdW5kaW5nQm94
RGF0YSBkYXRhID0geyB0aGlzLCBzdHlsZSgpIH07CisgICAgICAgICAgICAgICAgbV9zdHJva2VC
Ym94ID0gbV9wYXRoLnN0cm9rZUJvdW5kaW5nUmVjdChzdGF0aWNfY2FzdDx2b2lkKj4oJmRhdGEp
LCAmc3Ryb2tlU3R5bGVDYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNl
CisgICAgICAgICAgICAgICAgbV9zdHJva2VCYm94ID0gbV9wYXRoLmJvdW5kaW5nUmVjdCgpOwor
ICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG1fc3Ryb2tlQmJveDsKICAgICB9CkluZGV4OiBX
ZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJQYXRoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyUGF0aC5oCShyZXZpc2lvbiAzOTMwMykKKysrIFdlYkNvcmUvcmVuZGVyaW5n
L1JlbmRlclBhdGguaAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzksMTEgQEAgY2xhc3MgUGF0
aDsKIGNsYXNzIFJlbmRlclNWR0NvbnRhaW5lcjsKIGNsYXNzIFNWR1N0eWxlZFRyYW5zZm9ybWFi
bGVFbGVtZW50OwogCitzdHJ1Y3QgU3Ryb2tlQm91bmRpbmdCb3hEYXRhIHsKKyAgICBjb25zdCBS
ZW5kZXJPYmplY3QqIG9iamVjdDsKKyAgICBSZW5kZXJTdHlsZSogc3R5bGU7Cit9OworCiBjbGFz
cyBSZW5kZXJQYXRoIDogcHVibGljIFJlbmRlck9iamVjdAogewogcHVibGljOgpAQCAtNDYsOCAr
NTEsOCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB+UmVuZGVyUGF0aCgpOwogCiAgICAgLy8gSGl0
LWRldGVjdGlvbiBzZXBlcmF0ZWQgZm9yIHRoZSBmaWxsIGFuZCB0aGUgc3Ryb2tlCi0gICAgdmly
dHVhbCBib29sIGZpbGxDb250YWlucyhjb25zdCBGbG9hdFBvaW50JiwgYm9vbCByZXF1aXJlc0Zp
bGwgPSB0cnVlKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgc3Ryb2tlQ29udGFpbnMoY29uc3Qg
RmxvYXRQb2ludCYsIGJvb2wgcmVxdWlyZXNTdHJva2UgPSB0cnVlKSBjb25zdDsKKyAgICBib29s
IGZpbGxDb250YWlucyhjb25zdCBGbG9hdFBvaW50JiwgYm9vbCByZXF1aXJlc0ZpbGwgPSB0cnVl
KSBjb25zdDsKKyAgICBib29sIHN0cm9rZUNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmLCBib29s
IHJlcXVpcmVzU3Ryb2tlID0gdHJ1ZSkgY29uc3Q7CiAKICAgICAvLyBSZXR1cm5zIGFuIHVuc2Nh
bGVkIGJvdW5kaW5nIGJveCAobm90IGV2ZW4gaW5jbHVkaW5nIGxvY2FsVHJhbnNmb3JtKCkpIGZv
ciB0aGlzIHZlY3RvciBwYXRoCiAgICAgdmlydHVhbCBGbG9hdFJlY3QgcmVsYXRpdmVCQm94KGJv
b2wgaW5jbHVkZVN0cm9rZSA9IHRydWUpIGNvbnN0OwpAQCAtNzUsNyArODAsNiBAQCBwdWJsaWM6
CiAgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRlc3RSZXF1ZXN0JiwgSGl0
VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHksIEhpdFRlc3RBY3Rpb24p
OwogCiAgICAgRmxvYXRSZWN0IGRyYXdNYXJrZXJzSWZOZWVkZWQoR3JhcGhpY3NDb250ZXh0Kiwg
Y29uc3QgRmxvYXRSZWN0JiwgY29uc3QgUGF0aCYpIGNvbnN0OwotICAgIHZpcnR1YWwgRmxvYXRS
ZWN0IHN0cm9rZUJCb3goKSBjb25zdDsKICAgICAKIHByaXZhdGU6CiAgICAgRmxvYXRQb2ludCBt
YXBBYnNvbHV0ZVBvaW50VG9Mb2NhbChjb25zdCBGbG9hdFBvaW50JikgY29uc3Q7CkluZGV4OiBX
ZWJDb3JlL3N2Zy9ncmFwaGljcy9jYWlyby9SZW5kZXJQYXRoQ2Fpcm8uY3BwCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL2NhaXJvL1JlbmRlclBhdGhDYWlyby5jcHAJKHJldmlz
aW9uIDM5MzAzKQorKysgV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2Fpcm8vUmVuZGVyUGF0aENhaXJv
LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzYsMTcgKzM2LDQgQEAgYm9vbCBSZW5kZXJQYXRoOjpz
dHJva2VDb250YWlucyhjb25zdCBGbAogICAgIHJldHVybiBjYWlyb19pbl9zdHJva2UoY3IsIHBv
aW50LngoKSwgcG9pbnQueSgpKTsKIH0KIAotRmxvYXRSZWN0IFJlbmRlclBhdGg6OnN0cm9rZUJC
b3goKSBjb25zdAotewotICAgIC8vIFRPRE86IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbmFpdmUK
LQotICAgIGNhaXJvX3QqIGNyID0gcGF0aCgpLnBsYXRmb3JtUGF0aCgpLT5tX2NyOwotCi0gICAg
ZG91YmxlIHgwLCB4MSwgeTAsIHkxOwotICAgIGNhaXJvX3N0cm9rZV9leHRlbnRzKGNyLCAmeDAs
ICZ5MCwgJngxLCAmeTEpOwotICAgIEZsb2F0UmVjdCBiYm94ID0gRmxvYXRSZWN0KHgwLCB5MCwg
eDEgLSB4MCwgeTEgLSB5MCk7Ci0KLSAgICByZXR1cm4gYmJveDsKLX0KLQogfQpJbmRleDogV2Vi
Q29yZS9zdmcvZ3JhcGhpY3MvY2cvUmVuZGVyUGF0aENnLmNwcAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJD
b3JlL3N2Zy9ncmFwaGljcy9jZy9SZW5kZXJQYXRoQ2cuY3BwCShyZXZpc2lvbiAzOTMwMykKKysr
IFdlYkNvcmUvc3ZnL2dyYXBoaWNzL2NnL1JlbmRlclBhdGhDZy5jcHAJKHdvcmtpbmcgY29weSkK
QEAgLTQwLDE1ICs0MCw2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsKIAotRmxvYXRSZWN0IFJl
bmRlclBhdGg6OnN0cm9rZUJCb3goKSBjb25zdAotewotICAgIGlmIChzdHlsZSgpLT5zdmdTdHls
ZSgpLT5oYXNTdHJva2UoKSkKLSAgICAgICAgcmV0dXJuIHN0cm9rZUJvdW5kaW5nQm94KHBhdGgo
KSwgc3R5bGUoKSwgdGhpcyk7Ci0KLSAgICByZXR1cm4gcGF0aCgpLmJvdW5kaW5nUmVjdCgpOwot
fQotCi0KIGJvb2wgUmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYg
cG9pbnQsIGJvb2wgcmVxdWlyZXNTdHJva2UpIGNvbnN0CiB7CiAgICAgaWYgKHBhdGgoKS5pc0Vt
cHR5KCkpCkluZGV4OiBXZWJDb3JlL3N2Zy9ncmFwaGljcy9xdC9SZW5kZXJQYXRoUXQuY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL3F0L1JlbmRlclBhdGhRdC5jcHAJKHJl
dmlzaW9uIDM5MzAzKQorKysgV2ViQ29yZS9zdmcvZ3JhcGhpY3MvcXQvUmVuZGVyUGF0aFF0LmNw
cAkod29ya2luZyBjb3B5KQpAQCAtNDIsNDggKzQyLDYgQEAgYm9vbCBSZW5kZXJQYXRoOjpzdHJv
a2VDb250YWlucyhjb25zdCBGbAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdGljIFFQYWlu
dGVyUGF0aCBnZXRQYXRoU3Ryb2tlKGNvbnN0IFFQYWludGVyUGF0aCAmcGF0aCwgY29uc3QgUmVu
ZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFJlbmRlclN0eWxlKiBzdHlsZSkKLXsgCi0gICAgUVBh
aW50ZXJQYXRoU3Ryb2tlciBzOwotICAgIHMuc2V0V2lkdGgoU1ZHUmVuZGVyU3R5bGU6OmNzc1By
aW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwgc3R5bGUtPnN2Z1N0eWxlKCktPnN0cm9rZVdpZHRoKCks
IDEuMCkpOwotCi0gICAgaWYgKHN0eWxlLT5zdmdTdHlsZSgpLT5jYXBTdHlsZSgpID09IEJ1dHRD
YXApCi0gICAgICAgIHMuc2V0Q2FwU3R5bGUoUXQ6OkZsYXRDYXApOwotICAgIGVsc2UgaWYgKHN0
eWxlLT5zdmdTdHlsZSgpLT5jYXBTdHlsZSgpID09IFJvdW5kQ2FwKQotICAgICAgICBzLnNldENh
cFN0eWxlKFF0OjpSb3VuZENhcCk7Ci0KLSAgICBpZiAoc3R5bGUtPnN2Z1N0eWxlKCktPmpvaW5T
dHlsZSgpID09IE1pdGVySm9pbikgewotICAgICAgICBzLnNldEpvaW5TdHlsZShRdDo6TWl0ZXJK
b2luKTsKLSAgICAgICAgcy5zZXRNaXRlckxpbWl0KChxcmVhbCkgc3R5bGUtPnN2Z1N0eWxlKCkt
PnN0cm9rZU1pdGVyTGltaXQoKSk7Ci0gICAgfSBlbHNlIGlmKHN0eWxlLT5zdmdTdHlsZSgpLT5q
b2luU3R5bGUoKSA9PSBSb3VuZEpvaW4pCi0gICAgICAgIHMuc2V0Sm9pblN0eWxlKFF0OjpSb3Vu
ZEpvaW4pOwotCi0gICAgY29uc3QgRGFzaEFycmF5JiBkYXNoZXMgPSBXZWJDb3JlOjpkYXNoQXJy
YXlGcm9tUmVuZGVyaW5nU3R5bGUoc3R5bGUpOwotICAgIGRvdWJsZSBkYXNoT2Zmc2V0ID0gU1ZH
UmVuZGVyU3R5bGU6OmNzc1ByaW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwgc3R5bGUtPnN2Z1N0eWxl
KCktPnN0cm9rZURhc2hPZmZzZXQoKSwgMC4wKTsKLQotICAgIHVuc2lnbmVkIGludCBkYXNoTGVu
Z3RoID0gIWRhc2hlcy5pc0VtcHR5KCkgPyBkYXNoZXMuc2l6ZSgpIDogMDsKLSAgICBpZihkYXNo
TGVuZ3RoKSB7Ci0gICAgICAgIFFWZWN0b3I8cXJlYWw+IHBhdHRlcm47Ci0gICAgICAgIHVuc2ln
bmVkIGludCBjb3VudCA9IChkYXNoTGVuZ3RoICUgMikgPT0gMCA/IGRhc2hMZW5ndGggOiBkYXNo
TGVuZ3RoICogMjsKLQotICAgICAgICBmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7
IGkrKykKLSAgICAgICAgICAgIHBhdHRlcm4uYXBwZW5kKGRhc2hlc1tpICUgZGFzaExlbmd0aF0g
LyAoZmxvYXQpcy53aWR0aCgpKTsKLQotICAgICAgICBzLnNldERhc2hQYXR0ZXJuKHBhdHRlcm4p
OwotICAgIAotICAgICAgICBRX1VOVVNFRChkYXNoT2Zmc2V0KTsKLSAgICAgICAgLy8gVE9ETzog
ZGFzaC1vZmZzZXQsIGRvZXMvd2lsbCBxdDQgQVBJIGFsbG93IGl0PyAoUm9iKQotICAgIH0KLQot
ICAgIHJldHVybiBzLmNyZWF0ZVN0cm9rZShwYXRoKTsKLX0KLQotRmxvYXRSZWN0IFJlbmRlclBh
dGg6OnN0cm9rZUJCb3goKSBjb25zdAotewotICAgIFFQYWludGVyUGF0aCBvdXRsaW5lID0gZ2V0
UGF0aFN0cm9rZSgqKHBhdGgoKS5wbGF0Zm9ybVBhdGgoKSksIHRoaXMsIHN0eWxlKCkpOwotICAg
IHJldHVybiBvdXRsaW5lLmJvdW5kaW5nUmVjdCgpOwotfQotCiB9CiAKIC8vIHZpbTp0cz00Om5v
ZXQK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26100</attachid>
            <date>2008-12-17 13:23:01 -0800</date>
            <delta_ts>2008-12-21 12:55:57 -0800</delta_ts>
            <desc>Move strokeBBox code to Path</desc>
            <filename>renderpath-1.patch</filename>
            <type>text/plain</type>
            <size>13812</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTM1OSkKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMjkgQEAKKzIwMDgtMTItMTcgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3Zl
IHRoZSB0aGUgcGxhdGZvcm0gZGVwZW5kZW50IHN0cm9rZUJCb3ggZnVuY3Rpb25hbGl0eSBvdXQg
b2YgUmVuZGVyUGF0aAorICAgICAgICBpbnRvIFBhdGggd2l0aCBzdHJva2VCb3VuZGluZ1JlY3Qu
CisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaDoKKyAgICAg
ICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9QYXRoLmg6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhp
Y3MvY2Fpcm8vUGF0aENhaXJvLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJv
dW5kaW5nUmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGF0aENHLmNwcDoK
KyAgICAgICAgKFdlYkNvcmU6OnNjcmF0Y2hDb250ZXh0KToKKyAgICAgICAgKFdlYkNvcmU6OlBh
dGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQv
R3JhcGhpY3NDb250ZXh0UXQuY3BwOgorICAgICAgICAoV2ViQ29yZTo6R3JhcGhpY3NDb250ZXh0
OjpwZW4pOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3F0L1BhdGhRdC5jcHA6CisgICAg
ICAgIChXZWJDb3JlOjpQYXRoOjpzdHJva2VCb3VuZGluZ1JlY3QpOgorICAgICAgICAqIHJlbmRl
cmluZy9SZW5kZXJQYXRoLmNwcDoKKyAgICAgICAgKFdlYkNvcmU6OnN0cm9rZVN0eWxlQ2FsbGJh
Y2spOgorICAgICAgICAoV2ViQ29yZTo6UmVuZGVyUGF0aDo6cmVsYXRpdmVCQm94KToKKyAgICAg
ICAgKiByZW5kZXJpbmcvUmVuZGVyUGF0aC5oOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9jYWly
by9SZW5kZXJQYXRoQ2Fpcm8uY3BwOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9jZy9SZW5kZXJQ
YXRoQ2cuY3BwOgorICAgICAgICAqIHN2Zy9ncmFwaGljcy9xdC9SZW5kZXJQYXRoUXQuY3BwOgor
CiAyMDA4LTEyLTE2ICBEYXJpbiBBZGxlciAgPGRhcmluQGFwcGxlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBhbmQgbGFuZGVkIGJ5IENhbWVyb24gWndhcmljaC4KSW5kZXg6IFdlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9w
bGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAkocmV2aXNpb24gMzkzMDMpCisrKyBX
ZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCSh3b3JraW5nIGNvcHkp
CkBAIC0zMTIsNiArMzEyLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogI2lmIFBMQVRGT1JNKFFU
KQogICAgICAgICBib29sIGluVHJhbnNwYXJlbmN5TGF5ZXIoKSBjb25zdDsKICAgICAgICAgUGxh
dGZvcm1QYXRoKiBjdXJyZW50UGF0aCgpOworICAgICAgICBRUGVuIHBlbigpOwogI2VuZGlmCiAK
ICNpZiBQTEFURk9STShHVEspCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGgu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguaAkocmV2aXNp
b24gMzkzMDMpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1BhdGguaAkod29ya2luZyBj
b3B5KQpAQCAtNTYsNiArNTYsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAgICAgY2xhc3MgRmxv
YXRQb2ludDsKICAgICBjbGFzcyBGbG9hdFNpemU7CiAgICAgY2xhc3MgRmxvYXRSZWN0OworICAg
IGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKICAgICBjbGFzcyBTdHJpbmc7CiAKICAgICBlbnVtIFdp
bmRSdWxlIHsKQEAgLTc2LDYgKzc3LDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUgewogICAgICAgICBG
bG9hdFBvaW50KiBwb2ludHM7CiAgICAgfTsKIAorICAgIHR5cGVkZWYgdm9pZCAoKlBhdGhTdHls
ZURlY29yYXRvckNhbGxiYWNrKSAodm9pZCosIEdyYXBoaWNzQ29udGV4dCopOwogICAgIHR5cGVk
ZWYgdm9pZCAoKlBhdGhBcHBsaWVyRnVuY3Rpb24pICh2b2lkKiBpbmZvLCBjb25zdCBQYXRoRWxl
bWVudCopOwogCiAgICAgY2xhc3MgUGF0aCB7CkBAIC04OCw2ICs5MCw3IEBAIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAogICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmLCBXaW5k
UnVsZSBydWxlID0gUlVMRV9OT05aRVJPKSBjb25zdDsKICAgICAgICAgRmxvYXRSZWN0IGJvdW5k
aW5nUmVjdCgpIGNvbnN0OworICAgICAgICBGbG9hdFJlY3Qgc3Ryb2tlQm91bmRpbmdSZWN0KHZv
aWQqIGRhdGEsIFBhdGhTdHlsZURlY29yYXRvckNhbGxiYWNrKTsKICAgICAgICAgCiAgICAgICAg
IGZsb2F0IGxlbmd0aCgpOwogICAgICAgICBGbG9hdFBvaW50IHBvaW50QXRMZW5ndGgoZmxvYXQg
bGVuZ3RoLCBib29sJiBvayk7CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJv
L1BhdGhDYWlyby5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
YWlyby9QYXRoQ2Fpcm8uY3BwCShyZXZpc2lvbiAzOTMwMykKKysrIFdlYkNvcmUvcGxhdGZvcm0v
Z3JhcGhpY3MvY2Fpcm8vUGF0aENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsNiArMjcs
NyBAQAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgogI2luY2x1ZGUgIkNhaXJvUGF0aC5o
IgogI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgog
I2luY2x1ZGUgIk5vdEltcGxlbWVudGVkLmgiCiAjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIK
IApAQCAtMTg4LDYgKzE4OSwxOCBAQCBGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29u
c3QKICAgICByZXR1cm4gRmxvYXRSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7CiB9CiAK
K0Zsb2F0UmVjdCBQYXRoOjpzdHJva2VCb3VuZGluZ1JlY3Qodm9pZCogZGF0YSwgUGF0aFN0eWxl
RGVjb3JhdG9yQ2FsbGJhY2sgY2FsbEJhY2spCit7CisgICAgY2Fpcm9fdCogY3IgPSBwbGF0Zm9y
bVBhdGgoKS0+bV9jcjsKKyAgICBHcmFwaGljc0NvbnRleHQgZ2MoY3IpOworICAgIGlmIChjYWxs
QmFjaykKKyAgICAgICAgKCpjYWxsQmFjaykoZGF0YSwgJmdjKTsKKworICAgIGRvdWJsZSB4MCwg
eDEsIHkwLCB5MTsKKyAgICBjYWlyb19zdHJva2VfZXh0ZW50cyhjciwgJngwLCAmeTAsICZ4MSwg
JnkxKTsKKyAgICByZXR1cm4gRmxvYXRSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7Cit9
CisKIGJvb2wgUGF0aDo6Y29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYgcG9pbnQsIFdpbmRSdWxl
IHJ1bGUpIGNvbnN0CiB7CiAgICAgaWYgKCFib3VuZGluZ1JlY3QoKS5jb250YWlucyhwb2ludCkp
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL1BhdGhDRy5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9QYXRoQ0cuY3BwCShyZXZpc2lvbiAz
OTMwMykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGF0aENHLmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgIkFmZmluZVRyYW5zZm9ybS5oIgog
I2luY2x1ZGUgPEFwcGxpY2F0aW9uU2VydmljZXMvQXBwbGljYXRpb25TZXJ2aWNlcy5oPgogI2lu
Y2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgogI2luY2x1
ZGUgIkludFJlY3QuaCIKICNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgogCkBAIC02Miw2ICs2
MywyMiBAQCBQYXRoJiBQYXRoOjpvcGVyYXRvcj0oY29uc3QgUGF0aCYgb3RoZXIpCiAgICAgcmV0
dXJuICp0aGlzOwogfQogCitzdGF0aWMgaW5saW5lIENHQ29udGV4dFJlZiBzY3JhdGNoQ29udGV4
dCgpCit7CisgICAgc3RhdGljIENHQ29udGV4dFJlZiBzX2NvbnRleHRSZWYgPSAwOworICAgIGlm
ICghc19jb250ZXh0UmVmKSB7CisgICAgICAgIENGTXV0YWJsZURhdGFSZWYgZW1wdHkgPSBDRkRh
dGFDcmVhdGVNdXRhYmxlKE5VTEwsIDApOworICAgICAgICBDR0RhdGFDb25zdW1lclJlZiBjb25z
dW1lciA9IENHRGF0YUNvbnN1bWVyQ3JlYXRlV2l0aENGRGF0YShlbXB0eSk7CisgICAgICAgIHNf
Y29udGV4dFJlZiA9IENHUERGQ29udGV4dENyZWF0ZShjb25zdW1lciwgTlVMTCwgTlVMTCk7Cisg
ICAgICAgIENHRGF0YUNvbnN1bWVyUmVsZWFzZShjb25zdW1lcik7CisgICAgICAgIENGUmVsZWFz
ZShlbXB0eSk7CisKKyAgICAgICAgQ0dGbG9hdCBibGFja1s0XSA9IHswLCAwLCAwLCAxfTsKKyAg
ICAgICAgQ0dDb250ZXh0U2V0RmlsbENvbG9yKHNfY29udGV4dFJlZiwgYmxhY2spOworICAgICAg
ICBDR0NvbnRleHRTZXRTdHJva2VDb2xvcihzX2NvbnRleHRSZWYsIGJsYWNrKTsKKyAgICB9Cisg
ICAgcmV0dXJuIHNfY29udGV4dFJlZjsKK30KIAogc3RhdGljIHZvaWQgY29weUNsb3NpbmdTdWJw
YXRoc0FwcGxpZXJGdW5jdGlvbih2b2lkKiBpbmZvLCBjb25zdCBDR1BhdGhFbGVtZW50KiBlbGVt
ZW50KQogewpAQCAtMTIzLDYgKzE0MCwyOSBAQCBGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0
KCkgY29uc3QKICAgICByZXR1cm4gQ0dQYXRoR2V0Qm91bmRpbmdCb3gobV9wYXRoKTsKIH0KIAor
RmxvYXRSZWN0IFBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCh2b2lkKiBkYXRhLCBQYXRoU3R5bGVE
ZWNvcmF0b3JDYWxsYmFjayBjYWxsQmFjaykKK3sKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9
IHNjcmF0Y2hDb250ZXh0KCk7CisKKyAgICBDR0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOwor
ICAgIENHQ29udGV4dEJlZ2luUGF0aChjb250ZXh0KTsKKyAgICBDR0NvbnRleHRBZGRQYXRoKGNv
bnRleHQsIHBsYXRmb3JtUGF0aCgpKTsKKworICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjb250ZXh0
KTsKKyAgICBpZiAoY2FsbEJhY2spCisgICAgICAgICgqY2FsbEJhY2spKGRhdGEsICZnYyk7CisK
KyAgICBDR0NvbnRleHRSZXBsYWNlUGF0aFdpdGhTdHJva2VkUGF0aChjb250ZXh0KTsKKyAgICBp
ZiAoQ0dDb250ZXh0SXNQYXRoRW1wdHkoY29udGV4dCkpIHsKKyAgICAgICAgQ0dDb250ZXh0UmVz
dG9yZUdTdGF0ZShjb250ZXh0KTsKKyAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworICAgIH0K
KyAgICBDR1JlY3QgYm94ID0gQ0dDb250ZXh0R2V0UGF0aEJvdW5kaW5nQm94KGNvbnRleHQpOwor
ICAgIENHQ29udGV4dFJlc3RvcmVHU3RhdGUoY29udGV4dCk7CisKKyAgICByZXR1cm4gRmxvYXRS
ZWN0KGJveCk7Cit9CisKIHZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50
KQogewogICAgIENHUGF0aE1vdmVUb1BvaW50KG1fcGF0aCwgMCwgcG9pbnQueCgpLCBwb2ludC55
KCkpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRR
dC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGlj
c0NvbnRleHRRdC5jcHAJKHJldmlzaW9uIDM5MzAzKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUyNSw2ICs1
MjUsMTUgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdDb252ZXhQb2x5Z29uKAogICAgIHAt
PnJlc3RvcmUoKTsKIH0KIAorUVBlbiBHcmFwaGljc0NvbnRleHQ6OnBlbigpCit7CisgICAgaWYg
KHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuIFFQZW4oKTsKKworICAgIFFQYWlu
dGVyICpwID0gbV9kYXRhLT5wKCk7CisgICAgcmV0dXJuIHAtPnBlbigpOworfQorCiB2b2lkIEdy
YXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgoKQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkp
CkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0L1BhdGhRdC5jcHAKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9QYXRoUXQuY3BwCShyZXZpc2lvbiAz
OTMwMykKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvcXQvUGF0aFF0LmNwcAkod29ya2lu
ZyBjb3B5KQpAQCAtMjksOSArMjksMTEgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRl
ICJQYXRoLmgiCiAKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJGbG9h
dFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZUJ1
ZmZlci5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCi0jaW5jbHVkZSAiQWZmaW5lVHJh
bnNmb3JtLmgiCiAjaW5jbHVkZSA8UVBhaW50ZXJQYXRoPgogI2luY2x1ZGUgPFFNYXRyaXg+CiAj
aW5jbHVkZSA8UVN0cmluZz4KQEAgLTkzLDYgKzk1LDI2IEBAIEZsb2F0UmVjdCBQYXRoOjpib3Vu
ZGluZ1JlY3QoKSBjb25zdAogICAgIHJldHVybiBtX3BhdGgtPmJvdW5kaW5nUmVjdCgpOwogfQog
CitGbG9hdFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KHZvaWQqIGRhdGEsIFBhdGhTdHls
ZURlY29yYXRvckNhbGxiYWNrIGNhbGxCYWNrKQoreworICAgIC8vRklYTUU6IFdlIHNob3VsZCB0
cnkgdG8gdXNlIGEgJ3NoYXJlZCBDb250ZXh0JyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IElt
YWdlQnVmZmVyCisgICAgLy8gICAgICAgb24gZWFjaCBjYWxsLgorICAgIHN0ZDo6YXV0b19wdHI8
SW1hZ2VCdWZmZXI+IHNjcmF0Y2hJbWFnZSA9IEltYWdlQnVmZmVyOjpjcmVhdGUoSW50U2l6ZSgx
LCAxKSwgZmFsc2UpOworICAgIEdyYXBoaWNzQ29udGV4dCogZ2MgPSBzY3JhdGNoSW1hZ2UtPmNv
bnRleHQoKTsKKyAgICBRUGFpbnRlclBhdGhTdHJva2VyIHN0cm9rZTsKKyAgICBpZiAoY2FsbEJh
Y2spIHsKKyAgICAgICAgKCpjYWxsQmFjaykoZGF0YSwgZ2MpOworICAgICAgICBRUGVuIHBlbiA9
IGdjLT5wZW4oKTsKKyAgICAgICAgc3Ryb2tlLnNldFdpZHRoKHBlbi53aWR0aEYoKSk7CisgICAg
ICAgIHN0cm9rZS5zZXRDYXBTdHlsZShwZW4uY2FwU3R5bGUoKSk7CisgICAgICAgIHN0cm9rZS5z
ZXRKb2luU3R5bGUocGVuLmpvaW5TdHlsZSgpKTsKKyAgICAgICAgc3Ryb2tlLnNldE1pdGVyTGlt
aXQocGVuLm1pdGVyTGltaXQoKSk7CisgICAgICAgIHN0cm9rZS5zZXREYXNoUGF0dGVybihwZW4u
ZGFzaFBhdHRlcm4oKSk7CisgICAgICAgIHN0cm9rZS5zZXREYXNoT2Zmc2V0KHBlbi5kYXNoT2Zm
c2V0KCkpOworICAgIH0KKyAgICByZXR1cm4gKHN0cm9rZS5jcmVhdGVTdHJva2UoKnBsYXRmb3Jt
UGF0aCgpKSkuYm91bmRpbmdSZWN0KCk7Cit9CisKIHZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0IEZs
b2F0UG9pbnQmIHBvaW50KQogewogICAgIG1fcGF0aC0+bW92ZVRvKHBvaW50KTsKSW5kZXg6IFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclBhdGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVu
ZGVyaW5nL1JlbmRlclBhdGguY3BwCShyZXZpc2lvbiAzOTMwMykKKysrIFdlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlclBhdGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC04MywxNCArODMsMzEgQEAgYm9v
bCBSZW5kZXJQYXRoOjpmaWxsQ29udGFpbnMoY29uc3QgRmxvYQogICAgIHJldHVybiBtX3BhdGgu
Y29udGFpbnMocG9pbnQsIHN0eWxlKCktPnN2Z1N0eWxlKCktPmZpbGxSdWxlKCkpOwogfQogCitz
dGF0aWMgdm9pZCBzdHJva2VTdHlsZUNhbGxiYWNrKHZvaWQqIGRhdGEsIEdyYXBoaWNzQ29udGV4
dCogZ2MpCit7CisgICAgU3Ryb2tlQm91bmRpbmdCb3hEYXRhKiBiYm94RGF0YSA9IHN0YXRpY19j
YXN0PFN0cm9rZUJvdW5kaW5nQm94RGF0YSo+KGRhdGEpOworICAgIEFTU0VSVChiYm94RGF0YSk7
CisKKyAgICBhcHBseVN0cm9rZVN0eWxlVG9Db250ZXh0KGdjLCBiYm94RGF0YS0+c3R5bGUsIGJi
b3hEYXRhLT5vYmplY3QpOworfQorCiBGbG9hdFJlY3QgUmVuZGVyUGF0aDo6cmVsYXRpdmVCQm94
KGJvb2wgaW5jbHVkZVN0cm9rZSkgY29uc3QKIHsKICAgICBpZiAobV9wYXRoLmlzRW1wdHkoKSkK
ICAgICAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOwogCiAgICAgaWYgKGluY2x1ZGVTdHJva2UpIHsK
LSAgICAgICAgaWYgKG1fc3Ryb2tlQmJveC5pc0VtcHR5KCkpCi0gICAgICAgICAgICBtX3N0cm9r
ZUJib3ggPSBzdHJva2VCQm94KCk7CisgICAgICAgIGlmIChtX3N0cm9rZUJib3guaXNFbXB0eSgp
KSB7CisgICAgICAgICAgICBpZiAoc3R5bGUoKS0+c3ZnU3R5bGUoKS0+aGFzU3Ryb2tlKCkpIHsK
KyAgICAgICAgICAgICAgICBTdHJva2VCb3VuZGluZ0JveERhdGEgZGF0YSA9IHsgdGhpcywgc3R5
bGUoKSB9OworICAgICAgICAgICAgICAgIG1fc3Ryb2tlQmJveCA9IG1fcGF0aC5zdHJva2VCb3Vu
ZGluZ1JlY3Qoc3RhdGljX2Nhc3Q8dm9pZCo+KCZkYXRhKSwgJnN0cm9rZVN0eWxlQ2FsbGJhY2sp
OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAobV9maWxsQkJveC5p
c0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgIG1fZmlsbEJCb3ggPSBtX3BhdGguYm91bmRp
bmdSZWN0KCk7CisKKyAgICAgICAgICAgICAgICBtX3N0cm9rZUJib3ggPSBtX2ZpbGxCQm94Owor
ICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIG1fc3Ryb2tlQmJveDsK
ICAgICB9CkluZGV4OiBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJQYXRoLmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVyUGF0aC5oCShyZXZpc2lvbiAzOTMwMykKKysrIFdl
YkNvcmUvcmVuZGVyaW5nL1JlbmRlclBhdGguaAkod29ya2luZyBjb3B5KQpAQCAtMzksNiArMzks
MTEgQEAgY2xhc3MgUGF0aDsKIGNsYXNzIFJlbmRlclNWR0NvbnRhaW5lcjsKIGNsYXNzIFNWR1N0
eWxlZFRyYW5zZm9ybWFibGVFbGVtZW50OwogCitzdHJ1Y3QgU3Ryb2tlQm91bmRpbmdCb3hEYXRh
IHsKKyAgICBjb25zdCBSZW5kZXJPYmplY3QqIG9iamVjdDsKKyAgICBSZW5kZXJTdHlsZSogc3R5
bGU7Cit9OworCiBjbGFzcyBSZW5kZXJQYXRoIDogcHVibGljIFJlbmRlck9iamVjdAogewogcHVi
bGljOgpAQCAtNDYsOCArNTEsOCBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCB+UmVuZGVyUGF0aCgp
OwogCiAgICAgLy8gSGl0LWRldGVjdGlvbiBzZXBlcmF0ZWQgZm9yIHRoZSBmaWxsIGFuZCB0aGUg
c3Ryb2tlCi0gICAgdmlydHVhbCBib29sIGZpbGxDb250YWlucyhjb25zdCBGbG9hdFBvaW50Jiwg
Ym9vbCByZXF1aXJlc0ZpbGwgPSB0cnVlKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgc3Ryb2tl
Q29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYsIGJvb2wgcmVxdWlyZXNTdHJva2UgPSB0cnVlKSBj
b25zdDsKKyAgICBib29sIGZpbGxDb250YWlucyhjb25zdCBGbG9hdFBvaW50JiwgYm9vbCByZXF1
aXJlc0ZpbGwgPSB0cnVlKSBjb25zdDsKKyAgICBib29sIHN0cm9rZUNvbnRhaW5zKGNvbnN0IEZs
b2F0UG9pbnQmLCBib29sIHJlcXVpcmVzU3Ryb2tlID0gdHJ1ZSkgY29uc3Q7CiAKICAgICAvLyBS
ZXR1cm5zIGFuIHVuc2NhbGVkIGJvdW5kaW5nIGJveCAobm90IGV2ZW4gaW5jbHVkaW5nIGxvY2Fs
VHJhbnNmb3JtKCkpIGZvciB0aGlzIHZlY3RvciBwYXRoCiAgICAgdmlydHVhbCBGbG9hdFJlY3Qg
cmVsYXRpdmVCQm94KGJvb2wgaW5jbHVkZVN0cm9rZSA9IHRydWUpIGNvbnN0OwpAQCAtNzUsNyAr
ODAsNiBAQCBwdWJsaWM6CiAgICAgdmlydHVhbCBib29sIG5vZGVBdFBvaW50KGNvbnN0IEhpdFRl
c3RSZXF1ZXN0JiwgSGl0VGVzdFJlc3VsdCYsIGludCB4LCBpbnQgeSwgaW50IHR4LCBpbnQgdHks
IEhpdFRlc3RBY3Rpb24pOwogCiAgICAgRmxvYXRSZWN0IGRyYXdNYXJrZXJzSWZOZWVkZWQoR3Jh
cGhpY3NDb250ZXh0KiwgY29uc3QgRmxvYXRSZWN0JiwgY29uc3QgUGF0aCYpIGNvbnN0OwotICAg
IHZpcnR1YWwgRmxvYXRSZWN0IHN0cm9rZUJCb3goKSBjb25zdDsKICAgICAKIHByaXZhdGU6CiAg
ICAgRmxvYXRQb2ludCBtYXBBYnNvbHV0ZVBvaW50VG9Mb2NhbChjb25zdCBGbG9hdFBvaW50Jikg
Y29uc3Q7CkluZGV4OiBXZWJDb3JlL3N2Zy9ncmFwaGljcy9jYWlyby9SZW5kZXJQYXRoQ2Fpcm8u
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL2NhaXJvL1JlbmRlclBhdGhD
YWlyby5jcHAJKHJldmlzaW9uIDM5MzAzKQorKysgV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2Fpcm8v
UmVuZGVyUGF0aENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzYsMTcgKzM2LDQgQEAgYm9v
bCBSZW5kZXJQYXRoOjpzdHJva2VDb250YWlucyhjb25zdCBGbAogICAgIHJldHVybiBjYWlyb19p
bl9zdHJva2UoY3IsIHBvaW50LngoKSwgcG9pbnQueSgpKTsKIH0KIAotRmxvYXRSZWN0IFJlbmRl
clBhdGg6OnN0cm9rZUJCb3goKSBjb25zdAotewotICAgIC8vIFRPRE86IHRoaXMgaW1wbGVtZW50
YXRpb24gaXMgbmFpdmUKLQotICAgIGNhaXJvX3QqIGNyID0gcGF0aCgpLnBsYXRmb3JtUGF0aCgp
LT5tX2NyOwotCi0gICAgZG91YmxlIHgwLCB4MSwgeTAsIHkxOwotICAgIGNhaXJvX3N0cm9rZV9l
eHRlbnRzKGNyLCAmeDAsICZ5MCwgJngxLCAmeTEpOwotICAgIEZsb2F0UmVjdCBiYm94ID0gRmxv
YXRSZWN0KHgwLCB5MCwgeDEgLSB4MCwgeTEgLSB5MCk7Ci0KLSAgICByZXR1cm4gYmJveDsKLX0K
LQogfQpJbmRleDogV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2cvUmVuZGVyUGF0aENnLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9ncmFwaGljcy9jZy9SZW5kZXJQYXRoQ2cuY3BwCShyZXZp
c2lvbiAzOTMwMykKKysrIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL2NnL1JlbmRlclBhdGhDZy5jcHAJ
KHdvcmtpbmcgY29weSkKQEAgLTQwLDE1ICs0MCw2IEBACiAKIG5hbWVzcGFjZSBXZWJDb3JlIHsK
IAotRmxvYXRSZWN0IFJlbmRlclBhdGg6OnN0cm9rZUJCb3goKSBjb25zdAotewotICAgIGlmIChz
dHlsZSgpLT5zdmdTdHlsZSgpLT5oYXNTdHJva2UoKSkKLSAgICAgICAgcmV0dXJuIHN0cm9rZUJv
dW5kaW5nQm94KHBhdGgoKSwgc3R5bGUoKSwgdGhpcyk7Ci0KLSAgICByZXR1cm4gcGF0aCgpLmJv
dW5kaW5nUmVjdCgpOwotfQotCi0KIGJvb2wgUmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMoY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQsIGJvb2wgcmVxdWlyZXNTdHJva2UpIGNvbnN0CiB7CiAgICAg
aWYgKHBhdGgoKS5pc0VtcHR5KCkpCkluZGV4OiBXZWJDb3JlL3N2Zy9ncmFwaGljcy9xdC9SZW5k
ZXJQYXRoUXQuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL3F0L1JlbmRl
clBhdGhRdC5jcHAJKHJldmlzaW9uIDM5MzAzKQorKysgV2ViQ29yZS9zdmcvZ3JhcGhpY3MvcXQv
UmVuZGVyUGF0aFF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtNDIsNDggKzQyLDYgQEAgYm9vbCBS
ZW5kZXJQYXRoOjpzdHJva2VDb250YWlucyhjb25zdCBGbAogICAgIHJldHVybiBmYWxzZTsKIH0K
IAotc3RhdGljIFFQYWludGVyUGF0aCBnZXRQYXRoU3Ryb2tlKGNvbnN0IFFQYWludGVyUGF0aCAm
cGF0aCwgY29uc3QgUmVuZGVyT2JqZWN0KiBvYmplY3QsIGNvbnN0IFJlbmRlclN0eWxlKiBzdHls
ZSkKLXsgCi0gICAgUVBhaW50ZXJQYXRoU3Ryb2tlciBzOwotICAgIHMuc2V0V2lkdGgoU1ZHUmVu
ZGVyU3R5bGU6OmNzc1ByaW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwgc3R5bGUtPnN2Z1N0eWxlKCkt
PnN0cm9rZVdpZHRoKCksIDEuMCkpOwotCi0gICAgaWYgKHN0eWxlLT5zdmdTdHlsZSgpLT5jYXBT
dHlsZSgpID09IEJ1dHRDYXApCi0gICAgICAgIHMuc2V0Q2FwU3R5bGUoUXQ6OkZsYXRDYXApOwot
ICAgIGVsc2UgaWYgKHN0eWxlLT5zdmdTdHlsZSgpLT5jYXBTdHlsZSgpID09IFJvdW5kQ2FwKQot
ICAgICAgICBzLnNldENhcFN0eWxlKFF0OjpSb3VuZENhcCk7Ci0KLSAgICBpZiAoc3R5bGUtPnN2
Z1N0eWxlKCktPmpvaW5TdHlsZSgpID09IE1pdGVySm9pbikgewotICAgICAgICBzLnNldEpvaW5T
dHlsZShRdDo6TWl0ZXJKb2luKTsKLSAgICAgICAgcy5zZXRNaXRlckxpbWl0KChxcmVhbCkgc3R5
bGUtPnN2Z1N0eWxlKCktPnN0cm9rZU1pdGVyTGltaXQoKSk7Ci0gICAgfSBlbHNlIGlmKHN0eWxl
LT5zdmdTdHlsZSgpLT5qb2luU3R5bGUoKSA9PSBSb3VuZEpvaW4pCi0gICAgICAgIHMuc2V0Sm9p
blN0eWxlKFF0OjpSb3VuZEpvaW4pOwotCi0gICAgY29uc3QgRGFzaEFycmF5JiBkYXNoZXMgPSBX
ZWJDb3JlOjpkYXNoQXJyYXlGcm9tUmVuZGVyaW5nU3R5bGUoc3R5bGUpOwotICAgIGRvdWJsZSBk
YXNoT2Zmc2V0ID0gU1ZHUmVuZGVyU3R5bGU6OmNzc1ByaW1pdGl2ZVRvTGVuZ3RoKG9iamVjdCwg
c3R5bGUtPnN2Z1N0eWxlKCktPnN0cm9rZURhc2hPZmZzZXQoKSwgMC4wKTsKLQotICAgIHVuc2ln
bmVkIGludCBkYXNoTGVuZ3RoID0gIWRhc2hlcy5pc0VtcHR5KCkgPyBkYXNoZXMuc2l6ZSgpIDog
MDsKLSAgICBpZihkYXNoTGVuZ3RoKSB7Ci0gICAgICAgIFFWZWN0b3I8cXJlYWw+IHBhdHRlcm47
Ci0gICAgICAgIHVuc2lnbmVkIGludCBjb3VudCA9IChkYXNoTGVuZ3RoICUgMikgPT0gMCA/IGRh
c2hMZW5ndGggOiBkYXNoTGVuZ3RoICogMjsKLQotICAgICAgICBmb3IodW5zaWduZWQgaW50IGkg
PSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgIHBhdHRlcm4uYXBwZW5kKGRhc2hlc1tp
ICUgZGFzaExlbmd0aF0gLyAoZmxvYXQpcy53aWR0aCgpKTsKLQotICAgICAgICBzLnNldERhc2hQ
YXR0ZXJuKHBhdHRlcm4pOwotICAgIAotICAgICAgICBRX1VOVVNFRChkYXNoT2Zmc2V0KTsKLSAg
ICAgICAgLy8gVE9ETzogZGFzaC1vZmZzZXQsIGRvZXMvd2lsbCBxdDQgQVBJIGFsbG93IGl0PyAo
Um9iKQotICAgIH0KLQotICAgIHJldHVybiBzLmNyZWF0ZVN0cm9rZShwYXRoKTsKLX0KLQotRmxv
YXRSZWN0IFJlbmRlclBhdGg6OnN0cm9rZUJCb3goKSBjb25zdAotewotICAgIFFQYWludGVyUGF0
aCBvdXRsaW5lID0gZ2V0UGF0aFN0cm9rZSgqKHBhdGgoKS5wbGF0Zm9ybVBhdGgoKSksIHRoaXMs
IHN0eWxlKCkpOwotICAgIHJldHVybiBvdXRsaW5lLmJvdW5kaW5nUmVjdCgpOwotfQotCiB9CiAK
IC8vIHZpbTp0cz00Om5vZXQK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26187</attachid>
            <date>2008-12-21 12:28:27 -0800</date>
            <delta_ts>2008-12-21 12:55:57 -0800</delta_ts>
            <desc>Move strokeBBox code to Path 3</desc>
            <filename>renderpath-4.patch</filename>
            <type>text/plain</type>
            <size>20152</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzggQEAKKzIwMDgtMTItMjEgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3Zl
IHRoZSB0aGUgcGxhdGZvcm0gZGVwZW5kZW50IHN0cm9rZUJCb3ggZnVuY3Rpb25hbGl0eSBvdXQg
b2YgUmVuZGVyUGF0aAorICAgICAgICBpbnRvIFBhdGggd2l0aCBzdHJva2VCb3VuZGluZ1JlY3Qu
CisKKyAgICAgICAgUmVuZGVyUGF0aCBjbGVhbi11cCBmb3Igc3Ryb2tlQm91bmRpbmdCb3gKKyAg
ICAgICAgW2h0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjkwMl0KKwor
ICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRl
eHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9QYXRoLmg6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvU3Ryb2tlU3R5bGVBcHBsaWVyLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6U3Ryb2tlU3R5bGVBcHBsaWVyOjp+U3Ryb2tlU3R5bGVBcHBsaWVyKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QYXRoQ2Fpcm8uY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6UGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9jZy9QYXRoQ0cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlU2NyYXRjaENvbnRleHQp
OgorICAgICAgICAoV2ViQ29yZTo6c2NyYXRjaENvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6
UGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9x
dC9HcmFwaGljc0NvbnRleHRRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQ6OnBlbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvUGF0aFF0LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6CisgICAgICAgICogcmVu
ZGVyaW5nL1JlbmRlclBhdGguY3BwOgorICAgICAgICAoV2ViQ29yZTo6U3Ryb2tlQm91bmRpbmdS
ZWN0U3R5bGVBcHBsaWVyOjpTdHJva2VCb3VuZGluZ1JlY3RTdHlsZUFwcGxpZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6U3Ryb2tlQm91bmRpbmdSZWN0U3R5bGVBcHBsaWVyOjpzdHJva2VTdHlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJQYXRoOjpyZWxhdGl2ZUJCb3gpOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJQYXRoLmg6CisgICAgICAgICogc3ZnL2dyYXBoaWNzL2NhaXJvL1Jl
bmRlclBhdGhDYWlyby5jcHA6CisgICAgICAgICogc3ZnL2dyYXBoaWNzL2NnL1JlbmRlclBhdGhD
Zy5jcHA6CisgICAgICAgICogc3ZnL2dyYXBoaWNzL3F0L1JlbmRlclBhdGhRdC5jcHA6CisKIDIw
MDgtMTItMjAgIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KIAogICAgICAgICBG
aXggdHlwbyAiQ1NTQWZlclJ1bGVWYWx1ZSIgdG8gIkNTU0FmdGVyUnVsZVZhbHVlIgpJbmRleDog
V2ViQ29yZS9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0dOVW1ha2VmaWxl
LmFtCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHdvcmtpbmcg
Y29weSkKQEAgLTEzMjYsNiArMTMyNiw3IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oIFwKIAlXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL1N0cmluZ1RydW5jYXRvci5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvU3RyaW5nVHJ1bmNhdG9yLmggXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU3Ryb2tl
U3R5bGVBcHBsaWVyLmggXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvVGV4dFJ1bi5oIFwK
IAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1VuaXRCZXppZXIuaCBcCiAJV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJhdG9yLmNwcCBcCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMzk0MjYpCisrKyBXZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtODczLDYg
Kzg3Myw3IEBACiAJCTc1NzkzRUQzMEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdlRXZlbnQu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc1NzkzRUQw
MEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdlRXZlbnQuaCAqLzsgfTsKIAkJNzU3OTNFRDQw
RDBDRTg1QjAwN0ZDMEFDIC8qIERPTU1lc3NhZ2VFdmVudC5tbSBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc1NzkzRUQxMEQwQ0U4NUIwMDdGQzBBQyAvKiBE
T01NZXNzYWdlRXZlbnQubW0gKi87IH07CiAJCTc1NzkzRUQ1MEQwQ0U4NUIwMDdGQzBBQyAvKiBE
T01NZXNzYWdlRXZlbnRJbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNzU3OTNFRDIwRDBDRTg1QjAwN0ZDMEFDIC8qIERPTU1lc3NhZ2VFdmVu
dEludGVybmFsLmggKi87IH07CisJCTg0OUY3Nzc2MEVGRUM2MjAwMDkwODQ5RCAvKiBTdHJva2VT
dHlsZUFwcGxpZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDg0OUY3Nzc1MEVGRUM2MjAwMDkwODQ5RCAvKiBTdHJva2VTdHlsZUFwcGxpZXIuaCAqLzsg
fTsKIAkJODUwMDREOTQwQUNFRUFFRjAwQzQzOEY2IC8qIERPTVNWR0RlZnNFbGVtZW50LmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NTAwNEQ4ODBBQ0VF
QUVGMDBDNDM4RjYgLyogRE9NU1ZHRGVmc0VsZW1lbnQuaCAqLzsgfTsKIAkJODUwMDREOTUwQUNF
RUFFRjAwQzQzOEY2IC8qIERPTVNWR0RlZnNFbGVtZW50Lm1tIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODUwMDREODkwQUNFRUFFRjAwQzQzOEY2IC8qIERP
TVNWR0RlZnNFbGVtZW50Lm1tICovOyB9OwogCQk4NTAwNEQ5NjBBQ0VFQUVGMDBDNDM4RjYgLyog
RE9NU1ZHRGVzY0VsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDg1MDA0RDhBMEFDRUVBRUYwMEM0MzhGNiAvKiBET01TVkdEZXNjRWxlbWVudC5o
ICovOyB9OwpAQCAtNTc1Miw2ICs1NzUzLDcgQEAKIAkJNzU3OTNFRDAwRDBDRTg1QjAwN0ZDMEFD
IC8qIERPTU1lc3NhZ2VFdmVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
RE9NTWVzc2FnZUV2ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc1NzkzRUQx
MEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdlRXZlbnQubW0gKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAub2JqY3BwOyBwYXRoID0gRE9NTWVzc2FnZUV2ZW50Lm1tOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQk3NTc5M0VEMjBEMENFODVCMDA3RkMwQUMgLyogRE9NTWVzc2FnZUV2
ZW50SW50ZXJuYWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERPTU1lc3Nh
Z2VFdmVudEludGVybmFsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTg0OUY3Nzc1
MEVGRUM2MjAwMDkwODQ5RCAvKiBTdHJva2VTdHlsZUFwcGxpZXIuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gU3Ryb2tlU3R5bGVBcHBsaWVyLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTg0QjJCMUY3MDU2QkVGM0EwMEQyQjc3MSAvKiBXZWJDb3JlS2V5R2VuZXJh
dG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGlu
ZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFdlYkNvcmVLZXlHZW5lcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGgg
PSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCTg0QjJCMUY4MDU2QkVGM0EwMEQyQjc3MSAvKiBXZWJD
b3JlS2V5R2VuZXJhdG9yLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMub2JqYzsgcGF0aCA9IFdlYkNvcmVLZXlHZW5lcmF0b3IubTsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCTg0QjJCMjRGMDU2QkYxNUYw
MEQyQjc3MSAvKiBTU0xLZXlHZW5lcmF0b3JNYWMubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBTU0xLZXlHZW5lcmF0b3JNYWMubW07
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwpA
QCAtOTU3NCw2ICs5NTc2LDcgQEAKIAkJCQk0OUU5MTFCQTBFRjg2RDQ3MDA5RDBDQUYgLyogU2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb24uY3BwICovLAogCQkJCTQ5RTkxMUJCMEVGODZENDcwMDlEMENB
RiAvKiBTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbi5oICovLAogCQkJCTQ5RTkxMUJDMEVGODZENDcw
MDlEMENBRiAvKiBTa2V3VHJhbnNmb3JtT3BlcmF0aW9uLmNwcCAqLywKKwkJCQk4NDlGNzc3NTBF
RkVDNjIwMDA5MDg0OUQgLyogU3Ryb2tlU3R5bGVBcHBsaWVyLmggKi8sCiAJCQkJNDlFOTExQkQw
RUY4NkQ0NzAwOUQwQ0FGIC8qIFNrZXdUcmFuc2Zvcm1PcGVyYXRpb24uaCAqLywKIAkJCQk0OUU5
MTFCRTBFRjg2RDQ3MDA5RDBDQUYgLyogVHJhbnNmb3JtT3BlcmF0aW9uLmggKi8sCiAJCQkJNDlF
OTExQkYwRUY4NkQ0NzAwOUQwQ0FGIC8qIFRyYW5zZm9ybU9wZXJhdGlvbnMuY3BwICovLApAQCAt
MTY0NTUsNiArMTY0NTgsNyBAQAogCQkJCTQ5RTkxMkFCMEVGQUM5MDYwMDlEMENBRiAvKiBBbmlt
YXRpb24uaCBpbiBIZWFkZXJzICovLAogCQkJCTQ5RTkxMkFEMEVGQUM5MDYwMDlEMENBRiAvKiBB
bmltYXRpb25MaXN0LmggaW4gSGVhZGVycyAqLywKIAkJCQk0OUU5MTJBRTBFRkFDOTA2MDA5RDBD
QUYgLyogVGltaW5nRnVuY3Rpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTg0OUY3Nzc2MEVGRUM2
MjAwMDkwODQ5RCAvKiBTdHJva2VTdHlsZUFwcGxpZXIuaCBpbiBIZWFkZXJzICovLAogCQkJKTsK
IAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCShyZXZpc2lvbiAz
OTQyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgJKHdv
cmtpbmcgY29weSkKQEAgLTMxMiw2ICszMTIsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjaWYg
UExBVEZPUk0oUVQpCiAgICAgICAgIGJvb2wgaW5UcmFuc3BhcmVuY3lMYXllcigpIGNvbnN0Owog
ICAgICAgICBQbGF0Zm9ybVBhdGgqIGN1cnJlbnRQYXRoKCk7CisgICAgICAgIFFQZW4gcGVuKCk7
CiAjZW5kaWYKIAogI2lmIFBMQVRGT1JNKEdUSykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvUGF0aC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0
aC5oCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5o
CSh3b3JraW5nIGNvcHkpCkBAIC01Niw3ICs1Niw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICBjbGFzcyBGbG9hdFBvaW50OwogICAgIGNsYXNzIEZsb2F0U2l6ZTsKICAgICBjbGFzcyBGbG9h
dFJlY3Q7CisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OwogICAgIGNsYXNzIFN0cmluZzsKKyAg
ICBjbGFzcyBTdHJva2VTdHlsZUFwcGxpZXI7CiAKICAgICBlbnVtIFdpbmRSdWxlIHsKICAgICAg
ICAgUlVMRV9OT05aRVJPID0gMCwKQEAgLTg4LDYgKzkwLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogCiAgICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYsIFdpbmRSdWxlIHJ1
bGUgPSBSVUxFX05PTlpFUk8pIGNvbnN0OwogICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0
KCkgY29uc3Q7CisgICAgICAgIEZsb2F0UmVjdCBzdHJva2VCb3VuZGluZ1JlY3QoU3Ryb2tlU3R5
bGVBcHBsaWVyKiBhcHBsaWVyID0gMCk7CiAgICAgICAgIAogICAgICAgICBmbG9hdCBsZW5ndGgo
KTsKICAgICAgICAgRmxvYXRQb2ludCBwb2ludEF0TGVuZ3RoKGZsb2F0IGxlbmd0aCwgYm9vbCYg
b2spOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TdHJva2VTdHlsZUFwcGxpZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1N0cm9rZVN0eWxlQXBw
bGllci5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TdHJva2VT
dHlsZUFwcGxpZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAgICBDb3B5
cmlnaHQgKEMpIDIwMDggRGlyayBTY2h1bHplIDxrcml0QHdlYmtpdC5vcmc+CisKKyAgICBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWludCB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaWZuZGVm
IFN0cm9rZVN0eWxlQXBwbGllcl9oCisjZGVmaW5lIFN0cm9rZVN0eWxlQXBwbGllcl9oCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKKworICAgIGNs
YXNzIFN0cm9rZVN0eWxlQXBwbGllciB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIH5T
dHJva2VTdHlsZUFwcGxpZXIoKSB7fQorICAgICAgICB2aXJ0dWFsIHZvaWQgc3Ryb2tlU3R5bGUo
R3JhcGhpY3NDb250ZXh0KikgPSAwOworICAgIH07Cit9CisKKyNlbmRpZgorCkluZGV4OiBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL1BhdGhDYWlyby5jcHAKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QYXRoQ2Fpcm8uY3BwCShyZXZpc2lvbiAz
OTQyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fpcm8vUGF0aENhaXJvLmNwcAko
d29ya2luZyBjb3B5KQpAQCAtMjcsOCArMjcsMTAgQEAKICNpbmNsdWRlICJBZmZpbmVUcmFuc2Zv
cm0uaCIKICNpbmNsdWRlICJDYWlyb1BhdGguaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgog
I2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU3Ryb2tlU3R5bGVBcHBsaWVy
LmgiCiAKICNpbmNsdWRlIDxjYWlyby5oPgogI2luY2x1ZGUgPG1hdGguaD4KQEAgLTE4OCw2ICsx
OTAsMTggQEAgRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgpIGNvbnN0CiAgICAgcmV0dXJu
IEZsb2F0UmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOwogfQogCitGbG9hdFJlY3QgUGF0
aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxlQXBwbGllciogYXBwbGllcikKK3sKKyAg
ICBjYWlyb190KiBjciA9IHBsYXRmb3JtUGF0aCgpLT5tX2NyOworICAgIEdyYXBoaWNzQ29udGV4
dCBnYyhjcik7CisgICAgaWYgKGFwcGxpZXIpCisgICAgICAgIGFwcGxpZXItPnN0cm9rZVN0eWxl
KCZnYyk7CisKKyAgICBkb3VibGUgeDAsIHgxLCB5MCwgeTE7CisgICAgY2Fpcm9fc3Ryb2tlX2V4
dGVudHMoY3IsICZ4MCwgJnkwLCAmeDEsICZ5MSk7CisgICAgcmV0dXJuIEZsb2F0UmVjdCh4MCwg
eTAsIHgxIC0geDAsIHkxIC0geTApOworfQorCiBib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0IEZs
b2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAogewogICAgIGlmICghYm91bmRp
bmdSZWN0KCkuY29udGFpbnMocG9pbnQpKQpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9jZy9QYXRoQ0cuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
Y2cvUGF0aENHLmNwcAkocmV2aXNpb24gMzk0MjYpCisrKyBXZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2NnL1BhdGhDRy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMyLDggKzMyLDEwIEBACiAjaW5j
bHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVkZSA8QXBwbGljYXRpb25TZXJ2aWNlcy9B
cHBsaWNhdGlvblNlcnZpY2VzLmg+CiAjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAi
R3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW50UmVjdC5oIgogI2luY2x1ZGUgIlBsYXRm
b3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU3Ryb2tlU3R5bGVBcHBsaWVyLmgiCiAKICNpbmNsdWRl
IDx3dGYvTWF0aEV4dHJhcy5oPgogCkBAIC02Miw2ICs2NCwyOCBAQCBQYXRoJiBQYXRoOjpvcGVy
YXRvcj0oY29uc3QgUGF0aCYgb3RoZXIpCiAgICAgcmV0dXJuICp0aGlzOwogfQogCitzdGF0aWMg
Q0dDb250ZXh0UmVmIGNyZWF0ZVNjcmF0Y2hDb250ZXh0KCkKK3sKKyAgICBzdGF0aWMgQ0dDb250
ZXh0UmVmIHNfY29udGV4dFJlZiA9IDA7CisgICAgaWYgKCFzX2NvbnRleHRSZWYpIHsKKyAgICAg
ICAgQ0ZNdXRhYmxlRGF0YVJlZiBlbXB0eSA9IENGRGF0YUNyZWF0ZU11dGFibGUoTlVMTCwgMCk7
CisgICAgICAgIENHRGF0YUNvbnN1bWVyUmVmIGNvbnN1bWVyID0gQ0dEYXRhQ29uc3VtZXJDcmVh
dGVXaXRoQ0ZEYXRhKGVtcHR5KTsKKyAgICAgICAgc19jb250ZXh0UmVmID0gQ0dQREZDb250ZXh0
Q3JlYXRlKGNvbnN1bWVyLCBOVUxMLCBOVUxMKTsKKyAgICAgICAgQ0dEYXRhQ29uc3VtZXJSZWxl
YXNlKGNvbnN1bWVyKTsKKyAgICAgICAgQ0ZSZWxlYXNlKGVtcHR5KTsKKworICAgICAgICBDR0Zs
b2F0IGJsYWNrWzRdID0gezAsIDAsIDAsIDF9OworICAgICAgICBDR0NvbnRleHRTZXRGaWxsQ29s
b3Ioc19jb250ZXh0UmVmLCBibGFjayk7CisgICAgICAgIENHQ29udGV4dFNldFN0cm9rZUNvbG9y
KHNfY29udGV4dFJlZiwgYmxhY2spOworICAgIH0KKyAgICByZXR1cm4gc19jb250ZXh0UmVmOwor
fQorCitzdGF0aWMgaW5saW5lIENHQ29udGV4dFJlZiBzY3JhdGNoQ29udGV4dCgpCit7CisgICAg
c3RhdGljIENHQ29udGV4dFJlZiBjb250ZXh0ID0gY3JlYXRlU2NyYXRjaENvbnRleHQoKTsKKyAg
ICByZXR1cm4gY29udGV4dDsKK30KIAogc3RhdGljIHZvaWQgY29weUNsb3NpbmdTdWJwYXRoc0Fw
cGxpZXJGdW5jdGlvbih2b2lkKiBpbmZvLCBjb25zdCBDR1BhdGhFbGVtZW50KiBlbGVtZW50KQog
ewpAQCAtMTIzLDYgKzE0NywyOSBAQCBGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29u
c3QKICAgICByZXR1cm4gQ0dQYXRoR2V0Qm91bmRpbmdCb3gobV9wYXRoKTsKIH0KIAorRmxvYXRS
ZWN0IFBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdChTdHJva2VTdHlsZUFwcGxpZXIqIGFwcGxpZXIp
Cit7CisgICAgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBzY3JhdGNoQ29udGV4dCgpOworCisgICAg
Q0dDb250ZXh0U2F2ZUdTdGF0ZShjb250ZXh0KTsKKyAgICBDR0NvbnRleHRCZWdpblBhdGgoY29u
dGV4dCk7CisgICAgQ0dDb250ZXh0QWRkUGF0aChjb250ZXh0LCBwbGF0Zm9ybVBhdGgoKSk7CisK
KyAgICBHcmFwaGljc0NvbnRleHQgZ2MoY29udGV4dCk7CisgICAgaWYgKGFwcGxpZXIpCisgICAg
ICAgIGFwcGxpZXItPnN0cm9rZVN0eWxlKCZnYyk7CisKKyAgICBDR0NvbnRleHRSZXBsYWNlUGF0
aFdpdGhTdHJva2VkUGF0aChjb250ZXh0KTsKKyAgICBpZiAoQ0dDb250ZXh0SXNQYXRoRW1wdHko
Y29udGV4dCkpIHsKKyAgICAgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0ZShjb250ZXh0KTsKKyAg
ICAgICAgcmV0dXJuIEZsb2F0UmVjdCgpOworICAgIH0KKyAgICBDR1JlY3QgYm94ID0gQ0dDb250
ZXh0R2V0UGF0aEJvdW5kaW5nQm94KGNvbnRleHQpOworICAgIENHQ29udGV4dFJlc3RvcmVHU3Rh
dGUoY29udGV4dCk7CisKKyAgICByZXR1cm4gRmxvYXRSZWN0KGJveCk7Cit9CisKIHZvaWQgUGF0
aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQogewogICAgIENHUGF0aE1vdmVUb1Bv
aW50KG1fcGF0aCwgMCwgcG9pbnQueCgpLCBwb2ludC55KCkpOwpJbmRleDogV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHAKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHAJKHJldmlzaW9u
IDM5NDI2KQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRR
dC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTUyNSw2ICs1MjUsMTUgQEAgdm9pZCBHcmFwaGljc0Nv
bnRleHQ6OmRyYXdDb252ZXhQb2x5Z29uKAogICAgIHAtPnJlc3RvcmUoKTsKIH0KIAorUVBlbiBH
cmFwaGljc0NvbnRleHQ6OnBlbigpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAg
ICAgICAgcmV0dXJuIFFQZW4oKTsKKworICAgIFFQYWludGVyICpwID0gbV9kYXRhLT5wKCk7Cisg
ICAgcmV0dXJuIHAtPnBlbigpOworfQorCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgo
KQogewogICAgIGlmIChwYWludGluZ0Rpc2FibGVkKCkpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3F0L1BhdGhRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9n
cmFwaGljcy9xdC9QYXRoUXQuY3BwCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3MvcXQvUGF0aFF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksOSArMjksMTIg
QEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJQYXRoLmgiCiAKKyNpbmNsdWRlICJB
ZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFw
aGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgogI2luY2x1ZGUgIlBsYXRm
b3JtU3RyaW5nLmgiCi0jaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiU3Ry
b2tlU3R5bGVBcHBsaWVyLmgiCiAjaW5jbHVkZSA8UVBhaW50ZXJQYXRoPgogI2luY2x1ZGUgPFFN
YXRyaXg+CiAjaW5jbHVkZSA8UVN0cmluZz4KQEAgLTkzLDYgKzk2LDI3IEBAIEZsb2F0UmVjdCBQ
YXRoOjpib3VuZGluZ1JlY3QoKSBjb25zdAogICAgIHJldHVybiBtX3BhdGgtPmJvdW5kaW5nUmVj
dCgpOwogfQogCitGbG9hdFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxl
QXBwbGllciogYXBwbGllcikKK3sKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHRyeSB0byB1c2Ug
YSAnc2hhcmVkIENvbnRleHQnIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgSW1hZ2VCdWZmZXIK
KyAgICAvLyBvbiBlYWNoIGNhbGwuCisgICAgc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gc2Ny
YXRjaEltYWdlID0gSW1hZ2VCdWZmZXI6OmNyZWF0ZShJbnRTaXplKDEsIDEpLCBmYWxzZSk7Cisg
ICAgR3JhcGhpY3NDb250ZXh0KiBnYyA9IHNjcmF0Y2hJbWFnZS0+Y29udGV4dCgpOworICAgIFFQ
YWludGVyUGF0aFN0cm9rZXIgc3Ryb2tlOworICAgIGlmIChhcHBsaWVyKSB7CisgICAgICAgIGFw
cGxpZXItPnN0cm9rZVN0eWxlKGdjKTsKKworICAgICAgICBRUGVuIHBlbiA9IGdjLT5wZW4oKTsK
KyAgICAgICAgc3Ryb2tlLnNldFdpZHRoKHBlbi53aWR0aEYoKSk7CisgICAgICAgIHN0cm9rZS5z
ZXRDYXBTdHlsZShwZW4uY2FwU3R5bGUoKSk7CisgICAgICAgIHN0cm9rZS5zZXRKb2luU3R5bGUo
cGVuLmpvaW5TdHlsZSgpKTsKKyAgICAgICAgc3Ryb2tlLnNldE1pdGVyTGltaXQocGVuLm1pdGVy
TGltaXQoKSk7CisgICAgICAgIHN0cm9rZS5zZXREYXNoUGF0dGVybihwZW4uZGFzaFBhdHRlcm4o
KSk7CisgICAgICAgIHN0cm9rZS5zZXREYXNoT2Zmc2V0KHBlbi5kYXNoT2Zmc2V0KCkpOworICAg
IH0KKyAgICByZXR1cm4gKHN0cm9rZS5jcmVhdGVTdHJva2UoKnBsYXRmb3JtUGF0aCgpKSkuYm91
bmRpbmdSZWN0KCk7Cit9CisKIHZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KQogewogICAgIG1fcGF0aC0+bW92ZVRvKHBvaW50KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVy
aW5nL1JlbmRlclBhdGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
clBhdGguY3BwCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclBh
dGguY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiR3JhcGhp
Y3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiUG9pbnRlckV2ZW50c0hpdFJ1bGVzLmgiCiAjaW5jbHVk
ZSAiUmVuZGVyU1ZHQ29udGFpbmVyLmgiCisjaW5jbHVkZSAiU3Ryb2tlU3R5bGVBcHBsaWVyLmgi
CiAjaW5jbHVkZSAiU1ZHUGFpbnRTZXJ2ZXIuaCIKICNpbmNsdWRlICJTVkdSZW5kZXJTdXBwb3J0
LmgiCiAjaW5jbHVkZSAiU1ZHUmVzb3VyY2VGaWx0ZXIuaCIKQEAgLTQ1LDYgKzQ2LDI2IEBACiAK
IG5hbWVzcGFjZSBXZWJDb3JlIHsKIAorY2xhc3MgU3Ryb2tlQm91bmRpbmdSZWN0U3R5bGVBcHBs
aWVyIDogcHVibGljIFN0cm9rZVN0eWxlQXBwbGllciB7CitwdWJsaWM6CisgICAgU3Ryb2tlQm91
bmRpbmdSZWN0U3R5bGVBcHBsaWVyKGNvbnN0IFJlbmRlck9iamVjdCogb2JqZWN0LCBSZW5kZXJT
dHlsZSogc3R5bGUpCisgICAgICAgIDogbV9vYmplY3Qob2JqZWN0KQorICAgICAgICAsIG1fc3R5
bGUoc3R5bGUpCisgICAgeworICAgICAgICBBU1NFUlQoc3R5bGUpOworICAgICAgICBBU1NFUlQo
b2JqZWN0KTsKKyAgICB9CisKKyAgICB2b2lkIHN0cm9rZVN0eWxlKEdyYXBoaWNzQ29udGV4dCog
Z2MpCisgICAgeworICAgICAgICBhcHBseVN0cm9rZVN0eWxlVG9Db250ZXh0KGdjLCBtX3N0eWxl
LCBtX29iamVjdCk7CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFJlbmRlck9iamVjdCog
bV9vYmplY3Q7CisgICAgUmVuZGVyU3R5bGUqIG1fc3R5bGU7Cit9OworCiAvLyBSZW5kZXJQYXRo
CiBSZW5kZXJQYXRoOjpSZW5kZXJQYXRoKFJlbmRlclN0eWxlKiBzdHlsZSwgU1ZHU3R5bGVkVHJh
bnNmb3JtYWJsZUVsZW1lbnQqIG5vZGUpCiAgICAgOiBSZW5kZXJPYmplY3Qobm9kZSkKQEAgLTg5
LDggKzExMCwxNyBAQCBGbG9hdFJlY3QgUmVuZGVyUGF0aDo6cmVsYXRpdmVCQm94KGJvb2wgCiAg
ICAgICAgIHJldHVybiBGbG9hdFJlY3QoKTsKIAogICAgIGlmIChpbmNsdWRlU3Ryb2tlKSB7Ci0g
ICAgICAgIGlmIChtX3N0cm9rZUJib3guaXNFbXB0eSgpKQotICAgICAgICAgICAgbV9zdHJva2VC
Ym94ID0gc3Ryb2tlQkJveCgpOworICAgICAgICBpZiAobV9zdHJva2VCYm94LmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgaWYgKHN0eWxlKCktPnN2Z1N0eWxlKCktPmhhc1N0cm9rZSgpKSB7Cisg
ICAgICAgICAgICAgICAgU3Ryb2tlQm91bmRpbmdSZWN0U3R5bGVBcHBsaWVyIHN0cm9rZVN0eWxl
KHRoaXMsIHN0eWxlKCkpOworICAgICAgICAgICAgICAgIG1fc3Ryb2tlQmJveCA9IG1fcGF0aC5z
dHJva2VCb3VuZGluZ1JlY3QoJnN0cm9rZVN0eWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgaWYgKG1fZmlsbEJCb3guaXNFbXB0eSgpKQorICAgICAgICAgICAgICAg
ICAgICBtX2ZpbGxCQm94ID0gbV9wYXRoLmJvdW5kaW5nUmVjdCgpOworCisgICAgICAgICAgICAg
ICAgbV9zdHJva2VCYm94ID0gbV9maWxsQkJveDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQog
CiAgICAgICAgIHJldHVybiBtX3N0cm9rZUJib3g7CiAgICAgfQpJbmRleDogV2ViQ29yZS9yZW5k
ZXJpbmcvUmVuZGVyUGF0aC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRl
clBhdGguaAkocmV2aXNpb24gMzk0MjYpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJQYXRo
LmgJKHdvcmtpbmcgY29weSkKQEAgLTQ2LDggKzQ2LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwg
flJlbmRlclBhdGgoKTsKIAogICAgIC8vIEhpdC1kZXRlY3Rpb24gc2VwZXJhdGVkIGZvciB0aGUg
ZmlsbCBhbmQgdGhlIHN0cm9rZQotICAgIHZpcnR1YWwgYm9vbCBmaWxsQ29udGFpbnMoY29uc3Qg
RmxvYXRQb2ludCYsIGJvb2wgcmVxdWlyZXNGaWxsID0gdHJ1ZSkgY29uc3Q7Ci0gICAgdmlydHVh
bCBib29sIHN0cm9rZUNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmLCBib29sIHJlcXVpcmVzU3Ry
b2tlID0gdHJ1ZSkgY29uc3Q7CisgICAgYm9vbCBmaWxsQ29udGFpbnMoY29uc3QgRmxvYXRQb2lu
dCYsIGJvb2wgcmVxdWlyZXNGaWxsID0gdHJ1ZSkgY29uc3Q7CisgICAgYm9vbCBzdHJva2VDb250
YWlucyhjb25zdCBGbG9hdFBvaW50JiwgYm9vbCByZXF1aXJlc1N0cm9rZSA9IHRydWUpIGNvbnN0
OwogCiAgICAgLy8gUmV0dXJucyBhbiB1bnNjYWxlZCBib3VuZGluZyBib3ggKG5vdCBldmVuIGlu
Y2x1ZGluZyBsb2NhbFRyYW5zZm9ybSgpKSBmb3IgdGhpcyB2ZWN0b3IgcGF0aAogICAgIHZpcnR1
YWwgRmxvYXRSZWN0IHJlbGF0aXZlQkJveChib29sIGluY2x1ZGVTdHJva2UgPSB0cnVlKSBjb25z
dDsKQEAgLTc1LDcgKzc1LDYgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2lu
dChjb25zdCBIaXRUZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGlu
dCB0eCwgaW50IHR5LCBIaXRUZXN0QWN0aW9uKTsKIAogICAgIEZsb2F0UmVjdCBkcmF3TWFya2Vy
c0lmTmVlZGVkKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IFBhdGgm
KSBjb25zdDsKLSAgICB2aXJ0dWFsIEZsb2F0UmVjdCBzdHJva2VCQm94KCkgY29uc3Q7CiAgICAg
CiBwcml2YXRlOgogICAgIEZsb2F0UG9pbnQgbWFwQWJzb2x1dGVQb2ludFRvTG9jYWwoY29uc3Qg
RmxvYXRQb2ludCYpIGNvbnN0OwpJbmRleDogV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2Fpcm8vUmVu
ZGVyUGF0aENhaXJvLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9ncmFwaGljcy9jYWly
by9SZW5kZXJQYXRoQ2Fpcm8uY3BwCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvc3ZnL2dy
YXBoaWNzL2NhaXJvL1JlbmRlclBhdGhDYWlyby5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDE3
ICszNiw0IEBAIGJvb2wgUmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMoY29uc3QgRmwKICAgICBy
ZXR1cm4gY2Fpcm9faW5fc3Ryb2tlKGNyLCBwb2ludC54KCksIHBvaW50LnkoKSk7CiB9CiAKLUZs
b2F0UmVjdCBSZW5kZXJQYXRoOjpzdHJva2VCQm94KCkgY29uc3QKLXsKLSAgICAvLyBUT0RPOiB0
aGlzIGltcGxlbWVudGF0aW9uIGlzIG5haXZlCi0KLSAgICBjYWlyb190KiBjciA9IHBhdGgoKS5w
bGF0Zm9ybVBhdGgoKS0+bV9jcjsKLQotICAgIGRvdWJsZSB4MCwgeDEsIHkwLCB5MTsKLSAgICBj
YWlyb19zdHJva2VfZXh0ZW50cyhjciwgJngwLCAmeTAsICZ4MSwgJnkxKTsKLSAgICBGbG9hdFJl
Y3QgYmJveCA9IEZsb2F0UmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOwotCi0gICAgcmV0
dXJuIGJib3g7Ci19Ci0KIH0KSW5kZXg6IFdlYkNvcmUvc3ZnL2dyYXBoaWNzL2NnL1JlbmRlclBh
dGhDZy5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2cvUmVuZGVyUGF0
aENnLmNwcAkocmV2aXNpb24gMzk0MjYpCisrKyBXZWJDb3JlL3N2Zy9ncmFwaGljcy9jZy9SZW5k
ZXJQYXRoQ2cuY3BwCSh3b3JraW5nIGNvcHkpCkBAIC00MCwxNSArNDAsNiBAQAogCiBuYW1lc3Bh
Y2UgV2ViQ29yZSB7CiAKLUZsb2F0UmVjdCBSZW5kZXJQYXRoOjpzdHJva2VCQm94KCkgY29uc3QK
LXsKLSAgICBpZiAoc3R5bGUoKS0+c3ZnU3R5bGUoKS0+aGFzU3Ryb2tlKCkpCi0gICAgICAgIHJl
dHVybiBzdHJva2VCb3VuZGluZ0JveChwYXRoKCksIHN0eWxlKCksIHRoaXMpOwotCi0gICAgcmV0
dXJuIHBhdGgoKS5ib3VuZGluZ1JlY3QoKTsKLX0KLQotCiBib29sIFJlbmRlclBhdGg6OnN0cm9r
ZUNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBib29sIHJlcXVpcmVzU3Ryb2tlKSBj
b25zdAogewogICAgIGlmIChwYXRoKCkuaXNFbXB0eSgpKQpJbmRleDogV2ViQ29yZS9zdmcvZ3Jh
cGhpY3MvcXQvUmVuZGVyUGF0aFF0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9ncmFw
aGljcy9xdC9SZW5kZXJQYXRoUXQuY3BwCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvc3Zn
L2dyYXBoaWNzL3F0L1JlbmRlclBhdGhRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDQ4ICs0
Miw2IEBAIGJvb2wgUmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMoY29uc3QgRmwKICAgICByZXR1
cm4gZmFsc2U7CiB9CiAKLXN0YXRpYyBRUGFpbnRlclBhdGggZ2V0UGF0aFN0cm9rZShjb25zdCBR
UGFpbnRlclBhdGggJnBhdGgsIGNvbnN0IFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBSZW5k
ZXJTdHlsZSogc3R5bGUpCi17IAotICAgIFFQYWludGVyUGF0aFN0cm9rZXIgczsKLSAgICBzLnNl
dFdpZHRoKFNWR1JlbmRlclN0eWxlOjpjc3NQcmltaXRpdmVUb0xlbmd0aChvYmplY3QsIHN0eWxl
LT5zdmdTdHlsZSgpLT5zdHJva2VXaWR0aCgpLCAxLjApKTsKLQotICAgIGlmIChzdHlsZS0+c3Zn
U3R5bGUoKS0+Y2FwU3R5bGUoKSA9PSBCdXR0Q2FwKQotICAgICAgICBzLnNldENhcFN0eWxlKFF0
OjpGbGF0Q2FwKTsKLSAgICBlbHNlIGlmIChzdHlsZS0+c3ZnU3R5bGUoKS0+Y2FwU3R5bGUoKSA9
PSBSb3VuZENhcCkKLSAgICAgICAgcy5zZXRDYXBTdHlsZShRdDo6Um91bmRDYXApOwotCi0gICAg
aWYgKHN0eWxlLT5zdmdTdHlsZSgpLT5qb2luU3R5bGUoKSA9PSBNaXRlckpvaW4pIHsKLSAgICAg
ICAgcy5zZXRKb2luU3R5bGUoUXQ6Ok1pdGVySm9pbik7Ci0gICAgICAgIHMuc2V0TWl0ZXJMaW1p
dCgocXJlYWwpIHN0eWxlLT5zdmdTdHlsZSgpLT5zdHJva2VNaXRlckxpbWl0KCkpOwotICAgIH0g
ZWxzZSBpZihzdHlsZS0+c3ZnU3R5bGUoKS0+am9pblN0eWxlKCkgPT0gUm91bmRKb2luKQotICAg
ICAgICBzLnNldEpvaW5TdHlsZShRdDo6Um91bmRKb2luKTsKLQotICAgIGNvbnN0IERhc2hBcnJh
eSYgZGFzaGVzID0gV2ViQ29yZTo6ZGFzaEFycmF5RnJvbVJlbmRlcmluZ1N0eWxlKHN0eWxlKTsK
LSAgICBkb3VibGUgZGFzaE9mZnNldCA9IFNWR1JlbmRlclN0eWxlOjpjc3NQcmltaXRpdmVUb0xl
bmd0aChvYmplY3QsIHN0eWxlLT5zdmdTdHlsZSgpLT5zdHJva2VEYXNoT2Zmc2V0KCksIDAuMCk7
Ci0KLSAgICB1bnNpZ25lZCBpbnQgZGFzaExlbmd0aCA9ICFkYXNoZXMuaXNFbXB0eSgpID8gZGFz
aGVzLnNpemUoKSA6IDA7Ci0gICAgaWYoZGFzaExlbmd0aCkgewotICAgICAgICBRVmVjdG9yPHFy
ZWFsPiBwYXR0ZXJuOwotICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSAoZGFzaExlbmd0aCAl
IDIpID09IDAgPyBkYXNoTGVuZ3RoIDogZGFzaExlbmd0aCAqIDI7Ci0KLSAgICAgICAgZm9yKHVu
c2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICBwYXR0ZXJuLmFw
cGVuZChkYXNoZXNbaSAlIGRhc2hMZW5ndGhdIC8gKGZsb2F0KXMud2lkdGgoKSk7Ci0KLSAgICAg
ICAgcy5zZXREYXNoUGF0dGVybihwYXR0ZXJuKTsKLSAgICAKLSAgICAgICAgUV9VTlVTRUQoZGFz
aE9mZnNldCk7Ci0gICAgICAgIC8vIFRPRE86IGRhc2gtb2Zmc2V0LCBkb2VzL3dpbGwgcXQ0IEFQ
SSBhbGxvdyBpdD8gKFJvYikKLSAgICB9Ci0KLSAgICByZXR1cm4gcy5jcmVhdGVTdHJva2UocGF0
aCk7Ci19Ci0KLUZsb2F0UmVjdCBSZW5kZXJQYXRoOjpzdHJva2VCQm94KCkgY29uc3QKLXsKLSAg
ICBRUGFpbnRlclBhdGggb3V0bGluZSA9IGdldFBhdGhTdHJva2UoKihwYXRoKCkucGxhdGZvcm1Q
YXRoKCkpLCB0aGlzLCBzdHlsZSgpKTsKLSAgICByZXR1cm4gb3V0bGluZS5ib3VuZGluZ1JlY3Qo
KTsKLX0KLQogfQogCiAvLyB2aW06dHM9NDpub2V0Cg==
</data>
<flag name="review"
          id="12367"
          type_id="1"
          status="-"
          setter="zimmermann"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>26188</attachid>
            <date>2008-12-21 12:55:57 -0800</date>
            <delta_ts>2008-12-21 15:14:14 -0800</delta_ts>
            <desc>Move strokeBBox code to Path 4</desc>
            <filename>renderpath-4.patch</filename>
            <type>text/plain</type>
            <size>20140</size>
            <attacher name="Dirk Schulze">krit</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvQ2hhbmdlTG9n
CShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBA
IC0xLDMgKzEsMzggQEAKKzIwMDgtMTItMjEgIERpcmsgU2NodWx6ZSAgPGtyaXRAd2Via2l0Lm9y
Zz4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBNb3Zl
IHRoZSB0aGUgcGxhdGZvcm0gZGVwZW5kZW50IHN0cm9rZUJCb3ggZnVuY3Rpb25hbGl0eSBvdXQg
b2YgUmVuZGVyUGF0aAorICAgICAgICBpbnRvIFBhdGggd2l0aCBzdHJva2VCb3VuZGluZ1JlY3Qu
CisKKyAgICAgICAgUmVuZGVyUGF0aCBjbGVhbi11cCBmb3Igc3Ryb2tlQm91bmRpbmdCb3gKKyAg
ICAgICAgW2h0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMjkwMl0KKwor
ICAgICAgICAqIEdOVW1ha2VmaWxlLmFtOgorICAgICAgICAqIFdlYkNvcmUueGNvZGVwcm9qL3By
b2plY3QucGJ4cHJvajoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRl
eHQuaDoKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9QYXRoLmg6CisgICAgICAgICogcGxh
dGZvcm0vZ3JhcGhpY3MvU3Ryb2tlU3R5bGVBcHBsaWVyLmg6IEFkZGVkLgorICAgICAgICAoV2Vi
Q29yZTo6U3Ryb2tlU3R5bGVBcHBsaWVyOjp+U3Ryb2tlU3R5bGVBcHBsaWVyKToKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QYXRoQ2Fpcm8uY3BwOgorICAgICAgICAoV2ViQ29y
ZTo6UGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGlj
cy9jZy9QYXRoQ0cuY3BwOgorICAgICAgICAoV2ViQ29yZTo6Y3JlYXRlU2NyYXRjaENvbnRleHQp
OgorICAgICAgICAoV2ViQ29yZTo6c2NyYXRjaENvbnRleHQpOgorICAgICAgICAoV2ViQ29yZTo6
UGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KToKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy9x
dC9HcmFwaGljc0NvbnRleHRRdC5jcHA6CisgICAgICAgIChXZWJDb3JlOjpHcmFwaGljc0NvbnRl
eHQ6OnBlbik6CisgICAgICAgICogcGxhdGZvcm0vZ3JhcGhpY3MvcXQvUGF0aFF0LmNwcDoKKyAg
ICAgICAgKFdlYkNvcmU6OlBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdCk6CisgICAgICAgICogcmVu
ZGVyaW5nL1JlbmRlclBhdGguY3BwOgorICAgICAgICAoV2ViQ29yZTo6U3Ryb2tlQm91bmRpbmdS
ZWN0U3R5bGVBcHBsaWVyOjpTdHJva2VCb3VuZGluZ1JlY3RTdHlsZUFwcGxpZXIpOgorICAgICAg
ICAoV2ViQ29yZTo6U3Ryb2tlQm91bmRpbmdSZWN0U3R5bGVBcHBsaWVyOjpzdHJva2VTdHlsZSk6
CisgICAgICAgIChXZWJDb3JlOjpSZW5kZXJQYXRoOjpyZWxhdGl2ZUJCb3gpOgorICAgICAgICAq
IHJlbmRlcmluZy9SZW5kZXJQYXRoLmg6CisgICAgICAgICogc3ZnL2dyYXBoaWNzL2NhaXJvL1Jl
bmRlclBhdGhDYWlyby5jcHA6CisgICAgICAgICogc3ZnL2dyYXBoaWNzL2NnL1JlbmRlclBhdGhD
Zy5jcHA6CisgICAgICAgICogc3ZnL2dyYXBoaWNzL3F0L1JlbmRlclBhdGhRdC5jcHA6CisKIDIw
MDgtMTItMjAgIERhdmlkIEtpbHplciAgPGRka2lsemVyQGFwcGxlLmNvbT4KIAogICAgICAgICBG
aXggdHlwbyAiQ1NTQWZlclJ1bGVWYWx1ZSIgdG8gIkNTU0FmdGVyUnVsZVZhbHVlIgpJbmRleDog
V2ViQ29yZS9HTlVtYWtlZmlsZS5hbQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL0dOVW1ha2VmaWxl
LmFtCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvR05VbWFrZWZpbGUuYW0JKHdvcmtpbmcg
Y29weSkKQEAgLTEzMjYsNiArMTMyNiw3IEBAIHdlYmNvcmVfc291cmNlcyArPSBcCiAJV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9TaW1wbGVGb250RGF0YS5oIFwKIAlXZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL1N0cmluZ1RydW5jYXRvci5jcHAgXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3MvU3RyaW5nVHJ1bmNhdG9yLmggXAorCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvU3Ryb2tl
U3R5bGVBcHBsaWVyLmggXAogCVdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvVGV4dFJ1bi5oIFwK
IAlXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1VuaXRCZXppZXIuaCBcCiAJV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy9XaWR0aEl0ZXJhdG9yLmNwcCBcCkluZGV4OiBXZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvago9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL1dlYkNvcmUu
eGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkocmV2aXNpb24gMzk0MjYpCisrKyBXZWJDb3JlL1dl
YkNvcmUueGNvZGVwcm9qL3Byb2plY3QucGJ4cHJvagkod29ya2luZyBjb3B5KQpAQCAtODczLDYg
Kzg3Myw3IEBACiAJCTc1NzkzRUQzMEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdlRXZlbnQu
aCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc1NzkzRUQw
MEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdlRXZlbnQuaCAqLzsgfTsKIAkJNzU3OTNFRDQw
RDBDRTg1QjAwN0ZDMEFDIC8qIERPTU1lc3NhZ2VFdmVudC5tbSBpbiBTb3VyY2VzICovID0ge2lz
YSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJlZiA9IDc1NzkzRUQxMEQwQ0U4NUIwMDdGQzBBQyAvKiBE
T01NZXNzYWdlRXZlbnQubW0gKi87IH07CiAJCTc1NzkzRUQ1MEQwQ0U4NUIwMDdGQzBBQyAvKiBE
T01NZXNzYWdlRXZlbnRJbnRlcm5hbC5oIGluIEhlYWRlcnMgKi8gPSB7aXNhID0gUEJYQnVpbGRG
aWxlOyBmaWxlUmVmID0gNzU3OTNFRDIwRDBDRTg1QjAwN0ZDMEFDIC8qIERPTU1lc3NhZ2VFdmVu
dEludGVybmFsLmggKi87IH07CisJCTg0OUY3Nzc2MEVGRUM2MjAwMDkwODQ5RCAvKiBTdHJva2VT
dHlsZUFwcGxpZXIuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsgZmlsZVJl
ZiA9IDg0OUY3Nzc1MEVGRUM2MjAwMDkwODQ5RCAvKiBTdHJva2VTdHlsZUFwcGxpZXIuaCAqLzsg
fTsKIAkJODUwMDREOTQwQUNFRUFFRjAwQzQzOEY2IC8qIERPTVNWR0RlZnNFbGVtZW50LmggaW4g
SGVhZGVycyAqLyA9IHtpc2EgPSBQQlhCdWlsZEZpbGU7IGZpbGVSZWYgPSA4NTAwNEQ4ODBBQ0VF
QUVGMDBDNDM4RjYgLyogRE9NU1ZHRGVmc0VsZW1lbnQuaCAqLzsgfTsKIAkJODUwMDREOTUwQUNF
RUFFRjAwQzQzOEY2IC8qIERPTVNWR0RlZnNFbGVtZW50Lm1tIGluIFNvdXJjZXMgKi8gPSB7aXNh
ID0gUEJYQnVpbGRGaWxlOyBmaWxlUmVmID0gODUwMDREODkwQUNFRUFFRjAwQzQzOEY2IC8qIERP
TVNWR0RlZnNFbGVtZW50Lm1tICovOyB9OwogCQk4NTAwNEQ5NjBBQ0VFQUVGMDBDNDM4RjYgLyog
RE9NU1ZHRGVzY0VsZW1lbnQuaCBpbiBIZWFkZXJzICovID0ge2lzYSA9IFBCWEJ1aWxkRmlsZTsg
ZmlsZVJlZiA9IDg1MDA0RDhBMEFDRUVBRUYwMEM0MzhGNiAvKiBET01TVkdEZXNjRWxlbWVudC5o
ICovOyB9OwpAQCAtNTc1Miw2ICs1NzUzLDcgQEAKIAkJNzU3OTNFRDAwRDBDRTg1QjAwN0ZDMEFD
IC8qIERPTU1lc3NhZ2VFdmVudC5oICovID0ge2lzYSA9IFBCWEZpbGVSZWZlcmVuY2U7IGZpbGVF
bmNvZGluZyA9IDMwOyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJjZWNvZGUuYy5oOyBwYXRoID0g
RE9NTWVzc2FnZUV2ZW50Lmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CiAJCTc1NzkzRUQx
MEQwQ0U4NUIwMDdGQzBBQyAvKiBET01NZXNzYWdlRXZlbnQubW0gKi8gPSB7aXNhID0gUEJYRmls
ZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGxhc3RLbm93bkZpbGVUeXBlID0gc291cmNl
Y29kZS5jcHAub2JqY3BwOyBwYXRoID0gRE9NTWVzc2FnZUV2ZW50Lm1tOyBzb3VyY2VUcmVlID0g
Ijxncm91cD4iOyB9OwogCQk3NTc5M0VEMjBEMENFODVCMDA3RkMwQUMgLyogRE9NTWVzc2FnZUV2
ZW50SW50ZXJuYWwuaCAqLyA9IHtpc2EgPSBQQlhGaWxlUmVmZXJlbmNlOyBmaWxlRW5jb2Rpbmcg
PSAzMDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9IERPTU1lc3Nh
Z2VFdmVudEludGVybmFsLmg7IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IH07CisJCTg0OUY3Nzc1
MEVGRUM2MjAwMDkwODQ5RCAvKiBTdHJva2VTdHlsZUFwcGxpZXIuaCAqLyA9IHtpc2EgPSBQQlhG
aWxlUmVmZXJlbmNlOyBmaWxlRW5jb2RpbmcgPSA0OyBsYXN0S25vd25GaWxlVHlwZSA9IHNvdXJj
ZWNvZGUuYy5oOyBwYXRoID0gU3Ryb2tlU3R5bGVBcHBsaWVyLmg7IHNvdXJjZVRyZWUgPSAiPGdy
b3VwPiI7IH07CiAJCTg0QjJCMUY3MDU2QkVGM0EwMEQyQjc3MSAvKiBXZWJDb3JlS2V5R2VuZXJh
dG9yLmggKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGlu
ZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2RlLmMuaDsgcGF0aCA9
IFdlYkNvcmVLZXlHZW5lcmF0b3IuaDsgc291cmNlVHJlZSA9ICI8Z3JvdXA+IjsgdGFiV2lkdGgg
PSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCTg0QjJCMUY4MDU2QkVGM0EwMEQyQjc3MSAvKiBXZWJD
b3JlS2V5R2VuZXJhdG9yLm0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVyZW5jZTsgZmlsZUVuY29k
aW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5cGUgPSBzb3VyY2Vjb2Rl
LmMub2JqYzsgcGF0aCA9IFdlYkNvcmVLZXlHZW5lcmF0b3IubTsgc291cmNlVHJlZSA9ICI8Z3Jv
dXA+IjsgdGFiV2lkdGggPSA4OyB1c2VzVGFicyA9IDA7IH07CiAJCTg0QjJCMjRGMDU2QkYxNUYw
MEQyQjc3MSAvKiBTU0xLZXlHZW5lcmF0b3JNYWMubW0gKi8gPSB7aXNhID0gUEJYRmlsZVJlZmVy
ZW5jZTsgZmlsZUVuY29kaW5nID0gMzA7IGluZGVudFdpZHRoID0gNDsgbGFzdEtub3duRmlsZVR5
cGUgPSBzb3VyY2Vjb2RlLmNwcC5vYmpjcHA7IHBhdGggPSBTU0xLZXlHZW5lcmF0b3JNYWMubW07
IHNvdXJjZVRyZWUgPSAiPGdyb3VwPiI7IHRhYldpZHRoID0gODsgdXNlc1RhYnMgPSAwOyB9OwpA
QCAtOTU3NCw2ICs5NTc2LDcgQEAKIAkJCQk0OUU5MTFCQTBFRjg2RDQ3MDA5RDBDQUYgLyogU2Nh
bGVUcmFuc2Zvcm1PcGVyYXRpb24uY3BwICovLAogCQkJCTQ5RTkxMUJCMEVGODZENDcwMDlEMENB
RiAvKiBTY2FsZVRyYW5zZm9ybU9wZXJhdGlvbi5oICovLAogCQkJCTQ5RTkxMUJDMEVGODZENDcw
MDlEMENBRiAvKiBTa2V3VHJhbnNmb3JtT3BlcmF0aW9uLmNwcCAqLywKKwkJCQk4NDlGNzc3NTBF
RkVDNjIwMDA5MDg0OUQgLyogU3Ryb2tlU3R5bGVBcHBsaWVyLmggKi8sCiAJCQkJNDlFOTExQkQw
RUY4NkQ0NzAwOUQwQ0FGIC8qIFNrZXdUcmFuc2Zvcm1PcGVyYXRpb24uaCAqLywKIAkJCQk0OUU5
MTFCRTBFRjg2RDQ3MDA5RDBDQUYgLyogVHJhbnNmb3JtT3BlcmF0aW9uLmggKi8sCiAJCQkJNDlF
OTExQkYwRUY4NkQ0NzAwOUQwQ0FGIC8qIFRyYW5zZm9ybU9wZXJhdGlvbnMuY3BwICovLApAQCAt
MTY0NTUsNiArMTY0NTgsNyBAQAogCQkJCTQ5RTkxMkFCMEVGQUM5MDYwMDlEMENBRiAvKiBBbmlt
YXRpb24uaCBpbiBIZWFkZXJzICovLAogCQkJCTQ5RTkxMkFEMEVGQUM5MDYwMDlEMENBRiAvKiBB
bmltYXRpb25MaXN0LmggaW4gSGVhZGVycyAqLywKIAkJCQk0OUU5MTJBRTBFRkFDOTA2MDA5RDBD
QUYgLyogVGltaW5nRnVuY3Rpb24uaCBpbiBIZWFkZXJzICovLAorCQkJCTg0OUY3Nzc2MEVGRUM2
MjAwMDkwODQ5RCAvKiBTdHJva2VTdHlsZUFwcGxpZXIuaCBpbiBIZWFkZXJzICovLAogCQkJKTsK
IAkJCXJ1bk9ubHlGb3JEZXBsb3ltZW50UG9zdHByb2Nlc3NpbmcgPSAwOwogCQl9OwpJbmRleDog
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9HcmFwaGljc0NvbnRleHQuaAo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL0dyYXBoaWNzQ29udGV4dC5oCShyZXZpc2lvbiAz
OTQyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvR3JhcGhpY3NDb250ZXh0LmgJKHdv
cmtpbmcgY29weSkKQEAgLTMxMiw2ICszMTIsNyBAQCBuYW1lc3BhY2UgV2ViQ29yZSB7CiAjaWYg
UExBVEZPUk0oUVQpCiAgICAgICAgIGJvb2wgaW5UcmFuc3BhcmVuY3lMYXllcigpIGNvbnN0Owog
ICAgICAgICBQbGF0Zm9ybVBhdGgqIGN1cnJlbnRQYXRoKCk7CisgICAgICAgIFFQZW4gcGVuKCk7
CiAjZW5kaWYKIAogI2lmIFBMQVRGT1JNKEdUSykKSW5kZXg6IFdlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3MvUGF0aC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0
aC5oCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvUGF0aC5o
CSh3b3JraW5nIGNvcHkpCkBAIC01Niw3ICs1Niw5IEBAIG5hbWVzcGFjZSBXZWJDb3JlIHsKICAg
ICBjbGFzcyBGbG9hdFBvaW50OwogICAgIGNsYXNzIEZsb2F0U2l6ZTsKICAgICBjbGFzcyBGbG9h
dFJlY3Q7CisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OwogICAgIGNsYXNzIFN0cmluZzsKKyAg
ICBjbGFzcyBTdHJva2VTdHlsZUFwcGxpZXI7CiAKICAgICBlbnVtIFdpbmRSdWxlIHsKICAgICAg
ICAgUlVMRV9OT05aRVJPID0gMCwKQEAgLTg4LDYgKzkwLDcgQEAgbmFtZXNwYWNlIFdlYkNvcmUg
ewogCiAgICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYsIFdpbmRSdWxlIHJ1
bGUgPSBSVUxFX05PTlpFUk8pIGNvbnN0OwogICAgICAgICBGbG9hdFJlY3QgYm91bmRpbmdSZWN0
KCkgY29uc3Q7CisgICAgICAgIEZsb2F0UmVjdCBzdHJva2VCb3VuZGluZ1JlY3QoU3Ryb2tlU3R5
bGVBcHBsaWVyKiBhcHBsaWVyID0gMCk7CiAgICAgICAgIAogICAgICAgICBmbG9hdCBsZW5ndGgo
KTsKICAgICAgICAgRmxvYXRQb2ludCBwb2ludEF0TGVuZ3RoKGZsb2F0IGxlbmd0aCwgYm9vbCYg
b2spOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TdHJva2VTdHlsZUFwcGxpZXIu
aAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL1N0cm9rZVN0eWxlQXBw
bGllci5oCShyZXZpc2lvbiAwKQorKysgV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9TdHJva2VT
dHlsZUFwcGxpZXIuaAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAgICBDb3B5
cmlnaHQgKEMpIDIwMDggRGlyayBTY2h1bHplIDxrcml0QHdlYmtpdC5vcmc+CisKKyAgICBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3Jl
IGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWludCB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaWZuZGVm
IFN0cm9rZVN0eWxlQXBwbGllcl9oCisjZGVmaW5lIFN0cm9rZVN0eWxlQXBwbGllcl9oCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEdyYXBoaWNzQ29udGV4dDsKKworICAgIGNs
YXNzIFN0cm9rZVN0eWxlQXBwbGllciB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZv
aWQgc3Ryb2tlU3R5bGUoR3JhcGhpY3NDb250ZXh0KikgPSAwOworCisgICAgcHJvdGVjdGVkOgor
ICAgICAgICB2aXJ0dWFsIH5TdHJva2VTdHlsZUFwcGxpZXIoKSB7fQorICAgIH07Cit9CisKKyNl
bmRpZgorCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NhaXJvL1BhdGhDYWlyby5j
cHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jYWlyby9QYXRoQ2Fp
cm8uY3BwCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2Fp
cm8vUGF0aENhaXJvLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjcsOCArMjcsMTAgQEAKICNpbmNs
dWRlICJBZmZpbmVUcmFuc2Zvcm0uaCIKICNpbmNsdWRlICJDYWlyb1BhdGguaCIKICNpbmNsdWRl
ICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKICNpbmNsdWRlICJO
b3RJbXBsZW1lbnRlZC5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAi
U3Ryb2tlU3R5bGVBcHBsaWVyLmgiCiAKICNpbmNsdWRlIDxjYWlyby5oPgogI2luY2x1ZGUgPG1h
dGguaD4KQEAgLTE4OCw2ICsxOTAsMTggQEAgRmxvYXRSZWN0IFBhdGg6OmJvdW5kaW5nUmVjdCgp
IGNvbnN0CiAgICAgcmV0dXJuIEZsb2F0UmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOwog
fQogCitGbG9hdFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxlQXBwbGll
ciogYXBwbGllcikKK3sKKyAgICBjYWlyb190KiBjciA9IHBsYXRmb3JtUGF0aCgpLT5tX2NyOwor
ICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjcik7CisgICAgaWYgKGFwcGxpZXIpCisgICAgICAgIGFw
cGxpZXItPnN0cm9rZVN0eWxlKCZnYyk7CisKKyAgICBkb3VibGUgeDAsIHgxLCB5MCwgeTE7Cisg
ICAgY2Fpcm9fc3Ryb2tlX2V4dGVudHMoY3IsICZ4MCwgJnkwLCAmeDEsICZ5MSk7CisgICAgcmV0
dXJuIEZsb2F0UmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOworfQorCiBib29sIFBhdGg6
OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAog
ewogICAgIGlmICghYm91bmRpbmdSZWN0KCkuY29udGFpbnMocG9pbnQpKQpJbmRleDogV2ViQ29y
ZS9wbGF0Zm9ybS9ncmFwaGljcy9jZy9QYXRoQ0cuY3BwCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUv
cGxhdGZvcm0vZ3JhcGhpY3MvY2cvUGF0aENHLmNwcAkocmV2aXNpb24gMzk0MjYpCisrKyBXZWJD
b3JlL3BsYXRmb3JtL2dyYXBoaWNzL2NnL1BhdGhDRy5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTMy
LDggKzMyLDEwIEBACiAjaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCiAjaW5jbHVkZSA8QXBw
bGljYXRpb25TZXJ2aWNlcy9BcHBsaWNhdGlvblNlcnZpY2VzLmg+CiAjaW5jbHVkZSAiRmxvYXRS
ZWN0LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCiAjaW5jbHVkZSAiSW50UmVjdC5o
IgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiU3Ryb2tlU3R5bGVBcHBs
aWVyLmgiCiAKICNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgogCkBAIC02Miw2ICs2NCwyOCBA
QCBQYXRoJiBQYXRoOjpvcGVyYXRvcj0oY29uc3QgUGF0aCYgb3RoZXIpCiAgICAgcmV0dXJuICp0
aGlzOwogfQogCitzdGF0aWMgQ0dDb250ZXh0UmVmIGNyZWF0ZVNjcmF0Y2hDb250ZXh0KCkKK3sK
KyAgICBDR0NvbnRleHRSZWYgY29udGV4dFJlZiA9IDA7CisgICAgaWYgKCFjb250ZXh0UmVmKSB7
CisgICAgICAgIENGTXV0YWJsZURhdGFSZWYgZW1wdHkgPSBDRkRhdGFDcmVhdGVNdXRhYmxlKE5V
TEwsIDApOworICAgICAgICBDR0RhdGFDb25zdW1lclJlZiBjb25zdW1lciA9IENHRGF0YUNvbnN1
bWVyQ3JlYXRlV2l0aENGRGF0YShlbXB0eSk7CisgICAgICAgIGNvbnRleHRSZWYgPSBDR1BERkNv
bnRleHRDcmVhdGUoY29uc3VtZXIsIE5VTEwsIE5VTEwpOworICAgICAgICBDR0RhdGFDb25zdW1l
clJlbGVhc2UoY29uc3VtZXIpOworICAgICAgICBDRlJlbGVhc2UoZW1wdHkpOworCisgICAgICAg
IENHRmxvYXQgYmxhY2tbNF0gPSB7MCwgMCwgMCwgMX07CisgICAgICAgIENHQ29udGV4dFNldEZp
bGxDb2xvcihjb250ZXh0UmVmLCBibGFjayk7CisgICAgICAgIENHQ29udGV4dFNldFN0cm9rZUNv
bG9yKGNvbnRleHRSZWYsIGJsYWNrKTsKKyAgICB9CisgICAgcmV0dXJuIGNvbnRleHRSZWY7Cit9
CisKK3N0YXRpYyBpbmxpbmUgQ0dDb250ZXh0UmVmIHNjcmF0Y2hDb250ZXh0KCkKK3sKKyAgICBz
dGF0aWMgQ0dDb250ZXh0UmVmIGNvbnRleHQgPSBjcmVhdGVTY3JhdGNoQ29udGV4dCgpOworICAg
IHJldHVybiBjb250ZXh0OworfQogCiBzdGF0aWMgdm9pZCBjb3B5Q2xvc2luZ1N1YnBhdGhzQXBw
bGllckZ1bmN0aW9uKHZvaWQqIGluZm8sIGNvbnN0IENHUGF0aEVsZW1lbnQqIGVsZW1lbnQpCiB7
CkBAIC0xMjMsNiArMTQ3LDI5IEBAIEZsb2F0UmVjdCBQYXRoOjpib3VuZGluZ1JlY3QoKSBjb25z
dAogICAgIHJldHVybiBDR1BhdGhHZXRCb3VuZGluZ0JveChtX3BhdGgpOwogfQogCitGbG9hdFJl
Y3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxlQXBwbGllciogYXBwbGllcikK
K3sKKyAgICBDR0NvbnRleHRSZWYgY29udGV4dCA9IHNjcmF0Y2hDb250ZXh0KCk7CisKKyAgICBD
R0NvbnRleHRTYXZlR1N0YXRlKGNvbnRleHQpOworICAgIENHQ29udGV4dEJlZ2luUGF0aChjb250
ZXh0KTsKKyAgICBDR0NvbnRleHRBZGRQYXRoKGNvbnRleHQsIHBsYXRmb3JtUGF0aCgpKTsKKwor
ICAgIEdyYXBoaWNzQ29udGV4dCBnYyhjb250ZXh0KTsKKyAgICBpZiAoYXBwbGllcikKKyAgICAg
ICAgYXBwbGllci0+c3Ryb2tlU3R5bGUoJmdjKTsKKworICAgIENHQ29udGV4dFJlcGxhY2VQYXRo
V2l0aFN0cm9rZWRQYXRoKGNvbnRleHQpOworICAgIGlmIChDR0NvbnRleHRJc1BhdGhFbXB0eShj
b250ZXh0KSkgeworICAgICAgICBDR0NvbnRleHRSZXN0b3JlR1N0YXRlKGNvbnRleHQpOworICAg
ICAgICByZXR1cm4gRmxvYXRSZWN0KCk7CisgICAgfQorICAgIENHUmVjdCBib3ggPSBDR0NvbnRl
eHRHZXRQYXRoQm91bmRpbmdCb3goY29udGV4dCk7CisgICAgQ0dDb250ZXh0UmVzdG9yZUdTdGF0
ZShjb250ZXh0KTsKKworICAgIHJldHVybiBib3g7Cit9CisKIHZvaWQgUGF0aDo6bW92ZVRvKGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50KQogewogICAgIENHUGF0aE1vdmVUb1BvaW50KG1fcGF0aCwg
MCwgcG9pbnQueCgpLCBwb2ludC55KCkpOwpJbmRleDogV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGlj
cy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHAJKHJldmlzaW9uIDM5NDI2KQorKysg
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9HcmFwaGljc0NvbnRleHRRdC5jcHAJKHdvcmtp
bmcgY29weSkKQEAgLTUyNSw2ICs1MjUsMTUgQEAgdm9pZCBHcmFwaGljc0NvbnRleHQ6OmRyYXdD
b252ZXhQb2x5Z29uKAogICAgIHAtPnJlc3RvcmUoKTsKIH0KIAorUVBlbiBHcmFwaGljc0NvbnRl
eHQ6OnBlbigpCit7CisgICAgaWYgKHBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJu
IFFQZW4oKTsKKworICAgIFFQYWludGVyICpwID0gbV9kYXRhLT5wKCk7CisgICAgcmV0dXJuIHAt
PnBlbigpOworfQorCiB2b2lkIEdyYXBoaWNzQ29udGV4dDo6ZmlsbFBhdGgoKQogewogICAgIGlm
IChwYWludGluZ0Rpc2FibGVkKCkpCkluZGV4OiBXZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3F0
L1BhdGhRdC5jcHAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9xdC9Q
YXRoUXQuY3BwCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
cXQvUGF0aFF0LmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjksOSArMjksMTIgQEAKICNpbmNsdWRl
ICJjb25maWcuaCIKICNpbmNsdWRlICJQYXRoLmgiCiAKKyNpbmNsdWRlICJBZmZpbmVUcmFuc2Zv
cm0uaCIKICNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKKyNpbmNsdWRlICJJbWFnZUJ1ZmZlci5oIgogI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgi
Ci0jaW5jbHVkZSAiQWZmaW5lVHJhbnNmb3JtLmgiCisjaW5jbHVkZSAiU3Ryb2tlU3R5bGVBcHBs
aWVyLmgiCiAjaW5jbHVkZSA8UVBhaW50ZXJQYXRoPgogI2luY2x1ZGUgPFFNYXRyaXg+CiAjaW5j
bHVkZSA8UVN0cmluZz4KQEAgLTkzLDYgKzk2LDI3IEBAIEZsb2F0UmVjdCBQYXRoOjpib3VuZGlu
Z1JlY3QoKSBjb25zdAogICAgIHJldHVybiBtX3BhdGgtPmJvdW5kaW5nUmVjdCgpOwogfQogCitG
bG9hdFJlY3QgUGF0aDo6c3Ryb2tlQm91bmRpbmdSZWN0KFN0cm9rZVN0eWxlQXBwbGllciogYXBw
bGllcikKK3sKKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHRyeSB0byB1c2UgYSAnc2hhcmVkIENv
bnRleHQnIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgSW1hZ2VCdWZmZXIKKyAgICAvLyBvbiBl
YWNoIGNhbGwuCisgICAgc3RkOjphdXRvX3B0cjxJbWFnZUJ1ZmZlcj4gc2NyYXRjaEltYWdlID0g
SW1hZ2VCdWZmZXI6OmNyZWF0ZShJbnRTaXplKDEsIDEpLCBmYWxzZSk7CisgICAgR3JhcGhpY3ND
b250ZXh0KiBnYyA9IHNjcmF0Y2hJbWFnZS0+Y29udGV4dCgpOworICAgIFFQYWludGVyUGF0aFN0
cm9rZXIgc3Ryb2tlOworICAgIGlmIChhcHBsaWVyKSB7CisgICAgICAgIGFwcGxpZXItPnN0cm9r
ZVN0eWxlKGdjKTsKKworICAgICAgICBRUGVuIHBlbiA9IGdjLT5wZW4oKTsKKyAgICAgICAgc3Ry
b2tlLnNldFdpZHRoKHBlbi53aWR0aEYoKSk7CisgICAgICAgIHN0cm9rZS5zZXRDYXBTdHlsZShw
ZW4uY2FwU3R5bGUoKSk7CisgICAgICAgIHN0cm9rZS5zZXRKb2luU3R5bGUocGVuLmpvaW5TdHls
ZSgpKTsKKyAgICAgICAgc3Ryb2tlLnNldE1pdGVyTGltaXQocGVuLm1pdGVyTGltaXQoKSk7Cisg
ICAgICAgIHN0cm9rZS5zZXREYXNoUGF0dGVybihwZW4uZGFzaFBhdHRlcm4oKSk7CisgICAgICAg
IHN0cm9rZS5zZXREYXNoT2Zmc2V0KHBlbi5kYXNoT2Zmc2V0KCkpOworICAgIH0KKyAgICByZXR1
cm4gKHN0cm9rZS5jcmVhdGVTdHJva2UoKnBsYXRmb3JtUGF0aCgpKSkuYm91bmRpbmdSZWN0KCk7
Cit9CisKIHZvaWQgUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQogewogICAg
IG1fcGF0aC0+bW92ZVRvKHBvaW50KTsKSW5kZXg6IFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclBh
dGguY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclBhdGguY3BwCShy
ZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclBhdGguY3BwCSh3b3Jr
aW5nIGNvcHkpCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0Lmgi
CiAjaW5jbHVkZSAiUG9pbnRlckV2ZW50c0hpdFJ1bGVzLmgiCiAjaW5jbHVkZSAiUmVuZGVyU1ZH
Q29udGFpbmVyLmgiCisjaW5jbHVkZSAiU3Ryb2tlU3R5bGVBcHBsaWVyLmgiCiAjaW5jbHVkZSAi
U1ZHUGFpbnRTZXJ2ZXIuaCIKICNpbmNsdWRlICJTVkdSZW5kZXJTdXBwb3J0LmgiCiAjaW5jbHVk
ZSAiU1ZHUmVzb3VyY2VGaWx0ZXIuaCIKQEAgLTQ1LDYgKzQ2LDI2IEBACiAKIG5hbWVzcGFjZSBX
ZWJDb3JlIHsKIAorY2xhc3MgQm91bmRpbmdSZWN0U3Ryb2tlU3R5bGVBcHBsaWVyIDogcHVibGlj
IFN0cm9rZVN0eWxlQXBwbGllciB7CitwdWJsaWM6CisgICAgQm91bmRpbmdSZWN0U3Ryb2tlU3R5
bGVBcHBsaWVyKGNvbnN0IFJlbmRlck9iamVjdCogb2JqZWN0LCBSZW5kZXJTdHlsZSogc3R5bGUp
CisgICAgICAgIDogbV9vYmplY3Qob2JqZWN0KQorICAgICAgICAsIG1fc3R5bGUoc3R5bGUpCisg
ICAgeworICAgICAgICBBU1NFUlQoc3R5bGUpOworICAgICAgICBBU1NFUlQob2JqZWN0KTsKKyAg
ICB9CisKKyAgICB2b2lkIHN0cm9rZVN0eWxlKEdyYXBoaWNzQ29udGV4dCogZ2MpCisgICAgewor
ICAgICAgICBhcHBseVN0cm9rZVN0eWxlVG9Db250ZXh0KGdjLCBtX3N0eWxlLCBtX29iamVjdCk7
CisgICAgfQorCitwcml2YXRlOgorICAgIGNvbnN0IFJlbmRlck9iamVjdCogbV9vYmplY3Q7Cisg
ICAgUmVuZGVyU3R5bGUqIG1fc3R5bGU7Cit9OworCiAvLyBSZW5kZXJQYXRoCiBSZW5kZXJQYXRo
OjpSZW5kZXJQYXRoKFJlbmRlclN0eWxlKiBzdHlsZSwgU1ZHU3R5bGVkVHJhbnNmb3JtYWJsZUVs
ZW1lbnQqIG5vZGUpCiAgICAgOiBSZW5kZXJPYmplY3Qobm9kZSkKQEAgLTg5LDggKzExMCwxNyBA
QCBGbG9hdFJlY3QgUmVuZGVyUGF0aDo6cmVsYXRpdmVCQm94KGJvb2wgCiAgICAgICAgIHJldHVy
biBGbG9hdFJlY3QoKTsKIAogICAgIGlmIChpbmNsdWRlU3Ryb2tlKSB7Ci0gICAgICAgIGlmICht
X3N0cm9rZUJib3guaXNFbXB0eSgpKQotICAgICAgICAgICAgbV9zdHJva2VCYm94ID0gc3Ryb2tl
QkJveCgpOworICAgICAgICBpZiAobV9zdHJva2VCYm94LmlzRW1wdHkoKSkgeworICAgICAgICAg
ICAgaWYgKHN0eWxlKCktPnN2Z1N0eWxlKCktPmhhc1N0cm9rZSgpKSB7CisgICAgICAgICAgICAg
ICAgQm91bmRpbmdSZWN0U3Ryb2tlU3R5bGVBcHBsaWVyIHN0cm9rZVN0eWxlKHRoaXMsIHN0eWxl
KCkpOworICAgICAgICAgICAgICAgIG1fc3Ryb2tlQmJveCA9IG1fcGF0aC5zdHJva2VCb3VuZGlu
Z1JlY3QoJnN0cm9rZVN0eWxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgaWYgKG1fZmlsbEJCb3guaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICBtX2ZpbGxC
Qm94ID0gbV9wYXRoLmJvdW5kaW5nUmVjdCgpOworCisgICAgICAgICAgICAgICAgbV9zdHJva2VC
Ym94ID0gbV9maWxsQkJveDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIHJl
dHVybiBtX3N0cm9rZUJib3g7CiAgICAgfQpJbmRleDogV2ViQ29yZS9yZW5kZXJpbmcvUmVuZGVy
UGF0aC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFdlYkNvcmUvcmVuZGVyaW5nL1JlbmRlclBhdGguaAkocmV2
aXNpb24gMzk0MjYpCisrKyBXZWJDb3JlL3JlbmRlcmluZy9SZW5kZXJQYXRoLmgJKHdvcmtpbmcg
Y29weSkKQEAgLTQ2LDggKzQ2LDggQEAgcHVibGljOgogICAgIHZpcnR1YWwgflJlbmRlclBhdGgo
KTsKIAogICAgIC8vIEhpdC1kZXRlY3Rpb24gc2VwZXJhdGVkIGZvciB0aGUgZmlsbCBhbmQgdGhl
IHN0cm9rZQotICAgIHZpcnR1YWwgYm9vbCBmaWxsQ29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYs
IGJvb2wgcmVxdWlyZXNGaWxsID0gdHJ1ZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHN0cm9r
ZUNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmLCBib29sIHJlcXVpcmVzU3Ryb2tlID0gdHJ1ZSkg
Y29uc3Q7CisgICAgYm9vbCBmaWxsQ29udGFpbnMoY29uc3QgRmxvYXRQb2ludCYsIGJvb2wgcmVx
dWlyZXNGaWxsID0gdHJ1ZSkgY29uc3Q7CisgICAgYm9vbCBzdHJva2VDb250YWlucyhjb25zdCBG
bG9hdFBvaW50JiwgYm9vbCByZXF1aXJlc1N0cm9rZSA9IHRydWUpIGNvbnN0OwogCiAgICAgLy8g
UmV0dXJucyBhbiB1bnNjYWxlZCBib3VuZGluZyBib3ggKG5vdCBldmVuIGluY2x1ZGluZyBsb2Nh
bFRyYW5zZm9ybSgpKSBmb3IgdGhpcyB2ZWN0b3IgcGF0aAogICAgIHZpcnR1YWwgRmxvYXRSZWN0
IHJlbGF0aXZlQkJveChib29sIGluY2x1ZGVTdHJva2UgPSB0cnVlKSBjb25zdDsKQEAgLTc1LDcg
Kzc1LDYgQEAgcHVibGljOgogICAgIHZpcnR1YWwgYm9vbCBub2RlQXRQb2ludChjb25zdCBIaXRU
ZXN0UmVxdWVzdCYsIEhpdFRlc3RSZXN1bHQmLCBpbnQgeCwgaW50IHksIGludCB0eCwgaW50IHR5
LCBIaXRUZXN0QWN0aW9uKTsKIAogICAgIEZsb2F0UmVjdCBkcmF3TWFya2Vyc0lmTmVlZGVkKEdy
YXBoaWNzQ29udGV4dCosIGNvbnN0IEZsb2F0UmVjdCYsIGNvbnN0IFBhdGgmKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIEZsb2F0UmVjdCBzdHJva2VCQm94KCkgY29uc3Q7CiAgICAgCiBwcml2YXRlOgog
ICAgIEZsb2F0UG9pbnQgbWFwQWJzb2x1dGVQb2ludFRvTG9jYWwoY29uc3QgRmxvYXRQb2ludCYp
IGNvbnN0OwpJbmRleDogV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2Fpcm8vUmVuZGVyUGF0aENhaXJv
LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9ncmFwaGljcy9jYWlyby9SZW5kZXJQYXRo
Q2Fpcm8uY3BwCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL2NhaXJv
L1JlbmRlclBhdGhDYWlyby5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTM2LDE3ICszNiw0IEBAIGJv
b2wgUmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMoY29uc3QgRmwKICAgICByZXR1cm4gY2Fpcm9f
aW5fc3Ryb2tlKGNyLCBwb2ludC54KCksIHBvaW50LnkoKSk7CiB9CiAKLUZsb2F0UmVjdCBSZW5k
ZXJQYXRoOjpzdHJva2VCQm94KCkgY29uc3QKLXsKLSAgICAvLyBUT0RPOiB0aGlzIGltcGxlbWVu
dGF0aW9uIGlzIG5haXZlCi0KLSAgICBjYWlyb190KiBjciA9IHBhdGgoKS5wbGF0Zm9ybVBhdGgo
KS0+bV9jcjsKLQotICAgIGRvdWJsZSB4MCwgeDEsIHkwLCB5MTsKLSAgICBjYWlyb19zdHJva2Vf
ZXh0ZW50cyhjciwgJngwLCAmeTAsICZ4MSwgJnkxKTsKLSAgICBGbG9hdFJlY3QgYmJveCA9IEZs
b2F0UmVjdCh4MCwgeTAsIHgxIC0geDAsIHkxIC0geTApOwotCi0gICAgcmV0dXJuIGJib3g7Ci19
Ci0KIH0KSW5kZXg6IFdlYkNvcmUvc3ZnL2dyYXBoaWNzL2NnL1JlbmRlclBhdGhDZy5jcHAKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gV2ViQ29yZS9zdmcvZ3JhcGhpY3MvY2cvUmVuZGVyUGF0aENnLmNwcAkocmV2
aXNpb24gMzk0MjYpCisrKyBXZWJDb3JlL3N2Zy9ncmFwaGljcy9jZy9SZW5kZXJQYXRoQ2cuY3Bw
CSh3b3JraW5nIGNvcHkpCkBAIC00MCwxNSArNDAsNiBAQAogCiBuYW1lc3BhY2UgV2ViQ29yZSB7
CiAKLUZsb2F0UmVjdCBSZW5kZXJQYXRoOjpzdHJva2VCQm94KCkgY29uc3QKLXsKLSAgICBpZiAo
c3R5bGUoKS0+c3ZnU3R5bGUoKS0+aGFzU3Ryb2tlKCkpCi0gICAgICAgIHJldHVybiBzdHJva2VC
b3VuZGluZ0JveChwYXRoKCksIHN0eWxlKCksIHRoaXMpOwotCi0gICAgcmV0dXJuIHBhdGgoKS5i
b3VuZGluZ1JlY3QoKTsKLX0KLQotCiBib29sIFJlbmRlclBhdGg6OnN0cm9rZUNvbnRhaW5zKGNv
bnN0IEZsb2F0UG9pbnQmIHBvaW50LCBib29sIHJlcXVpcmVzU3Ryb2tlKSBjb25zdAogewogICAg
IGlmIChwYXRoKCkuaXNFbXB0eSgpKQpJbmRleDogV2ViQ29yZS9zdmcvZ3JhcGhpY3MvcXQvUmVu
ZGVyUGF0aFF0LmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBXZWJDb3JlL3N2Zy9ncmFwaGljcy9xdC9SZW5k
ZXJQYXRoUXQuY3BwCShyZXZpc2lvbiAzOTQyNikKKysrIFdlYkNvcmUvc3ZnL2dyYXBoaWNzL3F0
L1JlbmRlclBhdGhRdC5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTQyLDQ4ICs0Miw2IEBAIGJvb2wg
UmVuZGVyUGF0aDo6c3Ryb2tlQ29udGFpbnMoY29uc3QgRmwKICAgICByZXR1cm4gZmFsc2U7CiB9
CiAKLXN0YXRpYyBRUGFpbnRlclBhdGggZ2V0UGF0aFN0cm9rZShjb25zdCBRUGFpbnRlclBhdGgg
JnBhdGgsIGNvbnN0IFJlbmRlck9iamVjdCogb2JqZWN0LCBjb25zdCBSZW5kZXJTdHlsZSogc3R5
bGUpCi17IAotICAgIFFQYWludGVyUGF0aFN0cm9rZXIgczsKLSAgICBzLnNldFdpZHRoKFNWR1Jl
bmRlclN0eWxlOjpjc3NQcmltaXRpdmVUb0xlbmd0aChvYmplY3QsIHN0eWxlLT5zdmdTdHlsZSgp
LT5zdHJva2VXaWR0aCgpLCAxLjApKTsKLQotICAgIGlmIChzdHlsZS0+c3ZnU3R5bGUoKS0+Y2Fw
U3R5bGUoKSA9PSBCdXR0Q2FwKQotICAgICAgICBzLnNldENhcFN0eWxlKFF0OjpGbGF0Q2FwKTsK
LSAgICBlbHNlIGlmIChzdHlsZS0+c3ZnU3R5bGUoKS0+Y2FwU3R5bGUoKSA9PSBSb3VuZENhcCkK
LSAgICAgICAgcy5zZXRDYXBTdHlsZShRdDo6Um91bmRDYXApOwotCi0gICAgaWYgKHN0eWxlLT5z
dmdTdHlsZSgpLT5qb2luU3R5bGUoKSA9PSBNaXRlckpvaW4pIHsKLSAgICAgICAgcy5zZXRKb2lu
U3R5bGUoUXQ6Ok1pdGVySm9pbik7Ci0gICAgICAgIHMuc2V0TWl0ZXJMaW1pdCgocXJlYWwpIHN0
eWxlLT5zdmdTdHlsZSgpLT5zdHJva2VNaXRlckxpbWl0KCkpOwotICAgIH0gZWxzZSBpZihzdHls
ZS0+c3ZnU3R5bGUoKS0+am9pblN0eWxlKCkgPT0gUm91bmRKb2luKQotICAgICAgICBzLnNldEpv
aW5TdHlsZShRdDo6Um91bmRKb2luKTsKLQotICAgIGNvbnN0IERhc2hBcnJheSYgZGFzaGVzID0g
V2ViQ29yZTo6ZGFzaEFycmF5RnJvbVJlbmRlcmluZ1N0eWxlKHN0eWxlKTsKLSAgICBkb3VibGUg
ZGFzaE9mZnNldCA9IFNWR1JlbmRlclN0eWxlOjpjc3NQcmltaXRpdmVUb0xlbmd0aChvYmplY3Qs
IHN0eWxlLT5zdmdTdHlsZSgpLT5zdHJva2VEYXNoT2Zmc2V0KCksIDAuMCk7Ci0KLSAgICB1bnNp
Z25lZCBpbnQgZGFzaExlbmd0aCA9ICFkYXNoZXMuaXNFbXB0eSgpID8gZGFzaGVzLnNpemUoKSA6
IDA7Ci0gICAgaWYoZGFzaExlbmd0aCkgewotICAgICAgICBRVmVjdG9yPHFyZWFsPiBwYXR0ZXJu
OwotICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQgPSAoZGFzaExlbmd0aCAlIDIpID09IDAgPyBk
YXNoTGVuZ3RoIDogZGFzaExlbmd0aCAqIDI7Ci0KLSAgICAgICAgZm9yKHVuc2lnbmVkIGludCBp
ID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICBwYXR0ZXJuLmFwcGVuZChkYXNoZXNb
aSAlIGRhc2hMZW5ndGhdIC8gKGZsb2F0KXMud2lkdGgoKSk7Ci0KLSAgICAgICAgcy5zZXREYXNo
UGF0dGVybihwYXR0ZXJuKTsKLSAgICAKLSAgICAgICAgUV9VTlVTRUQoZGFzaE9mZnNldCk7Ci0g
ICAgICAgIC8vIFRPRE86IGRhc2gtb2Zmc2V0LCBkb2VzL3dpbGwgcXQ0IEFQSSBhbGxvdyBpdD8g
KFJvYikKLSAgICB9Ci0KLSAgICByZXR1cm4gcy5jcmVhdGVTdHJva2UocGF0aCk7Ci19Ci0KLUZs
b2F0UmVjdCBSZW5kZXJQYXRoOjpzdHJva2VCQm94KCkgY29uc3QKLXsKLSAgICBRUGFpbnRlclBh
dGggb3V0bGluZSA9IGdldFBhdGhTdHJva2UoKihwYXRoKCkucGxhdGZvcm1QYXRoKCkpLCB0aGlz
LCBzdHlsZSgpKTsKLSAgICByZXR1cm4gb3V0bGluZS5ib3VuZGluZ1JlY3QoKTsKLX0KLQogfQog
CiAvLyB2aW06dHM9NDpub2V0Cg==
</data>
<flag name="review"
          id="12368"
          type_id="1"
          status="+"
          setter="zimmermann"
    />
          </attachment>
      

    </bug>

</bugzilla>