<?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>28188</bug_id>
          
          <creation_ts>2009-08-11 14:30:46 -0700</creation_ts>
          <short_desc>WINCE PORT: Path, PlatformPath</short_desc>
          <delta_ts>2009-08-12 09:50:58 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</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>
          
          <blocked>27511</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Yong Li">yong.li.webkit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>manyoso</cc>
    
    <cc>staikos</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>139103</commentid>
    <comment_count>0</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-11 14:30:46 -0700</bug_when>
    <thetext>taken out from 27511</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139115</commentid>
    <comment_count>1</comment_count>
      <attachid>34598</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-11 14:53:07 -0700</bug_when>
    <thetext>Created attachment 34598
the patch (modified a little)

modified a little bit. added some comments to contains()</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139314</commentid>
    <comment_count>2</comment_count>
      <attachid>34598</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 06:57:52 -0700</bug_when>
    <thetext>Comment on attachment 34598
the patch (modified a little)

&gt; +Path&amp; Path::operator=(const Path&amp; other)
&gt; +{
&gt; +    m_path = new PlatformPath(*other.m_path);
&gt; +    return *this;
&gt; +}

Delete the possibly existing m_path unless &amp;other == this?

&gt; +bool Path::hasCurrentPoint() const
&gt; +{
&gt; +    return !isEmpty();
&gt; +}

I see this is duplicated by most other ports, but not all.  Perhaps it should be refactored and implemented in Path.cpp?  Maybe after this goes in?

About PathWince.cpp in general...  I&apos;m curious why you don&apos;t just implement methods here rather than breaking it out into another class: PlatformPathWince. Any reason or just following other ports example of having a &apos;native&apos; PlatformPath type...  Not a biggy, but one extra level of indirection that might not be necessary.

&gt; +// Implemented in GraphicsContextWince.cpp
&gt; +void getEllipsePointByAngle(double angle, double a, double b, float&amp; x, float&amp; y);
&gt; +
...
&gt; +static inline int stableRound(double d)
&gt; +{
&gt; +    if (d &gt; 0)
&gt; +        return static_cast&lt;int&gt;(d + 0.5);
&gt; +
&gt; +    int i = static_cast&lt;int&gt;(d);
&gt; +    return i - d &gt; 0.5 ? i - 1 : i;
&gt; +}

This is also implemented in GraphicsContextWince.cpp.  Any reason this is duplicated here?  I think this should probably be shared rather than copy&amp;paste...

&gt; +static bool containsPoint(const FloatRect&amp; r, const FloatPoint&amp; p)
&gt; +{
&gt; +    return p.x() &gt;= r.x() &amp;&amp; p.y() &gt;= r.y() &amp;&amp; p.x() &lt; r.right() &amp;&amp; p.y() &lt; r.bottom();
&gt; +}

This should be added to FloatRect.

&gt; +#define PI        3.14159265358979323846

This is a part of MathExtras.h.  Please use that instead of duplicating.

&gt; +static void normalizeAngle(float&amp; angle)
&gt; +{
&gt; +    while (angle &lt; 0)
&gt; +        angle += 2 * PI;
&gt; +    while (angle &gt;= 2 * PI)
&gt; +        angle -= 2 * PI;
&gt; +    if (angle &lt; 0.00001)
&gt; +        angle = 0;
&gt; +}

This is used by addEllipse, but I&apos;m not sure I understand.  If the angles given are invalid, then why not just return or fix the calling site?

&gt; +// return 0-based value: 0 - first Quadrant ( 0 - 90 degree)
&gt; +static inline int quadrant(const PathPoint&amp; point, const PathPoint&amp; origPoint)
&gt; +{
&gt; +    return point.m_x &lt; origPoint.m_x ?
&gt; +        (point.m_y &lt; origPoint.m_y ? 2 : 1)
&gt; +        : (point.m_y &lt; origPoint.m_y ? 3 : 0);
&gt; +}

Heh, origin, originPoint, originalPoint?  I think all three are better than &apos;origPoint&apos; depending on context :)

&gt; +static void drawPolygons(HDC dc, const Vector&lt;PathPolygon&gt;&amp; polygons, bool fill, const TransformationMatrix* tr)

tr should be matrix or transform.  Keep the variable names well named.

&gt; +    MemoryAllocationCanFail canFail;

Will this compile?

&gt; +void PlatformPathElement::inflateRectToContainMe(FloatRect&amp; r, const FloatPoint&amp; lastPoint) const

Cute :)

&gt; +PlatformPath::PlatformPath()
&gt; +: m_penLifted(true)

Indentation.

&gt; +                // FIXME: magic number?
&gt; +                quadCurve(50, m_subpaths.last(), control);

What does this mean?

&gt; +}
&gt; +
&gt; +

Extra space.

&gt; +#ifndef PlatformPathWince_h
&gt; +#define PlatformPathWince_h

No includes?  How does this work?  Only forward declaration is GraphicsContext, but you are using lots more WebCore classes...

General thoughts:

There are some style issues and minor nitpicks, but not very many.  I&apos;m not concerned about them as much as I&apos;d like the questions above figured out.  I would also like to know if you&apos;ve run this code with the relevant LayoutTests and what the results were.  You mention in the ChangeLog that this could become cross-platform code for ports which do not have any native version of this functionality.  That is possible, but only if the code is refactored and probably broken out into one class per file as well as aggressive layout tests confirm.  Finally, the diff looks corrupted: see top of patch file.  r- mostly for the above questions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139320</commentid>
    <comment_count>3</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-12 07:30:45 -0700</bug_when>
    <thetext>(In reply to comment #2)
&gt; (From update of attachment 34598 [details])
&gt; &gt; +Path&amp; Path::operator=(const Path&amp; other)
&gt; &gt; +{
&gt; &gt; +    m_path = new PlatformPath(*other.m_path);
&gt; &gt; +    return *this;
&gt; &gt; +}
&gt; 
&gt; Delete the possibly existing m_path unless &amp;other == this?
&gt; 
I think you&apos;ve found a bug here. Thanks! :)

&gt; &gt; +bool Path::hasCurrentPoint() const
&gt; &gt; +{
&gt; &gt; +    return !isEmpty();
&gt; &gt; +}
&gt; 
&gt; I see this is duplicated by most other ports, but not all.  Perhaps it should
&gt; be refactored and implemented in Path.cpp?  Maybe after this goes in?

No. There&apos;s at least one port that does differently. That&apos;s why this method was introduced. And I&apos;m not sure !isEmpty() is absolutely correct. There have been some discussions on this thing. I forgot the bug number. At the meantime, I just do this as most ports do, because I haven&apos;t got a better idea. Keeping an eye on other ports... :)

&gt; 
&gt; About PathWince.cpp in general...  I&apos;m curious why you don&apos;t just implement
&gt; methods here rather than breaking it out into another class: PlatformPathWince.
&gt; Any reason or just following other ports example of having a &apos;native&apos;
&gt; PlatformPath type...  Not a biggy, but one extra level of indirection that
&gt; might not be necessary.

I could do that. But then I would have to add a lot of members into Path.h with #if PLATFORM(WINCE), which may be harder to get r+ :)

&gt; 
&gt; &gt; +// Implemented in GraphicsContextWince.cpp
&gt; &gt; +void getEllipsePointByAngle(double angle, double a, double b, float&amp; x, float&amp; y);
&gt; &gt; +
&gt; ...
&gt; &gt; +static inline int stableRound(double d)
&gt; &gt; +{
&gt; &gt; +    if (d &gt; 0)
&gt; &gt; +        return static_cast&lt;int&gt;(d + 0.5);
&gt; &gt; +
&gt; &gt; +    int i = static_cast&lt;int&gt;(d);
&gt; &gt; +    return i - d &gt; 0.5 ? i - 1 : i;
&gt; &gt; +}
&gt; 
&gt; This is also implemented in GraphicsContextWince.cpp.  Any reason this is
&gt; duplicated here?  I think this should probably be shared rather than
&gt; copy&amp;paste...

Yeah... This stableRound is defined in many files. Not sure if it&apos;s a good idea to add it into MathExtra.h.

The differences between stableRound() and lround() is:

1) stableRound() rounds -0.5 to 0, where lround() round -0.5 to -1. Consider the case that the transformation has a shift -1, and 0.5 changes to -0.5. With lround, the rounded value 1 changes to -1, so that the rounded shift is -2. Probably the name should be changed to lowerRound() or leftRound(). 

2) stableRound() doesn&apos;t call other function like ceil() where lround() does

Can we do this later? Because some landed file like GraphicsContextWince.cpp needs to be changed, too. This patch just contains new source files, and doesn&apos;t include the changes to any existing file.

&gt; 
&gt; &gt; +static bool containsPoint(const FloatRect&amp; r, const FloatPoint&amp; p)
&gt; &gt; +{
&gt; &gt; +    return p.x() &gt;= r.x() &amp;&amp; p.y() &gt;= r.y() &amp;&amp; p.x() &lt; r.right() &amp;&amp; p.y() &lt; r.bottom();
&gt; &gt; +}
&gt; 
&gt; This should be added to FloatRect.

Agree with this. but can we do this later?

&gt; 
&gt; &gt; +#define PI        3.14159265358979323846
&gt; 
&gt; This is a part of MathExtras.h.  Please use that instead of duplicating.

Agree.

&gt; 
&gt; &gt; +static void normalizeAngle(float&amp; angle)
&gt; &gt; +{
&gt; &gt; +    while (angle &lt; 0)
&gt; &gt; +        angle += 2 * PI;
&gt; &gt; +    while (angle &gt;= 2 * PI)
&gt; &gt; +        angle -= 2 * PI;
&gt; &gt; +    if (angle &lt; 0.00001)
&gt; &gt; +        angle = 0;
&gt; &gt; +}
&gt; 
&gt; This is used by addEllipse, but I&apos;m not sure I understand.  If the angles given
&gt; are invalid, then why not just return or fix the calling site?

Don&apos;t know if an angle bigger than 2*PI is valid or invalid. I think it should still be handled.

&gt; &gt; +
&gt; 
&gt; Extra space.
&gt; 
&gt; &gt; +#ifndef PlatformPathWince_h
&gt; &gt; +#define PlatformPathWince_h
&gt; 
&gt; No includes?  How does this work?  Only forward declaration is GraphicsContext,
&gt; but you are using lots more WebCore classes...
&gt;

Yeah, I&apos;ll add some header files like FloatPoint.h</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139331</commentid>
    <comment_count>4</comment_count>
      <attachid>34662</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-12 08:44:24 -0700</bug_when>
    <thetext>Created attachment 34662
refactored

modified according to Adam&apos;s suggestions.

stableRound() is separated out to WinceGraphicsExtras.h

Afterward, we&apos;ll let other files that define stableRound() by themself use this header file.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139336</commentid>
    <comment_count>5</comment_count>
      <attachid>34662</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 08:53:48 -0700</bug_when>
    <thetext>Comment on attachment 34662
refactored

Ok, please file a bug and patch for moving &apos;containsPoint&apos; into FloatRect after this lands.  Thanks!

Otherwise, LGTM. r+ :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139350</commentid>
    <comment_count>6</comment_count>
      <attachid>34666</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-12 09:19:31 -0700</bug_when>
    <thetext>Created attachment 34666
fix a bug in last patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139374</commentid>
    <comment_count>7</comment_count>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 09:50:58 -0700</bug_when>
    <thetext>Landed with r47118.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34598</attachid>
            <date>2009-08-11 14:53:07 -0700</date>
            <delta_ts>2009-08-12 08:44:24 -0700</delta_ts>
            <desc>the patch (modified a little)</desc>
            <filename>28188.patch</filename>
            <type>text/plain</type>
            <size>37028</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZjAyNTVjMy4uMzE5ZjI0MSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxOSBAQAorZGlmZiBhL1dlYkNvcmUvQ2hhbmdlTG9n
IGIvV2ViQ29yZS9DaGFuZ2VMb2cJKHJlamVjdGVkIGh1bmtzKQorQEAgLTEsMyArMSwxOCBAQAor
MjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlvbmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEltcGxl
bWVudCBQYXRoIGZvciBXSU5DRS4gTW9zdCBjb2RlIGNhbiBiZSAKKyAgICAgICAgcmV1c2VkIGZv
ciBvdGhlciBwb3J0cyB0aGF0IGRvbid0IGhhdmUgbmF0aXZlIHBhdGggc3VwcG9ydAorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjgxODgKKworICAgICAg
ICBXcml0dGVuIGFsc28gYnkgR2VvcmdlIFN0YWlrb3MgKGluY2x1ZGluZyBxdWFkQ3VydmUoKSBh
bmQgYmV6aWVyKCkpCisKKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2lu
Y2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9y
bVBhdGhXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNl
L1BsYXRmb3JtUGF0aFdpbmNlLmg6IEFkZGVkLgorCiAyMDA5LTA4LTExICBTaW1vbiBIYXVzbWFu
biAgPHNpbW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBOT0JP
RFkgKGJ1aWxkIGZpeCkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BhdGhXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BhdGhX
aW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyOTlhMgotLS0g
L2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGF0aFdpbmNl
LmNwcApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBU
b3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhv
dXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENP
UFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1
ZGUgIlBhdGguaCIKKworI2luY2x1ZGUgIkZsb2F0UmVjdC5oIgorI2luY2x1ZGUgIk5vdEltcGxl
bWVudGVkLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1QYXRoV2luY2UuaCIKKyNpbmNsdWRlICJQbGF0
Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9uTWF0cml4LmgiCisjaW5jbHVk
ZSA8d3RmL093blB0ci5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BhdGg6OlBhdGgoKQor
ICAgIDogbV9wYXRoKG5ldyBQbGF0Zm9ybVBhdGgoKSkKK3sKK30KKworUGF0aDo6UGF0aChjb25z
dCBQYXRoJiBvdGhlcikKKyAgICA6IG1fcGF0aChuZXcgUGxhdGZvcm1QYXRoKCpvdGhlci5tX3Bh
dGgpKQoreworfQorCitQYXRoOjp+UGF0aCgpCit7CisgICAgZGVsZXRlIG1fcGF0aDsKK30KKwor
UGF0aCYgUGF0aDo6b3BlcmF0b3I9KGNvbnN0IFBhdGgmIG90aGVyKQoreworICAgIG1fcGF0aCA9
IG5ldyBQbGF0Zm9ybVBhdGgoKm90aGVyLm1fcGF0aCk7CisgICAgcmV0dXJuICp0aGlzOworfQor
Citib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBy
dWxlKSBjb25zdAoreworICAgIHJldHVybiBtX3BhdGgtPmNvbnRhaW5zKHBvaW50LCBydWxlKTsK
K30KKwordm9pZCBQYXRoOjp0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAg
IG1fcGF0aC0+dHJhbnNsYXRlKHNpemUpOworfQorCitGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdS
ZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRoLT5ib3VuZGluZ1JlY3QoKTsKK30KKwor
dm9pZCBQYXRoOjptb3ZlVG8oY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9wYXRo
LT5tb3ZlVG8ocG9pbnQpOworfQorCit2b2lkIFBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBv
aW50JiBwb2ludCkKK3sKKyAgICBtX3BhdGgtPmFkZExpbmVUbyhwb2ludCk7Cit9CisKK3ZvaWQg
UGF0aDo6YWRkUXVhZEN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AsIGNvbnN0IEZsb2F0UG9p
bnQmIHApCit7CisgICAgbV9wYXRoLT5hZGRRdWFkQ3VydmVUbyhjcCwgcCk7Cit9CisKK3ZvaWQg
UGF0aDo6YWRkQmV6aWVyQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcDEsIGNvbnN0IEZsb2F0
UG9pbnQmIGNwMiwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBtX3BhdGgtPmFkZEJlemll
ckN1cnZlVG8oY3AxLCBjcDIsIHApOworfQorCit2b2lkIFBhdGg6OmFkZEFyY1RvKGNvbnN0IEZs
b2F0UG9pbnQmIHAxLCBjb25zdCBGbG9hdFBvaW50JiBwMiwgZmxvYXQgcmFkaXVzKQoreworICAg
IG1fcGF0aC0+YWRkQXJjVG8ocDEsIHAyLCByYWRpdXMpOworfQorCit2b2lkIFBhdGg6OmNsb3Nl
U3VicGF0aCgpCit7CisgICAgbV9wYXRoLT5jbG9zZVN1YnBhdGgoKTsKK30KKwordm9pZCBQYXRo
OjphZGRBcmMoY29uc3QgRmxvYXRQb2ludCYgcCwgZmxvYXQgciwgZmxvYXQgc2FyLCBmbG9hdCBl
YXIsIGJvb2wgYW50aWNsb2Nrd2lzZSkKK3sKKyAgICBtX3BhdGgtPmFkZEVsbGlwc2UocCwgciwg
ciwgc2FyLCBlYXIsIGFudGljbG9ja3dpc2UpOworfQorCit2b2lkIFBhdGg6OmFkZFJlY3QoY29u
c3QgRmxvYXRSZWN0JiByKQoreworICAgIG1fcGF0aC0+YWRkUmVjdChyKTsKK30KKwordm9pZCBQ
YXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcikKK3sKKyAgICBtX3BhdGgtPmFkZEVs
bGlwc2Uocik7Cit9CisKK3ZvaWQgUGF0aDo6Y2xlYXIoKQoreworICAgIG1fcGF0aC0+Y2xlYXIo
KTsKK30KKworYm9vbCBQYXRoOjppc0VtcHR5KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRo
LT5pc0VtcHR5KCk7Cit9CisKK1N0cmluZyBQYXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fcGF0aC0+ZGVidWdTdHJpbmcoKTsKK30KKwordm9pZCBQYXRoOjphcHBseSh2
b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25zdAoreworICAgIG1f
cGF0aC0+YXBwbHkoaW5mbywgZnVuY3Rpb24pOworfQorCit2b2lkIFBhdGg6OnRyYW5zZm9ybShj
b25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBtX3BhdGgtPnRyYW5zZm9ybSh0
KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0cm9rZUJvdW5kaW5nUmVjdChTdHJva2VTdHlsZUFw
cGxpZXIgKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBGbG9hdFJlY3Qo
KTsKK30KKworYm9vbCBQYXRoOjpzdHJva2VDb250YWlucyhTdHJva2VTdHlsZUFwcGxpZXIqLCBj
b25zdCBGbG9hdFBvaW50JikgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJl
dHVybiBmYWxzZTsKK30KKworYm9vbCBQYXRoOjpoYXNDdXJyZW50UG9pbnQoKSBjb25zdAorewor
ICAgIHJldHVybiAhaXNFbXB0eSgpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjU4YmVkMzEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcApAQCAtMCwwICsxLDgx
NSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4K
KyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBV
U0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdp
bmNlLmgiCisKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNp
bmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4K
KworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBJbXBs
ZW1lbnRlZCBpbiBHcmFwaGljc0NvbnRleHRXaW5jZS5jcHAKK3ZvaWQgZ2V0RWxsaXBzZVBvaW50
QnlBbmdsZShkb3VibGUgYW5nbGUsIGRvdWJsZSBhLCBkb3VibGUgYiwgZmxvYXQmIHgsIGZsb2F0
JiB5KTsKKworc3RhdGljIHZvaWQgcXVhZEN1cnZlKGludCBzZWdtZW50cywgVmVjdG9yPFBhdGhQ
b2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50KiBjb250cm9sKQoreworICAgIGNvbnN0IGZsb2F0
IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAgICByZWdpc3RlciBmbG9hdCB0QSA9IDAuMDsKKyAg
ICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsKKworICAgIGZsb2F0IGMxeCA9IGNvbnRyb2xbMF0u
eCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRyb2xbMF0ueSgpOworICAgIGZsb2F0IGMyeCA9IGNv
bnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMyeSA9IGNvbnRyb2xbMV0ueSgpOworICAgIGZsb2F0
IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAgIGZsb2F0IGMzeSA9IGNvbnRyb2xbMl0ueSgpOwor
CisgICAgY29uc3QgaW50IG9mZnNldCA9IHB0cy5zaXplKCk7CisgICAgcHRzLnJlc2l6ZShvZmZz
ZXQgKyBzZWdtZW50cyk7CisgICAgUGF0aFBvaW50IHBwOworICAgIHBwLm1feCA9IGMxeDsKKyAg
ICBwcC5tX3kgPSBjMXk7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZ21lbnRzOyArK2kp
IHsKKyAgICAgICAgdEEgKz0gc3RlcDsKKyAgICAgICAgdEIgLT0gc3RlcDsKKworICAgICAgICBj
b25zdCBmbG9hdCBhID0gdEIgKiB0QjsKKyAgICAgICAgY29uc3QgZmxvYXQgYiA9IDIuMCAqIHRB
ICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGMgPSB0QSAqIHRBOworCisgICAgICAgIHBwLm1f
eCA9IGMxeCAqIGEgKyBjMnggKiBiICsgYzN4ICogYzsKKyAgICAgICAgcHAubV95ID0gYzF5ICog
YSArIGMyeSAqIGIgKyBjM3kgKiBjOworCisgICAgICAgIHB0c1tvZmZzZXQgKyBpIC0gMV0gPSBw
cDsKKyAgICB9CisKKyAgICBwcC5tX3ggPSBjM3g7CisgICAgcHAubV95ID0gYzN5OworICAgIHB0
c1tvZmZzZXQgKyBzZWdtZW50cyAtIDFdID0gcHA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBi
ZXppZXIoaW50IHNlZ21lbnRzLCBWZWN0b3I8UGF0aFBvaW50PiYgcHRzLCBjb25zdCBQYXRoUG9p
bnQqIGNvbnRyb2wpCit7CisgICAgY29uc3QgZmxvYXQgc3RlcCA9IDEuMCAvIHNlZ21lbnRzOwor
ICAgIHJlZ2lzdGVyIGZsb2F0IHRBID0gMC4wOworICAgIHJlZ2lzdGVyIGZsb2F0IHRCID0gMS4w
OworCisgICAgZmxvYXQgYzF4ID0gY29udHJvbFswXS54KCk7CisgICAgZmxvYXQgYzF5ID0gY29u
dHJvbFswXS55KCk7CisgICAgZmxvYXQgYzJ4ID0gY29udHJvbFsxXS54KCk7CisgICAgZmxvYXQg
YzJ5ID0gY29udHJvbFsxXS55KCk7CisgICAgZmxvYXQgYzN4ID0gY29udHJvbFsyXS54KCk7Cisg
ICAgZmxvYXQgYzN5ID0gY29udHJvbFsyXS55KCk7CisgICAgZmxvYXQgYzR4ID0gY29udHJvbFsz
XS54KCk7CisgICAgZmxvYXQgYzR5ID0gY29udHJvbFszXS55KCk7CisKKyAgICBjb25zdCBpbnQg
b2Zmc2V0ID0gcHRzLnNpemUoKTsKKyAgICBwdHMucmVzaXplKG9mZnNldCArIHNlZ21lbnRzKTsK
KyAgICBQYXRoUG9pbnQgcHA7CisgICAgcHAubV94ID0gYzF4OworICAgIHBwLm1feSA9IGMxeTsK
KworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHM7ICsraSkgeworICAgICAgICB0QSAr
PSBzdGVwOworICAgICAgICB0QiAtPSBzdGVwOworICAgICAgICBjb25zdCBmbG9hdCB0QXNxID0g
dEEgKiB0QTsKKyAgICAgICAgY29uc3QgZmxvYXQgdEJzcSA9IHRCICogdEI7CisKKyAgICAgICAg
Y29uc3QgZmxvYXQgYSA9IHRCc3EgKiB0QjsKKyAgICAgICAgY29uc3QgZmxvYXQgYiA9IDMuMCAq
IHRBICogdEJzcTsKKyAgICAgICAgY29uc3QgZmxvYXQgYyA9IDMuMCAqIHRCICogdEFzcTsKKyAg
ICAgICAgY29uc3QgZmxvYXQgZCA9IHRBc3EgKiB0QTsKKworICAgICAgICBwcC5tX3ggPSBjMXgg
KiBhICsgYzJ4ICogYiArIGMzeCAqIGMgKyBjNHggKiBkOworICAgICAgICBwcC5tX3kgPSBjMXkg
KiBhICsgYzJ5ICogYiArIGMzeSAqIGMgKyBjNHkgKiBkOworCisgICAgICAgIHB0c1tvZmZzZXQg
KyBpIC0gMV0gPSBwcDsKKyAgICB9CisKKyAgICBwcC5tX3ggPSBjNHg7CisgICAgcHAubV95ID0g
YzR5OworICAgIHB0c1tvZmZzZXQgKyBzZWdtZW50cyAtIDFdID0gcHA7Cit9CisKK3N0YXRpYyBp
bmxpbmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQoreworICAgIGlmIChkID4gMCkKKyAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICBpbnQgaSA9IHN0YXRp
Y19jYXN0PGludD4oZCk7CisgICAgcmV0dXJuIGkgLSBkID4gMC41ID8gaSAtIDEgOiBpOworfQor
CitzdGF0aWMgYm9vbCBjb250YWluc1BvaW50KGNvbnN0IEZsb2F0UmVjdCYgciwgY29uc3QgRmxv
YXRQb2ludCYgcCkKK3sKKyAgICByZXR1cm4gcC54KCkgPj0gci54KCkgJiYgcC55KCkgPj0gci55
KCkgJiYgcC54KCkgPCByLnJpZ2h0KCkgJiYgcC55KCkgPCByLmJvdHRvbSgpOworfQorCisjZGVm
aW5lIFBJICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2CisKK3N0YXRpYyB2b2lkIG5vcm1h
bGl6ZUFuZ2xlKGZsb2F0JiBhbmdsZSkKK3sKKyAgICB3aGlsZSAoYW5nbGUgPCAwKQorICAgICAg
ICBhbmdsZSArPSAyICogUEk7CisgICAgd2hpbGUgKGFuZ2xlID49IDIgKiBQSSkKKyAgICAgICAg
YW5nbGUgLT0gMiAqIFBJOworICAgIGlmIChhbmdsZSA8IDAuMDAwMDEpCisgICAgICAgIGFuZ2xl
ID0gMDsKK30KKworc3RhdGljIHZvaWQgdHJhbnNmb3JtQXJjUG9pbnQoZmxvYXQmIHgsIGZsb2F0
JiB5LCBjb25zdCBGbG9hdFBvaW50JiBjKQoreworICAgIHggKz0gYy54KCk7CisgICAgeSArPSBj
LnkoKTsKK30KKworc3RhdGljIHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChGbG9hdFJl
Y3QmIHIsIGZsb2F0IHgsIGZsb2F0IHkpCit7CisgICAgaWYgKHIuaXNFbXB0eSgpKSB7CisgICAg
ICAgIHIuc2V0WCh4KTsKKyAgICAgICAgci5zZXRZKHkpOworICAgICAgICByLnNldFNpemUoRmxv
YXRTaXplKDEsIDEpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoeCA8IHIueCgp
KSB7CisgICAgICAgIHIuc2V0V2lkdGgoci5yaWdodCgpIC0geCk7CisgICAgICAgIHIuc2V0WCh4
KTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbG9hdCB3ID0geCAtIHIueCgpICsgMTsKKyAgICAg
ICAgaWYgKHcgPiByLndpZHRoKCkpCisgICAgICAgICAgICByLnNldFdpZHRoKHcpOworICAgIH0K
KyAgICBpZiAoeSA8IHIueSgpKSB7CisgICAgICAgIHIuc2V0SGVpZ2h0KHIuYm90dG9tKCkgLSB5
KTsKKyAgICAgICAgci5zZXRZKHkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IGggPSAg
eSAtIHIueSgpICsgMTsKKyAgICAgICAgaWYgKGggPiByLmhlaWdodCgpKQorICAgICAgICAgICAg
ci5zZXRIZWlnaHQoaCk7CisgICAgfQorfQorCisvLyByZXR1cm4gMC1iYXNlZCB2YWx1ZTogMCAt
IGZpcnN0IFF1YWRyYW50ICggMCAtIDkwIGRlZ3JlZSkKK3N0YXRpYyBpbmxpbmUgaW50IHF1YWRy
YW50KGNvbnN0IFBhdGhQb2ludCYgcG9pbnQsIGNvbnN0IFBhdGhQb2ludCYgb3JpZ1BvaW50KQor
eworICAgIHJldHVybiBwb2ludC5tX3ggPCBvcmlnUG9pbnQubV94ID8KKyAgICAgICAgKHBvaW50
Lm1feSA8IG9yaWdQb2ludC5tX3kgPyAyIDogMSkKKyAgICAgICAgOiAocG9pbnQubV95IDwgb3Jp
Z1BvaW50Lm1feSA/IDMgOiAwKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzUXVhZHJhbnRP
bkxlZnQoaW50IHEpIHsgcmV0dXJuIHEgPT0gMSB8fCBxID09IDI7IH0KK3N0YXRpYyBpbmxpbmUg
Ym9vbCBpc1F1YWRyYW50T25SaWdodChpbnQgcSkgeyByZXR1cm4gcSA9PSAwIHx8IHEgPT0gMzsg
fQorc3RhdGljIGlubGluZSBib29sIGlzUXVhZHJhbnRPblRvcChpbnQgcSkgeyByZXR1cm4gcSA9
PSAyIHx8IHEgPT0gMzsgfQorc3RhdGljIGlubGluZSBib29sIGlzUXVhZHJhbnRPbkJvdHRvbShp
bnQgcSkgeyByZXR1cm4gcSA9PSAwIHx8IHEgPT0gMTsgfQorCitzdGF0aWMgaW5saW5lIGludCBu
ZXh0UXVhZHJhbnQoaW50IHEpIHsgcmV0dXJuIHEgPT0gMyA/IDAgOiBxICsgMTsgfQorc3RhdGlj
IGlubGluZSBpbnQgcXVhZHJhbnREaWZmKGludCBxMSwgaW50IHEyKQoreworICAgIGludCBkID0g
cTEgLSBxMjsKKyAgICB3aGlsZSAoZCA8IDApCisgICAgICAgIGQgKz0gNDsKKyAgICByZXR1cm4g
ZDsKK30KKworc3RydWN0IFBhdGhWZWN0b3IgeworICAgIGZsb2F0IG1feDsKKyAgICBmbG9hdCBt
X3k7CisKKyAgICBQYXRoVmVjdG9yKCkgOiBtX3goMCksIG1feSgwKSB7fQorICAgIFBhdGhWZWN0
b3IoZmxvYXQgeCwgZmxvYXQgeSkgOiBtX3goeCksIG1feSh5KSB7fQorICAgIGRvdWJsZSBhbmds
ZSgpIGNvbnN0IHsgcmV0dXJuIGF0YW4yKG1feSwgbV94KTsgfQorICAgIG9wZXJhdG9yIGRvdWJs
ZSAoKSBjb25zdCB7IHJldHVybiBhbmdsZSgpOyB9CisgICAgZG91YmxlIGxlbmd0aCgpIGNvbnN0
IHsgcmV0dXJuIF9oeXBvdChtX3gsIG1feSk7IH0KK307CisKK1BhdGhWZWN0b3Igb3BlcmF0b3It
KGNvbnN0IFBhdGhQb2ludCYgcDEsIGNvbnN0IFBhdGhQb2ludCYgcDIpIHsgcmV0dXJuIFBhdGhW
ZWN0b3IocDEubV94IC0gcDIubV94LCBwMS5tX3kgLSBwMi5tX3kpOyB9CisKK3N0YXRpYyB2b2lk
IGFkZEFyY1BvaW50KFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQYXRoUG9pbnQmIGNlbnRlciwg
Y29uc3QgUGF0aFBvaW50JiByYWRpdXMsIGRvdWJsZSBhbmdsZSkKK3sKKyAgICBQYXRoUG9pbnQg
cDsKKyAgICBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGFuZ2xlLCByYWRpdXMubV94LCByYWRpdXMu
bV95LCBwLm1feCwgcC5tX3kpOworICAgIHRyYW5zZm9ybUFyY1BvaW50KHAubV94LCBwLm1feSwg
Y2VudGVyKTsKKyAgICBpZiAocG9seS5pc0VtcHR5KCkgfHwgcG9seS5sYXN0KCkgIT0gcCkKKyAg
ICAgICAgcG9seS5hcHBlbmQocCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEFyY1BvaW50cyhQYXRo
UG9seWdvbiYgcG9seSwgY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8mIGRhdGEpCit7
CisgICAgY29uc3QgUGF0aFBvaW50JiBzdGFydFBvaW50ID0gcG9seS5sYXN0KCk7CisgICAgZG91
YmxlIGN1ckFuZ2xlID0gc3RhcnRQb2ludCAtIGRhdGEubV9jZW50ZXI7CisgICAgZG91YmxlIGVu
ZEFuZ2xlID0gZGF0YS5tX2VuZCAtIGRhdGEubV9jZW50ZXI7CisgICAgZG91YmxlIGFuZ2xlU3Rl
cCA9IDIuIC8gc3RkOjptYXgoZGF0YS5tX3JhZGl1cy5tX3gsIGRhdGEubV9yYWRpdXMubV95KTsK
KyAgICBpZiAoZGF0YS5tX2Nsb2Nrd2lzZSkgeworICAgICAgICBpZiAoZW5kQW5nbGUgPD0gY3Vy
QW5nbGUgfHwgc3RhcnRQb2ludCA9PSBkYXRhLm1fZW5kKQorICAgICAgICAgICAgZW5kQW5nbGUg
Kz0gMiAqIFBJOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZ2xlU3RlcCA9IC1hbmdsZVN0ZXA7
CisgICAgICAgIGlmIChlbmRBbmdsZSA+PSBjdXJBbmdsZSB8fCBzdGFydFBvaW50ID09IGRhdGEu
bV9lbmQpCisgICAgICAgICAgICBlbmRBbmdsZSAtPSAyICogUEk7CisgICAgfQorCisgICAgZm9y
IChjdXJBbmdsZSArPSBhbmdsZVN0ZXA7IGRhdGEubV9jbG9ja3dpc2UgPyBjdXJBbmdsZSA8IGVu
ZEFuZ2xlIDogY3VyQW5nbGUgPiBlbmRBbmdsZTsgY3VyQW5nbGUgKz0gYW5nbGVTdGVwKQorICAg
ICAgICBhZGRBcmNQb2ludChwb2x5LCBkYXRhLm1fY2VudGVyLCBkYXRhLm1fcmFkaXVzLCBjdXJB
bmdsZSk7CisKKyAgICBpZiAocG9seS5pc0VtcHR5KCkgfHwgcG9seS5sYXN0KCkgIT0gZGF0YS5t
X2VuZCkKKyAgICAgICAgcG9seS5hcHBlbmQoZGF0YS5tX2VuZCk7Cit9CisKK3N0YXRpYyB2b2lk
IGRyYXdQb2x5Z29ucyhIREMgZGMsIGNvbnN0IFZlY3RvcjxQYXRoUG9seWdvbj4mIHBvbHlnb25z
LCBib29sIGZpbGwsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4KiB0cikKK3sKKyAgICBNZW1v
cnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworICAgIGZvciAoVmVjdG9yPFBhdGhQb2x5Z29u
Pjo6Y29uc3RfaXRlcmF0b3IgaSA9IHBvbHlnb25zLmJlZ2luKCk7IGkgIT0gcG9seWdvbnMuZW5k
KCk7ICsraSkgeworICAgICAgICBpbnQgbnBvaW50cyA9IGktPnNpemUoKTsKKyAgICAgICAgaWYg
KCFucG9pbnRzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgUE9JTlQqIHdpblBv
aW50cyA9IDA7CisgICAgICAgIGlmIChmaWxsKSB7CisgICAgICAgICAgICBpZiAobnBvaW50cyA+
IDIpCisgICAgICAgICAgICAgICAgd2luUG9pbnRzID0gbmV3IFBPSU5UW25wb2ludHMgKyAxXTsK
KyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB3aW5Qb2ludHMgPSBuZXcgUE9JTlRbbnBvaW50
c107CisKKyAgICAgICAgaWYgKHdpblBvaW50cykgeworICAgICAgICAgICAgaWYgKHRyKSB7Cisg
ICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAwOyBpMiA8IG5wb2ludHM7ICsraTIpIHsKKyAg
ICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCB0clBvaW50ID0gdHItPm1hcFBvaW50KGktPmF0
KGkyKSk7CisgICAgICAgICAgICAgICAgICAgIHdpblBvaW50c1tpMl0ueCA9IHN0YWJsZVJvdW5k
KHRyUG9pbnQueCgpKTsKKyAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2kyXS55ID0gc3Rh
YmxlUm91bmQodHJQb2ludC55KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAwOyBpMiA8IG5wb2ludHM7ICsr
aTIpIHsKKyAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2kyXS54ID0gc3RhYmxlUm91bmQo
aS0+YXQoaTIpLngoKSk7CisgICAgICAgICAgICAgICAgICAgIHdpblBvaW50c1tpMl0ueSA9IHN0
YWJsZVJvdW5kKGktPmF0KGkyKS55KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgaWYgKGZpbGwgJiYgd2luUG9pbnRzW25wb2ludHMgLSAxXSAhPSB3
aW5Qb2ludHNbMF0pIHsKKyAgICAgICAgICAgICAgICB3aW5Qb2ludHNbbnBvaW50c10ueCA9IHdp
blBvaW50c1swXS54OworICAgICAgICAgICAgICAgIHdpblBvaW50c1tucG9pbnRzXS55ID0gd2lu
UG9pbnRzWzBdLnk7CisgICAgICAgICAgICAgICAgKytucG9pbnRzOworICAgICAgICAgICAgfQor
CisgICAgICAgICAgICBpZiAoZmlsbCkKKyAgICAgICAgICAgICAgICA6OlBvbHlnb24oZGMsIHdp
blBvaW50cywgbnBvaW50cyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgOjpQ
b2x5bGluZShkYywgd2luUG9pbnRzLCBucG9pbnRzKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIHdp
blBvaW50czsKKyAgICAgICAgfQorICAgIH0KK30KKworCitpbnQgUGxhdGZvcm1QYXRoRWxlbWVu
dDo6bnVtQ29udHJvbFBvaW50cygpIGNvbnN0Cit7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAg
ICBjYXNlIFBhdGhNb3ZlVG86CisgICAgY2FzZSBQYXRoTGluZVRvOgorICAgICAgICByZXR1cm4g
MTsKKyAgICBjYXNlIFBhdGhRdWFkQ3VydmVUbzoKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAg
ICAgcmV0dXJuIDI7CisgICAgY2FzZSBQYXRoQmV6aWVyQ3VydmVUbzoKKyAgICAgICAgcmV0dXJu
IDM7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUKG1fdHlwZSA9PSBQYXRoQ2xvc2VTdWJw
YXRoKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitpbnQgUGxhdGZvcm1QYXRoRWxl
bWVudDo6bnVtUG9pbnRzKCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNh
c2UgUGF0aE1vdmVUbzoKKyAgICBjYXNlIFBhdGhMaW5lVG86CisgICAgY2FzZSBQYXRoQXJjVG86
CisgICAgICAgIHJldHVybiAxOworICAgIGNhc2UgUGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICBy
ZXR1cm4gMjsKKyAgICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gMzsK
KyAgICBkZWZhdWx0OgorICAgICAgICBBU1NFUlQobV90eXBlID09IFBhdGhDbG9zZVN1YnBhdGgp
OworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3ZvaWQgUGF0aFBvbHlnb246Om1vdmUo
Y29uc3QgRmxvYXRTaXplJiBvZmZzZXQpCit7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6
aXRlcmF0b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytpKQorICAgICAgICBpLT5tb3ZlKG9m
ZnNldCk7Cit9CisKK3ZvaWQgUGF0aFBvbHlnb246OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCYgdCkKK3sKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+OjppdGVyYXRvciBp
ID0gYmVnaW4oKTsgaSA8IGVuZCgpOyArK2kpCisgICAgICAgICppID0gdC5tYXBQb2ludCgqaSk7
Cit9CisKK2Jvb2wgUGF0aFBvbHlnb246OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50
KSBjb25zdAoreworICAgIGlmIChzaXplKCkgPCAzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICAvLyBUZXN0IGludGVyc2VjdGlvbnMgYmV0d2VlbiB0aGUgcG9seWdvbiBhbmQgdGhlIHZl
cnRpY2FsIGxpbmU6IHggPSBwb2ludC54KCkKKworICAgIGludCBpbnRlcnNlY3RlZCA9IDA7Cisg
ICAgY29uc3QgUGF0aFBvaW50KiBwb2ludDEgPSAmbGFzdCgpOworICAgIFZlY3RvcjxQYXRoUG9p
bnQ+Ojpjb25zdF9pdGVyYXRvciBsYXN0ID0gZW5kKCk7CisgICAgLy8gd2FzTmVnYXRpdmU6IC0x
IG1lYW5zIHVua25vd24sIDAgbWVhbnMgZmFsc2UsIDEgbWVhbnMgdHJ1ZS4KKyAgICBpbnQgd2Fz
TmVnYXRpdmUgPSAtMTsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRv
ciBpID0gYmVnaW4oKTsgaSAhPSBsYXN0OyArK2kpIHsKKyAgICAgICAgY29uc3QgUGF0aFBvaW50
JiBwb2ludDIgPSAqaTsKKyAgICAgICAgaWYgKHBvaW50MS0+eCgpICE9IHBvaW50LngoKSkgewor
ICAgICAgICAgICAgaWYgKHBvaW50Mi54KCkgPT0gcG9pbnQueCgpKSB7CisgICAgICAgICAgICAg
ICAgLy8gV2UgYXJlIGdldHRpbmcgb24gdGhlIHZlcnRpY2FsIGxpbmUKKyAgICAgICAgICAgICAg
ICB3YXNOZWdhdGl2ZSA9IHBvaW50MS0+eCgpIDwgcG9pbnQueCgpID8gMSA6IDA7CisgICAgICAg
ICAgICB9IGVsc2UgaWYgKHBvaW50Mi54KCkgPCBwb2ludC54KCkgIT0gcG9pbnQxLT54KCkgPCBw
b2ludC54KCkpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB5ID0gKHBvaW50Mi55KCkgLSBwb2lu
dDEtPnkoKSkgLyAocG9pbnQyLngoKSAtIHBvaW50MS0+eCgpKSAqIChwb2ludC54KCkgLSBwb2lu
dDEtPngoKSkgKyBwb2ludDEtPnkoKTsKKyAgICAgICAgICAgICAgICBpZiAoeSA+PSBwb2ludC55
KCkpCisgICAgICAgICAgICAgICAgICAgICsraW50ZXJzZWN0ZWQ7CisgICAgICAgICAgICB9Cisg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgbGVhdmluZyB0aGUgdmVydGlj
YWwgbGluZQorCisgICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlCisgICAgICAgICAg
ICBpZiAocG9pbnQxLT55KCkgPT0gcG9pbnQueSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0
cnVlOworCisgICAgICAgICAgICBpZiAocG9pbnQxLT55KCkgPiBwb2ludC55KCkpIHsKKyAgICAg
ICAgICAgICAgICBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkpIHsKKyAgICAgICAgICAgICAg
ICAgICAgLy8gc2VlIGlmIHRoZSBwb2ludCBpcyBvbiB0aGlzIHNlZ21lbnQKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKHBvaW50Mi55KCkgPD0gcG9pbnQueSgpKQorICAgICAgICAgICAgICAgICAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICAgICAgLy8gV2UgaGF2ZSB0byBnZXQgYmFjayB0byBzZWUgd2hpY2ggc2lkZSB3ZSBjb21l
IGZyb20uIElmIHdlIGNvbWUgZnJvbQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBz
aWRlIHdlIGFyZSBsZWF2aW5nLCBubyBpbnRlcnNlY3Rpb24gc2hvdWxkIGJlIGNvdW50ZWQKKyAg
ICAgICAgICAgICAgICAgICAgaWYgKHdhc05lZ2F0aXZlIDwgMCkgeworICAgICAgICAgICAgICAg
ICAgICAgICAgVmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9yIGpMYXN0ID0gaTsKKyAg
ICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBq
ID0gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICBpZiAoaiA9PSBiZWdpbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBqID0gbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIC0tajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBp
ZiAoai0+eCgpICE9IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoai0+eCgpID4gcG9pbnQueCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgd2FzTmVnYXRpdmUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IDE7
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGogIT0gakxh
c3QpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRpdmUgPCAwKQorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRpdmUgPyBwb2ludDIueCgpID4g
cG9pbnQueCgpIDogcG9pbnQyLngoKSA8IHBvaW50LngoKSkKKyAgICAgICAgICAgICAgICAgICAg
ICAgICsraW50ZXJzZWN0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNl
IGlmIChwb2ludDIueCgpID09IHBvaW50LngoKSAmJiBwb2ludDIueSgpID49IHBvaW50LnkoKSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwb2ludDEg
PSAmcG9pbnQyOworICAgIH0KKworICAgIHJldHVybiBpbnRlcnNlY3RlZCAmIDE7Cit9CisKK3Zv
aWQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKK3sK
KyAgICBpbnQgbiA9IG51bUNvbnRyb2xQb2ludHMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8
IG47ICsraSkKKyAgICAgICAgbV9kYXRhLm1fcG9pbnRzW2ldLm1vdmUob2Zmc2V0KTsKK30KKwor
dm9pZCBQbGF0Zm9ybVBhdGhFbGVtZW50Ojp0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgmIHQpCit7CisgICAgaW50IG4gPSBudW1Db250cm9sUG9pbnRzKCk7CisgICAgZm9yIChp
bnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgRmxvYXRQb2ludCBwID0gdC5tYXBQb2lu
dChtX2RhdGEubV9wb2ludHNbaV0pOworICAgICAgICBtX2RhdGEubV9wb2ludHNbaV0uc2V0KHAu
eCgpLCBwLnkoKSk7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OmluZmxh
dGVSZWN0VG9Db250YWluTWUoRmxvYXRSZWN0JiByLCBjb25zdCBGbG9hdFBvaW50JiBsYXN0UG9p
bnQpIGNvbnN0Cit7CisgICAgaWYgKG1fdHlwZSA9PSBQYXRoQXJjVG8pIHsKKyAgICAgICAgY29u
c3QgQXJjVG8mIGRhdGEgPSBtX2RhdGEubV9hcmNUb0RhdGE7CisgICAgICAgIFBhdGhQb2ludCBz
dGFydFBvaW50OworICAgICAgICBzdGFydFBvaW50ID0gbGFzdFBvaW50OworICAgICAgICBQYXRo
UG9pbnQgZW5kUG9pbnQgPSBkYXRhLm1fZW5kOworICAgICAgICBpZiAoIWRhdGEubV9jbG9ja3dp
c2UpCisgICAgICAgICAgICBzdGQ6OnN3YXAoc3RhcnRQb2ludCwgZW5kUG9pbnQpOworCisgICAg
ICAgIGludCBxMCA9IHF1YWRyYW50KHN0YXJ0UG9pbnQsIGRhdGEubV9jZW50ZXIpOworICAgICAg
ICBpbnQgcTEgPSBxdWFkcmFudChlbmRQb2ludCwgZGF0YS5tX2NlbnRlcik7CisgICAgICAgIGJv
b2wgY29udGFpbnNFeHRyZW1lc1s0XSA9IHsgZmFsc2UgfTsgLy8gYm90dG9tLCBsZWZ0LCB0b3As
IHJpZ2h0CisgICAgICAgIHN0YXRpYyBjb25zdCBQYXRoUG9pbnQgZXh0cmVtZVZlY3RvcnNbNF0g
PSB7IHsgMCwgMSB9LCB7IC0xLCAwIH0sIHsgMCwgLTEgfSwgeyAxLCAwIH0gfTsKKyAgICAgICAg
aWYgKHEwID09IHExKSB7CisgICAgICAgICAgICBpZiAoc3RhcnRQb2ludC5tX3ggPT0gZW5kUG9p
bnQubV94IHx8IGlzUXVhZHJhbnRPbkJvdHRvbShxMCkgIT0gc3RhcnRQb2ludC5tX3ggPiBlbmRQ
b2ludC5tX3gpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkK
KyAgICAgICAgICAgICAgICAgICAgY29udGFpbnNFeHRyZW1lc1tpXSA9IHRydWU7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZXh0cmVtZSA9IHEwOwor
ICAgICAgICAgICAgaW50IGRpZmYgPSBxdWFkcmFudERpZmYocTEsIHEwKTsKKyAgICAgICAgICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgZGlmZjsgKytpKSB7CisgICAgICAgICAgICAgICAgY29udGFp
bnNFeHRyZW1lc1tleHRyZW1lXSA9IHRydWU7CisgICAgICAgICAgICAgICAgZXh0cmVtZSA9IG5l
eHRRdWFkcmFudChleHRyZW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAg
IGluZmxhdGVSZWN0VG9Db250YWluUG9pbnQociwgc3RhcnRQb2ludC5tX3gsIHN0YXJ0UG9pbnQu
bV95KTsKKyAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBlbmRQb2ludC5tX3gs
IGVuZFBvaW50Lm1feSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7Cisg
ICAgICAgICAgICBpZiAoY29udGFpbnNFeHRyZW1lc1tpXSkKKyAgICAgICAgICAgICAgICBpbmZs
YXRlUmVjdFRvQ29udGFpblBvaW50KHIsIGRhdGEubV9jZW50ZXIubV94ICsgZGF0YS5tX3JhZGl1
cy5tX3ggKiBleHRyZW1lVmVjdG9yc1tpXS5tX3gsIGRhdGEubV9jZW50ZXIubV95ICsgZGF0YS5t
X3JhZGl1cy5tX3kgKiBleHRyZW1lVmVjdG9yc1tpXS5tX3kpOworICAgICAgICB9CisgICAgfSBl
bHNlIHsKKyAgICAgICAgaW50IG4gPSBudW1Qb2ludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBuOyArK2kpCisgICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIs
IG1fZGF0YS5tX3BvaW50c1tpXS5tX3gsIG1fZGF0YS5tX3BvaW50c1tpXS5tX3kpOworICAgIH0K
K30KKworUGF0aEVsZW1lbnRUeXBlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnR5cGUoKSBjb25zdAor
eworICAgIHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQYXRoTW92ZVRvOgorICAgICAgICBy
ZXR1cm4gUGF0aEVsZW1lbnRNb3ZlVG9Qb2ludDsKKyAgICBjYXNlIFBhdGhMaW5lVG86CisgICAg
ICAgIHJldHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OworICAgIGNhc2UgUGF0aEFyY1Rv
OgorICAgICAgICAvLyBGSVhNRTogdGhlcmUncyBubyBhcmNUbyB0eXBlIGZvciBQYXRoRWxlbWVu
dAorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRMaW5lVG9Qb2ludDsKKyAgICAgICAgLy8g
cmV0dXJuIFBhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKKyAgICBjYXNlIFBhdGhRdWFk
Q3VydmVUbzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsK
KyAgICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRB
ZGRDdXJ2ZVRvUG9pbnQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUKG1fdHlwZSA9PSBQ
YXRoQ2xvc2VTdWJwYXRoKTsKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50Q2xvc2VTdWJwYXRo
OworICAgIH0KK30KKworUGxhdGZvcm1QYXRoOjpQbGF0Zm9ybVBhdGgoKQorOiBtX3BlbkxpZnRl
ZCh0cnVlKQoreworICAgIG1fY3VycmVudFBvaW50LmNsZWFyKCk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1QYXRoOjplbnN1cmVTdWJwYXRoKCkKK3sKKyAgICBpZiAobV9wZW5MaWZ0ZWQpIHsKKyAgICAg
ICAgbV9wZW5MaWZ0ZWQgPSBmYWxzZTsKKyAgICAgICAgbV9zdWJwYXRocy5hcHBlbmQoUGF0aFBv
bHlnb24oKSk7CisgICAgICAgIG1fc3VicGF0aHMubGFzdCgpLmFwcGVuZChtX2N1cnJlbnRQb2lu
dCk7CisgICAgfSBlbHNlCisgICAgICAgIEFTU0VSVCghbV9zdWJwYXRocy5pc0VtcHR5KCkpOwor
fQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3JtUGF0aEVs
ZW1lbnQmIGUpCit7CisgICAgaWYgKGUucGxhdGZvcm1UeXBlKCkgPT0gUGxhdGZvcm1QYXRoRWxl
bWVudDo6UGF0aE1vdmVUbykgeworICAgICAgICBtX3BlbkxpZnRlZCA9IHRydWU7CisgICAgICAg
IG1fY3VycmVudFBvaW50ID0gZS5wb2ludEF0KDApOworICAgIH0gZWxzZSBpZiAoZS5wbGF0Zm9y
bVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQ2xvc2VTdWJwYXRoKSB7CisgICAg
ICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtX3N1YnBhdGhzLmlzRW1wdHko
KSkgeworICAgICAgICAgICAgaWYgKG1fY3VycmVudFBvaW50ICE9IG1fc3VicGF0aHMubGFzdCgp
WzBdKSB7CisgICAgICAgICAgICAgICAgLy8gQWNjb3JkaW5nIHRvIFczQywgd2UgaGF2ZSB0byBk
cmF3IGEgbGluZSBmcm9tIGN1cnJlbnQgcG9pbnQgdG8gdGhlIGluaXRpYWwgcG9pbnQKKyAgICAg
ICAgICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5hcHBlbmQobV9zdWJwYXRocy5sYXN0KClbMF0p
OworICAgICAgICAgICAgICAgIG1fY3VycmVudFBvaW50ID0gbV9zdWJwYXRocy5sYXN0KClbMF07
CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgbV9jdXJyZW50UG9p
bnQuY2xlYXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBlbnN1cmVTdWJwYXRoKCk7CisgICAg
ICAgIHN3aXRjaCAoZS5wbGF0Zm9ybVR5cGUoKSkgeworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0
aEVsZW1lbnQ6OlBhdGhMaW5lVG86CisgICAgICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5hcHBl
bmQoZS5wb2ludEF0KDApKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRm
b3JtUGF0aEVsZW1lbnQ6OlBhdGhBcmNUbzoKKyAgICAgICAgICAgIGFkZEFyY1BvaW50cyhtX3N1
YnBhdGhzLmxhc3QoKSwgZS5hcmNUbygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj
YXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICBQYXRoUG9pbnQgY29udHJvbFtdID0geworICAgICAgICAgICAgICAg
ICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDApLAor
ICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMSksCisgICAgICAgICAgICAgICAgfTsKKyAg
ICAgICAgICAgICAgICAvLyBGSVhNRTogbWFnaWMgbnVtYmVyPworICAgICAgICAgICAgICAgIHF1
YWRDdXJ2ZSg1MCwgbV9zdWJwYXRocy5sYXN0KCksIGNvbnRyb2wpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0
aEJlemllckN1cnZlVG86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUGF0aFBvaW50
IGNvbnRyb2xbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgbV9jdXJyZW50UG9pbnQsCisgICAg
ICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2lu
dEF0KDEpLAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMiksCisgICAgICAgICAgICAg
ICAgfTsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogbWFnaWMgbnVtYmVyPworICAgICAgICAg
ICAgICAgIGJlemllcigxMDAsIG1fc3VicGF0aHMubGFzdCgpLCBjb250cm9sKTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAg
QVNTRVJUX05PVF9SRUFDSEVEKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICBtX2N1cnJlbnRQb2ludCA9IG1fc3VicGF0aHMubGFzdCgpLmxhc3QoKTsKKyAgICB9Cit9
CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYg
ZSkKK3sKKyAgICBlLmluZmxhdGVSZWN0VG9Db250YWluTWUobV9ib3VuZGluZ1JlY3QsIGxhc3RQ
b2ludCgpKTsKKyAgICBhZGRUb1N1YnBhdGgoZSk7CisgICAgbV9lbGVtZW50cy5hcHBlbmQoZSk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoJiBwKQor
eworICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnRzJiBlID0gcC5lbGVtZW50cygpOworICAg
IGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGl0KGUuYmVnaW4oKSk7
IGl0ICE9IGUuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgYWRkVG9TdWJwYXRoKCppdCk7CisgICAg
ICAgIGl0LT5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0LCBsYXN0UG9pbnQo
KSk7CisgICAgICAgIG1fZWxlbWVudHMuYXBwZW5kKCppdCk7CisgICAgfQorfQorCit2b2lkIFBs
YXRmb3JtUGF0aDo6Y2xlYXIoKQoreworICAgIG1fZWxlbWVudHMuY2xlYXIoKTsKKyAgICBtX2Jv
dW5kaW5nUmVjdCA9IEZsb2F0UmVjdCgpOworICAgIG1fc3VicGF0aHMuY2xlYXIoKTsKKyAgICBt
X2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIG1fcGVuTGlmdGVkID0gdHJ1ZTsKK30KKwordm9p
ZCBQbGF0Zm9ybVBhdGg6OnN0cm9rZVBhdGgoSERDIGRjLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCogdHIpIGNvbnN0Cit7CisgICAgZHJhd1BvbHlnb25zKGRjLCBtX3N1YnBhdGhzLCBmYWxz
ZSwgdHIpOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6ZmlsbFBhdGgoSERDIGRjLCBjb25zdCBU
cmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0Cit7CisgICAgSEdESU9CSiBvbGRQZW4gPSBT
ZWxlY3RPYmplY3QoZGMsIEdldFN0b2NrT2JqZWN0KE5VTExfUEVOKSk7CisgICAgZHJhd1BvbHln
b25zKGRjLCBtX3N1YnBhdGhzLCB0cnVlLCB0cik7CisgICAgU2VsZWN0T2JqZWN0KGRjLCBvbGRQ
ZW4pOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6dHJhbnNsYXRlKGNvbnN0IEZsb2F0U2l6ZSYg
c2l6ZSkKK3sKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjppdGVyYXRvciBpdChtX2Vs
ZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0KQorICAgICAgICBp
dC0+bW92ZShzaXplKTsKKworICAgIG1fYm91bmRpbmdSZWN0Lm1vdmUoc2l6ZSk7CisgICAgZm9y
IChWZWN0b3I8UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0aHMuYmVnaW4oKTsg
aXQgIT0gbV9zdWJwYXRocy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPm1vdmUoc2l6ZSk7Cit9
CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjp0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgmIHQpCit7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6aXRlcmF0b3IgaXQobV9l
bGVtZW50cy5iZWdpbigpKTsgaXQgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpdCkKKyAgICAgICAg
aXQtPnRyYW5zZm9ybSh0KTsKKworICAgIG1fYm91bmRpbmdSZWN0ID0gdC5tYXBSZWN0KG1fYm91
bmRpbmdSZWN0KTsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9seWdvbj46Oml0ZXJhdG9yIGl0ID0g
bV9zdWJwYXRocy5iZWdpbigpOyBpdCAhPSBtX3N1YnBhdGhzLmVuZCgpOyArK2l0KQorICAgICAg
ICBpdC0+dHJhbnNmb3JtKHQpOworfQorCitib29sIFBsYXRmb3JtUGF0aDo6Y29udGFpbnMoY29u
c3QgRmxvYXRQb2ludCYgcG9pbnQsIFdpbmRSdWxlIHJ1bGUpIGNvbnN0Cit7CisgICAgLy8gb3B0
aW1pemF0aW9uOiBjaGVjayB0aGUgYm91bmRpbmcgcmVjdCBmaXJzdAorICAgIGlmICghY29udGFp
bnNQb2ludChtX2JvdW5kaW5nUmVjdCwgcG9pbnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisK
KyAgICBmb3IgKFZlY3RvcjxQYXRoUG9seWdvbj46OmNvbnN0X2l0ZXJhdG9yIGkgPSBtX3N1YnBh
dGhzLmJlZ2luKCk7IGkgIT0gbV9zdWJwYXRocy5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmIChp
LT5jb250YWlucyhwb2ludCkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjptb3ZlVG8oY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQpCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TW92ZVRvIGRhdGEg
PSB7IHsgcG9pbnQueCgpLCBwb2ludC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQg
cGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZExp
bmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50
OjpMaW5lVG8gZGF0YSA9IHsgeyBwb2ludC54KCksIHBvaW50LnkoKSB9IH07CisgICAgUGxhdGZv
cm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRm
b3JtUGF0aDo6YWRkUXVhZEN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AsIGNvbnN0IEZsb2F0
UG9pbnQmIHApCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6UXVhZEN1cnZlVG8gZGF0YSA9
IHsgeyBjcC54KCksIGNwLnkoKSB9LCB7IHAueCgpLCBwLnkoKSB9IH07CisgICAgUGxhdGZvcm1Q
YXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lkIFBsYXRmb3Jt
UGF0aDo6YWRkQmV6aWVyQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjcDEsIGNvbnN0IEZsb2F0
UG9pbnQmIGNwMiwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVt
ZW50OjpCZXppZXJDdXJ2ZVRvIGRhdGEgPSB7IHsgY3AxLngoKSwgY3AxLnkoKSB9LCB7IGNwMi54
KCksIGNwMi55KCkgfSwgeyBwLngoKSwgcC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1l
bnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFk
ZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmIGZwMSwgY29uc3QgRmxvYXRQb2ludCYgZnAyLCBmbG9h
dCByYWRpdXMpCit7CisgICAgY29uc3QgUGF0aFBvaW50JiBwMCA9IG1fY3VycmVudFBvaW50Owor
ICAgIFBhdGhQb2ludCBwMTsKKyAgICBwMSA9IGZwMTsKKyAgICBQYXRoUG9pbnQgcDI7CisgICAg
cDIgPSBmcDI7CisgICAgaWYgKCFyYWRpdXMgfHwgcDAgPT0gcDEgfHwgcDEgPT0gcDIpIHsKKyAg
ICAgICAgYWRkTGluZVRvKHAxKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFBhdGhW
ZWN0b3IgdjAxID0gcDAgLSBwMTsKKyAgICBQYXRoVmVjdG9yIHYyMSA9IHAyIC0gcDE7CisKKyAg
ICAvLyBzaW4oQSAtIEIpID0gc2luKEEpICogY29zKEIpIC0gc2luKEIpICogY29zKEEpCisgICAg
ZG91YmxlIGNyb3NzID0gdjAxLm1feCAqIHYyMS5tX3kgLSB2MDEubV95ICogdjIxLm1feDsKKwor
ICAgIGlmIChmYWJzKGNyb3NzKSA8IDFFLTEwKSB7CisgICAgICAgIC8vIG9uIG9uZSBsaW5lCisg
ICAgICAgIGFkZExpbmVUbyhwMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkb3Vi
bGUgZDAxID0gdjAxLmxlbmd0aCgpOworICAgIGRvdWJsZSBkMjEgPSB2MjEubGVuZ3RoKCk7Cisg
ICAgZG91YmxlIGFuZ2xlID0gKFBJIC0gYWJzKGFzaW4oY3Jvc3MgLyAoZDAxICogZDIxKSkpKSAq
IDAuNTsKKyAgICBkb3VibGUgc3BhbiA9IHJhZGl1cyAqIHRhbihhbmdsZSk7CisgICAgZG91Ymxl
IHJhdGUgPSBzcGFuIC8gZDAxOworICAgIFBhdGhQb2ludCBzdGFydFBvaW50OworICAgIHN0YXJ0
UG9pbnQubV94ID0gcDEubV94ICsgdjAxLm1feCAqIHJhdGU7CisgICAgc3RhcnRQb2ludC5tX3kg
PSBwMS5tX3kgKyB2MDEubV95ICogcmF0ZTsKKworICAgIGFkZExpbmVUbyhzdGFydFBvaW50KTsK
KworICAgIFBhdGhQb2ludCBlbmRQb2ludDsKKyAgICByYXRlID0gc3BhbiAvIGQyMTsKKyAgICBl
bmRQb2ludC5tX3ggPSBwMS5tX3ggKyB2MjEubV94ICogcmF0ZTsKKyAgICBlbmRQb2ludC5tX3kg
PSBwMS5tX3kgKyB2MjEubV95ICogcmF0ZTsKKworICAgIFBhdGhQb2ludCBtaWRQb2ludDsKKyAg
ICBtaWRQb2ludC5tX3ggPSAoc3RhcnRQb2ludC5tX3ggKyBlbmRQb2ludC5tX3gpICogMC41Owor
ICAgIG1pZFBvaW50Lm1feSA9IChzdGFydFBvaW50Lm1feSArIGVuZFBvaW50Lm1feSkgKiAwLjU7
CisKKyAgICBQYXRoVmVjdG9yIHZtMSA9IG1pZFBvaW50IC0gcDE7CisgICAgZG91YmxlIGRtMSA9
IHZtMS5sZW5ndGgoKTsKKyAgICBkb3VibGUgZCA9IF9oeXBvdChyYWRpdXMsIHNwYW4pOworCisg
ICAgUGF0aFBvaW50IGNlbnRlclBvaW50OworICAgIHJhdGUgPSBkIC8gZG0xOworICAgIGNlbnRl
clBvaW50Lm1feCA9IHAxLm1feCArIHZtMS5tX3ggKiByYXRlOworICAgIGNlbnRlclBvaW50Lm1f
eSA9IHAxLm1feSArIHZtMS5tX3kgKiByYXRlOworCisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6
QXJjVG8gZGF0YSA9IHsKKyAgICAgICAgZW5kUG9pbnQsCisgICAgICAgIGNlbnRlclBvaW50LAor
ICAgICAgICB7IHJhZGl1cywgcmFkaXVzIH0sCisgICAgICAgIGNyb3NzIDwgMAorICAgIH07Cisg
ICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2
b2lkIFBsYXRmb3JtUGF0aDo6Y2xvc2VTdWJwYXRoKCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVt
ZW50IHBlOworICAgIGFwcGVuZChwZSk7Cit9CisKKy8vIGFkZCBhIGNpcmN1bGFyIGFyYyBjZW50
cmVkIGF0IHAgd2l0aCByYWRpdXMgciBmcm9tIHN0YXJ0IGFuZ2xlIHNhciAocmFkaWFucykgdG8g
ZW5kIGFuZ2xlIGVhcgordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRQ
b2ludCYgcCwgZmxvYXQgYSwgZmxvYXQgYiwgZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50
aWNsb2Nrd2lzZSkKK3sKKyAgICBmbG9hdCBzdGFydFgsIHN0YXJ0WSwgZW5kWCwgZW5kWTsKKwor
ICAgIG5vcm1hbGl6ZUFuZ2xlKHNhcik7CisgICAgbm9ybWFsaXplQW5nbGUoZWFyKTsKKworICAg
IGdldEVsbGlwc2VQb2ludEJ5QW5nbGUoc2FyLCBhLCBiLCBzdGFydFgsIHN0YXJ0WSk7CisgICAg
Z2V0RWxsaXBzZVBvaW50QnlBbmdsZShlYXIsIGEsIGIsIGVuZFgsIGVuZFkpOworCisgICAgdHJh
bnNmb3JtQXJjUG9pbnQoc3RhcnRYLCBzdGFydFksIHApOworICAgIHRyYW5zZm9ybUFyY1BvaW50
KGVuZFgsIGVuZFksIHApOworCisgICAgRmxvYXRQb2ludCBzdGFydChzdGFydFgsIHN0YXJ0WSk7
CisgICAgbW92ZVRvKHN0YXJ0KTsKKworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1RvIGRh
dGEgPSB7IHsgZW5kWCwgZW5kWSB9LCB7IHAueCgpLCBwLnkoKSB9LCAgeyBhLCBiIH0sICFhbnRp
Y2xvY2t3aXNlIH07CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBl
bmQocGUpOworfQorCisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRSZWN0KGNvbnN0IEZsb2F0UmVj
dCYgcikKK3sKKyAgICBtb3ZlVG8oci5sb2NhdGlvbigpKTsKKworICAgIGZsb2F0IHJpZ2h0ID0g
ci5yaWdodCgpIC0gMTsKKyAgICBmbG9hdCBib3R0b20gPSByLmJvdHRvbSgpIC0gMTsKKyAgICBh
ZGRMaW5lVG8oRmxvYXRQb2ludChyaWdodCwgci55KCkpKTsKKyAgICBhZGRMaW5lVG8oRmxvYXRQ
b2ludChyaWdodCwgYm90dG9tKSk7CisgICAgYWRkTGluZVRvKEZsb2F0UG9pbnQoci54KCksIGJv
dHRvbSkpOworICAgIGFkZExpbmVUbyhyLmxvY2F0aW9uKCkpOworfQorCit2b2lkIFBsYXRmb3Jt
UGF0aDo6YWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpCit7CisgICAgRmxvYXRTaXplIHJh
ZGl1cyhyLndpZHRoKCkgKiAwLjUsIHIuaGVpZ2h0KCkgKiAwLjUpOworICAgIGFkZEVsbGlwc2Uo
ci5sb2NhdGlvbigpICsgcmFkaXVzLCByYWRpdXMud2lkdGgoKSwgcmFkaXVzLmhlaWdodCgpLCAw
LCAwLCB0cnVlKTsKK30KKworU3RyaW5nIFBsYXRmb3JtUGF0aDo6ZGVidWdTdHJpbmcoKSBjb25z
dAoreworICAgIFN0cmluZyByZXQ7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6Y29u
c3RfaXRlcmF0b3IgaShtX2VsZW1lbnRzLmJlZ2luKCkpOyBpICE9IG1fZWxlbWVudHMuZW5kKCk7
ICsraSkgeworICAgICAgICBzd2l0Y2ggKGktPnBsYXRmb3JtVHlwZSgpKSB7CisgICAgICAgIGNh
c2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aE1vdmVUbzoKKyAgICAgICAgY2FzZSBQbGF0Zm9y
bVBhdGhFbGVtZW50OjpQYXRoTGluZVRvOgorICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9y
bWF0KCJNICVmICVmXG4iLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5tX3kpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0
aEFyY1RvOgorICAgICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJBICVmICVmICVmICVm
ICVmICVmICVjXG4iCisgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fZW5kLm1feCwgaS0+
YXJjVG8oKS5tX2VuZC5tX3kKKyAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9jZW50ZXIu
bV94LCBpLT5hcmNUbygpLm1fY2VudGVyLm1feQorICAgICAgICAgICAgICAgICwgaS0+YXJjVG8o
KS5tX3JhZGl1cy5tX3gsIGktPmFyY1RvKCkubV9yYWRpdXMubV95CisgICAgICAgICAgICAgICAg
LCBpLT5hcmNUbygpLm1fY2xvY2t3aXNlPyAnWScgOiAnTicpOworICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aFF1YWRDdXJ2ZVRvOgorICAg
ICAgICAgICAgcmV0ICs9IFN0cmluZzo6Zm9ybWF0KCJRICVmICVmICVmICVmXG4iCisgICAgICAg
ICAgICAgICAgLCBpLT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5tX3kKKyAgICAgICAg
ICAgICAgICAsIGktPnBvaW50QXQoMSkubV94LCBpLT5wb2ludEF0KDEpLm1feSk7CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQmV6aWVy
Q3VydmVUbzoKKyAgICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiQiAlZiAlZiAlZiAl
ZiAlZiAlZlxuIgorICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgwKS5tX3gsIGktPnBvaW50
QXQoMCkubV95CisgICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDEpLm1feCwgaS0+cG9pbnRB
dCgxKS5tX3kKKyAgICAgICAgICAgICAgICAsIGktPnBvaW50QXQoMikubV94LCBpLT5wb2ludEF0
KDIpLm1feSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAg
ICAgIEFTU0VSVChpLT5wbGF0Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRo
Q2xvc2VTdWJwYXRoKTsKKyAgICAgICAgICAgIHJldCArPSAiU1xuIjsKKyAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBQbGF0
Zm9ybVBhdGg6OmFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rpb24p
IGNvbnN0Cit7CisgICAgUGF0aEVsZW1lbnQgcGVsZW1lbnQ7CisgICAgRmxvYXRQb2ludCBwb2lu
dHNbM107CisgICAgcGVsZW1lbnQucG9pbnRzID0gcG9pbnRzOworCisgICAgZm9yIChQbGF0Zm9y
bVBhdGhFbGVtZW50czo6Y29uc3RfaXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdpbigpKTsgaXQg
IT0gbV9lbGVtZW50cy5lbmQoKTsgKytpdCkgeworICAgICAgICBwZWxlbWVudC50eXBlID0gaXQt
PnR5cGUoKTsKKyAgICAgICAgaW50IG4gPSBpdC0+bnVtUG9pbnRzKCk7CisgICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgICAgICAgcG9pbnRzW2ldID0gaXQtPnBvaW50
QXQoaSk7CisgICAgICAgIGZ1bmN0aW9uKGluZm8sICZwZWxlbWVudCk7CisgICAgfQorfQorCisK
K30gLy8gbmFtZXNwYWNlIFdlYmNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3Jh
cGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhp
Y3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi5mY2EwMGE3Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICog
IENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aWZuZGVmIFBsYXRmb3JtUGF0aFdpbmNlX2gKKyNkZWZpbmUgUGxhdGZvcm1QYXRoV2luY2VfaAor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBHcmFwaGljc0NvbnRleHQ7CisKKyAg
ICBzdHJ1Y3QgUGF0aFBvaW50IHsKKyAgICAgICAgZmxvYXQgbV94OworICAgICAgICBmbG9hdCBt
X3k7CisgICAgICAgIGNvbnN0IGZsb2F0JiB4KCkgY29uc3QgeyByZXR1cm4gbV94OyB9CisgICAg
ICAgIGNvbnN0IGZsb2F0JiB5KCkgY29uc3QgeyByZXR1cm4gbV95OyB9CisgICAgICAgIHZvaWQg
c2V0KGZsb2F0IHgsIGZsb2F0IHkpCisgICAgICAgIHsKKyAgICAgICAgICAgIG1feCA9IHg7Cisg
ICAgICAgICAgICBtX3kgPSB5OworICAgICAgICB9OworICAgICAgICBvcGVyYXRvciBGbG9hdFBv
aW50KCkgY29uc3QgeyByZXR1cm4gRmxvYXRQb2ludChtX3gsIG1feSk7IH0KKyAgICAgICAgdm9p
ZCBtb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KQorICAgICAgICB7CisgICAgICAgICAgICBt
X3ggKz0gb2Zmc2V0LndpZHRoKCk7CisgICAgICAgICAgICBtX3kgKz0gb2Zmc2V0LmhlaWdodCgp
OworICAgICAgICB9CisgICAgICAgIFBhdGhQb2ludCYgb3BlcmF0b3I9KGNvbnN0IEZsb2F0UG9p
bnQmIHApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1feCA9IHAueCgpOworICAgICAgICAgICAg
bV95ID0gcC55KCk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAg
ICAgdm9pZCBjbGVhcigpIHsgbV94ID0gbV95ID0gMDsgfQorICAgIH07CisKKyAgICBzdHJ1Y3Qg
UGF0aFBvbHlnb246IHB1YmxpYyBWZWN0b3I8UGF0aFBvaW50PiB7CisgICAgICAgIHZvaWQgbW92
ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCk7CisgICAgICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0
IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCBG
bG9hdFBvaW50JiBwb2ludCkgY29uc3Q7CisgICAgfTsKKworICAgIGNsYXNzIFBsYXRmb3JtUGF0
aEVsZW1lbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSBQbGFmb3JtUGF0aEVsZW1lbnRU
eXBlIHsKKyAgICAgICAgICAgIFBhdGhNb3ZlVG8sCisgICAgICAgICAgICBQYXRoTGluZVRvLAor
ICAgICAgICAgICAgUGF0aEFyY1RvLAorICAgICAgICAgICAgUGF0aFF1YWRDdXJ2ZVRvLAorICAg
ICAgICAgICAgUGF0aEJlemllckN1cnZlVG8sCisgICAgICAgICAgICBQYXRoQ2xvc2VTdWJwYXRo
LAorICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBNb3ZlVG8geworICAgICAgICAgICAgUGF0
aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBMaW5lVG8geworICAg
ICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBB
cmNUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9lbmQ7CisgICAgICAgICAgICBQYXRoUG9p
bnQgbV9jZW50ZXI7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9yYWRpdXM7CisgICAgICAgICAg
ICBib29sIG1fY2xvY2t3aXNlOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBRdWFkQ3Vy
dmVUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDA7CisgICAgICAgICAgICBQYXRo
UG9pbnQgbV9wb2ludDE7CisgICAgICAgIH07CisKKyAgICAgICAgc3RydWN0IEJlemllckN1cnZl
VG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQwOworICAgICAgICAgICAgUGF0aFBv
aW50IG1fcG9pbnQxOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQyOworICAgICAgICB9
OworCisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoKTogbV90eXBlKFBhdGhDbG9zZVN1YnBh
dGgpIHsgbV9kYXRhLm1fcG9pbnRzWzBdLnNldCgwLCAwKTsgICAgfQorICAgICAgICBQbGF0Zm9y
bVBhdGhFbGVtZW50KGNvbnN0IE1vdmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoTW92ZVRvKSB7IG1f
ZGF0YS5tX21vdmVUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQo
Y29uc3QgTGluZVRvJiBkYXRhKTogbV90eXBlKFBhdGhMaW5lVG8pIHsgbV9kYXRhLm1fbGluZVRv
RGF0YSA9IGRhdGE7IH0KKyAgICAgICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBBcmNUbyYg
ZGF0YSk6IG1fdHlwZShQYXRoQXJjVG8pIHsgbV9kYXRhLm1fYXJjVG9EYXRhID0gZGF0YTsgfQor
ICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IFF1YWRDdXJ2ZVRvJiBkYXRhKTogbV90
eXBlKFBhdGhRdWFkQ3VydmVUbykgeyBtX2RhdGEubV9xdWFkQ3VydmVUb0RhdGEgPSBkYXRhOyB9
CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgQmV6aWVyQ3VydmVUbyYgZGF0YSk6
IG1fdHlwZShQYXRoQmV6aWVyQ3VydmVUbykgeyBtX2RhdGEubV9iZXppZXJDdXJ2ZVRvRGF0YSA9
IGRhdGE7IH0KKworICAgICAgICBjb25zdCBNb3ZlVG8mIG1vdmVUbygpIGNvbnN0IHsgcmV0dXJu
IG1fZGF0YS5tX21vdmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgTGluZVRvJiBsaW5lVG8oKSBj
b25zdCB7IHJldHVybiBtX2RhdGEubV9saW5lVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IEFyY1Rv
JiBhcmNUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2FyY1RvRGF0YTsgfQorICAgICAgICBj
b25zdCBRdWFkQ3VydmVUbyYgcXVhZEN1cnZlVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9x
dWFkQ3VydmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3QgQmV6aWVyQ3VydmVUbyYgYmV6aWVyQ3Vy
dmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2JlemllckN1cnZlVG9EYXRhOyB9CisgICAg
ICAgIGNvbnN0IFBhdGhQb2ludCYgbGFzdFBvaW50KCkgY29uc3QKKyAgICAgICAgeworICAgICAg
ICAgICAgaW50IG4gPSBudW1Qb2ludHMoKTsKKyAgICAgICAgICAgIHJldHVybiBuID4gMSA/IG1f
ZGF0YS5tX3BvaW50c1tuIC0gMV0gOiBtX2RhdGEubV9wb2ludHNbMF07CisgICAgICAgIH0KKyAg
ICAgICAgY29uc3QgUGF0aFBvaW50JiBwb2ludEF0KGludCBpbmRleCkgY29uc3QgeyByZXR1cm4g
bV9kYXRhLm1fcG9pbnRzW2luZGV4XTsgfQorICAgICAgICBpbnQgbnVtUG9pbnRzKCkgY29uc3Q7
CisgICAgICAgIGludCBudW1Db250cm9sUG9pbnRzKCkgY29uc3Q7CisgICAgICAgIHZvaWQgbW92
ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCk7CisgICAgICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0
IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICAgICAgUGF0aEVsZW1lbnRUeXBlIHR5cGUo
KSBjb25zdDsKKyAgICAgICAgUGxhZm9ybVBhdGhFbGVtZW50VHlwZSBwbGF0Zm9ybVR5cGUoKSBj
b25zdCB7IHJldHVybiBtX3R5cGU7IH0KKyAgICAgICAgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFp
bk1lKEZsb2F0UmVjdCYgciwgY29uc3QgRmxvYXRQb2ludCYgbGFzdFBvaW50KSBjb25zdDsKKwor
ICAgIHByaXZhdGU6CisgICAgICAgIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgbV90eXBlOworICAg
ICAgICB1bmlvbiB7CisgICAgICAgICAgICBNb3ZlVG8gbV9tb3ZlVG9EYXRhOworICAgICAgICAg
ICAgTGluZVRvIG1fbGluZVRvRGF0YTsKKyAgICAgICAgICAgIEFyY1RvIG1fYXJjVG9EYXRhOwor
ICAgICAgICAgICAgUXVhZEN1cnZlVG8gbV9xdWFkQ3VydmVUb0RhdGE7CisgICAgICAgICAgICBC
ZXppZXJDdXJ2ZVRvIG1fYmV6aWVyQ3VydmVUb0RhdGE7CisgICAgICAgICAgICBQYXRoUG9pbnQg
bV9wb2ludHNbNF07CisgICAgICAgIH0gbV9kYXRhOworICAgIH07CisKKyAgICB0eXBlZGVmIFZl
Y3RvcjxQbGF0Zm9ybVBhdGhFbGVtZW50PiBQbGF0Zm9ybVBhdGhFbGVtZW50czsKKworICAgIGNs
YXNzIFBsYXRmb3JtUGF0aCB7CisgICAgcHVibGljOgorICAgICAgICBQbGF0Zm9ybVBhdGgoKTsK
KyAgICAgICAgY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudHMmIGVsZW1lbnRzKCkgY29uc3QgeyBy
ZXR1cm4gbV9lbGVtZW50czsgfQorICAgICAgICB2b2lkIGFwcGVuZChjb25zdCBQbGF0Zm9ybVBh
dGhFbGVtZW50JiBlKTsKKyAgICAgICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoJiBw
KTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7
IHJldHVybiBtX2VsZW1lbnRzLmlzRW1wdHkoKTsgfQorCisgICAgICAgIHZvaWQgc3Ryb2tlUGF0
aChIREMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4KiB0cikgY29uc3Q7CisgICAgICAgIHZv
aWQgZmlsbFBhdGgoSERDLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0Owor
ICAgICAgICBGbG9hdFBvaW50IGxhc3RQb2ludCgpIGNvbnN0IHsgcmV0dXJuIG1fZWxlbWVudHMu
aXNFbXB0eSgpID8gRmxvYXRQb2ludCgwLCAwKSA6IG1fZWxlbWVudHMubGFzdCgpLmxhc3RQb2lu
dCgpOyB9CisKKyAgICAgICAgY29uc3QgRmxvYXRSZWN0JiBib3VuZGluZ1JlY3QoKSBjb25zdCB7
IHJldHVybiBtX2JvdW5kaW5nUmVjdDsgfQorICAgICAgICBib29sIGNvbnRhaW5zKGNvbnN0IEZs
b2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdDsKKyAgICAgICAgdm9pZCB0cmFu
c2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKTsKKyAgICAgICAgdm9pZCB0cmFuc2Zvcm0oY29u
c3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpOworCisgICAgICAgIHZvaWQgbW92ZVRvKGNvbnN0
IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRMaW5lVG8oY29uc3QgRmxvYXRQb2ludCYp
OworICAgICAgICB2b2lkIGFkZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQ
b2ludCwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpOworICAgICAgICB2b2lkIGFkZEJlemllckN1
cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBvaW50MSwgY29uc3QgRmxvYXRQb2ludCYg
Y29udHJvbFBvaW50MiwgY29uc3QgRmxvYXRQb2ludCYpOworICAgICAgICB2b2lkIGFkZEFyY1Rv
KGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBvaW50JiwgZmxvYXQgcmFkaXVzKTsKKyAg
ICAgICAgdm9pZCBjbG9zZVN1YnBhdGgoKTsKKyAgICAgICAgdm9pZCBhZGRFbGxpcHNlKGNvbnN0
IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBi
b29sIGFudGljbG9ja3dpc2UpOworICAgICAgICB2b2lkIGFkZFJlY3QoY29uc3QgRmxvYXRSZWN0
JiByKTsKKyAgICAgICAgdm9pZCBhZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVjdCYgcik7CisgICAg
ICAgIFN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0OworICAgICAgICB2b2lkIGFwcGx5KHZvaWQq
IGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rpb24pIGNvbnN0OworCisgICAgcHJpdmF0
ZToKKyAgICAgICAgdm9pZCBlbnN1cmVTdWJwYXRoKCk7CisgICAgICAgIHZvaWQgYWRkVG9TdWJw
YXRoKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUpOworCisgICAgICAgIFBsYXRmb3JtUGF0
aEVsZW1lbnRzIG1fZWxlbWVudHM7CisgICAgICAgIEZsb2F0UmVjdCBtX2JvdW5kaW5nUmVjdDsK
KyAgICAgICAgVmVjdG9yPFBhdGhQb2x5Z29uPiBtX3N1YnBhdGhzOworICAgICAgICBQYXRoUG9p
bnQgbV9jdXJyZW50UG9pbnQ7CisgICAgICAgIGJvb2wgbV9wZW5MaWZ0ZWQ7CisgICAgfTsKKwor
fQorCisjZW5kaWYgLy8gUGxhdGZvcm1QYXRoV2luY2VfaAo=
</data>
<flag name="review"
          id="18753"
          type_id="1"
          status="-"
          setter="manyoso"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34662</attachid>
            <date>2009-08-12 08:44:24 -0700</date>
            <delta_ts>2009-08-12 09:19:31 -0700</delta_ts>
            <desc>refactored</desc>
            <filename>28188.patch</filename>
            <type>text/plain</type>
            <size>38837</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MGY3NmU4Yy4uM2Q4NGIxNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNyBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEltcGxlbWVudCBQYXRoIGZvciBXSU5DRS4gTW9z
dCBjb2RlIGNhbiBiZSAKKyAgICAgICAgcmV1c2VkIGZvciBvdGhlciBwb3J0cyB0aGF0IGRvbid0
IGhhdmUgbmF0aXZlIHBhdGggc3VwcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjgxODgKKworICAgICAgICBXcml0dGVuIGFsc28gYnkgR2Vvcmdl
IFN0YWlrb3MgKGluY2x1ZGluZyBxdWFkQ3VydmUoKSBhbmQgYmV6aWVyKCkpCisKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmg6IEFk
ZGVkLgorCiAyMDA5LTA4LTA4ICBMeW9uIENoZW4gIDxseW9uLmNoZW5AdG9yY2htb2JpbGUuY29t
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjc1ODljY2IKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL1BhdGhXaW5jZS5jcHAKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiAg
Q29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRlICJGbG9hdFJl
Y3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0
aFdpbmNlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUcmFuc2Zv
cm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitQYXRoOjpQYXRoKCkKKyAgICA6IG1fcGF0aChuZXcgUGxhdGZvcm1QYXRoKCkp
Cit7Cit9CisKK1BhdGg6OlBhdGgoY29uc3QgUGF0aCYgb3RoZXIpCisgICAgOiBtX3BhdGgobmV3
IFBsYXRmb3JtUGF0aCgqb3RoZXIubV9wYXRoKSkKK3sKK30KKworUGF0aDo6flBhdGgoKQorewor
ICAgIGRlbGV0ZSBtX3BhdGg7Cit9CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9yPShjb25zdCBQYXRo
JiBvdGhlcikKK3sKKyAgICBpZiAoJm90aGVyICE9IHRoaXMpIHsKKyAgICAgICAgZGVsZXRlIG1f
cGF0aDsKKyAgICAgICAgbV9wYXRoID0gbmV3IFBsYXRmb3JtUGF0aCgqb3RoZXIubV9wYXRoKTsK
KyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIHJldHVybiBt
X3BhdGgtPmNvbnRhaW5zKHBvaW50LCBydWxlKTsKK30KKwordm9pZCBQYXRoOjp0cmFuc2xhdGUo
Y29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIG1fcGF0aC0+dHJhbnNsYXRlKHNpemUpOwor
fQorCitGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9wYXRoLT5ib3VuZGluZ1JlY3QoKTsKK30KKwordm9pZCBQYXRoOjptb3ZlVG8oY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9wYXRoLT5tb3ZlVG8ocG9pbnQpOworfQorCit2b2lk
IFBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBtX3BhdGgt
PmFkZExpbmVUbyhwb2ludCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUXVhZEN1cnZlVG8oY29uc3Qg
RmxvYXRQb2ludCYgY3AsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5hZGRR
dWFkQ3VydmVUbyhjcCwgcCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQmV6aWVyQ3VydmVUbyhjb25z
dCBGbG9hdFBvaW50JiBjcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwgY29uc3QgRmxvYXRQb2lu
dCYgcCkKK3sKKyAgICBtX3BhdGgtPmFkZEJlemllckN1cnZlVG8oY3AxLCBjcDIsIHApOworfQor
Cit2b2lkIFBhdGg6OmFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBjb25zdCBGbG9hdFBv
aW50JiBwMiwgZmxvYXQgcmFkaXVzKQoreworICAgIG1fcGF0aC0+YWRkQXJjVG8ocDEsIHAyLCBy
YWRpdXMpOworfQorCit2b2lkIFBhdGg6OmNsb3NlU3VicGF0aCgpCit7CisgICAgbV9wYXRoLT5j
bG9zZVN1YnBhdGgoKTsKK30KKwordm9pZCBQYXRoOjphZGRBcmMoY29uc3QgRmxvYXRQb2ludCYg
cCwgZmxvYXQgciwgZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNsb2Nrd2lzZSkKK3sK
KyAgICBtX3BhdGgtPmFkZEVsbGlwc2UocCwgciwgciwgc2FyLCBlYXIsIGFudGljbG9ja3dpc2Up
OworfQorCit2b2lkIFBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIG1f
cGF0aC0+YWRkUmVjdChyKTsKK30KKwordm9pZCBQYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0
UmVjdCYgcikKK3sKKyAgICBtX3BhdGgtPmFkZEVsbGlwc2Uocik7Cit9CisKK3ZvaWQgUGF0aDo6
Y2xlYXIoKQoreworICAgIG1fcGF0aC0+Y2xlYXIoKTsKK30KKworYm9vbCBQYXRoOjppc0VtcHR5
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRoLT5pc0VtcHR5KCk7Cit9CisKK1N0cmluZyBQ
YXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+ZGVidWdTdHJp
bmcoKTsKK30KKwordm9pZCBQYXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0
aW9uIGZ1bmN0aW9uKSBjb25zdAoreworICAgIG1fcGF0aC0+YXBwbHkoaW5mbywgZnVuY3Rpb24p
OworfQorCit2b2lkIFBhdGg6OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
dCkKK3sKKyAgICBtX3BhdGgtPnRyYW5zZm9ybSh0KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0
cm9rZUJvdW5kaW5nUmVjdChTdHJva2VTdHlsZUFwcGxpZXIgKikKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIHJldHVybiBGbG9hdFJlY3QoKTsKK30KKworYm9vbCBQYXRoOjpzdHJva2VD
b250YWlucyhTdHJva2VTdHlsZUFwcGxpZXIqLCBjb25zdCBGbG9hdFBvaW50JikgY29uc3QKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQYXRo
OjpoYXNDdXJyZW50UG9pbnQoKSBjb25zdAoreworICAgIC8vIE5vdCBzdXJlIGlmIHRoaXMgaXMg
Y29ycmVjdC4gQXQgdGhlIG1lYW50aW1lLCB3ZSBkbyB3aGF0IG90aGVyIHBvcnRzCisgICAgLy8g
ZG8uCisgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NzI2NiwKKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjcx
ODcsIGFuZCAKKyAgICAvLyBodHRwOi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC80NTg3Mwor
ICAgIHJldHVybiAhaXNFbXB0eSgpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLmJhMTg4Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcApAQCAtMCwwICsxLDgw
NiBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4K
KyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBV
U0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdp
bmNlLmgiCisKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNp
bmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgIldpbmNlR3JhcGhpY3NF
eHRyYXMuaCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9Pd25Q
dHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBJbXBsZW1lbnRlZCBpbiBHcmFwaGljc0NvbnRleHRXaW5jZS5jcHAKK3ZvaWQgZ2V0RWxsaXBz
ZVBvaW50QnlBbmdsZShkb3VibGUgYW5nbGUsIGRvdWJsZSBhLCBkb3VibGUgYiwgZmxvYXQmIHgs
IGZsb2F0JiB5KTsKKworc3RhdGljIHZvaWQgcXVhZEN1cnZlKGludCBzZWdtZW50cywgVmVjdG9y
PFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50KiBjb250cm9sKQoreworICAgIGNvbnN0
IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAgICByZWdpc3RlciBmbG9hdCB0QSA9IDAu
MDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsKKworICAgIGZsb2F0IGMxeCA9IGNvbnRy
b2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRyb2xbMF0ueSgpOworICAgIGZsb2F0IGMy
eCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMyeSA9IGNvbnRyb2xbMV0ueSgpOworICAg
IGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAgIGZsb2F0IGMzeSA9IGNvbnRyb2xbMl0u
eSgpOworCisgICAgY29uc3QgaW50IG9mZnNldCA9IHB0cy5zaXplKCk7CisgICAgcHRzLnJlc2l6
ZShvZmZzZXQgKyBzZWdtZW50cyk7CisgICAgUGF0aFBvaW50IHBwOworICAgIHBwLm1feCA9IGMx
eDsKKyAgICBwcC5tX3kgPSBjMXk7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZ21lbnRz
OyArK2kpIHsKKyAgICAgICAgdEEgKz0gc3RlcDsKKyAgICAgICAgdEIgLT0gc3RlcDsKKworICAg
ICAgICBjb25zdCBmbG9hdCBhID0gdEIgKiB0QjsKKyAgICAgICAgY29uc3QgZmxvYXQgYiA9IDIu
MCAqIHRBICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGMgPSB0QSAqIHRBOworCisgICAgICAg
IHBwLm1feCA9IGMxeCAqIGEgKyBjMnggKiBiICsgYzN4ICogYzsKKyAgICAgICAgcHAubV95ID0g
YzF5ICogYSArIGMyeSAqIGIgKyBjM3kgKiBjOworCisgICAgICAgIHB0c1tvZmZzZXQgKyBpIC0g
MV0gPSBwcDsKKyAgICB9CisKKyAgICBwcC5tX3ggPSBjM3g7CisgICAgcHAubV95ID0gYzN5Owor
ICAgIHB0c1tvZmZzZXQgKyBzZWdtZW50cyAtIDFdID0gcHA7Cit9CisKK3N0YXRpYyBpbmxpbmUg
dm9pZCBiZXppZXIoaW50IHNlZ21lbnRzLCBWZWN0b3I8UGF0aFBvaW50PiYgcHRzLCBjb25zdCBQ
YXRoUG9pbnQqIGNvbnRyb2wpCit7CisgICAgY29uc3QgZmxvYXQgc3RlcCA9IDEuMCAvIHNlZ21l
bnRzOworICAgIHJlZ2lzdGVyIGZsb2F0IHRBID0gMC4wOworICAgIHJlZ2lzdGVyIGZsb2F0IHRC
ID0gMS4wOworCisgICAgZmxvYXQgYzF4ID0gY29udHJvbFswXS54KCk7CisgICAgZmxvYXQgYzF5
ID0gY29udHJvbFswXS55KCk7CisgICAgZmxvYXQgYzJ4ID0gY29udHJvbFsxXS54KCk7CisgICAg
ZmxvYXQgYzJ5ID0gY29udHJvbFsxXS55KCk7CisgICAgZmxvYXQgYzN4ID0gY29udHJvbFsyXS54
KCk7CisgICAgZmxvYXQgYzN5ID0gY29udHJvbFsyXS55KCk7CisgICAgZmxvYXQgYzR4ID0gY29u
dHJvbFszXS54KCk7CisgICAgZmxvYXQgYzR5ID0gY29udHJvbFszXS55KCk7CisKKyAgICBjb25z
dCBpbnQgb2Zmc2V0ID0gcHRzLnNpemUoKTsKKyAgICBwdHMucmVzaXplKG9mZnNldCArIHNlZ21l
bnRzKTsKKyAgICBQYXRoUG9pbnQgcHA7CisgICAgcHAubV94ID0gYzF4OworICAgIHBwLm1feSA9
IGMxeTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHM7ICsraSkgeworICAgICAg
ICB0QSArPSBzdGVwOworICAgICAgICB0QiAtPSBzdGVwOworICAgICAgICBjb25zdCBmbG9hdCB0
QXNxID0gdEEgKiB0QTsKKyAgICAgICAgY29uc3QgZmxvYXQgdEJzcSA9IHRCICogdEI7CisKKyAg
ICAgICAgY29uc3QgZmxvYXQgYSA9IHRCc3EgKiB0QjsKKyAgICAgICAgY29uc3QgZmxvYXQgYiA9
IDMuMCAqIHRBICogdEJzcTsKKyAgICAgICAgY29uc3QgZmxvYXQgYyA9IDMuMCAqIHRCICogdEFz
cTsKKyAgICAgICAgY29uc3QgZmxvYXQgZCA9IHRBc3EgKiB0QTsKKworICAgICAgICBwcC5tX3gg
PSBjMXggKiBhICsgYzJ4ICogYiArIGMzeCAqIGMgKyBjNHggKiBkOworICAgICAgICBwcC5tX3kg
PSBjMXkgKiBhICsgYzJ5ICogYiArIGMzeSAqIGMgKyBjNHkgKiBkOworCisgICAgICAgIHB0c1tv
ZmZzZXQgKyBpIC0gMV0gPSBwcDsKKyAgICB9CisKKyAgICBwcC5tX3ggPSBjNHg7CisgICAgcHAu
bV95ID0gYzR5OworICAgIHB0c1tvZmZzZXQgKyBzZWdtZW50cyAtIDFdID0gcHA7Cit9CisKK3N0
YXRpYyBib29sIGNvbnRhaW5zUG9pbnQoY29uc3QgRmxvYXRSZWN0JiByLCBjb25zdCBGbG9hdFBv
aW50JiBwKQoreworICAgIHJldHVybiBwLngoKSA+PSByLngoKSAmJiBwLnkoKSA+PSByLnkoKSAm
JiBwLngoKSA8IHIucmlnaHQoKSAmJiBwLnkoKSA8IHIuYm90dG9tKCk7Cit9CisKK3N0YXRpYyB2
b2lkIG5vcm1hbGl6ZUFuZ2xlKGZsb2F0JiBhbmdsZSkKK3sKKyAgICBhbmdsZSA9IGZhYnMoZm1v
ZChhbmdsZSwgMiAqIHBpRmxvYXQpKTsKKyAgICBpZiAoYW5nbGUgPCAwLjAwMDAxZikKKyAgICAg
ICAgYW5nbGUgPSAwOworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1BcmNQb2ludChmbG9hdCYg
eCwgZmxvYXQmIHksIGNvbnN0IEZsb2F0UG9pbnQmIGMpCit7CisgICAgeCArPSBjLngoKTsKKyAg
ICB5ICs9IGMueSgpOworfQorCitzdGF0aWMgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50
KEZsb2F0UmVjdCYgciwgZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBpZiAoci5pc0VtcHR5KCkp
IHsKKyAgICAgICAgci5zZXRYKHgpOworICAgICAgICByLnNldFkoeSk7CisgICAgICAgIHIuc2V0
U2l6ZShGbG9hdFNpemUoMSwgMSkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh4
IDwgci54KCkpIHsKKyAgICAgICAgci5zZXRXaWR0aChyLnJpZ2h0KCkgLSB4KTsKKyAgICAgICAg
ci5zZXRYKHgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IHcgPSB4IC0gci54KCkgKyAx
OworICAgICAgICBpZiAodyA+IHIud2lkdGgoKSkKKyAgICAgICAgICAgIHIuc2V0V2lkdGgodyk7
CisgICAgfQorICAgIGlmICh5IDwgci55KCkpIHsKKyAgICAgICAgci5zZXRIZWlnaHQoci5ib3R0
b20oKSAtIHkpOworICAgICAgICByLnNldFkoeSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxv
YXQgaCA9ICB5IC0gci55KCkgKyAxOworICAgICAgICBpZiAoaCA+IHIuaGVpZ2h0KCkpCisgICAg
ICAgICAgICByLnNldEhlaWdodChoKTsKKyAgICB9Cit9CisKKy8vIHJldHVybiAwLWJhc2VkIHZh
bHVlOiAwIC0gZmlyc3QgUXVhZHJhbnQgKCAwIC0gOTAgZGVncmVlKQorc3RhdGljIGlubGluZSBp
bnQgcXVhZHJhbnQoY29uc3QgUGF0aFBvaW50JiBwb2ludCwgY29uc3QgUGF0aFBvaW50JiBvcmln
aW4pCit7CisgICAgcmV0dXJuIHBvaW50Lm1feCA8IG9yaWdpbi5tX3ggPworICAgICAgICAocG9p
bnQubV95IDwgb3JpZ2luLm1feSA/IDIgOiAxKQorICAgICAgICA6IChwb2ludC5tX3kgPCBvcmln
aW4ubV95ID8gMyA6IDApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uTGVm
dChpbnQgcSkgeyByZXR1cm4gcSA9PSAxIHx8IHEgPT0gMjsgfQorc3RhdGljIGlubGluZSBib29s
IGlzUXVhZHJhbnRPblJpZ2h0KGludCBxKSB7IHJldHVybiBxID09IDAgfHwgcSA9PSAzOyB9Citz
dGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uVG9wKGludCBxKSB7IHJldHVybiBxID09IDIg
fHwgcSA9PSAzOyB9CitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uQm90dG9tKGludCBx
KSB7IHJldHVybiBxID09IDAgfHwgcSA9PSAxOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5leHRR
dWFkcmFudChpbnQgcSkgeyByZXR1cm4gcSA9PSAzID8gMCA6IHEgKyAxOyB9CitzdGF0aWMgaW5s
aW5lIGludCBxdWFkcmFudERpZmYoaW50IHExLCBpbnQgcTIpCit7CisgICAgaW50IGQgPSBxMSAt
IHEyOworICAgIHdoaWxlIChkIDwgMCkKKyAgICAgICAgZCArPSA0OworICAgIHJldHVybiBkOwor
fQorCitzdHJ1Y3QgUGF0aFZlY3RvciB7CisgICAgZmxvYXQgbV94OworICAgIGZsb2F0IG1feTsK
KworICAgIFBhdGhWZWN0b3IoKSA6IG1feCgwKSwgbV95KDApIHt9CisgICAgUGF0aFZlY3Rvcihm
bG9hdCB4LCBmbG9hdCB5KSA6IG1feCh4KSwgbV95KHkpIHt9CisgICAgZG91YmxlIGFuZ2xlKCkg
Y29uc3QgeyByZXR1cm4gYXRhbjIobV95LCBtX3gpOyB9CisgICAgb3BlcmF0b3IgZG91YmxlICgp
IGNvbnN0IHsgcmV0dXJuIGFuZ2xlKCk7IH0KKyAgICBkb3VibGUgbGVuZ3RoKCkgY29uc3QgeyBy
ZXR1cm4gX2h5cG90KG1feCwgbV95KTsgfQorfTsKKworUGF0aFZlY3RvciBvcGVyYXRvci0oY29u
c3QgUGF0aFBvaW50JiBwMSwgY29uc3QgUGF0aFBvaW50JiBwMikKK3sKKyAgICByZXR1cm4gUGF0
aFZlY3RvcihwMS5tX3ggLSBwMi5tX3gsIHAxLm1feSAtIHAyLm1feSk7Cit9CisKK3N0YXRpYyB2
b2lkIGFkZEFyY1BvaW50KFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQYXRoUG9pbnQmIGNlbnRl
ciwgY29uc3QgUGF0aFBvaW50JiByYWRpdXMsIGRvdWJsZSBhbmdsZSkKK3sKKyAgICBQYXRoUG9p
bnQgcDsKKyAgICBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGFuZ2xlLCByYWRpdXMubV94LCByYWRp
dXMubV95LCBwLm1feCwgcC5tX3kpOworICAgIHRyYW5zZm9ybUFyY1BvaW50KHAubV94LCBwLm1f
eSwgY2VudGVyKTsKKyAgICBpZiAocG9seS5pc0VtcHR5KCkgfHwgcG9seS5sYXN0KCkgIT0gcCkK
KyAgICAgICAgcG9seS5hcHBlbmQocCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEFyY1BvaW50cyhQ
YXRoUG9seWdvbiYgcG9seSwgY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8mIGRhdGEp
Cit7CisgICAgY29uc3QgUGF0aFBvaW50JiBzdGFydFBvaW50ID0gcG9seS5sYXN0KCk7CisgICAg
ZG91YmxlIGN1ckFuZ2xlID0gc3RhcnRQb2ludCAtIGRhdGEubV9jZW50ZXI7CisgICAgZG91Ymxl
IGVuZEFuZ2xlID0gZGF0YS5tX2VuZCAtIGRhdGEubV9jZW50ZXI7CisgICAgZG91YmxlIGFuZ2xl
U3RlcCA9IDIuIC8gc3RkOjptYXgoZGF0YS5tX3JhZGl1cy5tX3gsIGRhdGEubV9yYWRpdXMubV95
KTsKKyAgICBpZiAoZGF0YS5tX2Nsb2Nrd2lzZSkgeworICAgICAgICBpZiAoZW5kQW5nbGUgPD0g
Y3VyQW5nbGUgfHwgc3RhcnRQb2ludCA9PSBkYXRhLm1fZW5kKQorICAgICAgICAgICAgZW5kQW5n
bGUgKz0gMiAqIHBpRG91YmxlOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZ2xlU3RlcCA9IC1h
bmdsZVN0ZXA7CisgICAgICAgIGlmIChlbmRBbmdsZSA+PSBjdXJBbmdsZSB8fCBzdGFydFBvaW50
ID09IGRhdGEubV9lbmQpCisgICAgICAgICAgICBlbmRBbmdsZSAtPSAyICogcGlEb3VibGU7Cisg
ICAgfQorCisgICAgZm9yIChjdXJBbmdsZSArPSBhbmdsZVN0ZXA7IGRhdGEubV9jbG9ja3dpc2Ug
PyBjdXJBbmdsZSA8IGVuZEFuZ2xlIDogY3VyQW5nbGUgPiBlbmRBbmdsZTsgY3VyQW5nbGUgKz0g
YW5nbGVTdGVwKQorICAgICAgICBhZGRBcmNQb2ludChwb2x5LCBkYXRhLm1fY2VudGVyLCBkYXRh
Lm1fcmFkaXVzLCBjdXJBbmdsZSk7CisKKyAgICBpZiAocG9seS5pc0VtcHR5KCkgfHwgcG9seS5s
YXN0KCkgIT0gZGF0YS5tX2VuZCkKKyAgICAgICAgcG9seS5hcHBlbmQoZGF0YS5tX2VuZCk7Cit9
CisKK3N0YXRpYyB2b2lkIGRyYXdQb2x5Z29ucyhIREMgZGMsIGNvbnN0IFZlY3RvcjxQYXRoUG9s
eWdvbj4mIHBvbHlnb25zLCBib29sIGZpbGwsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4KiB0
cmFuc2Zvcm1hdGlvbikKK3sKKyAgICBNZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOwor
ICAgIGZvciAoVmVjdG9yPFBhdGhQb2x5Z29uPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHBvbHlnb25z
LmJlZ2luKCk7IGkgIT0gcG9seWdvbnMuZW5kKCk7ICsraSkgeworICAgICAgICBpbnQgbnBvaW50
cyA9IGktPnNpemUoKTsKKyAgICAgICAgaWYgKCFucG9pbnRzKQorICAgICAgICAgICAgY29udGlu
dWU7CisKKyAgICAgICAgUE9JTlQqIHdpblBvaW50cyA9IDA7CisgICAgICAgIGlmIChmaWxsKSB7
CisgICAgICAgICAgICBpZiAobnBvaW50cyA+IDIpCisgICAgICAgICAgICAgICAgd2luUG9pbnRz
ID0gbmV3IFBPSU5UW25wb2ludHMgKyAxXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB3
aW5Qb2ludHMgPSBuZXcgUE9JTlRbbnBvaW50c107CisKKyAgICAgICAgaWYgKHdpblBvaW50cykg
eworICAgICAgICAgICAgaWYgKHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICAgICAgZm9y
IChpbnQgaTIgPSAwOyBpMiA8IG5wb2ludHM7ICsraTIpIHsKKyAgICAgICAgICAgICAgICAgICAg
RmxvYXRQb2ludCB0clBvaW50ID0gdHJhbnNmb3JtYXRpb24tPm1hcFBvaW50KGktPmF0KGkyKSk7
CisgICAgICAgICAgICAgICAgICAgIHdpblBvaW50c1tpMl0ueCA9IHN0YWJsZVJvdW5kKHRyUG9p
bnQueCgpKTsKKyAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2kyXS55ID0gc3RhYmxlUm91
bmQodHJQb2ludC55KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7
CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAwOyBpMiA8IG5wb2ludHM7ICsraTIpIHsK
KyAgICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2kyXS54ID0gc3RhYmxlUm91bmQoaS0+YXQo
aTIpLngoKSk7CisgICAgICAgICAgICAgICAgICAgIHdpblBvaW50c1tpMl0ueSA9IHN0YWJsZVJv
dW5kKGktPmF0KGkyKS55KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKwor
ICAgICAgICAgICAgaWYgKGZpbGwgJiYgd2luUG9pbnRzW25wb2ludHMgLSAxXSAhPSB3aW5Qb2lu
dHNbMF0pIHsKKyAgICAgICAgICAgICAgICB3aW5Qb2ludHNbbnBvaW50c10ueCA9IHdpblBvaW50
c1swXS54OworICAgICAgICAgICAgICAgIHdpblBvaW50c1tucG9pbnRzXS55ID0gd2luUG9pbnRz
WzBdLnk7CisgICAgICAgICAgICAgICAgKytucG9pbnRzOworICAgICAgICAgICAgfQorCisgICAg
ICAgICAgICBpZiAoZmlsbCkKKyAgICAgICAgICAgICAgICA6OlBvbHlnb24oZGMsIHdpblBvaW50
cywgbnBvaW50cyk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgOjpQb2x5bGlu
ZShkYywgd2luUG9pbnRzLCBucG9pbnRzKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIHdpblBvaW50
czsKKyAgICAgICAgfQorICAgIH0KK30KKworCitpbnQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bnVt
Q29udHJvbFBvaW50cygpIGNvbnN0Cit7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICBjYXNl
IFBhdGhNb3ZlVG86CisgICAgY2FzZSBQYXRoTGluZVRvOgorICAgICAgICByZXR1cm4gMTsKKyAg
ICBjYXNlIFBhdGhRdWFkQ3VydmVUbzoKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgcmV0
dXJuIDI7CisgICAgY2FzZSBQYXRoQmV6aWVyQ3VydmVUbzoKKyAgICAgICAgcmV0dXJuIDM7Cisg
ICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUKG1fdHlwZSA9PSBQYXRoQ2xvc2VTdWJwYXRoKTsK
KyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCitpbnQgUGxhdGZvcm1QYXRoRWxlbWVudDo6
bnVtUG9pbnRzKCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNhc2UgUGF0
aE1vdmVUbzoKKyAgICBjYXNlIFBhdGhMaW5lVG86CisgICAgY2FzZSBQYXRoQXJjVG86CisgICAg
ICAgIHJldHVybiAxOworICAgIGNhc2UgUGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICByZXR1cm4g
MjsKKyAgICBjYXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gMzsKKyAgICBk
ZWZhdWx0OgorICAgICAgICBBU1NFUlQobV90eXBlID09IFBhdGhDbG9zZVN1YnBhdGgpOworICAg
ICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKK3ZvaWQgUGF0aFBvbHlnb246Om1vdmUoY29uc3Qg
RmxvYXRTaXplJiBvZmZzZXQpCit7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6aXRlcmF0
b3IgaSA9IGJlZ2luKCk7IGkgPCBlbmQoKTsgKytpKQorICAgICAgICBpLT5tb3ZlKG9mZnNldCk7
Cit9CisKK3ZvaWQgUGF0aFBvbHlnb246OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCYgdCkKK3sKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+OjppdGVyYXRvciBpID0gYmVn
aW4oKTsgaSA8IGVuZCgpOyArK2kpCisgICAgICAgICppID0gdC5tYXBQb2ludCgqaSk7Cit9CisK
K2Jvb2wgUGF0aFBvbHlnb246OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25z
dAoreworICAgIGlmIChzaXplKCkgPCAzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAv
LyBUZXN0IGludGVyc2VjdGlvbnMgYmV0d2VlbiB0aGUgcG9seWdvbiBhbmQgdGhlIHZlcnRpY2Fs
IGxpbmU6IHggPSBwb2ludC54KCkKKworICAgIGludCBpbnRlcnNlY3RlZCA9IDA7CisgICAgY29u
c3QgUGF0aFBvaW50KiBwb2ludDEgPSAmbGFzdCgpOworICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpj
b25zdF9pdGVyYXRvciBsYXN0ID0gZW5kKCk7CisgICAgLy8gd2FzTmVnYXRpdmU6IC0xIG1lYW5z
IHVua25vd24sIDAgbWVhbnMgZmFsc2UsIDEgbWVhbnMgdHJ1ZS4KKyAgICBpbnQgd2FzTmVnYXRp
dmUgPSAtMTsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBpID0g
YmVnaW4oKTsgaSAhPSBsYXN0OyArK2kpIHsKKyAgICAgICAgY29uc3QgUGF0aFBvaW50JiBwb2lu
dDIgPSAqaTsKKyAgICAgICAgaWYgKHBvaW50MS0+eCgpICE9IHBvaW50LngoKSkgeworICAgICAg
ICAgICAgaWYgKHBvaW50Mi54KCkgPT0gcG9pbnQueCgpKSB7CisgICAgICAgICAgICAgICAgLy8g
V2UgYXJlIGdldHRpbmcgb24gdGhlIHZlcnRpY2FsIGxpbmUKKyAgICAgICAgICAgICAgICB3YXNO
ZWdhdGl2ZSA9IHBvaW50MS0+eCgpIDwgcG9pbnQueCgpID8gMSA6IDA7CisgICAgICAgICAgICB9
IGVsc2UgaWYgKHBvaW50Mi54KCkgPCBwb2ludC54KCkgIT0gcG9pbnQxLT54KCkgPCBwb2ludC54
KCkpIHsKKyAgICAgICAgICAgICAgICBmbG9hdCB5ID0gKHBvaW50Mi55KCkgLSBwb2ludDEtPnko
KSkgLyAocG9pbnQyLngoKSAtIHBvaW50MS0+eCgpKSAqIChwb2ludC54KCkgLSBwb2ludDEtPngo
KSkgKyBwb2ludDEtPnkoKTsKKyAgICAgICAgICAgICAgICBpZiAoeSA+PSBwb2ludC55KCkpCisg
ICAgICAgICAgICAgICAgICAgICsraW50ZXJzZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBhcmUgbGVhdmluZyB0aGUgdmVydGljYWwgbGlu
ZQorCisgICAgICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlCisgICAgICAgICAgICBpZiAo
cG9pbnQxLT55KCkgPT0gcG9pbnQueSgpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwor
CisgICAgICAgICAgICBpZiAocG9pbnQxLT55KCkgPiBwb2ludC55KCkpIHsKKyAgICAgICAgICAg
ICAgICBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
Ly8gc2VlIGlmIHRoZSBwb2ludCBpcyBvbiB0aGlzIHNlZ21lbnQKKyAgICAgICAgICAgICAgICAg
ICAgaWYgKHBvaW50Mi55KCkgPD0gcG9pbnQueSgpKQorICAgICAgICAgICAgICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAg
ICAgLy8gV2UgaGF2ZSB0byBnZXQgYmFjayB0byBzZWUgd2hpY2ggc2lkZSB3ZSBjb21lIGZyb20u
IElmIHdlIGNvbWUgZnJvbQorICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2FtZSBzaWRlIHdl
IGFyZSBsZWF2aW5nLCBubyBpbnRlcnNlY3Rpb24gc2hvdWxkIGJlIGNvdW50ZWQKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKHdhc05lZ2F0aXZlIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgVmVjdG9yPFBhdGhQb2ludD46OmNvbnN0X2l0ZXJhdG9yIGpMYXN0ID0gaTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBqID0gaTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBpZiAoaiA9PSBiZWdpbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0g
bGFzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgIC0tajsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoai0+
eCgpICE9IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAo
ai0+eCgpID4gcG9pbnQueCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
d2FzTmVnYXRpdmUgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IDE7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKGogIT0gakxhc3QpOwor
CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRpdmUgPCAwKQorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgICAgICAgICBpZiAod2FzTmVnYXRpdmUgPyBwb2ludDIueCgpID4gcG9pbnQu
eCgpIDogcG9pbnQyLngoKSA8IHBvaW50LngoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICsr
aW50ZXJzZWN0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChw
b2ludDIueCgpID09IHBvaW50LngoKSAmJiBwb2ludDIueSgpID49IHBvaW50LnkoKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBwb2ludDEgPSAmcG9p
bnQyOworICAgIH0KKworICAgIHJldHVybiBpbnRlcnNlY3RlZCAmIDE7Cit9CisKK3ZvaWQgUGxh
dGZvcm1QYXRoRWxlbWVudDo6bW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKK3sKKyAgICBp
bnQgbiA9IG51bUNvbnRyb2xQb2ludHMoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsr
aSkKKyAgICAgICAgbV9kYXRhLm1fcG9pbnRzW2ldLm1vdmUob2Zmc2V0KTsKK30KKwordm9pZCBQ
bGF0Zm9ybVBhdGhFbGVtZW50Ojp0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgm
IHQpCit7CisgICAgaW50IG4gPSBudW1Db250cm9sUG9pbnRzKCk7CisgICAgZm9yIChpbnQgaSA9
IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgRmxvYXRQb2ludCBwID0gdC5tYXBQb2ludChtX2Rh
dGEubV9wb2ludHNbaV0pOworICAgICAgICBtX2RhdGEubV9wb2ludHNbaV0uc2V0KHAueCgpLCBw
LnkoKSk7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OmluZmxhdGVSZWN0
VG9Db250YWluTWUoRmxvYXRSZWN0JiByLCBjb25zdCBGbG9hdFBvaW50JiBsYXN0UG9pbnQpIGNv
bnN0Cit7CisgICAgaWYgKG1fdHlwZSA9PSBQYXRoQXJjVG8pIHsKKyAgICAgICAgY29uc3QgQXJj
VG8mIGRhdGEgPSBtX2RhdGEubV9hcmNUb0RhdGE7CisgICAgICAgIFBhdGhQb2ludCBzdGFydFBv
aW50OworICAgICAgICBzdGFydFBvaW50ID0gbGFzdFBvaW50OworICAgICAgICBQYXRoUG9pbnQg
ZW5kUG9pbnQgPSBkYXRhLm1fZW5kOworICAgICAgICBpZiAoIWRhdGEubV9jbG9ja3dpc2UpCisg
ICAgICAgICAgICBzdGQ6OnN3YXAoc3RhcnRQb2ludCwgZW5kUG9pbnQpOworCisgICAgICAgIGlu
dCBxMCA9IHF1YWRyYW50KHN0YXJ0UG9pbnQsIGRhdGEubV9jZW50ZXIpOworICAgICAgICBpbnQg
cTEgPSBxdWFkcmFudChlbmRQb2ludCwgZGF0YS5tX2NlbnRlcik7CisgICAgICAgIGJvb2wgY29u
dGFpbnNFeHRyZW1lc1s0XSA9IHsgZmFsc2UgfTsgLy8gYm90dG9tLCBsZWZ0LCB0b3AsIHJpZ2h0
CisgICAgICAgIHN0YXRpYyBjb25zdCBQYXRoUG9pbnQgZXh0cmVtZVZlY3RvcnNbNF0gPSB7IHsg
MCwgMSB9LCB7IC0xLCAwIH0sIHsgMCwgLTEgfSwgeyAxLCAwIH0gfTsKKyAgICAgICAgaWYgKHEw
ID09IHExKSB7CisgICAgICAgICAgICBpZiAoc3RhcnRQb2ludC5tX3ggPT0gZW5kUG9pbnQubV94
IHx8IGlzUXVhZHJhbnRPbkJvdHRvbShxMCkgIT0gc3RhcnRQb2ludC5tX3ggPiBlbmRQb2ludC5t
X3gpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkKKyAgICAg
ICAgICAgICAgICAgICAgY29udGFpbnNFeHRyZW1lc1tpXSA9IHRydWU7CisgICAgICAgICAgICB9
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgZXh0cmVtZSA9IHEwOworICAgICAg
ICAgICAgaW50IGRpZmYgPSBxdWFkcmFudERpZmYocTEsIHEwKTsKKyAgICAgICAgICAgIGZvciAo
aW50IGkgPSAwOyBpIDwgZGlmZjsgKytpKSB7CisgICAgICAgICAgICAgICAgY29udGFpbnNFeHRy
ZW1lc1tleHRyZW1lXSA9IHRydWU7CisgICAgICAgICAgICAgICAgZXh0cmVtZSA9IG5leHRRdWFk
cmFudChleHRyZW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGluZmxh
dGVSZWN0VG9Db250YWluUG9pbnQociwgc3RhcnRQb2ludC5tX3gsIHN0YXJ0UG9pbnQubV95KTsK
KyAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBlbmRQb2ludC5tX3gsIGVuZFBv
aW50Lm1feSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7CisgICAgICAg
ICAgICBpZiAoY29udGFpbnNFeHRyZW1lc1tpXSkKKyAgICAgICAgICAgICAgICBpbmZsYXRlUmVj
dFRvQ29udGFpblBvaW50KHIsIGRhdGEubV9jZW50ZXIubV94ICsgZGF0YS5tX3JhZGl1cy5tX3gg
KiBleHRyZW1lVmVjdG9yc1tpXS5tX3gsIGRhdGEubV9jZW50ZXIubV95ICsgZGF0YS5tX3JhZGl1
cy5tX3kgKiBleHRyZW1lVmVjdG9yc1tpXS5tX3kpOworICAgICAgICB9CisgICAgfSBlbHNlIHsK
KyAgICAgICAgaW50IG4gPSBudW1Qb2ludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkg
PCBuOyArK2kpCisgICAgICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIG1fZGF0
YS5tX3BvaW50c1tpXS5tX3gsIG1fZGF0YS5tX3BvaW50c1tpXS5tX3kpOworICAgIH0KK30KKwor
UGF0aEVsZW1lbnRUeXBlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OnR5cGUoKSBjb25zdAoreworICAg
IHN3aXRjaCAobV90eXBlKSB7CisgICAgY2FzZSBQYXRoTW92ZVRvOgorICAgICAgICByZXR1cm4g
UGF0aEVsZW1lbnRNb3ZlVG9Qb2ludDsKKyAgICBjYXNlIFBhdGhMaW5lVG86CisgICAgICAgIHJl
dHVybiBQYXRoRWxlbWVudEFkZExpbmVUb1BvaW50OworICAgIGNhc2UgUGF0aEFyY1RvOgorICAg
ICAgICAvLyBGSVhNRTogdGhlcmUncyBubyBhcmNUbyB0eXBlIGZvciBQYXRoRWxlbWVudAorICAg
ICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRMaW5lVG9Qb2ludDsKKyAgICAgICAgLy8gcmV0dXJu
IFBhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKKyAgICBjYXNlIFBhdGhRdWFkQ3VydmVU
bzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkUXVhZEN1cnZlVG9Qb2ludDsKKyAgICBj
YXNlIFBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRDdXJ2
ZVRvUG9pbnQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQVNTRVJUKG1fdHlwZSA9PSBQYXRoQ2xv
c2VTdWJwYXRoKTsKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50Q2xvc2VTdWJwYXRoOworICAg
IH0KK30KKworUGxhdGZvcm1QYXRoOjpQbGF0Zm9ybVBhdGgoKQorICAgIDogbV9wZW5MaWZ0ZWQo
dHJ1ZSkKK3sKKyAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworfQorCit2b2lkIFBsYXRmb3Jt
UGF0aDo6ZW5zdXJlU3VicGF0aCgpCit7CisgICAgaWYgKG1fcGVuTGlmdGVkKSB7CisgICAgICAg
IG1fcGVuTGlmdGVkID0gZmFsc2U7CisgICAgICAgIG1fc3VicGF0aHMuYXBwZW5kKFBhdGhQb2x5
Z29uKCkpOworICAgICAgICBtX3N1YnBhdGhzLmxhc3QoKS5hcHBlbmQobV9jdXJyZW50UG9pbnQp
OworICAgIH0gZWxzZQorICAgICAgICBBU1NFUlQoIW1fc3VicGF0aHMuaXNFbXB0eSgpKTsKK30K
Kwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZFRvU3VicGF0aChjb25zdCBQbGF0Zm9ybVBhdGhFbGVt
ZW50JiBlKQoreworICAgIGlmIChlLnBsYXRmb3JtVHlwZSgpID09IFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OlBhdGhNb3ZlVG8pIHsKKyAgICAgICAgbV9wZW5MaWZ0ZWQgPSB0cnVlOworICAgICAgICBt
X2N1cnJlbnRQb2ludCA9IGUucG9pbnRBdCgwKTsKKyAgICB9IGVsc2UgaWYgKGUucGxhdGZvcm1U
eXBlKCkgPT0gUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3NlU3VicGF0aCkgeworICAgICAg
ICBtX3BlbkxpZnRlZCA9IHRydWU7CisgICAgICAgIGlmICghbV9zdWJwYXRocy5pc0VtcHR5KCkp
IHsKKyAgICAgICAgICAgIGlmIChtX2N1cnJlbnRQb2ludCAhPSBtX3N1YnBhdGhzLmxhc3QoKVsw
XSkgeworICAgICAgICAgICAgICAgIC8vIEFjY29yZGluZyB0byBXM0MsIHdlIGhhdmUgdG8gZHJh
dyBhIGxpbmUgZnJvbSBjdXJyZW50IHBvaW50IHRvIHRoZSBpbml0aWFsIHBvaW50CisgICAgICAg
ICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5kKG1fc3VicGF0aHMubGFzdCgpWzBdKTsK
KyAgICAgICAgICAgICAgICBtX2N1cnJlbnRQb2ludCA9IG1fc3VicGF0aHMubGFzdCgpWzBdOwor
ICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG1fY3VycmVudFBvaW50
LmNsZWFyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZW5zdXJlU3VicGF0aCgpOworICAgICAg
ICBzd2l0Y2ggKGUucGxhdGZvcm1UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhF
bGVtZW50OjpQYXRoTGluZVRvOgorICAgICAgICAgICAgbV9zdWJwYXRocy5sYXN0KCkuYXBwZW5k
KGUucG9pbnRBdCgwKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9y
bVBhdGhFbGVtZW50OjpQYXRoQXJjVG86CisgICAgICAgICAgICBhZGRBcmNQb2ludHMobV9zdWJw
YXRocy5sYXN0KCksIGUuYXJjVG8oKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoUXVhZEN1cnZlVG86CisgICAgICAgICAgICB7Cisg
ICAgICAgICAgICAgICAgUGF0aFBvaW50IGNvbnRyb2xbXSA9IHsKKyAgICAgICAgICAgICAgICAg
ICAgbV9jdXJyZW50UG9pbnQsCisgICAgICAgICAgICAgICAgICAgIGUucG9pbnRBdCgwKSwKKyAg
ICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDEpLAorICAgICAgICAgICAgICAgIH07CisgICAg
ICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2ljIG51bWJlcj8KKyAgICAgICAgICAgICAgICBxdWFk
Q3VydmUoNTAsIG1fc3VicGF0aHMubGFzdCgpLCBjb250cm9sKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhC
ZXppZXJDdXJ2ZVRvOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhdGhQb2ludCBj
b250cm9sW10gPSB7CisgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFBvaW50LAorICAgICAg
ICAgICAgICAgICAgICBlLnBvaW50QXQoMCksCisgICAgICAgICAgICAgICAgICAgIGUucG9pbnRB
dCgxKSwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDIpLAorICAgICAgICAgICAgICAg
IH07CisgICAgICAgICAgICAgICAgLy8gRklYTUU6IG1hZ2ljIG51bWJlcj8KKyAgICAgICAgICAg
ICAgICBiZXppZXIoMTAwLCBtX3N1YnBhdGhzLmxhc3QoKSwgY29udHJvbCk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAg
ICAgbV9jdXJyZW50UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKS5sYXN0KCk7CisgICAgfQorfQor
Cit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUp
Cit7CisgICAgZS5pbmZsYXRlUmVjdFRvQ29udGFpbk1lKG1fYm91bmRpbmdSZWN0LCBsYXN0UG9p
bnQoKSk7CisgICAgYWRkVG9TdWJwYXRoKGUpOworICAgIG1fZWxlbWVudHMuYXBwZW5kKGUpOwor
fQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCkKK3sK
KyAgICBjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50cyYgZSA9IHAuZWxlbWVudHMoKTsKKyAgICBm
b3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpdChlLmJlZ2luKCkpOyBp
dCAhPSBlLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGFkZFRvU3VicGF0aCgqaXQpOworICAgICAg
ICBpdC0+aW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShtX2JvdW5kaW5nUmVjdCwgbGFzdFBvaW50KCkp
OworICAgICAgICBtX2VsZW1lbnRzLmFwcGVuZCgqaXQpOworICAgIH0KK30KKwordm9pZCBQbGF0
Zm9ybVBhdGg6OmNsZWFyKCkKK3sKKyAgICBtX2VsZW1lbnRzLmNsZWFyKCk7CisgICAgbV9ib3Vu
ZGluZ1JlY3QgPSBGbG9hdFJlY3QoKTsKKyAgICBtX3N1YnBhdGhzLmNsZWFyKCk7CisgICAgbV9j
dXJyZW50UG9pbnQuY2xlYXIoKTsKKyAgICBtX3BlbkxpZnRlZCA9IHRydWU7Cit9CisKK3ZvaWQg
UGxhdGZvcm1QYXRoOjpzdHJva2VQYXRoKEhEQyBkYywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRy
aXgqIHRyYW5zZm9ybWF0aW9uKSBjb25zdAoreworICAgIGRyYXdQb2x5Z29ucyhkYywgbV9zdWJw
YXRocywgZmFsc2UsIHRyYW5zZm9ybWF0aW9uKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmZp
bGxQYXRoKEhEQyBkYywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyYW5zZm9ybWF0aW9u
KSBjb25zdAoreworICAgIEhHRElPQkogb2xkUGVuID0gU2VsZWN0T2JqZWN0KGRjLCBHZXRTdG9j
a09iamVjdChOVUxMX1BFTikpOworICAgIGRyYXdQb2x5Z29ucyhkYywgbV9zdWJwYXRocywgdHJ1
ZSwgdHJhbnNmb3JtYXRpb24pOworICAgIFNlbGVjdE9iamVjdChkYywgb2xkUGVuKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVBhdGg6OnRyYW5zbGF0ZShjb25zdCBGbG9hdFNpemUmIHNpemUpCit7Cisg
ICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6aXRlcmF0b3IgaXQobV9lbGVtZW50cy5iZWdp
bigpKTsgaXQgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPm1vdmUoc2l6
ZSk7CisKKyAgICBtX2JvdW5kaW5nUmVjdC5tb3ZlKHNpemUpOworICAgIGZvciAoVmVjdG9yPFBh
dGhQb2x5Z29uPjo6aXRlcmF0b3IgaXQgPSBtX3N1YnBhdGhzLmJlZ2luKCk7IGl0ICE9IG1fc3Vi
cGF0aHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT5tb3ZlKHNpemUpOworfQorCit2b2lkIFBs
YXRmb3JtUGF0aDo6dHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQorewor
ICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVn
aW4oKSk7IGl0ICE9IG1fZWxlbWVudHMuZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT50cmFuc2Zv
cm0odCk7CisKKyAgICBtX2JvdW5kaW5nUmVjdCA9IHQubWFwUmVjdChtX2JvdW5kaW5nUmVjdCk7
CisgICAgZm9yIChWZWN0b3I8UGF0aFBvbHlnb24+OjppdGVyYXRvciBpdCA9IG1fc3VicGF0aHMu
YmVnaW4oKTsgaXQgIT0gbV9zdWJwYXRocy5lbmQoKTsgKytpdCkKKyAgICAgICAgaXQtPnRyYW5z
Zm9ybSh0KTsKK30KKworYm9vbCBQbGF0Zm9ybVBhdGg6OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9p
bnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIC8vIG9wdGltaXphdGlvbjog
Y2hlY2sgdGhlIGJvdW5kaW5nIHJlY3QgZmlyc3QKKyAgICBpZiAoIWNvbnRhaW5zUG9pbnQobV9i
b3VuZGluZ1JlY3QsIHBvaW50KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChW
ZWN0b3I8UGF0aFBvbHlnb24+Ojpjb25zdF9pdGVyYXRvciBpID0gbV9zdWJwYXRocy5iZWdpbigp
OyBpICE9IG1fc3VicGF0aHMuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoaS0+Y29udGFpbnMo
cG9pbnQpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZh
bHNlOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6bW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBv
aW50KQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6Ok1vdmVUbyBkYXRhID0geyB7IHBvaW50
LngoKSwgcG9pbnQueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOwor
ICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRMaW5lVG8oY29uc3Qg
RmxvYXRQb2ludCYgcG9pbnQpCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6TGluZVRvIGRh
dGEgPSB7IHsgcG9pbnQueCgpLCBwb2ludC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1l
bnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFk
ZFF1YWRDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9pbnQmIGNwLCBjb25zdCBGbG9hdFBvaW50JiBwKQor
eworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlF1YWRDdXJ2ZVRvIGRhdGEgPSB7IHsgY3AueCgp
LCBjcC55KCkgfSwgeyBwLngoKSwgcC55KCkgfSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQg
cGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFkZEJl
emllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY3AxLCBjb25zdCBGbG9hdFBvaW50JiBjcDIs
IGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudDo6QmV6aWVy
Q3VydmVUbyBkYXRhID0geyB7IGNwMS54KCksIGNwMS55KCkgfSwgeyBjcDIueCgpLCBjcDIueSgp
IH0sIHsgcC54KCksIHAueSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEp
OworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRBcmNUbyhjb25z
dCBGbG9hdFBvaW50JiBmcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGZwMiwgZmxvYXQgcmFkaXVzKQor
eworICAgIGNvbnN0IFBhdGhQb2ludCYgcDAgPSBtX2N1cnJlbnRQb2ludDsKKyAgICBQYXRoUG9p
bnQgcDE7CisgICAgcDEgPSBmcDE7CisgICAgUGF0aFBvaW50IHAyOworICAgIHAyID0gZnAyOwor
ICAgIGlmICghcmFkaXVzIHx8IHAwID09IHAxIHx8IHAxID09IHAyKSB7CisgICAgICAgIGFkZExp
bmVUbyhwMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQYXRoVmVjdG9yIHYwMSA9
IHAwIC0gcDE7CisgICAgUGF0aFZlY3RvciB2MjEgPSBwMiAtIHAxOworCisgICAgLy8gc2luKEEg
LSBCKSA9IHNpbihBKSAqIGNvcyhCKSAtIHNpbihCKSAqIGNvcyhBKQorICAgIGRvdWJsZSBjcm9z
cyA9IHYwMS5tX3ggKiB2MjEubV95IC0gdjAxLm1feSAqIHYyMS5tX3g7CisKKyAgICBpZiAoZmFi
cyhjcm9zcykgPCAxRS0xMCkgeworICAgICAgICAvLyBvbiBvbmUgbGluZQorICAgICAgICBhZGRM
aW5lVG8ocDEpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZG91YmxlIGQwMSA9IHYw
MS5sZW5ndGgoKTsKKyAgICBkb3VibGUgZDIxID0gdjIxLmxlbmd0aCgpOworICAgIGRvdWJsZSBh
bmdsZSA9IChwaURvdWJsZSAtIGFicyhhc2luKGNyb3NzIC8gKGQwMSAqIGQyMSkpKSkgKiAwLjU7
CisgICAgZG91YmxlIHNwYW4gPSByYWRpdXMgKiB0YW4oYW5nbGUpOworICAgIGRvdWJsZSByYXRl
ID0gc3BhbiAvIGQwMTsKKyAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKKyAgICBzdGFydFBvaW50
Lm1feCA9IHAxLm1feCArIHYwMS5tX3ggKiByYXRlOworICAgIHN0YXJ0UG9pbnQubV95ID0gcDEu
bV95ICsgdjAxLm1feSAqIHJhdGU7CisKKyAgICBhZGRMaW5lVG8oc3RhcnRQb2ludCk7CisKKyAg
ICBQYXRoUG9pbnQgZW5kUG9pbnQ7CisgICAgcmF0ZSA9IHNwYW4gLyBkMjE7CisgICAgZW5kUG9p
bnQubV94ID0gcDEubV94ICsgdjIxLm1feCAqIHJhdGU7CisgICAgZW5kUG9pbnQubV95ID0gcDEu
bV95ICsgdjIxLm1feSAqIHJhdGU7CisKKyAgICBQYXRoUG9pbnQgbWlkUG9pbnQ7CisgICAgbWlk
UG9pbnQubV94ID0gKHN0YXJ0UG9pbnQubV94ICsgZW5kUG9pbnQubV94KSAqIDAuNTsKKyAgICBt
aWRQb2ludC5tX3kgPSAoc3RhcnRQb2ludC5tX3kgKyBlbmRQb2ludC5tX3kpICogMC41OworCisg
ICAgUGF0aFZlY3RvciB2bTEgPSBtaWRQb2ludCAtIHAxOworICAgIGRvdWJsZSBkbTEgPSB2bTEu
bGVuZ3RoKCk7CisgICAgZG91YmxlIGQgPSBfaHlwb3QocmFkaXVzLCBzcGFuKTsKKworICAgIFBh
dGhQb2ludCBjZW50ZXJQb2ludDsKKyAgICByYXRlID0gZCAvIGRtMTsKKyAgICBjZW50ZXJQb2lu
dC5tX3ggPSBwMS5tX3ggKyB2bTEubV94ICogcmF0ZTsKKyAgICBjZW50ZXJQb2ludC5tX3kgPSBw
MS5tX3kgKyB2bTEubV95ICogcmF0ZTsKKworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkFyY1Rv
IGRhdGEgPSB7CisgICAgICAgIGVuZFBvaW50LAorICAgICAgICBjZW50ZXJQb2ludCwKKyAgICAg
ICAgeyByYWRpdXMsIHJhZGl1cyB9LAorICAgICAgICBjcm9zcyA8IDAKKyAgICB9OworICAgIFBs
YXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBlKTsKK30KKwordm9pZCBQ
bGF0Zm9ybVBhdGg6OmNsb3NlU3VicGF0aCgpCit7CisgICAgUGxhdGZvcm1QYXRoRWxlbWVudCBw
ZTsKKyAgICBhcHBlbmQocGUpOworfQorCisvLyBhZGQgYSBjaXJjdWxhciBhcmMgY2VudHJlZCBh
dCBwIHdpdGggcmFkaXVzIHIgZnJvbSBzdGFydCBhbmdsZSBzYXIgKHJhZGlhbnMpIHRvIGVuZCBh
bmdsZSBlYXIKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQm
IHAsIGZsb2F0IGEsIGZsb2F0IGIsIGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9j
a3dpc2UpCit7CisgICAgZmxvYXQgc3RhcnRYLCBzdGFydFksIGVuZFgsIGVuZFk7CisKKyAgICBu
b3JtYWxpemVBbmdsZShzYXIpOworICAgIG5vcm1hbGl6ZUFuZ2xlKGVhcik7CisKKyAgICBnZXRF
bGxpcHNlUG9pbnRCeUFuZ2xlKHNhciwgYSwgYiwgc3RhcnRYLCBzdGFydFkpOworICAgIGdldEVs
bGlwc2VQb2ludEJ5QW5nbGUoZWFyLCBhLCBiLCBlbmRYLCBlbmRZKTsKKworICAgIHRyYW5zZm9y
bUFyY1BvaW50KHN0YXJ0WCwgc3RhcnRZLCBwKTsKKyAgICB0cmFuc2Zvcm1BcmNQb2ludChlbmRY
LCBlbmRZLCBwKTsKKworICAgIEZsb2F0UG9pbnQgc3RhcnQoc3RhcnRYLCBzdGFydFkpOworICAg
IG1vdmVUbyhzdGFydCk7CisKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyBkYXRhID0g
eyB7IGVuZFgsIGVuZFkgfSwgeyBwLngoKSwgcC55KCkgfSwgIHsgYSwgYiB9LCAhYW50aWNsb2Nr
d2lzZSB9OworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGUoZGF0YSk7CisgICAgYXBwZW5kKHBl
KTsKK30KKworCit2b2lkIFBsYXRmb3JtUGF0aDo6YWRkUmVjdChjb25zdCBGbG9hdFJlY3QmIHIp
Cit7CisgICAgbW92ZVRvKHIubG9jYXRpb24oKSk7CisKKyAgICBmbG9hdCByaWdodCA9IHIucmln
aHQoKSAtIDE7CisgICAgZmxvYXQgYm90dG9tID0gci5ib3R0b20oKSAtIDE7CisgICAgYWRkTGlu
ZVRvKEZsb2F0UG9pbnQocmlnaHQsIHIueSgpKSk7CisgICAgYWRkTGluZVRvKEZsb2F0UG9pbnQo
cmlnaHQsIGJvdHRvbSkpOworICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHIueCgpLCBib3R0b20p
KTsKKyAgICBhZGRMaW5lVG8oci5sb2NhdGlvbigpKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6
OmFkZEVsbGlwc2UoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIEZsb2F0U2l6ZSByYWRpdXMo
ci53aWR0aCgpICogMC41LCByLmhlaWdodCgpICogMC41KTsKKyAgICBhZGRFbGxpcHNlKHIubG9j
YXRpb24oKSArIHJhZGl1cywgcmFkaXVzLndpZHRoKCksIHJhZGl1cy5oZWlnaHQoKSwgMCwgMCwg
dHJ1ZSk7Cit9CisKK1N0cmluZyBQbGF0Zm9ybVBhdGg6OmRlYnVnU3RyaW5nKCkgY29uc3QKK3sK
KyAgICBTdHJpbmcgcmV0OworICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVudHM6OmNvbnN0X2l0
ZXJhdG9yIGkobV9lbGVtZW50cy5iZWdpbigpKTsgaSAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2kp
IHsKKyAgICAgICAgc3dpdGNoIChpLT5wbGF0Zm9ybVR5cGUoKSkgeworICAgICAgICBjYXNlIFBs
YXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhNb3ZlVG86CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRo
RWxlbWVudDo6UGF0aExpbmVUbzoKKyAgICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgi
TSAlZiAlZlxuIiwgaS0+cG9pbnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCkubV95KTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhBcmNU
bzoKKyAgICAgICAgICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiQSAlZiAlZiAlZiAlZiAlZiAl
ZiAlY1xuIgorICAgICAgICAgICAgICAgICwgaS0+YXJjVG8oKS5tX2VuZC5tX3gsIGktPmFyY1Rv
KCkubV9lbmQubV95CisgICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fY2VudGVyLm1feCwg
aS0+YXJjVG8oKS5tX2NlbnRlci5tX3kKKyAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9y
YWRpdXMubV94LCBpLT5hcmNUbygpLm1fcmFkaXVzLm1feQorICAgICAgICAgICAgICAgICwgaS0+
YXJjVG8oKS5tX2Nsb2Nrd2lzZT8gJ1knIDogJ04nKTsKKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhRdWFkQ3VydmVUbzoKKyAgICAgICAg
ICAgIHJldCArPSBTdHJpbmc6OmZvcm1hdCgiUSAlZiAlZiAlZiAlZlxuIgorICAgICAgICAgICAg
ICAgICwgaS0+cG9pbnRBdCgwKS5tX3gsIGktPnBvaW50QXQoMCkubV95CisgICAgICAgICAgICAg
ICAgLCBpLT5wb2ludEF0KDEpLm1feCwgaS0+cG9pbnRBdCgxKS5tX3kpOworICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aEJlemllckN1cnZl
VG86CisgICAgICAgICAgICByZXQgKz0gU3RyaW5nOjpmb3JtYXQoIkIgJWYgJWYgJWYgJWYgJWYg
JWZcbiIKKyAgICAgICAgICAgICAgICAsIGktPnBvaW50QXQoMCkubV94LCBpLT5wb2ludEF0KDAp
Lm1feQorICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgxKS5tX3gsIGktPnBvaW50QXQoMSku
bV95CisgICAgICAgICAgICAgICAgLCBpLT5wb2ludEF0KDIpLm1feCwgaS0+cG9pbnRBdCgyKS5t
X3kpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBB
U1NFUlQoaS0+cGxhdGZvcm1UeXBlKCkgPT0gUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aENsb3Nl
U3VicGF0aCk7CisgICAgICAgICAgICByZXQgKz0gIlNcbiI7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgUGxhdGZvcm1Q
YXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25z
dAoreworICAgIFBhdGhFbGVtZW50IHBlbGVtZW50OworICAgIEZsb2F0UG9pbnQgcG9pbnRzWzNd
OworICAgIHBlbGVtZW50LnBvaW50cyA9IHBvaW50czsKKworICAgIGZvciAoUGxhdGZvcm1QYXRo
RWxlbWVudHM6OmNvbnN0X2l0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7IGl0ICE9IG1f
ZWxlbWVudHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgcGVsZW1lbnQudHlwZSA9IGl0LT50eXBl
KCk7CisgICAgICAgIGludCBuID0gaXQtPm51bVBvaW50cygpOworICAgICAgICBmb3IgKGludCBp
ID0gMDsgaSA8IG47ICsraSkKKyAgICAgICAgICAgIHBvaW50c1tpXSA9IGl0LT5wb2ludEF0KGkp
OworICAgICAgICBmdW5jdGlvbihpbmZvLCAmcGVsZW1lbnQpOworICAgIH0KK30KKworCit9IC8v
IG5hbWVzcGFjZSBXZWJjb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNz
L3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dp
bmNlL1BsYXRmb3JtUGF0aFdpbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uZmNhMDBhNwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mv
d2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaApAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqICBDb3B5
cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBv
cHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9V
VCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICog
IE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNl
ZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGli
cmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlm
dGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRl
ZiBQbGF0Zm9ybVBhdGhXaW5jZV9oCisjZGVmaW5lIFBsYXRmb3JtUGF0aFdpbmNlX2gKKworbmFt
ZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xhc3MgR3JhcGhpY3NDb250ZXh0OworCisgICAgc3Ry
dWN0IFBhdGhQb2ludCB7CisgICAgICAgIGZsb2F0IG1feDsKKyAgICAgICAgZmxvYXQgbV95Owor
ICAgICAgICBjb25zdCBmbG9hdCYgeCgpIGNvbnN0IHsgcmV0dXJuIG1feDsgfQorICAgICAgICBj
b25zdCBmbG9hdCYgeSgpIGNvbnN0IHsgcmV0dXJuIG1feTsgfQorICAgICAgICB2b2lkIHNldChm
bG9hdCB4LCBmbG9hdCB5KQorICAgICAgICB7CisgICAgICAgICAgICBtX3ggPSB4OworICAgICAg
ICAgICAgbV95ID0geTsKKyAgICAgICAgfTsKKyAgICAgICAgb3BlcmF0b3IgRmxvYXRQb2ludCgp
IGNvbnN0IHsgcmV0dXJuIEZsb2F0UG9pbnQobV94LCBtX3kpOyB9CisgICAgICAgIHZvaWQgbW92
ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCkKKyAgICAgICAgeworICAgICAgICAgICAgbV94ICs9
IG9mZnNldC53aWR0aCgpOworICAgICAgICAgICAgbV95ICs9IG9mZnNldC5oZWlnaHQoKTsKKyAg
ICAgICAgfQorICAgICAgICBQYXRoUG9pbnQmIG9wZXJhdG9yPShjb25zdCBGbG9hdFBvaW50JiBw
KQorICAgICAgICB7CisgICAgICAgICAgICBtX3ggPSBwLngoKTsKKyAgICAgICAgICAgIG1feSA9
IHAueSgpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZv
aWQgY2xlYXIoKSB7IG1feCA9IG1feSA9IDA7IH0KKyAgICB9OworCisgICAgc3RydWN0IFBhdGhQ
b2x5Z29uOiBwdWJsaWMgVmVjdG9yPFBhdGhQb2ludD4geworICAgICAgICB2b2lkIG1vdmUoY29u
c3QgRmxvYXRTaXplJiBvZmZzZXQpOworICAgICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAgICAgIGJvb2wgY29udGFpbnMoY29uc3QgRmxvYXRQ
b2ludCYgcG9pbnQpIGNvbnN0OworICAgIH07CisKKyAgICBjbGFzcyBQbGF0Zm9ybVBhdGhFbGVt
ZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIGVudW0gUGxhZm9ybVBhdGhFbGVtZW50VHlwZSB7
CisgICAgICAgICAgICBQYXRoTW92ZVRvLAorICAgICAgICAgICAgUGF0aExpbmVUbywKKyAgICAg
ICAgICAgIFBhdGhBcmNUbywKKyAgICAgICAgICAgIFBhdGhRdWFkQ3VydmVUbywKKyAgICAgICAg
ICAgIFBhdGhCZXppZXJDdXJ2ZVRvLAorICAgICAgICAgICAgUGF0aENsb3NlU3VicGF0aCwKKyAg
ICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTW92ZVRvIHsKKyAgICAgICAgICAgIFBhdGhQb2lu
dCBtX2VuZDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgTGluZVRvIHsKKyAgICAgICAg
ICAgIFBhdGhQb2ludCBtX2VuZDsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgQXJjVG8g
eworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICAgICAgUGF0aFBvaW50IG1f
Y2VudGVyOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcmFkaXVzOworICAgICAgICAgICAgYm9v
bCBtX2Nsb2Nrd2lzZTsKKyAgICAgICAgfTsKKworICAgICAgICBzdHJ1Y3QgUXVhZEN1cnZlVG8g
eworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQwOworICAgICAgICAgICAgUGF0aFBvaW50
IG1fcG9pbnQxOworICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBCZXppZXJDdXJ2ZVRvIHsK
KyAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50MDsKKyAgICAgICAgICAgIFBhdGhQb2ludCBt
X3BvaW50MTsKKyAgICAgICAgICAgIFBhdGhQb2ludCBtX3BvaW50MjsKKyAgICAgICAgfTsKKwor
ICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KCk6IG1fdHlwZShQYXRoQ2xvc2VTdWJwYXRoKSB7
IG1fZGF0YS5tX3BvaW50c1swXS5zZXQoMCwgMCk7ICAgIH0KKyAgICAgICAgUGxhdGZvcm1QYXRo
RWxlbWVudChjb25zdCBNb3ZlVG8mIGRhdGEpOiBtX3R5cGUoUGF0aE1vdmVUbykgeyBtX2RhdGEu
bV9tb3ZlVG9EYXRhID0gZGF0YTsgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0
IExpbmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoTGluZVRvKSB7IG1fZGF0YS5tX2xpbmVUb0RhdGEg
PSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgQXJjVG8mIGRhdGEp
OiBtX3R5cGUoUGF0aEFyY1RvKSB7IG1fZGF0YS5tX2FyY1RvRGF0YSA9IGRhdGE7IH0KKyAgICAg
ICAgUGxhdGZvcm1QYXRoRWxlbWVudChjb25zdCBRdWFkQ3VydmVUbyYgZGF0YSk6IG1fdHlwZShQ
YXRoUXVhZEN1cnZlVG8pIHsgbV9kYXRhLm1fcXVhZEN1cnZlVG9EYXRhID0gZGF0YTsgfQorICAg
ICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IEJlemllckN1cnZlVG8mIGRhdGEpOiBtX3R5
cGUoUGF0aEJlemllckN1cnZlVG8pIHsgbV9kYXRhLm1fYmV6aWVyQ3VydmVUb0RhdGEgPSBkYXRh
OyB9CisKKyAgICAgICAgY29uc3QgTW92ZVRvJiBtb3ZlVG8oKSBjb25zdCB7IHJldHVybiBtX2Rh
dGEubV9tb3ZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IExpbmVUbyYgbGluZVRvKCkgY29uc3Qg
eyByZXR1cm4gbV9kYXRhLm1fbGluZVRvRGF0YTsgfQorICAgICAgICBjb25zdCBBcmNUbyYgYXJj
VG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9hcmNUb0RhdGE7IH0KKyAgICAgICAgY29uc3Qg
UXVhZEN1cnZlVG8mIHF1YWRDdXJ2ZVRvKCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fcXVhZEN1
cnZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IEJlemllckN1cnZlVG8mIGJlemllckN1cnZlVG8o
KSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9iZXppZXJDdXJ2ZVRvRGF0YTsgfQorICAgICAgICBj
b25zdCBQYXRoUG9pbnQmIGxhc3RQb2ludCgpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAg
IGludCBuID0gbnVtUG9pbnRzKCk7CisgICAgICAgICAgICByZXR1cm4gbiA+IDEgPyBtX2RhdGEu
bV9wb2ludHNbbiAtIDFdIDogbV9kYXRhLm1fcG9pbnRzWzBdOworICAgICAgICB9CisgICAgICAg
IGNvbnN0IFBhdGhQb2ludCYgcG9pbnRBdChpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIG1fZGF0
YS5tX3BvaW50c1tpbmRleF07IH0KKyAgICAgICAgaW50IG51bVBvaW50cygpIGNvbnN0OworICAg
ICAgICBpbnQgbnVtQ29udHJvbFBvaW50cygpIGNvbnN0OworICAgICAgICB2b2lkIG1vdmUoY29u
c3QgRmxvYXRTaXplJiBvZmZzZXQpOworICAgICAgICB2b2lkIHRyYW5zZm9ybShjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCYgdCk7CisgICAgICAgIFBhdGhFbGVtZW50VHlwZSB0eXBlKCkgY29u
c3Q7CisgICAgICAgIFBsYWZvcm1QYXRoRWxlbWVudFR5cGUgcGxhdGZvcm1UeXBlKCkgY29uc3Qg
eyByZXR1cm4gbV90eXBlOyB9CisgICAgICAgIHZvaWQgaW5mbGF0ZVJlY3RUb0NvbnRhaW5NZShG
bG9hdFJlY3QmIHIsIGNvbnN0IEZsb2F0UG9pbnQmIGxhc3RQb2ludCkgY29uc3Q7CisKKyAgICBw
cml2YXRlOgorICAgICAgICBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIG1fdHlwZTsKKyAgICAgICAg
dW5pb24geworICAgICAgICAgICAgTW92ZVRvIG1fbW92ZVRvRGF0YTsKKyAgICAgICAgICAgIExp
bmVUbyBtX2xpbmVUb0RhdGE7CisgICAgICAgICAgICBBcmNUbyBtX2FyY1RvRGF0YTsKKyAgICAg
ICAgICAgIFF1YWRDdXJ2ZVRvIG1fcXVhZEN1cnZlVG9EYXRhOworICAgICAgICAgICAgQmV6aWVy
Q3VydmVUbyBtX2JlemllckN1cnZlVG9EYXRhOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9p
bnRzWzRdOworICAgICAgICB9IG1fZGF0YTsKKyAgICB9OworCisgICAgdHlwZWRlZiBWZWN0b3I8
UGxhdGZvcm1QYXRoRWxlbWVudD4gUGxhdGZvcm1QYXRoRWxlbWVudHM7CisKKyAgICBjbGFzcyBQ
bGF0Zm9ybVBhdGggeworICAgIHB1YmxpYzoKKyAgICAgICAgUGxhdGZvcm1QYXRoKCk7CisgICAg
ICAgIGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnRzJiBlbGVtZW50cygpIGNvbnN0IHsgcmV0dXJu
IG1fZWxlbWVudHM7IH0KKyAgICAgICAgdm9pZCBhcHBlbmQoY29uc3QgUGxhdGZvcm1QYXRoRWxl
bWVudCYgZSk7CisgICAgICAgIHZvaWQgYXBwZW5kKGNvbnN0IFBsYXRmb3JtUGF0aCYgcCk7Cisg
ICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1
cm4gbV9lbGVtZW50cy5pc0VtcHR5KCk7IH0KKworICAgICAgICB2b2lkIHN0cm9rZVBhdGgoSERD
LCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHIpIGNvbnN0OworICAgICAgICB2b2lkIGZp
bGxQYXRoKEhEQywgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyKSBjb25zdDsKKyAgICAg
ICAgRmxvYXRQb2ludCBsYXN0UG9pbnQoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRzLmlzRW1w
dHkoKSA/IEZsb2F0UG9pbnQoMCwgMCkgOiBtX2VsZW1lbnRzLmxhc3QoKS5sYXN0UG9pbnQoKTsg
fQorCisgICAgICAgIGNvbnN0IEZsb2F0UmVjdCYgYm91bmRpbmdSZWN0KCkgY29uc3QgeyByZXR1
cm4gbV9ib3VuZGluZ1JlY3Q7IH0KKyAgICAgICAgYm9vbCBjb250YWlucyhjb25zdCBGbG9hdFBv
aW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkgY29uc3Q7CisgICAgICAgIHZvaWQgdHJhbnNsYXRl
KGNvbnN0IEZsb2F0U2l6ZSYgc2l6ZSk7CisgICAgICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRy
YW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKworICAgICAgICB2b2lkIG1vdmVUbyhjb25zdCBGbG9h
dFBvaW50Jik7CisgICAgICAgIHZvaWQgYWRkTGluZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAg
ICAgICAgdm9pZCBhZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBvaW50JiBjb250cm9sUG9pbnQs
IGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KTsKKyAgICAgICAgdm9pZCBhZGRCZXppZXJDdXJ2ZVRv
KGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNvbnRy
b2xQb2ludDIsIGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRBcmNUbyhjb25z
dCBGbG9hdFBvaW50JiwgY29uc3QgRmxvYXRQb2ludCYsIGZsb2F0IHJhZGl1cyk7CisgICAgICAg
IHZvaWQgY2xvc2VTdWJwYXRoKCk7CisgICAgICAgIHZvaWQgYWRkRWxsaXBzZShjb25zdCBGbG9h
dFBvaW50JiBwLCBmbG9hdCBhLCBmbG9hdCBiLCBmbG9hdCBzYXIsIGZsb2F0IGVhciwgYm9vbCBh
bnRpY2xvY2t3aXNlKTsKKyAgICAgICAgdm9pZCBhZGRSZWN0KGNvbnN0IEZsb2F0UmVjdCYgcik7
CisgICAgICAgIHZvaWQgYWRkRWxsaXBzZShjb25zdCBGbG9hdFJlY3QmIHIpOworICAgICAgICBT
dHJpbmcgZGVidWdTdHJpbmcoKSBjb25zdDsKKyAgICAgICAgdm9pZCBhcHBseSh2b2lkKiBpbmZv
LCBQYXRoQXBwbGllckZ1bmN0aW9uIGZ1bmN0aW9uKSBjb25zdDsKKworICAgIHByaXZhdGU6Cisg
ICAgICAgIHZvaWQgZW5zdXJlU3VicGF0aCgpOworICAgICAgICB2b2lkIGFkZFRvU3VicGF0aChj
b25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKTsKKworICAgICAgICBQbGF0Zm9ybVBhdGhFbGVt
ZW50cyBtX2VsZW1lbnRzOworICAgICAgICBGbG9hdFJlY3QgbV9ib3VuZGluZ1JlY3Q7CisgICAg
ICAgIFZlY3RvcjxQYXRoUG9seWdvbj4gbV9zdWJwYXRoczsKKyAgICAgICAgUGF0aFBvaW50IG1f
Y3VycmVudFBvaW50OworICAgICAgICBib29sIG1fcGVuTGlmdGVkOworICAgIH07CisKK30KKwor
I2VuZGlmIC8vIFBsYXRmb3JtUGF0aFdpbmNlX2gKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvV2luY2VHcmFwaGljc0V4dHJhcy5oIGIvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy93aW5jZS9XaW5jZUdyYXBoaWNzRXh0cmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uMmE2ZmFlMQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vZ3JhcGhpY3Mvd2luY2UvV2luY2VHcmFwaGljc0V4dHJhcy5oCkBAIC0wLDAgKzEsMzkg
QEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5z
ZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxv
bmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwg
d3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFu
a2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNB
LgorICovCisKKyNpZm5kZWYgV2luY2VHcmFwaGljc0V4dHJhc19oCisjZGVmaW5lIFdpbmNlR3Jh
cGhpY3NFeHRyYXNfaAorCisvLyBUaGlzIGZpbGUgaXMgdXNlZCB0byBjb250YWluIHNtYWxsIHV0
aWxpdGllcyB1c2VkIGJ5IFdJTkNFIGdyYXBoaWNzIGNvZGUuCisKK25hbWVzcGFjZSBXZWJDb3Jl
IHsKKyAgICAvLyBBbHdheXMgcm91bmQgdG8gc2FtZSBkaXJlY3Rpb24uIDAuNSBpcyByb3VuZGVk
IHRvIDEsCisgICAgLy8gYW5kIC0wLjUgKDAuNSAtIDEpIGlzIHJvdW5kZWQgdG8gMCAoMSAtIDEp
LCBzbyB0aGF0IGl0CisgICAgLy8gaXMgY29uc2lzdGVudCB3aGVuIHRyYW5zZm9ybWF0aW9uIHNo
aWZ0cy4KKyAgICBzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChkb3VibGUgZCkKKyAgICB7
CisgICAgICAgIGlmIChkID4gMCkKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+
KGQgKyAwLjUpOworCisgICAgICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICAg
ICAgcmV0dXJuIGkgLSBkID4gMC41ID8gaSAtIDEgOiBpOworICAgIH0KK30KKworI2VuZGlmIFdp
bmNlR3JhcGhpY3NFeHRyYXNfaAo=
</data>
<flag name="review"
          id="18816"
          type_id="1"
          status="+"
          setter="manyoso"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34666</attachid>
            <date>2009-08-12 09:19:31 -0700</date>
            <delta_ts>2009-08-12 09:46:11 -0700</delta_ts>
            <desc>fix a bug in last patch</desc>
            <filename>28188.patch</filename>
            <type>text/plain</type>
            <size>38980</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MGY3NmU4Yy4uM2Q4NGIxNiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNyBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEltcGxlbWVudCBQYXRoIGZvciBXSU5DRS4gTW9z
dCBjb2RlIGNhbiBiZSAKKyAgICAgICAgcmV1c2VkIGZvciBvdGhlciBwb3J0cyB0aGF0IGRvbid0
IGhhdmUgbmF0aXZlIHBhdGggc3VwcG9ydAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9MjgxODgKKworICAgICAgICBXcml0dGVuIGFsc28gYnkgR2Vvcmdl
IFN0YWlrb3MgKGluY2x1ZGluZyBxdWFkQ3VydmUoKSBhbmQgYmV6aWVyKCkpCisKKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAg
KiBwbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5jcHA6IEFkZGVkLgor
ICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmg6IEFk
ZGVkLgorCiAyMDA5LTA4LTA4ICBMeW9uIENoZW4gIDxseW9uLmNoZW5AdG9yY2htb2JpbGUuY29t
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0
Zm9ybS9ncmFwaGljcy93aW5jZS9QYXRoV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjc1ODljY2IKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL3dpbmNlL1BhdGhXaW5jZS5jcHAKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiAg
Q29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IK
KyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZv
dW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0Uu
ICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9y
ZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisKKyNpbmNsdWRlICJGbG9hdFJl
Y3QuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0
aFdpbmNlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUcmFuc2Zv
cm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPHd0Zi9Pd25QdHIuaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitQYXRoOjpQYXRoKCkKKyAgICA6IG1fcGF0aChuZXcgUGxhdGZvcm1QYXRoKCkp
Cit7Cit9CisKK1BhdGg6OlBhdGgoY29uc3QgUGF0aCYgb3RoZXIpCisgICAgOiBtX3BhdGgobmV3
IFBsYXRmb3JtUGF0aCgqb3RoZXIubV9wYXRoKSkKK3sKK30KKworUGF0aDo6flBhdGgoKQorewor
ICAgIGRlbGV0ZSBtX3BhdGg7Cit9CisKK1BhdGgmIFBhdGg6Om9wZXJhdG9yPShjb25zdCBQYXRo
JiBvdGhlcikKK3sKKyAgICBpZiAoJm90aGVyICE9IHRoaXMpIHsKKyAgICAgICAgZGVsZXRlIG1f
cGF0aDsKKyAgICAgICAgbV9wYXRoID0gbmV3IFBsYXRmb3JtUGF0aCgqb3RoZXIubV9wYXRoKTsK
KyAgICB9CisgICAgcmV0dXJuICp0aGlzOworfQorCitib29sIFBhdGg6OmNvbnRhaW5zKGNvbnN0
IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBjb25zdAoreworICAgIHJldHVybiBt
X3BhdGgtPmNvbnRhaW5zKHBvaW50LCBydWxlKTsKK30KKwordm9pZCBQYXRoOjp0cmFuc2xhdGUo
Y29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIG1fcGF0aC0+dHJhbnNsYXRlKHNpemUpOwor
fQorCitGbG9hdFJlY3QgUGF0aDo6Ym91bmRpbmdSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9wYXRoLT5ib3VuZGluZ1JlY3QoKTsKK30KKwordm9pZCBQYXRoOjptb3ZlVG8oY29uc3QgRmxv
YXRQb2ludCYgcG9pbnQpCit7CisgICAgbV9wYXRoLT5tb3ZlVG8ocG9pbnQpOworfQorCit2b2lk
IFBhdGg6OmFkZExpbmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBtX3BhdGgt
PmFkZExpbmVUbyhwb2ludCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkUXVhZEN1cnZlVG8oY29uc3Qg
RmxvYXRQb2ludCYgY3AsIGNvbnN0IEZsb2F0UG9pbnQmIHApCit7CisgICAgbV9wYXRoLT5hZGRR
dWFkQ3VydmVUbyhjcCwgcCk7Cit9CisKK3ZvaWQgUGF0aDo6YWRkQmV6aWVyQ3VydmVUbyhjb25z
dCBGbG9hdFBvaW50JiBjcDEsIGNvbnN0IEZsb2F0UG9pbnQmIGNwMiwgY29uc3QgRmxvYXRQb2lu
dCYgcCkKK3sKKyAgICBtX3BhdGgtPmFkZEJlemllckN1cnZlVG8oY3AxLCBjcDIsIHApOworfQor
Cit2b2lkIFBhdGg6OmFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmIHAxLCBjb25zdCBGbG9hdFBv
aW50JiBwMiwgZmxvYXQgcmFkaXVzKQoreworICAgIG1fcGF0aC0+YWRkQXJjVG8ocDEsIHAyLCBy
YWRpdXMpOworfQorCit2b2lkIFBhdGg6OmNsb3NlU3VicGF0aCgpCit7CisgICAgbV9wYXRoLT5j
bG9zZVN1YnBhdGgoKTsKK30KKwordm9pZCBQYXRoOjphZGRBcmMoY29uc3QgRmxvYXRQb2ludCYg
cCwgZmxvYXQgciwgZmxvYXQgc2FyLCBmbG9hdCBlYXIsIGJvb2wgYW50aWNsb2Nrd2lzZSkKK3sK
KyAgICBtX3BhdGgtPmFkZEVsbGlwc2UocCwgciwgciwgc2FyLCBlYXIsIGFudGljbG9ja3dpc2Up
OworfQorCit2b2lkIFBhdGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIG1f
cGF0aC0+YWRkUmVjdChyKTsKK30KKwordm9pZCBQYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0
UmVjdCYgcikKK3sKKyAgICBtX3BhdGgtPmFkZEVsbGlwc2Uocik7Cit9CisKK3ZvaWQgUGF0aDo6
Y2xlYXIoKQoreworICAgIG1fcGF0aC0+Y2xlYXIoKTsKK30KKworYm9vbCBQYXRoOjppc0VtcHR5
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wYXRoLT5pc0VtcHR5KCk7Cit9CisKK1N0cmluZyBQ
YXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGF0aC0+ZGVidWdTdHJp
bmcoKTsKK30KKwordm9pZCBQYXRoOjphcHBseSh2b2lkKiBpbmZvLCBQYXRoQXBwbGllckZ1bmN0
aW9uIGZ1bmN0aW9uKSBjb25zdAoreworICAgIG1fcGF0aC0+YXBwbHkoaW5mbywgZnVuY3Rpb24p
OworfQorCit2b2lkIFBhdGg6OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYg
dCkKK3sKKyAgICBtX3BhdGgtPnRyYW5zZm9ybSh0KTsKK30KKworRmxvYXRSZWN0IFBhdGg6OnN0
cm9rZUJvdW5kaW5nUmVjdChTdHJva2VTdHlsZUFwcGxpZXIgKikKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIHJldHVybiBGbG9hdFJlY3QoKTsKK30KKworYm9vbCBQYXRoOjpzdHJva2VD
b250YWlucyhTdHJva2VTdHlsZUFwcGxpZXIqLCBjb25zdCBGbG9hdFBvaW50JikgY29uc3QKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBQYXRo
OjpoYXNDdXJyZW50UG9pbnQoKSBjb25zdAoreworICAgIC8vIE5vdCBzdXJlIGlmIHRoaXMgaXMg
Y29ycmVjdC4gQXQgdGhlIG1lYW50aW1lLCB3ZSBkbyB3aGF0IG90aGVyIHBvcnRzCisgICAgLy8g
ZG8uCisgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NzI2NiwKKyAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjcx
ODcsIGFuZCAKKyAgICAvLyBodHRwOi8vdHJhYy53ZWJraXQub3JnL2NoYW5nZXNldC80NTg3Mwor
ICAgIHJldHVybiAhaXNFbXB0eSgpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAw
NjQ0CmluZGV4IDAwMDAwMDAuLjY2ZmFkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3Bs
YXRmb3JtL2dyYXBoaWNzL3dpbmNlL1BsYXRmb3JtUGF0aFdpbmNlLmNwcApAQCAtMCwwICsxLDgx
MCBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4K
KyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZl
ZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90
LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBV
U0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBsYXRmb3JtUGF0aFdp
bmNlLmgiCisKKyNpbmNsdWRlICJGbG9hdFJlY3QuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRl
eHQuaCIKKyNpbmNsdWRlICJQYXRoLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNp
bmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgIldpbmNlR3JhcGhpY3NF
eHRyYXMuaCIKKyNpbmNsdWRlIDx3dGYvTWF0aEV4dHJhcy5oPgorI2luY2x1ZGUgPHd0Zi9Pd25Q
dHIuaD4KKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBJbXBsZW1lbnRlZCBpbiBHcmFwaGljc0NvbnRleHRXaW5jZS5jcHAKK3ZvaWQgZ2V0RWxsaXBz
ZVBvaW50QnlBbmdsZShkb3VibGUgYW5nbGUsIGRvdWJsZSBhLCBkb3VibGUgYiwgZmxvYXQmIHgs
IGZsb2F0JiB5KTsKKworc3RhdGljIHZvaWQgcXVhZEN1cnZlKGludCBzZWdtZW50cywgVmVjdG9y
PFBhdGhQb2ludD4mIHB0cywgY29uc3QgUGF0aFBvaW50KiBjb250cm9sKQoreworICAgIGNvbnN0
IGZsb2F0IHN0ZXAgPSAxLjAgLyBzZWdtZW50czsKKyAgICByZWdpc3RlciBmbG9hdCB0QSA9IDAu
MDsKKyAgICByZWdpc3RlciBmbG9hdCB0QiA9IDEuMDsKKworICAgIGZsb2F0IGMxeCA9IGNvbnRy
b2xbMF0ueCgpOworICAgIGZsb2F0IGMxeSA9IGNvbnRyb2xbMF0ueSgpOworICAgIGZsb2F0IGMy
eCA9IGNvbnRyb2xbMV0ueCgpOworICAgIGZsb2F0IGMyeSA9IGNvbnRyb2xbMV0ueSgpOworICAg
IGZsb2F0IGMzeCA9IGNvbnRyb2xbMl0ueCgpOworICAgIGZsb2F0IGMzeSA9IGNvbnRyb2xbMl0u
eSgpOworCisgICAgY29uc3QgaW50IG9mZnNldCA9IHB0cy5zaXplKCk7CisgICAgcHRzLnJlc2l6
ZShvZmZzZXQgKyBzZWdtZW50cyk7CisgICAgUGF0aFBvaW50IHBwOworICAgIHBwLm1feCA9IGMx
eDsKKyAgICBwcC5tX3kgPSBjMXk7CisKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IHNlZ21lbnRz
OyArK2kpIHsKKyAgICAgICAgdEEgKz0gc3RlcDsKKyAgICAgICAgdEIgLT0gc3RlcDsKKworICAg
ICAgICBjb25zdCBmbG9hdCBhID0gdEIgKiB0QjsKKyAgICAgICAgY29uc3QgZmxvYXQgYiA9IDIu
MCAqIHRBICogdEI7CisgICAgICAgIGNvbnN0IGZsb2F0IGMgPSB0QSAqIHRBOworCisgICAgICAg
IHBwLm1feCA9IGMxeCAqIGEgKyBjMnggKiBiICsgYzN4ICogYzsKKyAgICAgICAgcHAubV95ID0g
YzF5ICogYSArIGMyeSAqIGIgKyBjM3kgKiBjOworCisgICAgICAgIHB0c1tvZmZzZXQgKyBpIC0g
MV0gPSBwcDsKKyAgICB9CisKKyAgICBwcC5tX3ggPSBjM3g7CisgICAgcHAubV95ID0gYzN5Owor
ICAgIHB0c1tvZmZzZXQgKyBzZWdtZW50cyAtIDFdID0gcHA7Cit9CisKK3N0YXRpYyBpbmxpbmUg
dm9pZCBiZXppZXIoaW50IHNlZ21lbnRzLCBWZWN0b3I8UGF0aFBvaW50PiYgcHRzLCBjb25zdCBQ
YXRoUG9pbnQqIGNvbnRyb2wpCit7CisgICAgY29uc3QgZmxvYXQgc3RlcCA9IDEuMCAvIHNlZ21l
bnRzOworICAgIHJlZ2lzdGVyIGZsb2F0IHRBID0gMC4wOworICAgIHJlZ2lzdGVyIGZsb2F0IHRC
ID0gMS4wOworCisgICAgZmxvYXQgYzF4ID0gY29udHJvbFswXS54KCk7CisgICAgZmxvYXQgYzF5
ID0gY29udHJvbFswXS55KCk7CisgICAgZmxvYXQgYzJ4ID0gY29udHJvbFsxXS54KCk7CisgICAg
ZmxvYXQgYzJ5ID0gY29udHJvbFsxXS55KCk7CisgICAgZmxvYXQgYzN4ID0gY29udHJvbFsyXS54
KCk7CisgICAgZmxvYXQgYzN5ID0gY29udHJvbFsyXS55KCk7CisgICAgZmxvYXQgYzR4ID0gY29u
dHJvbFszXS54KCk7CisgICAgZmxvYXQgYzR5ID0gY29udHJvbFszXS55KCk7CisKKyAgICBjb25z
dCBpbnQgb2Zmc2V0ID0gcHRzLnNpemUoKTsKKyAgICBwdHMucmVzaXplKG9mZnNldCArIHNlZ21l
bnRzKTsKKyAgICBQYXRoUG9pbnQgcHA7CisgICAgcHAubV94ID0gYzF4OworICAgIHBwLm1feSA9
IGMxeTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgc2VnbWVudHM7ICsraSkgeworICAgICAg
ICB0QSArPSBzdGVwOworICAgICAgICB0QiAtPSBzdGVwOworICAgICAgICBjb25zdCBmbG9hdCB0
QXNxID0gdEEgKiB0QTsKKyAgICAgICAgY29uc3QgZmxvYXQgdEJzcSA9IHRCICogdEI7CisKKyAg
ICAgICAgY29uc3QgZmxvYXQgYSA9IHRCc3EgKiB0QjsKKyAgICAgICAgY29uc3QgZmxvYXQgYiA9
IDMuMCAqIHRBICogdEJzcTsKKyAgICAgICAgY29uc3QgZmxvYXQgYyA9IDMuMCAqIHRCICogdEFz
cTsKKyAgICAgICAgY29uc3QgZmxvYXQgZCA9IHRBc3EgKiB0QTsKKworICAgICAgICBwcC5tX3gg
PSBjMXggKiBhICsgYzJ4ICogYiArIGMzeCAqIGMgKyBjNHggKiBkOworICAgICAgICBwcC5tX3kg
PSBjMXkgKiBhICsgYzJ5ICogYiArIGMzeSAqIGMgKyBjNHkgKiBkOworCisgICAgICAgIHB0c1tv
ZmZzZXQgKyBpIC0gMV0gPSBwcDsKKyAgICB9CisKKyAgICBwcC5tX3ggPSBjNHg7CisgICAgcHAu
bV95ID0gYzR5OworICAgIHB0c1tvZmZzZXQgKyBzZWdtZW50cyAtIDFdID0gcHA7Cit9CisKK3N0
YXRpYyBib29sIGNvbnRhaW5zUG9pbnQoY29uc3QgRmxvYXRSZWN0JiByLCBjb25zdCBGbG9hdFBv
aW50JiBwKQoreworICAgIHJldHVybiBwLngoKSA+PSByLngoKSAmJiBwLnkoKSA+PSByLnkoKSAm
JiBwLngoKSA8IHIucmlnaHQoKSAmJiBwLnkoKSA8IHIuYm90dG9tKCk7Cit9CisKK3N0YXRpYyB2
b2lkIG5vcm1hbGl6ZUFuZ2xlKGZsb2F0JiBhbmdsZSkKK3sKKyAgICBhbmdsZSA9IGZtb2QoYW5n
bGUsIDIgKiBwaUZsb2F0KTsKKyAgICBpZiAoYW5nbGUgPCAwKQorICAgICAgICBhbmdsZSArPSAy
ICogcGlGbG9hdDsKKyAgICBpZiAoYW5nbGUgPCAwLjAwMDAxZikKKyAgICAgICAgYW5nbGUgPSAw
OworfQorCitzdGF0aWMgdm9pZCB0cmFuc2Zvcm1BcmNQb2ludChmbG9hdCYgeCwgZmxvYXQmIHks
IGNvbnN0IEZsb2F0UG9pbnQmIGMpCit7CisgICAgeCArPSBjLngoKTsKKyAgICB5ICs9IGMueSgp
OworfQorCitzdGF0aWMgdm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KEZsb2F0UmVjdCYg
ciwgZmxvYXQgeCwgZmxvYXQgeSkKK3sKKyAgICBpZiAoci5pc0VtcHR5KCkpIHsKKyAgICAgICAg
ci5zZXRYKHgpOworICAgICAgICByLnNldFkoeSk7CisgICAgICAgIHIuc2V0U2l6ZShGbG9hdFNp
emUoMSwgMSkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICh4IDwgci54KCkpIHsK
KyAgICAgICAgci5zZXRXaWR0aChyLnJpZ2h0KCkgLSB4KTsKKyAgICAgICAgci5zZXRYKHgpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIGZsb2F0IHcgPSB4IC0gci54KCkgKyAxOworICAgICAgICBp
ZiAodyA+IHIud2lkdGgoKSkKKyAgICAgICAgICAgIHIuc2V0V2lkdGgodyk7CisgICAgfQorICAg
IGlmICh5IDwgci55KCkpIHsKKyAgICAgICAgci5zZXRIZWlnaHQoci5ib3R0b20oKSAtIHkpOwor
ICAgICAgICByLnNldFkoeSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxvYXQgaCA9ICB5IC0g
ci55KCkgKyAxOworICAgICAgICBpZiAoaCA+IHIuaGVpZ2h0KCkpCisgICAgICAgICAgICByLnNl
dEhlaWdodChoKTsKKyAgICB9Cit9CisKKy8vIHJldHVybiAwLWJhc2VkIHZhbHVlOiAwIC0gZmly
c3QgUXVhZHJhbnQgKCAwIC0gOTAgZGVncmVlKQorc3RhdGljIGlubGluZSBpbnQgcXVhZHJhbnQo
Y29uc3QgUGF0aFBvaW50JiBwb2ludCwgY29uc3QgUGF0aFBvaW50JiBvcmlnaW4pCit7CisgICAg
cmV0dXJuIHBvaW50Lm1feCA8IG9yaWdpbi5tX3ggPworICAgICAgICAocG9pbnQubV95IDwgb3Jp
Z2luLm1feSA/IDIgOiAxKQorICAgICAgICA6IChwb2ludC5tX3kgPCBvcmlnaW4ubV95ID8gMyA6
IDApOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uTGVmdChpbnQgcSkgeyBy
ZXR1cm4gcSA9PSAxIHx8IHEgPT0gMjsgfQorc3RhdGljIGlubGluZSBib29sIGlzUXVhZHJhbnRP
blJpZ2h0KGludCBxKSB7IHJldHVybiBxID09IDAgfHwgcSA9PSAzOyB9CitzdGF0aWMgaW5saW5l
IGJvb2wgaXNRdWFkcmFudE9uVG9wKGludCBxKSB7IHJldHVybiBxID09IDIgfHwgcSA9PSAzOyB9
CitzdGF0aWMgaW5saW5lIGJvb2wgaXNRdWFkcmFudE9uQm90dG9tKGludCBxKSB7IHJldHVybiBx
ID09IDAgfHwgcSA9PSAxOyB9CisKK3N0YXRpYyBpbmxpbmUgaW50IG5leHRRdWFkcmFudChpbnQg
cSkgeyByZXR1cm4gcSA9PSAzID8gMCA6IHEgKyAxOyB9CitzdGF0aWMgaW5saW5lIGludCBxdWFk
cmFudERpZmYoaW50IHExLCBpbnQgcTIpCit7CisgICAgaW50IGQgPSBxMSAtIHEyOworICAgIHdo
aWxlIChkIDwgMCkKKyAgICAgICAgZCArPSA0OworICAgIHJldHVybiBkOworfQorCitzdHJ1Y3Qg
UGF0aFZlY3RvciB7CisgICAgZmxvYXQgbV94OworICAgIGZsb2F0IG1feTsKKworICAgIFBhdGhW
ZWN0b3IoKSA6IG1feCgwKSwgbV95KDApIHt9CisgICAgUGF0aFZlY3RvcihmbG9hdCB4LCBmbG9h
dCB5KSA6IG1feCh4KSwgbV95KHkpIHt9CisgICAgZG91YmxlIGFuZ2xlKCkgY29uc3QgeyByZXR1
cm4gYXRhbjIobV95LCBtX3gpOyB9CisgICAgb3BlcmF0b3IgZG91YmxlICgpIGNvbnN0IHsgcmV0
dXJuIGFuZ2xlKCk7IH0KKyAgICBkb3VibGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gX2h5cG90
KG1feCwgbV95KTsgfQorfTsKKworUGF0aFZlY3RvciBvcGVyYXRvci0oY29uc3QgUGF0aFBvaW50
JiBwMSwgY29uc3QgUGF0aFBvaW50JiBwMikKK3sKKyAgICByZXR1cm4gUGF0aFZlY3RvcihwMS5t
X3ggLSBwMi5tX3gsIHAxLm1feSAtIHAyLm1feSk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEFyY1Bv
aW50KFBhdGhQb2x5Z29uJiBwb2x5LCBjb25zdCBQYXRoUG9pbnQmIGNlbnRlciwgY29uc3QgUGF0
aFBvaW50JiByYWRpdXMsIGRvdWJsZSBhbmdsZSkKK3sKKyAgICBQYXRoUG9pbnQgcDsKKyAgICBn
ZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGFuZ2xlLCByYWRpdXMubV94LCByYWRpdXMubV95LCBwLm1f
eCwgcC5tX3kpOworICAgIHRyYW5zZm9ybUFyY1BvaW50KHAubV94LCBwLm1feSwgY2VudGVyKTsK
KyAgICBpZiAocG9seS5pc0VtcHR5KCkgfHwgcG9seS5sYXN0KCkgIT0gcCkKKyAgICAgICAgcG9s
eS5hcHBlbmQocCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZEFyY1BvaW50cyhQYXRoUG9seWdvbiYg
cG9seSwgY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudDo6QXJjVG8mIGRhdGEpCit7CisgICAgY29u
c3QgUGF0aFBvaW50JiBzdGFydFBvaW50ID0gcG9seS5sYXN0KCk7CisgICAgZG91YmxlIGN1ckFu
Z2xlID0gc3RhcnRQb2ludCAtIGRhdGEubV9jZW50ZXI7CisgICAgZG91YmxlIGVuZEFuZ2xlID0g
ZGF0YS5tX2VuZCAtIGRhdGEubV9jZW50ZXI7CisgICAgZG91YmxlIGFuZ2xlU3RlcCA9IDIuIC8g
c3RkOjptYXgoZGF0YS5tX3JhZGl1cy5tX3gsIGRhdGEubV9yYWRpdXMubV95KTsKKyAgICBpZiAo
ZGF0YS5tX2Nsb2Nrd2lzZSkgeworICAgICAgICBpZiAoZW5kQW5nbGUgPD0gY3VyQW5nbGUgfHwg
c3RhcnRQb2ludCA9PSBkYXRhLm1fZW5kKQorICAgICAgICAgICAgZW5kQW5nbGUgKz0gMiAqIHBp
RG91YmxlOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZ2xlU3RlcCA9IC1hbmdsZVN0ZXA7Cisg
ICAgICAgIGlmIChlbmRBbmdsZSA+PSBjdXJBbmdsZSB8fCBzdGFydFBvaW50ID09IGRhdGEubV9l
bmQpCisgICAgICAgICAgICBlbmRBbmdsZSAtPSAyICogcGlEb3VibGU7CisgICAgfQorCisgICAg
Zm9yIChjdXJBbmdsZSArPSBhbmdsZVN0ZXA7IGRhdGEubV9jbG9ja3dpc2UgPyBjdXJBbmdsZSA8
IGVuZEFuZ2xlIDogY3VyQW5nbGUgPiBlbmRBbmdsZTsgY3VyQW5nbGUgKz0gYW5nbGVTdGVwKQor
ICAgICAgICBhZGRBcmNQb2ludChwb2x5LCBkYXRhLm1fY2VudGVyLCBkYXRhLm1fcmFkaXVzLCBj
dXJBbmdsZSk7CisKKyAgICBpZiAocG9seS5pc0VtcHR5KCkgfHwgcG9seS5sYXN0KCkgIT0gZGF0
YS5tX2VuZCkKKyAgICAgICAgcG9seS5hcHBlbmQoZGF0YS5tX2VuZCk7Cit9CisKK3N0YXRpYyB2
b2lkIGRyYXdQb2x5Z29ucyhIREMgZGMsIGNvbnN0IFZlY3RvcjxQYXRoUG9seWdvbj4mIHBvbHln
b25zLCBib29sIGZpbGwsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4KiB0cmFuc2Zvcm1hdGlv
bikKK3sKKyAgICBNZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworICAgIGZvciAoVmVj
dG9yPFBhdGhQb2x5Z29uPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHBvbHlnb25zLmJlZ2luKCk7IGkg
IT0gcG9seWdvbnMuZW5kKCk7ICsraSkgeworICAgICAgICBpbnQgbnBvaW50cyA9IGktPnNpemUo
KTsKKyAgICAgICAgaWYgKCFucG9pbnRzKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAg
ICAgUE9JTlQqIHdpblBvaW50cyA9IDA7CisgICAgICAgIGlmIChmaWxsKSB7CisgICAgICAgICAg
ICBpZiAobnBvaW50cyA+IDIpCisgICAgICAgICAgICAgICAgd2luUG9pbnRzID0gbmV3IFBPSU5U
W25wb2ludHMgKyAxXTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB3aW5Qb2ludHMgPSBu
ZXcgUE9JTlRbbnBvaW50c107CisKKyAgICAgICAgaWYgKHdpblBvaW50cykgeworICAgICAgICAg
ICAgaWYgKHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaTIgPSAw
OyBpMiA8IG5wb2ludHM7ICsraTIpIHsKKyAgICAgICAgICAgICAgICAgICAgRmxvYXRQb2ludCB0
clBvaW50ID0gdHJhbnNmb3JtYXRpb24tPm1hcFBvaW50KGktPmF0KGkyKSk7CisgICAgICAgICAg
ICAgICAgICAgIHdpblBvaW50c1tpMl0ueCA9IHN0YWJsZVJvdW5kKHRyUG9pbnQueCgpKTsKKyAg
ICAgICAgICAgICAgICAgICAgd2luUG9pbnRzW2kyXS55ID0gc3RhYmxlUm91bmQodHJQb2ludC55
KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAg
ICAgICAgZm9yIChpbnQgaTIgPSAwOyBpMiA8IG5wb2ludHM7ICsraTIpIHsKKyAgICAgICAgICAg
ICAgICAgICAgd2luUG9pbnRzW2kyXS54ID0gc3RhYmxlUm91bmQoaS0+YXQoaTIpLngoKSk7Cisg
ICAgICAgICAgICAgICAgICAgIHdpblBvaW50c1tpMl0ueSA9IHN0YWJsZVJvdW5kKGktPmF0KGky
KS55KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAg
aWYgKGZpbGwgJiYgd2luUG9pbnRzW25wb2ludHMgLSAxXSAhPSB3aW5Qb2ludHNbMF0pIHsKKyAg
ICAgICAgICAgICAgICB3aW5Qb2ludHNbbnBvaW50c10ueCA9IHdpblBvaW50c1swXS54OworICAg
ICAgICAgICAgICAgIHdpblBvaW50c1tucG9pbnRzXS55ID0gd2luUG9pbnRzWzBdLnk7CisgICAg
ICAgICAgICAgICAgKytucG9pbnRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAo
ZmlsbCkKKyAgICAgICAgICAgICAgICA6OlBvbHlnb24oZGMsIHdpblBvaW50cywgbnBvaW50cyk7
CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgOjpQb2x5bGluZShkYywgd2luUG9p
bnRzLCBucG9pbnRzKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIHdpblBvaW50czsKKyAgICAgICAg
fQorICAgIH0KK30KKworCitpbnQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bnVtQ29udHJvbFBvaW50
cygpIGNvbnN0Cit7CisgICAgc3dpdGNoIChtX3R5cGUpIHsKKyAgICBjYXNlIFBhdGhNb3ZlVG86
CisgICAgY2FzZSBQYXRoTGluZVRvOgorICAgICAgICByZXR1cm4gMTsKKyAgICBjYXNlIFBhdGhR
dWFkQ3VydmVUbzoKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgcmV0dXJuIDI7CisgICAg
Y2FzZSBQYXRoQmV6aWVyQ3VydmVUbzoKKyAgICAgICAgcmV0dXJuIDM7CisgICAgZGVmYXVsdDoK
KyAgICAgICAgQVNTRVJUKG1fdHlwZSA9PSBQYXRoQ2xvc2VTdWJwYXRoKTsKKyAgICAgICAgcmV0
dXJuIDA7CisgICAgfQorfQorCitpbnQgUGxhdGZvcm1QYXRoRWxlbWVudDo6bnVtUG9pbnRzKCkg
Y29uc3QKK3sKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNhc2UgUGF0aE1vdmVUbzoKKyAg
ICBjYXNlIFBhdGhMaW5lVG86CisgICAgY2FzZSBQYXRoQXJjVG86CisgICAgICAgIHJldHVybiAx
OworICAgIGNhc2UgUGF0aFF1YWRDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gMjsKKyAgICBjYXNl
IFBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICByZXR1cm4gMzsKKyAgICBkZWZhdWx0OgorICAg
ICAgICBBU1NFUlQobV90eXBlID09IFBhdGhDbG9zZVN1YnBhdGgpOworICAgICAgICByZXR1cm4g
MDsKKyAgICB9Cit9CisKK3ZvaWQgUGF0aFBvbHlnb246Om1vdmUoY29uc3QgRmxvYXRTaXplJiBv
ZmZzZXQpCit7CisgICAgZm9yIChWZWN0b3I8UGF0aFBvaW50Pjo6aXRlcmF0b3IgaSA9IGJlZ2lu
KCk7IGkgPCBlbmQoKTsgKytpKQorICAgICAgICBpLT5tb3ZlKG9mZnNldCk7Cit9CisKK3ZvaWQg
UGF0aFBvbHlnb246OnRyYW5zZm9ybShjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sK
KyAgICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+OjppdGVyYXRvciBpID0gYmVnaW4oKTsgaSA8IGVu
ZCgpOyArK2kpCisgICAgICAgICppID0gdC5tYXBQb2ludCgqaSk7Cit9CisKK2Jvb2wgUGF0aFBv
bHlnb246OmNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIGlm
IChzaXplKCkgPCAzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBUZXN0IGludGVy
c2VjdGlvbnMgYmV0d2VlbiB0aGUgcG9seWdvbiBhbmQgdGhlIHZlcnRpY2FsIGxpbmU6IHggPSBw
b2ludC54KCkKKworICAgIGludCBpbnRlcnNlY3RlZCA9IDA7CisgICAgY29uc3QgUGF0aFBvaW50
KiBwb2ludDEgPSAmbGFzdCgpOworICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRv
ciBsYXN0ID0gZW5kKCk7CisgICAgLy8gd2FzTmVnYXRpdmU6IC0xIG1lYW5zIHVua25vd24sIDAg
bWVhbnMgZmFsc2UsIDEgbWVhbnMgdHJ1ZS4KKyAgICBpbnQgd2FzTmVnYXRpdmUgPSAtMTsKKyAg
ICBmb3IgKFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25zdF9pdGVyYXRvciBpID0gYmVnaW4oKTsgaSAh
PSBsYXN0OyArK2kpIHsKKyAgICAgICAgY29uc3QgUGF0aFBvaW50JiBwb2ludDIgPSAqaTsKKyAg
ICAgICAgaWYgKHBvaW50MS0+eCgpICE9IHBvaW50LngoKSkgeworICAgICAgICAgICAgaWYgKHBv
aW50Mi54KCkgPT0gcG9pbnQueCgpKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgYXJlIGdldHRp
bmcgb24gdGhlIHZlcnRpY2FsIGxpbmUKKyAgICAgICAgICAgICAgICB3YXNOZWdhdGl2ZSA9IHBv
aW50MS0+eCgpIDwgcG9pbnQueCgpID8gMSA6IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBv
aW50Mi54KCkgPCBwb2ludC54KCkgIT0gcG9pbnQxLT54KCkgPCBwb2ludC54KCkpIHsKKyAgICAg
ICAgICAgICAgICBmbG9hdCB5ID0gKHBvaW50Mi55KCkgLSBwb2ludDEtPnkoKSkgLyAocG9pbnQy
LngoKSAtIHBvaW50MS0+eCgpKSAqIChwb2ludC54KCkgLSBwb2ludDEtPngoKSkgKyBwb2ludDEt
PnkoKTsKKyAgICAgICAgICAgICAgICBpZiAoeSA+PSBwb2ludC55KCkpCisgICAgICAgICAgICAg
ICAgICAgICsraW50ZXJzZWN0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAvLyBXZSB3ZXJlIG9uIHRoZSB2ZXJ0aWNhbCBsaW5lCisKKyAgICAgICAgICAg
IC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UKKyAgICAgICAgICAgIGlmIChwb2ludDEtPnkoKSA9PSBw
b2ludC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgICAgIGlm
IChwb2ludDEtPnkoKSA+IHBvaW50LnkoKSkgeworICAgICAgICAgICAgICAgIGlmIChwb2ludDIu
eCgpID09IHBvaW50LngoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzZWUgaWYgdGhlIHBv
aW50IGlzIG9uIHRoaXMgc2VnbWVudAorICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnQyLnko
KSA8PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKwor
ICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgc3RpbGwgb24gdGhlIGxpbmUKKyAgICAgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbGVhdmluZyB0
aGUgbGluZSBub3cuCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gZ2V0IGJhY2sg
dG8gc2VlIHdoaWNoIHNpZGUgd2UgY29tZSBmcm9tLiBJZiB3ZSBjb21lIGZyb20KKyAgICAgICAg
ICAgICAgICAgICAgLy8gdGhlIHNhbWUgc2lkZSB3ZSBhcmUgbGVhdmluZywgbm8gaW50ZXJzZWN0
aW9uIHNob3VsZCBiZSBjb3VudGVkCisgICAgICAgICAgICAgICAgICAgIGlmICh3YXNOZWdhdGl2
ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvcjxQYXRoUG9pbnQ+Ojpjb25z
dF9pdGVyYXRvciBqTGFzdCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8UGF0
aFBvaW50Pjo6Y29uc3RfaXRlcmF0b3IgaiA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBk
byB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogPT0gYmVnaW4oKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9IGxhc3Q7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWo7CisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGotPngoKSAhPSBwb2ludC54KCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGotPngoKSA+IHBvaW50LngoKSkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc05lZ2F0aXZlID0gMDsKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgd2FzTmVnYXRpdmUgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAg
ICAgICAgICB9IHdoaWxlIChqICE9IGpMYXN0KTsKKworICAgICAgICAgICAgICAgICAgICAgICAg
aWYgKHdhc05lZ2F0aXZlIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHdh
c05lZ2F0aXZlID8gcG9pbnQyLngoKSA+IHBvaW50LngoKSA6IHBvaW50Mi54KCkgPCBwb2ludC54
KCkpCisgICAgICAgICAgICAgICAgICAgICAgICArK2ludGVyc2VjdGVkOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9pbnQyLngoKSA9PSBwb2ludC54KCkgJiYg
cG9pbnQyLnkoKSA+PSBwb2ludC55KCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIH0KKyAgICAgICAgcG9pbnQxID0gJnBvaW50MjsKKyAgICB9CisKKyAgICByZXR1cm4g
aW50ZXJzZWN0ZWQgJiAxOworfQorCit2b2lkIFBsYXRmb3JtUGF0aEVsZW1lbnQ6Om1vdmUoY29u
c3QgRmxvYXRTaXplJiBvZmZzZXQpCit7CisgICAgaW50IG4gPSBudW1Db250cm9sUG9pbnRzKCk7
CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAgIG1fZGF0YS5tX3BvaW50
c1tpXS5tb3ZlKG9mZnNldCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoRWxlbWVudDo6dHJhbnNm
b3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KQoreworICAgIGludCBuID0gbnVtQ29u
dHJvbFBvaW50cygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAg
IEZsb2F0UG9pbnQgcCA9IHQubWFwUG9pbnQobV9kYXRhLm1fcG9pbnRzW2ldKTsKKyAgICAgICAg
bV9kYXRhLm1fcG9pbnRzW2ldLnNldChwLngoKSwgcC55KCkpOworICAgIH0KK30KKwordm9pZCBQ
bGF0Zm9ybVBhdGhFbGVtZW50OjppbmZsYXRlUmVjdFRvQ29udGFpbk1lKEZsb2F0UmVjdCYgciwg
Y29uc3QgRmxvYXRQb2ludCYgbGFzdFBvaW50KSBjb25zdAoreworICAgIGlmIChtX3R5cGUgPT0g
UGF0aEFyY1RvKSB7CisgICAgICAgIGNvbnN0IEFyY1RvJiBkYXRhID0gbV9kYXRhLm1fYXJjVG9E
YXRhOworICAgICAgICBQYXRoUG9pbnQgc3RhcnRQb2ludDsKKyAgICAgICAgc3RhcnRQb2ludCA9
IGxhc3RQb2ludDsKKyAgICAgICAgUGF0aFBvaW50IGVuZFBvaW50ID0gZGF0YS5tX2VuZDsKKyAg
ICAgICAgaWYgKCFkYXRhLm1fY2xvY2t3aXNlKQorICAgICAgICAgICAgc3RkOjpzd2FwKHN0YXJ0
UG9pbnQsIGVuZFBvaW50KTsKKworICAgICAgICBpbnQgcTAgPSBxdWFkcmFudChzdGFydFBvaW50
LCBkYXRhLm1fY2VudGVyKTsKKyAgICAgICAgaW50IHExID0gcXVhZHJhbnQoZW5kUG9pbnQsIGRh
dGEubV9jZW50ZXIpOworICAgICAgICBib29sIGNvbnRhaW5zRXh0cmVtZXNbNF0gPSB7IGZhbHNl
IH07IC8vIGJvdHRvbSwgbGVmdCwgdG9wLCByaWdodAorICAgICAgICBzdGF0aWMgY29uc3QgUGF0
aFBvaW50IGV4dHJlbWVWZWN0b3JzWzRdID0geyB7IDAsIDEgfSwgeyAtMSwgMCB9LCB7IDAsIC0x
IH0sIHsgMSwgMCB9IH07CisgICAgICAgIGlmIChxMCA9PSBxMSkgeworICAgICAgICAgICAgaWYg
KHN0YXJ0UG9pbnQubV94ID09IGVuZFBvaW50Lm1feCB8fCBpc1F1YWRyYW50T25Cb3R0b20ocTAp
ICE9IHN0YXJ0UG9pbnQubV94ID4gZW5kUG9pbnQubV94KSB7CisgICAgICAgICAgICAgICAgZm9y
IChpbnQgaSA9IDA7IGkgPCA0OyArK2kpCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zRXh0
cmVtZXNbaV0gPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgaW50IGV4dHJlbWUgPSBxMDsKKyAgICAgICAgICAgIGludCBkaWZmID0gcXVhZHJhbnRE
aWZmKHExLCBxMCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpZmY7ICsraSkg
eworICAgICAgICAgICAgICAgIGNvbnRhaW5zRXh0cmVtZXNbZXh0cmVtZV0gPSB0cnVlOworICAg
ICAgICAgICAgICAgIGV4dHJlbWUgPSBuZXh0UXVhZHJhbnQoZXh0cmVtZSk7CisgICAgICAgICAg
ICB9CisgICAgICAgIH0KKworICAgICAgICBpbmZsYXRlUmVjdFRvQ29udGFpblBvaW50KHIsIHN0
YXJ0UG9pbnQubV94LCBzdGFydFBvaW50Lm1feSk7CisgICAgICAgIGluZmxhdGVSZWN0VG9Db250
YWluUG9pbnQociwgZW5kUG9pbnQubV94LCBlbmRQb2ludC5tX3kpOworICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IDQ7ICsraSkgeworICAgICAgICAgICAgaWYgKGNvbnRhaW5zRXh0cmVtZXNb
aV0pCisgICAgICAgICAgICAgICAgaW5mbGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBkYXRhLm1f
Y2VudGVyLm1feCArIGRhdGEubV9yYWRpdXMubV94ICogZXh0cmVtZVZlY3RvcnNbaV0ubV94LCBk
YXRhLm1fY2VudGVyLm1feSArIGRhdGEubV9yYWRpdXMubV95ICogZXh0cmVtZVZlY3RvcnNbaV0u
bV95KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludCBuID0gbnVtUG9pbnRz
KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQorICAgICAgICAgICAgaW5m
bGF0ZVJlY3RUb0NvbnRhaW5Qb2ludChyLCBtX2RhdGEubV9wb2ludHNbaV0ubV94LCBtX2RhdGEu
bV9wb2ludHNbaV0ubV95KTsKKyAgICB9Cit9CisKK1BhdGhFbGVtZW50VHlwZSBQbGF0Zm9ybVBh
dGhFbGVtZW50Ojp0eXBlKCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKG1fdHlwZSkgeworICAgIGNh
c2UgUGF0aE1vdmVUbzoKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50TW92ZVRvUG9pbnQ7Cisg
ICAgY2FzZSBQYXRoTGluZVRvOgorICAgICAgICByZXR1cm4gUGF0aEVsZW1lbnRBZGRMaW5lVG9Q
b2ludDsKKyAgICBjYXNlIFBhdGhBcmNUbzoKKyAgICAgICAgLy8gRklYTUU6IHRoZXJlJ3Mgbm8g
YXJjVG8gdHlwZSBmb3IgUGF0aEVsZW1lbnQKKyAgICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRk
TGluZVRvUG9pbnQ7CisgICAgICAgIC8vIHJldHVybiBQYXRoRWxlbWVudEFkZFF1YWRDdXJ2ZVRv
UG9pbnQ7CisgICAgY2FzZSBQYXRoUXVhZEN1cnZlVG86CisgICAgICAgIHJldHVybiBQYXRoRWxl
bWVudEFkZFF1YWRDdXJ2ZVRvUG9pbnQ7CisgICAgY2FzZSBQYXRoQmV6aWVyQ3VydmVUbzoKKyAg
ICAgICAgcmV0dXJuIFBhdGhFbGVtZW50QWRkQ3VydmVUb1BvaW50OworICAgIGRlZmF1bHQ6Cisg
ICAgICAgIEFTU0VSVChtX3R5cGUgPT0gUGF0aENsb3NlU3VicGF0aCk7CisgICAgICAgIHJldHVy
biBQYXRoRWxlbWVudENsb3NlU3VicGF0aDsKKyAgICB9Cit9CisKK1BsYXRmb3JtUGF0aDo6UGxh
dGZvcm1QYXRoKCkKKyAgICA6IG1fcGVuTGlmdGVkKHRydWUpCit7CisgICAgbV9jdXJyZW50UG9p
bnQuY2xlYXIoKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmVuc3VyZVN1YnBhdGgoKQorewor
ICAgIGlmIChtX3BlbkxpZnRlZCkgeworICAgICAgICBtX3BlbkxpZnRlZCA9IGZhbHNlOworICAg
ICAgICBtX3N1YnBhdGhzLmFwcGVuZChQYXRoUG9seWdvbigpKTsKKyAgICAgICAgbV9zdWJwYXRo
cy5sYXN0KCkuYXBwZW5kKG1fY3VycmVudFBvaW50KTsKKyAgICB9IGVsc2UKKyAgICAgICAgQVNT
RVJUKCFtX3N1YnBhdGhzLmlzRW1wdHkoKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRU
b1N1YnBhdGgoY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVudCYgZSkKK3sKKyAgICBpZiAoZS5wbGF0
Zm9ybVR5cGUoKSA9PSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoTW92ZVRvKSB7CisgICAgICAg
IG1fcGVuTGlmdGVkID0gdHJ1ZTsKKyAgICAgICAgbV9jdXJyZW50UG9pbnQgPSBlLnBvaW50QXQo
MCk7CisgICAgfSBlbHNlIGlmIChlLnBsYXRmb3JtVHlwZSgpID09IFBsYXRmb3JtUGF0aEVsZW1l
bnQ6OlBhdGhDbG9zZVN1YnBhdGgpIHsKKyAgICAgICAgbV9wZW5MaWZ0ZWQgPSB0cnVlOworICAg
ICAgICBpZiAoIW1fc3VicGF0aHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAobV9jdXJy
ZW50UG9pbnQgIT0gbV9zdWJwYXRocy5sYXN0KClbMF0pIHsKKyAgICAgICAgICAgICAgICAvLyBB
Y2NvcmRpbmcgdG8gVzNDLCB3ZSBoYXZlIHRvIGRyYXcgYSBsaW5lIGZyb20gY3VycmVudCBwb2lu
dCB0byB0aGUgaW5pdGlhbCBwb2ludAorICAgICAgICAgICAgICAgIG1fc3VicGF0aHMubGFzdCgp
LmFwcGVuZChtX3N1YnBhdGhzLmxhc3QoKVswXSk7CisgICAgICAgICAgICAgICAgbV9jdXJyZW50
UG9pbnQgPSBtX3N1YnBhdGhzLmxhc3QoKVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICBtX2N1cnJlbnRQb2ludC5jbGVhcigpOworICAgIH0gZWxzZSB7Cisg
ICAgICAgIGVuc3VyZVN1YnBhdGgoKTsKKyAgICAgICAgc3dpdGNoIChlLnBsYXRmb3JtVHlwZSgp
KSB7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aExpbmVUbzoKKyAgICAg
ICAgICAgIG1fc3VicGF0aHMubGFzdCgpLmFwcGVuZChlLnBvaW50QXQoMCkpOworICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0aEFyY1RvOgor
ICAgICAgICAgICAgYWRkQXJjUG9pbnRzKG1fc3VicGF0aHMubGFzdCgpLCBlLmFyY1RvKCkpOwor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUGxhdGZvcm1QYXRoRWxlbWVudDo6UGF0
aFF1YWRDdXJ2ZVRvOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFBhdGhQb2ludCBj
b250cm9sW10gPSB7CisgICAgICAgICAgICAgICAgICAgIG1fY3VycmVudFBvaW50LAorICAgICAg
ICAgICAgICAgICAgICBlLnBvaW50QXQoMCksCisgICAgICAgICAgICAgICAgICAgIGUucG9pbnRB
dCgxKSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBtYWdp
YyBudW1iZXI/CisgICAgICAgICAgICAgICAgcXVhZEN1cnZlKDUwLCBtX3N1YnBhdGhzLmxhc3Qo
KSwgY29udHJvbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
Y2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQmV6aWVyQ3VydmVUbzoKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICBQYXRoUG9pbnQgY29udHJvbFtdID0geworICAgICAgICAgICAg
ICAgICAgICBtX2N1cnJlbnRQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgZS5wb2ludEF0KDAp
LAorICAgICAgICAgICAgICAgICAgICBlLnBvaW50QXQoMSksCisgICAgICAgICAgICAgICAgICAg
IGUucG9pbnRBdCgyKSwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIC8vIEZJ
WE1FOiBtYWdpYyBudW1iZXI/CisgICAgICAgICAgICAgICAgYmV6aWVyKDEwMCwgbV9zdWJwYXRo
cy5sYXN0KCksIGNvbnRyb2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIG1fY3VycmVudFBvaW50ID0gbV9zdWJw
YXRocy5sYXN0KCkubGFzdCgpOworICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFwcGVu
ZChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKQoreworICAgIGUuaW5mbGF0ZVJlY3RUb0Nv
bnRhaW5NZShtX2JvdW5kaW5nUmVjdCwgbGFzdFBvaW50KCkpOworICAgIGFkZFRvU3VicGF0aChl
KTsKKyAgICBtX2VsZW1lbnRzLmFwcGVuZChlKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OmFw
cGVuZChjb25zdCBQbGF0Zm9ybVBhdGgmIHApCit7CisgICAgY29uc3QgUGxhdGZvcm1QYXRoRWxl
bWVudHMmIGUgPSBwLmVsZW1lbnRzKCk7CisgICAgZm9yIChQbGF0Zm9ybVBhdGhFbGVtZW50czo6
Y29uc3RfaXRlcmF0b3IgaXQoZS5iZWdpbigpKTsgaXQgIT0gZS5lbmQoKTsgKytpdCkgeworICAg
ICAgICBhZGRUb1N1YnBhdGgoKml0KTsKKyAgICAgICAgaXQtPmluZmxhdGVSZWN0VG9Db250YWlu
TWUobV9ib3VuZGluZ1JlY3QsIGxhc3RQb2ludCgpKTsKKyAgICAgICAgbV9lbGVtZW50cy5hcHBl
bmQoKml0KTsKKyAgICB9Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjpjbGVhcigpCit7CisgICAg
bV9lbGVtZW50cy5jbGVhcigpOworICAgIG1fYm91bmRpbmdSZWN0ID0gRmxvYXRSZWN0KCk7Cisg
ICAgbV9zdWJwYXRocy5jbGVhcigpOworICAgIG1fY3VycmVudFBvaW50LmNsZWFyKCk7CisgICAg
bV9wZW5MaWZ0ZWQgPSB0cnVlOworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6c3Ryb2tlUGF0aChI
REMgZGMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4KiB0cmFuc2Zvcm1hdGlvbikgY29uc3QK
K3sKKyAgICBkcmF3UG9seWdvbnMoZGMsIG1fc3VicGF0aHMsIGZhbHNlLCB0cmFuc2Zvcm1hdGlv
bik7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjpmaWxsUGF0aChIREMgZGMsIGNvbnN0IFRyYW5z
Zm9ybWF0aW9uTWF0cml4KiB0cmFuc2Zvcm1hdGlvbikgY29uc3QKK3sKKyAgICBIR0RJT0JKIG9s
ZFBlbiA9IFNlbGVjdE9iamVjdChkYywgR2V0U3RvY2tPYmplY3QoTlVMTF9QRU4pKTsKKyAgICBk
cmF3UG9seWdvbnMoZGMsIG1fc3VicGF0aHMsIHRydWUsIHRyYW5zZm9ybWF0aW9uKTsKKyAgICBT
ZWxlY3RPYmplY3QoZGMsIG9sZFBlbik7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjp0cmFuc2xh
dGUoY29uc3QgRmxvYXRTaXplJiBzaXplKQoreworICAgIGZvciAoUGxhdGZvcm1QYXRoRWxlbWVu
dHM6Oml0ZXJhdG9yIGl0KG1fZWxlbWVudHMuYmVnaW4oKSk7IGl0ICE9IG1fZWxlbWVudHMuZW5k
KCk7ICsraXQpCisgICAgICAgIGl0LT5tb3ZlKHNpemUpOworCisgICAgbV9ib3VuZGluZ1JlY3Qu
bW92ZShzaXplKTsKKyAgICBmb3IgKFZlY3RvcjxQYXRoUG9seWdvbj46Oml0ZXJhdG9yIGl0ID0g
bV9zdWJwYXRocy5iZWdpbigpOyBpdCAhPSBtX3N1YnBhdGhzLmVuZCgpOyArK2l0KQorICAgICAg
ICBpdC0+bW92ZShzaXplKTsKK30KKwordm9pZCBQbGF0Zm9ybVBhdGg6OnRyYW5zZm9ybShjb25z
dCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdCkKK3sKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1l
bnRzOjppdGVyYXRvciBpdChtX2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1lbnRzLmVu
ZCgpOyArK2l0KQorICAgICAgICBpdC0+dHJhbnNmb3JtKHQpOworCisgICAgbV9ib3VuZGluZ1Jl
Y3QgPSB0Lm1hcFJlY3QobV9ib3VuZGluZ1JlY3QpOworICAgIGZvciAoVmVjdG9yPFBhdGhQb2x5
Z29uPjo6aXRlcmF0b3IgaXQgPSBtX3N1YnBhdGhzLmJlZ2luKCk7IGl0ICE9IG1fc3VicGF0aHMu
ZW5kKCk7ICsraXQpCisgICAgICAgIGl0LT50cmFuc2Zvcm0odCk7Cit9CisKK2Jvb2wgUGxhdGZv
cm1QYXRoOjpjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCwgV2luZFJ1bGUgcnVsZSkg
Y29uc3QKK3sKKyAgICAvLyBvcHRpbWl6YXRpb246IGNoZWNrIHRoZSBib3VuZGluZyByZWN0IGZp
cnN0CisgICAgaWYgKCFjb250YWluc1BvaW50KG1fYm91bmRpbmdSZWN0LCBwb2ludCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIGZvciAoVmVjdG9yPFBhdGhQb2x5Z29uPjo6Y29uc3Rf
aXRlcmF0b3IgaSA9IG1fc3VicGF0aHMuYmVnaW4oKTsgaSAhPSBtX3N1YnBhdGhzLmVuZCgpOyAr
K2kpIHsKKyAgICAgICAgaWYgKGktPmNvbnRhaW5zKHBvaW50KSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBQbGF0Zm9ybVBh
dGg6Om1vdmVUbyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhF
bGVtZW50OjpNb3ZlVG8gZGF0YSA9IHsgeyBwb2ludC54KCksIHBvaW50LnkoKSB9IH07CisgICAg
UGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2b2lk
IFBsYXRmb3JtUGF0aDo6YWRkTGluZVRvKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50KQoreworICAg
IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkxpbmVUbyBkYXRhID0geyB7IHBvaW50LngoKSwgcG9pbnQu
eSgpIH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChw
ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRRdWFkQ3VydmVUbyhjb25zdCBGbG9hdFBv
aW50JiBjcCwgY29uc3QgRmxvYXRQb2ludCYgcCkKK3sKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50
OjpRdWFkQ3VydmVUbyBkYXRhID0geyB7IGNwLngoKSwgY3AueSgpIH0sIHsgcC54KCksIHAueSgp
IH0gfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRCZXppZXJDdXJ2ZVRvKGNvbnN0IEZsb2F0UG9p
bnQmIGNwMSwgY29uc3QgRmxvYXRQb2ludCYgY3AyLCBjb25zdCBGbG9hdFBvaW50JiBwKQorewor
ICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OkJlemllckN1cnZlVG8gZGF0YSA9IHsgeyBjcDEueCgp
LCBjcDEueSgpIH0sIHsgY3AyLngoKSwgY3AyLnkoKSB9LCB7IHAueCgpLCBwLnkoKSB9IH07Cisg
ICAgUGxhdGZvcm1QYXRoRWxlbWVudCBwZShkYXRhKTsKKyAgICBhcHBlbmQocGUpOworfQorCit2
b2lkIFBsYXRmb3JtUGF0aDo6YWRkQXJjVG8oY29uc3QgRmxvYXRQb2ludCYgZnAxLCBjb25zdCBG
bG9hdFBvaW50JiBmcDIsIGZsb2F0IHJhZGl1cykKK3sKKyAgICBjb25zdCBQYXRoUG9pbnQmIHAw
ID0gbV9jdXJyZW50UG9pbnQ7CisgICAgUGF0aFBvaW50IHAxOworICAgIHAxID0gZnAxOworICAg
IFBhdGhQb2ludCBwMjsKKyAgICBwMiA9IGZwMjsKKyAgICBpZiAoIXJhZGl1cyB8fCBwMCA9PSBw
MSB8fCBwMSA9PSBwMikgeworICAgICAgICBhZGRMaW5lVG8ocDEpOworICAgICAgICByZXR1cm47
CisgICAgfQorCisgICAgUGF0aFZlY3RvciB2MDEgPSBwMCAtIHAxOworICAgIFBhdGhWZWN0b3Ig
djIxID0gcDIgLSBwMTsKKworICAgIC8vIHNpbihBIC0gQikgPSBzaW4oQSkgKiBjb3MoQikgLSBz
aW4oQikgKiBjb3MoQSkKKyAgICBkb3VibGUgY3Jvc3MgPSB2MDEubV94ICogdjIxLm1feSAtIHYw
MS5tX3kgKiB2MjEubV94OworCisgICAgaWYgKGZhYnMoY3Jvc3MpIDwgMUUtMTApIHsKKyAgICAg
ICAgLy8gb24gb25lIGxpbmUKKyAgICAgICAgYWRkTGluZVRvKHAxKTsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGRvdWJsZSBkMDEgPSB2MDEubGVuZ3RoKCk7CisgICAgZG91YmxlIGQy
MSA9IHYyMS5sZW5ndGgoKTsKKyAgICBkb3VibGUgYW5nbGUgPSAocGlEb3VibGUgLSBhYnMoYXNp
bihjcm9zcyAvIChkMDEgKiBkMjEpKSkpICogMC41OworICAgIGRvdWJsZSBzcGFuID0gcmFkaXVz
ICogdGFuKGFuZ2xlKTsKKyAgICBkb3VibGUgcmF0ZSA9IHNwYW4gLyBkMDE7CisgICAgUGF0aFBv
aW50IHN0YXJ0UG9pbnQ7CisgICAgc3RhcnRQb2ludC5tX3ggPSBwMS5tX3ggKyB2MDEubV94ICog
cmF0ZTsKKyAgICBzdGFydFBvaW50Lm1feSA9IHAxLm1feSArIHYwMS5tX3kgKiByYXRlOworCisg
ICAgYWRkTGluZVRvKHN0YXJ0UG9pbnQpOworCisgICAgUGF0aFBvaW50IGVuZFBvaW50OworICAg
IHJhdGUgPSBzcGFuIC8gZDIxOworICAgIGVuZFBvaW50Lm1feCA9IHAxLm1feCArIHYyMS5tX3gg
KiByYXRlOworICAgIGVuZFBvaW50Lm1feSA9IHAxLm1feSArIHYyMS5tX3kgKiByYXRlOworCisg
ICAgUGF0aFBvaW50IG1pZFBvaW50OworICAgIG1pZFBvaW50Lm1feCA9IChzdGFydFBvaW50Lm1f
eCArIGVuZFBvaW50Lm1feCkgKiAwLjU7CisgICAgbWlkUG9pbnQubV95ID0gKHN0YXJ0UG9pbnQu
bV95ICsgZW5kUG9pbnQubV95KSAqIDAuNTsKKworICAgIFBhdGhWZWN0b3Igdm0xID0gbWlkUG9p
bnQgLSBwMTsKKyAgICBkb3VibGUgZG0xID0gdm0xLmxlbmd0aCgpOworICAgIGRvdWJsZSBkID0g
X2h5cG90KHJhZGl1cywgc3Bhbik7CisKKyAgICBQYXRoUG9pbnQgY2VudGVyUG9pbnQ7CisgICAg
cmF0ZSA9IGQgLyBkbTE7CisgICAgY2VudGVyUG9pbnQubV94ID0gcDEubV94ICsgdm0xLm1feCAq
IHJhdGU7CisgICAgY2VudGVyUG9pbnQubV95ID0gcDEubV95ICsgdm0xLm1feSAqIHJhdGU7CisK
KyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50OjpBcmNUbyBkYXRhID0geworICAgICAgICBlbmRQb2lu
dCwKKyAgICAgICAgY2VudGVyUG9pbnQsCisgICAgICAgIHsgcmFkaXVzLCByYWRpdXMgfSwKKyAg
ICAgICAgY3Jvc3MgPCAwCisgICAgfTsKKyAgICBQbGF0Zm9ybVBhdGhFbGVtZW50IHBlKGRhdGEp
OworICAgIGFwcGVuZChwZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjpjbG9zZVN1YnBhdGgo
KQoreworICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQgcGU7CisgICAgYXBwZW5kKHBlKTsKK30KKwor
Ly8gYWRkIGEgY2lyY3VsYXIgYXJjIGNlbnRyZWQgYXQgcCB3aXRoIHJhZGl1cyByIGZyb20gc3Rh
cnQgYW5nbGUgc2FyIChyYWRpYW5zKSB0byBlbmQgYW5nbGUgZWFyCit2b2lkIFBsYXRmb3JtUGF0
aDo6YWRkRWxsaXBzZShjb25zdCBGbG9hdFBvaW50JiBwLCBmbG9hdCBhLCBmbG9hdCBiLCBmbG9h
dCBzYXIsIGZsb2F0IGVhciwgYm9vbCBhbnRpY2xvY2t3aXNlKQoreworICAgIGZsb2F0IHN0YXJ0
WCwgc3RhcnRZLCBlbmRYLCBlbmRZOworCisgICAgbm9ybWFsaXplQW5nbGUoc2FyKTsKKyAgICBu
b3JtYWxpemVBbmdsZShlYXIpOworCisgICAgZ2V0RWxsaXBzZVBvaW50QnlBbmdsZShzYXIsIGEs
IGIsIHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBnZXRFbGxpcHNlUG9pbnRCeUFuZ2xlKGVhciwgYSwg
YiwgZW5kWCwgZW5kWSk7CisKKyAgICB0cmFuc2Zvcm1BcmNQb2ludChzdGFydFgsIHN0YXJ0WSwg
cCk7CisgICAgdHJhbnNmb3JtQXJjUG9pbnQoZW5kWCwgZW5kWSwgcCk7CisKKyAgICBGbG9hdFBv
aW50IHN0YXJ0KHN0YXJ0WCwgc3RhcnRZKTsKKyAgICBtb3ZlVG8oc3RhcnQpOworCisgICAgUGxh
dGZvcm1QYXRoRWxlbWVudDo6QXJjVG8gZGF0YSA9IHsgeyBlbmRYLCBlbmRZIH0sIHsgcC54KCks
IHAueSgpIH0sICB7IGEsIGIgfSwgIWFudGljbG9ja3dpc2UgfTsKKyAgICBQbGF0Zm9ybVBhdGhF
bGVtZW50IHBlKGRhdGEpOworICAgIGFwcGVuZChwZSk7Cit9CisKKwordm9pZCBQbGF0Zm9ybVBh
dGg6OmFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKQoreworICAgIG1vdmVUbyhyLmxvY2F0aW9u
KCkpOworCisgICAgZmxvYXQgcmlnaHQgPSByLnJpZ2h0KCkgLSAxOworICAgIGZsb2F0IGJvdHRv
bSA9IHIuYm90dG9tKCkgLSAxOworICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHJpZ2h0LCByLnko
KSkpOworICAgIGFkZExpbmVUbyhGbG9hdFBvaW50KHJpZ2h0LCBib3R0b20pKTsKKyAgICBhZGRM
aW5lVG8oRmxvYXRQb2ludChyLngoKSwgYm90dG9tKSk7CisgICAgYWRkTGluZVRvKHIubG9jYXRp
b24oKSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1QYXRoOjphZGRFbGxpcHNlKGNvbnN0IEZsb2F0UmVj
dCYgcikKK3sKKyAgICBGbG9hdFNpemUgcmFkaXVzKHIud2lkdGgoKSAqIDAuNSwgci5oZWlnaHQo
KSAqIDAuNSk7CisgICAgYWRkRWxsaXBzZShyLmxvY2F0aW9uKCkgKyByYWRpdXMsIHJhZGl1cy53
aWR0aCgpLCByYWRpdXMuaGVpZ2h0KCksIDAsIDAsIHRydWUpOworfQorCitTdHJpbmcgUGxhdGZv
cm1QYXRoOjpkZWJ1Z1N0cmluZygpIGNvbnN0Cit7CisgICAgU3RyaW5nIHJldDsKKyAgICBmb3Ig
KFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBpKG1fZWxlbWVudHMuYmVnaW4o
KSk7IGkgIT0gbV9lbGVtZW50cy5lbmQoKTsgKytpKSB7CisgICAgICAgIHN3aXRjaCAoaS0+cGxh
dGZvcm1UeXBlKCkpIHsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoTW92
ZVRvOgorICAgICAgICBjYXNlIFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhMaW5lVG86CisgICAg
ICAgICAgICByZXQgKz0gU3RyaW5nOjpmb3JtYXQoIk0gJWYgJWZcbiIsIGktPnBvaW50QXQoMCku
bV94LCBpLT5wb2ludEF0KDApLm1feSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2Fz
ZSBQbGF0Zm9ybVBhdGhFbGVtZW50OjpQYXRoQXJjVG86CisgICAgICAgICAgICByZXQgKz0gU3Ry
aW5nOjpmb3JtYXQoIkEgJWYgJWYgJWYgJWYgJWYgJWYgJWNcbiIKKyAgICAgICAgICAgICAgICAs
IGktPmFyY1RvKCkubV9lbmQubV94LCBpLT5hcmNUbygpLm1fZW5kLm1feQorICAgICAgICAgICAg
ICAgICwgaS0+YXJjVG8oKS5tX2NlbnRlci5tX3gsIGktPmFyY1RvKCkubV9jZW50ZXIubV95Cisg
ICAgICAgICAgICAgICAgLCBpLT5hcmNUbygpLm1fcmFkaXVzLm1feCwgaS0+YXJjVG8oKS5tX3Jh
ZGl1cy5tX3kKKyAgICAgICAgICAgICAgICAsIGktPmFyY1RvKCkubV9jbG9ja3dpc2U/ICdZJyA6
ICdOJyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBQbGF0Zm9ybVBhdGhFbGVt
ZW50OjpQYXRoUXVhZEN1cnZlVG86CisgICAgICAgICAgICByZXQgKz0gU3RyaW5nOjpmb3JtYXQo
IlEgJWYgJWYgJWYgJWZcbiIKKyAgICAgICAgICAgICAgICAsIGktPnBvaW50QXQoMCkubV94LCBp
LT5wb2ludEF0KDApLm1feQorICAgICAgICAgICAgICAgICwgaS0+cG9pbnRBdCgxKS5tX3gsIGkt
PnBvaW50QXQoMSkubV95KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFBsYXRm
b3JtUGF0aEVsZW1lbnQ6OlBhdGhCZXppZXJDdXJ2ZVRvOgorICAgICAgICAgICAgcmV0ICs9IFN0
cmluZzo6Zm9ybWF0KCJCICVmICVmICVmICVmICVmICVmXG4iCisgICAgICAgICAgICAgICAgLCBp
LT5wb2ludEF0KDApLm1feCwgaS0+cG9pbnRBdCgwKS5tX3kKKyAgICAgICAgICAgICAgICAsIGkt
PnBvaW50QXQoMSkubV94LCBpLT5wb2ludEF0KDEpLm1feQorICAgICAgICAgICAgICAgICwgaS0+
cG9pbnRBdCgyKS5tX3gsIGktPnBvaW50QXQoMikubV95KTsKKyAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQVNTRVJUKGktPnBsYXRmb3JtVHlwZSgpID09
IFBsYXRmb3JtUGF0aEVsZW1lbnQ6OlBhdGhDbG9zZVN1YnBhdGgpOworICAgICAgICAgICAgcmV0
ICs9ICJTXG4iOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gcmV0OworfQorCit2b2lkIFBsYXRmb3JtUGF0aDo6YXBwbHkodm9pZCogaW5mbywgUGF0
aEFwcGxpZXJGdW5jdGlvbiBmdW5jdGlvbikgY29uc3QKK3sKKyAgICBQYXRoRWxlbWVudCBwZWxl
bWVudDsKKyAgICBGbG9hdFBvaW50IHBvaW50c1szXTsKKyAgICBwZWxlbWVudC5wb2ludHMgPSBw
b2ludHM7CisKKyAgICBmb3IgKFBsYXRmb3JtUGF0aEVsZW1lbnRzOjpjb25zdF9pdGVyYXRvciBp
dChtX2VsZW1lbnRzLmJlZ2luKCkpOyBpdCAhPSBtX2VsZW1lbnRzLmVuZCgpOyArK2l0KSB7Cisg
ICAgICAgIHBlbGVtZW50LnR5cGUgPSBpdC0+dHlwZSgpOworICAgICAgICBpbnQgbiA9IGl0LT5u
dW1Qb2ludHMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpCisgICAgICAg
ICAgICBwb2ludHNbaV0gPSBpdC0+cG9pbnRBdChpKTsKKyAgICAgICAgZnVuY3Rpb24oaW5mbywg
JnBlbGVtZW50KTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYmNvcmUKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaCBi
L1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3Mvd2luY2UvUGxhdGZvcm1QYXRoV2luY2UuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2EwMGE3Ci0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9QbGF0Zm9ybVBhdGhXaW5jZS5oCkBA
IC0wLDAgKzEsMTc4IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1v
YmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIg
b2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg
KgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVu
IHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZuZGVmIFBsYXRmb3JtUGF0aFdpbmNlX2gKKyNkZWZp
bmUgUGxhdGZvcm1QYXRoV2luY2VfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFz
cyBHcmFwaGljc0NvbnRleHQ7CisKKyAgICBzdHJ1Y3QgUGF0aFBvaW50IHsKKyAgICAgICAgZmxv
YXQgbV94OworICAgICAgICBmbG9hdCBtX3k7CisgICAgICAgIGNvbnN0IGZsb2F0JiB4KCkgY29u
c3QgeyByZXR1cm4gbV94OyB9CisgICAgICAgIGNvbnN0IGZsb2F0JiB5KCkgY29uc3QgeyByZXR1
cm4gbV95OyB9CisgICAgICAgIHZvaWQgc2V0KGZsb2F0IHgsIGZsb2F0IHkpCisgICAgICAgIHsK
KyAgICAgICAgICAgIG1feCA9IHg7CisgICAgICAgICAgICBtX3kgPSB5OworICAgICAgICB9Owor
ICAgICAgICBvcGVyYXRvciBGbG9hdFBvaW50KCkgY29uc3QgeyByZXR1cm4gRmxvYXRQb2ludCht
X3gsIG1feSk7IH0KKyAgICAgICAgdm9pZCBtb3ZlKGNvbnN0IEZsb2F0U2l6ZSYgb2Zmc2V0KQor
ICAgICAgICB7CisgICAgICAgICAgICBtX3ggKz0gb2Zmc2V0LndpZHRoKCk7CisgICAgICAgICAg
ICBtX3kgKz0gb2Zmc2V0LmhlaWdodCgpOworICAgICAgICB9CisgICAgICAgIFBhdGhQb2ludCYg
b3BlcmF0b3I9KGNvbnN0IEZsb2F0UG9pbnQmIHApCisgICAgICAgIHsKKyAgICAgICAgICAgIG1f
eCA9IHAueCgpOworICAgICAgICAgICAgbV95ID0gcC55KCk7CisgICAgICAgICAgICByZXR1cm4g
KnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjbGVhcigpIHsgbV94ID0gbV95ID0gMDsg
fQorICAgIH07CisKKyAgICBzdHJ1Y3QgUGF0aFBvbHlnb246IHB1YmxpYyBWZWN0b3I8UGF0aFBv
aW50PiB7CisgICAgICAgIHZvaWQgbW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCk7CisgICAg
ICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICAg
ICAgYm9vbCBjb250YWlucyhjb25zdCBGbG9hdFBvaW50JiBwb2ludCkgY29uc3Q7CisgICAgfTsK
KworICAgIGNsYXNzIFBsYXRmb3JtUGF0aEVsZW1lbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAg
ZW51bSBQbGFmb3JtUGF0aEVsZW1lbnRUeXBlIHsKKyAgICAgICAgICAgIFBhdGhNb3ZlVG8sCisg
ICAgICAgICAgICBQYXRoTGluZVRvLAorICAgICAgICAgICAgUGF0aEFyY1RvLAorICAgICAgICAg
ICAgUGF0aFF1YWRDdXJ2ZVRvLAorICAgICAgICAgICAgUGF0aEJlemllckN1cnZlVG8sCisgICAg
ICAgICAgICBQYXRoQ2xvc2VTdWJwYXRoLAorICAgICAgICB9OworCisgICAgICAgIHN0cnVjdCBN
b3ZlVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAgICB9OworCisgICAg
ICAgIHN0cnVjdCBMaW5lVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fZW5kOworICAgICAg
ICB9OworCisgICAgICAgIHN0cnVjdCBBcmNUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9l
bmQ7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9jZW50ZXI7CisgICAgICAgICAgICBQYXRoUG9p
bnQgbV9yYWRpdXM7CisgICAgICAgICAgICBib29sIG1fY2xvY2t3aXNlOworICAgICAgICB9Owor
CisgICAgICAgIHN0cnVjdCBRdWFkQ3VydmVUbyB7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9w
b2ludDA7CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludDE7CisgICAgICAgIH07CisKKyAg
ICAgICAgc3RydWN0IEJlemllckN1cnZlVG8geworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9p
bnQwOworICAgICAgICAgICAgUGF0aFBvaW50IG1fcG9pbnQxOworICAgICAgICAgICAgUGF0aFBv
aW50IG1fcG9pbnQyOworICAgICAgICB9OworCisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQo
KTogbV90eXBlKFBhdGhDbG9zZVN1YnBhdGgpIHsgbV9kYXRhLm1fcG9pbnRzWzBdLnNldCgwLCAw
KTsgICAgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0IE1vdmVUbyYgZGF0YSk6
IG1fdHlwZShQYXRoTW92ZVRvKSB7IG1fZGF0YS5tX21vdmVUb0RhdGEgPSBkYXRhOyB9CisgICAg
ICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29uc3QgTGluZVRvJiBkYXRhKTogbV90eXBlKFBhdGhM
aW5lVG8pIHsgbV9kYXRhLm1fbGluZVRvRGF0YSA9IGRhdGE7IH0KKyAgICAgICAgUGxhdGZvcm1Q
YXRoRWxlbWVudChjb25zdCBBcmNUbyYgZGF0YSk6IG1fdHlwZShQYXRoQXJjVG8pIHsgbV9kYXRh
Lm1fYXJjVG9EYXRhID0gZGF0YTsgfQorICAgICAgICBQbGF0Zm9ybVBhdGhFbGVtZW50KGNvbnN0
IFF1YWRDdXJ2ZVRvJiBkYXRhKTogbV90eXBlKFBhdGhRdWFkQ3VydmVUbykgeyBtX2RhdGEubV9x
dWFkQ3VydmVUb0RhdGEgPSBkYXRhOyB9CisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnQoY29u
c3QgQmV6aWVyQ3VydmVUbyYgZGF0YSk6IG1fdHlwZShQYXRoQmV6aWVyQ3VydmVUbykgeyBtX2Rh
dGEubV9iZXppZXJDdXJ2ZVRvRGF0YSA9IGRhdGE7IH0KKworICAgICAgICBjb25zdCBNb3ZlVG8m
IG1vdmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX21vdmVUb0RhdGE7IH0KKyAgICAgICAg
Y29uc3QgTGluZVRvJiBsaW5lVG8oKSBjb25zdCB7IHJldHVybiBtX2RhdGEubV9saW5lVG9EYXRh
OyB9CisgICAgICAgIGNvbnN0IEFyY1RvJiBhcmNUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5t
X2FyY1RvRGF0YTsgfQorICAgICAgICBjb25zdCBRdWFkQ3VydmVUbyYgcXVhZEN1cnZlVG8oKSBj
b25zdCB7IHJldHVybiBtX2RhdGEubV9xdWFkQ3VydmVUb0RhdGE7IH0KKyAgICAgICAgY29uc3Qg
QmV6aWVyQ3VydmVUbyYgYmV6aWVyQ3VydmVUbygpIGNvbnN0IHsgcmV0dXJuIG1fZGF0YS5tX2Jl
emllckN1cnZlVG9EYXRhOyB9CisgICAgICAgIGNvbnN0IFBhdGhQb2ludCYgbGFzdFBvaW50KCkg
Y29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgaW50IG4gPSBudW1Qb2ludHMoKTsKKyAgICAg
ICAgICAgIHJldHVybiBuID4gMSA/IG1fZGF0YS5tX3BvaW50c1tuIC0gMV0gOiBtX2RhdGEubV9w
b2ludHNbMF07CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgUGF0aFBvaW50JiBwb2ludEF0KGlu
dCBpbmRleCkgY29uc3QgeyByZXR1cm4gbV9kYXRhLm1fcG9pbnRzW2luZGV4XTsgfQorICAgICAg
ICBpbnQgbnVtUG9pbnRzKCkgY29uc3Q7CisgICAgICAgIGludCBudW1Db250cm9sUG9pbnRzKCkg
Y29uc3Q7CisgICAgICAgIHZvaWQgbW92ZShjb25zdCBGbG9hdFNpemUmIG9mZnNldCk7CisgICAg
ICAgIHZvaWQgdHJhbnNmb3JtKGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0KTsKKyAgICAg
ICAgUGF0aEVsZW1lbnRUeXBlIHR5cGUoKSBjb25zdDsKKyAgICAgICAgUGxhZm9ybVBhdGhFbGVt
ZW50VHlwZSBwbGF0Zm9ybVR5cGUoKSBjb25zdCB7IHJldHVybiBtX3R5cGU7IH0KKyAgICAgICAg
dm9pZCBpbmZsYXRlUmVjdFRvQ29udGFpbk1lKEZsb2F0UmVjdCYgciwgY29uc3QgRmxvYXRQb2lu
dCYgbGFzdFBvaW50KSBjb25zdDsKKworICAgIHByaXZhdGU6CisgICAgICAgIFBsYWZvcm1QYXRo
RWxlbWVudFR5cGUgbV90eXBlOworICAgICAgICB1bmlvbiB7CisgICAgICAgICAgICBNb3ZlVG8g
bV9tb3ZlVG9EYXRhOworICAgICAgICAgICAgTGluZVRvIG1fbGluZVRvRGF0YTsKKyAgICAgICAg
ICAgIEFyY1RvIG1fYXJjVG9EYXRhOworICAgICAgICAgICAgUXVhZEN1cnZlVG8gbV9xdWFkQ3Vy
dmVUb0RhdGE7CisgICAgICAgICAgICBCZXppZXJDdXJ2ZVRvIG1fYmV6aWVyQ3VydmVUb0RhdGE7
CisgICAgICAgICAgICBQYXRoUG9pbnQgbV9wb2ludHNbNF07CisgICAgICAgIH0gbV9kYXRhOwor
ICAgIH07CisKKyAgICB0eXBlZGVmIFZlY3RvcjxQbGF0Zm9ybVBhdGhFbGVtZW50PiBQbGF0Zm9y
bVBhdGhFbGVtZW50czsKKworICAgIGNsYXNzIFBsYXRmb3JtUGF0aCB7CisgICAgcHVibGljOgor
ICAgICAgICBQbGF0Zm9ybVBhdGgoKTsKKyAgICAgICAgY29uc3QgUGxhdGZvcm1QYXRoRWxlbWVu
dHMmIGVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gbV9lbGVtZW50czsgfQorICAgICAgICB2b2lk
IGFwcGVuZChjb25zdCBQbGF0Zm9ybVBhdGhFbGVtZW50JiBlKTsKKyAgICAgICAgdm9pZCBhcHBl
bmQoY29uc3QgUGxhdGZvcm1QYXRoJiBwKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworICAgICAg
ICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBtX2VsZW1lbnRzLmlzRW1wdHkoKTsgfQor
CisgICAgICAgIHZvaWQgc3Ryb2tlUGF0aChIREMsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4
KiB0cikgY29uc3Q7CisgICAgICAgIHZvaWQgZmlsbFBhdGgoSERDLCBjb25zdCBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCogdHIpIGNvbnN0OworICAgICAgICBGbG9hdFBvaW50IGxhc3RQb2ludCgpIGNv
bnN0IHsgcmV0dXJuIG1fZWxlbWVudHMuaXNFbXB0eSgpID8gRmxvYXRQb2ludCgwLCAwKSA6IG1f
ZWxlbWVudHMubGFzdCgpLmxhc3RQb2ludCgpOyB9CisKKyAgICAgICAgY29uc3QgRmxvYXRSZWN0
JiBib3VuZGluZ1JlY3QoKSBjb25zdCB7IHJldHVybiBtX2JvdW5kaW5nUmVjdDsgfQorICAgICAg
ICBib29sIGNvbnRhaW5zKGNvbnN0IEZsb2F0UG9pbnQmIHBvaW50LCBXaW5kUnVsZSBydWxlKSBj
b25zdDsKKyAgICAgICAgdm9pZCB0cmFuc2xhdGUoY29uc3QgRmxvYXRTaXplJiBzaXplKTsKKyAg
ICAgICAgdm9pZCB0cmFuc2Zvcm0oY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHQpOworCisg
ICAgICAgIHZvaWQgbW92ZVRvKGNvbnN0IEZsb2F0UG9pbnQmKTsKKyAgICAgICAgdm9pZCBhZGRM
aW5lVG8oY29uc3QgRmxvYXRQb2ludCYpOworICAgICAgICB2b2lkIGFkZFF1YWRDdXJ2ZVRvKGNv
bnN0IEZsb2F0UG9pbnQmIGNvbnRyb2xQb2ludCwgY29uc3QgRmxvYXRQb2ludCYgcG9pbnQpOwor
ICAgICAgICB2b2lkIGFkZEJlemllckN1cnZlVG8oY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBv
aW50MSwgY29uc3QgRmxvYXRQb2ludCYgY29udHJvbFBvaW50MiwgY29uc3QgRmxvYXRQb2ludCYp
OworICAgICAgICB2b2lkIGFkZEFyY1RvKGNvbnN0IEZsb2F0UG9pbnQmLCBjb25zdCBGbG9hdFBv
aW50JiwgZmxvYXQgcmFkaXVzKTsKKyAgICAgICAgdm9pZCBjbG9zZVN1YnBhdGgoKTsKKyAgICAg
ICAgdm9pZCBhZGRFbGxpcHNlKGNvbnN0IEZsb2F0UG9pbnQmIHAsIGZsb2F0IGEsIGZsb2F0IGIs
IGZsb2F0IHNhciwgZmxvYXQgZWFyLCBib29sIGFudGljbG9ja3dpc2UpOworICAgICAgICB2b2lk
IGFkZFJlY3QoY29uc3QgRmxvYXRSZWN0JiByKTsKKyAgICAgICAgdm9pZCBhZGRFbGxpcHNlKGNv
bnN0IEZsb2F0UmVjdCYgcik7CisgICAgICAgIFN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0Owor
ICAgICAgICB2b2lkIGFwcGx5KHZvaWQqIGluZm8sIFBhdGhBcHBsaWVyRnVuY3Rpb24gZnVuY3Rp
b24pIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBlbnN1cmVTdWJwYXRoKCk7
CisgICAgICAgIHZvaWQgYWRkVG9TdWJwYXRoKGNvbnN0IFBsYXRmb3JtUGF0aEVsZW1lbnQmIGUp
OworCisgICAgICAgIFBsYXRmb3JtUGF0aEVsZW1lbnRzIG1fZWxlbWVudHM7CisgICAgICAgIEZs
b2F0UmVjdCBtX2JvdW5kaW5nUmVjdDsKKyAgICAgICAgVmVjdG9yPFBhdGhQb2x5Z29uPiBtX3N1
YnBhdGhzOworICAgICAgICBQYXRoUG9pbnQgbV9jdXJyZW50UG9pbnQ7CisgICAgICAgIGJvb2wg
bV9wZW5MaWZ0ZWQ7CisgICAgfTsKKworfQorCisjZW5kaWYgLy8gUGxhdGZvcm1QYXRoV2luY2Vf
aApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9XaW5jZUdyYXBo
aWNzRXh0cmFzLmggYi9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL3dpbmNlL1dpbmNlR3JhcGhp
Y3NFeHRyYXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTZmYWUxCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy93aW5jZS9XaW5jZUdy
YXBoaWNzRXh0cmFzLmgKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIw
MDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiAgTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBs
YXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgor
ICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBXaW5jZUdyYXBo
aWNzRXh0cmFzX2gKKyNkZWZpbmUgV2luY2VHcmFwaGljc0V4dHJhc19oCisKKy8vIFRoaXMgZmls
ZSBpcyB1c2VkIHRvIGNvbnRhaW4gc21hbGwgdXRpbGl0aWVzIHVzZWQgYnkgV0lOQ0UgZ3JhcGhp
Y3MgY29kZS4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIC8vIEFsd2F5cyByb3VuZCB0byBz
YW1lIGRpcmVjdGlvbi4gMC41IGlzIHJvdW5kZWQgdG8gMSwKKyAgICAvLyBhbmQgLTAuNSAoMC41
IC0gMSkgaXMgcm91bmRlZCB0byAwICgxIC0gMSksIHNvIHRoYXQgaXQKKyAgICAvLyBpcyBjb25z
aXN0ZW50IHdoZW4gdHJhbnNmb3JtYXRpb24gc2hpZnRzLgorICAgIHN0YXRpYyBpbmxpbmUgaW50
IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQorICAgIHsKKyAgICAgICAgaWYgKGQgPiAwKQorICAgICAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICAgICAgaW50IGkg
PSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgICAgICByZXR1cm4gaSAtIGQgPiAwLjUgPyBpIC0g
MSA6IGk7CisgICAgfQorfQorCisjZW5kaWYgV2luY2VHcmFwaGljc0V4dHJhc19oCg==
</data>
<flag name="review"
          id="18820"
          type_id="1"
          status="+"
          setter="manyoso"
    />
          </attachment>
      

    </bug>

</bugzilla>