<?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>45150</bug_id>
          
          <creation_ts>2010-09-02 16:16:57 -0700</creation_ts>
          <short_desc>[Qt] V8 port for Qt platform: Qt bridge port</short_desc>
          <delta_ts>2010-09-20 02:46:54 -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>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>WONTFIX</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>Qt, QtTriaged</keywords>
          <priority>P3</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>45136</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Vlad">vladbph</reporter>
          <assigned_to name="Vlad">vladbph</assigned_to>
          <cc>christian.webkit</cc>
    
    <cc>hausmann</cc>
    
    <cc>kling</cc>
    
    <cc>laszlo.gombos</cc>
    
    <cc>s.mathur</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>273654</commentid>
    <comment_count>0</comment_count>
    <who name="Vlad">vladbph</who>
    <bug_when>2010-09-02 16:16:57 -0700</bug_when>
    <thetext>V8 qt meta system port. Reimplemented qt bridge runtime, instance and pixmapruntime components.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273701</commentid>
    <comment_count>1</comment_count>
      <attachid>66446</attachid>
    <who name="Vlad">vladbph</who>
    <bug_when>2010-09-02 17:55:00 -0700</bug_when>
    <thetext>Created attachment 66446
QT meta system port for v8</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>274630</commentid>
    <comment_count>2</comment_count>
      <attachid>66446</attachid>
    <who name="anton muhin">antonm</who>
    <bug_when>2010-09-06 07:48:47 -0700</bug_when>
    <thetext>Comment on attachment 66446
QT meta system port for v8

Just a couple of notes:

1) I am not a WebKit reviewer yet, but probably would be soon;
2) for me the patch is just too big, it might be easier to digest and understand if it&apos;s split into smaller parts;
3) feel free to cc me (antonm@chromium.org) on v8 related stuff---I did enough work on Chromium bindings, esp. in things closer to v8 proper.

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

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:2
&gt; + * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
Maybe 2010?


&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:56
&gt; +    v8ClassTempl = v8::Persistent&lt;v8::FunctionTemplate&gt;::New(v8::FunctionTemplate::New());
1) why not declare and initialize in one go?
2) v8ClassTempl is (apparently) a local handle, in that case using persistent handles would have performance/memory usage drawbacks and no real benefits (here and in all the cases below)

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:66
&gt; +    // But which way is faster?
internal fields are ways faster.

Note as well, there are SetPointerIntoInternalField/GetPointerFromInternalField which should be preferred over explicit wrapping (at least if you care about performance :)

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:72
&gt; +    m_v8Obj-&gt;SetHiddenValue(v8::String::New(&quot;__qt_hidden_marker__&quot;), v8::External::Wrap(this));
I am not quite sure how does it work---I am not sure it&apos;ll retain this.  And SetHiddenValue may affect internal fields if memory serves

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:147
&gt; +        if (d-&gt;m_allowPrivate)
up to you, but I would split into two parts: attributes calculation and actual m_v8Obj-&gt;Set

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:156
&gt; +QtInstance::~QtInstance()
you don&apos;t make m_v8Obj weak and do not dispose it, that looks like a leak unless there is some other code which does that

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:204
&gt; +    return v8::Boolean::New(false);
there is v8::False() which is better imho

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:209
&gt; +    QtInstance* inst = static_cast&lt;QtInstance*&gt;(v8::External::Unwrap(info.Holder()-&gt;GetInternalField(0)));
ditto for GetPointerFromIntenalField

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:221
&gt; +    if (!inst-&gt;getObject() /*&amp;&amp; !inst-&gt;m_methods.contains(ba) */) {
commented out code

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:303
&gt; +    m_v8Obj-&gt;Set(v8::String::New(name), value);
maybe you should use this method in ctor above

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:344
&gt; +        for (i = 0; i &lt; meta-&gt;propertyCount(); i++) {
I&apos;d personally would use separate i&apos;s for both loops

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:412
&gt; +    return v8::Boolean::New(true);
ditto for v8::True()

&gt; WebCore/bridge/qt/v8/qt_instancev8.cpp:488
&gt; +        fieldGetter, fieldPropertyHandlerSetter, 0, 0, 0, v8::String::New(&quot;QObject PropertyHandler&quot;));
you could probably omit datum if you don&apos;t use it

&gt; WebCore/bridge/qt/v8/qt_pixmapruntimev8.cpp:2
&gt; + * Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
2010?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>277081</commentid>
    <comment_count>3</comment_count>
      <attachid>66446</attachid>
    <who name="Andreas Kling">kling</who>
    <bug_when>2010-09-10 02:06:41 -0700</bug_when>
    <thetext>Comment on attachment 66446
QT meta system port for v8

Please address Anton&apos;s comments.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280992</commentid>
    <comment_count>4</comment_count>
      <attachid>67972</attachid>
    <who name="Vlad">vladbph</who>
    <bug_when>2010-09-17 16:57:50 -0700</bug_when>
    <thetext>Created attachment 67972
Review changes. NOT a patch for commit yet.

It is not a patch yet until datemath issue is sorted out. https://bugs.webkit.org/show_bug.cgi?id=45142. 
Anton, could you please take a look at the changes. Especially part of handling weak pointer to the injected QtObject.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>280997</commentid>
    <comment_count>5</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2010-09-17 17:03:45 -0700</bug_when>
    <thetext>Attachment 67972 did not pass style-queue:

Failed to run &quot;[&apos;WebKitTools/Scripts/check-webkit-style&apos;]&quot; exit_code: 1
Total errors found: 0 in 0 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>281472</commentid>
    <comment_count>6</comment_count>
    <who name="Simon Hausmann">hausmann</who>
    <bug_when>2010-09-20 02:46:54 -0700</bug_when>
    <thetext>I think with the current changes in the trunk we can close this as wontfix. We can re-open this bug if the need for non-QtScript based QObject bindings arises again, but for the moment I don&apos;t see the need for them.

After all it is our long-term vision to remove the custom bridging/bindings code in the Qt port of WebKit.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>66446</attachid>
            <date>2010-09-02 17:55:00 -0700</date>
            <delta_ts>2010-09-10 02:06:41 -0700</delta_ts>
            <desc>QT meta system port for v8</desc>
            <filename>v8_qt_bridge.patch</filename>
            <type>text/plain</type>
            <size>114487</size>
            <attacher name="Vlad">vladbph</attacher>
            
              <data encoding="base64">SW5kZXg6IFdlYkNvcmUvYnJpZGdlL3F0L3Y4L3F0X2luc3RhbmNldjguY3BwDQo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
DQotLS0gV2ViQ29yZS9icmlkZ2UvcXQvdjgvcXRfaW5zdGFuY2V2OC5jcHAJKHJldmlzaW9uIDAp
DQorKysgV2ViQ29yZS9icmlkZ2UvcXQvdjgvcXRfaW5zdGFuY2V2OC5jcHAJKHJldmlzaW9uIDAp
DQpAQCAtMCwwICsxLDY1MCBAQA0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29y
cG9yYXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBt
b2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGlj
CisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0
ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBB
TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1F
UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0
aGUgR05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExl
c3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7
IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAx
ICBVU0EKKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInF0X2luc3Rh
bmNldjguaCIKKworI2luY2x1ZGUgIlY4UHJveHkuaCIKKyNpbmNsdWRlICJxdF9ydW50aW1ldjgu
aCIKKyNpbmNsdWRlICJxd2ViZWxlbWVudC5oIgorI2luY2x1ZGUgPHFkZWJ1Zy5oPgorI2luY2x1
ZGUgPHFoYXNoLmg+CisjaW5jbHVkZSA8cW1ldGFvYmplY3QuaD4KKyNpbmNsdWRlIDxxbWV0YXR5
cGUuaD4KKyNpbmNsdWRlIDx2OC5oPgorI2luY2x1ZGUgPHd0Zi9TdGRMaWJFeHRyYXMuaD4KKwor
dXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CituYW1lc3BhY2UgVjggeworbmFtZXNwYWNlIEJpbmRp
bmdzIHsKKworLy8gQ2FjaGUgUXRJbnN0YW5jZXMKK3R5cGVkZWYgUU11bHRpSGFzaDx2b2lkKiwg
UXRJbnN0YW5jZSo+IFFPYmplY3RJbnN0YW5jZU1hcDsKK3N0YXRpYyBRT2JqZWN0SW5zdGFuY2VN
YXAgY2FjaGVkSW5zdGFuY2VzOworCisKK1F0SW5zdGFuY2U6OlF0SW5zdGFuY2UoUU9iamVjdCog
b2JqLCB2ODo6SGFuZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0LCBRU3RyaW5nIG5hbWUsIFFTY3Jp
cHRFbmdpbmU6OlZhbHVlT3duZXJzaGlwIG93bmVyc2hpcCkgCisgICAgOiBtX2NvbnRleHQodjg6
OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+OjpOZXcoY29udGV4dCkpCisgICAgLCBtX29iamVjdChv
YmopCisgICAgLCBtX2hhc2hrZXkob2JqKQorICAgICwgbV9vd25lcnNoaXAob3duZXJzaGlwKQor
ICAgICwgbV9qc05hbWUobmFtZS50b0xhdGluMSgpKQorICAgICwgbV9pc1ZhbGlkKHRydWUpCit7
CisgICAgcVJlZ2lzdGVyTWV0YVR5cGU8UU9iamVjdExpc3Q+KCk7CisgICAgcVJlZ2lzdGVyTWV0
YVR5cGU8UUxpc3Q8aW50PiA+KCk7CisgICAgcVJlZ2lzdGVyTWV0YVR5cGU8UVZhcmlhbnQ+KCk7
CisgICAgcVJlZ2lzdGVyTWV0YVR5cGU8UVdlYkVsZW1lbnQ+KCk7CisKKyAgICB2ODo6SGFuZGxl
PHY4OjpGdW5jdGlvblRlbXBsYXRlPiB2OENsYXNzVGVtcGw7CisgICAgdjhDbGFzc1RlbXBsID0g
djg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+OjpOZXcodjg6OkZ1bmN0aW9uVGVt
cGxhdGU6Ok5ldygpKTsKKyAgICB2OENsYXNzVGVtcGwtPlNldENsYXNzTmFtZSh2ODo6U3RyaW5n
OjpOZXcobV9qc05hbWUuY29uc3REYXRhKCkpKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3RU
ZW1wbGF0ZT4gdjhQcm9wVGVtcGw7CisgICAgdjhQcm9wVGVtcGwgPSB2ODo6UGVyc2lzdGVudDx2
ODo6T2JqZWN0VGVtcGxhdGU+OjpOZXcodjhDbGFzc1RlbXBsLT5JbnN0YW5jZVRlbXBsYXRlKCkp
OworICAgIHY4UHJvcFRlbXBsLT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMSk7CisgICAgU2V0QWNj
ZXNzb3JzKHY4UHJvcFRlbXBsKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4gdjhGdW5j
ID0gdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPjo6TmV3KHY4Q2xhc3NUZW1wbC0+R2V0RnVu
Y3Rpb24oKSk7CisgICAgbV92OE9iaiA9IHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+OjpOZXco
djhGdW5jLT5OZXdJbnN0YW5jZSgpKTsKKworICAgIC8vIFNldCBpbnRlcm5hbCBmaWxlZCBmb3Ig
YWNjZXNzb3JzIC0gbWF5IGJlIGp1c3QgdXNlIGhpZGRlbiBmaWVsZCBiZWxvdy4uLgorICAgIC8v
IEJ1dCB3aGljaCB3YXkgaXMgZmFzdGVyPworICAgIG1fdjhPYmotPlNldEludGVybmFsRmllbGQo
MCwgdjg6OkV4dGVybmFsOjpXcmFwKHRoaXMpKTsKKworICAgIC8vIE5lZWQgdG8gbWFyayB0aGUg
b2JqZWN0IHNvIHdlIGNhbiBzYWZlbHkgZ2V0IHF0SW5zdGFuY2UgZnJvbSB2OCBvYmplY3QKKyAg
ICAvLyBIaWRkZW4gZmllbGQgc2V0IHRvIHF0SW5zdGFuY2UgdG8gaGF2ZSBvbmUgcm91dGluZyBn
ZXR0aW5nIHF0SW5zdGFuY2UgCisgICAgLy8gZnJvbSBRT2JqZWN0KGpzLU9iamVjdCkgYW5kIG1l
dGhvZChqcy1GdW5jdGlvbikKKyAgICBtX3Y4T2JqLT5TZXRIaWRkZW5WYWx1ZSh2ODo6U3RyaW5n
OjpOZXcoIl9fcXRfaGlkZGVuX21hcmtlcl9fIiksIHY4OjpFeHRlcm5hbDo6V3JhcCh0aGlzKSk7
CisKKyAgICAvLyAuLi4gYWZ0ZXIgb2JqZWN0IGNyZWF0aW9uCisgICAgZm9yIChRSGFzaDxRQnl0
ZUFycmF5LCBRdFJ1bnRpbWVNZXRhTWV0aG9kKj46Okl0ZXJhdG9yIGl0ID0gbV9tZXRob2RzLmJl
Z2luKCksCisgICAgICAgIGVuZCA9IG1fbWV0aG9kcy5lbmQoKTsgaXQgIT0gZW5kOyArK2l0KSB7
CisKKyAgICAgICAgUXRSdW50aW1lTWV0YU1ldGhvZERhdGEqIGQgPSBpdC52YWx1ZSgpLT5kZnVu
YygpOworICAgICAgICBRdFJ1bnRpbWVNZXRhTWV0aG9kKiBxcnRtZXRob2QgPSBpdC52YWx1ZSgp
OworCisgICAgICAgIC8vIENyZWF0ZSBzaWduYWwgdGVtcGxhdGUgLSBzZXQgY2FsbGJhY2sgYW5k
IGl0cyBwYXJhbWV0ZXIKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4g
bWV0aG9kVGVtcGwgPSAKKyAgICAgICAgICAgIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoUXRS
dW50aW1lTWV0YU1ldGhvZDo6Y2FsbCwgdjg6OkV4dGVybmFsOjpXcmFwKHFydG1ldGhvZCkpOwor
ICAgICAgICAvLyBDcmVhdGUgcHJvcGVydGllcyBmb3IgaXQKKyAgICAgICAgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0VGVtcGxhdGU+IG1ldGhvZGxQcm9wVGVtcGwgPSBtZXRob2RUZW1wbC0+SW5zdGFu
Y2VUZW1wbGF0ZSgpOworCisgICAgICAgIG1ldGhvZGxQcm9wVGVtcGwtPlNldEFjY2Vzc29yKAor
ICAgICAgICAgICAgdjg6OlN0cmluZzo6TmV3KCJjb25uZWN0IiksIAorICAgICAgICAgICAgICAg
IGZpZWxkR2V0dGVyLCAKKyAgICAgICAgICAgICAgICBmaWVsZFNldHRlciwgCisgICAgICAgICAg
ICAgICAgdjg6OlN0cmluZzo6TmV3KCJjb25uZWN0IiksCisgICAgICAgICAgICAgICAgdjg6OkRF
RkFVTFQsIAorICAgICAgICAgICAgICAgIHY4OjpEb250RGVsZXRlKTsKKyAgICAgICAgbWV0aG9k
bFByb3BUZW1wbC0+U2V0QWNjZXNzb3IoCisgICAgICAgICAgICB2ODo6U3RyaW5nOjpOZXcoImRp
c2Nvbm5lY3QiKSwgCisgICAgICAgICAgICAgICAgZmllbGRHZXR0ZXIsIAorICAgICAgICAgICAg
ICAgIGZpZWxkU2V0dGVyLCAKKyAgICAgICAgICAgICAgICB2ODo6U3RyaW5nOjpOZXcoImRpc2Nv
bm5lY3QiKSwKKyAgICAgICAgICAgICAgICB2ODo6REVGQVVMVCwgCisgICAgICAgICAgICAgICAg
djg6OkRvbnREZWxldGUpOworCisgICAgICAgIC8vIENyZWF0ZSBhY3R1YWwgZnVuY3Rpb24gb2Jq
ZWN0CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uPiBtZXRob2RGdW5jID0gbWV0aG9k
VGVtcGwtPkdldEZ1bmN0aW9uKCk7CisgICAgICAgIC8vIE5hbWUgdGhlIGZ1bmN0aW9uCisgICAg
ICAgIG1ldGhvZEZ1bmMtPlNldE5hbWUodjg6OlN0cmluZzo6TmV3KGl0LmtleSgpLmNvbnN0RGF0
YSgpKSk7CisgICAgICAgIC8vIFN0b3JlIGZ1bmN0aW9uIC0gdG8gYmUgYWJsZSB0byBjYWxsIGZy
b20gQysrIGFuZCBvYmplY3QgZm9yIGJhY2sgcmVmZXJlbmNlKD8pCisgICAgICAgIHFydG1ldGhv
ZC0+c2V0VjhGdW5jdGlvbih2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+OjpOZXcobWV0aG9k
RnVuYykpOworICAgICAgICAvLyBTZXQgaGlkZGVuIHZhbHVlIHRvIGJlIGFibGUgdG8gcmV0cmll
dmUgcXRJbnN0YW5jZSBmcm9tIG15IGZ1bmN0aW9uIG9iamVjdAorICAgICAgICBtZXRob2RGdW5j
LT5TZXRIaWRkZW5WYWx1ZSh2ODo6U3RyaW5nOjpOZXcoIl9fcXRfaGlkZGVuX21hcmtlcl9fIiks
IHY4OjpFeHRlcm5hbDo6V3JhcCh0aGlzKSk7CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBjb25u
ZWN0IG9iamVjdAorICAgICAgICAgICAgLy8gCisgICAgICAgICAgICBkLT5tX2Nvbm5lY3QgPSBu
ZXcgUXRSdW50aW1lQ29ubmVjdGlvbk1ldGhvZCgiY29ubmVjdCIsIHRydWUsIGQtPm1faW5zdGFu
Y2UsIGQtPm1faW5kZXgsIGQtPm1fc2lnbmF0dXJlKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBj
b25uZWN0IHRlbXBsYXRlIGZvciB0aGUgc2lnbmFsIG1ldGhvZCBhYm92ZQorICAgICAgICAgICAg
djg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gY29ubmVjdFRlbXBsID0gCisgICAgICAg
ICAgICAgICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhRdFJ1bnRpbWVDb25uZWN0aW9uTWV0
aG9kOjpjYWxsLCB2ODo6RXh0ZXJuYWw6OldyYXAoZC0+bV9jb25uZWN0KSk7CisgICAgICAgICAg
ICAvLyBDcmVhdGUgYWN0dWFsIGZ1bmN0aW9uIG9iamVjdAorICAgICAgICAgICAgdjg6OkhhbmRs
ZTx2ODo6RnVuY3Rpb24+IGNvbm5lY3RGdW5jID0gY29ubmVjdFRlbXBsLT5HZXRGdW5jdGlvbigp
OworICAgICAgICAgICAgLy8gU2V0IGhpZGRlbiB2YWx1ZSB0byBiZSBhYmxlIHRvIHJldHJpZXZl
IHF0SW5zdGFuY2UgZnJvbSBteSBmdW5jdGlvbiBvYmplY3QKKyAgICAgICAgICAgIC8vIFRoaXMg
aXMganVzdCBmb3IgdGhlIGNhc2UgaWYgc29tZW9uZSB3b3VsZCB3YW50IHRvIHBsYXkgd2l0aCAi
Y29ubmVjdCgpIiBhbmQgImRpc2Nvbm5lY3QoKSIuLi4KKyAgICAgICAgICAgIGNvbm5lY3RGdW5j
LT5TZXRIaWRkZW5WYWx1ZSh2ODo6U3RyaW5nOjpOZXcoIl9fcXRfaGlkZGVuX21hcmtlcl9fIiks
IHY4OjpFeHRlcm5hbDo6V3JhcCh0aGlzKSk7CisgICAgICAgICAgICAvLyBOYW1lIHRoZSBmdW5j
dGlvbgorICAgICAgICAgICAgY29ubmVjdEZ1bmMtPlNldE5hbWUodjg6OlN0cmluZzo6TmV3KCJj
b25uZWN0IikpOworICAgICAgICAgICAgLy8gQWRkIGNvbm5lY3QgdG8gdGhlIG1ldGhvZCB0byB0
aGUgbWV0aG9kCisgICAgICAgICAgICBtZXRob2RGdW5jLT5TZXQodjg6OlN0cmluZzo6TmV3KCJj
b25uZWN0IiksIGNvbm5lY3RGdW5jLCB2ODo6RG9udERlbGV0ZSk7CisgICAgICAgICAgICAvLyBT
dG9yZSBmdW5jdGlvbiAtIHRvIGJlIGFibGUgdG8gY2FsbCBmcm9tIEMrKyBhbmQgb2JqZWN0IGZv
ciBiYWNrIHJlZmVyZW5jZSg/KQorICAgICAgICAgICAgZC0+bV9jb25uZWN0LT5zZXRWOEZ1bmN0
aW9uKHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvbj46Ok5ldyhjb25uZWN0RnVuYykpOworICAg
ICAgICAgICAgLy8gQ3JlYXRlIGRpc2Nvbm5lY3Qgb2JqZWN0CisgICAgICAgICAgICAvLworICAg
ICAgICAgICAgZC0+bV9kaXNjb25uZWN0ID0gbmV3IFF0UnVudGltZUNvbm5lY3Rpb25NZXRob2Qo
ImRpc2Nvbm5lY3QiLCBmYWxzZSwgZC0+bV9pbnN0YW5jZSwgZC0+bV9pbmRleCwgZC0+bV9zaWdu
YXR1cmUpOworICAgICAgICAgICAgLy8gQ3JlYXRlIGRpc2Nvbm5lY3QgdGVtcGxhdGUgZm9yIHRo
ZSBzaWduYWwgbWV0aG9kIGFib3ZlCisgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlv
blRlbXBsYXRlPiBkaXNjb25uZWN0VGVtcGwgPSAKKyAgICAgICAgICAgICAgICB2ODo6RnVuY3Rp
b25UZW1wbGF0ZTo6TmV3KFF0UnVudGltZUNvbm5lY3Rpb25NZXRob2Q6OmNhbGwsIHY4OjpFeHRl
cm5hbDo6V3JhcChkLT5tX2Rpc2Nvbm5lY3QpKTsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhY3R1
YWwgZnVuY3Rpb24gb2JqZWN0CisgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvbj4g
ZGlzY29ubmVjdEZ1bmMgPSBkaXNjb25uZWN0VGVtcGwtPkdldEZ1bmN0aW9uKCk7CisgICAgICAg
ICAgICAvLyBTZXQgaGlkZGVuIHZhbHVlIHRvIGJlIGFibGUgdG8gcmV0cmlldmUgcXRJbnN0YW5j
ZSBmcm9tIG15IGZ1bmN0aW9uIG9iamVjdAorICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IGZv
ciB0aGUgY2FzZSBpZiBzb21lb25lIHdvdWxkIHdhbnQgdG8gcGxheSB3aXRoICJjb25uZWN0KCki
IGFuZCAiZGlzY29ubmVjdCgpIi4uLgorICAgICAgICAgICAgZGlzY29ubmVjdEZ1bmMtPlNldEhp
ZGRlblZhbHVlKHY4OjpTdHJpbmc6Ok5ldygiX19xdF9oaWRkZW5fbWFya2VyX18iKSwgdjg6OkV4
dGVybmFsOjpXcmFwKHRoaXMpKTsKKyAgICAgICAgICAgIC8vIE5hbWUgdGhlIGZ1bmN0aW9uCisg
ICAgICAgICAgICBkaXNjb25uZWN0RnVuYy0+U2V0TmFtZSh2ODo6U3RyaW5nOjpOZXcoImRpc2Nv
bm5lY3QiKSk7CisgICAgICAgICAgICAvLyBBZGQgZGlzY29ubmVjdCB0byB0aGUgbWV0aG9kCisg
ICAgICAgICAgICBtZXRob2RGdW5jLT5TZXQodjg6OlN0cmluZzo6TmV3KCJkaXNjb25uZWN0Iiks
IGRpc2Nvbm5lY3RGdW5jLCB2ODo6RG9udERlbGV0ZSk7CisgICAgICAgICAgICAvLyBTdG9yZSBm
dW5jdGlvbiAtIHRvIGJlIGFibGUgdG8gY2FsbCBmcm9tIEMrKyBhbmQgb2JqZWN0IGZvciBiYWNr
IHJlZmVyZW5jZSg/KQorICAgICAgICAgICAgZC0+bV9kaXNjb25uZWN0LT5zZXRWOEZ1bmN0aW9u
KHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvbj46Ok5ldyhkaXNjb25uZWN0RnVuYykpOworCisg
ICAgICAgIC8vIExpbmsgUU9iamVjdCBhbmQgc2lnbmFsIG1ldGhvZAorICAgICAgICBpZiAoZC0+
bV9hbGxvd1ByaXZhdGUpCisgICAgICAgICAgICBtX3Y4T2JqLT5TZXQodjg6OlN0cmluZzo6TmV3
KAorICAgICAgICAgICAgICAgIGl0LmtleSgpLmNvbnN0RGF0YSgpKSwgbWV0aG9kRnVuYywgc3Rh
dGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6RG9udEVudW0gfCB2ODo6RG9udERl
bGV0ZSkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBtX3Y4T2JqLT5TZXQoCisgICAgICAg
ICAgICAgICAgdjg6OlN0cmluZzo6TmV3KGl0LmtleSgpLmNvbnN0RGF0YSgpKSwgbWV0aG9kRnVu
Yywgdjg6OkRvbnREZWxldGUpOworICAgIH0KK30KKworUXRJbnN0YW5jZTo6flF0SW5zdGFuY2Uo
KQoreworICAgIGNhY2hlZEluc3RhbmNlcy5yZW1vdmUobV9oYXNoa2V5KTsKKworICAgIC8vIGNs
ZWFuIHVwICh1bnByb3RlY3QgZnJvbSBnYykgdGhlIEpTVmFsdWVzIHdlJ3ZlIGNyZWF0ZWQKKyAg
ICBtX21ldGhvZHMuY2xlYXIoKTsKKworICAgIHFEZWxldGVBbGwobV9maWVsZHMpOworICAgIG1f
ZmllbGRzLmNsZWFyKCk7CisKKyAgICBpZiAobV9vYmplY3QpIHsKKyAgICAgICAgc3dpdGNoICht
X293bmVyc2hpcCkgeworICAgICAgICBjYXNlIFFTY3JpcHRFbmdpbmU6OlF0T3duZXJzaGlwOgor
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUVNjcmlwdEVuZ2luZTo6QXV0b093bmVy
c2hpcDoKKyAgICAgICAgICAgIGlmIChtX29iamVjdC0+cGFyZW50KCkpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2ghCisgICAgICAgIGNhc2UgUVNj
cmlwdEVuZ2luZTo6U2NyaXB0T3duZXJzaGlwOgorICAgICAgICAgICAgZGVsZXRlIG1fb2JqZWN0
OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1Bhc3NSZWZQdHI8
UXRJbnN0YW5jZT4gUXRJbnN0YW5jZTo6Z2V0UXRJbnN0YW5jZShRT2JqZWN0KiBvLCB2ODo6SGFu
ZGxlPHY4OjpDb250ZXh0PiBjb250ZXh0LCBRU3RyaW5nIG5hbWUsIFFTY3JpcHRFbmdpbmU6OlZh
bHVlT3duZXJzaGlwIG93bmVyc2hpcCkKK3sKKyAgICBmb3JlYWNoIChRdEluc3RhbmNlKiBpbnN0
YW5jZSwgY2FjaGVkSW5zdGFuY2VzLnZhbHVlcyhvKSkgeworICAgICAgICBpZiAoaW5zdGFuY2Ut
PmNvbnRleHQoKS0+R2V0U2VjdXJpdHlUb2tlbigpLT5Ub09iamVjdCgpLT5HZXRJZGVudGl0eUhh
c2goKSA9PSAKKyAgICAgICAgICAgIGNvbnRleHQtPkdldFNlY3VyaXR5VG9rZW4oKS0+VG9PYmpl
Y3QoKS0+R2V0SWRlbnRpdHlIYXNoKCkpCisgICAgICAgICAgICAgICAgLy8gVGhlIGdhcmJhZ2Ug
Y29sbGVjdG9yIHJlbW92ZXMgaW5zdGFuY2VzLCBidXQgaXQgbWF5IGhhcHBlbiB0aGF0IHRoZSB3
cmFwcGVkCisgICAgICAgICAgICAgICAgLy8gUU9iamVjdCBkaWVzIGJlZm9yZSB0aGUgZ2Mga2lj
a3MgaW4uIFRvIGhhbmRsZSB0aGF0IGNhc2Ugd2UgaGF2ZSB0byBkbyBhbiBhZGRpdGlvbmFsCisg
ICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdG8gc2VlIGlmIHRoZSBpbnN0YW5jZSdzIHdyYXBw
ZWQgb2JqZWN0IGlzIHN0aWxsIGFsaXZlLiBJZiBpdCBpc24ndCwgdGhlbgorICAgICAgICAgICAg
ICAgIC8vIHdlIGhhdmUgdG8gY3JlYXRlIGEgbmV3IHdyYXBwZXIuCisgICAgICAgICAgICAgICAg
aWYgKCFpbnN0YW5jZS0+Z2V0T2JqZWN0KCkpCisgICAgICAgICAgICAgICAgICAgIGNhY2hlZElu
c3RhbmNlcy5yZW1vdmUoaW5zdGFuY2UtPmhhc2hLZXkoKSk7CisgICAgICAgICAgICAgICAgZWxz
ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgUmVm
UHRyPFF0SW5zdGFuY2U+IHJldCA9IFF0SW5zdGFuY2U6OmNyZWF0ZShvLCBjb250ZXh0LCBuYW1l
LCBvd25lcnNoaXApOworICAgIGNhY2hlZEluc3RhbmNlcy5pbnNlcnQobywgcmV0LmdldCgpKTsK
KyAgICByZXR1cm4gcmV0LnJlbGVhc2UoKTsKK30KKworLy8gTk9UIFVTRUQgTk9XCit2ODo6SGFu
ZGxlPHY4OjpCb29sZWFuPiBRdEluc3RhbmNlOjpmaWVsZERlbGV0ZXIodjg6OkxvY2FsPHY4OjpT
dHJpbmc+IHByb3AsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8gJmluZm8pCit7CisgICAgcmV0dXJu
IHY4OjpCb29sZWFuOjpOZXcoZmFsc2UpOworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gUXRJ
bnN0YW5jZTo6ZmllbGRHZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BuYW1lLCBjb25z
dCB2ODo6QWNjZXNzb3JJbmZvICZpbmZvKQoreworICAgIFF0SW5zdGFuY2UqIGluc3QgPSBzdGF0
aWNfY2FzdDxRdEluc3RhbmNlKj4odjg6OkV4dGVybmFsOjpVbndyYXAoaW5mby5Ib2xkZXIoKS0+
R2V0SW50ZXJuYWxGaWVsZCgwKSkpOworICAgIGlmICghaW5zdC0+aXNWYWxpZCgpKQorICAgICAg
ICByZXR1cm4gdGhyb3dJbnZhbGlkQWNjZXNzRXJyb3IoKTsKKworICAgIFFTdHJpbmcgcHJvcCA9
IFY4VG9RU3RyaW5nKHByb3BuYW1lKTsKKyAgICBRQnl0ZUFycmF5IGJhID0gcHJvcC50b0xhdGlu
MSgpOworICAgIFF0RmllbGQqIGYgPSBpbnN0LT5nZXRGaWVsZChiYSk7CisgICAgaWYgKGYpIAor
ICAgICAgICByZXR1cm4gZi0+dmFsdWVGcm9tSW5zdGFuY2UoaW5zdCk7CisKKyAgICAvLyBDaGVj
ayBpZiBvYmplY3QgZG9lc250IGV4aXN0IGFuZCBtZXRob2QgaXMgc3RpbGwgY2FjaGVkKGluc3Qt
Pm1fbWV0aG9kcy5jb250YWlucyhiYSkpLCAKKyAgICAvLyBidXQgb2JqZWN0IGhhcyBiZWVuIGRl
bGV0ZWQgKCFpbnN0LT5nZXRPYmplY3QoKSkKKyAgICBpZiAoIWluc3QtPmdldE9iamVjdCgpIC8q
JiYgIWluc3QtPm1fbWV0aG9kcy5jb250YWlucyhiYSkgKi8pIHsKKyAgICAgICAgUVN0cmluZyBt
c2cgPSBRU3RyaW5nKFFMYXRpbjFTdHJpbmcoImNhbm5vdCBhY2Nlc3MgbWVtYmVyIGAlMScgb2Yg
ZGVsZXRlZCBRT2JqZWN0IikpLmFyZyhRTGF0aW4xU3RyaW5nKGJhKSk7CisgICAgICAgIHJldHVy
biBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OkdlbmVyYWxFcnJvciwgbXNnLnRvTGF0aW4x
KCkuY29uc3REYXRhKCkpOworICAgIH0KKworICAgIC8vIG1fbWV0aG9kcyAtPiA8UUJ5dGVBcnJh
eSwgUXRSdW50aW1lTWV0YU1ldGhvZCogPgorICAgIC8vICBmb28sIFFSTU1kCisgICAgLy8gIGZv
bygpLCBRUk1NZAorICAgIC8vICBmb28oaW50KSwgUVJNTWQKKyAgICAvLyAgZm9vKGRvdWJsZSks
IFFSTU1kCisKKyAgICAvLyBOb3JtYWxpemUgcHJvcGVydHkgbmFtZQorICAgIFFCeXRlQXJyYXkg
bmFtZSA9IFFNZXRhT2JqZWN0Ojpub3JtYWxpemVkU2lnbmF0dXJlKGJhLmNvbnN0RGF0YSgpKTsK
KyAgICBRdFJ1bnRpbWVNZXRhTWV0aG9kKiB2YWwgPSBpbnN0LT5tX21ldGhvZHMudmFsdWUobmFt
ZSk7CisgICAgaWYgKHZhbCkKKyAgICAgICAgcmV0dXJuIHZhbC0+Z2V0VjhXcmFwcGVyKCk7Cisg
ICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpOworfQorCit2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gUXRJbnN0YW5jZTo6ZmllbGRQcm9wZXJ0eUhhbmRsZXJTZXR0ZXIodjg6OkxvY2FsPHY4
OjpTdHJpbmc+IHByb3BuYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwgY29uc3Qgdjg6
OkFjY2Vzc29ySW5mbyYgaW5mbykKK3sKKyAgICBRdEluc3RhbmNlKiBpbnN0ID0gc3RhdGljX2Nh
c3Q8UXRJbnN0YW5jZSo+KHY4OjpFeHRlcm5hbDo6VW53cmFwKGluZm8uSG9sZGVyKCktPkdldElu
dGVybmFsRmllbGQoMCkpKTsKKyAgICBpZiAoIWluc3QtPmlzVmFsaWQoKSkKKyAgICAgICAgcmV0
dXJuIHRocm93SW52YWxpZEFjY2Vzc0Vycm9yKCk7CisKKyAgICBRU3RyaW5nIHByb3AgPSBWOFRv
UVN0cmluZyhwcm9wbmFtZSk7CisgICAgUUJ5dGVBcnJheSBiYSA9IHByb3AudG9MYXRpbjEoKTsK
KyAgICBRdEZpZWxkKiBmID0gaW5zdC0+Z2V0RmllbGQoYmEpOworICAgIGlmIChmKQorICAgICAg
ICByZXR1cm4gZi0+c2V0VmFsdWVUb0luc3RhbmNlKGluc3QsIHZhbHVlKTsKKworICAgIC8vIEFk
ZCBkeW5hbWljIHByb3BlcnR5CisgICAgLy8gCisgICAgLy8gQ2hlY2sgaWYgaXQgaXMgcHJlc2Vu
dCBpbiBtZXRhIGRhdGEgYW5kIG5vdCBzY3JpcHRhYmxlCisgICAgY29uc3QgUU1ldGFPYmplY3Qq
IHFtZXRhID0gaW5zdC0+Z2V0T2JqZWN0KCktPm1ldGFPYmplY3QoKTsKKworICAgIGludCBpbmRl
eCA9IHFtZXRhLT5pbmRleE9mUHJvcGVydHkoYmEuY29uc3REYXRhKCkpOworICAgIGlmIChpbmRl
eCA+PSAwKSB7CisgICAgICAgIFFNZXRhUHJvcGVydHkgcHJvcCA9IHFtZXRhLT5wcm9wZXJ0eShp
bmRleCk7CisgICAgICAgIGlmICghcHJvcC5pc1NjcmlwdGFibGUoaW5zdC0+Z2V0T2JqZWN0KCkp
KQorICAgICAgICAgICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpOworICAgIH0KKyAg
ICBpbmRleCA9IGluc3QtPmdldE9iamVjdCgpLT5keW5hbWljUHJvcGVydHlOYW1lcygpLmluZGV4
T2YoYmEpOworICAgIGlmIChpbmRleCA+IDApIAorICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2
ODo6VmFsdWU+KCk7CisKKyAgICBRQnl0ZUFycmF5IG5hbWUgPSBRTWV0YU9iamVjdDo6bm9ybWFs
aXplZFNpZ25hdHVyZShiYS5jb25zdERhdGEoKSk7CisgICAgUXRSdW50aW1lTWV0YU1ldGhvZCog
dmFsID0gaW5zdC0+bV9tZXRob2RzLnZhbHVlKG5hbWUpOworICAgIGlmICh2YWwpCisgICAgICAg
IHJldHVybiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4oKTsKKworICAgIC8vIEFkZCBuZXcgcHJvcGVy
dHkKKyAgICBmID0gbmV3IFF0RmllbGQoYmEpOworICAgIGlmICghZikgeworICAgICAgICBRU3Ry
aW5nIG1zZyA9IFFTdHJpbmcoUUxhdGluMVN0cmluZygiY2Fubm90IGFkZCBkeW5hbWljIHByb3Bl
cnR5IG1lbWJlciBgJTEnIikpLmFyZyhRTGF0aW4xU3RyaW5nKGJhKSk7CisgICAgICAgIHJldHVy
biBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OkdlbmVyYWxFcnJvciwgbXNnLnRvTGF0aW4x
KCkuY29uc3REYXRhKCkpOworICAgIH0KKworICAgIGlmICghaW5zdC0+Z2V0T2JqZWN0KCkpIHsK
KyAgICAgICAgUVN0cmluZyBtc2cgPSBRU3RyaW5nKFFMYXRpbjFTdHJpbmcoImNhbm5vdCBhZGQg
ZHluYW1pYyBwcm9wZXJ0eSBtZW1iZXIgYCUxJyB0byBkZWxldGVkIFFPYmplY3QiKSkuYXJnKFFM
YXRpbjFTdHJpbmcoYmEpKTsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OnRocm93RXJyb3IoVjhQ
cm94eTo6R2VuZXJhbEVycm9yLCBtc2cudG9MYXRpbjEoKS5jb25zdERhdGEoKSk7CisgICAgfQor
CisgICAgaW5zdC0+bV9maWVsZHMuaW5zZXJ0KGJhLCBmKTsKKyAgICBRTWV0YVR5cGU6OlR5cGUg
YXJndHlwZSA9IFFNZXRhVHlwZTo6Vm9pZDsKKyAgICBRVmFyaWFudCB2ID0gY29udmVydFZhbHVl
VG9RVmFyaWFudCh2YWx1ZSwgYXJndHlwZSwgMCk7CisgICAgaW5zdC0+Z2V0T2JqZWN0KCktPnNl
dFByb3BlcnR5KGJhLmNvbnN0RGF0YSgpLCB2KTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3Zv
aWQgUXRJbnN0YW5jZTo6ZmllbGRTZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BuYW1l
LCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5m
bykKK3sKKyAgICBRU3RyaW5nIHByb3AgPSBWOFRvUVN0cmluZyhwcm9wbmFtZSk7CisgICAgUUJ5
dGVBcnJheSBiYSA9IHByb3AudG9MYXRpbjEoKTsKKyAgICAvLyBOTyBuZWVkIHRvIGNoZWNrIGlu
c3RhbmNlIHZhbGlkaXR5IGIvYyBhY2Nlc3NvcnMgYXJlIGNhbGxlZCByaWdodCBBRlRFUiBnZW5l
cmljIHByb3BlcnR5IGhhbmRsZXJzCisgICAgUXRJbnN0YW5jZSogaW5zdCA9IHN0YXRpY19jYXN0
PFF0SW5zdGFuY2UqPih2ODo6RXh0ZXJuYWw6OlVud3JhcChpbmZvLkhvbGRlcigpLT5HZXRJbnRl
cm5hbEZpZWxkKDApKSk7CisgICAgaW5zdC0+Z2V0RmllbGQoYmEpLT5zZXRWYWx1ZVRvSW5zdGFu
Y2UoaW5zdCwgdmFsdWUpOworfQorCisKK3ZvaWQgUXRJbnN0YW5jZTo6U2V0KGNvbnN0IGNoYXIq
IG5hbWUsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSkKK3sKKyAgICBtX3Y4T2JqLT5TZXQo
djg6OlN0cmluZzo6TmV3KG5hbWUpLCB2YWx1ZSk7Cit9CisKK3ZvaWQgUXRJbnN0YW5jZTo6cmVt
b3ZlQ2FjaGVkTWV0aG9kKFF0UnVudGltZU1ldGhvZCogbWV0aG9kKQoreworICAgIGZvciAoUUhh
c2g8UUJ5dGVBcnJheSwgUXRSdW50aW1lTWV0YU1ldGhvZCo+OjpJdGVyYXRvciBpdCA9IG1fbWV0
aG9kcy5iZWdpbigpLAorICAgICAgICBlbmQgPSBtX21ldGhvZHMuZW5kKCk7IGl0ICE9IGVuZDsg
KytpdCkKKyAgICAgICAgaWYgKGl0LnZhbHVlKCkgPT0gbWV0aG9kKSB7CisgICAgICAgICAgICBt
X21ldGhvZHMuZXJhc2UoaXQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9Cit9CisK
K1F0SW5zdGFuY2UqIFF0SW5zdGFuY2U6OmdldEluc3RhbmNlKHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gb2JqZWN0KQoreworICAgIGlmICghb2JqZWN0LT5Jc09iamVjdCgpKQorICAgICAgICByZXR1
cm4gMDsKKworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWwgPSBvYmplY3QtPkdldEhpZGRl
blZhbHVlKHY4OjpTdHJpbmc6Ok5ldygiX19xdF9oaWRkZW5fbWFya2VyX18iKSk7CisgICAgaWYg
KHZhbC5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gR2V0IHF0SW5zdGFu
Y2UgZnJvbSBoaWRkZW4gZmlsZWQgaW5zdGVhZCBvZiBpbnRlcm5hbCBmaWVsZC4gVGhhdCBjb3Zl
cnMgT2JqZWN0cyBhbmQgRnVuY3Rpb25zCisgICAgLy8gRm9yIHNvbWUgcmVhc29ucyBzZXR0aW5n
IGludGVybmFsIGZpbGVkIGZvciBhIEZ1bmN0aW9uIGZhaWxzPyEhLi4uCisgICAgUXRJbnN0YW5j
ZSogaW5zdCA9IHN0YXRpY19jYXN0PFF0SW5zdGFuY2UqPih2ODo6RXh0ZXJuYWw6OlVud3JhcCh2
YWwpKTsKKyAgICBpZiAoIWluc3QtPmlzVmFsaWQoKSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAg
cmV0dXJuIGluc3Q7Cit9CisKKwordm9pZCBRdEluc3RhbmNlOjpnZXRQcm9wZXJ0eU5hbWVzKHY4
OjpIYW5kbGU8djg6OkFycmF5PiYgYXJyKQoreworICAgIC8vIFRoaXMgaXMgdGhlIGVudW1lcmFi
bGUgcHJvcGVydGllcywgc28gcHV0OgorICAgIC8vIHByb3BlcnRpZXMKKyAgICAvLyBkeW5hbWlj
IHByb3BlcnRpZXMKKyAgICAvLyBzbG90cworICAgIGlmIChtX29iamVjdCkgeworICAgICAgICBj
b25zdCBRTWV0YU9iamVjdCogbWV0YSA9IG1fb2JqZWN0LT5tZXRhT2JqZWN0KCk7CisKKyAgICAg
ICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBtZXRhLT5wcm9wZXJ0eUNvdW50KCk7
IGkrKykgeworICAgICAgICAgICAgUU1ldGFQcm9wZXJ0eSBwcm9wID0gbWV0YS0+cHJvcGVydHko
aSk7CisgICAgICAgICAgICBpZiAocHJvcC5pc1NjcmlwdGFibGUoKSkKKyAgICAgICAgICAgICAg
ICBhcnItPlNldChpLCB2ODo6U3RyaW5nOjpOZXcocHJvcC5uYW1lKCkpKTsKKyAgICAgICAgfQor
CisgICAgICAgIFFMaXN0PFFCeXRlQXJyYXk+IGR5blByb3BzID0gbV9vYmplY3QtPmR5bmFtaWNQ
cm9wZXJ0eU5hbWVzKCk7CisgICAgICAgIGZvcmVhY2ggKFFCeXRlQXJyYXkgYmEsIGR5blByb3Bz
KQorICAgICAgICAgICAgYXJyLT5TZXQoYXJyLT5MZW5ndGgoKSwgdjg6OlN0cmluZzo6TmV3KGJh
LmNvbnN0RGF0YSgpKSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG1ldGEtPm1ldGhvZENv
dW50KCk7IGkrKykgeworICAgICAgICAgICAgUU1ldGFNZXRob2QgbWV0aG9kID0gbWV0YS0+bWV0
aG9kKGkpOworICAgICAgICAgICAgaWYgKG1ldGhvZC5hY2Nlc3MoKSAhPSBRTWV0YU1ldGhvZDo6
UHJpdmF0ZSkKKyAgICAgICAgICAgICAgICBhcnItPlNldChhcnItPkxlbmd0aCgpLCB2ODo6U3Ry
aW5nOjpOZXcobWV0aG9kLnNpZ25hdHVyZSgpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3Y4
OjpIYW5kbGU8djg6OlZhbHVlPiBRdEluc3RhbmNlOjpzdHJpbmdWYWx1ZSgpIGNvbnN0Cit7Cisg
ICAgLy8gSG1tLi4gc2VlIGlmIHRoZXJlIGlzIGEgdG9TdHJpbmcgZGVmaW5lZAorICAgIFFCeXRl
QXJyYXkgYnVmOworICAgIGJvb2wgdXNlRGVmYXVsdCA9IHRydWU7CisgICAgaWYgKG1fb2JqZWN0
KSB7CisgICAgICAgIC8vIENoZWF0IGFuZCBkb24ndCB1c2UgdGhlIGZ1bGwgbmFtZSByZXNvbHV0
aW9uCisgICAgICAgIGludCBpbmRleCA9IG1fb2JqZWN0LT5tZXRhT2JqZWN0KCktPmluZGV4T2ZN
ZXRob2QoInRvU3RyaW5nKCkiKTsKKyAgICAgICAgaWYgKGluZGV4ID49IDApIHsKKyAgICAgICAg
ICAgIFFNZXRhTWV0aG9kIG0gPSBtX29iamVjdC0+bWV0YU9iamVjdCgpLT5tZXRob2QoaW5kZXgp
OworICAgICAgICAgICAgLy8gQ2hlY2sgdG8gc2VlIGhvdyBtdWNoIHdlIGNhbiBjYWxsIGl0Cisg
ICAgICAgICAgICBpZiAobS5hY2Nlc3MoKSAhPSBRTWV0YU1ldGhvZDo6UHJpdmF0ZQorICAgICAg
ICAgICAgICAgICYmIG0ubWV0aG9kVHlwZSgpICE9IFFNZXRhTWV0aG9kOjpTaWduYWwKKyAgICAg
ICAgICAgICAgICAmJiAhbS5wYXJhbWV0ZXJUeXBlcygpLmNvdW50KCkpIHsKKyAgICAgICAgICAg
ICAgICBjb25zdCBjaGFyKiByZXRzaWcgPSBtLnR5cGVOYW1lKCk7CisgICAgICAgICAgICAgICAg
aWYgKHJldHNpZyAmJiAqcmV0c2lnKSB7CisgICAgICAgICAgICAgICAgICAgIFFWYXJpYW50IHJl
dChRTWV0YVR5cGU6OnR5cGUocmV0c2lnKSwgKHZvaWQqKTApOworICAgICAgICAgICAgICAgICAg
ICB2b2lkICogcWFyZ3NbMV07CisgICAgICAgICAgICAgICAgICAgIHFhcmdzWzBdID0gcmV0LmRh
dGEoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV9vYmplY3QtPnF0X21ldGFjYWxsKFFN
ZXRhT2JqZWN0OjpJbnZva2VNZXRhTWV0aG9kLCBpbmRleCwgcWFyZ3MpIDwgMCkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgaWYgKHJldC5pc1ZhbGlkKCkgJiYgcmV0LmNhbkNvbnZlcnQoUVZh
cmlhbnQ6OlN0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYgPSByZXQu
dG9TdHJpbmcoKS50b0xhdGluMSgpLmNvbnN0RGF0YSgpOyAvLyAjIyMgTGF0aW4gMT8gQXNjaWk/
CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRGVmYXVsdCA9IGZhbHNlOworICAgICAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHVzZURlZmF1
bHQpIHsKKyAgICAgICAgY29uc3QgUU1ldGFPYmplY3QqIG1ldGEgPSBtX29iamVjdCA/IG1fb2Jq
ZWN0LT5tZXRhT2JqZWN0KCkgOiAmUU9iamVjdDo6c3RhdGljTWV0YU9iamVjdDsKKyAgICAgICAg
UVN0cmluZyBuYW1lID0gbV9vYmplY3QgPyBtX29iamVjdC0+b2JqZWN0TmFtZSgpIDogUVN0cmlu
Zzo6ZnJvbVV0ZjgoInVubmFtZWQiKTsKKyAgICAgICAgUVN0cmluZyBzdHIgPSBRU3RyaW5nOjpm
cm9tVXRmOCgiJTAobmFtZSA9IFwiJTFcIikiKQorICAgICAgICAgICAgICAgICAgICAgIC5hcmco
UUxhdGluMVN0cmluZyhtZXRhLT5jbGFzc05hbWUoKSkpLmFyZyhuYW1lKTsKKworICAgICAgICBi
dWYgPSBzdHIudG9MYXRpbjEoKTsKKyAgICB9CisgICAgcmV0dXJuIHY4OjpTdHJpbmc6Ok5ldyhi
dWYuY29uc3REYXRhKCkpOworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gUXRJbnN0YW5jZTo6
bnVtYmVyVmFsdWUoKSBjb25zdAoreworICAgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcoMCk7Cit9
CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBRdEluc3RhbmNlOjpib29sZWFuVmFsdWUoKSBjb25z
dAoreworICAgIC8vIEVDTUEgOS4yCisgICAgcmV0dXJuIHY4OjpCb29sZWFuOjpOZXcodHJ1ZSk7
Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBRdEluc3RhbmNlOjp2YWx1ZU9mKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gc3RyaW5nVmFsdWUoKTsKK30KKworY29uc3QgY2hhciogUXRGaWVsZDo6
bmFtZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fdHlwZSA9PSBNZXRhUHJvcGVydHkpCisgICAgICAg
IHJldHVybiBtX3Byb3BlcnR5Lm5hbWUoKTsKKyAgICBpZiAobV90eXBlID09IENoaWxkT2JqZWN0
ICYmIG1fY2hpbGRPYmplY3QpCisgICAgICAgIHJldHVybiBtX2NoaWxkT2JqZWN0LT5vYmplY3RO
YW1lKCkudG9MYXRpbjEoKTsKKyAgICBpZiAobV90eXBlID09IER5bmFtaWNQcm9wZXJ0eSkKKyAg
ICAgICAgcmV0dXJuIG1fZHluYW1pY1Byb3BlcnR5LmNvbnN0RGF0YSgpOworICAgIHJldHVybiAi
IjsgLy8gZGVsZXRlZCBjaGlsZCBvYmplY3QKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFF0
RmllbGQ6OnZhbHVlRnJvbUluc3RhbmNlKFF0SW5zdGFuY2UqIGluc3QpIGNvbnN0Cit7CisgICAg
UU9iamVjdCogb2JqID0gaW5zdC0+Z2V0T2JqZWN0KCk7CisKKyAgICBpZiAob2JqKSB7CisgICAg
ICAgIFFWYXJpYW50IHZhbDsKKyAgICAgICAgaWYgKG1fdHlwZSA9PSBNZXRhUHJvcGVydHkpIHsK
KyAgICAgICAgICAgIGlmIChtX3Byb3BlcnR5LmlzUmVhZGFibGUoKSkKKyAgICAgICAgICAgICAg
ICB2YWwgPSBtX3Byb3BlcnR5LnJlYWQob2JqKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOworICAgICAgICB9IGVsc2UgaWYgKG1fdHlw
ZSA9PSBDaGlsZE9iamVjdCkKKyAgICAgICAgICAgIHZhbCA9IFFWYXJpYW50Ojpmcm9tVmFsdWUo
KFFPYmplY3QqKSBtX2NoaWxkT2JqZWN0KTsKKyAgICAgICAgZWxzZSBpZiAobV90eXBlID09IER5
bmFtaWNQcm9wZXJ0eSkKKyAgICAgICAgICAgIHZhbCA9IG9iai0+cHJvcGVydHkobV9keW5hbWlj
UHJvcGVydHkpOworCisgICAgICAgIHJldHVybiBjb252ZXJ0UVZhcmlhbnRUb1ZhbHVlKGluc3Qt
PmNvbnRleHQoKSwgdmFsKTsKKyAgICB9CisgICAgUVN0cmluZyBtc2cgPSBRU3RyaW5nKFFMYXRp
bjFTdHJpbmcoImNhbm5vdCBhY2Nlc3MgbWVtYmVyIGAlMScgb2YgZGVsZXRlZCBRT2JqZWN0Iikp
LmFyZyhRTGF0aW4xU3RyaW5nKG5hbWUoKSkpOworICAgIHJldHVybiBWOFByb3h5Ojp0aHJvd0Vy
cm9yKFY4UHJveHk6OkdlbmVyYWxFcnJvciwgbXNnLnRvTGF0aW4xKCkuY29uc3REYXRhKCkpOwor
fQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gUXRGaWVsZDo6c2V0VmFsdWVUb0luc3RhbmNlKGNv
bnN0IFF0SW5zdGFuY2UqIGluc3QsIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBhVmFsdWUpIGNvbnN0
Cit7CisgICAgaWYgKG1fdHlwZSA9PSBDaGlsZE9iamVjdCkgLy8gUXRTY3JpcHQgZG9lc24ndCBh
bGxvdyBzZXR0aW5nIHRvIGEgbmFtZWQgY2hpbGQKKyAgICAgICAgcmV0dXJuIGFWYWx1ZTsKKwor
ICAgIFFPYmplY3QqIG9iaiA9IGluc3QtPmdldE9iamVjdCgpOworICAgIGlmIChvYmopIHsKKyAg
ICAgICAgUU1ldGFUeXBlOjpUeXBlIGFyZ3R5cGUgPSBRTWV0YVR5cGU6OlZvaWQ7CisgICAgICAg
IGlmIChtX3R5cGUgPT0gTWV0YVByb3BlcnR5KQorICAgICAgICAgICAgYXJndHlwZSA9IChRTWV0
YVR5cGU6OlR5cGUpIFFNZXRhVHlwZTo6dHlwZShtX3Byb3BlcnR5LnR5cGVOYW1lKCkpOworCisg
ICAgICAgIC8vIGR5bmFtaWMgcHJvcGVydGllcyBqdXN0IGdldCBhbnkgUVZhcmlhbnQKKyAgICAg
ICAgUVZhcmlhbnQgdmFsID0gY29udmVydFZhbHVlVG9RVmFyaWFudChhVmFsdWUsIGFyZ3R5cGUs
IDApOworICAgICAgICBpZiAobV90eXBlID09IE1ldGFQcm9wZXJ0eSkgeworICAgICAgICAgICAg
aWYgKG1fcHJvcGVydHkuaXNXcml0YWJsZSgpKQorICAgICAgICAgICAgICAgIG1fcHJvcGVydHku
d3JpdGUob2JqLCB2YWwpOworICAgICAgICB9IGVsc2UgaWYgKG1fdHlwZSA9PSBEeW5hbWljUHJv
cGVydHkpCisgICAgICAgICAgICBvYmotPnNldFByb3BlcnR5KG1fZHluYW1pY1Byb3BlcnR5LmNv
bnN0RGF0YSgpLCB2YWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIFFTdHJpbmcgbXNnID0gUVN0
cmluZyhRTGF0aW4xU3RyaW5nKCJjYW5ub3QgYWNjZXNzIG1lbWJlciBgJTEnIG9mIGRlbGV0ZWQg
UU9iamVjdCIpKS5hcmcoUUxhdGluMVN0cmluZyhuYW1lKCkpKTsKKyAgICAgICAgcmV0dXJuIFY4
UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6R2VuZXJhbEVycm9yLCBtc2cudG9MYXRpbjEoKS5j
b25zdERhdGEoKSk7CisgICAgfQorICAgIHJldHVybiBhVmFsdWU7Cit9CisKKworLy8gUmVnaXN0
ZXIgYWNjZXNzb3JzIGZvciBhbGwgcHJvcGVydGllcyBpbiB2OCBPYmplY3RUZW1wbGF0ZQorLy8g
U29ycnkgdjggY2Fubm90IGRvIGZhbGxiYWNrIC0gbm8gd2F5IHRvIGFkZCBhY2Nlc3NvcnMgb24g
dGhlIGZseSwgd2hlbiBvYmplY3QgZXhpc3RzLi4uCisvLyB2OCBwYXRjaCBpcyBjb21pbmcgZm9y
IHRoYXQsIGJ1dCAuLi5ub3QgZ29pbmcgdG8gdXNlIGl0Lgordm9pZCBRdEluc3RhbmNlOjpTZXRB
Y2Nlc3NvcnModjg6OkhhbmRsZTx2ODo6T2JqZWN0VGVtcGxhdGU+JiB2OFByb3BUZW1wbCkKK3sK
KyAgICBjb25zdCBRTWV0YU9iamVjdCogcW1ldGEgPSBtX29iamVjdC0+bWV0YU9iamVjdCgpOwor
CisgICAgLy8gU2V0IGNvbW1vbiBuYW1lZCBwcm9wZXJ0eSBoYW5kbGVyIGZvciBkeW5hbWljbHkg
Y3JlYXRlZCBwcm9wZXJ0aWVzCisgICAgdjhQcm9wVGVtcGwtPlNldE5hbWVkUHJvcGVydHlIYW5k
bGVyKAorICAgICAgICBmaWVsZEdldHRlciwgZmllbGRQcm9wZXJ0eUhhbmRsZXJTZXR0ZXIsIDAs
IDAsIDAsIHY4OjpTdHJpbmc6Ok5ldygiUU9iamVjdCBQcm9wZXJ0eUhhbmRsZXIiKSk7CisKKyAg
ICAvLyBQcm9wZXJ0aWVzIHNldHRlcnMvZ2V0dGVycworICAgIGZvciAoaW50IGkgPSAwOyBpIDwg
cW1ldGEtPnByb3BlcnR5Q291bnQoKTsgaSsrKSB7CisgICAgICAgIFFNZXRhUHJvcGVydHkgcHJv
cCA9IHFtZXRhLT5wcm9wZXJ0eShpKTsKKyAgICAgICAgaWYgKHByb3AuaXNTY3JpcHRhYmxlKCkp
IHsKKyAgICAgICAgICAgIFFTdHJpbmcgb2JqTmFtZShwcm9wLm5hbWUoKSk7CisKKyAgICAgICAg
ICAgIHY4UHJvcFRlbXBsLT5TZXRBY2Nlc3NvcigKKyAgICAgICAgICAgICAgICB2ODo6U3RyaW5n
OjpOZXcoCisgICAgICAgICAgICAgICAgICAgIHByb3AubmFtZSgpKSwgCisgICAgICAgICAgICAg
ICAgICAgIGZpZWxkR2V0dGVyLCAKKyAgICAgICAgICAgICAgICAgICAgZmllbGRTZXR0ZXIsIAor
ICAgICAgICAgICAgICAgICAgICB2ODo6U3RyaW5nOjpOZXcocHJvcC5uYW1lKCkpLAorICAgICAg
ICAgICAgICAgICAgICB2ODo6REVGQVVMVCwgCisgICAgICAgICAgICAgICAgICAgIHY4OjpEb250
RGVsZXRlKTsKKworICAgICAgICAgICAgUXRGaWVsZCogZiA9IG5ldyBRdEZpZWxkKHByb3ApOwor
ICAgICAgICAgICAgbV9maWVsZHMuaW5zZXJ0KG9iak5hbWUsIGYpOworICAgICAgICB9CisgICAg
fQorCisgICAgLy8gRHluIHByb3BlcnRpZXMgc2V0dGVycy9nZXR0ZXJzCisgICAgUUxpc3Q8UUJ5
dGVBcnJheT4gZHluUHJvcHMgPSBtX29iamVjdC0+ZHluYW1pY1Byb3BlcnR5TmFtZXMoKTsKKyAg
ICBmb3JlYWNoIChRQnl0ZUFycmF5IGJhLCBkeW5Qcm9wcykgeworCisgICAgICAgIHY4UHJvcFRl
bXBsLT5TZXRBY2Nlc3NvcigKKyAgICAgICAgICAgIHY4OjpTdHJpbmc6Ok5ldyhiYS5jb25zdERh
dGEoKSksIAorICAgICAgICAgICAgZmllbGRHZXR0ZXIsIAorICAgICAgICAgICAgZmllbGRTZXR0
ZXIsCisgICAgICAgICAgICB2ODo6U3RyaW5nOjpOZXcoYmEuY29uc3REYXRhKCkpKTsKKworICAg
ICAgICBRdEZpZWxkKiBmID0gbmV3IFF0RmllbGQoYmEpOworICAgICAgICBtX2ZpZWxkcy5pbnNl
cnQoUVN0cmluZyhiYS5jb25zdERhdGEoKSksIGYpOworICAgIH0KKworICAgIC8vIENoaWxkIG9i
amVjdHMgc2V0dGVycy9nZXR0ZXJzCisgICAgUUxpc3Q8UU9iamVjdCo+IGNoaWxkcmVuID0gbV9v
YmplY3QtPmNoaWxkcmVuKCk7CisgICAgZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNoaWxk
cmVuLmNvdW50KCk7ICsraW5kZXgpIHsKKyAgICAgICAgUU9iamVjdCogY2hpbGQgPSBjaGlsZHJl
bi5hdChpbmRleCk7CisKKyAgICAgICAgdjhQcm9wVGVtcGwtPlNldEFjY2Vzc29yKAorICAgICAg
ICAgICAgdjg6OlN0cmluZzo6TmV3KGNoaWxkLT5vYmplY3ROYW1lKCkudG9MYXRpbjEoKS5jb25z
dERhdGEoKSksIAorICAgICAgICAgICAgZmllbGRHZXR0ZXIsIAorICAgICAgICAgICAgZmllbGRT
ZXR0ZXIsCisgICAgICAgICAgICB2ODo6U3RyaW5nOjpOZXcoY2hpbGQtPm9iamVjdE5hbWUoKS50
b0xhdGluMSgpLmNvbnN0RGF0YSgpKSwKKyAgICAgICAgICAgIHY4OjpERUZBVUxULCAKKyAgICAg
ICAgICAgIHY4OjpEb250RGVsZXRlKTsKKworICAgICAgICBRdEZpZWxkKiBmID0gbmV3IFF0Rmll
bGQoY2hpbGQpOworICAgICAgICBtX2ZpZWxkcy5pbnNlcnQoY2hpbGQtPm9iamVjdE5hbWUoKSwg
Zik7CisgICAgfQorCisgICAgLy8gTWV0aG9kcyBzZXR0ZXJzL2dldHRlcnMKKyAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IHFtZXRhLT5tZXRob2RDb3VudCgpOyBpKyspIHsKKyAgICAgICAgUU1ldGFN
ZXRob2QgbWV0aG9kID0gcW1ldGEtPm1ldGhvZChpKTsKKyAgICAgICAgaWYgKG1ldGhvZC5hY2Nl
c3MoKSA9PSBRTWV0YU1ldGhvZDo6UHJpdmF0ZSkgCisgICAgICAgICAgICBjb250aW51ZTsKKwor
ICAgICAgICBRQnl0ZUFycmF5IG5hbWUgPSBtZXRob2Quc2lnbmF0dXJlKCk7CisgICAgICAgIFFC
eXRlQXJyYXkgc2lnbmF0dXJlID0gUU1ldGFPYmplY3Q6Om5vcm1hbGl6ZWRTaWduYXR1cmUobmFt
ZS5jb25zdERhdGEoKSk7CisgICAgICAgIG5hbWUudHJ1bmNhdGUobmFtZS5pbmRleE9mKCcoJykp
OworCisgICAgICAgIGlmICghbV9tZXRob2RzLmNvbnRhaW5zKG5hbWUpKSB7CisgICAgICAgICAg
ICAvLyBDcmVhdGUgZHVtbXkgb2JqZWN0IGZvciBvdmVybGFvZGluZyBoYW5kbGluZworICAgICAg
ICAgICAgUXRSdW50aW1lTWV0YU1ldGhvZCogdmFsID0gbmV3IFF0UnVudGltZU1ldGFNZXRob2Qo
dGhpcywgaSwgbmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICBtX21ldGhvZHMuaW5zZXJ0KG5hbWUs
IHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gQWRkIHJ1bnRpbWUgbWV0aG9kIG9iamVjdAor
ICAgICAgICBRdFJ1bnRpbWVNZXRhTWV0aG9kKiB2YWwgPSBuZXcgUXRSdW50aW1lTWV0YU1ldGhv
ZCh0aGlzLCBpLCBzaWduYXR1cmUsIGZhbHNlKTsKKyAgICAgICAgbV9tZXRob2RzLmluc2VydChz
aWduYXR1cmUsIHZhbCk7CisgICAgfQorfQorCisvLyBHZXQgZmllbGQgb24gSlMgY2FsbGJhY2sK
K1F0RmllbGQqIFF0SW5zdGFuY2U6OmdldEZpZWxkKFFCeXRlQXJyYXkgbmFtZSkgY29uc3QKK3sK
KyAgICBRU3RyaW5nIG9iak5hbWUobmFtZSk7CisKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgYSBj
YWNoZWQgZmllbGQKKyAgICBRdEZpZWxkKiBmID0gbV9maWVsZHMudmFsdWUob2JqTmFtZSk7CisK
KyAgICBpZiAobV9vYmplY3QpIHsKKyAgICAgICAgY29uc3QgUU1ldGFPYmplY3QqIHFtZXRhID0g
bV9vYmplY3QtPm1ldGFPYmplY3QoKTsKKyAgICAgICAgaWYgKGYpIHsKKyAgICAgICAgICAgIC8v
IFdlIG9ubHkgY2FjaGUgcmVhbCBtZXRhcHJvcGVydGllcywgYnV0IHdlIGRvIHN0b3JlIHRoZQor
ICAgICAgICAgICAgLy8gb3RoZXIgdHlwZXMgc28gd2UgY2FuIGRlbGV0ZSB0aGVtIGxhdGVyCisg
ICAgICAgICAgICBpZiAoZi0+ZmllbGRUeXBlKCkgPT0gUXRGaWVsZDo6TWV0YVByb3BlcnR5KQor
ICAgICAgICAgICAgICAgIHJldHVybiBmOworICAgICAgICAgICAgaWYgKGYtPmZpZWxkVHlwZSgp
ID09IFF0RmllbGQ6OkR5bmFtaWNQcm9wZXJ0eSkgeworICAgICAgICAgICAgICAgIGlmIChtX29i
amVjdC0+ZHluYW1pY1Byb3BlcnR5TmFtZXMoKS5pbmRleE9mKG5hbWUpID49IDApCisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiBmOworCisgICAgICAgICAgICAgICAgLy8gRHluYW1pYyBwcm9w
ZXJ0eSB0aGF0IGRpc2FwcGVhcmVkCisgICAgICAgICAgICAgICAgbV9maWVsZHMucmVtb3ZlKG9i
ak5hbWUpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBmOworICAgICAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgICAgICBRTGlzdDxRT2JqZWN0Kj4gY2hpbGRyZW4gPSBtX29iamVjdC0+Y2hp
bGRyZW4oKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgY2hp
bGRyZW4uY291bnQoKTsgKytpbmRleCkgeworICAgICAgICAgICAgICAgICAgICBRT2JqZWN0KiBj
aGlsZCA9IGNoaWxkcmVuLmF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxk
LT5vYmplY3ROYW1lKCkgPT0gb2JqTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVy
biBmOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERpZG4ndCBmaW5k
IGl0LCBkZWxldGUgaXQgZnJvbSB0aGUgY2FjaGUKKyAgICAgICAgICAgICAgICBtX2ZpZWxkcy5y
ZW1vdmUob2JqTmFtZSk7CisgICAgICAgICAgICAgICAgZGVsZXRlIGY7CisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICAgICAgLy8gTm8gZmllbGQgZm91bmQgb3IgaXQgd2FzIGRlbGV0ZWQg
Pz8/IC0gcmVnaXN0ZXIgZHltYW5pY2FsbHkgYWRkZWQgcHJvcGVydHkuLi4uCisgICAgICAgIGlu
dCBpbmRleCA9IHFtZXRhLT5pbmRleE9mUHJvcGVydHkobmFtZSk7CisgICAgICAgIGlmIChpbmRl
eCA+PSAwKSB7CisgICAgICAgICAgICBRTWV0YVByb3BlcnR5IHByb3AgPSBxbWV0YS0+cHJvcGVy
dHkoaW5kZXgpOworCisgICAgICAgICAgICBpZiAocHJvcC5pc1NjcmlwdGFibGUobV9vYmplY3Qp
KSB7CisgICAgICAgICAgICAgICAgZiA9IG5ldyBRdEZpZWxkKHByb3ApOworICAgICAgICAgICAg
ICAgIG1fZmllbGRzLmluc2VydChvYmpOYW1lLCBmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIER5bmFtaWMgcHJvcGVy
dGllcworICAgICAgICBpbmRleCA9IG1fb2JqZWN0LT5keW5hbWljUHJvcGVydHlOYW1lcygpLmlu
ZGV4T2YobmFtZSk7CisgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CisgICAgICAgICAgICBmID0g
bmV3IFF0RmllbGQobmFtZSk7CisgICAgICAgICAgICBtX2ZpZWxkcy5pbnNlcnQob2JqTmFtZSwg
Zik7CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoaWxk
IG9iamVjdHMKKyAgICAgICAgUUxpc3Q8UU9iamVjdCo+IGNoaWxkcmVuID0gbV9vYmplY3QtPmNo
aWxkcmVuKCk7CisgICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmNvdW50
KCk7ICsraW5kZXgpIHsKKyAgICAgICAgICAgIFFPYmplY3QqIGNoaWxkID0gY2hpbGRyZW4uYXQo
aW5kZXgpOworICAgICAgICAgICAgaWYgKGNoaWxkLT5vYmplY3ROYW1lKCkgPT0gb2JqTmFtZSkg
eworICAgICAgICAgICAgICAgIGYgPSBuZXcgUXRGaWVsZChjaGlsZCk7CisgICAgICAgICAgICAg
ICAgbV9maWVsZHMuaW5zZXJ0KG9iak5hbWUsIGYpOworICAgICAgICAgICAgICAgIHJldHVybiBm
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEZpZWxkIHdhcyBpbiB0aGUg
Y2FjaGUgYnV0IHdhcyBkZWxldGVkCisgICAgICAgIHJldHVybiAwOworICAgIH0gCisKKyAgICAv
LyBPYmplY3QgZGVsZXRlZCBvbiBDKysgc2lkZQorICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHdp
dGggcXRzY3JpcHQsIGNhY2hlZCBtZXRob2RzIGRvbid0IGNhdXNlCisgICAgLy8gZXJyb3JzIHVu
dGlsIHRoZXkgYXJlIGFjY2Vzc2VkLCBzbyBkb24ndCBibGluZGx5IGNyZWF0ZSBhbiBlcnJvcgor
ICAgIC8vIGhlcmUuCisgICAgaWYgKG1fbWV0aG9kcy5jb250YWlucyhuYW1lKSkKKyAgICAgICAg
Ly8gTWV0aG9kIGlzIHN0aWxsIGNhY2hlZCBidXQgb2JqZWN0IGRlbGV0ZWQKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICAvLyBkZWxldGVkIHFvYmplY3QsIGJ1dCBjYW4ndCB0aHJvdyBhbiBlcnJv
ciBmcm9tIGhlcmUgKG5vIGV4ZWMpCisgICAgLy8gY3JlYXRlIGEgZmFrZSBRdEZpZWxkIHRoYXQg
d2lsbCB0aHJvdyB1cG9uIGFjY2VzcworICAgIGlmICghZikgeworICAgICAgICBmID0gbmV3IFF0
RmllbGQobmFtZSk7CisgICAgICAgIG1fZmllbGRzLmluc2VydChvYmpOYW1lLCBmKTsKKyAgICB9
CisgICAgcmV0dXJuIGY7Cit9CisKK30gLy8gbmFtZXNwYWNlIEJpbmRpbmdzCit9IC8vIG5hbWVz
cGFjZSBWOAorCkluZGV4OiBXZWJDb3JlL2JyaWRnZS9xdC92OC9xdF9pbnN0YW5jZXY4LmgNCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0NCi0tLSBXZWJDb3JlL2JyaWRnZS9xdC92OC9xdF9pbnN0YW5jZXY4LmgJKHJldmlz
aW9uIDApDQorKysgV2ViQ29yZS9icmlkZ2UvcXQvdjgvcXRfaW5zdGFuY2V2OC5oCShyZXZpc2lv
biAwKQ0KQEAgLTAsMCArMSwxNjQgQEANCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lh
IENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisg
KiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAt
MTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgcXRfaW5zdGFuY2V2OF9oCisjZGVmaW5lIHF0
X2luc3RhbmNldjhfaAorCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJT
dHJpbmdIYXNoLmgiCisjaW5jbHVkZSAicXRfcnVudGltZXY4LmgiCisjaW5jbHVkZSAicXdlYmVs
ZW1lbnQuaCIKKyNpbmNsdWRlICJ2OC5oIgorI2luY2x1ZGUgPFF0U2NyaXB0L3FzY3JpcHRlbmdp
bmUuaD4KKyNpbmNsdWRlIDxWOFByb3h5Lmg+CisjaW5jbHVkZSA8cWRlYnVnLmg+CisjaW5jbHVk
ZSA8cWhhc2guaD4KKyNpbmNsdWRlIDxxbWV0YW9iamVjdC5oPgorI2luY2x1ZGUgPHFwb2ludGVy
Lmg+CisjaW5jbHVkZSA8cXNldC5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoTWFwLmg+CisjaW5jbHVk
ZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3dGYvUmVmQ291bnRlZC5oPgorI2luY2x1ZGUg
PHd0Zi9WZWN0b3IuaD4KKworUV9ERUNMQVJFX01FVEFUWVBFKFFPYmplY3RMaXN0KTsKK1FfREVD
TEFSRV9NRVRBVFlQRShRTGlzdDxpbnQ+KTsKK1FfREVDTEFSRV9NRVRBVFlQRShRVmFyaWFudCk7
CisKKyNpZiAhT1MoV0lORE9XUykgJiYgIU9TKFNZTUJJQU4pICYmICFPUyhVTklYKQorUV9ERUNM
QVJFX01FVEFUWVBFKFFXZWJFbGVtZW50KTsKKyNlbmRpZgorCit1c2luZyBuYW1lc3BhY2UgV2Vi
Q29yZTsKKworbmFtZXNwYWNlIFY4IHsKK25hbWVzcGFjZSBCaW5kaW5ncyB7CisKK2NsYXNzIFF0
TWV0aG9kOworY2xhc3MgUXRGaWVsZDsKK2NsYXNzIFF0SW5zdGFuY2U7CitjbGFzcyBRdFJ1bnRp
bWVNZXRob2Q7CitjbGFzcyBRdFJ1bnRpbWVNZXRhTWV0aG9kOworCit0eXBlZGVmIFZlY3RvcjxR
dE1ldGhvZCo+IE1ldGhvZExpc3Q7Cit0eXBlZGVmIEhhc2hNYXA8V1RGOjpTdHJpbmcsIE1ldGhv
ZExpc3QqPiBNZXRob2RMaXN0TWFwOwordHlwZWRlZiBIYXNoTWFwPFdURjo6U3RyaW5nLCBRdEZp
ZWxkKj4gRmllbGRNYXA7CisKK2NsYXNzIFF0TWV0aG9kIDogcHVibGljIE5vbmNvcHlhYmxlIHsK
K3B1YmxpYzoKKyAgICB2aXJ0dWFsIGludCBudW1QYXJhbWV0ZXJzKCkgY29uc3QgPSAwOworICAg
IHZpcnR1YWwgflF0TWV0aG9kKCkgeyB9Cit9OworCitjbGFzcyBRdEZpZWxkIHsKK3B1YmxpYzoK
KyAgICB0eXBlZGVmIGVudW0geworICAgICAgICBNZXRhUHJvcGVydHksCisgICAgICAgIER5bmFt
aWNQcm9wZXJ0eSwKKyAgICAgICAgQ2hpbGRPYmplY3QKKyAgICB9IFF0RmllbGRUeXBlOworCisg
ICAgUXRGaWVsZChjb25zdCBRTWV0YVByb3BlcnR5ICZwKQorICAgICAgICA6IG1fdHlwZShNZXRh
UHJvcGVydHkpLCBtX3Byb3BlcnR5KHApCisgICAgICAgIHt9CisKKyAgICBRdEZpZWxkKGNvbnN0
IFFCeXRlQXJyYXkgJmIpCisgICAgICAgIDogbV90eXBlKER5bmFtaWNQcm9wZXJ0eSksIG1fZHlu
YW1pY1Byb3BlcnR5KGIpCisgICAgICAgIHt9CisKKyAgICBRdEZpZWxkKFFPYmplY3QgKmNoaWxk
KQorICAgICAgICA6IG1fdHlwZShDaGlsZE9iamVjdCksIG1fY2hpbGRPYmplY3QoY2hpbGQpCisg
ICAgICAgIHt9CisKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWVGcm9tSW5zdGFuY2Uo
UXRJbnN0YW5jZSopIGNvbnN0OworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBzZXRWYWx1ZVRv
SW5zdGFuY2UoY29uc3QgUXRJbnN0YW5jZSosIHY4OjpIYW5kbGU8djg6OlZhbHVlPikgY29uc3Q7
CisgICAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OworICAgIFF0RmllbGRUeXBlIGZpZWxkVHlw
ZSgpIGNvbnN0IHtyZXR1cm4gbV90eXBlO30KK3ByaXZhdGU6CisgICAgUXRGaWVsZFR5cGUgbV90
eXBlOworICAgIFFCeXRlQXJyYXkgbV9keW5hbWljUHJvcGVydHk7CisgICAgUU1ldGFQcm9wZXJ0
eSBtX3Byb3BlcnR5OworICAgIFFQb2ludGVyPFFPYmplY3Q+IG1fY2hpbGRPYmplY3Q7Cit9Owor
CisKK2NsYXNzIFF0SW5zdGFuY2UgOiBwdWJsaWMgUmVmQ291bnRlZDxRdEluc3RhbmNlPiB7Citw
dWJsaWM6CisgICAgflF0SW5zdGFuY2UoKTsKKyAgICB2b2lkIGdldFByb3BlcnR5TmFtZXModjg6
OkhhbmRsZTx2ODo6QXJyYXk+JiBhcnIpOworICAgIAorICAgIHY4OjpIYW5kbGU8djg6OlZhbHVl
PiBzdHJpbmdWYWx1ZSgpIGNvbnN0OworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBudW1iZXJW
YWx1ZSgpIGNvbnN0OworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBib29sZWFuVmFsdWUoKSBj
b25zdDsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWVPZigpIGNvbnN0OworCisgICAg
UU9iamVjdCogZ2V0T2JqZWN0KCkgY29uc3QgeyByZXR1cm4gbV9vYmplY3Q7IH0KKyAgICBRT2Jq
ZWN0KiBoYXNoS2V5KCkgY29uc3QgeyByZXR1cm4gbV9oYXNoa2V5OyB9CisgICAgdjg6OlBlcnNp
c3RlbnQ8djg6OkNvbnRleHQ+IGNvbnRleHQoKSB7IHJldHVybiBtX2NvbnRleHQ7IH0KKyAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdldFY4T2JqZWN0KCkgeyByZXR1cm4gbV92OE9iajsgfQor
CisgICAgdm9pZCByZW1vdmVDYWNoZWRNZXRob2QoUXRSdW50aW1lTWV0aG9kKiBtZXRob2QpOwor
ICAgIHN0YXRpYyBQYXNzUmVmUHRyPFF0SW5zdGFuY2U+IGdldFF0SW5zdGFuY2UoUU9iamVjdCos
IHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQsIFFTdHJpbmcgbmFtZSwgUVNjcmlwdEVu
Z2luZTo6VmFsdWVPd25lcnNoaXAgb3duZXJzaGlwKTsKKyAgICBzdGF0aWMgdjg6OkhhbmRsZTx2
ODo6VmFsdWU+IEdldFByb3BlcnR5KHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wbmFtZSwgY29u
c3Qgdjg6OkFjY2Vzc29ySW5mbyAmaW5mbyk7CisgICAgc3RhdGljIHZvaWQgU2V0UHJvcGVydHko
djg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BuYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1
ZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbyk7CisgICAgdm9pZCBTZXQoY29uc3QgY2hh
ciogbmFtZSwgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlKTsKKyAgICB2b2lkIFNldEFjY2Vz
c29ycyh2ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4mIHY4UHJvcFRlbXBsKTsKKworICAg
IHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpCb29sZWFuPiBmaWVsZERlbGV0ZXIodjg6OkxvY2FsPHY4
OjpTdHJpbmc+IHByb3BuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvICZpbmZvKTsKKyAgICBz
dGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGZpZWxkR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3Ry
aW5nPiBwcm9wbmFtZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbyk7CisKKyAgICBzdGF0
aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGZpZWxkUHJvcGVydHlIYW5kbGVyU2V0dGVyKHY4OjpM
b2NhbDx2ODo6U3RyaW5nPiBwcm9wbmFtZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsIGNv
bnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pOworICAgIHN0YXRpYyB2b2lkIGZpZWxkU2V0dGVy
KHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wbmFtZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFs
dWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pOworCisgICAgc3RhdGljIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiBjaGlsZE9iamVjdEdldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJv
cG5hbWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8gJmluZm8pOworICAgIHN0YXRpYyB2b2lkIGNo
aWxkT2JqZWN0U2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wbmFtZSwgdjg6OkxvY2Fs
PHY4OjpWYWx1ZT4gdmFsdWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pOworCisgICAg
c3RhdGljIFF0SW5zdGFuY2UqIGdldEluc3RhbmNlKHY4OjpIYW5kbGU8djg6Ok9iamVjdD4pOwor
ICAgIFF0RmllbGQqIGdldEZpZWxkKFFCeXRlQXJyYXkgbmFtZSkgY29uc3Q7CisgICAgYm9vbCBp
c1ZhbGlkKCkgeyByZXR1cm4gbV9pc1ZhbGlkOyB9CisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeyBt
X2lzVmFsaWQgPSBmYWxzZTsgfQorICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdGhy
b3dJbnZhbGlkQWNjZXNzRXJyb3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIFY4UHJveHk6OnRo
cm93RXJyb3IoVjhQcm94eTo6UmVmZXJlbmNlRXJyb3IsICJUcnlpbmcgdG8gYWNjZXNzIG9iamVj
dCBmcm9tIGRlc3Ryb3llZCBwbHVnLWluLiIpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGF0
aWMgUGFzc1JlZlB0cjxRdEluc3RhbmNlPiBjcmVhdGUoUU9iamVjdCAqb2JqLCB2ODo6SGFuZGxl
PHY4OjpDb250ZXh0PiBjb250ZXh0LCBRU3RyaW5nIG5hbWUsIFFTY3JpcHRFbmdpbmU6OlZhbHVl
T3duZXJzaGlwIG93bmVyc2hpcCkgCisgICAgeworICAgICAgICByZXR1cm4gYWRvcHRSZWYobmV3
IFF0SW5zdGFuY2Uob2JqLCBjb250ZXh0LCBuYW1lLCBvd25lcnNoaXApKTsKKyAgICB9CisKKyAg
ICBmcmllbmQgY2xhc3MgUXRGaWVsZDsKKyAgICBRdEluc3RhbmNlKFFPYmplY3QqIG9iaiwgdjg6
OkhhbmRsZTx2ODo6Q29udGV4dD4gY29udGV4dCwgUVN0cmluZyBuYW1lLCBRU2NyaXB0RW5naW5l
OjpWYWx1ZU93bmVyc2hpcCBvd25lcnNoaXApOworCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNv
bnRleHQ+IG1fY29udGV4dDsKKyAgICBRUG9pbnRlcjxRT2JqZWN0PiBtX29iamVjdDsKKyAgICBR
T2JqZWN0KiBtX2hhc2hrZXk7CisgICAgbXV0YWJsZSBRSGFzaDxRQnl0ZUFycmF5LCBRdFJ1bnRp
bWVNZXRhTWV0aG9kKiA+IG1fbWV0aG9kczsKKyAgICBtdXRhYmxlIFFIYXNoPFFTdHJpbmcsIFF0
RmllbGQqPiBtX2ZpZWxkczsKKyAgICBRU2NyaXB0RW5naW5lOjpWYWx1ZU93bmVyc2hpcCBtX293
bmVyc2hpcDsKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiBtX3Y4T2JqOworICAgIFFC
eXRlQXJyYXkgbV9qc05hbWU7CisgICAgYm9vbCBtX2lzVmFsaWQ7Cit9OworCit9IC8vIG5hbWVz
cGFjZSBCaW5kaW5ncworfSAvLyBuYW1lc3BhY2UgSlNDCisKKyNlbmRpZgpJbmRleDogV2ViQ29y
ZS9icmlkZ2UvcXQvdjgvcXRfcGl4bWFwcnVudGltZXY4LmNwcA0KPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KLS0tIFdl
YkNvcmUvYnJpZGdlL3F0L3Y4L3F0X3BpeG1hcHJ1bnRpbWV2OC5jcHAJKHJldmlzaW9uIDApDQor
KysgV2ViQ29yZS9icmlkZ2UvcXQvdjgvcXRfcGl4bWFwcnVudGltZXY4LmNwcAkocmV2aXNpb24g
MCkNCkBAIC0wLDAgKzEsMjQ4IEBADQorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBOb2tpYSBD
b3Jwb3JhdGlvbiBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRh
aWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUg
TGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFy
eTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICoKKyAqLworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgInF0X3BpeG1h
cHJ1bnRpbWV2OC5oIgorCisjaW5jbHVkZSAicXRfaW5zdGFuY2V2OC5oIgorI2luY2x1ZGUgInY4
LmgiCisjaWYgIVVTRShKU0MpCisjaW5jbHVkZSAiVjhEb2N1bWVudC5oIgorI2luY2x1ZGUgIlY4
SFRNTEltYWdlRWxlbWVudC5oIgorI2VuZGlmCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNp
bmNsdWRlICJIVE1MSW1hZ2VFbGVtZW50LmgiCisjaW5jbHVkZSAiU3RpbGxJbWFnZVF0LmgiCisj
aW5jbHVkZSA8UUJ1ZmZlcj4KKyNpbmNsdWRlIDxRQnl0ZUFycmF5PgorI2luY2x1ZGUgPFFJbWFn
ZT4KKyNpbmNsdWRlIDxRUGl4bWFwPgorI2luY2x1ZGUgPFFWYXJpYW50PgorCit1c2luZyBuYW1l
c3BhY2UgV2ViQ29yZTsKK25hbWVzcGFjZSBWOCB7CituYW1lc3BhY2UgQmluZGluZ3MgeworCitR
VmFyaWFudCBRdFBpeG1hcEluc3RhbmNlOjp2YXJpYW50RnJvbU9iamVjdCh2ODo6SGFuZGxlPHY4
OjpPYmplY3Q+IG9iamVjdCwgUU1ldGFUeXBlOjpUeXBlIGhpbnQpCit7CisgICAgaWYgKCFvYmpl
Y3QtPklzT2JqZWN0KCkpCisgICAgICAgIGdvdG8gcmV0dXJuRW1wdHlWYXJpYW50OworICAgIGlm
IChWOEhUTUxJbWFnZUVsZW1lbnQ6Okhhc0luc3RhbmNlKG9iamVjdCkpIHsKKyAgICAgICAgSFRN
TEltYWdlRWxlbWVudCogaW1hZ2VFbGVtZW50ID0gVjhIVE1MSW1hZ2VFbGVtZW50Ojp0b05hdGl2
ZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KG9iamVjdCkpOworCisgICAgICAgIGlmICgh
aW1hZ2VFbGVtZW50KQorICAgICAgICAgICAgZ290byByZXR1cm5FbXB0eVZhcmlhbnQ7CisKKyAg
ICAgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdlID0gaW1hZ2VFbGVtZW50LT5jYWNoZWRJbWFn
ZSgpOworICAgICAgICBpZiAoIWNhY2hlZEltYWdlKQorICAgICAgICAgICAgZ290byByZXR1cm5F
bXB0eVZhcmlhbnQ7CisKKyAgICAgICAgSW1hZ2UqIGltYWdlID0gY2FjaGVkSW1hZ2UtPmltYWdl
KCk7CisgICAgICAgIGlmICghaW1hZ2UpCisgICAgICAgICAgICBnb3RvIHJldHVybkVtcHR5VmFy
aWFudDsKKworICAgICAgICBRUGl4bWFwKiBwaXhtYXAgPSBpbWFnZS0+bmF0aXZlSW1hZ2VGb3JD
dXJyZW50RnJhbWUoKTsKKyAgICAgICAgaWYgKCFwaXhtYXApCisgICAgICAgICAgICBnb3RvIHJl
dHVybkVtcHR5VmFyaWFudDsKKworICAgICAgICByZXR1cm4gKGhpbnQgPT0gc3RhdGljX2Nhc3Q8
UU1ldGFUeXBlOjpUeXBlPihxTWV0YVR5cGVJZDxRUGl4bWFwPigpKSkKKyAgICAgICAgICAgICAg
ICAgID8gUVZhcmlhbnQ6OmZyb21WYWx1ZTxRUGl4bWFwPigqcGl4bWFwKQorICAgICAgICAgICAg
ICAgICAgOiBRVmFyaWFudDo6ZnJvbVZhbHVlPFFJbWFnZT4ocGl4bWFwLT50b0ltYWdlKCkpOwor
ICAgIH0KKworICAgIGlmICghb2JqZWN0LT5HZXRIaWRkZW5WYWx1ZSh2ODo6U3RyaW5nOjpOZXco
Il9fcXRfcGl4bWFwX18iKSkuSXNFbXB0eSgpKSB7CisKKyAgICAgICAgUXRQaXhtYXBJbnN0YW5j
ZSogaW5zdGFuY2UgPSAKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PFF0UGl4bWFwSW5zdGFuY2Uq
Pih2ODo6RXh0ZXJuYWw6OlVud3JhcChvYmplY3QtPkdldEludGVybmFsRmllbGQoMCkpKTsKKwor
ICAgICAgICBpZiAoIWluc3RhbmNlKQorICAgICAgICAgICAgZ290byByZXR1cm5FbXB0eVZhcmlh
bnQ7CisKKyAgICAgICAgaWYgKGhpbnQgPT0gcU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkKKyAgICAg
ICAgICAgIHJldHVybiBRVmFyaWFudDo6ZnJvbVZhbHVlPFFQaXhtYXA+KGluc3RhbmNlLT50b1Bp
eG1hcCgpKTsKKworICAgICAgICBpZiAoaGludCA9PSBxTWV0YVR5cGVJZDxRSW1hZ2U+KCkpCisg
ICAgICAgICAgICByZXR1cm4gUVZhcmlhbnQ6OmZyb21WYWx1ZTxRSW1hZ2U+KGluc3RhbmNlLT50
b0ltYWdlKCkpOworICAgIH0KKworcmV0dXJuRW1wdHlWYXJpYW50OgorICAgIGlmIChoaW50ID09
IHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpCisgICAgICAgIHJldHVybiBRVmFyaWFudDo6ZnJvbVZh
bHVlPFFQaXhtYXA+KFFQaXhtYXAoKSk7CisgICAgaWYgKGhpbnQgPT0gcU1ldGFUeXBlSWQ8UUlt
YWdlPigpKQorICAgICAgICByZXR1cm4gUVZhcmlhbnQ6OmZyb21WYWx1ZTxRSW1hZ2U+KFFJbWFn
ZSgpKTsKKworICAgIHJldHVybiBRVmFyaWFudCgpOworfQorCitpbnQgUXRQaXhtYXBJbnN0YW5j
ZTo6d2lkdGgoKSBjb25zdAoreworICAgIGlmIChtX2RhdGEudHlwZSgpID09IHN0YXRpY19jYXN0
PFFWYXJpYW50OjpUeXBlPihxTWV0YVR5cGVJZDxRUGl4bWFwPigpKSkKKyAgICAgICAgcmV0dXJu
IG1fZGF0YS52YWx1ZTxRUGl4bWFwPigpLndpZHRoKCk7CisgICAgaWYgKG1fZGF0YS50eXBlKCkg
PT0gc3RhdGljX2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFJbWFnZT4oKSkpCisg
ICAgICAgIHJldHVybiBtX2RhdGEudmFsdWU8UUltYWdlPigpLndpZHRoKCk7CisgICAgcmV0dXJu
IDA7Cit9CisKK2ludCBRdFBpeG1hcEluc3RhbmNlOjpoZWlnaHQoKSBjb25zdAoreworICAgIGlm
IChtX2RhdGEudHlwZSgpID09IHN0YXRpY19jYXN0PFFWYXJpYW50OjpUeXBlPihxTWV0YVR5cGVJ
ZDxRUGl4bWFwPigpKSkKKyAgICAgICAgcmV0dXJuIG1fZGF0YS52YWx1ZTxRUGl4bWFwPigpLmhl
aWdodCgpOworICAgIGlmIChtX2RhdGEudHlwZSgpID09IHN0YXRpY19jYXN0PFFWYXJpYW50OjpU
eXBlPihxTWV0YVR5cGVJZDxRSW1hZ2U+KCkpKQorICAgICAgICByZXR1cm4gbV9kYXRhLnZhbHVl
PFFJbWFnZT4oKS5oZWlnaHQoKTsKKyAgICByZXR1cm4gMDsKK30KKworUVBpeG1hcCBRdFBpeG1h
cEluc3RhbmNlOjp0b1BpeG1hcCgpCit7CisgICAgaWYgKG1fZGF0YS50eXBlKCkgPT0gc3RhdGlj
X2Nhc3Q8UVZhcmlhbnQ6OlR5cGU+KHFNZXRhVHlwZUlkPFFQaXhtYXA+KCkpKQorICAgICAgICBy
ZXR1cm4gbV9kYXRhLnZhbHVlPFFQaXhtYXA+KCk7CisKKyAgICBpZiAobV9kYXRhLnR5cGUoKSA9
PSBzdGF0aWNfY2FzdDxRVmFyaWFudDo6VHlwZT4ocU1ldGFUeXBlSWQ8UUltYWdlPigpKSkgewor
ICAgICAgICBjb25zdCBRUGl4bWFwIHBpeG1hcCA9IFFQaXhtYXA6OmZyb21JbWFnZShtX2RhdGEu
dmFsdWU8UUltYWdlPigpKTsKKyAgICAgICAgbV9kYXRhID0gUVZhcmlhbnQ6OmZyb21WYWx1ZTxR
UGl4bWFwPihwaXhtYXApOworICAgICAgICByZXR1cm4gcGl4bWFwOworICAgIH0KKworICAgIHJl
dHVybiBRUGl4bWFwKCk7Cit9CisKK1FJbWFnZSBRdFBpeG1hcEluc3RhbmNlOjp0b0ltYWdlKCkK
K3sKKyAgICBpZiAobV9kYXRhLnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFudDo6VHlwZT4o
cU1ldGFUeXBlSWQ8UUltYWdlPigpKSkKKyAgICAgICAgcmV0dXJuIG1fZGF0YS52YWx1ZTxRSW1h
Z2U+KCk7CisKKyAgICBpZiAobV9kYXRhLnR5cGUoKSA9PSBzdGF0aWNfY2FzdDxRVmFyaWFudDo6
VHlwZT4ocU1ldGFUeXBlSWQ8UVBpeG1hcD4oKSkpIHsKKyAgICAgICAgY29uc3QgUUltYWdlIGlt
YWdlID0gbV9kYXRhLnZhbHVlPFFQaXhtYXA+KCkudG9JbWFnZSgpOworICAgICAgICBtX2RhdGEg
PSBRVmFyaWFudDo6ZnJvbVZhbHVlPFFJbWFnZT4oaW1hZ2UpOworICAgICAgICByZXR1cm4gaW1h
Z2U7CisgICAgfQorCisgICAgcmV0dXJuIFFJbWFnZSgpOworfQorCitRdFBpeG1hcEluc3RhbmNl
OjpRdFBpeG1hcEluc3RhbmNlKHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+IGNvbnRleHQsIGNvbnN0
IFFWYXJpYW50JiBkKQorOiBtX2NvbnRleHQodjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+OjpO
ZXcoY29udGV4dCkpLCBtX2RhdGEoZCkgCit7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25U
ZW1wbGF0ZT4gY2xhc3N0ZW1wbCA9IHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoKTsKKyAgICB2
ODo6SGFuZGxlPHY4OjpPYmplY3RUZW1wbGF0ZT4gcHJvcHRlbXBsID0gY2xhc3N0ZW1wbC0+SW5z
dGFuY2VUZW1wbGF0ZSgpOworICAgIHByb3B0ZW1wbC0+U2V0SW50ZXJuYWxGaWVsZENvdW50KDAp
OworCisgICAgLy8gQWRkaW5nIHByb3BlcnRpZXMgCisgICAgcHJvcHRlbXBsLT5TZXRBY2Nlc3Nv
cigKKyAgICAgICAgdjg6OlN0cmluZzo6TmV3KCJoZWlnaHQiKSwKKyAgICAgICAgaGVpZ2h0R2V0
dGVyLCAKKyAgICAgICAgMCwgCisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpLCAKKyAg
ICAgICAgdjg6OkRFRkFVTFQsCisgICAgICAgIHY4OjpSZWFkT25seSk7CisgICAgcHJvcHRlbXBs
LT5TZXRBY2Nlc3NvcigKKyAgICAgICAgdjg6OlN0cmluZzo6TmV3KCJ3aWR0aCIpLAorICAgICAg
ICB3aWR0aEdldHRlciwgCisgICAgICAgIDAsIAorICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4oKSwgCisgICAgICAgIHY4OjpERUZBVUxULAorICAgICAgICB2ODo6UmVhZE9ubHkpOworCisg
ICAgLy8gQ3JlYXRlIHY4IG9iamVjdCBmb3IgUXRQaXhtYXBJbnN0YW5jZQorICAgIG1fdjhPYmog
PSB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3KGNsYXNzdGVtcGwtPkdldEZ1bmN0aW9u
KCktPk5ld0luc3RhbmNlKCkpOworICAgIG1fdjhPYmotPlNldEludGVybmFsRmllbGQoMCwgdjg6
OkV4dGVybmFsOjpXcmFwKHRoaXMpKTsKKworICAgIC8vIEFkZGluZyBtZXRob2RzCisgICAgbV92
OE9iai0+U2V0KAorICAgICAgICB2ODo6U3RyaW5nOjpOZXcoInRvRGF0YVVybCIpLCAKKyAgICAg
ICAgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyh0b0RhdGFVcmwpLT5HZXRGdW5jdGlvbigpKTsK
KyAgICBtX3Y4T2JqLT5TZXQoCisgICAgICAgIHY4OjpTdHJpbmc6Ok5ldygidG9TdHJpbmciKSwg
CisgICAgICAgIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcodG9TdHJpbmcpLT5HZXRGdW5jdGlv
bigpKTsKKyAgICBtX3Y4T2JqLT5TZXQoCisgICAgICAgIHY4OjpTdHJpbmc6Ok5ldygiYXNzaWdu
VG9IVE1MSW1hZ2VFbGVtZW50IiksIAorICAgICAgICB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3
KGFzc2lnblRvSFRNTEltYWdlRWxlbWVudCktPkdldEZ1bmN0aW9uKCkpOworCisgICAgLy8gIlRh
dG9vIiB0aGUgb2JqZWN0CisgICAgbV92OE9iai0+U2V0SGlkZGVuVmFsdWUodjg6OlN0cmluZzo6
TmV3KCJfX3F0X3BpeG1hcF9fIiksIHY4OjpOdWxsKCkpOworfQorCitRdFBpeG1hcEluc3RhbmNl
KiBRdFBpeG1hcEluc3RhbmNlOjpjcmVhdGVSdW50aW1lT2JqZWN0KHY4OjpIYW5kbGU8djg6OkNv
bnRleHQ+IGNvbnRleHQsIGNvbnN0IFFWYXJpYW50JiBkYXRhKQoreworICAgIHJldHVybiBuZXcg
UXRQaXhtYXBJbnN0YW5jZShjb250ZXh0LCBkYXRhKTsKK30KKworYm9vbCBRdFBpeG1hcEluc3Rh
bmNlOjpjYW5IYW5kbGUoUU1ldGFUeXBlOjpUeXBlIGhpbnQpCit7CisgICAgcmV0dXJuIGhpbnQg
PT0gcU1ldGFUeXBlSWQ8UUltYWdlPigpIHx8IGhpbnQgPT0gcU1ldGFUeXBlSWQ8UVBpeG1hcD4o
KTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFF0UGl4bWFwSW5zdGFuY2U6OndpZHRoR2V0
dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wbmFtZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5m
byYgaW5mbykKK3sKKyAgICBRdFBpeG1hcEluc3RhbmNlKiBpbnN0YW5jZSA9IAorICAgICAgICBz
dGF0aWNfY2FzdDxRdFBpeG1hcEluc3RhbmNlKj4odjg6OkV4dGVybmFsOjpVbndyYXAoaW5mby5I
b2xkZXIoKS0+R2V0SW50ZXJuYWxGaWVsZCgwKSkpOworICAgIHJldHVybiB2ODo6SW50ZWdlcjo6
TmV3KGluc3RhbmNlLT53aWR0aCgpKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFF0UGl4
bWFwSW5zdGFuY2U6OmhlaWdodEdldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJvcG5hbWUs
IGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCit7CisgICAgUXRQaXhtYXBJbnN0YW5jZSog
aW5zdGFuY2UgPSAKKyAgICAgICAgc3RhdGljX2Nhc3Q8UXRQaXhtYXBJbnN0YW5jZSo+KHY4OjpF
eHRlcm5hbDo6VW53cmFwKGluZm8uSG9sZGVyKCktPkdldEludGVybmFsRmllbGQoMCkpKTsKKyAg
ICByZXR1cm4gdjg6OkludGVnZXI6Ok5ldyhpbnN0YW5jZS0+aGVpZ2h0KCkpOworfQorCit2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gUXRQaXhtYXBJbnN0YW5jZTo6dG9EYXRhVXJsKGNvbnN0IHY4OjpB
cmd1bWVudHMmIGFyZ3MpCit7CisgICAgUXRQaXhtYXBJbnN0YW5jZSogaW5zdGFuY2UgPSAKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8UXRQaXhtYXBJbnN0YW5jZSo+KHY4OjpFeHRlcm5hbDo6VW53cmFw
KGFyZ3MuSG9sZGVyKCktPkdldEludGVybmFsRmllbGQoMCkpKTsKKyAgICBRQnl0ZUFycmF5IGJ5
dGVBcnJheTsKKyAgICBRQnVmZmVyIGJ1ZmZlcigmYnl0ZUFycmF5KTsKKyAgICBpbnN0YW5jZS0+
dG9JbWFnZSgpLnNhdmUoJmJ1ZmZlciwgIlBORyIpOworICAgIGNvbnN0IFFTdHJpbmcgZW5jb2Rl
ZFN0cmluZyA9IFFTdHJpbmcoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCwiKSArIGJ5dGVBcnJheS50
b0Jhc2U2NCgpOworICAgIHJldHVybiB2ODo6U3RyaW5nOjpOZXcoZW5jb2RlZFN0cmluZy50b0xh
dGluMSgpLmNvbnN0RGF0YSgpKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFF0UGl4bWFw
SW5zdGFuY2U6OnRvU3RyaW5nKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgUXRQ
aXhtYXBJbnN0YW5jZSogaW5zdGFuY2UgPSAKKyAgICAgICAgc3RhdGljX2Nhc3Q8UXRQaXhtYXBJ
bnN0YW5jZSo+KHY4OjpFeHRlcm5hbDo6VW53cmFwKGFyZ3MuSG9sZGVyKCktPkdldEludGVybmFs
RmllbGQoMCkpKTsKKyAgICBjb25zdCBRU3RyaW5nIHN0cmluZ1ZhbHVlID0gUVN0cmluZygiW1F0
IE5hdGl2ZSBQaXhtYXAgJTEsJTJdIikuYXJnKGluc3RhbmNlLT53aWR0aCgpKS5hcmcoaW5zdGFu
Y2UtPmhlaWdodCgpKTsKKyAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KHN0cmluZ1ZhbHVlLnRv
TGF0aW4xKCkuY29uc3REYXRhKCkpOworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gUXRQaXht
YXBJbnN0YW5jZTo6YXNzaWduVG9IVE1MSW1hZ2VFbGVtZW50KGNvbnN0IHY4OjpBcmd1bWVudHMm
IGFyZ3MpCit7CisgICAgUXRQaXhtYXBJbnN0YW5jZSogaW5zdGFuY2UgPSAKKyAgICAgICAgc3Rh
dGljX2Nhc3Q8UXRQaXhtYXBJbnN0YW5jZSo+KHY4OjpFeHRlcm5hbDo6VW53cmFwKGFyZ3MuSG9s
ZGVyKCktPkdldEludGVybmFsRmllbGQoMCkpKTsKKworICAgIGlmICghYXJncy5MZW5ndGgoKSkK
KyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gYXJnID0gYXJnc1swXTsKKyAgICBpZiAoIWFyZy0+SXNPYmplY3QoKSkKKyAgICAgICAgcmV0
dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIGlmICghVjhIVE1MSW1hZ2VFbGVtZW50OjpIYXNJ
bnN0YW5jZShhcmcpKSAKKyAgICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKyAgICAvLyB3
ZSBub3cga25vdyB0aGF0IHdlIGhhdmUgYSB2YWxpZCA8aW1nPiBlbGVtZW50IGFzIHRoZSBhcmd1
bWVudCwgd2UgY2FuIGF0dGFjaCB0aGUgcGl4bWFwIHRvIGl0LgorICAgIFBhc3NSZWZQdHI8U3Rp
bGxJbWFnZT4gc3RpbGxJbWFnZSA9IFdlYkNvcmU6OlN0aWxsSW1hZ2U6OmNyZWF0ZShpbnN0YW5j
ZS0+dG9QaXhtYXAoKSk7CisgICAgSFRNTEltYWdlRWxlbWVudCogaW1hZ2VFbGVtZW50ID0gVjhI
VE1MSW1hZ2VFbGVtZW50Ojp0b05hdGl2ZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+OjpDYXN0KGFy
ZykpOworCisgICAgaW1hZ2VFbGVtZW50LT5zZXRDYWNoZWRJbWFnZShuZXcgQ2FjaGVkSW1hZ2Uo
c3RpbGxJbWFnZS5nZXQoKSkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsID0g
aW5zdGFuY2UtPmNvbnRleHQoKS0+R2xvYmFsKCk7CisKKyAgICB0b1Y4KGltYWdlRWxlbWVudC0+
ZG9jdW1lbnQoKSk7CisgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKworfQorfQpJbmRl
eDogV2ViQ29yZS9icmlkZ2UvcXQvdjgvcXRfcGl4bWFwcnVudGltZXY4LmgNCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBXZWJDb3JlL2JyaWRnZS9xdC92OC9xdF9waXhtYXBydW50aW1ldjguaAkocmV2aXNpb24g
MCkNCisrKyBXZWJDb3JlL2JyaWRnZS9xdC92OC9xdF9waXhtYXBydW50aW1ldjguaAkocmV2aXNp
b24gMCkNCkBAIC0wLDAgKzEsNjEgQEANCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IE5va2lh
IENvcnBvcmF0aW9uIGFuZC9vciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqICBUaGlzIGxp
YnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisg
KiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1
YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAt
MTMwMSAgVVNBCisgKgorICovCisKKyNpZm5kZWYgcXRfcGl4bWFwcnVudGltZXY4X2gKKyNkZWZp
bmUgcXRfcGl4bWFwcnVudGltZXY4X2gKKworI2luY2x1ZGUgInY4LmgiCisjaW5jbHVkZSA8UVZh
cmlhbnQ+CisKK25hbWVzcGFjZSBWOCB7CituYW1lc3BhY2UgQmluZGluZ3MgeworCitjbGFzcyBR
dFBpeG1hcEluc3RhbmNlIHsKK3B1YmxpYzoKKyAgICBRdFBpeG1hcEluc3RhbmNlKHY4OjpIYW5k
bGU8djg6OkNvbnRleHQ+IGNvbnRleHQsIGNvbnN0IFFWYXJpYW50JiBkKTsKKworICAgIGludCB3
aWR0aCgpIGNvbnN0OworICAgIGludCBoZWlnaHQoKSBjb25zdDsKKyAgICBRUGl4bWFwIHRvUGl4
bWFwKCk7CisgICAgUUltYWdlIHRvSW1hZ2UoKTsKKworICAgIHN0YXRpYyBRdFBpeG1hcEluc3Rh
bmNlKiBjcmVhdGVSdW50aW1lT2JqZWN0KHY4OjpIYW5kbGU8djg6OkNvbnRleHQ+LCBjb25zdCBR
VmFyaWFudCYpOworICAgIHN0YXRpYyBRVmFyaWFudCB2YXJpYW50RnJvbU9iamVjdCh2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IG9iamVjdCwgUU1ldGFUeXBlOjpUeXBlIGhpbnQpOworICAgIHN0YXRp
YyBib29sIGNhbkhhbmRsZShRTWV0YVR5cGU6OlR5cGUgaGludCk7CisgICAgc3RhdGljIHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBoZWlnaHRHZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3Bu
YW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKTsKKyAgICBzdGF0aWMgdm9pZCBoZWln
aHRTZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHByb3BuYW1lLCB2ODo6TG9jYWw8djg6OlZh
bHVlPiB2YWx1ZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbyk7CisgICAgc3RhdGljIHY4
OjpIYW5kbGU8djg6OlZhbHVlPiB3aWR0aEdldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJv
cG5hbWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pOworICAgIHN0YXRpYyB2b2lkIHdp
ZHRoU2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wbmFtZSwgdjg6OkxvY2FsPHY4OjpW
YWx1ZT4gdmFsdWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pOworCisgICAgc3RhdGlj
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0b0RhdGFVcmwoY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJn
cyk7CisgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0b1N0cmluZyhjb25zdCB2ODo6
QXJndW1lbnRzJiBhcmdzKTsKKyAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFzc2ln
blRvSFRNTEltYWdlRWxlbWVudChjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKTsKKyAgICB2ODo6
SGFuZGxlPHY4OjpPYmplY3Q+IGdldFY4T2JqZWN0KCkgeyByZXR1cm4gbV92OE9iajsgfQorICAg
IHZvaWQgc2V0VjhPYmplY3Qodjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gb2JqKSB7IG1fdjhP
YmogPSBvYmo7IH0KKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gY29udGV4dCgpIHsg
cmV0dXJuIG1fY29udGV4dDsgfQorcHJpdmF0ZToKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6Q29u
dGV4dD4gbV9jb250ZXh0OworICAgIFFWYXJpYW50IG1fZGF0YTsKKyAgICB2ODo6UGVyc2lzdGVu
dDx2ODo6T2JqZWN0PiBtX3Y4T2JqOworfTsKKworfQorCit9CisjZW5kaWYKSW5kZXg6IFdlYkNv
cmUvYnJpZGdlL3F0L3Y4L3F0X3J1bnRpbWV2OC5jcHANCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0tLSBXZWJDb3Jl
L2JyaWRnZS9xdC92OC9xdF9ydW50aW1ldjguY3BwCShyZXZpc2lvbiAwKQ0KKysrIFdlYkNvcmUv
YnJpZGdlL3F0L3Y4L3F0X3J1bnRpbWV2OC5jcHAJKHJldmlzaW9uIDApDQpAQCAtMCwwICsxLDE2
OTYgQEANCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IE5va2lhIENvcnBvcmF0aW9uIGFuZC9v
ciBpdHMgc3Vic2lkaWFyeSgtaWVzKQorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExl
c3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMKKyAqICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRl
IHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJxdF9ydW50aW1ldjguaCIKKworI2lu
Y2x1ZGUgIkN1cnJlbnRUaW1lLmgiCisjaW5jbHVkZSAiRGF0ZU1hdGguaCIKKyNpbmNsdWRlICJW
OERPTVdpbmRvdy5oIgorI2luY2x1ZGUgIlY4RG9jdW1lbnQuaCIKKyNpbmNsdWRlICJWOEVsZW1l
bnQuaCIKKyNpbmNsdWRlICJWOEhUTUxFbGVtZW50LmgiCisjaW5jbHVkZSAiVjhQcm94eS5oIgor
I2luY2x1ZGUgInFkYXRldGltZS5oIgorI2luY2x1ZGUgInFkZWJ1Zy5oIgorI2luY2x1ZGUgInFt
ZXRhb2JqZWN0LmgiCisjaW5jbHVkZSAicW1ldGF0eXBlLmgiCisjaW5jbHVkZSAicW9iamVjdC5o
IgorI2luY2x1ZGUgInFzdHJpbmdsaXN0LmgiCisjaW5jbHVkZSAicXRfcGl4bWFwcnVudGltZXY4
LmgiCisjaW5jbHVkZSAicXZhcmxlbmd0aGFycmF5LmgiCisjaW5jbHVkZSA8bGltaXRzLmg+CisK
K1FTdHJpbmcgVjhUb1FTdHJpbmcodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHY4c3RyKTsKKwordXNp
bmcgbmFtZXNwYWNlIFdlYkNvcmU7Cit1c2luZyBuYW1lc3BhY2UgV1RGOworCituYW1lc3BhY2Ug
VjggeworbmFtZXNwYWNlIEJpbmRpbmdzIHsKKworLy8gRGVidWdnaW5nCisvLyAjZGVmaW5lIFFU
V0tfUlVOVElNRV9DT05WRVJTSU9OX0RFQlVHCisvLyAjZGVmaW5lIFFUV0tfUlVOVElNRV9NQVRD
SF9ERUJVRworCitjbGFzcyBRV0tOb0RlYnVnIHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgUVdLTm9E
ZWJ1ZygpIHt9CisgICAgaW5saW5lIH5RV0tOb0RlYnVnKCkge30KKworICAgIHRlbXBsYXRlPHR5
cGVuYW1lIFQ+CisgICAgaW5saW5lIFFXS05vRGVidWcgJm9wZXJhdG9yPDwoY29uc3QgVCAmKSB7
IHJldHVybiAqdGhpczsgfQorfTsKKworI2lmZGVmIFFUV0tfUlVOVElNRV9DT05WRVJTSU9OX0RF
QlVHCisjZGVmaW5lIHFDb252RGVidWcoKSBxRGVidWcoKQorI2Vsc2UKKyNkZWZpbmUgcUNvbnZE
ZWJ1ZygpIFFXS05vRGVidWcoKQorI2VuZGlmCisKKyNpZmRlZiBRVFdLX1JVTlRJTUVfTUFUQ0hf
REVCVUcKKyNkZWZpbmUgcU1hdGNoRGVidWcoKSBxRGVidWcoKQorI2Vsc2UKKyNkZWZpbmUgcU1h
dGNoRGVidWcoKSBRV0tOb0RlYnVnKCkKKyNlbmRpZgorCit0eXBlZGVmIGVudW0geworICAgIFZh
cmlhbnQgPSAwLAorICAgIE51bWJlciwKKyAgICBCb29sZWFuLAorICAgIFN0cmluZywKKyAgICBE
YXRlLAorICAgIFJlZ0V4cCwKKyAgICBBcnJheSwKKyAgICBRT2JqLAorICAgIE9iamVjdCwKKyAg
ICBOdWxsLAorICAgIEpTQnl0ZUFycmF5Cit9IEpTUmVhbFR5cGU7CisKKyNpZiBkZWZpbmVkKFFU
V0tfUlVOVElNRV9DT05WRVJTSU9OX0RFQlVHKSB8fCBkZWZpbmVkKFFUV0tfUlVOVElNRV9NQVRD
SF9ERUJVRykKK1FEZWJ1ZyBvcGVyYXRvcjw8KFFEZWJ1ZyBkYmcsIGNvbnN0IEpTUmVhbFR5cGUg
JmMpCit7CisgICAgIGNvbnN0IGNoYXIgKm1hcFtdID0geyAiVmFyaWFudCIsICJOdW1iZXIiLCAi
Qm9vbGVhbiIsICJTdHJpbmciLCAiRGF0ZSIsCisgICAgICAgICAiUmVnRXhwIiwgIkFycmF5Iiwg
IlJUT2JqZWN0IiwgIk9iamVjdCIsICJOdWxsIn07CisKKyAgICAgZGJnLm5vc3BhY2UoKSA8PCAi
SlNUeXBlKCIgPDwgKChpbnQpYykgPDwgIiwgIiA8PCAgbWFwW2NdIDw8ICIpIjsKKworICAgICBy
ZXR1cm4gZGJnLnNwYWNlKCk7Cit9CisjZW5kaWYKKworCisvLyB0aGlzIGlzIGhlcmUgYXMgYSBw
cm94eSwgc28gd2UnZCBoYXZlIGEgY2xhc3MgdG8gZnJpZW5kIGluIFFXZWJFbGVtZW50LAorLy8g
YXMgZ2V0dGluZy9zZXR0aW5nIGEgV2ViQ29yZSBpbiBRV2ViRWxlbWVudCBpcyBwcml2YXRlCitj
bGFzcyBRdFdlYkVsZW1lbnRSdW50aW1lIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgUVdlYkVsZW1l
bnQgY3JlYXRlKEVsZW1lbnQqIGVsZW1lbnQpCisgICAgeworICAgICAgICByZXR1cm4gUVdlYkVs
ZW1lbnQoZWxlbWVudCk7CisgICAgfQorCisgICAgc3RhdGljIEVsZW1lbnQqIGdldChjb25zdCBR
V2ViRWxlbWVudCYgZWxlbWVudCkKKyAgICB7CisgICAgICAgIHJldHVybiBlbGVtZW50Lm1fZWxl
bWVudDsKKyAgICB9Cit9OworCitRU3RyaW5nIFY4VG9RU3RyaW5nKHY4OjpMb2NhbDx2ODo6U3Ry
aW5nPiB2OHN0cikgCit7CisgICAgUVN0cmluZyBxc3RyOworICAgIGlmICh2OHN0ci5Jc0VtcHR5
KCkpCisgICAgICAgIHJldHVybiBRU3RyaW5nKCk7CisgICAgcXN0ci5yZXNpemUodjhzdHItPkxl
bmd0aCgpKTsKKyAgICB2OHN0ci0+V3JpdGUocmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KHFz
dHIuZGF0YSgpKSk7CisgICAgcmV0dXJuIHFzdHI7Cit9CisKK3N0YXRpYyBib29sIElzUnVudGlt
ZU9iamVjdCh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iaikKK3sKKyAgICBpZiAob2JqLT5Jc09i
amVjdCgpKSB7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWwgPSBvYmotPkdldEhp
ZGRlblZhbHVlKHY4OjpTdHJpbmc6Ok5ldygiX19xdF9oaWRkZW5fbWFya2VyX18iKSk7CisgICAg
ICAgIHJldHVybiAhdmFsLklzRW1wdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQor
CitzdGF0aWMgSlNSZWFsVHlwZSB2YWx1ZVJlYWxUeXBlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2
YWwpCit7CisgICAgaWYgKHZhbC0+SXNOdW1iZXIoKSkKKyAgICAgICAgcmV0dXJuIE51bWJlcjsK
KyAgICBpZiAodmFsLT5Jc1N0cmluZygpKQorICAgICAgICByZXR1cm4gU3RyaW5nOworICAgIGlm
ICh2YWwtPklzQm9vbGVhbigpKQorICAgICAgICByZXR1cm4gQm9vbGVhbjsKKyAgICBpZiAodmFs
LT5Jc051bGwoKSkKKyAgICAgICAgcmV0dXJuIE51bGw7CisgICAgaWYgKHZhbC0+SXNBcnJheSgp
KQorICAgICAgICByZXR1cm4gQXJyYXk7CisgICAgaWYgKHZhbC0+SXNEYXRlKCkpCisgICAgICAg
IHJldHVybiBEYXRlOworICAgIGlmICh2YWwtPklzUmVnRXhwKCkpCisgICAgICAgIHJldHVybiBS
ZWdFeHA7CisgICAgaWYgKHZhbC0+SXNPYmplY3QoKSkgeyAKKyAgICAgICAgLy8gY2FzdCB2YWx1
ZSB0byBvYmplY3QKKyAgICAgICAgaWYgKElzUnVudGltZU9iamVjdCh2YWwtPlRvT2JqZWN0KCkp
KQorICAgICAgICAgICAgcmV0dXJuIFFPYmo7CisgICAgICAgIC8vIENoZWNrIGlmIHY4Ojp2YWx1
ZSBob2xkcyBRTWV0YVR5cGU6OlFCeXRlQXJyYXkKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IHJlc3VsdCA9IHZhbC0+VG9PYmplY3QoKS0+R2V0SGlkZGVuVmFsdWUodjg6OlN0cmluZzo6
TmV3KCJfX3F0X21ldGFfdHlwZV9fIikpOworICAgICAgICBpZiAoIXJlc3VsdC5Jc0VtcHR5KCkp
CisgICAgICAgICAgICByZXR1cm4gSlNCeXRlQXJyYXk7CisgICAgICAgIHJldHVybiBPYmplY3Q7
CisgICAgfQorICAgIHJldHVybiBTdHJpbmc7IC8vIEkgZG9uJ3Qga25vdy4KK30KKworUVZhcmlh
bnQgY29udmVydFZhbHVlVG9RVmFyaWFudCh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUsIFFN
ZXRhVHlwZTo6VHlwZSBoaW50LCBpbnQgKmRpc3RhbmNlLCBIYXNoU2V0PGludD4qIHZpc2l0ZWRP
YmplY3RzKQoreworICAgIGlmICh2YWx1ZS5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBRVmFy
aWFudCgpOworCisgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBvYmplY3Q7CisgICAgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IHZhbHVlb2Y7CisKKyAgICBpZiAodmFsdWUtPklzT2JqZWN0KCkpIHsK
KyAgICAgICAgb2JqZWN0ID0gdmFsdWUtPlRvT2JqZWN0KCk7CisgICAgICAgIGlmICh2aXNpdGVk
T2JqZWN0cy0+Y29udGFpbnMob2JqZWN0LT5HZXRJZGVudGl0eUhhc2goKSkpCisgICAgICAgICAg
ICByZXR1cm4gUVZhcmlhbnQoKTsKKyAgICAgICAgdmlzaXRlZE9iamVjdHMtPmFkZChvYmplY3Qt
PkdldElkZW50aXR5SGFzaCgpKTsKKyAgICB9IGVsc2UgaWYgKHZhbHVlLT5Jc051bWJlcigpICYm
IGlzbmFuKHZhbHVlLT5Ub051bWJlcigpLT5WYWx1ZSgpKQorICAgICAgICB8fCAodmFsdWUtPklz
VW5kZWZpbmVkKCkKKyAgICAgICAgICAgICYmIGhpbnQgIT0gUU1ldGFUeXBlOjpRU3RyaW5nCisg
ICAgICAgICAgICAmJiBoaW50ICE9IChRTWV0YVR5cGU6OlR5cGUpIHFNZXRhVHlwZUlkPFFWYXJp
YW50PigpKSkgeworICAgICAgICBpZiAoZGlzdGFuY2UpCisgICAgICAgICAgICAqZGlzdGFuY2Ug
PSAtMTsKKyAgICAgICAgcmV0dXJuIFFWYXJpYW50KCk7CisgICAgfQorICAgIEpTUmVhbFR5cGUg
dHlwZSA9IHZhbHVlUmVhbFR5cGUodmFsdWUpOworICAgIGlmIChoaW50ID09IFFNZXRhVHlwZTo6
Vm9pZCkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgY2FzZSBOdW1iZXI6Cisg
ICAgICAgICAgICBoaW50ID0gUU1ldGFUeXBlOjpEb3VibGU7CisgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgY2FzZSBCb29sZWFuOgorICAgICAgICAgICAgaGludCA9IFFNZXRhVHlwZTo6Qm9v
bDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0cmluZzoKKyAgICAgICAgZGVm
YXVsdDoKKyAgICAgICAgICAgIGhpbnQgPSBRTWV0YVR5cGU6OlFTdHJpbmc7CisgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgY2FzZSBEYXRlOgorICAgICAgICAgICAgaGludCA9IFFNZXRhVHlw
ZTo6UURhdGVUaW1lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUmVnRXhwOgor
ICAgICAgICAgICAgaGludCA9IFFNZXRhVHlwZTo6UVJlZ0V4cDsKKyAgICAgICAgICAgIGJyZWFr
OworICAgICAgICBjYXNlIE9iamVjdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgIHZhbHVl
b2YgPSBvYmplY3QtPkdldCh2ODo6U3RyaW5nOjpOZXcoInZhbHVlT2YiKSk7CisgICAgICAgICAg
ICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gcmV0dmFsdWU7CisgICAgICAgICAgICBpZiAoIXZhbHVl
b2YuSXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsdWUgPSB2YWx1ZW9mLkFzPHY4
OjpGdW5jdGlvbj4oKS0+Q2FsbChvYmplY3QsIDAsIDApOworICAgICAgICAgICAgICAgIGlmIChy
ZXR2YWx1ZS0+SXNCb29sZWFuKCkpCisgICAgICAgICAgICAgICAgICAgIGhpbnQgPSBRTWV0YVR5
cGU6OkJvb2w7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocmV0dmFsdWUtPklzTnVtYmVyKCkp
CisgICAgICAgICAgICAgICAgICAgIGhpbnQgPSBRTWV0YVR5cGU6OkRvdWJsZTsKKyAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIGhpbnQgPSBRTWV0YVR5cGU6OlFWYXJp
YW50TWFwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaGludCA9IFFNZXRhVHlwZTo6UVZhcmlhbnRNYXA7CisgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBRT2JqOgorICAgICAgICAgICAgaGludCA9IFFNZXRh
VHlwZTo6UU9iamVjdFN0YXI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBKU0J5
dGVBcnJheToKKyAgICAgICAgICAgIGhpbnQgPSBRTWV0YVR5cGU6OlFCeXRlQXJyYXk7CisgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBcnJheToKKyAgICAgICAgICAgIGhpbnQgPSBR
TWV0YVR5cGU6OlFWYXJpYW50TGlzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgfQorICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkKKyAgICAgICAgJiYgaGludCAhPSBRTWV0YVR5
cGU6OlFPYmplY3RTdGFyCisgICAgICAgICYmIGhpbnQgIT0gUU1ldGFUeXBlOjpWb2lkU3Rhcgor
ICAgICAgICAmJiBoaW50ICE9IFFNZXRhVHlwZTo6UVN0cmluZworICAgICAgICAmJiBoaW50ICE9
IChRTWV0YVR5cGU6OlR5cGUpIHFNZXRhVHlwZUlkPFFWYXJpYW50PigpCisgICAgICAgICYmIGhp
bnQgIT0gKFFNZXRhVHlwZTo6VHlwZSkgcU1ldGFUeXBlSWQ8UVdlYkVsZW1lbnQ+KCkpIHsKKyAg
ICAgICAgaWYgKGRpc3RhbmNlKQorICAgICAgICAgICAgKmRpc3RhbmNlID0gLTE7CisgICAgICAg
IHJldHVybiBRVmFyaWFudCgpOworICAgIH0KKworICAgIFFWYXJpYW50IHJldDsKKyAgICBpbnQg
ZGlzdCA9IC0xOworICAgIHN3aXRjaCAoaGludCkgeworICAgIGNhc2UgUU1ldGFUeXBlOjpCb29s
OgorICAgICAgICB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBPYmplY3QpIHsKKyAgICAgICAg
ICAgICAgICAvLyBTdG9yZSB0aGUgdmFsdWVPZiBhcyBnbG9iYWwgYm9vbGVhbiBoZWxwZXIgZnVu
Y3Rpb24uLi4KKyAgICAgICAgICAgICAgICB2YWx1ZW9mID0gb2JqZWN0LT5HZXQodjg6OlN0cmlu
Zzo6TmV3KCJ2YWx1ZU9mIikpOworICAgICAgICAgICAgICAgIGlmICghdmFsdWVvZi5Jc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGJvb2xWYWx1
ZSA9IHZhbHVlb2YuQXM8djg6OkZ1bmN0aW9uPigpLT5DYWxsKG9iamVjdCwgMCwgMCk7CisgICAg
ICAgICAgICAgICAgICAgIHJldCA9IFFWYXJpYW50KGJvb2xWYWx1ZS0+Qm9vbGVhblZhbHVlKCkp
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSAKKyAgICAgICAgICAgICAg
ICByZXQgPSBRVmFyaWFudCh2YWx1ZS0+VG9Cb29sZWFuKCktPlZhbHVlKCkpOworCisgICAgICAg
ICAgICBpZiAodHlwZSA9PSBCb29sZWFuKQorICAgICAgICAgICAgICAgIGRpc3QgPSAwOworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRpc3QgPSAxMDsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFFNZXRhVHlwZTo6SW50OgorICAgIGNhc2UgUU1l
dGFUeXBlOjpVSW50OgorICAgIGNhc2UgUU1ldGFUeXBlOjpMb25nOgorICAgIGNhc2UgUU1ldGFU
eXBlOjpVTG9uZzoKKyAgICBjYXNlIFFNZXRhVHlwZTo6TG9uZ0xvbmc6CisgICAgY2FzZSBRTWV0
YVR5cGU6OlVMb25nTG9uZzoKKyAgICBjYXNlIFFNZXRhVHlwZTo6U2hvcnQ6CisgICAgY2FzZSBR
TWV0YVR5cGU6OlVTaG9ydDoKKyAgICBjYXNlIFFNZXRhVHlwZTo6RmxvYXQ6CisgICAgY2FzZSBR
TWV0YVR5cGU6OkRvdWJsZToKKyAgICAgICAgaWYgKHR5cGUgIT0gUU9iaikgeworICAgICAgICAg
ICAgcmV0ID0gUVZhcmlhbnQodmFsdWUtPlRvTnVtYmVyKCktPlZhbHVlKCkpOworICAgICAgICAg
ICAgcmV0LmNvbnZlcnQoKFFWYXJpYW50OjpUeXBlKWhpbnQpOworICAgICAgICB9IAorCisgICAg
ICAgIGlmICh0eXBlID09IE51bWJlcikgeworICAgICAgICAgICAgc3dpdGNoIChoaW50KSB7Cisg
ICAgICAgICAgICBjYXNlIFFNZXRhVHlwZTo6RG91YmxlOgorICAgICAgICAgICAgICAgIGRpc3Qg
PSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRTWV0YVR5cGU6
OkZsb2F0OgorICAgICAgICAgICAgICAgIGRpc3QgPSAxOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgY2FzZSBRTWV0YVR5cGU6OkxvbmdMb25nOgorICAgICAgICAgICAgY2Fz
ZSBRTWV0YVR5cGU6OlVMb25nTG9uZzoKKyAgICAgICAgICAgICAgICBkaXN0ID0gMjsKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUU1ldGFUeXBlOjpMb25nOgorICAg
ICAgICAgICAgY2FzZSBRTWV0YVR5cGU6OlVMb25nOgorICAgICAgICAgICAgICAgIGRpc3QgPSAz
OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRTWV0YVR5cGU6Oklu
dDoKKyAgICAgICAgICAgIGNhc2UgUU1ldGFUeXBlOjpVSW50OgorICAgICAgICAgICAgICAgIGRp
c3QgPSA0OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRTWV0YVR5
cGU6OlNob3J0OgorICAgICAgICAgICAgY2FzZSBRTWV0YVR5cGU6OlVTaG9ydDoKKyAgICAgICAg
ICAgICAgICBkaXN0ID0gNTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRl
ZmF1bHQ6CisgICAgICAgICAgICAgICAgZGlzdCA9IDEwOworICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGlzdCA9IDEw
OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBRTWV0YVR5cGU6OlFDaGFy
OgorICAgICAgICBpZiAodHlwZSA9PSBOdW1iZXIgfHwgdHlwZSA9PSBCb29sZWFuKSB7CisgICAg
ICAgICAgICByZXQgPSBRVmFyaWFudChRQ2hhcigodXNob3J0KXZhbHVlLT5Ub051bWJlcigpLT5W
YWx1ZSgpKSk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBCb29sZWFuKQorICAgICAgICAgICAg
ICAgIGRpc3QgPSAzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIGRpc3QgPSA2
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHR5cGUgIT0gUU9iaiAmJiB0eXBl
ICE9IE9iamVjdCkKKyAgICAgICAgICAgICAgICByZXQgPSBRVmFyaWFudChWOFRvUVN0cmluZyh2
YWx1ZS0+VG9TdHJpbmcoKSkpOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gU3RyaW5nKQorICAg
ICAgICAgICAgICAgIGRpc3QgPSAzOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAg
IGRpc3QgPSAxMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgUU1ldGFU
eXBlOjpRU3RyaW5nOiB7CisgICAgICAgIGlmICh2YWx1ZS0+SXNOdWxsKCkgfHwgdmFsdWUtPklz
VW5kZWZpbmVkKCkpIHsKKyAgICAgICAgICAgIGlmIChkaXN0YW5jZSkKKyAgICAgICAgICAgICAg
ICAqZGlzdGFuY2UgPSAxOworICAgICAgICAgICAgcmV0dXJuIFFTdHJpbmcoKTsKKyAgICAgICAg
fQorICAgICAgICBpZiAodHlwZSAhPSBRT2JqICYmIHR5cGUgIT0gT2JqZWN0KQorICAgICAgICAg
ICAgcmV0ID0gUVZhcmlhbnQoVjhUb1FTdHJpbmcodmFsdWUtPlRvU3RyaW5nKCkpKTsKKyAgICAg
ICAgaWYgKHR5cGUgPT0gU3RyaW5nKQorICAgICAgICAgICAgZGlzdCA9IDA7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIGRpc3QgPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAg
Y2FzZSBRTWV0YVR5cGU6OlFWYXJpYW50TWFwOiAKKyAgICAgICAgeworICAgICAgICAgICAgaWYg
KHR5cGUgPT0gT2JqZWN0IHx8IHR5cGUgPT0gQXJyYXkpIHsKKyAgICAgICAgICAgICAgICBRVmFy
aWFudE1hcCByZXN1bHQ7CisgICAgICAgICAgICAgICAgaW50IG9iamRpc3QgPSAwOworICAgICAg
ICAgICAgICAgIC8vIEdldCBvYmplY3QgcHJvcGVydHkgbmFtZXMuIFNoYWxsb3cgY29weSBkaWRu
dCB3b3JrLi4uCisgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IHByb3BlcnR5
TmFtZXMgPSBvYmplY3QtPkdldFByb3BlcnR5TmFtZXMoKTsKKworICAgICAgICAgICAgICAgIGZv
ciAoaW50IGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy0+TGVuZ3RoKCk7ICsraSkgeworICAgICAg
ICAgICAgICAgICAgICAvLyBHZXQgcHJvcGVydHkgbmFtZSAtIGVpdGhlciByZWFsIG5hbWUgb3Ig
YXJyYXkgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gcHJv
cGVydHlOYW1lID0gcHJvcGVydHlOYW1lcy0+R2V0KHY4OjpJbnRlZ2VyOjpOZXcoaSkpOworICAg
ICAgICAgICAgICAgICAgICB2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSA9IHByb3BlcnR5TmFt
ZS0+VG9TdHJpbmcoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoKHByb3BlcnR5TmFtZS0+
SXNTdHJpbmcoKSAmJiBvYmplY3QtPkhhc1JlYWxOYW1lZFByb3BlcnR5KG5hbWUpKSAKKyAgICAg
ICAgICAgICAgICAgICAgICAgfHwgKHByb3BlcnR5TmFtZS0+SXNJbnQzMigpICYmIG9iamVjdC0+
SGFzUmVhbEluZGV4ZWRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUtPlVpbnQzMlZhbHVlKCkpKSkgewor
CisgICAgICAgICAgICAgICAgICAgICAgICBRVmFyaWFudCB2ID0gY29udmVydFZhbHVlVG9RVmFy
aWFudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3QtPkdldChwcm9wZXJ0eU5h
bWUpLCBRTWV0YVR5cGU6OlZvaWQsICZvYmpkaXN0LCB2aXNpdGVkT2JqZWN0cyk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBpZiAob2JqZGlzdCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgUVN0cmluZyBpZCA9IFY4VG9RU3RyaW5nKG5hbWUpOworICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHJlc3VsdC5pbnNlcnQoaWQsIHYpOworICAgICAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgICAgICB9IAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBkaXN0ID0gMTsKKyAgICAgICAgICAgICAgICByZXQgPSBRVmFyaWFudChyZXN1bHQp
OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBR
TWV0YVR5cGU6OlFWYXJpYW50TGlzdDoKKworICAgICAgICBpZiAodHlwZSA9PSBBcnJheSkgewor
ICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IGFyciA9IHZhbHVlLkFzPHY4OjpBcnJh
eT4oKTsKKworICAgICAgICAgICAgUVZhcmlhbnRMaXN0IHJlc3VsdDsKKyAgICAgICAgICAgIGlu
dCBsZW4gPSBhcnItPkxlbmd0aCgpOworICAgICAgICAgICAgaW50IG9iamRpc3QgPSAwOworICAg
ICAgICAgICAgcUNvbnZEZWJ1ZygpIDw8ICJjb252ZXJ0aW5nIGEgIiA8PCBsZW4gPDwgIiBsZW5n
dGggQXJyYXkiOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgewor
ICAgICAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWwgPSBhcnItPkdldChpKTsK
KyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGNvbnZlcnRWYWx1ZVRvUVZhcmlhbnQodmFs
LCBRTWV0YVR5cGU6OlZvaWQsICZvYmpkaXN0LCB2aXNpdGVkT2JqZWN0cykpOworICAgICAgICAg
ICAgICAgIGlmIChvYmpkaXN0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHFDb252RGVi
dWcoKSA8PCAiRmFpbGVkIGNvbnZlcnRpbmcgZWxlbWVudCBhdCBpbmRleCAiIDw8IGk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBGYWlsZWQgY29udmVydGluZyBhIGxpc3QgZW50cnks
IHNvIGZhaWwgdGhlIGFycmF5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg
ICAgICAgICAgaWYgKG9iamRpc3QgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBkaXN0ID0gNTsK
KyAgICAgICAgICAgICAgICByZXQgPSBRVmFyaWFudChyZXN1bHQpOworICAgICAgICAgICAgfQor
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTWFrZSBhIHNpbmdsZSBsZW5ndGggYXJy
YXkKKyAgICAgICAgICAgIGludCBvYmpkaXN0OworICAgICAgICAgICAgcUNvbnZEZWJ1ZygpIDw8
ICJtYWtpbmcgYSBzaW5nbGUgbGVuZ3RoIHZhcmlhbnRsaXN0IjsKKyAgICAgICAgICAgIFFWYXJp
YW50IHZhciA9IGNvbnZlcnRWYWx1ZVRvUVZhcmlhbnQodmFsdWUsIFFNZXRhVHlwZTo6Vm9pZCwg
Jm9iamRpc3QsIHZpc2l0ZWRPYmplY3RzKTsKKyAgICAgICAgICAgIGlmIChvYmpkaXN0ICE9IC0x
KSB7CisgICAgICAgICAgICAgICAgUVZhcmlhbnRMaXN0IHJlc3VsdDsKKyAgICAgICAgICAgICAg
ICByZXN1bHQgPDwgdmFyOworICAgICAgICAgICAgICAgIHJldCA9IFFWYXJpYW50KHJlc3VsdCk7
CisgICAgICAgICAgICAgICAgZGlzdCA9IDEwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgICAgICBxQ29udkRlYnVnKCkgPDwgImZhaWxlZCBtYWtpbmcgc2luZ2xlIGxlbmd0aCB2
YXJsaXN0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAg
IGNhc2UgUU1ldGFUeXBlOjpRU3RyaW5nTGlzdDogeworCisgICAgICAgIGlmICh0eXBlID09IEFy
cmF5KSB7CisgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpBcnJheT4gYXJyID0gdmFsdWUuQXM8
djg6OkFycmF5PigpOworCisgICAgICAgICAgICBRU3RyaW5nTGlzdCByZXN1bHQ7CisgICAgICAg
ICAgICBpbnQgbGVuID0gYXJyLT5MZW5ndGgoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4g
dmFsID0gYXJyLT5HZXQoaSk7CisgICAgICAgICAgICAgICAgUVN0cmluZyBxc3RyaW5nID0gVjhU
b1FTdHJpbmcodmFsLT5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5k
KHFzdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGlzdCA9IDU7CisgICAgICAg
ICAgICByZXQgPSBRVmFyaWFudChyZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgLy8gTWFrZSBhIHNpbmdsZSBsZW5ndGggYXJyYXkKKyAgICAgICAgICAgIGlmICh0eXBlICE9
IFFPYmogJiYgdHlwZSAhPSBPYmplY3QpIHsKKyAgICAgICAgICAgICAgICBRU3RyaW5nIHFzdHJp
bmcgPSBWOFRvUVN0cmluZyh2YWx1ZS0+VG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgUVN0
cmluZ0xpc3QgcmVzdWx0OworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocXN0cmluZyk7
CisgICAgICAgICAgICAgICAgcmV0ID0gUVZhcmlhbnQocmVzdWx0KTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGRpc3QgPSAxMDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9
CisKKyAgICBjYXNlIFFNZXRhVHlwZTo6UUJ5dGVBcnJheTogeworICAgICAgICAKKyAgICAgICAg
aWYgKHR5cGUgPT0gSlNCeXRlQXJyYXkpIHsKKyAgICAgICAgICAgIC8vIGludGVybmFsIGZpbGVk
IDAgaG9sZCB0aGUgcG9pbnRlcgorICAgICAgICAgICAgY29uc3QgY2hhciogYXJyID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgY2hhcio+KHY4OjpFeHRlcm5hbDo6VW53cmFwKHZhbHVlLT5Ub09iamVjdCgp
LT5HZXRJbnRlcm5hbEZpZWxkKDApKSk7CisgICAgICAgICAgICAvLyBpbnRlcm5hbCBmaWxlZCAx
IGhvbGRzIGFycmF5IGxlbmd0aAorICAgICAgICAgICAgaW50IGxlbiA9IHJlaW50ZXJwcmV0X2Nh
c3Q8aW50Pih2ODo6RXh0ZXJuYWw6OlVud3JhcCh2YWx1ZS0+VG9PYmplY3QoKS0+R2V0SW50ZXJu
YWxGaWVsZCgxKSkpOworICAgICAgICAgICAgcmV0ID0gUVZhcmlhbnQoUUJ5dGVBcnJheShyZWlu
dGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihhcnIpLCBsZW4pKTsKKyAgICAgICAgICAgIGRpc3Qg
PSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUVN0cmluZyBxc3RyaW5nID0gVjhU
b1FTdHJpbmcodmFsdWUtPlRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0ID0gUVZhcmlhbnQo
cXN0cmluZyk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBTdHJpbmcpCisgICAgICAgICAgICAg
ICAgZGlzdCA9IDU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZGlzdCA9IDEw
OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgUU1ldGFUeXBl
OjpRRGF0ZVRpbWU6CisgICAgY2FzZSBRTWV0YVR5cGU6OlFEYXRlOgorICAgIGNhc2UgUU1ldGFU
eXBlOjpRVGltZToKKyAgICAgICAgaWYgKHR5cGUgPT0gRGF0ZSkgeworICAgICAgICAgICAgdjg6
OkhhbmRsZTx2ODo6RGF0ZT4gZGF0ZSA9IHY4OjpIYW5kbGU8djg6OkRhdGU+OjpDYXN0KHZhbHVl
KTsKKyAgICAgICAgICAgIEdyZWdvcmlhbkRhdGVUaW1lIGdkdDsKKyAgICAgICAgICAgIG1zVG9H
cmVnb3JpYW5EYXRlVGltZShWOFByb3h5OjpjdXJyZW50Q29udGV4dCgpLCBkYXRlLT5OdW1iZXJW
YWx1ZSgpLCB0cnVlLCBnZHQpOworICAgICAgICAgICAgaWYgKGhpbnQgPT0gUU1ldGFUeXBlOjpR
RGF0ZVRpbWUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBRRGF0ZVRpbWUoUURhdGUoZ2R0Lnll
YXIgKyAxOTAwLCBnZHQubW9udGggKyAxLCBnZHQubW9udGhEYXkpLCBRVGltZShnZHQuaG91ciwg
Z2R0Lm1pbnV0ZSwgZ2R0LnNlY29uZCksIFF0OjpVVEMpOworICAgICAgICAgICAgICAgIGRpc3Qg
PSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChoaW50ID09IFFNZXRhVHlwZTo6UURhdGUpIHsK
KyAgICAgICAgICAgICAgICByZXQgPSBRRGF0ZShnZHQueWVhciArIDE5MDAsIGdkdC5tb250aCAr
IDEsIGdkdC5tb250aERheSk7CisgICAgICAgICAgICAgICAgZGlzdCA9IDE7CisgICAgICAgICAg
ICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldCA9IFFUaW1lKGdkdC5ob3VyICsgMTkwMCwg
Z2R0Lm1pbnV0ZSwgZ2R0LnNlY29uZCk7CisgICAgICAgICAgICAgICAgZGlzdCA9IDI7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBOdW1iZXIpIHsKKyAgICAgICAg
ICAgIGRvdWJsZSBiID0gdmFsdWUtPlRvTnVtYmVyKCktPlZhbHVlKCk7CisgICAgICAgICAgICBH
cmVnb3JpYW5EYXRlVGltZSBnZHQ7CisgICAgICAgICAgICBtc1RvR3JlZ29yaWFuRGF0ZVRpbWUo
VjhQcm94eTo6Y3VycmVudENvbnRleHQoKSwgYiwgdHJ1ZSwgZ2R0KTsKKyAgICAgICAgICAgIGlm
IChoaW50ID09IFFNZXRhVHlwZTo6UURhdGVUaW1lKSB7CisgICAgICAgICAgICAgICAgcmV0ID0g
UURhdGVUaW1lKFFEYXRlKGdkdC55ZWFyICsgMTkwMCwgZ2R0Lm1vbnRoICsgMSwgZ2R0Lm1vbnRo
RGF5KSwgUVRpbWUoZ2R0LmhvdXIsIGdkdC5taW51dGUsIGdkdC5zZWNvbmQpLCBRdDo6VVRDKTsK
KyAgICAgICAgICAgICAgICBkaXN0ID0gNjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaGludCA9
PSBRTWV0YVR5cGU6OlFEYXRlKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gUURhdGUoZ2R0Lnll
YXIgKyAxOTAwLCBnZHQubW9udGggKyAxLCBnZHQubW9udGhEYXkpOworICAgICAgICAgICAgICAg
IGRpc3QgPSA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSBR
VGltZShnZHQuaG91ciwgZ2R0Lm1pbnV0ZSwgZ2R0LnNlY29uZCk7CisgICAgICAgICAgICAgICAg
ZGlzdCA9IDEwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gU3Ry
aW5nKSB7CisKKyAgICAgICAgICAgIFFTdHJpbmcgcXN0cmluZyA9IFY4VG9RU3RyaW5nKHZhbHVl
LT5Ub1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChoaW50ID09IFFNZXRhVHlwZTo6UURhdGVU
aW1lKSB7CisgICAgICAgICAgICAgICAgUURhdGVUaW1lIGR0ID0gUURhdGVUaW1lOjpmcm9tU3Ry
aW5nKHFzdHJpbmcsIFF0OjpJU09EYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWR0LmlzVmFs
aWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZHQgPSBRRGF0ZVRpbWU6OmZyb21TdHJpbmcocXN0
cmluZywgUXQ6OlRleHREYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWR0LmlzVmFsaWQoKSkK
KyAgICAgICAgICAgICAgICAgICAgZHQgPSBRRGF0ZVRpbWU6OmZyb21TdHJpbmcocXN0cmluZywg
UXQ6OlN5c3RlbUxvY2FsZURhdGUpOworICAgICAgICAgICAgICAgIGlmICghZHQuaXNWYWxpZCgp
KQorICAgICAgICAgICAgICAgICAgICBkdCA9IFFEYXRlVGltZTo6ZnJvbVN0cmluZyhxc3RyaW5n
LCBRdDo6TG9jYWxlRGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGR0LmlzVmFsaWQoKSkgewor
ICAgICAgICAgICAgICAgICAgICByZXQgPSBkdDsKKyAgICAgICAgICAgICAgICAgICAgZGlzdCA9
IDI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChoaW50ID09IFFN
ZXRhVHlwZTo6UURhdGUpIHsKKyAgICAgICAgICAgICAgICBRRGF0ZSBkdCA9IFFEYXRlOjpmcm9t
U3RyaW5nKHFzdHJpbmcsIFF0OjpJU09EYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWR0Lmlz
VmFsaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZHQgPSBRRGF0ZTo6ZnJvbVN0cmluZyhxc3Ry
aW5nLCBRdDo6VGV4dERhdGUpOworICAgICAgICAgICAgICAgIGlmICghZHQuaXNWYWxpZCgpKQor
ICAgICAgICAgICAgICAgICAgICBkdCA9IFFEYXRlOjpmcm9tU3RyaW5nKHFzdHJpbmcsIFF0OjpT
eXN0ZW1Mb2NhbGVEYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAoIWR0LmlzVmFsaWQoKSkKKyAg
ICAgICAgICAgICAgICAgICAgZHQgPSBRRGF0ZTo6ZnJvbVN0cmluZyhxc3RyaW5nLCBRdDo6TG9j
YWxlRGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGR0LmlzVmFsaWQoKSkgeworICAgICAgICAg
ICAgICAgICAgICByZXQgPSBkdDsKKyAgICAgICAgICAgICAgICAgICAgZGlzdCA9IDM7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBRVGlt
ZSBkdCA9IFFUaW1lOjpmcm9tU3RyaW5nKHFzdHJpbmcsIFF0OjpJU09EYXRlKTsKKyAgICAgICAg
ICAgICAgICBpZiAoIWR0LmlzVmFsaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZHQgPSBRVGlt
ZTo6ZnJvbVN0cmluZyhxc3RyaW5nLCBRdDo6VGV4dERhdGUpOworICAgICAgICAgICAgICAgIGlm
ICghZHQuaXNWYWxpZCgpKQorICAgICAgICAgICAgICAgICAgICBkdCA9IFFUaW1lOjpmcm9tU3Ry
aW5nKHFzdHJpbmcsIFF0OjpTeXN0ZW1Mb2NhbGVEYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAo
IWR0LmlzVmFsaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgZHQgPSBRVGltZTo6ZnJvbVN0cmlu
Zyhxc3RyaW5nLCBRdDo6TG9jYWxlRGF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGR0LmlzVmFs
aWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXQgPSBkdDsKKyAgICAgICAgICAgICAgICAg
ICAgZGlzdCA9IDM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9
CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBRTWV0YVR5cGU6OlFSZWdFeHA6CisgICAgICAg
IGlmICh0eXBlID09IFJlZ0V4cCkgeworICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBjb252ZXJ0
Li4gYSBiaXQgcmlza3kKKyAgICAgICAgICAgIFFTdHJpbmcgcXN0cmluZyA9IFY4VG9RU3RyaW5n
KHZhbHVlLT5Ub1N0cmluZygpKTsKKworICAgICAgICAgICAgLy8gdGhpcyBpcyBvZiB0aGUgZm9y
bSAnL3h4eHh4eC9pJworICAgICAgICAgICAgaW50IGZpcnN0U2xhc2ggPSBxc3RyaW5nLmluZGV4
T2YoUUxhdGluMUNoYXIoJy8nKSk7CisgICAgICAgICAgICBpbnQgbGFzdFNsYXNoID0gcXN0cmlu
Zy5sYXN0SW5kZXhPZihRTGF0aW4xQ2hhcignLycpKTsKKyAgICAgICAgICAgIGlmIChmaXJzdFNs
YXNoID49MCAmJiBsYXN0U2xhc2ggPiBmaXJzdFNsYXNoKSB7CisgICAgICAgICAgICAgICAgUVJl
Z0V4cCByZWFsUmU7CisKKyAgICAgICAgICAgICAgICByZWFsUmUuc2V0UGF0dGVybihxc3RyaW5n
Lm1pZChmaXJzdFNsYXNoICsgMSwgbGFzdFNsYXNoIC0gZmlyc3RTbGFzaCAtIDEpKTsKKworICAg
ICAgICAgICAgICAgIGlmIChxc3RyaW5nLm1pZChsYXN0U2xhc2ggKyAxKS5jb250YWlucyhRTGF0
aW4xQ2hhcignaScpKSkKKyAgICAgICAgICAgICAgICAgICAgcmVhbFJlLnNldENhc2VTZW5zaXRp
dml0eShRdDo6Q2FzZUluc2Vuc2l0aXZlKTsKKworICAgICAgICAgICAgICAgIHJldCA9IHFWYXJp
YW50RnJvbVZhbHVlKHJlYWxSZSk7CisgICAgICAgICAgICAgICAgZGlzdCA9IDA7CisgICAgICAg
ICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHFDb252RGVidWcoKSA8PCAiY291bGRuJ3Qg
cGFyc2UgYSBKUyByZWdleHAiOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHR5
cGUgPT0gU3RyaW5nKSB7CisgICAgICAgICAgICBRU3RyaW5nIHFzdHJpbmcgPSBWOFRvUVN0cmlu
Zyh2YWx1ZS0+VG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIFFSZWdFeHAgcmUocXN0cmluZyk7
CisgICAgICAgICAgICBpZiAocmUuaXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0g
cVZhcmlhbnRGcm9tVmFsdWUocmUpOworICAgICAgICAgICAgICAgIGRpc3QgPSAxMDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgUU1ldGFUeXBl
OjpRT2JqZWN0U3RhcjoKKyAgICAgICAgaWYgKHR5cGUgPT0gUU9iaikgeworICAgICAgICAgICAg
UXRJbnN0YW5jZSogcXRpbnN0ID0gUXRJbnN0YW5jZTo6Z2V0SW5zdGFuY2Uob2JqZWN0KTsKKyAg
ICAgICAgICAgIGlmIChxdGluc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocXRpbnN0LT5nZXRP
YmplY3QoKSkgeworICAgICAgICAgICAgICAgICAgICBxQ29udkRlYnVnKCkgPDwgImZvdW5kIGlu
c3RhbmNlLCB3aXRoIG9iamVjdDoiIDw8ICh2b2lkKikgcXRpbnN0LT5nZXRPYmplY3QoKTsKKyAg
ICAgICAgICAgICAgICAgICAgcmV0ID0gcVZhcmlhbnRGcm9tVmFsdWUocXRpbnN0LT5nZXRPYmpl
Y3QoKSk7CisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSAwOworICAgICAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHFDb252RGVidWcoKSA8PCAiY2FuJ3QgY29udmVy
dCBkZWxldGVkIHFvYmplY3QiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICAgICAgcUNvbnZEZWJ1ZygpIDw8ICJ3YXNuJ3QgYSBxdGluc3RhbmNl
IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE51bGwpIHsKKyAg
ICAgICAgICAgIFFPYmplY3QqIG51bGxvYmogPSAwOworICAgICAgICAgICAgcmV0ID0gcVZhcmlh
bnRGcm9tVmFsdWUobnVsbG9iaik7CisgICAgICAgICAgICBkaXN0ID0gMDsKKyAgICAgICAgfSBl
bHNlIHsKKyAgICAgICAgICAgIHFDb252RGVidWcoKSA8PCAicHJldmlvdXMgdHlwZSB3YXMgbm90
IGFuIG9iamVjdDoiIDw8IHR5cGU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBj
YXNlIFFNZXRhVHlwZTo6Vm9pZFN0YXI6CisgICAgICAgIGlmICh0eXBlID09IFFPYmopIHsKKyAg
ICAgICAgICAgIFF0SW5zdGFuY2UqIHF0aW5zdCA9IFF0SW5zdGFuY2U6OmdldEluc3RhbmNlKG9i
amVjdCk7CisgICAgICAgICAgICBpZiAocXRpbnN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHF0
aW5zdC0+Z2V0T2JqZWN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcUNvbnZEZWJ1ZygpIDw8
ICJmb3VuZCBpbnN0YW5jZSwgd2l0aCBvYmplY3Q6IiA8PCAodm9pZCopIHF0aW5zdC0+Z2V0T2Jq
ZWN0KCk7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHFWYXJpYW50RnJvbVZhbHVlKCh2b2lk
ICopcXRpbnN0LT5nZXRPYmplY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIHFDb252RGVidWco
KSA8PCByZXQ7CisgICAgICAgICAgICAgICAgICAgIGRpc3QgPSAwOworICAgICAgICAgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHFDb252RGVidWcoKSA8PCAiY2FuJ3QgY29u
dmVydCBkZWxldGVkIHFvYmplY3QiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgcUNvbnZEZWJ1ZygpIDw8ICJ3YXNuJ3QgYSBxdGluc3Rh
bmNlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE51bGwpIHsK
KyAgICAgICAgICAgIHJldCA9IHFWYXJpYW50RnJvbVZhbHVlKCh2b2lkKikwKTsKKyAgICAgICAg
ICAgIGRpc3QgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gTnVtYmVyKSB7CisgICAg
ICAgICAgICAvLyBJIGRvbid0IHRoaW5rIHRoYXQgY29udmVydGluZyBhIGRvdWJsZSB0byBhIHBv
aW50ZXIgaXMgYSB3aXNlCisgICAgICAgICAgICAvLyBtb3ZlLiAgRXhjZXB0IG1heWJlIDAuCisg
ICAgICAgICAgICBxQ29udkRlYnVnKCkgPDwgImdvdCBudW1iZXIgZm9yIHZvaWQgKiAtIG5vdCBj
b252ZXJ0aW5nLCBzZWVtcyB1bnNhZmU6IiA8PCB2YWx1ZS0+VG9OdW1iZXIoKS0+VmFsdWUoKTsK
KyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHFDb252RGVidWcoKSA8PCAidm9pZCogLSB1
bmhhbmRsZWQgdHlwZSIgPDwgdHlwZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAg
IGRlZmF1bHQ6CisgICAgICAgIC8vIE5vbiBjb25zdCB0eXBlIGlkcworICAgICAgICBpZiAoaGlu
dCA9PSAoUU1ldGFUeXBlOjpUeXBlKXFNZXRhVHlwZUlkPFFPYmplY3RMaXN0PigpKSB7CisgICAg
ICAgICAgICBpZiAodHlwZSA9PSBBcnJheSkgeworICAgICAgICAgICAgICAgIHY4OjpIYW5kbGU8
djg6OkFycmF5PiBhcnIgPSB2YWx1ZS5Bczx2ODo6QXJyYXk+KCk7CisgICAgICAgICAgICAgICAg
UU9iamVjdExpc3QgcmVzdWx0OworICAgICAgICAgICAgICAgIGludCBsZW4gPSBhcnItPkxlbmd0
aCgpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAg
ICAgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbCA9IGFyci0+R2V0KGkp
OworICAgICAgICAgICAgICAgICAgICBpbnQgaXRlbWRpc3QgPSAtMTsKKyAgICAgICAgICAgICAg
ICAgICAgUVZhcmlhbnQgaXRlbSA9IGNvbnZlcnRWYWx1ZVRvUVZhcmlhbnQodmFsLCBRTWV0YVR5
cGU6OlFPYmplY3RTdGFyLCAmaXRlbWRpc3QsIHZpc2l0ZWRPYmplY3RzKTsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKGl0ZW1kaXN0ID49IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1
bHQuYXBwZW5kKGl0ZW0udmFsdWU8UU9iamVjdCo+KCkpOworICAgICAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAgICAgLy8gSWYgd2UgZGlkbid0IGZhaWwgY29udmVyc2lvbgorICAgICAgICAg
ICAgICAgIGlmIChyZXN1bHQuY291bnQoKSA9PSBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAg
ZGlzdCA9IDU7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IFFWYXJpYW50Ojpmcm9tVmFsdWUo
cmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAg
ICAgICAgICAgIC8vIE1ha2UgYSBzaW5nbGUgbGVuZ3RoIGFycmF5CisgICAgICAgICAgICAgICAg
UU9iamVjdExpc3QgcmVzdWx0OworICAgICAgICAgICAgICAgIGludCBpdGVtZGlzdCA9IC0xOwor
ICAgICAgICAgICAgICAgIFFWYXJpYW50IGl0ZW0gPSBjb252ZXJ0VmFsdWVUb1FWYXJpYW50KHZh
bHVlLCBRTWV0YVR5cGU6OlFPYmplY3RTdGFyLCAmaXRlbWRpc3QsIHZpc2l0ZWRPYmplY3RzKTsK
KyAgICAgICAgICAgICAgICBpZiAoaXRlbWRpc3QgPj0gMCkgeworICAgICAgICAgICAgICAgICAg
ICByZXN1bHQuYXBwZW5kKGl0ZW0udmFsdWU8UU9iamVjdCo+KCkpOworICAgICAgICAgICAgICAg
ICAgICBkaXN0ID0gMTA7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IFFWYXJpYW50Ojpmcm9t
VmFsdWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfSAKKyAgICAgICAgaWYgKGhpbnQgPT0gKFFNZXRhVHlwZTo6
VHlwZSkgcU1ldGFUeXBlSWQ8UUxpc3Q8aW50PiA+KCkpIHsKKyAgICAgICAgICAgIGlmICh0eXBl
ID09IEFycmF5KSB7CisgICAgICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IGFyciA9
IHZhbHVlLkFzPHY4OjpBcnJheT4oKTsKKworICAgICAgICAgICAgICAgIFFMaXN0PGludD4gcmVz
dWx0OworICAgICAgICAgICAgICAgIGludCBsZW4gPSBhcnItPkxlbmd0aCgpOworICAgICAgICAg
ICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAg
ICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbCA9IGFyci0+R2V0KGkpOworICAgICAgICAgICAg
ICAgICAgICBpbnQgaXRlbWRpc3QgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgUVZhcmlhbnQg
aXRlbSA9IGNvbnZlcnRWYWx1ZVRvUVZhcmlhbnQodmFsLCBRTWV0YVR5cGU6OkludCwgJml0ZW1k
aXN0LCB2aXNpdGVkT2JqZWN0cyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtZGlzdCA+
PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpdGVtLnZhbHVlPGlu
dD4oKSk7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkaWRu
J3QgZmFpbCBjb252ZXJzaW9uCisgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jb3VudCgpID09
IGxlbikgeworICAgICAgICAgICAgICAgICAgICBkaXN0ID0gNTsKKyAgICAgICAgICAgICAgICAg
ICAgcmV0ID0gUVZhcmlhbnQ6OmZyb21WYWx1ZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gTWFrZSBhIHNpbmdsZSBs
ZW5ndGggYXJyYXkKKyAgICAgICAgICAgICAgICBRTGlzdDxpbnQ+IHJlc3VsdDsKKyAgICAgICAg
ICAgICAgICBpbnQgaXRlbWRpc3QgPSAtMTsKKyAgICAgICAgICAgICAgICBRVmFyaWFudCBpdGVt
ID0gY29udmVydFZhbHVlVG9RVmFyaWFudCh2YWx1ZSwgUU1ldGFUeXBlOjpJbnQsICZpdGVtZGlz
dCwgdmlzaXRlZE9iamVjdHMpOworICAgICAgICAgICAgICAgIGlmIChpdGVtZGlzdCA+PSAwKSB7
CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoaXRlbS52YWx1ZTxpbnQ+KCkpOwor
ICAgICAgICAgICAgICAgICAgICBkaXN0ID0gMTA7CisgICAgICAgICAgICAgICAgICAgIHJldCA9
IFFWYXJpYW50Ojpmcm9tVmFsdWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICB9IAorICAgICAgICBpZiAoUXRQ
aXhtYXBJbnN0YW5jZTo6Y2FuSGFuZGxlKHN0YXRpY19jYXN0PFFNZXRhVHlwZTo6VHlwZT4oaGlu
dCkpKQorICAgICAgICAgICAgcmV0ID0gUXRQaXhtYXBJbnN0YW5jZTo6dmFyaWFudEZyb21PYmpl
Y3Qob2JqZWN0LCBzdGF0aWNfY2FzdDxRTWV0YVR5cGU6OlR5cGU+KGhpbnQpKTsKKyAgICAgICAg
ZWxzZSBpZiAoaGludCA9PSAoUU1ldGFUeXBlOjpUeXBlKSBxTWV0YVR5cGVJZDxRV2ViRWxlbWVu
dD4oKSkgeworICAgICAgICAgICAgaWYgKCFvYmplY3QuSXNFbXB0eSgpICYmIFY4SFRNTEVsZW1l
bnQ6Okhhc0luc3RhbmNlKG9iamVjdCkpIHsKKyAgICAgICAgICAgICAgICBIVE1MRWxlbWVudCog
aHRtbGVsZW1lbnQgPSBWOEhUTUxFbGVtZW50Ojp0b05hdGl2ZShvYmplY3QpOworICAgICAgICAg
ICAgICAgIHJldCA9IFFWYXJpYW50Ojpmcm9tVmFsdWU8UVdlYkVsZW1lbnQ+KFF0V2ViRWxlbWVu
dFJ1bnRpbWU6OmNyZWF0ZShodG1sZWxlbWVudCkpOworICAgICAgICAgICAgfSBlbHNlCisgICAg
ICAgICAgICAgICAgcmV0ID0gUVZhcmlhbnQ6OmZyb21WYWx1ZTxRV2ViRWxlbWVudD4oUVdlYkVs
ZW1lbnQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoaGludCA9PSAoUU1ldGFUeXBlOjpUeXBlKXFN
ZXRhVHlwZUlkPFFWYXJpYW50PigpKSB7CisgICAgICAgICAgICBpZiAodmFsdWUtPklzTnVsbCgp
IHx8IHZhbHVlLT5Jc1VuZGVmaW5lZCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRpc3RhbmNl
KQorICAgICAgICAgICAgICAgICAgICAqZGlzdGFuY2UgPSAxOworICAgICAgICAgICAgICAgIHJl
dHVybiBRVmFyaWFudCgpOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIGlmICh0eXBlID09
IE9iamVjdCkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGhhdmVuJ3QgcmVhbGx5IHZp
c2l0ZWQgdGhpcyBvYmplY3QgeWV0LCB3ZSByZW1vdmUgaXQKKyAgICAgICAgICAgICAgICB2aXNp
dGVkT2JqZWN0cy0+cmVtb3ZlKG9iamVjdC0+R2V0SWRlbnRpdHlIYXNoKCkpOworICAgICAgICAg
ICAgfQorCisgICAgICAgICAgICAvLyBBbmQgdGhlbiByZWN1cnNlIHdpdGggdGhlIGF1dG9kZXRl
Y3QgZmxhZworICAgICAgICAgICAgcmV0ID0gY29udmVydFZhbHVlVG9RVmFyaWFudCh2YWx1ZSwg
UU1ldGFUeXBlOjpWb2lkLCBkaXN0YW5jZSwgdmlzaXRlZE9iamVjdHMpOworICAgICAgICAgICAg
ZGlzdCA9IDEwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkaXN0
ID0gMTA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmICghcmV0LmlzVmFsaWQoKSkK
KyAgICAgICAgZGlzdCA9IC0xOworICAgIGlmIChkaXN0YW5jZSkKKyAgICAgICAgKmRpc3RhbmNl
ID0gZGlzdDsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworUVZhcmlhbnQgY29udmVydFZhbHVl
VG9RVmFyaWFudCh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUsIFFNZXRhVHlwZTo6VHlwZSBo
aW50LCBpbnQgKmRpc3RhbmNlKQoreworICAgIEhhc2hTZXQ8aW50PiB2aXNpdGVkT2JqZWN0czsK
KyAgICByZXR1cm4gY29udmVydFZhbHVlVG9RVmFyaWFudCh2YWx1ZSwgaGludCwgZGlzdGFuY2Us
ICZ2aXNpdGVkT2JqZWN0cyk7Cit9CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBjb252ZXJ0UVZh
cmlhbnRUb1ZhbHVlKHY4OjpQZXJzaXN0ZW50PHY4OjpDb250ZXh0PiBjb250ZXh0LCBjb25zdCBR
VmFyaWFudCYgdmFyaWFudCkKK3sKKyAgICAvLyBWYXJpYW50cyB3aXRoIFFPYmplY3QgKiBjYW4g
YmUgaXNOdWxsIGJ1dCBub3QgYSBudWxsIHBvaW50ZXIKKyAgICAvLyBBbiBlbXB0eSBRU3RyaW5n
IHZhcmlhbnQgaXMgYWxzbyBudWxsCisgICAgUU1ldGFUeXBlOjpUeXBlIHR5cGUgPSAoUU1ldGFU
eXBlOjpUeXBlKSB2YXJpYW50LnVzZXJUeXBlKCk7CisKKyAgICBxQ29udkRlYnVnKCkgPDwgImNv
bnZlcnRRVmFyaWFudFRvVmFsdWU6IG1ldGF0eXBlOiIgPDwgdHlwZSA8PCAiLCBpc251bGw6ICIg
PDwgdmFyaWFudC5pc051bGwoKTsKKyAgICBpZiAodmFyaWFudC5pc051bGwoKSAKKyAgICAgICAm
JiB0eXBlICE9IFFNZXRhVHlwZTo6UU9iamVjdFN0YXIgCisgICAgICAgJiYgdHlwZSAhPSBRTWV0
YVR5cGU6OlZvaWRTdGFyIAorICAgICAgICYmIHR5cGUgIT0gUU1ldGFUeXBlOjpRV2lkZ2V0U3Rh
ciAKKyAgICAgICAmJiB0eXBlICE9IFFNZXRhVHlwZTo6UVN0cmluZykKKyAgICAgICAgcmV0dXJu
IHY4OjpOdWxsKCk7CisKKworICAgIGlmICh0eXBlID09IFFNZXRhVHlwZTo6Qm9vbCkKKyAgICAg
ICAgcmV0dXJuIHY4OjpCb29sZWFuOjpOZXcodmFyaWFudC50b0Jvb2woKSk7CisKKyAgICBzd2l0
Y2ggKHR5cGUpIHsKKyAgICBjYXNlIFFNZXRhVHlwZTo6SW50OgorICAgIGNhc2UgUU1ldGFUeXBl
OjpVSW50OgorICAgIGNhc2UgUU1ldGFUeXBlOjpMb25nOgorICAgIGNhc2UgUU1ldGFUeXBlOjpV
TG9uZzoKKyAgICBjYXNlIFFNZXRhVHlwZTo6TG9uZ0xvbmc6CisgICAgY2FzZSBRTWV0YVR5cGU6
OlVMb25nTG9uZzoKKyAgICBjYXNlIFFNZXRhVHlwZTo6U2hvcnQ6CisgICAgY2FzZSBRTWV0YVR5
cGU6OlVTaG9ydDoKKyAgICBjYXNlIFFNZXRhVHlwZTo6RmxvYXQ6CisgICAgY2FzZSBRTWV0YVR5
cGU6OkRvdWJsZToKKyAgICAgICAgcmV0dXJuIHY4OjpOdW1iZXI6Ok5ldyh2YXJpYW50LnRvRG91
YmxlKCkpOworICAgIH0KKworICAgIGlmICh0eXBlID09IFFNZXRhVHlwZTo6UVJlZ0V4cCkgewor
ICAgICAgICBRUmVnRXhwIHJlID0gdmFyaWFudC52YWx1ZTxRUmVnRXhwPigpOworCisgICAgICAg
IGlmIChyZS5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIFFTdHJpbmcgdWZsYWdzOworICAgICAg
ICAgICAgaWYgKHJlLmNhc2VTZW5zaXRpdml0eSgpID09IFF0OjpDYXNlSW5zZW5zaXRpdmUpCisg
ICAgICAgICAgICAgICAgdWZsYWdzID0gImkiOyAvLyAjIyMgQ2FuJ3QgZG8gZyBvciBtCisgICAg
ICAgICAgICBRU3RyaW5nIGV4ZWNzdHIgPSAiLyIgKyByZS5wYXR0ZXJuKCkgKyAiLyIgKyB1Zmxh
Z3M7CisgICAgICAgICAgICBRQnl0ZUFycmF5IGJhID0gZXhlY3N0ci50b0xhdGluMSgpOworICAg
ICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHJldCA9IHY4OjpTY3JpcHQ6OkNvbXBpbGUo
djg6OlN0cmluZzo6TmV3KGJhLmRhdGEoKSkpLT5SdW4oKTsKKyAgICAgICAgICAgIGlmIChyZXQt
PklzUmVnRXhwKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIHJl
dHVybiB2ODo6TnVsbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHR5cGUgPT0gUU1l
dGFUeXBlOjpRRGF0ZVRpbWUgCisgICAgICAgIHx8IHR5cGUgPT0gUU1ldGFUeXBlOjpRRGF0ZSAK
KyAgICAgICAgfHwgdHlwZSA9PSBRTWV0YVR5cGU6OlFUaW1lKSB7CisKKyAgICAgICAgUURhdGUg
ZGF0ZSA9IFFEYXRlOjpjdXJyZW50RGF0ZSgpOworICAgICAgICBRVGltZSB0aW1lKDAsIDAsIDAp
OyAvLyBtaWRuaWdodAorCisgICAgICAgIGlmICh0eXBlID09IFFNZXRhVHlwZTo6UURhdGUpCisg
ICAgICAgICAgICBkYXRlID0gdmFyaWFudC52YWx1ZTxRRGF0ZT4oKTsKKyAgICAgICAgZWxzZSBp
ZiAodHlwZSA9PSBRTWV0YVR5cGU6OlFUaW1lKQorICAgICAgICAgICAgdGltZSA9IHZhcmlhbnQu
dmFsdWU8UVRpbWU+KCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgUURhdGVUaW1lIGR0
ID0gdmFyaWFudC52YWx1ZTxRRGF0ZVRpbWU+KCkudG9Mb2NhbFRpbWUoKTsKKyAgICAgICAgICAg
IGRhdGUgPSBkdC5kYXRlKCk7CisgICAgICAgICAgICB0aW1lID0gZHQudGltZSgpOworICAgICAg
ICB9CisgICAgICAgIC8vIERhdGVzIHNwZWNpZmllZCB0aGlzIHdheSBhcmUgaW4gbG9jYWwgdGlt
ZSAod2UgY29udmVydCBEYXRlVGltZXMgYWJvdmUpCisgICAgICAgIEdyZWdvcmlhbkRhdGVUaW1l
IGR0OworICAgICAgICBkdC55ZWFyID0gZGF0ZS55ZWFyKCkgLSAxOTAwOworICAgICAgICBkdC5t
b250aCA9IGRhdGUubW9udGgoKSAtIDE7CisgICAgICAgIGR0Lm1vbnRoRGF5ID0gZGF0ZS5kYXko
KTsKKyAgICAgICAgZHQuaG91ciA9IHRpbWUuaG91cigpOworICAgICAgICBkdC5taW51dGUgPSB0
aW1lLm1pbnV0ZSgpOworICAgICAgICBkdC5zZWNvbmQgPSB0aW1lLnNlY29uZCgpOworICAgICAg
ICBkdC5pc0RTVCA9IC0xOworICAgICAgICBkb3VibGUgbXMgPSBncmVnb3JpYW5EYXRlVGltZVRv
TVMoVjhQcm94eTo6Y3VycmVudENvbnRleHQoKSwgZHQsIHRpbWUubXNlYygpLCAvKmlucHV0SXNV
VEMqLyBmYWxzZSk7CisgICAgICAgIHJldHVybiB2ODo6RGF0ZTo6TmV3KHRydW5jKG1zKSk7Cisg
ICAgfQorCisgICAgaWYgKHR5cGUgPT0gUU1ldGFUeXBlOjpRQnl0ZUFycmF5KSB7CisgICAgICAg
IHY4OjpIYW5kbGU8djg6Ok9iamVjdFRlbXBsYXRlPiBvdCA9IHY4OjpPYmplY3RUZW1wbGF0ZTo6
TmV3KCk7CisgICAgICAgIG90LT5TZXRJbnRlcm5hbEZpZWxkQ291bnQoMik7CisgICAgICAgIHY4
OjpIYW5kbGU8djg6Ok9iamVjdD4gYmFvYmogPSBvdC0+TmV3SW5zdGFuY2UoKTsKKyAgICAgICAg
UUJ5dGVBcnJheSBiYSA9IHZhcmlhbnQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgY29uc3Qgdm9p
ZCogZGF0YSA9IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQqPihiYS5jb25zdERhdGEoKSk7CisgICAg
ICAgIGludCBwYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQ+KGRhdGEpOworICAgICAgICBp
bnQgbGVuID0gYmEubGVuZ3RoKCk7CisgICAgICAgIGJhb2JqLT5TZXRJbmRleGVkUHJvcGVydGll
c1RvRXh0ZXJuYWxBcnJheURhdGEocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4ocGJ1ZmZlciksIHY4
OjprRXh0ZXJuYWxCeXRlQXJyYXksIGxlbik7CisgICAgICAgIGJhb2JqLT5TZXRJbnRlcm5hbEZp
ZWxkKDAsIHY4OjpFeHRlcm5hbDo6V3JhcChyZWludGVycHJldF9jYXN0PHZvaWQqPihwYnVmZmVy
KSkpOworICAgICAgICBiYW9iai0+U2V0SW50ZXJuYWxGaWVsZCgxLCB2ODo6RXh0ZXJuYWw6Oldy
YXAocmVpbnRlcnByZXRfY2FzdDx2b2lkKj4obGVuKSkpOworICAgICAgICBiYW9iai0+U2V0SGlk
ZGVuVmFsdWUodjg6OlN0cmluZzo6TmV3KCJfX3F0X21ldGFfdHlwZV9fIiksIHY4OjpOdWxsKCkp
OworICAgICAgICByZXR1cm4gYmFvYmo7CisgICAgfQorCisgICAgaWYgKHR5cGUgPT0gUU1ldGFU
eXBlOjpRT2JqZWN0U3RhciB8fCB0eXBlID09IFFNZXRhVHlwZTo6UVdpZGdldFN0YXIpIHsKKyAg
ICAgICAgUU9iamVjdCogb2JqID0gdmFyaWFudC52YWx1ZTxRT2JqZWN0Kj4oKTsKKyAgICAgICAg
aWYgKCFvYmopCisgICAgICAgICAgICByZXR1cm4gdjg6Ok51bGwoKTsKKyAgICAgICAgcmV0dXJu
IFF0SW5zdGFuY2U6OmdldFF0SW5zdGFuY2Uob2JqLCBjb250ZXh0LCBRU3RyaW5nKCJ0YmQiKSwg
UVNjcmlwdEVuZ2luZTo6UXRPd25lcnNoaXApLT5nZXRWOE9iamVjdCgpOworICAgIH0KKyAgICBp
ZiAoUXRQaXhtYXBJbnN0YW5jZTo6Y2FuSGFuZGxlKHN0YXRpY19jYXN0PFFNZXRhVHlwZTo6VHlw
ZT4odmFyaWFudC50eXBlKCkpKSkKKyAgICAgICAgcmV0dXJuIFF0UGl4bWFwSW5zdGFuY2U6OmNy
ZWF0ZVJ1bnRpbWVPYmplY3QoY29udGV4dCwgdmFyaWFudCktPmdldFY4T2JqZWN0KCk7CisKKyAg
ICBpZiAodHlwZSA9PSBxTWV0YVR5cGVJZDxRV2ViRWxlbWVudD4oKSkKKyAgICAgICAgcmV0dXJu
IFY4RWxlbWVudDo6d3JhcChRdFdlYkVsZW1lbnRSdW50aW1lOjpnZXQodmFyaWFudC52YWx1ZTxR
V2ViRWxlbWVudD4oKSkpOworCisgICAgaWYgKHR5cGUgPT0gUU1ldGFUeXBlOjpRVmFyaWFudE1h
cCkgeworICAgICAgICAvLyBjcmVhdGUgbmV3IG9iamVjdCwgYW5kIHN0dWZmIHByb3BlcnRpZXMg
aW50byBpdAorICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHJldCA9IHY4OjpPYmplY3Q6
Ok5ldygpOworICAgICAgICBRVmFyaWFudE1hcCBtYXAgPSB2YXJpYW50LnZhbHVlPFFWYXJpYW50
TWFwPigpOworICAgICAgICBRVmFyaWFudE1hcDo6Y29uc3RfaXRlcmF0b3IgaSA9IG1hcC5jb25z
dEJlZ2luKCk7CisgICAgICAgIHdoaWxlIChpICE9IG1hcC5jb25zdEVuZCgpKSB7CisgICAgICAg
ICAgICBRU3RyaW5nIHMgPSBpLmtleSgpOworICAgICAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IHZhbCA9IGNvbnZlcnRRVmFyaWFudFRvVmFsdWUoY29udGV4dCwgaS52YWx1ZSgpKTsKKyAg
ICAgICAgICAgIGlmICghdmFsLklzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICByZXQtPlNldCh2
ODo6U3RyaW5nOjpOZXcocy50b0xhdGluMSgpLmNvbnN0RGF0YSgpKSwgdmFsKTsKKyAgICAgICAg
ICAgICsraTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAg
Ly8gTGlzdCB0eXBlcworICAgIGlmICh0eXBlID09IFFNZXRhVHlwZTo6UVZhcmlhbnRMaXN0KSB7
CisgICAgICAgIFFWYXJpYW50TGlzdCBsaXN0ID0gdmFyaWFudC50b0xpc3QoKTsKKyAgICAgICAg
aWYgKCFsaXN0LmNvdW50KCkpCisgICAgICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6QXJy
YXk+KCk7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkFycmF5PiBhcnIgPSB2ODo6QXJyYXk6Ok5l
dyhsaXN0LmNvdW50KCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuY291bnQo
KTsgaSsrKSB7CisgICAgICAgICAgICBRVmFyaWFudCB2YXIgPSBsaXN0LmF0KGkpOworICAgICAg
ICAgICAgYXJyLT5TZXQodjg6OkludGVnZXI6Ok5ldyhpKSwgY29udmVydFFWYXJpYW50VG9WYWx1
ZShjb250ZXh0LCB2YXIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJyOworICAgIH0g
CisgICAgaWYgKHR5cGUgPT0gUU1ldGFUeXBlOjpRU3RyaW5nTGlzdCkgeworICAgICAgICBRU3Ry
aW5nTGlzdCBsaXN0ID0gdmFyaWFudC52YWx1ZTxRU3RyaW5nTGlzdD4oKTsKKyAgICAgICAgaWYg
KCFsaXN0LmNvdW50KCkpCisgICAgICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6QXJyYXk+
KCk7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OkFycmF5PiBhcnIgPSB2ODo6QXJyYXk6Ok5ldyhs
aXN0LmNvdW50KCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuY291bnQoKTsg
aSsrKSB7CisgICAgICAgICAgICBRU3RyaW5nIHZhciA9IGxpc3QuYXQoaSk7CisgICAgICAgICAg
ICBhcnItPlNldCh2ODo6SW50ZWdlcjo6TmV3KGkpLCBjb252ZXJ0UVZhcmlhbnRUb1ZhbHVlKGNv
bnRleHQsIFFWYXJpYW50Ojpmcm9tVmFsdWUodmFyKSkpOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiBhcnI7CisgICAgfSAKKyAgICBpZiAodHlwZSA9PSAoUU1ldGFUeXBlOjpUeXBlKSBxTWV0
YVR5cGVJZDxRT2JqZWN0TGlzdD4oKSkgeworICAgICAgICBRT2JqZWN0TGlzdCBsaXN0ID0gdmFy
aWFudC52YWx1ZTxRT2JqZWN0TGlzdD4oKTsKKyAgICAgICAgaWYgKCFsaXN0LmNvdW50KCkpCisg
ICAgICAgICAgICByZXR1cm4gdjg6OkhhbmRsZTx2ODo6QXJyYXk+KCk7CisgICAgICAgIHY4OjpI
YW5kbGU8djg6OkFycmF5PiBhcnIgPSB2ODo6QXJyYXk6Ok5ldyhsaXN0LmNvdW50KCkpOworICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuY291bnQoKTsgaSsrKSB7CisgICAgICAgICAg
ICBRT2JqZWN0KiB2YXIgPSBsaXN0LmF0KGkpOworICAgICAgICAgICAgYXJyLT5TZXQodjg6Oklu
dGVnZXI6Ok5ldyhpKSwgY29udmVydFFWYXJpYW50VG9WYWx1ZShjb250ZXh0LCBRVmFyaWFudDo6
ZnJvbVZhbHVlKHZhcikpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJyOworICAgIH0g
CisgICAgaWYgKHR5cGUgPT0gKFFNZXRhVHlwZTo6VHlwZSlxTWV0YVR5cGVJZDxRTGlzdDxpbnQ+
ID4oKSkgeworICAgICAgICBRTGlzdDxpbnQ+IGxpc3QgPSB2YXJpYW50LnZhbHVlPFFMaXN0PGlu
dD4gPigpOworICAgICAgICBpZiAoIWxpc3QuY291bnQoKSkKKyAgICAgICAgICAgIHJldHVybiB2
ODo6SGFuZGxlPHY4OjpBcnJheT4oKTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6QXJyYXk+IGFy
ciA9IHY4OjpBcnJheTo6TmV3KGxpc3QuY291bnQoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgbGlzdC5jb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGludCB2YXIgPSBsaXN0LmF0
KGkpOworICAgICAgICAgICAgYXJyLT5TZXQodjg6OkludGVnZXI6Ok5ldyhpKSwgY29udmVydFFW
YXJpYW50VG9WYWx1ZShjb250ZXh0LCB2YXIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
YXJyOworICAgIH0KKworICAgIGlmICh0eXBlID09IChRTWV0YVR5cGU6OlR5cGUpcU1ldGFUeXBl
SWQ8UVZhcmlhbnQ+KCkpIHsKKyAgICAgICAgUVZhcmlhbnQgcmVhbCA9IHZhcmlhbnQudmFsdWU8
UVZhcmlhbnQ+KCk7CisgICAgICAgIHFDb252RGVidWcoKSA8PCAicmVhbCB2YXJpYW50IGlzOiIg
PDwgcmVhbDsKKyAgICAgICAgcmV0dXJuIGNvbnZlcnRRVmFyaWFudFRvVmFsdWUoY29udGV4dCwg
cmVhbCk7CisgICAgfQorCisgICAgcUNvbnZEZWJ1ZygpIDw8ICJmYWxsYmFjayBwYXRoIGZvciIg
PDwgdmFyaWFudCA8PCB2YXJpYW50LnVzZXJUeXBlKCk7CisKKyAgICBRU3RyaW5nIHN0cmluZyA9
IHZhcmlhbnQudG9TdHJpbmcoKTsKKyAgICByZXR1cm4gdjg6OlN0cmluZzo6TmV3KHN0cmluZy50
b0xhdGluMSgpLmNvbnN0RGF0YSgpKTsKKworfQorCisvLyA9PT09PT09PT09PT09PT0KKworLy8g
UXQtbGlrZSBtYWNyb3MKKyNkZWZpbmUgUVdfRChDbGFzcykgQ2xhc3MjI0RhdGEqIGQgPSBkZnVu
YygpCisjZGVmaW5lIFFXX0RTKENsYXNzLCBJbnN0YW5jZSkgQ2xhc3MjI0RhdGEqIGQgPSBJbnN0
YW5jZS0+ZGZ1bmMoKQorCitRdFJ1bnRpbWVNZXRob2Q6OlF0UnVudGltZU1ldGhvZChRdFJ1bnRp
bWVNZXRob2REYXRhKiBkZCwgUGFzc1JlZlB0cjxRdEluc3RhbmNlPiBpbnN0KQorICAgIDogZF9w
dHIoZGQpCit7CisgICAgUVdfRChRdFJ1bnRpbWVNZXRob2QpOworICAgIGQtPm1faW5zdGFuY2Ug
PSBpbnN0OworfQorCisKK1F0UnVudGltZU1ldGhvZDo6flF0UnVudGltZU1ldGhvZCgpCit7Cisg
ICAgUVdfRChRdFJ1bnRpbWVNZXRob2QpOworICAgIGQtPm1faW5zdGFuY2UtPnJlbW92ZUNhY2hl
ZE1ldGhvZCh0aGlzKTsKKyAgICBkZWxldGUgZF9wdHI7Cit9CisKKworLy8gPT09PT09PT09PT09
PT09CisKK1F0UnVudGltZU1ldGhvZERhdGE6On5RdFJ1bnRpbWVNZXRob2REYXRhKCkKK3sKK30K
KworUXRSdW50aW1lTWV0YU1ldGhvZERhdGE6On5RdFJ1bnRpbWVNZXRhTWV0aG9kRGF0YSgpCit7
Cit9CisKK1F0UnVudGltZUNvbm5lY3Rpb25NZXRob2REYXRhOjp+UXRSdW50aW1lQ29ubmVjdGlv
bk1ldGhvZERhdGEoKQoreworfQorCisvLyA9PT09PT09PT09PT09PT0KKworLy8gVHlwZSBjb252
ZXJzaW9uIG1ldGFkYXRhIChmcm9tIFF0U2NyaXB0IG9yaWdpbmFsbHkpCitjbGFzcyBRdE1ldGhv
ZE1hdGNoVHlwZSB7CitwdWJsaWM6CisgICAgZW51bSBLaW5kIHsKKyAgICAgICAgSW52YWxpZCwK
KyAgICAgICAgVmFyaWFudCwKKyAgICAgICAgTWV0YVR5cGUsCisgICAgICAgIFVucmVzb2x2ZWQs
CisgICAgICAgIE1ldGFFbnVtCisgICAgfTsKKyAgICBRdE1ldGhvZE1hdGNoVHlwZSgpCisgICAg
ICAgIDogbV9raW5kKEludmFsaWQpIHsgfQorCisgICAgS2luZCBraW5kKCkgY29uc3QKKyAgICB7
IHJldHVybiBtX2tpbmQ7IH0KKworICAgIFFNZXRhVHlwZTo6VHlwZSB0eXBlSWQoKSBjb25zdDsK
KworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0CisgICAgeyByZXR1cm4gKG1fa2luZCAhPSBJbnZh
bGlkKTsgfQorCisgICAgYm9vbCBpc1ZhcmlhbnQoKSBjb25zdAorICAgIHsgcmV0dXJuIChtX2tp
bmQgPT0gVmFyaWFudCk7IH0KKworICAgIGJvb2wgaXNNZXRhVHlwZSgpIGNvbnN0CisgICAgeyBy
ZXR1cm4gKG1fa2luZCA9PSBNZXRhVHlwZSk7IH0KKworICAgIGJvb2wgaXNVbnJlc29sdmVkKCkg
Y29uc3QKKyAgICB7IHJldHVybiAobV9raW5kID09IFVucmVzb2x2ZWQpOyB9CisKKyAgICBib29s
IGlzTWV0YUVudW0oKSBjb25zdAorICAgIHsgcmV0dXJuIChtX2tpbmQgPT0gTWV0YUVudW0pOyB9
CisKKyAgICBRQnl0ZUFycmF5IG5hbWUoKSBjb25zdDsKKworICAgIGludCBlbnVtZXJhdG9ySW5k
ZXgoKSBjb25zdAorICAgIHsKKyAgICAgIFFfQVNTRVJUKGlzTWV0YUVudW0oKSk7IAorICAgICAg
cmV0dXJuIG1fdHlwZUlkOyAKKyAgICB9CisKKyAgICBzdGF0aWMgUXRNZXRob2RNYXRjaFR5cGUg
dmFyaWFudCgpCisgICAgeyByZXR1cm4gUXRNZXRob2RNYXRjaFR5cGUoVmFyaWFudCk7IH0KKwor
ICAgIHN0YXRpYyBRdE1ldGhvZE1hdGNoVHlwZSBtZXRhVHlwZShpbnQgdHlwZUlkLCBjb25zdCBR
Qnl0ZUFycmF5ICZuYW1lKQorICAgIHsgcmV0dXJuIFF0TWV0aG9kTWF0Y2hUeXBlKE1ldGFUeXBl
LCB0eXBlSWQsIG5hbWUpOyB9CisKKyAgICBzdGF0aWMgUXRNZXRob2RNYXRjaFR5cGUgbWV0YUVu
dW0oaW50IGVudW1JbmRleCwgY29uc3QgUUJ5dGVBcnJheSAmbmFtZSkKKyAgICB7IHJldHVybiBR
dE1ldGhvZE1hdGNoVHlwZShNZXRhRW51bSwgZW51bUluZGV4LCBuYW1lKTsgfQorCisgICAgc3Rh
dGljIFF0TWV0aG9kTWF0Y2hUeXBlIHVucmVzb2x2ZWQoY29uc3QgUUJ5dGVBcnJheSAmbmFtZSkK
KyAgICB7IHJldHVybiBRdE1ldGhvZE1hdGNoVHlwZShVbnJlc29sdmVkLCAvKnR5cGVJZD0qLzAs
IG5hbWUpOyB9CisKK3ByaXZhdGU6CisgICAgUXRNZXRob2RNYXRjaFR5cGUoS2luZCBraW5kLCBp
bnQgdHlwZUlkID0gMCwgY29uc3QgUUJ5dGVBcnJheSAmbmFtZSA9IFFCeXRlQXJyYXkoKSkKKyAg
ICAgICAgOiBtX2tpbmQoa2luZCksIG1fdHlwZUlkKHR5cGVJZCksIG1fbmFtZShuYW1lKSAKKyAg
ICB7IAorICAgIH0KKworICAgIEtpbmQgbV9raW5kOworICAgIGludCBtX3R5cGVJZDsKKyAgICBR
Qnl0ZUFycmF5IG1fbmFtZTsKK307CisKK1FNZXRhVHlwZTo6VHlwZSBRdE1ldGhvZE1hdGNoVHlw
ZTo6dHlwZUlkKCkgY29uc3QKK3sKKyAgICBpZiAoaXNWYXJpYW50KCkpCisgICAgICAgIHJldHVy
biAoUU1ldGFUeXBlOjpUeXBlKSBRTWV0YVR5cGU6OnR5cGUoIlFWYXJpYW50Iik7CisgICAgcmV0
dXJuIChRTWV0YVR5cGU6OlR5cGUpIChpc01ldGFFbnVtKCkgPyBRTWV0YVR5cGU6OkludCA6IG1f
dHlwZUlkKTsKK30KKworUUJ5dGVBcnJheSBRdE1ldGhvZE1hdGNoVHlwZTo6bmFtZSgpIGNvbnN0
Cit7CisgICAgaWYgKCFtX25hbWUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gbV9uYW1lOwor
ICAgIGlmIChtX2tpbmQgPT0gVmFyaWFudCkKKyAgICAgICAgcmV0dXJuICJRVmFyaWFudCI7Cisg
ICAgcmV0dXJuIFFCeXRlQXJyYXkoKTsKK30KKworc3RydWN0IFF0TWV0aG9kTWF0Y2hEYXRhIHsK
KyAgICBpbnQgbWF0Y2hEaXN0YW5jZTsKKyAgICBpbnQgaW5kZXg7CisgICAgUVZlY3RvcjxRdE1l
dGhvZE1hdGNoVHlwZT4gdHlwZXM7CisgICAgUVZhckxlbmd0aEFycmF5PFFWYXJpYW50LCAxMD4g
YXJnczsKKworICAgIFF0TWV0aG9kTWF0Y2hEYXRhKGludCBkaXN0LCBpbnQgaWR4LCBRVmVjdG9y
PFF0TWV0aG9kTWF0Y2hUeXBlPiB0eXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBjb25zdCBRVmFyTGVuZ3RoQXJyYXk8UVZhcmlhbnQsIDEwPiAmYXMpCisgICAgICAgIDogbWF0
Y2hEaXN0YW5jZShkaXN0KSwgaW5kZXgoaWR4KSwgdHlwZXModHlwcyksIGFyZ3MoYXMpIHsgfQor
ICAgIFF0TWV0aG9kTWF0Y2hEYXRhKCkKKyAgICAgICAgOiBpbmRleCgtMSkgeyB9CisKKyAgICBi
b29sIGlzVmFsaWQoKSBjb25zdAorICAgIHsgcmV0dXJuIChpbmRleCAhPSAtMSk7IH0KKworICAg
IGludCBmaXJzdFVucmVzb2x2ZWRJbmRleCgpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKGlu
dCBpID0gMDsgaSA8IHR5cGVzLmNvdW50KCk7IGkrKykgeworICAgICAgICAgICAgaWYgKHR5cGVz
LmF0KGkpLmlzVW5yZXNvbHZlZCgpKQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAg
ICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9OworCitzdGF0aWMgaW50IGluZGV4T2ZN
ZXRhRW51bShjb25zdCBRTWV0YU9iamVjdCAqbWV0YSwgY29uc3QgUUJ5dGVBcnJheSAmc3RyKQor
eworICAgIFFCeXRlQXJyYXkgc2NvcGU7CisgICAgUUJ5dGVBcnJheSBuYW1lOworICAgIGludCBz
Y29wZUlkeCA9IHN0ci5pbmRleE9mKCI6OiIpOworICAgIGlmIChzY29wZUlkeCAhPSAtMSkgewor
ICAgICAgICBzY29wZSA9IHN0ci5sZWZ0KHNjb3BlSWR4KTsKKyAgICAgICAgbmFtZSA9IHN0ci5t
aWQoc2NvcGVJZHggKyAyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gc3RyOworICAg
IH0KKyAgICBmb3IgKGludCBpID0gbWV0YS0+ZW51bWVyYXRvckNvdW50KCkgLSAxOyBpID49IDA7
IC0taSkgeworICAgICAgICBRTWV0YUVudW0gbSA9IG1ldGEtPmVudW1lcmF0b3IoaSk7CisgICAg
ICAgIGlmICgobS5uYW1lKCkgPT0gbmFtZSkvKiAmJiAoc2NvcGUuaXNFbXB0eSgpIHx8IChtLnNj
b3BlKCkgPT0gc2NvcGUpKSovKQorICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJl
dHVybiAtMTsKK30KKworLy8gSGVscGVyIGZ1bmN0aW9uIGZvciByZXNvbHZpbmcgbWV0aG9kcwor
Ly8gTGFyZ2VseSBiYXNlZCBvbiBjb2RlIGluIFF0U2NyaXB0IGZvciBjb21wYXRpYmlsaXR5IHJl
YXNvbnMKK3N0YXRpYyBpbnQgZmluZE1ldGhvZEluZGV4KGNvbnN0IFFNZXRhT2JqZWN0KiBtZXRh
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUUJ5dGVBcnJheSYgc2lnbmF0dXJl
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1ByaXZhdGUsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICBjb25zdCB2ODo6QXJndW1lbnRzJiBqc0FyZ3MsCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICBRVmFyTGVuZ3RoQXJyYXk8UVZhcmlhbnQsIDEwPiAmdmFycywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiB2dmFycywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiYgcEVycm9yKQoreworICAgIFFMaXN0
PGludD4gbWF0Y2hpbmdJbmRpY2VzOworCisgICAgYm9vbCBvdmVybG9hZHMgPSAhc2lnbmF0dXJl
LmNvbnRhaW5zKCcoJyk7CisKKyAgICBpbnQgY291bnQgPSBtZXRhLT5tZXRob2RDb3VudCgpOwor
ICAgIGZvciAoaW50IGkgPSBjb3VudCAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGNvbnN0
IFFNZXRhTWV0aG9kIG0gPSBtZXRhLT5tZXRob2QoaSk7CisKKyAgICAgICAgLy8gRG9uJ3QgY2hv
b3NlIHByaXZhdGUgbWV0aG9kcworICAgICAgICBpZiAobS5hY2Nlc3MoKSA9PSBRTWV0YU1ldGhv
ZDo6UHJpdmF0ZSAmJiAhYWxsb3dQcml2YXRlKQorICAgICAgICAgICAgY29udGludWU7CisKKyAg
ICAgICAgLy8gdHJ5IGFuZCBmaW5kIGFsbCBtYXRjaGluZyBuYW1lZCBtZXRob2RzCisgICAgICAg
IGlmIChvdmVybG9hZHMpIHsKKyAgICAgICAgICAgIFFCeXRlQXJyYXkgcmF3c2lnbmF0dXJlID0g
bS5zaWduYXR1cmUoKTsKKyAgICAgICAgICAgIHJhd3NpZ25hdHVyZS50cnVuY2F0ZShyYXdzaWdu
YXR1cmUuaW5kZXhPZignKCcpKTsKKyAgICAgICAgICAgIGlmIChyYXdzaWduYXR1cmUgPT0gc2ln
bmF0dXJlKQorICAgICAgICAgICAgICAgIG1hdGNoaW5nSW5kaWNlcy5hcHBlbmQoaSk7CisgICAg
ICAgIH0gZWxzZSBpZiAobS5zaWduYXR1cmUoKSA9PSBzaWduYXR1cmUpCisgICAgICAgICAgICBt
YXRjaGluZ0luZGljZXMuYXBwZW5kKGkpOworICAgIH0KKworICAgIGludCBjaG9zZW5JbmRleCA9
IC0xOworICAgIFFWZWN0b3I8UXRNZXRob2RNYXRjaFR5cGU+IGNob3NlblR5cGVzOworCisgICAg
UVZhckxlbmd0aEFycmF5PFFWYXJpYW50LCAxMD4gYXJnczsKKyAgICBRVmVjdG9yPFF0TWV0aG9k
TWF0Y2hEYXRhPiBjYW5kaWRhdGVzOworICAgIFFWZWN0b3I8UXRNZXRob2RNYXRjaERhdGE+IHVu
cmVzb2x2ZWQ7CisgICAgUVZlY3RvcjxpbnQ+IHRvb0Zld0FyZ3M7CisgICAgUVZlY3RvcjxpbnQ+
IGNvbnZlcnNpb25GYWlsZWQ7CisKKyAgICBmb3JlYWNoIChpbnQgaW5kZXgsIG1hdGNoaW5nSW5k
aWNlcykgeworICAgICAgICBRTWV0YU1ldGhvZCBtZXRob2QgPSBtZXRhLT5tZXRob2QoaW5kZXgp
OworCisgICAgICAgIFFWZWN0b3I8UXRNZXRob2RNYXRjaFR5cGU+IHR5cGVzOworICAgICAgICBi
b29sIHVucmVzb2x2ZWRUeXBlcyA9IGZhbHNlOworCisgICAgICAgIC8vIHJlc29sdmUgcmV0dXJu
IHR5cGUKKyAgICAgICAgUUJ5dGVBcnJheSByZXR1cm5UeXBlTmFtZSA9IG1ldGhvZC50eXBlTmFt
ZSgpOworICAgICAgICBpbnQgcnR5cGUgPSBRTWV0YVR5cGU6OnR5cGUocmV0dXJuVHlwZU5hbWUp
OworICAgICAgICBpZiAoKCFydHlwZSkgJiYgIXJldHVyblR5cGVOYW1lLmlzRW1wdHkoKSkgewor
ICAgICAgICAgICAgaWYgKHJldHVyblR5cGVOYW1lID09ICJRVmFyaWFudCIpIHsKKyAgICAgICAg
ICAgICAgICB0eXBlcy5hcHBlbmQoUXRNZXRob2RNYXRjaFR5cGU6OnZhcmlhbnQoKSk7CisgICAg
ICAgICAgICB9IGVsc2UgaWYgKHJldHVyblR5cGVOYW1lLmVuZHNXaXRoKCcqJykpIHsKKyAgICAg
ICAgICAgICAgICB0eXBlcy5hcHBlbmQoUXRNZXRob2RNYXRjaFR5cGU6Om1ldGFUeXBlKFFNZXRh
VHlwZTo6Vm9pZFN0YXIsIHJldHVyblR5cGVOYW1lKSk7CisgICAgICAgICAgICB9IGVsc2Ugewor
ICAgICAgICAgICAgICAgIGludCBlbnVtSW5kZXggPSBpbmRleE9mTWV0YUVudW0obWV0YSwgcmV0
dXJuVHlwZU5hbWUpOworICAgICAgICAgICAgICAgIGlmIChlbnVtSW5kZXggIT0gLTEpCisgICAg
ICAgICAgICAgICAgICAgIHR5cGVzLmFwcGVuZChRdE1ldGhvZE1hdGNoVHlwZTo6bWV0YUVudW0o
ZW51bUluZGV4LCByZXR1cm5UeXBlTmFtZSkpOworICAgICAgICAgICAgICAgIGVsc2UgeworICAg
ICAgICAgICAgICAgICAgICB1bnJlc29sdmVkVHlwZXMgPSB0cnVlOworICAgICAgICAgICAgICAg
ICAgICB0eXBlcy5hcHBlbmQoUXRNZXRob2RNYXRjaFR5cGU6OnVucmVzb2x2ZWQocmV0dXJuVHlw
ZU5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBpZiAocmV0dXJuVHlwZU5hbWUgPT0gIlFWYXJpYW50IikKKyAgICAg
ICAgICAgICAgICB0eXBlcy5hcHBlbmQoUXRNZXRob2RNYXRjaFR5cGU6OnZhcmlhbnQoKSk7Cisg
ICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdHlwZXMuYXBwZW5kKFF0TWV0aG9kTWF0
Y2hUeXBlOjptZXRhVHlwZShydHlwZSwgcmV0dXJuVHlwZU5hbWUpKTsKKyAgICAgICAgfQorCisg
ICAgICAgIC8vIHJlc29sdmUgYXJndW1lbnQgdHlwZXMKKyAgICAgICAgUUxpc3Q8UUJ5dGVBcnJh
eT4gcGFyYW1ldGVyVHlwZU5hbWVzID0gbWV0aG9kLnBhcmFtZXRlclR5cGVzKCk7CisgICAgICAg
IGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1ldGVyVHlwZU5hbWVzLmNvdW50KCk7ICsraSkgewor
ICAgICAgICAgICAgUUJ5dGVBcnJheSBhcmdUeXBlTmFtZSA9IHBhcmFtZXRlclR5cGVOYW1lcy5h
dChpKTsKKyAgICAgICAgICAgIGludCBhdHlwZSA9IFFNZXRhVHlwZTo6dHlwZShhcmdUeXBlTmFt
ZSk7CisgICAgICAgICAgICBpZiAoIWF0eXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ1R5
cGVOYW1lID09ICJRVmFyaWFudCIpCisgICAgICAgICAgICAgICAgICAgIHR5cGVzLmFwcGVuZChR
dE1ldGhvZE1hdGNoVHlwZTo6dmFyaWFudCgpKTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgICAgICAgICAgaW50IGVudW1JbmRleCA9IGluZGV4T2ZNZXRhRW51bShtZXRhLCBh
cmdUeXBlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbnVtSW5kZXggIT0gLTEpCisg
ICAgICAgICAgICAgICAgICAgICAgICB0eXBlcy5hcHBlbmQoUXRNZXRob2RNYXRjaFR5cGU6Om1l
dGFFbnVtKGVudW1JbmRleCwgYXJnVHlwZU5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1bnJlc29sdmVkVHlwZXMgPSB0cnVlOworICAg
ICAgICAgICAgICAgICAgICAgICAgdHlwZXMuYXBwZW5kKFF0TWV0aG9kTWF0Y2hUeXBlOjp1bnJl
c29sdmVkKGFyZ1R5cGVOYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhcmdUeXBl
TmFtZSA9PSAiUVZhcmlhbnQiKQorICAgICAgICAgICAgICAgICAgICB0eXBlcy5hcHBlbmQoUXRN
ZXRob2RNYXRjaFR5cGU6OnZhcmlhbnQoKSk7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgICAgICB0eXBlcy5hcHBlbmQoUXRNZXRob2RNYXRjaFR5cGU6Om1ldGFUeXBlKGF0
eXBlLCBhcmdUeXBlTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg
Ly8gSWYgdGhlIG5hdGl2ZSBtZXRob2QgcmVxdWlyZXMgbW9yZSBhcmd1bWVudHMgdGhhbiB3aGF0
IHdhcyBwYXNzZWQgZnJvbSBKYXZhU2NyaXB0CisgICAgICAgIGlmIChqc0FyZ3MuTGVuZ3RoKCkg
KyAxIDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHR5cGVzLmNvdW50KCkpKSB7CisgICAgICAgICAg
ICBxTWF0Y2hEZWJ1ZygpIDw8ICJNYXRjaDp0b28gZmV3IGFyZ3MgZm9yIiA8PCBtZXRob2Quc2ln
bmF0dXJlKCk7CisgICAgICAgICAgICB0b29GZXdBcmdzLmFwcGVuZChpbmRleCk7CisgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1bnJlc29sdmVkVHlwZXMp
IHsKKyAgICAgICAgICAgIHFNYXRjaERlYnVnKCkgPDwgIk1hdGNoOnVucmVzb2x2ZWQgYXJnIHR5
cGVzIGZvciIgPDwgbWV0aG9kLnNpZ25hdHVyZSgpOworICAgICAgICAgICAgLy8gcmVtZW1iZXIg
aXQgc28gd2UgY2FuIGdpdmUgYW4gZXJyb3IgbWVzc2FnZSBsYXRlciwgaWYgbmVjZXNzYXJ5Cisg
ICAgICAgICAgICB1bnJlc29sdmVkLmFwcGVuZChRdE1ldGhvZE1hdGNoRGF0YSgvKm1hdGNoRGlz
dGFuY2U9Ki9JTlRfTUFYLCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIHR5cGVzLCBRVmFyTGVuZ3RoQXJyYXk8UVZhcmlhbnQsIDEwPigp
KSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vdyBj
b252ZXJ0IGFyZ3VtZW50cworICAgICAgICBpZiAoYXJncy5jb3VudCgpICE9IHR5cGVzLmNvdW50
KCkpCisgICAgICAgICAgICBhcmdzLnJlc2l6ZSh0eXBlcy5jb3VudCgpKTsKKworICAgICAgICBR
dE1ldGhvZE1hdGNoVHlwZSByZXRUeXBlID0gdHlwZXNbMF07CisgICAgICAgIGFyZ3NbMF0gPSBR
VmFyaWFudChyZXRUeXBlLnR5cGVJZCgpLCAodm9pZCAqKTApOyAvLyB0aGUgcmV0dXJuIHZhbHVl
CisKKyAgICAgICAgYm9vbCBjb252ZXJ0ZWQgPSB0cnVlOworICAgICAgICBpbnQgbWF0Y2hEaXN0
YW5jZSA9IDA7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGNvbnZlcnRlZCAmJiBpICsg
MSA8IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0eXBlcy5jb3VudCgpKTsgKytpKSB7CisgICAgICAg
ICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXJnOworICAgICAgICAgICAgaWYgKGkgPCBqc0Fy
Z3MuTGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgYXJnID0ganNBcmdzW2ldOworICAgICAgICAg
ICAgZWxzZQorICAgICAgICAgICAgICAgIGFyZyA9IHY4OjpVbmRlZmluZWQoKTsKKworICAgICAg
ICAgICAgaW50IGFyZ2Rpc3RhbmNlID0gLTE7CisgICAgICAgICAgICBRTWV0YVR5cGU6OlR5cGUg
aGludCA9IHR5cGVzLmF0KGkrMSkudHlwZUlkKCk7CisgICAgICAgICAgICBRVmFyaWFudCB2ID0g
Y29udmVydFZhbHVlVG9RVmFyaWFudChhcmcsIHR5cGVzLmF0KGkrMSkudHlwZUlkKCksICZhcmdk
aXN0YW5jZSk7CisgICAgICAgICAgICBpZiAoYXJnZGlzdGFuY2UgPj0gMCkgeworICAgICAgICAg
ICAgICAgIG1hdGNoRGlzdGFuY2UgKz0gYXJnZGlzdGFuY2U7CisgICAgICAgICAgICAgICAgYXJn
c1tpKzFdID0gdjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcU1hdGNo
RGVidWcoKSA8PCAiZmFpbGVkIHRvIGNvbnZlcnQgYXJndW1lbnQgIiA8PCBpIDw8ICJ0eXBlIiA8
PCB0eXBlcy5hdChpKzEpLnR5cGVJZCgpIDw8IFFNZXRhVHlwZTo6dHlwZU5hbWUodHlwZXMuYXQo
aSsxKS50eXBlSWQoKSk7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gZmFsc2U7CisgICAg
ICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBxTWF0Y2hEZWJ1ZygpIDw8ICJNYXRjaDog
IiA8PCBtZXRob2Quc2lnbmF0dXJlKCkgPDwgKGNvbnZlcnRlZCA/ICJjb252ZXJ0ZWQiOiJmYWls
ZWQgdG8gY29udmVydCIpIDw8ICJkaXN0YW5jZSAiIDw8IG1hdGNoRGlzdGFuY2U7CisKKyAgICAg
ICAgaWYgKGNvbnZlcnRlZCkgeworICAgICAgICAgICAgaWYgKChqc0FyZ3MuTGVuZ3RoKCkgKyAx
ID09IHN0YXRpY19jYXN0PHVuc2lnbmVkPih0eXBlcy5jb3VudCgpKSkKKyAgICAgICAgICAgICAg
ICAmJiAoIW1hdGNoRGlzdGFuY2UpKSB7CisgICAgICAgICAgICAgICAgLy8gcGVyZmVjdCBtYXRj
aCwgdXNlIHRoaXMgb25lCisgICAgICAgICAgICAgICAgY2hvc2VuSW5kZXggPSBpbmRleDsKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFF0TWV0aG9k
TWF0Y2hEYXRhIGN1cnJlbnRNYXRjaChtYXRjaERpc3RhbmNlLCBpbmRleCwgdHlwZXMsIGFyZ3Mp
OworICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAg
IGNhbmRpZGF0ZXMuYXBwZW5kKGN1cnJlbnRNYXRjaCk7CisgICAgICAgICAgICBlbHNlIHsKKyAg
ICAgICAgICAgICAgICBRdE1ldGhvZE1hdGNoRGF0YSBiZXN0TWF0Y2hTb0ZhciA9IGNhbmRpZGF0
ZXMuYXQoMCk7CisgICAgICAgICAgICAgICAgaWYgKChhcmdzLmNvdW50KCkgPiBiZXN0TWF0Y2hT
b0Zhci5hcmdzLmNvdW50KCkpCisgICAgICAgICAgICAgICAgICAgIHx8ICgoYXJncy5jb3VudCgp
ID09IGJlc3RNYXRjaFNvRmFyLmFyZ3MuY291bnQoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYg
KG1hdGNoRGlzdGFuY2UgPD0gYmVzdE1hdGNoU29GYXIubWF0Y2hEaXN0YW5jZSkpKSB7CisgICAg
ICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHJlcGVuZChjdXJyZW50TWF0Y2gpOworICAgICAg
ICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLmFwcGVuZChj
dXJyZW50TWF0Y2gpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAg
ICAgY29udmVyc2lvbkZhaWxlZC5hcHBlbmQoaW5kZXgpOworICAgICAgICB9CisKKyAgICAgICAg
aWYgKCFvdmVybG9hZHMpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoY2hv
c2VuSW5kZXggPT0gLTEgJiYgIWNhbmRpZGF0ZXMuY291bnQoKSkgeworICAgICAgICAvLyBObyB2
YWxpZCBmdW5jdGlvbnMgYXQgYWxsIC0gZm9ybWF0IGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgICAg
aWYgKCFjb252ZXJzaW9uRmFpbGVkLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgUVN0cmluZyBt
ZXNzYWdlID0gUVN0cmluZzo6ZnJvbUxhdGluMSgiaW5jb21wYXRpYmxlIHR5cGUgb2YgYXJndW1l
bnQocykgaW4gY2FsbCB0byAlMCgpOyBjYW5kaWRhdGVzIHdlcmVcbiIpCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAuYXJnKFFMYXRpbjFTdHJpbmcoc2lnbmF0dXJlKSk7CisgICAgICAg
ICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnZlcnNpb25GYWlsZWQuc2l6ZSgpOyArK2kpIHsK
KyAgICAgICAgICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Ug
Kz0gUUxhdGluMVN0cmluZygiXG4iKTsKKyAgICAgICAgICAgICAgICBRTWV0YU1ldGhvZCBtdGQg
PSBtZXRhLT5tZXRob2QoY29udmVyc2lvbkZhaWxlZC5hdChpKSk7CisgICAgICAgICAgICAgICAg
bWVzc2FnZSArPSBRU3RyaW5nOjpmcm9tTGF0aW4xKCIgICAgJTAiKS5hcmcoUVN0cmluZzo6ZnJv
bUxhdGluMShtdGQuc2lnbmF0dXJlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBF
cnJvciA9IFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6VHlwZUVycm9yLCBtZXNzYWdlLnRv
TGF0aW4xKCkuY29uc3REYXRhKCkpOworICAgICAgICB9IGVsc2UgaWYgKCF1bnJlc29sdmVkLmlz
RW1wdHkoKSkgeworICAgICAgICAgICAgUXRNZXRob2RNYXRjaERhdGEgYXJnc0luc3RhbmNlID0g
dW5yZXNvbHZlZC5maXJzdCgpOworICAgICAgICAgICAgaW50IHVucmVzb2x2ZWRJbmRleCA9IGFy
Z3NJbnN0YW5jZS5maXJzdFVucmVzb2x2ZWRJbmRleCgpOworICAgICAgICAgICAgUV9BU1NFUlQo
dW5yZXNvbHZlZEluZGV4ICE9IC0xKTsKKyAgICAgICAgICAgIFF0TWV0aG9kTWF0Y2hUeXBlIHVu
cmVzb2x2ZWRUeXBlID0gYXJnc0luc3RhbmNlLnR5cGVzLmF0KHVucmVzb2x2ZWRJbmRleCk7Cisg
ICAgICAgICAgICBRU3RyaW5nIG1lc3NhZ2UgPSBRU3RyaW5nOjpmcm9tTGF0aW4xKCJjYW5ub3Qg
Y2FsbCAlMCgpOiB1bmtub3duIHR5cGUgYCUxJyIpCisgICAgICAgICAgICAgICAgLmFyZyhRU3Ry
aW5nOjpmcm9tTGF0aW4xKHNpZ25hdHVyZSkpCisgICAgICAgICAgICAgICAgLmFyZyhRTGF0aW4x
U3RyaW5nKHVucmVzb2x2ZWRUeXBlLm5hbWUoKSkpOworICAgICAgICAgICAgcEVycm9yID0gVjhQ
cm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpUeXBlRXJyb3IsIG1lc3NhZ2UudG9MYXRpbjEoKS5j
b25zdERhdGEoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBRU3RyaW5nIG1lc3Nh
Z2UgPSBRU3RyaW5nOjpmcm9tTGF0aW4xKCJ0b28gZmV3IGFyZ3VtZW50cyBpbiBjYWxsIHRvICUw
KCk7IGNhbmRpZGF0ZXMgYXJlXG4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFy
ZyhRTGF0aW4xU3RyaW5nKHNpZ25hdHVyZSkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7
IGkgPCB0b29GZXdBcmdzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPiAw
KQorICAgICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IFFMYXRpbjFTdHJpbmcoIlxuIik7Cisg
ICAgICAgICAgICAgICAgUU1ldGFNZXRob2QgbXRkID0gbWV0YS0+bWV0aG9kKHRvb0Zld0FyZ3Mu
YXQoaSkpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gUVN0cmluZzo6ZnJvbUxhdGluMSgi
ICAgICUwIikuYXJnKFFTdHJpbmc6OmZyb21MYXRpbjEobXRkLnNpZ25hdHVyZSgpKSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBwRXJyb3IgPSBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJv
eHk6OlN5bnRheEVycm9yLCBtZXNzYWdlLnRvTGF0aW4xKCkuY29uc3REYXRhKCkpOworICAgICAg
ICB9CisgICAgfQorCisgICAgaWYgKGNob3NlbkluZGV4ID09IC0xICYmIGNhbmRpZGF0ZXMuY291
bnQoKSA+IDApIHsKKyAgICAgICAgUXRNZXRob2RNYXRjaERhdGEgYmVzdE1hdGNoID0gY2FuZGlk
YXRlcy5hdCgwKTsKKyAgICAgICAgaWYgKChjYW5kaWRhdGVzLnNpemUoKSA+IDEpCisgICAgICAg
ICAgICAmJiAoYmVzdE1hdGNoLmFyZ3MuY291bnQoKSA9PSBjYW5kaWRhdGVzLmF0KDEpLmFyZ3Mu
Y291bnQoKSkKKyAgICAgICAgICAgICYmIChiZXN0TWF0Y2gubWF0Y2hEaXN0YW5jZSA9PSBjYW5k
aWRhdGVzLmF0KDEpLm1hdGNoRGlzdGFuY2UpKSB7CisgICAgICAgICAgICAvLyBhbWJpZ3VvdXMg
Y2FsbAorICAgICAgICAgICAgUVN0cmluZyBtZXNzYWdlID0gUVN0cmluZzo6ZnJvbUxhdGluMSgi
YW1iaWd1b3VzIGNhbGwgb2Ygb3ZlcmxvYWRlZCBmdW5jdGlvbiAlMCgpOyBjYW5kaWRhdGVzIHdl
cmVcbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcmcoUUxhdGluMVN0cmlu
ZyhzaWduYXR1cmUpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FuZGlkYXRl
cy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgIC8vIE9ubHkgY2FuZGlkYXRlIGZvciBv
dmVybG9hZCBpZiBhcmd1bWVudCBjb3VudCBhbmQgbWF0Y2ggZGlzdGFuY2UgaXMgc2FtZSBhcyBi
ZXN0IG1hdGNoCisgICAgICAgICAgICAgICAgaWYgKGNhbmRpZGF0ZXMuYXQoaSkuYXJncy5jb3Vu
dCgpID09IGJlc3RNYXRjaC5hcmdzLmNvdW50KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgY2Fu
ZGlkYXRlcy5hdChpKS5tYXRjaERpc3RhbmNlID09IGJlc3RNYXRjaC5tYXRjaERpc3RhbmNlKSB7
CisgICAgICAgICAgICAgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgICAg
IG1lc3NhZ2UgKz0gUUxhdGluMVN0cmluZygiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgUU1l
dGFNZXRob2QgbXRkID0gbWV0YS0+bWV0aG9kKGNhbmRpZGF0ZXMuYXQoaSkuaW5kZXgpOworICAg
ICAgICAgICAgICAgICAgICBtZXNzYWdlICs9IFFTdHJpbmc6OmZyb21MYXRpbjEoIiAgICAlMCIp
LmFyZyhRU3RyaW5nOjpmcm9tTGF0aW4xKG10ZC5zaWduYXR1cmUoKSkpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBFcnJvciA9IFY4UHJveHk6OnRocm93
RXJyb3IoVjhQcm94eTo6VHlwZUVycm9yLCBtZXNzYWdlLnRvTGF0aW4xKCkuY29uc3REYXRhKCkp
OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hvc2VuSW5kZXggPSBiZXN0TWF0Y2gu
aW5kZXg7CisgICAgICAgICAgICBhcmdzID0gYmVzdE1hdGNoLmFyZ3M7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBpZiAoY2hvc2VuSW5kZXggIT0gLTEpIHsKKyAgICAgICAgLyogQ29weSB0aGUg
c3R1ZmYgb3ZlciAqLworICAgICAgICBpbnQgaTsKKyAgICAgICAgdmFycy5yZXNpemUoYXJncy5j
b3VudCgpKTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyZ3MuY291bnQoKTsgaSsrKSB7Cisg
ICAgICAgICAgICB2YXJzW2ldID0gYXJnc1tpXTsKKyAgICAgICAgICAgIHZ2YXJzW2ldID0gdmFy
c1tpXS5kYXRhKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gY2hvc2VuSW5kZXg7
Cit9CisKKy8vIFNpZ25hbHMgYXJlIG5vdCBmdXp6eSBtYXRjaGVkIGFzIG11Y2ggYXMgbWV0aG9k
cworc3RhdGljIGludCBmaW5kU2lnbmFsSW5kZXgoY29uc3QgUU1ldGFPYmplY3QqIG1ldGEsIGlu
dCBpbml0aWFsSW5kZXgsIFFCeXRlQXJyYXkgc2lnbmF0dXJlKQoreworICAgIGludCBpbmRleCA9
IGluaXRpYWxJbmRleDsKKyAgICBRTWV0YU1ldGhvZCBtZXRob2QgPSBtZXRhLT5tZXRob2QoaW5k
ZXgpOworICAgIGJvb2wgb3ZlcmxvYWRzID0gIXNpZ25hdHVyZS5jb250YWlucygnKCcpOworICAg
IGlmIChvdmVybG9hZHMgJiYgKG1ldGhvZC5hdHRyaWJ1dGVzKCkgJiBRTWV0YU1ldGhvZDo6Q2xv
bmVkKSkgeworICAgICAgICAvLyBmaW5kIHRoZSBtb3N0IGdlbmVyYWwgbWV0aG9kCisgICAgICAg
IGRvIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IG1ldGEtPm1ldGhvZCgtLWluZGV4KTsKKyAgICAg
ICAgfSB3aGlsZSAobWV0aG9kLmF0dHJpYnV0ZXMoKSAmIFFNZXRhTWV0aG9kOjpDbG9uZWQpOwor
ICAgIH0KKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK1F0UnVudGltZU1ldGFNZXRob2Q6OlF0UnVu
dGltZU1ldGFNZXRob2QoUXRJbnN0YW5jZSogaW5zdCwgaW50IGluZGV4LCBjb25zdCBRQnl0ZUFy
cmF5JiBzaWduYXR1cmUsIGJvb2wgYWxsb3dQcml2YXRlKQorICAgIDogUXRSdW50aW1lTWV0aG9k
IChuZXcgUXRSdW50aW1lTWV0YU1ldGhvZERhdGEoKSwgaW5zdCkKK3sKKyAgICBRV19EKFF0UnVu
dGltZU1ldGFNZXRob2QpOworICAgIGQtPm1fc2lnbmF0dXJlID0gc2lnbmF0dXJlOworICAgIGQt
Pm1faW5kZXggPSBpbmRleDsKKyAgICBkLT5tX2Nvbm5lY3QgPSAwOworICAgIGQtPm1fZGlzY29u
bmVjdCA9IDA7CisgICAgZC0+bV9hbGxvd1ByaXZhdGUgPSBhbGxvd1ByaXZhdGU7Cit9CisKKwor
djg6OkhhbmRsZTx2ODo6VmFsdWU+IFF0UnVudGltZU1ldGFNZXRob2Q6OmNhbGwoY29uc3Qgdjg6
OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5Jc0NvbnN0cnVjdENhbGwoKSkKKyAg
ICAgICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKKworICAgIC8vIEdldCBjcHBPYmogCisgICAg
UXRSdW50aW1lTWV0YU1ldGhvZCogbWV0aG9kID0gc3RhdGljX2Nhc3Q8UXRSdW50aW1lTWV0YU1l
dGhvZCo+KHY4OjpFeHRlcm5hbDo6VW53cmFwKGFyZ3MuRGF0YSgpKSk7CisgICAgUXRSdW50aW1l
TWV0YU1ldGhvZERhdGEqIGQgPSBzdGF0aWNfY2FzdDxRdFJ1bnRpbWVNZXRhTWV0aG9kICo+KG1l
dGhvZCktPmRmdW5jKCk7CisKKyAgICAvLyBXZSdyZSBsaW1pdGVkIHRvIDEwIGFyZ3MKKyAgICBp
ZiAoYXJncy5MZW5ndGgoKSA+IDEwKQorICAgICAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgpOwor
CisgICAgUU9iamVjdCogb2JqID0gZC0+bV9pbnN0YW5jZS0+Z2V0T2JqZWN0KCk7CisKKyAgICBp
ZiAob2JqKSB7CisgICAgICAgIFFWYXJMZW5ndGhBcnJheTxRVmFyaWFudCwgMTA+IHZhcmdzOwor
ICAgICAgICB2b2lkKiBxYXJnc1sxMV07CisKKyAgICAgICAgaW50IG1ldGhvZEluZGV4OworICAg
ICAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZXJyb3JPYmo7CisgICAgICAgIGlmICgobWV0aG9k
SW5kZXggPSBmaW5kTWV0aG9kSW5kZXgob2JqLT5tZXRhT2JqZWN0KCksIGQtPm1fc2lnbmF0dXJl
LCBkLT5tX2FsbG93UHJpdmF0ZSwgYXJncywgdmFyZ3MsICh2b2lkICoqKXFhcmdzLCBlcnJvck9i
aikpICE9IC0xKSB7CisgICAgICAgICAgICBpZiAob2JqLT5xdF9tZXRhY2FsbChRTWV0YU9iamVj
dDo6SW52b2tlTWV0YU1ldGhvZCwgbWV0aG9kSW5kZXgsIHFhcmdzKSA+PSAwKQorICAgICAgICAg
ICAgICAgIHJldHVybiB2ODo6VW5kZWZpbmVkKCk7CisKKyAgICAgICAgICAgIGlmICh2YXJnc1sw
XS5pc1ZhbGlkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRRVmFyaWFudFRvVmFs
dWUoZC0+bV9pbnN0YW5jZS0+Y29udGV4dCgpLCB2YXJnc1swXSk7CisgICAgICAgIH0KKworICAg
ICAgICBpZiAoIWVycm9yT2JqLklzRW1wdHkoKSkKKyAgICAgICAgICAgIHJldHVybiBlcnJvck9i
ajsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVjhQcm94eTo6dGhyb3dFcnJvcihWOFBy
b3h5OjpHZW5lcmFsRXJyb3IsICJjYW5ub3QgY2FsbCBmdW5jdGlvbiBvZiBkZWxldGVkIFFPYmpl
Y3QiKTsKKyAgICB9CisKKyAgICAvLyB2b2lkIGZ1bmN0aW9ucyByZXR1cm4gdW5kZWZpbmVkCisg
ICAgcmV0dXJuIHY4OjpVbmRlZmluZWQoKTsKK30KKwordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFF0
UnVudGltZU1ldGFNZXRob2Q6Omxlbmd0aEdldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gcHJv
cG5hbWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pIAoreworICAgIC8vIFF0U2NyaXB0
IGFsd2F5cyByZXR1cm5zIDAKKyAgICByZXR1cm4gdjg6Ok51bWJlcjo6TmV3KDApOworfQorCisK
Ky8vID09PT09PT09PT09PT09PQorCitRTXVsdGlNYXA8UU9iamVjdCosIFF0Q29ubmVjdGlvbk9i
amVjdCo+IFF0UnVudGltZUNvbm5lY3Rpb25NZXRob2Q6OmNvbm5lY3Rpb25zOworCitRdFJ1bnRp
bWVDb25uZWN0aW9uTWV0aG9kOjpRdFJ1bnRpbWVDb25uZWN0aW9uTWV0aG9kKGNvbnN0IGNoYXIq
IG5hbWUsIGJvb2wgaXNDb25uZWN0LCBQYXNzUmVmUHRyPFF0SW5zdGFuY2U+IGluc3QsIGludCBp
bmRleCwgY29uc3QgUUJ5dGVBcnJheSYgc2lnbmF0dXJlKQorICAgIDogUXRSdW50aW1lTWV0aG9k
IChuZXcgUXRSdW50aW1lQ29ubmVjdGlvbk1ldGhvZERhdGEoKSwgaW5zdCkKK3sKKyAgICBRV19E
KFF0UnVudGltZUNvbm5lY3Rpb25NZXRob2QpOworCisgICAgZC0+bV9zaWduYXR1cmUgPSBzaWdu
YXR1cmU7CisgICAgZC0+bV9pbmRleCA9IGluZGV4OworICAgIGQtPm1faXNDb25uZWN0ID0gaXND
b25uZWN0OworfQordjg6OkhhbmRsZTx2ODo6VmFsdWU+IFF0UnVudGltZUNvbm5lY3Rpb25NZXRo
b2Q6OmNhbGwoY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5Jc0Nv
bnN0cnVjdENhbGwoKSkKKyAgICAgICAgcmV0dXJuIHY4OjpIYW5kbGU8djg6OlZhbHVlPigpOwor
CisgICAgLy8gVGFrZSBRdFJ1bnRpbWVDb25uZWN0aW9uTWV0aG9kKiBmcm9tIERhdGEgZmlsZWQK
KyAgICBRdFJ1bnRpbWVDb25uZWN0aW9uTWV0aG9kKiBjb25uZWN0aW9uTWV0aG9kID0gc3RhdGlj
X2Nhc3Q8UXRSdW50aW1lQ29ubmVjdGlvbk1ldGhvZCo+KHY4OjpFeHRlcm5hbDo6VW53cmFwKGFy
Z3MuRGF0YSgpKSk7CisgICAgUXRSdW50aW1lQ29ubmVjdGlvbk1ldGhvZERhdGEqIGQgPSBzdGF0
aWNfY2FzdDxRdFJ1bnRpbWVDb25uZWN0aW9uTWV0aG9kICo+KGNvbm5lY3Rpb25NZXRob2QpLT5k
ZnVuYygpOworCisgICAgUU9iamVjdCogc2VuZGVyID0gZC0+bV9pbnN0YW5jZS0+Z2V0T2JqZWN0
KCk7CisKKyAgICBpZiAoc2VuZGVyKSB7CisgICAgICAgIC8vIHRoaXNPYmplY3QgMmIgcGFzc2Vk
IGFzICd0aGlzJyB0byB0aGUgc2xvdAorICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHRo
aXNPYmplY3Q7CisgICAgICAgIC8vIFNsb3Qgb2JqZWN0L2Z1bmN0aW9uCisgICAgICAgIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gZnVuY09iamVjdDsKKworICAgICAgICAvLyBRdFNjcmlwdCBjaGVj
a3Mgc2lnbmFsbmVzcyBmaXJzdCwgYXJndW1lbnRzIHNlY29uZAorICAgICAgICBpbnQgc2lnbmFs
SW5kZXggPSAtMTsKKworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGluaXRpYWwgaW5kZXggaXMg
YSBzaWduYWwKKyAgICAgICAgUU1ldGFNZXRob2QgbSA9IHNlbmRlci0+bWV0YU9iamVjdCgpLT5t
ZXRob2QoZC0+bV9pbmRleCk7CisgICAgICAgIGlmIChtLm1ldGhvZFR5cGUoKSA9PSBRTWV0YU1l
dGhvZDo6U2lnbmFsKQorICAgICAgICAgICAgc2lnbmFsSW5kZXggPSBmaW5kU2lnbmFsSW5kZXgo
c2VuZGVyLT5tZXRhT2JqZWN0KCksIGQtPm1faW5kZXgsIGQtPm1fc2lnbmF0dXJlKTsKKworICAg
ICAgICBpZiAoc2lnbmFsSW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgIGlmIChhcmdzLkxlbmd0
aCgpID09IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBDYXNlczoKKyAgICAgICAgICAgICAgICAv
LyBteU9iamVjdC5teVNpZ25hbC5jb25uZWN0KG15T2JqZWN0Lm15U2xvdCkgCisgICAgICAgICAg
ICAgICAgLy8gbXlPYmplY3QubXlTaWduYWwuY29ubmVjdChzb21lRnVuY3Rpb24pIAorICAgICAg
ICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgYm9vbCBteVJ1bnRpbWVPYmogPSBRdFJ1bnRp
bWVNZXRhTWV0aG9kOjppc1J1bnRpbWVNZXRhTWV0aG9kKGFyZ3NbMF0pOworCisgICAgICAgICAg
ICAgICAgLy8gSXMgaXQgdmFsaWQgYXJndW1lbnQ/CisgICAgICAgICAgICAgICAgaWYgKCFhcmdz
WzBdLT5Jc0Z1bmN0aW9uKCkgJiYgIW15UnVudGltZU9iaikgCisgICAgICAgICAgICAgICAgICAg
IHJldHVybiBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4UHJveHk6OlR5cGVFcnJvciwgCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgZC0+bV9pc0Nvbm5lY3Q/IAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiUXRNZXRhTWV0aG9kLmNvbm5lY3Q6IHRhcmdldCBpcyBub3QgYSBmdW5j
dGlvbiI6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXRNZXRhTWV0aG9kLmRp
c2Nvbm5lY3Q6IHRhcmdldCBpcyBub3QgYSBmdW5jdGlvbiIpOworCisgICAgICAgICAgICAgICAg
Ly8gV2hlbiAxIHBhcmFtZXRlciBzcGVjaWZpZWQgdGhpcyBvYmplY3QgaXMgcXRJbnN0YW5jZSBv
ciBnbG9iYWwgb2JqZWN0CisgICAgICAgICAgICAgICAgaWYgKG15UnVudGltZU9iaikKKyAgICAg
ICAgICAgICAgICAgICAgdGhpc09iamVjdCA9IGQtPm1faW5zdGFuY2UtPmdldFY4T2JqZWN0KCk7
CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB0aGlzT2JqZWN0ID0g
VjhQcm94eTo6Y3VycmVudENvbnRleHQoKS0+R2xvYmFsKCk7CisgICAgICAgICAgICAgICAgLy8g
R2V0IGZ1bmN0aW9uIG9iamVjdCB0byBjYWxsCisgICAgICAgICAgICAgICAgZnVuY09iamVjdCA9
IGFyZ3NbMF0tPlRvT2JqZWN0KCk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJncy5MZW5n
dGgoKSA+PSAyKSB7CisKKyAgICAgICAgICAgICAgICAvLyBDYXNlczoKKyAgICAgICAgICAgICAg
ICAvLyBteU9iamVjdC5teVNpZ25hbC5jb25uZWN0KG15T2JqZWN0LCBteU9iamVjdC5teVNsb3Qp
IAorICAgICAgICAgICAgICAgIC8vIG15T2JqZWN0Lm15U2lnbmFsLmNvbm5lY3QobXlPYmplY3Qs
ICdteVNsb3QnKSAKKyAgICAgICAgICAgICAgICAvLyBteU9iamVjdC5teVNpZ25hbC5jb25uZWN0
KG90aGVyT2JqZWN0LCBvdGhlckhhbmRsZXIpIAorICAgICAgICAgICAgICAgIC8vIG15T2JqZWN0
Lm15U2lnbmFsLmNvbm5lY3Qob3RoZXJPYmplY3QsICdvdGhlckhhbmRsZXInKSAKKyAgICAgICAg
ICAgICAgICAvLyAxc3QgcGFyYW1ldGVyIGlzIGEgdGFyZ2V0IG9iamVjdAorICAgICAgICAgICAg
ICAgIGlmIChhcmdzWzBdLT5Jc09iamVjdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRo
aXNPYmplY3QgMmIgcGFzc2VkIGFzICd0aGlzJyB0byB0aGUgc2xvdAorICAgICAgICAgICAgICAg
ICAgICB0aGlzT2JqZWN0ID0gYXJnc1swXS0+VG9PYmplY3QoKTsKKworICAgICAgICAgICAgICAg
ICAgICAvLyAybmQgcGFyYW1ldGVyIHNob3VsZCBsZWFkIHRvIGEgZnVuY3Rpb24gb3IgUXRSdW50
aW1lTWV0YU1ldGhvZAorICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1sxXS0+SXNTdHJpbmco
KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9jIHNheXMgc3RyaW5nIGlzIGEgbmFt
ZWQgbWV0aG9kIG9mIHRoaXNPYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiB2ID0gdGhpc09iamVjdC0+R2V0KGFyZ3NbMV0tPlRvU3RyaW5nKCkpOwor
ICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYuSXNFbXB0eSgpIAorICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIHx8ICEoZnVuY09iamVjdCA9IHYtPlRvT2JqZWN0KCkpLT5Jc0Z1bmN0aW9u
KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhUXRSdW50aW1lTWV0YU1ldGhvZDo6
aXNSdW50aW1lTWV0YU1ldGhvZChmdW5jT2JqZWN0KSkgeworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gVjhQcm94eTo6dGhyb3dFcnJvcihWOFByb3h5OjpUeXBlRXJyb3Is
IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGQtPm1faXNDb25uZWN0
PyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF0TWV0YU1l
dGhvZC5jb25uZWN0OiB0YXJnZXQgaXMgbm90IGEgZnVuY3Rpb24iOiAKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF0TWV0YU1ldGhvZC5kaXNjb25uZWN0OiB0
YXJnZXQgaXMgbm90IGEgZnVuY3Rpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzWzFdLT5Jc0Z1bmN0aW9uKCkgfHwgUXRS
dW50aW1lTWV0YU1ldGhvZDo6aXNSdW50aW1lTWV0YU1ldGhvZChhcmdzWzFdKSkKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGZ1bmNPYmplY3QgPSBhcmdzWzFdLT5Ub09iamVjdCgpOworICAgICAg
ICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVjhQcm94
eTo6dGhyb3dFcnJvcihWOFByb3h5OjpUeXBlRXJyb3IsIAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBkLT5tX2lzQ29ubmVjdD8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAiUXRNZXRhTWV0aG9kLmNvbm5lY3Q6IHRhcmdldCBpcyBub3QgYSBmdW5jdGlvbiI6
IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlF0TWV0YU1ldGhvZC5kaXNj
b25uZWN0OiB0YXJnZXQgaXMgbm90IGEgZnVuY3Rpb24iKTsKKworICAgICAgICAgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWOFByb3h5Ojp0aHJvd0Vycm9yKFY4
UHJveHk6OlR5cGVFcnJvciwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZC0+bV9pc0Nv
bm5lY3Q/IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUXRNZXRhTWV0aG9kLmNv
bm5lY3Q6IHRoaXNPYmplY3QgaXMgbm90IGFuIG9iamVjdCI6IAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAiUXRNZXRhTWV0aG9kLmRpc2Nvbm5lY3Q6IHRoaXNPYmplY3QgaXMgbm90
IGFuIG9iamVjdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OnRocm93RXJyb3IoVjhQcm94eTo6R2VuZXJh
bEVycm9yLCAKKyAgICAgICAgICAgICAgICAgICAgICAgIGQtPm1faXNDb25uZWN0PyAKKyAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAiUXRNZXRhTWV0aG9kLmNvbm5lY3Q6IG5vIGFyZ3VtZW50
cyBnaXZlbiI6IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJRdE1ldGFNZXRob2QuZGlz
Y29ubmVjdDogbm8gYXJndW1lbnRzIGdpdmVuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGlmIChkLT5tX2lzQ29ubmVjdCkgeworICAgICAgICAgICAgICAgIC8vIHRvIGNvbm5lY3Qs
IHdlIG5lZWQ6CisgICAgICAgICAgICAgICAgLy8gIHRhcmdldCBvYmplY3QgW2Zyb20gY3Rvcl0K
KyAgICAgICAgICAgICAgICAvLyAgdGFyZ2V0IHNpZ25hbCBpbmRleCBldGMuIFtmcm9tIGN0b3Jd
CisgICAgICAgICAgICAgICAgLy8gIHJlY2VpdmVyIGZ1bmN0aW9uIFtmcm9tIGFyZ3VtZW50c10K
KyAgICAgICAgICAgICAgICAvLyAgcmVjZWl2ZXIgdGhpcyBvYmplY3QgW2Zyb20gYXJndW1lbnRz
XQorICAgICAgICAgICAgICAgIFF0Q29ubmVjdGlvbk9iamVjdCogY29ubiA9IAorICAgICAgICAg
ICAgICAgICAgICBuZXcgUXRDb25uZWN0aW9uT2JqZWN0KAorICAgICAgICAgICAgICAgICAgICAg
ICAgZC0+bV9pbnN0YW5jZSwgCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxJbmRleCwg
CisgICAgICAgICAgICAgICAgICAgICAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0Pjo6TmV3
KHRoaXNPYmplY3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgdjg6OlBlcnNpc3RlbnQ8djg6
Ok9iamVjdD46Ok5ldyhmdW5jT2JqZWN0KSk7CisgICAgICAgICAgICAgICAgYm9vbCBvayA9IFFN
ZXRhT2JqZWN0Ojpjb25uZWN0KHNlbmRlciwgc2lnbmFsSW5kZXgsIGNvbm4sIGNvbm4tPm1ldGFP
YmplY3QoKS0+bWV0aG9kT2Zmc2V0KCkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAg
ICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbm47CisgICAgICAgICAgICAgICAgICAgIFFTdHJp
bmcgbXNnID0gUVN0cmluZyhRTGF0aW4xU3RyaW5nKCJRdE1ldGFNZXRob2QuY29ubmVjdDogZmFp
bGVkIHRvIGNvbm5lY3QgdG8gJTE6OiUyKCkiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAuYXJnKFFMYXRpbjFTdHJpbmcoc2VuZGVyLT5tZXRhT2JqZWN0KCktPmNsYXNzTmFtZSgpKSkK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJnKFFMYXRpbjFTdHJpbmcoZC0+bV9zaWdu
YXR1cmUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFY4UHJveHk6OnRocm93RXJyb3Io
VjhQcm94eTo6R2VuZXJhbEVycm9yLCBtc2cudG9MYXRpbjEoKS5jb25zdERhdGEoKSk7CisgICAg
ICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFN0b3JlIGNvbm5lY3Rpb24KKyAgICAg
ICAgICAgICAgICBjb25uZWN0aW9ucy5pbnNlcnQoc2VuZGVyLCBjb25uKTsKKworICAgICAgICAg
ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBOb3cgdG8gZmluZCBvdXIgcHJldmlvdXMg
Y29ubmVjdGlvbiBvYmplY3QuIEhtbS4KKyAgICAgICAgICAgICAgICBRTGlzdDxRdENvbm5lY3Rp
b25PYmplY3QqPiBjb25ucyA9IGNvbm5lY3Rpb25zLnZhbHVlcyhzZW5kZXIpOworICAgICAgICAg
ICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBmb3JlYWNoIChRdENv
bm5lY3Rpb25PYmplY3QqIGNvbm4sIGNvbm5zKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElz
IHRoaXMgdGhlIHJpZ2h0IGNvbm5lY3Rpb24/CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25u
LT5tYXRjaChzZW5kZXIsIHNpZ25hbEluZGV4LCB0aGlzT2JqZWN0LCBmdW5jT2JqZWN0KSkgewor
ICAgICAgICAgICAgICAgICAgICAgICAgLy8gWWVwLCBkaXNjb25uZWN0IGl0CisgICAgICAgICAg
ICAgICAgICAgICAgICBRTWV0YU9iamVjdDo6ZGlzY29ubmVjdChzZW5kZXIsIHNpZ25hbEluZGV4
LCBjb25uLCBjb25uLT5tZXRhT2JqZWN0KCktPm1ldGhvZE9mZnNldCgpKTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGRlbGV0ZSBjb25uOyAvLyB0aGlzIHdpbGwgYWxzbyByZW1vdmUgaXQgZnJv
bSB0aGUgbWFwCisgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIXJldCkgeworICAgICAgICAgICAgICAgICAg
ICBRU3RyaW5nIG1zZyA9IFFTdHJpbmcoUUxhdGluMVN0cmluZygiUXRNZXRhTWV0aG9kLmRpc2Nv
bm5lY3Q6IGZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gJTE6OiUyKCkiKSkKKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAuYXJnKFFMYXRpbjFTdHJpbmcoc2VuZGVyLT5tZXRhT2JqZWN0KCkt
PmNsYXNzTmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXJnKFFMYXRpbjFT
dHJpbmcoZC0+bV9zaWduYXR1cmUpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFY4UHJv
eHk6OnRocm93RXJyb3IoVjhQcm94eTo6R2VuZXJhbEVycm9yLCBtc2cudG9MYXRpbjEoKS5jb25z
dERhdGEoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVs
c2UgeworICAgICAgICAgICAgUVN0cmluZyBtc2cgPSBRU3RyaW5nKFFMYXRpbjFTdHJpbmcoIlF0
TWV0YU1ldGhvZC4lMTogJTI6OiUzKCkgaXMgbm90IGEgc2lnbmFsIikpCisgICAgICAgICAgICAg
ICAgICAgIC5hcmcoUUxhdGluMVN0cmluZyhkLT5tX2lzQ29ubmVjdCA/ICJjb25uZWN0IjogImRp
c2Nvbm5lY3QiKSkKKyAgICAgICAgICAgICAgICAgICAgLmFyZyhRTGF0aW4xU3RyaW5nKHNlbmRl
ci0+bWV0YU9iamVjdCgpLT5jbGFzc05hbWUoKSkpCisgICAgICAgICAgICAgICAgICAgIC5hcmco
UUxhdGluMVN0cmluZyhkLT5tX3NpZ25hdHVyZSkpOworICAgICAgICAgICAgcmV0dXJuIFY4UHJv
eHk6OnRocm93RXJyb3IoVjhQcm94eTo6VHlwZUVycm9yLCBtc2cudG9MYXRpbjEoKS5jb25zdERh
dGEoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gVjhQcm94eTo6
dGhyb3dFcnJvcihWOFByb3h5OjpHZW5lcmFsRXJyb3IsICJjYW5ub3QgY2FsbCBmdW5jdGlvbiBv
ZiBkZWxldGVkIFFPYmplY3QiKTsKKyAgICB9CisKKyAgICByZXR1cm4gdjg6OlVuZGVmaW5lZCgp
OworfQorCit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gUXRSdW50aW1lQ29ubmVjdGlvbk1ldGhvZDo6
bGVuZ3RoR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBwcm9wbmFtZSwgY29uc3Qgdjg6OkFj
Y2Vzc29ySW5mbyYgaW5mbykgCit7CisgICAgLy8gd2UgaGF2ZSBvbmUgZm9ybWFsIGFyZ3VtZW50
LCBhbmQgb25lIG9wdGlvbmFsCisgICAgcmV0dXJuIHY4OjpOdW1iZXI6Ok5ldygxKTsKK30KKwor
Ly8gPT09PT09PT09PT09PT09CisKK1F0Q29ubmVjdGlvbk9iamVjdDo6UXRDb25uZWN0aW9uT2Jq
ZWN0KFBhc3NSZWZQdHI8UXRJbnN0YW5jZT4gaW5zdGFuY2UsIGludCBzaWduYWxJbmRleCwgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiB0aGlzT2JqZWN0LCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGZ1
bmNPYmplY3QpCisgICAgOiBtX2luc3RhbmNlKGluc3RhbmNlKQorICAgICwgbV9zaWduYWxJbmRl
eChzaWduYWxJbmRleCkKKyAgICAsIG1fb3JpZ2luYWxPYmplY3QobV9pbnN0YW5jZS0+Z2V0T2Jq
ZWN0KCkpCisgICAgLCBtX3RoaXNPYmplY3QodGhpc09iamVjdCkgLy8gT2JqZWN0IHBhc3NlZCBh
cyAndGhpcycgdG8gc2xvdAorICAgICwgbV9mdW5jT2JqZWN0KGZ1bmNPYmplY3QpCit7CisgICAg
c2V0UGFyZW50KG1fb3JpZ2luYWxPYmplY3QpOworfQorCitRdENvbm5lY3Rpb25PYmplY3Q6On5R
dENvbm5lY3Rpb25PYmplY3QoKQoreworICAgIC8vIFJlbW92ZSB1cyBmcm9tIHRoZSBtYXAgb2Yg
YWN0aXZlIGNvbm5lY3Rpb25zCisgICAgUXRSdW50aW1lQ29ubmVjdGlvbk1ldGhvZDo6Y29ubmVj
dGlvbnMucmVtb3ZlKG1fb3JpZ2luYWxPYmplY3QsIHRoaXMpOworfQorCitzdGF0aWMgY29uc3Qg
dWludCBxdF9tZXRhX2RhdGFfUXRDb25uZWN0aW9uT2JqZWN0W10gPSB7CisgICAgICAgMSwgLy8g
cmV2aXNpb24KKyAgICAgICAwLCAvLyBjbGFzc25hbWUKKyAgICAgICAwLCAgICAwLCAvLyBjbGFz
c2luZm8KKyAgICAgICAxLCAgIDEwLCAvLyBtZXRob2RzCisgICAgICAgMCwgICAgMCwgLy8gcHJv
cGVydGllcworICAgICAgIDAsICAgIDAsIC8vIGVudW1zL3NldHMKKyAgICAgICAyOCwgICAyNywg
ICAyNywgICAyNywgMHgwYSwgLy8gc2xvdHM6IHNpZ25hdHVyZSwgcGFyYW1ldGVycywgdHlwZSwg
dGFnLCBmbGFncworICAgICAgIDAgLy8gZW9kCit9OworCitzdGF0aWMgY29uc3QgY2hhciBxdF9t
ZXRhX3N0cmluZ2RhdGFfUXRDb25uZWN0aW9uT2JqZWN0W10gPSB7CisgICAgInY4OjpCaW5kaW5n
czo6UXRDb25uZWN0aW9uT2JqZWN0XDBcMGV4ZWN1dGUoKVwwIgorfTsKKworY29uc3QgUU1ldGFP
YmplY3QgUXRDb25uZWN0aW9uT2JqZWN0OjpzdGF0aWNNZXRhT2JqZWN0ID0geworICAgIHsgJlFP
YmplY3Q6OnN0YXRpY01ldGFPYmplY3QsIHF0X21ldGFfc3RyaW5nZGF0YV9RdENvbm5lY3Rpb25P
YmplY3QsCisgICAgICBxdF9tZXRhX2RhdGFfUXRDb25uZWN0aW9uT2JqZWN0LCAwIH0KK307CisK
K2NvbnN0IFFNZXRhT2JqZWN0ICpRdENvbm5lY3Rpb25PYmplY3Q6Om1ldGFPYmplY3QoKSBjb25z
dAoreworICAgIHJldHVybiAmc3RhdGljTWV0YU9iamVjdDsKK30KKwordm9pZCogUXRDb25uZWN0
aW9uT2JqZWN0OjpxdF9tZXRhY2FzdChjb25zdCBjaGFyKiBjbG5hbWUpCit7CisgICAgaWYgKCFj
bG5hbWUpIAorICAgICAgICByZXR1cm4gMDsKKyAgICBpZiAoIXN0cmNtcChjbG5hbWUsIHF0X21l
dGFfc3RyaW5nZGF0YV9RdENvbm5lY3Rpb25PYmplY3QpKQorICAgICAgICByZXR1cm4gc3RhdGlj
X2Nhc3Q8dm9pZCo+KGNvbnN0X2Nhc3Q8UXRDb25uZWN0aW9uT2JqZWN0Kj4odGhpcykpOworICAg
IHJldHVybiBRT2JqZWN0OjpxdF9tZXRhY2FzdChjbG5hbWUpOworfQorCitpbnQgUXRDb25uZWN0
aW9uT2JqZWN0OjpxdF9tZXRhY2FsbChRTWV0YU9iamVjdDo6Q2FsbCBjLCBpbnQgaWQsIHZvaWQq
KiBhKQoreworICAgIGlkID0gUU9iamVjdDo6cXRfbWV0YWNhbGwoYywgaWQsIGEpOworICAgIGlm
IChpZCA8IDApCisgICAgICAgIHJldHVybiBpZDsKKyAgICBpZiAoYyA9PSBRTWV0YU9iamVjdDo6
SW52b2tlTWV0YU1ldGhvZCkgeworICAgICAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIGNhc2Ug
MDogZXhlY3V0ZShhKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWQgLT0gMTsKKyAgICB9
CisgICAgcmV0dXJuIGlkOworfQorCit2b2lkIFF0Q29ubmVjdGlvbk9iamVjdDo6ZXhlY3V0ZSh2
b2lkICoqYXJndikKK3sKKyAgICBRT2JqZWN0KiBvYmogPSBtX2luc3RhbmNlLT5nZXRPYmplY3Qo
KTsKKyAgICBpZiAoIW9iaikgeworICAgICAgICAvLyBBIHN0cmFuZ2UgcGxhY2UgdG8gYmUgLSBh
IGRlbGV0ZWQgb2JqZWN0IGVtaXR0ZWQgYSBzaWduYWwgaGVyZS4KKyAgICAgICAgcVdhcm5pbmco
KSA8PCAic2VuZGVyIGRlbGV0ZWQsIGNhbm5vdCBkZWxpdmVyIHNpZ25hbCI7CisgICAgICAgIHJl
dHVybjsKKyAgICB9CisKKyAgICBjb25zdCBRTWV0YU9iamVjdCogbWV0YSA9IG9iai0+bWV0YU9i
amVjdCgpOworICAgIGNvbnN0IFFNZXRhTWV0aG9kIG1ldGhvZCA9IG1ldGEtPm1ldGhvZChtX3Np
Z25hbEluZGV4KTsKKworICAgIFFMaXN0PFFCeXRlQXJyYXk+IHBhcmFtZXRlclR5cGVzID0gbWV0
aG9kLnBhcmFtZXRlclR5cGVzKCk7CisgICAgaW50IGFyZ2MgPSBwYXJhbWV0ZXJUeXBlcy5jb3Vu
dCgpOworCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkNvbnRleHQ+IGNvbnRleHQgPSBtX2luc3Rh
bmNlLT5jb250ZXh0KCk7CisgICAgaWYgKGNvbnRleHQuSXNFbXB0eSgpKSAKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gU2V0IHByb3BlciBjb250ZXh0CisgICAgdjg6OkhhbmRsZVNjb3BlIGhh
bmRsZXNjb3BlOworICAgIHY4OjpDb250ZXh0OjpTY29wZSBjb254dGV4dHNjb3BlKGNvbnRleHQp
OworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZ2xvYmFsb2JqID0gY29udGV4dC0+R2xvYmFs
KCk7CisgICAgaWYgKGdsb2JhbG9iai0+SXNOdWxsKCkpIAorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBCdWlsZCB0aGUgYXJndW1lbnQgbGlzdCAodXAgdG8gdGhlIGZvcm1hbCBhcmd1bWVudCBs
ZW5ndGggb2YgdGhlIHNsb3QpCisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGFyZ3NbMTBdOwor
ICAgIC8vICMjIyBEcm9wQWxsTG9ja3M/CisgICAgaW50IGZ1bmNBcmdDID0gbV9mdW5jT2JqZWN0
LT5HZXQodjg6OlN0cmluZzo6TmV3KCJsZW5ndGgiKSktPlRvSW50ZWdlcigpLT5WYWx1ZSgpOwor
CisgICAgaW50IGFyZ1RvdGFsID0gcU1heChmdW5jQXJnQywgYXJnYyk7CisgICAgZm9yIChpbnQg
aSA9IDA7IGkgPCBhcmdUb3RhbDsgaSsrKSB7CisgICAgICAgIGlmIChpIDwgYXJnYykgeworICAg
ICAgICAgICAgaW50IGFyZ1R5cGUgPSBRTWV0YVR5cGU6OnR5cGUocGFyYW1ldGVyVHlwZXMuYXQo
aSkpOworICAgICAgICAgICAgYXJnc1tpXSA9IGNvbnZlcnRRVmFyaWFudFRvVmFsdWUoY29udGV4
dCwgUVZhcmlhbnQoYXJnVHlwZSwgYXJndltpKzFdKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAg
ICAgICAgICBhcmdzW2ldID0gdjg6OlVuZGVmaW5lZCgpOworICAgICAgICB9CisgICAgfQorICAg
IGJvb2wgcnVudGltZU1laG9kID0gUXRSdW50aW1lTWV0YU1ldGhvZDo6aXNSdW50aW1lTWV0YU1l
dGhvZChtX2Z1bmNPYmplY3QpOworICAgIC8vIFN0dWZmIGluIHRoZSBfX3F0X3NlbmRlciBwcm9w
ZXJ0eSwgaWYgd2UgY2FuCisgICAgaWYgKG1fZnVuY09iamVjdC0+SXNGdW5jdGlvbigpIHx8IHJ1
bnRpbWVNZWhvZCkgeworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHNlbmRlck9iaiA9
IAorICAgICAgICAgICAgUXRJbnN0YW5jZTo6Z2V0UXRJbnN0YW5jZShzZW5kZXIoKSwgY29udGV4
dCwgUVN0cmluZygiX19xdF9zZW5kZXJfXyIpLCBRU2NyaXB0RW5naW5lOjpRdE93bmVyc2hpcCkt
PmdldFY4T2JqZWN0KCk7CisgICAgICAgIHY4OjpIYW5kbGU8djg6OlN0cmluZz4gcXZhciA9IHY4
OjpTdHJpbmc6Ok5ldygiX19xdF9zZW5kZXJfXyIpOworICAgICAgICB2ODo6SGFuZGxlPHY4OjpD
b250ZXh0PiBjYWxsaW5nID0gdjg6OkNvbnRleHQ6OkdldENhbGxpbmcoKTsKKworICAgICAgICAv
LyBDaGVjayB0aGUgY29udGV4dCB0aGUgc2lnbmFsIHdhcyBvcmlnaW5hdGVkIGZyb206IEpTIG9y
IEMrKworICAgICAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGdsb2JhbCA9IGNhbGxpbmcuSXNF
bXB0eSgpID8gY29udGV4dC0+R2xvYmFsKCkgOiBjYWxsaW5nLT5HbG9iYWwoKTsKKworICAgICAg
ICAvLyBTdG9yZSBfX3F0X3NlbmRlcl9fIGluIHdpbmRvdyBvYmplY3QgaWYgcG9zc2libGUgLSBz
dXBwb3J0IGlzb2xhdGVkIGVudmlyb25tZW50Li4uCisgICAgICAgIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiB3aW5kb3cgPSBnbG9iYWwtPkdldCh2ODo6U3RyaW5nOjpOZXcoIndpbmRvdyIpKTsKKyAg
ICAgICAgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBkZXN0OworICAgICAgICBpZiAod2luZG93Lklz
RW1wdHkoKSB8fCAhd2luZG93LT5Jc09iamVjdCgpKQorICAgICAgICAgICAgZGVzdCA9IGdsb2Jh
bDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZGVzdCA9IHdpbmRvdy0+VG9PYmplY3QoKTsK
KworICAgICAgICBkZXN0LT5TZXQocXZhciwgc2VuZGVyT2JqKTsKKyAgICAgICAgeworICAgICAg
ICAgICAgbV9mdW5jT2JqZWN0LkFzPHY4OjpGdW5jdGlvbj4oKS0+Q2FsbChtX3RoaXNPYmplY3Qs
IGFyZ1RvdGFsLCBhcmdzKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNo
b3VsZCBub3QgYmUgaGVyZS4uLiBldmVyPworICAgICAgICBBU1NFUlQoMCk7CisgICAgfQorfQor
CitpbmxpbmUgYm9vbCBRdENvbm5lY3Rpb25PYmplY3Q6Om1hdGNoKFFPYmplY3QqIHNlbmRlciwg
aW50IHNpZ25hbEluZGV4LCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHRoaXNPYmplY3QsIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gZnVuY09iamVjdCkKK3sKKyAgICByZXR1cm4gbV9vcmlnaW5hbE9i
amVjdCA9PSBzZW5kZXIgJiYgbV9zaWduYWxJbmRleCA9PSBzaWduYWxJbmRleAorICAgICAgICAm
JiB0aGlzT2JqZWN0LT5HZXRJZGVudGl0eUhhc2goKSA9PSBtX3RoaXNPYmplY3QtPkdldElkZW50
aXR5SGFzaCgpCisgICAgICAgICYmIGZ1bmNPYmplY3QtPkdldElkZW50aXR5SGFzaCgpID09IG1f
ZnVuY09iamVjdC0+R2V0SWRlbnRpdHlIYXNoKCk7Cit9CisKKy8vID09PT09PT09PT09PT09PQor
Cit9IH0KSW5kZXg6IFdlYkNvcmUvYnJpZGdlL3F0L3Y4L3F0X3J1bnRpbWV2OC5oDQo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09DQotLS0gV2ViQ29yZS9icmlkZ2UvcXQvdjgvcXRfcnVudGltZXY4LmgJKHJldmlzaW9uIDAp
DQorKysgV2ViQ29yZS9icmlkZ2UvcXQvdjgvcXRfcnVudGltZXY4LmgJKHJldmlzaW9uIDApDQpA
QCAtMCwwICsxLDE2MyBAQA0KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9y
YXRpb24gYW5kL29yIGl0cyBzdWJzaWRpYXJ5KC1pZXMpCisgKgorICogIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisg
KiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24p
IGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlm
IG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBV
U0EKKyAqCisgKi8KKworI2lmbmRlZiBxdF9ydW50aW1ldjhfaAorI2RlZmluZSBxdF9ydW50aW1l
djhfaAorCisjaW5jbHVkZSAicXRfaW5zdGFuY2V2OC5oIgorI2luY2x1ZGUgInY4LmgiCisjaW5j
bHVkZSA8cWJ5dGVhcnJheS5oPgorI2luY2x1ZGUgPHFtZXRhb2JqZWN0Lmg+CisjaW5jbHVkZSA8
cXBvaW50ZXIuaD4KKyNpbmNsdWRlIDxxdmFyaWFudC5oPgorCituYW1lc3BhY2UgVjggeworbmFt
ZXNwYWNlIEJpbmRpbmdzIHsKKworY2xhc3MgUXRJbnN0YW5jZTsKKworLy8gQmFzZWQgb24gUnVu
dGltZU1ldGhvZAorLy8gRXh0cmEgZGF0YSBjbGFzc2VzICh0byBhdm9pZCB0aGUgQ0VMTF9TSVpF
IGxpbWl0IG9uIEpTIG9iamVjdHMpCitjbGFzcyBRdFJ1bnRpbWVNZXRob2REYXRhIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIHZpcnR1YWwgflF0UnVudGltZU1ldGhvZERhdGEoKTsKKyAgICAgICAg
UmVmUHRyPFF0SW5zdGFuY2U+IG1faW5zdGFuY2U7Cit9OworCitjbGFzcyBRdFJ1bnRpbWVDb25u
ZWN0aW9uTWV0aG9kOworY2xhc3MgUXRSdW50aW1lTWV0YU1ldGhvZERhdGEgOiBwdWJsaWMgUXRS
dW50aW1lTWV0aG9kRGF0YSB7CisgICAgcHVibGljOgorICAgICAgICB+UXRSdW50aW1lTWV0YU1l
dGhvZERhdGEoKTsKKyAgICAgICAgUUJ5dGVBcnJheSBtX3NpZ25hdHVyZTsKKyAgICAgICAgYm9v
bCBtX2FsbG93UHJpdmF0ZTsKKyAgICAgICAgaW50IG1faW5kZXg7CisgICAgICAgIFF0UnVudGlt
ZUNvbm5lY3Rpb25NZXRob2QqIG1fY29ubmVjdDsKKyAgICAgICAgUXRSdW50aW1lQ29ubmVjdGlv
bk1ldGhvZCogbV9kaXNjb25uZWN0OworfTsKKworY2xhc3MgUXRSdW50aW1lQ29ubmVjdGlvbk1l
dGhvZERhdGEgOiBwdWJsaWMgUXRSdW50aW1lTWV0aG9kRGF0YSB7CisgICAgcHVibGljOgorICAg
ICAgICB+UXRSdW50aW1lQ29ubmVjdGlvbk1ldGhvZERhdGEoKTsKKyAgICAgICAgUUJ5dGVBcnJh
eSBtX3NpZ25hdHVyZTsKKyAgICAgICAgaW50IG1faW5kZXg7CisgICAgICAgIGJvb2wgbV9pc0Nv
bm5lY3Q7Cit9OworCisvLyBDb21tb24gYmFzZSBjbGFzcyAoZG9lc24ndCByZWFsbHkgZG8gYW55
dGhpbmcgaW50ZXJlc3RpbmcpCitjbGFzcyBRdFJ1bnRpbWVNZXRob2QgeworcHVibGljOgorICAg
IHZpcnR1YWwgflF0UnVudGltZU1ldGhvZCgpOworICAgIFF0UnVudGltZU1ldGhvZChRdFJ1bnRp
bWVNZXRob2REYXRhICpkZCwgUGFzc1JlZlB0cjxRdEluc3RhbmNlPiBpbnN0KTsKK3Byb3RlY3Rl
ZDoKKyAgICBRdFJ1bnRpbWVNZXRob2REYXRhICpkZnVuYygpIGNvbnN0IHtyZXR1cm4gZF9wdHI7
fQorICAgIFF0UnVudGltZU1ldGhvZERhdGEgKmRfcHRyOworCit9OworCitjbGFzcyBRdFJ1bnRp
bWVNZXRhTWV0aG9kIDogcHVibGljIFF0UnVudGltZU1ldGhvZCB7CitwdWJsaWM6CisgICAgUXRS
dW50aW1lTWV0YU1ldGhvZChRdEluc3RhbmNlKiBpbnN0LCBpbnQgaW5kZXgsIGNvbnN0IFFCeXRl
QXJyYXkmIHNpZ25hdHVyZSwgYm9vbCBhbGxvd1ByaXZhdGUpOworICAgIHN0YXRpYyB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gY2FsbChjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKTsKKyAgICBzdGF0
aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGxlbmd0aEdldHRlcih2ODo6TG9jYWw8djg6OlN0cmlu
Zz4gcHJvcG5hbWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pOworCisgICAgdm9pZCBz
ZXRWOEZ1bmN0aW9uVGVtcGxhdGUodjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+
IGZ1bmNUZW1wbCkge21fdjhGdW5jVGVtcGwgPSBmdW5jVGVtcGw7fQorICAgIHZvaWQgc2V0VjhG
dW5jdGlvbih2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+IGZ1bmMpIHttX3Y4RnVuYyA9IGZ1
bmM7fQorICAgIHZvaWQgc2V0VjhPYmplY3Qodjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gb2Jq
KSB7bV92OE9iaiA9IG9iajt9CisKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1w
bGF0ZT4gZ2V0VjhGdW5jdGlvblRlbXBsYXRlKCkgY29uc3Qge3JldHVybiBtX3Y4RnVuY1RlbXBs
O30KKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+IGdldFY4RnVuY3Rpb24oKSB7cmV0
dXJuIG1fdjhGdW5jO30KKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6T2JqZWN0PiBnZXRWOE9iamVj
dCgpIHtyZXR1cm4gbV92OE9iajsgfQorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IGdl
dFY4V3JhcHBlcigpIHtyZXR1cm4gbV92OEZ1bmM7fQorICAgIGludCBnZXRMZW5ndGgoKSB7IHY4
OjpIYW5kbGVTY29wZSBoYW5kbGVfc2NvcGU7IHJldHVybiBtX3Y4T2JqLT5HZXQodjg6OlN0cmlu
Zzo6TmV3KCJsZW5ndGgiKSktPlRvSW50ZWdlcigpLT5WYWx1ZSgpOyB9CisgICAgCisgICAgc3Rh
dGljIGJvb2wgaXNSdW50aW1lTWV0YU1ldGhvZCh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gbSkgCisg
ICAgeworICAgICAgICBpZiAoIW0tPklzRnVuY3Rpb24oKSAmJiAhbS0+SXNPYmplY3QoKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZh
bCA9IG0tPlRvT2JqZWN0KCktPkdldEhpZGRlblZhbHVlKHY4OjpTdHJpbmc6Ok5ldygiX19xdF9o
aWRkZW5fbWFya2VyX18iKSk7CisgICAgICAgIHJldHVybiAhdmFsLklzRW1wdHkoKTsKKyAgICB9
CisgICAgUXRSdW50aW1lTWV0YU1ldGhvZERhdGEqIGRmdW5jKCkgY29uc3Qge3JldHVybiByZWlu
dGVycHJldF9jYXN0PFF0UnVudGltZU1ldGFNZXRob2REYXRhKj4oZF9wdHIpO30KK3ByaXZhdGU6
CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IG1fdjhGdW5jVGVtcGw7
CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uPiBtX3Y4RnVuYzsKKyAgICB2ODo6UGVy
c2lzdGVudDx2ODo6T2JqZWN0PiBtX3Y4T2JqOworCit9OworCitjbGFzcyBRdENvbm5lY3Rpb25P
YmplY3Q7CisKK2NsYXNzIFF0UnVudGltZUNvbm5lY3Rpb25NZXRob2QgOiBwdWJsaWMgUXRSdW50
aW1lTWV0aG9kIHsKK3B1YmxpYzoKKyAgICBRdFJ1bnRpbWVDb25uZWN0aW9uTWV0aG9kKGNvbnN0
IGNoYXIqIG5hbWUsIGJvb2wgaXNDb25uZWN0LCBQYXNzUmVmUHRyPFF0SW5zdGFuY2U+IGluc3Qs
IGludCBpbmRleCwgY29uc3QgUUJ5dGVBcnJheSYgc2lnbmF0dXJlKTsKKyAgICBzdGF0aWMgdjg6
OkhhbmRsZTx2ODo6VmFsdWU+IGNhbGwoY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncyk7CisgICAg
c3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBsZW5ndGhHZXR0ZXIodjg6OkxvY2FsPHY4OjpT
dHJpbmc+IHByb3BuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKTsKKworICAgIHZv
aWQgc2V0VjhGdW5jdGlvblRlbXBsYXRlKHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBs
YXRlPiBmdW5jVGVtcGwpIHsgbV92OEZ1bmNUZW1wbCA9IGZ1bmNUZW1wbDsgfQorICAgIHZvaWQg
c2V0VjhGdW5jdGlvbih2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+IGZ1bmMpIHsgbV92OEZ1
bmMgPSBmdW5jOyB9CisgICAgdm9pZCBzZXRWOE9iamVjdCh2ODo6UGVyc2lzdGVudDx2ODo6T2Jq
ZWN0PiBvYmopIHsgbV92OE9iaiA9IG9iajsgfQorCisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1
bmN0aW9uVGVtcGxhdGU+IGdldFY4RnVuY3Rpb25UZW1wbGF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1f
djhGdW5jVGVtcGw7IH0KKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb24+IGdldFY4RnVu
Y3Rpb24oKSB7IHJldHVybiBtX3Y4RnVuYzsgfQorICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpPYmpl
Y3Q+IGdldFY4T2JqZWN0KCkgeyByZXR1cm4gbV92OE9iajsgfQorICAgIHY4OjpQZXJzaXN0ZW50
PHY4OjpPYmplY3Q+IGdldFY4V3JhcHBlcigpIHsgcmV0dXJuIG1fdjhGdW5jOyB9CisgICAgaW50
IGdldExlbmd0aCgpIHsgcmV0dXJuIG1fdjhPYmotPkdldCh2ODo6U3RyaW5nOjpOZXcoImxlbmd0
aCIpKS0+VG9JbnRlZ2VyKCktPlZhbHVlKCk7IH0KKworcHJvdGVjdGVkOgorICAgIFF0UnVudGlt
ZUNvbm5lY3Rpb25NZXRob2REYXRhKiBkZnVuYygpIGNvbnN0IHtyZXR1cm4gcmVpbnRlcnByZXRf
Y2FzdDxRdFJ1bnRpbWVDb25uZWN0aW9uTWV0aG9kRGF0YSo+KGRfcHRyKTt9Citwcml2YXRlOgor
ICAgIHN0YXRpYyBRTXVsdGlNYXA8UU9iamVjdCAqLCBRdENvbm5lY3Rpb25PYmplY3QgKj4gY29u
bmVjdGlvbnM7CisgICAgZnJpZW5kIGNsYXNzIFF0Q29ubmVjdGlvbk9iamVjdDsKKworICAgIHY4
OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBtX3Y4RnVuY1RlbXBsOworICAgIHY4
OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvbj4gbV92OEZ1bmM7CisgICAgdjg6OlBlcnNpc3RlbnQ8
djg6Ok9iamVjdD4gbV92OE9iajsKK307CisKK2NsYXNzIFF0Q29ubmVjdGlvbk9iamVjdDogcHVi
bGljIFFPYmplY3QgeworcHVibGljOgorICAgIC8vIHRoaXNNZXRob2QgY2FuIGJlIGtlcHQgYXMg
Y3BwIG9iamVjdCwgZnVuY09iamVjdCBtdXN0IGJlIHN0b3JlZCBhcyBhIEpTIG9iamVjdCBiL2Mg
CisgICAgLy8gaXQgY291bGQgYmUgZWl0aGVyIHJlcHJlc2VudGF0aW9uIG9mIFF0IG1ldGEtbWV0
aG9kIE9SIEpTIHNpZGUgZnVuY3Rpb24KKyAgICBRdENvbm5lY3Rpb25PYmplY3QoUGFzc1JlZlB0
cjxRdEluc3RhbmNlPiBpbnN0YW5jZSwgaW50IHNpZ25hbEluZGV4LCB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IHRoaXNPYmplY3QsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gZnVuY09iamVjdCk7Cisg
ICAgflF0Q29ubmVjdGlvbk9iamVjdCgpOworCisgICAgc3RhdGljIGNvbnN0IFFNZXRhT2JqZWN0
IHN0YXRpY01ldGFPYmplY3Q7CisgICAgdmlydHVhbCBjb25zdCBRTWV0YU9iamVjdCAqbWV0YU9i
amVjdCgpIGNvbnN0OworICAgIHZpcnR1YWwgdm9pZCAqcXRfbWV0YWNhc3QoY29uc3QgY2hhciAq
KTsKKyAgICB2aXJ0dWFsIGludCBxdF9tZXRhY2FsbChRTWV0YU9iamVjdDo6Q2FsbCwgaW50LCB2
b2lkICoqYXJndik7CisgICAgaW5saW5lIGJvb2wgbWF0Y2goUU9iamVjdCAqc2VuZGVyLCBpbnQg
c2lnbmFsSW5kZXgsIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gdGhpc09iamVjdCwgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiBmdW5jT2JqZWN0KTsKKyAgICAvLyBhY3R1YWwgc2xvdDoKKyAgICB2b2lk
IGV4ZWN1dGUodm9pZCAqKmFyZ3YpOworcHJpdmF0ZToKKyAgICBSZWZQdHI8UXRJbnN0YW5jZT4g
bV9pbnN0YW5jZTsKKyAgICBpbnQgbV9zaWduYWxJbmRleDsKKyAgICBRT2JqZWN0KiBtX29yaWdp
bmFsT2JqZWN0OyAvLyBvbmx5IHVzZWQgYXMgYSBrZXksIG5vdCBkZXJlZmVyZW5jZWQgCitwdWJs
aWM6CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6Ok9iamVjdD4gbV90aGlzT2JqZWN0OworICAgIHY4
OjpQZXJzaXN0ZW50PHY4OjpPYmplY3Q+IG1fZnVuY09iamVjdDsKK307CisKK1FTdHJpbmcgVjhU
b1FTdHJpbmcodjg6OkxvY2FsPHY4OjpTdHJpbmc+IHY4c3RyKTsKK1FWYXJpYW50IGNvbnZlcnRW
YWx1ZVRvUVZhcmlhbnQodjg6OkhhbmRsZTx2ODo6VmFsdWU+IHZhbHVlLCBRTWV0YVR5cGU6OlR5
cGUgaGludCwgaW50ICpkaXN0YW5jZSk7Cit2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29udmVydFFW
YXJpYW50VG9WYWx1ZSh2ODo6UGVyc2lzdGVudDx2ODo6Q29udGV4dD4gY29udGV4dCwgY29uc3Qg
UVZhcmlhbnQmIHZhcmlhbnQpOworCit9IC8vIG5hbWVzcGFjZSBCaW5kaW5ncworfSAvLyBuYW1l
c3BhY2UgSlNDCisKKyNlbmRpZgpJbmRleDogV2ViQ29yZS9DaGFuZ2VMb2cNCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0N
Ci0tLSBXZWJDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gNjY2OTIpDQorKysgV2ViQ29yZS9DaGFu
Z2VMb2cJKHdvcmtpbmcgY29weSkNCkBAIC0xLDMgKzEsMjAgQEANCisyMDEwLTA5LTAyICBWbGFk
IEJ1cmxpayAgPHZvbG9kaW1pci5idXJsaWtAbm9raWEuY29tPgorCisgICAgICAgIFJldmlld2Vk
IGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgIFtRdF0gVjggcG9ydCBmb3IgUVQgcGxhdGZv
cm06IFFUIG1ldGEgc3lzdGVtIHBvcnQuIE5ldyBmaWxlcy4KKyAgICAgICAgaHR0cHM6Ly9idWdz
LndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ1MTUwCisKKyAgICAgICAgVjggcXQgbWV0YSBz
eXN0ZW0gcG9ydC4gUmVpbXBsZW1lbnRlZCBxdCBicmlkZ2UgcnVudGltZSwgaW5zdGFuY2UgYW5k
IAorICAgICAgICBwaXhtYXBydW50aW1lIGNvbXBvbmVudHMuCisKKyAgICAgICAgKiBXZWJDb3Jl
L2JyaWRnZS9xdC92OC9xdF9pbnN0YW5jZXY4LmNwcDoKKyAgICAgICAgKiBXZWJDb3JlL2JyaWRn
ZS9xdC92OC9xdF9pbnN0YW5jZXY4Lmg6CisgICAgICAgICogV2ViQ29yZS9icmlkZ2UvcXQvdjgv
cXRfcGl4bWFwcnVudGltZXY4LmNwcDoKKyAgICAgICAgKiBXZWJDb3JlL2JyaWRnZS9xdC92OC9x
dF9waXhtYXBydW50aW1ldjguaDoKKyAgICAgICAgKiBXZWJDb3JlL2JyaWRnZS9xdC92OC9xdF9y
dW50aW1ldjguY3BwOgorICAgICAgICAqIFdlYkNvcmUvYnJpZGdlL3F0L3Y4L3F0X3J1bnRpbWV2
OC5oOgorCiAyMDEwLTA5LTAyICBBZGFtIExhbmdsZXkgIDxhZ2xAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IEFkYW0gQmFydGguCg==
</data>
<flag name="review"
          id="55476"
          type_id="1"
          status="-"
          setter="kling"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="0"
              isprivate="0"
          >
            <attachid>67972</attachid>
            <date>2010-09-17 16:57:50 -0700</date>
            <delta_ts>2010-09-18 12:39:32 -0700</delta_ts>
            <desc>Review changes. NOT a patch for commit yet.</desc>
            <filename>qt_bridge.zip</filename>
            <type>application/octet-stream</type>
            <size>26037</size>
            <attacher name="Vlad">vladbph</attacher>
            
              <data encoding="base64">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
</data>

          </attachment>
      

    </bug>

</bugzilla>