<?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>27543</bug_id>
          
          <creation_ts>2009-07-22 08:49:03 -0700</creation_ts>
          <short_desc>Add platform/wince/ files for WINCE port</short_desc>
          <delta_ts>2009-09-02 06:32:12 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>Platform</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Other</rep_platform>
          <op_sys>Other</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>LATER</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>23154</blocked>
    
    <blocked>27561</blocked>
          <everconfirmed>0</everconfirmed>
          <reporter name="Yong Li">yong.li.webkit</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>abarth</cc>
    
    <cc>darin</cc>
    
    <cc>eric</cc>
    
    <cc>joenotcharles</cc>
    
    <cc>lyon.chen</cc>
    
    <cc>manyoso</cc>
    
    <cc>staikos</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>133775</commentid>
    <comment_count>0</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-22 08:49:03 -0700</bug_when>
    <thetext>patch file will be followed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133782</commentid>
    <comment_count>1</comment_count>
      <attachid>33265</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-22 09:25:15 -0700</bug_when>
    <thetext>Created attachment 33265
files for WINCE port in platform/wince


I have used cpplint to check coding style errors and fixed them.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133824</commentid>
    <comment_count>2</comment_count>
      <attachid>33265</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-07-22 11:54:38 -0700</bug_when>
    <thetext>Comment on attachment 33265
files for WINCE port in platform/wince

&gt; +#include &quot;CString.h&quot;
&gt; +#include &quot;DocumentFragment.h&quot;
&gt; +#include &quot;KURL.h&quot;
&gt; +#include &quot;PlatformString.h&quot;
&gt; +#include &quot;TextEncoding.h&quot;
&gt; +#include &quot;markup.h&quot;

Alphabetical sorting problem. Is this a bug in cpplint with capitalization?

&gt; +static String extractURL(const String &amp;inURL, String* title)

Decoration of &apos;const String &amp;inURL&apos; is wrong.  Another cpplint error?

&gt; +    String url = inURL;
&gt; +    int splitLoc = url.find(&apos;\n&apos;);
&gt; +    if (splitLoc &gt; 0) {

Minor nit: splitLoc should be spelled out fully: splitLocation.

&gt; +        if (title)
&gt; +            *title = url.substring(splitLoc+1);

Space between splitLoc and 1. Rule #2 of spacing.

&gt; +//Firefox text/html
&gt; +static FORMATETC* texthtmlFormat()
&gt; +{
&gt; +    static UINT cf = RegisterClipboardFormat(L&quot;text/html&quot;);
&gt; +    static FORMATETC texthtmlFormat = {cf, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
&gt; +    return &amp;texthtmlFormat;
&gt; +}

Should be &apos;textHTMLFormat()&apos; I believe.  What is the Firefox comment for?

&gt; +    HGLOBAL cbData = GlobalAlloc(GPTR, size * sizeof(UChar));

Should be clipboardData or so.

&gt; +    // calculate offsets
&gt; +    const unsigned UINT_MAXdigits = 10; // number of digits in UINT_MAX in base 10
&gt; +    unsigned startHTMLOffset = cf_html.length() + startHTML.length() + endHTML.length() + startFragment.length() + endFragment.length() + (shouldFillSourceURL ? sourceURL.length() + srcURL.length() : 0) + (4*UINT_MAXdigits);

Space around &apos;4*UINT_MAXdigits&apos;.

&gt; +String getURL(IDataObject* dataObject, bool&amp; success, String* title)
&gt; +{
&gt; +    return String();
&gt; +}

Compiler doesn&apos;t complain of unused arguments?

&gt; +#endif // ClipboardWin_h

Should be // ClipboardWince_h I think.

&gt; +void ContextMenuItem::setSubMenu(ContextMenu* subMenu)
&gt; +{
&gt; +    if (m_platformDescription) {
&gt; +        if (m_platformDescription-&gt;subMenu != subMenu-&gt;platformDescription())
&gt; +            delete m_platformDescription-&gt;subMenu;
&gt; +        m_platformDescription-&gt;subMenu = subMenu-&gt;releasePlatformDescription();
&gt; +    }
&gt; +}

Early return please.

&gt; +void ContextMenuItem::setChecked(bool checked)
&gt; +{
&gt; +    if (m_platformDescription) {
&gt; +        if (checked)
&gt; +            m_platformDescription-&gt;state |= PlatformMenuItemDescriptionType::CheckedState;
&gt; +        else
&gt; +            m_platformDescription-&gt;state &amp;= ~PlatformMenuItemDescriptionType::CheckedState;
&gt; +    }
&gt; +}

Early return please.

&gt; +void ContextMenuItem::setEnabled(bool enabled)
&gt; +{
&gt; +    if (m_platformDescription) {
&gt; +        if (enabled)
&gt; +            m_platformDescription-&gt;state |= PlatformMenuItemDescriptionType::EnabledState;
&gt; +        else
&gt; +            m_platformDescription-&gt;state &amp;= ~PlatformMenuItemDescriptionType::EnabledState;
&gt; +    }
&gt; +}

Early return please.

&gt; +PlatformMenuDescriptionType::PlatformMenuDescriptionType()
&gt; +: hMenu(::CreatePopupMenu())
&gt; +, itemCount(0)
&gt; +{
&gt; +}

Needs indentation of member variable initialization.

&gt; +    if (desc-&gt;type == SeparatorType) {
&gt; +        flags |= MF_SEPARATOR;
&gt; +    } else {

One line if clause...

&gt; +#if 0
&gt; +    if (!m_platformDescription)
&gt; +        return;
&gt; +
&gt; +    // FIXME: the Windows version did this, is it necessary?
&gt; +    MENUINFO menuInfo = {0};
&gt; +    menuInfo.cbSize = sizeof(MENUINFO);
&gt; +    menuInfo.fMask = MIM_STYLE;
&gt; +    ::GetMenuInfo(m_platformDescription, &amp;menuInfo);
&gt; +    menuInfo.fMask = MIM_STYLE;
&gt; +    menuInfo.dwStyle |= MNS_NOTIFYBYPOS;
&gt; +    ::SetMenuInfo(m_platformDescription, &amp;menuInfo);
&gt; +#endif

--commented out code

Going to stop there.  For the next iteration can you break it up in the following way?

Patch 1:


 * platform/wince/ClipboardUtilitiesWince.cpp: Added.
 * platform/wince/ClipboardWince.cpp: Added.
 * platform/wince/ClipboardWince.h: Added.
 * platform/wince/ContextMenuItemWince.cpp: Added.
 * platform/wince/ContextMenuWince.cpp: Added.
 * platform/wince/CursorWince.cpp: Added.
 * platform/wince/DragDataWince.cpp: Added.
 * platform/wince/DragImageWince.cpp: Added.
 * platform/wince/EditorWince.cpp: Added.
 * platform/wince/FileChooserWince.cpp: Added.
 * platform/wince/FileSystemWince.cpp: Added.
 * platform/wince/KURLWince.cpp: Added.
 * platform/wince/KeygenWince.cpp: Added.
 * platform/wince/MIMETypeRegistryWince.cpp: Added.
 * platform/wince/OptimizedBuffer.cpp: Added.
 * platform/wince/OptimizedBuffer.h: Added.
 * platform/wince/PasteboardWince.cpp: Added. 
 * platform/wince/SearchPopupMenuWince.cpp: Added.
 * platform/wince/SharedBuffer.cpp: Added.
 * platform/wince/SharedTimerWince.cpp: Added.
 * platform/wince/SystemTimeWince.cpp: Added. 

Patch 2:

The rest of the ScrollView/Widget related files?

Thanks,
Adam
I Indent as above. t</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133848</commentid>
    <comment_count>3</comment_count>
      <attachid>33281</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-22 12:43:38 -0700</bug_when>
    <thetext>Created attachment 33281
part 1 (not including ScrollView Widget and ScrollBar files)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>133850</commentid>
    <comment_count>4</comment_count>
      <attachid>33282</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-22 12:44:16 -0700</bug_when>
    <thetext>Created attachment 33282
part 2 (ScrollView, Widget, ScrollBar files)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135895</commentid>
    <comment_count>5</comment_count>
      <attachid>33282</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-07-30 11:30:06 -0700</bug_when>
    <thetext>Comment on attachment 33282
part 2 (ScrollView, Widget, ScrollBar files)

No changelog.  Also is this style checked?  I didn&apos;t notice any issues so far but it&apos;s a big patch.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135902</commentid>
    <comment_count>6</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 11:38:35 -0700</bug_when>
    <thetext>(In reply to comment #5)
&gt; (From update of attachment 33282 [details])
&gt; No changelog.  Also is this style checked?  I didn&apos;t notice any issues so far
&gt; but it&apos;s a big patch.

will clean up, and split it into more patches</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135976</commentid>
    <comment_count>7</comment_count>
      <attachid>33823</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:29:24 -0700</bug_when>
    <thetext>Created attachment 33823
1) Clipboard</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135977</commentid>
    <comment_count>8</comment_count>
      <attachid>33824</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:30:13 -0700</bug_when>
    <thetext>Created attachment 33824
2) ScrollView</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135978</commentid>
    <comment_count>9</comment_count>
      <attachid>33825</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:30:41 -0700</bug_when>
    <thetext>Created attachment 33825
3) Widget, Scrollbar</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135979</commentid>
    <comment_count>10</comment_count>
      <attachid>33826</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:31:24 -0700</bug_when>
    <thetext>Created attachment 33826
4) SharedBuffer</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135980</commentid>
    <comment_count>11</comment_count>
      <attachid>33827</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:31:51 -0700</bug_when>
    <thetext>Created attachment 33827
5) ContextMenu</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135981</commentid>
    <comment_count>12</comment_count>
      <attachid>33828</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:32:43 -0700</bug_when>
    <thetext>Created attachment 33828
6) SharedTimer and SystemTime</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135982</commentid>
    <comment_count>13</comment_count>
      <attachid>33829</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:33:11 -0700</bug_when>
    <thetext>Created attachment 33829
7) KeygenWince</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>135983</commentid>
    <comment_count>14</comment_count>
      <attachid>33830</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-07-30 13:33:39 -0700</bug_when>
    <thetext>Created attachment 33830
8) Other</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138077</commentid>
    <comment_count>15</comment_count>
      <attachid>33823</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-07 13:06:13 -0700</bug_when>
    <thetext>Comment on attachment 33823
1) Clipboard

Too large.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138087</commentid>
    <comment_count>16</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-07 13:15:56 -0700</bug_when>
    <thetext>(In reply to comment #15)
&gt; (From update of attachment 33823 [details])
&gt; Too large.

The ChangeLog is for all. we probably should split the ChangeLog, too. But the patch contains only 3 files for clipboard.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138088</commentid>
    <comment_count>17</comment_count>
      <attachid>33823</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-07 13:16:11 -0700</bug_when>
    <thetext>Comment on attachment 33823
1) Clipboard

nonsense</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138091</commentid>
    <comment_count>18</comment_count>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-07 13:16:53 -0700</bug_when>
    <thetext>(In reply to comment #16)
&gt; (In reply to comment #15)
&gt; &gt; (From update of attachment 33823 [details] [details])
&gt; &gt; Too large.
&gt; 
&gt; The ChangeLog is for all. we probably should split the ChangeLog, too. But the
&gt; patch contains only 3 files for clipboard.

Yes, please split the changelog and leave the patches as they are, including the appropriate changelogs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138369</commentid>
    <comment_count>19</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-08 10:32:21 -0700</bug_when>
    <thetext>(In reply to comment #17)
&gt; (From update of attachment 33823 [details])
&gt; nonsense

Wow.  I think that&apos;s totally inappropriate behavior from a reviewer.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138370</commentid>
    <comment_count>20</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-08 10:33:05 -0700</bug_when>
    <thetext>None of these have ChangeLogs.  Why are they marked for review?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138376</commentid>
    <comment_count>21</comment_count>
      <attachid>34372</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 10:47:36 -0700</bug_when>
    <thetext>Created attachment 34372
1) Clipboard</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138377</commentid>
    <comment_count>22</comment_count>
      <attachid>34373</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 10:50:57 -0700</bug_when>
    <thetext>Created attachment 34373
1) Clipboard

oops, written by Joe Mason</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138378</commentid>
    <comment_count>23</comment_count>
      <attachid>34374</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 10:53:28 -0700</bug_when>
    <thetext>Created attachment 34374
1) Clipboard</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138379</commentid>
    <comment_count>24</comment_count>
      <attachid>34375</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 10:58:41 -0700</bug_when>
    <thetext>Created attachment 34375
2) ScrollView</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138382</commentid>
    <comment_count>25</comment_count>
      <attachid>34376</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:02:00 -0700</bug_when>
    <thetext>Created attachment 34376
3) Scrollbar &amp; Widget</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138384</commentid>
    <comment_count>26</comment_count>
      <attachid>34378</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:07:51 -0700</bug_when>
    <thetext>Created attachment 34378
4) SharedBuffer &amp; OptimizedBuffer

Allow SharedBuffer to base on a segmented buffer or streaming data source.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138387</commentid>
    <comment_count>27</comment_count>
      <attachid>34379</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:12:06 -0700</bug_when>
    <thetext>Created attachment 34379
5) ContextMenu

Written by Joe Mason</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138389</commentid>
    <comment_count>28</comment_count>
      <attachid>34380</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:16:21 -0700</bug_when>
    <thetext>Created attachment 34380
6) SharedTimer &amp; SystemTime</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138391</commentid>
    <comment_count>29</comment_count>
      <attachid>34381</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:20:27 -0700</bug_when>
    <thetext>Created attachment 34381
7) Keygen (Security)

Written by Lyon Chen</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138392</commentid>
    <comment_count>30</comment_count>
      <attachid>34382</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:25:12 -0700</bug_when>
    <thetext>Created attachment 34382
8) Pasteboard &amp; SearchPopupMenu

Written by Joe Mason</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138393</commentid>
    <comment_count>31</comment_count>
      <attachid>34383</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:30:41 -0700</bug_when>
    <thetext>Created attachment 34383
8) Pasteboard &amp; SearchPopupMenu

Oops, last one is wrong</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138394</commentid>
    <comment_count>32</comment_count>
      <attachid>34384</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:32:32 -0700</bug_when>
    <thetext>Created attachment 34384
9) MIMETypeRegistry</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138395</commentid>
    <comment_count>33</comment_count>
      <attachid>34385</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:36:11 -0700</bug_when>
    <thetext>Created attachment 34385
10) Cursor</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138396</commentid>
    <comment_count>34</comment_count>
      <attachid>34386</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:38:43 -0700</bug_when>
    <thetext>Created attachment 34386
11) FileSystem and FileChooser</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138397</commentid>
    <comment_count>35</comment_count>
      <attachid>34381</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-08 11:38:46 -0700</bug_when>
    <thetext>Comment on attachment 34381
7) Keygen (Security)

For some meaningful review,

&gt;&gt; +#include &quot;config.h&quot;
&gt; +#include &quot;SSLKeyGenerator.h&quot;
&gt; +
&gt; +#include &quot;Base64.h&quot;
&gt; +#include &quot;CString.h&quot;
&gt; +
&gt; +#include &lt;windows.h&gt;
&gt; +#include &lt;wincrypt.h&gt;

Is this out of order by design?

&gt; +
&gt; +#define KEYGEN_DEBUG_KEY        0x00000001
&gt; +
&gt; +#ifndef NDEBUG
&gt; +#define KEYGEN_DEBUG    (0)
&gt; +#else
&gt; +#define KEYGEN_DEBUG    0
&gt; +#endif

This is odd.  Why 0 or 0?  I think we need to do better on the debug scheme.

&gt; +String WebCore::signedPublicKeyAndChallengeString(unsigned index, const String&amp; challenge, const KURL&amp; url)
&gt; +{
&gt; +    String keystr;
&gt; +
&gt; +    HCRYPTPROV hProv = 0;
&gt; +    HCRYPTKEY hKey = 0;
&gt; +    PCERT_PUBLIC_KEY_INFO pPubInfo = 0;
&gt; +    DWORD dwPubInfoLength = 0;
&gt; +    CERT_KEYGEN_REQUEST_INFO requestInfo;
&gt; +    CRYPT_ALGORITHM_IDENTIFIER signAlgo;
&gt; +    LPBYTE pbEncoded = 0;
&gt; +    DWORD dwEncodedLength = 0;
&gt; +    LPWSTR pszString = 0;
&gt; +    Vector&lt;char&gt; binary;
&gt; +    Vector&lt;char&gt; base64;

A good number of these can be moved to the relevant area so we don&apos;t lose track of what they&apos;re used for and if they&apos;re no-longer used.

&gt; +    BOOL success = CryptAcquireContext(&amp;hProv, _T(&quot;keygen_container&quot;), MS_ENHANCED_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);
&gt; +    if (!success)
&gt; +        goto error;

   Can we do better than lots of gotos?

&gt; +    pPubInfo = (PCERT_PUBLIC_KEY_INFO) new char[dwPubInfoLength];
&gt; +    if (!pPubInfo)
&gt; +        goto error;

  No need to check new return.

&gt; +    if (challenge.length()) {
&gt; +        pszString = new WCHAR[challenge.length() + 1];
&gt; +        if (pszString) {

   Same.

&gt; +    pbEncoded = (LPBYTE) new char[dwEncodedLength];
&gt; +    if (!pbEncoded)
&gt; +        goto error;

   Same

&gt; +error:
&gt; +    if (pszString)
&gt; +        delete[] pszString;
&gt; +    if (pbEncoded)
&gt; +        delete[] pbEncoded;
&gt; +    if (pPubInfo)
&gt; +        delete[] pPubInfo;

   Those if() are redundant</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138398</commentid>
    <comment_count>36</comment_count>
      <attachid>34384</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-08 11:41:23 -0700</bug_when>
    <thetext>Comment on attachment 34384
9) MIMETypeRegistry

&amp; style is inconsistent - type&amp; name in some places.  Otherwise it&apos;s fine so r+ on condition those are fixed on checkin.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138399</commentid>
    <comment_count>37</comment_count>
      <attachid>34387</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:41:38 -0700</bug_when>
    <thetext>Created attachment 34387
12) Other (simple stubs to make it build)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138401</commentid>
    <comment_count>38</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 11:44:53 -0700</bug_when>
    <thetext>(In reply to comment #35)
&gt; (From update of attachment 34381 [details])
&gt; For some meaningful review,
&gt; 
&gt; &gt;&gt; +#include &quot;config.h&quot;
&gt; &gt; +#include &quot;SSLKeyGenerator.h&quot;
&gt; &gt; +
&gt; &gt; +#include &quot;Base64.h&quot;
&gt; &gt; +#include &quot;CString.h&quot;
&gt; &gt; +
&gt; &gt; +#include &lt;windows.h&gt;
&gt; &gt; +#include &lt;wincrypt.h&gt;
&gt; 
&gt; Is this out of order by design?

The order of headers are sometimes important on Windows. Not sure with this one, but I think it&apos;s good to put &lt;windows.h&gt; before &lt;wincrypt.h&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138402</commentid>
    <comment_count>39</comment_count>
      <attachid>34384</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-08 11:56:04 -0700</bug_when>
    <thetext>Comment on attachment 34384
9) MIMETypeRegistry

No need for the explicit String cast here:
 113         return String(&quot;xml&quot;);</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138405</commentid>
    <comment_count>40</comment_count>
      <attachid>34387</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-08 12:04:22 -0700</bug_when>
    <thetext>Comment on attachment 34387
12) Other (simple stubs to make it build)

The create* functions returning 0 might cause crashes.  You might want to add notImplemented() calls to those as well.

Why is this needed?
 34 #define _SYS_GUID_OPERATORS_

Please remove the _SYS_GUID_OPERATORS_ when landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138406</commentid>
    <comment_count>41</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 12:07:03 -0700</bug_when>
    <thetext>(In reply to comment #39)
&gt; (From update of attachment 34384 [details])
&gt; No need for the explicit String cast here:
&gt;  113         return String(&quot;xml&quot;);

thanks. but isn&apos;t it better than implicit cast?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138407</commentid>
    <comment_count>42</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-08 12:08:45 -0700</bug_when>
    <thetext>(In reply to comment #40)
&gt; (From update of attachment 34387 [details])
&gt; The create* functions returning 0 might cause crashes.  You might want to add
&gt; notImplemented() calls to those as well.
&gt; 
&gt; Why is this needed?
&gt;  34 #define _SYS_GUID_OPERATORS_
&gt; 
&gt; Please remove the _SYS_GUID_OPERATORS_ when landing.

thanks</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138408</commentid>
    <comment_count>43</comment_count>
      <attachid>34385</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-08 12:11:58 -0700</bug_when>
    <thetext>Comment on attachment 34385
10) Cursor

An interesting approach. :)

Indent:
 41 : m_impl(other.m_impl)
 46 : m_impl(CursorNone)
 61 : m_impl(c)

Normally we don&apos;t use &quot;get&quot; in function names.  I might have named it cursorForType(type) instead.

I&apos;ve never seen a .cpp file use single-line function declarations like that before.  But I also don&apos;t think it&apos;s harmful.

OK.  Please fix the indent nit on landing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>138409</commentid>
    <comment_count>44</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-08 12:15:24 -0700</bug_when>
    <thetext>(In reply to comment #41)
&gt; (In reply to comment #39)
&gt; &gt; (From update of attachment 34384 [details] [details])
&gt; &gt; No need for the explicit String cast here:
&gt; &gt;  113         return String(&quot;xml&quot;);
&gt; 
&gt; thanks. but isn&apos;t it better than implicit cast?

The implicit construction is fewer characters to read. :)  And there are already other return statements in that same function which use the implicit String(char*) constructor.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139088</commentid>
    <comment_count>45</comment_count>
      <attachid>34590</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-11 14:10:46 -0700</bug_when>
    <thetext>Created attachment 34590
7) Keygen (Security)

refactored by Yong</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139094</commentid>
    <comment_count>46</comment_count>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-11 14:19:09 -0700</bug_when>
    <thetext>(In reply to comment #45)
&gt; Created an attachment (id=34590) [details]
&gt; 7) Keygen (Security)
&gt; 
&gt; refactored by Yong

Are you sure?  It looks the same to me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139123</commentid>
    <comment_count>47</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-11 15:12:26 -0700</bug_when>
    <thetext>(In reply to comment #46)
&gt; (In reply to comment #45)
&gt; &gt; Created an attachment (id=34590) [details] [details]
&gt; &gt; 7) Keygen (Security)
&gt; &gt; 
&gt; &gt; refactored by Yong
&gt; 
&gt; Are you sure?  It looks the same to me.

hm... a mistake</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139125</commentid>
    <comment_count>48</comment_count>
      <attachid>34602</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-11 15:17:29 -0700</bug_when>
    <thetext>Created attachment 34602
7) KeyGen (modified)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139357</commentid>
    <comment_count>49</comment_count>
      <attachid>34602</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-12 09:29:13 -0700</bug_when>
    <thetext>Comment on attachment 34602
7) KeyGen (modified)

I think standard for your for(;;) is really to do:

do {
} while (0);

Best to change to that and then your comment isn&apos;t necessary.  Also you have a double semicolon in your first if ().  Those minor fixes and the rest is fine with me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139358</commentid>
    <comment_count>50</comment_count>
    <who name="Darin Adler">darin</who>
    <bug_when>2009-08-12 09:33:40 -0700</bug_when>
    <thetext>(In reply to comment #49)
&gt; I think standard for your for(;;) is really to do:
&gt; 
&gt; do {
&gt; } while (0);

for(;;) is an infinite loop. The above is not an infinite loop, it&apos;s a one time loop, so it can&apos;t be used. For infinite loops, the most common pattern in WebKit is while (true).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139365</commentid>
    <comment_count>51</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-12 09:42:12 -0700</bug_when>
    <thetext>I like for (;;) so much personally :), but seems not allowed in webkit?

Probably I&apos;d better change it back to goto.

Another way to avoid goto is
 if (...) {
    if (...) {
      ...
      // free resources
    }
    // free resources
 }

I also like this way, but I&apos;m afraid that someone will say there&apos;re too many indentations.

I also planed to create wrapper classes for HCRYPTKEY and HCRYPTPROV that release resource automatically, but probably it&apos;s a waste for this single usage. Sadly, OwnPtr&lt;&gt; doesn&apos;t work in this case because HCRYPTKEY and HCRYPTPROV are just &quot;void*&quot;.

I considered a lot about this.

I&apos;m going to use goto, which makes everyone understand</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139423</commentid>
    <comment_count>52</comment_count>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-12 10:57:48 -0700</bug_when>
    <thetext>(In reply to comment #50)
&gt; (In reply to comment #49)
&gt; &gt; I think standard for your for(;;) is really to do:
&gt; &gt; 
&gt; &gt; do {
&gt; &gt; } while (0);
&gt; 
&gt; for(;;) is an infinite loop. The above is not an infinite loop, it&apos;s a one time
&gt; loop, so it can&apos;t be used. For infinite loops, the most common pattern in
&gt; WebKit is while (true).

You got confused in much the same way I was trying to point out. :-)  It&apos;s -never- supposed to loop.  That&apos;s what the comment says at the top.  That&apos;s why it should change.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139434</commentid>
    <comment_count>53</comment_count>
      <attachid>34678</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-12 11:13:09 -0700</bug_when>
    <thetext>Created attachment 34678
7) KeygenWince.cpp fixed a bug

changed to do while(0).

also fixed a bug that pPubInfo leaked in last patch, because it&apos;s defined twice.

goto is not good because local object construction after goto doesn&apos;t compile.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139465</commentid>
    <comment_count>54</comment_count>
      <attachid>34386</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-12 12:08:19 -0700</bug_when>
    <thetext>Comment on attachment 34386
11) FileSystem and FileChooser

Seems like a lot of work to be done in these files still, but if we ever want to be building in svn we have to get it checked in, and what is done seems to work well enough.  The FIXMEs and notImplemented can be done another day.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139466</commentid>
    <comment_count>55</comment_count>
      <attachid>34379</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-12 12:12:19 -0700</bug_when>
    <thetext>Comment on attachment 34379
5) ContextMenu


&gt; +    m_platformDescription = new PlatformMenuItemDescriptionType;
&gt; +    if (!m_platformDescription)
&gt; +        return;

   Don&apos;t think we should be checking for null here.

&gt; +void ContextMenuItem::setSubMenu(ContextMenu* subMenu)
&gt; +{
&gt; +    if (!m_platformDescription)
&gt; +        return;

  In fact can we remove all of these checks?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139467</commentid>
    <comment_count>56</comment_count>
      <attachid>34374</attachid>
    <who name="George Staikos">staikos</who>
    <bug_when>2009-08-12 12:17:21 -0700</bug_when>
    <thetext>Comment on attachment 34374
1) Clipboard


&gt; +static bool getWebLocData(IDataObject* dataObject, String&amp; url, String* title)
&gt; +{
&gt; +    return false;
&gt; +}

Should probably add some UNUSED_PARAM() here


&gt; +    CString cf_html = &quot;Version:0.9&quot;;
&gt; +    CString startHTML = &quot;\nStartHTML:&quot;;
&gt; +    CString endHTML = &quot;\nEndHTML:&quot;;
&gt; +    CString startFragment = &quot;\nStartFragment:&quot;;
&gt; +    CString endFragment = &quot;\nEndFragment:&quot;;
&gt; +    CString sourceURL = &quot;\nSourceURL:&quot;;
&gt; +
&gt; +    append(result, cf_html);
&gt; +
&gt; +    bool shouldFillSourceURL = !srcURL.isEmpty() &amp;&amp; (srcURL != &quot;about:blank&quot;);
&gt; +
&gt; +    CString startMarkup = &quot;\n&lt;HTML&gt;\n&lt;BODY&gt;\n&lt;!--StartFragment--&gt;\n&quot;;
&gt; +    CString endMarkup = &quot;\n&lt;!--EndFragment--&gt;\n&lt;/BODY&gt;\n&lt;/HTML&gt;&quot;;

   all these CString should be &quot;const&quot; right?  static too maybe?


&gt; +void ClipboardWince::clearData(const String&amp; type)
&gt; +{
&gt; +    notImplemented();
&gt; +}

This file can use lots of UNUSED_PARAM()


The rest seems fine</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139468</commentid>
    <comment_count>57</comment_count>
      <attachid>34380</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 12:25:29 -0700</bug_when>
    <thetext>Comment on attachment 34380
6) SharedTimer &amp; SystemTime

Clear flag as was landed in r47132.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139469</commentid>
    <comment_count>58</comment_count>
      <attachid>34383</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 12:28:38 -0700</bug_when>
    <thetext>Comment on attachment 34383
8) Pasteboard &amp; SearchPopupMenu

Clear flags as landed with r47133.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139470</commentid>
    <comment_count>59</comment_count>
      <attachid>34380</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-12 12:29:08 -0700</bug_when>
    <thetext>Comment on attachment 34380
6) SharedTimer &amp; SystemTime

Rejecting patch 34380 from commit-queue.  This patch will require manual commit.

WebKitTools/Scripts/run-webkit-tests --no-launch-safari --quiet failed with exit code 1</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139473</commentid>
    <comment_count>60</comment_count>
      <attachid>34384</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 12:32:42 -0700</bug_when>
    <thetext>Comment on attachment 34384
9) MIMETypeRegistry

Clear flags as landed with r47134.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139476</commentid>
    <comment_count>61</comment_count>
      <attachid>34680</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-12 12:35:28 -0700</bug_when>
    <thetext>Created attachment 34680
5) ContextMenu (modified)

modified according George&apos;s suggestion.

we have to check m_platformDescription in other functions because it can be cleared by releasePlatformDescription</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139477</commentid>
    <comment_count>62</comment_count>
      <attachid>34385</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 12:35:29 -0700</bug_when>
    <thetext>Comment on attachment 34385
10) Cursor

Clear flags as landed with r47135.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139479</commentid>
    <comment_count>63</comment_count>
      <attachid>34386</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 12:39:06 -0700</bug_when>
    <thetext>Comment on attachment 34386
11) FileSystem and FileChooser

Clear flags as landed with r47136.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139480</commentid>
    <comment_count>64</comment_count>
      <attachid>34387</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 12:41:33 -0700</bug_when>
    <thetext>Comment on attachment 34387
12) Other (simple stubs to make it build)

Clearing flags as landed with r47137.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139482</commentid>
    <comment_count>65</comment_count>
      <attachid>34678</attachid>
    <who name="Adam Treat">manyoso</who>
    <bug_when>2009-08-12 12:45:33 -0700</bug_when>
    <thetext>Comment on attachment 34678
7) KeygenWince.cpp fixed a bug

Clear flags as landed with r47139.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>139486</commentid>
    <comment_count>66</comment_count>
      <attachid>34681</attachid>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-08-12 12:52:48 -0700</bug_when>
    <thetext>Created attachment 34681
1) Clipboard (modified)

modified according George&apos;s suggestion</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141423</commentid>
    <comment_count>67</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-19 00:07:54 -0700</bug_when>
    <thetext>This bug is basically impossible to follow with this many patches on it. :(</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141424</commentid>
    <comment_count>68</comment_count>
      <attachid>34378</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-19 00:10:26 -0700</bug_when>
    <thetext>Comment on attachment 34378
4) SharedBuffer &amp; OptimizedBuffer

This does not follow WebKit style:
 22 #ifndef _OPTIMIZED_BUFFER_H_

Early returns?
if (OptimizedBuffer::isCreatorInstalled()) {
 246         if (OptimizedBuffer* optimizedBuffer = OptimizedBuffer::createInstance(m_size, m_optimizedBuffer, true)) {</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>141425</commentid>
    <comment_count>69</comment_count>
      <attachid>34376</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2009-08-19 00:14:37 -0700</bug_when>
    <thetext>Comment on attachment 34376
3) Scrollbar &amp; Widget

Does this not exist anywhere else in teh code base?
// stableRound rounds -0.5 to 0, where lround rounds -0.5 to -1.
 41 static inline int stableRound(double d)
 42 {

The ChnageLog is pretty bare.

What does the &quot;c&quot; mean here?  (they&apos;re not const)  Are you sure these follow WebKit style?
static int cHorizontalWidth[] = { 15, 11 };
 61 static int cHorizontalHeight[] = { 15, 11 };

I would look up the size and have a single setFrameRec call:
     if (orientation == VerticalScrollbar)
 79         setFrameRect(IntRect(0, 0, cVerticalWidth[controlSize()], cVerticalHeight[controlSize()]));
 80     else
 81         setFrameRect(IntRect(0, 0, cHorizontalWidth[controlSize()], cHorizontalHeight[controlSize()]));

Also that would allow you to use IntRect(IntPoint(), scrollbarSize) constructor as well.

Indent:
     default:
 126         {
 127             IntRect beforeThumbRect, thumbRect, afterThumbRect;
 128             splitTrack(trackRect(), beforeThumbRect, thumbRect, afterThumbRect);
 129             if (part == BackTrackPart)

Early return is preferred:
    if (enabled != isEnabled()) {
 164         Scrollbar::setEnabled(enabled);

this really should have its own bug, and this bug should be retired.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144085</commentid>
    <comment_count>70</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-01 18:10:55 -0700</bug_when>
    <thetext>This bug is out of control.  Please file separate bugs and re-post the patches that are still relevant.  Uber bugs like this don&apos;t work very well in our processes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144086</commentid>
    <comment_count>71</comment_count>
      <attachid>34375</attachid>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-01 18:12:09 -0700</bug_when>
    <thetext>Comment on attachment 34375
2) ScrollView

Clearing review flags on these patches so they can be moved to separate bugs.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144197</commentid>
    <comment_count>72</comment_count>
    <who name="Yong Li">yong.li.webkit</who>
    <bug_when>2009-09-02 06:09:14 -0700</bug_when>
    <thetext>(In reply to comment #71)
&gt; (From update of attachment 34375 [details])
&gt; Clearing review flags on these patches so they can be moved to separate bugs.

some of them have been landed</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>144201</commentid>
    <comment_count>73</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2009-09-02 06:32:12 -0700</bug_when>
    <thetext>(In reply to comment #72)
&gt; some of them have been landed

Even better.  :)

When patch land, it&apos;s helpful to clear the review flags so that other reviewers don&apos;t invest more time examining the patches.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33265</attachid>
            <date>2009-07-22 09:25:15 -0700</date>
            <delta_ts>2009-07-22 12:43:38 -0700</delta_ts>
            <desc>files for WINCE port in platform/wince</desc>
            <filename>27543.patch</filename>
            <type>text/plain</type>
            <size>199696</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZmFhOWY5Yy4uZDRmYTZlYiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MSBAQAorMjAwOS0wNy0yMiAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NzU0MworICAgICAgICBBZGQgc29tZSBXaW5DRSBwb3J0IGZpbGVzIHRvIHBsYXRmb3JtL3dpbmNl
CisKKyAgICAgICAgV3JpdHRlbiBieSBZb25nIExpIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4s
IEx5b24gQ2hlbiA8bHlvbi5jaGVuQHRvcmNobW9iaWxlLmNvbT4KKyAgICAgICAgYW5kIEpvZSBN
YXNvbiA8am9lLm1hc29uQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93
aW5jZS9DbGlwYm9hcmRXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9D
b250ZXh0TWVudUl0ZW1XaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNl
L0NvbnRleHRNZW51V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9D
dXJzb3JXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0RyYWdEYXRh
V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5j
ZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5jZS5jcHA6IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHA6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS93aW5jZS9QbGF0Zm9ybVNjcm9sbGJhci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93
aW5jZS9TY3JvbGxWaWV3V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5j
ZS9TY3JvbGxiYXJUaGVtZVdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2lu
Y2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5j
ZS9TZWFyY2hQb3B1cE1lbnVXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL1NoYXJlZEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1No
YXJlZFRpbWVyV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TeXN0
ZW1UaW1lV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9XaWRnZXRX
aW5jZS5jcHA6IEFkZGVkLgorCiAyMDA5LTA3LTIyICBNaWtoYWlsIE5hZ2Fub3YgIDxtbmFnYW5v
dkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgVGltb3RoeSBIYXRjaGVyLgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5j
ZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjE2MjgzCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5jZS5j
cHAKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5
IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5j
bHVkZSAiRG9jdW1lbnRGcmFnbWVudC5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1ZGUgIm1h
cmt1cC5oIgorI2luY2x1ZGUgPHNobHdhcGkuaD4KKyNpbmNsdWRlIDx3aW5pbmV0Lmg+ICAgIC8v
IGZvciBJTlRFUk5FVF9NQVhfVVJMX0xFTkdUSAorCit0eXBlZGVmIEhBTkRMRSBIRFJPUDsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgYm9vbCBnZXRXZWJMb2NEYXRhKElEYXRhT2Jq
ZWN0KiBkYXRhT2JqZWN0LCBTdHJpbmcmIHVybCwgU3RyaW5nKiB0aXRsZSkKK3sKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBTdHJpbmcgZXh0cmFjdFVSTChjb25zdCBTdHJpbmcgJmlu
VVJMLCBTdHJpbmcqIHRpdGxlKQoreworICAgIFN0cmluZyB1cmwgPSBpblVSTDsKKyAgICBpbnQg
c3BsaXRMb2MgPSB1cmwuZmluZCgnXG4nKTsKKyAgICBpZiAoc3BsaXRMb2MgPiAwKSB7CisgICAg
ICAgIGlmICh0aXRsZSkKKyAgICAgICAgICAgICp0aXRsZSA9IHVybC5zdWJzdHJpbmcoc3BsaXRM
b2MrMSk7CisgICAgICAgIHVybC50cnVuY2F0ZShzcGxpdExvYyk7CisgICAgfSBlbHNlIGlmICh0
aXRsZSkKKyAgICAgICAgKnRpdGxlID0gdXJsOworICAgIHJldHVybiB1cmw7Cit9CisKKy8vRmly
ZWZveCB0ZXh0L2h0bWwKK3N0YXRpYyBGT1JNQVRFVEMqIHRleHRodG1sRm9ybWF0KCkKK3sKKyAg
ICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwidGV4dC9odG1sIik7
CisgICAgc3RhdGljIEZPUk1BVEVUQyB0ZXh0aHRtbEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1Rf
Q09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdGV4dGh0bWxGb3JtYXQ7
Cit9CisKK0hHTE9CQUwgY3JlYXRlR2xvYmFsRGF0YShjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0
cmluZyYgdGl0bGUpCit7CisgICAgU3RyaW5nIG11dGFibGVVUkwodXJsLnN0cmluZygpKTsKKyAg
ICBTdHJpbmcgbXV0YWJsZVRpdGxlKHRpdGxlKTsKKyAgICBTSVpFX1Qgc2l6ZSA9IG11dGFibGVV
UkwubGVuZ3RoKCkgKyBtdXRhYmxlVGl0bGUubGVuZ3RoKCkgKyAyOyAgLy8gKzEgZm9yICJcbiIg
YW5kICsxIGZvciBudWxsIHRlcm1pbmF0b3IKKyAgICBIR0xPQkFMIGNiRGF0YSA9IEdsb2JhbEFs
bG9jKEdQVFIsIHNpemUgKiBzaXplb2YoVUNoYXIpKTsKKworICAgIGlmIChjYkRhdGEpIHsKKyAg
ICAgICAgUFdTVFIgYnVmZmVyID0gKFBXU1RSKUdsb2JhbExvY2soY2JEYXRhKTsKKyAgICAgICAg
X3Nud3ByaW50ZihidWZmZXIsIHNpemUsIEwiJXNcbiVzIiwgbXV0YWJsZVVSTC5jaGFyYWN0ZXJz
V2l0aE51bGxUZXJtaW5hdGlvbigpLCBtdXRhYmxlVGl0bGUuY2hhcmFjdGVyc1dpdGhOdWxsVGVy
bWluYXRpb24oKSk7CisgICAgICAgIEdsb2JhbFVubG9jayhjYkRhdGEpOworICAgIH0KKyAgICBy
ZXR1cm4gY2JEYXRhOworfQorCitIR0xPQkFMIGNyZWF0ZUdsb2JhbERhdGEoY29uc3QgU3RyaW5n
JiBzdHIpCit7CisgICAgSEdMT0JBTCBnbG9iYWxEYXRhID0gOjpHbG9iYWxBbGxvYyhHUFRSLCAo
c3RyLmxlbmd0aCgpICsgMSkgKiBzaXplb2YoVUNoYXIpKTsKKyAgICBpZiAoIWdsb2JhbERhdGEp
CisgICAgICAgIHJldHVybiAwOworICAgIFVDaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxVQ2hh
cio+KEdsb2JhbExvY2soZ2xvYmFsRGF0YSkpOworICAgIG1lbWNweShidWZmZXIsIHN0ci5jaGFy
YWN0ZXJzKCksIHN0ci5sZW5ndGgoKSAqIHNpemVvZihVQ2hhcikpOworICAgIGJ1ZmZlcltzdHIu
bGVuZ3RoKCldID0gMDsKKyAgICBHbG9iYWxVbmxvY2soZ2xvYmFsRGF0YSk7CisgICAgcmV0dXJu
IGdsb2JhbERhdGE7Cit9CisKK0hHTE9CQUwgY3JlYXRlR2xvYmFsRGF0YShjb25zdCBWZWN0b3I8
Y2hhcj4mIHZlY3RvcikKK3sKKyAgICBIR0xPQkFMIGdsb2JhbERhdGEgPSBHbG9iYWxBbGxvYyhH
UFRSLCB2ZWN0b3Iuc2l6ZSgpICsgMSk7CisgICAgaWYgKCFnbG9iYWxEYXRhKQorICAgICAgICBy
ZXR1cm4gMDsKKyAgICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oR2xvYmFsTG9j
ayhnbG9iYWxEYXRhKSk7CisgICAgbWVtY3B5KGJ1ZmZlciwgdmVjdG9yLmRhdGEoKSwgdmVjdG9y
LnNpemUoKSk7CisgICAgYnVmZmVyW3ZlY3Rvci5zaXplKCldID0gMDsKKyAgICBHbG9iYWxVbmxv
Y2soZ2xvYmFsRGF0YSk7CisgICAgcmV0dXJuIGdsb2JhbERhdGE7Cit9CisKK3N0YXRpYyB2b2lk
IGFwcGVuZChWZWN0b3I8Y2hhcj4mIHZlY3RvciwgY29uc3QgY2hhciogc3RyaW5nKQoreworICAg
IHZlY3Rvci5hcHBlbmQoc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7Cit9CisKK3N0YXRpYyB2b2lk
IGFwcGVuZChWZWN0b3I8Y2hhcj4mIHZlY3RvciwgY29uc3QgQ1N0cmluZyYgc3RyaW5nKQorewor
ICAgIHZlY3Rvci5hcHBlbmQoc3RyaW5nLmRhdGEoKSwgc3RyaW5nLmxlbmd0aCgpKTsKK30KKwor
Ly8gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIENGX0hUTUwgZm9ybWF0IGlzIGF2YWlsYWJsZSBhdCBo
dHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3dvcmtzaG9wL25ldHdvcmtpbmcvY2xpcGJvYXJkL2h0
bWxjbGlwYm9hcmQuYXNwCit2b2lkIG1hcmt1cFRvQ0ZfSFRNTChjb25zdCBTdHJpbmcmIG1hcmt1
cCwgY29uc3QgU3RyaW5nJiBzcmNVUkwsIFZlY3RvcjxjaGFyPiYgcmVzdWx0KQoreworICAgIGlm
ICghbWFya3VwLmxlbmd0aCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBDU3RyaW5nIGNmX2h0
bWwgPSAiVmVyc2lvbjowLjkiOworICAgIENTdHJpbmcgc3RhcnRIVE1MID0gIlxuU3RhcnRIVE1M
OiI7CisgICAgQ1N0cmluZyBlbmRIVE1MID0gIlxuRW5kSFRNTDoiOworICAgIENTdHJpbmcgc3Rh
cnRGcmFnbWVudCA9ICJcblN0YXJ0RnJhZ21lbnQ6IjsKKyAgICBDU3RyaW5nIGVuZEZyYWdtZW50
ID0gIlxuRW5kRnJhZ21lbnQ6IjsKKyAgICBDU3RyaW5nIHNvdXJjZVVSTCA9ICJcblNvdXJjZVVS
TDoiOworCisgICAgYXBwZW5kKHJlc3VsdCwgY2ZfaHRtbCk7CisKKyAgICBib29sIHNob3VsZEZp
bGxTb3VyY2VVUkwgPSAhc3JjVVJMLmlzRW1wdHkoKSAmJiAoc3JjVVJMICE9ICJhYm91dDpibGFu
ayIpOworCisgICAgQ1N0cmluZyBzdGFydE1hcmt1cCA9ICJcbjxIVE1MPlxuPEJPRFk+XG48IS0t
U3RhcnRGcmFnbWVudC0tPlxuIjsKKyAgICBDU3RyaW5nIGVuZE1hcmt1cCA9ICJcbjwhLS1FbmRG
cmFnbWVudC0tPlxuPC9CT0RZPlxuPC9IVE1MPiI7CisKKyAgICAvLyBjYWxjdWxhdGUgb2Zmc2V0
cworICAgIGNvbnN0IHVuc2lnbmVkIFVJTlRfTUFYZGlnaXRzID0gMTA7IC8vIG51bWJlciBvZiBk
aWdpdHMgaW4gVUlOVF9NQVggaW4gYmFzZSAxMAorICAgIHVuc2lnbmVkIHN0YXJ0SFRNTE9mZnNl
dCA9IGNmX2h0bWwubGVuZ3RoKCkgKyBzdGFydEhUTUwubGVuZ3RoKCkgKyBlbmRIVE1MLmxlbmd0
aCgpICsgc3RhcnRGcmFnbWVudC5sZW5ndGgoKSArIGVuZEZyYWdtZW50Lmxlbmd0aCgpICsgKHNo
b3VsZEZpbGxTb3VyY2VVUkwgPyBzb3VyY2VVUkwubGVuZ3RoKCkgKyBzcmNVUkwubGVuZ3RoKCkg
OiAwKSArICg0KlVJTlRfTUFYZGlnaXRzKTsKKyAgICB1bnNpZ25lZCBzdGFydEZyYWdtZW50T2Zm
c2V0ID0gc3RhcnRIVE1MT2Zmc2V0ICsgc3RhcnRNYXJrdXAubGVuZ3RoKCk7CisgICAgQ1N0cmlu
ZyBtYXJrdXBVVEY4ID0gbWFya3VwLnV0ZjgoKTsKKyAgICB1bnNpZ25lZCBlbmRGcmFnbWVudE9m
ZnNldCA9IHN0YXJ0RnJhZ21lbnRPZmZzZXQgKyBtYXJrdXBVVEY4Lmxlbmd0aCgpOworICAgIHVu
c2lnbmVkIGVuZEhUTUxPZmZzZXQgPSBlbmRGcmFnbWVudE9mZnNldCArIGVuZE1hcmt1cC5sZW5n
dGgoKTsKKworICAgIC8vIGNyZWF0ZSBmdWxsIHJlc3VsdCBzdHJpbmcgZnJvbSB0aGUgZnJhZ21l
bnRzCisgICAgYXBwZW5kKHJlc3VsdCwgc3RhcnRIVE1MKTsKKyAgICBhcHBlbmQocmVzdWx0LCBT
dHJpbmc6OmZvcm1hdCgiJTAxMHUiLCBzdGFydEhUTUxPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOwor
ICAgIGFwcGVuZChyZXN1bHQsIGVuZEhUTUwpOworICAgIGFwcGVuZChyZXN1bHQsIFN0cmluZzo6
Zm9ybWF0KCIlMDEwdSIsIGVuZEhUTUxPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFwcGVu
ZChyZXN1bHQsIHN0YXJ0RnJhZ21lbnQpOworICAgIGFwcGVuZChyZXN1bHQsIFN0cmluZzo6Zm9y
bWF0KCIlMDEwdSIsIHN0YXJ0RnJhZ21lbnRPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFw
cGVuZChyZXN1bHQsIGVuZEZyYWdtZW50KTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZv
cm1hdCgiJTAxMHUiLCBlbmRGcmFnbWVudE9mZnNldCkudXRmOCgpLmRhdGEoKSk7CisgICAgaWYg
KHNob3VsZEZpbGxTb3VyY2VVUkwpIHsKKyAgICAgICAgYXBwZW5kKHJlc3VsdCwgc291cmNlVVJM
KTsKKyAgICAgICAgYXBwZW5kKHJlc3VsdCwgc3JjVVJMLnV0ZjgoKS5kYXRhKCkpOworICAgIH0K
KyAgICBhcHBlbmQocmVzdWx0LCBzdGFydE1hcmt1cCk7CisgICAgYXBwZW5kKHJlc3VsdCwgbWFy
a3VwVVRGOC5kYXRhKCkpOworICAgIGFwcGVuZChyZXN1bHQsIGVuZE1hcmt1cCk7Cit9CisKK1N0
cmluZyB1cmxUb01hcmt1cChjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUpCit7
CisgICAgU3RyaW5nIG1hcmt1cCgiPGEgaHJlZj1cIiIpOworICAgIG1hcmt1cC5hcHBlbmQodXJs
LnN0cmluZygpKTsKKyAgICBtYXJrdXAuYXBwZW5kKCJcIj4iKTsKKyAgICBtYXJrdXAuYXBwZW5k
KHRpdGxlKTsKKyAgICBtYXJrdXAuYXBwZW5kKCI8L2E+Iik7CisgICAgcmV0dXJuIG1hcmt1cDsK
K30KKwordm9pZCByZXBsYWNlTmV3bGluZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMoU3RyaW5n
JiBzdHIpCit7CisgICAgc3RhdGljIGNvbnN0IFVDaGFyIE5ld2xpbmUgPSAnXG4nOworICAgIHN0
YXRpYyBjb25zdCBTdHJpbmcgV2luZG93c05ld2xpbmUoIlxyXG4iKTsKKyAgICBzdHIucmVwbGFj
ZShOZXdsaW5lLCBXaW5kb3dzTmV3bGluZSk7Cit9CisKK3ZvaWQgcmVwbGFjZU5CU1BXaXRoU3Bh
Y2UoU3RyaW5nJiBzdHIpCit7CisgICAgc3RhdGljIGNvbnN0IFVDaGFyIE5vbkJyZWFraW5nU3Bh
Y2VDaGFyYWN0ZXIgPSAweEEwOworICAgIHN0YXRpYyBjb25zdCBVQ2hhciBTcGFjZUNoYXJhY3Rl
ciA9ICcgJzsKKyAgICBzdHIucmVwbGFjZShOb25CcmVha2luZ1NwYWNlQ2hhcmFjdGVyLCBTcGFj
ZUNoYXJhY3Rlcik7Cit9CisKK0ZPUk1BVEVUQyogdXJsV0Zvcm1hdCgpCit7CisgICAgc3RhdGlj
IFVJTlQgY2YgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIlVuaWZvcm1SZXNvdXJjZUxvY2F0
b3JXIik7CisgICAgc3RhdGljIEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNU
X0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnVybEZvcm1hdDsKK30K
KworRk9STUFURVRDKiB1cmxGb3JtYXQoKQoreworICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0
ZXJDbGlwYm9hcmRGb3JtYXQoTCJVbmlmb3JtUmVzb3VyY2VMb2NhdG9yIik7CisgICAgc3RhdGlj
IEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1F
RF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnVybEZvcm1hdDsKK30KKworRk9STUFURVRDKiBwbGFp
blRleHRGb3JtYXQoKQoreworICAgIHN0YXRpYyBGT1JNQVRFVEMgdGV4dEZvcm1hdCA9IHtDRl9U
RVhULCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJu
ICZ0ZXh0Rm9ybWF0OworfQorCitGT1JNQVRFVEMqIHBsYWluVGV4dFdGb3JtYXQoKQoreworICAg
IHN0YXRpYyBGT1JNQVRFVEMgdGV4dEZvcm1hdCA9IHtDRl9VTklDT0RFVEVYVCwgMCwgRFZBU1BF
Q1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdGV4dEZvcm1hdDsK
K30KKworRk9STUFURVRDKiBmaWxlbmFtZVdGb3JtYXQoKQoreworICAgIHN0YXRpYyBVSU5UIGNm
ID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJGaWxlTmFtZVciKTsKKyAgICBzdGF0aWMgRk9S
TUFURVRDIHVybEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hH
TE9CQUx9OworICAgIHJldHVybiAmdXJsRm9ybWF0OworfQorCitGT1JNQVRFVEMqIGZpbGVuYW1l
Rm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0
KEwiRmlsZU5hbWUiKTsKKyAgICBzdGF0aWMgRk9STUFURVRDIHVybEZvcm1hdCA9IHtjZiwgMCwg
RFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdXJsRm9y
bWF0OworfQorCisvL01TSUUgSFRNTCBGb3JtYXQKK0ZPUk1BVEVUQyogaHRtbEZvcm1hdCgpCit7
CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIkhUTUwgRm9y
bWF0Iik7CisgICAgc3RhdGljIEZPUk1BVEVUQyBodG1sRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVD
VF9DT05URU5ULCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZodG1sRm9ybWF0Owor
fQorCitTdHJpbmcgZ2V0VVJMKElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBib29sJiBzdWNjZXNz
LCBTdHJpbmcqIHRpdGxlKQoreworICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworU3RyaW5nIGdl
dFBsYWluVGV4dChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgYm9vbCYgc3VjY2VzcykKK3sKKyAg
ICBTVEdNRURJVU0gc3RvcmU7CisgICAgU3RyaW5nIHRleHQ7CisgICAgc3VjY2VzcyA9IGZhbHNl
OworICAgIGlmIChTVUNDRUVERUQoZGF0YU9iamVjdC0+R2V0RGF0YShwbGFpblRleHRXRm9ybWF0
KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8vdW5pY29kZSB0ZXh0CisgICAgICAgIFVDaGFyKiBk
YXRhID0gKFVDaGFyKilHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICB0ZXh0ID0g
U3RyaW5nKGRhdGEpOworICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAg
ICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7Cisg
ICAgfSBlbHNlIGlmIChTVUNDRUVERUQoZGF0YU9iamVjdC0+R2V0RGF0YShwbGFpblRleHRGb3Jt
YXQoKSwgJnN0b3JlKSkpIHsKKyAgICAgICAgLy9hc2NpaSB0ZXh0CisgICAgICAgIGNoYXIqIGRh
dGEgPSAoY2hhciopR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgdGV4dCA9IFN0
cmluZyhkYXRhKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAg
ICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAg
IH0gZWxzZSB7CisgICAgICAgIC8vSWYgYSBmaWxlIGlzIGRyb3BwZWQgb24gdGhlIHdpbmRvdywg
aXQgZG9lcyBub3QgcHJvdmlkZSBlaXRoZXIgb2YgdGhlCisgICAgICAgIC8vcGxhaW4gdGV4dCBm
b3JtYXRzLCBzbyBoZXJlIHdlIHRyeSB0byBmb3JjaWJseSBnZXQgYSB1cmwuCisgICAgICAgIHRl
eHQgPSBnZXRVUkwoZGF0YU9iamVjdCwgc3VjY2Vzcyk7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVl
OworICAgIH0KKyAgICByZXR1cm4gdGV4dDsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdt
ZW50PiBmcmFnbWVudEZyb21GaWxlbmFtZXMoRG9jdW1lbnQqLCBjb25zdCBJRGF0YU9iamVjdCop
Cit7CisgICAgLy9GSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIGZyYWdtZW50cyBm
cm9tIGZpbGVzCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgY29udGFpbnNGaWxlbmFtZXMoY29u
c3QgSURhdGFPYmplY3QqKQoreworICAgIC8vRklYTUU6IFdlJ2xsIHdhbnQgdG8gdXBkYXRlIHRo
aXMgb25jZSB3ZSBjYW4gcHJvZHVjZSBmcmFnbWVudHMgZnJvbSBmaWxlcworICAgIHJldHVybiBm
YWxzZTsKK30KKworLy9Db252ZXJ0IGEgU3RyaW5nIGNvbnRhaW5pbmcgQ0ZfSFRNTCBmb3JtYXR0
ZWQgdGV4dCB0byBhIERvY3VtZW50RnJhZ21lbnQKK1Bhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVu
dD4gZnJhZ21lbnRGcm9tQ0ZfSFRNTChEb2N1bWVudCogZG9jLCBjb25zdCBTdHJpbmcmIGNmX2h0
bWwpCit7CisgICAgLy8gb2J0YWluIGJhc2VVUkwgaWYgcHJlc2VudAorICAgIFN0cmluZyBzcmNV
UkxTdHIoInNvdXJjZVVSTDoiKTsKKyAgICBTdHJpbmcgc3JjVVJMOworICAgIHVuc2lnbmVkIGxp
bmVTdGFydCA9IGNmX2h0bWwuZmluZChzcmNVUkxTdHIsIDAsIGZhbHNlKTsKKyAgICBpZiAobGlu
ZVN0YXJ0ICE9IC0xKSB7CisgICAgICAgIHVuc2lnbmVkIHNyY0VuZCA9IGNmX2h0bWwuZmluZCgi
XG4iLCBsaW5lU3RhcnQsIGZhbHNlKTsKKyAgICAgICAgdW5zaWduZWQgc3JjU3RhcnQgPSBsaW5l
U3RhcnQrc3JjVVJMU3RyLmxlbmd0aCgpOworICAgICAgICBTdHJpbmcgcmF3U3JjVVJMID0gY2Zf
aHRtbC5zdWJzdHJpbmcoc3JjU3RhcnQsIHNyY0VuZC1zcmNTdGFydCk7CisgICAgICAgIHJlcGxh
Y2VOQlNQV2l0aFNwYWNlKHJhd1NyY1VSTCk7CisgICAgICAgIHNyY1VSTCA9IHJhd1NyY1VSTC5z
dHJpcFdoaXRlU3BhY2UoKTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHRoZSBtYXJrdXAgYmV0d2Vl
biAiPCEtLVN0YXJ0RnJhZ21lbnQgLS0+IiBhbmQgIjwhLS1FbmRGcmFnbWVudCAtLT4iLCBhY2Nv
dW50aW5nIGZvciBicm93c2VyIHF1aXJrcworICAgIHVuc2lnbmVkIG1hcmt1cFN0YXJ0ID0gY2Zf
aHRtbC5maW5kKCI8aHRtbCIsIDAsIGZhbHNlKTsKKyAgICB1bnNpZ25lZCB0YWdTdGFydCA9IGNm
X2h0bWwuZmluZCgic3RhcnRmcmFnbWVudCIsIG1hcmt1cFN0YXJ0LCBmYWxzZSk7CisgICAgdW5z
aWduZWQgZnJhZ21lbnRTdGFydCA9IGNmX2h0bWwuZmluZCgnPicsIHRhZ1N0YXJ0KSArIDE7Cisg
ICAgdW5zaWduZWQgdGFnRW5kID0gY2ZfaHRtbC5maW5kKCJlbmRmcmFnbWVudCIsIGZyYWdtZW50
U3RhcnQsIGZhbHNlKTsKKyAgICB1bnNpZ25lZCBmcmFnbWVudEVuZCA9IGNmX2h0bWwucmV2ZXJz
ZUZpbmQoJzwnLCB0YWdFbmQpOworICAgIFN0cmluZyBtYXJrdXAgPSBjZl9odG1sLnN1YnN0cmlu
ZyhmcmFnbWVudFN0YXJ0LCBmcmFnbWVudEVuZCAtIGZyYWdtZW50U3RhcnQpLnN0cmlwV2hpdGVT
cGFjZSgpOworCisgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbU1hcmt1cChkb2MsIG1hcmt1
cCwgc3JjVVJMKS5yZWxlYXNlUmVmKCk7Cit9CisKKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdt
ZW50PiBmcmFnbWVudEZyb21IVE1MKERvY3VtZW50KiBkb2MsIElEYXRhT2JqZWN0KiBkYXRhKQor
eworICAgIGlmICghZG9jIHx8ICFkYXRhKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFNUR01F
RElVTSBzdG9yZTsKKyAgICBTdHJpbmcgaHRtbDsKKyAgICBTdHJpbmcgc3JjVVJMOworICAgIGlm
IChTVUNDRUVERUQoZGF0YS0+R2V0RGF0YShodG1sRm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAg
ICAgIC8vTVMgSFRNTCBGb3JtYXQgcGFyc2luZworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIq
KUdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFNJWkVfVCBkYXRhU2l6ZSA9IDo6
R2xvYmFsU2l6ZShzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgU3RyaW5nIGNmX2h0bWwoVVRGOEVu
Y29kaW5nKCkuZGVjb2RlKGRhdGEsIGRhdGFTaXplKSk7CisgICAgICAgIEdsb2JhbFVubG9jayhz
dG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAg
ICBpZiAoUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZyYWdtZW50RnJv
bUNGX0hUTUwoZG9jLCBjZl9odG1sKSkKKyAgICAgICAgICAgIHJldHVybiBmcmFnbWVudDsKKyAg
ICB9CisgICAgaWYgKFNVQ0NFRURFRChkYXRhLT5HZXREYXRhKHRleHRodG1sRm9ybWF0KCksICZz
dG9yZSkpKSB7CisgICAgICAgIC8vcmF3IGh0bWwKKyAgICAgICAgVUNoYXIqIGRhdGEgPSAoVUNo
YXIqKUdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIGh0bWwgPSBTdHJpbmcoZGF0
YSk7CisgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFz
ZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tTWFy
a3VwKGRvYywgaHRtbCwgc3JjVVJMKTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworYm9v
bCBjb250YWluc0hUTUwoSURhdGFPYmplY3QqIGRhdGEpCit7CisgICAgcmV0dXJuIFNVQ0NFRURF
RChkYXRhLT5RdWVyeUdldERhdGEodGV4dGh0bWxGb3JtYXQoKSkpIHx8IFNVQ0NFRURFRChkYXRh
LT5RdWVyeUdldERhdGEoaHRtbEZvcm1hdCgpKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyNzMwMgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRp
c3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lU
SE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgor
ICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg
U2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRo
IEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUg
ImNvbmZpZy5oIgorI2luY2x1ZGUgIkNsaXBib2FyZFdpbmNlLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworQ2xpcGJvYXJkV2luY2U6OkNsaXBib2FyZFdpbmNlKENsaXBib2FyZEFjY2Vzc1Bv
bGljeSBwb2xpY3ksIGJvb2wgaXNGb3JEcmFnZ2luZykKKzogQ2xpcGJvYXJkKHBvbGljeSwgaXNG
b3JEcmFnZ2luZykKK3sKK30KKworQ2xpcGJvYXJkV2luY2U6On5DbGlwYm9hcmRXaW5jZSgpCit7
Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OmNsZWFyRGF0YShjb25zdCBTdHJpbmcmIHR5cGUp
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBDbGlwYm9hcmRXaW5jZTo6Y2xl
YXJBbGxEYXRhKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitTdHJpbmcgQ2xpcGJv
YXJkV2luY2U6OmdldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBib29sJiBzdWNjZXNzKSBjb25z
dAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCiti
b29sIENsaXBib2FyZFdpbmNlOjpzZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3Ry
aW5nJiBkYXRhKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCisvLyBleHRlbnNpb25zIGJleW9uZCBJRSdzIEFQSQorSGFzaFNldDxTdHJpbmc+IENsaXBi
b2FyZFdpbmNlOjp0eXBlcygpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICBy
ZXR1cm4gSGFzaFNldDxTdHJpbmc+KCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OnNldERy
YWdJbWFnZShDYWNoZWRJbWFnZSosIGNvbnN0IEludFBvaW50JikKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworfQorCit2b2lkIENsaXBib2FyZFdpbmNlOjpzZXREcmFnSW1hZ2VFbGVtZW50KE5v
ZGUqLCBjb25zdCBJbnRQb2ludCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworLy9Q
cm92aWRlcyB0aGUgRE9NIHNwZWNpZmllZAorRHJhZ0ltYWdlUmVmIENsaXBib2FyZFdpbmNlOjpj
cmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdMb2MpIGNvbnN0Cit7CisgICAgbm90SW1wbGVt
ZW50ZWQoKTsKKyAgICByZXR1cm4gRHJhZ0ltYWdlUmVmKCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJk
V2luY2U6OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNv
bnN0IFN0cmluZyYgdGl0bGUsIEZyYW1lKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
Cit2b2lkIENsaXBib2FyZFdpbmNlOjp3cml0ZVVSTChjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5n
JiwgRnJhbWUqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJk
V2luY2U6OndyaXRlUmFuZ2UoUmFuZ2UqLCBGcmFtZSopCit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKworYm9vbCBDbGlwYm9hcmRXaW5jZTo6aGFzRGF0YSgpCit7CisgICAgbm90SW1wbGVt
ZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Bhc3NSZWZQdHI8RmlsZUxpc3Q+IENs
aXBib2FyZFdpbmNlOjpmaWxlcygpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAg
ICByZXR1cm4gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9DbGlwYm9hcmRXaW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LmM5NDI3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBi
b2FyZFdpbmNlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0y
MDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdh
cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRo
ZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVy
c2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJz
aW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0
IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcu
TElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgQ2xpcGJvYXJkV2luY2VfaAorI2RlZmluZSBD
bGlwYm9hcmRXaW5jZV9oCisKKyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKKyNpbmNsdWRlICJGaWxl
TGlzdC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBDbGlwYm9hcmRXaW5j
ZSA6IHB1YmxpYyBDbGlwYm9hcmQsIHB1YmxpYyBDYWNoZWRSZXNvdXJjZUNsaWVudCB7CisgICAg
cHVibGljOgorICAgICAgICBDbGlwYm9hcmRXaW5jZShDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9s
aWN5LCBib29sIGlzRm9yRHJhZ2dpbmcpOworICAgICAgICB+Q2xpcGJvYXJkV2luY2UoKTsKKwor
ICAgICAgICB2b2lkIGNsZWFyRGF0YShjb25zdCBTdHJpbmcmIHR5cGUpOworICAgICAgICB2b2lk
IGNsZWFyQWxsRGF0YSgpOworICAgICAgICBTdHJpbmcgZ2V0RGF0YShjb25zdCBTdHJpbmcmIHR5
cGUsIGJvb2wmIHN1Y2Nlc3MpIGNvbnN0OworICAgICAgICBib29sIHNldERhdGEoY29uc3QgU3Ry
aW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRhdGEpOworCisgICAgICAgIC8vIGV4dGVuc2lvbnMg
YmV5b25kIElFJ3MgQVBJCisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiB0eXBlcygpIGNvbnN0Owor
CisgICAgICAgIHZvaWQgc2V0RHJhZ0ltYWdlKENhY2hlZEltYWdlKiwgY29uc3QgSW50UG9pbnQm
KTsKKyAgICAgICAgdm9pZCBzZXREcmFnSW1hZ2VFbGVtZW50KE5vZGUqLCBjb25zdCBJbnRQb2lu
dCYpOworCisgICAgICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZShJbnRQ
b2ludCYgZHJhZ0xvYykgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgdm9pZCBkZWNsYXJlQW5kV3Jp
dGVEcmFnSW1hZ2UoRWxlbWVudCosIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBG
cmFtZSopOworICAgICAgICB2aXJ0dWFsIHZvaWQgd3JpdGVVUkwoY29uc3QgS1VSTCYsIGNvbnN0
IFN0cmluZyYsIEZyYW1lKik7CisgICAgICAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhbmdlKFJhbmdl
KiwgRnJhbWUqKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzRGF0YSgpOworICAgICAgICB2
aXJ0dWFsIFBhc3NSZWZQdHI8RmlsZUxpc3Q+IGZpbGVzKCkgY29uc3Q7CisgICAgfTsKKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gQ2xpcGJvYXJkV2luX2gKZGlmZiAtLWdp
dCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVJdGVtV2luY2UuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9Db250ZXh0TWVudUl0ZW1XaW5jZS5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjMTIyYwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVJdGVtV2luY2UuY3BwCkBAIC0wLDAgKzEsMTYy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIElu
Yy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51SXRl
bS5oIgorCisjaW5jbHVkZSAiQ29udGV4dE1lbnUuaCIKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisj
aW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvblR5cGU6On5QbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlKCkK
K3sKKyAgICBkZWxldGUgc3ViTWVudTsKK30KKworQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVu
dUl0ZW0oUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGl0ZW0pCisgICAgOiBtX3BsYXRmb3Jt
RGVzY3JpcHRpb24oaXRlbSkKK3sKK30KKworQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0
ZW0oQ29udGV4dE1lbnUqIHN1Yk1lbnUpCit7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0g
bmV3IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU7CisgICAgaWYgKG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbiAmJiBzdWJNZW51KQorICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN1
Yk1lbnUgPSBzdWJNZW51LT5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOworfQorCitDb250
ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENv
bnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUq
IHN1Yk1lbnUpCit7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gbmV3IFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvblR5cGU7CisgICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisg
ICAgICAgIHJldHVybjsKKworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dHlwZSA9IHR5cGU7
CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5hY3Rpb24gPSBhY3Rpb247CisgICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT50aXRsZSA9IHRpdGxlOworICAgIGlmIChzdWJNZW51KQorICAgICAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1lbnUgPSBzdWJNZW51LT5yZWxlYXNlUGxhdGZv
cm1EZXNjcmlwdGlvbigpOworfQorCitDb250ZXh0TWVudUl0ZW06On5Db250ZXh0TWVudUl0ZW0o
KQoreworICAgIGRlbGV0ZSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Cit9CisKK1BsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvbiBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0
aW9uKCkKK3sKKyAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gZGVzYyA9IG1fcGxhdGZv
cm1EZXNjcmlwdGlvbjsKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAwOworICAgIHJldHVy
biBkZXNjOworfQorCitDb250ZXh0TWVudUl0ZW1UeXBlIENvbnRleHRNZW51SXRlbTo6dHlwZSgp
IGNvbnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJu
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dHlwZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBB
Y3Rpb25UeXBlOworfQorCitDb250ZXh0TWVudUFjdGlvbiBDb250ZXh0TWVudUl0ZW06OmFjdGlv
bigpIGNvbnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0
dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+YWN0aW9uOworICAgIGVsc2UKKyAgICAgICAgcmV0
dXJuIENvbnRleHRNZW51SXRlbVRhZ05vQWN0aW9uOworfQorCitTdHJpbmcgQ29udGV4dE1lbnVJ
dGVtOjp0aXRsZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAg
ICAgICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dGl0bGU7CisgICAgZWxzZQorICAg
ICAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK1BsYXRmb3JtTWVudURlc2NyaXB0aW9uIENvbnRl
eHRNZW51SXRlbTo6cGxhdGZvcm1TdWJNZW51KCkgY29uc3QKK3sKKyAgICBpZiAobV9wbGF0Zm9y
bURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdWJN
ZW51OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ29udGV4dE1lbnVJ
dGVtOjpzZXRUeXBlKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSkKK3sKKyAgICBpZiAobV9wbGF0
Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnR5cGUgPSB0
eXBlOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0QWN0aW9uKENvbnRleHRNZW51QWN0
aW9uIGFjdGlvbikKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24tPmFjdGlvbiA9IGFjdGlvbjsKK30KKwordm9pZCBDb250ZXh0
TWVudUl0ZW06OnNldFRpdGxlKGNvbnN0IFN0cmluZyYgdGl0bGUpCit7CisgICAgaWYgKG1fcGxh
dGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT50aXRsZSA9
IHRpdGxlOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShDb250ZXh0TWVu
dSogc3ViTWVudSkKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKSB7CisgICAgICAg
IGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1lbnUgIT0gc3ViTWVudS0+cGxhdGZvcm1E
ZXNjcmlwdGlvbigpKQorICAgICAgICAgICAgZGVsZXRlIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
c3ViTWVudTsKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdWJNZW51ID0gc3ViTWVu
dS0+cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4
dE1lbnVJdGVtOjpzZXRDaGVja2VkKGJvb2wgY2hlY2tlZCkKK3sKKyAgICBpZiAobV9wbGF0Zm9y
bURlc2NyaXB0aW9uKSB7CisgICAgICAgIGlmIChjaGVja2VkKQorICAgICAgICAgICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5zdGF0ZSB8PSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBl
OjpDaGVja2VkU3RhdGU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+c3RhdGUgJj0gflBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkNoZWNr
ZWRTdGF0ZTsKKyAgICB9Cit9CisKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRFbmFibGVkKGJv
b2wgZW5hYmxlZCkKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKSB7CisgICAgICAg
IGlmIChlbmFibGVkKQorICAgICAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdGF0ZSB8
PSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGU7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+c3RhdGUgJj0gflBsYXRm
b3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkVuYWJsZWRTdGF0ZTsKKyAgICB9Cit9CisKK2Jv
b2wgQ29udGV4dE1lbnVJdGVtOjplbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wbGF0
Zm9ybURlc2NyaXB0aW9uICYmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN0YXRlICYgUGxhdGZv
cm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZTo6RW5hYmxlZFN0YXRlKSA9PSBQbGF0Zm9ybU1lbnVJ
dGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGU7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL0NvbnRleHRNZW51V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjAzOTI2MTIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0NvbnRleHRNZW51V2luY2UuY3BwCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1
ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNpbmNsdWRlICJDU3Ry
aW5nLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1
ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlIDx0Y2hhci5oPgor
I2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworUGxhdGZvcm1NZW51RGVzY3JpcHRpb25UeXBlOjpQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvblR5cGUoKQorOiBoTWVudSg6OkNyZWF0ZVBvcHVwTWVudSgpKQorLCBpdGVtQ291
bnQoMCkKK3sKK30KKworUGxhdGZvcm1NZW51RGVzY3JpcHRpb25UeXBlOjp+UGxhdGZvcm1NZW51
RGVzY3JpcHRpb25UeXBlKCkKK3sKKyAgICBpZiAoaE1lbnUpCisgICAgICAgIDo6RGVzdHJveU1l
bnUoaE1lbnUpOworfQorCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29uc3QgSGl0VGVzdFJl
c3VsdCYgcmVzdWx0KQorICAgIDogbV9oaXRUZXN0UmVzdWx0KHJlc3VsdCkKKyAgICAsIG1fcGxh
dGZvcm1EZXNjcmlwdGlvbigwKQoreworICAgIHNldFBsYXRmb3JtRGVzY3JpcHRpb24obmV3IFBs
YXRmb3JtTWVudURlc2NyaXB0aW9uVHlwZSk7Cit9CisKK0NvbnRleHRNZW51OjpDb250ZXh0TWVu
dShjb25zdCBIaXRUZXN0UmVzdWx0JiByZXN1bHQsIGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0
aW9uIG1lbnUpCisgICAgOiBtX2hpdFRlc3RSZXN1bHQocmVzdWx0KQorICAgICwgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uKDApCit7CisgICAgc2V0UGxhdGZvcm1EZXNjcmlwdGlvbihtZW51KTsKK30K
KworQ29udGV4dE1lbnU6On5Db250ZXh0TWVudSgpCit7CisgICAgZGVsZXRlIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbjsKK30KKwordW5zaWduZWQgQ29udGV4dE1lbnU6Oml0ZW1Db3VudCgpIGNvbnN0
Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuIG1fcGxh
dGZvcm1EZXNjcmlwdGlvbi0+aXRlbUNvdW50OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7
Cit9CisKK3ZvaWQgQ29udGV4dE1lbnU6Omluc2VydEl0ZW0odW5zaWduZWQgaW50IHBvc2l0aW9u
LCBDb250ZXh0TWVudUl0ZW0mIGl0ZW0pCit7CisgICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRp
b24pCisgICAgICAgIHJldHVybjsKKworICAgIGNoZWNrT3JFbmFibGVJZk5lZWRlZChpdGVtKTsK
KworICAgIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBkZXNjID0gaXRlbS5yZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbigpOworICAgIFVJTlQgZmxhZ3MgPSBNRl9CWVBPU0lUSU9OOworICAg
IFVJTlQgbmV3SXRlbSA9IDA7CisgICAgTFBDVFNUUiB0aXRsZSA9IDA7CisgICAgRFdPUkQgc3Vi
TWVudVNpemUgPSAwOworCisgICAgaWYgKGRlc2MtPnR5cGUgPT0gU2VwYXJhdG9yVHlwZSkgewor
ICAgICAgICBmbGFncyB8PSBNRl9TRVBBUkFUT1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmxh
Z3MgfD0gTUZfU1RSSU5HOworICAgICAgICB0aXRsZSA9IHdjc2R1cChkZXNjLT50aXRsZS5jaGFy
YWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKworICAgICAgICBpZiAoZGVzYy0+c3ViTWVu
dSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gTUZfUE9QVVA7CisgICAgICAgICAgICBuZXdJdGVt
ID0gKFVJTlQpIGRlc2MtPnN1Yk1lbnUtPmhNZW51OworICAgICAgICAgICAgc3ViTWVudVNpemUg
PSBkZXNjLT5zdWJNZW51LT5pdGVtQ291bnQ7CisKKyAgICAgICAgICAgIC8vIG5vdyB3ZSBvd24g
dGhlIHN1Ym1lbnUgc28gbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ2V0IGRlbGV0ZWQgd2l0aCBkZXNj
CisgICAgICAgICAgICBkZXNjLT5zdWJNZW51LT5oTWVudSA9IDA7CisgICAgICAgICAgICBkZWxl
dGUgZGVzYy0+c3ViTWVudTsKKyAgICAgICAgICAgIGRlc2MtPnN1Yk1lbnUgPSAwOworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIG5ld0l0ZW0gPSBkZXNjLT5hY3Rpb247CisKKyAgICAgICAg
aWYgKChkZXNjLT5zdGF0ZSAmIFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkNoZWNr
ZWRTdGF0ZSkgPT0gUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZTo6Q2hlY2tlZFN0YXRl
KQorICAgICAgICAgICAgZmxhZ3MgfD0gTUZfQ0hFQ0tFRDsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgZmxhZ3MgfD0gTUZfVU5DSEVDS0VEOworCisgICAgICAgIGlmICgoZGVzYy0+c3RhdGUg
JiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGUpID09IFBsYXRm
b3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkVuYWJsZWRTdGF0ZSkKKyAgICAgICAgICAgIGZs
YWdzIHw9IE1GX0VOQUJMRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZsYWdzIHw9IE1G
X0dSQVlFRDsKKyAgICB9CisKKyAgICBpZiAoOjpJbnNlcnRNZW51KG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+aE1lbnUsIHBvc2l0aW9uLCBmbGFncywgbmV3SXRlbSwgdGl0bGUpKSB7CisgICAgICAg
IGlmIChzdWJNZW51U2l6ZSkgeworICAgICAgICAgICAgLy8gc3RvcmUgdGhlIHN1Ym1lbnUncyBz
aXplIGFsb25nIHdpdGggaXQsIHNpbmNlIFdpbkNFIGhhcyBubyBmdW5jdGlvbiBjYWxsIHRvIGZp
bmQgdGhpcworICAgICAgICAgICAgTUVOVUlURU1JTkZPIGluZm87CisgICAgICAgICAgICBtZW1z
ZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisgICAgICAgICAgICBpbmZvLmNiU2l6ZSA9IHNp
emVvZihpbmZvKTsKKyAgICAgICAgICAgIGluZm8uZk1hc2sgPSBNSUlNX0RBVEE7CisgICAgICAg
ICAgICBpbmZvLmR3SXRlbURhdGEgPSBzdWJNZW51U2l6ZTsKKworICAgICAgICAgICAgOjpTZXRN
ZW51SXRlbUluZm8obV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5oTWVudSwgcG9zaXRpb24sIFRSVUUs
ICZpbmZvKTsKKyAgICAgICAgfQorICAgICAgICArK21fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aXRl
bUNvdW50OworICAgIH0KKworICAgIC8vIHRoZSBpdGVtIGlzIG5vdyBvd25lZCBieSB0aGUgbWVu
dSBzdHJ1Y3R1cmUsIHNvIGRlbGV0ZSBvdXIgcmVmZXJlbmNlIHRvIGl0CisgICAgZGVsZXRlIGRl
c2M7Cit9CisKK3ZvaWQgQ29udGV4dE1lbnU6OmFwcGVuZEl0ZW0oQ29udGV4dE1lbnVJdGVtJiBp
dGVtKQoreworICAgIGluc2VydEl0ZW0oaXRlbUNvdW50KCksIGl0ZW0pOworfQorCitzdGF0aWMg
Q29udGV4dE1lbnVJdGVtKiBjb250ZXh0TWVudUl0ZW1CeUlkT3JQb3NpdGlvbihQbGF0Zm9ybU1l
bnVEZXNjcmlwdGlvbiBtZW51LCB1bnNpZ25lZCBpZCwgQk9PTCBieVBvc2l0aW9uKQoreworICAg
IGlmICghbWVudSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBNRU5VSVRFTUlORk8gaW5mbzsK
KyAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisgICAgaW5mby5jYlNpemUgPSBz
aXplb2YoaW5mbyk7CisgICAgaW5mby5mTWFzayA9IE1JSU1fVFlQRSB8IE1JSU1fSUQgfCBNSUlN
X1NVQk1FTlUgfCBNSUlNX1NUQVRFIHwgTUlJTV9EQVRBOworCisgICAgaWYgKCE6OkdldE1lbnVJ
dGVtSW5mbyhtZW51LT5oTWVudSwgaWQsIGJ5UG9zaXRpb24sICZpbmZvKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICAvLyBpZiBpdCBoYXMgYSBzdHJpbmcsIHJlYWQgaXQKKyAgICBTdHJpbmcg
dGl0bGU7CisgICAgaWYgKChpbmZvLmZUeXBlICYgTUZUX1NUUklORykgPT0gTUZUX1NUUklORykg
eworICAgICAgICAvLyBpbmZvLmNjaCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRo
ZSBzdHJpbmcuICBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyAocGx1cyBudWxsIHRlcm1pbmF0b3Ip
IGFuZCBxdWVyeSBhZ2Fpbi4KKyAgICAgICAgKytpbmZvLmNjaDsKKyAgICAgICAgTFBUU1RSIGJ1
ZmZlciA9IChMUFRTVFIpbWFsbG9jKGluZm8uY2NoICogc2l6ZW9mKFRDSEFSKSk7CisgICAgICAg
IGlmICghYnVmZmVyKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGluZm8uZHdUeXBl
RGF0YSA9IGJ1ZmZlcjsKKworICAgICAgICBpZiAoITo6R2V0TWVudUl0ZW1JbmZvKG1lbnUtPmhN
ZW51LCBpZCwgYnlQb3NpdGlvbiwgJmluZm8pKSB7CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7
CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluZm8uY2No
IGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBudW1iZXIgb2YgY2hhcnMgY29waWVkIGludG8gYnVmZmVy
CisgICAgICAgIHRpdGxlID0gU3RyaW5nKGluZm8uZHdUeXBlRGF0YSwgaW5mby5jY2gpOworICAg
ICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorCisgICAgLy8gY3JlYXRlIHRoZSB2YWx1ZSB0byBy
ZXR1cm4KKyAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gaXRlbSA9IG5ldyBQbGF0Zm9y
bU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOworCisgICAgaWYgKChpbmZvLmZUeXBlICYgTUZUX1NF
UEFSQVRPUikgPT0gTUZUX1NFUEFSQVRPUikKKyAgICAgICAgaXRlbS0+dHlwZSA9IFNlcGFyYXRv
clR5cGU7CisgICAgZWxzZSB7CisgICAgICAgIGl0ZW0tPnRpdGxlID0gdGl0bGU7CisgICAgICAg
IGl0ZW0tPnN0YXRlID0gMDsKKyAgICAgICAgaWYgKChpbmZvLmZTdGF0ZSAmIE1GU19DSEVDS0VE
KSA9PSBNRlNfQ0hFQ0tFRCkKKyAgICAgICAgICAgIGl0ZW0tPnN0YXRlIHw9IFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvblR5cGU6OkNoZWNrZWRTdGF0ZTsKKyAgICAgICAgaWYgKChpbmZvLmZT
dGF0ZSAmIE1GU19FTkFCTEVEKSA9PSBNRlNfRU5BQkxFRCkKKyAgICAgICAgICAgIGl0ZW0tPnN0
YXRlIHw9IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkVuYWJsZWRTdGF0ZTsKKwor
ICAgICAgICBpZiAoIWluZm8uaFN1Yk1lbnUpIHsKKyAgICAgICAgICAgIGl0ZW0tPnR5cGUgPSBB
Y3Rpb25UeXBlOworICAgICAgICAgICAgaXRlbS0+YWN0aW9uID0gKENvbnRleHRNZW51QWN0aW9u
KSBpbmZvLndJRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0ZW0tPnR5cGUgPSBT
dWJtZW51VHlwZTsKKyAgICAgICAgICAgIGl0ZW0tPnN1Yk1lbnUgPSBuZXcgUGxhdGZvcm1NZW51
RGVzY3JpcHRpb25UeXBlOworCisgICAgICAgICAgICAvLyB0aGUgbWVudSBzaXplIGlzIHN0b3Jl
ZCBhcyB0aGUgaXRlbSdzIGN1c3RvbSBkYXRhCisgICAgICAgICAgICAvLyBCVUc6IHdobyBvd25z
IHRoZSBITUVOVSBub3c/CisgICAgICAgICAgICBpdGVtLT5zdWJNZW51LT5oTWVudSA9IGluZm8u
aFN1Yk1lbnU7CisgICAgICAgICAgICBpdGVtLT5zdWJNZW51LT5pdGVtQ291bnQgPSBpbmZvLmR3
SXRlbURhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3IENvbnRleHRNZW51
SXRlbShpdGVtKTsKK30KKworQ29udGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbVdpdGhB
Y3Rpb24odW5zaWduZWQgYWN0aW9uKQoreworICAgIHJldHVybiBjb250ZXh0TWVudUl0ZW1CeUlk
T3JQb3NpdGlvbihtX3BsYXRmb3JtRGVzY3JpcHRpb24sIGFjdGlvbiwgRkFMU0UpOworfQorCitD
b250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCwg
Y29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gcGxhdGZvcm1EZXNjcmlwdGlvbikKK3sKKyAg
ICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24ocGxhdGZvcm1EZXNjcmlwdGlv
biwgaW5kZXgsIFRSVUUpOworfQorCit2b2lkIENvbnRleHRNZW51OjpzZXRQbGF0Zm9ybURlc2Ny
aXB0aW9uKFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGRlc2MpCit7CisgICAgaWYgKG1fcGxhdGZv
cm1EZXNjcmlwdGlvbiAhPSBkZXNjKQorICAgICAgICBkZWxldGUgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IGRlc2M7CisKKyNpZiAwCisgICAgaWYg
KCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEZJWE1F
OiB0aGUgV2luZG93cyB2ZXJzaW9uIGRpZCB0aGlzLCBpcyBpdCBuZWNlc3Nhcnk/CisgICAgTUVO
VUlORk8gbWVudUluZm8gPSB7MH07CisgICAgbWVudUluZm8uY2JTaXplID0gc2l6ZW9mKE1FTlVJ
TkZPKTsKKyAgICBtZW51SW5mby5mTWFzayA9IE1JTV9TVFlMRTsKKyAgICA6OkdldE1lbnVJbmZv
KG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZvKTsKKyAgICBtZW51SW5mby5mTWFzayA9
IE1JTV9TVFlMRTsKKyAgICBtZW51SW5mby5kd1N0eWxlIHw9IE1OU19OT1RJRllCWVBPUzsKKyAg
ICA6OlNldE1lbnVJbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiwgJm1lbnVJbmZvKTsKKyNlbmRp
ZgorfQorCitQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBDb250ZXh0TWVudTo6cGxhdGZvcm1EZXNj
cmlwdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKK30K
KworUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gQ29udGV4dE1lbnU6OnJlbGVhc2VQbGF0Zm9ybURl
c2NyaXB0aW9uKCkKK3sKKyAgICBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBkZXNjID0gbV9wbGF0
Zm9ybURlc2NyaXB0aW9uOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7CisgICAgcmV0
dXJuIGRlc2M7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ3Vy
c29yV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM1ZjFmOQotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ3Vyc29yV2luY2UuY3BwCkBAIC0wLDAgKzEsMTA5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29m
dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y
IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5
IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3Ig
bW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQs
IEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkN1cnNvci5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK3N0cnVjdCBBbGxDdXJzb3JzIHsKKyAgICBBbGxDdXJzb3JzKCkKKyAgICB7CisgICAg
ICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTnVtQ3Vyc29yVHlwZXM7ICsraSkKKyAgICAgICAgICAg
IG1fY3Vyc29yc1tpXSA9IChDdXJzb3JUeXBlKSBpOworICAgIH0KKyAgICBDdXJzb3IgbV9jdXJz
b3JzW051bUN1cnNvclR5cGVzXTsKK307CisKK3N0YXRpYyBjb25zdCBDdXJzb3ImIGdldEN1cnNv
cihDdXJzb3JUeXBlIHR5cGUpCit7CisgICAgc3RhdGljIEFsbEN1cnNvcnMgYWxsQ3Vyc29yczsK
KyAgICByZXR1cm4gYWxsQ3Vyc29ycy5tX2N1cnNvcnNbdHlwZV07Cit9CisKK0N1cnNvcjo6Q3Vy
c29yKGNvbnN0IEN1cnNvciYgb3RoZXIpCis6IG1faW1wbChvdGhlci5tX2ltcGwpCit7Cit9CisK
K0N1cnNvcjo6Q3Vyc29yKEltYWdlKiBpbWcsIGNvbnN0IEludFBvaW50JiBob3RzcG90KQorOiBt
X2ltcGwoQ3Vyc29yTm9uZSkKK3sKK30KKworQ3Vyc29yOjp+Q3Vyc29yKCkKK3sKK30KKworQ3Vy
c29yJiBDdXJzb3I6Om9wZXJhdG9yPShjb25zdCBDdXJzb3ImIG90aGVyKQoreworICAgIG1faW1w
bCA9IG90aGVyLm1faW1wbDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0N1cnNvcjo6Q3Vyc29y
KFBsYXRmb3JtQ3Vyc29yIGMpCis6IG1faW1wbChjKQoreworfQorCitjb25zdCBDdXJzb3ImIG5v
bmVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9uZSk7IH0KK2NvbnN0IEN1cnNv
ciYgcG9pbnRlckN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JQb2ludGVyKTsgfQor
Y29uc3QgQ3Vyc29yJiBjcm9zc0N1cnNvcigpICB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ3Jv
c3MpOyB9Citjb25zdCBDdXJzb3ImIGhhbmRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vy
c29ySGFuZCk7IH0KK2NvbnN0IEN1cnNvciYgaUJlYW1DdXJzb3IoKSB7IHJldHVybiBnZXRDdXJz
b3IoQ3Vyc29yQmVhbSk7IH0KK2NvbnN0IEN1cnNvciYgd2FpdEN1cnNvcigpIHsgcmV0dXJuIGdl
dEN1cnNvcihDdXJzb3JXYWl0KTsgfQorY29uc3QgQ3Vyc29yJiBoZWxwQ3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvckhlbHApOyB9Citjb25zdCBDdXJzb3ImIG1vdmVDdXJzb3IoKSAg
eyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck1vdmUpOyB9Citjb25zdCBDdXJzb3ImIGVhc3RSZXNp
emVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yRWFzdFJlc2l6ZSk7IH0KK2NvbnN0
IEN1cnNvciYgbm9ydGhSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9y
dGhSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoRWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aEVhc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5v
cnRoV2VzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFdlc3RS
ZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHNvdXRoUmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0
Q3Vyc29yKEN1cnNvclNvdXRoUmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aEVhc3RSZXNp
emVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yU291dGhFYXN0UmVzaXplKTsgfQor
Y29uc3QgQ3Vyc29yJiBzb3V0aFdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3Io
Q3Vyc29yU291dGhXZXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiB3ZXN0UmVzaXplQ3Vyc29y
KCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvcldlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3Im
IG5vcnRoU291dGhSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhT
b3V0aFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgZWFzdFdlc3RSZXNpemVDdXJzb3IoKSB7IHJl
dHVybiBnZXRDdXJzb3IoQ3Vyc29yRWFzdFdlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5v
cnRoRWFzdFNvdXRoV2VzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JO
b3J0aEVhc3RTb3V0aFdlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoV2VzdFNvdXRo
RWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFdlc3RTb3V0
aEVhc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIGNvbHVtblJlc2l6ZUN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JDb2x1bW5SZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHJvd1Jl
c2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JSb3dSZXNpemUpOyB9Citjb25z
dCBDdXJzb3ImIHZlcnRpY2FsVGV4dEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JW
ZXJ0aWNhbFRleHQpOyB9Citjb25zdCBDdXJzb3ImIGNlbGxDdXJzb3IoKSB7IHJldHVybiBnZXRD
dXJzb3IoQ3Vyc29yQ2VsbCk7IH0KK2NvbnN0IEN1cnNvciYgY29udGV4dE1lbnVDdXJzb3IoKSB7
IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ29udGV4dE1lbnUpOyB9Citjb25zdCBDdXJzb3ImIG5v
RHJvcEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb0Ryb3ApOyB9Citjb25zdCBD
dXJzb3ImIG5vdEFsbG93ZWRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm90QWxs
b3dlZCk7IH0KK2NvbnN0IEN1cnNvciYgcHJvZ3Jlc3NDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJz
b3IoQ3Vyc29yUHJvZ3Jlc3MpOyB9Citjb25zdCBDdXJzb3ImIGFsaWFzQ3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvckFsaWFzKTsgfQorY29uc3QgQ3Vyc29yJiB6b29tSW5DdXJzb3Io
KSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yWm9vbUluKTsgfQorY29uc3QgQ3Vyc29yJiB6b29t
T3V0Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclpvb21PdXQpOyB9Citjb25zdCBD
dXJzb3ImIGNvcHlDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ29weSk7IH0KK2Nv
bnN0IEN1cnNvciYgbWlkZGxlUGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7
IH0KK2NvbnN0IEN1cnNvciYgZWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNv
cigpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoUGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3Nz
Q3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhFYXN0UGFubmluZ0N1cnNvcigpIHsgcmV0
dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhXZXN0UGFubmluZ0N1cnNv
cigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhQYW5uaW5n
Q3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aEVh
c3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29y
JiBzb3V0aFdlc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29u
c3QgQ3Vyc29yJiB3ZXN0UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0K
K2NvbnN0IEN1cnNvciYgZ3JhYmJpbmdDdXJzb3IoKSB7IHJldHVybiBtb3ZlQ3Vyc29yKCk7IH0K
K2NvbnN0IEN1cnNvciYgZ3JhYkN1cnNvcigpIHsgcmV0dXJuIG1vdmVDdXJzb3IoKTsgfQorCit9
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdEYXRhV2luY2UuY3BwIGIv
V2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnRGF0YVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi44ODFkN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS93aW5jZS9EcmFnRGF0YVdpbmNlLmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICog
IENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlz
IGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y
CisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5
b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhp
cyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisg
KiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRyYWdEYXRhLmgiCisKKyNpbmNsdWRl
ICJDbGlwYm9hcmQuaCIKKyNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCisjaW5jbHVkZSAi
UGxhdGZvcm1TdHJpbmcuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzUmVmUHRyPENs
aXBib2FyZD4gRHJhZ0RhdGE6OmNyZWF0ZUNsaXBib2FyZChDbGlwYm9hcmRBY2Nlc3NQb2xpY3kg
cG9saWN5KSBjb25zdAoreworICAgIHJldHVybiAwOworfQorCitib29sIERyYWdEYXRhOjpjb250
YWluc1VSTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgRHJhZ0Rh
dGE6OmFzVVJMKFN0cmluZyogdGl0bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIFN0cmluZygpOwor
fQorCitib29sIERyYWdEYXRhOjpjb250YWluc0ZpbGVzKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK3ZvaWQgRHJhZ0RhdGE6OmFzRmlsZW5hbWVzKFZlY3RvcjxTdHJpbmc+Jikg
Y29uc3QKK3sKK30KKworYm9vbCBEcmFnRGF0YTo6Y29udGFpbnNQbGFpblRleHQoKSBjb25zdAor
eworICAgIHJldHVybiBmYWxzZTsKK30KKworU3RyaW5nIERyYWdEYXRhOjphc1BsYWluVGV4dCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitib29sIERyYWdEYXRhOjpjb250
YWluc0NvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRHJhZ0Rh
dGE6OmNhblNtYXJ0UmVwbGFjZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCiti
b29sIERyYWdEYXRhOjpjb250YWluc0NvbXBhdGlibGVDb250ZW50KCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gZmFsc2U7Cit9CisKK1Bhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gRHJhZ0RhdGE6
OmFzRnJhZ21lbnQoRG9jdW1lbnQqIGRvYykgY29uc3QKK3sKKyAgICAgcmV0dXJuIDA7Cit9CisK
K0NvbG9yIERyYWdEYXRhOjphc0NvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gQ29sb3IoKTsK
K30KKworfQorCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdp
bmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjBmODAKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbmNlLmNwcApAQCAtMCwwICsxLDYz
IEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgor
ICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1
dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJl
ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVk
IGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFs
b25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3Qs
IHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJh
bmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVT
QS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRyYWdJbWFnZS5o
IgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKKyNpbmNsdWRlICJJbWFnZS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3Bh
Y2UgV2ViQ29yZSB7CisKK0ludFNpemUgZHJhZ0ltYWdlU2l6ZShEcmFnSW1hZ2VSZWYpCit7Cisg
ICAgcmV0dXJuIEludFNpemUoMCwgMCk7Cit9CisKK3ZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJ
bWFnZVJlZiBpbWFnZSkKK3sKKyAgICBpZiAoaW1hZ2UpCisgICAgICAgIDo6RGVsZXRlT2JqZWN0
KGltYWdlKTsKK30KKworRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiwg
RmxvYXRTaXplKQoreworICAgIHJldHVybiAwOworfQorCitEcmFnSW1hZ2VSZWYgZGlzc29sdmVE
cmFnSW1hZ2VUb0ZyYWN0aW9uKERyYWdJbWFnZVJlZiBpbWFnZSwgZmxvYXQpCit7CisgICAgcmV0
dXJuIGltYWdlOworfQorCitEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKElt
YWdlKikKK3sKKyAgICByZXR1cm4gMDsKK30KKworRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFn
ZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFnZSopCit7CisgICAgcmV0dXJuIDA7Cit9CisK
K30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRWRpdG9yV2luY2UuY3BwIGIv
V2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uMDJhZjc4MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vd2luY2UvRWRpdG9yV2luY2UuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgQ29w
eXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMgbGli
cmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAq
ICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg
b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3Ry
aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhP
VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq
ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBk
ZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxp
YnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZp
ZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJFZGl0b3IuaCIKKworI2luY2x1ZGUgIkNs
aXBib2FyZFdpbmNlLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3JD
bGllbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiSHRtbEVkaXRpbmcuaCIK
KyNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCisK
KyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIF9TWVNfR1VJRF9PUEVSQVRPUlNfCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc1JlZlB0cjxDbGlwYm9hcmQ+IEVkaXRvcjo6bmV3R2Vu
ZXJhbENsaXBib2FyZChDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5KQoreworICAgIHJldHVy
biBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luY2UocG9saWN5LCBmYWxzZSkpOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0Zp
bGVDaG9vc2VyV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3Nlcldp
bmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M5OWIxCi0tLSAv
ZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNw
cApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRv
cmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
RmlsZUNob29zZXIuaCIKKworI2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNs
aWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNs
dWRlICJJY29uLmgiCisjaW5jbHVkZSAiTG9jYWxpemVkU3RyaW5ncy5oIgorI2luY2x1ZGUgIlBh
Z2UuaCIKKyNpbmNsdWRlICJTdHJpbmdUcnVuY2F0b3IuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitTdHJpbmcgcGF0aEdldEZpbGVOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCk7CisKK1N0cmlu
ZyBGaWxlQ2hvb3Nlcjo6YmFzZW5hbWVGb3JXaWR0aChjb25zdCBGb250JiBmb250LCBpbnQgd2lk
dGgpIGNvbnN0Cit7CisgICAgaWYgKHdpZHRoIDw9IDApCisgICAgICAgIHJldHVybiBTdHJpbmco
KTsKKworICAgIFN0cmluZyBzdHJpbmc7CisgICAgaWYgKG1fZmlsZW5hbWVzLmlzRW1wdHkoKSkK
KyAgICAgICAgc3RyaW5nID0gZmlsZUJ1dHRvbk5vRmlsZVNlbGVjdGVkTGFiZWwoKTsKKyAgICBl
bHNlIGlmIChtX2ZpbGVuYW1lcy5zaXplKCkgPT0gMSkgeworICAgICAgICBTdHJpbmcgdG1wRmls
ZW5hbWUgPSBtX2ZpbGVuYW1lc1swXTsKKyAgICAgICAgc3RyaW5nID0gcGF0aEdldEZpbGVOYW1l
KHRtcEZpbGVuYW1lKTsKKyAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRv
cjo6cmlnaHRUcnVuY2F0ZShTdHJpbmc6Om51bWJlcihtX2ZpbGVuYW1lcy5zaXplKCkpICsgIiBm
aWxlcyIsIHdpZHRoLCBmb250LCBmYWxzZSk7CisKKyAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9y
OjpjZW50ZXJUcnVuY2F0ZShzdHJpbmcsIHdpZHRoLCBmb250LCBmYWxzZSk7Cit9CisKK30KZGlm
ZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZVN5c3RlbVdpbmNlLmNwcCBiL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZVN5c3RlbVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEw
MDY0NAppbmRleCAwMDAwMDAwLi4yYmI0ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9w
bGF0Zm9ybS93aW5jZS9GaWxlU3lzdGVtV2luY2UuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAwOCBDb2xsYWJvcmEsIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4gCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4gCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5j
LiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5
IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBm
cm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Np
b24uIAorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBD
T05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMg
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICog
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhF
T1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJGaWxlU3lzdGVtLmgiCisKKyNpbmNsdWRlICJDU3RyaW5n
LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4K
KyNpbmNsdWRlIDx3aW5jcnlwdC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBi
b29sIGdldEZpbGVJbmZvKGNvbnN0IFN0cmluZyYgcGF0aCwgQllfSEFORExFX0ZJTEVfSU5GT1JN
QVRJT04mIGZpbGVJbmZvKQoreworICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7CisgICAgSEFO
RExFIGhGaWxlID0gQ3JlYXRlRmlsZShmaWxlbmFtZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5h
dGlvbigpLCBHRU5FUklDX1JFQUQsIEZJTEVfU0hBUkVfUkVBRCwgMAorICAgICAgICAsIE9QRU5f
RVhJU1RJTkcsIEZJTEVfRkxBR19OT19CVUZGRVJJTkcsIDApOworCisgICAgaWYgKGhGaWxlID09
IElOVkFMSURfSEFORExFX1ZBTFVFKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29s
IHJ0biA9IEdldEZpbGVJbmZvcm1hdGlvbkJ5SGFuZGxlKGhGaWxlLCAmZmlsZUluZm8pID8gdHJ1
ZSA6IGZhbHNlOworCisgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOworICAgIHJldHVybiBydG47Cit9
CisKK2Jvb2wgZ2V0RmlsZVNpemUoY29uc3QgU3RyaW5nJiBwYXRoLCBsb25nIGxvbmcmIHJlc3Vs
dCkKK3sKKyAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBmaWxlSW5mb3JtYXRpb247Cisg
ICAgaWYgKCFnZXRGaWxlSW5mbyhwYXRoLCBmaWxlSW5mb3JtYXRpb24pKQorICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICBVTEFSR0VfSU5URUdFUiBmaWxlU2l6ZTsKKyAgICBmaWxlU2l6ZS5M
b3dQYXJ0ID0gZmlsZUluZm9ybWF0aW9uLm5GaWxlU2l6ZUxvdzsKKyAgICBmaWxlU2l6ZS5IaWdo
UGFydCA9IGZpbGVJbmZvcm1hdGlvbi5uRmlsZVNpemVIaWdoOworCisgICAgcmVzdWx0ID0gZmls
ZVNpemUuUXVhZFBhcnQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBnZXRGaWxlTW9k
aWZpY2F0aW9uVGltZShjb25zdCBTdHJpbmcmIHBhdGgsIHRpbWVfdCYgcmVzdWx0KQoreworICAg
IEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGZpbGVJbmZvcm1hdGlvbjsKKyAgICBpZiAoIWdl
dEZpbGVJbmZvKHBhdGgsIGZpbGVJbmZvcm1hdGlvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgIFVMQVJHRV9JTlRFR0VSIHQ7CisgICAgbWVtY3B5KCZ0LCAmZmlsZUluZm9ybWF0aW9u
LmZ0TGFzdFdyaXRlVGltZSwgc2l6ZW9mKHQpKTsKKyAgICAKKyAgICByZXN1bHQgPSB0LlF1YWRQ
YXJ0ICogMC4wMDAwMDAxIC0gMTE2NDQ0NzM2MDAuMDsKKworICAgIHJldHVybiB0cnVlOworfQor
Citib29sIGZpbGVFeGlzdHMoY29uc3QgU3RyaW5nJiBwYXRoKSAKK3sKKyAgICBTdHJpbmcgZmls
ZW5hbWUgPSBwYXRoOworICAgIEhBTkRMRSBoRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUuY2hh
cmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgMCwgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9T
SEFSRV9XUklURQorICAgICAgICAsIDAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxBR19OT19CVUZG
RVJJTkcsIDApOworCisgICAgQ2xvc2VIYW5kbGUoaEZpbGUpOworCisgICAgcmV0dXJuIGhGaWxl
ICE9IElOVkFMSURfSEFORExFX1ZBTFVFOworfQorCitib29sIGRlbGV0ZUZpbGUoY29uc3QgU3Ry
aW5nJiBwYXRoKQoreworICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7CisgICAgcmV0dXJuICEh
RGVsZXRlRmlsZVcoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7Cit9
CisKKworYm9vbCBkZWxldGVFbXB0eURpcmVjdG9yeShjb25zdCBTdHJpbmcmIHBhdGgpCit7Cisg
ICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aDsKKyAgICByZXR1cm4gISFSZW1vdmVEaXJlY3RvcnlX
KGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworfQorCitTdHJpbmcg
cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KGNvbnN0IFN0cmluZyYgcGF0aCwgY29uc3QgU3RyaW5n
JiBjb21wb25lbnQpCit7CisgICAgaWYgKGNvbXBvbmVudC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybiBwYXRoOworCisgICAgVmVjdG9yPFVDaGFyLCBNQVhfUEFUSD4gYnVmZmVyOworCisgICAg
YnVmZmVyLmFwcGVuZChwYXRoLmNoYXJhY3RlcnMoKSwgcGF0aC5sZW5ndGgoKSk7CisKKyAgICBp
ZiAoYnVmZmVyLmxhc3QoKSAhPSBMJ1xcJyAmJiBidWZmZXIubGFzdCgpICE9IEwnLycKKyAgICAg
ICAgJiYgY29tcG9uZW50WzBdICE9IEwnXFwnICYmIGNvbXBvbmVudFswXSAhPSBMJy8nKQorICAg
ICAgICBidWZmZXIuYXBwZW5kKEwnXFwnKTsKKworICAgIGJ1ZmZlci5hcHBlbmQoY29tcG9uZW50
LmNoYXJhY3RlcnMoKSwgY29tcG9uZW50Lmxlbmd0aCgpKTsKKworICAgIHJldHVybiBTdHJpbmco
YnVmZmVyLmRhdGEoKSwgYnVmZmVyLnNpemUoKSk7Cit9CisKK0NTdHJpbmcgZmlsZVN5c3RlbVJl
cHJlc2VudGF0aW9uKGNvbnN0IFN0cmluZyYpCit7CisgICAgcmV0dXJuICIiOworfQorCitib29s
IG1ha2VBbGxEaXJlY3Rvcmllcyhjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgaW50IGxhc3RE
aXZQb3MgPSBtYXgocGF0aC5yZXZlcnNlRmluZCgnLycpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcp
KTsKKyAgICBpbnQgZW5kUG9zID0gcGF0aC5sZW5ndGgoKTsKKyAgICBpZiAobGFzdERpdlBvcyA9
PSBwYXRoLmxlbmd0aCgpIC0gMSkgeworICAgICAgICBlbmRQb3MgLT0gMTsKKyAgICAgICAgbGFz
dERpdlBvcyA9IG1heChwYXRoLnJldmVyc2VGaW5kKCcvJywgbGFzdERpdlBvcyksIHBhdGgucmV2
ZXJzZUZpbmQoJ1xcJywgbGFzdERpdlBvcykpOworICAgIH0KKworICAgIGlmIChsYXN0RGl2UG9z
ID4gMCkgeworICAgICAgICBpZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhwYXRoLnN1YnN0cmluZygw
LCBsYXN0RGl2UG9zKSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAg
U3RyaW5nIGZvbGRlcihwYXRoLnN1YnN0cmluZygwLCBlbmRQb3MpKTsKKyAgICBDcmVhdGVEaXJl
Y3RvcnkoZm9sZGVyLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIDApOworCisgICAg
RFdPUkQgZmlsZUF0dHIgPSBHZXRGaWxlQXR0cmlidXRlcyhmb2xkZXIuY2hhcmFjdGVyc1dpdGhO
dWxsVGVybWluYXRpb24oKSk7CisgICAgcmV0dXJuIGZpbGVBdHRyICE9IDB4RkZGRkZGRkYgJiYg
KGZpbGVBdHRyICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKTsKK30KKworU3RyaW5nIGhvbWVE
aXJlY3RvcnlQYXRoKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAiIjsK
K30KKworU3RyaW5nIHBhdGhHZXRGaWxlTmFtZShjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAg
cmV0dXJuIHBhdGguc3Vic3RyaW5nKG1heChwYXRoLnJldmVyc2VGaW5kKCcvJyksIHBhdGgucmV2
ZXJzZUZpbmQoJ1xcJykpICsgMSk7Cit9CisKK1N0cmluZyBkaXJlY3RvcnlOYW1lKGNvbnN0IFN0
cmluZyYgcGF0aCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJpbmco
KTsKK30KKworQ1N0cmluZyBvcGVuVGVtcG9yYXJ5RmlsZShjb25zdCBjaGFyKiwgUGxhdGZvcm1G
aWxlSGFuZGxlJiBoYW5kbGUpCit7CisgICAgaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7
CisKKyAgICB3Y2hhcl90IHRlbXBQYXRoW01BWF9QQVRIXTsKKyAgICBpbnQgdGVtcFBhdGhMZW5n
dGggPSA6OkdldFRlbXBQYXRoKF9jb3VudG9mKHRlbXBQYXRoKSwgdGVtcFBhdGgpOworICAgIGlm
ICh0ZW1wUGF0aExlbmd0aCA8PSAwIHx8IHRlbXBQYXRoTGVuZ3RoID4gX2NvdW50b2YodGVtcFBh
dGgpKQorICAgICAgICByZXR1cm4gQ1N0cmluZygpOworCisgICAgSENSWVBUUFJPViBoQ3J5cHRQ
cm92ID0gMDsKKyAgICBpZiAoIUNyeXB0QWNxdWlyZUNvbnRleHQoJmhDcnlwdFByb3YsIDAsIDAs
IFBST1ZfUlNBX0ZVTEwsIENSWVBUX1ZFUklGWUNPTlRFWFQpKQorICAgICAgICByZXR1cm4gQ1N0
cmluZygpOworCisgICAgU3RyaW5nIHByb3Bvc2VkUGF0aDsKKyAgICB3aGlsZSAoMSkgeworCisg
ICAgICAgIHdjaGFyX3QgdGVtcEZpbGVbXSA9IEwiWFhYWFhYWFgudG1wIjsgLy8gVXNlIDguMyBz
dHlsZSBuYW1lIChtb3JlIGNoYXJhY3RlcnMgYXJlbid0IGhlbHBmdWwgZHVlIHRvIDguMyBzaG9y
dCBmaWxlIG5hbWVzKQorICAgICAgICBjb25zdCBpbnQgcmFuZG9tUGFydExlbmd0aCA9IDg7Cisg
ICAgICAgIGlmICghQ3J5cHRHZW5SYW5kb20oaENyeXB0UHJvdiwgcmFuZG9tUGFydExlbmd0aCAq
IDIsIHJlaW50ZXJwcmV0X2Nhc3Q8QllURSo+KHRlbXBGaWxlKSkpCisgICAgICAgICAgICBicmVh
azsKKworICAgICAgICAvLyBMaW1pdCB0byB2YWxpZCBmaWxlc3lzdGVtIGNoYXJhY3RlcnMsIGFs
c28gZXhjbHVkaW5nIG90aGVycyB0aGF0IGNvdWxkIGJlIHByb2JsZW1hdGljLCBsaWtlIHB1bmN0
dWF0aW9uLgorICAgICAgICAvLyBkb24ndCBpbmNsdWRlIGJvdGggdXBwZXIgYW5kIGxvd2VyY2Fz
ZSBzaW5jZSBXaW5kb3dzIGZpbGUgc3lzdGVtcyBhcmUgdHlwaWNhbGx5IG5vdCBjYXNlIHNlbnNp
dGl2ZS4KKyAgICAgICAgY29uc3QgY2hhciB2YWxpZENoYXJzW10gPSAiMDEyMzQ1Njc4OWFiY2Rl
ZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5k
b21QYXJ0TGVuZ3RoOyArK2kpCisgICAgICAgICAgICB0ZW1wRmlsZVtpXSA9IHZhbGlkQ2hhcnNb
dGVtcEZpbGVbaV0gJSAoc2l6ZW9mKHZhbGlkQ2hhcnMpIC0gMSldOworCisgICAgICAgIEFTU0VS
VCh3Y3NsZW4odGVtcEZpbGUpICogMiA9PSBzaXplb2YodGVtcEZpbGUpIC0gMik7CisKKyAgICAg
ICAgcHJvcG9zZWRQYXRoID0gcGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KFN0cmluZyh0ZW1wUGF0
aCksIFN0cmluZyh0ZW1wRmlsZSkpOworCisgICAgICAgIC8vIHVzZSBDUkVBVEVfTkVXIHRvIGF2
b2lkIG92ZXJ3cml0aW5nIGFuIGV4aXN0aW5nIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lCisgICAg
ICAgIGhhbmRsZSA9IENyZWF0ZUZpbGUocHJvcG9zZWRQYXRoLmNoYXJhY3RlcnNXaXRoTnVsbFRl
cm1pbmF0aW9uKCksIEdFTkVSSUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsIDAsIDAsIENSRUFURV9O
RVcsIEZJTEVfQVRUUklCVVRFX05PUk1BTCwgMCk7CisgICAgICAgIGlmICghaXNIYW5kbGVWYWxp
ZChoYW5kbGUpICYmIEdldExhc3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAg
ICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQ3J5cHRS
ZWxlYXNlQ29udGV4dChoQ3J5cHRQcm92LCAwKTsKKworICAgIGlmICghaXNIYW5kbGVWYWxpZCho
YW5kbGUpKQorICAgICAgICByZXR1cm4gQ1N0cmluZygpOworCisgICAgcmV0dXJuIHByb3Bvc2Vk
UGF0aC5sYXRpbjEoKTsKK30KKwordm9pZCBjbG9zZUZpbGUoUGxhdGZvcm1GaWxlSGFuZGxlJiBo
YW5kbGUpCit7CisgICAgaWYgKGlzSGFuZGxlVmFsaWQoaGFuZGxlKSkgeworICAgICAgICA6OkNs
b3NlSGFuZGxlKGhhbmRsZSk7CisgICAgICAgIGhhbmRsZSA9IGludmFsaWRQbGF0Zm9ybUZpbGVI
YW5kbGU7CisgICAgfQorfQorCitpbnQgd3JpdGVUb0ZpbGUoUGxhdGZvcm1GaWxlSGFuZGxlIGhh
bmRsZSwgY29uc3QgY2hhciogZGF0YSwgaW50IGxlbmd0aCkKK3sKKyAgICBpZiAoIWlzSGFuZGxl
VmFsaWQoaGFuZGxlKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgRFdPUkQgYnl0ZXNXcml0
dGVuOworICAgIGJvb2wgc3VjY2VzcyA9IFdyaXRlRmlsZShoYW5kbGUsIGRhdGEsIGxlbmd0aCwg
JmJ5dGVzV3JpdHRlbiwgMCk7CisKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIHJldHVybiAt
MTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihieXRlc1dyaXR0ZW4pOworfQorCitib29s
IHVubG9hZE1vZHVsZShQbGF0Zm9ybU1vZHVsZSBtb2R1bGUpCit7CisgICAgcmV0dXJuIDo6RnJl
ZUxpYnJhcnkobW9kdWxlKTsKK30KKworU3RyaW5nIGxvY2FsVXNlclNwZWNpZmljU3RvcmFnZURp
cmVjdG9yeSgpCit7CisgICAgcmV0dXJuIFN0cmluZyhMIlxcIik7Cit9CisKK1N0cmluZyByb2Ft
aW5nVXNlclNwZWNpZmljU3RvcmFnZURpcmVjdG9yeSgpCit7CisgICAgcmV0dXJuIFN0cmluZyhM
IlxcIik7Cit9CisKK1ZlY3RvcjxTdHJpbmc+IGxpc3REaXJlY3RvcnkoY29uc3QgU3RyaW5nJiBw
YXRoLCBjb25zdCBTdHJpbmcmIGZpbHRlcikKK3sKKyAgICBWZWN0b3I8U3RyaW5nPiBlbnRyaWVz
OworCisgICAgVmVjdG9yPFVDaGFyLCAyNTY+IHBhdHRlcm47CisgICAgcGF0dGVybi5hcHBlbmQo
cGF0aC5jaGFyYWN0ZXJzKCksIHBhdGgubGVuZ3RoKCkpOworICAgIGlmIChwYXR0ZXJuLmxhc3Qo
KSAhPSBMJy8nICYmIHBhdHRlcm4ubGFzdCgpICE9IEwnXFwnKQorICAgICAgICBwYXR0ZXJuLmFw
cGVuZChMJ1xcJyk7CisKKyAgICBTdHJpbmcgcm9vdChwYXR0ZXJuLmRhdGEoKSwgcGF0dGVybi5z
aXplKCkpOworICAgIHBhdHRlcm4uYXBwZW5kKGZpbHRlci5jaGFyYWN0ZXJzKCksIGZpbHRlci5s
ZW5ndGgoKSk7CisgICAgcGF0dGVybi5hcHBlbmQoMCk7CisKKyAgICBXSU4zMl9GSU5EX0RBVEEg
ZmluZERhdGE7CisgICAgSEFORExFIGhGaW5kID0gRmluZEZpcnN0RmlsZShwYXR0ZXJuLmRhdGEo
KSwgJmZpbmREYXRhKTsKKyAgICBpZiAoSU5WQUxJRF9IQU5ETEVfVkFMVUUgIT0gaEZpbmQpIHsK
KyAgICAgICAgZG8geworICAgICAgICAgICAgLy8gRklYRU1FOiBzaG91bGQgd2UgYWxzbyBhZGQg
dGhlIGZvbGRlcnM/IFRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgIC8vIGlzIHNvIGZhciBvbmx5
IGNhbGxlZCBieSBQbHVnaW5EYXRhYmFzZS5jcHAgdG8gbGlzdAorICAgICAgICAgICAgLy8gYWxs
IHBsdWdpbnMgaW4gYSBmb2xkZXIsIHdoZXJlIGl0J3Mgbm90IHN1cHBvc2VkIHRvIGxpc3Qgc3Vi
LWZvbGRlcnMuCisgICAgICAgICAgICBpZiAoIShmaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYg
RklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkKKyAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVu
ZChyb290ICsgZmluZERhdGEuY0ZpbGVOYW1lKTsKKyAgICAgICAgfSB3aGlsZSAoRmluZE5leHRG
aWxlKGhGaW5kLCAmZmluZERhdGEpKTsKKyAgICAgICAgRmluZENsb3NlKGhGaW5kKTsKKyAgICB9
CisKKyAgICByZXR1cm4gZW50cmllczsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9LVVJMV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2lu
Y2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTFlNGIKLS0tIC9k
ZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHAKQEAgLTAs
MCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiS1VSTC5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK1N0cmluZyBLVVJMOjpmaWxlU3lzdGVtUGF0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IHBhdGgoKTsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LZXln
ZW5XaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDMzMzM4Ci0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LZXlnZW5XaW5jZS5jcHAKQEAgLTAsMCArMSwxNDMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU1NMS2V5R2VuZXJhdG9yLmgiCisKKyNpbmNsdWRl
ICJCYXNlNjQuaCIKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+
CisjaW5jbHVkZSA8d2luY3J5cHQuaD4KKworI2RlZmluZSBLRVlHRU5fREVCVUdfS0VZICAgICAg
ICAweDAwMDAwMDAxCisKKyNpZm5kZWYgTkRFQlVHCisjZGVmaW5lIEtFWUdFTl9ERUJVRyAgICAo
MCkKKyNlbHNlCisjZGVmaW5lIEtFWUdFTl9ERUJVRyAgICAwCisjZW5kaWYKKworbmFtZXNwYWNl
IFdlYkNvcmUgeworCit2b2lkIFdlYkNvcmU6OmdldFN1cHBvcnRlZEtleVNpemVzKFZlY3RvcjxT
dHJpbmc+JiB2KQoreworICAgIHYuYXBwZW5kKCJIaWdoIEdyYWRlIik7CisgICAgdi5hcHBlbmQo
Ik1lZGl1bSBHcmFkZSIpOworfQorCitTdHJpbmcgV2ViQ29yZTo6c2lnbmVkUHVibGljS2V5QW5k
Q2hhbGxlbmdlU3RyaW5nKHVuc2lnbmVkIGluZGV4LCBjb25zdCBTdHJpbmcmIGNoYWxsZW5nZSwg
Y29uc3QgS1VSTCYgdXJsKQoreworICAgIFN0cmluZyBrZXlzdHI7CisKKyAgICBIQ1JZUFRQUk9W
IGhQcm92ID0gMDsKKyAgICBIQ1JZUFRLRVkgaEtleSA9IDA7CisgICAgUENFUlRfUFVCTElDX0tF
WV9JTkZPIHBQdWJJbmZvID0gMDsKKyAgICBEV09SRCBkd1B1YkluZm9MZW5ndGggPSAwOworICAg
IENFUlRfS0VZR0VOX1JFUVVFU1RfSU5GTyByZXF1ZXN0SW5mbzsKKyAgICBDUllQVF9BTEdPUklU
SE1fSURFTlRJRklFUiBzaWduQWxnbzsKKyAgICBMUEJZVEUgcGJFbmNvZGVkID0gMDsKKyAgICBE
V09SRCBkd0VuY29kZWRMZW5ndGggPSAwOworICAgIExQV1NUUiBwc3pTdHJpbmcgPSAwOworICAg
IFZlY3RvcjxjaGFyPiBiaW5hcnk7CisgICAgVmVjdG9yPGNoYXI+IGJhc2U2NDsKKworI2lmIGRl
ZmluZWQoS0VZR0VOX0RFQlVHKSAmJiAoS0VZR0VOX0RFQlVHICYgS0VZR0VOX0RFQlVHX0tFWSkK
KyAgICBwcmludGYoIldlYkNvcmU6OnNpZ25lZFB1YmxpY0tleUFuZENoYWxsZW5nZVN0cmluZygl
ZCwgJS4qcykuXG4iLCBpbmRleCwgY2hhbGxlbmdlLmxlbmd0aCgpLCBjaGFsbGVuZ2UubGF0aW4x
KCkuZGF0YSgpKTsKKyNlbmRpZgorCisgICAgLy8gVHJ5IHRvIGRlbGV0ZSBvZiBpdCBleGlzdHMg
YWxyZWFkeQorICAgIENyeXB0QWNxdWlyZUNvbnRleHQoJmhQcm92LCBfVCgia2V5Z2VuX2NvbnRh
aW5lciIpLCBNU19FTkhBTkNFRF9QUk9WLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9ERUxFVEVLRVlT
RVQpOworCisgICAgQk9PTCBzdWNjZXNzID0gQ3J5cHRBY3F1aXJlQ29udGV4dCgmaFByb3YsIF9U
KCJrZXlnZW5fY29udGFpbmVyIiksIE1TX0VOSEFOQ0VEX1BST1YsIFBST1ZfUlNBX0ZVTEwsIENS
WVBUX05FV0tFWVNFVCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICBnb3RvIGVycm9yOwor
CisgICAgc3VjY2VzcyA9IENyeXB0R2VuS2V5KGhQcm92LCBBVF9LRVlFWENIQU5HRSwgMCwgJmhL
ZXkpOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHN1Y2Nl
c3MgPSBDcnlwdEV4cG9ydFB1YmxpY0tleUluZm8oaFByb3YsIEFUX0tFWUVYQ0hBTkdFLCBYNTA5
X0FTTl9FTkNPRElORywgMCwgJmR3UHViSW5mb0xlbmd0aCk7CisgICAgaWYgKCFzdWNjZXNzKQor
ICAgICAgICBnb3RvIGVycm9yOworCisgICAgcFB1YkluZm8gPSAoUENFUlRfUFVCTElDX0tFWV9J
TkZPKSBuZXcgY2hhcltkd1B1YkluZm9MZW5ndGhdOworICAgIGlmICghcFB1YkluZm8pCisgICAg
ICAgIGdvdG8gZXJyb3I7CisKKyAgICBzdWNjZXNzID0gQ3J5cHRFeHBvcnRQdWJsaWNLZXlJbmZv
KGhQcm92LCBBVF9LRVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIHBQdWJJbmZvLCAmZHdQ
dWJJbmZvTGVuZ3RoKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIGdvdG8gZXJyb3I7CisK
KyAgICByZXF1ZXN0SW5mby5kd1ZlcnNpb24gPSBDRVJUX0tFWUdFTl9SRVFVRVNUX1YxOworICAg
IHJlcXVlc3RJbmZvLnB3c3pDaGFsbGVuZ2VTdHJpbmcgPSBMIiI7CisgICAgcmVxdWVzdEluZm8u
U3ViamVjdFB1YmxpY0tleUluZm8gPSAqcFB1YkluZm87CisKKyAgICBpZiAoY2hhbGxlbmdlLmxl
bmd0aCgpKSB7CisgICAgICAgIHBzelN0cmluZyA9IG5ldyBXQ0hBUltjaGFsbGVuZ2UubGVuZ3Ro
KCkgKyAxXTsKKyAgICAgICAgaWYgKHBzelN0cmluZykgeworICAgICAgICAgICAgd2NzbmNweShw
c3pTdHJpbmcsIGNoYWxsZW5nZS5jaGFyYWN0ZXJzKCksIGNoYWxsZW5nZS5sZW5ndGgoKSk7Cisg
ICAgICAgICAgICBwc3pTdHJpbmdbY2hhbGxlbmdlLmxlbmd0aCgpXSA9IDA7CisgICAgICAgICAg
ICByZXF1ZXN0SW5mby5wd3N6Q2hhbGxlbmdlU3RyaW5nID0gcHN6U3RyaW5nOworICAgICAgICB9
CisgICAgfQorCisgICAgU2VjdXJlWmVyb01lbW9yeSgmc2lnbkFsZ28sIHNpemVvZihDUllQVF9B
TEdPUklUSE1fSURFTlRJRklFUikpOworICAgIHNpZ25BbGdvLnBzek9iaklkID0gc3pPSURfUlNB
X1NIQTFSU0E7CisKKyAgICBzdWNjZXNzID0gQ3J5cHRTaWduQW5kRW5jb2RlQ2VydGlmaWNhdGUo
aFByb3YsIEFUX0tFWUVYQ0hBTkdFLCBYNTA5X0FTTl9FTkNPRElORywgWDUwOV9LRVlHRU5fUkVR
VUVTVF9UT19CRV9TSUdORUQsCisgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0SW5mbywgJnNp
Z25BbGdvLCAwLCAwLCAmZHdFbmNvZGVkTGVuZ3RoKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAg
ICAgIGdvdG8gZXJyb3I7CisKKyAgICBwYkVuY29kZWQgPSAoTFBCWVRFKSBuZXcgY2hhcltkd0Vu
Y29kZWRMZW5ndGhdOworICAgIGlmICghcGJFbmNvZGVkKQorICAgICAgICBnb3RvIGVycm9yOwor
CisgICAgc3VjY2VzcyA9IENyeXB0U2lnbkFuZEVuY29kZUNlcnRpZmljYXRlKGhQcm92LCBBVF9L
RVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIFg1MDlfS0VZR0VOX1JFUVVFU1RfVE9fQkVf
U0lHTkVELAorICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdEluZm8sICZzaWduQWxnbywgMCwg
cGJFbmNvZGVkLCAmZHdFbmNvZGVkTGVuZ3RoKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAg
IGdvdG8gZXJyb3I7CisKKyAgICBiaW5hcnkucmVzaXplKGR3RW5jb2RlZExlbmd0aCk7CisgICAg
Zm9yIChEV09SRCBpID0gMDsgaSA8IGR3RW5jb2RlZExlbmd0aDsgKytpKQorICAgICAgICBiaW5h
cnlbaV0gPSBwYkVuY29kZWRbaV07CisKKyAgICBiYXNlNjRFbmNvZGUoYmluYXJ5LCBiYXNlNjQp
OworICAgIGlmIChiYXNlNjQuc2l6ZSgpKSB7CisgICAgICAgIFN0cmluZyB0ZW1wc3RyKGJhc2U2
NC5kYXRhKCksIGJhc2U2NC5zaXplKCkpOworICAgICAgICBrZXlzdHIuaW5zZXJ0KHRlbXBzdHIs
IDApOworICAgIH0KKworZXJyb3I6CisgICAgaWYgKHBzelN0cmluZykKKyAgICAgICAgZGVsZXRl
W10gcHN6U3RyaW5nOworICAgIGlmIChwYkVuY29kZWQpCisgICAgICAgIGRlbGV0ZVtdIHBiRW5j
b2RlZDsKKyAgICBpZiAocFB1YkluZm8pCisgICAgICAgIGRlbGV0ZVtdIHBQdWJJbmZvOworICAg
IGlmIChoS2V5KQorICAgICAgICBDcnlwdERlc3Ryb3lLZXkoaEtleSk7CisgICAgaWYgKGhQcm92
KQorICAgICAgICBDcnlwdFJlbGVhc2VDb250ZXh0KGhQcm92LCAwKTsKKworICAgIHJldHVybiBr
ZXlzdHI7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi4yZWNkZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2UuY3BwCkBAIC0wLDAgKzEsMTM1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLwor
CisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3RyeS5oIgorCisj
aW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbnJlZy5oPgorCituYW1lc3BhY2UgV2Vi
Q29yZSB7CisKK3N0YXRpYyBTdHJpbmcgbWltZVR5cGVGb3JFeHRlbnNpb24oY29uc3QgU3RyaW5n
JiBleHRlbnNpb24pCit7CisgICAgU3RyaW5nIGV4dCA9ICIuIiArIGV4dGVuc2lvbjsKKyAgICBX
Q0hBUiBjb250ZW50VHlwZVN0clsyNTZdOworICAgIERXT1JEIGNvbnRlbnRUeXBlU3RyTGVuID0g
c2l6ZW9mKGNvbnRlbnRUeXBlU3RyKTsKKyAgICBEV09SRCB2YWx1ZVR5cGU7CisKKyAgICBIS0VZ
IGtleTsKKyAgICBTdHJpbmcgcmVzdWx0OworICAgIGlmIChFUlJPUl9TVUNDRVNTICE9IFJlZ09w
ZW5LZXlFeChIS0VZX0NMQVNTRVNfUk9PVCwgZXh0LmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0
aW9uKCksIDAsIDAsICZrZXkpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgaWYgKEVS
Uk9SX1NVQ0NFU1MgPT0gUmVnUXVlcnlWYWx1ZUV4KGtleSwgTCJDb250ZW50IFR5cGUiLCAwLCAm
dmFsdWVUeXBlLCAoTFBCWVRFKWNvbnRlbnRUeXBlU3RyLCAmY29udGVudFR5cGVTdHJMZW4pICYm
IHZhbHVlVHlwZSA9PSBSRUdfU1opCisgICAgICAgIHJlc3VsdCA9IFN0cmluZyhjb250ZW50VHlw
ZVN0ciwgY29udGVudFR5cGVTdHJMZW4gLyBzaXplb2YoY29udGVudFR5cGVTdHJbMF0pIC0gMSk7
CisKKyAgICBSZWdDbG9zZUtleShrZXkpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3Rh
dGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1pbWV0eXBlTWFwOworCitzdGF0aWMgdm9pZCBp
bml0TUlNRVR5cGVFbnRlbnNpb25NYXAoKQoreworICAgIGlmIChtaW1ldHlwZU1hcC5pc0VtcHR5
KCkpIHsKKyAgICAgICAgLy9maWxsIHdpdGggaW5pdGlhbCB2YWx1ZXMKKyAgICAgICAgbWltZXR5
cGVNYXAuYWRkKCJ0eHQiLCAidGV4dC9wbGFpbiIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQo
InBkZiIsICJhcHBsaWNhdGlvbi9wZGYiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJwcyIs
ICJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0Iik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgiaHRt
bCIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJodG0iLCAidGV4dC9o
dG1sIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgieG1sIiwgInRleHQveG1sIik7CisgICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgieHNsIiwgInRleHQveHNsIik7CisgICAgICAgIG1pbWV0eXBl
TWFwLmFkZCgianMiLCAiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iik7CisgICAgICAgIG1pbWV0
eXBlTWFwLmFkZCgieGh0bWwiLCAiYXBwbGljYXRpb24veGh0bWwreG1sIik7CisgICAgICAgIG1p
bWV0eXBlTWFwLmFkZCgicnNzIiwgImFwcGxpY2F0aW9uL3Jzcyt4bWwiKTsKKyAgICAgICAgbWlt
ZXR5cGVNYXAuYWRkKCJ3ZWJhcmNoaXZlIiwgImFwcGxpY2F0aW9uL3gtd2ViYXJjaGl2ZSIpOwor
ICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInN2ZyIsICJpbWFnZS9zdmcreG1sIik7CisgICAgICAg
IG1pbWV0eXBlTWFwLmFkZCgic3ZneiIsICJpbWFnZS9zdmcreG1sIik7CisgICAgICAgIG1pbWV0
eXBlTWFwLmFkZCgianBnIiwgImltYWdlL2pwZWciKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRk
KCJqcGVnIiwgImltYWdlL2pwZWciKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJwbmciLCAi
aW1hZ2UvcG5nIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgidGlmIiwgImltYWdlL3RpZmYi
KTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ0aWZmIiwgImltYWdlL3RpZmYiKTsKKyAgICAg
ICAgbWltZXR5cGVNYXAuYWRkKCJpY28iLCAiaW1hZ2UvaWNvIik7CisgICAgICAgIG1pbWV0eXBl
TWFwLmFkZCgiY3VyIiwgImltYWdlL2ljbyIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImJt
cCIsICJpbWFnZS9ibXAiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJjc3MiLCAidGV4dC9j
c3MiKTsKKyAgICAgICAgLy8gRklYTUU6IEN1c3RvbSBmb250IHdvcmtzIG9ubHkgd2hlbiBNSU1F
IGlzICJ0ZXh0L3BsYWluIgorICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInR0ZiIsICJ0ZXh0L3Bs
YWluIik7IC8vICJmb250L3R0ZiIKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJvdGYiLCAidGV4
dC9wbGFpbiIpOyAvLyAiZm9udC9vdGYiCisjaWYgRU5BQkxFKFdNTCkKKyAgICAgICAgbWltZXR5
cGVNYXAuYWRkKCJ3bWwiLCAidGV4dC92bmQud2FwLndtbCIpOworI2VuZGlmCisjaWYgRU5BQkxF
KFdCWE1MKQorICAgICAgICBtaW1ldHlwZU1hcC5hZGQoIndieG1sIiwgImFwcGxpY2F0aW9uL3Zu
ZC53YXAud21sYyIpOworI2VuZGlmCisgICAgfQorfQorCitTdHJpbmcgTUlNRVR5cGVSZWdpc3Ry
eTo6Z2V0UHJlZmVycmVkRXh0ZW5zaW9uRm9yTUlNRVR5cGUoY29uc3QgU3RyaW5nJiB0eXBlKQor
eworICAgIGlmICh0eXBlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisg
ICAgLy8gQXZvaWQgY29uZmxpY3RzIHdpdGggInR0ZiIgYW5kICJvdGYiCisgICAgaWYgKGVxdWFs
SWdub3JpbmdDYXNlKHR5cGUsICJ0ZXh0L3BsYWluIikpCisgICAgICAgIHJldHVybiAidHh0IjsK
KworICAgIGluaXRNSU1FVHlwZUVudGVuc2lvbk1hcCgpOworCisgICAgZm9yIChIYXNoTWFwPFN0
cmluZywgU3RyaW5nPjo6aXRlcmF0b3IgaSA9IG1pbWV0eXBlTWFwLmJlZ2luKCk7IGkgIT0gbWlt
ZXR5cGVNYXAuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoaS0+
c2Vjb25kLCB0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBpLT5maXJzdDsKKyAgICB9CisKKyNp
ZiBFTkFCTEUoWEhUTUxNUCkKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoImFwcGxpY2F0aW9u
L3ZuZC53YXAueGh0bWwreG1sIiwgdHlwZSkpCisgICAgICAgIHJldHVybiBTdHJpbmcoInhtbCIp
OworI2VuZGlmCisKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK1N0cmluZyBNSU1FVHlwZVJl
Z2lzdHJ5OjpnZXRNSU1FVHlwZUZvckV4dGVuc2lvbihjb25zdCBTdHJpbmcgJmV4dCkKK3sKKyAg
ICBpZiAoZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworCisgICAgaW5p
dE1JTUVUeXBlRW50ZW5zaW9uTWFwKCk7CisKKyAgICBTdHJpbmcgcmVzdWx0ID0gbWltZXR5cGVN
YXAuZ2V0KGV4dC5sb3dlcigpKTsKKyAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkgeworICAgICAg
ICByZXN1bHQgPSBtaW1lVHlwZUZvckV4dGVuc2lvbihleHQpOworICAgICAgICBpZiAoIXJlc3Vs
dC5pc0VtcHR5KCkpCisgICAgICAgICAgICBtaW1ldHlwZU1hcC5hZGQoZXh0LCByZXN1bHQpOwor
ICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LmlzRW1wdHkoKSA/ICJ1bmtub3duL3Vua25vd24iIDog
cmVzdWx0OworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL09wdGlt
aXplZEJ1ZmZlci5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL09wdGltaXplZEJ1ZmZlci5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwODI1OAotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmNwcApAQCAt
MCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxl
IEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisg
Ki8KKworI2RlZmluZSBFWFBPUlRfT1BUSU1JWkVEX0JVRkZFUiBfX2RlY2xzcGVjKGRsbGV4cG9y
dCkKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIk9wdGltaXplZEJ1ZmZlci5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK09wdGltaXplZEJ1ZmZlcjo6Q3JlYXRvciBPcHRpbWl6
ZWRCdWZmZXI6Om1fY3JlYXRvciA9IDA7CisKK09wdGltaXplZEJ1ZmZlcjo6Q3JlYXRvciBPcHRp
bWl6ZWRCdWZmZXI6OnNldENyZWF0b3IoQ3JlYXRvciBuZXdDcmVhdG9yKQoreworICAgIENyZWF0
b3Igb2xkQ3JlYXRvciA9IG1fY3JlYXRvcjsKKyAgICBtX2NyZWF0b3IgPSBuZXdDcmVhdG9yOwor
ICAgIHJldHVybiBvbGRDcmVhdG9yOworfQorCitPcHRpbWl6ZWRCdWZmZXIqIE9wdGltaXplZEJ1
ZmZlcjo6Y3JlYXRlSW5zdGFuY2UodW5zaWduZWQgZXhwZWN0ZWRTaXplLCBPcHRpbWl6ZWRCdWZm
ZXIqIG9sZEJ1ZmZlciwgYm9vbCBwdXJnZWFibGUpCit7CisgICAgcmV0dXJuIG1fY3JlYXRvciA/
IG1fY3JlYXRvcihleHBlY3RlZFNpemUsIG9sZEJ1ZmZlciwgcHVyZ2VhYmxlKSA6IDA7Cit9CisK
K3ZvaWQgT3B0aW1pemVkQnVmZmVyOjpjb3B5VG8oT3B0aW1pemVkQnVmZmVyJiBvKSBjb25zdAor
eworICAgIG8uY2xlYXIoKTsKKyAgICBjb25zdCBjaGFyKiBkYXRhOworICAgIHVuc2lnbmVkIHBv
cyA9IDA7CisgICAgd2hpbGUgKHVuc2lnbmVkIGxlbiA9IGdldERhdGEoJmRhdGEsIHBvcykpIHsK
KyAgICAgICAgby5hcHBlbmQoZGF0YSwgbGVuKTsKKyAgICAgICAgcG9zICs9IGxlbjsKKyAgICAg
ICAgcmVsZWFzZURhdGEoZGF0YSk7CisgICAgfQorfQorCit2b2lkIE9wdGltaXplZEJ1ZmZlcjo6
Y29weUZyb20oY29uc3QgT3B0aW1pemVkQnVmZmVyJiBvKQoreworICAgIGNsZWFyKCk7CisgICAg
Y29uc3QgY2hhciogZGF0YTsKKyAgICB1bnNpZ25lZCBwb3MgPSAwOworICAgIHdoaWxlICh1bnNp
Z25lZCBsZW4gPSBvLmdldERhdGEoJmRhdGEsIHBvcykpIHsKKyAgICAgICAgYXBwZW5kKGRhdGEs
IGxlbik7CisgICAgICAgIHBvcyArPSBsZW47CisgICAgICAgIHJlbGVhc2VEYXRhKGRhdGEpOwor
ICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9w
bGF0Zm9ybS93aW5jZS9PcHRpbWl6ZWRCdWZmZXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2Uv
T3B0aW1pemVkQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3
Zjk0OAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvT3B0aW1pemVk
QnVmZmVyLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5
IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7
IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVi
bGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0
IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElC
LiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5j
LiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaWZuZGVmIF9PUFRJTUlaRURfQlVG
RkVSX0hfCisjZGVmaW5lIF9PUFRJTUlaRURfQlVGRkVSX0hfCisKKyNpZm5kZWYgRVhQT1JUX09Q
VElNSVpFRF9CVUZGRVIKKyNkZWZpbmUgRVhQT1JUX09QVElNSVpFRF9CVUZGRVIKKyNlbmRpZgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBFWFBPUlRfT1BUSU1JWkVEX0JVRkZF
UiBPcHRpbWl6ZWRCdWZmZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgYm9vbCBpc0VtcHR5KCkg
Y29uc3QgeyByZXR1cm4gIW1fc2l6ZTsgfQorICAgICAgICB1bnNpZ25lZCBzaXplKCkgY29uc3Qg
eyByZXR1cm4gbV9zaXplOyB9CisgICAgICAgIHZpcnR1YWwgY29uc3QgY2hhciogY2xhc3NOYW1l
KCkgY29uc3QgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2VsZkRlbGV0ZSgpID0gMDsKKyAg
ICAgICAgdmlydHVhbCB2b2lkIGNsZWFyKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgYXBw
ZW5kKGNvbnN0IGNoYXIqIGRhdGEsIHVuc2lnbmVkIGxlbikgPSAwOworICAgICAgICB2aXJ0dWFs
IHZvaWQgcHJlcGVuZChjb25zdCBjaGFyKiBkYXRhLCB1bnNpZ25lZCBsZW4pID0gMDsKKyAgICAg
ICAgdmlydHVhbCB1bnNpZ25lZCBnZXREYXRhKGNvbnN0IGNoYXIqKiBkYXRhLCB1bnNpZ25lZCBw
b3MgPSAwKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlRGF0YShjb25z
dCBjaGFyKiBkYXRhKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBleHRyYWN0RGF0
YShjaGFyKiBkYXRhLCB1bnNpZ25lZCBwb3MgPSAwLCB1bnNpZ25lZCBsZW4gPSAtMSkgY29uc3Qg
PSAwOworICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGFsbG9jYXRlRGF0YVRvV3JpdGUoY2hhcioq
IGRhdGEsIHVuc2lnbmVkIGRlc2lyZWRMZW4gPSAtMSkgPSAwOworICAgICAgICB2aXJ0dWFsIE9w
dGltaXplZEJ1ZmZlciogY2xvbmUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBw
b3BTZWdtZW50KCkgPSAwOworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNQdXJnZWFibGUoKSBjb25z
dCA9IDA7CisgICAgICAgIHZvaWQgY29weVRvKE9wdGltaXplZEJ1ZmZlciYgbykgY29uc3Q7Cisg
ICAgICAgIHZvaWQgY29weUZyb20oY29uc3QgT3B0aW1pemVkQnVmZmVyJiBvKTsKKworICAgICAg
ICBzdGF0aWMgT3B0aW1pemVkQnVmZmVyKiBjcmVhdGVJbnN0YW5jZSh1bnNpZ25lZCBleHBlY3Rl
ZFNpemUsIE9wdGltaXplZEJ1ZmZlciogb2xkQnVmZmVyLCBib29sIHB1cmdlYWJsZSA9IGZhbHNl
KTsKKyAgICAgICAgc3RhdGljIHZvaWQgZGVsZXRlSW5zdGFuY2UoT3B0aW1pemVkQnVmZmVyKiBi
KSB7IGlmIChiKSBiLT5zZWxmRGVsZXRlKCk7IH0KKyAgICAgICAgdHlwZWRlZiBPcHRpbWl6ZWRC
dWZmZXIqICgqQ3JlYXRvcikodW5zaWduZWQgZXhwZWN0ZWRTaXplLCBPcHRpbWl6ZWRCdWZmZXIq
IG9sZEJ1ZmZlciwgYm9vbCBwdXJnZWFibGUpOworICAgICAgICBzdGF0aWMgQ3JlYXRvciBzZXRD
cmVhdG9yKENyZWF0b3IpOworICAgICAgICBzdGF0aWMgYm9vbCBpc0NyZWF0b3JJbnN0YWxsZWQo
KSB7IHJldHVybiAhIW1fY3JlYXRvcjsgfQorICAgIHByb3RlY3RlZDoKKyAgICAgICAgT3B0aW1p
emVkQnVmZmVyKCkgOiBtX3NpemUoMCkge30KKyAgICAgICAgdmlydHVhbCB+T3B0aW1pemVkQnVm
ZmVyKCkge30KKyAgICAgICAgdW5zaWduZWQgbV9zaXplOworICAgICAgICBzdGF0aWMgQ3JlYXRv
ciBtX2NyZWF0b3I7CisgICAgfTsKK30KKworI2VuZGlmIC8vIF9PUFRJTUlaRURfQlVGRkVSX0hf
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhODViOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNv
cmUvcGxhdGZvcm0vd2luY2UvUGFzdGVib2FyZFdpbmNlLmNwcApAQCAtMCwwICsxLDMxNSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRF
UiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVS
LCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKKwor
I2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIK
KyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKKyNp
bmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJIaXRUZXN0
UmVzdWx0LmgiCisjaW5jbHVkZSAiSW1hZ2UuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVk
ZSAiUGFnZS5oIgorI2luY2x1ZGUgIlJhbmdlLmgiCisjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIK
KyNpbmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKKyNpbmNsdWRlICJtYXJrdXAuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitzdGF0aWMgVUlOVCBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0gMDsKK3N0
YXRpYyBVSU5UIEJvb2ttYXJrQ2xpcGJvYXJkRm9ybWF0ID0gMDsKK3N0YXRpYyBVSU5UIFdlYlNt
YXJ0UGFzdGVGb3JtYXQgPSAwOworCitleHRlcm4gSERDIGhTY3JlZW5EQzsKKworc3RhdGljIExS
RVNVTFQgQ0FMTEJBQ0sgUGFzdGVib2FyZE93bmVyV25kUHJvYyhIV05EIGhXbmQsIFVJTlQgbWVz
c2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMUkVTVUxUIGxyZXN1
bHQgPSAwOworICAgIExPTkcgbG9uZ1B0ciA9IEdldFdpbmRvd0xvbmcoaFduZCwgMCk7CisKKyAg
ICBzd2l0Y2ggKG1lc3NhZ2UpIHsKKyAgICBjYXNlIFdNX1JFTkRFUkZPUk1BVDoKKyAgICAgICAg
Ly8gVGhpcyBtZXNzYWdlIGNvbWVzIHdoZW4gU2V0Q2xpcGJvYXJkRGF0YSB3YXMgc2VudCBhIG51
bGwgZGF0YSBoYW5kbGUKKyAgICAgICAgLy8gYW5kIG5vdyBpdCdzIGNvbWUgdGltZSB0byBwdXQg
dGhlIGRhdGEgb24gdGhlIGNsaXBib2FyZC4KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9S
RU5ERVJBTExGT1JNQVRTOgorICAgICAgICAvLyBUaGlzIG1lc3NhZ2UgY29tZXMgd2hlbiBTZXRD
bGlwYm9hcmREYXRhIHdhcyBzZW50IGEgbnVsbCBkYXRhIGhhbmRsZQorICAgICAgICAvLyBhbmQg
bm93IHRoaXMgYXBwbGljYXRpb24gaXMgYWJvdXQgdG8gcXVpdCwgc28gaXQgbXVzdCBwdXQgZGF0
YSBvbgorICAgICAgICAvLyB0aGUgY2xpcGJvYXJkIGJlZm9yZSBpdCBleGl0cy4KKyAgICAgICAg
YnJlYWs7CisgICAgY2FzZSBXTV9ERVNUUk9ZOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0
OgorICAgICAgICBscmVzdWx0ID0gRGVmV2luZG93UHJvYyhoV25kLCBtZXNzYWdlLCB3UGFyYW0s
IGxQYXJhbSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gbHJlc3VsdDsKK30K
KworUGFzdGVib2FyZCogUGFzdGVib2FyZDo6Z2VuZXJhbFBhc3RlYm9hcmQoKQoreworICAgIHN0
YXRpYyBQYXN0ZWJvYXJkKiBwYXN0ZWJvYXJkID0gbmV3IFBhc3RlYm9hcmQ7CisgICAgcmV0dXJu
IHBhc3RlYm9hcmQ7Cit9CisKK1Bhc3RlYm9hcmQ6OlBhc3RlYm9hcmQoKQoreworICAgIC8vIG1h
a2UgYSBkdW1teSBIV05EIHRvIGJlIHRoZSBXaW5kb3dzIGNsaXBib2FyZCdzIG93bmVyCisgICAg
V05EQ0xBU1Mgd2MgPSB7MH07CisgICAgbWVtc2V0KCZ3YywgMCwgc2l6ZW9mKHdjKSk7CisgICAg
d2MubHBmblduZFByb2MgICAgPSBQYXN0ZWJvYXJkT3duZXJXbmRQcm9jOworICAgIHdjLmhJbnN0
YW5jZSAgICAgID0gUGFnZTo6aW5zdGFuY2VIYW5kbGUoKTsKKyAgICB3Yy5scHN6Q2xhc3NOYW1l
ICA9IEwiUGFzdGVib2FyZE93bmVyV2luZG93Q2xhc3MiOworICAgIDo6UmVnaXN0ZXJDbGFzcygm
d2MpOworCisgICAgbV9vd25lciA9IDo6Q3JlYXRlV2luZG93KEwiUGFzdGVib2FyZE93bmVyV2lu
ZG93Q2xhc3MiLCBMIlBhc3RlYm9hcmRPd25lcldpbmRvdyIsIDAsIDAsIDAsIDAsIDAsCisgICAg
ICAgIEhXTkRfTUVTU0FHRSwgMCwgMCwgMCk7CisKKyAgICBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0g
OjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIkhUTUwgRm9ybWF0Iik7CisgICAgQm9va21hcmtD
bGlwYm9hcmRGb3JtYXQgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiVW5pZm9ybVJlc291
cmNlTG9jYXRvclciKTsKKyAgICBXZWJTbWFydFBhc3RlRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBi
b2FyZEZvcm1hdChMIldlYktpdCBTbWFydCBQYXN0ZSBGb3JtYXQiKTsKK30KKwordm9pZCBQYXN0
ZWJvYXJkOjpjbGVhcigpCit7CisgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgewor
ICAgICAgICA6OkVtcHR5Q2xpcGJvYXJkKCk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsK
KyAgICB9Cit9CisKK3ZvaWQgUGFzdGVib2FyZDo6d3JpdGVTZWxlY3Rpb24oUmFuZ2UqIHNlbGVj
dGVkUmFuZ2UsIGJvb2wgY2FuU21hcnRDb3B5T3JEZWxldGUsIEZyYW1lKiBmcmFtZSkKK3sKKyAg
ICBjbGVhcigpOworCisgICAgLy8gUHV0IENGX0hUTUwgZm9ybWF0IG9uIHRoZSBwYXN0ZWJvYXJk
CisgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICBFeGNlcHRpb25D
b2RlIGVjID0gMDsKKyAgICAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgICAgIG1hcmt1cFRv
Q0ZfSFRNTChjcmVhdGVNYXJrdXAoc2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNo
YW5nZSksIHNlbGVjdGVkUmFuZ2UtPnN0YXJ0Q29udGFpbmVyKGVjKS0+ZG9jdW1lbnQoKS0+dXJs
KCksIGRhdGEpOworICAgICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0
YSk7CisgICAgICAgIGlmICghOjpTZXRDbGlwYm9hcmREYXRhKEhUTUxDbGlwYm9hcmRGb3JtYXQs
IGNiRGF0YSkpCisgICAgICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpD
bG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIC8vIFB1dCBwbGFpbiBzdHJpbmcgb24gdGhl
IHBhc3RlYm9hcmQuIENGX1VOSUNPREVURVhUIGNvdmVycyBDRl9URVhUIGFzIHdlbGwKKyAgICBT
dHJpbmcgc3RyID0gZnJhbWUtPnNlbGVjdGVkVGV4dCgpOworICAgIHJlcGxhY2VOZXdsaW5lc1dp
dGhXaW5kb3dzU3R5bGVOZXdsaW5lcyhzdHIpOworICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHN0
cik7CisgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICBIR0xPQkFM
IGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoc3RyKTsKKyAgICAgICAgaWYgKCE6OlNldENsaXBi
b2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQsIGNiRGF0YSkpCisgICAgICAgICAgICA6Okdsb2JhbEZy
ZWUoY2JEYXRhKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIC8v
IGVuYWJsZSBzbWFydC1yZXBsYWNpbmcgbGF0ZXIgb24gYnkgcHV0dGluZyBkdW1teSBkYXRhIG9u
IHRoZSBwYXN0ZWJvYXJkCisgICAgaWYgKGNhblNtYXJ0Q29weU9yRGVsZXRlKSB7CisgICAgICAg
IGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgICAgIDo6U2V0Q2xpcGJv
YXJkRGF0YShXZWJTbWFydFBhc3RlRm9ybWF0LCAwKTsKKyAgICAgICAgICAgIDo6Q2xvc2VDbGlw
Ym9hcmQoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVVS
TChjb25zdCBLVVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGVTdHIsIEZyYW1lKiBmcmFtZSkK
K3sKKyAgICBBU1NFUlQoIXVybC5pc0VtcHR5KCkpOworCisgICAgY2xlYXIoKTsKKworICAgIFN0
cmluZyB0aXRsZSh0aXRsZVN0cik7CisgICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkgeworICAgICAg
ICB0aXRsZSA9IHVybC5sYXN0UGF0aENvbXBvbmVudCgpOworICAgICAgICBpZiAodGl0bGUuaXNF
bXB0eSgpKQorICAgICAgICAgICAgdGl0bGUgPSB1cmwuaG9zdCgpOworICAgIH0KKworICAgIC8v
IHdyaXRlIHRvIGNsaXBib2FyZCBpbiBmb3JtYXQgY29tLmFwcGxlLnNhZmFyaS5ib29rbWFya2Rh
dGEgdG8gYmUgYWJsZSB0byBwYXN0ZSBpbnRvIHRoZSBib29rbWFya3MgdmlldyB3aXRoIGFwcHJv
cHJpYXRlIHRpdGxlCisgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAg
ICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEodXJsLCB0aXRsZSk7CisgICAgICAg
IGlmICghOjpTZXRDbGlwYm9hcmREYXRhKEJvb2ttYXJrQ2xpcGJvYXJkRm9ybWF0LCBjYkRhdGEp
KQorICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlw
Ym9hcmQoKTsKKyAgICB9CisKKyAgICAvLyB3cml0ZSB0byBjbGlwYm9hcmQgaW4gZm9ybWF0IENG
X0hUTUwgdG8gYmUgYWJsZSB0byBwYXN0ZSBpbnRvIGNvbnRlbnRlZGl0YWJsZSBhcmVhcyBhcyBh
IGxpbmsKKyAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIFZlY3Rv
cjxjaGFyPiBkYXRhOworICAgICAgICBtYXJrdXBUb0NGX0hUTUwodXJsVG9NYXJrdXAodXJsLCB0
aXRsZSksICIiLCBkYXRhKTsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEgPSBjcmVhdGVHbG9iYWxE
YXRhKGRhdGEpOworICAgICAgICBpZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJk
Rm9ybWF0LCBjYkRhdGEpKQorICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAg
ICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICAvLyBiYXJlLWJvbmVzIENGX1VO
SUNPREVURVhUIHN1cHBvcnQKKyAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7Cisg
ICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwuc3RyaW5nKCkpOwor
ICAgICAgICBpZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgY2JEYXRhKSkK
KyAgICAgICAgICAgIDo6R2xvYmFsRnJlZShjYkRhdGEpOworICAgICAgICA6OkNsb3NlQ2xpcGJv
YXJkKCk7CisgICAgfQorfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9k
ZSwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYpCit7CisgICAgQVNTRVJUKG5vZGUgJiYgbm9k
ZS0+cmVuZGVyZXIoKSAmJiBub2RlLT5yZW5kZXJlcigpLT5pc0ltYWdlKCkpOworICAgIFJlbmRl
ckltYWdlKiByZW5kZXJlciA9IHN0YXRpY19jYXN0PFJlbmRlckltYWdlKj4obm9kZS0+cmVuZGVy
ZXIoKSk7CisgICAgQ2FjaGVkSW1hZ2UqIGNhY2hlZEltYWdlID0gc3RhdGljX2Nhc3Q8Q2FjaGVk
SW1hZ2UqPihyZW5kZXJlci0+Y2FjaGVkSW1hZ2UoKSk7CisgICAgQVNTRVJUKGNhY2hlZEltYWdl
KTsKKyAgICBJbWFnZSogaW1hZ2UgPSBjYWNoZWRJbWFnZS0+aW1hZ2UoKTsKKyAgICBBU1NFUlQo
aW1hZ2UpOworCisgICAgY2xlYXIoKTsKKworICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IHNvdXJj
ZUJtcCA9IGltYWdlLT5uYXRpdmVJbWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIGlmICghc291
cmNlQm1wKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHJlY3QoMCwgMCwgc291cmNl
Qm1wLT53aWR0aCgpLCBzb3VyY2VCbXAtPmhlaWdodCgpKTsKKyAgICBCaXRtYXBJbmZvIGJtcElu
Zm87CisgICAgdm9pZCogcGl4ZWxzOworICAgIEhCSVRNQVAgcmVzdWx0Qml0bWFwID0gc291cmNl
Qm1wLT5jbGlwQml0bWFwKHJlY3QsIHRydWUsIGJtcEluZm8sIHBpeGVscyk7CisgICAgaWYgKCFy
ZXN1bHRCaXRtYXApCisgICAgICAgIHJldHVybjsKKworICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQo
bV9vd25lcikpIHsKKyAgICAgICAgOjpTZXRDbGlwYm9hcmREYXRhKENGX0JJVE1BUCwgcmVzdWx0
Qml0bWFwKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0gZWxzZQorICAgICAg
ICBEZWxldGVPYmplY3QocmVzdWx0Qml0bWFwKTsKK30KKworYm9vbCBQYXN0ZWJvYXJkOjpjYW5T
bWFydFJlcGxhY2UoKQoreworICAgIHJldHVybiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxl
KFdlYlNtYXJ0UGFzdGVGb3JtYXQpOworfQorCitTdHJpbmcgUGFzdGVib2FyZDo6cGxhaW5UZXh0
KEZyYW1lKiBmcmFtZSkKK3sKKyAgICBpZiAoOjpJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShD
Rl9VTklDT0RFVEVYVCkgJiYgOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhB
TkRMRSBjYkRhdGEgPSA6OkdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQpOworICAgICAg
ICBpZiAoY2JEYXRhKSB7CisgICAgICAgICAgICBVQ2hhciogYnVmZmVyID0gKFVDaGFyKilHbG9i
YWxMb2NrKGNiRGF0YSk7CisgICAgICAgICAgICBTdHJpbmcgZnJvbUNsaXBib2FyZChidWZmZXIp
OworICAgICAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICBDbG9zZUNs
aXBib2FyZCgpOworICAgICAgICAgICAgcmV0dXJuIGZyb21DbGlwYm9hcmQ7CisgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICBpZiAoOjpJ
c0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9URVhUKSAmJiA6Ok9wZW5DbGlwYm9hcmQobV9v
d25lcikpIHsKKyAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9U
RVhUKTsKKyAgICAgICAgaWYgKGNiRGF0YSkgeworICAgICAgICAgICAgY2hhciogYnVmZmVyID0g
KGNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIFN0cmluZyBmcm9tQ2xpcGJv
YXJkKGJ1ZmZlcik7CisgICAgICAgICAgICBHbG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAg
ICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgICAgICByZXR1cm4gZnJvbUNsaXBib2FyZDsK
KyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKwor
ICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBQ
YXN0ZWJvYXJkOjpkb2N1bWVudEZyYWdtZW50KEZyYW1lKiBmcmFtZSwgUGFzc1JlZlB0cjxSYW5n
ZT4gY29udGV4dCwgYm9vbCBhbGxvd1BsYWluVGV4dCwgYm9vbCYgY2hvc2VQbGFpblRleHQpCit7
CisgICAgY2hvc2VQbGFpblRleHQgPSBmYWxzZTsKKworICAgIGlmICg6OklzQ2xpcGJvYXJkRm9y
bWF0QXZhaWxhYmxlKEhUTUxDbGlwYm9hcmRGb3JtYXQpICYmIDo6T3BlbkNsaXBib2FyZChtX293
bmVyKSkgeworICAgICAgICAvLyBnZXQgZGF0YSBvZmYgb2YgY2xpcGJvYXJkCisgICAgICAgIEhB
TkRMRSBjYkRhdGEgPSA6OkdldENsaXBib2FyZERhdGEoSFRNTENsaXBib2FyZEZvcm1hdCk7Cisg
ICAgICAgIGlmIChjYkRhdGEpIHsKKyAgICAgICAgICAgIFNJWkVfVCBkYXRhU2l6ZSA9IDo6R2xv
YmFsU2l6ZShjYkRhdGEpOworICAgICAgICAgICAgU3RyaW5nIGNmX2h0bWwoVVRGOEVuY29kaW5n
KCkuZGVjb2RlKChjaGFyKilHbG9iYWxMb2NrKGNiRGF0YSksIGRhdGFTaXplKSk7CisgICAgICAg
ICAgICBHbG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7
CisKKyAgICAgICAgICAgIFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBm
cmFnbWVudEZyb21DRl9IVE1MKGZyYW1lLT5kb2N1bWVudCgpLCBjZl9odG1sKTsKKyAgICAgICAg
ICAgIGlmIChmcmFnbWVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7CisgICAg
ICAgIH0gZWxzZQorICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICBp
ZiAoYWxsb3dQbGFpblRleHQgJiYgSXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoQ0ZfVU5JQ09E
RVRFWFQpKSB7CisgICAgICAgIGNob3NlUGxhaW5UZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKE9w
ZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgICAgIEhBTkRMRSBjYkRhdGEgPSBHZXRD
bGlwYm9hcmREYXRhKENGX1VOSUNPREVURVhUKTsKKyAgICAgICAgICAgIGlmIChjYkRhdGEpIHsK
KyAgICAgICAgICAgICAgICBVQ2hhciogYnVmZmVyID0gKFVDaGFyKilHbG9iYWxMb2NrKGNiRGF0
YSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHN0cihidWZmZXIpOworICAgICAgICAgICAgICAg
IEdsb2JhbFVubG9jayhjYkRhdGEpOworICAgICAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7
CisgICAgICAgICAgICAgICAgUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gY3Jl
YXRlRnJhZ21lbnRGcm9tVGV4dChjb250ZXh0LmdldCgpLCBzdHIpOworICAgICAgICAgICAgICAg
IGlmIChmcmFnbWVudCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJlbGVh
c2UoKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJk
KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWxsb3dQbGFpblRleHQgJiYgOjpJc0Ns
aXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9URVhUKSkgeworICAgICAgICBjaG9zZVBsYWluVGV4
dCA9IHRydWU7CisgICAgICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAg
ICAgICAgIEhBTkRMRSBjYkRhdGEgPSA6OkdldENsaXBib2FyZERhdGEoQ0ZfVEVYVCk7CisgICAg
ICAgICAgICBpZiAoY2JEYXRhKSB7CisgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyID0gKGNo
YXIqKUdsb2JhbExvY2soY2JEYXRhKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyKGJ1ZmZl
cik7CisgICAgICAgICAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICAg
ICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgICAgICAgICBSZWZQdHI8RG9jdW1lbnRGcmFn
bWVudD4gZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudEZyb21UZXh0KGNvbnRleHQuZ2V0KCksIHN0
cik7CisgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50KQorICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAw
OworfQorCitib29sIFBhc3RlYm9hcmQ6Omhhc0RhdGEoKQoreworICAgIHJldHVybiBoYXNEYXRh
SW5Gb3JtYXQoQ0ZfVU5JQ09ERVRFWFQpIHx8IGhhc0RhdGFJbkZvcm1hdChDRl9URVhUKTsKK30K
KworYm9vbCBQYXN0ZWJvYXJkOjpoYXNEYXRhSW5Gb3JtYXQodW5zaWduZWQgaW50IGZvcm1hdCkK
K3sKKyAgICByZXR1cm4gOjpJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShmb3JtYXQpOworfQor
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9Q
bGF0Zm9ybVNjcm9sbEJhcldpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi45ZGRhYzUyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9Q
bGF0Zm9ybVNjcm9sbEJhcldpbmNlLmNwcApAQCAtMCwwICsxLDU2MCBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJp
Z2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TY3JvbGxCYXIuaCIKKworI2luY2x1ZGUgIkV2ZW50
SGFuZGxlci5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisj
aW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAiSW50UmVjdC5oIgorI2luY2x1
ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lLmgiCisK
KyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8vIHN0YWJsZVJvdW5kIHJvdW5kcyAtMC41IHRvIDAs
IHdoZXJlIGxyb3VuZCByb3VuZHMgLTAuNSB0byAtMS4KK3N0YXRpYyBpbmxpbmUgaW50IHN0YWJs
ZVJvdW5kKGRvdWJsZSBkKQoreworICAgIGlmIChkID4gMCkKKyAgICAgICAgcmV0dXJuIHN0YXRp
Y19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICBpbnQgaSA9IHN0YXRpY19jYXN0PGludD4oZCk7
CisgICAgcmV0dXJuIGkgLSBkID4gMC41ID8gaSAtIDEgOiBpOworfQorCit1c2luZyBuYW1lc3Bh
Y2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2VudW0gU2Nyb2xsQmFyU3RhdGUgewor
ICAgIFNjcm9sbEJhckRpc2FibGVkLAorICAgIFNjcm9sbEJhckVuYWJsZWQsCisgICAgU2Nyb2xs
QmFyUHJlc3NlZCwKK307CisKK3N0YXRpYyBpbnQgY0hvcml6b250YWxXaWR0aFtdID0geyAxNSwg
MTEgfTsKK3N0YXRpYyBpbnQgY0hvcml6b250YWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CitzdGF0
aWMgaW50IGNWZXJ0aWNhbFdpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjVmVydGlj
YWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CisKK2NvbnN0IGRvdWJsZSBjSW5pdGlhbFRpbWVyRGVs
YXkgPSAwLjI1OworY29uc3QgZG91YmxlIGNOb3JtYWxUaW1lckRlbGF5ID0gMC4wNTsKKworUGxh
dGZvcm1TY3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCogY2xpZW50
LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJvbFNpemUg
c2l6ZSkKKyAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0aW9uLCBzaXplKQorICAgICwg
bV9ob3ZlcmVkUGFydChOb1BhcnQpCisgICAgLCBtX3ByZXNzZWRQYXJ0KE5vUGFydCkKKyAgICAs
IG1fcHJlc3NlZFBvcygwKQorICAgICwgbV9zY3JvbGxUaW1lcih0aGlzLCAmUGxhdGZvcm1TY3Jv
bGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKQorICAgICwgbV9vdmVybGFwc1Jlc2l6ZXIoZmFs
c2UpCisgICAgLCBtX3Zpc2libGUodHJ1ZSkKKyAgICAsIG1faXNWaWV3U2Nyb2xsYmFyKGZhbHNl
KQoreworICAgIGlmIChvcmllbnRhdGlvbiA9PSBWZXJ0aWNhbFNjcm9sbGJhcikKKyAgICAgICAg
c2V0RnJhbWVSZWN0KEludFJlY3QoMCwgMCwgY1ZlcnRpY2FsV2lkdGhbY29udHJvbFNpemUoKV0s
IGNWZXJ0aWNhbEhlaWdodFtjb250cm9sU2l6ZSgpXSkpOworICAgIGVsc2UKKyAgICAgICAgc2V0
RnJhbWVSZWN0KEludFJlY3QoMCwgMCwgY0hvcml6b250YWxXaWR0aFtjb250cm9sU2l6ZSgpXSwg
Y0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pKTsKK30KKworUGxhdGZvcm1TY3JvbGxi
YXI6On5QbGF0Zm9ybVNjcm9sbGJhcigpCit7CisgICAgc3RvcFRpbWVySWZOZWVkZWQoKTsKK30K
Kwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQb3NpdGlvbigpCit7CisgICAg
aW52YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnVwZGF0ZVRo
dW1iUHJvcG9ydGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3ZvaWQgUGxh
dGZvcm1TY3JvbGxiYXI6OmludmFsaWRhdGVUcmFjaygpCit7CisgICAgaWYgKCFtX3Zpc2libGUp
CisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcmVjdCA9IHRyYWNrUmVjdCgpOworICAg
IHJlY3QubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnZhbGlkYXRlUmVjdChyZWN0KTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52YWxpZGF0ZVBhcnQoU2Nyb2xsYmFyUGFydCBwYXJ0
KQoreworICAgIGlmICghbV92aXNpYmxlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAocGFy
dCA9PSBOb1BhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcmVzdWx0OworICAg
IHN3aXRjaCAocGFydCkgeworICAgIGNhc2UgQmFja0J1dHRvblN0YXJ0UGFydDoKKyAgICAgICAg
cmVzdWx0ID0gYmFja0J1dHRvblJlY3QoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGb3J3
YXJkQnV0dG9uU3RhcnRQYXJ0OgorICAgICAgICByZXN1bHQgPSBmb3J3YXJkQnV0dG9uUmVjdCgp
OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBJ
bnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdDsKKyAgICAg
ICAgICAgIHNwbGl0VHJhY2sodHJhY2tSZWN0KCksIGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0
LCBhZnRlclRodW1iUmVjdCk7CisgICAgICAgICAgICBpZiAocGFydCA9PSBCYWNrVHJhY2tQYXJ0
KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJlZm9yZVRodW1iUmVjdDsKKyAgICAgICAgICAg
IGVsc2UgaWYgKHBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkKKyAgICAgICAgICAgICAgICByZXN1
bHQgPSBhZnRlclRodW1iUmVjdDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBy
ZXN1bHQgPSB0aHVtYlJlY3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0Lm1vdmUoLXgo
KSwgLXkoKSk7CisgICAgaW52YWxpZGF0ZVJlY3QocmVzdWx0KTsKK30KKworaW50IFBsYXRmb3Jt
U2Nyb2xsYmFyOjp3aWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdpZGdldDo6d2lkdGgoKTsK
K30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjpoZWlnaHQoKSBjb25zdAoreworICAgIHJldHVy
biBXaWRnZXQ6OmhlaWdodCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRSZWN0
KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgc2V0RnJhbWVSZWN0KHJlY3QpOworfQorCit2
b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRQYXJlbnQoU2Nyb2xsVmlldyogcGFyZW50VmlldykK
K3sKKyAgICBXaWRnZXQ6OnNldFBhcmVudChwYXJlbnRWaWV3KTsKK30KKwordm9pZCBQbGF0Zm9y
bVNjcm9sbGJhcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQg
IT0gaXNFbmFibGVkKCkpIHsKKyAgICAgICAgU2Nyb2xsYmFyOjpzZXRFbmFibGVkKGVuYWJsZWQp
OworICAgICAgICBpZiAobV92aXNpYmxlKQorICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAg
IH0KK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBn
cmFwaGljc0NvbnRleHQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpCit7CisgICAgaWYgKCFt
X3Zpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChncmFwaGljc0NvbnRleHQtPnBh
aW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRG9uJ3QgcGFpbnQg
YW55dGhpbmcgaWYgdGhlIHNjcm9sbGJhciBkb2Vzbid0IGludGVyc2VjdCB0aGUgZGFtYWdlIHJl
Y3QuCisgICAgaWYgKCFmcmFtZVJlY3QoKS5pbnRlcnNlY3RzKGRhbWFnZVJlY3QpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBncmFwaGljc0NvbnRleHQtPnNhdmUoKTsKKworICAgIGdyYXBoaWNz
Q29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOworICAgIGdyYXBoaWNzQ29udGV4
dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3IoMCwgMCwgMCkpOworCisgICAgSW50UmVjdCB0cmFjayA9
IHRyYWNrUmVjdCgpOworICAgIHBhaW50VHJhY2soZ3JhcGhpY3NDb250ZXh0LCB0cmFjaywgdHJ1
ZSwgZGFtYWdlUmVjdCk7CisKKyAgICBpZiAoaXNFbmFibGVkKCkpIHsKKyAgICAgICAgcGFpbnRC
dXR0b24oZ3JhcGhpY3NDb250ZXh0LCBiYWNrQnV0dG9uUmVjdCgpLCB0cnVlLCBkYW1hZ2VSZWN0
KTsKKyAgICAgICAgcGFpbnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0LCBmb3J3YXJkQnV0dG9uUmVj
dCgpLCBmYWxzZSwgZGFtYWdlUmVjdCk7CisgICAgfQorCisgICAgaWYgKGRhbWFnZVJlY3QuaW50
ZXJzZWN0cyh0cmFjaykgJiYgaXNFbmFibGVkKCkpIHsKKyAgICAgICAgSW50UmVjdCBzdGFydFRy
YWNrUmVjdCwgdGh1bWJSZWN0LCBlbmRUcmFja1JlY3Q7CisgICAgICAgIHNwbGl0VHJhY2sodHJh
Y2ssIHN0YXJ0VHJhY2tSZWN0LCB0aHVtYlJlY3QsIGVuZFRyYWNrUmVjdCk7CisgICAgICAgIHBh
aW50VGh1bWIoZ3JhcGhpY3NDb250ZXh0LCB0aHVtYlJlY3QsIGRhbWFnZVJlY3QpOworICAgIH0K
KworICAgIGdyYXBoaWNzQ29udGV4dC0+cmVzdG9yZSgpOworfQorCitJbnRSZWN0IFBsYXRmb3Jt
U2Nyb2xsYmFyOjpiYWNrQnV0dG9uUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKG1fb3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5
KCksIGhlaWdodCgpLCBoZWlnaHQoKSk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCksIHdp
ZHRoKCksIHdpZHRoKCkpOworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpmb3J3YXJk
QnV0dG9uUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRh
bFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgpICsgd2lkdGgoKSAtIGhlaWdo
dCgpLCB5KCksIGhlaWdodCgpLCBoZWlnaHQoKSk7CisKKyAgICByZXR1cm4gSW50UmVjdCh4KCks
IHkoKSArIGhlaWdodCgpIC0gd2lkdGgoKSwgd2lkdGgoKSwgd2lkdGgoKSk7Cit9CisKK0ludFJl
Y3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKG1fb3Jp
ZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICBpZiAod2lkdGgoKSA8
IGhlaWdodCgpICsgaGVpZ2h0KCkpCisgICAgICAgICAgICByZXR1cm4gSW50UmVjdCgpOworICAg
ICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyBoZWlnaHQoKSwgeSgpLCB3aWR0aCgpIC0gaGVpZ2h0
KCkgLSBoZWlnaHQoKSwgaGVpZ2h0KCkpOworICAgIH0KKworICAgIGlmIChoZWlnaHQoKSA8IHdp
ZHRoKCkgKyB3aWR0aCgpKQorICAgICAgICByZXR1cm4gSW50UmVjdCgpOworICAgIHJldHVybiBJ
bnRSZWN0KHgoKSwgeSgpICsgd2lkdGgoKSwgd2lkdGgoKSwgaGVpZ2h0KCkgLSB3aWR0aCgpIC0g
d2lkdGgoKSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRodW1iUmVjdCgpIGNv
bnN0Cit7CisgICAgSW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVt
YlJlY3Q7CisgICAgc3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVt
YlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICByZXR1cm4gdGh1bWJSZWN0OworfQorCit2b2lk
IFBsYXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwg
SW50UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFm
dGVyVGh1bWJSZWN0KSBjb25zdAoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gd29uJ3QgZXZlbiBn
ZXQgY2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhhdmUgc29tZSBjb21iaW5hdGlv
biBvZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFzdAorICAgIC8vIG9uZSBvZiB0aGVt
IGlzIG5vbi1lbXB0eS4KKyAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAg
aWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICB0aHVt
YlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyB0aHVtYlBvcywgdHJhY2tSZWN0LnkoKSwg
dGh1bWJMZW5ndGgoKSwgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgYmVmb3JlVGh1bWJS
ZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1JlY3QueSgpLCB0aHVtYlBvcywgdHJh
Y2tSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJbnRSZWN0KHRodW1i
UmVjdC54KCkgKyB0aHVtYlJlY3Qud2lkdGgoKSwgdHJhY2tSZWN0LnkoKSwgdHJhY2tSZWN0LnJp
Z2h0KCkgLSB0aHVtYlJlY3QucmlnaHQoKSwgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAgICB9IGVs
c2UgeworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCksIHRyYWNrUmVj
dC55KCkgKyB0aHVtYlBvcywgdHJhY2tSZWN0LndpZHRoKCksIHRodW1iTGVuZ3RoKCkpOworICAg
ICAgICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCksIHRyYWNrUmVjdC55
KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0aHVtYlBvcyk7CisgICAgICAgIGFmdGVyVGh1bWJSZWN0
ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0aHVtYlJlY3QueSgpICsgdGh1bWJSZWN0LmhlaWdo
dCgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdHJhY2tSZWN0LmJvdHRvbSgpIC0gdGh1bWJSZWN0LmJv
dHRvbSgpKTsKKyAgICB9Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJQb3NpdGlv
bigpIGNvbnN0Cit7CisgICAgaWYgKGlzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gc3RhYmxl
Um91bmQoKGZsb2F0KW1fY3VycmVudFBvcyAqICh0cmFja0xlbmd0aCgpIC0gdGh1bWJMZW5ndGgo
KSkgLyAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKSk7CisgICAgcmV0dXJuIDA7Cit9CisK
K2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJMZW5ndGgoKSBjb25zdAoreworICAgIGlmICgh
aXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgZmxvYXQgcHJvcG9ydGlvbiA9
IChmbG9hdCkobV92aXNpYmxlU2l6ZSkgLyBtX3RvdGFsU2l6ZTsKKyAgICBpbnQgdHJhY2tMZW4g
PSB0cmFja0xlbmd0aCgpOworICAgIGludCBsZW5ndGggPSBzdGFibGVSb3VuZChwcm9wb3J0aW9u
ICogdHJhY2tMZW4pOworICAgIGludCBtaW5MZW5ndGggPSBtX29yaWVudGF0aW9uID09IEhvcml6
b250YWxTY3JvbGxiYXIgPyBoZWlnaHQoKSA6IHdpZHRoKCk7CisgICAgbGVuZ3RoID0gbWF4KGxl
bmd0aCwgbWluTGVuZ3RoKTsKKyAgICBpZiAobGVuZ3RoID4gdHJhY2tMZW4pCisgICAgICAgIGxl
bmd0aCA9IDA7IC8vIE9uY2UgdGhlIHRodW1iIGlzIGJlbG93IHRoZSB0cmFjayBsZW5ndGgsIGl0
IGp1c3QgZ29lcyBhd2F5ICh0byBtYWtlIG1vcmUgcm9vbSBmb3IgdGhlIHRyYWNrKS4KKyAgICBy
ZXR1cm4gbGVuZ3RoOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrTGVuZ3RoKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJh
cikgPyB0cmFja1JlY3QoKS53aWR0aCgpIDogdHJhY2tSZWN0KCkuaGVpZ2h0KCk7Cit9CisKK3Zv
aWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4
dCwgY29uc3QgSW50UmVjdCYgcGFpbnRSZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBk
YW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50
UmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFVJTlQgc3RhdGUgPSAhaXNFbmFibGVkKCkK
KyAgICAgICAgPyBERkNTX0lOQUNUSVZFCisgICAgICAgIDogbV9wcmVzc2VkUGFydCA9PSAoc3Rh
cnQgPyBCYWNrQnV0dG9uU3RhcnRQYXJ0IDogRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCkKKyAgICAg
ICAgPyBERkNTX1BVU0hFRAorICAgICAgICA6IDA7CisKKyAgICBVSU5UIGFycm93ID0gbV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyCisgICAgICAgID8gc3RhcnQgPyBERkNTX1ND
Uk9MTExFRlQgOiBERkNTX1NDUk9MTFJJR0hUCisgICAgICAgIDogc3RhcnQgPyBERkNTX1NDUk9M
TFVQIDogREZDU19TQ1JPTExET1dOOworCisgICAgY29udGV4dC0+ZHJhd0ZyYW1lQ29udHJvbChw
YWludFJlY3QsIERGQ19TQ1JPTEwsIGFycm93IHwgc3RhdGUpOworfQorCit2b2lkIFBsYXRmb3Jt
U2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50
UmVjdCYgcGFpbnRSZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBj
b25zdAoreworICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCisgICAg
ICAgIHJldHVybjsKKworICAgIERXT1JEIGNvbG9yID0gR2V0U3lzQ29sb3IoQ09MT1JfU0NST0xM
QkFSKTsKKyAgICBjb250ZXh0LT5maWxsUmVjdChwYWludFJlY3QsIENvbG9yKEdldFJWYWx1ZShj
b2xvcikgLyAyLCBHZXRHVmFsdWUoY29sb3IpIC8gMiwgR2V0QlZhbHVlKGNvbG9yKSAvIDIpKTsK
KyAgICBjb250ZXh0LT5zdHJva2VSZWN0KHBhaW50UmVjdCwgMSk7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJ
bnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlm
ICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBV
SU5UIHN0YXRlID0gIWlzRW5hYmxlZCgpCisgICAgICAgID8gREZDU19JTkFDVElWRQorICAgICAg
ICA6IG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0CisgICAgICAgID8gREZDU19QVVNIRUQKKyAg
ICAgICAgOiAwOworCisgICAgY29udGV4dC0+ZHJhd0ZyYW1lQ29udHJvbChyZWN0LCBERkNfQlVU
VE9OLCBERkNTX0JVVFRPTlBVU0ggfCBzdGF0ZSk7Cit9CisKK1Njcm9sbGJhclBhcnQgUGxhdGZv
cm1TY3JvbGxiYXI6OmhpdFRlc3QoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7Cisg
ICAgU2Nyb2xsYmFyUGFydCByZXN1bHQgPSBOb1BhcnQ7CisgICAgaWYgKCFtX3Zpc2libGUpCisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKworICAgIEludFBvaW50IG1vdXNlUG9zaXRpb24gPSBjb252ZXJ0RnJvbUNv
bnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKTsKKyAgICBtb3VzZVBvc2l0aW9uLm1vdmUoeCgpLCB5
KCkpOworICAgIGlmIChiYWNrQnV0dG9uUmVjdCgpLmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQor
ICAgICAgICByZXN1bHQgPSBCYWNrQnV0dG9uU3RhcnRQYXJ0OworICAgIGVsc2UgaWYgKGZvcndh
cmRCdXR0b25SZWN0KCkuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgIHJlc3VsdCA9
IEZvcndhcmRCdXR0b25TdGFydFBhcnQ7CisgICAgZWxzZSB7CisgICAgICAgIEludFJlY3QgdHJh
Y2sgPSB0cmFja1JlY3QoKTsKKyAgICAgICAgaWYgKHRyYWNrLmNvbnRhaW5zKG1vdXNlUG9zaXRp
b24pKSB7CisgICAgICAgICAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBh
ZnRlclRodW1iUmVjdDsKKyAgICAgICAgICAgIHNwbGl0VHJhY2sodHJhY2ssIGJlZm9yZVRodW1i
UmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdCk7CisgICAgICAgICAgICBpZiAoYmVmb3Jl
VGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IEJhY2tUcmFja1BhcnQ7CisgICAgICAgICAgICBlbHNlIGlmICh0aHVtYlJlY3QuY29udGFp
bnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gVGh1bWJQYXJ0Owor
ICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IEZvcndhcmRUcmFja1Bh
cnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYm9vbCBQbGF0
Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2
ZW50JiBldnQpCit7CisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0KSB7CisgICAg
ICAgIC8vIERyYWcgdGhlIHRodW1iLgorICAgICAgICBpbnQgdGh1bWJQb3MgPSB0aHVtYlBvc2l0
aW9uKCk7CisgICAgICAgIGludCB0aHVtYkxlbiA9IHRodW1iTGVuZ3RoKCk7CisgICAgICAgIGlu
dCB0cmFja0xlbiA9IHRyYWNrTGVuZ3RoKCk7CisgICAgICAgIGludCBtYXhQb3MgPSB0cmFja0xl
biAtIHRodW1iTGVuOworICAgICAgICBpbnQgZGVsdGEgPSAwOworICAgICAgICBpZiAobV9vcmll
bnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICAgICAgZGVsdGEgPSBjb252
ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkgLSBtX3ByZXNzZWRQb3M7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbHRhID0gY29udmVydEZyb21Db250YWluaW5nV2lu
ZG93KGV2dC5wb3MoKSkueSgpIC0gbV9wcmVzc2VkUG9zOworCisgICAgICAgIGlmIChkZWx0YSA+
IDApCisgICAgICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgZG93bi9yaWdodC4KKyAgICAgICAg
ICAgIGRlbHRhID0gbWluKG1heFBvcyAtIHRodW1iUG9zLCBkZWx0YSk7CisgICAgICAgIGVsc2Ug
aWYgKGRlbHRhIDwgMCkKKyAgICAgICAgICAgIC8vIFRoZSBtb3VzZSBtb3ZlZCB1cC9sZWZ0Lgor
ICAgICAgICAgICAgZGVsdGEgPSBtYXgoLXRodW1iUG9zLCBkZWx0YSk7CisKKyAgICAgICAgaWYg
KGRlbHRhKSB7CisgICAgICAgICAgICBzZXRWYWx1ZShzdGFibGVSb3VuZCgoZmxvYXQpKHRodW1i
UG9zICsgZGVsdGEpICogKG1fdG90YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkgLyAodHJhY2tMZW4g
LSB0aHVtYkxlbikpKTsKKyAgICAgICAgICAgIG1fcHJlc3NlZFBvcyArPSB0aHVtYlBvc2l0aW9u
KCkgLSB0aHVtYlBvczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KworICAgIGlmIChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkKKyAgICAgICAgbV9wcmVzc2VkUG9z
ID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNvbnZlcnRGcm9tQ29u
dGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRv
dyhldnQucG9zKCkpLnkoKSk7CisKKyAgICBTY3JvbGxiYXJQYXJ0IHBhcnQgPSBoaXRUZXN0KGV2
dCk7CisgICAgaWYgKHBhcnQgIT0gbV9ob3ZlcmVkUGFydCkgeworICAgICAgICBpZiAobV9wcmVz
c2VkUGFydCAhPSBOb1BhcnQpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0ID09IG1fcHJlc3NlZFBh
cnQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbW91c2UgaXMgbW92aW5nIGJhY2sgb3ZlciB0
aGUgcHJlc3NlZCBwYXJ0LiAgV2UKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHN0YXJ0IHVw
IHRoZSB0aW1lciBhY3Rpb24gYWdhaW4uCisgICAgICAgICAgICAgICAgc3RhcnRUaW1lcklmTmVl
ZGVkKGNOb3JtYWxUaW1lckRlbGF5KTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUGFydCht
X3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobV9ob3ZlcmVkUGFydCA9PSBt
X3ByZXNzZWRQYXJ0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG1vdXNlIGlzIGxlYXZpbmcg
dGhlIHByZXNzZWQgcGFydC4gIEtpbGwgb3VyIHRpbWVyCisgICAgICAgICAgICAgICAgLy8gaWYg
bmVlZGVkLgorICAgICAgICAgICAgICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisgICAgICAgICAg
ICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlUGFydChwYXJ0KTsKKyAgICAgICAg
ICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAgICAgICB9CisgICAgICAgIG1f
aG92ZXJlZFBhcnQgPSBwYXJ0OworICAgIH0KKworICAgIHJldHVybiBtX3ByZXNzZWRQYXJ0ICE9
IE5vUGFydDsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VPdXRFdmVu
dChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBpbnZhbGlkYXRlUGFydCht
X2hvdmVyZWRQYXJ0KTsKKyAgICBtX2hvdmVyZWRQYXJ0ID0gTm9QYXJ0OworCisgICAgcmV0dXJu
IHRydWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6OmhhbmRsZU1vdXNlUHJlc3NFdmVu
dChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBtX3ByZXNzZWRQYXJ0ID0g
aGl0VGVzdChldnQpOworICAgIG1fcHJlc3NlZFBvcyA9IChtX29yaWVudGF0aW9uID09IEhvcml6
b250YWxTY3JvbGxiYXIgPyBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54
KCkgOiBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS55KCkpOworICAgIGlu
dmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgIGF1dG9zY3JvbGxQcmVzc2VkUGFydChj
SW5pdGlhbFRpbWVyRGVsYXkpOworICAgIHJldHVybiBtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydDsK
K30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQoY29u
c3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVz
c2VkUGFydCk7CisgICAgbV9wcmVzc2VkUGFydCA9IE5vUGFydDsKKyAgICBtX3ByZXNzZWRQb3Mg
PSAwOworICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisKKyAgICBpZiAocGFyZW50KCkgJiYgcGFy
ZW50KCktPmlzRnJhbWVWaWV3KCkpCisgICAgICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHBh
cmVudCgpKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPnNldE1vdXNlUHJlc3NlZChmYWxzZSk7
CisKKyAgICByZXR1cm4gbV9wcmVzc2VkUGFydCAhPSBOb1BhcnQ7Cit9CisKK3ZvaWQgUGxhdGZv
cm1TY3JvbGxiYXI6OnN0YXJ0VGltZXJJZk5lZWRlZChkb3VibGUgZGVsYXkpCit7CisgICAgLy8g
RG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0aHVtYi4KKyAgICBpZiAobV9wcmVzc2VkUGFydCA9
PSBUaHVtYlBhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8vIEhhbmRsZSB0aGUgdHJhY2su
ICBXZSBoYWx0IHRyYWNrIHNjcm9sbGluZyBvbmNlIHRoZSB0aHVtYiBpcyBsZXZlbAorICAgIC8v
IHdpdGggdXMuCisgICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJhY2tUcmFja1BhcnQgfHwgbV9w
cmVzc2VkUGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KSAmJiB0aHVtYlVuZGVyTW91c2UoKSkgewor
ICAgICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgbV9ob3ZlcmVk
UGFydCA9IFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdlIGNh
bid0IHNjcm9sbCBpZiB3ZSd2ZSBoaXQgdGhlIGJlZ2lubmluZyBvciBlbmQuCisgICAgU2Nyb2xs
RGlyZWN0aW9uIGRpciA9IHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCk7CisgICAgaWYgKGRp
ciA9PSBTY3JvbGxVcCB8fCBkaXIgPT0gU2Nyb2xsTGVmdCkgeworICAgICAgICBpZiAobV9jdXJy
ZW50UG9zID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aWYgKG1fY3VycmVudFBvcyA9PSBtX3RvdGFsU2l6ZSAtIG1fdmlzaWJsZVNpemUpCisgICAgICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zY3JvbGxUaW1lci5zdGFydE9uZVNob3QoZGVs
YXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzdG9wVGltZXJJZk5lZWRlZCgpCit7
CisgICAgaWYgKG1fc2Nyb2xsVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9zY3JvbGxUaW1l
ci5zdG9wKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxQcmVzc2Vk
UGFydChkb3VibGUgZGVsYXkpCit7CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0
aHVtYiBvciBpZiBub3RoaW5nIHdhcyBwcmVzc2VkLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09
IFRodW1iUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IE5vUGFydCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4KKyAgICBpZiAoKG1fcHJlc3NlZFBhcnQgPT0gQmFj
a1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFja1BhcnQpICYmIHRodW1i
VW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOwor
ICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAgICByZXR1cm47CisgICAg
fQorCisgICAgLy8gSGFuZGxlIHRoZSBhcnJvd3MgYW5kIHRyYWNrLgorICAgIGlmIChzY3JvbGwo
cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKSwgcHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0
eSgpKSkKKyAgICAgICAgc3RhcnRUaW1lcklmTmVlZGVkKGRlbGF5KTsKK30KKwordm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQoVGltZXI8UGxhdGZvcm1TY3JvbGxi
YXI+KikKK3sKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoY05vcm1hbFRpbWVyRGVsYXkpOwor
fQorCitTY3JvbGxEaXJlY3Rpb24gUGxhdGZvcm1TY3JvbGxiYXI6OnByZXNzZWRQYXJ0U2Nyb2xs
RGlyZWN0aW9uKCkKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xs
YmFyKSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJhY2tCdXR0b25TdGFydFBhcnQg
fHwgbV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0KQorICAgICAgICAgICAgcmV0dXJuIFNj
cm9sbExlZnQ7CisgICAgICAgIHJldHVybiBTY3JvbGxSaWdodDsKKyAgICB9IGVsc2UgeworICAg
ICAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uU3RhcnRQYXJ0IHx8IG1fcHJlc3Nl
ZFBhcnQgPT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgIHJldHVybiBTY3JvbGxVcDsKKyAg
ICAgICAgcmV0dXJuIFNjcm9sbERvd247CisgICAgfQorfQorCitTY3JvbGxHcmFudWxhcml0eSBQ
bGF0Zm9ybVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0eSgpCit7CisgICAg
aWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblN0YXJ0UGFydCB8fCBtX3ByZXNzZWRQYXJ0
ID09IEZvcndhcmRCdXR0b25TdGFydFBhcnQpCisgICAgICAgIHJldHVybiBTY3JvbGxCeUxpbmU7
CisgICAgcmV0dXJuIFNjcm9sbEJ5UGFnZTsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6
dGh1bWJVbmRlck1vdXNlKCkKK3sKKyAgICAvLyBDb25zdHJ1Y3QgYSByZWN0LgorICAgIEludFJl
Y3QgdGh1bWIgPSB0aHVtYlJlY3QoKTsKKyAgICB0aHVtYi5tb3ZlKC14KCksIC15KCkpOworICAg
IGludCBiZWdpbiA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gdGh1
bWIueCgpIDogdGh1bWIueSgpOworICAgIGludCBlbmQgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLnJpZ2h0KCkgOiB0aHVtYi5ib3R0b20oKTsKKyAgICBy
ZXR1cm4gKGJlZ2luIDw9IG1fcHJlc3NlZFBvcyAmJiBtX3ByZXNzZWRQb3MgPCBlbmQpOworfQor
CitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6Omhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQoU2Nyb2xs
YmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNIb3Jpem9udGFsSGVp
Z2h0W2NvbnRyb2xTaXplXTsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp2ZXJ0aWNhbFNj
cm9sbGJhcldpZHRoKFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRyb2xTaXplKQoreworICAgIHJl
dHVybiBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZV07Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3Jv
bGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAor
eworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlwcGVyUmVjdChjb25zdCBJbnRS
ZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIEludFJlY3QoKTsKK30KKwordm9p
ZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVDaGFuZ2VkKCkKK3sKK30KKworYm9vbCBQbGF0Zm9y
bVNjcm9sbGJhcjo6c2hvdWxkVXBkYXRlQmFja2luZ1N0b3JlKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gcGFyZW50KCkgJiYgKHBhcmVudCgpLT5wYXJlbnQoKSB8fCAhaXNWaWV3U2Nyb2xsYmFyKCkp
OworfQorCitQYXNzUmVmUHRyPFNjcm9sbGJhcj4gU2Nyb2xsYmFyOjpjcmVhdGVOYXRpdmVTY3Jv
bGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVu
dGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQoreworICAgIHJldHVybiBhZG9wdFJl
ZihuZXcgUGxhdGZvcm1TY3JvbGxiYXIoY2xpZW50LCBvcmllbnRhdGlvbiwgc2l6ZSkpOworfQor
Cit9CisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGxhdGZvcm1TY3JvbGxi
YXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGxhdGZvcm1TY3JvbGxiYXIuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhhNjJmCi0tLSAvZGV2L251bGwKKysrIGIv
V2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9QbGF0Zm9ybVNjcm9sbGJhci5oCkBAIC0wLDAgKzEsMTIw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3IEFwcGxlIElu
Yy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVG9jaCBNb2Jp
bGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBQbGF0Zm9ybVNjcm9sbGJhcl9oCisjZGVmaW5lIFBs
YXRmb3JtU2Nyb2xsYmFyX2gKKworI2luY2x1ZGUgIlNjcm9sbEJhci5oIgorI2luY2x1ZGUgIlRp
bWVyLmgiCisjaW5jbHVkZSAiV2lkZ2V0LmgiCisKK3R5cGVkZWYgc3RydWN0IEhEQ19fKiBIREM7
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIFBsYXRmb3JtU2Nyb2xsYmFyIDog
cHVibGljIFNjcm9sbGJhciB7CisgICAgcHVibGljOgorICAgICAgICBQbGF0Zm9ybVNjcm9sbGJh
cihTY3JvbGxiYXJDbGllbnQqLCBTY3JvbGxiYXJPcmllbnRhdGlvbiwgU2Nyb2xsYmFyQ29udHJv
bFNpemUpOworCisgICAgICAgIHZpcnR1YWwgflBsYXRmb3JtU2Nyb2xsYmFyKCk7CisKKyAgICAg
ICAgdmlydHVhbCBib29sIGlzV2lkZ2V0KCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAg
ICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJlbnQoU2Nyb2xsVmlldyopOworCisgICAgICAgIHZpcnR1
YWwgaW50IHdpZHRoKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgaW50IGhlaWdodCgpIGNvbnN0
OworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjdChjb25zdCBJbnRSZWN0Jik7CisgICAgICAg
IHZpcnR1YWwgdm9pZCBzZXRFbmFibGVkKGJvb2wpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcGFp
bnQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCk7CisKKyAgICAg
ICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VF
dmVudCYpOworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VPdXRFdmVudChjb25zdCBQ
bGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICAgICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlUHJl
c3NFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICAgICAgdmlydHVhbCBib29s
IGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworCisg
ICAgICAgIHN0YXRpYyB2b2lkIHRoZW1lQ2hhbmdlZCgpOworICAgICAgICBzdGF0aWMgaW50IGhv
cml6b250YWxTY3JvbGxiYXJIZWlnaHQoU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSA9IFJlZ3Vs
YXJTY3JvbGxiYXIpOworICAgICAgICBzdGF0aWMgaW50IHZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgo
U2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSA9IFJlZ3VsYXJTY3JvbGxiYXIpOworCisgICAgICAg
IHZvaWQgYXV0b3Njcm9sbFRpbWVyRmlyZWQoVGltZXI8UGxhdGZvcm1TY3JvbGxiYXI+Kik7CisK
KyAgICAgICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBlbmFibGVkKCk7IH0KKyAg
ICAgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBtX3Zpc2libGU7IH0KKyAgICAg
ICAgdmlydHVhbCB2b2lkIHNob3coKSB7IG1fdmlzaWJsZSA9IHRydWU7IH0KKyAgICAgICAgdmly
dHVhbCB2b2lkIGhpZGUoKSB7IG1fdmlzaWJsZSA9IGZhbHNlOyB9CisgICAgICAgIHZpcnR1YWwg
Ym9vbCBzaG91bGRVcGRhdGVCYWNraW5nU3RvcmUoKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBi
b29sIGlzU2Nyb2xsYmFyKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAgICB2aXJ0dWFs
IGJvb2wgaXNWaWV3U2Nyb2xsYmFyKCkgY29uc3QgeyByZXR1cm4gbV9pc1ZpZXdTY3JvbGxiYXI7
IH0KKyAgICAgICAgdm9pZCBzZXRJc1ZpZXdTY3JvbGxiYXIoYm9vbCBpcykgeyBtX2lzVmlld1Nj
cm9sbGJhciA9IGlzOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgdm9pZCB1
cGRhdGVUaHVtYlBvc2l0aW9uKCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVUaHVtYlBy
b3BvcnRpb24oKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIEludFJlY3QgYmFja0J1dHRvblJl
Y3QoKSBjb25zdDsKKyAgICAgICAgSW50UmVjdCBmb3J3YXJkQnV0dG9uUmVjdCgpIGNvbnN0Owor
ICAgICAgICBJbnRSZWN0IHRyYWNrUmVjdCgpIGNvbnN0OworICAgICAgICBJbnRSZWN0IHRodW1i
UmVjdCgpIGNvbnN0OworICAgICAgICBJbnRSZWN0IGdyaXBwZXJSZWN0KGNvbnN0IEludFJlY3Qm
IHRodW1iUmVjdCkgY29uc3Q7CisgICAgICAgIHZvaWQgc3BsaXRUcmFjayhjb25zdCBJbnRSZWN0
JiB0cmFja1JlY3QsIEludFJlY3QmIGJlZm9yZVRodW1iUmVjdCwgSW50UmVjdCYgdGh1bWJSZWN0
LCBJbnRSZWN0JiBhZnRlclRodW1iUmVjdCkgY29uc3Q7CisKKyAgICAgICAgaW50IHRodW1iUG9z
aXRpb24oKSBjb25zdDsKKyAgICAgICAgaW50IHRodW1iTGVuZ3RoKCkgY29uc3Q7CisgICAgICAg
IGludCB0cmFja0xlbmd0aCgpIGNvbnN0OworCisgICAgICAgIHZvaWQgcGFpbnRCdXR0b24oR3Jh
cGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYgYnV0dG9uUmVjdCwgYm9vbCBzdGFydCwgY29u
c3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3Q7CisgICAgICAgIHZvaWQgcGFpbnRUcmFjayhH
cmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIGJvb2wgc3RhcnQsIGNv
bnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0OworICAgICAgICB2b2lkIHBhaW50VGh1bWIo
R3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYgdGh1bWJSZWN0LCBjb25zdCBJbnRSZWN0
JiBkYW1hZ2VSZWN0KSBjb25zdDsKKyAgICAgICAgdm9pZCBwYWludEdyaXBwZXIoSERDLCBjb25z
dCBJbnRSZWN0JiBncmlwcGVyUmVjdCkgY29uc3Q7CisKKyAgICAgICAgU2Nyb2xsYmFyUGFydCBo
aXRUZXN0KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworCisgICAgICAgIHZvaWQgc3RhcnRU
aW1lcklmTmVlZGVkKGRvdWJsZSBkZWxheSk7CisgICAgICAgIHZvaWQgc3RvcFRpbWVySWZOZWVk
ZWQoKTsKKyAgICAgICAgdm9pZCBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoZG91YmxlIGRlbGF5KTsK
KyAgICAgICAgU2Nyb2xsRGlyZWN0aW9uIHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCk7Cisg
ICAgICAgIFNjcm9sbEdyYW51bGFyaXR5IHByZXNzZWRQYXJ0U2Nyb2xsR3JhbnVsYXJpdHkoKTsK
KworICAgICAgICBib29sIHRodW1iVW5kZXJNb3VzZSgpOworCisgICAgICAgIHZvaWQgaW52YWxp
ZGF0ZVBhcnQoU2Nyb2xsYmFyUGFydCk7CisgICAgICAgIHZvaWQgaW52YWxpZGF0ZVRyYWNrKCk7
CisKKyAgICAgICAgU2Nyb2xsYmFyUGFydCBtX2hvdmVyZWRQYXJ0OworICAgICAgICBTY3JvbGxi
YXJQYXJ0IG1fcHJlc3NlZFBhcnQ7CisgICAgICAgIGludCBtX3ByZXNzZWRQb3M7CisgICAgICAg
IFRpbWVyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3Njcm9sbFRpbWVyOworICAgICAgICBib29sIG1f
b3ZlcmxhcHNSZXNpemVyOworICAgICAgICBib29sIG1fdmlzaWJsZTsKKyAgICAgICAgYm9vbCBt
X2lzVmlld1Njcm9sbGJhcjsKKyAgICB9OworCit9CisKKyNlbmRpZiAvLyBQbGF0Zm9ybVNjcm9s
bGJhcl9oCisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Nyb2xsVmlld1dp
bmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Nyb2xsVmlld1dpbmNlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjUwZDRmCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TY3JvbGxWaWV3V2luY2UuY3BwCkBAIC0wLDAgKzEs
MTczNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSnVzdGluIEhheWdv
b2QgPGpoYXlnb29kQHNwc3UuZWR1Pi4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNo
IE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2Ny
b2xsVmlldy5oIgorCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50
LmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRl
ICJGcmFtZVRyZWUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGlj
c0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2lu
Y2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU2Nyb2xsYmFy
LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhl
bWUuaCIKKyNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKKyNpbmNsdWRlICJTY3JvbGxiYXIuaCIK
KyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4K
KyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+Cisj
aW5jbHVkZSA8d2luZG93cy5oPgorCisjaWZkZWYgX0RFQlVHCisjZGVmaW5lIFNDUk9MTF9WSUVX
X0RFQlVHICAgIDAKKyNlbmRpZgorCit1c2luZyBzdGQ6Om1pbjsKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCisvLyBzdGFibGVSb3VuZCByb3VuZHMgLTAuNSB0byAwLCB3aGVyZSBscm91bmQgcm91
bmRzIC0wLjUgdG8gLTEuCitzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChkb3VibGUgZCkK
K3sKKyAgICBpZiAoZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQgKyAw
LjUpOworCisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgIHJldHVybiBpIC0g
ZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKworc3RhdGljIGlubGluZSBJbnRQb2ludCBvcGVyYXRv
ciooY29uc3QgSW50UG9pbnQmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBJbnRQb2ludChz
dGFibGVSb3VuZChhLngoKSAqIGIpLCBzdGFibGVSb3VuZChhLnkoKSAqIGIpKTsKK30KK3N0YXRp
YyBpbmxpbmUgSW50UG9pbnQgb3BlcmF0b3IvKGNvbnN0IEludFBvaW50JiBhLCBkb3VibGUgYikK
K3sKKyAgICByZXR1cm4gSW50UG9pbnQoc3RhYmxlUm91bmQoYS54KCkgLyBiKSwgc3RhYmxlUm91
bmQoYS55KCkgLyBiKSk7Cit9CitzdGF0aWMgaW5saW5lIEludFNpemUgb3BlcmF0b3IqKGNvbnN0
IEludFNpemUmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBJbnRTaXplKHN0YWJsZVJvdW5k
KGEud2lkdGgoKSAqIGIpLCBzdGFibGVSb3VuZChhLmhlaWdodCgpICogYikpOworfQorc3RhdGlj
IGlubGluZSBJbnRTaXplIG9wZXJhdG9yLyhjb25zdCBJbnRTaXplJiBhLCBkb3VibGUgYikKK3sK
KyAgICByZXR1cm4gSW50U2l6ZShzdGFibGVSb3VuZChhLndpZHRoKCkgLyBiKSwgc3RhYmxlUm91
bmQoYS5oZWlnaHQoKSAvIGIpKTsKK30KK3N0YXRpYyBpbmxpbmUgSW50U2l6ZSBvcGVyYXRvcioo
Y29uc3QgSW50U2l6ZSYgYSwgY29uc3QgRmxvYXRTaXplIGIpCit7CisgICAgcmV0dXJuIEludFNp
emUoc3RhYmxlUm91bmQoYS53aWR0aCgpICogYi53aWR0aCgpKSwgc3RhYmxlUm91bmQoYS5oZWln
aHQoKSAqIGIuaGVpZ2h0KCkpKTsKK30KKworc3RhdGljIGludCBzY3JvbGxCYXJQaHlzaWNhbFdp
ZHRoID0gMTU7CisKK2NsYXNzIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2YXRlIHsKK3B1Ymxp
YzoKKyAgICBTY3JvbGxWaWV3UHJpdmF0ZShTY3JvbGxWaWV3KiB2aWV3KQorICAgICAgICA6IG1f
dmlldyh2aWV3KQorICAgICAgICAsIG1fc2Nyb2xsYmFyc1N1cHByZXNzZWQoZmFsc2UpCisgICAg
ICAgICwgbV9pblVwZGF0ZVNjcm9sbGJhcnMoZmFsc2UpCisgICAgICAgICwgbV9zY3JvbGxiYXJz
QXZvaWRpbmdSZXNpemVyKDApCisgICAgICAgICwgbV92U2Nyb2xsYmFyTW9kZShTY3JvbGxiYXJB
dXRvKQorICAgICAgICAsIG1faFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFyQXV0bykKKyAgICAgICAg
LCBtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIodGhpcywgJlNjcm9sbFZpZXdQcml2YXRlOjpzY3Jv
bGxCYXJWaXNpYmxlVGltZXJGaXJlZCkKKyAgICAgICAgLCBtX3Zpc2libGVDb250ZW50c1dpZHRo
KDApCisgICAgICAgICwgbV92aXNpYmxlQ29udGVudHNIZWlnaHQoMCkKKyAgICAgICAgLCBtX3By
ZXZTY3JvbGxiYXJVbmRlck1vdXNlKDApCisgICAgICAgICwgbV9wcmV2TW91c2VEb3duKGZhbHNl
KQorICAgICAgICAsIG1fc2Nyb2xsYmFyc1Zpc2libGUoZmFsc2UpCisgICAgICAgICwgbV9zaG93
U2Nyb2xsYmFyU3VwcHJlc3NlZChmYWxzZSkKKyAgICAgICAgLCBtX2F1dG9TaG93SGlkZVNjcm9s
bGJhcnMoZmFsc2UpCisgICAgeworICAgIH0KKworICAgIH5TY3JvbGxWaWV3UHJpdmF0ZSgpCisg
ICAgeworICAgICAgICBzZXRIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKGZhbHNlKTsKKyAgICAgICAg
c2V0SGFzVmVydGljYWxTY3JvbGxiYXIoZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgc2V0SGFz
SG9yaXpvbnRhbFNjcm9sbGJhcihib29sIGhhc0Jhcik7CisgICAgdm9pZCBzZXRIYXNWZXJ0aWNh
bFNjcm9sbGJhcihib29sIGhhc0Jhcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2Vk
KFNjcm9sbGJhciopOworCisgICAgdm9pZCBzY3JvbGxCYWNraW5nU3RvcmUoY29uc3QgSW50U2l6
ZSYgc2Nyb2xsRGVsdGEpOworCisgICAgdm9pZCBzZXRBbGxvd3NTY3JvbGxpbmcoYm9vbCk7Cisg
ICAgYm9vbCBhbGxvd3NTY3JvbGxpbmcoKSBjb25zdDsKKworICAgIHZvaWQgc2hvd1Njcm9sbGJh
cnMoYm9vbCBob3Jpem9udGFsLCBib29sIHZlcnRpY2FsLCBib29sIGZvcmNlKTsKKyAgICB2b2lk
IGhpZGVTY3JvbGxiYXJzKCk7CisgICAgdm9pZCBzY3JvbGxCYXJWaXNpYmxlVGltZXJGaXJlZChU
aW1lcjxTY3JvbGxWaWV3UHJpdmF0ZT4qKTsKKworICAgIGludCBnZXRIQmFySGVpZ2h0KCkgY29u
c3QgeyByZXR1cm4gc3RhYmxlUm91bmQoKGRvdWJsZSlzY3JvbGxCYXJQaHlzaWNhbFdpZHRoIC8g
bV92aWV3LT5zY2FsZSgpKTsgfQorICAgIGludCBnZXRWQmFyV2lkdGgoKSBjb25zdCB7IHJldHVy
biBzdGFibGVSb3VuZCgoZG91YmxlKXNjcm9sbEJhclBoeXNpY2FsV2lkdGggLyBtX3ZpZXctPnNj
YWxlKCkpOyB9CisgICAgSW50UmVjdCBnZXRIQ29ybmVyKGNvbnN0IEludFNpemUmIGlubmVyU2l6
ZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2hCYXIgJiYgbV9oU2Nyb2xsYmFyTW9k
ZSAhPSBTY3JvbGxiYXJBbHdheXNPZmYgJiYgaW5uZXJTaXplLndpZHRoKCkgPiBtX2hCYXItPndp
ZHRoKCkKKyAgICAgICAgICAgID8gSW50UmVjdChtX2hCYXItPndpZHRoKCksIGlubmVyU2l6ZS5o
ZWlnaHQoKSAtIG1faEJhci0+aGVpZ2h0KCksIGlubmVyU2l6ZS53aWR0aCgpIC0gbV9oQmFyLT53
aWR0aCgpLCBtX2hCYXItPmhlaWdodCgpKQorICAgICAgICAgICAgOiBJbnRSZWN0KCk7CisgICAg
fQorICAgIEludFJlY3QgZ2V0VkNvcm5lcihjb25zdCBJbnRTaXplJiBpbm5lclNpemUpIGNvbnN0
CisgICAgeworICAgICAgICByZXR1cm4gbV92QmFyICYmIG1fdlNjcm9sbGJhck1vZGUgIT0gU2Ny
b2xsYmFyQWx3YXlzT2ZmICYmIGlubmVyU2l6ZS5oZWlnaHQoKSA+IG1fdkJhci0+aGVpZ2h0KCkK
KyAgICAgICAgICAgID8gSW50UmVjdChpbm5lclNpemUud2lkdGgoKSAtIG1fdkJhci0+d2lkdGgo
KSwgaW5uZXJTaXplLmhlaWdodCgpLCBpbm5lclNpemUud2lkdGgoKSwgaW5uZXJTaXplLmhlaWdo
dCgpIC0gbV92QmFyLT5oZWlnaHQoKSkKKyAgICAgICAgICAgIDogSW50UmVjdCgpOworICAgIH0K
KworICAgIEludFJlY3QgZ2V0SEJhclJlY3QoY29uc3QgSW50U2l6ZSYgaW5uZXJTaXplKSBjb25z
dAorICAgIHsKKyAgICAgICAgcmV0dXJuIEludFJlY3QoMCwgaW5uZXJTaXplLmhlaWdodCgpIC0g
Z2V0SEJhckhlaWdodCgpLAorICAgICAgICAgICAgaW5uZXJTaXplLndpZHRoKCkgLSAobV92QmFy
ICYmIG1fdlNjcm9sbGJhck1vZGUgIT0gU2Nyb2xsYmFyQWx3YXlzT2ZmID8gZ2V0VkJhcldpZHRo
KCkgOiAwKSwgZ2V0SEJhckhlaWdodCgpKTsKKyAgICB9CisgICAgSW50UmVjdCBnZXRWQmFyUmVj
dChjb25zdCBJbnRTaXplJiBpbm5lclNpemUpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
SW50UmVjdChpbm5lclNpemUud2lkdGgoKSAtIGdldFZCYXJXaWR0aCgpLCAwLCBnZXRWQmFyV2lk
dGgoKSwKKyAgICAgICAgICAgIGlubmVyU2l6ZS5oZWlnaHQoKSAtIChtX2hCYXIgJiYgbV9oU2Ny
b2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmYgPyBnZXRIQmFySGVpZ2h0KCkgOiAwKSk7
CisgICAgfQorCisgICAgLy8gTm90IGxpa2UgU2Nyb2xsVmlldzo6dmlzaWJsZUNvbnRlbnRSZWN0
LCB0aGlzIGZ1bmN0aW9uIHRha2VzIHNjcm9sbGJhcnMgaW4gY291bnQsCisgICAgLy8gYW5kIHJl
dHVybiB0aGUgYXJlYSBub3QgaW5jbHVkaW5nIHNjcm9sbGJhcnMuCisgICAgSW50UmVjdCAgICBn
ZXRWaXNpYmxlQ29udGVudFJlY3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgSW50UmVjdCByZWN0
KG1fdmlldy0+ZnJhbWVSZWN0KCkpOworICAgICAgICBpZiAobV9zY3JvbGxiYXJzVmlzaWJsZSkg
eworICAgICAgICAgICAgaWYgKGNhblNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICAgICAg
cmVjdC5zZXRIZWlnaHQobV9oQmFyLT55KCkpOworICAgICAgICAgICAgaWYgKGNhblNob3dWU2Ny
b2xsYmFyKCkpCisgICAgICAgICAgICAgICAgcmVjdC5zZXRXaWR0aChtX3ZCYXItPngoKSk7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlY3Q7CisgICAgfQorCisgICAgdm9pZCBpbnZhbGlk
YXRlU2Nyb2xsYmFyKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIsIEhXTkQgaHduZCwgY29uc3QgVHJh
bnNmb3JtYXRpb25NYXRyaXgqIHRyYW5zID0gMCk7CisgICAgdm9pZCBpbnZhbGlkYXRlU2Nyb2xs
YmFycyhib29sIGhvcml6b250YWwsIGJvb2wgdmVydGljYWwsIGJvb2wgY29ybmVyKTsKKworICAg
IGJvb2wgY2FuU2hvd1ZTY3JvbGxiYXIoKSBjb25zdCB7IHJldHVybiBtX3ZCYXIgJiYgbV92U2Ny
b2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmY7IH0KKyAgICBib29sIGNhblNob3dIU2Ny
b2xsYmFyKCkgY29uc3QgeyByZXR1cm4gbV9oQmFyICYmIG1faFNjcm9sbGJhck1vZGUgIT0gU2Ny
b2xsYmFyQWx3YXlzT2ZmOyB9CisKKyAgICB2b2lkIHNldEF1dG9TY3JvbGxiYXJzKGJvb2wgZCkK
KyAgICB7CisgICAgICAgIGlmIChkID09IG1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFycykKKyAgICAg
ICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzID0g
ZCkgeworICAgICAgICAgICAgaWYgKG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1lci5pc0FjdGl2ZSgp
KQorICAgICAgICAgICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1lci5zdG9wKCk7CisgICAg
ICAgIH0gZWxzZSBpZiAobV9zY3JvbGxiYXJzVmlzaWJsZSAmJiAhbV9zY3JvbGxiYXJzVmlzaWJs
ZVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgICAgICBtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIu
c3RhcnRPbmVTaG90KDIuMCk7CisgICAgfQorCisgICAgU2Nyb2xsVmlldyogbV92aWV3OworICAg
IEludFNpemUgbV9zY3JvbGxPZmZzZXQ7CisgICAgSW50U2l6ZSBtX2NvbnRlbnRzU2l6ZTsKKyAg
ICBib29sIG1fc2Nyb2xsYmFyc1N1cHByZXNzZWQ7CisgICAgYm9vbCBtX2luVXBkYXRlU2Nyb2xs
YmFyczsKKyAgICBpbnQgbV9zY3JvbGxiYXJzQXZvaWRpbmdSZXNpemVyOworICAgIFNjcm9sbGJh
ck1vZGUgbV92U2Nyb2xsYmFyTW9kZTsKKyAgICBTY3JvbGxiYXJNb2RlIG1faFNjcm9sbGJhck1v
ZGU7CisgICAgUmVmUHRyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3ZCYXI7CisgICAgUmVmUHRyPFBs
YXRmb3JtU2Nyb2xsYmFyPiBtX2hCYXI7CisgICAgSFJHTiBtX2RpcnR5UmVnaW9uOworICAgIEhh
c2hTZXQ8UmVmUHRyPFdpZGdldD4gPiBtX2NoaWxkcmVuOworCisgICAgYm9vbCBtX3Njcm9sbGJh
cnNWaXNpYmxlOworICAgIGJvb2wgbV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZDsKKyAgICBUaW1l
cjxTY3JvbGxWaWV3UHJpdmF0ZT4gbV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyOworCisgICAgSW50
UmVjdCBtX3BoeXNpY2FsR2VvbWV0cnk7CisgICAgZmxvYXQgbV92aXNpYmxlQ29udGVudHNXaWR0
aDsKKyAgICBmbG9hdCBtX3Zpc2libGVDb250ZW50c0hlaWdodDsKKyAgICBQbGF0Zm9ybVNjcm9s
bGJhciogbV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZTsKKyAgICBib29sIG1fcHJldk1vdXNlRG93
bjsKKyAgICBib29sIG1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFyczsKK307CisKKy8vIEZvciB0b3Ag
bGV2ZWwgb25seSEKK3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OmludmFsaWRh
dGVTY3JvbGxiYXIoUGxhdGZvcm1TY3JvbGxiYXIqIGJhciwgSFdORCBod25kLCBjb25zdCBUcmFu
c2Zvcm1hdGlvbk1hdHJpeCogdHJhbnMpCit7CisgICAgaWYgKCFiYXIgfHwgIWh3bmQpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmICh0cmFucykgeworICAgICAgICBSRUNUIHJlY3RXaW4gPSB0
cmFucy0+bWFwUmVjdChiYXItPmZyYW1lUmVjdCgpKTsKKyAgICAgICAgaWYgKHJlY3RXaW4uYm90
dG9tIDwgbV9waHlzaWNhbEdlb21ldHJ5LmJvdHRvbSgpKQorICAgICAgICAgICAgcmVjdFdpbi5i
b3R0b20gPSBtX3BoeXNpY2FsR2VvbWV0cnkuYm90dG9tKCk7CisgICAgICAgIGlmIChyZWN0V2lu
LnJpZ2h0IDwgbV9waHlzaWNhbEdlb21ldHJ5LnJpZ2h0KCkpCisgICAgICAgICAgICByZWN0V2lu
LnJpZ2h0ID0gbV9waHlzaWNhbEdlb21ldHJ5LnJpZ2h0KCk7CisgICAgICAgIGlmIChtX3ZpZXct
PmlzVmlzaWJsZSgpKQorICAgICAgICAgICAgOjpJbnZhbGlkYXRlUmVjdChod25kLCAmcmVjdFdp
biwgRkFMU0UpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG15
VHJhbnMobV92aWV3LT5zY2FsZSgpLCAwLCAwLCBtX3ZpZXctPnNjYWxlKCksIG1fdmlldy0+eCgp
LCBtX3ZpZXctPnkoKSk7CisgICAgICAgIGludmFsaWRhdGVTY3JvbGxiYXIoYmFyLCBod25kLCAm
bXlUcmFucyk7CisgICAgfQorfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2YXRl
OjppbnZhbGlkYXRlU2Nyb2xsYmFycyhib29sIGhvcml6b250YWwsIGJvb2wgdmVydGljYWwsIGJv
b2wgY29ybmVyKQoreworICAgIGlmICghbV9zY3JvbGxiYXJzVmlzaWJsZSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaWYgKCghdmVydGljYWwgfHwgIWNhblNob3dWU2Nyb2xsYmFyKCkpICYmICgh
aG9yaXpvbnRhbCB8fCAhY2FuU2hvd0hTY3JvbGxiYXIoKSkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmIChtX3ZpZXctPnBhcmVudCgpKSB7CisgICAgICAgIGlmIChob3Jpem9udGFsICYmIGNh
blNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBtX2hCYXItPmludmFsaWRhdGUoKTsKKyAg
ICAgICAgaWYgKHZlcnRpY2FsICYmIGNhblNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBt
X3ZCYXItPmludmFsaWRhdGUoKTsKKworICAgICAgICBpZiAoY29ybmVyKSB7CisgICAgICAgICAg
ICBJbnRTaXplIGlubmVyU2l6ZShtX3Zpc2libGVDb250ZW50c1dpZHRoLCBtX3Zpc2libGVDb250
ZW50c0hlaWdodCk7CisgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHRoZSBzY3JvbGwgY29ybmVy
IHRvbyBvbiB1bnN1cHByZXNzLgorICAgICAgICAgICAgSW50UmVjdCBoQ29ybmVyID0gZ2V0SENv
cm5lcihpbm5lclNpemUpOworICAgICAgICAgICAgbV92aWV3LT5pbnZhbGlkYXRlUmVjdChoQ29y
bmVyKTsKKworICAgICAgICAgICAgSW50UmVjdCB2Q29ybmVyID0gZ2V0VkNvcm5lcihpbm5lclNp
emUpOworICAgICAgICAgICAgaWYgKHZDb3JuZXIgIT0gaENvcm5lcikKKyAgICAgICAgICAgICAg
ICBtX3ZpZXctPmludmFsaWRhdGVSZWN0KHZDb3JuZXIpOworICAgICAgICB9CisgICAgfSBlbHNl
IHsKKyAgICAgICAgaWYgKCFtX3ZpZXctPmlzVmlzaWJsZSgpKQorICAgICAgICAgICAgcmV0dXJu
OworCisgICAgICAgIGRvdWJsZSBzY2FsZSA9IG1fdmlldy0+c2NhbGUoKTsKKyAgICAgICAgVHJh
bnNmb3JtYXRpb25NYXRyaXggdHJhbnMoc2NhbGUsIDAsIDAsIHNjYWxlLCBtX3ZpZXctPngoKSwg
bV92aWV3LT55KCkpOworCisgICAgICAgIEhXTkQgcGxhdGZvcm1XaWRnZXRIYW5kbGUgPSBtX3Zp
ZXctPnBsYXRmb3JtV2lkZ2V0KCk7CisgICAgICAgIGlmIChob3Jpem9udGFsICYmIGNhblNob3dI
U2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBpbnZhbGlkYXRlU2Nyb2xsYmFyKG1faEJhci5nZXQo
KSwgcGxhdGZvcm1XaWRnZXRIYW5kbGUsICZ0cmFucyk7CisgICAgICAgIGlmICh2ZXJ0aWNhbCAm
JiBjYW5TaG93VlNjcm9sbGJhcigpKQorICAgICAgICAgICAgaW52YWxpZGF0ZVNjcm9sbGJhciht
X3ZCYXIuZ2V0KCksIHBsYXRmb3JtV2lkZ2V0SGFuZGxlLCAmdHJhbnMpOworICAgIH0KK30KKwor
dm9pZCBTY3JvbGxWaWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6c2V0SGFzSG9yaXpvbnRhbFNjcm9s
bGJhcihib29sIGhhc0JhcikKK3sKKyAgICBpZiAoaGFzQmFyICYmICFtX2hCYXIpIHsKKyAgICAg
ICAgbV9oQmFyID0gYWRvcHRSZWYobmV3IFBsYXRmb3JtU2Nyb2xsYmFyKG1fdmlldywgSG9yaXpv
bnRhbFNjcm9sbGJhciwgUmVndWxhclNjcm9sbGJhcikpOworICAgICAgICBtX2hCYXItPnNldElz
Vmlld1Njcm9sbGJhcih0cnVlKTsKKyAgICAgICAgSW50U2l6ZSBpbm5lclNpemUobV92aXNpYmxl
Q29udGVudHNXaWR0aCwgbV92aXNpYmxlQ29udGVudHNIZWlnaHQpOworICAgICAgICBtX3ZpZXct
PmFkZENoaWxkKG1faEJhci5nZXQoKSk7CisgICAgICAgIG1faEJhci0+c2V0RnJhbWVSZWN0KGdl
dEhCYXJSZWN0KGlubmVyU2l6ZSkpOworICAgICAgICBpZiAoIW1fc2Nyb2xsYmFyc1Zpc2libGUp
CisgICAgICAgICAgICBtX2hCYXItPmhpZGUoKTsKKyAgICB9IGVsc2UgaWYgKCFoYXNCYXIgJiYg
bV9oQmFyKSB7CisgICAgICAgIG1fdmlldy0+cmVtb3ZlQ2hpbGQobV9oQmFyLmdldCgpKTsKKyAg
ICAgICAgbV9oQmFyID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmll
d1ByaXZhdGU6OnNldEhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGJvb2wgaGFzQmFyKQoreworICAgIGlm
IChoYXNCYXIgJiYgIW1fdkJhcikgeworICAgICAgICBtX3ZCYXIgPSBhZG9wdFJlZihuZXcgUGxh
dGZvcm1TY3JvbGxiYXIobV92aWV3LCBWZXJ0aWNhbFNjcm9sbGJhciwgUmVndWxhclNjcm9sbGJh
cikpOworICAgICAgICBtX3ZCYXItPnNldElzVmlld1Njcm9sbGJhcih0cnVlKTsKKyAgICAgICAg
SW50U2l6ZSBpbm5lclNpemUobV92aXNpYmxlQ29udGVudHNXaWR0aCwgbV92aXNpYmxlQ29udGVu
dHNIZWlnaHQpOworICAgICAgICBtX3ZpZXctPmFkZENoaWxkKG1fdkJhci5nZXQoKSk7CisgICAg
ICAgIG1fdkJhci0+c2V0RnJhbWVSZWN0KGdldFZCYXJSZWN0KGlubmVyU2l6ZSkpOworICAgICAg
ICBpZiAoIW1fc2Nyb2xsYmFyc1Zpc2libGUpCisgICAgICAgICAgICBtX3ZCYXItPmhpZGUoKTsK
KyAgICB9IGVsc2UgaWYgKCFoYXNCYXIgJiYgbV92QmFyKSB7CisgICAgICAgIG1fdmlldy0+cmVt
b3ZlQ2hpbGQobV92QmFyLmdldCgpKTsKKyAgICAgICAgbV92QmFyID0gMDsKKyAgICB9Cit9CisK
K3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnZhbHVlQ2hhbmdlZChTY3JvbGxi
YXIqIGJhcikKK3sKKyAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHJlYWxseSBtb3ZlZC4KKyAgICBJ
bnRTaXplIG5ld09mZnNldCA9IG1fc2Nyb2xsT2Zmc2V0OworICAgIHsKKyAgICAgICAgaW50IHZh
bHVlID0gYmFyLT52YWx1ZSgpOworICAgICAgICBkb3VibGUgc2NhbGUgPSBtX3ZpZXctPnNjYWxl
KCk7CisgICAgICAgIHZhbHVlID0gc3RhYmxlUm91bmQoc3RhYmxlUm91bmQodmFsdWUgKiBzY2Fs
ZSkgLyBzY2FsZSk7CisKKyAgICAgICAgaWYgKGJhciA9PSBtX2hCYXIpCisgICAgICAgICAgICBu
ZXdPZmZzZXQuc2V0V2lkdGgodmFsdWUpOworICAgICAgICBlbHNlIGlmIChiYXIgPT0gbV92QmFy
KQorICAgICAgICAgICAgbmV3T2Zmc2V0LnNldEhlaWdodCh2YWx1ZSk7CisgICAgfQorICAgIElu
dFNpemUgc2Nyb2xsRGVsdGEgPSBuZXdPZmZzZXQgLSBtX3Njcm9sbE9mZnNldDsKKyAgICBpZiAo
c2Nyb2xsRGVsdGEgPT0gSW50U2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyNpZiBkZWZpbmVk
KFNDUk9MTF9WSUVXX0RFQlVHKSAmJiBTQ1JPTExfVklFV19ERUJVRyA+PSAyCisgICAgcHJpbnRm
KCJTY3JvbGxWaWV3OiAweCV4OjB4JXg6IG1fc2Nyb2xsT2Zmc2V0OiAoJWQsICVkKSAtPiAoJWQs
ICVkKS5cbiIsIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldyktPnBhcmVudCgpLCBtX3Zp
ZXcsCisgICAgICAgIG1fc2Nyb2xsT2Zmc2V0LndpZHRoKCksIG1fc2Nyb2xsT2Zmc2V0LmhlaWdo
dCgpLCBuZXdPZmZzZXQud2lkdGgoKSwgbmV3T2Zmc2V0LmhlaWdodCgpKTsKKyNlbmRpZgorCisg
ICAgbV9zY3JvbGxPZmZzZXQgPSBuZXdPZmZzZXQ7CisKKyAgICBpZiAobV9zaG93U2Nyb2xsYmFy
U3VwcHJlc3NlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2hvd1Njcm9sbGJhcnMoZmFsc2Us
IGZhbHNlLCBmYWxzZSk7CisgICAgc2Nyb2xsQmFja2luZ1N0b3JlKHNjcm9sbERlbHRhKTsKKyAg
ICAvL3N0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldyktPmZyYW1lKCktPnNlbmRTY3JvbGxF
dmVudCgpOworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29u
c3QgRnJhbWVWaWV3Kj4obV92aWV3KTsKKyAgICBpZiAoRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3
LT5mcmFtZSgpKSB7CisgICAgICAgIGlmIChmcmFtZS0+c2hvdWxkQmxpbmtDYXJldCgpKQorICAg
ICAgICAgICAgbV92aWV3LT5ob3N0V2luZG93KCktPmNhcmV0UmVjdENoYW5nZWQoKTsKKyAgICB9
Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnNjcm9sbEJhY2tpbmdT
dG9yZShjb25zdCBJbnRTaXplJiBzY3JvbGxEZWx0YSkKK3sKKyAgICBpZiAoIXNjcm9sbERlbHRh
LndpZHRoKCkgJiYgIXNjcm9sbERlbHRhLmhlaWdodCgpKQorICAgICAgICByZXR1cm47CisKKyAg
ICBJbnRSZWN0IHNjcm9sbFZpZXdSZWN0OworICAgIGlmIChtX3ZpZXctPnBhcmVudCgpKQorICAg
ICAgICBzY3JvbGxWaWV3UmVjdCA9IG1fdmlldy0+cGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3co
Z2V0VmlzaWJsZUNvbnRlbnRSZWN0KCkpOworICAgIGVsc2UKKyAgICAgICAgc2Nyb2xsVmlld1Jl
Y3QgPSBtX3ZpZXctPmNvbnRlbnRzVG9XaW5kb3coSW50UmVjdChJbnRQb2ludCgwLCAwKSwgbV9j
b250ZW50c1NpemUpKTsKKworICAgIEludFNpemUgb2xkT2Zmc2V0ID0gKG1fc2Nyb2xsT2Zmc2V0
IC0gc2Nyb2xsRGVsdGEpICogbV92aWV3LT5zY2FsZSgpOworICAgIEludFNpemUgbmV3T2Zmc2V0
ID0gbV9zY3JvbGxPZmZzZXQgKiBtX3ZpZXctPnNjYWxlKCk7CisgICAgRnJhbWUqIGZyYW1lID0g
c3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV92aWV3KS0+ZnJhbWUoKTsKKyAgICBtX3ZpZXctPmhv
c3RXaW5kb3coKS0+c2Nyb2xsKGZyYW1lLCBJbnRTaXplKG9sZE9mZnNldC53aWR0aCgpIC0gbmV3
T2Zmc2V0LndpZHRoKCkKKyAgICAgICAgLCBvbGRPZmZzZXQuaGVpZ2h0KCkgLSBuZXdPZmZzZXQu
aGVpZ2h0KCkpCisgICAgICAgICwgc2Nyb2xsVmlld1JlY3QsIHNjcm9sbFZpZXdSZWN0KTsKKyAg
ICBtX3ZpZXctPmhvc3RXaW5kb3coKS0+cmVwYWludChmcmFtZSwgc2Nyb2xsVmlld1JlY3QsIGZh
bHNlLCB0cnVlLCBmYWxzZSk7CisKKyAgICAvLyBUaGlzIGNhbGwgd2lsbCBtb3ZlIGNoaWxkIEhX
TkRzIChwbHVnaW5zKSBhbmQgaW52YWxpZGF0ZSB0aGVtIGFzIHdlbGwuCisgICAgbV92aWV3LT5m
cmFtZVJlY3RzQ2hhbmdlZCgpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2
YXRlOjpzZXRBbGxvd3NTY3JvbGxpbmcoYm9vbCBmbGFnKQoreworICAgIGlmIChmbGFnICYmIG1f
dlNjcm9sbGJhck1vZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQorICAgICAgICBtX3ZTY3JvbGxi
YXJNb2RlID0gU2Nyb2xsYmFyQXV0bzsKKyAgICBlbHNlIGlmICghZmxhZykKKyAgICAgICAgbV92
U2Nyb2xsYmFyTW9kZSA9IFNjcm9sbGJhckFsd2F5c09mZjsKKworICAgIGlmIChmbGFnICYmIG1f
aFNjcm9sbGJhck1vZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQorICAgICAgICBtX2hTY3JvbGxi
YXJNb2RlID0gU2Nyb2xsYmFyQXV0bzsKKyAgICBlbHNlIGlmICghZmxhZykKKyAgICAgICAgbV9o
U2Nyb2xsYmFyTW9kZSA9IFNjcm9sbGJhckFsd2F5c09mZjsKKworICAgIG1fdmlldy0+dXBkYXRl
U2Nyb2xsYmFycyhtX3Njcm9sbE9mZnNldCk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6U2Nyb2xs
Vmlld1ByaXZhdGU6OmFsbG93c1Njcm9sbGluZygpIGNvbnN0Cit7CisgICAgLy8gUmV0dXJuIFlF
UyBpZiBlaXRoZXIgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzY3JvbGxpbmcgaXMgYWxsb3dlZC4K
KyAgICByZXR1cm4gbV9oU2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmYgfHwgbV92
U2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmY7Cit9CisKK3ZvaWQgU2Nyb2xsVmll
dzo6U2Nyb2xsVmlld1ByaXZhdGU6OnNob3dTY3JvbGxiYXJzKGJvb2wgaG9yaXpvbnRhbCwgYm9v
bCB2ZXJ0aWNhbCwgYm9vbCBtYW51YWwpCit7CisgICAgaWYgKCFtYW51YWwgJiYgIW1fYXV0b1No
b3dIaWRlU2Nyb2xsYmFycykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fc2Nyb2xsYmFy
c1Zpc2libGVUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9sbGJhcnNWaXNpYmxlVGlt
ZXIuc3RvcCgpOworCisgICAgaWYgKCFjYW5TaG93SFNjcm9sbGJhcigpICYmICFjYW5TaG93VlNj
cm9sbGJhcigpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fc2Nyb2xsYmFyc1Zpc2li
bGUpIHsKKyAgICAgICAgSW50U2l6ZSBpbm5lclNpemUobV92aXNpYmxlQ29udGVudHNXaWR0aCwg
bV92aXNpYmxlQ29udGVudHNIZWlnaHQpOworCisgICAgICAgIGlmIChtX2hCYXIpIHsKKyAgICAg
ICAgICAgIG1faEJhci0+c2hvdygpOworICAgICAgICAgICAgbV9oQmFyLT5zZXRGcmFtZVJlY3Qo
Z2V0SEJhclJlY3QoaW5uZXJTaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdkJhcikg
eworICAgICAgICAgICAgbV92QmFyLT5zaG93KCk7CisgICAgICAgICAgICBtX3ZCYXItPnNldEZy
YW1lUmVjdChnZXRWQmFyUmVjdChpbm5lclNpemUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAo
IW1fdmlldy0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGludmFsaWRhdGVTY3JvbGxiYXJzKHRy
dWUsIHRydWUsIHRydWUpOworICAgICAgICAgICAgbV9zY3JvbGxiYXJzVmlzaWJsZSA9IHRydWU7
CisgICAgICAgICAgICBpZiAobV92aWV3LT5pc1Zpc2libGUoKSkKKyAgICAgICAgICAgICAgICBV
cGRhdGVXaW5kb3cobV92aWV3LT5wbGF0Zm9ybVdpZGdldCgpKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICBpZiAobV92aWV3LT5wYXJlbnQoKSkgeworICAgICAgICBpbnZhbGlkYXRlU2Nyb2xsYmFy
cyhob3Jpem9udGFsIHx8ICFtX3Njcm9sbGJhcnNWaXNpYmxlLCB2ZXJ0aWNhbCB8fCAhbV9zY3Jv
bGxiYXJzVmlzaWJsZSwgIW1fc2Nyb2xsYmFyc1Zpc2libGUpOworICAgICAgICBtX3Njcm9sbGJh
cnNWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgLy9tX3ZpZXctPnVwZGF0ZUJhY2tpbmdTdG9yZSgp
OworICAgIH0KKworICAgIGlmIChtX2F1dG9TaG93SGlkZVNjcm9sbGJhcnMpCisgICAgICAgIG1f
c2Nyb2xsYmFyc1Zpc2libGVUaW1lci5zdGFydE9uZVNob3QoMi4wKTsKK30KKwordm9pZCBTY3Jv
bGxWaWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6aGlkZVNjcm9sbGJhcnMoKQoreworICAgIGlmICht
X3Njcm9sbGJhcnNWaXNpYmxlKSB7CisgICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGUgPSBmYWxz
ZTsKKyAgICAgICAgaW52YWxpZGF0ZVNjcm9sbGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAg
ICAgIGlmIChtX2hCYXIpIHsKKyAgICAgICAgICAgIG1faEJhci0+aGlkZSgpOworICAgICAgICAg
ICAgbV9oQmFyLT5zZXRGcmFtZVJlY3QoSW50UmVjdCgwLCAwLCAwLCBtX2hCYXItPmhlaWdodCgp
KSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdkJhcikgeworICAgICAgICAgICAgbV92QmFy
LT5oaWRlKCk7CisgICAgICAgICAgICBtX3ZCYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KDAsIDAs
IG1fdkJhci0+d2lkdGgoKSwgMCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtX3ZpZXctPmlz
VmlzaWJsZSgpKQorICAgICAgICAgICAgVXBkYXRlV2luZG93KG1fdmlldy0+cGxhdGZvcm1XaWRn
ZXQoKSk7CisgICAgfQorfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2YXRlOjpz
Y3JvbGxCYXJWaXNpYmxlVGltZXJGaXJlZChUaW1lcjxTY3JvbGxWaWV3UHJpdmF0ZT4qKQorewor
ICAgIGlmIChtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9z
Y3JvbGxiYXJzVmlzaWJsZVRpbWVyLnN0b3AoKTsKKworICAgIGlmICghbV9hdXRvU2hvd0hpZGVT
Y3JvbGxiYXJzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWNhblNob3dIU2Nyb2xsYmFy
KCkgJiYgIWNhblNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICht
X3Njcm9sbGJhcnNWaXNpYmxlKSB7CisgICAgICAgIGlmIChtX3ZpZXctPmlzVmlzaWJsZSgpICYm
IEdldENhcHR1cmUoKSA9PSBtX3ZpZXctPnBsYXRmb3JtV2lkZ2V0KCkpCisgICAgICAgICAgICAv
LyBDYXB0dXJpbmcgbW91c2UgZXZlbnQsIHVzZXIgbWlnaHQgYmUgZHJhZ2dpbmcgc2Nyb2xsIGJh
cgorICAgICAgICAgICAgbV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyLnN0YXJ0T25lU2hvdCgyLjAp
OworICAgICAgICBlbHNlCisgICAgICAgICAgICBoaWRlU2Nyb2xsYmFycygpOworICAgIH0KK30K
KworU2Nyb2xsVmlldzo6U2Nyb2xsVmlldygpCisgICAgOiBtX2RhdGEobmV3IFNjcm9sbFZpZXdQ
cml2YXRlKHRoaXMpKQorICAgICwgbV9zY2FsZSgxLikKKyAgICAsIG1fdXNlQW5jaG9yUG9pbnQo
ZmFsc2UpCisgICAgLCBtX2FsbG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSh0cnVlKQoreworfQor
CitTY3JvbGxWaWV3Ojp+U2Nyb2xsVmlldygpCit7CisgICAgZGVsZXRlIG1fZGF0YTsKK30KKwor
dm9pZCBTY3JvbGxWaWV3OjpyZXBhaW50Q29udGVudFJlY3RhbmdsZShjb25zdCBJbnRSZWN0JiBy
ZWN0LCBib29sIG5vdykKK3sKKyAgICBpZiAocmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
RnJhbWVWaWV3Kj4odGhpcyk7CisgICAgaG9zdFdpbmRvdygpLT5kaXNwYXRjaENvbnRlbnRzVXBk
YXRlZChmcmFtZVZpZXctPmZyYW1lKCksIHJlY3QpOworCisgICAgaG9zdFdpbmRvdygpLT5yZXBh
aW50KGZyYW1lVmlldy0+ZnJhbWUoKSwgY29udGVudHNUb1dpbmRvdyhyZWN0KSwgdHJ1ZSwgbm93
KTsKK30KKworaW50IFNjcm9sbFZpZXc6OnZpc2libGVXaWR0aCgpIGNvbnN0Cit7CisgICAgaW50
IHcgPSBwYXJlbnQoKSA/IHdpZHRoKCkgOiB2aWV3U2l6ZS53aWR0aCgpIDw9IDAgPyA4MDAgOiB2
aWV3U2l6ZS53aWR0aCgpOworICAgIGlmICghbV9kYXRhLT5tX2F1dG9TaG93SGlkZVNjcm9sbGJh
cnMgJiYgbV9kYXRhLT5tX3Njcm9sbGJhcnNWaXNpYmxlICYmIG1fZGF0YS0+Y2FuU2hvd1ZTY3Jv
bGxiYXIoKSkKKyAgICAgICAgdyAtPSBtX2RhdGEtPm1fdkJhci0+d2lkdGgoKTsKKyAgICByZXR1
cm4gdzsKK30KKworaW50IFNjcm9sbFZpZXc6OnZpc2libGVIZWlnaHQoKSBjb25zdAoreworICAg
IGludCBoID0gcGFyZW50KCkgPyBoZWlnaHQoKSA6IHZpZXdTaXplLmhlaWdodCgpIDw9IDAgPyAx
MDI0IDogdmlld1NpemUuaGVpZ2h0KCk7CisgICAgaWYgKCFtX2RhdGEtPm1fYXV0b1Nob3dIaWRl
U2Nyb2xsYmFycyAmJiBtX2RhdGEtPm1fc2Nyb2xsYmFyc1Zpc2libGUgJiYgbV9kYXRhLT5jYW5T
aG93SFNjcm9sbGJhcigpKQorICAgICAgICBoIC09IG1fZGF0YS0+bV9oQmFyLT5oZWlnaHQoKTsK
KyAgICByZXR1cm4gaDsKK30KKworSW50UmVjdCBTY3JvbGxWaWV3Ojp2aXNpYmxlQ29udGVudFJl
Y3QoYm9vbCkgY29uc3QKK3sKKyAgICByZXR1cm4gSW50UmVjdChtX2RhdGEtPm1fc2Nyb2xsT2Zm
c2V0LndpZHRoKCkKKyAgICAgICAgLCBtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgpCisg
ICAgICAgICwgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoCisgICAgICAgICwgbV9kYXRh
LT5tX3Zpc2libGVDb250ZW50c0hlaWdodAorICAgICAgICApOworfQorCitJbnRSZWN0IFNjcm9s
bFZpZXc6OnZpc2libGVDb250ZW50UmVjdENvbnNpZGVyaW5nRXh0ZXJuYWxTY3JvbGxlcnMoKSBj
b25zdAoreworICAgIC8vIGV4dGVybmFsIHNjcm9sbGVycyBub3Qgc3VwcG9ydGVkIGZvciBub3cK
KyAgICByZXR1cm4gdmlzaWJsZUNvbnRlbnRSZWN0KCk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6
c2V0Q29udGVudHNQb3MoaW50IG5ld1gsIGludCBuZXdZKQoreworICAgIGludCBkeCA9IG5ld1gg
LSBjb250ZW50c1goKTsKKyAgICBpbnQgZHkgPSBuZXdZIC0gY29udGVudHNZKCk7CisgICAgc2Ny
b2xsQnkoZHgsIGR5KTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRDb250ZW50c1NpemUoY29u
c3QgSW50U2l6ZSYgbmV3Q29udGVudHNTaXplKQoreworICAgIGlmIChtX2RhdGEtPm1fY29udGVu
dHNTaXplID09IG5ld0NvbnRlbnRzU2l6ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9kYXRh
LT5tX2NvbnRlbnRzU2l6ZSA9IG5ld0NvbnRlbnRzU2l6ZTsKKworICAgIGhpZGVDdXJyZW50UG9w
dXBNZW51KCk7CisKKyAgICB1cGRhdGVTY3JvbGxiYXJzKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQp
OworCisgICAgaWYgKGlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgRnJhbWVWaWV3KiBmcmFtZVZp
ZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAgICAgaWYgKEZyYW1lICpm
cmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUoKSkKKyAgICAgICAgICAgIGZyYW1lLT5wYWdlKCktPmNo
cm9tZSgpLT5jb250ZW50c1NpemVDaGFuZ2VkKGZyYW1lVmlldy0+ZnJhbWUoKSwgbmV3Q29udGVu
dHNTaXplKTsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0RnJhbWVSZWN0KGNvbnN0
IEludFJlY3QmIG5ld0dlb21ldHJ5LCBib29sIG5lZWRzTGF5b3V0KQoreworICAgIEludFJlY3Qg
bmV3UmVjdDsKKyAgICBJbnRTaXplIG9sZFZpc2libGVDb250ZW50c1NpemUobWluKG1fZGF0YS0+
bV9jb250ZW50c1NpemUud2lkdGgoKSwgKGludCltX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lk
dGgpCisgICAgICAgICwgbWluKG1fZGF0YS0+bV9jb250ZW50c1NpemUuaGVpZ2h0KCksIChpbnQp
bV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCkpOworICAgIGlmIChwYXJlbnQoKSkgewor
ICAgICAgICBtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSA9IHBhcmVudCgpLT5jb250ZW50c1Rv
V2luZG93KG5ld0dlb21ldHJ5KTsKKyAgICAgICAgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dp
ZHRoID0gbmV3R2VvbWV0cnkud2lkdGgoKTsKKyAgICAgICAgbV9kYXRhLT5tX3Zpc2libGVDb250
ZW50c0hlaWdodCA9IG5ld0dlb21ldHJ5LmhlaWdodCgpOworICAgICAgICBuZXdSZWN0ID0gbmV3
R2VvbWV0cnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9kYXRhLT5tX3BoeXNpY2FsR2VvbWV0
cnkgPSBuZXdHZW9tZXRyeTsKKyAgICAgICAgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRo
ID0gbmV3R2VvbWV0cnkud2lkdGgoKSAvIHNjYWxlKCk7CisgICAgICAgIG1fZGF0YS0+bV92aXNp
YmxlQ29udGVudHNIZWlnaHQgPSBuZXdHZW9tZXRyeS5oZWlnaHQoKSAvIHNjYWxlKCk7CisgICAg
ICAgIG5ld1JlY3Quc2V0TG9jYXRpb24obmV3R2VvbWV0cnkubG9jYXRpb24oKSk7CisgICAgICAg
IG5ld1JlY3Quc2V0V2lkdGgoY2VpbChtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgpKTsK
KyAgICAgICAgbmV3UmVjdC5zZXRIZWlnaHQoY2VpbChtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRz
SGVpZ2h0KSk7CisgICAgfQorCisgICAgSW50UmVjdCBvbGRHZW9tZXRyeSA9IGZyYW1lUmVjdCgp
OworICAgIFdpZGdldDo6c2V0RnJhbWVSZWN0KG5ld1JlY3QpOworCisgICAgaWYgKG5ld1JlY3Qg
PT0gb2xkR2VvbWV0cnkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChuZXdSZWN0LnNpemUo
KSAhPSBvbGRHZW9tZXRyeS5zaXplKCkpIHsKKyAgICAgICAgaWYgKG5lZWRzTGF5b3V0KQorICAg
ICAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPnNldE5lZWRzTGF5b3V0KCk7
CisgICAgICAgIGlmICghcGFyZW50KCkpIHsKKyAgICAgICAgICAgIGJvb2wgb2xkU3VwcHJlc3Nl
ZCA9IG1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZDsKKyAgICAgICAgICAgIG1fZGF0
YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZCA9IHRydWU7CisgICAgICAgICAgICBJbnRTaXpl
IG5ld1Zpc2libGVDb250ZW50c1NpemUobWluKG1fZGF0YS0+bV9jb250ZW50c1NpemUud2lkdGgo
KSwgKGludCltX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgpCisgICAgICAgICAgICAsIG1p
bihtX2RhdGEtPm1fY29udGVudHNTaXplLmhlaWdodCgpLCAoaW50KW1fZGF0YS0+bV92aXNpYmxl
Q29udGVudHNIZWlnaHQpKTsKKyAgICAgICAgICAgIEludFNpemUgc2Nyb2xsT2Zmc2V0ID0gbV91
c2VBbmNob3JQb2ludAorICAgICAgICAgICAgICAgID8gbV9hbmNob3JDb250ZW50c1BvaW50IC0g
bV9hbmNob3JXaW5kb3dQb2ludCAvIHNjYWxlKCkKKyAgICAgICAgICAgICAgICA6IG1fZGF0YS0+
bV9zY3JvbGxPZmZzZXQgKyAob2xkVmlzaWJsZUNvbnRlbnRzU2l6ZSAtIG5ld1Zpc2libGVDb250
ZW50c1NpemUpICogMC41OworICAgICAgICAgICAgdXBkYXRlU2Nyb2xsYmFycyhzY3JvbGxPZmZz
ZXQpOworICAgICAgICAgICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkID0gb2xk
U3VwcHJlc3NlZDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB1cGRhdGVTY3JvbGxiYXJz
KG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIH0KKworICAgIGlmIChpc0ZyYW1lVmlldygp
KSB7CisgICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3
Kj4odGhpcyk7CisgICAgICAgIGlmIChGcmFtZSAqZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkp
CisgICAgICAgICAgICBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZyYW1lR2Vv
bWV0cnlDaGFuZ2VkKGZyYW1lVmlldy0+ZnJhbWUoKSk7CisgICAgfQorCisgICAgZnJhbWVSZWN0
c0NoYW5nZWQoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRTY2FsZShkb3VibGUgc2NhbGUp
Cit7CisgICAgc2NhbGUgPSBtYXgoMC4xLCBtaW4oMTAuLCBzY2FsZSkpOworICAgIGlmIChtX3Nj
YWxlID09IHNjYWxlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3NjYWxlID0gc2NhbGU7CisK
KyAgICBoaWRlQ3VycmVudFBvcHVwTWVudSgpOworCisgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFt
ZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICBGcmFtZSog
ZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCk7CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAg
Zm9yIChGcmFtZSogY2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5maXJzdENoaWxkKCk7IGNoaWxkOyBj
aGlsZCA9IGNoaWxkLT50cmVlKCktPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChG
cmFtZVZpZXcqIHZpZXcgPSBjaGlsZC0+dmlldygpKQorICAgICAgICAgICAgICAgIHZpZXctPnNl
dFNjYWxlKHNjYWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcGFyZW50KCkpCisg
ICAgICAgIHNldEZyYW1lUmVjdChtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSwgZmFsc2UpOwor
ICAgIGVsc2UgeworICAgICAgICBJbnRTaXplIGlubmVyU2l6ZShtX2RhdGEtPm1fdmlzaWJsZUNv
bnRlbnRzV2lkdGgsIG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWlnaHQpOworICAgICAgICBp
ZiAobV9kYXRhLT5tX3ZCYXIpCisgICAgICAgICAgICBtX2RhdGEtPm1fdkJhci0+c2V0RnJhbWVS
ZWN0KG1fZGF0YS0+Z2V0VkJhclJlY3QoaW5uZXJTaXplKSk7CisgICAgICAgIGlmIChtX2RhdGEt
Pm1faEJhcikKKyAgICAgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRGcmFtZVJlY3QobV9kYXRh
LT5nZXRIQmFyUmVjdChpbm5lclNpemUpKTsKKyAgICB9Cit9CisKK2ludCBTY3JvbGxWaWV3Ojpj
b250ZW50c1goKSBjb25zdAoreworICAgIHJldHVybiBzY3JvbGxPZmZzZXQoKS53aWR0aCgpOwor
fQorCitpbnQgU2Nyb2xsVmlldzo6Y29udGVudHNZKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2Ny
b2xsT2Zmc2V0KCkuaGVpZ2h0KCk7Cit9CisKK2ludCBTY3JvbGxWaWV3Ojpjb250ZW50c1dpZHRo
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX2NvbnRlbnRzU2l6ZS53aWR0aCgpOwor
fQorCitpbnQgU2Nyb2xsVmlldzo6Y29udGVudHNIZWlnaHQoKSBjb25zdAoreworICAgIHJldHVy
biBtX2RhdGEtPm1fY29udGVudHNTaXplLmhlaWdodCgpOworfQorCitJbnRSZWN0IFNjcm9sbFZp
ZXc6OmNvbnRlbnRzVG9XaW5kb3coY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gSW50UmVjdChjb250ZW50c1RvV2luZG93KHJlY3QubG9jYXRpb24oKSksIHJlY3Quc2l6
ZSgpICogc2NhbGUoKSk7Cit9CisKK0ludFJlY3QgU2Nyb2xsVmlldzo6d2luZG93VG9Db250ZW50
cyhjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBJbnRSZWN0KHdpbmRv
d1RvQ29udGVudHMocmVjdC5sb2NhdGlvbigpKSwgcmVjdC5zaXplKCkgLyBzY2FsZSgpKTsKK30K
KworSW50UG9pbnQgU2Nyb2xsVmlldzo6d2luZG93VG9Db250ZW50cyhjb25zdCBJbnRQb2ludCYg
d2luZG93UG9pbnQpIGNvbnN0Cit7CisgICAgaWYgKHBhcmVudCgpKSB7CisgICAgICAgIEludFBv
aW50IG9yaWdpbiA9IHBhcmVudCgpLT5jb250ZW50c1RvV2luZG93KGZyYW1lUmVjdCgpLmxvY2F0
aW9uKCkpOworICAgICAgICByZXR1cm4gSW50UG9pbnQoKSArICh3aW5kb3dQb2ludCAtIG9yaWdp
bikgLyBzY2FsZSgpICsgc2Nyb2xsT2Zmc2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuICh3aW5k
b3dQb2ludCAtIEludFNpemUoeCgpLCB5KCkpKSAvIHNjYWxlKCkgKyBzY3JvbGxPZmZzZXQoKTsK
K30KKworSW50UG9pbnQgU2Nyb2xsVmlldzo6Y29udGVudHNUb1dpbmRvdyhjb25zdCBJbnRQb2lu
dCYgY29udGVudHNQb2ludCkgY29uc3QKK3sKKyAgICBpZiAocGFyZW50KCkpIHsKKyAgICAgICAg
SW50UG9pbnQgb3JpZ2luID0gcGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3coZnJhbWVSZWN0KCku
bG9jYXRpb24oKSk7CisgICAgICAgIHJldHVybiBvcmlnaW4gKyAoKGNvbnRlbnRzUG9pbnQgLSBz
Y3JvbGxPZmZzZXQoKSkgKiBzY2FsZSgpIC0gSW50UG9pbnQoKSk7CisgICAgfQorCisgICAgcmV0
dXJuIChjb250ZW50c1BvaW50IC0gc2Nyb2xsT2Zmc2V0KCkpICogc2NhbGUoKSArIEludFNpemUo
eCgpLCB5KCkpOworfQorCitJbnRQb2ludCBTY3JvbGxWaWV3Ojpjb252ZXJ0Q2hpbGRUb1NlbGYo
Y29uc3QgV2lkZ2V0KiBjaGlsZCwgY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAg
IEludFBvaW50IG5ld1BvaW50ID0gcG9pbnQ7CisgICAgaWYgKGNoaWxkICE9IG1fZGF0YS0+bV9o
QmFyICYmIGNoaWxkICE9IG1fZGF0YS0+bV92QmFyKQorICAgICAgICBuZXdQb2ludCA9IHBvaW50
IC0gc2Nyb2xsT2Zmc2V0KCk7CisgICAgcmV0dXJuIFdpZGdldDo6Y29udmVydENoaWxkVG9TZWxm
KGNoaWxkLCBuZXdQb2ludCk7Cit9CisKK0ludFBvaW50IFNjcm9sbFZpZXc6OmNvbnZlcnRTZWxm
VG9DaGlsZChjb25zdCBXaWRnZXQqIGNoaWxkLCBjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0
Cit7CisgICAgSW50UG9pbnQgbmV3UG9pbnQgPSBwb2ludDsKKyAgICBpZiAoY2hpbGQgIT0gbV9k
YXRhLT5tX2hCYXIgJiYgY2hpbGQgIT0gbV9kYXRhLT5tX3ZCYXIpCisgICAgICAgIG5ld1BvaW50
ID0gcG9pbnQgKyBzY3JvbGxPZmZzZXQoKTsKKyAgICByZXR1cm4gV2lkZ2V0Ojpjb252ZXJ0U2Vs
ZlRvQ2hpbGQoY2hpbGQsIG5ld1BvaW50KTsKK30KKworSW50U2l6ZSBTY3JvbGxWaWV3OjpzY3Jv
bGxPZmZzZXQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0Owor
fQorCitJbnRTaXplIFNjcm9sbFZpZXc6Om1heGltdW1TY3JvbGwoKSBjb25zdAoreworICAgIElu
dFNpemUgZGVsdGEgPSBtX2RhdGEtPm1fY29udGVudHNTaXplIC0gSW50U2l6ZSh3aWR0aCgpLCBo
ZWlnaHQoKSkgLSBtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0OworICAgIGRlbHRhLmNsYW1wTmVnYXRp
dmVUb1plcm8oKTsKKyAgICByZXR1cm4gZGVsdGE7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Ny
b2xsQnkoaW50IGR4LCBpbnQgZHkpCit7CisgICAgaWYgKCFkeCAmJiAhZHkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGhpZGVDdXJyZW50UG9wdXBNZW51KCk7CisKKyAgICBib29sIG9sZFN1cHBy
ZXNzZWQgPSBtX2RhdGEtPm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQ7CisgICAgbV9kYXRhLT5t
X3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkID0gdHJ1ZTsKKworICAgIEludFNpemUgb2xkT2Zmc2V0
KG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworCisgICAgaWYgKG1fZGF0YS0+bV9oQmFyICYmIGR4
KQorICAgICAgICBtX2RhdGEtPm1faEJhci0+c2V0VmFsdWUob2xkT2Zmc2V0LndpZHRoKCkgKyBk
eCk7CisKKyAgICBpZiAobV9kYXRhLT5tX3ZCYXIgJiYgZHkpCisgICAgICAgIG1fZGF0YS0+bV92
QmFyLT5zZXRWYWx1ZShvbGRPZmZzZXQuaGVpZ2h0KCkgKyBkeSk7CisKKyAgICBtX2RhdGEtPm1f
c2hvd1Njcm9sbGJhclN1cHByZXNzZWQgPSBvbGRTdXBwcmVzc2VkOworCisgICAgaWYgKCFtX2Rh
dGEtPm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQpIHsKKyAgICAgICAgSW50U2l6ZSBkZWx0YSA9
IG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQgLSBvbGRPZmZzZXQ7CisgICAgICAgIG1fZGF0YS0+c2Ny
b2xsQmFja2luZ1N0b3JlKGRlbHRhKTsKKyAgICAgICAgLy9zdGF0aWNfY2FzdDxGcmFtZVZpZXcq
Pih0aGlzKS0+ZnJhbWUoKS0+c2VuZFNjcm9sbEV2ZW50KCk7CisgICAgICAgIGNvbnN0IEZyYW1l
VmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7Cisg
ICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAg
ICAgIGlmIChmcmFtZS0+c2hvdWxkQmxpbmtDYXJldCgpKQorICAgICAgICAgICAgICAgIGhvc3RX
aW5kb3coKS0+Y2FyZXRSZWN0Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgICAgIG1fZGF0YS0+
c2hvd1Njcm9sbGJhcnMoZGVsdGEud2lkdGgoKSAhPSAwLCBkZWx0YS5oZWlnaHQoKSAhPSAwLCBm
YWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW92ZVJhbmdlVG9Db250YWlu
UmFuZ2UoaW50JiBjb250YWluZXJTdGFydCwgaW50IGNvbnRhaW5lcldpZHRoLCBpbnQgdGFyZ2V0
U3RhcnQsIGludCB0YXJnZXRXaWR0aCkKK3sKKyAgICBpbnQgdGFyZ2V0RW5kID0gdGFyZ2V0U3Rh
cnQgKyB0YXJnZXRXaWR0aDsKKyAgICBpZiAoY29udGFpbmVyU3RhcnQgKyBjb250YWluZXJXaWR0
aCA8IHRhcmdldEVuZCkgeworICAgICAgICBpZiAoY29udGFpbmVyU3RhcnQgPiB0YXJnZXRTdGFy
dCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY29udGFpbmVyU3RhcnQgPSB0YXJnZXRF
bmQgLSBjb250YWluZXJXaWR0aDsKKyAgICB9CisKKyAgICBpZiAoY29udGFpbmVyU3RhcnQgPiB0
YXJnZXRTdGFydCkKKyAgICAgICAgY29udGFpbmVyU3RhcnQgPSB0YXJnZXRTdGFydDsKK30KKwor
dm9pZCBTY3JvbGxWaWV3OjpzY3JvbGxSZWN0SW50b1ZpZXdNaW5pbXVtU2Nyb2xsKGNvbnN0IElu
dFJlY3QmIHIpCit7CisgICAgU2Nyb2xsVmlldyogdmlldyA9IHRoaXM7CisgICAgSW50UG9pbnQg
Y3VyUG9zID0gci5sb2NhdGlvbigpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHggPSB2
aWV3LT5jb250ZW50c1goKTsKKyAgICAgICAgaW50IHkgPSB2aWV3LT5jb250ZW50c1koKTsKKyAg
ICAgICAgbW92ZVJhbmdlVG9Db250YWluUmFuZ2UoeCwgdmlldy0+bV9kYXRhLT5tX3Zpc2libGVD
b250ZW50c1dpZHRoLCBjdXJQb3MueCgpLCByLndpZHRoKCkpOworICAgICAgICBtb3ZlUmFuZ2VU
b0NvbnRhaW5SYW5nZSh5LCB2aWV3LT5tX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0LCBj
dXJQb3MueSgpLCByLmhlaWdodCgpKTsKKworICAgICAgICB2aWV3LT5zZXRDb250ZW50c1Bvcyh4
LCB5KTsKKworICAgICAgICBpZiAoU2Nyb2xsVmlldyogbmV4dFZpZXcgPSBzdGF0aWNfY2FzdDxT
Y3JvbGxWaWV3Kj4odmlldy0+cGFyZW50KCkpKSB7CisgICAgICAgICAgICBjdXJQb3MubW92ZSh2
aWV3LT54KCkgLSB2aWV3LT5jb250ZW50c1goKSwgdmlldy0+eSgpIC0gdmlldy0+Y29udGVudHNZ
KCkpOworICAgICAgICAgICAgdmlldyA9IG5leHRWaWV3OworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvL3N0YXRpY19jYXN0PEZyYW1lVmlldyo+KHRoaXMp
LT5mcmFtZSgpLT5zZW5kU2Nyb2xsRXZlbnQoKTsKKyAgICBjb25zdCBGcmFtZVZpZXcqIGZyYW1l
VmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAgIGlmIChGcmFt
ZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAgaWYgKGZyYW1lLT5zaG91
bGRCbGlua0NhcmV0KCkpCisgICAgICAgICAgICBob3N0V2luZG93KCktPmNhcmV0UmVjdENoYW5n
ZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xsUmVjdEludG9WaWV3UmVj
dXJzaXZlbHkoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBTY3JvbGxWaWV3KiB2aWV3ID0gdGhp
czsKKyAgICBJbnRQb2ludCBjdXJQb3MgPSByLmxvY2F0aW9uKCk7CisgICAgZm9yICg7Oykgewor
ICAgICAgICB2aWV3LT5zZXRDb250ZW50c1BvcyhjdXJQb3MueCgpLCBjdXJQb3MueSgpKTsKKwor
ICAgICAgICB2aWV3ID0gc3RhdGljX2Nhc3Q8U2Nyb2xsVmlldyo+KHZpZXctPnBhcmVudCgpKTsK
KyAgICAgICAgaWYgKHZpZXcpCisgICAgICAgICAgICBjdXJQb3MubW92ZSh2aWV3LT54KCkgLSB2
aWV3LT5jb250ZW50c1goKSwgdmlldy0+eSgpIC0gdmlldy0+Y29udGVudHNZKCkpOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLy9zdGF0aWNfY2FzdDxGcmFt
ZVZpZXcqPih0aGlzKS0+ZnJhbWUoKS0+c2VuZFNjcm9sbEV2ZW50KCk7CisgICAgY29uc3QgRnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsK
KyAgICBpZiAoRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpKSB7CisgICAgICAgIGlm
IChmcmFtZS0+c2hvdWxkQmxpbmtDYXJldCgpKQorICAgICAgICAgICAgaG9zdFdpbmRvdygpLT5j
YXJldFJlY3RDaGFuZ2VkKCk7CisgICAgfQorfQorCitXZWJDb3JlOjpTY3JvbGxiYXJNb2RlIFNj
cm9sbFZpZXc6Omhvcml6b250YWxTY3JvbGxiYXJNb2RlKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
bV9kYXRhLT5tX2hTY3JvbGxiYXJNb2RlOworfQorCitXZWJDb3JlOjpTY3JvbGxiYXJNb2RlIFNj
cm9sbFZpZXc6OnZlcnRpY2FsU2Nyb2xsYmFyTW9kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
ZGF0YS0+bV92U2Nyb2xsYmFyTW9kZTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRTY3JvbGxi
YXJzU3VwcHJlc3NlZChib29sIHN1cHByZXNzZWQsIGJvb2wgcmVwYWludE9uU3VwcHJlc3MpCit7
CisgICAgbV9kYXRhLT5tX3Njcm9sbGJhcnNTdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKKyAgICBp
ZiAocmVwYWludE9uU3VwcHJlc3MgJiYgIXN1cHByZXNzZWQpCisgICAgICAgIG1fZGF0YS0+aW52
YWxpZGF0ZVNjcm9sbGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgU2Nyb2xsVmll
dzo6c2V0SG9yaXpvbnRhbFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFyTW9kZSBuZXdNb2RlKQorewor
ICAgIGlmIChtX2FsbG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSAmJiBtX2RhdGEtPm1faFNjcm9s
bGJhck1vZGUgIT0gbmV3TW9kZSkgeworICAgICAgICBtX2RhdGEtPm1faFNjcm9sbGJhck1vZGUg
PSBuZXdNb2RlOworICAgICAgICB1cGRhdGVTY3JvbGxiYXJzKG1fZGF0YS0+bV9zY3JvbGxPZmZz
ZXQpOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRWZXJ0aWNhbFNjcm9sbGJhck1v
ZGUoU2Nyb2xsYmFyTW9kZSBuZXdNb2RlKQoreworICAgIGlmIChtX2FsbG93c0NoYW5naW5nU2Ny
b2xsYmFyTW9kZSAmJiBtX2RhdGEtPm1fdlNjcm9sbGJhck1vZGUgIT0gbmV3TW9kZSkgeworICAg
ICAgICBtX2RhdGEtPm1fdlNjcm9sbGJhck1vZGUgPSBuZXdNb2RlOworICAgICAgICB1cGRhdGVT
Y3JvbGxiYXJzKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIH0KK30KKwordm9pZCBTY3Jv
bGxWaWV3OjpzZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJNb2RlIGhvcml6b250YWxNb2RlLCBT
Y3JvbGxiYXJNb2RlIHZlcnRpY2FsTW9kZSkKK3sKKyAgICBzZXRIb3Jpem9udGFsU2Nyb2xsYmFy
TW9kZShob3Jpem9udGFsTW9kZSk7CisgICAgc2V0VmVydGljYWxTY3JvbGxiYXJNb2RlKHZlcnRp
Y2FsTW9kZSk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6dXBkYXRlU2Nyb2xsYmFycyhjb25zdCBJ
bnRTaXplJiBkZXNpcmVkT2Zmc2V0KQoreworICAgIC8vIERvbid0IGFsbG93IHJlLWVudHJhbmN5
IGludG8gdGhpcyBmdW5jdGlvbi4KKyAgICBpZiAobV9kYXRhLT5tX2luVXBkYXRlU2Nyb2xsYmFy
cykKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUU6IFRoaXMgY29kZSBpcyBoZXJlIHNv
IHdlIGRvbid0IGhhdmUgdG8gZm9yayBGcmFtZVZpZXcuaC8uY3BwLgorICAgIC8vIEluIHRoZSBl
bmQsIEZyYW1lVmlldyBzaG91bGQganVzdCBtZXJnZSB3aXRoIFNjcm9sbFZpZXcuCisgICAgRnJh
bWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyktPmZyYW1lKCk7
CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9kYXRhLT5tX2luVXBk
YXRlU2Nyb2xsYmFycyA9IHRydWU7CisgICAgYm9vbCB1c2VyU2Nyb2xsID0gc3RhdGljX2Nhc3Q8
Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyktPndhc1Njcm9sbGVkQnlVc2VyKCk7CisKKyAgICBib29s
IGhhc1ZlcnRpY2FsU2Nyb2xsYmFyID0gbV9kYXRhLT5tX3ZCYXI7CisgICAgYm9vbCBoYXNIb3Jp
em9udGFsU2Nyb2xsYmFyID0gbV9kYXRhLT5tX2hCYXI7CisgICAgYm9vbCBvbGRIYXNWZXJ0aWNh
bCA9IGhhc1ZlcnRpY2FsU2Nyb2xsYmFyOworICAgIGJvb2wgb2xkSGFzSG9yaXpvbnRhbCA9IGhh
c0hvcml6b250YWxTY3JvbGxiYXI7CisgICAgU2Nyb2xsYmFyTW9kZSBoU2Nyb2xsID0gbV9kYXRh
LT5tX2hTY3JvbGxiYXJNb2RlOworICAgIFNjcm9sbGJhck1vZGUgdlNjcm9sbCA9IG1fZGF0YS0+
bV92U2Nyb2xsYmFyTW9kZTsKKworICAgIGludCBjV2lkdGggPSBjb250ZW50c1dpZHRoKCk7Cisg
ICAgaW50IGNIZWlnaHQgPSBjb250ZW50c0hlaWdodCgpOworICAgIGludCB2V2lkdGggPSB3aWR0
aCgpOworICAgIGludCB2SGVpZ2h0ID0gaGVpZ2h0KCk7CisKKyAgICBpbnQgcGFnZUtlZXAgPSBj
QW1vdW50VG9LZWVwV2hlblBhZ2luZzsKKyAgICBpbnQgbGluZVN0ZXAgPSBjU2Nyb2xsYmFyUGl4
ZWxzUGVyTGluZVN0ZXA7CisKKyAgICBpZiAoIW1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3Nl
ZCAmJiAoaFNjcm9sbCA9PSBTY3JvbGxiYXJBdXRvIHx8IHZTY3JvbGwgPT0gU2Nyb2xsYmFyQXV0
bykpIHsKKyAgICAgICAgZm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCAyOyArK3Bhc3MpIHsKKyAg
ICAgICAgICAgIC8vIERvIGEgbGF5b3V0IGlmIHBlbmRpbmcgYmVmb3JlIGNoZWNraW5nIGlmIHNj
cm9sbGJhcnMgYXJlIG5lZWRlZC4KKyAgICAgICAgICAgIGlmIChoYXNWZXJ0aWNhbFNjcm9sbGJh
ciAhPSBvbGRIYXNWZXJ0aWNhbCB8fCBoYXNIb3Jpem9udGFsU2Nyb2xsYmFyICE9IG9sZEhhc0hv
cml6b250YWwpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlz
KS0+bGF5b3V0SWZOZWVkZWRSZWN1cnNpdmUoKTsKKyAgICAgICAgICAgICAgICAvLyBBZnRlciBy
ZS1sYXlvdXQsIGNvbnRlbnRzIHNpemUgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAgICAg
ICBjV2lkdGggPSBjb250ZW50c1dpZHRoKCk7CisgICAgICAgICAgICAgICAgY0hlaWdodCA9IGNv
bnRlbnRzSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgdldpZHRoID0gd2lkdGgoKTsKKyAgICAg
ICAgICAgICAgICB2SGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAg
ICAgIGJvb2wgc2Nyb2xsc1ZlcnRpY2FsbHkgPSBjSGVpZ2h0ID4gdkhlaWdodDsKKyAgICAgICAg
ICAgIGJvb2wgc2Nyb2xsc0hvcml6b250YWxseSA9IGNXaWR0aCA+IHZXaWR0aDsKKworICAgICAg
ICAgICAgaWYgKGhhc1ZlcnRpY2FsU2Nyb2xsYmFyICE9IHNjcm9sbHNWZXJ0aWNhbGx5KSB7Cisg
ICAgICAgICAgICAgICAgbV9kYXRhLT5pbnZhbGlkYXRlU2Nyb2xsYmFycyhmYWxzZSwgdHJ1ZSwg
ZmFsc2UpOworICAgICAgICAgICAgICAgIG1fZGF0YS0+c2V0SGFzVmVydGljYWxTY3JvbGxiYXIo
c2Nyb2xsc1ZlcnRpY2FsbHkpOworICAgICAgICAgICAgICAgIGhhc1ZlcnRpY2FsU2Nyb2xsYmFy
ID0gc2Nyb2xsc1ZlcnRpY2FsbHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICho
YXNIb3Jpem9udGFsU2Nyb2xsYmFyICE9IHNjcm9sbHNIb3Jpem9udGFsbHkpIHsKKyAgICAgICAg
ICAgICAgICBtX2RhdGEtPmludmFsaWRhdGVTY3JvbGxiYXJzKHRydWUsIGZhbHNlLCBmYWxzZSk7
CisgICAgICAgICAgICAgICAgbV9kYXRhLT5zZXRIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKHNjcm9s
bHNIb3Jpem9udGFsbHkpOworICAgICAgICAgICAgICAgIGhhc0hvcml6b250YWxTY3JvbGxiYXIg
PSBzY3JvbGxzSG9yaXpvbnRhbGx5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
CisgICAgLy8gU2V0IHVwIHRoZSByYW5nZSAoYW5kIHBhZ2Ugc3RlcC9saW5lIHN0ZXApLgorICAg
IEludFNpemUgbWF4U2Nyb2xsUG9zaXRpb24oY1dpZHRoIC0gdldpZHRoLCBjSGVpZ2h0IC0gdkhl
aWdodCk7CisgICAgSW50U2l6ZSBzY3JvbGwgPSBkZXNpcmVkT2Zmc2V0LnNocnVua1RvKG1heFNj
cm9sbFBvc2l0aW9uKTsKKyAgICBzY3JvbGwuY2xhbXBOZWdhdGl2ZVRvWmVybygpOworCisgICAg
Ly8gbV92QmFyLT5zZXRWYWx1ZSgpIGFuZCBtX2hCYXItPnNldFZhbHVlKCkgd2lsbCB1cGRhdGVk
IHNjcm9sbCBvZmZzZXRzIGFuZCBhbHNvIHNjcm9sbGVkIGJhY2tpbmcgc3RvcmUKKyAgICBJbnRT
aXplIG9sZFNjcm9sbE9mZnNldCA9IG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQ7CisgICAgaWYgKCFt
X2RhdGEtPm1faEJhcikKKyAgICAgICAgbV9kYXRhLT5tX3Njcm9sbE9mZnNldC5zZXRXaWR0aCgw
KTsKKworICAgIGlmICghbV9kYXRhLT5tX3ZCYXIpCisgICAgICAgIG1fZGF0YS0+bV9zY3JvbGxP
ZmZzZXQuc2V0SGVpZ2h0KDApOworCisgICAgaWYgKG9sZFNjcm9sbE9mZnNldCAhPSBtX2RhdGEt
Pm1fc2Nyb2xsT2Zmc2V0KQorICAgICAgICBtX2RhdGEtPnNjcm9sbEJhY2tpbmdTdG9yZShJbnRT
aXplKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQgLSBvbGRTY3JvbGxPZmZzZXQpKTsKKworICAgIElu
dFNpemUgaW5uZXJTaXplKG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNXaWR0aCwgbV9kYXRhLT5t
X3Zpc2libGVDb250ZW50c0hlaWdodCk7CisgICAgaWYgKG1fZGF0YS0+bV9oQmFyKSB7CisgICAg
ICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRFbmFibGVkKGNXaWR0aCA+IHZXaWR0aCk7CisgICAgICAg
IGludCBwYWdlU3RlcCA9IHZXaWR0aCAtIHBhZ2VLZWVwOworICAgICAgICBpZiAocGFnZVN0ZXAg
PCAwKSBwYWdlU3RlcCA9IHZXaWR0aDsKKyAgICAgICAgSW50UmVjdCBvbGRSZWN0KG1fZGF0YS0+
bV9oQmFyLT5mcmFtZVJlY3QoKSk7CisgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRSZWN0KG1f
ZGF0YS0+Z2V0SEJhclJlY3QoaW5uZXJTaXplKSk7CisgICAgICAgIGlmICghbV9kYXRhLT5tX3Nj
cm9sbGJhcnNTdXBwcmVzc2VkICYmIG9sZFJlY3QgIT0gbV9kYXRhLT5tX2hCYXItPmZyYW1lUmVj
dCgpKQorICAgICAgICAgICAgbV9kYXRhLT5pbnZhbGlkYXRlU2Nyb2xsYmFycyh0cnVlLCBmYWxz
ZSwgZmFsc2UpOworCisgICAgICAgIGlmIChtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQp
CisgICAgICAgICAgICBtX2RhdGEtPm1faEJhci0+c2V0U3VwcHJlc3NJbnZhbGlkYXRpb24odHJ1
ZSk7CisgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRTdGVwcyhsaW5lU3RlcCwgcGFnZVN0ZXAp
OworICAgICAgICBtX2RhdGEtPm1faEJhci0+c2V0UHJvcG9ydGlvbih2V2lkdGgsIGNXaWR0aCk7
CisgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRWYWx1ZShzY3JvbGwud2lkdGgoKSk7CisgICAg
ICAgIGlmIChtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQpCisgICAgICAgICAgICBtX2Rh
dGEtPm1faEJhci0+c2V0U3VwcHJlc3NJbnZhbGlkYXRpb24oZmFsc2UpOworICAgIH0KKworICAg
IGlmIChtX2RhdGEtPm1fdkJhcikgeworICAgICAgICBtX2RhdGEtPm1fdkJhci0+c2V0RW5hYmxl
ZChjSGVpZ2h0ID4gdkhlaWdodCk7CisgICAgICAgIGludCBwYWdlU3RlcCA9IHZIZWlnaHQgLSBw
YWdlS2VlcDsKKyAgICAgICAgaWYgKHBhZ2VTdGVwIDwgMCkgcGFnZVN0ZXAgPSB2SGVpZ2h0Owor
ICAgICAgICBJbnRSZWN0IG9sZFJlY3QobV9kYXRhLT5tX3ZCYXItPmZyYW1lUmVjdCgpKTsKKyAg
ICAgICAgbV9kYXRhLT5tX3ZCYXItPnNldFJlY3QobV9kYXRhLT5nZXRWQmFyUmVjdChpbm5lclNp
emUpKTsKKyAgICAgICAgaWYgKCFtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQgJiYgb2xk
UmVjdCAhPSBtX2RhdGEtPm1fdkJhci0+ZnJhbWVSZWN0KCkpCisgICAgICAgICAgICBtX2RhdGEt
PmludmFsaWRhdGVTY3JvbGxiYXJzKGZhbHNlLCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgaWYg
KG1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3NlZCkKKyAgICAgICAgICAgIG1fZGF0YS0+bV92
QmFyLT5zZXRTdXBwcmVzc0ludmFsaWRhdGlvbih0cnVlKTsKKyAgICAgICAgbV9kYXRhLT5tX3ZC
YXItPnNldFN0ZXBzKGxpbmVTdGVwLCBwYWdlU3RlcCk7CisgICAgICAgIG1fZGF0YS0+bV92QmFy
LT5zZXRQcm9wb3J0aW9uKHZIZWlnaHQsIGNIZWlnaHQpOworICAgICAgICBtX2RhdGEtPm1fdkJh
ci0+c2V0VmFsdWUoc2Nyb2xsLmhlaWdodCgpKTsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9zY3Jv
bGxiYXJzU3VwcHJlc3NlZCkKKyAgICAgICAgICAgIG1fZGF0YS0+bV92QmFyLT5zZXRTdXBwcmVz
c0ludmFsaWRhdGlvbihmYWxzZSk7CisgICAgfQorCisgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3
Kj4odGhpcyktPnNldFdhc1Njcm9sbGVkQnlVc2VyKHVzZXJTY3JvbGwpOworICAgIG1fZGF0YS0+
bV9pblVwZGF0ZVNjcm9sbGJhcnMgPSBmYWxzZTsKK30KKworU2Nyb2xsYmFyKiBTY3JvbGxWaWV3
OjpzY3JvbGxiYXJBdFBvaW50KGNvbnN0IEludFBvaW50JiB3aW5kb3dQb2ludCkKK3sKKyAgICBp
ZiAobV9kYXRhLT5tX3Njcm9sbGJhcnNWaXNpYmxlICYmIChtX2RhdGEtPmNhblNob3dIU2Nyb2xs
YmFyKCkgfHwgbV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigpKSkgeworICAgICAgICBJbnRQb2lu
dCB2aWV3UG9pbnQgPSB3aW5kb3dUb0NvbnRlbnRzKHdpbmRvd1BvaW50KSAtIHNjcm9sbE9mZnNl
dCgpOworICAgICAgICBpZiAobV9kYXRhLT5jYW5TaG93SFNjcm9sbGJhcigpICYmIG1fZGF0YS0+
bV9oQmFyLT5mcmFtZVJlY3QoKS5jb250YWlucyh2aWV3UG9pbnQpKQorICAgICAgICAgICAgcmV0
dXJuIG1fZGF0YS0+bV9oQmFyLmdldCgpOworICAgICAgICBpZiAobV9kYXRhLT5jYW5TaG93VlNj
cm9sbGJhcigpICYmIG1fZGF0YS0+bV92QmFyLT5mcmFtZVJlY3QoKS5jb250YWlucyh2aWV3UG9p
bnQpKQorICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS0+bV92QmFyLmdldCgpOworICAgIH0KKwor
ICAgIHJldHVybiAwOworfQorCitib29sIFNjcm9sbFZpZXc6OnNjcm9sbGJhcnNNb3VzZVByZXNz
RXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50KQoreworICAgIGlmIChw
YXJlbnQoKQorICAgICAgICA/IG1fZGF0YS0+Z2V0VmlzaWJsZUNvbnRlbnRSZWN0KCkuY29udGFp
bnMocGFyZW50KCktPndpbmRvd1RvQ29udGVudHMobW91c2VFdmVudC5wb3MoKSkpCisgICAgICAg
IDogdmlzaWJsZVdpbmRvd1JlY3QoKS5jb250YWlucyhtb3VzZUV2ZW50LnBvcygpKSkgeworCisg
ICAgICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJh
bWVWaWV3Kj4odGhpcyk7CisgICAgICAgIEZyYW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUo
KTsKKworICAgICAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgICAgIGZvciAoRnJhbWUqIGNoaWxk
ID0gZnJhbWUtPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJl
ZSgpLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0g
Y2hpbGQtPnZpZXcoKTsKKyAgICAgICAgICAgICAgICBpZiAodmlldyAmJiB2aWV3LT5zY3JvbGxi
YXJzTW91c2VQcmVzc0V2ZW50KG1vdXNlRXZlbnQpKQorICAgICAgICAgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEludFBvaW50IHZp
ZXdQb2ludCA9IHdpbmRvd1RvQ29udGVudHMobW91c2VFdmVudC5wb3MoKSk7CisgICAgICAgIGZv
ciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRvciBpID0gbV9kYXRhLT5tX2NoaWxk
cmVuLmJlZ2luKCk7IGkgIT0gbV9kYXRhLT5tX2NoaWxkcmVuLmVuZCgpOyArK2kpIHsKKyAgICAg
ICAgICAgIGlmICghKCppKS0+aXNTY3JvbGxiYXIoKSB8fCAoKmkpLT5pc1ZpZXdTY3JvbGxiYXIo
KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFBsYXRmb3JtU2Nyb2xs
YmFyKiBzY3JvbGxiYXIgPSBzdGF0aWNfY2FzdDxQbGF0Zm9ybVNjcm9sbGJhcio+KGktPmdldCgp
KTsKKyAgICAgICAgICAgIGlmIChzY3JvbGxiYXItPmlzVmlzaWJsZSgpICYmIHNjcm9sbGJhci0+
ZnJhbWVSZWN0KCkuY29udGFpbnModmlld1BvaW50KSkgeworICAgICAgICAgICAgICAgIG1fZGF0
YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZSA9IHNjcm9sbGJhcjsKKyAgICAgICAgICAgICAg
ICBpZiAobV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlICYmIG1fZGF0YS0+bV9wcmV2
U2Nyb2xsYmFyVW5kZXJNb3VzZS0+aXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
bV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQo
bW91c2VFdmVudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2RhdGEtPm1fcHJldk1v
dXNlRG93biA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICB9CisKKyAgICAgICAgcmV0dXJuIG1fZGF0YS0+bV9wcmV2TW91c2VEb3duID0gZmFsc2U7Cisg
ICAgfQorCisgICAgbV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlID0gc3RhdGljX2Nh
c3Q8UGxhdGZvcm1TY3JvbGxiYXIqPihzY3JvbGxiYXJBdFBvaW50KG1vdXNlRXZlbnQucG9zKCkp
KTsKKyAgICBpZiAobV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlICYmIG1fZGF0YS0+
bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZS0+aXNFbmFibGVkKCkpIHsKKyAgICAgICAgbV9kYXRh
LT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQobW91c2VF
dmVudCk7CisgICAgICAgIHJldHVybiBtX2RhdGEtPm1fcHJldk1vdXNlRG93biA9IHRydWU7Cisg
ICAgfQorCisgICAgcmV0dXJuIG1fZGF0YS0+bV9wcmV2TW91c2VEb3duID0gZmFsc2U7Cit9CisK
K2Jvb2wgU2Nyb2xsVmlldzo6c2Nyb2xsYmFyc01vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3Jt
TW91c2VFdmVudCYgbW91c2VFdmVudCkKK3sKKyAgICBpZiAobV9kYXRhLT5tX3ByZXZNb3VzZURv
d24pIHsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZSkKKyAg
ICAgICAgICAgIG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZS0+aGFuZGxlTW91c2VN
b3ZlRXZlbnQobW91c2VFdmVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAg
IGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3
Kj4odGhpcyk7CisgICAgRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpOworCisgICAg
aWYgKGZyYW1lKSB7CisgICAgICAgIGZvciAoRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRyZWUoKS0+
Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGluZygp
KSB7CisgICAgICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBjaGlsZC0+dmlldygpOworICAgICAg
ICAgICAgaWYgKHZpZXcgJiYgdmlldy0+c2Nyb2xsYmFyc01vdXNlTW92ZUV2ZW50KG1vdXNlRXZl
bnQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNjcm9sbFZpZXc6OnNjcm9sbGJhcnNNb3VzZVJl
bGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIG1vdXNlRXZlbnQpCit7CisgICAg
Ym9vbCBwcmV2TW91c2VEb3duID0gbV9kYXRhLT5tX3ByZXZNb3VzZURvd247CisgICAgbV9kYXRh
LT5tX3ByZXZNb3VzZURvd24gPSBmYWxzZTsKKworICAgIGlmIChwcmV2TW91c2VEb3duKSB7Cisg
ICAgICAgIGlmIChtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91c2UpCisgICAgICAgICAg
ICBtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91c2UtPmhhbmRsZU1vdXNlUmVsZWFzZUV2
ZW50KG1vdXNlRXZlbnQpOworICAgICAgICBtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91
c2UgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCBGcmFtZVZp
ZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAg
IEZyYW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUoKTsKKworICAgIGlmIChmcmFtZSkgewor
ICAgICAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVlKCktPmZpcnN0Q2hpbGQoKTsg
Y2hpbGQ7IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICAg
ICAgRnJhbWVWaWV3KiB2aWV3ID0gY2hpbGQtPnZpZXcoKTsKKyAgICAgICAgICAgIGlmICh2aWV3
ICYmIHZpZXctPnNjcm9sbGJhcnNNb3VzZVJlbGVhc2VFdmVudChtb3VzZUV2ZW50KSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBm
YWxzZTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjphZGRDaGlsZChXaWRnZXQqIGNoaWxkKQorewor
ICAgIGNoaWxkLT5zZXRQYXJlbnQodGhpcyk7CisgICAgLy9jaGlsZC0+c2V0UGxhdGZvcm1XaWRn
ZXQocGxhdGZvcm1XaWRnZXQoKSk7CisgICAgbV9kYXRhLT5tX2NoaWxkcmVuLmFkZChjaGlsZCk7
Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6cmVtb3ZlQ2hpbGQoV2lkZ2V0KiBjaGlsZCkKK3sKKyAg
ICBpZiAoc3RhdGljX2Nhc3Q8V2lkZ2V0Kj4obV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1v
dXNlKSA9PSBjaGlsZCkgeworICAgICAgICBtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91
c2UgPSAwOworICAgICAgICBtX2RhdGEtPm1fcHJldk1vdXNlRG93biA9IGZhbHNlOworICAgIH0K
KworICAgIGNoaWxkLT5zZXRQYXJlbnQoMCk7CisgICAgbV9kYXRhLT5tX2NoaWxkcmVuLnJlbW92
ZShjaGlsZCk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBj
b250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEZJWE1FOiBUaGlzIGNvZGUg
aXMgaGVyZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGZvcmsgRnJhbWVWaWV3LmgvLmNwcC4KKyAgICAv
LyBJbiB0aGUgZW5kLCBGcmFtZVZpZXcgc2hvdWxkIGp1c3QgbWVyZ2Ugd2l0aCBTY3JvbGxWaWV3
LgorICAgIEFTU0VSVChpc0ZyYW1lVmlldygpKTsKKworICAgIGlmIChjb250ZXh0LT5wYWludGlu
Z0Rpc2FibGVkKCkgfHwgcmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNv
bnRleHQtPnNhdmUoKTsKKworICAgIGlmICghcGFyZW50KCkpIHsKKyAgICAgICAgY29udGV4dC0+
dHJhbnNsYXRlKC1zdGFibGVSb3VuZChjb250ZW50c1goKSAqIHNjYWxlKCkpLCAtc3RhYmxlUm91
bmQoY29udGVudHNZKCkgKiBzY2FsZSgpKSk7CisgICAgICAgIGNvbnRleHQtPnNjYWxlKEZsb2F0
U2l6ZShzY2FsZSgpLCBzY2FsZSgpKSk7CisgICAgfQorCisgICAgYm9vbCBkcmF3U2Nyb2xsYmFy
cyA9IHBhcmVudCgpICYmICFtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQgJiYgbV9kYXRh
LT5tX3Njcm9sbGJhcnNWaXNpYmxlCisgICAgICAgICAgICAgICAgJiYgKG1fZGF0YS0+Y2FuU2hv
d1ZTY3JvbGxiYXIoKSB8fCBtX2RhdGEtPmNhblNob3dIU2Nyb2xsYmFyKCkpOworICAgIEludFJl
Y3QgY29udGVudHNDbGlwUmVjdDsKKyAgICBpZiAoIXBhcmVudCgpKSB7CisgICAgICAgIEZsb2F0
UmVjdCBjb250ZW50c05vU2Nyb2xsOworICAgICAgICAvLyBlbnN1cmUgdGhlIGNsaXAgcmVjdCBp
cyBiaWcgZW5vdWdoIHRvIGF2b2lkIG1pc3NpbmcgcGl4ZWxzLgorICAgICAgICBjb250ZW50c05v
U2Nyb2xsLnNldFgoKHJlY3QueCgpIC0geCgpKSAvIHNjYWxlKCkpOworICAgICAgICBjb250ZW50
c05vU2Nyb2xsLnNldFkoKHJlY3QueSgpIC0geSgpKSAvIHNjYWxlKCkpOworICAgICAgICBjb250
ZW50c05vU2Nyb2xsLnNldFdpZHRoKHJlY3QucmlnaHQoKSAvIHNjYWxlKCkgLSBjb250ZW50c05v
U2Nyb2xsLngoKSk7CisgICAgICAgIGNvbnRlbnRzTm9TY3JvbGwuc2V0SGVpZ2h0KHJlY3QuYm90
dG9tKCkgLyBzY2FsZSgpIC0gY29udGVudHNOb1Njcm9sbC55KCkpOworICAgICAgICBjb250ZW50
c05vU2Nyb2xsLmluZmxhdGUoMSk7CisgICAgICAgIGNvbnRlbnRzQ2xpcFJlY3QgPSBlbmNsb3Np
bmdJbnRSZWN0KGNvbnRlbnRzTm9TY3JvbGwpOworICAgICAgICBjb250ZW50c0NsaXBSZWN0LnNl
dExvY2F0aW9uKGNvbnRlbnRzQ2xpcFJlY3QubG9jYXRpb24oKSArIG1fZGF0YS0+bV9zY3JvbGxP
ZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRlbnRzQ2xpcFJlY3Quc2V0TG9jYXRp
b24ocmVjdC5sb2NhdGlvbigpIC0gSW50U2l6ZSh4KCksIHkoKSkgKyBtX2RhdGEtPm1fc2Nyb2xs
T2Zmc2V0KTsKKyAgICAgICAgY29udGVudHNDbGlwUmVjdC5zZXRTaXplKHJlY3Quc2l6ZSgpKTsK
KyAgICAgICAgY29udGVudHNDbGlwUmVjdC5pbmZsYXRlKDEpOworICAgICAgICBjb250ZW50c0Ns
aXBSZWN0LmludGVyc2VjdChlbmNsb3NpbmdJbnRSZWN0KHZpc2libGVDb250ZW50UmVjdCgpKSk7
CisgICAgICAgIGNvbnRleHQtPnRyYW5zbGF0ZSh4KCksIHkoKSk7CisgICAgICAgIFRyYW5zZm9y
bWF0aW9uTWF0cml4JiB0ciA9IGNvbnRleHQtPmFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICB0
ci5zZXRFKHN0YWJsZVJvdW5kKHRyLmUoKSkpOworICAgICAgICB0ci5zZXRGKHN0YWJsZVJvdW5k
KHRyLmYoKSkpOworICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoLWNvbnRlbnRzWCgpLCAtY29u
dGVudHNZKCkpOworICAgIH0KKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0ciA9IGNvbnRl
eHQtPmFmZmluZVRyYW5zZm9ybSgpOworICAgIHRyLnNldEUoLXN0YWJsZVJvdW5kKC10ci5lKCkp
KTsKKyAgICB0ci5zZXRGKC1zdGFibGVSb3VuZCgtdHIuZigpKSk7CisKKyAgICBjb250ZXh0LT5j
bGlwKGNvbnRlbnRzQ2xpcFJlY3QpOworCisgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhp
cyktPnBhaW50Q29udGVudHMoY29udGV4dCwgY29udGVudHNDbGlwUmVjdCk7CisKKyAgICBjb250
ZXh0LT5yZXN0b3JlKCk7CisKKyAgICBpZiAoZHJhd1Njcm9sbGJhcnMpIHsKKyAgICAgICAgY29u
dGV4dC0+c2F2ZSgpOworICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoeCgpLCB5KCkpOworICAg
ICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHIgPSBjb250ZXh0LT5hZmZpbmVUcmFuc2Zvcm0o
KTsKKyAgICAgICAgdHIuc2V0RShzdGFibGVSb3VuZCh0ci5lKCkpKTsKKyAgICAgICAgdHIuc2V0
RihzdGFibGVSb3VuZCh0ci5mKCkpKTsKKworICAgICAgICBJbnRSZWN0IHNjcm9sbFZpZXdEaXJ0
eVJlY3Q7CisgICAgICAgIHNjcm9sbFZpZXdEaXJ0eVJlY3Quc2V0TG9jYXRpb24ocmVjdC5sb2Nh
dGlvbigpIC0gSW50U2l6ZSh4KCksIHkoKSkpOworICAgICAgICBzY3JvbGxWaWV3RGlydHlSZWN0
LnNldFNpemUocmVjdC5zaXplKCkpOworCisgICAgICAgIGlmIChtX2RhdGEtPmNhblNob3dIU2Ny
b2xsYmFyKCkpCisgICAgICAgICAgICBtX2RhdGEtPm1faEJhci0+cGFpbnQoY29udGV4dCwgc2Ny
b2xsVmlld0RpcnR5UmVjdCk7CisgICAgICAgIGlmIChtX2RhdGEtPmNhblNob3dWU2Nyb2xsYmFy
KCkpCisgICAgICAgICAgICBtX2RhdGEtPm1fdkJhci0+cGFpbnQoY29udGV4dCwgc2Nyb2xsVmll
d0RpcnR5UmVjdCk7CisKKyAgICAgICAgLy8gRmlsbCB0aGUgc2Nyb2xsIGNvcm5lciB3aXRoIHdo
aXRlLgorICAgICAgICBEV09SRCBjb2xvcldpbiA9IEdldFN5c0NvbG9yKENPTE9SX1NDUk9MTEJB
Uik7CisgICAgICAgIENvbG9yIGNvcm5lckNvbG9yKEdldFJWYWx1ZShjb2xvcldpbiksIEdldEdW
YWx1ZShjb2xvcldpbiksIEdldEJWYWx1ZShjb2xvcldpbikpOworICAgICAgICBJbnRTaXplIGlu
bmVyU2l6ZShtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgsIG1fZGF0YS0+bV92aXNpYmxl
Q29udGVudHNIZWlnaHQpOworICAgICAgICBJbnRSZWN0IGhDb3JuZXIgPSBtX2RhdGEtPmdldEhD
b3JuZXIoaW5uZXJTaXplKTsKKyAgICAgICAgaWYgKGhDb3JuZXIuaW50ZXJzZWN0cyhzY3JvbGxW
aWV3RGlydHlSZWN0KSkKKyAgICAgICAgICAgIGNvbnRleHQtPmZpbGxSZWN0KGhDb3JuZXIsIGNv
cm5lckNvbG9yKTsKKworICAgICAgICBJbnRSZWN0IHZDb3JuZXIgPSBtX2RhdGEtPmdldFZDb3Ju
ZXIoaW5uZXJTaXplKTsKKyAgICAgICAgaWYgKHZDb3JuZXIgIT0gaENvcm5lciAmJiB2Q29ybmVy
LmludGVyc2VjdHMoc2Nyb2xsVmlld0RpcnR5UmVjdCkpCisgICAgICAgICAgICBjb250ZXh0LT5m
aWxsUmVjdCh2Q29ybmVyLCBjb3JuZXJDb2xvcik7CisKKyAgICAgICAgY29udGV4dC0+cmVzdG9y
ZSgpOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3Ojp3aGVlbEV2ZW50KFBsYXRmb3JtV2hl
ZWxFdmVudCYgZSkKK3sKKyAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggd2Ugd2FudCB0byBzY3Jv
bGwuICBJZiB3ZSBjYW4gbW92ZSBhdCBhbGwsIHdlIHdpbGwgYWNjZXB0IHRoZSBldmVudC4KKyAg
ICBJbnRTaXplIG1heFNjcm9sbERlbHRhID0gbWF4aW11bVNjcm9sbCgpOworICAgIGlmICgoZS5k
ZWx0YVgoKSA8IDAgJiYgbWF4U2Nyb2xsRGVsdGEud2lkdGgoKSA+IDApIHx8CisgICAgICAgIChl
LmRlbHRhWCgpID4gMCAmJiBzY3JvbGxPZmZzZXQoKS53aWR0aCgpID4gMCkgfHwKKyAgICAgICAg
KGUuZGVsdGFZKCkgPCAwICYmIG1heFNjcm9sbERlbHRhLmhlaWdodCgpID4gMCkgfHwKKyAgICAg
ICAgKGUuZGVsdGFZKCkgPiAwICYmIHNjcm9sbE9mZnNldCgpLmhlaWdodCgpID4gMCkpCisgICAg
ICAgIGUuYWNjZXB0KCk7CisKKyAgICBzY3JvbGxCeSgtZS5kZWx0YVgoKSAqIGNTY3JvbGxiYXJQ
aXhlbHNQZXJMaW5lU3RlcCwgLWUuZGVsdGFZKCkgKiBjU2Nyb2xsYmFyUGl4ZWxzUGVyTGluZVN0
ZXApOworfQorCitjb25zdCBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID4qIFNjcm9sbFZpZXc6OmNo
aWxkcmVuKCkgY29uc3QKK3sKKyAgICByZXR1cm4gJihtX2RhdGEtPm1fY2hpbGRyZW4pOworfQor
Cit2b2lkIFNjcm9sbFZpZXc6OmZyYW1lUmVjdHNDaGFuZ2VkKCkgY29uc3QKK3sKKyAgICBjb25z
dCBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRo
aXMpOworICAgIEZyYW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUoKTsKKworICAgIGlmIChm
cmFtZSkgeworICAgICAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVlKCktPmZpcnN0
Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxpbmcoKSkgewor
ICAgICAgICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9IGNoaWxkLT52aWV3KCkpCisgICAgICAg
ICAgICAgICAgdmlldy0+ZnJhbWVSZWN0c0NoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KKwor
ICAgIGhpZGVDdXJyZW50UG9wdXBNZW51KCk7CisKKyAgICBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+
ID46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5lbmQoKTsKKyAgICBm
b3IgKEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6Y29uc3RfaXRlcmF0b3IgY3VycmVudCA9IG1f
ZGF0YS0+bV9jaGlsZHJlbi5iZWdpbigpOyBjdXJyZW50ICE9IGVuZDsgKytjdXJyZW50KQorICAg
ICAgICAoKmN1cnJlbnQpLT5mcmFtZVJlY3RzQ2hhbmdlZCgpOworfQorCitib29sIFNjcm9sbFZp
ZXc6OnNjcm9sbChTY3JvbGxEaXJlY3Rpb24gZGlyZWN0aW9uLCBTY3JvbGxHcmFudWxhcml0eSBn
cmFudWxhcml0eSkKK3sKKyAgICBpZiAgKChkaXJlY3Rpb24gPT0gU2Nyb2xsVXAgfHwgZGlyZWN0
aW9uID09IFNjcm9sbERvd24pICYmIG1fZGF0YS0+bV92QmFyKQorICAgICAgICByZXR1cm4gbV9k
YXRhLT5tX3ZCYXItPnNjcm9sbChkaXJlY3Rpb24sIGdyYW51bGFyaXR5LCAxKTsKKyAgICBlbHNl
IGlmIChtX2RhdGEtPm1faEJhcikKKyAgICAgICAgcmV0dXJuIG1fZGF0YS0+bV9oQmFyLT5zY3Jv
bGwoZGlyZWN0aW9uLCBncmFudWxhcml0eSwgMSk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3N0YXRpYyBpbnQgc2Nyb2xsU2Nyb2xsYmFyKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIsIGludCBv
ZmZzZXQpCit7CisgICAgaW50IG92ZXJmbG93VmFsdWUgPSBiYXItPnZhbHVlKCkgKyBvZmZzZXQ7
CisKKyAgICAvLyBTY3JvbGxiYXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIGJvdW5kYXJpZXMuCisg
ICAgYmFyLT5zZXRWYWx1ZShvdmVyZmxvd1ZhbHVlKTsKKworICAgIHJldHVybiBvdmVyZmxvd1Zh
bHVlIC0gYmFyLT52YWx1ZSgpOworfQorCitpbnQgU2Nyb2xsVmlldzo6bW92ZVN1YmZyYW1lSW50
b1ZpZXcoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB2ZXJ0aWNhbCwgaW50IG1heE9mZnNldCkK
K3sKKyAgICBpZiAobWF4T2Zmc2V0KSB7CisgICAgICAgIGlmIChQbGF0Zm9ybVNjcm9sbGJhciog
YmFyID0gdmVydGljYWwgPyBtX2RhdGEtPm1fdkJhci5nZXQoKSA6IG1fZGF0YS0+bV9oQmFyLmdl
dCgpKSB7CisgICAgICAgICAgICBpbnQgc2Nyb2xsZWQgPSB2ZXJ0aWNhbAorICAgICAgICAgICAg
ICAgID8gbWF4T2Zmc2V0ID4gMAorICAgICAgICAgICAgICAgICAgICA/IHJlY3QuYm90dG9tKCkg
LSBzdGFibGVSb3VuZChtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgpICsgbV9kYXRhLT5t
X3Zpc2libGVDb250ZW50c0hlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgOiByZWN0LnkoKSAt
IHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQuaGVpZ2h0KCkpCisgICAgICAgICAg
ICAgICAgOiBtYXhPZmZzZXQgPiAwCisgICAgICAgICAgICAgICAgICAgID8gcmVjdC5yaWdodCgp
IC0gc3RhYmxlUm91bmQobV9kYXRhLT5tX3Njcm9sbE9mZnNldC53aWR0aCgpICsgbV9kYXRhLT5t
X3Zpc2libGVDb250ZW50c1dpZHRoKQorICAgICAgICAgICAgICAgICAgICA6IHJlY3QueCgpIC0g
c3RhYmxlUm91bmQobV9kYXRhLT5tX3Njcm9sbE9mZnNldC53aWR0aCgpKTsKKworICAgICAgICAg
ICAgaWYgKHNjcm9sbGVkID4gMCAmJiBtYXhPZmZzZXQgPiAwKQorICAgICAgICAgICAgICAgIHNj
cm9sbGVkID0gbWluKG1heE9mZnNldCwgc2Nyb2xsZWQpOworICAgICAgICAgICAgZWxzZSBpZiAo
c2Nyb2xsZWQgPCAwICYmIG1heE9mZnNldCA8IDApCisgICAgICAgICAgICAgICAgc2Nyb2xsZWQg
PSBtYXgobWF4T2Zmc2V0LCBzY3JvbGxlZCk7CisKKyAgICAgICAgICAgIG1heE9mZnNldCAtPSBz
Y3JvbGxlZDsKKyAgICAgICAgICAgIHNjcm9sbGVkID0gc2Nyb2xsUmVjdXJzaXZlbHkodmVydGlj
YWwsIHNjcm9sbGVkKTsKKyAgICAgICAgICAgIG1heE9mZnNldCArPSBzY3JvbGxlZDsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXhPZmZzZXQ7Cit9CisKK2ludCBTY3JvbGxWaWV3
OjpzY3JvbGxSZWN1cnNpdmVseShib29sIHZlcnRpY2FsLCBpbnQgb2Zmc2V0KQoreworICAgIGlm
IChwYXJlbnQoKSkKKyAgICAgICAgb2Zmc2V0ID0gcGFyZW50KCktPm1vdmVTdWJmcmFtZUludG9W
aWV3KGZyYW1lUmVjdCgpLCB2ZXJ0aWNhbCwgb2Zmc2V0KTsKKworICAgIGlmIChvZmZzZXQpCisg
ICAgICAgIGlmIChQbGF0Zm9ybVNjcm9sbGJhciogYmFyID0gdmVydGljYWwgPyBtX2RhdGEtPm1f
dkJhci5nZXQoKSA6IG1fZGF0YS0+bV9oQmFyLmdldCgpKQorICAgICAgICAgICAgb2Zmc2V0ID0g
c2Nyb2xsU2Nyb2xsYmFyKGJhciwgb2Zmc2V0KTsKKworICAgIGlmIChvZmZzZXQgJiYgcGFyZW50
KCkpCisgICAgICAgIG9mZnNldCA9IHBhcmVudCgpLT5zY3JvbGxSZWN1cnNpdmVseSh2ZXJ0aWNh
bCwgb2Zmc2V0KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6
bW92ZVN1YmZyYW1lSW50b1ZpZXcoY29uc3QgSW50UmVjdCYgcmVjdCwgSW50U2l6ZSYgbWF4T2Zm
c2V0LCBib29sIHNob3dTY3JvbGxiYXJzKQoreworICAgIEludFNpemUgc2Nyb2xsZWQoMCwgMCk7
CisgICAgaWYgKG1heE9mZnNldC53aWR0aCgpKSB7CisgICAgICAgIGlmIChQbGF0Zm9ybVNjcm9s
bGJhciogYmFyID0gbV9kYXRhLT5tX2hCYXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIHNjcm9sbGVk
LnNldFdpZHRoKG1heE9mZnNldC53aWR0aCgpID4gMAorICAgICAgICAgICAgICAgICAgICA/IHJl
Y3QucmlnaHQoKSAtIHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQud2lkdGgoKSAr
IG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNXaWR0aCkKKyAgICAgICAgICAgICAgICAgICAgOiBy
ZWN0LngoKSAtIHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQud2lkdGgoKSkpOwor
CisgICAgICAgICAgICBpZiAoc2Nyb2xsZWQud2lkdGgoKSA+IDAgJiYgbWF4T2Zmc2V0LndpZHRo
KCkgPiAwKQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldFdpZHRoKG1pbihtYXhPZmZzZXQu
d2lkdGgoKSwgc2Nyb2xsZWQud2lkdGgoKSkpOworICAgICAgICAgICAgZWxzZSBpZiAoc2Nyb2xs
ZWQud2lkdGgoKSA8IDAgJiYgbWF4T2Zmc2V0LndpZHRoKCkgPCAwKQorICAgICAgICAgICAgICAg
IHNjcm9sbGVkLnNldFdpZHRoKG1heChtYXhPZmZzZXQud2lkdGgoKSwgc2Nyb2xsZWQud2lkdGgo
KSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldFdpZHRo
KDApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtYXhPZmZzZXQuaGVpZ2h0KCkpIHsKKyAg
ICAgICAgaWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSBtX2RhdGEtPm1fdkJhci5nZXQoKSkg
eworICAgICAgICAgICAgc2Nyb2xsZWQuc2V0SGVpZ2h0KG1heE9mZnNldC5oZWlnaHQoKSA+IDAK
KyAgICAgICAgICAgICAgICAgICAgPyByZWN0LmJvdHRvbSgpIC0gc3RhYmxlUm91bmQobV9kYXRh
LT5tX3Njcm9sbE9mZnNldC5oZWlnaHQoKSArIG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWln
aHQpCisgICAgICAgICAgICAgICAgICAgIDogcmVjdC55KCkgLSBzdGFibGVSb3VuZChtX2RhdGEt
Pm1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgpKSk7CisKKyAgICAgICAgICAgIGlmIChzY3JvbGxlZC5o
ZWlnaHQoKSA+IDAgJiYgbWF4T2Zmc2V0LmhlaWdodCgpID4gMCkKKyAgICAgICAgICAgICAgICBz
Y3JvbGxlZC5zZXRIZWlnaHQobWluKG1heE9mZnNldC5oZWlnaHQoKSwgc2Nyb2xsZWQuaGVpZ2h0
KCkpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNjcm9sbGVkLmhlaWdodCgpIDwgMCAmJiBtYXhP
ZmZzZXQuaGVpZ2h0KCkgPCAwKQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldEhlaWdodCht
YXgobWF4T2Zmc2V0LmhlaWdodCgpLCBzY3JvbGxlZC5oZWlnaHQoKSkpOworICAgICAgICAgICAg
ZWxzZQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldEhlaWdodCgwKTsKKyAgICAgICAgfQor
ICAgIH0KKyAgICBpZiAoc2Nyb2xsZWQud2lkdGgoKSB8fCBzY3JvbGxlZC5oZWlnaHQoKSkgewor
ICAgICAgICBtYXhPZmZzZXQgLT0gc2Nyb2xsZWQ7CisgICAgICAgIHNjcm9sbFJlY3Vyc2l2ZWx5
KHNjcm9sbGVkLCBzaG93U2Nyb2xsYmFycyk7CisgICAgICAgIG1heE9mZnNldCArPSBzY3JvbGxl
ZDsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xsUmVjdXJzaXZlbHkoSW50U2l6
ZSYgb2Zmc2V0LCBib29sIHNob3dTY3JvbGxiYXJzKQoreworICAgIGlmICghb2Zmc2V0LndpZHRo
KCkgJiYgIW9mZnNldC5oZWlnaHQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHBhcmVu
dCgpKQorICAgICAgICBwYXJlbnQoKS0+bW92ZVN1YmZyYW1lSW50b1ZpZXcoZnJhbWVSZWN0KCks
IG9mZnNldCwgc2hvd1Njcm9sbGJhcnMpOworCisgICAgSW50U2l6ZSBvbGRPZmZzZXQobV9kYXRh
LT5tX3Njcm9sbE9mZnNldCk7CisgICAgYm9vbCBvbGRTdXBwcmVzc2VkID0gbV9kYXRhLT5tX3No
b3dTY3JvbGxiYXJTdXBwcmVzc2VkOworICAgIG1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJl
c3NlZCA9IHRydWU7CisKKyAgICBpZiAob2Zmc2V0LndpZHRoKCkpIHsKKyAgICAgICAgaWYgKFBs
YXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSBtX2RhdGEtPm1faEJhci5nZXQoKSkKKyAgICAgICAgICAg
IG9mZnNldC5zZXRXaWR0aChzY3JvbGxTY3JvbGxiYXIoYmFyLCBvZmZzZXQud2lkdGgoKSkpOwor
ICAgIH0KKworICAgIGlmIChvZmZzZXQuaGVpZ2h0KCkpIHsKKyAgICAgICAgaWYgKFBsYXRmb3Jt
U2Nyb2xsYmFyKiBiYXIgPSBtX2RhdGEtPm1fdkJhci5nZXQoKSkKKyAgICAgICAgICAgIG9mZnNl
dC5zZXRIZWlnaHQoc2Nyb2xsU2Nyb2xsYmFyKGJhciwgb2Zmc2V0LmhlaWdodCgpKSk7CisgICAg
fQorCisgICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkID0gb2xkU3VwcHJlc3Nl
ZDsKKyAgICBpZiAoIW1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZCkgeworICAgICAg
ICBJbnRTaXplIGRlbHRhU2Nyb2xsID0gbV9kYXRhLT5tX3Njcm9sbE9mZnNldCAtIG9sZE9mZnNl
dDsKKyAgICAgICAgaWYgKGRlbHRhU2Nyb2xsLndpZHRoKCkgfHwgZGVsdGFTY3JvbGwuaGVpZ2h0
KCkpIHsKKyAgICAgICAgICAgIG1fZGF0YS0+c2Nyb2xsQmFja2luZ1N0b3JlKGRlbHRhU2Nyb2xs
KTsKKyAgICAgICAgICAgIC8vc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPmZyYW1lKCkt
PnNlbmRTY3JvbGxFdmVudCgpOworICAgICAgICAgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFtZVZp
ZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAgICAgICAgIGlm
IChGcmFtZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoZnJhbWUtPnNob3VsZEJsaW5rQ2FyZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgaG9zdFdp
bmRvdygpLT5jYXJldFJlY3RDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBp
ZiAoc2hvd1Njcm9sbGJhcnMpCisgICAgICAgICAgICAgICAgbV9kYXRhLT5zaG93U2Nyb2xsYmFy
cyhkZWx0YVNjcm9sbC53aWR0aCgpICE9IDAsIGRlbHRhU2Nyb2xsLmhlaWdodCgpICE9IDAsIHNo
b3dTY3JvbGxiYXJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJlbnQoKSkgewor
ICAgICAgICBpZiAob2Zmc2V0LndpZHRoKCkgfHwgb2Zmc2V0LmhlaWdodCgpKQorICAgICAgICAg
ICAgcGFyZW50KCktPnNjcm9sbFJlY3Vyc2l2ZWx5KG9mZnNldCwgc2hvd1Njcm9sbGJhcnMpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbV9kYXRhLT5tX3ZCYXIpCisgICAgICAgICAgICBv
ZmZzZXQuc2V0SGVpZ2h0KDApOworICAgICAgICBpZiAoIW1fZGF0YS0+bV9oQmFyKQorICAgICAg
ICAgICAgb2Zmc2V0LnNldFdpZHRoKDApOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3Ojpz
Y3JvbGxSZWN1cnNpdmVseShTY3JvbGxEaXJlY3Rpb24gZGlyZWN0aW9uLCBTY3JvbGxHcmFudWxh
cml0eSBncmFudWxhcml0eSwgaW50IHJlcGVhdENvdW50KQoreworICAgIGJvb2wgdmVydGljYWwg
PSBkaXJlY3Rpb24gPT0gU2Nyb2xsVXAgfHwgZGlyZWN0aW9uID09IFNjcm9sbERvd247CisgICAg
aWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSB2ZXJ0aWNhbCA/IG1fZGF0YS0+bV92QmFyLmdl
dCgpIDogbV9kYXRhLT5tX2hCYXIuZ2V0KCkpIHsKKyAgICAgICAgaW50IG9mZnNldCA9IGRpcmVj
dGlvbiA9PSBTY3JvbGxVcCB8fCBkaXJlY3Rpb24gPT0gU2Nyb2xsTGVmdCA/IC0xIDogMTsKKyAg
ICAgICAgb2Zmc2V0ICo9IGdyYW51bGFyaXR5ID09IFNjcm9sbEJ5TGluZSA/IGNTY3JvbGxiYXJQ
aXhlbHNQZXJMaW5lU3RlcAorICAgICAgICAgICAgOiBncmFudWxhcml0eSA9PSBTY3JvbGxCeVBh
Z2UgPyAodmVydGljYWwgPyBoZWlnaHQoKSA6IHdpZHRoKCkpIC0gY0Ftb3VudFRvS2VlcFdoZW5Q
YWdpbmcKKyAgICAgICAgICAgIDogZ3JhbnVsYXJpdHkgPT0gU2Nyb2xsQnlEb2N1bWVudCA/IHZl
cnRpY2FsID8gY29udGVudHNIZWlnaHQoKSA6IGNvbnRlbnRzV2lkdGgoKQorICAgICAgICAgICAg
OiAxOworICAgICAgICBvZmZzZXQgKj0gcmVwZWF0Q291bnQ7CisgICAgICAgIHNjcm9sbFJlY3Vy
c2l2ZWx5KHZlcnRpY2FsLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAocGFyZW50KCkpCisgICAg
ICAgIHBhcmVudCgpLT5zY3JvbGxSZWN1cnNpdmVseShkaXJlY3Rpb24sIGdyYW51bGFyaXR5LCBy
ZXBlYXRDb3VudCk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xsV2luZG93T2Zmc2V0KFNJ
WkUmIGRlbHRhLCBib29sIHNob3dTY3JvbGxiYXJzKQoreworICAgIEludFNpemUgb2Zmc2V0ID0g
SW50U2l6ZShkZWx0YSkgLyBzY2FsZSgpOworICAgIHNjcm9sbFJlY3Vyc2l2ZWx5KG9mZnNldCwg
c2hvd1Njcm9sbGJhcnMpOworICAgIGRlbHRhID0gb2Zmc2V0ICogc2NhbGUoKTsKK30KKwordm9p
ZCBTY3JvbGxWaWV3OjpzZXRBbGxvd3NTY3JvbGxpbmcoYm9vbCBmbGFnKQoreworICAgIGlmICht
X2FsbG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSkKKyAgICAgICAgbV9kYXRhLT5zZXRBbGxvd3NT
Y3JvbGxpbmcoZmxhZyk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6YWxsb3dzU2Nyb2xsaW5nKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5hbGxvd3NTY3JvbGxpbmcoKTsKK30KKwordm9p
ZCBTY3JvbGxWaWV3OjpwYWludFNjcm9sbGJhcnMoSERDIGhkYywgTFBSRUNUIGRpcnR5UmVjdFdp
bikKK3sKKyAgICBJbnRSZWN0IGRpcnR5UmVjdCgqZGlydHlSZWN0V2luKTsKKyAgICBJbnRSZWN0
IG15V2luZG93UmVjdChtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSk7CisgICAgZGlydHlSZWN0
LmludGVyc2VjdChteVdpbmRvd1JlY3QpOworCisgICAgaWYgKCFtX2RhdGEtPm1fc2Nyb2xsYmFy
c1N1cHByZXNzZWQgJiYgbV9kYXRhLT5tX3Njcm9sbGJhcnNWaXNpYmxlICYmIChtX2RhdGEtPmNh
blNob3dWU2Nyb2xsYmFyKCkgfHwgbV9kYXRhLT5jYW5TaG93SFNjcm9sbGJhcigpKSkgeworICAg
ICAgICBHcmFwaGljc0NvbnRleHQgbXlDb250ZXh0KGhkYyk7CisgICAgICAgIG15Q29udGV4dC5z
YXZlKCk7CisgICAgICAgIG15Q29udGV4dC5jbGlwKGRpcnR5UmVjdCk7CisgICAgICAgIG15Q29u
dGV4dC50cmFuc2xhdGUobV9kYXRhLT5tX3BoeXNpY2FsR2VvbWV0cnkueCgpLCBtX2RhdGEtPm1f
cGh5c2ljYWxHZW9tZXRyeS55KCkpOworICAgICAgICBteUNvbnRleHQuc2NhbGUoRmxvYXRTaXpl
KHNjYWxlKCksIHNjYWxlKCkpKTsKKworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBhZmZp
bmVUcmFucyA9IG15Q29udGV4dC5hZmZpbmVUcmFuc2Zvcm0oKS5pbnZlcnNlKCk7CisgICAgICAg
IEludFJlY3Qgc2Nyb2xsVmlld0RpcnR5UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoYWZmaW5lVHJh
bnMubWFwUmVjdChGbG9hdFJlY3QoZGlydHlSZWN0KSkpOworICAgICAgICBpZiAoIXNjcm9sbFZp
ZXdEaXJ0eVJlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBEV09SRCBjb2xvcldpbiA9IEdl
dFN5c0NvbG9yKENPTE9SX1NDUk9MTEJBUik7CisgICAgICAgICAgICBDb2xvciBjb3JuZXJDb2xv
cihHZXRSVmFsdWUoY29sb3JXaW4pLCBHZXRHVmFsdWUoY29sb3JXaW4pLCBHZXRCVmFsdWUoY29s
b3JXaW4pKTsKKworICAgICAgICAgICAgaWYgKG1fZGF0YS0+Y2FuU2hvd0hTY3JvbGxiYXIoKSkg
eworICAgICAgICAgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5wYWludCgmbXlDb250ZXh0LCBzY3Jv
bGxWaWV3RGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAgIGludCBoQmFyQm90dG9tID0gbV9k
YXRhLT5tX3BoeXNpY2FsR2VvbWV0cnkueSgpICsgc3RhYmxlUm91bmQoKG1fZGF0YS0+bV9oQmFy
LT55KCkgKyBtX2RhdGEtPm1faEJhci0+aGVpZ2h0KCkpICogc2NhbGUoKSk7CisgICAgICAgICAg
ICAgICAgaWYgKGhCYXJCb3R0b20gPCBteVdpbmRvd1JlY3QuYm90dG9tKCkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgSW50UmVjdCBibGFua0FyZWEobXlXaW5kb3dSZWN0LngoKQorICAgICAgICAg
ICAgICAgICAgICAgICAgLCBoQmFyQm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICAsIG15
V2luZG93UmVjdC53aWR0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAsIG15V2luZG93UmVj
dC5ib3R0b20oKSAtIGhCYXJCb3R0b20pOworCisgICAgICAgICAgICAgICAgICAgIGJsYW5rQXJl
YS5pbnRlcnNlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWJsYW5r
QXJlYS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15Q29udGV4dC5zYXZl
KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRleHQgb3JpZ0NvbnRleHQo
aGRjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdDb250ZXh0LmZpbGxSZWN0KGJsYW5r
QXJlYSwgY29ybmVyQ29sb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgbXlDb250ZXh0LnJl
c3RvcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAg
ICAgICAgICAgICAgIG15V2luZG93UmVjdC5zZXRIZWlnaHQoc3RhYmxlUm91bmQobV9kYXRhLT5t
X2hCYXItPnkoKSAqIHNjYWxlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICht
X2RhdGEtPmNhblNob3dWU2Nyb2xsYmFyKCkpIHsKKyAgICAgICAgICAgICAgICBtX2RhdGEtPm1f
dkJhci0+cGFpbnQoJm15Q29udGV4dCwgc2Nyb2xsVmlld0RpcnR5UmVjdCk7CisKKyAgICAgICAg
ICAgICAgICBpbnQgdkJhclJpZ2h0ID0gbV9kYXRhLT5tX3BoeXNpY2FsR2VvbWV0cnkueCgpICsg
c3RhYmxlUm91bmQoKG1fZGF0YS0+bV92QmFyLT54KCkgKyBtX2RhdGEtPm1fdkJhci0+d2lkdGgo
KSkgKiBzY2FsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodkJhclJpZ2h0IDwgbXlXaW5kb3dS
ZWN0LnJpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50UmVjdCBibGFua0FyZWEodkJh
clJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAsIG15V2luZG93UmVjdC55KCkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICwgbXlXaW5kb3dSZWN0LnJpZ2h0KCkgLSB2QmFyUmlnaHQKKyAg
ICAgICAgICAgICAgICAgICAgICAgICwgbXlXaW5kb3dSZWN0LmhlaWdodCgpKTsKKworICAgICAg
ICAgICAgICAgICAgICBibGFua0FyZWEuaW50ZXJzZWN0KGRpcnR5UmVjdCk7CisKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCFibGFua0FyZWEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAg
ICAgICAgICBteUNvbnRleHQuc2F2ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhp
Y3NDb250ZXh0IG9yaWdDb250ZXh0KGhkYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmln
Q29udGV4dC5maWxsUmVjdChibGFua0FyZWEsIGNvcm5lckNvbG9yKTsKKyAgICAgICAgICAgICAg
ICAgICAgICAgIG15Q29udGV4dC5yZXN0b3JlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBteVdpbmRvd1JlY3Quc2V0V2lkdGgo
c3RhYmxlUm91bmQobV9kYXRhLT5tX3ZCYXItPngoKSAqIHNjYWxlKCkpKTsKKyAgICAgICAgICAg
IH0KKworICAgICAgICAgICAgLy8gRmlsbCB0aGUgc2Nyb2xsIGNvcm5lciB3aXRoIHdoaXRlLgor
ICAgICAgICAgICAgSW50U2l6ZSBpbm5lclNpemUobV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dp
ZHRoLCBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0KTsKKyAgICAgICAgICAgIEludFJl
Y3QgaENvcm5lciA9IG1fZGF0YS0+Z2V0SENvcm5lcihpbm5lclNpemUpOworICAgICAgICAgICAg
aWYgKGhDb3JuZXIuaW50ZXJzZWN0cyhzY3JvbGxWaWV3RGlydHlSZWN0KSkKKyAgICAgICAgICAg
ICAgICBteUNvbnRleHQuZmlsbFJlY3QoaENvcm5lciwgY29ybmVyQ29sb3IpOworCisgICAgICAg
ICAgICBJbnRSZWN0IHZDb3JuZXIgPSBtX2RhdGEtPmdldFZDb3JuZXIoaW5uZXJTaXplKTsKKyAg
ICAgICAgICAgIGlmICh2Q29ybmVyICE9IGhDb3JuZXIgJiYgdkNvcm5lci5pbnRlcnNlY3RzKHNj
cm9sbFZpZXdEaXJ0eVJlY3QpKQorICAgICAgICAgICAgICAgIG15Q29udGV4dC5maWxsUmVjdCh2
Q29ybmVyLCBjb3JuZXJDb2xvcik7CisKKyAgICAgICAgICAgIGRpcnR5UmVjdC5pbnRlcnNlY3Qo
bXlXaW5kb3dSZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIG15Q29udGV4dC5yZXN0b3JlKCk7
CisgICAgfQorCisgICAgKmRpcnR5UmVjdFdpbiA9IGRpcnR5UmVjdDsKK30KKwordm9pZCBTY3Jv
bGxWaWV3OjpoaWRlQ2hpbGRTY3JvbGxiYXJzUmVjdXJzaXZlbHkoKQoreworICAgIGNvbnN0IEZy
YW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7
CisgICAgRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpOworCisgICAgaWYgKGZyYW1l
KSB7CisgICAgICAgIGZvciAoRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRyZWUoKS0+Zmlyc3RDaGls
ZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGluZygpKSB7CisgICAg
ICAgICAgICBpZiAoRnJhbWVWaWV3KiB2aWV3ID0gY2hpbGQtPnZpZXcoKSkKKyAgICAgICAgICAg
ICAgICB2aWV3LT5oaWRlQ2hpbGRTY3JvbGxiYXJzUmVjdXJzaXZlbHkoKTsKKyAgICAgICAgfQor
ICAgIH0KKworICAgIG1fZGF0YS0+aGlkZVNjcm9sbGJhcnMoKTsKK30KKwordm9pZCBTY3JvbGxW
aWV3OjpzZXRTY3JvbGxiYXJzVmlzaWJsZShib29sIHYpCit7CisgICAgaWYgKHYpCisgICAgICAg
IG1fZGF0YS0+c2hvd1Njcm9sbGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZWxzZQorICAg
ICAgICBtX2RhdGEtPmhpZGVTY3JvbGxiYXJzKCk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6c2hv
d3NTY3JvbGxiYXJzQXV0b21hdGljYWxseSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+
bV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNob3dTY3Jv
bGxiYXJzQXV0b21hdGljYWxseSgpCit7CisgICAgbV9kYXRhLT5zZXRBdXRvU2Nyb2xsYmFycyh0
cnVlKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzaG93U2Nyb2xsYmFyc01hbnVhbGx5KCkKK3sK
KyAgICBtX2RhdGEtPnNldEF1dG9TY3JvbGxiYXJzKGZhbHNlKTsKK30KKwordm9pZCBTY3JvbGxW
aWV3OjpzaG93KCkKK3sKKyAgICBpZiAoIWlzU2VsZlZpc2libGUoKSkgeworICAgICAgICBzZXRT
ZWxmVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgaWYgKGlzUGFyZW50VmlzaWJsZSgpKSB7CisgICAg
ICAgICAgICBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID46Oml0ZXJhdG9yIGVuZCA9IG1fZGF0YS0+
bV9jaGlsZHJlbi5lbmQoKTsKKyAgICAgICAgICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0
PiA+OjppdGVyYXRvciBpdCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpCisgICAgICAgICAgICAgICAgKCppdCktPnNldFBhcmVudFZpc2libGUodHJ1ZSk7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBXaWRnZXQ6OnNob3coKTsKK30KKwordm9pZCBTY3JvbGxW
aWV3OjpoaWRlKCkKK3sKKyAgICBpZiAoaXNTZWxmVmlzaWJsZSgpKSB7CisgICAgICAgIGlmIChp
c1BhcmVudFZpc2libGUoKSkgeworICAgICAgICAgICAgSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+
OjppdGVyYXRvciBlbmQgPSBtX2RhdGEtPm1fY2hpbGRyZW4uZW5kKCk7CisgICAgICAgICAgICBm
b3IgKEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6aXRlcmF0b3IgaXQgPSBtX2RhdGEtPm1fY2hp
bGRyZW4uYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgICAgICgqaXQpLT5z
ZXRQYXJlbnRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBzZXRTZWxmVmlzaWJs
ZShmYWxzZSk7CisgICAgfQorCisgICAgaGlkZUN1cnJlbnRQb3B1cE1lbnUoKTsKKyAgICBXaWRn
ZXQ6OmhpZGUoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRQYXJlbnRWaXNpYmxlKGJvb2wg
dmlzaWJsZSkKK3sKKyAgICBpZiAoaXNQYXJlbnRWaXNpYmxlKCkgPT0gdmlzaWJsZSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgV2lkZ2V0OjpzZXRQYXJlbnRWaXNpYmxlKHZpc2libGUpOworCisg
ICAgaWYgKCFpc1NlbGZWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhhc2hTZXQ8
UmVmUHRyPFdpZGdldD4gPjo6aXRlcmF0b3IgZW5kID0gbV9kYXRhLT5tX2NoaWxkcmVuLmVuZCgp
OworICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRvciBpdCA9IG1fZGF0
YS0+bV9jaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgICgqaXQpLT5z
ZXRQYXJlbnRWaXNpYmxlKHZpc2libGUpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OmhpZGVDdXJy
ZW50UG9wdXBNZW51KCkgY29uc3QKK3sKKyAgICBpZiAobV9jdXJyZW50UG9wdXBNZW51KQorICAg
ICAgICBtX2N1cnJlbnRQb3B1cE1lbnUtPmhpZGUoKTsKK30KKworSW50UmVjdCBTY3JvbGxWaWV3
Ojp2aXNpYmxlV2luZG93UmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKHBhcmVudCgpKSB7CisgICAg
ICAgIEludFJlY3QgdmlzaWJsZVdpbmRvd1JlY3QocGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3co
bV9kYXRhLT5nZXRWaXNpYmxlQ29udGVudFJlY3QoKSkpOworICAgICAgICB2aXNpYmxlV2luZG93
UmVjdC5pbnRlcnNlY3QocGFyZW50KCktPnZpc2libGVXaW5kb3dSZWN0KCkpOworICAgICAgICBy
ZXR1cm4gdmlzaWJsZVdpbmRvd1JlY3Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgSW50UmVjdCB2
aXNpYmxlV2luZG93UmVjdChtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSk7CisgICAgICAgIGlm
IChtX2RhdGEtPm1fc2Nyb2xsYmFyc1Zpc2libGUpIHsKKyAgICAgICAgICAgIGlmIChtX2RhdGEt
PmNhblNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICAgICAgdmlzaWJsZVdpbmRvd1JlY3Qu
c2V0SGVpZ2h0KHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9oQmFyLT55KCkgKiBzY2FsZSgpKSk7Cisg
ICAgICAgICAgICBpZiAobV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigpKQorICAgICAgICAgICAg
ICAgIHZpc2libGVXaW5kb3dSZWN0LnNldFdpZHRoKHN0YWJsZVJvdW5kKG1fZGF0YS0+bV92QmFy
LT54KCkgKiBzY2FsZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZpc2libGVXaW5k
b3dSZWN0OworICAgIH0KK30KKworSW50U2l6ZSBTY3JvbGxWaWV3OjptYXhTY3JvbGxPZmZzZXRS
ZWN1cnNpdmVseSgpIGNvbnN0Cit7CisgICAgSW50U2l6ZSBtYXhTY3JvbGxQb3NpdGlvbihtYXgo
MCwgY29udGVudHNXaWR0aCgpIC0gd2lkdGgoKSksIG1heCgwLCBjb250ZW50c0hlaWdodCgpIC0g
aGVpZ2h0KCkpKTsKKyAgICBpZiAocGFyZW50KCkpCisgICAgICAgIG1heFNjcm9sbFBvc2l0aW9u
ICs9IHBhcmVudCgpLT5tYXhTY3JvbGxPZmZzZXRSZWN1cnNpdmVseSgpOworICAgIHJldHVybiBt
YXhTY3JvbGxQb3NpdGlvbjsKK30KKworSW50U2l6ZSBTY3JvbGxWaWV3OjpjdXJyZW50U2Nyb2xs
T2Zmc2V0UmVjdXJzaXZlbHkoKSBjb25zdAoreworICAgIEludFNpemUgc2Nyb2xsT2Zmc2V0KG1f
ZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIGlmIChwYXJlbnQoKSkKKyAgICAgICAgc2Nyb2xs
T2Zmc2V0ICs9IHBhcmVudCgpLT5jdXJyZW50U2Nyb2xsT2Zmc2V0UmVjdXJzaXZlbHkoKTsKKyAg
ICByZXR1cm4gc2Nyb2xsT2Zmc2V0OworfQorCitJbnRTaXplIFNjcm9sbFZpZXc6OndpbmRvd1Nj
cm9sbE9mZnNldCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQg
KiBzY2FsZSgpOworfQorCitJbnRSZWN0IFNjcm9sbFZpZXc6OndpbmRvd0NvbnRlbnRzUmVjdCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnRlbnRzVG9XaW5kb3coSW50UmVjdChJbnRQb2ludCgw
LCAwKSwgbV9kYXRhLT5tX2NvbnRlbnRzU2l6ZSkpOworfQorCisvLyBTY3JvbGxiYXJDbGllbnQK
K3ZvaWQgU2Nyb2xsVmlldzo6dmFsdWVDaGFuZ2VkKFNjcm9sbGJhciogc2Nyb2xsYmFyKQorewor
ICAgIG1fZGF0YS0+dmFsdWVDaGFuZ2VkKHNjcm9sbGJhcik7Cit9CisKK2Jvb2wgU2Nyb2xsVmll
dzo6c2Nyb2xsYmFyQ29ybmVyUHJlc2VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+
bV9oQmFyICYmIG1fZGF0YS0+bV92QmFyOworfQorCisvLyBOZXcKK3ZvaWQgU2Nyb2xsVmlldzo6
c2V0SGFzSG9yaXpvbnRhbFNjcm9sbGJhcihib29sIGhhcykKK3sKKyAgICBtX2RhdGEtPnNldEhh
c0hvcml6b250YWxTY3JvbGxiYXIoaGFzKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRIYXNW
ZXJ0aWNhbFNjcm9sbGJhcihib29sIGhhcykKK3sKKyAgICBtX2RhdGEtPnNldEhhc1ZlcnRpY2Fs
U2Nyb2xsYmFyKGhhcyk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6c2Nyb2xsYmFyc1N1cHByZXNz
ZWQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQ7
Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0Q2FuQmxpdE9uU2Nyb2xsKGJvb2wpCit7CisgICAg
bm90SW1wbGVtZW50ZWQoKTsKK30KK2Jvb2wgU2Nyb2xsVmlldzo6Y2FuQmxpdE9uU2Nyb2xsKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0Q2Fu
SGF2ZVNjcm9sbGJhcnMoYm9vbCBjYW5TY3JvbGwpCit7CisgICAgU2Nyb2xsYmFyTW9kZSBuZXdI
b3Jpem9udGFsTW9kZTsKKyAgICBTY3JvbGxiYXJNb2RlIG5ld1ZlcnRpY2FsTW9kZTsKKworICAg
IHNjcm9sbGJhck1vZGVzKG5ld0hvcml6b250YWxNb2RlLCBuZXdWZXJ0aWNhbE1vZGUpOworCisg
ICAgaWYgKGNhblNjcm9sbCAmJiBuZXdWZXJ0aWNhbE1vZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2Zm
KQorICAgICAgICBuZXdWZXJ0aWNhbE1vZGUgPSBTY3JvbGxiYXJBdXRvOworICAgIGVsc2UgaWYg
KCFjYW5TY3JvbGwpCisgICAgICAgIG5ld1ZlcnRpY2FsTW9kZSA9IFNjcm9sbGJhckFsd2F5c09m
ZjsKKworICAgIGlmIChjYW5TY3JvbGwgJiYgbmV3SG9yaXpvbnRhbE1vZGUgPT0gU2Nyb2xsYmFy
QWx3YXlzT2ZmKQorICAgICAgICBuZXdIb3Jpem9udGFsTW9kZSA9IFNjcm9sbGJhckF1dG87Cisg
ICAgZWxzZSBpZiAoIWNhblNjcm9sbCkKKyAgICAgICAgbmV3SG9yaXpvbnRhbE1vZGUgPSBTY3Jv
bGxiYXJBbHdheXNPZmY7CisKKyAgICBzZXRTY3JvbGxiYXJNb2RlcyhuZXdIb3Jpem9udGFsTW9k
ZSwgbmV3VmVydGljYWxNb2RlKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzY3JvbGxiYXJNb2Rl
cyhTY3JvbGxiYXJNb2RlJiBob3Jpem9udGFsTW9kZSwgU2Nyb2xsYmFyTW9kZSYgdmVydGljYWxN
b2RlKSBjb25zdAoreworICAgIGhvcml6b250YWxNb2RlID0gaG9yaXpvbnRhbFNjcm9sbGJhck1v
ZGUoKTsKKyAgICB2ZXJ0aWNhbE1vZGUgPSB2ZXJ0aWNhbFNjcm9sbGJhck1vZGUoKTsKK30KKwor
UGFzc1JlZlB0cjxTY3JvbGxiYXI+IFNjcm9sbFZpZXc6OmNyZWF0ZVNjcm9sbGJhcihTY3JvbGxi
YXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICByZXR1cm4gU2Nyb2xsYmFyOjpjcmVh
dGVOYXRpdmVTY3JvbGxiYXIodGhpcywgb3JpZW50YXRpb24sIFJlZ3VsYXJTY3JvbGxiYXIpOwor
fQorCitpbnQgU2Nyb2xsVmlldzo6bGF5b3V0V2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBt
X2ZpeGVkTGF5b3V0U2l6ZS5pc0VtcHR5KCkgfHwgIW1fdXNlRml4ZWRMYXlvdXQgPyB2aXNpYmxl
V2lkdGgoKSA6IG1fZml4ZWRMYXlvdXRTaXplLndpZHRoKCk7Cit9CisKK2ludCBTY3JvbGxWaWV3
OjpsYXlvdXRIZWlnaHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2ZpeGVkTGF5b3V0U2l6ZS5p
c0VtcHR5KCkgfHwgIW1fdXNlRml4ZWRMYXlvdXQgPyB2aXNpYmxlSGVpZ2h0KCkgOiBtX2ZpeGVk
TGF5b3V0U2l6ZS5oZWlnaHQoKTsKK30KKworSW50U2l6ZSBTY3JvbGxWaWV3OjpmaXhlZExheW91
dFNpemUoKSBjb25zdAoreworICAgIHJldHVybiBtX2ZpeGVkTGF5b3V0U2l6ZTsKK30KKwordm9p
ZCBTY3JvbGxWaWV3OjpzZXRGaXhlZExheW91dFNpemUoY29uc3QgSW50U2l6ZSYgbmV3U2l6ZSkK
K3sKKyAgICBpZiAoZml4ZWRMYXlvdXRTaXplKCkgPT0gbmV3U2l6ZSkKKyAgICAgICAgcmV0dXJu
OworICAgIG1fZml4ZWRMYXlvdXRTaXplID0gbmV3U2l6ZTsKKyAgICB1cGRhdGVTY3JvbGxiYXJz
KHNjcm9sbE9mZnNldCgpKTsKK30KKworYm9vbCBTY3JvbGxWaWV3Ojp1c2VGaXhlZExheW91dCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdXNlRml4ZWRMYXlvdXQ7Cit9CisKK3ZvaWQgU2Nyb2xs
Vmlldzo6c2V0VXNlRml4ZWRMYXlvdXQoYm9vbCBlbmFibGUpCit7CisgICAgaWYgKHVzZUZpeGVk
TGF5b3V0KCkgPT0gZW5hYmxlKQorICAgICAgICByZXR1cm47CisgICAgbV91c2VGaXhlZExheW91
dCA9IGVuYWJsZTsKKyAgICB1cGRhdGVTY3JvbGxiYXJzKHNjcm9sbE9mZnNldCgpKTsKK30KKwor
Ym9vbCBTY3JvbGxWaWV3Ojppc09mZnNjcmVlbigpIGNvbnN0Cit7CisgICAgcmV0dXJuICFpc1Zp
c2libGUoKSB8fCAhSXNXaW5kb3dWaXNpYmxlKHBsYXRmb3JtV2lkZ2V0KCkpOworfQorCit2b2lk
IFNjcm9sbFZpZXc6OnNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IEludFBvaW50JiBwb3MpCit7Cisg
ICAgc2V0Q29udGVudHNQb3MocG9zLngoKSwgcG9zLnkoKSk7Cit9CisKK2Jvb2wgU2Nyb2xsVmll
dzo6Y29udGFpbnNTY3JvbGxiYXJzQXZvaWRpbmdSZXNpemVyKCkgY29uc3QKK3sKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6Zmxvd1RleHRUb0ZpdChjb25zdCBOb2Rl
KiBub2RlKSBjb25zdAoreworICAgIHJldHVybiBob3N0V2luZG93KCkmJiBob3N0V2luZG93KCkt
PmZsb3dUZXh0VG9GaXQobm9kZSk7Cit9CisKK2Zsb2F0IFNjcm9sbFZpZXc6OmRlZmF1bHRTY2Fs
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhvc3RXaW5kb3coKSA/IGhvc3RXaW5kb3coKS0+ZGVm
YXVsdFNjYWxlKCkgOiAxLjsKK30KKwordm9pZCBTY3JvbGxWaWV3OjphZGp1c3RTY3JvbGxiYXJz
QXZvaWRpbmdSZXNpemVyQ291bnQoaW50IG92ZXJsYXBEZWx0YSkKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworfQorCitTY3JvbGxiYXIqIFNjcm9sbFZpZXc6Omhvcml6b250YWxTY3JvbGxiYXIo
KSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1faEJhci5nZXQoKTsKK30KKworU2Nyb2xs
YmFyKiBTY3JvbGxWaWV3Ojp2ZXJ0aWNhbFNjcm9sbGJhcigpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fZGF0YS0+bV92QmFyLmdldCgpOworfQorCisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKwpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TY3JvbGxiYXJUaGVtZVdpbmNlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5jcHAKbmV3IGZp
bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUzYWRlMQotLS0gL2Rldi9udWxsCisrKyBi
L1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5jcHAKQEAgLTAsMCAr
MSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRz
IFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lV2luY2UuaCIKKwor
I2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVu
dC5oIgorI2luY2x1ZGUgIlNjcm9sbGJhci5oIgorI2luY2x1ZGUgIlNvZnRMaW5raW5nLmgiCisK
Ky8vIEdlbmVyaWMgc3RhdGUgY29uc3RhbnRzCisjZGVmaW5lIFRTX05PUk1BTCAgICAxCisjZGVm
aW5lIFRTX0hPVkVSICAgICAyCisjZGVmaW5lIFRTX0FDVElWRSAgICAzCisjZGVmaW5lIFRTX0RJ
U0FCTEVEICA0CisKKyNkZWZpbmUgU1BfQlVUVE9OICAgICAgICAgIDEKKyNkZWZpbmUgU1BfVEhV
TUJIT1IgICAgICAgIDIKKyNkZWZpbmUgU1BfVEhVTUJWRVJUICAgICAgIDMKKyNkZWZpbmUgU1Bf
VFJBQ0tTVEFSVEhPUiAgIDQKKyNkZWZpbmUgU1BfVFJBQ0tFTkRIT1IgICAgIDUKKyNkZWZpbmUg
U1BfVFJBQ0tTVEFSVFZFUlQgIDYKKyNkZWZpbmUgU1BfVFJBQ0tFTkRWRVJUICAgIDcKKyNkZWZp
bmUgU1BfR1JJUFBFUkhPUiAgICAgIDgKKyNkZWZpbmUgU1BfR1JJUFBFUlZFUlQgICAgIDkKKwor
I2RlZmluZSBUU19VUF9CVVRUT04gICAgICAgMAorI2RlZmluZSBUU19ET1dOX0JVVFRPTiAgICAg
NAorI2RlZmluZSBUU19MRUZUX0JVVFRPTiAgICAgOAorI2RlZmluZSBUU19SSUdIVF9CVVRUT04g
ICAgMTIKKyNkZWZpbmUgVFNfVVBfQlVUVE9OX0hPVkVSICAgMTcKKyNkZWZpbmUgVFNfRE9XTl9C
VVRUT05fSE9WRVIgIDE4CisjZGVmaW5lIFRTX0xFRlRfQlVUVE9OX0hPVkVSICAxOQorI2RlZmlu
ZSBUU19SSUdIVF9CVVRUT05fSE9WRVIgICAyMAorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK1Njcm9sbGJhclRoZW1lV2luY2U6OlNjcm9sbGJhclRoZW1l
V2luY2UoKQoreworfQorCitTY3JvbGxiYXJUaGVtZVdpbmNlOjp+U2Nyb2xsYmFyVGhlbWVXaW5j
ZSgpCit7Cit9CisKK2ludCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpzY3JvbGxiYXJUaGlja25lc3Mo
U2Nyb2xsYmFyQ29udHJvbFNpemUpCit7CisgICAgc3RhdGljIGludCB0aGlja25lc3M7CisgICAg
aWYgKCF0aGlja25lc3MpCisgICAgICAgIHRoaWNrbmVzcyA9IDo6R2V0U3lzdGVtTWV0cmljcyhT
TV9DWFZTQ1JPTEwpOworICAgIHJldHVybiB0aGlja25lc3M7Cit9CisKK3ZvaWQgU2Nyb2xsYmFy
VGhlbWVXaW5jZTo6dGhlbWVDaGFuZ2VkKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
Citib29sIFNjcm9sbGJhclRoZW1lV2luY2U6OmludmFsaWRhdGVPbk1vdXNlRW50ZXJFeGl0KCkK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBT
Y3JvbGxiYXJUaGVtZVdpbmNlOjpoYXNUaHVtYihTY3JvbGxiYXIqIHNjcm9sbGJhcikKK3sKKyAg
ICByZXR1cm4gdGh1bWJMZW5ndGgoc2Nyb2xsYmFyKSA+IDA7Cit9CisKK0ludFJlY3QgU2Nyb2xs
YmFyVGhlbWVXaW5jZTo6YmFja0J1dHRvblJlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIFNjcm9s
bGJhclBhcnQgcGFydCwgYm9vbCkKK3sKKyAgICAvLyBXaW5kb3dzIGp1c3QgaGFzIHNpbmdsZSBh
cnJvd3MuCisgICAgaWYgKHBhcnQgPT0gQmFja0J1dHRvbkVuZFBhcnQpCisgICAgICAgIHJldHVy
biBJbnRSZWN0KCk7CisKKyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2VudGlhbGx5IDE3
eDE3LgorCisgICAgLy8gT3VyIGFjdHVhbCByZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhlIGF2
YWlsYWJsZSBzcGFjZSB3aGVuCisgICAgLy8gd2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAgVGhp
cyBhbGxvd3MgdGhlIHNjcm9sbGJhcgorICAgIC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0aW9u
IGV2ZW4gYXQgdGlueSBzaXplcy4KKyAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhpY2tu
ZXNzKCk7CisgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyKQorICAgICAgICByZXR1cm4gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc2Nyb2xsYmFy
LT55KCksCisgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGJhci0+d2lkdGgoKSA8IDIgKiB0
aGlja25lc3MgPyBzY3JvbGxiYXItPndpZHRoKCkgLyAyIDogdGhpY2tuZXNzLCB0aGlja25lc3Mp
OworICAgIHJldHVybiBJbnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSwKKyAg
ICAgICAgICAgICAgICAgICB0aGlja25lc3MsIHNjcm9sbGJhci0+aGVpZ2h0KCkgPCAyICogdGhp
Y2tuZXNzID8gc2Nyb2xsYmFyLT5oZWlnaHQoKSAvIDIgOiB0aGlja25lc3MpOworfQorCitJbnRS
ZWN0IFNjcm9sbGJhclRoZW1lV2luY2U6OmZvcndhcmRCdXR0b25SZWN0KFNjcm9sbGJhciogc2Ny
b2xsYmFyLCBTY3JvbGxiYXJQYXJ0IHBhcnQsIGJvb2wpCit7CisgICAgLy8gV2luZG93cyBqdXN0
IGhhcyBzaW5nbGUgYXJyb3dzLgorICAgIGlmIChwYXJ0ID09IEZvcndhcmRCdXR0b25TdGFydFBh
cnQpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisKKyAgICAvLyBPdXIgZGVzaXJlZCByZWN0
IGlzIGVzc2VudGlhbGx5IDE3eDE3LgorCisgICAgLy8gT3VyIGFjdHVhbCByZWN0IHdpbGwgc2hy
aW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFjZSB3aGVuCisgICAgLy8gd2UgaGF2ZSA8IDM0
IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhlIHNjcm9sbGJhcgorICAgIC8vIHRvIHNjYWxl
IGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlueSBzaXplcy4KKyAgICBpbnQgdGhpY2tuZXNz
ID0gc2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24o
KSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIGludCB3ID0gc2Nyb2xsYmFyLT53
aWR0aCgpIDwgMiAqIHRoaWNrbmVzcyA/IHNjcm9sbGJhci0+d2lkdGgoKSAvIDIgOiB0aGlja25l
c3M7CisgICAgICAgIHJldHVybiBJbnRSZWN0KHNjcm9sbGJhci0+eCgpICsgc2Nyb2xsYmFyLT53
aWR0aCgpIC0gdywgc2Nyb2xsYmFyLT55KCksIHcsIHRoaWNrbmVzcyk7CisgICAgfQorCisgICAg
aW50IGggPSBzY3JvbGxiYXItPmhlaWdodCgpIDwgMiAqIHRoaWNrbmVzcyA/IHNjcm9sbGJhci0+
aGVpZ2h0KCkgLyAyIDogdGhpY2tuZXNzOworICAgIHJldHVybiBJbnRSZWN0KHNjcm9sbGJhci0+
eCgpLCBzY3JvbGxiYXItPnkoKSArIHNjcm9sbGJhci0+aGVpZ2h0KCkgLSBoLCB0aGlja25lc3Ms
IGgpOworfQorCitJbnRSZWN0IFNjcm9sbGJhclRoZW1lV2luY2U6OnRyYWNrUmVjdChTY3JvbGxi
YXIqIHNjcm9sbGJhciwgYm9vbCkKK3sKKyAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhp
Y2tuZXNzKCk7CisgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyKSB7CisgICAgICAgIGlmIChzY3JvbGxiYXItPndpZHRoKCkgPCAyICogdGhpY2tu
ZXNzKQorICAgICAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKKyAgICAgICAgcmV0dXJuIEludFJl
Y3Qoc2Nyb2xsYmFyLT54KCkgKyB0aGlja25lc3MsIHNjcm9sbGJhci0+eSgpLCBzY3JvbGxiYXIt
PndpZHRoKCkgLSAyICogdGhpY2tuZXNzLCB0aGlja25lc3MpOworICAgIH0KKyAgICBpZiAoc2Ny
b2xsYmFyLT5oZWlnaHQoKSA8IDIgKiB0aGlja25lc3MpCisgICAgICAgIHJldHVybiBJbnRSZWN0
KCk7CisgICAgcmV0dXJuIEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpICsg
dGhpY2tuZXNzLCB0aGlja25lc3MsIHNjcm9sbGJhci0+aGVpZ2h0KCkgLSAyICogdGhpY2tuZXNz
KTsKK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpwYWludFRyYWNrQmFja2dyb3VuZChH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRS
ZWN0JiByZWN0KQoreworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lV2luY2U6OnBhaW50VHJhY2tQ
aWVjZShHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25z
dCBJbnRSZWN0JiByZWN0LCBTY3JvbGxiYXJQYXJ0IHBhcnRUeXBlKQoreworfQorCit2b2lkIFNj
cm9sbGJhclRoZW1lV2luY2U6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
U2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QsIFNjcm9sbGJhclBhcnQg
cGFydCkKK3sKK30KKworc3RhdGljIEludFJlY3QgZ3JpcHBlclJlY3QoaW50IHRoaWNrbmVzcywg
Y29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KQoreworICAgIC8vIENlbnRlciBpbiB0aGUgdGh1bWIu
CisgICAgaW50IGdyaXBwZXJUaGlja25lc3MgPSB0aGlja25lc3MgLyAyOworICAgIHJldHVybiBJ
bnRSZWN0KHRodW1iUmVjdC54KCkgKyAodGh1bWJSZWN0LndpZHRoKCkgLSBncmlwcGVyVGhpY2tu
ZXNzKSAvIDIsCisgICAgICAgICAgICAgICAgICAgdGh1bWJSZWN0LnkoKSArICh0aHVtYlJlY3Qu
aGVpZ2h0KCkgLSBncmlwcGVyVGhpY2tuZXNzKSAvIDIsCisgICAgICAgICAgICAgICAgICAgZ3Jp
cHBlclRoaWNrbmVzcywgZ3JpcHBlclRoaWNrbmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhaW50
R3JpcHBlcihTY3JvbGxiYXIqIHNjcm9sbGJhciwgSERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVj
dCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lV2lu
Y2U6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3JvbGxiYXIqIHNjcm9s
bGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
Citib29sIFNjcm9sbGJhclRoZW1lV2luY2U6OnNob3VsZENlbnRlck9uVGh1bWIoU2Nyb2xsYmFy
KiwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgcmV0dXJuIGV2dC5zaGlm
dEtleSgpICYmIGV2dC5idXR0b24oKSA9PSBMZWZ0QnV0dG9uOworfQorCitTY3JvbGxiYXJUaGVt
ZSogU2Nyb2xsYmFyVGhlbWU6Om5hdGl2ZVRoZW1lKCkKK3sKKyAgICBzdGF0aWMgU2Nyb2xsYmFy
VGhlbWVXaW5jZSB3aW5jZVRoZW1lOworICAgIHJldHVybiAmd2luY2VUaGVtZTsKK30KKworfQor
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Njcm9sbGJhclRoZW1lV2luY2Uu
aCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MzcxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Njcm9sbGJhclRoZW1lV2luY2UuaApAQCAtMCwwICsxLDYx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5k
ZWYgU2Nyb2xsYmFyVGhlbWVXaW5jZV9oCisjZGVmaW5lIFNjcm9sbGJhclRoZW1lV2luY2VfaAor
CisjaW5jbHVkZSAiU2Nyb2xsYmFyVGhlbWVDb21wb3NpdGUuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCisgICAgY2xhc3MgU2Nyb2xsYmFyVGhlbWVXaW5jZSA6IHB1YmxpYyBTY3JvbGxiYXJU
aGVtZUNvbXBvc2l0ZSB7CisgICAgcHVibGljOgorICAgICAgICBTY3JvbGxiYXJUaGVtZVdpbmNl
KCk7CisgICAgICAgIHZpcnR1YWwgflNjcm9sbGJhclRoZW1lV2luY2UoKTsKKworICAgICAgICB2
aXJ0dWFsIGludCBzY3JvbGxiYXJUaGlja25lc3MoU2Nyb2xsYmFyQ29udHJvbFNpemUgPSBSZWd1
bGFyU2Nyb2xsYmFyKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgdGhlbWVDaGFuZ2VkKCk7CisK
KyAgICAgICAgdmlydHVhbCBib29sIGludmFsaWRhdGVPbk1vdXNlRW50ZXJFeGl0KCk7CisKKyAg
ICBwcm90ZWN0ZWQ6CisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNCdXR0b25zKFNjcm9sbGJhciop
IHsgcmV0dXJuIHRydWU7IH0KKyAgICAgICAgdmlydHVhbCBib29sIGhhc1RodW1iKFNjcm9sbGJh
ciopOworCisgICAgICAgIHZpcnR1YWwgSW50UmVjdCBiYWNrQnV0dG9uUmVjdChTY3JvbGxiYXIq
LCBTY3JvbGxiYXJQYXJ0LCBib29sIHBhaW50aW5nID0gZmFsc2UpOworICAgICAgICB2aXJ0dWFs
IEludFJlY3QgZm9yd2FyZEJ1dHRvblJlY3QoU2Nyb2xsYmFyKiwgU2Nyb2xsYmFyUGFydCwgYm9v
bCBwYWludGluZyA9IGZhbHNlKTsKKyAgICAgICAgdmlydHVhbCBJbnRSZWN0IHRyYWNrUmVjdChT
Y3JvbGxiYXIqLCBib29sIHBhaW50aW5nID0gZmFsc2UpOworCisgICAgICAgIHZpcnR1YWwgYm9v
bCBzaG91bGRDZW50ZXJPblRodW1iKFNjcm9sbGJhciosIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBwYWludFRyYWNrQmFja2dyb3VuZChHcmFwaGlj
c0NvbnRleHQqLCBTY3JvbGxiYXIqLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwg
dm9pZCBwYWludFRyYWNrUGllY2UoR3JhcGhpY3NDb250ZXh0KiwgU2Nyb2xsYmFyKiwgY29uc3Qg
SW50UmVjdCYsIFNjcm9sbGJhclBhcnQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcGFpbnRCdXR0
b24oR3JhcGhpY3NDb250ZXh0KiwgU2Nyb2xsYmFyKiwgY29uc3QgSW50UmVjdCYsIFNjcm9sbGJh
clBhcnQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQq
LCBTY3JvbGxiYXIqLCBjb25zdCBJbnRSZWN0Jik7CisgICAgfTsKKworfQorI2VuZGlmCmRpZmYg
LS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NlYXJjaFBvcHVwTWVudVdpbmNlLmNwcCBi
L1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTEyOTIKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NlYXJjaFBvcHVwTWVudVdpbmNlLmNwcApAQCAtMCwwICsx
LDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpbmNs
dWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTZWFyY2hQb3B1cE1lbnUuaCIKKworI2luY2x1ZGUg
IkF0b21pY1N0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1NlYXJjaFBvcHVwTWVu
dTo6U2VhcmNoUG9wdXBNZW51KFBvcHVwTWVudUNsaWVudCogY2xpZW50KQorOiBQb3B1cE1lbnUo
Y2xpZW50KQoreworfQorCitib29sIFNlYXJjaFBvcHVwTWVudTo6ZW5hYmxlZCgpCit7CisgICAg
cmV0dXJuIGZhbHNlOworfQorCit2b2lkIFNlYXJjaFBvcHVwTWVudTo6c2F2ZVJlY2VudFNlYXJj
aGVzKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29uc3QgVmVjdG9yPFN0cmluZz4mIHNlYXJj
aEl0ZW1zKQoreworICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBTZWFyY2hQb3B1cE1lbnU6OmxvYWRSZWNl
bnRTZWFyY2hlcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIFZlY3RvcjxTdHJpbmc+JiBzZWFy
Y2hJdGVtcykKK3sKKyAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKwor
ICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvU2hhcmVkQnVmZmVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2hhcmVk
QnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzk2NzUxCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRCdWZmZXIuY3Bw
CkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA4IEFwcGxl
IENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAy
MDA4LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZiBQTEFURk9STShUT1JDSE1P
QklMRSkgJiYgUExBVEZPUk0oV0lOQ0UpCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJTaGFyZWRCdWZmZXIuaCIKKworI2luY2x1ZGUgIk9wdGltaXplZEJ1ZmZlci5oIgorI2luY2x1
ZGUgIlB1cmdlYWJsZUJ1ZmZlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1NoYXJlZEJ1
ZmZlcjo6U2hhcmVkQnVmZmVyKCkKKzogbV9zaXplKDApCissIG1fbG9ja2VkKDApCissIG1fb3B0
aW1pemVkQnVmZmVyKDApCit7Cit9CisKK1NoYXJlZEJ1ZmZlcjo6U2hhcmVkQnVmZmVyKGNvbnN0
IGNoYXIqIGRhdGEsIGludCBzaXplKQorICAgIDogbV9zaXplKDApCisgICAgLCBtX2xvY2tlZCgw
KQorICAgICwgbV9vcHRpbWl6ZWRCdWZmZXIoMCkKK3sKKyAgICBhcHBlbmQoZGF0YSwgc2l6ZSk7
Cit9CisKK1NoYXJlZEJ1ZmZlcjo6U2hhcmVkQnVmZmVyKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRh
dGEsIGludCBzaXplKQorICAgIDogbV9zaXplKDApCisgICAgLCBtX2xvY2tlZCgwKQorICAgICwg
bV9vcHRpbWl6ZWRCdWZmZXIoMCkKK3sKKyAgICBhcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25z
dCBjaGFyKj4oZGF0YSksIHNpemUpOworfQorCitTaGFyZWRCdWZmZXI6On5TaGFyZWRCdWZmZXIo
KQoreworICAgIE9wdGltaXplZEJ1ZmZlcjo6ZGVsZXRlSW5zdGFuY2UobV9vcHRpbWl6ZWRCdWZm
ZXIpOworfQorCit1bnNpZ25lZCBTaGFyZWRCdWZmZXI6OnNpemUoKSBjb25zdAoreworICAgIHJl
dHVybiBtX3NpemU7Cit9CisKK3Vuc2lnbmVkIFNoYXJlZEJ1ZmZlcjo6Z2V0U2VnbWVudChjb25z
dCBjaGFyKiogZGF0YSwgdW5zaWduZWQgcG9zKSBjb25zdAoreworICAgIGlmIChwb3MgPj0gbV9z
aXplKSB7CisgICAgICAgICpkYXRhID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisg
ICAgdW5zaWduZWQgY29uc2VjdXRpdmVTaXplID0gbV9idWZmZXIuc2l6ZSgpOworICAgIGlmIChw
b3MgPj0gY29uc2VjdXRpdmVTaXplKSB7CisgICAgICAgIEFTU0VSVChtX29wdGltaXplZEJ1ZmZl
cik7CisgICAgICAgIHJldHVybiBtX29wdGltaXplZEJ1ZmZlci0+Z2V0RGF0YShkYXRhLCBwb3Mg
LSBjb25zZWN1dGl2ZVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgICpkYXRhID0gbV9idWZm
ZXIuZGF0YSgpICsgcG9zOworICAgICAgICByZXR1cm4gY29uc2VjdXRpdmVTaXplIC0gcG9zOwor
ICAgIH0KK30KKwordm9pZCBTaGFyZWRCdWZmZXI6OnJlbGVhc2VTZWdtZW50KGNvbnN0IGNoYXIq
IGRhdGEpIGNvbnN0Cit7CisgICAgLy8gSW4gb3VyIFZlY3RvciBidWZmZXIKKyAgICBpZiAoIW1f
YnVmZmVyLmlzRW1wdHkoKSAmJiAodW5zaWduZWQpZGF0YSA+ICh1bnNpZ25lZCltX2J1ZmZlci5k
YXRhKCkgJiYgKHVuc2lnbmVkKWRhdGEgPD0gKHVuc2lnbmVkKW1fYnVmZmVyLmRhdGEoKSArIG1f
YnVmZmVyLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fb3B0aW1pemVkQnVm
ZmVyKQorICAgICAgICBtX29wdGltaXplZEJ1ZmZlci0+cmVsZWFzZURhdGEoZGF0YSk7Cit9CisK
K3ZvaWQgU2hhcmVkQnVmZmVyOjphcHBlbmQoY29uc3QgY2hhciogZGF0YSwgaW50IGxlbikKK3sK
KyAgICBpZiAobV9sb2NrZWQgfHwgbGVuIDw9IDApCisgICAgICAgIHJldHVybjsKKworICAgIGlm
ICghbV9vcHRpbWl6ZWRCdWZmZXIgJiYgT3B0aW1pemVkQnVmZmVyOjppc0NyZWF0b3JJbnN0YWxs
ZWQoKSkKKyAgICAgICAgbV9vcHRpbWl6ZWRCdWZmZXIgPSBPcHRpbWl6ZWRCdWZmZXI6OmNyZWF0
ZUluc3RhbmNlKGxlbiArIG1fc2l6ZSwgMCk7CisKKyAgICBpZiAobV9vcHRpbWl6ZWRCdWZmZXIp
CisgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyLT5hcHBlbmQoZGF0YSwgbGVuKTsKKyAgICBlbHNl
CisgICAgICAgIG1fYnVmZmVyLmFwcGVuZChkYXRhLCBsZW4pOworCisgICAgbV9zaXplICs9IGxl
bjsKK30KKwordm9pZCBTaGFyZWRCdWZmZXI6OmNsZWFyKCkKK3sKKyAgICBpZiAobV9sb2NrZWQp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX29wdGltaXplZEJ1ZmZlcikKKyAgICAgICAg
bV9vcHRpbWl6ZWRCdWZmZXItPmNsZWFyKCk7CisgICAgbV9idWZmZXIuY2xlYXIoKTsKKyAgICBt
X3NpemUgPSAwOworfQorCitQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gU2hhcmVkQnVmZmVyOjpj
b3B5KCkgY29uc3QKK3sKKyAgICBTaGFyZWRCdWZmZXIqIHJ0biA9IG5ldyBTaGFyZWRCdWZmZXIo
KTsKKworICAgIHJ0bi0+bV9zaXplID0gbV9zaXplOworICAgIHJ0bi0+bV9idWZmZXIuYXBwZW5k
KG1fYnVmZmVyLmRhdGEoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICBpZiAobV9zaXplID4gbV9i
dWZmZXIuc2l6ZSgpKSB7CisgICAgICAgIEFTU0VSVChtX29wdGltaXplZEJ1ZmZlcik7CisgICAg
ICAgIHJ0bi0+bV9vcHRpbWl6ZWRCdWZmZXIgPSBtX29wdGltaXplZEJ1ZmZlci0+Y2xvbmUoKTsK
KyAgICAgICAgaWYgKCFydG4tPm1fb3B0aW1pemVkQnVmZmVyKSB7CisgICAgICAgICAgICBzaXpl
X3QgYnVmU2l6ZSA9IHJ0bi0+bV9idWZmZXIuc2l6ZSgpOworICAgICAgICAgICAgcnRuLT5tX2J1
ZmZlci5yZXNpemUoYnVmU2l6ZSArIG1fb3B0aW1pemVkQnVmZmVyLT5zaXplKCkpOworICAgICAg
ICAgICAgbV9vcHRpbWl6ZWRCdWZmZXItPmV4dHJhY3REYXRhKHJ0bi0+bV9idWZmZXIuZGF0YSgp
ICsgYnVmU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ0bjsKK30KKworY2xh
c3MgRmlsZURlc2NyaXB0b3JIb2xkZXIgeworcHVibGljOgorICAgIEZpbGVEZXNjcmlwdG9ySG9s
ZGVyKEZJTEUqIGZkKSA6IG1fZmQoZmQpIHt9CisgICAgfkZpbGVEZXNjcmlwdG9ySG9sZGVyKCkg
eyBmY2xvc2UobV9mZCk7IH0KK3ByaXZhdGU6CisgICAgRklMRSogbV9mZDsKK307CisKK1Bhc3NS
ZWZQdHI8U2hhcmVkQnVmZmVyPiBTaGFyZWRCdWZmZXI6OmNyZWF0ZVdpdGhDb250ZW50c09mRmls
ZShjb25zdCBTdHJpbmcmIGZpbGVQYXRoKQoreworICAgIFN0cmluZyBudWxsaWZpZWRQYXRoID0g
ZmlsZVBhdGg7CisgICAgRklMRSogZmlsZURlc2NyaXB0b3IgPSBfd2ZvcGVuKG51bGxpZmllZFBh
dGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgVEVYVCgicitiIikpOworICAgIGlm
ICghZmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJldHVybiAwOworCisgICAgRmlsZURlc2NyaXB0
b3JIb2xkZXIgaG9sZEZkKGZpbGVEZXNjcmlwdG9yKTsKKworICAgIGlmICghZnNlZWsoZmlsZURl
c2NyaXB0b3IsIC0xLCBTRUVLX0VORCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgRFdPUkQg
ZmlsZVNpemUgPSBmdGVsbChmaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKDB4RkZGRkZGRkYgPT0g
ZmlsZVNpemUrKykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVy
PiByZXN1bHQ7CisgICAgeworICAgICAgICBNZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWls
OworICAgICAgICByZXN1bHQgPSBuZXcgU2hhcmVkQnVmZmVyKCk7CisgICAgICAgIGlmICghcmVz
dWx0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKytmaWxlU2l6ZTsKKwor
ICAgIGlmIChmaWxlU2l6ZSkgeworICAgICAgICBmc2VlayhmaWxlRGVzY3JpcHRvciwgMCwgU0VF
S19TRVQpOworCisgICAgICAgIGlmICghcmVzdWx0LT5tX29wdGltaXplZEJ1ZmZlciAmJiBPcHRp
bWl6ZWRCdWZmZXI6OmlzQ3JlYXRvckluc3RhbGxlZCgpKQorICAgICAgICAgICAgcmVzdWx0LT5t
X29wdGltaXplZEJ1ZmZlciA9IE9wdGltaXplZEJ1ZmZlcjo6Y3JlYXRlSW5zdGFuY2UoZmlsZVNp
emUsIDApOworCisgICAgICAgIGlmIChyZXN1bHQtPm1fb3B0aW1pemVkQnVmZmVyKSB7CisgICAg
ICAgICAgICBNZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworICAgICAgICAgICAgZG8g
eworICAgICAgICAgICAgICAgIGNoYXIqIGRhdGE7CisgICAgICAgICAgICAgICAgdW5zaWduZWQg
dG9SZWFkID0gcmVzdWx0LT5tX29wdGltaXplZEJ1ZmZlci0+YWxsb2NhdGVEYXRhVG9Xcml0ZSgm
ZGF0YSwgZmlsZVNpemUpOworICAgICAgICAgICAgICAgIGlmICghdG9SZWFkKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBhY3R1YWxSZWFk
ID0gZnJlYWQoZGF0YSwgMSwgdG9SZWFkLCBmaWxlRGVzY3JpcHRvcik7CisgICAgICAgICAgICAg
ICAgcmVzdWx0LT5tX29wdGltaXplZEJ1ZmZlci0+cmVsZWFzZURhdGEoZGF0YSk7CisgICAgICAg
ICAgICAgICAgaWYgKGFjdHVhbFJlYWQgIT0gdG9SZWFkKQorICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBmaWxlU2l6ZSAtPSB0b1JlYWQ7CisgICAgICAgICAg
ICAgICAgcmVzdWx0LT5tX3NpemUgKz0gdG9SZWFkOworICAgICAgICAgICAgfSB3aGlsZSAoZmls
ZVNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWVtb3J5QWxsb2NhdGlvbkNh
bkZhaWwgY2FuRmFpbDsKKyAgICAgICAgICAgIHJlc3VsdC0+bV9idWZmZXIucmVzaXplKGZpbGVT
aXplKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQtPm1fYnVmZmVyLnNpemUoKSAhPSBmaWxlU2l6
ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAgaWYgKGZyZWFkKHJl
c3VsdC0+bV9idWZmZXIuZGF0YSgpLCAxLCBmaWxlU2l6ZSwgZmlsZURlc2NyaXB0b3IpICE9IGZp
bGVTaXplKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisg
ICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7Cit9CisKK2NvbnN0IFZlY3RvcjxjaGFyPiYgU2hh
cmVkQnVmZmVyOjpidWZmZXIoKQoreworICAgIGlmIChtX29wdGltaXplZEJ1ZmZlciAmJiAhbV9v
cHRpbWl6ZWRCdWZmZXItPmlzRW1wdHkoKSkgeworICAgICAgICBzaXplX3QgYnVmU2l6ZSA9IG1f
YnVmZmVyLnNpemUoKTsKKyAgICAgICAgbV9idWZmZXIucmVzaXplKGJ1ZlNpemUgKyBtX29wdGlt
aXplZEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgbV9vcHRpbWl6ZWRCdWZmZXItPmV4dHJhY3RE
YXRhKG1fYnVmZmVyLmRhdGEoKSArIGJ1ZlNpemUpOworICAgICAgICBtX29wdGltaXplZEJ1ZmZl
ci0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIG1fYnVmZmVyOworfQorCitjb25zdCBjaGFy
KiBTaGFyZWRCdWZmZXI6OmRhdGEoKSBjb25zdAoreworICAgIHJldHVybiBjb25zdF9jYXN0PFNo
YXJlZEJ1ZmZlcio+KHRoaXMpLT5idWZmZXIoKS5kYXRhKCk7Cit9CisKKworUGFzc1JlZlB0cjxT
aGFyZWRCdWZmZXI+IFNoYXJlZEJ1ZmZlcjo6YWRvcHRWZWN0b3IoVmVjdG9yPGNoYXI+JiB2ZWN0
b3IpCit7CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlKCk7CisgICAg
YnVmZmVyLT5tX2J1ZmZlci5zd2FwKHZlY3Rvcik7CisgICAgYnVmZmVyLT5tX3NpemUgPSBidWZm
ZXItPm1fYnVmZmVyLnNpemUoKTsKKyAgICByZXR1cm4gYnVmZmVyOworfQorCitib29sIFNoYXJl
ZEJ1ZmZlcjo6bWFrZVB1cmdlYWJsZSgpCit7CisgICAgaWYgKG1fb3B0aW1pemVkQnVmZmVyICYm
IG1fb3B0aW1pemVkQnVmZmVyLT5pc1B1cmdlYWJsZSgpKSB7CisgICAgICAgIGlmICghbV9idWZm
ZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtX29wdGltaXplZEJ1ZmZlci0+cHJlcGVuZCht
X2J1ZmZlci5kYXRhKCksIG1fYnVmZmVyLnNpemUoKSk7CisgICAgICAgICAgICBtX2J1ZmZlci5j
bGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlm
IChPcHRpbWl6ZWRCdWZmZXI6OmlzQ3JlYXRvckluc3RhbGxlZCgpKSB7CisgICAgICAgIGlmIChP
cHRpbWl6ZWRCdWZmZXIqIG9wdGltaXplZEJ1ZmZlciA9IE9wdGltaXplZEJ1ZmZlcjo6Y3JlYXRl
SW5zdGFuY2UobV9zaXplLCBtX29wdGltaXplZEJ1ZmZlciwgdHJ1ZSkpIHsKKyAgICAgICAgICAg
IG1fb3B0aW1pemVkQnVmZmVyID0gb3B0aW1pemVkQnVmZmVyOworICAgICAgICAgICAgaWYgKCFt
X2J1ZmZlci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtX29wdGltaXplZEJ1ZmZlci0+
cHJlcGVuZChtX2J1ZmZlci5kYXRhKCksIG1fYnVmZmVyLnNpemUoKSk7CisgICAgICAgICAgICAg
ICAgbV9idWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfQorCisjZW5k
aWYgLy8gUExBVEZPUk0oVE9SQ0hNT0JJTEUpICYmIFBMQVRGT1JNKFdJTkNFKQpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRUaW1lcldpbmNlLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvU2hhcmVkVGltZXJXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uY2EyZjEwNAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvU2hhcmVkVGltZXJXaW5jZS5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJlZFRpbWVyLmgiCisKKyNpbmNs
dWRlICJQYWdlLmgiCisjaW5jbHVkZSAiU3lzdGVtVGltZS5oIgorI2luY2x1ZGUgIldpZGdldC5o
IgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1l
Lmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgSlNDIHsKK2V4dGVybiB2b2lk
KiBnX3N0YWNrQmFzZTsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitlbnVtIHsKKyAgICBU
aW1lcklkTm9uZSA9IDAsCisgICAgVGltZXJJZEF1dG8sCisgICAgVGltZXJJZE1hbnVhbCwKK307
CitzdGF0aWMgVUlOVCB0aW1lcklEID0gVGltZXJJZE5vbmU7CisKK3N0YXRpYyB2b2lkICgqc2hh
cmVkVGltZXJGaXJlZEZ1bmN0aW9uKSgpOworCitzdGF0aWMgSFdORCB0aW1lcldpbmRvd0hhbmRs
ZSA9IDA7Citjb25zdCBMUENXU1RSIGtUaW1lcldpbmRvd0NsYXNzTmFtZSA9IEwiVGltZXJXaW5k
b3dDbGFzcyI7CisKK0xSRVNVTFQgQ0FMTEJBQ0sgVGltZXJXaW5kb3dXbmRQcm9jKEhXTkQgaFdu
ZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIGlu
dCBkdW1teTsKKyAgICBKU0M6Omdfc3RhY2tCYXNlID0gJmR1bW15OworCisgICAgaWYgKG1lc3Nh
Z2UgPT0gV01fVElNRVIpIHsKKyAgICAgICAgaWYgKHRpbWVySUQgIT0gVGltZXJJZE5vbmUpCisg
ICAgICAgICAgICBzaGFyZWRUaW1lckZpcmVkRnVuY3Rpb24oKTsKKyAgICB9IGVsc2UgaWYgKG1l
c3NhZ2UgPT0gV01fVVNFUikgICAgeworICAgICAgICBpZiAodGltZXJJRCA9IFRpbWVySWRNYW51
YWwpIHsKKyAgICAgICAgICAgIHNoYXJlZFRpbWVyRmlyZWRGdW5jdGlvbigpOworICAgICAgICAg
ICAgUG9zdE1lc3NhZ2UoaFduZCwgV01fVVNFUiwgMCwgMCk7CisgICAgICAgIH0KKyAgICB9IGVs
c2UgeworICAgICAgICBKU0M6Omdfc3RhY2tCYXNlID0gMDsKKyAgICAgICAgcmV0dXJuIERlZldp
bmRvd1Byb2MoaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKyAgICBKU0M6
Omdfc3RhY2tCYXNlID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdGlh
bGl6ZU9mZlNjcmVlblRpbWVyV2luZG93KCkKK3sKKyAgICBpZiAodGltZXJXaW5kb3dIYW5kbGUp
CisgICAgICAgIHJldHVybjsKKworICAgIFdORENMQVNTIHdjZXggPSB7MH07CisgICAgd2NleC5s
cGZuV25kUHJvYyAgICA9IFRpbWVyV2luZG93V25kUHJvYzsKKyAgICB3Y2V4LmhJbnN0YW5jZSAg
ICAgID0gUGFnZTo6aW5zdGFuY2VIYW5kbGUoKTsKKyAgICB3Y2V4Lmxwc3pDbGFzc05hbWUgID0g
a1RpbWVyV2luZG93Q2xhc3NOYW1lOworICAgIFJlZ2lzdGVyQ2xhc3MoJndjZXgpOworCisgICAg
dGltZXJXaW5kb3dIYW5kbGUgPSBDcmVhdGVXaW5kb3coa1RpbWVyV2luZG93Q2xhc3NOYW1lLCAw
LCAwLAorICAgICAgIENXX1VTRURFRkFVTFQsIDAsIENXX1VTRURFRkFVTFQsIDAsIEhXTkRfTUVT
U0FHRSwgMCwgUGFnZTo6aW5zdGFuY2VIYW5kbGUoKSwgMCk7Cit9CisKK3ZvaWQgc2V0U2hhcmVk
VGltZXJGaXJlZEZ1bmN0aW9uKHZvaWQgKCpmKSgpKQoreworICAgIHNoYXJlZFRpbWVyRmlyZWRG
dW5jdGlvbiA9IGY7Cit9CisKKyNkZWZpbmUgVVNFUl9USU1FUl9NQVhJTVVNICAweDdGRkZGRkZG
CisjZGVmaW5lIFVTRVJfVElNRVJfTUlOSU1VTSAgMHgwMDAwMDAwQQorCit2b2lkIHNldFNoYXJl
ZFRpbWVyRmlyZVRpbWUoZG91YmxlIGZpcmVUaW1lKQoreworICAgIEFTU0VSVChzaGFyZWRUaW1l
ckZpcmVkRnVuY3Rpb24pOworCisgICAgZG91YmxlIGludGVydmFsID0gKGZpcmVUaW1lIC0gY3Vy
cmVudFRpbWUoKSkgKiAxMDAwLjsKKyAgICB1bnNpZ25lZCBpbnRlcnZhbEluTVMgPSBpbnRlcnZh
bCA8IFVTRVJfVElNRVJfTUlOSU1VTQorICAgICAgICA/IFVTRVJfVElNRVJfTUlOSU1VTQorICAg
ICAgICA6IGludGVydmFsID4gVVNFUl9USU1FUl9NQVhJTVVNCisgICAgICAgID8gVVNFUl9USU1F
Ul9NQVhJTVVNCisgICAgICAgIDogc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGludGVydmFsKTsKKwor
ICAgIGlmICh0aW1lcklEID09IFRpbWVySWRBdXRvKSB7CisgICAgICAgIEtpbGxUaW1lcih0aW1l
cldpbmRvd0hhbmRsZSwgVGltZXJJZEF1dG8pOworICAgICAgICB0aW1lcklEID0gVGltZXJJZE5v
bmU7CisgICAgfQorCisgICAgaW5pdGlhbGl6ZU9mZlNjcmVlblRpbWVyV2luZG93KCk7CisgICAg
aWYgKFNldFRpbWVyKHRpbWVyV2luZG93SGFuZGxlLCBUaW1lcklkQXV0bywgaW50ZXJ2YWxJbk1T
LCAwKSkKKyAgICAgICAgdGltZXJJRCA9IFRpbWVySWRBdXRvOworICAgIGVsc2UgaWYgKHRpbWVy
SUQgIT0gVGltZXJJZE1hbnVhbCkKKyAgICAgICAgUG9zdE1lc3NhZ2UodGltZXJXaW5kb3dIYW5k
bGUsIFdNX1VTRVIsIDAsIDApOworfQorCit2b2lkIHN0b3BTaGFyZWRUaW1lcigpCit7CisgICAg
aWYgKHRpbWVySUQgPT0gVGltZXJJZEF1dG8pCisgICAgICAgIEtpbGxUaW1lcih0aW1lcldpbmRv
d0hhbmRsZSwgVGltZXJJZEF1dG8pOworCisgICAgdGltZXJJRCA9IFRpbWVySWROb25lOworfQor
Cit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1N5c3RlbVRpbWVXaW5jZS5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1N5c3RlbVRpbWVXaW5jZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiNzA1YgotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvU3lzdGVtVGltZVdpbmNlLmNwcApAQCAtMCwwICsxLDM5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJ
bmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIK
KworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitmbG9hdCB1
c2VySWRsZVRpbWUoKQoreworICAgIHJldHVybiBGTFRfTUFYOworfQorCit9CmRpZmYgLS1naXQg
YS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1dpZGdldFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvV2lkZ2V0V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLjY2MDY5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1dp
ZGdldFdpbmNlLmNwcApAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
NiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChD
KSAyMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisj
aW5jbHVkZSAiV2lkZ2V0LmgiCisKKyNpbmNsdWRlICJDdXJzb3IuaCIKKyNpbmNsdWRlICJEb2N1
bWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNp
bmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJIb3N0V2luZG93LmgiCisjaW5j
bHVkZSAiSW50UmVjdC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBXaWRnZXQ6OmluaXQoUGxhdGZvcm1XaWRn
ZXQgd2lkZ2V0KQoreworICAgIG1fcGFyZW50ID0gMDsKKyAgICBtX3NlbGZWaXNpYmxlID0gZmFs
c2U7CisgICAgbV9wYXJlbnRWaXNpYmxlID0gZmFsc2U7CisgICAgbV93aWRnZXQgPSB3aWRnZXQ7
CisgICAgaWYgKG1fd2lkZ2V0KQorICAgICAgICByZXRhaW5QbGF0Zm9ybVdpZGdldCgpOworfQor
Cit2b2lkIFdpZGdldDo6c2V0UGFyZW50KFNjcm9sbFZpZXcqIHZpZXcpCit7CisgICAgQVNTRVJU
KCF2aWV3IHx8ICFtX3BhcmVudCk7CisgICAgaWYgKCF2aWV3IHx8ICF2aWV3LT5pc1Zpc2libGUo
KSkKKyAgICAgICAgc2V0UGFyZW50VmlzaWJsZShmYWxzZSk7CisgICAgbV9wYXJlbnQgPSB2aWV3
OworICAgIGlmICh2aWV3ICYmIHZpZXctPmlzVmlzaWJsZSgpKQorICAgICAgICBzZXRQYXJlbnRW
aXNpYmxlKHRydWUpOworfQorCitTY3JvbGxWaWV3KiBXaWRnZXQ6OnJvb3QoKSBjb25zdAorewor
ICAgIGNvbnN0IFdpZGdldCogdG9wID0gdGhpczsKKyAgICB3aGlsZSAodG9wLT5wYXJlbnQoKSkK
KyAgICAgICAgdG9wID0gdG9wLT5wYXJlbnQoKTsKKyAgICBpZiAodG9wLT5pc0ZyYW1lVmlldygp
KQorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxTY3JvbGxWaWV3Kj4oc3RhdGljX2Nhc3Q8Y29u
c3QgU2Nyb2xsVmlldyo+KHRvcCkpOworICAgIHJldHVybiAwOworfQorCit2b2lkIFdpZGdldDo6
cmVtb3ZlRnJvbVBhcmVudCgpCit7CisgICAgaWYgKHBhcmVudCgpKQorICAgICAgICBwYXJlbnQo
KS0+cmVtb3ZlQ2hpbGQodGhpcyk7Cit9CisKKwordm9pZCBXaWRnZXQ6OnBhaW50KEdyYXBoaWNz
Q29udGV4dCosIGNvbnN0IEludFJlY3QmKQoreworfQorCit2b2lkIFdpZGdldDo6c2V0Rm9jdXMo
KQoreworfQorCit2b2lkIFdpZGdldDo6c2V0SXNTZWxlY3RlZChib29sKQoreworfQorCitJbnRS
ZWN0IFdpZGdldDo6ZnJhbWVSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZTsKK30K
Kwordm9pZCBXaWRnZXQ6OnNldEZyYW1lUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAg
IG1fZnJhbWUgPSByZWN0OworfQorCitXaWRnZXQ6OldpZGdldChQbGF0Zm9ybVdpZGdldCB3aWRn
ZXQpCit7CisgICAgaW5pdCh3aWRnZXQpOworfQorCit2b2lkIFdpZGdldDo6cmVsZWFzZVBsYXRm
b3JtV2lkZ2V0KCkKK3sKK30KKwordm9pZCBXaWRnZXQ6OnJldGFpblBsYXRmb3JtV2lkZ2V0KCkK
K3sKK30KKworV2lkZ2V0Ojp+V2lkZ2V0KCkKK3sKKyAgICBBU1NFUlQoIXBhcmVudCgpKTsKK30K
Kwordm9pZCBXaWRnZXQ6OnNob3coKQoreworfQorCit2b2lkIFdpZGdldDo6aGlkZSgpCit7Cit9
CisKK3ZvaWQgV2lkZ2V0OjpzZXRDdXJzb3IoY29uc3QgQ3Vyc29yJiBjdXJzb3IpCit7CisgICAg
U2Nyb2xsVmlldyogdmlldyA9IHJvb3QoKTsKKyAgICBpZiAodmlldyAmJiB2aWV3LT5pc0ZyYW1l
VmlldygpKSB7CisgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBzdGF0aWNfY2FzdDxGcmFtZVZp
ZXcqPih2aWV3KS0+ZnJhbWUoKSkgeworICAgICAgICAgICAgaWYgKFBhZ2UqIHBhZ2UgPSBmcmFt
ZS0+cGFnZSgpKQorICAgICAgICAgICAgICAgIHBhZ2UtPmNocm9tZSgpLT5zZXRDdXJzb3IoY3Vy
c29yLmltcGwoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0ludFBvaW50IFdpZGdldDo6Y29u
dmVydFRvQ29udGFpbmluZ1dpbmRvdyhjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7Cisg
ICAgLy8gY2FsbGVkIGJ5IFNjcm9sbFZpZXcgb3IgUGxhdGZvcm1TY3JvbGxCYXIuCisgICAgaWYg
KGlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgY29uc3QgU2Nyb2xsVmlldyogdmlldyA9IHN0YXRp
Y19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAgICAgICByZXR1cm4gdmlldy0+Y29u
dGVudHNUb1dpbmRvdyhwb2ludCArIHZpZXctPnNjcm9sbE9mZnNldCgpKTsKKyAgICB9IGVsc2Ug
aWYgKHBhcmVudCgpKQorICAgICAgICByZXR1cm4gcGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3co
cG9pbnQgKyBJbnRTaXplKHgoKSwgeSgpKSArIHBhcmVudCgpLT5zY3JvbGxPZmZzZXQoKSk7CisK
KyAgICByZXR1cm4gcG9pbnQ7Cit9CisKK0ludFJlY3QgV2lkZ2V0Ojpjb252ZXJ0VG9Db250YWlu
aW5nV2luZG93KGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgLy8gY2FsbGVkIGJ5
IFNjcm9sbFZpZXcgb3IgUGxhdGZvcm1TY3JvbGxCYXIuCisgICAgaWYgKGlzRnJhbWVWaWV3KCkp
IHsKKyAgICAgICAgY29uc3QgU2Nyb2xsVmlldyogdmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZy
YW1lVmlldyo+KHRoaXMpOworICAgICAgICByZXR1cm4gdmlldy0+Y29udGVudHNUb1dpbmRvdyhJ
bnRSZWN0KHJlY3QubG9jYXRpb24oKSArIHZpZXctPnNjcm9sbE9mZnNldCgpLCByZWN0LnNpemUo
KSkpOworICAgIH0gZWxzZSBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgSW50UG9pbnQgY29udGVu
dHNQb2ludCA9IHJlY3QubG9jYXRpb24oKSArIEludFNpemUoeCgpLCB5KCkpOworICAgICAgICBy
ZXR1cm4gcGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3coSW50UmVjdChpc1ZpZXdTY3JvbGxiYXIo
KSA/IGNvbnRlbnRzUG9pbnQgKyBwYXJlbnQoKS0+c2Nyb2xsT2Zmc2V0KCkgOiBjb250ZW50c1Bv
aW50CisgICAgICAgICAgICAsIHJlY3Quc2l6ZSgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJl
Y3Q7Cit9CisKK0ludFBvaW50IFdpZGdldDo6Y29udmVydEZyb21Db250YWluaW5nV2luZG93KGNv
bnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICAgLy8gY2FsbGVkIGJ5IFNjcm9sbFZp
ZXcgb3IgUGxhdGZvcm1TY3JvbGxCYXIuCisgICAgaWYgKGlzRnJhbWVWaWV3KCkpIHsKKyAgICAg
ICAgY29uc3QgU2Nyb2xsVmlldyogdmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+
KHRoaXMpOworICAgICAgICByZXR1cm4gdmlldy0+d2luZG93VG9Db250ZW50cyhwb2ludCkgLSB2
aWV3LT5zY3JvbGxPZmZzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHBhcmVudCgpKSB7CisgICAgICAg
IEludFBvaW50IHJ0biA9IHBhcmVudCgpLT53aW5kb3dUb0NvbnRlbnRzKHBvaW50KSAtIEludFNp
emUoeCgpLCB5KCkpOworICAgICAgICByZXR1cm4gaXNWaWV3U2Nyb2xsYmFyKCkgPyBydG4gLSBw
YXJlbnQoKS0+c2Nyb2xsT2Zmc2V0KCkgOiBydG47CisgICAgfQorCisgICAgcmV0dXJuIHBvaW50
OworfQorCitJbnRSZWN0IFdpZGdldDo6Y29udmVydEZyb21Db250YWluaW5nV2luZG93KGNvbnN0
IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgIC8vIGNhbGxlZCBieSBTY3JvbGxWaWV3IG9y
IFBsYXRmb3JtU2Nyb2xsQmFyLgorICAgIGlmIChpc0ZyYW1lVmlldygpKSB7CisgICAgICAgIGNv
bnN0IFNjcm9sbFZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlz
KTsKKyAgICAgICAgSW50UmVjdCBydG4gPSB2aWV3LT53aW5kb3dUb0NvbnRlbnRzKHJlY3QpOwor
ICAgICAgICBydG4ubW92ZSgtdmlldy0+c2Nyb2xsT2Zmc2V0KCkpOworICAgICAgICByZXR1cm4g
cnRuOworICAgIH0gZWxzZSBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgSW50UmVjdCBydG4gPSBw
YXJlbnQoKS0+d2luZG93VG9Db250ZW50cyhyZWN0KTsKKyAgICAgICAgcnRuLm1vdmUoSW50U2l6
ZSgteCgpLCAteSgpKSk7CisgICAgICAgIGlmIChpc1ZpZXdTY3JvbGxiYXIoKSkKKyAgICAgICAg
ICAgIHJ0bi5tb3ZlKC1wYXJlbnQoKS0+c2Nyb2xsT2Zmc2V0KCkpOworCisgICAgICAgIHJldHVy
biBydG47CisgICAgfQorCisgICAgcmV0dXJuIHJlY3Q7Cit9CisKKworSW50UG9pbnQgV2lkZ2V0
Ojpjb252ZXJ0Q2hpbGRUb1NlbGYoY29uc3QgV2lkZ2V0KiBjaGlsZCwgY29uc3QgSW50UG9pbnQm
IHBvaW50KSBjb25zdAoreworICAgIHJldHVybiBJbnRQb2ludChwb2ludC54KCkgKyBjaGlsZC0+
eCgpLCBwb2ludC55KCkgKyBjaGlsZC0+eSgpKTsKK30KKworSW50UG9pbnQgV2lkZ2V0Ojpjb252
ZXJ0U2VsZlRvQ2hpbGQoY29uc3QgV2lkZ2V0KiBjaGlsZCwgY29uc3QgSW50UG9pbnQmIHBvaW50
KSBjb25zdAoreworICAgIHJldHVybiBJbnRQb2ludChwb2ludC54KCkgLSBjaGlsZC0+eCgpLCBw
b2ludC55KCkgLSBjaGlsZC0+eSgpKTsKK30KKwordm9pZCBXaWRnZXQ6OmludmFsaWRhdGVSZWN0
KGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgU2Nyb2xsVmlldyogb3V0ZXJtb3N0VmlldyA9IHBh
cmVudCgpOworICAgIGlmIChvdXRlcm1vc3RWaWV3KSB7CisgICAgICAgIHdoaWxlIChvdXRlcm1v
c3RWaWV3LT5wYXJlbnQoKSkKKyAgICAgICAgICAgIG91dGVybW9zdFZpZXcgPSBvdXRlcm1vc3RW
aWV3LT5wYXJlbnQoKTsKKyAgICB9IGVsc2UgaWYgKGlzRnJhbWVWaWV3KCkpCisgICAgICAgIG91
dGVybW9zdFZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKTsKKyAgICBlbHNlCisg
ICAgICAgIHJldHVybjsKKworICAgIGlmICghb3V0ZXJtb3N0Vmlldy0+aXNWaXNpYmxlKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcmVjdCA9IGNvbnZlcnRUb0NvbnRhaW5pbmdX
aW5kb3cocik7CisgICAgb3V0ZXJtb3N0Vmlldy0+aG9zdFdpbmRvdygpLT5yZXBhaW50KHN0YXRp
Y19jYXN0PEZyYW1lVmlldyo+KG91dGVybW9zdFZpZXcpLT5mcmFtZSgpLCByZWN0LCBzaG91bGRV
cGRhdGVCYWNraW5nU3RvcmUoKSwgaXNTY3JvbGxiYXIoKSk7Cit9CisKK0ludFJlY3QgV2lkZ2V0
Ojpjb252ZXJ0VG9Db250YWluaW5nVmlldyhjb25zdCBJbnRSZWN0JiBsb2NhbFJlY3QpIGNvbnN0
Cit7CisgICAgaWYgKGNvbnN0IFNjcm9sbFZpZXcqIHBhcmVudFNjcm9sbFZpZXcgPSBwYXJlbnQo
KSkgeworICAgICAgICBJbnRSZWN0IHBhcmVudFJlY3QobG9jYWxSZWN0KTsKKyAgICAgICAgcGFy
ZW50UmVjdC5zZXRMb2NhdGlvbihwYXJlbnRTY3JvbGxWaWV3LT5jb252ZXJ0Q2hpbGRUb1NlbGYo
dGhpcywgbG9jYWxSZWN0LmxvY2F0aW9uKCkpKTsKKyAgICAgICAgcmV0dXJuIHBhcmVudFJlY3Q7
CisgICAgfQorICAgIHJldHVybiBsb2NhbFJlY3Q7Cit9CisKK0ludFJlY3QgV2lkZ2V0Ojpjb252
ZXJ0RnJvbUNvbnRhaW5pbmdWaWV3KGNvbnN0IEludFJlY3QmIHBhcmVudFJlY3QpIGNvbnN0Cit7
CisgICAgaWYgKGNvbnN0IFNjcm9sbFZpZXcqIHBhcmVudFNjcm9sbFZpZXcgPSBwYXJlbnQoKSkg
eworICAgICAgICBJbnRSZWN0IGxvY2FsUmVjdCA9IHBhcmVudFJlY3Q7CisgICAgICAgIGxvY2Fs
UmVjdC5zZXRMb2NhdGlvbihwYXJlbnRTY3JvbGxWaWV3LT5jb252ZXJ0U2VsZlRvQ2hpbGQodGhp
cywgbG9jYWxSZWN0LmxvY2F0aW9uKCkpKTsKKyAgICAgICAgcmV0dXJuIGxvY2FsUmVjdDsKKyAg
ICB9CisKKyAgICByZXR1cm4gcGFyZW50UmVjdDsKK30KKworSW50UG9pbnQgV2lkZ2V0Ojpjb252
ZXJ0VG9Db250YWluaW5nVmlldyhjb25zdCBJbnRQb2ludCYgbG9jYWxQb2ludCkgY29uc3QKK3sK
KyAgICBpZiAoY29uc3QgU2Nyb2xsVmlldyogcGFyZW50U2Nyb2xsVmlldyA9IHBhcmVudCgpKQor
ICAgICAgICByZXR1cm4gcGFyZW50U2Nyb2xsVmlldy0+Y29udmVydENoaWxkVG9TZWxmKHRoaXMs
IGxvY2FsUG9pbnQpOworCisgICAgcmV0dXJuIGxvY2FsUG9pbnQ7Cit9CisKK0ludFBvaW50IFdp
ZGdldDo6Y29udmVydEZyb21Db250YWluaW5nVmlldyhjb25zdCBJbnRQb2ludCYgcGFyZW50UG9p
bnQpIGNvbnN0Cit7CisgICAgaWYgKGNvbnN0IFNjcm9sbFZpZXcqIHBhcmVudFNjcm9sbFZpZXcg
PSBwYXJlbnQoKSkKKyAgICAgICAgcmV0dXJuIHBhcmVudFNjcm9sbFZpZXctPmNvbnZlcnRTZWxm
VG9DaGlsZCh0aGlzLCBwYXJlbnRQb2ludCk7CisKKyAgICByZXR1cm4gcGFyZW50UG9pbnQ7Cit9
Cit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="17572"
          type_id="1"
          status="-"
          setter="manyoso"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33281</attachid>
            <date>2009-07-22 12:43:38 -0700</date>
            <delta_ts>2009-07-30 13:29:24 -0700</delta_ts>
            <desc>part 1 (not including ScrollView Widget and ScrollBar files)</desc>
            <filename>27543_1.patch</filename>
            <type>text/plain</type>
            <size>97383</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZmFhOWY5Yy4uZDRmYTZlYiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MSBAQAorMjAwOS0wNy0yMiAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NzU0MworICAgICAgICBBZGQgc29tZSBXaW5DRSBwb3J0IGZpbGVzIHRvIHBsYXRmb3JtL3dpbmNl
CisKKyAgICAgICAgV3JpdHRlbiBieSBZb25nIExpIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4s
IEx5b24gQ2hlbiA8bHlvbi5jaGVuQHRvcmNobW9iaWxlLmNvbT4KKyAgICAgICAgYW5kIEpvZSBN
YXNvbiA8am9lLm1hc29uQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93
aW5jZS9DbGlwYm9hcmRXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9D
b250ZXh0TWVudUl0ZW1XaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNl
L0NvbnRleHRNZW51V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9D
dXJzb3JXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0RyYWdEYXRh
V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5j
ZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5jZS5jcHA6IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHA6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS93aW5jZS9QbGF0Zm9ybVNjcm9sbGJhci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93
aW5jZS9TY3JvbGxWaWV3V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5j
ZS9TY3JvbGxiYXJUaGVtZVdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2lu
Y2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5j
ZS9TZWFyY2hQb3B1cE1lbnVXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL1NoYXJlZEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1No
YXJlZFRpbWVyV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TeXN0
ZW1UaW1lV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9XaWRnZXRX
aW5jZS5jcHA6IEFkZGVkLgorCiAyMDA5LTA3LTIyICBNaWtoYWlsIE5hZ2Fub3YgIDxtbmFnYW5v
dkBjaHJvbWl1bS5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgVGltb3RoeSBIYXRjaGVyLgpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5j
ZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2MxMmIxCi0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5jZS5j
cHAKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBw
bGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5
IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiQ2xpcGJvYXJkVXRpbGl0aWVzV2luLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5j
bHVkZSAiRG9jdW1lbnRGcmFnbWVudC5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQ
bGF0Zm9ybVN0cmluZy5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1ZGUgIm1h
cmt1cC5oIgorI2luY2x1ZGUgPHNobHdhcGkuaD4KKyNpbmNsdWRlIDx3aW5pbmV0Lmg+ICAgIC8v
IGZvciBJTlRFUk5FVF9NQVhfVVJMX0xFTkdUSAorCit0eXBlZGVmIEhBTkRMRSBIRFJPUDsKKwor
bmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgYm9vbCBnZXRXZWJMb2NEYXRhKElEYXRhT2Jq
ZWN0KiBkYXRhT2JqZWN0LCBTdHJpbmcmIHVybCwgU3RyaW5nKiB0aXRsZSkKK3sKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBTdHJpbmcgZXh0cmFjdFVSTChjb25zdCBTdHJpbmcgJmlu
VVJMLCBTdHJpbmcqIHRpdGxlKQoreworICAgIFN0cmluZyB1cmwgPSBpblVSTDsKKyAgICBpbnQg
c3BsaXRMb2MgPSB1cmwuZmluZCgnXG4nKTsKKyAgICBpZiAoc3BsaXRMb2MgPiAwKSB7CisgICAg
ICAgIGlmICh0aXRsZSkKKyAgICAgICAgICAgICp0aXRsZSA9IHVybC5zdWJzdHJpbmcoc3BsaXRM
b2MgKyAxKTsKKyAgICAgICAgdXJsLnRydW5jYXRlKHNwbGl0TG9jKTsKKyAgICB9IGVsc2UgaWYg
KHRpdGxlKQorICAgICAgICAqdGl0bGUgPSB1cmw7CisgICAgcmV0dXJuIHVybDsKK30KKworLy9G
aXJlZm94IHRleHQvaHRtbAorc3RhdGljIEZPUk1BVEVUQyogdGV4dEh0bWxGb3JtYXQoKQorewor
ICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJ0ZXh0L2h0bWwi
KTsKKyAgICBzdGF0aWMgRk9STUFURVRDIHRleHRIdG1sRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVD
VF9DT05URU5ULCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ0ZXh0SHRtbEZvcm1h
dDsKK30KKworSEdMT0JBTCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IEtVUkwmIHVybCwgY29uc3Qg
U3RyaW5nJiB0aXRsZSkKK3sKKyAgICBTdHJpbmcgbXV0YWJsZVVSTCh1cmwuc3RyaW5nKCkpOwor
ICAgIFN0cmluZyBtdXRhYmxlVGl0bGUodGl0bGUpOworICAgIFNJWkVfVCBzaXplID0gbXV0YWJs
ZVVSTC5sZW5ndGgoKSArIG11dGFibGVUaXRsZS5sZW5ndGgoKSArIDI7ICAvLyArMSBmb3IgIlxu
IiBhbmQgKzEgZm9yIG51bGwgdGVybWluYXRvcgorICAgIEhHTE9CQUwgY2JEYXRhID0gR2xvYmFs
QWxsb2MoR1BUUiwgc2l6ZSAqIHNpemVvZihVQ2hhcikpOworCisgICAgaWYgKGNiRGF0YSkgewor
ICAgICAgICBQV1NUUiBidWZmZXIgPSAoUFdTVFIpR2xvYmFsTG9jayhjYkRhdGEpOworICAgICAg
ICBfc253cHJpbnRmKGJ1ZmZlciwgc2l6ZSwgTCIlc1xuJXMiLCBtdXRhYmxlVVJMLmNoYXJhY3Rl
cnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIG11dGFibGVUaXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxU
ZXJtaW5hdGlvbigpKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgfQorICAg
IHJldHVybiBjYkRhdGE7Cit9CisKK0hHTE9CQUwgY3JlYXRlR2xvYmFsRGF0YShjb25zdCBTdHJp
bmcmIHN0cikKK3sKKyAgICBIR0xPQkFMIGdsb2JhbERhdGEgPSA6Okdsb2JhbEFsbG9jKEdQVFIs
IChzdHIubGVuZ3RoKCkgKyAxKSAqIHNpemVvZihVQ2hhcikpOworICAgIGlmICghZ2xvYmFsRGF0
YSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgVUNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PFVD
aGFyKj4oR2xvYmFsTG9jayhnbG9iYWxEYXRhKSk7CisgICAgbWVtY3B5KGJ1ZmZlciwgc3RyLmNo
YXJhY3RlcnMoKSwgc3RyLmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSk7CisgICAgYnVmZmVyW3N0
ci5sZW5ndGgoKV0gPSAwOworICAgIEdsb2JhbFVubG9jayhnbG9iYWxEYXRhKTsKKyAgICByZXR1
cm4gZ2xvYmFsRGF0YTsKK30KKworSEdMT0JBTCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IFZlY3Rv
cjxjaGFyPiYgdmVjdG9yKQoreworICAgIEhHTE9CQUwgZ2xvYmFsRGF0YSA9IEdsb2JhbEFsbG9j
KEdQVFIsIHZlY3Rvci5zaXplKCkgKyAxKTsKKyAgICBpZiAoIWdsb2JhbERhdGEpCisgICAgICAg
IHJldHVybiAwOworICAgIGNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPihHbG9iYWxM
b2NrKGdsb2JhbERhdGEpKTsKKyAgICBtZW1jcHkoYnVmZmVyLCB2ZWN0b3IuZGF0YSgpLCB2ZWN0
b3Iuc2l6ZSgpKTsKKyAgICBidWZmZXJbdmVjdG9yLnNpemUoKV0gPSAwOworICAgIEdsb2JhbFVu
bG9jayhnbG9iYWxEYXRhKTsKKyAgICByZXR1cm4gZ2xvYmFsRGF0YTsKK30KKworc3RhdGljIHZv
aWQgYXBwZW5kKFZlY3RvcjxjaGFyPiYgdmVjdG9yLCBjb25zdCBjaGFyKiBzdHJpbmcpCit7Cisg
ICAgdmVjdG9yLmFwcGVuZChzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKK30KKworc3RhdGljIHZv
aWQgYXBwZW5kKFZlY3RvcjxjaGFyPiYgdmVjdG9yLCBjb25zdCBDU3RyaW5nJiBzdHJpbmcpCit7
CisgICAgdmVjdG9yLmFwcGVuZChzdHJpbmcuZGF0YSgpLCBzdHJpbmcubGVuZ3RoKCkpOworfQor
CisvLyBEb2N1bWVudGF0aW9uIGZvciB0aGUgQ0ZfSFRNTCBmb3JtYXQgaXMgYXZhaWxhYmxlIGF0
IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vd29ya3Nob3AvbmV0d29ya2luZy9jbGlwYm9hcmQv
aHRtbGNsaXBib2FyZC5hc3AKK3ZvaWQgbWFya3VwVG9DRl9IVE1MKGNvbnN0IFN0cmluZyYgbWFy
a3VwLCBjb25zdCBTdHJpbmcmIHNyY1VSTCwgVmVjdG9yPGNoYXI+JiByZXN1bHQpCit7CisgICAg
aWYgKCFtYXJrdXAubGVuZ3RoKCkpCisgICAgICAgIHJldHVybjsKKworICAgIENTdHJpbmcgY2Zf
aHRtbCA9ICJWZXJzaW9uOjAuOSI7CisgICAgQ1N0cmluZyBzdGFydEhUTUwgPSAiXG5TdGFydEhU
TUw6IjsKKyAgICBDU3RyaW5nIGVuZEhUTUwgPSAiXG5FbmRIVE1MOiI7CisgICAgQ1N0cmluZyBz
dGFydEZyYWdtZW50ID0gIlxuU3RhcnRGcmFnbWVudDoiOworICAgIENTdHJpbmcgZW5kRnJhZ21l
bnQgPSAiXG5FbmRGcmFnbWVudDoiOworICAgIENTdHJpbmcgc291cmNlVVJMID0gIlxuU291cmNl
VVJMOiI7CisKKyAgICBhcHBlbmQocmVzdWx0LCBjZl9odG1sKTsKKworICAgIGJvb2wgc2hvdWxk
RmlsbFNvdXJjZVVSTCA9ICFzcmNVUkwuaXNFbXB0eSgpICYmIChzcmNVUkwgIT0gImFib3V0OmJs
YW5rIik7CisKKyAgICBDU3RyaW5nIHN0YXJ0TWFya3VwID0gIlxuPEhUTUw+XG48Qk9EWT5cbjwh
LS1TdGFydEZyYWdtZW50LS0+XG4iOworICAgIENTdHJpbmcgZW5kTWFya3VwID0gIlxuPCEtLUVu
ZEZyYWdtZW50LS0+XG48L0JPRFk+XG48L0hUTUw+IjsKKworICAgIC8vIGNhbGN1bGF0ZSBvZmZz
ZXRzCisgICAgY29uc3QgdW5zaWduZWQgVUlOVF9NQVhkaWdpdHMgPSAxMDsgLy8gbnVtYmVyIG9m
IGRpZ2l0cyBpbiBVSU5UX01BWCBpbiBiYXNlIDEwCisgICAgdW5zaWduZWQgc3RhcnRIVE1MT2Zm
c2V0ID0gY2ZfaHRtbC5sZW5ndGgoKSArIHN0YXJ0SFRNTC5sZW5ndGgoKSArIGVuZEhUTUwubGVu
Z3RoKCkgKyBzdGFydEZyYWdtZW50Lmxlbmd0aCgpICsgZW5kRnJhZ21lbnQubGVuZ3RoKCkgKyAo
c2hvdWxkRmlsbFNvdXJjZVVSTCA/IHNvdXJjZVVSTC5sZW5ndGgoKSArIHNyY1VSTC5sZW5ndGgo
KSA6IDApICsgKDQgKiBVSU5UX01BWGRpZ2l0cyk7CisgICAgdW5zaWduZWQgc3RhcnRGcmFnbWVu
dE9mZnNldCA9IHN0YXJ0SFRNTE9mZnNldCArIHN0YXJ0TWFya3VwLmxlbmd0aCgpOworICAgIENT
dHJpbmcgbWFya3VwVVRGOCA9IG1hcmt1cC51dGY4KCk7CisgICAgdW5zaWduZWQgZW5kRnJhZ21l
bnRPZmZzZXQgPSBzdGFydEZyYWdtZW50T2Zmc2V0ICsgbWFya3VwVVRGOC5sZW5ndGgoKTsKKyAg
ICB1bnNpZ25lZCBlbmRIVE1MT2Zmc2V0ID0gZW5kRnJhZ21lbnRPZmZzZXQgKyBlbmRNYXJrdXAu
bGVuZ3RoKCk7CisKKyAgICAvLyBjcmVhdGUgZnVsbCByZXN1bHQgc3RyaW5nIGZyb20gdGhlIGZy
YWdtZW50cworICAgIGFwcGVuZChyZXN1bHQsIHN0YXJ0SFRNTCk7CisgICAgYXBwZW5kKHJlc3Vs
dCwgU3RyaW5nOjpmb3JtYXQoIiUwMTB1Iiwgc3RhcnRIVE1MT2Zmc2V0KS51dGY4KCkuZGF0YSgp
KTsKKyAgICBhcHBlbmQocmVzdWx0LCBlbmRIVE1MKTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJp
bmc6OmZvcm1hdCgiJTAxMHUiLCBlbmRIVE1MT2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAgICBh
cHBlbmQocmVzdWx0LCBzdGFydEZyYWdtZW50KTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6
OmZvcm1hdCgiJTAxMHUiLCBzdGFydEZyYWdtZW50T2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAg
ICBhcHBlbmQocmVzdWx0LCBlbmRGcmFnbWVudCk7CisgICAgYXBwZW5kKHJlc3VsdCwgU3RyaW5n
Ojpmb3JtYXQoIiUwMTB1IiwgZW5kRnJhZ21lbnRPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAg
IGlmIChzaG91bGRGaWxsU291cmNlVVJMKSB7CisgICAgICAgIGFwcGVuZChyZXN1bHQsIHNvdXJj
ZVVSTCk7CisgICAgICAgIGFwcGVuZChyZXN1bHQsIHNyY1VSTC51dGY4KCkuZGF0YSgpKTsKKyAg
ICB9CisgICAgYXBwZW5kKHJlc3VsdCwgc3RhcnRNYXJrdXApOworICAgIGFwcGVuZChyZXN1bHQs
IG1hcmt1cFVURjguZGF0YSgpKTsKKyAgICBhcHBlbmQocmVzdWx0LCBlbmRNYXJrdXApOworfQor
CitTdHJpbmcgdXJsVG9NYXJrdXAoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxl
KQoreworICAgIFN0cmluZyBtYXJrdXAoIjxhIGhyZWY9XCIiKTsKKyAgICBtYXJrdXAuYXBwZW5k
KHVybC5zdHJpbmcoKSk7CisgICAgbWFya3VwLmFwcGVuZCgiXCI+Iik7CisgICAgbWFya3VwLmFw
cGVuZCh0aXRsZSk7CisgICAgbWFya3VwLmFwcGVuZCgiPC9hPiIpOworICAgIHJldHVybiBtYXJr
dXA7Cit9CisKK3ZvaWQgcmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKFN0
cmluZyYgc3RyKQoreworICAgIHN0YXRpYyBjb25zdCBVQ2hhciBOZXdsaW5lID0gJ1xuJzsKKyAg
ICBzdGF0aWMgY29uc3QgU3RyaW5nIFdpbmRvd3NOZXdsaW5lKCJcclxuIik7CisgICAgc3RyLnJl
cGxhY2UoTmV3bGluZSwgV2luZG93c05ld2xpbmUpOworfQorCit2b2lkIHJlcGxhY2VOQlNQV2l0
aFNwYWNlKFN0cmluZyYgc3RyKQoreworICAgIHN0YXRpYyBjb25zdCBVQ2hhciBOb25CcmVha2lu
Z1NwYWNlQ2hhcmFjdGVyID0gMHhBMDsKKyAgICBzdGF0aWMgY29uc3QgVUNoYXIgU3BhY2VDaGFy
YWN0ZXIgPSAnICc7CisgICAgc3RyLnJlcGxhY2UoTm9uQnJlYWtpbmdTcGFjZUNoYXJhY3Rlciwg
U3BhY2VDaGFyYWN0ZXIpOworfQorCitGT1JNQVRFVEMqIHVybFdGb3JtYXQoKQoreworICAgIHN0
YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJVbmlmb3JtUmVzb3VyY2VM
b2NhdG9yVyIpOworICAgIHN0YXRpYyBGT1JNQVRFVEMgdXJsRm9ybWF0ID0ge2NmLCAwLCBEVkFT
UEVDVF9DT05URU5ULCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ1cmxGb3JtYXQ7
Cit9CisKK0ZPUk1BVEVUQyogdXJsRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlOVCBjZiA9IFJl
Z2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiVW5pZm9ybVJlc291cmNlTG9jYXRvciIpOworICAgIHN0
YXRpYyBGT1JNQVRFVEMgdXJsRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwg
VFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ1cmxGb3JtYXQ7Cit9CisKK0ZPUk1BVEVUQyog
cGxhaW5UZXh0Rm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgRk9STUFURVRDIHRleHRGb3JtYXQgPSB7
Q0ZfVEVYVCwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJl
dHVybiAmdGV4dEZvcm1hdDsKK30KKworRk9STUFURVRDKiBwbGFpblRleHRXRm9ybWF0KCkKK3sK
KyAgICBzdGF0aWMgRk9STUFURVRDIHRleHRGb3JtYXQgPSB7Q0ZfVU5JQ09ERVRFWFQsIDAsIERW
QVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnRleHRGb3Jt
YXQ7Cit9CisKK0ZPUk1BVEVUQyogZmlsZW5hbWVXRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlO
VCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiRmlsZU5hbWVXIik7CisgICAgc3RhdGlj
IEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1F
RF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnVybEZvcm1hdDsKK30KKworRk9STUFURVRDKiBmaWxl
bmFtZUZvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBib2FyZEZv
cm1hdChMIkZpbGVOYW1lIik7CisgICAgc3RhdGljIEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7Y2Ys
IDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnVy
bEZvcm1hdDsKK30KKworLy9NU0lFIEhUTUwgRm9ybWF0CitGT1JNQVRFVEMqIGh0bWxGb3JtYXQo
KQoreworICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJIVE1M
IEZvcm1hdCIpOworICAgIHN0YXRpYyBGT1JNQVRFVEMgaHRtbEZvcm1hdCA9IHtjZiwgMCwgRFZB
U1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmaHRtbEZvcm1h
dDsKK30KKworU3RyaW5nIGdldFVSTChJRGF0YU9iamVjdCosIGJvb2wmLCBTdHJpbmcqKQorewor
ICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworU3RyaW5nIGdldFBsYWluVGV4dChJRGF0YU9iamVj
dCogZGF0YU9iamVjdCwgYm9vbCYgc3VjY2VzcykKK3sKKyAgICBTVEdNRURJVU0gc3RvcmU7Cisg
ICAgU3RyaW5nIHRleHQ7CisgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIGlmIChTVUNDRUVERUQo
ZGF0YU9iamVjdC0+R2V0RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAg
ICAgIC8vdW5pY29kZSB0ZXh0CisgICAgICAgIFVDaGFyKiBkYXRhID0gKFVDaGFyKilHbG9iYWxM
b2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICB0ZXh0ID0gU3RyaW5nKGRhdGEpOworICAgICAg
ICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0o
JnN0b3JlKTsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfSBlbHNlIGlmIChTVUNDRUVE
RUQoZGF0YU9iamVjdC0+R2V0RGF0YShwbGFpblRleHRGb3JtYXQoKSwgJnN0b3JlKSkpIHsKKyAg
ICAgICAgLy9hc2NpaSB0ZXh0CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopR2xvYmFsTG9j
ayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgdGV4dCA9IFN0cmluZyhkYXRhKTsKKyAgICAgICAg
R2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZz
dG9yZSk7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8v
SWYgYSBmaWxlIGlzIGRyb3BwZWQgb24gdGhlIHdpbmRvdywgaXQgZG9lcyBub3QgcHJvdmlkZSBl
aXRoZXIgb2YgdGhlCisgICAgICAgIC8vcGxhaW4gdGV4dCBmb3JtYXRzLCBzbyBoZXJlIHdlIHRy
eSB0byBmb3JjaWJseSBnZXQgYSB1cmwuCisgICAgICAgIHRleHQgPSBnZXRVUkwoZGF0YU9iamVj
dCwgc3VjY2Vzcyk7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4g
dGV4dDsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudEZyb21GaWxl
bmFtZXMoRG9jdW1lbnQqLCBjb25zdCBJRGF0YU9iamVjdCopCit7CisgICAgLy9GSVhNRTogV2Ug
c2hvdWxkIGJlIGFibGUgdG8gY3JlYXRlIGZyYWdtZW50cyBmcm9tIGZpbGVzCisgICAgcmV0dXJu
IDA7Cit9CisKK2Jvb2wgY29udGFpbnNGaWxlbmFtZXMoY29uc3QgSURhdGFPYmplY3QqKQorewor
ICAgIC8vRklYTUU6IFdlJ2xsIHdhbnQgdG8gdXBkYXRlIHRoaXMgb25jZSB3ZSBjYW4gcHJvZHVj
ZSBmcmFnbWVudHMgZnJvbSBmaWxlcworICAgIHJldHVybiBmYWxzZTsKK30KKworLy9Db252ZXJ0
IGEgU3RyaW5nIGNvbnRhaW5pbmcgQ0ZfSFRNTCBmb3JtYXR0ZWQgdGV4dCB0byBhIERvY3VtZW50
RnJhZ21lbnQKK1Bhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tQ0ZfSFRN
TChEb2N1bWVudCogZG9jLCBjb25zdCBTdHJpbmcmIGNmX2h0bWwpCit7CisgICAgLy8gb2J0YWlu
IGJhc2VVUkwgaWYgcHJlc2VudAorICAgIFN0cmluZyBzcmNVUkxTdHIoInNvdXJjZVVSTDoiKTsK
KyAgICBTdHJpbmcgc3JjVVJMOworICAgIHVuc2lnbmVkIGxpbmVTdGFydCA9IGNmX2h0bWwuZmlu
ZChzcmNVUkxTdHIsIDAsIGZhbHNlKTsKKyAgICBpZiAobGluZVN0YXJ0ICE9IC0xKSB7CisgICAg
ICAgIHVuc2lnbmVkIHNyY0VuZCA9IGNmX2h0bWwuZmluZCgiXG4iLCBsaW5lU3RhcnQsIGZhbHNl
KTsKKyAgICAgICAgdW5zaWduZWQgc3JjU3RhcnQgPSBsaW5lU3RhcnQrc3JjVVJMU3RyLmxlbmd0
aCgpOworICAgICAgICBTdHJpbmcgcmF3U3JjVVJMID0gY2ZfaHRtbC5zdWJzdHJpbmcoc3JjU3Rh
cnQsIHNyY0VuZC1zcmNTdGFydCk7CisgICAgICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHJhd1Ny
Y1VSTCk7CisgICAgICAgIHNyY1VSTCA9IHJhd1NyY1VSTC5zdHJpcFdoaXRlU3BhY2UoKTsKKyAg
ICB9CisKKyAgICAvLyBmaW5kIHRoZSBtYXJrdXAgYmV0d2VlbiAiPCEtLVN0YXJ0RnJhZ21lbnQg
LS0+IiBhbmQgIjwhLS1FbmRGcmFnbWVudCAtLT4iLCBhY2NvdW50aW5nIGZvciBicm93c2VyIHF1
aXJrcworICAgIHVuc2lnbmVkIG1hcmt1cFN0YXJ0ID0gY2ZfaHRtbC5maW5kKCI8aHRtbCIsIDAs
IGZhbHNlKTsKKyAgICB1bnNpZ25lZCB0YWdTdGFydCA9IGNmX2h0bWwuZmluZCgic3RhcnRmcmFn
bWVudCIsIG1hcmt1cFN0YXJ0LCBmYWxzZSk7CisgICAgdW5zaWduZWQgZnJhZ21lbnRTdGFydCA9
IGNmX2h0bWwuZmluZCgnPicsIHRhZ1N0YXJ0KSArIDE7CisgICAgdW5zaWduZWQgdGFnRW5kID0g
Y2ZfaHRtbC5maW5kKCJlbmRmcmFnbWVudCIsIGZyYWdtZW50U3RhcnQsIGZhbHNlKTsKKyAgICB1
bnNpZ25lZCBmcmFnbWVudEVuZCA9IGNmX2h0bWwucmV2ZXJzZUZpbmQoJzwnLCB0YWdFbmQpOwor
ICAgIFN0cmluZyBtYXJrdXAgPSBjZl9odG1sLnN1YnN0cmluZyhmcmFnbWVudFN0YXJ0LCBmcmFn
bWVudEVuZCAtIGZyYWdtZW50U3RhcnQpLnN0cmlwV2hpdGVTcGFjZSgpOworCisgICAgcmV0dXJu
IGNyZWF0ZUZyYWdtZW50RnJvbU1hcmt1cChkb2MsIG1hcmt1cCwgc3JjVVJMKS5yZWxlYXNlUmVm
KCk7Cit9CisKKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudEZyb21IVE1M
KERvY3VtZW50KiBkb2MsIElEYXRhT2JqZWN0KiBkYXRhKQoreworICAgIGlmICghZG9jIHx8ICFk
YXRhKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFNUR01FRElVTSBzdG9yZTsKKyAgICBTdHJp
bmcgaHRtbDsKKyAgICBTdHJpbmcgc3JjVVJMOworICAgIGlmIChTVUNDRUVERUQoZGF0YS0+R2V0
RGF0YShodG1sRm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8vTVMgSFRNTCBGb3JtYXQg
cGFyc2luZworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKUdsb2JhbExvY2soc3RvcmUuaEds
b2JhbCk7CisgICAgICAgIFNJWkVfVCBkYXRhU2l6ZSA9IDo6R2xvYmFsU2l6ZShzdG9yZS5oR2xv
YmFsKTsKKyAgICAgICAgU3RyaW5nIGNmX2h0bWwoVVRGOEVuY29kaW5nKCkuZGVjb2RlKGRhdGEs
IGRhdGFTaXplKSk7CisgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAg
ICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAgICBpZiAoUGFzc1JlZlB0cjxEb2N1
bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZyYWdtZW50RnJvbUNGX0hUTUwoZG9jLCBjZl9odG1s
KSkKKyAgICAgICAgICAgIHJldHVybiBmcmFnbWVudDsKKyAgICB9CisgICAgaWYgKFNVQ0NFRURF
RChkYXRhLT5HZXREYXRhKHRleHRIdG1sRm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8v
cmF3IGh0bWwKKyAgICAgICAgVUNoYXIqIGRhdGEgPSAoVUNoYXIqKUdsb2JhbExvY2soc3RvcmUu
aEdsb2JhbCk7CisgICAgICAgIGh0bWwgPSBTdHJpbmcoZGF0YSk7CisgICAgICAgIEdsb2JhbFVu
bG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOwor
ICAgICAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tTWFya3VwKGRvYywgaHRtbCwgc3JjVVJM
KTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBjb250YWluc0hUTUwoSURhdGFP
YmplY3QqIGRhdGEpCit7CisgICAgcmV0dXJuIFNVQ0NFRURFRChkYXRhLT5RdWVyeUdldERhdGEo
dGV4dEh0bWxGb3JtYXQoKSkpIHx8IFNVQ0NFRURFRChkYXRhLT5RdWVyeUdldERhdGEoaHRtbEZv
cm1hdCgpKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9DbGlwYm9hcmRXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uYzkyNzMwMgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ2xp
cGJvYXJkV2luY2UuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IkNsaXBib2FyZFdpbmNlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ2xpcGJvYXJkV2lu
Y2U6OkNsaXBib2FyZFdpbmNlKENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIGJvb2wgaXNG
b3JEcmFnZ2luZykKKzogQ2xpcGJvYXJkKHBvbGljeSwgaXNGb3JEcmFnZ2luZykKK3sKK30KKwor
Q2xpcGJvYXJkV2luY2U6On5DbGlwYm9hcmRXaW5jZSgpCit7Cit9CisKK3ZvaWQgQ2xpcGJvYXJk
V2luY2U6OmNsZWFyRGF0YShjb25zdCBTdHJpbmcmIHR5cGUpCit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKK30KKwordm9pZCBDbGlwYm9hcmRXaW5jZTo6Y2xlYXJBbGxEYXRhKCkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworfQorCitTdHJpbmcgQ2xpcGJvYXJkV2luY2U6OmdldERhdGEoY29u
c3QgU3RyaW5nJiB0eXBlLCBib29sJiBzdWNjZXNzKSBjb25zdAoreworICAgIG5vdEltcGxlbWVu
dGVkKCk7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitib29sIENsaXBib2FyZFdpbmNlOjpz
ZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRhKQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBleHRlbnNpb25zIGJl
eW9uZCBJRSdzIEFQSQorSGFzaFNldDxTdHJpbmc+IENsaXBib2FyZFdpbmNlOjp0eXBlcygpIGNv
bnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gSGFzaFNldDxTdHJpbmc+
KCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OnNldERyYWdJbWFnZShDYWNoZWRJbWFnZSos
IGNvbnN0IEludFBvaW50JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIENs
aXBib2FyZFdpbmNlOjpzZXREcmFnSW1hZ2VFbGVtZW50KE5vZGUqLCBjb25zdCBJbnRQb2ludCYp
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworLy9Qcm92aWRlcyB0aGUgRE9NIHNwZWNp
ZmllZAorRHJhZ0ltYWdlUmVmIENsaXBib2FyZFdpbmNlOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9p
bnQmIGRyYWdMb2MpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4g
RHJhZ0ltYWdlUmVmKCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OmRlY2xhcmVBbmRXcml0
ZURyYWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgdGl0bGUsIEZy
YW1lKikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIENsaXBib2FyZFdpbmNl
Ojp3cml0ZVVSTChjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiwgRnJhbWUqKQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OndyaXRlUmFuZ2UoUmFu
Z2UqLCBGcmFtZSopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworYm9vbCBDbGlwYm9h
cmRXaW5jZTo6aGFzRGF0YSgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKK1Bhc3NSZWZQdHI8RmlsZUxpc3Q+IENsaXBib2FyZFdpbmNlOjpmaWxlcygp
IGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworfSAv
LyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9D
bGlwYm9hcmRXaW5jZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5o
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGNiZjIKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmgKQEAgLTAsMCAr
MSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJbmMu
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVl
IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGli
cmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAor
ICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2Ug
Zm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3Ry
ZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisK
KyNpZm5kZWYgQ2xpcGJvYXJkV2luY2VfaAorI2RlZmluZSBDbGlwYm9hcmRXaW5jZV9oCisKKyNp
bmNsdWRlICJDbGlwYm9hcmQuaCIKKyNpbmNsdWRlICJGaWxlTGlzdC5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKKyAgICBjbGFzcyBDbGlwYm9hcmRXaW5jZSA6IHB1YmxpYyBDbGlwYm9hcmQs
IHB1YmxpYyBDYWNoZWRSZXNvdXJjZUNsaWVudCB7CisgICAgcHVibGljOgorICAgICAgICBDbGlw
Ym9hcmRXaW5jZShDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBib29sIGlzRm9yRHJhZ2dp
bmcpOworICAgICAgICB+Q2xpcGJvYXJkV2luY2UoKTsKKworICAgICAgICB2b2lkIGNsZWFyRGF0
YShjb25zdCBTdHJpbmcmIHR5cGUpOworICAgICAgICB2b2lkIGNsZWFyQWxsRGF0YSgpOworICAg
ICAgICBTdHJpbmcgZ2V0RGF0YShjb25zdCBTdHJpbmcmIHR5cGUsIGJvb2wmIHN1Y2Nlc3MpIGNv
bnN0OworICAgICAgICBib29sIHNldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJp
bmcmIGRhdGEpOworCisgICAgICAgIC8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCisgICAg
ICAgIEhhc2hTZXQ8U3RyaW5nPiB0eXBlcygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0RHJh
Z0ltYWdlKENhY2hlZEltYWdlKiwgY29uc3QgSW50UG9pbnQmKTsKKyAgICAgICAgdm9pZCBzZXRE
cmFnSW1hZ2VFbGVtZW50KE5vZGUqLCBjb25zdCBJbnRQb2ludCYpOworCisgICAgICAgIHZpcnR1
YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3Q7
CisgICAgICAgIHZpcnR1YWwgdm9pZCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCos
IGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSopOworICAgICAgICB2aXJ0
dWFsIHZvaWQgd3JpdGVVUkwoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKik7Cisg
ICAgICAgIHZpcnR1YWwgdm9pZCB3cml0ZVJhbmdlKFJhbmdlKiwgRnJhbWUqKTsKKworICAgICAg
ICB2aXJ0dWFsIGJvb2wgaGFzRGF0YSgpOworICAgICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8Rmls
ZUxpc3Q+IGZpbGVzKCkgY29uc3Q7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQor
CisjZW5kaWYgLy8gQ2xpcGJvYXJkV2luY2VfaApkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9Db250ZXh0TWVudUl0ZW1XaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNl
L0NvbnRleHRNZW51SXRlbVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi40ODJmYmZlCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9D
b250ZXh0TWVudUl0ZW1XaW5jZS5jcHAKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENv
cHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29udGV4dE1lbnVJdGVtLmgiCisKKyNpbmNsdWRlICJD
b250ZXh0TWVudS5oIgorI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlw
ZTo6flBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGUoKQoreworICAgIGRlbGV0ZSBzdWJN
ZW51OworfQorCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShQbGF0Zm9ybU1lbnVJ
dGVtRGVzY3JpcHRpb24gaXRlbSkKKyAgICA6IG1fcGxhdGZvcm1EZXNjcmlwdGlvbihpdGVtKQor
eworfQorCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudSogc3Vi
TWVudSkKK3sKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSBuZXcgUGxhdGZvcm1NZW51SXRl
bURlc2NyaXB0aW9uVHlwZTsKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uICYmIHN1Yk1l
bnUpCisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+c3ViTWVudSA9IHN1Yk1lbnUtPnJl
bGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCk7Cit9CisKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4
dE1lbnVJdGVtKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSwgQ29udGV4dE1lbnVBY3Rpb24gYWN0
aW9uLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBDb250ZXh0TWVudSogc3ViTWVudSkKK3sKKyAgICBt
X3BsYXRmb3JtRGVzY3JpcHRpb24gPSBuZXcgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlw
ZTsKKyAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuOworCisg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT50eXBlID0gdHlwZTsKKyAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPmFjdGlvbiA9IGFjdGlvbjsKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnRp
dGxlID0gdGl0bGU7CisgICAgaWYgKHN1Yk1lbnUpCisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlw
dGlvbi0+c3ViTWVudSA9IHN1Yk1lbnUtPnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCk7Cit9
CisKK0NvbnRleHRNZW51SXRlbTo6fkNvbnRleHRNZW51SXRlbSgpCit7CisgICAgZGVsZXRlIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbjsKK30KKworUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIENv
bnRleHRNZW51SXRlbTo6cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKQoreworICAgIFBsYXRm
b3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBkZXNjID0gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOworICAg
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7CisgICAgcmV0dXJuIGRlc2M7Cit9CisKK0NvbnRl
eHRNZW51SXRlbVR5cGUgQ29udGV4dE1lbnVJdGVtOjp0eXBlKCkgY29uc3QKK3sKKyAgICBpZiAo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT50eXBlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEFjdGlvblR5cGU7Cit9CisKK0Nv
bnRleHRNZW51QWN0aW9uIENvbnRleHRNZW51SXRlbTo6YWN0aW9uKCkgY29uc3QKK3sKKyAgICBp
ZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLT5hY3Rpb247CisgICAgZWxzZQorICAgICAgICByZXR1cm4gQ29udGV4dE1lbnVJdGVt
VGFnTm9BY3Rpb247Cit9CisKK1N0cmluZyBDb250ZXh0TWVudUl0ZW06OnRpdGxlKCkgY29uc3QK
K3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm4gbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT50aXRsZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBTdHJpbmco
KTsKK30KKworUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gQ29udGV4dE1lbnVJdGVtOjpwbGF0Zm9y
bVN1Yk1lbnUoKSBjb25zdAoreworICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAg
ICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1lbnU7CisgICAgZWxzZQorICAg
ICAgICByZXR1cm4gMDsKK30KKwordm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFR5cGUoQ29udGV4
dE1lbnVJdGVtVHlwZSB0eXBlKQoreworICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisg
ICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dHlwZSA9IHR5cGU7Cit9CisKK3ZvaWQgQ29u
dGV4dE1lbnVJdGVtOjpzZXRBY3Rpb24oQ29udGV4dE1lbnVBY3Rpb24gYWN0aW9uKQoreworICAg
IGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bi0+YWN0aW9uID0gYWN0aW9uOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VGl0bGUo
Y29uc3QgU3RyaW5nJiB0aXRsZSkKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQor
ICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnRpdGxlID0gdGl0bGU7Cit9CisKK3ZvaWQg
Q29udGV4dE1lbnVJdGVtOjpzZXRTdWJNZW51KENvbnRleHRNZW51KiBzdWJNZW51KQoreworICAg
IGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdWJNZW51ICE9IHN1Yk1lbnUtPnBsYXRmb3JtRGVzY3Jp
cHRpb24oKSkKKyAgICAgICAgZGVsZXRlIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+c3ViTWVudTsK
KyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1lbnUgPSBzdWJNZW51LT5yZWxlYXNlUGxh
dGZvcm1EZXNjcmlwdGlvbigpOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0Q2hlY2tl
ZChib29sIGNoZWNrZWQpCit7CisgICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAg
ICAgIHJldHVybjsKKyAgICBpZiAoY2hlY2tlZCkKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5zdGF0ZSB8PSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpDaGVja2VkU3Rh
dGU7CisgICAgZWxzZQorICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN0YXRlICY9IH5Q
bGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpDaGVja2VkU3RhdGU7Cit9CisKK3ZvaWQg
Q29udGV4dE1lbnVJdGVtOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoIW1f
cGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChlbmFibGVkKQor
ICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN0YXRlIHw9IFBsYXRmb3JtTWVudUl0ZW1E
ZXNjcmlwdGlvblR5cGU6OkVuYWJsZWRTdGF0ZTsKKyAgICBlbHNlCisgICAgICAgIG1fcGxhdGZv
cm1EZXNjcmlwdGlvbi0+c3RhdGUgJj0gflBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6
OkVuYWJsZWRTdGF0ZTsKK30KKworYm9vbCBDb250ZXh0TWVudUl0ZW06OmVuYWJsZWQoKSBjb25z
dAoreworICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24gJiYgKG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+c3RhdGUgJiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVk
U3RhdGUpID09IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkVuYWJsZWRTdGF0ZTsK
K30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9Db250ZXh0TWVudVdp
bmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVXaW5jZS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkOGU0YQotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVXaW5jZS5jcHAKQEAgLTAsMCAr
MSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmls
ZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29udGV4dE1l
bnUuaCIKKworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2lu
Y2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiTm9kZS5o
IgorI2luY2x1ZGUgPHRjaGFyLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUg
PHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQbGF0Zm9ybU1lbnVEZXNjcmlw
dGlvblR5cGU6OlBsYXRmb3JtTWVudURlc2NyaXB0aW9uVHlwZSgpCisgICAgOiBoTWVudSg6OkNy
ZWF0ZVBvcHVwTWVudSgpKQorICAgICwgaXRlbUNvdW50KDApCit7Cit9CisKK1BsYXRmb3JtTWVu
dURlc2NyaXB0aW9uVHlwZTo6flBsYXRmb3JtTWVudURlc2NyaXB0aW9uVHlwZSgpCit7CisgICAg
aWYgKGhNZW51KQorICAgICAgICA6OkRlc3Ryb3lNZW51KGhNZW51KTsKK30KKworQ29udGV4dE1l
bnU6OkNvbnRleHRNZW51KGNvbnN0IEhpdFRlc3RSZXN1bHQmIHJlc3VsdCkKKyAgICA6IG1faGl0
VGVzdFJlc3VsdChyZXN1bHQpCisgICAgLCBtX3BsYXRmb3JtRGVzY3JpcHRpb24oMCkKK3sKKyAg
ICBzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKG5ldyBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvblR5cGUp
OworfQorCitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29uc3QgSGl0VGVzdFJlc3VsdCYgcmVz
dWx0LCBjb25zdCBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBtZW51KQorICAgIDogbV9oaXRUZXN0
UmVzdWx0KHJlc3VsdCkKKyAgICAsIG1fcGxhdGZvcm1EZXNjcmlwdGlvbigwKQoreworICAgIHNl
dFBsYXRmb3JtRGVzY3JpcHRpb24obWVudSk7Cit9CisKK0NvbnRleHRNZW51Ojp+Q29udGV4dE1l
bnUoKQoreworICAgIGRlbGV0ZSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Cit9CisKK3Vuc2lnbmVk
IENvbnRleHRNZW51OjppdGVtQ291bnQoKSBjb25zdAoreworICAgIGlmIChtX3BsYXRmb3JtRGVz
Y3JpcHRpb24pCisgICAgICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPml0ZW1Db3Vu
dDsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIENvbnRleHRNZW51Ojpp
bnNlcnRJdGVtKHVuc2lnbmVkIGludCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJiBpdGVtKQor
eworICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm47CisKKyAg
ICBjaGVja09yRW5hYmxlSWZOZWVkZWQoaXRlbSk7CisKKyAgICBQbGF0Zm9ybU1lbnVJdGVtRGVz
Y3JpcHRpb24gZGVzYyA9IGl0ZW0ucmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKKyAgICBV
SU5UIGZsYWdzID0gTUZfQllQT1NJVElPTjsKKyAgICBVSU5UIG5ld0l0ZW0gPSAwOworICAgIExQ
Q1RTVFIgdGl0bGUgPSAwOworICAgIERXT1JEIHN1Yk1lbnVTaXplID0gMDsKKworICAgIGlmIChk
ZXNjLT50eXBlID09IFNlcGFyYXRvclR5cGUpCisgICAgICAgIGZsYWdzIHw9IE1GX1NFUEFSQVRP
UjsKKyAgICBlbHNlIHsKKyAgICAgICAgZmxhZ3MgfD0gTUZfU1RSSU5HOworICAgICAgICB0aXRs
ZSA9IHdjc2R1cChkZXNjLT50aXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsK
KworICAgICAgICBpZiAoZGVzYy0+c3ViTWVudSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gTUZf
UE9QVVA7CisgICAgICAgICAgICBuZXdJdGVtID0gKFVJTlQpIGRlc2MtPnN1Yk1lbnUtPmhNZW51
OworICAgICAgICAgICAgc3ViTWVudVNpemUgPSBkZXNjLT5zdWJNZW51LT5pdGVtQ291bnQ7CisK
KyAgICAgICAgICAgIC8vIG5vdyB3ZSBvd24gdGhlIHN1Ym1lbnUgc28gbWFrZSBzdXJlIGl0IGRv
ZXNuJ3QgZ2V0IGRlbGV0ZWQgd2l0aCBkZXNjCisgICAgICAgICAgICBkZXNjLT5zdWJNZW51LT5o
TWVudSA9IDA7CisgICAgICAgICAgICBkZWxldGUgZGVzYy0+c3ViTWVudTsKKyAgICAgICAgICAg
IGRlc2MtPnN1Yk1lbnUgPSAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG5ld0l0ZW0g
PSBkZXNjLT5hY3Rpb247CisKKyAgICAgICAgaWYgKChkZXNjLT5zdGF0ZSAmIFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvblR5cGU6OkNoZWNrZWRTdGF0ZSkgPT0gUGxhdGZvcm1NZW51SXRlbURl
c2NyaXB0aW9uVHlwZTo6Q2hlY2tlZFN0YXRlKQorICAgICAgICAgICAgZmxhZ3MgfD0gTUZfQ0hF
Q0tFRDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZ3MgfD0gTUZfVU5DSEVDS0VEOwor
CisgICAgICAgIGlmICgoZGVzYy0+c3RhdGUgJiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25U
eXBlOjpFbmFibGVkU3RhdGUpID09IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkVu
YWJsZWRTdGF0ZSkKKyAgICAgICAgICAgIGZsYWdzIHw9IE1GX0VOQUJMRUQ7CisgICAgICAgIGVs
c2UKKyAgICAgICAgICAgIGZsYWdzIHw9IE1GX0dSQVlFRDsKKyAgICB9CisKKyAgICBpZiAoOjpJ
bnNlcnRNZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aE1lbnUsIHBvc2l0aW9uLCBmbGFncywg
bmV3SXRlbSwgdGl0bGUpKSB7CisgICAgICAgIGlmIChzdWJNZW51U2l6ZSkgeworICAgICAgICAg
ICAgLy8gc3RvcmUgdGhlIHN1Ym1lbnUncyBzaXplIGFsb25nIHdpdGggaXQsIHNpbmNlIFdpbkNF
IGhhcyBubyBmdW5jdGlvbiBjYWxsIHRvIGZpbmQgdGhpcworICAgICAgICAgICAgTUVOVUlURU1J
TkZPIGluZm87CisgICAgICAgICAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7Cisg
ICAgICAgICAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihpbmZvKTsKKyAgICAgICAgICAgIGluZm8u
Zk1hc2sgPSBNSUlNX0RBVEE7CisgICAgICAgICAgICBpbmZvLmR3SXRlbURhdGEgPSBzdWJNZW51
U2l6ZTsKKworICAgICAgICAgICAgOjpTZXRNZW51SXRlbUluZm8obV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5oTWVudSwgcG9zaXRpb24sIFRSVUUsICZpbmZvKTsKKyAgICAgICAgfQorICAgICAgICAr
K21fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aXRlbUNvdW50OworICAgIH0KKworICAgIC8vIHRoZSBp
dGVtIGlzIG5vdyBvd25lZCBieSB0aGUgbWVudSBzdHJ1Y3R1cmUsIHNvIGRlbGV0ZSBvdXIgcmVm
ZXJlbmNlIHRvIGl0CisgICAgZGVsZXRlIGRlc2M7Cit9CisKK3ZvaWQgQ29udGV4dE1lbnU6OmFw
cGVuZEl0ZW0oQ29udGV4dE1lbnVJdGVtJiBpdGVtKQoreworICAgIGluc2VydEl0ZW0oaXRlbUNv
dW50KCksIGl0ZW0pOworfQorCitzdGF0aWMgQ29udGV4dE1lbnVJdGVtKiBjb250ZXh0TWVudUl0
ZW1CeUlkT3JQb3NpdGlvbihQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBtZW51LCB1bnNpZ25lZCBp
ZCwgQk9PTCBieVBvc2l0aW9uKQoreworICAgIGlmICghbWVudSkKKyAgICAgICAgcmV0dXJuIDA7
CisKKyAgICBNRU5VSVRFTUlORk8gaW5mbzsKKyAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihp
bmZvKSk7CisgICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CisgICAgaW5mby5mTWFzayA9
IE1JSU1fVFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NVQk1FTlUgfCBNSUlNX1NUQVRFIHwgTUlJTV9E
QVRBOworCisgICAgaWYgKCE6OkdldE1lbnVJdGVtSW5mbyhtZW51LT5oTWVudSwgaWQsIGJ5UG9z
aXRpb24sICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBpZiBpdCBoYXMgYSBz
dHJpbmcsIHJlYWQgaXQKKyAgICBTdHJpbmcgdGl0bGU7CisgICAgaWYgKChpbmZvLmZUeXBlICYg
TUZUX1NUUklORykgPT0gTUZUX1NUUklORykgeworICAgICAgICAvLyBpbmZvLmNjaCBjb250YWlu
cyB0aGUgbnVtYmVyIG9mIGNoYXJzIGluIHRoZSBzdHJpbmcuICBBbGxvY2F0ZSBzcGFjZSBmb3Ig
dGhpcyAocGx1cyBudWxsIHRlcm1pbmF0b3IpIGFuZCBxdWVyeSBhZ2Fpbi4KKyAgICAgICAgKytp
bmZvLmNjaDsKKyAgICAgICAgTFBUU1RSIGJ1ZmZlciA9IChMUFRTVFIpbWFsbG9jKGluZm8uY2No
ICogc2l6ZW9mKFRDSEFSKSk7CisgICAgICAgIGlmICghYnVmZmVyKQorICAgICAgICAgICAgcmV0
dXJuIDA7CisgICAgICAgIGluZm8uZHdUeXBlRGF0YSA9IGJ1ZmZlcjsKKworICAgICAgICBpZiAo
ITo6R2V0TWVudUl0ZW1JbmZvKG1lbnUtPmhNZW51LCBpZCwgYnlQb3NpdGlvbiwgJmluZm8pKSB7
CisgICAgICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAg
ICAgfQorCisgICAgICAgIC8vIGluZm8uY2NoIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBudW1iZXIg
b2YgY2hhcnMgY29waWVkIGludG8gYnVmZmVyCisgICAgICAgIHRpdGxlID0gU3RyaW5nKGluZm8u
ZHdUeXBlRGF0YSwgaW5mby5jY2gpOworICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorCisg
ICAgLy8gY3JlYXRlIHRoZSB2YWx1ZSB0byByZXR1cm4KKyAgICBQbGF0Zm9ybU1lbnVJdGVtRGVz
Y3JpcHRpb24gaXRlbSA9IG5ldyBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOworCisg
ICAgaWYgKChpbmZvLmZUeXBlICYgTUZUX1NFUEFSQVRPUikgPT0gTUZUX1NFUEFSQVRPUikKKyAg
ICAgICAgaXRlbS0+dHlwZSA9IFNlcGFyYXRvclR5cGU7CisgICAgZWxzZSB7CisgICAgICAgIGl0
ZW0tPnRpdGxlID0gdGl0bGU7CisgICAgICAgIGl0ZW0tPnN0YXRlID0gMDsKKyAgICAgICAgaWYg
KChpbmZvLmZTdGF0ZSAmIE1GU19DSEVDS0VEKSA9PSBNRlNfQ0hFQ0tFRCkKKyAgICAgICAgICAg
IGl0ZW0tPnN0YXRlIHw9IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkNoZWNrZWRT
dGF0ZTsKKyAgICAgICAgaWYgKChpbmZvLmZTdGF0ZSAmIE1GU19FTkFCTEVEKSA9PSBNRlNfRU5B
QkxFRCkKKyAgICAgICAgICAgIGl0ZW0tPnN0YXRlIHw9IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlw
dGlvblR5cGU6OkVuYWJsZWRTdGF0ZTsKKworICAgICAgICBpZiAoIWluZm8uaFN1Yk1lbnUpIHsK
KyAgICAgICAgICAgIGl0ZW0tPnR5cGUgPSBBY3Rpb25UeXBlOworICAgICAgICAgICAgaXRlbS0+
YWN0aW9uID0gKENvbnRleHRNZW51QWN0aW9uKSBpbmZvLndJRDsKKyAgICAgICAgfSBlbHNlIHsK
KyAgICAgICAgICAgIGl0ZW0tPnR5cGUgPSBTdWJtZW51VHlwZTsKKyAgICAgICAgICAgIGl0ZW0t
PnN1Yk1lbnUgPSBuZXcgUGxhdGZvcm1NZW51RGVzY3JpcHRpb25UeXBlOworCisgICAgICAgICAg
ICAvLyB0aGUgbWVudSBzaXplIGlzIHN0b3JlZCBhcyB0aGUgaXRlbSdzIGN1c3RvbSBkYXRhCisg
ICAgICAgICAgICAvLyBCVUc6IHdobyBvd25zIHRoZSBITUVOVSBub3c/CisgICAgICAgICAgICBp
dGVtLT5zdWJNZW51LT5oTWVudSA9IGluZm8uaFN1Yk1lbnU7CisgICAgICAgICAgICBpdGVtLT5z
dWJNZW51LT5pdGVtQ291bnQgPSBpbmZvLmR3SXRlbURhdGE7CisgICAgICAgIH0KKyAgICB9CisK
KyAgICByZXR1cm4gbmV3IENvbnRleHRNZW51SXRlbShpdGVtKTsKK30KKworQ29udGV4dE1lbnVJ
dGVtKiBDb250ZXh0TWVudTo6aXRlbVdpdGhBY3Rpb24odW5zaWduZWQgYWN0aW9uKQoreworICAg
IHJldHVybiBjb250ZXh0TWVudUl0ZW1CeUlkT3JQb3NpdGlvbihtX3BsYXRmb3JtRGVzY3JpcHRp
b24sIGFjdGlvbiwgRkFMU0UpOworfQorCitDb250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51Ojpp
dGVtQXRJbmRleCh1bnNpZ25lZCBpbmRleCwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24g
cGxhdGZvcm1EZXNjcmlwdGlvbikKK3sKKyAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9y
UG9zaXRpb24ocGxhdGZvcm1EZXNjcmlwdGlvbiwgaW5kZXgsIFRSVUUpOworfQorCit2b2lkIENv
bnRleHRNZW51OjpzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKFBsYXRmb3JtTWVudURlc2NyaXB0aW9u
IGRlc2MpCit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiAhPSBkZXNjKQorICAgICAg
ICBkZWxldGUgbV9wbGF0Zm9ybURlc2NyaXB0aW9uOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlv
biA9IGRlc2M7Cit9CisKK1BsYXRmb3JtTWVudURlc2NyaXB0aW9uIENvbnRleHRNZW51OjpwbGF0
Zm9ybURlc2NyaXB0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0
aW9uOworfQorCitQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBDb250ZXh0TWVudTo6cmVsZWFzZVBs
YXRmb3JtRGVzY3JpcHRpb24oKQoreworICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGRlc2Mg
PSBtX3BsYXRmb3JtRGVzY3JpcHRpb247CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gMDsK
KyAgICByZXR1cm4gZGVzYzsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9DdXJzb3JXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0N1cnNvcldpbmNl
LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzVmMWY5Ci0tLSAvZGV2
L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5jcHAKQEAgLTAs
MCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUg
SW5jLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ3Vyc29yLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworc3RydWN0IEFsbEN1cnNvcnMgeworICAgIEFsbEN1cnNvcnMoKQorICAg
IHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOdW1DdXJzb3JUeXBlczsgKytpKQorICAg
ICAgICAgICAgbV9jdXJzb3JzW2ldID0gKEN1cnNvclR5cGUpIGk7CisgICAgfQorICAgIEN1cnNv
ciBtX2N1cnNvcnNbTnVtQ3Vyc29yVHlwZXNdOworfTsKKworc3RhdGljIGNvbnN0IEN1cnNvciYg
Z2V0Q3Vyc29yKEN1cnNvclR5cGUgdHlwZSkKK3sKKyAgICBzdGF0aWMgQWxsQ3Vyc29ycyBhbGxD
dXJzb3JzOworICAgIHJldHVybiBhbGxDdXJzb3JzLm1fY3Vyc29yc1t0eXBlXTsKK30KKworQ3Vy
c29yOjpDdXJzb3IoY29uc3QgQ3Vyc29yJiBvdGhlcikKKzogbV9pbXBsKG90aGVyLm1faW1wbCkK
K3sKK30KKworQ3Vyc29yOjpDdXJzb3IoSW1hZ2UqIGltZywgY29uc3QgSW50UG9pbnQmIGhvdHNw
b3QpCis6IG1faW1wbChDdXJzb3JOb25lKQoreworfQorCitDdXJzb3I6On5DdXJzb3IoKQorewor
fQorCitDdXJzb3ImIEN1cnNvcjo6b3BlcmF0b3I9KGNvbnN0IEN1cnNvciYgb3RoZXIpCit7Cisg
ICAgbV9pbXBsID0gb3RoZXIubV9pbXBsOworICAgIHJldHVybiAqdGhpczsKK30KKworQ3Vyc29y
OjpDdXJzb3IoUGxhdGZvcm1DdXJzb3IgYykKKzogbV9pbXBsKGMpCit7Cit9CisKK2NvbnN0IEN1
cnNvciYgbm9uZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb25lKTsgfQorY29u
c3QgQ3Vyc29yJiBwb2ludGVyQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclBvaW50
ZXIpOyB9Citjb25zdCBDdXJzb3ImIGNyb3NzQ3Vyc29yKCkgIHsgcmV0dXJuIGdldEN1cnNvcihD
dXJzb3JDcm9zcyk7IH0KK2NvbnN0IEN1cnNvciYgaGFuZEN1cnNvcigpIHsgcmV0dXJuIGdldEN1
cnNvcihDdXJzb3JIYW5kKTsgfQorY29uc3QgQ3Vyc29yJiBpQmVhbUN1cnNvcigpIHsgcmV0dXJu
IGdldEN1cnNvcihDdXJzb3JCZWFtKTsgfQorY29uc3QgQ3Vyc29yJiB3YWl0Q3Vyc29yKCkgeyBy
ZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvcldhaXQpOyB9Citjb25zdCBDdXJzb3ImIGhlbHBDdXJzb3Io
KSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29ySGVscCk7IH0KK2NvbnN0IEN1cnNvciYgbW92ZUN1
cnNvcigpICB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTW92ZSk7IH0KK2NvbnN0IEN1cnNvciYg
ZWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JFYXN0UmVzaXplKTsg
fQorY29uc3QgQ3Vyc29yJiBub3J0aFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihD
dXJzb3JOb3J0aFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhFYXN0UmVzaXplQ3Vyc29y
KCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRoRWFzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1
cnNvciYgbm9ydGhXZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5v
cnRoV2VzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhSZXNpemVDdXJzb3IoKSB7IHJl
dHVybiBnZXRDdXJzb3IoQ3Vyc29yU291dGhSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHNvdXRo
RWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JTb3V0aEVhc3RSZXNp
emUpOyB9Citjb25zdCBDdXJzb3ImIHNvdXRoV2VzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdl
dEN1cnNvcihDdXJzb3JTb3V0aFdlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHdlc3RSZXNp
emVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yV2VzdFJlc2l6ZSk7IH0KK2NvbnN0
IEN1cnNvciYgbm9ydGhTb3V0aFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JOb3J0aFNvdXRoUmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBlYXN0V2VzdFJlc2l6ZUN1cnNv
cigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JFYXN0V2VzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1
cnNvciYgbm9ydGhFYXN0U291dGhXZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29y
KEN1cnNvck5vcnRoRWFzdFNvdXRoV2VzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhX
ZXN0U291dGhFYXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vcnRo
V2VzdFNvdXRoRWFzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgY29sdW1uUmVzaXplQ3Vyc29y
KCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvckNvbHVtblJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNv
ciYgcm93UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclJvd1Jlc2l6ZSk7
IH0KK2NvbnN0IEN1cnNvciYgdmVydGljYWxUZXh0Q3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29y
KEN1cnNvclZlcnRpY2FsVGV4dCk7IH0KK2NvbnN0IEN1cnNvciYgY2VsbEN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JDZWxsKTsgfQorY29uc3QgQ3Vyc29yJiBjb250ZXh0TWVudUN1
cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JDb250ZXh0TWVudSk7IH0KK2NvbnN0IEN1
cnNvciYgbm9Ecm9wQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvck5vRHJvcCk7IH0K
K2NvbnN0IEN1cnNvciYgbm90QWxsb3dlZEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JOb3RBbGxvd2VkKTsgfQorY29uc3QgQ3Vyc29yJiBwcm9ncmVzc0N1cnNvcigpIHsgcmV0dXJu
IGdldEN1cnNvcihDdXJzb3JQcm9ncmVzcyk7IH0KK2NvbnN0IEN1cnNvciYgYWxpYXNDdXJzb3Io
KSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQWxpYXMpOyB9Citjb25zdCBDdXJzb3ImIHpvb21J
bkN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3Jab29tSW4pOyB9Citjb25zdCBDdXJz
b3ImIHpvb21PdXRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yWm9vbU91dCk7IH0K
K2NvbnN0IEN1cnNvciYgY29weUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JDb3B5
KTsgfQorY29uc3QgQ3Vyc29yJiBtaWRkbGVQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3ND
dXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBlYXN0UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNy
b3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhQYW5uaW5nQ3Vyc29yKCkgeyByZXR1
cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aEVhc3RQYW5uaW5nQ3Vyc29y
KCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBub3J0aFdlc3RQYW5u
aW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0
aFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJzb3Im
IHNvdXRoRWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25z
dCBDdXJzb3ImIHNvdXRoV2VzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigp
OyB9Citjb25zdCBDdXJzb3ImIHdlc3RQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJz
b3IoKTsgfQorY29uc3QgQ3Vyc29yJiBncmFiYmluZ0N1cnNvcigpIHsgcmV0dXJuIG1vdmVDdXJz
b3IoKTsgfQorY29uc3QgQ3Vyc29yJiBncmFiQ3Vyc29yKCkgeyByZXR1cm4gbW92ZUN1cnNvcigp
OyB9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0RhdGFXaW5j
ZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdEYXRhV2luY2UuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MWQ3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdEYXRhV2luY2UuY3BwCkBAIC0wLDAgKzEsOTAgQEAK
Ky8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgor
ICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
KiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRHJhZ0RhdGEuaCIKKwor
I2luY2x1ZGUgIkNsaXBib2FyZC5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKKyNp
bmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bhc3NS
ZWZQdHI8Q2xpcGJvYXJkPiBEcmFnRGF0YTo6Y3JlYXRlQ2xpcGJvYXJkKENsaXBib2FyZEFjY2Vz
c1BvbGljeSBwb2xpY3kpIGNvbnN0Cit7CisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgRHJhZ0Rh
dGE6OmNvbnRhaW5zVVJMKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1N0cmlu
ZyBEcmFnRGF0YTo6YXNVUkwoU3RyaW5nKiB0aXRsZSkgY29uc3QKK3sKKyAgICByZXR1cm4gU3Ry
aW5nKCk7Cit9CisKK2Jvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zRmlsZXMoKSBjb25zdAoreworICAg
IHJldHVybiBmYWxzZTsKK30KKwordm9pZCBEcmFnRGF0YTo6YXNGaWxlbmFtZXMoVmVjdG9yPFN0
cmluZz4mKSBjb25zdAoreworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc1BsYWluVGV4dCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgRHJhZ0RhdGE6OmFzUGxh
aW5UZXh0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK2Jvb2wgRHJhZ0Rh
dGE6OmNvbnRhaW5zQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9v
bCBEcmFnRGF0YTo6Y2FuU21hcnRSZXBsYWNlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2Jvb2wgRHJhZ0RhdGE6OmNvbnRhaW5zQ29tcGF0aWJsZUNvbnRlbnQoKSBjb25zdAor
eworICAgIHJldHVybiBmYWxzZTsKK30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBE
cmFnRGF0YTo6YXNGcmFnbWVudChEb2N1bWVudCogZG9jKSBjb25zdAoreworICAgICByZXR1cm4g
MDsKK30KKworQ29sb3IgRHJhZ0RhdGE6OmFzQ29sb3IoKSBjb25zdAoreworICAgIHJldHVybiBD
b2xvcigpOworfQorCit9CisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJh
Z0ltYWdlV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5jZS5j
cHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2MGY4MAotLS0gL2Rldi9u
dWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCkBAIC0w
LDAgKzEsNjMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxl
LCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl
ZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0
aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisg
KiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg
cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
CisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4g
IElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAt
MTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRHJh
Z0ltYWdlLmgiCisKKyNpbmNsdWRlICJDYWNoZWRJbWFnZS5oIgorI2luY2x1ZGUgIkdyYXBoaWNz
Q29udGV4dC5oIgorI2luY2x1ZGUgIkltYWdlLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworSW50U2l6ZSBkcmFnSW1hZ2VTaXplKERyYWdJbWFnZVJl
ZikKK3sKKyAgICByZXR1cm4gSW50U2l6ZSgwLCAwKTsKK30KKwordm9pZCBkZWxldGVEcmFnSW1h
Z2UoRHJhZ0ltYWdlUmVmIGltYWdlKQoreworICAgIGlmIChpbWFnZSkKKyAgICAgICAgOjpEZWxl
dGVPYmplY3QoaW1hZ2UpOworfQorCitEcmFnSW1hZ2VSZWYgc2NhbGVEcmFnSW1hZ2UoRHJhZ0lt
YWdlUmVmLCBGbG9hdFNpemUpCit7CisgICAgcmV0dXJuIDA7Cit9CisKK0RyYWdJbWFnZVJlZiBk
aXNzb2x2ZURyYWdJbWFnZVRvRnJhY3Rpb24oRHJhZ0ltYWdlUmVmIGltYWdlLCBmbG9hdCkKK3sK
KyAgICByZXR1cm4gaW1hZ2U7Cit9CisKK0RyYWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2VGcm9t
SW1hZ2UoSW1hZ2UqKQoreworICAgIHJldHVybiAwOworfQorCitEcmFnSW1hZ2VSZWYgY3JlYXRl
RHJhZ0ltYWdlSWNvbkZvckNhY2hlZEltYWdlKENhY2hlZEltYWdlKikKK3sKKyAgICByZXR1cm4g
MDsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5j
ZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmFmNzgwCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5jZS5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoK
KyAqICBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiAg
VGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu
ZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljCisgKiAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBi
dXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50
eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRo
IHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0
bworICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0
cmVldCwgRmlmdGggRmxvb3IsCisgKiAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKworI2luY2x1ZGUgIkVkaXRvci5oIgorCisjaW5j
bHVkZSAiQ2xpcGJvYXJkV2luY2UuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUg
IkVkaXRvckNsaWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJIdG1sRWRp
dGluZy5oIgorI2luY2x1ZGUgIlRleHRJdGVyYXRvci5oIgorI2luY2x1ZGUgInZpc2libGVfdW5p
dHMuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNkZWZpbmUgX1NZU19HVUlEX09QRVJBVE9S
U18KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzUmVmUHRyPENsaXBib2FyZD4gRWRpdG9y
OjpuZXdHZW5lcmFsQ2xpcGJvYXJkKENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3kpCit7Cisg
ICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBDbGlwYm9hcmRXaW5jZShwb2xpY3ksIGZhbHNlKSk7Cit9
CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
d2luY2UvRmlsZUNob29zZXJXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVD
aG9vc2VyV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Yzk5
YjEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2Vy
V2luY2UuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIw
MDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3
LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJGaWxlQ2hvb3Nlci5oIgorCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAi
Q2hyb21lQ2xpZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZS5o
IgorI2luY2x1ZGUgIkljb24uaCIKKyNpbmNsdWRlICJMb2NhbGl6ZWRTdHJpbmdzLmgiCisjaW5j
bHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlN0cmluZ1RydW5jYXRvci5oIgorCituYW1lc3BhY2Ug
V2ViQ29yZSB7CisKK1N0cmluZyBwYXRoR2V0RmlsZU5hbWUoY29uc3QgU3RyaW5nJiBwYXRoKTsK
KworU3RyaW5nIEZpbGVDaG9vc2VyOjpiYXNlbmFtZUZvcldpZHRoKGNvbnN0IEZvbnQmIGZvbnQs
IGludCB3aWR0aCkgY29uc3QKK3sKKyAgICBpZiAod2lkdGggPD0gMCkKKyAgICAgICAgcmV0dXJu
IFN0cmluZygpOworCisgICAgU3RyaW5nIHN0cmluZzsKKyAgICBpZiAobV9maWxlbmFtZXMuaXNF
bXB0eSgpKQorICAgICAgICBzdHJpbmcgPSBmaWxlQnV0dG9uTm9GaWxlU2VsZWN0ZWRMYWJlbCgp
OworICAgIGVsc2UgaWYgKG1fZmlsZW5hbWVzLnNpemUoKSA9PSAxKSB7CisgICAgICAgIFN0cmlu
ZyB0bXBGaWxlbmFtZSA9IG1fZmlsZW5hbWVzWzBdOworICAgICAgICBzdHJpbmcgPSBwYXRoR2V0
RmlsZU5hbWUodG1wRmlsZW5hbWUpOworICAgIH0gZWxzZQorICAgICAgICByZXR1cm4gU3RyaW5n
VHJ1bmNhdG9yOjpyaWdodFRydW5jYXRlKFN0cmluZzo6bnVtYmVyKG1fZmlsZW5hbWVzLnNpemUo
KSkgKyAiIGZpbGVzIiwgd2lkdGgsIGZvbnQsIGZhbHNlKTsKKworICAgIHJldHVybiBTdHJpbmdU
cnVuY2F0b3I6OmNlbnRlclRydW5jYXRlKHN0cmluZywgd2lkdGgsIGZvbnQsIGZhbHNlKTsKK30K
KworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlU3lzdGVtV2luY2Uu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlU3lzdGVtV2luY2UuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYjRkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHAKQEAgLTAsMCArMSwyODMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IENvbGxhYm9yYSwgTHRkLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLiAKKyAqIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLiAKKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1
dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1
dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAor
ICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4g
cGVybWlzc2lvbi4gCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZpbGVTeXN0ZW0uaCIKKworI2luY2x1ZGUg
IkNTdHJpbmcuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorCisjaW5jbHVkZSA8d2lu
ZG93cy5oPgorI2luY2x1ZGUgPHdpbmNyeXB0Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwor
c3RhdGljIGJvb2wgZ2V0RmlsZUluZm8oY29uc3QgU3RyaW5nJiBwYXRoLCBCWV9IQU5ETEVfRklM
RV9JTkZPUk1BVElPTiYgZmlsZUluZm8pCit7CisgICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aDsK
KyAgICBIQU5ETEUgaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVs
bFRlcm1pbmF0aW9uKCksIEdFTkVSSUNfUkVBRCwgRklMRV9TSEFSRV9SRUFELCAwCisgICAgICAg
ICwgT1BFTl9FWElTVElORywgRklMRV9GTEFHX05PX0JVRkZFUklORywgMCk7CisKKyAgICBpZiAo
aEZpbGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgIGJvb2wgcnRuID0gR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoaEZpbGUsICZmaWxlSW5m
bykgPyB0cnVlIDogZmFsc2U7CisKKyAgICBDbG9zZUhhbmRsZShoRmlsZSk7CisgICAgcmV0dXJu
IHJ0bjsKK30KKworYm9vbCBnZXRGaWxlU2l6ZShjb25zdCBTdHJpbmcmIHBhdGgsIGxvbmcgbG9u
ZyYgcmVzdWx0KQoreworICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGZpbGVJbmZvcm1h
dGlvbjsKKyAgICBpZiAoIWdldEZpbGVJbmZvKHBhdGgsIGZpbGVJbmZvcm1hdGlvbikpCisgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgIFVMQVJHRV9JTlRFR0VSIGZpbGVTaXplOworICAgIGZp
bGVTaXplLkxvd1BhcnQgPSBmaWxlSW5mb3JtYXRpb24ubkZpbGVTaXplTG93OworICAgIGZpbGVT
aXplLkhpZ2hQYXJ0ID0gZmlsZUluZm9ybWF0aW9uLm5GaWxlU2l6ZUhpZ2g7CisKKyAgICByZXN1
bHQgPSBmaWxlU2l6ZS5RdWFkUGFydDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGdl
dEZpbGVNb2RpZmljYXRpb25UaW1lKGNvbnN0IFN0cmluZyYgcGF0aCwgdGltZV90JiByZXN1bHQp
Cit7CisgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gZmlsZUluZm9ybWF0aW9uOworICAg
IGlmICghZ2V0RmlsZUluZm8ocGF0aCwgZmlsZUluZm9ybWF0aW9uKSkKKyAgICAgICAgcmV0dXJu
IGZhbHNlOworCisgICAgVUxBUkdFX0lOVEVHRVIgdDsKKyAgICBtZW1jcHkoJnQsICZmaWxlSW5m
b3JtYXRpb24uZnRMYXN0V3JpdGVUaW1lLCBzaXplb2YodCkpOworICAgIAorICAgIHJlc3VsdCA9
IHQuUXVhZFBhcnQgKiAwLjAwMDAwMDEgLSAxMTY0NDQ3MzYwMC4wOworCisgICAgcmV0dXJuIHRy
dWU7Cit9CisKK2Jvb2wgZmlsZUV4aXN0cyhjb25zdCBTdHJpbmcmIHBhdGgpIAoreworICAgIFN0
cmluZyBmaWxlbmFtZSA9IHBhdGg7CisgICAgSEFORExFIGhGaWxlID0gQ3JlYXRlRmlsZShmaWxl
bmFtZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwLCBGSUxFX1NIQVJFX1JFQUQg
fCBGSUxFX1NIQVJFX1dSSVRFCisgICAgICAgICwgMCwgT1BFTl9FWElTVElORywgRklMRV9GTEFH
X05PX0JVRkZFUklORywgMCk7CisKKyAgICBDbG9zZUhhbmRsZShoRmlsZSk7CisKKyAgICByZXR1
cm4gaEZpbGUgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7Cit9CisKK2Jvb2wgZGVsZXRlRmlsZShj
b25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aDsKKyAgICBy
ZXR1cm4gISFEZWxldGVGaWxlVyhmaWxlbmFtZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlv
bigpKTsKK30KKworCitib29sIGRlbGV0ZUVtcHR5RGlyZWN0b3J5KGNvbnN0IFN0cmluZyYgcGF0
aCkKK3sKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAgIHJldHVybiAhIVJlbW92ZURp
cmVjdG9yeVcoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7Cit9CisK
K1N0cmluZyBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoY29uc3QgU3RyaW5nJiBwYXRoLCBjb25z
dCBTdHJpbmcmIGNvbXBvbmVudCkKK3sKKyAgICBpZiAoY29tcG9uZW50LmlzRW1wdHkoKSkKKyAg
ICAgICAgcmV0dXJuIHBhdGg7CisKKyAgICBWZWN0b3I8VUNoYXIsIE1BWF9QQVRIPiBidWZmZXI7
CisKKyAgICBidWZmZXIuYXBwZW5kKHBhdGguY2hhcmFjdGVycygpLCBwYXRoLmxlbmd0aCgpKTsK
KworICAgIGlmIChidWZmZXIubGFzdCgpICE9IEwnXFwnICYmIGJ1ZmZlci5sYXN0KCkgIT0gTCcv
JworICAgICAgICAmJiBjb21wb25lbnRbMF0gIT0gTCdcXCcgJiYgY29tcG9uZW50WzBdICE9IEwn
LycpCisgICAgICAgIGJ1ZmZlci5hcHBlbmQoTCdcXCcpOworCisgICAgYnVmZmVyLmFwcGVuZChj
b21wb25lbnQuY2hhcmFjdGVycygpLCBjb21wb25lbnQubGVuZ3RoKCkpOworCisgICAgcmV0dXJu
IFN0cmluZyhidWZmZXIuZGF0YSgpLCBidWZmZXIuc2l6ZSgpKTsKK30KKworQ1N0cmluZyBmaWxl
U3lzdGVtUmVwcmVzZW50YXRpb24oY29uc3QgU3RyaW5nJikKK3sKKyAgICByZXR1cm4gIiI7Cit9
CisKK2Jvb2wgbWFrZUFsbERpcmVjdG9yaWVzKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAgICBp
bnQgbGFzdERpdlBvcyA9IG1heChwYXRoLnJldmVyc2VGaW5kKCcvJyksIHBhdGgucmV2ZXJzZUZp
bmQoJ1xcJykpOworICAgIGludCBlbmRQb3MgPSBwYXRoLmxlbmd0aCgpOworICAgIGlmIChsYXN0
RGl2UG9zID09IHBhdGgubGVuZ3RoKCkgLSAxKSB7CisgICAgICAgIGVuZFBvcyAtPSAxOworICAg
ICAgICBsYXN0RGl2UG9zID0gbWF4KHBhdGgucmV2ZXJzZUZpbmQoJy8nLCBsYXN0RGl2UG9zKSwg
cGF0aC5yZXZlcnNlRmluZCgnXFwnLCBsYXN0RGl2UG9zKSk7CisgICAgfQorCisgICAgaWYgKGxh
c3REaXZQb3MgPiAwKSB7CisgICAgICAgIGlmICghbWFrZUFsbERpcmVjdG9yaWVzKHBhdGguc3Vi
c3RyaW5nKDAsIGxhc3REaXZQb3MpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisKKyAgICBTdHJpbmcgZm9sZGVyKHBhdGguc3Vic3RyaW5nKDAsIGVuZFBvcykpOworICAgIENy
ZWF0ZURpcmVjdG9yeShmb2xkZXIuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgMCk7
CisKKyAgICBEV09SRCBmaWxlQXR0ciA9IEdldEZpbGVBdHRyaWJ1dGVzKGZvbGRlci5jaGFyYWN0
ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICByZXR1cm4gZmlsZUF0dHIgIT0gMHhGRkZG
RkZGRiAmJiAoZmlsZUF0dHIgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpOworfQorCitTdHJp
bmcgaG9tZURpcmVjdG9yeVBhdGgoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0
dXJuICIiOworfQorCitTdHJpbmcgcGF0aEdldEZpbGVOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCkK
K3sKKyAgICByZXR1cm4gcGF0aC5zdWJzdHJpbmcobWF4KHBhdGgucmV2ZXJzZUZpbmQoJy8nKSwg
cGF0aC5yZXZlcnNlRmluZCgnXFwnKSkgKyAxKTsKK30KKworU3RyaW5nIGRpcmVjdG9yeU5hbWUo
Y29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJu
IFN0cmluZygpOworfQorCitDU3RyaW5nIG9wZW5UZW1wb3JhcnlGaWxlKGNvbnN0IGNoYXIqLCBQ
bGF0Zm9ybUZpbGVIYW5kbGUmIGhhbmRsZSkKK3sKKyAgICBoYW5kbGUgPSBJTlZBTElEX0hBTkRM
RV9WQUxVRTsKKworICAgIHdjaGFyX3QgdGVtcFBhdGhbTUFYX1BBVEhdOworICAgIGludCB0ZW1w
UGF0aExlbmd0aCA9IDo6R2V0VGVtcFBhdGgoX2NvdW50b2YodGVtcFBhdGgpLCB0ZW1wUGF0aCk7
CisgICAgaWYgKHRlbXBQYXRoTGVuZ3RoIDw9IDAgfHwgdGVtcFBhdGhMZW5ndGggPiBfY291bnRv
Zih0ZW1wUGF0aCkpCisgICAgICAgIHJldHVybiBDU3RyaW5nKCk7CisKKyAgICBIQ1JZUFRQUk9W
IGhDcnlwdFByb3YgPSAwOworICAgIGlmICghQ3J5cHRBY3F1aXJlQ29udGV4dCgmaENyeXB0UHJv
diwgMCwgMCwgUFJPVl9SU0FfRlVMTCwgQ1JZUFRfVkVSSUZZQ09OVEVYVCkpCisgICAgICAgIHJl
dHVybiBDU3RyaW5nKCk7CisKKyAgICBTdHJpbmcgcHJvcG9zZWRQYXRoOworICAgIHdoaWxlICgx
KSB7CisKKyAgICAgICAgd2NoYXJfdCB0ZW1wRmlsZVtdID0gTCJYWFhYWFhYWC50bXAiOyAvLyBV
c2UgOC4zIHN0eWxlIG5hbWUgKG1vcmUgY2hhcmFjdGVycyBhcmVuJ3QgaGVscGZ1bCBkdWUgdG8g
OC4zIHNob3J0IGZpbGUgbmFtZXMpCisgICAgICAgIGNvbnN0IGludCByYW5kb21QYXJ0TGVuZ3Ro
ID0gODsKKyAgICAgICAgaWYgKCFDcnlwdEdlblJhbmRvbShoQ3J5cHRQcm92LCByYW5kb21QYXJ0
TGVuZ3RoICogMiwgcmVpbnRlcnByZXRfY2FzdDxCWVRFKj4odGVtcEZpbGUpKSkKKyAgICAgICAg
ICAgIGJyZWFrOworCisgICAgICAgIC8vIExpbWl0IHRvIHZhbGlkIGZpbGVzeXN0ZW0gY2hhcmFj
dGVycywgYWxzbyBleGNsdWRpbmcgb3RoZXJzIHRoYXQgY291bGQgYmUgcHJvYmxlbWF0aWMsIGxp
a2UgcHVuY3R1YXRpb24uCisgICAgICAgIC8vIGRvbid0IGluY2x1ZGUgYm90aCB1cHBlciBhbmQg
bG93ZXJjYXNlIHNpbmNlIFdpbmRvd3MgZmlsZSBzeXN0ZW1zIGFyZSB0eXBpY2FsbHkgbm90IGNh
c2Ugc2Vuc2l0aXZlLgorICAgICAgICBjb25zdCBjaGFyIHZhbGlkQ2hhcnNbXSA9ICIwMTIzNDU2
Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworICAgICAgICBmb3IgKGludCBpID0gMDsg
aSA8IHJhbmRvbVBhcnRMZW5ndGg7ICsraSkKKyAgICAgICAgICAgIHRlbXBGaWxlW2ldID0gdmFs
aWRDaGFyc1t0ZW1wRmlsZVtpXSAlIChzaXplb2YodmFsaWRDaGFycykgLSAxKV07CisKKyAgICAg
ICAgQVNTRVJUKHdjc2xlbih0ZW1wRmlsZSkgKiAyID09IHNpemVvZih0ZW1wRmlsZSkgLSAyKTsK
KworICAgICAgICBwcm9wb3NlZFBhdGggPSBwYXRoQnlBcHBlbmRpbmdDb21wb25lbnQoU3RyaW5n
KHRlbXBQYXRoKSwgU3RyaW5nKHRlbXBGaWxlKSk7CisKKyAgICAgICAgLy8gdXNlIENSRUFURV9O
RVcgdG8gYXZvaWQgb3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZmlsZSB3aXRoIHRoZSBzYW1lIG5h
bWUKKyAgICAgICAgaGFuZGxlID0gQ3JlYXRlRmlsZShwcm9wb3NlZFBhdGguY2hhcmFjdGVyc1dp
dGhOdWxsVGVybWluYXRpb24oKSwgR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSwgMCwgMCwg
Q1JFQVRFX05FVywgRklMRV9BVFRSSUJVVEVfTk9STUFMLCAwKTsKKyAgICAgICAgaWYgKCFpc0hh
bmRsZVZhbGlkKGhhbmRsZSkgJiYgR2V0TGFzdEVycm9yKCkgPT0gRVJST1JfQUxSRUFEWV9FWElT
VFMpCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAg
ICBDcnlwdFJlbGVhc2VDb250ZXh0KGhDcnlwdFByb3YsIDApOworCisgICAgaWYgKCFpc0hhbmRs
ZVZhbGlkKGhhbmRsZSkpCisgICAgICAgIHJldHVybiBDU3RyaW5nKCk7CisKKyAgICByZXR1cm4g
cHJvcG9zZWRQYXRoLmxhdGluMSgpOworfQorCit2b2lkIGNsb3NlRmlsZShQbGF0Zm9ybUZpbGVI
YW5kbGUmIGhhbmRsZSkKK3sKKyAgICBpZiAoaXNIYW5kbGVWYWxpZChoYW5kbGUpKSB7CisgICAg
ICAgIDo6Q2xvc2VIYW5kbGUoaGFuZGxlKTsKKyAgICAgICAgaGFuZGxlID0gaW52YWxpZFBsYXRm
b3JtRmlsZUhhbmRsZTsKKyAgICB9Cit9CisKK2ludCB3cml0ZVRvRmlsZShQbGF0Zm9ybUZpbGVI
YW5kbGUgaGFuZGxlLCBjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuZ3RoKQoreworICAgIGlmICgh
aXNIYW5kbGVWYWxpZChoYW5kbGUpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBEV09SRCBi
eXRlc1dyaXR0ZW47CisgICAgYm9vbCBzdWNjZXNzID0gV3JpdGVGaWxlKGhhbmRsZSwgZGF0YSwg
bGVuZ3RoLCAmYnl0ZXNXcml0dGVuLCAwKTsKKworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAg
cmV0dXJuIC0xOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGJ5dGVzV3JpdHRlbik7Cit9
CisKK2Jvb2wgdW5sb2FkTW9kdWxlKFBsYXRmb3JtTW9kdWxlIG1vZHVsZSkKK3sKKyAgICByZXR1
cm4gOjpGcmVlTGlicmFyeShtb2R1bGUpOworfQorCitTdHJpbmcgbG9jYWxVc2VyU3BlY2lmaWNT
dG9yYWdlRGlyZWN0b3J5KCkKK3sKKyAgICByZXR1cm4gU3RyaW5nKEwiXFwiKTsKK30KKworU3Ry
aW5nIHJvYW1pbmdVc2VyU3BlY2lmaWNTdG9yYWdlRGlyZWN0b3J5KCkKK3sKKyAgICByZXR1cm4g
U3RyaW5nKEwiXFwiKTsKK30KKworVmVjdG9yPFN0cmluZz4gbGlzdERpcmVjdG9yeShjb25zdCBT
dHJpbmcmIHBhdGgsIGNvbnN0IFN0cmluZyYgZmlsdGVyKQoreworICAgIFZlY3RvcjxTdHJpbmc+
IGVudHJpZXM7CisKKyAgICBWZWN0b3I8VUNoYXIsIDI1Nj4gcGF0dGVybjsKKyAgICBwYXR0ZXJu
LmFwcGVuZChwYXRoLmNoYXJhY3RlcnMoKSwgcGF0aC5sZW5ndGgoKSk7CisgICAgaWYgKHBhdHRl
cm4ubGFzdCgpICE9IEwnLycgJiYgcGF0dGVybi5sYXN0KCkgIT0gTCdcXCcpCisgICAgICAgIHBh
dHRlcm4uYXBwZW5kKEwnXFwnKTsKKworICAgIFN0cmluZyByb290KHBhdHRlcm4uZGF0YSgpLCBw
YXR0ZXJuLnNpemUoKSk7CisgICAgcGF0dGVybi5hcHBlbmQoZmlsdGVyLmNoYXJhY3RlcnMoKSwg
ZmlsdGVyLmxlbmd0aCgpKTsKKyAgICBwYXR0ZXJuLmFwcGVuZCgwKTsKKworICAgIFdJTjMyX0ZJ
TkRfREFUQSBmaW5kRGF0YTsKKyAgICBIQU5ETEUgaEZpbmQgPSBGaW5kRmlyc3RGaWxlKHBhdHRl
cm4uZGF0YSgpLCAmZmluZERhdGEpOworICAgIGlmIChJTlZBTElEX0hBTkRMRV9WQUxVRSAhPSBo
RmluZCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgICAvLyBGSVhFTUU6IHNob3VsZCB3ZSBh
bHNvIGFkZCB0aGUgZm9sZGVycz8gVGhpcyBmdW5jdGlvbgorICAgICAgICAgICAgLy8gaXMgc28g
ZmFyIG9ubHkgY2FsbGVkIGJ5IFBsdWdpbkRhdGFiYXNlLmNwcCB0byBsaXN0CisgICAgICAgICAg
ICAvLyBhbGwgcGx1Z2lucyBpbiBhIGZvbGRlciwgd2hlcmUgaXQncyBub3Qgc3VwcG9zZWQgdG8g
bGlzdCBzdWItZm9sZGVycy4KKyAgICAgICAgICAgIGlmICghKGZpbmREYXRhLmR3RmlsZUF0dHJp
YnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKQorICAgICAgICAgICAgICAgIGVudHJp
ZXMuYXBwZW5kKHJvb3QgKyBmaW5kRGF0YS5jRmlsZU5hbWUpOworICAgICAgICB9IHdoaWxlIChG
aW5kTmV4dEZpbGUoaEZpbmQsICZmaW5kRGF0YSkpOworICAgICAgICBGaW5kQ2xvc2UoaEZpbmQp
OworICAgIH0KKworICAgIHJldHVybiBlbnRyaWVzOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNl
L0tVUkxXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhMWU0
YgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbmNlLmNw
cApAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmls
ZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKworU3RyaW5nIEtVUkw6OmZpbGVTeXN0ZW1QYXRoKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gcGF0aCgpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0tleWdlbldpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvS2V5Z2VuV2luY2Uu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMzMzMzgKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcApAQCAtMCww
ICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJ
bmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTU0xLZXlHZW5lcmF0b3IuaCIKKwor
I2luY2x1ZGUgIkJhc2U2NC5oIgorI2luY2x1ZGUgIkNTdHJpbmcuaCIKKworI2luY2x1ZGUgPHdp
bmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5jcnlwdC5oPgorCisjZGVmaW5lIEtFWUdFTl9ERUJVR19L
RVkgICAgICAgIDB4MDAwMDAwMDEKKworI2lmbmRlZiBOREVCVUcKKyNkZWZpbmUgS0VZR0VOX0RF
QlVHICAgICgwKQorI2Vsc2UKKyNkZWZpbmUgS0VZR0VOX0RFQlVHICAgIDAKKyNlbmRpZgorCitu
YW1lc3BhY2UgV2ViQ29yZSB7CisKK3ZvaWQgV2ViQ29yZTo6Z2V0U3VwcG9ydGVkS2V5U2l6ZXMo
VmVjdG9yPFN0cmluZz4mIHYpCit7CisgICAgdi5hcHBlbmQoIkhpZ2ggR3JhZGUiKTsKKyAgICB2
LmFwcGVuZCgiTWVkaXVtIEdyYWRlIik7Cit9CisKK1N0cmluZyBXZWJDb3JlOjpzaWduZWRQdWJs
aWNLZXlBbmRDaGFsbGVuZ2VTdHJpbmcodW5zaWduZWQgaW5kZXgsIGNvbnN0IFN0cmluZyYgY2hh
bGxlbmdlLCBjb25zdCBLVVJMJiB1cmwpCit7CisgICAgU3RyaW5nIGtleXN0cjsKKworICAgIEhD
UllQVFBST1YgaFByb3YgPSAwOworICAgIEhDUllQVEtFWSBoS2V5ID0gMDsKKyAgICBQQ0VSVF9Q
VUJMSUNfS0VZX0lORk8gcFB1YkluZm8gPSAwOworICAgIERXT1JEIGR3UHViSW5mb0xlbmd0aCA9
IDA7CisgICAgQ0VSVF9LRVlHRU5fUkVRVUVTVF9JTkZPIHJlcXVlc3RJbmZvOworICAgIENSWVBU
X0FMR09SSVRITV9JREVOVElGSUVSIHNpZ25BbGdvOworICAgIExQQllURSBwYkVuY29kZWQgPSAw
OworICAgIERXT1JEIGR3RW5jb2RlZExlbmd0aCA9IDA7CisgICAgTFBXU1RSIHBzelN0cmluZyA9
IDA7CisgICAgVmVjdG9yPGNoYXI+IGJpbmFyeTsKKyAgICBWZWN0b3I8Y2hhcj4gYmFzZTY0Owor
CisjaWYgZGVmaW5lZChLRVlHRU5fREVCVUcpICYmIChLRVlHRU5fREVCVUcgJiBLRVlHRU5fREVC
VUdfS0VZKQorICAgIHByaW50ZigiV2ViQ29yZTo6c2lnbmVkUHVibGljS2V5QW5kQ2hhbGxlbmdl
U3RyaW5nKCVkLCAlLipzKS5cbiIsIGluZGV4LCBjaGFsbGVuZ2UubGVuZ3RoKCksIGNoYWxsZW5n
ZS5sYXRpbjEoKS5kYXRhKCkpOworI2VuZGlmCisKKyAgICAvLyBUcnkgdG8gZGVsZXRlIG9mIGl0
IGV4aXN0cyBhbHJlYWR5CisgICAgQ3J5cHRBY3F1aXJlQ29udGV4dCgmaFByb3YsIF9UKCJrZXln
ZW5fY29udGFpbmVyIiksIE1TX0VOSEFOQ0VEX1BST1YsIFBST1ZfUlNBX0ZVTEwsIENSWVBUX0RF
TEVURUtFWVNFVCk7CisKKyAgICBCT09MIHN1Y2Nlc3MgPSBDcnlwdEFjcXVpcmVDb250ZXh0KCZo
UHJvdiwgX1QoImtleWdlbl9jb250YWluZXIiKSwgTVNfRU5IQU5DRURfUFJPViwgUFJPVl9SU0Ff
RlVMTCwgQ1JZUFRfTkVXS0VZU0VUKTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIGdvdG8g
ZXJyb3I7CisKKyAgICBzdWNjZXNzID0gQ3J5cHRHZW5LZXkoaFByb3YsIEFUX0tFWUVYQ0hBTkdF
LCAwLCAmaEtleSk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICBnb3RvIGVycm9yOworCisg
ICAgc3VjY2VzcyA9IENyeXB0RXhwb3J0UHVibGljS2V5SW5mbyhoUHJvdiwgQVRfS0VZRVhDSEFO
R0UsIFg1MDlfQVNOX0VOQ09ESU5HLCAwLCAmZHdQdWJJbmZvTGVuZ3RoKTsKKyAgICBpZiAoIXN1
Y2Nlc3MpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBwUHViSW5mbyA9IChQQ0VSVF9QVUJM
SUNfS0VZX0lORk8pIG5ldyBjaGFyW2R3UHViSW5mb0xlbmd0aF07CisgICAgaWYgKCFwUHViSW5m
bykKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHN1Y2Nlc3MgPSBDcnlwdEV4cG9ydFB1Ymxp
Y0tleUluZm8oaFByb3YsIEFUX0tFWUVYQ0hBTkdFLCBYNTA5X0FTTl9FTkNPRElORywgcFB1Yklu
Zm8sICZkd1B1YkluZm9MZW5ndGgpOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgZ290byBl
cnJvcjsKKworICAgIHJlcXVlc3RJbmZvLmR3VmVyc2lvbiA9IENFUlRfS0VZR0VOX1JFUVVFU1Rf
VjE7CisgICAgcmVxdWVzdEluZm8ucHdzekNoYWxsZW5nZVN0cmluZyA9IEwiIjsKKyAgICByZXF1
ZXN0SW5mby5TdWJqZWN0UHVibGljS2V5SW5mbyA9ICpwUHViSW5mbzsKKworICAgIGlmIChjaGFs
bGVuZ2UubGVuZ3RoKCkpIHsKKyAgICAgICAgcHN6U3RyaW5nID0gbmV3IFdDSEFSW2NoYWxsZW5n
ZS5sZW5ndGgoKSArIDFdOworICAgICAgICBpZiAocHN6U3RyaW5nKSB7CisgICAgICAgICAgICB3
Y3NuY3B5KHBzelN0cmluZywgY2hhbGxlbmdlLmNoYXJhY3RlcnMoKSwgY2hhbGxlbmdlLmxlbmd0
aCgpKTsKKyAgICAgICAgICAgIHBzelN0cmluZ1tjaGFsbGVuZ2UubGVuZ3RoKCldID0gMDsKKyAg
ICAgICAgICAgIHJlcXVlc3RJbmZvLnB3c3pDaGFsbGVuZ2VTdHJpbmcgPSBwc3pTdHJpbmc7Cisg
ICAgICAgIH0KKyAgICB9CisKKyAgICBTZWN1cmVaZXJvTWVtb3J5KCZzaWduQWxnbywgc2l6ZW9m
KENSWVBUX0FMR09SSVRITV9JREVOVElGSUVSKSk7CisgICAgc2lnbkFsZ28ucHN6T2JqSWQgPSBz
ek9JRF9SU0FfU0hBMVJTQTsKKworICAgIHN1Y2Nlc3MgPSBDcnlwdFNpZ25BbmRFbmNvZGVDZXJ0
aWZpY2F0ZShoUHJvdiwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBYNTA5X0tF
WUdFTl9SRVFVRVNUX1RPX0JFX1NJR05FRCwKKyAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RJ
bmZvLCAmc2lnbkFsZ28sIDAsIDAsICZkd0VuY29kZWRMZW5ndGgpOworICAgIGlmICghc3VjY2Vz
cykKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHBiRW5jb2RlZCA9IChMUEJZVEUpIG5ldyBj
aGFyW2R3RW5jb2RlZExlbmd0aF07CisgICAgaWYgKCFwYkVuY29kZWQpCisgICAgICAgIGdvdG8g
ZXJyb3I7CisKKyAgICBzdWNjZXNzID0gQ3J5cHRTaWduQW5kRW5jb2RlQ2VydGlmaWNhdGUoaFBy
b3YsIEFUX0tFWUVYQ0hBTkdFLCBYNTA5X0FTTl9FTkNPRElORywgWDUwOV9LRVlHRU5fUkVRVUVT
VF9UT19CRV9TSUdORUQsCisgICAgICAgICAgICAgICAgICAgICZyZXF1ZXN0SW5mbywgJnNpZ25B
bGdvLCAwLCBwYkVuY29kZWQsICZkd0VuY29kZWRMZW5ndGgpOworICAgIGlmICghc3VjY2VzcykK
KyAgICAgICAgZ290byBlcnJvcjsKKworICAgIGJpbmFyeS5yZXNpemUoZHdFbmNvZGVkTGVuZ3Ro
KTsKKyAgICBmb3IgKERXT1JEIGkgPSAwOyBpIDwgZHdFbmNvZGVkTGVuZ3RoOyArK2kpCisgICAg
ICAgIGJpbmFyeVtpXSA9IHBiRW5jb2RlZFtpXTsKKworICAgIGJhc2U2NEVuY29kZShiaW5hcnks
IGJhc2U2NCk7CisgICAgaWYgKGJhc2U2NC5zaXplKCkpIHsKKyAgICAgICAgU3RyaW5nIHRlbXBz
dHIoYmFzZTY0LmRhdGEoKSwgYmFzZTY0LnNpemUoKSk7CisgICAgICAgIGtleXN0ci5pbnNlcnQo
dGVtcHN0ciwgMCk7CisgICAgfQorCitlcnJvcjoKKyAgICBpZiAocHN6U3RyaW5nKQorICAgICAg
ICBkZWxldGVbXSBwc3pTdHJpbmc7CisgICAgaWYgKHBiRW5jb2RlZCkKKyAgICAgICAgZGVsZXRl
W10gcGJFbmNvZGVkOworICAgIGlmIChwUHViSW5mbykKKyAgICAgICAgZGVsZXRlW10gcFB1Yklu
Zm87CisgICAgaWYgKGhLZXkpCisgICAgICAgIENyeXB0RGVzdHJveUtleShoS2V5KTsKKyAgICBp
ZiAoaFByb3YpCisgICAgICAgIENyeXB0UmVsZWFzZUNvbnRleHQoaFByb3YsIDApOworCisgICAg
cmV0dXJuIGtleXN0cjsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2UuY3BwIGIvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUg
MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2RlNDgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL01JTUVUeXBlUmVnaXN0cnlXaW5jZS5jcHAKQEAgLTAsMCArMSwxMzUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5j
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNSU1FVHlwZVJlZ2lzdHJ5
LmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2lucmVnLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKworc3RhdGljIFN0cmluZyBtaW1lVHlwZUZvckV4dGVuc2lvbihjb25z
dCBTdHJpbmcmIGV4dGVuc2lvbikKK3sKKyAgICBTdHJpbmcgZXh0ID0gIi4iICsgZXh0ZW5zaW9u
OworICAgIFdDSEFSIGNvbnRlbnRUeXBlU3RyWzI1Nl07CisgICAgRFdPUkQgY29udGVudFR5cGVT
dHJMZW4gPSBzaXplb2YoY29udGVudFR5cGVTdHIpOworICAgIERXT1JEIHZhbHVlVHlwZTsKKwor
ICAgIEhLRVkga2V5OworICAgIFN0cmluZyByZXN1bHQ7CisgICAgaWYgKEVSUk9SX1NVQ0NFU1Mg
IT0gUmVnT3BlbktleUV4KEhLRVlfQ0xBU1NFU19ST09ULCBleHQuY2hhcmFjdGVyc1dpdGhOdWxs
VGVybWluYXRpb24oKSwgMCwgMCwgJmtleSkpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisKKyAg
ICBpZiAoRVJST1JfU1VDQ0VTUyA9PSBSZWdRdWVyeVZhbHVlRXgoa2V5LCBMIkNvbnRlbnQgVHlw
ZSIsIDAsICZ2YWx1ZVR5cGUsIChMUEJZVEUpY29udGVudFR5cGVTdHIsICZjb250ZW50VHlwZVN0
ckxlbikgJiYgdmFsdWVUeXBlID09IFJFR19TWikKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nKGNv
bnRlbnRUeXBlU3RyLCBjb250ZW50VHlwZVN0ckxlbiAvIHNpemVvZihjb250ZW50VHlwZVN0clsw
XSkgLSAxKTsKKworICAgIFJlZ0Nsb3NlS2V5KGtleSk7CisKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCitzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWltZXR5cGVNYXA7CisKK3N0YXRp
YyB2b2lkIGluaXRNSU1FVHlwZUVudGVuc2lvbk1hcCgpCit7CisgICAgaWYgKG1pbWV0eXBlTWFw
LmlzRW1wdHkoKSkgeworICAgICAgICAvL2ZpbGwgd2l0aCBpbml0aWFsIHZhbHVlcworICAgICAg
ICBtaW1ldHlwZU1hcC5hZGQoInR4dCIsICJ0ZXh0L3BsYWluIik7CisgICAgICAgIG1pbWV0eXBl
TWFwLmFkZCgicGRmIiwgImFwcGxpY2F0aW9uL3BkZiIpOworICAgICAgICBtaW1ldHlwZU1hcC5h
ZGQoInBzIiwgImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQiKTsKKyAgICAgICAgbWltZXR5cGVNYXAu
YWRkKCJodG1sIiwgInRleHQvaHRtbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImh0bSIs
ICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ4bWwiLCAidGV4dC94bWwi
KTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ4c2wiLCAidGV4dC94c2wiKTsKKyAgICAgICAg
bWltZXR5cGVNYXAuYWRkKCJqcyIsICJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKTsKKyAgICAg
ICAgbWltZXR5cGVNYXAuYWRkKCJ4aHRtbCIsICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiKTsKKyAg
ICAgICAgbWltZXR5cGVNYXAuYWRkKCJyc3MiLCAiYXBwbGljYXRpb24vcnNzK3htbCIpOworICAg
ICAgICBtaW1ldHlwZU1hcC5hZGQoIndlYmFyY2hpdmUiLCAiYXBwbGljYXRpb24veC13ZWJhcmNo
aXZlIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgic3ZnIiwgImltYWdlL3N2Zyt4bWwiKTsK
KyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJzdmd6IiwgImltYWdlL3N2Zyt4bWwiKTsKKyAgICAg
ICAgbWltZXR5cGVNYXAuYWRkKCJqcGciLCAiaW1hZ2UvanBlZyIpOworICAgICAgICBtaW1ldHlw
ZU1hcC5hZGQoImpwZWciLCAiaW1hZ2UvanBlZyIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQo
InBuZyIsICJpbWFnZS9wbmciKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ0aWYiLCAiaW1h
Z2UvdGlmZiIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInRpZmYiLCAiaW1hZ2UvdGlmZiIp
OworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImljbyIsICJpbWFnZS9pY28iKTsKKyAgICAgICAg
bWltZXR5cGVNYXAuYWRkKCJjdXIiLCAiaW1hZ2UvaWNvIik7CisgICAgICAgIG1pbWV0eXBlTWFw
LmFkZCgiYm1wIiwgImltYWdlL2JtcCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImNzcyIs
ICJ0ZXh0L2NzcyIpOworICAgICAgICAvLyBGSVhNRTogQ3VzdG9tIGZvbnQgd29ya3Mgb25seSB3
aGVuIE1JTUUgaXMgInRleHQvcGxhaW4iCisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgidHRmIiwg
InRleHQvcGxhaW4iKTsgLy8gImZvbnQvdHRmIgorICAgICAgICBtaW1ldHlwZU1hcC5hZGQoIm90
ZiIsICJ0ZXh0L3BsYWluIik7IC8vICJmb250L290ZiIKKyNpZiBFTkFCTEUoV01MKQorICAgICAg
ICBtaW1ldHlwZU1hcC5hZGQoIndtbCIsICJ0ZXh0L3ZuZC53YXAud21sIik7CisjZW5kaWYKKyNp
ZiBFTkFCTEUoV0JYTUwpCisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid2J4bWwiLCAiYXBwbGlj
YXRpb24vdm5kLndhcC53bWxjIik7CisjZW5kaWYKKyAgICB9Cit9CisKK1N0cmluZyBNSU1FVHlw
ZVJlZ2lzdHJ5OjpnZXRQcmVmZXJyZWRFeHRlbnNpb25Gb3JNSU1FVHlwZShjb25zdCBTdHJpbmcm
IHR5cGUpCit7CisgICAgaWYgKHR5cGUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gU3RyaW5n
KCk7CisKKyAgICAvLyBBdm9pZCBjb25mbGljdHMgd2l0aCAidHRmIiBhbmQgIm90ZiIKKyAgICBp
ZiAoZXF1YWxJZ25vcmluZ0Nhc2UodHlwZSwgInRleHQvcGxhaW4iKSkKKyAgICAgICAgcmV0dXJu
ICJ0eHQiOworCisgICAgaW5pdE1JTUVUeXBlRW50ZW5zaW9uTWFwKCk7CisKKyAgICBmb3IgKEhh
c2hNYXA8U3RyaW5nLCBTdHJpbmc+OjppdGVyYXRvciBpID0gbWltZXR5cGVNYXAuYmVnaW4oKTsg
aSAhPSBtaW1ldHlwZU1hcC5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmIChlcXVhbElnbm9yaW5n
Q2FzZShpLT5zZWNvbmQsIHR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGktPmZpcnN0OworICAg
IH0KKworI2lmIEVOQUJMRShYSFRNTE1QKQorICAgIGlmIChlcXVhbElnbm9yaW5nQ2FzZSgiYXBw
bGljYXRpb24vdm5kLndhcC54aHRtbCt4bWwiLCB0eXBlKSkKKyAgICAgICAgcmV0dXJuIFN0cmlu
ZygieG1sIik7CisjZW5kaWYKKworICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworU3RyaW5nIE1J
TUVUeXBlUmVnaXN0cnk6OmdldE1JTUVUeXBlRm9yRXh0ZW5zaW9uKGNvbnN0IFN0cmluZyAmZXh0
KQoreworICAgIGlmIChleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisK
KyAgICBpbml0TUlNRVR5cGVFbnRlbnNpb25NYXAoKTsKKworICAgIFN0cmluZyByZXN1bHQgPSBt
aW1ldHlwZU1hcC5nZXQoZXh0Lmxvd2VyKCkpOworICAgIGlmIChyZXN1bHQuaXNFbXB0eSgpKSB7
CisgICAgICAgIHJlc3VsdCA9IG1pbWVUeXBlRm9yRXh0ZW5zaW9uKGV4dCk7CisgICAgICAgIGlm
ICghcmVzdWx0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1pbWV0eXBlTWFwLmFkZChleHQsIHJl
c3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuaXNFbXB0eSgpID8gInVua25vd24vdW5r
bm93biIgOiByZXN1bHQ7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvT3B0aW1pemVkQnVmZmVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvT3B0aW1pemVk
QnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTA4MjU4Ci0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9PcHRpbWl6ZWRCdWZmZXIu
Y3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3Jj
aCBNb2JpbGUgSW5jLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3Ug
Y2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMg
b2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hl
ZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBv
ZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq
CisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxs
IGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRo
ZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUx
IEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEs
IFVTQS4KKyAqLworCisjZGVmaW5lIEVYUE9SVF9PUFRJTUlaRURfQlVGRkVSIF9fZGVjbHNwZWMo
ZGxsZXhwb3J0KQorCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiT3B0aW1pemVkQnVm
ZmVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworT3B0aW1pemVkQnVmZmVyOjpDcmVhdG9y
IE9wdGltaXplZEJ1ZmZlcjo6bV9jcmVhdG9yID0gMDsKKworT3B0aW1pemVkQnVmZmVyOjpDcmVh
dG9yIE9wdGltaXplZEJ1ZmZlcjo6c2V0Q3JlYXRvcihDcmVhdG9yIG5ld0NyZWF0b3IpCit7Cisg
ICAgQ3JlYXRvciBvbGRDcmVhdG9yID0gbV9jcmVhdG9yOworICAgIG1fY3JlYXRvciA9IG5ld0Ny
ZWF0b3I7CisgICAgcmV0dXJuIG9sZENyZWF0b3I7Cit9CisKK09wdGltaXplZEJ1ZmZlciogT3B0
aW1pemVkQnVmZmVyOjpjcmVhdGVJbnN0YW5jZSh1bnNpZ25lZCBleHBlY3RlZFNpemUsIE9wdGlt
aXplZEJ1ZmZlciogb2xkQnVmZmVyLCBib29sIHB1cmdlYWJsZSkKK3sKKyAgICByZXR1cm4gbV9j
cmVhdG9yID8gbV9jcmVhdG9yKGV4cGVjdGVkU2l6ZSwgb2xkQnVmZmVyLCBwdXJnZWFibGUpIDog
MDsKK30KKwordm9pZCBPcHRpbWl6ZWRCdWZmZXI6OmNvcHlUbyhPcHRpbWl6ZWRCdWZmZXImIG8p
IGNvbnN0Cit7CisgICAgby5jbGVhcigpOworICAgIGNvbnN0IGNoYXIqIGRhdGE7CisgICAgdW5z
aWduZWQgcG9zID0gMDsKKyAgICB3aGlsZSAodW5zaWduZWQgbGVuID0gZ2V0RGF0YSgmZGF0YSwg
cG9zKSkgeworICAgICAgICBvLmFwcGVuZChkYXRhLCBsZW4pOworICAgICAgICBwb3MgKz0gbGVu
OworICAgICAgICByZWxlYXNlRGF0YShkYXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgT3B0aW1pemVk
QnVmZmVyOjpjb3B5RnJvbShjb25zdCBPcHRpbWl6ZWRCdWZmZXImIG8pCit7CisgICAgY2xlYXIo
KTsKKyAgICBjb25zdCBjaGFyKiBkYXRhOworICAgIHVuc2lnbmVkIHBvcyA9IDA7CisgICAgd2hp
bGUgKHVuc2lnbmVkIGxlbiA9IG8uZ2V0RGF0YSgmZGF0YSwgcG9zKSkgeworICAgICAgICBhcHBl
bmQoZGF0YSwgbGVuKTsKKyAgICAgICAgcG9zICs9IGxlbjsKKyAgICAgICAgcmVsZWFzZURhdGEo
ZGF0YSk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL09wdGltaXplZEJ1ZmZlci5oIGIvV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9PcHRpbWl6ZWRCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi5lNTdmOTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9P
cHRpbWl6ZWRCdWZmZXIuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5k
ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
KiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9y
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBz
aG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgX09QVElN
SVpFRF9CVUZGRVJfSF8KKyNkZWZpbmUgX09QVElNSVpFRF9CVUZGRVJfSF8KKworI2lmbmRlZiBF
WFBPUlRfT1BUSU1JWkVEX0JVRkZFUgorI2RlZmluZSBFWFBPUlRfT1BUSU1JWkVEX0JVRkZFUgor
I2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIEVYUE9SVF9PUFRJTUla
RURfQlVGRkVSIE9wdGltaXplZEJ1ZmZlciB7CisgICAgcHVibGljOgorICAgICAgICBib29sIGlz
RW1wdHkoKSBjb25zdCB7IHJldHVybiAhbV9zaXplOyB9CisgICAgICAgIHVuc2lnbmVkIHNpemUo
KSBjb25zdCB7IHJldHVybiBtX3NpemU7IH0KKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBj
bGFzc05hbWUoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZWxmRGVsZXRlKCkg
PSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgY2xlYXIoKSA9IDA7CisgICAgICAgIHZpcnR1YWwg
dm9pZCBhcHBlbmQoY29uc3QgY2hhciogZGF0YSwgdW5zaWduZWQgbGVuKSA9IDA7CisgICAgICAg
IHZpcnR1YWwgdm9pZCBwcmVwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIHVuc2lnbmVkIGxlbikgPSAw
OworICAgICAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldERhdGEoY29uc3QgY2hhcioqIGRhdGEsIHVu
c2lnbmVkIHBvcyA9IDApIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VE
YXRhKGNvbnN0IGNoYXIqIGRhdGEpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4
dHJhY3REYXRhKGNoYXIqIGRhdGEsIHVuc2lnbmVkIHBvcyA9IDAsIHVuc2lnbmVkIGxlbiA9IC0x
KSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgYWxsb2NhdGVEYXRhVG9Xcml0
ZShjaGFyKiogZGF0YSwgdW5zaWduZWQgZGVzaXJlZExlbiA9IC0xKSA9IDA7CisgICAgICAgIHZp
cnR1YWwgT3B0aW1pemVkQnVmZmVyKiBjbG9uZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVh
bCB2b2lkIHBvcFNlZ21lbnQoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1B1cmdlYWJs
ZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdm9pZCBjb3B5VG8oT3B0aW1pemVkQnVmZmVyJiBvKSBj
b25zdDsKKyAgICAgICAgdm9pZCBjb3B5RnJvbShjb25zdCBPcHRpbWl6ZWRCdWZmZXImIG8pOwor
CisgICAgICAgIHN0YXRpYyBPcHRpbWl6ZWRCdWZmZXIqIGNyZWF0ZUluc3RhbmNlKHVuc2lnbmVk
IGV4cGVjdGVkU2l6ZSwgT3B0aW1pemVkQnVmZmVyKiBvbGRCdWZmZXIsIGJvb2wgcHVyZ2VhYmxl
ID0gZmFsc2UpOworICAgICAgICBzdGF0aWMgdm9pZCBkZWxldGVJbnN0YW5jZShPcHRpbWl6ZWRC
dWZmZXIqIGIpIHsgaWYgKGIpIGItPnNlbGZEZWxldGUoKTsgfQorICAgICAgICB0eXBlZGVmIE9w
dGltaXplZEJ1ZmZlciogKCpDcmVhdG9yKSh1bnNpZ25lZCBleHBlY3RlZFNpemUsIE9wdGltaXpl
ZEJ1ZmZlciogb2xkQnVmZmVyLCBib29sIHB1cmdlYWJsZSk7CisgICAgICAgIHN0YXRpYyBDcmVh
dG9yIHNldENyZWF0b3IoQ3JlYXRvcik7CisgICAgICAgIHN0YXRpYyBib29sIGlzQ3JlYXRvcklu
c3RhbGxlZCgpIHsgcmV0dXJuICEhbV9jcmVhdG9yOyB9CisgICAgcHJvdGVjdGVkOgorICAgICAg
ICBPcHRpbWl6ZWRCdWZmZXIoKSA6IG1fc2l6ZSgwKSB7fQorICAgICAgICB2aXJ0dWFsIH5PcHRp
bWl6ZWRCdWZmZXIoKSB7fQorICAgICAgICB1bnNpZ25lZCBtX3NpemU7CisgICAgICAgIHN0YXRp
YyBDcmVhdG9yIG1fY3JlYXRvcjsKKyAgICB9OworfQorCisjZW5kaWYgLy8gX09QVElNSVpFRF9C
VUZGRVJfSF8KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGFzdGVib2FyZFdp
bmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGFzdGVib2FyZFdpbmNlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE4NWI4Ci0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9QYXN0ZWJvYXJkV2luY2UuY3BwCkBAIC0wLDAgKzEs
MzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUs
IEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
Q09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGFzdGVib2Fy
ZC5oIgorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkNsaXBib2FyZFV0aWxpdGll
c1dpbi5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVu
dC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUg
IkhpdFRlc3RSZXN1bHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorI2luY2x1ZGUgIktVUkwuaCIK
KyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUmFuZ2UuaCIKKyNpbmNsdWRlICJSZW5kZXJJ
bWFnZS5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1ZGUgIm1hcmt1cC5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBVSU5UIEhUTUxDbGlwYm9hcmRGb3JtYXQg
PSAwOworc3RhdGljIFVJTlQgQm9va21hcmtDbGlwYm9hcmRGb3JtYXQgPSAwOworc3RhdGljIFVJ
TlQgV2ViU21hcnRQYXN0ZUZvcm1hdCA9IDA7CisKK2V4dGVybiBIREMgaFNjcmVlbkRDOworCitz
dGF0aWMgTFJFU1VMVCBDQUxMQkFDSyBQYXN0ZWJvYXJkT3duZXJXbmRQcm9jKEhXTkQgaFduZCwg
VUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIExSRVNV
TFQgbHJlc3VsdCA9IDA7CisgICAgTE9ORyBsb25nUHRyID0gR2V0V2luZG93TG9uZyhoV25kLCAw
KTsKKworICAgIHN3aXRjaCAobWVzc2FnZSkgeworICAgIGNhc2UgV01fUkVOREVSRk9STUFUOgor
ICAgICAgICAvLyBUaGlzIG1lc3NhZ2UgY29tZXMgd2hlbiBTZXRDbGlwYm9hcmREYXRhIHdhcyBz
ZW50IGEgbnVsbCBkYXRhIGhhbmRsZQorICAgICAgICAvLyBhbmQgbm93IGl0J3MgY29tZSB0aW1l
IHRvIHB1dCB0aGUgZGF0YSBvbiB0aGUgY2xpcGJvYXJkLgorICAgICAgICBicmVhazsKKyAgICBj
YXNlIFdNX1JFTkRFUkFMTEZPUk1BVFM6CisgICAgICAgIC8vIFRoaXMgbWVzc2FnZSBjb21lcyB3
aGVuIFNldENsaXBib2FyZERhdGEgd2FzIHNlbnQgYSBudWxsIGRhdGEgaGFuZGxlCisgICAgICAg
IC8vIGFuZCBub3cgdGhpcyBhcHBsaWNhdGlvbiBpcyBhYm91dCB0byBxdWl0LCBzbyBpdCBtdXN0
IHB1dCBkYXRhIG9uCisgICAgICAgIC8vIHRoZSBjbGlwYm9hcmQgYmVmb3JlIGl0IGV4aXRzLgor
ICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX0RFU1RST1k6CisgICAgICAgIGJyZWFrOworICAg
IGRlZmF1bHQ6CisgICAgICAgIGxyZXN1bHQgPSBEZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2Us
IHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBscmVz
dWx0OworfQorCitQYXN0ZWJvYXJkKiBQYXN0ZWJvYXJkOjpnZW5lcmFsUGFzdGVib2FyZCgpCit7
CisgICAgc3RhdGljIFBhc3RlYm9hcmQqIHBhc3RlYm9hcmQgPSBuZXcgUGFzdGVib2FyZDsKKyAg
ICByZXR1cm4gcGFzdGVib2FyZDsKK30KKworUGFzdGVib2FyZDo6UGFzdGVib2FyZCgpCit7Cisg
ICAgLy8gbWFrZSBhIGR1bW15IEhXTkQgdG8gYmUgdGhlIFdpbmRvd3MgY2xpcGJvYXJkJ3Mgb3du
ZXIKKyAgICBXTkRDTEFTUyB3YyA9IHswfTsKKyAgICBtZW1zZXQoJndjLCAwLCBzaXplb2Yod2Mp
KTsKKyAgICB3Yy5scGZuV25kUHJvYyAgICA9IFBhc3RlYm9hcmRPd25lclduZFByb2M7CisgICAg
d2MuaEluc3RhbmNlICAgICAgPSBQYWdlOjppbnN0YW5jZUhhbmRsZSgpOworICAgIHdjLmxwc3pD
bGFzc05hbWUgID0gTCJQYXN0ZWJvYXJkT3duZXJXaW5kb3dDbGFzcyI7CisgICAgOjpSZWdpc3Rl
ckNsYXNzKCZ3Yyk7CisKKyAgICBtX293bmVyID0gOjpDcmVhdGVXaW5kb3coTCJQYXN0ZWJvYXJk
T3duZXJXaW5kb3dDbGFzcyIsIEwiUGFzdGVib2FyZE93bmVyV2luZG93IiwgMCwgMCwgMCwgMCwg
MCwKKyAgICAgICAgSFdORF9NRVNTQUdFLCAwLCAwLCAwKTsKKworICAgIEhUTUxDbGlwYm9hcmRG
b3JtYXQgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiSFRNTCBGb3JtYXQiKTsKKyAgICBC
b29rbWFya0NsaXBib2FyZEZvcm1hdCA9IDo6UmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJVbmlm
b3JtUmVzb3VyY2VMb2NhdG9yVyIpOworICAgIFdlYlNtYXJ0UGFzdGVGb3JtYXQgPSA6OlJlZ2lz
dGVyQ2xpcGJvYXJkRm9ybWF0KEwiV2ViS2l0IFNtYXJ0IFBhc3RlIEZvcm1hdCIpOworfQorCit2
b2lkIFBhc3RlYm9hcmQ6OmNsZWFyKCkKK3sKKyAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3du
ZXIpKSB7CisgICAgICAgIDo6RW1wdHlDbGlwYm9hcmQoKTsKKyAgICAgICAgOjpDbG9zZUNsaXBi
b2FyZCgpOworICAgIH0KK30KKwordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVNlbGVjdGlvbihSYW5n
ZSogc2VsZWN0ZWRSYW5nZSwgYm9vbCBjYW5TbWFydENvcHlPckRlbGV0ZSwgRnJhbWUqIGZyYW1l
KQoreworICAgIGNsZWFyKCk7CisKKyAgICAvLyBQdXQgQ0ZfSFRNTCBmb3JtYXQgb24gdGhlIHBh
c3RlYm9hcmQKKyAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEV4
Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgICAgICBWZWN0b3I8Y2hhcj4gZGF0YTsKKyAgICAgICAg
bWFya3VwVG9DRl9IVE1MKGNyZWF0ZU1hcmt1cChzZWxlY3RlZFJhbmdlLCAwLCBBbm5vdGF0ZUZv
ckludGVyY2hhbmdlKSwgc2VsZWN0ZWRSYW5nZS0+c3RhcnRDb250YWluZXIoZWMpLT5kb2N1bWVu
dCgpLT51cmwoKSwgZGF0YSk7CisgICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFs
RGF0YShkYXRhKTsKKyAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERhdGEoSFRNTENsaXBib2Fy
ZEZvcm1hdCwgY2JEYXRhKSkKKyAgICAgICAgICAgIDo6R2xvYmFsRnJlZShjYkRhdGEpOworICAg
ICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQorCisgICAgLy8gUHV0IHBsYWluIHN0cmlu
ZyBvbiB0aGUgcGFzdGVib2FyZC4gQ0ZfVU5JQ09ERVRFWFQgY292ZXJzIENGX1RFWFQgYXMgd2Vs
bAorICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+c2VsZWN0ZWRUZXh0KCk7CisgICAgcmVwbGFjZU5l
d2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKHN0cik7CisgICAgcmVwbGFjZU5CU1BXaXRo
U3BhY2Uoc3RyKTsKKyAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAg
IEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YShzdHIpOworICAgICAgICBpZiAoITo6
U2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgY2JEYXRhKSkKKyAgICAgICAgICAgIDo6
R2xvYmFsRnJlZShjYkRhdGEpOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQor
CisgICAgLy8gZW5hYmxlIHNtYXJ0LXJlcGxhY2luZyBsYXRlciBvbiBieSBwdXR0aW5nIGR1bW15
IGRhdGEgb24gdGhlIHBhc3RlYm9hcmQKKyAgICBpZiAoY2FuU21hcnRDb3B5T3JEZWxldGUpIHsK
KyAgICAgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICAgICAgOjpT
ZXRDbGlwYm9hcmREYXRhKFdlYlNtYXJ0UGFzdGVGb3JtYXQsIDApOworICAgICAgICAgICAgOjpD
bG9zZUNsaXBib2FyZCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBhc3RlYm9hcmQ6
OndyaXRlVVJMKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZVN0ciwgRnJhbWUq
IGZyYW1lKQoreworICAgIEFTU0VSVCghdXJsLmlzRW1wdHkoKSk7CisKKyAgICBjbGVhcigpOwor
CisgICAgU3RyaW5nIHRpdGxlKHRpdGxlU3RyKTsKKyAgICBpZiAodGl0bGUuaXNFbXB0eSgpKSB7
CisgICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRoQ29tcG9uZW50KCk7CisgICAgICAgIGlmICh0
aXRsZS5pc0VtcHR5KCkpCisgICAgICAgICAgICB0aXRsZSA9IHVybC5ob3N0KCk7CisgICAgfQor
CisgICAgLy8gd3JpdGUgdG8gY2xpcGJvYXJkIGluIGZvcm1hdCBjb20uYXBwbGUuc2FmYXJpLmJv
b2ttYXJrZGF0YSB0byBiZSBhYmxlIHRvIHBhc3RlIGludG8gdGhlIGJvb2ttYXJrcyB2aWV3IHdp
dGggYXBwcm9wcmlhdGUgdGl0bGUKKyAgICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7
CisgICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwsIHRpdGxlKTsK
KyAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERhdGEoQm9va21hcmtDbGlwYm9hcmRGb3JtYXQs
IGNiRGF0YSkpCisgICAgICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpD
bG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIC8vIHdyaXRlIHRvIGNsaXBib2FyZCBpbiBm
b3JtYXQgQ0ZfSFRNTCB0byBiZSBhYmxlIHRvIHBhc3RlIGludG8gY29udGVudGVkaXRhYmxlIGFy
ZWFzIGFzIGEgbGluaworICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAg
ICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgICAgIG1hcmt1cFRvQ0ZfSFRNTCh1cmxUb01hcmt1
cCh1cmwsIHRpdGxlKSwgIiIsIGRhdGEpOworICAgICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0
ZUdsb2JhbERhdGEoZGF0YSk7CisgICAgICAgIGlmICghOjpTZXRDbGlwYm9hcmREYXRhKEhUTUxD
bGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCisgICAgICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRh
KTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIC8vIGJhcmUtYm9u
ZXMgQ0ZfVU5JQ09ERVRFWFQgc3VwcG9ydAorICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25l
cikpIHsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEgPSBjcmVhdGVHbG9iYWxEYXRhKHVybC5zdHJp
bmcoKSk7CisgICAgICAgIGlmICghOjpTZXRDbGlwYm9hcmREYXRhKENGX1VOSUNPREVURVhULCBj
YkRhdGEpKQorICAgICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xv
c2VDbGlwYm9hcmQoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGFzdGVib2FyZDo6d3JpdGVJbWFnZShO
b2RlKiBub2RlLCBjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJikKK3sKKyAgICBBU1NFUlQobm9k
ZSAmJiBub2RlLT5yZW5kZXJlcigpICYmIG5vZGUtPnJlbmRlcmVyKCktPmlzSW1hZ2UoKSk7Cisg
ICAgUmVuZGVySW1hZ2UqIHJlbmRlcmVyID0gc3RhdGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihub2Rl
LT5yZW5kZXJlcigpKTsKKyAgICBDYWNoZWRJbWFnZSogY2FjaGVkSW1hZ2UgPSBzdGF0aWNfY2Fz
dDxDYWNoZWRJbWFnZSo+KHJlbmRlcmVyLT5jYWNoZWRJbWFnZSgpKTsKKyAgICBBU1NFUlQoY2Fj
aGVkSW1hZ2UpOworICAgIEltYWdlKiBpbWFnZSA9IGNhY2hlZEltYWdlLT5pbWFnZSgpOworICAg
IEFTU0VSVChpbWFnZSk7CisKKyAgICBjbGVhcigpOworCisgICAgUmVmUHRyPFNoYXJlZEJpdG1h
cD4gc291cmNlQm1wID0gaW1hZ2UtPm5hdGl2ZUltYWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAg
aWYgKCFzb3VyY2VCbXApCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcmVjdCgwLCAw
LCBzb3VyY2VCbXAtPndpZHRoKCksIHNvdXJjZUJtcC0+aGVpZ2h0KCkpOworICAgIEJpdG1hcElu
Zm8gYm1wSW5mbzsKKyAgICB2b2lkKiBwaXhlbHM7CisgICAgSEJJVE1BUCByZXN1bHRCaXRtYXAg
PSBzb3VyY2VCbXAtPmNsaXBCaXRtYXAocmVjdCwgdHJ1ZSwgYm1wSW5mbywgcGl4ZWxzKTsKKyAg
ICBpZiAoIXJlc3VsdEJpdG1hcCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKDo6T3BlbkNs
aXBib2FyZChtX293bmVyKSkgeworICAgICAgICA6OlNldENsaXBib2FyZERhdGEoQ0ZfQklUTUFQ
LCByZXN1bHRCaXRtYXApOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAgfSBlbHNl
CisgICAgICAgIERlbGV0ZU9iamVjdChyZXN1bHRCaXRtYXApOworfQorCitib29sIFBhc3RlYm9h
cmQ6OmNhblNtYXJ0UmVwbGFjZSgpCit7CisgICAgcmV0dXJuIDo6SXNDbGlwYm9hcmRGb3JtYXRB
dmFpbGFibGUoV2ViU21hcnRQYXN0ZUZvcm1hdCk7Cit9CisKK1N0cmluZyBQYXN0ZWJvYXJkOjpw
bGFpblRleHQoRnJhbWUqIGZyYW1lKQoreworICAgIGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZh
aWxhYmxlKENGX1VOSUNPREVURVhUKSAmJiA6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAg
ICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCk7
CisgICAgICAgIGlmIChjYkRhdGEpIHsKKyAgICAgICAgICAgIFVDaGFyKiBidWZmZXIgPSAoVUNo
YXIqKUdsb2JhbExvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIFN0cmluZyBmcm9tQ2xpcGJvYXJk
KGJ1ZmZlcik7CisgICAgICAgICAgICBHbG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAg
IENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgICAgICByZXR1cm4gZnJvbUNsaXBib2FyZDsKKyAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAg
IGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1RFWFQpICYmIDo6T3BlbkNsaXBi
b2FyZChtX293bmVyKSkgeworICAgICAgICBIQU5ETEUgY2JEYXRhID0gOjpHZXRDbGlwYm9hcmRE
YXRhKENGX1RFWFQpOworICAgICAgICBpZiAoY2JEYXRhKSB7CisgICAgICAgICAgICBjaGFyKiBi
dWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRhdGEpOworICAgICAgICAgICAgU3RyaW5nIGZy
b21DbGlwYm9hcmQoYnVmZmVyKTsKKyAgICAgICAgICAgIEdsb2JhbFVubG9jayhjYkRhdGEpOwor
ICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgICAgIHJldHVybiBmcm9tQ2xp
cGJvYXJkOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7Cisg
ICAgfQorCisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitQYXNzUmVmUHRyPERvY3VtZW50RnJh
Z21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJhZ21lbnQoRnJhbWUqIGZyYW1lLCBQYXNzUmVm
UHRyPFJhbmdlPiBjb250ZXh0LCBib29sIGFsbG93UGxhaW5UZXh0LCBib29sJiBjaG9zZVBsYWlu
VGV4dCkKK3sKKyAgICBjaG9zZVBsYWluVGV4dCA9IGZhbHNlOworCisgICAgaWYgKDo6SXNDbGlw
Ym9hcmRGb3JtYXRBdmFpbGFibGUoSFRNTENsaXBib2FyZEZvcm1hdCkgJiYgOjpPcGVuQ2xpcGJv
YXJkKG1fb3duZXIpKSB7CisgICAgICAgIC8vIGdldCBkYXRhIG9mZiBvZiBjbGlwYm9hcmQKKyAg
ICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9y
bWF0KTsKKyAgICAgICAgaWYgKGNiRGF0YSkgeworICAgICAgICAgICAgU0laRV9UIGRhdGFTaXpl
ID0gOjpHbG9iYWxTaXplKGNiRGF0YSk7CisgICAgICAgICAgICBTdHJpbmcgY2ZfaHRtbChVVEY4
RW5jb2RpbmcoKS5kZWNvZGUoKGNoYXIqKUdsb2JhbExvY2soY2JEYXRhKSwgZGF0YVNpemUpKTsK
KyAgICAgICAgICAgIEdsb2JhbFVubG9jayhjYkRhdGEpOworICAgICAgICAgICAgQ2xvc2VDbGlw
Ym9hcmQoKTsKKworICAgICAgICAgICAgUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFn
bWVudCA9IGZyYWdtZW50RnJvbUNGX0hUTUwoZnJhbWUtPmRvY3VtZW50KCksIGNmX2h0bWwpOwor
ICAgICAgICAgICAgaWYgKGZyYWdtZW50KQorICAgICAgICAgICAgICAgIHJldHVybiBmcmFnbWVu
dDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgIH0K
KworICAgIGlmIChhbGxvd1BsYWluVGV4dCAmJiBJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShD
Rl9VTklDT0RFVEVYVCkpIHsKKyAgICAgICAgY2hvc2VQbGFpblRleHQgPSB0cnVlOworICAgICAg
ICBpZiAoT3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICAgICAgSEFORExFIGNiRGF0
YSA9IEdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQpOworICAgICAgICAgICAgaWYgKGNi
RGF0YSkgeworICAgICAgICAgICAgICAgIFVDaGFyKiBidWZmZXIgPSAoVUNoYXIqKUdsb2JhbExv
Y2soY2JEYXRhKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyKGJ1ZmZlcik7CisgICAgICAg
ICAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICAgICAgQ2xvc2VDbGlw
Ym9hcmQoKTsKKyAgICAgICAgICAgICAgICBSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21l
bnQgPSBjcmVhdGVGcmFnbWVudEZyb21UZXh0KGNvbnRleHQuZ2V0KCksIHN0cik7CisgICAgICAg
ICAgICAgICAgaWYgKGZyYWdtZW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21l
bnQucmVsZWFzZSgpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgQ2xvc2VD
bGlwYm9hcmQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhbGxvd1BsYWluVGV4dCAm
JiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1RFWFQpKSB7CisgICAgICAgIGNob3Nl
UGxhaW5UZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkg
eworICAgICAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9URVhU
KTsKKyAgICAgICAgICAgIGlmIChjYkRhdGEpIHsKKyAgICAgICAgICAgICAgICBjaGFyKiBidWZm
ZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRhdGEpOworICAgICAgICAgICAgICAgIFN0cmluZyBz
dHIoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBHbG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAg
ICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgICAgICAgICAgICAgIFJlZlB0cjxEb2N1
bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGNyZWF0ZUZyYWdtZW50RnJvbVRleHQoY29udGV4dC5n
ZXQoKSwgc3RyKTsKKyAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQpCisgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9IGVsc2UKKyAg
ICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgICAgICB9CisgICAgfQorCisgICAg
cmV0dXJuIDA7Cit9CisKK2Jvb2wgUGFzdGVib2FyZDo6aGFzRGF0YSgpCit7CisgICAgcmV0dXJu
IGhhc0RhdGFJbkZvcm1hdChDRl9VTklDT0RFVEVYVCkgfHwgaGFzRGF0YUluRm9ybWF0KENGX1RF
WFQpOworfQorCitib29sIFBhc3RlYm9hcmQ6Omhhc0RhdGFJbkZvcm1hdCh1bnNpZ25lZCBpbnQg
Zm9ybWF0KQoreworICAgIHJldHVybiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKGZvcm1h
dCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uY2ExMTI5MgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3BwCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICog
TGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0
aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRo
ZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAq
IFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZp
bGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9z
dG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIlNlYXJjaFBvcHVwTWVudS5oIgorCisjaW5jbHVkZSAiQXRvbWljU3RyaW5nLmgiCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKworU2VhcmNoUG9wdXBNZW51OjpTZWFyY2hQb3B1cE1lbnUo
UG9wdXBNZW51Q2xpZW50KiBjbGllbnQpCis6IFBvcHVwTWVudShjbGllbnQpCit7Cit9CisKK2Jv
b2wgU2VhcmNoUG9wdXBNZW51OjplbmFibGVkKCkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K3ZvaWQgU2VhcmNoUG9wdXBNZW51OjpzYXZlUmVjZW50U2VhcmNoZXMoY29uc3QgQXRvbWljU3Ry
aW5nJiBuYW1lLCBjb25zdCBWZWN0b3I8U3RyaW5nPiYgc2VhcmNoSXRlbXMpCit7CisgICAgaWYg
KG5hbWUuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworfQorCit2b2lkIFNlYXJjaFBvcHVwTWVudTo6bG9hZFJlY2VudFNlYXJjaGVzKGNvbnN0IEF0
b21pY1N0cmluZyYgbmFtZSwgVmVjdG9yPFN0cmluZz4mIHNlYXJjaEl0ZW1zKQoreworICAgIGlm
IChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRCdWZm
ZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRCdWZmZXIuY3BwCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTY3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9X
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NoYXJlZEJ1ZmZlci5jcHAKQEAgLTAsMCArMSwyNjAgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDggQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2Jp
bGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKworI2lmIFBMQVRGT1JNKFRPUkNITU9CSUxFKSAmJiBQTEFURk9STShX
SU5DRSkKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJlZEJ1ZmZlci5oIgor
CisjaW5jbHVkZSAiT3B0aW1pemVkQnVmZmVyLmgiCisjaW5jbHVkZSAiUHVyZ2VhYmxlQnVmZmVy
LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU2hhcmVkQnVmZmVyOjpTaGFyZWRCdWZmZXIo
KQorOiBtX3NpemUoMCkKKywgbV9sb2NrZWQoMCkKKywgbV9vcHRpbWl6ZWRCdWZmZXIoMCkKK3sK
K30KKworU2hhcmVkQnVmZmVyOjpTaGFyZWRCdWZmZXIoY29uc3QgY2hhciogZGF0YSwgaW50IHNp
emUpCisgICAgOiBtX3NpemUoMCkKKyAgICAsIG1fbG9ja2VkKDApCisgICAgLCBtX29wdGltaXpl
ZEJ1ZmZlcigwKQoreworICAgIGFwcGVuZChkYXRhLCBzaXplKTsKK30KKworU2hhcmVkQnVmZmVy
OjpTaGFyZWRCdWZmZXIoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHNpemUpCisgICAg
OiBtX3NpemUoMCkKKyAgICAsIG1fbG9ja2VkKDApCisgICAgLCBtX29wdGltaXplZEJ1ZmZlcigw
KQoreworICAgIGFwcGVuZChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkYXRhKSwgc2l6
ZSk7Cit9CisKK1NoYXJlZEJ1ZmZlcjo6flNoYXJlZEJ1ZmZlcigpCit7CisgICAgT3B0aW1pemVk
QnVmZmVyOjpkZWxldGVJbnN0YW5jZShtX29wdGltaXplZEJ1ZmZlcik7Cit9CisKK3Vuc2lnbmVk
IFNoYXJlZEJ1ZmZlcjo6c2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fc2l6ZTsKK30KKwor
dW5zaWduZWQgU2hhcmVkQnVmZmVyOjpnZXRTZWdtZW50KGNvbnN0IGNoYXIqKiBkYXRhLCB1bnNp
Z25lZCBwb3MpIGNvbnN0Cit7CisgICAgaWYgKHBvcyA+PSBtX3NpemUpIHsKKyAgICAgICAgKmRh
dGEgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBjb25zZWN1
dGl2ZVNpemUgPSBtX2J1ZmZlci5zaXplKCk7CisgICAgaWYgKHBvcyA+PSBjb25zZWN1dGl2ZVNp
emUpIHsKKyAgICAgICAgQVNTRVJUKG1fb3B0aW1pemVkQnVmZmVyKTsKKyAgICAgICAgcmV0dXJu
IG1fb3B0aW1pemVkQnVmZmVyLT5nZXREYXRhKGRhdGEsIHBvcyAtIGNvbnNlY3V0aXZlU2l6ZSk7
CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmRhdGEgPSBtX2J1ZmZlci5kYXRhKCkgKyBwb3M7Cisg
ICAgICAgIHJldHVybiBjb25zZWN1dGl2ZVNpemUgLSBwb3M7CisgICAgfQorfQorCit2b2lkIFNo
YXJlZEJ1ZmZlcjo6cmVsZWFzZVNlZ21lbnQoY29uc3QgY2hhciogZGF0YSkgY29uc3QKK3sKKyAg
ICAvLyBJbiBvdXIgVmVjdG9yIGJ1ZmZlcgorICAgIGlmICghbV9idWZmZXIuaXNFbXB0eSgpICYm
ICh1bnNpZ25lZClkYXRhID4gKHVuc2lnbmVkKW1fYnVmZmVyLmRhdGEoKSAmJiAodW5zaWduZWQp
ZGF0YSA8PSAodW5zaWduZWQpbV9idWZmZXIuZGF0YSgpICsgbV9idWZmZXIuc2l6ZSgpKQorICAg
ICAgICByZXR1cm47CisKKyAgICBpZiAobV9vcHRpbWl6ZWRCdWZmZXIpCisgICAgICAgIG1fb3B0
aW1pemVkQnVmZmVyLT5yZWxlYXNlRGF0YShkYXRhKTsKK30KKwordm9pZCBTaGFyZWRCdWZmZXI6
OmFwcGVuZChjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuKQoreworICAgIGlmIChtX2xvY2tlZCB8
fCBsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCFtX29wdGltaXplZEJ1ZmZl
ciAmJiBPcHRpbWl6ZWRCdWZmZXI6OmlzQ3JlYXRvckluc3RhbGxlZCgpKQorICAgICAgICBtX29w
dGltaXplZEJ1ZmZlciA9IE9wdGltaXplZEJ1ZmZlcjo6Y3JlYXRlSW5zdGFuY2UobGVuICsgbV9z
aXplLCAwKTsKKworICAgIGlmIChtX29wdGltaXplZEJ1ZmZlcikKKyAgICAgICAgbV9vcHRpbWl6
ZWRCdWZmZXItPmFwcGVuZChkYXRhLCBsZW4pOworICAgIGVsc2UKKyAgICAgICAgbV9idWZmZXIu
YXBwZW5kKGRhdGEsIGxlbik7CisKKyAgICBtX3NpemUgKz0gbGVuOworfQorCit2b2lkIFNoYXJl
ZEJ1ZmZlcjo6Y2xlYXIoKQoreworICAgIGlmIChtX2xvY2tlZCkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKG1fb3B0aW1pemVkQnVmZmVyKQorICAgICAgICBtX29wdGltaXplZEJ1ZmZlci0+
Y2xlYXIoKTsKKyAgICBtX2J1ZmZlci5jbGVhcigpOworICAgIG1fc2l6ZSA9IDA7Cit9CisKK1Bh
c3NSZWZQdHI8U2hhcmVkQnVmZmVyPiBTaGFyZWRCdWZmZXI6OmNvcHkoKSBjb25zdAoreworICAg
IFNoYXJlZEJ1ZmZlciogcnRuID0gbmV3IFNoYXJlZEJ1ZmZlcigpOworCisgICAgcnRuLT5tX3Np
emUgPSBtX3NpemU7CisgICAgcnRuLT5tX2J1ZmZlci5hcHBlbmQobV9idWZmZXIuZGF0YSgpLCBt
X2J1ZmZlci5zaXplKCkpOworICAgIGlmIChtX3NpemUgPiBtX2J1ZmZlci5zaXplKCkpIHsKKyAg
ICAgICAgQVNTRVJUKG1fb3B0aW1pemVkQnVmZmVyKTsKKyAgICAgICAgcnRuLT5tX29wdGltaXpl
ZEJ1ZmZlciA9IG1fb3B0aW1pemVkQnVmZmVyLT5jbG9uZSgpOworICAgICAgICBpZiAoIXJ0bi0+
bV9vcHRpbWl6ZWRCdWZmZXIpIHsKKyAgICAgICAgICAgIHNpemVfdCBidWZTaXplID0gcnRuLT5t
X2J1ZmZlci5zaXplKCk7CisgICAgICAgICAgICBydG4tPm1fYnVmZmVyLnJlc2l6ZShidWZTaXpl
ICsgbV9vcHRpbWl6ZWRCdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICBtX29wdGltaXplZEJ1
ZmZlci0+ZXh0cmFjdERhdGEocnRuLT5tX2J1ZmZlci5kYXRhKCkgKyBidWZTaXplKTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICByZXR1cm4gcnRuOworfQorCitjbGFzcyBGaWxlRGVzY3JpcHRvckhv
bGRlciB7CitwdWJsaWM6CisgICAgRmlsZURlc2NyaXB0b3JIb2xkZXIoRklMRSogZmQpIDogbV9m
ZChmZCkge30KKyAgICB+RmlsZURlc2NyaXB0b3JIb2xkZXIoKSB7IGZjbG9zZShtX2ZkKTsgfQor
cHJpdmF0ZToKKyAgICBGSUxFKiBtX2ZkOworfTsKKworUGFzc1JlZlB0cjxTaGFyZWRCdWZmZXI+
IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlV2l0aENvbnRlbnRzT2ZGaWxlKGNvbnN0IFN0cmluZyYgZmls
ZVBhdGgpCit7CisgICAgU3RyaW5nIG51bGxpZmllZFBhdGggPSBmaWxlUGF0aDsKKyAgICBGSUxF
KiBmaWxlRGVzY3JpcHRvciA9IF93Zm9wZW4obnVsbGlmaWVkUGF0aC5jaGFyYWN0ZXJzV2l0aE51
bGxUZXJtaW5hdGlvbigpLCBURVhUKCJyK2IiKSk7CisgICAgaWYgKCFmaWxlRGVzY3JpcHRvcikK
KyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBGaWxlRGVzY3JpcHRvckhvbGRlciBob2xkRmQoZmls
ZURlc2NyaXB0b3IpOworCisgICAgaWYgKCFmc2VlayhmaWxlRGVzY3JpcHRvciwgLTEsIFNFRUtf
RU5EKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBEV09SRCBmaWxlU2l6ZSA9IGZ0ZWxsKGZp
bGVEZXNjcmlwdG9yKTsKKyAgICBpZiAoMHhGRkZGRkZGRiA9PSBmaWxlU2l6ZSsrKQorICAgICAg
ICByZXR1cm4gMDsKKworICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+IHJlc3VsdDsKKyAgICB7Cisg
ICAgICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisgICAgICAgIHJlc3VsdCA9
IG5ldyBTaGFyZWRCdWZmZXIoKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICBy
ZXR1cm4gMDsKKyAgICB9CisKKyAgICArK2ZpbGVTaXplOworCisgICAgaWYgKGZpbGVTaXplKSB7
CisgICAgICAgIGZzZWVrKGZpbGVEZXNjcmlwdG9yLCAwLCBTRUVLX1NFVCk7CisKKyAgICAgICAg
aWYgKCFyZXN1bHQtPm1fb3B0aW1pemVkQnVmZmVyICYmIE9wdGltaXplZEJ1ZmZlcjo6aXNDcmVh
dG9ySW5zdGFsbGVkKCkpCisgICAgICAgICAgICByZXN1bHQtPm1fb3B0aW1pemVkQnVmZmVyID0g
T3B0aW1pemVkQnVmZmVyOjpjcmVhdGVJbnN0YW5jZShmaWxlU2l6ZSwgMCk7CisKKyAgICAgICAg
aWYgKHJlc3VsdC0+bV9vcHRpbWl6ZWRCdWZmZXIpIHsKKyAgICAgICAgICAgIE1lbW9yeUFsbG9j
YXRpb25DYW5GYWlsIGNhbkZhaWw7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAg
Y2hhciogZGF0YTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB0b1JlYWQgPSByZXN1bHQtPm1f
b3B0aW1pemVkQnVmZmVyLT5hbGxvY2F0ZURhdGFUb1dyaXRlKCZkYXRhLCBmaWxlU2l6ZSk7Cisg
ICAgICAgICAgICAgICAgaWYgKCF0b1JlYWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAw
OworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFjdHVhbFJlYWQgPSBmcmVhZChkYXRhLCAxLCB0
b1JlYWQsIGZpbGVEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICByZXN1bHQtPm1fb3B0aW1p
emVkQnVmZmVyLT5yZWxlYXNlRGF0YShkYXRhKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0dWFs
UmVhZCAhPSB0b1JlYWQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAg
ICAgICAgIGZpbGVTaXplIC09IHRvUmVhZDsKKyAgICAgICAgICAgICAgICByZXN1bHQtPm1fc2l6
ZSArPSB0b1JlYWQ7CisgICAgICAgICAgICB9IHdoaWxlIChmaWxlU2l6ZSk7CisgICAgICAgIH0g
ZWxzZSB7CisgICAgICAgICAgICBNZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworICAg
ICAgICAgICAgcmVzdWx0LT5tX2J1ZmZlci5yZXNpemUoZmlsZVNpemUpOworICAgICAgICAgICAg
aWYgKHJlc3VsdC0+bV9idWZmZXIuc2l6ZSgpICE9IGZpbGVTaXplKQorICAgICAgICAgICAgICAg
IHJldHVybiAwOworCisgICAgICAgICAgICBpZiAoZnJlYWQocmVzdWx0LT5tX2J1ZmZlci5kYXRh
KCksIDEsIGZpbGVTaXplLCBmaWxlRGVzY3JpcHRvcikgIT0gZmlsZVNpemUpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0LnJl
bGVhc2UoKTsKK30KKworY29uc3QgVmVjdG9yPGNoYXI+JiBTaGFyZWRCdWZmZXI6OmJ1ZmZlcigp
Cit7CisgICAgaWYgKG1fb3B0aW1pemVkQnVmZmVyICYmICFtX29wdGltaXplZEJ1ZmZlci0+aXNF
bXB0eSgpKSB7CisgICAgICAgIHNpemVfdCBidWZTaXplID0gbV9idWZmZXIuc2l6ZSgpOworICAg
ICAgICBtX2J1ZmZlci5yZXNpemUoYnVmU2l6ZSArIG1fb3B0aW1pemVkQnVmZmVyLT5zaXplKCkp
OworICAgICAgICBtX29wdGltaXplZEJ1ZmZlci0+ZXh0cmFjdERhdGEobV9idWZmZXIuZGF0YSgp
ICsgYnVmU2l6ZSk7CisgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyLT5jbGVhcigpOworICAgIH0K
KyAgICByZXR1cm4gbV9idWZmZXI7Cit9CisKK2NvbnN0IGNoYXIqIFNoYXJlZEJ1ZmZlcjo6ZGF0
YSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2hhcmVkQnVmZmVyKj4odGhpcykt
PmJ1ZmZlcigpLmRhdGEoKTsKK30KKworCitQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gU2hhcmVk
QnVmZmVyOjphZG9wdFZlY3RvcihWZWN0b3I8Y2hhcj4mIHZlY3RvcikKK3sKKyAgICBSZWZQdHI8
U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBjcmVhdGUoKTsKKyAgICBidWZmZXItPm1fYnVmZmVyLnN3
YXAodmVjdG9yKTsKKyAgICBidWZmZXItPm1fc2l6ZSA9IGJ1ZmZlci0+bV9idWZmZXIuc2l6ZSgp
OworICAgIHJldHVybiBidWZmZXI7Cit9CisKK2Jvb2wgU2hhcmVkQnVmZmVyOjptYWtlUHVyZ2Vh
YmxlKCkKK3sKKyAgICBpZiAobV9vcHRpbWl6ZWRCdWZmZXIgJiYgbV9vcHRpbWl6ZWRCdWZmZXIt
PmlzUHVyZ2VhYmxlKCkpIHsKKyAgICAgICAgaWYgKCFtX2J1ZmZlci5pc0VtcHR5KCkpIHsKKyAg
ICAgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyLT5wcmVwZW5kKG1fYnVmZmVyLmRhdGEoKSwgbV9i
dWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1fYnVmZmVyLmNsZWFyKCk7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKE9wdGltaXplZEJ1ZmZlcjo6
aXNDcmVhdG9ySW5zdGFsbGVkKCkpIHsKKyAgICAgICAgaWYgKE9wdGltaXplZEJ1ZmZlciogb3B0
aW1pemVkQnVmZmVyID0gT3B0aW1pemVkQnVmZmVyOjpjcmVhdGVJbnN0YW5jZShtX3NpemUsIG1f
b3B0aW1pemVkQnVmZmVyLCB0cnVlKSkgeworICAgICAgICAgICAgbV9vcHRpbWl6ZWRCdWZmZXIg
PSBvcHRpbWl6ZWRCdWZmZXI7CisgICAgICAgICAgICBpZiAoIW1fYnVmZmVyLmlzRW1wdHkoKSkg
eworICAgICAgICAgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyLT5wcmVwZW5kKG1fYnVmZmVyLmRh
dGEoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBtX2J1ZmZlci5jbGVhcigp
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAg
ICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9CisKKyNlbmRpZiAvLyBQTEFURk9STShUT1JD
SE1PQklMRSkgJiYgUExBVEZPUk0oV0lOQ0UpCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL1NoYXJlZFRpbWVyV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFy
ZWRUaW1lcldpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTJm
MTA0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRUaW1l
cldpbmNlLmNwcApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBB
cHBsZSBDb21wdXRlciwgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAo
QykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiU2hhcmVkVGltZXIuaCIKKworI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNs
dWRlICJTeXN0ZW1UaW1lLmgiCisjaW5jbHVkZSAiV2lkZ2V0LmgiCisjaW5jbHVkZSA8d3RmL0Fz
c2VydGlvbnMuaD4KKyNpbmNsdWRlIDx3dGYvQ3VycmVudFRpbWUuaD4KKyNpbmNsdWRlIDx3aW5k
b3dzLmg+CisKK25hbWVzcGFjZSBKU0MgeworZXh0ZXJuIHZvaWQqIGdfc3RhY2tCYXNlOworfQor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2VudW0geworICAgIFRpbWVySWROb25lID0gMCwKKyAg
ICBUaW1lcklkQXV0bywKKyAgICBUaW1lcklkTWFudWFsLAorfTsKK3N0YXRpYyBVSU5UIHRpbWVy
SUQgPSBUaW1lcklkTm9uZTsKKworc3RhdGljIHZvaWQgKCpzaGFyZWRUaW1lckZpcmVkRnVuY3Rp
b24pKCk7CisKK3N0YXRpYyBIV05EIHRpbWVyV2luZG93SGFuZGxlID0gMDsKK2NvbnN0IExQQ1dT
VFIga1RpbWVyV2luZG93Q2xhc3NOYW1lID0gTCJUaW1lcldpbmRvd0NsYXNzIjsKKworTFJFU1VM
VCBDQUxMQkFDSyBUaW1lcldpbmRvd1duZFByb2MoSFdORCBoV25kLCBVSU5UIG1lc3NhZ2UsIFdQ
QVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisgICAgaW50IGR1bW15OworICAgIEpTQzo6
Z19zdGFja0Jhc2UgPSAmZHVtbXk7CisKKyAgICBpZiAobWVzc2FnZSA9PSBXTV9USU1FUikgewor
ICAgICAgICBpZiAodGltZXJJRCAhPSBUaW1lcklkTm9uZSkKKyAgICAgICAgICAgIHNoYXJlZFRp
bWVyRmlyZWRGdW5jdGlvbigpOworICAgIH0gZWxzZSBpZiAobWVzc2FnZSA9PSBXTV9VU0VSKSAg
ICB7CisgICAgICAgIGlmICh0aW1lcklEID0gVGltZXJJZE1hbnVhbCkgeworICAgICAgICAgICAg
c2hhcmVkVGltZXJGaXJlZEZ1bmN0aW9uKCk7CisgICAgICAgICAgICBQb3N0TWVzc2FnZShoV25k
LCBXTV9VU0VSLCAwLCAwKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEpTQzo6
Z19zdGFja0Jhc2UgPSAwOworICAgICAgICByZXR1cm4gRGVmV2luZG93UHJvYyhoV25kLCBtZXNz
YWdlLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgfQorICAgIEpTQzo6Z19zdGFja0Jhc2UgPSAwOwor
ICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBpbml0aWFsaXplT2ZmU2NyZWVuVGltZXJX
aW5kb3coKQoreworICAgIGlmICh0aW1lcldpbmRvd0hhbmRsZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgV05EQ0xBU1Mgd2NleCA9IHswfTsKKyAgICB3Y2V4LmxwZm5XbmRQcm9jICAgID0gVGlt
ZXJXaW5kb3dXbmRQcm9jOworICAgIHdjZXguaEluc3RhbmNlICAgICAgPSBQYWdlOjppbnN0YW5j
ZUhhbmRsZSgpOworICAgIHdjZXgubHBzekNsYXNzTmFtZSAgPSBrVGltZXJXaW5kb3dDbGFzc05h
bWU7CisgICAgUmVnaXN0ZXJDbGFzcygmd2NleCk7CisKKyAgICB0aW1lcldpbmRvd0hhbmRsZSA9
IENyZWF0ZVdpbmRvdyhrVGltZXJXaW5kb3dDbGFzc05hbWUsIDAsIDAsCisgICAgICAgQ1dfVVNF
REVGQVVMVCwgMCwgQ1dfVVNFREVGQVVMVCwgMCwgSFdORF9NRVNTQUdFLCAwLCBQYWdlOjppbnN0
YW5jZUhhbmRsZSgpLCAwKTsKK30KKwordm9pZCBzZXRTaGFyZWRUaW1lckZpcmVkRnVuY3Rpb24o
dm9pZCAoKmYpKCkpCit7CisgICAgc2hhcmVkVGltZXJGaXJlZEZ1bmN0aW9uID0gZjsKK30KKwor
I2RlZmluZSBVU0VSX1RJTUVSX01BWElNVU0gIDB4N0ZGRkZGRkYKKyNkZWZpbmUgVVNFUl9USU1F
Ul9NSU5JTVVNICAweDAwMDAwMDBBCisKK3ZvaWQgc2V0U2hhcmVkVGltZXJGaXJlVGltZShkb3Vi
bGUgZmlyZVRpbWUpCit7CisgICAgQVNTRVJUKHNoYXJlZFRpbWVyRmlyZWRGdW5jdGlvbik7CisK
KyAgICBkb3VibGUgaW50ZXJ2YWwgPSAoZmlyZVRpbWUgLSBjdXJyZW50VGltZSgpKSAqIDEwMDAu
OworICAgIHVuc2lnbmVkIGludGVydmFsSW5NUyA9IGludGVydmFsIDwgVVNFUl9USU1FUl9NSU5J
TVVNCisgICAgICAgID8gVVNFUl9USU1FUl9NSU5JTVVNCisgICAgICAgIDogaW50ZXJ2YWwgPiBV
U0VSX1RJTUVSX01BWElNVU0KKyAgICAgICAgPyBVU0VSX1RJTUVSX01BWElNVU0KKyAgICAgICAg
OiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oaW50ZXJ2YWwpOworCisgICAgaWYgKHRpbWVySUQgPT0g
VGltZXJJZEF1dG8pIHsKKyAgICAgICAgS2lsbFRpbWVyKHRpbWVyV2luZG93SGFuZGxlLCBUaW1l
cklkQXV0byk7CisgICAgICAgIHRpbWVySUQgPSBUaW1lcklkTm9uZTsKKyAgICB9CisKKyAgICBp
bml0aWFsaXplT2ZmU2NyZWVuVGltZXJXaW5kb3coKTsKKyAgICBpZiAoU2V0VGltZXIodGltZXJX
aW5kb3dIYW5kbGUsIFRpbWVySWRBdXRvLCBpbnRlcnZhbEluTVMsIDApKQorICAgICAgICB0aW1l
cklEID0gVGltZXJJZEF1dG87CisgICAgZWxzZSBpZiAodGltZXJJRCAhPSBUaW1lcklkTWFudWFs
KQorICAgICAgICBQb3N0TWVzc2FnZSh0aW1lcldpbmRvd0hhbmRsZSwgV01fVVNFUiwgMCwgMCk7
Cit9CisKK3ZvaWQgc3RvcFNoYXJlZFRpbWVyKCkKK3sKKyAgICBpZiAodGltZXJJRCA9PSBUaW1l
cklkQXV0bykKKyAgICAgICAgS2lsbFRpbWVyKHRpbWVyV2luZG93SGFuZGxlLCBUaW1lcklkQXV0
byk7CisKKyAgICB0aW1lcklEID0gVGltZXJJZE5vbmU7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvU3lzdGVtVGltZVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvU3lzdGVtVGltZVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwLi43MGI3MDViCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5j
ZS9TeXN0ZW1UaW1lV2luY2UuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU3lzdGVtVGltZS5oIgorCisjaW5jbHVkZSA8d2luZG93
cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2Zsb2F0IHVzZXJJZGxlVGltZSgpCit7Cisg
ICAgcmV0dXJuIEZMVF9NQVg7Cit9CisKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33282</attachid>
            <date>2009-07-22 12:44:16 -0700</date>
            <delta_ts>2009-07-30 13:29:24 -0700</delta_ts>
            <desc>part 2 (ScrollView, Widget, ScrollBar files)</desc>
            <filename>27543_2.patch</filename>
            <type>text/plain</type>
            <size>101865</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGxhdGZvcm1TY3JvbGxCYXJXaW5j
ZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZGFjNTIKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3Bw
CkBAIC0wLDAgKzEsNTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBN
b2JpbGUgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bVNjcm9sbEJhci5oIgorCisjaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiRnJh
bWUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50Lmgi
CisjaW5jbHVkZSAiU2Nyb2xsYmFyVGhlbWUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwor
Ly8gc3RhYmxlUm91bmQgcm91bmRzIC0wLjUgdG8gMCwgd2hlcmUgbHJvdW5kIHJvdW5kcyAtMC41
IHRvIC0xLgorc3RhdGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQoZG91YmxlIGQpCit7CisgICAg
aWYgKGQgPiAwKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKKwor
ICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4gaSAtIGQgPiAwLjUg
PyBpIC0gMSA6IGk7Cit9CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworZW51bSBTY3JvbGxCYXJTdGF0ZSB7CisgICAgU2Nyb2xsQmFyRGlzYWJsZWQsCisg
ICAgU2Nyb2xsQmFyRW5hYmxlZCwKKyAgICBTY3JvbGxCYXJQcmVzc2VkLAorfTsKKworc3RhdGlj
IGludCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjSG9yaXpv
bnRhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsV2lkdGhbXSA9
IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbEhlaWdodFtdID0geyAxNSwgMTEgfTsK
KworY29uc3QgZG91YmxlIGNJbml0aWFsVGltZXJEZWxheSA9IDAuMjU7Citjb25zdCBkb3VibGUg
Y05vcm1hbFRpbWVyRGVsYXkgPSAwLjA1OworCitQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZvcm1T
Y3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9y
aWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQorICAgIDogU2Nyb2xsYmFyKGNs
aWVudCwgb3JpZW50YXRpb24sIHNpemUpCisgICAgLCBtX2hvdmVyZWRQYXJ0KE5vUGFydCkKKyAg
ICAsIG1fcHJlc3NlZFBhcnQoTm9QYXJ0KQorICAgICwgbV9wcmVzc2VkUG9zKDApCisgICAgLCBt
X3Njcm9sbFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmly
ZWQpCisgICAgLCBtX292ZXJsYXBzUmVzaXplcihmYWxzZSkKKyAgICAsIG1fdmlzaWJsZSh0cnVl
KQorICAgICwgbV9pc1ZpZXdTY3JvbGxiYXIoZmFsc2UpCit7CisgICAgaWYgKG9yaWVudGF0aW9u
ID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICBzZXRGcmFtZVJlY3QoSW50UmVjdCgwLCAw
LCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsSGVpZ2h0W2NvbnRyb2xT
aXplKCldKSk7CisgICAgZWxzZQorICAgICAgICBzZXRGcmFtZVJlY3QoSW50UmVjdCgwLCAwLCBj
SG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9s
U2l6ZSgpXSkpOworfQorCitQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRmb3JtU2Nyb2xsYmFyKCkK
K3sKKyAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
Ojp1cGRhdGVUaHVtYlBvc2l0aW9uKCkKK3sKKyAgICBpbnZhbGlkYXRlVHJhY2soKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQcm9wb3J0aW9uKCkKK3sKKyAgICBp
bnZhbGlkYXRlVHJhY2soKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52YWxpZGF0
ZVRyYWNrKCkKK3sKKyAgICBpZiAoIW1fdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
SW50UmVjdCByZWN0ID0gdHJhY2tSZWN0KCk7CisgICAgcmVjdC5tb3ZlKC14KCksIC15KCkpOwor
ICAgIGludmFsaWRhdGVSZWN0KHJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpp
bnZhbGlkYXRlUGFydChTY3JvbGxiYXJQYXJ0IHBhcnQpCit7CisgICAgaWYgKCFtX3Zpc2libGUp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwYXJ0ID09IE5vUGFydCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgSW50UmVjdCByZXN1bHQ7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgY2Fz
ZSBCYWNrQnV0dG9uU3RhcnRQYXJ0OgorICAgICAgICByZXN1bHQgPSBiYWNrQnV0dG9uUmVjdCgp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcndhcmRCdXR0b25TdGFydFBhcnQ6CisgICAg
ICAgIHJlc3VsdCA9IGZvcndhcmRCdXR0b25SZWN0KCk7CisgICAgICAgIGJyZWFrOworICAgIGRl
ZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0
aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICAgICAgc3BsaXRUcmFjayh0cmFja1Jl
Y3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICAg
ICAgICAgIGlmIChwYXJ0ID09IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICAgICAgcmVzdWx0
ID0gYmVmb3JlVGh1bWJSZWN0OworICAgICAgICAgICAgZWxzZSBpZiAocGFydCA9PSBGb3J3YXJk
VHJhY2tQYXJ0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFmdGVyVGh1bWJSZWN0OworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRodW1iUmVjdDsKKyAgICAg
ICAgfQorICAgIH0KKyAgICByZXN1bHQubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnZhbGlkYXRl
UmVjdChyZXN1bHQpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OndpZHRoKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gV2lkZ2V0Ojp3aWR0aCgpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxi
YXI6OmhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdpZGdldDo6aGVpZ2h0KCk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNldFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sK
KyAgICBzZXRGcmFtZVJlY3QocmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNl
dFBhcmVudChTY3JvbGxWaWV3KiBwYXJlbnRWaWV3KQoreworICAgIFdpZGdldDo6c2V0UGFyZW50
KHBhcmVudFZpZXcpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRFbmFibGVkKGJv
b2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCAhPSBpc0VuYWJsZWQoKSkgeworICAgICAg
ICBTY3JvbGxiYXI6OnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIGlmIChtX3Zpc2libGUp
CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtU2Ny
b2xsYmFyOjpwYWludChHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgSW50
UmVjdCYgZGFtYWdlUmVjdCkKK3sKKyAgICBpZiAoIW1fdmlzaWJsZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKGdyYXBoaWNzQ29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBEb24ndCBwYWludCBhbnl0aGluZyBpZiB0aGUgc2Nyb2xsYmFy
IGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBkYW1hZ2UgcmVjdC4KKyAgICBpZiAoIWZyYW1lUmVjdCgp
LmludGVyc2VjdHMoZGFtYWdlUmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIGdyYXBoaWNz
Q29udGV4dC0+c2F2ZSgpOworCisgICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VTdHlsZShT
b2xpZFN0cm9rZSk7CisgICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xvcigw
LCAwLCAwKSk7CisKKyAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tSZWN0KCk7CisgICAgcGFpbnRU
cmFjayhncmFwaGljc0NvbnRleHQsIHRyYWNrLCB0cnVlLCBkYW1hZ2VSZWN0KTsKKworICAgIGlm
IChpc0VuYWJsZWQoKSkgeworICAgICAgICBwYWludEJ1dHRvbihncmFwaGljc0NvbnRleHQsIGJh
Y2tCdXR0b25SZWN0KCksIHRydWUsIGRhbWFnZVJlY3QpOworICAgICAgICBwYWludEJ1dHRvbihn
cmFwaGljc0NvbnRleHQsIGZvcndhcmRCdXR0b25SZWN0KCksIGZhbHNlLCBkYW1hZ2VSZWN0KTsK
KyAgICB9CisKKyAgICBpZiAoZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHRyYWNrKSAmJiBpc0VuYWJs
ZWQoKSkgeworICAgICAgICBJbnRSZWN0IHN0YXJ0VHJhY2tSZWN0LCB0aHVtYlJlY3QsIGVuZFRy
YWNrUmVjdDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywgc3RhcnRUcmFja1JlY3QsIHRodW1i
UmVjdCwgZW5kVHJhY2tSZWN0KTsKKyAgICAgICAgcGFpbnRUaHVtYihncmFwaGljc0NvbnRleHQs
IHRodW1iUmVjdCwgZGFtYWdlUmVjdCk7CisgICAgfQorCisgICAgZ3JhcGhpY3NDb250ZXh0LT5y
ZXN0b3JlKCk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmJhY2tCdXR0b25SZWN0
KCkgY29uc3QKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
KQorICAgICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgaGVpZ2h0KCksIGhlaWdodCgpKTsK
KyAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgd2lkdGgoKSwgd2lkdGgoKSk7Cit9CisKK0lu
dFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmZvcndhcmRCdXR0b25SZWN0KCkgY29uc3QKK3sKKyAg
ICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1
cm4gSW50UmVjdCh4KCkgKyB3aWR0aCgpIC0gaGVpZ2h0KCksIHkoKSwgaGVpZ2h0KCksIGhlaWdo
dCgpKTsKKworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpICsgaGVpZ2h0KCkgLSB3aWR0aCgp
LCB3aWR0aCgpLCB3aWR0aCgpKTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJh
Y2tSZWN0KCkgY29uc3QKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyKSB7CisgICAgICAgIGlmICh3aWR0aCgpIDwgaGVpZ2h0KCkgKyBoZWlnaHQoKSkKKyAg
ICAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSAr
IGhlaWdodCgpLCB5KCksIHdpZHRoKCkgLSBoZWlnaHQoKSAtIGhlaWdodCgpLCBoZWlnaHQoKSk7
CisgICAgfQorCisgICAgaWYgKGhlaWdodCgpIDwgd2lkdGgoKSArIHdpZHRoKCkpCisgICAgICAg
IHJldHVybiBJbnRSZWN0KCk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyB3aWR0aCgp
LCB3aWR0aCgpLCBoZWlnaHQoKSAtIHdpZHRoKCkgLSB3aWR0aCgpKTsKK30KKworSW50UmVjdCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJSZWN0KCkgY29uc3QKK3sKKyAgICBJbnRSZWN0IGJlZm9y
ZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdDsKKyAgICBzcGxpdFRyYWNrKHRy
YWNrUmVjdCgpLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOwor
ICAgIHJldHVybiB0aHVtYlJlY3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNwbGl0
VHJhY2soY29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBJbnRSZWN0JiBiZWZvcmVUaHVtYlJlY3Qs
IEludFJlY3QmIHRodW1iUmVjdCwgSW50UmVjdCYgYWZ0ZXJUaHVtYlJlY3QpIGNvbnN0Cit7Cisg
ICAgLy8gVGhpcyBmdW5jdGlvbiB3b24ndCBldmVuIGdldCBjYWxsZWQgdW5sZXNzIHdlJ3JlIGJp
ZyBlbm91Z2ggdG8gaGF2ZSBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZXNlIHRocmVlIHJlY3RzIHdo
ZXJlIGF0IGxlYXN0CisgICAgLy8gb25lIG9mIHRoZW0gaXMgbm9uLWVtcHR5LgorICAgIGludCB0
aHVtYlBvcyA9IHRodW1iUG9zaXRpb24oKTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIHRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0
LngoKSArIHRodW1iUG9zLCB0cmFja1JlY3QueSgpLCB0aHVtYkxlbmd0aCgpLCB0cmFja1JlY3Qu
aGVpZ2h0KCkpOworICAgICAgICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54
KCksIHRyYWNrUmVjdC55KCksIHRodW1iUG9zLCB0cmFja1JlY3QuaGVpZ2h0KCkpOworICAgICAg
ICBhZnRlclRodW1iUmVjdCA9IEludFJlY3QodGh1bWJSZWN0LngoKSArIHRodW1iUmVjdC53aWR0
aCgpLCB0cmFja1JlY3QueSgpLCB0cmFja1JlY3QucmlnaHQoKSAtIHRodW1iUmVjdC5yaWdodCgp
LCB0cmFja1JlY3QuaGVpZ2h0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRodW1iUmVjdCA9
IEludFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSArIHRodW1iUG9zLCB0cmFja1Jl
Y3Qud2lkdGgoKSwgdGh1bWJMZW5ndGgoKSk7CisgICAgICAgIGJlZm9yZVRodW1iUmVjdCA9IElu
dFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRo
dW1iUG9zKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCks
IHRodW1iUmVjdC55KCkgKyB0aHVtYlJlY3QuaGVpZ2h0KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0
cmFja1JlY3QuYm90dG9tKCkgLSB0aHVtYlJlY3QuYm90dG9tKCkpOworICAgIH0KK30KKworaW50
IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoaXNF
bmFibGVkKCkpCisgICAgICAgIHJldHVybiBzdGFibGVSb3VuZCgoZmxvYXQpbV9jdXJyZW50UG9z
ICogKHRyYWNrTGVuZ3RoKCkgLSB0aHVtYkxlbmd0aCgpKSAvIChtX3RvdGFsU2l6ZSAtIG1fdmlz
aWJsZVNpemUpKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0
aHVtYkxlbmd0aCgpIGNvbnN0Cit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBmbG9hdCBwcm9wb3J0aW9uID0gKGZsb2F0KShtX3Zpc2libGVTaXplKSAv
IG1fdG90YWxTaXplOworICAgIGludCB0cmFja0xlbiA9IHRyYWNrTGVuZ3RoKCk7CisgICAgaW50
IGxlbmd0aCA9IHN0YWJsZVJvdW5kKHByb3BvcnRpb24gKiB0cmFja0xlbik7CisgICAgaW50IG1p
bkxlbmd0aCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGhlaWdodCgp
IDogd2lkdGgoKTsKKyAgICBsZW5ndGggPSBtYXgobGVuZ3RoLCBtaW5MZW5ndGgpOworICAgIGlm
IChsZW5ndGggPiB0cmFja0xlbikKKyAgICAgICAgbGVuZ3RoID0gMDsgLy8gT25jZSB0aGUgdGh1
bWIgaXMgYmVsb3cgdGhlIHRyYWNrIGxlbmd0aCwgaXQganVzdCBnb2VzIGF3YXkgKHRvIG1ha2Ug
bW9yZSByb29tIGZvciB0aGUgdHJhY2spLgorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiAobV9v
cmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRyYWNrUmVjdCgpLndpZHRoKCkg
OiB0cmFja1JlY3QoKS5oZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFp
bnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBwYWludFJl
Y3QsIGJvb2wgc3RhcnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAg
aWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgVUlOVCBzdGF0ZSA9ICFpc0VuYWJsZWQoKQorICAgICAgICA/IERGQ1NfSU5BQ1RJVkUK
KyAgICAgICAgOiBtX3ByZXNzZWRQYXJ0ID09IChzdGFydCA/IEJhY2tCdXR0b25TdGFydFBhcnQg
OiBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0KQorICAgICAgICA/IERGQ1NfUFVTSEVECisgICAgICAg
IDogMDsKKworICAgIFVJTlQgYXJyb3cgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIKKyAgICAgICAgPyBzdGFydCA/IERGQ1NfU0NST0xMTEVGVCA6IERGQ1NfU0NST0xMUklH
SFQKKyAgICAgICAgOiBzdGFydCA/IERGQ1NfU0NST0xMVVAgOiBERkNTX1NDUk9MTERPV047CisK
KyAgICBjb250ZXh0LT5kcmF3RnJhbWVDb250cm9sKHBhaW50UmVjdCwgREZDX1NDUk9MTCwgYXJy
b3cgfCBzdGF0ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VHJhY2soR3Jh
cGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBwYWludFJlY3QsIGJvb2wgc3Rh
cnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFkYW1hZ2VS
ZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRFdPUkQg
Y29sb3IgPSBHZXRTeXNDb2xvcihDT0xPUl9TQ1JPTExCQVIpOworICAgIGNvbnRleHQtPmZpbGxS
ZWN0KHBhaW50UmVjdCwgQ29sb3IoR2V0UlZhbHVlKGNvbG9yKSAvIDIsIEdldEdWYWx1ZShjb2xv
cikgLyAyLCBHZXRCVmFsdWUoY29sb3IpIC8gMikpOworICAgIGNvbnRleHQtPnN0cm9rZVJlY3Qo
cGFpbnRSZWN0LCAxKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYihH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFJl
Y3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMo
cmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFVJTlQgc3RhdGUgPSAhaXNFbmFibGVkKCkK
KyAgICAgICAgPyBERkNTX0lOQUNUSVZFCisgICAgICAgIDogbV9wcmVzc2VkUGFydCA9PSBUaHVt
YlBhcnQKKyAgICAgICAgPyBERkNTX1BVU0hFRAorICAgICAgICA6IDA7CisKKyAgICBjb250ZXh0
LT5kcmF3RnJhbWVDb250cm9sKHJlY3QsIERGQ19CVVRUT04sIERGQ1NfQlVUVE9OUFVTSCB8IHN0
YXRlKTsKK30KKworU2Nyb2xsYmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0VGVzdChjb25z
dCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBTY3JvbGxiYXJQYXJ0IHJlc3VsdCA9
IE5vUGFydDsKKyAgICBpZiAoIW1fdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICBpZiAoIWlzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgSW50UG9p
bnQgbW91c2VQb3NpdGlvbiA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkp
OworICAgIG1vdXNlUG9zaXRpb24ubW92ZSh4KCksIHkoKSk7CisgICAgaWYgKGJhY2tCdXR0b25S
ZWN0KCkuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgIHJlc3VsdCA9IEJhY2tCdXR0
b25TdGFydFBhcnQ7CisgICAgZWxzZSBpZiAoZm9yd2FyZEJ1dHRvblJlY3QoKS5jb250YWlucyht
b3VzZVBvc2l0aW9uKSkKKyAgICAgICAgcmVzdWx0ID0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydDsK
KyAgICBlbHNlIHsKKyAgICAgICAgSW50UmVjdCB0cmFjayA9IHRyYWNrUmVjdCgpOworICAgICAg
ICBpZiAodHJhY2suY29udGFpbnMobW91c2VQb3NpdGlvbikpIHsKKyAgICAgICAgICAgIEludFJl
Y3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICAg
ICAgc3BsaXRUcmFjayh0cmFjaywgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1
bWJSZWN0KTsKKyAgICAgICAgICAgIGlmIChiZWZvcmVUaHVtYlJlY3QuY29udGFpbnMobW91c2VQ
b3NpdGlvbikpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQmFja1RyYWNrUGFydDsKKyAgICAg
ICAgICAgIGVsc2UgaWYgKHRodW1iUmVjdC5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAg
ICAgICAgICAgICByZXN1bHQgPSBUaHVtYlBhcnQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgcmVzdWx0ID0gRm9yd2FyZFRyYWNrUGFydDsKKyAgICAgICAgfQorICAgIH0KKyAg
ICByZXR1cm4gcmVzdWx0OworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3Vz
ZU1vdmVFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBpZiAobV9w
cmVzc2VkUGFydCA9PSBUaHVtYlBhcnQpIHsKKyAgICAgICAgLy8gRHJhZyB0aGUgdGh1bWIuCisg
ICAgICAgIGludCB0aHVtYlBvcyA9IHRodW1iUG9zaXRpb24oKTsKKyAgICAgICAgaW50IHRodW1i
TGVuID0gdGh1bWJMZW5ndGgoKTsKKyAgICAgICAgaW50IHRyYWNrTGVuID0gdHJhY2tMZW5ndGgo
KTsKKyAgICAgICAgaW50IG1heFBvcyA9IHRyYWNrTGVuIC0gdGh1bWJMZW47CisgICAgICAgIGlu
dCBkZWx0YSA9IDA7CisgICAgICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIpCisgICAgICAgICAgICBkZWx0YSA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhl
dnQucG9zKCkpLngoKSAtIG1fcHJlc3NlZFBvczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
ZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS55KCkgLSBtX3By
ZXNzZWRQb3M7CisKKyAgICAgICAgaWYgKGRlbHRhID4gMCkKKyAgICAgICAgICAgIC8vIFRoZSBt
b3VzZSBtb3ZlZCBkb3duL3JpZ2h0LgorICAgICAgICAgICAgZGVsdGEgPSBtaW4obWF4UG9zIC0g
dGh1bWJQb3MsIGRlbHRhKTsKKyAgICAgICAgZWxzZSBpZiAoZGVsdGEgPCAwKQorICAgICAgICAg
ICAgLy8gVGhlIG1vdXNlIG1vdmVkIHVwL2xlZnQuCisgICAgICAgICAgICBkZWx0YSA9IG1heCgt
dGh1bWJQb3MsIGRlbHRhKTsKKworICAgICAgICBpZiAoZGVsdGEpIHsKKyAgICAgICAgICAgIHNl
dFZhbHVlKHN0YWJsZVJvdW5kKChmbG9hdCkodGh1bWJQb3MgKyBkZWx0YSkgKiAobV90b3RhbFNp
emUgLSBtX3Zpc2libGVTaXplKSAvICh0cmFja0xlbiAtIHRodW1iTGVuKSkpOworICAgICAgICAg
ICAgbV9wcmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24oKSAtIHRodW1iUG9zOworICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1fcHJlc3NlZFBhcnQg
IT0gTm9QYXJ0KQorICAgICAgICBtX3ByZXNzZWRQb3MgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyID8gY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSku
eCgpIDogY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgpKTsKKworICAg
IFNjcm9sbGJhclBhcnQgcGFydCA9IGhpdFRlc3QoZXZ0KTsKKyAgICBpZiAocGFydCAhPSBtX2hv
dmVyZWRQYXJ0KSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkgeworICAg
ICAgICAgICAgaWYgKHBhcnQgPT0gbV9wcmVzc2VkUGFydCkgeworICAgICAgICAgICAgICAgIC8v
IFRoZSBtb3VzZSBpcyBtb3ZpbmcgYmFjayBvdmVyIHRoZSBwcmVzc2VkIHBhcnQuICBXZQorICAg
ICAgICAgICAgICAgIC8vIG5lZWQgdG8gc3RhcnQgdXAgdGhlIHRpbWVyIGFjdGlvbiBhZ2Fpbi4K
KyAgICAgICAgICAgICAgICBzdGFydFRpbWVySWZOZWVkZWQoY05vcm1hbFRpbWVyRGVsYXkpOwor
ICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICAg
ICAgfSBlbHNlIGlmIChtX2hvdmVyZWRQYXJ0ID09IG1fcHJlc3NlZFBhcnQpIHsKKyAgICAgICAg
ICAgICAgICAvLyBUaGUgbW91c2UgaXMgbGVhdmluZyB0aGUgcHJlc3NlZCBwYXJ0LiAgS2lsbCBv
dXIgdGltZXIKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWVkZWQuCisgICAgICAgICAgICAgICAg
c3RvcFRpbWVySWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUGFydChtX3By
ZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IGludmFsaWRhdGVQYXJ0KHBhcnQpOworICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9ob3Zl
cmVkUGFydCk7CisgICAgICAgIH0KKyAgICAgICAgbV9ob3ZlcmVkUGFydCA9IHBhcnQ7CisgICAg
fQorCisgICAgcmV0dXJuIG1fcHJlc3NlZFBhcnQgIT0gTm9QYXJ0OworfQorCitib29sIFBsYXRm
b3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU91dEV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYgZXZ0KQoreworICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAgIG1faG92
ZXJlZFBhcnQgPSBOb1BhcnQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQbGF0Zm9y
bVNjcm9sbGJhcjo6aGFuZGxlTW91c2VQcmVzc0V2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYgZXZ0KQoreworICAgIG1fcHJlc3NlZFBhcnQgPSBoaXRUZXN0KGV2dCk7CisgICAgbV9wcmVz
c2VkUG9zID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNvbnZlcnRG
cm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29udGFpbmlu
Z1dpbmRvdyhldnQucG9zKCkpLnkoKSk7CisgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFy
dCk7CisgICAgYXV0b3Njcm9sbFByZXNzZWRQYXJ0KGNJbml0aWFsVGltZXJEZWxheSk7CisgICAg
cmV0dXJuIG1fcHJlc3NlZFBhcnQgIT0gTm9QYXJ0OworfQorCitib29sIFBsYXRmb3JtU2Nyb2xs
YmFyOjpoYW5kbGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2
dCkKK3sKKyAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICBtX3ByZXNzZWRQ
YXJ0ID0gTm9QYXJ0OworICAgIG1fcHJlc3NlZFBvcyA9IDA7CisgICAgc3RvcFRpbWVySWZOZWVk
ZWQoKTsKKworICAgIGlmIChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGcmFtZVZpZXcoKSkKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpLT5mcmFtZSgpLT5ldmVudEhh
bmRsZXIoKS0+c2V0TW91c2VQcmVzc2VkKGZhbHNlKTsKKworICAgIHJldHVybiBtX3ByZXNzZWRQ
YXJ0ICE9IE5vUGFydDsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3RhcnRUaW1lcklm
TmVlZGVkKGRvdWJsZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhl
IHRodW1iLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4gIFdlIGhhbHQgdHJhY2sgc2Nyb2xsaW5n
IG9uY2UgdGhlIHRodW1iIGlzIGxldmVsCisgICAgLy8gd2l0aCB1cy4KKyAgICBpZiAoKG1fcHJl
c3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFj
a1BhcnQpICYmIHRodW1iVW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1f
cHJlc3NlZFBhcnQpOworICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgY2FuJ3Qgc2Nyb2xsIGlmIHdlJ3ZlIGhpdCB0
aGUgYmVnaW5uaW5nIG9yIGVuZC4KKyAgICBTY3JvbGxEaXJlY3Rpb24gZGlyID0gcHJlc3NlZFBh
cnRTY3JvbGxEaXJlY3Rpb24oKTsKKyAgICBpZiAoZGlyID09IFNjcm9sbFVwIHx8IGRpciA9PSBT
Y3JvbGxMZWZ0KSB7CisgICAgICAgIGlmIChtX2N1cnJlbnRQb3MgPT0gMCkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9jdXJyZW50UG9zID09IG1fdG90
YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBtX3Njcm9sbFRpbWVyLnN0YXJ0T25lU2hvdChkZWxheSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1T
Y3JvbGxiYXI6OnN0b3BUaW1lcklmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9zY3JvbGxUaW1lci5p
c0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9sbFRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFByZXNzZWRQYXJ0KGRvdWJsZSBkZWxheSkKK3sKKyAg
ICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhlIHRodW1iIG9yIGlmIG5vdGhpbmcgd2FzIHBy
ZXNzZWQuCisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0IHx8IG1fcHJlc3NlZFBh
cnQgPT0gTm9QYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBIYW5kbGUgdGhlIHRyYWNr
LgorICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0IHx8IG1fcHJlc3NlZFBh
cnQgPT0gRm9yd2FyZFRyYWNrUGFydCkgJiYgdGh1bWJVbmRlck1vdXNlKCkpIHsKKyAgICAgICAg
aW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgIG1faG92ZXJlZFBhcnQgPSBU
aHVtYlBhcnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgdGhlIGFy
cm93cyBhbmQgdHJhY2suCisgICAgaWYgKHNjcm9sbChwcmVzc2VkUGFydFNjcm9sbERpcmVjdGlv
bigpLCBwcmVzc2VkUGFydFNjcm9sbEdyYW51bGFyaXR5KCkpKQorICAgICAgICBzdGFydFRpbWVy
SWZOZWVkZWQoZGVsYXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xs
VGltZXJGaXJlZChUaW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4qKQoreworICAgIGF1dG9zY3JvbGxQ
cmVzc2VkUGFydChjTm9ybWFsVGltZXJEZWxheSk7Cit9CisKK1Njcm9sbERpcmVjdGlvbiBQbGF0
Zm9ybVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKQoreworICAgIGlmICht
X29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaWYgKG1fcHJl
c3NlZFBhcnQgPT0gQmFja0J1dHRvblN0YXJ0UGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEJhY2tU
cmFja1BhcnQpCisgICAgICAgICAgICByZXR1cm4gU2Nyb2xsTGVmdDsKKyAgICAgICAgcmV0dXJu
IFNjcm9sbFJpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09
IEJhY2tCdXR0b25TdGFydFBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0KQor
ICAgICAgICAgICAgcmV0dXJuIFNjcm9sbFVwOworICAgICAgICByZXR1cm4gU2Nyb2xsRG93bjsK
KyAgICB9Cit9CisKK1Njcm9sbEdyYW51bGFyaXR5IFBsYXRmb3JtU2Nyb2xsYmFyOjpwcmVzc2Vk
UGFydFNjcm9sbEdyYW51bGFyaXR5KCkKK3sKKyAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNr
QnV0dG9uU3RhcnRQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFy
dCkKKyAgICAgICAgcmV0dXJuIFNjcm9sbEJ5TGluZTsKKyAgICByZXR1cm4gU2Nyb2xsQnlQYWdl
OworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlVuZGVyTW91c2UoKQoreworICAg
IC8vIENvbnN0cnVjdCBhIHJlY3QuCisgICAgSW50UmVjdCB0aHVtYiA9IHRodW1iUmVjdCgpOwor
ICAgIHRodW1iLm1vdmUoLXgoKSwgLXkoKSk7CisgICAgaW50IGJlZ2luID0gKG1fb3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0aHVtYi54KCkgOiB0aHVtYi55KCk7CisgICAg
aW50IGVuZCA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gdGh1bWIu
cmlnaHQoKSA6IHRodW1iLmJvdHRvbSgpOworICAgIHJldHVybiAoYmVnaW4gPD0gbV9wcmVzc2Vk
UG9zICYmIG1fcHJlc3NlZFBvcyA8IGVuZCk7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6
aG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodChTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6
ZSkKK3sKKyAgICByZXR1cm4gY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemVdOworfQorCitp
bnQgUGxhdGZvcm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgoU2Nyb2xsYmFyQ29u
dHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNWZXJ0aWNhbFdpZHRoW2NvbnRy
b2xTaXplXTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBo
ZGMsIGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1T
Y3JvbGxiYXI6OmdyaXBwZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKK3sK
KyAgICByZXR1cm4gSW50UmVjdCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVt
ZUNoYW5nZWQoKQoreworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpzaG91bGRVcGRhdGVC
YWNraW5nU3RvcmUoKSBjb25zdAoreworICAgIHJldHVybiBwYXJlbnQoKSAmJiAocGFyZW50KCkt
PnBhcmVudCgpIHx8ICFpc1ZpZXdTY3JvbGxiYXIoKSk7Cit9CisKK1Bhc3NSZWZQdHI8U2Nyb2xs
YmFyPiBTY3JvbGxiYXI6OmNyZWF0ZU5hdGl2ZVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqIGNs
aWVudCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xT
aXplIHNpemUpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBQbGF0Zm9ybVNjcm9sbGJhcihj
bGllbnQsIG9yaWVudGF0aW9uLCBzaXplKSk7Cit9CisKK30KKwpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9QbGF0Zm9ybVNjcm9sbGJhci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9QbGF0Zm9ybVNjcm9sbGJhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLjUwOGE2MmYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Bs
YXRmb3JtU2Nyb2xsYmFyLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAwOCBUb2NoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVm
IFBsYXRmb3JtU2Nyb2xsYmFyX2gKKyNkZWZpbmUgUGxhdGZvcm1TY3JvbGxiYXJfaAorCisjaW5j
bHVkZSAiU2Nyb2xsQmFyLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJXaWRnZXQu
aCIKKwordHlwZWRlZiBzdHJ1Y3QgSERDX18qIEhEQzsKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CisgICAgY2xhc3MgUGxhdGZvcm1TY3JvbGxiYXIgOiBwdWJsaWMgU2Nyb2xsYmFyIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIFBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCosIFNjcm9s
bGJhck9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSk7CisKKyAgICAgICAgdmlydHVh
bCB+UGxhdGZvcm1TY3JvbGxiYXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNXaWRnZXQo
KSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFBhcmVu
dChTY3JvbGxWaWV3Kik7CisKKyAgICAgICAgdmlydHVhbCBpbnQgd2lkdGgoKSBjb25zdDsKKyAg
ICAgICAgdmlydHVhbCBpbnQgaGVpZ2h0KCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgdm9pZCBz
ZXRSZWN0KGNvbnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEVuYWJsZWQo
Ym9vbCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwYWludChHcmFwaGljc0NvbnRleHQqLCBjb25z
dCBJbnRSZWN0JiBkYW1hZ2VSZWN0KTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91
c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisgICAgICAgIHZpcnR1YWwg
Ym9vbCBoYW5kbGVNb3VzZU91dEV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworICAg
ICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VQcmVzc0V2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYpOworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VSZWxlYXNlRXZlbnQo
Y29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisKKyAgICAgICAgc3RhdGljIHZvaWQgdGhlbWVD
aGFuZ2VkKCk7CisgICAgICAgIHN0YXRpYyBpbnQgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodChT
Y3JvbGxiYXJDb250cm9sU2l6ZSBzaXplID0gUmVndWxhclNjcm9sbGJhcik7CisgICAgICAgIHN0
YXRpYyBpbnQgdmVydGljYWxTY3JvbGxiYXJXaWR0aChTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXpl
ID0gUmVndWxhclNjcm9sbGJhcik7CisKKyAgICAgICAgdm9pZCBhdXRvc2Nyb2xsVGltZXJGaXJl
ZChUaW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4qKTsKKworICAgICAgICBib29sIGlzRW5hYmxlZCgp
IGNvbnN0IHsgcmV0dXJuIGVuYWJsZWQoKTsgfQorICAgICAgICBib29sIGlzVmlzaWJsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fdmlzaWJsZTsgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2hvdygpIHsg
bV92aXNpYmxlID0gdHJ1ZTsgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgaGlkZSgpIHsgbV92aXNp
YmxlID0gZmFsc2U7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZFVwZGF0ZUJhY2tpbmdT
dG9yZSgpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTY3JvbGxiYXIoKSBjb25zdCB7
IHJldHVybiB0cnVlOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1ZpZXdTY3JvbGxiYXIoKSBj
b25zdCB7IHJldHVybiBtX2lzVmlld1Njcm9sbGJhcjsgfQorICAgICAgICB2b2lkIHNldElzVmll
d1Njcm9sbGJhcihib29sIGlzKSB7IG1faXNWaWV3U2Nyb2xsYmFyID0gaXM7IH0KKworICAgIHBy
b3RlY3RlZDoKKyAgICAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVRodW1iUG9zaXRpb24oKTsKKyAg
ICAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVRodW1iUHJvcG9ydGlvbigpOworCisgICAgcHJpdmF0
ZToKKyAgICAgICAgSW50UmVjdCBiYWNrQnV0dG9uUmVjdCgpIGNvbnN0OworICAgICAgICBJbnRS
ZWN0IGZvcndhcmRCdXR0b25SZWN0KCkgY29uc3Q7CisgICAgICAgIEludFJlY3QgdHJhY2tSZWN0
KCkgY29uc3Q7CisgICAgICAgIEludFJlY3QgdGh1bWJSZWN0KCkgY29uc3Q7CisgICAgICAgIElu
dFJlY3QgZ3JpcHBlclJlY3QoY29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25zdDsKKyAgICAg
ICAgdm9pZCBzcGxpdFRyYWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVm
b3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0
KSBjb25zdDsKKworICAgICAgICBpbnQgdGh1bWJQb3NpdGlvbigpIGNvbnN0OworICAgICAgICBp
bnQgdGh1bWJMZW5ndGgoKSBjb25zdDsKKyAgICAgICAgaW50IHRyYWNrTGVuZ3RoKCkgY29uc3Q7
CisKKyAgICAgICAgdm9pZCBwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRS
ZWN0JiBidXR0b25SZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBj
b25zdDsKKyAgICAgICAgdm9pZCBwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IElu
dFJlY3QmIHRyYWNrUmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkg
Y29uc3Q7CisgICAgICAgIHZvaWQgcGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJ
bnRSZWN0JiB0aHVtYlJlY3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0OworICAg
ICAgICB2b2lkIHBhaW50R3JpcHBlcihIREMsIGNvbnN0IEludFJlY3QmIGdyaXBwZXJSZWN0KSBj
b25zdDsKKworICAgICAgICBTY3JvbGxiYXJQYXJ0IGhpdFRlc3QoY29uc3QgUGxhdGZvcm1Nb3Vz
ZUV2ZW50Jik7CisKKyAgICAgICAgdm9pZCBzdGFydFRpbWVySWZOZWVkZWQoZG91YmxlIGRlbGF5
KTsKKyAgICAgICAgdm9pZCBzdG9wVGltZXJJZk5lZWRlZCgpOworICAgICAgICB2b2lkIGF1dG9z
Y3JvbGxQcmVzc2VkUGFydChkb3VibGUgZGVsYXkpOworICAgICAgICBTY3JvbGxEaXJlY3Rpb24g
cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKTsKKyAgICAgICAgU2Nyb2xsR3JhbnVsYXJpdHkg
cHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0eSgpOworCisgICAgICAgIGJvb2wgdGh1bWJVbmRl
ck1vdXNlKCk7CisKKyAgICAgICAgdm9pZCBpbnZhbGlkYXRlUGFydChTY3JvbGxiYXJQYXJ0KTsK
KyAgICAgICAgdm9pZCBpbnZhbGlkYXRlVHJhY2soKTsKKworICAgICAgICBTY3JvbGxiYXJQYXJ0
IG1faG92ZXJlZFBhcnQ7CisgICAgICAgIFNjcm9sbGJhclBhcnQgbV9wcmVzc2VkUGFydDsKKyAg
ICAgICAgaW50IG1fcHJlc3NlZFBvczsKKyAgICAgICAgVGltZXI8UGxhdGZvcm1TY3JvbGxiYXI+
IG1fc2Nyb2xsVGltZXI7CisgICAgICAgIGJvb2wgbV9vdmVybGFwc1Jlc2l6ZXI7CisgICAgICAg
IGJvb2wgbV92aXNpYmxlOworICAgICAgICBib29sIG1faXNWaWV3U2Nyb2xsYmFyOworICAgIH07
CisKK30KKworI2VuZGlmIC8vIFBsYXRmb3JtU2Nyb2xsYmFyX2gKKwpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9TY3JvbGxWaWV3V2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9TY3JvbGxWaWV3V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw
MDAwMDAuLjZmNTBkNGYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNl
L1Njcm9sbFZpZXdXaW5jZS5jcHAKQEAgLTAsMCArMSwxNzM3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA2LCAyMDA3LCAyMDA4IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
IENvcHlyaWdodCAoQykgMjAwNiBKdXN0aW4gSGF5Z29vZCA8amhheWdvb2RAc3BzdS5lZHU+Lgor
ICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNp
bmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTY3JvbGxWaWV3LmgiCisKKyNpbmNsdWRlICJD
aHJvbWUuaCIKKyNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKKyNpbmNsdWRlICJGbG9hdFJlY3Qu
aCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lVHJlZS5oIgorI2luY2x1ZGUg
IkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIklu
dFJlY3QuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50
LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TY3JvbGxiYXIuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVdo
ZWVsRXZlbnQuaCIKKyNpbmNsdWRlICJSZW5kZXJUaGVtZS5oIgorI2luY2x1ZGUgIlJlbmRlcldp
ZGdldC5oIgorI2luY2x1ZGUgIlNjcm9sbGJhci5oIgorI2luY2x1ZGUgIlRyYW5zZm9ybWF0aW9u
TWF0cml4LmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25z
Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hTZXQuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNp
ZmRlZiBfREVCVUcKKyNkZWZpbmUgU0NST0xMX1ZJRVdfREVCVUcgICAgMAorI2VuZGlmCisKK3Vz
aW5nIHN0ZDo6bWluOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8vIHN0YWJsZVJvdW5kIHJv
dW5kcyAtMC41IHRvIDAsIHdoZXJlIGxyb3VuZCByb3VuZHMgLTAuNSB0byAtMS4KK3N0YXRpYyBp
bmxpbmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQoreworICAgIGlmIChkID4gMCkKKyAgICAg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICBpbnQgaSA9IHN0YXRp
Y19jYXN0PGludD4oZCk7CisgICAgcmV0dXJuIGkgLSBkID4gMC41ID8gaSAtIDEgOiBpOworfQor
CitzdGF0aWMgaW5saW5lIEludFBvaW50IG9wZXJhdG9yKihjb25zdCBJbnRQb2ludCYgYSwgZG91
YmxlIGIpCit7CisgICAgcmV0dXJuIEludFBvaW50KHN0YWJsZVJvdW5kKGEueCgpICogYiksIHN0
YWJsZVJvdW5kKGEueSgpICogYikpOworfQorc3RhdGljIGlubGluZSBJbnRQb2ludCBvcGVyYXRv
ci8oY29uc3QgSW50UG9pbnQmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBJbnRQb2ludChz
dGFibGVSb3VuZChhLngoKSAvIGIpLCBzdGFibGVSb3VuZChhLnkoKSAvIGIpKTsKK30KK3N0YXRp
YyBpbmxpbmUgSW50U2l6ZSBvcGVyYXRvciooY29uc3QgSW50U2l6ZSYgYSwgZG91YmxlIGIpCit7
CisgICAgcmV0dXJuIEludFNpemUoc3RhYmxlUm91bmQoYS53aWR0aCgpICogYiksIHN0YWJsZVJv
dW5kKGEuaGVpZ2h0KCkgKiBiKSk7Cit9CitzdGF0aWMgaW5saW5lIEludFNpemUgb3BlcmF0b3Iv
KGNvbnN0IEludFNpemUmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBJbnRTaXplKHN0YWJs
ZVJvdW5kKGEud2lkdGgoKSAvIGIpLCBzdGFibGVSb3VuZChhLmhlaWdodCgpIC8gYikpOworfQor
c3RhdGljIGlubGluZSBJbnRTaXplIG9wZXJhdG9yKihjb25zdCBJbnRTaXplJiBhLCBjb25zdCBG
bG9hdFNpemUgYikKK3sKKyAgICByZXR1cm4gSW50U2l6ZShzdGFibGVSb3VuZChhLndpZHRoKCkg
KiBiLndpZHRoKCkpLCBzdGFibGVSb3VuZChhLmhlaWdodCgpICogYi5oZWlnaHQoKSkpOworfQor
CitzdGF0aWMgaW50IHNjcm9sbEJhclBoeXNpY2FsV2lkdGggPSAxNTsKKworY2xhc3MgU2Nyb2xs
Vmlldzo6U2Nyb2xsVmlld1ByaXZhdGUgeworcHVibGljOgorICAgIFNjcm9sbFZpZXdQcml2YXRl
KFNjcm9sbFZpZXcqIHZpZXcpCisgICAgICAgIDogbV92aWV3KHZpZXcpCisgICAgICAgICwgbV9z
Y3JvbGxiYXJzU3VwcHJlc3NlZChmYWxzZSkKKyAgICAgICAgLCBtX2luVXBkYXRlU2Nyb2xsYmFy
cyhmYWxzZSkKKyAgICAgICAgLCBtX3Njcm9sbGJhcnNBdm9pZGluZ1Jlc2l6ZXIoMCkKKyAgICAg
ICAgLCBtX3ZTY3JvbGxiYXJNb2RlKFNjcm9sbGJhckF1dG8pCisgICAgICAgICwgbV9oU2Nyb2xs
YmFyTW9kZShTY3JvbGxiYXJBdXRvKQorICAgICAgICAsIG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1l
cih0aGlzLCAmU2Nyb2xsVmlld1ByaXZhdGU6OnNjcm9sbEJhclZpc2libGVUaW1lckZpcmVkKQor
ICAgICAgICAsIG1fdmlzaWJsZUNvbnRlbnRzV2lkdGgoMCkKKyAgICAgICAgLCBtX3Zpc2libGVD
b250ZW50c0hlaWdodCgwKQorICAgICAgICAsIG1fcHJldlNjcm9sbGJhclVuZGVyTW91c2UoMCkK
KyAgICAgICAgLCBtX3ByZXZNb3VzZURvd24oZmFsc2UpCisgICAgICAgICwgbV9zY3JvbGxiYXJz
VmlzaWJsZShmYWxzZSkKKyAgICAgICAgLCBtX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkKGZhbHNl
KQorICAgICAgICAsIG1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFycyhmYWxzZSkKKyAgICB7CisgICAg
fQorCisgICAgflNjcm9sbFZpZXdQcml2YXRlKCkKKyAgICB7CisgICAgICAgIHNldEhhc0hvcml6
b250YWxTY3JvbGxiYXIoZmFsc2UpOworICAgICAgICBzZXRIYXNWZXJ0aWNhbFNjcm9sbGJhcihm
YWxzZSk7CisgICAgfQorCisgICAgdm9pZCBzZXRIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKGJvb2wg
aGFzQmFyKTsKKyAgICB2b2lkIHNldEhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGJvb2wgaGFzQmFyKTsK
KworICAgIHZpcnR1YWwgdm9pZCB2YWx1ZUNoYW5nZWQoU2Nyb2xsYmFyKik7CisKKyAgICB2b2lk
IHNjcm9sbEJhY2tpbmdTdG9yZShjb25zdCBJbnRTaXplJiBzY3JvbGxEZWx0YSk7CisKKyAgICB2
b2lkIHNldEFsbG93c1Njcm9sbGluZyhib29sKTsKKyAgICBib29sIGFsbG93c1Njcm9sbGluZygp
IGNvbnN0OworCisgICAgdm9pZCBzaG93U2Nyb2xsYmFycyhib29sIGhvcml6b250YWwsIGJvb2wg
dmVydGljYWwsIGJvb2wgZm9yY2UpOworICAgIHZvaWQgaGlkZVNjcm9sbGJhcnMoKTsKKyAgICB2
b2lkIHNjcm9sbEJhclZpc2libGVUaW1lckZpcmVkKFRpbWVyPFNjcm9sbFZpZXdQcml2YXRlPiop
OworCisgICAgaW50IGdldEhCYXJIZWlnaHQoKSBjb25zdCB7IHJldHVybiBzdGFibGVSb3VuZCgo
ZG91YmxlKXNjcm9sbEJhclBoeXNpY2FsV2lkdGggLyBtX3ZpZXctPnNjYWxlKCkpOyB9CisgICAg
aW50IGdldFZCYXJXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIHN0YWJsZVJvdW5kKChkb3VibGUpc2Ny
b2xsQmFyUGh5c2ljYWxXaWR0aCAvIG1fdmlldy0+c2NhbGUoKSk7IH0KKyAgICBJbnRSZWN0IGdl
dEhDb3JuZXIoY29uc3QgSW50U2l6ZSYgaW5uZXJTaXplKSBjb25zdAorICAgIHsKKyAgICAgICAg
cmV0dXJuIG1faEJhciAmJiBtX2hTY3JvbGxiYXJNb2RlICE9IFNjcm9sbGJhckFsd2F5c09mZiAm
JiBpbm5lclNpemUud2lkdGgoKSA+IG1faEJhci0+d2lkdGgoKQorICAgICAgICAgICAgPyBJbnRS
ZWN0KG1faEJhci0+d2lkdGgoKSwgaW5uZXJTaXplLmhlaWdodCgpIC0gbV9oQmFyLT5oZWlnaHQo
KSwgaW5uZXJTaXplLndpZHRoKCkgLSBtX2hCYXItPndpZHRoKCksIG1faEJhci0+aGVpZ2h0KCkp
CisgICAgICAgICAgICA6IEludFJlY3QoKTsKKyAgICB9CisgICAgSW50UmVjdCBnZXRWQ29ybmVy
KGNvbnN0IEludFNpemUmIGlubmVyU2l6ZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBt
X3ZCYXIgJiYgbV92U2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmYgJiYgaW5uZXJT
aXplLmhlaWdodCgpID4gbV92QmFyLT5oZWlnaHQoKQorICAgICAgICAgICAgPyBJbnRSZWN0KGlu
bmVyU2l6ZS53aWR0aCgpIC0gbV92QmFyLT53aWR0aCgpLCBpbm5lclNpemUuaGVpZ2h0KCksIGlu
bmVyU2l6ZS53aWR0aCgpLCBpbm5lclNpemUuaGVpZ2h0KCkgLSBtX3ZCYXItPmhlaWdodCgpKQor
ICAgICAgICAgICAgOiBJbnRSZWN0KCk7CisgICAgfQorCisgICAgSW50UmVjdCBnZXRIQmFyUmVj
dChjb25zdCBJbnRTaXplJiBpbm5lclNpemUpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4g
SW50UmVjdCgwLCBpbm5lclNpemUuaGVpZ2h0KCkgLSBnZXRIQmFySGVpZ2h0KCksCisgICAgICAg
ICAgICBpbm5lclNpemUud2lkdGgoKSAtIChtX3ZCYXIgJiYgbV92U2Nyb2xsYmFyTW9kZSAhPSBT
Y3JvbGxiYXJBbHdheXNPZmYgPyBnZXRWQmFyV2lkdGgoKSA6IDApLCBnZXRIQmFySGVpZ2h0KCkp
OworICAgIH0KKyAgICBJbnRSZWN0IGdldFZCYXJSZWN0KGNvbnN0IEludFNpemUmIGlubmVyU2l6
ZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBJbnRSZWN0KGlubmVyU2l6ZS53aWR0aCgp
IC0gZ2V0VkJhcldpZHRoKCksIDAsIGdldFZCYXJXaWR0aCgpLAorICAgICAgICAgICAgaW5uZXJT
aXplLmhlaWdodCgpIC0gKG1faEJhciAmJiBtX2hTY3JvbGxiYXJNb2RlICE9IFNjcm9sbGJhckFs
d2F5c09mZiA/IGdldEhCYXJIZWlnaHQoKSA6IDApKTsKKyAgICB9CisKKyAgICAvLyBOb3QgbGlr
ZSBTY3JvbGxWaWV3Ojp2aXNpYmxlQ29udGVudFJlY3QsIHRoaXMgZnVuY3Rpb24gdGFrZXMgc2Ny
b2xsYmFycyBpbiBjb3VudCwKKyAgICAvLyBhbmQgcmV0dXJuIHRoZSBhcmVhIG5vdCBpbmNsdWRp
bmcgc2Nyb2xsYmFycy4KKyAgICBJbnRSZWN0ICAgIGdldFZpc2libGVDb250ZW50UmVjdCgpIGNv
bnN0CisgICAgeworICAgICAgICBJbnRSZWN0IHJlY3QobV92aWV3LT5mcmFtZVJlY3QoKSk7Cisg
ICAgICAgIGlmIChtX3Njcm9sbGJhcnNWaXNpYmxlKSB7CisgICAgICAgICAgICBpZiAoY2FuU2hv
d0hTY3JvbGxiYXIoKSkKKyAgICAgICAgICAgICAgICByZWN0LnNldEhlaWdodChtX2hCYXItPnko
KSk7CisgICAgICAgICAgICBpZiAoY2FuU2hvd1ZTY3JvbGxiYXIoKSkKKyAgICAgICAgICAgICAg
ICByZWN0LnNldFdpZHRoKG1fdkJhci0+eCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
cmVjdDsKKyAgICB9CisKKyAgICB2b2lkIGludmFsaWRhdGVTY3JvbGxiYXIoUGxhdGZvcm1TY3Jv
bGxiYXIqIGJhciwgSFdORCBod25kLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHJhbnMg
PSAwKTsKKyAgICB2b2lkIGludmFsaWRhdGVTY3JvbGxiYXJzKGJvb2wgaG9yaXpvbnRhbCwgYm9v
bCB2ZXJ0aWNhbCwgYm9vbCBjb3JuZXIpOworCisgICAgYm9vbCBjYW5TaG93VlNjcm9sbGJhcigp
IGNvbnN0IHsgcmV0dXJuIG1fdkJhciAmJiBtX3ZTY3JvbGxiYXJNb2RlICE9IFNjcm9sbGJhckFs
d2F5c09mZjsgfQorICAgIGJvb2wgY2FuU2hvd0hTY3JvbGxiYXIoKSBjb25zdCB7IHJldHVybiBt
X2hCYXIgJiYgbV9oU2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmY7IH0KKworICAg
IHZvaWQgc2V0QXV0b1Njcm9sbGJhcnMoYm9vbCBkKQorICAgIHsKKyAgICAgICAgaWYgKGQgPT0g
bV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IGlmIChtX2F1dG9TaG93SGlkZVNjcm9sbGJhcnMgPSBkKSB7CisgICAgICAgICAgICBpZiAobV9z
Y3JvbGxiYXJzVmlzaWJsZVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgICAgICAgICAgbV9zY3Jv
bGxiYXJzVmlzaWJsZVRpbWVyLnN0b3AoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtX3Njcm9sbGJh
cnNWaXNpYmxlICYmICFtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIuaXNBY3RpdmUoKSkKKyAgICAg
ICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1lci5zdGFydE9uZVNob3QoMi4wKTsKKyAgICB9
CisKKyAgICBTY3JvbGxWaWV3KiBtX3ZpZXc7CisgICAgSW50U2l6ZSBtX3Njcm9sbE9mZnNldDsK
KyAgICBJbnRTaXplIG1fY29udGVudHNTaXplOworICAgIGJvb2wgbV9zY3JvbGxiYXJzU3VwcHJl
c3NlZDsKKyAgICBib29sIG1faW5VcGRhdGVTY3JvbGxiYXJzOworICAgIGludCBtX3Njcm9sbGJh
cnNBdm9pZGluZ1Jlc2l6ZXI7CisgICAgU2Nyb2xsYmFyTW9kZSBtX3ZTY3JvbGxiYXJNb2RlOwor
ICAgIFNjcm9sbGJhck1vZGUgbV9oU2Nyb2xsYmFyTW9kZTsKKyAgICBSZWZQdHI8UGxhdGZvcm1T
Y3JvbGxiYXI+IG1fdkJhcjsKKyAgICBSZWZQdHI8UGxhdGZvcm1TY3JvbGxiYXI+IG1faEJhcjsK
KyAgICBIUkdOIG1fZGlydHlSZWdpb247CisgICAgSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+IG1f
Y2hpbGRyZW47CisKKyAgICBib29sIG1fc2Nyb2xsYmFyc1Zpc2libGU7CisgICAgYm9vbCBtX3No
b3dTY3JvbGxiYXJTdXBwcmVzc2VkOworICAgIFRpbWVyPFNjcm9sbFZpZXdQcml2YXRlPiBtX3Nj
cm9sbGJhcnNWaXNpYmxlVGltZXI7CisKKyAgICBJbnRSZWN0IG1fcGh5c2ljYWxHZW9tZXRyeTsK
KyAgICBmbG9hdCBtX3Zpc2libGVDb250ZW50c1dpZHRoOworICAgIGZsb2F0IG1fdmlzaWJsZUNv
bnRlbnRzSGVpZ2h0OworICAgIFBsYXRmb3JtU2Nyb2xsYmFyKiBtX3ByZXZTY3JvbGxiYXJVbmRl
ck1vdXNlOworICAgIGJvb2wgbV9wcmV2TW91c2VEb3duOworICAgIGJvb2wgbV9hdXRvU2hvd0hp
ZGVTY3JvbGxiYXJzOworfTsKKworLy8gRm9yIHRvcCBsZXZlbCBvbmx5IQordm9pZCBTY3JvbGxW
aWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6aW52YWxpZGF0ZVNjcm9sbGJhcihQbGF0Zm9ybVNjcm9s
bGJhciogYmFyLCBIV05EIGh3bmQsIGNvbnN0IFRyYW5zZm9ybWF0aW9uTWF0cml4KiB0cmFucykK
K3sKKyAgICBpZiAoIWJhciB8fCAhaHduZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHRy
YW5zKSB7CisgICAgICAgIFJFQ1QgcmVjdFdpbiA9IHRyYW5zLT5tYXBSZWN0KGJhci0+ZnJhbWVS
ZWN0KCkpOworICAgICAgICBpZiAocmVjdFdpbi5ib3R0b20gPCBtX3BoeXNpY2FsR2VvbWV0cnku
Ym90dG9tKCkpCisgICAgICAgICAgICByZWN0V2luLmJvdHRvbSA9IG1fcGh5c2ljYWxHZW9tZXRy
eS5ib3R0b20oKTsKKyAgICAgICAgaWYgKHJlY3RXaW4ucmlnaHQgPCBtX3BoeXNpY2FsR2VvbWV0
cnkucmlnaHQoKSkKKyAgICAgICAgICAgIHJlY3RXaW4ucmlnaHQgPSBtX3BoeXNpY2FsR2VvbWV0
cnkucmlnaHQoKTsKKyAgICAgICAgaWYgKG1fdmlldy0+aXNWaXNpYmxlKCkpCisgICAgICAgICAg
ICA6OkludmFsaWRhdGVSZWN0KGh3bmQsICZyZWN0V2luLCBGQUxTRSk7CisgICAgfSBlbHNlIHsK
KyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggbXlUcmFucyhtX3ZpZXctPnNjYWxlKCksIDAs
IDAsIG1fdmlldy0+c2NhbGUoKSwgbV92aWV3LT54KCksIG1fdmlldy0+eSgpKTsKKyAgICAgICAg
aW52YWxpZGF0ZVNjcm9sbGJhcihiYXIsIGh3bmQsICZteVRyYW5zKTsKKyAgICB9Cit9CisKK3Zv
aWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OmludmFsaWRhdGVTY3JvbGxiYXJzKGJv
b2wgaG9yaXpvbnRhbCwgYm9vbCB2ZXJ0aWNhbCwgYm9vbCBjb3JuZXIpCit7CisgICAgaWYgKCFt
X3Njcm9sbGJhcnNWaXNpYmxlKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoKCF2ZXJ0aWNh
bCB8fCAhY2FuU2hvd1ZTY3JvbGxiYXIoKSkgJiYgKCFob3Jpem9udGFsIHx8ICFjYW5TaG93SFNj
cm9sbGJhcigpKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fdmlldy0+cGFyZW50KCkp
IHsKKyAgICAgICAgaWYgKGhvcml6b250YWwgJiYgY2FuU2hvd0hTY3JvbGxiYXIoKSkKKyAgICAg
ICAgICAgIG1faEJhci0+aW52YWxpZGF0ZSgpOworICAgICAgICBpZiAodmVydGljYWwgJiYgY2Fu
U2hvd1ZTY3JvbGxiYXIoKSkKKyAgICAgICAgICAgIG1fdkJhci0+aW52YWxpZGF0ZSgpOworCisg
ICAgICAgIGlmIChjb3JuZXIpIHsKKyAgICAgICAgICAgIEludFNpemUgaW5uZXJTaXplKG1fdmlz
aWJsZUNvbnRlbnRzV2lkdGgsIG1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0KTsKKyAgICAgICAgICAg
IC8vIEludmFsaWRhdGUgdGhlIHNjcm9sbCBjb3JuZXIgdG9vIG9uIHVuc3VwcHJlc3MuCisgICAg
ICAgICAgICBJbnRSZWN0IGhDb3JuZXIgPSBnZXRIQ29ybmVyKGlubmVyU2l6ZSk7CisgICAgICAg
ICAgICBtX3ZpZXctPmludmFsaWRhdGVSZWN0KGhDb3JuZXIpOworCisgICAgICAgICAgICBJbnRS
ZWN0IHZDb3JuZXIgPSBnZXRWQ29ybmVyKGlubmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAodkNv
cm5lciAhPSBoQ29ybmVyKQorICAgICAgICAgICAgICAgIG1fdmlldy0+aW52YWxpZGF0ZVJlY3Qo
dkNvcm5lcik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIW1fdmlldy0+
aXNWaXNpYmxlKCkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgZG91YmxlIHNjYWxl
ID0gbV92aWV3LT5zY2FsZSgpOworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCB0cmFucyhz
Y2FsZSwgMCwgMCwgc2NhbGUsIG1fdmlldy0+eCgpLCBtX3ZpZXctPnkoKSk7CisKKyAgICAgICAg
SFdORCBwbGF0Zm9ybVdpZGdldEhhbmRsZSA9IG1fdmlldy0+cGxhdGZvcm1XaWRnZXQoKTsKKyAg
ICAgICAgaWYgKGhvcml6b250YWwgJiYgY2FuU2hvd0hTY3JvbGxiYXIoKSkKKyAgICAgICAgICAg
IGludmFsaWRhdGVTY3JvbGxiYXIobV9oQmFyLmdldCgpLCBwbGF0Zm9ybVdpZGdldEhhbmRsZSwg
JnRyYW5zKTsKKyAgICAgICAgaWYgKHZlcnRpY2FsICYmIGNhblNob3dWU2Nyb2xsYmFyKCkpCisg
ICAgICAgICAgICBpbnZhbGlkYXRlU2Nyb2xsYmFyKG1fdkJhci5nZXQoKSwgcGxhdGZvcm1XaWRn
ZXRIYW5kbGUsICZ0cmFucyk7CisgICAgfQorfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9sbFZp
ZXdQcml2YXRlOjpzZXRIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKGJvb2wgaGFzQmFyKQoreworICAg
IGlmIChoYXNCYXIgJiYgIW1faEJhcikgeworICAgICAgICBtX2hCYXIgPSBhZG9wdFJlZihuZXcg
UGxhdGZvcm1TY3JvbGxiYXIobV92aWV3LCBIb3Jpem9udGFsU2Nyb2xsYmFyLCBSZWd1bGFyU2Ny
b2xsYmFyKSk7CisgICAgICAgIG1faEJhci0+c2V0SXNWaWV3U2Nyb2xsYmFyKHRydWUpOworICAg
ICAgICBJbnRTaXplIGlubmVyU2l6ZShtX3Zpc2libGVDb250ZW50c1dpZHRoLCBtX3Zpc2libGVD
b250ZW50c0hlaWdodCk7CisgICAgICAgIG1fdmlldy0+YWRkQ2hpbGQobV9oQmFyLmdldCgpKTsK
KyAgICAgICAgbV9oQmFyLT5zZXRGcmFtZVJlY3QoZ2V0SEJhclJlY3QoaW5uZXJTaXplKSk7Cisg
ICAgICAgIGlmICghbV9zY3JvbGxiYXJzVmlzaWJsZSkKKyAgICAgICAgICAgIG1faEJhci0+aGlk
ZSgpOworICAgIH0gZWxzZSBpZiAoIWhhc0JhciAmJiBtX2hCYXIpIHsKKyAgICAgICAgbV92aWV3
LT5yZW1vdmVDaGlsZChtX2hCYXIuZ2V0KCkpOworICAgICAgICBtX2hCYXIgPSAwOworICAgIH0K
K30KKwordm9pZCBTY3JvbGxWaWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6c2V0SGFzVmVydGljYWxT
Y3JvbGxiYXIoYm9vbCBoYXNCYXIpCit7CisgICAgaWYgKGhhc0JhciAmJiAhbV92QmFyKSB7Cisg
ICAgICAgIG1fdkJhciA9IGFkb3B0UmVmKG5ldyBQbGF0Zm9ybVNjcm9sbGJhcihtX3ZpZXcsIFZl
cnRpY2FsU2Nyb2xsYmFyLCBSZWd1bGFyU2Nyb2xsYmFyKSk7CisgICAgICAgIG1fdkJhci0+c2V0
SXNWaWV3U2Nyb2xsYmFyKHRydWUpOworICAgICAgICBJbnRTaXplIGlubmVyU2l6ZShtX3Zpc2li
bGVDb250ZW50c1dpZHRoLCBtX3Zpc2libGVDb250ZW50c0hlaWdodCk7CisgICAgICAgIG1fdmll
dy0+YWRkQ2hpbGQobV92QmFyLmdldCgpKTsKKyAgICAgICAgbV92QmFyLT5zZXRGcmFtZVJlY3Qo
Z2V0VkJhclJlY3QoaW5uZXJTaXplKSk7CisgICAgICAgIGlmICghbV9zY3JvbGxiYXJzVmlzaWJs
ZSkKKyAgICAgICAgICAgIG1fdkJhci0+aGlkZSgpOworICAgIH0gZWxzZSBpZiAoIWhhc0JhciAm
JiBtX3ZCYXIpIHsKKyAgICAgICAgbV92aWV3LT5yZW1vdmVDaGlsZChtX3ZCYXIuZ2V0KCkpOwor
ICAgICAgICBtX3ZCYXIgPSAwOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3OjpTY3JvbGxW
aWV3UHJpdmF0ZTo6dmFsdWVDaGFuZ2VkKFNjcm9sbGJhciogYmFyKQoreworICAgIC8vIEZpZ3Vy
ZSBvdXQgaWYgd2UgcmVhbGx5IG1vdmVkLgorICAgIEludFNpemUgbmV3T2Zmc2V0ID0gbV9zY3Jv
bGxPZmZzZXQ7CisgICAgeworICAgICAgICBpbnQgdmFsdWUgPSBiYXItPnZhbHVlKCk7CisgICAg
ICAgIGRvdWJsZSBzY2FsZSA9IG1fdmlldy0+c2NhbGUoKTsKKyAgICAgICAgdmFsdWUgPSBzdGFi
bGVSb3VuZChzdGFibGVSb3VuZCh2YWx1ZSAqIHNjYWxlKSAvIHNjYWxlKTsKKworICAgICAgICBp
ZiAoYmFyID09IG1faEJhcikKKyAgICAgICAgICAgIG5ld09mZnNldC5zZXRXaWR0aCh2YWx1ZSk7
CisgICAgICAgIGVsc2UgaWYgKGJhciA9PSBtX3ZCYXIpCisgICAgICAgICAgICBuZXdPZmZzZXQu
c2V0SGVpZ2h0KHZhbHVlKTsKKyAgICB9CisgICAgSW50U2l6ZSBzY3JvbGxEZWx0YSA9IG5ld09m
ZnNldCAtIG1fc2Nyb2xsT2Zmc2V0OworICAgIGlmIChzY3JvbGxEZWx0YSA9PSBJbnRTaXplKCkp
CisgICAgICAgIHJldHVybjsKKworI2lmIGRlZmluZWQoU0NST0xMX1ZJRVdfREVCVUcpICYmIFND
Uk9MTF9WSUVXX0RFQlVHID49IDIKKyAgICBwcmludGYoIlNjcm9sbFZpZXc6IDB4JXg6MHgleDog
bV9zY3JvbGxPZmZzZXQ6ICglZCwgJWQpIC0+ICglZCwgJWQpLlxuIiwgc3RhdGljX2Nhc3Q8RnJh
bWVWaWV3Kj4obV92aWV3KS0+cGFyZW50KCksIG1fdmlldywKKyAgICAgICAgbV9zY3JvbGxPZmZz
ZXQud2lkdGgoKSwgbV9zY3JvbGxPZmZzZXQuaGVpZ2h0KCksIG5ld09mZnNldC53aWR0aCgpLCBu
ZXdPZmZzZXQuaGVpZ2h0KCkpOworI2VuZGlmCisKKyAgICBtX3Njcm9sbE9mZnNldCA9IG5ld09m
ZnNldDsKKworICAgIGlmIChtX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkKQorICAgICAgICByZXR1
cm47CisKKyAgICBzaG93U2Nyb2xsYmFycyhmYWxzZSwgZmFsc2UsIGZhbHNlKTsKKyAgICBzY3Jv
bGxCYWNraW5nU3RvcmUoc2Nyb2xsRGVsdGEpOworICAgIC8vc3RhdGljX2Nhc3Q8RnJhbWVWaWV3
Kj4obV92aWV3KS0+ZnJhbWUoKS0+c2VuZFNjcm9sbEV2ZW50KCk7CisgICAgY29uc3QgRnJhbWVW
aWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPihtX3ZpZXcpOwor
ICAgIGlmIChGcmFtZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAgaWYg
KGZyYW1lLT5zaG91bGRCbGlua0NhcmV0KCkpCisgICAgICAgICAgICBtX3ZpZXctPmhvc3RXaW5k
b3coKS0+Y2FyZXRSZWN0Q2hhbmdlZCgpOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3OjpT
Y3JvbGxWaWV3UHJpdmF0ZTo6c2Nyb2xsQmFja2luZ1N0b3JlKGNvbnN0IEludFNpemUmIHNjcm9s
bERlbHRhKQoreworICAgIGlmICghc2Nyb2xsRGVsdGEud2lkdGgoKSAmJiAhc2Nyb2xsRGVsdGEu
aGVpZ2h0KCkpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3Qgc2Nyb2xsVmlld1JlY3Q7
CisgICAgaWYgKG1fdmlldy0+cGFyZW50KCkpCisgICAgICAgIHNjcm9sbFZpZXdSZWN0ID0gbV92
aWV3LT5wYXJlbnQoKS0+Y29udGVudHNUb1dpbmRvdyhnZXRWaXNpYmxlQ29udGVudFJlY3QoKSk7
CisgICAgZWxzZQorICAgICAgICBzY3JvbGxWaWV3UmVjdCA9IG1fdmlldy0+Y29udGVudHNUb1dp
bmRvdyhJbnRSZWN0KEludFBvaW50KDAsIDApLCBtX2NvbnRlbnRzU2l6ZSkpOworCisgICAgSW50
U2l6ZSBvbGRPZmZzZXQgPSAobV9zY3JvbGxPZmZzZXQgLSBzY3JvbGxEZWx0YSkgKiBtX3ZpZXct
PnNjYWxlKCk7CisgICAgSW50U2l6ZSBuZXdPZmZzZXQgPSBtX3Njcm9sbE9mZnNldCAqIG1fdmll
dy0+c2NhbGUoKTsKKyAgICBGcmFtZSogZnJhbWUgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPiht
X3ZpZXcpLT5mcmFtZSgpOworICAgIG1fdmlldy0+aG9zdFdpbmRvdygpLT5zY3JvbGwoZnJhbWUs
IEludFNpemUob2xkT2Zmc2V0LndpZHRoKCkgLSBuZXdPZmZzZXQud2lkdGgoKQorICAgICAgICAs
IG9sZE9mZnNldC5oZWlnaHQoKSAtIG5ld09mZnNldC5oZWlnaHQoKSkKKyAgICAgICAgLCBzY3Jv
bGxWaWV3UmVjdCwgc2Nyb2xsVmlld1JlY3QpOworICAgIG1fdmlldy0+aG9zdFdpbmRvdygpLT5y
ZXBhaW50KGZyYW1lLCBzY3JvbGxWaWV3UmVjdCwgZmFsc2UsIHRydWUsIGZhbHNlKTsKKworICAg
IC8vIFRoaXMgY2FsbCB3aWxsIG1vdmUgY2hpbGQgSFdORHMgKHBsdWdpbnMpIGFuZCBpbnZhbGlk
YXRlIHRoZW0gYXMgd2VsbC4KKyAgICBtX3ZpZXctPmZyYW1lUmVjdHNDaGFuZ2VkKCk7Cit9CisK
K3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnNldEFsbG93c1Njcm9sbGluZyhi
b29sIGZsYWcpCit7CisgICAgaWYgKGZsYWcgJiYgbV92U2Nyb2xsYmFyTW9kZSA9PSBTY3JvbGxi
YXJBbHdheXNPZmYpCisgICAgICAgIG1fdlNjcm9sbGJhck1vZGUgPSBTY3JvbGxiYXJBdXRvOwor
ICAgIGVsc2UgaWYgKCFmbGFnKQorICAgICAgICBtX3ZTY3JvbGxiYXJNb2RlID0gU2Nyb2xsYmFy
QWx3YXlzT2ZmOworCisgICAgaWYgKGZsYWcgJiYgbV9oU2Nyb2xsYmFyTW9kZSA9PSBTY3JvbGxi
YXJBbHdheXNPZmYpCisgICAgICAgIG1faFNjcm9sbGJhck1vZGUgPSBTY3JvbGxiYXJBdXRvOwor
ICAgIGVsc2UgaWYgKCFmbGFnKQorICAgICAgICBtX2hTY3JvbGxiYXJNb2RlID0gU2Nyb2xsYmFy
QWx3YXlzT2ZmOworCisgICAgbV92aWV3LT51cGRhdGVTY3JvbGxiYXJzKG1fc2Nyb2xsT2Zmc2V0
KTsKK30KKworYm9vbCBTY3JvbGxWaWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6YWxsb3dzU2Nyb2xs
aW5nKCkgY29uc3QKK3sKKyAgICAvLyBSZXR1cm4gWUVTIGlmIGVpdGhlciBob3Jpem9udGFsIG9y
IHZlcnRpY2FsIHNjcm9sbGluZyBpcyBhbGxvd2VkLgorICAgIHJldHVybiBtX2hTY3JvbGxiYXJN
b2RlICE9IFNjcm9sbGJhckFsd2F5c09mZiB8fCBtX3ZTY3JvbGxiYXJNb2RlICE9IFNjcm9sbGJh
ckFsd2F5c09mZjsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6c2hv
d1Njcm9sbGJhcnMoYm9vbCBob3Jpem9udGFsLCBib29sIHZlcnRpY2FsLCBib29sIG1hbnVhbCkK
K3sKKyAgICBpZiAoIW1hbnVhbCAmJiAhbV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzKQorICAgICAg
ICByZXR1cm47CisKKyAgICBpZiAobV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyLmlzQWN0aXZlKCkp
CisgICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1lci5zdG9wKCk7CisKKyAgICBpZiAoIWNh
blNob3dIU2Nyb2xsYmFyKCkgJiYgIWNhblNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmICghbV9zY3JvbGxiYXJzVmlzaWJsZSkgeworICAgICAgICBJbnRTaXplIGlu
bmVyU2l6ZShtX3Zpc2libGVDb250ZW50c1dpZHRoLCBtX3Zpc2libGVDb250ZW50c0hlaWdodCk7
CisKKyAgICAgICAgaWYgKG1faEJhcikgeworICAgICAgICAgICAgbV9oQmFyLT5zaG93KCk7Cisg
ICAgICAgICAgICBtX2hCYXItPnNldEZyYW1lUmVjdChnZXRIQmFyUmVjdChpbm5lclNpemUpKTsK
KyAgICAgICAgfQorICAgICAgICBpZiAobV92QmFyKSB7CisgICAgICAgICAgICBtX3ZCYXItPnNo
b3coKTsKKyAgICAgICAgICAgIG1fdkJhci0+c2V0RnJhbWVSZWN0KGdldFZCYXJSZWN0KGlubmVy
U2l6ZSkpOworICAgICAgICB9CisgICAgICAgIGlmICghbV92aWV3LT5wYXJlbnQoKSkgeworICAg
ICAgICAgICAgaW52YWxpZGF0ZVNjcm9sbGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAg
ICAgICBtX3Njcm9sbGJhcnNWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChtX3ZpZXct
PmlzVmlzaWJsZSgpKQorICAgICAgICAgICAgICAgIFVwZGF0ZVdpbmRvdyhtX3ZpZXctPnBsYXRm
b3JtV2lkZ2V0KCkpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtX3ZpZXctPnBhcmVudCgp
KSB7CisgICAgICAgIGludmFsaWRhdGVTY3JvbGxiYXJzKGhvcml6b250YWwgfHwgIW1fc2Nyb2xs
YmFyc1Zpc2libGUsIHZlcnRpY2FsIHx8ICFtX3Njcm9sbGJhcnNWaXNpYmxlLCAhbV9zY3JvbGxi
YXJzVmlzaWJsZSk7CisgICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGUgPSB0cnVlOworICAgICAg
ICAvL21fdmlldy0+dXBkYXRlQmFja2luZ1N0b3JlKCk7CisgICAgfQorCisgICAgaWYgKG1fYXV0
b1Nob3dIaWRlU2Nyb2xsYmFycykKKyAgICAgICAgbV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyLnN0
YXJ0T25lU2hvdCgyLjApOworfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2YXRl
OjpoaWRlU2Nyb2xsYmFycygpCit7CisgICAgaWYgKG1fc2Nyb2xsYmFyc1Zpc2libGUpIHsKKyAg
ICAgICAgbV9zY3JvbGxiYXJzVmlzaWJsZSA9IGZhbHNlOworICAgICAgICBpbnZhbGlkYXRlU2Ny
b2xsYmFycyh0cnVlLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgaWYgKG1faEJhcikgeworICAgICAg
ICAgICAgbV9oQmFyLT5oaWRlKCk7CisgICAgICAgICAgICBtX2hCYXItPnNldEZyYW1lUmVjdChJ
bnRSZWN0KDAsIDAsIDAsIG1faEJhci0+aGVpZ2h0KCkpKTsKKyAgICAgICAgfQorICAgICAgICBp
ZiAobV92QmFyKSB7CisgICAgICAgICAgICBtX3ZCYXItPmhpZGUoKTsKKyAgICAgICAgICAgIG1f
dkJhci0+c2V0RnJhbWVSZWN0KEludFJlY3QoMCwgMCwgbV92QmFyLT53aWR0aCgpLCAwKSk7Cisg
ICAgICAgIH0KKyAgICAgICAgaWYgKG1fdmlldy0+aXNWaXNpYmxlKCkpCisgICAgICAgICAgICBV
cGRhdGVXaW5kb3cobV92aWV3LT5wbGF0Zm9ybVdpZGdldCgpKTsKKyAgICB9Cit9CisKK3ZvaWQg
U2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnNjcm9sbEJhclZpc2libGVUaW1lckZpcmVk
KFRpbWVyPFNjcm9sbFZpZXdQcml2YXRlPiopCit7CisgICAgaWYgKG1fc2Nyb2xsYmFyc1Zpc2li
bGVUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIuc3Rv
cCgpOworCisgICAgaWYgKCFtX2F1dG9TaG93SGlkZVNjcm9sbGJhcnMpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmICghY2FuU2hvd0hTY3JvbGxiYXIoKSAmJiAhY2FuU2hvd1ZTY3JvbGxiYXIo
KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fc2Nyb2xsYmFyc1Zpc2libGUpIHsKKyAg
ICAgICAgaWYgKG1fdmlldy0+aXNWaXNpYmxlKCkgJiYgR2V0Q2FwdHVyZSgpID09IG1fdmlldy0+
cGxhdGZvcm1XaWRnZXQoKSkKKyAgICAgICAgICAgIC8vIENhcHR1cmluZyBtb3VzZSBldmVudCwg
dXNlciBtaWdodCBiZSBkcmFnZ2luZyBzY3JvbGwgYmFyCisgICAgICAgICAgICBtX3Njcm9sbGJh
cnNWaXNpYmxlVGltZXIuc3RhcnRPbmVTaG90KDIuMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIGhpZGVTY3JvbGxiYXJzKCk7CisgICAgfQorfQorCitTY3JvbGxWaWV3OjpTY3JvbGxWaWV3
KCkKKyAgICA6IG1fZGF0YShuZXcgU2Nyb2xsVmlld1ByaXZhdGUodGhpcykpCisgICAgLCBtX3Nj
YWxlKDEuKQorICAgICwgbV91c2VBbmNob3JQb2ludChmYWxzZSkKKyAgICAsIG1fYWxsb3dzQ2hh
bmdpbmdTY3JvbGxiYXJNb2RlKHRydWUpCit7Cit9CisKK1Njcm9sbFZpZXc6On5TY3JvbGxWaWV3
KCkKK3sKKyAgICBkZWxldGUgbV9kYXRhOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnJlcGFpbnRD
b250ZW50UmVjdGFuZ2xlKGNvbnN0IEludFJlY3QmIHJlY3QsIGJvb2wgbm93KQoreworICAgIGlm
IChyZWN0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29uc3QgRnJhbWVWaWV3
KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICBo
b3N0V2luZG93KCktPmRpc3BhdGNoQ29udGVudHNVcGRhdGVkKGZyYW1lVmlldy0+ZnJhbWUoKSwg
cmVjdCk7CisKKyAgICBob3N0V2luZG93KCktPnJlcGFpbnQoZnJhbWVWaWV3LT5mcmFtZSgpLCBj
b250ZW50c1RvV2luZG93KHJlY3QpLCB0cnVlLCBub3cpOworfQorCitpbnQgU2Nyb2xsVmlldzo6
dmlzaWJsZVdpZHRoKCkgY29uc3QKK3sKKyAgICBpbnQgdyA9IHBhcmVudCgpID8gd2lkdGgoKSA6
IHZpZXdTaXplLndpZHRoKCkgPD0gMCA/IDgwMCA6IHZpZXdTaXplLndpZHRoKCk7CisgICAgaWYg
KCFtX2RhdGEtPm1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFycyAmJiBtX2RhdGEtPm1fc2Nyb2xsYmFy
c1Zpc2libGUgJiYgbV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigpKQorICAgICAgICB3IC09IG1f
ZGF0YS0+bV92QmFyLT53aWR0aCgpOworICAgIHJldHVybiB3OworfQorCitpbnQgU2Nyb2xsVmll
dzo6dmlzaWJsZUhlaWdodCgpIGNvbnN0Cit7CisgICAgaW50IGggPSBwYXJlbnQoKSA/IGhlaWdo
dCgpIDogdmlld1NpemUuaGVpZ2h0KCkgPD0gMCA/IDEwMjQgOiB2aWV3U2l6ZS5oZWlnaHQoKTsK
KyAgICBpZiAoIW1fZGF0YS0+bV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzICYmIG1fZGF0YS0+bV9z
Y3JvbGxiYXJzVmlzaWJsZSAmJiBtX2RhdGEtPmNhblNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAg
IGggLT0gbV9kYXRhLT5tX2hCYXItPmhlaWdodCgpOworICAgIHJldHVybiBoOworfQorCitJbnRS
ZWN0IFNjcm9sbFZpZXc6OnZpc2libGVDb250ZW50UmVjdChib29sKSBjb25zdAoreworICAgIHJl
dHVybiBJbnRSZWN0KG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQud2lkdGgoKQorICAgICAgICAsIG1f
ZGF0YS0+bV9zY3JvbGxPZmZzZXQuaGVpZ2h0KCkKKyAgICAgICAgLCBtX2RhdGEtPm1fdmlzaWJs
ZUNvbnRlbnRzV2lkdGgKKyAgICAgICAgLCBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0
CisgICAgICAgICk7Cit9CisKK0ludFJlY3QgU2Nyb2xsVmlldzo6dmlzaWJsZUNvbnRlbnRSZWN0
Q29uc2lkZXJpbmdFeHRlcm5hbFNjcm9sbGVycygpIGNvbnN0Cit7CisgICAgLy8gZXh0ZXJuYWwg
c2Nyb2xsZXJzIG5vdCBzdXBwb3J0ZWQgZm9yIG5vdworICAgIHJldHVybiB2aXNpYmxlQ29udGVu
dFJlY3QoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRDb250ZW50c1BvcyhpbnQgbmV3WCwg
aW50IG5ld1kpCit7CisgICAgaW50IGR4ID0gbmV3WCAtIGNvbnRlbnRzWCgpOworICAgIGludCBk
eSA9IG5ld1kgLSBjb250ZW50c1koKTsKKyAgICBzY3JvbGxCeShkeCwgZHkpOworfQorCit2b2lk
IFNjcm9sbFZpZXc6OnNldENvbnRlbnRzU2l6ZShjb25zdCBJbnRTaXplJiBuZXdDb250ZW50c1Np
emUpCit7CisgICAgaWYgKG1fZGF0YS0+bV9jb250ZW50c1NpemUgPT0gbmV3Q29udGVudHNTaXpl
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX2RhdGEtPm1fY29udGVudHNTaXplID0gbmV3Q29u
dGVudHNTaXplOworCisgICAgaGlkZUN1cnJlbnRQb3B1cE1lbnUoKTsKKworICAgIHVwZGF0ZVNj
cm9sbGJhcnMobV9kYXRhLT5tX3Njcm9sbE9mZnNldCk7CisKKyAgICBpZiAoaXNGcmFtZVZpZXco
KSkgeworICAgICAgICBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PEZyYW1lVmll
dyo+KHRoaXMpOworICAgICAgICBpZiAoRnJhbWUgKmZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgp
KQorICAgICAgICAgICAgZnJhbWUtPnBhZ2UoKS0+Y2hyb21lKCktPmNvbnRlbnRzU2l6ZUNoYW5n
ZWQoZnJhbWVWaWV3LT5mcmFtZSgpLCBuZXdDb250ZW50c1NpemUpOworICAgIH0KK30KKwordm9p
ZCBTY3JvbGxWaWV3OjpzZXRGcmFtZVJlY3QoY29uc3QgSW50UmVjdCYgbmV3R2VvbWV0cnksIGJv
b2wgbmVlZHNMYXlvdXQpCit7CisgICAgSW50UmVjdCBuZXdSZWN0OworICAgIEludFNpemUgb2xk
VmlzaWJsZUNvbnRlbnRzU2l6ZShtaW4obV9kYXRhLT5tX2NvbnRlbnRzU2l6ZS53aWR0aCgpLCAo
aW50KW1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNXaWR0aCkKKyAgICAgICAgLCBtaW4obV9kYXRh
LT5tX2NvbnRlbnRzU2l6ZS5oZWlnaHQoKSwgKGludCltX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRz
SGVpZ2h0KSk7CisgICAgaWYgKHBhcmVudCgpKSB7CisgICAgICAgIG1fZGF0YS0+bV9waHlzaWNh
bEdlb21ldHJ5ID0gcGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3cobmV3R2VvbWV0cnkpOworICAg
ICAgICBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGggPSBuZXdHZW9tZXRyeS53aWR0aCgp
OworICAgICAgICBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0ID0gbmV3R2VvbWV0cnku
aGVpZ2h0KCk7CisgICAgICAgIG5ld1JlY3QgPSBuZXdHZW9tZXRyeTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICBtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSA9IG5ld0dlb21ldHJ5OworICAgICAg
ICBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGggPSBuZXdHZW9tZXRyeS53aWR0aCgpIC8g
c2NhbGUoKTsKKyAgICAgICAgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCA9IG5ld0dl
b21ldHJ5LmhlaWdodCgpIC8gc2NhbGUoKTsKKyAgICAgICAgbmV3UmVjdC5zZXRMb2NhdGlvbihu
ZXdHZW9tZXRyeS5sb2NhdGlvbigpKTsKKyAgICAgICAgbmV3UmVjdC5zZXRXaWR0aChjZWlsKG1f
ZGF0YS0+bV92aXNpYmxlQ29udGVudHNXaWR0aCkpOworICAgICAgICBuZXdSZWN0LnNldEhlaWdo
dChjZWlsKG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWlnaHQpKTsKKyAgICB9CisKKyAgICBJ
bnRSZWN0IG9sZEdlb21ldHJ5ID0gZnJhbWVSZWN0KCk7CisgICAgV2lkZ2V0OjpzZXRGcmFtZVJl
Y3QobmV3UmVjdCk7CisKKyAgICBpZiAobmV3UmVjdCA9PSBvbGRHZW9tZXRyeSkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKG5ld1JlY3Quc2l6ZSgpICE9IG9sZEdlb21ldHJ5LnNpemUoKSkg
eworICAgICAgICBpZiAobmVlZHNMYXlvdXQpCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcmFt
ZVZpZXcqPih0aGlzKS0+c2V0TmVlZHNMYXlvdXQoKTsKKyAgICAgICAgaWYgKCFwYXJlbnQoKSkg
eworICAgICAgICAgICAgYm9vbCBvbGRTdXBwcmVzc2VkID0gbV9kYXRhLT5tX3Nob3dTY3JvbGxi
YXJTdXBwcmVzc2VkOworICAgICAgICAgICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVz
c2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIEludFNpemUgbmV3VmlzaWJsZUNvbnRlbnRzU2l6ZSht
aW4obV9kYXRhLT5tX2NvbnRlbnRzU2l6ZS53aWR0aCgpLCAoaW50KW1fZGF0YS0+bV92aXNpYmxl
Q29udGVudHNXaWR0aCkKKyAgICAgICAgICAgICwgbWluKG1fZGF0YS0+bV9jb250ZW50c1NpemUu
aGVpZ2h0KCksIChpbnQpbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCkpOworICAgICAg
ICAgICAgSW50U2l6ZSBzY3JvbGxPZmZzZXQgPSBtX3VzZUFuY2hvclBvaW50CisgICAgICAgICAg
ICAgICAgPyBtX2FuY2hvckNvbnRlbnRzUG9pbnQgLSBtX2FuY2hvcldpbmRvd1BvaW50IC8gc2Nh
bGUoKQorICAgICAgICAgICAgICAgIDogbV9kYXRhLT5tX3Njcm9sbE9mZnNldCArIChvbGRWaXNp
YmxlQ29udGVudHNTaXplIC0gbmV3VmlzaWJsZUNvbnRlbnRzU2l6ZSkgKiAwLjU7CisgICAgICAg
ICAgICB1cGRhdGVTY3JvbGxiYXJzKHNjcm9sbE9mZnNldCk7CisgICAgICAgICAgICBtX2RhdGEt
Pm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQgPSBvbGRTdXBwcmVzc2VkOworICAgICAgICB9IGVs
c2UKKyAgICAgICAgICAgIHVwZGF0ZVNjcm9sbGJhcnMobV9kYXRhLT5tX3Njcm9sbE9mZnNldCk7
CisgICAgfQorCisgICAgaWYgKGlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgRnJhbWVWaWV3KiBm
cmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAgICAgaWYgKEZy
YW1lICpmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUoKSkKKyAgICAgICAgICAgIGZyYW1lLT5wYWdl
KCktPmNocm9tZSgpLT5jbGllbnQoKS0+ZnJhbWVHZW9tZXRyeUNoYW5nZWQoZnJhbWVWaWV3LT5m
cmFtZSgpKTsKKyAgICB9CisKKyAgICBmcmFtZVJlY3RzQ2hhbmdlZCgpOworfQorCit2b2lkIFNj
cm9sbFZpZXc6OnNldFNjYWxlKGRvdWJsZSBzY2FsZSkKK3sKKyAgICBzY2FsZSA9IG1heCgwLjEs
IG1pbigxMC4sIHNjYWxlKSk7CisgICAgaWYgKG1fc2NhbGUgPT0gc2NhbGUpCisgICAgICAgIHJl
dHVybjsKKworICAgIG1fc2NhbGUgPSBzY2FsZTsKKworICAgIGhpZGVDdXJyZW50UG9wdXBNZW51
KCk7CisKKyAgICBjb25zdCBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PGNvbnN0
IEZyYW1lVmlldyo+KHRoaXMpOworICAgIEZyYW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUo
KTsKKworICAgIGlmIChmcmFtZSkgeworICAgICAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1l
LT50cmVlKCktPmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4
dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9IGNoaWxkLT52
aWV3KCkpCisgICAgICAgICAgICAgICAgdmlldy0+c2V0U2NhbGUoc2NhbGUpOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKCFwYXJlbnQoKSkKKyAgICAgICAgc2V0RnJhbWVSZWN0KG1fZGF0
YS0+bV9waHlzaWNhbEdlb21ldHJ5LCBmYWxzZSk7CisgICAgZWxzZSB7CisgICAgICAgIEludFNp
emUgaW5uZXJTaXplKG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNXaWR0aCwgbV9kYXRhLT5tX3Zp
c2libGVDb250ZW50c0hlaWdodCk7CisgICAgICAgIGlmIChtX2RhdGEtPm1fdkJhcikKKyAgICAg
ICAgICAgIG1fZGF0YS0+bV92QmFyLT5zZXRGcmFtZVJlY3QobV9kYXRhLT5nZXRWQmFyUmVjdChp
bm5lclNpemUpKTsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9oQmFyKQorICAgICAgICAgICAgbV9k
YXRhLT5tX2hCYXItPnNldEZyYW1lUmVjdChtX2RhdGEtPmdldEhCYXJSZWN0KGlubmVyU2l6ZSkp
OworICAgIH0KK30KKworaW50IFNjcm9sbFZpZXc6OmNvbnRlbnRzWCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIHNjcm9sbE9mZnNldCgpLndpZHRoKCk7Cit9CisKK2ludCBTY3JvbGxWaWV3Ojpjb250
ZW50c1koKSBjb25zdAoreworICAgIHJldHVybiBzY3JvbGxPZmZzZXQoKS5oZWlnaHQoKTsKK30K
KworaW50IFNjcm9sbFZpZXc6OmNvbnRlbnRzV2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBt
X2RhdGEtPm1fY29udGVudHNTaXplLndpZHRoKCk7Cit9CisKK2ludCBTY3JvbGxWaWV3Ojpjb250
ZW50c0hlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9jb250ZW50c1NpemUu
aGVpZ2h0KCk7Cit9CisKK0ludFJlY3QgU2Nyb2xsVmlldzo6Y29udGVudHNUb1dpbmRvdyhjb25z
dCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBJbnRSZWN0KGNvbnRlbnRzVG9X
aW5kb3cocmVjdC5sb2NhdGlvbigpKSwgcmVjdC5zaXplKCkgKiBzY2FsZSgpKTsKK30KKworSW50
UmVjdCBTY3JvbGxWaWV3Ojp3aW5kb3dUb0NvbnRlbnRzKGNvbnN0IEludFJlY3QmIHJlY3QpIGNv
bnN0Cit7CisgICAgcmV0dXJuIEludFJlY3Qod2luZG93VG9Db250ZW50cyhyZWN0LmxvY2F0aW9u
KCkpLCByZWN0LnNpemUoKSAvIHNjYWxlKCkpOworfQorCitJbnRQb2ludCBTY3JvbGxWaWV3Ojp3
aW5kb3dUb0NvbnRlbnRzKGNvbnN0IEludFBvaW50JiB3aW5kb3dQb2ludCkgY29uc3QKK3sKKyAg
ICBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgSW50UG9pbnQgb3JpZ2luID0gcGFyZW50KCktPmNv
bnRlbnRzVG9XaW5kb3coZnJhbWVSZWN0KCkubG9jYXRpb24oKSk7CisgICAgICAgIHJldHVybiBJ
bnRQb2ludCgpICsgKHdpbmRvd1BvaW50IC0gb3JpZ2luKSAvIHNjYWxlKCkgKyBzY3JvbGxPZmZz
ZXQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHdpbmRvd1BvaW50IC0gSW50U2l6ZSh4KCksIHko
KSkpIC8gc2NhbGUoKSArIHNjcm9sbE9mZnNldCgpOworfQorCitJbnRQb2ludCBTY3JvbGxWaWV3
Ojpjb250ZW50c1RvV2luZG93KGNvbnN0IEludFBvaW50JiBjb250ZW50c1BvaW50KSBjb25zdAor
eworICAgIGlmIChwYXJlbnQoKSkgeworICAgICAgICBJbnRQb2ludCBvcmlnaW4gPSBwYXJlbnQo
KS0+Y29udGVudHNUb1dpbmRvdyhmcmFtZVJlY3QoKS5sb2NhdGlvbigpKTsKKyAgICAgICAgcmV0
dXJuIG9yaWdpbiArICgoY29udGVudHNQb2ludCAtIHNjcm9sbE9mZnNldCgpKSAqIHNjYWxlKCkg
LSBJbnRQb2ludCgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gKGNvbnRlbnRzUG9pbnQgLSBzY3Jv
bGxPZmZzZXQoKSkgKiBzY2FsZSgpICsgSW50U2l6ZSh4KCksIHkoKSk7Cit9CisKK0ludFBvaW50
IFNjcm9sbFZpZXc6OmNvbnZlcnRDaGlsZFRvU2VsZihjb25zdCBXaWRnZXQqIGNoaWxkLCBjb25z
dCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgSW50UG9pbnQgbmV3UG9pbnQgPSBwb2lu
dDsKKyAgICBpZiAoY2hpbGQgIT0gbV9kYXRhLT5tX2hCYXIgJiYgY2hpbGQgIT0gbV9kYXRhLT5t
X3ZCYXIpCisgICAgICAgIG5ld1BvaW50ID0gcG9pbnQgLSBzY3JvbGxPZmZzZXQoKTsKKyAgICBy
ZXR1cm4gV2lkZ2V0Ojpjb252ZXJ0Q2hpbGRUb1NlbGYoY2hpbGQsIG5ld1BvaW50KTsKK30KKwor
SW50UG9pbnQgU2Nyb2xsVmlldzo6Y29udmVydFNlbGZUb0NoaWxkKGNvbnN0IFdpZGdldCogY2hp
bGQsIGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBJbnRQb2ludCBuZXdQb2lu
dCA9IHBvaW50OworICAgIGlmIChjaGlsZCAhPSBtX2RhdGEtPm1faEJhciAmJiBjaGlsZCAhPSBt
X2RhdGEtPm1fdkJhcikKKyAgICAgICAgbmV3UG9pbnQgPSBwb2ludCArIHNjcm9sbE9mZnNldCgp
OworICAgIHJldHVybiBXaWRnZXQ6OmNvbnZlcnRTZWxmVG9DaGlsZChjaGlsZCwgbmV3UG9pbnQp
OworfQorCitJbnRTaXplIFNjcm9sbFZpZXc6OnNjcm9sbE9mZnNldCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQ7Cit9CisKK0ludFNpemUgU2Nyb2xsVmlldzo6
bWF4aW11bVNjcm9sbCgpIGNvbnN0Cit7CisgICAgSW50U2l6ZSBkZWx0YSA9IG1fZGF0YS0+bV9j
b250ZW50c1NpemUgLSBJbnRTaXplKHdpZHRoKCksIGhlaWdodCgpKSAtIG1fZGF0YS0+bV9zY3Jv
bGxPZmZzZXQ7CisgICAgZGVsdGEuY2xhbXBOZWdhdGl2ZVRvWmVybygpOworICAgIHJldHVybiBk
ZWx0YTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzY3JvbGxCeShpbnQgZHgsIGludCBkeSkKK3sK
KyAgICBpZiAoIWR4ICYmICFkeSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaGlkZUN1cnJlbnRQ
b3B1cE1lbnUoKTsKKworICAgIGJvb2wgb2xkU3VwcHJlc3NlZCA9IG1fZGF0YS0+bV9zaG93U2Ny
b2xsYmFyU3VwcHJlc3NlZDsKKyAgICBtX2RhdGEtPm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQg
PSB0cnVlOworCisgICAgSW50U2l6ZSBvbGRPZmZzZXQobV9kYXRhLT5tX3Njcm9sbE9mZnNldCk7
CisKKyAgICBpZiAobV9kYXRhLT5tX2hCYXIgJiYgZHgpCisgICAgICAgIG1fZGF0YS0+bV9oQmFy
LT5zZXRWYWx1ZShvbGRPZmZzZXQud2lkdGgoKSArIGR4KTsKKworICAgIGlmIChtX2RhdGEtPm1f
dkJhciAmJiBkeSkKKyAgICAgICAgbV9kYXRhLT5tX3ZCYXItPnNldFZhbHVlKG9sZE9mZnNldC5o
ZWlnaHQoKSArIGR5KTsKKworICAgIG1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZCA9
IG9sZFN1cHByZXNzZWQ7CisKKyAgICBpZiAoIW1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJl
c3NlZCkgeworICAgICAgICBJbnRTaXplIGRlbHRhID0gbV9kYXRhLT5tX3Njcm9sbE9mZnNldCAt
IG9sZE9mZnNldDsKKyAgICAgICAgbV9kYXRhLT5zY3JvbGxCYWNraW5nU3RvcmUoZGVsdGEpOwor
ICAgICAgICAvL3N0YXRpY19jYXN0PEZyYW1lVmlldyo+KHRoaXMpLT5mcmFtZSgpLT5zZW5kU2Ny
b2xsRXZlbnQoKTsKKyAgICAgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNf
Y2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9
IGZyYW1lVmlldy0+ZnJhbWUoKSkgeworICAgICAgICAgICAgaWYgKGZyYW1lLT5zaG91bGRCbGlu
a0NhcmV0KCkpCisgICAgICAgICAgICAgICAgaG9zdFdpbmRvdygpLT5jYXJldFJlY3RDaGFuZ2Vk
KCk7CisgICAgICAgIH0KKyAgICAgICAgbV9kYXRhLT5zaG93U2Nyb2xsYmFycyhkZWx0YS53aWR0
aCgpICE9IDAsIGRlbHRhLmhlaWdodCgpICE9IDAsIGZhbHNlKTsKKyAgICB9Cit9CisKK3N0YXRp
YyBpbmxpbmUgdm9pZCBtb3ZlUmFuZ2VUb0NvbnRhaW5SYW5nZShpbnQmIGNvbnRhaW5lclN0YXJ0
LCBpbnQgY29udGFpbmVyV2lkdGgsIGludCB0YXJnZXRTdGFydCwgaW50IHRhcmdldFdpZHRoKQor
eworICAgIGludCB0YXJnZXRFbmQgPSB0YXJnZXRTdGFydCArIHRhcmdldFdpZHRoOworICAgIGlm
IChjb250YWluZXJTdGFydCArIGNvbnRhaW5lcldpZHRoIDwgdGFyZ2V0RW5kKSB7CisgICAgICAg
IGlmIChjb250YWluZXJTdGFydCA+IHRhcmdldFN0YXJ0KQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBjb250YWluZXJTdGFydCA9IHRhcmdldEVuZCAtIGNvbnRhaW5lcldpZHRoOworICAg
IH0KKworICAgIGlmIChjb250YWluZXJTdGFydCA+IHRhcmdldFN0YXJ0KQorICAgICAgICBjb250
YWluZXJTdGFydCA9IHRhcmdldFN0YXJ0OworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNjcm9sbFJl
Y3RJbnRvVmlld01pbmltdW1TY3JvbGwoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBTY3JvbGxW
aWV3KiB2aWV3ID0gdGhpczsKKyAgICBJbnRQb2ludCBjdXJQb3MgPSByLmxvY2F0aW9uKCk7Cisg
ICAgZm9yICg7OykgeworICAgICAgICBpbnQgeCA9IHZpZXctPmNvbnRlbnRzWCgpOworICAgICAg
ICBpbnQgeSA9IHZpZXctPmNvbnRlbnRzWSgpOworICAgICAgICBtb3ZlUmFuZ2VUb0NvbnRhaW5S
YW5nZSh4LCB2aWV3LT5tX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgsIGN1clBvcy54KCks
IHIud2lkdGgoKSk7CisgICAgICAgIG1vdmVSYW5nZVRvQ29udGFpblJhbmdlKHksIHZpZXctPm1f
ZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWlnaHQsIGN1clBvcy55KCksIHIuaGVpZ2h0KCkpOwor
CisgICAgICAgIHZpZXctPnNldENvbnRlbnRzUG9zKHgsIHkpOworCisgICAgICAgIGlmIChTY3Jv
bGxWaWV3KiBuZXh0VmlldyA9IHN0YXRpY19jYXN0PFNjcm9sbFZpZXcqPih2aWV3LT5wYXJlbnQo
KSkpIHsKKyAgICAgICAgICAgIGN1clBvcy5tb3ZlKHZpZXctPngoKSAtIHZpZXctPmNvbnRlbnRz
WCgpLCB2aWV3LT55KCkgLSB2aWV3LT5jb250ZW50c1koKSk7CisgICAgICAgICAgICB2aWV3ID0g
bmV4dFZpZXc7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IC8vc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPmZyYW1lKCktPnNlbmRTY3JvbGxFdmVu
dCgpOworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3Qg
RnJhbWVWaWV3Kj4odGhpcyk7CisgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJh
bWUoKSkgeworICAgICAgICBpZiAoZnJhbWUtPnNob3VsZEJsaW5rQ2FyZXQoKSkKKyAgICAgICAg
ICAgIGhvc3RXaW5kb3coKS0+Y2FyZXRSZWN0Q2hhbmdlZCgpOworICAgIH0KK30KKwordm9pZCBT
Y3JvbGxWaWV3OjpzY3JvbGxSZWN0SW50b1ZpZXdSZWN1cnNpdmVseShjb25zdCBJbnRSZWN0JiBy
KQoreworICAgIFNjcm9sbFZpZXcqIHZpZXcgPSB0aGlzOworICAgIEludFBvaW50IGN1clBvcyA9
IHIubG9jYXRpb24oKTsKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIHZpZXctPnNldENvbnRlbnRz
UG9zKGN1clBvcy54KCksIGN1clBvcy55KCkpOworCisgICAgICAgIHZpZXcgPSBzdGF0aWNfY2Fz
dDxTY3JvbGxWaWV3Kj4odmlldy0+cGFyZW50KCkpOworICAgICAgICBpZiAodmlldykKKyAgICAg
ICAgICAgIGN1clBvcy5tb3ZlKHZpZXctPngoKSAtIHZpZXctPmNvbnRlbnRzWCgpLCB2aWV3LT55
KCkgLSB2aWV3LT5jb250ZW50c1koKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGJyZWFr
OworICAgIH0KKyAgICAvL3N0YXRpY19jYXN0PEZyYW1lVmlldyo+KHRoaXMpLT5mcmFtZSgpLT5z
ZW5kU2Nyb2xsRXZlbnQoKTsKKyAgICBjb25zdCBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRp
Y19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAgIGlmIChGcmFtZSogZnJhbWUgPSBm
cmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAgaWYgKGZyYW1lLT5zaG91bGRCbGlua0NhcmV0
KCkpCisgICAgICAgICAgICBob3N0V2luZG93KCktPmNhcmV0UmVjdENoYW5nZWQoKTsKKyAgICB9
Cit9CisKK1dlYkNvcmU6OlNjcm9sbGJhck1vZGUgU2Nyb2xsVmlldzo6aG9yaXpvbnRhbFNjcm9s
bGJhck1vZGUoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1faFNjcm9sbGJhck1vZGU7
Cit9CisKK1dlYkNvcmU6OlNjcm9sbGJhck1vZGUgU2Nyb2xsVmlldzo6dmVydGljYWxTY3JvbGxi
YXJNb2RlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX3ZTY3JvbGxiYXJNb2RlOwor
fQorCit2b2lkIFNjcm9sbFZpZXc6OnNldFNjcm9sbGJhcnNTdXBwcmVzc2VkKGJvb2wgc3VwcHJl
c3NlZCwgYm9vbCByZXBhaW50T25TdXBwcmVzcykKK3sKKyAgICBtX2RhdGEtPm1fc2Nyb2xsYmFy
c1N1cHByZXNzZWQgPSBzdXBwcmVzc2VkOworICAgIGlmIChyZXBhaW50T25TdXBwcmVzcyAmJiAh
c3VwcHJlc3NlZCkKKyAgICAgICAgbV9kYXRhLT5pbnZhbGlkYXRlU2Nyb2xsYmFycyh0cnVlLCB0
cnVlLCB0cnVlKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRIb3Jpem9udGFsU2Nyb2xsYmFy
TW9kZShTY3JvbGxiYXJNb2RlIG5ld01vZGUpCit7CisgICAgaWYgKG1fYWxsb3dzQ2hhbmdpbmdT
Y3JvbGxiYXJNb2RlICYmIG1fZGF0YS0+bV9oU2Nyb2xsYmFyTW9kZSAhPSBuZXdNb2RlKSB7Cisg
ICAgICAgIG1fZGF0YS0+bV9oU2Nyb2xsYmFyTW9kZSA9IG5ld01vZGU7CisgICAgICAgIHVwZGF0
ZVNjcm9sbGJhcnMobV9kYXRhLT5tX3Njcm9sbE9mZnNldCk7CisgICAgfQorfQorCit2b2lkIFNj
cm9sbFZpZXc6OnNldFZlcnRpY2FsU2Nyb2xsYmFyTW9kZShTY3JvbGxiYXJNb2RlIG5ld01vZGUp
Cit7CisgICAgaWYgKG1fYWxsb3dzQ2hhbmdpbmdTY3JvbGxiYXJNb2RlICYmIG1fZGF0YS0+bV92
U2Nyb2xsYmFyTW9kZSAhPSBuZXdNb2RlKSB7CisgICAgICAgIG1fZGF0YS0+bV92U2Nyb2xsYmFy
TW9kZSA9IG5ld01vZGU7CisgICAgICAgIHVwZGF0ZVNjcm9sbGJhcnMobV9kYXRhLT5tX3Njcm9s
bE9mZnNldCk7CisgICAgfQorfQorCit2b2lkIFNjcm9sbFZpZXc6OnNldFNjcm9sbGJhck1vZGVz
KFNjcm9sbGJhck1vZGUgaG9yaXpvbnRhbE1vZGUsIFNjcm9sbGJhck1vZGUgdmVydGljYWxNb2Rl
KQoreworICAgIHNldEhvcml6b250YWxTY3JvbGxiYXJNb2RlKGhvcml6b250YWxNb2RlKTsKKyAg
ICBzZXRWZXJ0aWNhbFNjcm9sbGJhck1vZGUodmVydGljYWxNb2RlKTsKK30KKwordm9pZCBTY3Jv
bGxWaWV3Ojp1cGRhdGVTY3JvbGxiYXJzKGNvbnN0IEludFNpemUmIGRlc2lyZWRPZmZzZXQpCit7
CisgICAgLy8gRG9uJ3QgYWxsb3cgcmUtZW50cmFuY3kgaW50byB0aGlzIGZ1bmN0aW9uLgorICAg
IGlmIChtX2RhdGEtPm1faW5VcGRhdGVTY3JvbGxiYXJzKQorICAgICAgICByZXR1cm47CisKKyAg
ICAvLyBGSVhNRTogVGhpcyBjb2RlIGlzIGhlcmUgc28gd2UgZG9uJ3QgaGF2ZSB0byBmb3JrIEZy
YW1lVmlldy5oLy5jcHAuCisgICAgLy8gSW4gdGhlIGVuZCwgRnJhbWVWaWV3IHNob3VsZCBqdXN0
IG1lcmdlIHdpdGggU2Nyb2xsVmlldy4KKyAgICBGcmFtZSogZnJhbWUgPSBzdGF0aWNfY2FzdDxj
b25zdCBGcmFtZVZpZXcqPih0aGlzKS0+ZnJhbWUoKTsKKyAgICBpZiAoIWZyYW1lKQorICAgICAg
ICByZXR1cm47CisKKyAgICBtX2RhdGEtPm1faW5VcGRhdGVTY3JvbGxiYXJzID0gdHJ1ZTsKKyAg
ICBib29sIHVzZXJTY3JvbGwgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKS0+
d2FzU2Nyb2xsZWRCeVVzZXIoKTsKKworICAgIGJvb2wgaGFzVmVydGljYWxTY3JvbGxiYXIgPSBt
X2RhdGEtPm1fdkJhcjsKKyAgICBib29sIGhhc0hvcml6b250YWxTY3JvbGxiYXIgPSBtX2RhdGEt
Pm1faEJhcjsKKyAgICBib29sIG9sZEhhc1ZlcnRpY2FsID0gaGFzVmVydGljYWxTY3JvbGxiYXI7
CisgICAgYm9vbCBvbGRIYXNIb3Jpem9udGFsID0gaGFzSG9yaXpvbnRhbFNjcm9sbGJhcjsKKyAg
ICBTY3JvbGxiYXJNb2RlIGhTY3JvbGwgPSBtX2RhdGEtPm1faFNjcm9sbGJhck1vZGU7CisgICAg
U2Nyb2xsYmFyTW9kZSB2U2Nyb2xsID0gbV9kYXRhLT5tX3ZTY3JvbGxiYXJNb2RlOworCisgICAg
aW50IGNXaWR0aCA9IGNvbnRlbnRzV2lkdGgoKTsKKyAgICBpbnQgY0hlaWdodCA9IGNvbnRlbnRz
SGVpZ2h0KCk7CisgICAgaW50IHZXaWR0aCA9IHdpZHRoKCk7CisgICAgaW50IHZIZWlnaHQgPSBo
ZWlnaHQoKTsKKworICAgIGludCBwYWdlS2VlcCA9IGNBbW91bnRUb0tlZXBXaGVuUGFnaW5nOwor
ICAgIGludCBsaW5lU3RlcCA9IGNTY3JvbGxiYXJQaXhlbHNQZXJMaW5lU3RlcDsKKworICAgIGlm
ICghbV9kYXRhLT5tX3Njcm9sbGJhcnNTdXBwcmVzc2VkICYmIChoU2Nyb2xsID09IFNjcm9sbGJh
ckF1dG8gfHwgdlNjcm9sbCA9PSBTY3JvbGxiYXJBdXRvKSkgeworICAgICAgICBmb3IgKGludCBw
YXNzID0gMDsgcGFzcyA8IDI7ICsrcGFzcykgeworICAgICAgICAgICAgLy8gRG8gYSBsYXlvdXQg
aWYgcGVuZGluZyBiZWZvcmUgY2hlY2tpbmcgaWYgc2Nyb2xsYmFycyBhcmUgbmVlZGVkLgorICAg
ICAgICAgICAgaWYgKGhhc1ZlcnRpY2FsU2Nyb2xsYmFyICE9IG9sZEhhc1ZlcnRpY2FsIHx8IGhh
c0hvcml6b250YWxTY3JvbGxiYXIgIT0gb2xkSGFzSG9yaXpvbnRhbCkgeworICAgICAgICAgICAg
ICAgIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHRoaXMpLT5sYXlvdXRJZk5lZWRlZFJlY3Vyc2l2
ZSgpOworICAgICAgICAgICAgICAgIC8vIEFmdGVyIHJlLWxheW91dCwgY29udGVudHMgc2l6ZSBt
YXkgaGF2ZSBjaGFuZ2VkLgorICAgICAgICAgICAgICAgIGNXaWR0aCA9IGNvbnRlbnRzV2lkdGgo
KTsKKyAgICAgICAgICAgICAgICBjSGVpZ2h0ID0gY29udGVudHNIZWlnaHQoKTsKKyAgICAgICAg
ICAgICAgICB2V2lkdGggPSB3aWR0aCgpOworICAgICAgICAgICAgICAgIHZIZWlnaHQgPSBoZWln
aHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCBzY3JvbGxzVmVydGljYWxs
eSA9IGNIZWlnaHQgPiB2SGVpZ2h0OworICAgICAgICAgICAgYm9vbCBzY3JvbGxzSG9yaXpvbnRh
bGx5ID0gY1dpZHRoID4gdldpZHRoOworCisgICAgICAgICAgICBpZiAoaGFzVmVydGljYWxTY3Jv
bGxiYXIgIT0gc2Nyb2xsc1ZlcnRpY2FsbHkpIHsKKyAgICAgICAgICAgICAgICBtX2RhdGEtPmlu
dmFsaWRhdGVTY3JvbGxiYXJzKGZhbHNlLCB0cnVlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAg
bV9kYXRhLT5zZXRIYXNWZXJ0aWNhbFNjcm9sbGJhcihzY3JvbGxzVmVydGljYWxseSk7CisgICAg
ICAgICAgICAgICAgaGFzVmVydGljYWxTY3JvbGxiYXIgPSBzY3JvbGxzVmVydGljYWxseTsKKyAg
ICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGhhc0hvcml6b250YWxTY3JvbGxiYXIgIT0g
c2Nyb2xsc0hvcml6b250YWxseSkgeworICAgICAgICAgICAgICAgIG1fZGF0YS0+aW52YWxpZGF0
ZVNjcm9sbGJhcnModHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBtX2RhdGEt
PnNldEhhc0hvcml6b250YWxTY3JvbGxiYXIoc2Nyb2xsc0hvcml6b250YWxseSk7CisgICAgICAg
ICAgICAgICAgaGFzSG9yaXpvbnRhbFNjcm9sbGJhciA9IHNjcm9sbHNIb3Jpem9udGFsbHk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgdXAgdGhlIHJhbmdl
IChhbmQgcGFnZSBzdGVwL2xpbmUgc3RlcCkuCisgICAgSW50U2l6ZSBtYXhTY3JvbGxQb3NpdGlv
bihjV2lkdGggLSB2V2lkdGgsIGNIZWlnaHQgLSB2SGVpZ2h0KTsKKyAgICBJbnRTaXplIHNjcm9s
bCA9IGRlc2lyZWRPZmZzZXQuc2hydW5rVG8obWF4U2Nyb2xsUG9zaXRpb24pOworICAgIHNjcm9s
bC5jbGFtcE5lZ2F0aXZlVG9aZXJvKCk7CisKKyAgICAvLyBtX3ZCYXItPnNldFZhbHVlKCkgYW5k
IG1faEJhci0+c2V0VmFsdWUoKSB3aWxsIHVwZGF0ZWQgc2Nyb2xsIG9mZnNldHMgYW5kIGFsc28g
c2Nyb2xsZWQgYmFja2luZyBzdG9yZQorICAgIEludFNpemUgb2xkU2Nyb2xsT2Zmc2V0ID0gbV9k
YXRhLT5tX3Njcm9sbE9mZnNldDsKKyAgICBpZiAoIW1fZGF0YS0+bV9oQmFyKQorICAgICAgICBt
X2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LnNldFdpZHRoKDApOworCisgICAgaWYgKCFtX2RhdGEtPm1f
dkJhcikKKyAgICAgICAgbV9kYXRhLT5tX3Njcm9sbE9mZnNldC5zZXRIZWlnaHQoMCk7CisKKyAg
ICBpZiAob2xkU2Nyb2xsT2Zmc2V0ICE9IG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpCisgICAgICAg
IG1fZGF0YS0+c2Nyb2xsQmFja2luZ1N0b3JlKEludFNpemUobV9kYXRhLT5tX3Njcm9sbE9mZnNl
dCAtIG9sZFNjcm9sbE9mZnNldCkpOworCisgICAgSW50U2l6ZSBpbm5lclNpemUobV9kYXRhLT5t
X3Zpc2libGVDb250ZW50c1dpZHRoLCBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0KTsK
KyAgICBpZiAobV9kYXRhLT5tX2hCYXIpIHsKKyAgICAgICAgbV9kYXRhLT5tX2hCYXItPnNldEVu
YWJsZWQoY1dpZHRoID4gdldpZHRoKTsKKyAgICAgICAgaW50IHBhZ2VTdGVwID0gdldpZHRoIC0g
cGFnZUtlZXA7CisgICAgICAgIGlmIChwYWdlU3RlcCA8IDApIHBhZ2VTdGVwID0gdldpZHRoOwor
ICAgICAgICBJbnRSZWN0IG9sZFJlY3QobV9kYXRhLT5tX2hCYXItPmZyYW1lUmVjdCgpKTsKKyAg
ICAgICAgbV9kYXRhLT5tX2hCYXItPnNldFJlY3QobV9kYXRhLT5nZXRIQmFyUmVjdChpbm5lclNp
emUpKTsKKyAgICAgICAgaWYgKCFtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQgJiYgb2xk
UmVjdCAhPSBtX2RhdGEtPm1faEJhci0+ZnJhbWVSZWN0KCkpCisgICAgICAgICAgICBtX2RhdGEt
PmludmFsaWRhdGVTY3JvbGxiYXJzKHRydWUsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgaWYg
KG1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3NlZCkKKyAgICAgICAgICAgIG1fZGF0YS0+bV9o
QmFyLT5zZXRTdXBwcmVzc0ludmFsaWRhdGlvbih0cnVlKTsKKyAgICAgICAgbV9kYXRhLT5tX2hC
YXItPnNldFN0ZXBzKGxpbmVTdGVwLCBwYWdlU3RlcCk7CisgICAgICAgIG1fZGF0YS0+bV9oQmFy
LT5zZXRQcm9wb3J0aW9uKHZXaWR0aCwgY1dpZHRoKTsKKyAgICAgICAgbV9kYXRhLT5tX2hCYXIt
PnNldFZhbHVlKHNjcm9sbC53aWR0aCgpKTsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9zY3JvbGxi
YXJzU3VwcHJlc3NlZCkKKyAgICAgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRTdXBwcmVzc0lu
dmFsaWRhdGlvbihmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1fZGF0YS0+bV92QmFyKSB7Cisg
ICAgICAgIG1fZGF0YS0+bV92QmFyLT5zZXRFbmFibGVkKGNIZWlnaHQgPiB2SGVpZ2h0KTsKKyAg
ICAgICAgaW50IHBhZ2VTdGVwID0gdkhlaWdodCAtIHBhZ2VLZWVwOworICAgICAgICBpZiAocGFn
ZVN0ZXAgPCAwKSBwYWdlU3RlcCA9IHZIZWlnaHQ7CisgICAgICAgIEludFJlY3Qgb2xkUmVjdCht
X2RhdGEtPm1fdkJhci0+ZnJhbWVSZWN0KCkpOworICAgICAgICBtX2RhdGEtPm1fdkJhci0+c2V0
UmVjdChtX2RhdGEtPmdldFZCYXJSZWN0KGlubmVyU2l6ZSkpOworICAgICAgICBpZiAoIW1fZGF0
YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3NlZCAmJiBvbGRSZWN0ICE9IG1fZGF0YS0+bV92QmFyLT5m
cmFtZVJlY3QoKSkKKyAgICAgICAgICAgIG1fZGF0YS0+aW52YWxpZGF0ZVNjcm9sbGJhcnMoZmFs
c2UsIHRydWUsIGZhbHNlKTsKKworICAgICAgICBpZiAobV9kYXRhLT5tX3Njcm9sbGJhcnNTdXBw
cmVzc2VkKQorICAgICAgICAgICAgbV9kYXRhLT5tX3ZCYXItPnNldFN1cHByZXNzSW52YWxpZGF0
aW9uKHRydWUpOworICAgICAgICBtX2RhdGEtPm1fdkJhci0+c2V0U3RlcHMobGluZVN0ZXAsIHBh
Z2VTdGVwKTsKKyAgICAgICAgbV9kYXRhLT5tX3ZCYXItPnNldFByb3BvcnRpb24odkhlaWdodCwg
Y0hlaWdodCk7CisgICAgICAgIG1fZGF0YS0+bV92QmFyLT5zZXRWYWx1ZShzY3JvbGwuaGVpZ2h0
KCkpOworICAgICAgICBpZiAobV9kYXRhLT5tX3Njcm9sbGJhcnNTdXBwcmVzc2VkKQorICAgICAg
ICAgICAgbV9kYXRhLT5tX3ZCYXItPnNldFN1cHByZXNzSW52YWxpZGF0aW9uKGZhbHNlKTsKKyAg
ICB9CisKKyAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKS0+c2V0V2FzU2Nyb2xsZWRC
eVVzZXIodXNlclNjcm9sbCk7CisgICAgbV9kYXRhLT5tX2luVXBkYXRlU2Nyb2xsYmFycyA9IGZh
bHNlOworfQorCitTY3JvbGxiYXIqIFNjcm9sbFZpZXc6OnNjcm9sbGJhckF0UG9pbnQoY29uc3Qg
SW50UG9pbnQmIHdpbmRvd1BvaW50KQoreworICAgIGlmIChtX2RhdGEtPm1fc2Nyb2xsYmFyc1Zp
c2libGUgJiYgKG1fZGF0YS0+Y2FuU2hvd0hTY3JvbGxiYXIoKSB8fCBtX2RhdGEtPmNhblNob3dW
U2Nyb2xsYmFyKCkpKSB7CisgICAgICAgIEludFBvaW50IHZpZXdQb2ludCA9IHdpbmRvd1RvQ29u
dGVudHMod2luZG93UG9pbnQpIC0gc2Nyb2xsT2Zmc2V0KCk7CisgICAgICAgIGlmIChtX2RhdGEt
PmNhblNob3dIU2Nyb2xsYmFyKCkgJiYgbV9kYXRhLT5tX2hCYXItPmZyYW1lUmVjdCgpLmNvbnRh
aW5zKHZpZXdQb2ludCkpCisgICAgICAgICAgICByZXR1cm4gbV9kYXRhLT5tX2hCYXIuZ2V0KCk7
CisgICAgICAgIGlmIChtX2RhdGEtPmNhblNob3dWU2Nyb2xsYmFyKCkgJiYgbV9kYXRhLT5tX3ZC
YXItPmZyYW1lUmVjdCgpLmNvbnRhaW5zKHZpZXdQb2ludCkpCisgICAgICAgICAgICByZXR1cm4g
bV9kYXRhLT5tX3ZCYXIuZ2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wg
U2Nyb2xsVmlldzo6c2Nyb2xsYmFyc01vdXNlUHJlc3NFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNl
RXZlbnQmIG1vdXNlRXZlbnQpCit7CisgICAgaWYgKHBhcmVudCgpCisgICAgICAgID8gbV9kYXRh
LT5nZXRWaXNpYmxlQ29udGVudFJlY3QoKS5jb250YWlucyhwYXJlbnQoKS0+d2luZG93VG9Db250
ZW50cyhtb3VzZUV2ZW50LnBvcygpKSkKKyAgICAgICAgOiB2aXNpYmxlV2luZG93UmVjdCgpLmNv
bnRhaW5zKG1vdXNlRXZlbnQucG9zKCkpKSB7CisKKyAgICAgICAgY29uc3QgRnJhbWVWaWV3KiBm
cmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAgICAg
RnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpOworCisgICAgICAgIGlmIChmcmFtZSkg
eworICAgICAgICAgICAgZm9yIChGcmFtZSogY2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5maXJzdENo
aWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT50cmVlKCktPm5leHRTaWJsaW5nKCkpIHsKKyAg
ICAgICAgICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBjaGlsZC0+dmlldygpOworICAgICAgICAg
ICAgICAgIGlmICh2aWV3ICYmIHZpZXctPnNjcm9sbGJhcnNNb3VzZVByZXNzRXZlbnQobW91c2VF
dmVudCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQor
ICAgICAgICB9CisKKyAgICAgICAgSW50UG9pbnQgdmlld1BvaW50ID0gd2luZG93VG9Db250ZW50
cyhtb3VzZUV2ZW50LnBvcygpKTsKKyAgICAgICAgZm9yIChIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+
ID46Oml0ZXJhdG9yIGkgPSBtX2RhdGEtPm1fY2hpbGRyZW4uYmVnaW4oKTsgaSAhPSBtX2RhdGEt
Pm1fY2hpbGRyZW4uZW5kKCk7ICsraSkgeworICAgICAgICAgICAgaWYgKCEoKmkpLT5pc1Njcm9s
bGJhcigpIHx8ICgqaSktPmlzVmlld1Njcm9sbGJhcigpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgUGxhdGZvcm1TY3JvbGxiYXIqIHNjcm9sbGJhciA9IHN0YXRpY19j
YXN0PFBsYXRmb3JtU2Nyb2xsYmFyKj4oaS0+Z2V0KCkpOworICAgICAgICAgICAgaWYgKHNjcm9s
bGJhci0+aXNWaXNpYmxlKCkgJiYgc2Nyb2xsYmFyLT5mcmFtZVJlY3QoKS5jb250YWlucyh2aWV3
UG9pbnQpKSB7CisgICAgICAgICAgICAgICAgbV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1v
dXNlID0gc2Nyb2xsYmFyOworICAgICAgICAgICAgICAgIGlmIChtX2RhdGEtPm1fcHJldlNjcm9s
bGJhclVuZGVyTW91c2UgJiYgbV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlLT5pc0Vu
YWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVu
ZGVyTW91c2UtPmhhbmRsZU1vdXNlUHJlc3NFdmVudChtb3VzZUV2ZW50KTsKKyAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIG1fZGF0YS0+bV9wcmV2TW91c2VEb3duID0gdHJ1ZTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbV9k
YXRhLT5tX3ByZXZNb3VzZURvd24gPSBmYWxzZTsKKyAgICB9CisKKyAgICBtX2RhdGEtPm1fcHJl
dlNjcm9sbGJhclVuZGVyTW91c2UgPSBzdGF0aWNfY2FzdDxQbGF0Zm9ybVNjcm9sbGJhcio+KHNj
cm9sbGJhckF0UG9pbnQobW91c2VFdmVudC5wb3MoKSkpOworICAgIGlmIChtX2RhdGEtPm1fcHJl
dlNjcm9sbGJhclVuZGVyTW91c2UgJiYgbV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNl
LT5pc0VuYWJsZWQoKSkgeworICAgICAgICBtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91
c2UtPmhhbmRsZU1vdXNlUHJlc3NFdmVudChtb3VzZUV2ZW50KTsKKyAgICAgICAgcmV0dXJuIG1f
ZGF0YS0+bV9wcmV2TW91c2VEb3duID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gbV9kYXRh
LT5tX3ByZXZNb3VzZURvd24gPSBmYWxzZTsKK30KKworYm9vbCBTY3JvbGxWaWV3OjpzY3JvbGxi
YXJzTW91c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50KQor
eworICAgIGlmIChtX2RhdGEtPm1fcHJldk1vdXNlRG93bikgeworICAgICAgICBpZiAobV9kYXRh
LT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlKQorICAgICAgICAgICAgbV9kYXRhLT5tX3ByZXZT
Y3JvbGxiYXJVbmRlck1vdXNlLT5oYW5kbGVNb3VzZU1vdmVFdmVudChtb3VzZUV2ZW50KTsKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFtZVZp
ZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICBGcmFtZSogZnJh
bWUgPSBmcmFtZVZpZXctPmZyYW1lKCk7CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgZm9y
IChGcmFtZSogY2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5maXJzdENoaWxkKCk7IGNoaWxkOyBjaGls
ZCA9IGNoaWxkLT50cmVlKCktPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIEZyYW1lVmll
dyogdmlldyA9IGNoaWxkLT52aWV3KCk7CisgICAgICAgICAgICBpZiAodmlldyAmJiB2aWV3LT5z
Y3JvbGxiYXJzTW91c2VNb3ZlRXZlbnQobW91c2VFdmVudCkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jv
b2wgU2Nyb2xsVmlldzo6c2Nyb2xsYmFyc01vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3Jt
TW91c2VFdmVudCYgbW91c2VFdmVudCkKK3sKKyAgICBib29sIHByZXZNb3VzZURvd24gPSBtX2Rh
dGEtPm1fcHJldk1vdXNlRG93bjsKKyAgICBtX2RhdGEtPm1fcHJldk1vdXNlRG93biA9IGZhbHNl
OworCisgICAgaWYgKHByZXZNb3VzZURvd24pIHsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9wcmV2
U2Nyb2xsYmFyVW5kZXJNb3VzZSkKKyAgICAgICAgICAgIG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFy
VW5kZXJNb3VzZS0+aGFuZGxlTW91c2VSZWxlYXNlRXZlbnQobW91c2VFdmVudCk7CisgICAgICAg
IG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZSA9IDA7CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nh
c3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3
LT5mcmFtZSgpOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGZvciAoRnJhbWUqIGNoaWxk
ID0gZnJhbWUtPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJl
ZSgpLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBjaGls
ZC0+dmlldygpOworICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy0+c2Nyb2xsYmFyc01vdXNl
UmVsZWFzZUV2ZW50KG1vdXNlRXZlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFNjcm9sbFZp
ZXc6OmFkZENoaWxkKFdpZGdldCogY2hpbGQpCit7CisgICAgY2hpbGQtPnNldFBhcmVudCh0aGlz
KTsKKyAgICAvL2NoaWxkLT5zZXRQbGF0Zm9ybVdpZGdldChwbGF0Zm9ybVdpZGdldCgpKTsKKyAg
ICBtX2RhdGEtPm1fY2hpbGRyZW4uYWRkKGNoaWxkKTsKK30KKwordm9pZCBTY3JvbGxWaWV3Ojpy
ZW1vdmVDaGlsZChXaWRnZXQqIGNoaWxkKQoreworICAgIGlmIChzdGF0aWNfY2FzdDxXaWRnZXQq
PihtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91c2UpID09IGNoaWxkKSB7CisgICAgICAg
IG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZSA9IDA7CisgICAgICAgIG1fZGF0YS0+
bV9wcmV2TW91c2VEb3duID0gZmFsc2U7CisgICAgfQorCisgICAgY2hpbGQtPnNldFBhcmVudCgw
KTsKKyAgICBtX2RhdGEtPm1fY2hpbGRyZW4ucmVtb3ZlKGNoaWxkKTsKK30KKwordm9pZCBTY3Jv
bGxWaWV3OjpwYWludChHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJl
Y3QpCit7CisgICAgLy8gRklYTUU6IFRoaXMgY29kZSBpcyBoZXJlIHNvIHdlIGRvbid0IGhhdmUg
dG8gZm9yayBGcmFtZVZpZXcuaC8uY3BwLgorICAgIC8vIEluIHRoZSBlbmQsIEZyYW1lVmlldyBz
aG91bGQganVzdCBtZXJnZSB3aXRoIFNjcm9sbFZpZXcuCisgICAgQVNTRVJUKGlzRnJhbWVWaWV3
KCkpOworCisgICAgaWYgKGNvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSB8fCByZWN0LmlzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgY29udGV4dC0+c2F2ZSgpOworCisgICAgaWYg
KCFwYXJlbnQoKSkgeworICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoLXN0YWJsZVJvdW5kKGNv
bnRlbnRzWCgpICogc2NhbGUoKSksIC1zdGFibGVSb3VuZChjb250ZW50c1koKSAqIHNjYWxlKCkp
KTsKKyAgICAgICAgY29udGV4dC0+c2NhbGUoRmxvYXRTaXplKHNjYWxlKCksIHNjYWxlKCkpKTsK
KyAgICB9CisKKyAgICBib29sIGRyYXdTY3JvbGxiYXJzID0gcGFyZW50KCkgJiYgIW1fZGF0YS0+
bV9zY3JvbGxiYXJzU3VwcHJlc3NlZCAmJiBtX2RhdGEtPm1fc2Nyb2xsYmFyc1Zpc2libGUKKyAg
ICAgICAgICAgICAgICAmJiAobV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigpIHx8IG1fZGF0YS0+
Y2FuU2hvd0hTY3JvbGxiYXIoKSk7CisgICAgSW50UmVjdCBjb250ZW50c0NsaXBSZWN0OworICAg
IGlmICghcGFyZW50KCkpIHsKKyAgICAgICAgRmxvYXRSZWN0IGNvbnRlbnRzTm9TY3JvbGw7Cisg
ICAgICAgIC8vIGVuc3VyZSB0aGUgY2xpcCByZWN0IGlzIGJpZyBlbm91Z2ggdG8gYXZvaWQgbWlz
c2luZyBwaXhlbHMuCisgICAgICAgIGNvbnRlbnRzTm9TY3JvbGwuc2V0WCgocmVjdC54KCkgLSB4
KCkpIC8gc2NhbGUoKSk7CisgICAgICAgIGNvbnRlbnRzTm9TY3JvbGwuc2V0WSgocmVjdC55KCkg
LSB5KCkpIC8gc2NhbGUoKSk7CisgICAgICAgIGNvbnRlbnRzTm9TY3JvbGwuc2V0V2lkdGgocmVj
dC5yaWdodCgpIC8gc2NhbGUoKSAtIGNvbnRlbnRzTm9TY3JvbGwueCgpKTsKKyAgICAgICAgY29u
dGVudHNOb1Njcm9sbC5zZXRIZWlnaHQocmVjdC5ib3R0b20oKSAvIHNjYWxlKCkgLSBjb250ZW50
c05vU2Nyb2xsLnkoKSk7CisgICAgICAgIGNvbnRlbnRzTm9TY3JvbGwuaW5mbGF0ZSgxKTsKKyAg
ICAgICAgY29udGVudHNDbGlwUmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoY29udGVudHNOb1Njcm9s
bCk7CisgICAgICAgIGNvbnRlbnRzQ2xpcFJlY3Quc2V0TG9jYXRpb24oY29udGVudHNDbGlwUmVj
dC5sb2NhdGlvbigpICsgbV9kYXRhLT5tX3Njcm9sbE9mZnNldCk7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgY29udGVudHNDbGlwUmVjdC5zZXRMb2NhdGlvbihyZWN0LmxvY2F0aW9uKCkgLSBJbnRT
aXplKHgoKSwgeSgpKSArIG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgICAgICBjb250ZW50
c0NsaXBSZWN0LnNldFNpemUocmVjdC5zaXplKCkpOworICAgICAgICBjb250ZW50c0NsaXBSZWN0
LmluZmxhdGUoMSk7CisgICAgICAgIGNvbnRlbnRzQ2xpcFJlY3QuaW50ZXJzZWN0KGVuY2xvc2lu
Z0ludFJlY3QodmlzaWJsZUNvbnRlbnRSZWN0KCkpKTsKKyAgICAgICAgY29udGV4dC0+dHJhbnNs
YXRlKHgoKSwgeSgpKTsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyID0gY29udGV4
dC0+YWZmaW5lVHJhbnNmb3JtKCk7CisgICAgICAgIHRyLnNldEUoc3RhYmxlUm91bmQodHIuZSgp
KSk7CisgICAgICAgIHRyLnNldEYoc3RhYmxlUm91bmQodHIuZigpKSk7CisgICAgICAgIGNvbnRl
eHQtPnRyYW5zbGF0ZSgtY29udGVudHNYKCksIC1jb250ZW50c1koKSk7CisgICAgfQorCisgICAg
VHJhbnNmb3JtYXRpb25NYXRyaXgmIHRyID0gY29udGV4dC0+YWZmaW5lVHJhbnNmb3JtKCk7Cisg
ICAgdHIuc2V0RSgtc3RhYmxlUm91bmQoLXRyLmUoKSkpOworICAgIHRyLnNldEYoLXN0YWJsZVJv
dW5kKC10ci5mKCkpKTsKKworICAgIGNvbnRleHQtPmNsaXAoY29udGVudHNDbGlwUmVjdCk7CisK
KyAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKS0+cGFpbnRDb250ZW50cyhjb250ZXh0
LCBjb250ZW50c0NsaXBSZWN0KTsKKworICAgIGNvbnRleHQtPnJlc3RvcmUoKTsKKworICAgIGlm
IChkcmF3U2Nyb2xsYmFycykgeworICAgICAgICBjb250ZXh0LT5zYXZlKCk7CisgICAgICAgIGNv
bnRleHQtPnRyYW5zbGF0ZSh4KCksIHkoKSk7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
JiB0ciA9IGNvbnRleHQtPmFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICB0ci5zZXRFKHN0YWJs
ZVJvdW5kKHRyLmUoKSkpOworICAgICAgICB0ci5zZXRGKHN0YWJsZVJvdW5kKHRyLmYoKSkpOwor
CisgICAgICAgIEludFJlY3Qgc2Nyb2xsVmlld0RpcnR5UmVjdDsKKyAgICAgICAgc2Nyb2xsVmll
d0RpcnR5UmVjdC5zZXRMb2NhdGlvbihyZWN0LmxvY2F0aW9uKCkgLSBJbnRTaXplKHgoKSwgeSgp
KSk7CisgICAgICAgIHNjcm9sbFZpZXdEaXJ0eVJlY3Quc2V0U2l6ZShyZWN0LnNpemUoKSk7CisK
KyAgICAgICAgaWYgKG1fZGF0YS0+Y2FuU2hvd0hTY3JvbGxiYXIoKSkKKyAgICAgICAgICAgIG1f
ZGF0YS0+bV9oQmFyLT5wYWludChjb250ZXh0LCBzY3JvbGxWaWV3RGlydHlSZWN0KTsKKyAgICAg
ICAgaWYgKG1fZGF0YS0+Y2FuU2hvd1ZTY3JvbGxiYXIoKSkKKyAgICAgICAgICAgIG1fZGF0YS0+
bV92QmFyLT5wYWludChjb250ZXh0LCBzY3JvbGxWaWV3RGlydHlSZWN0KTsKKworICAgICAgICAv
LyBGaWxsIHRoZSBzY3JvbGwgY29ybmVyIHdpdGggd2hpdGUuCisgICAgICAgIERXT1JEIGNvbG9y
V2luID0gR2V0U3lzQ29sb3IoQ09MT1JfU0NST0xMQkFSKTsKKyAgICAgICAgQ29sb3IgY29ybmVy
Q29sb3IoR2V0UlZhbHVlKGNvbG9yV2luKSwgR2V0R1ZhbHVlKGNvbG9yV2luKSwgR2V0QlZhbHVl
KGNvbG9yV2luKSk7CisgICAgICAgIEludFNpemUgaW5uZXJTaXplKG1fZGF0YS0+bV92aXNpYmxl
Q29udGVudHNXaWR0aCwgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCk7CisgICAgICAg
IEludFJlY3QgaENvcm5lciA9IG1fZGF0YS0+Z2V0SENvcm5lcihpbm5lclNpemUpOworICAgICAg
ICBpZiAoaENvcm5lci5pbnRlcnNlY3RzKHNjcm9sbFZpZXdEaXJ0eVJlY3QpKQorICAgICAgICAg
ICAgY29udGV4dC0+ZmlsbFJlY3QoaENvcm5lciwgY29ybmVyQ29sb3IpOworCisgICAgICAgIElu
dFJlY3QgdkNvcm5lciA9IG1fZGF0YS0+Z2V0VkNvcm5lcihpbm5lclNpemUpOworICAgICAgICBp
ZiAodkNvcm5lciAhPSBoQ29ybmVyICYmIHZDb3JuZXIuaW50ZXJzZWN0cyhzY3JvbGxWaWV3RGly
dHlSZWN0KSkKKyAgICAgICAgICAgIGNvbnRleHQtPmZpbGxSZWN0KHZDb3JuZXIsIGNvcm5lckNv
bG9yKTsKKworICAgICAgICBjb250ZXh0LT5yZXN0b3JlKCk7CisgICAgfQorfQorCit2b2lkIFNj
cm9sbFZpZXc6OndoZWVsRXZlbnQoUGxhdGZvcm1XaGVlbEV2ZW50JiBlKQoreworICAgIC8vIERl
dGVybWluZSBob3cgbXVjaCB3ZSB3YW50IHRvIHNjcm9sbC4gIElmIHdlIGNhbiBtb3ZlIGF0IGFs
bCwgd2Ugd2lsbCBhY2NlcHQgdGhlIGV2ZW50LgorICAgIEludFNpemUgbWF4U2Nyb2xsRGVsdGEg
PSBtYXhpbXVtU2Nyb2xsKCk7CisgICAgaWYgKChlLmRlbHRhWCgpIDwgMCAmJiBtYXhTY3JvbGxE
ZWx0YS53aWR0aCgpID4gMCkgfHwKKyAgICAgICAgKGUuZGVsdGFYKCkgPiAwICYmIHNjcm9sbE9m
ZnNldCgpLndpZHRoKCkgPiAwKSB8fAorICAgICAgICAoZS5kZWx0YVkoKSA8IDAgJiYgbWF4U2Ny
b2xsRGVsdGEuaGVpZ2h0KCkgPiAwKSB8fAorICAgICAgICAoZS5kZWx0YVkoKSA+IDAgJiYgc2Ny
b2xsT2Zmc2V0KCkuaGVpZ2h0KCkgPiAwKSkKKyAgICAgICAgZS5hY2NlcHQoKTsKKworICAgIHNj
cm9sbEJ5KC1lLmRlbHRhWCgpICogY1Njcm9sbGJhclBpeGVsc1BlckxpbmVTdGVwLCAtZS5kZWx0
YVkoKSAqIGNTY3JvbGxiYXJQaXhlbHNQZXJMaW5lU3RlcCk7Cit9CisKK2NvbnN0IEhhc2hTZXQ8
UmVmUHRyPFdpZGdldD4gPiogU2Nyb2xsVmlldzo6Y2hpbGRyZW4oKSBjb25zdAoreworICAgIHJl
dHVybiAmKG1fZGF0YS0+bV9jaGlsZHJlbik7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6ZnJhbWVS
ZWN0c0NoYW5nZWQoKSBjb25zdAoreworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0g
c3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgRnJhbWUqIGZyYW1lID0g
ZnJhbWVWaWV3LT5mcmFtZSgpOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGZvciAoRnJh
bWUqIGNoaWxkID0gZnJhbWUtPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBj
aGlsZC0+dHJlZSgpLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBpZiAoRnJhbWVWaWV3
KiB2aWV3ID0gY2hpbGQtPnZpZXcoKSkKKyAgICAgICAgICAgICAgICB2aWV3LT5mcmFtZVJlY3Rz
Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaGlkZUN1cnJlbnRQb3B1cE1lbnUo
KTsKKworICAgIEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6Y29uc3RfaXRlcmF0b3IgZW5kID0g
bV9kYXRhLT5tX2NoaWxkcmVuLmVuZCgpOworICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0
PiA+Ojpjb25zdF9pdGVyYXRvciBjdXJyZW50ID0gbV9kYXRhLT5tX2NoaWxkcmVuLmJlZ2luKCk7
IGN1cnJlbnQgIT0gZW5kOyArK2N1cnJlbnQpCisgICAgICAgICgqY3VycmVudCktPmZyYW1lUmVj
dHNDaGFuZ2VkKCk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6c2Nyb2xsKFNjcm9sbERpcmVjdGlv
biBkaXJlY3Rpb24sIFNjcm9sbEdyYW51bGFyaXR5IGdyYW51bGFyaXR5KQoreworICAgIGlmICAo
KGRpcmVjdGlvbiA9PSBTY3JvbGxVcCB8fCBkaXJlY3Rpb24gPT0gU2Nyb2xsRG93bikgJiYgbV9k
YXRhLT5tX3ZCYXIpCisgICAgICAgIHJldHVybiBtX2RhdGEtPm1fdkJhci0+c2Nyb2xsKGRpcmVj
dGlvbiwgZ3JhbnVsYXJpdHksIDEpOworICAgIGVsc2UgaWYgKG1fZGF0YS0+bV9oQmFyKQorICAg
ICAgICByZXR1cm4gbV9kYXRhLT5tX2hCYXItPnNjcm9sbChkaXJlY3Rpb24sIGdyYW51bGFyaXR5
LCAxKTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGludCBzY3JvbGxTY3JvbGxi
YXIoUGxhdGZvcm1TY3JvbGxiYXIqIGJhciwgaW50IG9mZnNldCkKK3sKKyAgICBpbnQgb3ZlcmZs
b3dWYWx1ZSA9IGJhci0+dmFsdWUoKSArIG9mZnNldDsKKworICAgIC8vIFNjcm9sbGJhciB3aWxs
IHRha2UgY2FyZSBvZiB0aGUgYm91bmRhcmllcy4KKyAgICBiYXItPnNldFZhbHVlKG92ZXJmbG93
VmFsdWUpOworCisgICAgcmV0dXJuIG92ZXJmbG93VmFsdWUgLSBiYXItPnZhbHVlKCk7Cit9CisK
K2ludCBTY3JvbGxWaWV3Ojptb3ZlU3ViZnJhbWVJbnRvVmlldyhjb25zdCBJbnRSZWN0JiByZWN0
LCBib29sIHZlcnRpY2FsLCBpbnQgbWF4T2Zmc2V0KQoreworICAgIGlmIChtYXhPZmZzZXQpIHsK
KyAgICAgICAgaWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSB2ZXJ0aWNhbCA/IG1fZGF0YS0+
bV92QmFyLmdldCgpIDogbV9kYXRhLT5tX2hCYXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIGludCBz
Y3JvbGxlZCA9IHZlcnRpY2FsCisgICAgICAgICAgICAgICAgPyBtYXhPZmZzZXQgPiAwCisgICAg
ICAgICAgICAgICAgICAgID8gcmVjdC5ib3R0b20oKSAtIHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9z
Y3JvbGxPZmZzZXQuaGVpZ2h0KCkgKyBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0KQor
ICAgICAgICAgICAgICAgICAgICA6IHJlY3QueSgpIC0gc3RhYmxlUm91bmQobV9kYXRhLT5tX3Nj
cm9sbE9mZnNldC5oZWlnaHQoKSkKKyAgICAgICAgICAgICAgICA6IG1heE9mZnNldCA+IDAKKyAg
ICAgICAgICAgICAgICAgICAgPyByZWN0LnJpZ2h0KCkgLSBzdGFibGVSb3VuZChtX2RhdGEtPm1f
c2Nyb2xsT2Zmc2V0LndpZHRoKCkgKyBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgpCisg
ICAgICAgICAgICAgICAgICAgIDogcmVjdC54KCkgLSBzdGFibGVSb3VuZChtX2RhdGEtPm1fc2Ny
b2xsT2Zmc2V0LndpZHRoKCkpOworCisgICAgICAgICAgICBpZiAoc2Nyb2xsZWQgPiAwICYmIG1h
eE9mZnNldCA+IDApCisgICAgICAgICAgICAgICAgc2Nyb2xsZWQgPSBtaW4obWF4T2Zmc2V0LCBz
Y3JvbGxlZCk7CisgICAgICAgICAgICBlbHNlIGlmIChzY3JvbGxlZCA8IDAgJiYgbWF4T2Zmc2V0
IDwgMCkKKyAgICAgICAgICAgICAgICBzY3JvbGxlZCA9IG1heChtYXhPZmZzZXQsIHNjcm9sbGVk
KTsKKworICAgICAgICAgICAgbWF4T2Zmc2V0IC09IHNjcm9sbGVkOworICAgICAgICAgICAgc2Ny
b2xsZWQgPSBzY3JvbGxSZWN1cnNpdmVseSh2ZXJ0aWNhbCwgc2Nyb2xsZWQpOworICAgICAgICAg
ICAgbWF4T2Zmc2V0ICs9IHNjcm9sbGVkOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJu
IG1heE9mZnNldDsKK30KKworaW50IFNjcm9sbFZpZXc6OnNjcm9sbFJlY3Vyc2l2ZWx5KGJvb2wg
dmVydGljYWwsIGludCBvZmZzZXQpCit7CisgICAgaWYgKHBhcmVudCgpKQorICAgICAgICBvZmZz
ZXQgPSBwYXJlbnQoKS0+bW92ZVN1YmZyYW1lSW50b1ZpZXcoZnJhbWVSZWN0KCksIHZlcnRpY2Fs
LCBvZmZzZXQpOworCisgICAgaWYgKG9mZnNldCkKKyAgICAgICAgaWYgKFBsYXRmb3JtU2Nyb2xs
YmFyKiBiYXIgPSB2ZXJ0aWNhbCA/IG1fZGF0YS0+bV92QmFyLmdldCgpIDogbV9kYXRhLT5tX2hC
YXIuZ2V0KCkpCisgICAgICAgICAgICBvZmZzZXQgPSBzY3JvbGxTY3JvbGxiYXIoYmFyLCBvZmZz
ZXQpOworCisgICAgaWYgKG9mZnNldCAmJiBwYXJlbnQoKSkKKyAgICAgICAgb2Zmc2V0ID0gcGFy
ZW50KCktPnNjcm9sbFJlY3Vyc2l2ZWx5KHZlcnRpY2FsLCBvZmZzZXQpOworCisgICAgcmV0dXJu
IG9mZnNldDsKK30KKwordm9pZCBTY3JvbGxWaWV3Ojptb3ZlU3ViZnJhbWVJbnRvVmlldyhjb25z
dCBJbnRSZWN0JiByZWN0LCBJbnRTaXplJiBtYXhPZmZzZXQsIGJvb2wgc2hvd1Njcm9sbGJhcnMp
Cit7CisgICAgSW50U2l6ZSBzY3JvbGxlZCgwLCAwKTsKKyAgICBpZiAobWF4T2Zmc2V0LndpZHRo
KCkpIHsKKyAgICAgICAgaWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSBtX2RhdGEtPm1faEJh
ci5nZXQoKSkgeworICAgICAgICAgICAgc2Nyb2xsZWQuc2V0V2lkdGgobWF4T2Zmc2V0LndpZHRo
KCkgPiAwCisgICAgICAgICAgICAgICAgICAgID8gcmVjdC5yaWdodCgpIC0gc3RhYmxlUm91bmQo
bV9kYXRhLT5tX3Njcm9sbE9mZnNldC53aWR0aCgpICsgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50
c1dpZHRoKQorICAgICAgICAgICAgICAgICAgICA6IHJlY3QueCgpIC0gc3RhYmxlUm91bmQobV9k
YXRhLT5tX3Njcm9sbE9mZnNldC53aWR0aCgpKSk7CisKKyAgICAgICAgICAgIGlmIChzY3JvbGxl
ZC53aWR0aCgpID4gMCAmJiBtYXhPZmZzZXQud2lkdGgoKSA+IDApCisgICAgICAgICAgICAgICAg
c2Nyb2xsZWQuc2V0V2lkdGgobWluKG1heE9mZnNldC53aWR0aCgpLCBzY3JvbGxlZC53aWR0aCgp
KSk7CisgICAgICAgICAgICBlbHNlIGlmIChzY3JvbGxlZC53aWR0aCgpIDwgMCAmJiBtYXhPZmZz
ZXQud2lkdGgoKSA8IDApCisgICAgICAgICAgICAgICAgc2Nyb2xsZWQuc2V0V2lkdGgobWF4KG1h
eE9mZnNldC53aWR0aCgpLCBzY3JvbGxlZC53aWR0aCgpKSk7CisgICAgICAgICAgICBlbHNlCisg
ICAgICAgICAgICAgICAgc2Nyb2xsZWQuc2V0V2lkdGgoMCk7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgaWYgKG1heE9mZnNldC5oZWlnaHQoKSkgeworICAgICAgICBpZiAoUGxhdGZvcm1TY3JvbGxi
YXIqIGJhciA9IG1fZGF0YS0+bV92QmFyLmdldCgpKSB7CisgICAgICAgICAgICBzY3JvbGxlZC5z
ZXRIZWlnaHQobWF4T2Zmc2V0LmhlaWdodCgpID4gMAorICAgICAgICAgICAgICAgICAgICA/IHJl
Y3QuYm90dG9tKCkgLSBzdGFibGVSb3VuZChtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgp
ICsgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCkKKyAgICAgICAgICAgICAgICAgICAg
OiByZWN0LnkoKSAtIHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQuaGVpZ2h0KCkp
KTsKKworICAgICAgICAgICAgaWYgKHNjcm9sbGVkLmhlaWdodCgpID4gMCAmJiBtYXhPZmZzZXQu
aGVpZ2h0KCkgPiAwKQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldEhlaWdodChtaW4obWF4
T2Zmc2V0LmhlaWdodCgpLCBzY3JvbGxlZC5oZWlnaHQoKSkpOworICAgICAgICAgICAgZWxzZSBp
ZiAoc2Nyb2xsZWQuaGVpZ2h0KCkgPCAwICYmIG1heE9mZnNldC5oZWlnaHQoKSA8IDApCisgICAg
ICAgICAgICAgICAgc2Nyb2xsZWQuc2V0SGVpZ2h0KG1heChtYXhPZmZzZXQuaGVpZ2h0KCksIHNj
cm9sbGVkLmhlaWdodCgpKSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgc2Ny
b2xsZWQuc2V0SGVpZ2h0KDApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzY3JvbGxlZC53
aWR0aCgpIHx8IHNjcm9sbGVkLmhlaWdodCgpKSB7CisgICAgICAgIG1heE9mZnNldCAtPSBzY3Jv
bGxlZDsKKyAgICAgICAgc2Nyb2xsUmVjdXJzaXZlbHkoc2Nyb2xsZWQsIHNob3dTY3JvbGxiYXJz
KTsKKyAgICAgICAgbWF4T2Zmc2V0ICs9IHNjcm9sbGVkOworICAgIH0KK30KKwordm9pZCBTY3Jv
bGxWaWV3OjpzY3JvbGxSZWN1cnNpdmVseShJbnRTaXplJiBvZmZzZXQsIGJvb2wgc2hvd1Njcm9s
bGJhcnMpCit7CisgICAgaWYgKCFvZmZzZXQud2lkdGgoKSAmJiAhb2Zmc2V0LmhlaWdodCgpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAocGFyZW50KCkpCisgICAgICAgIHBhcmVudCgpLT5t
b3ZlU3ViZnJhbWVJbnRvVmlldyhmcmFtZVJlY3QoKSwgb2Zmc2V0LCBzaG93U2Nyb2xsYmFycyk7
CisKKyAgICBJbnRTaXplIG9sZE9mZnNldChtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0KTsKKyAgICBi
b29sIG9sZFN1cHByZXNzZWQgPSBtX2RhdGEtPm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQ7Cisg
ICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkID0gdHJ1ZTsKKworICAgIGlmIChv
ZmZzZXQud2lkdGgoKSkgeworICAgICAgICBpZiAoUGxhdGZvcm1TY3JvbGxiYXIqIGJhciA9IG1f
ZGF0YS0+bV9oQmFyLmdldCgpKQorICAgICAgICAgICAgb2Zmc2V0LnNldFdpZHRoKHNjcm9sbFNj
cm9sbGJhcihiYXIsIG9mZnNldC53aWR0aCgpKSk7CisgICAgfQorCisgICAgaWYgKG9mZnNldC5o
ZWlnaHQoKSkgeworICAgICAgICBpZiAoUGxhdGZvcm1TY3JvbGxiYXIqIGJhciA9IG1fZGF0YS0+
bV92QmFyLmdldCgpKQorICAgICAgICAgICAgb2Zmc2V0LnNldEhlaWdodChzY3JvbGxTY3JvbGxi
YXIoYmFyLCBvZmZzZXQuaGVpZ2h0KCkpKTsKKyAgICB9CisKKyAgICBtX2RhdGEtPm1fc2hvd1Nj
cm9sbGJhclN1cHByZXNzZWQgPSBvbGRTdXBwcmVzc2VkOworICAgIGlmICghbV9kYXRhLT5tX3No
b3dTY3JvbGxiYXJTdXBwcmVzc2VkKSB7CisgICAgICAgIEludFNpemUgZGVsdGFTY3JvbGwgPSBt
X2RhdGEtPm1fc2Nyb2xsT2Zmc2V0IC0gb2xkT2Zmc2V0OworICAgICAgICBpZiAoZGVsdGFTY3Jv
bGwud2lkdGgoKSB8fCBkZWx0YVNjcm9sbC5oZWlnaHQoKSkgeworICAgICAgICAgICAgbV9kYXRh
LT5zY3JvbGxCYWNraW5nU3RvcmUoZGVsdGFTY3JvbGwpOworICAgICAgICAgICAgLy9zdGF0aWNf
Y2FzdDxGcmFtZVZpZXcqPih0aGlzKS0+ZnJhbWUoKS0+c2VuZFNjcm9sbEV2ZW50KCk7CisgICAg
ICAgICAgICBjb25zdCBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZy
YW1lVmlldyo+KHRoaXMpOworICAgICAgICAgICAgaWYgKEZyYW1lKiBmcmFtZSA9IGZyYW1lVmll
dy0+ZnJhbWUoKSkgeworICAgICAgICAgICAgICAgIGlmIChmcmFtZS0+c2hvdWxkQmxpbmtDYXJl
dCgpKQorICAgICAgICAgICAgICAgICAgICBob3N0V2luZG93KCktPmNhcmV0UmVjdENoYW5nZWQo
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaG93U2Nyb2xsYmFycykKKyAgICAg
ICAgICAgICAgICBtX2RhdGEtPnNob3dTY3JvbGxiYXJzKGRlbHRhU2Nyb2xsLndpZHRoKCkgIT0g
MCwgZGVsdGFTY3JvbGwuaGVpZ2h0KCkgIT0gMCwgc2hvd1Njcm9sbGJhcnMpOworICAgICAgICB9
CisgICAgfQorCisgICAgaWYgKHBhcmVudCgpKSB7CisgICAgICAgIGlmIChvZmZzZXQud2lkdGgo
KSB8fCBvZmZzZXQuaGVpZ2h0KCkpCisgICAgICAgICAgICBwYXJlbnQoKS0+c2Nyb2xsUmVjdXJz
aXZlbHkob2Zmc2V0LCBzaG93U2Nyb2xsYmFycyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYg
KCFtX2RhdGEtPm1fdkJhcikKKyAgICAgICAgICAgIG9mZnNldC5zZXRIZWlnaHQoMCk7CisgICAg
ICAgIGlmICghbV9kYXRhLT5tX2hCYXIpCisgICAgICAgICAgICBvZmZzZXQuc2V0V2lkdGgoMCk7
CisgICAgfQorfQorCit2b2lkIFNjcm9sbFZpZXc6OnNjcm9sbFJlY3Vyc2l2ZWx5KFNjcm9sbERp
cmVjdGlvbiBkaXJlY3Rpb24sIFNjcm9sbEdyYW51bGFyaXR5IGdyYW51bGFyaXR5LCBpbnQgcmVw
ZWF0Q291bnQpCit7CisgICAgYm9vbCB2ZXJ0aWNhbCA9IGRpcmVjdGlvbiA9PSBTY3JvbGxVcCB8
fCBkaXJlY3Rpb24gPT0gU2Nyb2xsRG93bjsKKyAgICBpZiAoUGxhdGZvcm1TY3JvbGxiYXIqIGJh
ciA9IHZlcnRpY2FsID8gbV9kYXRhLT5tX3ZCYXIuZ2V0KCkgOiBtX2RhdGEtPm1faEJhci5nZXQo
KSkgeworICAgICAgICBpbnQgb2Zmc2V0ID0gZGlyZWN0aW9uID09IFNjcm9sbFVwIHx8IGRpcmVj
dGlvbiA9PSBTY3JvbGxMZWZ0ID8gLTEgOiAxOworICAgICAgICBvZmZzZXQgKj0gZ3JhbnVsYXJp
dHkgPT0gU2Nyb2xsQnlMaW5lID8gY1Njcm9sbGJhclBpeGVsc1BlckxpbmVTdGVwCisgICAgICAg
ICAgICA6IGdyYW51bGFyaXR5ID09IFNjcm9sbEJ5UGFnZSA/ICh2ZXJ0aWNhbCA/IGhlaWdodCgp
IDogd2lkdGgoKSkgLSBjQW1vdW50VG9LZWVwV2hlblBhZ2luZworICAgICAgICAgICAgOiBncmFu
dWxhcml0eSA9PSBTY3JvbGxCeURvY3VtZW50ID8gdmVydGljYWwgPyBjb250ZW50c0hlaWdodCgp
IDogY29udGVudHNXaWR0aCgpCisgICAgICAgICAgICA6IDE7CisgICAgICAgIG9mZnNldCAqPSBy
ZXBlYXRDb3VudDsKKyAgICAgICAgc2Nyb2xsUmVjdXJzaXZlbHkodmVydGljYWwsIG9mZnNldCk7
CisgICAgfSBlbHNlIGlmIChwYXJlbnQoKSkKKyAgICAgICAgcGFyZW50KCktPnNjcm9sbFJlY3Vy
c2l2ZWx5KGRpcmVjdGlvbiwgZ3JhbnVsYXJpdHksIHJlcGVhdENvdW50KTsKK30KKwordm9pZCBT
Y3JvbGxWaWV3OjpzY3JvbGxXaW5kb3dPZmZzZXQoU0laRSYgZGVsdGEsIGJvb2wgc2hvd1Njcm9s
bGJhcnMpCit7CisgICAgSW50U2l6ZSBvZmZzZXQgPSBJbnRTaXplKGRlbHRhKSAvIHNjYWxlKCk7
CisgICAgc2Nyb2xsUmVjdXJzaXZlbHkob2Zmc2V0LCBzaG93U2Nyb2xsYmFycyk7CisgICAgZGVs
dGEgPSBvZmZzZXQgKiBzY2FsZSgpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNldEFsbG93c1Nj
cm9sbGluZyhib29sIGZsYWcpCit7CisgICAgaWYgKG1fYWxsb3dzQ2hhbmdpbmdTY3JvbGxiYXJN
b2RlKQorICAgICAgICBtX2RhdGEtPnNldEFsbG93c1Njcm9sbGluZyhmbGFnKTsKK30KKworYm9v
bCBTY3JvbGxWaWV3OjphbGxvd3NTY3JvbGxpbmcoKSBjb25zdAoreworICAgIHJldHVybiBtX2Rh
dGEtPmFsbG93c1Njcm9sbGluZygpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnBhaW50U2Nyb2xs
YmFycyhIREMgaGRjLCBMUFJFQ1QgZGlydHlSZWN0V2luKQoreworICAgIEludFJlY3QgZGlydHlS
ZWN0KCpkaXJ0eVJlY3RXaW4pOworICAgIEludFJlY3QgbXlXaW5kb3dSZWN0KG1fZGF0YS0+bV9w
aHlzaWNhbEdlb21ldHJ5KTsKKyAgICBkaXJ0eVJlY3QuaW50ZXJzZWN0KG15V2luZG93UmVjdCk7
CisKKyAgICBpZiAoIW1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3NlZCAmJiBtX2RhdGEtPm1f
c2Nyb2xsYmFyc1Zpc2libGUgJiYgKG1fZGF0YS0+Y2FuU2hvd1ZTY3JvbGxiYXIoKSB8fCBtX2Rh
dGEtPmNhblNob3dIU2Nyb2xsYmFyKCkpKSB7CisgICAgICAgIEdyYXBoaWNzQ29udGV4dCBteUNv
bnRleHQoaGRjKTsKKyAgICAgICAgbXlDb250ZXh0LnNhdmUoKTsKKyAgICAgICAgbXlDb250ZXh0
LmNsaXAoZGlydHlSZWN0KTsKKyAgICAgICAgbXlDb250ZXh0LnRyYW5zbGF0ZShtX2RhdGEtPm1f
cGh5c2ljYWxHZW9tZXRyeS54KCksIG1fZGF0YS0+bV9waHlzaWNhbEdlb21ldHJ5LnkoKSk7Cisg
ICAgICAgIG15Q29udGV4dC5zY2FsZShGbG9hdFNpemUoc2NhbGUoKSwgc2NhbGUoKSkpOworCisg
ICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IGFmZmluZVRyYW5zID0gbXlDb250ZXh0LmFmZmlu
ZVRyYW5zZm9ybSgpLmludmVyc2UoKTsKKyAgICAgICAgSW50UmVjdCBzY3JvbGxWaWV3RGlydHlS
ZWN0ID0gZW5jbG9zaW5nSW50UmVjdChhZmZpbmVUcmFucy5tYXBSZWN0KEZsb2F0UmVjdChkaXJ0
eVJlY3QpKSk7CisgICAgICAgIGlmICghc2Nyb2xsVmlld0RpcnR5UmVjdC5pc0VtcHR5KCkpIHsK
KyAgICAgICAgICAgIERXT1JEIGNvbG9yV2luID0gR2V0U3lzQ29sb3IoQ09MT1JfU0NST0xMQkFS
KTsKKyAgICAgICAgICAgIENvbG9yIGNvcm5lckNvbG9yKEdldFJWYWx1ZShjb2xvcldpbiksIEdl
dEdWYWx1ZShjb2xvcldpbiksIEdldEJWYWx1ZShjb2xvcldpbikpOworCisgICAgICAgICAgICBp
ZiAobV9kYXRhLT5jYW5TaG93SFNjcm9sbGJhcigpKSB7CisgICAgICAgICAgICAgICAgbV9kYXRh
LT5tX2hCYXItPnBhaW50KCZteUNvbnRleHQsIHNjcm9sbFZpZXdEaXJ0eVJlY3QpOworCisgICAg
ICAgICAgICAgICAgaW50IGhCYXJCb3R0b20gPSBtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeS55
KCkgKyBzdGFibGVSb3VuZCgobV9kYXRhLT5tX2hCYXItPnkoKSArIG1fZGF0YS0+bV9oQmFyLT5o
ZWlnaHQoKSkgKiBzY2FsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaEJhckJvdHRvbSA8IG15
V2luZG93UmVjdC5ib3R0b20oKSkgeworICAgICAgICAgICAgICAgICAgICBJbnRSZWN0IGJsYW5r
QXJlYShteVdpbmRvd1JlY3QueCgpCisgICAgICAgICAgICAgICAgICAgICAgICAsIGhCYXJCb3R0
b20KKyAgICAgICAgICAgICAgICAgICAgICAgICwgbXlXaW5kb3dSZWN0LndpZHRoKCkKKyAgICAg
ICAgICAgICAgICAgICAgICAgICwgbXlXaW5kb3dSZWN0LmJvdHRvbSgpIC0gaEJhckJvdHRvbSk7
CisKKyAgICAgICAgICAgICAgICAgICAgYmxhbmtBcmVhLmludGVyc2VjdChkaXJ0eVJlY3QpOwor
CisgICAgICAgICAgICAgICAgICAgIGlmICghYmxhbmtBcmVhLmlzRW1wdHkoKSkgeworICAgICAg
ICAgICAgICAgICAgICAgICAgbXlDb250ZXh0LnNhdmUoKTsKKyAgICAgICAgICAgICAgICAgICAg
ICAgIEdyYXBoaWNzQ29udGV4dCBvcmlnQ29udGV4dChoZGMpOworICAgICAgICAgICAgICAgICAg
ICAgICAgb3JpZ0NvbnRleHQuZmlsbFJlY3QoYmxhbmtBcmVhLCBjb3JuZXJDb2xvcik7CisgICAg
ICAgICAgICAgICAgICAgICAgICBteUNvbnRleHQucmVzdG9yZSgpOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbXlXaW5kb3dSZWN0
LnNldEhlaWdodChzdGFibGVSb3VuZChtX2RhdGEtPm1faEJhci0+eSgpICogc2NhbGUoKSkpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1fZGF0YS0+Y2FuU2hvd1ZTY3JvbGxiYXIo
KSkgeworICAgICAgICAgICAgICAgIG1fZGF0YS0+bV92QmFyLT5wYWludCgmbXlDb250ZXh0LCBz
Y3JvbGxWaWV3RGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAgIGludCB2QmFyUmlnaHQgPSBt
X2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeS54KCkgKyBzdGFibGVSb3VuZCgobV9kYXRhLT5tX3ZC
YXItPngoKSArIG1fZGF0YS0+bV92QmFyLT53aWR0aCgpKSAqIHNjYWxlKCkpOworICAgICAgICAg
ICAgICAgIGlmICh2QmFyUmlnaHQgPCBteVdpbmRvd1JlY3QucmlnaHQoKSkgeworICAgICAgICAg
ICAgICAgICAgICBJbnRSZWN0IGJsYW5rQXJlYSh2QmFyUmlnaHQKKyAgICAgICAgICAgICAgICAg
ICAgICAgICwgbXlXaW5kb3dSZWN0LnkoKQorICAgICAgICAgICAgICAgICAgICAgICAgLCBteVdp
bmRvd1JlY3QucmlnaHQoKSAtIHZCYXJSaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgLCBt
eVdpbmRvd1JlY3QuaGVpZ2h0KCkpOworCisgICAgICAgICAgICAgICAgICAgIGJsYW5rQXJlYS5p
bnRlcnNlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWJsYW5rQXJl
YS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15Q29udGV4dC5zYXZlKCk7
CisgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRleHQgb3JpZ0NvbnRleHQoaGRj
KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdDb250ZXh0LmZpbGxSZWN0KGJsYW5rQXJl
YSwgY29ybmVyQ29sb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgbXlDb250ZXh0LnJlc3Rv
cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgICAgIG15V2luZG93UmVjdC5zZXRXaWR0aChzdGFibGVSb3VuZChtX2RhdGEtPm1fdkJh
ci0+eCgpICogc2NhbGUoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaWxs
IHRoZSBzY3JvbGwgY29ybmVyIHdpdGggd2hpdGUuCisgICAgICAgICAgICBJbnRTaXplIGlubmVy
U2l6ZShtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgsIG1fZGF0YS0+bV92aXNpYmxlQ29u
dGVudHNIZWlnaHQpOworICAgICAgICAgICAgSW50UmVjdCBoQ29ybmVyID0gbV9kYXRhLT5nZXRI
Q29ybmVyKGlubmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAoaENvcm5lci5pbnRlcnNlY3RzKHNj
cm9sbFZpZXdEaXJ0eVJlY3QpKQorICAgICAgICAgICAgICAgIG15Q29udGV4dC5maWxsUmVjdCho
Q29ybmVyLCBjb3JuZXJDb2xvcik7CisKKyAgICAgICAgICAgIEludFJlY3QgdkNvcm5lciA9IG1f
ZGF0YS0+Z2V0VkNvcm5lcihpbm5lclNpemUpOworICAgICAgICAgICAgaWYgKHZDb3JuZXIgIT0g
aENvcm5lciAmJiB2Q29ybmVyLmludGVyc2VjdHMoc2Nyb2xsVmlld0RpcnR5UmVjdCkpCisgICAg
ICAgICAgICAgICAgbXlDb250ZXh0LmZpbGxSZWN0KHZDb3JuZXIsIGNvcm5lckNvbG9yKTsKKwor
ICAgICAgICAgICAgZGlydHlSZWN0LmludGVyc2VjdChteVdpbmRvd1JlY3QpOworICAgICAgICB9
CisKKyAgICAgICAgbXlDb250ZXh0LnJlc3RvcmUoKTsKKyAgICB9CisKKyAgICAqZGlydHlSZWN0
V2luID0gZGlydHlSZWN0OworfQorCit2b2lkIFNjcm9sbFZpZXc6OmhpZGVDaGlsZFNjcm9sbGJh
cnNSZWN1cnNpdmVseSgpCit7CisgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0
aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICBGcmFtZSogZnJhbWUgPSBmcmFt
ZVZpZXctPmZyYW1lKCk7CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgZm9yIChGcmFtZSog
Y2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5maXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxk
LT50cmVlKCktPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChGcmFtZVZpZXcqIHZp
ZXcgPSBjaGlsZC0+dmlldygpKQorICAgICAgICAgICAgICAgIHZpZXctPmhpZGVDaGlsZFNjcm9s
bGJhcnNSZWN1cnNpdmVseSgpOworICAgICAgICB9CisgICAgfQorCisgICAgbV9kYXRhLT5oaWRl
U2Nyb2xsYmFycygpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNldFNjcm9sbGJhcnNWaXNpYmxl
KGJvb2wgdikKK3sKKyAgICBpZiAodikKKyAgICAgICAgbV9kYXRhLT5zaG93U2Nyb2xsYmFycyh0
cnVlLCB0cnVlLCB0cnVlKTsKKyAgICBlbHNlCisgICAgICAgIG1fZGF0YS0+aGlkZVNjcm9sbGJh
cnMoKTsKK30KKworYm9vbCBTY3JvbGxWaWV3OjpzaG93c1Njcm9sbGJhcnNBdXRvbWF0aWNhbGx5
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX2F1dG9TaG93SGlkZVNjcm9sbGJhcnM7
Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2hvd1Njcm9sbGJhcnNBdXRvbWF0aWNhbGx5KCkKK3sK
KyAgICBtX2RhdGEtPnNldEF1dG9TY3JvbGxiYXJzKHRydWUpOworfQorCit2b2lkIFNjcm9sbFZp
ZXc6OnNob3dTY3JvbGxiYXJzTWFudWFsbHkoKQoreworICAgIG1fZGF0YS0+c2V0QXV0b1Njcm9s
bGJhcnMoZmFsc2UpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNob3coKQoreworICAgIGlmICgh
aXNTZWxmVmlzaWJsZSgpKSB7CisgICAgICAgIHNldFNlbGZWaXNpYmxlKHRydWUpOworICAgICAg
ICBpZiAoaXNQYXJlbnRWaXNpYmxlKCkpIHsKKyAgICAgICAgICAgIEhhc2hTZXQ8UmVmUHRyPFdp
ZGdldD4gPjo6aXRlcmF0b3IgZW5kID0gbV9kYXRhLT5tX2NoaWxkcmVuLmVuZCgpOworICAgICAg
ICAgICAgZm9yIChIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID46Oml0ZXJhdG9yIGl0ID0gbV9kYXRh
LT5tX2NoaWxkcmVuLmJlZ2luKCk7IGl0ICE9IGVuZDsgKytpdCkKKyAgICAgICAgICAgICAgICAo
Kml0KS0+c2V0UGFyZW50VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFdp
ZGdldDo6c2hvdygpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OmhpZGUoKQoreworICAgIGlmIChp
c1NlbGZWaXNpYmxlKCkpIHsKKyAgICAgICAgaWYgKGlzUGFyZW50VmlzaWJsZSgpKSB7CisgICAg
ICAgICAgICBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID46Oml0ZXJhdG9yIGVuZCA9IG1fZGF0YS0+
bV9jaGlsZHJlbi5lbmQoKTsKKyAgICAgICAgICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0
PiA+OjppdGVyYXRvciBpdCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBlbmQ7
ICsraXQpCisgICAgICAgICAgICAgICAgKCppdCktPnNldFBhcmVudFZpc2libGUoZmFsc2UpOwor
ICAgICAgICB9CisgICAgICAgIHNldFNlbGZWaXNpYmxlKGZhbHNlKTsKKyAgICB9CisKKyAgICBo
aWRlQ3VycmVudFBvcHVwTWVudSgpOworICAgIFdpZGdldDo6aGlkZSgpOworfQorCit2b2lkIFNj
cm9sbFZpZXc6OnNldFBhcmVudFZpc2libGUoYm9vbCB2aXNpYmxlKQoreworICAgIGlmIChpc1Bh
cmVudFZpc2libGUoKSA9PSB2aXNpYmxlKQorICAgICAgICByZXR1cm47CisKKyAgICBXaWRnZXQ6
OnNldFBhcmVudFZpc2libGUodmlzaWJsZSk7CisKKyAgICBpZiAoIWlzU2VsZlZpc2libGUoKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRv
ciBlbmQgPSBtX2RhdGEtPm1fY2hpbGRyZW4uZW5kKCk7CisgICAgZm9yIChIYXNoU2V0PFJlZlB0
cjxXaWRnZXQ+ID46Oml0ZXJhdG9yIGl0ID0gbV9kYXRhLT5tX2NoaWxkcmVuLmJlZ2luKCk7IGl0
ICE9IGVuZDsgKytpdCkKKyAgICAgICAgKCppdCktPnNldFBhcmVudFZpc2libGUodmlzaWJsZSk7
Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6aGlkZUN1cnJlbnRQb3B1cE1lbnUoKSBjb25zdAorewor
ICAgIGlmIChtX2N1cnJlbnRQb3B1cE1lbnUpCisgICAgICAgIG1fY3VycmVudFBvcHVwTWVudS0+
aGlkZSgpOworfQorCitJbnRSZWN0IFNjcm9sbFZpZXc6OnZpc2libGVXaW5kb3dSZWN0KCkgY29u
c3QKK3sKKyAgICBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgSW50UmVjdCB2aXNpYmxlV2luZG93
UmVjdChwYXJlbnQoKS0+Y29udGVudHNUb1dpbmRvdyhtX2RhdGEtPmdldFZpc2libGVDb250ZW50
UmVjdCgpKSk7CisgICAgICAgIHZpc2libGVXaW5kb3dSZWN0LmludGVyc2VjdChwYXJlbnQoKS0+
dmlzaWJsZVdpbmRvd1JlY3QoKSk7CisgICAgICAgIHJldHVybiB2aXNpYmxlV2luZG93UmVjdDsK
KyAgICB9IGVsc2UgeworICAgICAgICBJbnRSZWN0IHZpc2libGVXaW5kb3dSZWN0KG1fZGF0YS0+
bV9waHlzaWNhbEdlb21ldHJ5KTsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9zY3JvbGxiYXJzVmlz
aWJsZSkgeworICAgICAgICAgICAgaWYgKG1fZGF0YS0+Y2FuU2hvd0hTY3JvbGxiYXIoKSkKKyAg
ICAgICAgICAgICAgICB2aXNpYmxlV2luZG93UmVjdC5zZXRIZWlnaHQoc3RhYmxlUm91bmQobV9k
YXRhLT5tX2hCYXItPnkoKSAqIHNjYWxlKCkpKTsKKyAgICAgICAgICAgIGlmIChtX2RhdGEtPmNh
blNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICAgICAgdmlzaWJsZVdpbmRvd1JlY3Quc2V0
V2lkdGgoc3RhYmxlUm91bmQobV9kYXRhLT5tX3ZCYXItPngoKSAqIHNjYWxlKCkpKTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gdmlzaWJsZVdpbmRvd1JlY3Q7CisgICAgfQorfQorCitJbnRT
aXplIFNjcm9sbFZpZXc6Om1heFNjcm9sbE9mZnNldFJlY3Vyc2l2ZWx5KCkgY29uc3QKK3sKKyAg
ICBJbnRTaXplIG1heFNjcm9sbFBvc2l0aW9uKG1heCgwLCBjb250ZW50c1dpZHRoKCkgLSB3aWR0
aCgpKSwgbWF4KDAsIGNvbnRlbnRzSGVpZ2h0KCkgLSBoZWlnaHQoKSkpOworICAgIGlmIChwYXJl
bnQoKSkKKyAgICAgICAgbWF4U2Nyb2xsUG9zaXRpb24gKz0gcGFyZW50KCktPm1heFNjcm9sbE9m
ZnNldFJlY3Vyc2l2ZWx5KCk7CisgICAgcmV0dXJuIG1heFNjcm9sbFBvc2l0aW9uOworfQorCitJ
bnRTaXplIFNjcm9sbFZpZXc6OmN1cnJlbnRTY3JvbGxPZmZzZXRSZWN1cnNpdmVseSgpIGNvbnN0
Cit7CisgICAgSW50U2l6ZSBzY3JvbGxPZmZzZXQobV9kYXRhLT5tX3Njcm9sbE9mZnNldCk7Cisg
ICAgaWYgKHBhcmVudCgpKQorICAgICAgICBzY3JvbGxPZmZzZXQgKz0gcGFyZW50KCktPmN1cnJl
bnRTY3JvbGxPZmZzZXRSZWN1cnNpdmVseSgpOworICAgIHJldHVybiBzY3JvbGxPZmZzZXQ7Cit9
CisKK0ludFNpemUgU2Nyb2xsVmlldzo6d2luZG93U2Nyb2xsT2Zmc2V0KCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV9kYXRhLT5tX3Njcm9sbE9mZnNldCAqIHNjYWxlKCk7Cit9CisKK0ludFJlY3Qg
U2Nyb2xsVmlldzo6d2luZG93Q29udGVudHNSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gY29u
dGVudHNUb1dpbmRvdyhJbnRSZWN0KEludFBvaW50KDAsIDApLCBtX2RhdGEtPm1fY29udGVudHNT
aXplKSk7Cit9CisKKy8vIFNjcm9sbGJhckNsaWVudAordm9pZCBTY3JvbGxWaWV3Ojp2YWx1ZUNo
YW5nZWQoU2Nyb2xsYmFyKiBzY3JvbGxiYXIpCit7CisgICAgbV9kYXRhLT52YWx1ZUNoYW5nZWQo
c2Nyb2xsYmFyKTsKK30KKworYm9vbCBTY3JvbGxWaWV3OjpzY3JvbGxiYXJDb3JuZXJQcmVzZW50
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX2hCYXIgJiYgbV9kYXRhLT5tX3ZCYXI7
Cit9CisKKy8vIE5ldwordm9pZCBTY3JvbGxWaWV3OjpzZXRIYXNIb3Jpem9udGFsU2Nyb2xsYmFy
KGJvb2wgaGFzKQoreworICAgIG1fZGF0YS0+c2V0SGFzSG9yaXpvbnRhbFNjcm9sbGJhcihoYXMp
OworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNldEhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGJvb2wgaGFz
KQoreworICAgIG1fZGF0YS0+c2V0SGFzVmVydGljYWxTY3JvbGxiYXIoaGFzKTsKK30KKworYm9v
bCBTY3JvbGxWaWV3OjpzY3JvbGxiYXJzU3VwcHJlc3NlZCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IG1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3NlZDsKK30KKwordm9pZCBTY3JvbGxWaWV3Ojpz
ZXRDYW5CbGl0T25TY3JvbGwoYm9vbCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorYm9v
bCBTY3JvbGxWaWV3OjpjYW5CbGl0T25TY3JvbGwoKSBjb25zdAoreworICAgIHJldHVybiBmYWxz
ZTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRDYW5IYXZlU2Nyb2xsYmFycyhib29sIGNhblNj
cm9sbCkKK3sKKyAgICBTY3JvbGxiYXJNb2RlIG5ld0hvcml6b250YWxNb2RlOworICAgIFNjcm9s
bGJhck1vZGUgbmV3VmVydGljYWxNb2RlOworCisgICAgc2Nyb2xsYmFyTW9kZXMobmV3SG9yaXpv
bnRhbE1vZGUsIG5ld1ZlcnRpY2FsTW9kZSk7CisKKyAgICBpZiAoY2FuU2Nyb2xsICYmIG5ld1Zl
cnRpY2FsTW9kZSA9PSBTY3JvbGxiYXJBbHdheXNPZmYpCisgICAgICAgIG5ld1ZlcnRpY2FsTW9k
ZSA9IFNjcm9sbGJhckF1dG87CisgICAgZWxzZSBpZiAoIWNhblNjcm9sbCkKKyAgICAgICAgbmV3
VmVydGljYWxNb2RlID0gU2Nyb2xsYmFyQWx3YXlzT2ZmOworCisgICAgaWYgKGNhblNjcm9sbCAm
JiBuZXdIb3Jpem9udGFsTW9kZSA9PSBTY3JvbGxiYXJBbHdheXNPZmYpCisgICAgICAgIG5ld0hv
cml6b250YWxNb2RlID0gU2Nyb2xsYmFyQXV0bzsKKyAgICBlbHNlIGlmICghY2FuU2Nyb2xsKQor
ICAgICAgICBuZXdIb3Jpem9udGFsTW9kZSA9IFNjcm9sbGJhckFsd2F5c09mZjsKKworICAgIHNl
dFNjcm9sbGJhck1vZGVzKG5ld0hvcml6b250YWxNb2RlLCBuZXdWZXJ0aWNhbE1vZGUpOworfQor
Cit2b2lkIFNjcm9sbFZpZXc6OnNjcm9sbGJhck1vZGVzKFNjcm9sbGJhck1vZGUmIGhvcml6b250
YWxNb2RlLCBTY3JvbGxiYXJNb2RlJiB2ZXJ0aWNhbE1vZGUpIGNvbnN0Cit7CisgICAgaG9yaXpv
bnRhbE1vZGUgPSBob3Jpem9udGFsU2Nyb2xsYmFyTW9kZSgpOworICAgIHZlcnRpY2FsTW9kZSA9
IHZlcnRpY2FsU2Nyb2xsYmFyTW9kZSgpOworfQorCitQYXNzUmVmUHRyPFNjcm9sbGJhcj4gU2Ny
b2xsVmlldzo6Y3JlYXRlU2Nyb2xsYmFyKFNjcm9sbGJhck9yaWVudGF0aW9uIG9yaWVudGF0aW9u
KQoreworICAgIHJldHVybiBTY3JvbGxiYXI6OmNyZWF0ZU5hdGl2ZVNjcm9sbGJhcih0aGlzLCBv
cmllbnRhdGlvbiwgUmVndWxhclNjcm9sbGJhcik7Cit9CisKK2ludCBTY3JvbGxWaWV3OjpsYXlv
dXRXaWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZml4ZWRMYXlvdXRTaXplLmlzRW1wdHko
KSB8fCAhbV91c2VGaXhlZExheW91dCA/IHZpc2libGVXaWR0aCgpIDogbV9maXhlZExheW91dFNp
emUud2lkdGgoKTsKK30KKworaW50IFNjcm9sbFZpZXc6OmxheW91dEhlaWdodCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fZml4ZWRMYXlvdXRTaXplLmlzRW1wdHkoKSB8fCAhbV91c2VGaXhlZExh
eW91dCA/IHZpc2libGVIZWlnaHQoKSA6IG1fZml4ZWRMYXlvdXRTaXplLmhlaWdodCgpOworfQor
CitJbnRTaXplIFNjcm9sbFZpZXc6OmZpeGVkTGF5b3V0U2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fZml4ZWRMYXlvdXRTaXplOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNldEZpeGVkTGF5
b3V0U2l6ZShjb25zdCBJbnRTaXplJiBuZXdTaXplKQoreworICAgIGlmIChmaXhlZExheW91dFNp
emUoKSA9PSBuZXdTaXplKQorICAgICAgICByZXR1cm47CisgICAgbV9maXhlZExheW91dFNpemUg
PSBuZXdTaXplOworICAgIHVwZGF0ZVNjcm9sbGJhcnMoc2Nyb2xsT2Zmc2V0KCkpOworfQorCiti
b29sIFNjcm9sbFZpZXc6OnVzZUZpeGVkTGF5b3V0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV91
c2VGaXhlZExheW91dDsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRVc2VGaXhlZExheW91dChi
b29sIGVuYWJsZSkKK3sKKyAgICBpZiAodXNlRml4ZWRMYXlvdXQoKSA9PSBlbmFibGUpCisgICAg
ICAgIHJldHVybjsKKyAgICBtX3VzZUZpeGVkTGF5b3V0ID0gZW5hYmxlOworICAgIHVwZGF0ZVNj
cm9sbGJhcnMoc2Nyb2xsT2Zmc2V0KCkpOworfQorCitib29sIFNjcm9sbFZpZXc6OmlzT2Zmc2Ny
ZWVuKCkgY29uc3QKK3sKKyAgICByZXR1cm4gIWlzVmlzaWJsZSgpIHx8ICFJc1dpbmRvd1Zpc2li
bGUocGxhdGZvcm1XaWRnZXQoKSk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0U2Nyb2xsUG9z
aXRpb24oY29uc3QgSW50UG9pbnQmIHBvcykKK3sKKyAgICBzZXRDb250ZW50c1Bvcyhwb3MueCgp
LCBwb3MueSgpKTsKK30KKworYm9vbCBTY3JvbGxWaWV3Ojpjb250YWluc1Njcm9sbGJhcnNBdm9p
ZGluZ1Jlc2l6ZXIoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTY3Jv
bGxWaWV3OjpmbG93VGV4dFRvRml0KGNvbnN0IE5vZGUqIG5vZGUpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGhvc3RXaW5kb3coKSYmIGhvc3RXaW5kb3coKS0+Zmxvd1RleHRUb0ZpdChub2RlKTsKK30K
KworZmxvYXQgU2Nyb2xsVmlldzo6ZGVmYXVsdFNjYWxlKCkgY29uc3QKK3sKKyAgICByZXR1cm4g
aG9zdFdpbmRvdygpID8gaG9zdFdpbmRvdygpLT5kZWZhdWx0U2NhbGUoKSA6IDEuOworfQorCit2
b2lkIFNjcm9sbFZpZXc6OmFkanVzdFNjcm9sbGJhcnNBdm9pZGluZ1Jlc2l6ZXJDb3VudChpbnQg
b3ZlcmxhcERlbHRhKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK1Njcm9sbGJhciog
U2Nyb2xsVmlldzo6aG9yaXpvbnRhbFNjcm9sbGJhcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1f
ZGF0YS0+bV9oQmFyLmdldCgpOworfQorCitTY3JvbGxiYXIqIFNjcm9sbFZpZXc6OnZlcnRpY2Fs
U2Nyb2xsYmFyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX3ZCYXIuZ2V0KCk7Cit9
CisKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRm
b3JtL3dpbmNlL1Njcm9sbGJhclRoZW1lV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5j
ZS9TY3JvbGxiYXJUaGVtZVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwLi42NTNhZGUxCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9T
Y3JvbGxiYXJUaGVtZVdpbmNlLmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiU2Nyb2xsYmFyVGhlbWVXaW5jZS5oIgorCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50LmgiCisjaW5jbHVkZSAiU2Nyb2xsYmFy
LmgiCisjaW5jbHVkZSAiU29mdExpbmtpbmcuaCIKKworLy8gR2VuZXJpYyBzdGF0ZSBjb25zdGFu
dHMKKyNkZWZpbmUgVFNfTk9STUFMICAgIDEKKyNkZWZpbmUgVFNfSE9WRVIgICAgIDIKKyNkZWZp
bmUgVFNfQUNUSVZFICAgIDMKKyNkZWZpbmUgVFNfRElTQUJMRUQgIDQKKworI2RlZmluZSBTUF9C
VVRUT04gICAgICAgICAgMQorI2RlZmluZSBTUF9USFVNQkhPUiAgICAgICAgMgorI2RlZmluZSBT
UF9USFVNQlZFUlQgICAgICAgMworI2RlZmluZSBTUF9UUkFDS1NUQVJUSE9SICAgNAorI2RlZmlu
ZSBTUF9UUkFDS0VOREhPUiAgICAgNQorI2RlZmluZSBTUF9UUkFDS1NUQVJUVkVSVCAgNgorI2Rl
ZmluZSBTUF9UUkFDS0VORFZFUlQgICAgNworI2RlZmluZSBTUF9HUklQUEVSSE9SICAgICAgOAor
I2RlZmluZSBTUF9HUklQUEVSVkVSVCAgICAgOQorCisjZGVmaW5lIFRTX1VQX0JVVFRPTiAgICAg
ICAwCisjZGVmaW5lIFRTX0RPV05fQlVUVE9OICAgICA0CisjZGVmaW5lIFRTX0xFRlRfQlVUVE9O
ICAgICA4CisjZGVmaW5lIFRTX1JJR0hUX0JVVFRPTiAgICAxMgorI2RlZmluZSBUU19VUF9CVVRU
T05fSE9WRVIgICAxNworI2RlZmluZSBUU19ET1dOX0JVVFRPTl9IT1ZFUiAgMTgKKyNkZWZpbmUg
VFNfTEVGVF9CVVRUT05fSE9WRVIgIDE5CisjZGVmaW5lIFRTX1JJR0hUX0JVVFRPTl9IT1ZFUiAg
IDIwCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU2Ny
b2xsYmFyVGhlbWVXaW5jZTo6U2Nyb2xsYmFyVGhlbWVXaW5jZSgpCit7Cit9CisKK1Njcm9sbGJh
clRoZW1lV2luY2U6On5TY3JvbGxiYXJUaGVtZVdpbmNlKCkKK3sKK30KKworaW50IFNjcm9sbGJh
clRoZW1lV2luY2U6OnNjcm9sbGJhclRoaWNrbmVzcyhTY3JvbGxiYXJDb250cm9sU2l6ZSkKK3sK
KyAgICBzdGF0aWMgaW50IHRoaWNrbmVzczsKKyAgICBpZiAoIXRoaWNrbmVzcykKKyAgICAgICAg
dGhpY2tuZXNzID0gOjpHZXRTeXN0ZW1NZXRyaWNzKFNNX0NYVlNDUk9MTCk7CisgICAgcmV0dXJu
IHRoaWNrbmVzczsKK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZVdpbmNlOjp0aGVtZUNoYW5nZWQo
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK2Jvb2wgU2Nyb2xsYmFyVGhlbWVXaW5j
ZTo6aW52YWxpZGF0ZU9uTW91c2VFbnRlckV4aXQoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNjcm9sbGJhclRoZW1lV2luY2U6Omhhc1Ro
dW1iKFNjcm9sbGJhciogc2Nyb2xsYmFyKQoreworICAgIHJldHVybiB0aHVtYkxlbmd0aChzY3Jv
bGxiYXIpID4gMDsKK30KKworSW50UmVjdCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpiYWNrQnV0dG9u
UmVjdChTY3JvbGxiYXIqIHNjcm9sbGJhciwgU2Nyb2xsYmFyUGFydCBwYXJ0LCBib29sKQorewor
ICAgIC8vIFdpbmRvd3MganVzdCBoYXMgc2luZ2xlIGFycm93cy4KKyAgICBpZiAocGFydCA9PSBC
YWNrQnV0dG9uRW5kUGFydCkKKyAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKKworICAgIC8vIE91
ciBkZXNpcmVkIHJlY3QgaXMgZXNzZW50aWFsbHkgMTd4MTcuCisKKyAgICAvLyBPdXIgYWN0dWFs
IHJlY3Qgd2lsbCBzaHJpbmsgdG8gaGFsZiB0aGUgYXZhaWxhYmxlIHNwYWNlIHdoZW4KKyAgICAv
LyB3ZSBoYXZlIDwgMzQgcGl4ZWxzIGxlZnQuICBUaGlzIGFsbG93cyB0aGUgc2Nyb2xsYmFyCisg
ICAgLy8gdG8gc2NhbGUgZG93biBhbmQgZnVuY3Rpb24gZXZlbiBhdCB0aW55IHNpemVzLgorICAg
IGludCB0aGlja25lc3MgPSBzY3JvbGxiYXJUaGlja25lc3MoKTsKKyAgICBpZiAoc2Nyb2xsYmFy
LT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpCisgICAgICAgIHJldHVybiBJ
bnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgc2Nyb2xsYmFyLT53aWR0aCgpIDwgMiAqIHRoaWNrbmVzcyA/IHNjcm9sbGJhci0+d2lk
dGgoKSAvIDIgOiB0aGlja25lc3MsIHRoaWNrbmVzcyk7CisgICAgcmV0dXJuIEludFJlY3Qoc2Ny
b2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpLAorICAgICAgICAgICAgICAgICAgIHRoaWNrbmVz
cywgc2Nyb2xsYmFyLT5oZWlnaHQoKSA8IDIgKiB0aGlja25lc3MgPyBzY3JvbGxiYXItPmhlaWdo
dCgpIC8gMiA6IHRoaWNrbmVzcyk7Cit9CisKK0ludFJlY3QgU2Nyb2xsYmFyVGhlbWVXaW5jZTo6
Zm9yd2FyZEJ1dHRvblJlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIFNjcm9sbGJhclBhcnQgcGFy
dCwgYm9vbCkKK3sKKyAgICAvLyBXaW5kb3dzIGp1c3QgaGFzIHNpbmdsZSBhcnJvd3MuCisgICAg
aWYgKHBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydCkKKyAgICAgICAgcmV0dXJuIEludFJl
Y3QoKTsKKworICAgIC8vIE91ciBkZXNpcmVkIHJlY3QgaXMgZXNzZW50aWFsbHkgMTd4MTcuCisK
KyAgICAvLyBPdXIgYWN0dWFsIHJlY3Qgd2lsbCBzaHJpbmsgdG8gaGFsZiB0aGUgYXZhaWxhYmxl
IHNwYWNlIHdoZW4KKyAgICAvLyB3ZSBoYXZlIDwgMzQgcGl4ZWxzIGxlZnQuICBUaGlzIGFsbG93
cyB0aGUgc2Nyb2xsYmFyCisgICAgLy8gdG8gc2NhbGUgZG93biBhbmQgZnVuY3Rpb24gZXZlbiBh
dCB0aW55IHNpemVzLgorICAgIGludCB0aGlja25lc3MgPSBzY3JvbGxiYXJUaGlja25lc3MoKTsK
KyAgICBpZiAoc2Nyb2xsYmFyLT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIp
IHsKKyAgICAgICAgaW50IHcgPSBzY3JvbGxiYXItPndpZHRoKCkgPCAyICogdGhpY2tuZXNzID8g
c2Nyb2xsYmFyLT53aWR0aCgpIC8gMiA6IHRoaWNrbmVzczsKKyAgICAgICAgcmV0dXJuIEludFJl
Y3Qoc2Nyb2xsYmFyLT54KCkgKyBzY3JvbGxiYXItPndpZHRoKCkgLSB3LCBzY3JvbGxiYXItPnko
KSwgdywgdGhpY2tuZXNzKTsKKyAgICB9CisKKyAgICBpbnQgaCA9IHNjcm9sbGJhci0+aGVpZ2h0
KCkgPCAyICogdGhpY2tuZXNzID8gc2Nyb2xsYmFyLT5oZWlnaHQoKSAvIDIgOiB0aGlja25lc3M7
CisgICAgcmV0dXJuIEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpICsgc2Ny
b2xsYmFyLT5oZWlnaHQoKSAtIGgsIHRoaWNrbmVzcywgaCk7Cit9CisKK0ludFJlY3QgU2Nyb2xs
YmFyVGhlbWVXaW5jZTo6dHJhY2tSZWN0KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBib29sKQorewor
ICAgIGludCB0aGlja25lc3MgPSBzY3JvbGxiYXJUaGlja25lc3MoKTsKKyAgICBpZiAoc2Nyb2xs
YmFyLT5vcmllbnRhdGlvbigpID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaWYg
KHNjcm9sbGJhci0+d2lkdGgoKSA8IDIgKiB0aGlja25lc3MpCisgICAgICAgICAgICByZXR1cm4g
SW50UmVjdCgpOworICAgICAgICByZXR1cm4gSW50UmVjdChzY3JvbGxiYXItPngoKSArIHRoaWNr
bmVzcywgc2Nyb2xsYmFyLT55KCksIHNjcm9sbGJhci0+d2lkdGgoKSAtIDIgKiB0aGlja25lc3Ms
IHRoaWNrbmVzcyk7CisgICAgfQorICAgIGlmIChzY3JvbGxiYXItPmhlaWdodCgpIDwgMiAqIHRo
aWNrbmVzcykKKyAgICAgICAgcmV0dXJuIEludFJlY3QoKTsKKyAgICByZXR1cm4gSW50UmVjdChz
Y3JvbGxiYXItPngoKSwgc2Nyb2xsYmFyLT55KCkgKyB0aGlja25lc3MsIHRoaWNrbmVzcywgc2Ny
b2xsYmFyLT5oZWlnaHQoKSAtIDIgKiB0aGlja25lc3MpOworfQorCit2b2lkIFNjcm9sbGJhclRo
ZW1lV2luY2U6OnBhaW50VHJhY2tCYWNrZ3JvdW5kKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwg
U2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QpCit7Cit9CisKK3ZvaWQg
U2Nyb2xsYmFyVGhlbWVXaW5jZTo6cGFpbnRUcmFja1BpZWNlKEdyYXBoaWNzQ29udGV4dCogY29u
dGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QsIFNjcm9sbGJh
clBhcnQgcGFydFR5cGUpCit7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVXaW5jZTo6cGFpbnRC
dXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3JvbGxiYXIqIHNjcm9sbGJhciwgY29u
c3QgSW50UmVjdCYgcmVjdCwgU2Nyb2xsYmFyUGFydCBwYXJ0KQoreworfQorCitzdGF0aWMgSW50
UmVjdCBncmlwcGVyUmVjdChpbnQgdGhpY2tuZXNzLCBjb25zdCBJbnRSZWN0JiB0aHVtYlJlY3Qp
Cit7CisgICAgLy8gQ2VudGVyIGluIHRoZSB0aHVtYi4KKyAgICBpbnQgZ3JpcHBlclRoaWNrbmVz
cyA9IHRoaWNrbmVzcyAvIDI7CisgICAgcmV0dXJuIEludFJlY3QodGh1bWJSZWN0LngoKSArICh0
aHVtYlJlY3Qud2lkdGgoKSAtIGdyaXBwZXJUaGlja25lc3MpIC8gMiwKKyAgICAgICAgICAgICAg
ICAgICB0aHVtYlJlY3QueSgpICsgKHRodW1iUmVjdC5oZWlnaHQoKSAtIGdyaXBwZXJUaGlja25l
c3MpIC8gMiwKKyAgICAgICAgICAgICAgICAgICBncmlwcGVyVGhpY2tuZXNzLCBncmlwcGVyVGhp
Y2tuZXNzKTsKK30KKworc3RhdGljIHZvaWQgcGFpbnRHcmlwcGVyKFNjcm9sbGJhciogc2Nyb2xs
YmFyLCBIREMgaGRjLCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVXaW5jZTo6cGFpbnRUaHVtYihHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0
KQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK2Jvb2wgU2Nyb2xsYmFyVGhlbWVXaW5j
ZTo6c2hvdWxkQ2VudGVyT25UaHVtYihTY3JvbGxiYXIqLCBjb25zdCBQbGF0Zm9ybU1vdXNlRXZl
bnQmIGV2dCkKK3sKKyAgICByZXR1cm4gZXZ0LnNoaWZ0S2V5KCkgJiYgZXZ0LmJ1dHRvbigpID09
IExlZnRCdXR0b247Cit9CisKK1Njcm9sbGJhclRoZW1lKiBTY3JvbGxiYXJUaGVtZTo6bmF0aXZl
VGhlbWUoKQoreworICAgIHN0YXRpYyBTY3JvbGxiYXJUaGVtZVdpbmNlIHdpbmNlVGhlbWU7Cisg
ICAgcmV0dXJuICZ3aW5jZVRoZW1lOworfQorCit9CisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vd2luY2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5j
ZS9TY3JvbGxiYXJUaGVtZVdpbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uYjgzNzExOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Ny
b2xsYmFyVGhlbWVXaW5jZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBTY3JvbGxiYXJUaGVtZVdpbmNlX2gK
KyNkZWZpbmUgU2Nyb2xsYmFyVGhlbWVXaW5jZV9oCisKKyNpbmNsdWRlICJTY3JvbGxiYXJUaGVt
ZUNvbXBvc2l0ZS5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBTY3JvbGxi
YXJUaGVtZVdpbmNlIDogcHVibGljIFNjcm9sbGJhclRoZW1lQ29tcG9zaXRlIHsKKyAgICBwdWJs
aWM6CisgICAgICAgIFNjcm9sbGJhclRoZW1lV2luY2UoKTsKKyAgICAgICAgdmlydHVhbCB+U2Ny
b2xsYmFyVGhlbWVXaW5jZSgpOworCisgICAgICAgIHZpcnR1YWwgaW50IHNjcm9sbGJhclRoaWNr
bmVzcyhTY3JvbGxiYXJDb250cm9sU2l6ZSA9IFJlZ3VsYXJTY3JvbGxiYXIpOworCisgICAgICAg
IHZpcnR1YWwgdm9pZCB0aGVtZUNoYW5nZWQoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaW52
YWxpZGF0ZU9uTW91c2VFbnRlckV4aXQoKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdmly
dHVhbCBib29sIGhhc0J1dHRvbnMoU2Nyb2xsYmFyKikgeyByZXR1cm4gdHJ1ZTsgfQorICAgICAg
ICB2aXJ0dWFsIGJvb2wgaGFzVGh1bWIoU2Nyb2xsYmFyKik7CisKKyAgICAgICAgdmlydHVhbCBJ
bnRSZWN0IGJhY2tCdXR0b25SZWN0KFNjcm9sbGJhciosIFNjcm9sbGJhclBhcnQsIGJvb2wgcGFp
bnRpbmcgPSBmYWxzZSk7CisgICAgICAgIHZpcnR1YWwgSW50UmVjdCBmb3J3YXJkQnV0dG9uUmVj
dChTY3JvbGxiYXIqLCBTY3JvbGxiYXJQYXJ0LCBib29sIHBhaW50aW5nID0gZmFsc2UpOworICAg
ICAgICB2aXJ0dWFsIEludFJlY3QgdHJhY2tSZWN0KFNjcm9sbGJhciosIGJvb2wgcGFpbnRpbmcg
PSBmYWxzZSk7CisKKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZENlbnRlck9uVGh1bWIoU2Ny
b2xsYmFyKiwgY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisKKyAgICAgICAgdmlydHVhbCB2
b2lkIHBhaW50VHJhY2tCYWNrZ3JvdW5kKEdyYXBoaWNzQ29udGV4dCosIFNjcm9sbGJhciosIGNv
bnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHBhaW50VHJhY2tQaWVjZShHcmFw
aGljc0NvbnRleHQqLCBTY3JvbGxiYXIqLCBjb25zdCBJbnRSZWN0JiwgU2Nyb2xsYmFyUGFydCk7
CisgICAgICAgIHZpcnR1YWwgdm9pZCBwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqLCBTY3Jv
bGxiYXIqLCBjb25zdCBJbnRSZWN0JiwgU2Nyb2xsYmFyUGFydCk7CisgICAgICAgIHZpcnR1YWwg
dm9pZCBwYWludFRodW1iKEdyYXBoaWNzQ29udGV4dCosIFNjcm9sbGJhciosIGNvbnN0IEludFJl
Y3QmKTsKKyAgICB9OworCit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
d2luY2UvV2lkZ2V0V2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9XaWRnZXRXaW5j
ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwNjk1NwotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvV2lkZ2V0V2luY2UuY3BwCkBAIC0w
LDAgKzEsMjY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVG9yY2ggTW9iaWxl
LCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJXaWRnZXQuaCIK
KworI2luY2x1ZGUgIkN1cnNvci5oIgorI2luY2x1ZGUgIkRvY3VtZW50LmgiCisjaW5jbHVkZSAi
RWxlbWVudC5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIkdyYXBoaWNzQ29u
dGV4dC5oIgorI2luY2x1ZGUgIkhvc3RXaW5kb3cuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisj
aW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCit2b2lkIFdpZGdldDo6aW5pdChQbGF0Zm9ybVdpZGdldCB3aWRnZXQpCit7CisgICAg
bV9wYXJlbnQgPSAwOworICAgIG1fc2VsZlZpc2libGUgPSBmYWxzZTsKKyAgICBtX3BhcmVudFZp
c2libGUgPSBmYWxzZTsKKyAgICBtX3dpZGdldCA9IHdpZGdldDsKKyAgICBpZiAobV93aWRnZXQp
CisgICAgICAgIHJldGFpblBsYXRmb3JtV2lkZ2V0KCk7Cit9CisKK3ZvaWQgV2lkZ2V0OjpzZXRQ
YXJlbnQoU2Nyb2xsVmlldyogdmlldykKK3sKKyAgICBBU1NFUlQoIXZpZXcgfHwgIW1fcGFyZW50
KTsKKyAgICBpZiAoIXZpZXcgfHwgIXZpZXctPmlzVmlzaWJsZSgpKQorICAgICAgICBzZXRQYXJl
bnRWaXNpYmxlKGZhbHNlKTsKKyAgICBtX3BhcmVudCA9IHZpZXc7CisgICAgaWYgKHZpZXcgJiYg
dmlldy0+aXNWaXNpYmxlKCkpCisgICAgICAgIHNldFBhcmVudFZpc2libGUodHJ1ZSk7Cit9CisK
K1Njcm9sbFZpZXcqIFdpZGdldDo6cm9vdCgpIGNvbnN0Cit7CisgICAgY29uc3QgV2lkZ2V0KiB0
b3AgPSB0aGlzOworICAgIHdoaWxlICh0b3AtPnBhcmVudCgpKQorICAgICAgICB0b3AgPSB0b3At
PnBhcmVudCgpOworICAgIGlmICh0b3AtPmlzRnJhbWVWaWV3KCkpCisgICAgICAgIHJldHVybiBj
b25zdF9jYXN0PFNjcm9sbFZpZXcqPihzdGF0aWNfY2FzdDxjb25zdCBTY3JvbGxWaWV3Kj4odG9w
KSk7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgV2lkZ2V0OjpyZW1vdmVGcm9tUGFyZW50KCkK
K3sKKyAgICBpZiAocGFyZW50KCkpCisgICAgICAgIHBhcmVudCgpLT5yZW1vdmVDaGlsZCh0aGlz
KTsKK30KKworCit2b2lkIFdpZGdldDo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50
UmVjdCYpCit7Cit9CisKK3ZvaWQgV2lkZ2V0OjpzZXRGb2N1cygpCit7Cit9CisKK3ZvaWQgV2lk
Z2V0OjpzZXRJc1NlbGVjdGVkKGJvb2wpCit7Cit9CisKK0ludFJlY3QgV2lkZ2V0OjpmcmFtZVJl
Y3QoKSBjb25zdAoreworICAgIHJldHVybiBtX2ZyYW1lOworfQorCit2b2lkIFdpZGdldDo6c2V0
RnJhbWVSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgbV9mcmFtZSA9IHJlY3Q7Cit9
CisKK1dpZGdldDo6V2lkZ2V0KFBsYXRmb3JtV2lkZ2V0IHdpZGdldCkKK3sKKyAgICBpbml0KHdp
ZGdldCk7Cit9CisKK3ZvaWQgV2lkZ2V0OjpyZWxlYXNlUGxhdGZvcm1XaWRnZXQoKQoreworfQor
Cit2b2lkIFdpZGdldDo6cmV0YWluUGxhdGZvcm1XaWRnZXQoKQoreworfQorCitXaWRnZXQ6On5X
aWRnZXQoKQoreworICAgIEFTU0VSVCghcGFyZW50KCkpOworfQorCit2b2lkIFdpZGdldDo6c2hv
dygpCit7Cit9CisKK3ZvaWQgV2lkZ2V0OjpoaWRlKCkKK3sKK30KKwordm9pZCBXaWRnZXQ6OnNl
dEN1cnNvcihjb25zdCBDdXJzb3ImIGN1cnNvcikKK3sKKyAgICBTY3JvbGxWaWV3KiB2aWV3ID0g
cm9vdCgpOworICAgIGlmICh2aWV3ICYmIHZpZXctPmlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAg
aWYgKEZyYW1lKiBmcmFtZSA9IHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KHZpZXcpLT5mcmFtZSgp
KSB7CisgICAgICAgICAgICBpZiAoUGFnZSogcGFnZSA9IGZyYW1lLT5wYWdlKCkpCisgICAgICAg
ICAgICAgICAgcGFnZS0+Y2hyb21lKCktPnNldEN1cnNvcihjdXJzb3IuaW1wbCgpKTsKKyAgICAg
ICAgfQorICAgIH0KK30KKworSW50UG9pbnQgV2lkZ2V0Ojpjb252ZXJ0VG9Db250YWluaW5nV2lu
ZG93KGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICAvLyBjYWxsZWQgYnkgU2Ny
b2xsVmlldyBvciBQbGF0Zm9ybVNjcm9sbEJhci4KKyAgICBpZiAoaXNGcmFtZVZpZXcoKSkgewor
ICAgICAgICBjb25zdCBTY3JvbGxWaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVW
aWV3Kj4odGhpcyk7CisgICAgICAgIHJldHVybiB2aWV3LT5jb250ZW50c1RvV2luZG93KHBvaW50
ICsgdmlldy0+c2Nyb2xsT2Zmc2V0KCkpOworICAgIH0gZWxzZSBpZiAocGFyZW50KCkpCisgICAg
ICAgIHJldHVybiBwYXJlbnQoKS0+Y29udGVudHNUb1dpbmRvdyhwb2ludCArIEludFNpemUoeCgp
LCB5KCkpICsgcGFyZW50KCktPnNjcm9sbE9mZnNldCgpKTsKKworICAgIHJldHVybiBwb2ludDsK
K30KKworSW50UmVjdCBXaWRnZXQ6OmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3coY29uc3QgSW50
UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICAvLyBjYWxsZWQgYnkgU2Nyb2xsVmlldyBvciBQbGF0
Zm9ybVNjcm9sbEJhci4KKyAgICBpZiAoaXNGcmFtZVZpZXcoKSkgeworICAgICAgICBjb25zdCBT
Y3JvbGxWaWV3KiB2aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7Cisg
ICAgICAgIHJldHVybiB2aWV3LT5jb250ZW50c1RvV2luZG93KEludFJlY3QocmVjdC5sb2NhdGlv
bigpICsgdmlldy0+c2Nyb2xsT2Zmc2V0KCksIHJlY3Quc2l6ZSgpKSk7CisgICAgfSBlbHNlIGlm
IChwYXJlbnQoKSkgeworICAgICAgICBJbnRQb2ludCBjb250ZW50c1BvaW50ID0gcmVjdC5sb2Nh
dGlvbigpICsgSW50U2l6ZSh4KCksIHkoKSk7CisgICAgICAgIHJldHVybiBwYXJlbnQoKS0+Y29u
dGVudHNUb1dpbmRvdyhJbnRSZWN0KGlzVmlld1Njcm9sbGJhcigpID8gY29udGVudHNQb2ludCAr
IHBhcmVudCgpLT5zY3JvbGxPZmZzZXQoKSA6IGNvbnRlbnRzUG9pbnQKKyAgICAgICAgICAgICwg
cmVjdC5zaXplKCkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVjdDsKK30KKworSW50UG9pbnQg
V2lkZ2V0Ojpjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coY29uc3QgSW50UG9pbnQmIHBvaW50
KSBjb25zdAoreworICAgICAvLyBjYWxsZWQgYnkgU2Nyb2xsVmlldyBvciBQbGF0Zm9ybVNjcm9s
bEJhci4KKyAgICBpZiAoaXNGcmFtZVZpZXcoKSkgeworICAgICAgICBjb25zdCBTY3JvbGxWaWV3
KiB2aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgICAgIHJl
dHVybiB2aWV3LT53aW5kb3dUb0NvbnRlbnRzKHBvaW50KSAtIHZpZXctPnNjcm9sbE9mZnNldCgp
OworICAgIH0gZWxzZSBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgSW50UG9pbnQgcnRuID0gcGFy
ZW50KCktPndpbmRvd1RvQ29udGVudHMocG9pbnQpIC0gSW50U2l6ZSh4KCksIHkoKSk7CisgICAg
ICAgIHJldHVybiBpc1ZpZXdTY3JvbGxiYXIoKSA/IHJ0biAtIHBhcmVudCgpLT5zY3JvbGxPZmZz
ZXQoKSA6IHJ0bjsKKyAgICB9CisKKyAgICByZXR1cm4gcG9pbnQ7Cit9CisKK0ludFJlY3QgV2lk
Z2V0Ojpjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coY29uc3QgSW50UmVjdCYgcmVjdCkgY29u
c3QKK3sKKyAgICAgLy8gY2FsbGVkIGJ5IFNjcm9sbFZpZXcgb3IgUGxhdGZvcm1TY3JvbGxCYXIu
CisgICAgaWYgKGlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgY29uc3QgU2Nyb2xsVmlldyogdmll
dyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAgICAgICBJbnRSZWN0
IHJ0biA9IHZpZXctPndpbmRvd1RvQ29udGVudHMocmVjdCk7CisgICAgICAgIHJ0bi5tb3ZlKC12
aWV3LT5zY3JvbGxPZmZzZXQoKSk7CisgICAgICAgIHJldHVybiBydG47CisgICAgfSBlbHNlIGlm
IChwYXJlbnQoKSkgeworICAgICAgICBJbnRSZWN0IHJ0biA9IHBhcmVudCgpLT53aW5kb3dUb0Nv
bnRlbnRzKHJlY3QpOworICAgICAgICBydG4ubW92ZShJbnRTaXplKC14KCksIC15KCkpKTsKKyAg
ICAgICAgaWYgKGlzVmlld1Njcm9sbGJhcigpKQorICAgICAgICAgICAgcnRuLm1vdmUoLXBhcmVu
dCgpLT5zY3JvbGxPZmZzZXQoKSk7CisKKyAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICB9CisKKyAg
ICByZXR1cm4gcmVjdDsKK30KKworCitJbnRQb2ludCBXaWRnZXQ6OmNvbnZlcnRDaGlsZFRvU2Vs
Zihjb25zdCBXaWRnZXQqIGNoaWxkLCBjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIEludFBvaW50KHBvaW50LngoKSArIGNoaWxkLT54KCksIHBvaW50LnkoKSArIGNo
aWxkLT55KCkpOworfQorCitJbnRQb2ludCBXaWRnZXQ6OmNvbnZlcnRTZWxmVG9DaGlsZChjb25z
dCBXaWRnZXQqIGNoaWxkLCBjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgcmV0
dXJuIEludFBvaW50KHBvaW50LngoKSAtIGNoaWxkLT54KCksIHBvaW50LnkoKSAtIGNoaWxkLT55
KCkpOworfQorCit2b2lkIFdpZGdldDo6aW52YWxpZGF0ZVJlY3QoY29uc3QgSW50UmVjdCYgcikK
K3sKKyAgICBTY3JvbGxWaWV3KiBvdXRlcm1vc3RWaWV3ID0gcGFyZW50KCk7CisgICAgaWYgKG91
dGVybW9zdFZpZXcpIHsKKyAgICAgICAgd2hpbGUgKG91dGVybW9zdFZpZXctPnBhcmVudCgpKQor
ICAgICAgICAgICAgb3V0ZXJtb3N0VmlldyA9IG91dGVybW9zdFZpZXctPnBhcmVudCgpOworICAg
IH0gZWxzZSBpZiAoaXNGcmFtZVZpZXcoKSkKKyAgICAgICAgb3V0ZXJtb3N0VmlldyA9IHN0YXRp
Y19jYXN0PEZyYW1lVmlldyo+KHRoaXMpOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKCFvdXRlcm1vc3RWaWV3LT5pc1Zpc2libGUoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgSW50UmVjdCByZWN0ID0gY29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhyKTsKKyAgICBvdXRl
cm1vc3RWaWV3LT5ob3N0V2luZG93KCktPnJlcGFpbnQoc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
b3V0ZXJtb3N0VmlldyktPmZyYW1lKCksIHJlY3QsIHNob3VsZFVwZGF0ZUJhY2tpbmdTdG9yZSgp
LCBpc1Njcm9sbGJhcigpKTsKK30KKworSW50UmVjdCBXaWRnZXQ6OmNvbnZlcnRUb0NvbnRhaW5p
bmdWaWV3KGNvbnN0IEludFJlY3QmIGxvY2FsUmVjdCkgY29uc3QKK3sKKyAgICBpZiAoY29uc3Qg
U2Nyb2xsVmlldyogcGFyZW50U2Nyb2xsVmlldyA9IHBhcmVudCgpKSB7CisgICAgICAgIEludFJl
Y3QgcGFyZW50UmVjdChsb2NhbFJlY3QpOworICAgICAgICBwYXJlbnRSZWN0LnNldExvY2F0aW9u
KHBhcmVudFNjcm9sbFZpZXctPmNvbnZlcnRDaGlsZFRvU2VsZih0aGlzLCBsb2NhbFJlY3QubG9j
YXRpb24oKSkpOworICAgICAgICByZXR1cm4gcGFyZW50UmVjdDsKKyAgICB9CisgICAgcmV0dXJu
IGxvY2FsUmVjdDsKK30KKworSW50UmVjdCBXaWRnZXQ6OmNvbnZlcnRGcm9tQ29udGFpbmluZ1Zp
ZXcoY29uc3QgSW50UmVjdCYgcGFyZW50UmVjdCkgY29uc3QKK3sKKyAgICBpZiAoY29uc3QgU2Ny
b2xsVmlldyogcGFyZW50U2Nyb2xsVmlldyA9IHBhcmVudCgpKSB7CisgICAgICAgIEludFJlY3Qg
bG9jYWxSZWN0ID0gcGFyZW50UmVjdDsKKyAgICAgICAgbG9jYWxSZWN0LnNldExvY2F0aW9uKHBh
cmVudFNjcm9sbFZpZXctPmNvbnZlcnRTZWxmVG9DaGlsZCh0aGlzLCBsb2NhbFJlY3QubG9jYXRp
b24oKSkpOworICAgICAgICByZXR1cm4gbG9jYWxSZWN0OworICAgIH0KKworICAgIHJldHVybiBw
YXJlbnRSZWN0OworfQorCitJbnRQb2ludCBXaWRnZXQ6OmNvbnZlcnRUb0NvbnRhaW5pbmdWaWV3
KGNvbnN0IEludFBvaW50JiBsb2NhbFBvaW50KSBjb25zdAoreworICAgIGlmIChjb25zdCBTY3Jv
bGxWaWV3KiBwYXJlbnRTY3JvbGxWaWV3ID0gcGFyZW50KCkpCisgICAgICAgIHJldHVybiBwYXJl
bnRTY3JvbGxWaWV3LT5jb252ZXJ0Q2hpbGRUb1NlbGYodGhpcywgbG9jYWxQb2ludCk7CisKKyAg
ICByZXR1cm4gbG9jYWxQb2ludDsKK30KKworSW50UG9pbnQgV2lkZ2V0Ojpjb252ZXJ0RnJvbUNv
bnRhaW5pbmdWaWV3KGNvbnN0IEludFBvaW50JiBwYXJlbnRQb2ludCkgY29uc3QKK3sKKyAgICBp
ZiAoY29uc3QgU2Nyb2xsVmlldyogcGFyZW50U2Nyb2xsVmlldyA9IHBhcmVudCgpKQorICAgICAg
ICByZXR1cm4gcGFyZW50U2Nyb2xsVmlldy0+Y29udmVydFNlbGZUb0NoaWxkKHRoaXMsIHBhcmVu
dFBvaW50KTsKKworICAgIHJldHVybiBwYXJlbnRQb2ludDsKK30KK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUK
</data>
<flag name="review"
          id="17587"
          type_id="1"
          status="-"
          setter="staikos"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33823</attachid>
            <date>2009-07-30 13:29:24 -0700</date>
            <delta_ts>2009-08-08 10:47:36 -0700</delta_ts>
            <desc>1) Clipboard</desc>
            <filename>27543_1.patch</filename>
            <type>text/plain</type>
            <size>19175</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
N2JmYzY5YS4uNTg4MmUzZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSw0MSBAQAorMjAwOS0wNy0yMiAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0y
NzU0MworICAgICAgICBBZGQgc29tZSBXaW5DRSBwb3J0IGZpbGVzIHRvIHBsYXRmb3JtL3dpbmNl
CisKKyAgICAgICAgV3JpdHRlbiBieSBZb25nIExpIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4s
IEx5b24gQ2hlbiA8bHlvbi5jaGVuQHRvcmNobW9iaWxlLmNvbT4KKyAgICAgICAgYW5kIEpvZSBN
YXNvbiA8am9lLm1hc29uQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZv
cm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93
aW5jZS9DbGlwYm9hcmRXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9D
b250ZXh0TWVudUl0ZW1XaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNl
L0NvbnRleHRNZW51V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9D
dXJzb3JXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0RyYWdEYXRh
V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5j
ZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcDog
QWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5jZS5jcHA6IEFk
ZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHA6IEFkZGVkLgorICAgICAg
ICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICog
cGxhdGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmNwcDogQWRkZWQuCisgICAgICAgICogcGxh
dGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmg6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3Jt
L3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9y
bS93aW5jZS9QbGF0Zm9ybVNjcm9sbGJhci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93
aW5jZS9TY3JvbGxWaWV3V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5j
ZS9TY3JvbGxiYXJUaGVtZVdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2lu
Y2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5j
ZS9TZWFyY2hQb3B1cE1lbnVXaW5jZS5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dp
bmNlL1NoYXJlZEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1No
YXJlZFRpbWVyV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TeXN0
ZW1UaW1lV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9XaWRnZXRX
aW5jZS5jcHA6IEFkZGVkLgorCiAyMDA5LTA3LTIxICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1v
YmlsZS5jb20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZICAoT09QUyEpLgpkaWZmIC0t
Z2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5jZS5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2MxMmIxCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5jZS5jcHAKQEAg
LTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ2xp
cGJvYXJkVXRpbGl0aWVzV2luLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAi
RG9jdW1lbnRGcmFnbWVudC5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bVN0cmluZy5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1ZGUgIm1hcmt1cC5o
IgorI2luY2x1ZGUgPHNobHdhcGkuaD4KKyNpbmNsdWRlIDx3aW5pbmV0Lmg+ICAgIC8vIGZvciBJ
TlRFUk5FVF9NQVhfVVJMX0xFTkdUSAorCit0eXBlZGVmIEhBTkRMRSBIRFJPUDsKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitzdGF0aWMgYm9vbCBnZXRXZWJMb2NEYXRhKElEYXRhT2JqZWN0KiBk
YXRhT2JqZWN0LCBTdHJpbmcmIHVybCwgU3RyaW5nKiB0aXRsZSkKK3sKKyAgICByZXR1cm4gZmFs
c2U7Cit9CisKK3N0YXRpYyBTdHJpbmcgZXh0cmFjdFVSTChjb25zdCBTdHJpbmcgJmluVVJMLCBT
dHJpbmcqIHRpdGxlKQoreworICAgIFN0cmluZyB1cmwgPSBpblVSTDsKKyAgICBpbnQgc3BsaXRM
b2MgPSB1cmwuZmluZCgnXG4nKTsKKyAgICBpZiAoc3BsaXRMb2MgPiAwKSB7CisgICAgICAgIGlm
ICh0aXRsZSkKKyAgICAgICAgICAgICp0aXRsZSA9IHVybC5zdWJzdHJpbmcoc3BsaXRMb2MgKyAx
KTsKKyAgICAgICAgdXJsLnRydW5jYXRlKHNwbGl0TG9jKTsKKyAgICB9IGVsc2UgaWYgKHRpdGxl
KQorICAgICAgICAqdGl0bGUgPSB1cmw7CisgICAgcmV0dXJuIHVybDsKK30KKworLy9GaXJlZm94
IHRleHQvaHRtbAorc3RhdGljIEZPUk1BVEVUQyogdGV4dEh0bWxGb3JtYXQoKQoreworICAgIHN0
YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJ0ZXh0L2h0bWwiKTsKKyAg
ICBzdGF0aWMgRk9STUFURVRDIHRleHRIdG1sRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05U
RU5ULCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ0ZXh0SHRtbEZvcm1hdDsKK30K
KworSEdMT0JBTCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5n
JiB0aXRsZSkKK3sKKyAgICBTdHJpbmcgbXV0YWJsZVVSTCh1cmwuc3RyaW5nKCkpOworICAgIFN0
cmluZyBtdXRhYmxlVGl0bGUodGl0bGUpOworICAgIFNJWkVfVCBzaXplID0gbXV0YWJsZVVSTC5s
ZW5ndGgoKSArIG11dGFibGVUaXRsZS5sZW5ndGgoKSArIDI7ICAvLyArMSBmb3IgIlxuIiBhbmQg
KzEgZm9yIG51bGwgdGVybWluYXRvcgorICAgIEhHTE9CQUwgY2JEYXRhID0gR2xvYmFsQWxsb2Mo
R1BUUiwgc2l6ZSAqIHNpemVvZihVQ2hhcikpOworCisgICAgaWYgKGNiRGF0YSkgeworICAgICAg
ICBQV1NUUiBidWZmZXIgPSAoUFdTVFIpR2xvYmFsTG9jayhjYkRhdGEpOworICAgICAgICBfc253
cHJpbnRmKGJ1ZmZlciwgc2l6ZSwgTCIlc1xuJXMiLCBtdXRhYmxlVVJMLmNoYXJhY3RlcnNXaXRo
TnVsbFRlcm1pbmF0aW9uKCksIG11dGFibGVUaXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5h
dGlvbigpKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgfQorICAgIHJldHVy
biBjYkRhdGE7Cit9CisKK0hHTE9CQUwgY3JlYXRlR2xvYmFsRGF0YShjb25zdCBTdHJpbmcmIHN0
cikKK3sKKyAgICBIR0xPQkFMIGdsb2JhbERhdGEgPSA6Okdsb2JhbEFsbG9jKEdQVFIsIChzdHIu
bGVuZ3RoKCkgKyAxKSAqIHNpemVvZihVQ2hhcikpOworICAgIGlmICghZ2xvYmFsRGF0YSkKKyAg
ICAgICAgcmV0dXJuIDA7CisgICAgVUNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PFVDaGFyKj4o
R2xvYmFsTG9jayhnbG9iYWxEYXRhKSk7CisgICAgbWVtY3B5KGJ1ZmZlciwgc3RyLmNoYXJhY3Rl
cnMoKSwgc3RyLmxlbmd0aCgpICogc2l6ZW9mKFVDaGFyKSk7CisgICAgYnVmZmVyW3N0ci5sZW5n
dGgoKV0gPSAwOworICAgIEdsb2JhbFVubG9jayhnbG9iYWxEYXRhKTsKKyAgICByZXR1cm4gZ2xv
YmFsRGF0YTsKK30KKworSEdMT0JBTCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IFZlY3RvcjxjaGFy
PiYgdmVjdG9yKQoreworICAgIEhHTE9CQUwgZ2xvYmFsRGF0YSA9IEdsb2JhbEFsbG9jKEdQVFIs
IHZlY3Rvci5zaXplKCkgKyAxKTsKKyAgICBpZiAoIWdsb2JhbERhdGEpCisgICAgICAgIHJldHVy
biAwOworICAgIGNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPihHbG9iYWxMb2NrKGds
b2JhbERhdGEpKTsKKyAgICBtZW1jcHkoYnVmZmVyLCB2ZWN0b3IuZGF0YSgpLCB2ZWN0b3Iuc2l6
ZSgpKTsKKyAgICBidWZmZXJbdmVjdG9yLnNpemUoKV0gPSAwOworICAgIEdsb2JhbFVubG9jayhn
bG9iYWxEYXRhKTsKKyAgICByZXR1cm4gZ2xvYmFsRGF0YTsKK30KKworc3RhdGljIHZvaWQgYXBw
ZW5kKFZlY3RvcjxjaGFyPiYgdmVjdG9yLCBjb25zdCBjaGFyKiBzdHJpbmcpCit7CisgICAgdmVj
dG9yLmFwcGVuZChzdHJpbmcsIHN0cmxlbihzdHJpbmcpKTsKK30KKworc3RhdGljIHZvaWQgYXBw
ZW5kKFZlY3RvcjxjaGFyPiYgdmVjdG9yLCBjb25zdCBDU3RyaW5nJiBzdHJpbmcpCit7CisgICAg
dmVjdG9yLmFwcGVuZChzdHJpbmcuZGF0YSgpLCBzdHJpbmcubGVuZ3RoKCkpOworfQorCisvLyBE
b2N1bWVudGF0aW9uIGZvciB0aGUgQ0ZfSFRNTCBmb3JtYXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6
Ly9tc2RuLm1pY3Jvc29mdC5jb20vd29ya3Nob3AvbmV0d29ya2luZy9jbGlwYm9hcmQvaHRtbGNs
aXBib2FyZC5hc3AKK3ZvaWQgbWFya3VwVG9DRl9IVE1MKGNvbnN0IFN0cmluZyYgbWFya3VwLCBj
b25zdCBTdHJpbmcmIHNyY1VSTCwgVmVjdG9yPGNoYXI+JiByZXN1bHQpCit7CisgICAgaWYgKCFt
YXJrdXAubGVuZ3RoKCkpCisgICAgICAgIHJldHVybjsKKworICAgIENTdHJpbmcgY2ZfaHRtbCA9
ICJWZXJzaW9uOjAuOSI7CisgICAgQ1N0cmluZyBzdGFydEhUTUwgPSAiXG5TdGFydEhUTUw6IjsK
KyAgICBDU3RyaW5nIGVuZEhUTUwgPSAiXG5FbmRIVE1MOiI7CisgICAgQ1N0cmluZyBzdGFydEZy
YWdtZW50ID0gIlxuU3RhcnRGcmFnbWVudDoiOworICAgIENTdHJpbmcgZW5kRnJhZ21lbnQgPSAi
XG5FbmRGcmFnbWVudDoiOworICAgIENTdHJpbmcgc291cmNlVVJMID0gIlxuU291cmNlVVJMOiI7
CisKKyAgICBhcHBlbmQocmVzdWx0LCBjZl9odG1sKTsKKworICAgIGJvb2wgc2hvdWxkRmlsbFNv
dXJjZVVSTCA9ICFzcmNVUkwuaXNFbXB0eSgpICYmIChzcmNVUkwgIT0gImFib3V0OmJsYW5rIik7
CisKKyAgICBDU3RyaW5nIHN0YXJ0TWFya3VwID0gIlxuPEhUTUw+XG48Qk9EWT5cbjwhLS1TdGFy
dEZyYWdtZW50LS0+XG4iOworICAgIENTdHJpbmcgZW5kTWFya3VwID0gIlxuPCEtLUVuZEZyYWdt
ZW50LS0+XG48L0JPRFk+XG48L0hUTUw+IjsKKworICAgIC8vIGNhbGN1bGF0ZSBvZmZzZXRzCisg
ICAgY29uc3QgdW5zaWduZWQgVUlOVF9NQVhkaWdpdHMgPSAxMDsgLy8gbnVtYmVyIG9mIGRpZ2l0
cyBpbiBVSU5UX01BWCBpbiBiYXNlIDEwCisgICAgdW5zaWduZWQgc3RhcnRIVE1MT2Zmc2V0ID0g
Y2ZfaHRtbC5sZW5ndGgoKSArIHN0YXJ0SFRNTC5sZW5ndGgoKSArIGVuZEhUTUwubGVuZ3RoKCkg
KyBzdGFydEZyYWdtZW50Lmxlbmd0aCgpICsgZW5kRnJhZ21lbnQubGVuZ3RoKCkgKyAoc2hvdWxk
RmlsbFNvdXJjZVVSTCA/IHNvdXJjZVVSTC5sZW5ndGgoKSArIHNyY1VSTC5sZW5ndGgoKSA6IDAp
ICsgKDQgKiBVSU5UX01BWGRpZ2l0cyk7CisgICAgdW5zaWduZWQgc3RhcnRGcmFnbWVudE9mZnNl
dCA9IHN0YXJ0SFRNTE9mZnNldCArIHN0YXJ0TWFya3VwLmxlbmd0aCgpOworICAgIENTdHJpbmcg
bWFya3VwVVRGOCA9IG1hcmt1cC51dGY4KCk7CisgICAgdW5zaWduZWQgZW5kRnJhZ21lbnRPZmZz
ZXQgPSBzdGFydEZyYWdtZW50T2Zmc2V0ICsgbWFya3VwVVRGOC5sZW5ndGgoKTsKKyAgICB1bnNp
Z25lZCBlbmRIVE1MT2Zmc2V0ID0gZW5kRnJhZ21lbnRPZmZzZXQgKyBlbmRNYXJrdXAubGVuZ3Ro
KCk7CisKKyAgICAvLyBjcmVhdGUgZnVsbCByZXN1bHQgc3RyaW5nIGZyb20gdGhlIGZyYWdtZW50
cworICAgIGFwcGVuZChyZXN1bHQsIHN0YXJ0SFRNTCk7CisgICAgYXBwZW5kKHJlc3VsdCwgU3Ry
aW5nOjpmb3JtYXQoIiUwMTB1Iiwgc3RhcnRIVE1MT2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAg
ICBhcHBlbmQocmVzdWx0LCBlbmRIVE1MKTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZv
cm1hdCgiJTAxMHUiLCBlbmRIVE1MT2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAgICBhcHBlbmQo
cmVzdWx0LCBzdGFydEZyYWdtZW50KTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZvcm1h
dCgiJTAxMHUiLCBzdGFydEZyYWdtZW50T2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAgICBhcHBl
bmQocmVzdWx0LCBlbmRGcmFnbWVudCk7CisgICAgYXBwZW5kKHJlc3VsdCwgU3RyaW5nOjpmb3Jt
YXQoIiUwMTB1IiwgZW5kRnJhZ21lbnRPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGlmIChz
aG91bGRGaWxsU291cmNlVVJMKSB7CisgICAgICAgIGFwcGVuZChyZXN1bHQsIHNvdXJjZVVSTCk7
CisgICAgICAgIGFwcGVuZChyZXN1bHQsIHNyY1VSTC51dGY4KCkuZGF0YSgpKTsKKyAgICB9Cisg
ICAgYXBwZW5kKHJlc3VsdCwgc3RhcnRNYXJrdXApOworICAgIGFwcGVuZChyZXN1bHQsIG1hcmt1
cFVURjguZGF0YSgpKTsKKyAgICBhcHBlbmQocmVzdWx0LCBlbmRNYXJrdXApOworfQorCitTdHJp
bmcgdXJsVG9NYXJrdXAoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlKQorewor
ICAgIFN0cmluZyBtYXJrdXAoIjxhIGhyZWY9XCIiKTsKKyAgICBtYXJrdXAuYXBwZW5kKHVybC5z
dHJpbmcoKSk7CisgICAgbWFya3VwLmFwcGVuZCgiXCI+Iik7CisgICAgbWFya3VwLmFwcGVuZCh0
aXRsZSk7CisgICAgbWFya3VwLmFwcGVuZCgiPC9hPiIpOworICAgIHJldHVybiBtYXJrdXA7Cit9
CisKK3ZvaWQgcmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKFN0cmluZyYg
c3RyKQoreworICAgIHN0YXRpYyBjb25zdCBVQ2hhciBOZXdsaW5lID0gJ1xuJzsKKyAgICBzdGF0
aWMgY29uc3QgU3RyaW5nIFdpbmRvd3NOZXdsaW5lKCJcclxuIik7CisgICAgc3RyLnJlcGxhY2Uo
TmV3bGluZSwgV2luZG93c05ld2xpbmUpOworfQorCit2b2lkIHJlcGxhY2VOQlNQV2l0aFNwYWNl
KFN0cmluZyYgc3RyKQoreworICAgIHN0YXRpYyBjb25zdCBVQ2hhciBOb25CcmVha2luZ1NwYWNl
Q2hhcmFjdGVyID0gMHhBMDsKKyAgICBzdGF0aWMgY29uc3QgVUNoYXIgU3BhY2VDaGFyYWN0ZXIg
PSAnICc7CisgICAgc3RyLnJlcGxhY2UoTm9uQnJlYWtpbmdTcGFjZUNoYXJhY3RlciwgU3BhY2VD
aGFyYWN0ZXIpOworfQorCitGT1JNQVRFVEMqIHVybFdGb3JtYXQoKQoreworICAgIHN0YXRpYyBV
SU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJVbmlmb3JtUmVzb3VyY2VMb2NhdG9y
VyIpOworICAgIHN0YXRpYyBGT1JNQVRFVEMgdXJsRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9D
T05URU5ULCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ1cmxGb3JtYXQ7Cit9CisK
K0ZPUk1BVEVUQyogdXJsRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVy
Q2xpcGJvYXJkRm9ybWF0KEwiVW5pZm9ybVJlc291cmNlTG9jYXRvciIpOworICAgIHN0YXRpYyBG
T1JNQVRFVEMgdXJsRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwgVFlNRURf
SEdMT0JBTH07CisgICAgcmV0dXJuICZ1cmxGb3JtYXQ7Cit9CisKK0ZPUk1BVEVUQyogcGxhaW5U
ZXh0Rm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgRk9STUFURVRDIHRleHRGb3JtYXQgPSB7Q0ZfVEVY
VCwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAm
dGV4dEZvcm1hdDsKK30KKworRk9STUFURVRDKiBwbGFpblRleHRXRm9ybWF0KCkKK3sKKyAgICBz
dGF0aWMgRk9STUFURVRDIHRleHRGb3JtYXQgPSB7Q0ZfVU5JQ09ERVRFWFQsIDAsIERWQVNQRUNU
X0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnRleHRGb3JtYXQ7Cit9
CisKK0ZPUk1BVEVUQyogZmlsZW5hbWVXRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlOVCBjZiA9
IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiRmlsZU5hbWVXIik7CisgICAgc3RhdGljIEZPUk1B
VEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xP
QkFMfTsKKyAgICByZXR1cm4gJnVybEZvcm1hdDsKK30KKworRk9STUFURVRDKiBmaWxlbmFtZUZv
cm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChM
IkZpbGVOYW1lIik7CisgICAgc3RhdGljIEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERW
QVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnVybEZvcm1h
dDsKK30KKworLy9NU0lFIEhUTUwgRm9ybWF0CitGT1JNQVRFVEMqIGh0bWxGb3JtYXQoKQorewor
ICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJIVE1MIEZvcm1h
dCIpOworICAgIHN0YXRpYyBGT1JNQVRFVEMgaHRtbEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1Rf
Q09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmaHRtbEZvcm1hdDsKK30K
KworU3RyaW5nIGdldFVSTChJRGF0YU9iamVjdCosIGJvb2wmLCBTdHJpbmcqKQoreworICAgIHJl
dHVybiBTdHJpbmcoKTsKK30KKworU3RyaW5nIGdldFBsYWluVGV4dChJRGF0YU9iamVjdCogZGF0
YU9iamVjdCwgYm9vbCYgc3VjY2VzcykKK3sKKyAgICBTVEdNRURJVU0gc3RvcmU7CisgICAgU3Ry
aW5nIHRleHQ7CisgICAgc3VjY2VzcyA9IGZhbHNlOworICAgIGlmIChTVUNDRUVERUQoZGF0YU9i
amVjdC0+R2V0RGF0YShwbGFpblRleHRXRm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8v
dW5pY29kZSB0ZXh0CisgICAgICAgIFVDaGFyKiBkYXRhID0gKFVDaGFyKilHbG9iYWxMb2NrKHN0
b3JlLmhHbG9iYWwpOworICAgICAgICB0ZXh0ID0gU3RyaW5nKGRhdGEpOworICAgICAgICBHbG9i
YWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3Jl
KTsKKyAgICAgICAgc3VjY2VzcyA9IHRydWU7CisgICAgfSBlbHNlIGlmIChTVUNDRUVERUQoZGF0
YU9iamVjdC0+R2V0RGF0YShwbGFpblRleHRGb3JtYXQoKSwgJnN0b3JlKSkpIHsKKyAgICAgICAg
Ly9hc2NpaSB0ZXh0CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopR2xvYmFsTG9jayhzdG9y
ZS5oR2xvYmFsKTsKKyAgICAgICAgdGV4dCA9IFN0cmluZyhkYXRhKTsKKyAgICAgICAgR2xvYmFs
VW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7
CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vSWYgYSBm
aWxlIGlzIGRyb3BwZWQgb24gdGhlIHdpbmRvdywgaXQgZG9lcyBub3QgcHJvdmlkZSBlaXRoZXIg
b2YgdGhlCisgICAgICAgIC8vcGxhaW4gdGV4dCBmb3JtYXRzLCBzbyBoZXJlIHdlIHRyeSB0byBm
b3JjaWJseSBnZXQgYSB1cmwuCisgICAgICAgIHRleHQgPSBnZXRVUkwoZGF0YU9iamVjdCwgc3Vj
Y2Vzcyk7CisgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdGV4dDsK
K30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudEZyb21GaWxlbmFtZXMo
RG9jdW1lbnQqLCBjb25zdCBJRGF0YU9iamVjdCopCit7CisgICAgLy9GSVhNRTogV2Ugc2hvdWxk
IGJlIGFibGUgdG8gY3JlYXRlIGZyYWdtZW50cyBmcm9tIGZpbGVzCisgICAgcmV0dXJuIDA7Cit9
CisKK2Jvb2wgY29udGFpbnNGaWxlbmFtZXMoY29uc3QgSURhdGFPYmplY3QqKQoreworICAgIC8v
RklYTUU6IFdlJ2xsIHdhbnQgdG8gdXBkYXRlIHRoaXMgb25jZSB3ZSBjYW4gcHJvZHVjZSBmcmFn
bWVudHMgZnJvbSBmaWxlcworICAgIHJldHVybiBmYWxzZTsKK30KKworLy9Db252ZXJ0IGEgU3Ry
aW5nIGNvbnRhaW5pbmcgQ0ZfSFRNTCBmb3JtYXR0ZWQgdGV4dCB0byBhIERvY3VtZW50RnJhZ21l
bnQKK1Bhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tQ0ZfSFRNTChEb2N1
bWVudCogZG9jLCBjb25zdCBTdHJpbmcmIGNmX2h0bWwpCit7CisgICAgLy8gb2J0YWluIGJhc2VV
UkwgaWYgcHJlc2VudAorICAgIFN0cmluZyBzcmNVUkxTdHIoInNvdXJjZVVSTDoiKTsKKyAgICBT
dHJpbmcgc3JjVVJMOworICAgIHVuc2lnbmVkIGxpbmVTdGFydCA9IGNmX2h0bWwuZmluZChzcmNV
UkxTdHIsIDAsIGZhbHNlKTsKKyAgICBpZiAobGluZVN0YXJ0ICE9IC0xKSB7CisgICAgICAgIHVu
c2lnbmVkIHNyY0VuZCA9IGNmX2h0bWwuZmluZCgiXG4iLCBsaW5lU3RhcnQsIGZhbHNlKTsKKyAg
ICAgICAgdW5zaWduZWQgc3JjU3RhcnQgPSBsaW5lU3RhcnQrc3JjVVJMU3RyLmxlbmd0aCgpOwor
ICAgICAgICBTdHJpbmcgcmF3U3JjVVJMID0gY2ZfaHRtbC5zdWJzdHJpbmcoc3JjU3RhcnQsIHNy
Y0VuZC1zcmNTdGFydCk7CisgICAgICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHJhd1NyY1VSTCk7
CisgICAgICAgIHNyY1VSTCA9IHJhd1NyY1VSTC5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICB9CisK
KyAgICAvLyBmaW5kIHRoZSBtYXJrdXAgYmV0d2VlbiAiPCEtLVN0YXJ0RnJhZ21lbnQgLS0+IiBh
bmQgIjwhLS1FbmRGcmFnbWVudCAtLT4iLCBhY2NvdW50aW5nIGZvciBicm93c2VyIHF1aXJrcwor
ICAgIHVuc2lnbmVkIG1hcmt1cFN0YXJ0ID0gY2ZfaHRtbC5maW5kKCI8aHRtbCIsIDAsIGZhbHNl
KTsKKyAgICB1bnNpZ25lZCB0YWdTdGFydCA9IGNmX2h0bWwuZmluZCgic3RhcnRmcmFnbWVudCIs
IG1hcmt1cFN0YXJ0LCBmYWxzZSk7CisgICAgdW5zaWduZWQgZnJhZ21lbnRTdGFydCA9IGNmX2h0
bWwuZmluZCgnPicsIHRhZ1N0YXJ0KSArIDE7CisgICAgdW5zaWduZWQgdGFnRW5kID0gY2ZfaHRt
bC5maW5kKCJlbmRmcmFnbWVudCIsIGZyYWdtZW50U3RhcnQsIGZhbHNlKTsKKyAgICB1bnNpZ25l
ZCBmcmFnbWVudEVuZCA9IGNmX2h0bWwucmV2ZXJzZUZpbmQoJzwnLCB0YWdFbmQpOworICAgIFN0
cmluZyBtYXJrdXAgPSBjZl9odG1sLnN1YnN0cmluZyhmcmFnbWVudFN0YXJ0LCBmcmFnbWVudEVu
ZCAtIGZyYWdtZW50U3RhcnQpLnN0cmlwV2hpdGVTcGFjZSgpOworCisgICAgcmV0dXJuIGNyZWF0
ZUZyYWdtZW50RnJvbU1hcmt1cChkb2MsIG1hcmt1cCwgc3JjVVJMKS5yZWxlYXNlUmVmKCk7Cit9
CisKKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudEZyb21IVE1MKERvY3Vt
ZW50KiBkb2MsIElEYXRhT2JqZWN0KiBkYXRhKQoreworICAgIGlmICghZG9jIHx8ICFkYXRhKQor
ICAgICAgICByZXR1cm4gMDsKKworICAgIFNUR01FRElVTSBzdG9yZTsKKyAgICBTdHJpbmcgaHRt
bDsKKyAgICBTdHJpbmcgc3JjVVJMOworICAgIGlmIChTVUNDRUVERUQoZGF0YS0+R2V0RGF0YSho
dG1sRm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8vTVMgSFRNTCBGb3JtYXQgcGFyc2lu
ZworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKUdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCk7
CisgICAgICAgIFNJWkVfVCBkYXRhU2l6ZSA9IDo6R2xvYmFsU2l6ZShzdG9yZS5oR2xvYmFsKTsK
KyAgICAgICAgU3RyaW5nIGNmX2h0bWwoVVRGOEVuY29kaW5nKCkuZGVjb2RlKGRhdGEsIGRhdGFT
aXplKSk7CisgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVs
ZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAgICBpZiAoUGFzc1JlZlB0cjxEb2N1bWVudEZy
YWdtZW50PiBmcmFnbWVudCA9IGZyYWdtZW50RnJvbUNGX0hUTUwoZG9jLCBjZl9odG1sKSkKKyAg
ICAgICAgICAgIHJldHVybiBmcmFnbWVudDsKKyAgICB9CisgICAgaWYgKFNVQ0NFRURFRChkYXRh
LT5HZXREYXRhKHRleHRIdG1sRm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8vcmF3IGh0
bWwKKyAgICAgICAgVUNoYXIqIGRhdGEgPSAoVUNoYXIqKUdsb2JhbExvY2soc3RvcmUuaEdsb2Jh
bCk7CisgICAgICAgIGh0bWwgPSBTdHJpbmcoZGF0YSk7CisgICAgICAgIEdsb2JhbFVubG9jayhz
dG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAg
ICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tTWFya3VwKGRvYywgaHRtbCwgc3JjVVJMKTsKKyAg
ICB9CisKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBjb250YWluc0hUTUwoSURhdGFPYmplY3Qq
IGRhdGEpCit7CisgICAgcmV0dXJuIFNVQ0NFRURFRChkYXRhLT5RdWVyeUdldERhdGEodGV4dEh0
bWxGb3JtYXQoKSkpIHx8IFNVQ0NFRURFRChkYXRhLT5RdWVyeUdldERhdGEoaHRtbEZvcm1hdCgp
KSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9D
bGlwYm9hcmRXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzky
NzMwMgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJk
V2luY2UuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIw
MDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2Fy
ZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBw
dWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg
aXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQg
aGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjEx
MC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNsaXBi
b2FyZFdpbmNlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworQ2xpcGJvYXJkV2luY2U6OkNs
aXBib2FyZFdpbmNlKENsaXBib2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIGJvb2wgaXNGb3JEcmFn
Z2luZykKKzogQ2xpcGJvYXJkKHBvbGljeSwgaXNGb3JEcmFnZ2luZykKK3sKK30KKworQ2xpcGJv
YXJkV2luY2U6On5DbGlwYm9hcmRXaW5jZSgpCit7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6
OmNsZWFyRGF0YShjb25zdCBTdHJpbmcmIHR5cGUpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
K30KKwordm9pZCBDbGlwYm9hcmRXaW5jZTo6Y2xlYXJBbGxEYXRhKCkKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworfQorCitTdHJpbmcgQ2xpcGJvYXJkV2luY2U6OmdldERhdGEoY29uc3QgU3Ry
aW5nJiB0eXBlLCBib29sJiBzdWNjZXNzKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7
CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitib29sIENsaXBib2FyZFdpbmNlOjpzZXREYXRh
KGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBkYXRhKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBleHRlbnNpb25zIGJleW9uZCBJ
RSdzIEFQSQorSGFzaFNldDxTdHJpbmc+IENsaXBib2FyZFdpbmNlOjp0eXBlcygpIGNvbnN0Cit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gSGFzaFNldDxTdHJpbmc+KCk7Cit9
CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OnNldERyYWdJbWFnZShDYWNoZWRJbWFnZSosIGNvbnN0
IEludFBvaW50JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIENsaXBib2Fy
ZFdpbmNlOjpzZXREcmFnSW1hZ2VFbGVtZW50KE5vZGUqLCBjb25zdCBJbnRQb2ludCYpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworLy9Qcm92aWRlcyB0aGUgRE9NIHNwZWNpZmllZAor
RHJhZ0ltYWdlUmVmIENsaXBib2FyZFdpbmNlOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRy
YWdMb2MpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gRHJhZ0lt
YWdlUmVmKCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OmRlY2xhcmVBbmRXcml0ZURyYWdJ
bWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1lKikK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIENsaXBib2FyZFdpbmNlOjp3cml0
ZVVSTChjb25zdCBLVVJMJiwgY29uc3QgU3RyaW5nJiwgRnJhbWUqKQoreworICAgIG5vdEltcGxl
bWVudGVkKCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OndyaXRlUmFuZ2UoUmFuZ2UqLCBG
cmFtZSopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworYm9vbCBDbGlwYm9hcmRXaW5j
ZTo6aGFzRGF0YSgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK1Bhc3NSZWZQdHI8RmlsZUxpc3Q+IENsaXBib2FyZFdpbmNlOjpmaWxlcygpIGNvbnN0
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9h
cmRXaW5jZS5oIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5oCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OGNiZjIKLS0tIC9kZXYvbnVsbAorKysg
Yi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmgKQEAgLTAsMCArMSw1NSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgor
ICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0
IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAo
YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBp
cyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0
IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkg
b2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICog
dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBG
aWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5k
ZWYgQ2xpcGJvYXJkV2luY2VfaAorI2RlZmluZSBDbGlwYm9hcmRXaW5jZV9oCisKKyNpbmNsdWRl
ICJDbGlwYm9hcmQuaCIKKyNpbmNsdWRlICJGaWxlTGlzdC5oIgorCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKKyAgICBjbGFzcyBDbGlwYm9hcmRXaW5jZSA6IHB1YmxpYyBDbGlwYm9hcmQsIHB1Ymxp
YyBDYWNoZWRSZXNvdXJjZUNsaWVudCB7CisgICAgcHVibGljOgorICAgICAgICBDbGlwYm9hcmRX
aW5jZShDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBib29sIGlzRm9yRHJhZ2dpbmcpOwor
ICAgICAgICB+Q2xpcGJvYXJkV2luY2UoKTsKKworICAgICAgICB2b2lkIGNsZWFyRGF0YShjb25z
dCBTdHJpbmcmIHR5cGUpOworICAgICAgICB2b2lkIGNsZWFyQWxsRGF0YSgpOworICAgICAgICBT
dHJpbmcgZ2V0RGF0YShjb25zdCBTdHJpbmcmIHR5cGUsIGJvb2wmIHN1Y2Nlc3MpIGNvbnN0Owor
ICAgICAgICBib29sIHNldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRh
dGEpOworCisgICAgICAgIC8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCisgICAgICAgIEhh
c2hTZXQ8U3RyaW5nPiB0eXBlcygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0RHJhZ0ltYWdl
KENhY2hlZEltYWdlKiwgY29uc3QgSW50UG9pbnQmKTsKKyAgICAgICAgdm9pZCBzZXREcmFnSW1h
Z2VFbGVtZW50KE5vZGUqLCBjb25zdCBJbnRQb2ludCYpOworCisgICAgICAgIHZpcnR1YWwgRHJh
Z0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3Q7CisgICAg
ICAgIHZpcnR1YWwgdm9pZCBkZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCosIGNvbnN0
IEtVUkwmLCBjb25zdCBTdHJpbmcmIHRpdGxlLCBGcmFtZSopOworICAgICAgICB2aXJ0dWFsIHZv
aWQgd3JpdGVVUkwoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKik7CisgICAgICAg
IHZpcnR1YWwgdm9pZCB3cml0ZVJhbmdlKFJhbmdlKiwgRnJhbWUqKTsKKworICAgICAgICB2aXJ0
dWFsIGJvb2wgaGFzRGF0YSgpOworICAgICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8RmlsZUxpc3Q+
IGZpbGVzKCkgY29uc3Q7CisgICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5k
aWYgLy8gQ2xpcGJvYXJkV2luY2VfaAo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33824</attachid>
            <date>2009-07-30 13:30:13 -0700</date>
            <delta_ts>2009-08-08 10:47:36 -0700</delta_ts>
            <desc>2) ScrollView</desc>
            <filename>27543_2.patch</filename>
            <type>text/plain</type>
            <size>61651</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Nyb2xsVmlld1dpbmNlLmNwcCBi
L1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Nyb2xsVmlld1dpbmNlLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2M3ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9TY3JvbGxWaWV3V2luY2UuY3BwCkBAIC0wLDAgKzEsMTc1NiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgSnVzdGluIEhheWdvb2QgPGpoYXln
b29kQHNwc3UuZWR1Pi4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwg
SW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
Q09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBD
T01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiU2Nyb2xsVmlldy5o
IgorCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5jbHVkZSAiQ2hyb21lQ2xpZW50LmgiCisjaW5j
bHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJGcmFtZVRy
ZWUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBs
YXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU2Nyb2xsYmFyLmgiCisjaW5j
bHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCisjaW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNp
bmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKKyNpbmNsdWRlICJTY3JvbGxiYXIuaCIKKyNpbmNsdWRl
ICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRl
IDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8
d2luZG93cy5oPgorCisjaWZkZWYgX0RFQlVHCisjZGVmaW5lIFNDUk9MTF9WSUVXX0RFQlVHICAg
IDAKKyNlbmRpZgorCit1c2luZyBzdGQ6Om1pbjsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisv
LyBzdGFibGVSb3VuZCByb3VuZHMgLTAuNSB0byAwLCB3aGVyZSBscm91bmQgcm91bmRzIC0wLjUg
dG8gLTEuCitzdGF0aWMgaW5saW5lIGludCBzdGFibGVSb3VuZChkb3VibGUgZCkKK3sKKyAgICBp
ZiAoZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOworCisg
ICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQpOworICAgIHJldHVybiBpIC0gZCA+IDAuNSA/
IGkgLSAxIDogaTsKK30KKworc3RhdGljIGlubGluZSBJbnRQb2ludCBvcGVyYXRvciooY29uc3Qg
SW50UG9pbnQmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBJbnRQb2ludChzdGFibGVSb3Vu
ZChhLngoKSAqIGIpLCBzdGFibGVSb3VuZChhLnkoKSAqIGIpKTsKK30KK3N0YXRpYyBpbmxpbmUg
SW50UG9pbnQgb3BlcmF0b3IvKGNvbnN0IEludFBvaW50JiBhLCBkb3VibGUgYikKK3sKKyAgICBy
ZXR1cm4gSW50UG9pbnQoc3RhYmxlUm91bmQoYS54KCkgLyBiKSwgc3RhYmxlUm91bmQoYS55KCkg
LyBiKSk7Cit9CitzdGF0aWMgaW5saW5lIEludFNpemUgb3BlcmF0b3IqKGNvbnN0IEludFNpemUm
IGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBJbnRTaXplKHN0YWJsZVJvdW5kKGEud2lkdGgo
KSAqIGIpLCBzdGFibGVSb3VuZChhLmhlaWdodCgpICogYikpOworfQorc3RhdGljIGlubGluZSBJ
bnRTaXplIG9wZXJhdG9yLyhjb25zdCBJbnRTaXplJiBhLCBkb3VibGUgYikKK3sKKyAgICByZXR1
cm4gSW50U2l6ZShzdGFibGVSb3VuZChhLndpZHRoKCkgLyBiKSwgc3RhYmxlUm91bmQoYS5oZWln
aHQoKSAvIGIpKTsKK30KK3N0YXRpYyBpbmxpbmUgSW50U2l6ZSBvcGVyYXRvciooY29uc3QgSW50
U2l6ZSYgYSwgY29uc3QgRmxvYXRTaXplIGIpCit7CisgICAgcmV0dXJuIEludFNpemUoc3RhYmxl
Um91bmQoYS53aWR0aCgpICogYi53aWR0aCgpKSwgc3RhYmxlUm91bmQoYS5oZWlnaHQoKSAqIGIu
aGVpZ2h0KCkpKTsKK30KKworc3RhdGljIGludCBzY3JvbGxCYXJQaHlzaWNhbFdpZHRoID0gMTU7
CisKK2NsYXNzIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2YXRlIHsKK3B1YmxpYzoKKyAgICBT
Y3JvbGxWaWV3UHJpdmF0ZShTY3JvbGxWaWV3KiB2aWV3KQorICAgICAgICA6IG1fdmlldyh2aWV3
KQorICAgICAgICAsIG1fc2Nyb2xsYmFyc1N1cHByZXNzZWQoZmFsc2UpCisgICAgICAgICwgbV9p
blVwZGF0ZVNjcm9sbGJhcnMoZmFsc2UpCisgICAgICAgICwgbV9zY3JvbGxiYXJzQXZvaWRpbmdS
ZXNpemVyKDApCisgICAgICAgICwgbV92U2Nyb2xsYmFyTW9kZShTY3JvbGxiYXJBdXRvKQorICAg
ICAgICAsIG1faFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFyQXV0bykKKyAgICAgICAgLCBtX3Njcm9s
bGJhcnNWaXNpYmxlVGltZXIodGhpcywgJlNjcm9sbFZpZXdQcml2YXRlOjpzY3JvbGxCYXJWaXNp
YmxlVGltZXJGaXJlZCkKKyAgICAgICAgLCBtX3Zpc2libGVDb250ZW50c1dpZHRoKDApCisgICAg
ICAgICwgbV92aXNpYmxlQ29udGVudHNIZWlnaHQoMCkKKyAgICAgICAgLCBtX3ByZXZTY3JvbGxi
YXJVbmRlck1vdXNlKDApCisgICAgICAgICwgbV9wcmV2TW91c2VEb3duKGZhbHNlKQorICAgICAg
ICAsIG1fc2Nyb2xsYmFyc1Zpc2libGUoZmFsc2UpCisgICAgICAgICwgbV9zaG93U2Nyb2xsYmFy
U3VwcHJlc3NlZChmYWxzZSkKKyAgICAgICAgLCBtX2F1dG9TaG93SGlkZVNjcm9sbGJhcnMoZmFs
c2UpCisgICAgeworICAgIH0KKworICAgIH5TY3JvbGxWaWV3UHJpdmF0ZSgpCisgICAgeworICAg
ICAgICBzZXRIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKGZhbHNlKTsKKyAgICAgICAgc2V0SGFzVmVy
dGljYWxTY3JvbGxiYXIoZmFsc2UpOworICAgIH0KKworICAgIHZvaWQgc2V0SGFzSG9yaXpvbnRh
bFNjcm9sbGJhcihib29sIGhhc0Jhcik7CisgICAgdm9pZCBzZXRIYXNWZXJ0aWNhbFNjcm9sbGJh
cihib29sIGhhc0Jhcik7CisKKyAgICB2aXJ0dWFsIHZvaWQgdmFsdWVDaGFuZ2VkKFNjcm9sbGJh
ciopOworCisgICAgdm9pZCBzY3JvbGxCYWNraW5nU3RvcmUoY29uc3QgSW50U2l6ZSYgc2Nyb2xs
RGVsdGEpOworCisgICAgdm9pZCBzZXRBbGxvd3NTY3JvbGxpbmcoYm9vbCk7CisgICAgYm9vbCBh
bGxvd3NTY3JvbGxpbmcoKSBjb25zdDsKKworICAgIHZvaWQgc2hvd1Njcm9sbGJhcnMoYm9vbCBo
b3Jpem9udGFsLCBib29sIHZlcnRpY2FsLCBib29sIGZvcmNlKTsKKyAgICB2b2lkIGhpZGVTY3Jv
bGxiYXJzKCk7CisgICAgdm9pZCBzY3JvbGxCYXJWaXNpYmxlVGltZXJGaXJlZChUaW1lcjxTY3Jv
bGxWaWV3UHJpdmF0ZT4qKTsKKworICAgIGludCBnZXRIQmFySGVpZ2h0KCkgY29uc3QgeyByZXR1
cm4gc3RhYmxlUm91bmQoKGRvdWJsZSlzY3JvbGxCYXJQaHlzaWNhbFdpZHRoIC8gbV92aWV3LT5z
Y2FsZSgpKTsgfQorICAgIGludCBnZXRWQmFyV2lkdGgoKSBjb25zdCB7IHJldHVybiBzdGFibGVS
b3VuZCgoZG91YmxlKXNjcm9sbEJhclBoeXNpY2FsV2lkdGggLyBtX3ZpZXctPnNjYWxlKCkpOyB9
CisgICAgSW50UmVjdCBnZXRIQ29ybmVyKGNvbnN0IEludFNpemUmIGlubmVyU2l6ZSkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2hCYXIgJiYgbV9oU2Nyb2xsYmFyTW9kZSAhPSBTY3Jv
bGxiYXJBbHdheXNPZmYgJiYgaW5uZXJTaXplLndpZHRoKCkgPiBtX2hCYXItPndpZHRoKCkKKyAg
ICAgICAgICAgID8gSW50UmVjdChtX2hCYXItPndpZHRoKCksIGlubmVyU2l6ZS5oZWlnaHQoKSAt
IG1faEJhci0+aGVpZ2h0KCksIGlubmVyU2l6ZS53aWR0aCgpIC0gbV9oQmFyLT53aWR0aCgpLCBt
X2hCYXItPmhlaWdodCgpKQorICAgICAgICAgICAgOiBJbnRSZWN0KCk7CisgICAgfQorICAgIElu
dFJlY3QgZ2V0VkNvcm5lcihjb25zdCBJbnRTaXplJiBpbm5lclNpemUpIGNvbnN0CisgICAgewor
ICAgICAgICByZXR1cm4gbV92QmFyICYmIG1fdlNjcm9sbGJhck1vZGUgIT0gU2Nyb2xsYmFyQWx3
YXlzT2ZmICYmIGlubmVyU2l6ZS5oZWlnaHQoKSA+IG1fdkJhci0+aGVpZ2h0KCkKKyAgICAgICAg
ICAgID8gSW50UmVjdChpbm5lclNpemUud2lkdGgoKSAtIG1fdkJhci0+d2lkdGgoKSwgaW5uZXJT
aXplLmhlaWdodCgpLCBpbm5lclNpemUud2lkdGgoKSwgaW5uZXJTaXplLmhlaWdodCgpIC0gbV92
QmFyLT5oZWlnaHQoKSkKKyAgICAgICAgICAgIDogSW50UmVjdCgpOworICAgIH0KKworICAgIElu
dFJlY3QgZ2V0SEJhclJlY3QoY29uc3QgSW50U2l6ZSYgaW5uZXJTaXplKSBjb25zdAorICAgIHsK
KyAgICAgICAgcmV0dXJuIEludFJlY3QoMCwgaW5uZXJTaXplLmhlaWdodCgpIC0gZ2V0SEJhckhl
aWdodCgpLAorICAgICAgICAgICAgaW5uZXJTaXplLndpZHRoKCkgLSAobV92QmFyICYmIG1fdlNj
cm9sbGJhck1vZGUgIT0gU2Nyb2xsYmFyQWx3YXlzT2ZmID8gZ2V0VkJhcldpZHRoKCkgOiAwKSwg
Z2V0SEJhckhlaWdodCgpKTsKKyAgICB9CisgICAgSW50UmVjdCBnZXRWQmFyUmVjdChjb25zdCBJ
bnRTaXplJiBpbm5lclNpemUpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gSW50UmVjdChp
bm5lclNpemUud2lkdGgoKSAtIGdldFZCYXJXaWR0aCgpLCAwLCBnZXRWQmFyV2lkdGgoKSwKKyAg
ICAgICAgICAgIGlubmVyU2l6ZS5oZWlnaHQoKSAtIChtX2hCYXIgJiYgbV9oU2Nyb2xsYmFyTW9k
ZSAhPSBTY3JvbGxiYXJBbHdheXNPZmYgPyBnZXRIQmFySGVpZ2h0KCkgOiAwKSk7CisgICAgfQor
CisgICAgLy8gTm90IGxpa2UgU2Nyb2xsVmlldzo6dmlzaWJsZUNvbnRlbnRSZWN0LCB0aGlzIGZ1
bmN0aW9uIHRha2VzIHNjcm9sbGJhcnMgaW4gY291bnQsCisgICAgLy8gYW5kIHJldHVybiB0aGUg
YXJlYSBub3QgaW5jbHVkaW5nIHNjcm9sbGJhcnMuCisgICAgSW50UmVjdCBnZXRWaXNpYmxlQ29u
dGVudFJlY3QoKSBjb25zdAorICAgIHsKKyAgICAgICAgSW50UmVjdCByZWN0KG1fdmlldy0+ZnJh
bWVSZWN0KCkpOworICAgICAgICBpZiAobV9zY3JvbGxiYXJzVmlzaWJsZSkgeworICAgICAgICAg
ICAgaWYgKGNhblNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICAgICAgcmVjdC5zZXRIZWln
aHQobV9oQmFyLT55KCkpOworICAgICAgICAgICAgaWYgKGNhblNob3dWU2Nyb2xsYmFyKCkpCisg
ICAgICAgICAgICAgICAgcmVjdC5zZXRXaWR0aChtX3ZCYXItPngoKSk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIHJlY3Q7CisgICAgfQorCisgICAgdm9pZCBpbnZhbGlkYXRlU2Nyb2xsYmFy
KFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIsIEhXTkQgaHduZCwgY29uc3QgVHJhbnNmb3JtYXRpb25N
YXRyaXgqIHRyYW5zID0gMCk7CisgICAgdm9pZCBpbnZhbGlkYXRlU2Nyb2xsYmFycyhib29sIGhv
cml6b250YWwsIGJvb2wgdmVydGljYWwsIGJvb2wgY29ybmVyKTsKKworICAgIGJvb2wgY2FuU2hv
d1ZTY3JvbGxiYXIoKSBjb25zdCB7IHJldHVybiBtX3ZCYXIgJiYgbV92U2Nyb2xsYmFyTW9kZSAh
PSBTY3JvbGxiYXJBbHdheXNPZmY7IH0KKyAgICBib29sIGNhblNob3dIU2Nyb2xsYmFyKCkgY29u
c3QgeyByZXR1cm4gbV9oQmFyICYmIG1faFNjcm9sbGJhck1vZGUgIT0gU2Nyb2xsYmFyQWx3YXlz
T2ZmOyB9CisKKyAgICB2b2lkIHNldEF1dG9TY3JvbGxiYXJzKGJvb2wgZCkKKyAgICB7CisgICAg
ICAgIGlmIChkID09IG1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFycykKKyAgICAgICAgICAgIHJldHVy
bjsKKworICAgICAgICBpZiAobV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzID0gZCkgeworICAgICAg
ICAgICAgaWYgKG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICAg
ICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1lci5zdG9wKCk7CisgICAgICAgIH0gZWxzZSBp
ZiAobV9zY3JvbGxiYXJzVmlzaWJsZSAmJiAhbV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyLmlzQWN0
aXZlKCkpCisgICAgICAgICAgICBtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIuc3RhcnRPbmVTaG90
KDIuMCk7CisgICAgfQorCisgICAgU2Nyb2xsVmlldyogbV92aWV3OworICAgIEludFNpemUgbV9z
Y3JvbGxPZmZzZXQ7CisgICAgSW50U2l6ZSBtX2NvbnRlbnRzU2l6ZTsKKyAgICBib29sIG1fc2Ny
b2xsYmFyc1N1cHByZXNzZWQ7CisgICAgYm9vbCBtX2luVXBkYXRlU2Nyb2xsYmFyczsKKyAgICBp
bnQgbV9zY3JvbGxiYXJzQXZvaWRpbmdSZXNpemVyOworICAgIFNjcm9sbGJhck1vZGUgbV92U2Ny
b2xsYmFyTW9kZTsKKyAgICBTY3JvbGxiYXJNb2RlIG1faFNjcm9sbGJhck1vZGU7CisgICAgUmVm
UHRyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3ZCYXI7CisgICAgUmVmUHRyPFBsYXRmb3JtU2Nyb2xs
YmFyPiBtX2hCYXI7CisgICAgSFJHTiBtX2RpcnR5UmVnaW9uOworICAgIEhhc2hTZXQ8UmVmUHRy
PFdpZGdldD4gPiBtX2NoaWxkcmVuOworCisgICAgYm9vbCBtX3Njcm9sbGJhcnNWaXNpYmxlOwor
ICAgIGJvb2wgbV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZDsKKyAgICBUaW1lcjxTY3JvbGxWaWV3
UHJpdmF0ZT4gbV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyOworCisgICAgSW50UmVjdCBtX3BoeXNp
Y2FsR2VvbWV0cnk7CisgICAgZmxvYXQgbV92aXNpYmxlQ29udGVudHNXaWR0aDsKKyAgICBmbG9h
dCBtX3Zpc2libGVDb250ZW50c0hlaWdodDsKKyAgICBQbGF0Zm9ybVNjcm9sbGJhciogbV9wcmV2
U2Nyb2xsYmFyVW5kZXJNb3VzZTsKKyAgICBib29sIG1fcHJldk1vdXNlRG93bjsKKyAgICBib29s
IG1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFyczsKK307CisKKy8vIEZvciB0b3AgbGV2ZWwgb25seSEK
K3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OmludmFsaWRhdGVTY3JvbGxiYXIo
UGxhdGZvcm1TY3JvbGxiYXIqIGJhciwgSFdORCBod25kLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1h
dHJpeCogdHJhbnMpCit7CisgICAgaWYgKCFiYXIgfHwgIWh3bmQpCisgICAgICAgIHJldHVybjsK
KworICAgIGlmICh0cmFucykgeworICAgICAgICBSRUNUIHJlY3RXaW4gPSB0cmFucy0+bWFwUmVj
dChiYXItPmZyYW1lUmVjdCgpKTsKKyAgICAgICAgaWYgKHJlY3RXaW4uYm90dG9tIDwgbV9waHlz
aWNhbEdlb21ldHJ5LmJvdHRvbSgpKQorICAgICAgICAgICAgcmVjdFdpbi5ib3R0b20gPSBtX3Bo
eXNpY2FsR2VvbWV0cnkuYm90dG9tKCk7CisgICAgICAgIGlmIChyZWN0V2luLnJpZ2h0IDwgbV9w
aHlzaWNhbEdlb21ldHJ5LnJpZ2h0KCkpCisgICAgICAgICAgICByZWN0V2luLnJpZ2h0ID0gbV9w
aHlzaWNhbEdlb21ldHJ5LnJpZ2h0KCk7CisgICAgICAgIGlmIChtX3ZpZXctPmlzVmlzaWJsZSgp
KQorICAgICAgICAgICAgOjpJbnZhbGlkYXRlUmVjdChod25kLCAmcmVjdFdpbiwgRkFMU0UpOwor
ICAgIH0gZWxzZSB7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4IG15VHJhbnMobV92aWV3
LT5zY2FsZSgpLCAwLCAwLCBtX3ZpZXctPnNjYWxlKCksIG1fdmlldy0+eCgpLCBtX3ZpZXctPnko
KSk7CisgICAgICAgIGludmFsaWRhdGVTY3JvbGxiYXIoYmFyLCBod25kLCAmbXlUcmFucyk7Cisg
ICAgfQorfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2YXRlOjppbnZhbGlkYXRl
U2Nyb2xsYmFycyhib29sIGhvcml6b250YWwsIGJvb2wgdmVydGljYWwsIGJvb2wgY29ybmVyKQor
eworICAgIGlmICghbV9zY3JvbGxiYXJzVmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
aWYgKCghdmVydGljYWwgfHwgIWNhblNob3dWU2Nyb2xsYmFyKCkpICYmICghaG9yaXpvbnRhbCB8
fCAhY2FuU2hvd0hTY3JvbGxiYXIoKSkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX3Zp
ZXctPnBhcmVudCgpKSB7CisgICAgICAgIGlmIChob3Jpem9udGFsICYmIGNhblNob3dIU2Nyb2xs
YmFyKCkpCisgICAgICAgICAgICBtX2hCYXItPmludmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKHZl
cnRpY2FsICYmIGNhblNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBtX3ZCYXItPmludmFs
aWRhdGUoKTsKKworICAgICAgICBpZiAoY29ybmVyKSB7CisgICAgICAgICAgICBJbnRTaXplIGlu
bmVyU2l6ZShtX3Zpc2libGVDb250ZW50c1dpZHRoLCBtX3Zpc2libGVDb250ZW50c0hlaWdodCk7
CisgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHRoZSBzY3JvbGwgY29ybmVyIHRvbyBvbiB1bnN1
cHByZXNzLgorICAgICAgICAgICAgSW50UmVjdCBoQ29ybmVyID0gZ2V0SENvcm5lcihpbm5lclNp
emUpOworICAgICAgICAgICAgbV92aWV3LT5pbnZhbGlkYXRlUmVjdChoQ29ybmVyKTsKKworICAg
ICAgICAgICAgSW50UmVjdCB2Q29ybmVyID0gZ2V0VkNvcm5lcihpbm5lclNpemUpOworICAgICAg
ICAgICAgaWYgKHZDb3JuZXIgIT0gaENvcm5lcikKKyAgICAgICAgICAgICAgICBtX3ZpZXctPmlu
dmFsaWRhdGVSZWN0KHZDb3JuZXIpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAg
aWYgKCFtX3ZpZXctPmlzVmlzaWJsZSgpKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAg
IGRvdWJsZSBzY2FsZSA9IG1fdmlldy0+c2NhbGUoKTsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25N
YXRyaXggdHJhbnMoc2NhbGUsIDAsIDAsIHNjYWxlLCBtX3ZpZXctPngoKSwgbV92aWV3LT55KCkp
OworCisgICAgICAgIEhXTkQgcGxhdGZvcm1XaWRnZXRIYW5kbGUgPSBtX3ZpZXctPnBsYXRmb3Jt
V2lkZ2V0KCk7CisgICAgICAgIGlmIChob3Jpem9udGFsICYmIGNhblNob3dIU2Nyb2xsYmFyKCkp
CisgICAgICAgICAgICBpbnZhbGlkYXRlU2Nyb2xsYmFyKG1faEJhci5nZXQoKSwgcGxhdGZvcm1X
aWRnZXRIYW5kbGUsICZ0cmFucyk7CisgICAgICAgIGlmICh2ZXJ0aWNhbCAmJiBjYW5TaG93VlNj
cm9sbGJhcigpKQorICAgICAgICAgICAgaW52YWxpZGF0ZVNjcm9sbGJhcihtX3ZCYXIuZ2V0KCks
IHBsYXRmb3JtV2lkZ2V0SGFuZGxlLCAmdHJhbnMpOworICAgIH0KK30KKwordm9pZCBTY3JvbGxW
aWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6c2V0SGFzSG9yaXpvbnRhbFNjcm9sbGJhcihib29sIGhh
c0JhcikKK3sKKyAgICBpZiAoaGFzQmFyICYmICFtX2hCYXIpIHsKKyAgICAgICAgbV9oQmFyID0g
YWRvcHRSZWYobmV3IFBsYXRmb3JtU2Nyb2xsYmFyKG1fdmlldywgSG9yaXpvbnRhbFNjcm9sbGJh
ciwgUmVndWxhclNjcm9sbGJhcikpOworICAgICAgICBtX2hCYXItPnNldElzVmlld1Njcm9sbGJh
cih0cnVlKTsKKyAgICAgICAgSW50U2l6ZSBpbm5lclNpemUobV92aXNpYmxlQ29udGVudHNXaWR0
aCwgbV92aXNpYmxlQ29udGVudHNIZWlnaHQpOworICAgICAgICBtX3ZpZXctPmFkZENoaWxkKG1f
aEJhci5nZXQoKSk7CisgICAgICAgIG1faEJhci0+c2V0RnJhbWVSZWN0KGdldEhCYXJSZWN0KGlu
bmVyU2l6ZSkpOworICAgICAgICBpZiAoIW1fc2Nyb2xsYmFyc1Zpc2libGUpCisgICAgICAgICAg
ICBtX2hCYXItPmhpZGUoKTsKKyAgICB9IGVsc2UgaWYgKCFoYXNCYXIgJiYgbV9oQmFyKSB7Cisg
ICAgICAgIG1fdmlldy0+cmVtb3ZlQ2hpbGQobV9oQmFyLmdldCgpKTsKKyAgICAgICAgbV9oQmFy
ID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnNl
dEhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGJvb2wgaGFzQmFyKQoreworICAgIGlmIChoYXNCYXIgJiYg
IW1fdkJhcikgeworICAgICAgICBtX3ZCYXIgPSBhZG9wdFJlZihuZXcgUGxhdGZvcm1TY3JvbGxi
YXIobV92aWV3LCBWZXJ0aWNhbFNjcm9sbGJhciwgUmVndWxhclNjcm9sbGJhcikpOworICAgICAg
ICBtX3ZCYXItPnNldElzVmlld1Njcm9sbGJhcih0cnVlKTsKKyAgICAgICAgSW50U2l6ZSBpbm5l
clNpemUobV92aXNpYmxlQ29udGVudHNXaWR0aCwgbV92aXNpYmxlQ29udGVudHNIZWlnaHQpOwor
ICAgICAgICBtX3ZpZXctPmFkZENoaWxkKG1fdkJhci5nZXQoKSk7CisgICAgICAgIG1fdkJhci0+
c2V0RnJhbWVSZWN0KGdldFZCYXJSZWN0KGlubmVyU2l6ZSkpOworICAgICAgICBpZiAoIW1fc2Ny
b2xsYmFyc1Zpc2libGUpCisgICAgICAgICAgICBtX3ZCYXItPmhpZGUoKTsKKyAgICB9IGVsc2Ug
aWYgKCFoYXNCYXIgJiYgbV92QmFyKSB7CisgICAgICAgIG1fdmlldy0+cmVtb3ZlQ2hpbGQobV92
QmFyLmdldCgpKTsKKyAgICAgICAgbV92QmFyID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xs
Vmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnZhbHVlQ2hhbmdlZChTY3JvbGxiYXIqIGJhcikKK3sK
KyAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHJlYWxseSBtb3ZlZC4KKyAgICBJbnRTaXplIG5ld09m
ZnNldCA9IG1fc2Nyb2xsT2Zmc2V0OworICAgIHsKKyAgICAgICAgaW50IHZhbHVlID0gYmFyLT52
YWx1ZSgpOworICAgICAgICBkb3VibGUgc2NhbGUgPSBtX3ZpZXctPnNjYWxlKCk7CisgICAgICAg
IHZhbHVlID0gc3RhYmxlUm91bmQoc3RhYmxlUm91bmQodmFsdWUgKiBzY2FsZSkgLyBzY2FsZSk7
CisKKyAgICAgICAgaWYgKGJhciA9PSBtX2hCYXIpCisgICAgICAgICAgICBuZXdPZmZzZXQuc2V0
V2lkdGgodmFsdWUpOworICAgICAgICBlbHNlIGlmIChiYXIgPT0gbV92QmFyKQorICAgICAgICAg
ICAgbmV3T2Zmc2V0LnNldEhlaWdodCh2YWx1ZSk7CisgICAgfQorICAgIEludFNpemUgc2Nyb2xs
RGVsdGEgPSBuZXdPZmZzZXQgLSBtX3Njcm9sbE9mZnNldDsKKyAgICBpZiAoc2Nyb2xsRGVsdGEg
PT0gSW50U2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyNpZiBkZWZpbmVkKFNDUk9MTF9WSUVX
X0RFQlVHKSAmJiBTQ1JPTExfVklFV19ERUJVRyA+PSAyCisgICAgcHJpbnRmKCJTY3JvbGxWaWV3
OiAweCV4OjB4JXg6IG1fc2Nyb2xsT2Zmc2V0OiAoJWQsICVkKSAtPiAoJWQsICVkKS5cbiIsIHN0
YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldyktPnBhcmVudCgpLCBtX3ZpZXcsCisgICAgICAg
IG1fc2Nyb2xsT2Zmc2V0LndpZHRoKCksIG1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgpLCBuZXdPZmZz
ZXQud2lkdGgoKSwgbmV3T2Zmc2V0LmhlaWdodCgpKTsKKyNlbmRpZgorCisgICAgbV9zY3JvbGxP
ZmZzZXQgPSBuZXdPZmZzZXQ7CisKKyAgICBpZiAobV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgc2hvd1Njcm9sbGJhcnMoZmFsc2UsIGZhbHNlLCBmYWxz
ZSk7CisgICAgc2Nyb2xsQmFja2luZ1N0b3JlKHNjcm9sbERlbHRhKTsKKyAgICAvL3N0YXRpY19j
YXN0PEZyYW1lVmlldyo+KG1fdmlldyktPmZyYW1lKCktPnNlbmRTY3JvbGxFdmVudCgpOworICAg
IGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3
Kj4obV92aWV3KTsKKyAgICBpZiAoRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpKSB7
CisgICAgICAgIGlmIChmcmFtZS0+c2hvdWxkQmxpbmtDYXJldCgpKQorICAgICAgICAgICAgbV92
aWV3LT5ob3N0V2luZG93KCktPmNhcmV0UmVjdENoYW5nZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQg
U2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnNjcm9sbEJhY2tpbmdTdG9yZShjb25zdCBJ
bnRTaXplJiBzY3JvbGxEZWx0YSkKK3sKKyAgICBpZiAoIXNjcm9sbERlbHRhLndpZHRoKCkgJiYg
IXNjcm9sbERlbHRhLmhlaWdodCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBJbnRSZWN0IHNj
cm9sbFZpZXdSZWN0OworICAgIGlmIChtX3ZpZXctPnBhcmVudCgpKQorICAgICAgICBzY3JvbGxW
aWV3UmVjdCA9IG1fdmlldy0+cGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3coZ2V0VmlzaWJsZUNv
bnRlbnRSZWN0KCkpOworICAgIGVsc2UKKyAgICAgICAgc2Nyb2xsVmlld1JlY3QgPSBtX3ZpZXct
PmNvbnRlbnRzVG9XaW5kb3coSW50UmVjdChJbnRQb2ludCgwLCAwKSwgbV9jb250ZW50c1NpemUp
KTsKKworICAgIEludFNpemUgb2xkT2Zmc2V0ID0gKG1fc2Nyb2xsT2Zmc2V0IC0gc2Nyb2xsRGVs
dGEpICogbV92aWV3LT5zY2FsZSgpOworICAgIEludFNpemUgbmV3T2Zmc2V0ID0gbV9zY3JvbGxP
ZmZzZXQgKiBtX3ZpZXctPnNjYWxlKCk7CisgICAgRnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8
RnJhbWVWaWV3Kj4obV92aWV3KS0+ZnJhbWUoKTsKKyAgICBtX3ZpZXctPmhvc3RXaW5kb3coKS0+
c2Nyb2xsKGZyYW1lLCBJbnRTaXplKG9sZE9mZnNldC53aWR0aCgpIC0gbmV3T2Zmc2V0LndpZHRo
KCkKKyAgICAgICAgLCBvbGRPZmZzZXQuaGVpZ2h0KCkgLSBuZXdPZmZzZXQuaGVpZ2h0KCkpCisg
ICAgICAgICwgc2Nyb2xsVmlld1JlY3QsIHNjcm9sbFZpZXdSZWN0KTsKKyAgICBtX3ZpZXctPmhv
c3RXaW5kb3coKS0+cmVwYWludChmcmFtZSwgc2Nyb2xsVmlld1JlY3QsIGZhbHNlLCB0cnVlLCBm
YWxzZSk7CisKKyAgICAvLyBUaGlzIGNhbGwgd2lsbCBtb3ZlIGNoaWxkIEhXTkRzIChwbHVnaW5z
KSBhbmQgaW52YWxpZGF0ZSB0aGVtIGFzIHdlbGwuCisgICAgbV92aWV3LT5mcmFtZVJlY3RzQ2hh
bmdlZCgpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2YXRlOjpzZXRBbGxv
d3NTY3JvbGxpbmcoYm9vbCBmbGFnKQoreworICAgIGlmIChmbGFnICYmIG1fdlNjcm9sbGJhck1v
ZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQorICAgICAgICBtX3ZTY3JvbGxiYXJNb2RlID0gU2Ny
b2xsYmFyQXV0bzsKKyAgICBlbHNlIGlmICghZmxhZykKKyAgICAgICAgbV92U2Nyb2xsYmFyTW9k
ZSA9IFNjcm9sbGJhckFsd2F5c09mZjsKKworICAgIGlmIChmbGFnICYmIG1faFNjcm9sbGJhck1v
ZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQorICAgICAgICBtX2hTY3JvbGxiYXJNb2RlID0gU2Ny
b2xsYmFyQXV0bzsKKyAgICBlbHNlIGlmICghZmxhZykKKyAgICAgICAgbV9oU2Nyb2xsYmFyTW9k
ZSA9IFNjcm9sbGJhckFsd2F5c09mZjsKKworICAgIG1fdmlldy0+dXBkYXRlU2Nyb2xsYmFycyht
X3Njcm9sbE9mZnNldCk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6
OmFsbG93c1Njcm9sbGluZygpIGNvbnN0Cit7CisgICAgLy8gUmV0dXJuIFlFUyBpZiBlaXRoZXIg
aG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzY3JvbGxpbmcgaXMgYWxsb3dlZC4KKyAgICByZXR1cm4g
bV9oU2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmYgfHwgbV92U2Nyb2xsYmFyTW9k
ZSAhPSBTY3JvbGxiYXJBbHdheXNPZmY7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmll
d1ByaXZhdGU6OnNob3dTY3JvbGxiYXJzKGJvb2wgaG9yaXpvbnRhbCwgYm9vbCB2ZXJ0aWNhbCwg
Ym9vbCBtYW51YWwpCit7CisgICAgaWYgKCFtYW51YWwgJiYgIW1fYXV0b1Nob3dIaWRlU2Nyb2xs
YmFycykKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1l
ci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIuc3RvcCgpOwor
CisgICAgaWYgKCFjYW5TaG93SFNjcm9sbGJhcigpICYmICFjYW5TaG93VlNjcm9sbGJhcigpKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1fc2Nyb2xsYmFyc1Zpc2libGUpIHsKKyAgICAg
ICAgSW50U2l6ZSBpbm5lclNpemUobV92aXNpYmxlQ29udGVudHNXaWR0aCwgbV92aXNpYmxlQ29u
dGVudHNIZWlnaHQpOworCisgICAgICAgIGlmIChtX2hCYXIpIHsKKyAgICAgICAgICAgIG1faEJh
ci0+c2hvdygpOworICAgICAgICAgICAgbV9oQmFyLT5zZXRGcmFtZVJlY3QoZ2V0SEJhclJlY3Qo
aW5uZXJTaXplKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdkJhcikgeworICAgICAgICAg
ICAgbV92QmFyLT5zaG93KCk7CisgICAgICAgICAgICBtX3ZCYXItPnNldEZyYW1lUmVjdChnZXRW
QmFyUmVjdChpbm5lclNpemUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1fdmlldy0+cGFy
ZW50KCkpIHsKKyAgICAgICAgICAgIGludmFsaWRhdGVTY3JvbGxiYXJzKHRydWUsIHRydWUsIHRy
dWUpOworICAgICAgICAgICAgbV9zY3JvbGxiYXJzVmlzaWJsZSA9IHRydWU7CisgICAgICAgICAg
ICBpZiAobV92aWV3LT5pc1Zpc2libGUoKSkKKyAgICAgICAgICAgICAgICBVcGRhdGVXaW5kb3co
bV92aWV3LT5wbGF0Zm9ybVdpZGdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobV92
aWV3LT5wYXJlbnQoKSkgeworICAgICAgICBpbnZhbGlkYXRlU2Nyb2xsYmFycyhob3Jpem9udGFs
IHx8ICFtX3Njcm9sbGJhcnNWaXNpYmxlLCB2ZXJ0aWNhbCB8fCAhbV9zY3JvbGxiYXJzVmlzaWJs
ZSwgIW1fc2Nyb2xsYmFyc1Zpc2libGUpOworICAgICAgICBtX3Njcm9sbGJhcnNWaXNpYmxlID0g
dHJ1ZTsKKyAgICAgICAgLy9tX3ZpZXctPnVwZGF0ZUJhY2tpbmdTdG9yZSgpOworICAgIH0KKwor
ICAgIGlmIChtX2F1dG9TaG93SGlkZVNjcm9sbGJhcnMpCisgICAgICAgIG1fc2Nyb2xsYmFyc1Zp
c2libGVUaW1lci5zdGFydE9uZVNob3QoMi4wKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpTY3Jv
bGxWaWV3UHJpdmF0ZTo6aGlkZVNjcm9sbGJhcnMoKQoreworICAgIGlmIChtX3Njcm9sbGJhcnNW
aXNpYmxlKSB7CisgICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGUgPSBmYWxzZTsKKyAgICAgICAg
aW52YWxpZGF0ZVNjcm9sbGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIGlmIChtX2hC
YXIpIHsKKyAgICAgICAgICAgIG1faEJhci0+aGlkZSgpOworICAgICAgICAgICAgbV9oQmFyLT5z
ZXRGcmFtZVJlY3QoSW50UmVjdCgwLCAwLCAwLCBtX2hCYXItPmhlaWdodCgpKSk7CisgICAgICAg
IH0KKyAgICAgICAgaWYgKG1fdkJhcikgeworICAgICAgICAgICAgbV92QmFyLT5oaWRlKCk7Cisg
ICAgICAgICAgICBtX3ZCYXItPnNldEZyYW1lUmVjdChJbnRSZWN0KDAsIDAsIG1fdkJhci0+d2lk
dGgoKSwgMCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtX3ZpZXctPmlzVmlzaWJsZSgpKQor
ICAgICAgICAgICAgVXBkYXRlV2luZG93KG1fdmlldy0+cGxhdGZvcm1XaWRnZXQoKSk7CisgICAg
fQorfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9sbFZpZXdQcml2YXRlOjpzY3JvbGxCYXJWaXNp
YmxlVGltZXJGaXJlZChUaW1lcjxTY3JvbGxWaWV3UHJpdmF0ZT4qKQoreworICAgIGlmIChtX3Nj
cm9sbGJhcnNWaXNpYmxlVGltZXIuaXNBY3RpdmUoKSkKKyAgICAgICAgbV9zY3JvbGxiYXJzVmlz
aWJsZVRpbWVyLnN0b3AoKTsKKworICAgIGlmICghbV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzKQor
ICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWNhblNob3dIU2Nyb2xsYmFyKCkgJiYgIWNhblNo
b3dWU2Nyb2xsYmFyKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX3Njcm9sbGJhcnNW
aXNpYmxlKSB7CisgICAgICAgIGlmIChtX3ZpZXctPmlzVmlzaWJsZSgpICYmIEdldENhcHR1cmUo
KSA9PSBtX3ZpZXctPnBsYXRmb3JtV2lkZ2V0KCkpCisgICAgICAgICAgICAvLyBDYXB0dXJpbmcg
bW91c2UgZXZlbnQsIHVzZXIgbWlnaHQgYmUgZHJhZ2dpbmcgc2Nyb2xsIGJhcgorICAgICAgICAg
ICAgbV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyLnN0YXJ0T25lU2hvdCgyLjApOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBoaWRlU2Nyb2xsYmFycygpOworICAgIH0KK30KKworU2Nyb2xsVmll
dzo6U2Nyb2xsVmlldygpCisgICAgOiBtX2RhdGEobmV3IFNjcm9sbFZpZXdQcml2YXRlKHRoaXMp
KQorICAgICwgbV9zY2FsZSgxLikKKyAgICAsIG1fdXNlQW5jaG9yUG9pbnQoZmFsc2UpCisgICAg
LCBtX2FsbG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSh0cnVlKQoreworfQorCitTY3JvbGxWaWV3
Ojp+U2Nyb2xsVmlldygpCit7CisgICAgZGVsZXRlIG1fZGF0YTsKK30KKwordm9pZCBTY3JvbGxW
aWV3OjpyZXBhaW50Q29udGVudFJlY3RhbmdsZShjb25zdCBJbnRSZWN0JiByZWN0LCBib29sIG5v
dykKK3sKKyAgICBpZiAocmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNv
bnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4o
dGhpcyk7CisgICAgaG9zdFdpbmRvdygpLT5kaXNwYXRjaENvbnRlbnRzVXBkYXRlZChmcmFtZVZp
ZXctPmZyYW1lKCksIHJlY3QpOworCisgICAgaG9zdFdpbmRvdygpLT5yZXBhaW50KGZyYW1lVmll
dy0+ZnJhbWUoKSwgY29udGVudHNUb1dpbmRvdyhyZWN0KSwgdHJ1ZSwgbm93KTsKK30KKworaW50
IFNjcm9sbFZpZXc6OnZpc2libGVXaWR0aCgpIGNvbnN0Cit7CisgICAgaW50IHcgPSBwYXJlbnQo
KSA/IHdpZHRoKCkgOiB2aWV3U2l6ZS53aWR0aCgpIDw9IDAgPyA4MDAgOiB2aWV3U2l6ZS53aWR0
aCgpOworICAgIGlmICghbV9kYXRhLT5tX2F1dG9TaG93SGlkZVNjcm9sbGJhcnMgJiYgbV9kYXRh
LT5tX3Njcm9sbGJhcnNWaXNpYmxlICYmIG1fZGF0YS0+Y2FuU2hvd1ZTY3JvbGxiYXIoKSkKKyAg
ICAgICAgdyAtPSBtX2RhdGEtPm1fdkJhci0+d2lkdGgoKTsKKyAgICByZXR1cm4gdzsKK30KKwor
aW50IFNjcm9sbFZpZXc6OnZpc2libGVIZWlnaHQoKSBjb25zdAoreworICAgIGludCBoID0gcGFy
ZW50KCkgPyBoZWlnaHQoKSA6IHZpZXdTaXplLmhlaWdodCgpIDw9IDAgPyAxMDI0IDogdmlld1Np
emUuaGVpZ2h0KCk7CisgICAgaWYgKCFtX2RhdGEtPm1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFycyAm
JiBtX2RhdGEtPm1fc2Nyb2xsYmFyc1Zpc2libGUgJiYgbV9kYXRhLT5jYW5TaG93SFNjcm9sbGJh
cigpKQorICAgICAgICBoIC09IG1fZGF0YS0+bV9oQmFyLT5oZWlnaHQoKTsKKyAgICByZXR1cm4g
aDsKK30KKworSW50UmVjdCBTY3JvbGxWaWV3Ojp2aXNpYmxlQ29udGVudFJlY3QoYm9vbCkgY29u
c3QKK3sKKyAgICByZXR1cm4gSW50UmVjdChtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LndpZHRoKCkK
KyAgICAgICAgLCBtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgpCisgICAgICAgICwgbV9k
YXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoCisgICAgICAgICwgbV9kYXRhLT5tX3Zpc2libGVD
b250ZW50c0hlaWdodAorICAgICAgICApOworfQorCitJbnRSZWN0IFNjcm9sbFZpZXc6OnZpc2li
bGVDb250ZW50UmVjdENvbnNpZGVyaW5nRXh0ZXJuYWxTY3JvbGxlcnMoKSBjb25zdAoreworICAg
IC8vIGV4dGVybmFsIHNjcm9sbGVycyBub3Qgc3VwcG9ydGVkIGZvciBub3cKKyAgICByZXR1cm4g
dmlzaWJsZUNvbnRlbnRSZWN0KCk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0Q29udGVudHNQ
b3MoaW50IG5ld1gsIGludCBuZXdZKQoreworICAgIGludCBkeCA9IG5ld1ggLSBjb250ZW50c1go
KTsKKyAgICBpbnQgZHkgPSBuZXdZIC0gY29udGVudHNZKCk7CisgICAgc2Nyb2xsQnkoZHgsIGR5
KTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRDb250ZW50c1NpemUoY29uc3QgSW50U2l6ZSYg
bmV3Q29udGVudHNTaXplKQoreworICAgIGlmIChtX2RhdGEtPm1fY29udGVudHNTaXplID09IG5l
d0NvbnRlbnRzU2l6ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9kYXRhLT5tX2NvbnRlbnRz
U2l6ZSA9IG5ld0NvbnRlbnRzU2l6ZTsKKworICAgIGhpZGVDdXJyZW50UG9wdXBNZW51KCk7CisK
KyAgICB1cGRhdGVTY3JvbGxiYXJzKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworCisgICAgaWYg
KGlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNf
Y2FzdDxGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAgICAgaWYgKEZyYW1lICpmcmFtZSA9IGZyYW1l
Vmlldy0+ZnJhbWUoKSkKKyAgICAgICAgICAgIGZyYW1lLT5wYWdlKCktPmNocm9tZSgpLT5jb250
ZW50c1NpemVDaGFuZ2VkKGZyYW1lVmlldy0+ZnJhbWUoKSwgbmV3Q29udGVudHNTaXplKTsKKyAg
ICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0RnJhbWVSZWN0KGNvbnN0IEludFJlY3QmIG5l
d0dlb21ldHJ5LCBib29sIG5lZWRzTGF5b3V0KQoreworICAgIEludFJlY3QgbmV3UmVjdDsKKyAg
ICBJbnRTaXplIG9sZFZpc2libGVDb250ZW50c1NpemUobWluKG1fZGF0YS0+bV9jb250ZW50c1Np
emUud2lkdGgoKSwgKGludCltX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgpCisgICAgICAg
ICwgbWluKG1fZGF0YS0+bV9jb250ZW50c1NpemUuaGVpZ2h0KCksIChpbnQpbV9kYXRhLT5tX3Zp
c2libGVDb250ZW50c0hlaWdodCkpOworICAgIGlmIChwYXJlbnQoKSkgeworICAgICAgICBtX2Rh
dGEtPm1fcGh5c2ljYWxHZW9tZXRyeSA9IHBhcmVudCgpLT5jb250ZW50c1RvV2luZG93KG5ld0dl
b21ldHJ5KTsKKyAgICAgICAgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoID0gbmV3R2Vv
bWV0cnkud2lkdGgoKTsKKyAgICAgICAgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCA9
IG5ld0dlb21ldHJ5LmhlaWdodCgpOworICAgICAgICBuZXdSZWN0ID0gbmV3R2VvbWV0cnk7Cisg
ICAgfSBlbHNlIHsKKyAgICAgICAgbV9kYXRhLT5tX3BoeXNpY2FsR2VvbWV0cnkgPSBuZXdHZW9t
ZXRyeTsKKyAgICAgICAgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoID0gbmV3R2VvbWV0
cnkud2lkdGgoKSAvIHNjYWxlKCk7CisgICAgICAgIG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNI
ZWlnaHQgPSBuZXdHZW9tZXRyeS5oZWlnaHQoKSAvIHNjYWxlKCk7CisgICAgICAgIG5ld1JlY3Qu
c2V0TG9jYXRpb24obmV3R2VvbWV0cnkubG9jYXRpb24oKSk7CisgICAgICAgIG5ld1JlY3Quc2V0
V2lkdGgoY2VpbChtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgpKTsKKyAgICAgICAgbmV3
UmVjdC5zZXRIZWlnaHQoY2VpbChtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0KSk7Cisg
ICAgfQorCisgICAgSW50UmVjdCBvbGRHZW9tZXRyeSA9IGZyYW1lUmVjdCgpOworICAgIFdpZGdl
dDo6c2V0RnJhbWVSZWN0KG5ld1JlY3QpOworCisgICAgaWYgKG5ld1JlY3QgPT0gb2xkR2VvbWV0
cnkpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChuZXdSZWN0LnNpemUoKSAhPSBvbGRHZW9t
ZXRyeS5zaXplKCkpIHsKKyAgICAgICAgaWYgKG5lZWRzTGF5b3V0KQorICAgICAgICAgICAgc3Rh
dGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPnNldE5lZWRzTGF5b3V0KCk7CisgICAgICAgIGlm
ICghcGFyZW50KCkpIHsKKyAgICAgICAgICAgIGJvb2wgb2xkU3VwcHJlc3NlZCA9IG1fZGF0YS0+
bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZDsKKyAgICAgICAgICAgIG1fZGF0YS0+bV9zaG93U2Ny
b2xsYmFyU3VwcHJlc3NlZCA9IHRydWU7CisgICAgICAgICAgICBJbnRTaXplIG5ld1Zpc2libGVD
b250ZW50c1NpemUobWluKG1fZGF0YS0+bV9jb250ZW50c1NpemUud2lkdGgoKSwgKGludCltX2Rh
dGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgpCisgICAgICAgICAgICAsIG1pbihtX2RhdGEtPm1f
Y29udGVudHNTaXplLmhlaWdodCgpLCAoaW50KW1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWln
aHQpKTsKKyAgICAgICAgICAgIEludFNpemUgc2Nyb2xsT2Zmc2V0ID0gbV91c2VBbmNob3JQb2lu
dAorICAgICAgICAgICAgICAgID8gbV9hbmNob3JDb250ZW50c1BvaW50IC0gbV9hbmNob3JXaW5k
b3dQb2ludCAvIHNjYWxlKCkKKyAgICAgICAgICAgICAgICA6IG1fZGF0YS0+bV9zY3JvbGxPZmZz
ZXQgKyAob2xkVmlzaWJsZUNvbnRlbnRzU2l6ZSAtIG5ld1Zpc2libGVDb250ZW50c1NpemUpICog
MC41OworICAgICAgICAgICAgdXBkYXRlU2Nyb2xsYmFycyhzY3JvbGxPZmZzZXQpOworICAgICAg
ICAgICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkID0gb2xkU3VwcHJlc3NlZDsK
KyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB1cGRhdGVTY3JvbGxiYXJzKG1fZGF0YS0+bV9z
Y3JvbGxPZmZzZXQpOworICAgIH0KKworICAgIGlmIChpc0ZyYW1lVmlldygpKSB7CisgICAgICAg
IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyk7Cisg
ICAgICAgIGlmIChGcmFtZSAqZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpCisgICAgICAgICAg
ICBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xpZW50KCktPmZyYW1lR2VvbWV0cnlDaGFuZ2Vk
KGZyYW1lVmlldy0+ZnJhbWUoKSk7CisgICAgfQorCisgICAgZnJhbWVSZWN0c0NoYW5nZWQoKTsK
K30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRTY2FsZShkb3VibGUgc2NhbGUpCit7CisgICAgc2Nh
bGUgPSBtYXgoMC4xLCBtaW4oMTAuLCBzY2FsZSkpOworICAgIGlmIChtX3NjYWxlID09IHNjYWxl
KQorICAgICAgICByZXR1cm47CisKKyAgICBtX3NjYWxlID0gc2NhbGU7CisKKyAgICBoaWRlQ3Vy
cmVudFBvcHVwTWVudSgpOworCisgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0
aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICBGcmFtZSogZnJhbWUgPSBmcmFt
ZVZpZXctPmZyYW1lKCk7CisKKyAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgZm9yIChGcmFtZSog
Y2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5maXJzdENoaWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxk
LT50cmVlKCktPm5leHRTaWJsaW5nKCkpIHsKKyAgICAgICAgICAgIGlmIChGcmFtZVZpZXcqIHZp
ZXcgPSBjaGlsZC0+dmlldygpKQorICAgICAgICAgICAgICAgIHZpZXctPnNldFNjYWxlKHNjYWxl
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcGFyZW50KCkpCisgICAgICAgIHNldEZy
YW1lUmVjdChtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSwgZmFsc2UpOworICAgIGVsc2Ugewor
ICAgICAgICBJbnRTaXplIGlubmVyU2l6ZShtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgs
IG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWlnaHQpOworICAgICAgICBpZiAobV9kYXRhLT5t
X3ZCYXIpCisgICAgICAgICAgICBtX2RhdGEtPm1fdkJhci0+c2V0RnJhbWVSZWN0KG1fZGF0YS0+
Z2V0VkJhclJlY3QoaW5uZXJTaXplKSk7CisgICAgICAgIGlmIChtX2RhdGEtPm1faEJhcikKKyAg
ICAgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRGcmFtZVJlY3QobV9kYXRhLT5nZXRIQmFyUmVj
dChpbm5lclNpemUpKTsKKyAgICB9Cit9CisKK2ludCBTY3JvbGxWaWV3Ojpjb250ZW50c1goKSBj
b25zdAoreworICAgIHJldHVybiBzY3JvbGxPZmZzZXQoKS53aWR0aCgpOworfQorCitpbnQgU2Ny
b2xsVmlldzo6Y29udGVudHNZKCkgY29uc3QKK3sKKyAgICByZXR1cm4gc2Nyb2xsT2Zmc2V0KCku
aGVpZ2h0KCk7Cit9CisKK2ludCBTY3JvbGxWaWV3Ojpjb250ZW50c1dpZHRoKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gbV9kYXRhLT5tX2NvbnRlbnRzU2l6ZS53aWR0aCgpOworfQorCitpbnQgU2Ny
b2xsVmlldzo6Y29udGVudHNIZWlnaHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1f
Y29udGVudHNTaXplLmhlaWdodCgpOworfQorCitJbnRSZWN0IFNjcm9sbFZpZXc6OmNvbnRlbnRz
VG9XaW5kb3coY29uc3QgSW50UmVjdCYgcmVjdCkgY29uc3QKK3sKKyAgICByZXR1cm4gSW50UmVj
dChjb250ZW50c1RvV2luZG93KHJlY3QubG9jYXRpb24oKSksIHJlY3Quc2l6ZSgpICogc2NhbGUo
KSk7Cit9CisKK0ludFJlY3QgU2Nyb2xsVmlldzo6d2luZG93VG9Db250ZW50cyhjb25zdCBJbnRS
ZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVybiBJbnRSZWN0KHdpbmRvd1RvQ29udGVudHMo
cmVjdC5sb2NhdGlvbigpKSwgcmVjdC5zaXplKCkgLyBzY2FsZSgpKTsKK30KKworSW50UG9pbnQg
U2Nyb2xsVmlldzo6d2luZG93VG9Db250ZW50cyhjb25zdCBJbnRQb2ludCYgd2luZG93UG9pbnQp
IGNvbnN0Cit7CisgICAgaWYgKHBhcmVudCgpKSB7CisgICAgICAgIEludFBvaW50IG9yaWdpbiA9
IHBhcmVudCgpLT5jb250ZW50c1RvV2luZG93KGZyYW1lUmVjdCgpLmxvY2F0aW9uKCkpOworICAg
ICAgICByZXR1cm4gSW50UG9pbnQoKSArICh3aW5kb3dQb2ludCAtIG9yaWdpbikgLyBzY2FsZSgp
ICsgc2Nyb2xsT2Zmc2V0KCk7CisgICAgfQorCisgICAgcmV0dXJuICh3aW5kb3dQb2ludCAtIElu
dFNpemUoeCgpLCB5KCkpKSAvIHNjYWxlKCkgKyBzY3JvbGxPZmZzZXQoKTsKK30KKworSW50UG9p
bnQgU2Nyb2xsVmlldzo6Y29udGVudHNUb1dpbmRvdyhjb25zdCBJbnRQb2ludCYgY29udGVudHNQ
b2ludCkgY29uc3QKK3sKKyAgICBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgSW50UG9pbnQgb3Jp
Z2luID0gcGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3coZnJhbWVSZWN0KCkubG9jYXRpb24oKSk7
CisgICAgICAgIHJldHVybiBvcmlnaW4gKyAoKGNvbnRlbnRzUG9pbnQgLSBzY3JvbGxPZmZzZXQo
KSkgKiBzY2FsZSgpIC0gSW50UG9pbnQoKSk7CisgICAgfQorCisgICAgcmV0dXJuIChjb250ZW50
c1BvaW50IC0gc2Nyb2xsT2Zmc2V0KCkpICogc2NhbGUoKSArIEludFNpemUoeCgpLCB5KCkpOwor
fQorCitJbnRQb2ludCBTY3JvbGxWaWV3Ojpjb252ZXJ0Q2hpbGRUb1NlbGYoY29uc3QgV2lkZ2V0
KiBjaGlsZCwgY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIEludFBvaW50IG5l
d1BvaW50ID0gcG9pbnQ7CisgICAgaWYgKGNoaWxkICE9IG1fZGF0YS0+bV9oQmFyICYmIGNoaWxk
ICE9IG1fZGF0YS0+bV92QmFyKQorICAgICAgICBuZXdQb2ludCA9IHBvaW50IC0gc2Nyb2xsT2Zm
c2V0KCk7CisgICAgcmV0dXJuIFdpZGdldDo6Y29udmVydENoaWxkVG9TZWxmKGNoaWxkLCBuZXdQ
b2ludCk7Cit9CisKK0ludFBvaW50IFNjcm9sbFZpZXc6OmNvbnZlcnRTZWxmVG9DaGlsZChjb25z
dCBXaWRnZXQqIGNoaWxkLCBjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgSW50
UG9pbnQgbmV3UG9pbnQgPSBwb2ludDsKKyAgICBpZiAoY2hpbGQgIT0gbV9kYXRhLT5tX2hCYXIg
JiYgY2hpbGQgIT0gbV9kYXRhLT5tX3ZCYXIpCisgICAgICAgIG5ld1BvaW50ID0gcG9pbnQgKyBz
Y3JvbGxPZmZzZXQoKTsKKyAgICByZXR1cm4gV2lkZ2V0Ojpjb252ZXJ0U2VsZlRvQ2hpbGQoY2hp
bGQsIG5ld1BvaW50KTsKK30KKworSW50U2l6ZSBTY3JvbGxWaWV3OjpzY3JvbGxPZmZzZXQoKSBj
b25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0OworfQorCitJbnRTaXpl
IFNjcm9sbFZpZXc6Om1heGltdW1TY3JvbGwoKSBjb25zdAoreworICAgIEludFNpemUgZGVsdGEg
PSBtX2RhdGEtPm1fY29udGVudHNTaXplIC0gSW50U2l6ZSh3aWR0aCgpLCBoZWlnaHQoKSkgLSBt
X2RhdGEtPm1fc2Nyb2xsT2Zmc2V0OworICAgIGRlbHRhLmNsYW1wTmVnYXRpdmVUb1plcm8oKTsK
KyAgICByZXR1cm4gZGVsdGE7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xsQnkoaW50IGR4
LCBpbnQgZHkpCit7CisgICAgaWYgKCFkeCAmJiAhZHkpCisgICAgICAgIHJldHVybjsKKworICAg
IGhpZGVDdXJyZW50UG9wdXBNZW51KCk7CisKKyAgICBib29sIG9sZFN1cHByZXNzZWQgPSBtX2Rh
dGEtPm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQ7CisgICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxi
YXJTdXBwcmVzc2VkID0gdHJ1ZTsKKworICAgIEludFNpemUgb2xkT2Zmc2V0KG1fZGF0YS0+bV9z
Y3JvbGxPZmZzZXQpOworCisgICAgaWYgKG1fZGF0YS0+bV9oQmFyICYmIGR4KQorICAgICAgICBt
X2RhdGEtPm1faEJhci0+c2V0VmFsdWUob2xkT2Zmc2V0LndpZHRoKCkgKyBkeCk7CisKKyAgICBp
ZiAobV9kYXRhLT5tX3ZCYXIgJiYgZHkpCisgICAgICAgIG1fZGF0YS0+bV92QmFyLT5zZXRWYWx1
ZShvbGRPZmZzZXQuaGVpZ2h0KCkgKyBkeSk7CisKKyAgICBtX2RhdGEtPm1fc2hvd1Njcm9sbGJh
clN1cHByZXNzZWQgPSBvbGRTdXBwcmVzc2VkOworCisgICAgaWYgKCFtX2RhdGEtPm1fc2hvd1Nj
cm9sbGJhclN1cHByZXNzZWQpIHsKKyAgICAgICAgSW50U2l6ZSBkZWx0YSA9IG1fZGF0YS0+bV9z
Y3JvbGxPZmZzZXQgLSBvbGRPZmZzZXQ7CisgICAgICAgIG1fZGF0YS0+c2Nyb2xsQmFja2luZ1N0
b3JlKGRlbHRhKTsKKyAgICAgICAgLy9zdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKS0+ZnJh
bWUoKS0+c2VuZFNjcm9sbEV2ZW50KCk7CisgICAgICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVW
aWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgICAgIGlmIChG
cmFtZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAgICAgIGlmIChmcmFt
ZS0+c2hvdWxkQmxpbmtDYXJldCgpKQorICAgICAgICAgICAgICAgIGhvc3RXaW5kb3coKS0+Y2Fy
ZXRSZWN0Q2hhbmdlZCgpOworICAgICAgICB9CisgICAgICAgIG1fZGF0YS0+c2hvd1Njcm9sbGJh
cnMoZGVsdGEud2lkdGgoKSAhPSAwLCBkZWx0YS5oZWlnaHQoKSAhPSAwLCBmYWxzZSk7CisgICAg
fQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW92ZVJhbmdlVG9Db250YWluUmFuZ2UoaW50JiBj
b250YWluZXJTdGFydCwgaW50IGNvbnRhaW5lcldpZHRoLCBpbnQgdGFyZ2V0U3RhcnQsIGludCB0
YXJnZXRXaWR0aCkKK3sKKyAgICBpbnQgdGFyZ2V0RW5kID0gdGFyZ2V0U3RhcnQgKyB0YXJnZXRX
aWR0aDsKKyAgICBpZiAoY29udGFpbmVyU3RhcnQgKyBjb250YWluZXJXaWR0aCA8IHRhcmdldEVu
ZCkgeworICAgICAgICBpZiAoY29udGFpbmVyU3RhcnQgPiB0YXJnZXRTdGFydCkKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgY29udGFpbmVyU3RhcnQgPSB0YXJnZXRFbmQgLSBjb250YWlu
ZXJXaWR0aDsKKyAgICB9CisKKyAgICBpZiAoY29udGFpbmVyU3RhcnQgPiB0YXJnZXRTdGFydCkK
KyAgICAgICAgY29udGFpbmVyU3RhcnQgPSB0YXJnZXRTdGFydDsKK30KKwordm9pZCBTY3JvbGxW
aWV3OjpzY3JvbGxSZWN0SW50b1ZpZXdNaW5pbXVtU2Nyb2xsKGNvbnN0IEludFJlY3QmIHIpCit7
CisgICAgU2Nyb2xsVmlldyogdmlldyA9IHRoaXM7CisgICAgSW50UG9pbnQgY3VyUG9zID0gci5s
b2NhdGlvbigpOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHggPSB2aWV3LT5jb250ZW50
c1goKTsKKyAgICAgICAgaW50IHkgPSB2aWV3LT5jb250ZW50c1koKTsKKyAgICAgICAgbW92ZVJh
bmdlVG9Db250YWluUmFuZ2UoeCwgdmlldy0+bV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRo
LCBjdXJQb3MueCgpLCByLndpZHRoKCkpOworICAgICAgICBtb3ZlUmFuZ2VUb0NvbnRhaW5SYW5n
ZSh5LCB2aWV3LT5tX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0LCBjdXJQb3MueSgpLCBy
LmhlaWdodCgpKTsKKworICAgICAgICB2aWV3LT5zZXRDb250ZW50c1Bvcyh4LCB5KTsKKworICAg
ICAgICBpZiAoU2Nyb2xsVmlldyogbmV4dFZpZXcgPSBzdGF0aWNfY2FzdDxTY3JvbGxWaWV3Kj4o
dmlldy0+cGFyZW50KCkpKSB7CisgICAgICAgICAgICBjdXJQb3MubW92ZSh2aWV3LT54KCkgLSB2
aWV3LT5jb250ZW50c1goKSwgdmlldy0+eSgpIC0gdmlldy0+Y29udGVudHNZKCkpOworICAgICAg
ICAgICAgdmlldyA9IG5leHRWaWV3OworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIGJyZWFr
OworICAgIH0KKyAgICAvL3N0YXRpY19jYXN0PEZyYW1lVmlldyo+KHRoaXMpLT5mcmFtZSgpLT5z
ZW5kU2Nyb2xsRXZlbnQoKTsKKyAgICBjb25zdCBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRp
Y19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAgIGlmIChGcmFtZSogZnJhbWUgPSBm
cmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAgaWYgKGZyYW1lLT5zaG91bGRCbGlua0NhcmV0
KCkpCisgICAgICAgICAgICBob3N0V2luZG93KCktPmNhcmV0UmVjdENoYW5nZWQoKTsKKyAgICB9
Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xsUmVjdEludG9WaWV3UmVjdXJzaXZlbHkoY29u
c3QgSW50UmVjdCYgcikKK3sKKyAgICBTY3JvbGxWaWV3KiB2aWV3ID0gdGhpczsKKyAgICBJbnRQ
b2ludCBjdXJQb3MgPSByLmxvY2F0aW9uKCk7CisgICAgZm9yICg7OykgeworICAgICAgICB2aWV3
LT5zZXRDb250ZW50c1BvcyhjdXJQb3MueCgpLCBjdXJQb3MueSgpKTsKKworICAgICAgICB2aWV3
ID0gc3RhdGljX2Nhc3Q8U2Nyb2xsVmlldyo+KHZpZXctPnBhcmVudCgpKTsKKyAgICAgICAgaWYg
KHZpZXcpCisgICAgICAgICAgICBjdXJQb3MubW92ZSh2aWV3LT54KCkgLSB2aWV3LT5jb250ZW50
c1goKSwgdmlldy0+eSgpIC0gdmlldy0+Y29udGVudHNZKCkpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBicmVhazsKKyAgICB9CisgICAgLy9zdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlz
KS0+ZnJhbWUoKS0+c2VuZFNjcm9sbEV2ZW50KCk7CisgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFt
ZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICBpZiAoRnJh
bWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpKSB7CisgICAgICAgIGlmIChmcmFtZS0+c2hv
dWxkQmxpbmtDYXJldCgpKQorICAgICAgICAgICAgaG9zdFdpbmRvdygpLT5jYXJldFJlY3RDaGFu
Z2VkKCk7CisgICAgfQorfQorCitXZWJDb3JlOjpTY3JvbGxiYXJNb2RlIFNjcm9sbFZpZXc6Omhv
cml6b250YWxTY3JvbGxiYXJNb2RlKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX2hT
Y3JvbGxiYXJNb2RlOworfQorCitXZWJDb3JlOjpTY3JvbGxiYXJNb2RlIFNjcm9sbFZpZXc6OnZl
cnRpY2FsU2Nyb2xsYmFyTW9kZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV92U2Ny
b2xsYmFyTW9kZTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRTY3JvbGxiYXJzU3VwcHJlc3Nl
ZChib29sIHN1cHByZXNzZWQsIGJvb2wgcmVwYWludE9uU3VwcHJlc3MpCit7CisgICAgbV9kYXRh
LT5tX3Njcm9sbGJhcnNTdXBwcmVzc2VkID0gc3VwcHJlc3NlZDsKKyAgICBpZiAocmVwYWludE9u
U3VwcHJlc3MgJiYgIXN1cHByZXNzZWQpCisgICAgICAgIG1fZGF0YS0+aW52YWxpZGF0ZVNjcm9s
bGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0SG9yaXpv
bnRhbFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFyTW9kZSBuZXdNb2RlKQoreworICAgIGlmIChtX2Fs
bG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSAmJiBtX2RhdGEtPm1faFNjcm9sbGJhck1vZGUgIT0g
bmV3TW9kZSkgeworICAgICAgICBtX2RhdGEtPm1faFNjcm9sbGJhck1vZGUgPSBuZXdNb2RlOwor
ICAgICAgICB1cGRhdGVTY3JvbGxiYXJzKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIH0K
K30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRWZXJ0aWNhbFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFy
TW9kZSBuZXdNb2RlKQoreworICAgIGlmIChtX2FsbG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSAm
JiBtX2RhdGEtPm1fdlNjcm9sbGJhck1vZGUgIT0gbmV3TW9kZSkgeworICAgICAgICBtX2RhdGEt
Pm1fdlNjcm9sbGJhck1vZGUgPSBuZXdNb2RlOworICAgICAgICB1cGRhdGVTY3JvbGxiYXJzKG1f
ZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRT
Y3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJNb2RlIGhvcml6b250YWxNb2RlLCBTY3JvbGxiYXJNb2Rl
IHZlcnRpY2FsTW9kZSkKK3sKKyAgICBzZXRIb3Jpem9udGFsU2Nyb2xsYmFyTW9kZShob3Jpem9u
dGFsTW9kZSk7CisgICAgc2V0VmVydGljYWxTY3JvbGxiYXJNb2RlKHZlcnRpY2FsTW9kZSk7Cit9
CisKK3ZvaWQgU2Nyb2xsVmlldzo6dXBkYXRlU2Nyb2xsYmFycyhjb25zdCBJbnRTaXplJiBkZXNp
cmVkT2Zmc2V0KQoreworICAgIC8vIERvbid0IGFsbG93IHJlLWVudHJhbmN5IGludG8gdGhpcyBm
dW5jdGlvbi4KKyAgICBpZiAobV9kYXRhLT5tX2luVXBkYXRlU2Nyb2xsYmFycykKKyAgICAgICAg
cmV0dXJuOworCisgICAgLy8gRklYTUU6IFRoaXMgY29kZSBpcyBoZXJlIHNvIHdlIGRvbid0IGhh
dmUgdG8gZm9yayBGcmFtZVZpZXcuaC8uY3BwLgorICAgIC8vIEluIHRoZSBlbmQsIEZyYW1lVmll
dyBzaG91bGQganVzdCBtZXJnZSB3aXRoIFNjcm9sbFZpZXcuCisgICAgRnJhbWUqIGZyYW1lID0g
c3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyktPmZyYW1lKCk7CisgICAgaWYgKCFm
cmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgbV9kYXRhLT5tX2luVXBkYXRlU2Nyb2xsYmFy
cyA9IHRydWU7CisgICAgYm9vbCB1c2VyU2Nyb2xsID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVW
aWV3Kj4odGhpcyktPndhc1Njcm9sbGVkQnlVc2VyKCk7CisKKyAgICBib29sIGhhc1ZlcnRpY2Fs
U2Nyb2xsYmFyID0gbV9kYXRhLT5tX3ZCYXI7CisgICAgYm9vbCBoYXNIb3Jpem9udGFsU2Nyb2xs
YmFyID0gbV9kYXRhLT5tX2hCYXI7CisgICAgYm9vbCBvbGRIYXNWZXJ0aWNhbCA9IGhhc1ZlcnRp
Y2FsU2Nyb2xsYmFyOworICAgIGJvb2wgb2xkSGFzSG9yaXpvbnRhbCA9IGhhc0hvcml6b250YWxT
Y3JvbGxiYXI7CisgICAgU2Nyb2xsYmFyTW9kZSBoU2Nyb2xsID0gbV9kYXRhLT5tX2hTY3JvbGxi
YXJNb2RlOworICAgIFNjcm9sbGJhck1vZGUgdlNjcm9sbCA9IG1fZGF0YS0+bV92U2Nyb2xsYmFy
TW9kZTsKKworICAgIGludCBjV2lkdGggPSBjb250ZW50c1dpZHRoKCk7CisgICAgaW50IGNIZWln
aHQgPSBjb250ZW50c0hlaWdodCgpOworICAgIGludCB2V2lkdGggPSB3aWR0aCgpOworICAgIGlu
dCB2SGVpZ2h0ID0gaGVpZ2h0KCk7CisKKyAgICBpbnQgcGFnZUtlZXAgPSBjQW1vdW50VG9LZWVw
V2hlblBhZ2luZzsKKyAgICBpbnQgbGluZVN0ZXAgPSBjU2Nyb2xsYmFyUGl4ZWxzUGVyTGluZVN0
ZXA7CisKKyAgICBpZiAoIW1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3NlZCAmJiAoaFNjcm9s
bCA9PSBTY3JvbGxiYXJBdXRvIHx8IHZTY3JvbGwgPT0gU2Nyb2xsYmFyQXV0bykpIHsKKyAgICAg
ICAgZm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCAyOyArK3Bhc3MpIHsKKyAgICAgICAgICAgIC8v
IERvIGEgbGF5b3V0IGlmIHBlbmRpbmcgYmVmb3JlIGNoZWNraW5nIGlmIHNjcm9sbGJhcnMgYXJl
IG5lZWRlZC4KKyAgICAgICAgICAgIGlmIChoYXNWZXJ0aWNhbFNjcm9sbGJhciAhPSBvbGRIYXNW
ZXJ0aWNhbCB8fCBoYXNIb3Jpem9udGFsU2Nyb2xsYmFyICE9IG9sZEhhc0hvcml6b250YWwpIHsK
KyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKS0+bGF5b3V0SWZO
ZWVkZWRSZWN1cnNpdmUoKTsKKyAgICAgICAgICAgICAgICAvLyBBZnRlciByZS1sYXlvdXQsIGNv
bnRlbnRzIHNpemUgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBjV2lkdGggPSBj
b250ZW50c1dpZHRoKCk7CisgICAgICAgICAgICAgICAgY0hlaWdodCA9IGNvbnRlbnRzSGVpZ2h0
KCk7CisgICAgICAgICAgICAgICAgdldpZHRoID0gd2lkdGgoKTsKKyAgICAgICAgICAgICAgICB2
SGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgc2Ny
b2xsc1ZlcnRpY2FsbHkgPSBjSGVpZ2h0ID4gdkhlaWdodDsKKyAgICAgICAgICAgIGJvb2wgc2Ny
b2xsc0hvcml6b250YWxseSA9IGNXaWR0aCA+IHZXaWR0aDsKKworICAgICAgICAgICAgaWYgKGhh
c1ZlcnRpY2FsU2Nyb2xsYmFyICE9IHNjcm9sbHNWZXJ0aWNhbGx5KSB7CisgICAgICAgICAgICAg
ICAgbV9kYXRhLT5pbnZhbGlkYXRlU2Nyb2xsYmFycyhmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAg
ICAgICAgICAgICAgIG1fZGF0YS0+c2V0SGFzVmVydGljYWxTY3JvbGxiYXIoc2Nyb2xsc1ZlcnRp
Y2FsbHkpOworICAgICAgICAgICAgICAgIGhhc1ZlcnRpY2FsU2Nyb2xsYmFyID0gc2Nyb2xsc1Zl
cnRpY2FsbHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYXNIb3Jpem9udGFs
U2Nyb2xsYmFyICE9IHNjcm9sbHNIb3Jpem9udGFsbHkpIHsKKyAgICAgICAgICAgICAgICBtX2Rh
dGEtPmludmFsaWRhdGVTY3JvbGxiYXJzKHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAg
ICAgICAgbV9kYXRhLT5zZXRIYXNIb3Jpem9udGFsU2Nyb2xsYmFyKHNjcm9sbHNIb3Jpem9udGFs
bHkpOworICAgICAgICAgICAgICAgIGhhc0hvcml6b250YWxTY3JvbGxiYXIgPSBzY3JvbGxzSG9y
aXpvbnRhbGx5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gU2V0
IHVwIHRoZSByYW5nZSAoYW5kIHBhZ2Ugc3RlcC9saW5lIHN0ZXApLgorICAgIEludFNpemUgbWF4
U2Nyb2xsUG9zaXRpb24oY1dpZHRoIC0gdldpZHRoLCBjSGVpZ2h0IC0gdkhlaWdodCk7CisgICAg
SW50U2l6ZSBzY3JvbGwgPSBkZXNpcmVkT2Zmc2V0LnNocnVua1RvKG1heFNjcm9sbFBvc2l0aW9u
KTsKKyAgICBzY3JvbGwuY2xhbXBOZWdhdGl2ZVRvWmVybygpOworCisgICAgLy8gbV92QmFyLT5z
ZXRWYWx1ZSgpIGFuZCBtX2hCYXItPnNldFZhbHVlKCkgd2lsbCB1cGRhdGVkIHNjcm9sbCBvZmZz
ZXRzIGFuZCBhbHNvIHNjcm9sbGVkIGJhY2tpbmcgc3RvcmUKKyAgICBJbnRTaXplIG9sZFNjcm9s
bE9mZnNldCA9IG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQ7CisgICAgaWYgKCFtX2RhdGEtPm1faEJh
cikKKyAgICAgICAgbV9kYXRhLT5tX3Njcm9sbE9mZnNldC5zZXRXaWR0aCgwKTsKKworICAgIGlm
ICghbV9kYXRhLT5tX3ZCYXIpCisgICAgICAgIG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQuc2V0SGVp
Z2h0KDApOworCisgICAgaWYgKG9sZFNjcm9sbE9mZnNldCAhPSBtX2RhdGEtPm1fc2Nyb2xsT2Zm
c2V0KQorICAgICAgICBtX2RhdGEtPnNjcm9sbEJhY2tpbmdTdG9yZShJbnRTaXplKG1fZGF0YS0+
bV9zY3JvbGxPZmZzZXQgLSBvbGRTY3JvbGxPZmZzZXQpKTsKKworICAgIEludFNpemUgaW5uZXJT
aXplKG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNXaWR0aCwgbV9kYXRhLT5tX3Zpc2libGVDb250
ZW50c0hlaWdodCk7CisgICAgaWYgKG1fZGF0YS0+bV9oQmFyKSB7CisgICAgICAgIG1fZGF0YS0+
bV9oQmFyLT5zZXRFbmFibGVkKGNXaWR0aCA+IHZXaWR0aCk7CisgICAgICAgIGludCBwYWdlU3Rl
cCA9IHZXaWR0aCAtIHBhZ2VLZWVwOworICAgICAgICBpZiAocGFnZVN0ZXAgPCAwKSBwYWdlU3Rl
cCA9IHZXaWR0aDsKKyAgICAgICAgSW50UmVjdCBvbGRSZWN0KG1fZGF0YS0+bV9oQmFyLT5mcmFt
ZVJlY3QoKSk7CisgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRSZWN0KG1fZGF0YS0+Z2V0SEJh
clJlY3QoaW5uZXJTaXplKSk7CisgICAgICAgIGlmICghbV9kYXRhLT5tX3Njcm9sbGJhcnNTdXBw
cmVzc2VkICYmIG9sZFJlY3QgIT0gbV9kYXRhLT5tX2hCYXItPmZyYW1lUmVjdCgpKQorICAgICAg
ICAgICAgbV9kYXRhLT5pbnZhbGlkYXRlU2Nyb2xsYmFycyh0cnVlLCBmYWxzZSwgZmFsc2UpOwor
CisgICAgICAgIGlmIChtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQpCisgICAgICAgICAg
ICBtX2RhdGEtPm1faEJhci0+c2V0U3VwcHJlc3NJbnZhbGlkYXRpb24odHJ1ZSk7CisgICAgICAg
IG1fZGF0YS0+bV9oQmFyLT5zZXRTdGVwcyhsaW5lU3RlcCwgcGFnZVN0ZXApOworICAgICAgICBt
X2RhdGEtPm1faEJhci0+c2V0UHJvcG9ydGlvbih2V2lkdGgsIGNXaWR0aCk7CisgICAgICAgIG1f
ZGF0YS0+bV9oQmFyLT5zZXRWYWx1ZShzY3JvbGwud2lkdGgoKSk7CisgICAgICAgIGlmIChtX2Rh
dGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQpCisgICAgICAgICAgICBtX2RhdGEtPm1faEJhci0+
c2V0U3VwcHJlc3NJbnZhbGlkYXRpb24oZmFsc2UpOworICAgIH0KKworICAgIGlmIChtX2RhdGEt
Pm1fdkJhcikgeworICAgICAgICBtX2RhdGEtPm1fdkJhci0+c2V0RW5hYmxlZChjSGVpZ2h0ID4g
dkhlaWdodCk7CisgICAgICAgIGludCBwYWdlU3RlcCA9IHZIZWlnaHQgLSBwYWdlS2VlcDsKKyAg
ICAgICAgaWYgKHBhZ2VTdGVwIDwgMCkgcGFnZVN0ZXAgPSB2SGVpZ2h0OworICAgICAgICBJbnRS
ZWN0IG9sZFJlY3QobV9kYXRhLT5tX3ZCYXItPmZyYW1lUmVjdCgpKTsKKyAgICAgICAgbV9kYXRh
LT5tX3ZCYXItPnNldFJlY3QobV9kYXRhLT5nZXRWQmFyUmVjdChpbm5lclNpemUpKTsKKyAgICAg
ICAgaWYgKCFtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQgJiYgb2xkUmVjdCAhPSBtX2Rh
dGEtPm1fdkJhci0+ZnJhbWVSZWN0KCkpCisgICAgICAgICAgICBtX2RhdGEtPmludmFsaWRhdGVT
Y3JvbGxiYXJzKGZhbHNlLCB0cnVlLCBmYWxzZSk7CisKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9z
Y3JvbGxiYXJzU3VwcHJlc3NlZCkKKyAgICAgICAgICAgIG1fZGF0YS0+bV92QmFyLT5zZXRTdXBw
cmVzc0ludmFsaWRhdGlvbih0cnVlKTsKKyAgICAgICAgbV9kYXRhLT5tX3ZCYXItPnNldFN0ZXBz
KGxpbmVTdGVwLCBwYWdlU3RlcCk7CisgICAgICAgIG1fZGF0YS0+bV92QmFyLT5zZXRQcm9wb3J0
aW9uKHZIZWlnaHQsIGNIZWlnaHQpOworICAgICAgICBtX2RhdGEtPm1fdkJhci0+c2V0VmFsdWUo
c2Nyb2xsLmhlaWdodCgpKTsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJl
c3NlZCkKKyAgICAgICAgICAgIG1fZGF0YS0+bV92QmFyLT5zZXRTdXBwcmVzc0ludmFsaWRhdGlv
bihmYWxzZSk7CisgICAgfQorCisgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPnNl
dFdhc1Njcm9sbGVkQnlVc2VyKHVzZXJTY3JvbGwpOworICAgIG1fZGF0YS0+bV9pblVwZGF0ZVNj
cm9sbGJhcnMgPSBmYWxzZTsKK30KKworU2Nyb2xsYmFyKiBTY3JvbGxWaWV3OjpzY3JvbGxiYXJB
dFBvaW50KGNvbnN0IEludFBvaW50JiB3aW5kb3dQb2ludCkKK3sKKyAgICBpZiAobV9kYXRhLT5t
X3Njcm9sbGJhcnNWaXNpYmxlICYmIChtX2RhdGEtPmNhblNob3dIU2Nyb2xsYmFyKCkgfHwgbV9k
YXRhLT5jYW5TaG93VlNjcm9sbGJhcigpKSkgeworICAgICAgICBJbnRQb2ludCB2aWV3UG9pbnQg
PSB3aW5kb3dUb0NvbnRlbnRzKHdpbmRvd1BvaW50KSAtIHNjcm9sbE9mZnNldCgpOworICAgICAg
ICBpZiAobV9kYXRhLT5jYW5TaG93SFNjcm9sbGJhcigpICYmIG1fZGF0YS0+bV9oQmFyLT5mcmFt
ZVJlY3QoKS5jb250YWlucyh2aWV3UG9pbnQpKQorICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS0+
bV9oQmFyLmdldCgpOworICAgICAgICBpZiAobV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigpICYm
IG1fZGF0YS0+bV92QmFyLT5mcmFtZVJlY3QoKS5jb250YWlucyh2aWV3UG9pbnQpKQorICAgICAg
ICAgICAgcmV0dXJuIG1fZGF0YS0+bV92QmFyLmdldCgpOworICAgIH0KKworICAgIHJldHVybiAw
OworfQorCitib29sIFNjcm9sbFZpZXc6OnNjcm9sbGJhcnNNb3VzZVByZXNzRXZlbnQoY29uc3Qg
UGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50KQoreworICAgIGlmIChwYXJlbnQoKQorICAg
ICAgICA/IG1fZGF0YS0+Z2V0VmlzaWJsZUNvbnRlbnRSZWN0KCkuY29udGFpbnMocGFyZW50KCkt
PndpbmRvd1RvQ29udGVudHMobW91c2VFdmVudC5wb3MoKSkpCisgICAgICAgIDogdmlzaWJsZVdp
bmRvd1JlY3QoKS5jb250YWlucyhtb3VzZUV2ZW50LnBvcygpKSkgeworCisgICAgICAgIGNvbnN0
IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhp
cyk7CisgICAgICAgIEZyYW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUoKTsKKworICAgICAg
ICBpZiAoZnJhbWUpIHsKKyAgICAgICAgICAgIGZvciAoRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRy
ZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2li
bGluZygpKSB7CisgICAgICAgICAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gY2hpbGQtPnZpZXco
KTsKKyAgICAgICAgICAgICAgICBpZiAodmlldyAmJiB2aWV3LT5zY3JvbGxiYXJzTW91c2VQcmVz
c0V2ZW50KG1vdXNlRXZlbnQpKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEludFBvaW50IHZpZXdQb2ludCA9IHdp
bmRvd1RvQ29udGVudHMobW91c2VFdmVudC5wb3MoKSk7CisgICAgICAgIGZvciAoSGFzaFNldDxS
ZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRvciBpID0gbV9kYXRhLT5tX2NoaWxkcmVuLmJlZ2luKCk7
IGkgIT0gbV9kYXRhLT5tX2NoaWxkcmVuLmVuZCgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmICgh
KCppKS0+aXNTY3JvbGxiYXIoKSB8fCAoKmkpLT5pc1ZpZXdTY3JvbGxiYXIoKSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIFBsYXRmb3JtU2Nyb2xsYmFyKiBzY3JvbGxi
YXIgPSBzdGF0aWNfY2FzdDxQbGF0Zm9ybVNjcm9sbGJhcio+KGktPmdldCgpKTsKKyAgICAgICAg
ICAgIGlmIChzY3JvbGxiYXItPmlzVmlzaWJsZSgpICYmIHNjcm9sbGJhci0+ZnJhbWVSZWN0KCku
Y29udGFpbnModmlld1BvaW50KSkgeworICAgICAgICAgICAgICAgIG1fZGF0YS0+bV9wcmV2U2Ny
b2xsYmFyVW5kZXJNb3VzZSA9IHNjcm9sbGJhcjsKKyAgICAgICAgICAgICAgICBpZiAobV9kYXRh
LT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlICYmIG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5k
ZXJNb3VzZS0+aXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9kYXRhLT5tX3By
ZXZTY3JvbGxiYXJVbmRlck1vdXNlLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQobW91c2VFdmVudCk7
CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtX2RhdGEtPm1fcHJldk1vdXNlRG93biA9IHRy
dWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAg
ICAgcmV0dXJuIG1fZGF0YS0+bV9wcmV2TW91c2VEb3duID0gZmFsc2U7CisgICAgfQorCisgICAg
bV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlID0gc3RhdGljX2Nhc3Q8UGxhdGZvcm1T
Y3JvbGxiYXIqPihzY3JvbGxiYXJBdFBvaW50KG1vdXNlRXZlbnQucG9zKCkpKTsKKyAgICBpZiAo
bV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlICYmIG1fZGF0YS0+bV9wcmV2U2Nyb2xs
YmFyVW5kZXJNb3VzZS0+aXNFbmFibGVkKCkpIHsKKyAgICAgICAgbV9kYXRhLT5tX3ByZXZTY3Jv
bGxiYXJVbmRlck1vdXNlLT5oYW5kbGVNb3VzZVByZXNzRXZlbnQobW91c2VFdmVudCk7CisgICAg
ICAgIHJldHVybiBtX2RhdGEtPm1fcHJldk1vdXNlRG93biA9IHRydWU7CisgICAgfQorCisgICAg
cmV0dXJuIG1fZGF0YS0+bV9wcmV2TW91c2VEb3duID0gZmFsc2U7Cit9CisKK2Jvb2wgU2Nyb2xs
Vmlldzo6c2Nyb2xsYmFyc01vdXNlTW92ZUV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYg
bW91c2VFdmVudCkKK3sKKyAgICBpZiAobV9kYXRhLT5tX3ByZXZNb3VzZURvd24pIHsKKyAgICAg
ICAgaWYgKG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZSkKKyAgICAgICAgICAgIG1f
ZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZS0+aGFuZGxlTW91c2VNb3ZlRXZlbnQobW91
c2VFdmVudCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGNvbnN0IEZyYW1l
VmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7Cisg
ICAgRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpOworCisgICAgaWYgKGZyYW1lKSB7
CisgICAgICAgIGZvciAoRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRyZWUoKS0+Zmlyc3RDaGlsZCgp
OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGluZygpKSB7CisgICAgICAg
ICAgICBGcmFtZVZpZXcqIHZpZXcgPSBjaGlsZC0+dmlldygpOworICAgICAgICAgICAgaWYgKHZp
ZXcgJiYgdmlldy0+c2Nyb2xsYmFyc01vdXNlTW92ZUV2ZW50KG1vdXNlRXZlbnQpKQorICAgICAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZh
bHNlOworfQorCitib29sIFNjcm9sbFZpZXc6OnNjcm9sbGJhcnNNb3VzZVJlbGVhc2VFdmVudChj
b25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIG1vdXNlRXZlbnQpCit7CisgICAgYm9vbCBwcmV2TW91
c2VEb3duID0gbV9kYXRhLT5tX3ByZXZNb3VzZURvd247CisgICAgbV9kYXRhLT5tX3ByZXZNb3Vz
ZURvd24gPSBmYWxzZTsKKworICAgIGlmIChwcmV2TW91c2VEb3duKSB7CisgICAgICAgIGlmICht
X2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91c2UpCisgICAgICAgICAgICBtX2RhdGEtPm1f
cHJldlNjcm9sbGJhclVuZGVyTW91c2UtPmhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KG1vdXNlRXZl
bnQpOworICAgICAgICBtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91c2UgPSAwOworICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBjb25zdCBGcmFtZVZpZXcqIGZyYW1lVmll
dyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAgIEZyYW1lKiBmcmFt
ZSA9IGZyYW1lVmlldy0+ZnJhbWUoKTsKKworICAgIGlmIChmcmFtZSkgeworICAgICAgICBmb3Ig
KEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVlKCktPmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxk
ID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgRnJhbWVWaWV3
KiB2aWV3ID0gY2hpbGQtPnZpZXcoKTsKKyAgICAgICAgICAgIGlmICh2aWV3ICYmIHZpZXctPnNj
cm9sbGJhcnNNb3VzZVJlbGVhc2VFdmVudChtb3VzZUV2ZW50KSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwor
dm9pZCBTY3JvbGxWaWV3OjphZGRDaGlsZChXaWRnZXQqIGNoaWxkKQoreworICAgIGNoaWxkLT5z
ZXRQYXJlbnQodGhpcyk7CisgICAgLy9jaGlsZC0+c2V0UGxhdGZvcm1XaWRnZXQocGxhdGZvcm1X
aWRnZXQoKSk7CisgICAgbV9kYXRhLT5tX2NoaWxkcmVuLmFkZChjaGlsZCk7Cit9CisKK3ZvaWQg
U2Nyb2xsVmlldzo6cmVtb3ZlQ2hpbGQoV2lkZ2V0KiBjaGlsZCkKK3sKKyAgICBpZiAoc3RhdGlj
X2Nhc3Q8V2lkZ2V0Kj4obV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlKSA9PSBjaGls
ZCkgeworICAgICAgICBtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91c2UgPSAwOworICAg
ICAgICBtX2RhdGEtPm1fcHJldk1vdXNlRG93biA9IGZhbHNlOworICAgIH0KKworICAgIGNoaWxk
LT5zZXRQYXJlbnQoMCk7CisgICAgbV9kYXRhLT5tX2NoaWxkcmVuLnJlbW92ZShjaGlsZCk7Cit9
CisKK3ZvaWQgU2Nyb2xsVmlldzo6cGFpbnQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25z
dCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEZJWE1FOiBUaGlzIGNvZGUgaXMgaGVyZSBzbyB3
ZSBkb24ndCBoYXZlIHRvIGZvcmsgRnJhbWVWaWV3LmgvLmNwcC4KKyAgICAvLyBJbiB0aGUgZW5k
LCBGcmFtZVZpZXcgc2hvdWxkIGp1c3QgbWVyZ2Ugd2l0aCBTY3JvbGxWaWV3LgorICAgIEFTU0VS
VChpc0ZyYW1lVmlldygpKTsKKworICAgIGlmIChjb250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkg
fHwgcmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybjsKKworICAgIGNvbnRleHQtPnNhdmUo
KTsKKworICAgIGlmICghcGFyZW50KCkpIHsKKyAgICAgICAgY29udGV4dC0+dHJhbnNsYXRlKC1z
dGFibGVSb3VuZChjb250ZW50c1goKSAqIHNjYWxlKCkpLCAtc3RhYmxlUm91bmQoY29udGVudHNZ
KCkgKiBzY2FsZSgpKSk7CisgICAgICAgIGNvbnRleHQtPnNjYWxlKEZsb2F0U2l6ZShzY2FsZSgp
LCBzY2FsZSgpKSk7CisgICAgfQorCisgICAgYm9vbCBkcmF3U2Nyb2xsYmFycyA9IHBhcmVudCgp
ICYmICFtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQgJiYgbV9kYXRhLT5tX3Njcm9sbGJh
cnNWaXNpYmxlCisgICAgICAgICAgICAgICAgJiYgKG1fZGF0YS0+Y2FuU2hvd1ZTY3JvbGxiYXIo
KSB8fCBtX2RhdGEtPmNhblNob3dIU2Nyb2xsYmFyKCkpOworICAgIEludFJlY3QgY29udGVudHND
bGlwUmVjdDsKKyAgICBpZiAoIXBhcmVudCgpKSB7CisgICAgICAgIEZsb2F0UmVjdCBjb250ZW50
c05vU2Nyb2xsOworICAgICAgICAvLyBlbnN1cmUgdGhlIGNsaXAgcmVjdCBpcyBiaWcgZW5vdWdo
IHRvIGF2b2lkIG1pc3NpbmcgcGl4ZWxzLgorICAgICAgICBjb250ZW50c05vU2Nyb2xsLnNldFgo
KHJlY3QueCgpIC0geCgpKSAvIHNjYWxlKCkpOworICAgICAgICBjb250ZW50c05vU2Nyb2xsLnNl
dFkoKHJlY3QueSgpIC0geSgpKSAvIHNjYWxlKCkpOworICAgICAgICBjb250ZW50c05vU2Nyb2xs
LnNldFdpZHRoKHJlY3QucmlnaHQoKSAvIHNjYWxlKCkgLSBjb250ZW50c05vU2Nyb2xsLngoKSk7
CisgICAgICAgIGNvbnRlbnRzTm9TY3JvbGwuc2V0SGVpZ2h0KHJlY3QuYm90dG9tKCkgLyBzY2Fs
ZSgpIC0gY29udGVudHNOb1Njcm9sbC55KCkpOworICAgICAgICBjb250ZW50c05vU2Nyb2xsLmlu
ZmxhdGUoMSk7CisgICAgICAgIGNvbnRlbnRzQ2xpcFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGNv
bnRlbnRzTm9TY3JvbGwpOworICAgICAgICBjb250ZW50c0NsaXBSZWN0LnNldExvY2F0aW9uKGNv
bnRlbnRzQ2xpcFJlY3QubG9jYXRpb24oKSArIG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAg
IH0gZWxzZSB7CisgICAgICAgIGNvbnRlbnRzQ2xpcFJlY3Quc2V0TG9jYXRpb24ocmVjdC5sb2Nh
dGlvbigpIC0gSW50U2l6ZSh4KCksIHkoKSkgKyBtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0KTsKKyAg
ICAgICAgY29udGVudHNDbGlwUmVjdC5zZXRTaXplKHJlY3Quc2l6ZSgpKTsKKyAgICAgICAgY29u
dGVudHNDbGlwUmVjdC5pbmZsYXRlKDEpOworICAgICAgICBjb250ZW50c0NsaXBSZWN0LmludGVy
c2VjdChlbmNsb3NpbmdJbnRSZWN0KHZpc2libGVDb250ZW50UmVjdCgpKSk7CisgICAgICAgIGNv
bnRleHQtPnRyYW5zbGF0ZSh4KCksIHkoKSk7CisgICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4
JiB0ciA9IGNvbnRleHQtPmFmZmluZVRyYW5zZm9ybSgpOworICAgICAgICB0ci5zZXRFKHN0YWJs
ZVJvdW5kKHRyLmUoKSkpOworICAgICAgICB0ci5zZXRGKHN0YWJsZVJvdW5kKHRyLmYoKSkpOwor
ICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoLWNvbnRlbnRzWCgpLCAtY29udGVudHNZKCkpOwor
ICAgIH0KKworICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0ciA9IGNvbnRleHQtPmFmZmluZVRy
YW5zZm9ybSgpOworICAgIHRyLnNldEUoLXN0YWJsZVJvdW5kKC10ci5lKCkpKTsKKyAgICB0ci5z
ZXRGKC1zdGFibGVSb3VuZCgtdHIuZigpKSk7CisKKyAgICBjb250ZXh0LT5jbGlwKGNvbnRlbnRz
Q2xpcFJlY3QpOworCisgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPnBhaW50Q29u
dGVudHMoY29udGV4dCwgY29udGVudHNDbGlwUmVjdCk7CisKKyAgICBjb250ZXh0LT5yZXN0b3Jl
KCk7CisKKyAgICBpZiAoZHJhd1Njcm9sbGJhcnMpIHsKKyAgICAgICAgY29udGV4dC0+c2F2ZSgp
OworICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoeCgpLCB5KCkpOworICAgICAgICBUcmFuc2Zv
cm1hdGlvbk1hdHJpeCYgdHIgPSBjb250ZXh0LT5hZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICAgICAg
dHIuc2V0RShzdGFibGVSb3VuZCh0ci5lKCkpKTsKKyAgICAgICAgdHIuc2V0RihzdGFibGVSb3Vu
ZCh0ci5mKCkpKTsKKworICAgICAgICBJbnRSZWN0IHNjcm9sbFZpZXdEaXJ0eVJlY3Q7CisgICAg
ICAgIHNjcm9sbFZpZXdEaXJ0eVJlY3Quc2V0TG9jYXRpb24ocmVjdC5sb2NhdGlvbigpIC0gSW50
U2l6ZSh4KCksIHkoKSkpOworICAgICAgICBzY3JvbGxWaWV3RGlydHlSZWN0LnNldFNpemUocmVj
dC5zaXplKCkpOworCisgICAgICAgIGlmIChtX2RhdGEtPmNhblNob3dIU2Nyb2xsYmFyKCkpCisg
ICAgICAgICAgICBtX2RhdGEtPm1faEJhci0+cGFpbnQoY29udGV4dCwgc2Nyb2xsVmlld0RpcnR5
UmVjdCk7CisgICAgICAgIGlmIChtX2RhdGEtPmNhblNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAg
ICAgICBtX2RhdGEtPm1fdkJhci0+cGFpbnQoY29udGV4dCwgc2Nyb2xsVmlld0RpcnR5UmVjdCk7
CisKKyAgICAgICAgLy8gRmlsbCB0aGUgc2Nyb2xsIGNvcm5lciB3aXRoIHdoaXRlLgorICAgICAg
ICBEV09SRCBjb2xvcldpbiA9IEdldFN5c0NvbG9yKENPTE9SX1NDUk9MTEJBUik7CisgICAgICAg
IENvbG9yIGNvcm5lckNvbG9yKEdldFJWYWx1ZShjb2xvcldpbiksIEdldEdWYWx1ZShjb2xvcldp
biksIEdldEJWYWx1ZShjb2xvcldpbikpOworICAgICAgICBJbnRTaXplIGlubmVyU2l6ZShtX2Rh
dGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgsIG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWln
aHQpOworICAgICAgICBJbnRSZWN0IGhDb3JuZXIgPSBtX2RhdGEtPmdldEhDb3JuZXIoaW5uZXJT
aXplKTsKKyAgICAgICAgaWYgKGhDb3JuZXIuaW50ZXJzZWN0cyhzY3JvbGxWaWV3RGlydHlSZWN0
KSkKKyAgICAgICAgICAgIGNvbnRleHQtPmZpbGxSZWN0KGhDb3JuZXIsIGNvcm5lckNvbG9yKTsK
KworICAgICAgICBJbnRSZWN0IHZDb3JuZXIgPSBtX2RhdGEtPmdldFZDb3JuZXIoaW5uZXJTaXpl
KTsKKyAgICAgICAgaWYgKHZDb3JuZXIgIT0gaENvcm5lciAmJiB2Q29ybmVyLmludGVyc2VjdHMo
c2Nyb2xsVmlld0RpcnR5UmVjdCkpCisgICAgICAgICAgICBjb250ZXh0LT5maWxsUmVjdCh2Q29y
bmVyLCBjb3JuZXJDb2xvcik7CisKKyAgICAgICAgY29udGV4dC0+cmVzdG9yZSgpOworICAgIH0K
K30KKwordm9pZCBTY3JvbGxWaWV3Ojp3aGVlbEV2ZW50KFBsYXRmb3JtV2hlZWxFdmVudCYgZSkK
K3sKKyAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggd2Ugd2FudCB0byBzY3JvbGwuICBJZiB3ZSBj
YW4gbW92ZSBhdCBhbGwsIHdlIHdpbGwgYWNjZXB0IHRoZSBldmVudC4KKyAgICBJbnRTaXplIG1h
eFNjcm9sbERlbHRhID0gbWF4aW11bVNjcm9sbCgpOworICAgIGlmICgoZS5kZWx0YVgoKSA8IDAg
JiYgbWF4U2Nyb2xsRGVsdGEud2lkdGgoKSA+IDApIHx8CisgICAgICAgIChlLmRlbHRhWCgpID4g
MCAmJiBzY3JvbGxPZmZzZXQoKS53aWR0aCgpID4gMCkgfHwKKyAgICAgICAgKGUuZGVsdGFZKCkg
PCAwICYmIG1heFNjcm9sbERlbHRhLmhlaWdodCgpID4gMCkgfHwKKyAgICAgICAgKGUuZGVsdGFZ
KCkgPiAwICYmIHNjcm9sbE9mZnNldCgpLmhlaWdodCgpID4gMCkpCisgICAgICAgIGUuYWNjZXB0
KCk7CisKKyAgICBzY3JvbGxCeSgtZS5kZWx0YVgoKSAqIGNTY3JvbGxiYXJQaXhlbHNQZXJMaW5l
U3RlcCwgLWUuZGVsdGFZKCkgKiBjU2Nyb2xsYmFyUGl4ZWxzUGVyTGluZVN0ZXApOworfQorCitj
b25zdCBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID4qIFNjcm9sbFZpZXc6OmNoaWxkcmVuKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gJihtX2RhdGEtPm1fY2hpbGRyZW4pOworfQorCit2b2lkIFNjcm9s
bFZpZXc6OmZyYW1lUmVjdHNDaGFuZ2VkKCkgY29uc3QKK3sKKyAgICBjb25zdCBGcmFtZVZpZXcq
IGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAgIEZy
YW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUoKTsKKworICAgIGlmIChmcmFtZSkgeworICAg
ICAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVlKCktPmZpcnN0Q2hpbGQoKTsgY2hp
bGQ7IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxpbmcoKSkgeworICAgICAgICAgICAg
aWYgKEZyYW1lVmlldyogdmlldyA9IGNoaWxkLT52aWV3KCkpCisgICAgICAgICAgICAgICAgdmll
dy0+ZnJhbWVSZWN0c0NoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGhpZGVDdXJy
ZW50UG9wdXBNZW51KCk7CisKKyAgICBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID46OmNvbnN0X2l0
ZXJhdG9yIGVuZCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8
UmVmUHRyPFdpZGdldD4gPjo6Y29uc3RfaXRlcmF0b3IgY3VycmVudCA9IG1fZGF0YS0+bV9jaGls
ZHJlbi5iZWdpbigpOyBjdXJyZW50ICE9IGVuZDsgKytjdXJyZW50KQorICAgICAgICAoKmN1cnJl
bnQpLT5mcmFtZVJlY3RzQ2hhbmdlZCgpOworfQorCitib29sIFNjcm9sbFZpZXc6OnNjcm9sbChT
Y3JvbGxEaXJlY3Rpb24gZGlyZWN0aW9uLCBTY3JvbGxHcmFudWxhcml0eSBncmFudWxhcml0eSkK
K3sKKyAgICBpZiAgKChkaXJlY3Rpb24gPT0gU2Nyb2xsVXAgfHwgZGlyZWN0aW9uID09IFNjcm9s
bERvd24pICYmIG1fZGF0YS0+bV92QmFyKQorICAgICAgICByZXR1cm4gbV9kYXRhLT5tX3ZCYXIt
PnNjcm9sbChkaXJlY3Rpb24sIGdyYW51bGFyaXR5LCAxKTsKKyAgICBlbHNlIGlmIChtX2RhdGEt
Pm1faEJhcikKKyAgICAgICAgcmV0dXJuIG1fZGF0YS0+bV9oQmFyLT5zY3JvbGwoZGlyZWN0aW9u
LCBncmFudWxhcml0eSwgMSk7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQg
c2Nyb2xsU2Nyb2xsYmFyKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIsIGludCBvZmZzZXQpCit7Cisg
ICAgaW50IG92ZXJmbG93VmFsdWUgPSBiYXItPnZhbHVlKCkgKyBvZmZzZXQ7CisKKyAgICAvLyBT
Y3JvbGxiYXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIGJvdW5kYXJpZXMuCisgICAgYmFyLT5zZXRW
YWx1ZShvdmVyZmxvd1ZhbHVlKTsKKworICAgIHJldHVybiBvdmVyZmxvd1ZhbHVlIC0gYmFyLT52
YWx1ZSgpOworfQorCitpbnQgU2Nyb2xsVmlldzo6bW92ZVN1YmZyYW1lSW50b1ZpZXcoY29uc3Qg
SW50UmVjdCYgcmVjdCwgYm9vbCB2ZXJ0aWNhbCwgaW50IG1heE9mZnNldCkKK3sKKyAgICBpZiAo
bWF4T2Zmc2V0KSB7CisgICAgICAgIGlmIChQbGF0Zm9ybVNjcm9sbGJhciogYmFyID0gdmVydGlj
YWwgPyBtX2RhdGEtPm1fdkJhci5nZXQoKSA6IG1fZGF0YS0+bV9oQmFyLmdldCgpKSB7CisgICAg
ICAgICAgICBpbnQgc2Nyb2xsZWQgPSB2ZXJ0aWNhbAorICAgICAgICAgICAgICAgID8gbWF4T2Zm
c2V0ID4gMAorICAgICAgICAgICAgICAgICAgICA/IHJlY3QuYm90dG9tKCkgLSBzdGFibGVSb3Vu
ZChtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgpICsgbV9kYXRhLT5tX3Zpc2libGVDb250
ZW50c0hlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgOiByZWN0LnkoKSAtIHN0YWJsZVJvdW5k
KG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQuaGVpZ2h0KCkpCisgICAgICAgICAgICAgICAgOiBtYXhP
ZmZzZXQgPiAwCisgICAgICAgICAgICAgICAgICAgID8gcmVjdC5yaWdodCgpIC0gc3RhYmxlUm91
bmQobV9kYXRhLT5tX3Njcm9sbE9mZnNldC53aWR0aCgpICsgbV9kYXRhLT5tX3Zpc2libGVDb250
ZW50c1dpZHRoKQorICAgICAgICAgICAgICAgICAgICA6IHJlY3QueCgpIC0gc3RhYmxlUm91bmQo
bV9kYXRhLT5tX3Njcm9sbE9mZnNldC53aWR0aCgpKTsKKworICAgICAgICAgICAgaWYgKHNjcm9s
bGVkID4gMCAmJiBtYXhPZmZzZXQgPiAwKQorICAgICAgICAgICAgICAgIHNjcm9sbGVkID0gbWlu
KG1heE9mZnNldCwgc2Nyb2xsZWQpOworICAgICAgICAgICAgZWxzZSBpZiAoc2Nyb2xsZWQgPCAw
ICYmIG1heE9mZnNldCA8IDApCisgICAgICAgICAgICAgICAgc2Nyb2xsZWQgPSBtYXgobWF4T2Zm
c2V0LCBzY3JvbGxlZCk7CisKKyAgICAgICAgICAgIG1heE9mZnNldCAtPSBzY3JvbGxlZDsKKyAg
ICAgICAgICAgIHNjcm9sbGVkID0gc2Nyb2xsUmVjdXJzaXZlbHkodmVydGljYWwsIHNjcm9sbGVk
KTsKKyAgICAgICAgICAgIG1heE9mZnNldCArPSBzY3JvbGxlZDsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHJldHVybiBtYXhPZmZzZXQ7Cit9CisKK2ludCBTY3JvbGxWaWV3OjpzY3JvbGxSZWN1
cnNpdmVseShib29sIHZlcnRpY2FsLCBpbnQgb2Zmc2V0KQoreworICAgIGlmIChwYXJlbnQoKSkK
KyAgICAgICAgb2Zmc2V0ID0gcGFyZW50KCktPm1vdmVTdWJmcmFtZUludG9WaWV3KGZyYW1lUmVj
dCgpLCB2ZXJ0aWNhbCwgb2Zmc2V0KTsKKworICAgIGlmIChvZmZzZXQpCisgICAgICAgIGlmIChQ
bGF0Zm9ybVNjcm9sbGJhciogYmFyID0gdmVydGljYWwgPyBtX2RhdGEtPm1fdkJhci5nZXQoKSA6
IG1fZGF0YS0+bV9oQmFyLmdldCgpKQorICAgICAgICAgICAgb2Zmc2V0ID0gc2Nyb2xsU2Nyb2xs
YmFyKGJhciwgb2Zmc2V0KTsKKworICAgIGlmIChvZmZzZXQgJiYgcGFyZW50KCkpCisgICAgICAg
IG9mZnNldCA9IHBhcmVudCgpLT5zY3JvbGxSZWN1cnNpdmVseSh2ZXJ0aWNhbCwgb2Zmc2V0KTsK
KworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6bW92ZVN1YmZyYW1l
SW50b1ZpZXcoY29uc3QgSW50UmVjdCYgcmVjdCwgSW50U2l6ZSYgbWF4T2Zmc2V0LCBib29sIHNo
b3dTY3JvbGxiYXJzKQoreworICAgIEludFNpemUgc2Nyb2xsZWQoMCwgMCk7CisgICAgaWYgKG1h
eE9mZnNldC53aWR0aCgpKSB7CisgICAgICAgIGlmIChQbGF0Zm9ybVNjcm9sbGJhciogYmFyID0g
bV9kYXRhLT5tX2hCYXIuZ2V0KCkpIHsKKyAgICAgICAgICAgIHNjcm9sbGVkLnNldFdpZHRoKG1h
eE9mZnNldC53aWR0aCgpID4gMAorICAgICAgICAgICAgICAgICAgICA/IHJlY3QucmlnaHQoKSAt
IHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQud2lkdGgoKSArIG1fZGF0YS0+bV92
aXNpYmxlQ29udGVudHNXaWR0aCkKKyAgICAgICAgICAgICAgICAgICAgOiByZWN0LngoKSAtIHN0
YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQud2lkdGgoKSkpOworCisgICAgICAgICAg
ICBpZiAoc2Nyb2xsZWQud2lkdGgoKSA+IDAgJiYgbWF4T2Zmc2V0LndpZHRoKCkgPiAwKQorICAg
ICAgICAgICAgICAgIHNjcm9sbGVkLnNldFdpZHRoKG1pbihtYXhPZmZzZXQud2lkdGgoKSwgc2Ny
b2xsZWQud2lkdGgoKSkpOworICAgICAgICAgICAgZWxzZSBpZiAoc2Nyb2xsZWQud2lkdGgoKSA8
IDAgJiYgbWF4T2Zmc2V0LndpZHRoKCkgPCAwKQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNl
dFdpZHRoKG1heChtYXhPZmZzZXQud2lkdGgoKSwgc2Nyb2xsZWQud2lkdGgoKSkpOworICAgICAg
ICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldFdpZHRoKDApOworICAgICAg
ICB9CisgICAgfQorICAgIGlmIChtYXhPZmZzZXQuaGVpZ2h0KCkpIHsKKyAgICAgICAgaWYgKFBs
YXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSBtX2RhdGEtPm1fdkJhci5nZXQoKSkgeworICAgICAgICAg
ICAgc2Nyb2xsZWQuc2V0SGVpZ2h0KG1heE9mZnNldC5oZWlnaHQoKSA+IDAKKyAgICAgICAgICAg
ICAgICAgICAgPyByZWN0LmJvdHRvbSgpIC0gc3RhYmxlUm91bmQobV9kYXRhLT5tX3Njcm9sbE9m
ZnNldC5oZWlnaHQoKSArIG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWlnaHQpCisgICAgICAg
ICAgICAgICAgICAgIDogcmVjdC55KCkgLSBzdGFibGVSb3VuZChtX2RhdGEtPm1fc2Nyb2xsT2Zm
c2V0LmhlaWdodCgpKSk7CisKKyAgICAgICAgICAgIGlmIChzY3JvbGxlZC5oZWlnaHQoKSA+IDAg
JiYgbWF4T2Zmc2V0LmhlaWdodCgpID4gMCkKKyAgICAgICAgICAgICAgICBzY3JvbGxlZC5zZXRI
ZWlnaHQobWluKG1heE9mZnNldC5oZWlnaHQoKSwgc2Nyb2xsZWQuaGVpZ2h0KCkpKTsKKyAgICAg
ICAgICAgIGVsc2UgaWYgKHNjcm9sbGVkLmhlaWdodCgpIDwgMCAmJiBtYXhPZmZzZXQuaGVpZ2h0
KCkgPCAwKQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldEhlaWdodChtYXgobWF4T2Zmc2V0
LmhlaWdodCgpLCBzY3JvbGxlZC5oZWlnaHQoKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAg
ICAgICAgICAgIHNjcm9sbGVkLnNldEhlaWdodCgwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBp
ZiAoc2Nyb2xsZWQud2lkdGgoKSB8fCBzY3JvbGxlZC5oZWlnaHQoKSkgeworICAgICAgICBtYXhP
ZmZzZXQgLT0gc2Nyb2xsZWQ7CisgICAgICAgIHNjcm9sbFJlY3Vyc2l2ZWx5KHNjcm9sbGVkLCBz
aG93U2Nyb2xsYmFycyk7CisgICAgICAgIG1heE9mZnNldCArPSBzY3JvbGxlZDsKKyAgICB9Cit9
CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xsUmVjdXJzaXZlbHkoSW50U2l6ZSYgb2Zmc2V0LCBi
b29sIHNob3dTY3JvbGxiYXJzKQoreworICAgIGlmICghb2Zmc2V0LndpZHRoKCkgJiYgIW9mZnNl
dC5oZWlnaHQoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKHBhcmVudCgpKQorICAgICAg
ICBwYXJlbnQoKS0+bW92ZVN1YmZyYW1lSW50b1ZpZXcoZnJhbWVSZWN0KCksIG9mZnNldCwgc2hv
d1Njcm9sbGJhcnMpOworCisgICAgSW50U2l6ZSBvbGRPZmZzZXQobV9kYXRhLT5tX3Njcm9sbE9m
ZnNldCk7CisgICAgYm9vbCBvbGRTdXBwcmVzc2VkID0gbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJT
dXBwcmVzc2VkOworICAgIG1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZCA9IHRydWU7
CisKKyAgICBpZiAob2Zmc2V0LndpZHRoKCkpIHsKKyAgICAgICAgaWYgKFBsYXRmb3JtU2Nyb2xs
YmFyKiBiYXIgPSBtX2RhdGEtPm1faEJhci5nZXQoKSkKKyAgICAgICAgICAgIG9mZnNldC5zZXRX
aWR0aChzY3JvbGxTY3JvbGxiYXIoYmFyLCBvZmZzZXQud2lkdGgoKSkpOworICAgIH0KKworICAg
IGlmIChvZmZzZXQuaGVpZ2h0KCkpIHsKKyAgICAgICAgaWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBi
YXIgPSBtX2RhdGEtPm1fdkJhci5nZXQoKSkKKyAgICAgICAgICAgIG9mZnNldC5zZXRIZWlnaHQo
c2Nyb2xsU2Nyb2xsYmFyKGJhciwgb2Zmc2V0LmhlaWdodCgpKSk7CisgICAgfQorCisgICAgbV9k
YXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkID0gb2xkU3VwcHJlc3NlZDsKKyAgICBpZiAo
IW1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZCkgeworICAgICAgICBJbnRTaXplIGRl
bHRhU2Nyb2xsID0gbV9kYXRhLT5tX3Njcm9sbE9mZnNldCAtIG9sZE9mZnNldDsKKyAgICAgICAg
aWYgKGRlbHRhU2Nyb2xsLndpZHRoKCkgfHwgZGVsdGFTY3JvbGwuaGVpZ2h0KCkpIHsKKyAgICAg
ICAgICAgIG1fZGF0YS0+c2Nyb2xsQmFja2luZ1N0b3JlKGRlbHRhU2Nyb2xsKTsKKyAgICAgICAg
ICAgIC8vc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPmZyYW1lKCktPnNlbmRTY3JvbGxF
dmVudCgpOworICAgICAgICAgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNf
Y2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAgICAgICAgIGlmIChGcmFtZSogZnJh
bWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJhbWUtPnNo
b3VsZEJsaW5rQ2FyZXQoKSkKKyAgICAgICAgICAgICAgICAgICAgaG9zdFdpbmRvdygpLT5jYXJl
dFJlY3RDaGFuZ2VkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2hvd1Njcm9s
bGJhcnMpCisgICAgICAgICAgICAgICAgbV9kYXRhLT5zaG93U2Nyb2xsYmFycyhkZWx0YVNjcm9s
bC53aWR0aCgpICE9IDAsIGRlbHRhU2Nyb2xsLmhlaWdodCgpICE9IDAsIHNob3dTY3JvbGxiYXJz
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwYXJlbnQoKSkgeworICAgICAgICBpZiAo
b2Zmc2V0LndpZHRoKCkgfHwgb2Zmc2V0LmhlaWdodCgpKQorICAgICAgICAgICAgcGFyZW50KCkt
PnNjcm9sbFJlY3Vyc2l2ZWx5KG9mZnNldCwgc2hvd1Njcm9sbGJhcnMpOworICAgIH0gZWxzZSB7
CisgICAgICAgIGlmICghbV9kYXRhLT5tX3ZCYXIpCisgICAgICAgICAgICBvZmZzZXQuc2V0SGVp
Z2h0KDApOworICAgICAgICBpZiAoIW1fZGF0YS0+bV9oQmFyKQorICAgICAgICAgICAgb2Zmc2V0
LnNldFdpZHRoKDApOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3OjpzY3JvbGxSZWN1cnNp
dmVseShTY3JvbGxEaXJlY3Rpb24gZGlyZWN0aW9uLCBTY3JvbGxHcmFudWxhcml0eSBncmFudWxh
cml0eSwgaW50IHJlcGVhdENvdW50KQoreworICAgIGJvb2wgdmVydGljYWwgPSBkaXJlY3Rpb24g
PT0gU2Nyb2xsVXAgfHwgZGlyZWN0aW9uID09IFNjcm9sbERvd247CisgICAgaWYgKFBsYXRmb3Jt
U2Nyb2xsYmFyKiBiYXIgPSB2ZXJ0aWNhbCA/IG1fZGF0YS0+bV92QmFyLmdldCgpIDogbV9kYXRh
LT5tX2hCYXIuZ2V0KCkpIHsKKyAgICAgICAgaW50IG9mZnNldCA9IGRpcmVjdGlvbiA9PSBTY3Jv
bGxVcCB8fCBkaXJlY3Rpb24gPT0gU2Nyb2xsTGVmdCA/IC0xIDogMTsKKyAgICAgICAgb2Zmc2V0
ICo9IGdyYW51bGFyaXR5ID09IFNjcm9sbEJ5TGluZSA/IGNTY3JvbGxiYXJQaXhlbHNQZXJMaW5l
U3RlcAorICAgICAgICAgICAgOiBncmFudWxhcml0eSA9PSBTY3JvbGxCeVBhZ2UgPyAodmVydGlj
YWwgPyBoZWlnaHQoKSA6IHdpZHRoKCkpIC0gY0Ftb3VudFRvS2VlcFdoZW5QYWdpbmcKKyAgICAg
ICAgICAgIDogZ3JhbnVsYXJpdHkgPT0gU2Nyb2xsQnlEb2N1bWVudCA/IHZlcnRpY2FsID8gY29u
dGVudHNIZWlnaHQoKSA6IGNvbnRlbnRzV2lkdGgoKQorICAgICAgICAgICAgOiAxOworICAgICAg
ICBvZmZzZXQgKj0gcmVwZWF0Q291bnQ7CisgICAgICAgIHNjcm9sbFJlY3Vyc2l2ZWx5KHZlcnRp
Y2FsLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAocGFyZW50KCkpCisgICAgICAgIHBhcmVudCgp
LT5zY3JvbGxSZWN1cnNpdmVseShkaXJlY3Rpb24sIGdyYW51bGFyaXR5LCByZXBlYXRDb3VudCk7
Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xsV2luZG93T2Zmc2V0KFNJWkUmIGRlbHRhLCBi
b29sIHNob3dTY3JvbGxiYXJzKQoreworICAgIEludFNpemUgb2Zmc2V0ID0gSW50U2l6ZShkZWx0
YSkgLyBzY2FsZSgpOworICAgIHNjcm9sbFJlY3Vyc2l2ZWx5KG9mZnNldCwgc2hvd1Njcm9sbGJh
cnMpOworICAgIGRlbHRhID0gb2Zmc2V0ICogc2NhbGUoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3
OjpzZXRBbGxvd3NTY3JvbGxpbmcoYm9vbCBmbGFnKQoreworICAgIGlmIChtX2FsbG93c0NoYW5n
aW5nU2Nyb2xsYmFyTW9kZSkKKyAgICAgICAgbV9kYXRhLT5zZXRBbGxvd3NTY3JvbGxpbmcoZmxh
Zyk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6YWxsb3dzU2Nyb2xsaW5nKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gbV9kYXRhLT5hbGxvd3NTY3JvbGxpbmcoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3
OjpwYWludFNjcm9sbGJhcnMoSERDIGhkYywgTFBSRUNUIGRpcnR5UmVjdFdpbikKK3sKKyAgICBJ
bnRSZWN0IGRpcnR5UmVjdCgqZGlydHlSZWN0V2luKTsKKyAgICBJbnRSZWN0IG15V2luZG93UmVj
dChtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSk7CisgICAgZGlydHlSZWN0LmludGVyc2VjdCht
eVdpbmRvd1JlY3QpOworCisgICAgaWYgKCFtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQg
JiYgbV9kYXRhLT5tX3Njcm9sbGJhcnNWaXNpYmxlICYmIChtX2RhdGEtPmNhblNob3dWU2Nyb2xs
YmFyKCkgfHwgbV9kYXRhLT5jYW5TaG93SFNjcm9sbGJhcigpKSkgeworICAgICAgICBHcmFwaGlj
c0NvbnRleHQgbXlDb250ZXh0KGhkYyk7CisgICAgICAgIG15Q29udGV4dC5zYXZlKCk7CisgICAg
ICAgIG15Q29udGV4dC5jbGlwKGRpcnR5UmVjdCk7CisgICAgICAgIG15Q29udGV4dC50cmFuc2xh
dGUobV9kYXRhLT5tX3BoeXNpY2FsR2VvbWV0cnkueCgpLCBtX2RhdGEtPm1fcGh5c2ljYWxHZW9t
ZXRyeS55KCkpOworICAgICAgICBteUNvbnRleHQuc2NhbGUoRmxvYXRTaXplKHNjYWxlKCksIHNj
YWxlKCkpKTsKKworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCBhZmZpbmVUcmFucyA9IG15
Q29udGV4dC5hZmZpbmVUcmFuc2Zvcm0oKS5pbnZlcnNlKCk7CisgICAgICAgIEludFJlY3Qgc2Ny
b2xsVmlld0RpcnR5UmVjdCA9IGVuY2xvc2luZ0ludFJlY3QoYWZmaW5lVHJhbnMubWFwUmVjdChG
bG9hdFJlY3QoZGlydHlSZWN0KSkpOworICAgICAgICBpZiAoIXNjcm9sbFZpZXdEaXJ0eVJlY3Qu
aXNFbXB0eSgpKSB7CisgICAgICAgICAgICBEV09SRCBjb2xvcldpbiA9IEdldFN5c0NvbG9yKENP
TE9SX1NDUk9MTEJBUik7CisgICAgICAgICAgICBDb2xvciBjb3JuZXJDb2xvcihHZXRSVmFsdWUo
Y29sb3JXaW4pLCBHZXRHVmFsdWUoY29sb3JXaW4pLCBHZXRCVmFsdWUoY29sb3JXaW4pKTsKKwor
ICAgICAgICAgICAgaWYgKG1fZGF0YS0+Y2FuU2hvd0hTY3JvbGxiYXIoKSkgeworICAgICAgICAg
ICAgICAgIG1fZGF0YS0+bV9oQmFyLT5wYWludCgmbXlDb250ZXh0LCBzY3JvbGxWaWV3RGlydHlS
ZWN0KTsKKworICAgICAgICAgICAgICAgIGludCBoQmFyQm90dG9tID0gbV9kYXRhLT5tX3BoeXNp
Y2FsR2VvbWV0cnkueSgpICsgc3RhYmxlUm91bmQoKG1fZGF0YS0+bV9oQmFyLT55KCkgKyBtX2Rh
dGEtPm1faEJhci0+aGVpZ2h0KCkpICogc2NhbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKGhC
YXJCb3R0b20gPCBteVdpbmRvd1JlY3QuYm90dG9tKCkpIHsKKyAgICAgICAgICAgICAgICAgICAg
SW50UmVjdCBibGFua0FyZWEobXlXaW5kb3dSZWN0LngoKQorICAgICAgICAgICAgICAgICAgICAg
ICAgLCBoQmFyQm90dG9tCisgICAgICAgICAgICAgICAgICAgICAgICAsIG15V2luZG93UmVjdC53
aWR0aCgpCisgICAgICAgICAgICAgICAgICAgICAgICAsIG15V2luZG93UmVjdC5ib3R0b20oKSAt
IGhCYXJCb3R0b20pOworCisgICAgICAgICAgICAgICAgICAgIGJsYW5rQXJlYS5pbnRlcnNlY3Qo
ZGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWJsYW5rQXJlYS5pc0VtcHR5
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15Q29udGV4dC5zYXZlKCk7CisgICAgICAg
ICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRleHQgb3JpZ0NvbnRleHQoaGRjKTsKKyAgICAg
ICAgICAgICAgICAgICAgICAgIG9yaWdDb250ZXh0LmZpbGxSZWN0KGJsYW5rQXJlYSwgY29ybmVy
Q29sb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgbXlDb250ZXh0LnJlc3RvcmUoKTsKKyAg
ICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAg
IG15V2luZG93UmVjdC5zZXRIZWlnaHQoc3RhYmxlUm91bmQobV9kYXRhLT5tX2hCYXItPnkoKSAq
IHNjYWxlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtX2RhdGEtPmNhblNo
b3dWU2Nyb2xsYmFyKCkpIHsKKyAgICAgICAgICAgICAgICBtX2RhdGEtPm1fdkJhci0+cGFpbnQo
Jm15Q29udGV4dCwgc2Nyb2xsVmlld0RpcnR5UmVjdCk7CisKKyAgICAgICAgICAgICAgICBpbnQg
dkJhclJpZ2h0ID0gbV9kYXRhLT5tX3BoeXNpY2FsR2VvbWV0cnkueCgpICsgc3RhYmxlUm91bmQo
KG1fZGF0YS0+bV92QmFyLT54KCkgKyBtX2RhdGEtPm1fdkJhci0+d2lkdGgoKSkgKiBzY2FsZSgp
KTsKKyAgICAgICAgICAgICAgICBpZiAodkJhclJpZ2h0IDwgbXlXaW5kb3dSZWN0LnJpZ2h0KCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgSW50UmVjdCBibGFua0FyZWEodkJhclJpZ2h0CisgICAg
ICAgICAgICAgICAgICAgICAgICAsIG15V2luZG93UmVjdC55KCkKKyAgICAgICAgICAgICAgICAg
ICAgICAgICwgbXlXaW5kb3dSZWN0LnJpZ2h0KCkgLSB2QmFyUmlnaHQKKyAgICAgICAgICAgICAg
ICAgICAgICAgICwgbXlXaW5kb3dSZWN0LmhlaWdodCgpKTsKKworICAgICAgICAgICAgICAgICAg
ICBibGFua0FyZWEuaW50ZXJzZWN0KGRpcnR5UmVjdCk7CisKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCFibGFua0FyZWEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBteUNv
bnRleHQuc2F2ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY3NDb250ZXh0IG9y
aWdDb250ZXh0KGhkYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBvcmlnQ29udGV4dC5maWxs
UmVjdChibGFua0FyZWEsIGNvcm5lckNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG15
Q29udGV4dC5yZXN0b3JlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgICAgICBteVdpbmRvd1JlY3Quc2V0V2lkdGgoc3RhYmxlUm91bmQo
bV9kYXRhLT5tX3ZCYXItPngoKSAqIHNjYWxlKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAg
ICAgICAgLy8gRmlsbCB0aGUgc2Nyb2xsIGNvcm5lciB3aXRoIHdoaXRlLgorICAgICAgICAgICAg
SW50U2l6ZSBpbm5lclNpemUobV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoLCBtX2RhdGEt
Pm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0KTsKKyAgICAgICAgICAgIEludFJlY3QgaENvcm5lciA9
IG1fZGF0YS0+Z2V0SENvcm5lcihpbm5lclNpemUpOworICAgICAgICAgICAgaWYgKGhDb3JuZXIu
aW50ZXJzZWN0cyhzY3JvbGxWaWV3RGlydHlSZWN0KSkKKyAgICAgICAgICAgICAgICBteUNvbnRl
eHQuZmlsbFJlY3QoaENvcm5lciwgY29ybmVyQ29sb3IpOworCisgICAgICAgICAgICBJbnRSZWN0
IHZDb3JuZXIgPSBtX2RhdGEtPmdldFZDb3JuZXIoaW5uZXJTaXplKTsKKyAgICAgICAgICAgIGlm
ICh2Q29ybmVyICE9IGhDb3JuZXIgJiYgdkNvcm5lci5pbnRlcnNlY3RzKHNjcm9sbFZpZXdEaXJ0
eVJlY3QpKQorICAgICAgICAgICAgICAgIG15Q29udGV4dC5maWxsUmVjdCh2Q29ybmVyLCBjb3Ju
ZXJDb2xvcik7CisKKyAgICAgICAgICAgIGRpcnR5UmVjdC5pbnRlcnNlY3QobXlXaW5kb3dSZWN0
KTsKKyAgICAgICAgfQorCisgICAgICAgIG15Q29udGV4dC5yZXN0b3JlKCk7CisgICAgfQorCisg
ICAgKmRpcnR5UmVjdFdpbiA9IGRpcnR5UmVjdDsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpoaWRl
Q2hpbGRTY3JvbGxiYXJzUmVjdXJzaXZlbHkoKQoreworICAgIGNvbnN0IEZyYW1lVmlldyogZnJh
bWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgRnJhbWUq
IGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAg
IGZvciAoRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsg
Y2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBpZiAo
RnJhbWVWaWV3KiB2aWV3ID0gY2hpbGQtPnZpZXcoKSkKKyAgICAgICAgICAgICAgICB2aWV3LT5o
aWRlQ2hpbGRTY3JvbGxiYXJzUmVjdXJzaXZlbHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAg
IG1fZGF0YS0+aGlkZVNjcm9sbGJhcnMoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRTY3Jv
bGxiYXJzVmlzaWJsZShib29sIHYpCit7CisgICAgaWYgKHYpCisgICAgICAgIG1fZGF0YS0+c2hv
d1Njcm9sbGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgZWxzZQorICAgICAgICBtX2RhdGEt
PmhpZGVTY3JvbGxiYXJzKCk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6c2hvd3NTY3JvbGxiYXJz
QXV0b21hdGljYWxseSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9hdXRvU2hvd0hp
ZGVTY3JvbGxiYXJzOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNob3dTY3JvbGxiYXJzQXV0b21h
dGljYWxseSgpCit7CisgICAgbV9kYXRhLT5zZXRBdXRvU2Nyb2xsYmFycyh0cnVlKTsKK30KKwor
dm9pZCBTY3JvbGxWaWV3OjpzaG93U2Nyb2xsYmFyc01hbnVhbGx5KCkKK3sKKyAgICBtX2RhdGEt
PnNldEF1dG9TY3JvbGxiYXJzKGZhbHNlKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzaG93KCkK
K3sKKyAgICBpZiAoIWlzU2VsZlZpc2libGUoKSkgeworICAgICAgICBzZXRTZWxmVmlzaWJsZSh0
cnVlKTsKKyAgICAgICAgaWYgKGlzUGFyZW50VmlzaWJsZSgpKSB7CisgICAgICAgICAgICBIYXNo
U2V0PFJlZlB0cjxXaWRnZXQ+ID46Oml0ZXJhdG9yIGVuZCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5l
bmQoKTsKKyAgICAgICAgICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRv
ciBpdCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAg
ICAgICAgICAgICAgKCppdCktPnNldFBhcmVudFZpc2libGUodHJ1ZSk7CisgICAgICAgIH0KKyAg
ICB9CisKKyAgICBXaWRnZXQ6OnNob3coKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpoaWRlKCkK
K3sKKyAgICBpZiAoaXNTZWxmVmlzaWJsZSgpKSB7CisgICAgICAgIGlmIChpc1BhcmVudFZpc2li
bGUoKSkgeworICAgICAgICAgICAgSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRvciBl
bmQgPSBtX2RhdGEtPm1fY2hpbGRyZW4uZW5kKCk7CisgICAgICAgICAgICBmb3IgKEhhc2hTZXQ8
UmVmUHRyPFdpZGdldD4gPjo6aXRlcmF0b3IgaXQgPSBtX2RhdGEtPm1fY2hpbGRyZW4uYmVnaW4o
KTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAgICAgICAgICgqaXQpLT5zZXRQYXJlbnRWaXNp
YmxlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBzZXRTZWxmVmlzaWJsZShmYWxzZSk7Cisg
ICAgfQorCisgICAgaGlkZUN1cnJlbnRQb3B1cE1lbnUoKTsKKyAgICBXaWRnZXQ6OmhpZGUoKTsK
K30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRQYXJlbnRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sK
KyAgICBpZiAoaXNQYXJlbnRWaXNpYmxlKCkgPT0gdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgV2lkZ2V0OjpzZXRQYXJlbnRWaXNpYmxlKHZpc2libGUpOworCisgICAgaWYgKCFpc1Nl
bGZWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsKKworICAgIEhhc2hTZXQ8UmVmUHRyPFdpZGdl
dD4gPjo6aXRlcmF0b3IgZW5kID0gbV9kYXRhLT5tX2NoaWxkcmVuLmVuZCgpOworICAgIGZvciAo
SGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRvciBpdCA9IG1fZGF0YS0+bV9jaGlsZHJl
bi5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgICgqaXQpLT5zZXRQYXJlbnRWaXNp
YmxlKHZpc2libGUpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OmhpZGVDdXJyZW50UG9wdXBNZW51
KCkgY29uc3QKK3sKKyAgICBpZiAobV9jdXJyZW50UG9wdXBNZW51KQorICAgICAgICBtX2N1cnJl
bnRQb3B1cE1lbnUtPmhpZGUoKTsKK30KKworSW50UmVjdCBTY3JvbGxWaWV3Ojp2aXNpYmxlV2lu
ZG93UmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKHBhcmVudCgpKSB7CisgICAgICAgIEludFJlY3Qg
dmlzaWJsZVdpbmRvd1JlY3QocGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3cobV9kYXRhLT5nZXRW
aXNpYmxlQ29udGVudFJlY3QoKSkpOworICAgICAgICB2aXNpYmxlV2luZG93UmVjdC5pbnRlcnNl
Y3QocGFyZW50KCktPnZpc2libGVXaW5kb3dSZWN0KCkpOworICAgICAgICByZXR1cm4gdmlzaWJs
ZVdpbmRvd1JlY3Q7CisgICAgfSBlbHNlIHsKKyAgICAgICAgSW50UmVjdCB2aXNpYmxlV2luZG93
UmVjdChtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSk7CisgICAgICAgIGlmIChtX2RhdGEtPm1f
c2Nyb2xsYmFyc1Zpc2libGUpIHsKKyAgICAgICAgICAgIGlmIChtX2RhdGEtPmNhblNob3dIU2Ny
b2xsYmFyKCkpCisgICAgICAgICAgICAgICAgdmlzaWJsZVdpbmRvd1JlY3Quc2V0SGVpZ2h0KHN0
YWJsZVJvdW5kKG1fZGF0YS0+bV9oQmFyLT55KCkgKiBzY2FsZSgpKSk7CisgICAgICAgICAgICBp
ZiAobV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigpKQorICAgICAgICAgICAgICAgIHZpc2libGVX
aW5kb3dSZWN0LnNldFdpZHRoKHN0YWJsZVJvdW5kKG1fZGF0YS0+bV92QmFyLT54KCkgKiBzY2Fs
ZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZpc2libGVXaW5kb3dSZWN0OworICAg
IH0KK30KKworSW50U2l6ZSBTY3JvbGxWaWV3OjptYXhTY3JvbGxPZmZzZXRSZWN1cnNpdmVseSgp
IGNvbnN0Cit7CisgICAgSW50U2l6ZSBtYXhTY3JvbGxQb3NpdGlvbihtYXgoMCwgY29udGVudHNX
aWR0aCgpIC0gd2lkdGgoKSksIG1heCgwLCBjb250ZW50c0hlaWdodCgpIC0gaGVpZ2h0KCkpKTsK
KyAgICBpZiAocGFyZW50KCkpCisgICAgICAgIG1heFNjcm9sbFBvc2l0aW9uICs9IHBhcmVudCgp
LT5tYXhTY3JvbGxPZmZzZXRSZWN1cnNpdmVseSgpOworICAgIHJldHVybiBtYXhTY3JvbGxQb3Np
dGlvbjsKK30KKworSW50U2l6ZSBTY3JvbGxWaWV3OjpjdXJyZW50U2Nyb2xsT2Zmc2V0UmVjdXJz
aXZlbHkoKSBjb25zdAoreworICAgIEludFNpemUgc2Nyb2xsT2Zmc2V0KG1fZGF0YS0+bV9zY3Jv
bGxPZmZzZXQpOworICAgIGlmIChwYXJlbnQoKSkKKyAgICAgICAgc2Nyb2xsT2Zmc2V0ICs9IHBh
cmVudCgpLT5jdXJyZW50U2Nyb2xsT2Zmc2V0UmVjdXJzaXZlbHkoKTsKKyAgICByZXR1cm4gc2Ny
b2xsT2Zmc2V0OworfQorCitJbnRTaXplIFNjcm9sbFZpZXc6OndpbmRvd1Njcm9sbE9mZnNldCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQgKiBzY2FsZSgpOwor
fQorCitJbnRSZWN0IFNjcm9sbFZpZXc6OndpbmRvd0NvbnRlbnRzUmVjdCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIGNvbnRlbnRzVG9XaW5kb3coSW50UmVjdChJbnRQb2ludCgwLCAwKSwgbV9kYXRh
LT5tX2NvbnRlbnRzU2l6ZSkpOworfQorCisvLyBTY3JvbGxiYXJDbGllbnQKK3ZvaWQgU2Nyb2xs
Vmlldzo6dmFsdWVDaGFuZ2VkKFNjcm9sbGJhciogc2Nyb2xsYmFyKQoreworICAgIG1fZGF0YS0+
dmFsdWVDaGFuZ2VkKHNjcm9sbGJhcik7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6c2Nyb2xsYmFy
Q29ybmVyUHJlc2VudCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV9oQmFyICYmIG1f
ZGF0YS0+bV92QmFyOworfQorCisvLyBOZXcKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0SGFzSG9yaXpv
bnRhbFNjcm9sbGJhcihib29sIGhhcykKK3sKKyAgICBtX2RhdGEtPnNldEhhc0hvcml6b250YWxT
Y3JvbGxiYXIoaGFzKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRIYXNWZXJ0aWNhbFNjcm9s
bGJhcihib29sIGhhcykKK3sKKyAgICBtX2RhdGEtPnNldEhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGhh
cyk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6c2Nyb2xsYmFyc1N1cHByZXNzZWQoKSBjb25zdAor
eworICAgIHJldHVybiBtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQ7Cit9CisKK3ZvaWQg
U2Nyb2xsVmlldzo6c2V0Q2FuQmxpdE9uU2Nyb2xsKGJvb2wpCit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKK30KK2Jvb2wgU2Nyb2xsVmlldzo6Y2FuQmxpdE9uU2Nyb2xsKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0Q2FuSGF2ZVNjcm9sbGJh
cnMoYm9vbCBjYW5TY3JvbGwpCit7CisgICAgU2Nyb2xsYmFyTW9kZSBuZXdIb3Jpem9udGFsTW9k
ZTsKKyAgICBTY3JvbGxiYXJNb2RlIG5ld1ZlcnRpY2FsTW9kZTsKKworICAgIHNjcm9sbGJhck1v
ZGVzKG5ld0hvcml6b250YWxNb2RlLCBuZXdWZXJ0aWNhbE1vZGUpOworCisgICAgaWYgKGNhblNj
cm9sbCAmJiBuZXdWZXJ0aWNhbE1vZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQorICAgICAgICBu
ZXdWZXJ0aWNhbE1vZGUgPSBTY3JvbGxiYXJBdXRvOworICAgIGVsc2UgaWYgKCFjYW5TY3JvbGwp
CisgICAgICAgIG5ld1ZlcnRpY2FsTW9kZSA9IFNjcm9sbGJhckFsd2F5c09mZjsKKworICAgIGlm
IChjYW5TY3JvbGwgJiYgbmV3SG9yaXpvbnRhbE1vZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQor
ICAgICAgICBuZXdIb3Jpem9udGFsTW9kZSA9IFNjcm9sbGJhckF1dG87CisgICAgZWxzZSBpZiAo
IWNhblNjcm9sbCkKKyAgICAgICAgbmV3SG9yaXpvbnRhbE1vZGUgPSBTY3JvbGxiYXJBbHdheXNP
ZmY7CisKKyAgICBzZXRTY3JvbGxiYXJNb2RlcyhuZXdIb3Jpem9udGFsTW9kZSwgbmV3VmVydGlj
YWxNb2RlKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJN
b2RlJiBob3Jpem9udGFsTW9kZSwgU2Nyb2xsYmFyTW9kZSYgdmVydGljYWxNb2RlKSBjb25zdAor
eworICAgIGhvcml6b250YWxNb2RlID0gaG9yaXpvbnRhbFNjcm9sbGJhck1vZGUoKTsKKyAgICB2
ZXJ0aWNhbE1vZGUgPSB2ZXJ0aWNhbFNjcm9sbGJhck1vZGUoKTsKK30KKworUGFzc1JlZlB0cjxT
Y3JvbGxiYXI+IFNjcm9sbFZpZXc6OmNyZWF0ZVNjcm9sbGJhcihTY3JvbGxiYXJPcmllbnRhdGlv
biBvcmllbnRhdGlvbikKK3sKKyAgICByZXR1cm4gU2Nyb2xsYmFyOjpjcmVhdGVOYXRpdmVTY3Jv
bGxiYXIodGhpcywgb3JpZW50YXRpb24sIFJlZ3VsYXJTY3JvbGxiYXIpOworfQorCitpbnQgU2Ny
b2xsVmlldzo6bGF5b3V0V2lkdGgoKSBjb25zdAoreworICAgIHJldHVybiBtX2ZpeGVkTGF5b3V0
U2l6ZS5pc0VtcHR5KCkgfHwgIW1fdXNlRml4ZWRMYXlvdXQgPyB2aXNpYmxlV2lkdGgoKSA6IG1f
Zml4ZWRMYXlvdXRTaXplLndpZHRoKCk7Cit9CisKK2ludCBTY3JvbGxWaWV3OjpsYXlvdXRIZWln
aHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2ZpeGVkTGF5b3V0U2l6ZS5pc0VtcHR5KCkgfHwg
IW1fdXNlRml4ZWRMYXlvdXQgPyB2aXNpYmxlSGVpZ2h0KCkgOiBtX2ZpeGVkTGF5b3V0U2l6ZS5o
ZWlnaHQoKTsKK30KKworSW50U2l6ZSBTY3JvbGxWaWV3OjpmaXhlZExheW91dFNpemUoKSBjb25z
dAoreworICAgIHJldHVybiBtX2ZpeGVkTGF5b3V0U2l6ZTsKK30KKwordm9pZCBTY3JvbGxWaWV3
OjpzZXRGaXhlZExheW91dFNpemUoY29uc3QgSW50U2l6ZSYgbmV3U2l6ZSkKK3sKKyAgICBpZiAo
Zml4ZWRMYXlvdXRTaXplKCkgPT0gbmV3U2l6ZSkKKyAgICAgICAgcmV0dXJuOworICAgIG1fZml4
ZWRMYXlvdXRTaXplID0gbmV3U2l6ZTsKKyAgICB1cGRhdGVTY3JvbGxiYXJzKHNjcm9sbE9mZnNl
dCgpKTsKK30KKworYm9vbCBTY3JvbGxWaWV3Ojp1c2VGaXhlZExheW91dCgpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fdXNlRml4ZWRMYXlvdXQ7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0VXNl
Rml4ZWRMYXlvdXQoYm9vbCBlbmFibGUpCit7CisgICAgaWYgKHVzZUZpeGVkTGF5b3V0KCkgPT0g
ZW5hYmxlKQorICAgICAgICByZXR1cm47CisgICAgbV91c2VGaXhlZExheW91dCA9IGVuYWJsZTsK
KyAgICB1cGRhdGVTY3JvbGxiYXJzKHNjcm9sbE9mZnNldCgpKTsKK30KKworYm9vbCBTY3JvbGxW
aWV3Ojppc09mZnNjcmVlbigpIGNvbnN0Cit7CisgICAgcmV0dXJuICFpc1Zpc2libGUoKSB8fCAh
SXNXaW5kb3dWaXNpYmxlKHBsYXRmb3JtV2lkZ2V0KCkpOworfQorCit2b2lkIFNjcm9sbFZpZXc6
OnNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IEludFBvaW50JiBwb3MpCit7CisgICAgc2V0Q29udGVu
dHNQb3MocG9zLngoKSwgcG9zLnkoKSk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6Y29udGFpbnNT
Y3JvbGxiYXJzQXZvaWRpbmdSZXNpemVyKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9
CisKK2Jvb2wgU2Nyb2xsVmlldzo6Zmxvd1RleHRUb0ZpdChjb25zdCBOb2RlKiBub2RlKSBjb25z
dAoreworICAgIHJldHVybiBob3N0V2luZG93KCkmJiBob3N0V2luZG93KCktPmZsb3dUZXh0VG9G
aXQobm9kZSk7Cit9CisKK2Zsb2F0IFNjcm9sbFZpZXc6OmRlZmF1bHRTY2FsZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGhvc3RXaW5kb3coKSA/IGhvc3RXaW5kb3coKS0+ZGVmYXVsdFNjYWxlKCkg
OiAxLjsKK30KKwordm9pZCBTY3JvbGxWaWV3OjphZGp1c3RTY3JvbGxiYXJzQXZvaWRpbmdSZXNp
emVyQ291bnQoaW50IG92ZXJsYXBEZWx0YSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
CitTY3JvbGxiYXIqIFNjcm9sbFZpZXc6Omhvcml6b250YWxTY3JvbGxiYXIoKSBjb25zdAorewor
ICAgIHJldHVybiBtX2RhdGEtPm1faEJhci5nZXQoKTsKK30KKworU2Nyb2xsYmFyKiBTY3JvbGxW
aWV3Ojp2ZXJ0aWNhbFNjcm9sbGJhcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV92
QmFyLmdldCgpOworfQorCitib29sIFNjcm9sbFZpZXc6OmlzUG9pbnRJblNjcm9sbGJhckNvcm5l
cihjb25zdCBJbnRQb2ludCYgd2luZG93UG9pbnQpCit7CisgICAgaWYgKCFtX2RhdGEtPm1fc2Ny
b2xsYmFyc1Zpc2libGUgfHwgIW1fZGF0YS0+Y2FuU2hvd0hTY3JvbGxiYXIoKSB8fCAhbV9kYXRh
LT5jYW5TaG93VlNjcm9sbGJhcigpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBJbnRQ
b2ludCBwb2ludCA9IHdpbmRvd1RvQ29udGVudHMod2luZG93UG9pbnQpOworCisgICAgSW50U2l6
ZSBpbm5lclNpemUobV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoLCBtX2RhdGEtPm1fdmlz
aWJsZUNvbnRlbnRzSGVpZ2h0KTsKKyAgICBJbnRSZWN0IGhDb3JuZXIgPSBtX2RhdGEtPmdldEhD
b3JuZXIoaW5uZXJTaXplKTsKKworICAgIGlmIChoQ29ybmVyLmNvbnRhaW5zKHBvaW50KSkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBJbnRSZWN0IHZDb3JuZXIgPSBtX2RhdGEtPmdldFZD
b3JuZXIoaW5uZXJTaXplKTsKKyAgICBpZiAodkNvcm5lciAhPSBoQ29ybmVyICYmIHZDb3JuZXIu
Y29udGFpbnMocG9pbnQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxz
ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33825</attachid>
            <date>2009-07-30 13:30:41 -0700</date>
            <delta_ts>2009-08-08 10:47:36 -0700</delta_ts>
            <desc>3) Widget, Scrollbar</desc>
            <filename>27543_3.patch</filename>
            <type>text/plain</type>
            <size>40828</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGxhdGZvcm1TY3JvbGxCYXJXaW5j
ZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZGFjNTIKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3Bw
CkBAIC0wLDAgKzEsNTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBN
b2JpbGUgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJQbGF0Zm9y
bVNjcm9sbEJhci5oIgorCisjaW5jbHVkZSAiRXZlbnRIYW5kbGVyLmgiCisjaW5jbHVkZSAiRnJh
bWUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQu
aCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1Nb3VzZUV2ZW50Lmgi
CisjaW5jbHVkZSAiU2Nyb2xsYmFyVGhlbWUuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKwor
Ly8gc3RhYmxlUm91bmQgcm91bmRzIC0wLjUgdG8gMCwgd2hlcmUgbHJvdW5kIHJvdW5kcyAtMC41
IHRvIC0xLgorc3RhdGljIGlubGluZSBpbnQgc3RhYmxlUm91bmQoZG91YmxlIGQpCit7CisgICAg
aWYgKGQgPiAwKQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihkICsgMC41KTsKKwor
ICAgIGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihkKTsKKyAgICByZXR1cm4gaSAtIGQgPiAwLjUg
PyBpIC0gMSA6IGk7Cit9CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworZW51bSBTY3JvbGxCYXJTdGF0ZSB7CisgICAgU2Nyb2xsQmFyRGlzYWJsZWQsCisg
ICAgU2Nyb2xsQmFyRW5hYmxlZCwKKyAgICBTY3JvbGxCYXJQcmVzc2VkLAorfTsKKworc3RhdGlj
IGludCBjSG9yaXpvbnRhbFdpZHRoW10gPSB7IDE1LCAxMSB9Oworc3RhdGljIGludCBjSG9yaXpv
bnRhbEhlaWdodFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY1ZlcnRpY2FsV2lkdGhbXSA9
IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbEhlaWdodFtdID0geyAxNSwgMTEgfTsK
KworY29uc3QgZG91YmxlIGNJbml0aWFsVGltZXJEZWxheSA9IDAuMjU7Citjb25zdCBkb3VibGUg
Y05vcm1hbFRpbWVyRGVsYXkgPSAwLjA1OworCitQbGF0Zm9ybVNjcm9sbGJhcjo6UGxhdGZvcm1T
Y3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsIFNjcm9sbGJhck9yaWVudGF0aW9uIG9y
aWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQorICAgIDogU2Nyb2xsYmFyKGNs
aWVudCwgb3JpZW50YXRpb24sIHNpemUpCisgICAgLCBtX2hvdmVyZWRQYXJ0KE5vUGFydCkKKyAg
ICAsIG1fcHJlc3NlZFBhcnQoTm9QYXJ0KQorICAgICwgbV9wcmVzc2VkUG9zKDApCisgICAgLCBt
X3Njcm9sbFRpbWVyKHRoaXMsICZQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmly
ZWQpCisgICAgLCBtX292ZXJsYXBzUmVzaXplcihmYWxzZSkKKyAgICAsIG1fdmlzaWJsZSh0cnVl
KQorICAgICwgbV9pc1ZpZXdTY3JvbGxiYXIoZmFsc2UpCit7CisgICAgaWYgKG9yaWVudGF0aW9u
ID09IFZlcnRpY2FsU2Nyb2xsYmFyKQorICAgICAgICBzZXRGcmFtZVJlY3QoSW50UmVjdCgwLCAw
LCBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZSgpXSwgY1ZlcnRpY2FsSGVpZ2h0W2NvbnRyb2xT
aXplKCldKSk7CisgICAgZWxzZQorICAgICAgICBzZXRGcmFtZVJlY3QoSW50UmVjdCgwLCAwLCBj
SG9yaXpvbnRhbFdpZHRoW2NvbnRyb2xTaXplKCldLCBjSG9yaXpvbnRhbEhlaWdodFtjb250cm9s
U2l6ZSgpXSkpOworfQorCitQbGF0Zm9ybVNjcm9sbGJhcjo6flBsYXRmb3JtU2Nyb2xsYmFyKCkK
K3sKKyAgICBzdG9wVGltZXJJZk5lZWRlZCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFy
Ojp1cGRhdGVUaHVtYlBvc2l0aW9uKCkKK3sKKyAgICBpbnZhbGlkYXRlVHJhY2soKTsKK30KKwor
dm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQcm9wb3J0aW9uKCkKK3sKKyAgICBp
bnZhbGlkYXRlVHJhY2soKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52YWxpZGF0
ZVRyYWNrKCkKK3sKKyAgICBpZiAoIW1fdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
SW50UmVjdCByZWN0ID0gdHJhY2tSZWN0KCk7CisgICAgcmVjdC5tb3ZlKC14KCksIC15KCkpOwor
ICAgIGludmFsaWRhdGVSZWN0KHJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpp
bnZhbGlkYXRlUGFydChTY3JvbGxiYXJQYXJ0IHBhcnQpCit7CisgICAgaWYgKCFtX3Zpc2libGUp
CisgICAgICAgIHJldHVybjsKKworICAgIGlmIChwYXJ0ID09IE5vUGFydCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgSW50UmVjdCByZXN1bHQ7CisgICAgc3dpdGNoIChwYXJ0KSB7CisgICAgY2Fz
ZSBCYWNrQnV0dG9uU3RhcnRQYXJ0OgorICAgICAgICByZXN1bHQgPSBiYWNrQnV0dG9uUmVjdCgp
OworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZvcndhcmRCdXR0b25TdGFydFBhcnQ6CisgICAg
ICAgIHJlc3VsdCA9IGZvcndhcmRCdXR0b25SZWN0KCk7CisgICAgICAgIGJyZWFrOworICAgIGRl
ZmF1bHQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEludFJlY3QgYmVmb3JlVGh1bWJSZWN0LCB0
aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICAgICAgc3BsaXRUcmFjayh0cmFja1Jl
Y3QoKSwgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICAg
ICAgICAgIGlmIChwYXJ0ID09IEJhY2tUcmFja1BhcnQpCisgICAgICAgICAgICAgICAgcmVzdWx0
ID0gYmVmb3JlVGh1bWJSZWN0OworICAgICAgICAgICAgZWxzZSBpZiAocGFydCA9PSBGb3J3YXJk
VHJhY2tQYXJ0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGFmdGVyVGh1bWJSZWN0OworICAg
ICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRodW1iUmVjdDsKKyAgICAg
ICAgfQorICAgIH0KKyAgICByZXN1bHQubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnZhbGlkYXRl
UmVjdChyZXN1bHQpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6OndpZHRoKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gV2lkZ2V0Ojp3aWR0aCgpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxi
YXI6OmhlaWdodCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFdpZGdldDo6aGVpZ2h0KCk7Cit9CisK
K3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNldFJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sK
KyAgICBzZXRGcmFtZVJlY3QocmVjdCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNl
dFBhcmVudChTY3JvbGxWaWV3KiBwYXJlbnRWaWV3KQoreworICAgIFdpZGdldDo6c2V0UGFyZW50
KHBhcmVudFZpZXcpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRFbmFibGVkKGJv
b2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCAhPSBpc0VuYWJsZWQoKSkgeworICAgICAg
ICBTY3JvbGxiYXI6OnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgIGlmIChtX3Zpc2libGUp
CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorfQorCit2b2lkIFBsYXRmb3JtU2Ny
b2xsYmFyOjpwYWludChHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzQ29udGV4dCwgY29uc3QgSW50
UmVjdCYgZGFtYWdlUmVjdCkKK3sKKyAgICBpZiAoIW1fdmlzaWJsZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKGdyYXBoaWNzQ29udGV4dC0+cGFpbnRpbmdEaXNhYmxlZCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICAvLyBEb24ndCBwYWludCBhbnl0aGluZyBpZiB0aGUgc2Nyb2xsYmFy
IGRvZXNuJ3QgaW50ZXJzZWN0IHRoZSBkYW1hZ2UgcmVjdC4KKyAgICBpZiAoIWZyYW1lUmVjdCgp
LmludGVyc2VjdHMoZGFtYWdlUmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIGdyYXBoaWNz
Q29udGV4dC0+c2F2ZSgpOworCisgICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VTdHlsZShT
b2xpZFN0cm9rZSk7CisgICAgZ3JhcGhpY3NDb250ZXh0LT5zZXRTdHJva2VDb2xvcihDb2xvcigw
LCAwLCAwKSk7CisKKyAgICBJbnRSZWN0IHRyYWNrID0gdHJhY2tSZWN0KCk7CisgICAgcGFpbnRU
cmFjayhncmFwaGljc0NvbnRleHQsIHRyYWNrLCB0cnVlLCBkYW1hZ2VSZWN0KTsKKworICAgIGlm
IChpc0VuYWJsZWQoKSkgeworICAgICAgICBwYWludEJ1dHRvbihncmFwaGljc0NvbnRleHQsIGJh
Y2tCdXR0b25SZWN0KCksIHRydWUsIGRhbWFnZVJlY3QpOworICAgICAgICBwYWludEJ1dHRvbihn
cmFwaGljc0NvbnRleHQsIGZvcndhcmRCdXR0b25SZWN0KCksIGZhbHNlLCBkYW1hZ2VSZWN0KTsK
KyAgICB9CisKKyAgICBpZiAoZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHRyYWNrKSAmJiBpc0VuYWJs
ZWQoKSkgeworICAgICAgICBJbnRSZWN0IHN0YXJ0VHJhY2tSZWN0LCB0aHVtYlJlY3QsIGVuZFRy
YWNrUmVjdDsKKyAgICAgICAgc3BsaXRUcmFjayh0cmFjaywgc3RhcnRUcmFja1JlY3QsIHRodW1i
UmVjdCwgZW5kVHJhY2tSZWN0KTsKKyAgICAgICAgcGFpbnRUaHVtYihncmFwaGljc0NvbnRleHQs
IHRodW1iUmVjdCwgZGFtYWdlUmVjdCk7CisgICAgfQorCisgICAgZ3JhcGhpY3NDb250ZXh0LT5y
ZXN0b3JlKCk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmJhY2tCdXR0b25SZWN0
KCkgY29uc3QKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFy
KQorICAgICAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgaGVpZ2h0KCksIGhlaWdodCgpKTsK
KyAgICByZXR1cm4gSW50UmVjdCh4KCksIHkoKSwgd2lkdGgoKSwgd2lkdGgoKSk7Cit9CisKK0lu
dFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OmZvcndhcmRCdXR0b25SZWN0KCkgY29uc3QKK3sKKyAg
ICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAgICByZXR1
cm4gSW50UmVjdCh4KCkgKyB3aWR0aCgpIC0gaGVpZ2h0KCksIHkoKSwgaGVpZ2h0KCksIGhlaWdo
dCgpKTsKKworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpICsgaGVpZ2h0KCkgLSB3aWR0aCgp
LCB3aWR0aCgpLCB3aWR0aCgpKTsKK30KKworSW50UmVjdCBQbGF0Zm9ybVNjcm9sbGJhcjo6dHJh
Y2tSZWN0KCkgY29uc3QKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Ny
b2xsYmFyKSB7CisgICAgICAgIGlmICh3aWR0aCgpIDwgaGVpZ2h0KCkgKyBoZWlnaHQoKSkKKyAg
ICAgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisgICAgICAgIHJldHVybiBJbnRSZWN0KHgoKSAr
IGhlaWdodCgpLCB5KCksIHdpZHRoKCkgLSBoZWlnaHQoKSAtIGhlaWdodCgpLCBoZWlnaHQoKSk7
CisgICAgfQorCisgICAgaWYgKGhlaWdodCgpIDwgd2lkdGgoKSArIHdpZHRoKCkpCisgICAgICAg
IHJldHVybiBJbnRSZWN0KCk7CisgICAgcmV0dXJuIEludFJlY3QoeCgpLCB5KCkgKyB3aWR0aCgp
LCB3aWR0aCgpLCBoZWlnaHQoKSAtIHdpZHRoKCkgLSB3aWR0aCgpKTsKK30KKworSW50UmVjdCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJSZWN0KCkgY29uc3QKK3sKKyAgICBJbnRSZWN0IGJlZm9y
ZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdDsKKyAgICBzcGxpdFRyYWNrKHRy
YWNrUmVjdCgpLCBiZWZvcmVUaHVtYlJlY3QsIHRodW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3QpOwor
ICAgIHJldHVybiB0aHVtYlJlY3Q7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnNwbGl0
VHJhY2soY29uc3QgSW50UmVjdCYgdHJhY2tSZWN0LCBJbnRSZWN0JiBiZWZvcmVUaHVtYlJlY3Qs
IEludFJlY3QmIHRodW1iUmVjdCwgSW50UmVjdCYgYWZ0ZXJUaHVtYlJlY3QpIGNvbnN0Cit7Cisg
ICAgLy8gVGhpcyBmdW5jdGlvbiB3b24ndCBldmVuIGdldCBjYWxsZWQgdW5sZXNzIHdlJ3JlIGJp
ZyBlbm91Z2ggdG8gaGF2ZSBzb21lIGNvbWJpbmF0aW9uIG9mIHRoZXNlIHRocmVlIHJlY3RzIHdo
ZXJlIGF0IGxlYXN0CisgICAgLy8gb25lIG9mIHRoZW0gaXMgbm9uLWVtcHR5LgorICAgIGludCB0
aHVtYlBvcyA9IHRodW1iUG9zaXRpb24oKTsKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIHRodW1iUmVjdCA9IEludFJlY3QodHJhY2tSZWN0
LngoKSArIHRodW1iUG9zLCB0cmFja1JlY3QueSgpLCB0aHVtYkxlbmd0aCgpLCB0cmFja1JlY3Qu
aGVpZ2h0KCkpOworICAgICAgICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54
KCksIHRyYWNrUmVjdC55KCksIHRodW1iUG9zLCB0cmFja1JlY3QuaGVpZ2h0KCkpOworICAgICAg
ICBhZnRlclRodW1iUmVjdCA9IEludFJlY3QodGh1bWJSZWN0LngoKSArIHRodW1iUmVjdC53aWR0
aCgpLCB0cmFja1JlY3QueSgpLCB0cmFja1JlY3QucmlnaHQoKSAtIHRodW1iUmVjdC5yaWdodCgp
LCB0cmFja1JlY3QuaGVpZ2h0KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRodW1iUmVjdCA9
IEludFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSArIHRodW1iUG9zLCB0cmFja1Jl
Y3Qud2lkdGgoKSwgdGh1bWJMZW5ndGgoKSk7CisgICAgICAgIGJlZm9yZVRodW1iUmVjdCA9IElu
dFJlY3QodHJhY2tSZWN0LngoKSwgdHJhY2tSZWN0LnkoKSwgdHJhY2tSZWN0LndpZHRoKCksIHRo
dW1iUG9zKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCks
IHRodW1iUmVjdC55KCkgKyB0aHVtYlJlY3QuaGVpZ2h0KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0
cmFja1JlY3QuYm90dG9tKCkgLSB0aHVtYlJlY3QuYm90dG9tKCkpOworICAgIH0KK30KKworaW50
IFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlBvc2l0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoaXNF
bmFibGVkKCkpCisgICAgICAgIHJldHVybiBzdGFibGVSb3VuZCgoZmxvYXQpbV9jdXJyZW50UG9z
ICogKHRyYWNrTGVuZ3RoKCkgLSB0aHVtYkxlbmd0aCgpKSAvIChtX3RvdGFsU2l6ZSAtIG1fdmlz
aWJsZVNpemUpKTsKKyAgICByZXR1cm4gMDsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp0
aHVtYkxlbmd0aCgpIGNvbnN0Cit7CisgICAgaWYgKCFpc0VuYWJsZWQoKSkKKyAgICAgICAgcmV0
dXJuIDA7CisKKyAgICBmbG9hdCBwcm9wb3J0aW9uID0gKGZsb2F0KShtX3Zpc2libGVTaXplKSAv
IG1fdG90YWxTaXplOworICAgIGludCB0cmFja0xlbiA9IHRyYWNrTGVuZ3RoKCk7CisgICAgaW50
IGxlbmd0aCA9IHN0YWJsZVJvdW5kKHByb3BvcnRpb24gKiB0cmFja0xlbik7CisgICAgaW50IG1p
bkxlbmd0aCA9IG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGhlaWdodCgp
IDogd2lkdGgoKTsKKyAgICBsZW5ndGggPSBtYXgobGVuZ3RoLCBtaW5MZW5ndGgpOworICAgIGlm
IChsZW5ndGggPiB0cmFja0xlbikKKyAgICAgICAgbGVuZ3RoID0gMDsgLy8gT25jZSB0aGUgdGh1
bWIgaXMgYmVsb3cgdGhlIHRyYWNrIGxlbmd0aCwgaXQganVzdCBnb2VzIGF3YXkgKHRvIG1ha2Ug
bW9yZSByb29tIGZvciB0aGUgdHJhY2spLgorICAgIHJldHVybiBsZW5ndGg7Cit9CisKK2ludCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6dHJhY2tMZW5ndGgoKSBjb25zdAoreworICAgIHJldHVybiAobV9v
cmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRyYWNrUmVjdCgpLndpZHRoKCkg
OiB0cmFja1JlY3QoKS5oZWlnaHQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFp
bnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBwYWludFJl
Y3QsIGJvb2wgc3RhcnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAg
aWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgVUlOVCBzdGF0ZSA9ICFpc0VuYWJsZWQoKQorICAgICAgICA/IERGQ1NfSU5BQ1RJVkUK
KyAgICAgICAgOiBtX3ByZXNzZWRQYXJ0ID09IChzdGFydCA/IEJhY2tCdXR0b25TdGFydFBhcnQg
OiBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0KQorICAgICAgICA/IERGQ1NfUFVTSEVECisgICAgICAg
IDogMDsKKworICAgIFVJTlQgYXJyb3cgPSBtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIKKyAgICAgICAgPyBzdGFydCA/IERGQ1NfU0NST0xMTEVGVCA6IERGQ1NfU0NST0xMUklH
SFQKKyAgICAgICAgOiBzdGFydCA/IERGQ1NfU0NST0xMVVAgOiBERkNTX1NDUk9MTERPV047CisK
KyAgICBjb250ZXh0LT5kcmF3RnJhbWVDb250cm9sKHBhaW50UmVjdCwgREZDX1NDUk9MTCwgYXJy
b3cgfCBzdGF0ZSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VHJhY2soR3Jh
cGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiBwYWludFJlY3QsIGJvb2wgc3Rh
cnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFkYW1hZ2VS
ZWN0LmludGVyc2VjdHMocGFpbnRSZWN0KSkKKyAgICAgICAgcmV0dXJuOworCisgICAgRFdPUkQg
Y29sb3IgPSBHZXRTeXNDb2xvcihDT0xPUl9TQ1JPTExCQVIpOworICAgIGNvbnRleHQtPmZpbGxS
ZWN0KHBhaW50UmVjdCwgQ29sb3IoR2V0UlZhbHVlKGNvbG9yKSAvIDIsIEdldEdWYWx1ZShjb2xv
cikgLyAyLCBHZXRCVmFsdWUoY29sb3IpIC8gMikpOworICAgIGNvbnRleHQtPnN0cm9rZVJlY3Qo
cGFpbnRSZWN0LCAxKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRUaHVtYihH
cmFwaGljc0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IEludFJlY3QmIHJlY3QsIGNvbnN0IEludFJl
Y3QmIGRhbWFnZVJlY3QpIGNvbnN0Cit7CisgICAgaWYgKCFkYW1hZ2VSZWN0LmludGVyc2VjdHMo
cmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFVJTlQgc3RhdGUgPSAhaXNFbmFibGVkKCkK
KyAgICAgICAgPyBERkNTX0lOQUNUSVZFCisgICAgICAgIDogbV9wcmVzc2VkUGFydCA9PSBUaHVt
YlBhcnQKKyAgICAgICAgPyBERkNTX1BVU0hFRAorICAgICAgICA6IDA7CisKKyAgICBjb250ZXh0
LT5kcmF3RnJhbWVDb250cm9sKHJlY3QsIERGQ19CVVRUT04sIERGQ1NfQlVUVE9OUFVTSCB8IHN0
YXRlKTsKK30KKworU2Nyb2xsYmFyUGFydCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGl0VGVzdChjb25z
dCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBTY3JvbGxiYXJQYXJ0IHJlc3VsdCA9
IE5vUGFydDsKKyAgICBpZiAoIW1fdmlzaWJsZSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICBpZiAoIWlzRW5hYmxlZCgpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisgICAgSW50UG9p
bnQgbW91c2VQb3NpdGlvbiA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkp
OworICAgIG1vdXNlUG9zaXRpb24ubW92ZSh4KCksIHkoKSk7CisgICAgaWYgKGJhY2tCdXR0b25S
ZWN0KCkuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgIHJlc3VsdCA9IEJhY2tCdXR0
b25TdGFydFBhcnQ7CisgICAgZWxzZSBpZiAoZm9yd2FyZEJ1dHRvblJlY3QoKS5jb250YWlucyht
b3VzZVBvc2l0aW9uKSkKKyAgICAgICAgcmVzdWx0ID0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFydDsK
KyAgICBlbHNlIHsKKyAgICAgICAgSW50UmVjdCB0cmFjayA9IHRyYWNrUmVjdCgpOworICAgICAg
ICBpZiAodHJhY2suY29udGFpbnMobW91c2VQb3NpdGlvbikpIHsKKyAgICAgICAgICAgIEludFJl
Y3QgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0OworICAgICAgICAg
ICAgc3BsaXRUcmFjayh0cmFjaywgYmVmb3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1
bWJSZWN0KTsKKyAgICAgICAgICAgIGlmIChiZWZvcmVUaHVtYlJlY3QuY29udGFpbnMobW91c2VQ
b3NpdGlvbikpCisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQmFja1RyYWNrUGFydDsKKyAgICAg
ICAgICAgIGVsc2UgaWYgKHRodW1iUmVjdC5jb250YWlucyhtb3VzZVBvc2l0aW9uKSkKKyAgICAg
ICAgICAgICAgICByZXN1bHQgPSBUaHVtYlBhcnQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgcmVzdWx0ID0gRm9yd2FyZFRyYWNrUGFydDsKKyAgICAgICAgfQorICAgIH0KKyAg
ICByZXR1cm4gcmVzdWx0OworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3Vz
ZU1vdmVFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAgICBpZiAobV9w
cmVzc2VkUGFydCA9PSBUaHVtYlBhcnQpIHsKKyAgICAgICAgLy8gRHJhZyB0aGUgdGh1bWIuCisg
ICAgICAgIGludCB0aHVtYlBvcyA9IHRodW1iUG9zaXRpb24oKTsKKyAgICAgICAgaW50IHRodW1i
TGVuID0gdGh1bWJMZW5ndGgoKTsKKyAgICAgICAgaW50IHRyYWNrTGVuID0gdHJhY2tMZW5ndGgo
KTsKKyAgICAgICAgaW50IG1heFBvcyA9IHRyYWNrTGVuIC0gdGh1bWJMZW47CisgICAgICAgIGlu
dCBkZWx0YSA9IDA7CisgICAgICAgIGlmIChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3Jv
bGxiYXIpCisgICAgICAgICAgICBkZWx0YSA9IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhl
dnQucG9zKCkpLngoKSAtIG1fcHJlc3NlZFBvczsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
ZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS55KCkgLSBtX3By
ZXNzZWRQb3M7CisKKyAgICAgICAgaWYgKGRlbHRhID4gMCkKKyAgICAgICAgICAgIC8vIFRoZSBt
b3VzZSBtb3ZlZCBkb3duL3JpZ2h0LgorICAgICAgICAgICAgZGVsdGEgPSBtaW4obWF4UG9zIC0g
dGh1bWJQb3MsIGRlbHRhKTsKKyAgICAgICAgZWxzZSBpZiAoZGVsdGEgPCAwKQorICAgICAgICAg
ICAgLy8gVGhlIG1vdXNlIG1vdmVkIHVwL2xlZnQuCisgICAgICAgICAgICBkZWx0YSA9IG1heCgt
dGh1bWJQb3MsIGRlbHRhKTsKKworICAgICAgICBpZiAoZGVsdGEpIHsKKyAgICAgICAgICAgIHNl
dFZhbHVlKHN0YWJsZVJvdW5kKChmbG9hdCkodGh1bWJQb3MgKyBkZWx0YSkgKiAobV90b3RhbFNp
emUgLSBtX3Zpc2libGVTaXplKSAvICh0cmFja0xlbiAtIHRodW1iTGVuKSkpOworICAgICAgICAg
ICAgbV9wcmVzc2VkUG9zICs9IHRodW1iUG9zaXRpb24oKSAtIHRodW1iUG9zOworICAgICAgICB9
CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKG1fcHJlc3NlZFBhcnQg
IT0gTm9QYXJ0KQorICAgICAgICBtX3ByZXNzZWRQb3MgPSAobV9vcmllbnRhdGlvbiA9PSBIb3Jp
em9udGFsU2Nyb2xsYmFyID8gY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSku
eCgpIDogY29udmVydEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgpKTsKKworICAg
IFNjcm9sbGJhclBhcnQgcGFydCA9IGhpdFRlc3QoZXZ0KTsKKyAgICBpZiAocGFydCAhPSBtX2hv
dmVyZWRQYXJ0KSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkgeworICAg
ICAgICAgICAgaWYgKHBhcnQgPT0gbV9wcmVzc2VkUGFydCkgeworICAgICAgICAgICAgICAgIC8v
IFRoZSBtb3VzZSBpcyBtb3ZpbmcgYmFjayBvdmVyIHRoZSBwcmVzc2VkIHBhcnQuICBXZQorICAg
ICAgICAgICAgICAgIC8vIG5lZWQgdG8gc3RhcnQgdXAgdGhlIHRpbWVyIGFjdGlvbiBhZ2Fpbi4K
KyAgICAgICAgICAgICAgICBzdGFydFRpbWVySWZOZWVkZWQoY05vcm1hbFRpbWVyRGVsYXkpOwor
ICAgICAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgICAgICAg
ICAgfSBlbHNlIGlmIChtX2hvdmVyZWRQYXJ0ID09IG1fcHJlc3NlZFBhcnQpIHsKKyAgICAgICAg
ICAgICAgICAvLyBUaGUgbW91c2UgaXMgbGVhdmluZyB0aGUgcHJlc3NlZCBwYXJ0LiAgS2lsbCBv
dXIgdGltZXIKKyAgICAgICAgICAgICAgICAvLyBpZiBuZWVkZWQuCisgICAgICAgICAgICAgICAg
c3RvcFRpbWVySWZOZWVkZWQoKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlUGFydChtX3By
ZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
IGludmFsaWRhdGVQYXJ0KHBhcnQpOworICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9ob3Zl
cmVkUGFydCk7CisgICAgICAgIH0KKyAgICAgICAgbV9ob3ZlcmVkUGFydCA9IHBhcnQ7CisgICAg
fQorCisgICAgcmV0dXJuIG1fcHJlc3NlZFBhcnQgIT0gTm9QYXJ0OworfQorCitib29sIFBsYXRm
b3JtU2Nyb2xsYmFyOjpoYW5kbGVNb3VzZU91dEV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYgZXZ0KQoreworICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAgIG1faG92
ZXJlZFBhcnQgPSBOb1BhcnQ7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQbGF0Zm9y
bVNjcm9sbGJhcjo6aGFuZGxlTW91c2VQcmVzc0V2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVu
dCYgZXZ0KQoreworICAgIG1fcHJlc3NlZFBhcnQgPSBoaXRUZXN0KGV2dCk7CisgICAgbV9wcmVz
c2VkUG9zID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhciA/IGNvbnZlcnRG
cm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRGcm9tQ29udGFpbmlu
Z1dpbmRvdyhldnQucG9zKCkpLnkoKSk7CisgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFy
dCk7CisgICAgYXV0b3Njcm9sbFByZXNzZWRQYXJ0KGNJbml0aWFsVGltZXJEZWxheSk7CisgICAg
cmV0dXJuIG1fcHJlc3NlZFBhcnQgIT0gTm9QYXJ0OworfQorCitib29sIFBsYXRmb3JtU2Nyb2xs
YmFyOjpoYW5kbGVNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2
dCkKK3sKKyAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICBtX3ByZXNzZWRQ
YXJ0ID0gTm9QYXJ0OworICAgIG1fcHJlc3NlZFBvcyA9IDA7CisgICAgc3RvcFRpbWVySWZOZWVk
ZWQoKTsKKworICAgIGlmIChwYXJlbnQoKSAmJiBwYXJlbnQoKS0+aXNGcmFtZVZpZXcoKSkKKyAg
ICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4ocGFyZW50KCkpLT5mcmFtZSgpLT5ldmVudEhh
bmRsZXIoKS0+c2V0TW91c2VQcmVzc2VkKGZhbHNlKTsKKworICAgIHJldHVybiBtX3ByZXNzZWRQ
YXJ0ICE9IE5vUGFydDsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c3RhcnRUaW1lcklm
TmVlZGVkKGRvdWJsZSBkZWxheSkKK3sKKyAgICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhl
IHRodW1iLgorICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCkKKyAgICAgICAgcmV0
dXJuOworCisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4gIFdlIGhhbHQgdHJhY2sgc2Nyb2xsaW5n
IG9uY2UgdGhlIHRodW1iIGlzIGxldmVsCisgICAgLy8gd2l0aCB1cy4KKyAgICBpZiAoKG1fcHJl
c3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRUcmFj
a1BhcnQpICYmIHRodW1iVW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0KG1f
cHJlc3NlZFBhcnQpOworICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAgICAg
ICByZXR1cm47CisgICAgfQorCisgICAgLy8gV2UgY2FuJ3Qgc2Nyb2xsIGlmIHdlJ3ZlIGhpdCB0
aGUgYmVnaW5uaW5nIG9yIGVuZC4KKyAgICBTY3JvbGxEaXJlY3Rpb24gZGlyID0gcHJlc3NlZFBh
cnRTY3JvbGxEaXJlY3Rpb24oKTsKKyAgICBpZiAoZGlyID09IFNjcm9sbFVwIHx8IGRpciA9PSBT
Y3JvbGxMZWZ0KSB7CisgICAgICAgIGlmIChtX2N1cnJlbnRQb3MgPT0gMCkKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9jdXJyZW50UG9zID09IG1fdG90
YWxTaXplIC0gbV92aXNpYmxlU2l6ZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAg
ICBtX3Njcm9sbFRpbWVyLnN0YXJ0T25lU2hvdChkZWxheSk7Cit9CisKK3ZvaWQgUGxhdGZvcm1T
Y3JvbGxiYXI6OnN0b3BUaW1lcklmTmVlZGVkKCkKK3sKKyAgICBpZiAobV9zY3JvbGxUaW1lci5p
c0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9sbFRpbWVyLnN0b3AoKTsKK30KKwordm9pZCBQbGF0
Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFByZXNzZWRQYXJ0KGRvdWJsZSBkZWxheSkKK3sKKyAg
ICAvLyBEb24ndCBkbyBhbnl0aGluZyBmb3IgdGhlIHRodW1iIG9yIGlmIG5vdGhpbmcgd2FzIHBy
ZXNzZWQuCisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0IHx8IG1fcHJlc3NlZFBh
cnQgPT0gTm9QYXJ0KQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBIYW5kbGUgdGhlIHRyYWNr
LgorICAgIGlmICgobV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0IHx8IG1fcHJlc3NlZFBh
cnQgPT0gRm9yd2FyZFRyYWNrUGFydCkgJiYgdGh1bWJVbmRlck1vdXNlKCkpIHsKKyAgICAgICAg
aW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgICAgIG1faG92ZXJlZFBhcnQgPSBU
aHVtYlBhcnQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBIYW5kbGUgdGhlIGFy
cm93cyBhbmQgdHJhY2suCisgICAgaWYgKHNjcm9sbChwcmVzc2VkUGFydFNjcm9sbERpcmVjdGlv
bigpLCBwcmVzc2VkUGFydFNjcm9sbEdyYW51bGFyaXR5KCkpKQorICAgICAgICBzdGFydFRpbWVy
SWZOZWVkZWQoZGVsYXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjphdXRvc2Nyb2xs
VGltZXJGaXJlZChUaW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4qKQoreworICAgIGF1dG9zY3JvbGxQ
cmVzc2VkUGFydChjTm9ybWFsVGltZXJEZWxheSk7Cit9CisKK1Njcm9sbERpcmVjdGlvbiBQbGF0
Zm9ybVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKQoreworICAgIGlmICht
X29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpIHsKKyAgICAgICAgaWYgKG1fcHJl
c3NlZFBhcnQgPT0gQmFja0J1dHRvblN0YXJ0UGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEJhY2tU
cmFja1BhcnQpCisgICAgICAgICAgICByZXR1cm4gU2Nyb2xsTGVmdDsKKyAgICAgICAgcmV0dXJu
IFNjcm9sbFJpZ2h0OworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09
IEJhY2tCdXR0b25TdGFydFBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0KQor
ICAgICAgICAgICAgcmV0dXJuIFNjcm9sbFVwOworICAgICAgICByZXR1cm4gU2Nyb2xsRG93bjsK
KyAgICB9Cit9CisKK1Njcm9sbEdyYW51bGFyaXR5IFBsYXRmb3JtU2Nyb2xsYmFyOjpwcmVzc2Vk
UGFydFNjcm9sbEdyYW51bGFyaXR5KCkKK3sKKyAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNr
QnV0dG9uU3RhcnRQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gRm9yd2FyZEJ1dHRvblN0YXJ0UGFy
dCkKKyAgICAgICAgcmV0dXJuIFNjcm9sbEJ5TGluZTsKKyAgICByZXR1cm4gU2Nyb2xsQnlQYWdl
OworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aHVtYlVuZGVyTW91c2UoKQoreworICAg
IC8vIENvbnN0cnVjdCBhIHJlY3QuCisgICAgSW50UmVjdCB0aHVtYiA9IHRodW1iUmVjdCgpOwor
ICAgIHRodW1iLm1vdmUoLXgoKSwgLXkoKSk7CisgICAgaW50IGJlZ2luID0gKG1fb3JpZW50YXRp
b24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0aHVtYi54KCkgOiB0aHVtYi55KCk7CisgICAg
aW50IGVuZCA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIpID8gdGh1bWIu
cmlnaHQoKSA6IHRodW1iLmJvdHRvbSgpOworICAgIHJldHVybiAoYmVnaW4gPD0gbV9wcmVzc2Vk
UG9zICYmIG1fcHJlc3NlZFBvcyA8IGVuZCk7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6
aG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodChTY3JvbGxiYXJDb250cm9sU2l6ZSBjb250cm9sU2l6
ZSkKK3sKKyAgICByZXR1cm4gY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemVdOworfQorCitp
bnQgUGxhdGZvcm1TY3JvbGxiYXI6OnZlcnRpY2FsU2Nyb2xsYmFyV2lkdGgoU2Nyb2xsYmFyQ29u
dHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0dXJuIGNWZXJ0aWNhbFdpZHRoW2NvbnRy
b2xTaXplXTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnRHcmlwcGVyKEhEQyBo
ZGMsIGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1T
Y3JvbGxiYXI6OmdyaXBwZXJSZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3QKK3sK
KyAgICByZXR1cm4gSW50UmVjdCgpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjp0aGVt
ZUNoYW5nZWQoKQoreworfQorCitib29sIFBsYXRmb3JtU2Nyb2xsYmFyOjpzaG91bGRVcGRhdGVC
YWNraW5nU3RvcmUoKSBjb25zdAoreworICAgIHJldHVybiBwYXJlbnQoKSAmJiAocGFyZW50KCkt
PnBhcmVudCgpIHx8ICFpc1ZpZXdTY3JvbGxiYXIoKSk7Cit9CisKK1Bhc3NSZWZQdHI8U2Nyb2xs
YmFyPiBTY3JvbGxiYXI6OmNyZWF0ZU5hdGl2ZVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqIGNs
aWVudCwgU2Nyb2xsYmFyT3JpZW50YXRpb24gb3JpZW50YXRpb24sIFNjcm9sbGJhckNvbnRyb2xT
aXplIHNpemUpCit7CisgICAgcmV0dXJuIGFkb3B0UmVmKG5ldyBQbGF0Zm9ybVNjcm9sbGJhcihj
bGllbnQsIG9yaWVudGF0aW9uLCBzaXplKSk7Cit9CisKK30KKwpkaWZmIC0tZ2l0IGEvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9QbGF0Zm9ybVNjcm9sbGJhci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9QbGF0Zm9ybVNjcm9sbGJhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLjUwOGE2MmYKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Bs
YXRmb3JtU2Nyb2xsYmFyLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqIENvcHlyaWdodCAoQykgMjAwOCBUb2NoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVm
IFBsYXRmb3JtU2Nyb2xsYmFyX2gKKyNkZWZpbmUgUGxhdGZvcm1TY3JvbGxiYXJfaAorCisjaW5j
bHVkZSAiU2Nyb2xsQmFyLmgiCisjaW5jbHVkZSAiVGltZXIuaCIKKyNpbmNsdWRlICJXaWRnZXQu
aCIKKwordHlwZWRlZiBzdHJ1Y3QgSERDX18qIEhEQzsKKworbmFtZXNwYWNlIFdlYkNvcmUgewor
CisgICAgY2xhc3MgUGxhdGZvcm1TY3JvbGxiYXIgOiBwdWJsaWMgU2Nyb2xsYmFyIHsKKyAgICBw
dWJsaWM6CisgICAgICAgIFBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9sbGJhckNsaWVudCosIFNjcm9s
bGJhck9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSk7CisKKyAgICAgICAgdmlydHVh
bCB+UGxhdGZvcm1TY3JvbGxiYXIoKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNXaWRnZXQo
KSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldFBhcmVu
dChTY3JvbGxWaWV3Kik7CisKKyAgICAgICAgdmlydHVhbCBpbnQgd2lkdGgoKSBjb25zdDsKKyAg
ICAgICAgdmlydHVhbCBpbnQgaGVpZ2h0KCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgdm9pZCBz
ZXRSZWN0KGNvbnN0IEludFJlY3QmKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHNldEVuYWJsZWQo
Ym9vbCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwYWludChHcmFwaGljc0NvbnRleHQqLCBjb25z
dCBJbnRSZWN0JiBkYW1hZ2VSZWN0KTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91
c2VNb3ZlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisgICAgICAgIHZpcnR1YWwg
Ym9vbCBoYW5kbGVNb3VzZU91dEV2ZW50KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworICAg
ICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VQcmVzc0V2ZW50KGNvbnN0IFBsYXRmb3JtTW91
c2VFdmVudCYpOworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91c2VSZWxlYXNlRXZlbnQo
Y29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50Jik7CisKKyAgICAgICAgc3RhdGljIHZvaWQgdGhlbWVD
aGFuZ2VkKCk7CisgICAgICAgIHN0YXRpYyBpbnQgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodChT
Y3JvbGxiYXJDb250cm9sU2l6ZSBzaXplID0gUmVndWxhclNjcm9sbGJhcik7CisgICAgICAgIHN0
YXRpYyBpbnQgdmVydGljYWxTY3JvbGxiYXJXaWR0aChTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXpl
ID0gUmVndWxhclNjcm9sbGJhcik7CisKKyAgICAgICAgdm9pZCBhdXRvc2Nyb2xsVGltZXJGaXJl
ZChUaW1lcjxQbGF0Zm9ybVNjcm9sbGJhcj4qKTsKKworICAgICAgICBib29sIGlzRW5hYmxlZCgp
IGNvbnN0IHsgcmV0dXJuIGVuYWJsZWQoKTsgfQorICAgICAgICBib29sIGlzVmlzaWJsZSgpIGNv
bnN0IHsgcmV0dXJuIG1fdmlzaWJsZTsgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgc2hvdygpIHsg
bV92aXNpYmxlID0gdHJ1ZTsgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgaGlkZSgpIHsgbV92aXNp
YmxlID0gZmFsc2U7IH0KKyAgICAgICAgdmlydHVhbCBib29sIHNob3VsZFVwZGF0ZUJhY2tpbmdT
dG9yZSgpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIGJvb2wgaXNTY3JvbGxiYXIoKSBjb25zdCB7
IHJldHVybiB0cnVlOyB9CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1ZpZXdTY3JvbGxiYXIoKSBj
b25zdCB7IHJldHVybiBtX2lzVmlld1Njcm9sbGJhcjsgfQorICAgICAgICB2b2lkIHNldElzVmll
d1Njcm9sbGJhcihib29sIGlzKSB7IG1faXNWaWV3U2Nyb2xsYmFyID0gaXM7IH0KKworICAgIHBy
b3RlY3RlZDoKKyAgICAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVRodW1iUG9zaXRpb24oKTsKKyAg
ICAgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVRodW1iUHJvcG9ydGlvbigpOworCisgICAgcHJpdmF0
ZToKKyAgICAgICAgSW50UmVjdCBiYWNrQnV0dG9uUmVjdCgpIGNvbnN0OworICAgICAgICBJbnRS
ZWN0IGZvcndhcmRCdXR0b25SZWN0KCkgY29uc3Q7CisgICAgICAgIEludFJlY3QgdHJhY2tSZWN0
KCkgY29uc3Q7CisgICAgICAgIEludFJlY3QgdGh1bWJSZWN0KCkgY29uc3Q7CisgICAgICAgIElu
dFJlY3QgZ3JpcHBlclJlY3QoY29uc3QgSW50UmVjdCYgdGh1bWJSZWN0KSBjb25zdDsKKyAgICAg
ICAgdm9pZCBzcGxpdFRyYWNrKGNvbnN0IEludFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVm
b3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVtYlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0
KSBjb25zdDsKKworICAgICAgICBpbnQgdGh1bWJQb3NpdGlvbigpIGNvbnN0OworICAgICAgICBp
bnQgdGh1bWJMZW5ndGgoKSBjb25zdDsKKyAgICAgICAgaW50IHRyYWNrTGVuZ3RoKCkgY29uc3Q7
CisKKyAgICAgICAgdm9pZCBwYWludEJ1dHRvbihHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRS
ZWN0JiBidXR0b25SZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBj
b25zdDsKKyAgICAgICAgdm9pZCBwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCosIGNvbnN0IElu
dFJlY3QmIHRyYWNrUmVjdCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkg
Y29uc3Q7CisgICAgICAgIHZvaWQgcGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJ
bnRSZWN0JiB0aHVtYlJlY3QsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0OworICAg
ICAgICB2b2lkIHBhaW50R3JpcHBlcihIREMsIGNvbnN0IEludFJlY3QmIGdyaXBwZXJSZWN0KSBj
b25zdDsKKworICAgICAgICBTY3JvbGxiYXJQYXJ0IGhpdFRlc3QoY29uc3QgUGxhdGZvcm1Nb3Vz
ZUV2ZW50Jik7CisKKyAgICAgICAgdm9pZCBzdGFydFRpbWVySWZOZWVkZWQoZG91YmxlIGRlbGF5
KTsKKyAgICAgICAgdm9pZCBzdG9wVGltZXJJZk5lZWRlZCgpOworICAgICAgICB2b2lkIGF1dG9z
Y3JvbGxQcmVzc2VkUGFydChkb3VibGUgZGVsYXkpOworICAgICAgICBTY3JvbGxEaXJlY3Rpb24g
cHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKTsKKyAgICAgICAgU2Nyb2xsR3JhbnVsYXJpdHkg
cHJlc3NlZFBhcnRTY3JvbGxHcmFudWxhcml0eSgpOworCisgICAgICAgIGJvb2wgdGh1bWJVbmRl
ck1vdXNlKCk7CisKKyAgICAgICAgdm9pZCBpbnZhbGlkYXRlUGFydChTY3JvbGxiYXJQYXJ0KTsK
KyAgICAgICAgdm9pZCBpbnZhbGlkYXRlVHJhY2soKTsKKworICAgICAgICBTY3JvbGxiYXJQYXJ0
IG1faG92ZXJlZFBhcnQ7CisgICAgICAgIFNjcm9sbGJhclBhcnQgbV9wcmVzc2VkUGFydDsKKyAg
ICAgICAgaW50IG1fcHJlc3NlZFBvczsKKyAgICAgICAgVGltZXI8UGxhdGZvcm1TY3JvbGxiYXI+
IG1fc2Nyb2xsVGltZXI7CisgICAgICAgIGJvb2wgbV9vdmVybGFwc1Jlc2l6ZXI7CisgICAgICAg
IGJvb2wgbV92aXNpYmxlOworICAgICAgICBib29sIG1faXNWaWV3U2Nyb2xsYmFyOworICAgIH07
CisKK30KKworI2VuZGlmIC8vIFBsYXRmb3JtU2Nyb2xsYmFyX2gKKwpkaWZmIC0tZ2l0IGEvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9TY3JvbGxiYXJUaGVtZVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxh
dGZvcm0vd2luY2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uNjUzYWRlMQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5jcHAKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDggQXBwbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lV2luY2UuaCIKKworI2luY2x1ZGUgIkdyYXBo
aWNzQ29udGV4dC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUg
IlNjcm9sbGJhci5oIgorI2luY2x1ZGUgIlNvZnRMaW5raW5nLmgiCisKKy8vIEdlbmVyaWMgc3Rh
dGUgY29uc3RhbnRzCisjZGVmaW5lIFRTX05PUk1BTCAgICAxCisjZGVmaW5lIFRTX0hPVkVSICAg
ICAyCisjZGVmaW5lIFRTX0FDVElWRSAgICAzCisjZGVmaW5lIFRTX0RJU0FCTEVEICA0CisKKyNk
ZWZpbmUgU1BfQlVUVE9OICAgICAgICAgIDEKKyNkZWZpbmUgU1BfVEhVTUJIT1IgICAgICAgIDIK
KyNkZWZpbmUgU1BfVEhVTUJWRVJUICAgICAgIDMKKyNkZWZpbmUgU1BfVFJBQ0tTVEFSVEhPUiAg
IDQKKyNkZWZpbmUgU1BfVFJBQ0tFTkRIT1IgICAgIDUKKyNkZWZpbmUgU1BfVFJBQ0tTVEFSVFZF
UlQgIDYKKyNkZWZpbmUgU1BfVFJBQ0tFTkRWRVJUICAgIDcKKyNkZWZpbmUgU1BfR1JJUFBFUkhP
UiAgICAgIDgKKyNkZWZpbmUgU1BfR1JJUFBFUlZFUlQgICAgIDkKKworI2RlZmluZSBUU19VUF9C
VVRUT04gICAgICAgMAorI2RlZmluZSBUU19ET1dOX0JVVFRPTiAgICAgNAorI2RlZmluZSBUU19M
RUZUX0JVVFRPTiAgICAgOAorI2RlZmluZSBUU19SSUdIVF9CVVRUT04gICAgMTIKKyNkZWZpbmUg
VFNfVVBfQlVUVE9OX0hPVkVSICAgMTcKKyNkZWZpbmUgVFNfRE9XTl9CVVRUT05fSE9WRVIgIDE4
CisjZGVmaW5lIFRTX0xFRlRfQlVUVE9OX0hPVkVSICAxOQorI2RlZmluZSBUU19SSUdIVF9CVVRU
T05fSE9WRVIgICAyMAorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29y
ZSB7CisKK1Njcm9sbGJhclRoZW1lV2luY2U6OlNjcm9sbGJhclRoZW1lV2luY2UoKQoreworfQor
CitTY3JvbGxiYXJUaGVtZVdpbmNlOjp+U2Nyb2xsYmFyVGhlbWVXaW5jZSgpCit7Cit9CisKK2lu
dCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpzY3JvbGxiYXJUaGlja25lc3MoU2Nyb2xsYmFyQ29udHJv
bFNpemUpCit7CisgICAgc3RhdGljIGludCB0aGlja25lc3M7CisgICAgaWYgKCF0aGlja25lc3Mp
CisgICAgICAgIHRoaWNrbmVzcyA9IDo6R2V0U3lzdGVtTWV0cmljcyhTTV9DWFZTQ1JPTEwpOwor
ICAgIHJldHVybiB0aGlja25lc3M7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVXaW5jZTo6dGhl
bWVDaGFuZ2VkKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitib29sIFNjcm9sbGJh
clRoZW1lV2luY2U6OmludmFsaWRhdGVPbk1vdXNlRW50ZXJFeGl0KCkKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTY3JvbGxiYXJUaGVtZVdp
bmNlOjpoYXNUaHVtYihTY3JvbGxiYXIqIHNjcm9sbGJhcikKK3sKKyAgICByZXR1cm4gdGh1bWJM
ZW5ndGgoc2Nyb2xsYmFyKSA+IDA7Cit9CisKK0ludFJlY3QgU2Nyb2xsYmFyVGhlbWVXaW5jZTo6
YmFja0J1dHRvblJlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIFNjcm9sbGJhclBhcnQgcGFydCwg
Ym9vbCkKK3sKKyAgICAvLyBXaW5kb3dzIGp1c3QgaGFzIHNpbmdsZSBhcnJvd3MuCisgICAgaWYg
KHBhcnQgPT0gQmFja0J1dHRvbkVuZFBhcnQpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisK
KyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2VudGlhbGx5IDE3eDE3LgorCisgICAgLy8g
T3VyIGFjdHVhbCByZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhlIGF2YWlsYWJsZSBzcGFjZSB3
aGVuCisgICAgLy8gd2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAgVGhpcyBhbGxvd3MgdGhlIHNj
cm9sbGJhcgorICAgIC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0aW9uIGV2ZW4gYXQgdGlueSBz
aXplcy4KKyAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisgICAgaWYg
KHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAg
ICByZXR1cm4gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc2Nyb2xsYmFyLT55KCksCisgICAgICAg
ICAgICAgICAgICAgICAgIHNjcm9sbGJhci0+d2lkdGgoKSA8IDIgKiB0aGlja25lc3MgPyBzY3Jv
bGxiYXItPndpZHRoKCkgLyAyIDogdGhpY2tuZXNzLCB0aGlja25lc3MpOworICAgIHJldHVybiBJ
bnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSwKKyAgICAgICAgICAgICAgICAg
ICB0aGlja25lc3MsIHNjcm9sbGJhci0+aGVpZ2h0KCkgPCAyICogdGhpY2tuZXNzID8gc2Nyb2xs
YmFyLT5oZWlnaHQoKSAvIDIgOiB0aGlja25lc3MpOworfQorCitJbnRSZWN0IFNjcm9sbGJhclRo
ZW1lV2luY2U6OmZvcndhcmRCdXR0b25SZWN0KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBTY3JvbGxi
YXJQYXJ0IHBhcnQsIGJvb2wpCit7CisgICAgLy8gV2luZG93cyBqdXN0IGhhcyBzaW5nbGUgYXJy
b3dzLgorICAgIGlmIChwYXJ0ID09IEZvcndhcmRCdXR0b25TdGFydFBhcnQpCisgICAgICAgIHJl
dHVybiBJbnRSZWN0KCk7CisKKyAgICAvLyBPdXIgZGVzaXJlZCByZWN0IGlzIGVzc2VudGlhbGx5
IDE3eDE3LgorCisgICAgLy8gT3VyIGFjdHVhbCByZWN0IHdpbGwgc2hyaW5rIHRvIGhhbGYgdGhl
IGF2YWlsYWJsZSBzcGFjZSB3aGVuCisgICAgLy8gd2UgaGF2ZSA8IDM0IHBpeGVscyBsZWZ0LiAg
VGhpcyBhbGxvd3MgdGhlIHNjcm9sbGJhcgorICAgIC8vIHRvIHNjYWxlIGRvd24gYW5kIGZ1bmN0
aW9uIGV2ZW4gYXQgdGlueSBzaXplcy4KKyAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhp
Y2tuZXNzKCk7CisgICAgaWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFs
U2Nyb2xsYmFyKSB7CisgICAgICAgIGludCB3ID0gc2Nyb2xsYmFyLT53aWR0aCgpIDwgMiAqIHRo
aWNrbmVzcyA/IHNjcm9sbGJhci0+d2lkdGgoKSAvIDIgOiB0aGlja25lc3M7CisgICAgICAgIHJl
dHVybiBJbnRSZWN0KHNjcm9sbGJhci0+eCgpICsgc2Nyb2xsYmFyLT53aWR0aCgpIC0gdywgc2Ny
b2xsYmFyLT55KCksIHcsIHRoaWNrbmVzcyk7CisgICAgfQorCisgICAgaW50IGggPSBzY3JvbGxi
YXItPmhlaWdodCgpIDwgMiAqIHRoaWNrbmVzcyA/IHNjcm9sbGJhci0+aGVpZ2h0KCkgLyAyIDog
dGhpY2tuZXNzOworICAgIHJldHVybiBJbnRSZWN0KHNjcm9sbGJhci0+eCgpLCBzY3JvbGxiYXIt
PnkoKSArIHNjcm9sbGJhci0+aGVpZ2h0KCkgLSBoLCB0aGlja25lc3MsIGgpOworfQorCitJbnRS
ZWN0IFNjcm9sbGJhclRoZW1lV2luY2U6OnRyYWNrUmVjdChTY3JvbGxiYXIqIHNjcm9sbGJhciwg
Ym9vbCkKK3sKKyAgICBpbnQgdGhpY2tuZXNzID0gc2Nyb2xsYmFyVGhpY2tuZXNzKCk7CisgICAg
aWYgKHNjcm9sbGJhci0+b3JpZW50YXRpb24oKSA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7Cisg
ICAgICAgIGlmIChzY3JvbGxiYXItPndpZHRoKCkgPCAyICogdGhpY2tuZXNzKQorICAgICAgICAg
ICAgcmV0dXJuIEludFJlY3QoKTsKKyAgICAgICAgcmV0dXJuIEludFJlY3Qoc2Nyb2xsYmFyLT54
KCkgKyB0aGlja25lc3MsIHNjcm9sbGJhci0+eSgpLCBzY3JvbGxiYXItPndpZHRoKCkgLSAyICog
dGhpY2tuZXNzLCB0aGlja25lc3MpOworICAgIH0KKyAgICBpZiAoc2Nyb2xsYmFyLT5oZWlnaHQo
KSA8IDIgKiB0aGlja25lc3MpCisgICAgICAgIHJldHVybiBJbnRSZWN0KCk7CisgICAgcmV0dXJu
IEludFJlY3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpICsgdGhpY2tuZXNzLCB0aGlj
a25lc3MsIHNjcm9sbGJhci0+aGVpZ2h0KCkgLSAyICogdGhpY2tuZXNzKTsKK30KKwordm9pZCBT
Y3JvbGxiYXJUaGVtZVdpbmNlOjpwYWludFRyYWNrQmFja2dyb3VuZChHcmFwaGljc0NvbnRleHQq
IGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0KQorewor
fQorCit2b2lkIFNjcm9sbGJhclRoZW1lV2luY2U6OnBhaW50VHJhY2tQaWVjZShHcmFwaGljc0Nv
bnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJbnRSZWN0JiByZWN0
LCBTY3JvbGxiYXJQYXJ0IHBhcnRUeXBlKQoreworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lV2lu
Y2U6OnBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3Jv
bGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QsIFNjcm9sbGJhclBhcnQgcGFydCkKK3sKK30KKwor
c3RhdGljIEludFJlY3QgZ3JpcHBlclJlY3QoaW50IHRoaWNrbmVzcywgY29uc3QgSW50UmVjdCYg
dGh1bWJSZWN0KQoreworICAgIC8vIENlbnRlciBpbiB0aGUgdGh1bWIuCisgICAgaW50IGdyaXBw
ZXJUaGlja25lc3MgPSB0aGlja25lc3MgLyAyOworICAgIHJldHVybiBJbnRSZWN0KHRodW1iUmVj
dC54KCkgKyAodGh1bWJSZWN0LndpZHRoKCkgLSBncmlwcGVyVGhpY2tuZXNzKSAvIDIsCisgICAg
ICAgICAgICAgICAgICAgdGh1bWJSZWN0LnkoKSArICh0aHVtYlJlY3QuaGVpZ2h0KCkgLSBncmlw
cGVyVGhpY2tuZXNzKSAvIDIsCisgICAgICAgICAgICAgICAgICAgZ3JpcHBlclRoaWNrbmVzcywg
Z3JpcHBlclRoaWNrbmVzcyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhaW50R3JpcHBlcihTY3JvbGxi
YXIqIHNjcm9sbGJhciwgSERDIGhkYywgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBub3RJ
bXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lV2luY2U6OnBhaW50VGh1bWIo
R3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3JvbGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50
UmVjdCYgcmVjdCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitib29sIFNjcm9sbGJh
clRoZW1lV2luY2U6OnNob3VsZENlbnRlck9uVGh1bWIoU2Nyb2xsYmFyKiwgY29uc3QgUGxhdGZv
cm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgcmV0dXJuIGV2dC5zaGlmdEtleSgpICYmIGV2dC5i
dXR0b24oKSA9PSBMZWZ0QnV0dG9uOworfQorCitTY3JvbGxiYXJUaGVtZSogU2Nyb2xsYmFyVGhl
bWU6Om5hdGl2ZVRoZW1lKCkKK3sKKyAgICBzdGF0aWMgU2Nyb2xsYmFyVGhlbWVXaW5jZSB3aW5j
ZVRoZW1lOworICAgIHJldHVybiAmd2luY2VUaGVtZTsKK30KKworfQorCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Njcm9sbGJhclRoZW1lV2luY2UuaCBiL1dlYkNvcmUvcGxh
dGZvcm0vd2luY2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLmI4MzcxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL1Njcm9sbGJhclRoZW1lV2luY2UuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA4IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZm5kZWYgU2Nyb2xsYmFyVGhl
bWVXaW5jZV9oCisjZGVmaW5lIFNjcm9sbGJhclRoZW1lV2luY2VfaAorCisjaW5jbHVkZSAiU2Ny
b2xsYmFyVGhlbWVDb21wb3NpdGUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAgY2xh
c3MgU2Nyb2xsYmFyVGhlbWVXaW5jZSA6IHB1YmxpYyBTY3JvbGxiYXJUaGVtZUNvbXBvc2l0ZSB7
CisgICAgcHVibGljOgorICAgICAgICBTY3JvbGxiYXJUaGVtZVdpbmNlKCk7CisgICAgICAgIHZp
cnR1YWwgflNjcm9sbGJhclRoZW1lV2luY2UoKTsKKworICAgICAgICB2aXJ0dWFsIGludCBzY3Jv
bGxiYXJUaGlja25lc3MoU2Nyb2xsYmFyQ29udHJvbFNpemUgPSBSZWd1bGFyU2Nyb2xsYmFyKTsK
KworICAgICAgICB2aXJ0dWFsIHZvaWQgdGhlbWVDaGFuZ2VkKCk7CisKKyAgICAgICAgdmlydHVh
bCBib29sIGludmFsaWRhdGVPbk1vdXNlRW50ZXJFeGl0KCk7CisKKyAgICBwcm90ZWN0ZWQ6Cisg
ICAgICAgIHZpcnR1YWwgYm9vbCBoYXNCdXR0b25zKFNjcm9sbGJhciopIHsgcmV0dXJuIHRydWU7
IH0KKyAgICAgICAgdmlydHVhbCBib29sIGhhc1RodW1iKFNjcm9sbGJhciopOworCisgICAgICAg
IHZpcnR1YWwgSW50UmVjdCBiYWNrQnV0dG9uUmVjdChTY3JvbGxiYXIqLCBTY3JvbGxiYXJQYXJ0
LCBib29sIHBhaW50aW5nID0gZmFsc2UpOworICAgICAgICB2aXJ0dWFsIEludFJlY3QgZm9yd2Fy
ZEJ1dHRvblJlY3QoU2Nyb2xsYmFyKiwgU2Nyb2xsYmFyUGFydCwgYm9vbCBwYWludGluZyA9IGZh
bHNlKTsKKyAgICAgICAgdmlydHVhbCBJbnRSZWN0IHRyYWNrUmVjdChTY3JvbGxiYXIqLCBib29s
IHBhaW50aW5nID0gZmFsc2UpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGRDZW50ZXJP
blRodW1iKFNjcm9sbGJhciosIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworCisgICAgICAg
IHZpcnR1YWwgdm9pZCBwYWludFRyYWNrQmFja2dyb3VuZChHcmFwaGljc0NvbnRleHQqLCBTY3Jv
bGxiYXIqLCBjb25zdCBJbnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwYWludFRyYWNr
UGllY2UoR3JhcGhpY3NDb250ZXh0KiwgU2Nyb2xsYmFyKiwgY29uc3QgSW50UmVjdCYsIFNjcm9s
bGJhclBhcnQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcGFpbnRCdXR0b24oR3JhcGhpY3NDb250
ZXh0KiwgU2Nyb2xsYmFyKiwgY29uc3QgSW50UmVjdCYsIFNjcm9sbGJhclBhcnQpOworICAgICAg
ICB2aXJ0dWFsIHZvaWQgcGFpbnRUaHVtYihHcmFwaGljc0NvbnRleHQqLCBTY3JvbGxiYXIqLCBj
b25zdCBJbnRSZWN0Jik7CisgICAgfTsKKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL1dpZGdldFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2Uv
V2lkZ2V0V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDY5
NTcKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1dpZGdldFdpbmNl
LmNwcApAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBB
cHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRv
cmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
V2lkZ2V0LmgiCisKKyNpbmNsdWRlICJDdXJzb3IuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgor
I2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIKKyNpbmNsdWRlICJH
cmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJIb3N0V2luZG93LmgiCisjaW5jbHVkZSAiSW50
UmVjdC5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVz
cGFjZSBXZWJDb3JlIHsKKwordm9pZCBXaWRnZXQ6OmluaXQoUGxhdGZvcm1XaWRnZXQgd2lkZ2V0
KQoreworICAgIG1fcGFyZW50ID0gMDsKKyAgICBtX3NlbGZWaXNpYmxlID0gZmFsc2U7CisgICAg
bV9wYXJlbnRWaXNpYmxlID0gZmFsc2U7CisgICAgbV93aWRnZXQgPSB3aWRnZXQ7CisgICAgaWYg
KG1fd2lkZ2V0KQorICAgICAgICByZXRhaW5QbGF0Zm9ybVdpZGdldCgpOworfQorCit2b2lkIFdp
ZGdldDo6c2V0UGFyZW50KFNjcm9sbFZpZXcqIHZpZXcpCit7CisgICAgQVNTRVJUKCF2aWV3IHx8
ICFtX3BhcmVudCk7CisgICAgaWYgKCF2aWV3IHx8ICF2aWV3LT5pc1Zpc2libGUoKSkKKyAgICAg
ICAgc2V0UGFyZW50VmlzaWJsZShmYWxzZSk7CisgICAgbV9wYXJlbnQgPSB2aWV3OworICAgIGlm
ICh2aWV3ICYmIHZpZXctPmlzVmlzaWJsZSgpKQorICAgICAgICBzZXRQYXJlbnRWaXNpYmxlKHRy
dWUpOworfQorCitTY3JvbGxWaWV3KiBXaWRnZXQ6OnJvb3QoKSBjb25zdAoreworICAgIGNvbnN0
IFdpZGdldCogdG9wID0gdGhpczsKKyAgICB3aGlsZSAodG9wLT5wYXJlbnQoKSkKKyAgICAgICAg
dG9wID0gdG9wLT5wYXJlbnQoKTsKKyAgICBpZiAodG9wLT5pc0ZyYW1lVmlldygpKQorICAgICAg
ICByZXR1cm4gY29uc3RfY2FzdDxTY3JvbGxWaWV3Kj4oc3RhdGljX2Nhc3Q8Y29uc3QgU2Nyb2xs
Vmlldyo+KHRvcCkpOworICAgIHJldHVybiAwOworfQorCit2b2lkIFdpZGdldDo6cmVtb3ZlRnJv
bVBhcmVudCgpCit7CisgICAgaWYgKHBhcmVudCgpKQorICAgICAgICBwYXJlbnQoKS0+cmVtb3Zl
Q2hpbGQodGhpcyk7Cit9CisKKwordm9pZCBXaWRnZXQ6OnBhaW50KEdyYXBoaWNzQ29udGV4dCos
IGNvbnN0IEludFJlY3QmKQoreworfQorCit2b2lkIFdpZGdldDo6c2V0Rm9jdXMoKQoreworfQor
Cit2b2lkIFdpZGdldDo6c2V0SXNTZWxlY3RlZChib29sKQoreworfQorCitJbnRSZWN0IFdpZGdl
dDo6ZnJhbWVSZWN0KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9mcmFtZTsKK30KKwordm9pZCBX
aWRnZXQ6OnNldEZyYW1lUmVjdChjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIG1fZnJhbWUg
PSByZWN0OworfQorCitXaWRnZXQ6OldpZGdldChQbGF0Zm9ybVdpZGdldCB3aWRnZXQpCit7Cisg
ICAgaW5pdCh3aWRnZXQpOworfQorCit2b2lkIFdpZGdldDo6cmVsZWFzZVBsYXRmb3JtV2lkZ2V0
KCkKK3sKK30KKwordm9pZCBXaWRnZXQ6OnJldGFpblBsYXRmb3JtV2lkZ2V0KCkKK3sKK30KKwor
V2lkZ2V0Ojp+V2lkZ2V0KCkKK3sKKyAgICBBU1NFUlQoIXBhcmVudCgpKTsKK30KKwordm9pZCBX
aWRnZXQ6OnNob3coKQoreworfQorCit2b2lkIFdpZGdldDo6aGlkZSgpCit7Cit9CisKK3ZvaWQg
V2lkZ2V0OjpzZXRDdXJzb3IoY29uc3QgQ3Vyc29yJiBjdXJzb3IpCit7CisgICAgU2Nyb2xsVmll
dyogdmlldyA9IHJvb3QoKTsKKyAgICBpZiAodmlldyAmJiB2aWV3LT5pc0ZyYW1lVmlldygpKSB7
CisgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih2aWV3
KS0+ZnJhbWUoKSkgeworICAgICAgICAgICAgaWYgKFBhZ2UqIHBhZ2UgPSBmcmFtZS0+cGFnZSgp
KQorICAgICAgICAgICAgICAgIHBhZ2UtPmNocm9tZSgpLT5zZXRDdXJzb3IoY3Vyc29yLmltcGwo
KSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0ludFBvaW50IFdpZGdldDo6Y29udmVydFRvQ29u
dGFpbmluZ1dpbmRvdyhjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNvbnN0Cit7CisgICAgLy8gY2Fs
bGVkIGJ5IFNjcm9sbFZpZXcgb3IgUGxhdGZvcm1TY3JvbGxCYXIuCisgICAgaWYgKGlzRnJhbWVW
aWV3KCkpIHsKKyAgICAgICAgY29uc3QgU2Nyb2xsVmlldyogdmlldyA9IHN0YXRpY19jYXN0PGNv
bnN0IEZyYW1lVmlldyo+KHRoaXMpOworICAgICAgICByZXR1cm4gdmlldy0+Y29udGVudHNUb1dp
bmRvdyhwb2ludCArIHZpZXctPnNjcm9sbE9mZnNldCgpKTsKKyAgICB9IGVsc2UgaWYgKHBhcmVu
dCgpKQorICAgICAgICByZXR1cm4gcGFyZW50KCktPmNvbnRlbnRzVG9XaW5kb3cocG9pbnQgKyBJ
bnRTaXplKHgoKSwgeSgpKSArIHBhcmVudCgpLT5zY3JvbGxPZmZzZXQoKSk7CisKKyAgICByZXR1
cm4gcG9pbnQ7Cit9CisKK0ludFJlY3QgV2lkZ2V0Ojpjb252ZXJ0VG9Db250YWluaW5nV2luZG93
KGNvbnN0IEludFJlY3QmIHJlY3QpIGNvbnN0Cit7CisgICAgLy8gY2FsbGVkIGJ5IFNjcm9sbFZp
ZXcgb3IgUGxhdGZvcm1TY3JvbGxCYXIuCisgICAgaWYgKGlzRnJhbWVWaWV3KCkpIHsKKyAgICAg
ICAgY29uc3QgU2Nyb2xsVmlldyogdmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+
KHRoaXMpOworICAgICAgICByZXR1cm4gdmlldy0+Y29udGVudHNUb1dpbmRvdyhJbnRSZWN0KHJl
Y3QubG9jYXRpb24oKSArIHZpZXctPnNjcm9sbE9mZnNldCgpLCByZWN0LnNpemUoKSkpOworICAg
IH0gZWxzZSBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgSW50UG9pbnQgY29udGVudHNQb2ludCA9
IHJlY3QubG9jYXRpb24oKSArIEludFNpemUoeCgpLCB5KCkpOworICAgICAgICByZXR1cm4gcGFy
ZW50KCktPmNvbnRlbnRzVG9XaW5kb3coSW50UmVjdChpc1ZpZXdTY3JvbGxiYXIoKSA/IGNvbnRl
bnRzUG9pbnQgKyBwYXJlbnQoKS0+c2Nyb2xsT2Zmc2V0KCkgOiBjb250ZW50c1BvaW50CisgICAg
ICAgICAgICAsIHJlY3Quc2l6ZSgpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHJlY3Q7Cit9CisK
K0ludFBvaW50IFdpZGdldDo6Y29udmVydEZyb21Db250YWluaW5nV2luZG93KGNvbnN0IEludFBv
aW50JiBwb2ludCkgY29uc3QKK3sKKyAgICAgLy8gY2FsbGVkIGJ5IFNjcm9sbFZpZXcgb3IgUGxh
dGZvcm1TY3JvbGxCYXIuCisgICAgaWYgKGlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgY29uc3Qg
U2Nyb2xsVmlldyogdmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMpOwor
ICAgICAgICByZXR1cm4gdmlldy0+d2luZG93VG9Db250ZW50cyhwb2ludCkgLSB2aWV3LT5zY3Jv
bGxPZmZzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHBhcmVudCgpKSB7CisgICAgICAgIEludFBvaW50
IHJ0biA9IHBhcmVudCgpLT53aW5kb3dUb0NvbnRlbnRzKHBvaW50KSAtIEludFNpemUoeCgpLCB5
KCkpOworICAgICAgICByZXR1cm4gaXNWaWV3U2Nyb2xsYmFyKCkgPyBydG4gLSBwYXJlbnQoKS0+
c2Nyb2xsT2Zmc2V0KCkgOiBydG47CisgICAgfQorCisgICAgcmV0dXJuIHBvaW50OworfQorCitJ
bnRSZWN0IFdpZGdldDo6Y29udmVydEZyb21Db250YWluaW5nV2luZG93KGNvbnN0IEludFJlY3Qm
IHJlY3QpIGNvbnN0Cit7CisgICAgIC8vIGNhbGxlZCBieSBTY3JvbGxWaWV3IG9yIFBsYXRmb3Jt
U2Nyb2xsQmFyLgorICAgIGlmIChpc0ZyYW1lVmlldygpKSB7CisgICAgICAgIGNvbnN0IFNjcm9s
bFZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAg
ICAgSW50UmVjdCBydG4gPSB2aWV3LT53aW5kb3dUb0NvbnRlbnRzKHJlY3QpOworICAgICAgICBy
dG4ubW92ZSgtdmlldy0+c2Nyb2xsT2Zmc2V0KCkpOworICAgICAgICByZXR1cm4gcnRuOworICAg
IH0gZWxzZSBpZiAocGFyZW50KCkpIHsKKyAgICAgICAgSW50UmVjdCBydG4gPSBwYXJlbnQoKS0+
d2luZG93VG9Db250ZW50cyhyZWN0KTsKKyAgICAgICAgcnRuLm1vdmUoSW50U2l6ZSgteCgpLCAt
eSgpKSk7CisgICAgICAgIGlmIChpc1ZpZXdTY3JvbGxiYXIoKSkKKyAgICAgICAgICAgIHJ0bi5t
b3ZlKC1wYXJlbnQoKS0+c2Nyb2xsT2Zmc2V0KCkpOworCisgICAgICAgIHJldHVybiBydG47Cisg
ICAgfQorCisgICAgcmV0dXJuIHJlY3Q7Cit9CisKKworSW50UG9pbnQgV2lkZ2V0Ojpjb252ZXJ0
Q2hpbGRUb1NlbGYoY29uc3QgV2lkZ2V0KiBjaGlsZCwgY29uc3QgSW50UG9pbnQmIHBvaW50KSBj
b25zdAoreworICAgIHJldHVybiBJbnRQb2ludChwb2ludC54KCkgKyBjaGlsZC0+eCgpLCBwb2lu
dC55KCkgKyBjaGlsZC0+eSgpKTsKK30KKworSW50UG9pbnQgV2lkZ2V0Ojpjb252ZXJ0U2VsZlRv
Q2hpbGQoY29uc3QgV2lkZ2V0KiBjaGlsZCwgY29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAor
eworICAgIHJldHVybiBJbnRQb2ludChwb2ludC54KCkgLSBjaGlsZC0+eCgpLCBwb2ludC55KCkg
LSBjaGlsZC0+eSgpKTsKK30KKwordm9pZCBXaWRnZXQ6OmludmFsaWRhdGVSZWN0KGNvbnN0IElu
dFJlY3QmIHIpCit7CisgICAgU2Nyb2xsVmlldyogb3V0ZXJtb3N0VmlldyA9IHBhcmVudCgpOwor
ICAgIGlmIChvdXRlcm1vc3RWaWV3KSB7CisgICAgICAgIHdoaWxlIChvdXRlcm1vc3RWaWV3LT5w
YXJlbnQoKSkKKyAgICAgICAgICAgIG91dGVybW9zdFZpZXcgPSBvdXRlcm1vc3RWaWV3LT5wYXJl
bnQoKTsKKyAgICB9IGVsc2UgaWYgKGlzRnJhbWVWaWV3KCkpCisgICAgICAgIG91dGVybW9zdFZp
ZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKTsKKyAgICBlbHNlCisgICAgICAgIHJl
dHVybjsKKworICAgIGlmICghb3V0ZXJtb3N0Vmlldy0+aXNWaXNpYmxlKCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIEludFJlY3QgcmVjdCA9IGNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3cocik7
CisgICAgb3V0ZXJtb3N0Vmlldy0+aG9zdFdpbmRvdygpLT5yZXBhaW50KHN0YXRpY19jYXN0PEZy
YW1lVmlldyo+KG91dGVybW9zdFZpZXcpLT5mcmFtZSgpLCByZWN0LCBzaG91bGRVcGRhdGVCYWNr
aW5nU3RvcmUoKSwgaXNTY3JvbGxiYXIoKSk7Cit9CisKK0ludFJlY3QgV2lkZ2V0Ojpjb252ZXJ0
VG9Db250YWluaW5nVmlldyhjb25zdCBJbnRSZWN0JiBsb2NhbFJlY3QpIGNvbnN0Cit7CisgICAg
aWYgKGNvbnN0IFNjcm9sbFZpZXcqIHBhcmVudFNjcm9sbFZpZXcgPSBwYXJlbnQoKSkgeworICAg
ICAgICBJbnRSZWN0IHBhcmVudFJlY3QobG9jYWxSZWN0KTsKKyAgICAgICAgcGFyZW50UmVjdC5z
ZXRMb2NhdGlvbihwYXJlbnRTY3JvbGxWaWV3LT5jb252ZXJ0Q2hpbGRUb1NlbGYodGhpcywgbG9j
YWxSZWN0LmxvY2F0aW9uKCkpKTsKKyAgICAgICAgcmV0dXJuIHBhcmVudFJlY3Q7CisgICAgfQor
ICAgIHJldHVybiBsb2NhbFJlY3Q7Cit9CisKK0ludFJlY3QgV2lkZ2V0Ojpjb252ZXJ0RnJvbUNv
bnRhaW5pbmdWaWV3KGNvbnN0IEludFJlY3QmIHBhcmVudFJlY3QpIGNvbnN0Cit7CisgICAgaWYg
KGNvbnN0IFNjcm9sbFZpZXcqIHBhcmVudFNjcm9sbFZpZXcgPSBwYXJlbnQoKSkgeworICAgICAg
ICBJbnRSZWN0IGxvY2FsUmVjdCA9IHBhcmVudFJlY3Q7CisgICAgICAgIGxvY2FsUmVjdC5zZXRM
b2NhdGlvbihwYXJlbnRTY3JvbGxWaWV3LT5jb252ZXJ0U2VsZlRvQ2hpbGQodGhpcywgbG9jYWxS
ZWN0LmxvY2F0aW9uKCkpKTsKKyAgICAgICAgcmV0dXJuIGxvY2FsUmVjdDsKKyAgICB9CisKKyAg
ICByZXR1cm4gcGFyZW50UmVjdDsKK30KKworSW50UG9pbnQgV2lkZ2V0Ojpjb252ZXJ0VG9Db250
YWluaW5nVmlldyhjb25zdCBJbnRQb2ludCYgbG9jYWxQb2ludCkgY29uc3QKK3sKKyAgICBpZiAo
Y29uc3QgU2Nyb2xsVmlldyogcGFyZW50U2Nyb2xsVmlldyA9IHBhcmVudCgpKQorICAgICAgICBy
ZXR1cm4gcGFyZW50U2Nyb2xsVmlldy0+Y29udmVydENoaWxkVG9TZWxmKHRoaXMsIGxvY2FsUG9p
bnQpOworCisgICAgcmV0dXJuIGxvY2FsUG9pbnQ7Cit9CisKK0ludFBvaW50IFdpZGdldDo6Y29u
dmVydEZyb21Db250YWluaW5nVmlldyhjb25zdCBJbnRQb2ludCYgcGFyZW50UG9pbnQpIGNvbnN0
Cit7CisgICAgaWYgKGNvbnN0IFNjcm9sbFZpZXcqIHBhcmVudFNjcm9sbFZpZXcgPSBwYXJlbnQo
KSkKKyAgICAgICAgcmV0dXJuIHBhcmVudFNjcm9sbFZpZXctPmNvbnZlcnRTZWxmVG9DaGlsZCh0
aGlzLCBwYXJlbnRQb2ludCk7CisKKyAgICByZXR1cm4gcGFyZW50UG9pbnQ7Cit9Cit9IC8vIG5h
bWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33826</attachid>
            <date>2009-07-30 13:31:24 -0700</date>
            <delta_ts>2009-08-08 10:47:36 -0700</delta_ts>
            <desc>4) SharedBuffer</desc>
            <filename>27543_4.patch</filename>
            <type>text/plain</type>
            <size>13055</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmNwcCBi
L1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVyLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTA4MjU4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9PcHRpbWl6ZWRCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjZGVmaW5lIEVY
UE9SVF9PUFRJTUlaRURfQlVGRkVSIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorCisjaW5jbHVkZSAi
Y29uZmlnLmgiCisjaW5jbHVkZSAiT3B0aW1pemVkQnVmZmVyLmgiCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworT3B0aW1pemVkQnVmZmVyOjpDcmVhdG9yIE9wdGltaXplZEJ1ZmZlcjo6bV9jcmVh
dG9yID0gMDsKKworT3B0aW1pemVkQnVmZmVyOjpDcmVhdG9yIE9wdGltaXplZEJ1ZmZlcjo6c2V0
Q3JlYXRvcihDcmVhdG9yIG5ld0NyZWF0b3IpCit7CisgICAgQ3JlYXRvciBvbGRDcmVhdG9yID0g
bV9jcmVhdG9yOworICAgIG1fY3JlYXRvciA9IG5ld0NyZWF0b3I7CisgICAgcmV0dXJuIG9sZENy
ZWF0b3I7Cit9CisKK09wdGltaXplZEJ1ZmZlciogT3B0aW1pemVkQnVmZmVyOjpjcmVhdGVJbnN0
YW5jZSh1bnNpZ25lZCBleHBlY3RlZFNpemUsIE9wdGltaXplZEJ1ZmZlciogb2xkQnVmZmVyLCBi
b29sIHB1cmdlYWJsZSkKK3sKKyAgICByZXR1cm4gbV9jcmVhdG9yID8gbV9jcmVhdG9yKGV4cGVj
dGVkU2l6ZSwgb2xkQnVmZmVyLCBwdXJnZWFibGUpIDogMDsKK30KKwordm9pZCBPcHRpbWl6ZWRC
dWZmZXI6OmNvcHlUbyhPcHRpbWl6ZWRCdWZmZXImIG8pIGNvbnN0Cit7CisgICAgby5jbGVhcigp
OworICAgIGNvbnN0IGNoYXIqIGRhdGE7CisgICAgdW5zaWduZWQgcG9zID0gMDsKKyAgICB3aGls
ZSAodW5zaWduZWQgbGVuID0gZ2V0RGF0YSgmZGF0YSwgcG9zKSkgeworICAgICAgICBvLmFwcGVu
ZChkYXRhLCBsZW4pOworICAgICAgICBwb3MgKz0gbGVuOworICAgICAgICByZWxlYXNlRGF0YShk
YXRhKTsKKyAgICB9Cit9CisKK3ZvaWQgT3B0aW1pemVkQnVmZmVyOjpjb3B5RnJvbShjb25zdCBP
cHRpbWl6ZWRCdWZmZXImIG8pCit7CisgICAgY2xlYXIoKTsKKyAgICBjb25zdCBjaGFyKiBkYXRh
OworICAgIHVuc2lnbmVkIHBvcyA9IDA7CisgICAgd2hpbGUgKHVuc2lnbmVkIGxlbiA9IG8uZ2V0
RGF0YSgmZGF0YSwgcG9zKSkgeworICAgICAgICBhcHBlbmQoZGF0YSwgbGVuKTsKKyAgICAgICAg
cG9zICs9IGxlbjsKKyAgICAgICAgcmVsZWFzZURhdGEoZGF0YSk7CisgICAgfQorfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL09w
dGltaXplZEJ1ZmZlci5oIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9PcHRpbWl6ZWRCdWZmZXIu
aApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTdmOTQ4Ci0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9PcHRpbWl6ZWRCdWZmZXIuaApAQCAtMCww
ICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIElu
Yy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI3ByYWdtYSBvbmNlCisKKyNpZm5kZWYgX09QVElNSVpFRF9CVUZGRVJfSF8KKyNkZWZpbmUg
X09QVElNSVpFRF9CVUZGRVJfSF8KKworI2lmbmRlZiBFWFBPUlRfT1BUSU1JWkVEX0JVRkZFUgor
I2RlZmluZSBFWFBPUlRfT1BUSU1JWkVEX0JVRkZFUgorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworICAgIGNsYXNzIEVYUE9SVF9PUFRJTUlaRURfQlVGRkVSIE9wdGltaXplZEJ1ZmZl
ciB7CisgICAgcHVibGljOgorICAgICAgICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAh
bV9zaXplOyB9CisgICAgICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBtX3NpemU7
IH0KKyAgICAgICAgdmlydHVhbCBjb25zdCBjaGFyKiBjbGFzc05hbWUoKSBjb25zdCA9IDA7Cisg
ICAgICAgIHZpcnR1YWwgdm9pZCBzZWxmRGVsZXRlKCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZv
aWQgY2xlYXIoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBhcHBlbmQoY29uc3QgY2hhciog
ZGF0YSwgdW5zaWduZWQgbGVuKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBwcmVwZW5kKGNv
bnN0IGNoYXIqIGRhdGEsIHVuc2lnbmVkIGxlbikgPSAwOworICAgICAgICB2aXJ0dWFsIHVuc2ln
bmVkIGdldERhdGEoY29uc3QgY2hhcioqIGRhdGEsIHVuc2lnbmVkIHBvcyA9IDApIGNvbnN0ID0g
MDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VEYXRhKGNvbnN0IGNoYXIqIGRhdGEpIGNv
bnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGV4dHJhY3REYXRhKGNoYXIqIGRhdGEsIHVu
c2lnbmVkIHBvcyA9IDAsIHVuc2lnbmVkIGxlbiA9IC0xKSBjb25zdCA9IDA7CisgICAgICAgIHZp
cnR1YWwgdW5zaWduZWQgYWxsb2NhdGVEYXRhVG9Xcml0ZShjaGFyKiogZGF0YSwgdW5zaWduZWQg
ZGVzaXJlZExlbiA9IC0xKSA9IDA7CisgICAgICAgIHZpcnR1YWwgT3B0aW1pemVkQnVmZmVyKiBj
bG9uZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHBvcFNlZ21lbnQoKSA9IDA7
CisgICAgICAgIHZpcnR1YWwgYm9vbCBpc1B1cmdlYWJsZSgpIGNvbnN0ID0gMDsKKyAgICAgICAg
dm9pZCBjb3B5VG8oT3B0aW1pemVkQnVmZmVyJiBvKSBjb25zdDsKKyAgICAgICAgdm9pZCBjb3B5
RnJvbShjb25zdCBPcHRpbWl6ZWRCdWZmZXImIG8pOworCisgICAgICAgIHN0YXRpYyBPcHRpbWl6
ZWRCdWZmZXIqIGNyZWF0ZUluc3RhbmNlKHVuc2lnbmVkIGV4cGVjdGVkU2l6ZSwgT3B0aW1pemVk
QnVmZmVyKiBvbGRCdWZmZXIsIGJvb2wgcHVyZ2VhYmxlID0gZmFsc2UpOworICAgICAgICBzdGF0
aWMgdm9pZCBkZWxldGVJbnN0YW5jZShPcHRpbWl6ZWRCdWZmZXIqIGIpIHsgaWYgKGIpIGItPnNl
bGZEZWxldGUoKTsgfQorICAgICAgICB0eXBlZGVmIE9wdGltaXplZEJ1ZmZlciogKCpDcmVhdG9y
KSh1bnNpZ25lZCBleHBlY3RlZFNpemUsIE9wdGltaXplZEJ1ZmZlciogb2xkQnVmZmVyLCBib29s
IHB1cmdlYWJsZSk7CisgICAgICAgIHN0YXRpYyBDcmVhdG9yIHNldENyZWF0b3IoQ3JlYXRvcik7
CisgICAgICAgIHN0YXRpYyBib29sIGlzQ3JlYXRvckluc3RhbGxlZCgpIHsgcmV0dXJuICEhbV9j
cmVhdG9yOyB9CisgICAgcHJvdGVjdGVkOgorICAgICAgICBPcHRpbWl6ZWRCdWZmZXIoKSA6IG1f
c2l6ZSgwKSB7fQorICAgICAgICB2aXJ0dWFsIH5PcHRpbWl6ZWRCdWZmZXIoKSB7fQorICAgICAg
ICB1bnNpZ25lZCBtX3NpemU7CisgICAgICAgIHN0YXRpYyBDcmVhdG9yIG1fY3JlYXRvcjsKKyAg
ICB9OworfQorCisjZW5kaWYgLy8gX09QVElNSVpFRF9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvU2hhcmVkQnVmZmVyLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0v
d2luY2UvU2hhcmVkQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li5hNzk2NzUxCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFy
ZWRCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2
LCAyMDA4IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w
eXJpZ2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpZiBQTEFU
Rk9STShUT1JDSE1PQklMRSkgJiYgUExBVEZPUk0oV0lOQ0UpCisKKyNpbmNsdWRlICJjb25maWcu
aCIKKyNpbmNsdWRlICJTaGFyZWRCdWZmZXIuaCIKKworI2luY2x1ZGUgIk9wdGltaXplZEJ1ZmZl
ci5oIgorI2luY2x1ZGUgIlB1cmdlYWJsZUJ1ZmZlci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK1NoYXJlZEJ1ZmZlcjo6U2hhcmVkQnVmZmVyKCkKKzogbV9zaXplKDApCissIG1fbG9ja2Vk
KDApCissIG1fb3B0aW1pemVkQnVmZmVyKDApCit7Cit9CisKK1NoYXJlZEJ1ZmZlcjo6U2hhcmVk
QnVmZmVyKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKQorICAgIDogbV9zaXplKDApCisgICAg
LCBtX2xvY2tlZCgwKQorICAgICwgbV9vcHRpbWl6ZWRCdWZmZXIoMCkKK3sKKyAgICBhcHBlbmQo
ZGF0YSwgc2l6ZSk7Cit9CisKK1NoYXJlZEJ1ZmZlcjo6U2hhcmVkQnVmZmVyKGNvbnN0IHVuc2ln
bmVkIGNoYXIqIGRhdGEsIGludCBzaXplKQorICAgIDogbV9zaXplKDApCisgICAgLCBtX2xvY2tl
ZCgwKQorICAgICwgbV9vcHRpbWl6ZWRCdWZmZXIoMCkKK3sKKyAgICBhcHBlbmQocmVpbnRlcnBy
ZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpOworfQorCitTaGFyZWRCdWZmZXI6On5T
aGFyZWRCdWZmZXIoKQoreworICAgIE9wdGltaXplZEJ1ZmZlcjo6ZGVsZXRlSW5zdGFuY2UobV9v
cHRpbWl6ZWRCdWZmZXIpOworfQorCit1bnNpZ25lZCBTaGFyZWRCdWZmZXI6OnNpemUoKSBjb25z
dAoreworICAgIHJldHVybiBtX3NpemU7Cit9CisKK3Vuc2lnbmVkIFNoYXJlZEJ1ZmZlcjo6Z2V0
U2VnbWVudChjb25zdCBjaGFyKiogZGF0YSwgdW5zaWduZWQgcG9zKSBjb25zdAoreworICAgIGlm
IChwb3MgPj0gbV9zaXplKSB7CisgICAgICAgICpkYXRhID0gMDsKKyAgICAgICAgcmV0dXJuIDA7
CisgICAgfQorCisgICAgdW5zaWduZWQgY29uc2VjdXRpdmVTaXplID0gbV9idWZmZXIuc2l6ZSgp
OworICAgIGlmIChwb3MgPj0gY29uc2VjdXRpdmVTaXplKSB7CisgICAgICAgIEFTU0VSVChtX29w
dGltaXplZEJ1ZmZlcik7CisgICAgICAgIHJldHVybiBtX29wdGltaXplZEJ1ZmZlci0+Z2V0RGF0
YShkYXRhLCBwb3MgLSBjb25zZWN1dGl2ZVNpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgICpk
YXRhID0gbV9idWZmZXIuZGF0YSgpICsgcG9zOworICAgICAgICByZXR1cm4gY29uc2VjdXRpdmVT
aXplIC0gcG9zOworICAgIH0KK30KKwordm9pZCBTaGFyZWRCdWZmZXI6OnJlbGVhc2VTZWdtZW50
KGNvbnN0IGNoYXIqIGRhdGEpIGNvbnN0Cit7CisgICAgLy8gSW4gb3VyIFZlY3RvciBidWZmZXIK
KyAgICBpZiAoIW1fYnVmZmVyLmlzRW1wdHkoKSAmJiAodW5zaWduZWQpZGF0YSA+ICh1bnNpZ25l
ZCltX2J1ZmZlci5kYXRhKCkgJiYgKHVuc2lnbmVkKWRhdGEgPD0gKHVuc2lnbmVkKW1fYnVmZmVy
LmRhdGEoKSArIG1fYnVmZmVyLnNpemUoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1f
b3B0aW1pemVkQnVmZmVyKQorICAgICAgICBtX29wdGltaXplZEJ1ZmZlci0+cmVsZWFzZURhdGEo
ZGF0YSk7Cit9CisKK3ZvaWQgU2hhcmVkQnVmZmVyOjphcHBlbmQoY29uc3QgY2hhciogZGF0YSwg
aW50IGxlbikKK3sKKyAgICBpZiAobV9sb2NrZWQgfHwgbGVuIDw9IDApCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmICghbV9vcHRpbWl6ZWRCdWZmZXIgJiYgT3B0aW1pemVkQnVmZmVyOjppc0Ny
ZWF0b3JJbnN0YWxsZWQoKSkKKyAgICAgICAgbV9vcHRpbWl6ZWRCdWZmZXIgPSBPcHRpbWl6ZWRC
dWZmZXI6OmNyZWF0ZUluc3RhbmNlKGxlbiArIG1fc2l6ZSwgMCk7CisKKyAgICBpZiAobV9vcHRp
bWl6ZWRCdWZmZXIpCisgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyLT5hcHBlbmQoZGF0YSwgbGVu
KTsKKyAgICBlbHNlCisgICAgICAgIG1fYnVmZmVyLmFwcGVuZChkYXRhLCBsZW4pOworCisgICAg
bV9zaXplICs9IGxlbjsKK30KKwordm9pZCBTaGFyZWRCdWZmZXI6OmNsZWFyKCkKK3sKKyAgICBp
ZiAobV9sb2NrZWQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX29wdGltaXplZEJ1ZmZl
cikKKyAgICAgICAgbV9vcHRpbWl6ZWRCdWZmZXItPmNsZWFyKCk7CisgICAgbV9idWZmZXIuY2xl
YXIoKTsKKyAgICBtX3NpemUgPSAwOworfQorCitQYXNzUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gU2hh
cmVkQnVmZmVyOjpjb3B5KCkgY29uc3QKK3sKKyAgICBTaGFyZWRCdWZmZXIqIHJ0biA9IG5ldyBT
aGFyZWRCdWZmZXIoKTsKKworICAgIHJ0bi0+bV9zaXplID0gbV9zaXplOworICAgIHJ0bi0+bV9i
dWZmZXIuYXBwZW5kKG1fYnVmZmVyLmRhdGEoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICBpZiAo
bV9zaXplID4gbV9idWZmZXIuc2l6ZSgpKSB7CisgICAgICAgIEFTU0VSVChtX29wdGltaXplZEJ1
ZmZlcik7CisgICAgICAgIHJ0bi0+bV9vcHRpbWl6ZWRCdWZmZXIgPSBtX29wdGltaXplZEJ1ZmZl
ci0+Y2xvbmUoKTsKKyAgICAgICAgaWYgKCFydG4tPm1fb3B0aW1pemVkQnVmZmVyKSB7CisgICAg
ICAgICAgICBzaXplX3QgYnVmU2l6ZSA9IHJ0bi0+bV9idWZmZXIuc2l6ZSgpOworICAgICAgICAg
ICAgcnRuLT5tX2J1ZmZlci5yZXNpemUoYnVmU2l6ZSArIG1fb3B0aW1pemVkQnVmZmVyLT5zaXpl
KCkpOworICAgICAgICAgICAgbV9vcHRpbWl6ZWRCdWZmZXItPmV4dHJhY3REYXRhKHJ0bi0+bV9i
dWZmZXIuZGF0YSgpICsgYnVmU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJ0
bjsKK30KKworY2xhc3MgRmlsZURlc2NyaXB0b3JIb2xkZXIgeworcHVibGljOgorICAgIEZpbGVE
ZXNjcmlwdG9ySG9sZGVyKEZJTEUqIGZkKSA6IG1fZmQoZmQpIHt9CisgICAgfkZpbGVEZXNjcmlw
dG9ySG9sZGVyKCkgeyBmY2xvc2UobV9mZCk7IH0KK3ByaXZhdGU6CisgICAgRklMRSogbV9mZDsK
K307CisKK1Bhc3NSZWZQdHI8U2hhcmVkQnVmZmVyPiBTaGFyZWRCdWZmZXI6OmNyZWF0ZVdpdGhD
b250ZW50c09mRmlsZShjb25zdCBTdHJpbmcmIGZpbGVQYXRoKQoreworICAgIFN0cmluZyBudWxs
aWZpZWRQYXRoID0gZmlsZVBhdGg7CisgICAgRklMRSogZmlsZURlc2NyaXB0b3IgPSBfd2ZvcGVu
KG51bGxpZmllZFBhdGguY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgVEVYVCgiciti
IikpOworICAgIGlmICghZmlsZURlc2NyaXB0b3IpCisgICAgICAgIHJldHVybiAwOworCisgICAg
RmlsZURlc2NyaXB0b3JIb2xkZXIgaG9sZEZkKGZpbGVEZXNjcmlwdG9yKTsKKworICAgIGlmICgh
ZnNlZWsoZmlsZURlc2NyaXB0b3IsIC0xLCBTRUVLX0VORCkpCisgICAgICAgIHJldHVybiAwOwor
CisgICAgRFdPUkQgZmlsZVNpemUgPSBmdGVsbChmaWxlRGVzY3JpcHRvcik7CisgICAgaWYgKDB4
RkZGRkZGRkYgPT0gZmlsZVNpemUrKykKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBSZWZQdHI8
U2hhcmVkQnVmZmVyPiByZXN1bHQ7CisgICAgeworICAgICAgICBNZW1vcnlBbGxvY2F0aW9uQ2Fu
RmFpbCBjYW5GYWlsOworICAgICAgICByZXN1bHQgPSBuZXcgU2hhcmVkQnVmZmVyKCk7CisgICAg
ICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgKytm
aWxlU2l6ZTsKKworICAgIGlmIChmaWxlU2l6ZSkgeworICAgICAgICBmc2VlayhmaWxlRGVzY3Jp
cHRvciwgMCwgU0VFS19TRVQpOworCisgICAgICAgIGlmICghcmVzdWx0LT5tX29wdGltaXplZEJ1
ZmZlciAmJiBPcHRpbWl6ZWRCdWZmZXI6OmlzQ3JlYXRvckluc3RhbGxlZCgpKQorICAgICAgICAg
ICAgcmVzdWx0LT5tX29wdGltaXplZEJ1ZmZlciA9IE9wdGltaXplZEJ1ZmZlcjo6Y3JlYXRlSW5z
dGFuY2UoZmlsZVNpemUsIDApOworCisgICAgICAgIGlmIChyZXN1bHQtPm1fb3B0aW1pemVkQnVm
ZmVyKSB7CisgICAgICAgICAgICBNZW1vcnlBbGxvY2F0aW9uQ2FuRmFpbCBjYW5GYWlsOworICAg
ICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNoYXIqIGRhdGE7CisgICAgICAgICAgICAg
ICAgdW5zaWduZWQgdG9SZWFkID0gcmVzdWx0LT5tX29wdGltaXplZEJ1ZmZlci0+YWxsb2NhdGVE
YXRhVG9Xcml0ZSgmZGF0YSwgZmlsZVNpemUpOworICAgICAgICAgICAgICAgIGlmICghdG9SZWFk
KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB1bnNpZ25l
ZCBhY3R1YWxSZWFkID0gZnJlYWQoZGF0YSwgMSwgdG9SZWFkLCBmaWxlRGVzY3JpcHRvcik7Cisg
ICAgICAgICAgICAgICAgcmVzdWx0LT5tX29wdGltaXplZEJ1ZmZlci0+cmVsZWFzZURhdGEoZGF0
YSk7CisgICAgICAgICAgICAgICAgaWYgKGFjdHVhbFJlYWQgIT0gdG9SZWFkKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBmaWxlU2l6ZSAtPSB0b1JlYWQ7
CisgICAgICAgICAgICAgICAgcmVzdWx0LT5tX3NpemUgKz0gdG9SZWFkOworICAgICAgICAgICAg
fSB3aGlsZSAoZmlsZVNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTWVtb3J5
QWxsb2NhdGlvbkNhbkZhaWwgY2FuRmFpbDsKKyAgICAgICAgICAgIHJlc3VsdC0+bV9idWZmZXIu
cmVzaXplKGZpbGVTaXplKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQtPm1fYnVmZmVyLnNpemUo
KSAhPSBmaWxlU2l6ZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgICAg
aWYgKGZyZWFkKHJlc3VsdC0+bV9idWZmZXIuZGF0YSgpLCAxLCBmaWxlU2l6ZSwgZmlsZURlc2Ny
aXB0b3IpICE9IGZpbGVTaXplKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9
CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7Cit9CisKK2NvbnN0IFZlY3Rv
cjxjaGFyPiYgU2hhcmVkQnVmZmVyOjpidWZmZXIoKQoreworICAgIGlmIChtX29wdGltaXplZEJ1
ZmZlciAmJiAhbV9vcHRpbWl6ZWRCdWZmZXItPmlzRW1wdHkoKSkgeworICAgICAgICBzaXplX3Qg
YnVmU2l6ZSA9IG1fYnVmZmVyLnNpemUoKTsKKyAgICAgICAgbV9idWZmZXIucmVzaXplKGJ1ZlNp
emUgKyBtX29wdGltaXplZEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgbV9vcHRpbWl6ZWRCdWZm
ZXItPmV4dHJhY3REYXRhKG1fYnVmZmVyLmRhdGEoKSArIGJ1ZlNpemUpOworICAgICAgICBtX29w
dGltaXplZEJ1ZmZlci0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIG1fYnVmZmVyOworfQor
Citjb25zdCBjaGFyKiBTaGFyZWRCdWZmZXI6OmRhdGEoKSBjb25zdAoreworICAgIHJldHVybiBj
b25zdF9jYXN0PFNoYXJlZEJ1ZmZlcio+KHRoaXMpLT5idWZmZXIoKS5kYXRhKCk7Cit9CisKKwor
UGFzc1JlZlB0cjxTaGFyZWRCdWZmZXI+IFNoYXJlZEJ1ZmZlcjo6YWRvcHRWZWN0b3IoVmVjdG9y
PGNoYXI+JiB2ZWN0b3IpCit7CisgICAgUmVmUHRyPFNoYXJlZEJ1ZmZlcj4gYnVmZmVyID0gY3Jl
YXRlKCk7CisgICAgYnVmZmVyLT5tX2J1ZmZlci5zd2FwKHZlY3Rvcik7CisgICAgYnVmZmVyLT5t
X3NpemUgPSBidWZmZXItPm1fYnVmZmVyLnNpemUoKTsKKyAgICByZXR1cm4gYnVmZmVyOworfQor
Citib29sIFNoYXJlZEJ1ZmZlcjo6bWFrZVB1cmdlYWJsZSgpCit7CisgICAgaWYgKG1fb3B0aW1p
emVkQnVmZmVyICYmIG1fb3B0aW1pemVkQnVmZmVyLT5pc1B1cmdlYWJsZSgpKSB7CisgICAgICAg
IGlmICghbV9idWZmZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBtX29wdGltaXplZEJ1ZmZl
ci0+cHJlcGVuZChtX2J1ZmZlci5kYXRhKCksIG1fYnVmZmVyLnNpemUoKSk7CisgICAgICAgICAg
ICBtX2J1ZmZlci5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKworICAgIGlmIChPcHRpbWl6ZWRCdWZmZXI6OmlzQ3JlYXRvckluc3RhbGxlZCgpKSB7Cisg
ICAgICAgIGlmIChPcHRpbWl6ZWRCdWZmZXIqIG9wdGltaXplZEJ1ZmZlciA9IE9wdGltaXplZEJ1
ZmZlcjo6Y3JlYXRlSW5zdGFuY2UobV9zaXplLCBtX29wdGltaXplZEJ1ZmZlciwgdHJ1ZSkpIHsK
KyAgICAgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyID0gb3B0aW1pemVkQnVmZmVyOworICAgICAg
ICAgICAgaWYgKCFtX2J1ZmZlci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtX29wdGlt
aXplZEJ1ZmZlci0+cHJlcGVuZChtX2J1ZmZlci5kYXRhKCksIG1fYnVmZmVyLnNpemUoKSk7Cisg
ICAgICAgICAgICAgICAgbV9idWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30K
KworfQorCisjZW5kaWYgLy8gUExBVEZPUk0oVE9SQ0hNT0JJTEUpICYmIFBMQVRGT1JNKFdJTkNF
KQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33827</attachid>
            <date>2009-07-30 13:31:51 -0700</date>
            <delta_ts>2009-08-08 10:47:36 -0700</delta_ts>
            <desc>5) ContextMenu</desc>
            <filename>27543_5.patch</filename>
            <type>text/plain</type>
            <size>13278</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVJdGVtV2luY2Uu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9Db250ZXh0TWVudUl0ZW1XaW5jZS5jcHAKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgyZmJmZQotLS0gL2Rldi9udWxsCisr
KyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVJdGVtV2luY2UuY3BwCkBAIC0w
LDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBN
b2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRl
eHRNZW51SXRlbS5oIgorCisjaW5jbHVkZSAiQ29udGV4dE1lbnUuaCIKKyNpbmNsdWRlICJDU3Ry
aW5nLmgiCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1Bs
YXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6On5QbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRp
b25UeXBlKCkKK3sKKyAgICBkZWxldGUgc3ViTWVudTsKK30KKworQ29udGV4dE1lbnVJdGVtOjpD
b250ZXh0TWVudUl0ZW0oUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGl0ZW0pCisgICAgOiBt
X3BsYXRmb3JtRGVzY3JpcHRpb24oaXRlbSkKK3sKK30KKworQ29udGV4dE1lbnVJdGVtOjpDb250
ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUqIHN1Yk1lbnUpCit7CisgICAgbV9wbGF0Zm9ybURlc2Ny
aXB0aW9uID0gbmV3IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU7CisgICAgaWYgKG1f
cGxhdGZvcm1EZXNjcmlwdGlvbiAmJiBzdWJNZW51KQorICAgICAgICBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPnN1Yk1lbnUgPSBzdWJNZW51LT5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOwor
fQorCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBl
IHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29u
dGV4dE1lbnUqIHN1Yk1lbnUpCit7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gbmV3IFBs
YXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU7CisgICAgaWYgKCFtX3BsYXRmb3JtRGVzY3Jp
cHRpb24pCisgICAgICAgIHJldHVybjsKKworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dHlw
ZSA9IHR5cGU7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5hY3Rpb24gPSBhY3Rpb247Cisg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT50aXRsZSA9IHRpdGxlOworICAgIGlmIChzdWJNZW51
KQorICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1lbnUgPSBzdWJNZW51LT5yZWxl
YXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOworfQorCitDb250ZXh0TWVudUl0ZW06On5Db250ZXh0
TWVudUl0ZW0oKQoreworICAgIGRlbGV0ZSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Cit9CisKK1Bs
YXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9y
bURlc2NyaXB0aW9uKCkKK3sKKyAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gZGVzYyA9
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAwOwor
ICAgIHJldHVybiBkZXNjOworfQorCitDb250ZXh0TWVudUl0ZW1UeXBlIENvbnRleHRNZW51SXRl
bTo6dHlwZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAg
ICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dHlwZTsKKyAgICBlbHNlCisgICAgICAg
IHJldHVybiBBY3Rpb25UeXBlOworfQorCitDb250ZXh0TWVudUFjdGlvbiBDb250ZXh0TWVudUl0
ZW06OmFjdGlvbigpIGNvbnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAg
ICAgICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+YWN0aW9uOworICAgIGVsc2UKKyAg
ICAgICAgcmV0dXJuIENvbnRleHRNZW51SXRlbVRhZ05vQWN0aW9uOworfQorCitTdHJpbmcgQ29u
dGV4dE1lbnVJdGVtOjp0aXRsZSgpIGNvbnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlw
dGlvbikKKyAgICAgICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dGl0bGU7CisgICAg
ZWxzZQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK1BsYXRmb3JtTWVudURlc2NyaXB0
aW9uIENvbnRleHRNZW51SXRlbTo6cGxhdGZvcm1TdWJNZW51KCkgY29uc3QKK3sKKyAgICBpZiAo
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0
aW9uLT5zdWJNZW51OworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ29u
dGV4dE1lbnVJdGVtOjpzZXRUeXBlKENvbnRleHRNZW51SXRlbVR5cGUgdHlwZSkKK3sKKyAgICBp
ZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24t
PnR5cGUgPSB0eXBlOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0QWN0aW9uKENvbnRl
eHRNZW51QWN0aW9uIGFjdGlvbikKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQor
ICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmFjdGlvbiA9IGFjdGlvbjsKK30KKwordm9p
ZCBDb250ZXh0TWVudUl0ZW06OnNldFRpdGxlKGNvbnN0IFN0cmluZyYgdGl0bGUpCit7CisgICAg
aWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT50aXRsZSA9IHRpdGxlOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShD
b250ZXh0TWVudSogc3ViTWVudSkKK3sKKyAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+c3ViTWVu
dSAhPSBzdWJNZW51LT5wbGF0Zm9ybURlc2NyaXB0aW9uKCkpCisgICAgICAgIGRlbGV0ZSBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1lbnU7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5z
dWJNZW51ID0gc3ViTWVudS0+cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKK30KKwordm9p
ZCBDb250ZXh0TWVudUl0ZW06OnNldENoZWNrZWQoYm9vbCBjaGVja2VkKQoreworICAgIGlmICgh
bV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm47CisgICAgaWYgKGNoZWNrZWQp
CisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+c3RhdGUgfD0gUGxhdGZvcm1NZW51SXRl
bURlc2NyaXB0aW9uVHlwZTo6Q2hlY2tlZFN0YXRlOworICAgIGVsc2UKKyAgICAgICAgbV9wbGF0
Zm9ybURlc2NyaXB0aW9uLT5zdGF0ZSAmPSB+UGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlw
ZTo6Q2hlY2tlZFN0YXRlOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0RW5hYmxlZChi
b29sIGVuYWJsZWQpCit7CisgICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAgICAg
IHJldHVybjsKKyAgICBpZiAoZW5hYmxlZCkKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT5zdGF0ZSB8PSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGU7
CisgICAgZWxzZQorICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN0YXRlICY9IH5QbGF0
Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGU7Cit9CisKK2Jvb2wgQ29u
dGV4dE1lbnVJdGVtOjplbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURl
c2NyaXB0aW9uICYmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN0YXRlICYgUGxhdGZvcm1NZW51
SXRlbURlc2NyaXB0aW9uVHlwZTo6RW5hYmxlZFN0YXRlKSA9PSBQbGF0Zm9ybU1lbnVJdGVtRGVz
Y3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGU7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0NvbnRleHRNZW51V2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAuLmQ2ZDhlNGEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0Nv
bnRleHRNZW51V2luY2UuY3BwCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51LmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgi
CisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZy
YW1lVmlldy5oIgorI2luY2x1ZGUgIk5vZGUuaCIKKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1
ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJD
b3JlIHsKKworUGxhdGZvcm1NZW51RGVzY3JpcHRpb25UeXBlOjpQbGF0Zm9ybU1lbnVEZXNjcmlw
dGlvblR5cGUoKQorICAgIDogaE1lbnUoOjpDcmVhdGVQb3B1cE1lbnUoKSkKKyAgICAsIGl0ZW1D
b3VudCgwKQoreworfQorCitQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvblR5cGU6On5QbGF0Zm9ybU1l
bnVEZXNjcmlwdGlvblR5cGUoKQoreworICAgIGlmIChoTWVudSkKKyAgICAgICAgOjpEZXN0cm95
TWVudShoTWVudSk7Cit9CisKK0NvbnRleHRNZW51OjpDb250ZXh0TWVudShjb25zdCBIaXRUZXN0
UmVzdWx0JiByZXN1bHQpCisgICAgOiBtX2hpdFRlc3RSZXN1bHQocmVzdWx0KQorICAgICwgbV9w
bGF0Zm9ybURlc2NyaXB0aW9uKDApCit7CisgICAgc2V0UGxhdGZvcm1EZXNjcmlwdGlvbihuZXcg
UGxhdGZvcm1NZW51RGVzY3JpcHRpb25UeXBlKTsKK30KKworQ29udGV4dE1lbnU6OkNvbnRleHRN
ZW51KGNvbnN0IEhpdFRlc3RSZXN1bHQmIHJlc3VsdCwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb24gbWVudSkKKyAgICA6IG1faGl0VGVzdFJlc3VsdChyZXN1bHQpCisgICAgLCBtX3BsYXRm
b3JtRGVzY3JpcHRpb24oMCkKK3sKKyAgICBzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKG1lbnUpOwor
fQorCitDb250ZXh0TWVudTo6fkNvbnRleHRNZW51KCkKK3sKKyAgICBkZWxldGUgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uOworfQorCit1bnNpZ25lZCBDb250ZXh0TWVudTo6aXRlbUNvdW50KCkgY29u
c3QKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm4gbV9w
bGF0Zm9ybURlc2NyaXB0aW9uLT5pdGVtQ291bnQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4g
MDsKK30KKwordm9pZCBDb250ZXh0TWVudTo6aW5zZXJ0SXRlbSh1bnNpZ25lZCBpbnQgcG9zaXRp
b24sIENvbnRleHRNZW51SXRlbSYgaXRlbSkKK3sKKyAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlw
dGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAgY2hlY2tPckVuYWJsZUlmTmVlZGVkKGl0ZW0p
OworCisgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGRlc2MgPSBpdGVtLnJlbGVhc2VQ
bGF0Zm9ybURlc2NyaXB0aW9uKCk7CisgICAgVUlOVCBmbGFncyA9IE1GX0JZUE9TSVRJT047Cisg
ICAgVUlOVCBuZXdJdGVtID0gMDsKKyAgICBMUENUU1RSIHRpdGxlID0gMDsKKyAgICBEV09SRCBz
dWJNZW51U2l6ZSA9IDA7CisKKyAgICBpZiAoZGVzYy0+dHlwZSA9PSBTZXBhcmF0b3JUeXBlKQor
ICAgICAgICBmbGFncyB8PSBNRl9TRVBBUkFUT1I7CisgICAgZWxzZSB7CisgICAgICAgIGZsYWdz
IHw9IE1GX1NUUklORzsKKyAgICAgICAgdGl0bGUgPSB3Y3NkdXAoZGVzYy0+dGl0bGUuY2hhcmFj
dGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7CisKKyAgICAgICAgaWYgKGRlc2MtPnN1Yk1lbnUp
IHsKKyAgICAgICAgICAgIGZsYWdzIHw9IE1GX1BPUFVQOworICAgICAgICAgICAgbmV3SXRlbSA9
IChVSU5UKSBkZXNjLT5zdWJNZW51LT5oTWVudTsKKyAgICAgICAgICAgIHN1Yk1lbnVTaXplID0g
ZGVzYy0+c3ViTWVudS0+aXRlbUNvdW50OworCisgICAgICAgICAgICAvLyBub3cgd2Ugb3duIHRo
ZSBzdWJtZW51IHNvIG1ha2Ugc3VyZSBpdCBkb2Vzbid0IGdldCBkZWxldGVkIHdpdGggZGVzYwor
ICAgICAgICAgICAgZGVzYy0+c3ViTWVudS0+aE1lbnUgPSAwOworICAgICAgICAgICAgZGVsZXRl
IGRlc2MtPnN1Yk1lbnU7CisgICAgICAgICAgICBkZXNjLT5zdWJNZW51ID0gMDsKKyAgICAgICAg
fSBlbHNlCisgICAgICAgICAgICBuZXdJdGVtID0gZGVzYy0+YWN0aW9uOworCisgICAgICAgIGlm
ICgoZGVzYy0+c3RhdGUgJiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpDaGVja2Vk
U3RhdGUpID09IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkNoZWNrZWRTdGF0ZSkK
KyAgICAgICAgICAgIGZsYWdzIHw9IE1GX0NIRUNLRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIGZsYWdzIHw9IE1GX1VOQ0hFQ0tFRDsKKworICAgICAgICBpZiAoKGRlc2MtPnN0YXRlICYg
UGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZTo6RW5hYmxlZFN0YXRlKSA9PSBQbGF0Zm9y
bU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGUpCisgICAgICAgICAgICBmbGFn
cyB8PSBNRl9FTkFCTEVEOworICAgICAgICBlbHNlCisgICAgICAgICAgICBmbGFncyB8PSBNRl9H
UkFZRUQ7CisgICAgfQorCisgICAgaWYgKDo6SW5zZXJ0TWVudShtX3BsYXRmb3JtRGVzY3JpcHRp
b24tPmhNZW51LCBwb3NpdGlvbiwgZmxhZ3MsIG5ld0l0ZW0sIHRpdGxlKSkgeworICAgICAgICBp
ZiAoc3ViTWVudVNpemUpIHsKKyAgICAgICAgICAgIC8vIHN0b3JlIHRoZSBzdWJtZW51J3Mgc2l6
ZSBhbG9uZyB3aXRoIGl0LCBzaW5jZSBXaW5DRSBoYXMgbm8gZnVuY3Rpb24gY2FsbCB0byBmaW5k
IHRoaXMKKyAgICAgICAgICAgIE1FTlVJVEVNSU5GTyBpbmZvOworICAgICAgICAgICAgbWVtc2V0
KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICAgICAgICAgICAgaW5mby5jYlNpemUgPSBzaXpl
b2YoaW5mbyk7CisgICAgICAgICAgICBpbmZvLmZNYXNrID0gTUlJTV9EQVRBOworICAgICAgICAg
ICAgaW5mby5kd0l0ZW1EYXRhID0gc3ViTWVudVNpemU7CisKKyAgICAgICAgICAgIDo6U2V0TWVu
dUl0ZW1JbmZvKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aE1lbnUsIHBvc2l0aW9uLCBUUlVFLCAm
aW5mbyk7CisgICAgICAgIH0KKyAgICAgICAgKyttX3BsYXRmb3JtRGVzY3JpcHRpb24tPml0ZW1D
b3VudDsKKyAgICB9CisKKyAgICAvLyB0aGUgaXRlbSBpcyBub3cgb3duZWQgYnkgdGhlIG1lbnUg
c3RydWN0dXJlLCBzbyBkZWxldGUgb3VyIHJlZmVyZW5jZSB0byBpdAorICAgIGRlbGV0ZSBkZXNj
OworfQorCit2b2lkIENvbnRleHRNZW51OjphcHBlbmRJdGVtKENvbnRleHRNZW51SXRlbSYgaXRl
bSkKK3sKKyAgICBpbnNlcnRJdGVtKGl0ZW1Db3VudCgpLCBpdGVtKTsKK30KKworc3RhdGljIENv
bnRleHRNZW51SXRlbSogY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24oUGxhdGZvcm1NZW51
RGVzY3JpcHRpb24gbWVudSwgdW5zaWduZWQgaWQsIEJPT0wgYnlQb3NpdGlvbikKK3sKKyAgICBp
ZiAoIW1lbnUpCisgICAgICAgIHJldHVybiAwOworCisgICAgTUVOVUlURU1JTkZPIGluZm87Cisg
ICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICAgIGluZm8uY2JTaXplID0gc2l6
ZW9mKGluZm8pOworICAgIGluZm8uZk1hc2sgPSBNSUlNX1RZUEUgfCBNSUlNX0lEIHwgTUlJTV9T
VUJNRU5VIHwgTUlJTV9TVEFURSB8IE1JSU1fREFUQTsKKworICAgIGlmICghOjpHZXRNZW51SXRl
bUluZm8obWVudS0+aE1lbnUsIGlkLCBieVBvc2l0aW9uLCAmaW5mbykpCisgICAgICAgIHJldHVy
biAwOworCisgICAgLy8gaWYgaXQgaGFzIGEgc3RyaW5nLCByZWFkIGl0CisgICAgU3RyaW5nIHRp
dGxlOworICAgIGlmICgoaW5mby5mVHlwZSAmIE1GVF9TVFJJTkcpID09IE1GVF9TVFJJTkcpIHsK
KyAgICAgICAgLy8gaW5mby5jY2ggY29udGFpbnMgdGhlIG51bWJlciBvZiBjaGFycyBpbiB0aGUg
c3RyaW5nLiAgQWxsb2NhdGUgc3BhY2UgZm9yIHRoaXMgKHBsdXMgbnVsbCB0ZXJtaW5hdG9yKSBh
bmQgcXVlcnkgYWdhaW4uCisgICAgICAgICsraW5mby5jY2g7CisgICAgICAgIExQVFNUUiBidWZm
ZXIgPSAoTFBUU1RSKW1hbGxvYyhpbmZvLmNjaCAqIHNpemVvZihUQ0hBUikpOworICAgICAgICBp
ZiAoIWJ1ZmZlcikKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBpbmZvLmR3VHlwZURh
dGEgPSBidWZmZXI7CisKKyAgICAgICAgaWYgKCE6OkdldE1lbnVJdGVtSW5mbyhtZW51LT5oTWVu
dSwgaWQsIGJ5UG9zaXRpb24sICZpbmZvKSkgeworICAgICAgICAgICAgZnJlZShidWZmZXIpOwor
ICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbmZvLmNjaCBo
YXMgYmVlbiB1cGRhdGVkIHdpdGggbnVtYmVyIG9mIGNoYXJzIGNvcGllZCBpbnRvIGJ1ZmZlcgor
ICAgICAgICB0aXRsZSA9IFN0cmluZyhpbmZvLmR3VHlwZURhdGEsIGluZm8uY2NoKTsKKyAgICAg
ICAgZnJlZShidWZmZXIpOworICAgIH0KKworICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgdG8gcmV0
dXJuCisgICAgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uIGl0ZW0gPSBuZXcgUGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uVHlwZTsKKworICAgIGlmICgoaW5mby5mVHlwZSAmIE1GVF9TRVBB
UkFUT1IpID09IE1GVF9TRVBBUkFUT1IpCisgICAgICAgIGl0ZW0tPnR5cGUgPSBTZXBhcmF0b3JU
eXBlOworICAgIGVsc2UgeworICAgICAgICBpdGVtLT50aXRsZSA9IHRpdGxlOworICAgICAgICBp
dGVtLT5zdGF0ZSA9IDA7CisgICAgICAgIGlmICgoaW5mby5mU3RhdGUgJiBNRlNfQ0hFQ0tFRCkg
PT0gTUZTX0NIRUNLRUQpCisgICAgICAgICAgICBpdGVtLT5zdGF0ZSB8PSBQbGF0Zm9ybU1lbnVJ
dGVtRGVzY3JpcHRpb25UeXBlOjpDaGVja2VkU3RhdGU7CisgICAgICAgIGlmICgoaW5mby5mU3Rh
dGUgJiBNRlNfRU5BQkxFRCkgPT0gTUZTX0VOQUJMRUQpCisgICAgICAgICAgICBpdGVtLT5zdGF0
ZSB8PSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGU7CisKKyAg
ICAgICAgaWYgKCFpbmZvLmhTdWJNZW51KSB7CisgICAgICAgICAgICBpdGVtLT50eXBlID0gQWN0
aW9uVHlwZTsKKyAgICAgICAgICAgIGl0ZW0tPmFjdGlvbiA9IChDb250ZXh0TWVudUFjdGlvbikg
aW5mby53SUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdGVtLT50eXBlID0gU3Vi
bWVudVR5cGU7CisgICAgICAgICAgICBpdGVtLT5zdWJNZW51ID0gbmV3IFBsYXRmb3JtTWVudURl
c2NyaXB0aW9uVHlwZTsKKworICAgICAgICAgICAgLy8gdGhlIG1lbnUgc2l6ZSBpcyBzdG9yZWQg
YXMgdGhlIGl0ZW0ncyBjdXN0b20gZGF0YQorICAgICAgICAgICAgLy8gQlVHOiB3aG8gb3ducyB0
aGUgSE1FTlUgbm93PworICAgICAgICAgICAgaXRlbS0+c3ViTWVudS0+aE1lbnUgPSBpbmZvLmhT
dWJNZW51OworICAgICAgICAgICAgaXRlbS0+c3ViTWVudS0+aXRlbUNvdW50ID0gaW5mby5kd0l0
ZW1EYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBDb250ZXh0TWVudUl0
ZW0oaXRlbSk7Cit9CisKK0NvbnRleHRNZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1XaXRoQWN0
aW9uKHVuc2lnbmVkIGFjdGlvbikKK3sKKyAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9y
UG9zaXRpb24obV9wbGF0Zm9ybURlc2NyaXB0aW9uLCBhY3Rpb24sIEZBTFNFKTsKK30KKworQ29u
dGV4dE1lbnVJdGVtKiBDb250ZXh0TWVudTo6aXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgsIGNv
bnN0IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIHBsYXRmb3JtRGVzY3JpcHRpb24pCit7CisgICAg
cmV0dXJuIGNvbnRleHRNZW51SXRlbUJ5SWRPclBvc2l0aW9uKHBsYXRmb3JtRGVzY3JpcHRpb24s
IGluZGV4LCBUUlVFKTsKK30KKwordm9pZCBDb250ZXh0TWVudTo6c2V0UGxhdGZvcm1EZXNjcmlw
dGlvbihQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBkZXNjKQoreworICAgIGlmIChtX3BsYXRmb3Jt
RGVzY3JpcHRpb24gIT0gZGVzYykKKyAgICAgICAgZGVsZXRlIG1fcGxhdGZvcm1EZXNjcmlwdGlv
bjsKKyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSBkZXNjOworfQorCitQbGF0Zm9ybU1lbnVE
ZXNjcmlwdGlvbiBDb250ZXh0TWVudTo6cGxhdGZvcm1EZXNjcmlwdGlvbigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKK30KKworUGxhdGZvcm1NZW51RGVzY3Jp
cHRpb24gQ29udGV4dE1lbnU6OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKK3sKKyAgICBQ
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBkZXNjID0gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOworICAg
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IDA7CisgICAgcmV0dXJuIGRlc2M7Cit9CisKK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33828</attachid>
            <date>2009-07-30 13:32:43 -0700</date>
            <delta_ts>2009-08-08 10:47:36 -0700</delta_ts>
            <desc>6) SharedTimer and SystemTime</desc>
            <filename>27543_6.patch</filename>
            <type>text/plain</type>
            <size>6098</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2hhcmVkVGltZXJXaW5jZS5jcHAg
Yi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NoYXJlZFRpbWVyV2luY2UuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMmYxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL1NoYXJlZFRpbWVyV2luY2UuY3BwCkBAIC0wLDAgKzEsMTMwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJ
bmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTaGFyZWRUaW1lci5o
IgorCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIKKyNpbmNsdWRl
ICJXaWRnZXQuaCIKKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUgPHd0Zi9D
dXJyZW50VGltZS5oPgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIEpTQyB7Citl
eHRlcm4gdm9pZCogZ19zdGFja0Jhc2U7Cit9CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworZW51
bSB7CisgICAgVGltZXJJZE5vbmUgPSAwLAorICAgIFRpbWVySWRBdXRvLAorICAgIFRpbWVySWRN
YW51YWwsCit9Oworc3RhdGljIFVJTlQgdGltZXJJRCA9IFRpbWVySWROb25lOworCitzdGF0aWMg
dm9pZCAoKnNoYXJlZFRpbWVyRmlyZWRGdW5jdGlvbikoKTsKKworc3RhdGljIEhXTkQgdGltZXJX
aW5kb3dIYW5kbGUgPSAwOworY29uc3QgTFBDV1NUUiBrVGltZXJXaW5kb3dDbGFzc05hbWUgPSBM
IlRpbWVyV2luZG93Q2xhc3MiOworCitMUkVTVUxUIENBTExCQUNLIFRpbWVyV2luZG93V25kUHJv
YyhIV05EIGhXbmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkK
K3sKKyAgICBpbnQgZHVtbXk7CisgICAgSlNDOjpnX3N0YWNrQmFzZSA9ICZkdW1teTsKKworICAg
IGlmIChtZXNzYWdlID09IFdNX1RJTUVSKSB7CisgICAgICAgIGlmICh0aW1lcklEICE9IFRpbWVy
SWROb25lKQorICAgICAgICAgICAgc2hhcmVkVGltZXJGaXJlZEZ1bmN0aW9uKCk7CisgICAgfSBl
bHNlIGlmIChtZXNzYWdlID09IFdNX1VTRVIpICAgIHsKKyAgICAgICAgaWYgKHRpbWVySUQgPSBU
aW1lcklkTWFudWFsKSB7CisgICAgICAgICAgICBzaGFyZWRUaW1lckZpcmVkRnVuY3Rpb24oKTsK
KyAgICAgICAgICAgIFBvc3RNZXNzYWdlKGhXbmQsIFdNX1VTRVIsIDAsIDApOworICAgICAgICB9
CisgICAgfSBlbHNlIHsKKyAgICAgICAgSlNDOjpnX3N0YWNrQmFzZSA9IDA7CisgICAgICAgIHJl
dHVybiBEZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICB9
CisgICAgSlNDOjpnX3N0YWNrQmFzZSA9IDA7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2
b2lkIGluaXRpYWxpemVPZmZTY3JlZW5UaW1lcldpbmRvdygpCit7CisgICAgaWYgKHRpbWVyV2lu
ZG93SGFuZGxlKQorICAgICAgICByZXR1cm47CisKKyAgICBXTkRDTEFTUyB3Y2V4ID0gezB9Owor
ICAgIHdjZXgubHBmblduZFByb2MgICAgPSBUaW1lcldpbmRvd1duZFByb2M7CisgICAgd2NleC5o
SW5zdGFuY2UgICAgICA9IFBhZ2U6Omluc3RhbmNlSGFuZGxlKCk7CisgICAgd2NleC5scHN6Q2xh
c3NOYW1lICA9IGtUaW1lcldpbmRvd0NsYXNzTmFtZTsKKyAgICBSZWdpc3RlckNsYXNzKCZ3Y2V4
KTsKKworICAgIHRpbWVyV2luZG93SGFuZGxlID0gQ3JlYXRlV2luZG93KGtUaW1lcldpbmRvd0Ns
YXNzTmFtZSwgMCwgMCwKKyAgICAgICBDV19VU0VERUZBVUxULCAwLCBDV19VU0VERUZBVUxULCAw
LCBIV05EX01FU1NBR0UsIDAsIFBhZ2U6Omluc3RhbmNlSGFuZGxlKCksIDApOworfQorCit2b2lk
IHNldFNoYXJlZFRpbWVyRmlyZWRGdW5jdGlvbih2b2lkICgqZikoKSkKK3sKKyAgICBzaGFyZWRU
aW1lckZpcmVkRnVuY3Rpb24gPSBmOworfQorCisjZGVmaW5lIFVTRVJfVElNRVJfTUFYSU1VTSAg
MHg3RkZGRkZGRgorI2RlZmluZSBVU0VSX1RJTUVSX01JTklNVU0gIDB4MDAwMDAwMEEKKwordm9p
ZCBzZXRTaGFyZWRUaW1lckZpcmVUaW1lKGRvdWJsZSBmaXJlVGltZSkKK3sKKyAgICBBU1NFUlQo
c2hhcmVkVGltZXJGaXJlZEZ1bmN0aW9uKTsKKworICAgIGRvdWJsZSBpbnRlcnZhbCA9IChmaXJl
VGltZSAtIGN1cnJlbnRUaW1lKCkpICogMTAwMC47CisgICAgdW5zaWduZWQgaW50ZXJ2YWxJbk1T
ID0gaW50ZXJ2YWwgPCBVU0VSX1RJTUVSX01JTklNVU0KKyAgICAgICAgPyBVU0VSX1RJTUVSX01J
TklNVU0KKyAgICAgICAgOiBpbnRlcnZhbCA+IFVTRVJfVElNRVJfTUFYSU1VTQorICAgICAgICA/
IFVTRVJfVElNRVJfTUFYSU1VTQorICAgICAgICA6IHN0YXRpY19jYXN0PHVuc2lnbmVkPihpbnRl
cnZhbCk7CisKKyAgICBpZiAodGltZXJJRCA9PSBUaW1lcklkQXV0bykgeworICAgICAgICBLaWxs
VGltZXIodGltZXJXaW5kb3dIYW5kbGUsIFRpbWVySWRBdXRvKTsKKyAgICAgICAgdGltZXJJRCA9
IFRpbWVySWROb25lOworICAgIH0KKworICAgIGluaXRpYWxpemVPZmZTY3JlZW5UaW1lcldpbmRv
dygpOworICAgIGlmIChTZXRUaW1lcih0aW1lcldpbmRvd0hhbmRsZSwgVGltZXJJZEF1dG8sIGlu
dGVydmFsSW5NUywgMCkpCisgICAgICAgIHRpbWVySUQgPSBUaW1lcklkQXV0bzsKKyAgICBlbHNl
IGlmICh0aW1lcklEICE9IFRpbWVySWRNYW51YWwpCisgICAgICAgIFBvc3RNZXNzYWdlKHRpbWVy
V2luZG93SGFuZGxlLCBXTV9VU0VSLCAwLCAwKTsKK30KKwordm9pZCBzdG9wU2hhcmVkVGltZXIo
KQoreworICAgIGlmICh0aW1lcklEID09IFRpbWVySWRBdXRvKQorICAgICAgICBLaWxsVGltZXIo
dGltZXJXaW5kb3dIYW5kbGUsIFRpbWVySWRBdXRvKTsKKworICAgIHRpbWVySUQgPSBUaW1lcklk
Tm9uZTsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TeXN0ZW1U
aW1lV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TeXN0ZW1UaW1lV2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYjcwNWIKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1N5c3RlbVRpbWVXaW5jZS5jcHAKQEAgLTAs
MCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBBcHBsZSBDb21wdXRlciwgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNo
IE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTeXN0
ZW1UaW1lLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworZmxvYXQgdXNlcklkbGVUaW1lKCkKK3sKKyAgICByZXR1cm4gRkxUX01BWDsKK30KKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33829</attachid>
            <date>2009-07-30 13:33:11 -0700</date>
            <delta_ts>2009-08-08 10:47:36 -0700</delta_ts>
            <desc>7) KeygenWince</desc>
            <filename>27543_7.patch</filename>
            <type>text/plain</type>
            <size>4750</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvS2V5Z2VuV2luY2UuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9LZXlnZW5XaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uMDAzMzMzOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvS2V5Z2VuV2luY2UuY3BwCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIlNTTEtleUdlbmVyYXRvci5oIgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5j
bHVkZSAiQ1N0cmluZy5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNy
eXB0Lmg+CisKKyNkZWZpbmUgS0VZR0VOX0RFQlVHX0tFWSAgICAgICAgMHgwMDAwMDAwMQorCisj
aWZuZGVmIE5ERUJVRworI2RlZmluZSBLRVlHRU5fREVCVUcgICAgKDApCisjZWxzZQorI2RlZmlu
ZSBLRVlHRU5fREVCVUcgICAgMAorI2VuZGlmCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9p
ZCBXZWJDb3JlOjpnZXRTdXBwb3J0ZWRLZXlTaXplcyhWZWN0b3I8U3RyaW5nPiYgdikKK3sKKyAg
ICB2LmFwcGVuZCgiSGlnaCBHcmFkZSIpOworICAgIHYuYXBwZW5kKCJNZWRpdW0gR3JhZGUiKTsK
K30KKworU3RyaW5nIFdlYkNvcmU6OnNpZ25lZFB1YmxpY0tleUFuZENoYWxsZW5nZVN0cmluZyh1
bnNpZ25lZCBpbmRleCwgY29uc3QgU3RyaW5nJiBjaGFsbGVuZ2UsIGNvbnN0IEtVUkwmIHVybCkK
K3sKKyAgICBTdHJpbmcga2V5c3RyOworCisgICAgSENSWVBUUFJPViBoUHJvdiA9IDA7CisgICAg
SENSWVBUS0VZIGhLZXkgPSAwOworICAgIFBDRVJUX1BVQkxJQ19LRVlfSU5GTyBwUHViSW5mbyA9
IDA7CisgICAgRFdPUkQgZHdQdWJJbmZvTGVuZ3RoID0gMDsKKyAgICBDRVJUX0tFWUdFTl9SRVFV
RVNUX0lORk8gcmVxdWVzdEluZm87CisgICAgQ1JZUFRfQUxHT1JJVEhNX0lERU5USUZJRVIgc2ln
bkFsZ287CisgICAgTFBCWVRFIHBiRW5jb2RlZCA9IDA7CisgICAgRFdPUkQgZHdFbmNvZGVkTGVu
Z3RoID0gMDsKKyAgICBMUFdTVFIgcHN6U3RyaW5nID0gMDsKKyAgICBWZWN0b3I8Y2hhcj4gYmlu
YXJ5OworICAgIFZlY3RvcjxjaGFyPiBiYXNlNjQ7CisKKyNpZiBkZWZpbmVkKEtFWUdFTl9ERUJV
RykgJiYgKEtFWUdFTl9ERUJVRyAmIEtFWUdFTl9ERUJVR19LRVkpCisgICAgcHJpbnRmKCJXZWJD
b3JlOjpzaWduZWRQdWJsaWNLZXlBbmRDaGFsbGVuZ2VTdHJpbmcoJWQsICUuKnMpLlxuIiwgaW5k
ZXgsIGNoYWxsZW5nZS5sZW5ndGgoKSwgY2hhbGxlbmdlLmxhdGluMSgpLmRhdGEoKSk7CisjZW5k
aWYKKworICAgIC8vIFRyeSB0byBkZWxldGUgb2YgaXQgZXhpc3RzIGFscmVhZHkKKyAgICBDcnlw
dEFjcXVpcmVDb250ZXh0KCZoUHJvdiwgX1QoImtleWdlbl9jb250YWluZXIiKSwgTVNfRU5IQU5D
RURfUFJPViwgUFJPVl9SU0FfRlVMTCwgQ1JZUFRfREVMRVRFS0VZU0VUKTsKKworICAgIEJPT0wg
c3VjY2VzcyA9IENyeXB0QWNxdWlyZUNvbnRleHQoJmhQcm92LCBfVCgia2V5Z2VuX2NvbnRhaW5l
ciIpLCBNU19FTkhBTkNFRF9QUk9WLCBQUk9WX1JTQV9GVUxMLCBDUllQVF9ORVdLRVlTRVQpOwor
ICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHN1Y2Nlc3MgPSBD
cnlwdEdlbktleShoUHJvdiwgQVRfS0VZRVhDSEFOR0UsIDAsICZoS2V5KTsKKyAgICBpZiAoIXN1
Y2Nlc3MpCisgICAgICAgIGdvdG8gZXJyb3I7CisKKyAgICBzdWNjZXNzID0gQ3J5cHRFeHBvcnRQ
dWJsaWNLZXlJbmZvKGhQcm92LCBBVF9LRVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIDAs
ICZkd1B1YkluZm9MZW5ndGgpOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgZ290byBlcnJv
cjsKKworICAgIHBQdWJJbmZvID0gKFBDRVJUX1BVQkxJQ19LRVlfSU5GTykgbmV3IGNoYXJbZHdQ
dWJJbmZvTGVuZ3RoXTsKKyAgICBpZiAoIXBQdWJJbmZvKQorICAgICAgICBnb3RvIGVycm9yOwor
CisgICAgc3VjY2VzcyA9IENyeXB0RXhwb3J0UHVibGljS2V5SW5mbyhoUHJvdiwgQVRfS0VZRVhD
SEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBwUHViSW5mbywgJmR3UHViSW5mb0xlbmd0aCk7Cisg
ICAgaWYgKCFzdWNjZXNzKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgcmVxdWVzdEluZm8u
ZHdWZXJzaW9uID0gQ0VSVF9LRVlHRU5fUkVRVUVTVF9WMTsKKyAgICByZXF1ZXN0SW5mby5wd3N6
Q2hhbGxlbmdlU3RyaW5nID0gTCIiOworICAgIHJlcXVlc3RJbmZvLlN1YmplY3RQdWJsaWNLZXlJ
bmZvID0gKnBQdWJJbmZvOworCisgICAgaWYgKGNoYWxsZW5nZS5sZW5ndGgoKSkgeworICAgICAg
ICBwc3pTdHJpbmcgPSBuZXcgV0NIQVJbY2hhbGxlbmdlLmxlbmd0aCgpICsgMV07CisgICAgICAg
IGlmIChwc3pTdHJpbmcpIHsKKyAgICAgICAgICAgIHdjc25jcHkocHN6U3RyaW5nLCBjaGFsbGVu
Z2UuY2hhcmFjdGVycygpLCBjaGFsbGVuZ2UubGVuZ3RoKCkpOworICAgICAgICAgICAgcHN6U3Ry
aW5nW2NoYWxsZW5nZS5sZW5ndGgoKV0gPSAwOworICAgICAgICAgICAgcmVxdWVzdEluZm8ucHdz
ekNoYWxsZW5nZVN0cmluZyA9IHBzelN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNl
Y3VyZVplcm9NZW1vcnkoJnNpZ25BbGdvLCBzaXplb2YoQ1JZUFRfQUxHT1JJVEhNX0lERU5USUZJ
RVIpKTsKKyAgICBzaWduQWxnby5wc3pPYmpJZCA9IHN6T0lEX1JTQV9TSEExUlNBOworCisgICAg
c3VjY2VzcyA9IENyeXB0U2lnbkFuZEVuY29kZUNlcnRpZmljYXRlKGhQcm92LCBBVF9LRVlFWENI
QU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIFg1MDlfS0VZR0VOX1JFUVVFU1RfVE9fQkVfU0lHTkVE
LAorICAgICAgICAgICAgICAgICAgICAmcmVxdWVzdEluZm8sICZzaWduQWxnbywgMCwgMCwgJmR3
RW5jb2RlZExlbmd0aCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICBnb3RvIGVycm9yOwor
CisgICAgcGJFbmNvZGVkID0gKExQQllURSkgbmV3IGNoYXJbZHdFbmNvZGVkTGVuZ3RoXTsKKyAg
ICBpZiAoIXBiRW5jb2RlZCkKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHN1Y2Nlc3MgPSBD
cnlwdFNpZ25BbmRFbmNvZGVDZXJ0aWZpY2F0ZShoUHJvdiwgQVRfS0VZRVhDSEFOR0UsIFg1MDlf
QVNOX0VOQ09ESU5HLCBYNTA5X0tFWUdFTl9SRVFVRVNUX1RPX0JFX1NJR05FRCwKKyAgICAgICAg
ICAgICAgICAgICAgJnJlcXVlc3RJbmZvLCAmc2lnbkFsZ28sIDAsIHBiRW5jb2RlZCwgJmR3RW5j
b2RlZExlbmd0aCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICBnb3RvIGVycm9yOworCisg
ICAgYmluYXJ5LnJlc2l6ZShkd0VuY29kZWRMZW5ndGgpOworICAgIGZvciAoRFdPUkQgaSA9IDA7
IGkgPCBkd0VuY29kZWRMZW5ndGg7ICsraSkKKyAgICAgICAgYmluYXJ5W2ldID0gcGJFbmNvZGVk
W2ldOworCisgICAgYmFzZTY0RW5jb2RlKGJpbmFyeSwgYmFzZTY0KTsKKyAgICBpZiAoYmFzZTY0
LnNpemUoKSkgeworICAgICAgICBTdHJpbmcgdGVtcHN0cihiYXNlNjQuZGF0YSgpLCBiYXNlNjQu
c2l6ZSgpKTsKKyAgICAgICAga2V5c3RyLmluc2VydCh0ZW1wc3RyLCAwKTsKKyAgICB9CisKK2Vy
cm9yOgorICAgIGlmIChwc3pTdHJpbmcpCisgICAgICAgIGRlbGV0ZVtdIHBzelN0cmluZzsKKyAg
ICBpZiAocGJFbmNvZGVkKQorICAgICAgICBkZWxldGVbXSBwYkVuY29kZWQ7CisgICAgaWYgKHBQ
dWJJbmZvKQorICAgICAgICBkZWxldGVbXSBwUHViSW5mbzsKKyAgICBpZiAoaEtleSkKKyAgICAg
ICAgQ3J5cHREZXN0cm95S2V5KGhLZXkpOworICAgIGlmIChoUHJvdikKKyAgICAgICAgQ3J5cHRS
ZWxlYXNlQ29udGV4dChoUHJvdiwgMCk7CisKKyAgICByZXR1cm4ga2V5c3RyOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>33830</attachid>
            <date>2009-07-30 13:33:39 -0700</date>
            <delta_ts>2009-08-08 10:47:36 -0700</delta_ts>
            <desc>8) Other</desc>
            <filename>27543_8.patch</filename>
            <type>text/plain</type>
            <size>41021</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ3Vyc29yV2luY2UuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uZTM1ZjFmOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvQ3Vyc29yV2luY2UuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkN1cnNvci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVjdCBBbGxD
dXJzb3JzIHsKKyAgICBBbGxDdXJzb3JzKCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgTnVtQ3Vyc29yVHlwZXM7ICsraSkKKyAgICAgICAgICAgIG1fY3Vyc29yc1tpXSA9IChD
dXJzb3JUeXBlKSBpOworICAgIH0KKyAgICBDdXJzb3IgbV9jdXJzb3JzW051bUN1cnNvclR5cGVz
XTsKK307CisKK3N0YXRpYyBjb25zdCBDdXJzb3ImIGdldEN1cnNvcihDdXJzb3JUeXBlIHR5cGUp
Cit7CisgICAgc3RhdGljIEFsbEN1cnNvcnMgYWxsQ3Vyc29yczsKKyAgICByZXR1cm4gYWxsQ3Vy
c29ycy5tX2N1cnNvcnNbdHlwZV07Cit9CisKK0N1cnNvcjo6Q3Vyc29yKGNvbnN0IEN1cnNvciYg
b3RoZXIpCis6IG1faW1wbChvdGhlci5tX2ltcGwpCit7Cit9CisKK0N1cnNvcjo6Q3Vyc29yKElt
YWdlKiBpbWcsIGNvbnN0IEludFBvaW50JiBob3RzcG90KQorOiBtX2ltcGwoQ3Vyc29yTm9uZSkK
K3sKK30KKworQ3Vyc29yOjp+Q3Vyc29yKCkKK3sKK30KKworQ3Vyc29yJiBDdXJzb3I6Om9wZXJh
dG9yPShjb25zdCBDdXJzb3ImIG90aGVyKQoreworICAgIG1faW1wbCA9IG90aGVyLm1faW1wbDsK
KyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0N1cnNvcjo6Q3Vyc29yKFBsYXRmb3JtQ3Vyc29yIGMp
Cis6IG1faW1wbChjKQoreworfQorCitjb25zdCBDdXJzb3ImIG5vbmVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yTm9uZSk7IH0KK2NvbnN0IEN1cnNvciYgcG9pbnRlckN1cnNvcigp
IHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JQb2ludGVyKTsgfQorY29uc3QgQ3Vyc29yJiBjcm9z
c0N1cnNvcigpICB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ3Jvc3MpOyB9Citjb25zdCBDdXJz
b3ImIGhhbmRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29ySGFuZCk7IH0KK2NvbnN0
IEN1cnNvciYgaUJlYW1DdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQmVhbSk7IH0K
K2NvbnN0IEN1cnNvciYgd2FpdEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JXYWl0
KTsgfQorY29uc3QgQ3Vyc29yJiBoZWxwQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNv
ckhlbHApOyB9Citjb25zdCBDdXJzb3ImIG1vdmVDdXJzb3IoKSAgeyByZXR1cm4gZ2V0Q3Vyc29y
KEN1cnNvck1vdmUpOyB9Citjb25zdCBDdXJzb3ImIGVhc3RSZXNpemVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yRWFzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhSZXNp
emVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhSZXNpemUpOyB9Citjb25z
dCBDdXJzb3ImIG5vcnRoRWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JOb3J0aEVhc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoV2VzdFJlc2l6ZUN1cnNv
cigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFdlc3RSZXNpemUpOyB9Citjb25zdCBD
dXJzb3ImIHNvdXRoUmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclNvdXRo
UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aEVhc3RSZXNpemVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yU291dGhFYXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0
aFdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yU291dGhXZXN0UmVz
aXplKTsgfQorY29uc3QgQ3Vyc29yJiB3ZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vy
c29yKEN1cnNvcldlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoU291dGhSZXNpemVD
dXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhTb3V0aFJlc2l6ZSk7IH0KK2Nv
bnN0IEN1cnNvciYgZWFzdFdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vy
c29yRWFzdFdlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoRWFzdFNvdXRoV2VzdFJl
c2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aEVhc3RTb3V0aFdlc3RS
ZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoV2VzdFNvdXRoRWFzdFJlc2l6ZUN1cnNvcigp
IHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFdlc3RTb3V0aEVhc3RSZXNpemUpOyB9Citj
b25zdCBDdXJzb3ImIGNvbHVtblJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JDb2x1bW5SZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHJvd1Jlc2l6ZUN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JSb3dSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHZlcnRpY2Fs
VGV4dEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JWZXJ0aWNhbFRleHQpOyB9Citj
b25zdCBDdXJzb3ImIGNlbGxDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ2VsbCk7
IH0KK2NvbnN0IEN1cnNvciYgY29udGV4dE1lbnVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3Io
Q3Vyc29yQ29udGV4dE1lbnUpOyB9Citjb25zdCBDdXJzb3ImIG5vRHJvcEN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JOb0Ryb3ApOyB9Citjb25zdCBDdXJzb3ImIG5vdEFsbG93ZWRD
dXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm90QWxsb3dlZCk7IH0KK2NvbnN0IEN1
cnNvciYgcHJvZ3Jlc3NDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yUHJvZ3Jlc3Mp
OyB9Citjb25zdCBDdXJzb3ImIGFsaWFzQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNv
ckFsaWFzKTsgfQorY29uc3QgQ3Vyc29yJiB6b29tSW5DdXJzb3IoKSB7IHJldHVybiBnZXRDdXJz
b3IoQ3Vyc29yWm9vbUluKTsgfQorY29uc3QgQ3Vyc29yJiB6b29tT3V0Q3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvclpvb21PdXQpOyB9Citjb25zdCBDdXJzb3ImIGNvcHlDdXJzb3Io
KSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ29weSk7IH0KK2NvbnN0IEN1cnNvciYgbWlkZGxl
UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYg
ZWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJz
b3ImIG5vcnRoUGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0
IEN1cnNvciYgbm9ydGhFYXN0UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7
IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhXZXN0UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3Nz
Q3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4g
Y3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aEVhc3RQYW5uaW5nQ3Vyc29yKCkg
eyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aFdlc3RQYW5uaW5n
Q3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiB3ZXN0UGFu
bmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgZ3Jh
YmJpbmdDdXJzb3IoKSB7IHJldHVybiBtb3ZlQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgZ3Jh
YkN1cnNvcigpIHsgcmV0dXJuIG1vdmVDdXJzb3IoKTsgfQorCit9CmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdEYXRhV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9EcmFnRGF0YVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li44ODFkN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFn
RGF0YVdpbmNlLmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAw
Ny0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
ICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
ICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkRyYWdEYXRhLmgiCisKKyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKKyNp
bmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzUmVmUHRyPENsaXBib2FyZD4gRHJhZ0RhdGE6
OmNyZWF0ZUNsaXBib2FyZChDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5KSBjb25zdAorewor
ICAgIHJldHVybiAwOworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc1VSTCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgRHJhZ0RhdGE6OmFzVVJMKFN0cmluZyog
dGl0bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitib29sIERyYWdEYXRh
Ojpjb250YWluc0ZpbGVzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQg
RHJhZ0RhdGE6OmFzRmlsZW5hbWVzKFZlY3RvcjxTdHJpbmc+JikgY29uc3QKK3sKK30KKworYm9v
bCBEcmFnRGF0YTo6Y29udGFpbnNQbGFpblRleHQoKSBjb25zdAoreworICAgIHJldHVybiBmYWxz
ZTsKK30KKworU3RyaW5nIERyYWdEYXRhOjphc1BsYWluVGV4dCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIFN0cmluZygpOworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc0NvbG9yKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRHJhZ0RhdGE6OmNhblNtYXJ0UmVwbGFj
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERyYWdEYXRhOjpjb250
YWluc0NvbXBhdGlibGVDb250ZW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K1Bhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gRHJhZ0RhdGE6OmFzRnJhZ21lbnQoRG9jdW1l
bnQqIGRvYykgY29uc3QKK3sKKyAgICAgcmV0dXJuIDA7Cit9CisKK0NvbG9yIERyYWdEYXRhOjph
c0NvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gQ29sb3IoKTsKK30KKworfQorCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbmNlLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjRkNjBmODAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0RyYWdJbWFnZVdpbmNlLmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorICogIENvcHly
aWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2Fj
aGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFn
ZS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0lu
dFNpemUgZHJhZ0ltYWdlU2l6ZShEcmFnSW1hZ2VSZWYpCit7CisgICAgcmV0dXJuIEludFNpemUo
MCwgMCk7Cit9CisKK3ZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSkKK3sK
KyAgICBpZiAoaW1hZ2UpCisgICAgICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKK30KKworRHJh
Z0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiwgRmxvYXRTaXplKQoreworICAg
IHJldHVybiAwOworfQorCitEcmFnSW1hZ2VSZWYgZGlzc29sdmVEcmFnSW1hZ2VUb0ZyYWN0aW9u
KERyYWdJbWFnZVJlZiBpbWFnZSwgZmxvYXQpCit7CisgICAgcmV0dXJuIGltYWdlOworfQorCitE
cmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKEltYWdlKikKK3sKKyAgICByZXR1
cm4gMDsKK30KKworRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFn
ZShDYWNoZWRJbWFnZSopCit7CisgICAgcmV0dXJuIDA7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvRWRpdG9yV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9FZGl0b3JXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
MDJhZjc4MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRWRpdG9y
V2luY2UuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIw
MDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisKKyNpbmNsdWRlICJFZGl0b3IuaCIKKworI2luY2x1ZGUgIkNsaXBib2FyZFdpbmNlLmgiCisj
aW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKKyNpbmNsdWRl
ICJFbGVtZW50LmgiCisjaW5jbHVkZSAiSHRtbEVkaXRpbmcuaCIKKyNpbmNsdWRlICJUZXh0SXRl
cmF0b3IuaCIKKyNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dz
Lmg+CisjZGVmaW5lIF9TWVNfR1VJRF9PUEVSQVRPUlNfCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworUGFzc1JlZlB0cjxDbGlwYm9hcmQ+IEVkaXRvcjo6bmV3R2VuZXJhbENsaXBib2FyZChDbGlw
Ym9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5KQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xp
cGJvYXJkV2luY2UocG9saWN5LCBmYWxzZSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2luY2UuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M5OWIxCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNwcApAQCAtMCwwICsxLDYwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRmlsZUNob29zZXIuaCIKKwor
I2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgorI2luY2x1ZGUg
IkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJJY29uLmgiCisjaW5j
bHVkZSAiTG9jYWxpemVkU3RyaW5ncy5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJT
dHJpbmdUcnVuY2F0b3IuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitTdHJpbmcgcGF0aEdl
dEZpbGVOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCk7CisKK1N0cmluZyBGaWxlQ2hvb3Nlcjo6YmFz
ZW5hbWVGb3JXaWR0aChjb25zdCBGb250JiBmb250LCBpbnQgd2lkdGgpIGNvbnN0Cit7CisgICAg
aWYgKHdpZHRoIDw9IDApCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIFN0cmluZyBz
dHJpbmc7CisgICAgaWYgKG1fZmlsZW5hbWVzLmlzRW1wdHkoKSkKKyAgICAgICAgc3RyaW5nID0g
ZmlsZUJ1dHRvbk5vRmlsZVNlbGVjdGVkTGFiZWwoKTsKKyAgICBlbHNlIGlmIChtX2ZpbGVuYW1l
cy5zaXplKCkgPT0gMSkgeworICAgICAgICBTdHJpbmcgdG1wRmlsZW5hbWUgPSBtX2ZpbGVuYW1l
c1swXTsKKyAgICAgICAgc3RyaW5nID0gcGF0aEdldEZpbGVOYW1lKHRtcEZpbGVuYW1lKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVuY2F0ZShT
dHJpbmc6Om51bWJlcihtX2ZpbGVuYW1lcy5zaXplKCkpICsgIiBmaWxlcyIsIHdpZHRoLCBmb250
LCBmYWxzZSk7CisKKyAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShz
dHJpbmcsIHdpZHRoLCBmb250LCBmYWxzZSk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvRmlsZVN5c3RlbVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvRmlsZVN5c3RlbVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li4yYmI0ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxl
U3lzdGVtV2luY2UuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAw
OCBDb2xsYWJvcmEsIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJGaWxlU3lzdGVtLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5jcnlw
dC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBib29sIGdldEZpbGVJbmZvKGNv
bnN0IFN0cmluZyYgcGF0aCwgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04mIGZpbGVJbmZvKQor
eworICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7CisgICAgSEFORExFIGhGaWxlID0gQ3JlYXRl
RmlsZShmaWxlbmFtZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBHRU5FUklDX1JF
QUQsIEZJTEVfU0hBUkVfUkVBRCwgMAorICAgICAgICAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxB
R19OT19CVUZGRVJJTkcsIDApOworCisgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZB
TFVFKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIHJ0biA9IEdldEZpbGVJbmZv
cm1hdGlvbkJ5SGFuZGxlKGhGaWxlLCAmZmlsZUluZm8pID8gdHJ1ZSA6IGZhbHNlOworCisgICAg
Q2xvc2VIYW5kbGUoaEZpbGUpOworICAgIHJldHVybiBydG47Cit9CisKK2Jvb2wgZ2V0RmlsZVNp
emUoY29uc3QgU3RyaW5nJiBwYXRoLCBsb25nIGxvbmcmIHJlc3VsdCkKK3sKKyAgICBCWV9IQU5E
TEVfRklMRV9JTkZPUk1BVElPTiBmaWxlSW5mb3JtYXRpb247CisgICAgaWYgKCFnZXRGaWxlSW5m
byhwYXRoLCBmaWxlSW5mb3JtYXRpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBV
TEFSR0VfSU5URUdFUiBmaWxlU2l6ZTsKKyAgICBmaWxlU2l6ZS5Mb3dQYXJ0ID0gZmlsZUluZm9y
bWF0aW9uLm5GaWxlU2l6ZUxvdzsKKyAgICBmaWxlU2l6ZS5IaWdoUGFydCA9IGZpbGVJbmZvcm1h
dGlvbi5uRmlsZVNpemVIaWdoOworCisgICAgcmVzdWx0ID0gZmlsZVNpemUuUXVhZFBhcnQ7CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShjb25z
dCBTdHJpbmcmIHBhdGgsIHRpbWVfdCYgcmVzdWx0KQoreworICAgIEJZX0hBTkRMRV9GSUxFX0lO
Rk9STUFUSU9OIGZpbGVJbmZvcm1hdGlvbjsKKyAgICBpZiAoIWdldEZpbGVJbmZvKHBhdGgsIGZp
bGVJbmZvcm1hdGlvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFVMQVJHRV9JTlRF
R0VSIHQ7CisgICAgbWVtY3B5KCZ0LCAmZmlsZUluZm9ybWF0aW9uLmZ0TGFzdFdyaXRlVGltZSwg
c2l6ZW9mKHQpKTsKKyAgICAKKyAgICByZXN1bHQgPSB0LlF1YWRQYXJ0ICogMC4wMDAwMDAxIC0g
MTE2NDQ0NzM2MDAuMDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGZpbGVFeGlzdHMo
Y29uc3QgU3RyaW5nJiBwYXRoKSAKK3sKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAg
IEhBTkRMRSBoRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVy
bWluYXRpb24oKSwgMCwgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURQorICAgICAg
ICAsIDAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxBR19OT19CVUZGRVJJTkcsIDApOworCisgICAg
Q2xvc2VIYW5kbGUoaEZpbGUpOworCisgICAgcmV0dXJuIGhGaWxlICE9IElOVkFMSURfSEFORExF
X1ZBTFVFOworfQorCitib29sIGRlbGV0ZUZpbGUoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAg
IFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7CisgICAgcmV0dXJuICEhRGVsZXRlRmlsZVcoZmlsZW5h
bWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7Cit9CisKKworYm9vbCBkZWxldGVF
bXB0eURpcmVjdG9yeShjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgU3RyaW5nIGZpbGVuYW1l
ID0gcGF0aDsKKyAgICByZXR1cm4gISFSZW1vdmVEaXJlY3RvcnlXKGZpbGVuYW1lLmNoYXJhY3Rl
cnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworfQorCitTdHJpbmcgcGF0aEJ5QXBwZW5kaW5nQ29t
cG9uZW50KGNvbnN0IFN0cmluZyYgcGF0aCwgY29uc3QgU3RyaW5nJiBjb21wb25lbnQpCit7Cisg
ICAgaWYgKGNvbXBvbmVudC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBwYXRoOworCisgICAg
VmVjdG9yPFVDaGFyLCBNQVhfUEFUSD4gYnVmZmVyOworCisgICAgYnVmZmVyLmFwcGVuZChwYXRo
LmNoYXJhY3RlcnMoKSwgcGF0aC5sZW5ndGgoKSk7CisKKyAgICBpZiAoYnVmZmVyLmxhc3QoKSAh
PSBMJ1xcJyAmJiBidWZmZXIubGFzdCgpICE9IEwnLycKKyAgICAgICAgJiYgY29tcG9uZW50WzBd
ICE9IEwnXFwnICYmIGNvbXBvbmVudFswXSAhPSBMJy8nKQorICAgICAgICBidWZmZXIuYXBwZW5k
KEwnXFwnKTsKKworICAgIGJ1ZmZlci5hcHBlbmQoY29tcG9uZW50LmNoYXJhY3RlcnMoKSwgY29t
cG9uZW50Lmxlbmd0aCgpKTsKKworICAgIHJldHVybiBTdHJpbmcoYnVmZmVyLmRhdGEoKSwgYnVm
ZmVyLnNpemUoKSk7Cit9CisKK0NTdHJpbmcgZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKGNvbnN0
IFN0cmluZyYpCit7CisgICAgcmV0dXJuICIiOworfQorCitib29sIG1ha2VBbGxEaXJlY3Rvcmll
cyhjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgaW50IGxhc3REaXZQb3MgPSBtYXgocGF0aC5y
ZXZlcnNlRmluZCgnLycpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcpKTsKKyAgICBpbnQgZW5kUG9z
ID0gcGF0aC5sZW5ndGgoKTsKKyAgICBpZiAobGFzdERpdlBvcyA9PSBwYXRoLmxlbmd0aCgpIC0g
MSkgeworICAgICAgICBlbmRQb3MgLT0gMTsKKyAgICAgICAgbGFzdERpdlBvcyA9IG1heChwYXRo
LnJldmVyc2VGaW5kKCcvJywgbGFzdERpdlBvcyksIHBhdGgucmV2ZXJzZUZpbmQoJ1xcJywgbGFz
dERpdlBvcykpOworICAgIH0KKworICAgIGlmIChsYXN0RGl2UG9zID4gMCkgeworICAgICAgICBp
ZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhwYXRoLnN1YnN0cmluZygwLCBsYXN0RGl2UG9zKSkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nIGZvbGRlcihwYXRo
LnN1YnN0cmluZygwLCBlbmRQb3MpKTsKKyAgICBDcmVhdGVEaXJlY3RvcnkoZm9sZGVyLmNoYXJh
Y3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIDApOworCisgICAgRFdPUkQgZmlsZUF0dHIgPSBH
ZXRGaWxlQXR0cmlidXRlcyhmb2xkZXIuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7
CisgICAgcmV0dXJuIGZpbGVBdHRyICE9IDB4RkZGRkZGRkYgJiYgKGZpbGVBdHRyICYgRklMRV9B
VFRSSUJVVEVfRElSRUNUT1JZKTsKK30KKworU3RyaW5nIGhvbWVEaXJlY3RvcnlQYXRoKCkKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAiIjsKK30KKworU3RyaW5nIHBhdGhH
ZXRGaWxlTmFtZShjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgcmV0dXJuIHBhdGguc3Vic3Ry
aW5nKG1heChwYXRoLnJldmVyc2VGaW5kKCcvJyksIHBhdGgucmV2ZXJzZUZpbmQoJ1xcJykpICsg
MSk7Cit9CisKK1N0cmluZyBkaXJlY3RvcnlOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworQ1N0cmluZyBv
cGVuVGVtcG9yYXJ5RmlsZShjb25zdCBjaGFyKiwgUGxhdGZvcm1GaWxlSGFuZGxlJiBoYW5kbGUp
Cit7CisgICAgaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgICB3Y2hhcl90IHRl
bXBQYXRoW01BWF9QQVRIXTsKKyAgICBpbnQgdGVtcFBhdGhMZW5ndGggPSA6OkdldFRlbXBQYXRo
KF9jb3VudG9mKHRlbXBQYXRoKSwgdGVtcFBhdGgpOworICAgIGlmICh0ZW1wUGF0aExlbmd0aCA8
PSAwIHx8IHRlbXBQYXRoTGVuZ3RoID4gX2NvdW50b2YodGVtcFBhdGgpKQorICAgICAgICByZXR1
cm4gQ1N0cmluZygpOworCisgICAgSENSWVBUUFJPViBoQ3J5cHRQcm92ID0gMDsKKyAgICBpZiAo
IUNyeXB0QWNxdWlyZUNvbnRleHQoJmhDcnlwdFByb3YsIDAsIDAsIFBST1ZfUlNBX0ZVTEwsIENS
WVBUX1ZFUklGWUNPTlRFWFQpKQorICAgICAgICByZXR1cm4gQ1N0cmluZygpOworCisgICAgU3Ry
aW5nIHByb3Bvc2VkUGF0aDsKKyAgICB3aGlsZSAoMSkgeworCisgICAgICAgIHdjaGFyX3QgdGVt
cEZpbGVbXSA9IEwiWFhYWFhYWFgudG1wIjsgLy8gVXNlIDguMyBzdHlsZSBuYW1lIChtb3JlIGNo
YXJhY3RlcnMgYXJlbid0IGhlbHBmdWwgZHVlIHRvIDguMyBzaG9ydCBmaWxlIG5hbWVzKQorICAg
ICAgICBjb25zdCBpbnQgcmFuZG9tUGFydExlbmd0aCA9IDg7CisgICAgICAgIGlmICghQ3J5cHRH
ZW5SYW5kb20oaENyeXB0UHJvdiwgcmFuZG9tUGFydExlbmd0aCAqIDIsIHJlaW50ZXJwcmV0X2Nh
c3Q8QllURSo+KHRlbXBGaWxlKSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBM
aW1pdCB0byB2YWxpZCBmaWxlc3lzdGVtIGNoYXJhY3RlcnMsIGFsc28gZXhjbHVkaW5nIG90aGVy
cyB0aGF0IGNvdWxkIGJlIHByb2JsZW1hdGljLCBsaWtlIHB1bmN0dWF0aW9uLgorICAgICAgICAv
LyBkb24ndCBpbmNsdWRlIGJvdGggdXBwZXIgYW5kIGxvd2VyY2FzZSBzaW5jZSBXaW5kb3dzIGZp
bGUgc3lzdGVtcyBhcmUgdHlwaWNhbGx5IG5vdCBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgICAgY29u
c3QgY2hhciB2YWxpZENoYXJzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3
eHl6IjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kb21QYXJ0TGVuZ3RoOyArK2kp
CisgICAgICAgICAgICB0ZW1wRmlsZVtpXSA9IHZhbGlkQ2hhcnNbdGVtcEZpbGVbaV0gJSAoc2l6
ZW9mKHZhbGlkQ2hhcnMpIC0gMSldOworCisgICAgICAgIEFTU0VSVCh3Y3NsZW4odGVtcEZpbGUp
ICogMiA9PSBzaXplb2YodGVtcEZpbGUpIC0gMik7CisKKyAgICAgICAgcHJvcG9zZWRQYXRoID0g
cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KFN0cmluZyh0ZW1wUGF0aCksIFN0cmluZyh0ZW1wRmls
ZSkpOworCisgICAgICAgIC8vIHVzZSBDUkVBVEVfTkVXIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGFu
IGV4aXN0aW5nIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lCisgICAgICAgIGhhbmRsZSA9IENyZWF0
ZUZpbGUocHJvcG9zZWRQYXRoLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIEdFTkVS
SUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsIDAsIDAsIENSRUFURV9ORVcsIEZJTEVfQVRUUklCVVRF
X05PUk1BTCwgMCk7CisgICAgICAgIGlmICghaXNIYW5kbGVWYWxpZChoYW5kbGUpICYmIEdldExh
c3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQ3J5cHRSZWxlYXNlQ29udGV4dChoQ3J5
cHRQcm92LCAwKTsKKworICAgIGlmICghaXNIYW5kbGVWYWxpZChoYW5kbGUpKQorICAgICAgICBy
ZXR1cm4gQ1N0cmluZygpOworCisgICAgcmV0dXJuIHByb3Bvc2VkUGF0aC5sYXRpbjEoKTsKK30K
Kwordm9pZCBjbG9zZUZpbGUoUGxhdGZvcm1GaWxlSGFuZGxlJiBoYW5kbGUpCit7CisgICAgaWYg
KGlzSGFuZGxlVmFsaWQoaGFuZGxlKSkgeworICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZSk7
CisgICAgICAgIGhhbmRsZSA9IGludmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGU7CisgICAgfQorfQor
CitpbnQgd3JpdGVUb0ZpbGUoUGxhdGZvcm1GaWxlSGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciog
ZGF0YSwgaW50IGxlbmd0aCkKK3sKKyAgICBpZiAoIWlzSGFuZGxlVmFsaWQoaGFuZGxlKSkKKyAg
ICAgICAgcmV0dXJuIC0xOworCisgICAgRFdPUkQgYnl0ZXNXcml0dGVuOworICAgIGJvb2wgc3Vj
Y2VzcyA9IFdyaXRlRmlsZShoYW5kbGUsIGRhdGEsIGxlbmd0aCwgJmJ5dGVzV3JpdHRlbiwgMCk7
CisKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8aW50PihieXRlc1dyaXR0ZW4pOworfQorCitib29sIHVubG9hZE1vZHVsZShQbGF0
Zm9ybU1vZHVsZSBtb2R1bGUpCit7CisgICAgcmV0dXJuIDo6RnJlZUxpYnJhcnkobW9kdWxlKTsK
K30KKworU3RyaW5nIGxvY2FsVXNlclNwZWNpZmljU3RvcmFnZURpcmVjdG9yeSgpCit7CisgICAg
cmV0dXJuIFN0cmluZyhMIlxcIik7Cit9CisKK1N0cmluZyByb2FtaW5nVXNlclNwZWNpZmljU3Rv
cmFnZURpcmVjdG9yeSgpCit7CisgICAgcmV0dXJuIFN0cmluZyhMIlxcIik7Cit9CisKK1ZlY3Rv
cjxTdHJpbmc+IGxpc3REaXJlY3RvcnkoY29uc3QgU3RyaW5nJiBwYXRoLCBjb25zdCBTdHJpbmcm
IGZpbHRlcikKK3sKKyAgICBWZWN0b3I8U3RyaW5nPiBlbnRyaWVzOworCisgICAgVmVjdG9yPFVD
aGFyLCAyNTY+IHBhdHRlcm47CisgICAgcGF0dGVybi5hcHBlbmQocGF0aC5jaGFyYWN0ZXJzKCks
IHBhdGgubGVuZ3RoKCkpOworICAgIGlmIChwYXR0ZXJuLmxhc3QoKSAhPSBMJy8nICYmIHBhdHRl
cm4ubGFzdCgpICE9IEwnXFwnKQorICAgICAgICBwYXR0ZXJuLmFwcGVuZChMJ1xcJyk7CisKKyAg
ICBTdHJpbmcgcm9vdChwYXR0ZXJuLmRhdGEoKSwgcGF0dGVybi5zaXplKCkpOworICAgIHBhdHRl
cm4uYXBwZW5kKGZpbHRlci5jaGFyYWN0ZXJzKCksIGZpbHRlci5sZW5ndGgoKSk7CisgICAgcGF0
dGVybi5hcHBlbmQoMCk7CisKKyAgICBXSU4zMl9GSU5EX0RBVEEgZmluZERhdGE7CisgICAgSEFO
RExFIGhGaW5kID0gRmluZEZpcnN0RmlsZShwYXR0ZXJuLmRhdGEoKSwgJmZpbmREYXRhKTsKKyAg
ICBpZiAoSU5WQUxJRF9IQU5ETEVfVkFMVUUgIT0gaEZpbmQpIHsKKyAgICAgICAgZG8geworICAg
ICAgICAgICAgLy8gRklYRU1FOiBzaG91bGQgd2UgYWxzbyBhZGQgdGhlIGZvbGRlcnM/IFRoaXMg
ZnVuY3Rpb24KKyAgICAgICAgICAgIC8vIGlzIHNvIGZhciBvbmx5IGNhbGxlZCBieSBQbHVnaW5E
YXRhYmFzZS5jcHAgdG8gbGlzdAorICAgICAgICAgICAgLy8gYWxsIHBsdWdpbnMgaW4gYSBmb2xk
ZXIsIHdoZXJlIGl0J3Mgbm90IHN1cHBvc2VkIHRvIGxpc3Qgc3ViLWZvbGRlcnMuCisgICAgICAg
ICAgICBpZiAoIShmaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElS
RUNUT1JZKSkKKyAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChyb290ICsgZmluZERhdGEu
Y0ZpbGVOYW1lKTsKKyAgICAgICAgfSB3aGlsZSAoRmluZE5leHRGaWxlKGhGaW5kLCAmZmluZERh
dGEpKTsKKyAgICAgICAgRmluZENsb3NlKGhGaW5kKTsKKyAgICB9CisKKyAgICByZXR1cm4gZW50
cmllczsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2lu
Y2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2luY2UuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTFlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiS1VSTC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1N0cmluZyBLVVJM
OjpmaWxlU3lzdGVtUGF0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhdGgoKTsKK30KKworfQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2Uu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2UuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2RlNDgKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL01JTUVUeXBlUmVnaXN0cnlXaW5jZS5jcHAKQEAg
LTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNSU1F
VHlwZVJlZ2lzdHJ5LmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2lucmVn
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIFN0cmluZyBtaW1lVHlwZUZvckV4
dGVuc2lvbihjb25zdCBTdHJpbmcmIGV4dGVuc2lvbikKK3sKKyAgICBTdHJpbmcgZXh0ID0gIi4i
ICsgZXh0ZW5zaW9uOworICAgIFdDSEFSIGNvbnRlbnRUeXBlU3RyWzI1Nl07CisgICAgRFdPUkQg
Y29udGVudFR5cGVTdHJMZW4gPSBzaXplb2YoY29udGVudFR5cGVTdHIpOworICAgIERXT1JEIHZh
bHVlVHlwZTsKKworICAgIEhLRVkga2V5OworICAgIFN0cmluZyByZXN1bHQ7CisgICAgaWYgKEVS
Uk9SX1NVQ0NFU1MgIT0gUmVnT3BlbktleUV4KEhLRVlfQ0xBU1NFU19ST09ULCBleHQuY2hhcmFj
dGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgMCwgMCwgJmtleSkpCisgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisKKyAgICBpZiAoRVJST1JfU1VDQ0VTUyA9PSBSZWdRdWVyeVZhbHVlRXgoa2V5LCBM
IkNvbnRlbnQgVHlwZSIsIDAsICZ2YWx1ZVR5cGUsIChMUEJZVEUpY29udGVudFR5cGVTdHIsICZj
b250ZW50VHlwZVN0ckxlbikgJiYgdmFsdWVUeXBlID09IFJFR19TWikKKyAgICAgICAgcmVzdWx0
ID0gU3RyaW5nKGNvbnRlbnRUeXBlU3RyLCBjb250ZW50VHlwZVN0ckxlbiAvIHNpemVvZihjb250
ZW50VHlwZVN0clswXSkgLSAxKTsKKworICAgIFJlZ0Nsb3NlS2V5KGtleSk7CisKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCitzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWltZXR5cGVN
YXA7CisKK3N0YXRpYyB2b2lkIGluaXRNSU1FVHlwZUVudGVuc2lvbk1hcCgpCit7CisgICAgaWYg
KG1pbWV0eXBlTWFwLmlzRW1wdHkoKSkgeworICAgICAgICAvL2ZpbGwgd2l0aCBpbml0aWFsIHZh
bHVlcworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInR4dCIsICJ0ZXh0L3BsYWluIik7CisgICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgicGRmIiwgImFwcGxpY2F0aW9uL3BkZiIpOworICAgICAgICBt
aW1ldHlwZU1hcC5hZGQoInBzIiwgImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQiKTsKKyAgICAgICAg
bWltZXR5cGVNYXAuYWRkKCJodG1sIiwgInRleHQvaHRtbCIpOworICAgICAgICBtaW1ldHlwZU1h
cC5hZGQoImh0bSIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ4bWwi
LCAidGV4dC94bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ4c2wiLCAidGV4dC94c2wi
KTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJqcyIsICJhcHBsaWNhdGlvbi94LWphdmFzY3Jp
cHQiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ4aHRtbCIsICJhcHBsaWNhdGlvbi94aHRt
bCt4bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJyc3MiLCAiYXBwbGljYXRpb24vcnNz
K3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoIndlYmFyY2hpdmUiLCAiYXBwbGljYXRp
b24veC13ZWJhcmNoaXZlIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgic3ZnIiwgImltYWdl
L3N2Zyt4bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJzdmd6IiwgImltYWdlL3N2Zyt4
bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJqcGciLCAiaW1hZ2UvanBlZyIpOworICAg
ICAgICBtaW1ldHlwZU1hcC5hZGQoImpwZWciLCAiaW1hZ2UvanBlZyIpOworICAgICAgICBtaW1l
dHlwZU1hcC5hZGQoInBuZyIsICJpbWFnZS9wbmciKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRk
KCJ0aWYiLCAiaW1hZ2UvdGlmZiIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInRpZmYiLCAi
aW1hZ2UvdGlmZiIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImljbyIsICJpbWFnZS9pY28i
KTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJjdXIiLCAiaW1hZ2UvaWNvIik7CisgICAgICAg
IG1pbWV0eXBlTWFwLmFkZCgiYm1wIiwgImltYWdlL2JtcCIpOworICAgICAgICBtaW1ldHlwZU1h
cC5hZGQoImNzcyIsICJ0ZXh0L2NzcyIpOworICAgICAgICAvLyBGSVhNRTogQ3VzdG9tIGZvbnQg
d29ya3Mgb25seSB3aGVuIE1JTUUgaXMgInRleHQvcGxhaW4iCisgICAgICAgIG1pbWV0eXBlTWFw
LmFkZCgidHRmIiwgInRleHQvcGxhaW4iKTsgLy8gImZvbnQvdHRmIgorICAgICAgICBtaW1ldHlw
ZU1hcC5hZGQoIm90ZiIsICJ0ZXh0L3BsYWluIik7IC8vICJmb250L290ZiIKKyNpZiBFTkFCTEUo
V01MKQorICAgICAgICBtaW1ldHlwZU1hcC5hZGQoIndtbCIsICJ0ZXh0L3ZuZC53YXAud21sIik7
CisjZW5kaWYKKyNpZiBFTkFCTEUoV0JYTUwpCisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid2J4
bWwiLCAiYXBwbGljYXRpb24vdm5kLndhcC53bWxjIik7CisjZW5kaWYKKyAgICB9Cit9CisKK1N0
cmluZyBNSU1FVHlwZVJlZ2lzdHJ5OjpnZXRQcmVmZXJyZWRFeHRlbnNpb25Gb3JNSU1FVHlwZShj
b25zdCBTdHJpbmcmIHR5cGUpCit7CisgICAgaWYgKHR5cGUuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gU3RyaW5nKCk7CisKKyAgICAvLyBBdm9pZCBjb25mbGljdHMgd2l0aCAidHRmIiBhbmQg
Im90ZiIKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodHlwZSwgInRleHQvcGxhaW4iKSkKKyAg
ICAgICAgcmV0dXJuICJ0eHQiOworCisgICAgaW5pdE1JTUVUeXBlRW50ZW5zaW9uTWFwKCk7CisK
KyAgICBmb3IgKEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+OjppdGVyYXRvciBpID0gbWltZXR5cGVN
YXAuYmVnaW4oKTsgaSAhPSBtaW1ldHlwZU1hcC5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmIChl
cXVhbElnbm9yaW5nQ2FzZShpLT5zZWNvbmQsIHR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGkt
PmZpcnN0OworICAgIH0KKworI2lmIEVOQUJMRShYSFRNTE1QKQorICAgIGlmIChlcXVhbElnbm9y
aW5nQ2FzZSgiYXBwbGljYXRpb24vdm5kLndhcC54aHRtbCt4bWwiLCB0eXBlKSkKKyAgICAgICAg
cmV0dXJuIFN0cmluZygieG1sIik7CisjZW5kaWYKKworICAgIHJldHVybiBTdHJpbmcoKTsKK30K
KworU3RyaW5nIE1JTUVUeXBlUmVnaXN0cnk6OmdldE1JTUVUeXBlRm9yRXh0ZW5zaW9uKGNvbnN0
IFN0cmluZyAmZXh0KQoreworICAgIGlmIChleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
U3RyaW5nKCk7CisKKyAgICBpbml0TUlNRVR5cGVFbnRlbnNpb25NYXAoKTsKKworICAgIFN0cmlu
ZyByZXN1bHQgPSBtaW1ldHlwZU1hcC5nZXQoZXh0Lmxvd2VyKCkpOworICAgIGlmIChyZXN1bHQu
aXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdCA9IG1pbWVUeXBlRm9yRXh0ZW5zaW9uKGV4dCk7
CisgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1pbWV0eXBlTWFw
LmFkZChleHQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuaXNFbXB0eSgpID8g
InVua25vd24vdW5rbm93biIgOiByZXN1bHQ7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvUGFzdGVib2FyZFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvUGFzdGVib2FyZFdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li5jYmE4NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9QYXN0
ZWJvYXJkV2luY2UuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiUGFzdGVib2FyZC5oIgorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgor
I2luY2x1ZGUgIkNsaXBib2FyZFV0aWxpdGllc1dpbi5oIgorI2luY2x1ZGUgIkRvY3VtZW50Lmgi
CisjaW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNp
bmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKKyNpbmNsdWRlICJJ
bWFnZS5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAi
UmFuZ2UuaCIKKyNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGlu
Zy5oIgorI2luY2x1ZGUgIm1hcmt1cC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRp
YyBVSU5UIEhUTUxDbGlwYm9hcmRGb3JtYXQgPSAwOworc3RhdGljIFVJTlQgQm9va21hcmtDbGlw
Ym9hcmRGb3JtYXQgPSAwOworc3RhdGljIFVJTlQgV2ViU21hcnRQYXN0ZUZvcm1hdCA9IDA7CisK
K2V4dGVybiBIREMgaFNjcmVlbkRDOworCitzdGF0aWMgTFJFU1VMVCBDQUxMQkFDSyBQYXN0ZWJv
YXJkT3duZXJXbmRQcm9jKEhXTkQgaFduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBM
UEFSQU0gbFBhcmFtKQoreworICAgIExSRVNVTFQgbHJlc3VsdCA9IDA7CisgICAgTE9ORyBsb25n
UHRyID0gR2V0V2luZG93TG9uZyhoV25kLCAwKTsKKworICAgIHN3aXRjaCAobWVzc2FnZSkgewor
ICAgIGNhc2UgV01fUkVOREVSRk9STUFUOgorICAgICAgICAvLyBUaGlzIG1lc3NhZ2UgY29tZXMg
d2hlbiBTZXRDbGlwYm9hcmREYXRhIHdhcyBzZW50IGEgbnVsbCBkYXRhIGhhbmRsZQorICAgICAg
ICAvLyBhbmQgbm93IGl0J3MgY29tZSB0aW1lIHRvIHB1dCB0aGUgZGF0YSBvbiB0aGUgY2xpcGJv
YXJkLgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1JFTkRFUkFMTEZPUk1BVFM6CisgICAg
ICAgIC8vIFRoaXMgbWVzc2FnZSBjb21lcyB3aGVuIFNldENsaXBib2FyZERhdGEgd2FzIHNlbnQg
YSBudWxsIGRhdGEgaGFuZGxlCisgICAgICAgIC8vIGFuZCBub3cgdGhpcyBhcHBsaWNhdGlvbiBp
cyBhYm91dCB0byBxdWl0LCBzbyBpdCBtdXN0IHB1dCBkYXRhIG9uCisgICAgICAgIC8vIHRoZSBj
bGlwYm9hcmQgYmVmb3JlIGl0IGV4aXRzLgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX0RF
U1RST1k6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGxyZXN1bHQgPSBE
ZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIHJldHVybiBscmVzdWx0OworfQorCitQYXN0ZWJvYXJkKiBQYXN0ZWJv
YXJkOjpnZW5lcmFsUGFzdGVib2FyZCgpCit7CisgICAgc3RhdGljIFBhc3RlYm9hcmQqIHBhc3Rl
Ym9hcmQgPSBuZXcgUGFzdGVib2FyZDsKKyAgICByZXR1cm4gcGFzdGVib2FyZDsKK30KKworUGFz
dGVib2FyZDo6UGFzdGVib2FyZCgpCit7CisgICAgLy8gbWFrZSBhIGR1bW15IEhXTkQgdG8gYmUg
dGhlIFdpbmRvd3MgY2xpcGJvYXJkJ3Mgb3duZXIKKyAgICBXTkRDTEFTUyB3YyA9IHswfTsKKyAg
ICBtZW1zZXQoJndjLCAwLCBzaXplb2Yod2MpKTsKKyAgICB3Yy5scGZuV25kUHJvYyAgICA9IFBh
c3RlYm9hcmRPd25lclduZFByb2M7CisgICAgd2MuaEluc3RhbmNlICAgICAgPSBQYWdlOjppbnN0
YW5jZUhhbmRsZSgpOworICAgIHdjLmxwc3pDbGFzc05hbWUgID0gTCJQYXN0ZWJvYXJkT3duZXJX
aW5kb3dDbGFzcyI7CisgICAgOjpSZWdpc3RlckNsYXNzKCZ3Yyk7CisKKyAgICBtX293bmVyID0g
OjpDcmVhdGVXaW5kb3coTCJQYXN0ZWJvYXJkT3duZXJXaW5kb3dDbGFzcyIsIEwiUGFzdGVib2Fy
ZE93bmVyV2luZG93IiwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgSFdORF9NRVNTQUdFLCAwLCAw
LCAwKTsKKworICAgIEhUTUxDbGlwYm9hcmRGb3JtYXQgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9y
bWF0KEwiSFRNTCBGb3JtYXQiKTsKKyAgICBCb29rbWFya0NsaXBib2FyZEZvcm1hdCA9IDo6UmVn
aXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJVbmlmb3JtUmVzb3VyY2VMb2NhdG9yVyIpOworICAgIFdl
YlNtYXJ0UGFzdGVGb3JtYXQgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiV2ViS2l0IFNt
YXJ0IFBhc3RlIEZvcm1hdCIpOworfQorCit2b2lkIFBhc3RlYm9hcmQ6OmNsZWFyKCkKK3sKKyAg
ICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIDo6RW1wdHlDbGlwYm9h
cmQoKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0KK30KKwordm9pZCBQYXN0
ZWJvYXJkOjp3cml0ZVNlbGVjdGlvbihSYW5nZSogc2VsZWN0ZWRSYW5nZSwgYm9vbCBjYW5TbWFy
dENvcHlPckRlbGV0ZSwgRnJhbWUqIGZyYW1lKQoreworICAgIGNsZWFyKCk7CisKKyAgICAvLyBQ
dXQgQ0ZfSFRNTCBmb3JtYXQgb24gdGhlIHBhc3RlYm9hcmQKKyAgICBpZiAoOjpPcGVuQ2xpcGJv
YXJkKG1fb3duZXIpKSB7CisgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgICAgICBW
ZWN0b3I8Y2hhcj4gZGF0YTsKKyAgICAgICAgbWFya3VwVG9DRl9IVE1MKGNyZWF0ZU1hcmt1cChz
ZWxlY3RlZFJhbmdlLCAwLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlKSwgc2VsZWN0ZWRSYW5nZS0+
c3RhcnRDb250YWluZXIoZWMpLT5kb2N1bWVudCgpLT51cmwoKSwgZGF0YSk7CisgICAgICAgIEhH
TE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsKKyAgICAgICAgaWYgKCE6OlNl
dENsaXBib2FyZERhdGEoSFRNTENsaXBib2FyZEZvcm1hdCwgY2JEYXRhKSkKKyAgICAgICAgICAg
IDo6R2xvYmFsRnJlZShjYkRhdGEpOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAg
fQorCisgICAgLy8gUHV0IHBsYWluIHN0cmluZyBvbiB0aGUgcGFzdGVib2FyZC4gQ0ZfVU5JQ09E
RVRFWFQgY292ZXJzIENGX1RFWFQgYXMgd2VsbAorICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+c2Vs
ZWN0ZWRUZXh0KCk7CisgICAgcmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVz
KHN0cik7CisgICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uoc3RyKTsKKyAgICBpZiAoOjpPcGVuQ2xp
cGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFs
RGF0YShzdHIpOworICAgICAgICBpZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVY
VCwgY2JEYXRhKSkKKyAgICAgICAgICAgIDo6R2xvYmFsRnJlZShjYkRhdGEpOworICAgICAgICA6
OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQorCisgICAgLy8gZW5hYmxlIHNtYXJ0LXJlcGxhY2lu
ZyBsYXRlciBvbiBieSBwdXR0aW5nIGR1bW15IGRhdGEgb24gdGhlIHBhc3RlYm9hcmQKKyAgICBp
ZiAoY2FuU21hcnRDb3B5T3JEZWxldGUpIHsKKyAgICAgICAgaWYgKDo6T3BlbkNsaXBib2FyZCht
X293bmVyKSkgeworICAgICAgICAgICAgOjpTZXRDbGlwYm9hcmREYXRhKFdlYlNtYXJ0UGFzdGVG
b3JtYXQsIDApOworICAgICAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgICAgICB9Cisg
ICAgfQorfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlVVJMKGNvbnN0IEtVUkwmIHVybCwgY29u
c3QgU3RyaW5nJiB0aXRsZVN0ciwgRnJhbWUqIGZyYW1lKQoreworICAgIEFTU0VSVCghdXJsLmlz
RW1wdHkoKSk7CisKKyAgICBjbGVhcigpOworCisgICAgU3RyaW5nIHRpdGxlKHRpdGxlU3RyKTsK
KyAgICBpZiAodGl0bGUuaXNFbXB0eSgpKSB7CisgICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRo
Q29tcG9uZW50KCk7CisgICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpCisgICAgICAgICAgICB0
aXRsZSA9IHVybC5ob3N0KCk7CisgICAgfQorCisgICAgLy8gd3JpdGUgdG8gY2xpcGJvYXJkIGlu
IGZvcm1hdCBjb20uYXBwbGUuc2FmYXJpLmJvb2ttYXJrZGF0YSB0byBiZSBhYmxlIHRvIHBhc3Rl
IGludG8gdGhlIGJvb2ttYXJrcyB2aWV3IHdpdGggYXBwcm9wcmlhdGUgdGl0bGUKKyAgICBpZiAo
OjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3Jl
YXRlR2xvYmFsRGF0YSh1cmwsIHRpdGxlKTsKKyAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERh
dGEoQm9va21hcmtDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCisgICAgICAgICAgICA6Okdsb2Jh
bEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAg
IC8vIHdyaXRlIHRvIGNsaXBib2FyZCBpbiBmb3JtYXQgQ0ZfSFRNTCB0byBiZSBhYmxlIHRvIHBh
c3RlIGludG8gY29udGVudGVkaXRhYmxlIGFyZWFzIGFzIGEgbGluaworICAgIGlmICg6Ok9wZW5D
bGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgICAg
IG1hcmt1cFRvQ0ZfSFRNTCh1cmxUb01hcmt1cCh1cmwsIHRpdGxlKSwgIiIsIGRhdGEpOworICAg
ICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7CisgICAgICAgIGlm
ICghOjpTZXRDbGlwYm9hcmREYXRhKEhUTUxDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCisgICAg
ICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgp
OworICAgIH0KKworICAgIC8vIGJhcmUtYm9uZXMgQ0ZfVU5JQ09ERVRFWFQgc3VwcG9ydAorICAg
IGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEg
PSBjcmVhdGVHbG9iYWxEYXRhKHVybC5zdHJpbmcoKSk7CisgICAgICAgIGlmICghOjpTZXRDbGlw
Ym9hcmREYXRhKENGX1VOSUNPREVURVhULCBjYkRhdGEpKQorICAgICAgICAgICAgOjpHbG9iYWxG
cmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9Cit9CisKK3Zv
aWQgUGFzdGVib2FyZDo6d3JpdGVJbWFnZShOb2RlKiBub2RlLCBjb25zdCBLVVJMJiwgY29uc3Qg
U3RyaW5nJikKK3sKKyAgICBBU1NFUlQobm9kZSAmJiBub2RlLT5yZW5kZXJlcigpICYmIG5vZGUt
PnJlbmRlcmVyKCktPmlzSW1hZ2UoKSk7CisgICAgUmVuZGVySW1hZ2UqIHJlbmRlcmVyID0gc3Rh
dGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihub2RlLT5yZW5kZXJlcigpKTsKKyAgICBDYWNoZWRJbWFn
ZSogY2FjaGVkSW1hZ2UgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KHJlbmRlcmVyLT5jYWNo
ZWRJbWFnZSgpKTsKKyAgICBBU1NFUlQoY2FjaGVkSW1hZ2UpOworICAgIEltYWdlKiBpbWFnZSA9
IGNhY2hlZEltYWdlLT5pbWFnZSgpOworICAgIEFTU0VSVChpbWFnZSk7CisKKyAgICBjbGVhcigp
OworCisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gc291cmNlQm1wID0gaW1hZ2UtPm5hdGl2ZUlt
YWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgaWYgKCFzb3VyY2VCbXApCisgICAgICAgIHJldHVy
bjsKKworICAgIEludFJlY3QgcmVjdCgwLCAwLCBzb3VyY2VCbXAtPndpZHRoKCksIHNvdXJjZUJt
cC0+aGVpZ2h0KCkpOworICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICB2b2lkKiBwaXhlbHM7
CisgICAgSEJJVE1BUCByZXN1bHRCaXRtYXAgPSBzb3VyY2VCbXAtPmNsaXBCaXRtYXAocmVjdCwg
dHJ1ZSwgYm1wSW5mbywgcGl4ZWxzKTsKKyAgICBpZiAoIXJlc3VsdEJpdG1hcCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICA6
OlNldENsaXBib2FyZERhdGEoQ0ZfQklUTUFQLCByZXN1bHRCaXRtYXApOworICAgICAgICA6OkNs
b3NlQ2xpcGJvYXJkKCk7CisgICAgfSBlbHNlCisgICAgICAgIERlbGV0ZU9iamVjdChyZXN1bHRC
aXRtYXApOworfQorCitib29sIFBhc3RlYm9hcmQ6OmNhblNtYXJ0UmVwbGFjZSgpCit7CisgICAg
cmV0dXJuIDo6SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoV2ViU21hcnRQYXN0ZUZvcm1hdCk7
Cit9CisKK1N0cmluZyBQYXN0ZWJvYXJkOjpwbGFpblRleHQoRnJhbWUqIGZyYW1lKQoreworICAg
IGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1VOSUNPREVURVhUKSAmJiA6Ok9w
ZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xp
cGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCk7CisgICAgICAgIGlmIChjYkRhdGEpIHsKKyAgICAg
ICAgICAgIFVDaGFyKiBidWZmZXIgPSAoVUNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKKyAgICAg
ICAgICAgIFN0cmluZyBmcm9tQ2xpcGJvYXJkKGJ1ZmZlcik7CisgICAgICAgICAgICBHbG9iYWxV
bmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgICAg
ICByZXR1cm4gZnJvbUNsaXBib2FyZDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBDbG9z
ZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxh
YmxlKENGX1RFWFQpICYmIDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICBIQU5E
TEUgY2JEYXRhID0gOjpHZXRDbGlwYm9hcmREYXRhKENGX1RFWFQpOworICAgICAgICBpZiAoY2JE
YXRhKSB7CisgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRh
dGEpOworICAgICAgICAgICAgU3RyaW5nIGZyb21DbGlwYm9hcmQoYnVmZmVyKTsKKyAgICAgICAg
ICAgIEdsb2JhbFVubG9jayhjYkRhdGEpOworICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsK
KyAgICAgICAgICAgIHJldHVybiBmcm9tQ2xpcGJvYXJkOworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZygpOwor
fQorCitQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJh
Z21lbnQoRnJhbWUqIGZyYW1lLCBQYXNzUmVmUHRyPFJhbmdlPiBjb250ZXh0LCBib29sIGFsbG93
UGxhaW5UZXh0LCBib29sJiBjaG9zZVBsYWluVGV4dCkKK3sKKyAgICBjaG9zZVBsYWluVGV4dCA9
IGZhbHNlOworCisgICAgaWYgKDo6SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoSFRNTENsaXBi
b2FyZEZvcm1hdCkgJiYgOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIC8vIGdl
dCBkYXRhIG9mZiBvZiBjbGlwYm9hcmQKKyAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xp
cGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0KTsKKyAgICAgICAgaWYgKGNiRGF0YSkgewor
ICAgICAgICAgICAgU0laRV9UIGRhdGFTaXplID0gOjpHbG9iYWxTaXplKGNiRGF0YSk7CisgICAg
ICAgICAgICBTdHJpbmcgY2ZfaHRtbChVVEY4RW5jb2RpbmcoKS5kZWNvZGUoKGNoYXIqKUdsb2Jh
bExvY2soY2JEYXRhKSwgZGF0YVNpemUpKTsKKyAgICAgICAgICAgIEdsb2JhbFVubG9jayhjYkRh
dGEpOworICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKworICAgICAgICAgICAgUGFzc1Jl
ZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZyYWdtZW50RnJvbUNGX0hUTUwoZnJh
bWUtPmRvY3VtZW50KCksIGNmX2h0bWwpOworICAgICAgICAgICAgaWYgKGZyYWdtZW50KQorICAg
ICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICBDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIGlmIChhbGxvd1BsYWluVGV4dCAmJiBJ
c0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9VTklDT0RFVEVYVCkpIHsKKyAgICAgICAgY2hv
c2VQbGFpblRleHQgPSB0cnVlOworICAgICAgICBpZiAoT3BlbkNsaXBib2FyZChtX293bmVyKSkg
eworICAgICAgICAgICAgSEFORExFIGNiRGF0YSA9IEdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09E
RVRFWFQpOworICAgICAgICAgICAgaWYgKGNiRGF0YSkgeworICAgICAgICAgICAgICAgIFVDaGFy
KiBidWZmZXIgPSAoVUNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKKyAgICAgICAgICAgICAgICBT
dHJpbmcgc3RyKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7
CisgICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgICAgICAgICBSZWZQ
dHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudEZyb21UZXh0KGNv
bnRleHQuZ2V0KCksIHN0cik7CisgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50KQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOworICAgICAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIGlmIChhbGxvd1BsYWluVGV4dCAmJiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxl
KENGX1RFWFQpKSB7CisgICAgICAgIGNob3NlUGxhaW5UZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYg
KDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICAgICAgSEFORExFIGNiRGF0YSA9
IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKKyAgICAgICAgICAgIGlmIChjYkRhdGEpIHsK
KyAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRhdGEp
OworICAgICAgICAgICAgICAgIFN0cmluZyBzdHIoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBH
bG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOwor
ICAgICAgICAgICAgICAgIFJlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGNyZWF0
ZUZyYWdtZW50RnJvbVRleHQoY29udGV4dC5nZXQoKSwgc3RyKTsKKyAgICAgICAgICAgICAgICBp
ZiAoZnJhZ21lbnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNl
KCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgp
OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgUGFzdGVib2Fy
ZDo6aGFzRGF0YSgpCit7CisgICAgcmV0dXJuIGhhc0RhdGFJbkZvcm1hdChDRl9VTklDT0RFVEVY
VCkgfHwgaGFzRGF0YUluRm9ybWF0KENGX1RFWFQpOworfQorCitib29sIFBhc3RlYm9hcmQ6Omhh
c0RhdGFJbkZvcm1hdCh1bnNpZ25lZCBpbnQgZm9ybWF0KQoreworICAgIHJldHVybiA6OklzQ2xp
cGJvYXJkRm9ybWF0QXZhaWxhYmxlKGZvcm1hdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2lu
Y2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5jZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExMTI5MgotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3BwCkBA
IC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlIElu
Yy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNlYXJjaFBvcHVwTWVudS5oIgorCisj
aW5jbHVkZSAiQXRvbWljU3RyaW5nLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU2VhcmNo
UG9wdXBNZW51OjpTZWFyY2hQb3B1cE1lbnUoUG9wdXBNZW51Q2xpZW50KiBjbGllbnQpCis6IFBv
cHVwTWVudShjbGllbnQpCit7Cit9CisKK2Jvb2wgU2VhcmNoUG9wdXBNZW51OjplbmFibGVkKCkK
K3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2VhcmNoUG9wdXBNZW51OjpzYXZlUmVj
ZW50U2VhcmNoZXMoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBWZWN0b3I8U3RyaW5n
PiYgc2VhcmNoSXRlbXMpCit7CisgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNlYXJjaFBvcHVwTWVudTo6
bG9hZFJlY2VudFNlYXJjaGVzKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgVmVjdG9yPFN0cmlu
Zz4mIHNlYXJjaEl0ZW1zKQoreworICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34372</attachid>
            <date>2009-08-08 10:47:36 -0700</date>
            <delta_ts>2009-08-08 10:50:57 -0700</delta_ts>
            <desc>1) Clipboard</desc>
            <filename>27543_1.patch</filename>
            <type>text/plain</type>
            <size>17728</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMGQ4OGZmZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEFkZCBXSU5DRSBmaWxlcyBmb3IgQ2xpcGJvYXJk
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzU0Mwor
CisgICAgICAgICogcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkVXRpbGl0aWVzV2luY2UuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmg6IEFkZGVkLgorCiAy
MDA5LTA4LTA2ICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvQ2xpcGJvYXJkVXRpbGl0aWVzV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjQzYzEyYjEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIK
KworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCisj
aW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAi
VGV4dEVuY29kaW5nLmgiCisjaW5jbHVkZSAibWFya3VwLmgiCisjaW5jbHVkZSA8c2hsd2FwaS5o
PgorI2luY2x1ZGUgPHdpbmluZXQuaD4gICAgLy8gZm9yIElOVEVSTkVUX01BWF9VUkxfTEVOR1RI
CisKK3R5cGVkZWYgSEFORExFIEhEUk9QOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRp
YyBib29sIGdldFdlYkxvY0RhdGEoSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIFN0cmluZyYgdXJs
LCBTdHJpbmcqIHRpdGxlKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIFN0cmlu
ZyBleHRyYWN0VVJMKGNvbnN0IFN0cmluZyAmaW5VUkwsIFN0cmluZyogdGl0bGUpCit7CisgICAg
U3RyaW5nIHVybCA9IGluVVJMOworICAgIGludCBzcGxpdExvYyA9IHVybC5maW5kKCdcbicpOwor
ICAgIGlmIChzcGxpdExvYyA+IDApIHsKKyAgICAgICAgaWYgKHRpdGxlKQorICAgICAgICAgICAg
KnRpdGxlID0gdXJsLnN1YnN0cmluZyhzcGxpdExvYyArIDEpOworICAgICAgICB1cmwudHJ1bmNh
dGUoc3BsaXRMb2MpOworICAgIH0gZWxzZSBpZiAodGl0bGUpCisgICAgICAgICp0aXRsZSA9IHVy
bDsKKyAgICByZXR1cm4gdXJsOworfQorCisvL0ZpcmVmb3ggdGV4dC9odG1sCitzdGF0aWMgRk9S
TUFURVRDKiB0ZXh0SHRtbEZvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3Rl
ckNsaXBib2FyZEZvcm1hdChMInRleHQvaHRtbCIpOworICAgIHN0YXRpYyBGT1JNQVRFVEMgdGV4
dEh0bWxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFM
fTsKKyAgICByZXR1cm4gJnRleHRIdG1sRm9ybWF0OworfQorCitIR0xPQkFMIGNyZWF0ZUdsb2Jh
bERhdGEoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIFN0cmlu
ZyBtdXRhYmxlVVJMKHVybC5zdHJpbmcoKSk7CisgICAgU3RyaW5nIG11dGFibGVUaXRsZSh0aXRs
ZSk7CisgICAgU0laRV9UIHNpemUgPSBtdXRhYmxlVVJMLmxlbmd0aCgpICsgbXV0YWJsZVRpdGxl
Lmxlbmd0aCgpICsgMjsgIC8vICsxIGZvciAiXG4iIGFuZCArMSBmb3IgbnVsbCB0ZXJtaW5hdG9y
CisgICAgSEdMT0JBTCBjYkRhdGEgPSBHbG9iYWxBbGxvYyhHUFRSLCBzaXplICogc2l6ZW9mKFVD
aGFyKSk7CisKKyAgICBpZiAoY2JEYXRhKSB7CisgICAgICAgIFBXU1RSIGJ1ZmZlciA9IChQV1NU
UilHbG9iYWxMb2NrKGNiRGF0YSk7CisgICAgICAgIF9zbndwcmludGYoYnVmZmVyLCBzaXplLCBM
IiVzXG4lcyIsIG11dGFibGVVUkwuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgbXV0
YWJsZVRpdGxlLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworICAgICAgICBHbG9i
YWxVbmxvY2soY2JEYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIGNiRGF0YTsKK30KKworSEdMT0JB
TCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IFN0cmluZyYgc3RyKQoreworICAgIEhHTE9CQUwgZ2xv
YmFsRGF0YSA9IDo6R2xvYmFsQWxsb2MoR1BUUiwgKHN0ci5sZW5ndGgoKSArIDEpICogc2l6ZW9m
KFVDaGFyKSk7CisgICAgaWYgKCFnbG9iYWxEYXRhKQorICAgICAgICByZXR1cm4gMDsKKyAgICBV
Q2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8VUNoYXIqPihHbG9iYWxMb2NrKGdsb2JhbERhdGEp
KTsKKyAgICBtZW1jcHkoYnVmZmVyLCBzdHIuY2hhcmFjdGVycygpLCBzdHIubGVuZ3RoKCkgKiBz
aXplb2YoVUNoYXIpKTsKKyAgICBidWZmZXJbc3RyLmxlbmd0aCgpXSA9IDA7CisgICAgR2xvYmFs
VW5sb2NrKGdsb2JhbERhdGEpOworICAgIHJldHVybiBnbG9iYWxEYXRhOworfQorCitIR0xPQkFM
IGNyZWF0ZUdsb2JhbERhdGEoY29uc3QgVmVjdG9yPGNoYXI+JiB2ZWN0b3IpCit7CisgICAgSEdM
T0JBTCBnbG9iYWxEYXRhID0gR2xvYmFsQWxsb2MoR1BUUiwgdmVjdG9yLnNpemUoKSArIDEpOwor
ICAgIGlmICghZ2xvYmFsRGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2hhciogYnVmZmVy
ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2soZ2xvYmFsRGF0YSkpOworICAgIG1lbWNw
eShidWZmZXIsIHZlY3Rvci5kYXRhKCksIHZlY3Rvci5zaXplKCkpOworICAgIGJ1ZmZlclt2ZWN0
b3Iuc2l6ZSgpXSA9IDA7CisgICAgR2xvYmFsVW5sb2NrKGdsb2JhbERhdGEpOworICAgIHJldHVy
biBnbG9iYWxEYXRhOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmQoVmVjdG9yPGNoYXI+JiB2ZWN0
b3IsIGNvbnN0IGNoYXIqIHN0cmluZykKK3sKKyAgICB2ZWN0b3IuYXBwZW5kKHN0cmluZywgc3Ry
bGVuKHN0cmluZykpOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmQoVmVjdG9yPGNoYXI+JiB2ZWN0
b3IsIGNvbnN0IENTdHJpbmcmIHN0cmluZykKK3sKKyAgICB2ZWN0b3IuYXBwZW5kKHN0cmluZy5k
YXRhKCksIHN0cmluZy5sZW5ndGgoKSk7Cit9CisKKy8vIERvY3VtZW50YXRpb24gZm9yIHRoZSBD
Rl9IVE1MIGZvcm1hdCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS93
b3Jrc2hvcC9uZXR3b3JraW5nL2NsaXBib2FyZC9odG1sY2xpcGJvYXJkLmFzcAordm9pZCBtYXJr
dXBUb0NGX0hUTUwoY29uc3QgU3RyaW5nJiBtYXJrdXAsIGNvbnN0IFN0cmluZyYgc3JjVVJMLCBW
ZWN0b3I8Y2hhcj4mIHJlc3VsdCkKK3sKKyAgICBpZiAoIW1hcmt1cC5sZW5ndGgoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQ1N0cmluZyBjZl9odG1sID0gIlZlcnNpb246MC45IjsKKyAgICBD
U3RyaW5nIHN0YXJ0SFRNTCA9ICJcblN0YXJ0SFRNTDoiOworICAgIENTdHJpbmcgZW5kSFRNTCA9
ICJcbkVuZEhUTUw6IjsKKyAgICBDU3RyaW5nIHN0YXJ0RnJhZ21lbnQgPSAiXG5TdGFydEZyYWdt
ZW50OiI7CisgICAgQ1N0cmluZyBlbmRGcmFnbWVudCA9ICJcbkVuZEZyYWdtZW50OiI7CisgICAg
Q1N0cmluZyBzb3VyY2VVUkwgPSAiXG5Tb3VyY2VVUkw6IjsKKworICAgIGFwcGVuZChyZXN1bHQs
IGNmX2h0bWwpOworCisgICAgYm9vbCBzaG91bGRGaWxsU291cmNlVVJMID0gIXNyY1VSTC5pc0Vt
cHR5KCkgJiYgKHNyY1VSTCAhPSAiYWJvdXQ6YmxhbmsiKTsKKworICAgIENTdHJpbmcgc3RhcnRN
YXJrdXAgPSAiXG48SFRNTD5cbjxCT0RZPlxuPCEtLVN0YXJ0RnJhZ21lbnQtLT5cbiI7CisgICAg
Q1N0cmluZyBlbmRNYXJrdXAgPSAiXG48IS0tRW5kRnJhZ21lbnQtLT5cbjwvQk9EWT5cbjwvSFRN
TD4iOworCisgICAgLy8gY2FsY3VsYXRlIG9mZnNldHMKKyAgICBjb25zdCB1bnNpZ25lZCBVSU5U
X01BWGRpZ2l0cyA9IDEwOyAvLyBudW1iZXIgb2YgZGlnaXRzIGluIFVJTlRfTUFYIGluIGJhc2Ug
MTAKKyAgICB1bnNpZ25lZCBzdGFydEhUTUxPZmZzZXQgPSBjZl9odG1sLmxlbmd0aCgpICsgc3Rh
cnRIVE1MLmxlbmd0aCgpICsgZW5kSFRNTC5sZW5ndGgoKSArIHN0YXJ0RnJhZ21lbnQubGVuZ3Ro
KCkgKyBlbmRGcmFnbWVudC5sZW5ndGgoKSArIChzaG91bGRGaWxsU291cmNlVVJMID8gc291cmNl
VVJMLmxlbmd0aCgpICsgc3JjVVJMLmxlbmd0aCgpIDogMCkgKyAoNCAqIFVJTlRfTUFYZGlnaXRz
KTsKKyAgICB1bnNpZ25lZCBzdGFydEZyYWdtZW50T2Zmc2V0ID0gc3RhcnRIVE1MT2Zmc2V0ICsg
c3RhcnRNYXJrdXAubGVuZ3RoKCk7CisgICAgQ1N0cmluZyBtYXJrdXBVVEY4ID0gbWFya3VwLnV0
ZjgoKTsKKyAgICB1bnNpZ25lZCBlbmRGcmFnbWVudE9mZnNldCA9IHN0YXJ0RnJhZ21lbnRPZmZz
ZXQgKyBtYXJrdXBVVEY4Lmxlbmd0aCgpOworICAgIHVuc2lnbmVkIGVuZEhUTUxPZmZzZXQgPSBl
bmRGcmFnbWVudE9mZnNldCArIGVuZE1hcmt1cC5sZW5ndGgoKTsKKworICAgIC8vIGNyZWF0ZSBm
dWxsIHJlc3VsdCBzdHJpbmcgZnJvbSB0aGUgZnJhZ21lbnRzCisgICAgYXBwZW5kKHJlc3VsdCwg
c3RhcnRIVE1MKTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZvcm1hdCgiJTAxMHUiLCBz
dGFydEhUTUxPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFwcGVuZChyZXN1bHQsIGVuZEhU
TUwpOworICAgIGFwcGVuZChyZXN1bHQsIFN0cmluZzo6Zm9ybWF0KCIlMDEwdSIsIGVuZEhUTUxP
ZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFwcGVuZChyZXN1bHQsIHN0YXJ0RnJhZ21lbnQp
OworICAgIGFwcGVuZChyZXN1bHQsIFN0cmluZzo6Zm9ybWF0KCIlMDEwdSIsIHN0YXJ0RnJhZ21l
bnRPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFwcGVuZChyZXN1bHQsIGVuZEZyYWdtZW50
KTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZvcm1hdCgiJTAxMHUiLCBlbmRGcmFnbWVu
dE9mZnNldCkudXRmOCgpLmRhdGEoKSk7CisgICAgaWYgKHNob3VsZEZpbGxTb3VyY2VVUkwpIHsK
KyAgICAgICAgYXBwZW5kKHJlc3VsdCwgc291cmNlVVJMKTsKKyAgICAgICAgYXBwZW5kKHJlc3Vs
dCwgc3JjVVJMLnV0ZjgoKS5kYXRhKCkpOworICAgIH0KKyAgICBhcHBlbmQocmVzdWx0LCBzdGFy
dE1hcmt1cCk7CisgICAgYXBwZW5kKHJlc3VsdCwgbWFya3VwVVRGOC5kYXRhKCkpOworICAgIGFw
cGVuZChyZXN1bHQsIGVuZE1hcmt1cCk7Cit9CisKK1N0cmluZyB1cmxUb01hcmt1cChjb25zdCBL
VVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUpCit7CisgICAgU3RyaW5nIG1hcmt1cCgiPGEg
aHJlZj1cIiIpOworICAgIG1hcmt1cC5hcHBlbmQodXJsLnN0cmluZygpKTsKKyAgICBtYXJrdXAu
YXBwZW5kKCJcIj4iKTsKKyAgICBtYXJrdXAuYXBwZW5kKHRpdGxlKTsKKyAgICBtYXJrdXAuYXBw
ZW5kKCI8L2E+Iik7CisgICAgcmV0dXJuIG1hcmt1cDsKK30KKwordm9pZCByZXBsYWNlTmV3bGlu
ZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMoU3RyaW5nJiBzdHIpCit7CisgICAgc3RhdGljIGNv
bnN0IFVDaGFyIE5ld2xpbmUgPSAnXG4nOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcgV2luZG93
c05ld2xpbmUoIlxyXG4iKTsKKyAgICBzdHIucmVwbGFjZShOZXdsaW5lLCBXaW5kb3dzTmV3bGlu
ZSk7Cit9CisKK3ZvaWQgcmVwbGFjZU5CU1BXaXRoU3BhY2UoU3RyaW5nJiBzdHIpCit7CisgICAg
c3RhdGljIGNvbnN0IFVDaGFyIE5vbkJyZWFraW5nU3BhY2VDaGFyYWN0ZXIgPSAweEEwOworICAg
IHN0YXRpYyBjb25zdCBVQ2hhciBTcGFjZUNoYXJhY3RlciA9ICcgJzsKKyAgICBzdHIucmVwbGFj
ZShOb25CcmVha2luZ1NwYWNlQ2hhcmFjdGVyLCBTcGFjZUNoYXJhY3Rlcik7Cit9CisKK0ZPUk1B
VEVUQyogdXJsV0Zvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBi
b2FyZEZvcm1hdChMIlVuaWZvcm1SZXNvdXJjZUxvY2F0b3JXIik7CisgICAgc3RhdGljIEZPUk1B
VEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xP
QkFMfTsKKyAgICByZXR1cm4gJnVybEZvcm1hdDsKK30KKworRk9STUFURVRDKiB1cmxGb3JtYXQo
KQoreworICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJVbmlm
b3JtUmVzb3VyY2VMb2NhdG9yIik7CisgICAgc3RhdGljIEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7
Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4g
JnVybEZvcm1hdDsKK30KKworRk9STUFURVRDKiBwbGFpblRleHRGb3JtYXQoKQoreworICAgIHN0
YXRpYyBGT1JNQVRFVEMgdGV4dEZvcm1hdCA9IHtDRl9URVhULCAwLCBEVkFTUEVDVF9DT05URU5U
LCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ0ZXh0Rm9ybWF0OworfQorCitGT1JN
QVRFVEMqIHBsYWluVGV4dFdGb3JtYXQoKQoreworICAgIHN0YXRpYyBGT1JNQVRFVEMgdGV4dEZv
cm1hdCA9IHtDRl9VTklDT0RFVEVYVCwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hH
TE9CQUx9OworICAgIHJldHVybiAmdGV4dEZvcm1hdDsKK30KKworRk9STUFURVRDKiBmaWxlbmFt
ZVdGb3JtYXQoKQoreworICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3Jt
YXQoTCJGaWxlTmFtZVciKTsKKyAgICBzdGF0aWMgRk9STUFURVRDIHVybEZvcm1hdCA9IHtjZiwg
MCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdXJs
Rm9ybWF0OworfQorCitGT1JNQVRFVEMqIGZpbGVuYW1lRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMg
VUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiRmlsZU5hbWUiKTsKKyAgICBzdGF0
aWMgRk9STUFURVRDIHVybEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZ
TUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdXJsRm9ybWF0OworfQorCisvL01TSUUgSFRNTCBG
b3JtYXQKK0ZPUk1BVEVUQyogaHRtbEZvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBS
ZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIkhUTUwgRm9ybWF0Iik7CisgICAgc3RhdGljIEZPUk1B
VEVUQyBodG1sRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwgVFlNRURfSEdM
T0JBTH07CisgICAgcmV0dXJuICZodG1sRm9ybWF0OworfQorCitTdHJpbmcgZ2V0VVJMKElEYXRh
T2JqZWN0KiwgYm9vbCYsIFN0cmluZyopCit7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitT
dHJpbmcgZ2V0UGxhaW5UZXh0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBib29sJiBzdWNjZXNz
KQoreworICAgIFNUR01FRElVTSBzdG9yZTsKKyAgICBTdHJpbmcgdGV4dDsKKyAgICBzdWNjZXNz
ID0gZmFsc2U7CisgICAgaWYgKFNVQ0NFRURFRChkYXRhT2JqZWN0LT5HZXREYXRhKHBsYWluVGV4
dFdGb3JtYXQoKSwgJnN0b3JlKSkpIHsKKyAgICAgICAgLy91bmljb2RlIHRleHQKKyAgICAgICAg
VUNoYXIqIGRhdGEgPSAoVUNoYXIqKUdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAg
IHRleHQgPSBTdHJpbmcoZGF0YSk7CisgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFs
KTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAgICBzdWNjZXNzID0g
dHJ1ZTsKKyAgICB9IGVsc2UgaWYgKFNVQ0NFRURFRChkYXRhT2JqZWN0LT5HZXREYXRhKHBsYWlu
VGV4dEZvcm1hdCgpLCAmc3RvcmUpKSkgeworICAgICAgICAvL2FzY2lpIHRleHQKKyAgICAgICAg
Y2hhciogZGF0YSA9IChjaGFyKilHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICB0
ZXh0ID0gU3RyaW5nKGRhdGEpOworICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7
CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKKyAgICAgICAgc3VjY2VzcyA9IHRy
dWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy9JZiBhIGZpbGUgaXMgZHJvcHBlZCBvbiB0aGUg
d2luZG93LCBpdCBkb2VzIG5vdCBwcm92aWRlIGVpdGhlciBvZiB0aGUKKyAgICAgICAgLy9wbGFp
biB0ZXh0IGZvcm1hdHMsIHNvIGhlcmUgd2UgdHJ5IHRvIGZvcmNpYmx5IGdldCBhIHVybC4KKyAg
ICAgICAgdGV4dCA9IGdldFVSTChkYXRhT2JqZWN0LCBzdWNjZXNzKTsKKyAgICAgICAgc3VjY2Vz
cyA9IHRydWU7CisgICAgfQorICAgIHJldHVybiB0ZXh0OworfQorCitQYXNzUmVmUHRyPERvY3Vt
ZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJvbUZpbGVuYW1lcyhEb2N1bWVudCosIGNvbnN0IElEYXRh
T2JqZWN0KikKK3sKKyAgICAvL0ZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgZnJh
Z21lbnRzIGZyb20gZmlsZXMKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBjb250YWluc0ZpbGVu
YW1lcyhjb25zdCBJRGF0YU9iamVjdCopCit7CisgICAgLy9GSVhNRTogV2UnbGwgd2FudCB0byB1
cGRhdGUgdGhpcyBvbmNlIHdlIGNhbiBwcm9kdWNlIGZyYWdtZW50cyBmcm9tIGZpbGVzCisgICAg
cmV0dXJuIGZhbHNlOworfQorCisvL0NvbnZlcnQgYSBTdHJpbmcgY29udGFpbmluZyBDRl9IVE1M
IGZvcm1hdHRlZCB0ZXh0IHRvIGEgRG9jdW1lbnRGcmFnbWVudAorUGFzc1JlZlB0cjxEb2N1bWVu
dEZyYWdtZW50PiBmcmFnbWVudEZyb21DRl9IVE1MKERvY3VtZW50KiBkb2MsIGNvbnN0IFN0cmlu
ZyYgY2ZfaHRtbCkKK3sKKyAgICAvLyBvYnRhaW4gYmFzZVVSTCBpZiBwcmVzZW50CisgICAgU3Ry
aW5nIHNyY1VSTFN0cigic291cmNlVVJMOiIpOworICAgIFN0cmluZyBzcmNVUkw7CisgICAgdW5z
aWduZWQgbGluZVN0YXJ0ID0gY2ZfaHRtbC5maW5kKHNyY1VSTFN0ciwgMCwgZmFsc2UpOworICAg
IGlmIChsaW5lU3RhcnQgIT0gLTEpIHsKKyAgICAgICAgdW5zaWduZWQgc3JjRW5kID0gY2ZfaHRt
bC5maW5kKCJcbiIsIGxpbmVTdGFydCwgZmFsc2UpOworICAgICAgICB1bnNpZ25lZCBzcmNTdGFy
dCA9IGxpbmVTdGFydCtzcmNVUkxTdHIubGVuZ3RoKCk7CisgICAgICAgIFN0cmluZyByYXdTcmNV
UkwgPSBjZl9odG1sLnN1YnN0cmluZyhzcmNTdGFydCwgc3JjRW5kLXNyY1N0YXJ0KTsKKyAgICAg
ICAgcmVwbGFjZU5CU1BXaXRoU3BhY2UocmF3U3JjVVJMKTsKKyAgICAgICAgc3JjVVJMID0gcmF3
U3JjVVJMLnN0cmlwV2hpdGVTcGFjZSgpOworICAgIH0KKworICAgIC8vIGZpbmQgdGhlIG1hcmt1
cCBiZXR3ZWVuICI8IS0tU3RhcnRGcmFnbWVudCAtLT4iIGFuZCAiPCEtLUVuZEZyYWdtZW50IC0t
PiIsIGFjY291bnRpbmcgZm9yIGJyb3dzZXIgcXVpcmtzCisgICAgdW5zaWduZWQgbWFya3VwU3Rh
cnQgPSBjZl9odG1sLmZpbmQoIjxodG1sIiwgMCwgZmFsc2UpOworICAgIHVuc2lnbmVkIHRhZ1N0
YXJ0ID0gY2ZfaHRtbC5maW5kKCJzdGFydGZyYWdtZW50IiwgbWFya3VwU3RhcnQsIGZhbHNlKTsK
KyAgICB1bnNpZ25lZCBmcmFnbWVudFN0YXJ0ID0gY2ZfaHRtbC5maW5kKCc+JywgdGFnU3RhcnQp
ICsgMTsKKyAgICB1bnNpZ25lZCB0YWdFbmQgPSBjZl9odG1sLmZpbmQoImVuZGZyYWdtZW50Iiwg
ZnJhZ21lbnRTdGFydCwgZmFsc2UpOworICAgIHVuc2lnbmVkIGZyYWdtZW50RW5kID0gY2ZfaHRt
bC5yZXZlcnNlRmluZCgnPCcsIHRhZ0VuZCk7CisgICAgU3RyaW5nIG1hcmt1cCA9IGNmX2h0bWwu
c3Vic3RyaW5nKGZyYWdtZW50U3RhcnQsIGZyYWdtZW50RW5kIC0gZnJhZ21lbnRTdGFydCkuc3Ry
aXBXaGl0ZVNwYWNlKCk7CisKKyAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tTWFya3VwKGRv
YywgbWFya3VwLCBzcmNVUkwpLnJlbGVhc2VSZWYoKTsKK30KKworCitQYXNzUmVmUHRyPERvY3Vt
ZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJvbUhUTUwoRG9jdW1lbnQqIGRvYywgSURhdGFPYmplY3Qq
IGRhdGEpCit7CisgICAgaWYgKCFkb2MgfHwgIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgU1RHTUVESVVNIHN0b3JlOworICAgIFN0cmluZyBodG1sOworICAgIFN0cmluZyBzcmNVUkw7
CisgICAgaWYgKFNVQ0NFRURFRChkYXRhLT5HZXREYXRhKGh0bWxGb3JtYXQoKSwgJnN0b3JlKSkp
IHsKKyAgICAgICAgLy9NUyBIVE1MIEZvcm1hdCBwYXJzaW5nCisgICAgICAgIGNoYXIqIGRhdGEg
PSAoY2hhciopR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgU0laRV9UIGRhdGFT
aXplID0gOjpHbG9iYWxTaXplKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBTdHJpbmcgY2ZfaHRt
bChVVEY4RW5jb2RpbmcoKS5kZWNvZGUoZGF0YSwgZGF0YVNpemUpKTsKKyAgICAgICAgR2xvYmFs
VW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7
CisgICAgICAgIGlmIChQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gZnJh
Z21lbnRGcm9tQ0ZfSFRNTChkb2MsIGNmX2h0bWwpKQorICAgICAgICAgICAgcmV0dXJuIGZyYWdt
ZW50OworICAgIH0KKyAgICBpZiAoU1VDQ0VFREVEKGRhdGEtPkdldERhdGEodGV4dEh0bWxGb3Jt
YXQoKSwgJnN0b3JlKSkpIHsKKyAgICAgICAgLy9yYXcgaHRtbAorICAgICAgICBVQ2hhciogZGF0
YSA9IChVQ2hhciopR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgaHRtbCA9IFN0
cmluZyhkYXRhKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAg
ICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVu
dEZyb21NYXJrdXAoZG9jLCBodG1sLCBzcmNVUkwpOworICAgIH0KKworICAgIHJldHVybiAwOwor
fQorCitib29sIGNvbnRhaW5zSFRNTChJRGF0YU9iamVjdCogZGF0YSkKK3sKKyAgICByZXR1cm4g
U1VDQ0VFREVEKGRhdGEtPlF1ZXJ5R2V0RGF0YSh0ZXh0SHRtbEZvcm1hdCgpKSkgfHwgU1VDQ0VF
REVEKGRhdGEtPlF1ZXJ5R2V0RGF0YShodG1sRm9ybWF0KCkpKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRX
aW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTI3MzAyCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5jcHAKQEAgLTAsMCArMSwx
MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ2xpcGJvYXJkV2luY2UuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitDbGlwYm9hcmRXaW5jZTo6Q2xpcGJvYXJkV2luY2UoQ2xpcGJvYXJk
QWNjZXNzUG9saWN5IHBvbGljeSwgYm9vbCBpc0ZvckRyYWdnaW5nKQorOiBDbGlwYm9hcmQocG9s
aWN5LCBpc0ZvckRyYWdnaW5nKQoreworfQorCitDbGlwYm9hcmRXaW5jZTo6fkNsaXBib2FyZFdp
bmNlKCkKK3sKK30KKwordm9pZCBDbGlwYm9hcmRXaW5jZTo6Y2xlYXJEYXRhKGNvbnN0IFN0cmlu
ZyYgdHlwZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIENsaXBib2FyZFdp
bmNlOjpjbGVhckFsbERhdGEoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK1N0cmlu
ZyBDbGlwYm9hcmRXaW5jZTo6Z2V0RGF0YShjb25zdCBTdHJpbmcmIHR5cGUsIGJvb2wmIHN1Y2Nl
c3MpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7
Cit9CisKK2Jvb2wgQ2xpcGJvYXJkV2luY2U6OnNldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBj
b25zdCBTdHJpbmcmIGRhdGEpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKKy8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCitIYXNoU2V0PFN0cmlu
Zz4gQ2xpcGJvYXJkV2luY2U6OnR5cGVzKCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiBIYXNoU2V0PFN0cmluZz4oKTsKK30KKwordm9pZCBDbGlwYm9hcmRXaW5j
ZTo6c2V0RHJhZ0ltYWdlKENhY2hlZEltYWdlKiwgY29uc3QgSW50UG9pbnQmKQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OnNldERyYWdJbWFnZUVs
ZW1lbnQoTm9kZSosIGNvbnN0IEludFBvaW50JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCisvL1Byb3ZpZGVzIHRoZSBET00gc3BlY2lmaWVkCitEcmFnSW1hZ2VSZWYgQ2xpcGJvYXJk
V2luY2U6OmNyZWF0ZURyYWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3QKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBEcmFnSW1hZ2VSZWYoKTsKK30KKwordm9pZCBD
bGlwYm9hcmRXaW5jZTo6ZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdlKEVsZW1lbnQqLCBjb25zdCBL
VVJMJiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqKQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OndyaXRlVVJMKGNvbnN0IEtVUkwmLCBjb25z
dCBTdHJpbmcmLCBGcmFtZSopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBD
bGlwYm9hcmRXaW5jZTo6d3JpdGVSYW5nZShSYW5nZSosIEZyYW1lKikKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworfQorCitib29sIENsaXBib2FyZFdpbmNlOjpoYXNEYXRhKCkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworUGFzc1JlZlB0cjxGaWxl
TGlzdD4gQ2xpcGJvYXJkV2luY2U6OmZpbGVzKCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworICAgIHJldHVybiAwOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmggYi9XZWJDb3JlL3Bs
YXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uMjQ4Y2JmMgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvQ2xpcGJvYXJkV2luY2UuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBDbGlwYm9hcmRXaW5jZV9oCisj
ZGVmaW5lIENsaXBib2FyZFdpbmNlX2gKKworI2luY2x1ZGUgIkNsaXBib2FyZC5oIgorI2luY2x1
ZGUgIkZpbGVMaXN0LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIENsaXBi
b2FyZFdpbmNlIDogcHVibGljIENsaXBib2FyZCwgcHVibGljIENhY2hlZFJlc291cmNlQ2xpZW50
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIENsaXBib2FyZFdpbmNlKENsaXBib2FyZEFjY2Vzc1Bv
bGljeSBwb2xpY3ksIGJvb2wgaXNGb3JEcmFnZ2luZyk7CisgICAgICAgIH5DbGlwYm9hcmRXaW5j
ZSgpOworCisgICAgICAgIHZvaWQgY2xlYXJEYXRhKGNvbnN0IFN0cmluZyYgdHlwZSk7CisgICAg
ICAgIHZvaWQgY2xlYXJBbGxEYXRhKCk7CisgICAgICAgIFN0cmluZyBnZXREYXRhKGNvbnN0IFN0
cmluZyYgdHlwZSwgYm9vbCYgc3VjY2VzcykgY29uc3Q7CisgICAgICAgIGJvb2wgc2V0RGF0YShj
b25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgZGF0YSk7CisKKyAgICAgICAgLy8gZXh0
ZW5zaW9ucyBiZXlvbmQgSUUncyBBUEkKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IHR5cGVzKCkg
Y29uc3Q7CisKKyAgICAgICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqLCBjb25zdCBJ
bnRQb2ludCYpOworICAgICAgICB2b2lkIHNldERyYWdJbWFnZUVsZW1lbnQoTm9kZSosIGNvbnN0
IEludFBvaW50Jik7CisKKyAgICAgICAgdmlydHVhbCBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0lt
YWdlKEludFBvaW50JiBkcmFnTG9jKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGRlY2xh
cmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYg
dGl0bGUsIEZyYW1lKik7CisgICAgICAgIHZpcnR1YWwgdm9pZCB3cml0ZVVSTChjb25zdCBLVVJM
JiwgY29uc3QgU3RyaW5nJiwgRnJhbWUqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHdyaXRlUmFu
Z2UoUmFuZ2UqLCBGcmFtZSopOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNEYXRhKCk7Cisg
ICAgICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxGaWxlTGlzdD4gZmlsZXMoKSBjb25zdDsKKyAgICB9
OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDbGlwYm9hcmRXaW5jZV9o
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34373</attachid>
            <date>2009-08-08 10:50:57 -0700</date>
            <delta_ts>2009-08-08 10:53:28 -0700</delta_ts>
            <desc>1) Clipboard</desc>
            <filename>27543_1.patch</filename>
            <type>text/plain</type>
            <size>17728</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMGQ4OGZmZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEFkZCBXSU5DRSBmaWxlcyBmb3IgQ2xpcGJvYXJk
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzU0Mwor
CisgICAgICAgICogcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkVXRpbGl0aWVzV2luY2UuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5jcHA6IEFkZGVk
LgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmg6IEFkZGVkLgorCiAy
MDA5LTA4LTA2ICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmlsZS5jb20+CiAKICAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvQ2xpcGJvYXJkVXRpbGl0aWVzV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLjQzYzEyYjEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcApAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNywgMjAwOCBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIK
KworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCisj
aW5jbHVkZSAiS1VSTC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtU3RyaW5nLmgiCisjaW5jbHVkZSAi
VGV4dEVuY29kaW5nLmgiCisjaW5jbHVkZSAibWFya3VwLmgiCisjaW5jbHVkZSA8c2hsd2FwaS5o
PgorI2luY2x1ZGUgPHdpbmluZXQuaD4gICAgLy8gZm9yIElOVEVSTkVUX01BWF9VUkxfTEVOR1RI
CisKK3R5cGVkZWYgSEFORExFIEhEUk9QOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRp
YyBib29sIGdldFdlYkxvY0RhdGEoSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIFN0cmluZyYgdXJs
LCBTdHJpbmcqIHRpdGxlKQoreworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIFN0cmlu
ZyBleHRyYWN0VVJMKGNvbnN0IFN0cmluZyAmaW5VUkwsIFN0cmluZyogdGl0bGUpCit7CisgICAg
U3RyaW5nIHVybCA9IGluVVJMOworICAgIGludCBzcGxpdExvYyA9IHVybC5maW5kKCdcbicpOwor
ICAgIGlmIChzcGxpdExvYyA+IDApIHsKKyAgICAgICAgaWYgKHRpdGxlKQorICAgICAgICAgICAg
KnRpdGxlID0gdXJsLnN1YnN0cmluZyhzcGxpdExvYyArIDEpOworICAgICAgICB1cmwudHJ1bmNh
dGUoc3BsaXRMb2MpOworICAgIH0gZWxzZSBpZiAodGl0bGUpCisgICAgICAgICp0aXRsZSA9IHVy
bDsKKyAgICByZXR1cm4gdXJsOworfQorCisvL0ZpcmVmb3ggdGV4dC9odG1sCitzdGF0aWMgRk9S
TUFURVRDKiB0ZXh0SHRtbEZvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3Rl
ckNsaXBib2FyZEZvcm1hdChMInRleHQvaHRtbCIpOworICAgIHN0YXRpYyBGT1JNQVRFVEMgdGV4
dEh0bWxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFM
fTsKKyAgICByZXR1cm4gJnRleHRIdG1sRm9ybWF0OworfQorCitIR0xPQkFMIGNyZWF0ZUdsb2Jh
bERhdGEoY29uc3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIFN0cmlu
ZyBtdXRhYmxlVVJMKHVybC5zdHJpbmcoKSk7CisgICAgU3RyaW5nIG11dGFibGVUaXRsZSh0aXRs
ZSk7CisgICAgU0laRV9UIHNpemUgPSBtdXRhYmxlVVJMLmxlbmd0aCgpICsgbXV0YWJsZVRpdGxl
Lmxlbmd0aCgpICsgMjsgIC8vICsxIGZvciAiXG4iIGFuZCArMSBmb3IgbnVsbCB0ZXJtaW5hdG9y
CisgICAgSEdMT0JBTCBjYkRhdGEgPSBHbG9iYWxBbGxvYyhHUFRSLCBzaXplICogc2l6ZW9mKFVD
aGFyKSk7CisKKyAgICBpZiAoY2JEYXRhKSB7CisgICAgICAgIFBXU1RSIGJ1ZmZlciA9IChQV1NU
UilHbG9iYWxMb2NrKGNiRGF0YSk7CisgICAgICAgIF9zbndwcmludGYoYnVmZmVyLCBzaXplLCBM
IiVzXG4lcyIsIG11dGFibGVVUkwuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgbXV0
YWJsZVRpdGxlLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworICAgICAgICBHbG9i
YWxVbmxvY2soY2JEYXRhKTsKKyAgICB9CisgICAgcmV0dXJuIGNiRGF0YTsKK30KKworSEdMT0JB
TCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IFN0cmluZyYgc3RyKQoreworICAgIEhHTE9CQUwgZ2xv
YmFsRGF0YSA9IDo6R2xvYmFsQWxsb2MoR1BUUiwgKHN0ci5sZW5ndGgoKSArIDEpICogc2l6ZW9m
KFVDaGFyKSk7CisgICAgaWYgKCFnbG9iYWxEYXRhKQorICAgICAgICByZXR1cm4gMDsKKyAgICBV
Q2hhciogYnVmZmVyID0gc3RhdGljX2Nhc3Q8VUNoYXIqPihHbG9iYWxMb2NrKGdsb2JhbERhdGEp
KTsKKyAgICBtZW1jcHkoYnVmZmVyLCBzdHIuY2hhcmFjdGVycygpLCBzdHIubGVuZ3RoKCkgKiBz
aXplb2YoVUNoYXIpKTsKKyAgICBidWZmZXJbc3RyLmxlbmd0aCgpXSA9IDA7CisgICAgR2xvYmFs
VW5sb2NrKGdsb2JhbERhdGEpOworICAgIHJldHVybiBnbG9iYWxEYXRhOworfQorCitIR0xPQkFM
IGNyZWF0ZUdsb2JhbERhdGEoY29uc3QgVmVjdG9yPGNoYXI+JiB2ZWN0b3IpCit7CisgICAgSEdM
T0JBTCBnbG9iYWxEYXRhID0gR2xvYmFsQWxsb2MoR1BUUiwgdmVjdG9yLnNpemUoKSArIDEpOwor
ICAgIGlmICghZ2xvYmFsRGF0YSkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2hhciogYnVmZmVy
ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KEdsb2JhbExvY2soZ2xvYmFsRGF0YSkpOworICAgIG1lbWNw
eShidWZmZXIsIHZlY3Rvci5kYXRhKCksIHZlY3Rvci5zaXplKCkpOworICAgIGJ1ZmZlclt2ZWN0
b3Iuc2l6ZSgpXSA9IDA7CisgICAgR2xvYmFsVW5sb2NrKGdsb2JhbERhdGEpOworICAgIHJldHVy
biBnbG9iYWxEYXRhOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmQoVmVjdG9yPGNoYXI+JiB2ZWN0
b3IsIGNvbnN0IGNoYXIqIHN0cmluZykKK3sKKyAgICB2ZWN0b3IuYXBwZW5kKHN0cmluZywgc3Ry
bGVuKHN0cmluZykpOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmQoVmVjdG9yPGNoYXI+JiB2ZWN0
b3IsIGNvbnN0IENTdHJpbmcmIHN0cmluZykKK3sKKyAgICB2ZWN0b3IuYXBwZW5kKHN0cmluZy5k
YXRhKCksIHN0cmluZy5sZW5ndGgoKSk7Cit9CisKKy8vIERvY3VtZW50YXRpb24gZm9yIHRoZSBD
Rl9IVE1MIGZvcm1hdCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS93
b3Jrc2hvcC9uZXR3b3JraW5nL2NsaXBib2FyZC9odG1sY2xpcGJvYXJkLmFzcAordm9pZCBtYXJr
dXBUb0NGX0hUTUwoY29uc3QgU3RyaW5nJiBtYXJrdXAsIGNvbnN0IFN0cmluZyYgc3JjVVJMLCBW
ZWN0b3I8Y2hhcj4mIHJlc3VsdCkKK3sKKyAgICBpZiAoIW1hcmt1cC5sZW5ndGgoKSkKKyAgICAg
ICAgcmV0dXJuOworCisgICAgQ1N0cmluZyBjZl9odG1sID0gIlZlcnNpb246MC45IjsKKyAgICBD
U3RyaW5nIHN0YXJ0SFRNTCA9ICJcblN0YXJ0SFRNTDoiOworICAgIENTdHJpbmcgZW5kSFRNTCA9
ICJcbkVuZEhUTUw6IjsKKyAgICBDU3RyaW5nIHN0YXJ0RnJhZ21lbnQgPSAiXG5TdGFydEZyYWdt
ZW50OiI7CisgICAgQ1N0cmluZyBlbmRGcmFnbWVudCA9ICJcbkVuZEZyYWdtZW50OiI7CisgICAg
Q1N0cmluZyBzb3VyY2VVUkwgPSAiXG5Tb3VyY2VVUkw6IjsKKworICAgIGFwcGVuZChyZXN1bHQs
IGNmX2h0bWwpOworCisgICAgYm9vbCBzaG91bGRGaWxsU291cmNlVVJMID0gIXNyY1VSTC5pc0Vt
cHR5KCkgJiYgKHNyY1VSTCAhPSAiYWJvdXQ6YmxhbmsiKTsKKworICAgIENTdHJpbmcgc3RhcnRN
YXJrdXAgPSAiXG48SFRNTD5cbjxCT0RZPlxuPCEtLVN0YXJ0RnJhZ21lbnQtLT5cbiI7CisgICAg
Q1N0cmluZyBlbmRNYXJrdXAgPSAiXG48IS0tRW5kRnJhZ21lbnQtLT5cbjwvQk9EWT5cbjwvSFRN
TD4iOworCisgICAgLy8gY2FsY3VsYXRlIG9mZnNldHMKKyAgICBjb25zdCB1bnNpZ25lZCBVSU5U
X01BWGRpZ2l0cyA9IDEwOyAvLyBudW1iZXIgb2YgZGlnaXRzIGluIFVJTlRfTUFYIGluIGJhc2Ug
MTAKKyAgICB1bnNpZ25lZCBzdGFydEhUTUxPZmZzZXQgPSBjZl9odG1sLmxlbmd0aCgpICsgc3Rh
cnRIVE1MLmxlbmd0aCgpICsgZW5kSFRNTC5sZW5ndGgoKSArIHN0YXJ0RnJhZ21lbnQubGVuZ3Ro
KCkgKyBlbmRGcmFnbWVudC5sZW5ndGgoKSArIChzaG91bGRGaWxsU291cmNlVVJMID8gc291cmNl
VVJMLmxlbmd0aCgpICsgc3JjVVJMLmxlbmd0aCgpIDogMCkgKyAoNCAqIFVJTlRfTUFYZGlnaXRz
KTsKKyAgICB1bnNpZ25lZCBzdGFydEZyYWdtZW50T2Zmc2V0ID0gc3RhcnRIVE1MT2Zmc2V0ICsg
c3RhcnRNYXJrdXAubGVuZ3RoKCk7CisgICAgQ1N0cmluZyBtYXJrdXBVVEY4ID0gbWFya3VwLnV0
ZjgoKTsKKyAgICB1bnNpZ25lZCBlbmRGcmFnbWVudE9mZnNldCA9IHN0YXJ0RnJhZ21lbnRPZmZz
ZXQgKyBtYXJrdXBVVEY4Lmxlbmd0aCgpOworICAgIHVuc2lnbmVkIGVuZEhUTUxPZmZzZXQgPSBl
bmRGcmFnbWVudE9mZnNldCArIGVuZE1hcmt1cC5sZW5ndGgoKTsKKworICAgIC8vIGNyZWF0ZSBm
dWxsIHJlc3VsdCBzdHJpbmcgZnJvbSB0aGUgZnJhZ21lbnRzCisgICAgYXBwZW5kKHJlc3VsdCwg
c3RhcnRIVE1MKTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZvcm1hdCgiJTAxMHUiLCBz
dGFydEhUTUxPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFwcGVuZChyZXN1bHQsIGVuZEhU
TUwpOworICAgIGFwcGVuZChyZXN1bHQsIFN0cmluZzo6Zm9ybWF0KCIlMDEwdSIsIGVuZEhUTUxP
ZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFwcGVuZChyZXN1bHQsIHN0YXJ0RnJhZ21lbnQp
OworICAgIGFwcGVuZChyZXN1bHQsIFN0cmluZzo6Zm9ybWF0KCIlMDEwdSIsIHN0YXJ0RnJhZ21l
bnRPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFwcGVuZChyZXN1bHQsIGVuZEZyYWdtZW50
KTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZvcm1hdCgiJTAxMHUiLCBlbmRGcmFnbWVu
dE9mZnNldCkudXRmOCgpLmRhdGEoKSk7CisgICAgaWYgKHNob3VsZEZpbGxTb3VyY2VVUkwpIHsK
KyAgICAgICAgYXBwZW5kKHJlc3VsdCwgc291cmNlVVJMKTsKKyAgICAgICAgYXBwZW5kKHJlc3Vs
dCwgc3JjVVJMLnV0ZjgoKS5kYXRhKCkpOworICAgIH0KKyAgICBhcHBlbmQocmVzdWx0LCBzdGFy
dE1hcmt1cCk7CisgICAgYXBwZW5kKHJlc3VsdCwgbWFya3VwVVRGOC5kYXRhKCkpOworICAgIGFw
cGVuZChyZXN1bHQsIGVuZE1hcmt1cCk7Cit9CisKK1N0cmluZyB1cmxUb01hcmt1cChjb25zdCBL
VVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUpCit7CisgICAgU3RyaW5nIG1hcmt1cCgiPGEg
aHJlZj1cIiIpOworICAgIG1hcmt1cC5hcHBlbmQodXJsLnN0cmluZygpKTsKKyAgICBtYXJrdXAu
YXBwZW5kKCJcIj4iKTsKKyAgICBtYXJrdXAuYXBwZW5kKHRpdGxlKTsKKyAgICBtYXJrdXAuYXBw
ZW5kKCI8L2E+Iik7CisgICAgcmV0dXJuIG1hcmt1cDsKK30KKwordm9pZCByZXBsYWNlTmV3bGlu
ZXNXaXRoV2luZG93c1N0eWxlTmV3bGluZXMoU3RyaW5nJiBzdHIpCit7CisgICAgc3RhdGljIGNv
bnN0IFVDaGFyIE5ld2xpbmUgPSAnXG4nOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcgV2luZG93
c05ld2xpbmUoIlxyXG4iKTsKKyAgICBzdHIucmVwbGFjZShOZXdsaW5lLCBXaW5kb3dzTmV3bGlu
ZSk7Cit9CisKK3ZvaWQgcmVwbGFjZU5CU1BXaXRoU3BhY2UoU3RyaW5nJiBzdHIpCit7CisgICAg
c3RhdGljIGNvbnN0IFVDaGFyIE5vbkJyZWFraW5nU3BhY2VDaGFyYWN0ZXIgPSAweEEwOworICAg
IHN0YXRpYyBjb25zdCBVQ2hhciBTcGFjZUNoYXJhY3RlciA9ICcgJzsKKyAgICBzdHIucmVwbGFj
ZShOb25CcmVha2luZ1NwYWNlQ2hhcmFjdGVyLCBTcGFjZUNoYXJhY3Rlcik7Cit9CisKK0ZPUk1B
VEVUQyogdXJsV0Zvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBi
b2FyZEZvcm1hdChMIlVuaWZvcm1SZXNvdXJjZUxvY2F0b3JXIik7CisgICAgc3RhdGljIEZPUk1B
VEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xP
QkFMfTsKKyAgICByZXR1cm4gJnVybEZvcm1hdDsKK30KKworRk9STUFURVRDKiB1cmxGb3JtYXQo
KQoreworICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJVbmlm
b3JtUmVzb3VyY2VMb2NhdG9yIik7CisgICAgc3RhdGljIEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7
Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4g
JnVybEZvcm1hdDsKK30KKworRk9STUFURVRDKiBwbGFpblRleHRGb3JtYXQoKQoreworICAgIHN0
YXRpYyBGT1JNQVRFVEMgdGV4dEZvcm1hdCA9IHtDRl9URVhULCAwLCBEVkFTUEVDVF9DT05URU5U
LCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ0ZXh0Rm9ybWF0OworfQorCitGT1JN
QVRFVEMqIHBsYWluVGV4dFdGb3JtYXQoKQoreworICAgIHN0YXRpYyBGT1JNQVRFVEMgdGV4dEZv
cm1hdCA9IHtDRl9VTklDT0RFVEVYVCwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hH
TE9CQUx9OworICAgIHJldHVybiAmdGV4dEZvcm1hdDsKK30KKworRk9STUFURVRDKiBmaWxlbmFt
ZVdGb3JtYXQoKQoreworICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3Jt
YXQoTCJGaWxlTmFtZVciKTsKKyAgICBzdGF0aWMgRk9STUFURVRDIHVybEZvcm1hdCA9IHtjZiwg
MCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdXJs
Rm9ybWF0OworfQorCitGT1JNQVRFVEMqIGZpbGVuYW1lRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMg
VUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiRmlsZU5hbWUiKTsKKyAgICBzdGF0
aWMgRk9STUFURVRDIHVybEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZ
TUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdXJsRm9ybWF0OworfQorCisvL01TSUUgSFRNTCBG
b3JtYXQKK0ZPUk1BVEVUQyogaHRtbEZvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBS
ZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIkhUTUwgRm9ybWF0Iik7CisgICAgc3RhdGljIEZPUk1B
VEVUQyBodG1sRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwgVFlNRURfSEdM
T0JBTH07CisgICAgcmV0dXJuICZodG1sRm9ybWF0OworfQorCitTdHJpbmcgZ2V0VVJMKElEYXRh
T2JqZWN0KiwgYm9vbCYsIFN0cmluZyopCit7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitT
dHJpbmcgZ2V0UGxhaW5UZXh0KElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBib29sJiBzdWNjZXNz
KQoreworICAgIFNUR01FRElVTSBzdG9yZTsKKyAgICBTdHJpbmcgdGV4dDsKKyAgICBzdWNjZXNz
ID0gZmFsc2U7CisgICAgaWYgKFNVQ0NFRURFRChkYXRhT2JqZWN0LT5HZXREYXRhKHBsYWluVGV4
dFdGb3JtYXQoKSwgJnN0b3JlKSkpIHsKKyAgICAgICAgLy91bmljb2RlIHRleHQKKyAgICAgICAg
VUNoYXIqIGRhdGEgPSAoVUNoYXIqKUdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAg
IHRleHQgPSBTdHJpbmcoZGF0YSk7CisgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFs
KTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAgICBzdWNjZXNzID0g
dHJ1ZTsKKyAgICB9IGVsc2UgaWYgKFNVQ0NFRURFRChkYXRhT2JqZWN0LT5HZXREYXRhKHBsYWlu
VGV4dEZvcm1hdCgpLCAmc3RvcmUpKSkgeworICAgICAgICAvL2FzY2lpIHRleHQKKyAgICAgICAg
Y2hhciogZGF0YSA9IChjaGFyKilHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICB0
ZXh0ID0gU3RyaW5nKGRhdGEpOworICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7
CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKKyAgICAgICAgc3VjY2VzcyA9IHRy
dWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy9JZiBhIGZpbGUgaXMgZHJvcHBlZCBvbiB0aGUg
d2luZG93LCBpdCBkb2VzIG5vdCBwcm92aWRlIGVpdGhlciBvZiB0aGUKKyAgICAgICAgLy9wbGFp
biB0ZXh0IGZvcm1hdHMsIHNvIGhlcmUgd2UgdHJ5IHRvIGZvcmNpYmx5IGdldCBhIHVybC4KKyAg
ICAgICAgdGV4dCA9IGdldFVSTChkYXRhT2JqZWN0LCBzdWNjZXNzKTsKKyAgICAgICAgc3VjY2Vz
cyA9IHRydWU7CisgICAgfQorICAgIHJldHVybiB0ZXh0OworfQorCitQYXNzUmVmUHRyPERvY3Vt
ZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJvbUZpbGVuYW1lcyhEb2N1bWVudCosIGNvbnN0IElEYXRh
T2JqZWN0KikKK3sKKyAgICAvL0ZJWE1FOiBXZSBzaG91bGQgYmUgYWJsZSB0byBjcmVhdGUgZnJh
Z21lbnRzIGZyb20gZmlsZXMKKyAgICByZXR1cm4gMDsKK30KKworYm9vbCBjb250YWluc0ZpbGVu
YW1lcyhjb25zdCBJRGF0YU9iamVjdCopCit7CisgICAgLy9GSVhNRTogV2UnbGwgd2FudCB0byB1
cGRhdGUgdGhpcyBvbmNlIHdlIGNhbiBwcm9kdWNlIGZyYWdtZW50cyBmcm9tIGZpbGVzCisgICAg
cmV0dXJuIGZhbHNlOworfQorCisvL0NvbnZlcnQgYSBTdHJpbmcgY29udGFpbmluZyBDRl9IVE1M
IGZvcm1hdHRlZCB0ZXh0IHRvIGEgRG9jdW1lbnRGcmFnbWVudAorUGFzc1JlZlB0cjxEb2N1bWVu
dEZyYWdtZW50PiBmcmFnbWVudEZyb21DRl9IVE1MKERvY3VtZW50KiBkb2MsIGNvbnN0IFN0cmlu
ZyYgY2ZfaHRtbCkKK3sKKyAgICAvLyBvYnRhaW4gYmFzZVVSTCBpZiBwcmVzZW50CisgICAgU3Ry
aW5nIHNyY1VSTFN0cigic291cmNlVVJMOiIpOworICAgIFN0cmluZyBzcmNVUkw7CisgICAgdW5z
aWduZWQgbGluZVN0YXJ0ID0gY2ZfaHRtbC5maW5kKHNyY1VSTFN0ciwgMCwgZmFsc2UpOworICAg
IGlmIChsaW5lU3RhcnQgIT0gLTEpIHsKKyAgICAgICAgdW5zaWduZWQgc3JjRW5kID0gY2ZfaHRt
bC5maW5kKCJcbiIsIGxpbmVTdGFydCwgZmFsc2UpOworICAgICAgICB1bnNpZ25lZCBzcmNTdGFy
dCA9IGxpbmVTdGFydCtzcmNVUkxTdHIubGVuZ3RoKCk7CisgICAgICAgIFN0cmluZyByYXdTcmNV
UkwgPSBjZl9odG1sLnN1YnN0cmluZyhzcmNTdGFydCwgc3JjRW5kLXNyY1N0YXJ0KTsKKyAgICAg
ICAgcmVwbGFjZU5CU1BXaXRoU3BhY2UocmF3U3JjVVJMKTsKKyAgICAgICAgc3JjVVJMID0gcmF3
U3JjVVJMLnN0cmlwV2hpdGVTcGFjZSgpOworICAgIH0KKworICAgIC8vIGZpbmQgdGhlIG1hcmt1
cCBiZXR3ZWVuICI8IS0tU3RhcnRGcmFnbWVudCAtLT4iIGFuZCAiPCEtLUVuZEZyYWdtZW50IC0t
PiIsIGFjY291bnRpbmcgZm9yIGJyb3dzZXIgcXVpcmtzCisgICAgdW5zaWduZWQgbWFya3VwU3Rh
cnQgPSBjZl9odG1sLmZpbmQoIjxodG1sIiwgMCwgZmFsc2UpOworICAgIHVuc2lnbmVkIHRhZ1N0
YXJ0ID0gY2ZfaHRtbC5maW5kKCJzdGFydGZyYWdtZW50IiwgbWFya3VwU3RhcnQsIGZhbHNlKTsK
KyAgICB1bnNpZ25lZCBmcmFnbWVudFN0YXJ0ID0gY2ZfaHRtbC5maW5kKCc+JywgdGFnU3RhcnQp
ICsgMTsKKyAgICB1bnNpZ25lZCB0YWdFbmQgPSBjZl9odG1sLmZpbmQoImVuZGZyYWdtZW50Iiwg
ZnJhZ21lbnRTdGFydCwgZmFsc2UpOworICAgIHVuc2lnbmVkIGZyYWdtZW50RW5kID0gY2ZfaHRt
bC5yZXZlcnNlRmluZCgnPCcsIHRhZ0VuZCk7CisgICAgU3RyaW5nIG1hcmt1cCA9IGNmX2h0bWwu
c3Vic3RyaW5nKGZyYWdtZW50U3RhcnQsIGZyYWdtZW50RW5kIC0gZnJhZ21lbnRTdGFydCkuc3Ry
aXBXaGl0ZVNwYWNlKCk7CisKKyAgICByZXR1cm4gY3JlYXRlRnJhZ21lbnRGcm9tTWFya3VwKGRv
YywgbWFya3VwLCBzcmNVUkwpLnJlbGVhc2VSZWYoKTsKK30KKworCitQYXNzUmVmUHRyPERvY3Vt
ZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJvbUhUTUwoRG9jdW1lbnQqIGRvYywgSURhdGFPYmplY3Qq
IGRhdGEpCit7CisgICAgaWYgKCFkb2MgfHwgIWRhdGEpCisgICAgICAgIHJldHVybiAwOworCisg
ICAgU1RHTUVESVVNIHN0b3JlOworICAgIFN0cmluZyBodG1sOworICAgIFN0cmluZyBzcmNVUkw7
CisgICAgaWYgKFNVQ0NFRURFRChkYXRhLT5HZXREYXRhKGh0bWxGb3JtYXQoKSwgJnN0b3JlKSkp
IHsKKyAgICAgICAgLy9NUyBIVE1MIEZvcm1hdCBwYXJzaW5nCisgICAgICAgIGNoYXIqIGRhdGEg
PSAoY2hhciopR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgU0laRV9UIGRhdGFT
aXplID0gOjpHbG9iYWxTaXplKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBTdHJpbmcgY2ZfaHRt
bChVVEY4RW5jb2RpbmcoKS5kZWNvZGUoZGF0YSwgZGF0YVNpemUpKTsKKyAgICAgICAgR2xvYmFs
VW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7
CisgICAgICAgIGlmIChQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gZnJh
Z21lbnRGcm9tQ0ZfSFRNTChkb2MsIGNmX2h0bWwpKQorICAgICAgICAgICAgcmV0dXJuIGZyYWdt
ZW50OworICAgIH0KKyAgICBpZiAoU1VDQ0VFREVEKGRhdGEtPkdldERhdGEodGV4dEh0bWxGb3Jt
YXQoKSwgJnN0b3JlKSkpIHsKKyAgICAgICAgLy9yYXcgaHRtbAorICAgICAgICBVQ2hhciogZGF0
YSA9IChVQ2hhciopR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgaHRtbCA9IFN0
cmluZyhkYXRhKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAg
ICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgICAgIHJldHVybiBjcmVhdGVGcmFnbWVu
dEZyb21NYXJrdXAoZG9jLCBodG1sLCBzcmNVUkwpOworICAgIH0KKworICAgIHJldHVybiAwOwor
fQorCitib29sIGNvbnRhaW5zSFRNTChJRGF0YU9iamVjdCogZGF0YSkKK3sKKyAgICByZXR1cm4g
U1VDQ0VFREVEKGRhdGEtPlF1ZXJ5R2V0RGF0YSh0ZXh0SHRtbEZvcm1hdCgpKSkgfHwgU1VDQ0VF
REVEKGRhdGEtPlF1ZXJ5R2V0RGF0YShodG1sRm9ybWF0KCkpKTsKK30KKworfSAvLyBuYW1lc3Bh
Y2UgV2ViQ29yZQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRX
aW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmNwcApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTI3MzAyCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5jcHAKQEAgLTAsMCArMSwx
MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ2xpcGJvYXJkV2luY2UuaCIKKworbmFtZXNw
YWNlIFdlYkNvcmUgeworCitDbGlwYm9hcmRXaW5jZTo6Q2xpcGJvYXJkV2luY2UoQ2xpcGJvYXJk
QWNjZXNzUG9saWN5IHBvbGljeSwgYm9vbCBpc0ZvckRyYWdnaW5nKQorOiBDbGlwYm9hcmQocG9s
aWN5LCBpc0ZvckRyYWdnaW5nKQoreworfQorCitDbGlwYm9hcmRXaW5jZTo6fkNsaXBib2FyZFdp
bmNlKCkKK3sKK30KKwordm9pZCBDbGlwYm9hcmRXaW5jZTo6Y2xlYXJEYXRhKGNvbnN0IFN0cmlu
ZyYgdHlwZSkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIENsaXBib2FyZFdp
bmNlOjpjbGVhckFsbERhdGEoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK1N0cmlu
ZyBDbGlwYm9hcmRXaW5jZTo6Z2V0RGF0YShjb25zdCBTdHJpbmcmIHR5cGUsIGJvb2wmIHN1Y2Nl
c3MpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7
Cit9CisKK2Jvb2wgQ2xpcGJvYXJkV2luY2U6OnNldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBj
b25zdCBTdHJpbmcmIGRhdGEpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4g
ZmFsc2U7Cit9CisKKy8vIGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCitIYXNoU2V0PFN0cmlu
Zz4gQ2xpcGJvYXJkV2luY2U6OnR5cGVzKCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgp
OworICAgIHJldHVybiBIYXNoU2V0PFN0cmluZz4oKTsKK30KKwordm9pZCBDbGlwYm9hcmRXaW5j
ZTo6c2V0RHJhZ0ltYWdlKENhY2hlZEltYWdlKiwgY29uc3QgSW50UG9pbnQmKQoreworICAgIG5v
dEltcGxlbWVudGVkKCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OnNldERyYWdJbWFnZUVs
ZW1lbnQoTm9kZSosIGNvbnN0IEludFBvaW50JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOwor
fQorCisvL1Byb3ZpZGVzIHRoZSBET00gc3BlY2lmaWVkCitEcmFnSW1hZ2VSZWYgQ2xpcGJvYXJk
V2luY2U6OmNyZWF0ZURyYWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3QKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBEcmFnSW1hZ2VSZWYoKTsKK30KKwordm9pZCBD
bGlwYm9hcmRXaW5jZTo6ZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdlKEVsZW1lbnQqLCBjb25zdCBL
VVJMJiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqKQoreworICAgIG5vdEltcGxlbWVudGVk
KCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OndyaXRlVVJMKGNvbnN0IEtVUkwmLCBjb25z
dCBTdHJpbmcmLCBGcmFtZSopCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBD
bGlwYm9hcmRXaW5jZTo6d3JpdGVSYW5nZShSYW5nZSosIEZyYW1lKikKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworfQorCitib29sIENsaXBib2FyZFdpbmNlOjpoYXNEYXRhKCkKK3sKKyAgICBu
b3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBmYWxzZTsKK30KKworUGFzc1JlZlB0cjxGaWxl
TGlzdD4gQ2xpcGJvYXJkV2luY2U6OmZpbGVzKCkgY29uc3QKK3sKKyAgICBub3RJbXBsZW1lbnRl
ZCgpOworICAgIHJldHVybiAwOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmggYi9XZWJDb3JlL3Bs
YXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uMjQ4Y2JmMgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvQ2xpcGJvYXJkV2luY2UuaApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQg
dW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGlj
ZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVy
CisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBo
b3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7
IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZ
IG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlv
dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwg
UHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9u
LCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2lmbmRlZiBDbGlwYm9hcmRXaW5jZV9oCisj
ZGVmaW5lIENsaXBib2FyZFdpbmNlX2gKKworI2luY2x1ZGUgIkNsaXBib2FyZC5oIgorI2luY2x1
ZGUgIkZpbGVMaXN0LmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIENsaXBi
b2FyZFdpbmNlIDogcHVibGljIENsaXBib2FyZCwgcHVibGljIENhY2hlZFJlc291cmNlQ2xpZW50
IHsKKyAgICBwdWJsaWM6CisgICAgICAgIENsaXBib2FyZFdpbmNlKENsaXBib2FyZEFjY2Vzc1Bv
bGljeSBwb2xpY3ksIGJvb2wgaXNGb3JEcmFnZ2luZyk7CisgICAgICAgIH5DbGlwYm9hcmRXaW5j
ZSgpOworCisgICAgICAgIHZvaWQgY2xlYXJEYXRhKGNvbnN0IFN0cmluZyYgdHlwZSk7CisgICAg
ICAgIHZvaWQgY2xlYXJBbGxEYXRhKCk7CisgICAgICAgIFN0cmluZyBnZXREYXRhKGNvbnN0IFN0
cmluZyYgdHlwZSwgYm9vbCYgc3VjY2VzcykgY29uc3Q7CisgICAgICAgIGJvb2wgc2V0RGF0YShj
b25zdCBTdHJpbmcmIHR5cGUsIGNvbnN0IFN0cmluZyYgZGF0YSk7CisKKyAgICAgICAgLy8gZXh0
ZW5zaW9ucyBiZXlvbmQgSUUncyBBUEkKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IHR5cGVzKCkg
Y29uc3Q7CisKKyAgICAgICAgdm9pZCBzZXREcmFnSW1hZ2UoQ2FjaGVkSW1hZ2UqLCBjb25zdCBJ
bnRQb2ludCYpOworICAgICAgICB2b2lkIHNldERyYWdJbWFnZUVsZW1lbnQoTm9kZSosIGNvbnN0
IEludFBvaW50Jik7CisKKyAgICAgICAgdmlydHVhbCBEcmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0lt
YWdlKEludFBvaW50JiBkcmFnTG9jKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGRlY2xh
cmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiwgY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYg
dGl0bGUsIEZyYW1lKik7CisgICAgICAgIHZpcnR1YWwgdm9pZCB3cml0ZVVSTChjb25zdCBLVVJM
JiwgY29uc3QgU3RyaW5nJiwgRnJhbWUqKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHdyaXRlUmFu
Z2UoUmFuZ2UqLCBGcmFtZSopOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBoYXNEYXRhKCk7Cisg
ICAgICAgIHZpcnR1YWwgUGFzc1JlZlB0cjxGaWxlTGlzdD4gZmlsZXMoKSBjb25zdDsKKyAgICB9
OworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZiAvLyBDbGlwYm9hcmRXaW5jZV9o
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34374</attachid>
            <date>2009-08-08 10:53:28 -0700</date>
            <delta_ts>2009-08-12 12:52:48 -0700</delta_ts>
            <desc>1) Clipboard</desc>
            <filename>27543_1.patch</filename>
            <type>text/plain</type>
            <size>17732</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uNThlN2RjZCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAwOS0wOC0wOCAgSm9lIE1hc29uICA8
am9lLm1hc29uQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBBZGQgV0lOQ0UgZmlsZXMgZm9yIENsaXBi
b2FyZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1
NDMKKworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNw
cDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5oOiBBZGRlZC4K
KwogMjAwOS0wOC0wNiAgWW9uZyBMaSAgPHlvbmcubGlAdG9yY2htb2JpbGUuY29tPgogCiAgICAg
ICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NApp
bmRleCAwMDAwMDAwLi40M2MxMmIxCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5jZS5jcHAKQEAgLTAsMCArMSwzNDMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBwbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIs
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ2xpcGJvYXJkVXRpbGl0aWVzV2lu
LmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudC5o
IgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQbGF0Zm9ybVN0cmluZy5oIgorI2luY2x1
ZGUgIlRleHRFbmNvZGluZy5oIgorI2luY2x1ZGUgIm1hcmt1cC5oIgorI2luY2x1ZGUgPHNobHdh
cGkuaD4KKyNpbmNsdWRlIDx3aW5pbmV0Lmg+ICAgIC8vIGZvciBJTlRFUk5FVF9NQVhfVVJMX0xF
TkdUSAorCit0eXBlZGVmIEhBTkRMRSBIRFJPUDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitz
dGF0aWMgYm9vbCBnZXRXZWJMb2NEYXRhKElEYXRhT2JqZWN0KiBkYXRhT2JqZWN0LCBTdHJpbmcm
IHVybCwgU3RyaW5nKiB0aXRsZSkKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBT
dHJpbmcgZXh0cmFjdFVSTChjb25zdCBTdHJpbmcgJmluVVJMLCBTdHJpbmcqIHRpdGxlKQorewor
ICAgIFN0cmluZyB1cmwgPSBpblVSTDsKKyAgICBpbnQgc3BsaXRMb2MgPSB1cmwuZmluZCgnXG4n
KTsKKyAgICBpZiAoc3BsaXRMb2MgPiAwKSB7CisgICAgICAgIGlmICh0aXRsZSkKKyAgICAgICAg
ICAgICp0aXRsZSA9IHVybC5zdWJzdHJpbmcoc3BsaXRMb2MgKyAxKTsKKyAgICAgICAgdXJsLnRy
dW5jYXRlKHNwbGl0TG9jKTsKKyAgICB9IGVsc2UgaWYgKHRpdGxlKQorICAgICAgICAqdGl0bGUg
PSB1cmw7CisgICAgcmV0dXJuIHVybDsKK30KKworLy9GaXJlZm94IHRleHQvaHRtbAorc3RhdGlj
IEZPUk1BVEVUQyogdGV4dEh0bWxGb3JtYXQoKQoreworICAgIHN0YXRpYyBVSU5UIGNmID0gUmVn
aXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJ0ZXh0L2h0bWwiKTsKKyAgICBzdGF0aWMgRk9STUFURVRD
IHRleHRIdG1sRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwgVFlNRURfSEdM
T0JBTH07CisgICAgcmV0dXJuICZ0ZXh0SHRtbEZvcm1hdDsKK30KKworSEdMT0JBTCBjcmVhdGVH
bG9iYWxEYXRhKGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSkKK3sKKyAgICBT
dHJpbmcgbXV0YWJsZVVSTCh1cmwuc3RyaW5nKCkpOworICAgIFN0cmluZyBtdXRhYmxlVGl0bGUo
dGl0bGUpOworICAgIFNJWkVfVCBzaXplID0gbXV0YWJsZVVSTC5sZW5ndGgoKSArIG11dGFibGVU
aXRsZS5sZW5ndGgoKSArIDI7ICAvLyArMSBmb3IgIlxuIiBhbmQgKzEgZm9yIG51bGwgdGVybWlu
YXRvcgorICAgIEhHTE9CQUwgY2JEYXRhID0gR2xvYmFsQWxsb2MoR1BUUiwgc2l6ZSAqIHNpemVv
ZihVQ2hhcikpOworCisgICAgaWYgKGNiRGF0YSkgeworICAgICAgICBQV1NUUiBidWZmZXIgPSAo
UFdTVFIpR2xvYmFsTG9jayhjYkRhdGEpOworICAgICAgICBfc253cHJpbnRmKGJ1ZmZlciwgc2l6
ZSwgTCIlc1xuJXMiLCBtdXRhYmxlVVJMLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCks
IG11dGFibGVUaXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKyAgICAgICAg
R2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgfQorICAgIHJldHVybiBjYkRhdGE7Cit9CisKK0hH
TE9CQUwgY3JlYXRlR2xvYmFsRGF0YShjb25zdCBTdHJpbmcmIHN0cikKK3sKKyAgICBIR0xPQkFM
IGdsb2JhbERhdGEgPSA6Okdsb2JhbEFsbG9jKEdQVFIsIChzdHIubGVuZ3RoKCkgKyAxKSAqIHNp
emVvZihVQ2hhcikpOworICAgIGlmICghZ2xvYmFsRGF0YSkKKyAgICAgICAgcmV0dXJuIDA7Cisg
ICAgVUNoYXIqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PFVDaGFyKj4oR2xvYmFsTG9jayhnbG9iYWxE
YXRhKSk7CisgICAgbWVtY3B5KGJ1ZmZlciwgc3RyLmNoYXJhY3RlcnMoKSwgc3RyLmxlbmd0aCgp
ICogc2l6ZW9mKFVDaGFyKSk7CisgICAgYnVmZmVyW3N0ci5sZW5ndGgoKV0gPSAwOworICAgIEds
b2JhbFVubG9jayhnbG9iYWxEYXRhKTsKKyAgICByZXR1cm4gZ2xvYmFsRGF0YTsKK30KKworSEdM
T0JBTCBjcmVhdGVHbG9iYWxEYXRhKGNvbnN0IFZlY3RvcjxjaGFyPiYgdmVjdG9yKQoreworICAg
IEhHTE9CQUwgZ2xvYmFsRGF0YSA9IEdsb2JhbEFsbG9jKEdQVFIsIHZlY3Rvci5zaXplKCkgKyAx
KTsKKyAgICBpZiAoIWdsb2JhbERhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIGNoYXIqIGJ1
ZmZlciA9IHN0YXRpY19jYXN0PGNoYXIqPihHbG9iYWxMb2NrKGdsb2JhbERhdGEpKTsKKyAgICBt
ZW1jcHkoYnVmZmVyLCB2ZWN0b3IuZGF0YSgpLCB2ZWN0b3Iuc2l6ZSgpKTsKKyAgICBidWZmZXJb
dmVjdG9yLnNpemUoKV0gPSAwOworICAgIEdsb2JhbFVubG9jayhnbG9iYWxEYXRhKTsKKyAgICBy
ZXR1cm4gZ2xvYmFsRGF0YTsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kKFZlY3RvcjxjaGFyPiYg
dmVjdG9yLCBjb25zdCBjaGFyKiBzdHJpbmcpCit7CisgICAgdmVjdG9yLmFwcGVuZChzdHJpbmcs
IHN0cmxlbihzdHJpbmcpKTsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kKFZlY3RvcjxjaGFyPiYg
dmVjdG9yLCBjb25zdCBDU3RyaW5nJiBzdHJpbmcpCit7CisgICAgdmVjdG9yLmFwcGVuZChzdHJp
bmcuZGF0YSgpLCBzdHJpbmcubGVuZ3RoKCkpOworfQorCisvLyBEb2N1bWVudGF0aW9uIGZvciB0
aGUgQ0ZfSFRNTCBmb3JtYXQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5j
b20vd29ya3Nob3AvbmV0d29ya2luZy9jbGlwYm9hcmQvaHRtbGNsaXBib2FyZC5hc3AKK3ZvaWQg
bWFya3VwVG9DRl9IVE1MKGNvbnN0IFN0cmluZyYgbWFya3VwLCBjb25zdCBTdHJpbmcmIHNyY1VS
TCwgVmVjdG9yPGNoYXI+JiByZXN1bHQpCit7CisgICAgaWYgKCFtYXJrdXAubGVuZ3RoKCkpCisg
ICAgICAgIHJldHVybjsKKworICAgIENTdHJpbmcgY2ZfaHRtbCA9ICJWZXJzaW9uOjAuOSI7Cisg
ICAgQ1N0cmluZyBzdGFydEhUTUwgPSAiXG5TdGFydEhUTUw6IjsKKyAgICBDU3RyaW5nIGVuZEhU
TUwgPSAiXG5FbmRIVE1MOiI7CisgICAgQ1N0cmluZyBzdGFydEZyYWdtZW50ID0gIlxuU3RhcnRG
cmFnbWVudDoiOworICAgIENTdHJpbmcgZW5kRnJhZ21lbnQgPSAiXG5FbmRGcmFnbWVudDoiOwor
ICAgIENTdHJpbmcgc291cmNlVVJMID0gIlxuU291cmNlVVJMOiI7CisKKyAgICBhcHBlbmQocmVz
dWx0LCBjZl9odG1sKTsKKworICAgIGJvb2wgc2hvdWxkRmlsbFNvdXJjZVVSTCA9ICFzcmNVUkwu
aXNFbXB0eSgpICYmIChzcmNVUkwgIT0gImFib3V0OmJsYW5rIik7CisKKyAgICBDU3RyaW5nIHN0
YXJ0TWFya3VwID0gIlxuPEhUTUw+XG48Qk9EWT5cbjwhLS1TdGFydEZyYWdtZW50LS0+XG4iOwor
ICAgIENTdHJpbmcgZW5kTWFya3VwID0gIlxuPCEtLUVuZEZyYWdtZW50LS0+XG48L0JPRFk+XG48
L0hUTUw+IjsKKworICAgIC8vIGNhbGN1bGF0ZSBvZmZzZXRzCisgICAgY29uc3QgdW5zaWduZWQg
VUlOVF9NQVhkaWdpdHMgPSAxMDsgLy8gbnVtYmVyIG9mIGRpZ2l0cyBpbiBVSU5UX01BWCBpbiBi
YXNlIDEwCisgICAgdW5zaWduZWQgc3RhcnRIVE1MT2Zmc2V0ID0gY2ZfaHRtbC5sZW5ndGgoKSAr
IHN0YXJ0SFRNTC5sZW5ndGgoKSArIGVuZEhUTUwubGVuZ3RoKCkgKyBzdGFydEZyYWdtZW50Lmxl
bmd0aCgpICsgZW5kRnJhZ21lbnQubGVuZ3RoKCkgKyAoc2hvdWxkRmlsbFNvdXJjZVVSTCA/IHNv
dXJjZVVSTC5sZW5ndGgoKSArIHNyY1VSTC5sZW5ndGgoKSA6IDApICsgKDQgKiBVSU5UX01BWGRp
Z2l0cyk7CisgICAgdW5zaWduZWQgc3RhcnRGcmFnbWVudE9mZnNldCA9IHN0YXJ0SFRNTE9mZnNl
dCArIHN0YXJ0TWFya3VwLmxlbmd0aCgpOworICAgIENTdHJpbmcgbWFya3VwVVRGOCA9IG1hcmt1
cC51dGY4KCk7CisgICAgdW5zaWduZWQgZW5kRnJhZ21lbnRPZmZzZXQgPSBzdGFydEZyYWdtZW50
T2Zmc2V0ICsgbWFya3VwVVRGOC5sZW5ndGgoKTsKKyAgICB1bnNpZ25lZCBlbmRIVE1MT2Zmc2V0
ID0gZW5kRnJhZ21lbnRPZmZzZXQgKyBlbmRNYXJrdXAubGVuZ3RoKCk7CisKKyAgICAvLyBjcmVh
dGUgZnVsbCByZXN1bHQgc3RyaW5nIGZyb20gdGhlIGZyYWdtZW50cworICAgIGFwcGVuZChyZXN1
bHQsIHN0YXJ0SFRNTCk7CisgICAgYXBwZW5kKHJlc3VsdCwgU3RyaW5nOjpmb3JtYXQoIiUwMTB1
Iiwgc3RhcnRIVE1MT2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAgICBhcHBlbmQocmVzdWx0LCBl
bmRIVE1MKTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZvcm1hdCgiJTAxMHUiLCBlbmRI
VE1MT2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAgICBhcHBlbmQocmVzdWx0LCBzdGFydEZyYWdt
ZW50KTsKKyAgICBhcHBlbmQocmVzdWx0LCBTdHJpbmc6OmZvcm1hdCgiJTAxMHUiLCBzdGFydEZy
YWdtZW50T2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAgICBhcHBlbmQocmVzdWx0LCBlbmRGcmFn
bWVudCk7CisgICAgYXBwZW5kKHJlc3VsdCwgU3RyaW5nOjpmb3JtYXQoIiUwMTB1IiwgZW5kRnJh
Z21lbnRPZmZzZXQpLnV0ZjgoKS5kYXRhKCkpOworICAgIGlmIChzaG91bGRGaWxsU291cmNlVVJM
KSB7CisgICAgICAgIGFwcGVuZChyZXN1bHQsIHNvdXJjZVVSTCk7CisgICAgICAgIGFwcGVuZChy
ZXN1bHQsIHNyY1VSTC51dGY4KCkuZGF0YSgpKTsKKyAgICB9CisgICAgYXBwZW5kKHJlc3VsdCwg
c3RhcnRNYXJrdXApOworICAgIGFwcGVuZChyZXN1bHQsIG1hcmt1cFVURjguZGF0YSgpKTsKKyAg
ICBhcHBlbmQocmVzdWx0LCBlbmRNYXJrdXApOworfQorCitTdHJpbmcgdXJsVG9NYXJrdXAoY29u
c3QgS1VSTCYgdXJsLCBjb25zdCBTdHJpbmcmIHRpdGxlKQoreworICAgIFN0cmluZyBtYXJrdXAo
IjxhIGhyZWY9XCIiKTsKKyAgICBtYXJrdXAuYXBwZW5kKHVybC5zdHJpbmcoKSk7CisgICAgbWFy
a3VwLmFwcGVuZCgiXCI+Iik7CisgICAgbWFya3VwLmFwcGVuZCh0aXRsZSk7CisgICAgbWFya3Vw
LmFwcGVuZCgiPC9hPiIpOworICAgIHJldHVybiBtYXJrdXA7Cit9CisKK3ZvaWQgcmVwbGFjZU5l
d2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVzKFN0cmluZyYgc3RyKQoreworICAgIHN0YXRp
YyBjb25zdCBVQ2hhciBOZXdsaW5lID0gJ1xuJzsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nIFdp
bmRvd3NOZXdsaW5lKCJcclxuIik7CisgICAgc3RyLnJlcGxhY2UoTmV3bGluZSwgV2luZG93c05l
d2xpbmUpOworfQorCit2b2lkIHJlcGxhY2VOQlNQV2l0aFNwYWNlKFN0cmluZyYgc3RyKQorewor
ICAgIHN0YXRpYyBjb25zdCBVQ2hhciBOb25CcmVha2luZ1NwYWNlQ2hhcmFjdGVyID0gMHhBMDsK
KyAgICBzdGF0aWMgY29uc3QgVUNoYXIgU3BhY2VDaGFyYWN0ZXIgPSAnICc7CisgICAgc3RyLnJl
cGxhY2UoTm9uQnJlYWtpbmdTcGFjZUNoYXJhY3RlciwgU3BhY2VDaGFyYWN0ZXIpOworfQorCitG
T1JNQVRFVEMqIHVybFdGb3JtYXQoKQoreworICAgIHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJD
bGlwYm9hcmRGb3JtYXQoTCJVbmlmb3JtUmVzb3VyY2VMb2NhdG9yVyIpOworICAgIHN0YXRpYyBG
T1JNQVRFVEMgdXJsRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwgVFlNRURf
SEdMT0JBTH07CisgICAgcmV0dXJuICZ1cmxGb3JtYXQ7Cit9CisKK0ZPUk1BVEVUQyogdXJsRm9y
bWF0KCkKK3sKKyAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwi
VW5pZm9ybVJlc291cmNlTG9jYXRvciIpOworICAgIHN0YXRpYyBGT1JNQVRFVEMgdXJsRm9ybWF0
ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0
dXJuICZ1cmxGb3JtYXQ7Cit9CisKK0ZPUk1BVEVUQyogcGxhaW5UZXh0Rm9ybWF0KCkKK3sKKyAg
ICBzdGF0aWMgRk9STUFURVRDIHRleHRGb3JtYXQgPSB7Q0ZfVEVYVCwgMCwgRFZBU1BFQ1RfQ09O
VEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdGV4dEZvcm1hdDsKK30KKwor
Rk9STUFURVRDKiBwbGFpblRleHRXRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgRk9STUFURVRDIHRl
eHRGb3JtYXQgPSB7Q0ZfVU5JQ09ERVRFWFQsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1F
RF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnRleHRGb3JtYXQ7Cit9CisKK0ZPUk1BVEVUQyogZmls
ZW5hbWVXRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJk
Rm9ybWF0KEwiRmlsZU5hbWVXIik7CisgICAgc3RhdGljIEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7
Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4g
JnVybEZvcm1hdDsKK30KKworRk9STUFURVRDKiBmaWxlbmFtZUZvcm1hdCgpCit7CisgICAgc3Rh
dGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIkZpbGVOYW1lIik7CisgICAg
c3RhdGljIEZPUk1BVEVUQyB1cmxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0x
LCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnVybEZvcm1hdDsKK30KKworLy9NU0lFIEhU
TUwgRm9ybWF0CitGT1JNQVRFVEMqIGh0bWxGb3JtYXQoKQoreworICAgIHN0YXRpYyBVSU5UIGNm
ID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJIVE1MIEZvcm1hdCIpOworICAgIHN0YXRpYyBG
T1JNQVRFVEMgaHRtbEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVE
X0hHTE9CQUx9OworICAgIHJldHVybiAmaHRtbEZvcm1hdDsKK30KKworU3RyaW5nIGdldFVSTChJ
RGF0YU9iamVjdCosIGJvb2wmLCBTdHJpbmcqKQoreworICAgIHJldHVybiBTdHJpbmcoKTsKK30K
KworU3RyaW5nIGdldFBsYWluVGV4dChJRGF0YU9iamVjdCogZGF0YU9iamVjdCwgYm9vbCYgc3Vj
Y2VzcykKK3sKKyAgICBTVEdNRURJVU0gc3RvcmU7CisgICAgU3RyaW5nIHRleHQ7CisgICAgc3Vj
Y2VzcyA9IGZhbHNlOworICAgIGlmIChTVUNDRUVERUQoZGF0YU9iamVjdC0+R2V0RGF0YShwbGFp
blRleHRXRm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8vdW5pY29kZSB0ZXh0CisgICAg
ICAgIFVDaGFyKiBkYXRhID0gKFVDaGFyKilHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpOworICAg
ICAgICB0ZXh0ID0gU3RyaW5nKGRhdGEpOworICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEds
b2JhbCk7CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKKyAgICAgICAgc3VjY2Vz
cyA9IHRydWU7CisgICAgfSBlbHNlIGlmIChTVUNDRUVERUQoZGF0YU9iamVjdC0+R2V0RGF0YShw
bGFpblRleHRGb3JtYXQoKSwgJnN0b3JlKSkpIHsKKyAgICAgICAgLy9hc2NpaSB0ZXh0CisgICAg
ICAgIGNoYXIqIGRhdGEgPSAoY2hhciopR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAg
ICAgdGV4dCA9IFN0cmluZyhkYXRhKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3JlLmhHbG9i
YWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgICAgIHN1Y2Nlc3Mg
PSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vSWYgYSBmaWxlIGlzIGRyb3BwZWQgb24g
dGhlIHdpbmRvdywgaXQgZG9lcyBub3QgcHJvdmlkZSBlaXRoZXIgb2YgdGhlCisgICAgICAgIC8v
cGxhaW4gdGV4dCBmb3JtYXRzLCBzbyBoZXJlIHdlIHRyeSB0byBmb3JjaWJseSBnZXQgYSB1cmwu
CisgICAgICAgIHRleHQgPSBnZXRVUkwoZGF0YU9iamVjdCwgc3VjY2Vzcyk7CisgICAgICAgIHN1
Y2Nlc3MgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdGV4dDsKK30KKworUGFzc1JlZlB0cjxE
b2N1bWVudEZyYWdtZW50PiBmcmFnbWVudEZyb21GaWxlbmFtZXMoRG9jdW1lbnQqLCBjb25zdCBJ
RGF0YU9iamVjdCopCit7CisgICAgLy9GSVhNRTogV2Ugc2hvdWxkIGJlIGFibGUgdG8gY3JlYXRl
IGZyYWdtZW50cyBmcm9tIGZpbGVzCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgY29udGFpbnNG
aWxlbmFtZXMoY29uc3QgSURhdGFPYmplY3QqKQoreworICAgIC8vRklYTUU6IFdlJ2xsIHdhbnQg
dG8gdXBkYXRlIHRoaXMgb25jZSB3ZSBjYW4gcHJvZHVjZSBmcmFnbWVudHMgZnJvbSBmaWxlcwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworLy9Db252ZXJ0IGEgU3RyaW5nIGNvbnRhaW5pbmcgQ0Zf
SFRNTCBmb3JtYXR0ZWQgdGV4dCB0byBhIERvY3VtZW50RnJhZ21lbnQKK1Bhc3NSZWZQdHI8RG9j
dW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tQ0ZfSFRNTChEb2N1bWVudCogZG9jLCBjb25zdCBT
dHJpbmcmIGNmX2h0bWwpCit7CisgICAgLy8gb2J0YWluIGJhc2VVUkwgaWYgcHJlc2VudAorICAg
IFN0cmluZyBzcmNVUkxTdHIoInNvdXJjZVVSTDoiKTsKKyAgICBTdHJpbmcgc3JjVVJMOworICAg
IHVuc2lnbmVkIGxpbmVTdGFydCA9IGNmX2h0bWwuZmluZChzcmNVUkxTdHIsIDAsIGZhbHNlKTsK
KyAgICBpZiAobGluZVN0YXJ0ICE9IC0xKSB7CisgICAgICAgIHVuc2lnbmVkIHNyY0VuZCA9IGNm
X2h0bWwuZmluZCgiXG4iLCBsaW5lU3RhcnQsIGZhbHNlKTsKKyAgICAgICAgdW5zaWduZWQgc3Jj
U3RhcnQgPSBsaW5lU3RhcnQrc3JjVVJMU3RyLmxlbmd0aCgpOworICAgICAgICBTdHJpbmcgcmF3
U3JjVVJMID0gY2ZfaHRtbC5zdWJzdHJpbmcoc3JjU3RhcnQsIHNyY0VuZC1zcmNTdGFydCk7Cisg
ICAgICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHJhd1NyY1VSTCk7CisgICAgICAgIHNyY1VSTCA9
IHJhd1NyY1VSTC5zdHJpcFdoaXRlU3BhY2UoKTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHRoZSBt
YXJrdXAgYmV0d2VlbiAiPCEtLVN0YXJ0RnJhZ21lbnQgLS0+IiBhbmQgIjwhLS1FbmRGcmFnbWVu
dCAtLT4iLCBhY2NvdW50aW5nIGZvciBicm93c2VyIHF1aXJrcworICAgIHVuc2lnbmVkIG1hcmt1
cFN0YXJ0ID0gY2ZfaHRtbC5maW5kKCI8aHRtbCIsIDAsIGZhbHNlKTsKKyAgICB1bnNpZ25lZCB0
YWdTdGFydCA9IGNmX2h0bWwuZmluZCgic3RhcnRmcmFnbWVudCIsIG1hcmt1cFN0YXJ0LCBmYWxz
ZSk7CisgICAgdW5zaWduZWQgZnJhZ21lbnRTdGFydCA9IGNmX2h0bWwuZmluZCgnPicsIHRhZ1N0
YXJ0KSArIDE7CisgICAgdW5zaWduZWQgdGFnRW5kID0gY2ZfaHRtbC5maW5kKCJlbmRmcmFnbWVu
dCIsIGZyYWdtZW50U3RhcnQsIGZhbHNlKTsKKyAgICB1bnNpZ25lZCBmcmFnbWVudEVuZCA9IGNm
X2h0bWwucmV2ZXJzZUZpbmQoJzwnLCB0YWdFbmQpOworICAgIFN0cmluZyBtYXJrdXAgPSBjZl9o
dG1sLnN1YnN0cmluZyhmcmFnbWVudFN0YXJ0LCBmcmFnbWVudEVuZCAtIGZyYWdtZW50U3RhcnQp
LnN0cmlwV2hpdGVTcGFjZSgpOworCisgICAgcmV0dXJuIGNyZWF0ZUZyYWdtZW50RnJvbU1hcmt1
cChkb2MsIG1hcmt1cCwgc3JjVVJMKS5yZWxlYXNlUmVmKCk7Cit9CisKKworUGFzc1JlZlB0cjxE
b2N1bWVudEZyYWdtZW50PiBmcmFnbWVudEZyb21IVE1MKERvY3VtZW50KiBkb2MsIElEYXRhT2Jq
ZWN0KiBkYXRhKQoreworICAgIGlmICghZG9jIHx8ICFkYXRhKQorICAgICAgICByZXR1cm4gMDsK
KworICAgIFNUR01FRElVTSBzdG9yZTsKKyAgICBTdHJpbmcgaHRtbDsKKyAgICBTdHJpbmcgc3Jj
VVJMOworICAgIGlmIChTVUNDRUVERUQoZGF0YS0+R2V0RGF0YShodG1sRm9ybWF0KCksICZzdG9y
ZSkpKSB7CisgICAgICAgIC8vTVMgSFRNTCBGb3JtYXQgcGFyc2luZworICAgICAgICBjaGFyKiBk
YXRhID0gKGNoYXIqKUdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFNJWkVfVCBk
YXRhU2l6ZSA9IDo6R2xvYmFsU2l6ZShzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgU3RyaW5nIGNm
X2h0bWwoVVRGOEVuY29kaW5nKCkuZGVjb2RlKGRhdGEsIGRhdGFTaXplKSk7CisgICAgICAgIEds
b2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3Rv
cmUpOworICAgICAgICBpZiAoUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9
IGZyYWdtZW50RnJvbUNGX0hUTUwoZG9jLCBjZl9odG1sKSkKKyAgICAgICAgICAgIHJldHVybiBm
cmFnbWVudDsKKyAgICB9CisgICAgaWYgKFNVQ0NFRURFRChkYXRhLT5HZXREYXRhKHRleHRIdG1s
Rm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8vcmF3IGh0bWwKKyAgICAgICAgVUNoYXIq
IGRhdGEgPSAoVUNoYXIqKUdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIGh0bWwg
PSBTdHJpbmcoZGF0YSk7CisgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5oR2xvYmFsKTsKKyAg
ICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAgICByZXR1cm4gY3JlYXRlRnJh
Z21lbnRGcm9tTWFya3VwKGRvYywgaHRtbCwgc3JjVVJMKTsKKyAgICB9CisKKyAgICByZXR1cm4g
MDsKK30KKworYm9vbCBjb250YWluc0hUTUwoSURhdGFPYmplY3QqIGRhdGEpCit7CisgICAgcmV0
dXJuIFNVQ0NFRURFRChkYXRhLT5RdWVyeUdldERhdGEodGV4dEh0bWxGb3JtYXQoKSkpIHx8IFNV
Q0NFRURFRChkYXRhLT5RdWVyeUdldERhdGEoaHRtbEZvcm1hdCgpKSk7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJv
YXJkV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyNzMwMgotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwCkBAIC0wLDAg
KzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIElu
Yy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNsaXBib2FyZFdpbmNlLmgiCisKK25h
bWVzcGFjZSBXZWJDb3JlIHsKKworQ2xpcGJvYXJkV2luY2U6OkNsaXBib2FyZFdpbmNlKENsaXBi
b2FyZEFjY2Vzc1BvbGljeSBwb2xpY3ksIGJvb2wgaXNGb3JEcmFnZ2luZykKKzogQ2xpcGJvYXJk
KHBvbGljeSwgaXNGb3JEcmFnZ2luZykKK3sKK30KKworQ2xpcGJvYXJkV2luY2U6On5DbGlwYm9h
cmRXaW5jZSgpCit7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OmNsZWFyRGF0YShjb25zdCBT
dHJpbmcmIHR5cGUpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBDbGlwYm9h
cmRXaW5jZTo6Y2xlYXJBbGxEYXRhKCkKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitT
dHJpbmcgQ2xpcGJvYXJkV2luY2U6OmdldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBib29sJiBz
dWNjZXNzKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIFN0cmlu
ZygpOworfQorCitib29sIENsaXBib2FyZFdpbmNlOjpzZXREYXRhKGNvbnN0IFN0cmluZyYgdHlw
ZSwgY29uc3QgU3RyaW5nJiBkYXRhKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0
dXJuIGZhbHNlOworfQorCisvLyBleHRlbnNpb25zIGJleW9uZCBJRSdzIEFQSQorSGFzaFNldDxT
dHJpbmc+IENsaXBib2FyZFdpbmNlOjp0eXBlcygpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50
ZWQoKTsKKyAgICByZXR1cm4gSGFzaFNldDxTdHJpbmc+KCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJk
V2luY2U6OnNldERyYWdJbWFnZShDYWNoZWRJbWFnZSosIGNvbnN0IEludFBvaW50JikKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIENsaXBib2FyZFdpbmNlOjpzZXREcmFnSW1h
Z2VFbGVtZW50KE5vZGUqLCBjb25zdCBJbnRQb2ludCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQo
KTsKK30KKworLy9Qcm92aWRlcyB0aGUgRE9NIHNwZWNpZmllZAorRHJhZ0ltYWdlUmVmIENsaXBi
b2FyZFdpbmNlOjpjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdMb2MpIGNvbnN0Cit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gRHJhZ0ltYWdlUmVmKCk7Cit9CisKK3Zv
aWQgQ2xpcGJvYXJkV2luY2U6OmRlY2xhcmVBbmRXcml0ZURyYWdJbWFnZShFbGVtZW50KiwgY29u
c3QgS1VSTCYsIGNvbnN0IFN0cmluZyYgdGl0bGUsIEZyYW1lKikKK3sKKyAgICBub3RJbXBsZW1l
bnRlZCgpOworfQorCit2b2lkIENsaXBib2FyZFdpbmNlOjp3cml0ZVVSTChjb25zdCBLVVJMJiwg
Y29uc3QgU3RyaW5nJiwgRnJhbWUqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK3Zv
aWQgQ2xpcGJvYXJkV2luY2U6OndyaXRlUmFuZ2UoUmFuZ2UqLCBGcmFtZSopCit7CisgICAgbm90
SW1wbGVtZW50ZWQoKTsKK30KKworYm9vbCBDbGlwYm9hcmRXaW5jZTo6aGFzRGF0YSgpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Bhc3NSZWZQdHI8
RmlsZUxpc3Q+IENsaXBib2FyZFdpbmNlOjpmaWxlcygpIGNvbnN0Cit7CisgICAgbm90SW1wbGVt
ZW50ZWQoKTsKKyAgICByZXR1cm4gMDsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQpkaWZm
IC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5oIGIvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjI0OGNiZjIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0NsaXBib2FyZFdpbmNlLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNpZm5kZWYgQ2xpcGJvYXJkV2luY2Vf
aAorI2RlZmluZSBDbGlwYm9hcmRXaW5jZV9oCisKKyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKKyNp
bmNsdWRlICJGaWxlTGlzdC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyAgICBjbGFzcyBD
bGlwYm9hcmRXaW5jZSA6IHB1YmxpYyBDbGlwYm9hcmQsIHB1YmxpYyBDYWNoZWRSZXNvdXJjZUNs
aWVudCB7CisgICAgcHVibGljOgorICAgICAgICBDbGlwYm9hcmRXaW5jZShDbGlwYm9hcmRBY2Nl
c3NQb2xpY3kgcG9saWN5LCBib29sIGlzRm9yRHJhZ2dpbmcpOworICAgICAgICB+Q2xpcGJvYXJk
V2luY2UoKTsKKworICAgICAgICB2b2lkIGNsZWFyRGF0YShjb25zdCBTdHJpbmcmIHR5cGUpOwor
ICAgICAgICB2b2lkIGNsZWFyQWxsRGF0YSgpOworICAgICAgICBTdHJpbmcgZ2V0RGF0YShjb25z
dCBTdHJpbmcmIHR5cGUsIGJvb2wmIHN1Y2Nlc3MpIGNvbnN0OworICAgICAgICBib29sIHNldERh
dGEoY29uc3QgU3RyaW5nJiB0eXBlLCBjb25zdCBTdHJpbmcmIGRhdGEpOworCisgICAgICAgIC8v
IGV4dGVuc2lvbnMgYmV5b25kIElFJ3MgQVBJCisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiB0eXBl
cygpIGNvbnN0OworCisgICAgICAgIHZvaWQgc2V0RHJhZ0ltYWdlKENhY2hlZEltYWdlKiwgY29u
c3QgSW50UG9pbnQmKTsKKyAgICAgICAgdm9pZCBzZXREcmFnSW1hZ2VFbGVtZW50KE5vZGUqLCBj
b25zdCBJbnRQb2ludCYpOworCisgICAgICAgIHZpcnR1YWwgRHJhZ0ltYWdlUmVmIGNyZWF0ZURy
YWdJbWFnZShJbnRQb2ludCYgZHJhZ0xvYykgY29uc3Q7CisgICAgICAgIHZpcnR1YWwgdm9pZCBk
ZWNsYXJlQW5kV3JpdGVEcmFnSW1hZ2UoRWxlbWVudCosIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJp
bmcmIHRpdGxlLCBGcmFtZSopOworICAgICAgICB2aXJ0dWFsIHZvaWQgd3JpdGVVUkwoY29uc3Qg
S1VSTCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKik7CisgICAgICAgIHZpcnR1YWwgdm9pZCB3cml0
ZVJhbmdlKFJhbmdlKiwgRnJhbWUqKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFzRGF0YSgp
OworICAgICAgICB2aXJ0dWFsIFBhc3NSZWZQdHI8RmlsZUxpc3Q+IGZpbGVzKCkgY29uc3Q7Cisg
ICAgfTsKKworfSAvLyBuYW1lc3BhY2UgV2ViQ29yZQorCisjZW5kaWYgLy8gQ2xpcGJvYXJkV2lu
Y2VfaAo=
</data>
<flag name="review"
          id="18551"
          type_id="1"
          status="-"
          setter="staikos"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34375</attachid>
            <date>2009-08-08 10:58:41 -0700</date>
            <delta_ts>2009-09-01 18:12:09 -0700</delta_ts>
            <desc>2) ScrollView</desc>
            <filename>27543_2.patch</filename>
            <type>text/plain</type>
            <size>62134</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMjhhMWM3ZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMiBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEFkZCBTY3JvbGxWaWV3V2luY2UuY3BwCisgICAg
ICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzU0MworCisgICAg
ICAgICogcGxhdGZvcm0vd2luY2UvU2Nyb2xsVmlld1dpbmNlLmNwcDogQWRkZWQuCisgICAKIDIw
MDktMDgtMDYgIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
d2luY2UvU2Nyb2xsVmlld1dpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2Nyb2xs
Vmlld1dpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2M3ZDc0
Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TY3JvbGxWaWV3V2lu
Y2UuY3BwCkBAIC0wLDAgKzEsMTc1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAw
NywgMjAwOCBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDYgSnVzdGluIEhheWdvb2QgPGpoYXlnb29kQHNwc3UuZWR1Pi4KKyAqIENvcHlyaWdodCAo
QykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisjaW5jbHVkZSAiU2Nyb2xsVmlldy5oIgorCisjaW5jbHVkZSAiQ2hyb21lLmgiCisjaW5j
bHVkZSAiQ2hyb21lQ2xpZW50LmgiCisjaW5jbHVkZSAiRmxvYXRSZWN0LmgiCisjaW5jbHVkZSAi
RnJhbWUuaCIKKyNpbmNsdWRlICJGcmFtZVRyZWUuaCIKKyNpbmNsdWRlICJGcmFtZVZpZXcuaCIK
KyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbnRSZWN0LmgiCisjaW5j
bHVkZSAiUGFnZS5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUg
IlBsYXRmb3JtU2Nyb2xsYmFyLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1XaGVlbEV2ZW50LmgiCisj
aW5jbHVkZSAiUmVuZGVyVGhlbWUuaCIKKyNpbmNsdWRlICJSZW5kZXJXaWRnZXQuaCIKKyNpbmNs
dWRlICJTY3JvbGxiYXIuaCIKKyNpbmNsdWRlICJUcmFuc2Zvcm1hdGlvbk1hdHJpeC5oIgorI2lu
Y2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx3dGYvQXNzZXJ0aW9ucy5oPgorI2luY2x1ZGUg
PHd0Zi9IYXNoU2V0Lmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisjaWZkZWYgX0RFQlVHCisj
ZGVmaW5lIFNDUk9MTF9WSUVXX0RFQlVHICAgIDAKKyNlbmRpZgorCit1c2luZyBzdGQ6Om1pbjsK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisvLyBzdGFibGVSb3VuZCByb3VuZHMgLTAuNSB0byAw
LCB3aGVyZSBscm91bmQgcm91bmRzIC0wLjUgdG8gLTEuCitzdGF0aWMgaW5saW5lIGludCBzdGFi
bGVSb3VuZChkb3VibGUgZCkKK3sKKyAgICBpZiAoZCA+IDApCisgICAgICAgIHJldHVybiBzdGF0
aWNfY2FzdDxpbnQ+KGQgKyAwLjUpOworCisgICAgaW50IGkgPSBzdGF0aWNfY2FzdDxpbnQ+KGQp
OworICAgIHJldHVybiBpIC0gZCA+IDAuNSA/IGkgLSAxIDogaTsKK30KKworc3RhdGljIGlubGlu
ZSBJbnRQb2ludCBvcGVyYXRvciooY29uc3QgSW50UG9pbnQmIGEsIGRvdWJsZSBiKQoreworICAg
IHJldHVybiBJbnRQb2ludChzdGFibGVSb3VuZChhLngoKSAqIGIpLCBzdGFibGVSb3VuZChhLnko
KSAqIGIpKTsKK30KK3N0YXRpYyBpbmxpbmUgSW50UG9pbnQgb3BlcmF0b3IvKGNvbnN0IEludFBv
aW50JiBhLCBkb3VibGUgYikKK3sKKyAgICByZXR1cm4gSW50UG9pbnQoc3RhYmxlUm91bmQoYS54
KCkgLyBiKSwgc3RhYmxlUm91bmQoYS55KCkgLyBiKSk7Cit9CitzdGF0aWMgaW5saW5lIEludFNp
emUgb3BlcmF0b3IqKGNvbnN0IEludFNpemUmIGEsIGRvdWJsZSBiKQoreworICAgIHJldHVybiBJ
bnRTaXplKHN0YWJsZVJvdW5kKGEud2lkdGgoKSAqIGIpLCBzdGFibGVSb3VuZChhLmhlaWdodCgp
ICogYikpOworfQorc3RhdGljIGlubGluZSBJbnRTaXplIG9wZXJhdG9yLyhjb25zdCBJbnRTaXpl
JiBhLCBkb3VibGUgYikKK3sKKyAgICByZXR1cm4gSW50U2l6ZShzdGFibGVSb3VuZChhLndpZHRo
KCkgLyBiKSwgc3RhYmxlUm91bmQoYS5oZWlnaHQoKSAvIGIpKTsKK30KK3N0YXRpYyBpbmxpbmUg
SW50U2l6ZSBvcGVyYXRvciooY29uc3QgSW50U2l6ZSYgYSwgY29uc3QgRmxvYXRTaXplIGIpCit7
CisgICAgcmV0dXJuIEludFNpemUoc3RhYmxlUm91bmQoYS53aWR0aCgpICogYi53aWR0aCgpKSwg
c3RhYmxlUm91bmQoYS5oZWlnaHQoKSAqIGIuaGVpZ2h0KCkpKTsKK30KKworc3RhdGljIGludCBz
Y3JvbGxCYXJQaHlzaWNhbFdpZHRoID0gMTU7CisKK2NsYXNzIFNjcm9sbFZpZXc6OlNjcm9sbFZp
ZXdQcml2YXRlIHsKK3B1YmxpYzoKKyAgICBTY3JvbGxWaWV3UHJpdmF0ZShTY3JvbGxWaWV3KiB2
aWV3KQorICAgICAgICA6IG1fdmlldyh2aWV3KQorICAgICAgICAsIG1fc2Nyb2xsYmFyc1N1cHBy
ZXNzZWQoZmFsc2UpCisgICAgICAgICwgbV9pblVwZGF0ZVNjcm9sbGJhcnMoZmFsc2UpCisgICAg
ICAgICwgbV9zY3JvbGxiYXJzQXZvaWRpbmdSZXNpemVyKDApCisgICAgICAgICwgbV92U2Nyb2xs
YmFyTW9kZShTY3JvbGxiYXJBdXRvKQorICAgICAgICAsIG1faFNjcm9sbGJhck1vZGUoU2Nyb2xs
YmFyQXV0bykKKyAgICAgICAgLCBtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIodGhpcywgJlNjcm9s
bFZpZXdQcml2YXRlOjpzY3JvbGxCYXJWaXNpYmxlVGltZXJGaXJlZCkKKyAgICAgICAgLCBtX3Zp
c2libGVDb250ZW50c1dpZHRoKDApCisgICAgICAgICwgbV92aXNpYmxlQ29udGVudHNIZWlnaHQo
MCkKKyAgICAgICAgLCBtX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlKDApCisgICAgICAgICwgbV9w
cmV2TW91c2VEb3duKGZhbHNlKQorICAgICAgICAsIG1fc2Nyb2xsYmFyc1Zpc2libGUoZmFsc2Up
CisgICAgICAgICwgbV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZChmYWxzZSkKKyAgICAgICAgLCBt
X2F1dG9TaG93SGlkZVNjcm9sbGJhcnMoZmFsc2UpCisgICAgeworICAgIH0KKworICAgIH5TY3Jv
bGxWaWV3UHJpdmF0ZSgpCisgICAgeworICAgICAgICBzZXRIYXNIb3Jpem9udGFsU2Nyb2xsYmFy
KGZhbHNlKTsKKyAgICAgICAgc2V0SGFzVmVydGljYWxTY3JvbGxiYXIoZmFsc2UpOworICAgIH0K
KworICAgIHZvaWQgc2V0SGFzSG9yaXpvbnRhbFNjcm9sbGJhcihib29sIGhhc0Jhcik7CisgICAg
dm9pZCBzZXRIYXNWZXJ0aWNhbFNjcm9sbGJhcihib29sIGhhc0Jhcik7CisKKyAgICB2aXJ0dWFs
IHZvaWQgdmFsdWVDaGFuZ2VkKFNjcm9sbGJhciopOworCisgICAgdm9pZCBzY3JvbGxCYWNraW5n
U3RvcmUoY29uc3QgSW50U2l6ZSYgc2Nyb2xsRGVsdGEpOworCisgICAgdm9pZCBzZXRBbGxvd3NT
Y3JvbGxpbmcoYm9vbCk7CisgICAgYm9vbCBhbGxvd3NTY3JvbGxpbmcoKSBjb25zdDsKKworICAg
IHZvaWQgc2hvd1Njcm9sbGJhcnMoYm9vbCBob3Jpem9udGFsLCBib29sIHZlcnRpY2FsLCBib29s
IGZvcmNlKTsKKyAgICB2b2lkIGhpZGVTY3JvbGxiYXJzKCk7CisgICAgdm9pZCBzY3JvbGxCYXJW
aXNpYmxlVGltZXJGaXJlZChUaW1lcjxTY3JvbGxWaWV3UHJpdmF0ZT4qKTsKKworICAgIGludCBn
ZXRIQmFySGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gc3RhYmxlUm91bmQoKGRvdWJsZSlzY3JvbGxC
YXJQaHlzaWNhbFdpZHRoIC8gbV92aWV3LT5zY2FsZSgpKTsgfQorICAgIGludCBnZXRWQmFyV2lk
dGgoKSBjb25zdCB7IHJldHVybiBzdGFibGVSb3VuZCgoZG91YmxlKXNjcm9sbEJhclBoeXNpY2Fs
V2lkdGggLyBtX3ZpZXctPnNjYWxlKCkpOyB9CisgICAgSW50UmVjdCBnZXRIQ29ybmVyKGNvbnN0
IEludFNpemUmIGlubmVyU2l6ZSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2hCYXIg
JiYgbV9oU2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmYgJiYgaW5uZXJTaXplLndp
ZHRoKCkgPiBtX2hCYXItPndpZHRoKCkKKyAgICAgICAgICAgID8gSW50UmVjdChtX2hCYXItPndp
ZHRoKCksIGlubmVyU2l6ZS5oZWlnaHQoKSAtIG1faEJhci0+aGVpZ2h0KCksIGlubmVyU2l6ZS53
aWR0aCgpIC0gbV9oQmFyLT53aWR0aCgpLCBtX2hCYXItPmhlaWdodCgpKQorICAgICAgICAgICAg
OiBJbnRSZWN0KCk7CisgICAgfQorICAgIEludFJlY3QgZ2V0VkNvcm5lcihjb25zdCBJbnRTaXpl
JiBpbm5lclNpemUpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbV92QmFyICYmIG1fdlNj
cm9sbGJhck1vZGUgIT0gU2Nyb2xsYmFyQWx3YXlzT2ZmICYmIGlubmVyU2l6ZS5oZWlnaHQoKSA+
IG1fdkJhci0+aGVpZ2h0KCkKKyAgICAgICAgICAgID8gSW50UmVjdChpbm5lclNpemUud2lkdGgo
KSAtIG1fdkJhci0+d2lkdGgoKSwgaW5uZXJTaXplLmhlaWdodCgpLCBpbm5lclNpemUud2lkdGgo
KSwgaW5uZXJTaXplLmhlaWdodCgpIC0gbV92QmFyLT5oZWlnaHQoKSkKKyAgICAgICAgICAgIDog
SW50UmVjdCgpOworICAgIH0KKworICAgIEludFJlY3QgZ2V0SEJhclJlY3QoY29uc3QgSW50U2l6
ZSYgaW5uZXJTaXplKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIEludFJlY3QoMCwgaW5u
ZXJTaXplLmhlaWdodCgpIC0gZ2V0SEJhckhlaWdodCgpLAorICAgICAgICAgICAgaW5uZXJTaXpl
LndpZHRoKCkgLSAobV92QmFyICYmIG1fdlNjcm9sbGJhck1vZGUgIT0gU2Nyb2xsYmFyQWx3YXlz
T2ZmID8gZ2V0VkJhcldpZHRoKCkgOiAwKSwgZ2V0SEJhckhlaWdodCgpKTsKKyAgICB9CisgICAg
SW50UmVjdCBnZXRWQmFyUmVjdChjb25zdCBJbnRTaXplJiBpbm5lclNpemUpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gSW50UmVjdChpbm5lclNpemUud2lkdGgoKSAtIGdldFZCYXJXaWR0
aCgpLCAwLCBnZXRWQmFyV2lkdGgoKSwKKyAgICAgICAgICAgIGlubmVyU2l6ZS5oZWlnaHQoKSAt
IChtX2hCYXIgJiYgbV9oU2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmYgPyBnZXRI
QmFySGVpZ2h0KCkgOiAwKSk7CisgICAgfQorCisgICAgLy8gTm90IGxpa2UgU2Nyb2xsVmlldzo6
dmlzaWJsZUNvbnRlbnRSZWN0LCB0aGlzIGZ1bmN0aW9uIHRha2VzIHNjcm9sbGJhcnMgaW4gY291
bnQsCisgICAgLy8gYW5kIHJldHVybiB0aGUgYXJlYSBub3QgaW5jbHVkaW5nIHNjcm9sbGJhcnMu
CisgICAgSW50UmVjdCBnZXRWaXNpYmxlQ29udGVudFJlY3QoKSBjb25zdAorICAgIHsKKyAgICAg
ICAgSW50UmVjdCByZWN0KG1fdmlldy0+ZnJhbWVSZWN0KCkpOworICAgICAgICBpZiAobV9zY3Jv
bGxiYXJzVmlzaWJsZSkgeworICAgICAgICAgICAgaWYgKGNhblNob3dIU2Nyb2xsYmFyKCkpCisg
ICAgICAgICAgICAgICAgcmVjdC5zZXRIZWlnaHQobV9oQmFyLT55KCkpOworICAgICAgICAgICAg
aWYgKGNhblNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICAgICAgcmVjdC5zZXRXaWR0aCht
X3ZCYXItPngoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlY3Q7CisgICAgfQorCisg
ICAgdm9pZCBpbnZhbGlkYXRlU2Nyb2xsYmFyKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIsIEhXTkQg
aHduZCwgY29uc3QgVHJhbnNmb3JtYXRpb25NYXRyaXgqIHRyYW5zID0gMCk7CisgICAgdm9pZCBp
bnZhbGlkYXRlU2Nyb2xsYmFycyhib29sIGhvcml6b250YWwsIGJvb2wgdmVydGljYWwsIGJvb2wg
Y29ybmVyKTsKKworICAgIGJvb2wgY2FuU2hvd1ZTY3JvbGxiYXIoKSBjb25zdCB7IHJldHVybiBt
X3ZCYXIgJiYgbV92U2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmY7IH0KKyAgICBi
b29sIGNhblNob3dIU2Nyb2xsYmFyKCkgY29uc3QgeyByZXR1cm4gbV9oQmFyICYmIG1faFNjcm9s
bGJhck1vZGUgIT0gU2Nyb2xsYmFyQWx3YXlzT2ZmOyB9CisKKyAgICB2b2lkIHNldEF1dG9TY3Jv
bGxiYXJzKGJvb2wgZCkKKyAgICB7CisgICAgICAgIGlmIChkID09IG1fYXV0b1Nob3dIaWRlU2Ny
b2xsYmFycykKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBpZiAobV9hdXRvU2hvd0hp
ZGVTY3JvbGxiYXJzID0gZCkgeworICAgICAgICAgICAgaWYgKG1fc2Nyb2xsYmFyc1Zpc2libGVU
aW1lci5pc0FjdGl2ZSgpKQorICAgICAgICAgICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1l
ci5zdG9wKCk7CisgICAgICAgIH0gZWxzZSBpZiAobV9zY3JvbGxiYXJzVmlzaWJsZSAmJiAhbV9z
Y3JvbGxiYXJzVmlzaWJsZVRpbWVyLmlzQWN0aXZlKCkpCisgICAgICAgICAgICBtX3Njcm9sbGJh
cnNWaXNpYmxlVGltZXIuc3RhcnRPbmVTaG90KDIuMCk7CisgICAgfQorCisgICAgU2Nyb2xsVmll
dyogbV92aWV3OworICAgIEludFNpemUgbV9zY3JvbGxPZmZzZXQ7CisgICAgSW50U2l6ZSBtX2Nv
bnRlbnRzU2l6ZTsKKyAgICBib29sIG1fc2Nyb2xsYmFyc1N1cHByZXNzZWQ7CisgICAgYm9vbCBt
X2luVXBkYXRlU2Nyb2xsYmFyczsKKyAgICBpbnQgbV9zY3JvbGxiYXJzQXZvaWRpbmdSZXNpemVy
OworICAgIFNjcm9sbGJhck1vZGUgbV92U2Nyb2xsYmFyTW9kZTsKKyAgICBTY3JvbGxiYXJNb2Rl
IG1faFNjcm9sbGJhck1vZGU7CisgICAgUmVmUHRyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3ZCYXI7
CisgICAgUmVmUHRyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX2hCYXI7CisgICAgSFJHTiBtX2RpcnR5
UmVnaW9uOworICAgIEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPiBtX2NoaWxkcmVuOworCisgICAg
Ym9vbCBtX3Njcm9sbGJhcnNWaXNpYmxlOworICAgIGJvb2wgbV9zaG93U2Nyb2xsYmFyU3VwcHJl
c3NlZDsKKyAgICBUaW1lcjxTY3JvbGxWaWV3UHJpdmF0ZT4gbV9zY3JvbGxiYXJzVmlzaWJsZVRp
bWVyOworCisgICAgSW50UmVjdCBtX3BoeXNpY2FsR2VvbWV0cnk7CisgICAgZmxvYXQgbV92aXNp
YmxlQ29udGVudHNXaWR0aDsKKyAgICBmbG9hdCBtX3Zpc2libGVDb250ZW50c0hlaWdodDsKKyAg
ICBQbGF0Zm9ybVNjcm9sbGJhciogbV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZTsKKyAgICBib29s
IG1fcHJldk1vdXNlRG93bjsKKyAgICBib29sIG1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFyczsKK307
CisKKy8vIEZvciB0b3AgbGV2ZWwgb25seSEKK3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1By
aXZhdGU6OmludmFsaWRhdGVTY3JvbGxiYXIoUGxhdGZvcm1TY3JvbGxiYXIqIGJhciwgSFdORCBo
d25kLCBjb25zdCBUcmFuc2Zvcm1hdGlvbk1hdHJpeCogdHJhbnMpCit7CisgICAgaWYgKCFiYXIg
fHwgIWh3bmQpCisgICAgICAgIHJldHVybjsKKworICAgIGlmICh0cmFucykgeworICAgICAgICBS
RUNUIHJlY3RXaW4gPSB0cmFucy0+bWFwUmVjdChiYXItPmZyYW1lUmVjdCgpKTsKKyAgICAgICAg
aWYgKHJlY3RXaW4uYm90dG9tIDwgbV9waHlzaWNhbEdlb21ldHJ5LmJvdHRvbSgpKQorICAgICAg
ICAgICAgcmVjdFdpbi5ib3R0b20gPSBtX3BoeXNpY2FsR2VvbWV0cnkuYm90dG9tKCk7CisgICAg
ICAgIGlmIChyZWN0V2luLnJpZ2h0IDwgbV9waHlzaWNhbEdlb21ldHJ5LnJpZ2h0KCkpCisgICAg
ICAgICAgICByZWN0V2luLnJpZ2h0ID0gbV9waHlzaWNhbEdlb21ldHJ5LnJpZ2h0KCk7CisgICAg
ICAgIGlmIChtX3ZpZXctPmlzVmlzaWJsZSgpKQorICAgICAgICAgICAgOjpJbnZhbGlkYXRlUmVj
dChod25kLCAmcmVjdFdpbiwgRkFMU0UpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRyYW5zZm9y
bWF0aW9uTWF0cml4IG15VHJhbnMobV92aWV3LT5zY2FsZSgpLCAwLCAwLCBtX3ZpZXctPnNjYWxl
KCksIG1fdmlldy0+eCgpLCBtX3ZpZXctPnkoKSk7CisgICAgICAgIGludmFsaWRhdGVTY3JvbGxi
YXIoYmFyLCBod25kLCAmbXlUcmFucyk7CisgICAgfQorfQorCit2b2lkIFNjcm9sbFZpZXc6OlNj
cm9sbFZpZXdQcml2YXRlOjppbnZhbGlkYXRlU2Nyb2xsYmFycyhib29sIGhvcml6b250YWwsIGJv
b2wgdmVydGljYWwsIGJvb2wgY29ybmVyKQoreworICAgIGlmICghbV9zY3JvbGxiYXJzVmlzaWJs
ZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKCghdmVydGljYWwgfHwgIWNhblNob3dWU2Ny
b2xsYmFyKCkpICYmICghaG9yaXpvbnRhbCB8fCAhY2FuU2hvd0hTY3JvbGxiYXIoKSkpCisgICAg
ICAgIHJldHVybjsKKworICAgIGlmIChtX3ZpZXctPnBhcmVudCgpKSB7CisgICAgICAgIGlmICho
b3Jpem9udGFsICYmIGNhblNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBtX2hCYXItPmlu
dmFsaWRhdGUoKTsKKyAgICAgICAgaWYgKHZlcnRpY2FsICYmIGNhblNob3dWU2Nyb2xsYmFyKCkp
CisgICAgICAgICAgICBtX3ZCYXItPmludmFsaWRhdGUoKTsKKworICAgICAgICBpZiAoY29ybmVy
KSB7CisgICAgICAgICAgICBJbnRTaXplIGlubmVyU2l6ZShtX3Zpc2libGVDb250ZW50c1dpZHRo
LCBtX3Zpc2libGVDb250ZW50c0hlaWdodCk7CisgICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHRo
ZSBzY3JvbGwgY29ybmVyIHRvbyBvbiB1bnN1cHByZXNzLgorICAgICAgICAgICAgSW50UmVjdCBo
Q29ybmVyID0gZ2V0SENvcm5lcihpbm5lclNpemUpOworICAgICAgICAgICAgbV92aWV3LT5pbnZh
bGlkYXRlUmVjdChoQ29ybmVyKTsKKworICAgICAgICAgICAgSW50UmVjdCB2Q29ybmVyID0gZ2V0
VkNvcm5lcihpbm5lclNpemUpOworICAgICAgICAgICAgaWYgKHZDb3JuZXIgIT0gaENvcm5lcikK
KyAgICAgICAgICAgICAgICBtX3ZpZXctPmludmFsaWRhdGVSZWN0KHZDb3JuZXIpOworICAgICAg
ICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFtX3ZpZXctPmlzVmlzaWJsZSgpKQorICAg
ICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGRvdWJsZSBzY2FsZSA9IG1fdmlldy0+c2NhbGUo
KTsKKyAgICAgICAgVHJhbnNmb3JtYXRpb25NYXRyaXggdHJhbnMoc2NhbGUsIDAsIDAsIHNjYWxl
LCBtX3ZpZXctPngoKSwgbV92aWV3LT55KCkpOworCisgICAgICAgIEhXTkQgcGxhdGZvcm1XaWRn
ZXRIYW5kbGUgPSBtX3ZpZXctPnBsYXRmb3JtV2lkZ2V0KCk7CisgICAgICAgIGlmIChob3Jpem9u
dGFsICYmIGNhblNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBpbnZhbGlkYXRlU2Nyb2xs
YmFyKG1faEJhci5nZXQoKSwgcGxhdGZvcm1XaWRnZXRIYW5kbGUsICZ0cmFucyk7CisgICAgICAg
IGlmICh2ZXJ0aWNhbCAmJiBjYW5TaG93VlNjcm9sbGJhcigpKQorICAgICAgICAgICAgaW52YWxp
ZGF0ZVNjcm9sbGJhcihtX3ZCYXIuZ2V0KCksIHBsYXRmb3JtV2lkZ2V0SGFuZGxlLCAmdHJhbnMp
OworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6c2V0SGFz
SG9yaXpvbnRhbFNjcm9sbGJhcihib29sIGhhc0JhcikKK3sKKyAgICBpZiAoaGFzQmFyICYmICFt
X2hCYXIpIHsKKyAgICAgICAgbV9oQmFyID0gYWRvcHRSZWYobmV3IFBsYXRmb3JtU2Nyb2xsYmFy
KG1fdmlldywgSG9yaXpvbnRhbFNjcm9sbGJhciwgUmVndWxhclNjcm9sbGJhcikpOworICAgICAg
ICBtX2hCYXItPnNldElzVmlld1Njcm9sbGJhcih0cnVlKTsKKyAgICAgICAgSW50U2l6ZSBpbm5l
clNpemUobV92aXNpYmxlQ29udGVudHNXaWR0aCwgbV92aXNpYmxlQ29udGVudHNIZWlnaHQpOwor
ICAgICAgICBtX3ZpZXctPmFkZENoaWxkKG1faEJhci5nZXQoKSk7CisgICAgICAgIG1faEJhci0+
c2V0RnJhbWVSZWN0KGdldEhCYXJSZWN0KGlubmVyU2l6ZSkpOworICAgICAgICBpZiAoIW1fc2Ny
b2xsYmFyc1Zpc2libGUpCisgICAgICAgICAgICBtX2hCYXItPmhpZGUoKTsKKyAgICB9IGVsc2Ug
aWYgKCFoYXNCYXIgJiYgbV9oQmFyKSB7CisgICAgICAgIG1fdmlldy0+cmVtb3ZlQ2hpbGQobV9o
QmFyLmdldCgpKTsKKyAgICAgICAgbV9oQmFyID0gMDsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xs
Vmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnNldEhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGJvb2wgaGFz
QmFyKQoreworICAgIGlmIChoYXNCYXIgJiYgIW1fdkJhcikgeworICAgICAgICBtX3ZCYXIgPSBh
ZG9wdFJlZihuZXcgUGxhdGZvcm1TY3JvbGxiYXIobV92aWV3LCBWZXJ0aWNhbFNjcm9sbGJhciwg
UmVndWxhclNjcm9sbGJhcikpOworICAgICAgICBtX3ZCYXItPnNldElzVmlld1Njcm9sbGJhcih0
cnVlKTsKKyAgICAgICAgSW50U2l6ZSBpbm5lclNpemUobV92aXNpYmxlQ29udGVudHNXaWR0aCwg
bV92aXNpYmxlQ29udGVudHNIZWlnaHQpOworICAgICAgICBtX3ZpZXctPmFkZENoaWxkKG1fdkJh
ci5nZXQoKSk7CisgICAgICAgIG1fdkJhci0+c2V0RnJhbWVSZWN0KGdldFZCYXJSZWN0KGlubmVy
U2l6ZSkpOworICAgICAgICBpZiAoIW1fc2Nyb2xsYmFyc1Zpc2libGUpCisgICAgICAgICAgICBt
X3ZCYXItPmhpZGUoKTsKKyAgICB9IGVsc2UgaWYgKCFoYXNCYXIgJiYgbV92QmFyKSB7CisgICAg
ICAgIG1fdmlldy0+cmVtb3ZlQ2hpbGQobV92QmFyLmdldCgpKTsKKyAgICAgICAgbV92QmFyID0g
MDsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnZhbHVl
Q2hhbmdlZChTY3JvbGxiYXIqIGJhcikKK3sKKyAgICAvLyBGaWd1cmUgb3V0IGlmIHdlIHJlYWxs
eSBtb3ZlZC4KKyAgICBJbnRTaXplIG5ld09mZnNldCA9IG1fc2Nyb2xsT2Zmc2V0OworICAgIHsK
KyAgICAgICAgaW50IHZhbHVlID0gYmFyLT52YWx1ZSgpOworICAgICAgICBkb3VibGUgc2NhbGUg
PSBtX3ZpZXctPnNjYWxlKCk7CisgICAgICAgIHZhbHVlID0gc3RhYmxlUm91bmQoc3RhYmxlUm91
bmQodmFsdWUgKiBzY2FsZSkgLyBzY2FsZSk7CisKKyAgICAgICAgaWYgKGJhciA9PSBtX2hCYXIp
CisgICAgICAgICAgICBuZXdPZmZzZXQuc2V0V2lkdGgodmFsdWUpOworICAgICAgICBlbHNlIGlm
IChiYXIgPT0gbV92QmFyKQorICAgICAgICAgICAgbmV3T2Zmc2V0LnNldEhlaWdodCh2YWx1ZSk7
CisgICAgfQorICAgIEludFNpemUgc2Nyb2xsRGVsdGEgPSBuZXdPZmZzZXQgLSBtX3Njcm9sbE9m
ZnNldDsKKyAgICBpZiAoc2Nyb2xsRGVsdGEgPT0gSW50U2l6ZSgpKQorICAgICAgICByZXR1cm47
CisKKyNpZiBkZWZpbmVkKFNDUk9MTF9WSUVXX0RFQlVHKSAmJiBTQ1JPTExfVklFV19ERUJVRyA+
PSAyCisgICAgcHJpbnRmKCJTY3JvbGxWaWV3OiAweCV4OjB4JXg6IG1fc2Nyb2xsT2Zmc2V0OiAo
JWQsICVkKSAtPiAoJWQsICVkKS5cbiIsIHN0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldykt
PnBhcmVudCgpLCBtX3ZpZXcsCisgICAgICAgIG1fc2Nyb2xsT2Zmc2V0LndpZHRoKCksIG1fc2Ny
b2xsT2Zmc2V0LmhlaWdodCgpLCBuZXdPZmZzZXQud2lkdGgoKSwgbmV3T2Zmc2V0LmhlaWdodCgp
KTsKKyNlbmRpZgorCisgICAgbV9zY3JvbGxPZmZzZXQgPSBuZXdPZmZzZXQ7CisKKyAgICBpZiAo
bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZCkKKyAgICAgICAgcmV0dXJuOworCisgICAgc2hvd1Nj
cm9sbGJhcnMoZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgc2Nyb2xsQmFja2luZ1N0b3JlKHNj
cm9sbERlbHRhKTsKKyAgICAvL3N0YXRpY19jYXN0PEZyYW1lVmlldyo+KG1fdmlldyktPmZyYW1l
KCktPnNlbmRTY3JvbGxFdmVudCgpOworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0g
c3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4obV92aWV3KTsKKyAgICBpZiAoRnJhbWUqIGZy
YW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpKSB7CisgICAgICAgIGlmIChmcmFtZS0+c2hvdWxkQmxp
bmtDYXJldCgpKQorICAgICAgICAgICAgbV92aWV3LT5ob3N0V2luZG93KCktPmNhcmV0UmVjdENo
YW5nZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6
OnNjcm9sbEJhY2tpbmdTdG9yZShjb25zdCBJbnRTaXplJiBzY3JvbGxEZWx0YSkKK3sKKyAgICBp
ZiAoIXNjcm9sbERlbHRhLndpZHRoKCkgJiYgIXNjcm9sbERlbHRhLmhlaWdodCgpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBJbnRSZWN0IHNjcm9sbFZpZXdSZWN0OworICAgIGlmIChtX3ZpZXct
PnBhcmVudCgpKQorICAgICAgICBzY3JvbGxWaWV3UmVjdCA9IG1fdmlldy0+cGFyZW50KCktPmNv
bnRlbnRzVG9XaW5kb3coZ2V0VmlzaWJsZUNvbnRlbnRSZWN0KCkpOworICAgIGVsc2UKKyAgICAg
ICAgc2Nyb2xsVmlld1JlY3QgPSBtX3ZpZXctPmNvbnRlbnRzVG9XaW5kb3coSW50UmVjdChJbnRQ
b2ludCgwLCAwKSwgbV9jb250ZW50c1NpemUpKTsKKworICAgIEludFNpemUgb2xkT2Zmc2V0ID0g
KG1fc2Nyb2xsT2Zmc2V0IC0gc2Nyb2xsRGVsdGEpICogbV92aWV3LT5zY2FsZSgpOworICAgIElu
dFNpemUgbmV3T2Zmc2V0ID0gbV9zY3JvbGxPZmZzZXQgKiBtX3ZpZXctPnNjYWxlKCk7CisgICAg
RnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4obV92aWV3KS0+ZnJhbWUoKTsK
KyAgICBtX3ZpZXctPmhvc3RXaW5kb3coKS0+c2Nyb2xsKGZyYW1lLCBJbnRTaXplKG9sZE9mZnNl
dC53aWR0aCgpIC0gbmV3T2Zmc2V0LndpZHRoKCkKKyAgICAgICAgLCBvbGRPZmZzZXQuaGVpZ2h0
KCkgLSBuZXdPZmZzZXQuaGVpZ2h0KCkpCisgICAgICAgICwgc2Nyb2xsVmlld1JlY3QsIHNjcm9s
bFZpZXdSZWN0KTsKKyAgICBtX3ZpZXctPmhvc3RXaW5kb3coKS0+cmVwYWludChmcmFtZSwgc2Ny
b2xsVmlld1JlY3QsIGZhbHNlLCB0cnVlLCBmYWxzZSk7CisKKyAgICAvLyBUaGlzIGNhbGwgd2ls
bCBtb3ZlIGNoaWxkIEhXTkRzIChwbHVnaW5zKSBhbmQgaW52YWxpZGF0ZSB0aGVtIGFzIHdlbGwu
CisgICAgbV92aWV3LT5mcmFtZVJlY3RzQ2hhbmdlZCgpOworfQorCit2b2lkIFNjcm9sbFZpZXc6
OlNjcm9sbFZpZXdQcml2YXRlOjpzZXRBbGxvd3NTY3JvbGxpbmcoYm9vbCBmbGFnKQoreworICAg
IGlmIChmbGFnICYmIG1fdlNjcm9sbGJhck1vZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQorICAg
ICAgICBtX3ZTY3JvbGxiYXJNb2RlID0gU2Nyb2xsYmFyQXV0bzsKKyAgICBlbHNlIGlmICghZmxh
ZykKKyAgICAgICAgbV92U2Nyb2xsYmFyTW9kZSA9IFNjcm9sbGJhckFsd2F5c09mZjsKKworICAg
IGlmIChmbGFnICYmIG1faFNjcm9sbGJhck1vZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQorICAg
ICAgICBtX2hTY3JvbGxiYXJNb2RlID0gU2Nyb2xsYmFyQXV0bzsKKyAgICBlbHNlIGlmICghZmxh
ZykKKyAgICAgICAgbV9oU2Nyb2xsYmFyTW9kZSA9IFNjcm9sbGJhckFsd2F5c09mZjsKKworICAg
IG1fdmlldy0+dXBkYXRlU2Nyb2xsYmFycyhtX3Njcm9sbE9mZnNldCk7Cit9CisKK2Jvb2wgU2Ny
b2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OmFsbG93c1Njcm9sbGluZygpIGNvbnN0Cit7Cisg
ICAgLy8gUmV0dXJuIFlFUyBpZiBlaXRoZXIgaG9yaXpvbnRhbCBvciB2ZXJ0aWNhbCBzY3JvbGxp
bmcgaXMgYWxsb3dlZC4KKyAgICByZXR1cm4gbV9oU2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJB
bHdheXNPZmYgfHwgbV92U2Nyb2xsYmFyTW9kZSAhPSBTY3JvbGxiYXJBbHdheXNPZmY7Cit9CisK
K3ZvaWQgU2Nyb2xsVmlldzo6U2Nyb2xsVmlld1ByaXZhdGU6OnNob3dTY3JvbGxiYXJzKGJvb2wg
aG9yaXpvbnRhbCwgYm9vbCB2ZXJ0aWNhbCwgYm9vbCBtYW51YWwpCit7CisgICAgaWYgKCFtYW51
YWwgJiYgIW1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFycykKKyAgICAgICAgcmV0dXJuOworCisgICAg
aWYgKG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1lci5pc0FjdGl2ZSgpKQorICAgICAgICBtX3Njcm9s
bGJhcnNWaXNpYmxlVGltZXIuc3RvcCgpOworCisgICAgaWYgKCFjYW5TaG93SFNjcm9sbGJhcigp
ICYmICFjYW5TaG93VlNjcm9sbGJhcigpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIW1f
c2Nyb2xsYmFyc1Zpc2libGUpIHsKKyAgICAgICAgSW50U2l6ZSBpbm5lclNpemUobV92aXNpYmxl
Q29udGVudHNXaWR0aCwgbV92aXNpYmxlQ29udGVudHNIZWlnaHQpOworCisgICAgICAgIGlmICht
X2hCYXIpIHsKKyAgICAgICAgICAgIG1faEJhci0+c2hvdygpOworICAgICAgICAgICAgbV9oQmFy
LT5zZXRGcmFtZVJlY3QoZ2V0SEJhclJlY3QoaW5uZXJTaXplKSk7CisgICAgICAgIH0KKyAgICAg
ICAgaWYgKG1fdkJhcikgeworICAgICAgICAgICAgbV92QmFyLT5zaG93KCk7CisgICAgICAgICAg
ICBtX3ZCYXItPnNldEZyYW1lUmVjdChnZXRWQmFyUmVjdChpbm5lclNpemUpKTsKKyAgICAgICAg
fQorICAgICAgICBpZiAoIW1fdmlldy0+cGFyZW50KCkpIHsKKyAgICAgICAgICAgIGludmFsaWRh
dGVTY3JvbGxiYXJzKHRydWUsIHRydWUsIHRydWUpOworICAgICAgICAgICAgbV9zY3JvbGxiYXJz
VmlzaWJsZSA9IHRydWU7CisgICAgICAgICAgICBpZiAobV92aWV3LT5pc1Zpc2libGUoKSkKKyAg
ICAgICAgICAgICAgICBVcGRhdGVXaW5kb3cobV92aWV3LT5wbGF0Zm9ybVdpZGdldCgpKTsKKyAg
ICAgICAgfQorICAgIH0KKyAgICBpZiAobV92aWV3LT5wYXJlbnQoKSkgeworICAgICAgICBpbnZh
bGlkYXRlU2Nyb2xsYmFycyhob3Jpem9udGFsIHx8ICFtX3Njcm9sbGJhcnNWaXNpYmxlLCB2ZXJ0
aWNhbCB8fCAhbV9zY3JvbGxiYXJzVmlzaWJsZSwgIW1fc2Nyb2xsYmFyc1Zpc2libGUpOworICAg
ICAgICBtX3Njcm9sbGJhcnNWaXNpYmxlID0gdHJ1ZTsKKyAgICAgICAgLy9tX3ZpZXctPnVwZGF0
ZUJhY2tpbmdTdG9yZSgpOworICAgIH0KKworICAgIGlmIChtX2F1dG9TaG93SGlkZVNjcm9sbGJh
cnMpCisgICAgICAgIG1fc2Nyb2xsYmFyc1Zpc2libGVUaW1lci5zdGFydE9uZVNob3QoMi4wKTsK
K30KKwordm9pZCBTY3JvbGxWaWV3OjpTY3JvbGxWaWV3UHJpdmF0ZTo6aGlkZVNjcm9sbGJhcnMo
KQoreworICAgIGlmIChtX3Njcm9sbGJhcnNWaXNpYmxlKSB7CisgICAgICAgIG1fc2Nyb2xsYmFy
c1Zpc2libGUgPSBmYWxzZTsKKyAgICAgICAgaW52YWxpZGF0ZVNjcm9sbGJhcnModHJ1ZSwgdHJ1
ZSwgdHJ1ZSk7CisgICAgICAgIGlmIChtX2hCYXIpIHsKKyAgICAgICAgICAgIG1faEJhci0+aGlk
ZSgpOworICAgICAgICAgICAgbV9oQmFyLT5zZXRGcmFtZVJlY3QoSW50UmVjdCgwLCAwLCAwLCBt
X2hCYXItPmhlaWdodCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdkJhcikgeworICAg
ICAgICAgICAgbV92QmFyLT5oaWRlKCk7CisgICAgICAgICAgICBtX3ZCYXItPnNldEZyYW1lUmVj
dChJbnRSZWN0KDAsIDAsIG1fdkJhci0+d2lkdGgoKSwgMCkpOworICAgICAgICB9CisgICAgICAg
IGlmIChtX3ZpZXctPmlzVmlzaWJsZSgpKQorICAgICAgICAgICAgVXBkYXRlV2luZG93KG1fdmll
dy0+cGxhdGZvcm1XaWRnZXQoKSk7CisgICAgfQorfQorCit2b2lkIFNjcm9sbFZpZXc6OlNjcm9s
bFZpZXdQcml2YXRlOjpzY3JvbGxCYXJWaXNpYmxlVGltZXJGaXJlZChUaW1lcjxTY3JvbGxWaWV3
UHJpdmF0ZT4qKQoreworICAgIGlmIChtX3Njcm9sbGJhcnNWaXNpYmxlVGltZXIuaXNBY3RpdmUo
KSkKKyAgICAgICAgbV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyLnN0b3AoKTsKKworICAgIGlmICgh
bV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAoIWNh
blNob3dIU2Nyb2xsYmFyKCkgJiYgIWNhblNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAgIHJldHVy
bjsKKworICAgIGlmIChtX3Njcm9sbGJhcnNWaXNpYmxlKSB7CisgICAgICAgIGlmIChtX3ZpZXct
PmlzVmlzaWJsZSgpICYmIEdldENhcHR1cmUoKSA9PSBtX3ZpZXctPnBsYXRmb3JtV2lkZ2V0KCkp
CisgICAgICAgICAgICAvLyBDYXB0dXJpbmcgbW91c2UgZXZlbnQsIHVzZXIgbWlnaHQgYmUgZHJh
Z2dpbmcgc2Nyb2xsIGJhcgorICAgICAgICAgICAgbV9zY3JvbGxiYXJzVmlzaWJsZVRpbWVyLnN0
YXJ0T25lU2hvdCgyLjApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBoaWRlU2Nyb2xsYmFy
cygpOworICAgIH0KK30KKworU2Nyb2xsVmlldzo6U2Nyb2xsVmlldygpCisgICAgOiBtX2RhdGEo
bmV3IFNjcm9sbFZpZXdQcml2YXRlKHRoaXMpKQorICAgICwgbV9zY2FsZSgxLikKKyAgICAsIG1f
dXNlQW5jaG9yUG9pbnQoZmFsc2UpCisgICAgLCBtX2FsbG93c0NoYW5naW5nU2Nyb2xsYmFyTW9k
ZSh0cnVlKQoreworfQorCitTY3JvbGxWaWV3Ojp+U2Nyb2xsVmlldygpCit7CisgICAgZGVsZXRl
IG1fZGF0YTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpyZXBhaW50Q29udGVudFJlY3RhbmdsZShj
b25zdCBJbnRSZWN0JiByZWN0LCBib29sIG5vdykKK3sKKyAgICBpZiAocmVjdC5pc0VtcHR5KCkp
CisgICAgICAgIHJldHVybjsKKworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3Rh
dGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgaG9zdFdpbmRvdygpLT5kaXNw
YXRjaENvbnRlbnRzVXBkYXRlZChmcmFtZVZpZXctPmZyYW1lKCksIHJlY3QpOworCisgICAgaG9z
dFdpbmRvdygpLT5yZXBhaW50KGZyYW1lVmlldy0+ZnJhbWUoKSwgY29udGVudHNUb1dpbmRvdyhy
ZWN0KSwgdHJ1ZSwgbm93KTsKK30KKworaW50IFNjcm9sbFZpZXc6OnZpc2libGVXaWR0aCgpIGNv
bnN0Cit7CisgICAgaW50IHcgPSBwYXJlbnQoKSA/IHdpZHRoKCkgOiB2aWV3U2l6ZS53aWR0aCgp
IDw9IDAgPyA4MDAgOiB2aWV3U2l6ZS53aWR0aCgpOworICAgIGlmICghbV9kYXRhLT5tX2F1dG9T
aG93SGlkZVNjcm9sbGJhcnMgJiYgbV9kYXRhLT5tX3Njcm9sbGJhcnNWaXNpYmxlICYmIG1fZGF0
YS0+Y2FuU2hvd1ZTY3JvbGxiYXIoKSkKKyAgICAgICAgdyAtPSBtX2RhdGEtPm1fdkJhci0+d2lk
dGgoKTsKKyAgICByZXR1cm4gdzsKK30KKworaW50IFNjcm9sbFZpZXc6OnZpc2libGVIZWlnaHQo
KSBjb25zdAoreworICAgIGludCBoID0gcGFyZW50KCkgPyBoZWlnaHQoKSA6IHZpZXdTaXplLmhl
aWdodCgpIDw9IDAgPyAxMDI0IDogdmlld1NpemUuaGVpZ2h0KCk7CisgICAgaWYgKCFtX2RhdGEt
Pm1fYXV0b1Nob3dIaWRlU2Nyb2xsYmFycyAmJiBtX2RhdGEtPm1fc2Nyb2xsYmFyc1Zpc2libGUg
JiYgbV9kYXRhLT5jYW5TaG93SFNjcm9sbGJhcigpKQorICAgICAgICBoIC09IG1fZGF0YS0+bV9o
QmFyLT5oZWlnaHQoKTsKKyAgICByZXR1cm4gaDsKK30KKworSW50UmVjdCBTY3JvbGxWaWV3Ojp2
aXNpYmxlQ29udGVudFJlY3QoYm9vbCkgY29uc3QKK3sKKyAgICByZXR1cm4gSW50UmVjdChtX2Rh
dGEtPm1fc2Nyb2xsT2Zmc2V0LndpZHRoKCkKKyAgICAgICAgLCBtX2RhdGEtPm1fc2Nyb2xsT2Zm
c2V0LmhlaWdodCgpCisgICAgICAgICwgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoCisg
ICAgICAgICwgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodAorICAgICAgICApOworfQor
CitJbnRSZWN0IFNjcm9sbFZpZXc6OnZpc2libGVDb250ZW50UmVjdENvbnNpZGVyaW5nRXh0ZXJu
YWxTY3JvbGxlcnMoKSBjb25zdAoreworICAgIC8vIGV4dGVybmFsIHNjcm9sbGVycyBub3Qgc3Vw
cG9ydGVkIGZvciBub3cKKyAgICByZXR1cm4gdmlzaWJsZUNvbnRlbnRSZWN0KCk7Cit9CisKK3Zv
aWQgU2Nyb2xsVmlldzo6c2V0Q29udGVudHNQb3MoaW50IG5ld1gsIGludCBuZXdZKQoreworICAg
IGludCBkeCA9IG5ld1ggLSBjb250ZW50c1goKTsKKyAgICBpbnQgZHkgPSBuZXdZIC0gY29udGVu
dHNZKCk7CisgICAgc2Nyb2xsQnkoZHgsIGR5KTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRD
b250ZW50c1NpemUoY29uc3QgSW50U2l6ZSYgbmV3Q29udGVudHNTaXplKQoreworICAgIGlmICht
X2RhdGEtPm1fY29udGVudHNTaXplID09IG5ld0NvbnRlbnRzU2l6ZSkKKyAgICAgICAgcmV0dXJu
OworCisgICAgbV9kYXRhLT5tX2NvbnRlbnRzU2l6ZSA9IG5ld0NvbnRlbnRzU2l6ZTsKKworICAg
IGhpZGVDdXJyZW50UG9wdXBNZW51KCk7CisKKyAgICB1cGRhdGVTY3JvbGxiYXJzKG1fZGF0YS0+
bV9zY3JvbGxPZmZzZXQpOworCisgICAgaWYgKGlzRnJhbWVWaWV3KCkpIHsKKyAgICAgICAgRnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAg
ICAgaWYgKEZyYW1lICpmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUoKSkKKyAgICAgICAgICAgIGZy
YW1lLT5wYWdlKCktPmNocm9tZSgpLT5jb250ZW50c1NpemVDaGFuZ2VkKGZyYW1lVmlldy0+ZnJh
bWUoKSwgbmV3Q29udGVudHNTaXplKTsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0
RnJhbWVSZWN0KGNvbnN0IEludFJlY3QmIG5ld0dlb21ldHJ5LCBib29sIG5lZWRzTGF5b3V0KQor
eworICAgIEludFJlY3QgbmV3UmVjdDsKKyAgICBJbnRTaXplIG9sZFZpc2libGVDb250ZW50c1Np
emUobWluKG1fZGF0YS0+bV9jb250ZW50c1NpemUud2lkdGgoKSwgKGludCltX2RhdGEtPm1fdmlz
aWJsZUNvbnRlbnRzV2lkdGgpCisgICAgICAgICwgbWluKG1fZGF0YS0+bV9jb250ZW50c1NpemUu
aGVpZ2h0KCksIChpbnQpbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCkpOworICAgIGlm
IChwYXJlbnQoKSkgeworICAgICAgICBtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSA9IHBhcmVu
dCgpLT5jb250ZW50c1RvV2luZG93KG5ld0dlb21ldHJ5KTsKKyAgICAgICAgbV9kYXRhLT5tX3Zp
c2libGVDb250ZW50c1dpZHRoID0gbmV3R2VvbWV0cnkud2lkdGgoKTsKKyAgICAgICAgbV9kYXRh
LT5tX3Zpc2libGVDb250ZW50c0hlaWdodCA9IG5ld0dlb21ldHJ5LmhlaWdodCgpOworICAgICAg
ICBuZXdSZWN0ID0gbmV3R2VvbWV0cnk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbV9kYXRhLT5t
X3BoeXNpY2FsR2VvbWV0cnkgPSBuZXdHZW9tZXRyeTsKKyAgICAgICAgbV9kYXRhLT5tX3Zpc2li
bGVDb250ZW50c1dpZHRoID0gbmV3R2VvbWV0cnkud2lkdGgoKSAvIHNjYWxlKCk7CisgICAgICAg
IG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWlnaHQgPSBuZXdHZW9tZXRyeS5oZWlnaHQoKSAv
IHNjYWxlKCk7CisgICAgICAgIG5ld1JlY3Quc2V0TG9jYXRpb24obmV3R2VvbWV0cnkubG9jYXRp
b24oKSk7CisgICAgICAgIG5ld1JlY3Quc2V0V2lkdGgoY2VpbChtX2RhdGEtPm1fdmlzaWJsZUNv
bnRlbnRzV2lkdGgpKTsKKyAgICAgICAgbmV3UmVjdC5zZXRIZWlnaHQoY2VpbChtX2RhdGEtPm1f
dmlzaWJsZUNvbnRlbnRzSGVpZ2h0KSk7CisgICAgfQorCisgICAgSW50UmVjdCBvbGRHZW9tZXRy
eSA9IGZyYW1lUmVjdCgpOworICAgIFdpZGdldDo6c2V0RnJhbWVSZWN0KG5ld1JlY3QpOworCisg
ICAgaWYgKG5ld1JlY3QgPT0gb2xkR2VvbWV0cnkpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChuZXdSZWN0LnNpemUoKSAhPSBvbGRHZW9tZXRyeS5zaXplKCkpIHsKKyAgICAgICAgaWYgKG5l
ZWRzTGF5b3V0KQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPnNl
dE5lZWRzTGF5b3V0KCk7CisgICAgICAgIGlmICghcGFyZW50KCkpIHsKKyAgICAgICAgICAgIGJv
b2wgb2xkU3VwcHJlc3NlZCA9IG1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZDsKKyAg
ICAgICAgICAgIG1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJlc3NlZCA9IHRydWU7CisgICAg
ICAgICAgICBJbnRTaXplIG5ld1Zpc2libGVDb250ZW50c1NpemUobWluKG1fZGF0YS0+bV9jb250
ZW50c1NpemUud2lkdGgoKSwgKGludCltX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgpCisg
ICAgICAgICAgICAsIG1pbihtX2RhdGEtPm1fY29udGVudHNTaXplLmhlaWdodCgpLCAoaW50KW1f
ZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWlnaHQpKTsKKyAgICAgICAgICAgIEludFNpemUgc2Ny
b2xsT2Zmc2V0ID0gbV91c2VBbmNob3JQb2ludAorICAgICAgICAgICAgICAgID8gbV9hbmNob3JD
b250ZW50c1BvaW50IC0gbV9hbmNob3JXaW5kb3dQb2ludCAvIHNjYWxlKCkKKyAgICAgICAgICAg
ICAgICA6IG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQgKyAob2xkVmlzaWJsZUNvbnRlbnRzU2l6ZSAt
IG5ld1Zpc2libGVDb250ZW50c1NpemUpICogMC41OworICAgICAgICAgICAgdXBkYXRlU2Nyb2xs
YmFycyhzY3JvbGxPZmZzZXQpOworICAgICAgICAgICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJT
dXBwcmVzc2VkID0gb2xkU3VwcHJlc3NlZDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICB1
cGRhdGVTY3JvbGxiYXJzKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIH0KKworICAgIGlm
IChpc0ZyYW1lVmlldygpKSB7CisgICAgICAgIEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGlj
X2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyk7CisgICAgICAgIGlmIChGcmFtZSAqZnJhbWUgPSBmcmFt
ZVZpZXctPmZyYW1lKCkpCisgICAgICAgICAgICBmcmFtZS0+cGFnZSgpLT5jaHJvbWUoKS0+Y2xp
ZW50KCktPmZyYW1lR2VvbWV0cnlDaGFuZ2VkKGZyYW1lVmlldy0+ZnJhbWUoKSk7CisgICAgfQor
CisgICAgZnJhbWVSZWN0c0NoYW5nZWQoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRTY2Fs
ZShkb3VibGUgc2NhbGUpCit7CisgICAgc2NhbGUgPSBtYXgoMC4xLCBtaW4oMTAuLCBzY2FsZSkp
OworICAgIGlmIChtX3NjYWxlID09IHNjYWxlKQorICAgICAgICByZXR1cm47CisKKyAgICBtX3Nj
YWxlID0gc2NhbGU7CisKKyAgICBoaWRlQ3VycmVudFBvcHVwTWVudSgpOworCisgICAgY29uc3Qg
RnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlz
KTsKKyAgICBGcmFtZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCk7CisKKyAgICBpZiAoZnJh
bWUpIHsKKyAgICAgICAgZm9yIChGcmFtZSogY2hpbGQgPSBmcmFtZS0+dHJlZSgpLT5maXJzdENo
aWxkKCk7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT50cmVlKCktPm5leHRTaWJsaW5nKCkpIHsKKyAg
ICAgICAgICAgIGlmIChGcmFtZVZpZXcqIHZpZXcgPSBjaGlsZC0+dmlldygpKQorICAgICAgICAg
ICAgICAgIHZpZXctPnNldFNjYWxlKHNjYWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
ICghcGFyZW50KCkpCisgICAgICAgIHNldEZyYW1lUmVjdChtX2RhdGEtPm1fcGh5c2ljYWxHZW9t
ZXRyeSwgZmFsc2UpOworICAgIGVsc2UgeworICAgICAgICBJbnRTaXplIGlubmVyU2l6ZShtX2Rh
dGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgsIG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWln
aHQpOworICAgICAgICBpZiAobV9kYXRhLT5tX3ZCYXIpCisgICAgICAgICAgICBtX2RhdGEtPm1f
dkJhci0+c2V0RnJhbWVSZWN0KG1fZGF0YS0+Z2V0VkJhclJlY3QoaW5uZXJTaXplKSk7CisgICAg
ICAgIGlmIChtX2RhdGEtPm1faEJhcikKKyAgICAgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRG
cmFtZVJlY3QobV9kYXRhLT5nZXRIQmFyUmVjdChpbm5lclNpemUpKTsKKyAgICB9Cit9CisKK2lu
dCBTY3JvbGxWaWV3Ojpjb250ZW50c1goKSBjb25zdAoreworICAgIHJldHVybiBzY3JvbGxPZmZz
ZXQoKS53aWR0aCgpOworfQorCitpbnQgU2Nyb2xsVmlldzo6Y29udGVudHNZKCkgY29uc3QKK3sK
KyAgICByZXR1cm4gc2Nyb2xsT2Zmc2V0KCkuaGVpZ2h0KCk7Cit9CisKK2ludCBTY3JvbGxWaWV3
Ojpjb250ZW50c1dpZHRoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX2NvbnRlbnRz
U2l6ZS53aWR0aCgpOworfQorCitpbnQgU2Nyb2xsVmlldzo6Y29udGVudHNIZWlnaHQoKSBjb25z
dAoreworICAgIHJldHVybiBtX2RhdGEtPm1fY29udGVudHNTaXplLmhlaWdodCgpOworfQorCitJ
bnRSZWN0IFNjcm9sbFZpZXc6OmNvbnRlbnRzVG9XaW5kb3coY29uc3QgSW50UmVjdCYgcmVjdCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gSW50UmVjdChjb250ZW50c1RvV2luZG93KHJlY3QubG9jYXRp
b24oKSksIHJlY3Quc2l6ZSgpICogc2NhbGUoKSk7Cit9CisKK0ludFJlY3QgU2Nyb2xsVmlldzo6
d2luZG93VG9Db250ZW50cyhjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAoreworICAgIHJldHVy
biBJbnRSZWN0KHdpbmRvd1RvQ29udGVudHMocmVjdC5sb2NhdGlvbigpKSwgcmVjdC5zaXplKCkg
LyBzY2FsZSgpKTsKK30KKworSW50UG9pbnQgU2Nyb2xsVmlldzo6d2luZG93VG9Db250ZW50cyhj
b25zdCBJbnRQb2ludCYgd2luZG93UG9pbnQpIGNvbnN0Cit7CisgICAgaWYgKHBhcmVudCgpKSB7
CisgICAgICAgIEludFBvaW50IG9yaWdpbiA9IHBhcmVudCgpLT5jb250ZW50c1RvV2luZG93KGZy
YW1lUmVjdCgpLmxvY2F0aW9uKCkpOworICAgICAgICByZXR1cm4gSW50UG9pbnQoKSArICh3aW5k
b3dQb2ludCAtIG9yaWdpbikgLyBzY2FsZSgpICsgc2Nyb2xsT2Zmc2V0KCk7CisgICAgfQorCisg
ICAgcmV0dXJuICh3aW5kb3dQb2ludCAtIEludFNpemUoeCgpLCB5KCkpKSAvIHNjYWxlKCkgKyBz
Y3JvbGxPZmZzZXQoKTsKK30KKworSW50UG9pbnQgU2Nyb2xsVmlldzo6Y29udGVudHNUb1dpbmRv
dyhjb25zdCBJbnRQb2ludCYgY29udGVudHNQb2ludCkgY29uc3QKK3sKKyAgICBpZiAocGFyZW50
KCkpIHsKKyAgICAgICAgSW50UG9pbnQgb3JpZ2luID0gcGFyZW50KCktPmNvbnRlbnRzVG9XaW5k
b3coZnJhbWVSZWN0KCkubG9jYXRpb24oKSk7CisgICAgICAgIHJldHVybiBvcmlnaW4gKyAoKGNv
bnRlbnRzUG9pbnQgLSBzY3JvbGxPZmZzZXQoKSkgKiBzY2FsZSgpIC0gSW50UG9pbnQoKSk7Cisg
ICAgfQorCisgICAgcmV0dXJuIChjb250ZW50c1BvaW50IC0gc2Nyb2xsT2Zmc2V0KCkpICogc2Nh
bGUoKSArIEludFNpemUoeCgpLCB5KCkpOworfQorCitJbnRQb2ludCBTY3JvbGxWaWV3Ojpjb252
ZXJ0Q2hpbGRUb1NlbGYoY29uc3QgV2lkZ2V0KiBjaGlsZCwgY29uc3QgSW50UG9pbnQmIHBvaW50
KSBjb25zdAoreworICAgIEludFBvaW50IG5ld1BvaW50ID0gcG9pbnQ7CisgICAgaWYgKGNoaWxk
ICE9IG1fZGF0YS0+bV9oQmFyICYmIGNoaWxkICE9IG1fZGF0YS0+bV92QmFyKQorICAgICAgICBu
ZXdQb2ludCA9IHBvaW50IC0gc2Nyb2xsT2Zmc2V0KCk7CisgICAgcmV0dXJuIFdpZGdldDo6Y29u
dmVydENoaWxkVG9TZWxmKGNoaWxkLCBuZXdQb2ludCk7Cit9CisKK0ludFBvaW50IFNjcm9sbFZp
ZXc6OmNvbnZlcnRTZWxmVG9DaGlsZChjb25zdCBXaWRnZXQqIGNoaWxkLCBjb25zdCBJbnRQb2lu
dCYgcG9pbnQpIGNvbnN0Cit7CisgICAgSW50UG9pbnQgbmV3UG9pbnQgPSBwb2ludDsKKyAgICBp
ZiAoY2hpbGQgIT0gbV9kYXRhLT5tX2hCYXIgJiYgY2hpbGQgIT0gbV9kYXRhLT5tX3ZCYXIpCisg
ICAgICAgIG5ld1BvaW50ID0gcG9pbnQgKyBzY3JvbGxPZmZzZXQoKTsKKyAgICByZXR1cm4gV2lk
Z2V0Ojpjb252ZXJ0U2VsZlRvQ2hpbGQoY2hpbGQsIG5ld1BvaW50KTsKK30KKworSW50U2l6ZSBT
Y3JvbGxWaWV3OjpzY3JvbGxPZmZzZXQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1f
c2Nyb2xsT2Zmc2V0OworfQorCitJbnRTaXplIFNjcm9sbFZpZXc6Om1heGltdW1TY3JvbGwoKSBj
b25zdAoreworICAgIEludFNpemUgZGVsdGEgPSBtX2RhdGEtPm1fY29udGVudHNTaXplIC0gSW50
U2l6ZSh3aWR0aCgpLCBoZWlnaHQoKSkgLSBtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0OworICAgIGRl
bHRhLmNsYW1wTmVnYXRpdmVUb1plcm8oKTsKKyAgICByZXR1cm4gZGVsdGE7Cit9CisKK3ZvaWQg
U2Nyb2xsVmlldzo6c2Nyb2xsQnkoaW50IGR4LCBpbnQgZHkpCit7CisgICAgaWYgKCFkeCAmJiAh
ZHkpCisgICAgICAgIHJldHVybjsKKworICAgIGhpZGVDdXJyZW50UG9wdXBNZW51KCk7CisKKyAg
ICBib29sIG9sZFN1cHByZXNzZWQgPSBtX2RhdGEtPm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQ7
CisgICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkID0gdHJ1ZTsKKworICAgIElu
dFNpemUgb2xkT2Zmc2V0KG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworCisgICAgaWYgKG1fZGF0
YS0+bV9oQmFyICYmIGR4KQorICAgICAgICBtX2RhdGEtPm1faEJhci0+c2V0VmFsdWUob2xkT2Zm
c2V0LndpZHRoKCkgKyBkeCk7CisKKyAgICBpZiAobV9kYXRhLT5tX3ZCYXIgJiYgZHkpCisgICAg
ICAgIG1fZGF0YS0+bV92QmFyLT5zZXRWYWx1ZShvbGRPZmZzZXQuaGVpZ2h0KCkgKyBkeSk7CisK
KyAgICBtX2RhdGEtPm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQgPSBvbGRTdXBwcmVzc2VkOwor
CisgICAgaWYgKCFtX2RhdGEtPm1fc2hvd1Njcm9sbGJhclN1cHByZXNzZWQpIHsKKyAgICAgICAg
SW50U2l6ZSBkZWx0YSA9IG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQgLSBvbGRPZmZzZXQ7CisgICAg
ICAgIG1fZGF0YS0+c2Nyb2xsQmFja2luZ1N0b3JlKGRlbHRhKTsKKyAgICAgICAgLy9zdGF0aWNf
Y2FzdDxGcmFtZVZpZXcqPih0aGlzKS0+ZnJhbWUoKS0+c2VuZFNjcm9sbEV2ZW50KCk7CisgICAg
ICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVW
aWV3Kj4odGhpcyk7CisgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1l
KCkpIHsKKyAgICAgICAgICAgIGlmIChmcmFtZS0+c2hvdWxkQmxpbmtDYXJldCgpKQorICAgICAg
ICAgICAgICAgIGhvc3RXaW5kb3coKS0+Y2FyZXRSZWN0Q2hhbmdlZCgpOworICAgICAgICB9Cisg
ICAgICAgIG1fZGF0YS0+c2hvd1Njcm9sbGJhcnMoZGVsdGEud2lkdGgoKSAhPSAwLCBkZWx0YS5o
ZWlnaHQoKSAhPSAwLCBmYWxzZSk7CisgICAgfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgbW92
ZVJhbmdlVG9Db250YWluUmFuZ2UoaW50JiBjb250YWluZXJTdGFydCwgaW50IGNvbnRhaW5lcldp
ZHRoLCBpbnQgdGFyZ2V0U3RhcnQsIGludCB0YXJnZXRXaWR0aCkKK3sKKyAgICBpbnQgdGFyZ2V0
RW5kID0gdGFyZ2V0U3RhcnQgKyB0YXJnZXRXaWR0aDsKKyAgICBpZiAoY29udGFpbmVyU3RhcnQg
KyBjb250YWluZXJXaWR0aCA8IHRhcmdldEVuZCkgeworICAgICAgICBpZiAoY29udGFpbmVyU3Rh
cnQgPiB0YXJnZXRTdGFydCkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY29udGFpbmVy
U3RhcnQgPSB0YXJnZXRFbmQgLSBjb250YWluZXJXaWR0aDsKKyAgICB9CisKKyAgICBpZiAoY29u
dGFpbmVyU3RhcnQgPiB0YXJnZXRTdGFydCkKKyAgICAgICAgY29udGFpbmVyU3RhcnQgPSB0YXJn
ZXRTdGFydDsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzY3JvbGxSZWN0SW50b1ZpZXdNaW5pbXVt
U2Nyb2xsKGNvbnN0IEludFJlY3QmIHIpCit7CisgICAgU2Nyb2xsVmlldyogdmlldyA9IHRoaXM7
CisgICAgSW50UG9pbnQgY3VyUG9zID0gci5sb2NhdGlvbigpOworICAgIGZvciAoOzspIHsKKyAg
ICAgICAgaW50IHggPSB2aWV3LT5jb250ZW50c1goKTsKKyAgICAgICAgaW50IHkgPSB2aWV3LT5j
b250ZW50c1koKTsKKyAgICAgICAgbW92ZVJhbmdlVG9Db250YWluUmFuZ2UoeCwgdmlldy0+bV9k
YXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoLCBjdXJQb3MueCgpLCByLndpZHRoKCkpOworICAg
ICAgICBtb3ZlUmFuZ2VUb0NvbnRhaW5SYW5nZSh5LCB2aWV3LT5tX2RhdGEtPm1fdmlzaWJsZUNv
bnRlbnRzSGVpZ2h0LCBjdXJQb3MueSgpLCByLmhlaWdodCgpKTsKKworICAgICAgICB2aWV3LT5z
ZXRDb250ZW50c1Bvcyh4LCB5KTsKKworICAgICAgICBpZiAoU2Nyb2xsVmlldyogbmV4dFZpZXcg
PSBzdGF0aWNfY2FzdDxTY3JvbGxWaWV3Kj4odmlldy0+cGFyZW50KCkpKSB7CisgICAgICAgICAg
ICBjdXJQb3MubW92ZSh2aWV3LT54KCkgLSB2aWV3LT5jb250ZW50c1goKSwgdmlldy0+eSgpIC0g
dmlldy0+Y29udGVudHNZKCkpOworICAgICAgICAgICAgdmlldyA9IG5leHRWaWV3OworICAgICAg
ICB9IGVsc2UKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvL3N0YXRpY19jYXN0PEZy
YW1lVmlldyo+KHRoaXMpLT5mcmFtZSgpLT5zZW5kU2Nyb2xsRXZlbnQoKTsKKyAgICBjb25zdCBG
cmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmlldyo+KHRoaXMp
OworICAgIGlmIChGcmFtZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpIHsKKyAgICAgICAg
aWYgKGZyYW1lLT5zaG91bGRCbGlua0NhcmV0KCkpCisgICAgICAgICAgICBob3N0V2luZG93KCkt
PmNhcmV0UmVjdENoYW5nZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xs
UmVjdEludG9WaWV3UmVjdXJzaXZlbHkoY29uc3QgSW50UmVjdCYgcikKK3sKKyAgICBTY3JvbGxW
aWV3KiB2aWV3ID0gdGhpczsKKyAgICBJbnRQb2ludCBjdXJQb3MgPSByLmxvY2F0aW9uKCk7Cisg
ICAgZm9yICg7OykgeworICAgICAgICB2aWV3LT5zZXRDb250ZW50c1BvcyhjdXJQb3MueCgpLCBj
dXJQb3MueSgpKTsKKworICAgICAgICB2aWV3ID0gc3RhdGljX2Nhc3Q8U2Nyb2xsVmlldyo+KHZp
ZXctPnBhcmVudCgpKTsKKyAgICAgICAgaWYgKHZpZXcpCisgICAgICAgICAgICBjdXJQb3MubW92
ZSh2aWV3LT54KCkgLSB2aWV3LT5jb250ZW50c1goKSwgdmlldy0+eSgpIC0gdmlldy0+Y29udGVu
dHNZKCkpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgLy9z
dGF0aWNfY2FzdDxGcmFtZVZpZXcqPih0aGlzKS0+ZnJhbWUoKS0+c2VuZFNjcm9sbEV2ZW50KCk7
CisgICAgY29uc3QgRnJhbWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFt
ZVZpZXcqPih0aGlzKTsKKyAgICBpZiAoRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgp
KSB7CisgICAgICAgIGlmIChmcmFtZS0+c2hvdWxkQmxpbmtDYXJldCgpKQorICAgICAgICAgICAg
aG9zdFdpbmRvdygpLT5jYXJldFJlY3RDaGFuZ2VkKCk7CisgICAgfQorfQorCitXZWJDb3JlOjpT
Y3JvbGxiYXJNb2RlIFNjcm9sbFZpZXc6Omhvcml6b250YWxTY3JvbGxiYXJNb2RlKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gbV9kYXRhLT5tX2hTY3JvbGxiYXJNb2RlOworfQorCitXZWJDb3JlOjpT
Y3JvbGxiYXJNb2RlIFNjcm9sbFZpZXc6OnZlcnRpY2FsU2Nyb2xsYmFyTW9kZSgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIG1fZGF0YS0+bV92U2Nyb2xsYmFyTW9kZTsKK30KKwordm9pZCBTY3JvbGxW
aWV3OjpzZXRTY3JvbGxiYXJzU3VwcHJlc3NlZChib29sIHN1cHByZXNzZWQsIGJvb2wgcmVwYWlu
dE9uU3VwcHJlc3MpCit7CisgICAgbV9kYXRhLT5tX3Njcm9sbGJhcnNTdXBwcmVzc2VkID0gc3Vw
cHJlc3NlZDsKKyAgICBpZiAocmVwYWludE9uU3VwcHJlc3MgJiYgIXN1cHByZXNzZWQpCisgICAg
ICAgIG1fZGF0YS0+aW52YWxpZGF0ZVNjcm9sbGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7Cit9CisK
K3ZvaWQgU2Nyb2xsVmlldzo6c2V0SG9yaXpvbnRhbFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFyTW9k
ZSBuZXdNb2RlKQoreworICAgIGlmIChtX2FsbG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSAmJiBt
X2RhdGEtPm1faFNjcm9sbGJhck1vZGUgIT0gbmV3TW9kZSkgeworICAgICAgICBtX2RhdGEtPm1f
aFNjcm9sbGJhck1vZGUgPSBuZXdNb2RlOworICAgICAgICB1cGRhdGVTY3JvbGxiYXJzKG1fZGF0
YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRWZXJ0
aWNhbFNjcm9sbGJhck1vZGUoU2Nyb2xsYmFyTW9kZSBuZXdNb2RlKQoreworICAgIGlmIChtX2Fs
bG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSAmJiBtX2RhdGEtPm1fdlNjcm9sbGJhck1vZGUgIT0g
bmV3TW9kZSkgeworICAgICAgICBtX2RhdGEtPm1fdlNjcm9sbGJhck1vZGUgPSBuZXdNb2RlOwor
ICAgICAgICB1cGRhdGVTY3JvbGxiYXJzKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIH0K
K30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRTY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJNb2RlIGhv
cml6b250YWxNb2RlLCBTY3JvbGxiYXJNb2RlIHZlcnRpY2FsTW9kZSkKK3sKKyAgICBzZXRIb3Jp
em9udGFsU2Nyb2xsYmFyTW9kZShob3Jpem9udGFsTW9kZSk7CisgICAgc2V0VmVydGljYWxTY3Jv
bGxiYXJNb2RlKHZlcnRpY2FsTW9kZSk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6dXBkYXRlU2Ny
b2xsYmFycyhjb25zdCBJbnRTaXplJiBkZXNpcmVkT2Zmc2V0KQoreworICAgIC8vIERvbid0IGFs
bG93IHJlLWVudHJhbmN5IGludG8gdGhpcyBmdW5jdGlvbi4KKyAgICBpZiAobV9kYXRhLT5tX2lu
VXBkYXRlU2Nyb2xsYmFycykKKyAgICAgICAgcmV0dXJuOworCisgICAgLy8gRklYTUU6IFRoaXMg
Y29kZSBpcyBoZXJlIHNvIHdlIGRvbid0IGhhdmUgdG8gZm9yayBGcmFtZVZpZXcuaC8uY3BwLgor
ICAgIC8vIEluIHRoZSBlbmQsIEZyYW1lVmlldyBzaG91bGQganVzdCBtZXJnZSB3aXRoIFNjcm9s
bFZpZXcuCisgICAgRnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4o
dGhpcyktPmZyYW1lKCk7CisgICAgaWYgKCFmcmFtZSkKKyAgICAgICAgcmV0dXJuOworCisgICAg
bV9kYXRhLT5tX2luVXBkYXRlU2Nyb2xsYmFycyA9IHRydWU7CisgICAgYm9vbCB1c2VyU2Nyb2xs
ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyktPndhc1Njcm9sbGVkQnlVc2Vy
KCk7CisKKyAgICBib29sIGhhc1ZlcnRpY2FsU2Nyb2xsYmFyID0gbV9kYXRhLT5tX3ZCYXI7Cisg
ICAgYm9vbCBoYXNIb3Jpem9udGFsU2Nyb2xsYmFyID0gbV9kYXRhLT5tX2hCYXI7CisgICAgYm9v
bCBvbGRIYXNWZXJ0aWNhbCA9IGhhc1ZlcnRpY2FsU2Nyb2xsYmFyOworICAgIGJvb2wgb2xkSGFz
SG9yaXpvbnRhbCA9IGhhc0hvcml6b250YWxTY3JvbGxiYXI7CisgICAgU2Nyb2xsYmFyTW9kZSBo
U2Nyb2xsID0gbV9kYXRhLT5tX2hTY3JvbGxiYXJNb2RlOworICAgIFNjcm9sbGJhck1vZGUgdlNj
cm9sbCA9IG1fZGF0YS0+bV92U2Nyb2xsYmFyTW9kZTsKKworICAgIGludCBjV2lkdGggPSBjb250
ZW50c1dpZHRoKCk7CisgICAgaW50IGNIZWlnaHQgPSBjb250ZW50c0hlaWdodCgpOworICAgIGlu
dCB2V2lkdGggPSB3aWR0aCgpOworICAgIGludCB2SGVpZ2h0ID0gaGVpZ2h0KCk7CisKKyAgICBp
bnQgcGFnZUtlZXAgPSBjQW1vdW50VG9LZWVwV2hlblBhZ2luZzsKKyAgICBpbnQgbGluZVN0ZXAg
PSBjU2Nyb2xsYmFyUGl4ZWxzUGVyTGluZVN0ZXA7CisKKyAgICBpZiAoIW1fZGF0YS0+bV9zY3Jv
bGxiYXJzU3VwcHJlc3NlZCAmJiAoaFNjcm9sbCA9PSBTY3JvbGxiYXJBdXRvIHx8IHZTY3JvbGwg
PT0gU2Nyb2xsYmFyQXV0bykpIHsKKyAgICAgICAgZm9yIChpbnQgcGFzcyA9IDA7IHBhc3MgPCAy
OyArK3Bhc3MpIHsKKyAgICAgICAgICAgIC8vIERvIGEgbGF5b3V0IGlmIHBlbmRpbmcgYmVmb3Jl
IGNoZWNraW5nIGlmIHNjcm9sbGJhcnMgYXJlIG5lZWRlZC4KKyAgICAgICAgICAgIGlmIChoYXNW
ZXJ0aWNhbFNjcm9sbGJhciAhPSBvbGRIYXNWZXJ0aWNhbCB8fCBoYXNIb3Jpem9udGFsU2Nyb2xs
YmFyICE9IG9sZEhhc0hvcml6b250YWwpIHsKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxG
cmFtZVZpZXcqPih0aGlzKS0+bGF5b3V0SWZOZWVkZWRSZWN1cnNpdmUoKTsKKyAgICAgICAgICAg
ICAgICAvLyBBZnRlciByZS1sYXlvdXQsIGNvbnRlbnRzIHNpemUgbWF5IGhhdmUgY2hhbmdlZC4K
KyAgICAgICAgICAgICAgICBjV2lkdGggPSBjb250ZW50c1dpZHRoKCk7CisgICAgICAgICAgICAg
ICAgY0hlaWdodCA9IGNvbnRlbnRzSGVpZ2h0KCk7CisgICAgICAgICAgICAgICAgdldpZHRoID0g
d2lkdGgoKTsKKyAgICAgICAgICAgICAgICB2SGVpZ2h0ID0gaGVpZ2h0KCk7CisgICAgICAgICAg
ICB9CisKKyAgICAgICAgICAgIGJvb2wgc2Nyb2xsc1ZlcnRpY2FsbHkgPSBjSGVpZ2h0ID4gdkhl
aWdodDsKKyAgICAgICAgICAgIGJvb2wgc2Nyb2xsc0hvcml6b250YWxseSA9IGNXaWR0aCA+IHZX
aWR0aDsKKworICAgICAgICAgICAgaWYgKGhhc1ZlcnRpY2FsU2Nyb2xsYmFyICE9IHNjcm9sbHNW
ZXJ0aWNhbGx5KSB7CisgICAgICAgICAgICAgICAgbV9kYXRhLT5pbnZhbGlkYXRlU2Nyb2xsYmFy
cyhmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIG1fZGF0YS0+c2V0SGFzVmVy
dGljYWxTY3JvbGxiYXIoc2Nyb2xsc1ZlcnRpY2FsbHkpOworICAgICAgICAgICAgICAgIGhhc1Zl
cnRpY2FsU2Nyb2xsYmFyID0gc2Nyb2xsc1ZlcnRpY2FsbHk7CisgICAgICAgICAgICB9CisKKyAg
ICAgICAgICAgIGlmIChoYXNIb3Jpem9udGFsU2Nyb2xsYmFyICE9IHNjcm9sbHNIb3Jpem9udGFs
bHkpIHsKKyAgICAgICAgICAgICAgICBtX2RhdGEtPmludmFsaWRhdGVTY3JvbGxiYXJzKHRydWUs
IGZhbHNlLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbV9kYXRhLT5zZXRIYXNIb3Jpem9udGFs
U2Nyb2xsYmFyKHNjcm9sbHNIb3Jpem9udGFsbHkpOworICAgICAgICAgICAgICAgIGhhc0hvcml6
b250YWxTY3JvbGxiYXIgPSBzY3JvbGxzSG9yaXpvbnRhbGx5OworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgfQorCisgICAgLy8gU2V0IHVwIHRoZSByYW5nZSAoYW5kIHBhZ2Ugc3RlcC9s
aW5lIHN0ZXApLgorICAgIEludFNpemUgbWF4U2Nyb2xsUG9zaXRpb24oY1dpZHRoIC0gdldpZHRo
LCBjSGVpZ2h0IC0gdkhlaWdodCk7CisgICAgSW50U2l6ZSBzY3JvbGwgPSBkZXNpcmVkT2Zmc2V0
LnNocnVua1RvKG1heFNjcm9sbFBvc2l0aW9uKTsKKyAgICBzY3JvbGwuY2xhbXBOZWdhdGl2ZVRv
WmVybygpOworCisgICAgLy8gbV92QmFyLT5zZXRWYWx1ZSgpIGFuZCBtX2hCYXItPnNldFZhbHVl
KCkgd2lsbCB1cGRhdGVkIHNjcm9sbCBvZmZzZXRzIGFuZCBhbHNvIHNjcm9sbGVkIGJhY2tpbmcg
c3RvcmUKKyAgICBJbnRTaXplIG9sZFNjcm9sbE9mZnNldCA9IG1fZGF0YS0+bV9zY3JvbGxPZmZz
ZXQ7CisgICAgaWYgKCFtX2RhdGEtPm1faEJhcikKKyAgICAgICAgbV9kYXRhLT5tX3Njcm9sbE9m
ZnNldC5zZXRXaWR0aCgwKTsKKworICAgIGlmICghbV9kYXRhLT5tX3ZCYXIpCisgICAgICAgIG1f
ZGF0YS0+bV9zY3JvbGxPZmZzZXQuc2V0SGVpZ2h0KDApOworCisgICAgaWYgKG9sZFNjcm9sbE9m
ZnNldCAhPSBtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0KQorICAgICAgICBtX2RhdGEtPnNjcm9sbEJh
Y2tpbmdTdG9yZShJbnRTaXplKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQgLSBvbGRTY3JvbGxPZmZz
ZXQpKTsKKworICAgIEludFNpemUgaW5uZXJTaXplKG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNX
aWR0aCwgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCk7CisgICAgaWYgKG1fZGF0YS0+
bV9oQmFyKSB7CisgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRFbmFibGVkKGNXaWR0aCA+IHZX
aWR0aCk7CisgICAgICAgIGludCBwYWdlU3RlcCA9IHZXaWR0aCAtIHBhZ2VLZWVwOworICAgICAg
ICBpZiAocGFnZVN0ZXAgPCAwKSBwYWdlU3RlcCA9IHZXaWR0aDsKKyAgICAgICAgSW50UmVjdCBv
bGRSZWN0KG1fZGF0YS0+bV9oQmFyLT5mcmFtZVJlY3QoKSk7CisgICAgICAgIG1fZGF0YS0+bV9o
QmFyLT5zZXRSZWN0KG1fZGF0YS0+Z2V0SEJhclJlY3QoaW5uZXJTaXplKSk7CisgICAgICAgIGlm
ICghbV9kYXRhLT5tX3Njcm9sbGJhcnNTdXBwcmVzc2VkICYmIG9sZFJlY3QgIT0gbV9kYXRhLT5t
X2hCYXItPmZyYW1lUmVjdCgpKQorICAgICAgICAgICAgbV9kYXRhLT5pbnZhbGlkYXRlU2Nyb2xs
YmFycyh0cnVlLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgIGlmIChtX2RhdGEtPm1fc2Nyb2xs
YmFyc1N1cHByZXNzZWQpCisgICAgICAgICAgICBtX2RhdGEtPm1faEJhci0+c2V0U3VwcHJlc3NJ
bnZhbGlkYXRpb24odHJ1ZSk7CisgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRTdGVwcyhsaW5l
U3RlcCwgcGFnZVN0ZXApOworICAgICAgICBtX2RhdGEtPm1faEJhci0+c2V0UHJvcG9ydGlvbih2
V2lkdGgsIGNXaWR0aCk7CisgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5zZXRWYWx1ZShzY3JvbGwu
d2lkdGgoKSk7CisgICAgICAgIGlmIChtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQpCisg
ICAgICAgICAgICBtX2RhdGEtPm1faEJhci0+c2V0U3VwcHJlc3NJbnZhbGlkYXRpb24oZmFsc2Up
OworICAgIH0KKworICAgIGlmIChtX2RhdGEtPm1fdkJhcikgeworICAgICAgICBtX2RhdGEtPm1f
dkJhci0+c2V0RW5hYmxlZChjSGVpZ2h0ID4gdkhlaWdodCk7CisgICAgICAgIGludCBwYWdlU3Rl
cCA9IHZIZWlnaHQgLSBwYWdlS2VlcDsKKyAgICAgICAgaWYgKHBhZ2VTdGVwIDwgMCkgcGFnZVN0
ZXAgPSB2SGVpZ2h0OworICAgICAgICBJbnRSZWN0IG9sZFJlY3QobV9kYXRhLT5tX3ZCYXItPmZy
YW1lUmVjdCgpKTsKKyAgICAgICAgbV9kYXRhLT5tX3ZCYXItPnNldFJlY3QobV9kYXRhLT5nZXRW
QmFyUmVjdChpbm5lclNpemUpKTsKKyAgICAgICAgaWYgKCFtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1
cHByZXNzZWQgJiYgb2xkUmVjdCAhPSBtX2RhdGEtPm1fdkJhci0+ZnJhbWVSZWN0KCkpCisgICAg
ICAgICAgICBtX2RhdGEtPmludmFsaWRhdGVTY3JvbGxiYXJzKGZhbHNlLCB0cnVlLCBmYWxzZSk7
CisKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3NlZCkKKyAgICAgICAg
ICAgIG1fZGF0YS0+bV92QmFyLT5zZXRTdXBwcmVzc0ludmFsaWRhdGlvbih0cnVlKTsKKyAgICAg
ICAgbV9kYXRhLT5tX3ZCYXItPnNldFN0ZXBzKGxpbmVTdGVwLCBwYWdlU3RlcCk7CisgICAgICAg
IG1fZGF0YS0+bV92QmFyLT5zZXRQcm9wb3J0aW9uKHZIZWlnaHQsIGNIZWlnaHQpOworICAgICAg
ICBtX2RhdGEtPm1fdkJhci0+c2V0VmFsdWUoc2Nyb2xsLmhlaWdodCgpKTsKKyAgICAgICAgaWYg
KG1fZGF0YS0+bV9zY3JvbGxiYXJzU3VwcHJlc3NlZCkKKyAgICAgICAgICAgIG1fZGF0YS0+bV92
QmFyLT5zZXRTdXBwcmVzc0ludmFsaWRhdGlvbihmYWxzZSk7CisgICAgfQorCisgICAgc3RhdGlj
X2Nhc3Q8RnJhbWVWaWV3Kj4odGhpcyktPnNldFdhc1Njcm9sbGVkQnlVc2VyKHVzZXJTY3JvbGwp
OworICAgIG1fZGF0YS0+bV9pblVwZGF0ZVNjcm9sbGJhcnMgPSBmYWxzZTsKK30KKworU2Nyb2xs
YmFyKiBTY3JvbGxWaWV3OjpzY3JvbGxiYXJBdFBvaW50KGNvbnN0IEludFBvaW50JiB3aW5kb3dQ
b2ludCkKK3sKKyAgICBpZiAobV9kYXRhLT5tX3Njcm9sbGJhcnNWaXNpYmxlICYmIChtX2RhdGEt
PmNhblNob3dIU2Nyb2xsYmFyKCkgfHwgbV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigpKSkgewor
ICAgICAgICBJbnRQb2ludCB2aWV3UG9pbnQgPSB3aW5kb3dUb0NvbnRlbnRzKHdpbmRvd1BvaW50
KSAtIHNjcm9sbE9mZnNldCgpOworICAgICAgICBpZiAobV9kYXRhLT5jYW5TaG93SFNjcm9sbGJh
cigpICYmIG1fZGF0YS0+bV9oQmFyLT5mcmFtZVJlY3QoKS5jb250YWlucyh2aWV3UG9pbnQpKQor
ICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS0+bV9oQmFyLmdldCgpOworICAgICAgICBpZiAobV9k
YXRhLT5jYW5TaG93VlNjcm9sbGJhcigpICYmIG1fZGF0YS0+bV92QmFyLT5mcmFtZVJlY3QoKS5j
b250YWlucyh2aWV3UG9pbnQpKQorICAgICAgICAgICAgcmV0dXJuIG1fZGF0YS0+bV92QmFyLmdl
dCgpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitib29sIFNjcm9sbFZpZXc6OnNjcm9s
bGJhcnNNb3VzZVByZXNzRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBtb3VzZUV2ZW50
KQoreworICAgIGlmIChwYXJlbnQoKQorICAgICAgICA/IG1fZGF0YS0+Z2V0VmlzaWJsZUNvbnRl
bnRSZWN0KCkuY29udGFpbnMocGFyZW50KCktPndpbmRvd1RvQ29udGVudHMobW91c2VFdmVudC5w
b3MoKSkpCisgICAgICAgIDogdmlzaWJsZVdpbmRvd1JlY3QoKS5jb250YWlucyhtb3VzZUV2ZW50
LnBvcygpKSkgeworCisgICAgICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGlj
X2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgICAgIEZyYW1lKiBmcmFtZSA9IGZy
YW1lVmlldy0+ZnJhbWUoKTsKKworICAgICAgICBpZiAoZnJhbWUpIHsKKyAgICAgICAgICAgIGZv
ciAoRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hp
bGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICAgICAgRnJh
bWVWaWV3KiB2aWV3ID0gY2hpbGQtPnZpZXcoKTsKKyAgICAgICAgICAgICAgICBpZiAodmlldyAm
JiB2aWV3LT5zY3JvbGxiYXJzTW91c2VQcmVzc0V2ZW50KG1vdXNlRXZlbnQpKQorICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg
ICAgIEludFBvaW50IHZpZXdQb2ludCA9IHdpbmRvd1RvQ29udGVudHMobW91c2VFdmVudC5wb3Mo
KSk7CisgICAgICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRvciBpID0g
bV9kYXRhLT5tX2NoaWxkcmVuLmJlZ2luKCk7IGkgIT0gbV9kYXRhLT5tX2NoaWxkcmVuLmVuZCgp
OyArK2kpIHsKKyAgICAgICAgICAgIGlmICghKCppKS0+aXNTY3JvbGxiYXIoKSB8fCAoKmkpLT5p
c1ZpZXdTY3JvbGxiYXIoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
IFBsYXRmb3JtU2Nyb2xsYmFyKiBzY3JvbGxiYXIgPSBzdGF0aWNfY2FzdDxQbGF0Zm9ybVNjcm9s
bGJhcio+KGktPmdldCgpKTsKKyAgICAgICAgICAgIGlmIChzY3JvbGxiYXItPmlzVmlzaWJsZSgp
ICYmIHNjcm9sbGJhci0+ZnJhbWVSZWN0KCkuY29udGFpbnModmlld1BvaW50KSkgeworICAgICAg
ICAgICAgICAgIG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZSA9IHNjcm9sbGJhcjsK
KyAgICAgICAgICAgICAgICBpZiAobV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlICYm
IG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZS0+aXNFbmFibGVkKCkpIHsKKyAgICAg
ICAgICAgICAgICAgICAgbV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlLT5oYW5kbGVN
b3VzZVByZXNzRXZlbnQobW91c2VFdmVudCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBt
X2RhdGEtPm1fcHJldk1vdXNlRG93biA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1fZGF0YS0+bV9wcmV2TW91c2VE
b3duID0gZmFsc2U7CisgICAgfQorCisgICAgbV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1v
dXNlID0gc3RhdGljX2Nhc3Q8UGxhdGZvcm1TY3JvbGxiYXIqPihzY3JvbGxiYXJBdFBvaW50KG1v
dXNlRXZlbnQucG9zKCkpKTsKKyAgICBpZiAobV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1v
dXNlICYmIG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3VzZS0+aXNFbmFibGVkKCkpIHsK
KyAgICAgICAgbV9kYXRhLT5tX3ByZXZTY3JvbGxiYXJVbmRlck1vdXNlLT5oYW5kbGVNb3VzZVBy
ZXNzRXZlbnQobW91c2VFdmVudCk7CisgICAgICAgIHJldHVybiBtX2RhdGEtPm1fcHJldk1vdXNl
RG93biA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIG1fZGF0YS0+bV9wcmV2TW91c2VEb3du
ID0gZmFsc2U7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6c2Nyb2xsYmFyc01vdXNlTW92ZUV2ZW50
KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYgbW91c2VFdmVudCkKK3sKKyAgICBpZiAobV9kYXRh
LT5tX3ByZXZNb3VzZURvd24pIHsKKyAgICAgICAgaWYgKG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFy
VW5kZXJNb3VzZSkKKyAgICAgICAgICAgIG1fZGF0YS0+bV9wcmV2U2Nyb2xsYmFyVW5kZXJNb3Vz
ZS0+aGFuZGxlTW91c2VNb3ZlRXZlbnQobW91c2VFdmVudCk7CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8
Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5m
cmFtZSgpOworCisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGZvciAoRnJhbWUqIGNoaWxkID0g
ZnJhbWUtPnRyZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgp
LT5uZXh0U2libGluZygpKSB7CisgICAgICAgICAgICBGcmFtZVZpZXcqIHZpZXcgPSBjaGlsZC0+
dmlldygpOworICAgICAgICAgICAgaWYgKHZpZXcgJiYgdmlldy0+c2Nyb2xsYmFyc01vdXNlTW92
ZUV2ZW50KG1vdXNlRXZlbnQpKQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAg
ICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNjcm9sbFZpZXc6OnNj
cm9sbGJhcnNNb3VzZVJlbGVhc2VFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIG1vdXNl
RXZlbnQpCit7CisgICAgYm9vbCBwcmV2TW91c2VEb3duID0gbV9kYXRhLT5tX3ByZXZNb3VzZURv
d247CisgICAgbV9kYXRhLT5tX3ByZXZNb3VzZURvd24gPSBmYWxzZTsKKworICAgIGlmIChwcmV2
TW91c2VEb3duKSB7CisgICAgICAgIGlmIChtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91
c2UpCisgICAgICAgICAgICBtX2RhdGEtPm1fcHJldlNjcm9sbGJhclVuZGVyTW91c2UtPmhhbmRs
ZU1vdXNlUmVsZWFzZUV2ZW50KG1vdXNlRXZlbnQpOworICAgICAgICBtX2RhdGEtPm1fcHJldlNj
cm9sbGJhclVuZGVyTW91c2UgPSAwOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAg
ICBjb25zdCBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PGNvbnN0IEZyYW1lVmll
dyo+KHRoaXMpOworICAgIEZyYW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUoKTsKKworICAg
IGlmIChmcmFtZSkgeworICAgICAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1lLT50cmVlKCkt
PmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4dFNpYmxpbmco
KSkgeworICAgICAgICAgICAgRnJhbWVWaWV3KiB2aWV3ID0gY2hpbGQtPnZpZXcoKTsKKyAgICAg
ICAgICAgIGlmICh2aWV3ICYmIHZpZXctPnNjcm9sbGJhcnNNb3VzZVJlbGVhc2VFdmVudChtb3Vz
ZUV2ZW50KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjphZGRDaGlsZChXaWRn
ZXQqIGNoaWxkKQoreworICAgIGNoaWxkLT5zZXRQYXJlbnQodGhpcyk7CisgICAgLy9jaGlsZC0+
c2V0UGxhdGZvcm1XaWRnZXQocGxhdGZvcm1XaWRnZXQoKSk7CisgICAgbV9kYXRhLT5tX2NoaWxk
cmVuLmFkZChjaGlsZCk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6cmVtb3ZlQ2hpbGQoV2lkZ2V0
KiBjaGlsZCkKK3sKKyAgICBpZiAoc3RhdGljX2Nhc3Q8V2lkZ2V0Kj4obV9kYXRhLT5tX3ByZXZT
Y3JvbGxiYXJVbmRlck1vdXNlKSA9PSBjaGlsZCkgeworICAgICAgICBtX2RhdGEtPm1fcHJldlNj
cm9sbGJhclVuZGVyTW91c2UgPSAwOworICAgICAgICBtX2RhdGEtPm1fcHJldk1vdXNlRG93biA9
IGZhbHNlOworICAgIH0KKworICAgIGNoaWxkLT5zZXRQYXJlbnQoMCk7CisgICAgbV9kYXRhLT5t
X2NoaWxkcmVuLnJlbW92ZShjaGlsZCk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6cGFpbnQoR3Jh
cGhpY3NDb250ZXh0KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0KQoreworICAgIC8vIEZJ
WE1FOiBUaGlzIGNvZGUgaXMgaGVyZSBzbyB3ZSBkb24ndCBoYXZlIHRvIGZvcmsgRnJhbWVWaWV3
LmgvLmNwcC4KKyAgICAvLyBJbiB0aGUgZW5kLCBGcmFtZVZpZXcgc2hvdWxkIGp1c3QgbWVyZ2Ug
d2l0aCBTY3JvbGxWaWV3LgorICAgIEFTU0VSVChpc0ZyYW1lVmlldygpKTsKKworICAgIGlmIChj
b250ZXh0LT5wYWludGluZ0Rpc2FibGVkKCkgfHwgcmVjdC5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIGNvbnRleHQtPnNhdmUoKTsKKworICAgIGlmICghcGFyZW50KCkpIHsKKyAg
ICAgICAgY29udGV4dC0+dHJhbnNsYXRlKC1zdGFibGVSb3VuZChjb250ZW50c1goKSAqIHNjYWxl
KCkpLCAtc3RhYmxlUm91bmQoY29udGVudHNZKCkgKiBzY2FsZSgpKSk7CisgICAgICAgIGNvbnRl
eHQtPnNjYWxlKEZsb2F0U2l6ZShzY2FsZSgpLCBzY2FsZSgpKSk7CisgICAgfQorCisgICAgYm9v
bCBkcmF3U2Nyb2xsYmFycyA9IHBhcmVudCgpICYmICFtX2RhdGEtPm1fc2Nyb2xsYmFyc1N1cHBy
ZXNzZWQgJiYgbV9kYXRhLT5tX3Njcm9sbGJhcnNWaXNpYmxlCisgICAgICAgICAgICAgICAgJiYg
KG1fZGF0YS0+Y2FuU2hvd1ZTY3JvbGxiYXIoKSB8fCBtX2RhdGEtPmNhblNob3dIU2Nyb2xsYmFy
KCkpOworICAgIEludFJlY3QgY29udGVudHNDbGlwUmVjdDsKKyAgICBpZiAoIXBhcmVudCgpKSB7
CisgICAgICAgIEZsb2F0UmVjdCBjb250ZW50c05vU2Nyb2xsOworICAgICAgICAvLyBlbnN1cmUg
dGhlIGNsaXAgcmVjdCBpcyBiaWcgZW5vdWdoIHRvIGF2b2lkIG1pc3NpbmcgcGl4ZWxzLgorICAg
ICAgICBjb250ZW50c05vU2Nyb2xsLnNldFgoKHJlY3QueCgpIC0geCgpKSAvIHNjYWxlKCkpOwor
ICAgICAgICBjb250ZW50c05vU2Nyb2xsLnNldFkoKHJlY3QueSgpIC0geSgpKSAvIHNjYWxlKCkp
OworICAgICAgICBjb250ZW50c05vU2Nyb2xsLnNldFdpZHRoKHJlY3QucmlnaHQoKSAvIHNjYWxl
KCkgLSBjb250ZW50c05vU2Nyb2xsLngoKSk7CisgICAgICAgIGNvbnRlbnRzTm9TY3JvbGwuc2V0
SGVpZ2h0KHJlY3QuYm90dG9tKCkgLyBzY2FsZSgpIC0gY29udGVudHNOb1Njcm9sbC55KCkpOwor
ICAgICAgICBjb250ZW50c05vU2Nyb2xsLmluZmxhdGUoMSk7CisgICAgICAgIGNvbnRlbnRzQ2xp
cFJlY3QgPSBlbmNsb3NpbmdJbnRSZWN0KGNvbnRlbnRzTm9TY3JvbGwpOworICAgICAgICBjb250
ZW50c0NsaXBSZWN0LnNldExvY2F0aW9uKGNvbnRlbnRzQ2xpcFJlY3QubG9jYXRpb24oKSArIG1f
ZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnRlbnRzQ2xp
cFJlY3Quc2V0TG9jYXRpb24ocmVjdC5sb2NhdGlvbigpIC0gSW50U2l6ZSh4KCksIHkoKSkgKyBt
X2RhdGEtPm1fc2Nyb2xsT2Zmc2V0KTsKKyAgICAgICAgY29udGVudHNDbGlwUmVjdC5zZXRTaXpl
KHJlY3Quc2l6ZSgpKTsKKyAgICAgICAgY29udGVudHNDbGlwUmVjdC5pbmZsYXRlKDEpOworICAg
ICAgICBjb250ZW50c0NsaXBSZWN0LmludGVyc2VjdChlbmNsb3NpbmdJbnRSZWN0KHZpc2libGVD
b250ZW50UmVjdCgpKSk7CisgICAgICAgIGNvbnRleHQtPnRyYW5zbGF0ZSh4KCksIHkoKSk7Cisg
ICAgICAgIFRyYW5zZm9ybWF0aW9uTWF0cml4JiB0ciA9IGNvbnRleHQtPmFmZmluZVRyYW5zZm9y
bSgpOworICAgICAgICB0ci5zZXRFKHN0YWJsZVJvdW5kKHRyLmUoKSkpOworICAgICAgICB0ci5z
ZXRGKHN0YWJsZVJvdW5kKHRyLmYoKSkpOworICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUoLWNv
bnRlbnRzWCgpLCAtY29udGVudHNZKCkpOworICAgIH0KKworICAgIFRyYW5zZm9ybWF0aW9uTWF0
cml4JiB0ciA9IGNvbnRleHQtPmFmZmluZVRyYW5zZm9ybSgpOworICAgIHRyLnNldEUoLXN0YWJs
ZVJvdW5kKC10ci5lKCkpKTsKKyAgICB0ci5zZXRGKC1zdGFibGVSb3VuZCgtdHIuZigpKSk7CisK
KyAgICBjb250ZXh0LT5jbGlwKGNvbnRlbnRzQ2xpcFJlY3QpOworCisgICAgc3RhdGljX2Nhc3Q8
RnJhbWVWaWV3Kj4odGhpcyktPnBhaW50Q29udGVudHMoY29udGV4dCwgY29udGVudHNDbGlwUmVj
dCk7CisKKyAgICBjb250ZXh0LT5yZXN0b3JlKCk7CisKKyAgICBpZiAoZHJhd1Njcm9sbGJhcnMp
IHsKKyAgICAgICAgY29udGV4dC0+c2F2ZSgpOworICAgICAgICBjb250ZXh0LT50cmFuc2xhdGUo
eCgpLCB5KCkpOworICAgICAgICBUcmFuc2Zvcm1hdGlvbk1hdHJpeCYgdHIgPSBjb250ZXh0LT5h
ZmZpbmVUcmFuc2Zvcm0oKTsKKyAgICAgICAgdHIuc2V0RShzdGFibGVSb3VuZCh0ci5lKCkpKTsK
KyAgICAgICAgdHIuc2V0RihzdGFibGVSb3VuZCh0ci5mKCkpKTsKKworICAgICAgICBJbnRSZWN0
IHNjcm9sbFZpZXdEaXJ0eVJlY3Q7CisgICAgICAgIHNjcm9sbFZpZXdEaXJ0eVJlY3Quc2V0TG9j
YXRpb24ocmVjdC5sb2NhdGlvbigpIC0gSW50U2l6ZSh4KCksIHkoKSkpOworICAgICAgICBzY3Jv
bGxWaWV3RGlydHlSZWN0LnNldFNpemUocmVjdC5zaXplKCkpOworCisgICAgICAgIGlmIChtX2Rh
dGEtPmNhblNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBtX2RhdGEtPm1faEJhci0+cGFp
bnQoY29udGV4dCwgc2Nyb2xsVmlld0RpcnR5UmVjdCk7CisgICAgICAgIGlmIChtX2RhdGEtPmNh
blNob3dWU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBtX2RhdGEtPm1fdkJhci0+cGFpbnQoY29u
dGV4dCwgc2Nyb2xsVmlld0RpcnR5UmVjdCk7CisKKyAgICAgICAgLy8gRmlsbCB0aGUgc2Nyb2xs
IGNvcm5lciB3aXRoIHdoaXRlLgorICAgICAgICBEV09SRCBjb2xvcldpbiA9IEdldFN5c0NvbG9y
KENPTE9SX1NDUk9MTEJBUik7CisgICAgICAgIENvbG9yIGNvcm5lckNvbG9yKEdldFJWYWx1ZShj
b2xvcldpbiksIEdldEdWYWx1ZShjb2xvcldpbiksIEdldEJWYWx1ZShjb2xvcldpbikpOworICAg
ICAgICBJbnRTaXplIGlubmVyU2l6ZShtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzV2lkdGgsIG1f
ZGF0YS0+bV92aXNpYmxlQ29udGVudHNIZWlnaHQpOworICAgICAgICBJbnRSZWN0IGhDb3JuZXIg
PSBtX2RhdGEtPmdldEhDb3JuZXIoaW5uZXJTaXplKTsKKyAgICAgICAgaWYgKGhDb3JuZXIuaW50
ZXJzZWN0cyhzY3JvbGxWaWV3RGlydHlSZWN0KSkKKyAgICAgICAgICAgIGNvbnRleHQtPmZpbGxS
ZWN0KGhDb3JuZXIsIGNvcm5lckNvbG9yKTsKKworICAgICAgICBJbnRSZWN0IHZDb3JuZXIgPSBt
X2RhdGEtPmdldFZDb3JuZXIoaW5uZXJTaXplKTsKKyAgICAgICAgaWYgKHZDb3JuZXIgIT0gaENv
cm5lciAmJiB2Q29ybmVyLmludGVyc2VjdHMoc2Nyb2xsVmlld0RpcnR5UmVjdCkpCisgICAgICAg
ICAgICBjb250ZXh0LT5maWxsUmVjdCh2Q29ybmVyLCBjb3JuZXJDb2xvcik7CisKKyAgICAgICAg
Y29udGV4dC0+cmVzdG9yZSgpOworICAgIH0KK30KKwordm9pZCBTY3JvbGxWaWV3Ojp3aGVlbEV2
ZW50KFBsYXRmb3JtV2hlZWxFdmVudCYgZSkKK3sKKyAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2gg
d2Ugd2FudCB0byBzY3JvbGwuICBJZiB3ZSBjYW4gbW92ZSBhdCBhbGwsIHdlIHdpbGwgYWNjZXB0
IHRoZSBldmVudC4KKyAgICBJbnRTaXplIG1heFNjcm9sbERlbHRhID0gbWF4aW11bVNjcm9sbCgp
OworICAgIGlmICgoZS5kZWx0YVgoKSA8IDAgJiYgbWF4U2Nyb2xsRGVsdGEud2lkdGgoKSA+IDAp
IHx8CisgICAgICAgIChlLmRlbHRhWCgpID4gMCAmJiBzY3JvbGxPZmZzZXQoKS53aWR0aCgpID4g
MCkgfHwKKyAgICAgICAgKGUuZGVsdGFZKCkgPCAwICYmIG1heFNjcm9sbERlbHRhLmhlaWdodCgp
ID4gMCkgfHwKKyAgICAgICAgKGUuZGVsdGFZKCkgPiAwICYmIHNjcm9sbE9mZnNldCgpLmhlaWdo
dCgpID4gMCkpCisgICAgICAgIGUuYWNjZXB0KCk7CisKKyAgICBzY3JvbGxCeSgtZS5kZWx0YVgo
KSAqIGNTY3JvbGxiYXJQaXhlbHNQZXJMaW5lU3RlcCwgLWUuZGVsdGFZKCkgKiBjU2Nyb2xsYmFy
UGl4ZWxzUGVyTGluZVN0ZXApOworfQorCitjb25zdCBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID4q
IFNjcm9sbFZpZXc6OmNoaWxkcmVuKCkgY29uc3QKK3sKKyAgICByZXR1cm4gJihtX2RhdGEtPm1f
Y2hpbGRyZW4pOworfQorCit2b2lkIFNjcm9sbFZpZXc6OmZyYW1lUmVjdHNDaGFuZ2VkKCkgY29u
c3QKK3sKKyAgICBjb25zdCBGcmFtZVZpZXcqIGZyYW1lVmlldyA9IHN0YXRpY19jYXN0PGNvbnN0
IEZyYW1lVmlldyo+KHRoaXMpOworICAgIEZyYW1lKiBmcmFtZSA9IGZyYW1lVmlldy0+ZnJhbWUo
KTsKKworICAgIGlmIChmcmFtZSkgeworICAgICAgICBmb3IgKEZyYW1lKiBjaGlsZCA9IGZyYW1l
LT50cmVlKCktPmZpcnN0Q2hpbGQoKTsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPnRyZWUoKS0+bmV4
dFNpYmxpbmcoKSkgeworICAgICAgICAgICAgaWYgKEZyYW1lVmlldyogdmlldyA9IGNoaWxkLT52
aWV3KCkpCisgICAgICAgICAgICAgICAgdmlldy0+ZnJhbWVSZWN0c0NoYW5nZWQoKTsKKyAgICAg
ICAgfQorICAgIH0KKworICAgIGhpZGVDdXJyZW50UG9wdXBNZW51KCk7CisKKyAgICBIYXNoU2V0
PFJlZlB0cjxXaWRnZXQ+ID46OmNvbnN0X2l0ZXJhdG9yIGVuZCA9IG1fZGF0YS0+bV9jaGlsZHJl
bi5lbmQoKTsKKyAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6Y29uc3RfaXRlcmF0
b3IgY3VycmVudCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5iZWdpbigpOyBjdXJyZW50ICE9IGVuZDsg
KytjdXJyZW50KQorICAgICAgICAoKmN1cnJlbnQpLT5mcmFtZVJlY3RzQ2hhbmdlZCgpOworfQor
Citib29sIFNjcm9sbFZpZXc6OnNjcm9sbChTY3JvbGxEaXJlY3Rpb24gZGlyZWN0aW9uLCBTY3Jv
bGxHcmFudWxhcml0eSBncmFudWxhcml0eSkKK3sKKyAgICBpZiAgKChkaXJlY3Rpb24gPT0gU2Ny
b2xsVXAgfHwgZGlyZWN0aW9uID09IFNjcm9sbERvd24pICYmIG1fZGF0YS0+bV92QmFyKQorICAg
ICAgICByZXR1cm4gbV9kYXRhLT5tX3ZCYXItPnNjcm9sbChkaXJlY3Rpb24sIGdyYW51bGFyaXR5
LCAxKTsKKyAgICBlbHNlIGlmIChtX2RhdGEtPm1faEJhcikKKyAgICAgICAgcmV0dXJuIG1fZGF0
YS0+bV9oQmFyLT5zY3JvbGwoZGlyZWN0aW9uLCBncmFudWxhcml0eSwgMSk7CisKKyAgICByZXR1
cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgc2Nyb2xsU2Nyb2xsYmFyKFBsYXRmb3JtU2Nyb2xs
YmFyKiBiYXIsIGludCBvZmZzZXQpCit7CisgICAgaW50IG92ZXJmbG93VmFsdWUgPSBiYXItPnZh
bHVlKCkgKyBvZmZzZXQ7CisKKyAgICAvLyBTY3JvbGxiYXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhl
IGJvdW5kYXJpZXMuCisgICAgYmFyLT5zZXRWYWx1ZShvdmVyZmxvd1ZhbHVlKTsKKworICAgIHJl
dHVybiBvdmVyZmxvd1ZhbHVlIC0gYmFyLT52YWx1ZSgpOworfQorCitpbnQgU2Nyb2xsVmlldzo6
bW92ZVN1YmZyYW1lSW50b1ZpZXcoY29uc3QgSW50UmVjdCYgcmVjdCwgYm9vbCB2ZXJ0aWNhbCwg
aW50IG1heE9mZnNldCkKK3sKKyAgICBpZiAobWF4T2Zmc2V0KSB7CisgICAgICAgIGlmIChQbGF0
Zm9ybVNjcm9sbGJhciogYmFyID0gdmVydGljYWwgPyBtX2RhdGEtPm1fdkJhci5nZXQoKSA6IG1f
ZGF0YS0+bV9oQmFyLmdldCgpKSB7CisgICAgICAgICAgICBpbnQgc2Nyb2xsZWQgPSB2ZXJ0aWNh
bAorICAgICAgICAgICAgICAgID8gbWF4T2Zmc2V0ID4gMAorICAgICAgICAgICAgICAgICAgICA/
IHJlY3QuYm90dG9tKCkgLSBzdGFibGVSb3VuZChtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LmhlaWdo
dCgpICsgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c0hlaWdodCkKKyAgICAgICAgICAgICAgICAg
ICAgOiByZWN0LnkoKSAtIHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQuaGVpZ2h0
KCkpCisgICAgICAgICAgICAgICAgOiBtYXhPZmZzZXQgPiAwCisgICAgICAgICAgICAgICAgICAg
ID8gcmVjdC5yaWdodCgpIC0gc3RhYmxlUm91bmQobV9kYXRhLT5tX3Njcm9sbE9mZnNldC53aWR0
aCgpICsgbV9kYXRhLT5tX3Zpc2libGVDb250ZW50c1dpZHRoKQorICAgICAgICAgICAgICAgICAg
ICA6IHJlY3QueCgpIC0gc3RhYmxlUm91bmQobV9kYXRhLT5tX3Njcm9sbE9mZnNldC53aWR0aCgp
KTsKKworICAgICAgICAgICAgaWYgKHNjcm9sbGVkID4gMCAmJiBtYXhPZmZzZXQgPiAwKQorICAg
ICAgICAgICAgICAgIHNjcm9sbGVkID0gbWluKG1heE9mZnNldCwgc2Nyb2xsZWQpOworICAgICAg
ICAgICAgZWxzZSBpZiAoc2Nyb2xsZWQgPCAwICYmIG1heE9mZnNldCA8IDApCisgICAgICAgICAg
ICAgICAgc2Nyb2xsZWQgPSBtYXgobWF4T2Zmc2V0LCBzY3JvbGxlZCk7CisKKyAgICAgICAgICAg
IG1heE9mZnNldCAtPSBzY3JvbGxlZDsKKyAgICAgICAgICAgIHNjcm9sbGVkID0gc2Nyb2xsUmVj
dXJzaXZlbHkodmVydGljYWwsIHNjcm9sbGVkKTsKKyAgICAgICAgICAgIG1heE9mZnNldCArPSBz
Y3JvbGxlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBtYXhPZmZzZXQ7Cit9CisK
K2ludCBTY3JvbGxWaWV3OjpzY3JvbGxSZWN1cnNpdmVseShib29sIHZlcnRpY2FsLCBpbnQgb2Zm
c2V0KQoreworICAgIGlmIChwYXJlbnQoKSkKKyAgICAgICAgb2Zmc2V0ID0gcGFyZW50KCktPm1v
dmVTdWJmcmFtZUludG9WaWV3KGZyYW1lUmVjdCgpLCB2ZXJ0aWNhbCwgb2Zmc2V0KTsKKworICAg
IGlmIChvZmZzZXQpCisgICAgICAgIGlmIChQbGF0Zm9ybVNjcm9sbGJhciogYmFyID0gdmVydGlj
YWwgPyBtX2RhdGEtPm1fdkJhci5nZXQoKSA6IG1fZGF0YS0+bV9oQmFyLmdldCgpKQorICAgICAg
ICAgICAgb2Zmc2V0ID0gc2Nyb2xsU2Nyb2xsYmFyKGJhciwgb2Zmc2V0KTsKKworICAgIGlmIChv
ZmZzZXQgJiYgcGFyZW50KCkpCisgICAgICAgIG9mZnNldCA9IHBhcmVudCgpLT5zY3JvbGxSZWN1
cnNpdmVseSh2ZXJ0aWNhbCwgb2Zmc2V0KTsKKworICAgIHJldHVybiBvZmZzZXQ7Cit9CisKK3Zv
aWQgU2Nyb2xsVmlldzo6bW92ZVN1YmZyYW1lSW50b1ZpZXcoY29uc3QgSW50UmVjdCYgcmVjdCwg
SW50U2l6ZSYgbWF4T2Zmc2V0LCBib29sIHNob3dTY3JvbGxiYXJzKQoreworICAgIEludFNpemUg
c2Nyb2xsZWQoMCwgMCk7CisgICAgaWYgKG1heE9mZnNldC53aWR0aCgpKSB7CisgICAgICAgIGlm
IChQbGF0Zm9ybVNjcm9sbGJhciogYmFyID0gbV9kYXRhLT5tX2hCYXIuZ2V0KCkpIHsKKyAgICAg
ICAgICAgIHNjcm9sbGVkLnNldFdpZHRoKG1heE9mZnNldC53aWR0aCgpID4gMAorICAgICAgICAg
ICAgICAgICAgICA/IHJlY3QucmlnaHQoKSAtIHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxP
ZmZzZXQud2lkdGgoKSArIG1fZGF0YS0+bV92aXNpYmxlQ29udGVudHNXaWR0aCkKKyAgICAgICAg
ICAgICAgICAgICAgOiByZWN0LngoKSAtIHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9zY3JvbGxPZmZz
ZXQud2lkdGgoKSkpOworCisgICAgICAgICAgICBpZiAoc2Nyb2xsZWQud2lkdGgoKSA+IDAgJiYg
bWF4T2Zmc2V0LndpZHRoKCkgPiAwKQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldFdpZHRo
KG1pbihtYXhPZmZzZXQud2lkdGgoKSwgc2Nyb2xsZWQud2lkdGgoKSkpOworICAgICAgICAgICAg
ZWxzZSBpZiAoc2Nyb2xsZWQud2lkdGgoKSA8IDAgJiYgbWF4T2Zmc2V0LndpZHRoKCkgPCAwKQor
ICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldFdpZHRoKG1heChtYXhPZmZzZXQud2lkdGgoKSwg
c2Nyb2xsZWQud2lkdGgoKSkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNj
cm9sbGVkLnNldFdpZHRoKDApOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtYXhPZmZzZXQu
aGVpZ2h0KCkpIHsKKyAgICAgICAgaWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSBtX2RhdGEt
Pm1fdkJhci5nZXQoKSkgeworICAgICAgICAgICAgc2Nyb2xsZWQuc2V0SGVpZ2h0KG1heE9mZnNl
dC5oZWlnaHQoKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgPyByZWN0LmJvdHRvbSgpIC0gc3Rh
YmxlUm91bmQobV9kYXRhLT5tX3Njcm9sbE9mZnNldC5oZWlnaHQoKSArIG1fZGF0YS0+bV92aXNp
YmxlQ29udGVudHNIZWlnaHQpCisgICAgICAgICAgICAgICAgICAgIDogcmVjdC55KCkgLSBzdGFi
bGVSb3VuZChtX2RhdGEtPm1fc2Nyb2xsT2Zmc2V0LmhlaWdodCgpKSk7CisKKyAgICAgICAgICAg
IGlmIChzY3JvbGxlZC5oZWlnaHQoKSA+IDAgJiYgbWF4T2Zmc2V0LmhlaWdodCgpID4gMCkKKyAg
ICAgICAgICAgICAgICBzY3JvbGxlZC5zZXRIZWlnaHQobWluKG1heE9mZnNldC5oZWlnaHQoKSwg
c2Nyb2xsZWQuaGVpZ2h0KCkpKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKHNjcm9sbGVkLmhlaWdo
dCgpIDwgMCAmJiBtYXhPZmZzZXQuaGVpZ2h0KCkgPCAwKQorICAgICAgICAgICAgICAgIHNjcm9s
bGVkLnNldEhlaWdodChtYXgobWF4T2Zmc2V0LmhlaWdodCgpLCBzY3JvbGxlZC5oZWlnaHQoKSkp
OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHNjcm9sbGVkLnNldEhlaWdodCgw
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2Nyb2xsZWQud2lkdGgoKSB8fCBzY3JvbGxl
ZC5oZWlnaHQoKSkgeworICAgICAgICBtYXhPZmZzZXQgLT0gc2Nyb2xsZWQ7CisgICAgICAgIHNj
cm9sbFJlY3Vyc2l2ZWx5KHNjcm9sbGVkLCBzaG93U2Nyb2xsYmFycyk7CisgICAgICAgIG1heE9m
ZnNldCArPSBzY3JvbGxlZDsKKyAgICB9Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xsUmVj
dXJzaXZlbHkoSW50U2l6ZSYgb2Zmc2V0LCBib29sIHNob3dTY3JvbGxiYXJzKQoreworICAgIGlm
ICghb2Zmc2V0LndpZHRoKCkgJiYgIW9mZnNldC5oZWlnaHQoKSkKKyAgICAgICAgcmV0dXJuOwor
CisgICAgaWYgKHBhcmVudCgpKQorICAgICAgICBwYXJlbnQoKS0+bW92ZVN1YmZyYW1lSW50b1Zp
ZXcoZnJhbWVSZWN0KCksIG9mZnNldCwgc2hvd1Njcm9sbGJhcnMpOworCisgICAgSW50U2l6ZSBv
bGRPZmZzZXQobV9kYXRhLT5tX3Njcm9sbE9mZnNldCk7CisgICAgYm9vbCBvbGRTdXBwcmVzc2Vk
ID0gbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2VkOworICAgIG1fZGF0YS0+bV9zaG93
U2Nyb2xsYmFyU3VwcHJlc3NlZCA9IHRydWU7CisKKyAgICBpZiAob2Zmc2V0LndpZHRoKCkpIHsK
KyAgICAgICAgaWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSBtX2RhdGEtPm1faEJhci5nZXQo
KSkKKyAgICAgICAgICAgIG9mZnNldC5zZXRXaWR0aChzY3JvbGxTY3JvbGxiYXIoYmFyLCBvZmZz
ZXQud2lkdGgoKSkpOworICAgIH0KKworICAgIGlmIChvZmZzZXQuaGVpZ2h0KCkpIHsKKyAgICAg
ICAgaWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSBtX2RhdGEtPm1fdkJhci5nZXQoKSkKKyAg
ICAgICAgICAgIG9mZnNldC5zZXRIZWlnaHQoc2Nyb2xsU2Nyb2xsYmFyKGJhciwgb2Zmc2V0Lmhl
aWdodCgpKSk7CisgICAgfQorCisgICAgbV9kYXRhLT5tX3Nob3dTY3JvbGxiYXJTdXBwcmVzc2Vk
ID0gb2xkU3VwcHJlc3NlZDsKKyAgICBpZiAoIW1fZGF0YS0+bV9zaG93U2Nyb2xsYmFyU3VwcHJl
c3NlZCkgeworICAgICAgICBJbnRTaXplIGRlbHRhU2Nyb2xsID0gbV9kYXRhLT5tX3Njcm9sbE9m
ZnNldCAtIG9sZE9mZnNldDsKKyAgICAgICAgaWYgKGRlbHRhU2Nyb2xsLndpZHRoKCkgfHwgZGVs
dGFTY3JvbGwuaGVpZ2h0KCkpIHsKKyAgICAgICAgICAgIG1fZGF0YS0+c2Nyb2xsQmFja2luZ1N0
b3JlKGRlbHRhU2Nyb2xsKTsKKyAgICAgICAgICAgIC8vc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4o
dGhpcyktPmZyYW1lKCktPnNlbmRTY3JvbGxFdmVudCgpOworICAgICAgICAgICAgY29uc3QgRnJh
bWVWaWV3KiBmcmFtZVZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsK
KyAgICAgICAgICAgIGlmIChGcmFtZSogZnJhbWUgPSBmcmFtZVZpZXctPmZyYW1lKCkpIHsKKyAg
ICAgICAgICAgICAgICBpZiAoZnJhbWUtPnNob3VsZEJsaW5rQ2FyZXQoKSkKKyAgICAgICAgICAg
ICAgICAgICAgaG9zdFdpbmRvdygpLT5jYXJldFJlY3RDaGFuZ2VkKCk7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAoc2hvd1Njcm9sbGJhcnMpCisgICAgICAgICAgICAgICAgbV9kYXRh
LT5zaG93U2Nyb2xsYmFycyhkZWx0YVNjcm9sbC53aWR0aCgpICE9IDAsIGRlbHRhU2Nyb2xsLmhl
aWdodCgpICE9IDAsIHNob3dTY3JvbGxiYXJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlm
IChwYXJlbnQoKSkgeworICAgICAgICBpZiAob2Zmc2V0LndpZHRoKCkgfHwgb2Zmc2V0LmhlaWdo
dCgpKQorICAgICAgICAgICAgcGFyZW50KCktPnNjcm9sbFJlY3Vyc2l2ZWx5KG9mZnNldCwgc2hv
d1Njcm9sbGJhcnMpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghbV9kYXRhLT5tX3ZCYXIp
CisgICAgICAgICAgICBvZmZzZXQuc2V0SGVpZ2h0KDApOworICAgICAgICBpZiAoIW1fZGF0YS0+
bV9oQmFyKQorICAgICAgICAgICAgb2Zmc2V0LnNldFdpZHRoKDApOworICAgIH0KK30KKwordm9p
ZCBTY3JvbGxWaWV3OjpzY3JvbGxSZWN1cnNpdmVseShTY3JvbGxEaXJlY3Rpb24gZGlyZWN0aW9u
LCBTY3JvbGxHcmFudWxhcml0eSBncmFudWxhcml0eSwgaW50IHJlcGVhdENvdW50KQoreworICAg
IGJvb2wgdmVydGljYWwgPSBkaXJlY3Rpb24gPT0gU2Nyb2xsVXAgfHwgZGlyZWN0aW9uID09IFNj
cm9sbERvd247CisgICAgaWYgKFBsYXRmb3JtU2Nyb2xsYmFyKiBiYXIgPSB2ZXJ0aWNhbCA/IG1f
ZGF0YS0+bV92QmFyLmdldCgpIDogbV9kYXRhLT5tX2hCYXIuZ2V0KCkpIHsKKyAgICAgICAgaW50
IG9mZnNldCA9IGRpcmVjdGlvbiA9PSBTY3JvbGxVcCB8fCBkaXJlY3Rpb24gPT0gU2Nyb2xsTGVm
dCA/IC0xIDogMTsKKyAgICAgICAgb2Zmc2V0ICo9IGdyYW51bGFyaXR5ID09IFNjcm9sbEJ5TGlu
ZSA/IGNTY3JvbGxiYXJQaXhlbHNQZXJMaW5lU3RlcAorICAgICAgICAgICAgOiBncmFudWxhcml0
eSA9PSBTY3JvbGxCeVBhZ2UgPyAodmVydGljYWwgPyBoZWlnaHQoKSA6IHdpZHRoKCkpIC0gY0Ft
b3VudFRvS2VlcFdoZW5QYWdpbmcKKyAgICAgICAgICAgIDogZ3JhbnVsYXJpdHkgPT0gU2Nyb2xs
QnlEb2N1bWVudCA/IHZlcnRpY2FsID8gY29udGVudHNIZWlnaHQoKSA6IGNvbnRlbnRzV2lkdGgo
KQorICAgICAgICAgICAgOiAxOworICAgICAgICBvZmZzZXQgKj0gcmVwZWF0Q291bnQ7CisgICAg
ICAgIHNjcm9sbFJlY3Vyc2l2ZWx5KHZlcnRpY2FsLCBvZmZzZXQpOworICAgIH0gZWxzZSBpZiAo
cGFyZW50KCkpCisgICAgICAgIHBhcmVudCgpLT5zY3JvbGxSZWN1cnNpdmVseShkaXJlY3Rpb24s
IGdyYW51bGFyaXR5LCByZXBlYXRDb3VudCk7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2Nyb2xs
V2luZG93T2Zmc2V0KFNJWkUmIGRlbHRhLCBib29sIHNob3dTY3JvbGxiYXJzKQoreworICAgIElu
dFNpemUgb2Zmc2V0ID0gSW50U2l6ZShkZWx0YSkgLyBzY2FsZSgpOworICAgIHNjcm9sbFJlY3Vy
c2l2ZWx5KG9mZnNldCwgc2hvd1Njcm9sbGJhcnMpOworICAgIGRlbHRhID0gb2Zmc2V0ICogc2Nh
bGUoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRBbGxvd3NTY3JvbGxpbmcoYm9vbCBmbGFn
KQoreworICAgIGlmIChtX2FsbG93c0NoYW5naW5nU2Nyb2xsYmFyTW9kZSkKKyAgICAgICAgbV9k
YXRhLT5zZXRBbGxvd3NTY3JvbGxpbmcoZmxhZyk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6YWxs
b3dzU2Nyb2xsaW5nKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9kYXRhLT5hbGxvd3NTY3JvbGxp
bmcoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpwYWludFNjcm9sbGJhcnMoSERDIGhkYywgTFBS
RUNUIGRpcnR5UmVjdFdpbikKK3sKKyAgICBJbnRSZWN0IGRpcnR5UmVjdCgqZGlydHlSZWN0V2lu
KTsKKyAgICBJbnRSZWN0IG15V2luZG93UmVjdChtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeSk7
CisgICAgZGlydHlSZWN0LmludGVyc2VjdChteVdpbmRvd1JlY3QpOworCisgICAgaWYgKCFtX2Rh
dGEtPm1fc2Nyb2xsYmFyc1N1cHByZXNzZWQgJiYgbV9kYXRhLT5tX3Njcm9sbGJhcnNWaXNpYmxl
ICYmIChtX2RhdGEtPmNhblNob3dWU2Nyb2xsYmFyKCkgfHwgbV9kYXRhLT5jYW5TaG93SFNjcm9s
bGJhcigpKSkgeworICAgICAgICBHcmFwaGljc0NvbnRleHQgbXlDb250ZXh0KGhkYyk7CisgICAg
ICAgIG15Q29udGV4dC5zYXZlKCk7CisgICAgICAgIG15Q29udGV4dC5jbGlwKGRpcnR5UmVjdCk7
CisgICAgICAgIG15Q29udGV4dC50cmFuc2xhdGUobV9kYXRhLT5tX3BoeXNpY2FsR2VvbWV0cnku
eCgpLCBtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRyeS55KCkpOworICAgICAgICBteUNvbnRleHQu
c2NhbGUoRmxvYXRTaXplKHNjYWxlKCksIHNjYWxlKCkpKTsKKworICAgICAgICBUcmFuc2Zvcm1h
dGlvbk1hdHJpeCBhZmZpbmVUcmFucyA9IG15Q29udGV4dC5hZmZpbmVUcmFuc2Zvcm0oKS5pbnZl
cnNlKCk7CisgICAgICAgIEludFJlY3Qgc2Nyb2xsVmlld0RpcnR5UmVjdCA9IGVuY2xvc2luZ0lu
dFJlY3QoYWZmaW5lVHJhbnMubWFwUmVjdChGbG9hdFJlY3QoZGlydHlSZWN0KSkpOworICAgICAg
ICBpZiAoIXNjcm9sbFZpZXdEaXJ0eVJlY3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBEV09S
RCBjb2xvcldpbiA9IEdldFN5c0NvbG9yKENPTE9SX1NDUk9MTEJBUik7CisgICAgICAgICAgICBD
b2xvciBjb3JuZXJDb2xvcihHZXRSVmFsdWUoY29sb3JXaW4pLCBHZXRHVmFsdWUoY29sb3JXaW4p
LCBHZXRCVmFsdWUoY29sb3JXaW4pKTsKKworICAgICAgICAgICAgaWYgKG1fZGF0YS0+Y2FuU2hv
d0hTY3JvbGxiYXIoKSkgeworICAgICAgICAgICAgICAgIG1fZGF0YS0+bV9oQmFyLT5wYWludCgm
bXlDb250ZXh0LCBzY3JvbGxWaWV3RGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAgIGludCBo
QmFyQm90dG9tID0gbV9kYXRhLT5tX3BoeXNpY2FsR2VvbWV0cnkueSgpICsgc3RhYmxlUm91bmQo
KG1fZGF0YS0+bV9oQmFyLT55KCkgKyBtX2RhdGEtPm1faEJhci0+aGVpZ2h0KCkpICogc2NhbGUo
KSk7CisgICAgICAgICAgICAgICAgaWYgKGhCYXJCb3R0b20gPCBteVdpbmRvd1JlY3QuYm90dG9t
KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50UmVjdCBibGFua0FyZWEobXlXaW5kb3dSZWN0
LngoKQorICAgICAgICAgICAgICAgICAgICAgICAgLCBoQmFyQm90dG9tCisgICAgICAgICAgICAg
ICAgICAgICAgICAsIG15V2luZG93UmVjdC53aWR0aCgpCisgICAgICAgICAgICAgICAgICAgICAg
ICAsIG15V2luZG93UmVjdC5ib3R0b20oKSAtIGhCYXJCb3R0b20pOworCisgICAgICAgICAgICAg
ICAgICAgIGJsYW5rQXJlYS5pbnRlcnNlY3QoZGlydHlSZWN0KTsKKworICAgICAgICAgICAgICAg
ICAgICBpZiAoIWJsYW5rQXJlYS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IG15Q29udGV4dC5zYXZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljc0NvbnRl
eHQgb3JpZ0NvbnRleHQoaGRjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdDb250ZXh0
LmZpbGxSZWN0KGJsYW5rQXJlYSwgY29ybmVyQ29sb3IpOworICAgICAgICAgICAgICAgICAgICAg
ICAgbXlDb250ZXh0LnJlc3RvcmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgICAgIH0KKworICAgICAgICAgICAgICAgIG15V2luZG93UmVjdC5zZXRIZWlnaHQoc3RhYmxl
Um91bmQobV9kYXRhLT5tX2hCYXItPnkoKSAqIHNjYWxlKCkpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmIChtX2RhdGEtPmNhblNob3dWU2Nyb2xsYmFyKCkpIHsKKyAgICAgICAgICAg
ICAgICBtX2RhdGEtPm1fdkJhci0+cGFpbnQoJm15Q29udGV4dCwgc2Nyb2xsVmlld0RpcnR5UmVj
dCk7CisKKyAgICAgICAgICAgICAgICBpbnQgdkJhclJpZ2h0ID0gbV9kYXRhLT5tX3BoeXNpY2Fs
R2VvbWV0cnkueCgpICsgc3RhYmxlUm91bmQoKG1fZGF0YS0+bV92QmFyLT54KCkgKyBtX2RhdGEt
Pm1fdkJhci0+d2lkdGgoKSkgKiBzY2FsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodkJhclJp
Z2h0IDwgbXlXaW5kb3dSZWN0LnJpZ2h0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSW50UmVj
dCBibGFua0FyZWEodkJhclJpZ2h0CisgICAgICAgICAgICAgICAgICAgICAgICAsIG15V2luZG93
UmVjdC55KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICwgbXlXaW5kb3dSZWN0LnJpZ2h0KCkg
LSB2QmFyUmlnaHQKKyAgICAgICAgICAgICAgICAgICAgICAgICwgbXlXaW5kb3dSZWN0LmhlaWdo
dCgpKTsKKworICAgICAgICAgICAgICAgICAgICBibGFua0FyZWEuaW50ZXJzZWN0KGRpcnR5UmVj
dCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFibGFua0FyZWEuaXNFbXB0eSgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBteUNvbnRleHQuc2F2ZSgpOworICAgICAgICAgICAgICAg
ICAgICAgICAgR3JhcGhpY3NDb250ZXh0IG9yaWdDb250ZXh0KGhkYyk7CisgICAgICAgICAgICAg
ICAgICAgICAgICBvcmlnQ29udGV4dC5maWxsUmVjdChibGFua0FyZWEsIGNvcm5lckNvbG9yKTsK
KyAgICAgICAgICAgICAgICAgICAgICAgIG15Q29udGV4dC5yZXN0b3JlKCk7CisgICAgICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBteVdpbmRv
d1JlY3Quc2V0V2lkdGgoc3RhYmxlUm91bmQobV9kYXRhLT5tX3ZCYXItPngoKSAqIHNjYWxlKCkp
KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmlsbCB0aGUgc2Nyb2xsIGNvcm5l
ciB3aXRoIHdoaXRlLgorICAgICAgICAgICAgSW50U2l6ZSBpbm5lclNpemUobV9kYXRhLT5tX3Zp
c2libGVDb250ZW50c1dpZHRoLCBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0KTsKKyAg
ICAgICAgICAgIEludFJlY3QgaENvcm5lciA9IG1fZGF0YS0+Z2V0SENvcm5lcihpbm5lclNpemUp
OworICAgICAgICAgICAgaWYgKGhDb3JuZXIuaW50ZXJzZWN0cyhzY3JvbGxWaWV3RGlydHlSZWN0
KSkKKyAgICAgICAgICAgICAgICBteUNvbnRleHQuZmlsbFJlY3QoaENvcm5lciwgY29ybmVyQ29s
b3IpOworCisgICAgICAgICAgICBJbnRSZWN0IHZDb3JuZXIgPSBtX2RhdGEtPmdldFZDb3JuZXIo
aW5uZXJTaXplKTsKKyAgICAgICAgICAgIGlmICh2Q29ybmVyICE9IGhDb3JuZXIgJiYgdkNvcm5l
ci5pbnRlcnNlY3RzKHNjcm9sbFZpZXdEaXJ0eVJlY3QpKQorICAgICAgICAgICAgICAgIG15Q29u
dGV4dC5maWxsUmVjdCh2Q29ybmVyLCBjb3JuZXJDb2xvcik7CisKKyAgICAgICAgICAgIGRpcnR5
UmVjdC5pbnRlcnNlY3QobXlXaW5kb3dSZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIG15Q29u
dGV4dC5yZXN0b3JlKCk7CisgICAgfQorCisgICAgKmRpcnR5UmVjdFdpbiA9IGRpcnR5UmVjdDsK
K30KKwordm9pZCBTY3JvbGxWaWV3OjpoaWRlQ2hpbGRTY3JvbGxiYXJzUmVjdXJzaXZlbHkoKQor
eworICAgIGNvbnN0IEZyYW1lVmlldyogZnJhbWVWaWV3ID0gc3RhdGljX2Nhc3Q8Y29uc3QgRnJh
bWVWaWV3Kj4odGhpcyk7CisgICAgRnJhbWUqIGZyYW1lID0gZnJhbWVWaWV3LT5mcmFtZSgpOwor
CisgICAgaWYgKGZyYW1lKSB7CisgICAgICAgIGZvciAoRnJhbWUqIGNoaWxkID0gZnJhbWUtPnRy
ZWUoKS0+Zmlyc3RDaGlsZCgpOyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+dHJlZSgpLT5uZXh0U2li
bGluZygpKSB7CisgICAgICAgICAgICBpZiAoRnJhbWVWaWV3KiB2aWV3ID0gY2hpbGQtPnZpZXco
KSkKKyAgICAgICAgICAgICAgICB2aWV3LT5oaWRlQ2hpbGRTY3JvbGxiYXJzUmVjdXJzaXZlbHko
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1fZGF0YS0+aGlkZVNjcm9sbGJhcnMoKTsKK30K
Kwordm9pZCBTY3JvbGxWaWV3OjpzZXRTY3JvbGxiYXJzVmlzaWJsZShib29sIHYpCit7CisgICAg
aWYgKHYpCisgICAgICAgIG1fZGF0YS0+c2hvd1Njcm9sbGJhcnModHJ1ZSwgdHJ1ZSwgdHJ1ZSk7
CisgICAgZWxzZQorICAgICAgICBtX2RhdGEtPmhpZGVTY3JvbGxiYXJzKCk7Cit9CisKK2Jvb2wg
U2Nyb2xsVmlldzo6c2hvd3NTY3JvbGxiYXJzQXV0b21hdGljYWxseSgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fZGF0YS0+bV9hdXRvU2hvd0hpZGVTY3JvbGxiYXJzOworfQorCit2b2lkIFNjcm9s
bFZpZXc6OnNob3dTY3JvbGxiYXJzQXV0b21hdGljYWxseSgpCit7CisgICAgbV9kYXRhLT5zZXRB
dXRvU2Nyb2xsYmFycyh0cnVlKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzaG93U2Nyb2xsYmFy
c01hbnVhbGx5KCkKK3sKKyAgICBtX2RhdGEtPnNldEF1dG9TY3JvbGxiYXJzKGZhbHNlKTsKK30K
Kwordm9pZCBTY3JvbGxWaWV3OjpzaG93KCkKK3sKKyAgICBpZiAoIWlzU2VsZlZpc2libGUoKSkg
eworICAgICAgICBzZXRTZWxmVmlzaWJsZSh0cnVlKTsKKyAgICAgICAgaWYgKGlzUGFyZW50Vmlz
aWJsZSgpKSB7CisgICAgICAgICAgICBIYXNoU2V0PFJlZlB0cjxXaWRnZXQ+ID46Oml0ZXJhdG9y
IGVuZCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5lbmQoKTsKKyAgICAgICAgICAgIGZvciAoSGFzaFNl
dDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRvciBpdCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5iZWdp
bigpOyBpdCAhPSBlbmQ7ICsraXQpCisgICAgICAgICAgICAgICAgKCppdCktPnNldFBhcmVudFZp
c2libGUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBXaWRnZXQ6OnNob3coKTsKK30K
Kwordm9pZCBTY3JvbGxWaWV3OjpoaWRlKCkKK3sKKyAgICBpZiAoaXNTZWxmVmlzaWJsZSgpKSB7
CisgICAgICAgIGlmIChpc1BhcmVudFZpc2libGUoKSkgeworICAgICAgICAgICAgSGFzaFNldDxS
ZWZQdHI8V2lkZ2V0PiA+OjppdGVyYXRvciBlbmQgPSBtX2RhdGEtPm1fY2hpbGRyZW4uZW5kKCk7
CisgICAgICAgICAgICBmb3IgKEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6aXRlcmF0b3IgaXQg
PSBtX2RhdGEtPm1fY2hpbGRyZW4uYmVnaW4oKTsgaXQgIT0gZW5kOyArK2l0KQorICAgICAgICAg
ICAgICAgICgqaXQpLT5zZXRQYXJlbnRWaXNpYmxlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAg
ICBzZXRTZWxmVmlzaWJsZShmYWxzZSk7CisgICAgfQorCisgICAgaGlkZUN1cnJlbnRQb3B1cE1l
bnUoKTsKKyAgICBXaWRnZXQ6OmhpZGUoKTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRQYXJl
bnRWaXNpYmxlKGJvb2wgdmlzaWJsZSkKK3sKKyAgICBpZiAoaXNQYXJlbnRWaXNpYmxlKCkgPT0g
dmlzaWJsZSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2lkZ2V0OjpzZXRQYXJlbnRWaXNpYmxl
KHZpc2libGUpOworCisgICAgaWYgKCFpc1NlbGZWaXNpYmxlKCkpCisgICAgICAgIHJldHVybjsK
KworICAgIEhhc2hTZXQ8UmVmUHRyPFdpZGdldD4gPjo6aXRlcmF0b3IgZW5kID0gbV9kYXRhLT5t
X2NoaWxkcmVuLmVuZCgpOworICAgIGZvciAoSGFzaFNldDxSZWZQdHI8V2lkZ2V0PiA+OjppdGVy
YXRvciBpdCA9IG1fZGF0YS0+bV9jaGlsZHJlbi5iZWdpbigpOyBpdCAhPSBlbmQ7ICsraXQpCisg
ICAgICAgICgqaXQpLT5zZXRQYXJlbnRWaXNpYmxlKHZpc2libGUpOworfQorCit2b2lkIFNjcm9s
bFZpZXc6OmhpZGVDdXJyZW50UG9wdXBNZW51KCkgY29uc3QKK3sKKyAgICBpZiAobV9jdXJyZW50
UG9wdXBNZW51KQorICAgICAgICBtX2N1cnJlbnRQb3B1cE1lbnUtPmhpZGUoKTsKK30KKworSW50
UmVjdCBTY3JvbGxWaWV3Ojp2aXNpYmxlV2luZG93UmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKHBh
cmVudCgpKSB7CisgICAgICAgIEludFJlY3QgdmlzaWJsZVdpbmRvd1JlY3QocGFyZW50KCktPmNv
bnRlbnRzVG9XaW5kb3cobV9kYXRhLT5nZXRWaXNpYmxlQ29udGVudFJlY3QoKSkpOworICAgICAg
ICB2aXNpYmxlV2luZG93UmVjdC5pbnRlcnNlY3QocGFyZW50KCktPnZpc2libGVXaW5kb3dSZWN0
KCkpOworICAgICAgICByZXR1cm4gdmlzaWJsZVdpbmRvd1JlY3Q7CisgICAgfSBlbHNlIHsKKyAg
ICAgICAgSW50UmVjdCB2aXNpYmxlV2luZG93UmVjdChtX2RhdGEtPm1fcGh5c2ljYWxHZW9tZXRy
eSk7CisgICAgICAgIGlmIChtX2RhdGEtPm1fc2Nyb2xsYmFyc1Zpc2libGUpIHsKKyAgICAgICAg
ICAgIGlmIChtX2RhdGEtPmNhblNob3dIU2Nyb2xsYmFyKCkpCisgICAgICAgICAgICAgICAgdmlz
aWJsZVdpbmRvd1JlY3Quc2V0SGVpZ2h0KHN0YWJsZVJvdW5kKG1fZGF0YS0+bV9oQmFyLT55KCkg
KiBzY2FsZSgpKSk7CisgICAgICAgICAgICBpZiAobV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigp
KQorICAgICAgICAgICAgICAgIHZpc2libGVXaW5kb3dSZWN0LnNldFdpZHRoKHN0YWJsZVJvdW5k
KG1fZGF0YS0+bV92QmFyLT54KCkgKiBzY2FsZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIHZpc2libGVXaW5kb3dSZWN0OworICAgIH0KK30KKworSW50U2l6ZSBTY3JvbGxWaWV3Ojpt
YXhTY3JvbGxPZmZzZXRSZWN1cnNpdmVseSgpIGNvbnN0Cit7CisgICAgSW50U2l6ZSBtYXhTY3Jv
bGxQb3NpdGlvbihtYXgoMCwgY29udGVudHNXaWR0aCgpIC0gd2lkdGgoKSksIG1heCgwLCBjb250
ZW50c0hlaWdodCgpIC0gaGVpZ2h0KCkpKTsKKyAgICBpZiAocGFyZW50KCkpCisgICAgICAgIG1h
eFNjcm9sbFBvc2l0aW9uICs9IHBhcmVudCgpLT5tYXhTY3JvbGxPZmZzZXRSZWN1cnNpdmVseSgp
OworICAgIHJldHVybiBtYXhTY3JvbGxQb3NpdGlvbjsKK30KKworSW50U2l6ZSBTY3JvbGxWaWV3
OjpjdXJyZW50U2Nyb2xsT2Zmc2V0UmVjdXJzaXZlbHkoKSBjb25zdAoreworICAgIEludFNpemUg
c2Nyb2xsT2Zmc2V0KG1fZGF0YS0+bV9zY3JvbGxPZmZzZXQpOworICAgIGlmIChwYXJlbnQoKSkK
KyAgICAgICAgc2Nyb2xsT2Zmc2V0ICs9IHBhcmVudCgpLT5jdXJyZW50U2Nyb2xsT2Zmc2V0UmVj
dXJzaXZlbHkoKTsKKyAgICByZXR1cm4gc2Nyb2xsT2Zmc2V0OworfQorCitJbnRTaXplIFNjcm9s
bFZpZXc6OndpbmRvd1Njcm9sbE9mZnNldCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+
bV9zY3JvbGxPZmZzZXQgKiBzY2FsZSgpOworfQorCitJbnRSZWN0IFNjcm9sbFZpZXc6OndpbmRv
d0NvbnRlbnRzUmVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnRlbnRzVG9XaW5kb3coSW50
UmVjdChJbnRQb2ludCgwLCAwKSwgbV9kYXRhLT5tX2NvbnRlbnRzU2l6ZSkpOworfQorCisvLyBT
Y3JvbGxiYXJDbGllbnQKK3ZvaWQgU2Nyb2xsVmlldzo6dmFsdWVDaGFuZ2VkKFNjcm9sbGJhciog
c2Nyb2xsYmFyKQoreworICAgIG1fZGF0YS0+dmFsdWVDaGFuZ2VkKHNjcm9sbGJhcik7Cit9CisK
K2Jvb2wgU2Nyb2xsVmlldzo6c2Nyb2xsYmFyQ29ybmVyUHJlc2VudCgpIGNvbnN0Cit7CisgICAg
cmV0dXJuIG1fZGF0YS0+bV9oQmFyICYmIG1fZGF0YS0+bV92QmFyOworfQorCisvLyBOZXcKK3Zv
aWQgU2Nyb2xsVmlldzo6c2V0SGFzSG9yaXpvbnRhbFNjcm9sbGJhcihib29sIGhhcykKK3sKKyAg
ICBtX2RhdGEtPnNldEhhc0hvcml6b250YWxTY3JvbGxiYXIoaGFzKTsKK30KKwordm9pZCBTY3Jv
bGxWaWV3OjpzZXRIYXNWZXJ0aWNhbFNjcm9sbGJhcihib29sIGhhcykKK3sKKyAgICBtX2RhdGEt
PnNldEhhc1ZlcnRpY2FsU2Nyb2xsYmFyKGhhcyk7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6c2Ny
b2xsYmFyc1N1cHByZXNzZWQoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1fc2Nyb2xs
YmFyc1N1cHByZXNzZWQ7Cit9CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0Q2FuQmxpdE9uU2Nyb2xs
KGJvb2wpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KK2Jvb2wgU2Nyb2xsVmlldzo6Y2Fu
QmxpdE9uU2Nyb2xsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2Ny
b2xsVmlldzo6c2V0Q2FuSGF2ZVNjcm9sbGJhcnMoYm9vbCBjYW5TY3JvbGwpCit7CisgICAgU2Ny
b2xsYmFyTW9kZSBuZXdIb3Jpem9udGFsTW9kZTsKKyAgICBTY3JvbGxiYXJNb2RlIG5ld1ZlcnRp
Y2FsTW9kZTsKKworICAgIHNjcm9sbGJhck1vZGVzKG5ld0hvcml6b250YWxNb2RlLCBuZXdWZXJ0
aWNhbE1vZGUpOworCisgICAgaWYgKGNhblNjcm9sbCAmJiBuZXdWZXJ0aWNhbE1vZGUgPT0gU2Ny
b2xsYmFyQWx3YXlzT2ZmKQorICAgICAgICBuZXdWZXJ0aWNhbE1vZGUgPSBTY3JvbGxiYXJBdXRv
OworICAgIGVsc2UgaWYgKCFjYW5TY3JvbGwpCisgICAgICAgIG5ld1ZlcnRpY2FsTW9kZSA9IFNj
cm9sbGJhckFsd2F5c09mZjsKKworICAgIGlmIChjYW5TY3JvbGwgJiYgbmV3SG9yaXpvbnRhbE1v
ZGUgPT0gU2Nyb2xsYmFyQWx3YXlzT2ZmKQorICAgICAgICBuZXdIb3Jpem9udGFsTW9kZSA9IFNj
cm9sbGJhckF1dG87CisgICAgZWxzZSBpZiAoIWNhblNjcm9sbCkKKyAgICAgICAgbmV3SG9yaXpv
bnRhbE1vZGUgPSBTY3JvbGxiYXJBbHdheXNPZmY7CisKKyAgICBzZXRTY3JvbGxiYXJNb2Rlcyhu
ZXdIb3Jpem9udGFsTW9kZSwgbmV3VmVydGljYWxNb2RlKTsKK30KKwordm9pZCBTY3JvbGxWaWV3
OjpzY3JvbGxiYXJNb2RlcyhTY3JvbGxiYXJNb2RlJiBob3Jpem9udGFsTW9kZSwgU2Nyb2xsYmFy
TW9kZSYgdmVydGljYWxNb2RlKSBjb25zdAoreworICAgIGhvcml6b250YWxNb2RlID0gaG9yaXpv
bnRhbFNjcm9sbGJhck1vZGUoKTsKKyAgICB2ZXJ0aWNhbE1vZGUgPSB2ZXJ0aWNhbFNjcm9sbGJh
ck1vZGUoKTsKK30KKworUGFzc1JlZlB0cjxTY3JvbGxiYXI+IFNjcm9sbFZpZXc6OmNyZWF0ZVNj
cm9sbGJhcihTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbikKK3sKKyAgICByZXR1cm4g
U2Nyb2xsYmFyOjpjcmVhdGVOYXRpdmVTY3JvbGxiYXIodGhpcywgb3JpZW50YXRpb24sIFJlZ3Vs
YXJTY3JvbGxiYXIpOworfQorCitpbnQgU2Nyb2xsVmlldzo6bGF5b3V0V2lkdGgoKSBjb25zdAor
eworICAgIHJldHVybiBtX2ZpeGVkTGF5b3V0U2l6ZS5pc0VtcHR5KCkgfHwgIW1fdXNlRml4ZWRM
YXlvdXQgPyB2aXNpYmxlV2lkdGgoKSA6IG1fZml4ZWRMYXlvdXRTaXplLndpZHRoKCk7Cit9CisK
K2ludCBTY3JvbGxWaWV3OjpsYXlvdXRIZWlnaHQoKSBjb25zdAoreworICAgIHJldHVybiBtX2Zp
eGVkTGF5b3V0U2l6ZS5pc0VtcHR5KCkgfHwgIW1fdXNlRml4ZWRMYXlvdXQgPyB2aXNpYmxlSGVp
Z2h0KCkgOiBtX2ZpeGVkTGF5b3V0U2l6ZS5oZWlnaHQoKTsKK30KKworSW50U2l6ZSBTY3JvbGxW
aWV3OjpmaXhlZExheW91dFNpemUoKSBjb25zdAoreworICAgIHJldHVybiBtX2ZpeGVkTGF5b3V0
U2l6ZTsKK30KKwordm9pZCBTY3JvbGxWaWV3OjpzZXRGaXhlZExheW91dFNpemUoY29uc3QgSW50
U2l6ZSYgbmV3U2l6ZSkKK3sKKyAgICBpZiAoZml4ZWRMYXlvdXRTaXplKCkgPT0gbmV3U2l6ZSkK
KyAgICAgICAgcmV0dXJuOworICAgIG1fZml4ZWRMYXlvdXRTaXplID0gbmV3U2l6ZTsKKyAgICB1
cGRhdGVTY3JvbGxiYXJzKHNjcm9sbE9mZnNldCgpKTsKK30KKworYm9vbCBTY3JvbGxWaWV3Ojp1
c2VGaXhlZExheW91dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fdXNlRml4ZWRMYXlvdXQ7Cit9
CisKK3ZvaWQgU2Nyb2xsVmlldzo6c2V0VXNlRml4ZWRMYXlvdXQoYm9vbCBlbmFibGUpCit7Cisg
ICAgaWYgKHVzZUZpeGVkTGF5b3V0KCkgPT0gZW5hYmxlKQorICAgICAgICByZXR1cm47CisgICAg
bV91c2VGaXhlZExheW91dCA9IGVuYWJsZTsKKyAgICB1cGRhdGVTY3JvbGxiYXJzKHNjcm9sbE9m
ZnNldCgpKTsKK30KKworYm9vbCBTY3JvbGxWaWV3Ojppc09mZnNjcmVlbigpIGNvbnN0Cit7Cisg
ICAgcmV0dXJuICFpc1Zpc2libGUoKSB8fCAhSXNXaW5kb3dWaXNpYmxlKHBsYXRmb3JtV2lkZ2V0
KCkpOworfQorCit2b2lkIFNjcm9sbFZpZXc6OnNldFNjcm9sbFBvc2l0aW9uKGNvbnN0IEludFBv
aW50JiBwb3MpCit7CisgICAgc2V0Q29udGVudHNQb3MocG9zLngoKSwgcG9zLnkoKSk7Cit9CisK
K2Jvb2wgU2Nyb2xsVmlldzo6Y29udGFpbnNTY3JvbGxiYXJzQXZvaWRpbmdSZXNpemVyKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU2Nyb2xsVmlldzo6Zmxvd1RleHRU
b0ZpdChjb25zdCBOb2RlKiBub2RlKSBjb25zdAoreworICAgIHJldHVybiBob3N0V2luZG93KCkm
JiBob3N0V2luZG93KCktPmZsb3dUZXh0VG9GaXQobm9kZSk7Cit9CisKK2Zsb2F0IFNjcm9sbFZp
ZXc6OmRlZmF1bHRTY2FsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGhvc3RXaW5kb3coKSA/IGhv
c3RXaW5kb3coKS0+ZGVmYXVsdFNjYWxlKCkgOiAxLjsKK30KKwordm9pZCBTY3JvbGxWaWV3Ojph
ZGp1c3RTY3JvbGxiYXJzQXZvaWRpbmdSZXNpemVyQ291bnQoaW50IG92ZXJsYXBEZWx0YSkKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCitTY3JvbGxiYXIqIFNjcm9sbFZpZXc6Omhvcml6
b250YWxTY3JvbGxiYXIoKSBjb25zdAoreworICAgIHJldHVybiBtX2RhdGEtPm1faEJhci5nZXQo
KTsKK30KKworU2Nyb2xsYmFyKiBTY3JvbGxWaWV3Ojp2ZXJ0aWNhbFNjcm9sbGJhcigpIGNvbnN0
Cit7CisgICAgcmV0dXJuIG1fZGF0YS0+bV92QmFyLmdldCgpOworfQorCitib29sIFNjcm9sbFZp
ZXc6OmlzUG9pbnRJblNjcm9sbGJhckNvcm5lcihjb25zdCBJbnRQb2ludCYgd2luZG93UG9pbnQp
Cit7CisgICAgaWYgKCFtX2RhdGEtPm1fc2Nyb2xsYmFyc1Zpc2libGUgfHwgIW1fZGF0YS0+Y2Fu
U2hvd0hTY3JvbGxiYXIoKSB8fCAhbV9kYXRhLT5jYW5TaG93VlNjcm9sbGJhcigpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisKKyAgICBJbnRQb2ludCBwb2ludCA9IHdpbmRvd1RvQ29udGVudHMo
d2luZG93UG9pbnQpOworCisgICAgSW50U2l6ZSBpbm5lclNpemUobV9kYXRhLT5tX3Zpc2libGVD
b250ZW50c1dpZHRoLCBtX2RhdGEtPm1fdmlzaWJsZUNvbnRlbnRzSGVpZ2h0KTsKKyAgICBJbnRS
ZWN0IGhDb3JuZXIgPSBtX2RhdGEtPmdldEhDb3JuZXIoaW5uZXJTaXplKTsKKworICAgIGlmICho
Q29ybmVyLmNvbnRhaW5zKHBvaW50KSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBJbnRS
ZWN0IHZDb3JuZXIgPSBtX2RhdGEtPmdldFZDb3JuZXIoaW5uZXJTaXplKTsKKyAgICBpZiAodkNv
cm5lciAhPSBoQ29ybmVyICYmIHZDb3JuZXIuY29udGFpbnMocG9pbnQpKQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34376</attachid>
            <date>2009-08-08 11:02:00 -0700</date>
            <delta_ts>2009-09-01 18:12:24 -0700</delta_ts>
            <desc>3) Scrollbar &amp; Widget</desc>
            <filename>27543_3.patch</filename>
            <type>text/plain</type>
            <size>41555</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uZGUxMGQyZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNiBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEFkZCB3aW5jZS1zcGVjaWZpYyBzY3JvbGxiYXIg
YW5kIHdpZGdldCBmaWxlcworICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1
Zy5jZ2k/aWQ9Mjc1NDMKKworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1BsYXRmb3JtU2Nyb2xs
QmFyV2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9QbGF0Zm9ybVNj
cm9sbGJhci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TY3JvbGxiYXJUaGVt
ZVdpbmNlLmNwcDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvU2Nyb2xsYmFyVGhl
bWVXaW5jZS5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9XaWRnZXRXaW5jZS5j
cHA6IEFkZGVkLgorCiAyMDA5LTA4LTA2ICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmlsZS5j
b20+CiAKICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9X
ZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1BsYXRmb3JtU2Nyb2xsQmFyV2luY2UuY3BwIGIvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9QbGF0Zm9ybVNjcm9sbEJhcldpbmNlLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRhYzUyCi0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9QbGF0Zm9ybVNjcm9sbEJhcldpbmNlLmNwcApAQCAtMCwwICsxLDU2
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVS
LCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIs
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAq
LworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TY3JvbGxCYXIuaCIK
KworI2luY2x1ZGUgIkV2ZW50SGFuZGxlci5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVk
ZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0LmgiCisjaW5jbHVkZSAi
SW50UmVjdC5oIgorI2luY2x1ZGUgIlBsYXRmb3JtTW91c2VFdmVudC5oIgorI2luY2x1ZGUgIlNj
cm9sbGJhclRoZW1lLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKy8vIHN0YWJsZVJvdW5k
IHJvdW5kcyAtMC41IHRvIDAsIHdoZXJlIGxyb3VuZCByb3VuZHMgLTAuNSB0byAtMS4KK3N0YXRp
YyBpbmxpbmUgaW50IHN0YWJsZVJvdW5kKGRvdWJsZSBkKQoreworICAgIGlmIChkID4gMCkKKyAg
ICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oZCArIDAuNSk7CisKKyAgICBpbnQgaSA9IHN0
YXRpY19jYXN0PGludD4oZCk7CisgICAgcmV0dXJuIGkgLSBkID4gMC41ID8gaSAtIDEgOiBpOwor
fQorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2VudW0g
U2Nyb2xsQmFyU3RhdGUgeworICAgIFNjcm9sbEJhckRpc2FibGVkLAorICAgIFNjcm9sbEJhckVu
YWJsZWQsCisgICAgU2Nyb2xsQmFyUHJlc3NlZCwKK307CisKK3N0YXRpYyBpbnQgY0hvcml6b250
YWxXaWR0aFtdID0geyAxNSwgMTEgfTsKK3N0YXRpYyBpbnQgY0hvcml6b250YWxIZWlnaHRbXSA9
IHsgMTUsIDExIH07CitzdGF0aWMgaW50IGNWZXJ0aWNhbFdpZHRoW10gPSB7IDE1LCAxMSB9Owor
c3RhdGljIGludCBjVmVydGljYWxIZWlnaHRbXSA9IHsgMTUsIDExIH07CisKK2NvbnN0IGRvdWJs
ZSBjSW5pdGlhbFRpbWVyRGVsYXkgPSAwLjI1OworY29uc3QgZG91YmxlIGNOb3JtYWxUaW1lckRl
bGF5ID0gMC4wNTsKKworUGxhdGZvcm1TY3JvbGxiYXI6OlBsYXRmb3JtU2Nyb2xsYmFyKFNjcm9s
bGJhckNsaWVudCogY2xpZW50LCBTY3JvbGxiYXJPcmllbnRhdGlvbiBvcmllbnRhdGlvbiwgU2Ny
b2xsYmFyQ29udHJvbFNpemUgc2l6ZSkKKyAgICA6IFNjcm9sbGJhcihjbGllbnQsIG9yaWVudGF0
aW9uLCBzaXplKQorICAgICwgbV9ob3ZlcmVkUGFydChOb1BhcnQpCisgICAgLCBtX3ByZXNzZWRQ
YXJ0KE5vUGFydCkKKyAgICAsIG1fcHJlc3NlZFBvcygwKQorICAgICwgbV9zY3JvbGxUaW1lcih0
aGlzLCAmUGxhdGZvcm1TY3JvbGxiYXI6OmF1dG9zY3JvbGxUaW1lckZpcmVkKQorICAgICwgbV9v
dmVybGFwc1Jlc2l6ZXIoZmFsc2UpCisgICAgLCBtX3Zpc2libGUodHJ1ZSkKKyAgICAsIG1faXNW
aWV3U2Nyb2xsYmFyKGZhbHNlKQoreworICAgIGlmIChvcmllbnRhdGlvbiA9PSBWZXJ0aWNhbFNj
cm9sbGJhcikKKyAgICAgICAgc2V0RnJhbWVSZWN0KEludFJlY3QoMCwgMCwgY1ZlcnRpY2FsV2lk
dGhbY29udHJvbFNpemUoKV0sIGNWZXJ0aWNhbEhlaWdodFtjb250cm9sU2l6ZSgpXSkpOworICAg
IGVsc2UKKyAgICAgICAgc2V0RnJhbWVSZWN0KEludFJlY3QoMCwgMCwgY0hvcml6b250YWxXaWR0
aFtjb250cm9sU2l6ZSgpXSwgY0hvcml6b250YWxIZWlnaHRbY29udHJvbFNpemUoKV0pKTsKK30K
KworUGxhdGZvcm1TY3JvbGxiYXI6On5QbGF0Zm9ybVNjcm9sbGJhcigpCit7CisgICAgc3RvcFRp
bWVySWZOZWVkZWQoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dXBkYXRlVGh1bWJQ
b3NpdGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRyYWNrKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1T
Y3JvbGxiYXI6OnVwZGF0ZVRodW1iUHJvcG9ydGlvbigpCit7CisgICAgaW52YWxpZGF0ZVRyYWNr
KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OmludmFsaWRhdGVUcmFjaygpCit7Cisg
ICAgaWYgKCFtX3Zpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIEludFJlY3QgcmVjdCA9
IHRyYWNrUmVjdCgpOworICAgIHJlY3QubW92ZSgteCgpLCAteSgpKTsKKyAgICBpbnZhbGlkYXRl
UmVjdChyZWN0KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6aW52YWxpZGF0ZVBhcnQo
U2Nyb2xsYmFyUGFydCBwYXJ0KQoreworICAgIGlmICghbV92aXNpYmxlKQorICAgICAgICByZXR1
cm47CisKKyAgICBpZiAocGFydCA9PSBOb1BhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIElu
dFJlY3QgcmVzdWx0OworICAgIHN3aXRjaCAocGFydCkgeworICAgIGNhc2UgQmFja0J1dHRvblN0
YXJ0UGFydDoKKyAgICAgICAgcmVzdWx0ID0gYmFja0J1dHRvblJlY3QoKTsKKyAgICAgICAgYnJl
YWs7CisgICAgY2FzZSBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0OgorICAgICAgICByZXN1bHQgPSBm
b3J3YXJkQnV0dG9uUmVjdCgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAg
ICB7CisgICAgICAgICAgICBJbnRSZWN0IGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRl
clRodW1iUmVjdDsKKyAgICAgICAgICAgIHNwbGl0VHJhY2sodHJhY2tSZWN0KCksIGJlZm9yZVRo
dW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdCk7CisgICAgICAgICAgICBpZiAocGFy
dCA9PSBCYWNrVHJhY2tQYXJ0KQorICAgICAgICAgICAgICAgIHJlc3VsdCA9IGJlZm9yZVRodW1i
UmVjdDsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBhcnQgPT0gRm9yd2FyZFRyYWNrUGFydCkKKyAg
ICAgICAgICAgICAgICByZXN1bHQgPSBhZnRlclRodW1iUmVjdDsKKyAgICAgICAgICAgIGVsc2UK
KyAgICAgICAgICAgICAgICByZXN1bHQgPSB0aHVtYlJlY3Q7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgcmVzdWx0Lm1vdmUoLXgoKSwgLXkoKSk7CisgICAgaW52YWxpZGF0ZVJlY3QocmVzdWx0KTsK
K30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjp3aWR0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJu
IFdpZGdldDo6d2lkdGgoKTsKK30KKworaW50IFBsYXRmb3JtU2Nyb2xsYmFyOjpoZWlnaHQoKSBj
b25zdAoreworICAgIHJldHVybiBXaWRnZXQ6OmhlaWdodCgpOworfQorCit2b2lkIFBsYXRmb3Jt
U2Nyb2xsYmFyOjpzZXRSZWN0KGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgc2V0RnJhbWVS
ZWN0KHJlY3QpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzZXRQYXJlbnQoU2Nyb2xs
VmlldyogcGFyZW50VmlldykKK3sKKyAgICBXaWRnZXQ6OnNldFBhcmVudChwYXJlbnRWaWV3KTsK
K30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7
CisgICAgaWYgKGVuYWJsZWQgIT0gaXNFbmFibGVkKCkpIHsKKyAgICAgICAgU2Nyb2xsYmFyOjpz
ZXRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICBpZiAobV92aXNpYmxlKQorICAgICAgICAgICAg
aW52YWxpZGF0ZSgpOworICAgIH0KK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6cGFpbnQo
R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc0NvbnRleHQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJl
Y3QpCit7CisgICAgaWYgKCFtX3Zpc2libGUpCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChn
cmFwaGljc0NvbnRleHQtPnBhaW50aW5nRGlzYWJsZWQoKSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgLy8gRG9uJ3QgcGFpbnQgYW55dGhpbmcgaWYgdGhlIHNjcm9sbGJhciBkb2Vzbid0IGludGVy
c2VjdCB0aGUgZGFtYWdlIHJlY3QuCisgICAgaWYgKCFmcmFtZVJlY3QoKS5pbnRlcnNlY3RzKGRh
bWFnZVJlY3QpKQorICAgICAgICByZXR1cm47CisKKyAgICBncmFwaGljc0NvbnRleHQtPnNhdmUo
KTsKKworICAgIGdyYXBoaWNzQ29udGV4dC0+c2V0U3Ryb2tlU3R5bGUoU29saWRTdHJva2UpOwor
ICAgIGdyYXBoaWNzQ29udGV4dC0+c2V0U3Ryb2tlQ29sb3IoQ29sb3IoMCwgMCwgMCkpOworCisg
ICAgSW50UmVjdCB0cmFjayA9IHRyYWNrUmVjdCgpOworICAgIHBhaW50VHJhY2soZ3JhcGhpY3ND
b250ZXh0LCB0cmFjaywgdHJ1ZSwgZGFtYWdlUmVjdCk7CisKKyAgICBpZiAoaXNFbmFibGVkKCkp
IHsKKyAgICAgICAgcGFpbnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0LCBiYWNrQnV0dG9uUmVjdCgp
LCB0cnVlLCBkYW1hZ2VSZWN0KTsKKyAgICAgICAgcGFpbnRCdXR0b24oZ3JhcGhpY3NDb250ZXh0
LCBmb3J3YXJkQnV0dG9uUmVjdCgpLCBmYWxzZSwgZGFtYWdlUmVjdCk7CisgICAgfQorCisgICAg
aWYgKGRhbWFnZVJlY3QuaW50ZXJzZWN0cyh0cmFjaykgJiYgaXNFbmFibGVkKCkpIHsKKyAgICAg
ICAgSW50UmVjdCBzdGFydFRyYWNrUmVjdCwgdGh1bWJSZWN0LCBlbmRUcmFja1JlY3Q7CisgICAg
ICAgIHNwbGl0VHJhY2sodHJhY2ssIHN0YXJ0VHJhY2tSZWN0LCB0aHVtYlJlY3QsIGVuZFRyYWNr
UmVjdCk7CisgICAgICAgIHBhaW50VGh1bWIoZ3JhcGhpY3NDb250ZXh0LCB0aHVtYlJlY3QsIGRh
bWFnZVJlY3QpOworICAgIH0KKworICAgIGdyYXBoaWNzQ29udGV4dC0+cmVzdG9yZSgpOworfQor
CitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpiYWNrQnV0dG9uUmVjdCgpIGNvbnN0Cit7Cisg
ICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0
dXJuIEludFJlY3QoeCgpLCB5KCksIGhlaWdodCgpLCBoZWlnaHQoKSk7CisgICAgcmV0dXJuIElu
dFJlY3QoeCgpLCB5KCksIHdpZHRoKCksIHdpZHRoKCkpOworfQorCitJbnRSZWN0IFBsYXRmb3Jt
U2Nyb2xsYmFyOjpmb3J3YXJkQnV0dG9uUmVjdCgpIGNvbnN0Cit7CisgICAgaWYgKG1fb3JpZW50
YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJlY3QoeCgp
ICsgd2lkdGgoKSAtIGhlaWdodCgpLCB5KCksIGhlaWdodCgpLCBoZWlnaHQoKSk7CisKKyAgICBy
ZXR1cm4gSW50UmVjdCh4KCksIHkoKSArIGhlaWdodCgpIC0gd2lkdGgoKSwgd2lkdGgoKSwgd2lk
dGgoKSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxiYXI6OnRyYWNrUmVjdCgpIGNvbnN0
Cit7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAg
ICAgICBpZiAod2lkdGgoKSA8IGhlaWdodCgpICsgaGVpZ2h0KCkpCisgICAgICAgICAgICByZXR1
cm4gSW50UmVjdCgpOworICAgICAgICByZXR1cm4gSW50UmVjdCh4KCkgKyBoZWlnaHQoKSwgeSgp
LCB3aWR0aCgpIC0gaGVpZ2h0KCkgLSBoZWlnaHQoKSwgaGVpZ2h0KCkpOworICAgIH0KKworICAg
IGlmIChoZWlnaHQoKSA8IHdpZHRoKCkgKyB3aWR0aCgpKQorICAgICAgICByZXR1cm4gSW50UmVj
dCgpOworICAgIHJldHVybiBJbnRSZWN0KHgoKSwgeSgpICsgd2lkdGgoKSwgd2lkdGgoKSwgaGVp
Z2h0KCkgLSB3aWR0aCgpIC0gd2lkdGgoKSk7Cit9CisKK0ludFJlY3QgUGxhdGZvcm1TY3JvbGxi
YXI6OnRodW1iUmVjdCgpIGNvbnN0Cit7CisgICAgSW50UmVjdCBiZWZvcmVUaHVtYlJlY3QsIHRo
dW1iUmVjdCwgYWZ0ZXJUaHVtYlJlY3Q7CisgICAgc3BsaXRUcmFjayh0cmFja1JlY3QoKSwgYmVm
b3JlVGh1bWJSZWN0LCB0aHVtYlJlY3QsIGFmdGVyVGh1bWJSZWN0KTsKKyAgICByZXR1cm4gdGh1
bWJSZWN0OworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzcGxpdFRyYWNrKGNvbnN0IElu
dFJlY3QmIHRyYWNrUmVjdCwgSW50UmVjdCYgYmVmb3JlVGh1bWJSZWN0LCBJbnRSZWN0JiB0aHVt
YlJlY3QsIEludFJlY3QmIGFmdGVyVGh1bWJSZWN0KSBjb25zdAoreworICAgIC8vIFRoaXMgZnVu
Y3Rpb24gd29uJ3QgZXZlbiBnZXQgY2FsbGVkIHVubGVzcyB3ZSdyZSBiaWcgZW5vdWdoIHRvIGhh
dmUgc29tZSBjb21iaW5hdGlvbiBvZiB0aGVzZSB0aHJlZSByZWN0cyB3aGVyZSBhdCBsZWFzdAor
ICAgIC8vIG9uZSBvZiB0aGVtIGlzIG5vbi1lbXB0eS4KKyAgICBpbnQgdGh1bWJQb3MgPSB0aHVt
YlBvc2l0aW9uKCk7CisgICAgaWYgKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJh
cikgeworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVjdC54KCkgKyB0aHVtYlBv
cywgdHJhY2tSZWN0LnkoKSwgdGh1bWJMZW5ndGgoKSwgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAg
ICAgICAgYmVmb3JlVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0cmFja1JlY3Qu
eSgpLCB0aHVtYlBvcywgdHJhY2tSZWN0LmhlaWdodCgpKTsKKyAgICAgICAgYWZ0ZXJUaHVtYlJl
Y3QgPSBJbnRSZWN0KHRodW1iUmVjdC54KCkgKyB0aHVtYlJlY3Qud2lkdGgoKSwgdHJhY2tSZWN0
LnkoKSwgdHJhY2tSZWN0LnJpZ2h0KCkgLSB0aHVtYlJlY3QucmlnaHQoKSwgdHJhY2tSZWN0Lmhl
aWdodCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICB0aHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNr
UmVjdC54KCksIHRyYWNrUmVjdC55KCkgKyB0aHVtYlBvcywgdHJhY2tSZWN0LndpZHRoKCksIHRo
dW1iTGVuZ3RoKCkpOworICAgICAgICBiZWZvcmVUaHVtYlJlY3QgPSBJbnRSZWN0KHRyYWNrUmVj
dC54KCksIHRyYWNrUmVjdC55KCksIHRyYWNrUmVjdC53aWR0aCgpLCB0aHVtYlBvcyk7CisgICAg
ICAgIGFmdGVyVGh1bWJSZWN0ID0gSW50UmVjdCh0cmFja1JlY3QueCgpLCB0aHVtYlJlY3QueSgp
ICsgdGh1bWJSZWN0LmhlaWdodCgpLCB0cmFja1JlY3Qud2lkdGgoKSwgdHJhY2tSZWN0LmJvdHRv
bSgpIC0gdGh1bWJSZWN0LmJvdHRvbSgpKTsKKyAgICB9Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9s
bGJhcjo6dGh1bWJQb3NpdGlvbigpIGNvbnN0Cit7CisgICAgaWYgKGlzRW5hYmxlZCgpKQorICAg
ICAgICByZXR1cm4gc3RhYmxlUm91bmQoKGZsb2F0KW1fY3VycmVudFBvcyAqICh0cmFja0xlbmd0
aCgpIC0gdGh1bWJMZW5ndGgoKSkgLyAobV90b3RhbFNpemUgLSBtX3Zpc2libGVTaXplKSk7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK2ludCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJMZW5ndGgoKSBj
b25zdAoreworICAgIGlmICghaXNFbmFibGVkKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
ZmxvYXQgcHJvcG9ydGlvbiA9IChmbG9hdCkobV92aXNpYmxlU2l6ZSkgLyBtX3RvdGFsU2l6ZTsK
KyAgICBpbnQgdHJhY2tMZW4gPSB0cmFja0xlbmd0aCgpOworICAgIGludCBsZW5ndGggPSBzdGFi
bGVSb3VuZChwcm9wb3J0aW9uICogdHJhY2tMZW4pOworICAgIGludCBtaW5MZW5ndGggPSBtX29y
aWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBoZWlnaHQoKSA6IHdpZHRoKCk7Cisg
ICAgbGVuZ3RoID0gbWF4KGxlbmd0aCwgbWluTGVuZ3RoKTsKKyAgICBpZiAobGVuZ3RoID4gdHJh
Y2tMZW4pCisgICAgICAgIGxlbmd0aCA9IDA7IC8vIE9uY2UgdGhlIHRodW1iIGlzIGJlbG93IHRo
ZSB0cmFjayBsZW5ndGgsIGl0IGp1c3QgZ29lcyBhd2F5ICh0byBtYWtlIG1vcmUgcm9vbSBmb3Ig
dGhlIHRyYWNrKS4KKyAgICByZXR1cm4gbGVuZ3RoOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxi
YXI6OnRyYWNrTGVuZ3RoKCkgY29uc3QKK3sKKyAgICByZXR1cm4gKG1fb3JpZW50YXRpb24gPT0g
SG9yaXpvbnRhbFNjcm9sbGJhcikgPyB0cmFja1JlY3QoKS53aWR0aCgpIDogdHJhY2tSZWN0KCku
aGVpZ2h0KCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50QnV0dG9uKEdyYXBo
aWNzQ29udGV4dCogY29udGV4dCwgY29uc3QgSW50UmVjdCYgcGFpbnRSZWN0LCBib29sIHN0YXJ0
LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghZGFtYWdlUmVj
dC5pbnRlcnNlY3RzKHBhaW50UmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIFVJTlQgc3Rh
dGUgPSAhaXNFbmFibGVkKCkKKyAgICAgICAgPyBERkNTX0lOQUNUSVZFCisgICAgICAgIDogbV9w
cmVzc2VkUGFydCA9PSAoc3RhcnQgPyBCYWNrQnV0dG9uU3RhcnRQYXJ0IDogRm9yd2FyZEJ1dHRv
blN0YXJ0UGFydCkKKyAgICAgICAgPyBERkNTX1BVU0hFRAorICAgICAgICA6IDA7CisKKyAgICBV
SU5UIGFycm93ID0gbV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyCisgICAgICAg
ID8gc3RhcnQgPyBERkNTX1NDUk9MTExFRlQgOiBERkNTX1NDUk9MTFJJR0hUCisgICAgICAgIDog
c3RhcnQgPyBERkNTX1NDUk9MTFVQIDogREZDU19TQ1JPTExET1dOOworCisgICAgY29udGV4dC0+
ZHJhd0ZyYW1lQ29udHJvbChwYWludFJlY3QsIERGQ19TQ1JPTEwsIGFycm93IHwgc3RhdGUpOwor
fQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpwYWludFRyYWNrKEdyYXBoaWNzQ29udGV4dCog
Y29udGV4dCwgY29uc3QgSW50UmVjdCYgcGFpbnRSZWN0LCBib29sIHN0YXJ0LCBjb25zdCBJbnRS
ZWN0JiBkYW1hZ2VSZWN0KSBjb25zdAoreworICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3Rz
KHBhaW50UmVjdCkpCisgICAgICAgIHJldHVybjsKKworICAgIERXT1JEIGNvbG9yID0gR2V0U3lz
Q29sb3IoQ09MT1JfU0NST0xMQkFSKTsKKyAgICBjb250ZXh0LT5maWxsUmVjdChwYWludFJlY3Qs
IENvbG9yKEdldFJWYWx1ZShjb2xvcikgLyAyLCBHZXRHVmFsdWUoY29sb3IpIC8gMiwgR2V0QlZh
bHVlKGNvbG9yKSAvIDIpKTsKKyAgICBjb250ZXh0LT5zdHJva2VSZWN0KHBhaW50UmVjdCwgMSk7
Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0
KiBjb250ZXh0LCBjb25zdCBJbnRSZWN0JiByZWN0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0
KSBjb25zdAoreworICAgIGlmICghZGFtYWdlUmVjdC5pbnRlcnNlY3RzKHJlY3QpKQorICAgICAg
ICByZXR1cm47CisKKyAgICBVSU5UIHN0YXRlID0gIWlzRW5hYmxlZCgpCisgICAgICAgID8gREZD
U19JTkFDVElWRQorICAgICAgICA6IG1fcHJlc3NlZFBhcnQgPT0gVGh1bWJQYXJ0CisgICAgICAg
ID8gREZDU19QVVNIRUQKKyAgICAgICAgOiAwOworCisgICAgY29udGV4dC0+ZHJhd0ZyYW1lQ29u
dHJvbChyZWN0LCBERkNfQlVUVE9OLCBERkNTX0JVVFRPTlBVU0ggfCBzdGF0ZSk7Cit9CisKK1Nj
cm9sbGJhclBhcnQgUGxhdGZvcm1TY3JvbGxiYXI6OmhpdFRlc3QoY29uc3QgUGxhdGZvcm1Nb3Vz
ZUV2ZW50JiBldnQpCit7CisgICAgU2Nyb2xsYmFyUGFydCByZXN1bHQgPSBOb1BhcnQ7CisgICAg
aWYgKCFtX3Zpc2libGUpCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgaWYgKCFpc0VuYWJs
ZWQoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgIEludFBvaW50IG1vdXNlUG9zaXRp
b24gPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKTsKKyAgICBtb3VzZVBv
c2l0aW9uLm1vdmUoeCgpLCB5KCkpOworICAgIGlmIChiYWNrQnV0dG9uUmVjdCgpLmNvbnRhaW5z
KG1vdXNlUG9zaXRpb24pKQorICAgICAgICByZXN1bHQgPSBCYWNrQnV0dG9uU3RhcnRQYXJ0Owor
ICAgIGVsc2UgaWYgKGZvcndhcmRCdXR0b25SZWN0KCkuY29udGFpbnMobW91c2VQb3NpdGlvbikp
CisgICAgICAgIHJlc3VsdCA9IEZvcndhcmRCdXR0b25TdGFydFBhcnQ7CisgICAgZWxzZSB7Cisg
ICAgICAgIEludFJlY3QgdHJhY2sgPSB0cmFja1JlY3QoKTsKKyAgICAgICAgaWYgKHRyYWNrLmNv
bnRhaW5zKG1vdXNlUG9zaXRpb24pKSB7CisgICAgICAgICAgICBJbnRSZWN0IGJlZm9yZVRodW1i
UmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdDsKKyAgICAgICAgICAgIHNwbGl0VHJhY2so
dHJhY2ssIGJlZm9yZVRodW1iUmVjdCwgdGh1bWJSZWN0LCBhZnRlclRodW1iUmVjdCk7CisgICAg
ICAgICAgICBpZiAoYmVmb3JlVGh1bWJSZWN0LmNvbnRhaW5zKG1vdXNlUG9zaXRpb24pKQorICAg
ICAgICAgICAgICAgIHJlc3VsdCA9IEJhY2tUcmFja1BhcnQ7CisgICAgICAgICAgICBlbHNlIGlm
ICh0aHVtYlJlY3QuY29udGFpbnMobW91c2VQb3NpdGlvbikpCisgICAgICAgICAgICAgICAgcmVz
dWx0ID0gVGh1bWJQYXJ0OworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJlc3Vs
dCA9IEZvcndhcmRUcmFja1BhcnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3Vs
dDsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91c2VNb3ZlRXZlbnQoY29u
c3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0g
VGh1bWJQYXJ0KSB7CisgICAgICAgIC8vIERyYWcgdGhlIHRodW1iLgorICAgICAgICBpbnQgdGh1
bWJQb3MgPSB0aHVtYlBvc2l0aW9uKCk7CisgICAgICAgIGludCB0aHVtYkxlbiA9IHRodW1iTGVu
Z3RoKCk7CisgICAgICAgIGludCB0cmFja0xlbiA9IHRyYWNrTGVuZ3RoKCk7CisgICAgICAgIGlu
dCBtYXhQb3MgPSB0cmFja0xlbiAtIHRodW1iTGVuOworICAgICAgICBpbnQgZGVsdGEgPSAwOwor
ICAgICAgICBpZiAobV9vcmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKQorICAgICAg
ICAgICAgZGVsdGEgPSBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBvcygpKS54KCkg
LSBtX3ByZXNzZWRQb3M7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGRlbHRhID0gY29udmVy
dEZyb21Db250YWluaW5nV2luZG93KGV2dC5wb3MoKSkueSgpIC0gbV9wcmVzc2VkUG9zOworCisg
ICAgICAgIGlmIChkZWx0YSA+IDApCisgICAgICAgICAgICAvLyBUaGUgbW91c2UgbW92ZWQgZG93
bi9yaWdodC4KKyAgICAgICAgICAgIGRlbHRhID0gbWluKG1heFBvcyAtIHRodW1iUG9zLCBkZWx0
YSk7CisgICAgICAgIGVsc2UgaWYgKGRlbHRhIDwgMCkKKyAgICAgICAgICAgIC8vIFRoZSBtb3Vz
ZSBtb3ZlZCB1cC9sZWZ0LgorICAgICAgICAgICAgZGVsdGEgPSBtYXgoLXRodW1iUG9zLCBkZWx0
YSk7CisKKyAgICAgICAgaWYgKGRlbHRhKSB7CisgICAgICAgICAgICBzZXRWYWx1ZShzdGFibGVS
b3VuZCgoZmxvYXQpKHRodW1iUG9zICsgZGVsdGEpICogKG1fdG90YWxTaXplIC0gbV92aXNpYmxl
U2l6ZSkgLyAodHJhY2tMZW4gLSB0aHVtYkxlbikpKTsKKyAgICAgICAgICAgIG1fcHJlc3NlZFBv
cyArPSB0aHVtYlBvc2l0aW9uKCkgLSB0aHVtYlBvczsKKyAgICAgICAgfQorCisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydCkKKyAg
ICAgICAgbV9wcmVzc2VkUG9zID0gKG1fb3JpZW50YXRpb24gPT0gSG9yaXpvbnRhbFNjcm9sbGJh
ciA/IGNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLngoKSA6IGNvbnZlcnRG
cm9tQ29udGFpbmluZ1dpbmRvdyhldnQucG9zKCkpLnkoKSk7CisKKyAgICBTY3JvbGxiYXJQYXJ0
IHBhcnQgPSBoaXRUZXN0KGV2dCk7CisgICAgaWYgKHBhcnQgIT0gbV9ob3ZlcmVkUGFydCkgewor
ICAgICAgICBpZiAobV9wcmVzc2VkUGFydCAhPSBOb1BhcnQpIHsKKyAgICAgICAgICAgIGlmIChw
YXJ0ID09IG1fcHJlc3NlZFBhcnQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbW91c2UgaXMg
bW92aW5nIGJhY2sgb3ZlciB0aGUgcHJlc3NlZCBwYXJ0LiAgV2UKKyAgICAgICAgICAgICAgICAv
LyBuZWVkIHRvIHN0YXJ0IHVwIHRoZSB0aW1lciBhY3Rpb24gYWdhaW4uCisgICAgICAgICAgICAg
ICAgc3RhcnRUaW1lcklmTmVlZGVkKGNOb3JtYWxUaW1lckRlbGF5KTsKKyAgICAgICAgICAgICAg
ICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAo
bV9ob3ZlcmVkUGFydCA9PSBtX3ByZXNzZWRQYXJ0KSB7CisgICAgICAgICAgICAgICAgLy8gVGhl
IG1vdXNlIGlzIGxlYXZpbmcgdGhlIHByZXNzZWQgcGFydC4gIEtpbGwgb3VyIHRpbWVyCisgICAg
ICAgICAgICAgICAgLy8gaWYgbmVlZGVkLgorICAgICAgICAgICAgICAgIHN0b3BUaW1lcklmTmVl
ZGVkKCk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnZhbGlkYXRlUGFy
dChwYXJ0KTsKKyAgICAgICAgICAgIGludmFsaWRhdGVQYXJ0KG1faG92ZXJlZFBhcnQpOworICAg
ICAgICB9CisgICAgICAgIG1faG92ZXJlZFBhcnQgPSBwYXJ0OworICAgIH0KKworICAgIHJldHVy
biBtX3ByZXNzZWRQYXJ0ICE9IE5vUGFydDsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6
aGFuZGxlTW91c2VPdXRFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAg
ICBpbnZhbGlkYXRlUGFydChtX2hvdmVyZWRQYXJ0KTsKKyAgICBtX2hvdmVyZWRQYXJ0ID0gTm9Q
YXJ0OworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgUGxhdGZvcm1TY3JvbGxiYXI6Omhh
bmRsZU1vdXNlUHJlc3NFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmIGV2dCkKK3sKKyAg
ICBtX3ByZXNzZWRQYXJ0ID0gaGl0VGVzdChldnQpOworICAgIG1fcHJlc3NlZFBvcyA9IChtX29y
aWVudGF0aW9uID09IEhvcml6b250YWxTY3JvbGxiYXIgPyBjb252ZXJ0RnJvbUNvbnRhaW5pbmdX
aW5kb3coZXZ0LnBvcygpKS54KCkgOiBjb252ZXJ0RnJvbUNvbnRhaW5pbmdXaW5kb3coZXZ0LnBv
cygpKS55KCkpOworICAgIGludmFsaWRhdGVQYXJ0KG1fcHJlc3NlZFBhcnQpOworICAgIGF1dG9z
Y3JvbGxQcmVzc2VkUGFydChjSW5pdGlhbFRpbWVyRGVsYXkpOworICAgIHJldHVybiBtX3ByZXNz
ZWRQYXJ0ICE9IE5vUGFydDsKK30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6aGFuZGxlTW91
c2VSZWxlYXNlRXZlbnQoY29uc3QgUGxhdGZvcm1Nb3VzZUV2ZW50JiBldnQpCit7CisgICAgaW52
YWxpZGF0ZVBhcnQobV9wcmVzc2VkUGFydCk7CisgICAgbV9wcmVzc2VkUGFydCA9IE5vUGFydDsK
KyAgICBtX3ByZXNzZWRQb3MgPSAwOworICAgIHN0b3BUaW1lcklmTmVlZGVkKCk7CisKKyAgICBp
ZiAocGFyZW50KCkgJiYgcGFyZW50KCktPmlzRnJhbWVWaWV3KCkpCisgICAgICAgIHN0YXRpY19j
YXN0PEZyYW1lVmlldyo+KHBhcmVudCgpKS0+ZnJhbWUoKS0+ZXZlbnRIYW5kbGVyKCktPnNldE1v
dXNlUHJlc3NlZChmYWxzZSk7CisKKyAgICByZXR1cm4gbV9wcmVzc2VkUGFydCAhPSBOb1BhcnQ7
Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnN0YXJ0VGltZXJJZk5lZWRlZChkb3VibGUg
ZGVsYXkpCit7CisgICAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgZm9yIHRoZSB0aHVtYi4KKyAgICBp
ZiAobV9wcmVzc2VkUGFydCA9PSBUaHVtYlBhcnQpCisgICAgICAgIHJldHVybjsKKworICAgIC8v
IEhhbmRsZSB0aGUgdHJhY2suICBXZSBoYWx0IHRyYWNrIHNjcm9sbGluZyBvbmNlIHRoZSB0aHVt
YiBpcyBsZXZlbAorICAgIC8vIHdpdGggdXMuCisgICAgaWYgKChtX3ByZXNzZWRQYXJ0ID09IEJh
Y2tUcmFja1BhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBGb3J3YXJkVHJhY2tQYXJ0KSAmJiB0aHVt
YlVuZGVyTW91c2UoKSkgeworICAgICAgICBpbnZhbGlkYXRlUGFydChtX3ByZXNzZWRQYXJ0KTsK
KyAgICAgICAgbV9ob3ZlcmVkUGFydCA9IFRodW1iUGFydDsKKyAgICAgICAgcmV0dXJuOworICAg
IH0KKworICAgIC8vIFdlIGNhbid0IHNjcm9sbCBpZiB3ZSd2ZSBoaXQgdGhlIGJlZ2lubmluZyBv
ciBlbmQuCisgICAgU2Nyb2xsRGlyZWN0aW9uIGRpciA9IHByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0
aW9uKCk7CisgICAgaWYgKGRpciA9PSBTY3JvbGxVcCB8fCBkaXIgPT0gU2Nyb2xsTGVmdCkgewor
ICAgICAgICBpZiAobV9jdXJyZW50UG9zID09IDApCisgICAgICAgICAgICByZXR1cm47CisgICAg
fSBlbHNlIHsKKyAgICAgICAgaWYgKG1fY3VycmVudFBvcyA9PSBtX3RvdGFsU2l6ZSAtIG1fdmlz
aWJsZVNpemUpCisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbV9zY3JvbGxUaW1l
ci5zdGFydE9uZVNob3QoZGVsYXkpOworfQorCit2b2lkIFBsYXRmb3JtU2Nyb2xsYmFyOjpzdG9w
VGltZXJJZk5lZWRlZCgpCit7CisgICAgaWYgKG1fc2Nyb2xsVGltZXIuaXNBY3RpdmUoKSkKKyAg
ICAgICAgbV9zY3JvbGxUaW1lci5zdG9wKCk7Cit9CisKK3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6
OmF1dG9zY3JvbGxQcmVzc2VkUGFydChkb3VibGUgZGVsYXkpCit7CisgICAgLy8gRG9uJ3QgZG8g
YW55dGhpbmcgZm9yIHRoZSB0aHVtYiBvciBpZiBub3RoaW5nIHdhcyBwcmVzc2VkLgorICAgIGlm
IChtX3ByZXNzZWRQYXJ0ID09IFRodW1iUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IE5vUGFydCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgLy8gSGFuZGxlIHRoZSB0cmFjay4KKyAgICBpZiAoKG1f
cHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRU
cmFja1BhcnQpICYmIHRodW1iVW5kZXJNb3VzZSgpKSB7CisgICAgICAgIGludmFsaWRhdGVQYXJ0
KG1fcHJlc3NlZFBhcnQpOworICAgICAgICBtX2hvdmVyZWRQYXJ0ID0gVGh1bWJQYXJ0OworICAg
ICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSGFuZGxlIHRoZSBhcnJvd3MgYW5kIHRyYWNr
LgorICAgIGlmIChzY3JvbGwocHJlc3NlZFBhcnRTY3JvbGxEaXJlY3Rpb24oKSwgcHJlc3NlZFBh
cnRTY3JvbGxHcmFudWxhcml0eSgpKSkKKyAgICAgICAgc3RhcnRUaW1lcklmTmVlZGVkKGRlbGF5
KTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6YXV0b3Njcm9sbFRpbWVyRmlyZWQoVGlt
ZXI8UGxhdGZvcm1TY3JvbGxiYXI+KikKK3sKKyAgICBhdXRvc2Nyb2xsUHJlc3NlZFBhcnQoY05v
cm1hbFRpbWVyRGVsYXkpOworfQorCitTY3JvbGxEaXJlY3Rpb24gUGxhdGZvcm1TY3JvbGxiYXI6
OnByZXNzZWRQYXJ0U2Nyb2xsRGlyZWN0aW9uKCkKK3sKKyAgICBpZiAobV9vcmllbnRhdGlvbiA9
PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSB7CisgICAgICAgIGlmIChtX3ByZXNzZWRQYXJ0ID09IEJh
Y2tCdXR0b25TdGFydFBhcnQgfHwgbV9wcmVzc2VkUGFydCA9PSBCYWNrVHJhY2tQYXJ0KQorICAg
ICAgICAgICAgcmV0dXJuIFNjcm9sbExlZnQ7CisgICAgICAgIHJldHVybiBTY3JvbGxSaWdodDsK
KyAgICB9IGVsc2UgeworICAgICAgICBpZiAobV9wcmVzc2VkUGFydCA9PSBCYWNrQnV0dG9uU3Rh
cnRQYXJ0IHx8IG1fcHJlc3NlZFBhcnQgPT0gQmFja1RyYWNrUGFydCkKKyAgICAgICAgICAgIHJl
dHVybiBTY3JvbGxVcDsKKyAgICAgICAgcmV0dXJuIFNjcm9sbERvd247CisgICAgfQorfQorCitT
Y3JvbGxHcmFudWxhcml0eSBQbGF0Zm9ybVNjcm9sbGJhcjo6cHJlc3NlZFBhcnRTY3JvbGxHcmFu
dWxhcml0eSgpCit7CisgICAgaWYgKG1fcHJlc3NlZFBhcnQgPT0gQmFja0J1dHRvblN0YXJ0UGFy
dCB8fCBtX3ByZXNzZWRQYXJ0ID09IEZvcndhcmRCdXR0b25TdGFydFBhcnQpCisgICAgICAgIHJl
dHVybiBTY3JvbGxCeUxpbmU7CisgICAgcmV0dXJuIFNjcm9sbEJ5UGFnZTsKK30KKworYm9vbCBQ
bGF0Zm9ybVNjcm9sbGJhcjo6dGh1bWJVbmRlck1vdXNlKCkKK3sKKyAgICAvLyBDb25zdHJ1Y3Qg
YSByZWN0LgorICAgIEludFJlY3QgdGh1bWIgPSB0aHVtYlJlY3QoKTsKKyAgICB0aHVtYi5tb3Zl
KC14KCksIC15KCkpOworICAgIGludCBiZWdpbiA9IChtX29yaWVudGF0aW9uID09IEhvcml6b250
YWxTY3JvbGxiYXIpID8gdGh1bWIueCgpIDogdGh1bWIueSgpOworICAgIGludCBlbmQgPSAobV9v
cmllbnRhdGlvbiA9PSBIb3Jpem9udGFsU2Nyb2xsYmFyKSA/IHRodW1iLnJpZ2h0KCkgOiB0aHVt
Yi5ib3R0b20oKTsKKyAgICByZXR1cm4gKGJlZ2luIDw9IG1fcHJlc3NlZFBvcyAmJiBtX3ByZXNz
ZWRQb3MgPCBlbmQpOworfQorCitpbnQgUGxhdGZvcm1TY3JvbGxiYXI6Omhvcml6b250YWxTY3Jv
bGxiYXJIZWlnaHQoU2Nyb2xsYmFyQ29udHJvbFNpemUgY29udHJvbFNpemUpCit7CisgICAgcmV0
dXJuIGNIb3Jpem9udGFsSGVpZ2h0W2NvbnRyb2xTaXplXTsKK30KKworaW50IFBsYXRmb3JtU2Ny
b2xsYmFyOjp2ZXJ0aWNhbFNjcm9sbGJhcldpZHRoKFNjcm9sbGJhckNvbnRyb2xTaXplIGNvbnRy
b2xTaXplKQoreworICAgIHJldHVybiBjVmVydGljYWxXaWR0aFtjb250cm9sU2l6ZV07Cit9CisK
K3ZvaWQgUGxhdGZvcm1TY3JvbGxiYXI6OnBhaW50R3JpcHBlcihIREMgaGRjLCBjb25zdCBJbnRS
ZWN0JiByZWN0KSBjb25zdAoreworfQorCitJbnRSZWN0IFBsYXRmb3JtU2Nyb2xsYmFyOjpncmlw
cGVyUmVjdChjb25zdCBJbnRSZWN0JiB0aHVtYlJlY3QpIGNvbnN0Cit7CisgICAgcmV0dXJuIElu
dFJlY3QoKTsKK30KKwordm9pZCBQbGF0Zm9ybVNjcm9sbGJhcjo6dGhlbWVDaGFuZ2VkKCkKK3sK
K30KKworYm9vbCBQbGF0Zm9ybVNjcm9sbGJhcjo6c2hvdWxkVXBkYXRlQmFja2luZ1N0b3JlKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gcGFyZW50KCkgJiYgKHBhcmVudCgpLT5wYXJlbnQoKSB8fCAh
aXNWaWV3U2Nyb2xsYmFyKCkpOworfQorCitQYXNzUmVmUHRyPFNjcm9sbGJhcj4gU2Nyb2xsYmFy
OjpjcmVhdGVOYXRpdmVTY3JvbGxiYXIoU2Nyb2xsYmFyQ2xpZW50KiBjbGllbnQsIFNjcm9sbGJh
ck9yaWVudGF0aW9uIG9yaWVudGF0aW9uLCBTY3JvbGxiYXJDb250cm9sU2l6ZSBzaXplKQorewor
ICAgIHJldHVybiBhZG9wdFJlZihuZXcgUGxhdGZvcm1TY3JvbGxiYXIoY2xpZW50LCBvcmllbnRh
dGlvbiwgc2l6ZSkpOworfQorCit9CisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvUGxhdGZvcm1TY3JvbGxiYXIuaCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGxhdGZvcm1T
Y3JvbGxiYXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDhhNjJmCi0t
LSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9QbGF0Zm9ybVNjcm9sbGJh
ci5oCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAy
MDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDggVG9jaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmbmRlZiBQbGF0Zm9ybVNjcm9s
bGJhcl9oCisjZGVmaW5lIFBsYXRmb3JtU2Nyb2xsYmFyX2gKKworI2luY2x1ZGUgIlNjcm9sbEJh
ci5oIgorI2luY2x1ZGUgIlRpbWVyLmgiCisjaW5jbHVkZSAiV2lkZ2V0LmgiCisKK3R5cGVkZWYg
c3RydWN0IEhEQ19fKiBIREM7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIFBs
YXRmb3JtU2Nyb2xsYmFyIDogcHVibGljIFNjcm9sbGJhciB7CisgICAgcHVibGljOgorICAgICAg
ICBQbGF0Zm9ybVNjcm9sbGJhcihTY3JvbGxiYXJDbGllbnQqLCBTY3JvbGxiYXJPcmllbnRhdGlv
biwgU2Nyb2xsYmFyQ29udHJvbFNpemUpOworCisgICAgICAgIHZpcnR1YWwgflBsYXRmb3JtU2Ny
b2xsYmFyKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzV2lkZ2V0KCkgY29uc3QgeyByZXR1
cm4gdHJ1ZTsgfQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRQYXJlbnQoU2Nyb2xsVmlldyop
OworCisgICAgICAgIHZpcnR1YWwgaW50IHdpZHRoKCkgY29uc3Q7CisgICAgICAgIHZpcnR1YWwg
aW50IGhlaWdodCgpIGNvbnN0OworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjdChjb25zdCBJ
bnRSZWN0Jik7CisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRFbmFibGVkKGJvb2wpOworICAgICAg
ICB2aXJ0dWFsIHZvaWQgcGFpbnQoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYgZGFt
YWdlUmVjdCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlTW92ZUV2ZW50KGNv
bnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworICAgICAgICB2aXJ0dWFsIGJvb2wgaGFuZGxlTW91
c2VPdXRFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAgICAgICAgdmlydHVhbCBi
b29sIGhhbmRsZU1vdXNlUHJlc3NFdmVudChjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKyAg
ICAgICAgdmlydHVhbCBib29sIGhhbmRsZU1vdXNlUmVsZWFzZUV2ZW50KGNvbnN0IFBsYXRmb3Jt
TW91c2VFdmVudCYpOworCisgICAgICAgIHN0YXRpYyB2b2lkIHRoZW1lQ2hhbmdlZCgpOworICAg
ICAgICBzdGF0aWMgaW50IGhvcml6b250YWxTY3JvbGxiYXJIZWlnaHQoU2Nyb2xsYmFyQ29udHJv
bFNpemUgc2l6ZSA9IFJlZ3VsYXJTY3JvbGxiYXIpOworICAgICAgICBzdGF0aWMgaW50IHZlcnRp
Y2FsU2Nyb2xsYmFyV2lkdGgoU2Nyb2xsYmFyQ29udHJvbFNpemUgc2l6ZSA9IFJlZ3VsYXJTY3Jv
bGxiYXIpOworCisgICAgICAgIHZvaWQgYXV0b3Njcm9sbFRpbWVyRmlyZWQoVGltZXI8UGxhdGZv
cm1TY3JvbGxiYXI+Kik7CisKKyAgICAgICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCB7IHJldHVy
biBlbmFibGVkKCk7IH0KKyAgICAgICAgYm9vbCBpc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiBt
X3Zpc2libGU7IH0KKyAgICAgICAgdmlydHVhbCB2b2lkIHNob3coKSB7IG1fdmlzaWJsZSA9IHRy
dWU7IH0KKyAgICAgICAgdmlydHVhbCB2b2lkIGhpZGUoKSB7IG1fdmlzaWJsZSA9IGZhbHNlOyB9
CisgICAgICAgIHZpcnR1YWwgYm9vbCBzaG91bGRVcGRhdGVCYWNraW5nU3RvcmUoKSBjb25zdDsK
KyAgICAgICAgdmlydHVhbCBib29sIGlzU2Nyb2xsYmFyKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsg
fQorICAgICAgICB2aXJ0dWFsIGJvb2wgaXNWaWV3U2Nyb2xsYmFyKCkgY29uc3QgeyByZXR1cm4g
bV9pc1ZpZXdTY3JvbGxiYXI7IH0KKyAgICAgICAgdm9pZCBzZXRJc1ZpZXdTY3JvbGxiYXIoYm9v
bCBpcykgeyBtX2lzVmlld1Njcm9sbGJhciA9IGlzOyB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAg
ICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVUaHVtYlBvc2l0aW9uKCk7CisgICAgICAgIHZpcnR1YWwg
dm9pZCB1cGRhdGVUaHVtYlByb3BvcnRpb24oKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIElu
dFJlY3QgYmFja0J1dHRvblJlY3QoKSBjb25zdDsKKyAgICAgICAgSW50UmVjdCBmb3J3YXJkQnV0
dG9uUmVjdCgpIGNvbnN0OworICAgICAgICBJbnRSZWN0IHRyYWNrUmVjdCgpIGNvbnN0OworICAg
ICAgICBJbnRSZWN0IHRodW1iUmVjdCgpIGNvbnN0OworICAgICAgICBJbnRSZWN0IGdyaXBwZXJS
ZWN0KGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkgY29uc3Q7CisgICAgICAgIHZvaWQgc3BsaXRU
cmFjayhjb25zdCBJbnRSZWN0JiB0cmFja1JlY3QsIEludFJlY3QmIGJlZm9yZVRodW1iUmVjdCwg
SW50UmVjdCYgdGh1bWJSZWN0LCBJbnRSZWN0JiBhZnRlclRodW1iUmVjdCkgY29uc3Q7CisKKyAg
ICAgICAgaW50IHRodW1iUG9zaXRpb24oKSBjb25zdDsKKyAgICAgICAgaW50IHRodW1iTGVuZ3Ro
KCkgY29uc3Q7CisgICAgICAgIGludCB0cmFja0xlbmd0aCgpIGNvbnN0OworCisgICAgICAgIHZv
aWQgcGFpbnRCdXR0b24oR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYgYnV0dG9uUmVj
dCwgYm9vbCBzdGFydCwgY29uc3QgSW50UmVjdCYgZGFtYWdlUmVjdCkgY29uc3Q7CisgICAgICAg
IHZvaWQgcGFpbnRUcmFjayhHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0JiB0cmFja1Jl
Y3QsIGJvb2wgc3RhcnQsIGNvbnN0IEludFJlY3QmIGRhbWFnZVJlY3QpIGNvbnN0OworICAgICAg
ICB2b2lkIHBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiwgY29uc3QgSW50UmVjdCYgdGh1bWJS
ZWN0LCBjb25zdCBJbnRSZWN0JiBkYW1hZ2VSZWN0KSBjb25zdDsKKyAgICAgICAgdm9pZCBwYWlu
dEdyaXBwZXIoSERDLCBjb25zdCBJbnRSZWN0JiBncmlwcGVyUmVjdCkgY29uc3Q7CisKKyAgICAg
ICAgU2Nyb2xsYmFyUGFydCBoaXRUZXN0KGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYpOworCisg
ICAgICAgIHZvaWQgc3RhcnRUaW1lcklmTmVlZGVkKGRvdWJsZSBkZWxheSk7CisgICAgICAgIHZv
aWQgc3RvcFRpbWVySWZOZWVkZWQoKTsKKyAgICAgICAgdm9pZCBhdXRvc2Nyb2xsUHJlc3NlZFBh
cnQoZG91YmxlIGRlbGF5KTsKKyAgICAgICAgU2Nyb2xsRGlyZWN0aW9uIHByZXNzZWRQYXJ0U2Ny
b2xsRGlyZWN0aW9uKCk7CisgICAgICAgIFNjcm9sbEdyYW51bGFyaXR5IHByZXNzZWRQYXJ0U2Ny
b2xsR3JhbnVsYXJpdHkoKTsKKworICAgICAgICBib29sIHRodW1iVW5kZXJNb3VzZSgpOworCisg
ICAgICAgIHZvaWQgaW52YWxpZGF0ZVBhcnQoU2Nyb2xsYmFyUGFydCk7CisgICAgICAgIHZvaWQg
aW52YWxpZGF0ZVRyYWNrKCk7CisKKyAgICAgICAgU2Nyb2xsYmFyUGFydCBtX2hvdmVyZWRQYXJ0
OworICAgICAgICBTY3JvbGxiYXJQYXJ0IG1fcHJlc3NlZFBhcnQ7CisgICAgICAgIGludCBtX3By
ZXNzZWRQb3M7CisgICAgICAgIFRpbWVyPFBsYXRmb3JtU2Nyb2xsYmFyPiBtX3Njcm9sbFRpbWVy
OworICAgICAgICBib29sIG1fb3ZlcmxhcHNSZXNpemVyOworICAgICAgICBib29sIG1fdmlzaWJs
ZTsKKyAgICAgICAgYm9vbCBtX2lzVmlld1Njcm9sbGJhcjsKKyAgICB9OworCit9CisKKyNlbmRp
ZiAvLyBQbGF0Zm9ybVNjcm9sbGJhcl9oCisKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
d2luY2UvU2Nyb2xsYmFyVGhlbWVXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Nj
cm9sbGJhclRoZW1lV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjY1M2FkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Njcm9s
bGJhclRoZW1lV2luY2UuY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDA4IEFwcGxlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRl
ICJTY3JvbGxiYXJUaGVtZVdpbmNlLmgiCisKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIK
KyNpbmNsdWRlICJQbGF0Zm9ybU1vdXNlRXZlbnQuaCIKKyNpbmNsdWRlICJTY3JvbGxiYXIuaCIK
KyNpbmNsdWRlICJTb2Z0TGlua2luZy5oIgorCisvLyBHZW5lcmljIHN0YXRlIGNvbnN0YW50cwor
I2RlZmluZSBUU19OT1JNQUwgICAgMQorI2RlZmluZSBUU19IT1ZFUiAgICAgMgorI2RlZmluZSBU
U19BQ1RJVkUgICAgMworI2RlZmluZSBUU19ESVNBQkxFRCAgNAorCisjZGVmaW5lIFNQX0JVVFRP
TiAgICAgICAgICAxCisjZGVmaW5lIFNQX1RIVU1CSE9SICAgICAgICAyCisjZGVmaW5lIFNQX1RI
VU1CVkVSVCAgICAgICAzCisjZGVmaW5lIFNQX1RSQUNLU1RBUlRIT1IgICA0CisjZGVmaW5lIFNQ
X1RSQUNLRU5ESE9SICAgICA1CisjZGVmaW5lIFNQX1RSQUNLU1RBUlRWRVJUICA2CisjZGVmaW5l
IFNQX1RSQUNLRU5EVkVSVCAgICA3CisjZGVmaW5lIFNQX0dSSVBQRVJIT1IgICAgICA4CisjZGVm
aW5lIFNQX0dSSVBQRVJWRVJUICAgICA5CisKKyNkZWZpbmUgVFNfVVBfQlVUVE9OICAgICAgIDAK
KyNkZWZpbmUgVFNfRE9XTl9CVVRUT04gICAgIDQKKyNkZWZpbmUgVFNfTEVGVF9CVVRUT04gICAg
IDgKKyNkZWZpbmUgVFNfUklHSFRfQlVUVE9OICAgIDEyCisjZGVmaW5lIFRTX1VQX0JVVFRPTl9I
T1ZFUiAgIDE3CisjZGVmaW5lIFRTX0RPV05fQlVUVE9OX0hPVkVSICAxOAorI2RlZmluZSBUU19M
RUZUX0JVVFRPTl9IT1ZFUiAgMTkKKyNkZWZpbmUgVFNfUklHSFRfQlVUVE9OX0hPVkVSICAgMjAK
KwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitTY3JvbGxi
YXJUaGVtZVdpbmNlOjpTY3JvbGxiYXJUaGVtZVdpbmNlKCkKK3sKK30KKworU2Nyb2xsYmFyVGhl
bWVXaW5jZTo6flNjcm9sbGJhclRoZW1lV2luY2UoKQoreworfQorCitpbnQgU2Nyb2xsYmFyVGhl
bWVXaW5jZTo6c2Nyb2xsYmFyVGhpY2tuZXNzKFNjcm9sbGJhckNvbnRyb2xTaXplKQoreworICAg
IHN0YXRpYyBpbnQgdGhpY2tuZXNzOworICAgIGlmICghdGhpY2tuZXNzKQorICAgICAgICB0aGlj
a25lc3MgPSA6OkdldFN5c3RlbU1ldHJpY3MoU01fQ1hWU0NST0xMKTsKKyAgICByZXR1cm4gdGhp
Y2tuZXNzOworfQorCit2b2lkIFNjcm9sbGJhclRoZW1lV2luY2U6OnRoZW1lQ2hhbmdlZCgpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworYm9vbCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpp
bnZhbGlkYXRlT25Nb3VzZUVudGVyRXhpdCgpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAg
ICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU2Nyb2xsYmFyVGhlbWVXaW5jZTo6aGFzVGh1bWIo
U2Nyb2xsYmFyKiBzY3JvbGxiYXIpCit7CisgICAgcmV0dXJuIHRodW1iTGVuZ3RoKHNjcm9sbGJh
cikgPiAwOworfQorCitJbnRSZWN0IFNjcm9sbGJhclRoZW1lV2luY2U6OmJhY2tCdXR0b25SZWN0
KFNjcm9sbGJhciogc2Nyb2xsYmFyLCBTY3JvbGxiYXJQYXJ0IHBhcnQsIGJvb2wpCit7CisgICAg
Ly8gV2luZG93cyBqdXN0IGhhcyBzaW5nbGUgYXJyb3dzLgorICAgIGlmIChwYXJ0ID09IEJhY2tC
dXR0b25FbmRQYXJ0KQorICAgICAgICByZXR1cm4gSW50UmVjdCgpOworCisgICAgLy8gT3VyIGRl
c2lyZWQgcmVjdCBpcyBlc3NlbnRpYWxseSAxN3gxNy4KKworICAgIC8vIE91ciBhY3R1YWwgcmVj
dCB3aWxsIHNocmluayB0byBoYWxmIHRoZSBhdmFpbGFibGUgc3BhY2Ugd2hlbgorICAgIC8vIHdl
IGhhdmUgPCAzNCBwaXhlbHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRoZSBzY3JvbGxiYXIKKyAgICAv
LyB0byBzY2FsZSBkb3duIGFuZCBmdW5jdGlvbiBldmVuIGF0IHRpbnkgc2l6ZXMuCisgICAgaW50
IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcygpOworICAgIGlmIChzY3JvbGxiYXItPm9y
aWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikKKyAgICAgICAgcmV0dXJuIEludFJl
Y3Qoc2Nyb2xsYmFyLT54KCksIHNjcm9sbGJhci0+eSgpLAorICAgICAgICAgICAgICAgICAgICAg
ICBzY3JvbGxiYXItPndpZHRoKCkgPCAyICogdGhpY2tuZXNzID8gc2Nyb2xsYmFyLT53aWR0aCgp
IC8gMiA6IHRoaWNrbmVzcywgdGhpY2tuZXNzKTsKKyAgICByZXR1cm4gSW50UmVjdChzY3JvbGxi
YXItPngoKSwgc2Nyb2xsYmFyLT55KCksCisgICAgICAgICAgICAgICAgICAgdGhpY2tuZXNzLCBz
Y3JvbGxiYXItPmhlaWdodCgpIDwgMiAqIHRoaWNrbmVzcyA/IHNjcm9sbGJhci0+aGVpZ2h0KCkg
LyAyIDogdGhpY2tuZXNzKTsKK30KKworSW50UmVjdCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpmb3J3
YXJkQnV0dG9uUmVjdChTY3JvbGxiYXIqIHNjcm9sbGJhciwgU2Nyb2xsYmFyUGFydCBwYXJ0LCBi
b29sKQoreworICAgIC8vIFdpbmRvd3MganVzdCBoYXMgc2luZ2xlIGFycm93cy4KKyAgICBpZiAo
cGFydCA9PSBGb3J3YXJkQnV0dG9uU3RhcnRQYXJ0KQorICAgICAgICByZXR1cm4gSW50UmVjdCgp
OworCisgICAgLy8gT3VyIGRlc2lyZWQgcmVjdCBpcyBlc3NlbnRpYWxseSAxN3gxNy4KKworICAg
IC8vIE91ciBhY3R1YWwgcmVjdCB3aWxsIHNocmluayB0byBoYWxmIHRoZSBhdmFpbGFibGUgc3Bh
Y2Ugd2hlbgorICAgIC8vIHdlIGhhdmUgPCAzNCBwaXhlbHMgbGVmdC4gIFRoaXMgYWxsb3dzIHRo
ZSBzY3JvbGxiYXIKKyAgICAvLyB0byBzY2FsZSBkb3duIGFuZCBmdW5jdGlvbiBldmVuIGF0IHRp
bnkgc2l6ZXMuCisgICAgaW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcygpOworICAg
IGlmIChzY3JvbGxiYXItPm9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgewor
ICAgICAgICBpbnQgdyA9IHNjcm9sbGJhci0+d2lkdGgoKSA8IDIgKiB0aGlja25lc3MgPyBzY3Jv
bGxiYXItPndpZHRoKCkgLyAyIDogdGhpY2tuZXNzOworICAgICAgICByZXR1cm4gSW50UmVjdChz
Y3JvbGxiYXItPngoKSArIHNjcm9sbGJhci0+d2lkdGgoKSAtIHcsIHNjcm9sbGJhci0+eSgpLCB3
LCB0aGlja25lc3MpOworICAgIH0KKworICAgIGludCBoID0gc2Nyb2xsYmFyLT5oZWlnaHQoKSA8
IDIgKiB0aGlja25lc3MgPyBzY3JvbGxiYXItPmhlaWdodCgpIC8gMiA6IHRoaWNrbmVzczsKKyAg
ICByZXR1cm4gSW50UmVjdChzY3JvbGxiYXItPngoKSwgc2Nyb2xsYmFyLT55KCkgKyBzY3JvbGxi
YXItPmhlaWdodCgpIC0gaCwgdGhpY2tuZXNzLCBoKTsKK30KKworSW50UmVjdCBTY3JvbGxiYXJU
aGVtZVdpbmNlOjp0cmFja1JlY3QoU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGJvb2wpCit7CisgICAg
aW50IHRoaWNrbmVzcyA9IHNjcm9sbGJhclRoaWNrbmVzcygpOworICAgIGlmIChzY3JvbGxiYXIt
Pm9yaWVudGF0aW9uKCkgPT0gSG9yaXpvbnRhbFNjcm9sbGJhcikgeworICAgICAgICBpZiAoc2Ny
b2xsYmFyLT53aWR0aCgpIDwgMiAqIHRoaWNrbmVzcykKKyAgICAgICAgICAgIHJldHVybiBJbnRS
ZWN0KCk7CisgICAgICAgIHJldHVybiBJbnRSZWN0KHNjcm9sbGJhci0+eCgpICsgdGhpY2tuZXNz
LCBzY3JvbGxiYXItPnkoKSwgc2Nyb2xsYmFyLT53aWR0aCgpIC0gMiAqIHRoaWNrbmVzcywgdGhp
Y2tuZXNzKTsKKyAgICB9CisgICAgaWYgKHNjcm9sbGJhci0+aGVpZ2h0KCkgPCAyICogdGhpY2tu
ZXNzKQorICAgICAgICByZXR1cm4gSW50UmVjdCgpOworICAgIHJldHVybiBJbnRSZWN0KHNjcm9s
bGJhci0+eCgpLCBzY3JvbGxiYXItPnkoKSArIHRoaWNrbmVzcywgdGhpY2tuZXNzLCBzY3JvbGxi
YXItPmhlaWdodCgpIC0gMiAqIHRoaWNrbmVzcyk7Cit9CisKK3ZvaWQgU2Nyb2xsYmFyVGhlbWVX
aW5jZTo6cGFpbnRUcmFja0JhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0LCBTY3Jv
bGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKK30KKwordm9pZCBTY3Jv
bGxiYXJUaGVtZVdpbmNlOjpwYWludFRyYWNrUGllY2UoR3JhcGhpY3NDb250ZXh0KiBjb250ZXh0
LCBTY3JvbGxiYXIqIHNjcm9sbGJhciwgY29uc3QgSW50UmVjdCYgcmVjdCwgU2Nyb2xsYmFyUGFy
dCBwYXJ0VHlwZSkKK3sKK30KKwordm9pZCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpwYWludEJ1dHRv
bihHcmFwaGljc0NvbnRleHQqIGNvbnRleHQsIFNjcm9sbGJhciogc2Nyb2xsYmFyLCBjb25zdCBJ
bnRSZWN0JiByZWN0LCBTY3JvbGxiYXJQYXJ0IHBhcnQpCit7Cit9CisKK3N0YXRpYyBJbnRSZWN0
IGdyaXBwZXJSZWN0KGludCB0aGlja25lc3MsIGNvbnN0IEludFJlY3QmIHRodW1iUmVjdCkKK3sK
KyAgICAvLyBDZW50ZXIgaW4gdGhlIHRodW1iLgorICAgIGludCBncmlwcGVyVGhpY2tuZXNzID0g
dGhpY2tuZXNzIC8gMjsKKyAgICByZXR1cm4gSW50UmVjdCh0aHVtYlJlY3QueCgpICsgKHRodW1i
UmVjdC53aWR0aCgpIC0gZ3JpcHBlclRoaWNrbmVzcykgLyAyLAorICAgICAgICAgICAgICAgICAg
IHRodW1iUmVjdC55KCkgKyAodGh1bWJSZWN0LmhlaWdodCgpIC0gZ3JpcHBlclRoaWNrbmVzcykg
LyAyLAorICAgICAgICAgICAgICAgICAgIGdyaXBwZXJUaGlja25lc3MsIGdyaXBwZXJUaGlja25l
c3MpOworfQorCitzdGF0aWMgdm9pZCBwYWludEdyaXBwZXIoU2Nyb2xsYmFyKiBzY3JvbGxiYXIs
IEhEQyBoZGMsIGNvbnN0IEludFJlY3QmIHJlY3QpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsK
K30KKwordm9pZCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpwYWludFRodW1iKEdyYXBoaWNzQ29udGV4
dCogY29udGV4dCwgU2Nyb2xsYmFyKiBzY3JvbGxiYXIsIGNvbnN0IEludFJlY3QmIHJlY3QpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworYm9vbCBTY3JvbGxiYXJUaGVtZVdpbmNlOjpz
aG91bGRDZW50ZXJPblRodW1iKFNjcm9sbGJhciosIGNvbnN0IFBsYXRmb3JtTW91c2VFdmVudCYg
ZXZ0KQoreworICAgIHJldHVybiBldnQuc2hpZnRLZXkoKSAmJiBldnQuYnV0dG9uKCkgPT0gTGVm
dEJ1dHRvbjsKK30KKworU2Nyb2xsYmFyVGhlbWUqIFNjcm9sbGJhclRoZW1lOjpuYXRpdmVUaGVt
ZSgpCit7CisgICAgc3RhdGljIFNjcm9sbGJhclRoZW1lV2luY2Ugd2luY2VUaGVtZTsKKyAgICBy
ZXR1cm4gJndpbmNlVGhlbWU7Cit9CisKK30KKwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9TY3JvbGxiYXJUaGVtZVdpbmNlLmggYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1Nj
cm9sbGJhclRoZW1lV2luY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5i
ODM3MTE4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TY3JvbGxi
YXJUaGVtZVdpbmNlLmgKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAw
OCBBcHBsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworCisjaWZuZGVmIFNjcm9sbGJhclRoZW1lV2luY2VfaAorI2Rl
ZmluZSBTY3JvbGxiYXJUaGVtZVdpbmNlX2gKKworI2luY2x1ZGUgIlNjcm9sbGJhclRoZW1lQ29t
cG9zaXRlLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworICAgIGNsYXNzIFNjcm9sbGJhclRo
ZW1lV2luY2UgOiBwdWJsaWMgU2Nyb2xsYmFyVGhlbWVDb21wb3NpdGUgeworICAgIHB1YmxpYzoK
KyAgICAgICAgU2Nyb2xsYmFyVGhlbWVXaW5jZSgpOworICAgICAgICB2aXJ0dWFsIH5TY3JvbGxi
YXJUaGVtZVdpbmNlKCk7CisKKyAgICAgICAgdmlydHVhbCBpbnQgc2Nyb2xsYmFyVGhpY2tuZXNz
KFNjcm9sbGJhckNvbnRyb2xTaXplID0gUmVndWxhclNjcm9sbGJhcik7CisKKyAgICAgICAgdmly
dHVhbCB2b2lkIHRoZW1lQ2hhbmdlZCgpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBpbnZhbGlk
YXRlT25Nb3VzZUVudGVyRXhpdCgpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFs
IGJvb2wgaGFzQnV0dG9ucyhTY3JvbGxiYXIqKSB7IHJldHVybiB0cnVlOyB9CisgICAgICAgIHZp
cnR1YWwgYm9vbCBoYXNUaHVtYihTY3JvbGxiYXIqKTsKKworICAgICAgICB2aXJ0dWFsIEludFJl
Y3QgYmFja0J1dHRvblJlY3QoU2Nyb2xsYmFyKiwgU2Nyb2xsYmFyUGFydCwgYm9vbCBwYWludGlu
ZyA9IGZhbHNlKTsKKyAgICAgICAgdmlydHVhbCBJbnRSZWN0IGZvcndhcmRCdXR0b25SZWN0KFNj
cm9sbGJhciosIFNjcm9sbGJhclBhcnQsIGJvb2wgcGFpbnRpbmcgPSBmYWxzZSk7CisgICAgICAg
IHZpcnR1YWwgSW50UmVjdCB0cmFja1JlY3QoU2Nyb2xsYmFyKiwgYm9vbCBwYWludGluZyA9IGZh
bHNlKTsKKworICAgICAgICB2aXJ0dWFsIGJvb2wgc2hvdWxkQ2VudGVyT25UaHVtYihTY3JvbGxi
YXIqLCBjb25zdCBQbGF0Zm9ybU1vdXNlRXZlbnQmKTsKKworICAgICAgICB2aXJ0dWFsIHZvaWQg
cGFpbnRUcmFja0JhY2tncm91bmQoR3JhcGhpY3NDb250ZXh0KiwgU2Nyb2xsYmFyKiwgY29uc3Qg
SW50UmVjdCYpOworICAgICAgICB2aXJ0dWFsIHZvaWQgcGFpbnRUcmFja1BpZWNlKEdyYXBoaWNz
Q29udGV4dCosIFNjcm9sbGJhciosIGNvbnN0IEludFJlY3QmLCBTY3JvbGxiYXJQYXJ0KTsKKyAg
ICAgICAgdmlydHVhbCB2b2lkIHBhaW50QnV0dG9uKEdyYXBoaWNzQ29udGV4dCosIFNjcm9sbGJh
ciosIGNvbnN0IEludFJlY3QmLCBTY3JvbGxiYXJQYXJ0KTsKKyAgICAgICAgdmlydHVhbCB2b2lk
IHBhaW50VGh1bWIoR3JhcGhpY3NDb250ZXh0KiwgU2Nyb2xsYmFyKiwgY29uc3QgSW50UmVjdCYp
OworICAgIH07CisKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5j
ZS9XaWRnZXRXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1dpZGdldFdpbmNlLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjA2OTU3Ci0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9XaWRnZXRXaW5jZS5jcHAKQEAgLTAsMCAr
MSwyNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBUb3JjaCBNb2JpbGUsIElu
Yy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIldpZGdldC5oIgorCisj
aW5jbHVkZSAiQ3Vyc29yLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFbGVt
ZW50LmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiR3JhcGhpY3NDb250ZXh0
LmgiCisjaW5jbHVkZSAiSG9zdFdpbmRvdy5oIgorI2luY2x1ZGUgIkludFJlY3QuaCIKKyNpbmNs
dWRlICJQYWdlLmgiCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisKK3ZvaWQgV2lkZ2V0Ojppbml0KFBsYXRmb3JtV2lkZ2V0IHdpZGdldCkKK3sKKyAgICBtX3Bh
cmVudCA9IDA7CisgICAgbV9zZWxmVmlzaWJsZSA9IGZhbHNlOworICAgIG1fcGFyZW50VmlzaWJs
ZSA9IGZhbHNlOworICAgIG1fd2lkZ2V0ID0gd2lkZ2V0OworICAgIGlmIChtX3dpZGdldCkKKyAg
ICAgICAgcmV0YWluUGxhdGZvcm1XaWRnZXQoKTsKK30KKwordm9pZCBXaWRnZXQ6OnNldFBhcmVu
dChTY3JvbGxWaWV3KiB2aWV3KQoreworICAgIEFTU0VSVCghdmlldyB8fCAhbV9wYXJlbnQpOwor
ICAgIGlmICghdmlldyB8fCAhdmlldy0+aXNWaXNpYmxlKCkpCisgICAgICAgIHNldFBhcmVudFZp
c2libGUoZmFsc2UpOworICAgIG1fcGFyZW50ID0gdmlldzsKKyAgICBpZiAodmlldyAmJiB2aWV3
LT5pc1Zpc2libGUoKSkKKyAgICAgICAgc2V0UGFyZW50VmlzaWJsZSh0cnVlKTsKK30KKworU2Ny
b2xsVmlldyogV2lkZ2V0Ojpyb290KCkgY29uc3QKK3sKKyAgICBjb25zdCBXaWRnZXQqIHRvcCA9
IHRoaXM7CisgICAgd2hpbGUgKHRvcC0+cGFyZW50KCkpCisgICAgICAgIHRvcCA9IHRvcC0+cGFy
ZW50KCk7CisgICAgaWYgKHRvcC0+aXNGcmFtZVZpZXcoKSkKKyAgICAgICAgcmV0dXJuIGNvbnN0
X2Nhc3Q8U2Nyb2xsVmlldyo+KHN0YXRpY19jYXN0PGNvbnN0IFNjcm9sbFZpZXcqPih0b3ApKTsK
KyAgICByZXR1cm4gMDsKK30KKwordm9pZCBXaWRnZXQ6OnJlbW92ZUZyb21QYXJlbnQoKQorewor
ICAgIGlmIChwYXJlbnQoKSkKKyAgICAgICAgcGFyZW50KCktPnJlbW92ZUNoaWxkKHRoaXMpOwor
fQorCisKK3ZvaWQgV2lkZ2V0OjpwYWludChHcmFwaGljc0NvbnRleHQqLCBjb25zdCBJbnRSZWN0
JikKK3sKK30KKwordm9pZCBXaWRnZXQ6OnNldEZvY3VzKCkKK3sKK30KKwordm9pZCBXaWRnZXQ6
OnNldElzU2VsZWN0ZWQoYm9vbCkKK3sKK30KKworSW50UmVjdCBXaWRnZXQ6OmZyYW1lUmVjdCgp
IGNvbnN0Cit7CisgICAgcmV0dXJuIG1fZnJhbWU7Cit9CisKK3ZvaWQgV2lkZ2V0OjpzZXRGcmFt
ZVJlY3QoY29uc3QgSW50UmVjdCYgcmVjdCkKK3sKKyAgICBtX2ZyYW1lID0gcmVjdDsKK30KKwor
V2lkZ2V0OjpXaWRnZXQoUGxhdGZvcm1XaWRnZXQgd2lkZ2V0KQoreworICAgIGluaXQod2lkZ2V0
KTsKK30KKwordm9pZCBXaWRnZXQ6OnJlbGVhc2VQbGF0Zm9ybVdpZGdldCgpCit7Cit9CisKK3Zv
aWQgV2lkZ2V0OjpyZXRhaW5QbGF0Zm9ybVdpZGdldCgpCit7Cit9CisKK1dpZGdldDo6fldpZGdl
dCgpCit7CisgICAgQVNTRVJUKCFwYXJlbnQoKSk7Cit9CisKK3ZvaWQgV2lkZ2V0OjpzaG93KCkK
K3sKK30KKwordm9pZCBXaWRnZXQ6OmhpZGUoKQoreworfQorCit2b2lkIFdpZGdldDo6c2V0Q3Vy
c29yKGNvbnN0IEN1cnNvciYgY3Vyc29yKQoreworICAgIFNjcm9sbFZpZXcqIHZpZXcgPSByb290
KCk7CisgICAgaWYgKHZpZXcgJiYgdmlldy0+aXNGcmFtZVZpZXcoKSkgeworICAgICAgICBpZiAo
RnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8RnJhbWVWaWV3Kj4odmlldyktPmZyYW1lKCkpIHsK
KyAgICAgICAgICAgIGlmIChQYWdlKiBwYWdlID0gZnJhbWUtPnBhZ2UoKSkKKyAgICAgICAgICAg
ICAgICBwYWdlLT5jaHJvbWUoKS0+c2V0Q3Vyc29yKGN1cnNvci5pbXBsKCkpOworICAgICAgICB9
CisgICAgfQorfQorCitJbnRQb2ludCBXaWRnZXQ6OmNvbnZlcnRUb0NvbnRhaW5pbmdXaW5kb3co
Y29uc3QgSW50UG9pbnQmIHBvaW50KSBjb25zdAoreworICAgIC8vIGNhbGxlZCBieSBTY3JvbGxW
aWV3IG9yIFBsYXRmb3JtU2Nyb2xsQmFyLgorICAgIGlmIChpc0ZyYW1lVmlldygpKSB7CisgICAg
ICAgIGNvbnN0IFNjcm9sbFZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcq
Pih0aGlzKTsKKyAgICAgICAgcmV0dXJuIHZpZXctPmNvbnRlbnRzVG9XaW5kb3cocG9pbnQgKyB2
aWV3LT5zY3JvbGxPZmZzZXQoKSk7CisgICAgfSBlbHNlIGlmIChwYXJlbnQoKSkKKyAgICAgICAg
cmV0dXJuIHBhcmVudCgpLT5jb250ZW50c1RvV2luZG93KHBvaW50ICsgSW50U2l6ZSh4KCksIHko
KSkgKyBwYXJlbnQoKS0+c2Nyb2xsT2Zmc2V0KCkpOworCisgICAgcmV0dXJuIHBvaW50OworfQor
CitJbnRSZWN0IFdpZGdldDo6Y29udmVydFRvQ29udGFpbmluZ1dpbmRvdyhjb25zdCBJbnRSZWN0
JiByZWN0KSBjb25zdAoreworICAgIC8vIGNhbGxlZCBieSBTY3JvbGxWaWV3IG9yIFBsYXRmb3Jt
U2Nyb2xsQmFyLgorICAgIGlmIChpc0ZyYW1lVmlldygpKSB7CisgICAgICAgIGNvbnN0IFNjcm9s
bFZpZXcqIHZpZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAg
ICAgcmV0dXJuIHZpZXctPmNvbnRlbnRzVG9XaW5kb3coSW50UmVjdChyZWN0LmxvY2F0aW9uKCkg
KyB2aWV3LT5zY3JvbGxPZmZzZXQoKSwgcmVjdC5zaXplKCkpKTsKKyAgICB9IGVsc2UgaWYgKHBh
cmVudCgpKSB7CisgICAgICAgIEludFBvaW50IGNvbnRlbnRzUG9pbnQgPSByZWN0LmxvY2F0aW9u
KCkgKyBJbnRTaXplKHgoKSwgeSgpKTsKKyAgICAgICAgcmV0dXJuIHBhcmVudCgpLT5jb250ZW50
c1RvV2luZG93KEludFJlY3QoaXNWaWV3U2Nyb2xsYmFyKCkgPyBjb250ZW50c1BvaW50ICsgcGFy
ZW50KCktPnNjcm9sbE9mZnNldCgpIDogY29udGVudHNQb2ludAorICAgICAgICAgICAgLCByZWN0
LnNpemUoKSkpOworICAgIH0KKworICAgIHJldHVybiByZWN0OworfQorCitJbnRQb2ludCBXaWRn
ZXQ6OmNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhjb25zdCBJbnRQb2ludCYgcG9pbnQpIGNv
bnN0Cit7CisgICAgIC8vIGNhbGxlZCBieSBTY3JvbGxWaWV3IG9yIFBsYXRmb3JtU2Nyb2xsQmFy
LgorICAgIGlmIChpc0ZyYW1lVmlldygpKSB7CisgICAgICAgIGNvbnN0IFNjcm9sbFZpZXcqIHZp
ZXcgPSBzdGF0aWNfY2FzdDxjb25zdCBGcmFtZVZpZXcqPih0aGlzKTsKKyAgICAgICAgcmV0dXJu
IHZpZXctPndpbmRvd1RvQ29udGVudHMocG9pbnQpIC0gdmlldy0+c2Nyb2xsT2Zmc2V0KCk7Cisg
ICAgfSBlbHNlIGlmIChwYXJlbnQoKSkgeworICAgICAgICBJbnRQb2ludCBydG4gPSBwYXJlbnQo
KS0+d2luZG93VG9Db250ZW50cyhwb2ludCkgLSBJbnRTaXplKHgoKSwgeSgpKTsKKyAgICAgICAg
cmV0dXJuIGlzVmlld1Njcm9sbGJhcigpID8gcnRuIC0gcGFyZW50KCktPnNjcm9sbE9mZnNldCgp
IDogcnRuOworICAgIH0KKworICAgIHJldHVybiBwb2ludDsKK30KKworSW50UmVjdCBXaWRnZXQ6
OmNvbnZlcnRGcm9tQ29udGFpbmluZ1dpbmRvdyhjb25zdCBJbnRSZWN0JiByZWN0KSBjb25zdAor
eworICAgICAvLyBjYWxsZWQgYnkgU2Nyb2xsVmlldyBvciBQbGF0Zm9ybVNjcm9sbEJhci4KKyAg
ICBpZiAoaXNGcmFtZVZpZXcoKSkgeworICAgICAgICBjb25zdCBTY3JvbGxWaWV3KiB2aWV3ID0g
c3RhdGljX2Nhc3Q8Y29uc3QgRnJhbWVWaWV3Kj4odGhpcyk7CisgICAgICAgIEludFJlY3QgcnRu
ID0gdmlldy0+d2luZG93VG9Db250ZW50cyhyZWN0KTsKKyAgICAgICAgcnRuLm1vdmUoLXZpZXct
PnNjcm9sbE9mZnNldCgpKTsKKyAgICAgICAgcmV0dXJuIHJ0bjsKKyAgICB9IGVsc2UgaWYgKHBh
cmVudCgpKSB7CisgICAgICAgIEludFJlY3QgcnRuID0gcGFyZW50KCktPndpbmRvd1RvQ29udGVu
dHMocmVjdCk7CisgICAgICAgIHJ0bi5tb3ZlKEludFNpemUoLXgoKSwgLXkoKSkpOworICAgICAg
ICBpZiAoaXNWaWV3U2Nyb2xsYmFyKCkpCisgICAgICAgICAgICBydG4ubW92ZSgtcGFyZW50KCkt
PnNjcm9sbE9mZnNldCgpKTsKKworICAgICAgICByZXR1cm4gcnRuOworICAgIH0KKworICAgIHJl
dHVybiByZWN0OworfQorCisKK0ludFBvaW50IFdpZGdldDo6Y29udmVydENoaWxkVG9TZWxmKGNv
bnN0IFdpZGdldCogY2hpbGQsIGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gSW50UG9pbnQocG9pbnQueCgpICsgY2hpbGQtPngoKSwgcG9pbnQueSgpICsgY2hpbGQt
PnkoKSk7Cit9CisKK0ludFBvaW50IFdpZGdldDo6Y29udmVydFNlbGZUb0NoaWxkKGNvbnN0IFdp
ZGdldCogY2hpbGQsIGNvbnN0IEludFBvaW50JiBwb2ludCkgY29uc3QKK3sKKyAgICByZXR1cm4g
SW50UG9pbnQocG9pbnQueCgpIC0gY2hpbGQtPngoKSwgcG9pbnQueSgpIC0gY2hpbGQtPnkoKSk7
Cit9CisKK3ZvaWQgV2lkZ2V0OjppbnZhbGlkYXRlUmVjdChjb25zdCBJbnRSZWN0JiByKQorewor
ICAgIFNjcm9sbFZpZXcqIG91dGVybW9zdFZpZXcgPSBwYXJlbnQoKTsKKyAgICBpZiAob3V0ZXJt
b3N0VmlldykgeworICAgICAgICB3aGlsZSAob3V0ZXJtb3N0Vmlldy0+cGFyZW50KCkpCisgICAg
ICAgICAgICBvdXRlcm1vc3RWaWV3ID0gb3V0ZXJtb3N0Vmlldy0+cGFyZW50KCk7CisgICAgfSBl
bHNlIGlmIChpc0ZyYW1lVmlldygpKQorICAgICAgICBvdXRlcm1vc3RWaWV3ID0gc3RhdGljX2Nh
c3Q8RnJhbWVWaWV3Kj4odGhpcyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm47CisKKyAgICBp
ZiAoIW91dGVybW9zdFZpZXctPmlzVmlzaWJsZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBJ
bnRSZWN0IHJlY3QgPSBjb252ZXJ0VG9Db250YWluaW5nV2luZG93KHIpOworICAgIG91dGVybW9z
dFZpZXctPmhvc3RXaW5kb3coKS0+cmVwYWludChzdGF0aWNfY2FzdDxGcmFtZVZpZXcqPihvdXRl
cm1vc3RWaWV3KS0+ZnJhbWUoKSwgcmVjdCwgc2hvdWxkVXBkYXRlQmFja2luZ1N0b3JlKCksIGlz
U2Nyb2xsYmFyKCkpOworfQorCitJbnRSZWN0IFdpZGdldDo6Y29udmVydFRvQ29udGFpbmluZ1Zp
ZXcoY29uc3QgSW50UmVjdCYgbG9jYWxSZWN0KSBjb25zdAoreworICAgIGlmIChjb25zdCBTY3Jv
bGxWaWV3KiBwYXJlbnRTY3JvbGxWaWV3ID0gcGFyZW50KCkpIHsKKyAgICAgICAgSW50UmVjdCBw
YXJlbnRSZWN0KGxvY2FsUmVjdCk7CisgICAgICAgIHBhcmVudFJlY3Quc2V0TG9jYXRpb24ocGFy
ZW50U2Nyb2xsVmlldy0+Y29udmVydENoaWxkVG9TZWxmKHRoaXMsIGxvY2FsUmVjdC5sb2NhdGlv
bigpKSk7CisgICAgICAgIHJldHVybiBwYXJlbnRSZWN0OworICAgIH0KKyAgICByZXR1cm4gbG9j
YWxSZWN0OworfQorCitJbnRSZWN0IFdpZGdldDo6Y29udmVydEZyb21Db250YWluaW5nVmlldyhj
b25zdCBJbnRSZWN0JiBwYXJlbnRSZWN0KSBjb25zdAoreworICAgIGlmIChjb25zdCBTY3JvbGxW
aWV3KiBwYXJlbnRTY3JvbGxWaWV3ID0gcGFyZW50KCkpIHsKKyAgICAgICAgSW50UmVjdCBsb2Nh
bFJlY3QgPSBwYXJlbnRSZWN0OworICAgICAgICBsb2NhbFJlY3Quc2V0TG9jYXRpb24ocGFyZW50
U2Nyb2xsVmlldy0+Y29udmVydFNlbGZUb0NoaWxkKHRoaXMsIGxvY2FsUmVjdC5sb2NhdGlvbigp
KSk7CisgICAgICAgIHJldHVybiBsb2NhbFJlY3Q7CisgICAgfQorCisgICAgcmV0dXJuIHBhcmVu
dFJlY3Q7Cit9CisKK0ludFBvaW50IFdpZGdldDo6Y29udmVydFRvQ29udGFpbmluZ1ZpZXcoY29u
c3QgSW50UG9pbnQmIGxvY2FsUG9pbnQpIGNvbnN0Cit7CisgICAgaWYgKGNvbnN0IFNjcm9sbFZp
ZXcqIHBhcmVudFNjcm9sbFZpZXcgPSBwYXJlbnQoKSkKKyAgICAgICAgcmV0dXJuIHBhcmVudFNj
cm9sbFZpZXctPmNvbnZlcnRDaGlsZFRvU2VsZih0aGlzLCBsb2NhbFBvaW50KTsKKworICAgIHJl
dHVybiBsb2NhbFBvaW50OworfQorCitJbnRQb2ludCBXaWRnZXQ6OmNvbnZlcnRGcm9tQ29udGFp
bmluZ1ZpZXcoY29uc3QgSW50UG9pbnQmIHBhcmVudFBvaW50KSBjb25zdAoreworICAgIGlmIChj
b25zdCBTY3JvbGxWaWV3KiBwYXJlbnRTY3JvbGxWaWV3ID0gcGFyZW50KCkpCisgICAgICAgIHJl
dHVybiBwYXJlbnRTY3JvbGxWaWV3LT5jb252ZXJ0U2VsZlRvQ2hpbGQodGhpcywgcGFyZW50UG9p
bnQpOworCisgICAgcmV0dXJuIHBhcmVudFBvaW50OworfQorfSAvLyBuYW1lc3BhY2UgV2ViQ29y
ZQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34378</attachid>
            <date>2009-08-08 11:07:51 -0700</date>
            <delta_ts>2009-09-01 18:12:37 -0700</delta_ts>
            <desc>4) SharedBuffer &amp; OptimizedBuffer</desc>
            <filename>27543_4.patch</filename>
            <type>text/plain</type>
            <size>13669</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMWIxMDEzMyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IFNoYXJlZEJ1ZmZlciBhbmQgT3B0aW1pemVkQnVm
ZmVyIChtZW1vcnkgb3B0aW1pemF0aW9uKQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9y
Zy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1NDMKKworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL09wdGlt
aXplZEJ1ZmZlci5jcHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL09wdGltaXpl
ZEJ1ZmZlci5oOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TaGFyZWRCdWZmZXIu
Y3BwOiBBZGRlZC4KKwogMjAwOS0wOC0wNiAgWW9uZyBMaSAgPHlvbmcubGlAdG9yY2htb2JpbGUu
Y29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0tZ2l0IGEv
V2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9PcHRpbWl6ZWRCdWZmZXIuY3BwIGIvV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9PcHRpbWl6ZWRCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4
IDAwMDAwMDAuLmExMDgyNTgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL09wdGltaXplZEJ1ZmZlci5jcHAKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmlsZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlz
IGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAq
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFu
eSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJB
TlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
KiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBm
aWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUg
Rm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNkZWZpbmUgRVhQT1JUX09QVElNSVpF
RF9CVUZGRVIgX19kZWNsc3BlYyhkbGxleHBvcnQpCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJPcHRpbWl6ZWRCdWZmZXIuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitPcHRp
bWl6ZWRCdWZmZXI6OkNyZWF0b3IgT3B0aW1pemVkQnVmZmVyOjptX2NyZWF0b3IgPSAwOworCitP
cHRpbWl6ZWRCdWZmZXI6OkNyZWF0b3IgT3B0aW1pemVkQnVmZmVyOjpzZXRDcmVhdG9yKENyZWF0
b3IgbmV3Q3JlYXRvcikKK3sKKyAgICBDcmVhdG9yIG9sZENyZWF0b3IgPSBtX2NyZWF0b3I7Cisg
ICAgbV9jcmVhdG9yID0gbmV3Q3JlYXRvcjsKKyAgICByZXR1cm4gb2xkQ3JlYXRvcjsKK30KKwor
T3B0aW1pemVkQnVmZmVyKiBPcHRpbWl6ZWRCdWZmZXI6OmNyZWF0ZUluc3RhbmNlKHVuc2lnbmVk
IGV4cGVjdGVkU2l6ZSwgT3B0aW1pemVkQnVmZmVyKiBvbGRCdWZmZXIsIGJvb2wgcHVyZ2VhYmxl
KQoreworICAgIHJldHVybiBtX2NyZWF0b3IgPyBtX2NyZWF0b3IoZXhwZWN0ZWRTaXplLCBvbGRC
dWZmZXIsIHB1cmdlYWJsZSkgOiAwOworfQorCit2b2lkIE9wdGltaXplZEJ1ZmZlcjo6Y29weVRv
KE9wdGltaXplZEJ1ZmZlciYgbykgY29uc3QKK3sKKyAgICBvLmNsZWFyKCk7CisgICAgY29uc3Qg
Y2hhciogZGF0YTsKKyAgICB1bnNpZ25lZCBwb3MgPSAwOworICAgIHdoaWxlICh1bnNpZ25lZCBs
ZW4gPSBnZXREYXRhKCZkYXRhLCBwb3MpKSB7CisgICAgICAgIG8uYXBwZW5kKGRhdGEsIGxlbik7
CisgICAgICAgIHBvcyArPSBsZW47CisgICAgICAgIHJlbGVhc2VEYXRhKGRhdGEpOworICAgIH0K
K30KKwordm9pZCBPcHRpbWl6ZWRCdWZmZXI6OmNvcHlGcm9tKGNvbnN0IE9wdGltaXplZEJ1ZmZl
ciYgbykKK3sKKyAgICBjbGVhcigpOworICAgIGNvbnN0IGNoYXIqIGRhdGE7CisgICAgdW5zaWdu
ZWQgcG9zID0gMDsKKyAgICB3aGlsZSAodW5zaWduZWQgbGVuID0gby5nZXREYXRhKCZkYXRhLCBw
b3MpKSB7CisgICAgICAgIGFwcGVuZChkYXRhLCBsZW4pOworICAgICAgICBwb3MgKz0gbGVuOwor
ICAgICAgICByZWxlYXNlRGF0YShkYXRhKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvT3B0aW1pemVkQnVmZmVy
LmggYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL09wdGltaXplZEJ1ZmZlci5oCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1N2Y5NDgKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL09wdGltaXplZEJ1ZmZlci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVy
YWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlz
dHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRI
T1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisg
KiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT
ZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRl
dGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJh
cnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGgg
Rmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjcHJhZ21hIG9u
Y2UKKworI2lmbmRlZiBfT1BUSU1JWkVEX0JVRkZFUl9IXworI2RlZmluZSBfT1BUSU1JWkVEX0JV
RkZFUl9IXworCisjaWZuZGVmIEVYUE9SVF9PUFRJTUlaRURfQlVGRkVSCisjZGVmaW5lIEVYUE9S
VF9PUFRJTUlaRURfQlVGRkVSCisjZW5kaWYKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCisgICAg
Y2xhc3MgRVhQT1JUX09QVElNSVpFRF9CVUZGRVIgT3B0aW1pemVkQnVmZmVyIHsKKyAgICBwdWJs
aWM6CisgICAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFtX3NpemU7IH0KKyAg
ICAgICAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1fc2l6ZTsgfQorICAgICAgICB2
aXJ0dWFsIGNvbnN0IGNoYXIqIGNsYXNzTmFtZSgpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVh
bCB2b2lkIHNlbGZEZWxldGUoKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjbGVhcigpID0g
MDsKKyAgICAgICAgdmlydHVhbCB2b2lkIGFwcGVuZChjb25zdCBjaGFyKiBkYXRhLCB1bnNpZ25l
ZCBsZW4pID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIHByZXBlbmQoY29uc3QgY2hhciogZGF0
YSwgdW5zaWduZWQgbGVuKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RGF0YShj
b25zdCBjaGFyKiogZGF0YSwgdW5zaWduZWQgcG9zID0gMCkgY29uc3QgPSAwOworICAgICAgICB2
aXJ0dWFsIHZvaWQgcmVsZWFzZURhdGEoY29uc3QgY2hhciogZGF0YSkgY29uc3QgPSAwOworICAg
ICAgICB2aXJ0dWFsIHZvaWQgZXh0cmFjdERhdGEoY2hhciogZGF0YSwgdW5zaWduZWQgcG9zID0g
MCwgdW5zaWduZWQgbGVuID0gLTEpIGNvbnN0ID0gMDsKKyAgICAgICAgdmlydHVhbCB1bnNpZ25l
ZCBhbGxvY2F0ZURhdGFUb1dyaXRlKGNoYXIqKiBkYXRhLCB1bnNpZ25lZCBkZXNpcmVkTGVuID0g
LTEpID0gMDsKKyAgICAgICAgdmlydHVhbCBPcHRpbWl6ZWRCdWZmZXIqIGNsb25lKCkgY29uc3Qg
PSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgcG9wU2VnbWVudCgpID0gMDsKKyAgICAgICAgdmly
dHVhbCBib29sIGlzUHVyZ2VhYmxlKCkgY29uc3QgPSAwOworICAgICAgICB2b2lkIGNvcHlUbyhP
cHRpbWl6ZWRCdWZmZXImIG8pIGNvbnN0OworICAgICAgICB2b2lkIGNvcHlGcm9tKGNvbnN0IE9w
dGltaXplZEJ1ZmZlciYgbyk7CisKKyAgICAgICAgc3RhdGljIE9wdGltaXplZEJ1ZmZlciogY3Jl
YXRlSW5zdGFuY2UodW5zaWduZWQgZXhwZWN0ZWRTaXplLCBPcHRpbWl6ZWRCdWZmZXIqIG9sZEJ1
ZmZlciwgYm9vbCBwdXJnZWFibGUgPSBmYWxzZSk7CisgICAgICAgIHN0YXRpYyB2b2lkIGRlbGV0
ZUluc3RhbmNlKE9wdGltaXplZEJ1ZmZlciogYikgeyBpZiAoYikgYi0+c2VsZkRlbGV0ZSgpOyB9
CisgICAgICAgIHR5cGVkZWYgT3B0aW1pemVkQnVmZmVyKiAoKkNyZWF0b3IpKHVuc2lnbmVkIGV4
cGVjdGVkU2l6ZSwgT3B0aW1pemVkQnVmZmVyKiBvbGRCdWZmZXIsIGJvb2wgcHVyZ2VhYmxlKTsK
KyAgICAgICAgc3RhdGljIENyZWF0b3Igc2V0Q3JlYXRvcihDcmVhdG9yKTsKKyAgICAgICAgc3Rh
dGljIGJvb2wgaXNDcmVhdG9ySW5zdGFsbGVkKCkgeyByZXR1cm4gISFtX2NyZWF0b3I7IH0KKyAg
ICBwcm90ZWN0ZWQ6CisgICAgICAgIE9wdGltaXplZEJ1ZmZlcigpIDogbV9zaXplKDApIHt9Cisg
ICAgICAgIHZpcnR1YWwgfk9wdGltaXplZEJ1ZmZlcigpIHt9CisgICAgICAgIHVuc2lnbmVkIG1f
c2l6ZTsKKyAgICAgICAgc3RhdGljIENyZWF0b3IgbV9jcmVhdG9yOworICAgIH07Cit9CisKKyNl
bmRpZiAvLyBfT1BUSU1JWkVEX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9y
bS93aW5jZS9TaGFyZWRCdWZmZXIuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRC
dWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3OTY3NTEKLS0t
IC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NoYXJlZEJ1ZmZlci5jcHAK
QEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDggQXBwbGUg
Q29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDgtMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lmIFBMQVRGT1JNKFRPUkNITU9C
SUxFKSAmJiBQTEFURk9STShXSU5DRSkKKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUg
IlNoYXJlZEJ1ZmZlci5oIgorCisjaW5jbHVkZSAiT3B0aW1pemVkQnVmZmVyLmgiCisjaW5jbHVk
ZSAiUHVyZ2VhYmxlQnVmZmVyLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU2hhcmVkQnVm
ZmVyOjpTaGFyZWRCdWZmZXIoKQorOiBtX3NpemUoMCkKKywgbV9sb2NrZWQoMCkKKywgbV9vcHRp
bWl6ZWRCdWZmZXIoMCkKK3sKK30KKworU2hhcmVkQnVmZmVyOjpTaGFyZWRCdWZmZXIoY29uc3Qg
Y2hhciogZGF0YSwgaW50IHNpemUpCisgICAgOiBtX3NpemUoMCkKKyAgICAsIG1fbG9ja2VkKDAp
CisgICAgLCBtX29wdGltaXplZEJ1ZmZlcigwKQoreworICAgIGFwcGVuZChkYXRhLCBzaXplKTsK
K30KKworU2hhcmVkQnVmZmVyOjpTaGFyZWRCdWZmZXIoY29uc3QgdW5zaWduZWQgY2hhciogZGF0
YSwgaW50IHNpemUpCisgICAgOiBtX3NpemUoMCkKKyAgICAsIG1fbG9ja2VkKDApCisgICAgLCBt
X29wdGltaXplZEJ1ZmZlcigwKQoreworICAgIGFwcGVuZChyZWludGVycHJldF9jYXN0PGNvbnN0
IGNoYXIqPihkYXRhKSwgc2l6ZSk7Cit9CisKK1NoYXJlZEJ1ZmZlcjo6flNoYXJlZEJ1ZmZlcigp
Cit7CisgICAgT3B0aW1pemVkQnVmZmVyOjpkZWxldGVJbnN0YW5jZShtX29wdGltaXplZEJ1ZmZl
cik7Cit9CisKK3Vuc2lnbmVkIFNoYXJlZEJ1ZmZlcjo6c2l6ZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIG1fc2l6ZTsKK30KKwordW5zaWduZWQgU2hhcmVkQnVmZmVyOjpnZXRTZWdtZW50KGNvbnN0
IGNoYXIqKiBkYXRhLCB1bnNpZ25lZCBwb3MpIGNvbnN0Cit7CisgICAgaWYgKHBvcyA+PSBtX3Np
emUpIHsKKyAgICAgICAgKmRhdGEgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAg
ICB1bnNpZ25lZCBjb25zZWN1dGl2ZVNpemUgPSBtX2J1ZmZlci5zaXplKCk7CisgICAgaWYgKHBv
cyA+PSBjb25zZWN1dGl2ZVNpemUpIHsKKyAgICAgICAgQVNTRVJUKG1fb3B0aW1pemVkQnVmZmVy
KTsKKyAgICAgICAgcmV0dXJuIG1fb3B0aW1pemVkQnVmZmVyLT5nZXREYXRhKGRhdGEsIHBvcyAt
IGNvbnNlY3V0aXZlU2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmRhdGEgPSBtX2J1ZmZl
ci5kYXRhKCkgKyBwb3M7CisgICAgICAgIHJldHVybiBjb25zZWN1dGl2ZVNpemUgLSBwb3M7Cisg
ICAgfQorfQorCit2b2lkIFNoYXJlZEJ1ZmZlcjo6cmVsZWFzZVNlZ21lbnQoY29uc3QgY2hhciog
ZGF0YSkgY29uc3QKK3sKKyAgICAvLyBJbiBvdXIgVmVjdG9yIGJ1ZmZlcgorICAgIGlmICghbV9i
dWZmZXIuaXNFbXB0eSgpICYmICh1bnNpZ25lZClkYXRhID4gKHVuc2lnbmVkKW1fYnVmZmVyLmRh
dGEoKSAmJiAodW5zaWduZWQpZGF0YSA8PSAodW5zaWduZWQpbV9idWZmZXIuZGF0YSgpICsgbV9i
dWZmZXIuc2l6ZSgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpZiAobV9vcHRpbWl6ZWRCdWZm
ZXIpCisgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyLT5yZWxlYXNlRGF0YShkYXRhKTsKK30KKwor
dm9pZCBTaGFyZWRCdWZmZXI6OmFwcGVuZChjb25zdCBjaGFyKiBkYXRhLCBpbnQgbGVuKQorewor
ICAgIGlmIChtX2xvY2tlZCB8fCBsZW4gPD0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgaWYg
KCFtX29wdGltaXplZEJ1ZmZlciAmJiBPcHRpbWl6ZWRCdWZmZXI6OmlzQ3JlYXRvckluc3RhbGxl
ZCgpKQorICAgICAgICBtX29wdGltaXplZEJ1ZmZlciA9IE9wdGltaXplZEJ1ZmZlcjo6Y3JlYXRl
SW5zdGFuY2UobGVuICsgbV9zaXplLCAwKTsKKworICAgIGlmIChtX29wdGltaXplZEJ1ZmZlcikK
KyAgICAgICAgbV9vcHRpbWl6ZWRCdWZmZXItPmFwcGVuZChkYXRhLCBsZW4pOworICAgIGVsc2UK
KyAgICAgICAgbV9idWZmZXIuYXBwZW5kKGRhdGEsIGxlbik7CisKKyAgICBtX3NpemUgKz0gbGVu
OworfQorCit2b2lkIFNoYXJlZEJ1ZmZlcjo6Y2xlYXIoKQoreworICAgIGlmIChtX2xvY2tlZCkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKG1fb3B0aW1pemVkQnVmZmVyKQorICAgICAgICBt
X29wdGltaXplZEJ1ZmZlci0+Y2xlYXIoKTsKKyAgICBtX2J1ZmZlci5jbGVhcigpOworICAgIG1f
c2l6ZSA9IDA7Cit9CisKK1Bhc3NSZWZQdHI8U2hhcmVkQnVmZmVyPiBTaGFyZWRCdWZmZXI6OmNv
cHkoKSBjb25zdAoreworICAgIFNoYXJlZEJ1ZmZlciogcnRuID0gbmV3IFNoYXJlZEJ1ZmZlcigp
OworCisgICAgcnRuLT5tX3NpemUgPSBtX3NpemU7CisgICAgcnRuLT5tX2J1ZmZlci5hcHBlbmQo
bV9idWZmZXIuZGF0YSgpLCBtX2J1ZmZlci5zaXplKCkpOworICAgIGlmIChtX3NpemUgPiBtX2J1
ZmZlci5zaXplKCkpIHsKKyAgICAgICAgQVNTRVJUKG1fb3B0aW1pemVkQnVmZmVyKTsKKyAgICAg
ICAgcnRuLT5tX29wdGltaXplZEJ1ZmZlciA9IG1fb3B0aW1pemVkQnVmZmVyLT5jbG9uZSgpOwor
ICAgICAgICBpZiAoIXJ0bi0+bV9vcHRpbWl6ZWRCdWZmZXIpIHsKKyAgICAgICAgICAgIHNpemVf
dCBidWZTaXplID0gcnRuLT5tX2J1ZmZlci5zaXplKCk7CisgICAgICAgICAgICBydG4tPm1fYnVm
ZmVyLnJlc2l6ZShidWZTaXplICsgbV9vcHRpbWl6ZWRCdWZmZXItPnNpemUoKSk7CisgICAgICAg
ICAgICBtX29wdGltaXplZEJ1ZmZlci0+ZXh0cmFjdERhdGEocnRuLT5tX2J1ZmZlci5kYXRhKCkg
KyBidWZTaXplKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnRuOworfQorCitjbGFz
cyBGaWxlRGVzY3JpcHRvckhvbGRlciB7CitwdWJsaWM6CisgICAgRmlsZURlc2NyaXB0b3JIb2xk
ZXIoRklMRSogZmQpIDogbV9mZChmZCkge30KKyAgICB+RmlsZURlc2NyaXB0b3JIb2xkZXIoKSB7
IGZjbG9zZShtX2ZkKTsgfQorcHJpdmF0ZToKKyAgICBGSUxFKiBtX2ZkOworfTsKKworUGFzc1Jl
ZlB0cjxTaGFyZWRCdWZmZXI+IFNoYXJlZEJ1ZmZlcjo6Y3JlYXRlV2l0aENvbnRlbnRzT2ZGaWxl
KGNvbnN0IFN0cmluZyYgZmlsZVBhdGgpCit7CisgICAgU3RyaW5nIG51bGxpZmllZFBhdGggPSBm
aWxlUGF0aDsKKyAgICBGSUxFKiBmaWxlRGVzY3JpcHRvciA9IF93Zm9wZW4obnVsbGlmaWVkUGF0
aC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBURVhUKCJyK2IiKSk7CisgICAgaWYg
KCFmaWxlRGVzY3JpcHRvcikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBGaWxlRGVzY3JpcHRv
ckhvbGRlciBob2xkRmQoZmlsZURlc2NyaXB0b3IpOworCisgICAgaWYgKCFmc2VlayhmaWxlRGVz
Y3JpcHRvciwgLTEsIFNFRUtfRU5EKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBEV09SRCBm
aWxlU2l6ZSA9IGZ0ZWxsKGZpbGVEZXNjcmlwdG9yKTsKKyAgICBpZiAoMHhGRkZGRkZGRiA9PSBm
aWxlU2l6ZSsrKQorICAgICAgICByZXR1cm4gMDsKKworICAgIFJlZlB0cjxTaGFyZWRCdWZmZXI+
IHJlc3VsdDsKKyAgICB7CisgICAgICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7
CisgICAgICAgIHJlc3VsdCA9IG5ldyBTaGFyZWRCdWZmZXIoKTsKKyAgICAgICAgaWYgKCFyZXN1
bHQpCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICArK2ZpbGVTaXplOworCisg
ICAgaWYgKGZpbGVTaXplKSB7CisgICAgICAgIGZzZWVrKGZpbGVEZXNjcmlwdG9yLCAwLCBTRUVL
X1NFVCk7CisKKyAgICAgICAgaWYgKCFyZXN1bHQtPm1fb3B0aW1pemVkQnVmZmVyICYmIE9wdGlt
aXplZEJ1ZmZlcjo6aXNDcmVhdG9ySW5zdGFsbGVkKCkpCisgICAgICAgICAgICByZXN1bHQtPm1f
b3B0aW1pemVkQnVmZmVyID0gT3B0aW1pemVkQnVmZmVyOjpjcmVhdGVJbnN0YW5jZShmaWxlU2l6
ZSwgMCk7CisKKyAgICAgICAgaWYgKHJlc3VsdC0+bV9vcHRpbWl6ZWRCdWZmZXIpIHsKKyAgICAg
ICAgICAgIE1lbW9yeUFsbG9jYXRpb25DYW5GYWlsIGNhbkZhaWw7CisgICAgICAgICAgICBkbyB7
CisgICAgICAgICAgICAgICAgY2hhciogZGF0YTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB0
b1JlYWQgPSByZXN1bHQtPm1fb3B0aW1pemVkQnVmZmVyLT5hbGxvY2F0ZURhdGFUb1dyaXRlKCZk
YXRhLCBmaWxlU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKCF0b1JlYWQpCisgICAgICAgICAg
ICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGFjdHVhbFJlYWQg
PSBmcmVhZChkYXRhLCAxLCB0b1JlYWQsIGZpbGVEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAg
ICByZXN1bHQtPm1fb3B0aW1pemVkQnVmZmVyLT5yZWxlYXNlRGF0YShkYXRhKTsKKyAgICAgICAg
ICAgICAgICBpZiAoYWN0dWFsUmVhZCAhPSB0b1JlYWQpCisgICAgICAgICAgICAgICAgICAgIHJl
dHVybiAwOworICAgICAgICAgICAgICAgIGZpbGVTaXplIC09IHRvUmVhZDsKKyAgICAgICAgICAg
ICAgICByZXN1bHQtPm1fc2l6ZSArPSB0b1JlYWQ7CisgICAgICAgICAgICB9IHdoaWxlIChmaWxl
U2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZW1vcnlBbGxvY2F0aW9uQ2Fu
RmFpbCBjYW5GYWlsOworICAgICAgICAgICAgcmVzdWx0LT5tX2J1ZmZlci5yZXNpemUoZmlsZVNp
emUpOworICAgICAgICAgICAgaWYgKHJlc3VsdC0+bV9idWZmZXIuc2l6ZSgpICE9IGZpbGVTaXpl
KQorICAgICAgICAgICAgICAgIHJldHVybiAwOworCisgICAgICAgICAgICBpZiAoZnJlYWQocmVz
dWx0LT5tX2J1ZmZlci5kYXRhKCksIDEsIGZpbGVTaXplLCBmaWxlRGVzY3JpcHRvcikgIT0gZmls
ZVNpemUpCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKKyAg
ICByZXR1cm4gcmVzdWx0LnJlbGVhc2UoKTsKK30KKworY29uc3QgVmVjdG9yPGNoYXI+JiBTaGFy
ZWRCdWZmZXI6OmJ1ZmZlcigpCit7CisgICAgaWYgKG1fb3B0aW1pemVkQnVmZmVyICYmICFtX29w
dGltaXplZEJ1ZmZlci0+aXNFbXB0eSgpKSB7CisgICAgICAgIHNpemVfdCBidWZTaXplID0gbV9i
dWZmZXIuc2l6ZSgpOworICAgICAgICBtX2J1ZmZlci5yZXNpemUoYnVmU2l6ZSArIG1fb3B0aW1p
emVkQnVmZmVyLT5zaXplKCkpOworICAgICAgICBtX29wdGltaXplZEJ1ZmZlci0+ZXh0cmFjdERh
dGEobV9idWZmZXIuZGF0YSgpICsgYnVmU2l6ZSk7CisgICAgICAgIG1fb3B0aW1pemVkQnVmZmVy
LT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gbV9idWZmZXI7Cit9CisKK2NvbnN0IGNoYXIq
IFNoYXJlZEJ1ZmZlcjo6ZGF0YSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8U2hh
cmVkQnVmZmVyKj4odGhpcyktPmJ1ZmZlcigpLmRhdGEoKTsKK30KKworCitQYXNzUmVmUHRyPFNo
YXJlZEJ1ZmZlcj4gU2hhcmVkQnVmZmVyOjphZG9wdFZlY3RvcihWZWN0b3I8Y2hhcj4mIHZlY3Rv
cikKK3sKKyAgICBSZWZQdHI8U2hhcmVkQnVmZmVyPiBidWZmZXIgPSBjcmVhdGUoKTsKKyAgICBi
dWZmZXItPm1fYnVmZmVyLnN3YXAodmVjdG9yKTsKKyAgICBidWZmZXItPm1fc2l6ZSA9IGJ1ZmZl
ci0+bV9idWZmZXIuc2l6ZSgpOworICAgIHJldHVybiBidWZmZXI7Cit9CisKK2Jvb2wgU2hhcmVk
QnVmZmVyOjptYWtlUHVyZ2VhYmxlKCkKK3sKKyAgICBpZiAobV9vcHRpbWl6ZWRCdWZmZXIgJiYg
bV9vcHRpbWl6ZWRCdWZmZXItPmlzUHVyZ2VhYmxlKCkpIHsKKyAgICAgICAgaWYgKCFtX2J1ZmZl
ci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyLT5wcmVwZW5kKG1f
YnVmZmVyLmRhdGEoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1fYnVmZmVyLmNs
ZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYg
KE9wdGltaXplZEJ1ZmZlcjo6aXNDcmVhdG9ySW5zdGFsbGVkKCkpIHsKKyAgICAgICAgaWYgKE9w
dGltaXplZEJ1ZmZlciogb3B0aW1pemVkQnVmZmVyID0gT3B0aW1pemVkQnVmZmVyOjpjcmVhdGVJ
bnN0YW5jZShtX3NpemUsIG1fb3B0aW1pemVkQnVmZmVyLCB0cnVlKSkgeworICAgICAgICAgICAg
bV9vcHRpbWl6ZWRCdWZmZXIgPSBvcHRpbWl6ZWRCdWZmZXI7CisgICAgICAgICAgICBpZiAoIW1f
YnVmZmVyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1fb3B0aW1pemVkQnVmZmVyLT5w
cmVwZW5kKG1fYnVmZmVyLmRhdGEoKSwgbV9idWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAg
ICBtX2J1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9CisKKyNlbmRp
ZiAvLyBQTEFURk9STShUT1JDSE1PQklMRSkgJiYgUExBVEZPUk0oV0lOQ0UpCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34379</attachid>
            <date>2009-08-08 11:12:06 -0700</date>
            <delta_ts>2009-08-12 12:35:28 -0700</delta_ts>
            <desc>5) ContextMenu</desc>
            <filename>27543_5.patch</filename>
            <type>text/plain</type>
            <size>13824</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMzI0NmM0ZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wOC0wOCAgSm9lIE1hc29uICA8
am9lLm1hc29uQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBBZGQgZmlsZXMgZm9yIENvbnRleHRNZW51
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzU0Mwor
CisgICAgICAgICogcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVJdGVtV2luY2UuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9Db250ZXh0TWVudVdpbmNlLmNwcDogQWRkZWQu
CisKIDIwMDktMDgtMDYgIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KIAogICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxh
dGZvcm0vd2luY2UvQ29udGV4dE1lbnVJdGVtV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9Db250ZXh0TWVudUl0ZW1XaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg
MDAwMDAwMC4uNDgyZmJmZQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvQ29udGV4dE1lbnVJdGVtV2luY2UuY3BwCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRleHRNZW51SXRlbS5oIgorCisjaW5jbHVk
ZSAiQ29udGV4dE1lbnUuaCIKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSA8d2luZG93
cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1BsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlv
blR5cGU6On5QbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlKCkKK3sKKyAgICBkZWxldGUg
c3ViTWVudTsKK30KKworQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oUGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uIGl0ZW0pCisgICAgOiBtX3BsYXRmb3JtRGVzY3JpcHRpb24oaXRl
bSkKK3sKK30KKworQ29udGV4dE1lbnVJdGVtOjpDb250ZXh0TWVudUl0ZW0oQ29udGV4dE1lbnUq
IHN1Yk1lbnUpCit7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gbmV3IFBsYXRmb3JtTWVu
dUl0ZW1EZXNjcmlwdGlvblR5cGU7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiAmJiBz
dWJNZW51KQorICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1lbnUgPSBzdWJNZW51
LT5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpOworfQorCitDb250ZXh0TWVudUl0ZW06OkNv
bnRleHRNZW51SXRlbShDb250ZXh0TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9u
IGFjdGlvbiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgQ29udGV4dE1lbnUqIHN1Yk1lbnUpCit7Cisg
ICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gbmV3IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlv
blR5cGU7CisgICAgaWYgKCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAgICAgIHJldHVybjsK
KworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dHlwZSA9IHR5cGU7CisgICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uLT5hY3Rpb24gPSBhY3Rpb247CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9u
LT50aXRsZSA9IHRpdGxlOworICAgIGlmIChzdWJNZW51KQorICAgICAgICBtX3BsYXRmb3JtRGVz
Y3JpcHRpb24tPnN1Yk1lbnUgPSBzdWJNZW51LT5yZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigp
OworfQorCitDb250ZXh0TWVudUl0ZW06On5Db250ZXh0TWVudUl0ZW0oKQoreworICAgIGRlbGV0
ZSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Cit9CisKK1BsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlv
biBDb250ZXh0TWVudUl0ZW06OnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKK3sKKyAgICBQ
bGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gZGVzYyA9IG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsK
KyAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24gPSAwOworICAgIHJldHVybiBkZXNjOworfQorCitD
b250ZXh0TWVudUl0ZW1UeXBlIENvbnRleHRNZW51SXRlbTo6dHlwZSgpIGNvbnN0Cit7CisgICAg
aWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+dHlwZTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBBY3Rpb25UeXBlOworfQor
CitDb250ZXh0TWVudUFjdGlvbiBDb250ZXh0TWVudUl0ZW06OmFjdGlvbigpIGNvbnN0Cit7Cisg
ICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuIG1fcGxhdGZvcm1E
ZXNjcmlwdGlvbi0+YWN0aW9uOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIENvbnRleHRNZW51
SXRlbVRhZ05vQWN0aW9uOworfQorCitTdHJpbmcgQ29udGV4dE1lbnVJdGVtOjp0aXRsZSgpIGNv
bnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+dGl0bGU7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gU3Ry
aW5nKCk7Cit9CisKK1BsYXRmb3JtTWVudURlc2NyaXB0aW9uIENvbnRleHRNZW51SXRlbTo6cGxh
dGZvcm1TdWJNZW51KCkgY29uc3QKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQor
ICAgICAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdWJNZW51OworICAgIGVsc2UK
KyAgICAgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRUeXBlKENv
bnRleHRNZW51SXRlbVR5cGUgdHlwZSkKK3sKKyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9u
KQorICAgICAgICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnR5cGUgPSB0eXBlOworfQorCit2b2lk
IENvbnRleHRNZW51SXRlbTo6c2V0QWN0aW9uKENvbnRleHRNZW51QWN0aW9uIGFjdGlvbikKK3sK
KyAgICBpZiAobV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPmFjdGlvbiA9IGFjdGlvbjsKK30KKwordm9pZCBDb250ZXh0TWVudUl0ZW06OnNldFRp
dGxlKGNvbnN0IFN0cmluZyYgdGl0bGUpCit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlv
bikKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT50aXRsZSA9IHRpdGxlOworfQorCit2
b2lkIENvbnRleHRNZW51SXRlbTo6c2V0U3ViTWVudShDb250ZXh0TWVudSogc3ViTWVudSkKK3sK
KyAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuOworCisgICAg
aWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+c3ViTWVudSAhPSBzdWJNZW51LT5wbGF0Zm9ybURl
c2NyaXB0aW9uKCkpCisgICAgICAgIGRlbGV0ZSBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1l
bnU7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdWJNZW51ID0gc3ViTWVudS0+cmVsZWFz
ZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKK30KKwordm9pZCBDb250ZXh0TWVudUl0ZW06OnNldENo
ZWNrZWQoYm9vbCBjaGVja2VkKQoreworICAgIGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQor
ICAgICAgICByZXR1cm47CisgICAgaWYgKGNoZWNrZWQpCisgICAgICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+c3RhdGUgfD0gUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZTo6Q2hlY2tl
ZFN0YXRlOworICAgIGVsc2UKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdGF0ZSAm
PSB+UGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZTo6Q2hlY2tlZFN0YXRlOworfQorCit2
b2lkIENvbnRleHRNZW51SXRlbTo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgaWYg
KCFtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoZW5hYmxl
ZCkKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdGF0ZSB8PSBQbGF0Zm9ybU1lbnVJ
dGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGU7CisgICAgZWxzZQorICAgICAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPnN0YXRlICY9IH5QbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25U
eXBlOjpFbmFibGVkU3RhdGU7Cit9CisKK2Jvb2wgQ29udGV4dE1lbnVJdGVtOjplbmFibGVkKCkg
Y29uc3QKK3sKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uICYmIChtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPnN0YXRlICYgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZTo6RW5h
YmxlZFN0YXRlKSA9PSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3Rh
dGU7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1l
bnVXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NvbnRleHRNZW51V2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZDhlNGEKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NvbnRleHRNZW51V2luY2UuY3BwCkBAIC0w
LDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4g
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBN
b2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNvbnRl
eHRNZW51LmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIK
KyNpbmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkZyYW1lVmlldy5oIgorI2luY2x1ZGUgIk5v
ZGUuaCIKKyNpbmNsdWRlIDx0Y2hhci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKyNpbmNs
dWRlIDx3aW5kb3dzLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGxhdGZvcm1NZW51RGVz
Y3JpcHRpb25UeXBlOjpQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvblR5cGUoKQorICAgIDogaE1lbnUo
OjpDcmVhdGVQb3B1cE1lbnUoKSkKKyAgICAsIGl0ZW1Db3VudCgwKQoreworfQorCitQbGF0Zm9y
bU1lbnVEZXNjcmlwdGlvblR5cGU6On5QbGF0Zm9ybU1lbnVEZXNjcmlwdGlvblR5cGUoKQorewor
ICAgIGlmIChoTWVudSkKKyAgICAgICAgOjpEZXN0cm95TWVudShoTWVudSk7Cit9CisKK0NvbnRl
eHRNZW51OjpDb250ZXh0TWVudShjb25zdCBIaXRUZXN0UmVzdWx0JiByZXN1bHQpCisgICAgOiBt
X2hpdFRlc3RSZXN1bHQocmVzdWx0KQorICAgICwgbV9wbGF0Zm9ybURlc2NyaXB0aW9uKDApCit7
CisgICAgc2V0UGxhdGZvcm1EZXNjcmlwdGlvbihuZXcgUGxhdGZvcm1NZW51RGVzY3JpcHRpb25U
eXBlKTsKK30KKworQ29udGV4dE1lbnU6OkNvbnRleHRNZW51KGNvbnN0IEhpdFRlc3RSZXN1bHQm
IHJlc3VsdCwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gbWVudSkKKyAgICA6IG1faGl0
VGVzdFJlc3VsdChyZXN1bHQpCisgICAgLCBtX3BsYXRmb3JtRGVzY3JpcHRpb24oMCkKK3sKKyAg
ICBzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKG1lbnUpOworfQorCitDb250ZXh0TWVudTo6fkNvbnRl
eHRNZW51KCkKK3sKKyAgICBkZWxldGUgbV9wbGF0Zm9ybURlc2NyaXB0aW9uOworfQorCit1bnNp
Z25lZCBDb250ZXh0TWVudTo6aXRlbUNvdW50KCkgY29uc3QKK3sKKyAgICBpZiAobV9wbGF0Zm9y
bURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5pdGVt
Q291bnQ7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gMDsKK30KKwordm9pZCBDb250ZXh0TWVu
dTo6aW5zZXJ0SXRlbSh1bnNpZ25lZCBpbnQgcG9zaXRpb24sIENvbnRleHRNZW51SXRlbSYgaXRl
bSkKK3sKKyAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJuOwor
CisgICAgY2hlY2tPckVuYWJsZUlmTmVlZGVkKGl0ZW0pOworCisgICAgUGxhdGZvcm1NZW51SXRl
bURlc2NyaXB0aW9uIGRlc2MgPSBpdGVtLnJlbGVhc2VQbGF0Zm9ybURlc2NyaXB0aW9uKCk7Cisg
ICAgVUlOVCBmbGFncyA9IE1GX0JZUE9TSVRJT047CisgICAgVUlOVCBuZXdJdGVtID0gMDsKKyAg
ICBMUENUU1RSIHRpdGxlID0gMDsKKyAgICBEV09SRCBzdWJNZW51U2l6ZSA9IDA7CisKKyAgICBp
ZiAoZGVzYy0+dHlwZSA9PSBTZXBhcmF0b3JUeXBlKQorICAgICAgICBmbGFncyB8PSBNRl9TRVBB
UkFUT1I7CisgICAgZWxzZSB7CisgICAgICAgIGZsYWdzIHw9IE1GX1NUUklORzsKKyAgICAgICAg
dGl0bGUgPSB3Y3NkdXAoZGVzYy0+dGl0bGUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24o
KSk7CisKKyAgICAgICAgaWYgKGRlc2MtPnN1Yk1lbnUpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9
IE1GX1BPUFVQOworICAgICAgICAgICAgbmV3SXRlbSA9IChVSU5UKSBkZXNjLT5zdWJNZW51LT5o
TWVudTsKKyAgICAgICAgICAgIHN1Yk1lbnVTaXplID0gZGVzYy0+c3ViTWVudS0+aXRlbUNvdW50
OworCisgICAgICAgICAgICAvLyBub3cgd2Ugb3duIHRoZSBzdWJtZW51IHNvIG1ha2Ugc3VyZSBp
dCBkb2Vzbid0IGdldCBkZWxldGVkIHdpdGggZGVzYworICAgICAgICAgICAgZGVzYy0+c3ViTWVu
dS0+aE1lbnUgPSAwOworICAgICAgICAgICAgZGVsZXRlIGRlc2MtPnN1Yk1lbnU7CisgICAgICAg
ICAgICBkZXNjLT5zdWJNZW51ID0gMDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBuZXdJ
dGVtID0gZGVzYy0+YWN0aW9uOworCisgICAgICAgIGlmICgoZGVzYy0+c3RhdGUgJiBQbGF0Zm9y
bU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpDaGVja2VkU3RhdGUpID09IFBsYXRmb3JtTWVudUl0
ZW1EZXNjcmlwdGlvblR5cGU6OkNoZWNrZWRTdGF0ZSkKKyAgICAgICAgICAgIGZsYWdzIHw9IE1G
X0NIRUNLRUQ7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGZsYWdzIHw9IE1GX1VOQ0hFQ0tF
RDsKKworICAgICAgICBpZiAoKGRlc2MtPnN0YXRlICYgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0
aW9uVHlwZTo6RW5hYmxlZFN0YXRlKSA9PSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBl
OjpFbmFibGVkU3RhdGUpCisgICAgICAgICAgICBmbGFncyB8PSBNRl9FTkFCTEVEOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBmbGFncyB8PSBNRl9HUkFZRUQ7CisgICAgfQorCisgICAgaWYg
KDo6SW5zZXJ0TWVudShtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmhNZW51LCBwb3NpdGlvbiwgZmxh
Z3MsIG5ld0l0ZW0sIHRpdGxlKSkgeworICAgICAgICBpZiAoc3ViTWVudVNpemUpIHsKKyAgICAg
ICAgICAgIC8vIHN0b3JlIHRoZSBzdWJtZW51J3Mgc2l6ZSBhbG9uZyB3aXRoIGl0LCBzaW5jZSBX
aW5DRSBoYXMgbm8gZnVuY3Rpb24gY2FsbCB0byBmaW5kIHRoaXMKKyAgICAgICAgICAgIE1FTlVJ
VEVNSU5GTyBpbmZvOworICAgICAgICAgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykp
OworICAgICAgICAgICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CisgICAgICAgICAgICBp
bmZvLmZNYXNrID0gTUlJTV9EQVRBOworICAgICAgICAgICAgaW5mby5kd0l0ZW1EYXRhID0gc3Vi
TWVudVNpemU7CisKKyAgICAgICAgICAgIDo6U2V0TWVudUl0ZW1JbmZvKG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+aE1lbnUsIHBvc2l0aW9uLCBUUlVFLCAmaW5mbyk7CisgICAgICAgIH0KKyAgICAg
ICAgKyttX3BsYXRmb3JtRGVzY3JpcHRpb24tPml0ZW1Db3VudDsKKyAgICB9CisKKyAgICAvLyB0
aGUgaXRlbSBpcyBub3cgb3duZWQgYnkgdGhlIG1lbnUgc3RydWN0dXJlLCBzbyBkZWxldGUgb3Vy
IHJlZmVyZW5jZSB0byBpdAorICAgIGRlbGV0ZSBkZXNjOworfQorCit2b2lkIENvbnRleHRNZW51
OjphcHBlbmRJdGVtKENvbnRleHRNZW51SXRlbSYgaXRlbSkKK3sKKyAgICBpbnNlcnRJdGVtKGl0
ZW1Db3VudCgpLCBpdGVtKTsKK30KKworc3RhdGljIENvbnRleHRNZW51SXRlbSogY29udGV4dE1l
bnVJdGVtQnlJZE9yUG9zaXRpb24oUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gbWVudSwgdW5zaWdu
ZWQgaWQsIEJPT0wgYnlQb3NpdGlvbikKK3sKKyAgICBpZiAoIW1lbnUpCisgICAgICAgIHJldHVy
biAwOworCisgICAgTUVOVUlURU1JTkZPIGluZm87CisgICAgbWVtc2V0KCZpbmZvLCAwLCBzaXpl
b2YoaW5mbykpOworICAgIGluZm8uY2JTaXplID0gc2l6ZW9mKGluZm8pOworICAgIGluZm8uZk1h
c2sgPSBNSUlNX1RZUEUgfCBNSUlNX0lEIHwgTUlJTV9TVUJNRU5VIHwgTUlJTV9TVEFURSB8IE1J
SU1fREFUQTsKKworICAgIGlmICghOjpHZXRNZW51SXRlbUluZm8obWVudS0+aE1lbnUsIGlkLCBi
eVBvc2l0aW9uLCAmaW5mbykpCisgICAgICAgIHJldHVybiAwOworCisgICAgLy8gaWYgaXQgaGFz
IGEgc3RyaW5nLCByZWFkIGl0CisgICAgU3RyaW5nIHRpdGxlOworICAgIGlmICgoaW5mby5mVHlw
ZSAmIE1GVF9TVFJJTkcpID09IE1GVF9TVFJJTkcpIHsKKyAgICAgICAgLy8gaW5mby5jY2ggY29u
dGFpbnMgdGhlIG51bWJlciBvZiBjaGFycyBpbiB0aGUgc3RyaW5nLiAgQWxsb2NhdGUgc3BhY2Ug
Zm9yIHRoaXMgKHBsdXMgbnVsbCB0ZXJtaW5hdG9yKSBhbmQgcXVlcnkgYWdhaW4uCisgICAgICAg
ICsraW5mby5jY2g7CisgICAgICAgIExQVFNUUiBidWZmZXIgPSAoTFBUU1RSKW1hbGxvYyhpbmZv
LmNjaCAqIHNpemVvZihUQ0hBUikpOworICAgICAgICBpZiAoIWJ1ZmZlcikKKyAgICAgICAgICAg
IHJldHVybiAwOworICAgICAgICBpbmZvLmR3VHlwZURhdGEgPSBidWZmZXI7CisKKyAgICAgICAg
aWYgKCE6OkdldE1lbnVJdGVtSW5mbyhtZW51LT5oTWVudSwgaWQsIGJ5UG9zaXRpb24sICZpbmZv
KSkgeworICAgICAgICAgICAgZnJlZShidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIDA7Cisg
ICAgICAgIH0KKworICAgICAgICAvLyBpbmZvLmNjaCBoYXMgYmVlbiB1cGRhdGVkIHdpdGggbnVt
YmVyIG9mIGNoYXJzIGNvcGllZCBpbnRvIGJ1ZmZlcgorICAgICAgICB0aXRsZSA9IFN0cmluZyhp
bmZvLmR3VHlwZURhdGEsIGluZm8uY2NoKTsKKyAgICAgICAgZnJlZShidWZmZXIpOworICAgIH0K
KworICAgIC8vIGNyZWF0ZSB0aGUgdmFsdWUgdG8gcmV0dXJuCisgICAgUGxhdGZvcm1NZW51SXRl
bURlc2NyaXB0aW9uIGl0ZW0gPSBuZXcgUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZTsK
KworICAgIGlmICgoaW5mby5mVHlwZSAmIE1GVF9TRVBBUkFUT1IpID09IE1GVF9TRVBBUkFUT1Ip
CisgICAgICAgIGl0ZW0tPnR5cGUgPSBTZXBhcmF0b3JUeXBlOworICAgIGVsc2UgeworICAgICAg
ICBpdGVtLT50aXRsZSA9IHRpdGxlOworICAgICAgICBpdGVtLT5zdGF0ZSA9IDA7CisgICAgICAg
IGlmICgoaW5mby5mU3RhdGUgJiBNRlNfQ0hFQ0tFRCkgPT0gTUZTX0NIRUNLRUQpCisgICAgICAg
ICAgICBpdGVtLT5zdGF0ZSB8PSBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpDaGVj
a2VkU3RhdGU7CisgICAgICAgIGlmICgoaW5mby5mU3RhdGUgJiBNRlNfRU5BQkxFRCkgPT0gTUZT
X0VOQUJMRUQpCisgICAgICAgICAgICBpdGVtLT5zdGF0ZSB8PSBQbGF0Zm9ybU1lbnVJdGVtRGVz
Y3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGU7CisKKyAgICAgICAgaWYgKCFpbmZvLmhTdWJNZW51
KSB7CisgICAgICAgICAgICBpdGVtLT50eXBlID0gQWN0aW9uVHlwZTsKKyAgICAgICAgICAgIGl0
ZW0tPmFjdGlvbiA9IChDb250ZXh0TWVudUFjdGlvbikgaW5mby53SUQ7CisgICAgICAgIH0gZWxz
ZSB7CisgICAgICAgICAgICBpdGVtLT50eXBlID0gU3VibWVudVR5cGU7CisgICAgICAgICAgICBp
dGVtLT5zdWJNZW51ID0gbmV3IFBsYXRmb3JtTWVudURlc2NyaXB0aW9uVHlwZTsKKworICAgICAg
ICAgICAgLy8gdGhlIG1lbnUgc2l6ZSBpcyBzdG9yZWQgYXMgdGhlIGl0ZW0ncyBjdXN0b20gZGF0
YQorICAgICAgICAgICAgLy8gQlVHOiB3aG8gb3ducyB0aGUgSE1FTlUgbm93PworICAgICAgICAg
ICAgaXRlbS0+c3ViTWVudS0+aE1lbnUgPSBpbmZvLmhTdWJNZW51OworICAgICAgICAgICAgaXRl
bS0+c3ViTWVudS0+aXRlbUNvdW50ID0gaW5mby5kd0l0ZW1EYXRhOworICAgICAgICB9CisgICAg
fQorCisgICAgcmV0dXJuIG5ldyBDb250ZXh0TWVudUl0ZW0oaXRlbSk7Cit9CisKK0NvbnRleHRN
ZW51SXRlbSogQ29udGV4dE1lbnU6Oml0ZW1XaXRoQWN0aW9uKHVuc2lnbmVkIGFjdGlvbikKK3sK
KyAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRpb24obV9wbGF0Zm9ybURlc2Ny
aXB0aW9uLCBhY3Rpb24sIEZBTFNFKTsKK30KKworQ29udGV4dE1lbnVJdGVtKiBDb250ZXh0TWVu
dTo6aXRlbUF0SW5kZXgodW5zaWduZWQgaW5kZXgsIGNvbnN0IFBsYXRmb3JtTWVudURlc2NyaXB0
aW9uIHBsYXRmb3JtRGVzY3JpcHRpb24pCit7CisgICAgcmV0dXJuIGNvbnRleHRNZW51SXRlbUJ5
SWRPclBvc2l0aW9uKHBsYXRmb3JtRGVzY3JpcHRpb24sIGluZGV4LCBUUlVFKTsKK30KKwordm9p
ZCBDb250ZXh0TWVudTo6c2V0UGxhdGZvcm1EZXNjcmlwdGlvbihQbGF0Zm9ybU1lbnVEZXNjcmlw
dGlvbiBkZXNjKQoreworICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24gIT0gZGVzYykKKyAg
ICAgICAgZGVsZXRlIG1fcGxhdGZvcm1EZXNjcmlwdGlvbjsKKyAgICBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24gPSBkZXNjOworfQorCitQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBDb250ZXh0TWVudTo6
cGxhdGZvcm1EZXNjcmlwdGlvbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbjsKK30KKworUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gQ29udGV4dE1lbnU6OnJlbGVh
c2VQbGF0Zm9ybURlc2NyaXB0aW9uKCkKK3sKKyAgICBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBk
ZXNjID0gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9
IDA7CisgICAgcmV0dXJuIGRlc2M7Cit9CisKK30K
</data>
<flag name="review"
          id="18556"
          type_id="1"
          status="-"
          setter="staikos"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34380</attachid>
            <date>2009-08-08 11:16:21 -0700</date>
            <delta_ts>2009-08-12 12:30:30 -0700</delta_ts>
            <desc>6) SharedTimer &amp; SystemTime</desc>
            <filename>27543_6.patch</filename>
            <type>text/plain</type>
            <size>6658</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uMmZkMjE1NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IEFkZCBTaGFyZWRUaW1lcldpbmNlLmNwcCBhbmQg
U3lzdGVtVGltZVdpbmNlLmNwcAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9Mjc1NDMKKworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL1NoYXJlZFRpbWVy
V2luY2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TeXN0ZW1UaW1lV2lu
Y2UuY3BwOiBBZGRlZC4KKwogMjAwOS0wOC0wNiAgWW9uZyBMaSAgPHlvbmcubGlAdG9yY2htb2Jp
bGUuY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgpkaWZmIC0tZ2l0
IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TaGFyZWRUaW1lcldpbmNlLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvU2hhcmVkVGltZXJXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uY2EyZjEwNAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvU2hhcmVkVGltZXJXaW5jZS5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMDYgQXBwbGUgQ29tcHV0ZXIsIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOCBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNoYXJlZFRpbWVyLmgiCisKKyNpbmNs
dWRlICJQYWdlLmgiCisjaW5jbHVkZSAiU3lzdGVtVGltZS5oIgorI2luY2x1ZGUgIldpZGdldC5o
IgorI2luY2x1ZGUgPHd0Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL0N1cnJlbnRUaW1l
Lmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgSlNDIHsKK2V4dGVybiB2b2lk
KiBnX3N0YWNrQmFzZTsKK30KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitlbnVtIHsKKyAgICBU
aW1lcklkTm9uZSA9IDAsCisgICAgVGltZXJJZEF1dG8sCisgICAgVGltZXJJZE1hbnVhbCwKK307
CitzdGF0aWMgVUlOVCB0aW1lcklEID0gVGltZXJJZE5vbmU7CisKK3N0YXRpYyB2b2lkICgqc2hh
cmVkVGltZXJGaXJlZEZ1bmN0aW9uKSgpOworCitzdGF0aWMgSFdORCB0aW1lcldpbmRvd0hhbmRs
ZSA9IDA7Citjb25zdCBMUENXU1RSIGtUaW1lcldpbmRvd0NsYXNzTmFtZSA9IEwiVGltZXJXaW5k
b3dDbGFzcyI7CisKK0xSRVNVTFQgQ0FMTEJBQ0sgVGltZXJXaW5kb3dXbmRQcm9jKEhXTkQgaFdu
ZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworICAgIGlu
dCBkdW1teTsKKyAgICBKU0M6Omdfc3RhY2tCYXNlID0gJmR1bW15OworCisgICAgaWYgKG1lc3Nh
Z2UgPT0gV01fVElNRVIpIHsKKyAgICAgICAgaWYgKHRpbWVySUQgIT0gVGltZXJJZE5vbmUpCisg
ICAgICAgICAgICBzaGFyZWRUaW1lckZpcmVkRnVuY3Rpb24oKTsKKyAgICB9IGVsc2UgaWYgKG1l
c3NhZ2UgPT0gV01fVVNFUikgICAgeworICAgICAgICBpZiAodGltZXJJRCA9IFRpbWVySWRNYW51
YWwpIHsKKyAgICAgICAgICAgIHNoYXJlZFRpbWVyRmlyZWRGdW5jdGlvbigpOworICAgICAgICAg
ICAgUG9zdE1lc3NhZ2UoaFduZCwgV01fVVNFUiwgMCwgMCk7CisgICAgICAgIH0KKyAgICB9IGVs
c2UgeworICAgICAgICBKU0M6Omdfc3RhY2tCYXNlID0gMDsKKyAgICAgICAgcmV0dXJuIERlZldp
bmRvd1Byb2MoaFduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOworICAgIH0KKyAgICBKU0M6
Omdfc3RhY2tCYXNlID0gMDsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdGlh
bGl6ZU9mZlNjcmVlblRpbWVyV2luZG93KCkKK3sKKyAgICBpZiAodGltZXJXaW5kb3dIYW5kbGUp
CisgICAgICAgIHJldHVybjsKKworICAgIFdORENMQVNTIHdjZXggPSB7MH07CisgICAgd2NleC5s
cGZuV25kUHJvYyAgICA9IFRpbWVyV2luZG93V25kUHJvYzsKKyAgICB3Y2V4LmhJbnN0YW5jZSAg
ICAgID0gUGFnZTo6aW5zdGFuY2VIYW5kbGUoKTsKKyAgICB3Y2V4Lmxwc3pDbGFzc05hbWUgID0g
a1RpbWVyV2luZG93Q2xhc3NOYW1lOworICAgIFJlZ2lzdGVyQ2xhc3MoJndjZXgpOworCisgICAg
dGltZXJXaW5kb3dIYW5kbGUgPSBDcmVhdGVXaW5kb3coa1RpbWVyV2luZG93Q2xhc3NOYW1lLCAw
LCAwLAorICAgICAgIENXX1VTRURFRkFVTFQsIDAsIENXX1VTRURFRkFVTFQsIDAsIEhXTkRfTUVT
U0FHRSwgMCwgUGFnZTo6aW5zdGFuY2VIYW5kbGUoKSwgMCk7Cit9CisKK3ZvaWQgc2V0U2hhcmVk
VGltZXJGaXJlZEZ1bmN0aW9uKHZvaWQgKCpmKSgpKQoreworICAgIHNoYXJlZFRpbWVyRmlyZWRG
dW5jdGlvbiA9IGY7Cit9CisKKyNkZWZpbmUgVVNFUl9USU1FUl9NQVhJTVVNICAweDdGRkZGRkZG
CisjZGVmaW5lIFVTRVJfVElNRVJfTUlOSU1VTSAgMHgwMDAwMDAwQQorCit2b2lkIHNldFNoYXJl
ZFRpbWVyRmlyZVRpbWUoZG91YmxlIGZpcmVUaW1lKQoreworICAgIEFTU0VSVChzaGFyZWRUaW1l
ckZpcmVkRnVuY3Rpb24pOworCisgICAgZG91YmxlIGludGVydmFsID0gKGZpcmVUaW1lIC0gY3Vy
cmVudFRpbWUoKSkgKiAxMDAwLjsKKyAgICB1bnNpZ25lZCBpbnRlcnZhbEluTVMgPSBpbnRlcnZh
bCA8IFVTRVJfVElNRVJfTUlOSU1VTQorICAgICAgICA/IFVTRVJfVElNRVJfTUlOSU1VTQorICAg
ICAgICA6IGludGVydmFsID4gVVNFUl9USU1FUl9NQVhJTVVNCisgICAgICAgID8gVVNFUl9USU1F
Ul9NQVhJTVVNCisgICAgICAgIDogc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KGludGVydmFsKTsKKwor
ICAgIGlmICh0aW1lcklEID09IFRpbWVySWRBdXRvKSB7CisgICAgICAgIEtpbGxUaW1lcih0aW1l
cldpbmRvd0hhbmRsZSwgVGltZXJJZEF1dG8pOworICAgICAgICB0aW1lcklEID0gVGltZXJJZE5v
bmU7CisgICAgfQorCisgICAgaW5pdGlhbGl6ZU9mZlNjcmVlblRpbWVyV2luZG93KCk7CisgICAg
aWYgKFNldFRpbWVyKHRpbWVyV2luZG93SGFuZGxlLCBUaW1lcklkQXV0bywgaW50ZXJ2YWxJbk1T
LCAwKSkKKyAgICAgICAgdGltZXJJRCA9IFRpbWVySWRBdXRvOworICAgIGVsc2UgaWYgKHRpbWVy
SUQgIT0gVGltZXJJZE1hbnVhbCkKKyAgICAgICAgUG9zdE1lc3NhZ2UodGltZXJXaW5kb3dIYW5k
bGUsIFdNX1VTRVIsIDAsIDApOworfQorCit2b2lkIHN0b3BTaGFyZWRUaW1lcigpCit7CisgICAg
aWYgKHRpbWVySUQgPT0gVGltZXJJZEF1dG8pCisgICAgICAgIEtpbGxUaW1lcih0aW1lcldpbmRv
d0hhbmRsZSwgVGltZXJJZEF1dG8pOworCisgICAgdGltZXJJRCA9IFRpbWVySWROb25lOworfQor
Cit9CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1N5c3RlbVRpbWVXaW5jZS5j
cHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1N5c3RlbVRpbWVXaW5jZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiNzA1YgotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvU3lzdGVtVGltZVdpbmNlLmNwcApAQCAtMCwwICsxLDM5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEFwcGxlIENvbXB1dGVyLCBJbmMuICBBbGwgcmln
aHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJ
bmMuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBD
T01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENP
TVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlN5c3RlbVRpbWUuaCIK
KworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitmbG9hdCB1
c2VySWRsZVRpbWUoKQoreworICAgIHJldHVybiBGTFRfTUFYOworfQorCit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34381</attachid>
            <date>2009-08-08 11:20:27 -0700</date>
            <delta_ts>2009-08-11 14:10:46 -0700</delta_ts>
            <desc>7) Keygen (Security)</desc>
            <filename>27543_7.patch</filename>
            <type>text/plain</type>
            <size>5233</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uNDVlYzBkYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMiBAQAorMjAwOS0wOC0wOCAgTHlvbiBDaGVuICA8
bHlvbi5jaGVuQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBJbXBsZW1lbnQgS2V5Z2VuIGZvciBXSU5D
RQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1NDMK
KworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcDogQWRkZWQuCisKIDIw
MDktMDgtMDYgIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
d2luY2UvS2V5Z2VuV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LZXlnZW5XaW5j
ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzMzMzOAotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvS2V5Z2VuV2luY2UuY3BwCkBAIC0w
LDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxl
IEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNTTEtleUdlbmVyYXRvci5oIgor
CisjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorCisjaW5jbHVkZSA8
d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNyeXB0Lmg+CisKKyNkZWZpbmUgS0VZR0VOX0RFQlVH
X0tFWSAgICAgICAgMHgwMDAwMDAwMQorCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBLRVlHRU5f
REVCVUcgICAgKDApCisjZWxzZQorI2RlZmluZSBLRVlHRU5fREVCVUcgICAgMAorI2VuZGlmCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBXZWJDb3JlOjpnZXRTdXBwb3J0ZWRLZXlTaXpl
cyhWZWN0b3I8U3RyaW5nPiYgdikKK3sKKyAgICB2LmFwcGVuZCgiSGlnaCBHcmFkZSIpOworICAg
IHYuYXBwZW5kKCJNZWRpdW0gR3JhZGUiKTsKK30KKworU3RyaW5nIFdlYkNvcmU6OnNpZ25lZFB1
YmxpY0tleUFuZENoYWxsZW5nZVN0cmluZyh1bnNpZ25lZCBpbmRleCwgY29uc3QgU3RyaW5nJiBj
aGFsbGVuZ2UsIGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBTdHJpbmcga2V5c3RyOworCisgICAg
SENSWVBUUFJPViBoUHJvdiA9IDA7CisgICAgSENSWVBUS0VZIGhLZXkgPSAwOworICAgIFBDRVJU
X1BVQkxJQ19LRVlfSU5GTyBwUHViSW5mbyA9IDA7CisgICAgRFdPUkQgZHdQdWJJbmZvTGVuZ3Ro
ID0gMDsKKyAgICBDRVJUX0tFWUdFTl9SRVFVRVNUX0lORk8gcmVxdWVzdEluZm87CisgICAgQ1JZ
UFRfQUxHT1JJVEhNX0lERU5USUZJRVIgc2lnbkFsZ287CisgICAgTFBCWVRFIHBiRW5jb2RlZCA9
IDA7CisgICAgRFdPUkQgZHdFbmNvZGVkTGVuZ3RoID0gMDsKKyAgICBMUFdTVFIgcHN6U3RyaW5n
ID0gMDsKKyAgICBWZWN0b3I8Y2hhcj4gYmluYXJ5OworICAgIFZlY3RvcjxjaGFyPiBiYXNlNjQ7
CisKKyNpZiBkZWZpbmVkKEtFWUdFTl9ERUJVRykgJiYgKEtFWUdFTl9ERUJVRyAmIEtFWUdFTl9E
RUJVR19LRVkpCisgICAgcHJpbnRmKCJXZWJDb3JlOjpzaWduZWRQdWJsaWNLZXlBbmRDaGFsbGVu
Z2VTdHJpbmcoJWQsICUuKnMpLlxuIiwgaW5kZXgsIGNoYWxsZW5nZS5sZW5ndGgoKSwgY2hhbGxl
bmdlLmxhdGluMSgpLmRhdGEoKSk7CisjZW5kaWYKKworICAgIC8vIFRyeSB0byBkZWxldGUgb2Yg
aXQgZXhpc3RzIGFscmVhZHkKKyAgICBDcnlwdEFjcXVpcmVDb250ZXh0KCZoUHJvdiwgX1QoImtl
eWdlbl9jb250YWluZXIiKSwgTVNfRU5IQU5DRURfUFJPViwgUFJPVl9SU0FfRlVMTCwgQ1JZUFRf
REVMRVRFS0VZU0VUKTsKKworICAgIEJPT0wgc3VjY2VzcyA9IENyeXB0QWNxdWlyZUNvbnRleHQo
JmhQcm92LCBfVCgia2V5Z2VuX2NvbnRhaW5lciIpLCBNU19FTkhBTkNFRF9QUk9WLCBQUk9WX1JT
QV9GVUxMLCBDUllQVF9ORVdLRVlTRVQpOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgZ290
byBlcnJvcjsKKworICAgIHN1Y2Nlc3MgPSBDcnlwdEdlbktleShoUHJvdiwgQVRfS0VZRVhDSEFO
R0UsIDAsICZoS2V5KTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIGdvdG8gZXJyb3I7CisK
KyAgICBzdWNjZXNzID0gQ3J5cHRFeHBvcnRQdWJsaWNLZXlJbmZvKGhQcm92LCBBVF9LRVlFWENI
QU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIDAsICZkd1B1YkluZm9MZW5ndGgpOworICAgIGlmICgh
c3VjY2VzcykKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHBQdWJJbmZvID0gKFBDRVJUX1BV
QkxJQ19LRVlfSU5GTykgbmV3IGNoYXJbZHdQdWJJbmZvTGVuZ3RoXTsKKyAgICBpZiAoIXBQdWJJ
bmZvKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgc3VjY2VzcyA9IENyeXB0RXhwb3J0UHVi
bGljS2V5SW5mbyhoUHJvdiwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBwUHVi
SW5mbywgJmR3UHViSW5mb0xlbmd0aCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICBnb3Rv
IGVycm9yOworCisgICAgcmVxdWVzdEluZm8uZHdWZXJzaW9uID0gQ0VSVF9LRVlHRU5fUkVRVUVT
VF9WMTsKKyAgICByZXF1ZXN0SW5mby5wd3N6Q2hhbGxlbmdlU3RyaW5nID0gTCIiOworICAgIHJl
cXVlc3RJbmZvLlN1YmplY3RQdWJsaWNLZXlJbmZvID0gKnBQdWJJbmZvOworCisgICAgaWYgKGNo
YWxsZW5nZS5sZW5ndGgoKSkgeworICAgICAgICBwc3pTdHJpbmcgPSBuZXcgV0NIQVJbY2hhbGxl
bmdlLmxlbmd0aCgpICsgMV07CisgICAgICAgIGlmIChwc3pTdHJpbmcpIHsKKyAgICAgICAgICAg
IHdjc25jcHkocHN6U3RyaW5nLCBjaGFsbGVuZ2UuY2hhcmFjdGVycygpLCBjaGFsbGVuZ2UubGVu
Z3RoKCkpOworICAgICAgICAgICAgcHN6U3RyaW5nW2NoYWxsZW5nZS5sZW5ndGgoKV0gPSAwOwor
ICAgICAgICAgICAgcmVxdWVzdEluZm8ucHdzekNoYWxsZW5nZVN0cmluZyA9IHBzelN0cmluZzsK
KyAgICAgICAgfQorICAgIH0KKworICAgIFNlY3VyZVplcm9NZW1vcnkoJnNpZ25BbGdvLCBzaXpl
b2YoQ1JZUFRfQUxHT1JJVEhNX0lERU5USUZJRVIpKTsKKyAgICBzaWduQWxnby5wc3pPYmpJZCA9
IHN6T0lEX1JTQV9TSEExUlNBOworCisgICAgc3VjY2VzcyA9IENyeXB0U2lnbkFuZEVuY29kZUNl
cnRpZmljYXRlKGhQcm92LCBBVF9LRVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIFg1MDlf
S0VZR0VOX1JFUVVFU1RfVE9fQkVfU0lHTkVELAorICAgICAgICAgICAgICAgICAgICAmcmVxdWVz
dEluZm8sICZzaWduQWxnbywgMCwgMCwgJmR3RW5jb2RlZExlbmd0aCk7CisgICAgaWYgKCFzdWNj
ZXNzKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgcGJFbmNvZGVkID0gKExQQllURSkgbmV3
IGNoYXJbZHdFbmNvZGVkTGVuZ3RoXTsKKyAgICBpZiAoIXBiRW5jb2RlZCkKKyAgICAgICAgZ290
byBlcnJvcjsKKworICAgIHN1Y2Nlc3MgPSBDcnlwdFNpZ25BbmRFbmNvZGVDZXJ0aWZpY2F0ZSho
UHJvdiwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBYNTA5X0tFWUdFTl9SRVFV
RVNUX1RPX0JFX1NJR05FRCwKKyAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RJbmZvLCAmc2ln
bkFsZ28sIDAsIHBiRW5jb2RlZCwgJmR3RW5jb2RlZExlbmd0aCk7CisgICAgaWYgKCFzdWNjZXNz
KQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgYmluYXJ5LnJlc2l6ZShkd0VuY29kZWRMZW5n
dGgpOworICAgIGZvciAoRFdPUkQgaSA9IDA7IGkgPCBkd0VuY29kZWRMZW5ndGg7ICsraSkKKyAg
ICAgICAgYmluYXJ5W2ldID0gcGJFbmNvZGVkW2ldOworCisgICAgYmFzZTY0RW5jb2RlKGJpbmFy
eSwgYmFzZTY0KTsKKyAgICBpZiAoYmFzZTY0LnNpemUoKSkgeworICAgICAgICBTdHJpbmcgdGVt
cHN0cihiYXNlNjQuZGF0YSgpLCBiYXNlNjQuc2l6ZSgpKTsKKyAgICAgICAga2V5c3RyLmluc2Vy
dCh0ZW1wc3RyLCAwKTsKKyAgICB9CisKK2Vycm9yOgorICAgIGlmIChwc3pTdHJpbmcpCisgICAg
ICAgIGRlbGV0ZVtdIHBzelN0cmluZzsKKyAgICBpZiAocGJFbmNvZGVkKQorICAgICAgICBkZWxl
dGVbXSBwYkVuY29kZWQ7CisgICAgaWYgKHBQdWJJbmZvKQorICAgICAgICBkZWxldGVbXSBwUHVi
SW5mbzsKKyAgICBpZiAoaEtleSkKKyAgICAgICAgQ3J5cHREZXN0cm95S2V5KGhLZXkpOworICAg
IGlmIChoUHJvdikKKyAgICAgICAgQ3J5cHRSZWxlYXNlQ29udGV4dChoUHJvdiwgMCk7CisKKyAg
ICByZXR1cm4ga2V5c3RyOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>
<flag name="review"
          id="18559"
          type_id="1"
          status="-"
          setter="staikos"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34382</attachid>
            <date>2009-08-08 11:25:12 -0700</date>
            <delta_ts>2009-08-08 11:30:41 -0700</delta_ts>
            <desc>8) Pasteboard &amp; SearchPopupMenu</desc>
            <filename>27543_8.patch</filename>
            <type>text/plain</type>
            <size>41021</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ3Vyc29yV2luY2UuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uZTM1ZjFmOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvQ3Vyc29yV2luY2UuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkN1cnNvci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVjdCBBbGxD
dXJzb3JzIHsKKyAgICBBbGxDdXJzb3JzKCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgTnVtQ3Vyc29yVHlwZXM7ICsraSkKKyAgICAgICAgICAgIG1fY3Vyc29yc1tpXSA9IChD
dXJzb3JUeXBlKSBpOworICAgIH0KKyAgICBDdXJzb3IgbV9jdXJzb3JzW051bUN1cnNvclR5cGVz
XTsKK307CisKK3N0YXRpYyBjb25zdCBDdXJzb3ImIGdldEN1cnNvcihDdXJzb3JUeXBlIHR5cGUp
Cit7CisgICAgc3RhdGljIEFsbEN1cnNvcnMgYWxsQ3Vyc29yczsKKyAgICByZXR1cm4gYWxsQ3Vy
c29ycy5tX2N1cnNvcnNbdHlwZV07Cit9CisKK0N1cnNvcjo6Q3Vyc29yKGNvbnN0IEN1cnNvciYg
b3RoZXIpCis6IG1faW1wbChvdGhlci5tX2ltcGwpCit7Cit9CisKK0N1cnNvcjo6Q3Vyc29yKElt
YWdlKiBpbWcsIGNvbnN0IEludFBvaW50JiBob3RzcG90KQorOiBtX2ltcGwoQ3Vyc29yTm9uZSkK
K3sKK30KKworQ3Vyc29yOjp+Q3Vyc29yKCkKK3sKK30KKworQ3Vyc29yJiBDdXJzb3I6Om9wZXJh
dG9yPShjb25zdCBDdXJzb3ImIG90aGVyKQoreworICAgIG1faW1wbCA9IG90aGVyLm1faW1wbDsK
KyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0N1cnNvcjo6Q3Vyc29yKFBsYXRmb3JtQ3Vyc29yIGMp
Cis6IG1faW1wbChjKQoreworfQorCitjb25zdCBDdXJzb3ImIG5vbmVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yTm9uZSk7IH0KK2NvbnN0IEN1cnNvciYgcG9pbnRlckN1cnNvcigp
IHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JQb2ludGVyKTsgfQorY29uc3QgQ3Vyc29yJiBjcm9z
c0N1cnNvcigpICB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ3Jvc3MpOyB9Citjb25zdCBDdXJz
b3ImIGhhbmRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29ySGFuZCk7IH0KK2NvbnN0
IEN1cnNvciYgaUJlYW1DdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQmVhbSk7IH0K
K2NvbnN0IEN1cnNvciYgd2FpdEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JXYWl0
KTsgfQorY29uc3QgQ3Vyc29yJiBoZWxwQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNv
ckhlbHApOyB9Citjb25zdCBDdXJzb3ImIG1vdmVDdXJzb3IoKSAgeyByZXR1cm4gZ2V0Q3Vyc29y
KEN1cnNvck1vdmUpOyB9Citjb25zdCBDdXJzb3ImIGVhc3RSZXNpemVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yRWFzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhSZXNp
emVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhSZXNpemUpOyB9Citjb25z
dCBDdXJzb3ImIG5vcnRoRWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JOb3J0aEVhc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoV2VzdFJlc2l6ZUN1cnNv
cigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFdlc3RSZXNpemUpOyB9Citjb25zdCBD
dXJzb3ImIHNvdXRoUmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclNvdXRo
UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aEVhc3RSZXNpemVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yU291dGhFYXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0
aFdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yU291dGhXZXN0UmVz
aXplKTsgfQorY29uc3QgQ3Vyc29yJiB3ZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vy
c29yKEN1cnNvcldlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoU291dGhSZXNpemVD
dXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhTb3V0aFJlc2l6ZSk7IH0KK2Nv
bnN0IEN1cnNvciYgZWFzdFdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vy
c29yRWFzdFdlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoRWFzdFNvdXRoV2VzdFJl
c2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aEVhc3RTb3V0aFdlc3RS
ZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoV2VzdFNvdXRoRWFzdFJlc2l6ZUN1cnNvcigp
IHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFdlc3RTb3V0aEVhc3RSZXNpemUpOyB9Citj
b25zdCBDdXJzb3ImIGNvbHVtblJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JDb2x1bW5SZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHJvd1Jlc2l6ZUN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JSb3dSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHZlcnRpY2Fs
VGV4dEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JWZXJ0aWNhbFRleHQpOyB9Citj
b25zdCBDdXJzb3ImIGNlbGxDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ2VsbCk7
IH0KK2NvbnN0IEN1cnNvciYgY29udGV4dE1lbnVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3Io
Q3Vyc29yQ29udGV4dE1lbnUpOyB9Citjb25zdCBDdXJzb3ImIG5vRHJvcEN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JOb0Ryb3ApOyB9Citjb25zdCBDdXJzb3ImIG5vdEFsbG93ZWRD
dXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm90QWxsb3dlZCk7IH0KK2NvbnN0IEN1
cnNvciYgcHJvZ3Jlc3NDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yUHJvZ3Jlc3Mp
OyB9Citjb25zdCBDdXJzb3ImIGFsaWFzQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNv
ckFsaWFzKTsgfQorY29uc3QgQ3Vyc29yJiB6b29tSW5DdXJzb3IoKSB7IHJldHVybiBnZXRDdXJz
b3IoQ3Vyc29yWm9vbUluKTsgfQorY29uc3QgQ3Vyc29yJiB6b29tT3V0Q3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvclpvb21PdXQpOyB9Citjb25zdCBDdXJzb3ImIGNvcHlDdXJzb3Io
KSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ29weSk7IH0KK2NvbnN0IEN1cnNvciYgbWlkZGxl
UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYg
ZWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJz
b3ImIG5vcnRoUGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0
IEN1cnNvciYgbm9ydGhFYXN0UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7
IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhXZXN0UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3Nz
Q3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4g
Y3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aEVhc3RQYW5uaW5nQ3Vyc29yKCkg
eyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aFdlc3RQYW5uaW5n
Q3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiB3ZXN0UGFu
bmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgZ3Jh
YmJpbmdDdXJzb3IoKSB7IHJldHVybiBtb3ZlQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgZ3Jh
YkN1cnNvcigpIHsgcmV0dXJuIG1vdmVDdXJzb3IoKTsgfQorCit9CmRpZmYgLS1naXQgYS9XZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdEYXRhV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9EcmFnRGF0YVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li44ODFkN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFn
RGF0YVdpbmNlLmNwcApAQCAtMCwwICsxLDkwIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAw
Ny0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBz
b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVu
ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxh
dGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUg
aG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5U
WTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklM
SVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAq
ICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisg
KiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdh
cmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAq
ICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIkRyYWdEYXRhLmgiCisKKyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKKyNp
bmNsdWRlICJEb2N1bWVudEZyYWdtZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQYXNzUmVmUHRyPENsaXBib2FyZD4gRHJhZ0RhdGE6
OmNyZWF0ZUNsaXBib2FyZChDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5KSBjb25zdAorewor
ICAgIHJldHVybiAwOworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc1VSTCgpIGNvbnN0Cit7
CisgICAgcmV0dXJuIGZhbHNlOworfQorCitTdHJpbmcgRHJhZ0RhdGE6OmFzVVJMKFN0cmluZyog
dGl0bGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCitib29sIERyYWdEYXRh
Ojpjb250YWluc0ZpbGVzKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQg
RHJhZ0RhdGE6OmFzRmlsZW5hbWVzKFZlY3RvcjxTdHJpbmc+JikgY29uc3QKK3sKK30KKworYm9v
bCBEcmFnRGF0YTo6Y29udGFpbnNQbGFpblRleHQoKSBjb25zdAoreworICAgIHJldHVybiBmYWxz
ZTsKK30KKworU3RyaW5nIERyYWdEYXRhOjphc1BsYWluVGV4dCgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIFN0cmluZygpOworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc0NvbG9yKCkgY29uc3QK
K3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgRHJhZ0RhdGE6OmNhblNtYXJ0UmVwbGFj
ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIERyYWdEYXRhOjpjb250
YWluc0NvbXBhdGlibGVDb250ZW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisK
K1Bhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gRHJhZ0RhdGE6OmFzRnJhZ21lbnQoRG9jdW1l
bnQqIGRvYykgY29uc3QKK3sKKyAgICAgcmV0dXJuIDA7Cit9CisKK0NvbG9yIERyYWdEYXRhOjph
c0NvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gQ29sb3IoKTsKK30KKworfQorCmRpZmYgLS1n
aXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbmNlLmNwcCBiL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvRHJhZ0ltYWdlV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjRkNjBmODAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0RyYWdJbWFnZVdpbmNlLmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorICogIENvcHly
aWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJh
cnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAg
bW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0
aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9w
dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmli
dXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VU
IEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAg
TUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2Vl
IHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0
YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJy
YXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0
aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2Fj
aGVkSW1hZ2UuaCIKKyNpbmNsdWRlICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFn
ZS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0lu
dFNpemUgZHJhZ0ltYWdlU2l6ZShEcmFnSW1hZ2VSZWYpCit7CisgICAgcmV0dXJuIEludFNpemUo
MCwgMCk7Cit9CisKK3ZvaWQgZGVsZXRlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSkKK3sK
KyAgICBpZiAoaW1hZ2UpCisgICAgICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKK30KKworRHJh
Z0ltYWdlUmVmIHNjYWxlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiwgRmxvYXRTaXplKQoreworICAg
IHJldHVybiAwOworfQorCitEcmFnSW1hZ2VSZWYgZGlzc29sdmVEcmFnSW1hZ2VUb0ZyYWN0aW9u
KERyYWdJbWFnZVJlZiBpbWFnZSwgZmxvYXQpCit7CisgICAgcmV0dXJuIGltYWdlOworfQorCitE
cmFnSW1hZ2VSZWYgY3JlYXRlRHJhZ0ltYWdlRnJvbUltYWdlKEltYWdlKikKK3sKKyAgICByZXR1
cm4gMDsKK30KKworRHJhZ0ltYWdlUmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFn
ZShDYWNoZWRJbWFnZSopCit7CisgICAgcmV0dXJuIDA7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvRWRpdG9yV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93
aW5jZS9FZGl0b3JXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u
MDJhZjc4MAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRWRpdG9y
V2luY2UuY3BwCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIw
MDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3
YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIg
dGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2Ug
YXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICog
IHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIg
dmVyc2lvbi4KKyAqCisgKiAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZ
b3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFs
IFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmls
ZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBG
b3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJv
c3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisKKyNpbmNsdWRlICJFZGl0b3IuaCIKKworI2luY2x1ZGUgIkNsaXBib2FyZFdpbmNlLmgiCisj
aW5jbHVkZSAiRG9jdW1lbnQuaCIKKyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKKyNpbmNsdWRl
ICJFbGVtZW50LmgiCisjaW5jbHVkZSAiSHRtbEVkaXRpbmcuaCIKKyNpbmNsdWRlICJUZXh0SXRl
cmF0b3IuaCIKKyNpbmNsdWRlICJ2aXNpYmxlX3VuaXRzLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dz
Lmg+CisjZGVmaW5lIF9TWVNfR1VJRF9PUEVSQVRPUlNfCisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
KworUGFzc1JlZlB0cjxDbGlwYm9hcmQ+IEVkaXRvcjo6bmV3R2VuZXJhbENsaXBib2FyZChDbGlw
Ym9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5KQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xp
cGJvYXJkV2luY2UocG9saWN5LCBmYWxzZSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3Jl
CmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0ZpbGVDaG9vc2VyV2luY2UuY3Bw
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2M5OWIxCi0tLSAvZGV2L251bGwKKysrIGIvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNwcApAQCAtMCwwICsxLDYwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVU
RVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRF
UiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRmlsZUNob29zZXIuaCIKKwor
I2luY2x1ZGUgIkNocm9tZS5oIgorI2luY2x1ZGUgIkNocm9tZUNsaWVudC5oIgorI2luY2x1ZGUg
IkRvY3VtZW50LmgiCisjaW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJJY29uLmgiCisjaW5j
bHVkZSAiTG9jYWxpemVkU3RyaW5ncy5oIgorI2luY2x1ZGUgIlBhZ2UuaCIKKyNpbmNsdWRlICJT
dHJpbmdUcnVuY2F0b3IuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitTdHJpbmcgcGF0aEdl
dEZpbGVOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCk7CisKK1N0cmluZyBGaWxlQ2hvb3Nlcjo6YmFz
ZW5hbWVGb3JXaWR0aChjb25zdCBGb250JiBmb250LCBpbnQgd2lkdGgpIGNvbnN0Cit7CisgICAg
aWYgKHdpZHRoIDw9IDApCisgICAgICAgIHJldHVybiBTdHJpbmcoKTsKKworICAgIFN0cmluZyBz
dHJpbmc7CisgICAgaWYgKG1fZmlsZW5hbWVzLmlzRW1wdHkoKSkKKyAgICAgICAgc3RyaW5nID0g
ZmlsZUJ1dHRvbk5vRmlsZVNlbGVjdGVkTGFiZWwoKTsKKyAgICBlbHNlIGlmIChtX2ZpbGVuYW1l
cy5zaXplKCkgPT0gMSkgeworICAgICAgICBTdHJpbmcgdG1wRmlsZW5hbWUgPSBtX2ZpbGVuYW1l
c1swXTsKKyAgICAgICAgc3RyaW5nID0gcGF0aEdldEZpbGVOYW1lKHRtcEZpbGVuYW1lKTsKKyAg
ICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6cmlnaHRUcnVuY2F0ZShT
dHJpbmc6Om51bWJlcihtX2ZpbGVuYW1lcy5zaXplKCkpICsgIiBmaWxlcyIsIHdpZHRoLCBmb250
LCBmYWxzZSk7CisKKyAgICByZXR1cm4gU3RyaW5nVHJ1bmNhdG9yOjpjZW50ZXJUcnVuY2F0ZShz
dHJpbmcsIHdpZHRoLCBmb250LCBmYWxzZSk7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvRmlsZVN5c3RlbVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvRmlsZVN5c3RlbVdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li4yYmI0ZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxl
U3lzdGVtV2luY2UuY3BwCkBAIC0wLDAgKzEsMjgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAw
OCBDb2xsYWJvcmEsIEx0ZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykg
MjAwNy0yMDA5IFRvcmNoIE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAyLiAg
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCisgKiAzLiAg
TmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRo
ZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3Jz
ZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUg
d2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJGaWxlU3lzdGVtLmgiCisKKyNpbmNsdWRlICJDU3RyaW5nLmgiCisjaW5jbHVkZSAiUGxh
dGZvcm1TdHJpbmcuaCIKKworI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDx3aW5jcnlw
dC5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBib29sIGdldEZpbGVJbmZvKGNv
bnN0IFN0cmluZyYgcGF0aCwgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04mIGZpbGVJbmZvKQor
eworICAgIFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7CisgICAgSEFORExFIGhGaWxlID0gQ3JlYXRl
RmlsZShmaWxlbmFtZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBHRU5FUklDX1JF
QUQsIEZJTEVfU0hBUkVfUkVBRCwgMAorICAgICAgICAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxB
R19OT19CVUZGRVJJTkcsIDApOworCisgICAgaWYgKGhGaWxlID09IElOVkFMSURfSEFORExFX1ZB
TFVFKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIHJ0biA9IEdldEZpbGVJbmZv
cm1hdGlvbkJ5SGFuZGxlKGhGaWxlLCAmZmlsZUluZm8pID8gdHJ1ZSA6IGZhbHNlOworCisgICAg
Q2xvc2VIYW5kbGUoaEZpbGUpOworICAgIHJldHVybiBydG47Cit9CisKK2Jvb2wgZ2V0RmlsZVNp
emUoY29uc3QgU3RyaW5nJiBwYXRoLCBsb25nIGxvbmcmIHJlc3VsdCkKK3sKKyAgICBCWV9IQU5E
TEVfRklMRV9JTkZPUk1BVElPTiBmaWxlSW5mb3JtYXRpb247CisgICAgaWYgKCFnZXRGaWxlSW5m
byhwYXRoLCBmaWxlSW5mb3JtYXRpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBV
TEFSR0VfSU5URUdFUiBmaWxlU2l6ZTsKKyAgICBmaWxlU2l6ZS5Mb3dQYXJ0ID0gZmlsZUluZm9y
bWF0aW9uLm5GaWxlU2l6ZUxvdzsKKyAgICBmaWxlU2l6ZS5IaWdoUGFydCA9IGZpbGVJbmZvcm1h
dGlvbi5uRmlsZVNpemVIaWdoOworCisgICAgcmVzdWx0ID0gZmlsZVNpemUuUXVhZFBhcnQ7CisK
KyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBnZXRGaWxlTW9kaWZpY2F0aW9uVGltZShjb25z
dCBTdHJpbmcmIHBhdGgsIHRpbWVfdCYgcmVzdWx0KQoreworICAgIEJZX0hBTkRMRV9GSUxFX0lO
Rk9STUFUSU9OIGZpbGVJbmZvcm1hdGlvbjsKKyAgICBpZiAoIWdldEZpbGVJbmZvKHBhdGgsIGZp
bGVJbmZvcm1hdGlvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFVMQVJHRV9JTlRF
R0VSIHQ7CisgICAgbWVtY3B5KCZ0LCAmZmlsZUluZm9ybWF0aW9uLmZ0TGFzdFdyaXRlVGltZSwg
c2l6ZW9mKHQpKTsKKyAgICAKKyAgICByZXN1bHQgPSB0LlF1YWRQYXJ0ICogMC4wMDAwMDAxIC0g
MTE2NDQ0NzM2MDAuMDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGZpbGVFeGlzdHMo
Y29uc3QgU3RyaW5nJiBwYXRoKSAKK3sKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAg
IEhBTkRMRSBoRmlsZSA9IENyZWF0ZUZpbGUoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVy
bWluYXRpb24oKSwgMCwgRklMRV9TSEFSRV9SRUFEIHwgRklMRV9TSEFSRV9XUklURQorICAgICAg
ICAsIDAsIE9QRU5fRVhJU1RJTkcsIEZJTEVfRkxBR19OT19CVUZGRVJJTkcsIDApOworCisgICAg
Q2xvc2VIYW5kbGUoaEZpbGUpOworCisgICAgcmV0dXJuIGhGaWxlICE9IElOVkFMSURfSEFORExF
X1ZBTFVFOworfQorCitib29sIGRlbGV0ZUZpbGUoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAg
IFN0cmluZyBmaWxlbmFtZSA9IHBhdGg7CisgICAgcmV0dXJuICEhRGVsZXRlRmlsZVcoZmlsZW5h
bWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7Cit9CisKKworYm9vbCBkZWxldGVF
bXB0eURpcmVjdG9yeShjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgU3RyaW5nIGZpbGVuYW1l
ID0gcGF0aDsKKyAgICByZXR1cm4gISFSZW1vdmVEaXJlY3RvcnlXKGZpbGVuYW1lLmNoYXJhY3Rl
cnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworfQorCitTdHJpbmcgcGF0aEJ5QXBwZW5kaW5nQ29t
cG9uZW50KGNvbnN0IFN0cmluZyYgcGF0aCwgY29uc3QgU3RyaW5nJiBjb21wb25lbnQpCit7Cisg
ICAgaWYgKGNvbXBvbmVudC5pc0VtcHR5KCkpCisgICAgICAgIHJldHVybiBwYXRoOworCisgICAg
VmVjdG9yPFVDaGFyLCBNQVhfUEFUSD4gYnVmZmVyOworCisgICAgYnVmZmVyLmFwcGVuZChwYXRo
LmNoYXJhY3RlcnMoKSwgcGF0aC5sZW5ndGgoKSk7CisKKyAgICBpZiAoYnVmZmVyLmxhc3QoKSAh
PSBMJ1xcJyAmJiBidWZmZXIubGFzdCgpICE9IEwnLycKKyAgICAgICAgJiYgY29tcG9uZW50WzBd
ICE9IEwnXFwnICYmIGNvbXBvbmVudFswXSAhPSBMJy8nKQorICAgICAgICBidWZmZXIuYXBwZW5k
KEwnXFwnKTsKKworICAgIGJ1ZmZlci5hcHBlbmQoY29tcG9uZW50LmNoYXJhY3RlcnMoKSwgY29t
cG9uZW50Lmxlbmd0aCgpKTsKKworICAgIHJldHVybiBTdHJpbmcoYnVmZmVyLmRhdGEoKSwgYnVm
ZmVyLnNpemUoKSk7Cit9CisKK0NTdHJpbmcgZmlsZVN5c3RlbVJlcHJlc2VudGF0aW9uKGNvbnN0
IFN0cmluZyYpCit7CisgICAgcmV0dXJuICIiOworfQorCitib29sIG1ha2VBbGxEaXJlY3Rvcmll
cyhjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgaW50IGxhc3REaXZQb3MgPSBtYXgocGF0aC5y
ZXZlcnNlRmluZCgnLycpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcpKTsKKyAgICBpbnQgZW5kUG9z
ID0gcGF0aC5sZW5ndGgoKTsKKyAgICBpZiAobGFzdERpdlBvcyA9PSBwYXRoLmxlbmd0aCgpIC0g
MSkgeworICAgICAgICBlbmRQb3MgLT0gMTsKKyAgICAgICAgbGFzdERpdlBvcyA9IG1heChwYXRo
LnJldmVyc2VGaW5kKCcvJywgbGFzdERpdlBvcyksIHBhdGgucmV2ZXJzZUZpbmQoJ1xcJywgbGFz
dERpdlBvcykpOworICAgIH0KKworICAgIGlmIChsYXN0RGl2UG9zID4gMCkgeworICAgICAgICBp
ZiAoIW1ha2VBbGxEaXJlY3RvcmllcyhwYXRoLnN1YnN0cmluZygwLCBsYXN0RGl2UG9zKSkpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgU3RyaW5nIGZvbGRlcihwYXRo
LnN1YnN0cmluZygwLCBlbmRQb3MpKTsKKyAgICBDcmVhdGVEaXJlY3RvcnkoZm9sZGVyLmNoYXJh
Y3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIDApOworCisgICAgRFdPUkQgZmlsZUF0dHIgPSBH
ZXRGaWxlQXR0cmlidXRlcyhmb2xkZXIuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7
CisgICAgcmV0dXJuIGZpbGVBdHRyICE9IDB4RkZGRkZGRkYgJiYgKGZpbGVBdHRyICYgRklMRV9B
VFRSSUJVVEVfRElSRUNUT1JZKTsKK30KKworU3RyaW5nIGhvbWVEaXJlY3RvcnlQYXRoKCkKK3sK
KyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiAiIjsKK30KKworU3RyaW5nIHBhdGhH
ZXRGaWxlTmFtZShjb25zdCBTdHJpbmcmIHBhdGgpCit7CisgICAgcmV0dXJuIHBhdGguc3Vic3Ry
aW5nKG1heChwYXRoLnJldmVyc2VGaW5kKCcvJyksIHBhdGgucmV2ZXJzZUZpbmQoJ1xcJykpICsg
MSk7Cit9CisKK1N0cmluZyBkaXJlY3RvcnlOYW1lKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAg
ICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworQ1N0cmluZyBv
cGVuVGVtcG9yYXJ5RmlsZShjb25zdCBjaGFyKiwgUGxhdGZvcm1GaWxlSGFuZGxlJiBoYW5kbGUp
Cit7CisgICAgaGFuZGxlID0gSU5WQUxJRF9IQU5ETEVfVkFMVUU7CisKKyAgICB3Y2hhcl90IHRl
bXBQYXRoW01BWF9QQVRIXTsKKyAgICBpbnQgdGVtcFBhdGhMZW5ndGggPSA6OkdldFRlbXBQYXRo
KF9jb3VudG9mKHRlbXBQYXRoKSwgdGVtcFBhdGgpOworICAgIGlmICh0ZW1wUGF0aExlbmd0aCA8
PSAwIHx8IHRlbXBQYXRoTGVuZ3RoID4gX2NvdW50b2YodGVtcFBhdGgpKQorICAgICAgICByZXR1
cm4gQ1N0cmluZygpOworCisgICAgSENSWVBUUFJPViBoQ3J5cHRQcm92ID0gMDsKKyAgICBpZiAo
IUNyeXB0QWNxdWlyZUNvbnRleHQoJmhDcnlwdFByb3YsIDAsIDAsIFBST1ZfUlNBX0ZVTEwsIENS
WVBUX1ZFUklGWUNPTlRFWFQpKQorICAgICAgICByZXR1cm4gQ1N0cmluZygpOworCisgICAgU3Ry
aW5nIHByb3Bvc2VkUGF0aDsKKyAgICB3aGlsZSAoMSkgeworCisgICAgICAgIHdjaGFyX3QgdGVt
cEZpbGVbXSA9IEwiWFhYWFhYWFgudG1wIjsgLy8gVXNlIDguMyBzdHlsZSBuYW1lIChtb3JlIGNo
YXJhY3RlcnMgYXJlbid0IGhlbHBmdWwgZHVlIHRvIDguMyBzaG9ydCBmaWxlIG5hbWVzKQorICAg
ICAgICBjb25zdCBpbnQgcmFuZG9tUGFydExlbmd0aCA9IDg7CisgICAgICAgIGlmICghQ3J5cHRH
ZW5SYW5kb20oaENyeXB0UHJvdiwgcmFuZG9tUGFydExlbmd0aCAqIDIsIHJlaW50ZXJwcmV0X2Nh
c3Q8QllURSo+KHRlbXBGaWxlKSkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAvLyBM
aW1pdCB0byB2YWxpZCBmaWxlc3lzdGVtIGNoYXJhY3RlcnMsIGFsc28gZXhjbHVkaW5nIG90aGVy
cyB0aGF0IGNvdWxkIGJlIHByb2JsZW1hdGljLCBsaWtlIHB1bmN0dWF0aW9uLgorICAgICAgICAv
LyBkb24ndCBpbmNsdWRlIGJvdGggdXBwZXIgYW5kIGxvd2VyY2FzZSBzaW5jZSBXaW5kb3dzIGZp
bGUgc3lzdGVtcyBhcmUgdHlwaWNhbGx5IG5vdCBjYXNlIHNlbnNpdGl2ZS4KKyAgICAgICAgY29u
c3QgY2hhciB2YWxpZENoYXJzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3
eHl6IjsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5kb21QYXJ0TGVuZ3RoOyArK2kp
CisgICAgICAgICAgICB0ZW1wRmlsZVtpXSA9IHZhbGlkQ2hhcnNbdGVtcEZpbGVbaV0gJSAoc2l6
ZW9mKHZhbGlkQ2hhcnMpIC0gMSldOworCisgICAgICAgIEFTU0VSVCh3Y3NsZW4odGVtcEZpbGUp
ICogMiA9PSBzaXplb2YodGVtcEZpbGUpIC0gMik7CisKKyAgICAgICAgcHJvcG9zZWRQYXRoID0g
cGF0aEJ5QXBwZW5kaW5nQ29tcG9uZW50KFN0cmluZyh0ZW1wUGF0aCksIFN0cmluZyh0ZW1wRmls
ZSkpOworCisgICAgICAgIC8vIHVzZSBDUkVBVEVfTkVXIHRvIGF2b2lkIG92ZXJ3cml0aW5nIGFu
IGV4aXN0aW5nIGZpbGUgd2l0aCB0aGUgc2FtZSBuYW1lCisgICAgICAgIGhhbmRsZSA9IENyZWF0
ZUZpbGUocHJvcG9zZWRQYXRoLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCksIEdFTkVS
SUNfUkVBRCB8IEdFTkVSSUNfV1JJVEUsIDAsIDAsIENSRUFURV9ORVcsIEZJTEVfQVRUUklCVVRF
X05PUk1BTCwgMCk7CisgICAgICAgIGlmICghaXNIYW5kbGVWYWxpZChoYW5kbGUpICYmIEdldExh
c3RFcnJvcigpID09IEVSUk9SX0FMUkVBRFlfRVhJU1RTKQorICAgICAgICAgICAgY29udGludWU7
CisKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgQ3J5cHRSZWxlYXNlQ29udGV4dChoQ3J5
cHRQcm92LCAwKTsKKworICAgIGlmICghaXNIYW5kbGVWYWxpZChoYW5kbGUpKQorICAgICAgICBy
ZXR1cm4gQ1N0cmluZygpOworCisgICAgcmV0dXJuIHByb3Bvc2VkUGF0aC5sYXRpbjEoKTsKK30K
Kwordm9pZCBjbG9zZUZpbGUoUGxhdGZvcm1GaWxlSGFuZGxlJiBoYW5kbGUpCit7CisgICAgaWYg
KGlzSGFuZGxlVmFsaWQoaGFuZGxlKSkgeworICAgICAgICA6OkNsb3NlSGFuZGxlKGhhbmRsZSk7
CisgICAgICAgIGhhbmRsZSA9IGludmFsaWRQbGF0Zm9ybUZpbGVIYW5kbGU7CisgICAgfQorfQor
CitpbnQgd3JpdGVUb0ZpbGUoUGxhdGZvcm1GaWxlSGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciog
ZGF0YSwgaW50IGxlbmd0aCkKK3sKKyAgICBpZiAoIWlzSGFuZGxlVmFsaWQoaGFuZGxlKSkKKyAg
ICAgICAgcmV0dXJuIC0xOworCisgICAgRFdPUkQgYnl0ZXNXcml0dGVuOworICAgIGJvb2wgc3Vj
Y2VzcyA9IFdyaXRlRmlsZShoYW5kbGUsIGRhdGEsIGxlbmd0aCwgJmJ5dGVzV3JpdHRlbiwgMCk7
CisKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIHJldHVybiAtMTsKKyAgICByZXR1cm4gc3Rh
dGljX2Nhc3Q8aW50PihieXRlc1dyaXR0ZW4pOworfQorCitib29sIHVubG9hZE1vZHVsZShQbGF0
Zm9ybU1vZHVsZSBtb2R1bGUpCit7CisgICAgcmV0dXJuIDo6RnJlZUxpYnJhcnkobW9kdWxlKTsK
K30KKworU3RyaW5nIGxvY2FsVXNlclNwZWNpZmljU3RvcmFnZURpcmVjdG9yeSgpCit7CisgICAg
cmV0dXJuIFN0cmluZyhMIlxcIik7Cit9CisKK1N0cmluZyByb2FtaW5nVXNlclNwZWNpZmljU3Rv
cmFnZURpcmVjdG9yeSgpCit7CisgICAgcmV0dXJuIFN0cmluZyhMIlxcIik7Cit9CisKK1ZlY3Rv
cjxTdHJpbmc+IGxpc3REaXJlY3RvcnkoY29uc3QgU3RyaW5nJiBwYXRoLCBjb25zdCBTdHJpbmcm
IGZpbHRlcikKK3sKKyAgICBWZWN0b3I8U3RyaW5nPiBlbnRyaWVzOworCisgICAgVmVjdG9yPFVD
aGFyLCAyNTY+IHBhdHRlcm47CisgICAgcGF0dGVybi5hcHBlbmQocGF0aC5jaGFyYWN0ZXJzKCks
IHBhdGgubGVuZ3RoKCkpOworICAgIGlmIChwYXR0ZXJuLmxhc3QoKSAhPSBMJy8nICYmIHBhdHRl
cm4ubGFzdCgpICE9IEwnXFwnKQorICAgICAgICBwYXR0ZXJuLmFwcGVuZChMJ1xcJyk7CisKKyAg
ICBTdHJpbmcgcm9vdChwYXR0ZXJuLmRhdGEoKSwgcGF0dGVybi5zaXplKCkpOworICAgIHBhdHRl
cm4uYXBwZW5kKGZpbHRlci5jaGFyYWN0ZXJzKCksIGZpbHRlci5sZW5ndGgoKSk7CisgICAgcGF0
dGVybi5hcHBlbmQoMCk7CisKKyAgICBXSU4zMl9GSU5EX0RBVEEgZmluZERhdGE7CisgICAgSEFO
RExFIGhGaW5kID0gRmluZEZpcnN0RmlsZShwYXR0ZXJuLmRhdGEoKSwgJmZpbmREYXRhKTsKKyAg
ICBpZiAoSU5WQUxJRF9IQU5ETEVfVkFMVUUgIT0gaEZpbmQpIHsKKyAgICAgICAgZG8geworICAg
ICAgICAgICAgLy8gRklYRU1FOiBzaG91bGQgd2UgYWxzbyBhZGQgdGhlIGZvbGRlcnM/IFRoaXMg
ZnVuY3Rpb24KKyAgICAgICAgICAgIC8vIGlzIHNvIGZhciBvbmx5IGNhbGxlZCBieSBQbHVnaW5E
YXRhYmFzZS5jcHAgdG8gbGlzdAorICAgICAgICAgICAgLy8gYWxsIHBsdWdpbnMgaW4gYSBmb2xk
ZXIsIHdoZXJlIGl0J3Mgbm90IHN1cHBvc2VkIHRvIGxpc3Qgc3ViLWZvbGRlcnMuCisgICAgICAg
ICAgICBpZiAoIShmaW5kRGF0YS5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElS
RUNUT1JZKSkKKyAgICAgICAgICAgICAgICBlbnRyaWVzLmFwcGVuZChyb290ICsgZmluZERhdGEu
Y0ZpbGVOYW1lKTsKKyAgICAgICAgfSB3aGlsZSAoRmluZE5leHRGaWxlKGhGaW5kLCAmZmluZERh
dGEpKTsKKyAgICAgICAgRmluZENsb3NlKGhGaW5kKTsKKyAgICB9CisKKyAgICByZXR1cm4gZW50
cmllczsKK30KKworfQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2lu
Y2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LVVJMV2luY2UuY3BwCm5ldyBmaWxlIG1v
ZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTFlNGIKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJD
b3JlL3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHAKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1v
ZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
CisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFO
VEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdO
VQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisg
KgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkg
R2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
KiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgi
CisjaW5jbHVkZSAiS1VSTC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1N0cmluZyBLVVJM
OjpmaWxlU3lzdGVtUGF0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHBhdGgoKTsKK30KKworfQpk
aWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2Uu
Y3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2UuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlY2RlNDgKLS0tIC9kZXYvbnVsbAor
KysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL01JTUVUeXBlUmVnaXN0cnlXaW5jZS5jcHAKQEAg
LTAsMCArMSwxMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5j
LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IFRvcmNo
IE1vYmlsZSwgSW5jLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgQ09NUFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBDT01QVVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJNSU1F
VHlwZVJlZ2lzdHJ5LmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2lucmVn
Lmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworc3RhdGljIFN0cmluZyBtaW1lVHlwZUZvckV4
dGVuc2lvbihjb25zdCBTdHJpbmcmIGV4dGVuc2lvbikKK3sKKyAgICBTdHJpbmcgZXh0ID0gIi4i
ICsgZXh0ZW5zaW9uOworICAgIFdDSEFSIGNvbnRlbnRUeXBlU3RyWzI1Nl07CisgICAgRFdPUkQg
Y29udGVudFR5cGVTdHJMZW4gPSBzaXplb2YoY29udGVudFR5cGVTdHIpOworICAgIERXT1JEIHZh
bHVlVHlwZTsKKworICAgIEhLRVkga2V5OworICAgIFN0cmluZyByZXN1bHQ7CisgICAgaWYgKEVS
Uk9SX1NVQ0NFU1MgIT0gUmVnT3BlbktleUV4KEhLRVlfQ0xBU1NFU19ST09ULCBleHQuY2hhcmFj
dGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgMCwgMCwgJmtleSkpCisgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisKKyAgICBpZiAoRVJST1JfU1VDQ0VTUyA9PSBSZWdRdWVyeVZhbHVlRXgoa2V5LCBM
IkNvbnRlbnQgVHlwZSIsIDAsICZ2YWx1ZVR5cGUsIChMUEJZVEUpY29udGVudFR5cGVTdHIsICZj
b250ZW50VHlwZVN0ckxlbikgJiYgdmFsdWVUeXBlID09IFJFR19TWikKKyAgICAgICAgcmVzdWx0
ID0gU3RyaW5nKGNvbnRlbnRUeXBlU3RyLCBjb250ZW50VHlwZVN0ckxlbiAvIHNpemVvZihjb250
ZW50VHlwZVN0clswXSkgLSAxKTsKKworICAgIFJlZ0Nsb3NlS2V5KGtleSk7CisKKyAgICByZXR1
cm4gcmVzdWx0OworfQorCitzdGF0aWMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gbWltZXR5cGVN
YXA7CisKK3N0YXRpYyB2b2lkIGluaXRNSU1FVHlwZUVudGVuc2lvbk1hcCgpCit7CisgICAgaWYg
KG1pbWV0eXBlTWFwLmlzRW1wdHkoKSkgeworICAgICAgICAvL2ZpbGwgd2l0aCBpbml0aWFsIHZh
bHVlcworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInR4dCIsICJ0ZXh0L3BsYWluIik7CisgICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgicGRmIiwgImFwcGxpY2F0aW9uL3BkZiIpOworICAgICAgICBt
aW1ldHlwZU1hcC5hZGQoInBzIiwgImFwcGxpY2F0aW9uL3Bvc3RzY3JpcHQiKTsKKyAgICAgICAg
bWltZXR5cGVNYXAuYWRkKCJodG1sIiwgInRleHQvaHRtbCIpOworICAgICAgICBtaW1ldHlwZU1h
cC5hZGQoImh0bSIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ4bWwi
LCAidGV4dC94bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ4c2wiLCAidGV4dC94c2wi
KTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJqcyIsICJhcHBsaWNhdGlvbi94LWphdmFzY3Jp
cHQiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ4aHRtbCIsICJhcHBsaWNhdGlvbi94aHRt
bCt4bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJyc3MiLCAiYXBwbGljYXRpb24vcnNz
K3htbCIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoIndlYmFyY2hpdmUiLCAiYXBwbGljYXRp
b24veC13ZWJhcmNoaXZlIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgic3ZnIiwgImltYWdl
L3N2Zyt4bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJzdmd6IiwgImltYWdlL3N2Zyt4
bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJqcGciLCAiaW1hZ2UvanBlZyIpOworICAg
ICAgICBtaW1ldHlwZU1hcC5hZGQoImpwZWciLCAiaW1hZ2UvanBlZyIpOworICAgICAgICBtaW1l
dHlwZU1hcC5hZGQoInBuZyIsICJpbWFnZS9wbmciKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRk
KCJ0aWYiLCAiaW1hZ2UvdGlmZiIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInRpZmYiLCAi
aW1hZ2UvdGlmZiIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoImljbyIsICJpbWFnZS9pY28i
KTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJjdXIiLCAiaW1hZ2UvaWNvIik7CisgICAgICAg
IG1pbWV0eXBlTWFwLmFkZCgiYm1wIiwgImltYWdlL2JtcCIpOworICAgICAgICBtaW1ldHlwZU1h
cC5hZGQoImNzcyIsICJ0ZXh0L2NzcyIpOworICAgICAgICAvLyBGSVhNRTogQ3VzdG9tIGZvbnQg
d29ya3Mgb25seSB3aGVuIE1JTUUgaXMgInRleHQvcGxhaW4iCisgICAgICAgIG1pbWV0eXBlTWFw
LmFkZCgidHRmIiwgInRleHQvcGxhaW4iKTsgLy8gImZvbnQvdHRmIgorICAgICAgICBtaW1ldHlw
ZU1hcC5hZGQoIm90ZiIsICJ0ZXh0L3BsYWluIik7IC8vICJmb250L290ZiIKKyNpZiBFTkFCTEUo
V01MKQorICAgICAgICBtaW1ldHlwZU1hcC5hZGQoIndtbCIsICJ0ZXh0L3ZuZC53YXAud21sIik7
CisjZW5kaWYKKyNpZiBFTkFCTEUoV0JYTUwpCisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgid2J4
bWwiLCAiYXBwbGljYXRpb24vdm5kLndhcC53bWxjIik7CisjZW5kaWYKKyAgICB9Cit9CisKK1N0
cmluZyBNSU1FVHlwZVJlZ2lzdHJ5OjpnZXRQcmVmZXJyZWRFeHRlbnNpb25Gb3JNSU1FVHlwZShj
b25zdCBTdHJpbmcmIHR5cGUpCit7CisgICAgaWYgKHR5cGUuaXNFbXB0eSgpKQorICAgICAgICBy
ZXR1cm4gU3RyaW5nKCk7CisKKyAgICAvLyBBdm9pZCBjb25mbGljdHMgd2l0aCAidHRmIiBhbmQg
Im90ZiIKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UodHlwZSwgInRleHQvcGxhaW4iKSkKKyAg
ICAgICAgcmV0dXJuICJ0eHQiOworCisgICAgaW5pdE1JTUVUeXBlRW50ZW5zaW9uTWFwKCk7CisK
KyAgICBmb3IgKEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+OjppdGVyYXRvciBpID0gbWltZXR5cGVN
YXAuYmVnaW4oKTsgaSAhPSBtaW1ldHlwZU1hcC5lbmQoKTsgKytpKSB7CisgICAgICAgIGlmIChl
cXVhbElnbm9yaW5nQ2FzZShpLT5zZWNvbmQsIHR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGkt
PmZpcnN0OworICAgIH0KKworI2lmIEVOQUJMRShYSFRNTE1QKQorICAgIGlmIChlcXVhbElnbm9y
aW5nQ2FzZSgiYXBwbGljYXRpb24vdm5kLndhcC54aHRtbCt4bWwiLCB0eXBlKSkKKyAgICAgICAg
cmV0dXJuIFN0cmluZygieG1sIik7CisjZW5kaWYKKworICAgIHJldHVybiBTdHJpbmcoKTsKK30K
KworU3RyaW5nIE1JTUVUeXBlUmVnaXN0cnk6OmdldE1JTUVUeXBlRm9yRXh0ZW5zaW9uKGNvbnN0
IFN0cmluZyAmZXh0KQoreworICAgIGlmIChleHQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4g
U3RyaW5nKCk7CisKKyAgICBpbml0TUlNRVR5cGVFbnRlbnNpb25NYXAoKTsKKworICAgIFN0cmlu
ZyByZXN1bHQgPSBtaW1ldHlwZU1hcC5nZXQoZXh0Lmxvd2VyKCkpOworICAgIGlmIChyZXN1bHQu
aXNFbXB0eSgpKSB7CisgICAgICAgIHJlc3VsdCA9IG1pbWVUeXBlRm9yRXh0ZW5zaW9uKGV4dCk7
CisgICAgICAgIGlmICghcmVzdWx0LmlzRW1wdHkoKSkKKyAgICAgICAgICAgIG1pbWV0eXBlTWFw
LmFkZChleHQsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuaXNFbXB0eSgpID8g
InVua25vd24vdW5rbm93biIgOiByZXN1bHQ7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvUGFzdGVib2FyZFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2lu
Y2UvUGFzdGVib2FyZFdpbmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
Li5jYmE4NWI4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9QYXN0
ZWJvYXJkV2luY2UuY3BwCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiUGFzdGVib2FyZC5oIgorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgor
I2luY2x1ZGUgIkNsaXBib2FyZFV0aWxpdGllc1dpbi5oIgorI2luY2x1ZGUgIkRvY3VtZW50Lmgi
CisjaW5jbHVkZSAiRG9jdW1lbnRGcmFnbWVudC5oIgorI2luY2x1ZGUgIkVsZW1lbnQuaCIKKyNp
bmNsdWRlICJGcmFtZS5oIgorI2luY2x1ZGUgIkhpdFRlc3RSZXN1bHQuaCIKKyNpbmNsdWRlICJJ
bWFnZS5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAi
UmFuZ2UuaCIKKyNpbmNsdWRlICJSZW5kZXJJbWFnZS5oIgorI2luY2x1ZGUgIlRleHRFbmNvZGlu
Zy5oIgorI2luY2x1ZGUgIm1hcmt1cC5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0YXRp
YyBVSU5UIEhUTUxDbGlwYm9hcmRGb3JtYXQgPSAwOworc3RhdGljIFVJTlQgQm9va21hcmtDbGlw
Ym9hcmRGb3JtYXQgPSAwOworc3RhdGljIFVJTlQgV2ViU21hcnRQYXN0ZUZvcm1hdCA9IDA7CisK
K2V4dGVybiBIREMgaFNjcmVlbkRDOworCitzdGF0aWMgTFJFU1VMVCBDQUxMQkFDSyBQYXN0ZWJv
YXJkT3duZXJXbmRQcm9jKEhXTkQgaFduZCwgVUlOVCBtZXNzYWdlLCBXUEFSQU0gd1BhcmFtLCBM
UEFSQU0gbFBhcmFtKQoreworICAgIExSRVNVTFQgbHJlc3VsdCA9IDA7CisgICAgTE9ORyBsb25n
UHRyID0gR2V0V2luZG93TG9uZyhoV25kLCAwKTsKKworICAgIHN3aXRjaCAobWVzc2FnZSkgewor
ICAgIGNhc2UgV01fUkVOREVSRk9STUFUOgorICAgICAgICAvLyBUaGlzIG1lc3NhZ2UgY29tZXMg
d2hlbiBTZXRDbGlwYm9hcmREYXRhIHdhcyBzZW50IGEgbnVsbCBkYXRhIGhhbmRsZQorICAgICAg
ICAvLyBhbmQgbm93IGl0J3MgY29tZSB0aW1lIHRvIHB1dCB0aGUgZGF0YSBvbiB0aGUgY2xpcGJv
YXJkLgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX1JFTkRFUkFMTEZPUk1BVFM6CisgICAg
ICAgIC8vIFRoaXMgbWVzc2FnZSBjb21lcyB3aGVuIFNldENsaXBib2FyZERhdGEgd2FzIHNlbnQg
YSBudWxsIGRhdGEgaGFuZGxlCisgICAgICAgIC8vIGFuZCBub3cgdGhpcyBhcHBsaWNhdGlvbiBp
cyBhYm91dCB0byBxdWl0LCBzbyBpdCBtdXN0IHB1dCBkYXRhIG9uCisgICAgICAgIC8vIHRoZSBj
bGlwYm9hcmQgYmVmb3JlIGl0IGV4aXRzLgorICAgICAgICBicmVhazsKKyAgICBjYXNlIFdNX0RF
U1RST1k6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGxyZXN1bHQgPSBE
ZWZXaW5kb3dQcm9jKGhXbmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIHJldHVybiBscmVzdWx0OworfQorCitQYXN0ZWJvYXJkKiBQYXN0ZWJv
YXJkOjpnZW5lcmFsUGFzdGVib2FyZCgpCit7CisgICAgc3RhdGljIFBhc3RlYm9hcmQqIHBhc3Rl
Ym9hcmQgPSBuZXcgUGFzdGVib2FyZDsKKyAgICByZXR1cm4gcGFzdGVib2FyZDsKK30KKworUGFz
dGVib2FyZDo6UGFzdGVib2FyZCgpCit7CisgICAgLy8gbWFrZSBhIGR1bW15IEhXTkQgdG8gYmUg
dGhlIFdpbmRvd3MgY2xpcGJvYXJkJ3Mgb3duZXIKKyAgICBXTkRDTEFTUyB3YyA9IHswfTsKKyAg
ICBtZW1zZXQoJndjLCAwLCBzaXplb2Yod2MpKTsKKyAgICB3Yy5scGZuV25kUHJvYyAgICA9IFBh
c3RlYm9hcmRPd25lclduZFByb2M7CisgICAgd2MuaEluc3RhbmNlICAgICAgPSBQYWdlOjppbnN0
YW5jZUhhbmRsZSgpOworICAgIHdjLmxwc3pDbGFzc05hbWUgID0gTCJQYXN0ZWJvYXJkT3duZXJX
aW5kb3dDbGFzcyI7CisgICAgOjpSZWdpc3RlckNsYXNzKCZ3Yyk7CisKKyAgICBtX293bmVyID0g
OjpDcmVhdGVXaW5kb3coTCJQYXN0ZWJvYXJkT3duZXJXaW5kb3dDbGFzcyIsIEwiUGFzdGVib2Fy
ZE93bmVyV2luZG93IiwgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgSFdORF9NRVNTQUdFLCAwLCAw
LCAwKTsKKworICAgIEhUTUxDbGlwYm9hcmRGb3JtYXQgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9y
bWF0KEwiSFRNTCBGb3JtYXQiKTsKKyAgICBCb29rbWFya0NsaXBib2FyZEZvcm1hdCA9IDo6UmVn
aXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJVbmlmb3JtUmVzb3VyY2VMb2NhdG9yVyIpOworICAgIFdl
YlNtYXJ0UGFzdGVGb3JtYXQgPSA6OlJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiV2ViS2l0IFNt
YXJ0IFBhc3RlIEZvcm1hdCIpOworfQorCit2b2lkIFBhc3RlYm9hcmQ6OmNsZWFyKCkKK3sKKyAg
ICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIDo6RW1wdHlDbGlwYm9h
cmQoKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0KK30KKwordm9pZCBQYXN0
ZWJvYXJkOjp3cml0ZVNlbGVjdGlvbihSYW5nZSogc2VsZWN0ZWRSYW5nZSwgYm9vbCBjYW5TbWFy
dENvcHlPckRlbGV0ZSwgRnJhbWUqIGZyYW1lKQoreworICAgIGNsZWFyKCk7CisKKyAgICAvLyBQ
dXQgQ0ZfSFRNTCBmb3JtYXQgb24gdGhlIHBhc3RlYm9hcmQKKyAgICBpZiAoOjpPcGVuQ2xpcGJv
YXJkKG1fb3duZXIpKSB7CisgICAgICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgICAgICBW
ZWN0b3I8Y2hhcj4gZGF0YTsKKyAgICAgICAgbWFya3VwVG9DRl9IVE1MKGNyZWF0ZU1hcmt1cChz
ZWxlY3RlZFJhbmdlLCAwLCBBbm5vdGF0ZUZvckludGVyY2hhbmdlKSwgc2VsZWN0ZWRSYW5nZS0+
c3RhcnRDb250YWluZXIoZWMpLT5kb2N1bWVudCgpLT51cmwoKSwgZGF0YSk7CisgICAgICAgIEhH
TE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFsRGF0YShkYXRhKTsKKyAgICAgICAgaWYgKCE6OlNl
dENsaXBib2FyZERhdGEoSFRNTENsaXBib2FyZEZvcm1hdCwgY2JEYXRhKSkKKyAgICAgICAgICAg
IDo6R2xvYmFsRnJlZShjYkRhdGEpOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAg
fQorCisgICAgLy8gUHV0IHBsYWluIHN0cmluZyBvbiB0aGUgcGFzdGVib2FyZC4gQ0ZfVU5JQ09E
RVRFWFQgY292ZXJzIENGX1RFWFQgYXMgd2VsbAorICAgIFN0cmluZyBzdHIgPSBmcmFtZS0+c2Vs
ZWN0ZWRUZXh0KCk7CisgICAgcmVwbGFjZU5ld2xpbmVzV2l0aFdpbmRvd3NTdHlsZU5ld2xpbmVz
KHN0cik7CisgICAgcmVwbGFjZU5CU1BXaXRoU3BhY2Uoc3RyKTsKKyAgICBpZiAoOjpPcGVuQ2xp
cGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3JlYXRlR2xvYmFs
RGF0YShzdHIpOworICAgICAgICBpZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShDRl9VTklDT0RFVEVY
VCwgY2JEYXRhKSkKKyAgICAgICAgICAgIDo6R2xvYmFsRnJlZShjYkRhdGEpOworICAgICAgICA6
OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQorCisgICAgLy8gZW5hYmxlIHNtYXJ0LXJlcGxhY2lu
ZyBsYXRlciBvbiBieSBwdXR0aW5nIGR1bW15IGRhdGEgb24gdGhlIHBhc3RlYm9hcmQKKyAgICBp
ZiAoY2FuU21hcnRDb3B5T3JEZWxldGUpIHsKKyAgICAgICAgaWYgKDo6T3BlbkNsaXBib2FyZCht
X293bmVyKSkgeworICAgICAgICAgICAgOjpTZXRDbGlwYm9hcmREYXRhKFdlYlNtYXJ0UGFzdGVG
b3JtYXQsIDApOworICAgICAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgICAgICB9Cisg
ICAgfQorfQorCit2b2lkIFBhc3RlYm9hcmQ6OndyaXRlVVJMKGNvbnN0IEtVUkwmIHVybCwgY29u
c3QgU3RyaW5nJiB0aXRsZVN0ciwgRnJhbWUqIGZyYW1lKQoreworICAgIEFTU0VSVCghdXJsLmlz
RW1wdHkoKSk7CisKKyAgICBjbGVhcigpOworCisgICAgU3RyaW5nIHRpdGxlKHRpdGxlU3RyKTsK
KyAgICBpZiAodGl0bGUuaXNFbXB0eSgpKSB7CisgICAgICAgIHRpdGxlID0gdXJsLmxhc3RQYXRo
Q29tcG9uZW50KCk7CisgICAgICAgIGlmICh0aXRsZS5pc0VtcHR5KCkpCisgICAgICAgICAgICB0
aXRsZSA9IHVybC5ob3N0KCk7CisgICAgfQorCisgICAgLy8gd3JpdGUgdG8gY2xpcGJvYXJkIGlu
IGZvcm1hdCBjb20uYXBwbGUuc2FmYXJpLmJvb2ttYXJrZGF0YSB0byBiZSBhYmxlIHRvIHBhc3Rl
IGludG8gdGhlIGJvb2ttYXJrcyB2aWV3IHdpdGggYXBwcm9wcmlhdGUgdGl0bGUKKyAgICBpZiAo
OjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhHTE9CQUwgY2JEYXRhID0gY3Jl
YXRlR2xvYmFsRGF0YSh1cmwsIHRpdGxlKTsKKyAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERh
dGEoQm9va21hcmtDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCisgICAgICAgICAgICA6Okdsb2Jh
bEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAg
IC8vIHdyaXRlIHRvIGNsaXBib2FyZCBpbiBmb3JtYXQgQ0ZfSFRNTCB0byBiZSBhYmxlIHRvIHBh
c3RlIGludG8gY29udGVudGVkaXRhYmxlIGFyZWFzIGFzIGEgbGluaworICAgIGlmICg6Ok9wZW5D
bGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgVmVjdG9yPGNoYXI+IGRhdGE7CisgICAgICAg
IG1hcmt1cFRvQ0ZfSFRNTCh1cmxUb01hcmt1cCh1cmwsIHRpdGxlKSwgIiIsIGRhdGEpOworICAg
ICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7CisgICAgICAgIGlm
ICghOjpTZXRDbGlwYm9hcmREYXRhKEhUTUxDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCisgICAg
ICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgp
OworICAgIH0KKworICAgIC8vIGJhcmUtYm9uZXMgQ0ZfVU5JQ09ERVRFWFQgc3VwcG9ydAorICAg
IGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgSEdMT0JBTCBjYkRhdGEg
PSBjcmVhdGVHbG9iYWxEYXRhKHVybC5zdHJpbmcoKSk7CisgICAgICAgIGlmICghOjpTZXRDbGlw
Ym9hcmREYXRhKENGX1VOSUNPREVURVhULCBjYkRhdGEpKQorICAgICAgICAgICAgOjpHbG9iYWxG
cmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9Cit9CisKK3Zv
aWQgUGFzdGVib2FyZDo6d3JpdGVJbWFnZShOb2RlKiBub2RlLCBjb25zdCBLVVJMJiwgY29uc3Qg
U3RyaW5nJikKK3sKKyAgICBBU1NFUlQobm9kZSAmJiBub2RlLT5yZW5kZXJlcigpICYmIG5vZGUt
PnJlbmRlcmVyKCktPmlzSW1hZ2UoKSk7CisgICAgUmVuZGVySW1hZ2UqIHJlbmRlcmVyID0gc3Rh
dGljX2Nhc3Q8UmVuZGVySW1hZ2UqPihub2RlLT5yZW5kZXJlcigpKTsKKyAgICBDYWNoZWRJbWFn
ZSogY2FjaGVkSW1hZ2UgPSBzdGF0aWNfY2FzdDxDYWNoZWRJbWFnZSo+KHJlbmRlcmVyLT5jYWNo
ZWRJbWFnZSgpKTsKKyAgICBBU1NFUlQoY2FjaGVkSW1hZ2UpOworICAgIEltYWdlKiBpbWFnZSA9
IGNhY2hlZEltYWdlLT5pbWFnZSgpOworICAgIEFTU0VSVChpbWFnZSk7CisKKyAgICBjbGVhcigp
OworCisgICAgUmVmUHRyPFNoYXJlZEJpdG1hcD4gc291cmNlQm1wID0gaW1hZ2UtPm5hdGl2ZUlt
YWdlRm9yQ3VycmVudEZyYW1lKCk7CisgICAgaWYgKCFzb3VyY2VCbXApCisgICAgICAgIHJldHVy
bjsKKworICAgIEludFJlY3QgcmVjdCgwLCAwLCBzb3VyY2VCbXAtPndpZHRoKCksIHNvdXJjZUJt
cC0+aGVpZ2h0KCkpOworICAgIEJpdG1hcEluZm8gYm1wSW5mbzsKKyAgICB2b2lkKiBwaXhlbHM7
CisgICAgSEJJVE1BUCByZXN1bHRCaXRtYXAgPSBzb3VyY2VCbXAtPmNsaXBCaXRtYXAocmVjdCwg
dHJ1ZSwgYm1wSW5mbywgcGl4ZWxzKTsKKyAgICBpZiAoIXJlc3VsdEJpdG1hcCkKKyAgICAgICAg
cmV0dXJuOworCisgICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICA6
OlNldENsaXBib2FyZERhdGEoQ0ZfQklUTUFQLCByZXN1bHRCaXRtYXApOworICAgICAgICA6OkNs
b3NlQ2xpcGJvYXJkKCk7CisgICAgfSBlbHNlCisgICAgICAgIERlbGV0ZU9iamVjdChyZXN1bHRC
aXRtYXApOworfQorCitib29sIFBhc3RlYm9hcmQ6OmNhblNtYXJ0UmVwbGFjZSgpCit7CisgICAg
cmV0dXJuIDo6SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoV2ViU21hcnRQYXN0ZUZvcm1hdCk7
Cit9CisKK1N0cmluZyBQYXN0ZWJvYXJkOjpwbGFpblRleHQoRnJhbWUqIGZyYW1lKQoreworICAg
IGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKENGX1VOSUNPREVURVhUKSAmJiA6Ok9w
ZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xp
cGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCk7CisgICAgICAgIGlmIChjYkRhdGEpIHsKKyAgICAg
ICAgICAgIFVDaGFyKiBidWZmZXIgPSAoVUNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKKyAgICAg
ICAgICAgIFN0cmluZyBmcm9tQ2xpcGJvYXJkKGJ1ZmZlcik7CisgICAgICAgICAgICBHbG9iYWxV
bmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgICAg
ICByZXR1cm4gZnJvbUNsaXBib2FyZDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBDbG9z
ZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxh
YmxlKENGX1RFWFQpICYmIDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICBIQU5E
TEUgY2JEYXRhID0gOjpHZXRDbGlwYm9hcmREYXRhKENGX1RFWFQpOworICAgICAgICBpZiAoY2JE
YXRhKSB7CisgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRh
dGEpOworICAgICAgICAgICAgU3RyaW5nIGZyb21DbGlwYm9hcmQoYnVmZmVyKTsKKyAgICAgICAg
ICAgIEdsb2JhbFVubG9jayhjYkRhdGEpOworICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsK
KyAgICAgICAgICAgIHJldHVybiBmcm9tQ2xpcGJvYXJkOworICAgICAgICB9IGVsc2UKKyAgICAg
ICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQorCisgICAgcmV0dXJuIFN0cmluZygpOwor
fQorCitQYXNzUmVmUHRyPERvY3VtZW50RnJhZ21lbnQ+IFBhc3RlYm9hcmQ6OmRvY3VtZW50RnJh
Z21lbnQoRnJhbWUqIGZyYW1lLCBQYXNzUmVmUHRyPFJhbmdlPiBjb250ZXh0LCBib29sIGFsbG93
UGxhaW5UZXh0LCBib29sJiBjaG9zZVBsYWluVGV4dCkKK3sKKyAgICBjaG9zZVBsYWluVGV4dCA9
IGZhbHNlOworCisgICAgaWYgKDo6SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoSFRNTENsaXBi
b2FyZEZvcm1hdCkgJiYgOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIC8vIGdl
dCBkYXRhIG9mZiBvZiBjbGlwYm9hcmQKKyAgICAgICAgSEFORExFIGNiRGF0YSA9IDo6R2V0Q2xp
cGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0KTsKKyAgICAgICAgaWYgKGNiRGF0YSkgewor
ICAgICAgICAgICAgU0laRV9UIGRhdGFTaXplID0gOjpHbG9iYWxTaXplKGNiRGF0YSk7CisgICAg
ICAgICAgICBTdHJpbmcgY2ZfaHRtbChVVEY4RW5jb2RpbmcoKS5kZWNvZGUoKGNoYXIqKUdsb2Jh
bExvY2soY2JEYXRhKSwgZGF0YVNpemUpKTsKKyAgICAgICAgICAgIEdsb2JhbFVubG9jayhjYkRh
dGEpOworICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKworICAgICAgICAgICAgUGFzc1Jl
ZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGZyYWdtZW50RnJvbUNGX0hUTUwoZnJh
bWUtPmRvY3VtZW50KCksIGNmX2h0bWwpOworICAgICAgICAgICAgaWYgKGZyYWdtZW50KQorICAg
ICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudDsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICBDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIGlmIChhbGxvd1BsYWluVGV4dCAmJiBJ
c0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9VTklDT0RFVEVYVCkpIHsKKyAgICAgICAgY2hv
c2VQbGFpblRleHQgPSB0cnVlOworICAgICAgICBpZiAoT3BlbkNsaXBib2FyZChtX293bmVyKSkg
eworICAgICAgICAgICAgSEFORExFIGNiRGF0YSA9IEdldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09E
RVRFWFQpOworICAgICAgICAgICAgaWYgKGNiRGF0YSkgeworICAgICAgICAgICAgICAgIFVDaGFy
KiBidWZmZXIgPSAoVUNoYXIqKUdsb2JhbExvY2soY2JEYXRhKTsKKyAgICAgICAgICAgICAgICBT
dHJpbmcgc3RyKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgR2xvYmFsVW5sb2NrKGNiRGF0YSk7
CisgICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgICAgICAgICBSZWZQ
dHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBjcmVhdGVGcmFnbWVudEZyb21UZXh0KGNv
bnRleHQuZ2V0KCksIHN0cik7CisgICAgICAgICAgICAgICAgaWYgKGZyYWdtZW50KQorICAgICAg
ICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFzZSgpOworICAgICAgICAgICAgfSBl
bHNlCisgICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgfQorICAgIH0K
KworICAgIGlmIChhbGxvd1BsYWluVGV4dCAmJiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxl
KENGX1RFWFQpKSB7CisgICAgICAgIGNob3NlUGxhaW5UZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYg
KDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICAgICAgSEFORExFIGNiRGF0YSA9
IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKKyAgICAgICAgICAgIGlmIChjYkRhdGEpIHsK
KyAgICAgICAgICAgICAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopR2xvYmFsTG9jayhjYkRhdGEp
OworICAgICAgICAgICAgICAgIFN0cmluZyBzdHIoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBH
bG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOwor
ICAgICAgICAgICAgICAgIFJlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBmcmFnbWVudCA9IGNyZWF0
ZUZyYWdtZW50RnJvbVRleHQoY29udGV4dC5nZXQoKSwgc3RyKTsKKyAgICAgICAgICAgICAgICBp
ZiAoZnJhZ21lbnQpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcmFnbWVudC5yZWxlYXNl
KCk7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgp
OworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK2Jvb2wgUGFzdGVib2Fy
ZDo6aGFzRGF0YSgpCit7CisgICAgcmV0dXJuIGhhc0RhdGFJbkZvcm1hdChDRl9VTklDT0RFVEVY
VCkgfHwgaGFzRGF0YUluRm9ybWF0KENGX1RFWFQpOworfQorCitib29sIFBhc3RlYm9hcmQ6Omhh
c0RhdGFJbkZvcm1hdCh1bnNpZ25lZCBpbnQgZm9ybWF0KQoreworICAgIHJldHVybiA6OklzQ2xp
cGJvYXJkRm9ybWF0QXZhaWxhYmxlKGZvcm1hdCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYkNv
cmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2lu
Y2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5jZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExMTI5MgotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3BwCkBA
IC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVG9yY2ggTW9iaWxlIElu
Yy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry
aWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu
c2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3
YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNv
cHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNlYXJjaFBvcHVwTWVudS5oIgorCisj
aW5jbHVkZSAiQXRvbWljU3RyaW5nLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU2VhcmNo
UG9wdXBNZW51OjpTZWFyY2hQb3B1cE1lbnUoUG9wdXBNZW51Q2xpZW50KiBjbGllbnQpCis6IFBv
cHVwTWVudShjbGllbnQpCit7Cit9CisKK2Jvb2wgU2VhcmNoUG9wdXBNZW51OjplbmFibGVkKCkK
K3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgU2VhcmNoUG9wdXBNZW51OjpzYXZlUmVj
ZW50U2VhcmNoZXMoY29uc3QgQXRvbWljU3RyaW5nJiBuYW1lLCBjb25zdCBWZWN0b3I8U3RyaW5n
PiYgc2VhcmNoSXRlbXMpCit7CisgICAgaWYgKG5hbWUuaXNFbXB0eSgpKQorICAgICAgICByZXR1
cm47CisKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIFNlYXJjaFBvcHVwTWVudTo6
bG9hZFJlY2VudFNlYXJjaGVzKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgVmVjdG9yPFN0cmlu
Zz4mIHNlYXJjaEl0ZW1zKQoreworICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34383</attachid>
            <date>2009-08-08 11:30:41 -0700</date>
            <delta_ts>2009-08-12 12:28:38 -0700</delta_ts>
            <desc>8) Pasteboard &amp; SearchPopupMenu</desc>
            <filename>27543_8.patch</filename>
            <type>text/plain</type>
            <size>13206</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uNmI2N2ZkNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wOC0wOCAgSm9lIE1hc29uICA8
am9lLm1hc29uQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBQYXN0ZWJvYXJkIGFuZCBTZWFyY2hQb3B1
cE1lbnUKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3
NTQzCisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9QYXN0ZWJvYXJkV2luY2UuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9TZWFyY2hQb3B1cE1lbnVXaW5jZS5jcHA6IEFk
ZGVkLgorCiAyMDA5LTA4LTA2ICBZb25nIExpICA8eW9uZy5saUB0b3JjaG1vYmlsZS5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL1Bhc3RlYm9hcmRXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uY2JhODViOAotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvUGFz
dGVib2FyZFdpbmNlLmNwcApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA3LTIwMDkgVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKworI2luY2x1ZGUgImNv
bmZpZy5oIgorI2luY2x1ZGUgIlBhc3RlYm9hcmQuaCIKKworI2luY2x1ZGUgIkNTdHJpbmcuaCIK
KyNpbmNsdWRlICJDbGlwYm9hcmRVdGlsaXRpZXNXaW4uaCIKKyNpbmNsdWRlICJEb2N1bWVudC5o
IgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21lbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisj
aW5jbHVkZSAiRnJhbWUuaCIKKyNpbmNsdWRlICJIaXRUZXN0UmVzdWx0LmgiCisjaW5jbHVkZSAi
SW1hZ2UuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiUGFnZS5oIgorI2luY2x1ZGUg
IlJhbmdlLmgiCisjaW5jbHVkZSAiUmVuZGVySW1hZ2UuaCIKKyNpbmNsdWRlICJUZXh0RW5jb2Rp
bmcuaCIKKyNpbmNsdWRlICJtYXJrdXAuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0
aWMgVUlOVCBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0gMDsKK3N0YXRpYyBVSU5UIEJvb2ttYXJrQ2xp
cGJvYXJkRm9ybWF0ID0gMDsKK3N0YXRpYyBVSU5UIFdlYlNtYXJ0UGFzdGVGb3JtYXQgPSAwOwor
CitleHRlcm4gSERDIGhTY3JlZW5EQzsKKworc3RhdGljIExSRVNVTFQgQ0FMTEJBQ0sgUGFzdGVi
b2FyZE93bmVyV25kUHJvYyhIV05EIGhXbmQsIFVJTlQgbWVzc2FnZSwgV1BBUkFNIHdQYXJhbSwg
TFBBUkFNIGxQYXJhbSkKK3sKKyAgICBMUkVTVUxUIGxyZXN1bHQgPSAwOworICAgIExPTkcgbG9u
Z1B0ciA9IEdldFdpbmRvd0xvbmcoaFduZCwgMCk7CisKKyAgICBzd2l0Y2ggKG1lc3NhZ2UpIHsK
KyAgICBjYXNlIFdNX1JFTkRFUkZPUk1BVDoKKyAgICAgICAgLy8gVGhpcyBtZXNzYWdlIGNvbWVz
IHdoZW4gU2V0Q2xpcGJvYXJkRGF0YSB3YXMgc2VudCBhIG51bGwgZGF0YSBoYW5kbGUKKyAgICAg
ICAgLy8gYW5kIG5vdyBpdCdzIGNvbWUgdGltZSB0byBwdXQgdGhlIGRhdGEgb24gdGhlIGNsaXBi
b2FyZC4KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9SRU5ERVJBTExGT1JNQVRTOgorICAg
ICAgICAvLyBUaGlzIG1lc3NhZ2UgY29tZXMgd2hlbiBTZXRDbGlwYm9hcmREYXRhIHdhcyBzZW50
IGEgbnVsbCBkYXRhIGhhbmRsZQorICAgICAgICAvLyBhbmQgbm93IHRoaXMgYXBwbGljYXRpb24g
aXMgYWJvdXQgdG8gcXVpdCwgc28gaXQgbXVzdCBwdXQgZGF0YSBvbgorICAgICAgICAvLyB0aGUg
Y2xpcGJvYXJkIGJlZm9yZSBpdCBleGl0cy4KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBXTV9E
RVNUUk9ZOgorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBscmVzdWx0ID0g
RGVmV2luZG93UHJvYyhoV25kLCBtZXNzYWdlLCB3UGFyYW0sIGxQYXJhbSk7CisgICAgICAgIGJy
ZWFrOworICAgIH0KKyAgICByZXR1cm4gbHJlc3VsdDsKK30KKworUGFzdGVib2FyZCogUGFzdGVi
b2FyZDo6Z2VuZXJhbFBhc3RlYm9hcmQoKQoreworICAgIHN0YXRpYyBQYXN0ZWJvYXJkKiBwYXN0
ZWJvYXJkID0gbmV3IFBhc3RlYm9hcmQ7CisgICAgcmV0dXJuIHBhc3RlYm9hcmQ7Cit9CisKK1Bh
c3RlYm9hcmQ6OlBhc3RlYm9hcmQoKQoreworICAgIC8vIG1ha2UgYSBkdW1teSBIV05EIHRvIGJl
IHRoZSBXaW5kb3dzIGNsaXBib2FyZCdzIG93bmVyCisgICAgV05EQ0xBU1Mgd2MgPSB7MH07Cisg
ICAgbWVtc2V0KCZ3YywgMCwgc2l6ZW9mKHdjKSk7CisgICAgd2MubHBmblduZFByb2MgICAgPSBQ
YXN0ZWJvYXJkT3duZXJXbmRQcm9jOworICAgIHdjLmhJbnN0YW5jZSAgICAgID0gUGFnZTo6aW5z
dGFuY2VIYW5kbGUoKTsKKyAgICB3Yy5scHN6Q2xhc3NOYW1lICA9IEwiUGFzdGVib2FyZE93bmVy
V2luZG93Q2xhc3MiOworICAgIDo6UmVnaXN0ZXJDbGFzcygmd2MpOworCisgICAgbV9vd25lciA9
IDo6Q3JlYXRlV2luZG93KEwiUGFzdGVib2FyZE93bmVyV2luZG93Q2xhc3MiLCBMIlBhc3RlYm9h
cmRPd25lcldpbmRvdyIsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgIEhXTkRfTUVTU0FHRSwgMCwg
MCwgMCk7CisKKyAgICBIVE1MQ2xpcGJvYXJkRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBib2FyZEZv
cm1hdChMIkhUTUwgRm9ybWF0Iik7CisgICAgQm9va21hcmtDbGlwYm9hcmRGb3JtYXQgPSA6OlJl
Z2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiVW5pZm9ybVJlc291cmNlTG9jYXRvclciKTsKKyAgICBX
ZWJTbWFydFBhc3RlRm9ybWF0ID0gOjpSZWdpc3RlckNsaXBib2FyZEZvcm1hdChMIldlYktpdCBT
bWFydCBQYXN0ZSBGb3JtYXQiKTsKK30KKwordm9pZCBQYXN0ZWJvYXJkOjpjbGVhcigpCit7Cisg
ICAgaWYgKDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICA6OkVtcHR5Q2xpcGJv
YXJkKCk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9Cit9CisKK3ZvaWQgUGFz
dGVib2FyZDo6d3JpdGVTZWxlY3Rpb24oUmFuZ2UqIHNlbGVjdGVkUmFuZ2UsIGJvb2wgY2FuU21h
cnRDb3B5T3JEZWxldGUsIEZyYW1lKiBmcmFtZSkKK3sKKyAgICBjbGVhcigpOworCisgICAgLy8g
UHV0IENGX0hUTUwgZm9ybWF0IG9uIHRoZSBwYXN0ZWJvYXJkCisgICAgaWYgKDo6T3BlbkNsaXBi
b2FyZChtX293bmVyKSkgeworICAgICAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICAgICAg
VmVjdG9yPGNoYXI+IGRhdGE7CisgICAgICAgIG1hcmt1cFRvQ0ZfSFRNTChjcmVhdGVNYXJrdXAo
c2VsZWN0ZWRSYW5nZSwgMCwgQW5ub3RhdGVGb3JJbnRlcmNoYW5nZSksIHNlbGVjdGVkUmFuZ2Ut
PnN0YXJ0Q29udGFpbmVyKGVjKS0+ZG9jdW1lbnQoKS0+dXJsKCksIGRhdGEpOworICAgICAgICBI
R0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2JhbERhdGEoZGF0YSk7CisgICAgICAgIGlmICghOjpT
ZXRDbGlwYm9hcmREYXRhKEhUTUxDbGlwYm9hcmRGb3JtYXQsIGNiRGF0YSkpCisgICAgICAgICAg
ICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKKyAgICAgICAgOjpDbG9zZUNsaXBib2FyZCgpOworICAg
IH0KKworICAgIC8vIFB1dCBwbGFpbiBzdHJpbmcgb24gdGhlIHBhc3RlYm9hcmQuIENGX1VOSUNP
REVURVhUIGNvdmVycyBDRl9URVhUIGFzIHdlbGwKKyAgICBTdHJpbmcgc3RyID0gZnJhbWUtPnNl
bGVjdGVkVGV4dCgpOworICAgIHJlcGxhY2VOZXdsaW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5l
cyhzdHIpOworICAgIHJlcGxhY2VOQlNQV2l0aFNwYWNlKHN0cik7CisgICAgaWYgKDo6T3BlbkNs
aXBib2FyZChtX293bmVyKSkgeworICAgICAgICBIR0xPQkFMIGNiRGF0YSA9IGNyZWF0ZUdsb2Jh
bERhdGEoc3RyKTsKKyAgICAgICAgaWYgKCE6OlNldENsaXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRF
WFQsIGNiRGF0YSkpCisgICAgICAgICAgICA6Okdsb2JhbEZyZWUoY2JEYXRhKTsKKyAgICAgICAg
OjpDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIC8vIGVuYWJsZSBzbWFydC1yZXBsYWNp
bmcgbGF0ZXIgb24gYnkgcHV0dGluZyBkdW1teSBkYXRhIG9uIHRoZSBwYXN0ZWJvYXJkCisgICAg
aWYgKGNhblNtYXJ0Q29weU9yRGVsZXRlKSB7CisgICAgICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQo
bV9vd25lcikpIHsKKyAgICAgICAgICAgIDo6U2V0Q2xpcGJvYXJkRGF0YShXZWJTbWFydFBhc3Rl
Rm9ybWF0LCAwKTsKKyAgICAgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICAgICAgfQor
ICAgIH0KK30KKwordm9pZCBQYXN0ZWJvYXJkOjp3cml0ZVVSTChjb25zdCBLVVJMJiB1cmwsIGNv
bnN0IFN0cmluZyYgdGl0bGVTdHIsIEZyYW1lKiBmcmFtZSkKK3sKKyAgICBBU1NFUlQoIXVybC5p
c0VtcHR5KCkpOworCisgICAgY2xlYXIoKTsKKworICAgIFN0cmluZyB0aXRsZSh0aXRsZVN0cik7
CisgICAgaWYgKHRpdGxlLmlzRW1wdHkoKSkgeworICAgICAgICB0aXRsZSA9IHVybC5sYXN0UGF0
aENvbXBvbmVudCgpOworICAgICAgICBpZiAodGl0bGUuaXNFbXB0eSgpKQorICAgICAgICAgICAg
dGl0bGUgPSB1cmwuaG9zdCgpOworICAgIH0KKworICAgIC8vIHdyaXRlIHRvIGNsaXBib2FyZCBp
biBmb3JtYXQgY29tLmFwcGxlLnNhZmFyaS5ib29rbWFya2RhdGEgdG8gYmUgYWJsZSB0byBwYXN0
ZSBpbnRvIHRoZSBib29rbWFya3MgdmlldyB3aXRoIGFwcHJvcHJpYXRlIHRpdGxlCisgICAgaWYg
KDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICBIR0xPQkFMIGNiRGF0YSA9IGNy
ZWF0ZUdsb2JhbERhdGEodXJsLCB0aXRsZSk7CisgICAgICAgIGlmICghOjpTZXRDbGlwYm9hcmRE
YXRhKEJvb2ttYXJrQ2xpcGJvYXJkRm9ybWF0LCBjYkRhdGEpKQorICAgICAgICAgICAgOjpHbG9i
YWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAg
ICAvLyB3cml0ZSB0byBjbGlwYm9hcmQgaW4gZm9ybWF0IENGX0hUTUwgdG8gYmUgYWJsZSB0byBw
YXN0ZSBpbnRvIGNvbnRlbnRlZGl0YWJsZSBhcmVhcyBhcyBhIGxpbmsKKyAgICBpZiAoOjpPcGVu
Q2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIFZlY3RvcjxjaGFyPiBkYXRhOworICAgICAg
ICBtYXJrdXBUb0NGX0hUTUwodXJsVG9NYXJrdXAodXJsLCB0aXRsZSksICIiLCBkYXRhKTsKKyAg
ICAgICAgSEdMT0JBTCBjYkRhdGEgPSBjcmVhdGVHbG9iYWxEYXRhKGRhdGEpOworICAgICAgICBp
ZiAoITo6U2V0Q2xpcGJvYXJkRGF0YShIVE1MQ2xpcGJvYXJkRm9ybWF0LCBjYkRhdGEpKQorICAg
ICAgICAgICAgOjpHbG9iYWxGcmVlKGNiRGF0YSk7CisgICAgICAgIDo6Q2xvc2VDbGlwYm9hcmQo
KTsKKyAgICB9CisKKyAgICAvLyBiYXJlLWJvbmVzIENGX1VOSUNPREVURVhUIHN1cHBvcnQKKyAg
ICBpZiAoOjpPcGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhHTE9CQUwgY2JEYXRh
ID0gY3JlYXRlR2xvYmFsRGF0YSh1cmwuc3RyaW5nKCkpOworICAgICAgICBpZiAoITo6U2V0Q2xp
cGJvYXJkRGF0YShDRl9VTklDT0RFVEVYVCwgY2JEYXRhKSkKKyAgICAgICAgICAgIDo6R2xvYmFs
RnJlZShjYkRhdGEpOworICAgICAgICA6OkNsb3NlQ2xpcGJvYXJkKCk7CisgICAgfQorfQorCit2
b2lkIFBhc3RlYm9hcmQ6OndyaXRlSW1hZ2UoTm9kZSogbm9kZSwgY29uc3QgS1VSTCYsIGNvbnN0
IFN0cmluZyYpCit7CisgICAgQVNTRVJUKG5vZGUgJiYgbm9kZS0+cmVuZGVyZXIoKSAmJiBub2Rl
LT5yZW5kZXJlcigpLT5pc0ltYWdlKCkpOworICAgIFJlbmRlckltYWdlKiByZW5kZXJlciA9IHN0
YXRpY19jYXN0PFJlbmRlckltYWdlKj4obm9kZS0+cmVuZGVyZXIoKSk7CisgICAgQ2FjaGVkSW1h
Z2UqIGNhY2hlZEltYWdlID0gc3RhdGljX2Nhc3Q8Q2FjaGVkSW1hZ2UqPihyZW5kZXJlci0+Y2Fj
aGVkSW1hZ2UoKSk7CisgICAgQVNTRVJUKGNhY2hlZEltYWdlKTsKKyAgICBJbWFnZSogaW1hZ2Ug
PSBjYWNoZWRJbWFnZS0+aW1hZ2UoKTsKKyAgICBBU1NFUlQoaW1hZ2UpOworCisgICAgY2xlYXIo
KTsKKworICAgIFJlZlB0cjxTaGFyZWRCaXRtYXA+IHNvdXJjZUJtcCA9IGltYWdlLT5uYXRpdmVJ
bWFnZUZvckN1cnJlbnRGcmFtZSgpOworICAgIGlmICghc291cmNlQm1wKQorICAgICAgICByZXR1
cm47CisKKyAgICBJbnRSZWN0IHJlY3QoMCwgMCwgc291cmNlQm1wLT53aWR0aCgpLCBzb3VyY2VC
bXAtPmhlaWdodCgpKTsKKyAgICBCaXRtYXBJbmZvIGJtcEluZm87CisgICAgdm9pZCogcGl4ZWxz
OworICAgIEhCSVRNQVAgcmVzdWx0Qml0bWFwID0gc291cmNlQm1wLT5jbGlwQml0bWFwKHJlY3Qs
IHRydWUsIGJtcEluZm8sIHBpeGVscyk7CisgICAgaWYgKCFyZXN1bHRCaXRtYXApCisgICAgICAg
IHJldHVybjsKKworICAgIGlmICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAg
OjpTZXRDbGlwYm9hcmREYXRhKENGX0JJVE1BUCwgcmVzdWx0Qml0bWFwKTsKKyAgICAgICAgOjpD
bG9zZUNsaXBib2FyZCgpOworICAgIH0gZWxzZQorICAgICAgICBEZWxldGVPYmplY3QocmVzdWx0
Qml0bWFwKTsKK30KKworYm9vbCBQYXN0ZWJvYXJkOjpjYW5TbWFydFJlcGxhY2UoKQoreworICAg
IHJldHVybiA6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKFdlYlNtYXJ0UGFzdGVGb3JtYXQp
OworfQorCitTdHJpbmcgUGFzdGVib2FyZDo6cGxhaW5UZXh0KEZyYW1lKiBmcmFtZSkKK3sKKyAg
ICBpZiAoOjpJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZShDRl9VTklDT0RFVEVYVCkgJiYgOjpP
cGVuQ2xpcGJvYXJkKG1fb3duZXIpKSB7CisgICAgICAgIEhBTkRMRSBjYkRhdGEgPSA6OkdldENs
aXBib2FyZERhdGEoQ0ZfVU5JQ09ERVRFWFQpOworICAgICAgICBpZiAoY2JEYXRhKSB7CisgICAg
ICAgICAgICBVQ2hhciogYnVmZmVyID0gKFVDaGFyKilHbG9iYWxMb2NrKGNiRGF0YSk7CisgICAg
ICAgICAgICBTdHJpbmcgZnJvbUNsaXBib2FyZChidWZmZXIpOworICAgICAgICAgICAgR2xvYmFs
VW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgICAgICAg
ICAgcmV0dXJuIGZyb21DbGlwYm9hcmQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgQ2xv
c2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICBpZiAoOjpJc0NsaXBib2FyZEZvcm1hdEF2YWls
YWJsZShDRl9URVhUKSAmJiA6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgSEFO
RExFIGNiRGF0YSA9IDo6R2V0Q2xpcGJvYXJkRGF0YShDRl9URVhUKTsKKyAgICAgICAgaWYgKGNi
RGF0YSkgeworICAgICAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKUdsb2JhbExvY2soY2JE
YXRhKTsKKyAgICAgICAgICAgIFN0cmluZyBmcm9tQ2xpcGJvYXJkKGJ1ZmZlcik7CisgICAgICAg
ICAgICBHbG9iYWxVbmxvY2soY2JEYXRhKTsKKyAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7
CisgICAgICAgICAgICByZXR1cm4gZnJvbUNsaXBib2FyZDsKKyAgICAgICAgfSBlbHNlCisgICAg
ICAgICAgICBDbG9zZUNsaXBib2FyZCgpOworICAgIH0KKworICAgIHJldHVybiBTdHJpbmcoKTsK
K30KKworUGFzc1JlZlB0cjxEb2N1bWVudEZyYWdtZW50PiBQYXN0ZWJvYXJkOjpkb2N1bWVudEZy
YWdtZW50KEZyYW1lKiBmcmFtZSwgUGFzc1JlZlB0cjxSYW5nZT4gY29udGV4dCwgYm9vbCBhbGxv
d1BsYWluVGV4dCwgYm9vbCYgY2hvc2VQbGFpblRleHQpCit7CisgICAgY2hvc2VQbGFpblRleHQg
PSBmYWxzZTsKKworICAgIGlmICg6OklzQ2xpcGJvYXJkRm9ybWF0QXZhaWxhYmxlKEhUTUxDbGlw
Ym9hcmRGb3JtYXQpICYmIDo6T3BlbkNsaXBib2FyZChtX293bmVyKSkgeworICAgICAgICAvLyBn
ZXQgZGF0YSBvZmYgb2YgY2xpcGJvYXJkCisgICAgICAgIEhBTkRMRSBjYkRhdGEgPSA6OkdldENs
aXBib2FyZERhdGEoSFRNTENsaXBib2FyZEZvcm1hdCk7CisgICAgICAgIGlmIChjYkRhdGEpIHsK
KyAgICAgICAgICAgIFNJWkVfVCBkYXRhU2l6ZSA9IDo6R2xvYmFsU2l6ZShjYkRhdGEpOworICAg
ICAgICAgICAgU3RyaW5nIGNmX2h0bWwoVVRGOEVuY29kaW5nKCkuZGVjb2RlKChjaGFyKilHbG9i
YWxMb2NrKGNiRGF0YSksIGRhdGFTaXplKSk7CisgICAgICAgICAgICBHbG9iYWxVbmxvY2soY2JE
YXRhKTsKKyAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisKKyAgICAgICAgICAgIFBhc3NS
ZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBmcmFnbWVudEZyb21DRl9IVE1MKGZy
YW1lLT5kb2N1bWVudCgpLCBjZl9odG1sKTsKKyAgICAgICAgICAgIGlmIChmcmFnbWVudCkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQ7CisgICAgICAgIH0gZWxzZQorICAgICAgICAg
ICAgQ2xvc2VDbGlwYm9hcmQoKTsKKyAgICB9CisKKyAgICBpZiAoYWxsb3dQbGFpblRleHQgJiYg
SXNDbGlwYm9hcmRGb3JtYXRBdmFpbGFibGUoQ0ZfVU5JQ09ERVRFWFQpKSB7CisgICAgICAgIGNo
b3NlUGxhaW5UZXh0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKE9wZW5DbGlwYm9hcmQobV9vd25lcikp
IHsKKyAgICAgICAgICAgIEhBTkRMRSBjYkRhdGEgPSBHZXRDbGlwYm9hcmREYXRhKENGX1VOSUNP
REVURVhUKTsKKyAgICAgICAgICAgIGlmIChjYkRhdGEpIHsKKyAgICAgICAgICAgICAgICBVQ2hh
ciogYnVmZmVyID0gKFVDaGFyKilHbG9iYWxMb2NrKGNiRGF0YSk7CisgICAgICAgICAgICAgICAg
U3RyaW5nIHN0cihidWZmZXIpOworICAgICAgICAgICAgICAgIEdsb2JhbFVubG9jayhjYkRhdGEp
OworICAgICAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgICAgICAgICAgUmVm
UHRyPERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnRGcm9tVGV4dChj
b250ZXh0LmdldCgpLCBzdHIpOworICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudCkKKyAgICAg
ICAgICAgICAgICAgICAgcmV0dXJuIGZyYWdtZW50LnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0g
ZWxzZQorICAgICAgICAgICAgICAgIENsb3NlQ2xpcGJvYXJkKCk7CisgICAgICAgIH0KKyAgICB9
CisKKyAgICBpZiAoYWxsb3dQbGFpblRleHQgJiYgOjpJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJs
ZShDRl9URVhUKSkgeworICAgICAgICBjaG9zZVBsYWluVGV4dCA9IHRydWU7CisgICAgICAgIGlm
ICg6Ok9wZW5DbGlwYm9hcmQobV9vd25lcikpIHsKKyAgICAgICAgICAgIEhBTkRMRSBjYkRhdGEg
PSA6OkdldENsaXBib2FyZERhdGEoQ0ZfVEVYVCk7CisgICAgICAgICAgICBpZiAoY2JEYXRhKSB7
CisgICAgICAgICAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKUdsb2JhbExvY2soY2JEYXRh
KTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgc3RyKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAg
R2xvYmFsVW5sb2NrKGNiRGF0YSk7CisgICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQoKTsK
KyAgICAgICAgICAgICAgICBSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnQgPSBjcmVh
dGVGcmFnbWVudEZyb21UZXh0KGNvbnRleHQuZ2V0KCksIHN0cik7CisgICAgICAgICAgICAgICAg
aWYgKGZyYWdtZW50KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJhZ21lbnQucmVsZWFz
ZSgpOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgQ2xvc2VDbGlwYm9hcmQo
KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAwOworfQorCitib29sIFBhc3RlYm9h
cmQ6Omhhc0RhdGEoKQoreworICAgIHJldHVybiBoYXNEYXRhSW5Gb3JtYXQoQ0ZfVU5JQ09ERVRF
WFQpIHx8IGhhc0RhdGFJbkZvcm1hdChDRl9URVhUKTsKK30KKworYm9vbCBQYXN0ZWJvYXJkOjpo
YXNEYXRhSW5Gb3JtYXQodW5zaWduZWQgaW50IGZvcm1hdCkKK3sKKyAgICByZXR1cm4gOjpJc0Ns
aXBib2FyZEZvcm1hdEF2YWlsYWJsZShmb3JtYXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJD
b3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NlYXJjaFBvcHVwTWVudVdp
bmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvU2VhcmNoUG9wdXBNZW51V2luY2UuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTEyOTIKLS0tIC9kZXYvbnVs
bAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL1NlYXJjaFBvcHVwTWVudVdpbmNlLmNwcApA
QCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJ
bmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJTZWFyY2hQb3B1cE1lbnUuaCIKKwor
I2luY2x1ZGUgIkF0b21pY1N0cmluZy5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK1NlYXJj
aFBvcHVwTWVudTo6U2VhcmNoUG9wdXBNZW51KFBvcHVwTWVudUNsaWVudCogY2xpZW50KQorOiBQ
b3B1cE1lbnUoY2xpZW50KQoreworfQorCitib29sIFNlYXJjaFBvcHVwTWVudTo6ZW5hYmxlZCgp
Cit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFNlYXJjaFBvcHVwTWVudTo6c2F2ZVJl
Y2VudFNlYXJjaGVzKGNvbnN0IEF0b21pY1N0cmluZyYgbmFtZSwgY29uc3QgVmVjdG9yPFN0cmlu
Zz4mIHNlYXJjaEl0ZW1zKQoreworICAgIGlmIChuYW1lLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBTZWFyY2hQb3B1cE1lbnU6
OmxvYWRSZWNlbnRTZWFyY2hlcyhjb25zdCBBdG9taWNTdHJpbmcmIG5hbWUsIFZlY3RvcjxTdHJp
bmc+JiBzZWFyY2hJdGVtcykKK3sKKyAgICBpZiAobmFtZS5pc0VtcHR5KCkpCisgICAgICAgIHJl
dHVybjsKKworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34384</attachid>
            <date>2009-08-08 11:32:32 -0700</date>
            <delta_ts>2009-08-12 12:32:42 -0700</delta_ts>
            <desc>9) MIMETypeRegistry</desc>
            <filename>27543_9.patch</filename>
            <type>text/plain</type>
            <size>5611</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NmI2N2ZkNy4uNGRjOWJjNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMCBAQAorMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgorCisgICAgICAgIFdJTkNFIFBPUlQ6IE1JTUVUeXBlUmVn
aXN0cnkKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3
NTQzCisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2UuY3Bw
OiBBZGRlZC4KKwogMjAwOS0wOC0wOCAgSm9lIE1hc29uICA8am9lLm1hc29uQHRvcmNobW9iaWxl
LmNvbT4KIAogICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBh
L1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbmNlLmNwcCBiL1dlYkNv
cmUvcGxhdGZvcm0vd2luY2UvTUlNRVR5cGVSZWdpc3RyeVdpbmNlLmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWNkZTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvV2ViQ29y
ZS9wbGF0Zm9ybS93aW5jZS9NSU1FVHlwZVJlZ2lzdHJ5V2luY2UuY3BwCkBAIC0wLDAgKzEsMTM1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA2LCAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIElu
Yy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENP
TVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09N
UFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiTUlNRVR5cGVSZWdpc3Ry
eS5oIgorCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbnJlZy5oPgorCituYW1l
c3BhY2UgV2ViQ29yZSB7CisKK3N0YXRpYyBTdHJpbmcgbWltZVR5cGVGb3JFeHRlbnNpb24oY29u
c3QgU3RyaW5nJiBleHRlbnNpb24pCit7CisgICAgU3RyaW5nIGV4dCA9ICIuIiArIGV4dGVuc2lv
bjsKKyAgICBXQ0hBUiBjb250ZW50VHlwZVN0clsyNTZdOworICAgIERXT1JEIGNvbnRlbnRUeXBl
U3RyTGVuID0gc2l6ZW9mKGNvbnRlbnRUeXBlU3RyKTsKKyAgICBEV09SRCB2YWx1ZVR5cGU7CisK
KyAgICBIS0VZIGtleTsKKyAgICBTdHJpbmcgcmVzdWx0OworICAgIGlmIChFUlJPUl9TVUNDRVNT
ICE9IFJlZ09wZW5LZXlFeChIS0VZX0NMQVNTRVNfUk9PVCwgZXh0LmNoYXJhY3RlcnNXaXRoTnVs
bFRlcm1pbmF0aW9uKCksIDAsIDAsICZrZXkpKQorICAgICAgICByZXR1cm4gcmVzdWx0OworCisg
ICAgaWYgKEVSUk9SX1NVQ0NFU1MgPT0gUmVnUXVlcnlWYWx1ZUV4KGtleSwgTCJDb250ZW50IFR5
cGUiLCAwLCAmdmFsdWVUeXBlLCAoTFBCWVRFKWNvbnRlbnRUeXBlU3RyLCAmY29udGVudFR5cGVT
dHJMZW4pICYmIHZhbHVlVHlwZSA9PSBSRUdfU1opCisgICAgICAgIHJlc3VsdCA9IFN0cmluZyhj
b250ZW50VHlwZVN0ciwgY29udGVudFR5cGVTdHJMZW4gLyBzaXplb2YoY29udGVudFR5cGVTdHJb
MF0pIC0gMSk7CisKKyAgICBSZWdDbG9zZUtleShrZXkpOworCisgICAgcmV0dXJuIHJlc3VsdDsK
K30KKworc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG1pbWV0eXBlTWFwOworCitzdGF0
aWMgdm9pZCBpbml0TUlNRVR5cGVFbnRlbnNpb25NYXAoKQoreworICAgIGlmIChtaW1ldHlwZU1h
cC5pc0VtcHR5KCkpIHsKKyAgICAgICAgLy9maWxsIHdpdGggaW5pdGlhbCB2YWx1ZXMKKyAgICAg
ICAgbWltZXR5cGVNYXAuYWRkKCJ0eHQiLCAidGV4dC9wbGFpbiIpOworICAgICAgICBtaW1ldHlw
ZU1hcC5hZGQoInBkZiIsICJhcHBsaWNhdGlvbi9wZGYiKTsKKyAgICAgICAgbWltZXR5cGVNYXAu
YWRkKCJwcyIsICJhcHBsaWNhdGlvbi9wb3N0c2NyaXB0Iik7CisgICAgICAgIG1pbWV0eXBlTWFw
LmFkZCgiaHRtbCIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJodG0i
LCAidGV4dC9odG1sIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgieG1sIiwgInRleHQveG1s
Iik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgieHNsIiwgInRleHQveHNsIik7CisgICAgICAg
IG1pbWV0eXBlTWFwLmFkZCgianMiLCAiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0Iik7CisgICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgieGh0bWwiLCAiYXBwbGljYXRpb24veGh0bWwreG1sIik7Cisg
ICAgICAgIG1pbWV0eXBlTWFwLmFkZCgicnNzIiwgImFwcGxpY2F0aW9uL3Jzcyt4bWwiKTsKKyAg
ICAgICAgbWltZXR5cGVNYXAuYWRkKCJ3ZWJhcmNoaXZlIiwgImFwcGxpY2F0aW9uL3gtd2ViYXJj
aGl2ZSIpOworICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInN2ZyIsICJpbWFnZS9zdmcreG1sIik7
CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgic3ZneiIsICJpbWFnZS9zdmcreG1sIik7CisgICAg
ICAgIG1pbWV0eXBlTWFwLmFkZCgianBnIiwgImltYWdlL2pwZWciKTsKKyAgICAgICAgbWltZXR5
cGVNYXAuYWRkKCJqcGVnIiwgImltYWdlL2pwZWciKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRk
KCJwbmciLCAiaW1hZ2UvcG5nIik7CisgICAgICAgIG1pbWV0eXBlTWFwLmFkZCgidGlmIiwgImlt
YWdlL3RpZmYiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJ0aWZmIiwgImltYWdlL3RpZmYi
KTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJpY28iLCAiaW1hZ2UvaWNvIik7CisgICAgICAg
IG1pbWV0eXBlTWFwLmFkZCgiY3VyIiwgImltYWdlL2ljbyIpOworICAgICAgICBtaW1ldHlwZU1h
cC5hZGQoImJtcCIsICJpbWFnZS9ibXAiKTsKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJjc3Mi
LCAidGV4dC9jc3MiKTsKKyAgICAgICAgLy8gRklYTUU6IEN1c3RvbSBmb250IHdvcmtzIG9ubHkg
d2hlbiBNSU1FIGlzICJ0ZXh0L3BsYWluIgorICAgICAgICBtaW1ldHlwZU1hcC5hZGQoInR0ZiIs
ICJ0ZXh0L3BsYWluIik7IC8vICJmb250L3R0ZiIKKyAgICAgICAgbWltZXR5cGVNYXAuYWRkKCJv
dGYiLCAidGV4dC9wbGFpbiIpOyAvLyAiZm9udC9vdGYiCisjaWYgRU5BQkxFKFdNTCkKKyAgICAg
ICAgbWltZXR5cGVNYXAuYWRkKCJ3bWwiLCAidGV4dC92bmQud2FwLndtbCIpOworI2VuZGlmCisj
aWYgRU5BQkxFKFdCWE1MKQorICAgICAgICBtaW1ldHlwZU1hcC5hZGQoIndieG1sIiwgImFwcGxp
Y2F0aW9uL3ZuZC53YXAud21sYyIpOworI2VuZGlmCisgICAgfQorfQorCitTdHJpbmcgTUlNRVR5
cGVSZWdpc3RyeTo6Z2V0UHJlZmVycmVkRXh0ZW5zaW9uRm9yTUlNRVR5cGUoY29uc3QgU3RyaW5n
JiB0eXBlKQoreworICAgIGlmICh0eXBlLmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIFN0cmlu
ZygpOworCisgICAgLy8gQXZvaWQgY29uZmxpY3RzIHdpdGggInR0ZiIgYW5kICJvdGYiCisgICAg
aWYgKGVxdWFsSWdub3JpbmdDYXNlKHR5cGUsICJ0ZXh0L3BsYWluIikpCisgICAgICAgIHJldHVy
biAidHh0IjsKKworICAgIGluaXRNSU1FVHlwZUVudGVuc2lvbk1hcCgpOworCisgICAgZm9yIChI
YXNoTWFwPFN0cmluZywgU3RyaW5nPjo6aXRlcmF0b3IgaSA9IG1pbWV0eXBlTWFwLmJlZ2luKCk7
IGkgIT0gbWltZXR5cGVNYXAuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoZXF1YWxJZ25vcmlu
Z0Nhc2UoaS0+c2Vjb25kLCB0eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBpLT5maXJzdDsKKyAg
ICB9CisKKyNpZiBFTkFCTEUoWEhUTUxNUCkKKyAgICBpZiAoZXF1YWxJZ25vcmluZ0Nhc2UoImFw
cGxpY2F0aW9uL3ZuZC53YXAueGh0bWwreG1sIiwgdHlwZSkpCisgICAgICAgIHJldHVybiBTdHJp
bmcoInhtbCIpOworI2VuZGlmCisKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK1N0cmluZyBN
SU1FVHlwZVJlZ2lzdHJ5OjpnZXRNSU1FVHlwZUZvckV4dGVuc2lvbihjb25zdCBTdHJpbmcgJmV4
dCkKK3sKKyAgICBpZiAoZXh0LmlzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOwor
CisgICAgaW5pdE1JTUVUeXBlRW50ZW5zaW9uTWFwKCk7CisKKyAgICBTdHJpbmcgcmVzdWx0ID0g
bWltZXR5cGVNYXAuZ2V0KGV4dC5sb3dlcigpKTsKKyAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSkg
eworICAgICAgICByZXN1bHQgPSBtaW1lVHlwZUZvckV4dGVuc2lvbihleHQpOworICAgICAgICBp
ZiAoIXJlc3VsdC5pc0VtcHR5KCkpCisgICAgICAgICAgICBtaW1ldHlwZU1hcC5hZGQoZXh0LCBy
ZXN1bHQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0LmlzRW1wdHkoKSA/ICJ1bmtub3duL3Vu
a25vd24iIDogcmVzdWx0OworfQorCit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34385</attachid>
            <date>2009-08-08 11:36:11 -0700</date>
            <delta_ts>2009-08-12 12:35:28 -0700</delta_ts>
            <desc>10) Cursor</desc>
            <filename>27543_10.patch</filename>
            <type>text/plain</type>
            <size>5512</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
NGRjOWJjNy4uZjgyNDY4NyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsNSArMSwxNiBAQAogMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlv
bmcubGlAdG9yY2htb2JpbGUuY29tPgogCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09Q
UyEpLgorCisgICAgICAgIFdJTkNFIFBPUlQ6IGltcGxlbWVudCBDdXJzb3IgZm9yIFdJTkNFLiBU
aGVyZSdzIG5vIHJlYWwgY3Vyc29yIG9uIG1vc3QKKyAgICAgICAgV2luTW9iIGRldmljZXMuIFdl
IHBhc3MgdGhlIGN1cnNvciBpbmZvIHRvIGFwcGxpY2F0aW9uLCB3aGljaCBzbyB0aGF0IAorICAg
ICAgICBjYW4gZGV0ZXJtaW5lIHdoYXQgdG8gZG8uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJr
aXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzU0MworCisgICAgICAgICogcGxhdGZvcm0vd2luY2Uv
Q3Vyc29yV2luY2UuY3BwOiBBZGRlZC4KKworMjAwOS0wOC0wOCAgWW9uZyBMaSAgPHlvbmcubGlA
dG9yY2htb2JpbGUuY29tPgorCiAgICAgICAgIFdJTkNFIFBPUlQ6IE1JTUVUeXBlUmVnaXN0cnkK
ICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3NTQzCiAK
ZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ3Vyc29yV2luY2UuY3BwIGIvV2Vi
Q29yZS9wbGF0Zm9ybS93aW5jZS9DdXJzb3JXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQK
aW5kZXggMDAwMDAwMC4uZTM1ZjFmOQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvQ3Vyc29yV2luY2UuY3BwCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsg
ZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGlu
IHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK
KyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhl
IGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICog
Qm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkN1cnNvci5oIgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK3N0cnVjdCBBbGxD
dXJzb3JzIHsKKyAgICBBbGxDdXJzb3JzKCkKKyAgICB7CisgICAgICAgIGZvciAoaW50IGkgPSAw
OyBpIDwgTnVtQ3Vyc29yVHlwZXM7ICsraSkKKyAgICAgICAgICAgIG1fY3Vyc29yc1tpXSA9IChD
dXJzb3JUeXBlKSBpOworICAgIH0KKyAgICBDdXJzb3IgbV9jdXJzb3JzW051bUN1cnNvclR5cGVz
XTsKK307CisKK3N0YXRpYyBjb25zdCBDdXJzb3ImIGdldEN1cnNvcihDdXJzb3JUeXBlIHR5cGUp
Cit7CisgICAgc3RhdGljIEFsbEN1cnNvcnMgYWxsQ3Vyc29yczsKKyAgICByZXR1cm4gYWxsQ3Vy
c29ycy5tX2N1cnNvcnNbdHlwZV07Cit9CisKK0N1cnNvcjo6Q3Vyc29yKGNvbnN0IEN1cnNvciYg
b3RoZXIpCis6IG1faW1wbChvdGhlci5tX2ltcGwpCit7Cit9CisKK0N1cnNvcjo6Q3Vyc29yKElt
YWdlKiBpbWcsIGNvbnN0IEludFBvaW50JiBob3RzcG90KQorOiBtX2ltcGwoQ3Vyc29yTm9uZSkK
K3sKK30KKworQ3Vyc29yOjp+Q3Vyc29yKCkKK3sKK30KKworQ3Vyc29yJiBDdXJzb3I6Om9wZXJh
dG9yPShjb25zdCBDdXJzb3ImIG90aGVyKQoreworICAgIG1faW1wbCA9IG90aGVyLm1faW1wbDsK
KyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0N1cnNvcjo6Q3Vyc29yKFBsYXRmb3JtQ3Vyc29yIGMp
Cis6IG1faW1wbChjKQoreworfQorCitjb25zdCBDdXJzb3ImIG5vbmVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yTm9uZSk7IH0KK2NvbnN0IEN1cnNvciYgcG9pbnRlckN1cnNvcigp
IHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JQb2ludGVyKTsgfQorY29uc3QgQ3Vyc29yJiBjcm9z
c0N1cnNvcigpICB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ3Jvc3MpOyB9Citjb25zdCBDdXJz
b3ImIGhhbmRDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29ySGFuZCk7IH0KK2NvbnN0
IEN1cnNvciYgaUJlYW1DdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQmVhbSk7IH0K
K2NvbnN0IEN1cnNvciYgd2FpdEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JXYWl0
KTsgfQorY29uc3QgQ3Vyc29yJiBoZWxwQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNv
ckhlbHApOyB9Citjb25zdCBDdXJzb3ImIG1vdmVDdXJzb3IoKSAgeyByZXR1cm4gZ2V0Q3Vyc29y
KEN1cnNvck1vdmUpOyB9Citjb25zdCBDdXJzb3ImIGVhc3RSZXNpemVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yRWFzdFJlc2l6ZSk7IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhSZXNp
emVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhSZXNpemUpOyB9Citjb25z
dCBDdXJzb3ImIG5vcnRoRWFzdFJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JOb3J0aEVhc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoV2VzdFJlc2l6ZUN1cnNv
cigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFdlc3RSZXNpemUpOyB9Citjb25zdCBD
dXJzb3ImIHNvdXRoUmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNvclNvdXRo
UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aEVhc3RSZXNpemVDdXJzb3IoKSB7IHJldHVy
biBnZXRDdXJzb3IoQ3Vyc29yU291dGhFYXN0UmVzaXplKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0
aFdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yU291dGhXZXN0UmVz
aXplKTsgfQorY29uc3QgQ3Vyc29yJiB3ZXN0UmVzaXplQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vy
c29yKEN1cnNvcldlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoU291dGhSZXNpemVD
dXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm9ydGhTb3V0aFJlc2l6ZSk7IH0KK2Nv
bnN0IEN1cnNvciYgZWFzdFdlc3RSZXNpemVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vy
c29yRWFzdFdlc3RSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoRWFzdFNvdXRoV2VzdFJl
c2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aEVhc3RTb3V0aFdlc3RS
ZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIG5vcnRoV2VzdFNvdXRoRWFzdFJlc2l6ZUN1cnNvcigp
IHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JOb3J0aFdlc3RTb3V0aEVhc3RSZXNpemUpOyB9Citj
b25zdCBDdXJzb3ImIGNvbHVtblJlc2l6ZUN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJz
b3JDb2x1bW5SZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHJvd1Jlc2l6ZUN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JSb3dSZXNpemUpOyB9Citjb25zdCBDdXJzb3ImIHZlcnRpY2Fs
VGV4dEN1cnNvcigpIHsgcmV0dXJuIGdldEN1cnNvcihDdXJzb3JWZXJ0aWNhbFRleHQpOyB9Citj
b25zdCBDdXJzb3ImIGNlbGxDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ2VsbCk7
IH0KK2NvbnN0IEN1cnNvciYgY29udGV4dE1lbnVDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3Io
Q3Vyc29yQ29udGV4dE1lbnUpOyB9Citjb25zdCBDdXJzb3ImIG5vRHJvcEN1cnNvcigpIHsgcmV0
dXJuIGdldEN1cnNvcihDdXJzb3JOb0Ryb3ApOyB9Citjb25zdCBDdXJzb3ImIG5vdEFsbG93ZWRD
dXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yTm90QWxsb3dlZCk7IH0KK2NvbnN0IEN1
cnNvciYgcHJvZ3Jlc3NDdXJzb3IoKSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yUHJvZ3Jlc3Mp
OyB9Citjb25zdCBDdXJzb3ImIGFsaWFzQ3Vyc29yKCkgeyByZXR1cm4gZ2V0Q3Vyc29yKEN1cnNv
ckFsaWFzKTsgfQorY29uc3QgQ3Vyc29yJiB6b29tSW5DdXJzb3IoKSB7IHJldHVybiBnZXRDdXJz
b3IoQ3Vyc29yWm9vbUluKTsgfQorY29uc3QgQ3Vyc29yJiB6b29tT3V0Q3Vyc29yKCkgeyByZXR1
cm4gZ2V0Q3Vyc29yKEN1cnNvclpvb21PdXQpOyB9Citjb25zdCBDdXJzb3ImIGNvcHlDdXJzb3Io
KSB7IHJldHVybiBnZXRDdXJzb3IoQ3Vyc29yQ29weSk7IH0KK2NvbnN0IEN1cnNvciYgbWlkZGxl
UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYg
ZWFzdFBhbm5pbmdDdXJzb3IoKSB7IHJldHVybiBjcm9zc0N1cnNvcigpOyB9Citjb25zdCBDdXJz
b3ImIG5vcnRoUGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0
IEN1cnNvciYgbm9ydGhFYXN0UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7
IH0KK2NvbnN0IEN1cnNvciYgbm9ydGhXZXN0UGFubmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3Nz
Q3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgc291dGhQYW5uaW5nQ3Vyc29yKCkgeyByZXR1cm4g
Y3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aEVhc3RQYW5uaW5nQ3Vyc29yKCkg
eyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiBzb3V0aFdlc3RQYW5uaW5n
Q3Vyc29yKCkgeyByZXR1cm4gY3Jvc3NDdXJzb3IoKTsgfQorY29uc3QgQ3Vyc29yJiB3ZXN0UGFu
bmluZ0N1cnNvcigpIHsgcmV0dXJuIGNyb3NzQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgZ3Jh
YmJpbmdDdXJzb3IoKSB7IHJldHVybiBtb3ZlQ3Vyc29yKCk7IH0KK2NvbnN0IEN1cnNvciYgZ3Jh
YkN1cnNvcigpIHsgcmV0dXJuIG1vdmVDdXJzb3IoKTsgfQorCit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34386</attachid>
            <date>2009-08-08 11:38:43 -0700</date>
            <delta_ts>2009-08-12 12:39:06 -0700</delta_ts>
            <desc>11) FileSystem and FileChooser</desc>
            <filename>27543_11.patch</filename>
            <type>text/plain</type>
            <size>12441</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZjgyNDY4Ny4uMjA3ZGE2ZSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTIsNiArMiwxNiBAQAogCiAgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgogCisgICAgICAgIFdJTkNFUE9SVDogRmlsZVN5c3RlbSBhbmQgRmlsZUNo
b29zZXIKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI3
NTQzCisKKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNwcDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvRmlsZVN5c3RlbVdpbmNlLmNwcDogQWRkZWQu
CisKKzIwMDktMDgtMDggIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KKworICAg
ICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwogICAgICAgICBXSU5DRSBQT1JUOiBp
bXBsZW1lbnQgQ3Vyc29yIGZvciBXSU5DRS4gVGhlcmUncyBubyByZWFsIGN1cnNvciBvbiBtb3N0
CiAgICAgICAgIFdpbk1vYiBkZXZpY2VzLiBXZSBwYXNzIHRoZSBjdXJzb3IgaW5mbyB0byBhcHBs
aWNhdGlvbiwgd2hpY2ggc28gdGhhdCAKICAgICAgICAgY2FuIGRldGVybWluZSB3aGF0IHRvIGRv
LgpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9GaWxlQ2hvb3NlcldpbmNlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5jZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdjOTliMQotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvRmlsZUNob29zZXJXaW5jZS5jcHAKQEAgLTAsMCArMSw2MCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkZpbGVDaG9vc2VyLmgiCisK
KyNpbmNsdWRlICJDaHJvbWUuaCIKKyNpbmNsdWRlICJDaHJvbWVDbGllbnQuaCIKKyNpbmNsdWRl
ICJEb2N1bWVudC5oIgorI2luY2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiSWNvbi5oIgorI2lu
Y2x1ZGUgIkxvY2FsaXplZFN0cmluZ3MuaCIKKyNpbmNsdWRlICJQYWdlLmgiCisjaW5jbHVkZSAi
U3RyaW5nVHJ1bmNhdG9yLmgiCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworU3RyaW5nIHBhdGhH
ZXRGaWxlTmFtZShjb25zdCBTdHJpbmcmIHBhdGgpOworCitTdHJpbmcgRmlsZUNob29zZXI6OmJh
c2VuYW1lRm9yV2lkdGgoY29uc3QgRm9udCYgZm9udCwgaW50IHdpZHRoKSBjb25zdAoreworICAg
IGlmICh3aWR0aCA8PSAwKQorICAgICAgICByZXR1cm4gU3RyaW5nKCk7CisKKyAgICBTdHJpbmcg
c3RyaW5nOworICAgIGlmIChtX2ZpbGVuYW1lcy5pc0VtcHR5KCkpCisgICAgICAgIHN0cmluZyA9
IGZpbGVCdXR0b25Ob0ZpbGVTZWxlY3RlZExhYmVsKCk7CisgICAgZWxzZSBpZiAobV9maWxlbmFt
ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgU3RyaW5nIHRtcEZpbGVuYW1lID0gbV9maWxlbmFt
ZXNbMF07CisgICAgICAgIHN0cmluZyA9IHBhdGhHZXRGaWxlTmFtZSh0bXBGaWxlbmFtZSk7Cisg
ICAgfSBlbHNlCisgICAgICAgIHJldHVybiBTdHJpbmdUcnVuY2F0b3I6OnJpZ2h0VHJ1bmNhdGUo
U3RyaW5nOjpudW1iZXIobV9maWxlbmFtZXMuc2l6ZSgpKSArICIgZmlsZXMiLCB3aWR0aCwgZm9u
dCwgZmFsc2UpOworCisgICAgcmV0dXJuIFN0cmluZ1RydW5jYXRvcjo6Y2VudGVyVHJ1bmNhdGUo
c3RyaW5nLCB3aWR0aCwgZm9udCwgZmFsc2UpOworfQorCit9CmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dp
bmNlL0ZpbGVTeXN0ZW1XaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MC4uMmJiNGRkNQotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRmls
ZVN5c3RlbVdpbmNlLmNwcApAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAwNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDggQ29sbGFib3JhLCBMdGQuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAorICogMi4g
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMy4g
IE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0
aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiAKKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJ
UyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwg
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5j
bHVkZSAiRmlsZVN5c3RlbS5oIgorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIlBs
YXRmb3JtU3RyaW5nLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8d2luY3J5
cHQuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitzdGF0aWMgYm9vbCBnZXRGaWxlSW5mbyhj
b25zdCBTdHJpbmcmIHBhdGgsIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OJiBmaWxlSW5mbykK
K3sKKyAgICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAgIEhBTkRMRSBoRmlsZSA9IENyZWF0
ZUZpbGUoZmlsZW5hbWUuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSwgR0VORVJJQ19S
RUFELCBGSUxFX1NIQVJFX1JFQUQsIDAKKyAgICAgICAgLCBPUEVOX0VYSVNUSU5HLCBGSUxFX0ZM
QUdfTk9fQlVGRkVSSU5HLCAwKTsKKworICAgIGlmIChoRmlsZSA9PSBJTlZBTElEX0hBTkRMRV9W
QUxVRSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBydG4gPSBHZXRGaWxlSW5m
b3JtYXRpb25CeUhhbmRsZShoRmlsZSwgJmZpbGVJbmZvKSA/IHRydWUgOiBmYWxzZTsKKworICAg
IENsb3NlSGFuZGxlKGhGaWxlKTsKKyAgICByZXR1cm4gcnRuOworfQorCitib29sIGdldEZpbGVT
aXplKGNvbnN0IFN0cmluZyYgcGF0aCwgbG9uZyBsb25nJiByZXN1bHQpCit7CisgICAgQllfSEFO
RExFX0ZJTEVfSU5GT1JNQVRJT04gZmlsZUluZm9ybWF0aW9uOworICAgIGlmICghZ2V0RmlsZUlu
Zm8ocGF0aCwgZmlsZUluZm9ybWF0aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAg
VUxBUkdFX0lOVEVHRVIgZmlsZVNpemU7CisgICAgZmlsZVNpemUuTG93UGFydCA9IGZpbGVJbmZv
cm1hdGlvbi5uRmlsZVNpemVMb3c7CisgICAgZmlsZVNpemUuSGlnaFBhcnQgPSBmaWxlSW5mb3Jt
YXRpb24ubkZpbGVTaXplSGlnaDsKKworICAgIHJlc3VsdCA9IGZpbGVTaXplLlF1YWRQYXJ0Owor
CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgZ2V0RmlsZU1vZGlmaWNhdGlvblRpbWUoY29u
c3QgU3RyaW5nJiBwYXRoLCB0aW1lX3QmIHJlc3VsdCkKK3sKKyAgICBCWV9IQU5ETEVfRklMRV9J
TkZPUk1BVElPTiBmaWxlSW5mb3JtYXRpb247CisgICAgaWYgKCFnZXRGaWxlSW5mbyhwYXRoLCBm
aWxlSW5mb3JtYXRpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBVTEFSR0VfSU5U
RUdFUiB0OworICAgIG1lbWNweSgmdCwgJmZpbGVJbmZvcm1hdGlvbi5mdExhc3RXcml0ZVRpbWUs
IHNpemVvZih0KSk7CisgICAgCisgICAgcmVzdWx0ID0gdC5RdWFkUGFydCAqIDAuMDAwMDAwMSAt
IDExNjQ0NDczNjAwLjA7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBmaWxlRXhpc3Rz
KGNvbnN0IFN0cmluZyYgcGF0aCkgCit7CisgICAgU3RyaW5nIGZpbGVuYW1lID0gcGF0aDsKKyAg
ICBIQU5ETEUgaEZpbGUgPSBDcmVhdGVGaWxlKGZpbGVuYW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRl
cm1pbmF0aW9uKCksIDAsIEZJTEVfU0hBUkVfUkVBRCB8IEZJTEVfU0hBUkVfV1JJVEUKKyAgICAg
ICAgLCAwLCBPUEVOX0VYSVNUSU5HLCBGSUxFX0ZMQUdfTk9fQlVGRkVSSU5HLCAwKTsKKworICAg
IENsb3NlSGFuZGxlKGhGaWxlKTsKKworICAgIHJldHVybiBoRmlsZSAhPSBJTlZBTElEX0hBTkRM
RV9WQUxVRTsKK30KKworYm9vbCBkZWxldGVGaWxlKGNvbnN0IFN0cmluZyYgcGF0aCkKK3sKKyAg
ICBTdHJpbmcgZmlsZW5hbWUgPSBwYXRoOworICAgIHJldHVybiAhIURlbGV0ZUZpbGVXKGZpbGVu
YW1lLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkpOworfQorCisKK2Jvb2wgZGVsZXRl
RW1wdHlEaXJlY3RvcnkoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIFN0cmluZyBmaWxlbmFt
ZSA9IHBhdGg7CisgICAgcmV0dXJuICEhUmVtb3ZlRGlyZWN0b3J5VyhmaWxlbmFtZS5jaGFyYWN0
ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKK30KKworU3RyaW5nIHBhdGhCeUFwcGVuZGluZ0Nv
bXBvbmVudChjb25zdCBTdHJpbmcmIHBhdGgsIGNvbnN0IFN0cmluZyYgY29tcG9uZW50KQorewor
ICAgIGlmIChjb21wb25lbnQuaXNFbXB0eSgpKQorICAgICAgICByZXR1cm4gcGF0aDsKKworICAg
IFZlY3RvcjxVQ2hhciwgTUFYX1BBVEg+IGJ1ZmZlcjsKKworICAgIGJ1ZmZlci5hcHBlbmQocGF0
aC5jaGFyYWN0ZXJzKCksIHBhdGgubGVuZ3RoKCkpOworCisgICAgaWYgKGJ1ZmZlci5sYXN0KCkg
IT0gTCdcXCcgJiYgYnVmZmVyLmxhc3QoKSAhPSBMJy8nCisgICAgICAgICYmIGNvbXBvbmVudFsw
XSAhPSBMJ1xcJyAmJiBjb21wb25lbnRbMF0gIT0gTCcvJykKKyAgICAgICAgYnVmZmVyLmFwcGVu
ZChMJ1xcJyk7CisKKyAgICBidWZmZXIuYXBwZW5kKGNvbXBvbmVudC5jaGFyYWN0ZXJzKCksIGNv
bXBvbmVudC5sZW5ndGgoKSk7CisKKyAgICByZXR1cm4gU3RyaW5nKGJ1ZmZlci5kYXRhKCksIGJ1
ZmZlci5zaXplKCkpOworfQorCitDU3RyaW5nIGZpbGVTeXN0ZW1SZXByZXNlbnRhdGlvbihjb25z
dCBTdHJpbmcmKQoreworICAgIHJldHVybiAiIjsKK30KKworYm9vbCBtYWtlQWxsRGlyZWN0b3Jp
ZXMoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIGludCBsYXN0RGl2UG9zID0gbWF4KHBhdGgu
cmV2ZXJzZUZpbmQoJy8nKSwgcGF0aC5yZXZlcnNlRmluZCgnXFwnKSk7CisgICAgaW50IGVuZFBv
cyA9IHBhdGgubGVuZ3RoKCk7CisgICAgaWYgKGxhc3REaXZQb3MgPT0gcGF0aC5sZW5ndGgoKSAt
IDEpIHsKKyAgICAgICAgZW5kUG9zIC09IDE7CisgICAgICAgIGxhc3REaXZQb3MgPSBtYXgocGF0
aC5yZXZlcnNlRmluZCgnLycsIGxhc3REaXZQb3MpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcsIGxh
c3REaXZQb3MpKTsKKyAgICB9CisKKyAgICBpZiAobGFzdERpdlBvcyA+IDApIHsKKyAgICAgICAg
aWYgKCFtYWtlQWxsRGlyZWN0b3JpZXMocGF0aC5zdWJzdHJpbmcoMCwgbGFzdERpdlBvcykpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZyBmb2xkZXIocGF0
aC5zdWJzdHJpbmcoMCwgZW5kUG9zKSk7CisgICAgQ3JlYXRlRGlyZWN0b3J5KGZvbGRlci5jaGFy
YWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCAwKTsKKworICAgIERXT1JEIGZpbGVBdHRyID0g
R2V0RmlsZUF0dHJpYnV0ZXMoZm9sZGVyLmNoYXJhY3RlcnNXaXRoTnVsbFRlcm1pbmF0aW9uKCkp
OworICAgIHJldHVybiBmaWxlQXR0ciAhPSAweEZGRkZGRkZGICYmIChmaWxlQXR0ciAmIEZJTEVf
QVRUUklCVVRFX0RJUkVDVE9SWSk7Cit9CisKK1N0cmluZyBob21lRGlyZWN0b3J5UGF0aCgpCit7
CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gIiI7Cit9CisKK1N0cmluZyBwYXRo
R2V0RmlsZU5hbWUoY29uc3QgU3RyaW5nJiBwYXRoKQoreworICAgIHJldHVybiBwYXRoLnN1YnN0
cmluZyhtYXgocGF0aC5yZXZlcnNlRmluZCgnLycpLCBwYXRoLnJldmVyc2VGaW5kKCdcXCcpKSAr
IDEpOworfQorCitTdHJpbmcgZGlyZWN0b3J5TmFtZShjb25zdCBTdHJpbmcmIHBhdGgpCit7Cisg
ICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gU3RyaW5nKCk7Cit9CisKK0NTdHJpbmcg
b3BlblRlbXBvcmFyeUZpbGUoY29uc3QgY2hhciosIFBsYXRmb3JtRmlsZUhhbmRsZSYgaGFuZGxl
KQoreworICAgIGhhbmRsZSA9IElOVkFMSURfSEFORExFX1ZBTFVFOworCisgICAgd2NoYXJfdCB0
ZW1wUGF0aFtNQVhfUEFUSF07CisgICAgaW50IHRlbXBQYXRoTGVuZ3RoID0gOjpHZXRUZW1wUGF0
aChfY291bnRvZih0ZW1wUGF0aCksIHRlbXBQYXRoKTsKKyAgICBpZiAodGVtcFBhdGhMZW5ndGgg
PD0gMCB8fCB0ZW1wUGF0aExlbmd0aCA+IF9jb3VudG9mKHRlbXBQYXRoKSkKKyAgICAgICAgcmV0
dXJuIENTdHJpbmcoKTsKKworICAgIEhDUllQVFBST1YgaENyeXB0UHJvdiA9IDA7CisgICAgaWYg
KCFDcnlwdEFjcXVpcmVDb250ZXh0KCZoQ3J5cHRQcm92LCAwLCAwLCBQUk9WX1JTQV9GVUxMLCBD
UllQVF9WRVJJRllDT05URVhUKSkKKyAgICAgICAgcmV0dXJuIENTdHJpbmcoKTsKKworICAgIFN0
cmluZyBwcm9wb3NlZFBhdGg7CisgICAgd2hpbGUgKDEpIHsKKworICAgICAgICB3Y2hhcl90IHRl
bXBGaWxlW10gPSBMIlhYWFhYWFhYLnRtcCI7IC8vIFVzZSA4LjMgc3R5bGUgbmFtZSAobW9yZSBj
aGFyYWN0ZXJzIGFyZW4ndCBoZWxwZnVsIGR1ZSB0byA4LjMgc2hvcnQgZmlsZSBuYW1lcykKKyAg
ICAgICAgY29uc3QgaW50IHJhbmRvbVBhcnRMZW5ndGggPSA4OworICAgICAgICBpZiAoIUNyeXB0
R2VuUmFuZG9tKGhDcnlwdFByb3YsIHJhbmRvbVBhcnRMZW5ndGggKiAyLCByZWludGVycHJldF9j
YXN0PEJZVEUqPih0ZW1wRmlsZSkpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8g
TGltaXQgdG8gdmFsaWQgZmlsZXN5c3RlbSBjaGFyYWN0ZXJzLCBhbHNvIGV4Y2x1ZGluZyBvdGhl
cnMgdGhhdCBjb3VsZCBiZSBwcm9ibGVtYXRpYywgbGlrZSBwdW5jdHVhdGlvbi4KKyAgICAgICAg
Ly8gZG9uJ3QgaW5jbHVkZSBib3RoIHVwcGVyIGFuZCBsb3dlcmNhc2Ugc2luY2UgV2luZG93cyBm
aWxlIHN5c3RlbXMgYXJlIHR5cGljYWxseSBub3QgY2FzZSBzZW5zaXRpdmUuCisgICAgICAgIGNv
bnN0IGNoYXIgdmFsaWRDaGFyc1tdID0gIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2
d3h5eiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFuZG9tUGFydExlbmd0aDsgKytp
KQorICAgICAgICAgICAgdGVtcEZpbGVbaV0gPSB2YWxpZENoYXJzW3RlbXBGaWxlW2ldICUgKHNp
emVvZih2YWxpZENoYXJzKSAtIDEpXTsKKworICAgICAgICBBU1NFUlQod2NzbGVuKHRlbXBGaWxl
KSAqIDIgPT0gc2l6ZW9mKHRlbXBGaWxlKSAtIDIpOworCisgICAgICAgIHByb3Bvc2VkUGF0aCA9
IHBhdGhCeUFwcGVuZGluZ0NvbXBvbmVudChTdHJpbmcodGVtcFBhdGgpLCBTdHJpbmcodGVtcEZp
bGUpKTsKKworICAgICAgICAvLyB1c2UgQ1JFQVRFX05FVyB0byBhdm9pZCBvdmVyd3JpdGluZyBh
biBleGlzdGluZyBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZQorICAgICAgICBoYW5kbGUgPSBDcmVh
dGVGaWxlKHByb3Bvc2VkUGF0aC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBHRU5F
UklDX1JFQUQgfCBHRU5FUklDX1dSSVRFLCAwLCAwLCBDUkVBVEVfTkVXLCBGSUxFX0FUVFJJQlVU
RV9OT1JNQUwsIDApOworICAgICAgICBpZiAoIWlzSGFuZGxlVmFsaWQoaGFuZGxlKSAmJiBHZXRM
YXN0RXJyb3IoKSA9PSBFUlJPUl9BTFJFQURZX0VYSVNUUykKKyAgICAgICAgICAgIGNvbnRpbnVl
OworCisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIENyeXB0UmVsZWFzZUNvbnRleHQoaENy
eXB0UHJvdiwgMCk7CisKKyAgICBpZiAoIWlzSGFuZGxlVmFsaWQoaGFuZGxlKSkKKyAgICAgICAg
cmV0dXJuIENTdHJpbmcoKTsKKworICAgIHJldHVybiBwcm9wb3NlZFBhdGgubGF0aW4xKCk7Cit9
CisKK3ZvaWQgY2xvc2VGaWxlKFBsYXRmb3JtRmlsZUhhbmRsZSYgaGFuZGxlKQoreworICAgIGlm
IChpc0hhbmRsZVZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgOjpDbG9zZUhhbmRsZShoYW5kbGUp
OworICAgICAgICBoYW5kbGUgPSBpbnZhbGlkUGxhdGZvcm1GaWxlSGFuZGxlOworICAgIH0KK30K
KworaW50IHdyaXRlVG9GaWxlKFBsYXRmb3JtRmlsZUhhbmRsZSBoYW5kbGUsIGNvbnN0IGNoYXIq
IGRhdGEsIGludCBsZW5ndGgpCit7CisgICAgaWYgKCFpc0hhbmRsZVZhbGlkKGhhbmRsZSkpCisg
ICAgICAgIHJldHVybiAtMTsKKworICAgIERXT1JEIGJ5dGVzV3JpdHRlbjsKKyAgICBib29sIHN1
Y2Nlc3MgPSBXcml0ZUZpbGUoaGFuZGxlLCBkYXRhLCBsZW5ndGgsICZieXRlc1dyaXR0ZW4sIDAp
OworCisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICByZXR1cm4gLTE7CisgICAgcmV0dXJuIHN0
YXRpY19jYXN0PGludD4oYnl0ZXNXcml0dGVuKTsKK30KKworYm9vbCB1bmxvYWRNb2R1bGUoUGxh
dGZvcm1Nb2R1bGUgbW9kdWxlKQoreworICAgIHJldHVybiA6OkZyZWVMaWJyYXJ5KG1vZHVsZSk7
Cit9CisKK1N0cmluZyBsb2NhbFVzZXJTcGVjaWZpY1N0b3JhZ2VEaXJlY3RvcnkoKQoreworICAg
IHJldHVybiBTdHJpbmcoTCJcXCIpOworfQorCitTdHJpbmcgcm9hbWluZ1VzZXJTcGVjaWZpY1N0
b3JhZ2VEaXJlY3RvcnkoKQoreworICAgIHJldHVybiBTdHJpbmcoTCJcXCIpOworfQorCitWZWN0
b3I8U3RyaW5nPiBsaXN0RGlyZWN0b3J5KGNvbnN0IFN0cmluZyYgcGF0aCwgY29uc3QgU3RyaW5n
JiBmaWx0ZXIpCit7CisgICAgVmVjdG9yPFN0cmluZz4gZW50cmllczsKKworICAgIFZlY3RvcjxV
Q2hhciwgMjU2PiBwYXR0ZXJuOworICAgIHBhdHRlcm4uYXBwZW5kKHBhdGguY2hhcmFjdGVycygp
LCBwYXRoLmxlbmd0aCgpKTsKKyAgICBpZiAocGF0dGVybi5sYXN0KCkgIT0gTCcvJyAmJiBwYXR0
ZXJuLmxhc3QoKSAhPSBMJ1xcJykKKyAgICAgICAgcGF0dGVybi5hcHBlbmQoTCdcXCcpOworCisg
ICAgU3RyaW5nIHJvb3QocGF0dGVybi5kYXRhKCksIHBhdHRlcm4uc2l6ZSgpKTsKKyAgICBwYXR0
ZXJuLmFwcGVuZChmaWx0ZXIuY2hhcmFjdGVycygpLCBmaWx0ZXIubGVuZ3RoKCkpOworICAgIHBh
dHRlcm4uYXBwZW5kKDApOworCisgICAgV0lOMzJfRklORF9EQVRBIGZpbmREYXRhOworICAgIEhB
TkRMRSBoRmluZCA9IEZpbmRGaXJzdEZpbGUocGF0dGVybi5kYXRhKCksICZmaW5kRGF0YSk7Cisg
ICAgaWYgKElOVkFMSURfSEFORExFX1ZBTFVFICE9IGhGaW5kKSB7CisgICAgICAgIGRvIHsKKyAg
ICAgICAgICAgIC8vIEZJWEVNRTogc2hvdWxkIHdlIGFsc28gYWRkIHRoZSBmb2xkZXJzPyBUaGlz
IGZ1bmN0aW9uCisgICAgICAgICAgICAvLyBpcyBzbyBmYXIgb25seSBjYWxsZWQgYnkgUGx1Z2lu
RGF0YWJhc2UuY3BwIHRvIGxpc3QKKyAgICAgICAgICAgIC8vIGFsbCBwbHVnaW5zIGluIGEgZm9s
ZGVyLCB3aGVyZSBpdCdzIG5vdCBzdXBwb3NlZCB0byBsaXN0IHN1Yi1mb2xkZXJzLgorICAgICAg
ICAgICAgaWYgKCEoZmluZERhdGEuZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJ
UkVDVE9SWSkpCisgICAgICAgICAgICAgICAgZW50cmllcy5hcHBlbmQocm9vdCArIGZpbmREYXRh
LmNGaWxlTmFtZSk7CisgICAgICAgIH0gd2hpbGUgKEZpbmROZXh0RmlsZShoRmluZCwgJmZpbmRE
YXRhKSk7CisgICAgICAgIEZpbmRDbG9zZShoRmluZCk7CisgICAgfQorCisgICAgcmV0dXJuIGVu
dHJpZXM7Cit9CisKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34387</attachid>
            <date>2009-08-08 11:41:38 -0700</date>
            <delta_ts>2009-08-12 12:41:33 -0700</delta_ts>
            <desc>12) Other (simple stubs to make it build)</desc>
            <filename>27543_12.patch</filename>
            <type>text/plain</type>
            <size>7318</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MjA3ZGE2ZS4uYWYxY2RkZiAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTIsNiArMiwxOCBAQAogCiAgICAgICAgIFJldmlld2VkIGJ5IE5P
Qk9EWSAoT09QUyEpLgogCisgICAgICAgIFdJTkNFIFBPUlQ6IHNpbXBsZSBzdHVicyB0byBtYWtl
IGl0IGJ1aWxkIGZvciBXSU5DRQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93
X2J1Zy5jZ2k/aWQ9Mjc1NDMKKworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0RyYWdEYXRhV2lu
Y2UuY3BwOiBBZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9EcmFnSW1hZ2VXaW5jZS5j
cHA6IEFkZGVkLgorICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0VkaXRvcldpbmNlLmNwcDogQWRk
ZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvS1VSTFdpbmNlLmNwcDogQWRkZWQuCisKKzIw
MDktMDgtMDggIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKwogICAgICAgICBXSU5DRVBPUlQ6IEZpbGVTeXN0
ZW0gYW5kIEZpbGVDaG9vc2VyCiAgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3df
YnVnLmNnaT9pZD0yNzU0MwogCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0Ry
YWdEYXRhV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnRGF0YVdpbmNlLmNw
cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODFkN2Q0Ci0tLSAvZGV2L251
bGwKKysrIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9EcmFnRGF0YVdpbmNlLmNwcApAQCAtMCww
ICsxLDkwIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwg
SW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0
aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJzaW9uIDIgb2YgdGhl
IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog
IFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUg
dXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBp
bXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5IEdlbmVyYWwgUHVi
bGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24sIE1BIDAyMTEwLTEz
MDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkRyYWdE
YXRhLmgiCisKKyNpbmNsdWRlICJDbGlwYm9hcmQuaCIKKyNpbmNsdWRlICJEb2N1bWVudEZyYWdt
ZW50LmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUg
eworCitQYXNzUmVmUHRyPENsaXBib2FyZD4gRHJhZ0RhdGE6OmNyZWF0ZUNsaXBib2FyZChDbGlw
Ym9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5KSBjb25zdAoreworICAgIHJldHVybiAwOworfQorCiti
b29sIERyYWdEYXRhOjpjb250YWluc1VSTCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZhbHNlOwor
fQorCitTdHJpbmcgRHJhZ0RhdGE6OmFzVVJMKFN0cmluZyogdGl0bGUpIGNvbnN0Cit7CisgICAg
cmV0dXJuIFN0cmluZygpOworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc0ZpbGVzKCkgY29u
c3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRHJhZ0RhdGE6OmFzRmlsZW5hbWVz
KFZlY3RvcjxTdHJpbmc+JikgY29uc3QKK3sKK30KKworYm9vbCBEcmFnRGF0YTo6Y29udGFpbnNQ
bGFpblRleHQoKSBjb25zdAoreworICAgIHJldHVybiBmYWxzZTsKK30KKworU3RyaW5nIERyYWdE
YXRhOjphc1BsYWluVGV4dCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIFN0cmluZygpOworfQorCiti
b29sIERyYWdEYXRhOjpjb250YWluc0NvbG9yKCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7
Cit9CisKK2Jvb2wgRHJhZ0RhdGE6OmNhblNtYXJ0UmVwbGFjZSgpIGNvbnN0Cit7CisgICAgcmV0
dXJuIGZhbHNlOworfQorCitib29sIERyYWdEYXRhOjpjb250YWluc0NvbXBhdGlibGVDb250ZW50
KCkgY29uc3QKK3sKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Bhc3NSZWZQdHI8RG9jdW1lbnRG
cmFnbWVudD4gRHJhZ0RhdGE6OmFzRnJhZ21lbnQoRG9jdW1lbnQqIGRvYykgY29uc3QKK3sKKyAg
ICAgcmV0dXJuIDA7Cit9CisKK0NvbG9yIERyYWdEYXRhOjphc0NvbG9yKCkgY29uc3QKK3sKKyAg
ICByZXR1cm4gQ29sb3IoKTsKK30KKworfQorCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0RyYWdJbWFnZVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRHJhZ0lt
YWdlV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjBmODAK
LS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0RyYWdJbWFnZVdpbmNl
LmNwcApAQCAtMCwwICsxLDYzIEBACisvKgorICogIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRv
cmNoIE1vYmlsZSwgSW5jLgorICoKKyAqICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqICBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqICB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisgKgorICogIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNo
b3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJs
aWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09Q
WUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqICBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkRyYWdJbWFnZS5oIgorCisjaW5jbHVkZSAiQ2FjaGVkSW1hZ2UuaCIKKyNpbmNsdWRl
ICJHcmFwaGljc0NvbnRleHQuaCIKKyNpbmNsdWRlICJJbWFnZS5oIgorCisjaW5jbHVkZSA8d2lu
ZG93cy5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0ludFNpemUgZHJhZ0ltYWdlU2l6ZShE
cmFnSW1hZ2VSZWYpCit7CisgICAgcmV0dXJuIEludFNpemUoMCwgMCk7Cit9CisKK3ZvaWQgZGVs
ZXRlRHJhZ0ltYWdlKERyYWdJbWFnZVJlZiBpbWFnZSkKK3sKKyAgICBpZiAoaW1hZ2UpCisgICAg
ICAgIDo6RGVsZXRlT2JqZWN0KGltYWdlKTsKK30KKworRHJhZ0ltYWdlUmVmIHNjYWxlRHJhZ0lt
YWdlKERyYWdJbWFnZVJlZiwgRmxvYXRTaXplKQoreworICAgIHJldHVybiAwOworfQorCitEcmFn
SW1hZ2VSZWYgZGlzc29sdmVEcmFnSW1hZ2VUb0ZyYWN0aW9uKERyYWdJbWFnZVJlZiBpbWFnZSwg
ZmxvYXQpCit7CisgICAgcmV0dXJuIGltYWdlOworfQorCitEcmFnSW1hZ2VSZWYgY3JlYXRlRHJh
Z0ltYWdlRnJvbUltYWdlKEltYWdlKikKK3sKKyAgICByZXR1cm4gMDsKK30KKworRHJhZ0ltYWdl
UmVmIGNyZWF0ZURyYWdJbWFnZUljb25Gb3JDYWNoZWRJbWFnZShDYWNoZWRJbWFnZSopCit7Cisg
ICAgcmV0dXJuIDA7Cit9CisKK30KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2Uv
RWRpdG9yV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9FZGl0b3JXaW5jZS5jcHAK
bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJhZjc4MAotLS0gL2Rldi9udWxs
CisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvRWRpdG9yV2luY2UuY3BwCkBAIC0wLDAgKzEs
NDMgQEAKKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMu
CisgKgorICogIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMg
TGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2
ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAg
YWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5v
dCwgd3JpdGUgdG8KKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBG
cmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwg
VVNBLgorICoKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisKKyNpbmNsdWRlICJFZGl0b3Iu
aCIKKworI2luY2x1ZGUgIkNsaXBib2FyZFdpbmNlLmgiCisjaW5jbHVkZSAiRG9jdW1lbnQuaCIK
KyNpbmNsdWRlICJFZGl0b3JDbGllbnQuaCIKKyNpbmNsdWRlICJFbGVtZW50LmgiCisjaW5jbHVk
ZSAiSHRtbEVkaXRpbmcuaCIKKyNpbmNsdWRlICJUZXh0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJ2
aXNpYmxlX3VuaXRzLmgiCisKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjZGVmaW5lIF9TWVNfR1VJ
RF9PUEVSQVRPUlNfCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworUGFzc1JlZlB0cjxDbGlwYm9h
cmQ+IEVkaXRvcjo6bmV3R2VuZXJhbENsaXBib2FyZChDbGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9s
aWN5KQoreworICAgIHJldHVybiBhZG9wdFJlZihuZXcgQ2xpcGJvYXJkV2luY2UocG9saWN5LCBm
YWxzZSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL0tVUkxXaW5jZS5jcHAgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0tV
UkxXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhMWU0Ygot
LS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvS1VSTFdpbmNlLmNwcApA
QCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRvcmNoIE1vYmlsZSBJ
bmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0
cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05V
IExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBj
b3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3
aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0
ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworU3RyaW5nIEtVUkw6OmZpbGVTeXN0ZW1QYXRoKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gcGF0aCgpOworfQorCit9Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34590</attachid>
            <date>2009-08-11 14:10:46 -0700</date>
            <delta_ts>2009-08-11 15:17:29 -0700</delta_ts>
            <desc>7) Keygen (Security)</desc>
            <filename>27543_7.patch</filename>
            <type>text/plain</type>
            <size>5233</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
M2FmYzgyNS4uNDVlYzBkYSAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMiBAQAorMjAwOS0wOC0wOCAgTHlvbiBDaGVuICA8
bHlvbi5jaGVuQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBJbXBsZW1lbnQgS2V5Z2VuIGZvciBXSU5D
RQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1NDMK
KworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcDogQWRkZWQuCisKIDIw
MDktMDgtMDYgIFlvbmcgTGkgIDx5b25nLmxpQHRvcmNobW9iaWxlLmNvbT4KIAogICAgICAgICBS
ZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0v
d2luY2UvS2V5Z2VuV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9LZXlnZW5XaW5j
ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzMzMzOAotLS0gL2Rl
di9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvS2V5Z2VuV2luY2UuY3BwCkBAIC0w
LDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgVG9yY2ggTW9iaWxl
IEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp
c3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH
TlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhl
IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9uIDIgb2YgdGhlIExp
Y2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhp
cyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2Vm
dWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll
ZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xp
biBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisg
Ki8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNTTEtleUdlbmVyYXRvci5oIgor
CisjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorCisjaW5jbHVkZSA8
d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNyeXB0Lmg+CisKKyNkZWZpbmUgS0VZR0VOX0RFQlVH
X0tFWSAgICAgICAgMHgwMDAwMDAwMQorCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBLRVlHRU5f
REVCVUcgICAgKDApCisjZWxzZQorI2RlZmluZSBLRVlHRU5fREVCVUcgICAgMAorI2VuZGlmCisK
K25hbWVzcGFjZSBXZWJDb3JlIHsKKwordm9pZCBXZWJDb3JlOjpnZXRTdXBwb3J0ZWRLZXlTaXpl
cyhWZWN0b3I8U3RyaW5nPiYgdikKK3sKKyAgICB2LmFwcGVuZCgiSGlnaCBHcmFkZSIpOworICAg
IHYuYXBwZW5kKCJNZWRpdW0gR3JhZGUiKTsKK30KKworU3RyaW5nIFdlYkNvcmU6OnNpZ25lZFB1
YmxpY0tleUFuZENoYWxsZW5nZVN0cmluZyh1bnNpZ25lZCBpbmRleCwgY29uc3QgU3RyaW5nJiBj
aGFsbGVuZ2UsIGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBTdHJpbmcga2V5c3RyOworCisgICAg
SENSWVBUUFJPViBoUHJvdiA9IDA7CisgICAgSENSWVBUS0VZIGhLZXkgPSAwOworICAgIFBDRVJU
X1BVQkxJQ19LRVlfSU5GTyBwUHViSW5mbyA9IDA7CisgICAgRFdPUkQgZHdQdWJJbmZvTGVuZ3Ro
ID0gMDsKKyAgICBDRVJUX0tFWUdFTl9SRVFVRVNUX0lORk8gcmVxdWVzdEluZm87CisgICAgQ1JZ
UFRfQUxHT1JJVEhNX0lERU5USUZJRVIgc2lnbkFsZ287CisgICAgTFBCWVRFIHBiRW5jb2RlZCA9
IDA7CisgICAgRFdPUkQgZHdFbmNvZGVkTGVuZ3RoID0gMDsKKyAgICBMUFdTVFIgcHN6U3RyaW5n
ID0gMDsKKyAgICBWZWN0b3I8Y2hhcj4gYmluYXJ5OworICAgIFZlY3RvcjxjaGFyPiBiYXNlNjQ7
CisKKyNpZiBkZWZpbmVkKEtFWUdFTl9ERUJVRykgJiYgKEtFWUdFTl9ERUJVRyAmIEtFWUdFTl9E
RUJVR19LRVkpCisgICAgcHJpbnRmKCJXZWJDb3JlOjpzaWduZWRQdWJsaWNLZXlBbmRDaGFsbGVu
Z2VTdHJpbmcoJWQsICUuKnMpLlxuIiwgaW5kZXgsIGNoYWxsZW5nZS5sZW5ndGgoKSwgY2hhbGxl
bmdlLmxhdGluMSgpLmRhdGEoKSk7CisjZW5kaWYKKworICAgIC8vIFRyeSB0byBkZWxldGUgb2Yg
aXQgZXhpc3RzIGFscmVhZHkKKyAgICBDcnlwdEFjcXVpcmVDb250ZXh0KCZoUHJvdiwgX1QoImtl
eWdlbl9jb250YWluZXIiKSwgTVNfRU5IQU5DRURfUFJPViwgUFJPVl9SU0FfRlVMTCwgQ1JZUFRf
REVMRVRFS0VZU0VUKTsKKworICAgIEJPT0wgc3VjY2VzcyA9IENyeXB0QWNxdWlyZUNvbnRleHQo
JmhQcm92LCBfVCgia2V5Z2VuX2NvbnRhaW5lciIpLCBNU19FTkhBTkNFRF9QUk9WLCBQUk9WX1JT
QV9GVUxMLCBDUllQVF9ORVdLRVlTRVQpOworICAgIGlmICghc3VjY2VzcykKKyAgICAgICAgZ290
byBlcnJvcjsKKworICAgIHN1Y2Nlc3MgPSBDcnlwdEdlbktleShoUHJvdiwgQVRfS0VZRVhDSEFO
R0UsIDAsICZoS2V5KTsKKyAgICBpZiAoIXN1Y2Nlc3MpCisgICAgICAgIGdvdG8gZXJyb3I7CisK
KyAgICBzdWNjZXNzID0gQ3J5cHRFeHBvcnRQdWJsaWNLZXlJbmZvKGhQcm92LCBBVF9LRVlFWENI
QU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIDAsICZkd1B1YkluZm9MZW5ndGgpOworICAgIGlmICgh
c3VjY2VzcykKKyAgICAgICAgZ290byBlcnJvcjsKKworICAgIHBQdWJJbmZvID0gKFBDRVJUX1BV
QkxJQ19LRVlfSU5GTykgbmV3IGNoYXJbZHdQdWJJbmZvTGVuZ3RoXTsKKyAgICBpZiAoIXBQdWJJ
bmZvKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgc3VjY2VzcyA9IENyeXB0RXhwb3J0UHVi
bGljS2V5SW5mbyhoUHJvdiwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBwUHVi
SW5mbywgJmR3UHViSW5mb0xlbmd0aCk7CisgICAgaWYgKCFzdWNjZXNzKQorICAgICAgICBnb3Rv
IGVycm9yOworCisgICAgcmVxdWVzdEluZm8uZHdWZXJzaW9uID0gQ0VSVF9LRVlHRU5fUkVRVUVT
VF9WMTsKKyAgICByZXF1ZXN0SW5mby5wd3N6Q2hhbGxlbmdlU3RyaW5nID0gTCIiOworICAgIHJl
cXVlc3RJbmZvLlN1YmplY3RQdWJsaWNLZXlJbmZvID0gKnBQdWJJbmZvOworCisgICAgaWYgKGNo
YWxsZW5nZS5sZW5ndGgoKSkgeworICAgICAgICBwc3pTdHJpbmcgPSBuZXcgV0NIQVJbY2hhbGxl
bmdlLmxlbmd0aCgpICsgMV07CisgICAgICAgIGlmIChwc3pTdHJpbmcpIHsKKyAgICAgICAgICAg
IHdjc25jcHkocHN6U3RyaW5nLCBjaGFsbGVuZ2UuY2hhcmFjdGVycygpLCBjaGFsbGVuZ2UubGVu
Z3RoKCkpOworICAgICAgICAgICAgcHN6U3RyaW5nW2NoYWxsZW5nZS5sZW5ndGgoKV0gPSAwOwor
ICAgICAgICAgICAgcmVxdWVzdEluZm8ucHdzekNoYWxsZW5nZVN0cmluZyA9IHBzelN0cmluZzsK
KyAgICAgICAgfQorICAgIH0KKworICAgIFNlY3VyZVplcm9NZW1vcnkoJnNpZ25BbGdvLCBzaXpl
b2YoQ1JZUFRfQUxHT1JJVEhNX0lERU5USUZJRVIpKTsKKyAgICBzaWduQWxnby5wc3pPYmpJZCA9
IHN6T0lEX1JTQV9TSEExUlNBOworCisgICAgc3VjY2VzcyA9IENyeXB0U2lnbkFuZEVuY29kZUNl
cnRpZmljYXRlKGhQcm92LCBBVF9LRVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcsIFg1MDlf
S0VZR0VOX1JFUVVFU1RfVE9fQkVfU0lHTkVELAorICAgICAgICAgICAgICAgICAgICAmcmVxdWVz
dEluZm8sICZzaWduQWxnbywgMCwgMCwgJmR3RW5jb2RlZExlbmd0aCk7CisgICAgaWYgKCFzdWNj
ZXNzKQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgcGJFbmNvZGVkID0gKExQQllURSkgbmV3
IGNoYXJbZHdFbmNvZGVkTGVuZ3RoXTsKKyAgICBpZiAoIXBiRW5jb2RlZCkKKyAgICAgICAgZ290
byBlcnJvcjsKKworICAgIHN1Y2Nlc3MgPSBDcnlwdFNpZ25BbmRFbmNvZGVDZXJ0aWZpY2F0ZSho
UHJvdiwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNOX0VOQ09ESU5HLCBYNTA5X0tFWUdFTl9SRVFV
RVNUX1RPX0JFX1NJR05FRCwKKyAgICAgICAgICAgICAgICAgICAgJnJlcXVlc3RJbmZvLCAmc2ln
bkFsZ28sIDAsIHBiRW5jb2RlZCwgJmR3RW5jb2RlZExlbmd0aCk7CisgICAgaWYgKCFzdWNjZXNz
KQorICAgICAgICBnb3RvIGVycm9yOworCisgICAgYmluYXJ5LnJlc2l6ZShkd0VuY29kZWRMZW5n
dGgpOworICAgIGZvciAoRFdPUkQgaSA9IDA7IGkgPCBkd0VuY29kZWRMZW5ndGg7ICsraSkKKyAg
ICAgICAgYmluYXJ5W2ldID0gcGJFbmNvZGVkW2ldOworCisgICAgYmFzZTY0RW5jb2RlKGJpbmFy
eSwgYmFzZTY0KTsKKyAgICBpZiAoYmFzZTY0LnNpemUoKSkgeworICAgICAgICBTdHJpbmcgdGVt
cHN0cihiYXNlNjQuZGF0YSgpLCBiYXNlNjQuc2l6ZSgpKTsKKyAgICAgICAga2V5c3RyLmluc2Vy
dCh0ZW1wc3RyLCAwKTsKKyAgICB9CisKK2Vycm9yOgorICAgIGlmIChwc3pTdHJpbmcpCisgICAg
ICAgIGRlbGV0ZVtdIHBzelN0cmluZzsKKyAgICBpZiAocGJFbmNvZGVkKQorICAgICAgICBkZWxl
dGVbXSBwYkVuY29kZWQ7CisgICAgaWYgKHBQdWJJbmZvKQorICAgICAgICBkZWxldGVbXSBwUHVi
SW5mbzsKKyAgICBpZiAoaEtleSkKKyAgICAgICAgQ3J5cHREZXN0cm95S2V5KGhLZXkpOworICAg
IGlmIChoUHJvdikKKyAgICAgICAgQ3J5cHRSZWxlYXNlQ29udGV4dChoUHJvdiwgMCk7CisKKyAg
ICByZXR1cm4ga2V5c3RyOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34602</attachid>
            <date>2009-08-11 15:17:29 -0700</date>
            <delta_ts>2009-08-12 11:13:09 -0700</delta_ts>
            <desc>7) KeyGen (modified)</desc>
            <filename>27543_7.patch</filename>
            <type>text/plain</type>
            <size>4458</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZjAyNTVjMy4uMGY3NmU4YyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMiBAQAorMjAwOS0wOC0wOCAgTHlvbiBDaGVuICA8
bHlvbi5jaGVuQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBJbXBsZW1lbnQgS2V5Z2VuIGZvciBXSU5D
RQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1NDMK
KworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcDogQWRkZWQuCisKIDIw
MDktMDgtMTEgIFNpbW9uIEhhdXNtYW5uICA8c2ltb24uaGF1c21hbm5Abm9raWEuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoYnVpbGQgZml4KS4KZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vd2luY2UvS2V5Z2VuV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5j
ZS9LZXlnZW5XaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2
MmZjZgotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvS2V5Z2VuV2lu
Y2UuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkg
VG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNTTEtleUdl
bmVyYXRvci5oIgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgor
CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNyeXB0Lmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordm9pZCBXZWJDb3JlOjpnZXRTdXBwb3J0ZWRLZXlTaXplcyhWZWN0b3I8
U3RyaW5nPiYgdikKK3sKKyAgICB2LmFwcGVuZCgiSGlnaCBHcmFkZSIpOworICAgIHYuYXBwZW5k
KCJNZWRpdW0gR3JhZGUiKTsKK30KKworU3RyaW5nIFdlYkNvcmU6OnNpZ25lZFB1YmxpY0tleUFu
ZENoYWxsZW5nZVN0cmluZyh1bnNpZ25lZCBpbmRleCwgY29uc3QgU3RyaW5nJiBjaGFsbGVuZ2Us
IGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBTdHJpbmcga2V5OworCisgICAgSENSWVBUUFJPViBo
UHJvdiA9IDA7CisgICAgSENSWVBUS0VZIGhLZXkgPSAwOworICAgIFBDRVJUX1BVQkxJQ19LRVlf
SU5GTyBwUHViSW5mbyA9IDA7CisKKyAgICAvLyBUcnkgdG8gZGVsZXRlIGlmIGl0IGV4aXN0cyBh
bHJlYWR5CisgICAgQ3J5cHRBY3F1aXJlQ29udGV4dCgmaFByb3YsIF9UKCJrZXlnZW5fY29udGFp
bmVyIiksIE1TX0VOSEFOQ0VEX1BST1YsIFBST1ZfUlNBX0ZVTEwsIENSWVBUX0RFTEVURUtFWVNF
VCk7CisKKyAgICAvLyBVc2UgZm9yKDs7KSBmb3Igb25seSBvbmUgcnVuIGhlcmUsIGluIG9yZGVy
IHRvIGF2b2lkIHVzaW5nIGdvdG8KKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGlmICghQ3J5cHRB
Y3F1aXJlQ29udGV4dCgmaFByb3YsIF9UKCJrZXlnZW5fY29udGFpbmVyIiksIE1TX0VOSEFOQ0VE
X1BST1YsIFBST1ZfUlNBX0ZVTEwsIENSWVBUX05FV0tFWVNFVCkpCisgICAgICAgICAgICBicmVh
azs7CisKKyAgICAgICAgRFdPUkQgZHdQdWJJbmZvTGVuZ3RoID0gMDsKKyAgICAgICAgaWYgKCFD
cnlwdEdlbktleShoUHJvdiwgQVRfS0VZRVhDSEFOR0UsIDAsICZoS2V5KSB8fCAhQ3J5cHRFeHBv
cnRQdWJsaWNLZXlJbmZvKGhQcm92LCBBVF9LRVlFWENIQU5HRSwgWDUwOV9BU05fRU5DT0RJTkcs
IDAsICZkd1B1YkluZm9MZW5ndGgpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8g
VXNlIG1hbGxvYyBpbnN0ZWFkIG9mIG5ldywgYmVjYXVzZSBtYWxsb2MgZ3VhcmFudGVlcyB0byBy
ZXR1cm4gYSBwb2ludGVyIGFsaWduZWQgZm9yIGFsbCBkYXRhIHR5cGVzLgorICAgICAgICBQQ0VS
VF9QVUJMSUNfS0VZX0lORk8gcFB1YkluZm8gPSByZWludGVycHJldF9jYXN0PFBDRVJUX1BVQkxJ
Q19LRVlfSU5GTz4oZmFzdE1hbGxvYyhkd1B1YkluZm9MZW5ndGgpKTsKKworICAgICAgICBpZiAo
IUNyeXB0RXhwb3J0UHVibGljS2V5SW5mbyhoUHJvdiwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNO
X0VOQ09ESU5HLCBwUHViSW5mbywgJmR3UHViSW5mb0xlbmd0aCkpCisgICAgICAgICAgICBicmVh
azsKKworICAgICAgICBDRVJUX0tFWUdFTl9SRVFVRVNUX0lORk8gcmVxdWVzdEluZm8gPSB7IDAg
fTsKKyAgICAgICAgcmVxdWVzdEluZm8uZHdWZXJzaW9uID0gQ0VSVF9LRVlHRU5fUkVRVUVTVF9W
MTsKKyAgICAgICAgcmVxdWVzdEluZm8ucHdzekNoYWxsZW5nZVN0cmluZyA9IEwiIjsKKyAgICAg
ICAgcmVxdWVzdEluZm8uU3ViamVjdFB1YmxpY0tleUluZm8gPSAqcFB1YkluZm87CisKKyAgICAg
ICAgU3RyaW5nIGxvY2FsQ2hhbGxlbmdlID0gY2hhbGxlbmdlOworCisgICAgICAgIC8vIFdpbmRv
d3MgQVBJIHdvbid0IHdyaXRlIHRvIG91ciBidWZmZXIsIGFsdGhvdWdoIGl0J3Mgbm90IGRlY2xh
cmVkIHdpdGggY29uc3QuCisgICAgICAgIHJlcXVlc3RJbmZvLnB3c3pDaGFsbGVuZ2VTdHJpbmcg
PSBjb25zdF9jYXN0PHdjaGFyX3QqPihsb2NhbENoYWxsZW5nZS5jaGFyYWN0ZXJzV2l0aE51bGxU
ZXJtaW5hdGlvbigpKTsKKworICAgICAgICBDUllQVF9BTEdPUklUSE1fSURFTlRJRklFUiBzaWdu
QWxnbyA9IHsgMCB9OworICAgICAgICBzaWduQWxnby5wc3pPYmpJZCA9IHN6T0lEX1JTQV9TSEEx
UlNBOworCisgICAgICAgIERXT1JEIGR3RW5jb2RlZExlbmd0aDsKKyAgICAgICAgaWYgKCFDcnlw
dFNpZ25BbmRFbmNvZGVDZXJ0aWZpY2F0ZShoUHJvdiwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNO
X0VOQ09ESU5HLCBYNTA5X0tFWUdFTl9SRVFVRVNUX1RPX0JFX1NJR05FRCwgJnJlcXVlc3RJbmZv
LCAmc2lnbkFsZ28sIDAsIDAsICZkd0VuY29kZWRMZW5ndGgpKQorICAgICAgICAgICAgYnJlYWs7
CisKKyAgICAgICAgVmVjdG9yPGNoYXI+IGJpbmFyeShkd0VuY29kZWRMZW5ndGgpOworICAgICAg
ICBpZiAoIUNyeXB0U2lnbkFuZEVuY29kZUNlcnRpZmljYXRlKGhQcm92LCBBVF9LRVlFWENIQU5H
RSwgWDUwOV9BU05fRU5DT0RJTkcsIFg1MDlfS0VZR0VOX1JFUVVFU1RfVE9fQkVfU0lHTkVELCAm
cmVxdWVzdEluZm8sICZzaWduQWxnbywgMCwgcmVpbnRlcnByZXRfY2FzdDxMUEJZVEU+KGJpbmFy
eS5kYXRhKCkpLCAmZHdFbmNvZGVkTGVuZ3RoKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAg
ICAgIFZlY3RvcjxjaGFyPiBiYXNlNjQ7CisgICAgICAgIGJhc2U2NEVuY29kZShiaW5hcnksIGJh
c2U2NCk7CisgICAgICAgIGtleSA9IFN0cmluZyhiYXNlNjQuZGF0YSgpLCBiYXNlNjQuc2l6ZSgp
KTsKKworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAocFB1YkluZm8pCisgICAgICAg
IGZhc3RGcmVlKHBQdWJJbmZvKTsKKyAgICAgICAKKyAgICBpZiAoaEtleSkKKyAgICAgICAgQ3J5
cHREZXN0cm95S2V5KGhLZXkpOworCisgICAgaWYgKGhQcm92KQorICAgICAgICBDcnlwdFJlbGVh
c2VDb250ZXh0KGhQcm92LCAwKTsKKworICAgIHJldHVybiBrZXk7Cit9CisKK30gLy8gbmFtZXNw
YWNlIFdlYkNvcmUK
</data>
<flag name="review"
          id="18756"
          type_id="1"
          status="-"
          setter="staikos"
    />
          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34678</attachid>
            <date>2009-08-12 11:13:09 -0700</date>
            <delta_ts>2009-08-12 12:45:33 -0700</delta_ts>
            <desc>7) KeygenWince.cpp fixed a bug</desc>
            <filename>27543_7.patch</filename>
            <type>text/plain</type>
            <size>4402</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
ZjAyNTVjMy4uMGY3NmU4YyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMiBAQAorMjAwOS0wOC0wOCAgTHlvbiBDaGVuICA8
bHlvbi5jaGVuQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBJbXBsZW1lbnQgS2V5Z2VuIGZvciBXSU5D
RQorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1NDMK
KworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0tleWdlbldpbmNlLmNwcDogQWRkZWQuCisKIDIw
MDktMDgtMTEgIFNpbW9uIEhhdXNtYW5uICA8c2ltb24uaGF1c21hbm5Abm9raWEuY29tPgogCiAg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoYnVpbGQgZml4KS4KZGlmZiAtLWdpdCBhL1dlYkNv
cmUvcGxhdGZvcm0vd2luY2UvS2V5Z2VuV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5j
ZS9LZXlnZW5XaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBm
NGQ2MwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvS2V5Z2VuV2lu
Y2UuY3BwCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkg
VG9yY2ggTW9iaWxlIEluYy4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRl
cm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKiB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIExpYnJhcnkgR2VuZXJh
bCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2
ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vu
c2UKKyAqIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIu
ICBJZiBub3QsIHdyaXRlIHRvCisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMu
LCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICogQm9zdG9uLCBNQSAwMjExMC0x
MzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlNTTEtleUdl
bmVyYXRvci5oIgorCisjaW5jbHVkZSAiQmFzZTY0LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgor
CisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHdpbmNyeXB0Lmg+CisKK25hbWVzcGFj
ZSBXZWJDb3JlIHsKKwordm9pZCBXZWJDb3JlOjpnZXRTdXBwb3J0ZWRLZXlTaXplcyhWZWN0b3I8
U3RyaW5nPiYgdikKK3sKKyAgICB2LmFwcGVuZCgiSGlnaCBHcmFkZSIpOworICAgIHYuYXBwZW5k
KCJNZWRpdW0gR3JhZGUiKTsKK30KKworU3RyaW5nIFdlYkNvcmU6OnNpZ25lZFB1YmxpY0tleUFu
ZENoYWxsZW5nZVN0cmluZyh1bnNpZ25lZCBpbmRleCwgY29uc3QgU3RyaW5nJiBjaGFsbGVuZ2Us
IGNvbnN0IEtVUkwmIHVybCkKK3sKKyAgICBTdHJpbmcga2V5U3RyaW5nOworCisgICAgSENSWVBU
UFJPViBoQ29udGV4dCA9IDA7CisgICAgSENSWVBUS0VZIGhLZXkgPSAwOworICAgIFBDRVJUX1BV
QkxJQ19LRVlfSU5GTyBwUHViSW5mbyA9IDA7CisKKyAgICAvLyBUcnkgdG8gZGVsZXRlIGl0IGlm
IGl0IGV4aXN0cyBhbHJlYWR5CisgICAgQ3J5cHRBY3F1aXJlQ29udGV4dCgmaENvbnRleHQsIF9U
KCJrZXlnZW5fY29udGFpbmVyIiksIE1TX0VOSEFOQ0VEX1BST1YsIFBST1ZfUlNBX0ZVTEwsIENS
WVBUX0RFTEVURUtFWVNFVCk7CisKKyAgICBkbyB7CisgICAgICAgIGlmICghQ3J5cHRBY3F1aXJl
Q29udGV4dCgmaENvbnRleHQsIF9UKCJrZXlnZW5fY29udGFpbmVyIiksIE1TX0VOSEFOQ0VEX1BS
T1YsIFBST1ZfUlNBX0ZVTEwsIENSWVBUX05FV0tFWVNFVCkpCisgICAgICAgICAgICBicmVhazsK
KworICAgICAgICBEV09SRCBkd1B1YkluZm9MZW5ndGggPSAwOworICAgICAgICBpZiAoIUNyeXB0
R2VuS2V5KGhDb250ZXh0LCBBVF9LRVlFWENIQU5HRSwgMCwgJmhLZXkpIHx8ICFDcnlwdEV4cG9y
dFB1YmxpY0tleUluZm8oaENvbnRleHQsIEFUX0tFWUVYQ0hBTkdFLCBYNTA5X0FTTl9FTkNPRElO
RywgMCwgJmR3UHViSW5mb0xlbmd0aCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAv
LyBVc2UgbWFsbG9jIGluc3RlYWQgb2YgbmV3LCBiZWNhdXNlIG1hbGxvYyBndWFyYW50ZWVzIHRv
IHJldHVybiBhIHBvaW50ZXIgYWxpZ25lZCBmb3IgYWxsIGRhdGEgdHlwZXMuCisgICAgICAgIHBQ
dWJJbmZvID0gcmVpbnRlcnByZXRfY2FzdDxQQ0VSVF9QVUJMSUNfS0VZX0lORk8+KGZhc3RNYWxs
b2MoZHdQdWJJbmZvTGVuZ3RoKSk7CisKKyAgICAgICAgaWYgKCFDcnlwdEV4cG9ydFB1YmxpY0tl
eUluZm8oaENvbnRleHQsIEFUX0tFWUVYQ0hBTkdFLCBYNTA5X0FTTl9FTkNPRElORywgcFB1Yklu
Zm8sICZkd1B1YkluZm9MZW5ndGgpKQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgQ0VS
VF9LRVlHRU5fUkVRVUVTVF9JTkZPIHJlcXVlc3RJbmZvID0geyAwIH07CisgICAgICAgIHJlcXVl
c3RJbmZvLmR3VmVyc2lvbiA9IENFUlRfS0VZR0VOX1JFUVVFU1RfVjE7CisgICAgICAgIHJlcXVl
c3RJbmZvLnB3c3pDaGFsbGVuZ2VTdHJpbmcgPSBMIiI7CisgICAgICAgIHJlcXVlc3RJbmZvLlN1
YmplY3RQdWJsaWNLZXlJbmZvID0gKnBQdWJJbmZvOworCisgICAgICAgIFN0cmluZyBsb2NhbENo
YWxsZW5nZSA9IGNoYWxsZW5nZTsKKworICAgICAgICAvLyBXaW5kb3dzIEFQSSB3b24ndCB3cml0
ZSB0byBvdXIgYnVmZmVyLCBhbHRob3VnaCBpdCdzIG5vdCBkZWNsYXJlZCB3aXRoIGNvbnN0Lgor
ICAgICAgICByZXF1ZXN0SW5mby5wd3N6Q2hhbGxlbmdlU3RyaW5nID0gY29uc3RfY2FzdDx3Y2hh
cl90Kj4obG9jYWxDaGFsbGVuZ2UuY2hhcmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7CisK
KyAgICAgICAgQ1JZUFRfQUxHT1JJVEhNX0lERU5USUZJRVIgc2lnbkFsZ28gPSB7IDAgfTsKKyAg
ICAgICAgc2lnbkFsZ28ucHN6T2JqSWQgPSBzek9JRF9SU0FfU0hBMVJTQTsKKworICAgICAgICBE
V09SRCBkd0VuY29kZWRMZW5ndGg7CisgICAgICAgIGlmICghQ3J5cHRTaWduQW5kRW5jb2RlQ2Vy
dGlmaWNhdGUoaENvbnRleHQsIEFUX0tFWUVYQ0hBTkdFLCBYNTA5X0FTTl9FTkNPRElORywgWDUw
OV9LRVlHRU5fUkVRVUVTVF9UT19CRV9TSUdORUQsICZyZXF1ZXN0SW5mbywgJnNpZ25BbGdvLCAw
LCAwLCAmZHdFbmNvZGVkTGVuZ3RoKSkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIFZl
Y3RvcjxjaGFyPiBiaW5hcnkoZHdFbmNvZGVkTGVuZ3RoKTsKKyAgICAgICAgaWYgKCFDcnlwdFNp
Z25BbmRFbmNvZGVDZXJ0aWZpY2F0ZShoQ29udGV4dCwgQVRfS0VZRVhDSEFOR0UsIFg1MDlfQVNO
X0VOQ09ESU5HLCBYNTA5X0tFWUdFTl9SRVFVRVNUX1RPX0JFX1NJR05FRCwgJnJlcXVlc3RJbmZv
LCAmc2lnbkFsZ28sIDAsIHJlaW50ZXJwcmV0X2Nhc3Q8TFBCWVRFPihiaW5hcnkuZGF0YSgpKSwg
JmR3RW5jb2RlZExlbmd0aCkpCisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBWZWN0b3I8
Y2hhcj4gYmFzZTY0OworICAgICAgICBiYXNlNjRFbmNvZGUoYmluYXJ5LCBiYXNlNjQpOworICAg
ICAgICBrZXlTdHJpbmcgPSBTdHJpbmcoYmFzZTY0LmRhdGEoKSwgYmFzZTY0LnNpemUoKSk7CisK
KyAgICB9IHdoaWxlKDApOworCisgICAgaWYgKHBQdWJJbmZvKQorICAgICAgICBmYXN0RnJlZShw
UHViSW5mbyk7CisgICAgICAgCisgICAgaWYgKGhLZXkpCisgICAgICAgIENyeXB0RGVzdHJveUtl
eShoS2V5KTsKKworICAgIGlmIChoQ29udGV4dCkKKyAgICAgICAgQ3J5cHRSZWxlYXNlQ29udGV4
dChoQ29udGV4dCwgMCk7CisKKyAgICByZXR1cm4ga2V5U3RyaW5nOworfQorCit9IC8vIG5hbWVz
cGFjZSBXZWJDb3JlCg==
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34680</attachid>
            <date>2009-08-12 12:35:28 -0700</date>
            <delta_ts>2009-09-01 18:12:51 -0700</delta_ts>
            <desc>5) ContextMenu (modified)</desc>
            <filename>27543_5.patch</filename>
            <type>text/plain</type>
            <size>13757</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MGY3NmU4Yy4uYmFkYWVmNyAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxMyBAQAorMjAwOS0wOC0wOCAgSm9lIE1hc29uICA8
am9lLm1hc29uQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBBZGQgZmlsZXMgZm9yIENvbnRleHRNZW51
CisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yNzU0Mwor
CisgICAgICAgICogcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVJdGVtV2luY2UuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9Db250ZXh0TWVudVdpbmNlLmNwcDogQWRkZWQu
CisKIDIwMDktMDgtMDggIEx5b24gQ2hlbiAgPGx5b24uY2hlbkB0b3JjaG1vYmlsZS5jb20+CiAK
ICAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCmRpZmYgLS1naXQgYS9XZWJDb3Jl
L3BsYXRmb3JtL3dpbmNlL0NvbnRleHRNZW51SXRlbVdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZv
cm0vd2luY2UvQ29udGV4dE1lbnVJdGVtV2luY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjgxNWQ1YzAKLS0tIC9kZXYvbnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3Jt
L3dpbmNlL0NvbnRleHRNZW51SXRlbVdpbmNlLmNwcApAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAwNiwgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggVG9yY2ggTW9iaWxlLCBJbmMuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisK
KyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDb250ZXh0TWVudUl0ZW0uaCIKKworI2lu
Y2x1ZGUgIkNvbnRleHRNZW51LmgiCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgPHdp
bmRvd3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQbGF0Zm9ybU1lbnVJdGVtRGVzY3Jp
cHRpb25UeXBlOjp+UGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZSgpCit7CisgICAgZGVs
ZXRlIHN1Yk1lbnU7Cit9CisKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKFBsYXRm
b3JtTWVudUl0ZW1EZXNjcmlwdGlvbiBpdGVtKQorICAgIDogbV9wbGF0Zm9ybURlc2NyaXB0aW9u
KGl0ZW0pCit7Cit9CisKK0NvbnRleHRNZW51SXRlbTo6Q29udGV4dE1lbnVJdGVtKENvbnRleHRN
ZW51KiBzdWJNZW51KQoreworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IG5ldyBQbGF0Zm9y
bU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOworICAgIGlmIChzdWJNZW51KQorICAgICAgICBtX3Bs
YXRmb3JtRGVzY3JpcHRpb24tPnN1Yk1lbnUgPSBzdWJNZW51LT5yZWxlYXNlUGxhdGZvcm1EZXNj
cmlwdGlvbigpOworfQorCitDb250ZXh0TWVudUl0ZW06OkNvbnRleHRNZW51SXRlbShDb250ZXh0
TWVudUl0ZW1UeXBlIHR5cGUsIENvbnRleHRNZW51QWN0aW9uIGFjdGlvbiwgY29uc3QgU3RyaW5n
JiB0aXRsZSwgQ29udGV4dE1lbnUqIHN1Yk1lbnUpCit7CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0
aW9uID0gbmV3IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU7CisKKyAgICBtX3BsYXRm
b3JtRGVzY3JpcHRpb24tPnR5cGUgPSB0eXBlOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+
YWN0aW9uID0gYWN0aW9uOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+dGl0bGUgPSB0aXRs
ZTsKKyAgICBpZiAoc3ViTWVudSkKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdWJN
ZW51ID0gc3ViTWVudS0+cmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKK30KKworQ29udGV4
dE1lbnVJdGVtOjp+Q29udGV4dE1lbnVJdGVtKCkKK3sKKyAgICBkZWxldGUgbV9wbGF0Zm9ybURl
c2NyaXB0aW9uOworfQorCitQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb24gQ29udGV4dE1lbnVJ
dGVtOjpyZWxlYXNlUGxhdGZvcm1EZXNjcmlwdGlvbigpCit7CisgICAgUGxhdGZvcm1NZW51SXRl
bURlc2NyaXB0aW9uIGRlc2MgPSBtX3BsYXRmb3JtRGVzY3JpcHRpb247CisgICAgbV9wbGF0Zm9y
bURlc2NyaXB0aW9uID0gMDsKKyAgICByZXR1cm4gZGVzYzsKK30KKworQ29udGV4dE1lbnVJdGVt
VHlwZSBDb250ZXh0TWVudUl0ZW06OnR5cGUoKSBjb25zdAoreworICAgIGlmIChtX3BsYXRmb3Jt
RGVzY3JpcHRpb24pCisgICAgICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnR5cGU7
CisgICAgZWxzZQorICAgICAgICByZXR1cm4gQWN0aW9uVHlwZTsKK30KKworQ29udGV4dE1lbnVB
Y3Rpb24gQ29udGV4dE1lbnVJdGVtOjphY3Rpb24oKSBjb25zdAoreworICAgIGlmIChtX3BsYXRm
b3JtRGVzY3JpcHRpb24pCisgICAgICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPmFj
dGlvbjsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBDb250ZXh0TWVudUl0ZW1UYWdOb0FjdGlv
bjsKK30KKworU3RyaW5nIENvbnRleHRNZW51SXRlbTo6dGl0bGUoKSBjb25zdAoreworICAgIGlm
IChtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAgICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3Jp
cHRpb24tPnRpdGxlOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFN0cmluZygpOworfQorCitQ
bGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBDb250ZXh0TWVudUl0ZW06OnBsYXRmb3JtU3ViTWVudSgp
IGNvbnN0Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJu
IG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+c3ViTWVudTsKKyAgICBlbHNlCisgICAgICAgIHJldHVy
biAwOworfQorCit2b2lkIENvbnRleHRNZW51SXRlbTo6c2V0VHlwZShDb250ZXh0TWVudUl0ZW1U
eXBlIHR5cGUpCit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgbV9w
bGF0Zm9ybURlc2NyaXB0aW9uLT50eXBlID0gdHlwZTsKK30KKwordm9pZCBDb250ZXh0TWVudUl0
ZW06OnNldEFjdGlvbihDb250ZXh0TWVudUFjdGlvbiBhY3Rpb24pCit7CisgICAgaWYgKG1fcGxh
dGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5hY3Rpb24g
PSBhY3Rpb247Cit9CisKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRUaXRsZShjb25zdCBTdHJp
bmcmIHRpdGxlKQoreworICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRpb24pCisgICAgICAgIG1f
cGxhdGZvcm1EZXNjcmlwdGlvbi0+dGl0bGUgPSB0aXRsZTsKK30KKwordm9pZCBDb250ZXh0TWVu
dUl0ZW06OnNldFN1Yk1lbnUoQ29udGV4dE1lbnUqIHN1Yk1lbnUpCit7CisgICAgaWYgKCFtX3Bs
YXRmb3JtRGVzY3JpcHRpb24pCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChtX3BsYXRmb3Jt
RGVzY3JpcHRpb24tPnN1Yk1lbnUgIT0gc3ViTWVudS0+cGxhdGZvcm1EZXNjcmlwdGlvbigpKQor
ICAgICAgICBkZWxldGUgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdWJNZW51OworICAgIG1fcGxh
dGZvcm1EZXNjcmlwdGlvbi0+c3ViTWVudSA9IHN1Yk1lbnUtPnJlbGVhc2VQbGF0Zm9ybURlc2Ny
aXB0aW9uKCk7Cit9CisKK3ZvaWQgQ29udGV4dE1lbnVJdGVtOjpzZXRDaGVja2VkKGJvb2wgY2hl
Y2tlZCkKK3sKKyAgICBpZiAoIW1fcGxhdGZvcm1EZXNjcmlwdGlvbikKKyAgICAgICAgcmV0dXJu
OworCisgICAgaWYgKGNoZWNrZWQpCisgICAgICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+c3Rh
dGUgfD0gUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0aW9uVHlwZTo6Q2hlY2tlZFN0YXRlOworICAg
IGVsc2UKKyAgICAgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5zdGF0ZSAmPSB+UGxhdGZvcm1N
ZW51SXRlbURlc2NyaXB0aW9uVHlwZTo6Q2hlY2tlZFN0YXRlOworfQorCit2b2lkIENvbnRleHRN
ZW51SXRlbTo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgaWYgKCFtX3BsYXRmb3Jt
RGVzY3JpcHRpb24pCisgICAgICAgIHJldHVybjsKKworICAgIGlmIChlbmFibGVkKQorICAgICAg
ICBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPnN0YXRlIHw9IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlw
dGlvblR5cGU6OkVuYWJsZWRTdGF0ZTsKKyAgICBlbHNlCisgICAgICAgIG1fcGxhdGZvcm1EZXNj
cmlwdGlvbi0+c3RhdGUgJj0gflBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkVuYWJs
ZWRTdGF0ZTsKK30KKworYm9vbCBDb250ZXh0TWVudUl0ZW06OmVuYWJsZWQoKSBjb25zdAorewor
ICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24gJiYgKG1fcGxhdGZvcm1EZXNjcmlwdGlv
bi0+c3RhdGUgJiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpFbmFibGVkU3RhdGUp
ID09IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkVuYWJsZWRTdGF0ZTsKK30KKwor
fQpkaWZmIC0tZ2l0IGEvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9Db250ZXh0TWVudVdpbmNlLmNw
cCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVXaW5jZS5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkOGU0YQotLS0gL2Rldi9udWxsCisrKyBiL1dl
YkNvcmUvcGxhdGZvcm0vd2luY2UvQ29udGV4dE1lbnVXaW5jZS5jcHAKQEAgLTAsMCArMSwyMzcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYsIDIwMDcgQXBwbGUgSW5jLiAgQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA4IFRvcmNoIE1vYmlsZSwgSW5j
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiQ29udGV4dE1lbnUuaCIK
KworI2luY2x1ZGUgIkNTdHJpbmcuaCIKKyNpbmNsdWRlICJEb2N1bWVudC5oIgorI2luY2x1ZGUg
IkZyYW1lLmgiCisjaW5jbHVkZSAiRnJhbWVWaWV3LmgiCisjaW5jbHVkZSAiTm9kZS5oIgorI2lu
Y2x1ZGUgPHRjaGFyLmg+CisjaW5jbHVkZSA8d3RmL1JlZlB0ci5oPgorI2luY2x1ZGUgPHdpbmRv
d3MuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvblR5
cGU6OlBsYXRmb3JtTWVudURlc2NyaXB0aW9uVHlwZSgpCisgICAgOiBoTWVudSg6OkNyZWF0ZVBv
cHVwTWVudSgpKQorICAgICwgaXRlbUNvdW50KDApCit7Cit9CisKK1BsYXRmb3JtTWVudURlc2Ny
aXB0aW9uVHlwZTo6flBsYXRmb3JtTWVudURlc2NyaXB0aW9uVHlwZSgpCit7CisgICAgaWYgKGhN
ZW51KQorICAgICAgICA6OkRlc3Ryb3lNZW51KGhNZW51KTsKK30KKworQ29udGV4dE1lbnU6OkNv
bnRleHRNZW51KGNvbnN0IEhpdFRlc3RSZXN1bHQmIHJlc3VsdCkKKyAgICA6IG1faGl0VGVzdFJl
c3VsdChyZXN1bHQpCisgICAgLCBtX3BsYXRmb3JtRGVzY3JpcHRpb24oMCkKK3sKKyAgICBzZXRQ
bGF0Zm9ybURlc2NyaXB0aW9uKG5ldyBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvblR5cGUpOworfQor
CitDb250ZXh0TWVudTo6Q29udGV4dE1lbnUoY29uc3QgSGl0VGVzdFJlc3VsdCYgcmVzdWx0LCBj
b25zdCBQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBtZW51KQorICAgIDogbV9oaXRUZXN0UmVzdWx0
KHJlc3VsdCkKKyAgICAsIG1fcGxhdGZvcm1EZXNjcmlwdGlvbigwKQoreworICAgIHNldFBsYXRm
b3JtRGVzY3JpcHRpb24obWVudSk7Cit9CisKK0NvbnRleHRNZW51Ojp+Q29udGV4dE1lbnUoKQor
eworICAgIGRlbGV0ZSBtX3BsYXRmb3JtRGVzY3JpcHRpb247Cit9CisKK3Vuc2lnbmVkIENvbnRl
eHRNZW51OjppdGVtQ291bnQoKSBjb25zdAoreworICAgIGlmIChtX3BsYXRmb3JtRGVzY3JpcHRp
b24pCisgICAgICAgIHJldHVybiBtX3BsYXRmb3JtRGVzY3JpcHRpb24tPml0ZW1Db3VudDsKKyAg
ICBlbHNlCisgICAgICAgIHJldHVybiAwOworfQorCit2b2lkIENvbnRleHRNZW51OjppbnNlcnRJ
dGVtKHVuc2lnbmVkIGludCBwb3NpdGlvbiwgQ29udGV4dE1lbnVJdGVtJiBpdGVtKQoreworICAg
IGlmICghbV9wbGF0Zm9ybURlc2NyaXB0aW9uKQorICAgICAgICByZXR1cm47CisKKyAgICBjaGVj
a09yRW5hYmxlSWZOZWVkZWQoaXRlbSk7CisKKyAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRp
b24gZGVzYyA9IGl0ZW0ucmVsZWFzZVBsYXRmb3JtRGVzY3JpcHRpb24oKTsKKyAgICBVSU5UIGZs
YWdzID0gTUZfQllQT1NJVElPTjsKKyAgICBVSU5UIG5ld0l0ZW0gPSAwOworICAgIExQQ1RTVFIg
dGl0bGUgPSAwOworICAgIERXT1JEIHN1Yk1lbnVTaXplID0gMDsKKworICAgIGlmIChkZXNjLT50
eXBlID09IFNlcGFyYXRvclR5cGUpCisgICAgICAgIGZsYWdzIHw9IE1GX1NFUEFSQVRPUjsKKyAg
ICBlbHNlIHsKKyAgICAgICAgZmxhZ3MgfD0gTUZfU1RSSU5HOworICAgICAgICB0aXRsZSA9IHdj
c2R1cChkZXNjLT50aXRsZS5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpKTsKKworICAg
ICAgICBpZiAoZGVzYy0+c3ViTWVudSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gTUZfUE9QVVA7
CisgICAgICAgICAgICBuZXdJdGVtID0gKFVJTlQpIGRlc2MtPnN1Yk1lbnUtPmhNZW51OworICAg
ICAgICAgICAgc3ViTWVudVNpemUgPSBkZXNjLT5zdWJNZW51LT5pdGVtQ291bnQ7CisKKyAgICAg
ICAgICAgIC8vIG5vdyB3ZSBvd24gdGhlIHN1Ym1lbnUgc28gbWFrZSBzdXJlIGl0IGRvZXNuJ3Qg
Z2V0IGRlbGV0ZWQgd2l0aCBkZXNjCisgICAgICAgICAgICBkZXNjLT5zdWJNZW51LT5oTWVudSA9
IDA7CisgICAgICAgICAgICBkZWxldGUgZGVzYy0+c3ViTWVudTsKKyAgICAgICAgICAgIGRlc2Mt
PnN1Yk1lbnUgPSAwOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgIG5ld0l0ZW0gPSBkZXNj
LT5hY3Rpb247CisKKyAgICAgICAgaWYgKChkZXNjLT5zdGF0ZSAmIFBsYXRmb3JtTWVudUl0ZW1E
ZXNjcmlwdGlvblR5cGU6OkNoZWNrZWRTdGF0ZSkgPT0gUGxhdGZvcm1NZW51SXRlbURlc2NyaXB0
aW9uVHlwZTo6Q2hlY2tlZFN0YXRlKQorICAgICAgICAgICAgZmxhZ3MgfD0gTUZfQ0hFQ0tFRDsK
KyAgICAgICAgZWxzZQorICAgICAgICAgICAgZmxhZ3MgfD0gTUZfVU5DSEVDS0VEOworCisgICAg
ICAgIGlmICgoZGVzYy0+c3RhdGUgJiBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOjpF
bmFibGVkU3RhdGUpID09IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkVuYWJsZWRT
dGF0ZSkKKyAgICAgICAgICAgIGZsYWdzIHw9IE1GX0VOQUJMRUQ7CisgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgIGZsYWdzIHw9IE1GX0dSQVlFRDsKKyAgICB9CisKKyAgICBpZiAoOjpJbnNlcnRN
ZW51KG1fcGxhdGZvcm1EZXNjcmlwdGlvbi0+aE1lbnUsIHBvc2l0aW9uLCBmbGFncywgbmV3SXRl
bSwgdGl0bGUpKSB7CisgICAgICAgIGlmIChzdWJNZW51U2l6ZSkgeworICAgICAgICAgICAgLy8g
c3RvcmUgdGhlIHN1Ym1lbnUncyBzaXplIGFsb25nIHdpdGggaXQsIHNpbmNlIFdpbkNFIGhhcyBu
byBmdW5jdGlvbiBjYWxsIHRvIGZpbmQgdGhpcworICAgICAgICAgICAgTUVOVUlURU1JTkZPIGlu
Zm87CisgICAgICAgICAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisgICAgICAg
ICAgICBpbmZvLmNiU2l6ZSA9IHNpemVvZihpbmZvKTsKKyAgICAgICAgICAgIGluZm8uZk1hc2sg
PSBNSUlNX0RBVEE7CisgICAgICAgICAgICBpbmZvLmR3SXRlbURhdGEgPSBzdWJNZW51U2l6ZTsK
KworICAgICAgICAgICAgOjpTZXRNZW51SXRlbUluZm8obV9wbGF0Zm9ybURlc2NyaXB0aW9uLT5o
TWVudSwgcG9zaXRpb24sIFRSVUUsICZpbmZvKTsKKyAgICAgICAgfQorICAgICAgICArK21fcGxh
dGZvcm1EZXNjcmlwdGlvbi0+aXRlbUNvdW50OworICAgIH0KKworICAgIC8vIHRoZSBpdGVtIGlz
IG5vdyBvd25lZCBieSB0aGUgbWVudSBzdHJ1Y3R1cmUsIHNvIGRlbGV0ZSBvdXIgcmVmZXJlbmNl
IHRvIGl0CisgICAgZGVsZXRlIGRlc2M7Cit9CisKK3ZvaWQgQ29udGV4dE1lbnU6OmFwcGVuZEl0
ZW0oQ29udGV4dE1lbnVJdGVtJiBpdGVtKQoreworICAgIGluc2VydEl0ZW0oaXRlbUNvdW50KCks
IGl0ZW0pOworfQorCitzdGF0aWMgQ29udGV4dE1lbnVJdGVtKiBjb250ZXh0TWVudUl0ZW1CeUlk
T3JQb3NpdGlvbihQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBtZW51LCB1bnNpZ25lZCBpZCwgQk9P
TCBieVBvc2l0aW9uKQoreworICAgIGlmICghbWVudSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAg
ICBNRU5VSVRFTUlORk8gaW5mbzsKKyAgICBtZW1zZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7
CisgICAgaW5mby5jYlNpemUgPSBzaXplb2YoaW5mbyk7CisgICAgaW5mby5mTWFzayA9IE1JSU1f
VFlQRSB8IE1JSU1fSUQgfCBNSUlNX1NVQk1FTlUgfCBNSUlNX1NUQVRFIHwgTUlJTV9EQVRBOwor
CisgICAgaWYgKCE6OkdldE1lbnVJdGVtSW5mbyhtZW51LT5oTWVudSwgaWQsIGJ5UG9zaXRpb24s
ICZpbmZvKSkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAvLyBpZiBpdCBoYXMgYSBzdHJpbmcs
IHJlYWQgaXQKKyAgICBTdHJpbmcgdGl0bGU7CisgICAgaWYgKChpbmZvLmZUeXBlICYgTUZUX1NU
UklORykgPT0gTUZUX1NUUklORykgeworICAgICAgICAvLyBpbmZvLmNjaCBjb250YWlucyB0aGUg
bnVtYmVyIG9mIGNoYXJzIGluIHRoZSBzdHJpbmcuICBBbGxvY2F0ZSBzcGFjZSBmb3IgdGhpcyAo
cGx1cyBudWxsIHRlcm1pbmF0b3IpIGFuZCBxdWVyeSBhZ2Fpbi4KKyAgICAgICAgKytpbmZvLmNj
aDsKKyAgICAgICAgTFBUU1RSIGJ1ZmZlciA9IChMUFRTVFIpbWFsbG9jKGluZm8uY2NoICogc2l6
ZW9mKFRDSEFSKSk7CisgICAgICAgIGlmICghYnVmZmVyKQorICAgICAgICAgICAgcmV0dXJuIDA7
CisgICAgICAgIGluZm8uZHdUeXBlRGF0YSA9IGJ1ZmZlcjsKKworICAgICAgICBpZiAoITo6R2V0
TWVudUl0ZW1JbmZvKG1lbnUtPmhNZW51LCBpZCwgYnlQb3NpdGlvbiwgJmluZm8pKSB7CisgICAg
ICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQor
CisgICAgICAgIC8vIGluZm8uY2NoIGhhcyBiZWVuIHVwZGF0ZWQgd2l0aCBudW1iZXIgb2YgY2hh
cnMgY29waWVkIGludG8gYnVmZmVyCisgICAgICAgIHRpdGxlID0gU3RyaW5nKGluZm8uZHdUeXBl
RGF0YSwgaW5mby5jY2gpOworICAgICAgICBmcmVlKGJ1ZmZlcik7CisgICAgfQorCisgICAgLy8g
Y3JlYXRlIHRoZSB2YWx1ZSB0byByZXR1cm4KKyAgICBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRp
b24gaXRlbSA9IG5ldyBQbGF0Zm9ybU1lbnVJdGVtRGVzY3JpcHRpb25UeXBlOworCisgICAgaWYg
KChpbmZvLmZUeXBlICYgTUZUX1NFUEFSQVRPUikgPT0gTUZUX1NFUEFSQVRPUikKKyAgICAgICAg
aXRlbS0+dHlwZSA9IFNlcGFyYXRvclR5cGU7CisgICAgZWxzZSB7CisgICAgICAgIGl0ZW0tPnRp
dGxlID0gdGl0bGU7CisgICAgICAgIGl0ZW0tPnN0YXRlID0gMDsKKyAgICAgICAgaWYgKChpbmZv
LmZTdGF0ZSAmIE1GU19DSEVDS0VEKSA9PSBNRlNfQ0hFQ0tFRCkKKyAgICAgICAgICAgIGl0ZW0t
PnN0YXRlIHw9IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5cGU6OkNoZWNrZWRTdGF0ZTsK
KyAgICAgICAgaWYgKChpbmZvLmZTdGF0ZSAmIE1GU19FTkFCTEVEKSA9PSBNRlNfRU5BQkxFRCkK
KyAgICAgICAgICAgIGl0ZW0tPnN0YXRlIHw9IFBsYXRmb3JtTWVudUl0ZW1EZXNjcmlwdGlvblR5
cGU6OkVuYWJsZWRTdGF0ZTsKKworICAgICAgICBpZiAoIWluZm8uaFN1Yk1lbnUpIHsKKyAgICAg
ICAgICAgIGl0ZW0tPnR5cGUgPSBBY3Rpb25UeXBlOworICAgICAgICAgICAgaXRlbS0+YWN0aW9u
ID0gKENvbnRleHRNZW51QWN0aW9uKSBpbmZvLndJRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAg
ICAgICAgIGl0ZW0tPnR5cGUgPSBTdWJtZW51VHlwZTsKKyAgICAgICAgICAgIGl0ZW0tPnN1Yk1l
bnUgPSBuZXcgUGxhdGZvcm1NZW51RGVzY3JpcHRpb25UeXBlOworCisgICAgICAgICAgICAvLyB0
aGUgbWVudSBzaXplIGlzIHN0b3JlZCBhcyB0aGUgaXRlbSdzIGN1c3RvbSBkYXRhCisgICAgICAg
ICAgICAvLyBCVUc6IHdobyBvd25zIHRoZSBITUVOVSBub3c/CisgICAgICAgICAgICBpdGVtLT5z
dWJNZW51LT5oTWVudSA9IGluZm8uaFN1Yk1lbnU7CisgICAgICAgICAgICBpdGVtLT5zdWJNZW51
LT5pdGVtQ291bnQgPSBpbmZvLmR3SXRlbURhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBy
ZXR1cm4gbmV3IENvbnRleHRNZW51SXRlbShpdGVtKTsKK30KKworQ29udGV4dE1lbnVJdGVtKiBD
b250ZXh0TWVudTo6aXRlbVdpdGhBY3Rpb24odW5zaWduZWQgYWN0aW9uKQoreworICAgIHJldHVy
biBjb250ZXh0TWVudUl0ZW1CeUlkT3JQb3NpdGlvbihtX3BsYXRmb3JtRGVzY3JpcHRpb24sIGFj
dGlvbiwgRkFMU0UpOworfQorCitDb250ZXh0TWVudUl0ZW0qIENvbnRleHRNZW51OjppdGVtQXRJ
bmRleCh1bnNpZ25lZCBpbmRleCwgY29uc3QgUGxhdGZvcm1NZW51RGVzY3JpcHRpb24gcGxhdGZv
cm1EZXNjcmlwdGlvbikKK3sKKyAgICByZXR1cm4gY29udGV4dE1lbnVJdGVtQnlJZE9yUG9zaXRp
b24ocGxhdGZvcm1EZXNjcmlwdGlvbiwgaW5kZXgsIFRSVUUpOworfQorCit2b2lkIENvbnRleHRN
ZW51OjpzZXRQbGF0Zm9ybURlc2NyaXB0aW9uKFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGRlc2Mp
Cit7CisgICAgaWYgKG1fcGxhdGZvcm1EZXNjcmlwdGlvbiAhPSBkZXNjKQorICAgICAgICBkZWxl
dGUgbV9wbGF0Zm9ybURlc2NyaXB0aW9uOworICAgIG1fcGxhdGZvcm1EZXNjcmlwdGlvbiA9IGRl
c2M7Cit9CisKK1BsYXRmb3JtTWVudURlc2NyaXB0aW9uIENvbnRleHRNZW51OjpwbGF0Zm9ybURl
c2NyaXB0aW9uKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9wbGF0Zm9ybURlc2NyaXB0aW9uOwor
fQorCitQbGF0Zm9ybU1lbnVEZXNjcmlwdGlvbiBDb250ZXh0TWVudTo6cmVsZWFzZVBsYXRmb3Jt
RGVzY3JpcHRpb24oKQoreworICAgIFBsYXRmb3JtTWVudURlc2NyaXB0aW9uIGRlc2MgPSBtX3Bs
YXRmb3JtRGVzY3JpcHRpb247CisgICAgbV9wbGF0Zm9ybURlc2NyaXB0aW9uID0gMDsKKyAgICBy
ZXR1cm4gZGVzYzsKK30KKworfQo=
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>34681</attachid>
            <date>2009-08-12 12:52:48 -0700</date>
            <delta_ts>2009-09-01 18:13:13 -0700</delta_ts>
            <desc>1) Clipboard (modified)</desc>
            <filename>27543_1.patch</filename>
            <type>text/plain</type>
            <size>17751</size>
            <attacher name="Yong Li">yong.li.webkit</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1dlYkNvcmUvQ2hhbmdlTG9nIGIvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXgg
MGY3NmU4Yy4uMWE3MDBhOCAxMDA2NDQKLS0tIGEvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvV2Vi
Q29yZS9DaGFuZ2VMb2cKQEAgLTEsMyArMSwxNCBAQAorMjAwOS0wOC0wOCAgSm9lIE1hc29uICA8
am9lLm1hc29uQHRvcmNobW9iaWxlLmNvbT4KKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkg
KE9PUFMhKS4KKworICAgICAgICBXSU5DRSBQT1JUOiBBZGQgV0lOQ0UgZmlsZXMgZm9yIENsaXBi
b2FyZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9Mjc1
NDMKKworICAgICAgICAqIHBsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFV0aWxpdGllc1dpbmNlLmNw
cDogQWRkZWQuCisgICAgICAgICogcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuY3BwOiBB
ZGRlZC4KKyAgICAgICAgKiBwbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5oOiBBZGRlZC4K
KwogMjAwOS0wOC0wOCAgTHlvbiBDaGVuICA8bHlvbi5jaGVuQHRvcmNobW9iaWxlLmNvbT4KIAog
ICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KZGlmZiAtLWdpdCBhL1dlYkNvcmUv
cGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkVXRpbGl0aWVzV2luY2UuY3BwIGIvV2ViQ29yZS9wbGF0
Zm9ybS93aW5jZS9DbGlwYm9hcmRVdGlsaXRpZXNXaW5jZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2
NDQKaW5kZXggMDAwMDAwMC4uNmM2ZWRiYwotLS0gL2Rldi9udWxsCisrKyBiL1dlYkNvcmUvcGxh
dGZvcm0vd2luY2UvQ2xpcGJvYXJkVXRpbGl0aWVzV2luY2UuY3BwCkBAIC0wLDAgKzEsMzQzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIEluYy4gIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDctMjAwOSBUb3JjaCBNb2JpbGUsIEluYy4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBV
VEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVU
RVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIkNsaXBib2FyZFV0aWxpdGll
c1dpbi5oIgorCisjaW5jbHVkZSAiQ1N0cmluZy5oIgorI2luY2x1ZGUgIkRvY3VtZW50RnJhZ21l
bnQuaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiUGxhdGZvcm1TdHJpbmcuaCIKKyNp
bmNsdWRlICJUZXh0RW5jb2RpbmcuaCIKKyNpbmNsdWRlICJtYXJrdXAuaCIKKyNpbmNsdWRlIDxz
aGx3YXBpLmg+CisjaW5jbHVkZSA8d2luaW5ldC5oPiAgICAvLyBmb3IgSU5URVJORVRfTUFYX1VS
TF9MRU5HVEgKKwordHlwZWRlZiBIQU5ETEUgSERST1A7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsK
Kworc3RhdGljIGJvb2wgZ2V0V2ViTG9jRGF0YShJRGF0YU9iamVjdCosIFN0cmluZyYsIFN0cmlu
ZyopCit7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgU3RyaW5nIGV4dHJhY3RVUkwo
Y29uc3QgU3RyaW5nICZpblVSTCwgU3RyaW5nKiB0aXRsZSkKK3sKKyAgICBTdHJpbmcgdXJsID0g
aW5VUkw7CisgICAgaW50IHNwbGl0TG9jID0gdXJsLmZpbmQoJ1xuJyk7CisgICAgaWYgKHNwbGl0
TG9jID4gMCkgeworICAgICAgICBpZiAodGl0bGUpCisgICAgICAgICAgICAqdGl0bGUgPSB1cmwu
c3Vic3RyaW5nKHNwbGl0TG9jICsgMSk7CisgICAgICAgIHVybC50cnVuY2F0ZShzcGxpdExvYyk7
CisgICAgfSBlbHNlIGlmICh0aXRsZSkKKyAgICAgICAgKnRpdGxlID0gdXJsOworICAgIHJldHVy
biB1cmw7Cit9CisKKy8vRmlyZWZveCB0ZXh0L2h0bWwKK3N0YXRpYyBGT1JNQVRFVEMqIHRleHRI
dG1sRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9y
bWF0KEwidGV4dC9odG1sIik7CisgICAgc3RhdGljIEZPUk1BVEVUQyB0ZXh0SHRtbEZvcm1hdCA9
IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAgIHJldHVy
biAmdGV4dEh0bWxGb3JtYXQ7Cit9CisKK0hHTE9CQUwgY3JlYXRlR2xvYmFsRGF0YShjb25zdCBL
VVJMJiB1cmwsIGNvbnN0IFN0cmluZyYgdGl0bGUpCit7CisgICAgU3RyaW5nIG11dGFibGVVUkwo
dXJsLnN0cmluZygpKTsKKyAgICBTdHJpbmcgbXV0YWJsZVRpdGxlKHRpdGxlKTsKKyAgICBTSVpF
X1Qgc2l6ZSA9IG11dGFibGVVUkwubGVuZ3RoKCkgKyBtdXRhYmxlVGl0bGUubGVuZ3RoKCkgKyAy
OyAgLy8gKzEgZm9yICJcbiIgYW5kICsxIGZvciBudWxsIHRlcm1pbmF0b3IKKyAgICBIR0xPQkFM
IGNiRGF0YSA9IEdsb2JhbEFsbG9jKEdQVFIsIHNpemUgKiBzaXplb2YoVUNoYXIpKTsKKworICAg
IGlmIChjYkRhdGEpIHsKKyAgICAgICAgUFdTVFIgYnVmZmVyID0gKFBXU1RSKUdsb2JhbExvY2so
Y2JEYXRhKTsKKyAgICAgICAgX3Nud3ByaW50ZihidWZmZXIsIHNpemUsIEwiJXNcbiVzIiwgbXV0
YWJsZVVSTC5jaGFyYWN0ZXJzV2l0aE51bGxUZXJtaW5hdGlvbigpLCBtdXRhYmxlVGl0bGUuY2hh
cmFjdGVyc1dpdGhOdWxsVGVybWluYXRpb24oKSk7CisgICAgICAgIEdsb2JhbFVubG9jayhjYkRh
dGEpOworICAgIH0KKyAgICByZXR1cm4gY2JEYXRhOworfQorCitIR0xPQkFMIGNyZWF0ZUdsb2Jh
bERhdGEoY29uc3QgU3RyaW5nJiBzdHIpCit7CisgICAgSEdMT0JBTCBnbG9iYWxEYXRhID0gOjpH
bG9iYWxBbGxvYyhHUFRSLCAoc3RyLmxlbmd0aCgpICsgMSkgKiBzaXplb2YoVUNoYXIpKTsKKyAg
ICBpZiAoIWdsb2JhbERhdGEpCisgICAgICAgIHJldHVybiAwOworICAgIFVDaGFyKiBidWZmZXIg
PSBzdGF0aWNfY2FzdDxVQ2hhcio+KEdsb2JhbExvY2soZ2xvYmFsRGF0YSkpOworICAgIG1lbWNw
eShidWZmZXIsIHN0ci5jaGFyYWN0ZXJzKCksIHN0ci5sZW5ndGgoKSAqIHNpemVvZihVQ2hhcikp
OworICAgIGJ1ZmZlcltzdHIubGVuZ3RoKCldID0gMDsKKyAgICBHbG9iYWxVbmxvY2soZ2xvYmFs
RGF0YSk7CisgICAgcmV0dXJuIGdsb2JhbERhdGE7Cit9CisKK0hHTE9CQUwgY3JlYXRlR2xvYmFs
RGF0YShjb25zdCBWZWN0b3I8Y2hhcj4mIHZlY3RvcikKK3sKKyAgICBIR0xPQkFMIGdsb2JhbERh
dGEgPSBHbG9iYWxBbGxvYyhHUFRSLCB2ZWN0b3Iuc2l6ZSgpICsgMSk7CisgICAgaWYgKCFnbG9i
YWxEYXRhKQorICAgICAgICByZXR1cm4gMDsKKyAgICBjaGFyKiBidWZmZXIgPSBzdGF0aWNfY2Fz
dDxjaGFyKj4oR2xvYmFsTG9jayhnbG9iYWxEYXRhKSk7CisgICAgbWVtY3B5KGJ1ZmZlciwgdmVj
dG9yLmRhdGEoKSwgdmVjdG9yLnNpemUoKSk7CisgICAgYnVmZmVyW3ZlY3Rvci5zaXplKCldID0g
MDsKKyAgICBHbG9iYWxVbmxvY2soZ2xvYmFsRGF0YSk7CisgICAgcmV0dXJuIGdsb2JhbERhdGE7
Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZChWZWN0b3I8Y2hhcj4mIHZlY3RvciwgY29uc3QgY2hh
ciogc3RyaW5nKQoreworICAgIHZlY3Rvci5hcHBlbmQoc3RyaW5nLCBzdHJsZW4oc3RyaW5nKSk7
Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZChWZWN0b3I8Y2hhcj4mIHZlY3RvciwgY29uc3QgQ1N0
cmluZyYgc3RyaW5nKQoreworICAgIHZlY3Rvci5hcHBlbmQoc3RyaW5nLmRhdGEoKSwgc3RyaW5n
Lmxlbmd0aCgpKTsKK30KKworLy8gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIENGX0hUTUwgZm9ybWF0
IGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL3dvcmtzaG9wL25ldHdv
cmtpbmcvY2xpcGJvYXJkL2h0bWxjbGlwYm9hcmQuYXNwCit2b2lkIG1hcmt1cFRvQ0ZfSFRNTChj
b25zdCBTdHJpbmcmIG1hcmt1cCwgY29uc3QgU3RyaW5nJiBzcmNVUkwsIFZlY3RvcjxjaGFyPiYg
cmVzdWx0KQoreworICAgIGlmICghbWFya3VwLmxlbmd0aCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBzdGF0aWMgY29uc3QgQ1N0cmluZyBjZl9odG1sID0gIlZlcnNpb246MC45IjsKKyAgICBz
dGF0aWMgY29uc3QgQ1N0cmluZyBzdGFydEhUTUwgPSAiXG5TdGFydEhUTUw6IjsKKyAgICBzdGF0
aWMgY29uc3QgQ1N0cmluZyBlbmRIVE1MID0gIlxuRW5kSFRNTDoiOworICAgIHN0YXRpYyBjb25z
dCBDU3RyaW5nIHN0YXJ0RnJhZ21lbnQgPSAiXG5TdGFydEZyYWdtZW50OiI7CisgICAgc3RhdGlj
IGNvbnN0IENTdHJpbmcgZW5kRnJhZ21lbnQgPSAiXG5FbmRGcmFnbWVudDoiOworICAgIHN0YXRp
YyBjb25zdCBDU3RyaW5nIHNvdXJjZVVSTCA9ICJcblNvdXJjZVVSTDoiOworCisgICAgYXBwZW5k
KHJlc3VsdCwgY2ZfaHRtbCk7CisKKyAgICBib29sIHNob3VsZEZpbGxTb3VyY2VVUkwgPSAhc3Jj
VVJMLmlzRW1wdHkoKSAmJiAoc3JjVVJMICE9ICJhYm91dDpibGFuayIpOworCisgICAgQ1N0cmlu
ZyBzdGFydE1hcmt1cCA9ICJcbjxIVE1MPlxuPEJPRFk+XG48IS0tU3RhcnRGcmFnbWVudC0tPlxu
IjsKKyAgICBDU3RyaW5nIGVuZE1hcmt1cCA9ICJcbjwhLS1FbmRGcmFnbWVudC0tPlxuPC9CT0RZ
PlxuPC9IVE1MPiI7CisKKyAgICAvLyBjYWxjdWxhdGUgb2Zmc2V0cworICAgIGNvbnN0IHVuc2ln
bmVkIFVJTlRfTUFYZGlnaXRzID0gMTA7IC8vIG51bWJlciBvZiBkaWdpdHMgaW4gVUlOVF9NQVgg
aW4gYmFzZSAxMAorICAgIHVuc2lnbmVkIHN0YXJ0SFRNTE9mZnNldCA9IGNmX2h0bWwubGVuZ3Ro
KCkgKyBzdGFydEhUTUwubGVuZ3RoKCkgKyBlbmRIVE1MLmxlbmd0aCgpICsgc3RhcnRGcmFnbWVu
dC5sZW5ndGgoKSArIGVuZEZyYWdtZW50Lmxlbmd0aCgpICsgKHNob3VsZEZpbGxTb3VyY2VVUkwg
PyBzb3VyY2VVUkwubGVuZ3RoKCkgKyBzcmNVUkwubGVuZ3RoKCkgOiAwKSArICg0ICogVUlOVF9N
QVhkaWdpdHMpOworICAgIHVuc2lnbmVkIHN0YXJ0RnJhZ21lbnRPZmZzZXQgPSBzdGFydEhUTUxP
ZmZzZXQgKyBzdGFydE1hcmt1cC5sZW5ndGgoKTsKKyAgICBDU3RyaW5nIG1hcmt1cFVURjggPSBt
YXJrdXAudXRmOCgpOworICAgIHVuc2lnbmVkIGVuZEZyYWdtZW50T2Zmc2V0ID0gc3RhcnRGcmFn
bWVudE9mZnNldCArIG1hcmt1cFVURjgubGVuZ3RoKCk7CisgICAgdW5zaWduZWQgZW5kSFRNTE9m
ZnNldCA9IGVuZEZyYWdtZW50T2Zmc2V0ICsgZW5kTWFya3VwLmxlbmd0aCgpOworCisgICAgLy8g
Y3JlYXRlIGZ1bGwgcmVzdWx0IHN0cmluZyBmcm9tIHRoZSBmcmFnbWVudHMKKyAgICBhcHBlbmQo
cmVzdWx0LCBzdGFydEhUTUwpOworICAgIGFwcGVuZChyZXN1bHQsIFN0cmluZzo6Zm9ybWF0KCIl
MDEwdSIsIHN0YXJ0SFRNTE9mZnNldCkudXRmOCgpLmRhdGEoKSk7CisgICAgYXBwZW5kKHJlc3Vs
dCwgZW5kSFRNTCk7CisgICAgYXBwZW5kKHJlc3VsdCwgU3RyaW5nOjpmb3JtYXQoIiUwMTB1Iiwg
ZW5kSFRNTE9mZnNldCkudXRmOCgpLmRhdGEoKSk7CisgICAgYXBwZW5kKHJlc3VsdCwgc3RhcnRG
cmFnbWVudCk7CisgICAgYXBwZW5kKHJlc3VsdCwgU3RyaW5nOjpmb3JtYXQoIiUwMTB1Iiwgc3Rh
cnRGcmFnbWVudE9mZnNldCkudXRmOCgpLmRhdGEoKSk7CisgICAgYXBwZW5kKHJlc3VsdCwgZW5k
RnJhZ21lbnQpOworICAgIGFwcGVuZChyZXN1bHQsIFN0cmluZzo6Zm9ybWF0KCIlMDEwdSIsIGVu
ZEZyYWdtZW50T2Zmc2V0KS51dGY4KCkuZGF0YSgpKTsKKyAgICBpZiAoc2hvdWxkRmlsbFNvdXJj
ZVVSTCkgeworICAgICAgICBhcHBlbmQocmVzdWx0LCBzb3VyY2VVUkwpOworICAgICAgICBhcHBl
bmQocmVzdWx0LCBzcmNVUkwudXRmOCgpLmRhdGEoKSk7CisgICAgfQorICAgIGFwcGVuZChyZXN1
bHQsIHN0YXJ0TWFya3VwKTsKKyAgICBhcHBlbmQocmVzdWx0LCBtYXJrdXBVVEY4LmRhdGEoKSk7
CisgICAgYXBwZW5kKHJlc3VsdCwgZW5kTWFya3VwKTsKK30KKworU3RyaW5nIHVybFRvTWFya3Vw
KGNvbnN0IEtVUkwmIHVybCwgY29uc3QgU3RyaW5nJiB0aXRsZSkKK3sKKyAgICBTdHJpbmcgbWFy
a3VwKCI8YSBocmVmPVwiIik7CisgICAgbWFya3VwLmFwcGVuZCh1cmwuc3RyaW5nKCkpOworICAg
IG1hcmt1cC5hcHBlbmQoIlwiPiIpOworICAgIG1hcmt1cC5hcHBlbmQodGl0bGUpOworICAgIG1h
cmt1cC5hcHBlbmQoIjwvYT4iKTsKKyAgICByZXR1cm4gbWFya3VwOworfQorCit2b2lkIHJlcGxh
Y2VOZXdsaW5lc1dpdGhXaW5kb3dzU3R5bGVOZXdsaW5lcyhTdHJpbmcmIHN0cikKK3sKKyAgICBz
dGF0aWMgY29uc3QgVUNoYXIgTmV3bGluZSA9ICdcbic7CisgICAgc3RhdGljIGNvbnN0IFN0cmlu
ZyBXaW5kb3dzTmV3bGluZSgiXHJcbiIpOworICAgIHN0ci5yZXBsYWNlKE5ld2xpbmUsIFdpbmRv
d3NOZXdsaW5lKTsKK30KKwordm9pZCByZXBsYWNlTkJTUFdpdGhTcGFjZShTdHJpbmcmIHN0cikK
K3sKKyAgICBzdGF0aWMgY29uc3QgVUNoYXIgTm9uQnJlYWtpbmdTcGFjZUNoYXJhY3RlciA9IDB4
QTA7CisgICAgc3RhdGljIGNvbnN0IFVDaGFyIFNwYWNlQ2hhcmFjdGVyID0gJyAnOworICAgIHN0
ci5yZXBsYWNlKE5vbkJyZWFraW5nU3BhY2VDaGFyYWN0ZXIsIFNwYWNlQ2hhcmFjdGVyKTsKK30K
KworRk9STUFURVRDKiB1cmxXRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlOVCBjZiA9IFJlZ2lz
dGVyQ2xpcGJvYXJkRm9ybWF0KEwiVW5pZm9ybVJlc291cmNlTG9jYXRvclciKTsKKyAgICBzdGF0
aWMgRk9STUFURVRDIHVybEZvcm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZ
TUVEX0hHTE9CQUx9OworICAgIHJldHVybiAmdXJsRm9ybWF0OworfQorCitGT1JNQVRFVEMqIHVy
bEZvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBib2FyZEZvcm1h
dChMIlVuaWZvcm1SZXNvdXJjZUxvY2F0b3IiKTsKKyAgICBzdGF0aWMgRk9STUFURVRDIHVybEZv
cm1hdCA9IHtjZiwgMCwgRFZBU1BFQ1RfQ09OVEVOVCwgLTEsIFRZTUVEX0hHTE9CQUx9OworICAg
IHJldHVybiAmdXJsRm9ybWF0OworfQorCitGT1JNQVRFVEMqIHBsYWluVGV4dEZvcm1hdCgpCit7
CisgICAgc3RhdGljIEZPUk1BVEVUQyB0ZXh0Rm9ybWF0ID0ge0NGX1RFWFQsIDAsIERWQVNQRUNU
X0NPTlRFTlQsIC0xLCBUWU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJnRleHRGb3JtYXQ7Cit9
CisKK0ZPUk1BVEVUQyogcGxhaW5UZXh0V0Zvcm1hdCgpCit7CisgICAgc3RhdGljIEZPUk1BVEVU
QyB0ZXh0Rm9ybWF0ID0ge0NGX1VOSUNPREVURVhULCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwg
VFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ0ZXh0Rm9ybWF0OworfQorCitGT1JNQVRFVEMq
IGZpbGVuYW1lV0Zvcm1hdCgpCit7CisgICAgc3RhdGljIFVJTlQgY2YgPSBSZWdpc3RlckNsaXBi
b2FyZEZvcm1hdChMIkZpbGVOYW1lVyIpOworICAgIHN0YXRpYyBGT1JNQVRFVEMgdXJsRm9ybWF0
ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5ULCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0
dXJuICZ1cmxGb3JtYXQ7Cit9CisKK0ZPUk1BVEVUQyogZmlsZW5hbWVGb3JtYXQoKQoreworICAg
IHN0YXRpYyBVSU5UIGNmID0gUmVnaXN0ZXJDbGlwYm9hcmRGb3JtYXQoTCJGaWxlTmFtZSIpOwor
ICAgIHN0YXRpYyBGT1JNQVRFVEMgdXJsRm9ybWF0ID0ge2NmLCAwLCBEVkFTUEVDVF9DT05URU5U
LCAtMSwgVFlNRURfSEdMT0JBTH07CisgICAgcmV0dXJuICZ1cmxGb3JtYXQ7Cit9CisKKy8vTVNJ
RSBIVE1MIEZvcm1hdAorRk9STUFURVRDKiBodG1sRm9ybWF0KCkKK3sKKyAgICBzdGF0aWMgVUlO
VCBjZiA9IFJlZ2lzdGVyQ2xpcGJvYXJkRm9ybWF0KEwiSFRNTCBGb3JtYXQiKTsKKyAgICBzdGF0
aWMgRk9STUFURVRDIGh0bWxGb3JtYXQgPSB7Y2YsIDAsIERWQVNQRUNUX0NPTlRFTlQsIC0xLCBU
WU1FRF9IR0xPQkFMfTsKKyAgICByZXR1cm4gJmh0bWxGb3JtYXQ7Cit9CisKK1N0cmluZyBnZXRV
UkwoSURhdGFPYmplY3QqLCBib29sJiwgU3RyaW5nKikKK3sKKyAgICByZXR1cm4gU3RyaW5nKCk7
Cit9CisKK1N0cmluZyBnZXRQbGFpblRleHQoSURhdGFPYmplY3QqIGRhdGFPYmplY3QsIGJvb2wm
IHN1Y2Nlc3MpCit7CisgICAgU1RHTUVESVVNIHN0b3JlOworICAgIFN0cmluZyB0ZXh0OworICAg
IHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpZiAoU1VDQ0VFREVEKGRhdGFPYmplY3QtPkdldERhdGEo
cGxhaW5UZXh0V0Zvcm1hdCgpLCAmc3RvcmUpKSkgeworICAgICAgICAvL3VuaWNvZGUgdGV4dAor
ICAgICAgICBVQ2hhciogZGF0YSA9IChVQ2hhciopR2xvYmFsTG9jayhzdG9yZS5oR2xvYmFsKTsK
KyAgICAgICAgdGV4dCA9IFN0cmluZyhkYXRhKTsKKyAgICAgICAgR2xvYmFsVW5sb2NrKHN0b3Jl
LmhHbG9iYWwpOworICAgICAgICBSZWxlYXNlU3RnTWVkaXVtKCZzdG9yZSk7CisgICAgICAgIHN1
Y2Nlc3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoU1VDQ0VFREVEKGRhdGFPYmplY3QtPkdldERh
dGEocGxhaW5UZXh0Rm9ybWF0KCksICZzdG9yZSkpKSB7CisgICAgICAgIC8vYXNjaWkgdGV4dAor
ICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKUdsb2JhbExvY2soc3RvcmUuaEdsb2JhbCk7Cisg
ICAgICAgIHRleHQgPSBTdHJpbmcoZGF0YSk7CisgICAgICAgIEdsb2JhbFVubG9jayhzdG9yZS5o
R2xvYmFsKTsKKyAgICAgICAgUmVsZWFzZVN0Z01lZGl1bSgmc3RvcmUpOworICAgICAgICBzdWNj
ZXNzID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvL0lmIGEgZmlsZSBpcyBkcm9wcGVk
IG9uIHRoZSB3aW5kb3csIGl0IGRvZXMgbm90IHByb3ZpZGUgZWl0aGVyIG9mIHRoZQorICAgICAg
ICAvL3BsYWluIHRleHQgZm9ybWF0cywgc28gaGVyZSB3ZSB0cnkgdG8gZm9yY2libHkgZ2V0IGEg
dXJsLgorICAgICAgICB0ZXh0ID0gZ2V0VVJMKGRhdGFPYmplY3QsIHN1Y2Nlc3MpOworICAgICAg
ICBzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHRleHQ7Cit9CisKK1Bhc3NSZWZQ
dHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tRmlsZW5hbWVzKERvY3VtZW50KiwgY29u
c3QgSURhdGFPYmplY3QqKQoreworICAgIC8vRklYTUU6IFdlIHNob3VsZCBiZSBhYmxlIHRvIGNy
ZWF0ZSBmcmFnbWVudHMgZnJvbSBmaWxlcworICAgIHJldHVybiAwOworfQorCitib29sIGNvbnRh
aW5zRmlsZW5hbWVzKGNvbnN0IElEYXRhT2JqZWN0KikKK3sKKyAgICAvL0ZJWE1FOiBXZSdsbCB3
YW50IHRvIHVwZGF0ZSB0aGlzIG9uY2Ugd2UgY2FuIHByb2R1Y2UgZnJhZ21lbnRzIGZyb20gZmls
ZXMKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vQ29udmVydCBhIFN0cmluZyBjb250YWluaW5n
IENGX0hUTUwgZm9ybWF0dGVkIHRleHQgdG8gYSBEb2N1bWVudEZyYWdtZW50CitQYXNzUmVmUHRy
PERvY3VtZW50RnJhZ21lbnQ+IGZyYWdtZW50RnJvbUNGX0hUTUwoRG9jdW1lbnQqIGRvYywgY29u
c3QgU3RyaW5nJiBjZl9odG1sKQoreworICAgIC8vIG9idGFpbiBiYXNlVVJMIGlmIHByZXNlbnQK
KyAgICBTdHJpbmcgc3JjVVJMU3RyKCJzb3VyY2VVUkw6Iik7CisgICAgU3RyaW5nIHNyY1VSTDsK
KyAgICB1bnNpZ25lZCBsaW5lU3RhcnQgPSBjZl9odG1sLmZpbmQoc3JjVVJMU3RyLCAwLCBmYWxz
ZSk7CisgICAgaWYgKGxpbmVTdGFydCAhPSAtMSkgeworICAgICAgICB1bnNpZ25lZCBzcmNFbmQg
PSBjZl9odG1sLmZpbmQoIlxuIiwgbGluZVN0YXJ0LCBmYWxzZSk7CisgICAgICAgIHVuc2lnbmVk
IHNyY1N0YXJ0ID0gbGluZVN0YXJ0K3NyY1VSTFN0ci5sZW5ndGgoKTsKKyAgICAgICAgU3RyaW5n
IHJhd1NyY1VSTCA9IGNmX2h0bWwuc3Vic3RyaW5nKHNyY1N0YXJ0LCBzcmNFbmQtc3JjU3RhcnQp
OworICAgICAgICByZXBsYWNlTkJTUFdpdGhTcGFjZShyYXdTcmNVUkwpOworICAgICAgICBzcmNV
UkwgPSByYXdTcmNVUkwuc3RyaXBXaGl0ZVNwYWNlKCk7CisgICAgfQorCisgICAgLy8gZmluZCB0
aGUgbWFya3VwIGJldHdlZW4gIjwhLS1TdGFydEZyYWdtZW50IC0tPiIgYW5kICI8IS0tRW5kRnJh
Z21lbnQgLS0+IiwgYWNjb3VudGluZyBmb3IgYnJvd3NlciBxdWlya3MKKyAgICB1bnNpZ25lZCBt
YXJrdXBTdGFydCA9IGNmX2h0bWwuZmluZCgiPGh0bWwiLCAwLCBmYWxzZSk7CisgICAgdW5zaWdu
ZWQgdGFnU3RhcnQgPSBjZl9odG1sLmZpbmQoInN0YXJ0ZnJhZ21lbnQiLCBtYXJrdXBTdGFydCwg
ZmFsc2UpOworICAgIHVuc2lnbmVkIGZyYWdtZW50U3RhcnQgPSBjZl9odG1sLmZpbmQoJz4nLCB0
YWdTdGFydCkgKyAxOworICAgIHVuc2lnbmVkIHRhZ0VuZCA9IGNmX2h0bWwuZmluZCgiZW5kZnJh
Z21lbnQiLCBmcmFnbWVudFN0YXJ0LCBmYWxzZSk7CisgICAgdW5zaWduZWQgZnJhZ21lbnRFbmQg
PSBjZl9odG1sLnJldmVyc2VGaW5kKCc8JywgdGFnRW5kKTsKKyAgICBTdHJpbmcgbWFya3VwID0g
Y2ZfaHRtbC5zdWJzdHJpbmcoZnJhZ21lbnRTdGFydCwgZnJhZ21lbnRFbmQgLSBmcmFnbWVudFN0
YXJ0KS5zdHJpcFdoaXRlU3BhY2UoKTsKKworICAgIHJldHVybiBjcmVhdGVGcmFnbWVudEZyb21N
YXJrdXAoZG9jLCBtYXJrdXAsIHNyY1VSTCkucmVsZWFzZVJlZigpOworfQorCisKK1Bhc3NSZWZQ
dHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21lbnRGcm9tSFRNTChEb2N1bWVudCogZG9jLCBJRGF0
YU9iamVjdCogZGF0YSkKK3sKKyAgICBpZiAoIWRvYyB8fCAhZGF0YSkKKyAgICAgICAgcmV0dXJu
IDA7CisKKyAgICBTVEdNRURJVU0gc3RvcmU7CisgICAgU3RyaW5nIGh0bWw7CisgICAgU3RyaW5n
IHNyY1VSTDsKKyAgICBpZiAoU1VDQ0VFREVEKGRhdGEtPkdldERhdGEoaHRtbEZvcm1hdCgpLCAm
c3RvcmUpKSkgeworICAgICAgICAvL01TIEhUTUwgRm9ybWF0IHBhcnNpbmcKKyAgICAgICAgY2hh
ciogZGF0YSA9IChjaGFyKilHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBTSVpF
X1QgZGF0YVNpemUgPSA6Okdsb2JhbFNpemUoc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFN0cmlu
ZyBjZl9odG1sKFVURjhFbmNvZGluZygpLmRlY29kZShkYXRhLCBkYXRhU2l6ZSkpOworICAgICAg
ICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0o
JnN0b3JlKTsKKyAgICAgICAgaWYgKFBhc3NSZWZQdHI8RG9jdW1lbnRGcmFnbWVudD4gZnJhZ21l
bnQgPSBmcmFnbWVudEZyb21DRl9IVE1MKGRvYywgY2ZfaHRtbCkpCisgICAgICAgICAgICByZXR1
cm4gZnJhZ21lbnQ7CisgICAgfQorICAgIGlmIChTVUNDRUVERUQoZGF0YS0+R2V0RGF0YSh0ZXh0
SHRtbEZvcm1hdCgpLCAmc3RvcmUpKSkgeworICAgICAgICAvL3JhdyBodG1sCisgICAgICAgIFVD
aGFyKiBkYXRhID0gKFVDaGFyKilHbG9iYWxMb2NrKHN0b3JlLmhHbG9iYWwpOworICAgICAgICBo
dG1sID0gU3RyaW5nKGRhdGEpOworICAgICAgICBHbG9iYWxVbmxvY2soc3RvcmUuaEdsb2JhbCk7
CisgICAgICAgIFJlbGVhc2VTdGdNZWRpdW0oJnN0b3JlKTsKKyAgICAgICAgcmV0dXJuIGNyZWF0
ZUZyYWdtZW50RnJvbU1hcmt1cChkb2MsIGh0bWwsIHNyY1VSTCk7CisgICAgfQorCisgICAgcmV0
dXJuIDA7Cit9CisKK2Jvb2wgY29udGFpbnNIVE1MKElEYXRhT2JqZWN0KiBkYXRhKQoreworICAg
IHJldHVybiBTVUNDRUVERUQoZGF0YS0+UXVlcnlHZXREYXRhKHRleHRIdG1sRm9ybWF0KCkpKSB8
fCBTVUNDRUVERUQoZGF0YS0+UXVlcnlHZXREYXRhKGh0bWxGb3JtYXQoKSkpOworfQorCit9IC8v
IG5hbWVzcGFjZSBXZWJDb3JlCmRpZmYgLS1naXQgYS9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0Ns
aXBib2FyZFdpbmNlLmNwcCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2Uu
Y3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MGM4ZDIKLS0tIC9kZXYv
bnVsbAorKysgYi9XZWJDb3JlL3BsYXRmb3JtL3dpbmNlL0NsaXBib2FyZFdpbmNlLmNwcApAQCAt
MCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFRvcmNoIE1vYmls
ZSBJbmMuCisgKgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk
aXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg
R05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRo
ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBM
aWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRo
aXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNl
ZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxp
ZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQg
YSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmts
aW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgor
ICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJDbGlwYm9hcmRXaW5jZS5oIgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CisKK0NsaXBib2FyZFdpbmNlOjpDbGlwYm9hcmRXaW5jZShD
bGlwYm9hcmRBY2Nlc3NQb2xpY3kgcG9saWN5LCBib29sIGlzRm9yRHJhZ2dpbmcpCis6IENsaXBi
b2FyZChwb2xpY3ksIGlzRm9yRHJhZ2dpbmcpCit7Cit9CisKK0NsaXBib2FyZFdpbmNlOjp+Q2xp
cGJvYXJkV2luY2UoKQoreworfQorCit2b2lkIENsaXBib2FyZFdpbmNlOjpjbGVhckRhdGEoY29u
c3QgU3RyaW5nJikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQorCit2b2lkIENsaXBib2Fy
ZFdpbmNlOjpjbGVhckFsbERhdGEoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK1N0
cmluZyBDbGlwYm9hcmRXaW5jZTo6Z2V0RGF0YShjb25zdCBTdHJpbmcmLCBib29sJikgY29uc3QK
K3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworICAgIHJldHVybiBTdHJpbmcoKTsKK30KKworYm9v
bCBDbGlwYm9hcmRXaW5jZTo6c2V0RGF0YShjb25zdCBTdHJpbmcmLCBjb25zdCBTdHJpbmcmKQor
eworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBleHRl
bnNpb25zIGJleW9uZCBJRSdzIEFQSQorSGFzaFNldDxTdHJpbmc+IENsaXBib2FyZFdpbmNlOjp0
eXBlcygpIGNvbnN0Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKKyAgICByZXR1cm4gSGFzaFNl
dDxTdHJpbmc+KCk7Cit9CisKK3ZvaWQgQ2xpcGJvYXJkV2luY2U6OnNldERyYWdJbWFnZShDYWNo
ZWRJbWFnZSosIGNvbnN0IEludFBvaW50JikKK3sKKyAgICBub3RJbXBsZW1lbnRlZCgpOworfQor
Cit2b2lkIENsaXBib2FyZFdpbmNlOjpzZXREcmFnSW1hZ2VFbGVtZW50KE5vZGUqLCBjb25zdCBJ
bnRQb2ludCYpCit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKworLy9Qcm92aWRlcyB0aGUg
RE9NIHNwZWNpZmllZAorRHJhZ0ltYWdlUmVmIENsaXBib2FyZFdpbmNlOjpjcmVhdGVEcmFnSW1h
Z2UoSW50UG9pbnQmKSBjb25zdAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJu
IERyYWdJbWFnZVJlZigpOworfQorCit2b2lkIENsaXBib2FyZFdpbmNlOjpkZWNsYXJlQW5kV3Jp
dGVEcmFnSW1hZ2UoRWxlbWVudCosIGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBGcmFtZSop
Cit7CisgICAgbm90SW1wbGVtZW50ZWQoKTsKK30KKwordm9pZCBDbGlwYm9hcmRXaW5jZTo6d3Jp
dGVVUkwoY29uc3QgS1VSTCYsIGNvbnN0IFN0cmluZyYsIEZyYW1lKikKK3sKKyAgICBub3RJbXBs
ZW1lbnRlZCgpOworfQorCit2b2lkIENsaXBib2FyZFdpbmNlOjp3cml0ZVJhbmdlKFJhbmdlKiwg
RnJhbWUqKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7Cit9CisKK2Jvb2wgQ2xpcGJvYXJkV2lu
Y2U6Omhhc0RhdGEoKQoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIGZhbHNl
OworfQorCitQYXNzUmVmUHRyPEZpbGVMaXN0PiBDbGlwYm9hcmRXaW5jZTo6ZmlsZXMoKSBjb25z
dAoreworICAgIG5vdEltcGxlbWVudGVkKCk7CisgICAgcmV0dXJuIDA7Cit9CisKK30gLy8gbmFt
ZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJv
YXJkV2luY2UuaCBiL1dlYkNvcmUvcGxhdGZvcm0vd2luY2UvQ2xpcGJvYXJkV2luY2UuaApuZXcg
ZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDhjYmYyCi0tLSAvZGV2L251bGwKKysr
IGIvV2ViQ29yZS9wbGF0Zm9ybS93aW5jZS9DbGlwYm9hcmRXaW5jZS5oCkBAIC0wLDAgKzEsNTUg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBUb3JjaCBNb2JpbGUgSW5jLgorICoK
KyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp
dCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3Ig
KGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkg
aXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1
dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5
IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP
U0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAq
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwg
RmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaWZu
ZGVmIENsaXBib2FyZFdpbmNlX2gKKyNkZWZpbmUgQ2xpcGJvYXJkV2luY2VfaAorCisjaW5jbHVk
ZSAiQ2xpcGJvYXJkLmgiCisjaW5jbHVkZSAiRmlsZUxpc3QuaCIKKworbmFtZXNwYWNlIFdlYkNv
cmUgeworCisgICAgY2xhc3MgQ2xpcGJvYXJkV2luY2UgOiBwdWJsaWMgQ2xpcGJvYXJkLCBwdWJs
aWMgQ2FjaGVkUmVzb3VyY2VDbGllbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgQ2xpcGJvYXJk
V2luY2UoQ2xpcGJvYXJkQWNjZXNzUG9saWN5IHBvbGljeSwgYm9vbCBpc0ZvckRyYWdnaW5nKTsK
KyAgICAgICAgfkNsaXBib2FyZFdpbmNlKCk7CisKKyAgICAgICAgdm9pZCBjbGVhckRhdGEoY29u
c3QgU3RyaW5nJiB0eXBlKTsKKyAgICAgICAgdm9pZCBjbGVhckFsbERhdGEoKTsKKyAgICAgICAg
U3RyaW5nIGdldERhdGEoY29uc3QgU3RyaW5nJiB0eXBlLCBib29sJiBzdWNjZXNzKSBjb25zdDsK
KyAgICAgICAgYm9vbCBzZXREYXRhKGNvbnN0IFN0cmluZyYgdHlwZSwgY29uc3QgU3RyaW5nJiBk
YXRhKTsKKworICAgICAgICAvLyBleHRlbnNpb25zIGJleW9uZCBJRSdzIEFQSQorICAgICAgICBI
YXNoU2V0PFN0cmluZz4gdHlwZXMoKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldERyYWdJbWFn
ZShDYWNoZWRJbWFnZSosIGNvbnN0IEludFBvaW50Jik7CisgICAgICAgIHZvaWQgc2V0RHJhZ0lt
YWdlRWxlbWVudChOb2RlKiwgY29uc3QgSW50UG9pbnQmKTsKKworICAgICAgICB2aXJ0dWFsIERy
YWdJbWFnZVJlZiBjcmVhdGVEcmFnSW1hZ2UoSW50UG9pbnQmIGRyYWdMb2MpIGNvbnN0OworICAg
ICAgICB2aXJ0dWFsIHZvaWQgZGVjbGFyZUFuZFdyaXRlRHJhZ0ltYWdlKEVsZW1lbnQqLCBjb25z
dCBLVVJMJiwgY29uc3QgU3RyaW5nJiB0aXRsZSwgRnJhbWUqKTsKKyAgICAgICAgdmlydHVhbCB2
b2lkIHdyaXRlVVJMKGNvbnN0IEtVUkwmLCBjb25zdCBTdHJpbmcmLCBGcmFtZSopOworICAgICAg
ICB2aXJ0dWFsIHZvaWQgd3JpdGVSYW5nZShSYW5nZSosIEZyYW1lKik7CisKKyAgICAgICAgdmly
dHVhbCBib29sIGhhc0RhdGEoKTsKKyAgICAgICAgdmlydHVhbCBQYXNzUmVmUHRyPEZpbGVMaXN0
PiBmaWxlcygpIGNvbnN0OworICAgIH07CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmIC8vIENsaXBib2FyZFdpbmNlX2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>