<?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>78042</bug_id>
          
          <creation_ts>2012-02-07 14:25:10 -0800</creation_ts>
          <short_desc>[BlackBerry] Upstream DumpRenderTreeBlackBerry</short_desc>
          <delta_ts>2012-02-09 08:39:16 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>73144</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Rob Buis">rwlbuis</reporter>
          <assigned_to name="Rob Buis">rwlbuis</assigned_to>
          <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>551394</commentid>
    <comment_count>0</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-07 14:25:10 -0800</bug_when>
    <thetext>Upstream part of our DRT implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551415</commentid>
    <comment_count>1</comment_count>
      <attachid>125932</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-07 14:47:17 -0800</bug_when>
    <thetext>Created attachment 125932
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>551418</commentid>
    <comment_count>2</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-07 14:51:33 -0800</bug_when>
    <thetext>Add Antonio.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552128</commentid>
    <comment_count>3</comment_count>
      <attachid>125932</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-08 08:08:26 -0800</bug_when>
    <thetext>Comment on attachment 125932
Patch

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

please address nits before commiting..

&gt; Tools/DumpRenderTree/blackberry/DumpRenderTree.cpp:69
&gt; +volatile bool done;

can we rename it to indicate the global nature.

g_done?  dDone? also  &quot;done&quot; is a very bad name.

&gt; Tools/DumpRenderTree/blackberry/DumpRenderTree.cpp:195
&gt; +    (m_page-&gt;client())-&gt;notifyRunLayoutTestsFinished();

unneeded wrapping (...) ?

&gt; Tools/DumpRenderTree/blackberry/DumpRenderTree.cpp:213
&gt; +    if (m_currentTest &lt; m_tests.end() - 1) {
&gt; +        m_currentTest++;
&gt; +        if (isHTTPTest(m_currentTest-&gt;utf8().data())) {
&gt; +            m_currentHttpTest = m_currentTest-&gt;utf8().data();
&gt; +            m_currentHttpTest.remove(0, strlen(httpTestSyntax));
&gt; +            runTest(httpPrefixURL + m_currentHttpTest);
&gt; +        } else
&gt; +            runTest(kSDCLayoutTestsURI + *m_currentTest);
&gt; +    } else
&gt; +        doneDrt();

can we early return here?

&gt; Tools/DumpRenderTree/blackberry/DumpRenderTree.cpp:572
&gt; +    if (!done &amp;&amp; gLayoutTestController-&gt;dumpFrameLoadCallbacks())
&gt; +        printf(&quot;%s - didFinishDocumentLoadForFrame\n&quot;, drtFrameDescription(frame).utf8().data());
&gt; +    else if (!done) {

extract !done to an outer if?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552186</commentid>
    <comment_count>4</comment_count>
      <attachid>126096</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-08 09:07:19 -0800</bug_when>
    <thetext>Created attachment 126096
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552272</commentid>
    <comment_count>5</comment_count>
      <attachid>126096</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-08 10:36:06 -0800</bug_when>
    <thetext>Comment on attachment 126096
Patch

Clearing flags on attachment: 126096

Committed r107105: &lt;http://trac.webkit.org/changeset/107105&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552273</commentid>
    <comment_count>6</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2012-02-08 10:36:10 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552302</commentid>
    <comment_count>7</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-08 11:08:02 -0800</bug_when>
    <thetext>Reopening to attach new patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552303</commentid>
    <comment_count>8</comment_count>
      <attachid>126121</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-08 11:08:04 -0800</bug_when>
    <thetext>Created attachment 126121
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552371</commentid>
    <comment_count>9</comment_count>
      <attachid>126121</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-08 12:10:24 -0800</bug_when>
    <thetext>Comment on attachment 126121
Patch

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

&gt; Tools/DumpRenderTree/blackberry/EventSender.cpp:325
&gt; +    for (Vector&lt;BlackBerry::Platform::TouchPoint&gt;::iterator it = touches.begin();
&gt; +         it != touches.end();
&gt; +         ++it) {

bad identation

&gt; Tools/DumpRenderTree/blackberry/WorkQueueItemBlackBerry.cpp:87
&gt; +    return BlackBerry::WebKit::DumpRenderTree::currentInstance()-&gt;page()-&gt;goBackOrForward(m_howFar);

as a follow up we could rename ::currentInstance to ::instance maybe.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552495</commentid>
    <comment_count>10</comment_count>
      <attachid>126153</attachid>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-08 14:29:55 -0800</bug_when>
    <thetext>Created attachment 126153
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553165</commentid>
    <comment_count>11</comment_count>
      <attachid>126153</attachid>
    <who name="Antonio Gomes">tonikitoo</who>
    <bug_when>2012-02-09 07:51:22 -0800</bug_when>
    <thetext>Comment on attachment 126153
Patch

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

&gt; Tools/DumpRenderTree/blackberry/LayoutTestControllerBlackBerry.cpp:266
&gt; +void LayoutTestController::setPrivateBrowsingEnabled(bool flag)
&gt; +{
&gt; +    UNUSED_PARAM(flag);
&gt; +    notImplemented();
&gt; +}

I think we would support this one in a followup :)

&gt; Tools/DumpRenderTree/blackberry/LayoutTestControllerBlackBerry.cpp:470
&gt; +    if (keyStr == &quot;WebKitUsesPageCachePreferenceKey&quot;)
&gt; +        BlackBerry::WebKit::DumpRenderTree::currentInstance()-&gt;page()-&gt;settings()-&gt;setMaximumPagesInCache(1);
&gt; +    else if (keyStr == &quot;WebKitUsePreHTML5ParserQuirks&quot;)
&gt; +        mainFrame-&gt;page()-&gt;settings()-&gt;setUsePreHTML5ParserQuirks(true);
&gt; +    else if (keyStr == &quot;WebKitTabToLinksPreferenceKey&quot;)
&gt; +        DumpRenderTreeSupport::setLinksIncludedInFocusChain(valueStr == &quot;true&quot; || valueStr == &quot;1&quot;);
&gt; +    else if (keyStr == &quot;WebKitHyperlinkAuditingEnabled&quot;)
&gt; +        mainFrame-&gt;page()-&gt;settings()-&gt;setHyperlinkAuditingEnabled(valueStr == &quot;true&quot; || valueStr == &quot;1&quot;);

we could also support the preference needed for spatial navigation tests here too I think

&gt; Tools/DumpRenderTree/blackberry/LayoutTestControllerBlackBerry.cpp:631
&gt; +    if (!mainFrame)
&gt; +        return;
&gt; +    mainFrame-&gt;page()-&gt;settings()-&gt;setAllowFileAccessFromFileURLs(enabled);

newline here for consistency

&gt; Tools/DumpRenderTree/blackberry/LayoutTestControllerBlackBerry.cpp:638
&gt; +void LayoutTestController::setAllowUniversalAccessFromFileURLs(bool enabled)
&gt; +{
&gt; +    if (!mainFrame)
&gt; +        return;
&gt; +    mainFrame-&gt;page()-&gt;settings()-&gt;setAllowUniversalAccessFromFileURLs(enabled);

ditto</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553197</commentid>
    <comment_count>12</comment_count>
    <who name="Rob Buis">rwlbuis</who>
    <bug_when>2012-02-09 08:39:16 -0800</bug_when>
    <thetext>Final part landed as r107247, closing.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>125932</attachid>
            <date>2012-02-07 14:47:17 -0800</date>
            <delta_ts>2012-02-08 09:07:15 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78042-20120207174945.patch</filename>
            <type>text/plain</type>
            <size>41471</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA2OTg4CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDZjOWZmMDQ0OGNjY2JkNzAx
ZTkxNGIxNmY0M2JlNTYwMzhlMDI2YzIuLjBmOGM3Yzg2ZWMwN2MyYzRjOTA4OGIwMDNmMGFjNGFi
ZDU5ZTY5NzIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTItMDItMDcgIFJvYiBCdWlz
ICA8cmJ1aXNAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0gRHVtcFJl
bmRlclRyZWVCbGFja0JlcnJ5CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03ODA0MgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgor
CisgICAgICAgIEFkZCBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIG91ciBEdW1wUmVuZGVyVHJlZSBz
b2x1dGlvbi4KKworICAgICAgICAqIGJsYWNrYmVycnkvQXBpL0R1bXBSZW5kZXJUcmVlQ2xpZW50
Lmg6IEFkZGVkLgorCiAyMDEyLTAyLTA3ICBKYWNreSBKaWFuZyAgPHpoYWppYW5nQHJpbS5jb20+
CiAKICAgICAgICAgW0JsYWNrQmVycnldIFVwc3RyZWFtIEJsYWNrQmVycnkgV2ViQ29yZVN1cHBv
cnQgRGV2aWNlT3JpZW50YXRpb25DbGllbnRCbGFja0JlcnJ5IGFuZCBEZXZpY2VNb3Rpb25DbGll
bnRCbGFja0JlcnJ5IGNsYXNzZXMKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJy
eS9BcGkvRHVtcFJlbmRlclRyZWVDbGllbnQuaCBiL1NvdXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9B
cGkvRHVtcFJlbmRlclRyZWVDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wM2ViNWJiYzU5NGY3NjMyYzgy
MmVkNTI5ZDY0MmQ1ODAwNmJiZDBmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYktpdC9i
bGFja2JlcnJ5L0FwaS9EdW1wUmVuZGVyVHJlZUNsaWVudC5oCkBAIC0wLDAgKzEsODkgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEgUmVzZWFyY2ggSW4gTW90aW9uIExp
bWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3Nl
ciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0
aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRl
ZiBEdW1wUmVuZGVyVHJlZUNsaWVudF9oCisjZGVmaW5lIER1bXBSZW5kZXJUcmVlQ2xpZW50X2gK
KworI2luY2x1ZGUgIkJsYWNrQmVycnlHbG9iYWwuaCIKKworI2luY2x1ZGUgIlBsYXRmb3JtU3Ry
aW5nLmgiCisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSlNPYmplY3RSZWYuaD4KKworbmFtZXNw
YWNlIFdlYkNvcmUgeworY2xhc3MgRnJhbWU7CitjbGFzcyBET01XcmFwcGVyV29ybGQ7CitjbGFz
cyBOYXZpZ2F0aW9uQWN0aW9uOworY2xhc3MgTm9kZTsKK2NsYXNzIFJhbmdlOworY2xhc3MgUmVz
b3VyY2VSZXF1ZXN0OworY2xhc3MgUmVzb3VyY2VSZXNwb25zZTsKK2NsYXNzIFNlY3VyaXR5T3Jp
Z2luOworfQorCituYW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKK2Ns
YXNzIFdlYlBhZ2U7CisKK2NsYXNzIEJMQUNLQkVSUllfRVhQT1JUIER1bXBSZW5kZXJUcmVlQ2xp
ZW50IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcnVuVGVzdHMoKSA9IDA7CisKKyAgICAv
LyBGcmFtZUxvYWRlckNsaWVudCBkZWxlZ2F0ZXMKKyAgICB2aXJ0dWFsIHZvaWQgZGlkU3RhcnRQ
cm92aXNpb25hbExvYWRGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSopID0gMDsKKyAgICB2aXJ0dWFs
IHZvaWQgZGlkUmVjZWl2ZVJlc3BvbnNlRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqLCBjb25zdCBX
ZWJDb3JlOjpSZXNvdXJjZVJlc3BvbnNlJikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaWRDb21t
aXRMb2FkRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRp
ZEZhaWxQcm92aXNpb25hbExvYWRGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSopID0gMDsKKyAgICB2
aXJ0dWFsIHZvaWQgZGlkRmFpbExvYWRGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSopID0gMDsKKyAg
ICB2aXJ0dWFsIHZvaWQgZGlkRmluaXNoTG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKikgPSAw
OworICAgIHZpcnR1YWwgdm9pZCBkaWRGaW5pc2hEb2N1bWVudExvYWRGb3JGcmFtZShXZWJDb3Jl
OjpGcmFtZSopID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkQ2xlYXJXaW5kb3dPYmplY3RJbldv
cmxkKFdlYkNvcmU6OkRPTVdyYXBwZXJXb3JsZCosIEpTR2xvYmFsQ29udGV4dFJlZiwgSlNPYmpl
Y3RSZWYgd2luZG93T2JqZWN0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZFJlY2VpdmVUaXRs
ZUZvckZyYW1lKGNvbnN0IFdURjo6U3RyaW5nJiB0aXRsZSwgV2ViQ29yZTo6RnJhbWUqKSA9IDA7
CisgICAgdmlydHVhbCB2b2lkIGRpZERlY2lkZVBvbGljeUZvck5hdmlnYXRpb25BY3Rpb24oY29u
c3QgV2ViQ29yZTo6TmF2aWdhdGlvbkFjdGlvbiYsIGNvbnN0IFdlYkNvcmU6OlJlc291cmNlUmVx
dWVzdCYpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkRGlzcGF0Y2hXaWxsUGVyZm9ybUNsaWVu
dFJlZGlyZWN0KCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaWRIYW5kbGVPbmxvYWRFdmVudHNG
b3JGcmFtZShXZWJDb3JlOjpGcmFtZSopID0gMDsKKworICAgIC8vIENocm9tZUNsaWVudCBkZWxl
Z2F0ZXMKKyAgICB2aXJ0dWFsIHZvaWQgYWRkTWVzc2FnZVRvQ29uc29sZShjb25zdCBXVEY6OlN0
cmluZyYgbWVzc2FnZSwgdW5zaWduZWQgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFdURjo6U3RyaW5n
JiBzb3VyY2VJRCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBydW5KYXZhU2NyaXB0QWxlcnQoY29u
c3QgV1RGOjpTdHJpbmcmIG1lc3NhZ2UpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgcnVuSmF2YVNj
cmlwdENvbmZpcm0oY29uc3QgV1RGOjpTdHJpbmcmIG1lc3NhZ2UpID0gMDsKKyAgICB2aXJ0dWFs
IFdURjo6U3RyaW5nIHJ1bkphdmFTY3JpcHRQcm9tcHQoY29uc3QgV1RGOjpTdHJpbmcmIG1lc3Nh
Z2UsIGNvbnN0IFdURjo6U3RyaW5nJiBkZWZhdWx0VmFsdWUpID0gMDsKKyAgICB2aXJ0dWFsIGJv
b2wgcnVuQmVmb3JlVW5sb2FkQ29uZmlybVBhbmVsKGNvbnN0IFdURjo6U3RyaW5nJiBtZXNzYWdl
KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldFN0YXR1c1RleHQoY29uc3QgV1RGOjpTdHJpbmcm
KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGV4Y2VlZGVkRGF0YWJhc2VRdW90YShXZWJDb3JlOjpT
ZWN1cml0eU9yaWdpbiosIGNvbnN0IFdURjo6U3RyaW5nJiBuYW1lKSA9IDA7CisgICAgdmlydHVh
bCBib29sIGFsbG93c09wZW5pbmdXaW5kb3coKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHdpbmRv
d0NyZWF0ZWQoV2ViUGFnZSopID0gMDsKKworICAgIC8vIEVkaXRvckNsaWVudCBkZWxlZ2F0ZXMK
KyAgICB2aXJ0dWFsIHZvaWQgc2V0QWNjZXB0c0VkaXRpbmcoYm9vbCkgPSAwOworICAgIHZpcnR1
YWwgdm9pZCBkaWRCZWdpbkVkaXRpbmcoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZEVuZEVk
aXRpbmcoKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZENoYW5nZSgpID0gMDsKKyAgICB2aXJ0
dWFsIHZvaWQgZGlkQ2hhbmdlU2VsZWN0aW9uKCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzaG91
bGRCZWdpbkVkaXRpbmdJbkRPTVJhbmdlKFdlYkNvcmU6OlJhbmdlKikgPSAwOworICAgIHZpcnR1
YWwgYm9vbCBzaG91bGRFbmRFZGl0aW5nSW5ET01SYW5nZShXZWJDb3JlOjpSYW5nZSopID0gMDsK
KyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRGVsZXRlRE9NUmFuZ2UoV2ViQ29yZTo6UmFuZ2UqKSA9
IDA7CisgICAgdmlydHVhbCBib29sIHNob3VsZENoYW5nZVNlbGVjdGVkRE9NUmFuZ2VUb0RPTVJh
bmdlQWZmaW5pdHlTdGlsbFNlbGVjdGluZyhXZWJDb3JlOjpSYW5nZSogZnJvbVJhbmdlLCBXZWJD
b3JlOjpSYW5nZSogdG9SYW5nZSwgaW50IGFmZmluaXR5LCBib29sIHN0aWxsU2VsZWN0aW5nKSA9
IDA7CisgICAgdmlydHVhbCBib29sIHNob3VsZEluc2VydE5vZGUoV2ViQ29yZTo6Tm9kZSosIFdl
YkNvcmU6OlJhbmdlKiwgaW50IGluc2VydEFjdGlvbikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBz
aG91bGRJbnNlcnRUZXh0KGNvbnN0IFdURjo6U3RyaW5nJiwgV2ViQ29yZTo6UmFuZ2UqLCBpbnQg
aW5zZXJ0QWN0aW9uKSA9IDA7CisgICAgdmlydHVhbCBib29sIGlzU2VsZWN0VHJhaWxpbmdXaGl0
ZXNwYWNlRW5hYmxlZCgpIGNvbnN0ID0gMDsKKworfTsKK30KK30KKworI2VuZGlmIC8vIER1bXBS
ZW5kZXJUcmVlQ2xpZW50X2gKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBiL1Rvb2xzL0No
YW5nZUxvZwppbmRleCBjMjk0MGRjODI4NTM5ODliNDIyYTdiYjU1YWM2ZTA1MzRhZmY5Yjc4Li44
OWVhMjQ1NDMxZjc2OTgyNDRmZDIxZmU5ZTkyNDhjZGI4MmQwZTY5IDEwMDY0NAotLS0gYS9Ub29s
cy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTUgQEAKKzIwMTIt
MDItMDcgIFJvYiBCdWlzICA8cmJ1aXNAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0g
VXBzdHJlYW0gRHVtcFJlbmRlclRyZWVCbGFja0JlcnJ5CisgICAgICAgIGh0dHBzOi8vYnVncy53
ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03ODA0MgorCisgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgorCisgICAgICAgIEFkZCBpbXBsZW1lbnRhdGlvbiBmb3Igb3VyIER1bXBS
ZW5kZXJUcmVlIHNvbHV0aW9uLgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvYmxhY2tiZXJy
eS9EdW1wUmVuZGVyVHJlZS5jcHA6IEFkZGVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2Js
YWNrYmVycnkvRHVtcFJlbmRlclRyZWVCbGFja0JlcnJ5Lmg6IEFkZGVkLgorCiAyMDEyLTAyLTA3
ICBDaHJpcyBSb2dlcnMgIDxjcm9nZXJzQGdvb2dsZS5jb20+CiAKICAgICAgICAgQWRkIENocmlz
IFJvZ2VycyB0byByZXZpZXdlcnMgc2VjdGlvbgpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRl
clRyZWUvYmxhY2tiZXJyeS9EdW1wUmVuZGVyVHJlZS5jcHAgYi9Ub29scy9EdW1wUmVuZGVyVHJl
ZS9ibGFja2JlcnJ5L0R1bXBSZW5kZXJUcmVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5hNzhhOWVkODBhOWMw
ZTk4ZDM5MjVkZDg4MDI3YTlhM2VhYTBlNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVt
cFJlbmRlclRyZWUvYmxhY2tiZXJyeS9EdW1wUmVuZGVyVHJlZS5jcHAKQEAgLTAsMCArMSw4MTYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIDIwMTAsIDIwMTEsIDIwMTIgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlLmgiCisK
KyNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIkJhY2tGb3J3
YXJkQ29udHJvbGxlci5oIgorI2luY2x1ZGUgIkJhY2tGb3J3YXJkTGlzdEltcGwuaCIKKyNpbmNs
dWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRGF0YWJhc2VUcmFja2VyLmgiCisjaW5jbHVkZSAi
RG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZS9HQ0NvbnRyb2xsZXIu
aCIKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZVN1cHBvcnQuaCIKKyNpbmNsdWRlICJFZGl0aW5n
QmVoYXZpb3JUeXBlcy5oIgorI2luY2x1ZGUgIkVkaXRvckNsaWVudEJsYWNrQmVycnkuaCIKKyNp
bmNsdWRlICJFZGl0b3JJbnNlcnRBY3Rpb24uaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5j
bHVkZSAiRXZlbnRTZW5kZXIuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1l
TG9hZGVyVHlwZXMuaCIKKyNpbmNsdWRlICJGcmFtZVRyZWUuaCIKKyNpbmNsdWRlICJGcmFtZVZp
ZXcuaCIKKyNpbmNsdWRlICJIaXN0b3J5SXRlbS5oIgorI2luY2x1ZGUgIkludFNpemUuaCIKKyNp
bmNsdWRlICJMYXlvdXRUZXN0Q29udHJvbGxlci5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVk
LmgiCisjaW5jbHVkZSAiT3duQXJyYXlQdHIuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVk
ZSAiUGFnZUdyb3VwLmgiCisjaW5jbHVkZSAiUGl4ZWxEdW1wU3VwcG9ydC5oIgorI2luY2x1ZGUg
IlBpeGVsRHVtcFN1cHBvcnRCbGFja0JlcnJ5LmgiCisjaW5jbHVkZSAiUmFuZ2UuaCIKKyNpbmNs
dWRlICJSZW5kZXJUcmVlQXNUZXh0LmgiCisjaW5jbHVkZSAiU2NyaXB0Q29udHJvbGxlci5oIgor
I2luY2x1ZGUgIlNlY3VyaXR5T3JpZ2luLmgiCisjaW5jbHVkZSAiU2V0dGluZ3MuaCIKKyNpbmNs
dWRlICJUZXh0QWZmaW5pdHkuaCIKKyNpbmNsdWRlICJUaW1lci5oIgorI2luY2x1ZGUgIlZlY3Rv
ci5oIgorI2luY2x1ZGUgIldlYkNvcmVUZXN0U3VwcG9ydC5oIgorI2luY2x1ZGUgIldlYlBhZ2Uu
aCIKKyNpbmNsdWRlICJXZWJQYWdlQ2xpZW50LmgiCisjaW5jbHVkZSAiV29ya1F1ZXVlLmgiCisj
aW5jbHVkZSAiV29ya1F1ZXVlSXRlbS5oIgorI2luY2x1ZGUgPFdlYlNldHRpbmdzLmg+CisjaW5j
bHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5o
PgorI2luY2x1ZGUgPHd0Zi9Ob25Db3B5aW5nU29ydC5oPgorCisjZGVmaW5lIFNEQ0FSRF9QQVRI
ICIvZGV2ZWxvcGVyIgorCit2b2xhdGlsZSBib29sIGRvbmU7CisKK1JlZlB0cjxMYXlvdXRUZXN0
Q29udHJvbGxlcj4gZ0xheW91dFRlc3RDb250cm9sbGVyOworCitXZWJDb3JlOjpGcmFtZSogbWFp
bkZyYW1lID0gMDsKK1dlYkNvcmU6OkZyYW1lKiB0b3BMb2FkaW5nRnJhbWUgPSAwOworYm9vbCB3
YWl0Rm9yUG9saWN5ID0gZmFsc2U7CisKKy8vIEZJWE1FOiBBc3N1bWluZyBMYXlvdXRUZXN0cyBo
YXMgYmVlbiBjb3BpZWQgdG8gL2RldmVsb3Blci9MYXlvdXRUZXN0cy8KK3N0YXRpYyBjb25zdCBj
aGFyKiBjb25zdCBrU0RDTGF5b3V0VGVzdHNVUkkgPSAiZmlsZTovLy9kZXZlbG9wZXIvTGF5b3V0
VGVzdHMvIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBodHRwVGVzdFN5bnRheCA9ICJodHRwL3Rlc3Rz
LyI7CitzdGF0aWMgY29uc3QgY2hhciogaHR0cFByZWZpeFVSTCA9ICJodHRwOi8vMTI3LjAuMC4x
OjgwMDAvIjsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworc3RhdGljIFdURjo6U3RyaW5nIGRy
dEFmZmluaXR5RGVzY3JpcHRpb24oV2ViQ29yZTo6RUFmZmluaXR5IGFmZmluaXR5KQoreworICAg
IGlmIChhZmZpbml0eSA9PSBXZWJDb3JlOjpVUFNUUkVBTSkKKyAgICAgICAgcmV0dXJuIFdURjo6
U3RyaW5nKCJOU1NlbGVjdGlvbkFmZmluaXR5VXBzdHJlYW0iKTsKKyAgICBpZiAoYWZmaW5pdHkg
PT0gV2ViQ29yZTo6RE9XTlNUUkVBTSkKKyAgICAgICAgcmV0dXJuIFdURjo6U3RyaW5nKCJOU1Nl
bGVjdGlvbkFmZmluaXR5RG93bnN0cmVhbSIpOworICAgIHJldHVybiAiIjsKK30KKworc3RhdGlj
IFdURjo6U3RyaW5nIGRydER1bXBQYXRoKFdlYkNvcmU6Ok5vZGUqIG5vZGUpCit7CisgICAgV2Vi
Q29yZTo6Tm9kZSogcGFyZW50ID0gbm9kZS0+cGFyZW50Tm9kZSgpOworICAgIFdURjo6U3RyaW5n
IHN0ciA9IFdURjo6U3RyaW5nOjpmb3JtYXQoIiVzIiwgbm9kZS0+bm9kZU5hbWUoKS51dGY4KCku
ZGF0YSgpKTsKKyAgICBpZiAocGFyZW50KSB7CisgICAgICAgIHN0ci5hcHBlbmQoIiA+ICIpOwor
ICAgICAgICBzdHIuYXBwZW5kKGRydER1bXBQYXRoKHBhcmVudCkpOworICAgIH0KKyAgICByZXR1
cm4gc3RyOworfQorCitzdGF0aWMgV1RGOjpTdHJpbmcgZHJ0UmFuZ2VEZXNjcmlwdGlvbihXZWJD
b3JlOjpSYW5nZSogcmFuZ2UpCit7CisgICAgaWYgKCFyYW5nZSkKKyAgICAgICAgcmV0dXJuICIo
bnVsbCkiOworICAgIHJldHVybiBXVEY6OlN0cmluZzo6Zm9ybWF0KCJyYW5nZSBmcm9tICVkIG9m
ICVzIHRvICVkIG9mICVzIiwgcmFuZ2UtPnN0YXJ0T2Zmc2V0KCksIGRydER1bXBQYXRoKHJhbmdl
LT5zdGFydENvbnRhaW5lcigpKS51dGY4KCkuZGF0YSgpLCByYW5nZS0+ZW5kT2Zmc2V0KCksIGRy
dER1bXBQYXRoKHJhbmdlLT5lbmRDb250YWluZXIoKSkudXRmOCgpLmRhdGEoKSk7Cit9CisKK3N0
YXRpYyBXVEY6OlN0cmluZyBkcnRGcmFtZURlc2NyaXB0aW9uKFdlYkNvcmU6OkZyYW1lKiBmcmFt
ZSkKK3sKKyAgICBXVEY6OlN0cmluZyBuYW1lID0gZnJhbWUtPnRyZWUoKS0+dW5pcXVlTmFtZSgp
LnN0cmluZygpOworICAgIGlmIChmcmFtZSA9PSBtYWluRnJhbWUpIHsKKyAgICAgICAgaWYgKCFu
YW1lLmlzTnVsbCgpICYmIG5hbWUubGVuZ3RoKCkpCisgICAgICAgICAgICByZXR1cm4gV1RGOjpT
dHJpbmc6OmZvcm1hdCgibWFpbiBmcmFtZSBcIiVzXCIiLCBuYW1lLnV0ZjgoKS5kYXRhKCkpOwor
ICAgICAgICByZXR1cm4gIm1haW4gZnJhbWUiOworICAgIH0KKyAgICBpZiAoIW5hbWUuaXNOdWxs
KCkpCisgICAgICAgIHJldHVybiBXVEY6OlN0cmluZzo6Zm9ybWF0KCJmcmFtZSBcIiVzXCIiLCBu
YW1lLnV0ZjgoKS5kYXRhKCkpOworICAgIHJldHVybiAiZnJhbWUgKGFub255bW91cykiOworfQor
CitzdGF0aWMgYm9vbCBzaG91bGRMb2dGcmFtZUxvYWREZWxlZ2F0ZXMoY29uc3QgV1RGOjpTdHJp
bmcmIHVybCkKK3sKKyAgICByZXR1cm4gdXJsLmNvbnRhaW5zKCJsb2FkaW5nLyIpOworfQorCitu
YW1lc3BhY2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKKworRHVtcFJlbmRlclRy
ZWUqIER1bXBSZW5kZXJUcmVlOjpzX2N1cnJlbnRJbnN0YW5jZSA9IDA7Citib29sIER1bXBSZW5k
ZXJUcmVlOjpzX3NlbGVjdFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJsZWQgPSBmYWxzZTsKKworc3Rh
dGljIHZvaWQgY3JlYXRlRmlsZShjb25zdCBXVEY6OlN0cmluZyYgZmlsZU5hbWUpCit7CisgICAg
RklMRSogZmQgPSBmb3BlbihmaWxlTmFtZS51dGY4KCkuZGF0YSgpLCAid2IiKTsKKyAgICBmY2xv
c2UoZmQpOworfQorCitEdW1wUmVuZGVyVHJlZTo6RHVtcFJlbmRlclRyZWUoQmxhY2tCZXJyeTo6
V2ViS2l0OjpXZWJQYWdlKiBwYWdlKQorICAgIDogbV9nY0NvbnRyb2xsZXIoMCkKKyAgICAsIG1f
YWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIoMCkKKyAgICAsIG1fcGFnZShwYWdlKQorICAgICwgbV9k
dW1wUGl4ZWxzKGZhbHNlKQorICAgICwgbV93YWl0VG9EdW1wV2F0Y2hkb2dUaW1lcih0aGlzLCAm
RHVtcFJlbmRlclRyZWU6OndhaXRUb0R1bXBXYXRjaGRvZ1RpbWVyRmlyZWQpCisgICAgLCBtX3dv
cmtUaW1lcih0aGlzLCAmRHVtcFJlbmRlclRyZWU6OnByb2Nlc3NXb3JrKQorICAgICwgbV9hY2Nl
cHRzRWRpdGluZyh0cnVlKQoreworICAgIFdURjo6U3RyaW5nIHNkY2FyZFBhdGggPSBTRENBUkRf
UEFUSDsKKyAgICBtX3Jlc3VsdHNEaXIgPSBzZGNhcmRQYXRoICsgIi9yZXN1bHRzLyI7CisgICAg
bV9pbmRleEZpbGUgPSBzZGNhcmRQYXRoICsgIi9pbmRleC5kcnQiOworICAgIG1fZG9uZUZpbGUg
PSBzZGNhcmRQYXRoICsgIi9kb25lIjsKKyAgICBtX2N1cnJlbnRUZXN0RmlsZSA9IHNkY2FyZFBh
dGggKyAiL2N1cnJlbnQuZHJ0IjsKKyAgICBtX3BhZ2UtPnJlc2V0VmlydHVhbFZpZXdwb3J0T25D
b21taXR0ZWQoZmFsc2UpOworICAgIG1fcGFnZS0+c2V0VmlydHVhbFZpZXdwb3J0U2l6ZSg4MDAs
IDYwMCk7CisgICAgc19jdXJyZW50SW5zdGFuY2UgPSB0aGlzOworfQorCitEdW1wUmVuZGVyVHJl
ZTo6fkR1bXBSZW5kZXJUcmVlKCkKK3sKKyAgICBkZWxldGUgbV9nY0NvbnRyb2xsZXI7CisgICAg
ZGVsZXRlIG1fYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRy
ZWU6OnJ1blRlc3QoY29uc3QgV1RGOjpTdHJpbmcmIHVybCkKK3sKKyAgICBjcmVhdGVGaWxlKG1f
cmVzdWx0c0RpciArICptX2N1cnJlbnRUZXN0ICsgIi5kdW1wLmNyYXNoIik7CisKKyAgICBtYWlu
RnJhbWUtPmxvYWRlcigpLT5zdG9wRm9yVXNlckNhbmNlbCgpOworICAgIHJlc2V0VG9Db25zaXN0
ZW50U3RhdGVCZWZvcmVUZXN0aW5nKCk7CisgICAgaWYgKHNob3VsZExvZ0ZyYW1lTG9hZERlbGVn
YXRlcyh1cmwpKQorICAgICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNldER1bXBGcmFtZUxv
YWRDYWxsYmFja3ModHJ1ZSk7CisgICAgV1RGOjpTdHJpbmcgc3Rkb3V0RmlsZSA9IG1fcmVzdWx0
c0RpciArICptX2N1cnJlbnRUZXN0ICsgIi5kdW1wIjsKKyAgICBXVEY6OlN0cmluZyBzdGRlcnJG
aWxlID0gbV9yZXN1bHRzRGlyICsgKm1fY3VycmVudFRlc3QgKyAiLnN0ZGVyciI7CisKKyAgICAv
LyBGSVhNRTogd2Ugc2hvdWxkIHByZXNlcnZlIHRoZSBvcmlnaW5hbCBzdGRvdXQgYW5kIHN0ZGVy
ciBoZXJlIGJ1dCBhcmVuJ3QgZG9pbmcKKyAgICAvLyB0aGF0IHlldCBkdWUgdG8gaXNzdWVzIHdp
dGggZHVwLCBldGMuCisgICAgZnJlb3BlbihzdGRvdXRGaWxlLnV0ZjgoKS5kYXRhKCksICJ3YiIs
IHN0ZG91dCk7CisgICAgZnJlb3BlbihzdGRlcnJGaWxlLnV0ZjgoKS5kYXRhKCksICJ3YiIsIHN0
ZGVycik7CisKKyAgICBGSUxFKiBjdXJyZW50ID0gZm9wZW4obV9jdXJyZW50VGVzdEZpbGUudXRm
OCgpLmRhdGEoKSwgInciKTsKKyAgICBmd3JpdGUobV9jdXJyZW50VGVzdC0+dXRmOCgpLmRhdGEo
KSwgMSwgbV9jdXJyZW50VGVzdC0+dXRmOCgpLmxlbmd0aCgpLCBjdXJyZW50KTsKKyAgICBmY2xv
c2UoY3VycmVudCk7CisgICAgbV9wYWdlLT5sb2FkKHVybC51dGY4KCkuZGF0YSgpLCAwLCBmYWxz
ZSk7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmRvbmVEcnQoKQoreworICAgIGZjbG9zZShz
dGRvdXQpOworICAgIGZjbG9zZShzdGRlcnIpOworCisgICAgLy8gTm90aWZ5IHRoZSBleHRlcm5h
bCB3b3JsZCB0aGF0IHdlJ3JlIGRvbmUuCisgICAgY3JlYXRlRmlsZShtX2RvbmVGaWxlKTsKKyAg
ICAobV9wYWdlLT5jbGllbnQoKSktPm5vdGlmeVJ1bkxheW91dFRlc3RzRmluaXNoZWQoKTsKK30K
Kwordm9pZCBEdW1wUmVuZGVyVHJlZTo6cnVuUmVtYWluaW5nVGVzdHMoKQoreworICAgIC8vIEZJ
WE1FOiBmZmx1c2ggc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgYnV0IGlzIHRlbXBvcmFyaWx5IHJl
cXVpcmVkIGR1ZSB0byBhIGJ1ZyBpbiBzdGRpbyBvdXRwdXQuCisgICAgZmZsdXNoKHN0ZG91dCk7
CisgICAgZmZsdXNoKHN0ZGVycik7CisKKyAgICBpZiAobV9jdXJyZW50VGVzdCA8IG1fdGVzdHMu
ZW5kKCkgLSAxKSB7CisgICAgICAgIG1fY3VycmVudFRlc3QrKzsKKyAgICAgICAgaWYgKGlzSFRU
UFRlc3QobV9jdXJyZW50VGVzdC0+dXRmOCgpLmRhdGEoKSkpIHsKKyAgICAgICAgICAgIG1fY3Vy
cmVudEh0dHBUZXN0ID0gbV9jdXJyZW50VGVzdC0+dXRmOCgpLmRhdGEoKTsKKyAgICAgICAgICAg
IG1fY3VycmVudEh0dHBUZXN0LnJlbW92ZSgwLCBzdHJsZW4oaHR0cFRlc3RTeW50YXgpKTsKKyAg
ICAgICAgICAgIHJ1blRlc3QoaHR0cFByZWZpeFVSTCArIG1fY3VycmVudEh0dHBUZXN0KTsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICBydW5UZXN0KGtTRENMYXlvdXRUZXN0c1VSSSArICpt
X2N1cnJlbnRUZXN0KTsKKyAgICB9IGVsc2UKKyAgICAgICAgZG9uZURydCgpOworfQorCit2b2lk
IER1bXBSZW5kZXJUcmVlOjpyZXNldFRvQ29uc2lzdGVudFN0YXRlQmVmb3JlVGVzdGluZygpCit7
CisgICAgaWYgKGlzSFRUUFRlc3QobV9jdXJyZW50VGVzdC0+dXRmOCgpLmRhdGEoKSkpCisgICAg
ICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlciA9IExheW91dFRlc3RDb250cm9sbGVyOjpjcmVhdGUo
U3RyaW5nKGh0dHBQcmVmaXhVUkwgKyAqbV9jdXJyZW50VGVzdCkudXRmOCgpLmRhdGEoKSwgIiIp
OworICAgIGVsc2UKKyAgICAgICAgZ0xheW91dFRlc3RDb250cm9sbGVyID0gTGF5b3V0VGVzdENv
bnRyb2xsZXI6OmNyZWF0ZShTdHJpbmcoa1NEQ0xheW91dFRlc3RzVVJJICsgKm1fY3VycmVudFRl
c3QpLnV0ZjgoKS5kYXRhKCksICIiKTsKKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+c2V0
SWNvbkRhdGFiYXNlRW5hYmxlZChmYWxzZSk7CisKKyAgICBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6
OnJlc2V0R2VvbG9jYXRpb25Nb2NrKG1fcGFnZSk7CisKKyAgICB0b3BMb2FkaW5nRnJhbWUgPSAw
OworICAgIG1fbG9hZEZpbmlzaGVkID0gZmFsc2U7CisgICAgc19zZWxlY3RUcmFpbGluZ1doaXRl
c3BhY2VFbmFibGVkID0gZmFsc2U7CisKKyAgICBkb25lID0gZmFsc2U7CisgICAgV29ya1F1ZXVl
OjpzaGFyZWQoKS0+Y2xlYXIoKTsKKyAgICBXb3JrUXVldWU6OnNoYXJlZCgpLT5zZXRGcm96ZW4o
ZmFsc2UpOworCisgICAgV2ViU2V0dGluZ3MqIHNldHRpbmdzID0gbV9wYWdlLT5zZXR0aW5ncygp
OworCisgICAgc2V0dGluZ3MtPnNldFRleHRSZWZsb3dNb2RlKFdlYlNldHRpbmdzOjpUZXh0UmVm
bG93RGlzYWJsZWQpOworICAgIHNldHRpbmdzLT5zZXRKYXZhU2NyaXB0RW5hYmxlZCh0cnVlKTsK
KyAgICBzZXR0aW5ncy0+c2V0TG9hZHNJbWFnZXNBdXRvbWF0aWNhbGx5KHRydWUpOworICAgIHNl
dHRpbmdzLT5zZXRKYXZhU2NyaXB0T3BlbldpbmRvd3NBdXRvbWF0aWNhbGx5KHRydWUpOworICAg
IHNldHRpbmdzLT5zZXRab29tVG9GaXRPbkxvYWQoZmFsc2UpOworICAgIHNldHRpbmdzLT5zZXRE
ZWZhdWx0Rm9udFNpemUoMTYpOworICAgIHNldHRpbmdzLT5zZXREZWZhdWx0Rml4ZWRGb250U2l6
ZSgxMyk7CisgICAgc2V0dGluZ3MtPnNldE1pbmltdW1Gb250U2l6ZSgxKTsKKyAgICBzZXR0aW5n
cy0+c2V0U2VyaWZGb250RmFtaWx5KCJUaW1lcyIpOworICAgIHNldHRpbmdzLT5zZXRGaXhlZEZv
bnRGYW1pbHkoIkNvdXJpZXIgTmV3Iik7CisgICAgc2V0dGluZ3MtPnNldFNhbnNTZXJpZkZvbnRG
YW1pbHkoIkFyaWFsIik7CisgICAgc2V0dGluZ3MtPnNldFN0YW5kYXJkRm9udEZhbWlseSgiVGlt
ZXMiKTsKKyAgICBzZXR0aW5ncy0+c2V0WFNTQXVkaXRvckVuYWJsZWQoZmFsc2UpOworICAgIHNl
dHRpbmdzLT5zZXRGcmFtZUZsYXR0ZW5pbmdFbmFibGVkKGZhbHNlKTsKKyAgICBzZXR0aW5ncy0+
c2V0TWF4aW11bVBhZ2VzSW5DYWNoZSgwKTsKKyAgICBzZXR0aW5ncy0+c2V0UGx1Z2luc0VuYWJs
ZWQodHJ1ZSk7CisgICAgc2V0dGluZ3MtPnNldFVzZXJTY2FsYWJsZSh0cnVlKTsKKyAgICAvLyBB
cHBseSBuZXcgc2V0dGluZ3MgdG8gY3VycmVudCBwYWdlLCBzZWUgbW9yZSBpbiB0aGUgZGVzdHJ1
Y3RvciBvZiBXZWJTZXR0aW5nc1RyYW5zYWN0aW9uLgorICAgIFdlYlNldHRpbmdzVHJhbnNhY3Rp
b24gd2ViU2V0dGluZ1RyYW5zYWN0aW9uKHNldHRpbmdzKTsKKworICAgIEJsYWNrQmVycnk6Oldl
YktpdDo6RHVtcFJlbmRlclRyZWU6OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCktPmNsZWFyQmFj
a0ZvcndhcmRMaXN0KGZhbHNlKTsKKworICAgIHNldEFjY2VwdHNFZGl0aW5nKHRydWUpOworICAg
IER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6c2V0TGlua3NJbmNsdWRlZEluRm9jdXNDaGFpbih0cnVl
KTsKKworICAgIG1fcGFnZS0+c2V0VmlydHVhbFZpZXdwb3J0U2l6ZSg4MDAsIDYwMCk7CisgICAg
bV9wYWdlLT5yZXNldFZpcnR1YWxWaWV3cG9ydE9uQ29tbWl0dGVkKGZhbHNlKTsKKyAgICBtX3Bh
Z2UtPnNldEphdmFTY3JpcHRDYW5BY2Nlc3NDbGlwYm9hcmQodHJ1ZSk7CisKKyAgICBtYWluRnJh
bWUgPSBtX3BhZ2UtPm1haW5GcmFtZSgpOworICAgIGlmIChtYWluRnJhbWUpIHsKKyAgICAgICAg
bWFpbkZyYW1lLT5wYWdlKCktPnNldFRhYktleUN5Y2xlc1Rocm91Z2hFbGVtZW50cyh0cnVlKTsK
KyAgICAgICAgbWFpbkZyYW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldEVkaXRpbmdCZWhhdmlv
clR5cGUoV2ViQ29yZTo6RWRpdGluZ1VuaXhCZWhhdmlvcik7CisgICAgICAgIG1haW5GcmFtZS0+
cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRET01QYXN0ZUFsbG93ZWQodHJ1ZSk7CisgICAgICAgIG1h
aW5GcmFtZS0+cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRWYWxpZGF0aW9uTWVzc2FnZVRpbWVyTWFn
bmlmaWNhdGlvbigtMSk7CisgICAgICAgIG1haW5GcmFtZS0+cGFnZSgpLT5zZXR0aW5ncygpLT5z
ZXRJbnRlcmFjdGl2ZUZvcm1WYWxpZGF0aW9uRW5hYmxlZCh0cnVlKTsKKyAgICAgICAgbWFpbkZy
YW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldEFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyh0
cnVlKTsKKyAgICAgICAgbWFpbkZyYW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldEFsbG93VW5p
dmVyc2FsQWNjZXNzRnJvbUZpbGVVUkxzKHRydWUpOworICAgICAgICBtYWluRnJhbWUtPnBhZ2Uo
KS0+c2V0dGluZ3MoKS0+c2V0QXV0aG9yQW5kVXNlclN0eWxlc0VuYWJsZWQodHJ1ZSk7CisgICAg
ICAgIG1haW5GcmFtZS0+cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRVc2VQcmVIVE1MNVBhcnNlclF1
aXJrcyhmYWxzZSk7CisgICAgICAgIG1haW5GcmFtZS0+dHJlZSgpLT5jbGVhck5hbWUoKTsKKyAg
ICAgICAgbWFpbkZyYW1lLT5sb2FkZXIoKS0+c2V0T3BlbmVyKDApOworICAgICAgICAvLyBGSVhN
RTogT3RoZXIgcG9ydHMgYWxzbyBjbGVhciBoaXN0b3J5L2JhY2tGb3J3YXJkTGlzdCBhbGxvbmcg
d2l0aCB2aXNpdGVkIGxpbmtzLgorICAgICAgICBtYWluRnJhbWUtPnBhZ2UoKS0+Z3JvdXAoKS5y
ZW1vdmVWaXNpdGVkTGlua3MoKTsKKyAgICB9CisKKyAgICAvLyBGb3Igbm93IHdlIG1hbnVhbGx5
IGdhcmJhZ2UgY29sbGVjdCBiZXR3ZWVuIGVhY2ggdGVzdCB0byBtYWtlIHN1cmUgdGhlIGRldmlj
ZSB3b24ndCBydW4gb3V0IG9mIG1lbW9yeSBkdWUgdG8gbGF6eSBjb2xsZWN0aW9uLgorICAgIER1
bXBSZW5kZXJUcmVlU3VwcG9ydDo6Z2FyYmFnZUNvbGxlY3RvckNvbGxlY3QoKTsKK30KKwordm9p
ZCBEdW1wUmVuZGVyVHJlZTo6cnVuVGVzdHMoKQoreworICAgIG1fZ2NDb250cm9sbGVyID0gbmV3
IEdDQ29udHJvbGxlcigpOworICAgIG1fYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIgPSBuZXcgQWNj
ZXNzaWJpbGl0eUNvbnRyb2xsZXIoKTsKKyAgICBnZXRUZXN0c1RvUnVuKCk7CisKKyAgICBtYWlu
RnJhbWUgPSBtX3BhZ2UtPm1haW5GcmFtZSgpOworCisgICAgbV9jdXJyZW50VGVzdCA9IG1fdGVz
dHMuYmVnaW4oKTsKKworICAgIGlmIChtX2N1cnJlbnRUZXN0ID09IG1fdGVzdHMuZW5kKCkpIHsK
KyAgICAgICAgZG9uZURydCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlz
SFRUUFRlc3QobV9jdXJyZW50VGVzdC0+dXRmOCgpLmRhdGEoKSkpIHsKKyAgICAgICAgbV9jdXJy
ZW50SHR0cFRlc3QgPSBtX2N1cnJlbnRUZXN0LT51dGY4KCkuZGF0YSgpOworICAgICAgICBtX2N1
cnJlbnRIdHRwVGVzdC5yZW1vdmUoMCwgc3RybGVuKGh0dHBUZXN0U3ludGF4KSk7CisgICAgICAg
IHJ1blRlc3QoaHR0cFByZWZpeFVSTCArIG1fY3VycmVudEh0dHBUZXN0KTsKKyAgICB9IGVsc2UK
KyAgICAgICAgcnVuVGVzdChrU0RDTGF5b3V0VGVzdHNVUkkgKyAqbV9jdXJyZW50VGVzdCk7Cit9
CisKKworV1RGOjpTdHJpbmcgRHVtcFJlbmRlclRyZWU6OmR1bXBGcmFtZXNBc1RleHQoV2ViQ29y
ZTo6RnJhbWUqIGZyYW1lKQoreworICAgIFdURjo6U3RyaW5nIHM7CisgICAgV2ViQ29yZTo6RWxl
bWVudCogZG9jdW1lbnRFbGVtZW50ID0gZnJhbWUtPmRvY3VtZW50KCktPmRvY3VtZW50RWxlbWVu
dCgpOworICAgIGlmICghZG9jdW1lbnRFbGVtZW50KQorICAgICAgICByZXR1cm4gcy51dGY4KCku
ZGF0YSgpOworCisgICAgaWYgKGZyYW1lLT50cmVlKCktPnBhcmVudCgpKQorICAgICAgICBzID0g
V1RGOjpTdHJpbmc6OmZvcm1hdCgiXG4tLS0tLS0tLVxuRnJhbWU6ICclcydcbi0tLS0tLS0tXG4i
LCBmcmFtZS0+dHJlZSgpLT51bmlxdWVOYW1lKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSk7CisK
KyAgICBzICs9IGRvY3VtZW50RWxlbWVudC0+aW5uZXJUZXh0KCkgKyAiXG4iOworCisgICAgaWYg
KGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcENoaWxkRnJhbWVzQXNUZXh0KCkpIHsKKyAgICAg
ICAgV2ViQ29yZTo6RnJhbWVUcmVlKiB0cmVlID0gZnJhbWUtPnRyZWUoKTsKKyAgICAgICAgZm9y
IChXZWJDb3JlOjpGcmFtZSogY2hpbGQgPSB0cmVlLT5maXJzdENoaWxkKCk7IGNoaWxkOyBjaGls
ZCA9IGNoaWxkLT50cmVlKCktPm5leHRTaWJsaW5nKCkpCisgICAgICAgICAgICBzICs9IGR1bXBG
cmFtZXNBc1RleHQoY2hpbGQpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKworc3RhdGljIHZv
aWQgZHVtcFRvRmlsZShjb25zdCBXVEY6OlN0cmluZyYgZGF0YSkKK3sKKyAgICBmd3JpdGUoZGF0
YS51dGY4KCkuZGF0YSgpLCAxLCBkYXRhLnV0ZjgoKS5sZW5ndGgoKSwgc3Rkb3V0KTsKK30KKwor
Ym9vbCBEdW1wUmVuZGVyVHJlZTo6aXNIVFRQVGVzdChjb25zdCBXVEY6OlN0cmluZyYgdGVzdCkK
K3sKKyAgICBpZiAodGVzdC5sZW5ndGgoKSA8IHN0cmxlbihodHRwVGVzdFN5bnRheCkpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdGVzdC5sb3dlcigpLnN1YnN0cmluZygwLCBz
dHJsZW4oaHR0cFRlc3RTeW50YXgpKSA9PSBodHRwVGVzdFN5bnRheDsKK30KKwordm9pZCBEdW1w
UmVuZGVyVHJlZTo6Z2V0VGVzdHNUb1J1bigpCit7CisgICAgVmVjdG9yPFdURjo6U3RyaW5nPiBm
aWxlczsKKworICAgIEZJTEUqIGZkID0gZm9wZW4obV9pbmRleEZpbGUudXRmOCgpLmRhdGEoKSwg
InIiKTsKKyAgICBmc2VlayhmZCwgMCwgU0VFS19FTkQpOworICAgIGludCBzaXplID0gZnRlbGwo
ZmQpOworICAgIGZzZWVrKGZkLCAwLCBTRUVLX1NFVCk7CisgICAgT3duQXJyYXlQdHI8Y2hhcj4g
YnVmID0gYWRvcHRBcnJheVB0cihuZXcgY2hhcltzaXplXSk7CisgICAgZnJlYWQoYnVmLmdldCgp
LCAxLCBzaXplLCBmZCk7CisgICAgZmNsb3NlKGZkKTsKKyAgICBXVEY6OlN0cmluZyBzKGJ1Zi5n
ZXQoKSwgc2l6ZSk7CisgICAgcy5zcGxpdCgiXG4iLCBmaWxlcyk7CisKKyAgICBtX3Rlc3RzID0g
ZmlsZXM7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmludmFsaWRhdGVBbnlQcmV2aW91c1dh
aXRUb0R1bXBXYXRjaGRvZygpCit7CisgICAgbV93YWl0VG9EdW1wV2F0Y2hkb2dUaW1lci5zdG9w
KCk7CisgICAgd2FpdEZvclBvbGljeSA9IGZhbHNlOworfQorCitXVEY6OlN0cmluZyBEdW1wUmVu
ZGVyVHJlZTo6cmVuZGVyVHJlZUR1bXAoKSBjb25zdAoreworICAgIGlmIChtYWluRnJhbWUpIHsK
KyAgICAgICAgaWYgKG1haW5GcmFtZS0+dmlldygpICYmIG1haW5GcmFtZS0+dmlldygpLT5sYXlv
dXRQZW5kaW5nKCkpCisgICAgICAgICAgICBtYWluRnJhbWUtPnZpZXcoKS0+bGF5b3V0KCk7CisK
KyAgICAgICAgcmV0dXJuIGV4dGVybmFsUmVwcmVzZW50YXRpb24obWFpbkZyYW1lKTsKKyAgICB9
CisgICAgcmV0dXJuICIiOworfQorCitzdGF0aWMgYm9vbCBoaXN0b3J5SXRlbUNvbXBhcmUoY29u
c3QgUmVmUHRyPFdlYkNvcmU6Okhpc3RvcnlJdGVtPiYgYSwgY29uc3QgUmVmUHRyPFdlYkNvcmU6
Okhpc3RvcnlJdGVtPiYgYikKK3sKKyAgICByZXR1cm4gY29kZVBvaW50Q29tcGFyZShhLT51cmxT
dHJpbmcoKSwgYi0+dXJsU3RyaW5nKCkpIDwgMDsKK30KKworc3RhdGljIFdURjo6U3RyaW5nIGR1
bXBIaXN0b3J5SXRlbShQYXNzUmVmUHRyPFdlYkNvcmU6Okhpc3RvcnlJdGVtPiBpdGVtLCBpbnQg
aW5kZW50LCBib29sIGN1cnJlbnQpCit7CisgICAgV1RGOjpTdHJpbmcgcmVzdWx0OworCisgICAg
aW50IHN0YXJ0ID0gMDsKKyAgICBpZiAoY3VycmVudCkgeworICAgICAgICByZXN1bHQgKz0gImN1
cnItPiI7CisgICAgICAgIHN0YXJ0ID0gNjsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0
OyBpIDwgaW5kZW50OyBpKyspCisgICAgICAgIHJlc3VsdCArPSAiICI7CisKKyAgICBXVEY6OlN0
cmluZyB1cmwgPSBpdGVtLT51cmxTdHJpbmcoKTsKKyAgICBpZiAodXJsLmNvbnRhaW5zKCJmaWxl
Oi8vIikpIHsKKyAgICAgICAgc3RhdGljIFdURjo6U3RyaW5nIGxheW91dFRlc3RzU3RyaW5nKCIv
TGF5b3V0VGVzdHMvIik7CisgICAgICAgIHN0YXRpYyBXVEY6OlN0cmluZyBmaWxlVGVzdFN0cmlu
ZygiKGZpbGUgdGVzdCk6Iik7CisKKyAgICAgICAgV1RGOjpTdHJpbmcgcmVzID0gdXJsLnN1YnN0
cmluZyh1cmwuZmluZChsYXlvdXRUZXN0c1N0cmluZykgKyBsYXlvdXRUZXN0c1N0cmluZy5sZW5n
dGgoKSk7CisgICAgICAgIGlmIChyZXMuaXNFbXB0eSgpKQorICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKworICAgICAgICByZXN1bHQgKz0gZmlsZVRlc3RTdHJpbmc7CisgICAgICAgIHJlc3Vs
dCArPSByZXM7CisgICAgfSBlbHNlCisgICAgICAgIHJlc3VsdCArPSB1cmw7CisKKyAgICBXVEY6
OlN0cmluZyB0YXJnZXQgPSBpdGVtLT50YXJnZXQoKTsKKyAgICBpZiAoIXRhcmdldC5pc0VtcHR5
KCkpCisgICAgICAgIHJlc3VsdCArPSAiIChpbiBmcmFtZSBcIiIgKyB0YXJnZXQgKyAiXCIpIjsK
KworICAgIGlmIChpdGVtLT5pc1RhcmdldEl0ZW0oKSkKKyAgICAgICAgcmVzdWx0ICs9ICIgICoq
bmF2IHRhcmdldCoqIjsKKyAgICByZXN1bHQgKz0gIlxuIjsKKworICAgIFdlYkNvcmU6Okhpc3Rv
cnlJdGVtVmVjdG9yIGNoaWxkcmVuID0gaXRlbS0+Y2hpbGRyZW4oKTsKKyAgICAvLyBNdXN0IHNv
cnQgdG8gZWxpbWluYXRlIGFyYml0cmFyeSByZXN1bHQgb3JkZXJpbmcgd2hpY2ggZGVmZWF0cyBy
ZXByb2R1Y2libGUgdGVzdGluZy4KKyAgICBub25Db3B5aW5nU29ydChjaGlsZHJlbi5iZWdpbigp
LCBjaGlsZHJlbi5lbmQoKSwgaGlzdG9yeUl0ZW1Db21wYXJlKTsKKyAgICB1bnNpZ25lZCByZXN1
bHRTaXplID0gY2hpbGRyZW4uc2l6ZSgpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBy
ZXN1bHRTaXplOyArK2kpCisgICAgICAgIHJlc3VsdCArPSBkdW1wSGlzdG9yeUl0ZW0oY2hpbGRy
ZW5baV0sIGluZGVudCArIDQsIGZhbHNlKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0
YXRpYyBXVEY6OlN0cmluZyBkdW1wQmFja0ZvcndhcmRMaXN0Rm9yV2ViVmlldygpCit7CisgICAg
V1RGOjpTdHJpbmcgcmVzdWx0ID0gIlxuPT09PT09PT09PT09PT0gQmFjayBGb3J3YXJkIExpc3Qg
PT09PT09PT09PT09PT1cbiI7CisgICAgLy8gRk9STUFUOgorICAgIC8vICIgICAgICAgIChmaWxl
IHRlc3QpOmZhc3QvbG9hZGVyL3Jlc291cmNlcy9jbGljay1mcmFnbWVudC1saW5rLmh0bWwgICoq
bmF2IHRhcmdldCoqIgorICAgIC8vICJjdXJyLT4gIChmaWxlIHRlc3QpOmZhc3QvbG9hZGVyL3Jl
c291cmNlcy9jbGljay1mcmFnbWVudC1saW5rLmh0bWwjdGVzdGZyYWdtZW50ICAqKm5hdiB0YXJn
ZXQqKiIKKyAgICBXZWJDb3JlOjpCYWNrRm9yd2FyZExpc3RJbXBsKiBiZkxpc3QgPSBzdGF0aWNf
Y2FzdDxXZWJDb3JlOjpCYWNrRm9yd2FyZExpc3RJbXBsKj4obWFpbkZyYW1lLT5wYWdlKCktPmJh
Y2tGb3J3YXJkKCktPmNsaWVudCgpKTsKKyAgICBpbnQgbWF4SXRlbXMgPSBiZkxpc3QtPmNhcGFj
aXR5KCk7CisgICAgV2ViQ29yZTo6SGlzdG9yeUl0ZW1WZWN0b3IgZW50cmllczsKKyAgICBiZkxp
c3QtPmJhY2tMaXN0V2l0aExpbWl0KG1heEl0ZW1zLCBlbnRyaWVzKTsKKyAgICB1bnNpZ25lZCBy
ZXN1bHRTaXplID0gZW50cmllcy5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8
IHJlc3VsdFNpemU7ICsraSkKKyAgICAgICAgcmVzdWx0ICs9IGR1bXBIaXN0b3J5SXRlbShlbnRy
aWVzW2ldLCA4LCBmYWxzZSk7CisKKyAgICByZXN1bHQgKz0gZHVtcEhpc3RvcnlJdGVtKGJmTGlz
dC0+Y3VycmVudEl0ZW0oKSwgOCwgdHJ1ZSk7CisKKyAgICBiZkxpc3QtPmZvcndhcmRMaXN0V2l0
aExpbWl0KG1heEl0ZW1zLCBlbnRyaWVzKTsKKyAgICByZXN1bHRTaXplID0gZW50cmllcy5zaXpl
KCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IHJlc3VsdFNpemU7ICsraSkKKyAgICAg
ICAgcmVzdWx0ICs9IGR1bXBIaXN0b3J5SXRlbShlbnRyaWVzW2ldLCA4LCBmYWxzZSk7CisKKyAg
ICByZXN1bHQgKz0gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09XG4iOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6
ZHVtcCgpCit7CisgICAgaW52YWxpZGF0ZUFueVByZXZpb3VzV2FpdFRvRHVtcFdhdGNoZG9nKCk7
CisKKyAgICBXVEY6OlN0cmluZyBkdW1wRmlsZSA9IG1fcmVzdWx0c0RpciArICptX2N1cnJlbnRU
ZXN0ICsgIi5kdW1wIjsKKworICAgIFdURjo6U3RyaW5nIHJlc3VsdE1pbWVUeXBlID0gInRleHQv
cGxhaW4iOworICAgIFdURjo6U3RyaW5nIHJlc3BvbnNlTWltZVR5cGUgPSBtYWluRnJhbWUtPmxv
YWRlcigpLT5kb2N1bWVudExvYWRlcigpLT5yZXNwb25zZU1JTUVUeXBlKCk7CisKKyAgICBib29s
IGR1bXBBc1RleHQgPSBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBBc1RleHQoKSB8fCByZXNw
b25zZU1pbWVUeXBlID09ICJ0ZXh0L3BsYWluIjsKKyAgICBXVEY6OlN0cmluZyBkYXRhID0gZHVt
cEFzVGV4dCA/IGR1bXBGcmFtZXNBc1RleHQobWFpbkZyYW1lKSA6IHJlbmRlclRyZWVEdW1wKCk7
CisKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQmFja0ZvcndhcmRMaXN0KCkp
CisgICAgICAgIGRhdGEgKz0gZHVtcEJhY2tGb3J3YXJkTGlzdEZvcldlYlZpZXcoKTsKKworICAg
IFdURjo6U3RyaW5nIHJlc3VsdCA9ICJDb250ZW50LVR5cGU6ICIgKyByZXN1bHRNaW1lVHlwZSAr
ICJcbiIgKyBkYXRhOworCisgICAgZHVtcFRvRmlsZShyZXN1bHQpOworICAgIGlmIChtX2R1bXBQ
aXhlbHMgJiYgIWR1bXBBc1RleHQgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5nZW5lcmF0ZVBp
eGVsUmVzdWx0cygpKQorICAgICAgICBkdW1wV2ViVmlld0FzUGl4ZWxzQW5kQ29tcGFyZVdpdGhF
eHBlY3RlZChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmV4cGVjdGVkUGl4ZWxIYXNoKCkpOworCisg
ICAgV1RGOjpTdHJpbmcgY3Jhc2hGaWxlID0gZHVtcEZpbGUgKyAiLmNyYXNoIjsKKyAgICB1bmxp
bmsoY3Jhc2hGaWxlLnV0ZjgoKS5kYXRhKCkpOworCisgICAgZG9uZSA9IHRydWU7CisgICAgcnVu
UmVtYWluaW5nVGVzdHMoKTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6c2V0V2FpdFRvRHVt
cFdhdGNoZG9nKGRvdWJsZSBpbnRlcnZhbCkKK3sKKyAgICBpbnZhbGlkYXRlQW55UHJldmlvdXNX
YWl0VG9EdW1wV2F0Y2hkb2coKTsKKyAgICBtX3dhaXRUb0R1bXBXYXRjaGRvZ1RpbWVyLnN0YXJ0
T25lU2hvdChpbnRlcnZhbCk7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OndhaXRUb0R1bXBX
YXRjaGRvZ1RpbWVyRmlyZWQoV2ViQ29yZTo6VGltZXI8RHVtcFJlbmRlclRyZWU+KikKK3sKKyAg
ICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPndhaXRUb0R1bXBXYXRjaGRvZ1RpbWVyRmlyZWQoKTsK
K30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6cHJvY2Vzc1dvcmsoV2ViQ29yZTo6VGltZXI8RHVt
cFJlbmRlclRyZWU+KikKK3sKKyAgICBpZiAodG9wTG9hZGluZ0ZyYW1lKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAoV29ya1F1ZXVlOjpzaGFyZWQoKS0+cHJvY2Vzc1dvcmsoKSAmJiAhZ0xh
eW91dFRlc3RDb250cm9sbGVyLT53YWl0VG9EdW1wKCkpCisgICAgICAgIGR1bXAoKTsKK30KKwor
dm9pZCBEdW1wUmVuZGVyVHJlZTo6bG9jYXRpb25DaGFuZ2VGb3JGcmFtZShXZWJDb3JlOjpGcmFt
ZSogZnJhbWUpCit7CisgICAgaWYgKGZyYW1lICE9IHRvcExvYWRpbmdGcmFtZSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgdG9wTG9hZGluZ0ZyYW1lID0gMDsKKyAgICBXb3JrUXVldWU6OnNoYXJl
ZCgpLT5zZXRGcm96ZW4odHJ1ZSk7IC8vIGZpcnN0IGNvbXBsZXRlIGxvYWQgZnJlZXplcyB0aGUg
cXVldWUKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT53YWl0VG9EdW1wKCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmIChXb3JrUXVldWU6OnNoYXJlZCgpLT5jb3VudCgpKQorICAg
ICAgICBtX3dvcmtUaW1lci5zdGFydE9uZVNob3QoMCk7CisgICAgZWxzZQorICAgICAgICBkdW1w
KCk7Cit9CisKKy8vIEZyYW1lTG9hZENsaWVudCBkZWxlZ2F0ZXMuCit2b2lkIER1bXBSZW5kZXJU
cmVlOjpkaWRTdGFydFByb3Zpc2lvbmFsTG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiBmcmFt
ZSkKK3sKKyAgICBpZiAoIWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRnJhbWVM
b2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiJXMgLSBkaWRTdGFydFByb3Zpc2lvbmFs
TG9hZEZvckZyYW1lXG4iLCBkcnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKS51dGY4KCkuZGF0YSgp
KTsKKworICAgIGlmICghZG9uZSAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBVc2VyR2Vz
dHVyZUluRnJhbWVMb2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiRnJhbWUgd2l0aCB1
c2VyIGdlc3R1cmUgXCIlc1wiIC0gaW4gZGlkU3RhcnRQcm92aXNpb25hbExvYWRGb3JGcmFtZVxu
IiwgV2ViQ29yZTo6U2NyaXB0Q29udHJvbGxlcjo6cHJvY2Vzc2luZ1VzZXJHZXN0dXJlKCkgPyAi
dHJ1ZSIgOiAiZmFsc2UiKTsKKworICAgIGlmICghdG9wTG9hZGluZ0ZyYW1lICYmICFkb25lKQor
ICAgICAgICB0b3BMb2FkaW5nRnJhbWUgPSBmcmFtZTsKKworICAgIGlmICghZG9uZSAmJiBnTGF5
b3V0VGVzdENvbnRyb2xsZXItPnN0b3BQcm92aXNpb25hbEZyYW1lTG9hZHMoKSkgeworICAgICAg
ICBwcmludGYoIiVzIC0gc3RvcHBpbmcgbG9hZCBpbiBkaWRTdGFydFByb3Zpc2lvbmFsTG9hZEZv
ckZyYW1lIGNhbGxiYWNrXG4iLCBkcnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKS51dGY4KCkuZGF0
YSgpKTsKKyAgICAgICAgZnJhbWUtPmxvYWRlcigpLT5zdG9wRm9yVXNlckNhbmNlbCgpOworICAg
IH0KK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6ZGlkQ29tbWl0TG9hZEZvckZyYW1lKFdlYkNv
cmU6OkZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9s
bGVyLT5kdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiJXMgLSBkaWRD
b21taXRMb2FkRm9yRnJhbWVcbiIsIGRydEZyYW1lRGVzY3JpcHRpb24oZnJhbWUpLnV0ZjgoKS5k
YXRhKCkpOworCisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zZXRXaW5kb3dJc0tleSh0cnVl
KTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6ZGlkRmFpbFByb3Zpc2lvbmFsTG9hZEZvckZy
YW1lKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIWRvbmUgJiYgZ0xheW91dFRl
c3RDb250cm9sbGVyLT5kdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50Zigi
JXMgLSBkaWRGYWlsUHJvdmlzaW9uYWxMb2FkV2l0aEVycm9yXG4iLCBkcnRGcmFtZURlc2NyaXB0
aW9uKGZyYW1lKS51dGY4KCkuZGF0YSgpKTsKKworICAgIGxvY2F0aW9uQ2hhbmdlRm9yRnJhbWUo
ZnJhbWUpOworfQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpkaWRGYWlsTG9hZEZvckZyYW1lKFdl
YkNvcmU6OkZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIWRvbmUgJiYgZ0xheW91dFRlc3RDb250
cm9sbGVyLT5kdW1wRnJhbWVMb2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiJXMgLSBk
aWRGYWlsTG9hZFdpdGhFcnJvclxuIiwgZHJ0RnJhbWVEZXNjcmlwdGlvbihmcmFtZSkudXRmOCgp
LmRhdGEoKSk7CisKKyAgICBsb2NhdGlvbkNoYW5nZUZvckZyYW1lKGZyYW1lKTsKK30KKwordm9p
ZCBEdW1wUmVuZGVyVHJlZTo6ZGlkRmluaXNoTG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiBm
cmFtZSkKK3sKKyAgICBpZiAoIWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRnJh
bWVMb2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiJXMgLSBkaWRGaW5pc2hMb2FkRm9y
RnJhbWVcbiIsIGRydEZyYW1lRGVzY3JpcHRpb24oZnJhbWUpLnV0ZjgoKS5kYXRhKCkpOworCisg
ICAgaWYgKGZyYW1lID09IHRvcExvYWRpbmdGcmFtZSkKKyAgICAgICAgbV9sb2FkRmluaXNoZWQg
PSB0cnVlOworICAgIGxvY2F0aW9uQ2hhbmdlRm9yRnJhbWUoZnJhbWUpOworfQorCit2b2lkIER1
bXBSZW5kZXJUcmVlOjpkaWRGaW5pc2hEb2N1bWVudExvYWRGb3JGcmFtZShXZWJDb3JlOjpGcmFt
ZSogZnJhbWUpCit7CisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVt
cEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkRmluaXNoRG9j
dW1lbnRMb2FkRm9yRnJhbWVcbiIsIGRydEZyYW1lRGVzY3JpcHRpb24oZnJhbWUpLnV0ZjgoKS5k
YXRhKCkpOworICAgIGVsc2UgaWYgKCFkb25lKSB7CisgICAgICAgIHVuc2lnbmVkIHBlbmRpbmdG
cmFtZVVubG9hZEV2ZW50cyA9IGZyYW1lLT5kb21XaW5kb3coKS0+cGVuZGluZ1VubG9hZEV2ZW50
TGlzdGVuZXJzKCk7CisgICAgICAgIGlmIChwZW5kaW5nRnJhbWVVbmxvYWRFdmVudHMpCisgICAg
ICAgICAgICBwcmludGYoIiVzIC0gaGFzICV1IG9udW5sb2FkIGhhbmRsZXIocylcbiIsIGRydEZy
YW1lRGVzY3JpcHRpb24oZnJhbWUpLnV0ZjgoKS5kYXRhKCksIHBlbmRpbmdGcmFtZVVubG9hZEV2
ZW50cyk7CisgICAgfQorfQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpkaWRDbGVhcldpbmRvd09i
amVjdEluV29ybGQoV2ViQ29yZTo6RE9NV3JhcHBlcldvcmxkKiwgSlNHbG9iYWxDb250ZXh0UmVm
IGNvbnRleHQsIEpTT2JqZWN0UmVmIHdpbmRvd09iamVjdCkKK3sKKyAgICBKU1ZhbHVlUmVmIGV4
Y2VwdGlvbiA9IDA7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPm1ha2VXaW5kb3dPYmpl
Y3QoY29udGV4dCwgd2luZG93T2JqZWN0LCAmZXhjZXB0aW9uKTsKKyAgICBBU1NFUlQoIWV4Y2Vw
dGlvbik7CisKKyAgICBtX2djQ29udHJvbGxlci0+bWFrZVdpbmRvd09iamVjdChjb250ZXh0LCB3
aW5kb3dPYmplY3QsICZleGNlcHRpb24pOworICAgIEFTU0VSVCghZXhjZXB0aW9uKTsKKworICAg
IG1fYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXItPm1ha2VXaW5kb3dPYmplY3QoY29udGV4dCwgd2lu
ZG93T2JqZWN0LCAmZXhjZXB0aW9uKTsKKyAgICBBU1NFUlQoIWV4Y2VwdGlvbik7CisKKyAgICBK
U1N0cmluZ1JlZiBldmVudFNlbmRlclN0ciA9IEpTU3RyaW5nQ3JlYXRlV2l0aFVURjhDU3RyaW5n
KCJldmVudFNlbmRlciIpOworICAgIEpTVmFsdWVSZWYgZXZlbnRTZW5kZXIgPSBtYWtlRXZlbnRT
ZW5kZXIoY29udGV4dCk7CisgICAgSlNPYmplY3RTZXRQcm9wZXJ0eShjb250ZXh0LCB3aW5kb3dP
YmplY3QsIGV2ZW50U2VuZGVyU3RyLCBldmVudFNlbmRlciwga0pTUHJvcGVydHlBdHRyaWJ1dGVS
ZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSwgMCk7CisgICAgSlNTdHJp
bmdSZWxlYXNlKGV2ZW50U2VuZGVyU3RyKTsKKyAgICBXZWJDb3JlVGVzdFN1cHBvcnQ6OmluamVj
dEludGVybmFsc09iamVjdChjb250ZXh0KTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6ZGlk
UmVjZWl2ZVRpdGxlRm9yRnJhbWUoY29uc3QgV1RGOjpTdHJpbmcmIHRpdGxlLCBXZWJDb3JlOjpG
cmFtZSogZnJhbWUpCit7CisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
ZHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkUmVjZWl2
ZVRpdGxlOiAlc1xuIiwgZHJ0RnJhbWVEZXNjcmlwdGlvbihmcmFtZSkudXRmOCgpLmRhdGEoKSwg
dGl0bGUudXRmOCgpLmRhdGEoKSk7CisKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5k
dW1wVGl0bGVDaGFuZ2VzKCkpCisgICAgICAgIHByaW50ZigiVElUTEUgQ0hBTkdFRDogJXNcbiIs
IHRpdGxlLnV0ZjgoKS5kYXRhKCkpOworfQorCisvLyBDaHJvbWVDbGllbnQgZGVsZWdhdGVzLgor
dm9pZCBEdW1wUmVuZGVyVHJlZTo6YWRkTWVzc2FnZVRvQ29uc29sZShjb25zdCBXVEY6OlN0cmlu
ZyYgbWVzc2FnZSwgdW5zaWduZWQgaW50IGxpbmVOdW1iZXIsIGNvbnN0IFdURjo6U3RyaW5nJiBz
b3VyY2VJRCkKK3sKKyAgICBwcmludGYoIkNPTlNPTEUgTUVTU0FHRTogbGluZSAlZDogJXNcbiIs
IGxpbmVOdW1iZXIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7Cit9CisKK3ZvaWQgRHVtcFJlbmRl
clRyZWU6OnJ1bkphdmFTY3JpcHRBbGVydChjb25zdCBXVEY6OlN0cmluZyYgbWVzc2FnZSkKK3sK
KyAgICBpZiAoIWRvbmUpCisgICAgICAgIHByaW50ZigiQUxFUlQ6ICVzXG4iLCBtZXNzYWdlLnV0
ZjgoKS5kYXRhKCkpOworfQorCitib29sIER1bXBSZW5kZXJUcmVlOjpydW5KYXZhU2NyaXB0Q29u
ZmlybShjb25zdCBXVEY6OlN0cmluZyYgbWVzc2FnZSkKK3sKKyAgICBpZiAoIWRvbmUpCisgICAg
ICAgIHByaW50ZigiQ09ORklSTTogJXNcbiIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7CisgICAg
cmV0dXJuIHRydWU7Cit9CisKK1dURjo6U3RyaW5nIER1bXBSZW5kZXJUcmVlOjpydW5KYXZhU2Ny
aXB0UHJvbXB0KGNvbnN0IFdURjo6U3RyaW5nJiBtZXNzYWdlLCBjb25zdCBXVEY6OlN0cmluZyYg
ZGVmYXVsdFZhbHVlKQoreworICAgIGlmICghZG9uZSkKKyAgICAgICAgcHJpbnRmKCJQUk9NUFQ6
ICVzLCBkZWZhdWx0IHRleHQ6ICVzXG4iLCBtZXNzYWdlLnV0ZjgoKS5kYXRhKCksIGRlZmF1bHRW
YWx1ZS51dGY4KCkuZGF0YSgpKTsKKyAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworfQorCitib29s
IER1bXBSZW5kZXJUcmVlOjpydW5CZWZvcmVVbmxvYWRDb25maXJtUGFuZWwoY29uc3QgV1RGOjpT
dHJpbmcmIG1lc3NhZ2UpCit7CisgICAgaWYgKCFkb25lKQorICAgICAgICBwcmludGYoIkNPTkZJ
Uk0gTkFWSUdBVElPTjogJXNcbiIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7CisgICAgcmV0dXJu
IHRydWU7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OnNldFN0YXR1c1RleHQoY29uc3QgV1RG
OjpTdHJpbmcmIHN0YXR1cykKK3sKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1w
U3RhdHVzQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiVUkgREVMRUdBVEUgU1RBVFVTIENB
TExCQUNLOiBzZXRTdGF0dXNUZXh0OiVzXG4iLCBzdGF0dXMudXRmOCgpLmRhdGEoKSk7Cit9CisK
K3ZvaWQgRHVtcFJlbmRlclRyZWU6OmV4Y2VlZGVkRGF0YWJhc2VRdW90YShXZWJDb3JlOjpTZWN1
cml0eU9yaWdpbiogb3JpZ2luLCBjb25zdCBXVEY6OlN0cmluZyYgbmFtZSkKK3sKKyAgICBpZiAo
IWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRGF0YWJhc2VDYWxsYmFja3MoKSkK
KyAgICAgICAgcHJpbnRmKCJVSSBERUxFR0FURSBEQVRBQkFTRSBDQUxMQkFDSzogZXhjZWVkZWRE
YXRhYmFzZVF1b3RhRm9yU2VjdXJpdHlPcmlnaW46eyVzLCAlcywgJWl9IGRhdGFiYXNlOiVzXG4i
LCBvcmlnaW4tPnByb3RvY29sKCkudXRmOCgpLmRhdGEoKSwgb3JpZ2luLT5ob3N0KCkudXRmOCgp
LmRhdGEoKSwgb3JpZ2luLT5wb3J0KCksIG5hbWUudXRmOCgpLmRhdGEoKSk7CisKKyAgICBXZWJD
b3JlOjpEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIoKS5zZXRRdW90YShtYWluRnJhbWUtPmRvY3Vt
ZW50KCktPnNlY3VyaXR5T3JpZ2luKCksIDUgKiAxMDI0ICogMTAyNCk7Cit9CisKK2Jvb2wgRHVt
cFJlbmRlclRyZWU6OmFsbG93c09wZW5pbmdXaW5kb3coKQoreworICAgIHJldHVybiBnTGF5b3V0
VGVzdENvbnRyb2xsZXItPmNhbk9wZW5XaW5kb3dzKCk7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRy
ZWU6OndpbmRvd0NyZWF0ZWQoQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlKiBwYWdlKQorewor
ICAgIHBhZ2UtPnNldHRpbmdzKCktPnNldEphdmFTY3JpcHRPcGVuV2luZG93c0F1dG9tYXRpY2Fs
bHkodHJ1ZSk7Cit9CisKKy8vIEVkaXRvckNsaWVudCBkZWxlZ2F0ZXMuCit2b2lkIER1bXBSZW5k
ZXJUcmVlOjpkaWRCZWdpbkVkaXRpbmcoKQoreworICAgIGlmICghZG9uZSAmJiBnTGF5b3V0VGVz
dENvbnRyb2xsZXItPmR1bXBFZGl0aW5nQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiRURJ
VElORyBERUxFR0FURTogd2ViVmlld0RpZEJlZ2luRWRpdGluZzolc1xuIiwgIldlYlZpZXdEaWRC
ZWdpbkVkaXRpbmdOb3RpZmljYXRpb24iKTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6ZGlk
RW5kRWRpdGluZygpCit7CisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
ZHVtcEVkaXRpbmdDYWxsYmFja3MoKSkKKyAgICAgICAgcHJpbnRmKCJFRElUSU5HIERFTEVHQVRF
OiB3ZWJWaWV3RGlkRW5kRWRpdGluZzolc1xuIiwgIldlYlZpZXdEaWRFbmRFZGl0aW5nTm90aWZp
Y2F0aW9uIik7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmRpZENoYW5nZSgpCit7CisgICAg
aWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEVkaXRpbmdDYWxsYmFja3Mo
KSkKKyAgICAgICAgcHJpbnRmKCJFRElUSU5HIERFTEVHQVRFOiB3ZWJWaWV3RGlkQ2hhbmdlOiVz
XG4iLCAiV2ViVmlld0RpZENoYW5nZU5vdGlmaWNhdGlvbiIpOworfQorCit2b2lkIER1bXBSZW5k
ZXJUcmVlOjpkaWRDaGFuZ2VTZWxlY3Rpb24oKQoreworICAgIGlmICghZG9uZSAmJiBnTGF5b3V0
VGVzdENvbnRyb2xsZXItPmR1bXBFZGl0aW5nQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50Zigi
RURJVElORyBERUxFR0FURTogd2ViVmlld0RpZENoYW5nZVNlbGVjdGlvbjolc1xuIiwgIldlYlZp
ZXdEaWRDaGFuZ2VTZWxlY3Rpb25Ob3RpZmljYXRpb24iKTsKK30KKworYm9vbCBEdW1wUmVuZGVy
VHJlZTo6ZmluZFN0cmluZyhjb25zdCBXVEY6OlN0cmluZyYgc3RyaW5nLCBXZWJDb3JlOjpGaW5k
T3B0aW9ucyBvcHRpb25zKQoreworICAgIFdlYkNvcmU6OlBhZ2UqIHBhZ2UgPSBtYWluRnJhbWUg
PyBtYWluRnJhbWUtPnBhZ2UoKSA6IDA7CisgICAgcmV0dXJuIHBhZ2UgJiYgcGFnZS0+ZmluZFN0
cmluZyhzdHJpbmcsIG9wdGlvbnMpOworfQorCitib29sIER1bXBSZW5kZXJUcmVlOjpzaG91bGRC
ZWdpbkVkaXRpbmdJbkRPTVJhbmdlKFdlYkNvcmU6OlJhbmdlKiByYW5nZSkKK3sKKyAgICBpZiAo
IWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRWRpdGluZ0NhbGxiYWNrcygpKQor
ICAgICAgICBwcmludGYoIkVESVRJTkcgREVMRUdBVEU6IHNob3VsZEJlZ2luRWRpdGluZ0luRE9N
UmFuZ2U6JXNcbiIsIGRydFJhbmdlRGVzY3JpcHRpb24ocmFuZ2UpLnV0ZjgoKS5kYXRhKCkpOwor
ICAgIHJldHVybiBtX2FjY2VwdHNFZGl0aW5nOworfQorCitib29sIER1bXBSZW5kZXJUcmVlOjpz
aG91bGRFbmRFZGl0aW5nSW5ET01SYW5nZShXZWJDb3JlOjpSYW5nZSogcmFuZ2UpCit7CisgICAg
aWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEVkaXRpbmdDYWxsYmFja3Mo
KSkKKyAgICAgICAgcHJpbnRmKCJFRElUSU5HIERFTEVHQVRFOiBzaG91bGRFbmRFZGl0aW5nSW5E
T01SYW5nZTolc1xuIiwgZHJ0UmFuZ2VEZXNjcmlwdGlvbihyYW5nZSkudXRmOCgpLmRhdGEoKSk7
CisgICAgcmV0dXJuIG1fYWNjZXB0c0VkaXRpbmc7Cit9CisKK2Jvb2wgRHVtcFJlbmRlclRyZWU6
OnNob3VsZERlbGV0ZURPTVJhbmdlKFdlYkNvcmU6OlJhbmdlKiByYW5nZSkKK3sKKyAgICBpZiAo
IWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRWRpdGluZ0NhbGxiYWNrcygpKQor
ICAgICAgICBwcmludGYoIkVESVRJTkcgREVMRUdBVEU6IHNob3VsZERlbGV0ZURPTVJhbmdlOiVz
XG4iLCBkcnRSYW5nZURlc2NyaXB0aW9uKHJhbmdlKS51dGY4KCkuZGF0YSgpKTsKKyAgICByZXR1
cm4gbV9hY2NlcHRzRWRpdGluZzsKK30KKworYm9vbCBEdW1wUmVuZGVyVHJlZTo6c2hvdWxkQ2hh
bmdlU2VsZWN0ZWRET01SYW5nZVRvRE9NUmFuZ2VBZmZpbml0eVN0aWxsU2VsZWN0aW5nKFdlYkNv
cmU6OlJhbmdlKiBmcm9tUmFuZ2UsIFdlYkNvcmU6OlJhbmdlKiB0b1JhbmdlLCBpbnQgYWZmaW5p
dHksIGJvb2wgc3RpbGxTZWxlY3RpbmcpCit7CisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRUZXN0
Q29udHJvbGxlci0+ZHVtcEVkaXRpbmdDYWxsYmFja3MoKSkKKyAgICAgICAgcHJpbnRmKCJFRElU
SU5HIERFTEVHQVRFOiBzaG91bGRDaGFuZ2VTZWxlY3RlZERPTVJhbmdlOiVzIHRvRE9NUmFuZ2U6
JXMgYWZmaW5pdHk6JXMgc3RpbGxTZWxlY3Rpbmc6JXNcbiIsIGRydFJhbmdlRGVzY3JpcHRpb24o
ZnJvbVJhbmdlKS51dGY4KCkuZGF0YSgpLCBkcnRSYW5nZURlc2NyaXB0aW9uKHRvUmFuZ2UpLnV0
ZjgoKS5kYXRhKCksIGRydEFmZmluaXR5RGVzY3JpcHRpb24oc3RhdGljX2Nhc3Q8V2ViQ29yZTo6
RUFmZmluaXR5PihhZmZpbml0eSkpLnV0ZjgoKS5kYXRhKCksIHN0aWxsU2VsZWN0aW5nID8gIlRS
VUUiIDogIkZBTFNFIik7CisgICAgcmV0dXJuIG1fYWNjZXB0c0VkaXRpbmc7Cit9CisKK3N0YXRp
YyBjb25zdCBjaGFyKiBpbnNlcnRBY3Rpb25TdHJpbmcoV2ViQ29yZTo6RWRpdG9ySW5zZXJ0QWN0
aW9uIGFjdGlvbikKK3sKKyAgICBzd2l0Y2ggKGFjdGlvbikgeworICAgIGNhc2UgV2ViQ29yZTo6
RWRpdG9ySW5zZXJ0QWN0aW9uVHlwZWQ6CisgICAgICAgIHJldHVybiAiV2ViVmlld0luc2VydEFj
dGlvblR5cGVkIjsKKyAgICBjYXNlIFdlYkNvcmU6OkVkaXRvckluc2VydEFjdGlvblBhc3RlZDoK
KyAgICAgICAgcmV0dXJuICJXZWJWaWV3SW5zZXJ0QWN0aW9uUGFzdGVkIjsKKyAgICBjYXNlIFdl
YkNvcmU6OkVkaXRvckluc2VydEFjdGlvbkRyb3BwZWQ6CisgICAgICAgIHJldHVybiAiV2ViVmll
d0luc2VydEFjdGlvbkRyb3BwZWQiOworICAgIH0KKyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsK
KyAgICByZXR1cm4gIldlYlZpZXdJbnNlcnRBY3Rpb25UeXBlZCI7Cit9CisKK2Jvb2wgRHVtcFJl
bmRlclRyZWU6OnNob3VsZEluc2VydE5vZGUoV2ViQ29yZTo6Tm9kZSogbm9kZSwgV2ViQ29yZTo6
UmFuZ2UqIHJhbmdlLCBpbnQgYWN0aW9uKQoreworICAgIGlmICghZG9uZSAmJiBnTGF5b3V0VGVz
dENvbnRyb2xsZXItPmR1bXBFZGl0aW5nQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiRURJ
VElORyBERUxFR0FURTogc2hvdWxkSW5zZXJ0Tm9kZTolcyByZXBsYWNpbmdET01SYW5nZTolcyBn
aXZlbkFjdGlvbjolc1xuIiwgZHJ0RHVtcFBhdGgobm9kZSkudXRmOCgpLmRhdGEoKSwgZHJ0UmFu
Z2VEZXNjcmlwdGlvbihyYW5nZSkudXRmOCgpLmRhdGEoKSwgaW5zZXJ0QWN0aW9uU3RyaW5nKChX
ZWJDb3JlOjpFZGl0b3JJbnNlcnRBY3Rpb24pYWN0aW9uKSk7CisgICAgcmV0dXJuIG1fYWNjZXB0
c0VkaXRpbmc7Cit9CisKK2Jvb2wgRHVtcFJlbmRlclRyZWU6OnNob3VsZEluc2VydFRleHQoY29u
c3QgV1RGOjpTdHJpbmcmIHRleHQsIFdlYkNvcmU6OlJhbmdlKiByYW5nZSwgaW50IGFjdGlvbikK
K3sKKyAgICBpZiAoIWRvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRWRpdGluZ0Nh
bGxiYWNrcygpKQorICAgICAgICBwcmludGYoIkVESVRJTkcgREVMRUdBVEU6IHNob3VsZEluc2Vy
dFRleHQ6JXMgcmVwbGFjaW5nRE9NUmFuZ2U6JXMgZ2l2ZW5BY3Rpb246JXNcbiIsIHRleHQudXRm
OCgpLmRhdGEoKSwgZHJ0UmFuZ2VEZXNjcmlwdGlvbihyYW5nZSkudXRmOCgpLmRhdGEoKSwgaW5z
ZXJ0QWN0aW9uU3RyaW5nKChXZWJDb3JlOjpFZGl0b3JJbnNlcnRBY3Rpb24pYWN0aW9uKSk7Cisg
ICAgcmV0dXJuIG1fYWNjZXB0c0VkaXRpbmc7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmRp
ZERlY2lkZVBvbGljeUZvck5hdmlnYXRpb25BY3Rpb24oY29uc3QgV2ViQ29yZTo6TmF2aWdhdGlv
bkFjdGlvbiYgYWN0aW9uLCBjb25zdCBXZWJDb3JlOjpSZXNvdXJjZVJlcXVlc3QmIHJlcXVlc3Qp
Cit7CisgICAgaWYgKCF3YWl0Rm9yUG9saWN5KQorICAgICAgICByZXR1cm47CisKKyAgICBjb25z
dCBjaGFyKiB0eXBlRGVzY3JpcHRpb247CisgICAgc3dpdGNoIChhY3Rpb24udHlwZSgpKSB7Cisg
ICAgY2FzZSBXZWJDb3JlOjpOYXZpZ2F0aW9uVHlwZUxpbmtDbGlja2VkOgorICAgICAgICB0eXBl
RGVzY3JpcHRpb24gPSAibGluayBjbGlja2VkIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBX
ZWJDb3JlOjpOYXZpZ2F0aW9uVHlwZUZvcm1TdWJtaXR0ZWQ6CisgICAgICAgIHR5cGVEZXNjcmlw
dGlvbiA9ICJmb3JtIHN1Ym1pdHRlZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV2ViQ29y
ZTo6TmF2aWdhdGlvblR5cGVCYWNrRm9yd2FyZDoKKyAgICAgICAgdHlwZURlc2NyaXB0aW9uID0g
ImJhY2svZm9yd2FyZCI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV2ViQ29yZTo6TmF2aWdh
dGlvblR5cGVSZWxvYWQ6CisgICAgICAgIHR5cGVEZXNjcmlwdGlvbiA9ICJyZWxvYWQiOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFdlYkNvcmU6Ok5hdmlnYXRpb25UeXBlRm9ybVJlc3VibWl0
dGVkOgorICAgICAgICB0eXBlRGVzY3JpcHRpb24gPSAiZm9ybSByZXN1Ym1pdHRlZCI7CisgICAg
ICAgIGJyZWFrOworICAgIGNhc2UgV2ViQ29yZTo6TmF2aWdhdGlvblR5cGVPdGhlcjoKKyAgICAg
ICAgdHlwZURlc2NyaXB0aW9uID0gIm90aGVyIjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVs
dDoKKyAgICAgICAgdHlwZURlc2NyaXB0aW9uID0gImlsbGVnYWwgdmFsdWUiOworICAgIH0KKwor
ICAgIHByaW50ZigiUG9saWN5IGRlbGVnYXRlOiBhdHRlbXB0IHRvIGxvYWQgJXMgd2l0aCBuYXZp
Z2F0aW9uIHR5cGUgJyVzJ1xuIiwgcmVxdWVzdC51cmwoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgp
LCB0eXBlRGVzY3JpcHRpb24pOworICAgIC8vIEZJWE1FOiBkbyBvcmlnaW5hdGluZyBwYXJ0Lgor
CisgICAgZ0xheW91dFRlc3RDb250cm9sbGVyLT5ub3RpZnlEb25lKCk7Cit9CisKK3ZvaWQgRHVt
cFJlbmRlclRyZWU6OmRpZERpc3BhdGNoV2lsbFBlcmZvcm1DbGllbnRSZWRpcmVjdCgpCit7Cisg
ICAgaWYgKCFkb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcFVzZXJHZXN0dXJlSW5G
cmFtZUxvYWRDYWxsYmFja3MoKSkKKyAgICAgICAgcHJpbnRmKCJGcmFtZSB3aXRoIHVzZXIgZ2Vz
dHVyZSBcIiVzXCIgLSBpbiB3aWxsUGVyZm9ybUNsaWVudFJlZGlyZWN0XG4iLCBXZWJDb3JlOjpT
Y3JpcHRDb250cm9sbGVyOjpwcm9jZXNzaW5nVXNlckdlc3R1cmUoKSA/ICJ0cnVlIiA6ICJmYWxz
ZSIpOworfQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpkaWRIYW5kbGVPbmxvYWRFdmVudHNGb3JG
cmFtZShXZWJDb3JlOjpGcmFtZSogZnJhbWUpCit7CisgICAgaWYgKCFkb25lICYmIGdMYXlvdXRU
ZXN0Q29udHJvbGxlci0+ZHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYo
IiVzIC0gZGlkSGFuZGxlT25sb2FkRXZlbnRzRm9yRnJhbWVcbiIsIGRydEZyYW1lRGVzY3JpcHRp
b24oZnJhbWUpLnV0ZjgoKS5kYXRhKCkpOworfQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpkaWRS
ZWNlaXZlUmVzcG9uc2VGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSogZnJhbWUsIGNvbnN0IFdlYkNv
cmU6OlJlc291cmNlUmVzcG9uc2UmIHJlc3BvbnNlKQoreworICAgIGlmICghZG9uZSAmJiBnTGF5
b3V0VGVzdENvbnRyb2xsZXItPmR1bXBSZXNvdXJjZVJlc3BvbnNlTUlNRVR5cGVzKCkpCisgICAg
ICAgIHByaW50ZigiJXMgaGFzIE1JTUUgdHlwZSAlc1xuIiwgcmVzcG9uc2UudXJsKCkubGFzdFBh
dGhDb21wb25lbnQoKS51dGY4KCkuZGF0YSgpLCByZXNwb25zZS5taW1lVHlwZSgpLnV0ZjgoKS5k
YXRhKCkpOworfQorCit9Cit9CisKKy8vIFN0YXRpYyBkdW1wKCkgZnVuY3Rpb24gcmVxdWlyZWQg
YnkgY3Jvc3MtcGxhdGZvcm0gRFJUIGNvZGUuCit2b2lkIGR1bXAoKQoreworICAgIEJsYWNrQmVy
cnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWUqIGR1bXBlciA9IEJsYWNrQmVycnk6OldlYktpdDo6
RHVtcFJlbmRlclRyZWU6OmN1cnJlbnRJbnN0YW5jZSgpOworICAgIGlmICghZHVtcGVyKQorICAg
ICAgICByZXR1cm47CisKKyAgICBkdW1wZXItPmR1bXAoKTsKK30KZGlmZiAtLWdpdCBhL1Rvb2xz
L0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvRHVtcFJlbmRlclRyZWVCbGFja0JlcnJ5LmggYi9U
b29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L0R1bXBSZW5kZXJUcmVlQmxhY2tCZXJyeS5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLmRiMmY2OWEzMDZjMzk5YjVjNThiMmU3OTY5ODQ1NTFmYmJmOWQzNTYKLS0t
IC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L0R1bXBSZW5k
ZXJUcmVlQmxhY2tCZXJyeS5oCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA5LCAyMDEwLCAyMDExLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5
b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlz
aGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAy
IG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdp
bGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4g
dGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSBy
ZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vu
c2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29m
dHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxv
b3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpZm5kZWYgRHVtcFJlbmRl
clRyZWVCbGFja0JlcnJ5X2gKKyNkZWZpbmUgRHVtcFJlbmRlclRyZWVCbGFja0JlcnJ5X2gKKwor
I2luY2x1ZGUgIkJsYWNrQmVycnlHbG9iYWwuaCIKKworI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVl
Q2xpZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNpbmNsdWRlICJUaW1lci5o
IgorI2luY2x1ZGUgPEZpbmRPcHRpb25zLmg+CisjaW5jbHVkZSA8d3RmL1ZlY3Rvci5oPgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBGcmFtZTsKK2NsYXNzIERPTVdyYXBwZXJXb3JsZDsK
K2NsYXNzIFJhbmdlOworfQorCitleHRlcm4gV2ViQ29yZTo6RnJhbWUqIG1haW5GcmFtZTsKK2V4
dGVybiBXZWJDb3JlOjpGcmFtZSogdG9wTG9hZGluZ0ZyYW1lOworZXh0ZXJuIGJvb2wgd2FpdEZv
clBvbGljeTsKKworY2xhc3MgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI7CitjbGFzcyBHQ0NvbnRy
b2xsZXI7CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgeworY2xh
c3MgV2ViUGFnZTsKKworY2xhc3MgRHVtcFJlbmRlclRyZWUgOiBwdWJsaWMgQmxhY2tCZXJyeTo6
V2ViS2l0OjpEdW1wUmVuZGVyVHJlZUNsaWVudCB7CitwdWJsaWM6CisgICAgRHVtcFJlbmRlclRy
ZWUoV2ViUGFnZSopOworICAgIHZpcnR1YWwgfkR1bXBSZW5kZXJUcmVlKCk7CisKKyAgICBzdGF0
aWMgRHVtcFJlbmRlclRyZWUqIGN1cnJlbnRJbnN0YW5jZSgpIHsgcmV0dXJuIHNfY3VycmVudElu
c3RhbmNlOyB9CisKKyAgICB2b2lkIGR1bXAoKTsKKworICAgIHZvaWQgc2V0V2FpdFRvRHVtcFdh
dGNoZG9nKGRvdWJsZSBpbnRlcnZhbCk7CisKKyAgICBXZWJQYWdlKiBwYWdlKCkgeyByZXR1cm4g
bV9wYWdlOyB9CisKKyAgICBib29sIGxvYWRGaW5pc2hlZCgpIGNvbnN0IHsgcmV0dXJuIG1fbG9h
ZEZpbmlzaGVkOyB9CisKKyAgICAvLyBGcmFtZUxvYWRlckNsaWVudCBkZWxlZ2F0ZXMKKyAgICB2
b2lkIGRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqKTsKKyAg
ICB2b2lkIGRpZENvbW1pdExvYWRGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSopOworICAgIHZvaWQg
ZGlkRmFpbFByb3Zpc2lvbmFsTG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKik7CisgICAgdm9p
ZCBkaWRGYWlsTG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKik7CisgICAgdm9pZCBkaWRGaW5p
c2hMb2FkRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqKTsKKyAgICB2b2lkIGRpZEZpbmlzaERvY3Vt
ZW50TG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKik7CisgICAgdm9pZCBkaWRDbGVhcldpbmRv
d09iamVjdEluV29ybGQoV2ViQ29yZTo6RE9NV3JhcHBlcldvcmxkKiwgSlNHbG9iYWxDb250ZXh0
UmVmLCBKU09iamVjdFJlZiB3aW5kb3dPYmplY3QpOworICAgIHZvaWQgZGlkUmVjZWl2ZVRpdGxl
Rm9yRnJhbWUoY29uc3QgV1RGOjpTdHJpbmcmIHRpdGxlLCBXZWJDb3JlOjpGcmFtZSopOworICAg
IHZvaWQgZGlkRGVjaWRlUG9saWN5Rm9yTmF2aWdhdGlvbkFjdGlvbihjb25zdCBXZWJDb3JlOjpO
YXZpZ2F0aW9uQWN0aW9uJiwgY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXF1ZXN0Jik7CisgICAg
dm9pZCBkaWREaXNwYXRjaFdpbGxQZXJmb3JtQ2xpZW50UmVkaXJlY3QoKTsKKyAgICB2b2lkIGRp
ZEhhbmRsZU9ubG9hZEV2ZW50c0ZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKik7CisgICAgdm9pZCBk
aWRSZWNlaXZlUmVzcG9uc2VGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSosIGNvbnN0IFdlYkNvcmU6
OlJlc291cmNlUmVzcG9uc2UmKTsKKworICAgIC8vIENocm9tZUNsaWVudCBkZWxlZ2F0ZXMKKyAg
ICB2b2lkIGFkZE1lc3NhZ2VUb0NvbnNvbGUoY29uc3QgV1RGOjpTdHJpbmcmIG1lc3NhZ2UsIHVu
c2lnbmVkIGludCBsaW5lTnVtYmVyLCBjb25zdCBXVEY6OlN0cmluZyYgc291cmNlSUQpOworICAg
IHZvaWQgcnVuSmF2YVNjcmlwdEFsZXJ0KGNvbnN0IFdURjo6U3RyaW5nJiBtZXNzYWdlKTsKKyAg
ICBib29sIHJ1bkphdmFTY3JpcHRDb25maXJtKGNvbnN0IFdURjo6U3RyaW5nJiBtZXNzYWdlKTsK
KyAgICBXVEY6OlN0cmluZyBydW5KYXZhU2NyaXB0UHJvbXB0KGNvbnN0IFdURjo6U3RyaW5nJiBt
ZXNzYWdlLCBjb25zdCBXVEY6OlN0cmluZyYgZGVmYXVsdFZhbHVlKTsKKyAgICBib29sIHJ1bkJl
Zm9yZVVubG9hZENvbmZpcm1QYW5lbChjb25zdCBXVEY6OlN0cmluZyYgbWVzc2FnZSk7CisgICAg
dm9pZCBzZXRTdGF0dXNUZXh0KGNvbnN0IFdURjo6U3RyaW5nJik7CisgICAgdm9pZCBleGNlZWRl
ZERhdGFiYXNlUXVvdGEoV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4qLCBjb25zdCBXVEY6OlN0cmlu
ZyYgbmFtZSk7CisgICAgYm9vbCBhbGxvd3NPcGVuaW5nV2luZG93KCk7CisgICAgdm9pZCB3aW5k
b3dDcmVhdGVkKFdlYlBhZ2UqKTsKKworICAgIC8vIEVkaXRvckNsaWVudCBkZWxlZ2F0ZXMKKyAg
ICB2b2lkIHNldEFjY2VwdHNFZGl0aW5nKGJvb2wgYWNjZXB0c0VkaXRpbmcpIHsgbV9hY2NlcHRz
RWRpdGluZyA9IGFjY2VwdHNFZGl0aW5nOyB9CisKKyAgICB2b2lkIGRpZEJlZ2luRWRpdGluZygp
OworICAgIHZvaWQgZGlkRW5kRWRpdGluZygpOworICAgIHZvaWQgZGlkQ2hhbmdlKCk7CisgICAg
dm9pZCBkaWRDaGFuZ2VTZWxlY3Rpb24oKTsKKyAgICBib29sIGZpbmRTdHJpbmcoY29uc3QgV1RG
OjpTdHJpbmcmLCBXZWJDb3JlOjpGaW5kT3B0aW9ucyk7CisgICAgYm9vbCBzaG91bGRCZWdpbkVk
aXRpbmdJbkRPTVJhbmdlKFdlYkNvcmU6OlJhbmdlKik7CisgICAgYm9vbCBzaG91bGRFbmRFZGl0
aW5nSW5ET01SYW5nZShXZWJDb3JlOjpSYW5nZSopOworICAgIGJvb2wgc2hvdWxkRGVsZXRlRE9N
UmFuZ2UoV2ViQ29yZTo6UmFuZ2UqKTsKKyAgICBib29sIHNob3VsZENoYW5nZVNlbGVjdGVkRE9N
UmFuZ2VUb0RPTVJhbmdlQWZmaW5pdHlTdGlsbFNlbGVjdGluZyhXZWJDb3JlOjpSYW5nZSogZnJv
bVJhbmdlLCBXZWJDb3JlOjpSYW5nZSogdG9SYW5nZSwgaW50IGFmZmluaXR5LCBib29sIHN0aWxs
U2VsZWN0aW5nKTsKKyAgICBib29sIHNob3VsZEluc2VydE5vZGUoV2ViQ29yZTo6Tm9kZSosIFdl
YkNvcmU6OlJhbmdlKiwgaW50IGluc2VydEFjdGlvbik7CisgICAgYm9vbCBzaG91bGRJbnNlcnRU
ZXh0KGNvbnN0IFdURjo6U3RyaW5nJiwgV2ViQ29yZTo6UmFuZ2UqLCBpbnQgaW5zZXJ0QWN0aW9u
KTsKKworICAgIGJvb2wgaXNTZWxlY3RUcmFpbGluZ1doaXRlc3BhY2VFbmFibGVkKCkgY29uc3Qg
eyByZXR1cm4gc19zZWxlY3RUcmFpbGluZ1doaXRlc3BhY2VFbmFibGVkOyB9CisgICAgdm9pZCBz
ZXRTZWxlY3RUcmFpbGluZ1doaXRlc3BhY2VFbmFibGVkKGJvb2wgZW5hYmxlZCkgeyBzX3NlbGVj
dFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJsZWQgPSBlbmFibGVkOyB9CisKK3ByaXZhdGU6CisgICAg
dm9pZCBydW5UZXN0KGNvbnN0IFdURjo6U3RyaW5nJiB1cmwpOworICAgIHZvaWQgcnVuVGVzdHMo
KTsKKworICAgIHZvaWQgcHJvY2Vzc1dvcmsoV2ViQ29yZTo6VGltZXI8RHVtcFJlbmRlclRyZWU+
Kik7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIER1bXBSZW5kZXJUcmVlKiBzX2N1cnJlbnRJbnN0
YW5jZTsKKworICAgIFdURjo6U3RyaW5nIGR1bXBGcmFtZXNBc1RleHQoV2ViQ29yZTo6RnJhbWUq
KTsKKyAgICB2b2lkIGxvY2F0aW9uQ2hhbmdlRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqKTsKKwor
ICAgIHZvaWQgZG9uZURydCgpOworICAgIHZvaWQgZ2V0VGVzdHNUb1J1bigpOworICAgIGJvb2wg
aXNIVFRQVGVzdChjb25zdCBXVEY6OlN0cmluZyYgdGVzdCk7CisgICAgV1RGOjpTdHJpbmcgcmVu
ZGVyVHJlZUR1bXAoKSBjb25zdDsKKyAgICB2b2lkIHJlc2V0VG9Db25zaXN0ZW50U3RhdGVCZWZv
cmVUZXN0aW5nKCk7CisgICAgdm9pZCBydW5SZW1haW5pbmdUZXN0cygpOworICAgIHZvaWQgaW52
YWxpZGF0ZUFueVByZXZpb3VzV2FpdFRvRHVtcFdhdGNoZG9nKCk7CisgICAgdm9pZCB3YWl0VG9E
dW1wV2F0Y2hkb2dUaW1lckZpcmVkKFdlYkNvcmU6OlRpbWVyPER1bXBSZW5kZXJUcmVlPiopOwor
CisgICAgVmVjdG9yPFdURjo6U3RyaW5nPiBtX3Rlc3RzOworICAgIFZlY3RvcjxXVEY6OlN0cmlu
Zz46Oml0ZXJhdG9yIG1fY3VycmVudFRlc3Q7CisKKyAgICBXVEY6OlN0cmluZyBtX3Jlc3VsdHNE
aXI7CisgICAgV1RGOjpTdHJpbmcgbV9pbmRleEZpbGU7CisgICAgV1RGOjpTdHJpbmcgbV9kb25l
RmlsZTsKKyAgICBXVEY6OlN0cmluZyBtX2N1cnJlbnRIdHRwVGVzdDsKKyAgICBXVEY6OlN0cmlu
ZyBtX2N1cnJlbnRUZXN0RmlsZTsKKworICAgIEdDQ29udHJvbGxlciogbV9nY0NvbnRyb2xsZXI7
CisgICAgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIqIG1fYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI7
CisgICAgV2ViUGFnZSogbV9wYWdlOworICAgIGJvb2wgbV9kdW1wUGl4ZWxzOworICAgIFdlYkNv
cmU6OlRpbWVyPER1bXBSZW5kZXJUcmVlPiBtX3dhaXRUb0R1bXBXYXRjaGRvZ1RpbWVyOworICAg
IFdlYkNvcmU6OlRpbWVyPER1bXBSZW5kZXJUcmVlPiBtX3dvcmtUaW1lcjsKKworICAgIGJvb2wg
bV9hY2NlcHRzRWRpdGluZzsKKyAgICBib29sIG1fbG9hZEZpbmlzaGVkOworICAgIHN0YXRpYyBi
b29sIHNfc2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZDsKK307Cit9Cit9CisKKyNlbmRp
ZiAvLyBEdW1wUmVuZGVyVHJlZUJsYWNrQmVycnlfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126096</attachid>
            <date>2012-02-08 09:07:19 -0800</date>
            <delta_ts>2012-02-08 11:07:56 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78042-20120208120948.patch</filename>
            <type>text/plain</type>
            <size>41625</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MDg5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDAwMDgyNTliODE4MThlZjg4
NDhhZDQxZmE1ZGJhNTExMzVkMzU0ZmMuLmI3YjI4MzMyZjk4MDRlZTBhMGE1OGU1NDVhYzc4NWEz
YWQ1NWQwOTQgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTQgQEAKKzIwMTItMDItMDggIFJvYiBCdWlz
ICA8cmJ1aXNAcmltLmNvbT4KKworICAgICAgICBbQmxhY2tCZXJyeV0gVXBzdHJlYW0gRHVtcFJl
bmRlclRyZWVCbGFja0JlcnJ5CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD03ODA0MgorCisgICAgICAgIFJldmlld2VkIGJ5IEFudG9uaW8gR29tZXMuCisK
KyAgICAgICAgQWRkIGFic3RyYWN0IGludGVyZmFjZSBmb3Igb3VyIER1bXBSZW5kZXJUcmVlIHNv
bHV0aW9uLgorCisgICAgICAgICogYmxhY2tiZXJyeS9BcGkvRHVtcFJlbmRlclRyZWVDbGllbnQu
aDogQWRkZWQuCisKIDIwMTItMDItMDcgIFJvYmVydCBLcm9lZ2VyICA8cmprcm9lZ2VAY2hyb21p
dW0ub3JnPgogCiAgICAgICAgIFtjaHJvbWl1bV0gUmVtb3ZlIG5vIGxvbmdlciBuZWNlc3Nhcnkg
Q2hyb21pdW0gZ2VzdHVyZSByZWNvZ25pemVyIGNvZGUuCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
S2l0L2JsYWNrYmVycnkvQXBpL0R1bXBSZW5kZXJUcmVlQ2xpZW50LmggYi9Tb3VyY2UvV2ViS2l0
L2JsYWNrYmVycnkvQXBpL0R1bXBSZW5kZXJUcmVlQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMDNlYjVi
YmM1OTRmNzYzMmM4MjJlZDUyOWQ2NDJkNTgwMDZiYmQwZgotLS0gL2Rldi9udWxsCisrKyBiL1Nv
dXJjZS9XZWJLaXQvYmxhY2tiZXJyeS9BcGkvRHVtcFJlbmRlclRyZWVDbGllbnQuaApAQCAtMCww
ICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExIFJlc2VhcmNo
IEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq
IG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRp
b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRl
ZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5Z
IFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgor
ICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5v
dCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZy
YW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQor
ICovCisKKyNpZm5kZWYgRHVtcFJlbmRlclRyZWVDbGllbnRfaAorI2RlZmluZSBEdW1wUmVuZGVy
VHJlZUNsaWVudF9oCisKKyNpbmNsdWRlICJCbGFja0JlcnJ5R2xvYmFsLmgiCisKKyNpbmNsdWRl
ICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTT2JqZWN0UmVm
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKK2NsYXNzIEZyYW1lOworY2xhc3MgRE9NV3JhcHBl
cldvcmxkOworY2xhc3MgTmF2aWdhdGlvbkFjdGlvbjsKK2NsYXNzIE5vZGU7CitjbGFzcyBSYW5n
ZTsKK2NsYXNzIFJlc291cmNlUmVxdWVzdDsKK2NsYXNzIFJlc291cmNlUmVzcG9uc2U7CitjbGFz
cyBTZWN1cml0eU9yaWdpbjsKK30KKworbmFtZXNwYWNlIEJsYWNrQmVycnkgeworbmFtZXNwYWNl
IFdlYktpdCB7CitjbGFzcyBXZWJQYWdlOworCitjbGFzcyBCTEFDS0JFUlJZX0VYUE9SVCBEdW1w
UmVuZGVyVHJlZUNsaWVudCB7CitwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIHJ1blRlc3RzKCkg
PSAwOworCisgICAgLy8gRnJhbWVMb2FkZXJDbGllbnQgZGVsZWdhdGVzCisgICAgdmlydHVhbCB2
b2lkIGRpZFN0YXJ0UHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqKSA9IDA7
CisgICAgdmlydHVhbCB2b2lkIGRpZFJlY2VpdmVSZXNwb25zZUZvckZyYW1lKFdlYkNvcmU6OkZy
YW1lKiwgY29uc3QgV2ViQ29yZTo6UmVzb3VyY2VSZXNwb25zZSYpID0gMDsKKyAgICB2aXJ0dWFs
IHZvaWQgZGlkQ29tbWl0TG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKikgPSAwOworICAgIHZp
cnR1YWwgdm9pZCBkaWRGYWlsUHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUq
KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZEZhaWxMb2FkRm9yRnJhbWUoV2ViQ29yZTo6RnJh
bWUqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZEZpbmlzaExvYWRGb3JGcmFtZShXZWJDb3Jl
OjpGcmFtZSopID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkRmluaXNoRG9jdW1lbnRMb2FkRm9y
RnJhbWUoV2ViQ29yZTo6RnJhbWUqKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZENsZWFyV2lu
ZG93T2JqZWN0SW5Xb3JsZChXZWJDb3JlOjpET01XcmFwcGVyV29ybGQqLCBKU0dsb2JhbENvbnRl
eHRSZWYsIEpTT2JqZWN0UmVmIHdpbmRvd09iamVjdCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBk
aWRSZWNlaXZlVGl0bGVGb3JGcmFtZShjb25zdCBXVEY6OlN0cmluZyYgdGl0bGUsIFdlYkNvcmU6
OkZyYW1lKikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaWREZWNpZGVQb2xpY3lGb3JOYXZpZ2F0
aW9uQWN0aW9uKGNvbnN0IFdlYkNvcmU6Ok5hdmlnYXRpb25BY3Rpb24mLCBjb25zdCBXZWJDb3Jl
OjpSZXNvdXJjZVJlcXVlc3QmKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZERpc3BhdGNoV2ls
bFBlcmZvcm1DbGllbnRSZWRpcmVjdCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkSGFuZGxl
T25sb2FkRXZlbnRzRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqKSA9IDA7CisKKyAgICAvLyBDaHJv
bWVDbGllbnQgZGVsZWdhdGVzCisgICAgdmlydHVhbCB2b2lkIGFkZE1lc3NhZ2VUb0NvbnNvbGUo
Y29uc3QgV1RGOjpTdHJpbmcmIG1lc3NhZ2UsIHVuc2lnbmVkIGludCBsaW5lTnVtYmVyLCBjb25z
dCBXVEY6OlN0cmluZyYgc291cmNlSUQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcnVuSmF2YVNj
cmlwdEFsZXJ0KGNvbnN0IFdURjo6U3RyaW5nJiBtZXNzYWdlKSA9IDA7CisgICAgdmlydHVhbCBi
b29sIHJ1bkphdmFTY3JpcHRDb25maXJtKGNvbnN0IFdURjo6U3RyaW5nJiBtZXNzYWdlKSA9IDA7
CisgICAgdmlydHVhbCBXVEY6OlN0cmluZyBydW5KYXZhU2NyaXB0UHJvbXB0KGNvbnN0IFdURjo6
U3RyaW5nJiBtZXNzYWdlLCBjb25zdCBXVEY6OlN0cmluZyYgZGVmYXVsdFZhbHVlKSA9IDA7Cisg
ICAgdmlydHVhbCBib29sIHJ1bkJlZm9yZVVubG9hZENvbmZpcm1QYW5lbChjb25zdCBXVEY6OlN0
cmluZyYgbWVzc2FnZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBzZXRTdGF0dXNUZXh0KGNvbnN0
IFdURjo6U3RyaW5nJikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBleGNlZWRlZERhdGFiYXNlUXVv
dGEoV2ViQ29yZTo6U2VjdXJpdHlPcmlnaW4qLCBjb25zdCBXVEY6OlN0cmluZyYgbmFtZSkgPSAw
OworICAgIHZpcnR1YWwgYm9vbCBhbGxvd3NPcGVuaW5nV2luZG93KCkgPSAwOworICAgIHZpcnR1
YWwgdm9pZCB3aW5kb3dDcmVhdGVkKFdlYlBhZ2UqKSA9IDA7CisKKyAgICAvLyBFZGl0b3JDbGll
bnQgZGVsZWdhdGVzCisgICAgdmlydHVhbCB2b2lkIHNldEFjY2VwdHNFZGl0aW5nKGJvb2wpID0g
MDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlkQmVnaW5FZGl0aW5nKCkgPSAwOworICAgIHZpcnR1YWwg
dm9pZCBkaWRFbmRFZGl0aW5nKCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBkaWRDaGFuZ2UoKSA9
IDA7CisgICAgdmlydHVhbCB2b2lkIGRpZENoYW5nZVNlbGVjdGlvbigpID0gMDsKKyAgICB2aXJ0
dWFsIGJvb2wgc2hvdWxkQmVnaW5FZGl0aW5nSW5ET01SYW5nZShXZWJDb3JlOjpSYW5nZSopID0g
MDsKKyAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkRW5kRWRpdGluZ0luRE9NUmFuZ2UoV2ViQ29yZTo6
UmFuZ2UqKSA9IDA7CisgICAgdmlydHVhbCBib29sIHNob3VsZERlbGV0ZURPTVJhbmdlKFdlYkNv
cmU6OlJhbmdlKikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRDaGFuZ2VTZWxlY3RlZERP
TVJhbmdlVG9ET01SYW5nZUFmZmluaXR5U3RpbGxTZWxlY3RpbmcoV2ViQ29yZTo6UmFuZ2UqIGZy
b21SYW5nZSwgV2ViQ29yZTo6UmFuZ2UqIHRvUmFuZ2UsIGludCBhZmZpbml0eSwgYm9vbCBzdGls
bFNlbGVjdGluZykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzaG91bGRJbnNlcnROb2RlKFdlYkNv
cmU6Ok5vZGUqLCBXZWJDb3JlOjpSYW5nZSosIGludCBpbnNlcnRBY3Rpb24pID0gMDsKKyAgICB2
aXJ0dWFsIGJvb2wgc2hvdWxkSW5zZXJ0VGV4dChjb25zdCBXVEY6OlN0cmluZyYsIFdlYkNvcmU6
OlJhbmdlKiwgaW50IGluc2VydEFjdGlvbikgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc1NlbGVj
dFRyYWlsaW5nV2hpdGVzcGFjZUVuYWJsZWQoKSBjb25zdCA9IDA7CisKK307Cit9Cit9CisKKyNl
bmRpZiAvLyBEdW1wUmVuZGVyVHJlZUNsaWVudF9oCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VM
b2cgYi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggNzA0NjUwNmFmMzBkODQyMTQwMGIwYTczYjYxMDEz
YTgwMTA2MThjYi4uZjAxY2Y3NjVhYzhiMjc2MjY0ZDNjY2MzMjU0MDFmZjllNjRlNjJlYiAxMDA2
NDQKLS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsx
LDE1IEBACisyMDEyLTAyLTA4ICBSb2IgQnVpcyAgPHJidWlzQHJpbS5jb20+CisKKyAgICAgICAg
W0JsYWNrQmVycnldIFVwc3RyZWFtIER1bXBSZW5kZXJUcmVlQmxhY2tCZXJyeQorICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwNDIKKworICAgICAgICBS
ZXZpZXdlZCBieSBBbnRvbmlvIEdvbWVzLgorCisgICAgICAgIEFkZCBpbXBsZW1lbnRhdGlvbiBm
b3Igb3VyIER1bXBSZW5kZXJUcmVlIHNvbHV0aW9uLgorCisgICAgICAgICogRHVtcFJlbmRlclRy
ZWUvYmxhY2tiZXJyeS9EdW1wUmVuZGVyVHJlZS5jcHA6IEFkZGVkLgorICAgICAgICAqIER1bXBS
ZW5kZXJUcmVlL2JsYWNrYmVycnkvRHVtcFJlbmRlclRyZWVCbGFja0JlcnJ5Lmg6IEFkZGVkLgor
CiAyMDEyLTAyLTA4ICBDYXJsb3MgR2FyY2lhIENhbXBvcyAgPGNnYXJjaWFAaWdhbGlhLmNvbT4K
IAogICAgICAgICBbR1RLXSBPcGVuIGxpbmtzIGluIGEgbmV3IHdpbmRvdyB3aGVuIGNsaWNraW5n
IHdpdGggdGhlIG1pZGRsZSBidXR0b24gaW4gTWluaUJyb3dzZXIKZGlmZiAtLWdpdCBhL1Rvb2xz
L0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvRHVtcFJlbmRlclRyZWUuY3BwIGIvVG9vbHMvRHVt
cFJlbmRlclRyZWUvYmxhY2tiZXJyeS9EdW1wUmVuZGVyVHJlZS5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZmI1
MmNmZGU5MzRiYTg1MGQ4NWMyODg5MzBhZDY1ZGYwOGU5NmJiZgotLS0gL2Rldi9udWxsCisrKyBi
L1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvRHVtcFJlbmRlclRyZWUuY3BwCkBAIC0w
LDAgKzEsODIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDExLCAyMDEy
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh
bmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2Vu
ZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQg
eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJ
VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK
KyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4g
IFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIElu
Yy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEz
MDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJEdW1wUmVuZGVy
VHJlZS5oIgorCisjaW5jbHVkZSAiQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXIuaCIKKyNpbmNsdWRl
ICJCYWNrRm9yd2FyZENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJCYWNrRm9yd2FyZExpc3RJbXBs
LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVHJhY2tlci5oIgor
I2luY2x1ZGUgIkRvY3VtZW50TG9hZGVyLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWUvR0ND
b250cm9sbGVyLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWVTdXBwb3J0LmgiCisjaW5jbHVk
ZSAiRWRpdGluZ0JlaGF2aW9yVHlwZXMuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnRCbGFja0Jl
cnJ5LmgiCisjaW5jbHVkZSAiRWRpdG9ySW5zZXJ0QWN0aW9uLmgiCisjaW5jbHVkZSAiRWxlbWVu
dC5oIgorI2luY2x1ZGUgIkV2ZW50U2VuZGVyLmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNs
dWRlICJGcmFtZUxvYWRlclR5cGVzLmgiCisjaW5jbHVkZSAiRnJhbWVUcmVlLmgiCisjaW5jbHVk
ZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiSGlzdG9yeUl0ZW0uaCIKKyNpbmNsdWRlICJJbnRT
aXplLmgiCisjaW5jbHVkZSAiTGF5b3V0VGVzdENvbnRyb2xsZXIuaCIKKyNpbmNsdWRlICJOb3RJ
bXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIk93bkFycmF5UHRyLmgiCisjaW5jbHVkZSAiUGFnZS5o
IgorI2luY2x1ZGUgIlBhZ2VHcm91cC5oIgorI2luY2x1ZGUgIlBpeGVsRHVtcFN1cHBvcnQuaCIK
KyNpbmNsdWRlICJQaXhlbER1bXBTdXBwb3J0QmxhY2tCZXJyeS5oIgorI2luY2x1ZGUgIlJhbmdl
LmgiCisjaW5jbHVkZSAiUmVuZGVyVHJlZUFzVGV4dC5oIgorI2luY2x1ZGUgIlNjcmlwdENvbnRy
b2xsZXIuaCIKKyNpbmNsdWRlICJTZWN1cml0eU9yaWdpbi5oIgorI2luY2x1ZGUgIlNldHRpbmdz
LmgiCisjaW5jbHVkZSAiVGV4dEFmZmluaXR5LmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNs
dWRlICJWZWN0b3IuaCIKKyNpbmNsdWRlICJXZWJDb3JlVGVzdFN1cHBvcnQuaCIKKyNpbmNsdWRl
ICJXZWJQYWdlLmgiCisjaW5jbHVkZSAiV2ViUGFnZUNsaWVudC5oIgorI2luY2x1ZGUgIldvcmtR
dWV1ZS5oIgorI2luY2x1ZGUgIldvcmtRdWV1ZUl0ZW0uaCIKKyNpbmNsdWRlIDxXZWJTZXR0aW5n
cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRl
IDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx3dGYvTm9uQ29weWluZ1NvcnQuaD4KKworI2RlZmluZSBT
RENBUkRfUEFUSCAiL2RldmVsb3BlciIKKwordm9sYXRpbGUgYm9vbCB0ZXN0RG9uZTsKKworUmVm
UHRyPExheW91dFRlc3RDb250cm9sbGVyPiBnTGF5b3V0VGVzdENvbnRyb2xsZXI7CisKK1dlYkNv
cmU6OkZyYW1lKiBtYWluRnJhbWUgPSAwOworV2ViQ29yZTo6RnJhbWUqIHRvcExvYWRpbmdGcmFt
ZSA9IDA7Citib29sIHdhaXRGb3JQb2xpY3kgPSBmYWxzZTsKKworLy8gRklYTUU6IEFzc3VtaW5n
IExheW91dFRlc3RzIGhhcyBiZWVuIGNvcGllZCB0byAvZGV2ZWxvcGVyL0xheW91dFRlc3RzLwor
c3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IGtTRENMYXlvdXRUZXN0c1VSSSA9ICJmaWxlOi8vL2Rl
dmVsb3Blci9MYXlvdXRUZXN0cy8iOworc3RhdGljIGNvbnN0IGNoYXIqIGh0dHBUZXN0U3ludGF4
ID0gImh0dHAvdGVzdHMvIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBodHRwUHJlZml4VVJMID0gImh0
dHA6Ly8xMjcuMC4wLjE6ODAwMC8iOworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitzdGF0aWMg
V1RGOjpTdHJpbmcgZHJ0QWZmaW5pdHlEZXNjcmlwdGlvbihXZWJDb3JlOjpFQWZmaW5pdHkgYWZm
aW5pdHkpCit7CisgICAgaWYgKGFmZmluaXR5ID09IFdlYkNvcmU6OlVQU1RSRUFNKQorICAgICAg
ICByZXR1cm4gV1RGOjpTdHJpbmcoIk5TU2VsZWN0aW9uQWZmaW5pdHlVcHN0cmVhbSIpOworICAg
IGlmIChhZmZpbml0eSA9PSBXZWJDb3JlOjpET1dOU1RSRUFNKQorICAgICAgICByZXR1cm4gV1RG
OjpTdHJpbmcoIk5TU2VsZWN0aW9uQWZmaW5pdHlEb3duc3RyZWFtIik7CisgICAgcmV0dXJuICIi
OworfQorCitzdGF0aWMgV1RGOjpTdHJpbmcgZHJ0RHVtcFBhdGgoV2ViQ29yZTo6Tm9kZSogbm9k
ZSkKK3sKKyAgICBXZWJDb3JlOjpOb2RlKiBwYXJlbnQgPSBub2RlLT5wYXJlbnROb2RlKCk7Cisg
ICAgV1RGOjpTdHJpbmcgc3RyID0gV1RGOjpTdHJpbmc6OmZvcm1hdCgiJXMiLCBub2RlLT5ub2Rl
TmFtZSgpLnV0ZjgoKS5kYXRhKCkpOworICAgIGlmIChwYXJlbnQpIHsKKyAgICAgICAgc3RyLmFw
cGVuZCgiID4gIik7CisgICAgICAgIHN0ci5hcHBlbmQoZHJ0RHVtcFBhdGgocGFyZW50KSk7Cisg
ICAgfQorICAgIHJldHVybiBzdHI7Cit9CisKK3N0YXRpYyBXVEY6OlN0cmluZyBkcnRSYW5nZURl
c2NyaXB0aW9uKFdlYkNvcmU6OlJhbmdlKiByYW5nZSkKK3sKKyAgICBpZiAoIXJhbmdlKQorICAg
ICAgICByZXR1cm4gIihudWxsKSI7CisgICAgcmV0dXJuIFdURjo6U3RyaW5nOjpmb3JtYXQoInJh
bmdlIGZyb20gJWQgb2YgJXMgdG8gJWQgb2YgJXMiLCByYW5nZS0+c3RhcnRPZmZzZXQoKSwgZHJ0
RHVtcFBhdGgocmFuZ2UtPnN0YXJ0Q29udGFpbmVyKCkpLnV0ZjgoKS5kYXRhKCksIHJhbmdlLT5l
bmRPZmZzZXQoKSwgZHJ0RHVtcFBhdGgocmFuZ2UtPmVuZENvbnRhaW5lcigpKS51dGY4KCkuZGF0
YSgpKTsKK30KKworc3RhdGljIFdURjo6U3RyaW5nIGRydEZyYW1lRGVzY3JpcHRpb24oV2ViQ29y
ZTo6RnJhbWUqIGZyYW1lKQoreworICAgIFdURjo6U3RyaW5nIG5hbWUgPSBmcmFtZS0+dHJlZSgp
LT51bmlxdWVOYW1lKCkuc3RyaW5nKCk7CisgICAgaWYgKGZyYW1lID09IG1haW5GcmFtZSkgewor
ICAgICAgICBpZiAoIW5hbWUuaXNOdWxsKCkgJiYgbmFtZS5sZW5ndGgoKSkKKyAgICAgICAgICAg
IHJldHVybiBXVEY6OlN0cmluZzo6Zm9ybWF0KCJtYWluIGZyYW1lIFwiJXNcIiIsIG5hbWUudXRm
OCgpLmRhdGEoKSk7CisgICAgICAgIHJldHVybiAibWFpbiBmcmFtZSI7CisgICAgfQorICAgIGlm
ICghbmFtZS5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIFdURjo6U3RyaW5nOjpmb3JtYXQoImZy
YW1lIFwiJXNcIiIsIG5hbWUudXRmOCgpLmRhdGEoKSk7CisgICAgcmV0dXJuICJmcmFtZSAoYW5v
bnltb3VzKSI7Cit9CisKK3N0YXRpYyBib29sIHNob3VsZExvZ0ZyYW1lTG9hZERlbGVnYXRlcyhj
b25zdCBXVEY6OlN0cmluZyYgdXJsKQoreworICAgIHJldHVybiB1cmwuY29udGFpbnMoImxvYWRp
bmcvIik7Cit9CisKK25hbWVzcGFjZSBCbGFja0JlcnJ5IHsKK25hbWVzcGFjZSBXZWJLaXQgewor
CitEdW1wUmVuZGVyVHJlZSogRHVtcFJlbmRlclRyZWU6OnNfY3VycmVudEluc3RhbmNlID0gMDsK
K2Jvb2wgRHVtcFJlbmRlclRyZWU6OnNfc2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZCA9
IGZhbHNlOworCitzdGF0aWMgdm9pZCBjcmVhdGVGaWxlKGNvbnN0IFdURjo6U3RyaW5nJiBmaWxl
TmFtZSkKK3sKKyAgICBGSUxFKiBmZCA9IGZvcGVuKGZpbGVOYW1lLnV0ZjgoKS5kYXRhKCksICJ3
YiIpOworICAgIGZjbG9zZShmZCk7Cit9CisKK0R1bXBSZW5kZXJUcmVlOjpEdW1wUmVuZGVyVHJl
ZShCbGFja0JlcnJ5OjpXZWJLaXQ6OldlYlBhZ2UqIHBhZ2UpCisgICAgOiBtX2djQ29udHJvbGxl
cigwKQorICAgICwgbV9hY2Nlc3NpYmlsaXR5Q29udHJvbGxlcigwKQorICAgICwgbV9wYWdlKHBh
Z2UpCisgICAgLCBtX2R1bXBQaXhlbHMoZmFsc2UpCisgICAgLCBtX3dhaXRUb0R1bXBXYXRjaGRv
Z1RpbWVyKHRoaXMsICZEdW1wUmVuZGVyVHJlZTo6d2FpdFRvRHVtcFdhdGNoZG9nVGltZXJGaXJl
ZCkKKyAgICAsIG1fd29ya1RpbWVyKHRoaXMsICZEdW1wUmVuZGVyVHJlZTo6cHJvY2Vzc1dvcmsp
CisgICAgLCBtX2FjY2VwdHNFZGl0aW5nKHRydWUpCit7CisgICAgV1RGOjpTdHJpbmcgc2RjYXJk
UGF0aCA9IFNEQ0FSRF9QQVRIOworICAgIG1fcmVzdWx0c0RpciA9IHNkY2FyZFBhdGggKyAiL3Jl
c3VsdHMvIjsKKyAgICBtX2luZGV4RmlsZSA9IHNkY2FyZFBhdGggKyAiL2luZGV4LmRydCI7Cisg
ICAgbV9kb25lRmlsZSA9IHNkY2FyZFBhdGggKyAiL2RvbmUiOworICAgIG1fY3VycmVudFRlc3RG
aWxlID0gc2RjYXJkUGF0aCArICIvY3VycmVudC5kcnQiOworICAgIG1fcGFnZS0+cmVzZXRWaXJ0
dWFsVmlld3BvcnRPbkNvbW1pdHRlZChmYWxzZSk7CisgICAgbV9wYWdlLT5zZXRWaXJ0dWFsVmll
d3BvcnRTaXplKDgwMCwgNjAwKTsKKyAgICBzX2N1cnJlbnRJbnN0YW5jZSA9IHRoaXM7Cit9CisK
K0R1bXBSZW5kZXJUcmVlOjp+RHVtcFJlbmRlclRyZWUoKQoreworICAgIGRlbGV0ZSBtX2djQ29u
dHJvbGxlcjsKKyAgICBkZWxldGUgbV9hY2Nlc3NpYmlsaXR5Q29udHJvbGxlcjsKK30KKwordm9p
ZCBEdW1wUmVuZGVyVHJlZTo6cnVuVGVzdChjb25zdCBXVEY6OlN0cmluZyYgdXJsKQoreworICAg
IGNyZWF0ZUZpbGUobV9yZXN1bHRzRGlyICsgKm1fY3VycmVudFRlc3QgKyAiLmR1bXAuY3Jhc2gi
KTsKKworICAgIG1haW5GcmFtZS0+bG9hZGVyKCktPnN0b3BGb3JVc2VyQ2FuY2VsKCk7CisgICAg
cmVzZXRUb0NvbnNpc3RlbnRTdGF0ZUJlZm9yZVRlc3RpbmcoKTsKKyAgICBpZiAoc2hvdWxkTG9n
RnJhbWVMb2FkRGVsZWdhdGVzKHVybCkpCisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
c2V0RHVtcEZyYW1lTG9hZENhbGxiYWNrcyh0cnVlKTsKKyAgICBXVEY6OlN0cmluZyBzdGRvdXRG
aWxlID0gbV9yZXN1bHRzRGlyICsgKm1fY3VycmVudFRlc3QgKyAiLmR1bXAiOworICAgIFdURjo6
U3RyaW5nIHN0ZGVyckZpbGUgPSBtX3Jlc3VsdHNEaXIgKyAqbV9jdXJyZW50VGVzdCArICIuc3Rk
ZXJyIjsKKworICAgIC8vIEZJWE1FOiB3ZSBzaG91bGQgcHJlc2VydmUgdGhlIG9yaWdpbmFsIHN0
ZG91dCBhbmQgc3RkZXJyIGhlcmUgYnV0IGFyZW4ndCBkb2luZworICAgIC8vIHRoYXQgeWV0IGR1
ZSB0byBpc3N1ZXMgd2l0aCBkdXAsIGV0Yy4KKyAgICBmcmVvcGVuKHN0ZG91dEZpbGUudXRmOCgp
LmRhdGEoKSwgIndiIiwgc3Rkb3V0KTsKKyAgICBmcmVvcGVuKHN0ZGVyckZpbGUudXRmOCgpLmRh
dGEoKSwgIndiIiwgc3RkZXJyKTsKKworICAgIEZJTEUqIGN1cnJlbnQgPSBmb3BlbihtX2N1cnJl
bnRUZXN0RmlsZS51dGY4KCkuZGF0YSgpLCAidyIpOworICAgIGZ3cml0ZShtX2N1cnJlbnRUZXN0
LT51dGY4KCkuZGF0YSgpLCAxLCBtX2N1cnJlbnRUZXN0LT51dGY4KCkubGVuZ3RoKCksIGN1cnJl
bnQpOworICAgIGZjbG9zZShjdXJyZW50KTsKKyAgICBtX3BhZ2UtPmxvYWQodXJsLnV0ZjgoKS5k
YXRhKCksIDAsIGZhbHNlKTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6ZG9uZURydCgpCit7
CisgICAgZmNsb3NlKHN0ZG91dCk7CisgICAgZmNsb3NlKHN0ZGVycik7CisKKyAgICAvLyBOb3Rp
ZnkgdGhlIGV4dGVybmFsIHdvcmxkIHRoYXQgd2UncmUgZG9uZS4KKyAgICBjcmVhdGVGaWxlKG1f
ZG9uZUZpbGUpOworICAgIChtX3BhZ2UtPmNsaWVudCgpKS0+bm90aWZ5UnVuTGF5b3V0VGVzdHNG
aW5pc2hlZCgpOworfQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpydW5SZW1haW5pbmdUZXN0cygp
Cit7CisgICAgLy8gRklYTUU6IGZmbHVzaCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSBidXQgaXMg
dGVtcG9yYXJpbHkgcmVxdWlyZWQgZHVlIHRvIGEgYnVnIGluIHN0ZGlvIG91dHB1dC4KKyAgICBm
Zmx1c2goc3Rkb3V0KTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKworICAgIGlmIChtX2N1cnJlbnRU
ZXN0ID49IG1fdGVzdHMuZW5kKCkgLSAxKSB7CisgICAgICAgIGRvbmVEcnQoKTsKKyAgICAgICAg
cmV0dXJuOworICAgIH0KKworICAgIG1fY3VycmVudFRlc3QrKzsKKyAgICBpZiAoaXNIVFRQVGVz
dChtX2N1cnJlbnRUZXN0LT51dGY4KCkuZGF0YSgpKSkgeworICAgICAgICBtX2N1cnJlbnRIdHRw
VGVzdCA9IG1fY3VycmVudFRlc3QtPnV0ZjgoKS5kYXRhKCk7CisgICAgICAgIG1fY3VycmVudEh0
dHBUZXN0LnJlbW92ZSgwLCBzdHJsZW4oaHR0cFRlc3RTeW50YXgpKTsKKyAgICAgICAgcnVuVGVz
dChodHRwUHJlZml4VVJMICsgbV9jdXJyZW50SHR0cFRlc3QpOworICAgIH0gZWxzZQorICAgICAg
ICBydW5UZXN0KGtTRENMYXlvdXRUZXN0c1VSSSArICptX2N1cnJlbnRUZXN0KTsKK30KKwordm9p
ZCBEdW1wUmVuZGVyVHJlZTo6cmVzZXRUb0NvbnNpc3RlbnRTdGF0ZUJlZm9yZVRlc3RpbmcoKQor
eworICAgIGlmIChpc0hUVFBUZXN0KG1fY3VycmVudFRlc3QtPnV0ZjgoKS5kYXRhKCkpKQorICAg
ICAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXIgPSBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y3JlYXRl
KFN0cmluZyhodHRwUHJlZml4VVJMICsgKm1fY3VycmVudFRlc3QpLnV0ZjgoKS5kYXRhKCksICIi
KTsKKyAgICBlbHNlCisgICAgICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlciA9IExheW91dFRlc3RD
b250cm9sbGVyOjpjcmVhdGUoU3RyaW5nKGtTRENMYXlvdXRUZXN0c1VSSSArICptX2N1cnJlbnRU
ZXN0KS51dGY4KCkuZGF0YSgpLCAiIik7CisKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPnNl
dEljb25EYXRhYmFzZUVuYWJsZWQoZmFsc2UpOworCisgICAgRHVtcFJlbmRlclRyZWVTdXBwb3J0
OjpyZXNldEdlb2xvY2F0aW9uTW9jayhtX3BhZ2UpOworCisgICAgdG9wTG9hZGluZ0ZyYW1lID0g
MDsKKyAgICBtX2xvYWRGaW5pc2hlZCA9IGZhbHNlOworICAgIHNfc2VsZWN0VHJhaWxpbmdXaGl0
ZXNwYWNlRW5hYmxlZCA9IGZhbHNlOworCisgICAgdGVzdERvbmUgPSBmYWxzZTsKKyAgICBXb3Jr
UXVldWU6OnNoYXJlZCgpLT5jbGVhcigpOworICAgIFdvcmtRdWV1ZTo6c2hhcmVkKCktPnNldEZy
b3plbihmYWxzZSk7CisKKyAgICBXZWJTZXR0aW5ncyogc2V0dGluZ3MgPSBtX3BhZ2UtPnNldHRp
bmdzKCk7CisKKyAgICBzZXR0aW5ncy0+c2V0VGV4dFJlZmxvd01vZGUoV2ViU2V0dGluZ3M6OlRl
eHRSZWZsb3dEaXNhYmxlZCk7CisgICAgc2V0dGluZ3MtPnNldEphdmFTY3JpcHRFbmFibGVkKHRy
dWUpOworICAgIHNldHRpbmdzLT5zZXRMb2Fkc0ltYWdlc0F1dG9tYXRpY2FsbHkodHJ1ZSk7Cisg
ICAgc2V0dGluZ3MtPnNldEphdmFTY3JpcHRPcGVuV2luZG93c0F1dG9tYXRpY2FsbHkodHJ1ZSk7
CisgICAgc2V0dGluZ3MtPnNldFpvb21Ub0ZpdE9uTG9hZChmYWxzZSk7CisgICAgc2V0dGluZ3Mt
PnNldERlZmF1bHRGb250U2l6ZSgxNik7CisgICAgc2V0dGluZ3MtPnNldERlZmF1bHRGaXhlZEZv
bnRTaXplKDEzKTsKKyAgICBzZXR0aW5ncy0+c2V0TWluaW11bUZvbnRTaXplKDEpOworICAgIHNl
dHRpbmdzLT5zZXRTZXJpZkZvbnRGYW1pbHkoIlRpbWVzIik7CisgICAgc2V0dGluZ3MtPnNldEZp
eGVkRm9udEZhbWlseSgiQ291cmllciBOZXciKTsKKyAgICBzZXR0aW5ncy0+c2V0U2Fuc1Nlcmlm
Rm9udEZhbWlseSgiQXJpYWwiKTsKKyAgICBzZXR0aW5ncy0+c2V0U3RhbmRhcmRGb250RmFtaWx5
KCJUaW1lcyIpOworICAgIHNldHRpbmdzLT5zZXRYU1NBdWRpdG9yRW5hYmxlZChmYWxzZSk7Cisg
ICAgc2V0dGluZ3MtPnNldEZyYW1lRmxhdHRlbmluZ0VuYWJsZWQoZmFsc2UpOworICAgIHNldHRp
bmdzLT5zZXRNYXhpbXVtUGFnZXNJbkNhY2hlKDApOworICAgIHNldHRpbmdzLT5zZXRQbHVnaW5z
RW5hYmxlZCh0cnVlKTsKKyAgICBzZXR0aW5ncy0+c2V0VXNlclNjYWxhYmxlKHRydWUpOworICAg
IC8vIEFwcGx5IG5ldyBzZXR0aW5ncyB0byBjdXJyZW50IHBhZ2UsIHNlZSBtb3JlIGluIHRoZSBk
ZXN0cnVjdG9yIG9mIFdlYlNldHRpbmdzVHJhbnNhY3Rpb24uCisgICAgV2ViU2V0dGluZ3NUcmFu
c2FjdGlvbiB3ZWJTZXR0aW5nVHJhbnNhY3Rpb24oc2V0dGluZ3MpOworCisgICAgQmxhY2tCZXJy
eTo6V2ViS2l0OjpEdW1wUmVuZGVyVHJlZTo6Y3VycmVudEluc3RhbmNlKCktPnBhZ2UoKS0+Y2xl
YXJCYWNrRm9yd2FyZExpc3QoZmFsc2UpOworCisgICAgc2V0QWNjZXB0c0VkaXRpbmcodHJ1ZSk7
CisgICAgRHVtcFJlbmRlclRyZWVTdXBwb3J0OjpzZXRMaW5rc0luY2x1ZGVkSW5Gb2N1c0NoYWlu
KHRydWUpOworCisgICAgbV9wYWdlLT5zZXRWaXJ0dWFsVmlld3BvcnRTaXplKDgwMCwgNjAwKTsK
KyAgICBtX3BhZ2UtPnJlc2V0VmlydHVhbFZpZXdwb3J0T25Db21taXR0ZWQoZmFsc2UpOworICAg
IG1fcGFnZS0+c2V0SmF2YVNjcmlwdENhbkFjY2Vzc0NsaXBib2FyZCh0cnVlKTsKKworICAgIG1h
aW5GcmFtZSA9IG1fcGFnZS0+bWFpbkZyYW1lKCk7CisgICAgaWYgKG1haW5GcmFtZSkgeworICAg
ICAgICBtYWluRnJhbWUtPnBhZ2UoKS0+c2V0VGFiS2V5Q3ljbGVzVGhyb3VnaEVsZW1lbnRzKHRy
dWUpOworICAgICAgICBtYWluRnJhbWUtPnBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0RWRpdGluZ0Jl
aGF2aW9yVHlwZShXZWJDb3JlOjpFZGl0aW5nVW5peEJlaGF2aW9yKTsKKyAgICAgICAgbWFpbkZy
YW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldERPTVBhc3RlQWxsb3dlZCh0cnVlKTsKKyAgICAg
ICAgbWFpbkZyYW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldFZhbGlkYXRpb25NZXNzYWdlVGlt
ZXJNYWduaWZpY2F0aW9uKC0xKTsKKyAgICAgICAgbWFpbkZyYW1lLT5wYWdlKCktPnNldHRpbmdz
KCktPnNldEludGVyYWN0aXZlRm9ybVZhbGlkYXRpb25FbmFibGVkKHRydWUpOworICAgICAgICBt
YWluRnJhbWUtPnBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0QWxsb3dGaWxlQWNjZXNzRnJvbUZpbGVV
UkxzKHRydWUpOworICAgICAgICBtYWluRnJhbWUtPnBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0QWxs
b3dVbml2ZXJzYWxBY2Nlc3NGcm9tRmlsZVVSTHModHJ1ZSk7CisgICAgICAgIG1haW5GcmFtZS0+
cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRBdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxlZCh0cnVlKTsK
KyAgICAgICAgbWFpbkZyYW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldFVzZVByZUhUTUw1UGFy
c2VyUXVpcmtzKGZhbHNlKTsKKyAgICAgICAgbWFpbkZyYW1lLT50cmVlKCktPmNsZWFyTmFtZSgp
OworICAgICAgICBtYWluRnJhbWUtPmxvYWRlcigpLT5zZXRPcGVuZXIoMCk7CisgICAgICAgIC8v
IEZJWE1FOiBPdGhlciBwb3J0cyBhbHNvIGNsZWFyIGhpc3RvcnkvYmFja0ZvcndhcmRMaXN0IGFs
bG9uZyB3aXRoIHZpc2l0ZWQgbGlua3MuCisgICAgICAgIG1haW5GcmFtZS0+cGFnZSgpLT5ncm91
cCgpLnJlbW92ZVZpc2l0ZWRMaW5rcygpOworICAgIH0KKworICAgIC8vIEZvciBub3cgd2UgbWFu
dWFsbHkgZ2FyYmFnZSBjb2xsZWN0IGJldHdlZW4gZWFjaCB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGUg
ZGV2aWNlIHdvbid0IHJ1biBvdXQgb2YgbWVtb3J5IGR1ZSB0byBsYXp5IGNvbGxlY3Rpb24uCisg
ICAgRHVtcFJlbmRlclRyZWVTdXBwb3J0OjpnYXJiYWdlQ29sbGVjdG9yQ29sbGVjdCgpOworfQor
Cit2b2lkIER1bXBSZW5kZXJUcmVlOjpydW5UZXN0cygpCit7CisgICAgbV9nY0NvbnRyb2xsZXIg
PSBuZXcgR0NDb250cm9sbGVyKCk7CisgICAgbV9hY2Nlc3NpYmlsaXR5Q29udHJvbGxlciA9IG5l
dyBBY2Nlc3NpYmlsaXR5Q29udHJvbGxlcigpOworICAgIGdldFRlc3RzVG9SdW4oKTsKKworICAg
IG1haW5GcmFtZSA9IG1fcGFnZS0+bWFpbkZyYW1lKCk7CisKKyAgICBtX2N1cnJlbnRUZXN0ID0g
bV90ZXN0cy5iZWdpbigpOworCisgICAgaWYgKG1fY3VycmVudFRlc3QgPT0gbV90ZXN0cy5lbmQo
KSkgeworICAgICAgICBkb25lRHJ0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBp
ZiAoaXNIVFRQVGVzdChtX2N1cnJlbnRUZXN0LT51dGY4KCkuZGF0YSgpKSkgeworICAgICAgICBt
X2N1cnJlbnRIdHRwVGVzdCA9IG1fY3VycmVudFRlc3QtPnV0ZjgoKS5kYXRhKCk7CisgICAgICAg
IG1fY3VycmVudEh0dHBUZXN0LnJlbW92ZSgwLCBzdHJsZW4oaHR0cFRlc3RTeW50YXgpKTsKKyAg
ICAgICAgcnVuVGVzdChodHRwUHJlZml4VVJMICsgbV9jdXJyZW50SHR0cFRlc3QpOworICAgIH0g
ZWxzZQorICAgICAgICBydW5UZXN0KGtTRENMYXlvdXRUZXN0c1VSSSArICptX2N1cnJlbnRUZXN0
KTsKK30KKworCitXVEY6OlN0cmluZyBEdW1wUmVuZGVyVHJlZTo6ZHVtcEZyYW1lc0FzVGV4dChX
ZWJDb3JlOjpGcmFtZSogZnJhbWUpCit7CisgICAgV1RGOjpTdHJpbmcgczsKKyAgICBXZWJDb3Jl
OjpFbGVtZW50KiBkb2N1bWVudEVsZW1lbnQgPSBmcmFtZS0+ZG9jdW1lbnQoKS0+ZG9jdW1lbnRF
bGVtZW50KCk7CisgICAgaWYgKCFkb2N1bWVudEVsZW1lbnQpCisgICAgICAgIHJldHVybiBzLnV0
ZjgoKS5kYXRhKCk7CisKKyAgICBpZiAoZnJhbWUtPnRyZWUoKS0+cGFyZW50KCkpCisgICAgICAg
IHMgPSBXVEY6OlN0cmluZzo6Zm9ybWF0KCJcbi0tLS0tLS0tXG5GcmFtZTogJyVzJ1xuLS0tLS0t
LS1cbiIsIGZyYW1lLT50cmVlKCktPnVuaXF1ZU5hbWUoKS5zdHJpbmcoKS51dGY4KCkuZGF0YSgp
KTsKKworICAgIHMgKz0gZG9jdW1lbnRFbGVtZW50LT5pbm5lclRleHQoKSArICJcbiI7CisKKyAg
ICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wQ2hpbGRGcmFtZXNBc1RleHQoKSkgewor
ICAgICAgICBXZWJDb3JlOjpGcmFtZVRyZWUqIHRyZWUgPSBmcmFtZS0+dHJlZSgpOworICAgICAg
ICBmb3IgKFdlYkNvcmU6OkZyYW1lKiBjaGlsZCA9IHRyZWUtPmZpcnN0Q2hpbGQoKTsgY2hpbGQ7
IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxpbmcoKSkKKyAgICAgICAgICAgIHMgKz0g
ZHVtcEZyYW1lc0FzVGV4dChjaGlsZCk7CisgICAgfQorICAgIHJldHVybiBzOworfQorCitzdGF0
aWMgdm9pZCBkdW1wVG9GaWxlKGNvbnN0IFdURjo6U3RyaW5nJiBkYXRhKQoreworICAgIGZ3cml0
ZShkYXRhLnV0ZjgoKS5kYXRhKCksIDEsIGRhdGEudXRmOCgpLmxlbmd0aCgpLCBzdGRvdXQpOwor
fQorCitib29sIER1bXBSZW5kZXJUcmVlOjppc0hUVFBUZXN0KGNvbnN0IFdURjo6U3RyaW5nJiB0
ZXN0KQoreworICAgIGlmICh0ZXN0Lmxlbmd0aCgpIDwgc3RybGVuKGh0dHBUZXN0U3ludGF4KSkK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0ZXN0Lmxvd2VyKCkuc3Vic3RyaW5n
KDAsIHN0cmxlbihodHRwVGVzdFN5bnRheCkpID09IGh0dHBUZXN0U3ludGF4OworfQorCit2b2lk
IER1bXBSZW5kZXJUcmVlOjpnZXRUZXN0c1RvUnVuKCkKK3sKKyAgICBWZWN0b3I8V1RGOjpTdHJp
bmc+IGZpbGVzOworCisgICAgRklMRSogZmQgPSBmb3BlbihtX2luZGV4RmlsZS51dGY4KCkuZGF0
YSgpLCAiciIpOworICAgIGZzZWVrKGZkLCAwLCBTRUVLX0VORCk7CisgICAgaW50IHNpemUgPSBm
dGVsbChmZCk7CisgICAgZnNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKyAgICBPd25BcnJheVB0cjxj
aGFyPiBidWYgPSBhZG9wdEFycmF5UHRyKG5ldyBjaGFyW3NpemVdKTsKKyAgICBmcmVhZChidWYu
Z2V0KCksIDEsIHNpemUsIGZkKTsKKyAgICBmY2xvc2UoZmQpOworICAgIFdURjo6U3RyaW5nIHMo
YnVmLmdldCgpLCBzaXplKTsKKyAgICBzLnNwbGl0KCJcbiIsIGZpbGVzKTsKKworICAgIG1fdGVz
dHMgPSBmaWxlczsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6aW52YWxpZGF0ZUFueVByZXZp
b3VzV2FpdFRvRHVtcFdhdGNoZG9nKCkKK3sKKyAgICBtX3dhaXRUb0R1bXBXYXRjaGRvZ1RpbWVy
LnN0b3AoKTsKKyAgICB3YWl0Rm9yUG9saWN5ID0gZmFsc2U7Cit9CisKK1dURjo6U3RyaW5nIER1
bXBSZW5kZXJUcmVlOjpyZW5kZXJUcmVlRHVtcCgpIGNvbnN0Cit7CisgICAgaWYgKG1haW5GcmFt
ZSkgeworICAgICAgICBpZiAobWFpbkZyYW1lLT52aWV3KCkgJiYgbWFpbkZyYW1lLT52aWV3KCkt
PmxheW91dFBlbmRpbmcoKSkKKyAgICAgICAgICAgIG1haW5GcmFtZS0+dmlldygpLT5sYXlvdXQo
KTsKKworICAgICAgICByZXR1cm4gZXh0ZXJuYWxSZXByZXNlbnRhdGlvbihtYWluRnJhbWUpOwor
ICAgIH0KKyAgICByZXR1cm4gIiI7Cit9CisKK3N0YXRpYyBib29sIGhpc3RvcnlJdGVtQ29tcGFy
ZShjb25zdCBSZWZQdHI8V2ViQ29yZTo6SGlzdG9yeUl0ZW0+JiBhLCBjb25zdCBSZWZQdHI8V2Vi
Q29yZTo6SGlzdG9yeUl0ZW0+JiBiKQoreworICAgIHJldHVybiBjb2RlUG9pbnRDb21wYXJlKGEt
PnVybFN0cmluZygpLCBiLT51cmxTdHJpbmcoKSkgPCAwOworfQorCitzdGF0aWMgV1RGOjpTdHJp
bmcgZHVtcEhpc3RvcnlJdGVtKFBhc3NSZWZQdHI8V2ViQ29yZTo6SGlzdG9yeUl0ZW0+IGl0ZW0s
IGludCBpbmRlbnQsIGJvb2wgY3VycmVudCkKK3sKKyAgICBXVEY6OlN0cmluZyByZXN1bHQ7CisK
KyAgICBpbnQgc3RhcnQgPSAwOworICAgIGlmIChjdXJyZW50KSB7CisgICAgICAgIHJlc3VsdCAr
PSAiY3Vyci0+IjsKKyAgICAgICAgc3RhcnQgPSA2OworICAgIH0KKyAgICBmb3IgKGludCBpID0g
c3RhcnQ7IGkgPCBpbmRlbnQ7IGkrKykKKyAgICAgICAgcmVzdWx0ICs9ICIgIjsKKworICAgIFdU
Rjo6U3RyaW5nIHVybCA9IGl0ZW0tPnVybFN0cmluZygpOworICAgIGlmICh1cmwuY29udGFpbnMo
ImZpbGU6Ly8iKSkgeworICAgICAgICBzdGF0aWMgV1RGOjpTdHJpbmcgbGF5b3V0VGVzdHNTdHJp
bmcoIi9MYXlvdXRUZXN0cy8iKTsKKyAgICAgICAgc3RhdGljIFdURjo6U3RyaW5nIGZpbGVUZXN0
U3RyaW5nKCIoZmlsZSB0ZXN0KToiKTsKKworICAgICAgICBXVEY6OlN0cmluZyByZXMgPSB1cmwu
c3Vic3RyaW5nKHVybC5maW5kKGxheW91dFRlc3RzU3RyaW5nKSArIGxheW91dFRlc3RzU3RyaW5n
Lmxlbmd0aCgpKTsKKyAgICAgICAgaWYgKHJlcy5pc0VtcHR5KCkpCisgICAgICAgICAgICByZXR1
cm4gcmVzdWx0OworCisgICAgICAgIHJlc3VsdCArPSBmaWxlVGVzdFN0cmluZzsKKyAgICAgICAg
cmVzdWx0ICs9IHJlczsKKyAgICB9IGVsc2UKKyAgICAgICAgcmVzdWx0ICs9IHVybDsKKworICAg
IFdURjo6U3RyaW5nIHRhcmdldCA9IGl0ZW0tPnRhcmdldCgpOworICAgIGlmICghdGFyZ2V0Lmlz
RW1wdHkoKSkKKyAgICAgICAgcmVzdWx0ICs9ICIgKGluIGZyYW1lIFwiIiArIHRhcmdldCArICJc
IikiOworCisgICAgaWYgKGl0ZW0tPmlzVGFyZ2V0SXRlbSgpKQorICAgICAgICByZXN1bHQgKz0g
IiAgKipuYXYgdGFyZ2V0KioiOworICAgIHJlc3VsdCArPSAiXG4iOworCisgICAgV2ViQ29yZTo6
SGlzdG9yeUl0ZW1WZWN0b3IgY2hpbGRyZW4gPSBpdGVtLT5jaGlsZHJlbigpOworICAgIC8vIE11
c3Qgc29ydCB0byBlbGltaW5hdGUgYXJiaXRyYXJ5IHJlc3VsdCBvcmRlcmluZyB3aGljaCBkZWZl
YXRzIHJlcHJvZHVjaWJsZSB0ZXN0aW5nLgorICAgIG5vbkNvcHlpbmdTb3J0KGNoaWxkcmVuLmJl
Z2luKCksIGNoaWxkcmVuLmVuZCgpLCBoaXN0b3J5SXRlbUNvbXBhcmUpOworICAgIHVuc2lnbmVk
IHJlc3VsdFNpemUgPSBjaGlsZHJlbi5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsg
aSA8IHJlc3VsdFNpemU7ICsraSkKKyAgICAgICAgcmVzdWx0ICs9IGR1bXBIaXN0b3J5SXRlbShj
aGlsZHJlbltpXSwgaW5kZW50ICsgNCwgZmFsc2UpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30K
Kworc3RhdGljIFdURjo6U3RyaW5nIGR1bXBCYWNrRm9yd2FyZExpc3RGb3JXZWJWaWV3KCkKK3sK
KyAgICBXVEY6OlN0cmluZyByZXN1bHQgPSAiXG49PT09PT09PT09PT09PSBCYWNrIEZvcndhcmQg
TGlzdCA9PT09PT09PT09PT09PVxuIjsKKyAgICAvLyBGT1JNQVQ6CisgICAgLy8gIiAgICAgICAg
KGZpbGUgdGVzdCk6ZmFzdC9sb2FkZXIvcmVzb3VyY2VzL2NsaWNrLWZyYWdtZW50LWxpbmsuaHRt
bCAgKipuYXYgdGFyZ2V0KioiCisgICAgLy8gImN1cnItPiAgKGZpbGUgdGVzdCk6ZmFzdC9sb2Fk
ZXIvcmVzb3VyY2VzL2NsaWNrLWZyYWdtZW50LWxpbmsuaHRtbCN0ZXN0ZnJhZ21lbnQgICoqbmF2
IHRhcmdldCoqIgorICAgIFdlYkNvcmU6OkJhY2tGb3J3YXJkTGlzdEltcGwqIGJmTGlzdCA9IHN0
YXRpY19jYXN0PFdlYkNvcmU6OkJhY2tGb3J3YXJkTGlzdEltcGwqPihtYWluRnJhbWUtPnBhZ2Uo
KS0+YmFja0ZvcndhcmQoKS0+Y2xpZW50KCkpOworICAgIGludCBtYXhJdGVtcyA9IGJmTGlzdC0+
Y2FwYWNpdHkoKTsKKyAgICBXZWJDb3JlOjpIaXN0b3J5SXRlbVZlY3RvciBlbnRyaWVzOworICAg
IGJmTGlzdC0+YmFja0xpc3RXaXRoTGltaXQobWF4SXRlbXMsIGVudHJpZXMpOworICAgIHVuc2ln
bmVkIHJlc3VsdFNpemUgPSBlbnRyaWVzLnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAw
OyBpIDwgcmVzdWx0U2l6ZTsgKytpKQorICAgICAgICByZXN1bHQgKz0gZHVtcEhpc3RvcnlJdGVt
KGVudHJpZXNbaV0sIDgsIGZhbHNlKTsKKworICAgIHJlc3VsdCArPSBkdW1wSGlzdG9yeUl0ZW0o
YmZMaXN0LT5jdXJyZW50SXRlbSgpLCA4LCB0cnVlKTsKKworICAgIGJmTGlzdC0+Zm9yd2FyZExp
c3RXaXRoTGltaXQobWF4SXRlbXMsIGVudHJpZXMpOworICAgIHJlc3VsdFNpemUgPSBlbnRyaWVz
LnNpemUoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgcmVzdWx0U2l6ZTsgKytpKQor
ICAgICAgICByZXN1bHQgKz0gZHVtcEhpc3RvcnlJdGVtKGVudHJpZXNbaV0sIDgsIGZhbHNlKTsK
KworICAgIHJlc3VsdCArPSAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT1cbiI7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkIER1bXBSZW5kZXJU
cmVlOjpkdW1wKCkKK3sKKyAgICBpbnZhbGlkYXRlQW55UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hk
b2coKTsKKworICAgIFdURjo6U3RyaW5nIGR1bXBGaWxlID0gbV9yZXN1bHRzRGlyICsgKm1fY3Vy
cmVudFRlc3QgKyAiLmR1bXAiOworCisgICAgV1RGOjpTdHJpbmcgcmVzdWx0TWltZVR5cGUgPSAi
dGV4dC9wbGFpbiI7CisgICAgV1RGOjpTdHJpbmcgcmVzcG9uc2VNaW1lVHlwZSA9IG1haW5GcmFt
ZS0+bG9hZGVyKCktPmRvY3VtZW50TG9hZGVyKCktPnJlc3BvbnNlTUlNRVR5cGUoKTsKKworICAg
IGJvb2wgZHVtcEFzVGV4dCA9IGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEFzVGV4dCgpIHx8
IHJlc3BvbnNlTWltZVR5cGUgPT0gInRleHQvcGxhaW4iOworICAgIFdURjo6U3RyaW5nIGRhdGEg
PSBkdW1wQXNUZXh0ID8gZHVtcEZyYW1lc0FzVGV4dChtYWluRnJhbWUpIDogcmVuZGVyVHJlZUR1
bXAoKTsKKworICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBCYWNrRm9yd2FyZExp
c3QoKSkKKyAgICAgICAgZGF0YSArPSBkdW1wQmFja0ZvcndhcmRMaXN0Rm9yV2ViVmlldygpOwor
CisgICAgV1RGOjpTdHJpbmcgcmVzdWx0ID0gIkNvbnRlbnQtVHlwZTogIiArIHJlc3VsdE1pbWVU
eXBlICsgIlxuIiArIGRhdGE7CisKKyAgICBkdW1wVG9GaWxlKHJlc3VsdCk7CisgICAgaWYgKG1f
ZHVtcFBpeGVscyAmJiAhZHVtcEFzVGV4dCAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmdlbmVy
YXRlUGl4ZWxSZXN1bHRzKCkpCisgICAgICAgIGR1bXBXZWJWaWV3QXNQaXhlbHNBbmRDb21wYXJl
V2l0aEV4cGVjdGVkKGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZXhwZWN0ZWRQaXhlbEhhc2goKSk7
CisKKyAgICBXVEY6OlN0cmluZyBjcmFzaEZpbGUgPSBkdW1wRmlsZSArICIuY3Jhc2giOworICAg
IHVubGluayhjcmFzaEZpbGUudXRmOCgpLmRhdGEoKSk7CisKKyAgICB0ZXN0RG9uZSA9IHRydWU7
CisgICAgcnVuUmVtYWluaW5nVGVzdHMoKTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6c2V0
V2FpdFRvRHVtcFdhdGNoZG9nKGRvdWJsZSBpbnRlcnZhbCkKK3sKKyAgICBpbnZhbGlkYXRlQW55
UHJldmlvdXNXYWl0VG9EdW1wV2F0Y2hkb2coKTsKKyAgICBtX3dhaXRUb0R1bXBXYXRjaGRvZ1Rp
bWVyLnN0YXJ0T25lU2hvdChpbnRlcnZhbCk7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6Ondh
aXRUb0R1bXBXYXRjaGRvZ1RpbWVyRmlyZWQoV2ViQ29yZTo6VGltZXI8RHVtcFJlbmRlclRyZWU+
KikKK3sKKyAgICBnTGF5b3V0VGVzdENvbnRyb2xsZXItPndhaXRUb0R1bXBXYXRjaGRvZ1RpbWVy
RmlyZWQoKTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6cHJvY2Vzc1dvcmsoV2ViQ29yZTo6
VGltZXI8RHVtcFJlbmRlclRyZWU+KikKK3sKKyAgICBpZiAodG9wTG9hZGluZ0ZyYW1lKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAoV29ya1F1ZXVlOjpzaGFyZWQoKS0+cHJvY2Vzc1dvcmso
KSAmJiAhZ0xheW91dFRlc3RDb250cm9sbGVyLT53YWl0VG9EdW1wKCkpCisgICAgICAgIGR1bXAo
KTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6bG9jYXRpb25DaGFuZ2VGb3JGcmFtZShXZWJD
b3JlOjpGcmFtZSogZnJhbWUpCit7CisgICAgaWYgKGZyYW1lICE9IHRvcExvYWRpbmdGcmFtZSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgdG9wTG9hZGluZ0ZyYW1lID0gMDsKKyAgICBXb3JrUXVl
dWU6OnNoYXJlZCgpLT5zZXRGcm96ZW4odHJ1ZSk7IC8vIGZpcnN0IGNvbXBsZXRlIGxvYWQgZnJl
ZXplcyB0aGUgcXVldWUKKyAgICBpZiAoZ0xheW91dFRlc3RDb250cm9sbGVyLT53YWl0VG9EdW1w
KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChXb3JrUXVldWU6OnNoYXJlZCgpLT5jb3Vu
dCgpKQorICAgICAgICBtX3dvcmtUaW1lci5zdGFydE9uZVNob3QoMCk7CisgICAgZWxzZQorICAg
ICAgICBkdW1wKCk7Cit9CisKKy8vIEZyYW1lTG9hZENsaWVudCBkZWxlZ2F0ZXMuCit2b2lkIER1
bXBSZW5kZXJUcmVlOjpkaWRTdGFydFByb3Zpc2lvbmFsTG9hZEZvckZyYW1lKFdlYkNvcmU6OkZy
YW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoIXRlc3REb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxl
ci0+ZHVtcEZyYW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkU3Rh
cnRQcm92aXNpb25hbExvYWRGb3JGcmFtZVxuIiwgZHJ0RnJhbWVEZXNjcmlwdGlvbihmcmFtZSku
dXRmOCgpLmRhdGEoKSk7CisKKyAgICBpZiAoIXRlc3REb25lICYmIGdMYXlvdXRUZXN0Q29udHJv
bGxlci0+ZHVtcFVzZXJHZXN0dXJlSW5GcmFtZUxvYWRDYWxsYmFja3MoKSkKKyAgICAgICAgcHJp
bnRmKCJGcmFtZSB3aXRoIHVzZXIgZ2VzdHVyZSBcIiVzXCIgLSBpbiBkaWRTdGFydFByb3Zpc2lv
bmFsTG9hZEZvckZyYW1lXG4iLCBXZWJDb3JlOjpTY3JpcHRDb250cm9sbGVyOjpwcm9jZXNzaW5n
VXNlckdlc3R1cmUoKSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworCisgICAgaWYgKCF0b3BMb2FkaW5n
RnJhbWUgJiYgIXRlc3REb25lKQorICAgICAgICB0b3BMb2FkaW5nRnJhbWUgPSBmcmFtZTsKKwor
ICAgIGlmICghdGVzdERvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5zdG9wUHJvdmlzaW9u
YWxGcmFtZUxvYWRzKCkpIHsKKyAgICAgICAgcHJpbnRmKCIlcyAtIHN0b3BwaW5nIGxvYWQgaW4g
ZGlkU3RhcnRQcm92aXNpb25hbExvYWRGb3JGcmFtZSBjYWxsYmFja1xuIiwgZHJ0RnJhbWVEZXNj
cmlwdGlvbihmcmFtZSkudXRmOCgpLmRhdGEoKSk7CisgICAgICAgIGZyYW1lLT5sb2FkZXIoKS0+
c3RvcEZvclVzZXJDYW5jZWwoKTsKKyAgICB9Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmRp
ZENvbW1pdExvYWRGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSogZnJhbWUpCit7CisgICAgaWYgKCF0
ZXN0RG9uZSAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBGcmFtZUxvYWRDYWxsYmFja3Mo
KSkKKyAgICAgICAgcHJpbnRmKCIlcyAtIGRpZENvbW1pdExvYWRGb3JGcmFtZVxuIiwgZHJ0RnJh
bWVEZXNjcmlwdGlvbihmcmFtZSkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBnTGF5b3V0VGVzdENv
bnRyb2xsZXItPnNldFdpbmRvd0lzS2V5KHRydWUpOworfQorCit2b2lkIER1bXBSZW5kZXJUcmVl
OjpkaWRGYWlsUHJvdmlzaW9uYWxMb2FkRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqIGZyYW1lKQor
eworICAgIGlmICghdGVzdERvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRnJhbWVM
b2FkQ2FsbGJhY2tzKCkpCisgICAgICAgIHByaW50ZigiJXMgLSBkaWRGYWlsUHJvdmlzaW9uYWxM
b2FkV2l0aEVycm9yXG4iLCBkcnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKS51dGY4KCkuZGF0YSgp
KTsKKworICAgIGxvY2F0aW9uQ2hhbmdlRm9yRnJhbWUoZnJhbWUpOworfQorCit2b2lkIER1bXBS
ZW5kZXJUcmVlOjpkaWRGYWlsTG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSkKK3sK
KyAgICBpZiAoIXRlc3REb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEZyYW1lTG9h
ZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkRmFpbExvYWRXaXRoRXJyb3Jc
biIsIGRydEZyYW1lRGVzY3JpcHRpb24oZnJhbWUpLnV0ZjgoKS5kYXRhKCkpOworCisgICAgbG9j
YXRpb25DaGFuZ2VGb3JGcmFtZShmcmFtZSk7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmRp
ZEZpbmlzaExvYWRGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSogZnJhbWUpCit7CisgICAgaWYgKCF0
ZXN0RG9uZSAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBGcmFtZUxvYWRDYWxsYmFja3Mo
KSkKKyAgICAgICAgcHJpbnRmKCIlcyAtIGRpZEZpbmlzaExvYWRGb3JGcmFtZVxuIiwgZHJ0RnJh
bWVEZXNjcmlwdGlvbihmcmFtZSkudXRmOCgpLmRhdGEoKSk7CisKKyAgICBpZiAoZnJhbWUgPT0g
dG9wTG9hZGluZ0ZyYW1lKQorICAgICAgICBtX2xvYWRGaW5pc2hlZCA9IHRydWU7CisgICAgbG9j
YXRpb25DaGFuZ2VGb3JGcmFtZShmcmFtZSk7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmRp
ZEZpbmlzaERvY3VtZW50TG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiBmcmFtZSkKK3sKKyAg
ICBpZiAoIXRlc3REb25lKSB7CisgICAgICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1
bXBGcmFtZUxvYWRDYWxsYmFja3MoKSkKKyAgICAgICAgICAgIHByaW50ZigiJXMgLSBkaWRGaW5p
c2hEb2N1bWVudExvYWRGb3JGcmFtZVxuIiwgZHJ0RnJhbWVEZXNjcmlwdGlvbihmcmFtZSkudXRm
OCgpLmRhdGEoKSk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgcGVuZGlu
Z0ZyYW1lVW5sb2FkRXZlbnRzID0gZnJhbWUtPmRvbVdpbmRvdygpLT5wZW5kaW5nVW5sb2FkRXZl
bnRMaXN0ZW5lcnMoKTsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nRnJhbWVVbmxvYWRFdmVudHMp
CisgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyAtIGhhcyAldSBvbnVubG9hZCBoYW5kbGVyKHMp
XG4iLCBkcnRGcmFtZURlc2NyaXB0aW9uKGZyYW1lKS51dGY4KCkuZGF0YSgpLCBwZW5kaW5nRnJh
bWVVbmxvYWRFdmVudHMpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIER1bXBSZW5kZXJU
cmVlOjpkaWRDbGVhcldpbmRvd09iamVjdEluV29ybGQoV2ViQ29yZTo6RE9NV3JhcHBlcldvcmxk
KiwgSlNHbG9iYWxDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIHdpbmRvd09iamVjdCkK
K3sKKyAgICBKU1ZhbHVlUmVmIGV4Y2VwdGlvbiA9IDA7CisKKyAgICBnTGF5b3V0VGVzdENvbnRy
b2xsZXItPm1ha2VXaW5kb3dPYmplY3QoY29udGV4dCwgd2luZG93T2JqZWN0LCAmZXhjZXB0aW9u
KTsKKyAgICBBU1NFUlQoIWV4Y2VwdGlvbik7CisKKyAgICBtX2djQ29udHJvbGxlci0+bWFrZVdp
bmRvd09iamVjdChjb250ZXh0LCB3aW5kb3dPYmplY3QsICZleGNlcHRpb24pOworICAgIEFTU0VS
VCghZXhjZXB0aW9uKTsKKworICAgIG1fYWNjZXNzaWJpbGl0eUNvbnRyb2xsZXItPm1ha2VXaW5k
b3dPYmplY3QoY29udGV4dCwgd2luZG93T2JqZWN0LCAmZXhjZXB0aW9uKTsKKyAgICBBU1NFUlQo
IWV4Y2VwdGlvbik7CisKKyAgICBKU1N0cmluZ1JlZiBldmVudFNlbmRlclN0ciA9IEpTU3RyaW5n
Q3JlYXRlV2l0aFVURjhDU3RyaW5nKCJldmVudFNlbmRlciIpOworICAgIEpTVmFsdWVSZWYgZXZl
bnRTZW5kZXIgPSBtYWtlRXZlbnRTZW5kZXIoY29udGV4dCk7CisgICAgSlNPYmplY3RTZXRQcm9w
ZXJ0eShjb250ZXh0LCB3aW5kb3dPYmplY3QsIGV2ZW50U2VuZGVyU3RyLCBldmVudFNlbmRlciwg
a0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERl
bGV0ZSwgMCk7CisgICAgSlNTdHJpbmdSZWxlYXNlKGV2ZW50U2VuZGVyU3RyKTsKKyAgICBXZWJD
b3JlVGVzdFN1cHBvcnQ6OmluamVjdEludGVybmFsc09iamVjdChjb250ZXh0KTsKK30KKwordm9p
ZCBEdW1wUmVuZGVyVHJlZTo6ZGlkUmVjZWl2ZVRpdGxlRm9yRnJhbWUoY29uc3QgV1RGOjpTdHJp
bmcmIHRpdGxlLCBXZWJDb3JlOjpGcmFtZSogZnJhbWUpCit7CisgICAgaWYgKCF0ZXN0RG9uZSAm
JiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBGcmFtZUxvYWRDYWxsYmFja3MoKSkKKyAgICAg
ICAgcHJpbnRmKCIlcyAtIGRpZFJlY2VpdmVUaXRsZTogJXNcbiIsIGRydEZyYW1lRGVzY3JpcHRp
b24oZnJhbWUpLnV0ZjgoKS5kYXRhKCksIHRpdGxlLnV0ZjgoKS5kYXRhKCkpOworCisgICAgaWYg
KGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcFRpdGxlQ2hhbmdlcygpKQorICAgICAgICBwcmlu
dGYoIlRJVExFIENIQU5HRUQ6ICVzXG4iLCB0aXRsZS51dGY4KCkuZGF0YSgpKTsKK30KKworLy8g
Q2hyb21lQ2xpZW50IGRlbGVnYXRlcy4KK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmFkZE1lc3NhZ2VU
b0NvbnNvbGUoY29uc3QgV1RGOjpTdHJpbmcmIG1lc3NhZ2UsIHVuc2lnbmVkIGludCBsaW5lTnVt
YmVyLCBjb25zdCBXVEY6OlN0cmluZyYgc291cmNlSUQpCit7CisgICAgcHJpbnRmKCJDT05TT0xF
IE1FU1NBR0U6IGxpbmUgJWQ6ICVzXG4iLCBsaW5lTnVtYmVyLCBtZXNzYWdlLnV0ZjgoKS5kYXRh
KCkpOworfQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpydW5KYXZhU2NyaXB0QWxlcnQoY29uc3Qg
V1RGOjpTdHJpbmcmIG1lc3NhZ2UpCit7CisgICAgaWYgKCF0ZXN0RG9uZSkKKyAgICAgICAgcHJp
bnRmKCJBTEVSVDogJXNcbiIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7Cit9CisKK2Jvb2wgRHVt
cFJlbmRlclRyZWU6OnJ1bkphdmFTY3JpcHRDb25maXJtKGNvbnN0IFdURjo6U3RyaW5nJiBtZXNz
YWdlKQoreworICAgIGlmICghdGVzdERvbmUpCisgICAgICAgIHByaW50ZigiQ09ORklSTTogJXNc
biIsIG1lc3NhZ2UudXRmOCgpLmRhdGEoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1dURjo6
U3RyaW5nIER1bXBSZW5kZXJUcmVlOjpydW5KYXZhU2NyaXB0UHJvbXB0KGNvbnN0IFdURjo6U3Ry
aW5nJiBtZXNzYWdlLCBjb25zdCBXVEY6OlN0cmluZyYgZGVmYXVsdFZhbHVlKQoreworICAgIGlm
ICghdGVzdERvbmUpCisgICAgICAgIHByaW50ZigiUFJPTVBUOiAlcywgZGVmYXVsdCB0ZXh0OiAl
c1xuIiwgbWVzc2FnZS51dGY4KCkuZGF0YSgpLCBkZWZhdWx0VmFsdWUudXRmOCgpLmRhdGEoKSk7
CisgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKK30KKworYm9vbCBEdW1wUmVuZGVyVHJlZTo6cnVu
QmVmb3JlVW5sb2FkQ29uZmlybVBhbmVsKGNvbnN0IFdURjo6U3RyaW5nJiBtZXNzYWdlKQorewor
ICAgIGlmICghdGVzdERvbmUpCisgICAgICAgIHByaW50ZigiQ09ORklSTSBOQVZJR0FUSU9OOiAl
c1xuIiwgbWVzc2FnZS51dGY4KCkuZGF0YSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9p
ZCBEdW1wUmVuZGVyVHJlZTo6c2V0U3RhdHVzVGV4dChjb25zdCBXVEY6OlN0cmluZyYgc3RhdHVz
KQoreworICAgIGlmIChnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBTdGF0dXNDYWxsYmFja3Mo
KSkKKyAgICAgICAgcHJpbnRmKCJVSSBERUxFR0FURSBTVEFUVVMgQ0FMTEJBQ0s6IHNldFN0YXR1
c1RleHQ6JXNcbiIsIHN0YXR1cy51dGY4KCkuZGF0YSgpKTsKK30KKwordm9pZCBEdW1wUmVuZGVy
VHJlZTo6ZXhjZWVkZWREYXRhYmFzZVF1b3RhKFdlYkNvcmU6OlNlY3VyaXR5T3JpZ2luKiBvcmln
aW4sIGNvbnN0IFdURjo6U3RyaW5nJiBuYW1lKQoreworICAgIGlmICghdGVzdERvbmUgJiYgZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wRGF0YWJhc2VDYWxsYmFja3MoKSkKKyAgICAgICAgcHJp
bnRmKCJVSSBERUxFR0FURSBEQVRBQkFTRSBDQUxMQkFDSzogZXhjZWVkZWREYXRhYmFzZVF1b3Rh
Rm9yU2VjdXJpdHlPcmlnaW46eyVzLCAlcywgJWl9IGRhdGFiYXNlOiVzXG4iLCBvcmlnaW4tPnBy
b3RvY29sKCkudXRmOCgpLmRhdGEoKSwgb3JpZ2luLT5ob3N0KCkudXRmOCgpLmRhdGEoKSwgb3Jp
Z2luLT5wb3J0KCksIG5hbWUudXRmOCgpLmRhdGEoKSk7CisKKyAgICBXZWJDb3JlOjpEYXRhYmFz
ZVRyYWNrZXI6OnRyYWNrZXIoKS5zZXRRdW90YShtYWluRnJhbWUtPmRvY3VtZW50KCktPnNlY3Vy
aXR5T3JpZ2luKCksIDUgKiAxMDI0ICogMTAyNCk7Cit9CisKK2Jvb2wgRHVtcFJlbmRlclRyZWU6
OmFsbG93c09wZW5pbmdXaW5kb3coKQoreworICAgIHJldHVybiBnTGF5b3V0VGVzdENvbnRyb2xs
ZXItPmNhbk9wZW5XaW5kb3dzKCk7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OndpbmRvd0Ny
ZWF0ZWQoQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlKiBwYWdlKQoreworICAgIHBhZ2UtPnNl
dHRpbmdzKCktPnNldEphdmFTY3JpcHRPcGVuV2luZG93c0F1dG9tYXRpY2FsbHkodHJ1ZSk7Cit9
CisKKy8vIEVkaXRvckNsaWVudCBkZWxlZ2F0ZXMuCit2b2lkIER1bXBSZW5kZXJUcmVlOjpkaWRC
ZWdpbkVkaXRpbmcoKQoreworICAgIGlmICghdGVzdERvbmUgJiYgZ0xheW91dFRlc3RDb250cm9s
bGVyLT5kdW1wRWRpdGluZ0NhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIkVESVRJTkcgREVM
RUdBVEU6IHdlYlZpZXdEaWRCZWdpbkVkaXRpbmc6JXNcbiIsICJXZWJWaWV3RGlkQmVnaW5FZGl0
aW5nTm90aWZpY2F0aW9uIik7Cit9CisKK3ZvaWQgRHVtcFJlbmRlclRyZWU6OmRpZEVuZEVkaXRp
bmcoKQoreworICAgIGlmICghdGVzdERvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1w
RWRpdGluZ0NhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIkVESVRJTkcgREVMRUdBVEU6IHdl
YlZpZXdEaWRFbmRFZGl0aW5nOiVzXG4iLCAiV2ViVmlld0RpZEVuZEVkaXRpbmdOb3RpZmljYXRp
b24iKTsKK30KKwordm9pZCBEdW1wUmVuZGVyVHJlZTo6ZGlkQ2hhbmdlKCkKK3sKKyAgICBpZiAo
IXRlc3REb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEVkaXRpbmdDYWxsYmFja3Mo
KSkKKyAgICAgICAgcHJpbnRmKCJFRElUSU5HIERFTEVHQVRFOiB3ZWJWaWV3RGlkQ2hhbmdlOiVz
XG4iLCAiV2ViVmlld0RpZENoYW5nZU5vdGlmaWNhdGlvbiIpOworfQorCit2b2lkIER1bXBSZW5k
ZXJUcmVlOjpkaWRDaGFuZ2VTZWxlY3Rpb24oKQoreworICAgIGlmICghdGVzdERvbmUgJiYgZ0xh
eW91dFRlc3RDb250cm9sbGVyLT5kdW1wRWRpdGluZ0NhbGxiYWNrcygpKQorICAgICAgICBwcmlu
dGYoIkVESVRJTkcgREVMRUdBVEU6IHdlYlZpZXdEaWRDaGFuZ2VTZWxlY3Rpb246JXNcbiIsICJX
ZWJWaWV3RGlkQ2hhbmdlU2VsZWN0aW9uTm90aWZpY2F0aW9uIik7Cit9CisKK2Jvb2wgRHVtcFJl
bmRlclRyZWU6OmZpbmRTdHJpbmcoY29uc3QgV1RGOjpTdHJpbmcmIHN0cmluZywgV2ViQ29yZTo6
RmluZE9wdGlvbnMgb3B0aW9ucykKK3sKKyAgICBXZWJDb3JlOjpQYWdlKiBwYWdlID0gbWFpbkZy
YW1lID8gbWFpbkZyYW1lLT5wYWdlKCkgOiAwOworICAgIHJldHVybiBwYWdlICYmIHBhZ2UtPmZp
bmRTdHJpbmcoc3RyaW5nLCBvcHRpb25zKTsKK30KKworYm9vbCBEdW1wUmVuZGVyVHJlZTo6c2hv
dWxkQmVnaW5FZGl0aW5nSW5ET01SYW5nZShXZWJDb3JlOjpSYW5nZSogcmFuZ2UpCit7CisgICAg
aWYgKCF0ZXN0RG9uZSAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBFZGl0aW5nQ2FsbGJh
Y2tzKCkpCisgICAgICAgIHByaW50ZigiRURJVElORyBERUxFR0FURTogc2hvdWxkQmVnaW5FZGl0
aW5nSW5ET01SYW5nZTolc1xuIiwgZHJ0UmFuZ2VEZXNjcmlwdGlvbihyYW5nZSkudXRmOCgpLmRh
dGEoKSk7CisgICAgcmV0dXJuIG1fYWNjZXB0c0VkaXRpbmc7Cit9CisKK2Jvb2wgRHVtcFJlbmRl
clRyZWU6OnNob3VsZEVuZEVkaXRpbmdJbkRPTVJhbmdlKFdlYkNvcmU6OlJhbmdlKiByYW5nZSkK
K3sKKyAgICBpZiAoIXRlc3REb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEVkaXRp
bmdDYWxsYmFja3MoKSkKKyAgICAgICAgcHJpbnRmKCJFRElUSU5HIERFTEVHQVRFOiBzaG91bGRF
bmRFZGl0aW5nSW5ET01SYW5nZTolc1xuIiwgZHJ0UmFuZ2VEZXNjcmlwdGlvbihyYW5nZSkudXRm
OCgpLmRhdGEoKSk7CisgICAgcmV0dXJuIG1fYWNjZXB0c0VkaXRpbmc7Cit9CisKK2Jvb2wgRHVt
cFJlbmRlclRyZWU6OnNob3VsZERlbGV0ZURPTVJhbmdlKFdlYkNvcmU6OlJhbmdlKiByYW5nZSkK
K3sKKyAgICBpZiAoIXRlc3REb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEVkaXRp
bmdDYWxsYmFja3MoKSkKKyAgICAgICAgcHJpbnRmKCJFRElUSU5HIERFTEVHQVRFOiBzaG91bGRE
ZWxldGVET01SYW5nZTolc1xuIiwgZHJ0UmFuZ2VEZXNjcmlwdGlvbihyYW5nZSkudXRmOCgpLmRh
dGEoKSk7CisgICAgcmV0dXJuIG1fYWNjZXB0c0VkaXRpbmc7Cit9CisKK2Jvb2wgRHVtcFJlbmRl
clRyZWU6OnNob3VsZENoYW5nZVNlbGVjdGVkRE9NUmFuZ2VUb0RPTVJhbmdlQWZmaW5pdHlTdGls
bFNlbGVjdGluZyhXZWJDb3JlOjpSYW5nZSogZnJvbVJhbmdlLCBXZWJDb3JlOjpSYW5nZSogdG9S
YW5nZSwgaW50IGFmZmluaXR5LCBib29sIHN0aWxsU2VsZWN0aW5nKQoreworICAgIGlmICghdGVz
dERvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVyLT5kdW1wRWRpdGluZ0NhbGxiYWNrcygpKQor
ICAgICAgICBwcmludGYoIkVESVRJTkcgREVMRUdBVEU6IHNob3VsZENoYW5nZVNlbGVjdGVkRE9N
UmFuZ2U6JXMgdG9ET01SYW5nZTolcyBhZmZpbml0eTolcyBzdGlsbFNlbGVjdGluZzolc1xuIiwg
ZHJ0UmFuZ2VEZXNjcmlwdGlvbihmcm9tUmFuZ2UpLnV0ZjgoKS5kYXRhKCksIGRydFJhbmdlRGVz
Y3JpcHRpb24odG9SYW5nZSkudXRmOCgpLmRhdGEoKSwgZHJ0QWZmaW5pdHlEZXNjcmlwdGlvbihz
dGF0aWNfY2FzdDxXZWJDb3JlOjpFQWZmaW5pdHk+KGFmZmluaXR5KSkudXRmOCgpLmRhdGEoKSwg
c3RpbGxTZWxlY3RpbmcgPyAiVFJVRSIgOiAiRkFMU0UiKTsKKyAgICByZXR1cm4gbV9hY2NlcHRz
RWRpdGluZzsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGluc2VydEFjdGlvblN0cmluZyhXZWJD
b3JlOjpFZGl0b3JJbnNlcnRBY3Rpb24gYWN0aW9uKQoreworICAgIHN3aXRjaCAoYWN0aW9uKSB7
CisgICAgY2FzZSBXZWJDb3JlOjpFZGl0b3JJbnNlcnRBY3Rpb25UeXBlZDoKKyAgICAgICAgcmV0
dXJuICJXZWJWaWV3SW5zZXJ0QWN0aW9uVHlwZWQiOworICAgIGNhc2UgV2ViQ29yZTo6RWRpdG9y
SW5zZXJ0QWN0aW9uUGFzdGVkOgorICAgICAgICByZXR1cm4gIldlYlZpZXdJbnNlcnRBY3Rpb25Q
YXN0ZWQiOworICAgIGNhc2UgV2ViQ29yZTo6RWRpdG9ySW5zZXJ0QWN0aW9uRHJvcHBlZDoKKyAg
ICAgICAgcmV0dXJuICJXZWJWaWV3SW5zZXJ0QWN0aW9uRHJvcHBlZCI7CisgICAgfQorICAgIEFT
U0VSVF9OT1RfUkVBQ0hFRCgpOworICAgIHJldHVybiAiV2ViVmlld0luc2VydEFjdGlvblR5cGVk
IjsKK30KKworYm9vbCBEdW1wUmVuZGVyVHJlZTo6c2hvdWxkSW5zZXJ0Tm9kZShXZWJDb3JlOjpO
b2RlKiBub2RlLCBXZWJDb3JlOjpSYW5nZSogcmFuZ2UsIGludCBhY3Rpb24pCit7CisgICAgaWYg
KCF0ZXN0RG9uZSAmJiBnTGF5b3V0VGVzdENvbnRyb2xsZXItPmR1bXBFZGl0aW5nQ2FsbGJhY2tz
KCkpCisgICAgICAgIHByaW50ZigiRURJVElORyBERUxFR0FURTogc2hvdWxkSW5zZXJ0Tm9kZTol
cyByZXBsYWNpbmdET01SYW5nZTolcyBnaXZlbkFjdGlvbjolc1xuIiwgZHJ0RHVtcFBhdGgobm9k
ZSkudXRmOCgpLmRhdGEoKSwgZHJ0UmFuZ2VEZXNjcmlwdGlvbihyYW5nZSkudXRmOCgpLmRhdGEo
KSwgaW5zZXJ0QWN0aW9uU3RyaW5nKChXZWJDb3JlOjpFZGl0b3JJbnNlcnRBY3Rpb24pYWN0aW9u
KSk7CisgICAgcmV0dXJuIG1fYWNjZXB0c0VkaXRpbmc7Cit9CisKK2Jvb2wgRHVtcFJlbmRlclRy
ZWU6OnNob3VsZEluc2VydFRleHQoY29uc3QgV1RGOjpTdHJpbmcmIHRleHQsIFdlYkNvcmU6OlJh
bmdlKiByYW5nZSwgaW50IGFjdGlvbikKK3sKKyAgICBpZiAoIXRlc3REb25lICYmIGdMYXlvdXRU
ZXN0Q29udHJvbGxlci0+ZHVtcEVkaXRpbmdDYWxsYmFja3MoKSkKKyAgICAgICAgcHJpbnRmKCJF
RElUSU5HIERFTEVHQVRFOiBzaG91bGRJbnNlcnRUZXh0OiVzIHJlcGxhY2luZ0RPTVJhbmdlOiVz
IGdpdmVuQWN0aW9uOiVzXG4iLCB0ZXh0LnV0ZjgoKS5kYXRhKCksIGRydFJhbmdlRGVzY3JpcHRp
b24ocmFuZ2UpLnV0ZjgoKS5kYXRhKCksIGluc2VydEFjdGlvblN0cmluZygoV2ViQ29yZTo6RWRp
dG9ySW5zZXJ0QWN0aW9uKWFjdGlvbikpOworICAgIHJldHVybiBtX2FjY2VwdHNFZGl0aW5nOwor
fQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpkaWREZWNpZGVQb2xpY3lGb3JOYXZpZ2F0aW9uQWN0
aW9uKGNvbnN0IFdlYkNvcmU6Ok5hdmlnYXRpb25BY3Rpb24mIGFjdGlvbiwgY29uc3QgV2ViQ29y
ZTo6UmVzb3VyY2VSZXF1ZXN0JiByZXF1ZXN0KQoreworICAgIGlmICghd2FpdEZvclBvbGljeSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgY2hhciogdHlwZURlc2NyaXB0aW9uOworICAg
IHN3aXRjaCAoYWN0aW9uLnR5cGUoKSkgeworICAgIGNhc2UgV2ViQ29yZTo6TmF2aWdhdGlvblR5
cGVMaW5rQ2xpY2tlZDoKKyAgICAgICAgdHlwZURlc2NyaXB0aW9uID0gImxpbmsgY2xpY2tlZCI7
CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgV2ViQ29yZTo6TmF2aWdhdGlvblR5cGVGb3JtU3Vi
bWl0dGVkOgorICAgICAgICB0eXBlRGVzY3JpcHRpb24gPSAiZm9ybSBzdWJtaXR0ZWQiOworICAg
ICAgICBicmVhazsKKyAgICBjYXNlIFdlYkNvcmU6Ok5hdmlnYXRpb25UeXBlQmFja0ZvcndhcmQ6
CisgICAgICAgIHR5cGVEZXNjcmlwdGlvbiA9ICJiYWNrL2ZvcndhcmQiOworICAgICAgICBicmVh
azsKKyAgICBjYXNlIFdlYkNvcmU6Ok5hdmlnYXRpb25UeXBlUmVsb2FkOgorICAgICAgICB0eXBl
RGVzY3JpcHRpb24gPSAicmVsb2FkIjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXZWJDb3Jl
OjpOYXZpZ2F0aW9uVHlwZUZvcm1SZXN1Ym1pdHRlZDoKKyAgICAgICAgdHlwZURlc2NyaXB0aW9u
ID0gImZvcm0gcmVzdWJtaXR0ZWQiOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFdlYkNvcmU6
Ok5hdmlnYXRpb25UeXBlT3RoZXI6CisgICAgICAgIHR5cGVEZXNjcmlwdGlvbiA9ICJvdGhlciI7
CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHR5cGVEZXNjcmlwdGlvbiA9
ICJpbGxlZ2FsIHZhbHVlIjsKKyAgICB9CisKKyAgICBwcmludGYoIlBvbGljeSBkZWxlZ2F0ZTog
YXR0ZW1wdCB0byBsb2FkICVzIHdpdGggbmF2aWdhdGlvbiB0eXBlICclcydcbiIsIHJlcXVlc3Qu
dXJsKCkuc3RyaW5nKCkudXRmOCgpLmRhdGEoKSwgdHlwZURlc2NyaXB0aW9uKTsKKyAgICAvLyBG
SVhNRTogZG8gb3JpZ2luYXRpbmcgcGFydC4KKworICAgIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+
bm90aWZ5RG9uZSgpOworfQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpkaWREaXNwYXRjaFdpbGxQ
ZXJmb3JtQ2xpZW50UmVkaXJlY3QoKQoreworICAgIGlmICghdGVzdERvbmUgJiYgZ0xheW91dFRl
c3RDb250cm9sbGVyLT5kdW1wVXNlckdlc3R1cmVJbkZyYW1lTG9hZENhbGxiYWNrcygpKQorICAg
ICAgICBwcmludGYoIkZyYW1lIHdpdGggdXNlciBnZXN0dXJlIFwiJXNcIiAtIGluIHdpbGxQZXJm
b3JtQ2xpZW50UmVkaXJlY3RcbiIsIFdlYkNvcmU6OlNjcmlwdENvbnRyb2xsZXI6OnByb2Nlc3Np
bmdVc2VyR2VzdHVyZSgpID8gInRydWUiIDogImZhbHNlIik7Cit9CisKK3ZvaWQgRHVtcFJlbmRl
clRyZWU6OmRpZEhhbmRsZU9ubG9hZEV2ZW50c0ZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKiBmcmFt
ZSkKK3sKKyAgICBpZiAoIXRlc3REb25lICYmIGdMYXlvdXRUZXN0Q29udHJvbGxlci0+ZHVtcEZy
YW1lTG9hZENhbGxiYWNrcygpKQorICAgICAgICBwcmludGYoIiVzIC0gZGlkSGFuZGxlT25sb2Fk
RXZlbnRzRm9yRnJhbWVcbiIsIGRydEZyYW1lRGVzY3JpcHRpb24oZnJhbWUpLnV0ZjgoKS5kYXRh
KCkpOworfQorCit2b2lkIER1bXBSZW5kZXJUcmVlOjpkaWRSZWNlaXZlUmVzcG9uc2VGb3JGcmFt
ZShXZWJDb3JlOjpGcmFtZSogZnJhbWUsIGNvbnN0IFdlYkNvcmU6OlJlc291cmNlUmVzcG9uc2Um
IHJlc3BvbnNlKQoreworICAgIGlmICghdGVzdERvbmUgJiYgZ0xheW91dFRlc3RDb250cm9sbGVy
LT5kdW1wUmVzb3VyY2VSZXNwb25zZU1JTUVUeXBlcygpKQorICAgICAgICBwcmludGYoIiVzIGhh
cyBNSU1FIHR5cGUgJXNcbiIsIHJlc3BvbnNlLnVybCgpLmxhc3RQYXRoQ29tcG9uZW50KCkudXRm
OCgpLmRhdGEoKSwgcmVzcG9uc2UubWltZVR5cGUoKS51dGY4KCkuZGF0YSgpKTsKK30KKworfQor
fQorCisvLyBTdGF0aWMgZHVtcCgpIGZ1bmN0aW9uIHJlcXVpcmVkIGJ5IGNyb3NzLXBsYXRmb3Jt
IERSVCBjb2RlLgordm9pZCBkdW1wKCkKK3sKKyAgICBCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBS
ZW5kZXJUcmVlKiBkdW1wZXIgPSBCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpj
dXJyZW50SW5zdGFuY2UoKTsKKyAgICBpZiAoIWR1bXBlcikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgZHVtcGVyLT5kdW1wKCk7Cit9CmRpZmYgLS1naXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9i
bGFja2JlcnJ5L0R1bXBSZW5kZXJUcmVlQmxhY2tCZXJyeS5oIGIvVG9vbHMvRHVtcFJlbmRlclRy
ZWUvYmxhY2tiZXJyeS9EdW1wUmVuZGVyVHJlZUJsYWNrQmVycnkuaApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5kYjJm
NjlhMzA2YzM5OWI1YzU4YjJlNzk2OTg0NTUxZmJiZjlkMzU2Ci0tLSAvZGV2L251bGwKKysrIGIv
VG9vbHMvRHVtcFJlbmRlclRyZWUvYmxhY2tiZXJyeS9EdW1wUmVuZGVyVHJlZUJsYWNrQmVycnku
aApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSwgMjAxMCwgMjAx
MSwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVz
c2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAw
MjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIER1bXBSZW5kZXJUcmVlQmxhY2tCZXJyeV9o
CisjZGVmaW5lIER1bXBSZW5kZXJUcmVlQmxhY2tCZXJyeV9oCisKKyNpbmNsdWRlICJCbGFja0Jl
cnJ5R2xvYmFsLmgiCisKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZUNsaWVudC5oIgorI2luY2x1
ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlIDxGaW5k
T3B0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUg
eworY2xhc3MgRnJhbWU7CitjbGFzcyBET01XcmFwcGVyV29ybGQ7CitjbGFzcyBSYW5nZTsKK30K
KworZXh0ZXJuIFdlYkNvcmU6OkZyYW1lKiBtYWluRnJhbWU7CitleHRlcm4gV2ViQ29yZTo6RnJh
bWUqIHRvcExvYWRpbmdGcmFtZTsKK2V4dGVybiBib29sIHdhaXRGb3JQb2xpY3k7CisKK2NsYXNz
IEFjY2Vzc2liaWxpdHlDb250cm9sbGVyOworY2xhc3MgR0NDb250cm9sbGVyOworCituYW1lc3Bh
Y2UgQmxhY2tCZXJyeSB7CituYW1lc3BhY2UgV2ViS2l0IHsKK2NsYXNzIFdlYlBhZ2U7CisKK2Ns
YXNzIER1bXBSZW5kZXJUcmVlIDogcHVibGljIEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRl
clRyZWVDbGllbnQgeworcHVibGljOgorICAgIER1bXBSZW5kZXJUcmVlKFdlYlBhZ2UqKTsKKyAg
ICB2aXJ0dWFsIH5EdW1wUmVuZGVyVHJlZSgpOworCisgICAgc3RhdGljIER1bXBSZW5kZXJUcmVl
KiBjdXJyZW50SW5zdGFuY2UoKSB7IHJldHVybiBzX2N1cnJlbnRJbnN0YW5jZTsgfQorCisgICAg
dm9pZCBkdW1wKCk7CisKKyAgICB2b2lkIHNldFdhaXRUb0R1bXBXYXRjaGRvZyhkb3VibGUgaW50
ZXJ2YWwpOworCisgICAgV2ViUGFnZSogcGFnZSgpIHsgcmV0dXJuIG1fcGFnZTsgfQorCisgICAg
Ym9vbCBsb2FkRmluaXNoZWQoKSBjb25zdCB7IHJldHVybiBtX2xvYWRGaW5pc2hlZDsgfQorCisg
ICAgLy8gRnJhbWVMb2FkZXJDbGllbnQgZGVsZWdhdGVzCisgICAgdm9pZCBkaWRTdGFydFByb3Zp
c2lvbmFsTG9hZEZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKik7CisgICAgdm9pZCBkaWRDb21taXRM
b2FkRm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqKTsKKyAgICB2b2lkIGRpZEZhaWxQcm92aXNpb25h
bExvYWRGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSopOworICAgIHZvaWQgZGlkRmFpbExvYWRGb3JG
cmFtZShXZWJDb3JlOjpGcmFtZSopOworICAgIHZvaWQgZGlkRmluaXNoTG9hZEZvckZyYW1lKFdl
YkNvcmU6OkZyYW1lKik7CisgICAgdm9pZCBkaWRGaW5pc2hEb2N1bWVudExvYWRGb3JGcmFtZShX
ZWJDb3JlOjpGcmFtZSopOworICAgIHZvaWQgZGlkQ2xlYXJXaW5kb3dPYmplY3RJbldvcmxkKFdl
YkNvcmU6OkRPTVdyYXBwZXJXb3JsZCosIEpTR2xvYmFsQ29udGV4dFJlZiwgSlNPYmplY3RSZWYg
d2luZG93T2JqZWN0KTsKKyAgICB2b2lkIGRpZFJlY2VpdmVUaXRsZUZvckZyYW1lKGNvbnN0IFdU
Rjo6U3RyaW5nJiB0aXRsZSwgV2ViQ29yZTo6RnJhbWUqKTsKKyAgICB2b2lkIGRpZERlY2lkZVBv
bGljeUZvck5hdmlnYXRpb25BY3Rpb24oY29uc3QgV2ViQ29yZTo6TmF2aWdhdGlvbkFjdGlvbiYs
IGNvbnN0IFdlYkNvcmU6OlJlc291cmNlUmVxdWVzdCYpOworICAgIHZvaWQgZGlkRGlzcGF0Y2hX
aWxsUGVyZm9ybUNsaWVudFJlZGlyZWN0KCk7CisgICAgdm9pZCBkaWRIYW5kbGVPbmxvYWRFdmVu
dHNGb3JGcmFtZShXZWJDb3JlOjpGcmFtZSopOworICAgIHZvaWQgZGlkUmVjZWl2ZVJlc3BvbnNl
Rm9yRnJhbWUoV2ViQ29yZTo6RnJhbWUqLCBjb25zdCBXZWJDb3JlOjpSZXNvdXJjZVJlc3BvbnNl
Jik7CisKKyAgICAvLyBDaHJvbWVDbGllbnQgZGVsZWdhdGVzCisgICAgdm9pZCBhZGRNZXNzYWdl
VG9Db25zb2xlKGNvbnN0IFdURjo6U3RyaW5nJiBtZXNzYWdlLCB1bnNpZ25lZCBpbnQgbGluZU51
bWJlciwgY29uc3QgV1RGOjpTdHJpbmcmIHNvdXJjZUlEKTsKKyAgICB2b2lkIHJ1bkphdmFTY3Jp
cHRBbGVydChjb25zdCBXVEY6OlN0cmluZyYgbWVzc2FnZSk7CisgICAgYm9vbCBydW5KYXZhU2Ny
aXB0Q29uZmlybShjb25zdCBXVEY6OlN0cmluZyYgbWVzc2FnZSk7CisgICAgV1RGOjpTdHJpbmcg
cnVuSmF2YVNjcmlwdFByb21wdChjb25zdCBXVEY6OlN0cmluZyYgbWVzc2FnZSwgY29uc3QgV1RG
OjpTdHJpbmcmIGRlZmF1bHRWYWx1ZSk7CisgICAgYm9vbCBydW5CZWZvcmVVbmxvYWRDb25maXJt
UGFuZWwoY29uc3QgV1RGOjpTdHJpbmcmIG1lc3NhZ2UpOworICAgIHZvaWQgc2V0U3RhdHVzVGV4
dChjb25zdCBXVEY6OlN0cmluZyYpOworICAgIHZvaWQgZXhjZWVkZWREYXRhYmFzZVF1b3RhKFdl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luKiwgY29uc3QgV1RGOjpTdHJpbmcmIG5hbWUpOworICAgIGJv
b2wgYWxsb3dzT3BlbmluZ1dpbmRvdygpOworICAgIHZvaWQgd2luZG93Q3JlYXRlZChXZWJQYWdl
Kik7CisKKyAgICAvLyBFZGl0b3JDbGllbnQgZGVsZWdhdGVzCisgICAgdm9pZCBzZXRBY2NlcHRz
RWRpdGluZyhib29sIGFjY2VwdHNFZGl0aW5nKSB7IG1fYWNjZXB0c0VkaXRpbmcgPSBhY2NlcHRz
RWRpdGluZzsgfQorCisgICAgdm9pZCBkaWRCZWdpbkVkaXRpbmcoKTsKKyAgICB2b2lkIGRpZEVu
ZEVkaXRpbmcoKTsKKyAgICB2b2lkIGRpZENoYW5nZSgpOworICAgIHZvaWQgZGlkQ2hhbmdlU2Vs
ZWN0aW9uKCk7CisgICAgYm9vbCBmaW5kU3RyaW5nKGNvbnN0IFdURjo6U3RyaW5nJiwgV2ViQ29y
ZTo6RmluZE9wdGlvbnMpOworICAgIGJvb2wgc2hvdWxkQmVnaW5FZGl0aW5nSW5ET01SYW5nZShX
ZWJDb3JlOjpSYW5nZSopOworICAgIGJvb2wgc2hvdWxkRW5kRWRpdGluZ0luRE9NUmFuZ2UoV2Vi
Q29yZTo6UmFuZ2UqKTsKKyAgICBib29sIHNob3VsZERlbGV0ZURPTVJhbmdlKFdlYkNvcmU6OlJh
bmdlKik7CisgICAgYm9vbCBzaG91bGRDaGFuZ2VTZWxlY3RlZERPTVJhbmdlVG9ET01SYW5nZUFm
ZmluaXR5U3RpbGxTZWxlY3RpbmcoV2ViQ29yZTo6UmFuZ2UqIGZyb21SYW5nZSwgV2ViQ29yZTo6
UmFuZ2UqIHRvUmFuZ2UsIGludCBhZmZpbml0eSwgYm9vbCBzdGlsbFNlbGVjdGluZyk7CisgICAg
Ym9vbCBzaG91bGRJbnNlcnROb2RlKFdlYkNvcmU6Ok5vZGUqLCBXZWJDb3JlOjpSYW5nZSosIGlu
dCBpbnNlcnRBY3Rpb24pOworICAgIGJvb2wgc2hvdWxkSW5zZXJ0VGV4dChjb25zdCBXVEY6OlN0
cmluZyYsIFdlYkNvcmU6OlJhbmdlKiwgaW50IGluc2VydEFjdGlvbik7CisKKyAgICBib29sIGlz
U2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIHNfc2VsZWN0
VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZDsgfQorICAgIHZvaWQgc2V0U2VsZWN0VHJhaWxpbmdX
aGl0ZXNwYWNlRW5hYmxlZChib29sIGVuYWJsZWQpIHsgc19zZWxlY3RUcmFpbGluZ1doaXRlc3Bh
Y2VFbmFibGVkID0gZW5hYmxlZDsgfQorCitwcml2YXRlOgorICAgIHZvaWQgcnVuVGVzdChjb25z
dCBXVEY6OlN0cmluZyYgdXJsKTsKKyAgICB2b2lkIHJ1blRlc3RzKCk7CisKKyAgICB2b2lkIHBy
b2Nlc3NXb3JrKFdlYkNvcmU6OlRpbWVyPER1bXBSZW5kZXJUcmVlPiopOworCitwcml2YXRlOgor
ICAgIHN0YXRpYyBEdW1wUmVuZGVyVHJlZSogc19jdXJyZW50SW5zdGFuY2U7CisKKyAgICBXVEY6
OlN0cmluZyBkdW1wRnJhbWVzQXNUZXh0KFdlYkNvcmU6OkZyYW1lKik7CisgICAgdm9pZCBsb2Nh
dGlvbkNoYW5nZUZvckZyYW1lKFdlYkNvcmU6OkZyYW1lKik7CisKKyAgICB2b2lkIGRvbmVEcnQo
KTsKKyAgICB2b2lkIGdldFRlc3RzVG9SdW4oKTsKKyAgICBib29sIGlzSFRUUFRlc3QoY29uc3Qg
V1RGOjpTdHJpbmcmIHRlc3QpOworICAgIFdURjo6U3RyaW5nIHJlbmRlclRyZWVEdW1wKCkgY29u
c3Q7CisgICAgdm9pZCByZXNldFRvQ29uc2lzdGVudFN0YXRlQmVmb3JlVGVzdGluZygpOworICAg
IHZvaWQgcnVuUmVtYWluaW5nVGVzdHMoKTsKKyAgICB2b2lkIGludmFsaWRhdGVBbnlQcmV2aW91
c1dhaXRUb0R1bXBXYXRjaGRvZygpOworICAgIHZvaWQgd2FpdFRvRHVtcFdhdGNoZG9nVGltZXJG
aXJlZChXZWJDb3JlOjpUaW1lcjxEdW1wUmVuZGVyVHJlZT4qKTsKKworICAgIFZlY3RvcjxXVEY6
OlN0cmluZz4gbV90ZXN0czsKKyAgICBWZWN0b3I8V1RGOjpTdHJpbmc+OjppdGVyYXRvciBtX2N1
cnJlbnRUZXN0OworCisgICAgV1RGOjpTdHJpbmcgbV9yZXN1bHRzRGlyOworICAgIFdURjo6U3Ry
aW5nIG1faW5kZXhGaWxlOworICAgIFdURjo6U3RyaW5nIG1fZG9uZUZpbGU7CisgICAgV1RGOjpT
dHJpbmcgbV9jdXJyZW50SHR0cFRlc3Q7CisgICAgV1RGOjpTdHJpbmcgbV9jdXJyZW50VGVzdEZp
bGU7CisKKyAgICBHQ0NvbnRyb2xsZXIqIG1fZ2NDb250cm9sbGVyOworICAgIEFjY2Vzc2liaWxp
dHlDb250cm9sbGVyKiBtX2FjY2Vzc2liaWxpdHlDb250cm9sbGVyOworICAgIFdlYlBhZ2UqIG1f
cGFnZTsKKyAgICBib29sIG1fZHVtcFBpeGVsczsKKyAgICBXZWJDb3JlOjpUaW1lcjxEdW1wUmVu
ZGVyVHJlZT4gbV93YWl0VG9EdW1wV2F0Y2hkb2dUaW1lcjsKKyAgICBXZWJDb3JlOjpUaW1lcjxE
dW1wUmVuZGVyVHJlZT4gbV93b3JrVGltZXI7CisKKyAgICBib29sIG1fYWNjZXB0c0VkaXRpbmc7
CisgICAgYm9vbCBtX2xvYWRGaW5pc2hlZDsKKyAgICBzdGF0aWMgYm9vbCBzX3NlbGVjdFRyYWls
aW5nV2hpdGVzcGFjZUVuYWJsZWQ7Cit9OworfQorfQorCisjZW5kaWYgLy8gRHVtcFJlbmRlclRy
ZWVCbGFja0JlcnJ5X2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126121</attachid>
            <date>2012-02-08 11:08:04 -0800</date>
            <delta_ts>2012-02-08 14:29:50 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78042-20120208141034.patch</filename>
            <type>text/plain</type>
            <size>41091</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTAxCmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggYjQxM2I1YWFkMGViZjE0ZDFhNWIyNGFhMjRiNzU5MzYx
NzQwOTgzZC4uMzZkNjg1MzFiOGQwNjhlZmVkMGNmNmI5MGQzNDg4MmQ0ZjIzMTZlMyAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE5
IEBACisyMDEyLTAyLTA4ICBSb2IgQnVpcyAgPHJidWlzQHJpbS5jb20+CisKKyAgICAgICAgW0Js
YWNrQmVycnldIFVwc3RyZWFtIER1bXBSZW5kZXJUcmVlQmxhY2tCZXJyeQorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwNDIKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBVcHN0cmVhbSBtb3JlIHBhcnRzIG9m
IG91ciBEUlQgaW1wbGVtZW50YXRpb24uCisKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9ibGFj
a2JlcnJ5L0FjY2Vzc2liaWxpdHlDb250cm9sbGVyQmxhY2tCZXJyeS5jcHA6IEFkZGVkLgorICAg
ICAgICAqIER1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvQWNjZXNzaWJpbGl0eVVJRWxlbWVudEJs
YWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5
L0V2ZW50U2VuZGVyLmNwcDogQWRkZWQuCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvYmxhY2ti
ZXJyeS9FdmVudFNlbmRlci5oOiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9ibGFj
a2JlcnJ5L0dDQ29udHJvbGxlckJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1w
UmVuZGVyVHJlZS9ibGFja2JlcnJ5L1dvcmtRdWV1ZUl0ZW1CbGFja0JlcnJ5LmNwcDogQWRkZWQu
CisKIDIwMTItMDItMDggIEFudHRpIEtvaXZpc3RvICA8YW50dGlAYXBwbGUuY29tPgogCiAgICAg
ICAgIFJFR1JFU1NJT04gKHIxMDY2ODEpOiBOdWxsIGNoZWNrIG1pc3NpbmcgaW4gW1dlYkZyYW1l
KFdlYkludGVybmFsKSBfdHlwaW5nU3R5bGVdCmRpZmYgLS1naXQgYS9Ub29scy9EdW1wUmVuZGVy
VHJlZS9ibGFja2JlcnJ5L0FjY2Vzc2liaWxpdHlDb250cm9sbGVyQmxhY2tCZXJyeS5jcHAgYi9U
b29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L0FjY2Vzc2liaWxpdHlDb250cm9sbGVyQmxh
Y2tCZXJyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMWZlMmVhODVlNzBkYzNjYWQ3NDNjZjdiYzZlNDQxNzdk
ZjFlNTBjZgotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVy
cnkvQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXJCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDgwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJBY2Nlc3NpYmlsaXR5Q29udHJvbGxlci5oIgorCisjaW5j
bHVkZSAiQWNjZXNzaWJpbGl0eVVJRWxlbWVudC5oIgorI2luY2x1ZGUgIk5vdEltcGxlbWVudGVk
LmgiCisKK0FjY2Vzc2liaWxpdHlDb250cm9sbGVyOjpBY2Nlc3NpYmlsaXR5Q29udHJvbGxlcigp
Cit7Cit9CisKK0FjY2Vzc2liaWxpdHlDb250cm9sbGVyOjp+QWNjZXNzaWJpbGl0eUNvbnRyb2xs
ZXIoKQoreworfQorCitBY2Nlc3NpYmlsaXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlDb250cm9s
bGVyOjpmb2N1c2VkRWxlbWVudCgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1
cm4gMDsKK30KKworQWNjZXNzaWJpbGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5Q29udHJvbGxl
cjo6cm9vdEVsZW1lbnQoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7
Cit9CisKK3ZvaWQgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OnNldExvZ0ZvY3VzRXZlbnRzKGJv
b2wpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBBY2Nlc3NpYmlsaXR5Q29u
dHJvbGxlcjo6c2V0TG9nU2Nyb2xsaW5nU3RhcnRFdmVudHMoYm9vbCkKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworfQorCit2b2lkIEFjY2Vzc2liaWxpdHlDb250cm9sbGVyOjpzZXRMb2dWYWx1
ZUNoYW5nZUV2ZW50cyhib29sKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK0FjY2Vz
c2liaWxpdHlVSUVsZW1lbnQgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OmVsZW1lbnRBdFBvaW50
KGludCwgaW50KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisK
K3ZvaWQgQWNjZXNzaWJpbGl0eUNvbnRyb2xsZXI6OnNldExvZ0FjY2Vzc2liaWxpdHlFdmVudHMo
Ym9vbCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEFjY2Vzc2liaWxpdHlD
b250cm9sbGVyOjphZGROb3RpZmljYXRpb25MaXN0ZW5lcihQbGF0Zm9ybVVJRWxlbWVudCwgSlNP
YmplY3RSZWYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBBY2Nlc3NpYmls
aXR5Q29udHJvbGxlcjo6bm90aWZpY2F0aW9uUmVjZWl2ZWQoUGxhdGZvcm1VSUVsZW1lbnQsIGNv
bnN0IHN0ZDo6c3RyaW5nJikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCmRpZmYgLS1n
aXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L0FjY2Vzc2liaWxpdHlVSUVsZW1l
bnRCbGFja0JlcnJ5LmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvQWNjZXNz
aWJpbGl0eVVJRWxlbWVudEJsYWNrQmVycnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmQzNjNlNzljYmM2N2Zh
YTA1NmRjNDk0ODcxMzNiYmUwOGQyNjJkNTcKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1w
UmVuZGVyVHJlZS9ibGFja2JlcnJ5L0FjY2Vzc2liaWxpdHlVSUVsZW1lbnRCbGFja0JlcnJ5LmNw
cApAQCAtMCwwICsxLDYxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMiBSZXNl
YXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwg
UHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJp
YnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBN
RVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUg
dGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWls
cy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVz
c2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBp
ZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBV
U0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQWNjZXNzaWJpbGl0eVVJ
RWxlbWVudC5oIgorCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKworQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6QWNjZXNzaWJpbGl0eVVJRWxlbWVudChQbGF0Zm9ybVVJRWxlbWVudCBlbGVt
ZW50KQorICAgIDogbV9lbGVtZW50KGVsZW1lbnQpCit7Cit9CisKK0FjY2Vzc2liaWxpdHlVSUVs
ZW1lbnQ6OkFjY2Vzc2liaWxpdHlVSUVsZW1lbnQoY29uc3QgQWNjZXNzaWJpbGl0eVVJRWxlbWVu
dCYgb3RoZXIpCisgICAgOiBtX2VsZW1lbnQob3RoZXIubV9lbGVtZW50KQoreworfQorCitBY2Nl
c3NpYmlsaXR5VUlFbGVtZW50Ojp+QWNjZXNzaWJpbGl0eVVJRWxlbWVudCgpCit7Cit9CisKK3Zv
aWQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6Z2V0TGlua2VkVUlFbGVtZW50cyhWZWN0b3I8QWNj
ZXNzaWJpbGl0eVVJRWxlbWVudD4mKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3Zv
aWQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6Z2V0RG9jdW1lbnRMaW5rcyhWZWN0b3I8QWNjZXNz
aWJpbGl0eVVJRWxlbWVudD4mKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQg
QWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6Z2V0Q2hpbGRyZW4oVmVjdG9yPEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ+JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEFjY2Vzc2li
aWxpdHlVSUVsZW1lbnQ6OmdldENoaWxkcmVuV2l0aFJhbmdlKFZlY3RvcjxBY2Nlc3NpYmlsaXR5
VUlFbGVtZW50PiYsIHVuc2lnbmVkLCB1bnNpZ25lZCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworfQorCitpbnQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6Y2hpbGRyZW5Db3VudCgpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworQWNjZXNzaWJpbGl0eVVJ
RWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjplbGVtZW50QXRQb2ludChpbnQsIGludCkK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitBY2Nlc3NpYmls
aXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmdldENoaWxkQXRJbmRleCh1bnNp
Z25lZCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitBY2Nl
c3NpYmlsaXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmxpbmtlZFVJRWxlbWVu
dEF0SW5kZXgodW5zaWduZWQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4g
MDsKK30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YWxsQXR0cmlidXRl
cygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworSlNTdHJp
bmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXR0cmlidXRlc09mTGlua2VkVUlFbGVtZW50
cygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworSlNTdHJp
bmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXR0cmlidXRlc09mRG9jdW1lbnRMaW5rcygp
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworQWNjZXNzaWJp
bGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojp0aXRsZVVJRWxlbWVudCgpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworQWNjZXNzaWJpbGl0
eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpwYXJlbnRFbGVtZW50KCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitKU1N0cmluZ1JlZiBBY2Nl
c3NpYmlsaXR5VUlFbGVtZW50OjphdHRyaWJ1dGVzT2ZDaGlsZHJlbigpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6cGFyYW1ldGVyaXplZEF0dHJpYnV0ZU5hbWVzKCkKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitKU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5
VUlFbGVtZW50Ojpyb2xlKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAw
OworfQorCitKU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpzdWJyb2xlKCkKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitKU1N0cmluZ1JlZiBB
Y2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojpyb2xlRGVzY3JpcHRpb24oKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0pTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OnRpdGxlKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAw
OworfQorCitKU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpkZXNjcmlwdGlvbigp
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworSlNTdHJpbmdS
ZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6c3RyaW5nVmFsdWUoKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0pTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6Omxhbmd1YWdlKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVy
biAwOworfQorCitkb3VibGUgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6eCgpCit7CisgICAgbm90
SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworZG91YmxlIEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OnkoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9
CisKK2RvdWJsZSBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojp3aWR0aCgpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworZG91YmxlIEFjY2Vzc2liaWxpdHlVSUVs
ZW1lbnQ6OmhlaWdodCgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsK
K30KKworZG91YmxlIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmNsaWNrUG9pbnRYKCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitkb3VibGUgQWNjZXNzaWJp
bGl0eVVJRWxlbWVudDo6Y2xpY2tQb2ludFkoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK0pTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6Om9y
aWVudGF0aW9uKCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAw
OworfQorCitkb3VibGUgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6bWluVmFsdWUoKQoreworICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2RvdWJsZSBBY2Nlc3NpYmls
aXR5VUlFbGVtZW50OjptYXhWYWx1ZSgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBy
ZXR1cm4gMDsKK30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6dmFsdWVE
ZXNjcmlwdGlvbigpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30K
KworYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc0VuYWJsZWQoKQoreworICAgIG5vdElt
cGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBY2Nlc3NpYmlsaXR5VUlFbGVt
ZW50OjppbnNlcnRpb25Qb2ludExpbmVOdW1iZXIoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7
CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNBY3Rp
b25TdXBwb3J0ZWQoSlNTdHJpbmdSZWYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBy
ZXR1cm4gMDsKK30KKworYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc1JlcXVpcmVkKCkg
Y29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitib29s
IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmlzU2VsZWN0ZWQoKSBjb25zdAoreworICAgIG5vdElt
cGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBY2Nlc3NpYmlsaXR5VUlFbGVt
ZW50OjpoaWVyYXJjaGljYWxMZXZlbCgpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KyAgICByZXR1cm4gMDsKK30KKworYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphcmlhSXNH
cmFiYmVkKCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOwor
fQorCitKU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphcmlhRHJvcEVmZmVjdHMo
KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jv
b2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNFeHBhbmRlZCgpIGNvbnN0Cit7CisgICAgbm90
SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJp
bGl0eVVJRWxlbWVudDo6YXR0cmlidXRlc09mQ29sdW1uSGVhZGVycygpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6YXR0cmlidXRlc09mUm93SGVhZGVycygpCit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxl
bWVudDo6YXR0cmlidXRlc09mQ29sdW1ucygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAg
ICByZXR1cm4gMDsKK30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXR0
cmlidXRlc09mUm93cygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsK
K30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXR0cmlidXRlc09mVmlz
aWJsZUNlbGxzKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQor
CitKU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphdHRyaWJ1dGVzT2ZIZWFkZXIo
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBBY2Nl
c3NpYmlsaXR5VUlFbGVtZW50OjppbmRleEluVGFibGUoKQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0pTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1l
bnQ6OnJvd0luZGV4UmFuZ2UoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJu
IDA7Cit9CisKK0pTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmNvbHVtbkluZGV4
UmFuZ2UoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2lu
dCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpsaW5lRm9ySW5kZXgoaW50KQoreworICAgIG5vdElt
cGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK0pTU3RyaW5nUmVmIEFjY2Vzc2liaWxp
dHlVSUVsZW1lbnQ6OmJvdW5kc0ZvclJhbmdlKHVuc2lnbmVkLCB1bnNpZ25lZCkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitKU1N0cmluZ1JlZiBBY2Nlc3Np
YmlsaXR5VUlFbGVtZW50OjpzdHJpbmdGb3JSYW5nZSh1bnNpZ25lZCwgdW5zaWduZWQpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworQWNjZXNzaWJpbGl0eVVJ
RWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojp1aUVsZW1lbnRGb3JTZWFyY2hQcmVkaWNh
dGUoQWNjZXNzaWJpbGl0eVVJRWxlbWVudCosIGJvb2wsIEpTU3RyaW5nUmVmLCBKU1N0cmluZ1Jl
ZikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitBY2Nlc3Np
YmlsaXR5VUlFbGVtZW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmNlbGxGb3JDb2x1bW5BbmRS
b3codW5zaWduZWQsIHVuc2lnbmVkKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0
dXJuIDA7Cit9CisKK0pTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnNlbGVjdGVk
VGV4dFJhbmdlKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQor
Cit2b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnNldFNlbGVjdGVkVGV4dFJhbmdlKHVuc2ln
bmVkLCB1bnNpZ25lZCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitib29sIEFjY2Vz
c2liaWxpdHlVSUVsZW1lbnQ6OmlzQXR0cmlidXRlU2V0dGFibGUoSlNTdHJpbmdSZWYpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBBY2Nlc3NpYmls
aXR5VUlFbGVtZW50Ojppc0F0dHJpYnV0ZVN1cHBvcnRlZChKU1N0cmluZ1JlZikKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCit2b2lkIEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OmluY3JlbWVudCgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9p
ZCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpkZWNyZW1lbnQoKQoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK3ZvaWQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6c2hvd01lbnUoKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK0FjY2Vzc2liaWxpdHlVSUVsZW1lbnQgQWNjZXNz
aWJpbGl0eVVJRWxlbWVudDo6ZGlzY2xvc2VkUm93QXRJbmRleCh1bnNpZ25lZCkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitBY2Nlc3NpYmlsaXR5VUlFbGVt
ZW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmFyaWFPd25zRWxlbWVudEF0SW5kZXgodW5zaWdu
ZWQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworQWNjZXNz
aWJpbGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphcmlhRmxvd1RvRWxlbWVu
dEF0SW5kZXgodW5zaWduZWQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4g
MDsKK30KKworQWNjZXNzaWJpbGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojpz
ZWxlY3RlZFJvd0F0SW5kZXgodW5zaWduZWQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAg
ICByZXR1cm4gMDsKK30KKworQWNjZXNzaWJpbGl0eVVJRWxlbWVudCBBY2Nlc3NpYmlsaXR5VUlF
bGVtZW50OjpkaXNjbG9zZWRCeVJvdygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBy
ZXR1cm4gMDsKK30KKworSlNTdHJpbmdSZWYgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YWNjZXNz
aWJpbGl0eVZhbHVlKCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVy
biAwOworfQorCitKU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojpkb2N1bWVudEVu
Y29kaW5nKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitK
U1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojpkb2N1bWVudFVSSSgpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKwordW5zaWduZWQgQWNjZXNzaWJp
bGl0eVVJRWxlbWVudDo6aW5kZXhPZkNoaWxkKEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQqKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK2RvdWJsZSBBY2Nlc3Np
YmlsaXR5VUlFbGVtZW50OjpudW1iZXJBdHRyaWJ1dGVWYWx1ZShKU1N0cmluZ1JlZikKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitib29sIEFjY2Vzc2liaWxp
dHlVSUVsZW1lbnQ6OmJvb2xBdHRyaWJ1dGVWYWx1ZShKU1N0cmluZ1JlZikKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitKU1N0cmluZ1JlZiBBY2Nlc3NpYmls
aXR5VUlFbGVtZW50OjpzdHJpbmdBdHRyaWJ1dGVWYWx1ZShKU1N0cmluZ1JlZikKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitkb3VibGUgQWNjZXNzaWJpbGl0
eVVJRWxlbWVudDo6aW50VmFsdWUoKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNDaGVja2Vk
KCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitK
U1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojp1cmwoKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKKworYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVt
ZW50OjphZGROb3RpZmljYXRpb25MaXN0ZW5lcihKU09iamVjdFJlZikKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitib29sIEFjY2Vzc2liaWxpdHlVSUVsZW1l
bnQ6OmlzU2VsZWN0YWJsZSgpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNNdWx0aVNl
bGVjdGFibGUoKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZh
bHNlOworfQorCitib29sIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmlzVmlzaWJsZSgpIGNvbnN0
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wg
QWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNPZmZTY3JlZW4oKSBjb25zdAoreworICAgIG5vdElt
cGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEFjY2Vzc2liaWxpdHlV
SUVsZW1lbnQ6OmlzQ29sbGFwc2VkKCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjpoYXNQ
b3B1cCgpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK3ZvaWQgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6dGFrZUZvY3VzKCkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnRha2VT
ZWxlY3Rpb24oKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgQWNjZXNzaWJp
bGl0eVVJRWxlbWVudDo6YWRkU2VsZWN0aW9uKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCit2b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnJlbW92ZVNlbGVjdGlvbigpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworaW50IEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OmNv
bHVtbkNvdW50KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQor
Cit2b2lkIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6OnJlbW92ZU5vdGlmaWNhdGlvbkxpc3RlbmVy
KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIEFjY2Vzc2liaWxpdHlVSUVs
ZW1lbnQ6OnByZXNzKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitpbnQgQWNjZXNz
aWJpbGl0eVVJRWxlbWVudDo6cm93Q291bnQoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK0pTU3RyaW5nUmVmIEFjY2Vzc2liaWxpdHlVSUVsZW1lbnQ6Omhl
bHBUZXh0KCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOwor
fQorCitKU1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50OjphdHRyaWJ1dGVkU3RyaW5n
Rm9yUmFuZ2UodW5zaWduZWQsIHVuc2lnbmVkKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6YXR0cmlidXRl
ZFN0cmluZ1JhbmdlSXNNaXNzcGVsbGVkKHVuc2lnbmVkLCB1bnNpZ25lZCkKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCitib29sIEFjY2Vzc2liaWxpdHlVSUVs
ZW1lbnQ6OmlzSWdub3JlZCgpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQWNjZXNzaWJpbGl0eVVJRWxlbWVudDo6aXNGb2N1c2Vk
KCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30K
KworYm9vbCBBY2Nlc3NpYmlsaXR5VUlFbGVtZW50Ojppc0ZvY3VzYWJsZSgpIGNvbnN0Cit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKZGlmZiAtLWdpdCBh
L1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvRXZlbnRTZW5kZXIuY3BwIGIvVG9vbHMv
RHVtcFJlbmRlclRyZWUvYmxhY2tiZXJyeS9FdmVudFNlbmRlci5jcHAKbmV3IGZpbGUgbW9kZSAx
MDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uMzI1
NmM0MjcxOTUxM2Y4OWMwMGVlNDhmYWYyNmI3ZTllNTY5Mjg4MgotLS0gL2Rldi9udWxsCisrKyBi
L1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvRXZlbnRTZW5kZXIuY3BwCkBAIC0wLDAg
KzEsNDEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBOb2tpYSBDb3Jwb3JhdGlv
biBhbmQvb3IgaXRzIHN1YnNpZGlhcnkoLWllcykKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3Jj
aCBNb2JpbGUgSW5jLiBodHRwOi8vd3d3LnRvcmNobW9iaWxlLmNvbS8KKyAqIENvcHlyaWdodCAo
QykgMjAwOSwgMjAxMCwgMjAxMiBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZC4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNh
biByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9m
IHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJl
CisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBC
b3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKKworI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlQmxhY2tC
ZXJyeS5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlU3VwcG9ydC5oIgorI2luY2x1ZGUgIklu
dFBvaW50LmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJXZWJQYWdl
LmgiCisKKyNpbmNsdWRlIDxCbGFja0JlcnJ5UGxhdGZvcm1LZXlib2FyZEV2ZW50Lmg+CisjaW5j
bHVkZSA8QmxhY2tCZXJyeVBsYXRmb3JtTW91c2VFdmVudC5oPgorI2luY2x1ZGUgPEJsYWNrQmVy
cnlQbGF0Zm9ybVRvdWNoRXZlbnQuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU09iamVj
dFJlZi5oPgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTU3RyaW5nUmVmLmg+CisjaW5jbHVk
ZSA8SmF2YVNjcmlwdENvcmUvSlNWYWx1ZVJlZi5oPgorI2luY2x1ZGUgPHd0Zi9WZWN0b3IuaD4K
KwordXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK3N0YXRpYyBJbnRQb2ludCBsYXN0TW91c2VQ
b3NpdGlvbjsKK3N0YXRpYyBWZWN0b3I8QmxhY2tCZXJyeTo6UGxhdGZvcm06OlRvdWNoUG9pbnQ+
IHRvdWNoZXM7CitzdGF0aWMgYm9vbCB0b3VjaEFjdGl2ZSA9IGZhbHNlOworCit2b2lkIHNlbmRU
b3VjaEV2ZW50KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUeXBlKTsKKworLy8g
Q2FsbGJhY2tzCisKK3N0YXRpYyBKU1ZhbHVlUmVmIGdldERyYWdNb2RlQ2FsbGJhY2soSlNDb250
ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIG9iamVjdCwgSlNTdHJpbmdSZWYgcHJvcGVydHlO
YW1lLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBib29s
IHNldERyYWdNb2RlQ2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIG9i
amVjdCwgSlNTdHJpbmdSZWYgcHJvcGVydHlOYW1lLCBKU1ZhbHVlUmVmIHZhbHVlLCBKU1ZhbHVl
UmVmKiBleGNlcHRpb24pCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gSlNW
YWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNl
V2hlZWxUb0NhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlv
biwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpT
VmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqICAgIGV4Y2VwdGlvbikKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0
KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgY29udGV4dENsaWNrQ2FsbGJhY2soSlNDb250ZXh0
UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0
LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNW
YWx1ZVJlZiogICAgZXhjZXB0aW9uKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0
dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJl
ZiBtb3VzZURvd25DYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVu
Y3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25z
dCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAg
QmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlKiBwYWdlID0gQmxhY2tCZXJyeTo6V2ViS2l0OjpE
dW1wUmVuZGVyVHJlZTo6Y3VycmVudEluc3RhbmNlKCktPnBhZ2UoKTsKKyAgICBwYWdlLT5tb3Vz
ZUV2ZW50KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpNb3VzZUV2ZW50KEJsYWNrQmVycnk6OlBsYXRm
b3JtOjpNb3VzZUV2ZW50OjpTY3JlZW5MZWZ0TW91c2VCdXR0b24sIDAsIGxhc3RNb3VzZVBvc2l0
aW9uLCBJbnRQb2ludDo6emVybygpLCAwLCAwKSk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5k
ZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBtb3VzZVVwQ2FsbGJhY2so
SlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0
aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVu
dHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIEJsYWNrQmVycnk6OldlYktpdDo6
V2ViUGFnZSogcGFnZSA9IEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6OmN1cnJl
bnRJbnN0YW5jZSgpLT5wYWdlKCk7CisgICAgcGFnZS0+bW91c2VFdmVudChCbGFja0JlcnJ5OjpQ
bGF0Zm9ybTo6TW91c2VFdmVudCgwLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TW91c2VFdmVudDo6
U2NyZWVuTGVmdE1vdXNlQnV0dG9uLCBsYXN0TW91c2VQb3NpdGlvbiwgSW50UG9pbnQ6Onplcm8o
KSwgMCwgMCkpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30K
Kworc3RhdGljIEpTVmFsdWVSZWYgbW91c2VNb3ZlVG9DYWxsYmFjayhKU0NvbnRleHRSZWYgY29u
dGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVf
dCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVm
KiBleGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAyKQorICAgICAgICByZXR1
cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBpbnQgeCA9IHN0YXRpY19j
YXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9u
KSk7CisgICAgQVNTRVJUKCFleGNlcHRpb24gfHwgISpleGNlcHRpb24pOworICAgIGludCB5ID0g
c3RhdGljX2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzFdLCBl
eGNlcHRpb24pKTsKKyAgICBBU1NFUlQoIWV4Y2VwdGlvbiB8fCAhKmV4Y2VwdGlvbik7CisKKyAg
ICBsYXN0TW91c2VQb3NpdGlvbiA9IEludFBvaW50KHgsIHkpOworICAgIEJsYWNrQmVycnk6Oldl
YktpdDo6V2ViUGFnZSogcGFnZSA9IEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6
OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCk7CisgICAgcGFnZS0+bW91c2VFdmVudChCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6TW91c2VFdmVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TW91c2VFdmVu
dDo6U2NyZWVuTGVmdE1vdXNlQnV0dG9uLCBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6TW91c2VFdmVu
dDo6U2NyZWVuTGVmdE1vdXNlQnV0dG9uLCBsYXN0TW91c2VQb3NpdGlvbiwgSW50UG9pbnQ6Onpl
cm8oKSwgMCwgMCkpOworCisKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4
dCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIGJlZ2luRHJhZ1dpdGhGaWxlc0NhbGxiYWNrKEpT
Q29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhp
c09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRz
W10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAg
IHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFs
dWVSZWYgbGVhcEZvcndhcmRDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RS
ZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50
LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQo
Y29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIGtleURvd25DYWxsYmFjayhKU0NvbnRl
eHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmpl
Y3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBK
U1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAxKQorICAg
ICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBKU1N0cmlu
Z1JlZiBjaGFyYWN0ZXIgPSBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIGFyZ3VtZW50c1sw
XSwgZXhjZXB0aW9uKTsKKyAgICBBU1NFUlQoISpleGNlcHRpb24pOworICAgIHNob3J0IGNoYXJD
b2RlID0gMDsKKyAgICBib29sIG5lZWRzU2hpZnRLZXlNb2RpZmllciA9IGZhbHNlOworICAgIGlm
IChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgImxlZnRBcnJvdyIpKQor
ICAgICAgICBjaGFyQ29kZSA9IEtFWUNPREVfTEVGVDsKKyAgICBlbHNlIGlmIChKU1N0cmluZ0lz
RXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgInJpZ2h0QXJyb3ciKSkKKyAgICAgICAgY2hh
ckNvZGUgPSBLRVlDT0RFX1JJR0hUOworICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRG
OENTdHJpbmcoY2hhcmFjdGVyLCAidXBBcnJvdyIpKQorICAgICAgICBjaGFyQ29kZSA9IEtFWUNP
REVfVVA7CisgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0
ZXIsICJkb3duQXJyb3ciKSkKKyAgICAgICAgY2hhckNvZGUgPSBLRVlDT0RFX0RPV047CisgICAg
ZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJwYWdlVXAi
KQorICAgICAgICAgICAgIHx8IEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVy
LCAicGFnZURvd24iKQorICAgICAgICAgICAgIHx8IEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJp
bmcoY2hhcmFjdGVyLCAiaG9tZSIpCisgICAgICAgICAgICAgfHwgSlNTdHJpbmdJc0VxdWFsVG9V
VEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJlbmQiKSkKKyAgICAgICAgIHJldHVybiBKU1ZhbHVlTWFr
ZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICBlbHNlIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhD
U3RyaW5nKGNoYXJhY3RlciwgImRlbGV0ZSIpKQorICAgICAgICBjaGFyQ29kZSA9IEtFWUNPREVf
QkFDS1NQQUNFOworICAgIGVsc2UgeworICAgICAgICBjaGFyQ29kZSA9IEpTU3RyaW5nR2V0Q2hh
cmFjdGVyc1B0cihjaGFyYWN0ZXIpWzBdOworICAgICAgICBpZiAoV1RGOjppc0FTQ0lJVXBwZXIo
Y2hhckNvZGUpKQorICAgICAgICAgICAgbmVlZHNTaGlmdEtleU1vZGlmaWVyID0gdHJ1ZTsKKyAg
ICB9CisgICAgSlNTdHJpbmdSZWxlYXNlKGNoYXJhY3Rlcik7CisKKyAgICBzdGF0aWMgY29uc3Qg
SlNTdHJpbmdSZWYgbGVuZ3RoUHJvcGVydHkgPSBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmlu
ZygibGVuZ3RoIik7CisgICAgYm9vbCBuZWVkc0FsdEtleU1vZGlmaWVyID0gZmFsc2U7CisgICAg
aWYgKGFyZ3VtZW50Q291bnQgPiAxKSB7CisgICAgICAgIGlmIChKU09iamVjdFJlZiBtb2RpZmll
cnNBcnJheSA9IEpTVmFsdWVUb09iamVjdChjb250ZXh0LCBhcmd1bWVudHNbMV0sIDApKSB7Cisg
ICAgICAgICAgICBpbnQgbW9kaWZpZXJzQ291bnQgPSBKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwg
SlNPYmplY3RHZXRQcm9wZXJ0eShjb250ZXh0LCBtb2RpZmllcnNBcnJheSwgbGVuZ3RoUHJvcGVy
dHksIDApLCAwKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9kaWZpZXJzQ291
bnQ7ICsraSkgeworICAgICAgICAgICAgICAgIEpTU3RyaW5nUmVmIHN0cmluZyA9IEpTVmFsdWVU
b1N0cmluZ0NvcHkoY29udGV4dCwgSlNPYmplY3RHZXRQcm9wZXJ0eUF0SW5kZXgoY29udGV4dCwg
bW9kaWZpZXJzQXJyYXksIGksIDApLCAwKTsKKyAgICAgICAgICAgICAgICBpZiAoSlNTdHJpbmdJ
c0VxdWFsVG9VVEY4Q1N0cmluZyhzdHJpbmcsICJzaGlmdEtleSIpKQorICAgICAgICAgICAgICAg
ICAgICBuZWVkc1NoaWZ0S2V5TW9kaWZpZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIGVsc2Ug
aWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoc3RyaW5nLCAiYWx0S2V5IikpCisgICAg
ICAgICAgICAgICAgICAgIG5lZWRzQWx0S2V5TW9kaWZpZXIgPSB0cnVlOworICAgICAgICAgICAg
ICAgIEpTU3RyaW5nUmVsZWFzZShzdHJpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgfQorCisgICAgQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJQYWdlKiBwYWdlID0gQmxhY2tCZXJy
eTo6V2ViS2l0OjpEdW1wUmVuZGVyVHJlZTo6Y3VycmVudEluc3RhbmNlKCktPnBhZ2UoKTsKKwor
ICAgIHVuc2lnbmVkIG1vZGlmaWVycyA9IDA7CisgICAgaWYgKG5lZWRzU2hpZnRLZXlNb2RpZmll
cikKKyAgICAgICAgbW9kaWZpZXJzIHw9IEtFWU1PRF9TSElGVDsKKyAgICBpZiAobmVlZHNBbHRL
ZXlNb2RpZmllcikKKyAgICAgICAgbW9kaWZpZXJzIHw9IEtFWU1PRF9BTFQ7CisKKyAgICBwYWdl
LT5rZXlFdmVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6S2V5Ym9hcmRFdmVudChjaGFyQ29kZSwg
QmxhY2tCZXJyeTo6UGxhdGZvcm06OktleWJvYXJkRXZlbnQ6OktleUNoYXIsIG1vZGlmaWVycykp
OworCisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0
aWMgSlNWYWx1ZVJlZiB0ZXh0Wm9vbUluQ2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpT
T2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1l
bnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0
aW9uKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5k
ZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiB0ZXh0Wm9vbU91dENhbGxi
YWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RS
ZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJn
dW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGlj
IEpTVmFsdWVSZWYgem9vbVBhZ2VJbkNhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09i
amVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50
Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlv
bikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVm
aW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgem9vbVBhZ2VPdXRDYWxsYmFj
ayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVm
IHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3Vt
ZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBK
U1ZhbHVlUmVmIGFkZFRvdWNoUG9pbnRDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNP
YmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVu
dENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRp
b24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAyKQorICAgICAgICByZXR1cm4gSlNWYWx1
ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBpbnQgeCA9IHN0YXRpY19jYXN0PGludD4o
SlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7CisgICAg
QVNTRVJUKCFleGNlcHRpb24gfHwgISpleGNlcHRpb24pOworICAgIGludCB5ID0gc3RhdGljX2Nh
c3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzFdLCBleGNlcHRpb24p
KTsKKyAgICBBU1NFUlQoIWV4Y2VwdGlvbiB8fCAhKmV4Y2VwdGlvbik7CisKKyAgICBCbGFja0Jl
cnJ5OjpQbGF0Zm9ybTo6VG91Y2hQb2ludCB0b3VjaDsKKyAgICB0b3VjaC5tX2lkID0gdG91Y2hl
cy5pc0VtcHR5KCkgPyAwIDogdG91Y2hlcy5sYXN0KCkubV9pZCArIDE7CisgICAgSW50UG9pbnQg
cG9zKHgsIHkpOworICAgIHRvdWNoLm1fcG9zID0gcG9zOworICAgIHRvdWNoLm1fc2NyZWVuUG9z
ID0gcG9zOworICAgIHRvdWNoLm1fc3RhdGUgPSBCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6VG91Y2hQ
b2ludDo6VG91Y2hQcmVzc2VkOworCisgICAgdG91Y2hlcy5hcHBlbmQodG91Y2gpOworCisgICAg
cmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1
ZVJlZiB1cGRhdGVUb3VjaFBvaW50Q2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2Jq
ZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRD
b3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9u
KQoreworICAgIGlmIChhcmd1bWVudENvdW50IDwgMykKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVN
YWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgaW50IGluZGV4ID0gc3RhdGljX2Nhc3Q8aW50
PihKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzBdLCBleGNlcHRpb24pKTsKKyAg
ICBBU1NFUlQoIWV4Y2VwdGlvbiB8fCAhKmV4Y2VwdGlvbik7CisgICAgaW50IHggPSBzdGF0aWNf
Y2FzdDxpbnQ+KEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4Y2VwdGlv
bikpOworICAgIEFTU0VSVCghZXhjZXB0aW9uIHx8ICEqZXhjZXB0aW9uKTsKKyAgICBpbnQgeSA9
IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1syXSwg
ZXhjZXB0aW9uKSk7CisgICAgQVNTRVJUKCFleGNlcHRpb24gfHwgISpleGNlcHRpb24pOworCisg
ICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSAoaW50KXRvdWNoZXMuc2l6ZSgpKQorICAgICAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBCbGFja0JlcnJ5
OjpQbGF0Zm9ybTo6VG91Y2hQb2ludCYgdG91Y2ggPSB0b3VjaGVzW2luZGV4XTsKKyAgICBJbnRQ
b2ludCBwb3MoeCwgeSk7CisgICAgdG91Y2gubV9wb3MgPSBwb3M7CisgICAgdG91Y2gubV9zY3Jl
ZW5Qb3MgPSBwb3M7CisgICAgdG91Y2gubV9zdGF0ZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpU
b3VjaFBvaW50OjpUb3VjaE1vdmVkOworCisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVk
KGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBzZXRUb3VjaE1vZGlmaWVyQ2FsbGJh
Y2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJl
ZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1
bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7
CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMg
SlNWYWx1ZVJlZiB0b3VjaFN0YXJ0Q2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2Jq
ZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRD
b3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9u
KQoreworICAgIGlmICghdG91Y2hBY3RpdmUpIHsKKyAgICAgICAgc2VuZFRvdWNoRXZlbnQoQmxh
Y2tCZXJyeTo6UGxhdGZvcm06OlRvdWNoRXZlbnQ6OlRvdWNoU3RhcnQpOworICAgICAgICB0b3Vj
aEFjdGl2ZSA9IHRydWU7CisgICAgfSBlbHNlCisgICAgICAgIHNlbmRUb3VjaEV2ZW50KEJsYWNr
QmVycnk6OlBsYXRmb3JtOjpUb3VjaEV2ZW50OjpUb3VjaE1vdmUpOworICAgIHJldHVybiBKU1Zh
bHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgdG91Y2hD
YW5jZWxDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24s
IEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1Zh
bHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9
CisKK3N0YXRpYyBKU1ZhbHVlUmVmIHRvdWNoTW92ZUNhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250
ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90
IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYq
IGV4Y2VwdGlvbikKK3sKKyAgICBzZW5kVG91Y2hFdmVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6
VG91Y2hFdmVudDo6VG91Y2hNb3ZlKTsKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQo
Y29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIHRvdWNoRW5kQ2FsbGJhY2soSlNDb250
ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2Jq
ZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwg
SlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCB0
b3VjaGVzLnNpemUoKTsgKytpKQorICAgICAgICBpZiAodG91Y2hlc1tpXS5tX3N0YXRlICE9IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFJlbGVhc2VkKSB7CisgICAgICAg
ICAgICBzZW5kVG91Y2hFdmVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6VG91Y2hFdmVudDo6VG91
Y2hNb3ZlKTsKKyAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0
KTsKKyAgICAgICAgfQorICAgIHNlbmRUb3VjaEV2ZW50KEJsYWNrQmVycnk6OlBsYXRmb3JtOjpU
b3VjaEV2ZW50OjpUb3VjaEVuZCk7CisgICAgdG91Y2hBY3RpdmUgPSBmYWxzZTsKKyAgICByZXR1
cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVm
IGNsZWFyVG91Y2hQb2ludHNDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RS
ZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50
LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7
CisgICAgdG91Y2hlcy5jbGVhcigpOworICAgIHRvdWNoQWN0aXZlID0gZmFsc2U7CisgICAgcmV0
dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJl
ZiBjYW5jZWxUb3VjaFBvaW50Q2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0
UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3Vu
dCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVk
KGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiByZWxlYXNlVG91Y2hQb2ludENhbGxi
YWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RS
ZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJn
dW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpZiAoYXJndW1lbnRDb3Vu
dCA8IDEpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKwor
ICAgIGludCBpbmRleCA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQs
IGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7CisgICAgQVNTRVJUKCFleGNlcHRpb24gfHwgISpl
eGNlcHRpb24pOworICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gKGludCl0b3VjaGVzLnNp
emUoKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisg
ICAgdG91Y2hlc1tpbmRleF0ubV9zdGF0ZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUb3VjaFBv
aW50OjpUb3VjaFJlbGVhc2VkOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250
ZXh0KTsKK30KKwordm9pZCBzZW5kVG91Y2hFdmVudChCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6VG91
Y2hFdmVudDo6VHlwZSB0eXBlKQoreworICAgIEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUb3VjaEV2
ZW50IGV2ZW50OworICAgIGV2ZW50Lm1fdHlwZSA9IHR5cGU7CisgICAgZXZlbnQubV9wb2ludHMu
YXNzaWduKHRvdWNoZXMuYmVnaW4oKSwgdG91Y2hlcy5lbmQoKSk7CisgICAgQmxhY2tCZXJyeTo6
V2ViS2l0OjpEdW1wUmVuZGVyVHJlZTo6Y3VycmVudEluc3RhbmNlKCktPnBhZ2UoKS0+dG91Y2hF
dmVudChldmVudCk7CisKKyAgICBWZWN0b3I8QmxhY2tCZXJyeTo6UGxhdGZvcm06OlRvdWNoUG9p
bnQ+IHQ7CisKKyAgICBmb3IgKFZlY3RvcjxCbGFja0JlcnJ5OjpQbGF0Zm9ybTo6VG91Y2hQb2lu
dD46Oml0ZXJhdG9yIGl0ID0gdG91Y2hlcy5iZWdpbigpOworICAgICAgICAgaXQgIT0gdG91Y2hl
cy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgICAgaWYgKGl0LT5tX3N0YXRlICE9IEJs
YWNrQmVycnk6OlBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3VjaFJlbGVhc2VkKSB7CisgICAgICAg
ICAgICBpdC0+bV9zdGF0ZSA9IEJsYWNrQmVycnk6OlBsYXRmb3JtOjpUb3VjaFBvaW50OjpUb3Vj
aFN0YXRpb25hcnk7CisgICAgICAgICAgICB0LmFwcGVuZCgqaXQpOworICAgICAgICB9CisgICAg
fQorICAgIHRvdWNoZXMgPSB0OworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBzY2FsZVBhZ2VCeUNh
bGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmpl
Y3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYg
YXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpZiAoYXJndW1lbnRD
b3VudCA8IDMpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsK
KworICAgIGZsb2F0IHNjYWxlRmFjdG9yID0gSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3Vt
ZW50c1swXSwgZXhjZXB0aW9uKTsKKyAgICBmbG9hdCB4ID0gSlNWYWx1ZVRvTnVtYmVyKGNvbnRl
eHQsIGFyZ3VtZW50c1sxXSwgZXhjZXB0aW9uKTsKKyAgICBmbG9hdCB5ID0gSlNWYWx1ZVRvTnVt
YmVyKGNvbnRleHQsIGFyZ3VtZW50c1syXSwgZXhjZXB0aW9uKTsKKworICAgIEJsYWNrQmVycnk6
OldlYktpdDo6V2ViUGFnZSogcGFnZSA9IEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRy
ZWU6OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCk7CisgICAgaWYgKCFwYWdlKQorICAgICAgICBy
ZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBEdW1wUmVuZGVyVHJl
ZVN1cHBvcnQ6OnNjYWxlUGFnZUJ5KHBhZ2UsIHNjYWxlRmFjdG9yLCB4LCB5KTsKKworICAgIHJl
dHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTU3RhdGlj
RnVuY3Rpb24gc3RhdGljRnVuY3Rpb25zW10gPSB7CisgICAgeyAibW91c2VXaGVlbFRvIiwgbW91
c2VXaGVlbFRvQ2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9w
ZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJjb250ZXh0Q2xpY2siLCBjb250ZXh0
Q2xpY2tDYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5
QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgIm1vdXNlRG93biIsIG1vdXNlRG93bkNhbGxi
YWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVE
b250RGVsZXRlIH0sCisgICAgeyAibW91c2VVcCIsIG1vdXNlVXBDYWxsYmFjaywga0pTUHJvcGVy
dHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAor
ICAgIHsgIm1vdXNlTW92ZVRvIiwgbW91c2VNb3ZlVG9DYWxsYmFjaywga0pTUHJvcGVydHlBdHRy
aWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsg
ImJlZ2luRHJhZ1dpdGhGaWxlcyIsIGJlZ2luRHJhZ1dpdGhGaWxlc0NhbGxiYWNrLCBrSlNQcm9w
ZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0s
CisgICAgeyAibGVhcEZvcndhcmQiLCBsZWFwRm9yd2FyZENhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0
dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAg
eyAia2V5RG93biIsIGtleURvd25DYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25s
eSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgInRleHRab29tSW4i
LCB0ZXh0Wm9vbUluQ2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQ
cm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJ0ZXh0Wm9vbU91dCIsIHRleHRa
b29tT3V0Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0
eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJhZGRUb3VjaFBvaW50IiwgYWRkVG91Y2hQ
b2ludENhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlB
dHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAiY2FuY2VsVG91Y2hQb2ludCIsIGNhbmNlbFRv
dWNoUG9pbnRDYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3Bl
cnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgImNsZWFyVG91Y2hQb2ludHMiLCBjbGVh
clRvdWNoUG9pbnRzQ2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQ
cm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJyZWxlYXNlVG91Y2hQb2ludCIs
IHJlbGVhc2VUb3VjaFBvaW50Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkg
fCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJzY2FsZVBhZ2VCeSIs
IHNjYWxlUGFnZUJ5Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQ
cm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJzZXRUb3VjaE1vZGlmaWVyIiwg
c2V0VG91Y2hNb2RpZmllckNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwg
a0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAidG91Y2hDYW5jZWwiLCB0
b3VjaENhbmNlbENhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJv
cGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAidG91Y2hFbmQiLCB0b3VjaEVuZENh
bGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1
dGVEb250RGVsZXRlIH0sCisgICAgeyAidG91Y2hNb3ZlIiwgdG91Y2hNb3ZlQ2FsbGJhY2ssIGtK
U1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxl
dGUgfSwKKyAgICB7ICJ0b3VjaFN0YXJ0IiwgdG91Y2hTdGFydENhbGxiYWNrLCBrSlNQcm9wZXJ0
eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisg
ICAgeyAidXBkYXRlVG91Y2hQb2ludCIsIHVwZGF0ZVRvdWNoUG9pbnRDYWxsYmFjaywga0pTUHJv
cGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9
LAorICAgIHsgInpvb21QYWdlSW4iLCB6b29tUGFnZUluQ2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0
cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7
ICJ6b29tUGFnZU91dCIsIHpvb21QYWdlT3V0Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRl
UmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7IDAsIDAs
IDAgfQorfTsKKworc3RhdGljIEpTU3RhdGljVmFsdWUgc3RhdGljVmFsdWVzW10gPSB7CisgICAg
eyAiZHJhZ01vZGUiLCBnZXREcmFnTW9kZUNhbGxiYWNrLCBzZXREcmFnTW9kZUNhbGxiYWNrLCBr
SlNQcm9wZXJ0eUF0dHJpYnV0ZU5vbmUgfSwKKyAgICB7IDAsIDAsIDAsIDAgfQorfTsKKworc3Rh
dGljIEpTQ2xhc3NSZWYgZ2V0Q2xhc3MoSlNDb250ZXh0UmVmIGNvbnRleHQpCit7CisgICAgc3Rh
dGljIEpTQ2xhc3NSZWYgZXZlbnRTZW5kZXJDbGFzcyA9IDA7CisKKyAgICBpZiAoIWV2ZW50U2Vu
ZGVyQ2xhc3MpIHsKKyAgICAgICAgSlNDbGFzc0RlZmluaXRpb24gY2xhc3NEZWZpbml0aW9uID0g
eworICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07CisgICAgICAgIGNsYXNzRGVmaW5pdGlvbi5z
dGF0aWNGdW5jdGlvbnMgPSBzdGF0aWNGdW5jdGlvbnM7CisgICAgICAgIGNsYXNzRGVmaW5pdGlv
bi5zdGF0aWNWYWx1ZXMgPSBzdGF0aWNWYWx1ZXM7CisKKyAgICAgICAgZXZlbnRTZW5kZXJDbGFz
cyA9IEpTQ2xhc3NDcmVhdGUoJmNsYXNzRGVmaW5pdGlvbik7CisgICAgfQorCisgICAgcmV0dXJu
IGV2ZW50U2VuZGVyQ2xhc3M7Cit9CisKK3ZvaWQgcmVwbGF5U2F2ZWRFdmVudHMoKQoreworICAg
IG5vdEltcGxlbWVudGVkKCk7Cit9CisKK0pTT2JqZWN0UmVmIG1ha2VFdmVudFNlbmRlcihKU0Nv
bnRleHRSZWYgY29udGV4dCkKK3sKKyAgICByZXR1cm4gSlNPYmplY3RNYWtlKGNvbnRleHQsIGdl
dENsYXNzKGNvbnRleHQpLCAwKTsKK30KKwpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRy
ZWUvYmxhY2tiZXJyeS9FdmVudFNlbmRlci5oIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvYmxhY2ti
ZXJyeS9FdmVudFNlbmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjY2ZjcxOTYyOTk2NGUxMTQxNjIzYWI4MzJm
YTAzMDhiMGVmYWViNDIKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9i
bGFja2JlcnJ5L0V2ZW50U2VuZGVyLmgKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDksIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj
YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBv
ZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1Ymxp
YyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2Vp
dmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBh
bG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2Fy
ZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwg
Qm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2lmbmRlZiBFdmVudFNlbmRlcl9o
CisjZGVmaW5lIEV2ZW50U2VuZGVyX2gKKwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVlSlND
b250ZXh0KiBKU0NvbnRleHRSZWY7Cit0eXBlZGVmIHN0cnVjdCBPcGFxdWVKU1ZhbHVlKiBKU09i
amVjdFJlZjsKKworSlNPYmplY3RSZWYgbWFrZUV2ZW50U2VuZGVyKEpTQ29udGV4dFJlZik7Cit2
b2lkIHJlcGxheVNhdmVkRXZlbnRzKCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVt
cFJlbmRlclRyZWUvYmxhY2tiZXJyeS9HQ0NvbnRyb2xsZXJCbGFja0JlcnJ5LmNwcCBiL1Rvb2xz
L0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvR0NDb250cm9sbGVyQmxhY2tCZXJyeS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uOGU4YmQ5NjViZDExOTNhNTgxYmFkMWM0NmE4ZmVjMjQwZDQzMDEyNwotLS0gL2Rl
di9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvR0NDb250cm9sbGVy
QmxhY2tCZXJyeS5jcHAKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDks
IDIwMTAsIDIwMTIgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBN
QSAgMDIxMTAtMTMwMSAgVVNBCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkR1bXBSZW5kZXJUcmVlL0dDQ29udHJvbGxlci5oIgorCisjaW5jbHVkZSAiRHVtcFJlbmRlclRy
ZWVTdXBwb3J0LmgiCisKK3ZvaWQgR0NDb250cm9sbGVyOjpjb2xsZWN0KCkgY29uc3QKK3sKKyAg
ICBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6OmdhcmJhZ2VDb2xsZWN0b3JDb2xsZWN0KCk7Cit9CisK
K3ZvaWQgR0NDb250cm9sbGVyOjpjb2xsZWN0T25BbHRlcm5hdGVUaHJlYWQoYm9vbCB3YWl0VW50
aWxEb25lKSBjb25zdAoreworICAgIER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6Z2FyYmFnZUNvbGxl
Y3RvckNvbGxlY3RPbkFsdGVybmF0ZVRocmVhZCh3YWl0VW50aWxEb25lKTsKK30KKworc2l6ZV90
IEdDQ29udHJvbGxlcjo6Z2V0SlNPYmplY3RDb3VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIER1
bXBSZW5kZXJUcmVlU3VwcG9ydDo6amF2YVNjcmlwdE9iamVjdHNDb3VudCgpOworfQorCmRpZmYg
LS1naXQgYS9Ub29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L1dvcmtRdWV1ZUl0ZW1CbGFj
a0JlcnJ5LmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvV29ya1F1ZXVlSXRl
bUJsYWNrQmVycnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRjODBiZmI5YjY4ZGMyMjIyNTA0MDkxNDAwNDI5
NzRjOTgzMWM4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9ibGFj
a2JlcnJ5L1dvcmtRdWV1ZUl0ZW1CbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDg5IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJXb3JrUXVldWVJdGVtLmgiCisKKyNpbmNsdWRlICJEdW1w
UmVuZGVyVHJlZUJsYWNrQmVycnkuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIktV
UkwuaCIKKyNpbmNsdWRlICJPd25BcnJheVB0ci5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKwor
dXNpbmcgbmFtZXNwYWNlIFdlYkNvcmU7CisKK2Jvb2wgTG9hZEl0ZW06Omludm9rZSgpIGNvbnN0
Cit7CisgICAgc2l6ZV90IHRhcmdldEFyclNpemUgPSBKU1N0cmluZ0dldE1heGltdW1VVEY4Q1N0
cmluZ1NpemUobV90YXJnZXQuZ2V0KCkpOworICAgIHNpemVfdCB1cmxBcnJTaXplID0gSlNTdHJp
bmdHZXRNYXhpbXVtVVRGOENTdHJpbmdTaXplKG1fdXJsLmdldCgpKTsKKyAgICBPd25BcnJheVB0
cjxjaGFyPiB0YXJnZXQgPSBhZG9wdEFycmF5UHRyKG5ldyBjaGFyW3RhcmdldEFyclNpemVdKTsK
KyAgICBPd25BcnJheVB0cjxjaGFyPiB1cmwgPSBhZG9wdEFycmF5UHRyKG5ldyBjaGFyW3VybEFy
clNpemVdKTsKKyAgICBzaXplX3QgdGFyZ2V0TGVuID0gSlNTdHJpbmdHZXRVVEY4Q1N0cmluZyht
X3RhcmdldC5nZXQoKSwgdGFyZ2V0LmdldCgpLCB0YXJnZXRBcnJTaXplKSAtIDE7CisgICAgSlNT
dHJpbmdHZXRVVEY4Q1N0cmluZyhtX3VybC5nZXQoKSwgdXJsLmdldCgpLCB1cmxBcnJTaXplKTsK
KworICAgIEZyYW1lKiBmcmFtZTsKKyAgICBpZiAodGFyZ2V0ICYmIHRhcmdldExlbikKKyAgICAg
ICAgZnJhbWUgPSBtYWluRnJhbWUtPnRyZWUoKS0+ZmluZCh0YXJnZXQuZ2V0KCkpOworICAgIGVs
c2UKKyAgICAgICAgZnJhbWUgPSBtYWluRnJhbWU7CisKKyAgICBpZiAoIWZyYW1lKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBLVVJMIGt1cmwgPSBLVVJMKEtVUkwoKSwgdXJsLmdldCgp
KTsKKyAgICBmcmFtZS0+bG9hZGVyKCktPmxvYWQoa3VybCwgZmFsc2UpOworICAgIHJldHVybiB0
cnVlOworfQorCitib29sIExvYWRIVE1MU3RyaW5nSXRlbTo6aW52b2tlKCkgY29uc3QKK3sKKyAg
ICBzaXplX3QgY29udGVudFNpemUgPSBKU1N0cmluZ0dldE1heGltdW1VVEY4Q1N0cmluZ1NpemUo
bV9jb250ZW50LmdldCgpKTsKKyAgICBzaXplX3QgYmFzZVVSTFNpemUgPSBKU1N0cmluZ0dldE1h
eGltdW1VVEY4Q1N0cmluZ1NpemUobV9iYXNlVVJMLmdldCgpKTsKKyAgICBzaXplX3QgdW5yZWFj
aGFibGVVUkxTaXplID0gSlNTdHJpbmdHZXRNYXhpbXVtVVRGOENTdHJpbmdTaXplKG1fdW5yZWFj
aGFibGVVUkwuZ2V0KCkpOworICAgIE93bkFycmF5UHRyPGNoYXI+IGNvbnRlbnQgPSBhZG9wdEFy
cmF5UHRyKG5ldyBjaGFyW2NvbnRlbnRTaXplXSk7CisgICAgT3duQXJyYXlQdHI8Y2hhcj4gYmFz
ZVVSTCA9IGFkb3B0QXJyYXlQdHIobmV3IGNoYXJbYmFzZVVSTFNpemVdKTsKKyAgICBPd25BcnJh
eVB0cjxjaGFyPiB1bnJlYWNoYWJsZVVSTCA9IGFkb3B0QXJyYXlQdHIobmV3IGNoYXJbdW5yZWFj
aGFibGVVUkxTaXplXSk7CisgICAgSlNTdHJpbmdHZXRVVEY4Q1N0cmluZyhtX2NvbnRlbnQuZ2V0
KCksIGNvbnRlbnQuZ2V0KCksIGNvbnRlbnRTaXplKTsKKyAgICBKU1N0cmluZ0dldFVURjhDU3Ry
aW5nKG1fYmFzZVVSTC5nZXQoKSwgYmFzZVVSTC5nZXQoKSwgYmFzZVVSTFNpemUpOworICAgIEpT
U3RyaW5nR2V0VVRGOENTdHJpbmcobV91bnJlYWNoYWJsZVVSTC5nZXQoKSwgdW5yZWFjaGFibGVV
UkwuZ2V0KCksIHVucmVhY2hhYmxlVVJMU2l6ZSk7CisgICAgQmxhY2tCZXJyeTo6V2ViS2l0OjpE
dW1wUmVuZGVyVHJlZTo6Y3VycmVudEluc3RhbmNlKCktPnBhZ2UoKS0+bG9hZFN0cmluZyhjb250
ZW50LmdldCgpLCBiYXNlVVJMLmdldCgpLCAidGV4dC9odG1sIiwgdW5yZWFjaGFibGVVUkxTaXpl
ID8gdW5yZWFjaGFibGVVUkwuZ2V0KCkgOiAwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9v
bCBSZWxvYWRJdGVtOjppbnZva2UoKSBjb25zdAoreworICAgIG1haW5GcmFtZS0+bG9hZGVyKCkt
PnJlbG9hZCh0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTY3JpcHRJdGVtOjpp
bnZva2UoKSBjb25zdAoreworICAgIEJsYWNrQmVycnk6OldlYktpdDo6SmF2YVNjcmlwdERhdGFU
eXBlIHR5cGU7CisgICAgQmxhY2tCZXJyeTo6V2ViS2l0OjpXZWJTdHJpbmcgcmVzdWx0OworICAg
IHNpemVfdCBzY3JpcHRBcnJTaXplID0gSlNTdHJpbmdHZXRNYXhpbXVtVVRGOENTdHJpbmdTaXpl
KG1fc2NyaXB0LmdldCgpKTsKKyAgICBPd25BcnJheVB0cjxjaGFyPiBzY3JpcHQgPSBhZG9wdEFy
cmF5UHRyKG5ldyBjaGFyW3NjcmlwdEFyclNpemVdKTsKKyAgICBKU1N0cmluZ0dldFVURjhDU3Ry
aW5nKG1fc2NyaXB0LmdldCgpLCBzY3JpcHQuZ2V0KCksIHNjcmlwdEFyclNpemUpOworICAgIEJs
YWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdl
KCktPmV4ZWN1dGVKYXZhU2NyaXB0KHNjcmlwdC5nZXQoKSwgdHlwZSwgcmVzdWx0KTsKKyAgICBy
ZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCYWNrRm9yd2FyZEl0ZW06Omludm9rZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6OmN1cnJlbnRJ
bnN0YW5jZSgpLT5wYWdlKCktPmdvQmFja09yRm9yd2FyZChtX2hvd0Zhcik7Cit9CisK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>126153</attachid>
            <date>2012-02-08 14:29:55 -0800</date>
            <delta_ts>2012-02-09 07:51:22 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-78042-20120208173224.patch</filename>
            <type>text/plain</type>
            <size>43210</size>
            <attacher name="Rob Buis">rwlbuis</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTA3MTI5CmRpZmYgLS1naXQgYS9Ub29scy9DaGFuZ2VMb2cg
Yi9Ub29scy9DaGFuZ2VMb2cKaW5kZXggM2I4NjIyNDQwNmZkNDIwNWQ4MmY3YzhhMmQ5MTdkNmI1
MTk1YTQwNS4uZjI4ZTZkMjg4ZjQ5NzMzOTk2ZTQxNjExMzk3YzJlZmYzMzcwYTJhMSAxMDA2NDQK
LS0tIGEvVG9vbHMvQ2hhbmdlTG9nCisrKyBiL1Rvb2xzL0NoYW5nZUxvZwpAQCAtMyw2ICszLDIx
IEBACiAgICAgICAgIFtCbGFja0JlcnJ5XSBVcHN0cmVhbSBEdW1wUmVuZGVyVHJlZUJsYWNrQmVy
cnkKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTc4MDQy
CiAKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgVXBzdHJl
YW0gZmluYWwgcGFydCBvZiBvdXIgRFJUIGltcGxlbWVudGF0aW9uLgorCisgICAgICAgICogRHVt
cFJlbmRlclRyZWUvYmxhY2tiZXJyeS9MYXlvdXRUZXN0Q29udHJvbGxlckJsYWNrQmVycnkuY3Bw
OiBBZGRlZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L1BOR0ltYWdlRW5j
b2Rlci5jcHA6IEFkZGVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvUE5H
SW1hZ2VFbmNvZGVyLmg6IEFkZGVkLgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2JsYWNrYmVy
cnkvUGl4ZWxEdW1wU3VwcG9ydEJsYWNrQmVycnkuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBEdW1w
UmVuZGVyVHJlZS9ibGFja2JlcnJ5L1BpeGVsRHVtcFN1cHBvcnRCbGFja0JlcnJ5Lmg6IEFkZGVk
LgorCisyMDEyLTAyLTA4ICBSb2IgQnVpcyAgPHJidWlzQHJpbS5jb20+CisKKyAgICAgICAgW0Js
YWNrQmVycnldIFVwc3RyZWFtIER1bXBSZW5kZXJUcmVlQmxhY2tCZXJyeQorICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzgwNDIKKwogICAgICAgICBSZXZp
ZXdlZCBieSBBbnRvbmlvIEdvbWVzLgogCiAgICAgICAgIFVwc3RyZWFtIG1vcmUgcGFydHMgb2Yg
b3VyIERSVCBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVl
L2JsYWNrYmVycnkvTGF5b3V0VGVzdENvbnRyb2xsZXJCbGFja0JlcnJ5LmNwcCBiL1Rvb2xzL0R1
bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvTGF5b3V0VGVzdENvbnRyb2xsZXJCbGFja0JlcnJ5LmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwLi5hMDk5MGRkZmQ3NDk2ZDJhODZmOWU4ZWQwNDRlZjI1ZmNlYmQwYjVmCi0t
LSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvYmxhY2tiZXJyeS9MYXlvdXRU
ZXN0Q29udHJvbGxlckJsYWNrQmVycnkuY3BwCkBAIC0wLDAgKzEsOTI3IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA5LCAyMDEwLCAyMDEyIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUg
dGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExp
Y2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUg
U29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25m
aWcuaCIKKyNpbmNsdWRlICJMYXlvdXRUZXN0Q29udHJvbGxlci5oIgorCisjaW5jbHVkZSAiQ1N0
cmluZy5oIgorI2luY2x1ZGUgIkRhdGFiYXNlVHJhY2tlci5oIgorI2luY2x1ZGUgIkRvY3VtZW50
LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRMb2FkZXIuaCIKKyNpbmNsdWRlICJEb2N1bWVudE1hcmtl
ci5oIgorI2luY2x1ZGUgIkR1bXBSZW5kZXJUcmVlLmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRy
ZWVCbGFja0JlcnJ5LmgiCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWVTdXBwb3J0LmgiCisjaW5j
bHVkZSAiRWRpdGluZ0JlaGF2aW9yVHlwZXMuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnRCbGFj
a0JlcnJ5LmgiCisjaW5jbHVkZSAiRWxlbWVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5j
bHVkZSAiSFRNTElucHV0RWxlbWVudC5oIgorI2luY2x1ZGUgIkpTRWxlbWVudC5oIgorI2luY2x1
ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2luY2x1ZGUgIk93bkFy
cmF5UHRyLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlJlbmRlclRyZWVBc1RleHQu
aCIKKyNpbmNsdWRlICJTVkdEb2N1bWVudEV4dGVuc2lvbnMuaCIKKyNpbmNsdWRlICJTVkdTTUlM
RWxlbWVudC5oIgorI2luY2x1ZGUgIlNjaGVtZVJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAiU2VjdXJp
dHlPcmlnaW4uaCIKKyNpbmNsdWRlICJTZWN1cml0eVBvbGljeS5oIgorI2luY2x1ZGUgIlNldHRp
bmdzLmgiCisjaW5jbHVkZSAiVW51c2VkUGFyYW0uaCIKKyNpbmNsdWRlICJXb3JrUXVldWUuaCIK
KyNpbmNsdWRlICJXb3JrUXVldWVJdGVtLmgiCisjaW5jbHVkZSAiV29ya2VyVGhyZWFkLmgiCisK
KyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9BUElDYXN0Lmg+CisjaW5jbHVkZSA8U2hhcmVkUG9p
bnRlci5oPgorI2luY2x1ZGUgPFdlYlBhZ2UuaD4KKyNpbmNsdWRlIDxXZWJTZXR0aW5ncy5oPgor
Cit1c2luZyBXZWJDb3JlOjp0b0VsZW1lbnQ7Cit1c2luZyBXZWJDb3JlOjp0b0pTOworCitMYXlv
dXRUZXN0Q29udHJvbGxlcjo6fkxheW91dFRlc3RDb250cm9sbGVyKCkKK3sKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkRGlzYWxsb3dlZFVSTChKU1N0cmluZ1JlZiB1cmwpCit7
CisgICAgVU5VU0VEX1BBUkFNKHVybCk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9p
ZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2xlYXJBbGxEYXRhYmFzZXMoKQoreworI2lmIEVOQUJM
RShEQVRBQkFTRSkKKyAgICBXZWJDb3JlOjpEYXRhYmFzZVRyYWNrZXI6OnRyYWNrZXIoKS5kZWxl
dGVBbGxEYXRhYmFzZXMoKTsKKyNlbmRpZgorfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpjbGVhckJhY2tGb3J3YXJkTGlzdCgpCit7CisgICAgQmxhY2tCZXJyeTo6V2ViS2l0OjpEdW1w
UmVuZGVyVHJlZTo6Y3VycmVudEluc3RhbmNlKCktPnBhZ2UoKS0+Y2xlYXJCYWNrRm9yd2FyZExp
c3QodHJ1ZSk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmNsZWFyUGVyc2lzdGVu
dFVzZXJTdHlsZVNoZWV0KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitKU1N0cmlu
Z1JlZiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y29weURlY29kZWRIb3N0TmFtZShKU1N0cmluZ1Jl
ZiBuYW1lKQoreworICAgIFVOVVNFRF9QQVJBTShuYW1lKTsKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiAwOworfQorCitKU1N0cmluZ1JlZiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6
Y29weUVuY29kZWRIb3N0TmFtZShKU1N0cmluZ1JlZiBuYW1lKQoreworICAgIFVOVVNFRF9QQVJB
TShuYW1lKTsKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpkaXNwYXRjaFBlbmRpbmdMb2FkUmVxdWVzdHMoKQorewor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmRp
c3BsYXkoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3N0YXRpYyBXVEY6OlN0cmlu
ZyBqc1N0cmluZ1JlZlRvV2ViQ29yZVN0cmluZyhKU1N0cmluZ1JlZiBzdHIpCit7CisgICAgc2l6
ZV90IHN0ckFyclNpemUgPSBKU1N0cmluZ0dldE1heGltdW1VVEY4Q1N0cmluZ1NpemUoc3RyKTsK
KyAgICBPd25BcnJheVB0cjxjaGFyPiBzdHJBcnIgPSBhZG9wdEFycmF5UHRyKG5ldyBjaGFyW3N0
ckFyclNpemVdKTsKKyAgICBKU1N0cmluZ0dldFVURjhDU3RyaW5nKHN0ciwgc3RyQXJyLmdldCgp
LCBzdHJBcnJTaXplKTsKKyAgICByZXR1cm4gV1RGOjpTdHJpbmc6OmZyb21VVEY4KHN0ckFyci5n
ZXQoKSk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmV4ZWNDb21tYW5kKEpTU3Ry
aW5nUmVmIG5hbWUsIEpTU3RyaW5nUmVmIHZhbHVlKQoreworICAgIGlmICghbWFpbkZyYW1lKQor
ICAgICAgICByZXR1cm47CisKKyAgICBXVEY6OlN0cmluZyBuYW1lU3RyID0ganNTdHJpbmdSZWZU
b1dlYkNvcmVTdHJpbmcobmFtZSk7CisgICAgV1RGOjpTdHJpbmcgdmFsdWVTdHIgPSBqc1N0cmlu
Z1JlZlRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CisKKyAgICBtYWluRnJhbWUtPmVkaXRvcigpLT5j
b21tYW5kKG5hbWVTdHIpLmV4ZWN1dGUodmFsdWVTdHIpOworfQorCitib29sIExheW91dFRlc3RD
b250cm9sbGVyOjppc0NvbW1hbmRFbmFibGVkKEpTU3RyaW5nUmVmIG5hbWUpCit7CisgICAgaWYg
KCFtYWluRnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFdURjo6U3RyaW5nIG5h
bWVTdHIgPSBqc1N0cmluZ1JlZlRvV2ViQ29yZVN0cmluZyhuYW1lKTsKKworICAgIHJldHVybiBt
YWluRnJhbWUtPmVkaXRvcigpLT5jb21tYW5kKG5hbWVTdHIpLmlzRW5hYmxlZCgpOworfQorCit2
b2lkIExheW91dFRlc3RDb250cm9sbGVyOjprZWVwV2ViSGlzdG9yeSgpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6bm90aWZ5RG9uZSgp
Cit7CisgICAgaWYgKG1fd2FpdFRvRHVtcCAmJiAoIXRvcExvYWRpbmdGcmFtZSB8fCBCbGFja0Jl
cnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpjdXJyZW50SW5zdGFuY2UoKS0+bG9hZEZpbmlz
aGVkKCkpICYmICFXb3JrUXVldWU6OnNoYXJlZCgpLT5jb3VudCgpKQorICAgICAgICBkdW1wKCk7
CisKKyAgICBtX3dhaXRUb0R1bXAgPSBmYWxzZTsKKyAgICB3YWl0Rm9yUG9saWN5ID0gZmFsc2U7
Cit9CisKK0pTU3RyaW5nUmVmIExheW91dFRlc3RDb250cm9sbGVyOjpwYXRoVG9Mb2NhbFJlc291
cmNlKEpTQ29udGV4dFJlZiwgSlNTdHJpbmdSZWYgdXJsKQoreworICAgIHJldHVybiBKU1N0cmlu
Z1JldGFpbih1cmwpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpxdWV1ZUxvYWQo
SlNTdHJpbmdSZWYgdXJsLCBKU1N0cmluZ1JlZiB0YXJnZXQpCit7CisgICAgc2l6ZV90IHVybEFy
clNpemUgPSBKU1N0cmluZ0dldE1heGltdW1VVEY4Q1N0cmluZ1NpemUodXJsKTsKKyAgICBPd25B
cnJheVB0cjxjaGFyPiB1cmxBcnIgPSBhZG9wdEFycmF5UHRyKG5ldyBjaGFyW3VybEFyclNpemVd
KTsKKyAgICBKU1N0cmluZ0dldFVURjhDU3RyaW5nKHVybCwgdXJsQXJyLmdldCgpLCB1cmxBcnJT
aXplKTsKKworICAgIFdlYkNvcmU6OktVUkwgYmFzZSA9IG1haW5GcmFtZS0+bG9hZGVyKCktPmRv
Y3VtZW50TG9hZGVyKCktPnJlc3BvbnNlKCkudXJsKCk7CisgICAgV2ViQ29yZTo6S1VSTCBhYnNv
bHV0ZShiYXNlLCB1cmxBcnIuZ2V0KCkpOworCisgICAgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+
IGFic29sdXRlVVJMKEFkb3B0LCBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZyhhYnNvbHV0
ZS5zdHJpbmcoKS51dGY4KCkuZGF0YSgpKSk7CisgICAgV29ya1F1ZXVlOjpzaGFyZWQoKS0+cXVl
dWUobmV3IExvYWRJdGVtKGFic29sdXRlVVJMLmdldCgpLCB0YXJnZXQpKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWNjZXB0c0VkaXRpbmcoYm9vbCBhY2NlcHRzRWRpdGlu
ZykKK3sKKyAgICBCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpjdXJyZW50SW5z
dGFuY2UoKS0+c2V0QWNjZXB0c0VkaXRpbmcoYWNjZXB0c0VkaXRpbmcpOworfQorCit2b2lkIExh
eW91dFRlc3RDb250cm9sbGVyOjpzZXRBcHBDYWNoZU1heGltdW1TaXplKHVuc2lnbmVkIGxvbmcg
bG9uZyBxdW90YSkKK3sKKyAgICBVTlVTRURfUEFSQU0ocXVvdGEpOworICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEF1dGhvckFuZFVzZXJT
dHlsZXNFbmFibGVkKGJvb2wgZW5hYmxlKQoreworICAgIG1haW5GcmFtZS0+cGFnZSgpLT5zZXR0
aW5ncygpLT5zZXRBdXRob3JBbmRVc2VyU3R5bGVzRW5hYmxlZChlbmFibGUpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpzZXRDYWNoZU1vZGVsKGludCkKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRDdXN0b21Qb2xp
Y3lEZWxlZ2F0ZShib29sIHNldERlbGVnYXRlLCBib29sIHBlcm1pc3NpdmUpCit7CisgICAgVU5V
U0VEX1BBUkFNKHNldERlbGVnYXRlKTsKKyAgICBVTlVTRURfUEFSQU0ocGVybWlzc2l2ZSk7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2xl
YXJBcHBsaWNhdGlvbkNhY2hlRm9yT3JpZ2luKE9wYXF1ZUpTU3RyaW5nKikKK3sKKyAgICAvLyBG
SVhNRTogSW1wbGVtZW50IHRvIHN1cHBvcnQgZGVsZXRpbmcgYWxsIGFwcGxpY2F0aW9uIGNhY2hl
cyBmb3IgYW4gb3JpZ2luLgorICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK2xvbmcgbG9uZyBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6bG9jYWxTdG9yYWdlRGlza1VzYWdlRm9yT3JpZ2luKEpTU3Ry
aW5nUmVmKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdG8gc3VwcG9ydCBnZXR0aW5nIGRp
c2sgdXNhZ2UgaW4gYnl0ZXMgZm9yIGFuIG9yaWdpbi4KKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
ICAgIHJldHVybiAwOworfQorCitKU1ZhbHVlUmVmIExheW91dFRlc3RDb250cm9sbGVyOjpvcmln
aW5zV2l0aEFwcGxpY2F0aW9uQ2FjaGUoSlNDb250ZXh0UmVmIGNvbnRleHQpCit7CisgICAgLy8g
RklYTUU6IEltcGxlbWVudCB0byBnZXQgb3JpZ2lucyB0aGF0IGNvbnRhaW4gYXBwbGljYXRpb24g
Y2FjaGVzLgorICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5k
ZWZpbmVkKGNvbnRleHQpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXREYXRh
YmFzZVF1b3RhKHVuc2lnbmVkIGxvbmcgbG9uZyBxdW90YSkKK3sKKyAgICBpZiAoIW1haW5GcmFt
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6RGF0YWJhc2VUcmFja2VyOjp0cmFj
a2VyKCkuc2V0UXVvdGEobWFpbkZyYW1lLT5kb2N1bWVudCgpLT5zZWN1cml0eU9yaWdpbigpLCBx
dW90YSk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldERvbWFpblJlbGF4YXRp
b25Gb3JiaWRkZW5Gb3JVUkxTY2hlbWUoYm9vbCBmb3JiaWRkZW4sIEpTU3RyaW5nUmVmIHNjaGVt
ZSkKK3sKKyAgICBXZWJDb3JlOjpTY2hlbWVSZWdpc3RyeTo6c2V0RG9tYWluUmVsYXhhdGlvbkZv
cmJpZGRlbkZvclVSTFNjaGVtZShmb3JiaWRkZW4sIGpzU3RyaW5nUmVmVG9XZWJDb3JlU3RyaW5n
KHNjaGVtZSkpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRJY29uRGF0YWJh
c2VFbmFibGVkKGJvb2wgaWNvbkRhdGFiYXNlRW5hYmxlZCkKK3sKKyAgICBVTlVTRURfUEFSQU0o
aWNvbkRhdGFiYXNlRW5hYmxlZCk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBM
YXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0SmF2YVNjcmlwdFByb2ZpbGluZ0VuYWJsZWQoYm9vbCBw
cm9maWxpbmdFbmFibGVkKQoreworICAgIFVOVVNFRF9QQVJBTShwcm9maWxpbmdFbmFibGVkKTsK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpz
ZXRNYWluRnJhbWVJc0ZpcnN0UmVzcG9uZGVyKGJvb2wgZmxhZykKK3sKKyAgICBVTlVTRURfUEFS
QU0oZmxhZyk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6c2V0UGVyc2lzdGVudFVzZXJTdHlsZVNoZWV0TG9jYXRpb24oSlNTdHJpbmdSZWYg
cGF0aCkKK3sKKyAgICBVTlVTRURfUEFSQU0ocGF0aCk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
K30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0UG9wdXBCbG9ja2luZ0VuYWJsZWQo
Ym9vbCBmbGFnKQoreworICAgIEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6OmN1
cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCktPnNldHRpbmdzKCktPnNldEphdmFTY3JpcHRPcGVuV2lu
ZG93c0F1dG9tYXRpY2FsbHkoIWZsYWcpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpzZXRQcml2YXRlQnJvd3NpbmdFbmFibGVkKGJvb2wgZmxhZykKK3sKKyAgICBVTlVTRURfUEFS
QU0oZmxhZyk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6c2V0WFNTQXVkaXRvckVuYWJsZWQoYm9vbCBmbGFnKQoreworICAgIEJsYWNrQmVy
cnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCktPnNl
dHRpbmdzKCktPnNldFhTU0F1ZGl0b3JFbmFibGVkKGZsYWcpOworfQorCit2b2lkIExheW91dFRl
c3RDb250cm9sbGVyOjpzZXRTZWxlY3RUcmFpbGluZ1doaXRlc3BhY2VFbmFibGVkKGJvb2wgZmxh
ZykKK3sKKyAgICBCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpjdXJyZW50SW5z
dGFuY2UoKS0+c2V0U2VsZWN0VHJhaWxpbmdXaGl0ZXNwYWNlRW5hYmxlZChmbGFnKTsKK30KKwor
dm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0U21hcnRJbnNlcnREZWxldGVFbmFibGVkKGJv
b2wgZmxhZykKK3sKKyAgICBVTlVTRURfUEFSQU0oZmxhZyk7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0VGFiS2V5Q3ljbGVzVGhyb3Vn
aEVsZW1lbnRzKGJvb2wgY3ljbGVzKQoreworICAgIGlmICghbWFpbkZyYW1lKQorICAgICAgICBy
ZXR1cm47CisKKyAgICBtYWluRnJhbWUtPnBhZ2UoKS0+c2V0VGFiS2V5Q3ljbGVzVGhyb3VnaEVs
ZW1lbnRzKGN5Y2xlcyk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFVzZURh
c2hib2FyZENvbXBhdGliaWxpdHlNb2RlKGJvb2wgZmxhZykKK3sKKyAgICBVTlVTRURfUEFSQU0o
ZmxhZyk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6c2V0VXNlclN0eWxlU2hlZXRFbmFibGVkKGJvb2wgZmxhZykKK3sKKyAgICBVTlVTRURf
UEFSQU0oZmxhZyk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6c2V0VXNlclN0eWxlU2hlZXRMb2NhdGlvbihKU1N0cmluZ1JlZiBwYXRoKQor
eworICAgIFdURjo6U3RyaW5nIHBhdGhTdHIgPSBqc1N0cmluZ1JlZlRvV2ViQ29yZVN0cmluZyhw
YXRoKTsKKyAgICBCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpjdXJyZW50SW5z
dGFuY2UoKS0+cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRVc2VyU3R5bGVTaGVldExvY2F0aW9uKHBh
dGhTdHIudXRmOCgpLmRhdGEoKSk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6Ondh
aXRGb3JQb2xpY3lEZWxlZ2F0ZSgpCit7CisgICAgc2V0V2FpdFRvRHVtcCh0cnVlKTsKKyAgICB3
YWl0Rm9yUG9saWN5ID0gdHJ1ZTsKK30KKworc2l6ZV90IExheW91dFRlc3RDb250cm9sbGVyOjp3
ZWJIaXN0b3J5SXRlbUNvdW50KCkKK3sKKyAgICBTaGFyZWRBcnJheTxCbGFja0JlcnJ5OjpXZWJL
aXQ6OldlYlBhZ2U6OkJhY2tGb3J3YXJkRW50cnk+IGJhY2tGb3J3YXJkTGlzdDsKKyAgICB1bnNp
Z25lZCBzaXplOworICAgIEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6OmN1cnJl
bnRJbnN0YW5jZSgpLT5wYWdlKCktPmdldEJhY2tGb3J3YXJkTGlzdChiYWNrRm9yd2FyZExpc3Qs
IHNpemUpOworICAgIHJldHVybiBzaXplOworfQorCitpbnQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OndpbmRvd0NvdW50KCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAwOwor
fQorCitib29sIExheW91dFRlc3RDb250cm9sbGVyOjplbGVtZW50RG9lc0F1dG9Db21wbGV0ZUZv
ckVsZW1lbnRXaXRoSWQoSlNTdHJpbmdSZWYgaWQpCit7CisgICAgVU5VU0VEX1BBUkFNKGlkKTsK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworSlNSZXRhaW5Q
dHI8SlNTdHJpbmdSZWY+IExheW91dFRlc3RDb250cm9sbGVyOjpwYWdlUHJvcGVydHkoY29uc3Qg
Y2hhciogcHJvcGVydHlOYW1lLCBpbnQgcGFnZU51bWJlcikgY29uc3QKK3sKKyAgICBVTlVTRURf
UEFSQU0ocHJvcGVydHlOYW1lKTsKKyAgICBVTlVTRURfUEFSQU0ocGFnZU51bWJlcik7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29u
dHJvbGxlcjo6c2V0V2FpdFRvRHVtcChib29sIHdhaXRUb0R1bXApCit7CisgICAgLy8gQ2hhbmdl
IGZyb20gMzBzIHRvIDM1cyBiZWNhdXNlIHNvbWUgdGVzdCBjYXNlcyBpbiBtdWx0aXBhcnQgbmVl
ZCAzMCBzZWNvbmRzLAorICAgIC8vIHJlZmVyIHRvIGh0dHAvdGVzdHMvbXVsdGlwYXJ0L3Jlc291
cmNlcy9tdWx0aXBhcnQtd2FpdC1iZWZvcmUtYm91bmRhcnkucGhwIHBsZWFzZS4KKyAgICBzdGF0
aWMgY29uc3QgZG91YmxlIGtXYWl0VG9EdW1wV2F0Y2hkb2dJbnRlcnZhbCA9IDM1LjA7CisgICAg
bV93YWl0VG9EdW1wID0gd2FpdFRvRHVtcDsKKyAgICBpZiAobV93YWl0VG9EdW1wKQorICAgICAg
ICBCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpjdXJyZW50SW5zdGFuY2UoKS0+
c2V0V2FpdFRvRHVtcFdhdGNoZG9nKGtXYWl0VG9EdW1wV2F0Y2hkb2dJbnRlcnZhbCk7Cit9CisK
K3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFdpbmRvd0lzS2V5KGJvb2wgd2luZG93SXNL
ZXkpCit7CisgICAgbV93aW5kb3dJc0tleSA9IHdpbmRvd0lzS2V5OworICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK2Jvb2wgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnBhdXNlQW5pbWF0aW9uQXRU
aW1lT25FbGVtZW50V2l0aElkKEpTU3RyaW5nUmVmIGFuaW1hdGlvbk5hbWUsIGRvdWJsZSB0aW1l
LCBKU1N0cmluZ1JlZiBlbGVtZW50SWQpCit7CisgICAgaWYgKCFtYWluRnJhbWUpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIGludCBuYW1lTGVuID0gSlNTdHJpbmdHZXRNYXhpbXVtVVRG
OENTdHJpbmdTaXplKGFuaW1hdGlvbk5hbWUpOworICAgIGludCBpZExlbiA9IEpTU3RyaW5nR2V0
TWF4aW11bVVURjhDU3RyaW5nU2l6ZShlbGVtZW50SWQpOworICAgIE93bkFycmF5UHRyPGNoYXI+
IG5hbWUgPSBhZG9wdEFycmF5UHRyKG5ldyBjaGFyW25hbWVMZW5dKTsKKyAgICBPd25BcnJheVB0
cjxjaGFyPiBlSWQgPSBhZG9wdEFycmF5UHRyKG5ldyBjaGFyW2lkTGVuXSk7CisKKyAgICBKU1N0
cmluZ0dldFVURjhDU3RyaW5nKGFuaW1hdGlvbk5hbWUsIG5hbWUuZ2V0KCksIG5hbWVMZW4pOwor
ICAgIEpTU3RyaW5nR2V0VVRGOENTdHJpbmcoZWxlbWVudElkLCBlSWQuZ2V0KCksIGlkTGVuKTsK
KworICAgIFdlYkNvcmU6OkFuaW1hdGlvbkNvbnRyb2xsZXIqIGFuaW1hdGlvbkNvbnRyb2xsZXIg
PSBtYWluRnJhbWUtPmFuaW1hdGlvbigpOworICAgIGlmICghYW5pbWF0aW9uQ29udHJvbGxlcikK
KyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgV2ViQ29yZTo6Tm9kZSogbm9kZSA9IG1haW5G
cmFtZS0+ZG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZUlkLmdldCgpKTsKKyAgICBpZiAoIW5v
ZGUgfHwgIW5vZGUtPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJl
dHVybiBhbmltYXRpb25Db250cm9sbGVyLT5wYXVzZUFuaW1hdGlvbkF0VGltZShub2RlLT5yZW5k
ZXJlcigpLCBuYW1lLmdldCgpLCB0aW1lKTsKK30KKworYm9vbCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6cGF1c2VUcmFuc2l0aW9uQXRUaW1lT25FbGVtZW50V2l0aElkKEpTU3RyaW5nUmVmIHByb3Bl
cnR5TmFtZSwgZG91YmxlIHRpbWUsIEpTU3RyaW5nUmVmIGVsZW1lbnRJZCkKK3sKKyAgICBpZiAo
IW1haW5GcmFtZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50IG5hbWVMZW4gPSBK
U1N0cmluZ0dldE1heGltdW1VVEY4Q1N0cmluZ1NpemUocHJvcGVydHlOYW1lKTsKKyAgICBpbnQg
aWRMZW4gPSBKU1N0cmluZ0dldE1heGltdW1VVEY4Q1N0cmluZ1NpemUoZWxlbWVudElkKTsKKyAg
ICBPd25BcnJheVB0cjxjaGFyPiBuYW1lID0gYWRvcHRBcnJheVB0cihuZXcgY2hhcltuYW1lTGVu
XSk7CisgICAgT3duQXJyYXlQdHI8Y2hhcj4gZUlkID0gYWRvcHRBcnJheVB0cihuZXcgY2hhcltp
ZExlbl0pOworCisgICAgSlNTdHJpbmdHZXRVVEY4Q1N0cmluZyhwcm9wZXJ0eU5hbWUsIG5hbWUu
Z2V0KCksIG5hbWVMZW4pOworICAgIEpTU3RyaW5nR2V0VVRGOENTdHJpbmcoZWxlbWVudElkLCBl
SWQuZ2V0KCksIGlkTGVuKTsKKworICAgIFdlYkNvcmU6OkFuaW1hdGlvbkNvbnRyb2xsZXIqIGFu
aW1hdGlvbkNvbnRyb2xsZXIgPSBtYWluRnJhbWUtPmFuaW1hdGlvbigpOworICAgIGlmICghYW5p
bWF0aW9uQ29udHJvbGxlcikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgV2ViQ29yZTo6
Tm9kZSogbm9kZSA9IG1haW5GcmFtZS0+ZG9jdW1lbnQoKS0+Z2V0RWxlbWVudEJ5SWQoZUlkLmdl
dCgpKTsKKyAgICBpZiAoIW5vZGUgfHwgIW5vZGUtPnJlbmRlcmVyKCkpCisgICAgICAgIHJldHVy
biBmYWxzZTsKKworICAgIHJldHVybiBhbmltYXRpb25Db250cm9sbGVyLT5wYXVzZVRyYW5zaXRp
b25BdFRpbWUobm9kZS0+cmVuZGVyZXIoKSwgbmFtZS5nZXQoKSwgdGltZSk7Cit9CisKK3Vuc2ln
bmVkIExheW91dFRlc3RDb250cm9sbGVyOjpudW1iZXJPZkFjdGl2ZUFuaW1hdGlvbnMoKSBjb25z
dAoreworICAgIGlmICghbWFpbkZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBX
ZWJDb3JlOjpBbmltYXRpb25Db250cm9sbGVyKiBhbmltYXRpb25Db250cm9sbGVyID0gbWFpbkZy
YW1lLT5hbmltYXRpb24oKTsKKyAgICBpZiAoIWFuaW1hdGlvbkNvbnRyb2xsZXIpCisgICAgICAg
IHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBhbmltYXRpb25Db250cm9sbGVyLT5udW1iZXJP
ZkFjdGl2ZUFuaW1hdGlvbnMobWFpbkZyYW1lLT5kb2N1bWVudCgpKTsKK30KKwordW5zaWduZWQg
aW50IExheW91dFRlc3RDb250cm9sbGVyOjp3b3JrZXJUaHJlYWRDb3VudCgpIGNvbnN0Cit7Cisj
aWYgRU5BQkxFX1dPUktFUlMKKyAgICByZXR1cm4gV2ViQ29yZTo6V29ya2VyVGhyZWFkOjp3b3Jr
ZXJUaHJlYWRDb3VudCgpOworI2Vsc2UKKyAgICByZXR1cm4gMDsKKyNlbmRpZgorfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpyZW1vdmVBbGxWaXNpdGVkTGlua3MoKQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmRpc2FibGVJ
bWFnZUxvYWRpbmcoKQoreworICAgIEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6
OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCktPnNldHRpbmdzKCktPnNldExvYWRzSW1hZ2VzQXV0
b21hdGljYWxseShmYWxzZSk7Cit9CisKK0pTUmV0YWluUHRyPEpTU3RyaW5nUmVmPiBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6Y291bnRlclZhbHVlRm9yRWxlbWVudEJ5SWQoSlNTdHJpbmdSZWYgaWQp
Cit7CisgICAgV1RGOjpTdHJpbmcgaWRTdHIgPSBqc1N0cmluZ1JlZlRvV2ViQ29yZVN0cmluZyhp
ZCk7CisgICAgV2ViQ29yZTo6RWxlbWVudCogY29yZUVsZW1lbnQgPSBtYWluRnJhbWUtPmRvY3Vt
ZW50KCktPmdldEVsZW1lbnRCeUlkKEF0b21pY1N0cmluZyhpZFN0cikpOworICAgIGlmICghY29y
ZUVsZW1lbnQpCisgICAgICAgIHJldHVybiAwOworCisgICAgQ1N0cmluZyBjb3VudGVyVmFsdWVT
dHIgPSBjb3VudGVyVmFsdWVGb3JFbGVtZW50KGNvcmVFbGVtZW50KS51dGY4KCk7CisgICAgaWYg
KGNvdW50ZXJWYWx1ZVN0ci5pc051bGwoKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBKU1Jl
dGFpblB0cjxKU1N0cmluZ1JlZj4gY291bnRlclZhbHVlKEFkb3B0LCBKU1N0cmluZ0NyZWF0ZVdp
dGhVVEY4Q1N0cmluZyhjb3VudGVyVmFsdWVTdHIuZGF0YSgpKSk7CisgICAgcmV0dXJuIGNvdW50
ZXJWYWx1ZTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6b3ZlcnJpZGVQcmVmZXJl
bmNlKEpTU3RyaW5nUmVmIGtleSwgSlNTdHJpbmdSZWYgdmFsdWUpCit7CisgICAgaWYgKCFtYWlu
RnJhbWUpCisgICAgICAgIHJldHVybjsKKworICAgIFdURjo6U3RyaW5nIGtleVN0ciA9IGpzU3Ry
aW5nUmVmVG9XZWJDb3JlU3RyaW5nKGtleSk7CisgICAgV1RGOjpTdHJpbmcgdmFsdWVTdHIgPSBq
c1N0cmluZ1JlZlRvV2ViQ29yZVN0cmluZyh2YWx1ZSk7CisKKyAgICBpZiAoa2V5U3RyID09ICJX
ZWJLaXRVc2VzUGFnZUNhY2hlUHJlZmVyZW5jZUtleSIpCisgICAgICAgIEJsYWNrQmVycnk6Oldl
YktpdDo6RHVtcFJlbmRlclRyZWU6OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCktPnNldHRpbmdz
KCktPnNldE1heGltdW1QYWdlc0luQ2FjaGUoMSk7CisgICAgZWxzZSBpZiAoa2V5U3RyID09ICJX
ZWJLaXRVc2VQcmVIVE1MNVBhcnNlclF1aXJrcyIpCisgICAgICAgIG1haW5GcmFtZS0+cGFnZSgp
LT5zZXR0aW5ncygpLT5zZXRVc2VQcmVIVE1MNVBhcnNlclF1aXJrcyh0cnVlKTsKKyAgICBlbHNl
IGlmIChrZXlTdHIgPT0gIldlYktpdFRhYlRvTGlua3NQcmVmZXJlbmNlS2V5IikKKyAgICAgICAg
RHVtcFJlbmRlclRyZWVTdXBwb3J0OjpzZXRMaW5rc0luY2x1ZGVkSW5Gb2N1c0NoYWluKHZhbHVl
U3RyID09ICJ0cnVlIiB8fCB2YWx1ZVN0ciA9PSAiMSIpOworICAgIGVsc2UgaWYgKGtleVN0ciA9
PSAiV2ViS2l0SHlwZXJsaW5rQXVkaXRpbmdFbmFibGVkIikKKyAgICAgICAgbWFpbkZyYW1lLT5w
YWdlKCktPnNldHRpbmdzKCktPnNldEh5cGVybGlua0F1ZGl0aW5nRW5hYmxlZCh2YWx1ZVN0ciA9
PSAidHJ1ZSIgfHwgdmFsdWVTdHIgPT0gIjEiKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6c2V0QWx3YXlzQWNjZXB0Q29va2llcyhib29sIGFsd2F5c0FjY2VwdENvb2tpZXMpCit7
CisgICAgVU5VU0VEX1BBUkFNKGFsd2F5c0FjY2VwdENvb2tpZXMpOworICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldE1vY2tHZW9sb2NhdGlv
blBvc2l0aW9uKGRvdWJsZSBsYXRpdHVkZSwgZG91YmxlIGxvbmdpdHVkZSwgZG91YmxlIGFjY3Vy
YWN5KQoreworICAgIER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6c2V0TW9ja0dlb2xvY2F0aW9uUG9z
aXRpb24oQmxhY2tCZXJyeTo6V2ViS2l0OjpEdW1wUmVuZGVyVHJlZTo6Y3VycmVudEluc3RhbmNl
KCktPnBhZ2UoKSwgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYWNjdXJhY3kpOworfQorCit2b2lkIExh
eW91dFRlc3RDb250cm9sbGVyOjpzZXRNb2NrR2VvbG9jYXRpb25FcnJvcihpbnQgY29kZSwgSlNT
dHJpbmdSZWYgbWVzc2FnZSkKK3sKKyAgICBXVEY6OlN0cmluZyBtZXNzYWdlU3RyID0ganNTdHJp
bmdSZWZUb1dlYkNvcmVTdHJpbmcobWVzc2FnZSk7CisgICAgRHVtcFJlbmRlclRyZWVTdXBwb3J0
OjpzZXRNb2NrR2VvbG9jYXRpb25FcnJvcihCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJU
cmVlOjpjdXJyZW50SW5zdGFuY2UoKS0+cGFnZSgpLCBjb2RlLCBtZXNzYWdlU3RyKTsKK30KKwor
dm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2hvd1dlYkluc3BlY3RvcigpCit7CisgICAgbm90
SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2xvc2VXZWJJ
bnNwZWN0b3IoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVz
dENvbnRyb2xsZXI6OmV2YWx1YXRlSW5XZWJJbnNwZWN0b3IobG9uZyBjYWxsSWQsIEpTU3RyaW5n
UmVmIHNjcmlwdCkKK3sKKyAgICBVTlVTRURfUEFSQU0oY2FsbElkKTsKKyAgICBVTlVTRURfUEFS
QU0oc2NyaXB0KTsKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIExheW91dFRlc3RD
b250cm9sbGVyOjpldmFsdWF0ZVNjcmlwdEluSXNvbGF0ZWRXb3JsZCh1bnNpZ25lZCB3b3JsZElE
LCBKU09iamVjdFJlZiBnbG9iYWxPYmplY3QsIEpTU3RyaW5nUmVmIHNjcmlwdCkKK3sKKyAgICBV
TlVTRURfUEFSQU0od29ybGRJRCk7CisgICAgVU5VU0VEX1BBUkFNKGdsb2JhbE9iamVjdCk7Cisg
ICAgVU5VU0VEX1BBUkFNKHNjcmlwdCk7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9p
ZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkVXNlclNjcmlwdChKU1N0cmluZ1JlZiBzb3VyY2Us
IGJvb2wgcnVuQXRTdGFydCwgYm9vbCBhbGxGcmFtZXMpCit7CisgICAgVU5VU0VEX1BBUkFNKHNv
dXJjZSk7CisgICAgVU5VU0VEX1BBUkFNKHJ1bkF0U3RhcnQpOworICAgIFVOVVNFRF9QQVJBTShh
bGxGcmFtZXMpOworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENv
bnRyb2xsZXI6OmFkZFVzZXJTdHlsZVNoZWV0KEpTU3RyaW5nUmVmLCBib29sKQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK0pTUmV0YWluUHRyPEpTU3RyaW5nUmVmPiBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6cGFnZVNpemVBbmRNYXJnaW5zSW5QaXhlbHMoaW50LCBpbnQsIGludCwgaW50
LCBpbnQsIGludCwgaW50KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0
dXJuIDA7Cit9CisKK2Jvb2wgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNhbXBsZVNWR0FuaW1hdGlv
bkZvckVsZW1lbnRBdFRpbWUoSlNTdHJpbmdSZWYgYW5pbWF0aW9uSWQsIGRvdWJsZSB0aW1lLCBK
U1N0cmluZ1JlZiBlbGVtZW50SWQpCit7CisjaWYgRU5BQkxFKFNWR19BTklNQVRJT04pCisgICAg
aWYgKCFtYWluRnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGludCBhTGVuID0g
SlNTdHJpbmdHZXRNYXhpbXVtVVRGOENTdHJpbmdTaXplKGFuaW1hdGlvbklkKTsKKyAgICBpbnQg
ZUxlbiA9IEpTU3RyaW5nR2V0TWF4aW11bVVURjhDU3RyaW5nU2l6ZShlbGVtZW50SWQpOworICAg
IE93bkFycmF5UHRyPGNoYXI+IGFJZCA9IGFkb3B0QXJyYXlQdHIobmV3IGNoYXJbYUxlbl0pOwor
ICAgIE93bkFycmF5UHRyPGNoYXI+IGVJZCA9IGFkb3B0QXJyYXlQdHIobmV3IGNoYXJbZUxlbl0p
OworCisgICAgSlNTdHJpbmdHZXRVVEY4Q1N0cmluZyhhbmltYXRpb25JZCwgYUlkLmdldCgpLCBh
TGVuKTsKKyAgICBKU1N0cmluZ0dldFVURjhDU3RyaW5nKGVsZW1lbnRJZCwgZUlkLmdldCgpLCBl
TGVuKTsKKworICAgIFdlYkNvcmU6OkRvY3VtZW50KiBkb2N1bWVudCA9IG1haW5GcmFtZS0+ZG9j
dW1lbnQoKTsKKyAgICBpZiAoIWRvY3VtZW50IHx8ICFkb2N1bWVudC0+c3ZnRXh0ZW5zaW9ucygp
KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBXZWJDb3JlOjpOb2RlKiBub2RlID0gbWFp
bkZyYW1lLT5kb2N1bWVudCgpLT5nZXRFbGVtZW50QnlJZChhSWQuZ2V0KCkpOworICAgIGlmICgh
bm9kZSB8fCAhV2ViQ29yZTo6U1ZHU01JTEVsZW1lbnQ6OmlzU01JTEVsZW1lbnQobm9kZSkpCisg
ICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBkb2N1bWVudC0+YWNjZXNzU1ZHRXh0
ZW5zaW9ucygpLT5zYW1wbGVBbmltYXRpb25BdFRpbWUoZUlkLmdldCgpLCBzdGF0aWNfY2FzdDxX
ZWJDb3JlOjpTVkdTTUlMRWxlbWVudCo+KG5vZGUpLCB0aW1lKTsKKyNlbHNlCisgICAgcmV0dXJu
IGZhbHNlOworI2VuZGlmCit9CisKK2ludCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cGFnZU51bWJl
ckZvckVsZW1lbnRCeUlkKEpTU3RyaW5nUmVmLCBmbG9hdCwgZmxvYXQpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6bnVtYmVyT2ZQYWdlcyhmbG9hdCwgZmxvYXQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
KyAgICByZXR1cm4gLTE7Cit9CisKK2Jvb2wgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmlzUGFnZUJv
eFZpc2libGUoaW50KSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJu
IGZhbHNlOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRTY3JvbGxiYXJQb2xp
Y3koSlNTdHJpbmdSZWYsIEpTU3RyaW5nUmVmKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9
CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFdlYlZpZXdFZGl0YWJsZShib29sKQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6
OmF1dGhlbnRpY2F0ZVNlc3Npb24oSlNTdHJpbmdSZWYgdXJsLCBKU1N0cmluZ1JlZiB1c2VybmFt
ZSwgSlNTdHJpbmdSZWYgcGFzc3dvcmQpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwor
Ym9vbCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2FsbFNob3VsZENsb3NlT25XZWJWaWV3KCkKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c2V0RnJhbWVGbGF0dGVuaW5nRW5hYmxlZChib29sIGVuYWJsZSkK
K3sKKyAgICBCbGFja0JlcnJ5OjpXZWJLaXQ6OkR1bXBSZW5kZXJUcmVlOjpjdXJyZW50SW5zdGFu
Y2UoKS0+cGFnZSgpLT5zZXR0aW5ncygpLT5zZXRGcmFtZUZsYXR0ZW5pbmdFbmFibGVkKGVuYWJs
ZSk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldFNwYXRpYWxOYXZpZ2F0aW9u
RW5hYmxlZChib29sIGVuYWJsZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjphZGRPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeShKU1N0
cmluZ1JlZiBzb3VyY2VPcmlnaW4sIEpTU3RyaW5nUmVmIGRlc3RpbmF0aW9uUHJvdG9jb2wsIEpT
U3RyaW5nUmVmIGRlc3RpbmF0aW9uSG9zdCwgYm9vbCBhbGxvd0Rlc3RpbmF0aW9uU3ViZG9tYWlu
cykKK3sKKyAgICBXZWJDb3JlOjpTZWN1cml0eVBvbGljeTo6YWRkT3JpZ2luQWNjZXNzV2hpdGVs
aXN0RW50cnkoKldlYkNvcmU6OlNlY3VyaXR5T3JpZ2luOjpjcmVhdGVGcm9tU3RyaW5nKGpzU3Ry
aW5nUmVmVG9XZWJDb3JlU3RyaW5nKHNvdXJjZU9yaWdpbikpLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc1N0cmluZ1JlZlRvV2ViQ29yZVN0cmlu
ZyhkZXN0aW5hdGlvblByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAganNTdHJpbmdSZWZUb1dlYkNvcmVTdHJpbmcoZGVzdGluYXRpb25I
b3N0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
YWxsb3dEZXN0aW5hdGlvblN1YmRvbWFpbnMpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9s
bGVyOjpyZW1vdmVPcmlnaW5BY2Nlc3NXaGl0ZWxpc3RFbnRyeShKU1N0cmluZ1JlZiBzb3VyY2VP
cmlnaW4sIEpTU3RyaW5nUmVmIGRlc3RpbmF0aW9uUHJvdG9jb2wsIEpTU3RyaW5nUmVmIGRlc3Rp
bmF0aW9uSG9zdCwgYm9vbCBhbGxvd0Rlc3RpbmF0aW9uU3ViZG9tYWlucykKK3sKKyAgICBXZWJD
b3JlOjpTZWN1cml0eVBvbGljeTo6cmVtb3ZlT3JpZ2luQWNjZXNzV2hpdGVsaXN0RW50cnkoKldl
YkNvcmU6OlNlY3VyaXR5T3JpZ2luOjpjcmVhdGVGcm9tU3RyaW5nKGpzU3RyaW5nUmVmVG9XZWJD
b3JlU3RyaW5nKHNvdXJjZU9yaWdpbikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICBqc1N0cmluZ1JlZlRvV2ViQ29yZVN0cmluZyhkZXN0aW5h
dGlvblByb3RvY29sKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAganNTdHJpbmdSZWZUb1dlYkNvcmVTdHJpbmcoZGVzdGluYXRpb25Ib3N0KSwK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxs
b3dEZXN0aW5hdGlvblN1YmRvbWFpbnMpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVy
OjpzZXRBbGxvd0ZpbGVBY2Nlc3NGcm9tRmlsZVVSTHMoYm9vbCBlbmFibGVkKQoreworICAgIGlm
ICghbWFpbkZyYW1lKQorICAgICAgICByZXR1cm47CisgICAgbWFpbkZyYW1lLT5wYWdlKCktPnNl
dHRpbmdzKCktPnNldEFsbG93RmlsZUFjY2Vzc0Zyb21GaWxlVVJMcyhlbmFibGVkKTsKK30KKwor
dm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0QWxsb3dVbml2ZXJzYWxBY2Nlc3NGcm9tRmls
ZVVSTHMoYm9vbCBlbmFibGVkKQoreworICAgIGlmICghbWFpbkZyYW1lKQorICAgICAgICByZXR1
cm47CisgICAgbWFpbkZyYW1lLT5wYWdlKCktPnNldHRpbmdzKCktPnNldEFsbG93VW5pdmVyc2Fs
QWNjZXNzRnJvbUZpbGVVUkxzKGVuYWJsZWQpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9s
bGVyOjphcGlUZXN0TmV3V2luZG93RGF0YUxvYWRCYXNlVVJMKEpTU3RyaW5nUmVmIHV0ZjhEYXRh
LCBKU1N0cmluZ1JlZiBiYXNlVVJMKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3Zv
aWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmFwaVRlc3RHb1RvQ3VycmVudEJhY2tGb3J3YXJkSXRl
bSgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJv
bGxlcjo6c2V0SmF2YVNjcmlwdENhbkFjY2Vzc0NsaXBib2FyZChib29sIGZsYWcpCit7CisgICAg
QmxhY2tCZXJyeTo6V2ViS2l0OjpEdW1wUmVuZGVyVHJlZTo6Y3VycmVudEluc3RhbmNlKCktPnBh
Z2UoKS0+c2V0SmF2YVNjcmlwdENhbkFjY2Vzc0NsaXBib2FyZChmbGFnKTsKK30KKworSlNWYWx1
ZVJlZiBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y29tcHV0ZWRTdHlsZUluY2x1ZGluZ1Zpc2l0ZWRJ
bmZvKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU1ZhbHVlUmVmIHZhbHVlKQoreworICAgIHJldHVy
biBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6OmNvbXB1dGVkU3R5bGVJbmNsdWRpbmdWaXNpdGVkSW5m
byhjb250ZXh0LCB2YWx1ZSk7Cit9CisKK0pTUmV0YWluUHRyPEpTU3RyaW5nUmVmPiBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6bGF5ZXJUcmVlQXNUZXh0KCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworICAgIHJldHVybiAwOworfQorCitKU1JldGFpblB0cjxKU1N0cmluZ1JlZj4gTGF5
b3V0VGVzdENvbnRyb2xsZXI6Om1hcmtlclRleHRGb3JMaXN0SXRlbShKU0NvbnRleHRSZWYgY29u
dGV4dCwgSlNWYWx1ZVJlZiBub2RlT2JqZWN0KSBjb25zdAoreworICAgIFdlYkNvcmU6OkVsZW1l
bnQqIGVsZW1lbnQgPSB0b0VsZW1lbnQodG9KUyh0b0pTKGNvbnRleHQpLCBub2RlT2JqZWN0KSk7
CisgICAgaWYgKCFlbGVtZW50KQorICAgICAgICByZXR1cm4gMDsKKworICAgIEpTUmV0YWluUHRy
PEpTU3RyaW5nUmVmPiBtYXJrZXJUZXh0KEFkb3B0LCBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0
cmluZyhXZWJDb3JlOjptYXJrZXJUZXh0Rm9yTGlzdEl0ZW0oZWxlbWVudCkudXRmOCgpLmRhdGEo
KSkpOworICAgIHJldHVybiBtYXJrZXJUZXh0OworfQorCit2b2lkIExheW91dFRlc3RDb250cm9s
bGVyOjpzZXRQbHVnaW5zRW5hYmxlZChib29sIGZsYWcpCit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0RWRpdGluZ0JlaGF2aW9yKGNv
bnN0IGNoYXIqIGVkaXRpbmdCZWhhdmlvcikKK3sKKyAgICBpZiAoIW1haW5GcmFtZSkKKyAgICAg
ICAgcmV0dXJuOworICAgIFdlYkNvcmU6OkVkaXRpbmdCZWhhdmlvclR5cGUgdHlwZSA9IFdlYkNv
cmU6OkVkaXRpbmdVbml4QmVoYXZpb3I7CisgICAgaWYgKCFzdHJjbXAoZWRpdGluZ0JlaGF2aW9y
LCAid2luIikpCisgICAgICAgIHR5cGUgPSBXZWJDb3JlOjpFZGl0aW5nV2luZG93c0JlaGF2aW9y
OworICAgIGVsc2UgaWYgKCFzdHJjbXAoZWRpdGluZ0JlaGF2aW9yLCAibWFjIikpCisgICAgICAg
IHR5cGUgPSBXZWJDb3JlOjpFZGl0aW5nTWFjQmVoYXZpb3I7CisgICAgZWxzZSBpZiAoIXN0cmNt
cChlZGl0aW5nQmVoYXZpb3IsICJ1bml4IikpCisgICAgICAgIHR5cGUgPSBXZWJDb3JlOjpFZGl0
aW5nVW5peEJlaGF2aW9yOworICAgIGVsc2UKKyAgICAgICAgQ1JBU0goKTsKKyAgICBtYWluRnJh
bWUtPnBhZ2UoKS0+c2V0dGluZ3MoKS0+c2V0RWRpdGluZ0JlaGF2aW9yVHlwZSh0eXBlKTsKK30K
Kwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWJvcnRNb2RhbCgpCit7CisgICAgbm90SW1w
bGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6Y2xlYXJBbGxBcHBs
aWNhdGlvbkNhY2hlcygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlv
dXRUZXN0Q29udHJvbGxlcjo6c2V0QXBwbGljYXRpb25DYWNoZU9yaWdpblF1b3RhKHVuc2lnbmVk
IGxvbmcgbG9uZyBxdW90YSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIExh
eW91dFRlc3RDb250cm9sbGVyOjpzZXRNb2NrRGV2aWNlT3JpZW50YXRpb24oYm9vbCBjYW5Qcm92
aWRlQWxwaGEsIGRvdWJsZSBhbHBoYSwgYm9vbCBjYW5Qcm92aWRlQmV0YSwgZG91YmxlIGJldGEs
IGJvb2wgY2FuUHJvdmlkZUdhbW1hLCBkb3VibGUgZ2FtbWEpCit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6YWRkTW9ja1NwZWVjaElucHV0
UmVzdWx0KEpTU3RyaW5nUmVmIHJlc3VsdCwgZG91YmxlIGNvbmZpZGVuY2UsIEpTU3RyaW5nUmVm
IGxhbmd1YWdlKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVz
dENvbnRyb2xsZXI6OnNldEdlb2xvY2F0aW9uUGVybWlzc2lvbihib29sIGFsbG93KQoreworICAg
IHNldEdlb2xvY2F0aW9uUGVybWlzc2lvbkNvbW1vbihhbGxvdyk7CisgICAgRHVtcFJlbmRlclRy
ZWVTdXBwb3J0OjpzZXRNb2NrR2VvbG9jYXRpb25QZXJtaXNzaW9uKEJsYWNrQmVycnk6OldlYktp
dDo6RHVtcFJlbmRlclRyZWU6OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCksIGFsbG93KTsKK30K
Kwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6c2V0Vmlld01vZGVNZWRpYUZlYXR1cmUoY29u
c3QgSlNTdHJpbmdSZWYgbW9kZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpzdXNwZW5kQW5pbWF0aW9ucygpIGNvbnN0Cit7CisgICAg
aWYgKG1haW5GcmFtZSAmJiBtYWluRnJhbWUtPmFuaW1hdGlvbigpKQorICAgICAgICBtYWluRnJh
bWUtPmFuaW1hdGlvbigpLT5zdXNwZW5kQW5pbWF0aW9ucygpOworfQorCit2b2lkIExheW91dFRl
c3RDb250cm9sbGVyOjpyZXN1bWVBbmltYXRpb25zKCkgY29uc3QKK3sKKyAgICBpZiAobWFpbkZy
YW1lICYmIG1haW5GcmFtZS0+YW5pbWF0aW9uKCkpCisgICAgICAgIG1haW5GcmFtZS0+YW5pbWF0
aW9uKCktPnJlc3VtZUFuaW1hdGlvbnMoKTsKK30KKworYm9vbCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6aGFzU3BlbGxpbmdNYXJrZXIoaW50IGZyb20sIGludCBsZW5ndGgpCit7CisgICAgaWYgKCFt
YWluRnJhbWUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiBtYWluRnJhbWUt
PmVkaXRvcigpLT5zZWxlY3Rpb25TdGFydEhhc01hcmtlckZvcihXZWJDb3JlOjpEb2N1bWVudE1h
cmtlcjo6U3BlbGxpbmcsIGZyb20sIGxlbmd0aCk7Cit9CisKK0pTVmFsdWVSZWYgTGF5b3V0VGVz
dENvbnRyb2xsZXI6Om5vZGVzRnJvbVJlY3QoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTVmFsdWVS
ZWYgdmFsdWUsIGludCB4LCBpbnQgeSwgdW5zaWduZWQgdG9wLCB1bnNpZ25lZCByaWdodCwgdW5z
aWduZWQgYm90dG9tLCB1bnNpZ25lZCBsZWZ0LCBib29sIGlnbm9yZUNsaXBwaW5nKQoreworICAg
IG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRl
eHQpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRTZXJpYWxpemVIVFRQTG9h
ZHMoYm9vbCkKK3sKKyAgICAvLyBGSVhNRTogSW1wbGVtZW50IGlmIG5lZWRlZCBmb3IgaHR0cHM6
Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUwNzU4LgorICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldE1pbmltdW1UaW1lcklu
dGVydmFsKGRvdWJsZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIExheW91
dFRlc3RDb250cm9sbGVyOjpzZXRUZXh0RGlyZWN0aW9uKEpTU3RyaW5nUmVmKQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmFsbG93Um91
bmRpbmdIYWNrcygpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRU
ZXN0Q29udHJvbGxlcjo6Z29CYWNrKCkKK3sKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50IHRvIGVu
YWJsZSBsb2FkZXIvbmF2aWdhdGlvbi13aGlsZS1kZWZlcnJpbmctbG9hZHMuaHRtbAorICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldERlZmVy
c0xvYWRpbmcoYm9vbCkKK3sKKyAgICAvLyBGSVhNRTogaW1wbGVtZW50IHRvIGVuYWJsZSBsb2Fk
ZXIvbmF2aWdhdGlvbi13aGlsZS1kZWZlcnJpbmctbG9hZHMuaHRtbAorICAgIG5vdEltcGxlbWVu
dGVkKCk7Cit9CisKK0pTVmFsdWVSZWYgTGF5b3V0VGVzdENvbnRyb2xsZXI6Om9yaWdpbnNXaXRo
TG9jYWxTdG9yYWdlKEpTQ29udGV4dFJlZiBjb250ZXh0KQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCit2b2lk
IExheW91dFRlc3RDb250cm9sbGVyOjpvYnNlcnZlU3RvcmFnZVRyYWNrZXJOb3RpZmljYXRpb25z
KHVuc2lnbmVkKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVz
dENvbnRyb2xsZXI6OnN5bmNMb2NhbFN0b3JhZ2UoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7
Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmRlbGV0ZUFsbExvY2FsU3RvcmFnZSgp
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxl
cjo6c2V0QXN5bmNocm9ub3VzU3BlbGxDaGVja2luZ0VuYWJsZWQoYm9vbCkKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpzZXRBdXRvZmls
bGVkKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU1ZhbHVlUmVmIG5vZGVPYmplY3QsIGJvb2wgYXV0
b2ZpbGxlZCkKK3sKKyAgICBKU0M6OkV4ZWNTdGF0ZSogZXhlYyA9IHRvSlMoY29udGV4dCk7Cisg
ICAgV2ViQ29yZTo6RWxlbWVudCogZWxlbWVudCA9IHRvRWxlbWVudCh0b0pTKGV4ZWMsIG5vZGVP
YmplY3QpKTsKKyAgICBpZiAoIWVsZW1lbnQpCisgICAgICAgIHJldHVybjsKKyAgICBXZWJDb3Jl
OjpIVE1MSW5wdXRFbGVtZW50KiBpbnB1dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVu
dCgpOworICAgIGlmICghaW5wdXRFbGVtZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBpbnB1
dEVsZW1lbnQtPnNldEF1dG9maWxsZWQoYXV0b2ZpbGxlZCk7Cit9CisKK2ludCBMYXlvdXRUZXN0
Q29udHJvbGxlcjo6bnVtYmVyT2ZQZW5kaW5nR2VvbG9jYXRpb25QZXJtaXNzaW9uUmVxdWVzdHMo
KQoreworICAgIHJldHVybiBEdW1wUmVuZGVyVHJlZVN1cHBvcnQ6Om51bWJlck9mUGVuZGluZ0dl
b2xvY2F0aW9uUGVybWlzc2lvblJlcXVlc3RzKEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRl
clRyZWU6OmN1cnJlbnRJbnN0YW5jZSgpLT5wYWdlKCkpOworfQorCitib29sIExheW91dFRlc3RD
b250cm9sbGVyOjpoYXNHcmFtbWFyTWFya2VyKGludCBmcm9tLCBpbnQgbGVuZ3RoKQoreworICAg
IGlmICghbWFpbkZyYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gbWFp
bkZyYW1lLT5lZGl0b3IoKS0+c2VsZWN0aW9uU3RhcnRIYXNNYXJrZXJGb3IoV2ViQ29yZTo6RG9j
dW1lbnRNYXJrZXI6OkdyYW1tYXIsIGZyb20sIGxlbmd0aCk7Cit9CisKK3ZvaWQgTGF5b3V0VGVz
dENvbnRyb2xsZXI6OmR1bXBDb25maWd1cmF0aW9uRm9yVmlld3BvcnQoaW50IGRldmljZURQSSwg
aW50IGRldmljZVdpZHRoLCBpbnQgZGV2aWNlSGVpZ2h0LCBpbnQgYXZhaWxhYmxlV2lkdGgsIGlu
dCBhdmFpbGFibGVIZWlnaHQpCit7CisgICAgaWYgKCFtYWluRnJhbWUpCisgICAgICAgIHJldHVy
bjsKKworICAgIER1bXBSZW5kZXJUcmVlU3VwcG9ydDo6ZHVtcENvbmZpZ3VyYXRpb25Gb3JWaWV3
cG9ydChtYWluRnJhbWUsIGRldmljZURQSSwgZGV2aWNlV2lkdGgsIGRldmljZUhlaWdodCwgYXZh
aWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCk7Cit9CisKK2Jvb2wgTGF5b3V0VGVzdENvbnRy
b2xsZXI6OmZpbmRTdHJpbmcoSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTU3RyaW5nUmVmIHRhcmdl
dCwgSlNPYmplY3RSZWYgb3B0aW9uc0FycmF5KQoreworICAgIFdlYkNvcmU6OkZpbmRPcHRpb25z
IG9wdGlvbnMgPSAwOworCisgICAgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IGxlbmd0aFByb3Bl
cnR5TmFtZShBZG9wdCwgSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcoImxlbmd0aCIpKTsK
KyAgICBKU1ZhbHVlUmVmIGxlbmd0aFZhbHVlID0gSlNPYmplY3RHZXRQcm9wZXJ0eShjb250ZXh0
LCBvcHRpb25zQXJyYXksIGxlbmd0aFByb3BlcnR5TmFtZS5nZXQoKSwgMCk7CisgICAgaWYgKCFK
U1ZhbHVlSXNOdW1iZXIoY29udGV4dCwgbGVuZ3RoVmFsdWUpKQorICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICBXVEY6OlN0cmluZyBuYW1lU3RyID0ganNTdHJpbmdSZWZUb1dlYkNvcmVTdHJp
bmcodGFyZ2V0KTsKKworICAgIHNpemVfdCBsZW5ndGggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KEpT
VmFsdWVUb051bWJlcihjb250ZXh0LCBsZW5ndGhWYWx1ZSwgMCkpOworICAgIGZvciAoc2l6ZV90
IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKKyAgICAgICAgSlNWYWx1ZVJlZiB2YWx1ZSA9IEpT
T2JqZWN0R2V0UHJvcGVydHlBdEluZGV4KGNvbnRleHQsIG9wdGlvbnNBcnJheSwgaSwgMCk7Cisg
ICAgICAgIGlmICghSlNWYWx1ZUlzU3RyaW5nKGNvbnRleHQsIHZhbHVlKSkKKyAgICAgICAgICAg
IGNvbnRpbnVlOworCisgICAgICAgIEpTUmV0YWluUHRyPEpTU3RyaW5nUmVmPiBvcHRpb25OYW1l
KEFkb3B0LCBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIHZhbHVlLCAwKSk7CisKKyAgICAg
ICAgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcob3B0aW9uTmFtZS5nZXQoKSwgIkNh
c2VJbnNlbnNpdGl2ZSIpKQorICAgICAgICAgICAgb3B0aW9ucyB8PSBXZWJDb3JlOjpDYXNlSW5z
ZW5zaXRpdmU7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmco
b3B0aW9uTmFtZS5nZXQoKSwgIkF0V29yZFN0YXJ0cyIpKQorICAgICAgICAgICAgb3B0aW9ucyB8
PSBXZWJDb3JlOjpBdFdvcmRTdGFydHM7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVh
bFRvVVRGOENTdHJpbmcob3B0aW9uTmFtZS5nZXQoKSwgIlRyZWF0TWVkaWFsQ2FwaXRhbEFzV29y
ZFN0YXJ0IikpCisgICAgICAgICAgICBvcHRpb25zIHw9IFdlYkNvcmU6OlRyZWF0TWVkaWFsQ2Fw
aXRhbEFzV29yZFN0YXJ0OworICAgICAgICBlbHNlIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhD
U3RyaW5nKG9wdGlvbk5hbWUuZ2V0KCksICJCYWNrd2FyZHMiKSkKKyAgICAgICAgICAgIG9wdGlv
bnMgfD0gV2ViQ29yZTo6QmFja3dhcmRzOworICAgICAgICBlbHNlIGlmIChKU1N0cmluZ0lzRXF1
YWxUb1VURjhDU3RyaW5nKG9wdGlvbk5hbWUuZ2V0KCksICJXcmFwQXJvdW5kIikpCisgICAgICAg
ICAgICBvcHRpb25zIHw9IFdlYkNvcmU6OldyYXBBcm91bmQ7CisgICAgICAgIGVsc2UgaWYgKEpT
U3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcob3B0aW9uTmFtZS5nZXQoKSwgIlN0YXJ0SW5TZWxl
Y3Rpb24iKSkKKyAgICAgICAgICAgIG9wdGlvbnMgfD0gV2ViQ29yZTo6U3RhcnRJblNlbGVjdGlv
bjsKKyAgICB9CisgICAgcmV0dXJuIEJsYWNrQmVycnk6OldlYktpdDo6RHVtcFJlbmRlclRyZWU6
OmN1cnJlbnRJbnN0YW5jZSgpLT5maW5kU3RyaW5nKG5hbWVTdHIsIG9wdGlvbnMpOworfQorCit2
b2lkIExheW91dFRlc3RDb250cm9sbGVyOjpkZWxldGVMb2NhbFN0b3JhZ2VGb3JPcmlnaW4oSlNT
dHJpbmdSZWYgVVJMKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQuCit9CisKK3ZvaWQgTGF5
b3V0VGVzdENvbnRyb2xsZXI6OnNldFZhbHVlRm9yVXNlcihKU0NvbnRleHRSZWYgY29udGV4dCwg
SlNWYWx1ZVJlZiBub2RlT2JqZWN0LCBKU1N0cmluZ1JlZiB2YWx1ZSkKK3sKKyAgICBKU0M6OkV4
ZWNTdGF0ZSogZXhlYyA9IHRvSlMoY29udGV4dCk7CisgICAgV2ViQ29yZTo6RWxlbWVudCogZWxl
bWVudCA9IHRvRWxlbWVudCh0b0pTKGV4ZWMsIG5vZGVPYmplY3QpKTsKKyAgICBpZiAoIWVsZW1l
bnQpCisgICAgICAgIHJldHVybjsKKyAgICBXZWJDb3JlOjpIVE1MSW5wdXRFbGVtZW50KiBpbnB1
dEVsZW1lbnQgPSBlbGVtZW50LT50b0lucHV0RWxlbWVudCgpOworICAgIGlmICghaW5wdXRFbGVt
ZW50KQorICAgICAgICByZXR1cm47CisKKyAgICBpbnB1dEVsZW1lbnQtPnNldFZhbHVlRm9yVXNl
cihqc1N0cmluZ1JlZlRvV2ViQ29yZVN0cmluZyh2YWx1ZSkpOworfQorCitsb25nIGxvbmcgTGF5
b3V0VGVzdENvbnRyb2xsZXI6OmFwcGxpY2F0aW9uQ2FjaGVEaXNrVXNhZ2VGb3JPcmlnaW4oSlNT
dHJpbmdSZWYgb3JpZ2luKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdG8gc3VwcG9ydCBn
ZXR0aW5nIGRpc2sgdXNhZ2UgYnkgYWxsIGFwcGxpY2F0aW9uIGNhY2hlcyBmb3IgYW4gb3JpZ2lu
LgorICAgIHJldHVybiAwOworfQorCit2b2lkIExheW91dFRlc3RDb250cm9sbGVyOjphZGRDaHJv
bWVJbnB1dEZpZWxkKCkKK3sKK30KKwordm9pZCBMYXlvdXRUZXN0Q29udHJvbGxlcjo6cmVtb3Zl
Q2hyb21lSW5wdXRGaWVsZCgpCit7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OmZv
Y3VzV2ViVmlldygpCit7Cit9CisKK3ZvaWQgTGF5b3V0VGVzdENvbnRyb2xsZXI6OnNldEJhY2tp
bmdTY2FsZUZhY3Rvcihkb3VibGUpCit7Cit9CisKZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5k
ZXJUcmVlL2JsYWNrYmVycnkvUE5HSW1hZ2VFbmNvZGVyLmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJU
cmVlL2JsYWNrYmVycnkvUE5HSW1hZ2VFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5mZGI0YTI5MzBj
NDExOWVkYzkzZTkzYmY3YjY4NjBlMTQyZTE2YjQ5Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMv
RHVtcFJlbmRlclRyZWUvYmxhY2tiZXJyeS9QTkdJbWFnZUVuY29kZXIuY3BwCkBAIC0wLDAgKzEs
MTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1p
dGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNv
ZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
dmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2
ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0
aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRo
b3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMK
KyAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhl
IEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICoKKyAqIFBvcnRpb25z
IG9mIHRoaXMgZmlsZSBhcmUgQ29weXJpZ2h0IDIwMDUgR29vZ2xlIEluYy4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUE5HSW1hZ2VFbmNvZGVyLmgiCisKKyNpbmNsdWRl
ICJTa0JpdG1hcC5oIgorI2luY2x1ZGUgIlNrVW5QcmVNdWx0aXBseS5oIgorCitleHRlcm4gIkMi
IHsKKyNpbmNsdWRlICJwbmcuaCIKK30KKworI2luY2x1ZGUgPE93bkFycmF5UHRyLmg+CisKKy8v
IFRoaXMgY29kZSBpcyBhbG1vc3QgYSBtaXJyb3Igb2YgdGhlIGNvZGUgaW4gV2ViQ29yZS9wbGF0
Zm9ybS9pbWFnZS1lbmNvZGVycy9za2lhL1BOR0ltYWdlRW5jb2Rlci5jcHAKKy8vIHNpbmNlIHdl
IGNhbid0IGluY2x1ZGUgdGhpcyBwcml2YXRlIFdlYkNvcmUgZmlsZSBpbiBhIFdlYktpdC1jbGll
bnQgYXBwbGljYXRpb24uCisKKy8vIENvbnZlcnRzIEJHUkEtPlJHQkEgYW5kIFJHQkEtPkJHUkEg
YW5kIHVuZG9lcyBhbHBoYSBwcmVtdWx0aXBsaWNhdGlvbi4KK3N0YXRpYyB2b2lkIHByZU11bHRp
cGxpZWRCR1JBdG9SR0JBKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGlucHV0LCBpbnQgbnVtYmVyT2ZQ
aXhlbHMsIHVuc2lnbmVkIGNoYXIqIG91dHB1dCkKK3sKKyAgICBTa0JpdG1hcCBpbnB1dEJpdG1h
cDsKKyAgICBpbnB1dEJpdG1hcC5zZXRDb25maWcoU2tCaXRtYXA6OmtBUkdCXzg4ODhfQ29uZmln
LCBudW1iZXJPZlBpeGVscywgMSk7CisgICAgaW5wdXRCaXRtYXAuc2V0UGl4ZWxzKGNvbnN0X2Nh
c3Q8dW5zaWduZWQgY2hhcio+KGlucHV0KSk7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCBudW1i
ZXJPZlBpeGVsczsgeCsrKSB7CisgICAgICAgIHVpbnQzMl90IHNyY1BpeGVsID0gKmlucHV0Qml0
bWFwLmdldEFkZHIzMih4LCAwKTsKKyAgICAgICAgU2tDb2xvciB1bm11bHRpcGxpZWQgPSBTa1Vu
UHJlTXVsdGlwbHk6OlBNQ29sb3JUb0NvbG9yKHNyY1BpeGVsKTsKKyAgICAgICAgdW5zaWduZWQg
Y2hhciogcGl4ZWxPdXQgPSAmb3V0cHV0W3ggKiA0XTsKKyAgICAgICAgcGl4ZWxPdXRbMF0gPSBT
a0NvbG9yR2V0Uih1bm11bHRpcGxpZWQpOworICAgICAgICBwaXhlbE91dFsxXSA9IFNrQ29sb3JH
ZXRHKHVubXVsdGlwbGllZCk7CisgICAgICAgIHBpeGVsT3V0WzJdID0gU2tDb2xvckdldEIodW5t
dWx0aXBsaWVkKTsKKyAgICAgICAgcGl4ZWxPdXRbM10gPSBTa0NvbG9yR2V0QSh1bm11bHRpcGxp
ZWQpOworICAgIH0KK30KKworLy8gUGFzc2VkIGFyb3VuZCBhcyB0aGUgaW9fcHRyIGluIHRoZSBw
bmcgc3RydWN0cyBzbyBvdXIgY2FsbGJhY2tzIGtub3cgd2hlcmUKKy8vIHRvIHdyaXRlIGRhdGEu
CitzdHJ1Y3QgUE5HRW5jb2RlclN0YXRlIHsKKyAgICBQTkdFbmNvZGVyU3RhdGUoVmVjdG9yPHVu
c2lnbmVkIGNoYXI+KiBvKSA6IG1fb3V0KG8pIHsgfQorICAgIFZlY3Rvcjx1bnNpZ25lZCBjaGFy
PiogbV9vdXQ7Cit9OworCisvLyBDYWxsZWQgYnkgbGlicG5nIHRvIGZsdXNoIGl0cyBpbnRlcm5h
bCBidWZmZXIgdG8gb3Vycy4KK3ZvaWQgZW5jb2RlcldyaXRlQ2FsbGJhY2socG5nX3N0cnVjdHAg
cG5nLCBwbmdfYnl0ZXAgZGF0YSwgcG5nX3NpemVfdCBzaXplKQoreworICAgIFBOR0VuY29kZXJT
dGF0ZSogc3RhdGUgPSBzdGF0aWNfY2FzdDxQTkdFbmNvZGVyU3RhdGUqPihwbmdfZ2V0X2lvX3B0
cihwbmcpKTsKKyAgICBBU1NFUlQoc3RhdGUtPm1fb3V0KTsKKworICAgIHNpemVfdCBvbGRTaXpl
ID0gc3RhdGUtPm1fb3V0LT5zaXplKCk7CisgICAgc3RhdGUtPm1fb3V0LT5yZXNpemUob2xkU2l6
ZSArIHNpemUpOworICAgIG1lbWNweSgmKCpzdGF0ZS0+bV9vdXQpW29sZFNpemVdLCBkYXRhLCBz
aXplKTsKK30KKworLy8gQXV0b21hdGljYWxseSBkZXN0cm95cyB0aGUgZ2l2ZW4gd3JpdGUgc3Ry
dWN0cyBvbiBkZXN0cnVjdGlvbiB0byBtYWtlCisvLyBjbGVhbnVwIGFuZCBlcnJvciBoYW5kbGlu
ZyBjb2RlIGNsZWFuZXIuCitjbGFzcyBQTkdXcml0ZVN0cnVjdERlc3Ryb3llciB7CitwdWJsaWM6
CisgICAgUE5HV3JpdGVTdHJ1Y3REZXN0cm95ZXIocG5nX3N0cnVjdCoqIHBzLCBwbmdfaW5mbyoq
IHBpKQorICAgICAgICA6IG1fcG5nU3RydWN0KHBzKQorICAgICAgICAsIG1fcG5nSW5mbyhwaSkK
KyAgICB7CisgICAgfQorCisgICAgflBOR1dyaXRlU3RydWN0RGVzdHJveWVyKCkKKyAgICB7Cisg
ICAgICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdChtX3BuZ1N0cnVjdCwgbV9wbmdJbmZvKTsK
KyAgICB9CisKK3ByaXZhdGU6CisgICAgcG5nX3N0cnVjdCoqIG1fcG5nU3RydWN0OworICAgIHBu
Z19pbmZvKiogbV9wbmdJbmZvOworfTsKKwordHlwZWRlZiB2b2lkICgqUGl4ZWxDb252ZXJzaW9u
RnVuYykoY29uc3QgdW5zaWduZWQgY2hhciosIGludCwgdW5zaWduZWQgY2hhciopOworc3RhdGlj
IGJvb2wgZW5jb2RlSW1wbChjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCwgaW50IGltYWdlV2lk
dGgsIGludCBpbWFnZUhlaWdodCwgaW50IGJ5dGVzUGVyUm93LCBWZWN0b3I8dW5zaWduZWQgY2hh
cj4qIG91dHB1dCwgUGl4ZWxDb252ZXJzaW9uRnVuYyBjb252ZXJzaW9uRnVuYykKK3sKKyAgICBp
bnQgaW5wdXRDb2xvckNvbXBvbmVudHMgPSA0OworICAgIGludCBvdXRwdXRDb2xvckNvbXBvbmVu
dHMgPSA0OworICAgIGludCBwbmdPdXRwdXRDb2xvclR5cGUgPSBQTkdfQ09MT1JfVFlQRV9SR0Jf
QUxQSEE7CisKKyAgICBpZiAoaW1hZ2VXaWR0aCA8IDApCisgICAgICAgIGltYWdlV2lkdGggPSAw
OworCisgICAgaWYgKGltYWdlSGVpZ2h0IDwgMCkKKyAgICAgICAgaW1hZ2VIZWlnaHQgPSAwOwor
CisgICAgLy8gUm93IHN0cmlkZSBzaG91bGQgYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgbGVu
Z3RoIG9mIHRoZSBkYXRhLgorICAgIGlmIChpbnB1dENvbG9yQ29tcG9uZW50cyAqIGltYWdlV2lk
dGggPiBieXRlc1BlclJvdykgeworICAgICAgICBBU1NFUlQoZmFsc2UpOworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorCisgICAgcG5nX3N0cnVjdCogcG5nUHRyID0gcG5nX2NyZWF0ZV93
cml0ZV9zdHJ1Y3QoUE5HX0xJQlBOR19WRVJfU1RSSU5HLCAwLCAwLCAwKTsKKyAgICBpZiAoIXBu
Z1B0cikKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcG5nX2luZm8qIGluZm9QdHIgPSBw
bmdfY3JlYXRlX2luZm9fc3RydWN0KHBuZ1B0cik7CisgICAgaWYgKCFpbmZvUHRyKSB7CisgICAg
ICAgIHBuZ19kZXN0cm95X3dyaXRlX3N0cnVjdCgmcG5nUHRyLCAwKTsKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgIH0KKyAgICBQTkdXcml0ZVN0cnVjdERlc3Ryb3llciBkZXN0cm95ZXIoJnBu
Z1B0ciwgJmluZm9QdHIpOworCisgICAgaWYgKHNldGptcChwbmdfam1wYnVmKHBuZ1B0cikpKSB7
CisgICAgICAgIC8vIFRoZSBkZXN0cm95ZXIgd2lsbCBlbnN1cmUgdGhhdCB0aGUgc3RydWN0dXJl
cyBhcmUgY2xlYW5lZCB1cCBpbiB0aGlzCisgICAgICAgIC8vIGNhc2UsIGV2ZW4gdGhvdWdoIHdl
IG1heSBnZXQgaGVyZSBhcyBhIGp1bXAgZnJvbSByYW5kb20gcGFydHMgb2YgdGhlCisgICAgICAg
IC8vIFBORyBsaWJyYXJ5IGNhbGxlZCBiZWxvdy4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
IH0KKworICAgIC8vIFNldCBvdXIgY2FsbGJhY2sgZm9yIGxpYnBuZyB0byBnaXZlIHVzIHRoZSBk
YXRhLgorICAgIFBOR0VuY29kZXJTdGF0ZSBzdGF0ZShvdXRwdXQpOworICAgIHBuZ19zZXRfd3Jp
dGVfZm4ocG5nUHRyLCAmc3RhdGUsIGVuY29kZXJXcml0ZUNhbGxiYWNrLCAwKTsKKworICAgIHBu
Z19zZXRfSUhEUihwbmdQdHIsIGluZm9QdHIsIGltYWdlV2lkdGgsIGltYWdlSGVpZ2h0LCA4LCBw
bmdPdXRwdXRDb2xvclR5cGUsCisgICAgICAgICAgICAgICAgIFBOR19JTlRFUkxBQ0VfTk9ORSwg
UE5HX0NPTVBSRVNTSU9OX1RZUEVfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgUE5HX0ZJTFRF
Ul9UWVBFX0RFRkFVTFQpOworICAgIHBuZ193cml0ZV9pbmZvKHBuZ1B0ciwgaW5mb1B0cik7CisK
KyAgICBPd25BcnJheVB0cjx1bnNpZ25lZCBjaGFyPiByb3dQaXhlbHMgPSBhZG9wdEFycmF5UHRy
KG5ldyB1bnNpZ25lZCBjaGFyW2ltYWdlV2lkdGggKiBvdXRwdXRDb2xvckNvbXBvbmVudHNdKTsK
KyAgICBmb3IgKGludCB5ID0gMDsgeSA8IGltYWdlSGVpZ2h0OyB5ICsrKSB7CisgICAgICAgIGNv
bnZlcnNpb25GdW5jKCZpbnB1dFt5ICogYnl0ZXNQZXJSb3ddLCBpbWFnZVdpZHRoLCByb3dQaXhl
bHMuZ2V0KCkpOworICAgICAgICBwbmdfd3JpdGVfcm93KHBuZ1B0ciwgcm93UGl4ZWxzLmdldCgp
KTsKKyAgICB9CisKKyAgICBwbmdfd3JpdGVfZW5kKHBuZ1B0ciwgaW5mb1B0cik7CisgICAgcmV0
dXJuIHRydWU7Cit9CisKK2Jvb2wgZW5jb2RlU2tCaXRtYXBUb1BORyhjb25zdCBTa0JpdG1hcCYg
aW1hZ2UsIFZlY3Rvcjx1bnNpZ25lZCBjaGFyPiogb3V0cHV0KQoreworICAgIGlmIChpbWFnZS5j
b25maWcoKSAhPSBTa0JpdG1hcDo6a0FSR0JfODg4OF9Db25maWcpCisgICAgICAgIHJldHVybiBm
YWxzZTsgLy8gT25seSBzdXBwb3J0IEFSR0IgYXQgOCBicHAgbm93LgorCisgICAgaW1hZ2UubG9j
a1BpeGVscygpOworICAgIGJvb2wgcmVzdWx0ID0gZW5jb2RlSW1wbChzdGF0aWNfY2FzdDx1bnNp
Z25lZCBjaGFyKj4oaW1hZ2UuZ2V0UGl4ZWxzKCkpLCBpbWFnZS53aWR0aCgpLCBpbWFnZS5oZWln
aHQoKSwgaW1hZ2Uucm93Qnl0ZXMoKSwgb3V0cHV0LCBwcmVNdWx0aXBsaWVkQkdSQXRvUkdCQSk7
CisgICAgaW1hZ2UudW5sb2NrUGl4ZWxzKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAt
LWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvUE5HSW1hZ2VFbmNvZGVyLmgg
Yi9Ub29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L1BOR0ltYWdlRW5jb2Rlci5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLjM0MDdiZGNlODVmYjhkYmI4ZTMwZTE3YzhiZjI4MTg1NzJiZGNhMzcKLS0tIC9kZXYv
bnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L1BOR0ltYWdlRW5jb2Rl
ci5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUmVzZWFyY2gg
SW4gTW90aW9uIExpbWl0ZWQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBsaWJy
YXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICog
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1Ymxp
YworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv
bjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVk
IGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBH
ZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90
LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisg
Ki8KKworI2lmbmRlZiBQTkdJbWFnZUVuY29kZXJfaAorI2RlZmluZSBQTkdJbWFnZUVuY29kZXJf
aAorCisjaW5jbHVkZSA8VmVjdG9yLmg+CisKK2NsYXNzIFNrQml0bWFwOworCitib29sIGVuY29k
ZVNrQml0bWFwVG9QTkcoY29uc3QgU2tCaXRtYXAmLCBXVEY6OlZlY3Rvcjx1bnNpZ25lZCBjaGFy
Piogb3V0cHV0KTsKKworI2VuZGlmIC8vIFBOR0ltYWdlRW5jb2Rlcl9oCmRpZmYgLS1naXQgYS9U
b29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2JlcnJ5L1BpeGVsRHVtcFN1cHBvcnRCbGFja0JlcnJ5
LmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2JsYWNrYmVycnkvUGl4ZWxEdW1wU3VwcG9ydEJs
YWNrQmVycnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjMwMmVlNTMzMTQ5MGUxMDU3NDljNjM5NjMxZGNlYjlh
MTBmNzI1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9ibGFja2Jl
cnJ5L1BpeGVsRHVtcFN1cHBvcnRCbGFja0JlcnJ5LmNwcApAQCAtMCwwICsxLDkzIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDExIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVk
IGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwg
YmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMZXNzZXIgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNl
aXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2Ug
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdh
cmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
IEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIK
KyNpbmNsdWRlICJQaXhlbER1bXBTdXBwb3J0QmxhY2tCZXJyeS5oIgorCisjaW5jbHVkZSAiRHVt
cFJlbmRlclRyZWVCbGFja0JlcnJ5LmgiCisjaW5jbHVkZSAiUE5HSW1hZ2VFbmNvZGVyLmgiCisj
aW5jbHVkZSAiUGl4ZWxEdW1wU3VwcG9ydC5oIgorI2luY2x1ZGUgIldlYlBhZ2UuaCIKKyNpbmNs
dWRlICJXZWJQYWdlQ2xpZW50LmgiCisjaW5jbHVkZSA8TUQ1Lmg+CisjaW5jbHVkZSA8VmVjdG9y
Lmg+CisjaW5jbHVkZSA8c2tpYS9Ta0RldmljZS5oPgorCit1c2luZyBuYW1lc3BhY2UgQmxhY2tC
ZXJyeTo6V2ViS2l0OwordXNpbmcgbmFtZXNwYWNlIEJsYWNrQmVycnk7Cit1c2luZyBuYW1lc3Bh
Y2UgV1RGOworCitQYXNzUmVmUHRyPEJpdG1hcENvbnRleHQ+IGNyZWF0ZUJpdG1hcENvbnRleHRG
cm9tV2ViVmlldyhib29sIC8qb25zY3JlZW4qLywgYm9vbCAvKmluY3JlbWVudGFsUmVwYWludCov
LCBib29sIC8qc3dlZXBIb3Jpem9udGFsbHkqLywgYm9vbCAvKmRyYXdTZWxlY3Rpb25SZWN0Ki8p
Cit7CisgICAgUGxhdGZvcm06OkdyYXBoaWNzOjpXaW5kb3cqIHdpbmRvdyA9IER1bXBSZW5kZXJU
cmVlOjpjdXJyZW50SW5zdGFuY2UoKS0+cGFnZSgpLT5jbGllbnQoKS0+d2luZG93KCk7CisgICAg
QVNTRVJUKHdpbmRvdyk7CisKKyAgICBjb25zdCBQbGF0Zm9ybTo6SW50UmVjdCYgd2luZG93UmVj
dCA9IHdpbmRvdy0+dmlld3BvcnRSZWN0KCk7CisKKyAgICBTa0JpdG1hcCogYml0bWFwID0gbmV3
IFNrQml0bWFwOworICAgIGJpdG1hcC0+c2V0Q29uZmlnKFNrQml0bWFwOjprQVJHQl84ODg4X0Nv
bmZpZywgd2luZG93UmVjdC53aWR0aCgpLCB3aW5kb3dSZWN0LmhlaWdodCgpKTsgLy8gV2UgdXNl
IDMyLWJpdCBSR0JBIHNpbmNlIHRoYXQgaXMgdGhlIHBpeGVsIGZvcm1hdCB0aGF0IEltYWdlRGlm
ZiBleHBlY3RzLgorICAgIGJpdG1hcC0+YWxsb2NQaXhlbHMoKTsKKworICAgIFNrQ2FudmFzKiBj
YW52YXMgPSBuZXcgU2tDYW52YXM7CisgICAgY2FudmFzLT5zZXRCaXRtYXBEZXZpY2UoKmJpdG1h
cCk7CisKKyAgICAvLyBXZSBuZWVkIHRvIGZvcmNlIGEgc3luY2hyb25vdXMgdXBkYXRlIHRvIHRo
ZSB3aW5kb3cgb3Igd2UgbWF5IGdldCBhbiBlbXB0eSBiaXRtYXAuCisgICAgLy8gRm9yIGV4YW1w
bGUsIHJ1bm5pbmcgRFJUIHdpdGggb25lIHRlc3QgY2FzZSB0aGF0IGZpbmlzaGVzIGJlZm9yZSB0
aGUgc2NyZWVuIGlzIHVwZGF0ZWQuCisgICAgd2luZG93LT5wb3N0KHdpbmRvd1JlY3QpOworCisg
ICAgY29uc3QgU2tCaXRtYXAqIHdpbmRvd0JpdG1hcCA9IHN0YXRpY19jYXN0PGNvbnN0IFNrQml0
bWFwKj4obG9ja0J1ZmZlckJhY2tpbmdJbWFnZSh3aW5kb3ctPmJ1ZmZlcigpLCBQbGF0Zm9ybTo6
R3JhcGhpY3M6OlJlYWRBY2Nlc3MpKTsKKyAgICBjYW52YXMtPmRyYXdCaXRtYXAoKndpbmRvd0Jp
dG1hcCwgMCwgMCk7IC8vIERyYXcgdGhlIGJpdG1hcCBhdCAoMCwgMCkuCisgICAgUGxhdGZvcm06
OkdyYXBoaWNzOjpyZWxlYXNlQnVmZmVyQmFja2luZ0ltYWdlKHdpbmRvdy0+YnVmZmVyKCkpOwor
ICAgIHJldHVybiBCaXRtYXBDb250ZXh0OjpjcmVhdGVCeUFkb3B0aW5nQml0bWFwQW5kQ29udGV4
dChiaXRtYXAsIGNhbnZhcyk7Cit9CisKK3ZvaWQgY29tcHV0ZU1ENUhhc2hTdHJpbmdGb3JCaXRt
YXBDb250ZXh0KEJpdG1hcENvbnRleHQqIGNvbnRleHQsIGNoYXIgaGFzaFN0cmluZ1szM10pCit7
CisgICAgY29uc3QgU2tCaXRtYXAmIGJpdG1hcCA9IGNvbnRleHQtPmNhbnZhcygpLT5nZXREZXZp
Y2UoKS0+YWNjZXNzQml0bWFwKGZhbHNlKTsKKyAgICBBU1NFUlQoYml0bWFwLmJ5dGVzUGVyUGl4
ZWwoKSA9PSA0KTsgLy8gMzItYml0IFJHQkEKKworICAgIGludCBwaXhlbHNXaWRlID0gYml0bWFw
LndpZHRoKCk7CisgICAgaW50IHBpeGVsc0hpZ2ggPSBiaXRtYXAuaGVpZ2h0KCk7CisgICAgaW50
IGJ5dGVzUGVyUm93ID0gYml0bWFwLnJvd0J5dGVzKCk7CisgICAgdW5zaWduZWQgY2hhciogcGl4
ZWxEYXRhID0gKHVuc2lnbmVkIGNoYXIqKWJpdG1hcC5nZXRQaXhlbHMoKTsKKworICAgIE1ENSBt
ZDU7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaXhlbHNIaWdoOyArK2kpIHsKKyAgICAgICAg
bWQ1LmFkZEJ5dGVzKHBpeGVsRGF0YSwgNCAqIHBpeGVsc1dpZGUpOworICAgICAgICBwaXhlbERh
dGEgKz0gYnl0ZXNQZXJSb3c7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQ4X3QsIDE2PiBoYXNo
OworICAgIG1kNS5jaGVja3N1bShoYXNoKTsKKworICAgIGhhc2hTdHJpbmdbMF0gPSAnXDAnOwor
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkKKyAgICAgICAgc25wcmludGYoaGFzaFN0
cmluZywgMzMsICIlcyUwMngiLCBoYXNoU3RyaW5nLCBoYXNoW2ldKTsKK30KKworc3RhdGljIHZv
aWQgcHJpbnRQTkcoU2tDYW52YXMqIGNhbnZhcywgY29uc3QgY2hhciogY2hlY2tzdW0pCit7Cisg
ICAgVmVjdG9yPHVuc2lnbmVkIGNoYXI+IHBuZ0RhdGE7CisgICAgZW5jb2RlU2tCaXRtYXBUb1BO
RyhjYW52YXMtPmdldERldmljZSgpLT5hY2Nlc3NCaXRtYXAoZmFsc2UpLCAmcG5nRGF0YSk7Cisg
ICAgcHJpbnRQTkcocG5nRGF0YS5kYXRhKCksIHBuZ0RhdGEuc2l6ZSgpLCBjaGVja3N1bSk7Cit9
CisKK3ZvaWQgZHVtcEJpdG1hcChCaXRtYXBDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBj
aGVja3N1bSkKK3sKKyAgICBwcmludFBORyhjb250ZXh0LT5jYW52YXMoKSwgY2hlY2tzdW0pOwor
fQpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvYmxhY2tiZXJyeS9QaXhlbER1bXBT
dXBwb3J0QmxhY2tCZXJyeS5oIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvYmxhY2tiZXJyeS9QaXhl
bER1bXBTdXBwb3J0QmxhY2tCZXJyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmI1MmQzZGExODg0YzdlNTYwNGY4
ODVmMWU1YjQzNWVkYTkwYzc2OTEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVy
VHJlZS9ibGFja2JlcnJ5L1BpeGVsRHVtcFN1cHBvcnRCbGFja0JlcnJ5LmgKQEAgLTAsMCArMSw1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRl
ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFz
IHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhh
dCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGVzc2VyIEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisg
KiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBG
cmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKyAqLworCisjaWZuZGVmIFBp
eGVsRHVtcFN1cHBvcnRCbGFja0JlcnJ5X2gKKyNkZWZpbmUgUGl4ZWxEdW1wU3VwcG9ydEJsYWNr
QmVycnlfaAorCisjaW5jbHVkZSA8UGFzc1JlZlB0ci5oPgorI2luY2x1ZGUgPFJlZkNvdW50ZWQu
aD4KKyNpbmNsdWRlIDxza2lhL1NrQml0bWFwLmg+CisjaW5jbHVkZSA8c2tpYS9Ta0NhbnZhcy5o
PgorCitjbGFzcyBCaXRtYXBDb250ZXh0IDogcHVibGljIFJlZkNvdW50ZWQ8Qml0bWFwQ29udGV4
dD4geworcHVibGljOgorCisgICAgc3RhdGljIFBhc3NSZWZQdHI8Qml0bWFwQ29udGV4dD4gY3Jl
YXRlQnlBZG9wdGluZ0JpdG1hcEFuZENvbnRleHQoU2tCaXRtYXAqIGJpdG1hcCwgU2tDYW52YXMq
IGNhbnZhcykKKyAgICB7CisgICAgICAgIHJldHVybiBhZG9wdFJlZihuZXcgQml0bWFwQ29udGV4
dChiaXRtYXAsIGNhbnZhcykpOworICAgIH0KKworICAgIH5CaXRtYXBDb250ZXh0KCkKKyAgICB7
CisgICAgICAgIGRlbGV0ZSBtX2JpdG1hcDsKKyAgICAgICAgZGVsZXRlIG1fY2FudmFzOworICAg
IH0KKworICAgIFNrQ2FudmFzKiBjYW52YXMoKSB7IHJldHVybiBtX2NhbnZhczsgfQorCitwcml2
YXRlOgorCisgICAgQml0bWFwQ29udGV4dChTa0JpdG1hcCogYml0bWFwLCBTa0NhbnZhcyogY2Fu
dmFzKQorICAgICAgICA6IG1fYml0bWFwKGJpdG1hcCkKKyAgICAgICAgLCBtX2NhbnZhcyhjYW52
YXMpCisgICAgeworICAgIH0KKworICAgIFNrQml0bWFwKiBtX2JpdG1hcDsKKyAgICBTa0NhbnZh
cyogbV9jYW52YXM7CisKK307CisKKyNlbmRpZiAvLyBQaXhlbER1bXBTdXBwb3J0QmxhY2tCZXJy
eV9oCg==
</data>
<flag name="review"
          id="127886"
          type_id="1"
          status="+"
          setter="tonikitoo"
    />
          </attachment>
      

    </bug>

</bugzilla>