<?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>70714</bug_id>
          
          <creation_ts>2011-10-24 02:00:05 -0700</creation_ts>
          <short_desc>[chromium] Encapsulate state machine parts of scheduling in CCSchedulerStateMachine</short_desc>
          <delta_ts>2011-10-27 12:33:54 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>New Bugs</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>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>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Nat Duca">nduca</reporter>
          <assigned_to name="Nat Duca">nduca</assigned_to>
          <cc>enne</cc>
    
    <cc>fishd</cc>
    
    <cc>jamesr</cc>
    
    <cc>jbates</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>489232</commentid>
    <comment_count>0</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-24 02:00:05 -0700</bug_when>
    <thetext>[chromium] Encapsulate state machine parts of scheduling in CCSchedulerStateMachine</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489233</commentid>
    <comment_count>1</comment_count>
      <attachid>112163</attachid>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-24 02:00:30 -0700</bug_when>
    <thetext>Created attachment 112163
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489248</commentid>
    <comment_count>2</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-24 02:39:48 -0700</bug_when>
    <thetext>This patch introduces the CCSchedulerStateMachine as a place to store the state machine that we typically keep inside render_widget. Goal #1 here was getting our scheduling algorithms in one place and well-covered by tests. Its integration with the rest of code will be a followup patch.

The first thing to notice in this code is how &quot;actions&quot; are taken by the scheduler. The obvious way to do this would be to have
  CCSchedulerClient {
     void draw();
  }
And in the code that calls draw, we&apos;d write:
    if ( ... conditions leading to draw ...)
      m_client-&gt;draw();
       ... clear conditions that indicate drawing needed

The thing that has always caused me pain with such code is that it commingles &quot;deciding what to do&quot; with &quot;advancing state.&quot; So, I switched to an &quot;ACTION&quot; model:
   Action getNextState() {
        if (... need to draw...)
           return draw;
   }
   void updateState(Action) {
       if (draw)
          clear conditions that lead to draw;
   }
This may have been a mistake. I&apos;m open to feedback.

One key challenge was whether &quot;we are on a vsync line&quot; was state or not. Since the scheduler cannot directly affect vsync, I opted for it being ephemeral state: when one asks for a next state, you pass in whether you&apos;re on the vsync. The idea is that b70713&apos;s FrameRateController will be the source of that information.

Putting this all together, the rough way one uses the CCSchedulerStateMachine is:
  m_ssm.updateState(... something that we did outside the scheduler ...)
  reschedule();
I.e. anytime you tweak the scheduler state, reschedule.
Where:
  void reschedule() {
      while(true) {
          Action action = m_ssm-&gt;getNextAction();
          if (action == ACTION_NONE) break;
          handleAction(action);
      }
  }
  void handleAction(Action action) {
     if(action == DRAW) { drawLayersAndSwap(); }
     if(action == BEGIN_FRAME) { beginFrame(); }
     ...
     m_ssm-&gt;updateState(action);
  }


The last few tests in CCSchedulerStateMachineTest.cpp show how a frame runs through the machine. As a result, they might be a good place to start when looking through the code.

Have at it! :)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>489564</commentid>
    <comment_count>3</comment_count>
      <attachid>112163</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-10-24 13:27:10 -0700</bug_when>
    <thetext>Comment on attachment 112163
Patch

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

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.cpp:33
&gt; +    if (m_commitState == COMMIT_STATE_IDLE) {

would this be clearer as a switch statement? one advantage of switching on an enum value is that the compiler will yell if we&apos;re missing a case: instead of relying on a runtime ASSERT_NOT_REACHED()

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.cpp:46
&gt; +        if (insideVSyncTick &amp;&amp; m_needsRedraw)

nit: the other conditionals are (m_dlkfj &amp;&amp; insideVSyncTick), why&apos;s this one the other way around?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.cpp:61
&gt; +    if (action == ACTION_NONE)

switch maybe?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.cpp:71
&gt; +        // Prevent another UPDATE_MORE_RESOURCES call until we draw again.

I can&apos;t really tell what an &quot;UPDATE_MORE_RESOURCES call&quot; is in this context

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.cpp:93
&gt; +    if (input == INPUT_SET_NEEDS_REDRAW) {

switch?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.h:31
&gt; +/**
&gt; + * The CCSchedulerStateMachine decides how to coordinates main thread activites

why is this a c-style comment? we normally only use that for license header blocks

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.h:39
&gt; + * The scheduler seprates &quot;what to do next&quot; from the updating of its internal state to

seprates -&gt; separates

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.h:78
&gt; +    Action getNextAction(bool insideVSyncTick) const;

we would normally name this &apos;nextAction()&apos; - or if you want to emphasize that this isn&apos;t just a simple getter maybe calculateNextAction()?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.h:79
&gt; +    void updateState(Action);

can you add some comments here (or possibly at the class-level comment) about how a caller is supposed to use these two functions?

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.h:82
&gt; +        INPUT_SET_NEEDS_REDRAW = 1,

the other enums start at 0, why does this one start at 1?

do you need to provide explicit numerical values for these or could you just let the compiler do that?

&gt; Source/WebKit/chromium/tests/CCSchedulerStateMachineTest.cpp:45
&gt; +/* Exposes the protected state fields of the CCSchedulerStateMachine for testing */

use a // style comment for 1-liners</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490499</commentid>
    <comment_count>4</comment_count>
      <attachid>112163</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-10-25 17:46:49 -0700</bug_when>
    <thetext>Comment on attachment 112163
Patch

R- for pile of nits to remove this from pending-review queue, although this seems great overall.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490548</commentid>
    <comment_count>5</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-25 21:38:29 -0700</bug_when>
    <thetext>(In reply to comment #4)
&gt;  do you need to provide explicit numerical values for these or could you just let the compiler do that?

When gtests fail, they give a number. It helped my head debug those failures rather than having to count enums to recreate what the compiler did in my head. Its style I guess, I can yank it?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490552</commentid>
    <comment_count>6</comment_count>
      <attachid>112448</attachid>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-25 21:54:09 -0700</bug_when>
    <thetext>Created attachment 112448
input enum -&gt; real functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490570</commentid>
    <comment_count>7</comment_count>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-10-25 22:54:28 -0700</bug_when>
    <thetext>I don&apos;t think there&apos;s anything horribly wrong with giving enums explicit values, but it isn&apos;t what we normally do unless the values are going to be used in a bitfield or the numeric values are part of the public API.  Seeing numeric values in the header makes me think that one of those two things is going to happen.

When debugging I can&apos;t remember finding explicit numeric values in the source very useful, since GDB can print out the numeric values and it&apos;s not too hard to count when looking at logs or other non-interactive debugging modes.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490577</commentid>
    <comment_count>8</comment_count>
      <attachid>112448</attachid>
    <who name="James Robinson">jamesr</who>
    <bug_when>2011-10-25 23:01:51 -0700</bug_when>
    <thetext>Comment on attachment 112448
input enum -&gt; real functions

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

R=me, remaining nits are up to you

&gt; Source/WebCore/platform/graphics/chromium/cc/CCSchedulerStateMachine.h:43
&gt; +            : m_commitState(COMMIT_STATE_IDLE)

odd indentation - the : should be 4 spaces in from the previous line. Could you move the c&apos;tor to the .cpp? there&apos;s a whole lotta lines to read here before we get to the API bits that a user of this class would be interested in

&gt; Source/WebKit/chromium/tests/CCSchedulerStateMachineTest.cpp:180
&gt; +TEST(CCSchedulerStateMachineTest, TestSetNeedsCommitIsntLost)

IsntLost-&gt;IsNotLost ? looks like a typo without the apostrophe (although you obviously can&apos;t put that in the function name)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>490705</commentid>
    <comment_count>9</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-26 02:47:23 -0700</bug_when>
    <thetext>Agreed with all remaining nits. Will land tomorrow morning.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491763</commentid>
    <comment_count>10</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-27 11:29:53 -0700</bug_when>
    <thetext>Committed r98612: &lt;http://trac.webkit.org/changeset/98612&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491779</commentid>
    <comment_count>11</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-27 11:45:41 -0700</bug_when>
    <thetext>Reverted r98612 for reason:

Broke build

Committed r98613: &lt;http://trac.webkit.org/changeset/98613&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>491828</commentid>
    <comment_count>12</comment_count>
    <who name="Nat Duca">nduca</who>
    <bug_when>2011-10-27 12:33:54 -0700</bug_when>
    <thetext>Committed r98618: &lt;http://trac.webkit.org/changeset/98618&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112163</attachid>
            <date>2011-10-24 02:00:30 -0700</date>
            <delta_ts>2011-10-25 21:54:05 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-70714-20111024020028.patch</filename>
            <type>text/plain</type>
            <size>23301</size>
            <attacher name="Nat Duca">nduca</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTgxMzcKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCAwOGZmNjFjZDljNjY0MWM4
MGQzMjVlMjA1NmM3ZjA4YTEyMDYxNjQ3Li42YTQxMjBiNGVlMWJiM2YyYzg0ZTk2NWRmYmQxZGI3
MjE2YmNjZWJiIDEwMDc1NQotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMTEtMTAtMjQgIE5hdCBE
dWNhICA8bmR1Y2FAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gRW5jYXBzdWxh
dGUgc3RhdGUgbWFjaGluZSBwYXJ0cyBvZiBzY2hlZHVsaW5nIGluIENDU2NoZWR1bGVyU3RhdGVN
YWNoaW5lCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03
MDcxNAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICog
V2ViQ29yZS5neXBpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0ND
U2NoZWR1bGVyU3RhdGVNYWNoaW5lLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZTo6Z2V0TmV4dEFjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpD
Q1NjaGVkdWxlclN0YXRlTWFjaGluZTo6dXBkYXRlU3RhdGUpOgorICAgICAgICAqIHBsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1bGVyU3RhdGVNYWNoaW5lLmg6IEFkZGVkLgor
ICAgICAgICAoV2ViQ29yZTo6Q0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNDU2NoZWR1bGVyU3Rh
dGVNYWNoaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkNDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpv
cGVyYXRvcj0pOgorICAgICAgICAoV2ViQ29yZTo6Q0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OmNv
bW1pdFBlbmRpbmcpOgorCiAyMDExLTEwLTIxICBWc2V2b2xvZCBWbGFzb3YgIDx2c2V2aWtAY2hy
b21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0b3I6IEFkdmFuY2VkIHNlYXJjaCByZXN1
bHRzIHNob3VsZCBiZSBjbGVhcmVkIG9uIG5hdmlnYXRpb24uCmRpZmYgLS1naXQgYS9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdl
TG9nCmluZGV4IGNlYjNjN2I3YzhmNWVjOTI3ZDM4ZDljNDAwZjdkODYyZjY4ZTE5NjIuLmNiNWQy
NDgxYWFiZmQwYmZhNWQ4NDI1YTk1MDNlOWZhZjc3YjFhYjggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9X
ZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hh
bmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMTAtMjQgIE5hdCBEdWNhICA8bmR1Y2FAY2hy
b21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gRW5jYXBzdWxhdGUgc3RhdGUgbWFjaGlu
ZSBwYXJ0cyBvZiBzY2hlZHVsaW5nIGluIENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lCisgICAgICAg
IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03MDcxNAorCisgICAgICAg
IFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogV2ViS2l0Lmd5cGk6Cisg
ICAgICAgICogdGVzdHMvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVUZXN0LmNwcDogQWRkZWQuCisg
ICAgICAgIChXZWJDb3JlOjpTdGF0ZU1hY2hpbmU6OnNldENvbW1pdFN0YXRlKToKKyAgICAgICAg
KFdlYkNvcmU6OlN0YXRlTWFjaGluZTo6Y29tbWl0U3RhdGUpOgorICAgICAgICAoV2ViQ29yZTo6
U3RhdGVNYWNoaW5lOjpzZXROZWVkc0NvbW1pdCk6CisgICAgICAgIChXZWJDb3JlOjpTdGF0ZU1h
Y2hpbmU6Om5lZWRzQ29tbWl0KToKKyAgICAgICAgKFdlYkNvcmU6OlN0YXRlTWFjaGluZTo6c2V0
TmVlZHNSZWRyYXcpOgorICAgICAgICAoV2ViQ29yZTo6U3RhdGVNYWNoaW5lOjpuZWVkc1JlZHJh
dyk6CisgICAgICAgIChXZWJDb3JlOjpTdGF0ZU1hY2hpbmU6OnNldFVwZGF0ZWRUaGlzRnJhbWUp
OgorICAgICAgICAoV2ViQ29yZTo6U3RhdGVNYWNoaW5lOjp1cGRhdGVkVGhpc0ZyYW1lKToKKyAg
ICAgICAgKFdlYkNvcmU6OlRFU1QpOgorCiAyMDExLTEwLTIwICBaaGVueWFvIE1vICA8em1vQGdv
b2dsZS5jb20+CiAKICAgICAgICAgSW1wbGVtZW50IG1lY2hhbmlzbSB0byBlbmFibGUgcHJpdmls
ZWdlZCB3ZWJnbCBleHRlbnNpb25zCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3Jl
Lmd5cGkgYi9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkKaW5kZXggNTZiNjBjZDVhYjE1ZmNh
ZWE4OGQyZDcyNzkyNWE0OWNjNjQ4MTFlYi4uYjEyMjA1OTk0OTQxNWQzZDNlZGNjYTBkOTg0ZmRm
Mjk4NjgxMmM1OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBi
L1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUuZ3lwaQpAQCAtMzU0OCw2ICszNTQ4LDggQEAKICAgICAg
ICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuaCcs
CiAgICAgICAgICAgICAncGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NTY2hlZHVsZXIu
Y3BwJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1NjaGVk
dWxlci5oJywKKyAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZS5jcHAnLAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNz
L2Nocm9taXVtL2NjL0NDU2NoZWR1bGVyU3RhdGVNYWNoaW5lLmgnLAogICAgICAgICAgICAgJ3Bs
YXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2NvcGVkTWFpblRocmVhZFByb3h5LmgnLAog
ICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2Nyb2xsQ29udHJv
bGxlci5oJywKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1Np
bmdsZVRocmVhZFByb3h5LmNwcCcsCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9y
bS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZS5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1NjaGVkdWxlclN0YXRl
TWFjaGluZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYmUwMDJmNjExZTk0MTNlY2RlYjY1Njc2ZDliZmIyYTE4
MjU1NDJlMgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBo
aWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1bGVyU3RhdGVNYWNoaW5lLmNwcApAQCAtMCwwICsxLDEx
OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVECisgKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkKKyAqIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NT
IE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04KKyAqIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0Yg
VEhJUworICogU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiY2Mv
Q0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmUuaCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZTo6QWN0aW9uIENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpnZXRO
ZXh0QWN0aW9uKGJvb2wgaW5zaWRlVlN5bmNUaWNrKSBjb25zdAoreworICAgIGlmIChtX2NvbW1p
dFN0YXRlID09IENPTU1JVF9TVEFURV9JRExFKSB7CisgICAgICAgIGlmIChtX25lZWRzUmVkcmF3
ICYmIGluc2lkZVZTeW5jVGljaykKKyAgICAgICAgICAgIHJldHVybiBBQ1RJT05fRFJBVzsKKyAg
ICAgICAgaWYgKG1fbmVlZHNDb21taXQpCisgICAgICAgICAgICByZXR1cm4gQUNUSU9OX0JFR0lO
X0ZSQU1FOworICAgICAgICByZXR1cm4gQUNUSU9OX05PTkU7CisgICAgfQorICAgIGlmIChtX2Nv
bW1pdFN0YXRlID09IENPTU1JVF9TVEFURV9GUkFNRV9JTl9QUk9HUkVTUykgeworICAgICAgICBp
ZiAobV9uZWVkc1JlZHJhdyAmJiBpbnNpZGVWU3luY1RpY2spCisgICAgICAgICAgICByZXR1cm4g
QUNUSU9OX0RSQVc7CisgICAgICAgIHJldHVybiBBQ1RJT05fTk9ORTsKKyAgICB9CisgICAgaWYg
KG1fY29tbWl0U3RhdGUgPT0gQ09NTUlUX1NUQVRFX1VQREFUSU5HX1JFU09VUkNFUykgeworICAg
ICAgICBpZiAoaW5zaWRlVlN5bmNUaWNrICYmIG1fbmVlZHNSZWRyYXcpCisgICAgICAgICAgICBy
ZXR1cm4gQUNUSU9OX0RSQVc7CisgICAgICAgIGlmICghbV91cGRhdGVkVGhpc0ZyYW1lKQorICAg
ICAgICAgICAgcmV0dXJuIEFDVElPTl9VUERBVEVfTU9SRV9SRVNPVVJDRVM7CisgICAgICAgIHJl
dHVybiBBQ1RJT05fTk9ORTsKKyAgICB9CisgICAgaWYgKG1fY29tbWl0U3RhdGUgPT0gQ09NTUlU
X1NUQVRFX1JFQURZX1RPX0NPTU1JVCkKKyAgICAgICAgcmV0dXJuIEFDVElPTl9DT01NSVQ7CisK
KyAgICBBU1NFUlRfTk9UX1JFQUNIRUQoKTsKKyAgICByZXR1cm4gQUNUSU9OX05PTkU7Cit9CisK
K3ZvaWQgQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OnVwZGF0ZVN0YXRlKEFjdGlvbiBhY3Rpb24p
Cit7CisgICAgaWYgKGFjdGlvbiA9PSBBQ1RJT05fTk9ORSkKKyAgICAgICAgcmV0dXJuOworCisg
ICAgaWYgKGFjdGlvbiA9PSBBQ1RJT05fQkVHSU5fRlJBTUUpIHsKKyAgICAgICAgbV9jb21taXRT
dGF0ZSA9IENPTU1JVF9TVEFURV9GUkFNRV9JTl9QUk9HUkVTUzsKKyAgICAgICAgbV9uZWVkc0Nv
bW1pdCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGFjdGlvbiA9
PSBBQ1RJT05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTKSB7CisgICAgICAgIC8vIFByZXZlbnQgYW5v
dGhlciBVUERBVEVfTU9SRV9SRVNPVVJDRVMgY2FsbCB1bnRpbCB3ZSBkcmF3IGFnYWluLgorICAg
ICAgICBtX3VwZGF0ZWRUaGlzRnJhbWUgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQor
CisgICAgaWYgKGFjdGlvbiA9PSBBQ1RJT05fQ09NTUlUKSB7CisgICAgICAgIG1fY29tbWl0U3Rh
dGUgPSBDT01NSVRfU1RBVEVfSURMRTsKKyAgICAgICAgbV9uZWVkc1JlZHJhdyA9IHRydWU7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoYWN0aW9uID09IEFDVElPTl9EUkFXKSB7
CisgICAgICAgIG1fdXBkYXRlZFRoaXNGcmFtZSA9IGZhbHNlOworICAgICAgICBtX25lZWRzUmVk
cmF3ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBU1NFUlRfTk9UX1JF
QUNIRUQoKTsKK30KKwordm9pZCBDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6dXBkYXRlU3RhdGUo
SW5wdXQgaW5wdXQpCit7CisgICAgaWYgKGlucHV0ID09IElOUFVUX1NFVF9ORUVEU19SRURSQVcp
IHsKKyAgICAgICAgbV9uZWVkc1JlZHJhdyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9
CisKKyAgICBpZiAoaW5wdXQgPT0gSU5QVVRfU0VUX05FRURTX0NPTU1JVCkgeworICAgICAgICBt
X25lZWRzQ29tbWl0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChp
bnB1dCA9PSBJTlBVVF9GUkFNRV9DT01QTEVURSkgeworICAgICAgICBBU1NFUlQobV9jb21taXRT
dGF0ZSA9PSBDT01NSVRfU1RBVEVfRlJBTUVfSU5fUFJPR1JFU1MpOworICAgICAgICBtX2NvbW1p
dFN0YXRlID0gQ09NTUlUX1NUQVRFX1VQREFUSU5HX1JFU09VUkNFUzsKKyAgICAgICAgcmV0dXJu
OworICAgIH0KKworICAgIGlmIChpbnB1dCA9PSBJTlBVVF9VUERBVEVfUkVTT1VSQ0VTX0NPTVBM
RVRFKSB7CisgICAgICAgIEFTU0VSVChtX2NvbW1pdFN0YXRlID09IENPTU1JVF9TVEFURV9VUERB
VElOR19SRVNPVVJDRVMpOworICAgICAgICBtX2NvbW1pdFN0YXRlID0gQ09NTUlUX1NUQVRFX1JF
QURZX1RPX0NPTU1JVDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFTU0VSVF9OT1Rf
UkVBQ0hFRCgpOworfQorCisKK30KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3Jt
L2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1bGVyU3RhdGVNYWNoaW5lLmggYi9Tb3VyY2Uv
V2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1NjaGVkdWxlclN0YXRlTWFj
aGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAuLjkzMGQ2ODVhYTI4ODlmOTE4N2U0NzJlZDE4ZWQyZTg1NzM5Njgx
NTkKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9j
aHJvbWl1bS9jYy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZS5oCkBAIC0wLDAgKzEsMTAyIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
IElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICog
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNF
LCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisg
KiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKyAqLworCisjaWZuZGVmIENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lX2gKKyNkZWZpbmUg
Q0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVfaAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKy8qKgor
ICogVGhlIENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lIGRlY2lkZXMgaG93IHRvIGNvb3JkaW5hdGVz
IG1haW4gdGhyZWFkIGFjdGl2aXRlcworICogbGlrZSBwYWludGluZy9ydW5uaW5nIGphdmFzY3Jp
cHQgd2l0aCByZW5kZXJpbmcgYW5kIGlucHV0IGFjdGl2aXRpZXMgb24gdGhlCisgKiBpbXBsIHRo
cmVhZC4KKyAqCisgKiBUaGUgc3RhdGUgbWFjaGluZSB0cmFja3MgaW50ZXJuYWwgc3RhdGUgYnV0
IGlzIGFsc28gaW5mbHVlbmNlZCBieSBleHRlcm5hbCBzdGF0ZS4KKyAqIEludGVybmFsIHN0YXRl
IGluY2x1ZGVzIHRoaW5ncyBsaWtlIHdoZXRoZXIgYSBmcmFtZSBoYXMgYmVlbiByZXF1ZXN0ZWQs
IHdoaWxlCisgKiBleHRlcm5hbCBzdGF0ZSBpbmNsdWRlcyB0aGluZ3MgbGlrZSB0aGUgY3VycmVu
dCB0aW1lIGJlaW5nIG5lYXIgdG8gdGhlIHZibGFuayB0aW1lLgorICoKKyAqIFRoZSBzY2hlZHVs
ZXIgc2VwcmF0ZXMgIndoYXQgdG8gZG8gbmV4dCIgZnJvbSB0aGUgdXBkYXRpbmcgb2YgaXRzIGlu
dGVybmFsIHN0YXRlIHRvCisgKiBtYWtlIHRlc3RpbmcgY2xlYW5lci4KKyAqLworY2xhc3MgQ0NT
Y2hlZHVsZXJTdGF0ZU1hY2hpbmUgeworcHVibGljOgorICAgIENDU2NoZWR1bGVyU3RhdGVNYWNo
aW5lKCkKKyAgICAgICAgICAgIDogbV9jb21taXRTdGF0ZShDT01NSVRfU1RBVEVfSURMRSkKKyAg
ICAgICAgICAgICwgbV9uZWVkc1JlZHJhdyhmYWxzZSkKKyAgICAgICAgICAgICwgbV9uZWVkc0Nv
bW1pdChmYWxzZSkKKyAgICAgICAgICAgICwgbV91cGRhdGVkVGhpc0ZyYW1lKGZhbHNlKSB7IH0K
KyAgICBDQ1NjaGVkdWxlclN0YXRlTWFjaGluZShjb25zdCBDQ1NjaGVkdWxlclN0YXRlTWFjaGlu
ZSYgdGhhdCkgeyAqdGhpcyA9IHRoYXQ7IH0KKyAgICBDQ1NjaGVkdWxlclN0YXRlTWFjaGluZSYg
b3BlcmF0b3I9KGNvbnN0IENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lJiB0aGF0KQorICAgIHsKKyAg
ICAgICAgbV9jb21taXRTdGF0ZSA9IHRoYXQubV9jb21taXRTdGF0ZTsKKyAgICAgICAgbV9uZWVk
c1JlZHJhdyA9IHRoYXQubV9uZWVkc1JlZHJhdzsKKyAgICAgICAgbV9uZWVkc0NvbW1pdCA9IHRo
YXQubV9uZWVkc0NvbW1pdDsKKyAgICAgICAgbV91cGRhdGVkVGhpc0ZyYW1lID0gdGhhdC5tX3Vw
ZGF0ZWRUaGlzRnJhbWU7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBlbnVt
IENvbW1pdFN0YXRlIHsKKyAgICAgICAgQ09NTUlUX1NUQVRFX0lETEUgPSAwLAorICAgICAgICBD
T01NSVRfU1RBVEVfRlJBTUVfSU5fUFJPR1JFU1MgPSAxLAorICAgICAgICBDT01NSVRfU1RBVEVf
VVBEQVRJTkdfUkVTT1VSQ0VTID0gMiwKKyAgICAgICAgQ09NTUlUX1NUQVRFX1JFQURZX1RPX0NP
TU1JVCA9IDMsCisgICAgfTsKKworICAgIGJvb2wgY29tbWl0UGVuZGluZygpIGNvbnN0CisgICAg
eworICAgICAgICByZXR1cm4gbV9jb21taXRTdGF0ZSAhPSBDT01NSVRfU1RBVEVfSURMRTsKKyAg
ICB9CisKKyAgICBlbnVtIEFjdGlvbiB7CisgICAgICAgIEFDVElPTl9OT05FID0gMCwKKyAgICAg
ICAgQUNUSU9OX0JFR0lOX0ZSQU1FID0gMSwKKyAgICAgICAgQUNUSU9OX1VQREFURV9NT1JFX1JF
U09VUkNFUyA9IDIsCisgICAgICAgIEFDVElPTl9DT01NSVQgPSAzLAorICAgICAgICBBQ1RJT05f
RFJBVyA9IDQKKyAgICB9OworICAgIEFjdGlvbiBnZXROZXh0QWN0aW9uKGJvb2wgaW5zaWRlVlN5
bmNUaWNrKSBjb25zdDsKKyAgICB2b2lkIHVwZGF0ZVN0YXRlKEFjdGlvbik7CisKKyAgICBlbnVt
IElucHV0IHsKKyAgICAgICAgSU5QVVRfU0VUX05FRURTX1JFRFJBVyA9IDEsCisgICAgICAgIElO
UFVUX1NFVF9ORUVEU19DT01NSVQgPSAyLAorICAgICAgICBJTlBVVF9GUkFNRV9DT01QTEVURSA9
IDMsCisgICAgICAgIElOUFVUX1VQREFURV9SRVNPVVJDRVNfQ09NUExFVEUgPSA0LAorICAgICAg
ICBJTlBVVF9DT01NSVRfQ09NUExFVEUgPSA1LAorICAgICAgICBJTlBVVF9EUkFXX0NPTVBMRVRF
ID0gNgorICAgIH07CisKKyAgICB2b2lkIHVwZGF0ZVN0YXRlKElucHV0KTsKKworcHJvdGVjdGVk
OgorICAgIENvbW1pdFN0YXRlIG1fY29tbWl0U3RhdGU7CisKKyAgICBib29sIG1fbmVlZHNSZWRy
YXc7CisgICAgYm9vbCBtX25lZWRzQ29tbWl0OworICAgIGJvb2wgbV91cGRhdGVkVGhpc0ZyYW1l
OworfTsKKworfQorCisjZW5kaWYgLy8gQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVfaApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaSBiL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vV2ViS2l0Lmd5cGkKaW5kZXggOTFlZGU0YTU5NzdkZmE3MGVmMzA0OGVlYmU0YWY1
OGRjNTc2ZWJiNy4uZjhlNDUwYWYzMmQ0MzBjMDY3MDIxMjdkYWFkZTlhOGE4NjZmMTM2YyAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaQorKysgYi9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpCkBAIC01OSw2ICs1OSw3IEBACiAgICAgICAgICAg
ICAndGVzdHMvQ0NMYXllclRyZWVIb3N0SW1wbFRlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0
cy9DQ0xheWVyVHJlZUhvc3RUZXN0LmNwcCcsCiAgICAgICAgICAgICAndGVzdHMvQ0NTY2hlZHVs
ZXJUZXN0LmNwcCcsCisgICAgICAgICAgICAndGVzdHMvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVU
ZXN0LmNwcCcsCiAgICAgICAgICAgICAndGVzdHMvQ0NUaHJlYWRUYXNrVGVzdC5jcHAnLAogICAg
ICAgICAgICAgJ3Rlc3RzL0NDVGhyZWFkVGVzdC5jcHAnLAogICAgICAgICAgICAgJ3Rlc3RzL0Zy
YW1lVGVzdEhlbHBlcnMuY3BwJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
dGVzdHMvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVUZXN0LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vdGVzdHMvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVUZXN0LmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi42
Y2M4NDI1MjU3MTJhMDM5ZmQxYzBlNDdkOWU5MzM1YWI5NDFhNGRiCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZVRl
c3QuY3BwCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpbmNsdWRlICJjYy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZS5oIgorCisjaW5jbHVk
ZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXVEY7Cit1c2luZyBu
YW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ0NTY2hlZHVsZXJTdGF0
ZU1hY2hpbmU6OkNvbW1pdFN0YXRlIGFsbENvbW1pdFN0YXRlc1tdID0geworICAgIENDU2NoZWR1
bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfSURMRSwKKyAgICBDQ1NjaGVkdWxlclN0YXRl
TWFjaGluZTo6Q09NTUlUX1NUQVRFX0ZSQU1FX0lOX1BST0dSRVNTLAorICAgIENDU2NoZWR1bGVy
U3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfVVBEQVRJTkdfUkVTT1VSQ0VTLAorICAgIENDU2No
ZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfUkVBRFlfVE9fQ09NTUlUCit9OworCisv
KiBFeHBvc2VzIHRoZSBwcm90ZWN0ZWQgc3RhdGUgZmllbGRzIG9mIHRoZSBDQ1NjaGVkdWxlclN0
YXRlTWFjaGluZSBmb3IgdGVzdGluZyAqLworY2xhc3MgU3RhdGVNYWNoaW5lIDogcHVibGljIEND
U2NoZWR1bGVyU3RhdGVNYWNoaW5lIHsKK3B1YmxpYzoKKyAgICBTdGF0ZU1hY2hpbmUmIHNldENv
bW1pdFN0YXRlKENvbW1pdFN0YXRlIGNzKSB7IG1fY29tbWl0U3RhdGUgPSBjczsgcmV0dXJuICp0
aGlzOyB9CisgICAgQ29tbWl0U3RhdGUgY29tbWl0U3RhdGUoKSBjb25zdCB7IHJldHVybiAgbV9j
b21taXRTdGF0ZTsgfQorCisgICAgU3RhdGVNYWNoaW5lJiBzZXROZWVkc0NvbW1pdChib29sIGIp
IHsgbV9uZWVkc0NvbW1pdCA9IGI7IHJldHVybiAqdGhpczsgfQorICAgIGJvb2wgbmVlZHNDb21t
aXQoKSBjb25zdCB7IHJldHVybiBtX25lZWRzQ29tbWl0OyB9CisKKyAgICBTdGF0ZU1hY2hpbmUm
IHNldE5lZWRzUmVkcmF3KGJvb2wgYikgeyBtX25lZWRzUmVkcmF3ID0gYjsgcmV0dXJuICp0aGlz
OyB9CisgICAgYm9vbCBuZWVkc1JlZHJhdygpIGNvbnN0IHsgcmV0dXJuIG1fbmVlZHNSZWRyYXc7
IH0KKworICAgIFN0YXRlTWFjaGluZSYgc2V0VXBkYXRlZFRoaXNGcmFtZShib29sIGIpIHsgbV91
cGRhdGVkVGhpc0ZyYW1lID0gYjsgcmV0dXJuICp0aGlzOyB9CisgICAgYm9vbCB1cGRhdGVkVGhp
c0ZyYW1lKCkgY29uc3QgeyByZXR1cm4gbV91cGRhdGVkVGhpc0ZyYW1lOyB9Cit9OworCitURVNU
KENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lVGVzdCwgVGVzdE5leHRBY3Rpb25CZWdpbnNGcmFtZUlm
TmVlZGVkKQoreworICAgIFN0YXRlTWFjaGluZSBzdGF0ZTsKKyAgICAvLyBJZiBubyBjb21taXQg
bmVlZGVkLCBkbyBub3RoaW5nCisgICAgc3RhdGUgPSBTdGF0ZU1hY2hpbmUoKQorICAgICAgICAg
ICAgLnNldENvbW1pdFN0YXRlKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVf
SURMRSkKKyAgICAgICAgICAgIC5zZXROZWVkc1JlZHJhdyhmYWxzZSkKKyAgICAgICAgICAgIC5z
ZXROZWVkc0NvbW1pdChmYWxzZSkKKyAgICAgICAgICAgIC5zZXRVcGRhdGVkVGhpc0ZyYW1lKGZh
bHNlKTsKKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9OT05F
LCBzdGF0ZS5nZXROZXh0QWN0aW9uKGZhbHNlKSk7CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVy
U3RhdGVNYWNoaW5lOjpBQ1RJT05fTk9ORSwgc3RhdGUuZ2V0TmV4dEFjdGlvbih0cnVlKSk7CisK
KyAgICAvLyBJZiBjb21taXQgcmVxdWVzdGVkLCBiZWdpbiBhIGZyYW1lCisgICAgc3RhdGUgPSBT
dGF0ZU1hY2hpbmUoKQorICAgICAgICAgICAgLnNldENvbW1pdFN0YXRlKENDU2NoZWR1bGVyU3Rh
dGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfSURMRSkKKyAgICAgICAgICAgIC5zZXROZWVkc1JlZHJh
dyhmYWxzZSkKKyAgICAgICAgICAgIC5zZXROZWVkc0NvbW1pdCh0cnVlKQorICAgICAgICAgICAg
LnNldFVwZGF0ZWRUaGlzRnJhbWUoZmFsc2UpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0
YXRlTWFjaGluZTo6QUNUSU9OX0JFR0lOX0ZSQU1FLCBzdGF0ZS5nZXROZXh0QWN0aW9uKGZhbHNl
KSk7CisKKyAgICAvLyBCZWdpbiB0aGUgZnJhbWUsIG1ha2Ugc3VyZSBuZWVkc0NvbW1pdCBhbmQg
Y29tbWl0U3RhdGUgdXBkYXRlIGNvcnJlY3RseS4KKyAgICBzdGF0ZS51cGRhdGVTdGF0ZShDQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0JFR0lOX0ZSQU1FKTsKKyAgICBFWFBFQ1RfRVEo
Q0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNPTU1JVF9TVEFURV9GUkFNRV9JTl9QUk9HUkVTUywg
c3RhdGUuY29tbWl0U3RhdGUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXRlLm5lZWRzQ29tbWl0
KCkpOworfQorCitURVNUKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lVGVzdCwgVGVzdE5leHRBY3Rp
b25EcmF3c09uVlN5bmMpCit7CisgICAgLy8gV2hlbiBub3Qgb24gdnN5bmMsIGRvbid0IGRyYXcK
KyAgICBzaXplX3QgbnVtQ29tbWl0U3RhdGVzID0gc2l6ZW9mKGFsbENvbW1pdFN0YXRlcykgLyBz
aXplb2YoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNvbW1pdFN0YXRlKTsKKyAgICBmb3IgKHNp
emVfdCBpID0gMDsgaSA8IG51bUNvbW1pdFN0YXRlczsgKytpKSB7CisgICAgICAgIFN0YXRlTWFj
aGluZSBzdGF0ZTsKKyAgICAgICAgc3RhdGUuc2V0Q29tbWl0U3RhdGUoYWxsQ29tbWl0U3RhdGVz
W2ldKTsKKyAgICAgICAgc3RhdGUuc2V0TmVlZHNSZWRyYXcodHJ1ZSk7CisKKyAgICAgICAgRVhQ
RUNUX05FKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fRFJBVywgc3RhdGUuc2V0TmVl
ZHNDb21taXQoZmFsc2UpLnNldFVwZGF0ZWRUaGlzRnJhbWUoZmFsc2UpLmdldE5leHRBY3Rpb24o
ZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX05FKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJ
T05fRFJBVywgc3RhdGUuc2V0TmVlZHNDb21taXQoZmFsc2UpLnNldFVwZGF0ZWRUaGlzRnJhbWUo
dHJ1ZSkuZ2V0TmV4dEFjdGlvbihmYWxzZSkpOworICAgICAgICBFWFBFQ1RfTkUoQ0NTY2hlZHVs
ZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9EUkFXLCBzdGF0ZS5zZXROZWVkc0NvbW1pdCh0cnVlKS5z
ZXRVcGRhdGVkVGhpc0ZyYW1lKGZhbHNlKS5nZXROZXh0QWN0aW9uKGZhbHNlKSk7CisgICAgICAg
IEVYUEVDVF9ORShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0RSQVcsIHN0YXRlLnNl
dE5lZWRzQ29tbWl0KHRydWUpLnNldFVwZGF0ZWRUaGlzRnJhbWUodHJ1ZSkuZ2V0TmV4dEFjdGlv
bihmYWxzZSkpOworICAgIH0KKworICAgIC8vIFdoZW4gb24gdnN5bmMsIHlvdSBzaG91bGQgYWx3
YXlzIGRyYXcuIEV4cGVjdCBpZiB5b3UncmUgcmVhZHkgdG8gY29tbWl0LCBpbiB3aGljaCBjYXNl
IGNvbW1pdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUNvbW1pdFN0YXRlczsgKytp
KSB7CisgICAgICAgIFN0YXRlTWFjaGluZSBzdGF0ZTsKKyAgICAgICAgc3RhdGUuc2V0Q29tbWl0
U3RhdGUoYWxsQ29tbWl0U3RhdGVzW2ldKTsKKyAgICAgICAgc3RhdGUuc2V0TmVlZHNSZWRyYXco
dHJ1ZSk7CisgICAgICAgIENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBY3Rpb24gZXhwZWN0ZWQ7
CisgICAgICAgIGlmIChhbGxDb21taXRTdGF0ZXNbaV0gIT0gQ0NTY2hlZHVsZXJTdGF0ZU1hY2hp
bmU6OkNPTU1JVF9TVEFURV9SRUFEWV9UT19DT01NSVQpCisgICAgICAgICAgICBleHBlY3RlZCA9
IENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fRFJBVzsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgZXhwZWN0ZWQgPSBDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0NPTU1J
VDsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkLCBzdGF0ZS5zZXROZWVkc0NvbW1pdChmYWxz
ZSkuc2V0VXBkYXRlZFRoaXNGcmFtZShmYWxzZSkuZ2V0TmV4dEFjdGlvbih0cnVlKSk7CisgICAg
ICAgIEVYUEVDVF9FUShleHBlY3RlZCwgc3RhdGUuc2V0TmVlZHNDb21taXQoZmFsc2UpLnNldFVw
ZGF0ZWRUaGlzRnJhbWUodHJ1ZSkuZ2V0TmV4dEFjdGlvbih0cnVlKSk7CisgICAgICAgIEVYUEVD
VF9FUShleHBlY3RlZCwgc3RhdGUuc2V0TmVlZHNDb21taXQodHJ1ZSkuc2V0VXBkYXRlZFRoaXNG
cmFtZShmYWxzZSkuZ2V0TmV4dEFjdGlvbih0cnVlKSk7CisgICAgICAgIEVYUEVDVF9FUShleHBl
Y3RlZCwgc3RhdGUuc2V0TmVlZHNDb21taXQodHJ1ZSkuc2V0VXBkYXRlZFRoaXNGcmFtZSh0cnVl
KS5nZXROZXh0QWN0aW9uKHRydWUpKTsKKyAgICB9Cit9CisKK1RFU1QoQ0NTY2hlZHVsZXJTdGF0
ZU1hY2hpbmVUZXN0LCBUZXN0VXBkYXRlc1Jlc291cmNlc09uY2VQZXJGcmFtZSkKK3sKKyAgICAv
LyBXaGVuIG5vIHJlZHJhdyBpcyBuZWVkZWQgLS0tIHVwZGF0ZSB1bnRpbCBkb25lCisgICAgewor
ICAgICAgICBTdGF0ZU1hY2hpbmUgc3RhdGU7CisgICAgICAgIHN0YXRlLnNldENvbW1pdFN0YXRl
KENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfVVBEQVRJTkdfUkVTT1VSQ0VT
KTsKKyAgICAgICAgc3RhdGUuc2V0TmVlZHNSZWRyYXcoZmFsc2UpOworICAgICAgICBzdGF0ZS5z
ZXRVcGRhdGVkVGhpc0ZyYW1lKGZhbHNlKTsKKyAgICAgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVy
U3RhdGVNYWNoaW5lOjpBQ1RJT05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTLCBzdGF0ZS5nZXROZXh0
QWN0aW9uKGZhbHNlKSk7CisgICAgICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGlu
ZTo6QUNUSU9OX1VQREFURV9NT1JFX1JFU09VUkNFUywgc3RhdGUuZ2V0TmV4dEFjdGlvbih0cnVl
KSk7CisgICAgfQorCisgICAgLy8gT25jZSB3ZSB1cGRhdGUgcmVzb3VyY2VzLCBkb24ndCBkbyBp
dCBhZ2FpbiB1bnRpbCBhIGRyYXcKKyAgICB7CisgICAgICAgIFN0YXRlTWFjaGluZSBzdGF0ZTsK
KyAgICAgICAgc3RhdGUuc2V0Q29tbWl0U3RhdGUoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNP
TU1JVF9TVEFURV9VUERBVElOR19SRVNPVVJDRVMpOworICAgICAgICBzdGF0ZS5zZXROZWVkc1Jl
ZHJhdyh0cnVlKTsKKyAgICAgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpB
Q1RJT05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTLCBzdGF0ZS5nZXROZXh0QWN0aW9uKGZhbHNlKSk7
CisgICAgICAgIHN0YXRlLnVwZGF0ZVN0YXRlKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJ
T05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTKTsKKyAgICAgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVy
U3RhdGVNYWNoaW5lOjpBQ1RJT05fTk9ORSwgc3RhdGUuZ2V0TmV4dEFjdGlvbihmYWxzZSkpOwor
CisgICAgICAgIC8vIG9uY2Ugd2UndmUgZHJhd24gYWdhaW4sIGl0IHNob3VsZCBhbGxvdyB1cyB0
byB1cGRhdGUgKHJlZ2FyZGxlc3Mgb2YgdnN5bmMgc3RhdGUpCisgICAgICAgIEVYUEVDVF9FUShD
Q1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0RSQVcsIHN0YXRlLmdldE5leHRBY3Rpb24o
dHJ1ZSkpOworICAgICAgICBzdGF0ZS51cGRhdGVTdGF0ZShDQ1NjaGVkdWxlclN0YXRlTWFjaGlu
ZTo6QUNUSU9OX0RSQVcpOworCisgICAgICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFj
aGluZTo6QUNUSU9OX1VQREFURV9NT1JFX1JFU09VUkNFUywgc3RhdGUuZ2V0TmV4dEFjdGlvbih0
cnVlKSk7CisgICAgICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9O
X1VQREFURV9NT1JFX1JFU09VUkNFUywgc3RhdGUuZ2V0TmV4dEFjdGlvbihmYWxzZSkpOworICAg
IH0KK30KKworVEVTVChDQ1NjaGVkdWxlclN0YXRlTWFjaGluZVRlc3QsIFRlc3RTZXROZWVkc0Nv
bW1pdElzbnRMb3N0KQoreworICAgIFN0YXRlTWFjaGluZSBzdGF0ZTsKKyAgICBzdGF0ZS51cGRh
dGVTdGF0ZShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6SU5QVVRfU0VUX05FRURTX0NPTU1JVCk7
CisKKyAgICAvLyBCZWdpbiB0aGUgZnJhbWUuCisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3Rh
dGVNYWNoaW5lOjpBQ1RJT05fQkVHSU5fRlJBTUUsIHN0YXRlLmdldE5leHRBY3Rpb24oZmFsc2Up
KTsKKyAgICBzdGF0ZS51cGRhdGVTdGF0ZShzdGF0ZS5nZXROZXh0QWN0aW9uKGZhbHNlKSk7Cisg
ICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfRlJBTUVf
SU5fUFJPR1JFU1MsIHN0YXRlLmNvbW1pdFN0YXRlKCkpOworCisgICAgLy8gTm93LCB3aGlsZSB0
aGUgZnJhbWUgaXMgaW4gcHJvZ3Jlc3MsIHNldCBhbm90aGVyIGNvbW1pdC4KKyAgICBzdGF0ZS51
cGRhdGVTdGF0ZShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6SU5QVVRfU0VUX05FRURTX0NPTU1J
VCk7CisgICAgRVhQRUNUX1RSVUUoc3RhdGUubmVlZHNDb21taXQoKSk7CisKKyAgICAvLyBMZXQg
dGhlIGZyYW1lIGZpbmlzaC4KKyAgICBzdGF0ZS51cGRhdGVTdGF0ZShDQ1NjaGVkdWxlclN0YXRl
TWFjaGluZTo6SU5QVVRfRlJBTUVfQ09NUExFVEUpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxl
clN0YXRlTWFjaGluZTo6Q09NTUlUX1NUQVRFX1VQREFUSU5HX1JFU09VUkNFUywgc3RhdGUuY29t
bWl0U3RhdGUoKSk7CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJ
T05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTLCBzdGF0ZS5nZXROZXh0QWN0aW9uKGZhbHNlKSk7Cisg
ICAgc3RhdGUudXBkYXRlU3RhdGUoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9VUERB
VEVfTU9SRV9SRVNPVVJDRVMpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGlu
ZTo6QUNUSU9OX05PTkUsIHN0YXRlLmdldE5leHRBY3Rpb24oZmFsc2UpKTsKKyAgICBzdGF0ZS51
cGRhdGVTdGF0ZShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6SU5QVVRfVVBEQVRFX1JFU09VUkNF
U19DT01QTEVURSk7CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01N
SVRfU1RBVEVfUkVBRFlfVE9fQ09NTUlULCBzdGF0ZS5jb21taXRTdGF0ZSgpKTsKKyAgICBFWFBF
Q1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9DT01NSVQsIHN0YXRlLmdldE5l
eHRBY3Rpb24oZmFsc2UpKTsKKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6
OkFDVElPTl9DT01NSVQsIHN0YXRlLmdldE5leHRBY3Rpb24odHJ1ZSkpOworICAgIHN0YXRlLnVw
ZGF0ZVN0YXRlKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fQ09NTUlUKTsKKyAgICBF
WFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNPTU1JVF9TVEFURV9JRExFLCBzdGF0
ZS5jb21taXRTdGF0ZSgpKTsKKworICAgIC8vIHZlcmlmeSB0aGF0IGFub3RoZXIgY29tbWl0IHdp
bGwgYmVnaW4KKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9C
RUdJTl9GUkFNRSwgc3RhdGUuZ2V0TmV4dEFjdGlvbihmYWxzZSkpOworfQorCitURVNUKENDU2No
ZWR1bGVyU3RhdGVNYWNoaW5lVGVzdCwgVGVzdEZ1bGxDeWNsZSkKK3sKKyAgICBTdGF0ZU1hY2hp
bmUgc3RhdGU7CisKKyAgICAvLyBTdGFydCBjbGVhbiBhbmQgc2V0IGNvbW1pdC4KKyAgICBzdGF0
ZS5zZXROZWVkc0NvbW1pdCh0cnVlKTsKKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1h
Y2hpbmU6OkFDVElPTl9CRUdJTl9GUkFNRSwgc3RhdGUuZ2V0TmV4dEFjdGlvbihmYWxzZSkpOwor
CisgICAgLy8gQmVnaW4gdGhlIGZyYW1lLgorICAgIHN0YXRlLnVwZGF0ZVN0YXRlKENDU2NoZWR1
bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fQkVHSU5fRlJBTUUpOworICAgIEVYUEVDVF9FUShDQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZTo6Q09NTUlUX1NUQVRFX0ZSQU1FX0lOX1BST0dSRVNTLCBzdGF0
ZS5jb21taXRTdGF0ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uoc3RhdGUubmVlZHNDb21taXQoKSk7
CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fTk9ORSwgc3Rh
dGUuZ2V0TmV4dEFjdGlvbihmYWxzZSkpOworCisgICAgLy8gVGVsbCB0aGUgc2NoZWR1bGVyIHRo
ZSBmcmFtZSBmaW5pc2hlZC4KKyAgICBzdGF0ZS51cGRhdGVTdGF0ZShDQ1NjaGVkdWxlclN0YXRl
TWFjaGluZTo6SU5QVVRfRlJBTUVfQ09NUExFVEUpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxl
clN0YXRlTWFjaGluZTo6Q09NTUlUX1NUQVRFX1VQREFUSU5HX1JFU09VUkNFUywgc3RhdGUuY29t
bWl0U3RhdGUoKSk7CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJ
T05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTLCBzdGF0ZS5nZXROZXh0QWN0aW9uKGZhbHNlKSk7CisK
KyAgICAvLyBUZWxsIHRoZSBzY2hlZHVsZXIgdGhlIHVwZGF0ZSBpcyBkb25lLgorICAgIHN0YXRl
LnVwZGF0ZVN0YXRlKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpJTlBVVF9VUERBVEVfUkVTT1VS
Q0VTX0NPTVBMRVRFKTsKKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNP
TU1JVF9TVEFURV9SRUFEWV9UT19DT01NSVQsIHN0YXRlLmNvbW1pdFN0YXRlKCkpOworICAgIEVY
UEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0NPTU1JVCwgc3RhdGUuZ2V0
TmV4dEFjdGlvbihmYWxzZSkpOworCisgICAgLy8gQ29tbWl0LgorICAgIHN0YXRlLnVwZGF0ZVN0
YXRlKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fQ09NTUlUKTsKKyAgICBFWFBFQ1Rf
RVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNPTU1JVF9TVEFURV9JRExFLCBzdGF0ZS5jb21t
aXRTdGF0ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShzdGF0ZS5uZWVkc1JlZHJhdygpKTsKKworICAg
IC8vIEV4cGVjdCB0byBkbyBub3RoaW5nIHVudGlsIHZzeW5jLgorICAgIEVYUEVDVF9FUShDQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX05PTkUsIHN0YXRlLmdldE5leHRBY3Rpb24oZmFs
c2UpKTsKKworICAgIC8vIEF0IHZzeW5jLCBkcmF3LgorICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxl
clN0YXRlTWFjaGluZTo6QUNUSU9OX0RSQVcsIHN0YXRlLmdldE5leHRBY3Rpb24odHJ1ZSkpOwor
ICAgIHN0YXRlLnVwZGF0ZVN0YXRlKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fRFJB
Vyk7CisKKyAgICAvLyBTaG91bGQgYmUgc3luY2hyb25pemVkLCBubyBkcmF3IG5lZWRlZCwgbm8g
YWN0aW9uIG5lZWRlZC4KKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNP
TU1JVF9TVEFURV9JRExFLCBzdGF0ZS5jb21taXRTdGF0ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0Uo
c3RhdGUubmVlZHNSZWRyYXcoKSk7CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNo
aW5lOjpBQ1RJT05fTk9ORSwgc3RhdGUuZ2V0TmV4dEFjdGlvbihmYWxzZSkpOworfQorCitURVNU
KENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lVGVzdCwgVGVzdEZ1bGxDeWNsZVdpdGhDb21taXRSZXF1
ZXN0SW5iZXR3ZWVuKQoreworfQorCitURVNUKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lVGVzdCwg
VGVzdEZ1bGxDeWNsZVdpdGhSZWRyYXdJbmJldHdlZW4pCit7Cit9CisKK30K
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>112448</attachid>
            <date>2011-10-25 21:54:09 -0700</date>
            <delta_ts>2011-10-25 23:01:51 -0700</delta_ts>
            <desc>input enum -&gt; real functions</desc>
            <filename>bug-70714-20111025215408.patch</filename>
            <type>text/plain</type>
            <size>24655</size>
            <attacher name="Nat Duca">nduca</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogOTg0MDkKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJDb3JlL0NoYW5nZUxvZwppbmRleCBjN2EzZjNlOGVkMjFjMzA0
N2IwZTQ2YmYwZWNmMjQ1OTI4YjgxNjJiLi5kODkwNzQ1MDEzMzVjM2JhYWE1N2Q3MjIzYjk3NzFh
NDIxODNjMzRmIDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKKysrIGIvU291
cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjMgQEAKKzIwMTEtMTAtMjQgIE5hdCBE
dWNhICA8bmR1Y2FAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0gRW5jYXBzdWxh
dGUgc3RhdGUgbWFjaGluZSBwYXJ0cyBvZiBzY2hlZHVsaW5nIGluIENDU2NoZWR1bGVyU3RhdGVN
YWNoaW5lCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD03
MDcxNAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICog
V2ViQ29yZS5neXBpOgorICAgICAgICAqIHBsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0ND
U2NoZWR1bGVyU3RhdGVNYWNoaW5lLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpDQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZTo6bmV4dEFjdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpDQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZTo6dXBkYXRlU3RhdGUpOgorICAgICAgICAqIHBsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1bGVyU3RhdGVNYWNoaW5lLmg6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZTo6Q0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNDU2NoZWR1bGVyU3RhdGVN
YWNoaW5lKToKKyAgICAgICAgKFdlYkNvcmU6OkNDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpvcGVy
YXRvcj0pOgorICAgICAgICAoV2ViQ29yZTo6Q0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OmNvbW1p
dFBlbmRpbmcpOgorICAgICAgICAoV2ViQ29yZTo6Q0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OnNl
dE5lZWRzUmVkcmF3KToKKyAgICAgICAgKFdlYkNvcmU6OkNDU2NoZWR1bGVyU3RhdGVNYWNoaW5l
OjpzZXROZWVkc0NvbW1pdCk6CisgICAgICAgIChXZWJDb3JlOjpDQ1NjaGVkdWxlclN0YXRlTWFj
aGluZTo6YmVnaW5GcmFtZUNvbXBsZXRlKToKKyAgICAgICAgKFdlYkNvcmU6OkNDU2NoZWR1bGVy
U3RhdGVNYWNoaW5lOjp1cGRhdGVSZXNvdXJjZXNDb21wbGV0ZSk6CisKIDIwMTEtMTAtMjUgIFJ5
b3N1a2UgTml3YSAgPHJuaXdhQHdlYmtpdC5vcmc+CiAKICAgICAgICAgTW92aW5nIHRvIHRoZSBz
dGFydCBvZiBsaW5lIHNob3VsZCBub3QgcGxhY2UgdGhlIGNhcmV0IG91dHNpZGUgb2YgdGhlIHRh
YmxlCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L2Nocm9taXVtL0NoYW5nZUxvZyBiL1NvdXJj
ZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCmluZGV4IDc5N2UzOGE3MmQzMzI0YTM4NzNkZDNi
MzQ0NWZjYmU2MDU4MmMyYTAuLjlkMjQ4NDU1MDMwZTgxODBhZWQxOGFiMmNiZTFkNTUxZGJmNWE1
ODggMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJLaXQvY2hyb21pdW0vQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMjIgQEAKKzIwMTEtMTAt
MjQgIE5hdCBEdWNhICA8bmR1Y2FAY2hyb21pdW0ub3JnPgorCisgICAgICAgIFtjaHJvbWl1bV0g
RW5jYXBzdWxhdGUgc3RhdGUgbWFjaGluZSBwYXJ0cyBvZiBzY2hlZHVsaW5nIGluIENDU2NoZWR1
bGVyU3RhdGVNYWNoaW5lCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVn
LmNnaT9pZD03MDcxNAorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisg
ICAgICAgICogV2ViS2l0Lmd5cGk6CisgICAgICAgICogdGVzdHMvQ0NTY2hlZHVsZXJTdGF0ZU1h
Y2hpbmVUZXN0LmNwcDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlOjpTdGF0ZU1hY2hpbmU6OnNl
dENvbW1pdFN0YXRlKToKKyAgICAgICAgKFdlYkNvcmU6OlN0YXRlTWFjaGluZTo6Y29tbWl0U3Rh
dGUpOgorICAgICAgICAoV2ViQ29yZTo6U3RhdGVNYWNoaW5lOjpzZXROZWVkc0NvbW1pdCk6Cisg
ICAgICAgIChXZWJDb3JlOjpTdGF0ZU1hY2hpbmU6Om5lZWRzQ29tbWl0KToKKyAgICAgICAgKFdl
YkNvcmU6OlN0YXRlTWFjaGluZTo6c2V0TmVlZHNSZWRyYXcpOgorICAgICAgICAoV2ViQ29yZTo6
U3RhdGVNYWNoaW5lOjpuZWVkc1JlZHJhdyk6CisgICAgICAgIChXZWJDb3JlOjpTdGF0ZU1hY2hp
bmU6OnNldFVwZGF0ZWRUaGlzRnJhbWUpOgorICAgICAgICAoV2ViQ29yZTo6U3RhdGVNYWNoaW5l
Ojp1cGRhdGVkVGhpc0ZyYW1lKToKKyAgICAgICAgKFdlYkNvcmU6OlRFU1QpOgorCiAyMDExLTEw
LTI1ICBBbnRvaW5lIExhYm91ciAgPHBpbWFuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBGaXgg
dGVhcmRvd24gaW4gV2ViKkxheWVySW1wbCwgYW5kIGFkZCB0ZXN0cyBmb3IgV2ViKkxheWVyCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9XZWJDb3JlLmd5cGkgYi9Tb3VyY2UvV2ViQ29yZS9X
ZWJDb3JlLmd5cGkKaW5kZXggMGZhOTY5MmU1MDNiNjcwNDM2YmEzYmRlNzgyYTBlM2YwYTA4Y2E4
ZC4uNGU3ZmJkNjFlNDA2YTZmYjRhMjU2MDNjOTI1NmJlNGNjOGY4N2UwMyAxMDA2NDQKLS0tIGEv
U291cmNlL1dlYkNvcmUvV2ViQ29yZS5neXBpCisrKyBiL1NvdXJjZS9XZWJDb3JlL1dlYkNvcmUu
Z3lwaQpAQCAtMzU1Nyw2ICszNTU3LDggQEAKICAgICAgICAgICAgICdwbGF0Zm9ybS9ncmFwaGlj
cy9jaHJvbWl1bS9jYy9DQ1JlbmRlclN1cmZhY2UuaCcsCiAgICAgICAgICAgICAncGxhdGZvcm0v
Z3JhcGhpY3MvY2hyb21pdW0vY2MvQ0NTY2hlZHVsZXIuY3BwJywKICAgICAgICAgICAgICdwbGF0
Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1NjaGVkdWxlci5oJywKKyAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZS5jcHAn
LAorICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1bGVy
U3RhdGVNYWNoaW5lLmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVt
L2NjL0NDU2NvcGVkTWFpblRocmVhZFByb3h5LmgnLAogICAgICAgICAgICAgJ3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDU2Nyb2xsQ29udHJvbGxlci5oJywKICAgICAgICAgICAgICdw
bGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9DQ1NpbmdsZVRocmVhZFByb3h5LmNwcCcsCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFwaGljcy9jaHJvbWl1bS9jYy9D
Q1NjaGVkdWxlclN0YXRlTWFjaGluZS5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9wbGF0Zm9ybS9ncmFw
aGljcy9jaHJvbWl1bS9jYy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZS5jcHAKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
ODM5YTkxMjUzNThhZWE2NjAzNjU4M2Y2YWViY2Y1YWNhNzliYTJkYwotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1
bGVyU3RhdGVNYWNoaW5lLmNwcApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxMSBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09O
VFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgKiBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UgQVJFCisgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
IElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
CisgKiAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KKyAqIEFO
WSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworICogU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworI2lu
Y2x1ZGUgImNvbmZpZy5oIgorCisjaW5jbHVkZSAiY2MvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmUu
aCIKKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QWN0
aW9uIENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpuZXh0QWN0aW9uKGJvb2wgaW5zaWRlVlN5bmNU
aWNrKSBjb25zdAoreworICAgIHN3aXRjaCAobV9jb21taXRTdGF0ZSkgeworICAgIGNhc2UgQ09N
TUlUX1NUQVRFX0lETEU6CisgICAgICAgIGlmIChtX25lZWRzUmVkcmF3ICYmIGluc2lkZVZTeW5j
VGljaykKKyAgICAgICAgICAgIHJldHVybiBBQ1RJT05fRFJBVzsKKyAgICAgICAgaWYgKG1fbmVl
ZHNDb21taXQpCisgICAgICAgICAgICByZXR1cm4gQUNUSU9OX0JFR0lOX0ZSQU1FOworICAgICAg
ICByZXR1cm4gQUNUSU9OX05PTkU7CisKKyAgICBjYXNlIENPTU1JVF9TVEFURV9GUkFNRV9JTl9Q
Uk9HUkVTUzoKKyAgICAgICAgaWYgKG1fbmVlZHNSZWRyYXcgJiYgaW5zaWRlVlN5bmNUaWNrKQor
ICAgICAgICAgICAgcmV0dXJuIEFDVElPTl9EUkFXOworICAgICAgICByZXR1cm4gQUNUSU9OX05P
TkU7CisKKyAgICBjYXNlIENPTU1JVF9TVEFURV9VUERBVElOR19SRVNPVVJDRVM6CisgICAgICAg
IGlmIChtX25lZWRzUmVkcmF3ICYmIGluc2lkZVZTeW5jVGljaykKKyAgICAgICAgICAgIHJldHVy
biBBQ1RJT05fRFJBVzsKKyAgICAgICAgaWYgKCFtX3VwZGF0ZWRUaGlzRnJhbWUpCisgICAgICAg
ICAgICByZXR1cm4gQUNUSU9OX1VQREFURV9NT1JFX1JFU09VUkNFUzsKKyAgICAgICAgcmV0dXJu
IEFDVElPTl9OT05FOworCisgICAgY2FzZSBDT01NSVRfU1RBVEVfUkVBRFlfVE9fQ09NTUlUOgor
ICAgICAgICByZXR1cm4gQUNUSU9OX0NPTU1JVDsKKyAgICB9Cit9CisKK3ZvaWQgQ0NTY2hlZHVs
ZXJTdGF0ZU1hY2hpbmU6OnVwZGF0ZVN0YXRlKEFjdGlvbiBhY3Rpb24pCit7CisgICAgc3dpdGNo
IChhY3Rpb24pIHsKKyAgICBjYXNlIEFDVElPTl9OT05FOgorICAgICAgICByZXR1cm47CisKKyAg
ICBjYXNlIEFDVElPTl9CRUdJTl9GUkFNRToKKyAgICAgICAgbV9jb21taXRTdGF0ZSA9IENPTU1J
VF9TVEFURV9GUkFNRV9JTl9QUk9HUkVTUzsKKyAgICAgICAgbV9uZWVkc0NvbW1pdCA9IGZhbHNl
OworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFDVElPTl9VUERBVEVfTU9SRV9SRVNPVVJD
RVM6CisgICAgICAgIEFTU0VSVChtX2NvbW1pdFN0YXRlID09IENPTU1JVF9TVEFURV9VUERBVElO
R19SRVNPVVJDRVMpOworICAgICAgICAvLyBnZXROZXh0U3RhdGUoKSBpbiBDT01NSVRfU1RBVEVf
VVBEQVRJTkdfUkVTT1VSQ0VTIHdpbGwgb25seSByZXR1cm4KKyAgICAgICAgLy8gQUNUSU9OX1VQ
REFURV9NT1JFX1JFU09VUkNFUyB3aGVuIG1fdXBkYXRlZFRoaXNGcmFtZSBpcyB0cnVlLiBIZXJl
LAorICAgICAgICAvLyBzZXQgbV91cGRhdGVkVGhpc0ZyYW1lIHRvIHRydWUgdG8gcHJldmVudCBh
ZGRpdGlvbmFsCisgICAgICAgIC8vIEFDVElPTl9VUERBVEVfTU9SRV9SRVNPVVJDRVMgZnJvbSBi
ZWluZyBpc3N1ZWQuCisgICAgICAgIC8vIFRoaXMgd2lsbCB0aGVuIGJlIGNsZWFyZWQgYnkgYSBk
cmF3IGFjdGlvbiwgZWZmZWN0aXZlbHkgbGltaXRpbmcgdXMKKyAgICAgICAgLy8gdG8gb25lIEFD
VElPTl9VUERBVEVfTU9SRV9SRVNPVVJDRVMgcGVyIGZyYW1lLgorICAgICAgICBtX3VwZGF0ZWRU
aGlzRnJhbWUgPSB0cnVlOworICAgICAgICByZXR1cm47CisKKyAgICBjYXNlIEFDVElPTl9DT01N
SVQ6CisgICAgICAgIG1fY29tbWl0U3RhdGUgPSBDT01NSVRfU1RBVEVfSURMRTsKKyAgICAgICAg
bV9uZWVkc1JlZHJhdyA9IHRydWU7CisgICAgICAgIHJldHVybjsKKworICAgIGNhc2UgQUNUSU9O
X0RSQVc6CisgICAgICAgIG1fdXBkYXRlZFRoaXNGcmFtZSA9IGZhbHNlOworICAgICAgICBtX25l
ZWRzUmVkcmF3ID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9CisKK3ZvaWQgQ0NT
Y2hlZHVsZXJTdGF0ZU1hY2hpbmU6OnNldE5lZWRzUmVkcmF3KCkKK3sKKyAgICBtX25lZWRzUmVk
cmF3ID0gdHJ1ZTsKK30KKwordm9pZCBDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6c2V0TmVlZHND
b21taXQoKQoreworICAgIG1fbmVlZHNDb21taXQgPSB0cnVlOworfQorCit2b2lkIENDU2NoZWR1
bGVyU3RhdGVNYWNoaW5lOjpiZWdpbkZyYW1lQ29tcGxldGUoKQoreworICAgIEFTU0VSVChtX2Nv
bW1pdFN0YXRlID09IENPTU1JVF9TVEFURV9GUkFNRV9JTl9QUk9HUkVTUyk7CisgICAgbV9jb21t
aXRTdGF0ZSA9IENPTU1JVF9TVEFURV9VUERBVElOR19SRVNPVVJDRVM7Cit9CisKK3ZvaWQgQ0NT
Y2hlZHVsZXJTdGF0ZU1hY2hpbmU6OnVwZGF0ZVJlc291cmNlc0NvbXBsZXRlKCkKK3sKKyAgICBB
U1NFUlQobV9jb21taXRTdGF0ZSA9PSBDT01NSVRfU1RBVEVfVVBEQVRJTkdfUkVTT1VSQ0VTKTsK
KyAgICBtX2NvbW1pdFN0YXRlID0gQ09NTUlUX1NUQVRFX1JFQURZX1RPX0NPTU1JVDsKK30KKwor
fQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvcGxhdGZvcm0vZ3JhcGhpY3MvY2hyb21pdW0v
Y2MvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmUuaCBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dy
YXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1bGVyU3RhdGVNYWNoaW5lLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
YTc2ZTgxYWVlZmYyNDQ5Yzc4Nzk5MTI5NGZhNWZlNWRlNTYxNDEyYQotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL3BsYXRmb3JtL2dyYXBoaWNzL2Nocm9taXVtL2NjL0NDU2NoZWR1
bGVyU3RhdGVNYWNoaW5lLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTEgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuICBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBBTkQgSVRTIENPTlRS
SUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAorICogV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ
T1NFIEFSRQorICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUiBJ
VFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwor
ICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOworICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCisgKiBBTlkg
VEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAqIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKyNpZm5k
ZWYgQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVfaAorI2RlZmluZSBDQ1NjaGVkdWxlclN0YXRlTWFj
aGluZV9oCisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLy8gVGhlIENDU2NoZWR1bGVyU3RhdGVN
YWNoaW5lIGRlY2lkZXMgaG93IHRvIGNvb3JkaW5hdGVzIG1haW4gdGhyZWFkIGFjdGl2aXRlcwor
Ly8gbGlrZSBwYWludGluZy9ydW5uaW5nIGphdmFzY3JpcHQgd2l0aCByZW5kZXJpbmcgYW5kIGlu
cHV0IGFjdGl2aXRpZXMgb24gdGhlCisvLyBpbXBsIHRocmVhZC4KKy8vCisvLyBUaGUgc3RhdGUg
bWFjaGluZSB0cmFja3MgaW50ZXJuYWwgc3RhdGUgYnV0IGlzIGFsc28gaW5mbHVlbmNlZCBieSBl
eHRlcm5hbCBzdGF0ZS4KKy8vIEludGVybmFsIHN0YXRlIGluY2x1ZGVzIHRoaW5ncyBsaWtlIHdo
ZXRoZXIgYSBmcmFtZSBoYXMgYmVlbiByZXF1ZXN0ZWQsIHdoaWxlCisvLyBleHRlcm5hbCBzdGF0
ZSBpbmNsdWRlcyB0aGluZ3MgbGlrZSB0aGUgY3VycmVudCB0aW1lIGJlaW5nIG5lYXIgdG8gdGhl
IHZibGFuayB0aW1lLgorLy8KKy8vIFRoZSBzY2hlZHVsZXIgc2VwZXJhdGVzICJ3aGF0IHRvIGRv
IG5leHQiIGZyb20gdGhlIHVwZGF0aW5nIG9mIGl0cyBpbnRlcm5hbCBzdGF0ZSB0bworLy8gbWFr
ZSB0ZXN0aW5nIGNsZWFuZXIuCitjbGFzcyBDQ1NjaGVkdWxlclN0YXRlTWFjaGluZSB7CitwdWJs
aWM6CisgICAgQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmUoKQorICAgICAgICAgICAgOiBtX2NvbW1p
dFN0YXRlKENPTU1JVF9TVEFURV9JRExFKQorICAgICAgICAgICAgLCBtX25lZWRzUmVkcmF3KGZh
bHNlKQorICAgICAgICAgICAgLCBtX25lZWRzQ29tbWl0KGZhbHNlKQorICAgICAgICAgICAgLCBt
X3VwZGF0ZWRUaGlzRnJhbWUoZmFsc2UpIHsgfQorICAgIENDU2NoZWR1bGVyU3RhdGVNYWNoaW5l
KGNvbnN0IENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lJiB0aGF0KSB7ICp0aGlzID0gdGhhdDsgfQor
ICAgIENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lJiBvcGVyYXRvcj0oY29uc3QgQ0NTY2hlZHVsZXJT
dGF0ZU1hY2hpbmUmIHRoYXQpCisgICAgeworICAgICAgICBtX2NvbW1pdFN0YXRlID0gdGhhdC5t
X2NvbW1pdFN0YXRlOworICAgICAgICBtX25lZWRzUmVkcmF3ID0gdGhhdC5tX25lZWRzUmVkcmF3
OworICAgICAgICBtX25lZWRzQ29tbWl0ID0gdGhhdC5tX25lZWRzQ29tbWl0OworICAgICAgICBt
X3VwZGF0ZWRUaGlzRnJhbWUgPSB0aGF0Lm1fdXBkYXRlZFRoaXNGcmFtZTsKKyAgICAgICAgcmV0
dXJuICp0aGlzOworICAgIH0KKworICAgIGVudW0gQ29tbWl0U3RhdGUgeworICAgICAgICBDT01N
SVRfU1RBVEVfSURMRSA9IDAsCisgICAgICAgIENPTU1JVF9TVEFURV9GUkFNRV9JTl9QUk9HUkVT
UyA9IDEsCisgICAgICAgIENPTU1JVF9TVEFURV9VUERBVElOR19SRVNPVVJDRVMgPSAyLAorICAg
ICAgICBDT01NSVRfU1RBVEVfUkVBRFlfVE9fQ09NTUlUID0gMywKKyAgICB9OworCisgICAgYm9v
bCBjb21taXRQZW5kaW5nKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtX2NvbW1pdFN0
YXRlICE9IENPTU1JVF9TVEFURV9JRExFOworICAgIH0KKworICAgIGVudW0gQWN0aW9uIHsKKyAg
ICAgICAgQUNUSU9OX05PTkUgPSAwLAorICAgICAgICBBQ1RJT05fQkVHSU5fRlJBTUUgPSAxLAor
ICAgICAgICBBQ1RJT05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTID0gMiwKKyAgICAgICAgQUNUSU9O
X0NPTU1JVCA9IDMsCisgICAgICAgIEFDVElPTl9EUkFXID0gNAorICAgIH07CisgICAgQWN0aW9u
IG5leHRBY3Rpb24oYm9vbCBpbnNpZGVWU3luY1RpY2spIGNvbnN0OworICAgIHZvaWQgdXBkYXRl
U3RhdGUoQWN0aW9uKTsKKworICAgIC8vIEluZGljYXRlcyB0aGF0IGEgcmVkcmF3IGlzIHJlcXVp
cmVkLCBlaXRoZXIgZHVlIHRvIHRoZSBpbXBsIHRyZWUgY2hhbmdpbmcKKyAgICAvLyBvciB0aGUg
c2NyZWVuIGJlaW5nIGRhbWFnZWQgYW5kIHNpbXBseSBuZWVkaW5nIHJlZGlzcGxheS4KKyAgICB2
b2lkIHNldE5lZWRzUmVkcmF3KCk7CisKKyAgICAvLyBJbmRpY2F0ZXMgdGhhdCBhIG5ldyBjb21t
aXQgZmxvdyBuZWVkcyB0byBiZSBwZXJmb3JtZWQsIGVpdGhlciB0byBwdWxsCisgICAgLy8gdXBk
YXRlcyBmcm9tIHRoZSBtYWluIHRocmVhZCB0byB0aGUgaW1wbCwgb3IgdG8gcHVzaCBkZWx0YXMg
ZnJvbSB0aGUgaW1wbAorICAgIC8vIHRocmVhZCB0byBtYWluLgorICAgIHZvaWQgc2V0TmVlZHND
b21taXQoKTsKKworICAgIC8vIENhbGwgdGhpcyBvbmx5IGluIHJlc3BvbnNlIHRvIHJlY2Vpdmlu
ZyBhbiBBQ1RJT05fQkVHSU5fRlJBTUUKKyAgICAvLyBmcm9tIG5leHRTdGF0ZS4gSW5kaWNhdGVz
IHRoYXQgYWxsIHBhaW50aW5nIGlzIGNvbXBsZXRlIGFuZCB0aGF0CisgICAgLy8gdXBkYXRpbmcg
b2YgY29tcG9zaXRvciByZXNvdXJjZXMgY2FuIGJlZ2luLgorICAgIHZvaWQgYmVnaW5GcmFtZUNv
bXBsZXRlKCk7CisKKyAgICAvLyBDYWxsIHRoaXMgb25seSBpbiByZXNwb25zZSB0byByZWNlaXZp
bmcgYW4gQUNUSU9OX1VQREFURV9NT1JFX1JFU09VUkNFUworICAgIC8vIGZyb20gbmV4dFN0YXRl
LiBJbmRpY2F0ZXN0IHRoYXQgYWxsIHJlc291Y2VzIGhhdmUgYmVlbiB1cGRhdGVkIGFuZCB0aGF0
CisgICAgLy8gdGhlIG1haW4gdGhyZWFkIHRyZWUgY2FuIGJlIGNvbW1pdHRlZCB0byB0aGUgaW1w
bCB0cmVlLgorICAgIHZvaWQgdXBkYXRlUmVzb3VyY2VzQ29tcGxldGUoKTsKKworcHJvdGVjdGVk
OgorICAgIENvbW1pdFN0YXRlIG1fY29tbWl0U3RhdGU7CisKKyAgICBib29sIG1fbmVlZHNSZWRy
YXc7CisgICAgYm9vbCBtX25lZWRzQ29tbWl0OworICAgIGJvb2wgbV91cGRhdGVkVGhpc0ZyYW1l
OworfTsKKworfQorCisjZW5kaWYgLy8gQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVfaApkaWZmIC0t
Z2l0IGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaSBiL1NvdXJjZS9XZWJLaXQv
Y2hyb21pdW0vV2ViS2l0Lmd5cGkKaW5kZXggMWExMTFkMWM0MDVlMzM5ZTFjZGYwOGNkODkwOGFl
MmI3MjQ3MDdlYy4uOTUwNDY4ZGI2NmQwMzRiYzAxNGFiNzJiODRkZDA2MjU0Nzk1ZTkxZSAxMDA2
NDQKLS0tIGEvU291cmNlL1dlYktpdC9jaHJvbWl1bS9XZWJLaXQuZ3lwaQorKysgYi9Tb3VyY2Uv
V2ViS2l0L2Nocm9taXVtL1dlYktpdC5neXBpCkBAIC01OSw2ICs1OSw3IEBACiAgICAgICAgICAg
ICAndGVzdHMvQ0NMYXllclRyZWVIb3N0SW1wbFRlc3QuY3BwJywKICAgICAgICAgICAgICd0ZXN0
cy9DQ0xheWVyVHJlZUhvc3RUZXN0LmNwcCcsCiAgICAgICAgICAgICAndGVzdHMvQ0NTY2hlZHVs
ZXJUZXN0LmNwcCcsCisgICAgICAgICAgICAndGVzdHMvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVU
ZXN0LmNwcCcsCiAgICAgICAgICAgICAndGVzdHMvQ0NUaHJlYWRUYXNrVGVzdC5jcHAnLAogICAg
ICAgICAgICAgJ3Rlc3RzL0NDVGhyZWFkVGVzdC5jcHAnLAogICAgICAgICAgICAgJ3Rlc3RzL0Zy
YW1lVGVzdEhlbHBlcnMuY3BwJywKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJLaXQvY2hyb21pdW0v
dGVzdHMvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVUZXN0LmNwcCBiL1NvdXJjZS9XZWJLaXQvY2hy
b21pdW0vdGVzdHMvQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVUZXN0LmNwcApuZXcgZmlsZSBtb2Rl
IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5j
MzI1NWU0ZGYyMWI1NzQwYmM3NGY1OTA1MjhkZjViYmU0ZmI4OTZiCi0tLSAvZGV2L251bGwKKysr
IGIvU291cmNlL1dlYktpdC9jaHJvbWl1bS90ZXN0cy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZVRl
c3QuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIEdvb2ds
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiAgUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyAqIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKKyAq
IERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWQorICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKKyAqIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTgorICogQU5ZIFRIRU9SWSBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCisgKiBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAiY29uZmln
LmgiCisKKyNpbmNsdWRlICJjYy9DQ1NjaGVkdWxlclN0YXRlTWFjaGluZS5oIgorCisjaW5jbHVk
ZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDx3dGYvdGV4dC9DU3RyaW5nLmg+CisjaW5jbHVk
ZSA8d3RmL3RleHQvV1RGU3RyaW5nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBXVEY7Cit1c2luZyBu
YW1lc3BhY2UgV2ViQ29yZTsKKworbmFtZXNwYWNlIHsKKworY29uc3QgQ0NTY2hlZHVsZXJTdGF0
ZU1hY2hpbmU6OkNvbW1pdFN0YXRlIGFsbENvbW1pdFN0YXRlc1tdID0geworICAgIENDU2NoZWR1
bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfSURMRSwKKyAgICBDQ1NjaGVkdWxlclN0YXRl
TWFjaGluZTo6Q09NTUlUX1NUQVRFX0ZSQU1FX0lOX1BST0dSRVNTLAorICAgIENDU2NoZWR1bGVy
U3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfVVBEQVRJTkdfUkVTT1VSQ0VTLAorICAgIENDU2No
ZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfUkVBRFlfVE9fQ09NTUlUCit9OworCisv
LyBFeHBvc2VzIHRoZSBwcm90ZWN0ZWQgc3RhdGUgZmllbGRzIG9mIHRoZSBDQ1NjaGVkdWxlclN0
YXRlTWFjaGluZSBmb3IgdGVzdGluZworY2xhc3MgU3RhdGVNYWNoaW5lIDogcHVibGljIENDU2No
ZWR1bGVyU3RhdGVNYWNoaW5lIHsKK3B1YmxpYzoKKyAgICB2b2lkIHNldENvbW1pdFN0YXRlKENv
bW1pdFN0YXRlIGNzKSB7IG1fY29tbWl0U3RhdGUgPSBjczsgfQorICAgIENvbW1pdFN0YXRlIGNv
bW1pdFN0YXRlKCkgY29uc3QgeyByZXR1cm4gIG1fY29tbWl0U3RhdGU7IH0KKworICAgIHZvaWQg
c2V0TmVlZHNDb21taXQoYm9vbCBiKSB7IG1fbmVlZHNDb21taXQgPSBiOyB9CisgICAgYm9vbCBu
ZWVkc0NvbW1pdCgpIGNvbnN0IHsgcmV0dXJuIG1fbmVlZHNDb21taXQ7IH0KKworICAgIHZvaWQg
c2V0TmVlZHNSZWRyYXcoYm9vbCBiKSB7IG1fbmVlZHNSZWRyYXcgPSBiOyB9CisgICAgYm9vbCBu
ZWVkc1JlZHJhdygpIGNvbnN0IHsgcmV0dXJuIG1fbmVlZHNSZWRyYXc7IH0KKworICAgIHZvaWQg
c2V0VXBkYXRlZFRoaXNGcmFtZShib29sIGIpIHsgbV91cGRhdGVkVGhpc0ZyYW1lID0gYjsgfQor
ICAgIGJvb2wgdXBkYXRlZFRoaXNGcmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1fdXBkYXRlZFRoaXNG
cmFtZTsgfQorfTsKKworVEVTVChDQ1NjaGVkdWxlclN0YXRlTWFjaGluZVRlc3QsIFRlc3ROZXh0
QWN0aW9uQmVnaW5zRnJhbWVJZk5lZWRlZCkKK3sKKyAgICBTdGF0ZU1hY2hpbmUgc3RhdGU7Cisg
ICAgLy8gSWYgbm8gY29tbWl0IG5lZWRlZCwgZG8gbm90aGluZworICAgIHN0YXRlID0gU3RhdGVN
YWNoaW5lKCk7CisgICAgc3RhdGUuc2V0Q29tbWl0U3RhdGUoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hp
bmU6OkNPTU1JVF9TVEFURV9JRExFKTsKKyAgICBzdGF0ZS5zZXROZWVkc1JlZHJhdyhmYWxzZSk7
CisgICAgc3RhdGUuc2V0TmVlZHNDb21taXQoZmFsc2UpOworICAgIHN0YXRlLnNldFVwZGF0ZWRU
aGlzRnJhbWUoZmFsc2UpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6
QUNUSU9OX05PTkUsIHN0YXRlLm5leHRBY3Rpb24oZmFsc2UpKTsKKyAgICBFWFBFQ1RfRVEoQ0NT
Y2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9OT05FLCBzdGF0ZS5uZXh0QWN0aW9uKHRydWUp
KTsKKworICAgIC8vIElmIGNvbW1pdCByZXF1ZXN0ZWQsIGJlZ2luIGEgZnJhbWUKKyAgICBzdGF0
ZSA9IFN0YXRlTWFjaGluZSgpOworICAgIHN0YXRlLnNldENvbW1pdFN0YXRlKENDU2NoZWR1bGVy
U3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfSURMRSk7CisgICAgc3RhdGUuc2V0TmVlZHNSZWRy
YXcoZmFsc2UpOworICAgIHN0YXRlLnNldE5lZWRzQ29tbWl0KHRydWUpOworICAgIHN0YXRlLnNl
dFVwZGF0ZWRUaGlzRnJhbWUoZmFsc2UpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRl
TWFjaGluZTo6QUNUSU9OX0JFR0lOX0ZSQU1FLCBzdGF0ZS5uZXh0QWN0aW9uKGZhbHNlKSk7CisK
KyAgICAvLyBCZWdpbiB0aGUgZnJhbWUsIG1ha2Ugc3VyZSBuZWVkc0NvbW1pdCBhbmQgY29tbWl0
U3RhdGUgdXBkYXRlIGNvcnJlY3RseS4KKyAgICBzdGF0ZS51cGRhdGVTdGF0ZShDQ1NjaGVkdWxl
clN0YXRlTWFjaGluZTo6QUNUSU9OX0JFR0lOX0ZSQU1FKTsKKyAgICBFWFBFQ1RfRVEoQ0NTY2hl
ZHVsZXJTdGF0ZU1hY2hpbmU6OkNPTU1JVF9TVEFURV9GUkFNRV9JTl9QUk9HUkVTUywgc3RhdGUu
Y29tbWl0U3RhdGUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXRlLm5lZWRzQ29tbWl0KCkpOwor
fQorCitURVNUKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lVGVzdCwgVGVzdE5leHRBY3Rpb25EcmF3
c09uVlN5bmMpCit7CisgICAgLy8gV2hlbiBub3Qgb24gdnN5bmMsIGRvbid0IGRyYXcuCisgICAg
c2l6ZV90IG51bUNvbW1pdFN0YXRlcyA9IHNpemVvZihhbGxDb21taXRTdGF0ZXMpIC8gc2l6ZW9m
KENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDb21taXRTdGF0ZSk7CisgICAgZm9yIChzaXplX3Qg
aSA9IDA7IGkgPCBudW1Db21taXRTdGF0ZXM7ICsraSkgeworICAgICAgICBTdGF0ZU1hY2hpbmUg
c3RhdGU7CisgICAgICAgIHN0YXRlLnNldENvbW1pdFN0YXRlKGFsbENvbW1pdFN0YXRlc1tpXSk7
CisgICAgICAgIHN0YXRlLnNldE5lZWRzUmVkcmF3KHRydWUpOworCisgICAgICAgIC8vIENhc2Ug
MTogbmVlZHNDb21taXQ9ZmFsc2UgdXBkYXRlZFRoaXNGcmFtZT1mYWxzZSB2c3luYz1mYWxzZS4K
KyAgICAgICAgc3RhdGUuc2V0TmVlZHNDb21taXQoZmFsc2UpOworICAgICAgICBzdGF0ZS5zZXRV
cGRhdGVkVGhpc0ZyYW1lKGZhbHNlKTsKKyAgICAgICAgRVhQRUNUX05FKENDU2NoZWR1bGVyU3Rh
dGVNYWNoaW5lOjpBQ1RJT05fRFJBVywgc3RhdGUubmV4dEFjdGlvbihmYWxzZSkpOworCisgICAg
ICAgIC8vIENhc2UgMjogbmVlZHNDb21taXQ9ZmFsc2UgdXBkYXRlZFRoaXNGcmFtZT10cnVlIHZz
eW5jPWZhbHNlLgorICAgICAgICBzdGF0ZS5zZXROZWVkc0NvbW1pdChmYWxzZSk7CisgICAgICAg
IHN0YXRlLnNldFVwZGF0ZWRUaGlzRnJhbWUodHJ1ZSk7CisgICAgICAgIEVYUEVDVF9ORShDQ1Nj
aGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0RSQVcsIHN0YXRlLm5leHRBY3Rpb24oZmFsc2Up
KTsKKworICAgICAgICAvLyBDYXNlIDM6IG5lZWRzQ29tbWl0PXRydWUgdXBkYXRlZFRoaXNGcmFt
ZT1mYWxzZSB2c3luYz1mYWxzZS4KKyAgICAgICAgc3RhdGUuc2V0TmVlZHNDb21taXQodHJ1ZSk7
CisgICAgICAgIHN0YXRlLnNldFVwZGF0ZWRUaGlzRnJhbWUoZmFsc2UpOworICAgICAgICBFWFBF
Q1RfTkUoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9EUkFXLCBzdGF0ZS5uZXh0QWN0
aW9uKGZhbHNlKSk7CisKKyAgICAgICAgLy8gQ2FzZSA0OiBuZWVkc0NvbW1pdD10cnVlIHVwZGF0
ZWRUaGlzRnJhbWU9dHJ1ZSB2c3luYz1mYWxzZS4KKyAgICAgICAgc3RhdGUuc2V0TmVlZHNDb21t
aXQodHJ1ZSk7CisgICAgICAgIHN0YXRlLnNldFVwZGF0ZWRUaGlzRnJhbWUodHJ1ZSk7CisgICAg
ICAgIEVYUEVDVF9ORShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0RSQVcsIHN0YXRl
Lm5leHRBY3Rpb24oZmFsc2UpKTsKKyAgICB9CisKKyAgICAvLyBXaGVuIG9uIHZzeW5jLCB5b3Ug
c2hvdWxkIGFsd2F5cyBkcmF3LiBFeHBlY3QgaWYgeW91J3JlIHJlYWR5IHRvIGNvbW1pdCwgaW4g
d2hpY2ggY2FzZSBjb21taXQuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db21taXRT
dGF0ZXM7ICsraSkgeworICAgICAgICBTdGF0ZU1hY2hpbmUgc3RhdGU7CisgICAgICAgIHN0YXRl
LnNldENvbW1pdFN0YXRlKGFsbENvbW1pdFN0YXRlc1tpXSk7CisgICAgICAgIHN0YXRlLnNldE5l
ZWRzUmVkcmF3KHRydWUpOworICAgICAgICBDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QWN0aW9u
IGV4cGVjdGVkQWN0aW9uOworICAgICAgICBpZiAoYWxsQ29tbWl0U3RhdGVzW2ldICE9IENDU2No
ZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfUkVBRFlfVE9fQ09NTUlUKQorICAgICAg
ICAgICAgZXhwZWN0ZWRBY3Rpb24gPSBDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0RS
QVc7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGV4cGVjdGVkQWN0aW9uID0gQ0NTY2hlZHVs
ZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9DT01NSVQ7CisKKyAgICAgICAgLy8gQ2FzZSAxOiBuZWVk
c0NvbW1pdD1mYWxzZSB1cGRhdGVkVGhpc0ZyYW1lPWZhbHNlIHZzeW5jPXRydWUuCisgICAgICAg
IHN0YXRlLnNldE5lZWRzQ29tbWl0KGZhbHNlKTsKKyAgICAgICAgc3RhdGUuc2V0VXBkYXRlZFRo
aXNGcmFtZShmYWxzZSk7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZEFjdGlvbiwgc3RhdGUu
bmV4dEFjdGlvbih0cnVlKSk7CisKKyAgICAgICAgLy8gQ2FzZSAyOiBuZWVkc0NvbW1pdD1mYWxz
ZSB1cGRhdGVkVGhpc0ZyYW1lPXRydWUgdnN5bmM9dHJ1ZS4KKyAgICAgICAgc3RhdGUuc2V0TmVl
ZHNDb21taXQoZmFsc2UpOworICAgICAgICBzdGF0ZS5zZXRVcGRhdGVkVGhpc0ZyYW1lKHRydWUp
OworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRBY3Rpb24sIHN0YXRlLm5leHRBY3Rpb24odHJ1
ZSkpOworCisgICAgICAgIC8vIENhc2UgMzogbmVlZHNDb21taXQ9dHJ1ZSB1cGRhdGVkVGhpc0Zy
YW1lPWZhbHNlIHZzeW5jPXRydWUuCisgICAgICAgIHN0YXRlLnNldE5lZWRzQ29tbWl0KHRydWUp
OworICAgICAgICBzdGF0ZS5zZXRVcGRhdGVkVGhpc0ZyYW1lKGZhbHNlKTsKKyAgICAgICAgRVhQ
RUNUX0VRKGV4cGVjdGVkQWN0aW9uLCBzdGF0ZS5uZXh0QWN0aW9uKHRydWUpKTsKKworICAgICAg
ICAvLyBDYXNlIDQ6IG5lZWRzQ29tbWl0PXRydWUgdXBkYXRlZFRoaXNGcmFtZT10cnVlIHZzeW5j
PXRydWUuCisgICAgICAgIHN0YXRlLnNldE5lZWRzQ29tbWl0KHRydWUpOworICAgICAgICBzdGF0
ZS5zZXRVcGRhdGVkVGhpc0ZyYW1lKHRydWUpOworICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRB
Y3Rpb24sIHN0YXRlLm5leHRBY3Rpb24odHJ1ZSkpOworICAgIH0KK30KKworVEVTVChDQ1NjaGVk
dWxlclN0YXRlTWFjaGluZVRlc3QsIFRlc3RVcGRhdGVzUmVzb3VyY2VzT25jZVBlckZyYW1lKQor
eworICAgIC8vIFdoZW4gbm8gcmVkcmF3IGlzIG5lZWRlZCAtLS0gdXBkYXRlIHVudGlsIGRvbmUK
KyAgICB7CisgICAgICAgIFN0YXRlTWFjaGluZSBzdGF0ZTsKKyAgICAgICAgc3RhdGUuc2V0Q29t
bWl0U3RhdGUoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNPTU1JVF9TVEFURV9VUERBVElOR19S
RVNPVVJDRVMpOworICAgICAgICBzdGF0ZS5zZXROZWVkc1JlZHJhdyhmYWxzZSk7CisgICAgICAg
IHN0YXRlLnNldFVwZGF0ZWRUaGlzRnJhbWUoZmFsc2UpOworICAgICAgICBFWFBFQ1RfRVEoQ0NT
Y2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9VUERBVEVfTU9SRV9SRVNPVVJDRVMsIHN0YXRl
Lm5leHRBY3Rpb24oZmFsc2UpKTsKKyAgICAgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVN
YWNoaW5lOjpBQ1RJT05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTLCBzdGF0ZS5uZXh0QWN0aW9uKHRy
dWUpKTsKKyAgICB9CisKKyAgICAvLyBPbmNlIHdlIHVwZGF0ZSByZXNvdXJjZXMsIGRvbid0IGRv
IGl0IGFnYWluIHVudGlsIGEgZHJhdworICAgIHsKKyAgICAgICAgU3RhdGVNYWNoaW5lIHN0YXRl
OworICAgICAgICBzdGF0ZS5zZXRDb21taXRTdGF0ZShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6
Q09NTUlUX1NUQVRFX1VQREFUSU5HX1JFU09VUkNFUyk7CisgICAgICAgIHN0YXRlLnNldE5lZWRz
UmVkcmF3KHRydWUpOworICAgICAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6
OkFDVElPTl9VUERBVEVfTU9SRV9SRVNPVVJDRVMsIHN0YXRlLm5leHRBY3Rpb24oZmFsc2UpKTsK
KyAgICAgICAgc3RhdGUudXBkYXRlU3RhdGUoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElP
Tl9VUERBVEVfTU9SRV9SRVNPVVJDRVMpOworICAgICAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJT
dGF0ZU1hY2hpbmU6OkFDVElPTl9OT05FLCBzdGF0ZS5uZXh0QWN0aW9uKGZhbHNlKSk7CisKKyAg
ICAgICAgLy8gb25jZSB3ZSd2ZSBkcmF3biBhZ2FpbiwgaXQgc2hvdWxkIGFsbG93IHVzIHRvIHVw
ZGF0ZSAocmVnYXJkbGVzcyBvZiB2c3luYyBzdGF0ZSkKKyAgICAgICAgRVhQRUNUX0VRKENDU2No
ZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fRFJBVywgc3RhdGUubmV4dEFjdGlvbih0cnVlKSk7
CisgICAgICAgIHN0YXRlLnVwZGF0ZVN0YXRlKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJ
T05fRFJBVyk7CisKKyAgICAgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpB
Q1RJT05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTLCBzdGF0ZS5uZXh0QWN0aW9uKHRydWUpKTsKKyAg
ICAgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fVVBEQVRFX01P
UkVfUkVTT1VSQ0VTLCBzdGF0ZS5uZXh0QWN0aW9uKGZhbHNlKSk7CisgICAgfQorfQorCitURVNU
KENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lVGVzdCwgVGVzdFNldE5lZWRzQ29tbWl0SXNudExvc3Qp
Cit7CisgICAgU3RhdGVNYWNoaW5lIHN0YXRlOworICAgIHN0YXRlLnNldE5lZWRzQ29tbWl0KHRy
dWUpOworCisgICAgLy8gQmVnaW4gdGhlIGZyYW1lLgorICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxl
clN0YXRlTWFjaGluZTo6QUNUSU9OX0JFR0lOX0ZSQU1FLCBzdGF0ZS5uZXh0QWN0aW9uKGZhbHNl
KSk7CisgICAgc3RhdGUudXBkYXRlU3RhdGUoc3RhdGUubmV4dEFjdGlvbihmYWxzZSkpOworICAg
IEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6Q09NTUlUX1NUQVRFX0ZSQU1FX0lO
X1BST0dSRVNTLCBzdGF0ZS5jb21taXRTdGF0ZSgpKTsKKworICAgIC8vIE5vdywgd2hpbGUgdGhl
IGZyYW1lIGlzIGluIHByb2dyZXNzLCBzZXQgYW5vdGhlciBjb21taXQuCisgICAgc3RhdGUuc2V0
TmVlZHNDb21taXQodHJ1ZSk7CisgICAgRVhQRUNUX1RSVUUoc3RhdGUubmVlZHNDb21taXQoKSk7
CisKKyAgICAvLyBMZXQgdGhlIGZyYW1lIGZpbmlzaC4KKyAgICBzdGF0ZS5iZWdpbkZyYW1lQ29t
cGxldGUoKTsKKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNPTU1JVF9T
VEFURV9VUERBVElOR19SRVNPVVJDRVMsIHN0YXRlLmNvbW1pdFN0YXRlKCkpOworICAgIEVYUEVD
VF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX1VQREFURV9NT1JFX1JFU09VUkNF
Uywgc3RhdGUubmV4dEFjdGlvbihmYWxzZSkpOworICAgIHN0YXRlLnVwZGF0ZVN0YXRlKENDU2No
ZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fVVBEQVRFX01PUkVfUkVTT1VSQ0VTKTsKKyAgICBF
WFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9OT05FLCBzdGF0ZS5uZXh0
QWN0aW9uKGZhbHNlKSk7CisgICAgc3RhdGUudXBkYXRlUmVzb3VyY2VzQ29tcGxldGUoKTsKKyAg
ICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkNPTU1JVF9TVEFURV9SRUFEWV9U
T19DT01NSVQsIHN0YXRlLmNvbW1pdFN0YXRlKCkpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxl
clN0YXRlTWFjaGluZTo6QUNUSU9OX0NPTU1JVCwgc3RhdGUubmV4dEFjdGlvbihmYWxzZSkpOwor
ICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0NPTU1JVCwgc3Rh
dGUubmV4dEFjdGlvbih0cnVlKSk7CisgICAgc3RhdGUudXBkYXRlU3RhdGUoQ0NTY2hlZHVsZXJT
dGF0ZU1hY2hpbmU6OkFDVElPTl9DT01NSVQpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0
YXRlTWFjaGluZTo6Q09NTUlUX1NUQVRFX0lETEUsIHN0YXRlLmNvbW1pdFN0YXRlKCkpOworCisg
ICAgLy8gdmVyaWZ5IHRoYXQgYW5vdGhlciBjb21taXQgd2lsbCBiZWdpbgorICAgIEVYUEVDVF9F
UShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0JFR0lOX0ZSQU1FLCBzdGF0ZS5uZXh0
QWN0aW9uKGZhbHNlKSk7Cit9CisKK1RFU1QoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmVUZXN0LCBU
ZXN0RnVsbEN5Y2xlKQoreworICAgIFN0YXRlTWFjaGluZSBzdGF0ZTsKKworICAgIC8vIFN0YXJ0
IGNsZWFuIGFuZCBzZXQgY29tbWl0LgorICAgIHN0YXRlLnNldE5lZWRzQ29tbWl0KHRydWUpOwor
ICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0JFR0lOX0ZSQU1F
LCBzdGF0ZS5uZXh0QWN0aW9uKGZhbHNlKSk7CisKKyAgICAvLyBCZWdpbiB0aGUgZnJhbWUuCisg
ICAgc3RhdGUudXBkYXRlU3RhdGUoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9CRUdJ
Tl9GUkFNRSk7CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRf
U1RBVEVfRlJBTUVfSU5fUFJPR1JFU1MsIHN0YXRlLmNvbW1pdFN0YXRlKCkpOworICAgIEVYUEVD
VF9GQUxTRShzdGF0ZS5uZWVkc0NvbW1pdCgpKTsKKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJT
dGF0ZU1hY2hpbmU6OkFDVElPTl9OT05FLCBzdGF0ZS5uZXh0QWN0aW9uKGZhbHNlKSk7CisKKyAg
ICAvLyBUZWxsIHRoZSBzY2hlZHVsZXIgdGhlIGZyYW1lIGZpbmlzaGVkLgorICAgIHN0YXRlLmJl
Z2luRnJhbWVDb21wbGV0ZSgpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGlu
ZTo6Q09NTUlUX1NUQVRFX1VQREFUSU5HX1JFU09VUkNFUywgc3RhdGUuY29tbWl0U3RhdGUoKSk7
CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpBQ1RJT05fVVBEQVRFX01P
UkVfUkVTT1VSQ0VTLCBzdGF0ZS5uZXh0QWN0aW9uKGZhbHNlKSk7CisKKyAgICAvLyBUZWxsIHRo
ZSBzY2hlZHVsZXIgdGhlIHVwZGF0ZSBpcyBkb25lLgorICAgIHN0YXRlLnVwZGF0ZVJlc291cmNl
c0NvbXBsZXRlKCk7CisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01N
SVRfU1RBVEVfUkVBRFlfVE9fQ09NTUlULCBzdGF0ZS5jb21taXRTdGF0ZSgpKTsKKyAgICBFWFBF
Q1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9DT01NSVQsIHN0YXRlLm5leHRB
Y3Rpb24oZmFsc2UpKTsKKworICAgIC8vIENvbW1pdC4KKyAgICBzdGF0ZS51cGRhdGVTdGF0ZShD
Q1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0NPTU1JVCk7CisgICAgRVhQRUNUX0VRKEND
U2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVfSURMRSwgc3RhdGUuY29tbWl0U3Rh
dGUoKSk7CisgICAgRVhQRUNUX1RSVUUoc3RhdGUubmVlZHNSZWRyYXcoKSk7CisKKyAgICAvLyBF
eHBlY3QgdG8gZG8gbm90aGluZyB1bnRpbCB2c3luYy4KKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVs
ZXJTdGF0ZU1hY2hpbmU6OkFDVElPTl9OT05FLCBzdGF0ZS5uZXh0QWN0aW9uKGZhbHNlKSk7CisK
KyAgICAvLyBBdCB2c3luYywgZHJhdy4KKyAgICBFWFBFQ1RfRVEoQ0NTY2hlZHVsZXJTdGF0ZU1h
Y2hpbmU6OkFDVElPTl9EUkFXLCBzdGF0ZS5uZXh0QWN0aW9uKHRydWUpKTsKKyAgICBzdGF0ZS51
cGRhdGVTdGF0ZShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9OX0RSQVcpOworCisgICAg
Ly8gU2hvdWxkIGJlIHN5bmNocm9uaXplZCwgbm8gZHJhdyBuZWVkZWQsIG5vIGFjdGlvbiBuZWVk
ZWQuCisgICAgRVhQRUNUX0VRKENDU2NoZWR1bGVyU3RhdGVNYWNoaW5lOjpDT01NSVRfU1RBVEVf
SURMRSwgc3RhdGUuY29tbWl0U3RhdGUoKSk7CisgICAgRVhQRUNUX0ZBTFNFKHN0YXRlLm5lZWRz
UmVkcmF3KCkpOworICAgIEVYUEVDVF9FUShDQ1NjaGVkdWxlclN0YXRlTWFjaGluZTo6QUNUSU9O
X05PTkUsIHN0YXRlLm5leHRBY3Rpb24oZmFsc2UpKTsKK30KKworVEVTVChDQ1NjaGVkdWxlclN0
YXRlTWFjaGluZVRlc3QsIFRlc3RGdWxsQ3ljbGVXaXRoQ29tbWl0UmVxdWVzdEluYmV0d2VlbikK
K3sKK30KKworVEVTVChDQ1NjaGVkdWxlclN0YXRlTWFjaGluZVRlc3QsIFRlc3RGdWxsQ3ljbGVX
aXRoUmVkcmF3SW5iZXR3ZWVuKQoreworfQorCit9Cg==
</data>
<flag name="review"
          id="110534"
          type_id="1"
          status="+"
          setter="jamesr"
    />
          </attachment>
      

    </bug>

</bugzilla>