<?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>61962</bug_id>
          
          <creation_ts>2011-06-02 14:16:57 -0700</creation_ts>
          <short_desc>[EFL] DRT: Add EventSender.{cpp,h}.</short_desc>
          <delta_ts>2011-06-27 08:11:16 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>61974</dependson>
    
    <dependson>62034</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Leandro Pereira">leandro</reporter>
          <assigned_to name="Leandro Pereira">leandro</assigned_to>
          <cc>rakuco</cc>
    
    <cc>tkent</cc>
    
    <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>414431</commentid>
    <comment_count>0</comment_count>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-02 14:16:57 -0700</bug_when>
    <thetext>[EFL] DRT: Add EventSender.{cpp,h}.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>414435</commentid>
    <comment_count>1</comment_count>
      <attachid>95810</attachid>
    <who name="Leandro Pereira">leandro</who>
    <bug_when>2011-06-02 14:21:27 -0700</bug_when>
    <thetext>Created attachment 95810
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>418840</commentid>
    <comment_count>2</comment_count>
      <attachid>95810</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-10 12:35:25 -0700</bug_when>
    <thetext>Comment on attachment 95810
Patch

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

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:102
&gt; +    if (!modifiers) {
&gt; +        for (unsigned modifier = 0; modifier &lt; 4; ++modifier)
&gt; +            evas_key_modifier_off(evas, modifierNames[modifier]);
&gt; +    } else {

This is redundant, the rest of the loop has this same behavior when !modifiers.

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:164
&gt; +    if (vertical &amp;&amp; horizontal) {
&gt; +        if (event &amp; EVAS_MOUSE_EVENT_SCROLL_UP)
&gt; +            evas_event_feed_mouse_wheel(evas, 0, 10, timestamp, 0);
&gt; +        else
&gt; +            evas_event_feed_mouse_wheel(evas, 0, -10, timestamp, 0);
&gt; +
&gt; +        if (event &amp; EVAS_MOUSE_EVENT_SCROLL_LEFT)
&gt; +            evas_event_feed_mouse_wheel(evas, 1, 10, timestamp, 0);
&gt; +        else
&gt; +            evas_event_feed_mouse_wheel(evas, 1, -10, timestamp, 0);
&gt; +
&gt; +        ++timestamp;
&gt; +    } else {
&gt; +        if (event &amp; EVAS_MOUSE_EVENT_SCROLL_UP)
&gt; +            evas_event_feed_mouse_wheel(evas, 0, 10, timestamp++, 0);
&gt; +        else if (event &amp; EVAS_MOUSE_EVENT_SCROLL_DOWN)
&gt; +            evas_event_feed_mouse_wheel(evas, 0, -10, timestamp++, 0);
&gt; +
&gt; +        if (event &amp; EVAS_MOUSE_EVENT_SCROLL_LEFT)
&gt; +            evas_event_feed_mouse_wheel(evas, 1, 10, timestamp++, 0);
&gt; +        else if (event &amp; EVAS_MOUSE_EVENT_SCROLL_RIGHT)
&gt; +            evas_event_feed_mouse_wheel(evas, 1, -10, timestamp++, 0);
&gt; +    }

Can&apos;t this be written more concisely with some smrart ifs to set a value -1 or 1 to be multipled by the 10?

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:173
&gt; +    Evas* evas = evas_object_evas_get(mainFrame);

No free, I assume?  If not, this whole function can be 1 line.

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:197
&gt; +    JSStringRef string = JSValueToStringCopy(context, value, 0);

Don&apos;t we have a smart pointer for the JSC API?  We must.  Some flavor of RetainPtr maybe?

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:273
&gt; +    lastClickPositionX = lastMousePositionX;
&gt; +    lastClickPositionY = lastMousePositionY;
&gt; +    lastClickButton = buttonCurrentlyDown;
&gt; +    lastClickTimeOffset = timeOffset;

Are these globals?  Can we name them in such a way to distinguish that?

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:317
&gt; +    unsigned mouseEvent = 0;
&gt; +    if (vertical &gt; 0)
&gt; +        mouseEvent |= EVAS_MOUSE_EVENT_SCROLL_UP;
&gt; +    else if (vertical &lt; 0)
&gt; +        mouseEvent |= EVAS_MOUSE_EVENT_SCROLL_DOWN;
&gt; +
&gt; +    if (horizontal &gt; 0)
&gt; +        mouseEvent |= EVAS_MOUSE_EVENT_SCROLL_RIGHT;
&gt; +    else if (horizontal &lt; 0)
&gt; +        mouseEvent |= EVAS_MOUSE_EVENT_SCROLL_LEFT;

I might have made this a helper function.

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:357
&gt; +    if (location == DOM_KEY_LOCATION_NUMPAD) {
&gt; +        if (JSStringIsEqualToUTF8CString(character, &quot;leftArrow&quot;))
&gt; +            keyName = &quot;KP_Left&quot;;
&gt; +        else if (JSStringIsEqualToUTF8CString(character, &quot;rightArrow&quot;))
&gt; +            keyName = &quot;KP_Right&quot;;
&gt; +        else if (JSStringIsEqualToUTF8CString(character, &quot;upArrow&quot;))
&gt; +            keyName = &quot;KP_Up&quot;;
&gt; +        else if (JSStringIsEqualToUTF8CString(character, &quot;downArrow&quot;))
&gt; +            keyName = &quot;KP_Down&quot;;
&gt; +        else if (JSStringIsEqualToUTF8CString(character, &quot;pageUp&quot;))

I definitely would have made these two huge if blocks helper functions. :)

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:466
&gt; +    zoomIn(FALSE);

Bools are a horrible way to specify behavior.  They&apos;re unreadable at teh callsite.  Enums are much preferred.  But I&apos;m nto sure you even want such.  This is dead code at the moment and woudl be better to just remove for now.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>421460</commentid>
    <comment_count>3</comment_count>
      <attachid>97331</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-15 11:18:22 -0700</bug_when>
    <thetext>Created attachment 97331
EventSender, take 2

This version should hopefully be more readable. check-webkit-style will raise a false positive due to context being called context in EventSender.h.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>421464</commentid>
    <comment_count>4</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-15 11:20:28 -0700</bug_when>
    <thetext>Attachment 97331 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Tools/ChangeLog&apos;, u&apos;Tools/DumpRenderTree/e...&quot; exit_code: 1

Tools/DumpRenderTree/efl/EventSender.h:38:  The parameter name &quot;context&quot; adds no information, so it should be removed.  [readability/parameter_name] [5]
Total errors found: 1 in 3 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>421469</commentid>
    <comment_count>5</comment_count>
      <attachid>97334</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-15 11:25:21 -0700</bug_when>
    <thetext>Created attachment 97334
Take 2, now pleasing the style bot</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>423659</commentid>
    <comment_count>6</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-20 07:16:38 -0700</bug_when>
    <thetext>Eric, is there anything you&apos;d still like us to change in the patch?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>423786</commentid>
    <comment_count>7</comment_count>
      <attachid>97334</attachid>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-20 11:17:30 -0700</bug_when>
    <thetext>Comment on attachment 97334
Take 2, now pleasing the style bot

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

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:68
&gt; +    DOM_KEY_LOCATION_STANDARD = 0x00,
&gt; +    DOM_KEY_LOCATION_LEFT     = 0x01,
&gt; +    DOM_KEY_LOCATION_RIGHT    = 0x02,
&gt; +    DOM_KEY_LOCATION_NUMPAD   = 0x03

Why define the values in hex?

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:96
&gt; +enum EvasKeyModifier {
&gt; +    EVAS_KEY_MODIFIER_NONE    = 0,
&gt; +    EVAS_KEY_MODIFIER_CONTROL = 1 &lt;&lt; 0,
&gt; +    EVAS_KEY_MODIFIER_SHIFT   = 1 &lt;&lt; 1,
&gt; +    EVAS_KEY_MODIFIER_ALT     = 1 &lt;&lt; 2,
&gt; +    EVAS_KEY_MODIFIER_META    = 1 &lt;&lt; 3
&gt; +};
&gt; +
&gt; +enum EvasMouseButton {
&gt; +    EVAS_MOUSE_BUTTON_NONE   = 0x00,
&gt; +    EVAS_MOUSE_BUTTON_LEFT   = 0x01,
&gt; +    EVAS_MOUSE_BUTTON_MIDDLE = 0x02,
&gt; +    EVAS_MOUSE_BUTTON_RIGHT  = 0x03
&gt; +};
&gt; +
&gt; +enum EvasMouseEvent {
&gt; +    EVAS_MOUSE_EVENT_NONE         = 0,
&gt; +    EVAS_MOUSE_EVENT_DOWN         = 1 &lt;&lt; 0,
&gt; +    EVAS_MOUSE_EVENT_UP           = 1 &lt;&lt; 1,
&gt; +    EVAS_MOUSE_EVENT_MOVE         = 1 &lt;&lt; 2,
&gt; +    EVAS_MOUSE_EVENT_SCROLL_UP    = 1 &lt;&lt; 3,
&gt; +    EVAS_MOUSE_EVENT_SCROLL_DOWN  = 1 &lt;&lt; 4,
&gt; +    EVAS_MOUSE_EVENT_SCROLL_LEFT  = 1 &lt;&lt; 5,
&gt; +    EVAS_MOUSE_EVENT_SCROLL_RIGHT = 1 &lt;&lt; 6,
&gt; +    EVAS_MOUSE_EVENT_CLICK        = EVAS_MOUSE_EVENT_MOVE | EVAS_MOUSE_EVENT_DOWN | EVAS_MOUSE_EVENT_UP,
&gt; +};

Are these enums which are defined in some EFL header which we should be importing instead of duplicating?

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:179
&gt; +    if (JSStringIsEqualToUTF8CString(jsKeyValue.get(), &quot;ctrlKey&quot;) || JSStringIsEqualToUTF8CString(jsKeyValue.get(), &quot;addSelectionKey&quot;))

I feel like we talked about some sort of equals() helper in one of these patches.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>423787</commentid>
    <comment_count>8</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2011-06-20 11:17:58 -0700</bug_when>
    <thetext>I don&apos;t really want to be involved in EFL patches anymore.  The c-style code is just depressing.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424407</commentid>
    <comment_count>9</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-21 05:48:29 -0700</bug_when>
    <thetext>(In reply to comment #7)
&gt; (From update of attachment 97334 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=97334&amp;action=review
&gt; 
&gt; &gt; Tools/DumpRenderTree/efl/EventSender.cpp:68
&gt; &gt; +    DOM_KEY_LOCATION_STANDARD = 0x00,
&gt; &gt; +    DOM_KEY_LOCATION_LEFT     = 0x01,
&gt; &gt; +    DOM_KEY_LOCATION_RIGHT    = 0x02,
&gt; &gt; +    DOM_KEY_LOCATION_NUMPAD   = 0x03
&gt; 
&gt; Why define the values in hex?

Fixed locally.

&gt; &gt; Tools/DumpRenderTree/efl/EventSender.cpp:96
&gt; &gt; +enum EvasKeyModifier {
&gt; &gt; +    EVAS_KEY_MODIFIER_NONE    = 0,
&gt; &gt; +    EVAS_KEY_MODIFIER_CONTROL = 1 &lt;&lt; 0,
&gt; &gt; +    EVAS_KEY_MODIFIER_SHIFT   = 1 &lt;&lt; 1,
&gt; &gt; +    EVAS_KEY_MODIFIER_ALT     = 1 &lt;&lt; 2,
&gt; &gt; +    EVAS_KEY_MODIFIER_META    = 1 &lt;&lt; 3
&gt; &gt; +};
&gt; &gt; +
&gt; &gt; +enum EvasMouseButton {
&gt; &gt; +    EVAS_MOUSE_BUTTON_NONE   = 0x00,
&gt; &gt; +    EVAS_MOUSE_BUTTON_LEFT   = 0x01,
&gt; &gt; +    EVAS_MOUSE_BUTTON_MIDDLE = 0x02,
&gt; &gt; +    EVAS_MOUSE_BUTTON_RIGHT  = 0x03
&gt; &gt; +};
&gt; &gt; +
&gt; &gt; +enum EvasMouseEvent {
&gt; &gt; +    EVAS_MOUSE_EVENT_NONE         = 0,
&gt; &gt; +    EVAS_MOUSE_EVENT_DOWN         = 1 &lt;&lt; 0,
&gt; &gt; +    EVAS_MOUSE_EVENT_UP           = 1 &lt;&lt; 1,
&gt; &gt; +    EVAS_MOUSE_EVENT_MOVE         = 1 &lt;&lt; 2,
&gt; &gt; +    EVAS_MOUSE_EVENT_SCROLL_UP    = 1 &lt;&lt; 3,
&gt; &gt; +    EVAS_MOUSE_EVENT_SCROLL_DOWN  = 1 &lt;&lt; 4,
&gt; &gt; +    EVAS_MOUSE_EVENT_SCROLL_LEFT  = 1 &lt;&lt; 5,
&gt; &gt; +    EVAS_MOUSE_EVENT_SCROLL_RIGHT = 1 &lt;&lt; 6,
&gt; &gt; +    EVAS_MOUSE_EVENT_CLICK        = EVAS_MOUSE_EVENT_MOVE | EVAS_MOUSE_EVENT_DOWN | EVAS_MOUSE_EVENT_UP,
&gt; &gt; +};
&gt; 
&gt; Are these enums which are defined in some EFL header which we should be importing instead of duplicating?

No.

&gt; &gt; Tools/DumpRenderTree/efl/EventSender.cpp:179
&gt; &gt; +    if (JSStringIsEqualToUTF8CString(jsKeyValue.get(), &quot;ctrlKey&quot;) || JSStringIsEqualToUTF8CString(jsKeyValue.get(), &quot;addSelectionKey&quot;))
&gt; 
&gt; I feel like we talked about some sort of equals() helper in one of these patches.

Fixed locally.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>424555</commentid>
    <comment_count>10</comment_count>
      <attachid>98010</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-21 10:49:26 -0700</bug_when>
    <thetext>Created attachment 98010
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>426046</commentid>
    <comment_count>11</comment_count>
      <attachid>98010</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2011-06-23 02:35:10 -0700</bug_when>
    <thetext>Comment on attachment 98010
Patch

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

&gt; Tools/DumpRenderTree/efl/EventSender.cpp:294
&gt; +    int horizontal = (int)JSValueToNumber(context, arguments[0], exception);
&gt; +    if (exception &amp;&amp; *exception)
&gt; +        return JSValueMakeUndefined(context);
&gt; +    int vertical = (int)JSValueToNumber(context, arguments[1], exception);

C-style cast is not recommended in WebKit.

&gt; Tools/DumpRenderTree/efl/EventSender.h:38
&gt; +JSObjectRef makeEventSender(JSContextRef, bool);

We avoid using bool for a function parameter, and use enum instead.
If you need to use bool, you should write an explanation of the argument in the header.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427908</commentid>
    <comment_count>12</comment_count>
      <attachid>98717</attachid>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-27 06:59:56 -0700</bug_when>
    <thetext>Created attachment 98717
New patch following Kent&apos;s suggestions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427919</commentid>
    <comment_count>13</comment_count>
    <who name="Raphael Kubo da Costa (:rakuco)">rakuco</who>
    <bug_when>2011-06-27 07:26:17 -0700</bug_when>
    <thetext>CC&apos;ing Kent after adding a new patch after his suggestions.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427923</commentid>
    <comment_count>14</comment_count>
      <attachid>98717</attachid>
    <who name="Kent Tamura">tkent</who>
    <bug_when>2011-06-27 07:29:47 -0700</bug_when>
    <thetext>Comment on attachment 98717
New patch following Kent&apos;s suggestions

Rubber-stamped by tkent</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427942</commentid>
    <comment_count>15</comment_count>
      <attachid>98717</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-27 08:11:10 -0700</bug_when>
    <thetext>Comment on attachment 98717
New patch following Kent&apos;s suggestions

Clearing flags on attachment: 98717

Committed r89820: &lt;http://trac.webkit.org/changeset/89820&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>427943</commentid>
    <comment_count>16</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-06-27 08:11:16 -0700</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>95810</attachid>
            <date>2011-06-02 14:21:27 -0700</date>
            <delta_ts>2011-06-15 11:21:34 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-61962-20110602182125.patch</filename>
            <type>text/plain</type>
            <size>27397</size>
            <attacher name="Leandro Pereira">leandro</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDg3OTUwKQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMzkgQEAKKzIwMTEtMDYtMDIgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
W0VGTF0gRFJUOiBBZGQgRXZlbnRTZW5kZXIue2NwcCxofS4KKyAgICAgICAgQnVpbGQgc3lzdGVt
IGNoYW5nZXMgd2lsbCBiZSBtYWRlIGFzIHNvb24gYXMgRFJUIGlzIGZ1bGx5CisgICAgICAgIHVw
c3RyZWFtZWQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9p
ZD02MTk2MgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsOiBBZGRlZC4KKyAgICAgICAg
KiBEdW1wUmVuZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuY3BwOiBBZGRlZC4KKyAgICAgICAgKHNl
dEV2YXNNb2RpZmllcnMpOgorICAgICAgICAodHJhbnNsYXRlTW91c2VCdXR0b25OdW1iZXIpOgor
ICAgICAgICAoc2VuZE1vdXNlRXZlbnQpOgorICAgICAgICAoc2VuZENsaWNrKToKKyAgICAgICAg
KHNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2tDYWxsYmFjayk6CisgICAgICAgICh1cGRhdGVDbGlj
a0NvdW50KToKKyAgICAgICAgKGdldE1vZGlmaWVyRnJvbUpTVmFsdWUpOgorICAgICAgICAoZ2V0
TW9kaWZlcnNGcm9tSlNWYWx1ZSk6CisgICAgICAgIChtb3VzZURvd25DYWxsYmFjayk6CisgICAg
ICAgIChtb3VzZVVwQ2FsbGJhY2spOgorICAgICAgICAobW91c2VNb3ZlVG9DYWxsYmFjayk6Cisg
ICAgICAgIChtb3VzZVNjcm9sbEJ5Q2FsbGJhY2spOgorICAgICAgICAoY29udGludW91c01vdXNl
U2Nyb2xsQnlDYWxsYmFjayk6CisgICAgICAgIChrZXlEb3duQ2FsbGJhY2spOgorICAgICAgICAo
em9vbUluKToKKyAgICAgICAgKHpvb21PdXQpOgorICAgICAgICAodGV4dFpvb21JbkNhbGxiYWNr
KToKKyAgICAgICAgKHRleHRab29tT3V0Q2FsbGJhY2spOgorICAgICAgICAoem9vbVBhZ2VJbkNh
bGxiYWNrKToKKyAgICAgICAgKHpvb21QYWdlT3V0Q2FsbGJhY2spOgorICAgICAgICAoc2NhbGVQ
YWdlQnlDYWxsYmFjayk6CisgICAgICAgIChnZXRDbGFzcyk6CisgICAgICAgIChtYWtlRXZlbnRT
ZW5kZXIpOgorICAgICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbC9FdmVudFNlbmRlci5oOiBBZGRl
ZC4KKwogMjAxMS0wNi0wMiAgRGltaXRyaSBHbGF6a292ICA8ZGdsYXprb3ZAY2hyb21pdW0ub3Jn
PgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhcmluIEFkbGVyLgpJbmRleDogVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmNwcAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9EdW1wUmVu
ZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuY3BwCShyZXZpc2lvbiAwKQorKysgVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmNwcAkocmV2aXNpb24gMCkKQEAgLTAsMCArMSw1NjQg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IFphbiBEb2JlcnNlayA8emFuZG9iZXJz
ZWtAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA5IEhvbGdlciBIYW5zIFBldGVyIEZy
ZXl0aGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdodCAo
QykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICog
My4gIE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5v
ciB0aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVu
ZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3
YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFT
IElTIiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBE
SVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNp
bmNsdWRlICJFdmVudFNlbmRlci5oIgorCisjaW5jbHVkZSAiRHVtcFJlbmRlclRyZWUuaCIKKyNp
bmNsdWRlICJld2tfcHJpdmF0ZS5oIgorI2luY2x1ZGUgPEVXZWJLaXQuaD4KKyNpbmNsdWRlIDxK
YXZhU2NyaXB0Q29yZS9KU09iamVjdFJlZi5oPgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pT
UmV0YWluUHRyLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSlNTdHJpbmdSZWYuaD4KKyNp
bmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHd0Zi9BU0NJSUNUeXBlLmg+CisjaW5jbHVkZSA8
d3RmL1BsYXRmb3JtLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCitzdGF0aWMg
Ym9vbCBkcmFnTW9kZTsKK3N0YXRpYyBpbnQgdGltZU9mZnNldCA9IDA7CisKK3N0YXRpYyBpbnQg
bGFzdE1vdXNlUG9zaXRpb25YOworc3RhdGljIGludCBsYXN0TW91c2VQb3NpdGlvblk7CitzdGF0
aWMgaW50IGxhc3RDbGlja1Bvc2l0aW9uWDsKK3N0YXRpYyBpbnQgbGFzdENsaWNrUG9zaXRpb25Z
Oworc3RhdGljIGludCBsYXN0Q2xpY2tUaW1lT2Zmc2V0Oworc3RhdGljIGludCBsYXN0Q2xpY2tC
dXR0b247CitzdGF0aWMgaW50IGJ1dHRvbkN1cnJlbnRseURvd247CitzdGF0aWMgaW50IGNsaWNr
Q291bnQ7CisKK3N0YXRpYyBjb25zdCBmbG9hdCB6b29tTXVsdGlwbGllclJhdGlvID0gMS4yZjsK
KworLy8gS2V5IGV2ZW50IGxvY2F0aW9uIGNvZGUgZGVmaW5lZCBpbiBET00gTGV2ZWwgMy4KK2Vu
dW0gS2V5TG9jYXRpb25Db2RlIHsKKyAgICBET01fS0VZX0xPQ0FUSU9OX1NUQU5EQVJEID0gMHgw
MCwKKyAgICBET01fS0VZX0xPQ0FUSU9OX0xFRlQgICAgID0gMHgwMSwKKyAgICBET01fS0VZX0xP
Q0FUSU9OX1JJR0hUICAgID0gMHgwMiwKKyAgICBET01fS0VZX0xPQ0FUSU9OX05VTVBBRCAgID0g
MHgwMworfTsKKworZW51bSBFdmFzS2V5TW9kaWZpZXIgeworICAgIEVWQVNfS0VZX01PRElGSUVS
X05PTkUgICAgPSAwLAorICAgIEVWQVNfS0VZX01PRElGSUVSX0NPTlRST0wgPSAxIDw8IDAsCisg
ICAgRVZBU19LRVlfTU9ESUZJRVJfU0hJRlQgICA9IDEgPDwgMSwKKyAgICBFVkFTX0tFWV9NT0RJ
RklFUl9BTFQgICAgID0gMSA8PCAyLAorICAgIEVWQVNfS0VZX01PRElGSUVSX01FVEEgICAgPSAx
IDw8IDMKK307CisKK2VudW0gRXZhc01vdXNlQnV0dG9uIHsKKyAgICBFVkFTX01PVVNFX0JVVFRP
Tl9OT05FICAgPSAweDAwLAorICAgIEVWQVNfTU9VU0VfQlVUVE9OX0xFRlQgICA9IDB4MDEsCisg
ICAgRVZBU19NT1VTRV9CVVRUT05fTUlERExFID0gMHgwMiwKKyAgICBFVkFTX01PVVNFX0JVVFRP
Tl9SSUdIVCAgPSAweDAzCit9OworCitlbnVtIEV2YXNNb3VzZUV2ZW50IHsKKyAgICBFVkFTX01P
VVNFX0VWRU5UX05PTkUgICAgICAgICA9IDAsCisgICAgRVZBU19NT1VTRV9FVkVOVF9ET1dOICAg
ICAgICAgPSAxIDw8IDAsCisgICAgRVZBU19NT1VTRV9FVkVOVF9VUCAgICAgICAgICAgPSAxIDw8
IDEsCisgICAgRVZBU19NT1VTRV9FVkVOVF9NT1ZFICAgICAgICAgPSAxIDw8IDIsCisgICAgRVZB
U19NT1VTRV9FVkVOVF9TQ1JPTExfVVAgICAgPSAxIDw8IDMsCisgICAgRVZBU19NT1VTRV9FVkVO
VF9TQ1JPTExfRE9XTiAgPSAxIDw8IDQsCisgICAgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfTEVG
VCAgPSAxIDw8IDUsCisgICAgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfUklHSFQgPSAxIDw8IDYs
CisgICAgRVZBU19NT1VTRV9FVkVOVF9DTElDSyAgICAgICAgPSBFVkFTX01PVVNFX0VWRU5UX01P
VkUgfCBFVkFTX01PVVNFX0VWRU5UX0RPV04gfCBFVkFTX01PVVNFX0VWRU5UX1VQLAorfTsKKwor
c3RhdGljIHZvaWQgc2V0RXZhc01vZGlmaWVycyhFdmFzKiBldmFzLCBFdmFzS2V5TW9kaWZpZXIg
bW9kaWZpZXJzKQoreworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBtb2RpZmllck5hbWVzW10gPSB7
ICJDb250cm9sIiwgIlNoaWZ0IiwgIkFsdCIsICJTdXBlciIgfTsKKyAgICBpZiAoIW1vZGlmaWVy
cykgeworICAgICAgICBmb3IgKHVuc2lnbmVkIG1vZGlmaWVyID0gMDsgbW9kaWZpZXIgPCA0OyAr
K21vZGlmaWVyKQorICAgICAgICAgICAgZXZhc19rZXlfbW9kaWZpZXJfb2ZmKGV2YXMsIG1vZGlm
aWVyTmFtZXNbbW9kaWZpZXJdKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHVuc2lnbmVk
IG1vZGlmaWVyID0gMDsgbW9kaWZpZXIgPCA0OyArK21vZGlmaWVyKSB7CisgICAgICAgICAgICBp
ZiAobW9kaWZpZXJzICYgKDEgPDwgbW9kaWZpZXIpKQorICAgICAgICAgICAgICAgIGV2YXNfa2V5
X21vZGlmaWVyX29uKGV2YXMsIG1vZGlmaWVyTmFtZXNbbW9kaWZpZXJdKTsKKyAgICAgICAgICAg
IGVsc2UKKyAgICAgICAgICAgICAgICBldmFzX2tleV9tb2RpZmllcl9vZmYoZXZhcywgbW9kaWZp
ZXJOYW1lc1ttb2RpZmllcl0pOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgRXZhc01v
dXNlQnV0dG9uIHRyYW5zbGF0ZU1vdXNlQnV0dG9uTnVtYmVyKGludCBldmVudFNlbmRlckJ1dHRv
bk51bWJlcikKK3sKKyAgICBzd2l0Y2ggKGV2ZW50U2VuZGVyQnV0dG9uTnVtYmVyKSB7CisgICAg
Y2FzZSAwOgorICAgICAgICByZXR1cm4gRVZBU19NT1VTRV9CVVRUT05fTEVGVDsKKyAgICBjYXNl
IDE6CisgICAgICAgIHJldHVybiBFVkFTX01PVVNFX0JVVFRPTl9NSURETEU7CisgICAgY2FzZSAy
OgorICAgICAgICByZXR1cm4gRVZBU19NT1VTRV9CVVRUT05fUklHSFQ7CisgICAgY2FzZSAzOgor
ICAgICAgICAvLyBmYXN0L2V2ZW50cy9tb3VzZS1jbGljay1ldmVudHMgZXhwZWN0cyB0aGUgNHRo
IGJ1dHRvbiB0byBiZSB0cmVhdGVkIGFzIHRoZSBtaWRkbGUgYnV0dG9uCisgICAgICAgIHJldHVy
biBFVkFTX01PVVNFX0JVVFRPTl9NSURETEU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJu
IEVWQVNfTU9VU0VfQlVUVE9OX0xFRlQ7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBzZW5kTW91
c2VFdmVudChFdmFzKiBldmFzLCBFdmFzTW91c2VFdmVudCBldmVudCwgaW50IGJ1dHRvbk51bWJl
ciwgRXZhc0tleU1vZGlmaWVyIG1vZGlmaWVycykKK3sKKyAgICB1bnNpZ25lZCB0aW1lc3RhbXAg
PSAwOworICAgIHNldEV2YXNNb2RpZmllcnMoZXZhcywgbW9kaWZpZXJzKTsKKyAgICBpZiAoZXZl
bnQgJiBFVkFTX01PVVNFX0VWRU5UX01PVkUpCisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3Vz
ZV9tb3ZlKGV2YXMsIGxhc3RNb3VzZVBvc2l0aW9uWCwgbGFzdE1vdXNlUG9zaXRpb25ZLCB0aW1l
c3RhbXArKywgMCk7CisgICAgaWYgKGV2ZW50ICYgRVZBU19NT1VTRV9FVkVOVF9ET1dOKQorICAg
ICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2VfZG93bihldmFzLCBidXR0b25OdW1iZXIsIEVWQVNf
QlVUVE9OX05PTkUsIHRpbWVzdGFtcCsrLCAwKTsKKyAgICBpZiAoZXZlbnQgJiBFVkFTX01PVVNF
X0VWRU5UX1VQKQorICAgICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2VfdXAoZXZhcywgYnV0dG9u
TnVtYmVyLCBFVkFTX0JVVFRPTl9OT05FLCB0aW1lc3RhbXArKywgMCk7CisKKyAgICBjb25zdCBi
b29sIGhvcml6b250YWwgPSAhIShldmVudCAmIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX0xFRlQg
fCBldmVudCAmIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX1JJR0hUKTsKKyAgICBjb25zdCBib29s
IHZlcnRpY2FsID0gISEoZXZlbnQgJiBFVkFTX01PVVNFX0VWRU5UX1NDUk9MTF9VUCB8IGV2ZW50
ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfRE9XTik7CisgICAgaWYgKHZlcnRpY2FsICYmIGhv
cml6b250YWwpIHsKKyAgICAgICAgaWYgKGV2ZW50ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExf
VVApCisgICAgICAgICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywgMCwgMTAs
IHRpbWVzdGFtcCwgMCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV2YXNfZXZlbnRfZmVl
ZF9tb3VzZV93aGVlbChldmFzLCAwLCAtMTAsIHRpbWVzdGFtcCwgMCk7CisKKyAgICAgICAgaWYg
KGV2ZW50ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfTEVGVCkKKyAgICAgICAgICAgIGV2YXNf
ZXZlbnRfZmVlZF9tb3VzZV93aGVlbChldmFzLCAxLCAxMCwgdGltZXN0YW1wLCAwKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgZXZhc19ldmVudF9mZWVkX21vdXNlX3doZWVsKGV2YXMsIDEs
IC0xMCwgdGltZXN0YW1wLCAwKTsKKworICAgICAgICArK3RpbWVzdGFtcDsKKyAgICB9IGVsc2Ug
eworICAgICAgICBpZiAoZXZlbnQgJiBFVkFTX01PVVNFX0VWRU5UX1NDUk9MTF9VUCkKKyAgICAg
ICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV93aGVlbChldmFzLCAwLCAxMCwgdGltZXN0YW1w
KyssIDApOworICAgICAgICBlbHNlIGlmIChldmVudCAmIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xM
X0RPV04pCisgICAgICAgICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywgMCwg
LTEwLCB0aW1lc3RhbXArKywgMCk7CisKKyAgICAgICAgaWYgKGV2ZW50ICYgRVZBU19NT1VTRV9F
VkVOVF9TQ1JPTExfTEVGVCkKKyAgICAgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV93aGVl
bChldmFzLCAxLCAxMCwgdGltZXN0YW1wKyssIDApOworICAgICAgICBlbHNlIGlmIChldmVudCAm
IEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX1JJR0hUKQorICAgICAgICAgICAgZXZhc19ldmVudF9m
ZWVkX21vdXNlX3doZWVsKGV2YXMsIDEsIC0xMCwgdGltZXN0YW1wKyssIDApOworICAgIH0KKwor
ICAgIHNldEV2YXNNb2RpZmllcnMoZXZhcywgRVZBU19LRVlfTU9ESUZJRVJfTk9ORSk7CisKKyAg
ICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBzZW5kQ2xpY2sodm9pZCopCit7
CisgICAgRXZhcyogZXZhcyA9IGV2YXNfb2JqZWN0X2V2YXNfZ2V0KG1haW5GcmFtZSk7CisKKyAg
ICByZXR1cm4gISFzZW5kTW91c2VFdmVudChldmFzLCBFVkFTX01PVVNFX0VWRU5UX0NMSUNLLCBF
VkFTX01PVVNFX0JVVFRPTl9MRUZULCBFVkFTX0tFWV9NT0RJRklFUl9OT05FKTsKK30KKworc3Rh
dGljIEpTVmFsdWVSZWYgc2NoZWR1bGVBc3luY2hyb25vdXNDbGlja0NhbGxiYWNrKEpTQ29udGV4
dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVj
dCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpT
VmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBlY29yZV9pZGxlcl9hZGQoc2VuZENsaWNrLCAw
KTsKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRp
YyB2b2lkIHVwZGF0ZUNsaWNrQ291bnQoaW50IGJ1dHRvbikKK3sKKyAgICBpZiAobGFzdENsaWNr
UG9zaXRpb25YICE9IGxhc3RNb3VzZVBvc2l0aW9uWAorICAgICAgICB8fCBsYXN0Q2xpY2tQb3Np
dGlvblkgIT0gbGFzdE1vdXNlUG9zaXRpb25ZCisgICAgICAgIHx8IGxhc3RDbGlja0J1dHRvbiAh
PSBidXR0b24KKyAgICAgICAgfHwgdGltZU9mZnNldCAtIGxhc3RDbGlja1RpbWVPZmZzZXQgPj0g
MSkKKyAgICAgICAgY2xpY2tDb3VudCA9IDE7CisgICAgZWxzZQorICAgICAgICBjbGlja0NvdW50
Kys7Cit9CisKK3N0YXRpYyBFdmFzS2V5TW9kaWZpZXIgZ2V0TW9kaWZpZXJGcm9tSlNWYWx1ZShK
U0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgSlNWYWx1ZVJlZiB2YWx1ZSkKK3sKKyAgICBKU1N0
cmluZ1JlZiBzdHJpbmcgPSBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIHZhbHVlLCAwKTsK
KyAgICBFdmFzS2V5TW9kaWZpZXIgbW9kaWZpZXIgPSBFVkFTX0tFWV9NT0RJRklFUl9OT05FOwor
CisgICAgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoc3RyaW5nLCAiY3RybEtleSIp
IHx8IEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoc3RyaW5nLCAiYWRkU2VsZWN0aW9uS2V5
IikpCisgICAgICAgIG1vZGlmaWVyID0gRVZBU19LRVlfTU9ESUZJRVJfQ09OVFJPTDsKKyAgICBl
bHNlIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKHN0cmluZywgInNoaWZ0S2V5Iikg
fHwgSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhzdHJpbmcsICJyYW5nZVNlbGVjdGlvbktl
eSIpKQorICAgICAgICBtb2RpZmllciA9IEVWQVNfS0VZX01PRElGSUVSX1NISUZUOworICAgIGVs
c2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoc3RyaW5nLCAiYWx0S2V5IikpCisg
ICAgICAgIG1vZGlmaWVyID0gRVZBU19LRVlfTU9ESUZJRVJfQUxUOworICAgIGVsc2UgaWYgKEpT
U3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoc3RyaW5nLCAibWV0YUtleSIpKQorICAgICAgICBt
b2RpZmllciA9IEVWQVNfS0VZX01PRElGSUVSX01FVEE7CisKKyAgICBKU1N0cmluZ1JlbGVhc2Uo
c3RyaW5nKTsKKworICAgIHJldHVybiBtb2RpZmllcjsKK30KKworc3RhdGljIEV2YXNLZXlNb2Rp
ZmllciBnZXRNb2RpZmVyc0Zyb21KU1ZhbHVlKEpTQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBK
U1ZhbHVlUmVmIG1vZGlmaWVycykKK3sKKyAgICAvLyBUaGUgdmFsdWUgbWF5IGVpdGhlciBiZSBh
IHN0cmluZyB3aXRoIGEgc2luZ2xlIG1vZGlmaWVyIG9yIGFuIGFycmF5IG9mIG1vZGlmaWVycy4K
KyAgICBpZiAoSlNWYWx1ZUlzU3RyaW5nKGNvbnRleHQsIG1vZGlmaWVycykpCisgICAgICAgIHJl
dHVybiBnZXRNb2RpZmllckZyb21KU1ZhbHVlKGNvbnRleHQsIG1vZGlmaWVycyk7CisKKyAgICBK
U09iamVjdFJlZiBtb2RpZmllcnNBcnJheSA9IEpTVmFsdWVUb09iamVjdChjb250ZXh0LCBtb2Rp
ZmllcnMsIDApOworICAgIGlmICghbW9kaWZpZXJzQXJyYXkpCisgICAgICAgIHJldHVybiBFVkFT
X0tFWV9NT0RJRklFUl9OT05FOworCisgICAgdW5zaWduZWQgbW9kaWZpZXIgPSAwOworICAgIGlu
dCBtb2RpZmllcnNDb3VudCA9IEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBKU09iamVjdEdldFBy
b3BlcnR5KGNvbnRleHQsIG1vZGlmaWVyc0FycmF5LCBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0
cmluZygibGVuZ3RoIiksIDApLCAwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZGlmaWVy
c0NvdW50OyArK2kpCisgICAgICAgIG1vZGlmaWVyIHw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihn
ZXRNb2RpZmllckZyb21KU1ZhbHVlKGNvbnRleHQsIEpTT2JqZWN0R2V0UHJvcGVydHlBdEluZGV4
KGNvbnRleHQsIG1vZGlmaWVyc0FycmF5LCBpLCAwKSkpOworICAgIHJldHVybiBzdGF0aWNfY2Fz
dDxFdmFzS2V5TW9kaWZpZXI+KG1vZGlmaWVyKTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgbW91
c2VEb3duQ2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9u
LCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNW
YWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIGludCBi
dXR0b24gPSAwOworICAgIGlmIChhcmd1bWVudENvdW50ID09IDEpIHsKKyAgICAgICAgYnV0dG9u
ID0gc3RhdGljX2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzBd
LCBleGNlcHRpb24pKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uICYmICpleGNlcHRpb24pCisg
ICAgICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisgICAgfQor
ICAgIEV2YXNLZXlNb2RpZmllciBtb2RpZmllcnMgPSBhcmd1bWVudENvdW50ID49IDIgPyBnZXRN
b2RpZmVyc0Zyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3VtZW50c1sxXSkgOiBFVkFTX0tFWV9NT0RJ
RklFUl9OT05FOworCisgICAgYnV0dG9uID0gdHJhbnNsYXRlTW91c2VCdXR0b25OdW1iZXIoYnV0
dG9uKTsKKworICAgIC8vIElmIHRoZSBzYW1lIG1vdXNlIGJ1dHRvbiBpcyBhbHJlYWR5IGluIHRo
ZSBkb3duIHBvc2l0aW9uIGRvbid0IHNlbmQgYW5vdGhlciBldmVudCBhcyBpdCBtYXkgY29uZnVz
ZSBYdmZiLgorICAgIGlmIChidXR0b25DdXJyZW50bHlEb3duID09IGJ1dHRvbikKKyAgICAgICAg
cmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgdXBkYXRlQ2xpY2tD
b3VudChidXR0b24pOworCisgICAgaWYgKCFzZW5kTW91c2VFdmVudChldmFzX29iamVjdF9ldmFz
X2dldChtYWluRnJhbWUpLCBFVkFTX01PVVNFX0VWRU5UX0RPV04sIGJ1dHRvbiwgbW9kaWZpZXJz
KSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAg
YnV0dG9uQ3VycmVudGx5RG93biA9IGJ1dHRvbjsKKworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVu
ZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgbW91c2VVcENhbGxiYWNr
KEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYg
dGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1l
bnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpbnQgYnV0dG9uID0gMDsKKyAg
ICBpZiAoYXJndW1lbnRDb3VudCA9PSAxKSB7CisgICAgICAgIGJ1dHRvbiA9IHN0YXRpY19jYXN0
PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7
CisgICAgICAgIGlmIChleGNlcHRpb24gJiYgKmV4Y2VwdGlvbikKKyAgICAgICAgICAgIHJldHVy
biBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICB9CisgICAgRXZhc0tleU1vZGlm
aWVyIG1vZGlmaWVycyA9IGFyZ3VtZW50Q291bnQgPj0gMiA/IGdldE1vZGlmZXJzRnJvbUpTVmFs
dWUoY29udGV4dCwgYXJndW1lbnRzWzFdKSA6IEVWQVNfS0VZX01PRElGSUVSX05PTkU7CisKKyAg
ICBidXR0b24gPSB0cmFuc2xhdGVNb3VzZUJ1dHRvbk51bWJlcihidXR0b24pOworCisgICAgbGFz
dENsaWNrUG9zaXRpb25YID0gbGFzdE1vdXNlUG9zaXRpb25YOworICAgIGxhc3RDbGlja1Bvc2l0
aW9uWSA9IGxhc3RNb3VzZVBvc2l0aW9uWTsKKyAgICBsYXN0Q2xpY2tCdXR0b24gPSBidXR0b25D
dXJyZW50bHlEb3duOworICAgIGxhc3RDbGlja1RpbWVPZmZzZXQgPSB0aW1lT2Zmc2V0OworICAg
IGJ1dHRvbkN1cnJlbnRseURvd24gPSAwOworCisgICAgc2VuZE1vdXNlRXZlbnQoZXZhc19vYmpl
Y3RfZXZhc19nZXQobWFpbkZyYW1lKSwgRVZBU19NT1VTRV9FVkVOVF9VUCwgYnV0dG9uLCBtb2Rp
ZmllcnMpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKwor
c3RhdGljIEpTVmFsdWVSZWYgbW91c2VNb3ZlVG9DYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4
dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBh
cmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBl
eGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAyKQorICAgICAgICByZXR1cm4g
SlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBsYXN0TW91c2VQb3NpdGlvblgg
PSAoaW50KUpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMF0sIGV4Y2VwdGlvbik7
CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gSlNWYWx1
ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisgICAgbGFzdE1vdXNlUG9zaXRpb25ZID0gKGludClK
U1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzFdLCBleGNlcHRpb24pOworICAgIGlm
IChleGNlcHRpb24gJiYgKmV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5k
ZWZpbmVkKGNvbnRleHQpOworCisgICAgc2VuZE1vdXNlRXZlbnQoZXZhc19vYmplY3RfZXZhc19n
ZXQobWFpbkZyYW1lKSwgRVZBU19NT1VTRV9FVkVOVF9NT1ZFLCBFVkFTX01PVVNFX0JVVFRPTl9O
T05FLCBFVkFTX0tFWV9NT0RJRklFUl9OT05FKTsKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRl
ZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNlU2Nyb2xsQnlDYWxs
YmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0
UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFy
Z3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291
bnQgPCAyKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisK
KyAgICBpbnQgaG9yaXpvbnRhbCA9IChpbnQpSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3Vt
ZW50c1swXSwgZXhjZXB0aW9uKTsKKyAgICBpZiAoZXhjZXB0aW9uICYmICpleGNlcHRpb24pCisg
ICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICBpbnQgdmVy
dGljYWwgPSAoaW50KUpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4Y2Vw
dGlvbik7CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4g
SlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICB1bnNpZ25lZCBtb3VzZUV2ZW50
ID0gMDsKKyAgICBpZiAodmVydGljYWwgPiAwKQorICAgICAgICBtb3VzZUV2ZW50IHw9IEVWQVNf
TU9VU0VfRVZFTlRfU0NST0xMX1VQOworICAgIGVsc2UgaWYgKHZlcnRpY2FsIDwgMCkKKyAgICAg
ICAgbW91c2VFdmVudCB8PSBFVkFTX01PVVNFX0VWRU5UX1NDUk9MTF9ET1dOOworCisgICAgaWYg
KGhvcml6b250YWwgPiAwKQorICAgICAgICBtb3VzZUV2ZW50IHw9IEVWQVNfTU9VU0VfRVZFTlRf
U0NST0xMX1JJR0hUOworICAgIGVsc2UgaWYgKGhvcml6b250YWwgPCAwKQorICAgICAgICBtb3Vz
ZUV2ZW50IHw9IEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX0xFRlQ7CisKKyAgICBzZW5kTW91c2VF
dmVudChldmFzX29iamVjdF9ldmFzX2dldChtYWluRnJhbWUpLCBzdGF0aWNfY2FzdDxFdmFzTW91
c2VFdmVudD4obW91c2VFdmVudCksIEVWQVNfTU9VU0VfQlVUVE9OX05PTkUsIEVWQVNfS0VZX01P
RElGSUVSX05PTkUpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsK
K30KKworc3RhdGljIEpTVmFsdWVSZWYgY29udGludW91c01vdXNlU2Nyb2xsQnlDYWxsYmFjayhK
U0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRo
aXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50
c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5k
ZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBrZXlEb3duQ2FsbGJhY2so
SlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0
aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVu
dHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIEV2YXNfT2JqZWN0KiB2aWV3ID0g
ZXdrX2ZyYW1lX3ZpZXdfZ2V0KG1haW5GcmFtZSk7CisgICAgaWYgKCF2aWV3KQorICAgICAgICBy
ZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBpZiAoYXJndW1lbnRD
b3VudCA8IDEpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsK
KyAgICBFdmFzS2V5TW9kaWZpZXIgbW9kaWZpZXJzID0gYXJndW1lbnRDb3VudCA+PSAyID8gZ2V0
TW9kaWZlcnNGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmd1bWVudHNbMV0pIDogRVZBU19LRVlfTU9E
SUZJRVJfTk9ORTsKKworICAgIC8vIGhhbmRsZSBsb2NhdGlvbiBhcmd1bWVudC4KKyAgICBpbnQg
bG9jYXRpb24gPSBET01fS0VZX0xPQ0FUSU9OX1NUQU5EQVJEOworICAgIGlmIChhcmd1bWVudENv
dW50ID4gMikKKyAgICAgICAgbG9jYXRpb24gPSAoaW50KUpTVmFsdWVUb051bWJlcihjb250ZXh0
LCBhcmd1bWVudHNbMl0sIGV4Y2VwdGlvbik7CisKKyAgICBKU1N0cmluZ1JlZiBjaGFyYWN0ZXIg
PSBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKTsK
KyAgICBpZiAoZXhjZXB0aW9uICYmICpleGNlcHRpb24pCisgICAgICAgIHJldHVybiBKU1ZhbHVl
TWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGNvbnN0IGNoYXIqIGtleU5hbWUgPSAiVm9p
ZFN5bWJvbCI7CisgICAgaWYgKGxvY2F0aW9uID09IERPTV9LRVlfTE9DQVRJT05fTlVNUEFEKSB7
CisgICAgICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgImxl
ZnRBcnJvdyIpKQorICAgICAgICAgICAga2V5TmFtZSA9ICJLUF9MZWZ0IjsKKyAgICAgICAgZWxz
ZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJyaWdodEFycm93
IikpCisgICAgICAgICAgICBrZXlOYW1lID0gIktQX1JpZ2h0IjsKKyAgICAgICAgZWxzZSBpZiAo
SlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJ1cEFycm93IikpCisgICAg
ICAgICAgICBrZXlOYW1lID0gIktQX1VwIjsKKyAgICAgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0Vx
dWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJkb3duQXJyb3ciKSkKKyAgICAgICAgICAgIGtl
eU5hbWUgPSAiS1BfRG93biI7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRG
OENTdHJpbmcoY2hhcmFjdGVyLCAicGFnZVVwIikpCisgICAgICAgICAgICBrZXlOYW1lID0gIktQ
X1BhZ2VfVXAiOworICAgICAgICBlbHNlIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5n
KGNoYXJhY3RlciwgInBhZ2VEb3duIikpCisgICAgICAgICAgICBrZXlOYW1lID0gIktQX1BhZ2Vf
RG93biI7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hh
cmFjdGVyLCAiaG9tZSIpKQorICAgICAgICAgICAga2V5TmFtZSA9ICJLUF9Ib21lIjsKKyAgICAg
ICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJlbmQi
KSkKKyAgICAgICAgICAgIGtleU5hbWUgPSAiS1BfRW5kIjsKKyAgICAgICAgZWxzZSBpZiAoSlNT
dHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJpbnNlcnQiKSkKKyAgICAgICAg
ICAgIGtleU5hbWUgPSAiS1BfSW5zZXJ0IjsKKyAgICAgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0Vx
dWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJkZWxldGUiKSkKKyAgICAgICAgICAgIGtleU5h
bWUgPSAiS1BfRGVsZXRlIjsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBn
ZXQgc29tZSBvdGhlciBrZXkgc3BlY2lmaWVkIHdpdGggdGhlIG51bXBhZCBsb2NhdGlvbiwKKyAg
ICAgICAgICAgIC8vIGNyYXNoIGhlcmUsIHNvIHdlIGFkZCBpdCBzb29uZXIgcmF0aGVyIHRoYW4g
bGF0ZXIuCisgICAgICAgICAgICBjaGFyKiB1bmhhbmRsZWRLZXlOYW1lID0gSlNTdHJpbmdDb3B5
VVRGOENTdHJpbmcoY2hhcmFjdGVyKTsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibnVt
ZXJpYyBwYWQga2V5IG5vdCBoYW5kbGVkOiAlc1xuIiwgdW5oYW5kbGVkS2V5TmFtZSk7CisgICAg
ICAgICAgICBmcmVlKHVuaGFuZGxlZEtleU5hbWUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAg
ICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhD
U3RyaW5nKGNoYXJhY3RlciwgImxlZnRBcnJvdyIpKQorICAgICAgICAgICAga2V5TmFtZSA9ICJM
ZWZ0IjsKKyAgICAgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFy
YWN0ZXIsICJyaWdodEFycm93IikpCisgICAgICAgICAgICBrZXlOYW1lID0gIlJpZ2h0IjsKKyAg
ICAgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJ1
cEFycm93IikpCisgICAgICAgICAgICBrZXlOYW1lID0gIlVwIjsKKyAgICAgICAgZWxzZSBpZiAo
SlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJkb3duQXJyb3ciKSkKKyAg
ICAgICAgICAgIGtleU5hbWUgPSAiRG93biI7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNF
cXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAicGFnZVVwIikpCisgICAgICAgICAgICBrZXlO
YW1lID0gIlBhZ2VfVXAiOworICAgICAgICBlbHNlIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhD
U3RyaW5nKGNoYXJhY3RlciwgInBhZ2VEb3duIikpCisgICAgICAgICAgICBrZXlOYW1lID0gIlBh
Z2VfRG93biI7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmco
Y2hhcmFjdGVyLCAiaG9tZSIpKQorICAgICAgICAgICAga2V5TmFtZSA9ICJIb21lIjsKKyAgICAg
ICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJlbmQi
KSkKKyAgICAgICAgICAgIGtleU5hbWUgPSAiRW5kIjsKKyAgICAgICAgZWxzZSBpZiAoSlNTdHJp
bmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJpbnNlcnQiKSkKKyAgICAgICAgICAg
IGtleU5hbWUgPSAiSW5zZXJ0IjsKKyAgICAgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9V
VEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJkZWxldGUiKSkKKyAgICAgICAgICAgIGtleU5hbWUgPSAi
RGVsZXRlIjsKKyAgICAgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhj
aGFyYWN0ZXIsICJwcmludFNjcmVlbiIpKQorICAgICAgICAgICAga2V5TmFtZSA9ICJQcmludCI7
CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVy
LCAibWVudSIpKQorICAgICAgICAgICAga2V5TmFtZSA9ICJNZW51IjsKKyAgICAgICAgZWxzZSBp
ZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGMSIpKQorICAgICAg
ICAgICAga2V5TmFtZSA9ICJGMSI7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRv
VVRGOENTdHJpbmcoY2hhcmFjdGVyLCAiRjIiKSkKKyAgICAgICAgICAgIGtleU5hbWUgPSAiRjIi
OworICAgICAgICBlbHNlIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3Rl
ciwgIkYzIikpCisgICAgICAgICAgICBrZXlOYW1lID0gIkYzIjsKKyAgICAgICAgZWxzZSBpZiAo
SlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGNCIpKQorICAgICAgICAg
ICAga2V5TmFtZSA9ICJGNCI7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRG
OENTdHJpbmcoY2hhcmFjdGVyLCAiRjUiKSkKKyAgICAgICAgICAgIGtleU5hbWUgPSAiRjUiOwor
ICAgICAgICBlbHNlIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3Rlciwg
IkY2IikpCisgICAgICAgICAgICBrZXlOYW1lID0gIkY2IjsKKyAgICAgICAgZWxzZSBpZiAoSlNT
dHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGNyIpKQorICAgICAgICAgICAg
a2V5TmFtZSA9ICJGNyI7CisgICAgICAgIGVsc2UgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENT
dHJpbmcoY2hhcmFjdGVyLCAiRjgiKSkKKyAgICAgICAgICAgIGtleU5hbWUgPSAiRjgiOworICAg
ICAgICBlbHNlIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgIkY5
IikpCisgICAgICAgICAgICBrZXlOYW1lID0gIkY5IjsKKyAgICAgICAgZWxzZSBpZiAoSlNTdHJp
bmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGMTAiKSkKKyAgICAgICAgICAgIGtl
eU5hbWUgPSAiRjEwIjsKKyAgICAgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0
cmluZyhjaGFyYWN0ZXIsICJGMTEiKSkKKyAgICAgICAgICAgIGtleU5hbWUgPSAiRjExIjsKKyAg
ICAgICAgZWxzZSBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJG
MTIiKSkKKyAgICAgICAgICAgIGtleU5hbWUgPSAiRjEyIjsKKyAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICBpbnQgY2hhckNvZGUgPSBKU1N0cmluZ0dldENoYXJhY3RlcnNQdHIoY2hhcmFjdGVy
KVswXTsKKyAgICAgICAgICAgIGlmIChjaGFyQ29kZSA9PSAnXG4nIHx8IGNoYXJDb2RlID09ICdc
cicpCisgICAgICAgICAgICAgICAga2V5TmFtZSA9ICJSZXR1cm4iOworICAgICAgICAgICAgZWxz
ZSBpZiAoY2hhckNvZGUgPT0gJ1x0JykKKyAgICAgICAgICAgICAgICBrZXlOYW1lID0gIlRhYiI7
CisgICAgICAgICAgICBlbHNlIGlmIChjaGFyQ29kZSA9PSAnXHg4JykKKyAgICAgICAgICAgICAg
ICBrZXlOYW1lID0gIkJhY2tTcGFjZSI7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBjaGFyKiB1bmhhbmRsZWRLZXlOYW1lID0gSlNTdHJpbmdDb3B5VVRGOENTdHJpbmcoY2hh
cmFjdGVyKTsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImtleSBub3QgaGFuZGxl
ZDogJXNcbiIsIHVuaGFuZGxlZEtleU5hbWUpOworICAgICAgICAgICAgICAgIGZyZWUodW5oYW5k
bGVkS2V5TmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBGSVhNRTogU2VlIG90aGVyIGltcGxl
bWVudGF0aW9ucyBhbmQgb2J0YWluIHRoZSBrZXkgbmFtZSBieQorICAgICAgICAgICAgICAgIC8v
IHRoZSBVbmljb2RlIGNoYXJhY3RlciBjb2RlLgorICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgfQorICAgIEpTU3RyaW5nUmVsZWFzZShjaGFyYWN0ZXIpOworCisgICAgLy8gY3JlYXRlIGFu
ZCBzZW5kIHRoZSBldmVudAorICAgIEV2YXMqIGV2YXMgPSBldmFzX29iamVjdF9ldmFzX2dldCh2
aWV3KTsKKyAgICBldmFzX2V2ZW50X2ZlZWRfa2V5X2Rvd24oZXZhcywga2V5TmFtZSwga2V5TmFt
ZSwgMCwgMCwgMCwgMCk7CisgICAgZXZhc19ldmVudF9mZWVkX2tleV91cChldmFzLCBrZXlOYW1l
LCBrZXlOYW1lLCAwLCAwLCAxLCAwKTsKKworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5l
ZChjb250ZXh0KTsKK30KKworc3RhdGljIHZvaWQgem9vbUluKEVpbmFfQm9vbCBmdWxsQ29udGVu
dHNab29tKQoreworICAgIC8vIEZJWE1FOiBJbXBsZW1lbnQgdGhpcy4KK30KKworc3RhdGljIHZv
aWQgem9vbU91dChFaW5hX0Jvb2wgZnVsbENvbnRlbnRzWm9vbSkKK3sKKyAgICAvLyBGSVhNRTog
SW1wbGVtZW50IHRoaXMuCit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIHRleHRab29tSW5DYWxsYmFj
ayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVm
IHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3Vt
ZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgem9vbUluKEZBTFNFKTsKKyAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1Zh
bHVlUmVmIHRleHRab29tT3V0Q2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0
UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3Vu
dCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQor
eworICAgIHpvb21PdXQoRkFMU0UpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChj
b250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgem9vbVBhZ2VJbkNhbGxiYWNrKEpTQ29u
dGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09i
amVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10s
IEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICB6b29tSW4oVFJVRSk7CisgICAgcmV0dXJu
IEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiB6
b29tUGFnZU91dENhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5j
dGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0
IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICB6
b29tT3V0KFRSVUUpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsK
K30KKworc3RhdGljIEpTVmFsdWVSZWYgc2NhbGVQYWdlQnlDYWxsYmFjayhKU0NvbnRleHRSZWYg
Y29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNp
emVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVl
UmVmKiBleGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAzKQorICAgICAgICBy
ZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBmbG9hdCBzY2FsZUZh
Y3RvciA9IEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMF0sIGV4Y2VwdGlvbik7
CisgICAgZmxvYXQgeCA9IEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4
Y2VwdGlvbik7CisgICAgZmxvYXQgeSA9IEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVu
dHNbMl0sIGV4Y2VwdGlvbik7CisKKyAgICBFdmFzX09iamVjdCogdmlldyA9IGV3a19mcmFtZV92
aWV3X2dldChtYWluRnJhbWUpOworICAgIGlmICghdmlldykKKyAgICAgICAgcmV0dXJuIEpTVmFs
dWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgZXdrX3ZpZXdfcGFnZV9zY2FsZSh2aWV3
LCBzY2FsZUZhY3RvciwgeCwgeSk7CisKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQo
Y29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1N0YXRpY0Z1bmN0aW9uIHN0YXRpY0Z1bmN0aW9uc1td
ID0geworICAgIHsgIm1vdXNlU2Nyb2xsQnkiLCBtb3VzZVNjcm9sbEJ5Q2FsbGJhY2ssIGtKU1By
b3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUg
fSwKKyAgICB7ICJjb250aW51b3VzTW91c2VTY3JvbGxCeSIsIGNvbnRpbnVvdXNNb3VzZVNjcm9s
bEJ5Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0
dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJtb3VzZURvd24iLCBtb3VzZURvd25DYWxsYmFj
aywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9u
dERlbGV0ZSB9LAorICAgIHsgIm1vdXNlVXAiLCBtb3VzZVVwQ2FsbGJhY2ssIGtKU1Byb3BlcnR5
QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAg
ICB7ICJtb3VzZU1vdmVUbyIsIG1vdXNlTW92ZVRvQ2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmli
dXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJr
ZXlEb3duIiwga2V5RG93bkNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwg
a0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAidGV4dFpvb21JbiIsIHRl
eHRab29tSW5DYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3Bl
cnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgInRleHRab29tT3V0IiwgdGV4dFpvb21P
dXRDYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0
cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgInpvb21QYWdlSW4iLCB6b29tUGFnZUluQ2FsbGJh
Y2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURv
bnREZWxldGUgfSwKKyAgICB7ICJ6b29tUGFnZU91dCIsIHpvb21QYWdlT3V0Q2FsbGJhY2ssIGtK
U1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxl
dGUgfSwKKyAgICB7ICJzY2hlZHVsZUFzeW5jaHJvbm91c0NsaWNrIiwgc2NoZWR1bGVBc3luY2hy
b25vdXNDbGlja0NhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJv
cGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAic2NhbGVQYWdlQnkiLCBzY2FsZVBh
Z2VCeUNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlB
dHRyaWJ1dGVEb250RGVsZXRlIH0sCisKKyAgICB7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIEpT
U3RhdGljVmFsdWUgc3RhdGljVmFsdWVzW10gPSB7CisgICAgeyAwLCAwLCAwLCAwIH0KK307CisK
K3N0YXRpYyBKU0NsYXNzUmVmIGdldENsYXNzKEpTQ29udGV4dFJlZiBjb250ZXh0KQoreworICAg
IHN0YXRpYyBKU0NsYXNzUmVmIGV2ZW50U2VuZGVyQ2xhc3MgPSAwOworCisgICAgaWYgKCFldmVu
dFNlbmRlckNsYXNzKSB7CisgICAgICAgIEpTQ2xhc3NEZWZpbml0aW9uIGNsYXNzRGVmaW5pdGlv
biA9IHsKKyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAg
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OworICAgICAgICBjbGFzc0RlZmluaXRp
b24uc3RhdGljRnVuY3Rpb25zID0gc3RhdGljRnVuY3Rpb25zOworICAgICAgICBjbGFzc0RlZmlu
aXRpb24uc3RhdGljVmFsdWVzID0gc3RhdGljVmFsdWVzOworCisgICAgICAgIGV2ZW50U2VuZGVy
Q2xhc3MgPSBKU0NsYXNzQ3JlYXRlKCZjbGFzc0RlZmluaXRpb24pOworICAgIH0KKworICAgIHJl
dHVybiBldmVudFNlbmRlckNsYXNzOworfQorCitKU09iamVjdFJlZiBtYWtlRXZlbnRTZW5kZXIo
SlNDb250ZXh0UmVmIGNvbnRleHQsIGJvb2wgaXNUb3BGcmFtZSkKK3sKKyAgICBpZiAoaXNUb3BG
cmFtZSkgeworICAgICAgICBkcmFnTW9kZSA9IHRydWU7CisKKyAgICAgICAgLy8gRmx5IGZvcndh
cmQgaW4gdGltZSBvbmUgc2Vjb25kIHdoZW4gdGhlIG1haW4gZnJhbWUgbG9hZHMuIFRoaXMgd2ls
bAorICAgICAgICAvLyBlbnN1cmUgdGhhdCB3aGVuIGEgdGVzdCBiZWdpbnMgY2xpY2tpbmcgaW4g
dGhlIHNhbWUgbG9jYXRpb24gYXMKKyAgICAgICAgLy8gYSBwcmV2aW91cyB0ZXN0LCB0aG9zZSBj
bGlja3Mgd29uJ3QgYmUgaW50ZXJwcmV0ZWQgYXMgY29udGludWF0aW9ucworICAgICAgICAvLyBv
ZiB0aGUgcHJldmlvdXMgdGVzdCdzIGNsaWNrIHNlcXVlbmNlcy4KKyAgICAgICAgdGltZU9mZnNl
dCArPSAxMDAwOworCisgICAgICAgIGxhc3RNb3VzZVBvc2l0aW9uWCA9IGxhc3RNb3VzZVBvc2l0
aW9uWSA9IDA7CisgICAgICAgIGxhc3RDbGlja1Bvc2l0aW9uWCA9IGxhc3RDbGlja1Bvc2l0aW9u
WSA9IDA7CisgICAgICAgIGxhc3RDbGlja1RpbWVPZmZzZXQgPSAwOworICAgICAgICBsYXN0Q2xp
Y2tCdXR0b24gPSAwOworICAgICAgICBidXR0b25DdXJyZW50bHlEb3duID0gMDsKKyAgICAgICAg
Y2xpY2tDb3VudCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIEpTT2JqZWN0TWFrZShjb250ZXh0
LCBnZXRDbGFzcyhjb250ZXh0KSwgMCk7Cit9CkluZGV4OiBUb29scy9EdW1wUmVuZGVyVHJlZS9l
ZmwvRXZlbnRTZW5kZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwv
RXZlbnRTZW5kZXIuaAkocmV2aXNpb24gMCkKKysrIFRvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9F
dmVudFNlbmRlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmln
aHQgKEMpIDIwMDkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIENvcHlyaWdodCAoQykg
MjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
ICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4g
IE5laXRoZXIgdGhlIG5hbWUgb2YgQXBwbGUgQ29tcHV0ZXIsIEluYy4gKCJBcHBsZSIpIG5vciB0
aGUgbmFtZXMgb2YKKyAqICAgICBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9y
c2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCisgKiAgICAgZnJvbSB0aGlzIHNvZnR3YXJl
IHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQU5EIElUUyBDT05UUklCVVRPUlMgIkFTIElT
IiBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBPUiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUworICogKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECisgKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFIE9GCisgKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5kZWYgRXZlbnRTZW5kZXJfaAorI2Rl
ZmluZSBFdmVudFNlbmRlcl9oCisKK3R5cGVkZWYgY29uc3Qgc3RydWN0IE9wYXF1ZUpTQ29udGV4
dCogSlNDb250ZXh0UmVmOwordHlwZWRlZiBzdHJ1Y3QgT3BhcXVlSlNWYWx1ZSogSlNPYmplY3RS
ZWY7CisKK0pTT2JqZWN0UmVmIG1ha2VFdmVudFNlbmRlcihKU0NvbnRleHRSZWYsIGJvb2wgaXNU
b3BGcmFtZSk7CisKKyNlbmRpZiAvLyBFdmVudFNlbmRlcl9oCg==
</data>
<flag name="review"
          id="89376"
          type_id="1"
          status="-"
          setter="eric"
    />
          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>97331</attachid>
            <date>2011-06-15 11:18:22 -0700</date>
            <delta_ts>2011-06-15 11:25:21 -0700</delta_ts>
            <desc>EventSender, take 2</desc>
            <filename>eventsender-take2.diff</filename>
            <type>text/plain</type>
            <size>24652</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDg4OTYwKQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMzUgQEAKKzIwMTEtMDYtMTUgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QnVpbGQgc3lzdGVtIGNoYW5nZXMgd2lsbCBiZSBtYWRlIGFzIHNvb24gYXMgRFJUIGlzIGZ1bGx5
CisgICAgICAgIHVwc3RyZWFtZWQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02MTk2MgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsOiBBZGRl
ZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuY3BwOiBBZGRlZC4K
KyAgICAgICAgKHNldEV2YXNNb2RpZmllcnMpOgorICAgICAgICAodHJhbnNsYXRlTW91c2VCdXR0
b25OdW1iZXIpOgorICAgICAgICAoc2VuZE1vdXNlRXZlbnQpOgorICAgICAgICAoc2VuZENsaWNr
KToKKyAgICAgICAgKHNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2tDYWxsYmFjayk6CisgICAgICAg
ICh1cGRhdGVDbGlja0NvdW50KToKKyAgICAgICAgKG1vZGlmaWVyRnJvbUpTVmFsdWUpOgorICAg
ICAgICAobW9kaWZpZXJzRnJvbUpTVmFsdWUpOgorICAgICAgICAobW91c2VEb3duQ2FsbGJhY2sp
OgorICAgICAgICAobW91c2VVcENhbGxiYWNrKToKKyAgICAgICAgKG1vdXNlTW92ZVRvQ2FsbGJh
Y2spOgorICAgICAgICAoZXZhc01vdXNlRXZlbnRGcm9tSG9yaXpvbnRhbEFuZFZlcnRpY2FsT2Zm
c2V0cyk6CisgICAgICAgIChtb3VzZVNjcm9sbEJ5Q2FsbGJhY2spOgorICAgICAgICAoY29udGlu
dW91c01vdXNlU2Nyb2xsQnlDYWxsYmFjayk6CisgICAgICAgIChrZXlQYWROYW1lRnJvbUpTVmFs
dWUpOgorICAgICAgICAoa2V5TmFtZUZyb21KU1ZhbHVlKToKKyAgICAgICAgKGtleURvd25DYWxs
YmFjayk6CisgICAgICAgIChzY2FsZVBhZ2VCeUNhbGxiYWNrKToKKyAgICAgICAgKGdldENsYXNz
KToKKyAgICAgICAgKG1ha2VFdmVudFNlbmRlcik6CisgICAgICAgICogRHVtcFJlbmRlclRyZWUv
ZWZsL0V2ZW50U2VuZGVyLmg6IEFkZGVkLgorCiAyMDExLTA2LTE1ICBOaWtvbGFzIFppbW1lcm1h
bm4gIDxuemltbWVybWFubkByaW0uY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhdmlkIEh5
YXR0LgpJbmRleDogVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuY3BwCShyZXZp
c2lvbiAwKQorKysgVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmNwcAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIw
MDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5
IFphbiBEb2JlcnNlayA8emFuZG9iZXJzZWtAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAy
MDA5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdh
bGlhIFMuTC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVt
cworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgi
QXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20g
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJ
QlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKKworI2luY2x1ZGUgIkR1bXBSZW5kZXJU
cmVlLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJld2tfcHJpdmF0
ZS5oIgorI2luY2x1ZGUgPEVXZWJLaXQuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU09i
amVjdFJlZi5oPgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTUmV0YWluUHRyLmg+CisjaW5j
bHVkZSA8SmF2YVNjcmlwdENvcmUvSlNTdHJpbmdSZWYuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0
Q29yZS9PcGFxdWVKU1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi9BU0NJSUNUeXBlLmg+CisjaW5j
bHVkZSA8d3RmL1BsYXRmb3JtLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCitz
dGF0aWMgYm9vbCBnRHJhZ01vZGU7CitzdGF0aWMgaW50IGdUaW1lT2Zmc2V0ID0gMDsKKworc3Rh
dGljIGludCBnTGFzdE1vdXNlUG9zaXRpb25YOworc3RhdGljIGludCBnTGFzdE1vdXNlUG9zaXRp
b25ZOworc3RhdGljIGludCBnTGFzdENsaWNrUG9zaXRpb25YOworc3RhdGljIGludCBnTGFzdENs
aWNrUG9zaXRpb25ZOworc3RhdGljIGludCBnTGFzdENsaWNrVGltZU9mZnNldDsKK3N0YXRpYyBp
bnQgZ0xhc3RDbGlja0J1dHRvbjsKK3N0YXRpYyBpbnQgZ0J1dHRvbkN1cnJlbnRseURvd247Citz
dGF0aWMgaW50IGdDbGlja0NvdW50OworCitzdGF0aWMgY29uc3QgZmxvYXQgem9vbU11bHRpcGxp
ZXJSYXRpbyA9IDEuMmY7CisKKy8vIEtleSBldmVudCBsb2NhdGlvbiBjb2RlIGRlZmluZWQgaW4g
RE9NIExldmVsIDMuCitlbnVtIEtleUxvY2F0aW9uQ29kZSB7CisgICAgRE9NX0tFWV9MT0NBVElP
Tl9TVEFOREFSRCA9IDB4MDAsCisgICAgRE9NX0tFWV9MT0NBVElPTl9MRUZUICAgICA9IDB4MDEs
CisgICAgRE9NX0tFWV9MT0NBVElPTl9SSUdIVCAgICA9IDB4MDIsCisgICAgRE9NX0tFWV9MT0NB
VElPTl9OVU1QQUQgICA9IDB4MDMKK307CisKK2VudW0gRXZhc0tleU1vZGlmaWVyIHsKKyAgICBF
VkFTX0tFWV9NT0RJRklFUl9OT05FICAgID0gMCwKKyAgICBFVkFTX0tFWV9NT0RJRklFUl9DT05U
Uk9MID0gMSA8PCAwLAorICAgIEVWQVNfS0VZX01PRElGSUVSX1NISUZUICAgPSAxIDw8IDEsCisg
ICAgRVZBU19LRVlfTU9ESUZJRVJfQUxUICAgICA9IDEgPDwgMiwKKyAgICBFVkFTX0tFWV9NT0RJ
RklFUl9NRVRBICAgID0gMSA8PCAzCit9OworCitlbnVtIEV2YXNNb3VzZUJ1dHRvbiB7CisgICAg
RVZBU19NT1VTRV9CVVRUT05fTk9ORSAgID0gMHgwMCwKKyAgICBFVkFTX01PVVNFX0JVVFRPTl9M
RUZUICAgPSAweDAxLAorICAgIEVWQVNfTU9VU0VfQlVUVE9OX01JRERMRSA9IDB4MDIsCisgICAg
RVZBU19NT1VTRV9CVVRUT05fUklHSFQgID0gMHgwMworfTsKKworZW51bSBFdmFzTW91c2VFdmVu
dCB7CisgICAgRVZBU19NT1VTRV9FVkVOVF9OT05FICAgICAgICAgPSAwLAorICAgIEVWQVNfTU9V
U0VfRVZFTlRfRE9XTiAgICAgICAgID0gMSA8PCAwLAorICAgIEVWQVNfTU9VU0VfRVZFTlRfVVAg
ICAgICAgICAgID0gMSA8PCAxLAorICAgIEVWQVNfTU9VU0VfRVZFTlRfTU9WRSAgICAgICAgID0g
MSA8PCAyLAorICAgIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX1VQICAgID0gMSA8PCAzLAorICAg
IEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX0RPV04gID0gMSA8PCA0LAorICAgIEVWQVNfTU9VU0Vf
RVZFTlRfU0NST0xMX0xFRlQgID0gMSA8PCA1LAorICAgIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xM
X1JJR0hUID0gMSA8PCA2LAorICAgIEVWQVNfTU9VU0VfRVZFTlRfQ0xJQ0sgICAgICAgID0gRVZB
U19NT1VTRV9FVkVOVF9NT1ZFIHwgRVZBU19NT1VTRV9FVkVOVF9ET1dOIHwgRVZBU19NT1VTRV9F
VkVOVF9VUCwKK307CisKK3N0YXRpYyB2b2lkIHNldEV2YXNNb2RpZmllcnMoRXZhcyogZXZhcywg
RXZhc0tleU1vZGlmaWVyIG1vZGlmaWVycykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbW9k
aWZpZXJOYW1lc1tdID0geyAiQ29udHJvbCIsICJTaGlmdCIsICJBbHQiLCAiU3VwZXIiIH07Cisg
ICAgZm9yICh1bnNpZ25lZCBtb2RpZmllciA9IDA7IG1vZGlmaWVyIDwgNDsgKyttb2RpZmllcikg
eworICAgICAgICBpZiAobW9kaWZpZXJzICYgKDEgPDwgbW9kaWZpZXIpKQorICAgICAgICAgICAg
ZXZhc19rZXlfbW9kaWZpZXJfb24oZXZhcywgbW9kaWZpZXJOYW1lc1ttb2RpZmllcl0pOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBldmFzX2tleV9tb2RpZmllcl9vZmYoZXZhcywgbW9kaWZp
ZXJOYW1lc1ttb2RpZmllcl0pOworICAgIH0KK30KKworc3RhdGljIEV2YXNNb3VzZUJ1dHRvbiB0
cmFuc2xhdGVNb3VzZUJ1dHRvbk51bWJlcihpbnQgZXZlbnRTZW5kZXJCdXR0b25OdW1iZXIpCit7
CisgICAgc3dpdGNoIChldmVudFNlbmRlckJ1dHRvbk51bWJlcikgeworICAgIGNhc2UgMDoKKyAg
ICAgICAgcmV0dXJuIEVWQVNfTU9VU0VfQlVUVE9OX0xFRlQ7CisgICAgY2FzZSAxOgorICAgICAg
ICByZXR1cm4gRVZBU19NT1VTRV9CVVRUT05fTUlERExFOworICAgIGNhc2UgMjoKKyAgICAgICAg
cmV0dXJuIEVWQVNfTU9VU0VfQlVUVE9OX1JJR0hUOworICAgIGNhc2UgMzoKKyAgICAgICAgLy8g
ZmFzdC9ldmVudHMvbW91c2UtY2xpY2stZXZlbnRzIGV4cGVjdHMgdGhlIDR0aCBidXR0b24gdG8g
YmUgdHJlYXRlZCBhcyB0aGUgbWlkZGxlIGJ1dHRvbgorICAgICAgICByZXR1cm4gRVZBU19NT1VT
RV9CVVRUT05fTUlERExFOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFVkFTX01PVVNF
X0JVVFRPTl9MRUZUOworICAgIH0KK30KKworc3RhdGljIGJvb2wgc2VuZE1vdXNlRXZlbnQoRXZh
cyogZXZhcywgRXZhc01vdXNlRXZlbnQgZXZlbnQsIGludCBidXR0b25OdW1iZXIsIEV2YXNLZXlN
b2RpZmllciBtb2RpZmllcnMpCit7CisgICAgdW5zaWduZWQgdGltZVN0YW1wID0gMDsKKworICAg
IHNldEV2YXNNb2RpZmllcnMoZXZhcywgbW9kaWZpZXJzKTsKKyAgICBpZiAoZXZlbnQgJiBFVkFT
X01PVVNFX0VWRU5UX01PVkUpCisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV9tb3ZlKGV2
YXMsIGdMYXN0TW91c2VQb3NpdGlvblgsIGdMYXN0TW91c2VQb3NpdGlvblksIHRpbWVTdGFtcCsr
LCAwKTsKKyAgICBpZiAoZXZlbnQgJiBFVkFTX01PVVNFX0VWRU5UX0RPV04pCisgICAgICAgIGV2
YXNfZXZlbnRfZmVlZF9tb3VzZV9kb3duKGV2YXMsIGJ1dHRvbk51bWJlciwgRVZBU19CVVRUT05f
Tk9ORSwgdGltZVN0YW1wKyssIDApOworICAgIGlmIChldmVudCAmIEVWQVNfTU9VU0VfRVZFTlRf
VVApCisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV91cChldmFzLCBidXR0b25OdW1iZXIs
IEVWQVNfQlVUVE9OX05PTkUsIHRpbWVTdGFtcCsrLCAwKTsKKworICAgIGNvbnN0IGJvb2wgaG9y
aXpvbnRhbCA9ICEhKGV2ZW50ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfTEVGVCB8IGV2ZW50
ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfUklHSFQpOworICAgIGNvbnN0IGJvb2wgdmVydGlj
YWwgPSAhIShldmVudCAmIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX1VQIHwgZXZlbnQgJiBFVkFT
X01PVVNFX0VWRU5UX1NDUk9MTF9ET1dOKTsKKyAgICBpZiAodmVydGljYWwgJiYgaG9yaXpvbnRh
bCkgeworICAgICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywgMCwgKGV2ZW50
ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfVVApID8gMTAgOiAtMTAsIHRpbWVTdGFtcCwgMCk7
CisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV93aGVlbChldmFzLCAxLCAoZXZlbnQgJiBF
VkFTX01PVVNFX0VWRU5UX1NDUk9MTF9MRUZUKSA/IDEwIDogLTEwLCB0aW1lU3RhbXAsIDApOwor
ICAgIH0gZWxzZSBpZiAodmVydGljYWwpCisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV93
aGVlbChldmFzLCAwLCAoZXZlbnQgJiBFVkFTX01PVVNFX0VWRU5UX1NDUk9MTF9VUCkgPyAxMCA6
IC0xMCwgdGltZVN0YW1wLCAwKTsKKyAgICBlbHNlIGlmIChob3Jpem9udGFsKQorICAgICAgICBl
dmFzX2V2ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywgMSwgKGV2ZW50ICYgRVZBU19NT1VTRV9F
VkVOVF9TQ1JPTExfTEVGVCkgPyAxMCA6IC0xMCwgdGltZVN0YW1wLCAwKTsKKworICAgIHNldEV2
YXNNb2RpZmllcnMoZXZhcywgRVZBU19LRVlfTU9ESUZJRVJfTk9ORSk7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBzZW5kQ2xpY2sodm9pZCopCit7CisgICAgcmV0
dXJuICEhc2VuZE1vdXNlRXZlbnQoZXZhc19vYmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgRVZB
U19NT1VTRV9FVkVOVF9DTElDSywgRVZBU19NT1VTRV9CVVRUT05fTEVGVCwgRVZBU19LRVlfTU9E
SUZJRVJfTk9ORSk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIHNjaGVkdWxlQXN5bmNocm9ub3Vz
Q2xpY2tDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24s
IEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1Zh
bHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgZWNvcmVf
aWRsZXJfYWRkKHNlbmRDbGljaywgMCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVk
KGNvbnRleHQpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVDbGlja0NvdW50KGludCBidXR0b24p
Cit7CisgICAgaWYgKGdMYXN0Q2xpY2tQb3NpdGlvblggIT0gZ0xhc3RNb3VzZVBvc2l0aW9uWAor
ICAgICAgICB8fCBnTGFzdENsaWNrUG9zaXRpb25ZICE9IGdMYXN0TW91c2VQb3NpdGlvblkKKyAg
ICAgICAgfHwgZ0xhc3RDbGlja0J1dHRvbiAhPSBidXR0b24KKyAgICAgICAgfHwgZ1RpbWVPZmZz
ZXQgLSBnTGFzdENsaWNrVGltZU9mZnNldCA+PSAxKQorICAgICAgICBnQ2xpY2tDb3VudCA9IDE7
CisgICAgZWxzZQorICAgICAgICBnQ2xpY2tDb3VudCsrOworfQorCitzdGF0aWMgRXZhc0tleU1v
ZGlmaWVyIG1vZGlmaWVyRnJvbUpTVmFsdWUoSlNDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IEpT
VmFsdWVSZWYgdmFsdWUpCit7CisgICAgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IGpzS2V5VmFs
dWUoQWRvcHQsIEpTVmFsdWVUb1N0cmluZ0NvcHkoY29udGV4dCwgdmFsdWUsIDApKTsKKworICAg
IGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGpzS2V5VmFsdWUuZ2V0KCksICJjdHJs
S2V5IikgfHwgSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhqc0tleVZhbHVlLmdldCgpLCAi
YWRkU2VsZWN0aW9uS2V5IikpCisgICAgICAgIHJldHVybiBFVkFTX0tFWV9NT0RJRklFUl9DT05U
Uk9MOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGpzS2V5VmFsdWUuZ2V0
KCksICJzaGlmdEtleSIpIHx8IEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoanNLZXlWYWx1
ZS5nZXQoKSwgInJhbmdlU2VsZWN0aW9uS2V5IikpCisgICAgICAgIHJldHVybiBFVkFTX0tFWV9N
T0RJRklFUl9TSElGVDsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhqc0tl
eVZhbHVlLmdldCgpLCAiYWx0S2V5IikpCisgICAgICAgIHJldHVybiBFVkFTX0tFWV9NT0RJRklF
Ul9BTFQ7CisgICAgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoanNLZXlWYWx1ZS5n
ZXQoKSwgIm1ldGFLZXkiKSkKKyAgICAgICAgcmV0dXJuIEVWQVNfS0VZX01PRElGSUVSX01FVEE7
CisKKyAgICByZXR1cm4gRVZBU19LRVlfTU9ESUZJRVJfTk9ORTsKK30KKworc3RhdGljIEV2YXNL
ZXlNb2RpZmllciBtb2RpZmllcnNGcm9tSlNWYWx1ZShKU0NvbnRleHRSZWYgY29udGV4dCwgY29u
c3QgSlNWYWx1ZVJlZiBtb2RpZmllcnMpCit7CisgICAgLy8gVGhlIHZhbHVlIG1heSBlaXRoZXIg
YmUgYSBzdHJpbmcgd2l0aCBhIHNpbmdsZSBtb2RpZmllciBvciBhbiBhcnJheSBvZiBtb2RpZmll
cnMuCisgICAgaWYgKEpTVmFsdWVJc1N0cmluZyhjb250ZXh0LCBtb2RpZmllcnMpKQorICAgICAg
ICByZXR1cm4gbW9kaWZpZXJGcm9tSlNWYWx1ZShjb250ZXh0LCBtb2RpZmllcnMpOworCisgICAg
SlNPYmplY3RSZWYgbW9kaWZpZXJzQXJyYXkgPSBKU1ZhbHVlVG9PYmplY3QoY29udGV4dCwgbW9k
aWZpZXJzLCAwKTsKKyAgICBpZiAoIW1vZGlmaWVyc0FycmF5KQorICAgICAgICByZXR1cm4gRVZB
U19LRVlfTU9ESUZJRVJfTk9ORTsKKworICAgIHVuc2lnbmVkIG1vZGlmaWVyID0gMDsKKyAgICBp
bnQgbW9kaWZpZXJzQ291bnQgPSBKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgSlNPYmplY3RHZXRQ
cm9wZXJ0eShjb250ZXh0LCBtb2RpZmllcnNBcnJheSwgSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENT
dHJpbmcoImxlbmd0aCIpLCAwKSwgMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RpZmll
cnNDb3VudDsgKytpKQorICAgICAgICBtb2RpZmllciB8PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4o
bW9kaWZpZXJGcm9tSlNWYWx1ZShjb250ZXh0LCBKU09iamVjdEdldFByb3BlcnR5QXRJbmRleChj
b250ZXh0LCBtb2RpZmllcnNBcnJheSwgaSwgMCkpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
RXZhc0tleU1vZGlmaWVyPihtb2RpZmllcik7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNl
RG93bkNhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwg
SlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFs
dWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpbnQgYnV0
dG9uID0gMDsKKyAgICBpZiAoYXJndW1lbnRDb3VudCA9PSAxKSB7CisgICAgICAgIGJ1dHRvbiA9
IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwg
ZXhjZXB0aW9uKSk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAg
ICAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworICAgIH0KKwor
ICAgIGJ1dHRvbiA9IHRyYW5zbGF0ZU1vdXNlQnV0dG9uTnVtYmVyKGJ1dHRvbik7CisgICAgLy8g
SWYgdGhlIHNhbWUgbW91c2UgYnV0dG9uIGlzIGFscmVhZHkgaW4gdGhlIGRvd24gcG9zaXRpb24g
ZG9uJ3Qgc2VuZCBhbm90aGVyIGV2ZW50IGFzIGl0IG1heSBjb25mdXNlIFh2ZmIuCisgICAgaWYg
KGdCdXR0b25DdXJyZW50bHlEb3duID09IGJ1dHRvbikKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVN
YWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgdXBkYXRlQ2xpY2tDb3VudChidXR0b24pOwor
CisgICAgRXZhc0tleU1vZGlmaWVyIG1vZGlmaWVycyA9IGFyZ3VtZW50Q291bnQgPj0gMiA/IG1v
ZGlmaWVyc0Zyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3VtZW50c1sxXSkgOiBFVkFTX0tFWV9NT0RJ
RklFUl9OT05FOworICAgIGlmICghc2VuZE1vdXNlRXZlbnQoZXZhc19vYmplY3RfZXZhc19nZXQo
bWFpbkZyYW1lKSwgRVZBU19NT1VTRV9FVkVOVF9ET1dOLCBidXR0b24sIG1vZGlmaWVycykpCisg
ICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGdCdXR0
b25DdXJyZW50bHlEb3duID0gYnV0dG9uOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5l
ZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgbW91c2VVcENhbGxiYWNrKEpTQ29u
dGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09i
amVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10s
IEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpbnQgYnV0dG9uID0gMDsKKyAgICBpZiAo
YXJndW1lbnRDb3VudCA9PSAxKSB7CisgICAgICAgIGJ1dHRvbiA9IHN0YXRpY19jYXN0PGludD4o
SlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7CisgICAg
ICAgIGlmIChleGNlcHRpb24gJiYgKmV4Y2VwdGlvbikKKyAgICAgICAgICAgIHJldHVybiBKU1Zh
bHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICB9CisKKyAgICBnTGFzdENsaWNrUG9zaXRp
b25YID0gZ0xhc3RNb3VzZVBvc2l0aW9uWDsKKyAgICBnTGFzdENsaWNrUG9zaXRpb25ZID0gZ0xh
c3RNb3VzZVBvc2l0aW9uWTsKKyAgICBnTGFzdENsaWNrQnV0dG9uID0gZ0J1dHRvbkN1cnJlbnRs
eURvd247CisgICAgZ0xhc3RDbGlja1RpbWVPZmZzZXQgPSBnVGltZU9mZnNldDsKKyAgICBnQnV0
dG9uQ3VycmVudGx5RG93biA9IDA7CisKKyAgICBFdmFzS2V5TW9kaWZpZXIgbW9kaWZpZXJzID0g
YXJndW1lbnRDb3VudCA+PSAyID8gbW9kaWZpZXJzRnJvbUpTVmFsdWUoY29udGV4dCwgYXJndW1l
bnRzWzFdKSA6IEVWQVNfS0VZX01PRElGSUVSX05PTkU7CisgICAgc2VuZE1vdXNlRXZlbnQoZXZh
c19vYmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgRVZBU19NT1VTRV9FVkVOVF9VUCwgdHJhbnNs
YXRlTW91c2VCdXR0b25OdW1iZXIoYnV0dG9uKSwgbW9kaWZpZXJzKTsKKyAgICByZXR1cm4gSlNW
YWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNl
TW92ZVRvQ2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9u
LCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNW
YWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIGlmIChh
cmd1bWVudENvdW50IDwgMikKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNv
bnRleHQpOworCisgICAgZ0xhc3RNb3VzZVBvc2l0aW9uWCA9IHN0YXRpY19jYXN0PGludD4oSlNW
YWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7CisgICAgaWYg
KGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRl
ZmluZWQoY29udGV4dCk7CisgICAgZ0xhc3RNb3VzZVBvc2l0aW9uWSA9IHN0YXRpY19jYXN0PGlu
dD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1sxXSwgZXhjZXB0aW9uKSk7Cisg
ICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1h
a2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBzZW5kTW91c2VFdmVudChldmFzX29iamVjdF9l
dmFzX2dldChtYWluRnJhbWUpLCBFVkFTX01PVVNFX0VWRU5UX01PVkUsIEVWQVNfTU9VU0VfQlVU
VE9OX05PTkUsIEVWQVNfS0VZX01PRElGSUVSX05PTkUpOworICAgIHJldHVybiBKU1ZhbHVlTWFr
ZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEV2YXNNb3VzZUV2ZW50IGV2YXNNb3Vz
ZUV2ZW50RnJvbUhvcml6b250YWxBbmRWZXJ0aWNhbE9mZnNldHMoaW50IGhvcml6b250YWxPZmZz
ZXQsIGludCB2ZXJ0aWNhbE9mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBtb3VzZUV2ZW50ID0gMDsK
KworICAgIGlmICh2ZXJ0aWNhbE9mZnNldCA+IDApCisgICAgICAgIG1vdXNlRXZlbnQgfD0gRVZB
U19NT1VTRV9FVkVOVF9TQ1JPTExfVVA7CisgICAgZWxzZSBpZiAodmVydGljYWxPZmZzZXQgPCAw
KQorICAgICAgICBtb3VzZUV2ZW50IHw9IEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX0RPV047CisK
KyAgICBpZiAoaG9yaXpvbnRhbE9mZnNldCA+IDApCisgICAgICAgIG1vdXNlRXZlbnQgfD0gRVZB
U19NT1VTRV9FVkVOVF9TQ1JPTExfUklHSFQ7CisgICAgZWxzZSBpZiAoaG9yaXpvbnRhbE9mZnNl
dCA8IDApCisgICAgICAgIG1vdXNlRXZlbnQgfD0gRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfTEVG
VDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFdmFzTW91c2VFdmVudD4obW91c2VFdmVudCk7
Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNlU2Nyb2xsQnlDYWxsYmFjayhKU0NvbnRleHRS
ZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3Qs
IHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1Zh
bHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAyKQorICAgICAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBpbnQgaG9yaXpv
bnRhbCA9IChpbnQpSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0
aW9uKTsKKyAgICBpZiAoZXhjZXB0aW9uICYmICpleGNlcHRpb24pCisgICAgICAgIHJldHVybiBK
U1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICBpbnQgdmVydGljYWwgPSAoaW50KUpT
VmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4Y2VwdGlvbik7CisgICAgaWYg
KGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRl
ZmluZWQoY29udGV4dCk7CisKKyAgICBzZW5kTW91c2VFdmVudChldmFzX29iamVjdF9ldmFzX2dl
dChtYWluRnJhbWUpLCBldmFzTW91c2VFdmVudEZyb21Ib3Jpem9udGFsQW5kVmVydGljYWxPZmZz
ZXRzKGhvcml6b250YWwsIHZlcnRpY2FsKSwgRVZBU19NT1VTRV9CVVRUT05fTk9ORSwgRVZBU19L
RVlfTU9ESUZJRVJfTk9ORSk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRl
eHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBjb250aW51b3VzTW91c2VTY3JvbGxCeUNhbGxi
YWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RS
ZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJn
dW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICByZXR1cm4gSlNWYWx1ZU1h
a2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBrZXlQYWROYW1l
RnJvbUpTVmFsdWUoSlNTdHJpbmdSZWYgY2hhcmFjdGVyKQoreworICAgIGlmIChKU1N0cmluZ0lz
RXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgImxlZnRBcnJvdyIpKQorICAgICAgICByZXR1
cm4gIktQX0xlZnQiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJh
Y3RlciwgInJpZ2h0QXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJLUF9SaWdodCI7CisgICAgaWYg
KEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAidXBBcnJvdyIpKQorICAg
ICAgICByZXR1cm4gIktQX1VwIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmlu
ZyhjaGFyYWN0ZXIsICJkb3duQXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJLUF9Eb3duIjsKKyAg
ICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJwYWdlVXAiKSkK
KyAgICAgICAgcmV0dXJuICJLUF9QYWdlX1VwIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9V
VEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJwYWdlRG93biIpKQorICAgICAgICByZXR1cm4gIktQX1Bh
Z2VfRG93biI7CisgICAgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVy
LCAiaG9tZSIpKQorICAgICAgICByZXR1cm4gIktQX0hvbWUiOworICAgIGlmIChKU1N0cmluZ0lz
RXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgImVuZCIpKQorICAgICAgICByZXR1cm4gIktQ
X0VuZCI7CisgICAgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAi
aW5zZXJ0IikpCisgICAgICAgIHJldHVybiAiS1BfSW5zZXJ0IjsKKyAgICBpZiAoSlNTdHJpbmdJ
c0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJkZWxldGUiKSkKKyAgICAgICAgcmV0dXJu
ICJLUF9EZWxldGUiOworCisgICAgLy8gSWYgd2UgZ2V0IHNvbWUgb3RoZXIga2V5IHNwZWNpZmll
ZCB3aXRoIHRoZSBudW1wYWQgbG9jYXRpb24sCisgICAgLy8gY3Jhc2ggaGVyZSwgc28gd2UgYWRk
IGl0IHNvb25lciByYXRoZXIgdGhhbiBsYXRlci4KKyAgICBmcHJpbnRmKHN0ZGVyciwgIm51bWVy
aWMgcGFkIGtleSBub3QgaGFuZGxlZDogJXNcbiIsIGNoYXJhY3Rlci0+dXN0cmluZygpLnV0Zjgo
KS5kYXRhKCkpOworICAgIGFib3J0KCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBrZXlOYW1l
RnJvbUpTVmFsdWUoSlNTdHJpbmdSZWYgY2hhcmFjdGVyKQoreworICAgIGlmIChKU1N0cmluZ0lz
RXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgImxlZnRBcnJvdyIpKQorICAgICAgICByZXR1
cm4gIkxlZnQiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3Rl
ciwgInJpZ2h0QXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJSaWdodCI7CisgICAgaWYgKEpTU3Ry
aW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAidXBBcnJvdyIpKQorICAgICAgICBy
ZXR1cm4gIlVwIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0
ZXIsICJkb3duQXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJEb3duIjsKKyAgICBpZiAoSlNTdHJp
bmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJwYWdlVXAiKSkKKyAgICAgICAgcmV0
dXJuICJQYWdlX1VwIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFy
YWN0ZXIsICJwYWdlRG93biIpKQorICAgICAgICByZXR1cm4gIlBhZ2VfRG93biI7CisgICAgaWYg
KEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAiaG9tZSIpKQorICAgICAg
ICByZXR1cm4gIkhvbWUiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNo
YXJhY3RlciwgImVuZCIpKQorICAgICAgICByZXR1cm4gIkVuZCI7CisgICAgaWYgKEpTU3RyaW5n
SXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAiaW5zZXJ0IikpCisgICAgICAgIHJldHVy
biAiSW5zZXJ0IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0
ZXIsICJkZWxldGUiKSkKKyAgICAgICAgcmV0dXJuICJEZWxldGUiOworICAgIGlmIChKU1N0cmlu
Z0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgInByaW50U2NyZWVuIikpCisgICAgICAg
IHJldHVybiAiUHJpbnQiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNo
YXJhY3RlciwgIm1lbnUiKSkKKyAgICAgICAgcmV0dXJuICJNZW51IjsKKyAgICBpZiAoSlNTdHJp
bmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGMSIpKQorICAgICAgICByZXR1cm4g
IkYxIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJG
MiIpKQorICAgICAgICByZXR1cm4gIkYyIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4
Q1N0cmluZyhjaGFyYWN0ZXIsICJGMyIpKQorICAgICAgICByZXR1cm4gIkYzIjsKKyAgICBpZiAo
SlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGNCIpKQorICAgICAgICBy
ZXR1cm4gIkY0IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0
ZXIsICJGNSIpKQorICAgICAgICByZXR1cm4gIkY1IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFs
VG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGNiIpKQorICAgICAgICByZXR1cm4gIkY2IjsKKyAg
ICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGNyIpKQorICAg
ICAgICByZXR1cm4gIkY3IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhj
aGFyYWN0ZXIsICJGOCIpKQorICAgICAgICByZXR1cm4gIkY4IjsKKyAgICBpZiAoSlNTdHJpbmdJ
c0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGOSIpKQorICAgICAgICByZXR1cm4gIkY5
IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGMTAi
KSkKKyAgICAgICAgcmV0dXJuICJGMTAiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhD
U3RyaW5nKGNoYXJhY3RlciwgIkYxMSIpKQorICAgICAgICByZXR1cm4gIkYxMSI7CisgICAgaWYg
KEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAiRjEyIikpCisgICAgICAg
IHJldHVybiAiRjEyIjsKKworICAgIGludCBjaGFyQ29kZSA9IEpTU3RyaW5nR2V0Q2hhcmFjdGVy
c1B0cihjaGFyYWN0ZXIpWzBdOworICAgIGlmIChjaGFyQ29kZSA9PSAnXG4nIHx8IGNoYXJDb2Rl
ID09ICdccicpCisgICAgICAgIHJldHVybiAiUmV0dXJuIjsKKyAgICBpZiAoY2hhckNvZGUgPT0g
J1x0JykKKyAgICAgICAgcmV0dXJuICJUYWIiOworICAgIGlmIChjaGFyQ29kZSA9PSAnXHg4JykK
KyAgICAgICAgcmV0dXJuICJCYWNrU3BhY2UiOworCisgICAgLy8gRklYTUU6IFNlZSBvdGhlciBp
bXBsZW1lbnRhdGlvbnMgYW5kIG9idGFpbiB0aGUga2V5IG5hbWUgYnkKKyAgICAvLyB0aGUgVW5p
Y29kZSBjaGFyYWN0ZXIgY29kZS4KKyAgICBmcHJpbnRmKHN0ZGVyciwgImtleSBub3QgaGFuZGxl
ZDogJXNcbiIsIGNoYXJhY3Rlci0+dXN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFib3J0
KCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIGtleURvd25DYWxsYmFjayhKU0NvbnRleHRSZWYg
Y29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNp
emVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVl
UmVmKiBleGNlcHRpb24pCit7CisgICAgRXZhc19PYmplY3QqIHZpZXcgPSBld2tfZnJhbWVfdmll
d19nZXQobWFpbkZyYW1lKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBKU1ZhbHVl
TWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGlmIChhcmd1bWVudENvdW50IDwgMSkKKyAg
ICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgLy8gaGFu
ZGxlIGxvY2F0aW9uIGFyZ3VtZW50LgorICAgIGludCBsb2NhdGlvbiA9IERPTV9LRVlfTE9DQVRJ
T05fU1RBTkRBUkQ7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPiAyKQorICAgICAgICBsb2NhdGlv
biA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1sy
XSwgZXhjZXB0aW9uKSk7CisKKyAgICBKU1JldGFpblB0cjxKU1N0cmluZ1JlZj4gY2hhcmFjdGVy
KEFkb3B0LCBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0
aW9uKSk7CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4g
SlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICAvLyBzZW5kIHRoZSBldmVudAor
ICAgIEV2YXMqIGV2YXMgPSBldmFzX29iamVjdF9ldmFzX2dldCh2aWV3KTsKKworICAgIGlmIChh
cmd1bWVudENvdW50ID49IDIpCisgICAgICAgIHNldEV2YXNNb2RpZmllcnMoZXZhcywgbW9kaWZp
ZXJzRnJvbUpTVmFsdWUoY29udGV4dCwgYXJndW1lbnRzWzFdKSk7CisKKyAgICBjb25zdCBjaGFy
KiBrZXlOYW1lID0gKGxvY2F0aW9uID09IERPTV9LRVlfTE9DQVRJT05fTlVNUEFEKSA/IGtleVBh
ZE5hbWVGcm9tSlNWYWx1ZShjaGFyYWN0ZXIuZ2V0KCkpIDoga2V5TmFtZUZyb21KU1ZhbHVlKGNo
YXJhY3Rlci5nZXQoKSk7CisgICAgZXZhc19ldmVudF9mZWVkX2tleV9kb3duKGV2YXMsIGtleU5h
bWUsIGtleU5hbWUsIDAsIDAsIDAsIDApOworICAgIGV2YXNfZXZlbnRfZmVlZF9rZXlfdXAoZXZh
cywga2V5TmFtZSwga2V5TmFtZSwgMCwgMCwgMSwgMCk7CisKKyAgICBzZXRFdmFzTW9kaWZpZXJz
KGV2YXMsIEVWQVNfS0VZX01PRElGSUVSX05PTkUpOworCisgICAgcmV0dXJuIEpTVmFsdWVNYWtl
VW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBzY2FsZVBhZ2VCeUNh
bGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmpl
Y3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYg
YXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpZiAoYXJndW1lbnRD
b3VudCA8IDMpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsK
KworICAgIEV2YXNfT2JqZWN0KiB2aWV3ID0gZXdrX2ZyYW1lX3ZpZXdfZ2V0KG1haW5GcmFtZSk7
CisgICAgaWYgKCF2aWV3KQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29u
dGV4dCk7CisKKyAgICBmbG9hdCBzY2FsZUZhY3RvciA9IEpTVmFsdWVUb051bWJlcihjb250ZXh0
LCBhcmd1bWVudHNbMF0sIGV4Y2VwdGlvbik7CisgICAgZmxvYXQgeCA9IEpTVmFsdWVUb051bWJl
cihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4Y2VwdGlvbik7CisgICAgZmxvYXQgeSA9IEpTVmFs
dWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMl0sIGV4Y2VwdGlvbik7CisgICAgZXdrX3Zp
ZXdfcGFnZV9zY2FsZSh2aWV3LCBzY2FsZUZhY3RvciwgeCwgeSk7CisKKyAgICByZXR1cm4gSlNW
YWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1N0YXRpY0Z1bmN0aW9u
IHN0YXRpY0Z1bmN0aW9uc1tdID0geworICAgIHsgIm1vdXNlU2Nyb2xsQnkiLCBtb3VzZVNjcm9s
bEJ5Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0
dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJjb250aW51b3VzTW91c2VTY3JvbGxCeSIsIGNv
bnRpbnVvdXNNb3VzZVNjcm9sbEJ5Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9u
bHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJtb3VzZURvd24i
LCBtb3VzZURvd25DYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1By
b3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgIm1vdXNlVXAiLCBtb3VzZVVwQ2Fs
bGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0
ZURvbnREZWxldGUgfSwKKyAgICB7ICJtb3VzZU1vdmVUbyIsIG1vdXNlTW92ZVRvQ2FsbGJhY2ss
IGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnRE
ZWxldGUgfSwKKyAgICB7ICJrZXlEb3duIiwga2V5RG93bkNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0
dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAg
eyAic2NoZWR1bGVBc3luY2hyb25vdXNDbGljayIsIHNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2tD
YWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmli
dXRlRG9udERlbGV0ZSB9LAorICAgIHsgInNjYWxlUGFnZUJ5Iiwgc2NhbGVQYWdlQnlDYWxsYmFj
aywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9u
dERlbGV0ZSB9LAorICAgIHsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgSlNTdGF0aWNWYWx1ZSBz
dGF0aWNWYWx1ZXNbXSA9IHsKKyAgICB7IDAsIDAsIDAsIDAgfQorfTsKKworc3RhdGljIEpTQ2xh
c3NSZWYgZ2V0Q2xhc3MoSlNDb250ZXh0UmVmIGNvbnRleHQpCit7CisgICAgc3RhdGljIEpTQ2xh
c3NSZWYgZXZlbnRTZW5kZXJDbGFzcyA9IDA7CisKKyAgICBpZiAoIWV2ZW50U2VuZGVyQ2xhc3Mp
IHsKKyAgICAgICAgSlNDbGFzc0RlZmluaXRpb24gY2xhc3NEZWZpbml0aW9uID0geworICAgICAg
ICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMH07CisgICAgICAgIGNsYXNzRGVmaW5pdGlvbi5zdGF0aWNGdW5j
dGlvbnMgPSBzdGF0aWNGdW5jdGlvbnM7CisgICAgICAgIGNsYXNzRGVmaW5pdGlvbi5zdGF0aWNW
YWx1ZXMgPSBzdGF0aWNWYWx1ZXM7CisKKyAgICAgICAgZXZlbnRTZW5kZXJDbGFzcyA9IEpTQ2xh
c3NDcmVhdGUoJmNsYXNzRGVmaW5pdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIGV2ZW50U2Vu
ZGVyQ2xhc3M7Cit9CisKK0pTT2JqZWN0UmVmIG1ha2VFdmVudFNlbmRlcihKU0NvbnRleHRSZWYg
Y29udGV4dCwgYm9vbCBpc1RvcEZyYW1lKQoreworICAgIGlmIChpc1RvcEZyYW1lKSB7CisgICAg
ICAgIGdEcmFnTW9kZSA9IHRydWU7CisKKyAgICAgICAgLy8gRmx5IGZvcndhcmQgaW4gdGltZSBv
bmUgc2Vjb25kIHdoZW4gdGhlIG1haW4gZnJhbWUgbG9hZHMuIFRoaXMgd2lsbAorICAgICAgICAv
LyBlbnN1cmUgdGhhdCB3aGVuIGEgdGVzdCBiZWdpbnMgY2xpY2tpbmcgaW4gdGhlIHNhbWUgbG9j
YXRpb24gYXMKKyAgICAgICAgLy8gYSBwcmV2aW91cyB0ZXN0LCB0aG9zZSBjbGlja3Mgd29uJ3Qg
YmUgaW50ZXJwcmV0ZWQgYXMgY29udGludWF0aW9ucworICAgICAgICAvLyBvZiB0aGUgcHJldmlv
dXMgdGVzdCdzIGNsaWNrIHNlcXVlbmNlcy4KKyAgICAgICAgZ1RpbWVPZmZzZXQgKz0gMTAwMDsK
KworICAgICAgICBnTGFzdE1vdXNlUG9zaXRpb25YID0gZ0xhc3RNb3VzZVBvc2l0aW9uWSA9IDA7
CisgICAgICAgIGdMYXN0Q2xpY2tQb3NpdGlvblggPSBnTGFzdENsaWNrUG9zaXRpb25ZID0gMDsK
KyAgICAgICAgZ0xhc3RDbGlja1RpbWVPZmZzZXQgPSAwOworICAgICAgICBnTGFzdENsaWNrQnV0
dG9uID0gMDsKKyAgICAgICAgZ0J1dHRvbkN1cnJlbnRseURvd24gPSAwOworICAgICAgICBnQ2xp
Y2tDb3VudCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIEpTT2JqZWN0TWFrZShjb250ZXh0LCBn
ZXRDbGFzcyhjb250ZXh0KSwgMCk7Cit9CkluZGV4OiBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwv
RXZlbnRTZW5kZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRXZl
bnRTZW5kZXIuaAkocmV2aXNpb24gMCkKKysrIFRvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9FdmVu
dFNlbmRlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIENvcHlyaWdodCAoQykgMjAx
MSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1
bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaWZuZGVmIEV2ZW50U2VuZGVyX2gKKyNkZWZpbmUgRXZlbnRTZW5kZXJf
aAorCit0eXBlZGVmIGNvbnN0IHN0cnVjdCBPcGFxdWVKU0NvbnRleHQqIEpTQ29udGV4dFJlZjsK
K3R5cGVkZWYgc3RydWN0IE9wYXF1ZUpTVmFsdWUqIEpTT2JqZWN0UmVmOworCitKU09iamVjdFJl
ZiBtYWtlRXZlbnRTZW5kZXIoSlNDb250ZXh0UmVmIGNvbnRleHQsIGJvb2wgaXNUb3BGcmFtZSk7
CisKKyNlbmRpZiAvLyBFdmVudFNlbmRlcl9oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>97334</attachid>
            <date>2011-06-15 11:25:21 -0700</date>
            <delta_ts>2011-06-21 10:49:18 -0700</delta_ts>
            <desc>Take 2, now pleasing the style bot</desc>
            <filename>eventsender-take2.diff</filename>
            <type>text/plain</type>
            <size>24633</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDg4OTYwKQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMg
KzEsMzUgQEAKKzIwMTEtMDYtMTUgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9u
Lm1vYmk+CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAg
QnVpbGQgc3lzdGVtIGNoYW5nZXMgd2lsbCBiZSBtYWRlIGFzIHNvb24gYXMgRFJUIGlzIGZ1bGx5
CisgICAgICAgIHVwc3RyZWFtZWQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3No
b3dfYnVnLmNnaT9pZD02MTk2MgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsOiBBZGRl
ZC4KKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuY3BwOiBBZGRlZC4K
KyAgICAgICAgKHNldEV2YXNNb2RpZmllcnMpOgorICAgICAgICAodHJhbnNsYXRlTW91c2VCdXR0
b25OdW1iZXIpOgorICAgICAgICAoc2VuZE1vdXNlRXZlbnQpOgorICAgICAgICAoc2VuZENsaWNr
KToKKyAgICAgICAgKHNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2tDYWxsYmFjayk6CisgICAgICAg
ICh1cGRhdGVDbGlja0NvdW50KToKKyAgICAgICAgKG1vZGlmaWVyRnJvbUpTVmFsdWUpOgorICAg
ICAgICAobW9kaWZpZXJzRnJvbUpTVmFsdWUpOgorICAgICAgICAobW91c2VEb3duQ2FsbGJhY2sp
OgorICAgICAgICAobW91c2VVcENhbGxiYWNrKToKKyAgICAgICAgKG1vdXNlTW92ZVRvQ2FsbGJh
Y2spOgorICAgICAgICAoZXZhc01vdXNlRXZlbnRGcm9tSG9yaXpvbnRhbEFuZFZlcnRpY2FsT2Zm
c2V0cyk6CisgICAgICAgIChtb3VzZVNjcm9sbEJ5Q2FsbGJhY2spOgorICAgICAgICAoY29udGlu
dW91c01vdXNlU2Nyb2xsQnlDYWxsYmFjayk6CisgICAgICAgIChrZXlQYWROYW1lRnJvbUpTVmFs
dWUpOgorICAgICAgICAoa2V5TmFtZUZyb21KU1ZhbHVlKToKKyAgICAgICAgKGtleURvd25DYWxs
YmFjayk6CisgICAgICAgIChzY2FsZVBhZ2VCeUNhbGxiYWNrKToKKyAgICAgICAgKGdldENsYXNz
KToKKyAgICAgICAgKG1ha2VFdmVudFNlbmRlcik6CisgICAgICAgICogRHVtcFJlbmRlclRyZWUv
ZWZsL0V2ZW50U2VuZGVyLmg6IEFkZGVkLgorCiAyMDExLTA2LTE1ICBOaWtvbGFzIFppbW1lcm1h
bm4gIDxuemltbWVybWFubkByaW0uY29tPgogCiAgICAgICAgIFJldmlld2VkIGJ5IERhdmlkIEh5
YXR0LgpJbmRleDogVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmNwcAo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuY3BwCShyZXZp
c2lvbiAwKQorKysgVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmNwcAkocmV2
aXNpb24gMCkKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcsIDIw
MDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5
IFphbiBEb2JlcnNlayA8emFuZG9iZXJzZWtAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAy
MDA5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgSWdh
bGlhIFMuTC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVt
cworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgi
QXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUg
dXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20g
dGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJ
QlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
IEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29u
ZmlnLmgiCisjaW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKKworI2luY2x1ZGUgIkR1bXBSZW5kZXJU
cmVlLmgiCisjaW5jbHVkZSAiTm90SW1wbGVtZW50ZWQuaCIKKyNpbmNsdWRlICJld2tfcHJpdmF0
ZS5oIgorI2luY2x1ZGUgPEVXZWJLaXQuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU09i
amVjdFJlZi5oPgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3JlL0pTUmV0YWluUHRyLmg+CisjaW5j
bHVkZSA8SmF2YVNjcmlwdENvcmUvSlNTdHJpbmdSZWYuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0
Q29yZS9PcGFxdWVKU1N0cmluZy5oPgorI2luY2x1ZGUgPHd0Zi9BU0NJSUNUeXBlLmg+CisjaW5j
bHVkZSA8d3RmL1BsYXRmb3JtLmg+CisjaW5jbHVkZSA8d3RmL3RleHQvQ1N0cmluZy5oPgorCitz
dGF0aWMgYm9vbCBnRHJhZ01vZGU7CitzdGF0aWMgaW50IGdUaW1lT2Zmc2V0ID0gMDsKKworc3Rh
dGljIGludCBnTGFzdE1vdXNlUG9zaXRpb25YOworc3RhdGljIGludCBnTGFzdE1vdXNlUG9zaXRp
b25ZOworc3RhdGljIGludCBnTGFzdENsaWNrUG9zaXRpb25YOworc3RhdGljIGludCBnTGFzdENs
aWNrUG9zaXRpb25ZOworc3RhdGljIGludCBnTGFzdENsaWNrVGltZU9mZnNldDsKK3N0YXRpYyBp
bnQgZ0xhc3RDbGlja0J1dHRvbjsKK3N0YXRpYyBpbnQgZ0J1dHRvbkN1cnJlbnRseURvd247Citz
dGF0aWMgaW50IGdDbGlja0NvdW50OworCitzdGF0aWMgY29uc3QgZmxvYXQgem9vbU11bHRpcGxp
ZXJSYXRpbyA9IDEuMmY7CisKKy8vIEtleSBldmVudCBsb2NhdGlvbiBjb2RlIGRlZmluZWQgaW4g
RE9NIExldmVsIDMuCitlbnVtIEtleUxvY2F0aW9uQ29kZSB7CisgICAgRE9NX0tFWV9MT0NBVElP
Tl9TVEFOREFSRCA9IDB4MDAsCisgICAgRE9NX0tFWV9MT0NBVElPTl9MRUZUICAgICA9IDB4MDEs
CisgICAgRE9NX0tFWV9MT0NBVElPTl9SSUdIVCAgICA9IDB4MDIsCisgICAgRE9NX0tFWV9MT0NB
VElPTl9OVU1QQUQgICA9IDB4MDMKK307CisKK2VudW0gRXZhc0tleU1vZGlmaWVyIHsKKyAgICBF
VkFTX0tFWV9NT0RJRklFUl9OT05FICAgID0gMCwKKyAgICBFVkFTX0tFWV9NT0RJRklFUl9DT05U
Uk9MID0gMSA8PCAwLAorICAgIEVWQVNfS0VZX01PRElGSUVSX1NISUZUICAgPSAxIDw8IDEsCisg
ICAgRVZBU19LRVlfTU9ESUZJRVJfQUxUICAgICA9IDEgPDwgMiwKKyAgICBFVkFTX0tFWV9NT0RJ
RklFUl9NRVRBICAgID0gMSA8PCAzCit9OworCitlbnVtIEV2YXNNb3VzZUJ1dHRvbiB7CisgICAg
RVZBU19NT1VTRV9CVVRUT05fTk9ORSAgID0gMHgwMCwKKyAgICBFVkFTX01PVVNFX0JVVFRPTl9M
RUZUICAgPSAweDAxLAorICAgIEVWQVNfTU9VU0VfQlVUVE9OX01JRERMRSA9IDB4MDIsCisgICAg
RVZBU19NT1VTRV9CVVRUT05fUklHSFQgID0gMHgwMworfTsKKworZW51bSBFdmFzTW91c2VFdmVu
dCB7CisgICAgRVZBU19NT1VTRV9FVkVOVF9OT05FICAgICAgICAgPSAwLAorICAgIEVWQVNfTU9V
U0VfRVZFTlRfRE9XTiAgICAgICAgID0gMSA8PCAwLAorICAgIEVWQVNfTU9VU0VfRVZFTlRfVVAg
ICAgICAgICAgID0gMSA8PCAxLAorICAgIEVWQVNfTU9VU0VfRVZFTlRfTU9WRSAgICAgICAgID0g
MSA8PCAyLAorICAgIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX1VQICAgID0gMSA8PCAzLAorICAg
IEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX0RPV04gID0gMSA8PCA0LAorICAgIEVWQVNfTU9VU0Vf
RVZFTlRfU0NST0xMX0xFRlQgID0gMSA8PCA1LAorICAgIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xM
X1JJR0hUID0gMSA8PCA2LAorICAgIEVWQVNfTU9VU0VfRVZFTlRfQ0xJQ0sgICAgICAgID0gRVZB
U19NT1VTRV9FVkVOVF9NT1ZFIHwgRVZBU19NT1VTRV9FVkVOVF9ET1dOIHwgRVZBU19NT1VTRV9F
VkVOVF9VUCwKK307CisKK3N0YXRpYyB2b2lkIHNldEV2YXNNb2RpZmllcnMoRXZhcyogZXZhcywg
RXZhc0tleU1vZGlmaWVyIG1vZGlmaWVycykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbW9k
aWZpZXJOYW1lc1tdID0geyAiQ29udHJvbCIsICJTaGlmdCIsICJBbHQiLCAiU3VwZXIiIH07Cisg
ICAgZm9yICh1bnNpZ25lZCBtb2RpZmllciA9IDA7IG1vZGlmaWVyIDwgNDsgKyttb2RpZmllcikg
eworICAgICAgICBpZiAobW9kaWZpZXJzICYgKDEgPDwgbW9kaWZpZXIpKQorICAgICAgICAgICAg
ZXZhc19rZXlfbW9kaWZpZXJfb24oZXZhcywgbW9kaWZpZXJOYW1lc1ttb2RpZmllcl0pOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBldmFzX2tleV9tb2RpZmllcl9vZmYoZXZhcywgbW9kaWZp
ZXJOYW1lc1ttb2RpZmllcl0pOworICAgIH0KK30KKworc3RhdGljIEV2YXNNb3VzZUJ1dHRvbiB0
cmFuc2xhdGVNb3VzZUJ1dHRvbk51bWJlcihpbnQgZXZlbnRTZW5kZXJCdXR0b25OdW1iZXIpCit7
CisgICAgc3dpdGNoIChldmVudFNlbmRlckJ1dHRvbk51bWJlcikgeworICAgIGNhc2UgMDoKKyAg
ICAgICAgcmV0dXJuIEVWQVNfTU9VU0VfQlVUVE9OX0xFRlQ7CisgICAgY2FzZSAxOgorICAgICAg
ICByZXR1cm4gRVZBU19NT1VTRV9CVVRUT05fTUlERExFOworICAgIGNhc2UgMjoKKyAgICAgICAg
cmV0dXJuIEVWQVNfTU9VU0VfQlVUVE9OX1JJR0hUOworICAgIGNhc2UgMzoKKyAgICAgICAgLy8g
ZmFzdC9ldmVudHMvbW91c2UtY2xpY2stZXZlbnRzIGV4cGVjdHMgdGhlIDR0aCBidXR0b24gdG8g
YmUgdHJlYXRlZCBhcyB0aGUgbWlkZGxlIGJ1dHRvbgorICAgICAgICByZXR1cm4gRVZBU19NT1VT
RV9CVVRUT05fTUlERExFOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFVkFTX01PVVNF
X0JVVFRPTl9MRUZUOworICAgIH0KK30KKworc3RhdGljIGJvb2wgc2VuZE1vdXNlRXZlbnQoRXZh
cyogZXZhcywgRXZhc01vdXNlRXZlbnQgZXZlbnQsIGludCBidXR0b25OdW1iZXIsIEV2YXNLZXlN
b2RpZmllciBtb2RpZmllcnMpCit7CisgICAgdW5zaWduZWQgdGltZVN0YW1wID0gMDsKKworICAg
IHNldEV2YXNNb2RpZmllcnMoZXZhcywgbW9kaWZpZXJzKTsKKyAgICBpZiAoZXZlbnQgJiBFVkFT
X01PVVNFX0VWRU5UX01PVkUpCisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV9tb3ZlKGV2
YXMsIGdMYXN0TW91c2VQb3NpdGlvblgsIGdMYXN0TW91c2VQb3NpdGlvblksIHRpbWVTdGFtcCsr
LCAwKTsKKyAgICBpZiAoZXZlbnQgJiBFVkFTX01PVVNFX0VWRU5UX0RPV04pCisgICAgICAgIGV2
YXNfZXZlbnRfZmVlZF9tb3VzZV9kb3duKGV2YXMsIGJ1dHRvbk51bWJlciwgRVZBU19CVVRUT05f
Tk9ORSwgdGltZVN0YW1wKyssIDApOworICAgIGlmIChldmVudCAmIEVWQVNfTU9VU0VfRVZFTlRf
VVApCisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV91cChldmFzLCBidXR0b25OdW1iZXIs
IEVWQVNfQlVUVE9OX05PTkUsIHRpbWVTdGFtcCsrLCAwKTsKKworICAgIGNvbnN0IGJvb2wgaG9y
aXpvbnRhbCA9ICEhKGV2ZW50ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfTEVGVCB8IGV2ZW50
ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfUklHSFQpOworICAgIGNvbnN0IGJvb2wgdmVydGlj
YWwgPSAhIShldmVudCAmIEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX1VQIHwgZXZlbnQgJiBFVkFT
X01PVVNFX0VWRU5UX1NDUk9MTF9ET1dOKTsKKyAgICBpZiAodmVydGljYWwgJiYgaG9yaXpvbnRh
bCkgeworICAgICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywgMCwgKGV2ZW50
ICYgRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfVVApID8gMTAgOiAtMTAsIHRpbWVTdGFtcCwgMCk7
CisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV93aGVlbChldmFzLCAxLCAoZXZlbnQgJiBF
VkFTX01PVVNFX0VWRU5UX1NDUk9MTF9MRUZUKSA/IDEwIDogLTEwLCB0aW1lU3RhbXAsIDApOwor
ICAgIH0gZWxzZSBpZiAodmVydGljYWwpCisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV93
aGVlbChldmFzLCAwLCAoZXZlbnQgJiBFVkFTX01PVVNFX0VWRU5UX1NDUk9MTF9VUCkgPyAxMCA6
IC0xMCwgdGltZVN0YW1wLCAwKTsKKyAgICBlbHNlIGlmIChob3Jpem9udGFsKQorICAgICAgICBl
dmFzX2V2ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywgMSwgKGV2ZW50ICYgRVZBU19NT1VTRV9F
VkVOVF9TQ1JPTExfTEVGVCkgPyAxMCA6IC0xMCwgdGltZVN0YW1wLCAwKTsKKworICAgIHNldEV2
YXNNb2RpZmllcnMoZXZhcywgRVZBU19LRVlfTU9ESUZJRVJfTk9ORSk7CisKKyAgICByZXR1cm4g
dHJ1ZTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBzZW5kQ2xpY2sodm9pZCopCit7CisgICAgcmV0
dXJuICEhc2VuZE1vdXNlRXZlbnQoZXZhc19vYmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgRVZB
U19NT1VTRV9FVkVOVF9DTElDSywgRVZBU19NT1VTRV9CVVRUT05fTEVGVCwgRVZBU19LRVlfTU9E
SUZJRVJfTk9ORSk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIHNjaGVkdWxlQXN5bmNocm9ub3Vz
Q2xpY2tDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24s
IEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1Zh
bHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgZWNvcmVf
aWRsZXJfYWRkKHNlbmRDbGljaywgMCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVk
KGNvbnRleHQpOworfQorCitzdGF0aWMgdm9pZCB1cGRhdGVDbGlja0NvdW50KGludCBidXR0b24p
Cit7CisgICAgaWYgKGdMYXN0Q2xpY2tQb3NpdGlvblggIT0gZ0xhc3RNb3VzZVBvc2l0aW9uWAor
ICAgICAgICB8fCBnTGFzdENsaWNrUG9zaXRpb25ZICE9IGdMYXN0TW91c2VQb3NpdGlvblkKKyAg
ICAgICAgfHwgZ0xhc3RDbGlja0J1dHRvbiAhPSBidXR0b24KKyAgICAgICAgfHwgZ1RpbWVPZmZz
ZXQgLSBnTGFzdENsaWNrVGltZU9mZnNldCA+PSAxKQorICAgICAgICBnQ2xpY2tDb3VudCA9IDE7
CisgICAgZWxzZQorICAgICAgICBnQ2xpY2tDb3VudCsrOworfQorCitzdGF0aWMgRXZhc0tleU1v
ZGlmaWVyIG1vZGlmaWVyRnJvbUpTVmFsdWUoSlNDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IEpT
VmFsdWVSZWYgdmFsdWUpCit7CisgICAgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IGpzS2V5VmFs
dWUoQWRvcHQsIEpTVmFsdWVUb1N0cmluZ0NvcHkoY29udGV4dCwgdmFsdWUsIDApKTsKKworICAg
IGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGpzS2V5VmFsdWUuZ2V0KCksICJjdHJs
S2V5IikgfHwgSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhqc0tleVZhbHVlLmdldCgpLCAi
YWRkU2VsZWN0aW9uS2V5IikpCisgICAgICAgIHJldHVybiBFVkFTX0tFWV9NT0RJRklFUl9DT05U
Uk9MOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGpzS2V5VmFsdWUuZ2V0
KCksICJzaGlmdEtleSIpIHx8IEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoanNLZXlWYWx1
ZS5nZXQoKSwgInJhbmdlU2VsZWN0aW9uS2V5IikpCisgICAgICAgIHJldHVybiBFVkFTX0tFWV9N
T0RJRklFUl9TSElGVDsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhqc0tl
eVZhbHVlLmdldCgpLCAiYWx0S2V5IikpCisgICAgICAgIHJldHVybiBFVkFTX0tFWV9NT0RJRklF
Ul9BTFQ7CisgICAgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoanNLZXlWYWx1ZS5n
ZXQoKSwgIm1ldGFLZXkiKSkKKyAgICAgICAgcmV0dXJuIEVWQVNfS0VZX01PRElGSUVSX01FVEE7
CisKKyAgICByZXR1cm4gRVZBU19LRVlfTU9ESUZJRVJfTk9ORTsKK30KKworc3RhdGljIEV2YXNL
ZXlNb2RpZmllciBtb2RpZmllcnNGcm9tSlNWYWx1ZShKU0NvbnRleHRSZWYgY29udGV4dCwgY29u
c3QgSlNWYWx1ZVJlZiBtb2RpZmllcnMpCit7CisgICAgLy8gVGhlIHZhbHVlIG1heSBlaXRoZXIg
YmUgYSBzdHJpbmcgd2l0aCBhIHNpbmdsZSBtb2RpZmllciBvciBhbiBhcnJheSBvZiBtb2RpZmll
cnMuCisgICAgaWYgKEpTVmFsdWVJc1N0cmluZyhjb250ZXh0LCBtb2RpZmllcnMpKQorICAgICAg
ICByZXR1cm4gbW9kaWZpZXJGcm9tSlNWYWx1ZShjb250ZXh0LCBtb2RpZmllcnMpOworCisgICAg
SlNPYmplY3RSZWYgbW9kaWZpZXJzQXJyYXkgPSBKU1ZhbHVlVG9PYmplY3QoY29udGV4dCwgbW9k
aWZpZXJzLCAwKTsKKyAgICBpZiAoIW1vZGlmaWVyc0FycmF5KQorICAgICAgICByZXR1cm4gRVZB
U19LRVlfTU9ESUZJRVJfTk9ORTsKKworICAgIHVuc2lnbmVkIG1vZGlmaWVyID0gMDsKKyAgICBp
bnQgbW9kaWZpZXJzQ291bnQgPSBKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgSlNPYmplY3RHZXRQ
cm9wZXJ0eShjb250ZXh0LCBtb2RpZmllcnNBcnJheSwgSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENT
dHJpbmcoImxlbmd0aCIpLCAwKSwgMCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RpZmll
cnNDb3VudDsgKytpKQorICAgICAgICBtb2RpZmllciB8PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4o
bW9kaWZpZXJGcm9tSlNWYWx1ZShjb250ZXh0LCBKU09iamVjdEdldFByb3BlcnR5QXRJbmRleChj
b250ZXh0LCBtb2RpZmllcnNBcnJheSwgaSwgMCkpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8
RXZhc0tleU1vZGlmaWVyPihtb2RpZmllcik7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNl
RG93bkNhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwg
SlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFs
dWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpbnQgYnV0
dG9uID0gMDsKKyAgICBpZiAoYXJndW1lbnRDb3VudCA9PSAxKSB7CisgICAgICAgIGJ1dHRvbiA9
IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwg
ZXhjZXB0aW9uKSk7CisKKyAgICAgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAg
ICAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworICAgIH0KKwor
ICAgIGJ1dHRvbiA9IHRyYW5zbGF0ZU1vdXNlQnV0dG9uTnVtYmVyKGJ1dHRvbik7CisgICAgLy8g
SWYgdGhlIHNhbWUgbW91c2UgYnV0dG9uIGlzIGFscmVhZHkgaW4gdGhlIGRvd24gcG9zaXRpb24g
ZG9uJ3Qgc2VuZCBhbm90aGVyIGV2ZW50IGFzIGl0IG1heSBjb25mdXNlIFh2ZmIuCisgICAgaWYg
KGdCdXR0b25DdXJyZW50bHlEb3duID09IGJ1dHRvbikKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVN
YWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgdXBkYXRlQ2xpY2tDb3VudChidXR0b24pOwor
CisgICAgRXZhc0tleU1vZGlmaWVyIG1vZGlmaWVycyA9IGFyZ3VtZW50Q291bnQgPj0gMiA/IG1v
ZGlmaWVyc0Zyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3VtZW50c1sxXSkgOiBFVkFTX0tFWV9NT0RJ
RklFUl9OT05FOworICAgIGlmICghc2VuZE1vdXNlRXZlbnQoZXZhc19vYmplY3RfZXZhc19nZXQo
bWFpbkZyYW1lKSwgRVZBU19NT1VTRV9FVkVOVF9ET1dOLCBidXR0b24sIG1vZGlmaWVycykpCisg
ICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGdCdXR0
b25DdXJyZW50bHlEb3duID0gYnV0dG9uOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5l
ZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgbW91c2VVcENhbGxiYWNrKEpTQ29u
dGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09i
amVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10s
IEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpbnQgYnV0dG9uID0gMDsKKyAgICBpZiAo
YXJndW1lbnRDb3VudCA9PSAxKSB7CisgICAgICAgIGJ1dHRvbiA9IHN0YXRpY19jYXN0PGludD4o
SlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7CisgICAg
ICAgIGlmIChleGNlcHRpb24gJiYgKmV4Y2VwdGlvbikKKyAgICAgICAgICAgIHJldHVybiBKU1Zh
bHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICB9CisKKyAgICBnTGFzdENsaWNrUG9zaXRp
b25YID0gZ0xhc3RNb3VzZVBvc2l0aW9uWDsKKyAgICBnTGFzdENsaWNrUG9zaXRpb25ZID0gZ0xh
c3RNb3VzZVBvc2l0aW9uWTsKKyAgICBnTGFzdENsaWNrQnV0dG9uID0gZ0J1dHRvbkN1cnJlbnRs
eURvd247CisgICAgZ0xhc3RDbGlja1RpbWVPZmZzZXQgPSBnVGltZU9mZnNldDsKKyAgICBnQnV0
dG9uQ3VycmVudGx5RG93biA9IDA7CisKKyAgICBFdmFzS2V5TW9kaWZpZXIgbW9kaWZpZXJzID0g
YXJndW1lbnRDb3VudCA+PSAyID8gbW9kaWZpZXJzRnJvbUpTVmFsdWUoY29udGV4dCwgYXJndW1l
bnRzWzFdKSA6IEVWQVNfS0VZX01PRElGSUVSX05PTkU7CisgICAgc2VuZE1vdXNlRXZlbnQoZXZh
c19vYmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgRVZBU19NT1VTRV9FVkVOVF9VUCwgdHJhbnNs
YXRlTW91c2VCdXR0b25OdW1iZXIoYnV0dG9uKSwgbW9kaWZpZXJzKTsKKyAgICByZXR1cm4gSlNW
YWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNl
TW92ZVRvQ2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9u
LCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNW
YWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIGlmIChh
cmd1bWVudENvdW50IDwgMikKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNv
bnRleHQpOworCisgICAgZ0xhc3RNb3VzZVBvc2l0aW9uWCA9IHN0YXRpY19jYXN0PGludD4oSlNW
YWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7CisgICAgaWYg
KGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRl
ZmluZWQoY29udGV4dCk7CisgICAgZ0xhc3RNb3VzZVBvc2l0aW9uWSA9IHN0YXRpY19jYXN0PGlu
dD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1sxXSwgZXhjZXB0aW9uKSk7Cisg
ICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1h
a2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBzZW5kTW91c2VFdmVudChldmFzX29iamVjdF9l
dmFzX2dldChtYWluRnJhbWUpLCBFVkFTX01PVVNFX0VWRU5UX01PVkUsIEVWQVNfTU9VU0VfQlVU
VE9OX05PTkUsIEVWQVNfS0VZX01PRElGSUVSX05PTkUpOworICAgIHJldHVybiBKU1ZhbHVlTWFr
ZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEV2YXNNb3VzZUV2ZW50IGV2YXNNb3Vz
ZUV2ZW50RnJvbUhvcml6b250YWxBbmRWZXJ0aWNhbE9mZnNldHMoaW50IGhvcml6b250YWxPZmZz
ZXQsIGludCB2ZXJ0aWNhbE9mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBtb3VzZUV2ZW50ID0gMDsK
KworICAgIGlmICh2ZXJ0aWNhbE9mZnNldCA+IDApCisgICAgICAgIG1vdXNlRXZlbnQgfD0gRVZB
U19NT1VTRV9FVkVOVF9TQ1JPTExfVVA7CisgICAgZWxzZSBpZiAodmVydGljYWxPZmZzZXQgPCAw
KQorICAgICAgICBtb3VzZUV2ZW50IHw9IEVWQVNfTU9VU0VfRVZFTlRfU0NST0xMX0RPV047CisK
KyAgICBpZiAoaG9yaXpvbnRhbE9mZnNldCA+IDApCisgICAgICAgIG1vdXNlRXZlbnQgfD0gRVZB
U19NT1VTRV9FVkVOVF9TQ1JPTExfUklHSFQ7CisgICAgZWxzZSBpZiAoaG9yaXpvbnRhbE9mZnNl
dCA8IDApCisgICAgICAgIG1vdXNlRXZlbnQgfD0gRVZBU19NT1VTRV9FVkVOVF9TQ1JPTExfTEVG
VDsKKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFdmFzTW91c2VFdmVudD4obW91c2VFdmVudCk7
Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNlU2Nyb2xsQnlDYWxsYmFjayhKU0NvbnRleHRS
ZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3Qs
IHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1Zh
bHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAyKQorICAgICAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBpbnQgaG9yaXpv
bnRhbCA9IChpbnQpSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0
aW9uKTsKKyAgICBpZiAoZXhjZXB0aW9uICYmICpleGNlcHRpb24pCisgICAgICAgIHJldHVybiBK
U1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICBpbnQgdmVydGljYWwgPSAoaW50KUpT
VmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4Y2VwdGlvbik7CisgICAgaWYg
KGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRl
ZmluZWQoY29udGV4dCk7CisKKyAgICBzZW5kTW91c2VFdmVudChldmFzX29iamVjdF9ldmFzX2dl
dChtYWluRnJhbWUpLCBldmFzTW91c2VFdmVudEZyb21Ib3Jpem9udGFsQW5kVmVydGljYWxPZmZz
ZXRzKGhvcml6b250YWwsIHZlcnRpY2FsKSwgRVZBU19NT1VTRV9CVVRUT05fTk9ORSwgRVZBU19L
RVlfTU9ESUZJRVJfTk9ORSk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRl
eHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBjb250aW51b3VzTW91c2VTY3JvbGxCeUNhbGxi
YWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RS
ZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJn
dW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICByZXR1cm4gSlNWYWx1ZU1h
a2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBrZXlQYWROYW1l
RnJvbUpTVmFsdWUoSlNTdHJpbmdSZWYgY2hhcmFjdGVyKQoreworICAgIGlmIChKU1N0cmluZ0lz
RXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgImxlZnRBcnJvdyIpKQorICAgICAgICByZXR1
cm4gIktQX0xlZnQiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJh
Y3RlciwgInJpZ2h0QXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJLUF9SaWdodCI7CisgICAgaWYg
KEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAidXBBcnJvdyIpKQorICAg
ICAgICByZXR1cm4gIktQX1VwIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmlu
ZyhjaGFyYWN0ZXIsICJkb3duQXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJLUF9Eb3duIjsKKyAg
ICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJwYWdlVXAiKSkK
KyAgICAgICAgcmV0dXJuICJLUF9QYWdlX1VwIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9V
VEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJwYWdlRG93biIpKQorICAgICAgICByZXR1cm4gIktQX1Bh
Z2VfRG93biI7CisgICAgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVy
LCAiaG9tZSIpKQorICAgICAgICByZXR1cm4gIktQX0hvbWUiOworICAgIGlmIChKU1N0cmluZ0lz
RXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgImVuZCIpKQorICAgICAgICByZXR1cm4gIktQ
X0VuZCI7CisgICAgaWYgKEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAi
aW5zZXJ0IikpCisgICAgICAgIHJldHVybiAiS1BfSW5zZXJ0IjsKKyAgICBpZiAoSlNTdHJpbmdJ
c0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJkZWxldGUiKSkKKyAgICAgICAgcmV0dXJu
ICJLUF9EZWxldGUiOworCisgICAgLy8gSWYgd2UgZ2V0IHNvbWUgb3RoZXIga2V5IHNwZWNpZmll
ZCB3aXRoIHRoZSBudW1wYWQgbG9jYXRpb24sCisgICAgLy8gY3Jhc2ggaGVyZSwgc28gd2UgYWRk
IGl0IHNvb25lciByYXRoZXIgdGhhbiBsYXRlci4KKyAgICBmcHJpbnRmKHN0ZGVyciwgIm51bWVy
aWMgcGFkIGtleSBub3QgaGFuZGxlZDogJXNcbiIsIGNoYXJhY3Rlci0+dXN0cmluZygpLnV0Zjgo
KS5kYXRhKCkpOworICAgIGFib3J0KCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBrZXlOYW1l
RnJvbUpTVmFsdWUoSlNTdHJpbmdSZWYgY2hhcmFjdGVyKQoreworICAgIGlmIChKU1N0cmluZ0lz
RXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgImxlZnRBcnJvdyIpKQorICAgICAgICByZXR1
cm4gIkxlZnQiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3Rl
ciwgInJpZ2h0QXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJSaWdodCI7CisgICAgaWYgKEpTU3Ry
aW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAidXBBcnJvdyIpKQorICAgICAgICBy
ZXR1cm4gIlVwIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0
ZXIsICJkb3duQXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJEb3duIjsKKyAgICBpZiAoSlNTdHJp
bmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJwYWdlVXAiKSkKKyAgICAgICAgcmV0
dXJuICJQYWdlX1VwIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFy
YWN0ZXIsICJwYWdlRG93biIpKQorICAgICAgICByZXR1cm4gIlBhZ2VfRG93biI7CisgICAgaWYg
KEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAiaG9tZSIpKQorICAgICAg
ICByZXR1cm4gIkhvbWUiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNo
YXJhY3RlciwgImVuZCIpKQorICAgICAgICByZXR1cm4gIkVuZCI7CisgICAgaWYgKEpTU3RyaW5n
SXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAiaW5zZXJ0IikpCisgICAgICAgIHJldHVy
biAiSW5zZXJ0IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0
ZXIsICJkZWxldGUiKSkKKyAgICAgICAgcmV0dXJuICJEZWxldGUiOworICAgIGlmIChKU1N0cmlu
Z0lzRXF1YWxUb1VURjhDU3RyaW5nKGNoYXJhY3RlciwgInByaW50U2NyZWVuIikpCisgICAgICAg
IHJldHVybiAiUHJpbnQiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhDU3RyaW5nKGNo
YXJhY3RlciwgIm1lbnUiKSkKKyAgICAgICAgcmV0dXJuICJNZW51IjsKKyAgICBpZiAoSlNTdHJp
bmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGMSIpKQorICAgICAgICByZXR1cm4g
IkYxIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJG
MiIpKQorICAgICAgICByZXR1cm4gIkYyIjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4
Q1N0cmluZyhjaGFyYWN0ZXIsICJGMyIpKQorICAgICAgICByZXR1cm4gIkYzIjsKKyAgICBpZiAo
SlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGNCIpKQorICAgICAgICBy
ZXR1cm4gIkY0IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0
ZXIsICJGNSIpKQorICAgICAgICByZXR1cm4gIkY1IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFs
VG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGNiIpKQorICAgICAgICByZXR1cm4gIkY2IjsKKyAg
ICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGNyIpKQorICAg
ICAgICByZXR1cm4gIkY3IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhj
aGFyYWN0ZXIsICJGOCIpKQorICAgICAgICByZXR1cm4gIkY4IjsKKyAgICBpZiAoSlNTdHJpbmdJ
c0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGOSIpKQorICAgICAgICByZXR1cm4gIkY5
IjsKKyAgICBpZiAoSlNTdHJpbmdJc0VxdWFsVG9VVEY4Q1N0cmluZyhjaGFyYWN0ZXIsICJGMTAi
KSkKKyAgICAgICAgcmV0dXJuICJGMTAiOworICAgIGlmIChKU1N0cmluZ0lzRXF1YWxUb1VURjhD
U3RyaW5nKGNoYXJhY3RlciwgIkYxMSIpKQorICAgICAgICByZXR1cm4gIkYxMSI7CisgICAgaWYg
KEpTU3RyaW5nSXNFcXVhbFRvVVRGOENTdHJpbmcoY2hhcmFjdGVyLCAiRjEyIikpCisgICAgICAg
IHJldHVybiAiRjEyIjsKKworICAgIGludCBjaGFyQ29kZSA9IEpTU3RyaW5nR2V0Q2hhcmFjdGVy
c1B0cihjaGFyYWN0ZXIpWzBdOworICAgIGlmIChjaGFyQ29kZSA9PSAnXG4nIHx8IGNoYXJDb2Rl
ID09ICdccicpCisgICAgICAgIHJldHVybiAiUmV0dXJuIjsKKyAgICBpZiAoY2hhckNvZGUgPT0g
J1x0JykKKyAgICAgICAgcmV0dXJuICJUYWIiOworICAgIGlmIChjaGFyQ29kZSA9PSAnXHg4JykK
KyAgICAgICAgcmV0dXJuICJCYWNrU3BhY2UiOworCisgICAgLy8gRklYTUU6IFNlZSBvdGhlciBp
bXBsZW1lbnRhdGlvbnMgYW5kIG9idGFpbiB0aGUga2V5IG5hbWUgYnkKKyAgICAvLyB0aGUgVW5p
Y29kZSBjaGFyYWN0ZXIgY29kZS4KKyAgICBmcHJpbnRmKHN0ZGVyciwgImtleSBub3QgaGFuZGxl
ZDogJXNcbiIsIGNoYXJhY3Rlci0+dXN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFib3J0
KCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIGtleURvd25DYWxsYmFjayhKU0NvbnRleHRSZWYg
Y29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNp
emVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVl
UmVmKiBleGNlcHRpb24pCit7CisgICAgRXZhc19PYmplY3QqIHZpZXcgPSBld2tfZnJhbWVfdmll
d19nZXQobWFpbkZyYW1lKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBKU1ZhbHVl
TWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGlmIChhcmd1bWVudENvdW50IDwgMSkKKyAg
ICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgLy8gaGFu
ZGxlIGxvY2F0aW9uIGFyZ3VtZW50LgorICAgIGludCBsb2NhdGlvbiA9IERPTV9LRVlfTE9DQVRJ
T05fU1RBTkRBUkQ7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPiAyKQorICAgICAgICBsb2NhdGlv
biA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1sy
XSwgZXhjZXB0aW9uKSk7CisKKyAgICBKU1JldGFpblB0cjxKU1N0cmluZ1JlZj4gY2hhcmFjdGVy
KEFkb3B0LCBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0
aW9uKSk7CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4g
SlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICAvLyBzZW5kIHRoZSBldmVudAor
ICAgIEV2YXMqIGV2YXMgPSBldmFzX29iamVjdF9ldmFzX2dldCh2aWV3KTsKKworICAgIGlmIChh
cmd1bWVudENvdW50ID49IDIpCisgICAgICAgIHNldEV2YXNNb2RpZmllcnMoZXZhcywgbW9kaWZp
ZXJzRnJvbUpTVmFsdWUoY29udGV4dCwgYXJndW1lbnRzWzFdKSk7CisKKyAgICBjb25zdCBjaGFy
KiBrZXlOYW1lID0gKGxvY2F0aW9uID09IERPTV9LRVlfTE9DQVRJT05fTlVNUEFEKSA/IGtleVBh
ZE5hbWVGcm9tSlNWYWx1ZShjaGFyYWN0ZXIuZ2V0KCkpIDoga2V5TmFtZUZyb21KU1ZhbHVlKGNo
YXJhY3Rlci5nZXQoKSk7CisgICAgZXZhc19ldmVudF9mZWVkX2tleV9kb3duKGV2YXMsIGtleU5h
bWUsIGtleU5hbWUsIDAsIDAsIDAsIDApOworICAgIGV2YXNfZXZlbnRfZmVlZF9rZXlfdXAoZXZh
cywga2V5TmFtZSwga2V5TmFtZSwgMCwgMCwgMSwgMCk7CisKKyAgICBzZXRFdmFzTW9kaWZpZXJz
KGV2YXMsIEVWQVNfS0VZX01PRElGSUVSX05PTkUpOworCisgICAgcmV0dXJuIEpTVmFsdWVNYWtl
VW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBzY2FsZVBhZ2VCeUNh
bGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmpl
Y3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYg
YXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpZiAoYXJndW1lbnRD
b3VudCA8IDMpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsK
KworICAgIEV2YXNfT2JqZWN0KiB2aWV3ID0gZXdrX2ZyYW1lX3ZpZXdfZ2V0KG1haW5GcmFtZSk7
CisgICAgaWYgKCF2aWV3KQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29u
dGV4dCk7CisKKyAgICBmbG9hdCBzY2FsZUZhY3RvciA9IEpTVmFsdWVUb051bWJlcihjb250ZXh0
LCBhcmd1bWVudHNbMF0sIGV4Y2VwdGlvbik7CisgICAgZmxvYXQgeCA9IEpTVmFsdWVUb051bWJl
cihjb250ZXh0LCBhcmd1bWVudHNbMV0sIGV4Y2VwdGlvbik7CisgICAgZmxvYXQgeSA9IEpTVmFs
dWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVudHNbMl0sIGV4Y2VwdGlvbik7CisgICAgZXdrX3Zp
ZXdfcGFnZV9zY2FsZSh2aWV3LCBzY2FsZUZhY3RvciwgeCwgeSk7CisKKyAgICByZXR1cm4gSlNW
YWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyBKU1N0YXRpY0Z1bmN0aW9u
IHN0YXRpY0Z1bmN0aW9uc1tdID0geworICAgIHsgIm1vdXNlU2Nyb2xsQnkiLCBtb3VzZVNjcm9s
bEJ5Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0
dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJjb250aW51b3VzTW91c2VTY3JvbGxCeSIsIGNv
bnRpbnVvdXNNb3VzZVNjcm9sbEJ5Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9u
bHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJtb3VzZURvd24i
LCBtb3VzZURvd25DYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1By
b3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgIm1vdXNlVXAiLCBtb3VzZVVwQ2Fs
bGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0
ZURvbnREZWxldGUgfSwKKyAgICB7ICJtb3VzZU1vdmVUbyIsIG1vdXNlTW92ZVRvQ2FsbGJhY2ss
IGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnRE
ZWxldGUgfSwKKyAgICB7ICJrZXlEb3duIiwga2V5RG93bkNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0
dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAg
eyAic2NoZWR1bGVBc3luY2hyb25vdXNDbGljayIsIHNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2tD
YWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmli
dXRlRG9udERlbGV0ZSB9LAorICAgIHsgInNjYWxlUGFnZUJ5Iiwgc2NhbGVQYWdlQnlDYWxsYmFj
aywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9u
dERlbGV0ZSB9LAorICAgIHsgMCwgMCwgMCB9Cit9OworCitzdGF0aWMgSlNTdGF0aWNWYWx1ZSBz
dGF0aWNWYWx1ZXNbXSA9IHsKKyAgICB7IDAsIDAsIDAsIDAgfQorfTsKKworc3RhdGljIEpTQ2xh
c3NSZWYgZ2V0Q2xhc3MoSlNDb250ZXh0UmVmIGNvbnRleHQpCit7CisgICAgc3RhdGljIEpTQ2xh
c3NSZWYgZXZlbnRTZW5kZXJDbGFzcyA9IDA7CisKKyAgICBpZiAoIWV2ZW50U2VuZGVyQ2xhc3Mp
IHsKKyAgICAgICAgSlNDbGFzc0RlZmluaXRpb24gY2xhc3NEZWZpbml0aW9uID0geworICAgICAg
ICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwg
MCwgMCwgMCwgMCwgMCwgMCwgMH07CisgICAgICAgIGNsYXNzRGVmaW5pdGlvbi5zdGF0aWNGdW5j
dGlvbnMgPSBzdGF0aWNGdW5jdGlvbnM7CisgICAgICAgIGNsYXNzRGVmaW5pdGlvbi5zdGF0aWNW
YWx1ZXMgPSBzdGF0aWNWYWx1ZXM7CisKKyAgICAgICAgZXZlbnRTZW5kZXJDbGFzcyA9IEpTQ2xh
c3NDcmVhdGUoJmNsYXNzRGVmaW5pdGlvbik7CisgICAgfQorCisgICAgcmV0dXJuIGV2ZW50U2Vu
ZGVyQ2xhc3M7Cit9CisKK0pTT2JqZWN0UmVmIG1ha2VFdmVudFNlbmRlcihKU0NvbnRleHRSZWYg
Y29udGV4dCwgYm9vbCBpc1RvcEZyYW1lKQoreworICAgIGlmIChpc1RvcEZyYW1lKSB7CisgICAg
ICAgIGdEcmFnTW9kZSA9IHRydWU7CisKKyAgICAgICAgLy8gRmx5IGZvcndhcmQgaW4gdGltZSBv
bmUgc2Vjb25kIHdoZW4gdGhlIG1haW4gZnJhbWUgbG9hZHMuIFRoaXMgd2lsbAorICAgICAgICAv
LyBlbnN1cmUgdGhhdCB3aGVuIGEgdGVzdCBiZWdpbnMgY2xpY2tpbmcgaW4gdGhlIHNhbWUgbG9j
YXRpb24gYXMKKyAgICAgICAgLy8gYSBwcmV2aW91cyB0ZXN0LCB0aG9zZSBjbGlja3Mgd29uJ3Qg
YmUgaW50ZXJwcmV0ZWQgYXMgY29udGludWF0aW9ucworICAgICAgICAvLyBvZiB0aGUgcHJldmlv
dXMgdGVzdCdzIGNsaWNrIHNlcXVlbmNlcy4KKyAgICAgICAgZ1RpbWVPZmZzZXQgKz0gMTAwMDsK
KworICAgICAgICBnTGFzdE1vdXNlUG9zaXRpb25YID0gZ0xhc3RNb3VzZVBvc2l0aW9uWSA9IDA7
CisgICAgICAgIGdMYXN0Q2xpY2tQb3NpdGlvblggPSBnTGFzdENsaWNrUG9zaXRpb25ZID0gMDsK
KyAgICAgICAgZ0xhc3RDbGlja1RpbWVPZmZzZXQgPSAwOworICAgICAgICBnTGFzdENsaWNrQnV0
dG9uID0gMDsKKyAgICAgICAgZ0J1dHRvbkN1cnJlbnRseURvd24gPSAwOworICAgICAgICBnQ2xp
Y2tDb3VudCA9IDA7CisgICAgfQorCisgICAgcmV0dXJuIEpTT2JqZWN0TWFrZShjb250ZXh0LCBn
ZXRDbGFzcyhjb250ZXh0KSwgMCk7Cit9CkluZGV4OiBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwv
RXZlbnRTZW5kZXIuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRXZl
bnRTZW5kZXIuaAkocmV2aXNpb24gMCkKKysrIFRvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9FdmVu
dFNlbmRlci5oCShyZXZpc2lvbiAwKQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDA3IEFwcGxlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQg
KEMpIDIwMDkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIENvcHlyaWdodCAoQykgMjAx
MSBQcm9GVVNJT04gRW1iZWRkZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1
bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqCisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1l
IG9mIEFwcGxlIENvbXB1dGVyLCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAg
ICAgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJv
ZHVjdHMgZGVyaXZlZAorICogICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmlj
IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIEFORCBJVFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUgSU1QTElFRAorICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORAorICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaWZuZGVmIEV2ZW50U2VuZGVyX2gKKyNkZWZpbmUgRXZlbnRTZW5kZXJf
aAorCit0eXBlZGVmIGNvbnN0IHN0cnVjdCBPcGFxdWVKU0NvbnRleHQqIEpTQ29udGV4dFJlZjsK
K3R5cGVkZWYgc3RydWN0IE9wYXF1ZUpTVmFsdWUqIEpTT2JqZWN0UmVmOworCitKU09iamVjdFJl
ZiBtYWtlRXZlbnRTZW5kZXIoSlNDb250ZXh0UmVmLCBib29sKTsKKworI2VuZGlmIC8vIEV2ZW50
U2VuZGVyX2gK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98010</attachid>
            <date>2011-06-21 10:49:26 -0700</date>
            <delta_ts>2011-06-27 06:59:43 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-61962-20110621145247.patch</filename>
            <type>text/plain</type>
            <size>27891</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODkzNjIKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA5MTE3OTAyMmQ3NTFlZjhlZWM4NGI1Y2I2NGJkYzk4ZjNl
YzQzMTQyLi5hNDA5NDdiMmY4MjJhMGM5MzE1YjQxZTc4MmJjNjc1ZTA2Y2EzY2JhIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzkg
QEAKKzIwMTEtMDYtMjEgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9uLm1vYmk+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0VGTF0g
QWRkIGFuIEV2ZW50U2VuZGVyIGltcGxlbWVudGF0aW9uIHRvIEVGTCdzIER1bXBSZW5kZXJUcmVl
IGFsb25nCisgICAgICAgIHdpdGggc3VwcG9ydCBmaWxlcy4KKyAgICAgICAgQnVpbGQgc3lzdGVt
IGNoYW5nZXMgd2lsbCBiZSBtYWRlIGFzIHNvb24gYXMgdGhlIHdob2xlIER1bXBSZW5kZXJUcmVl
CisgICAgICAgIGlzIHVwc3RyZWFtZWQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD02MTk2MgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsL0V2
ZW50U2VuZGVyLmNwcDogQWRkZWQuCisgICAgICAgIChzZXRFdmFzTW9kaWZpZXJzKToKKyAgICAg
ICAgKHRyYW5zbGF0ZU1vdXNlQnV0dG9uTnVtYmVyKToKKyAgICAgICAgKHNlbmRNb3VzZUV2ZW50
KToKKyAgICAgICAgKHNlbmRDbGljayk6CisgICAgICAgIChzY2hlZHVsZUFzeW5jaHJvbm91c0Ns
aWNrQ2FsbGJhY2spOgorICAgICAgICAodXBkYXRlQ2xpY2tDb3VudCk6CisgICAgICAgIChtb2Rp
ZmllckZyb21KU1ZhbHVlKToKKyAgICAgICAgKG1vZGlmaWVyc0Zyb21KU1ZhbHVlKToKKyAgICAg
ICAgKG1vdXNlRG93bkNhbGxiYWNrKToKKyAgICAgICAgKG1vdXNlVXBDYWxsYmFjayk6CisgICAg
ICAgIChtb3VzZU1vdmVUb0NhbGxiYWNrKToKKyAgICAgICAgKGV2YXNNb3VzZUV2ZW50RnJvbUhv
cml6b250YWxBbmRWZXJ0aWNhbE9mZnNldHMpOgorICAgICAgICAobW91c2VTY3JvbGxCeUNhbGxi
YWNrKToKKyAgICAgICAgKGNvbnRpbnVvdXNNb3VzZVNjcm9sbEJ5Q2FsbGJhY2spOgorICAgICAg
ICAoa2V5UGFkTmFtZUZyb21KU1ZhbHVlKToKKyAgICAgICAgKGtleU5hbWVGcm9tSlNWYWx1ZSk6
CisgICAgICAgIChrZXlEb3duQ2FsbGJhY2spOgorICAgICAgICAoc2NhbGVQYWdlQnlDYWxsYmFj
ayk6CisgICAgICAgIChnZXRDbGFzcyk6CisgICAgICAgIChtYWtlRXZlbnRTZW5kZXIpOgorICAg
ICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbC9FdmVudFNlbmRlci5oOiBBZGRlZC4KKyAgICAgICAg
KiBEdW1wUmVuZGVyVHJlZS9lZmwvSlNTdHJpbmdVdGlscy5jcHA6IEFkZGVkLgorICAgICAgICAo
ZXF1YWxzKToKKyAgICAgICAgKiBEdW1wUmVuZGVyVHJlZS9lZmwvSlNTdHJpbmdVdGlscy5oOiBB
ZGRlZC4KKwogMjAxMS0wNi0yMCAgRG1pdHJ5IExvbW92ICA8ZHNsb21vdkBnb29nbGUuY29tPgog
CiAgICAgICAgIFJldmlld2VkIGJ5IERhdmlkIExldmluLgpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVt
cFJlbmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmNwcCBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2Vm
bC9FdmVudFNlbmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYWMxYTIyYzhlYWY4YWEzNGZlNmE0YzRmOTQ1
ODExN2M0ZjY4NWQzOQotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2Vm
bC9FdmVudFNlbmRlci5jcHAKQEAgLTAsMCArMSw1MDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMDcsIDIwMDggQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA5IFphbiBEb2JlcnNlayA8emFuZG9iZXJzZWtAZ21haWwuY29tPgorICogQ29weXJp
Z2h0IChDKSAyMDA5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTAgSWdhbGlhIFMuTC4KKyAqIENvcHlyaWdodCAoQykgMjAxMSBQcm9GVVNJT04gRW1iZWRk
ZWQgU3lzdGVtcworICogQ29weXJpZ2h0IChDKSAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqCisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqIDMuICBOZWl0aGVyIHRoZSBuYW1lIG9mIEFwcGxlIENvbXB1dGVy
LCBJbmMuICgiQXBwbGUiKSBub3IgdGhlIG5hbWVzIG9mCisgKiAgICAgaXRzIGNvbnRyaWJ1dG9y
cyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZAorICog
ICAgIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVy
bWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIEFORCBJ
VFMgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICog
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgT1Ig
SVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMK
KyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAorICogT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgorICogVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5j
bHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiRXZlbnRTZW5kZXIuaCIKKworI2luY2x1ZGUgIkR1
bXBSZW5kZXJUcmVlLmgiCisjaW5jbHVkZSAiSlNTdHJpbmdVdGlscy5oIgorI2luY2x1ZGUgIk5v
dEltcGxlbWVudGVkLmgiCisjaW5jbHVkZSAiZXdrX3ByaXZhdGUuaCIKKyNpbmNsdWRlIDxFV2Vi
S2l0Lmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSlNPYmplY3RSZWYuaD4KKyNpbmNsdWRl
IDxKYXZhU2NyaXB0Q29yZS9KU1JldGFpblB0ci5oPgorI2luY2x1ZGUgPEphdmFTY3JpcHRDb3Jl
L0pTU3RyaW5nUmVmLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvT3BhcXVlSlNTdHJpbmcu
aD4KKyNpbmNsdWRlIDx3dGYvQVNDSUlDVHlwZS5oPgorI2luY2x1ZGUgPHd0Zi9QbGF0Zm9ybS5o
PgorI2luY2x1ZGUgPHd0Zi90ZXh0L0NTdHJpbmcuaD4KKworc3RhdGljIGJvb2wgZ0RyYWdNb2Rl
Oworc3RhdGljIGludCBnVGltZU9mZnNldCA9IDA7CisKK3N0YXRpYyBpbnQgZ0xhc3RNb3VzZVBv
c2l0aW9uWDsKK3N0YXRpYyBpbnQgZ0xhc3RNb3VzZVBvc2l0aW9uWTsKK3N0YXRpYyBpbnQgZ0xh
c3RDbGlja1Bvc2l0aW9uWDsKK3N0YXRpYyBpbnQgZ0xhc3RDbGlja1Bvc2l0aW9uWTsKK3N0YXRp
YyBpbnQgZ0xhc3RDbGlja1RpbWVPZmZzZXQ7CitzdGF0aWMgaW50IGdMYXN0Q2xpY2tCdXR0b247
CitzdGF0aWMgaW50IGdCdXR0b25DdXJyZW50bHlEb3duOworc3RhdGljIGludCBnQ2xpY2tDb3Vu
dDsKKworc3RhdGljIGNvbnN0IGZsb2F0IHpvb21NdWx0aXBsaWVyUmF0aW8gPSAxLjJmOworCisv
LyBLZXkgZXZlbnQgbG9jYXRpb24gY29kZSBkZWZpbmVkIGluIERPTSBMZXZlbCAzLgorZW51bSBL
ZXlMb2NhdGlvbkNvZGUgeworICAgIERvbUtleUxvY2F0aW9uU3RhbmRhcmQsCisgICAgRG9tS2V5
TG9jYXRpb25MZWZ0LAorICAgIERvbUtleUxvY2F0aW9uUmlnaHQsCisgICAgRG9tS2V5TG9jYXRp
b25OdW1wYWQKK307CisKK2VudW0gRXZhc0tleU1vZGlmaWVyIHsKKyAgICBFdmFzS2V5TW9kaWZp
ZXJOb25lICAgID0gMCwKKyAgICBFdmFzS2V5TW9kaWZpZXJDb250cm9sID0gMSA8PCAwLAorICAg
IEV2YXNLZXlNb2RpZmllclNoaWZ0ICAgPSAxIDw8IDEsCisgICAgRXZhc0tleU1vZGlmaWVyQWx0
ICAgICA9IDEgPDwgMiwKKyAgICBFdmFzS2V5TW9kaWZpZXJNZXRhICAgID0gMSA8PCAzCit9Owor
CitlbnVtIEV2YXNNb3VzZUJ1dHRvbiB7CisgICAgRXZhc01vdXNlQnV0dG9uTm9uZSwKKyAgICBF
dmFzTW91c2VCdXR0b25MZWZ0LAorICAgIEV2YXNNb3VzZUJ1dHRvbk1pZGRsZSwKKyAgICBFdmFz
TW91c2VCdXR0b25SaWdodAorfTsKKworZW51bSBFdmFzTW91c2VFdmVudCB7CisgICAgRXZhc01v
dXNlRXZlbnROb25lICAgICAgICA9IDAsCisgICAgRXZhc01vdXNlRXZlbnREb3duICAgICAgICA9
IDEgPDwgMCwKKyAgICBFdmFzTW91c2VFdmVudFVwICAgICAgICAgID0gMSA8PCAxLAorICAgIEV2
YXNNb3VzZUV2ZW50TW92ZSAgICAgICAgPSAxIDw8IDIsCisgICAgRXZhc01vdXNlRXZlbnRTY3Jv
bGxVcCAgICA9IDEgPDwgMywKKyAgICBFdmFzTW91c2VFdmVudFNjcm9sbERvd24gID0gMSA8PCA0
LAorICAgIEV2YXNNb3VzZUV2ZW50U2Nyb2xsTGVmdCAgPSAxIDw8IDUsCisgICAgRXZhc01vdXNl
RXZlbnRTY3JvbGxSaWdodCA9IDEgPDwgNiwKKyAgICBFdmFzTW91c2VFdmVudENsaWNrICAgICAg
ID0gRXZhc01vdXNlRXZlbnRNb3ZlIHwgRXZhc01vdXNlRXZlbnREb3duIHwgRXZhc01vdXNlRXZl
bnRVcCwKK307CisKK3N0YXRpYyB2b2lkIHNldEV2YXNNb2RpZmllcnMoRXZhcyogZXZhcywgRXZh
c0tleU1vZGlmaWVyIG1vZGlmaWVycykKK3sKKyAgICBzdGF0aWMgY29uc3QgY2hhciogbW9kaWZp
ZXJOYW1lc1tdID0geyAiQ29udHJvbCIsICJTaGlmdCIsICJBbHQiLCAiU3VwZXIiIH07CisgICAg
Zm9yICh1bnNpZ25lZCBtb2RpZmllciA9IDA7IG1vZGlmaWVyIDwgNDsgKyttb2RpZmllcikgewor
ICAgICAgICBpZiAobW9kaWZpZXJzICYgKDEgPDwgbW9kaWZpZXIpKQorICAgICAgICAgICAgZXZh
c19rZXlfbW9kaWZpZXJfb24oZXZhcywgbW9kaWZpZXJOYW1lc1ttb2RpZmllcl0pOworICAgICAg
ICBlbHNlCisgICAgICAgICAgICBldmFzX2tleV9tb2RpZmllcl9vZmYoZXZhcywgbW9kaWZpZXJO
YW1lc1ttb2RpZmllcl0pOworICAgIH0KK30KKworc3RhdGljIEV2YXNNb3VzZUJ1dHRvbiB0cmFu
c2xhdGVNb3VzZUJ1dHRvbk51bWJlcihpbnQgZXZlbnRTZW5kZXJCdXR0b25OdW1iZXIpCit7Cisg
ICAgc3RhdGljIGNvbnN0IEV2YXNNb3VzZUJ1dHRvbiB0cmFuc2xhdGlvblRhYmxlW10gPSB7Cisg
ICAgICAgIEV2YXNNb3VzZUJ1dHRvbkxlZnQsCisgICAgICAgIEV2YXNNb3VzZUJ1dHRvbk1pZGRs
ZSwKKyAgICAgICAgRXZhc01vdXNlQnV0dG9uUmlnaHQsCisgICAgICAgIEV2YXNNb3VzZUJ1dHRv
bk1pZGRsZSAvLyBmYXN0L2V2ZW50cy9tb3VzZS1jbGljay1ldmVudHMgZXhwZWN0cyB0aGUgNHRo
IGJ1dHRvbiB0byBiZSB0cmVhdGVkIGFzIHRoZSBtaWRkbGUgYnV0dG9uCisgICAgfTsKKyAgICBz
dGF0aWMgY29uc3QgdW5zaWduZWQgdHJhbnNsYXRpb25UYWJsZVNpemUgPSBzaXplb2YodHJhbnNs
YXRpb25UYWJsZSkgLyBzaXplb2YodHJhbnNsYXRpb25UYWJsZVswXSk7CisKKyAgICBpZiAoZXZl
bnRTZW5kZXJCdXR0b25OdW1iZXIgPCB0cmFuc2xhdGlvblRhYmxlU2l6ZSkKKyAgICAgICAgcmV0
dXJuIHRyYW5zbGF0aW9uVGFibGVbZXZlbnRTZW5kZXJCdXR0b25OdW1iZXJdOworCisgICAgcmV0
dXJuIEV2YXNNb3VzZUJ1dHRvbkxlZnQ7Cit9CisKK3N0YXRpYyBib29sIHNlbmRNb3VzZUV2ZW50
KEV2YXMqIGV2YXMsIEV2YXNNb3VzZUV2ZW50IGV2ZW50LCBpbnQgYnV0dG9uTnVtYmVyLCBFdmFz
S2V5TW9kaWZpZXIgbW9kaWZpZXJzKQoreworICAgIHVuc2lnbmVkIHRpbWVTdGFtcCA9IDA7CisK
KyAgICBzZXRFdmFzTW9kaWZpZXJzKGV2YXMsIG1vZGlmaWVycyk7CisgICAgaWYgKGV2ZW50ICYg
RXZhc01vdXNlRXZlbnRNb3ZlKQorICAgICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2VfbW92ZShl
dmFzLCBnTGFzdE1vdXNlUG9zaXRpb25YLCBnTGFzdE1vdXNlUG9zaXRpb25ZLCB0aW1lU3RhbXAr
KywgMCk7CisgICAgaWYgKGV2ZW50ICYgRXZhc01vdXNlRXZlbnREb3duKQorICAgICAgICBldmFz
X2V2ZW50X2ZlZWRfbW91c2VfZG93bihldmFzLCBidXR0b25OdW1iZXIsIEVWQVNfQlVUVE9OX05P
TkUsIHRpbWVTdGFtcCsrLCAwKTsKKyAgICBpZiAoZXZlbnQgJiBFdmFzTW91c2VFdmVudFVwKQor
ICAgICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2VfdXAoZXZhcywgYnV0dG9uTnVtYmVyLCBFVkFT
X0JVVFRPTl9OT05FLCB0aW1lU3RhbXArKywgMCk7CisKKyAgICBjb25zdCBib29sIGhvcml6b250
YWwgPSAhIShldmVudCAmIEV2YXNNb3VzZUV2ZW50U2Nyb2xsTGVmdCB8IGV2ZW50ICYgRXZhc01v
dXNlRXZlbnRTY3JvbGxSaWdodCk7CisgICAgY29uc3QgYm9vbCB2ZXJ0aWNhbCA9ICEhKGV2ZW50
ICYgRXZhc01vdXNlRXZlbnRTY3JvbGxVcCB8IGV2ZW50ICYgRXZhc01vdXNlRXZlbnRTY3JvbGxE
b3duKTsKKyAgICBpZiAodmVydGljYWwgJiYgaG9yaXpvbnRhbCkgeworICAgICAgICBldmFzX2V2
ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywgMCwgKGV2ZW50ICYgRXZhc01vdXNlRXZlbnRTY3Jv
bGxVcCkgPyAxMCA6IC0xMCwgdGltZVN0YW1wLCAwKTsKKyAgICAgICAgZXZhc19ldmVudF9mZWVk
X21vdXNlX3doZWVsKGV2YXMsIDEsIChldmVudCAmIEV2YXNNb3VzZUV2ZW50U2Nyb2xsTGVmdCkg
PyAxMCA6IC0xMCwgdGltZVN0YW1wLCAwKTsKKyAgICB9IGVsc2UgaWYgKHZlcnRpY2FsKQorICAg
ICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywgMCwgKGV2ZW50ICYgRXZhc01v
dXNlRXZlbnRTY3JvbGxVcCkgPyAxMCA6IC0xMCwgdGltZVN0YW1wLCAwKTsKKyAgICBlbHNlIGlm
IChob3Jpem9udGFsKQorICAgICAgICBldmFzX2V2ZW50X2ZlZWRfbW91c2Vfd2hlZWwoZXZhcywg
MSwgKGV2ZW50ICYgRXZhc01vdXNlRXZlbnRTY3JvbGxMZWZ0KSA/IDEwIDogLTEwLCB0aW1lU3Rh
bXAsIDApOworCisgICAgc2V0RXZhc01vZGlmaWVycyhldmFzLCBFdmFzS2V5TW9kaWZpZXJOb25l
KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgRWluYV9Cb29sIHNlbmRDbGljayh2
b2lkKikKK3sKKyAgICByZXR1cm4gISFzZW5kTW91c2VFdmVudChldmFzX29iamVjdF9ldmFzX2dl
dChtYWluRnJhbWUpLCBFdmFzTW91c2VFdmVudENsaWNrLCBFdmFzTW91c2VCdXR0b25MZWZ0LCBF
dmFzS2V5TW9kaWZpZXJOb25lKTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgc2NoZWR1bGVBc3lu
Y2hyb25vdXNDbGlja0NhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBm
dW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNv
bnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAg
ICBlY29yZV9pZGxlcl9hZGQoc2VuZENsaWNrLCAwKTsKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VV
bmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZUNsaWNrQ291bnQoaW50
IGJ1dHRvbikKK3sKKyAgICBpZiAoZ0xhc3RDbGlja1Bvc2l0aW9uWCAhPSBnTGFzdE1vdXNlUG9z
aXRpb25YCisgICAgICAgIHx8IGdMYXN0Q2xpY2tQb3NpdGlvblkgIT0gZ0xhc3RNb3VzZVBvc2l0
aW9uWQorICAgICAgICB8fCBnTGFzdENsaWNrQnV0dG9uICE9IGJ1dHRvbgorICAgICAgICB8fCBn
VGltZU9mZnNldCAtIGdMYXN0Q2xpY2tUaW1lT2Zmc2V0ID49IDEpCisgICAgICAgIGdDbGlja0Nv
dW50ID0gMTsKKyAgICBlbHNlCisgICAgICAgIGdDbGlja0NvdW50Kys7Cit9CisKK3N0YXRpYyBF
dmFzS2V5TW9kaWZpZXIgbW9kaWZpZXJGcm9tSlNWYWx1ZShKU0NvbnRleHRSZWYgY29udGV4dCwg
Y29uc3QgSlNWYWx1ZVJlZiB2YWx1ZSkKK3sKKyAgICBKU1JldGFpblB0cjxKU1N0cmluZ1JlZj4g
anNLZXlWYWx1ZShBZG9wdCwgSlNWYWx1ZVRvU3RyaW5nQ29weShjb250ZXh0LCB2YWx1ZSwgMCkp
OworCisgICAgaWYgKGVxdWFscyhqc0tleVZhbHVlLCAiY3RybEtleSIpIHx8IGVxdWFscyhqc0tl
eVZhbHVlLCAiYWRkU2VsZWN0aW9uS2V5IikpCisgICAgICAgIHJldHVybiBFdmFzS2V5TW9kaWZp
ZXJDb250cm9sOworICAgIGlmIChlcXVhbHMoanNLZXlWYWx1ZSwgInNoaWZ0S2V5IikgfHwgZXF1
YWxzKGpzS2V5VmFsdWUsICJyYW5nZVNlbGVjdGlvbktleSIpKQorICAgICAgICByZXR1cm4gRXZh
c0tleU1vZGlmaWVyU2hpZnQ7CisgICAgaWYgKGVxdWFscyhqc0tleVZhbHVlLCAiYWx0S2V5Iikp
CisgICAgICAgIHJldHVybiBFdmFzS2V5TW9kaWZpZXJBbHQ7CisgICAgaWYgKGVxdWFscyhqc0tl
eVZhbHVlLCAibWV0YUtleSIpKQorICAgICAgICByZXR1cm4gRXZhc0tleU1vZGlmaWVyTWV0YTsK
KworICAgIHJldHVybiBFdmFzS2V5TW9kaWZpZXJOb25lOworfQorCitzdGF0aWMgRXZhc0tleU1v
ZGlmaWVyIG1vZGlmaWVyc0Zyb21KU1ZhbHVlKEpTQ29udGV4dFJlZiBjb250ZXh0LCBjb25zdCBK
U1ZhbHVlUmVmIG1vZGlmaWVycykKK3sKKyAgICAvLyBUaGUgdmFsdWUgbWF5IGVpdGhlciBiZSBh
IHN0cmluZyB3aXRoIGEgc2luZ2xlIG1vZGlmaWVyIG9yIGFuIGFycmF5IG9mIG1vZGlmaWVycy4K
KyAgICBpZiAoSlNWYWx1ZUlzU3RyaW5nKGNvbnRleHQsIG1vZGlmaWVycykpCisgICAgICAgIHJl
dHVybiBtb2RpZmllckZyb21KU1ZhbHVlKGNvbnRleHQsIG1vZGlmaWVycyk7CisKKyAgICBKU09i
amVjdFJlZiBtb2RpZmllcnNBcnJheSA9IEpTVmFsdWVUb09iamVjdChjb250ZXh0LCBtb2RpZmll
cnMsIDApOworICAgIGlmICghbW9kaWZpZXJzQXJyYXkpCisgICAgICAgIHJldHVybiBFdmFzS2V5
TW9kaWZpZXJOb25lOworCisgICAgdW5zaWduZWQgbW9kaWZpZXIgPSAwOworICAgIGludCBtb2Rp
ZmllcnNDb3VudCA9IEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBKU09iamVjdEdldFByb3BlcnR5
KGNvbnRleHQsIG1vZGlmaWVyc0FycmF5LCBKU1N0cmluZ0NyZWF0ZVdpdGhVVEY4Q1N0cmluZygi
bGVuZ3RoIiksIDApLCAwKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1vZGlmaWVyc0NvdW50
OyArK2kpCisgICAgICAgIG1vZGlmaWVyIHw9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihtb2RpZmll
ckZyb21KU1ZhbHVlKGNvbnRleHQsIEpTT2JqZWN0R2V0UHJvcGVydHlBdEluZGV4KGNvbnRleHQs
IG1vZGlmaWVyc0FycmF5LCBpLCAwKSkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxFdmFzS2V5
TW9kaWZpZXI+KG1vZGlmaWVyKTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgbW91c2VEb3duQ2Fs
bGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVj
dFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBh
cmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIGludCBidXR0b24gPSAw
OworICAgIGlmIChhcmd1bWVudENvdW50ID09IDEpIHsKKyAgICAgICAgYnV0dG9uID0gc3RhdGlj
X2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzBdLCBleGNlcHRp
b24pKTsKKworICAgICAgICBpZiAoZXhjZXB0aW9uICYmICpleGNlcHRpb24pCisgICAgICAgICAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisgICAgfQorCisgICAgYnV0
dG9uID0gdHJhbnNsYXRlTW91c2VCdXR0b25OdW1iZXIoYnV0dG9uKTsKKyAgICAvLyBJZiB0aGUg
c2FtZSBtb3VzZSBidXR0b24gaXMgYWxyZWFkeSBpbiB0aGUgZG93biBwb3NpdGlvbiBkb24ndCBz
ZW5kIGFub3RoZXIgZXZlbnQgYXMgaXQgbWF5IGNvbmZ1c2UgWHZmYi4KKyAgICBpZiAoZ0J1dHRv
bkN1cnJlbnRseURvd24gPT0gYnV0dG9uKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRl
ZmluZWQoY29udGV4dCk7CisKKyAgICB1cGRhdGVDbGlja0NvdW50KGJ1dHRvbik7CisKKyAgICBF
dmFzS2V5TW9kaWZpZXIgbW9kaWZpZXJzID0gYXJndW1lbnRDb3VudCA+PSAyID8gbW9kaWZpZXJz
RnJvbUpTVmFsdWUoY29udGV4dCwgYXJndW1lbnRzWzFdKSA6IEV2YXNLZXlNb2RpZmllck5vbmU7
CisgICAgaWYgKCFzZW5kTW91c2VFdmVudChldmFzX29iamVjdF9ldmFzX2dldChtYWluRnJhbWUp
LCBFdmFzTW91c2VFdmVudERvd24sIGJ1dHRvbiwgbW9kaWZpZXJzKSkKKyAgICAgICAgcmV0dXJu
IEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgZ0J1dHRvbkN1cnJlbnRseURv
d24gPSBidXR0b247CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOwor
fQorCitzdGF0aWMgSlNWYWx1ZVJlZiBtb3VzZVVwQ2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRl
eHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3Qg
YXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiog
ZXhjZXB0aW9uKQoreworICAgIGludCBidXR0b24gPSAwOworICAgIGlmIChhcmd1bWVudENvdW50
ID09IDEpIHsKKyAgICAgICAgYnV0dG9uID0gc3RhdGljX2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1i
ZXIoY29udGV4dCwgYXJndW1lbnRzWzBdLCBleGNlcHRpb24pKTsKKyAgICAgICAgaWYgKGV4Y2Vw
dGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZp
bmVkKGNvbnRleHQpOworICAgIH0KKworICAgIGdMYXN0Q2xpY2tQb3NpdGlvblggPSBnTGFzdE1v
dXNlUG9zaXRpb25YOworICAgIGdMYXN0Q2xpY2tQb3NpdGlvblkgPSBnTGFzdE1vdXNlUG9zaXRp
b25ZOworICAgIGdMYXN0Q2xpY2tCdXR0b24gPSBnQnV0dG9uQ3VycmVudGx5RG93bjsKKyAgICBn
TGFzdENsaWNrVGltZU9mZnNldCA9IGdUaW1lT2Zmc2V0OworICAgIGdCdXR0b25DdXJyZW50bHlE
b3duID0gMDsKKworICAgIEV2YXNLZXlNb2RpZmllciBtb2RpZmllcnMgPSBhcmd1bWVudENvdW50
ID49IDIgPyBtb2RpZmllcnNGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmd1bWVudHNbMV0pIDogRXZh
c0tleU1vZGlmaWVyTm9uZTsKKyAgICBzZW5kTW91c2VFdmVudChldmFzX29iamVjdF9ldmFzX2dl
dChtYWluRnJhbWUpLCBFdmFzTW91c2VFdmVudFVwLCB0cmFuc2xhdGVNb3VzZUJ1dHRvbk51bWJl
cihidXR0b24pLCBtb2RpZmllcnMpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChj
b250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgbW91c2VNb3ZlVG9DYWxsYmFjayhKU0Nv
bnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNP
YmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1td
LCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAyKQor
ICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBnTGFz
dE1vdXNlUG9zaXRpb25YID0gc3RhdGljX2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIoY29udGV4
dCwgYXJndW1lbnRzWzBdLCBleGNlcHRpb24pKTsKKyAgICBpZiAoZXhjZXB0aW9uICYmICpleGNl
cHRpb24pCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAg
ICBnTGFzdE1vdXNlUG9zaXRpb25ZID0gc3RhdGljX2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIo
Y29udGV4dCwgYXJndW1lbnRzWzFdLCBleGNlcHRpb24pKTsKKyAgICBpZiAoZXhjZXB0aW9uICYm
ICpleGNlcHRpb24pCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0
KTsKKworICAgIHNlbmRNb3VzZUV2ZW50KGV2YXNfb2JqZWN0X2V2YXNfZ2V0KG1haW5GcmFtZSks
IEV2YXNNb3VzZUV2ZW50TW92ZSwgRXZhc01vdXNlQnV0dG9uTm9uZSwgRXZhc0tleU1vZGlmaWVy
Tm9uZSk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitz
dGF0aWMgRXZhc01vdXNlRXZlbnQgZXZhc01vdXNlRXZlbnRGcm9tSG9yaXpvbnRhbEFuZFZlcnRp
Y2FsT2Zmc2V0cyhpbnQgaG9yaXpvbnRhbE9mZnNldCwgaW50IHZlcnRpY2FsT2Zmc2V0KQorewor
ICAgIHVuc2lnbmVkIG1vdXNlRXZlbnQgPSAwOworCisgICAgaWYgKHZlcnRpY2FsT2Zmc2V0ID4g
MCkKKyAgICAgICAgbW91c2VFdmVudCB8PSBFdmFzTW91c2VFdmVudFNjcm9sbFVwOworICAgIGVs
c2UgaWYgKHZlcnRpY2FsT2Zmc2V0IDwgMCkKKyAgICAgICAgbW91c2VFdmVudCB8PSBFdmFzTW91
c2VFdmVudFNjcm9sbERvd247CisKKyAgICBpZiAoaG9yaXpvbnRhbE9mZnNldCA+IDApCisgICAg
ICAgIG1vdXNlRXZlbnQgfD0gRXZhc01vdXNlRXZlbnRTY3JvbGxSaWdodDsKKyAgICBlbHNlIGlm
IChob3Jpem9udGFsT2Zmc2V0IDwgMCkKKyAgICAgICAgbW91c2VFdmVudCB8PSBFdmFzTW91c2VF
dmVudFNjcm9sbExlZnQ7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RXZhc01vdXNlRXZlbnQ+
KG1vdXNlRXZlbnQpOworfQorCitzdGF0aWMgSlNWYWx1ZVJlZiBtb3VzZVNjcm9sbEJ5Q2FsbGJh
Y2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpTT2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJl
ZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1lbnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1
bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0aW9uKQoreworICAgIGlmIChhcmd1bWVudENvdW50
IDwgMikKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisg
ICAgaW50IGhvcml6b250YWwgPSAoaW50KUpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1bWVu
dHNbMF0sIGV4Y2VwdGlvbik7CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAg
ICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisgICAgaW50IHZlcnRp
Y2FsID0gKGludClKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzFdLCBleGNlcHRp
b24pOworICAgIGlmIChleGNlcHRpb24gJiYgKmV4Y2VwdGlvbikKKyAgICAgICAgcmV0dXJuIEpT
VmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgc2VuZE1vdXNlRXZlbnQoZXZhc19v
YmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgZXZhc01vdXNlRXZlbnRGcm9tSG9yaXpvbnRhbEFu
ZFZlcnRpY2FsT2Zmc2V0cyhob3Jpem9udGFsLCB2ZXJ0aWNhbCksIEV2YXNNb3VzZUJ1dHRvbk5v
bmUsIEV2YXNLZXlNb2RpZmllck5vbmUpOworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5l
ZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgY29udGludW91c01vdXNlU2Nyb2xs
QnlDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpT
T2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVl
UmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgcmV0dXJuIEpT
VmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgY29uc3QgY2hhcioga2V5
UGFkTmFtZUZyb21KU1ZhbHVlKEpTU3RyaW5nUmVmIGNoYXJhY3RlcikKK3sKKyAgICBpZiAoZXF1
YWxzKGNoYXJhY3RlciwgImxlZnRBcnJvdyIpKQorICAgICAgICByZXR1cm4gIktQX0xlZnQiOwor
ICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAicmlnaHRBcnJvdyIpKQorICAgICAgICByZXR1cm4g
IktQX1JpZ2h0IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgInVwQXJyb3ciKSkKKyAgICAg
ICAgcmV0dXJuICJLUF9VcCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJkb3duQXJyb3ci
KSkKKyAgICAgICAgcmV0dXJuICJLUF9Eb3duIjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3Rlciwg
InBhZ2VVcCIpKQorICAgICAgICByZXR1cm4gIktQX1BhZ2VfVXAiOworICAgIGlmIChlcXVhbHMo
Y2hhcmFjdGVyLCAicGFnZURvd24iKSkKKyAgICAgICAgcmV0dXJuICJLUF9QYWdlX0Rvd24iOwor
ICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiaG9tZSIpKQorICAgICAgICByZXR1cm4gIktQX0hv
bWUiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiZW5kIikpCisgICAgICAgIHJldHVybiAi
S1BfRW5kIjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgImluc2VydCIpKQorICAgICAgICBy
ZXR1cm4gIktQX0luc2VydCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJkZWxldGUiKSkK
KyAgICAgICAgcmV0dXJuICJLUF9EZWxldGUiOworCisgICAgLy8gSWYgd2UgZ2V0IHNvbWUgb3Ro
ZXIga2V5IHNwZWNpZmllZCB3aXRoIHRoZSBudW1wYWQgbG9jYXRpb24sCisgICAgLy8gY3Jhc2gg
aGVyZSwgc28gd2UgYWRkIGl0IHNvb25lciByYXRoZXIgdGhhbiBsYXRlci4KKyAgICBmcHJpbnRm
KHN0ZGVyciwgIm51bWVyaWMgcGFkIGtleSBub3QgaGFuZGxlZDogJXNcbiIsIGNoYXJhY3Rlci0+
dXN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFib3J0KCk7Cit9CisKK3N0YXRpYyBjb25z
dCBjaGFyKiBrZXlOYW1lRnJvbUpTVmFsdWUoSlNTdHJpbmdSZWYgY2hhcmFjdGVyKQoreworICAg
IGlmIChlcXVhbHMoY2hhcmFjdGVyLCAibGVmdEFycm93IikpCisgICAgICAgIHJldHVybiAiTGVm
dCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJyaWdodEFycm93IikpCisgICAgICAgIHJl
dHVybiAiUmlnaHQiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAidXBBcnJvdyIpKQorICAg
ICAgICByZXR1cm4gIlVwIjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgImRvd25BcnJvdyIp
KQorICAgICAgICByZXR1cm4gIkRvd24iOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAicGFn
ZVVwIikpCisgICAgICAgIHJldHVybiAiUGFnZV9VcCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0
ZXIsICJwYWdlRG93biIpKQorICAgICAgICByZXR1cm4gIlBhZ2VfRG93biI7CisgICAgaWYgKGVx
dWFscyhjaGFyYWN0ZXIsICJob21lIikpCisgICAgICAgIHJldHVybiAiSG9tZSI7CisgICAgaWYg
KGVxdWFscyhjaGFyYWN0ZXIsICJlbmQiKSkKKyAgICAgICAgcmV0dXJuICJFbmQiOworICAgIGlm
IChlcXVhbHMoY2hhcmFjdGVyLCAiaW5zZXJ0IikpCisgICAgICAgIHJldHVybiAiSW5zZXJ0IjsK
KyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgImRlbGV0ZSIpKQorICAgICAgICByZXR1cm4gIkRl
bGV0ZSI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJwcmludFNjcmVlbiIpKQorICAgICAg
ICByZXR1cm4gIlByaW50IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgIm1lbnUiKSkKKyAg
ICAgICAgcmV0dXJuICJNZW51IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgIkYxIikpCisg
ICAgICAgIHJldHVybiAiRjEiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiRjIiKSkKKyAg
ICAgICAgcmV0dXJuICJGMiI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJGMyIpKQorICAg
ICAgICByZXR1cm4gIkYzIjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgIkY0IikpCisgICAg
ICAgIHJldHVybiAiRjQiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiRjUiKSkKKyAgICAg
ICAgcmV0dXJuICJGNSI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJGNiIpKQorICAgICAg
ICByZXR1cm4gIkY2IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgIkY3IikpCisgICAgICAg
IHJldHVybiAiRjciOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiRjgiKSkKKyAgICAgICAg
cmV0dXJuICJGOCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJGOSIpKQorICAgICAgICBy
ZXR1cm4gIkY5IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgIkYxMCIpKQorICAgICAgICBy
ZXR1cm4gIkYxMCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJGMTEiKSkKKyAgICAgICAg
cmV0dXJuICJGMTEiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiRjEyIikpCisgICAgICAg
IHJldHVybiAiRjEyIjsKKworICAgIGludCBjaGFyQ29kZSA9IEpTU3RyaW5nR2V0Q2hhcmFjdGVy
c1B0cihjaGFyYWN0ZXIpWzBdOworICAgIGlmIChjaGFyQ29kZSA9PSAnXG4nIHx8IGNoYXJDb2Rl
ID09ICdccicpCisgICAgICAgIHJldHVybiAiUmV0dXJuIjsKKyAgICBpZiAoY2hhckNvZGUgPT0g
J1x0JykKKyAgICAgICAgcmV0dXJuICJUYWIiOworICAgIGlmIChjaGFyQ29kZSA9PSAnXHg4JykK
KyAgICAgICAgcmV0dXJuICJCYWNrU3BhY2UiOworCisgICAgLy8gRklYTUU6IFNlZSBvdGhlciBp
bXBsZW1lbnRhdGlvbnMgYW5kIG9idGFpbiB0aGUga2V5IG5hbWUgYnkKKyAgICAvLyB0aGUgVW5p
Y29kZSBjaGFyYWN0ZXIgY29kZS4KKyAgICBmcHJpbnRmKHN0ZGVyciwgImtleSBub3QgaGFuZGxl
ZDogJXNcbiIsIGNoYXJhY3Rlci0+dXN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFib3J0
KCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIGtleURvd25DYWxsYmFjayhKU0NvbnRleHRSZWYg
Y29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNp
emVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVl
UmVmKiBleGNlcHRpb24pCit7CisgICAgRXZhc19PYmplY3QqIHZpZXcgPSBld2tfZnJhbWVfdmll
d19nZXQobWFpbkZyYW1lKTsKKyAgICBpZiAoIXZpZXcpCisgICAgICAgIHJldHVybiBKU1ZhbHVl
TWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGlmIChhcmd1bWVudENvdW50IDwgMSkKKyAg
ICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgLy8gaGFu
ZGxlIGxvY2F0aW9uIGFyZ3VtZW50LgorICAgIGludCBsb2NhdGlvbiA9IERvbUtleUxvY2F0aW9u
U3RhbmRhcmQ7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPiAyKQorICAgICAgICBsb2NhdGlvbiA9
IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1syXSwg
ZXhjZXB0aW9uKSk7CisKKyAgICBKU1JldGFpblB0cjxKU1N0cmluZ1JlZj4gY2hhcmFjdGVyKEFk
b3B0LCBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9u
KSk7CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1cm4gSlNW
YWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICAvLyBzZW5kIHRoZSBldmVudAorICAg
IEV2YXMqIGV2YXMgPSBldmFzX29iamVjdF9ldmFzX2dldCh2aWV3KTsKKyAgICBpZiAoYXJndW1l
bnRDb3VudCA+PSAyKQorICAgICAgICBzZXRFdmFzTW9kaWZpZXJzKGV2YXMsIG1vZGlmaWVyc0Zy
b21KU1ZhbHVlKGNvbnRleHQsIGFyZ3VtZW50c1sxXSkpOworCisgICAgY29uc3QgY2hhcioga2V5
TmFtZSA9IChsb2NhdGlvbiA9PSBEb21LZXlMb2NhdGlvbk51bXBhZCkgPyBrZXlQYWROYW1lRnJv
bUpTVmFsdWUoY2hhcmFjdGVyLmdldCgpKSA6IGtleU5hbWVGcm9tSlNWYWx1ZShjaGFyYWN0ZXIu
Z2V0KCkpOworICAgIGV2YXNfZXZlbnRfZmVlZF9rZXlfZG93bihldmFzLCBrZXlOYW1lLCBrZXlO
YW1lLCAwLCAwLCAwLCAwKTsKKyAgICBldmFzX2V2ZW50X2ZlZWRfa2V5X3VwKGV2YXMsIGtleU5h
bWUsIGtleU5hbWUsIDAsIDAsIDEsIDApOworCisgICAgc2V0RXZhc01vZGlmaWVycyhldmFzLCBF
dmFzS2V5TW9kaWZpZXJOb25lKTsKKworICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChj
b250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgc2NhbGVQYWdlQnlDYWxsYmFjayhKU0Nv
bnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNP
YmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1td
LCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPCAzKQor
ICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBFdmFz
X09iamVjdCogdmlldyA9IGV3a19mcmFtZV92aWV3X2dldChtYWluRnJhbWUpOworICAgIGlmICgh
dmlldykKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisg
ICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRz
WzBdLCBleGNlcHRpb24pOworICAgIGZsb2F0IHggPSBKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwg
YXJndW1lbnRzWzFdLCBleGNlcHRpb24pOworICAgIGZsb2F0IHkgPSBKU1ZhbHVlVG9OdW1iZXIo
Y29udGV4dCwgYXJndW1lbnRzWzJdLCBleGNlcHRpb24pOworICAgIGV3a192aWV3X3BhZ2Vfc2Nh
bGUodmlldywgc2NhbGVGYWN0b3IsIHgsIHkpOworCisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5k
ZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNTdGF0aWNGdW5jdGlvbiBzdGF0aWNGdW5j
dGlvbnNbXSA9IHsKKyAgICB7ICJtb3VzZVNjcm9sbEJ5IiwgbW91c2VTY3JvbGxCeUNhbGxiYWNr
LCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250
RGVsZXRlIH0sCisgICAgeyAiY29udGludW91c01vdXNlU2Nyb2xsQnkiLCBjb250aW51b3VzTW91
c2VTY3JvbGxCeUNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJv
cGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAibW91c2VEb3duIiwgbW91c2VEb3du
Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJp
YnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJtb3VzZVVwIiwgbW91c2VVcENhbGxiYWNrLCBrSlNQ
cm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRl
IH0sCisgICAgeyAibW91c2VNb3ZlVG8iLCBtb3VzZU1vdmVUb0NhbGxiYWNrLCBrSlNQcm9wZXJ0
eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisg
ICAgeyAia2V5RG93biIsIGtleURvd25DYWxsYmFjaywga0pTUHJvcGVydHlBdHRyaWJ1dGVSZWFk
T25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9LAorICAgIHsgInNjaGVkdWxl
QXN5bmNocm9ub3VzQ2xpY2siLCBzY2hlZHVsZUFzeW5jaHJvbm91c0NsaWNrQ2FsbGJhY2ssIGtK
U1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxl
dGUgfSwKKyAgICB7ICJzY2FsZVBhZ2VCeSIsIHNjYWxlUGFnZUJ5Q2FsbGJhY2ssIGtKU1Byb3Bl
cnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwK
KyAgICB7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIEpTU3RhdGljVmFsdWUgc3RhdGljVmFsdWVz
W10gPSB7CisgICAgeyAwLCAwLCAwLCAwIH0KK307CisKK3N0YXRpYyBKU0NsYXNzUmVmIGdldENs
YXNzKEpTQ29udGV4dFJlZiBjb250ZXh0KQoreworICAgIHN0YXRpYyBKU0NsYXNzUmVmIGV2ZW50
U2VuZGVyQ2xhc3MgPSAwOworCisgICAgaWYgKCFldmVudFNlbmRlckNsYXNzKSB7CisgICAgICAg
IEpTQ2xhc3NEZWZpbml0aW9uIGNsYXNzRGVmaW5pdGlvbiA9IHsKKyAgICAgICAgICAgICAgICAw
LCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAs
IDAsIDAsIDB9OworICAgICAgICBjbGFzc0RlZmluaXRpb24uc3RhdGljRnVuY3Rpb25zID0gc3Rh
dGljRnVuY3Rpb25zOworICAgICAgICBjbGFzc0RlZmluaXRpb24uc3RhdGljVmFsdWVzID0gc3Rh
dGljVmFsdWVzOworCisgICAgICAgIGV2ZW50U2VuZGVyQ2xhc3MgPSBKU0NsYXNzQ3JlYXRlKCZj
bGFzc0RlZmluaXRpb24pOworICAgIH0KKworICAgIHJldHVybiBldmVudFNlbmRlckNsYXNzOwor
fQorCitKU09iamVjdFJlZiBtYWtlRXZlbnRTZW5kZXIoSlNDb250ZXh0UmVmIGNvbnRleHQsIGJv
b2wgaXNUb3BGcmFtZSkKK3sKKyAgICBpZiAoaXNUb3BGcmFtZSkgeworICAgICAgICBnRHJhZ01v
ZGUgPSB0cnVlOworCisgICAgICAgIC8vIEZseSBmb3J3YXJkIGluIHRpbWUgb25lIHNlY29uZCB3
aGVuIHRoZSBtYWluIGZyYW1lIGxvYWRzLiBUaGlzIHdpbGwKKyAgICAgICAgLy8gZW5zdXJlIHRo
YXQgd2hlbiBhIHRlc3QgYmVnaW5zIGNsaWNraW5nIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzCisg
ICAgICAgIC8vIGEgcHJldmlvdXMgdGVzdCwgdGhvc2UgY2xpY2tzIHdvbid0IGJlIGludGVycHJl
dGVkIGFzIGNvbnRpbnVhdGlvbnMKKyAgICAgICAgLy8gb2YgdGhlIHByZXZpb3VzIHRlc3QncyBj
bGljayBzZXF1ZW5jZXMuCisgICAgICAgIGdUaW1lT2Zmc2V0ICs9IDEwMDA7CisKKyAgICAgICAg
Z0xhc3RNb3VzZVBvc2l0aW9uWCA9IGdMYXN0TW91c2VQb3NpdGlvblkgPSAwOworICAgICAgICBn
TGFzdENsaWNrUG9zaXRpb25YID0gZ0xhc3RDbGlja1Bvc2l0aW9uWSA9IDA7CisgICAgICAgIGdM
YXN0Q2xpY2tUaW1lT2Zmc2V0ID0gMDsKKyAgICAgICAgZ0xhc3RDbGlja0J1dHRvbiA9IDA7Cisg
ICAgICAgIGdCdXR0b25DdXJyZW50bHlEb3duID0gMDsKKyAgICAgICAgZ0NsaWNrQ291bnQgPSAw
OworICAgIH0KKworICAgIHJldHVybiBKU09iamVjdE1ha2UoY29udGV4dCwgZ2V0Q2xhc3MoY29u
dGV4dCksIDApOworfQpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0V2ZW50
U2VuZGVyLmggYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuaApuZXcgZmls
ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwLi4yMTZiOTQ3ZDIzYWIxMDg0YjFjYTA0ZWUyYzg2NjJiYTM4MWVkZGI0Ci0tLSAvZGV2L251
bGwKKysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmgKQEAgLTAsMCAr
MSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBsZSBJbmMuICBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0
aGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVtYmVkZGVkIFN5c3RlbXMKKyAq
IENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxl
Iikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMg
c29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9S
UyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUK
KyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lmbmRlZiBFdmVudFNlbmRl
cl9oCisjZGVmaW5lIEV2ZW50U2VuZGVyX2gKKwordHlwZWRlZiBjb25zdCBzdHJ1Y3QgT3BhcXVl
SlNDb250ZXh0KiBKU0NvbnRleHRSZWY7Cit0eXBlZGVmIHN0cnVjdCBPcGFxdWVKU1ZhbHVlKiBK
U09iamVjdFJlZjsKKworSlNPYmplY3RSZWYgbWFrZUV2ZW50U2VuZGVyKEpTQ29udGV4dFJlZiwg
Ym9vbCk7CisKKyNlbmRpZiAvLyBFdmVudFNlbmRlcl9oCmRpZmYgLS1naXQgYS9Ub29scy9EdW1w
UmVuZGVyVHJlZS9lZmwvSlNTdHJpbmdVdGlscy5jcHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9l
ZmwvSlNTdHJpbmdVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2Q5NGViNjQ2ZTYyN2E5NzI5MjBiZDQx
NDhjZjgwZDNhODk1MzdkMAotLS0gL2Rldi9udWxsCisrKyBiL1Rvb2xzL0R1bXBSZW5kZXJUcmVl
L2VmbC9KU1N0cmluZ1V0aWxzLmNwcApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgor
I2luY2x1ZGUgIkpTU3RyaW5nVXRpbHMuaCIKKworYm9vbCBlcXVhbHMoSlNTdHJpbmdSZWYganNT
dHJpbmcsIGNvbnN0IGNoYXIqIGNTdHJpbmcpCit7CisgICAgcmV0dXJuIEpTU3RyaW5nSXNFcXVh
bFRvVVRGOENTdHJpbmcoanNTdHJpbmcsIGNTdHJpbmcpOworfQorCitib29sIGVxdWFscyhKU1Jl
dGFpblB0cjxKU1N0cmluZ1JlZj4ganNTdHJpbmcsIGNvbnN0IGNoYXIqIGNTdHJpbmcpCit7Cisg
ICAgcmV0dXJuIGVxdWFscyhqc1N0cmluZy5nZXQoKSwgY1N0cmluZyk7Cit9CmRpZmYgLS1naXQg
YS9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvSlNTdHJpbmdVdGlscy5oIGIvVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0pTU3RyaW5nVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iNDJiNWM5N2U5ZWRiYWU4
M2RjMTg3ODRhYTlkNTUzNzczMzY3MGVmCi0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0pTU3RyaW5nVXRpbHMuaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDExIFByb0ZVU0lPTiBFbWJlZGRlZCBTeXN0ZW1zCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcworICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisg
KiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworCisjaWZuZGVmIEpTU3Ry
aW5nVXRpbHNfaAorI2RlZmluZSBKU1N0cmluZ1V0aWxzX2gKKworI2luY2x1ZGUgPEphdmFTY3Jp
cHRDb3JlL0pTUmV0YWluUHRyLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSlNTdHJpbmdS
ZWYuaD4KKworYm9vbCBlcXVhbHMoSlNTdHJpbmdSZWYsIGNvbnN0IGNoYXIqKTsKK2Jvb2wgZXF1
YWxzKEpTUmV0YWluUHRyPEpTU3RyaW5nUmVmPiwgY29uc3QgY2hhciopOworCisjZW5kaWYgLy8g
SlNTdHJpbmdVdGlsc19oCisK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>98717</attachid>
            <date>2011-06-27 06:59:56 -0700</date>
            <delta_ts>2011-06-27 08:11:10 -0700</delta_ts>
            <desc>New patch following Kent&apos;s suggestions</desc>
            <filename>bug-61962-20110627110319.patch</filename>
            <type>text/plain</type>
            <size>23910</size>
            <attacher name="Raphael Kubo da Costa (:rakuco)">rakuco</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogODk4MTUKZGlmZiAtLWdpdCBhL1Rvb2xzL0NoYW5nZUxvZyBi
L1Rvb2xzL0NoYW5nZUxvZwppbmRleCA2NTYxZGJhYmUyNjM0OThkY2EzZGQ0OThlZTBhODA0YzZi
YzRiNGQwLi4zYTgxNjIyNzhhOGEwMDg0YTNmZTU2MDk3N2ZlZGE4Y2M1NDZlNzQxIDEwMDY0NAot
LS0gYS9Ub29scy9DaGFuZ2VMb2cKKysrIGIvVG9vbHMvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMzYg
QEAKKzIwMTEtMDYtMjcgIExlYW5kcm8gUGVyZWlyYSAgPGxlYW5kcm9AcHJvZnVzaW9uLm1vYmk+
CisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgW0VGTF0g
QWRkIGFuIEV2ZW50U2VuZGVyIGltcGxlbWVudGF0aW9uIHRvIEVGTCdzIER1bXBSZW5kZXJUcmVl
IGFsb25nCisgICAgICAgIHdpdGggc3VwcG9ydCBmaWxlcy4KKyAgICAgICAgQnVpbGQgc3lzdGVt
IGNoYW5nZXMgd2lsbCBiZSBtYWRlIGFzIHNvb24gYXMgdGhlIHdob2xlIER1bXBSZW5kZXJUcmVl
CisgICAgICAgIGlzIHVwc3RyZWFtZWQuCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD02MTk2MgorCisgICAgICAgICogRHVtcFJlbmRlclRyZWUvZWZsL0V2
ZW50U2VuZGVyLmNwcDogQWRkZWQuCisgICAgICAgIChzZXRFdmFzTW9kaWZpZXJzKToKKyAgICAg
ICAgKHRyYW5zbGF0ZU1vdXNlQnV0dG9uTnVtYmVyKToKKyAgICAgICAgKHNlbmRNb3VzZUV2ZW50
KToKKyAgICAgICAgKHNlbmRDbGljayk6CisgICAgICAgIChzY2hlZHVsZUFzeW5jaHJvbm91c0Ns
aWNrQ2FsbGJhY2spOgorICAgICAgICAodXBkYXRlQ2xpY2tDb3VudCk6CisgICAgICAgIChtb2Rp
ZmllckZyb21KU1ZhbHVlKToKKyAgICAgICAgKG1vZGlmaWVyc0Zyb21KU1ZhbHVlKToKKyAgICAg
ICAgKG1vdXNlRG93bkNhbGxiYWNrKToKKyAgICAgICAgKG1vdXNlVXBDYWxsYmFjayk6CisgICAg
ICAgIChtb3VzZU1vdmVUb0NhbGxiYWNrKToKKyAgICAgICAgKGV2YXNNb3VzZUV2ZW50RnJvbUhv
cml6b250YWxBbmRWZXJ0aWNhbE9mZnNldHMpOgorICAgICAgICAobW91c2VTY3JvbGxCeUNhbGxi
YWNrKToKKyAgICAgICAgKGNvbnRpbnVvdXNNb3VzZVNjcm9sbEJ5Q2FsbGJhY2spOgorICAgICAg
ICAoa2V5UGFkTmFtZUZyb21KU1ZhbHVlKToKKyAgICAgICAgKGtleU5hbWVGcm9tSlNWYWx1ZSk6
CisgICAgICAgIChrZXlEb3duQ2FsbGJhY2spOgorICAgICAgICAoc2NhbGVQYWdlQnlDYWxsYmFj
ayk6CisgICAgICAgIChnZXRDbGFzcyk6CisgICAgICAgIChtYWtlRXZlbnRTZW5kZXIpOgorICAg
ICAgICAqIER1bXBSZW5kZXJUcmVlL2VmbC9FdmVudFNlbmRlci5oOiBBZGRlZC4KKwogMjAxMS0w
Ni0yNyAgRXJpYyBTZWlkZWwgIDxlcmljQHdlYmtpdC5vcmc+CiAKICAgICAgICAgUmV2aWV3ZWQg
YnkgQWRhbSBCYXJ0aC4KZGlmZiAtLWdpdCBhL1Rvb2xzL0R1bXBSZW5kZXJUcmVlL2VmbC9FdmVu
dFNlbmRlci5jcHAgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmVkZDBhODNkMThhYTZmNWVkZmJlODRkMTI5N2EwMThkYWZjMGUyNGEKLS0tIC9k
ZXYvbnVsbAorKysgYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRXZlbnRTZW5kZXIuY3BwCkBA
IC0wLDAgKzEsNTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3LCAyMDA4IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBaYW4gRG9iZXJz
ZWsgPHphbmRvYmVyc2VrQGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBIb2xnZXIg
SGFucyBQZXRlciBGcmV5dGhlcgorICogQ29weXJpZ2h0IChDKSAyMDEwIElnYWxpYSBTLkwuCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVtYmVkZGVkIFN5c3RlbXMKKyAqIENvcHly
aWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAz
LiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21wdXRlciwgSW5jLiAoIkFwcGxlIikgbm9y
IHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5k
b3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQKKyAqICAgICBmcm9tIHRoaXMgc29mdHdh
cmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBBTkQgSVRTIENPTlRSSUJVVE9SUyAiQVMg
SVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJ
U0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIE9SIElUUyBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorI2lu
Y2x1ZGUgIkV2ZW50U2VuZGVyLmgiCisKKyNpbmNsdWRlICJEdW1wUmVuZGVyVHJlZS5oIgorI2lu
Y2x1ZGUgIkpTU3RyaW5nVXRpbHMuaCIKKyNpbmNsdWRlICJOb3RJbXBsZW1lbnRlZC5oIgorI2lu
Y2x1ZGUgImV3a19wcml2YXRlLmgiCisjaW5jbHVkZSA8RVdlYktpdC5oPgorI2luY2x1ZGUgPEph
dmFTY3JpcHRDb3JlL0pTT2JqZWN0UmVmLmg+CisjaW5jbHVkZSA8SmF2YVNjcmlwdENvcmUvSlNS
ZXRhaW5QdHIuaD4KKyNpbmNsdWRlIDxKYXZhU2NyaXB0Q29yZS9KU1N0cmluZ1JlZi5oPgorI2lu
Y2x1ZGUgPEphdmFTY3JpcHRDb3JlL09wYXF1ZUpTU3RyaW5nLmg+CisjaW5jbHVkZSA8d3RmL0FT
Q0lJQ1R5cGUuaD4KKyNpbmNsdWRlIDx3dGYvUGxhdGZvcm0uaD4KKyNpbmNsdWRlIDx3dGYvdGV4
dC9DU3RyaW5nLmg+CisKK3N0YXRpYyBib29sIGdEcmFnTW9kZTsKK3N0YXRpYyBpbnQgZ1RpbWVP
ZmZzZXQgPSAwOworCitzdGF0aWMgaW50IGdMYXN0TW91c2VQb3NpdGlvblg7CitzdGF0aWMgaW50
IGdMYXN0TW91c2VQb3NpdGlvblk7CitzdGF0aWMgaW50IGdMYXN0Q2xpY2tQb3NpdGlvblg7Citz
dGF0aWMgaW50IGdMYXN0Q2xpY2tQb3NpdGlvblk7CitzdGF0aWMgaW50IGdMYXN0Q2xpY2tUaW1l
T2Zmc2V0Oworc3RhdGljIGludCBnTGFzdENsaWNrQnV0dG9uOworc3RhdGljIGludCBnQnV0dG9u
Q3VycmVudGx5RG93bjsKK3N0YXRpYyBpbnQgZ0NsaWNrQ291bnQ7CisKK3N0YXRpYyBjb25zdCBm
bG9hdCB6b29tTXVsdGlwbGllclJhdGlvID0gMS4yZjsKKworLy8gS2V5IGV2ZW50IGxvY2F0aW9u
IGNvZGUgZGVmaW5lZCBpbiBET00gTGV2ZWwgMy4KK2VudW0gS2V5TG9jYXRpb25Db2RlIHsKKyAg
ICBEb21LZXlMb2NhdGlvblN0YW5kYXJkLAorICAgIERvbUtleUxvY2F0aW9uTGVmdCwKKyAgICBE
b21LZXlMb2NhdGlvblJpZ2h0LAorICAgIERvbUtleUxvY2F0aW9uTnVtcGFkCit9OworCitlbnVt
IEV2YXNLZXlNb2RpZmllciB7CisgICAgRXZhc0tleU1vZGlmaWVyTm9uZSAgICA9IDAsCisgICAg
RXZhc0tleU1vZGlmaWVyQ29udHJvbCA9IDEgPDwgMCwKKyAgICBFdmFzS2V5TW9kaWZpZXJTaGlm
dCAgID0gMSA8PCAxLAorICAgIEV2YXNLZXlNb2RpZmllckFsdCAgICAgPSAxIDw8IDIsCisgICAg
RXZhc0tleU1vZGlmaWVyTWV0YSAgICA9IDEgPDwgMworfTsKKworZW51bSBFdmFzTW91c2VCdXR0
b24geworICAgIEV2YXNNb3VzZUJ1dHRvbk5vbmUsCisgICAgRXZhc01vdXNlQnV0dG9uTGVmdCwK
KyAgICBFdmFzTW91c2VCdXR0b25NaWRkbGUsCisgICAgRXZhc01vdXNlQnV0dG9uUmlnaHQKK307
CisKK2VudW0gRXZhc01vdXNlRXZlbnQgeworICAgIEV2YXNNb3VzZUV2ZW50Tm9uZSAgICAgICAg
PSAwLAorICAgIEV2YXNNb3VzZUV2ZW50RG93biAgICAgICAgPSAxIDw8IDAsCisgICAgRXZhc01v
dXNlRXZlbnRVcCAgICAgICAgICA9IDEgPDwgMSwKKyAgICBFdmFzTW91c2VFdmVudE1vdmUgICAg
ICAgID0gMSA8PCAyLAorICAgIEV2YXNNb3VzZUV2ZW50U2Nyb2xsVXAgICAgPSAxIDw8IDMsCisg
ICAgRXZhc01vdXNlRXZlbnRTY3JvbGxEb3duICA9IDEgPDwgNCwKKyAgICBFdmFzTW91c2VFdmVu
dFNjcm9sbExlZnQgID0gMSA8PCA1LAorICAgIEV2YXNNb3VzZUV2ZW50U2Nyb2xsUmlnaHQgPSAx
IDw8IDYsCisgICAgRXZhc01vdXNlRXZlbnRDbGljayAgICAgICA9IEV2YXNNb3VzZUV2ZW50TW92
ZSB8IEV2YXNNb3VzZUV2ZW50RG93biB8IEV2YXNNb3VzZUV2ZW50VXAsCit9OworCitzdGF0aWMg
dm9pZCBzZXRFdmFzTW9kaWZpZXJzKEV2YXMqIGV2YXMsIEV2YXNLZXlNb2RpZmllciBtb2RpZmll
cnMpCit7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIG1vZGlmaWVyTmFtZXNbXSA9IHsgIkNvbnRy
b2wiLCAiU2hpZnQiLCAiQWx0IiwgIlN1cGVyIiB9OworICAgIGZvciAodW5zaWduZWQgbW9kaWZp
ZXIgPSAwOyBtb2RpZmllciA8IDQ7ICsrbW9kaWZpZXIpIHsKKyAgICAgICAgaWYgKG1vZGlmaWVy
cyAmICgxIDw8IG1vZGlmaWVyKSkKKyAgICAgICAgICAgIGV2YXNfa2V5X21vZGlmaWVyX29uKGV2
YXMsIG1vZGlmaWVyTmFtZXNbbW9kaWZpZXJdKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
ZXZhc19rZXlfbW9kaWZpZXJfb2ZmKGV2YXMsIG1vZGlmaWVyTmFtZXNbbW9kaWZpZXJdKTsKKyAg
ICB9Cit9CisKK3N0YXRpYyBFdmFzTW91c2VCdXR0b24gdHJhbnNsYXRlTW91c2VCdXR0b25OdW1i
ZXIoaW50IGV2ZW50U2VuZGVyQnV0dG9uTnVtYmVyKQoreworICAgIHN0YXRpYyBjb25zdCBFdmFz
TW91c2VCdXR0b24gdHJhbnNsYXRpb25UYWJsZVtdID0geworICAgICAgICBFdmFzTW91c2VCdXR0
b25MZWZ0LAorICAgICAgICBFdmFzTW91c2VCdXR0b25NaWRkbGUsCisgICAgICAgIEV2YXNNb3Vz
ZUJ1dHRvblJpZ2h0LAorICAgICAgICBFdmFzTW91c2VCdXR0b25NaWRkbGUgLy8gZmFzdC9ldmVu
dHMvbW91c2UtY2xpY2stZXZlbnRzIGV4cGVjdHMgdGhlIDR0aCBidXR0b24gdG8gYmUgdHJlYXRl
ZCBhcyB0aGUgbWlkZGxlIGJ1dHRvbgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVk
IHRyYW5zbGF0aW9uVGFibGVTaXplID0gc2l6ZW9mKHRyYW5zbGF0aW9uVGFibGUpIC8gc2l6ZW9m
KHRyYW5zbGF0aW9uVGFibGVbMF0pOworCisgICAgaWYgKGV2ZW50U2VuZGVyQnV0dG9uTnVtYmVy
IDwgdHJhbnNsYXRpb25UYWJsZVNpemUpCisgICAgICAgIHJldHVybiB0cmFuc2xhdGlvblRhYmxl
W2V2ZW50U2VuZGVyQnV0dG9uTnVtYmVyXTsKKworICAgIHJldHVybiBFdmFzTW91c2VCdXR0b25M
ZWZ0OworfQorCitzdGF0aWMgYm9vbCBzZW5kTW91c2VFdmVudChFdmFzKiBldmFzLCBFdmFzTW91
c2VFdmVudCBldmVudCwgaW50IGJ1dHRvbk51bWJlciwgRXZhc0tleU1vZGlmaWVyIG1vZGlmaWVy
cykKK3sKKyAgICB1bnNpZ25lZCB0aW1lU3RhbXAgPSAwOworCisgICAgc2V0RXZhc01vZGlmaWVy
cyhldmFzLCBtb2RpZmllcnMpOworICAgIGlmIChldmVudCAmIEV2YXNNb3VzZUV2ZW50TW92ZSkK
KyAgICAgICAgZXZhc19ldmVudF9mZWVkX21vdXNlX21vdmUoZXZhcywgZ0xhc3RNb3VzZVBvc2l0
aW9uWCwgZ0xhc3RNb3VzZVBvc2l0aW9uWSwgdGltZVN0YW1wKyssIDApOworICAgIGlmIChldmVu
dCAmIEV2YXNNb3VzZUV2ZW50RG93bikKKyAgICAgICAgZXZhc19ldmVudF9mZWVkX21vdXNlX2Rv
d24oZXZhcywgYnV0dG9uTnVtYmVyLCBFVkFTX0JVVFRPTl9OT05FLCB0aW1lU3RhbXArKywgMCk7
CisgICAgaWYgKGV2ZW50ICYgRXZhc01vdXNlRXZlbnRVcCkKKyAgICAgICAgZXZhc19ldmVudF9m
ZWVkX21vdXNlX3VwKGV2YXMsIGJ1dHRvbk51bWJlciwgRVZBU19CVVRUT05fTk9ORSwgdGltZVN0
YW1wKyssIDApOworCisgICAgY29uc3QgYm9vbCBob3Jpem9udGFsID0gISEoZXZlbnQgJiBFdmFz
TW91c2VFdmVudFNjcm9sbExlZnQgfCBldmVudCAmIEV2YXNNb3VzZUV2ZW50U2Nyb2xsUmlnaHQp
OworICAgIGNvbnN0IGJvb2wgdmVydGljYWwgPSAhIShldmVudCAmIEV2YXNNb3VzZUV2ZW50U2Ny
b2xsVXAgfCBldmVudCAmIEV2YXNNb3VzZUV2ZW50U2Nyb2xsRG93bik7CisgICAgaWYgKHZlcnRp
Y2FsICYmIGhvcml6b250YWwpIHsKKyAgICAgICAgZXZhc19ldmVudF9mZWVkX21vdXNlX3doZWVs
KGV2YXMsIDAsIChldmVudCAmIEV2YXNNb3VzZUV2ZW50U2Nyb2xsVXApID8gMTAgOiAtMTAsIHRp
bWVTdGFtcCwgMCk7CisgICAgICAgIGV2YXNfZXZlbnRfZmVlZF9tb3VzZV93aGVlbChldmFzLCAx
LCAoZXZlbnQgJiBFdmFzTW91c2VFdmVudFNjcm9sbExlZnQpID8gMTAgOiAtMTAsIHRpbWVTdGFt
cCwgMCk7CisgICAgfSBlbHNlIGlmICh2ZXJ0aWNhbCkKKyAgICAgICAgZXZhc19ldmVudF9mZWVk
X21vdXNlX3doZWVsKGV2YXMsIDAsIChldmVudCAmIEV2YXNNb3VzZUV2ZW50U2Nyb2xsVXApID8g
MTAgOiAtMTAsIHRpbWVTdGFtcCwgMCk7CisgICAgZWxzZSBpZiAoaG9yaXpvbnRhbCkKKyAgICAg
ICAgZXZhc19ldmVudF9mZWVkX21vdXNlX3doZWVsKGV2YXMsIDEsIChldmVudCAmIEV2YXNNb3Vz
ZUV2ZW50U2Nyb2xsTGVmdCkgPyAxMCA6IC0xMCwgdGltZVN0YW1wLCAwKTsKKworICAgIHNldEV2
YXNNb2RpZmllcnMoZXZhcywgRXZhc0tleU1vZGlmaWVyTm9uZSk7CisKKyAgICByZXR1cm4gdHJ1
ZTsKK30KKworc3RhdGljIEVpbmFfQm9vbCBzZW5kQ2xpY2sodm9pZCopCit7CisgICAgcmV0dXJu
ICEhc2VuZE1vdXNlRXZlbnQoZXZhc19vYmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgRXZhc01v
dXNlRXZlbnRDbGljaywgRXZhc01vdXNlQnV0dG9uTGVmdCwgRXZhc0tleU1vZGlmaWVyTm9uZSk7
Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIHNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2tDYWxsYmFj
ayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVm
IHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3Vt
ZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgZWNvcmVfaWRsZXJfYWRkKHNl
bmRDbGljaywgMCk7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOwor
fQorCitzdGF0aWMgdm9pZCB1cGRhdGVDbGlja0NvdW50KGludCBidXR0b24pCit7CisgICAgaWYg
KGdMYXN0Q2xpY2tQb3NpdGlvblggIT0gZ0xhc3RNb3VzZVBvc2l0aW9uWAorICAgICAgICB8fCBn
TGFzdENsaWNrUG9zaXRpb25ZICE9IGdMYXN0TW91c2VQb3NpdGlvblkKKyAgICAgICAgfHwgZ0xh
c3RDbGlja0J1dHRvbiAhPSBidXR0b24KKyAgICAgICAgfHwgZ1RpbWVPZmZzZXQgLSBnTGFzdENs
aWNrVGltZU9mZnNldCA+PSAxKQorICAgICAgICBnQ2xpY2tDb3VudCA9IDE7CisgICAgZWxzZQor
ICAgICAgICBnQ2xpY2tDb3VudCsrOworfQorCitzdGF0aWMgRXZhc0tleU1vZGlmaWVyIG1vZGlm
aWVyRnJvbUpTVmFsdWUoSlNDb250ZXh0UmVmIGNvbnRleHQsIGNvbnN0IEpTVmFsdWVSZWYgdmFs
dWUpCit7CisgICAgSlNSZXRhaW5QdHI8SlNTdHJpbmdSZWY+IGpzS2V5VmFsdWUoQWRvcHQsIEpT
VmFsdWVUb1N0cmluZ0NvcHkoY29udGV4dCwgdmFsdWUsIDApKTsKKworICAgIGlmIChlcXVhbHMo
anNLZXlWYWx1ZSwgImN0cmxLZXkiKSB8fCBlcXVhbHMoanNLZXlWYWx1ZSwgImFkZFNlbGVjdGlv
bktleSIpKQorICAgICAgICByZXR1cm4gRXZhc0tleU1vZGlmaWVyQ29udHJvbDsKKyAgICBpZiAo
ZXF1YWxzKGpzS2V5VmFsdWUsICJzaGlmdEtleSIpIHx8IGVxdWFscyhqc0tleVZhbHVlLCAicmFu
Z2VTZWxlY3Rpb25LZXkiKSkKKyAgICAgICAgcmV0dXJuIEV2YXNLZXlNb2RpZmllclNoaWZ0Owor
ICAgIGlmIChlcXVhbHMoanNLZXlWYWx1ZSwgImFsdEtleSIpKQorICAgICAgICByZXR1cm4gRXZh
c0tleU1vZGlmaWVyQWx0OworICAgIGlmIChlcXVhbHMoanNLZXlWYWx1ZSwgIm1ldGFLZXkiKSkK
KyAgICAgICAgcmV0dXJuIEV2YXNLZXlNb2RpZmllck1ldGE7CisKKyAgICByZXR1cm4gRXZhc0tl
eU1vZGlmaWVyTm9uZTsKK30KKworc3RhdGljIEV2YXNLZXlNb2RpZmllciBtb2RpZmllcnNGcm9t
SlNWYWx1ZShKU0NvbnRleHRSZWYgY29udGV4dCwgY29uc3QgSlNWYWx1ZVJlZiBtb2RpZmllcnMp
Cit7CisgICAgLy8gVGhlIHZhbHVlIG1heSBlaXRoZXIgYmUgYSBzdHJpbmcgd2l0aCBhIHNpbmds
ZSBtb2RpZmllciBvciBhbiBhcnJheSBvZiBtb2RpZmllcnMuCisgICAgaWYgKEpTVmFsdWVJc1N0
cmluZyhjb250ZXh0LCBtb2RpZmllcnMpKQorICAgICAgICByZXR1cm4gbW9kaWZpZXJGcm9tSlNW
YWx1ZShjb250ZXh0LCBtb2RpZmllcnMpOworCisgICAgSlNPYmplY3RSZWYgbW9kaWZpZXJzQXJy
YXkgPSBKU1ZhbHVlVG9PYmplY3QoY29udGV4dCwgbW9kaWZpZXJzLCAwKTsKKyAgICBpZiAoIW1v
ZGlmaWVyc0FycmF5KQorICAgICAgICByZXR1cm4gRXZhc0tleU1vZGlmaWVyTm9uZTsKKworICAg
IHVuc2lnbmVkIG1vZGlmaWVyID0gMDsKKyAgICBpbnQgbW9kaWZpZXJzQ291bnQgPSBKU1ZhbHVl
VG9OdW1iZXIoY29udGV4dCwgSlNPYmplY3RHZXRQcm9wZXJ0eShjb250ZXh0LCBtb2RpZmllcnNB
cnJheSwgSlNTdHJpbmdDcmVhdGVXaXRoVVRGOENTdHJpbmcoImxlbmd0aCIpLCAwKSwgMCk7Cisg
ICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2RpZmllcnNDb3VudDsgKytpKQorICAgICAgICBtb2Rp
ZmllciB8PSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4obW9kaWZpZXJGcm9tSlNWYWx1ZShjb250ZXh0
LCBKU09iamVjdEdldFByb3BlcnR5QXRJbmRleChjb250ZXh0LCBtb2RpZmllcnNBcnJheSwgaSwg
MCkpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RXZhc0tleU1vZGlmaWVyPihtb2RpZmllcik7
Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIG1vdXNlRG93bkNhbGxiYWNrKEpTQ29udGV4dFJlZiBj
b250ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6
ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVS
ZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBpbnQgYnV0dG9uID0gMDsKKyAgICBpZiAoYXJndW1lbnRD
b3VudCA9PSAxKSB7CisgICAgICAgIGJ1dHRvbiA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRv
TnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhjZXB0aW9uKSk7CisKKyAgICAgICAgaWYg
KGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtl
VW5kZWZpbmVkKGNvbnRleHQpOworICAgIH0KKworICAgIGJ1dHRvbiA9IHRyYW5zbGF0ZU1vdXNl
QnV0dG9uTnVtYmVyKGJ1dHRvbik7CisgICAgLy8gSWYgdGhlIHNhbWUgbW91c2UgYnV0dG9uIGlz
IGFscmVhZHkgaW4gdGhlIGRvd24gcG9zaXRpb24gZG9uJ3Qgc2VuZCBhbm90aGVyIGV2ZW50IGFz
IGl0IG1heSBjb25mdXNlIFh2ZmIuCisgICAgaWYgKGdCdXR0b25DdXJyZW50bHlEb3duID09IGJ1
dHRvbikKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisg
ICAgdXBkYXRlQ2xpY2tDb3VudChidXR0b24pOworCisgICAgRXZhc0tleU1vZGlmaWVyIG1vZGlm
aWVycyA9IGFyZ3VtZW50Q291bnQgPj0gMiA/IG1vZGlmaWVyc0Zyb21KU1ZhbHVlKGNvbnRleHQs
IGFyZ3VtZW50c1sxXSkgOiBFdmFzS2V5TW9kaWZpZXJOb25lOworICAgIGlmICghc2VuZE1vdXNl
RXZlbnQoZXZhc19vYmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgRXZhc01vdXNlRXZlbnREb3du
LCBidXR0b24sIG1vZGlmaWVycykpCisgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5l
ZChjb250ZXh0KTsKKworICAgIGdCdXR0b25DdXJyZW50bHlEb3duID0gYnV0dG9uOworICAgIHJl
dHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVS
ZWYgbW91c2VVcENhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250ZXh0LCBKU09iamVjdFJlZiBmdW5j
dGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90IGFyZ3VtZW50Q291bnQsIGNvbnN0
IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYqIGV4Y2VwdGlvbikKK3sKKyAgICBp
bnQgYnV0dG9uID0gMDsKKyAgICBpZiAoYXJndW1lbnRDb3VudCA9PSAxKSB7CisgICAgICAgIGJ1
dHRvbiA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50
c1swXSwgZXhjZXB0aW9uKSk7CisgICAgICAgIGlmIChleGNlcHRpb24gJiYgKmV4Y2VwdGlvbikK
KyAgICAgICAgICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICB9
CisKKyAgICBnTGFzdENsaWNrUG9zaXRpb25YID0gZ0xhc3RNb3VzZVBvc2l0aW9uWDsKKyAgICBn
TGFzdENsaWNrUG9zaXRpb25ZID0gZ0xhc3RNb3VzZVBvc2l0aW9uWTsKKyAgICBnTGFzdENsaWNr
QnV0dG9uID0gZ0J1dHRvbkN1cnJlbnRseURvd247CisgICAgZ0xhc3RDbGlja1RpbWVPZmZzZXQg
PSBnVGltZU9mZnNldDsKKyAgICBnQnV0dG9uQ3VycmVudGx5RG93biA9IDA7CisKKyAgICBFdmFz
S2V5TW9kaWZpZXIgbW9kaWZpZXJzID0gYXJndW1lbnRDb3VudCA+PSAyID8gbW9kaWZpZXJzRnJv
bUpTVmFsdWUoY29udGV4dCwgYXJndW1lbnRzWzFdKSA6IEV2YXNLZXlNb2RpZmllck5vbmU7Cisg
ICAgc2VuZE1vdXNlRXZlbnQoZXZhc19vYmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgRXZhc01v
dXNlRXZlbnRVcCwgdHJhbnNsYXRlTW91c2VCdXR0b25OdW1iZXIoYnV0dG9uKSwgbW9kaWZpZXJz
KTsKKyAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7Cit9CisKK3N0YXRp
YyBKU1ZhbHVlUmVmIG1vdXNlTW92ZVRvQ2FsbGJhY2soSlNDb250ZXh0UmVmIGNvbnRleHQsIEpT
T2JqZWN0UmVmIGZ1bmN0aW9uLCBKU09iamVjdFJlZiB0aGlzT2JqZWN0LCBzaXplX3QgYXJndW1l
bnRDb3VudCwgY29uc3QgSlNWYWx1ZVJlZiBhcmd1bWVudHNbXSwgSlNWYWx1ZVJlZiogZXhjZXB0
aW9uKQoreworICAgIGlmIChhcmd1bWVudENvdW50IDwgMikKKyAgICAgICAgcmV0dXJuIEpTVmFs
dWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgZ0xhc3RNb3VzZVBvc2l0aW9uWCA9IHN0
YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1swXSwgZXhj
ZXB0aW9uKSk7CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAgICByZXR1
cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisgICAgZ0xhc3RNb3VzZVBvc2l0aW9u
WSA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRleHQsIGFyZ3VtZW50c1sx
XSwgZXhjZXB0aW9uKSk7CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQorICAgICAg
ICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICBzZW5kTW91c2VF
dmVudChldmFzX29iamVjdF9ldmFzX2dldChtYWluRnJhbWUpLCBFdmFzTW91c2VFdmVudE1vdmUs
IEV2YXNNb3VzZUJ1dHRvbk5vbmUsIEV2YXNLZXlNb2RpZmllck5vbmUpOworICAgIHJldHVybiBK
U1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEV2YXNNb3VzZUV2ZW50
IGV2YXNNb3VzZUV2ZW50RnJvbUhvcml6b250YWxBbmRWZXJ0aWNhbE9mZnNldHMoaW50IGhvcml6
b250YWxPZmZzZXQsIGludCB2ZXJ0aWNhbE9mZnNldCkKK3sKKyAgICB1bnNpZ25lZCBtb3VzZUV2
ZW50ID0gMDsKKworICAgIGlmICh2ZXJ0aWNhbE9mZnNldCA+IDApCisgICAgICAgIG1vdXNlRXZl
bnQgfD0gRXZhc01vdXNlRXZlbnRTY3JvbGxVcDsKKyAgICBlbHNlIGlmICh2ZXJ0aWNhbE9mZnNl
dCA8IDApCisgICAgICAgIG1vdXNlRXZlbnQgfD0gRXZhc01vdXNlRXZlbnRTY3JvbGxEb3duOwor
CisgICAgaWYgKGhvcml6b250YWxPZmZzZXQgPiAwKQorICAgICAgICBtb3VzZUV2ZW50IHw9IEV2
YXNNb3VzZUV2ZW50U2Nyb2xsUmlnaHQ7CisgICAgZWxzZSBpZiAoaG9yaXpvbnRhbE9mZnNldCA8
IDApCisgICAgICAgIG1vdXNlRXZlbnQgfD0gRXZhc01vdXNlRXZlbnRTY3JvbGxMZWZ0OworCisg
ICAgcmV0dXJuIHN0YXRpY19jYXN0PEV2YXNNb3VzZUV2ZW50Pihtb3VzZUV2ZW50KTsKK30KKwor
c3RhdGljIEpTVmFsdWVSZWYgbW91c2VTY3JvbGxCeUNhbGxiYWNrKEpTQ29udGV4dFJlZiBjb250
ZXh0LCBKU09iamVjdFJlZiBmdW5jdGlvbiwgSlNPYmplY3RSZWYgdGhpc09iamVjdCwgc2l6ZV90
IGFyZ3VtZW50Q291bnQsIGNvbnN0IEpTVmFsdWVSZWYgYXJndW1lbnRzW10sIEpTVmFsdWVSZWYq
IGV4Y2VwdGlvbikKK3sKKyAgICBpZiAoYXJndW1lbnRDb3VudCA8IDIpCisgICAgICAgIHJldHVy
biBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGNvbnN0IGludCBob3Jpem9u
dGFsID0gc3RhdGljX2Nhc3Q8aW50PihKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRz
WzBdLCBleGNlcHRpb24pKTsKKyAgICBpZiAoZXhjZXB0aW9uICYmICpleGNlcHRpb24pCisgICAg
ICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKyAgICBjb25zdCBpbnQg
dmVydGljYWwgPSBzdGF0aWNfY2FzdDxpbnQ+KEpTVmFsdWVUb051bWJlcihjb250ZXh0LCBhcmd1
bWVudHNbMV0sIGV4Y2VwdGlvbikpOworICAgIGlmIChleGNlcHRpb24gJiYgKmV4Y2VwdGlvbikK
KyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworCisgICAgc2Vu
ZE1vdXNlRXZlbnQoZXZhc19vYmplY3RfZXZhc19nZXQobWFpbkZyYW1lKSwgZXZhc01vdXNlRXZl
bnRGcm9tSG9yaXpvbnRhbEFuZFZlcnRpY2FsT2Zmc2V0cyhob3Jpem9udGFsLCB2ZXJ0aWNhbCks
IEV2YXNNb3VzZUJ1dHRvbk5vbmUsIEV2YXNLZXlNb2RpZmllck5vbmUpOworICAgIHJldHVybiBK
U1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgY29u
dGludW91c01vdXNlU2Nyb2xsQnlDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmpl
Y3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENv
dW50LCBjb25zdCBKU1ZhbHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24p
Cit7CisgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0
aWMgY29uc3QgY2hhcioga2V5UGFkTmFtZUZyb21KU1ZhbHVlKEpTU3RyaW5nUmVmIGNoYXJhY3Rl
cikKK3sKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgImxlZnRBcnJvdyIpKQorICAgICAgICBy
ZXR1cm4gIktQX0xlZnQiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAicmlnaHRBcnJvdyIp
KQorICAgICAgICByZXR1cm4gIktQX1JpZ2h0IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3Rlciwg
InVwQXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJLUF9VcCI7CisgICAgaWYgKGVxdWFscyhjaGFy
YWN0ZXIsICJkb3duQXJyb3ciKSkKKyAgICAgICAgcmV0dXJuICJLUF9Eb3duIjsKKyAgICBpZiAo
ZXF1YWxzKGNoYXJhY3RlciwgInBhZ2VVcCIpKQorICAgICAgICByZXR1cm4gIktQX1BhZ2VfVXAi
OworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAicGFnZURvd24iKSkKKyAgICAgICAgcmV0dXJu
ICJLUF9QYWdlX0Rvd24iOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiaG9tZSIpKQorICAg
ICAgICByZXR1cm4gIktQX0hvbWUiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiZW5kIikp
CisgICAgICAgIHJldHVybiAiS1BfRW5kIjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgImlu
c2VydCIpKQorICAgICAgICByZXR1cm4gIktQX0luc2VydCI7CisgICAgaWYgKGVxdWFscyhjaGFy
YWN0ZXIsICJkZWxldGUiKSkKKyAgICAgICAgcmV0dXJuICJLUF9EZWxldGUiOworCisgICAgLy8g
SWYgd2UgZ2V0IHNvbWUgb3RoZXIga2V5IHNwZWNpZmllZCB3aXRoIHRoZSBudW1wYWQgbG9jYXRp
b24sCisgICAgLy8gY3Jhc2ggaGVyZSwgc28gd2UgYWRkIGl0IHNvb25lciByYXRoZXIgdGhhbiBs
YXRlci4KKyAgICBmcHJpbnRmKHN0ZGVyciwgIm51bWVyaWMgcGFkIGtleSBub3QgaGFuZGxlZDog
JXNcbiIsIGNoYXJhY3Rlci0+dXN0cmluZygpLnV0ZjgoKS5kYXRhKCkpOworICAgIGFib3J0KCk7
Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBrZXlOYW1lRnJvbUpTVmFsdWUoSlNTdHJpbmdSZWYg
Y2hhcmFjdGVyKQoreworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAibGVmdEFycm93IikpCisg
ICAgICAgIHJldHVybiAiTGVmdCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJyaWdodEFy
cm93IikpCisgICAgICAgIHJldHVybiAiUmlnaHQiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVy
LCAidXBBcnJvdyIpKQorICAgICAgICByZXR1cm4gIlVwIjsKKyAgICBpZiAoZXF1YWxzKGNoYXJh
Y3RlciwgImRvd25BcnJvdyIpKQorICAgICAgICByZXR1cm4gIkRvd24iOworICAgIGlmIChlcXVh
bHMoY2hhcmFjdGVyLCAicGFnZVVwIikpCisgICAgICAgIHJldHVybiAiUGFnZV9VcCI7CisgICAg
aWYgKGVxdWFscyhjaGFyYWN0ZXIsICJwYWdlRG93biIpKQorICAgICAgICByZXR1cm4gIlBhZ2Vf
RG93biI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJob21lIikpCisgICAgICAgIHJldHVy
biAiSG9tZSI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJlbmQiKSkKKyAgICAgICAgcmV0
dXJuICJFbmQiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVyLCAiaW5zZXJ0IikpCisgICAgICAg
IHJldHVybiAiSW5zZXJ0IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3RlciwgImRlbGV0ZSIpKQor
ICAgICAgICByZXR1cm4gIkRlbGV0ZSI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIsICJwcmlu
dFNjcmVlbiIpKQorICAgICAgICByZXR1cm4gIlByaW50IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJh
Y3RlciwgIm1lbnUiKSkKKyAgICAgICAgcmV0dXJuICJNZW51IjsKKyAgICBpZiAoZXF1YWxzKGNo
YXJhY3RlciwgIkYxIikpCisgICAgICAgIHJldHVybiAiRjEiOworICAgIGlmIChlcXVhbHMoY2hh
cmFjdGVyLCAiRjIiKSkKKyAgICAgICAgcmV0dXJuICJGMiI7CisgICAgaWYgKGVxdWFscyhjaGFy
YWN0ZXIsICJGMyIpKQorICAgICAgICByZXR1cm4gIkYzIjsKKyAgICBpZiAoZXF1YWxzKGNoYXJh
Y3RlciwgIkY0IikpCisgICAgICAgIHJldHVybiAiRjQiOworICAgIGlmIChlcXVhbHMoY2hhcmFj
dGVyLCAiRjUiKSkKKyAgICAgICAgcmV0dXJuICJGNSI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0
ZXIsICJGNiIpKQorICAgICAgICByZXR1cm4gIkY2IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3Rl
ciwgIkY3IikpCisgICAgICAgIHJldHVybiAiRjciOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVy
LCAiRjgiKSkKKyAgICAgICAgcmV0dXJuICJGOCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIs
ICJGOSIpKQorICAgICAgICByZXR1cm4gIkY5IjsKKyAgICBpZiAoZXF1YWxzKGNoYXJhY3Rlciwg
IkYxMCIpKQorICAgICAgICByZXR1cm4gIkYxMCI7CisgICAgaWYgKGVxdWFscyhjaGFyYWN0ZXIs
ICJGMTEiKSkKKyAgICAgICAgcmV0dXJuICJGMTEiOworICAgIGlmIChlcXVhbHMoY2hhcmFjdGVy
LCAiRjEyIikpCisgICAgICAgIHJldHVybiAiRjEyIjsKKworICAgIGludCBjaGFyQ29kZSA9IEpT
U3RyaW5nR2V0Q2hhcmFjdGVyc1B0cihjaGFyYWN0ZXIpWzBdOworICAgIGlmIChjaGFyQ29kZSA9
PSAnXG4nIHx8IGNoYXJDb2RlID09ICdccicpCisgICAgICAgIHJldHVybiAiUmV0dXJuIjsKKyAg
ICBpZiAoY2hhckNvZGUgPT0gJ1x0JykKKyAgICAgICAgcmV0dXJuICJUYWIiOworICAgIGlmIChj
aGFyQ29kZSA9PSAnXHg4JykKKyAgICAgICAgcmV0dXJuICJCYWNrU3BhY2UiOworCisgICAgLy8g
RklYTUU6IFNlZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMgYW5kIG9idGFpbiB0aGUga2V5IG5hbWUg
YnkKKyAgICAvLyB0aGUgVW5pY29kZSBjaGFyYWN0ZXIgY29kZS4KKyAgICBmcHJpbnRmKHN0ZGVy
ciwgImtleSBub3QgaGFuZGxlZDogJXNcbiIsIGNoYXJhY3Rlci0+dXN0cmluZygpLnV0ZjgoKS5k
YXRhKCkpOworICAgIGFib3J0KCk7Cit9CisKK3N0YXRpYyBKU1ZhbHVlUmVmIGtleURvd25DYWxs
YmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24sIEpTT2JqZWN0
UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1ZhbHVlUmVmIGFy
Z3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgRXZhc19PYmplY3QqIHZp
ZXcgPSBld2tfZnJhbWVfdmlld19nZXQobWFpbkZyYW1lKTsKKyAgICBpZiAoIXZpZXcpCisgICAg
ICAgIHJldHVybiBKU1ZhbHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKKworICAgIGlmIChhcmd1
bWVudENvdW50IDwgMSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRl
eHQpOworCisgICAgLy8gaGFuZGxlIGxvY2F0aW9uIGFyZ3VtZW50LgorICAgIGludCBsb2NhdGlv
biA9IERvbUtleUxvY2F0aW9uU3RhbmRhcmQ7CisgICAgaWYgKGFyZ3VtZW50Q291bnQgPiAyKQor
ICAgICAgICBsb2NhdGlvbiA9IHN0YXRpY19jYXN0PGludD4oSlNWYWx1ZVRvTnVtYmVyKGNvbnRl
eHQsIGFyZ3VtZW50c1syXSwgZXhjZXB0aW9uKSk7CisKKyAgICBKU1JldGFpblB0cjxKU1N0cmlu
Z1JlZj4gY2hhcmFjdGVyKEFkb3B0LCBKU1ZhbHVlVG9TdHJpbmdDb3B5KGNvbnRleHQsIGFyZ3Vt
ZW50c1swXSwgZXhjZXB0aW9uKSk7CisgICAgaWYgKGV4Y2VwdGlvbiAmJiAqZXhjZXB0aW9uKQor
ICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29udGV4dCk7CisKKyAgICAvLyBz
ZW5kIHRoZSBldmVudAorICAgIEV2YXMqIGV2YXMgPSBldmFzX29iamVjdF9ldmFzX2dldCh2aWV3
KTsKKyAgICBpZiAoYXJndW1lbnRDb3VudCA+PSAyKQorICAgICAgICBzZXRFdmFzTW9kaWZpZXJz
KGV2YXMsIG1vZGlmaWVyc0Zyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3VtZW50c1sxXSkpOworCisg
ICAgY29uc3QgY2hhcioga2V5TmFtZSA9IChsb2NhdGlvbiA9PSBEb21LZXlMb2NhdGlvbk51bXBh
ZCkgPyBrZXlQYWROYW1lRnJvbUpTVmFsdWUoY2hhcmFjdGVyLmdldCgpKSA6IGtleU5hbWVGcm9t
SlNWYWx1ZShjaGFyYWN0ZXIuZ2V0KCkpOworICAgIGV2YXNfZXZlbnRfZmVlZF9rZXlfZG93bihl
dmFzLCBrZXlOYW1lLCBrZXlOYW1lLCAwLCAwLCAwLCAwKTsKKyAgICBldmFzX2V2ZW50X2ZlZWRf
a2V5X3VwKGV2YXMsIGtleU5hbWUsIGtleU5hbWUsIDAsIDAsIDEsIDApOworCisgICAgc2V0RXZh
c01vZGlmaWVycyhldmFzLCBFdmFzS2V5TW9kaWZpZXJOb25lKTsKKworICAgIHJldHVybiBKU1Zh
bHVlTWFrZVVuZGVmaW5lZChjb250ZXh0KTsKK30KKworc3RhdGljIEpTVmFsdWVSZWYgc2NhbGVQ
YWdlQnlDYWxsYmFjayhKU0NvbnRleHRSZWYgY29udGV4dCwgSlNPYmplY3RSZWYgZnVuY3Rpb24s
IEpTT2JqZWN0UmVmIHRoaXNPYmplY3QsIHNpemVfdCBhcmd1bWVudENvdW50LCBjb25zdCBKU1Zh
bHVlUmVmIGFyZ3VtZW50c1tdLCBKU1ZhbHVlUmVmKiBleGNlcHRpb24pCit7CisgICAgaWYgKGFy
Z3VtZW50Q291bnQgPCAzKQorICAgICAgICByZXR1cm4gSlNWYWx1ZU1ha2VVbmRlZmluZWQoY29u
dGV4dCk7CisKKyAgICBFdmFzX09iamVjdCogdmlldyA9IGV3a19mcmFtZV92aWV3X2dldChtYWlu
RnJhbWUpOworICAgIGlmICghdmlldykKKyAgICAgICAgcmV0dXJuIEpTVmFsdWVNYWtlVW5kZWZp
bmVkKGNvbnRleHQpOworCisgICAgZmxvYXQgc2NhbGVGYWN0b3IgPSBKU1ZhbHVlVG9OdW1iZXIo
Y29udGV4dCwgYXJndW1lbnRzWzBdLCBleGNlcHRpb24pOworICAgIGZsb2F0IHggPSBKU1ZhbHVl
VG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzFdLCBleGNlcHRpb24pOworICAgIGZsb2F0IHkg
PSBKU1ZhbHVlVG9OdW1iZXIoY29udGV4dCwgYXJndW1lbnRzWzJdLCBleGNlcHRpb24pOworICAg
IGV3a192aWV3X3BhZ2Vfc2NhbGUodmlldywgc2NhbGVGYWN0b3IsIHgsIHkpOworCisgICAgcmV0
dXJuIEpTVmFsdWVNYWtlVW5kZWZpbmVkKGNvbnRleHQpOworfQorCitzdGF0aWMgSlNTdGF0aWNG
dW5jdGlvbiBzdGF0aWNGdW5jdGlvbnNbXSA9IHsKKyAgICB7ICJtb3VzZVNjcm9sbEJ5IiwgbW91
c2VTY3JvbGxCeUNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJv
cGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAiY29udGludW91c01vdXNlU2Nyb2xs
QnkiLCBjb250aW51b3VzTW91c2VTY3JvbGxCeUNhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0
ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAibW91
c2VEb3duIiwgbW91c2VEb3duQ2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkg
fCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJtb3VzZVVwIiwgbW91
c2VVcENhbGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlB
dHRyaWJ1dGVEb250RGVsZXRlIH0sCisgICAgeyAibW91c2VNb3ZlVG8iLCBtb3VzZU1vdmVUb0Nh
bGxiYWNrLCBrSlNQcm9wZXJ0eUF0dHJpYnV0ZVJlYWRPbmx5IHwga0pTUHJvcGVydHlBdHRyaWJ1
dGVEb250RGVsZXRlIH0sCisgICAgeyAia2V5RG93biIsIGtleURvd25DYWxsYmFjaywga0pTUHJv
cGVydHlBdHRyaWJ1dGVSZWFkT25seSB8IGtKU1Byb3BlcnR5QXR0cmlidXRlRG9udERlbGV0ZSB9
LAorICAgIHsgInNjaGVkdWxlQXN5bmNocm9ub3VzQ2xpY2siLCBzY2hlZHVsZUFzeW5jaHJvbm91
c0NsaWNrQ2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0
eUF0dHJpYnV0ZURvbnREZWxldGUgfSwKKyAgICB7ICJzY2FsZVBhZ2VCeSIsIHNjYWxlUGFnZUJ5
Q2FsbGJhY2ssIGtKU1Byb3BlcnR5QXR0cmlidXRlUmVhZE9ubHkgfCBrSlNQcm9wZXJ0eUF0dHJp
YnV0ZURvbnREZWxldGUgfSwKKyAgICB7IDAsIDAsIDAgfQorfTsKKworc3RhdGljIEpTU3RhdGlj
VmFsdWUgc3RhdGljVmFsdWVzW10gPSB7CisgICAgeyAwLCAwLCAwLCAwIH0KK307CisKK3N0YXRp
YyBKU0NsYXNzUmVmIGdldENsYXNzKEpTQ29udGV4dFJlZiBjb250ZXh0KQoreworICAgIHN0YXRp
YyBKU0NsYXNzUmVmIGV2ZW50U2VuZGVyQ2xhc3MgPSAwOworCisgICAgaWYgKCFldmVudFNlbmRl
ckNsYXNzKSB7CisgICAgICAgIEpTQ2xhc3NEZWZpbml0aW9uIGNsYXNzRGVmaW5pdGlvbiA9IHsK
KyAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgIDAsIDAs
IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDB9OworICAgICAgICBjbGFzc0RlZmluaXRpb24uc3Rh
dGljRnVuY3Rpb25zID0gc3RhdGljRnVuY3Rpb25zOworICAgICAgICBjbGFzc0RlZmluaXRpb24u
c3RhdGljVmFsdWVzID0gc3RhdGljVmFsdWVzOworCisgICAgICAgIGV2ZW50U2VuZGVyQ2xhc3Mg
PSBKU0NsYXNzQ3JlYXRlKCZjbGFzc0RlZmluaXRpb24pOworICAgIH0KKworICAgIHJldHVybiBl
dmVudFNlbmRlckNsYXNzOworfQorCitKU09iamVjdFJlZiBtYWtlRXZlbnRTZW5kZXIoSlNDb250
ZXh0UmVmIGNvbnRleHQsIGJvb2wgaXNUb3BGcmFtZSkKK3sKKyAgICBpZiAoaXNUb3BGcmFtZSkg
eworICAgICAgICBnRHJhZ01vZGUgPSB0cnVlOworCisgICAgICAgIC8vIEZseSBmb3J3YXJkIGlu
IHRpbWUgb25lIHNlY29uZCB3aGVuIHRoZSBtYWluIGZyYW1lIGxvYWRzLiBUaGlzIHdpbGwKKyAg
ICAgICAgLy8gZW5zdXJlIHRoYXQgd2hlbiBhIHRlc3QgYmVnaW5zIGNsaWNraW5nIGluIHRoZSBz
YW1lIGxvY2F0aW9uIGFzCisgICAgICAgIC8vIGEgcHJldmlvdXMgdGVzdCwgdGhvc2UgY2xpY2tz
IHdvbid0IGJlIGludGVycHJldGVkIGFzIGNvbnRpbnVhdGlvbnMKKyAgICAgICAgLy8gb2YgdGhl
IHByZXZpb3VzIHRlc3QncyBjbGljayBzZXF1ZW5jZXMuCisgICAgICAgIGdUaW1lT2Zmc2V0ICs9
IDEwMDA7CisKKyAgICAgICAgZ0xhc3RNb3VzZVBvc2l0aW9uWCA9IGdMYXN0TW91c2VQb3NpdGlv
blkgPSAwOworICAgICAgICBnTGFzdENsaWNrUG9zaXRpb25YID0gZ0xhc3RDbGlja1Bvc2l0aW9u
WSA9IDA7CisgICAgICAgIGdMYXN0Q2xpY2tUaW1lT2Zmc2V0ID0gMDsKKyAgICAgICAgZ0xhc3RD
bGlja0J1dHRvbiA9IDA7CisgICAgICAgIGdCdXR0b25DdXJyZW50bHlEb3duID0gMDsKKyAgICAg
ICAgZ0NsaWNrQ291bnQgPSAwOworICAgIH0KKworICAgIHJldHVybiBKU09iamVjdE1ha2UoY29u
dGV4dCwgZ2V0Q2xhc3MoY29udGV4dCksIDApOworfQpkaWZmIC0tZ2l0IGEvVG9vbHMvRHVtcFJl
bmRlclRyZWUvZWZsL0V2ZW50U2VuZGVyLmggYi9Ub29scy9EdW1wUmVuZGVyVHJlZS9lZmwvRXZl
bnRTZW5kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5iZGVkNjU1MmRmY2UxMmQ4MmE3NDZlYTI3NjU5YzIxNzkz
N2ExZTA0Ci0tLSAvZGV2L251bGwKKysrIGIvVG9vbHMvRHVtcFJlbmRlclRyZWUvZWZsL0V2ZW50
U2VuZGVyLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBBcHBs
ZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IChDKSAyMDA5IEhvbGdl
ciBIYW5zIFBldGVyIEZyZXl0aGVyCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgUHJvRlVTSU9OIEVt
YmVkZGVkIFN5c3RlbXMKKyAqIENvcHlyaWdodCAoQykgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNz
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKgorICogMS4g
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiAgTmVpdGhlciB0aGUgbmFtZSBvZiBBcHBsZSBDb21w
dXRlciwgSW5jLiAoIkFwcGxlIikgbm9yIHRoZSBuYW1lcyBvZgorICogICAgIGl0cyBjb250cmli
dXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQK
KyAqICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBB
TkQgSVRTIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQK
KyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKKyAqIE9O
IEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YKKyAqIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKwor
I2lmbmRlZiBFdmVudFNlbmRlcl9oCisjZGVmaW5lIEV2ZW50U2VuZGVyX2gKKwordHlwZWRlZiBj
b25zdCBzdHJ1Y3QgT3BhcXVlSlNDb250ZXh0KiBKU0NvbnRleHRSZWY7Cit0eXBlZGVmIHN0cnVj
dCBPcGFxdWVKU1ZhbHVlKiBKU09iamVjdFJlZjsKKworLy8gVGhlIGJvb2xlYW4gcGFyYW1ldGVy
IHJlZmVycyB0byB3aGV0aGVyIHRoaXMgaXMgYmVpbmcgY2FsbGVkIGZyb20gYSB0b3AtbGV2ZWwg
ZnJhbWUuCitKU09iamVjdFJlZiBtYWtlRXZlbnRTZW5kZXIoSlNDb250ZXh0UmVmLCBib29sKTsK
KworI2VuZGlmIC8vIEV2ZW50U2VuZGVyX2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>