<?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>94702</bug_id>
          
          <creation_ts>2012-08-22 06:31:34 -0700</creation_ts>
          <short_desc>[Qt] Port the Qt pixmap JS bindings to use the JSC C API</short_desc>
          <delta_ts>2012-09-03 23:38:01 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>60842</blocked>
    
    <blocked>95570</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Hausmann">hausmann</reporter>
          <assigned_to name="Simon Hausmann">hausmann</assigned_to>
          <cc>cmarcelo</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>701844</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-08-22 06:31:34 -0700</bug_when>
    <thetext>[Qt] Port the Qt pixmap JS bindings to use the JSC C API</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>701848</commentid>
    <comment_count>1</comment_count>
      <attachid>159922</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-08-22 06:34:03 -0700</bug_when>
    <thetext>Created attachment 159922
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>701870</commentid>
    <comment_count>2</comment_count>
      <attachid>159922</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-08-22 07:07:13 -0700</bug_when>
    <thetext>Comment on attachment 159922
Patch

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

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:137
&gt; +    // we now know that we have a valid &lt;img&gt; element as the argument, we can attach the image to it.

uppercase?

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:155
&gt; +    copyPixels(image, width, height, imageData-&gt;data()-&gt;data());

copyPixelsInto ?

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:171
&gt; +    JSStringRelease(str);
&gt; +    return value;

I still prefer a newline before return

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:178
&gt; +    QString stringValue = QString::fromLatin1(&quot;[Qt Native Pixmap %1,%2]&quot;).arg(size.width()).arg(size.height());

[Qt Native Pixmap ? why is that a good description? toString of an images normally doesnt give size does it?

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:207
&gt; +        if (hint == qMetaTypeId&lt;QPixmap&gt;())
&gt; +            return QVariant::fromValue&lt;QPixmap&gt;(toPixmap(*originalVariant));
&gt;  
&gt; -        if (!imageElement)
&gt; -            goto returnEmptyVariant;
&gt; +        if (hint == qMetaTypeId&lt;QImage&gt;())
&gt; +            return QVariant::fromValue&lt;QImage&gt;(toImage(*originalVariant));

You had the opposite conversion in a separate method earlier</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>702218</commentid>
    <comment_count>3</comment_count>
      <attachid>159922</attachid>
    <who name="Caio Marcelo de Oliveira Filho">cmarcelo</who>
    <bug_when>2012-08-22 12:36:46 -0700</bug_when>
    <thetext>Comment on attachment 159922
Patch

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

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:109
&gt; +static JSValueRef getPixmapWidth(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)

No need for &quot;propertyName&quot; and &quot;exception&quot;.

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:143
&gt; +    toJS(exec, global, imageElement-&gt;document());

Ignoring the return value of the toJS() call seems weird here. Does this have a wanted side-effect? Or maybe this is just a typo / leftover from the past?

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:196
&gt; +    JSObject* jsObject;
&gt; +    JSHTMLImageElement* elementJSWrapper;
&gt; +    HTMLImageElement* imageElement;
&gt; +    CachedImage* cachedImage;
&gt; +    Image* image;
&gt; +    QImage* nativeImage;

Why declare them here instead of in first use definition?

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:199
&gt;          goto returnEmptyVariant;

Just an idea: what about &quot;return emptyVariantForHint(hint)&quot; and the code after &quot;returnEmptyVariant&quot; label becomes a function?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707300</commentid>
    <comment_count>4</comment_count>
      <attachid>159922</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-08-29 04:21:16 -0700</bug_when>
    <thetext>Comment on attachment 159922
Patch

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

&gt; Source/WebCore/ChangeLog:11
&gt; +        The conversion uses a simple JSClassRef based binding and only a few
&gt; +        uses of private JSC API for the HTML element DOM bindings remain.

I&apos;ll try to be a bit more elaborate here in the next patch.

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:109
&gt;&gt; +static JSValueRef getPixmapWidth(JSContextRef context, JSObjectRef object, JSStringRef propertyName, JSValueRef* exception)
&gt; 
&gt; No need for &quot;propertyName&quot; and &quot;exception&quot;.

The parameters are required as part of the JSObjectGetPropertyCallback signature, but I&apos;ve removed their names now from both getters.

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:137
&gt;&gt; +    // we now know that we have a valid &lt;img&gt; element as the argument, we can attach the image to it.
&gt; 
&gt; uppercase?

Done

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:143
&gt;&gt; +    toJS(exec, global, imageElement-&gt;document());
&gt; 
&gt; Ignoring the return value of the toJS() call seems weird here. Does this have a wanted side-effect? Or maybe this is just a typo / leftover from the past?

That does seem rather bogus. I&apos;ll remove it :)

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:155
&gt;&gt; +    copyPixels(image, width, height, imageData-&gt;data()-&gt;data());
&gt; 
&gt; copyPixelsInto ?

Good idea :) Done.

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:171
&gt;&gt; +    return value;
&gt; 
&gt; I still prefer a newline before return

Done. And also used a JSRetainPtr for the string (before Caio sees it ;)

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:178
&gt;&gt; +    QString stringValue = QString::fromLatin1(&quot;[Qt Native Pixmap %1,%2]&quot;).arg(size.width()).arg(size.height());
&gt; 
&gt; [Qt Native Pixmap ? why is that a good description? toString of an images normally doesnt give size does it?

This is almost exclusively used for debug output, so I think it&apos;s a convenient output format for debugging.

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:196
&gt;&gt; +    QImage* nativeImage;
&gt; 
&gt; Why declare them here instead of in first use definition?

Well spotted!

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:199
&gt;&gt;          goto returnEmptyVariant;
&gt; 
&gt; Just an idea: what about &quot;return emptyVariantForHint(hint)&quot; and the code after &quot;returnEmptyVariant&quot; label becomes a function?

Hmm. Tempting. I&apos;ll give it a shot. With tail call optimization it might not be so bad, but I kind of liked the goto :)

&gt;&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:207
&gt;&gt; +            return QVariant::fromValue&lt;QImage&gt;(toImage(*originalVariant));
&gt; 
&gt; You had the opposite conversion in a separate method earlier

I don&apos;t quite understand :). What do you mean?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707305</commentid>
    <comment_count>5</comment_count>
      <attachid>159922</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-08-29 04:24:22 -0700</bug_when>
    <thetext>Comment on attachment 159922
Patch

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

&gt; Source/WebCore/bridge/qt/qt_pixmapruntime.cpp:186
&gt; +    return JSObjectMake(context, getClassRef(), new QVariant(value));

As it turns out, this is also a leak, because we&apos;re missing a finalize callback that deletes the variant.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>707315</commentid>
    <comment_count>6</comment_count>
      <attachid>161183</attachid>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-08-29 04:35:23 -0700</bug_when>
    <thetext>Created attachment 161183
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>710722</commentid>
    <comment_count>7</comment_count>
    <who name="Caio Marcelo de Oliveira Filho">cmarcelo</who>
    <bug_when>2012-09-03 11:18:34 -0700</bug_when>
    <thetext>LGTM.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>710723</commentid>
    <comment_count>8</comment_count>
      <attachid>161183</attachid>
    <who name="Kenneth Rohde Christiansen">kenneth</who>
    <bug_when>2012-09-03 11:20:47 -0700</bug_when>
    <thetext>Comment on attachment 161183
Patch

to me too</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>710837</commentid>
    <comment_count>9</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2012-09-03 23:38:01 -0700</bug_when>
    <thetext>Committed r127440: &lt;http://trac.webkit.org/changeset/127440&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>159922</attachid>
            <date>2012-08-22 06:34:03 -0700</date>
            <delta_ts>2012-08-29 04:35:18 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-94702-20120822153529.patch</filename>
            <type>text/plain</type>
            <size>29069</size>
            <attacher name="Simon Hausmann">hausmann</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI2MjkwCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggOTI5NmU1NTUyZDg2OGNk
ZTAxMTZhZWRiYWI5Njg3Y2NmOTk1YmYwNy4uOWY1ZTkzOTQ0ZTk3ZTg2NzU2MWRiYTJhZGNkOTI3
YTNiMTA2MGY4YiAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDM4IEBACiAyMDEyLTA4LTIyICBTaW1v
biBIYXVzbWFubiAgPHNpbW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KIAorICAgICAgICBbUXRdIFBv
cnQgdGhlIFF0IHBpeG1hcCBKUyBiaW5kaW5ncyB0byB1c2UgdGhlIEpTQyBDIEFQSQorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTQ3MDIKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBCYXNlZCBvbiBwYXRjaCBi
eSBOb2FtIFJvc2VudGhhbC4KKworICAgICAgICBUaGUgY29udmVyc2lvbiB1c2VzIGEgc2ltcGxl
IEpTQ2xhc3NSZWYgYmFzZWQgYmluZGluZyBhbmQgb25seSBhIGZldworICAgICAgICB1c2VzIG9m
IHByaXZhdGUgSlNDIEFQSSBmb3IgdGhlIEhUTUwgZWxlbWVudCBET00gYmluZGluZ3MgcmVtYWlu
LgorCisgICAgICAgICogYnJpZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuY3BwOgorICAgICAgICAo
SlNDOjpCaW5kaW5nczo6Y29weVBpeGVscyk6CisgICAgICAgIChKU0M6OkJpbmRpbmdzOjp0b1Bp
eG1hcCk6CisgICAgICAgIChKU0M6OkJpbmRpbmdzOjp0b0ltYWdlKToKKyAgICAgICAgKEpTQzo6
QmluZGluZ3M6OmltYWdlU2l6ZUZvclZhcmlhbnQpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6
Z2V0UGl4bWFwV2lkdGgpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6Z2V0UGl4bWFwSGVpZ2h0
KToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OmFzc2lnblRvSFRNTEltYWdlRWxlbWVudCk6Cisg
ICAgICAgIChKU0M6OkJpbmRpbmdzOjpwaXhtYXBUb0ltYWdlRGF0YSk6CisgICAgICAgIChKU0M6
OkJpbmRpbmdzOjpwaXhtYXBUb0RhdGFVcmwpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6cGl4
bWFwVG9TdHJpbmcpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6UXRQaXhtYXBSdW50aW1lOjp0
b0pTKToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OlF0UGl4bWFwUnVudGltZTo6dG9RdCk6Cisg
ICAgICAgIChKU0M6OkJpbmRpbmdzOjpRdFBpeG1hcFJ1bnRpbWU6OmNhbkhhbmRsZSk6CisgICAg
ICAgIChKU0M6OkJpbmRpbmdzOjpRdFBpeG1hcFJ1bnRpbWU6OmdldENsYXNzUmVmKToKKyAgICAg
ICAgKiBicmlkZ2UvcXQvcXRfcGl4bWFwcnVudGltZS5oOgorICAgICAgICAoUXRQaXhtYXBSdW50
aW1lKToKKyAgICAgICAgKiBicmlkZ2UvcXQvcXRfcnVudGltZS5jcHA6CisgICAgICAgIChKU0M6
OkJpbmRpbmdzOjpjb252ZXJ0VmFsdWVUb1FWYXJpYW50KToKKyAgICAgICAgKEpTQzo6QmluZGlu
Z3M6OmNvbnZlcnRRVmFyaWFudFRvVmFsdWUpOgorCisyMDEyLTA4LTIyICBTaW1vbiBIYXVzbWFu
biAgPHNpbW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KKwogICAgICAgICBbUXRdIFBvcnQgY29udmVy
dFZhbHVlVG9RVmFyaWFudCB0byB1c2UgdGhlIEpTQyBDIEFQSQogICAgICAgICBodHRwczovL2J1
Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTQ2OTUKIApkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvYnJpZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuY3BwIGIvU291cmNlL1dlYkNvcmUv
YnJpZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuY3BwCmluZGV4IGEyZGFhZGE4MzFlMGJjNGU3ZDg3
NWQzMDAxMDllOTQ5ODAzZWIyMjcuLmFhMTVlZmYzNTk0ZTg5MjU4MmEzMTUzNjEzNjVhMzM5NGM1
MjJlMDQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9waXhtYXBydW50
aW1lLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvcXQvcXRfcGl4bWFwcnVudGltZS5j
cHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJxdF9w
aXhtYXBydW50aW1lLmgiCiAKKyNpbmNsdWRlICJBUElDYXN0LmgiCiAjaW5jbHVkZSAiQ2FjaGVk
SW1hZ2UuaCIKICNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCiAjaW5jbHVkZSAiSW1hZ2VE
YXRhLmgiCkBAIC0yNyw4ICsyOCw3IEBACiAjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKICNp
bmNsdWRlICJKU0hUTUxJbWFnZUVsZW1lbnQuaCIKICNpbmNsdWRlICJKU0ltYWdlRGF0YS5oIgot
I2luY2x1ZGUgIkpTTG9jay5oIgotI2luY2x1ZGUgIk9iamVjdFByb3RvdHlwZS5oIgorI2luY2x1
ZGUgIkphdmFTY3JpcHQuaCIKICNpbmNsdWRlICJTdGlsbEltYWdlUXQuaCIKICNpbmNsdWRlIDxR
dEVuZGlhbj4KICNpbmNsdWRlIDxRQnVmZmVyPgpAQCAtMzcsMzk4ICszNywyMzggQEAKICNpbmNs
dWRlIDxRSW1hZ2U+CiAjaW5jbHVkZSA8UVBpeG1hcD4KICNpbmNsdWRlIDxRVmFyaWFudD4KLSNp
bmNsdWRlIDxydW50aW1lX21ldGhvZC5oPgotI2luY2x1ZGUgPHJ1bnRpbWVfb2JqZWN0Lmg+Ci0j
aW5jbHVkZSA8cnVudGltZV9yb290Lmg+Ci0jaW5jbHVkZSAicnVudGltZS9GdW5jdGlvblByb3Rv
dHlwZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgV2ViQ29yZTsKIG5hbWVzcGFjZSBKU0MgewogCiBu
YW1lc3BhY2UgQmluZGluZ3MgewogCi1jbGFzcyBRdFBpeG1hcENsYXNzIDogcHVibGljIENsYXNz
IHsKLXB1YmxpYzoKLSAgICBRdFBpeG1hcENsYXNzKCk7Ci0gICAgdmlydHVhbCBNZXRob2RMaXN0
IG1ldGhvZHNOYW1lZChQcm9wZXJ0eU5hbWUsIEluc3RhbmNlKikgY29uc3Q7Ci0gICAgdmlydHVh
bCBGaWVsZCogZmllbGROYW1lZChQcm9wZXJ0eU5hbWUsIEluc3RhbmNlKikgY29uc3Q7Ci19Owot
Ci0KLWNsYXNzIFF0UGl4bWFwV2lkdGhGaWVsZCA6IHB1YmxpYyBGaWVsZCB7Ci1wdWJsaWM6Ci0g
ICAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybiAid2lkdGgiOyB9Ci0gICAgdmly
dHVhbCBKU1ZhbHVlIHZhbHVlRnJvbUluc3RhbmNlKEV4ZWNTdGF0ZSosIGNvbnN0IEluc3RhbmNl
KiBpbnN0YW5jZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBqc051bWJlcihzdGF0aWNf
Y2FzdDxjb25zdCBRdFBpeG1hcEluc3RhbmNlKj4oaW5zdGFuY2UpLT53aWR0aCgpKTsKLSAgICB9
Ci0gICAgdmlydHVhbCB2b2lkIHNldFZhbHVlVG9JbnN0YW5jZShFeGVjU3RhdGUqLCBjb25zdCBJ
bnN0YW5jZSosIEpTVmFsdWUpIGNvbnN0IHt9Ci19OwotCi1jbGFzcyBRdFBpeG1hcEhlaWdodEZp
ZWxkIDogcHVibGljIEZpZWxkIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgY2hhciogbmFt
ZSgpIHsgcmV0dXJuICJoZWlnaHQiOyB9Ci0gICAgdmlydHVhbCBKU1ZhbHVlIHZhbHVlRnJvbUlu
c3RhbmNlKEV4ZWNTdGF0ZSosIGNvbnN0IEluc3RhbmNlKiBpbnN0YW5jZSkgY29uc3QKLSAgICB7
Ci0gICAgICAgIHJldHVybiBqc051bWJlcihzdGF0aWNfY2FzdDxjb25zdCBRdFBpeG1hcEluc3Rh
bmNlKj4oaW5zdGFuY2UpLT5oZWlnaHQoKSk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBzZXRW
YWx1ZVRvSW5zdGFuY2UoRXhlY1N0YXRlKiwgY29uc3QgSW5zdGFuY2UqLCBKU1ZhbHVlKSBjb25z
dCB7fQotfTsKLQotY2xhc3MgUXRQaXhtYXBSdW50aW1lTWV0aG9kIDogcHVibGljIE1ldGhvZCB7
Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCBpbnQgbnVtUGFyYW1ldGVycygpIGNvbnN0Ci0gICAgewot
ICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgdmlydHVhbCBKU1ZhbHVlIGludm9rZShFeGVj
U3RhdGUqIGV4ZWMsIFF0UGl4bWFwSW5zdGFuY2UqKSA9IDA7Ci0KLX07Ci0KLWNsYXNzIFF0UGl4
bWFwVG9JbWFnZURhdGFNZXRob2QgOiBwdWJsaWMgUXRQaXhtYXBSdW50aW1lTWV0aG9kIHsKLXB1
YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgY2hhciogbmFtZSgpIHsgcmV0dXJuICJ0b0ltYWdlRGF0
YSI7IH0KLSAgICBKU1ZhbHVlIGludm9rZShFeGVjU3RhdGUqIGV4ZWMsIFF0UGl4bWFwSW5zdGFu
Y2UqIGluc3RhbmNlKQotICAgIHsKLSAgICAgICAgaW50IHdpZHRoID0gaW5zdGFuY2UtPndpZHRo
KCk7Ci0gICAgICAgIGludCBoZWlnaHQgPSBpbnN0YW5jZS0+aGVpZ2h0KCk7Ci0gICAgICAgIFJl
ZlB0cjxJbWFnZURhdGE+IGltYWdlRGF0YSA9IEltYWdlRGF0YTo6Y3JlYXRlKEludFNpemUod2lk
dGgsIGhlaWdodCkpOwotICAgICAgICBjb3B5UGl4ZWxzKGluc3RhbmNlLT50b0ltYWdlKCksIHdp
ZHRoLCBoZWlnaHQsIGltYWdlRGF0YS0+ZGF0YSgpLT5kYXRhKCkpOwotICAgICAgICByZXR1cm4g
dG9KUyhleGVjLCBzdGF0aWNfY2FzdDxKU0RPTUdsb2JhbE9iamVjdCo+KGV4ZWMtPmxleGljYWxH
bG9iYWxPYmplY3QoKSksIGltYWdlRGF0YS5nZXQoKSk7Ci0gICAgfQotcHJpdmF0ZToKLSAgICB2
b2lkIGNvcHlQaXhlbHMoY29uc3QgUUltYWdlJiBzb3VyY2VJbWFnZSwgaW50IHdpZHRoLCBpbnQg
aGVpZ2h0LCB1bnNpZ25lZCBjaGFyKiBkZXN0UGl4ZWxzKQotICAgIHsKLSAgICAgICAgUUltYWdl
IGltYWdlKHNvdXJjZUltYWdlKTsKLSAgICAgICAgc3dpdGNoIChpbWFnZS5mb3JtYXQoKSkgewot
ICAgICAgICBjYXNlIFFJbWFnZTo6Rm9ybWF0X1JHQjg4ODoKLSAgICAgICAgICAgIGZvciAoaW50
IHkgPSAwOyB5IDwgaGVpZ2h0OyB5KyspIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1Y2hhciog
c2NhbkxpbmUgPSBpbWFnZS5zY2FuTGluZSh5KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4
ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgKihkZXN0UGl4ZWxz
KyspID0gKihzY2FuTGluZSsrKTsKLSAgICAgICAgICAgICAgICAgICAgKihkZXN0UGl4ZWxzKysp
ID0gKihzY2FuTGluZSsrKTsKLSAgICAgICAgICAgICAgICAgICAgKihkZXN0UGl4ZWxzKyspID0g
KihzY2FuTGluZSsrKTsKLSAgICAgICAgICAgICAgICAgICAgKihkZXN0UGl4ZWxzKyspID0gMHhG
RjsKLSAgICAgICAgICAgICAgICB9CitzdGF0aWMgdm9pZCBjb3B5UGl4ZWxzKGNvbnN0IFFJbWFn
ZSYgc291cmNlSW1hZ2UsIGludCB3aWR0aCwgaW50IGhlaWdodCwgdW5zaWduZWQgY2hhciogZGVz
dFBpeGVscykKK3sKKyAgICBRSW1hZ2UgaW1hZ2Uoc291cmNlSW1hZ2UpOworICAgIHN3aXRjaCAo
aW1hZ2UuZm9ybWF0KCkpIHsKKyAgICBjYXNlIFFJbWFnZTo6Rm9ybWF0X1JHQjg4ODoKKyAgICAg
ICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgY29uc3Qg
dWNoYXIqIHNjYW5MaW5lID0gaW1hZ2Uuc2NhbkxpbmUoeSk7CisgICAgICAgICAgICBmb3IgKGlu
dCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAgICAgICAgICAgICAgICAqKGRlc3RQaXhlbHMr
KykgPSAqKHNjYW5MaW5lKyspOworICAgICAgICAgICAgICAgICooZGVzdFBpeGVscysrKSA9ICoo
c2NhbkxpbmUrKyk7CisgICAgICAgICAgICAgICAgKihkZXN0UGl4ZWxzKyspID0gKihzY2FuTGlu
ZSsrKTsKKyAgICAgICAgICAgICAgICAqKGRlc3RQaXhlbHMrKykgPSAweEZGOwogICAgICAgICAg
ICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBp
bWFnZSA9IGltYWdlLmNvbnZlcnRUb0Zvcm1hdChRSW1hZ2U6OkZvcm1hdF9BUkdCMzIpOwotICAg
ICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0gICAgICAgIGNhc2UgUUltYWdlOjpGb3JtYXRfUkdC
MzI6Ci0gICAgICAgIGNhc2UgUUltYWdlOjpGb3JtYXRfQVJHQjMyOgotICAgICAgICAgICAgZm9y
IChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotICAgICAgICAgICAgICAgIGNvbnN0IHF1
aW50MzIqIHNjYW5MaW5lID0gcmVpbnRlcnByZXRfY2FzdF9wdHI8Y29uc3QgcXVpbnQzMio+KGlt
YWdlLnNjYW5MaW5lKHkpKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdp
ZHRoOyB4KyspIHsKLSAgICAgICAgICAgICAgICAgICAgUVJnYiBwaXhlbCA9IHNjYW5MaW5lW3hd
OwotICAgICAgICAgICAgICAgICAgICBxVG9CaWdFbmRpYW48cXVpbnQzMj4oKHBpeGVsIDw8IDgp
IHwgcUFscGhhKHBpeGVsKSwgZGVzdFBpeGVscyk7Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RQ
aXhlbHMgKz0gNDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7
CisgICAgZGVmYXVsdDoKKyAgICAgICAgaW1hZ2UgPSBpbWFnZS5jb252ZXJ0VG9Gb3JtYXQoUUlt
YWdlOjpGb3JtYXRfQVJHQjMyKTsKKyAgICAgICAgLy8gRmFsbCB0aHJvdWdoCisgICAgY2FzZSBR
SW1hZ2U6OkZvcm1hdF9SR0IzMjoKKyAgICBjYXNlIFFJbWFnZTo6Rm9ybWF0X0FSR0IzMjoKKyAg
ICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgeworICAgICAgICAgICAgY29u
c3QgcXVpbnQzMiogc2NhbkxpbmUgPSByZWludGVycHJldF9jYXN0X3B0cjxjb25zdCBxdWludDMy
Kj4oaW1hZ2Uuc2NhbkxpbmUoeSkpOworICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3
aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAgUVJnYiBwaXhlbCA9IHNjYW5MaW5lW3hdOwor
ICAgICAgICAgICAgICAgIHFUb0JpZ0VuZGlhbjxxdWludDMyPigocGl4ZWwgPDwgOCkgfCBxQWxw
aGEocGl4ZWwpLCBkZXN0UGl4ZWxzKTsKKyAgICAgICAgICAgICAgICBkZXN0UGl4ZWxzICs9IDQ7
CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBi
cmVhazsKICAgICB9Ci19OwotCi0vLyB0aGlzIGZ1bmN0aW9uIHJlY2VpdmVzIGFuIEhUTUwgaW1h
Z2UgZWxlbWVudCBhcyBhIHBhcmFtZXRlciwgbWFrZXMgaXQgZGlzcGxheSB0aGUgcGl4bWFwL2lt
YWdlIGZyb20gUXQKLWNsYXNzIFF0UGl4bWFwQXNzaWduVG9FbGVtZW50TWV0aG9kIDogcHVibGlj
IFF0UGl4bWFwUnVudGltZU1ldGhvZCB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIq
IG5hbWUoKSB7IHJldHVybiAiYXNzaWduVG9IVE1MSW1hZ2VFbGVtZW50IjsgfQotICAgIEpTVmFs
dWUgaW52b2tlKEV4ZWNTdGF0ZSogZXhlYywgUXRQaXhtYXBJbnN0YW5jZSogaW5zdGFuY2UpCi0g
ICAgewotICAgICAgICBpZiAoIWV4ZWMtPmFyZ3VtZW50Q291bnQoKSkKLSAgICAgICAgICAgIHJl
dHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgICAgIEpTT2JqZWN0KiBvYmplY3RBcmcgPSBleGVj
LT5hcmd1bWVudCgwKS50b09iamVjdChleGVjKTsKLSAgICAgICAgaWYgKCFvYmplY3RBcmcpCi0g
ICAgICAgICAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKLQotICAgICAgICBpZiAoIW9iamVjdEFy
Zy0+aW5oZXJpdHMoJkpTSFRNTEltYWdlRWxlbWVudDo6c19pbmZvKSkKLSAgICAgICAgICAgIHJl
dHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgICAgIC8vIHdlIG5vdyBrbm93IHRoYXQgd2UgaGF2
ZSBhIHZhbGlkIDxpbWc+IGVsZW1lbnQgYXMgdGhlIGFyZ3VtZW50LCB3ZSBjYW4gYXR0YWNoIHRo
ZSBpbWFnZSB0byBpdC4KLSAgICAgICAgUmVmUHRyPFN0aWxsSW1hZ2U+IHN0aWxsSW1hZ2UgPSBX
ZWJDb3JlOjpTdGlsbEltYWdlOjpjcmVhdGUoaW5zdGFuY2UtPnRvSW1hZ2UoKSk7Ci0gICAgICAg
IEhUTUxJbWFnZUVsZW1lbnQqIGltYWdlRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVs
ZW1lbnQqPihzdGF0aWNfY2FzdDxKU0hUTUxJbWFnZUVsZW1lbnQqPihvYmplY3RBcmcpLT5pbXBs
KCkpOwotICAgICAgICBpbWFnZUVsZW1lbnQtPnNldENhY2hlZEltYWdlKG5ldyBDYWNoZWRJbWFn
ZShzdGlsbEltYWdlLmdldCgpKSk7Ci0gICAgICAgIEpTRE9NR2xvYmFsT2JqZWN0KiBnbG9iYWwg
PSBzdGF0aWNfY2FzdDxKU0RPTUdsb2JhbE9iamVjdCo+KGluc3RhbmNlLT5yb290T2JqZWN0KCkt
Pmdsb2JhbE9iamVjdCgpKTsKLSAgICAgICAgdG9KUyhleGVjLCBnbG9iYWwsIGltYWdlRWxlbWVu
dC0+ZG9jdW1lbnQoKSk7Ci0gICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotICAgIH0KLQot
ICAgIHZpcnR1YWwgaW50IG51bVBhcmFtZXRlcnMoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0
dXJuIDE7Ci0gICAgfQotfTsKLQotLy8gdGhpcyBmdW5jdGlvbiBlbmNvZGVzIHRoZSBpbWFnZSB0
byBhIGRhdGFVcmwsIHRvIGJlIHVzZWQgaW4gYmFja2dyb3VuZCBldGMuIE5vdGU6IHZlcnkgc2xv
dy4KLWNsYXNzIFF0UGl4bWFwVG9EYXRhVXJsTWV0aG9kIDogcHVibGljIFF0UGl4bWFwUnVudGlt
ZU1ldGhvZCB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVy
biAidG9EYXRhVXJsIjsgfQotICAgIEpTVmFsdWUgaW52b2tlKEV4ZWNTdGF0ZSogZXhlYywgUXRQ
aXhtYXBJbnN0YW5jZSogaW5zdGFuY2UpCi0gICAgewotICAgICAgICBRQnl0ZUFycmF5IGJ5dGVB
cnJheTsKLSAgICAgICAgUUJ1ZmZlciBidWZmZXIoJmJ5dGVBcnJheSk7Ci0gICAgICAgIGluc3Rh
bmNlLT50b0ltYWdlKCkuc2F2ZSgmYnVmZmVyLCAiUE5HIik7Ci0gICAgICAgIGNvbnN0IFFTdHJp
bmcgZW5jb2RlZFN0cmluZyA9IFFMYXRpbjFTdHJpbmcoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwi
KSArIFFMYXRpbjFTdHJpbmcoYnl0ZUFycmF5LnRvQmFzZTY0KCkpOwotICAgICAgICBjb25zdCBV
U3RyaW5nIHVzdHJpbmcoKFVDaGFyKillbmNvZGVkU3RyaW5nLnV0ZjE2KCksIGVuY29kZWRTdHJp
bmcubGVuZ3RoKCkpOwotICAgICAgICByZXR1cm4ganNTdHJpbmcoZXhlYywgdXN0cmluZyk7Ci0g
ICAgfQotfTsKLQotY2xhc3MgUXRQaXhtYXBUb1N0cmluZ01ldGhvZCA6IHB1YmxpYyBRdFBpeG1h
cFJ1bnRpbWVNZXRob2QgewotICAgIHB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgY2hhciogbmFt
ZSgpIHsgcmV0dXJuICJ0b1N0cmluZyI7IH0KLSAgICBKU1ZhbHVlIGludm9rZShFeGVjU3RhdGUq
IGV4ZWMsIFF0UGl4bWFwSW5zdGFuY2UqIGluc3RhbmNlKQotICAgIHsKLSAgICAgICAgcmV0dXJu
IGluc3RhbmNlLT52YWx1ZU9mKGV4ZWMpOwotICAgIH0KLX07Ci0KLXN0cnVjdCBRdFBpeG1hcE1l
dGFEYXRhIHsKLSAgICBRdFBpeG1hcFRvRGF0YVVybE1ldGhvZCB0b0RhdGFVcmxNZXRob2Q7Ci0g
ICAgUXRQaXhtYXBUb0ltYWdlRGF0YU1ldGhvZCB0b0ltYWdlRGF0YU1ldGhvZDsKLSAgICBRdFBp
eG1hcEFzc2lnblRvRWxlbWVudE1ldGhvZCBhc3NpZ25Ub0VsZW1lbnRNZXRob2Q7Ci0gICAgUXRQ
aXhtYXBUb1N0cmluZ01ldGhvZCB0b1N0cmluZ01ldGhvZDsKLSAgICBRdFBpeG1hcEhlaWdodEZp
ZWxkIGhlaWdodEZpZWxkOwotICAgIFF0UGl4bWFwV2lkdGhGaWVsZCB3aWR0aEZpZWxkOwotICAg
IFF0UGl4bWFwQ2xhc3MgY2xzOwotfSBxdF9waXhtYXBfbWV0YURhdGE7Ci0KLS8vIERlcml2ZWQg
UnVudGltZU9iamVjdAotY2xhc3MgUXRQaXhtYXBSdW50aW1lT2JqZWN0IDogcHVibGljIFJ1bnRp
bWVPYmplY3QgewotcHVibGljOgotICAgIHR5cGVkZWYgUnVudGltZU9iamVjdCBCYXNlOwotCi0g
ICAgc3RhdGljIFF0UGl4bWFwUnVudGltZU9iamVjdCogY3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywg
SlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgUGFzc1JlZlB0cjxJbnN0YW5jZT4gaW5zdGFu
Y2UpCi0gICAgewotICAgICAgICBTdHJ1Y3R1cmUqIGRvbVN0cnVjdHVyZSA9IFdlYkNvcmU6OmRl
cHJlY2F0ZWRHZXRET01TdHJ1Y3R1cmU8UXRQaXhtYXBSdW50aW1lT2JqZWN0PihleGVjKTsKLSAg
ICAgICAgUXRQaXhtYXBSdW50aW1lT2JqZWN0KiBvYmplY3QgPSBuZXcgKGFsbG9jYXRlQ2VsbDxR
dFBpeG1hcFJ1bnRpbWVPYmplY3Q+KCpleGVjLT5oZWFwKCkpKSBRdFBpeG1hcFJ1bnRpbWVPYmpl
Y3QoZXhlYywgZ2xvYmFsT2JqZWN0LCBkb21TdHJ1Y3R1cmUsIGluc3RhbmNlKTsKLSAgICAgICAg
b2JqZWN0LT5maW5pc2hDcmVhdGlvbihnbG9iYWxPYmplY3QpOwotICAgICAgICByZXR1cm4gb2Jq
ZWN0OwotICAgIH0KLQotICAgIHN0YXRpYyBjb25zdCBDbGFzc0luZm8gc19pbmZvOwotCi0gICAg
c3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0
YSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNWYWx1ZSBwcm90b3R5cGUpCi0gICAg
ewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpjcmVhdGUoZ2xvYmFsRGF0YSwgZ2xvYmFsT2Jq
ZWN0LCBwcm90b3R5cGUsIFR5cGVJbmZvKE9iamVjdFR5cGUsICBTdHJ1Y3R1cmVGbGFncyksICZz
X2luZm8pOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBT
dHJ1Y3R1cmVGbGFncyA9IFJ1bnRpbWVPYmplY3Q6OlN0cnVjdHVyZUZsYWdzIHwgT3ZlcnJpZGVz
VmlzaXRDaGlsZHJlbjsKLQotcHJpdmF0ZToKLSAgICBRdFBpeG1hcFJ1bnRpbWVPYmplY3QoRXhl
Y1N0YXRlKiwgSlNHbG9iYWxPYmplY3QqLCBTdHJ1Y3R1cmUqLCBQYXNzUmVmUHRyPEluc3RhbmNl
Pik7Ci19OwotCi1RdFBpeG1hcFJ1bnRpbWVPYmplY3Q6OlF0UGl4bWFwUnVudGltZU9iamVjdChF
eGVjU3RhdGUqIGV4ZWMsIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIFN0cnVjdHVyZSog
c3RydWN0dXJlLCBQYXNzUmVmUHRyPEluc3RhbmNlPiBpbnN0YW5jZSkKLSAgICA6IFJ1bnRpbWVP
YmplY3QoZXhlYywgZ2xvYmFsT2JqZWN0LCBzdHJ1Y3R1cmUsIGluc3RhbmNlKQotewogfQogCi1j
b25zdCBDbGFzc0luZm8gUXRQaXhtYXBSdW50aW1lT2JqZWN0OjpzX2luZm8gPSB7ICJRdFBpeG1h
cFJ1bnRpbWVPYmplY3QiLCAmUnVudGltZU9iamVjdDo6c19pbmZvLCAwLCAwLCBDUkVBVEVfTUVU
SE9EX1RBQkxFKFF0UGl4bWFwUnVudGltZU9iamVjdCkgfTsKLQotUXRQaXhtYXBDbGFzczo6UXRQ
aXhtYXBDbGFzcygpCitzdGF0aWMgUVBpeG1hcCB0b1BpeG1hcChjb25zdCBRVmFyaWFudCYgZGF0
YSkKIHsKLX0KKyAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5
cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpKQorICAgICAgICByZXR1cm4gZGF0YS52YWx1ZTxR
UGl4bWFwPigpOwogCisgICAgaWYgKGRhdGEudHlwZSgpID09IHN0YXRpY19jYXN0PFFWYXJpYW50
OjpUeXBlPihxTWV0YVR5cGVJZDxRSW1hZ2U+KCkpKQorICAgICAgICByZXR1cm4gUVBpeG1hcDo6
ZnJvbUltYWdlKGRhdGEudmFsdWU8UUltYWdlPigpKTsKIAotQ2xhc3MqIFF0UGl4bWFwSW5zdGFu
Y2U6OmdldENsYXNzKCkgY29uc3QKLXsKLSAgICByZXR1cm4gJnF0X3BpeG1hcF9tZXRhRGF0YS5j
bHM7CisgICAgcmV0dXJuIFFQaXhtYXAoKTsKIH0KIAotSlNWYWx1ZSBRdFBpeG1hcEluc3RhbmNl
OjpnZXRNZXRob2QoRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lKQor
c3RhdGljIFFJbWFnZSB0b0ltYWdlKGNvbnN0IFFWYXJpYW50JiBkYXRhKQogewotICAgIE1ldGhv
ZExpc3QgbWV0aG9kTGlzdCA9IGdldENsYXNzKCktPm1ldGhvZHNOYW1lZChwcm9wZXJ0eU5hbWUs
IHRoaXMpOwotICAgIHJldHVybiBSdW50aW1lTWV0aG9kOjpjcmVhdGUoZXhlYywgZXhlYy0+bGV4
aWNhbEdsb2JhbE9iamVjdCgpLCBXZWJDb3JlOjpkZXByZWNhdGVkR2V0RE9NU3RydWN0dXJlPFJ1
bnRpbWVNZXRob2Q+KGV4ZWMpLCBwcm9wZXJ0eU5hbWUucHVibGljTmFtZSgpLCBtZXRob2RMaXN0
KTsKLX0KKyAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+
KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkpCisgICAgICAgIHJldHVybiBkYXRhLnZhbHVlPFFJbWFn
ZT4oKTsKIAotSlNWYWx1ZSBRdFBpeG1hcEluc3RhbmNlOjppbnZva2VNZXRob2QoRXhlY1N0YXRl
KiBleGVjLCBSdW50aW1lTWV0aG9kKiBydW50aW1lTWV0aG9kKQotewotICAgIGNvbnN0IE1ldGhv
ZExpc3QmIG1ldGhvZHMgPSAqcnVudGltZU1ldGhvZC0+bWV0aG9kcygpOworICAgIGlmIChkYXRh
LnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFudDo6VHlwZT4ocU1ldGFUeXBlSWQ8UVBpeG1h
cD4oKSkpCisgICAgICAgIHJldHVybiBkYXRhLnZhbHVlPFFQaXhtYXA+KCkudG9JbWFnZSgpOwog
Ci0gICAgaWYgKG1ldGhvZHMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgUXRQaXhtYXBSdW50aW1l
TWV0aG9kKiBtZXRob2QgPSBzdGF0aWNfY2FzdDxRdFBpeG1hcFJ1bnRpbWVNZXRob2QqPihtZXRo
b2RzWzBdKTsKLSAgICAgICAgcmV0dXJuIG1ldGhvZC0+aW52b2tlKGV4ZWMsIHRoaXMpOwotICAg
IH0KLSAgICByZXR1cm4ganNVbmRlZmluZWQoKTsKKyAgICByZXR1cm4gUUltYWdlKCk7CiB9CiAK
LU1ldGhvZExpc3QgUXRQaXhtYXBDbGFzczo6bWV0aG9kc05hbWVkKFByb3BlcnR5TmFtZSBpZGVu
dGlmaWVyLCBJbnN0YW5jZSopIGNvbnN0CitzdGF0aWMgUVNpemUgaW1hZ2VTaXplRm9yVmFyaWFu
dChjb25zdCBRVmFyaWFudCYgZGF0YSkKIHsKLSAgICBNZXRob2RMaXN0IG1ldGhvZHM7Ci0gICAg
VVN0cmluZyB1c3RyaW5nKGlkZW50aWZpZXIucHVibGljTmFtZSgpKTsKLSAgICBpZiAodXN0cmlu
ZyA9PSBRdFBpeG1hcFRvRGF0YVVybE1ldGhvZDo6bmFtZSgpKQotICAgICAgICBtZXRob2RzLmFw
cGVuZCgmcXRfcGl4bWFwX21ldGFEYXRhLnRvRGF0YVVybE1ldGhvZCk7Ci0gICAgZWxzZSBpZiAo
dXN0cmluZyA9PSBRdFBpeG1hcFRvSW1hZ2VEYXRhTWV0aG9kOjpuYW1lKCkpCi0gICAgICAgIG1l
dGhvZHMuYXBwZW5kKCZxdF9waXhtYXBfbWV0YURhdGEudG9JbWFnZURhdGFNZXRob2QpOwotICAg
IGVsc2UgaWYgKHVzdHJpbmcgPT0gUXRQaXhtYXBBc3NpZ25Ub0VsZW1lbnRNZXRob2Q6Om5hbWUo
KSkKLSAgICAgICAgbWV0aG9kcy5hcHBlbmQoJnF0X3BpeG1hcF9tZXRhRGF0YS5hc3NpZ25Ub0Vs
ZW1lbnRNZXRob2QpOwotICAgIGVsc2UgaWYgKHVzdHJpbmcgPT0gUXRQaXhtYXBUb1N0cmluZ01l
dGhvZDo6bmFtZSgpKQotICAgICAgICBtZXRob2RzLmFwcGVuZCgmcXRfcGl4bWFwX21ldGFEYXRh
LnRvU3RyaW5nTWV0aG9kKTsKLSAgICByZXR1cm4gbWV0aG9kczsKKyAgICBpZiAoZGF0YS50eXBl
KCkgPT0gc3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkp
KQorICAgICAgICByZXR1cm4gZGF0YS52YWx1ZTxRUGl4bWFwPigpLnNpemUoKTsKKyAgICBpZiAo
ZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFJ
bWFnZT4oKSkpCisgICAgICAgIHJldHVybiBkYXRhLnZhbHVlPFFJbWFnZT4oKS5zaXplKCk7Cisg
ICAgcmV0dXJuIFFTaXplKDAsIDApOwogfQogCi1GaWVsZCogUXRQaXhtYXBDbGFzczo6ZmllbGRO
YW1lZChQcm9wZXJ0eU5hbWUgaWRlbnRpZmllciwgSW5zdGFuY2UqKSBjb25zdAorc3RhdGljIEpT
VmFsdWVSZWYgZ2V0UGl4bWFwV2lkdGgoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVm
IG9iamVjdCwgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24p
CiB7Ci0gICAgVVN0cmluZyB1c3RyaW5nKGlkZW50aWZpZXIucHVibGljTmFtZSgpKTsKLSAgICBp
ZiAodXN0cmluZyA9PSBRdFBpeG1hcFdpZHRoRmllbGQ6Om5hbWUoKSkKLSAgICAgICAgcmV0dXJu
ICZxdF9waXhtYXBfbWV0YURhdGEud2lkdGhGaWVsZDsKLSAgICBpZiAodXN0cmluZyA9PSBRdFBp
eG1hcEhlaWdodEZpZWxkOjpuYW1lKCkpCi0gICAgICAgIHJldHVybiAmcXRfcGl4bWFwX21ldGFE
YXRhLmhlaWdodEZpZWxkOwotICAgIHJldHVybiAwOworICAgIFFWYXJpYW50JiBkYXRhID0gKnN0
YXRpY19jYXN0PFFWYXJpYW50Kj4oSlNPYmplY3RHZXRQcml2YXRlKG9iamVjdCkpOworICAgIHJl
dHVybiBKU1ZhbHVlTWFrZU51bWJlcihjb250ZXh0LCBpbWFnZVNpemVGb3JWYXJpYW50KGRhdGEp
LndpZHRoKCkpOwogfQogCi12b2lkIFF0UGl4bWFwSW5zdGFuY2U6OmdldFByb3BlcnR5TmFtZXMo
RXhlY1N0YXRlKmV4ZWMsIFByb3BlcnR5TmFtZUFycmF5JiBhcnIpCitzdGF0aWMgSlNWYWx1ZVJl
ZiBnZXRQaXhtYXBIZWlnaHQoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIG9iamVj
dCwgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCiB7Ci0g
ICAgYXJyLmFkZChJZGVudGlmaWVyKGV4ZWMsIFVTdHJpbmcoUXRQaXhtYXBUb0RhdGFVcmxNZXRo
b2Q6Om5hbWUoKSkpKTsKLSAgICBhcnIuYWRkKElkZW50aWZpZXIoZXhlYywgVVN0cmluZyhRdFBp
eG1hcFRvSW1hZ2VEYXRhTWV0aG9kOjpuYW1lKCkpKSk7Ci0gICAgYXJyLmFkZChJZGVudGlmaWVy
KGV4ZWMsIFVTdHJpbmcoUXRQaXhtYXBBc3NpZ25Ub0VsZW1lbnRNZXRob2Q6Om5hbWUoKSkpKTsK
LSAgICBhcnIuYWRkKElkZW50aWZpZXIoZXhlYywgVVN0cmluZyhRdFBpeG1hcFRvU3RyaW5nTWV0
aG9kOjpuYW1lKCkpKSk7Ci0gICAgYXJyLmFkZChJZGVudGlmaWVyKGV4ZWMsIFVTdHJpbmcoUXRQ
aXhtYXBXaWR0aEZpZWxkOjpuYW1lKCkpKSk7Ci0gICAgYXJyLmFkZChJZGVudGlmaWVyKGV4ZWMs
IFVTdHJpbmcoUXRQaXhtYXBIZWlnaHRGaWVsZDo6bmFtZSgpKSkpOworICAgIFFWYXJpYW50JiBk
YXRhID0gKnN0YXRpY19jYXN0PFFWYXJpYW50Kj4oSlNPYmplY3RHZXRQcml2YXRlKG9iamVjdCkp
OworICAgIHJldHVybiBKU1ZhbHVlTWFrZU51bWJlcihjb250ZXh0LCBpbWFnZVNpemVGb3JWYXJp
YW50KGRhdGEpLmhlaWdodCgpKTsKIH0KIAotSlNWYWx1ZSBRdFBpeG1hcEluc3RhbmNlOjpkZWZh
dWx0VmFsdWUoRXhlY1N0YXRlKiBleGVjLCBQcmVmZXJyZWRQcmltaXRpdmVUeXBlIHB0eXBlKSBj
b25zdAorc3RhdGljIEpTVmFsdWVSZWYgYXNzaWduVG9IVE1MSW1hZ2VFbGVtZW50KEpTQ29udGV4
dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgb2JqZWN0LCBz
aXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1
ZVJlZiogZXhjZXB0aW9uKQogewotICAgIGlmIChwdHlwZSA9PSBQcmVmZXJOdW1iZXIpIHsKLSAg
ICAgICAgcmV0dXJuIGpzQm9vbGVhbigKLSAgICAgICAgICAgICAgICAoZGF0YS50eXBlKCkgPT0g
c3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkgJiYgIShk
YXRhLnZhbHVlPFFJbWFnZT4oKSkuaXNOdWxsKCkpCi0gICAgICAgICAgICAgICAgfHwgKGRhdGEu
dHlwZSgpID09IHN0YXRpY19jYXN0PFFWYXJpYW50OjpUeXBlPihxTWV0YVR5cGVJZDxRUGl4bWFw
PigpKSAmJiAhZGF0YS52YWx1ZTxRUGl4bWFwPigpLmlzTnVsbCgpKSk7Ci0gICAgfQorICAgIGlm
ICghYXJndW1lbnRDb3VudCkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNv
bnRleHQpOwogCi0gICAgaWYgKHB0eXBlID09IFByZWZlclN0cmluZykKLSAgICAgICAgcmV0dXJu
IHZhbHVlT2YoZXhlYyk7CisgICAgSlNPYmplY3RSZWYgb2JqZWN0QXJnID0gSlNWYWx1ZVRvT2Jq
ZWN0KGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKTsKKyAgICBpZiAoIW9iamVjdEFy
ZykKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOwogCi0gICAg
cmV0dXJuIGpzVW5kZWZpbmVkKCk7Ci19CisgICAgSlNPYmplY3QqIGpzT2JqZWN0ID0gOjp0b0pT
KG9iamVjdEFyZyk7CiAKLUpTVmFsdWUgUXRQaXhtYXBJbnN0YW5jZTo6dmFsdWVPZihFeGVjU3Rh
dGUqIGV4ZWMpIGNvbnN0Ci17Ci0gICAgY29uc3QgUVN0cmluZyBzdHJpbmdWYWx1ZSA9IFFTdHJp
bmc6OmZyb21MYXRpbjEoIltRdCBOYXRpdmUgUGl4bWFwICUxLCUyXSIpLmFyZyh3aWR0aCgpKS5h
cmcoaGVpZ2h0KCkpOwotICAgIFVTdHJpbmcgdXN0cmluZygoVUNoYXIqKXN0cmluZ1ZhbHVlLnV0
ZjE2KCksIHN0cmluZ1ZhbHVlLmxlbmd0aCgpKTsKLSAgICByZXR1cm4ganNTdHJpbmcoZXhlYywg
dXN0cmluZyk7Ci19CisgICAgaWYgKCFqc09iamVjdC0+aW5oZXJpdHMoJkpTSFRNTEltYWdlRWxl
bWVudDo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRl
eHQpOwogCi1RdFBpeG1hcEluc3RhbmNlOjpRdFBpeG1hcEluc3RhbmNlKFBhc3NSZWZQdHI8Um9v
dE9iamVjdD4gcm9vdE9iaiwgY29uc3QgUVZhcmlhbnQmIGQpCi0gICAgICAgIDpJbnN0YW5jZShy
b290T2JqKSwgZGF0YShkKQoteworICAgIFFWYXJpYW50JiBkYXRhID0gKnN0YXRpY19jYXN0PFFW
YXJpYW50Kj4oSlNPYmplY3RHZXRQcml2YXRlKG9iamVjdCkpOworCisgICAgLy8gd2Ugbm93IGtu
b3cgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgPGltZz4gZWxlbWVudCBhcyB0aGUgYXJndW1lbnQsIHdl
IGNhbiBhdHRhY2ggdGhlIGltYWdlIHRvIGl0LgorICAgIFJlZlB0cjxTdGlsbEltYWdlPiBzdGls
bEltYWdlID0gV2ViQ29yZTo6U3RpbGxJbWFnZTo6Y3JlYXRlKHRvSW1hZ2UoZGF0YSkpOworICAg
IEhUTUxJbWFnZUVsZW1lbnQqIGltYWdlRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVs
ZW1lbnQqPihzdGF0aWNfY2FzdDxKU0hUTUxJbWFnZUVsZW1lbnQqPihqc09iamVjdCktPmltcGwo
KSk7CisgICAgaW1hZ2VFbGVtZW50LT5zZXRDYWNoZWRJbWFnZShuZXcgQ2FjaGVkSW1hZ2Uoc3Rp
bGxJbWFnZS5nZXQoKSkpOworICAgIEV4ZWNTdGF0ZSogZXhlYyA9IDo6dG9KUyhjb250ZXh0KTsK
KyAgICBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsID0gc3RhdGljX2Nhc3Q8SlNET01HbG9iYWxP
YmplY3QqPihleGVjLT5keW5hbWljR2xvYmFsT2JqZWN0KCkpOworICAgIHRvSlMoZXhlYywgZ2xv
YmFsLCBpbWFnZUVsZW1lbnQtPmRvY3VtZW50KCkpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVu
ZGVmaW5lZChjb250ZXh0KTsKIH0KIAotaW50IFF0UGl4bWFwSW5zdGFuY2U6OndpZHRoKCkgY29u
c3QKK3N0YXRpYyBKU1ZhbHVlUmVmIHBpeG1hcFRvSW1hZ2VEYXRhKEpTQ29udGV4dFJlZiBjb250
ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgb2JqZWN0LCBzaXplX3QgYXJn
dW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhj
ZXB0aW9uKQogewotICAgIGlmIChkYXRhLnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFudDo6
VHlwZT4ocU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkpCi0gICAgICAgIHJldHVybiBkYXRhLnZhbHVl
PFFQaXhtYXA+KCkud2lkdGgoKTsKLSAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8
UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkpCi0gICAgICAgIHJldHVybiBk
YXRhLnZhbHVlPFFJbWFnZT4oKS53aWR0aCgpOwotICAgIHJldHVybiAwOworICAgIFFWYXJpYW50
JiBkYXRhID0gKnN0YXRpY19jYXN0PFFWYXJpYW50Kj4oSlNPYmplY3RHZXRQcml2YXRlKG9iamVj
dCkpOworICAgIFFJbWFnZSBpbWFnZSA9IHRvSW1hZ2UoZGF0YSk7CisgICAgaW50IHdpZHRoID0g
aW1hZ2Uud2lkdGgoKTsKKyAgICBpbnQgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0KCk7CisKKyAgICBS
ZWZQdHI8SW1hZ2VEYXRhPiBpbWFnZURhdGEgPSBJbWFnZURhdGE6OmNyZWF0ZShJbnRTaXplKHdp
ZHRoLCBoZWlnaHQpKTsKKyAgICBjb3B5UGl4ZWxzKGltYWdlLCB3aWR0aCwgaGVpZ2h0LCBpbWFn
ZURhdGEtPmRhdGEoKS0+ZGF0YSgpKTsKKyAgICBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsT2Jq
ZWN0ID0gc3RhdGljX2Nhc3Q8SlNET01HbG9iYWxPYmplY3QqPig6OnRvSlMoSlNDb250ZXh0R2V0
R2xvYmFsT2JqZWN0KGNvbnRleHQpKSk7CisgICAgSlNDOjpFeGVjU3RhdGUqIGV4ZWMgPSA6OnRv
SlMoY29udGV4dCk7CisgICAgcmV0dXJuIDo6dG9SZWYoZXhlYywgdG9KUyhleGVjLCBnbG9iYWxP
YmplY3QsIGltYWdlRGF0YS5nZXQoKSkpOwogfQogCi1pbnQgUXRQaXhtYXBJbnN0YW5jZTo6aGVp
Z2h0KCkgY29uc3QKK3N0YXRpYyBKU1ZhbHVlUmVmIHBpeG1hcFRvRGF0YVVybChKU0NvbnRleHRS
ZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIG9iamVjdCwgc2l6
ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVS
ZWYqIGV4Y2VwdGlvbikKIHsKLSAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8UVZh
cmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpKQotICAgICAgICByZXR1cm4gZGF0
YS52YWx1ZTxRUGl4bWFwPigpLmhlaWdodCgpOwotICAgIGlmIChkYXRhLnR5cGUoKSA9PSBzdGF0
aWNfY2FzdDxRVmFyaWFudDo6VHlwZT4ocU1ldGFUeXBlSWQ8UUltYWdlPigpKSkKLSAgICAgICAg
cmV0dXJuIGRhdGEudmFsdWU8UUltYWdlPigpLmhlaWdodCgpOwotICAgIHJldHVybiAwOworICAg
IFFWYXJpYW50JiBkYXRhID0gKnN0YXRpY19jYXN0PFFWYXJpYW50Kj4oSlNPYmplY3RHZXRQcml2
YXRlKG9iamVjdCkpOworICAgIFFCeXRlQXJyYXkgYnl0ZUFycmF5OworICAgIFFCdWZmZXIgYnVm
ZmVyKCZieXRlQXJyYXkpOworICAgIHRvSW1hZ2UoZGF0YSkuc2F2ZSgmYnVmZmVyLCAiUE5HIik7
CisgICAgUUJ5dGVBcnJheSBlbmNvZGVkID0gUUJ5dGVBcnJheSgiZGF0YTppbWFnZS9wbmc7YmFz
ZTY0LCIpICsgYnl0ZUFycmF5LnRvQmFzZTY0KCk7CisgICAgSlNTdHJpbmdSZWYgc3RyID0gSlNT
dHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcoZW5jb2RlZC5jb25zdERhdGEoKSk7CisgICAgSlNW
YWx1ZVJlZiB2YWx1ZSA9IEpTVmFsdWVNYWtlU3RyaW5nKGNvbnRleHQsIHN0cik7CisgICAgSlNT
dHJpbmdSZWxlYXNlKHN0cik7CisgICAgcmV0dXJuIHZhbHVlOwogfQogCi1RUGl4bWFwIFF0UGl4
bWFwSW5zdGFuY2U6OnRvUGl4bWFwKCkKK3N0YXRpYyBKU1ZhbHVlUmVmIHBpeG1hcFRvU3RyaW5n
KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYg
b2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNb
XSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQogewotICAgIGlmIChkYXRhLnR5cGUoKSA9PSBzdGF0
aWNfY2FzdDxRVmFyaWFudDo6VHlwZT4ocU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkpCi0gICAgICAg
IHJldHVybiBkYXRhLnZhbHVlPFFQaXhtYXA+KCk7Ci0KLSAgICBpZiAoZGF0YS50eXBlKCkgPT0g
c3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkpIHsKLSAg
ICAgICAgY29uc3QgUVBpeG1hcCBwaXhtYXAgPSBRUGl4bWFwOjpmcm9tSW1hZ2UoZGF0YS52YWx1
ZTxRSW1hZ2U+KCkpOwotICAgICAgICBkYXRhID0gUVZhcmlhbnQ6OmZyb21WYWx1ZTxRUGl4bWFw
PihwaXhtYXApOwotICAgICAgICByZXR1cm4gcGl4bWFwOwotICAgIH0KLQotICAgIHJldHVybiBR
UGl4bWFwKCk7CisgICAgUVZhcmlhbnQmIGRhdGEgPSAqc3RhdGljX2Nhc3Q8UVZhcmlhbnQqPihK
U09iamVjdEdldFByaXZhdGUob2JqZWN0KSk7CisgICAgUVNpemUgc2l6ZSA9IGltYWdlU2l6ZUZv
clZhcmlhbnQoZGF0YSk7CisgICAgUVN0cmluZyBzdHJpbmdWYWx1ZSA9IFFTdHJpbmc6OmZyb21M
YXRpbjEoIltRdCBOYXRpdmUgUGl4bWFwICUxLCUyXSIpLmFyZyhzaXplLndpZHRoKCkpLmFyZyhz
aXplLmhlaWdodCgpKTsKKyAgICBKU1N0cmluZ1JlZiBzdHIgPSBKU1N0cmluZ0NyZWF0ZVdpdGhV
VEY4Q1N0cmluZyhzdHJpbmdWYWx1ZS50b1V0ZjgoKS5jb25zdERhdGEoKSk7CisgICAgSlNWYWx1
ZVJlZiB2YWx1ZSA9IEpTVmFsdWVNYWtlU3RyaW5nKGNvbnRleHQsIHN0cik7CisgICAgSlNTdHJp
bmdSZWxlYXNlKHN0cik7CisgICAgcmV0dXJuIHZhbHVlOwogfQotCi1RSW1hZ2UgUXRQaXhtYXBJ
bnN0YW5jZTo6dG9JbWFnZSgpCitKU09iamVjdFJlZiBRdFBpeG1hcFJ1bnRpbWU6OnRvSlMoSlND
b250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IFFWYXJpYW50JiB2YWx1ZSwgSlNWYWx1ZVJlZiogZXhj
ZXB0aW9uKQogewotICAgIGlmIChkYXRhLnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFudDo6
VHlwZT4ocU1ldGFUeXBlSWQ8UUltYWdlPigpKSkKLSAgICAgICAgcmV0dXJuIGRhdGEudmFsdWU8
UUltYWdlPigpOwotCi0gICAgaWYgKGRhdGEudHlwZSgpID09IHN0YXRpY19jYXN0PFFWYXJpYW50
OjpUeXBlPihxTWV0YVR5cGVJZDxRUGl4bWFwPigpKSkgewotICAgICAgICBjb25zdCBRSW1hZ2Ug
aW1hZ2UgPSBkYXRhLnZhbHVlPFFQaXhtYXA+KCkudG9JbWFnZSgpOwotICAgICAgICBkYXRhID0g
UVZhcmlhbnQ6OmZyb21WYWx1ZTxRSW1hZ2U+KGltYWdlKTsKLSAgICAgICAgcmV0dXJuIGltYWdl
OwotICAgIH0KLQotICAgIHJldHVybiBRSW1hZ2UoKTsKKyAgICByZXR1cm4gSlNPYmplY3RNYWtl
KGNvbnRleHQsIGdldENsYXNzUmVmKCksIG5ldyBRVmFyaWFudCh2YWx1ZSkpOwogfQogCi1RVmFy
aWFudCBRdFBpeG1hcEluc3RhbmNlOjp2YXJpYW50RnJvbU9iamVjdChKU09iamVjdCogb2JqZWN0
LCBRTWV0YVR5cGU6OlR5cGUgaGludCkKK1FWYXJpYW50IFF0UGl4bWFwUnVudGltZTo6dG9RdChK
U0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgb2JqLCBRTWV0YVR5cGU6OlR5cGUgaGlu
dCwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQogewotICAgIGlmICghb2JqZWN0KQorICAgIEpTT2Jq
ZWN0KiBqc09iamVjdDsKKyAgICBKU0hUTUxJbWFnZUVsZW1lbnQqIGVsZW1lbnRKU1dyYXBwZXI7
CisgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2VFbGVtZW50OworICAgIENhY2hlZEltYWdlKiBj
YWNoZWRJbWFnZTsKKyAgICBJbWFnZSogaW1hZ2U7CisgICAgUUltYWdlKiBuYXRpdmVJbWFnZTsK
KworICAgIGlmICghb2JqKQogICAgICAgICBnb3RvIHJldHVybkVtcHR5VmFyaWFudDsKIAotICAg
IGlmIChvYmplY3QtPmluaGVyaXRzKCZKU0hUTUxJbWFnZUVsZW1lbnQ6OnNfaW5mbykpIHsKLSAg
ICAgICAgSlNIVE1MSW1hZ2VFbGVtZW50KiBlbGVtZW50SlNXcmFwcGVyID0gc3RhdGljX2Nhc3Q8
SlNIVE1MSW1hZ2VFbGVtZW50Kj4ob2JqZWN0KTsKLSAgICAgICAgSFRNTEltYWdlRWxlbWVudCog
aW1hZ2VFbGVtZW50ID0gc3RhdGljX2Nhc3Q8SFRNTEltYWdlRWxlbWVudCo+KGVsZW1lbnRKU1dy
YXBwZXItPmltcGwoKSk7CisgICAgaWYgKEpTVmFsdWVJc09iamVjdE9mQ2xhc3MoY29udGV4dCwg
b2JqLCBRdFBpeG1hcFJ1bnRpbWU6OmdldENsYXNzUmVmKCkpKSB7CisgICAgICAgIFFWYXJpYW50
KiBvcmlnaW5hbFZhcmlhbnQgPSBzdGF0aWNfY2FzdDxRVmFyaWFudCo+KEpTT2JqZWN0R2V0UHJp
dmF0ZShvYmopKTsKKyAgICAgICAgaWYgKGhpbnQgPT0gcU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkK
KyAgICAgICAgICAgIHJldHVybiBRVmFyaWFudDo6ZnJvbVZhbHVlPFFQaXhtYXA+KHRvUGl4bWFw
KCpvcmlnaW5hbFZhcmlhbnQpKTsKIAotICAgICAgICBpZiAoIWltYWdlRWxlbWVudCkKLSAgICAg
ICAgICAgIGdvdG8gcmV0dXJuRW1wdHlWYXJpYW50OworICAgICAgICBpZiAoaGludCA9PSBxTWV0
YVR5cGVJZDxRSW1hZ2U+KCkpCisgICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQ6OmZyb21WYWx1
ZTxRSW1hZ2U+KHRvSW1hZ2UoKm9yaWdpbmFsVmFyaWFudCkpOworICAgIH0KIAotICAgICAgICBD
YWNoZWRJbWFnZSogY2FjaGVkSW1hZ2UgPSBpbWFnZUVsZW1lbnQtPmNhY2hlZEltYWdlKCk7Ci0g
ICAgICAgIGlmICghY2FjaGVkSW1hZ2UpCi0gICAgICAgICAgICBnb3RvIHJldHVybkVtcHR5VmFy
aWFudDsKKyAgICBqc09iamVjdCA9IDo6dG9KUyhvYmopOworICAgIGlmICghanNPYmplY3QtPmlu
aGVyaXRzKCZKU0hUTUxJbWFnZUVsZW1lbnQ6OnNfaW5mbykpCisgICAgICAgIGdvdG8gcmV0dXJu
RW1wdHlWYXJpYW50OwogCi0gICAgICAgIEltYWdlKiBpbWFnZSA9IGNhY2hlZEltYWdlLT5pbWFn
ZUZvclJlbmRlcmVyKGltYWdlRWxlbWVudC0+cmVuZGVyZXIoKSk7Ci0gICAgICAgIGlmICghaW1h
Z2UpCi0gICAgICAgICAgICBnb3RvIHJldHVybkVtcHR5VmFyaWFudDsKKyAgICBlbGVtZW50SlNX
cmFwcGVyID0gc3RhdGljX2Nhc3Q8SlNIVE1MSW1hZ2VFbGVtZW50Kj4oanNPYmplY3QpOworICAg
IGltYWdlRWxlbWVudCA9IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVsZW1lbnQqPihlbGVtZW50SlNX
cmFwcGVyLT5pbXBsKCkpOwogCi0gICAgICAgIFFJbWFnZSogbmF0aXZlSW1hZ2UgPSBpbWFnZS0+
bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKLSAgICAgICAgaWYgKCFuYXRpdmVJbWFnZSkK
LSAgICAgICAgICAgIGdvdG8gcmV0dXJuRW1wdHlWYXJpYW50OworICAgIGlmICghaW1hZ2VFbGVt
ZW50KQorICAgICAgICBnb3RvIHJldHVybkVtcHR5VmFyaWFudDsKIAotICAgICAgICByZXR1cm4g
KGhpbnQgPT0gc3RhdGljX2Nhc3Q8UU1ldGFUeXBlOjpUeXBlPihxTWV0YVR5cGVJZDxRUGl4bWFw
PigpKSkKLSAgICAgICAgICAgICAgICAgID8gUVZhcmlhbnQ6OmZyb21WYWx1ZTxRUGl4bWFwPihR
UGl4bWFwOjpmcm9tSW1hZ2UoKm5hdGl2ZUltYWdlKSkKLSAgICAgICAgICAgICAgICAgIDogUVZh
cmlhbnQ6OmZyb21WYWx1ZTxRSW1hZ2U+KCpuYXRpdmVJbWFnZSk7Ci0gICAgfQorICAgIGNhY2hl
ZEltYWdlID0gaW1hZ2VFbGVtZW50LT5jYWNoZWRJbWFnZSgpOworICAgIGlmICghY2FjaGVkSW1h
Z2UpCisgICAgICAgIGdvdG8gcmV0dXJuRW1wdHlWYXJpYW50OwogCi0gICAgaWYgKG9iamVjdC0+
aW5oZXJpdHMoJlF0UGl4bWFwUnVudGltZU9iamVjdDo6c19pbmZvKSkgewotICAgICAgICBRdFBp
eG1hcFJ1bnRpbWVPYmplY3QqIHJ1bnRpbWVPYmplY3QgPSBzdGF0aWNfY2FzdDxRdFBpeG1hcFJ1
bnRpbWVPYmplY3QqPihvYmplY3QpOwotICAgICAgICBRdFBpeG1hcEluc3RhbmNlKiBpbnN0YW5j
ZSA9IHN0YXRpY19jYXN0PFF0UGl4bWFwSW5zdGFuY2UqPihydW50aW1lT2JqZWN0LT5nZXRJbnRl
cm5hbEluc3RhbmNlKCkpOwotICAgICAgICBpZiAoIWluc3RhbmNlKQotICAgICAgICAgICAgZ290
byByZXR1cm5FbXB0eVZhcmlhbnQ7CisgICAgaW1hZ2UgPSBjYWNoZWRJbWFnZS0+aW1hZ2VGb3JS
ZW5kZXJlcihpbWFnZUVsZW1lbnQtPnJlbmRlcmVyKCkpOworICAgIGlmICghaW1hZ2UpCisgICAg
ICAgIGdvdG8gcmV0dXJuRW1wdHlWYXJpYW50OwogCi0gICAgICAgIGlmIChoaW50ID09IHFNZXRh
VHlwZUlkPFFQaXhtYXA+KCkpCi0gICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQ6OmZyb21WYWx1
ZTxRUGl4bWFwPihpbnN0YW5jZS0+dG9QaXhtYXAoKSk7CisgICAgbmF0aXZlSW1hZ2UgPSBpbWFn
ZS0+bmF0aXZlSW1hZ2VGb3JDdXJyZW50RnJhbWUoKTsKKyAgICBpZiAoIW5hdGl2ZUltYWdlKQor
ICAgICAgICBnb3RvIHJldHVybkVtcHR5VmFyaWFudDsKIAotICAgICAgICBpZiAoaGludCA9PSBx
TWV0YVR5cGVJZDxRSW1hZ2U+KCkpCi0gICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQ6OmZyb21W
YWx1ZTxRSW1hZ2U+KGluc3RhbmNlLT50b0ltYWdlKCkpOwotICAgIH0KKyAgICByZXR1cm4gKGhp
bnQgPT0gc3RhdGljX2Nhc3Q8UU1ldGFUeXBlOjpUeXBlPihxTWV0YVR5cGVJZDxRUGl4bWFwPigp
KSkKKyAgICAgICAgICAgICAgPyBRVmFyaWFudDo6ZnJvbVZhbHVlPFFQaXhtYXA+KFFQaXhtYXA6
OmZyb21JbWFnZSgqbmF0aXZlSW1hZ2UpKQorICAgICAgICAgICAgICA6IFFWYXJpYW50Ojpmcm9t
VmFsdWU8UUltYWdlPigqbmF0aXZlSW1hZ2UpOwogCiByZXR1cm5FbXB0eVZhcmlhbnQ6CiAgICAg
aWYgKGhpbnQgPT0gcU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkKLSAgICAgICAgcmV0dXJuIFFWYXJp
YW50Ojpmcm9tVmFsdWU8UVBpeG1hcD4oUVBpeG1hcCgpKTsKKyAgICAgICAgcmV0dXJuIFFWYXJp
YW50Ojpmcm9tVmFsdWUoUVBpeG1hcCgpKTsKICAgICBpZiAoaGludCA9PSBxTWV0YVR5cGVJZDxR
SW1hZ2U+KCkpCi0gICAgICAgIHJldHVybiBRVmFyaWFudDo6ZnJvbVZhbHVlPFFJbWFnZT4oUUlt
YWdlKCkpOworICAgICAgICByZXR1cm4gUVZhcmlhbnQ6OmZyb21WYWx1ZShRSW1hZ2UoKSk7CiAg
ICAgcmV0dXJuIFFWYXJpYW50KCk7CiB9CiAKLVJ1bnRpbWVPYmplY3QqIFF0UGl4bWFwSW5zdGFu
Y2U6Om5ld1J1bnRpbWVPYmplY3QoRXhlY1N0YXRlKiBleGVjKQorYm9vbCBRdFBpeG1hcFJ1bnRp
bWU6OmNhbkhhbmRsZShRTWV0YVR5cGU6OlR5cGUgaGludCkKIHsKLSAgICByZXR1cm4gUXRQaXht
YXBSdW50aW1lT2JqZWN0OjpjcmVhdGUoZXhlYywgZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgp
LCB0aGlzKTsKKyAgICByZXR1cm4gaGludCA9PSBxTWV0YVR5cGVJZDxRSW1hZ2U+KCkgfHwgaGlu
dCA9PSBxTWV0YVR5cGVJZDxRUGl4bWFwPigpOwogfQogCi1KU09iamVjdCogUXRQaXhtYXBJbnN0
YW5jZTo6Y3JlYXRlUGl4bWFwUnVudGltZU9iamVjdChFeGVjU3RhdGUqIGV4ZWMsIFBhc3NSZWZQ
dHI8Um9vdE9iamVjdD4gcm9vdCwgY29uc3QgUVZhcmlhbnQmIGRhdGEpCitKU0NsYXNzUmVmIFF0
UGl4bWFwUnVudGltZTo6Z2V0Q2xhc3NSZWYoKQogewotICAgIEpTTG9ja0hvbGRlciBsb2NrKGV4
ZWMpOwotICAgIFJlZlB0cjxRdFBpeG1hcEluc3RhbmNlPiBpbnN0YW5jZSA9IGFkb3B0UmVmKG5l
dyBRdFBpeG1hcEluc3RhbmNlKHJvb3QsIGRhdGEpKTsKLSAgICByZXR1cm4gaW5zdGFuY2UtPmNy
ZWF0ZVJ1bnRpbWVPYmplY3QoZXhlYyk7CisgICAgc3RhdGljIGNvbnN0IEpTU3RhdGljVmFsdWUg
c3RhdGljVmFsdWVzW10gPSB7CisgICAgICAgIHsgIndpZHRoIiwgZ2V0UGl4bWFwV2lkdGgsIDAs
IDAgfSwKKyAgICAgICAgeyAiaGVpZ2h0IiwgZ2V0UGl4bWFwSGVpZ2h0LCAwLCAwIH0KKyAgICB9
OworCisgICAgc3RhdGljIGNvbnN0IEpTU3RhdGljRnVuY3Rpb24gc3RhdGljRnVuY3Rpb25zW10g
PSB7CisgICAgICAgIHsgImFzc2lnblRvIiwgYXNzaWduVG9IVE1MSW1hZ2VFbGVtZW50LCAwIH0s
CisgICAgICAgIHsgInRvRGF0YVVybCIsIHBpeG1hcFRvRGF0YVVybCwgMCB9LAorICAgICAgICB7
ICJ0b0ltYWdlRGF0YSIsIHBpeG1hcFRvSW1hZ2VEYXRhLCAwIH0sCisgICAgICAgIHsgInRvU3Ry
aW5nIiwgcGl4bWFwVG9TdHJpbmcsIDAgfQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgSlND
bGFzc0RlZmluaXRpb24gY2xhc3NEZWZpbml0aW9uID0geworICAgICAgICAwLCAwLCAiUXRQaXht
YXBSdW50aW1lT2JqZWN0IiwgMCwgc3RhdGljVmFsdWVzLCBzdGF0aWNGdW5jdGlvbnMsCisgICAg
ICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAKKyAgICB9OworCisgICAgc3RhdGlj
IEpTQ2xhc3NSZWYgY2xhc3NSZWYgPSBKU0NsYXNzQ3JlYXRlKCZjbGFzc0RlZmluaXRpb24pOwor
ICAgIHJldHVybiBjbGFzc1JlZjsKIH0KIAotYm9vbCBRdFBpeG1hcEluc3RhbmNlOjpjYW5IYW5k
bGUoUU1ldGFUeXBlOjpUeXBlIGhpbnQpCi17Ci0gICAgcmV0dXJuIGhpbnQgPT0gcU1ldGFUeXBl
SWQ8UUltYWdlPigpIHx8IGhpbnQgPT0gcU1ldGFUeXBlSWQ8UVBpeG1hcD4oKTsKLX0KIAogfQog
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvcXQvcXRfcGl4bWFwcnVudGltZS5o
IGIvU291cmNlL1dlYkNvcmUvYnJpZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuaAppbmRleCBjNDFj
OWUyZTA1NDhhMjlkNzVmZDNiZDg5ZjVmYmM1NzQyYmQzMTZmLi4xZmRhMDE2MzNhNzMyNWZjODMy
MGJjYzczZWYwMzM3ZGM0ZDUwZGRkIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9icmlkZ2Uv
cXQvcXRfcGl4bWFwcnVudGltZS5oCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9w
aXhtYXBydW50aW1lLmgKQEAgLTIxLDMxICsyMSwyMCBAQAogI2RlZmluZSBxdF9waXhtYXBydW50
aW1lX2gKIAogI2luY2x1ZGUgIkJyaWRnZUpTQy5oIgorI2luY2x1ZGUgIkphdmFTY3JpcHQuaCIK
ICNpbmNsdWRlIDxRVmFyaWFudD4KIAogbmFtZXNwYWNlIEpTQyB7CiAKIG5hbWVzcGFjZSBCaW5k
aW5ncyB7CiAKLWNsYXNzIFF0UGl4bWFwSW5zdGFuY2UgOiBwdWJsaWMgSW5zdGFuY2UgewotICAg
IFFWYXJpYW50IGRhdGE7CitjbGFzcyBRdFBpeG1hcFJ1bnRpbWUgewogcHVibGljOgotICAgIFF0
UGl4bWFwSW5zdGFuY2UoUGFzc1JlZlB0cjxSb290T2JqZWN0PiByb290T2JqLCBjb25zdCBRVmFy
aWFudCYgbmV3RGF0YSk7Ci0gICAgdmlydHVhbCBDbGFzcyogZ2V0Q2xhc3MoKSBjb25zdDsKLSAg
ICB2aXJ0dWFsIEpTVmFsdWUgZ2V0TWV0aG9kKEV4ZWNTdGF0ZSosIFByb3BlcnR5TmFtZSk7Ci0g
ICAgdmlydHVhbCBKU1ZhbHVlIGludm9rZU1ldGhvZChFeGVjU3RhdGUqLCBSdW50aW1lTWV0aG9k
Kik7Ci0gICAgdmlydHVhbCB2b2lkIGdldFByb3BlcnR5TmFtZXMoRXhlY1N0YXRlKiwgUHJvcGVy
dHlOYW1lQXJyYXkmKTsKLQotICAgIHZpcnR1YWwgSlNWYWx1ZSBkZWZhdWx0VmFsdWUoRXhlY1N0
YXRlKiwgUHJlZmVycmVkUHJpbWl0aXZlVHlwZSkgY29uc3Q7Ci0gICAgdmlydHVhbCBKU1ZhbHVl
IHZhbHVlT2YoRXhlY1N0YXRlKikgY29uc3Q7Ci0gICAgaW50IHdpZHRoKCkgY29uc3Q7Ci0gICAg
aW50IGhlaWdodCgpIGNvbnN0OwotICAgIFFQaXhtYXAgdG9QaXhtYXAoKTsKLSAgICBRSW1hZ2Ug
dG9JbWFnZSgpOwotICAgIFJ1bnRpbWVPYmplY3QqIG5ld1J1bnRpbWVPYmplY3QoRXhlY1N0YXRl
Kik7Ci0gICAgc3RhdGljIEpTT2JqZWN0KiBjcmVhdGVQaXhtYXBSdW50aW1lT2JqZWN0KEV4ZWNT
dGF0ZSosIFBhc3NSZWZQdHI8Um9vdE9iamVjdD4sIGNvbnN0IFFWYXJpYW50Jik7Ci0gICAgc3Rh
dGljIFFWYXJpYW50IHZhcmlhbnRGcm9tT2JqZWN0KEpTT2JqZWN0KiwgUU1ldGFUeXBlOjpUeXBl
IGhpbnQpOworICAgIHN0YXRpYyBKU09iamVjdFJlZiB0b0pTKEpTQ29udGV4dFJlZiwgY29uc3Qg
UVZhcmlhbnQmLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pOworICAgIHN0YXRpYyBRVmFyaWFudCB0
b1F0KEpTQ29udGV4dFJlZiwgSlNPYmplY3RSZWYsIFFNZXRhVHlwZTo6VHlwZSBoaW50LCBKU1Zh
bHVlUmVmKiBleGNlcHRpb24pOwogICAgIHN0YXRpYyBib29sIGNhbkhhbmRsZShRTWV0YVR5cGU6
OlR5cGUgaGludCk7CisKKyAgICBzdGF0aWMgSlNDbGFzc1JlZiBnZXRDbGFzc1JlZigpOwogfTsK
IAogfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYnJpZGdlL3F0L3F0X3J1bnRpbWUuY3Bw
IGIvU291cmNlL1dlYkNvcmUvYnJpZGdlL3F0L3F0X3J1bnRpbWUuY3BwCmluZGV4IDk5ZDZmOTEx
OGJhMTI3ZjdjY2RhZGI4Yzk0MmQ5N2Y4NzRjYTA4MDMuLjRiY2Y2ZjY2ZGVkOWM3ZGZjOTU2YWY5
ZTQ1N2VjNDJiNGYwYmI2YjcgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9x
dF9ydW50aW1lLmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvcXQvcXRfcnVudGltZS5j
cHAKQEAgLTYyNyw4ICs2MjcsOCBAQCBRVmFyaWFudCBjb252ZXJ0VmFsdWVUb1FWYXJpYW50KEpT
Q29udGV4dFJlZiBjb250ZXh0LCBKU1ZhbHVlUmVmIHZhbHVlLCBRTWV0YVR5cAogICAgICAgICAg
ICAgICAgIHJldCA9IFFWYXJpYW50Ojpmcm9tVmFsdWUoY29udmVydFRvTGlzdDxpbnQ+KGNvbnRl
eHQsIHR5cGUsIG9iamVjdCwgdmFsdWUsICZkaXN0LCBleGNlcHRpb24pKTsKICAgICAgICAgICAg
ICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChRdFBpeG1hcEluc3Rh
bmNlOjpjYW5IYW5kbGUoc3RhdGljX2Nhc3Q8UU1ldGFUeXBlOjpUeXBlPihoaW50KSkpIHsKLSAg
ICAgICAgICAgICAgICByZXQgPSBRdFBpeG1hcEluc3RhbmNlOjp2YXJpYW50RnJvbU9iamVjdCh0
b0pTKG9iamVjdCksIHN0YXRpY19jYXN0PFFNZXRhVHlwZTo6VHlwZT4oaGludCkpOworICAgICAg
ICAgICAgaWYgKFF0UGl4bWFwUnVudGltZTo6Y2FuSGFuZGxlKHN0YXRpY19jYXN0PFFNZXRhVHlw
ZTo6VHlwZT4oaGludCkpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gUXRQaXhtYXBSdW50aW1l
Ojp0b1F0KGNvbnRleHQsIG9iamVjdCwgc3RhdGljX2Nhc3Q8UU1ldGFUeXBlOjpUeXBlPihoaW50
KSwgZXhjZXB0aW9uKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VzdG9tUnVudGltZUNvbnZl
cnNpb25zKCktPmNvbnRhaW5zKGhpbnQpKSB7CiAgICAgICAgICAgICAgICAgcmV0ID0gY3VzdG9t
UnVudGltZUNvbnZlcnNpb25zKCktPnZhbHVlKGhpbnQpLnRvVmFyaWFudEZ1bmModG9KUyhvYmpl
Y3QpLCAmZGlzdCwgdmlzaXRlZE9iamVjdHMpOwogICAgICAgICAgICAgICAgIGlmIChkaXN0ID09
IDApCkBAIC03NDQsMTAgKzc0NCw4IEBAIEpTVmFsdWVSZWYgY29udmVydFFWYXJpYW50VG9WYWx1
ZShKU0NvbnRleHRSZWYgY29udGV4dCwgUGFzc1JlZlB0cjxSb290T2JqZWN0PiByCiAgICAgICAg
IHJldHVybiB0b1JlZihleGVjLCBRdEluc3RhbmNlOjpnZXRRdEluc3RhbmNlKG9iaiwgcm9vdCwg
UXRJbnN0YW5jZTo6UXRPd25lcnNoaXApLT5jcmVhdGVSdW50aW1lT2JqZWN0KGV4ZWMpKTsKICAg
ICB9CiAKLSAgICBpZiAoUXRQaXhtYXBJbnN0YW5jZTo6Y2FuSGFuZGxlKHN0YXRpY19jYXN0PFFN
ZXRhVHlwZTo6VHlwZT4odmFyaWFudC50eXBlKCkpKSkgewotICAgICAgICBFeGVjU3RhdGUqIGV4
ZWMgPSB0b0pTKGNvbnRleHQpOwotICAgICAgICByZXR1cm4gdG9SZWYoZXhlYywgUXRQaXhtYXBJ
bnN0YW5jZTo6Y3JlYXRlUGl4bWFwUnVudGltZU9iamVjdChleGVjLCByb290LCB2YXJpYW50KSk7
Ci0gICAgfQorICAgIGlmIChRdFBpeG1hcFJ1bnRpbWU6OmNhbkhhbmRsZShzdGF0aWNfY2FzdDxR
TWV0YVR5cGU6OlR5cGU+KHZhcmlhbnQudHlwZSgpKSkpCisgICAgICAgIHJldHVybiBRdFBpeG1h
cFJ1bnRpbWU6OnRvSlMoY29udGV4dCwgdmFyaWFudCwgZXhjZXB0aW9uKTsKIAogICAgIGlmIChj
dXN0b21SdW50aW1lQ29udmVyc2lvbnMoKS0+Y29udGFpbnModHlwZSkpIHsKICAgICAgICAgaWYg
KCFyb290LT5nbG9iYWxPYmplY3QoKS0+aW5oZXJpdHMoJkpTRE9NV2luZG93OjpzX2luZm8pKQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>161183</attachid>
            <date>2012-08-29 04:35:23 -0700</date>
            <delta_ts>2012-09-03 11:20:47 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-94702-20120829133656.patch</filename>
            <type>text/plain</type>
            <size>29370</size>
            <attacher name="Simon Hausmann">hausmann</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTI2OTgyCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNGEwNjFkZGMxMzBiZjVk
YmMxYmM3ZDVlYzkwZDE1MDljNjljZDY0OC4uN2Y0MWMzYmRhYmI5YTY5MGQ5MTJiODMwMTc0ZWFj
NzU1NDgwMWQxOCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSw1ICsxLDQyIEBACiAyMDEyLTA4LTI5ICBTaW1v
biBIYXVzbWFubiAgPHNpbW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KIAorICAgICAgICBbUXRdIFBv
cnQgdGhlIFF0IHBpeG1hcCBKUyBiaW5kaW5ncyB0byB1c2UgdGhlIEpTQyBDIEFQSQorICAgICAg
ICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTQ3MDIKKworICAgICAg
ICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBCYXNlZCBvbiBwYXRjaCBi
eSBOb2FtIFJvc2VudGhhbC4KKworICAgICAgICBUaGUgY29udmVyc2lvbiB1c2VzIGEgc2ltcGxl
IEpTQ2xhc3NSZWYgYmFzZWQgYmluZGluZyBhbmQgb25seSBhIGZldworICAgICAgICB1c2VzIG9m
IHByaXZhdGUgSlNDIEFQSSBmb3IgdGhlIEhUTUwgZWxlbWVudCBET00gYmluZGluZ3MgcmVtYWlu
LgorCisgICAgICAgIFRoaXMgaXMgZXNzZW50aWFsbHkgdXNlZCBmb3Igd3JhcHBpbmcgUVBpeG1h
cCBhbmQgUUltYWdlIHR5cGVzIGluCisgICAgICAgIEphdmFTY3JpcHQgYW5kIHRoZSBvdGhlciB3
YXkgYXJvdW5kLCBmb3IgcmV0cmlldmluZyB0aGUgaW1hZ2UgZGF0YQorICAgICAgICBvdXQgb2Yg
YSBIVE1MIGltYWdlIGVsZW1lbnQgd2hlbiBjb252ZXJ0aW5nIGZyb20gSlMvRE9NIHRvIFF0Lgor
CisgICAgICAgICogYnJpZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuY3BwOgorICAgICAgICAoSlND
OjpCaW5kaW5nczo6Y29weVBpeGVscyk6CisgICAgICAgIChKU0M6OkJpbmRpbmdzOjp0b1BpeG1h
cCk6CisgICAgICAgIChKU0M6OkJpbmRpbmdzOjp0b0ltYWdlKToKKyAgICAgICAgKEpTQzo6Qmlu
ZGluZ3M6OmltYWdlU2l6ZUZvclZhcmlhbnQpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6Z2V0
UGl4bWFwV2lkdGgpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6Z2V0UGl4bWFwSGVpZ2h0KToK
KyAgICAgICAgKEpTQzo6QmluZGluZ3M6OmFzc2lnblRvSFRNTEltYWdlRWxlbWVudCk6CisgICAg
ICAgIChKU0M6OkJpbmRpbmdzOjpwaXhtYXBUb0ltYWdlRGF0YSk6CisgICAgICAgIChKU0M6OkJp
bmRpbmdzOjpwaXhtYXBUb0RhdGFVcmwpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6cGl4bWFw
VG9TdHJpbmcpOgorICAgICAgICAoSlNDOjpCaW5kaW5nczo6UXRQaXhtYXBSdW50aW1lOjp0b0pT
KToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6OlF0UGl4bWFwUnVudGltZTo6dG9RdCk6CisgICAg
ICAgIChKU0M6OkJpbmRpbmdzOjpRdFBpeG1hcFJ1bnRpbWU6OmNhbkhhbmRsZSk6CisgICAgICAg
IChKU0M6OkJpbmRpbmdzOjpRdFBpeG1hcFJ1bnRpbWU6OmdldENsYXNzUmVmKToKKyAgICAgICAg
KiBicmlkZ2UvcXQvcXRfcGl4bWFwcnVudGltZS5oOgorICAgICAgICAoUXRQaXhtYXBSdW50aW1l
KToKKyAgICAgICAgKiBicmlkZ2UvcXQvcXRfcnVudGltZS5jcHA6CisgICAgICAgIChKU0M6OkJp
bmRpbmdzOjpjb252ZXJ0VmFsdWVUb1FWYXJpYW50KToKKyAgICAgICAgKEpTQzo6QmluZGluZ3M6
OmNvbnZlcnRRVmFyaWFudFRvVmFsdWUpOgorCisyMDEyLTA4LTI5ICBTaW1vbiBIYXVzbWFubiAg
PHNpbW9uLmhhdXNtYW5uQG5va2lhLmNvbT4KKwogICAgICAgICBbUXRdIFBvcnQgY29udmVydFZh
bHVlVG9RVmFyaWFudCB0byB1c2UgdGhlIEpTQyBDIEFQSQogICAgICAgICBodHRwczovL2J1Z3Mu
d2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9OTQ2OTUKIApkaWZmIC0tZ2l0IGEvU291cmNlL1dl
YkNvcmUvYnJpZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuY3BwIGIvU291cmNlL1dlYkNvcmUvYnJp
ZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuY3BwCmluZGV4IGEyZGFhZGE4MzFlMGJjNGU3ZDg3NWQz
MDAxMDllOTQ5ODAzZWIyMjcuLmFmNmMwN2QzYTliNGMyNzZhZGFkNTE3NTlhOWRjYzcyODNlZGIx
MzkgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9waXhtYXBydW50aW1l
LmNwcAorKysgYi9Tb3VyY2UvV2ViQ29yZS9icmlkZ2UvcXQvcXRfcGl4bWFwcnVudGltZS5jcHAK
QEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlICJjb25maWcuaCIKICNpbmNsdWRlICJxdF9waXht
YXBydW50aW1lLmgiCiAKKyNpbmNsdWRlICJBUElDYXN0LmgiCiAjaW5jbHVkZSAiQ2FjaGVkSW1h
Z2UuaCIKICNpbmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCiAjaW5jbHVkZSAiSW1hZ2VEYXRh
LmgiCkBAIC0yNyw4ICsyOCw4IEBACiAjaW5jbHVkZSAiSlNHbG9iYWxPYmplY3QuaCIKICNpbmNs
dWRlICJKU0hUTUxJbWFnZUVsZW1lbnQuaCIKICNpbmNsdWRlICJKU0ltYWdlRGF0YS5oIgotI2lu
Y2x1ZGUgIkpTTG9jay5oIgotI2luY2x1ZGUgIk9iamVjdFByb3RvdHlwZS5oIgorI2luY2x1ZGUg
IkpTUmV0YWluUHRyLmgiCisjaW5jbHVkZSAiSmF2YVNjcmlwdC5oIgogI2luY2x1ZGUgIlN0aWxs
SW1hZ2VRdC5oIgogI2luY2x1ZGUgPFF0RW5kaWFuPgogI2luY2x1ZGUgPFFCdWZmZXI+CkBAIC0z
NywzOTggKzM4LDIzNiBAQAogI2luY2x1ZGUgPFFJbWFnZT4KICNpbmNsdWRlIDxRUGl4bWFwPgog
I2luY2x1ZGUgPFFWYXJpYW50PgotI2luY2x1ZGUgPHJ1bnRpbWVfbWV0aG9kLmg+Ci0jaW5jbHVk
ZSA8cnVudGltZV9vYmplY3QuaD4KLSNpbmNsdWRlIDxydW50aW1lX3Jvb3QuaD4KLSNpbmNsdWRl
ICJydW50aW1lL0Z1bmN0aW9uUHJvdG90eXBlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBXZWJDb3Jl
OwogbmFtZXNwYWNlIEpTQyB7CiAKIG5hbWVzcGFjZSBCaW5kaW5ncyB7CiAKLWNsYXNzIFF0UGl4
bWFwQ2xhc3MgOiBwdWJsaWMgQ2xhc3MgewotcHVibGljOgotICAgIFF0UGl4bWFwQ2xhc3MoKTsK
LSAgICB2aXJ0dWFsIE1ldGhvZExpc3QgbWV0aG9kc05hbWVkKFByb3BlcnR5TmFtZSwgSW5zdGFu
Y2UqKSBjb25zdDsKLSAgICB2aXJ0dWFsIEZpZWxkKiBmaWVsZE5hbWVkKFByb3BlcnR5TmFtZSwg
SW5zdGFuY2UqKSBjb25zdDsKLX07Ci0KLQotY2xhc3MgUXRQaXhtYXBXaWR0aEZpZWxkIDogcHVi
bGljIEZpZWxkIHsKLXB1YmxpYzoKLSAgICBzdGF0aWMgY29uc3QgY2hhciogbmFtZSgpIHsgcmV0
dXJuICJ3aWR0aCI7IH0KLSAgICB2aXJ0dWFsIEpTVmFsdWUgdmFsdWVGcm9tSW5zdGFuY2UoRXhl
Y1N0YXRlKiwgY29uc3QgSW5zdGFuY2UqIGluc3RhbmNlKSBjb25zdAotICAgIHsKLSAgICAgICAg
cmV0dXJuIGpzTnVtYmVyKHN0YXRpY19jYXN0PGNvbnN0IFF0UGl4bWFwSW5zdGFuY2UqPihpbnN0
YW5jZSktPndpZHRoKCkpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0VmFsdWVUb0luc3Rh
bmNlKEV4ZWNTdGF0ZSosIGNvbnN0IEluc3RhbmNlKiwgSlNWYWx1ZSkgY29uc3Qge30KLX07Ci0K
LWNsYXNzIFF0UGl4bWFwSGVpZ2h0RmllbGQgOiBwdWJsaWMgRmllbGQgewotcHVibGljOgotICAg
IHN0YXRpYyBjb25zdCBjaGFyKiBuYW1lKCkgeyByZXR1cm4gImhlaWdodCI7IH0KLSAgICB2aXJ0
dWFsIEpTVmFsdWUgdmFsdWVGcm9tSW5zdGFuY2UoRXhlY1N0YXRlKiwgY29uc3QgSW5zdGFuY2Uq
IGluc3RhbmNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGpzTnVtYmVyKHN0YXRpY19j
YXN0PGNvbnN0IFF0UGl4bWFwSW5zdGFuY2UqPihpbnN0YW5jZSktPmhlaWdodCgpKTsKLSAgICB9
Ci0gICAgdmlydHVhbCB2b2lkIHNldFZhbHVlVG9JbnN0YW5jZShFeGVjU3RhdGUqLCBjb25zdCBJ
bnN0YW5jZSosIEpTVmFsdWUpIGNvbnN0IHt9Ci19OwotCi1jbGFzcyBRdFBpeG1hcFJ1bnRpbWVN
ZXRob2QgOiBwdWJsaWMgTWV0aG9kIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIGludCBudW1QYXJh
bWV0ZXJzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICB2aXJ0
dWFsIEpTVmFsdWUgaW52b2tlKEV4ZWNTdGF0ZSogZXhlYywgUXRQaXhtYXBJbnN0YW5jZSopID0g
MDsKLQotfTsKLQotY2xhc3MgUXRQaXhtYXBUb0ltYWdlRGF0YU1ldGhvZCA6IHB1YmxpYyBRdFBp
eG1hcFJ1bnRpbWVNZXRob2QgewotcHVibGljOgotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBuYW1l
KCkgeyByZXR1cm4gInRvSW1hZ2VEYXRhIjsgfQotICAgIEpTVmFsdWUgaW52b2tlKEV4ZWNTdGF0
ZSogZXhlYywgUXRQaXhtYXBJbnN0YW5jZSogaW5zdGFuY2UpCi0gICAgewotICAgICAgICBpbnQg
d2lkdGggPSBpbnN0YW5jZS0+d2lkdGgoKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGluc3RhbmNl
LT5oZWlnaHQoKTsKLSAgICAgICAgUmVmUHRyPEltYWdlRGF0YT4gaW1hZ2VEYXRhID0gSW1hZ2VE
YXRhOjpjcmVhdGUoSW50U2l6ZSh3aWR0aCwgaGVpZ2h0KSk7Ci0gICAgICAgIGNvcHlQaXhlbHMo
aW5zdGFuY2UtPnRvSW1hZ2UoKSwgd2lkdGgsIGhlaWdodCwgaW1hZ2VEYXRhLT5kYXRhKCktPmRh
dGEoKSk7Ci0gICAgICAgIHJldHVybiB0b0pTKGV4ZWMsIHN0YXRpY19jYXN0PEpTRE9NR2xvYmFs
T2JqZWN0Kj4oZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpKSwgaW1hZ2VEYXRhLmdldCgpKTsK
LSAgICB9Ci1wcml2YXRlOgotICAgIHZvaWQgY29weVBpeGVscyhjb25zdCBRSW1hZ2UmIHNvdXJj
ZUltYWdlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIHVuc2lnbmVkIGNoYXIqIGRlc3RQaXhlbHMp
Ci0gICAgewotICAgICAgICBRSW1hZ2UgaW1hZ2Uoc291cmNlSW1hZ2UpOwotICAgICAgICBzd2l0
Y2ggKGltYWdlLmZvcm1hdCgpKSB7Ci0gICAgICAgIGNhc2UgUUltYWdlOjpGb3JtYXRfUkdCODg4
OgotICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewotICAgICAg
ICAgICAgICAgIGNvbnN0IHVjaGFyKiBzY2FuTGluZSA9IGltYWdlLnNjYW5MaW5lKHkpOwotICAg
ICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgd2lkdGg7IHgrKykgewotICAgICAgICAg
ICAgICAgICAgICAqKGRlc3RQaXhlbHMrKykgPSAqKHNjYW5MaW5lKyspOwotICAgICAgICAgICAg
ICAgICAgICAqKGRlc3RQaXhlbHMrKykgPSAqKHNjYW5MaW5lKyspOwotICAgICAgICAgICAgICAg
ICAgICAqKGRlc3RQaXhlbHMrKykgPSAqKHNjYW5MaW5lKyspOwotICAgICAgICAgICAgICAgICAg
ICAqKGRlc3RQaXhlbHMrKykgPSAweEZGOwotICAgICAgICAgICAgICAgIH0KK3N0YXRpYyB2b2lk
IGNvcHlQaXhlbHNJbnRvKGNvbnN0IFFJbWFnZSYgc291cmNlSW1hZ2UsIGludCB3aWR0aCwgaW50
IGhlaWdodCwgdW5zaWduZWQgY2hhciogZGVzdFBpeGVscykKK3sKKyAgICBRSW1hZ2UgaW1hZ2Uo
c291cmNlSW1hZ2UpOworICAgIHN3aXRjaCAoaW1hZ2UuZm9ybWF0KCkpIHsKKyAgICBjYXNlIFFJ
bWFnZTo6Rm9ybWF0X1JHQjg4ODoKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7
IHkrKykgeworICAgICAgICAgICAgY29uc3QgdWNoYXIqIHNjYW5MaW5lID0gaW1hZ2Uuc2Nhbkxp
bmUoeSk7CisgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKKyAg
ICAgICAgICAgICAgICAqKGRlc3RQaXhlbHMrKykgPSAqKHNjYW5MaW5lKyspOworICAgICAgICAg
ICAgICAgICooZGVzdFBpeGVscysrKSA9ICooc2NhbkxpbmUrKyk7CisgICAgICAgICAgICAgICAg
KihkZXN0UGl4ZWxzKyspID0gKihzY2FuTGluZSsrKTsKKyAgICAgICAgICAgICAgICAqKGRlc3RQ
aXhlbHMrKykgPSAweEZGOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAg
ICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbWFnZSA9IGltYWdlLmNvbnZlcnRUb0Zvcm1hdChR
SW1hZ2U6OkZvcm1hdF9BUkdCMzIpOwotICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoCi0gICAg
ICAgIGNhc2UgUUltYWdlOjpGb3JtYXRfUkdCMzI6Ci0gICAgICAgIGNhc2UgUUltYWdlOjpGb3Jt
YXRfQVJHQjMyOgotICAgICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykg
ewotICAgICAgICAgICAgICAgIGNvbnN0IHF1aW50MzIqIHNjYW5MaW5lID0gcmVpbnRlcnByZXRf
Y2FzdF9wdHI8Y29uc3QgcXVpbnQzMio+KGltYWdlLnNjYW5MaW5lKHkpKTsKLSAgICAgICAgICAg
ICAgICBmb3IgKGludCB4ID0gMDsgeCA8IHdpZHRoOyB4KyspIHsKLSAgICAgICAgICAgICAgICAg
ICAgUVJnYiBwaXhlbCA9IHNjYW5MaW5lW3hdOwotICAgICAgICAgICAgICAgICAgICBxVG9CaWdF
bmRpYW48cXVpbnQzMj4oKHBpeGVsIDw8IDgpIHwgcUFscGhhKHBpeGVsKSwgZGVzdFBpeGVscyk7
Ci0gICAgICAgICAgICAgICAgICAgIGRlc3RQaXhlbHMgKz0gNDsKLSAgICAgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaW1hZ2Ug
PSBpbWFnZS5jb252ZXJ0VG9Gb3JtYXQoUUltYWdlOjpGb3JtYXRfQVJHQjMyKTsKKyAgICAgICAg
Ly8gRmFsbCB0aHJvdWdoCisgICAgY2FzZSBRSW1hZ2U6OkZvcm1hdF9SR0IzMjoKKyAgICBjYXNl
IFFJbWFnZTo6Rm9ybWF0X0FSR0IzMjoKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoZWln
aHQ7IHkrKykgeworICAgICAgICAgICAgY29uc3QgcXVpbnQzMiogc2NhbkxpbmUgPSByZWludGVy
cHJldF9jYXN0X3B0cjxjb25zdCBxdWludDMyKj4oaW1hZ2Uuc2NhbkxpbmUoeSkpOworICAgICAg
ICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3aWR0aDsgeCsrKSB7CisgICAgICAgICAgICAgICAg
UVJnYiBwaXhlbCA9IHNjYW5MaW5lW3hdOworICAgICAgICAgICAgICAgIHFUb0JpZ0VuZGlhbjxx
dWludDMyPigocGl4ZWwgPDwgOCkgfCBxQWxwaGEocGl4ZWwpLCBkZXN0UGl4ZWxzKTsKKyAgICAg
ICAgICAgICAgICBkZXN0UGl4ZWxzICs9IDQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBi
cmVhazsKICAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICB9Ci19OwotCi0vLyB0aGlzIGZ1
bmN0aW9uIHJlY2VpdmVzIGFuIEhUTUwgaW1hZ2UgZWxlbWVudCBhcyBhIHBhcmFtZXRlciwgbWFr
ZXMgaXQgZGlzcGxheSB0aGUgcGl4bWFwL2ltYWdlIGZyb20gUXQKLWNsYXNzIFF0UGl4bWFwQXNz
aWduVG9FbGVtZW50TWV0aG9kIDogcHVibGljIFF0UGl4bWFwUnVudGltZU1ldGhvZCB7Ci1wdWJs
aWM6Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybiAiYXNzaWduVG9IVE1M
SW1hZ2VFbGVtZW50IjsgfQotICAgIEpTVmFsdWUgaW52b2tlKEV4ZWNTdGF0ZSogZXhlYywgUXRQ
aXhtYXBJbnN0YW5jZSogaW5zdGFuY2UpCi0gICAgewotICAgICAgICBpZiAoIWV4ZWMtPmFyZ3Vt
ZW50Q291bnQoKSkKLSAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgICAg
IEpTT2JqZWN0KiBvYmplY3RBcmcgPSBleGVjLT5hcmd1bWVudCgwKS50b09iamVjdChleGVjKTsK
LSAgICAgICAgaWYgKCFvYmplY3RBcmcpCi0gICAgICAgICAgICByZXR1cm4ganNVbmRlZmluZWQo
KTsKLQotICAgICAgICBpZiAoIW9iamVjdEFyZy0+aW5oZXJpdHMoJkpTSFRNTEltYWdlRWxlbWVu
dDo6c19pbmZvKSkKLSAgICAgICAgICAgIHJldHVybiBqc1VuZGVmaW5lZCgpOwotCi0gICAgICAg
IC8vIHdlIG5vdyBrbm93IHRoYXQgd2UgaGF2ZSBhIHZhbGlkIDxpbWc+IGVsZW1lbnQgYXMgdGhl
IGFyZ3VtZW50LCB3ZSBjYW4gYXR0YWNoIHRoZSBpbWFnZSB0byBpdC4KLSAgICAgICAgUmVmUHRy
PFN0aWxsSW1hZ2U+IHN0aWxsSW1hZ2UgPSBXZWJDb3JlOjpTdGlsbEltYWdlOjpjcmVhdGUoaW5z
dGFuY2UtPnRvSW1hZ2UoKSk7Ci0gICAgICAgIEhUTUxJbWFnZUVsZW1lbnQqIGltYWdlRWxlbWVu
dCA9IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVsZW1lbnQqPihzdGF0aWNfY2FzdDxKU0hUTUxJbWFn
ZUVsZW1lbnQqPihvYmplY3RBcmcpLT5pbXBsKCkpOwotICAgICAgICBpbWFnZUVsZW1lbnQtPnNl
dENhY2hlZEltYWdlKG5ldyBDYWNoZWRJbWFnZShzdGlsbEltYWdlLmdldCgpKSk7Ci0gICAgICAg
IEpTRE9NR2xvYmFsT2JqZWN0KiBnbG9iYWwgPSBzdGF0aWNfY2FzdDxKU0RPTUdsb2JhbE9iamVj
dCo+KGluc3RhbmNlLT5yb290T2JqZWN0KCktPmdsb2JhbE9iamVjdCgpKTsKLSAgICAgICAgdG9K
UyhleGVjLCBnbG9iYWwsIGltYWdlRWxlbWVudC0+ZG9jdW1lbnQoKSk7Ci0gICAgICAgIHJldHVy
biBqc1VuZGVmaW5lZCgpOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IG51bVBhcmFtZXRlcnMo
KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotfTsKLQotLy8gdGhpcyBm
dW5jdGlvbiBlbmNvZGVzIHRoZSBpbWFnZSB0byBhIGRhdGFVcmwsIHRvIGJlIHVzZWQgaW4gYmFj
a2dyb3VuZCBldGMuIE5vdGU6IHZlcnkgc2xvdy4KLWNsYXNzIFF0UGl4bWFwVG9EYXRhVXJsTWV0
aG9kIDogcHVibGljIFF0UGl4bWFwUnVudGltZU1ldGhvZCB7Ci1wdWJsaWM6Ci0gICAgc3RhdGlj
IGNvbnN0IGNoYXIqIG5hbWUoKSB7IHJldHVybiAidG9EYXRhVXJsIjsgfQotICAgIEpTVmFsdWUg
aW52b2tlKEV4ZWNTdGF0ZSogZXhlYywgUXRQaXhtYXBJbnN0YW5jZSogaW5zdGFuY2UpCi0gICAg
ewotICAgICAgICBRQnl0ZUFycmF5IGJ5dGVBcnJheTsKLSAgICAgICAgUUJ1ZmZlciBidWZmZXIo
JmJ5dGVBcnJheSk7Ci0gICAgICAgIGluc3RhbmNlLT50b0ltYWdlKCkuc2F2ZSgmYnVmZmVyLCAi
UE5HIik7Ci0gICAgICAgIGNvbnN0IFFTdHJpbmcgZW5jb2RlZFN0cmluZyA9IFFMYXRpbjFTdHJp
bmcoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiKSArIFFMYXRpbjFTdHJpbmcoYnl0ZUFycmF5LnRv
QmFzZTY0KCkpOwotICAgICAgICBjb25zdCBVU3RyaW5nIHVzdHJpbmcoKFVDaGFyKillbmNvZGVk
U3RyaW5nLnV0ZjE2KCksIGVuY29kZWRTdHJpbmcubGVuZ3RoKCkpOwotICAgICAgICByZXR1cm4g
anNTdHJpbmcoZXhlYywgdXN0cmluZyk7Ci0gICAgfQotfTsKLQotY2xhc3MgUXRQaXhtYXBUb1N0
cmluZ01ldGhvZCA6IHB1YmxpYyBRdFBpeG1hcFJ1bnRpbWVNZXRob2QgewotICAgIHB1YmxpYzoK
LSAgICBzdGF0aWMgY29uc3QgY2hhciogbmFtZSgpIHsgcmV0dXJuICJ0b1N0cmluZyI7IH0KLSAg
ICBKU1ZhbHVlIGludm9rZShFeGVjU3RhdGUqIGV4ZWMsIFF0UGl4bWFwSW5zdGFuY2UqIGluc3Rh
bmNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluc3RhbmNlLT52YWx1ZU9mKGV4ZWMpOwotICAg
IH0KLX07Ci0KLXN0cnVjdCBRdFBpeG1hcE1ldGFEYXRhIHsKLSAgICBRdFBpeG1hcFRvRGF0YVVy
bE1ldGhvZCB0b0RhdGFVcmxNZXRob2Q7Ci0gICAgUXRQaXhtYXBUb0ltYWdlRGF0YU1ldGhvZCB0
b0ltYWdlRGF0YU1ldGhvZDsKLSAgICBRdFBpeG1hcEFzc2lnblRvRWxlbWVudE1ldGhvZCBhc3Np
Z25Ub0VsZW1lbnRNZXRob2Q7Ci0gICAgUXRQaXhtYXBUb1N0cmluZ01ldGhvZCB0b1N0cmluZ01l
dGhvZDsKLSAgICBRdFBpeG1hcEhlaWdodEZpZWxkIGhlaWdodEZpZWxkOwotICAgIFF0UGl4bWFw
V2lkdGhGaWVsZCB3aWR0aEZpZWxkOwotICAgIFF0UGl4bWFwQ2xhc3MgY2xzOwotfSBxdF9waXht
YXBfbWV0YURhdGE7Ci0KLS8vIERlcml2ZWQgUnVudGltZU9iamVjdAotY2xhc3MgUXRQaXhtYXBS
dW50aW1lT2JqZWN0IDogcHVibGljIFJ1bnRpbWVPYmplY3QgewotcHVibGljOgotICAgIHR5cGVk
ZWYgUnVudGltZU9iamVjdCBCYXNlOwotCi0gICAgc3RhdGljIFF0UGl4bWFwUnVudGltZU9iamVj
dCogY3JlYXRlKEV4ZWNTdGF0ZSogZXhlYywgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwg
UGFzc1JlZlB0cjxJbnN0YW5jZT4gaW5zdGFuY2UpCi0gICAgewotICAgICAgICBTdHJ1Y3R1cmUq
IGRvbVN0cnVjdHVyZSA9IFdlYkNvcmU6OmRlcHJlY2F0ZWRHZXRET01TdHJ1Y3R1cmU8UXRQaXht
YXBSdW50aW1lT2JqZWN0PihleGVjKTsKLSAgICAgICAgUXRQaXhtYXBSdW50aW1lT2JqZWN0KiBv
YmplY3QgPSBuZXcgKGFsbG9jYXRlQ2VsbDxRdFBpeG1hcFJ1bnRpbWVPYmplY3Q+KCpleGVjLT5o
ZWFwKCkpKSBRdFBpeG1hcFJ1bnRpbWVPYmplY3QoZXhlYywgZ2xvYmFsT2JqZWN0LCBkb21TdHJ1
Y3R1cmUsIGluc3RhbmNlKTsKLSAgICAgICAgb2JqZWN0LT5maW5pc2hDcmVhdGlvbihnbG9iYWxP
YmplY3QpOwotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgIH0KLQotICAgIHN0YXRpYyBjb25z
dCBDbGFzc0luZm8gc19pbmZvOwotCi0gICAgc3RhdGljIFN0cnVjdHVyZSogY3JlYXRlU3RydWN0
dXJlKEpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVj
dCwgSlNWYWx1ZSBwcm90b3R5cGUpCi0gICAgewotICAgICAgICByZXR1cm4gU3RydWN0dXJlOjpj
cmVhdGUoZ2xvYmFsRGF0YSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5cGUsIFR5cGVJbmZvKE9iamVj
dFR5cGUsICBTdHJ1Y3R1cmVGbGFncyksICZzX2luZm8pOwotICAgIH0KLQotcHJvdGVjdGVkOgot
ICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IFJ1bnRpbWVPYmplY3Q6
OlN0cnVjdHVyZUZsYWdzIHwgT3ZlcnJpZGVzVmlzaXRDaGlsZHJlbjsKLQotcHJpdmF0ZToKLSAg
ICBRdFBpeG1hcFJ1bnRpbWVPYmplY3QoRXhlY1N0YXRlKiwgSlNHbG9iYWxPYmplY3QqLCBTdHJ1
Y3R1cmUqLCBQYXNzUmVmUHRyPEluc3RhbmNlPik7Ci19OwotCi1RdFBpeG1hcFJ1bnRpbWVPYmpl
Y3Q6OlF0UGl4bWFwUnVudGltZU9iamVjdChFeGVjU3RhdGUqIGV4ZWMsIEpTR2xvYmFsT2JqZWN0
KiBnbG9iYWxPYmplY3QsIFN0cnVjdHVyZSogc3RydWN0dXJlLCBQYXNzUmVmUHRyPEluc3RhbmNl
PiBpbnN0YW5jZSkKLSAgICA6IFJ1bnRpbWVPYmplY3QoZXhlYywgZ2xvYmFsT2JqZWN0LCBzdHJ1
Y3R1cmUsIGluc3RhbmNlKQotewogfQogCi1jb25zdCBDbGFzc0luZm8gUXRQaXhtYXBSdW50aW1l
T2JqZWN0OjpzX2luZm8gPSB7ICJRdFBpeG1hcFJ1bnRpbWVPYmplY3QiLCAmUnVudGltZU9iamVj
dDo6c19pbmZvLCAwLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKFF0UGl4bWFwUnVudGltZU9iamVj
dCkgfTsKLQotUXRQaXhtYXBDbGFzczo6UXRQaXhtYXBDbGFzcygpCitzdGF0aWMgUVBpeG1hcCB0
b1BpeG1hcChjb25zdCBRVmFyaWFudCYgZGF0YSkKIHsKLX0KKyAgICBpZiAoZGF0YS50eXBlKCkg
PT0gc3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpKQor
ICAgICAgICByZXR1cm4gZGF0YS52YWx1ZTxRUGl4bWFwPigpOwogCisgICAgaWYgKGRhdGEudHlw
ZSgpID09IHN0YXRpY19jYXN0PFFWYXJpYW50OjpUeXBlPihxTWV0YVR5cGVJZDxRSW1hZ2U+KCkp
KQorICAgICAgICByZXR1cm4gUVBpeG1hcDo6ZnJvbUltYWdlKGRhdGEudmFsdWU8UUltYWdlPigp
KTsKIAotQ2xhc3MqIFF0UGl4bWFwSW5zdGFuY2U6OmdldENsYXNzKCkgY29uc3QKLXsKLSAgICBy
ZXR1cm4gJnF0X3BpeG1hcF9tZXRhRGF0YS5jbHM7CisgICAgcmV0dXJuIFFQaXhtYXAoKTsKIH0K
IAotSlNWYWx1ZSBRdFBpeG1hcEluc3RhbmNlOjpnZXRNZXRob2QoRXhlY1N0YXRlKiBleGVjLCBQ
cm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lKQorc3RhdGljIFFJbWFnZSB0b0ltYWdlKGNvbnN0IFFW
YXJpYW50JiBkYXRhKQogewotICAgIE1ldGhvZExpc3QgbWV0aG9kTGlzdCA9IGdldENsYXNzKCkt
Pm1ldGhvZHNOYW1lZChwcm9wZXJ0eU5hbWUsIHRoaXMpOwotICAgIHJldHVybiBSdW50aW1lTWV0
aG9kOjpjcmVhdGUoZXhlYywgZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVjdCgpLCBXZWJDb3JlOjpk
ZXByZWNhdGVkR2V0RE9NU3RydWN0dXJlPFJ1bnRpbWVNZXRob2Q+KGV4ZWMpLCBwcm9wZXJ0eU5h
bWUucHVibGljTmFtZSgpLCBtZXRob2RMaXN0KTsKLX0KKyAgICBpZiAoZGF0YS50eXBlKCkgPT0g
c3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkpCisgICAg
ICAgIHJldHVybiBkYXRhLnZhbHVlPFFJbWFnZT4oKTsKIAotSlNWYWx1ZSBRdFBpeG1hcEluc3Rh
bmNlOjppbnZva2VNZXRob2QoRXhlY1N0YXRlKiBleGVjLCBSdW50aW1lTWV0aG9kKiBydW50aW1l
TWV0aG9kKQotewotICAgIGNvbnN0IE1ldGhvZExpc3QmIG1ldGhvZHMgPSAqcnVudGltZU1ldGhv
ZC0+bWV0aG9kcygpOworICAgIGlmIChkYXRhLnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFu
dDo6VHlwZT4ocU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkpCisgICAgICAgIHJldHVybiBkYXRhLnZh
bHVlPFFQaXhtYXA+KCkudG9JbWFnZSgpOwogCi0gICAgaWYgKG1ldGhvZHMuc2l6ZSgpID09IDEp
IHsKLSAgICAgICAgUXRQaXhtYXBSdW50aW1lTWV0aG9kKiBtZXRob2QgPSBzdGF0aWNfY2FzdDxR
dFBpeG1hcFJ1bnRpbWVNZXRob2QqPihtZXRob2RzWzBdKTsKLSAgICAgICAgcmV0dXJuIG1ldGhv
ZC0+aW52b2tlKGV4ZWMsIHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4ganNVbmRlZmluZWQoKTsK
KyAgICByZXR1cm4gUUltYWdlKCk7CiB9CiAKLU1ldGhvZExpc3QgUXRQaXhtYXBDbGFzczo6bWV0
aG9kc05hbWVkKFByb3BlcnR5TmFtZSBpZGVudGlmaWVyLCBJbnN0YW5jZSopIGNvbnN0CitzdGF0
aWMgUVNpemUgaW1hZ2VTaXplRm9yVmFyaWFudChjb25zdCBRVmFyaWFudCYgZGF0YSkKIHsKLSAg
ICBNZXRob2RMaXN0IG1ldGhvZHM7Ci0gICAgVVN0cmluZyB1c3RyaW5nKGlkZW50aWZpZXIucHVi
bGljTmFtZSgpKTsKLSAgICBpZiAodXN0cmluZyA9PSBRdFBpeG1hcFRvRGF0YVVybE1ldGhvZDo6
bmFtZSgpKQotICAgICAgICBtZXRob2RzLmFwcGVuZCgmcXRfcGl4bWFwX21ldGFEYXRhLnRvRGF0
YVVybE1ldGhvZCk7Ci0gICAgZWxzZSBpZiAodXN0cmluZyA9PSBRdFBpeG1hcFRvSW1hZ2VEYXRh
TWV0aG9kOjpuYW1lKCkpCi0gICAgICAgIG1ldGhvZHMuYXBwZW5kKCZxdF9waXhtYXBfbWV0YURh
dGEudG9JbWFnZURhdGFNZXRob2QpOwotICAgIGVsc2UgaWYgKHVzdHJpbmcgPT0gUXRQaXhtYXBB
c3NpZ25Ub0VsZW1lbnRNZXRob2Q6Om5hbWUoKSkKLSAgICAgICAgbWV0aG9kcy5hcHBlbmQoJnF0
X3BpeG1hcF9tZXRhRGF0YS5hc3NpZ25Ub0VsZW1lbnRNZXRob2QpOwotICAgIGVsc2UgaWYgKHVz
dHJpbmcgPT0gUXRQaXhtYXBUb1N0cmluZ01ldGhvZDo6bmFtZSgpKQotICAgICAgICBtZXRob2Rz
LmFwcGVuZCgmcXRfcGl4bWFwX21ldGFEYXRhLnRvU3RyaW5nTWV0aG9kKTsKLSAgICByZXR1cm4g
bWV0aG9kczsKKyAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5
cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpKQorICAgICAgICByZXR1cm4gZGF0YS52YWx1ZTxR
UGl4bWFwPigpLnNpemUoKTsKKyAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8UVZh
cmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkpCisgICAgICAgIHJldHVybiBkYXRh
LnZhbHVlPFFJbWFnZT4oKS5zaXplKCk7CisgICAgcmV0dXJuIFFTaXplKDAsIDApOwogfQogCi1G
aWVsZCogUXRQaXhtYXBDbGFzczo6ZmllbGROYW1lZChQcm9wZXJ0eU5hbWUgaWRlbnRpZmllciwg
SW5zdGFuY2UqKSBjb25zdAorc3RhdGljIEpTVmFsdWVSZWYgZ2V0UGl4bWFwV2lkdGgoSlNDb250
ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIG9iamVjdCwgSlNTdHJpbmdSZWYsIEpTVmFsdWVS
ZWYqKQogewotICAgIFVTdHJpbmcgdXN0cmluZyhpZGVudGlmaWVyLnB1YmxpY05hbWUoKSk7Ci0g
ICAgaWYgKHVzdHJpbmcgPT0gUXRQaXhtYXBXaWR0aEZpZWxkOjpuYW1lKCkpCi0gICAgICAgIHJl
dHVybiAmcXRfcGl4bWFwX21ldGFEYXRhLndpZHRoRmllbGQ7Ci0gICAgaWYgKHVzdHJpbmcgPT0g
UXRQaXhtYXBIZWlnaHRGaWVsZDo6bmFtZSgpKQotICAgICAgICByZXR1cm4gJnF0X3BpeG1hcF9t
ZXRhRGF0YS5oZWlnaHRGaWVsZDsKLSAgICByZXR1cm4gMDsKKyAgICBRVmFyaWFudCYgZGF0YSA9
ICpzdGF0aWNfY2FzdDxRVmFyaWFudCo+KEpTT2JqZWN0R2V0UHJpdmF0ZShvYmplY3QpKTsKKyAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VOdW1iZXIoY29udGV4dCwgaW1hZ2VTaXplRm9yVmFyaWFudChk
YXRhKS53aWR0aCgpKTsKIH0KIAotdm9pZCBRdFBpeG1hcEluc3RhbmNlOjpnZXRQcm9wZXJ0eU5h
bWVzKEV4ZWNTdGF0ZSpleGVjLCBQcm9wZXJ0eU5hbWVBcnJheSYgYXJyKQorc3RhdGljIEpTVmFs
dWVSZWYgZ2V0UGl4bWFwSGVpZ2h0KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBv
YmplY3QsIEpTU3RyaW5nUmVmLCBKU1ZhbHVlUmVmKikKIHsKLSAgICBhcnIuYWRkKElkZW50aWZp
ZXIoZXhlYywgVVN0cmluZyhRdFBpeG1hcFRvRGF0YVVybE1ldGhvZDo6bmFtZSgpKSkpOwotICAg
IGFyci5hZGQoSWRlbnRpZmllcihleGVjLCBVU3RyaW5nKFF0UGl4bWFwVG9JbWFnZURhdGFNZXRo
b2Q6Om5hbWUoKSkpKTsKLSAgICBhcnIuYWRkKElkZW50aWZpZXIoZXhlYywgVVN0cmluZyhRdFBp
eG1hcEFzc2lnblRvRWxlbWVudE1ldGhvZDo6bmFtZSgpKSkpOwotICAgIGFyci5hZGQoSWRlbnRp
ZmllcihleGVjLCBVU3RyaW5nKFF0UGl4bWFwVG9TdHJpbmdNZXRob2Q6Om5hbWUoKSkpKTsKLSAg
ICBhcnIuYWRkKElkZW50aWZpZXIoZXhlYywgVVN0cmluZyhRdFBpeG1hcFdpZHRoRmllbGQ6Om5h
bWUoKSkpKTsKLSAgICBhcnIuYWRkKElkZW50aWZpZXIoZXhlYywgVVN0cmluZyhRdFBpeG1hcEhl
aWdodEZpZWxkOjpuYW1lKCkpKSk7CisgICAgUVZhcmlhbnQmIGRhdGEgPSAqc3RhdGljX2Nhc3Q8
UVZhcmlhbnQqPihKU09iamVjdEdldFByaXZhdGUob2JqZWN0KSk7CisgICAgcmV0dXJuIEpTVmFs
dWVNYWtlTnVtYmVyKGNvbnRleHQsIGltYWdlU2l6ZUZvclZhcmlhbnQoZGF0YSkuaGVpZ2h0KCkp
OwogfQogCi1KU1ZhbHVlIFF0UGl4bWFwSW5zdGFuY2U6OmRlZmF1bHRWYWx1ZShFeGVjU3RhdGUq
IGV4ZWMsIFByZWZlcnJlZFByaW1pdGl2ZVR5cGUgcHR5cGUpIGNvbnN0CitzdGF0aWMgSlNWYWx1
ZVJlZiBhc3NpZ25Ub0hUTUxJbWFnZUVsZW1lbnQoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2Jq
ZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiBvYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50
LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCiB7
Ci0gICAgaWYgKHB0eXBlID09IFByZWZlck51bWJlcikgewotICAgICAgICByZXR1cm4ganNCb29s
ZWFuKAotICAgICAgICAgICAgICAgIChkYXRhLnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFu
dDo6VHlwZT4ocU1ldGFUeXBlSWQ8UUltYWdlPigpKSAmJiAhKGRhdGEudmFsdWU8UUltYWdlPigp
KS5pc051bGwoKSkKLSAgICAgICAgICAgICAgICB8fCAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nh
c3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpICYmICFkYXRhLnZhbHVl
PFFQaXhtYXA+KCkuaXNOdWxsKCkpKTsKLSAgICB9CisgICAgaWYgKCFhcmd1bWVudENvdW50KQor
ICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CiAKLSAgICBpZiAo
cHR5cGUgPT0gUHJlZmVyU3RyaW5nKQotICAgICAgICByZXR1cm4gdmFsdWVPZihleGVjKTsKKyAg
ICBKU09iamVjdFJlZiBvYmplY3RBcmcgPSBKU1ZhbHVlVG9PYmplY3QoY29udGV4dCwgYXJndW1l
bnRzWzBdLCBleGNlcHRpb24pOworICAgIGlmICghb2JqZWN0QXJnKQorICAgICAgICByZXR1cm4g
SlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CiAKLSAgICByZXR1cm4ganNVbmRlZmluZWQo
KTsKKyAgICBKU09iamVjdCoganNPYmplY3QgPSA6OnRvSlMob2JqZWN0QXJnKTsKKworICAgIGlm
ICghanNPYmplY3QtPmluaGVyaXRzKCZKU0hUTUxJbWFnZUVsZW1lbnQ6OnNfaW5mbykpCisgICAg
ICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIFFWYXJpYW50
JiBkYXRhID0gKnN0YXRpY19jYXN0PFFWYXJpYW50Kj4oSlNPYmplY3RHZXRQcml2YXRlKG9iamVj
dCkpOworCisgICAgLy8gV2Ugbm93IGtub3cgdGhhdCB3ZSBoYXZlIGEgdmFsaWQgPGltZz4gZWxl
bWVudCBhcyB0aGUgYXJndW1lbnQsIHdlIGNhbiBhdHRhY2ggdGhlIGltYWdlIHRvIGl0LgorICAg
IFJlZlB0cjxTdGlsbEltYWdlPiBzdGlsbEltYWdlID0gV2ViQ29yZTo6U3RpbGxJbWFnZTo6Y3Jl
YXRlKHRvSW1hZ2UoZGF0YSkpOworICAgIEhUTUxJbWFnZUVsZW1lbnQqIGltYWdlRWxlbWVudCA9
IHN0YXRpY19jYXN0PEhUTUxJbWFnZUVsZW1lbnQqPihzdGF0aWNfY2FzdDxKU0hUTUxJbWFnZUVs
ZW1lbnQqPihqc09iamVjdCktPmltcGwoKSk7CisgICAgaW1hZ2VFbGVtZW50LT5zZXRDYWNoZWRJ
bWFnZShuZXcgQ2FjaGVkSW1hZ2Uoc3RpbGxJbWFnZS5nZXQoKSkpOworICAgIHJldHVybiBKU1Zh
bHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKIH0KIAotSlNWYWx1ZSBRdFBpeG1hcEluc3RhbmNl
Ojp2YWx1ZU9mKEV4ZWNTdGF0ZSogZXhlYykgY29uc3QKK3N0YXRpYyBKU1ZhbHVlUmVmIHBpeG1h
cFRvSW1hZ2VEYXRhKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwg
SlNPYmplY3RSZWYgb2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJl
ZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQogewotICAgIGNvbnN0IFFTdHJp
bmcgc3RyaW5nVmFsdWUgPSBRU3RyaW5nOjpmcm9tTGF0aW4xKCJbUXQgTmF0aXZlIFBpeG1hcCAl
MSwlMl0iKS5hcmcod2lkdGgoKSkuYXJnKGhlaWdodCgpKTsKLSAgICBVU3RyaW5nIHVzdHJpbmco
KFVDaGFyKilzdHJpbmdWYWx1ZS51dGYxNigpLCBzdHJpbmdWYWx1ZS5sZW5ndGgoKSk7Ci0gICAg
cmV0dXJuIGpzU3RyaW5nKGV4ZWMsIHVzdHJpbmcpOworICAgIFFWYXJpYW50JiBkYXRhID0gKnN0
YXRpY19jYXN0PFFWYXJpYW50Kj4oSlNPYmplY3RHZXRQcml2YXRlKG9iamVjdCkpOworICAgIFFJ
bWFnZSBpbWFnZSA9IHRvSW1hZ2UoZGF0YSk7CisgICAgaW50IHdpZHRoID0gaW1hZ2Uud2lkdGgo
KTsKKyAgICBpbnQgaGVpZ2h0ID0gaW1hZ2UuaGVpZ2h0KCk7CisKKyAgICBSZWZQdHI8SW1hZ2VE
YXRhPiBpbWFnZURhdGEgPSBJbWFnZURhdGE6OmNyZWF0ZShJbnRTaXplKHdpZHRoLCBoZWlnaHQp
KTsKKyAgICBjb3B5UGl4ZWxzSW50byhpbWFnZSwgd2lkdGgsIGhlaWdodCwgaW1hZ2VEYXRhLT5k
YXRhKCktPmRhdGEoKSk7CisgICAgSlNET01HbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCA9IHN0
YXRpY19jYXN0PEpTRE9NR2xvYmFsT2JqZWN0Kj4oOjp0b0pTKEpTQ29udGV4dEdldEdsb2JhbE9i
amVjdChjb250ZXh0KSkpOworICAgIEpTQzo6RXhlY1N0YXRlKiBleGVjID0gOjp0b0pTKGNvbnRl
eHQpOworICAgIHJldHVybiA6OnRvUmVmKGV4ZWMsIHRvSlMoZXhlYywgZ2xvYmFsT2JqZWN0LCBp
bWFnZURhdGEuZ2V0KCkpKTsKIH0KIAotUXRQaXhtYXBJbnN0YW5jZTo6UXRQaXhtYXBJbnN0YW5j
ZShQYXNzUmVmUHRyPFJvb3RPYmplY3Q+IHJvb3RPYmosIGNvbnN0IFFWYXJpYW50JiBkKQotICAg
ICAgICA6SW5zdGFuY2Uocm9vdE9iaiksIGRhdGEoZCkKK3N0YXRpYyBKU1ZhbHVlUmVmIHBpeG1h
cFRvRGF0YVVybChKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpT
T2JqZWN0UmVmIG9iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYg
YXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKIHsKKyAgICBRVmFyaWFudCYgZGF0
YSA9ICpzdGF0aWNfY2FzdDxRVmFyaWFudCo+KEpTT2JqZWN0R2V0UHJpdmF0ZShvYmplY3QpKTsK
KyAgICBRQnl0ZUFycmF5IGJ5dGVBcnJheTsKKyAgICBRQnVmZmVyIGJ1ZmZlcigmYnl0ZUFycmF5
KTsKKyAgICB0b0ltYWdlKGRhdGEpLnNhdmUoJmJ1ZmZlciwgIlBORyIpOworICAgIFFCeXRlQXJy
YXkgZW5jb2RlZCA9IFFCeXRlQXJyYXkoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiKSArIGJ5dGVB
cnJheS50b0Jhc2U2NCgpOworICAgIEpTUmV0YWluUHRyPEpTU3RyaW5nUmVmPiBzdHIoQWRvcHQs
IEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5nKGVuY29kZWQuY29uc3REYXRhKCkpKTsKKyAg
ICBKU1ZhbHVlUmVmIHZhbHVlID0gSlNWYWx1ZU1ha2VTdHJpbmcoY29udGV4dCwgc3RyLmdldCgp
KTsKKworICAgIHJldHVybiB2YWx1ZTsKIH0KIAotaW50IFF0UGl4bWFwSW5zdGFuY2U6OndpZHRo
KCkgY29uc3QKK3N0YXRpYyBKU1ZhbHVlUmVmIHBpeG1hcFRvU3RyaW5nKEpTQ29udGV4dFJlZiBj
b250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgb2JqZWN0LCBzaXplX3Qg
YXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiog
ZXhjZXB0aW9uKQogewotICAgIGlmIChkYXRhLnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFu
dDo6VHlwZT4ocU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkpCi0gICAgICAgIHJldHVybiBkYXRhLnZh
bHVlPFFQaXhtYXA+KCkud2lkdGgoKTsKLSAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nh
c3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkpCi0gICAgICAgIHJldHVy
biBkYXRhLnZhbHVlPFFJbWFnZT4oKS53aWR0aCgpOwotICAgIHJldHVybiAwOworICAgIFFWYXJp
YW50JiBkYXRhID0gKnN0YXRpY19jYXN0PFFWYXJpYW50Kj4oSlNPYmplY3RHZXRQcml2YXRlKG9i
amVjdCkpOworICAgIFFTaXplIHNpemUgPSBpbWFnZVNpemVGb3JWYXJpYW50KGRhdGEpOworICAg
IFFTdHJpbmcgc3RyaW5nVmFsdWUgPSBRU3RyaW5nOjpmcm9tTGF0aW4xKCJbUXQgTmF0aXZlIFBp
eG1hcCAlMSwlMl0iKS5hcmcoc2l6ZS53aWR0aCgpKS5hcmcoc2l6ZS5oZWlnaHQoKSk7CisgICAg
SlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IHN0cihBZG9wdCwgSlNTdHJpbmdDcmVhdGVXaXRoVVRG
OENTdHJpbmcoc3RyaW5nVmFsdWUudG9VdGY4KCkuY29uc3REYXRhKCkpKTsKKyAgICBKU1ZhbHVl
UmVmIHZhbHVlID0gSlNWYWx1ZU1ha2VTdHJpbmcoY29udGV4dCwgc3RyLmdldCgpKTsKKworICAg
IHJldHVybiB2YWx1ZTsKIH0KIAotaW50IFF0UGl4bWFwSW5zdGFuY2U6OmhlaWdodCgpIGNvbnN0
CitzdGF0aWMgdm9pZCBmaW5hbGl6ZVBpeG1hcChKU09iamVjdFJlZiBvYmplY3QpCiB7Ci0gICAg
aWYgKGRhdGEudHlwZSgpID09IHN0YXRpY19jYXN0PFFWYXJpYW50OjpUeXBlPihxTWV0YVR5cGVJ
ZDxRUGl4bWFwPigpKSkKLSAgICAgICAgcmV0dXJuIGRhdGEudmFsdWU8UVBpeG1hcD4oKS5oZWln
aHQoKTsKLSAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+
KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkpCi0gICAgICAgIHJldHVybiBkYXRhLnZhbHVlPFFJbWFn
ZT4oKS5oZWlnaHQoKTsKLSAgICByZXR1cm4gMDsKKyAgICBkZWxldGUgc3RhdGljX2Nhc3Q8UVZh
cmlhbnQqPihKU09iamVjdEdldFByaXZhdGUob2JqZWN0KSk7CiB9CiAKLVFQaXhtYXAgUXRQaXht
YXBJbnN0YW5jZTo6dG9QaXhtYXAoKQorSlNPYmplY3RSZWYgUXRQaXhtYXBSdW50aW1lOjp0b0pT
KEpTQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBRVmFyaWFudCYgdmFsdWUsIEpTVmFsdWVSZWYq
IGV4Y2VwdGlvbikKIHsKLSAgICBpZiAoZGF0YS50eXBlKCkgPT0gc3RhdGljX2Nhc3Q8UVZhcmlh
bnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpKQotICAgICAgICByZXR1cm4gZGF0YS52
YWx1ZTxRUGl4bWFwPigpOwotCi0gICAgaWYgKGRhdGEudHlwZSgpID09IHN0YXRpY19jYXN0PFFW
YXJpYW50OjpUeXBlPihxTWV0YVR5cGVJZDxRSW1hZ2U+KCkpKSB7Ci0gICAgICAgIGNvbnN0IFFQ
aXhtYXAgcGl4bWFwID0gUVBpeG1hcDo6ZnJvbUltYWdlKGRhdGEudmFsdWU8UUltYWdlPigpKTsK
LSAgICAgICAgZGF0YSA9IFFWYXJpYW50Ojpmcm9tVmFsdWU8UVBpeG1hcD4ocGl4bWFwKTsKLSAg
ICAgICAgcmV0dXJuIHBpeG1hcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gUVBpeG1hcCgpOworICAg
IHJldHVybiBKU09iamVjdE1ha2UoY29udGV4dCwgZ2V0Q2xhc3NSZWYoKSwgbmV3IFFWYXJpYW50
KHZhbHVlKSk7CiB9CiAKLVFJbWFnZSBRdFBpeG1hcEluc3RhbmNlOjp0b0ltYWdlKCkKK3N0YXRp
YyBRVmFyaWFudCBlbXB0eVZhcmlhbnRGb3JIaW50KFFNZXRhVHlwZTo6VHlwZSBoaW50KQogewot
ICAgIGlmIChkYXRhLnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFudDo6VHlwZT4ocU1ldGFU
eXBlSWQ8UUltYWdlPigpKSkKLSAgICAgICAgcmV0dXJuIGRhdGEudmFsdWU8UUltYWdlPigpOwot
Ci0gICAgaWYgKGRhdGEudHlwZSgpID09IHN0YXRpY19jYXN0PFFWYXJpYW50OjpUeXBlPihxTWV0
YVR5cGVJZDxRUGl4bWFwPigpKSkgewotICAgICAgICBjb25zdCBRSW1hZ2UgaW1hZ2UgPSBkYXRh
LnZhbHVlPFFQaXhtYXA+KCkudG9JbWFnZSgpOwotICAgICAgICBkYXRhID0gUVZhcmlhbnQ6OmZy
b21WYWx1ZTxRSW1hZ2U+KGltYWdlKTsKLSAgICAgICAgcmV0dXJuIGltYWdlOwotICAgIH0KLQot
ICAgIHJldHVybiBRSW1hZ2UoKTsKKyAgICBpZiAoaGludCA9PSBxTWV0YVR5cGVJZDxRUGl4bWFw
PigpKQorICAgICAgICByZXR1cm4gUVZhcmlhbnQ6OmZyb21WYWx1ZShRUGl4bWFwKCkpOworICAg
IGlmIChoaW50ID09IHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkKKyAgICAgICAgcmV0dXJuIFFWYXJp
YW50Ojpmcm9tVmFsdWUoUUltYWdlKCkpOworICAgIHJldHVybiBRVmFyaWFudCgpOwogfQogCi1R
VmFyaWFudCBRdFBpeG1hcEluc3RhbmNlOjp2YXJpYW50RnJvbU9iamVjdChKU09iamVjdCogb2Jq
ZWN0LCBRTWV0YVR5cGU6OlR5cGUgaGludCkKK1FWYXJpYW50IFF0UGl4bWFwUnVudGltZTo6dG9R
dChKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgb2JqLCBRTWV0YVR5cGU6OlR5cGUg
aGludCwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQogewotICAgIGlmICghb2JqZWN0KQotICAgICAg
ICBnb3RvIHJldHVybkVtcHR5VmFyaWFudDsKKyAgICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJu
IGVtcHR5VmFyaWFudEZvckhpbnQoaGludCk7CiAKLSAgICBpZiAob2JqZWN0LT5pbmhlcml0cygm
SlNIVE1MSW1hZ2VFbGVtZW50OjpzX2luZm8pKSB7Ci0gICAgICAgIEpTSFRNTEltYWdlRWxlbWVu
dCogZWxlbWVudEpTV3JhcHBlciA9IHN0YXRpY19jYXN0PEpTSFRNTEltYWdlRWxlbWVudCo+KG9i
amVjdCk7Ci0gICAgICAgIEhUTUxJbWFnZUVsZW1lbnQqIGltYWdlRWxlbWVudCA9IHN0YXRpY19j
YXN0PEhUTUxJbWFnZUVsZW1lbnQqPihlbGVtZW50SlNXcmFwcGVyLT5pbXBsKCkpOworICAgIGlm
IChKU1ZhbHVlSXNPYmplY3RPZkNsYXNzKGNvbnRleHQsIG9iaiwgUXRQaXhtYXBSdW50aW1lOjpn
ZXRDbGFzc1JlZigpKSkgeworICAgICAgICBRVmFyaWFudCogb3JpZ2luYWxWYXJpYW50ID0gc3Rh
dGljX2Nhc3Q8UVZhcmlhbnQqPihKU09iamVjdEdldFByaXZhdGUob2JqKSk7CisgICAgICAgIGlm
IChoaW50ID09IHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpCisgICAgICAgICAgICByZXR1cm4gUVZh
cmlhbnQ6OmZyb21WYWx1ZTxRUGl4bWFwPih0b1BpeG1hcCgqb3JpZ2luYWxWYXJpYW50KSk7CiAK
LSAgICAgICAgaWYgKCFpbWFnZUVsZW1lbnQpCi0gICAgICAgICAgICBnb3RvIHJldHVybkVtcHR5
VmFyaWFudDsKKyAgICAgICAgaWYgKGhpbnQgPT0gcU1ldGFUeXBlSWQ8UUltYWdlPigpKQorICAg
ICAgICAgICAgcmV0dXJuIFFWYXJpYW50Ojpmcm9tVmFsdWU8UUltYWdlPih0b0ltYWdlKCpvcmln
aW5hbFZhcmlhbnQpKTsKKyAgICB9CiAKLSAgICAgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdl
ID0gaW1hZ2VFbGVtZW50LT5jYWNoZWRJbWFnZSgpOwotICAgICAgICBpZiAoIWNhY2hlZEltYWdl
KQotICAgICAgICAgICAgZ290byByZXR1cm5FbXB0eVZhcmlhbnQ7CisgICAgSlNPYmplY3QqIGpz
T2JqZWN0ID0gOjp0b0pTKG9iaik7CisgICAgaWYgKCFqc09iamVjdC0+aW5oZXJpdHMoJkpTSFRN
TEltYWdlRWxlbWVudDo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIGVtcHR5VmFyaWFudEZvckhp
bnQoaGludCk7CiAKLSAgICAgICAgSW1hZ2UqIGltYWdlID0gY2FjaGVkSW1hZ2UtPmltYWdlRm9y
UmVuZGVyZXIoaW1hZ2VFbGVtZW50LT5yZW5kZXJlcigpKTsKLSAgICAgICAgaWYgKCFpbWFnZSkK
LSAgICAgICAgICAgIGdvdG8gcmV0dXJuRW1wdHlWYXJpYW50OworICAgIEpTSFRNTEltYWdlRWxl
bWVudCogZWxlbWVudEpTV3JhcHBlciA9IHN0YXRpY19jYXN0PEpTSFRNTEltYWdlRWxlbWVudCo+
KGpzT2JqZWN0KTsKKyAgICBIVE1MSW1hZ2VFbGVtZW50KiBpbWFnZUVsZW1lbnQgPSBzdGF0aWNf
Y2FzdDxIVE1MSW1hZ2VFbGVtZW50Kj4oZWxlbWVudEpTV3JhcHBlci0+aW1wbCgpKTsKIAotICAg
ICAgICBRSW1hZ2UqIG5hdGl2ZUltYWdlID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZy
YW1lKCk7Ci0gICAgICAgIGlmICghbmF0aXZlSW1hZ2UpCi0gICAgICAgICAgICBnb3RvIHJldHVy
bkVtcHR5VmFyaWFudDsKKyAgICBpZiAoIWltYWdlRWxlbWVudCkKKyAgICAgICAgcmV0dXJuIGVt
cHR5VmFyaWFudEZvckhpbnQoaGludCk7CiAKLSAgICAgICAgcmV0dXJuIChoaW50ID09IHN0YXRp
Y19jYXN0PFFNZXRhVHlwZTo6VHlwZT4ocU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkpCi0gICAgICAg
ICAgICAgICAgICA/IFFWYXJpYW50Ojpmcm9tVmFsdWU8UVBpeG1hcD4oUVBpeG1hcDo6ZnJvbUlt
YWdlKCpuYXRpdmVJbWFnZSkpCi0gICAgICAgICAgICAgICAgICA6IFFWYXJpYW50Ojpmcm9tVmFs
dWU8UUltYWdlPigqbmF0aXZlSW1hZ2UpOwotICAgIH0KKyAgICBDYWNoZWRJbWFnZSogY2FjaGVk
SW1hZ2UgPSBpbWFnZUVsZW1lbnQtPmNhY2hlZEltYWdlKCk7CisgICAgaWYgKCFjYWNoZWRJbWFn
ZSkKKyAgICAgICAgcmV0dXJuIGVtcHR5VmFyaWFudEZvckhpbnQoaGludCk7CiAKLSAgICBpZiAo
b2JqZWN0LT5pbmhlcml0cygmUXRQaXhtYXBSdW50aW1lT2JqZWN0OjpzX2luZm8pKSB7Ci0gICAg
ICAgIFF0UGl4bWFwUnVudGltZU9iamVjdCogcnVudGltZU9iamVjdCA9IHN0YXRpY19jYXN0PFF0
UGl4bWFwUnVudGltZU9iamVjdCo+KG9iamVjdCk7Ci0gICAgICAgIFF0UGl4bWFwSW5zdGFuY2Uq
IGluc3RhbmNlID0gc3RhdGljX2Nhc3Q8UXRQaXhtYXBJbnN0YW5jZSo+KHJ1bnRpbWVPYmplY3Qt
PmdldEludGVybmFsSW5zdGFuY2UoKSk7Ci0gICAgICAgIGlmICghaW5zdGFuY2UpCi0gICAgICAg
ICAgICBnb3RvIHJldHVybkVtcHR5VmFyaWFudDsKKyAgICBJbWFnZSogaW1hZ2UgPSBjYWNoZWRJ
bWFnZS0+aW1hZ2VGb3JSZW5kZXJlcihpbWFnZUVsZW1lbnQtPnJlbmRlcmVyKCkpOworICAgIGlm
ICghaW1hZ2UpCisgICAgICAgIHJldHVybiBlbXB0eVZhcmlhbnRGb3JIaW50KGhpbnQpOwogCi0g
ICAgICAgIGlmIChoaW50ID09IHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpCi0gICAgICAgICAgICBy
ZXR1cm4gUVZhcmlhbnQ6OmZyb21WYWx1ZTxRUGl4bWFwPihpbnN0YW5jZS0+dG9QaXhtYXAoKSk7
CisgICAgUUltYWdlKiBuYXRpdmVJbWFnZSA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRG
cmFtZSgpOworICAgIGlmICghbmF0aXZlSW1hZ2UpCisgICAgICAgIHJldHVybiBlbXB0eVZhcmlh
bnRGb3JIaW50KGhpbnQpOwogCi0gICAgICAgIGlmIChoaW50ID09IHFNZXRhVHlwZUlkPFFJbWFn
ZT4oKSkKLSAgICAgICAgICAgIHJldHVybiBRVmFyaWFudDo6ZnJvbVZhbHVlPFFJbWFnZT4oaW5z
dGFuY2UtPnRvSW1hZ2UoKSk7Ci0gICAgfQotCi1yZXR1cm5FbXB0eVZhcmlhbnQ6Ci0gICAgaWYg
KGhpbnQgPT0gcU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkKLSAgICAgICAgcmV0dXJuIFFWYXJpYW50
Ojpmcm9tVmFsdWU8UVBpeG1hcD4oUVBpeG1hcCgpKTsKLSAgICBpZiAoaGludCA9PSBxTWV0YVR5
cGVJZDxRSW1hZ2U+KCkpCi0gICAgICAgIHJldHVybiBRVmFyaWFudDo6ZnJvbVZhbHVlPFFJbWFn
ZT4oUUltYWdlKCkpOwotICAgIHJldHVybiBRVmFyaWFudCgpOworICAgIHJldHVybiAoaGludCA9
PSBzdGF0aWNfY2FzdDxRTWV0YVR5cGU6OlR5cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpKQor
ICAgICAgICAgICAgICA/IFFWYXJpYW50Ojpmcm9tVmFsdWU8UVBpeG1hcD4oUVBpeG1hcDo6ZnJv
bUltYWdlKCpuYXRpdmVJbWFnZSkpCisgICAgICAgICAgICAgIDogUVZhcmlhbnQ6OmZyb21WYWx1
ZTxRSW1hZ2U+KCpuYXRpdmVJbWFnZSk7CiB9CiAKLVJ1bnRpbWVPYmplY3QqIFF0UGl4bWFwSW5z
dGFuY2U6Om5ld1J1bnRpbWVPYmplY3QoRXhlY1N0YXRlKiBleGVjKQorYm9vbCBRdFBpeG1hcFJ1
bnRpbWU6OmNhbkhhbmRsZShRTWV0YVR5cGU6OlR5cGUgaGludCkKIHsKLSAgICByZXR1cm4gUXRQ
aXhtYXBSdW50aW1lT2JqZWN0OjpjcmVhdGUoZXhlYywgZXhlYy0+bGV4aWNhbEdsb2JhbE9iamVj
dCgpLCB0aGlzKTsKKyAgICByZXR1cm4gaGludCA9PSBxTWV0YVR5cGVJZDxRSW1hZ2U+KCkgfHwg
aGludCA9PSBxTWV0YVR5cGVJZDxRUGl4bWFwPigpOwogfQogCi1KU09iamVjdCogUXRQaXhtYXBJ
bnN0YW5jZTo6Y3JlYXRlUGl4bWFwUnVudGltZU9iamVjdChFeGVjU3RhdGUqIGV4ZWMsIFBhc3NS
ZWZQdHI8Um9vdE9iamVjdD4gcm9vdCwgY29uc3QgUVZhcmlhbnQmIGRhdGEpCitKU0NsYXNzUmVm
IFF0UGl4bWFwUnVudGltZTo6Z2V0Q2xhc3NSZWYoKQogewotICAgIEpTTG9ja0hvbGRlciBsb2Nr
KGV4ZWMpOwotICAgIFJlZlB0cjxRdFBpeG1hcEluc3RhbmNlPiBpbnN0YW5jZSA9IGFkb3B0UmVm
KG5ldyBRdFBpeG1hcEluc3RhbmNlKHJvb3QsIGRhdGEpKTsKLSAgICByZXR1cm4gaW5zdGFuY2Ut
PmNyZWF0ZVJ1bnRpbWVPYmplY3QoZXhlYyk7CisgICAgc3RhdGljIGNvbnN0IEpTU3RhdGljVmFs
dWUgc3RhdGljVmFsdWVzW10gPSB7CisgICAgICAgIHsgIndpZHRoIiwgZ2V0UGl4bWFwV2lkdGgs
IDAsIDAgfSwKKyAgICAgICAgeyAiaGVpZ2h0IiwgZ2V0UGl4bWFwSGVpZ2h0LCAwLCAwIH0KKyAg
ICB9OworCisgICAgc3RhdGljIGNvbnN0IEpTU3RhdGljRnVuY3Rpb24gc3RhdGljRnVuY3Rpb25z
W10gPSB7CisgICAgICAgIHsgImFzc2lnblRvIiwgYXNzaWduVG9IVE1MSW1hZ2VFbGVtZW50LCAw
IH0sCisgICAgICAgIHsgInRvRGF0YVVybCIsIHBpeG1hcFRvRGF0YVVybCwgMCB9LAorICAgICAg
ICB7ICJ0b0ltYWdlRGF0YSIsIHBpeG1hcFRvSW1hZ2VEYXRhLCAwIH0sCisgICAgICAgIHsgInRv
U3RyaW5nIiwgcGl4bWFwVG9TdHJpbmcsIDAgfQorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3Qg
SlNDbGFzc0RlZmluaXRpb24gY2xhc3NEZWZpbml0aW9uID0geworICAgICAgICAwLCAwLCAiUXRQ
aXhtYXBSdW50aW1lT2JqZWN0IiwgMCwgc3RhdGljVmFsdWVzLCBzdGF0aWNGdW5jdGlvbnMsCisg
ICAgICAgIDAsIGZpbmFsaXplUGl4bWFwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwCisgICAg
fTsKKworICAgIHN0YXRpYyBKU0NsYXNzUmVmIGNsYXNzUmVmID0gSlNDbGFzc0NyZWF0ZSgmY2xh
c3NEZWZpbml0aW9uKTsKKyAgICByZXR1cm4gY2xhc3NSZWY7CiB9CiAKLWJvb2wgUXRQaXhtYXBJ
bnN0YW5jZTo6Y2FuSGFuZGxlKFFNZXRhVHlwZTo6VHlwZSBoaW50KQotewotICAgIHJldHVybiBo
aW50ID09IHFNZXRhVHlwZUlkPFFJbWFnZT4oKSB8fCBoaW50ID09IHFNZXRhVHlwZUlkPFFQaXht
YXA+KCk7Ci19CiAKIH0KIApkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYnJpZGdlL3F0L3F0
X3BpeG1hcHJ1bnRpbWUuaCBiL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9waXhtYXBydW50
aW1lLmgKaW5kZXggYzQxYzllMmUwNTQ4YTI5ZDc1ZmQzYmQ4OWY1ZmJjNTc0MmJkMzE2Zi4uMWZk
YTAxNjMzYTczMjVmYzgzMjBiY2M3M2VmMDMzN2RjNGQ1MGRkZCAxMDA2NDQKLS0tIGEvU291cmNl
L1dlYkNvcmUvYnJpZGdlL3F0L3F0X3BpeG1hcHJ1bnRpbWUuaAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9icmlkZ2UvcXQvcXRfcGl4bWFwcnVudGltZS5oCkBAIC0yMSwzMSArMjEsMjAgQEAKICNkZWZp
bmUgcXRfcGl4bWFwcnVudGltZV9oCiAKICNpbmNsdWRlICJCcmlkZ2VKU0MuaCIKKyNpbmNsdWRl
ICJKYXZhU2NyaXB0LmgiCiAjaW5jbHVkZSA8UVZhcmlhbnQ+CiAKIG5hbWVzcGFjZSBKU0Mgewog
CiBuYW1lc3BhY2UgQmluZGluZ3MgewogCi1jbGFzcyBRdFBpeG1hcEluc3RhbmNlIDogcHVibGlj
IEluc3RhbmNlIHsKLSAgICBRVmFyaWFudCBkYXRhOworY2xhc3MgUXRQaXhtYXBSdW50aW1lIHsK
IHB1YmxpYzoKLSAgICBRdFBpeG1hcEluc3RhbmNlKFBhc3NSZWZQdHI8Um9vdE9iamVjdD4gcm9v
dE9iaiwgY29uc3QgUVZhcmlhbnQmIG5ld0RhdGEpOwotICAgIHZpcnR1YWwgQ2xhc3MqIGdldENs
YXNzKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBKU1ZhbHVlIGdldE1ldGhvZChFeGVjU3RhdGUqLCBQ
cm9wZXJ0eU5hbWUpOwotICAgIHZpcnR1YWwgSlNWYWx1ZSBpbnZva2VNZXRob2QoRXhlY1N0YXRl
KiwgUnVudGltZU1ldGhvZCopOwotICAgIHZpcnR1YWwgdm9pZCBnZXRQcm9wZXJ0eU5hbWVzKEV4
ZWNTdGF0ZSosIFByb3BlcnR5TmFtZUFycmF5Jik7Ci0KLSAgICB2aXJ0dWFsIEpTVmFsdWUgZGVm
YXVsdFZhbHVlKEV4ZWNTdGF0ZSosIFByZWZlcnJlZFByaW1pdGl2ZVR5cGUpIGNvbnN0OwotICAg
IHZpcnR1YWwgSlNWYWx1ZSB2YWx1ZU9mKEV4ZWNTdGF0ZSopIGNvbnN0OwotICAgIGludCB3aWR0
aCgpIGNvbnN0OwotICAgIGludCBoZWlnaHQoKSBjb25zdDsKLSAgICBRUGl4bWFwIHRvUGl4bWFw
KCk7Ci0gICAgUUltYWdlIHRvSW1hZ2UoKTsKLSAgICBSdW50aW1lT2JqZWN0KiBuZXdSdW50aW1l
T2JqZWN0KEV4ZWNTdGF0ZSopOwotICAgIHN0YXRpYyBKU09iamVjdCogY3JlYXRlUGl4bWFwUnVu
dGltZU9iamVjdChFeGVjU3RhdGUqLCBQYXNzUmVmUHRyPFJvb3RPYmplY3Q+LCBjb25zdCBRVmFy
aWFudCYpOwotICAgIHN0YXRpYyBRVmFyaWFudCB2YXJpYW50RnJvbU9iamVjdChKU09iamVjdCos
IFFNZXRhVHlwZTo6VHlwZSBoaW50KTsKKyAgICBzdGF0aWMgSlNPYmplY3RSZWYgdG9KUyhKU0Nv
bnRleHRSZWYsIGNvbnN0IFFWYXJpYW50JiwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKTsKKyAgICBz
dGF0aWMgUVZhcmlhbnQgdG9RdChKU0NvbnRleHRSZWYsIEpTT2JqZWN0UmVmLCBRTWV0YVR5cGU6
OlR5cGUgaGludCwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKTsKICAgICBzdGF0aWMgYm9vbCBjYW5I
YW5kbGUoUU1ldGFUeXBlOjpUeXBlIGhpbnQpOworCisgICAgc3RhdGljIEpTQ2xhc3NSZWYgZ2V0
Q2xhc3NSZWYoKTsKIH07CiAKIH0KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9x
dC9xdF9ydW50aW1lLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2JyaWRnZS9xdC9xdF9ydW50aW1lLmNw
cAppbmRleCBjODNjZDg2ZjY0YjdlYWZhODRlYWNkZDBjOTIwZmQwMzExNTBiYzE4Li40ZmZhNDM0
YTZjMjM3OWYyZWE3NDA1NjU2N2ZiZDI3ZGFjMTlkYzQ1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2Vi
Q29yZS9icmlkZ2UvcXQvcXRfcnVudGltZS5jcHAKKysrIGIvU291cmNlL1dlYkNvcmUvYnJpZGdl
L3F0L3F0X3J1bnRpbWUuY3BwCkBAIC02MjMsOCArNjIzLDggQEAgUVZhcmlhbnQgY29udmVydFZh
bHVlVG9RVmFyaWFudChKU0NvbnRleHRSZWYgY29udGV4dCwgSlNWYWx1ZVJlZiB2YWx1ZSwgUU1l
dGFUeXAKICAgICAgICAgICAgICAgICByZXQgPSBRVmFyaWFudDo6ZnJvbVZhbHVlKGNvbnZlcnRU
b0xpc3Q8aW50Pihjb250ZXh0LCB0eXBlLCBvYmplY3QsIHZhbHVlLCAmZGlzdCwgZXhjZXB0aW9u
KSk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBp
ZiAoUXRQaXhtYXBJbnN0YW5jZTo6Y2FuSGFuZGxlKHN0YXRpY19jYXN0PFFNZXRhVHlwZTo6VHlw
ZT4oaGludCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0ID0gUXRQaXhtYXBJbnN0YW5jZTo6dmFy
aWFudEZyb21PYmplY3QodG9KUyhvYmplY3QpLCBzdGF0aWNfY2FzdDxRTWV0YVR5cGU6OlR5cGU+
KGhpbnQpKTsKKyAgICAgICAgICAgIGlmIChRdFBpeG1hcFJ1bnRpbWU6OmNhbkhhbmRsZShzdGF0
aWNfY2FzdDxRTWV0YVR5cGU6OlR5cGU+KGhpbnQpKSkgeworICAgICAgICAgICAgICAgIHJldCA9
IFF0UGl4bWFwUnVudGltZTo6dG9RdChjb250ZXh0LCBvYmplY3QsIHN0YXRpY19jYXN0PFFNZXRh
VHlwZTo6VHlwZT4oaGludCksIGV4Y2VwdGlvbik7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGN1
c3RvbVJ1bnRpbWVDb252ZXJzaW9ucygpLT5jb250YWlucyhoaW50KSkgewogICAgICAgICAgICAg
ICAgIHJldCA9IGN1c3RvbVJ1bnRpbWVDb252ZXJzaW9ucygpLT52YWx1ZShoaW50KS50b1Zhcmlh
bnRGdW5jKHRvSlMob2JqZWN0KSwgJmRpc3QsIHZpc2l0ZWRPYmplY3RzKTsKICAgICAgICAgICAg
ICAgICBpZiAoZGlzdCA9PSAwKQpAQCAtNzQwLDEwICs3NDAsOCBAQCBKU1ZhbHVlUmVmIGNvbnZl
cnRRVmFyaWFudFRvVmFsdWUoSlNDb250ZXh0UmVmIGNvbnRleHQsIFBhc3NSZWZQdHI8Um9vdE9i
amVjdD4gcgogICAgICAgICByZXR1cm4gdG9SZWYoZXhlYywgUXRJbnN0YW5jZTo6Z2V0UXRJbnN0
YW5jZShvYmosIHJvb3QsIFF0SW5zdGFuY2U6OlF0T3duZXJzaGlwKS0+Y3JlYXRlUnVudGltZU9i
amVjdChleGVjKSk7CiAgICAgfQogCi0gICAgaWYgKFF0UGl4bWFwSW5zdGFuY2U6OmNhbkhhbmRs
ZShzdGF0aWNfY2FzdDxRTWV0YVR5cGU6OlR5cGU+KHZhcmlhbnQudHlwZSgpKSkpIHsKLSAgICAg
ICAgRXhlY1N0YXRlKiBleGVjID0gdG9KUyhjb250ZXh0KTsKLSAgICAgICAgcmV0dXJuIHRvUmVm
KGV4ZWMsIFF0UGl4bWFwSW5zdGFuY2U6OmNyZWF0ZVBpeG1hcFJ1bnRpbWVPYmplY3QoZXhlYywg
cm9vdCwgdmFyaWFudCkpOwotICAgIH0KKyAgICBpZiAoUXRQaXhtYXBSdW50aW1lOjpjYW5IYW5k
bGUoc3RhdGljX2Nhc3Q8UU1ldGFUeXBlOjpUeXBlPih2YXJpYW50LnR5cGUoKSkpKQorICAgICAg
ICByZXR1cm4gUXRQaXhtYXBSdW50aW1lOjp0b0pTKGNvbnRleHQsIHZhcmlhbnQsIGV4Y2VwdGlv
bik7CiAKICAgICBpZiAoY3VzdG9tUnVudGltZUNvbnZlcnNpb25zKCktPmNvbnRhaW5zKHR5cGUp
KSB7CiAgICAgICAgIGlmICghcm9vdC0+Z2xvYmFsT2JqZWN0KCktPmluaGVyaXRzKCZKU0RPTVdp
bmRvdzo6c19pbmZvKSkK
</data>
<flag name="review"
          id="171898"
          type_id="1"
          status="+"
          setter="kenneth"
    />
          </attachment>
      

    </bug>

</bugzilla>