<?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>76022</bug_id>
          
          <creation_ts>2012-01-10 20:00:41 -0800</creation_ts>
          <short_desc>META: make test-webkitpy more useful</short_desc>
          <delta_ts>2012-07-16 14:21:25 -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>Tools / Tests</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>Unspecified</rep_platform>
          <op_sys>Unspecified</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          <dependson>76021</dependson>
    
    <dependson>76142</dependson>
    
    <dependson>76201</dependson>
    
    <dependson>76233</dependson>
    
    <dependson>76238</dependson>
    
    <dependson>76765</dependson>
    
    <dependson>77807</dependson>
    
    <dependson>78185</dependson>
    
    <dependson>78289</dependson>
    
    <dependson>89725</dependson>
    
    <dependson>91282</dependson>
    
    <dependson>91289</dependson>
    
    <dependson>91292</dependson>
    
    <dependson>91297</dependson>
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Dirk Pranke">dpranke</reporter>
          <assigned_to name="Dirk Pranke">dpranke</assigned_to>
          <cc>abarth</cc>
    
    <cc>aroben</cc>
    
    <cc>eric</cc>
    
    <cc>tony</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>533593</commentid>
    <comment_count>0</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-10 20:00:41 -0800</bug_when>
    <thetext>I&apos;m planning on adding new features to test-webkitpy over the next week or two, and cleaning up the code to make it more hackable by people other than cjerdonek :).

Roughly, here&apos;s the set of features I have in mind:

1) proper command line help
2) better logging control
3) optional profiling info: per-test time, per-suite time, and actual cProfile data
4) optional code coverage info
5) support for directories and files as command line arguments in addition to test names
6) support for marking tests as fast or slow in addition to integration or unit
7) parallel test execution

This is a tracking bug for this work.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>533688</commentid>
    <comment_count>1</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-01-10 23:56:49 -0800</bug_when>
    <thetext>Sounds great.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>534536</commentid>
    <comment_count>2</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-11 20:03:26 -0800</bug_when>
    <thetext>logging control and command line help is in bug 76142.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>535065</commentid>
    <comment_count>3</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-01-12 12:29:46 -0800</bug_when>
    <thetext>bug 76201 adds support for code coverage.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>548205</commentid>
    <comment_count>4</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-02 15:40:43 -0800</bug_when>
    <thetext>Note: bug 77687 has a bunch of the stuff I&apos;m planning to add, but it needs to be cleaned up and broken into landable chunks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>549404</commentid>
    <comment_count>5</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-04 01:44:24 -0800</bug_when>
    <thetext>bug 76765 adds support for filenames, directories, and packages as command line args.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>549405</commentid>
    <comment_count>6</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-04 01:45:42 -0800</bug_when>
    <thetext>bug 77807 mostly cleans up the logging of individual test execution; the logging patterns now resemble new-run-webkit-tests (but are slightly improved over it, IMO).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552654</commentid>
    <comment_count>7</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-08 17:06:45 -0800</bug_when>
    <thetext>bug 78175 tracks parallel test execution.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552678</commentid>
    <comment_count>8</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-08 17:34:23 -0800</bug_when>
    <thetext>&gt; 7) parallel test execution

I&apos;m not sure (7) is worth doing.  I&apos;d rather make the tests faster than run them in parallel.  Running the default set of tests takes less than a minute:

Ran 1306 tests in 53.808s

We have 6% of the tests marked as &quot;integration tests&quot;, and running test-webkitpy --skip-integrationtests takes less than half the time:

Ran 1228 tests in 23.473s

Rather than add complexity by making the test suite parallel, it seems like breaking down these slow tests into more targeted unit tests has a better return on investment.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552695</commentid>
    <comment_count>9</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-08 17:48:14 -0800</bug_when>
    <thetext>(In reply to comment #8)
&gt; &gt; 7) parallel test execution
&gt; 
&gt; I&apos;m not sure (7) is worth doing.  I&apos;d rather make the tests faster than run them in parallel.  Running the default set of tests takes less than a minute:
&gt; 
&gt; Ran 1306 tests in 53.808s
&gt; 
&gt; We have 6% of the tests marked as &quot;integration tests&quot;, and running test-webkitpy --skip-integrationtests takes less than half the time:
&gt; 
&gt; Ran 1228 tests in 23.473s
&gt; 
&gt; Rather than add complexity by making the test suite parallel, it seems like breaking down these slow tests into more targeted unit tests has a better return on investment.

I don&apos;t see this as an either/or thing. Making the tests parallelizable should be pretty easy (I&apos;m most of the way there now), and is forcing me to clean up the messaging code. 

I agree that making the other tests faster would be good also. That said, as I noted in the other bug, there are other integration tests that we&apos;re currently not running because they are slow; I would like to enable them as well.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552697</commentid>
    <comment_count>10</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-08 17:49:34 -0800</bug_when>
    <thetext>Parallelizing has a cost, which is complexity.  I&apos;m not sure we get enough of a benefit to justify the cost.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552705</commentid>
    <comment_count>11</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-08 17:54:37 -0800</bug_when>
    <thetext>(In reply to comment #10)
&gt; Parallelizing has a cost, which is complexity.  I&apos;m not sure we get enough of a benefit to justify the cost.

Sure, that is a fair concern. Of course, refactoring the test code to speed it up introduces complexity as well.

My hope is that once this code is cleaned up, adding parallelism will be dirt-simple and it&apos;ll be a no-brainer; doing so should only take me a little more time, so I&apos;d prefer to defer further discussion over whether it will be worth it or not until I have something we can all stare at.

As I&apos;ve said before, the changes I&apos;ve posted thus far are (IMO) worth it even if we don&apos;t end up doing making test-webkitpy parallel, since they&apos;re making the code cleaner and easier to understand regardless. I&apos;d like to keep the two issues separate as much as possible.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552715</commentid>
    <comment_count>12</comment_count>
    <who name="Adam Barth">abarth</who>
    <bug_when>2012-02-08 18:04:50 -0800</bug_when>
    <thetext>Sounds like a good plan.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552796</commentid>
    <comment_count>13</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-08 20:15:34 -0800</bug_when>
    <thetext>Okay, I&apos;ve got some preliminary data and patch which I will post to bug 78175 ... let&apos;s move all further discussion of the pros and cons of parallelization there.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>552797</commentid>
    <comment_count>14</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-08 20:16:51 -0800</bug_when>
    <thetext>whoops, bug 78185, not bug 78175.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>553508</commentid>
    <comment_count>15</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-02-09 14:29:45 -0800</bug_when>
    <thetext>As an aside, what was 53 seconds yesterday is now 61 seconds ... I wonder what the best way to watch for regressions here would be (or when we should care, given that a minute still isn&apos;t that long a time).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>658254</commentid>
    <comment_count>16</comment_count>
      <attachid>149666</attachid>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-06-26 19:15:37 -0700</bug_when>
    <thetext>Created attachment 149666
roll-up patch based off of r121304 + att. 149665 on bug 89725

This is a roll-up patch that adds parallel execution, better logging, and general code cleanup/restructuring to test-webkitpy. It re-uses the manager_worker_broker logic in webkitpy.layout_tests; the overhead in lines of code for doing so is minimal. However, there&apos;s also not a huge win to running in parallel; execution time drops from 20s currently to ~5 seconds with 8 children.

Note that ~45 of the 1400 tests account for about half of the execution time, but o test takes longer than a second to complete (you can generate the list with -t/--timing).

The patch needs better tests, and depends on bug 89725. It also needs to be broken up into more reviewable chunks.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>669564</commentid>
    <comment_count>17</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-07-13 16:27:10 -0700</bug_when>
    <thetext>Okay, all patches posted, I think.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>670653</commentid>
    <comment_count>18</comment_count>
    <who name="Dirk Pranke">dpranke</who>
    <bug_when>2012-07-16 14:21:25 -0700</bug_when>
    <thetext>All of the work filed in comment #1 is now complete with the exception of per-suite time and cProfile data for profiling, and support for marking tests as fast or slow. test-webkitpy completes in 20 seconds run serially, and in 4 seconds when run w/ 8 threads.

I think this is good enough to close the bug.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>149666</attachid>
            <date>2012-06-26 19:15:37 -0700</date>
            <delta_ts>2012-06-26 19:15:37 -0700</delta_ts>
            <desc>roll-up patch based off of r121304 + att. 149665 on bug 89725</desc>
            <filename>tw_cleanup.patch</filename>
            <type>text/plain</type>
            <size>56241</size>
            <attacher name="Dirk Pranke">dpranke</attacher>
            
              <data encoding="base64">ZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGVzdC9maW5kZXIucHkgYi9Ub29s
cy9TY3JpcHRzL3dlYmtpdHB5L3Rlc3QvZmluZGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu
ZGV4IDAwMDAwMDAuLjhhOTViODUKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dl
YmtpdHB5L3Rlc3QvZmluZGVyLnB5CkBAIC0wLDAgKzEsMTg2IEBACisjIENvcHlyaWdodCAoQykg
MjAxMiBHb29nbGUsIEluYy4KKyMgQ29weXJpZ2h0IChDKSAyMDEwIENocmlzIEplcmRvbmVrIChj
amVyZG9uZWtAd2Via2l0Lm9yZykKKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUg
bWV0OgorIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkg
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisj
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIK
KyMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4KKworIiIidGhpcyBtb2R1bGUgaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgcHl0aG9u
IHRlc3RzLiIiIgorCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKKwor
X2xvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQorCisKK2NsYXNzIERpcmVjdG9yeVRy
ZWUob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZXN5c3RlbSwgdG9wX2RpcmVj
dG9yeSwgc3RhcnRpbmdfc3ViZGlyZWN0b3J5KToKKyAgICAgICAgc2VsZi5maWxlc3lzdGVtID0g
ZmlsZXN5c3RlbQorICAgICAgICBzZWxmLnRvcF9kaXJlY3RvcnkgPSBmaWxlc3lzdGVtLnJlYWxw
YXRoKHRvcF9kaXJlY3RvcnkpCisgICAgICAgIHNlbGYuc2VhcmNoX2RpcmVjdG9yeSA9IHNlbGYu
dG9wX2RpcmVjdG9yeQorICAgICAgICBzZWxmLnRvcF9wYWNrYWdlID0gJycKKyAgICAgICAgaWYg
c3RhcnRpbmdfc3ViZGlyZWN0b3J5OgorICAgICAgICAgICAgc2VsZi50b3BfcGFja2FnZSA9IHN0
YXJ0aW5nX3N1YmRpcmVjdG9yeS5yZXBsYWNlKGZpbGVzeXN0ZW0uc2VwLCAnLicpICsgJy4nCisg
ICAgICAgICAgICBzZWxmLnNlYXJjaF9kaXJlY3RvcnkgPSBmaWxlc3lzdGVtLmpvaW4oc2VsZi50
b3BfZGlyZWN0b3J5LCBzdGFydGluZ19zdWJkaXJlY3RvcnkpCisKKyAgICBkZWYgZmluZF9tb2R1
bGVzKHNlbGYsIHN1ZmZpeGVzLCBzdWJfZGlyZWN0b3J5PU5vbmUpOgorICAgICAgICBpZiBzdWJf
ZGlyZWN0b3J5OgorICAgICAgICAgICAgc2VhcmNoX2RpcmVjdG9yeSA9IHNlbGYuZmlsZXN5c3Rl
bS5qb2luKHNlbGYudG9wX2RpcmVjdG9yeSwgc3ViX2RpcmVjdG9yeSkKKyAgICAgICAgZWxzZToK
KyAgICAgICAgICAgIHNlYXJjaF9kaXJlY3RvcnkgPSBzZWxmLnNlYXJjaF9kaXJlY3RvcnkKKwor
ICAgICAgICBkZWYgZmlsZV9maWx0ZXIoZmlsZXN5c3RlbSwgZGlybmFtZSwgYmFzZW5hbWUpOgor
ICAgICAgICAgICAgcmV0dXJuIGFueShiYXNlbmFtZS5lbmRzd2l0aChzdWZmaXgpIGZvciBzdWZm
aXggaW4gc3VmZml4ZXMpCisKKyAgICAgICAgZmlsZW5hbWVzID0gc2VsZi5maWxlc3lzdGVtLmZp
bGVzX3VuZGVyKHNlYXJjaF9kaXJlY3RvcnksIGZpbGVfZmlsdGVyPWZpbGVfZmlsdGVyKQorICAg
ICAgICByZXR1cm4gW3NlbGYudG9fbW9kdWxlKGZpbGVuYW1lKSBmb3IgZmlsZW5hbWUgaW4gZmls
ZW5hbWVzXQorCisgICAgZGVmIHRvX21vZHVsZShzZWxmLCBwYXRoKToKKyAgICAgICAgcmV0dXJu
IHBhdGgucmVwbGFjZShzZWxmLnRvcF9kaXJlY3RvcnkgKyBzZWxmLmZpbGVzeXN0ZW0uc2VwLCAn
JykucmVwbGFjZShzZWxmLmZpbGVzeXN0ZW0uc2VwLCAnLicpWzotM10KKworICAgIGRlZiBzdWJw
YXRoKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiJSZXR1cm5zIHRoZSByZWxhdGl2ZSBwYXRoIGZy
b20gdGhlIHRvcCBvZiB0aGUgdHJlZSB0byB0aGUgcGF0aCwgb3IgTm9uZSBpZiB0aGUgcGF0aCBp
cyBub3QgdW5kZXIgdGhlIHRvcCBvZiB0aGUgdHJlZS4iIiIKKyAgICAgICAgcmVhbHBhdGggPSBz
ZWxmLmZpbGVzeXN0ZW0ucmVhbHBhdGgoc2VsZi5maWxlc3lzdGVtLmpvaW4oc2VsZi50b3BfZGly
ZWN0b3J5LCBwYXRoKSkKKyAgICAgICAgaWYgcmVhbHBhdGguc3RhcnRzd2l0aChzZWxmLnRvcF9k
aXJlY3RvcnkgKyBzZWxmLmZpbGVzeXN0ZW0uc2VwKToKKyAgICAgICAgICAgIHJldHVybiByZWFs
cGF0aC5yZXBsYWNlKHNlbGYudG9wX2RpcmVjdG9yeSArIHNlbGYuZmlsZXN5c3RlbS5zZXAsICcn
KQorICAgICAgICByZXR1cm4gTm9uZQorCisKKyAgICBkZWYgY2xlYW4oc2VsZik6CisgICAgICAg
ICIiIkRlbGV0ZSBhbGwgLnB5YyBmaWxlcyBpbiB0aGUgdHJlZSB0aGF0IGhhdmUgbm8gbWF0Y2hp
bmcgLnB5IGZpbGUuIiIiCisgICAgICAgIF9sb2cuZGVidWcoIkNsZWFuaW5nIG9ycGhhbmVkICou
cHljIGZpbGVzIGZyb206ICVzIiAlIHNlbGYuc2VhcmNoX2RpcmVjdG9yeSkKKyAgICAgICAgZmls
ZW5hbWVzID0gc2VsZi5maWxlc3lzdGVtLmZpbGVzX3VuZGVyKHNlbGYuc2VhcmNoX2RpcmVjdG9y
eSkKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIGlmIGZp
bGVuYW1lLmVuZHN3aXRoKCIucHljIikgYW5kIGZpbGVuYW1lWzotMV0gbm90IGluIGZpbGVuYW1l
czoKKyAgICAgICAgICAgICAgICBfbG9nLmluZm8oIkRlbGV0aW5nIG9ycGhhbiAqLnB5YyBmaWxl
OiAlcyIgJSBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGVzeXN0ZW0ucmVtb3Zl
KGZpbGVuYW1lKQorCisKK2NsYXNzIEZpbmRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhz
ZWxmLCBmaWxlc3lzdGVtKToKKyAgICAgICAgc2VsZi5maWxlc3lzdGVtID0gZmlsZXN5c3RlbQor
ICAgICAgICBzZWxmLnRyZWVzID0gW10KKworICAgIGRlZiBhZGRfdHJlZShzZWxmLCB0b3BfZGly
ZWN0b3J5LCBzdGFydGluZ19zdWJkaXJlY3Rvcnk9Tm9uZSk6CisgICAgICAgIHNlbGYudHJlZXMu
YXBwZW5kKERpcmVjdG9yeVRyZWUoc2VsZi5maWxlc3lzdGVtLCB0b3BfZGlyZWN0b3J5LCBzdGFy
dGluZ19zdWJkaXJlY3RvcnkpKQorCisgICAgZGVmIGFkZGl0aW9uYWxfcGF0aHMoc2VsZiwgcGF0
aHMpOgorICAgICAgICByZXR1cm4gW3RyZWUudG9wX2RpcmVjdG9yeSBmb3IgdHJlZSBpbiBzZWxm
LnRyZWVzIGlmIHRyZWUudG9wX2RpcmVjdG9yeSBub3QgaW4gcGF0aHNdCisKKyAgICBkZWYgY2xl
YW5fdHJlZXMoc2VsZik6CisgICAgICAgIGZvciB0cmVlIGluIHNlbGYudHJlZXM6CisgICAgICAg
ICAgICB0cmVlLmNsZWFuKCkKKworICAgIGRlZiBpc19tb2R1bGUoc2VsZiwgbmFtZSk6CisgICAg
ICAgIHJlbHBhdGggPSBuYW1lLnJlcGxhY2UoJy4nLCBzZWxmLmZpbGVzeXN0ZW0uc2VwKSArICcu
cHknCisgICAgICAgIHJldHVybiBhbnkoc2VsZi5maWxlc3lzdGVtLmV4aXN0cyhzZWxmLmZpbGVz
eXN0ZW0uam9pbih0cmVlLnRvcF9kaXJlY3RvcnksIHJlbHBhdGgpKSBmb3IgdHJlZSBpbiBzZWxm
LnRyZWVzKQorCisgICAgZGVmIGlzX2RvdHRlZF9uYW1lKHNlbGYsIG5hbWUpOgorICAgICAgICBy
ZXR1cm4gcmUubWF0Y2gocidbYS16QS1aLl1bYS16QS1aMC05Xy5dKicsIG5hbWUpCisKKyAgICBk
ZWYgdG9fbW9kdWxlKHNlbGYsIHBhdGgpOgorICAgICAgICBmb3IgdHJlZSBpbiBzZWxmLnRyZWVz
OgorICAgICAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHRyZWUudG9wX2RpcmVjdG9yeSk6Cisg
ICAgICAgICAgICAgICAgcmV0dXJuIHRyZWUudG9fbW9kdWxlKHBhdGgpCisgICAgICAgIHJldHVy
biBOb25lCisKKyAgICBkZWYgZmluZF9uYW1lcyhzZWxmLCBhcmdzLCBza2lwX2ludGVncmF0aW9u
dGVzdHMsIGZpbmRfYWxsLCBza2lwX2lmX3BhcmFsbGVsPVRydWUpOgorICAgICAgICBzdWZmaXhl
cyA9IFsnX3VuaXR0ZXN0LnB5J10KKyAgICAgICAgaWYgbm90IHNraXBfaW50ZWdyYXRpb250ZXN0
czoKKyAgICAgICAgICAgIHN1ZmZpeGVzLmFwcGVuZCgnX2ludGVncmF0aW9udGVzdC5weScpCisK
KyAgICAgICAgaWYgYXJnczoKKyAgICAgICAgICAgIG5hbWVzID0gW10KKyAgICAgICAgICAgIGZv
ciBhcmcgaW4gYXJnczoKKyAgICAgICAgICAgICAgICBuYW1lcy5leHRlbmQoc2VsZi5fZmluZF9u
YW1lc19mb3JfYXJnKGFyZywgc3VmZml4ZXMpKQorICAgICAgICAgICAgcmV0dXJuIG5hbWVzCisK
KyAgICAgICAgcmV0dXJuIHNlbGYuX2RlZmF1bHRfbmFtZXMoc3VmZml4ZXMsIGZpbmRfYWxsLCBz
a2lwX2lmX3BhcmFsbGVsKQorCisgICAgZGVmIF9maW5kX25hbWVzX2Zvcl9hcmcoc2VsZiwgYXJn
LCBzdWZmaXhlcyk6CisgICAgICAgIHJlYWxwYXRoID0gc2VsZi5maWxlc3lzdGVtLnJlYWxwYXRo
KGFyZykKKyAgICAgICAgaWYgc2VsZi5maWxlc3lzdGVtLmV4aXN0cyhyZWFscGF0aCk6CisgICAg
ICAgICAgICBuYW1lcyA9IHNlbGYuX2ZpbmRfaW5fdHJlZXMocmVhbHBhdGgsIHN1ZmZpeGVzKQor
ICAgICAgICAgICAgaWYgbm90IG5hbWVzOgorICAgICAgICAgICAgICAgIF9sb2cuZXJyb3IoIiVz
IGlzIG5vdCBpbiBvbmUgb2YgdGhlIHRlc3QgdHJlZXMuIiAlIGFyZykKKyAgICAgICAgICAgIHJl
dHVybiBuYW1lcworCisgICAgICAgICMgU2VlIGlmIGl0J3MgYSBweXRob24gcGFja2FnZSBpbiBh
IHRyZWUgKG9yIGEgcmVsYXRpdmUgcGF0aCBmcm9tIHRoZSB0b3Agb2YgYSB0cmVlKS4KKyAgICAg
ICAgbmFtZXMgPSBzZWxmLl9maW5kX2luX3RyZWVzKGFyZy5yZXBsYWNlKCcuJywgc2VsZi5maWxl
c3lzdGVtLnNlcCksIHN1ZmZpeGVzKQorICAgICAgICBpZiBuYW1lczoKKyAgICAgICAgICAgIHJl
dHVybiBuYW1lcworCisgICAgICAgIGlmIHNlbGYuaXNfZG90dGVkX25hbWUoYXJnKToKKyAgICAg
ICAgICAgICMgVGhlIG5hbWUgbWF5IG5vdCBleGlzdCwgYnV0IHRoYXQncyBva2F5OyB3ZSdsbCBm
aW5kIG91dCBsYXRlci4KKyAgICAgICAgICAgIHJldHVybiBbYXJnXQorCisgICAgICAgIF9sb2cu
ZXJyb3IoIiVzIGlzIG5vdCBhIHB5dGhvbiBuYW1lIG9yIGFuIGV4aXN0aW5nIGZpbGUgb3IgZGly
ZWN0b3J5LiIgJSBhcmcpCisgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIF9maW5kX2luX3Ry
ZWVzKHNlbGYsIHBhdGgsIHN1ZmZpeGVzKToKKyAgICAgICAgZm9yIHRyZWUgaW4gc2VsZi50cmVl
czoKKyAgICAgICAgICAgIHJlbHBhdGggPSB0cmVlLnN1YnBhdGgocGF0aCkKKyAgICAgICAgICAg
IGlmIG5vdCByZWxwYXRoOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBp
ZiBzZWxmLmZpbGVzeXN0ZW0uaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgICAgIHJldHVybiBb
dHJlZS50b19tb2R1bGUocGF0aCldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAg
IHJldHVybiB0cmVlLmZpbmRfbW9kdWxlcyhzdWZmaXhlcywgcGF0aCkKKyAgICAgICAgcmV0dXJu
IFtdCisKKyAgICBkZWYgX2RlZmF1bHRfbmFtZXMoc2VsZiwgc3VmZml4ZXMsIGZpbmRfYWxsLCBz
a2lwX2lmX3BhcmFsbGVsKToKKyAgICAgICAgbW9kdWxlcyA9IFtdCisgICAgICAgIGZvciB0cmVl
IGluIHNlbGYudHJlZXM6CisgICAgICAgICAgICBtb2R1bGVzLmV4dGVuZCh0cmVlLmZpbmRfbW9k
dWxlcyhzdWZmaXhlcykpCisgICAgICAgIG1vZHVsZXMuc29ydCgpCisKKyAgICAgICAgZm9yIG1v
ZHVsZSBpbiBtb2R1bGVzOgorICAgICAgICAgICAgX2xvZy5kZWJ1ZygiRm91bmQ6ICVzIiAlIG1v
ZHVsZSkKKworICAgICAgICAjIEZJWE1FOiBGaWd1cmUgb3V0IGhvdyB0byBtb3ZlIHRoaXMgdG8g
dGVzdC13ZWJraXRweSBpbiBvcmRlciB0byB0byBtYWtlIHRoaXMgZmlsZSBtb3JlIGdlbmVyaWMu
CisgICAgICAgIGlmIG5vdCBmaW5kX2FsbDoKKyAgICAgICAgICAgIHNsb3dfdGVzdHMgPSAoJ3dl
YmtpdHB5LmNvbW1vbi5jaGVja291dC5zY20uc2NtX3VuaXR0ZXN0JywpCisgICAgICAgICAgICBz
ZWxmLl9leGNsdWRlKG1vZHVsZXMsIHNsb3dfdGVzdHMsICdhcmUgcmVhbGx5LCByZWFsbHkgc2xv
dycsIDMxODE4KQorCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ3dpbjMyJzoKKyAg
ICAgICAgICAgICAgICB3aW4zMl9ibGFja2xpc3QgPSAoJ3dlYmtpdHB5LmNvbW1vbi5jaGVja291
dCcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3ZWJraXRweS5jb21tb24u
Y29uZmlnJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dlYmtpdHB5LnRv
b2wnKQorICAgICAgICAgICAgICAgIHNlbGYuX2V4Y2x1ZGUobW9kdWxlcywgd2luMzJfYmxhY2ts
aXN0LCAnZmFpbCBob3JyaWJseSBvbiB3aW4zMicsIDU0NTI2KQorCisgICAgICAgIGlmIHNraXBf
aWZfcGFyYWxsZWw6CisgICAgICAgICAgICBzZXJpYWxfdGVzdHMgPSAoJ3dlYmtpdHB5LmNvbW1v
bi5zeXN0ZW0uZXhlY3V0aXZlX3VuaXR0ZXN0LkV4ZWN1dGl2ZVRlc3QudGVzdF9ydW5uaW5nX2lu
X3BhcmFsbGVsJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2Via2l0cHkudGVzdCcp
CisgICAgICAgICAgICBzZWxmLl9leGNsdWRlKG1vZHVsZXMsIHNlcmlhbF90ZXN0cywgJ3Rlc3Rz
IGZhaWwgd2hlbiBydW4gaW4gcGFyYWxsZWwgd2l0aCBvdGhlciB0ZXN0cycsIDEyMzQ1KQorCisg
ICAgICAgIHJldHVybiBtb2R1bGVzCisKKyAgICBkZWYgX2V4Y2x1ZGUoc2VsZiwgbW9kdWxlcywg
bW9kdWxlX3ByZWZpeGVzLCByZWFzb24sIGJ1Z2lkKToKKyAgICAgICAgX2xvZy5pbmZvKCdTa2lw
cGluZyB0ZXN0cyBpbiB0aGUgZm9sbG93aW5nIG1vZHVsZXMgb3IgcGFja2FnZXMgYmVjYXVzZSB0
aGV5ICVzOicgJSByZWFzb24pCisgICAgICAgIGZvciBwcmVmaXggaW4gbW9kdWxlX3ByZWZpeGVz
OgorICAgICAgICAgICAgX2xvZy5pbmZvKCcgICAgJXMnICUgcHJlZml4KQorICAgICAgICAgICAg
bW9kdWxlc190b19leGNsdWRlID0gZmlsdGVyKGxhbWJkYSBtOiBtLnN0YXJ0c3dpdGgocHJlZml4
KSwgbW9kdWxlcykKKyAgICAgICAgICAgIGZvciBtIGluIG1vZHVsZXNfdG9fZXhjbHVkZToKKyAg
ICAgICAgICAgICAgICBpZiBsZW4obW9kdWxlc190b19leGNsdWRlKSA+IDE6CisgICAgICAgICAg
ICAgICAgICAgIF9sb2cuZGVidWcoJyAgICAgICAgJXMnICUgbSkKKyAgICAgICAgICAgICAgICBt
b2R1bGVzLnJlbW92ZShtKQorICAgICAgICBfbG9nLmluZm8oJyAgICAoaHR0cHM6Ly9idWdzLndl
YmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPSVkOyB1c2UgLS1hbGwgdG8gaW5jbHVkZSknICUgYnVn
aWQpCisgICAgICAgIF9sb2cuaW5mbygnJykKZGlmZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdGVzdC9maW5kZXJfdW5pdHRlc3QucHkgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rl
c3QvZmluZGVyX3VuaXR0ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu
LjA5MDQ4YjEKLS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rlc3Qv
ZmluZGVyX3VuaXR0ZXN0LnB5CkBAIC0wLDAgKzEsMTM0IEBACisjIENvcHlyaWdodCAoQykgMjAx
MiBHb29nbGUsIEluYy4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworIyBhcmUgbWV0Ogor
IyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyMgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyMgMi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisjICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorIworIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gQU5EIElUUyBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorIyBBTlkgRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUgSU1QTElFRAorIyBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCisjIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SCisjIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwKKyMgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IKKyMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyMgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwKKyMgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyMgT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4K
KworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIHdlYmtpdHB5LmNvbW1v
bi5zeXN0ZW0uZmlsZXN5c3RlbV9tb2NrIGltcG9ydCBNb2NrRmlsZVN5c3RlbQorZnJvbSB3ZWJr
aXRweS5jb21tb24uc3lzdGVtLm91dHB1dGNhcHR1cmUgaW1wb3J0IE91dHB1dENhcHR1cmUKK2Zy
b20gd2Via2l0cHkudGVzdC5maW5kZXIgaW1wb3J0IEZpbmRlcgorCisKK2NsYXNzIEZpbmRlclRl
c3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZmls
ZXMgPSB7CisgICAgICAgICAgJy9mb28vYmFyL2Jhei5weSc6ICcnLAorICAgICAgICAgICcvZm9v
L2Jhci9iYXpfdW5pdHRlc3QucHknOiAnJywKKyAgICAgICAgICAnL2ZvbzIvYmFyMi9iYXoyLnB5
JzogJycsCisgICAgICAgICAgJy9mb28yL2JhcjIvYmF6Mi5weWMnOiAnJywKKyAgICAgICAgICAn
L2ZvbzIvYmFyMi9iYXoyX2ludGVncmF0aW9udGVzdC5weSc6ICcnLAorICAgICAgICAgICcvZm9v
Mi9iYXIyL21pc3NpbmcucHljJzogJycsCisgICAgICAgICAgJy90bXAvYW5vdGhlcl91bml0dGVz
dC5weSc6ICcnLAorICAgICAgICB9CisgICAgICAgIHNlbGYuZnMgPSBNb2NrRmlsZVN5c3RlbShm
aWxlcykKKyAgICAgICAgc2VsZi5maW5kZXIgPSBGaW5kZXIoc2VsZi5mcykKKyAgICAgICAgc2Vs
Zi5maW5kZXIuYWRkX3RyZWUoJy9mb28nLCAnYmFyJykKKyAgICAgICAgc2VsZi5maW5kZXIuYWRk
X3RyZWUoJy9mb28yJykKKworICAgICAgICAjIEhlcmUgd2UgaGF2ZSB0byBqdW1wIHRocm91Z2gg
YSBob29wIHRvIG1ha2Ugc3VyZSB0ZXN0LXdlYmtpdHB5IGRvZXNuJ3QgbG9nCisgICAgICAgICMg
YW55IG1lc3NhZ2VzIGZyb20gdGhlc2UgdGVzdHMgOiguCisgICAgICAgIHNlbGYucm9vdF9sb2dn
ZXIgPSBsb2dnaW5nLmdldExvZ2dlcigpCisgICAgICAgIHNlbGYubG9nX2hhbmRsZXIgPSBOb25l
CisgICAgICAgIGZvciBoIGluIHNlbGYucm9vdF9sb2dnZXIuaGFuZGxlcnM6CisgICAgICAgICAg
ICBpZiBnZXRhdHRyKGgsICduYW1lJywgTm9uZSkgPT0gJ3dlYmtpdHB5LnRlc3QucHJpbnRlcic6
CisgICAgICAgICAgICAgICAgc2VsZi5sb2dfaGFuZGxlciA9IGgKKyAgICAgICAgICAgICAgICBi
cmVhaworICAgICAgICBpZiBzZWxmLmxvZ19oYW5kbGVyOgorICAgICAgICAgICAgc2VsZi5sb2df
bGV2ZWwgPSBzZWxmLmxvZ19oYW5kbGVyLmxldmVsCisgICAgICAgICAgICBzZWxmLmxvZ19oYW5k
bGVyLmxldmVsID0gbG9nZ2luZy5DUklUSUNBTAorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgor
ICAgICAgICBpZiBzZWxmLmxvZ19oYW5kbGVyOgorICAgICAgICAgICAgc2VsZi5sb2dfaGFuZGxl
ci5zZXRMZXZlbChzZWxmLmxvZ19sZXZlbCkKKworICAgIGRlZiB0ZXN0X2FkZGl0aW9uYWxfc3lz
dGVtX3BhdGhzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmZpbmRlci5h
ZGRpdGlvbmFsX3BhdGhzKFsnL3VzciddKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgWycv
Zm9vJywgJy9mb28yJ10pCisKKyAgICBkZWYgdGVzdF9pc19tb2R1bGUoc2VsZik6CisgICAgICAg
IHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRlci5pc19tb2R1bGUoJ2Jhci5iYXonKSkKKyAgICAg
ICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZmluZGVyLmlzX21vZHVsZSgnYmFyMi5iYXoyJykpCisg
ICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZpbmRlci5pc19tb2R1bGUoJ2JhcjIuYmF6Ml9p
bnRlZ3JhdGlvbnRlc3QnKSkKKworICAgICAgICAjIE1pc3NpbmcgdGhlIHByb3BlciBuYW1lc3Bh
Y2UuCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5maW5kZXIuaXNfbW9kdWxlKCdiYXon
KSkKKworICAgIGRlZiB0ZXN0X3RvX21vZHVsZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRF
cXVhbHMoc2VsZi5maW5kZXIudG9fbW9kdWxlKCcvZm9vL3Rlc3QucHknKSwgJ3Rlc3QnKQorICAg
ICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmZpbmRlci50b19tb2R1bGUoJy9mb28vYmFyL3Rl
c3QucHknKSwgJ2Jhci50ZXN0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5maW5k
ZXIudG9fbW9kdWxlKCcvZm9vL2Jhci9weXRlc3QucHknKSwgJ2Jhci5weXRlc3QnKQorCisgICAg
ZGVmIHRlc3RfY2xlYW4oc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmZzLmV4
aXN0cygnL2ZvbzIvYmFyMi9taXNzaW5nLnB5YycpKQorICAgICAgICBzZWxmLmZpbmRlci5jbGVh
bl90cmVlcygpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5mcy5leGlzdHMoJy9mb28y
L2JhcjIvbWlzc2luZy5weWMnKSkKKworICAgIGRlZiBjaGVja19uYW1lcyhzZWxmLCBuYW1lcywg
ZXhwZWN0ZWRfbmFtZXMsIHNraXBfaW50ZWdyYXRpb250ZXN0cz1GYWxzZSwgZmluZF9hbGw9RmFs
c2UpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmZpbmRlci5maW5kX25hbWVzKG5h
bWVzLCBza2lwX2ludGVncmF0aW9udGVzdHMsIGZpbmRfYWxsKSwKKyAgICAgICAgICAgICAgICAg
ICAgICAgICAgZXhwZWN0ZWRfbmFtZXMpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X25hbWVzKHNl
bGYpOgorICAgICAgICBzZWxmLmNoZWNrX25hbWVzKFtdLCBbJ2Jhci5iYXpfdW5pdHRlc3QnLCAn
YmFyMi5iYXoyX2ludGVncmF0aW9udGVzdCddKQorICAgICAgICBzZWxmLmNoZWNrX25hbWVzKFtd
LCBbJ2Jhci5iYXpfdW5pdHRlc3QnXSwgc2tpcF9pbnRlZ3JhdGlvbnRlc3RzPVRydWUsIGZpbmRf
YWxsPVRydWUpCisgICAgICAgIHNlbGYuY2hlY2tfbmFtZXMoW10sIFsnYmFyLmJhel91bml0dGVz
dCddLCBza2lwX2ludGVncmF0aW9udGVzdHM9VHJ1ZSwgZmluZF9hbGw9RmFsc2UpCisKKyAgICAg
ICAgIyBTaG91bGQgcmV0dXJuIHRoZSBuYW1lcyBnaXZlbiBpdCwgZXZlbiBpZiB0aGV5IGRvbid0
IGV4aXN0LgorICAgICAgICBzZWxmLmNoZWNrX25hbWVzKFsnZm9vYmFyJ10sIFsnZm9vYmFyJ10s
IHNraXBfaW50ZWdyYXRpb250ZXN0cz1UcnVlLCBmaW5kX2FsbD1GYWxzZSkKKworICAgIGRlZiB0
ZXN0X3BhdGhzKHNlbGYpOgorICAgICAgICBzZWxmLmZzLmNoZGlyKCcvZm9vL2JhcicpCisgICAg
ICAgIHNlbGYuY2hlY2tfbmFtZXMoWydiYXpfdW5pdHRlc3QucHknXSwgWydiYXIuYmF6X3VuaXR0
ZXN0J10pCisgICAgICAgIHNlbGYuY2hlY2tfbmFtZXMoWycuL2Jhel91bml0dGVzdC5weSddLCBb
J2Jhci5iYXpfdW5pdHRlc3QnXSkKKyAgICAgICAgc2VsZi5jaGVja19uYW1lcyhbJy9mb28vYmFy
L2Jhel91bml0dGVzdC5weSddLCBbJ2Jhci5iYXpfdW5pdHRlc3QnXSkKKyAgICAgICAgc2VsZi5j
aGVja19uYW1lcyhbJy4nXSwgWydiYXIuYmF6X3VuaXR0ZXN0J10pCisgICAgICAgIHNlbGYuY2hl
Y2tfbmFtZXMoWycuLi8uLi9mb28yL2JhcjInXSwgWydiYXIyLmJhejJfaW50ZWdyYXRpb250ZXN0
J10pCisKKyAgICAgICAgc2VsZi5mcy5jaGRpcignLycpCisgICAgICAgIHNlbGYuY2hlY2tfbmFt
ZXMoWydiYXInXSwgWydiYXIuYmF6X3VuaXR0ZXN0J10pCisgICAgICAgIHNlbGYuY2hlY2tfbmFt
ZXMoWycvZm9vL2Jhci8nXSwgWydiYXIuYmF6X3VuaXR0ZXN0J10pCisKKyAgICAgICAgIyBUaGlz
IHdvcmtzICdieSBhY2NpZGVudCcgc2luY2UgaXQgbWFwcyBvbnRvIGEgcGFja2FnZS4KKyAgICAg
ICAgc2VsZi5jaGVja19uYW1lcyhbJ2Jhci8nXSwgWydiYXIuYmF6X3VuaXR0ZXN0J10pCisKKyAg
ICAgICAgIyBUaGlzIHNob3VsZCBsb2cgYW4gZXJyb3IsIHNpbmNlIGl0J3Mgb3V0c2lkZSB0aGUg
dHJlZXMuCisgICAgICAgIG9jID0gT3V0cHV0Q2FwdHVyZSgpCisgICAgICAgIG9jLnNldF9sb2df
bGV2ZWwobG9nZ2luZy5FUlJPUikKKyAgICAgICAgb2MuY2FwdHVyZV9vdXRwdXQoKQorICAgICAg
ICB0cnk6CisgICAgICAgICAgICBzZWxmLmNoZWNrX25hbWVzKFsnL3RtcC9hbm90aGVyX3VuaXR0
ZXN0LnB5J10sIFtdKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgXywgXywgbG9ncyA9
IG9jLnJlc3RvcmVfb3V0cHV0KCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYW5vdGhl
cl91bml0dGVzdC5weScgaW4gbG9ncykKKworICAgICAgICAjIFBhdGhzIHRoYXQgZG9uJ3QgZXhp
c3QgYXJlIGVycm9ycy4KKyAgICAgICAgb2MuY2FwdHVyZV9vdXRwdXQoKQorICAgICAgICB0cnk6
CisgICAgICAgICAgICBzZWxmLmNoZWNrX25hbWVzKFsnL2Zvby9iYXIvbm90ZXhpc3RfdW5pdHRl
c3QucHknXSwgW10pCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBfLCBfLCBsb2dzID0g
b2MucmVzdG9yZV9vdXRwdXQoKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdub3RleGlz
dF91bml0dGVzdC5weScgaW4gbG9ncykKKworICAgICAgICAjIE5hbWVzIHRoYXQgZG9uJ3QgZXhp
c3QgYXJlIGNhdWdodCBsYXRlciwgYXQgbG9hZCB0aW1lLgorICAgICAgICBzZWxmLmNoZWNrX25h
bWVzKFsnYmFyLm5vdGV4aXN0X3VuaXR0ZXN0J10sIFsnYmFyLm5vdGV4aXN0X3VuaXR0ZXN0J10p
CisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYg
LS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rlc3QvbWFpbi5weSBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdGVzdC9tYWluLnB5CmluZGV4IGM1ZGMzOTQuLmM4OGUxNjggMTAwNjQ0Ci0t
LSBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGVzdC9tYWluLnB5CisrKyBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdGVzdC9tYWluLnB5CkBAIC0yNSwyOSArMjUsMjUgQEAKIAogaW1wb3J0IGxv
Z2dpbmcKIGltcG9ydCBvcHRwYXJzZQotaW1wb3J0IG9zCi1pbXBvcnQgU3RyaW5nSU8KIGltcG9y
dCBzeXMKLWltcG9ydCB0cmFjZWJhY2sKLWltcG9ydCB1bml0dGVzdAogCiBmcm9tIHdlYmtpdHB5
LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbSBpbXBvcnQgRmlsZVN5c3RlbQotZnJvbSB3ZWJraXRw
eS5jb21tb24uc3lzdGVtIGltcG9ydCBvdXRwdXRjYXB0dXJlCi1mcm9tIHdlYmtpdHB5LnRlc3Qu
dGVzdF9maW5kZXIgaW1wb3J0IFRlc3RGaW5kZXIKLWZyb20gd2Via2l0cHkudGVzdC5ydW5uZXIg
aW1wb3J0IFRlc3RSdW5uZXIKK2Zyb20gd2Via2l0cHkudGVzdC5maW5kZXIgaW1wb3J0IEZpbmRl
cgorZnJvbSB3ZWJraXRweS50ZXN0LnByaW50ZXIgaW1wb3J0IFByaW50ZXIKK2Zyb20gd2Via2l0
cHkudGVzdC5ydW5uZXIgaW1wb3J0IFJ1bm5lcgogCiBfbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIo
X19uYW1lX18pCiAKIAogY2xhc3MgVGVzdGVyKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNl
bGYsIGZpbGVzeXN0ZW09Tm9uZSk6Ci0gICAgICAgIHNlbGYuZmluZGVyID0gVGVzdEZpbmRlcihm
aWxlc3lzdGVtIG9yIEZpbGVTeXN0ZW0oKSkKLSAgICAgICAgc2VsZi5zdHJlYW0gPSBzeXMuc3Rk
ZXJyCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmZpbmRlciA9IEZpbmRl
cihGaWxlU3lzdGVtKCkpCisgICAgICAgIHNlbGYucHJpbnRlciA9IFByaW50ZXIoc3lzLnN0ZGVy
cikKIAogICAgIGRlZiBhZGRfdHJlZShzZWxmLCB0b3BfZGlyZWN0b3J5LCBzdGFydGluZ19zdWJk
aXJlY3Rvcnk9Tm9uZSk6CiAgICAgICAgIHNlbGYuZmluZGVyLmFkZF90cmVlKHRvcF9kaXJlY3Rv
cnksIHN0YXJ0aW5nX3N1YmRpcmVjdG9yeSkKIAotICAgIGRlZiBfcGFyc2VfYXJncyhzZWxmKToK
KyAgICBkZWYgX3BhcnNlX2FyZ3Moc2VsZiwgYXJndik6CiAgICAgICAgIHBhcnNlciA9IG9wdHBh
cnNlLk9wdGlvblBhcnNlcih1c2FnZT0ndXNhZ2U6ICVwcm9nIFtvcHRpb25zXSBbYXJncy4uLl0n
KQogICAgICAgICBwYXJzZXIuYWRkX29wdGlvbignLWEnLCAnLS1hbGwnLCBhY3Rpb249J3N0b3Jl
X3RydWUnLCBkZWZhdWx0PUZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdy
dW4gYWxsIHRoZSB0ZXN0cycpLApAQCAtNjMsOTAgKzU5LDMxIEBAIGNsYXNzIFRlc3RlcihvYmpl
Y3QpOgogICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdkbyBub3QgcnVuIHRoZSBpbnRl
Z3JhdGlvbiB0ZXN0cycpCiAgICAgICAgIHBhcnNlci5hZGRfb3B0aW9uKCctcCcsICctLXBhc3Mt
dGhyb3VnaCcsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsIGRlZmF1bHQ9RmFsc2UsCiAgICAgICAgICAg
ICAgICAgICAgICAgICAgIGhlbHA9J2JlIGRlYnVnZ2VyIGZyaWVuZGx5IGJ5IHBhc3NpbmcgY2Fw
dHVyZWQgb3V0cHV0IHRocm91Z2ggdG8gdGhlIHN5c3RlbScpCi0KKyAgICAgICAgcGFyc2VyLmFk
ZF9vcHRpb24oJy1qJywgJy0tY2hpbGQtcHJvY2Vzc2VzJywgYWN0aW9uPSdzdG9yZScsIHR5cGU9
J2ludCcsIGRlZmF1bHQ9MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nbnVtYmVy
IG9mIHRlc3RzIHRvIHJ1biBpbiBwYXJhbGxlbCcpCiAgICAgICAgIHBhcnNlci5lcGlsb2cgPSAo
J1thcmdzLi4uXSBpcyBhbiBvcHRpb25hbCBsaXN0IG9mIG1vZHVsZXMsIHRlc3RfY2xhc3Nlcywg
b3IgaW5kaXZpZHVhbCB0ZXN0cy4gJwogICAgICAgICAgICAgICAgICAgICAgICAgICdJZiBubyBh
cmdzIGFyZSBnaXZlbiwgYWxsIHRoZSB0ZXN0cyB3aWxsIGJlIHJ1bi4nKQogCi0gICAgICAgIHJl
dHVybiBwYXJzZXIucGFyc2VfYXJncygpCisgICAgICAgIHJldHVybiBwYXJzZXIucGFyc2VfYXJn
cyhhcmd2KQorCiAKLSAgICBkZWYgX2NvbmZpZ3VyZShzZWxmLCBvcHRpb25zKToKLSAgICAgICAg
c2VsZi5fb3B0aW9ucyA9IG9wdGlvbnMKKyAgICBkZWYgcnVuKHNlbGYsIGFyZ3Y9Tm9uZSk6Cisg
ICAgICAgIG9wdGlvbnMsIGFyZ3MgPSBzZWxmLl9wYXJzZV9hcmdzKGFyZ3YpCiAKICAgICAgICAg
aWYgb3B0aW9ucy50aW1pbmc6CiAgICAgICAgICAgICAjIC0tdGltaW5nIGltcGxpZXMgLS12ZXJi
b3NlCiAgICAgICAgICAgICBvcHRpb25zLnZlcmJvc2UgPSBtYXgob3B0aW9ucy52ZXJib3NlLCAx
KQogCi0gICAgICAgIGxvZ19sZXZlbCA9IGxvZ2dpbmcuSU5GTwotICAgICAgICBpZiBvcHRpb25z
LnF1aWV0OgotICAgICAgICAgICAgbG9nX2xldmVsID0gbG9nZ2luZy5XQVJOSU5HCi0gICAgICAg
IGVsaWYgb3B0aW9ucy52ZXJib3NlID09IDI6Ci0gICAgICAgICAgICBsb2dfbGV2ZWwgPSBsb2dn
aW5nLkRFQlVHCi0gICAgICAgIHNlbGYuX2NvbmZpZ3VyZV9sb2dnaW5nKGxvZ19sZXZlbCkKLQot
ICAgIGRlZiBfY29uZmlndXJlX2xvZ2dpbmcoc2VsZiwgbG9nX2xldmVsKToKLSAgICAgICAgIiIi
Q29uZmlndXJlIHRoZSByb290IGxvZ2dlci4KLQotICAgICAgICBDb25maWd1cmUgdGhlIHJvb3Qg
bG9nZ2VyIG5vdCB0byBsb2cgYW55IG1lc3NhZ2VzIGZyb20gd2Via2l0cHkgLS0KLSAgICAgICAg
ZXhjZXB0IGZvciBtZXNzYWdlcyBmcm9tIHRoZSBhdXRvaW5zdGFsbCBtb2R1bGUuICBBbHNvIHNl
dCB0aGUKLSAgICAgICAgbG9nZ2luZyBsZXZlbCBhcyBkZXNjcmliZWQgYmVsb3cuCi0gICAgICAg
ICIiIgotICAgICAgICBoYW5kbGVyID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHNlbGYuc3RyZWFt
KQotICAgICAgICAjIFdlIGNvbnN0cmFpbiB0aGUgbGV2ZWwgb24gdGhlIGhhbmRsZXIgcmF0aGVy
IHRoYW4gb24gdGhlIHJvb3QKLSAgICAgICAgIyBsb2dnZXIgaXRzZWxmLiAgVGhpcyBpcyBwcm9i
YWJseSBiZXR0ZXIgYmVjYXVzZSB0aGUgaGFuZGxlciBpcwotICAgICAgICAjIGNvbmZpZ3VyZWQg
YW5kIGtub3duIG9ubHkgdG8gdGhpcyBtb2R1bGUsIHdoZXJlYXMgdGhlIHJvb3QgbG9nZ2VyCi0g
ICAgICAgICMgaXMgYW4gb2JqZWN0IHNoYXJlZCAoYW5kIHBvdGVudGlhbGx5IG1vZGlmaWVkKSBi
eSBtYW55IG1vZHVsZXMuCi0gICAgICAgICMgTW9kaWZ5aW5nIHRoZSBoYW5kbGVyLCB0aGVuLCBp
cyBsZXNzIGludHJ1c2l2ZSBhbmQgbGVzcyBsaWtlbHkgdG8KLSAgICAgICAgIyBpbnRlcmZlcmUg
d2l0aCBtb2RpZmljYXRpb25zIG1hZGUgYnkgb3RoZXIgbW9kdWxlcyAoZS5nLiBpbiB1bml0Ci0g
ICAgICAgICMgdGVzdHMpLgotICAgICAgICBoYW5kbGVyLm5hbWUgPSBfX25hbWVfXwotICAgICAg
ICBoYW5kbGVyLnNldExldmVsKGxvZ19sZXZlbCkKLSAgICAgICAgZm9ybWF0dGVyID0gbG9nZ2lu
Zy5Gb3JtYXR0ZXIoIiUobWVzc2FnZSlzIikKLSAgICAgICAgaGFuZGxlci5zZXRGb3JtYXR0ZXIo
Zm9ybWF0dGVyKQotCi0gICAgICAgIGxvZ2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKLSAgICAg
ICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFuZGxlcikKLSAgICAgICAgbG9nZ2VyLnNldExldmVsKGxv
Z2dpbmcuTk9UU0VUKQotCi0gICAgICAgICMgRmlsdGVyIG91dCBtb3N0IHdlYmtpdHB5IG1lc3Nh
Z2VzLgotICAgICAgICAjCi0gICAgICAgICMgTWVzc2FnZXMgY2FuIGJlIHNlbGVjdGl2ZWx5IHJl
LWVuYWJsZWQgZm9yIHRoaXMgc2NyaXB0IGJ5IHVwZGF0aW5nCi0gICAgICAgICMgdGhpcyBtZXRo
b2QgYWNjb3JkaW5nbHkuCi0gICAgICAgIGRlZiBmaWx0ZXIocmVjb3JkKToKLSAgICAgICAgICAg
ICIiIkZpbHRlciBvdXQgYXV0b2luc3RhbGwgYW5kIG5vbi10aGlyZC1wYXJ0eSB3ZWJraXRweSBt
ZXNzYWdlcy4iIiIKLSAgICAgICAgICAgICMgRklYTUU6IEZpZ3VyZSBvdXQgYSB3YXkgbm90IHRv
IHVzZSBzdHJpbmdzIGhlcmUsIGZvciBleGFtcGxlIGJ5Ci0gICAgICAgICAgICAjICAgICAgICB1
c2luZyBzeW50YXggbGlrZSB3ZWJraXRweS50ZXN0Ll9fbmFtZV9fLiAgV2Ugd2FudCB0byBiZQot
ICAgICAgICAgICAgIyAgICAgICAgc3VyZSBub3QgdG8gaW1wb3J0IGFueSBub24tUHl0aG9uIDIu
NCBjb2RlLCB0aG91Z2gsIHVudGlsCi0gICAgICAgICAgICAjICAgICAgICBhZnRlciB0aGUgdmVy
c2lvbi1jaGVja2luZyBjb2RlIGhhcyBleGVjdXRlZC4KLSAgICAgICAgICAgIGlmIChyZWNvcmQu
bmFtZS5zdGFydHN3aXRoKCJ3ZWJraXRweS5jb21tb24uc3lzdGVtLmF1dG9pbnN0YWxsIikgb3IK
LSAgICAgICAgICAgICAgICByZWNvcmQubmFtZS5zdGFydHN3aXRoKCJ3ZWJraXRweS50ZXN0Iikp
OgotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCi0gICAgICAgICAgICBpZiByZWNvcmQubmFt
ZS5zdGFydHN3aXRoKCJ3ZWJraXRweSIpOgotICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQot
ICAgICAgICAgICAgcmV0dXJuIFRydWUKLQotICAgICAgICB0ZXN0aW5nX2ZpbHRlciA9IGxvZ2dp
bmcuRmlsdGVyKCkKLSAgICAgICAgdGVzdGluZ19maWx0ZXIuZmlsdGVyID0gZmlsdGVyCi0KLSAg
ICAgICAgIyBEaXNwbGF5IGEgbWVzc2FnZSBzbyBkZXZlbG9wZXJzIGFyZSBub3QgbXlzdGlmaWVk
IGFzIHRvIHdoeQotICAgICAgICAjIGxvZ2dpbmcgZG9lcyBub3Qgd29yayBpbiB0aGUgdW5pdCB0
ZXN0cy4KLSAgICAgICAgX2xvZy5pbmZvKCJTdXBwcmVzc2luZyBtb3N0IHdlYmtpdHB5IGxvZ2dp
bmcgd2hpbGUgcnVubmluZyB1bml0IHRlc3RzLiIpCi0gICAgICAgIGhhbmRsZXIuYWRkRmlsdGVy
KHRlc3RpbmdfZmlsdGVyKQotCi0gICAgZGVmIHJ1bihzZWxmKToKLSAgICAgICAgb3B0aW9ucywg
YXJncyA9IHNlbGYuX3BhcnNlX2FyZ3MoKQotICAgICAgICBzZWxmLl9jb25maWd1cmUob3B0aW9u
cykKKyAgICAgICAgc2VsZi5wcmludGVyLmNvbmZpZ3VyZShvcHRpb25zKQogCiAgICAgICAgIHNl
bGYuZmluZGVyLmNsZWFuX3RyZWVzKCkKIAotICAgICAgICBuYW1lcyA9IHNlbGYuZmluZGVyLmZp
bmRfbmFtZXMoYXJncywgc2VsZi5fb3B0aW9ucy5za2lwX2ludGVncmF0aW9udGVzdHMsIHNlbGYu
X29wdGlvbnMuYWxsKQorICAgICAgICBuYW1lcyA9IHNlbGYuZmluZGVyLmZpbmRfbmFtZXMoYXJn
cywgb3B0aW9ucy5za2lwX2ludGVncmF0aW9udGVzdHMsIG9wdGlvbnMuYWxsLCBvcHRpb25zLmNo
aWxkX3Byb2Nlc3NlcyAhPSAxKQogICAgICAgICBpZiBub3QgbmFtZXM6CiAgICAgICAgICAgICBf
bG9nLmVycm9yKCdObyB0ZXN0cyB0byBydW4nKQogICAgICAgICAgICAgcmV0dXJuIEZhbHNlCiAK
LSAgICAgICAgcmV0dXJuIHNlbGYuX3J1bl90ZXN0cyhuYW1lcykKLQotICAgIGRlZiBfcnVuX3Rl
c3RzKHNlbGYsIG5hbWVzKToKLSAgICAgICAgaWYgc2VsZi5fb3B0aW9ucy5jb3ZlcmFnZToKKyAg
ICAgICAgaWYgb3B0aW9ucy5jb3ZlcmFnZToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAg
ICAgICBpbXBvcnQgd2Via2l0cHkudGhpcmRwYXJ0eS5hdXRvaW5zdGFsbGVkLmNvdmVyYWdlIGFz
IGNvdmVyYWdlCiAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3IsIGU6CkBAIC0xNTgsNjgg
Kzk1LDEzIEBAIGNsYXNzIFRlc3RlcihvYmplY3QpOgogICAgICAgICAjIE1ha2Ugc3VyZSBQWVRI
T05QQVRIIGlzIHNldCB1cCBwcm9wZXJseS4KICAgICAgICAgc3lzLnBhdGggPSBzZWxmLmZpbmRl
ci5hZGRpdGlvbmFsX3BhdGhzKHN5cy5wYXRoKSArIHN5cy5wYXRoCiAKLSAgICAgICAgX2xvZy5k
ZWJ1ZygiTG9hZGluZyB0aGUgdGVzdHMuLi4iKQotCi0gICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0
LmRlZmF1bHRUZXN0TG9hZGVyCi0gICAgICAgIHN1aXRlcyA9IFtdCi0gICAgICAgIGZvciBuYW1l
IGluIG5hbWVzOgotICAgICAgICAgICAgaWYgc2VsZi5maW5kZXIuaXNfbW9kdWxlKG5hbWUpOgot
ICAgICAgICAgICAgICAgICMgaWYgd2UgZmFpbGVkIHRvIGxvYWQgYSBuYW1lIGFuZCBpdCBsb29r
cyBsaWtlIGEgbW9kdWxlLAotICAgICAgICAgICAgICAgICMgdHJ5IGltcG9ydGluZyBpdCBkaXJl
Y3RseSwgYmVjYXVzZSBsb2FkVGVzdHNGcm9tTmFtZSgpCi0gICAgICAgICAgICAgICAgIyBwcm9k
dWNlcyBsb3VzeSBlcnJvciBtZXNzYWdlcyBmb3IgYmFkIG1vZHVsZXMuCi0gICAgICAgICAgICAg
ICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICBfX2ltcG9ydF9fKG5hbWUpCi0gICAgICAgICAg
ICAgICAgZXhjZXB0IEltcG9ydEVycm9yLCBlOgotICAgICAgICAgICAgICAgICAgICBfbG9nLmZh
dGFsKCdGYWlsZWQgdG8gaW1wb3J0ICVzOicgJSBuYW1lKQotICAgICAgICAgICAgICAgICAgICBz
ZWxmLl9sb2dfZXhjZXB0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0K
LSAgICAgICAgICAgIHN1aXRlcy5hcHBlbmQobG9hZGVyLmxvYWRUZXN0c0Zyb21OYW1lKG5hbWUs
IE5vbmUpKQotCi0gICAgICAgIHRlc3Rfc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoc3VpdGVz
KQotICAgICAgICB0ZXN0X3J1bm5lciA9IFRlc3RSdW5uZXIoc2VsZi5zdHJlYW0sIHNlbGYuX29w
dGlvbnMsIGxvYWRlcikKLQogICAgICAgICBfbG9nLmRlYnVnKCJSdW5uaW5nIHRoZSB0ZXN0cy4i
KQotICAgICAgICBpZiBzZWxmLl9vcHRpb25zLnBhc3NfdGhyb3VnaDoKLSAgICAgICAgICAgIG91
dHB1dGNhcHR1cmUuT3V0cHV0Q2FwdHVyZS5zdHJlYW1fd3JhcHBlciA9IF9DYXB0dXJlQW5kUGFz
c1Rocm91Z2hTdHJlYW0KLSAgICAgICAgcmVzdWx0ID0gdGVzdF9ydW5uZXIucnVuKHRlc3Rfc3Vp
dGUpCi0gICAgICAgIGlmIHNlbGYuX29wdGlvbnMuY292ZXJhZ2U6CisgICAgICAgIHRlc3RfcnVu
bmVyID0gUnVubmVyKHNlbGYuZmluZGVyLCBzZWxmLnByaW50ZXIsIG9wdGlvbnMpCisgICAgICAg
IHJlc3VsdCA9IHRlc3RfcnVubmVyLnJ1bihuYW1lcykKKworICAgICAgICBpZiBvcHRpb25zLmNv
dmVyYWdlOgogICAgICAgICAgICAgY292LnN0b3AoKQogICAgICAgICAgICAgY292LnNhdmUoKQog
ICAgICAgICAgICAgY292LnJlcG9ydChzaG93X21pc3Npbmc9RmFsc2UpCi0gICAgICAgIHJldHVy
biByZXN1bHQud2FzU3VjY2Vzc2Z1bCgpCi0KLSAgICBkZWYgX2xvZ19leGNlcHRpb24oc2VsZik6
Ci0gICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCi0gICAgICAgIHRyYWNlYmFjay5wcmlu
dF9leGMoZmlsZT1zKQotICAgICAgICBmb3IgbCBpbiBzLmJ1Zmxpc3Q6Ci0gICAgICAgICAgICBf
bG9nLmVycm9yKCcgICcgKyBsLnJzdHJpcCgpKQotCi0KLWNsYXNzIF9DYXB0dXJlQW5kUGFzc1Ro
cm91Z2hTdHJlYW0ob2JqZWN0KToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtKToKLSAg
ICAgICAgc2VsZi5fYnVmZmVyID0gU3RyaW5nSU8uU3RyaW5nSU8oKQotICAgICAgICBzZWxmLl9z
dHJlYW0gPSBzdHJlYW0KLQotICAgIGRlZiB3cml0ZShzZWxmLCBtc2cpOgotICAgICAgICBzZWxm
Ll9zdHJlYW0ud3JpdGUobXNnKQotCi0gICAgICAgICMgTm90ZSB0aGF0IHdlIGRvbid0IHdhbnQg
dG8gY2FwdHVyZSBhbnkgb3V0cHV0IGdlbmVyYXRlZCBieSB0aGUgZGVidWdnZXIKLSAgICAgICAg
IyBiZWNhdXNlIHRoYXQgY291bGQgY2F1c2UgdGhlIHJlc3VsdHMgb2YgY2FwdHVyZV9vdXRwdXQo
KSB0byBiZSBpbnZhbGlkLgotICAgICAgICBpZiBub3Qgc2VsZi5fbWVzc2FnZV9pc19mcm9tX3Bk
YigpOgotICAgICAgICAgICAgc2VsZi5fYnVmZmVyLndyaXRlKG1zZykKLQotICAgIGRlZiBfbWVz
c2FnZV9pc19mcm9tX3BkYihzZWxmKToKLSAgICAgICAgIyBXZSB3aWxsIGFzc3VtZSB0aGF0IGlm
IHRoZSBwZGIgbW9kdWxlIGlzIGluIHRoZSBzdGFjayB0aGVuIHRoZSBvdXRwdXQKLSAgICAgICAg
IyBpcyBiZWluZyBnZW5lcmF0ZWQgYnkgdGhlIHB5dGhvbiBkZWJ1Z2dlciAob3IgdGhlIHVzZXIg
Y2FsbGluZyBzb21ldGhpbmcKLSAgICAgICAgIyBmcm9tIGluc2lkZSB0aGUgZGVidWdnZXIpLgot
ICAgICAgICBpbXBvcnQgaW5zcGVjdAotICAgICAgICBpbXBvcnQgcGRiCi0gICAgICAgIHN0YWNr
ID0gaW5zcGVjdC5zdGFjaygpCi0gICAgICAgIHJldHVybiBhbnkoZnJhbWVbMV0gPT0gcGRiLl9f
ZmlsZV9fLnJlcGxhY2UoJy5weWMnLCAnLnB5JykgZm9yIGZyYW1lIGluIHN0YWNrKQotCi0gICAg
ZGVmIGZsdXNoKHNlbGYpOgotICAgICAgICBzZWxmLl9zdHJlYW0uZmx1c2goKQotCi0gICAgZGVm
IGdldHZhbHVlKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fYnVmZmVyLmdldHZhbHVlKCkK
KworICAgICAgICByZXR1cm4gcmVzdWx0CmRpZmYgLS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L3Rlc3QvbWFpbl91bml0dGVzdC5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGVzdC9t
YWluX3VuaXR0ZXN0LnB5CmluZGV4IDFhNjBiZWUuLjVmOGFmOGMgMTAwNjQ0Ci0tLSBhL1Rvb2xz
L1NjcmlwdHMvd2Via2l0cHkvdGVzdC9tYWluX3VuaXR0ZXN0LnB5CisrKyBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdGVzdC9tYWluX3VuaXR0ZXN0LnB5CkBAIC0yNiw2ICsyNiw3IEBAIGltcG9y
dCBTdHJpbmdJTwogCiBmcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0ub3V0cHV0Y2FwdHVyZSBp
bXBvcnQgT3V0cHV0Q2FwdHVyZQogZnJvbSB3ZWJraXRweS50ZXN0Lm1haW4gaW1wb3J0IFRlc3Rl
cgorZnJvbSB3ZWJraXRweS50ZXN0LnByaW50ZXIgaW1wb3J0IFByaW50ZXIKIAogCiBjbGFzcyBU
ZXN0ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQwLDggKzQxLDggQEAgY2xhc3MgVGVz
dGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgICAgIHJvb3RfaGFuZGxlcnMgPSByb290
X2xvZ2dlci5oYW5kbGVycwogICAgICAgICByb290X2xvZ2dlci5oYW5kbGVycyA9IFtdCiAKLSAg
ICAgICAgdGVzdGVyLnN0cmVhbSA9IGVycm9ycwotICAgICAgICB0ZXN0ZXIuZmluZGVyLmZpbmRf
bmFtZXMgPSBsYW1iZGEgYXJncywgc2tpcF9pbnRlZ3JhdGlvbiwgcnVuX2FsbDogW10KKyAgICAg
ICAgdGVzdGVyLnByaW50ZXIgPSBQcmludGVyKGVycm9ycykKKyAgICAgICAgdGVzdGVyLmZpbmRl
ci5maW5kX25hbWVzID0gbGFtYmRhIGFyZ3MsIHNraXBfaW50ZWdyYXRpb24sIHJ1bl9hbGwsIHNr
aXBfc2VyaWFsOiBbXQogICAgICAgICBvYyA9IE91dHB1dENhcHR1cmUoKQogICAgICAgICB0cnk6
CiAgICAgICAgICAgICBvYy5jYXB0dXJlX291dHB1dCgpCmRpZmYgLS1naXQgYS9Ub29scy9TY3Jp
cHRzL3dlYmtpdHB5L3Rlc3QvcHJpbnRlci5weSBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGVz
dC9wcmludGVyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMjdmYjkK
LS0tIC9kZXYvbnVsbAorKysgYi9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rlc3QvcHJpbnRlci5w
eQpAQCAtMCwwICsxLDIwMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCisj
IENvcHlyaWdodCAoQykgMjAxMCBDaHJpcyBKZXJkb25layAoY2plcmRvbmVrQHdlYmtpdC5vcmcp
CisjCisjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyMgYXJlIG1ldDoKKyMgMS4gIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisj
ICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisjIDIuICBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorIyAgICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJ
VFMgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKKyMg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UiBQVVJQT1NFIEFSRQorIyBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUgorIyBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisjIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SCisjIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisjIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksCisjIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisjIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKyIiInVuaXQgdGVz
dGluZyBjb2RlIGZvciB3ZWJraXRweS4iIiIKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBTdHJp
bmdJTworaW1wb3J0IHN5cworaW1wb3J0IHRpbWUKKworZnJvbSB3ZWJraXRweS5sYXlvdXRfdGVz
dHMudmlld3MubWV0ZXJlZF9zdHJlYW0gaW1wb3J0IE1ldGVyZWRTdHJlYW0KK2Zyb20gd2Via2l0
cHkuY29tbW9uLnN5c3RlbSBpbXBvcnQgb3V0cHV0Y2FwdHVyZQorCitfbG9nID0gbG9nZ2luZy5n
ZXRMb2dnZXIoX19uYW1lX18pCisKKworY2xhc3MgUHJpbnRlcihvYmplY3QpOgorICAgIGRlZiBf
X2luaXRfXyhzZWxmLCBzdHJlYW09c3lzLnN0ZGVycik6CisgICAgICAgIHNlbGYuc3RyZWFtID0g
c3RyZWFtCisgICAgICAgIHNlbGYubWV0ZXIgPSBOb25lCisgICAgICAgIHNlbGYubnVtX3Rlc3Rz
ID0gMAorICAgICAgICBzZWxmLm51bV9jb21wbGV0ZWQgPSAwCisgICAgICAgIHNlbGYub3B0aW9u
cyA9IE5vbmUKKyAgICAgICAgc2VsZi5ydW5uaW5nX3Rlc3RzID0gW10KKyAgICAgICAgc2VsZi5j
b21wbGV0ZWRfdGVzdHMgPSBbXQorCisgICAgZGVmIGNvbmZpZ3VyZShzZWxmLCBvcHRpb25zKToK
KyAgICAgICAgc2VsZi5vcHRpb25zID0gb3B0aW9ucworICAgICAgICBzZWxmLm1ldGVyID0gTWV0
ZXJlZFN0cmVhbShzZWxmLnN0cmVhbSwgKG9wdGlvbnMudmVyYm9zZSA9PSAyKSkKKworICAgICAg
ICBsb2dfbGV2ZWwgPSBsb2dnaW5nLklORk8KKyAgICAgICAgaWYgb3B0aW9ucy52ZXJib3NlID09
IDI6CisgICAgICAgICAgICBsb2dfbGV2ZWwgPSBsb2dnaW5nLkRFQlVHCisgICAgICAgIGlmIG9w
dGlvbnMucXVpZXQgYW5kIG5vdCBvcHRpb25zLnZlcmJvc2U6CisgICAgICAgICAgICBsb2dfbGV2
ZWwgPSBsb2dnaW5nLldBUk5JTkcKKworICAgICAgICBoYW5kbGVyID0gX0xvZ0hhbmRsZXIoc2Vs
Zi5tZXRlcikKKworICAgICAgICAjIFdlIGNvbnN0cmFpbiB0aGUgbGV2ZWwgb24gdGhlIGhhbmRs
ZXIgcmF0aGVyIHRoYW4gb24gdGhlIHJvb3QKKyAgICAgICAgIyBsb2dnZXIgaXRzZWxmLiAgVGhp
cyBpcyBwcm9iYWJseSBiZXR0ZXIgYmVjYXVzZSB0aGUgaGFuZGxlciBpcworICAgICAgICAjIGNv
bmZpZ3VyZWQgYW5kIGtub3duIG9ubHkgdG8gdGhpcyBtb2R1bGUsIHdoZXJlYXMgdGhlIHJvb3Qg
bG9nZ2VyCisgICAgICAgICMgaXMgYW4gb2JqZWN0IHNoYXJlZCAoYW5kIHBvdGVudGlhbGx5IG1v
ZGlmaWVkKSBieSBtYW55IG1vZHVsZXMuCisgICAgICAgICMgTW9kaWZ5aW5nIHRoZSBoYW5kbGVy
LCB0aGVuLCBpcyBsZXNzIGludHJ1c2l2ZSBhbmQgbGVzcyBsaWtlbHkgdG8KKyAgICAgICAgIyBp
bnRlcmZlcmUgd2l0aCBtb2RpZmljYXRpb25zIG1hZGUgYnkgb3RoZXIgbW9kdWxlcyAoZS5nLiBp
biB1bml0CisgICAgICAgICMgdGVzdHMpLgorICAgICAgICBoYW5kbGVyLnNldExldmVsKGxvZ19s
ZXZlbCkKKyAgICAgICAgZm9ybWF0dGVyID0gbG9nZ2luZy5Gb3JtYXR0ZXIoIiUobWVzc2FnZSlz
IikKKyAgICAgICAgaGFuZGxlci5zZXRGb3JtYXR0ZXIoZm9ybWF0dGVyKQorCisgICAgICAgIGxv
Z2dlciA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCkKKyAgICAgICAgbG9nZ2VyLmFkZEhhbmRsZXIoaGFu
ZGxlcikKKyAgICAgICAgbG9nZ2VyLnNldExldmVsKGxvZ2dpbmcuTk9UU0VUKQorCisgICAgICAg
ICMgRmlsdGVyIG91dCBtb3N0IHdlYmtpdHB5IG1lc3NhZ2VzLgorICAgICAgICAjCisgICAgICAg
ICMgTWVzc2FnZXMgY2FuIGJlIHNlbGVjdGl2ZWx5IHJlLWVuYWJsZWQgZm9yIHRoaXMgc2NyaXB0
IGJ5IHVwZGF0aW5nCisgICAgICAgICMgdGhpcyBtZXRob2QgYWNjb3JkaW5nbHkuCisgICAgICAg
IGRlZiBmaWx0ZXIocmVjb3JkKToKKyAgICAgICAgICAgICIiIkZpbHRlciBvdXQgYXV0b2luc3Rh
bGwgYW5kIG5vbi10aGlyZC1wYXJ0eSB3ZWJraXRweSBtZXNzYWdlcy4iIiIKKyAgICAgICAgICAg
ICMgRklYTUU6IEZpZ3VyZSBvdXQgYSB3YXkgbm90IHRvIHVzZSBzdHJpbmdzIGhlcmUsIGZvciBl
eGFtcGxlIGJ5CisgICAgICAgICAgICAjICAgICAgICB1c2luZyBzeW50YXggbGlrZSB3ZWJraXRw
eS50ZXN0Ll9fbmFtZV9fLiAgV2Ugd2FudCB0byBiZQorICAgICAgICAgICAgIyAgICAgICAgc3Vy
ZSBub3QgdG8gaW1wb3J0IGFueSBub24tUHl0aG9uIDIuNCBjb2RlLCB0aG91Z2gsIHVudGlsCisg
ICAgICAgICAgICAjICAgICAgICBhZnRlciB0aGUgdmVyc2lvbi1jaGVja2luZyBjb2RlIGhhcyBl
eGVjdXRlZC4KKyAgICAgICAgICAgIGlmIChyZWNvcmQubmFtZS5zdGFydHN3aXRoKCJ3ZWJraXRw
eS5jb21tb24uc3lzdGVtLmF1dG9pbnN0YWxsIikgb3IKKyAgICAgICAgICAgICAgICByZWNvcmQu
bmFtZS5zdGFydHN3aXRoKCJ3ZWJraXRweS50ZXN0IikpOgorICAgICAgICAgICAgICAgIHJldHVy
biBUcnVlCisgICAgICAgICAgICBpZiByZWNvcmQubmFtZS5zdGFydHN3aXRoKCJ3ZWJraXRweSIp
OgorICAgICAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICAgICAgcmV0dXJuIFRydWUK
KworICAgICAgICB0ZXN0aW5nX2ZpbHRlciA9IGxvZ2dpbmcuRmlsdGVyKCkKKyAgICAgICAgdGVz
dGluZ19maWx0ZXIuZmlsdGVyID0gZmlsdGVyCisKKyAgICAgICAgIyBEaXNwbGF5IGEgbWVzc2Fn
ZSBzbyBkZXZlbG9wZXJzIGFyZSBub3QgbXlzdGlmaWVkIGFzIHRvIHdoeQorICAgICAgICAjIGxv
Z2dpbmcgZG9lcyBub3Qgd29yayBpbiB0aGUgdW5pdCB0ZXN0cy4KKyAgICAgICAgX2xvZy5pbmZv
KCJTdXBwcmVzc2luZyBtb3N0IHdlYmtpdHB5IGxvZ2dpbmcgd2hpbGUgcnVubmluZyB1bml0IHRl
c3RzLiIpCisgICAgICAgIGhhbmRsZXIuYWRkRmlsdGVyKHRlc3RpbmdfZmlsdGVyKQorCisgICAg
ICAgIGlmIG9wdGlvbnMucGFzc190aHJvdWdoOgorICAgICAgICAgICAgb3V0cHV0Y2FwdHVyZS5P
dXRwdXRDYXB0dXJlLnN0cmVhbV93cmFwcGVyID0gX0NhcHR1cmVBbmRQYXNzVGhyb3VnaFN0cmVh
bQorCisgICAgZGVmIHNldF90b3RhbChzZWxmLCBudW1fdGVzdHMpOgorICAgICAgICBzZWxmLm51
bV90ZXN0cyA9IG51bV90ZXN0cworCisgICAgZGVmIHdyaXRlX3N0YXJ0ZWRfdGVzdChzZWxmLCBz
b3VyY2UsIHRlc3RfbmFtZSk6CisgICAgICAgIHNlbGYucnVubmluZ190ZXN0cy5hcHBlbmQodGVz
dF9uYW1lKQorICAgICAgICBpZiBsZW4oc2VsZi5ydW5uaW5nX3Rlc3RzKSA+IDE6CisgICAgICAg
ICAgICBzdWZmaXggPSAnICgrJWQpJyAlIChsZW4oc2VsZi5ydW5uaW5nX3Rlc3RzKSAtIDEpCisg
ICAgICAgIGVsc2U6CisgICAgICAgICAgICBzdWZmaXggPSAnJworCisgICAgICAgIGlmIHNlbGYu
b3B0aW9ucy52ZXJib3NlID09IDA6CisgICAgICAgICAgICB3cml0ZSA9IHNlbGYubWV0ZXIud3Jp
dGVfdGhyb3R0bGVkX3VwZGF0ZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgd3JpdGUgPSBz
ZWxmLm1ldGVyLndyaXRlX3VwZGF0ZQorCisgICAgICAgIHdyaXRlKHNlbGYuX3Rlc3RfbGluZShz
ZWxmLnJ1bm5pbmdfdGVzdHNbMF0sIHN1ZmZpeCkpCisKKyAgICBkZWYgd3JpdGVfZmluaXNoZWRf
dGVzdChzZWxmLCBzb3VyY2UsIHRlc3RfbmFtZSwgdGVzdF90aW1lLCBmYWlsdXJlLCBlcnIpOgor
ICAgICAgICB3cml0ZSA9IHNlbGYubWV0ZXIud3JpdGVsbgorICAgICAgICBpZiBmYWlsdXJlOgor
ICAgICAgICAgICAgbGluZXMgPSBmYWlsdXJlWzBdWzFdLnNwbGl0bGluZXMoKSArIFsnJ10KKyAg
ICAgICAgICAgIHN1ZmZpeCA9ICcgZmFpbGVkOicKKyAgICAgICAgZWxpZiBlcnI6CisgICAgICAg
ICAgICBsaW5lcyA9IGVyclswXVsxXS5zcGxpdGxpbmVzKCkgKyBbJyddCisgICAgICAgICAgICBz
dWZmaXggPSAnIGVycmVkOicKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN1ZmZpeCA9ICcg
cGFzc2VkJworICAgICAgICAgICAgbGluZXMgPSBbXQorICAgICAgICAgICAgaWYgc2VsZi5vcHRp
b25zLnZlcmJvc2UgPT0gMDoKKyAgICAgICAgICAgICAgICB3cml0ZSA9IHNlbGYubWV0ZXIud3Jp
dGVfdGhyb3R0bGVkX3VwZGF0ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3
cml0ZSA9IHNlbGYubWV0ZXIud3JpdGVsbgorICAgICAgICBpZiBzZWxmLm9wdGlvbnMudGltaW5n
OgorICAgICAgICAgICAgc3VmZml4ICs9ICcgJS40ZnMnICUgdGVzdF90aW1lCisKKworICAgICAg
ICBzZWxmLm51bV9jb21wbGV0ZWQgKz0gMQorCisgICAgICAgIGlmIHRlc3RfbmFtZSA9PSBzZWxm
LnJ1bm5pbmdfdGVzdHNbMF06CisgICAgICAgICAgICBzZWxmLmNvbXBsZXRlZF90ZXN0cy5pbnNl
cnQoMCwgW3Rlc3RfbmFtZSwgc3VmZml4LCBsaW5lc10pCisgICAgICAgIGVsc2U6CisgICAgICAg
ICAgICBzZWxmLmNvbXBsZXRlZF90ZXN0cy5hcHBlbmQoW3Rlc3RfbmFtZSwgc3VmZml4LCBsaW5l
c10pCisgICAgICAgIHNlbGYucnVubmluZ190ZXN0cy5yZW1vdmUodGVzdF9uYW1lKQorCisgICAg
ICAgIGZvciB0ZXN0X25hbWUsIG1zZywgbGluZXMgaW4gc2VsZi5jb21wbGV0ZWRfdGVzdHM6Cisg
ICAgICAgICAgICBpZiBsaW5lczoKKyAgICAgICAgICAgICAgICBzZWxmLm1ldGVyLndyaXRlbG4o
c2VsZi5fdGVzdF9saW5lKHRlc3RfbmFtZSwgbXNnKSkKKyAgICAgICAgICAgICAgICBmb3IgbGlu
ZSBpbiBsaW5lczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRlci53cml0ZWxuKCcgICcg
KyBsaW5lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB3cml0ZShzZWxmLl90
ZXN0X2xpbmUodGVzdF9uYW1lLCBtc2cpKQorICAgICAgICBzZWxmLmNvbXBsZXRlZF90ZXN0cyA9
IFtdCisKKyAgICBkZWYgX3Rlc3RfbGluZShzZWxmLCB0ZXN0X25hbWUsIHN1ZmZpeCk6CisgICAg
ICAgIHJldHVybiAnWyVkLyVkXSAlcyVzJyAlIChzZWxmLm51bV9jb21wbGV0ZWQsIHNlbGYubnVt
X3Rlc3RzLCB0ZXN0X25hbWUsIHN1ZmZpeCkKKworICAgIGRlZiB3cml0ZV9zdW1tYXJ5KHNlbGYs
IHJlc3VsdCwgcnVuX3RpbWUpOgorICAgICAgICB3cml0ZSA9IHNlbGYubWV0ZXIud3JpdGVsbgor
ICAgICAgICB3cml0ZSgnUmFuICVkIHRlc3QlcyBpbiAlLjNmcycgJQorICAgICAgICAgICAgKHJl
c3VsdC50ZXN0c1J1biwgcmVzdWx0LnRlc3RzUnVuICE9IDEgYW5kICJzIiBvciAiIiwgcnVuX3Rp
bWUpKQorICAgICAgICBpZiByZXN1bHQud2FzU3VjY2Vzc2Z1bCgpOgorICAgICAgICAgICAgd3Jp
dGUoJ1xuT0tcbicpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3cml0ZSgnRkFJTEVEIChm
YWlsdXJlcz0lZCwgZXJyb3JzPSVkKVxuJyAlIChsZW4ocmVzdWx0LmZhaWx1cmVzKSwgbGVuKHJl
c3VsdC5lcnJvcnMpKSkKKworCitjbGFzcyBfQ2FwdHVyZUFuZFBhc3NUaHJvdWdoU3RyZWFtKG9i
amVjdCk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSk6CisgICAgICAgIHNlbGYuX2J1
ZmZlciA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgc2VsZi5fc3RyZWFtID0gc3RyZWFt
CisKKyAgICBkZWYgd3JpdGUoc2VsZiwgbXNnKToKKyAgICAgICAgc2VsZi5fc3RyZWFtLndyaXRl
KG1zZykKKworICAgICAgICAjIE5vdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIGNhcHR1cmUgYW55
IG91dHB1dCBnZW5lcmF0ZWQgYnkgdGhlIGRlYnVnZ2VyCisgICAgICAgICMgYmVjYXVzZSB0aGF0
IGNvdWxkIGNhdXNlIHRoZSByZXN1bHRzIG9mIGNhcHR1cmVfb3V0cHV0KCkgdG8gYmUgaW52YWxp
ZC4KKyAgICAgICAgaWYgbm90IHNlbGYuX21lc3NhZ2VfaXNfZnJvbV9wZGIoKToKKyAgICAgICAg
ICAgIHNlbGYuX2J1ZmZlci53cml0ZShtc2cpCisKKyAgICBkZWYgX21lc3NhZ2VfaXNfZnJvbV9w
ZGIoc2VsZik6CisgICAgICAgICMgV2Ugd2lsbCBhc3N1bWUgdGhhdCBpZiB0aGUgcGRiIG1vZHVs
ZSBpcyBpbiB0aGUgc3RhY2sgdGhlbiB0aGUgb3V0cHV0CisgICAgICAgICMgaXMgYmVpbmcgZ2Vu
ZXJhdGVkIGJ5IHRoZSBweXRob24gZGVidWdnZXIgKG9yIHRoZSB1c2VyIGNhbGxpbmcgc29tZXRo
aW5nCisgICAgICAgICMgZnJvbSBpbnNpZGUgdGhlIGRlYnVnZ2VyKS4KKyAgICAgICAgaW1wb3J0
IGluc3BlY3QKKyAgICAgICAgaW1wb3J0IHBkYgorICAgICAgICBzdGFjayA9IGluc3BlY3Quc3Rh
Y2soKQorICAgICAgICByZXR1cm4gYW55KGZyYW1lWzFdID09IHBkYi5fX2ZpbGVfXy5yZXBsYWNl
KCcucHljJywgJy5weScpIGZvciBmcmFtZSBpbiBzdGFjaykKKworICAgIGRlZiBmbHVzaChzZWxm
KToKKyAgICAgICAgc2VsZi5fc3RyZWFtLmZsdXNoKCkKKworICAgIGRlZiBnZXR2YWx1ZShzZWxm
KToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2J1ZmZlci5nZXR2YWx1ZSgpCisKK2NsYXNzIF9Mb2dI
YW5kbGVyKGxvZ2dpbmcuSGFuZGxlcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1ldGVyKToK
KyAgICAgICAgc3VwZXIoX0xvZ0hhbmRsZXIsIHNlbGYpLl9faW5pdF9fKCkKKyAgICAgICAgc2Vs
Zi5fbWV0ZXIgPSBtZXRlcgorICAgICAgICBzZWxmLm5hbWUgPSBfX25hbWVfXworCisgICAgZGVm
IGVtaXQoc2VsZiwgcmVjb3JkKToKKyAgICAgICAgc2VsZi5fbWV0ZXIud3JpdGVsbihyZWNvcmQu
Z2V0TWVzc2FnZSgpLCByZWNvcmQuY3JlYXRlZCwgcmVjb3JkLnByb2Nlc3MpCmRpZmYgLS1naXQg
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rlc3QvcnVubmVyLnB5IGIvVG9vbHMvU2NyaXB0cy93
ZWJraXRweS90ZXN0L3J1bm5lci5weQppbmRleCBlMTkwZjJjLi5kMjk1ODQ1IDEwMDY0NAotLS0g
YS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rlc3QvcnVubmVyLnB5CisrKyBiL1Rvb2xzL1Njcmlw
dHMvd2Via2l0cHkvdGVzdC9ydW5uZXIucHkKQEAgLTI0LDEwOSArMjQsOTMgQEAKIAogaW1wb3J0
IGxvZ2dpbmcKIGltcG9ydCByZQoraW1wb3J0IFN0cmluZ0lPCiBpbXBvcnQgdGltZQoraW1wb3J0
IHRyYWNlYmFjawogaW1wb3J0IHVuaXR0ZXN0CiAKK2Zyb20gd2Via2l0cHkubGF5b3V0X3Rlc3Rz
LmNvbnRyb2xsZXJzIGltcG9ydCBtYW5hZ2VyX3dvcmtlcl9icm9rZXIKIAogX2xvZyA9IGxvZ2dp
bmcuZ2V0TG9nZ2VyKF9fbmFtZV9fKQogCiAKLWNsYXNzIFRlc3RSdW5uZXIob2JqZWN0KToKLSAg
ICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBvcHRpb25zLCBsb2FkZXIpOgotICAgICAgICBz
ZWxmLm9wdGlvbnMgPSBvcHRpb25zCi0gICAgICAgIHNlbGYuc3RyZWFtID0gc3RyZWFtCi0gICAg
ICAgIHNlbGYubG9hZGVyID0gbG9hZGVyCi0gICAgICAgIHNlbGYudGVzdF9kZXNjcmlwdGlvbiA9
IHJlLmNvbXBpbGUoIihcdyspIFwoKFtcdy5dKylcKSIpCitjbGFzcyBSdW5uZXIob2JqZWN0KToK
KyAgICBkZWYgX19pbml0X18oc2VsZiwgZmluZGVyLCBwcmludGVyLCBvcHRpb25zKToKKyAgICAg
ICAgc2VsZi5fZmluZGVyID0gZmluZGVyCisgICAgICAgIHNlbGYuX3ByaW50ZXIgPSBwcmludGVy
CisgICAgICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCisgICAgICAgIHNlbGYuX3Jlc3VsdCA9
IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQorICAgICAgICBzZWxmLl90ZXN0X2Rlc2NyaXB0aW9uID0g
cmUuY29tcGlsZSgiKFx3KykgXCgoW1x3Ll0rKVwpIikKIAotICAgIGRlZiB0ZXN0X25hbWUoc2Vs
ZiwgdGVzdCk6Ci0gICAgICAgIG0gPSBzZWxmLnRlc3RfZGVzY3JpcHRpb24ubWF0Y2goc3RyKHRl
c3QpKQorICAgIGRlZiBfdGVzdF9uYW1lKHNlbGYsIHRlc3QpOgorICAgICAgICBtID0gc2VsZi5f
dGVzdF9kZXNjcmlwdGlvbi5tYXRjaChzdHIodGVzdCkpCiAgICAgICAgIHJldHVybiAiJXMuJXMi
ICUgKG0uZ3JvdXAoMiksIG0uZ3JvdXAoMSkpCiAKLSAgICBkZWYgYWxsX3Rlc3RfbmFtZXMoc2Vs
Ziwgc3VpdGUpOgorICAgIGRlZiBfYWxsX3Rlc3RfbmFtZXMoc2VsZiwgc3VpdGUpOgogICAgICAg
ICBuYW1lcyA9IFtdCiAgICAgICAgIGlmIGhhc2F0dHIoc3VpdGUsICdfdGVzdHMnKToKICAgICAg
ICAgICAgIGZvciB0IGluIHN1aXRlLl90ZXN0czoKLSAgICAgICAgICAgICAgICBuYW1lcy5leHRl
bmQoc2VsZi5hbGxfdGVzdF9uYW1lcyh0KSkKKyAgICAgICAgICAgICAgICBuYW1lcy5leHRlbmQo
c2VsZi5fYWxsX3Rlc3RfbmFtZXModCkpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBuYW1l
cy5hcHBlbmQoc2VsZi50ZXN0X25hbWUoc3VpdGUpKQorICAgICAgICAgICAgbmFtZXMuYXBwZW5k
KHNlbGYuX3Rlc3RfbmFtZShzdWl0ZSkpCiAgICAgICAgIHJldHVybiBuYW1lcwogCi0gICAgZGVm
IHJ1bihzZWxmLCBzdWl0ZSk6CisgICAgZGVmIHJ1bihzZWxmLCBuYW1lcyk6CiAgICAgICAgIHJ1
bl9zdGFydF90aW1lID0gdGltZS50aW1lKCkKLSAgICAgICAgYWxsX3Rlc3RfbmFtZXMgPSBzZWxm
LmFsbF90ZXN0X25hbWVzKHN1aXRlKQorCisgICAgICAgIF9sb2cuZGVidWcoIkxvYWRpbmcgdGhl
IHRlc3RzLi4uIikKKworICAgICAgICBsb2FkZXIgPSB1bml0dGVzdC5kZWZhdWx0VGVzdExvYWRl
cgorICAgICAgICBzdWl0ZXMgPSBbXQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAg
ICAgICAgIGlmIHNlbGYuX2ZpbmRlci5pc19tb2R1bGUobmFtZSk6CisgICAgICAgICAgICAgICAg
IyBpZiB3ZSBmYWlsZWQgdG8gbG9hZCBhIG5hbWUgYW5kIGl0IGxvb2tzIGxpa2UgYSBtb2R1bGUs
CisgICAgICAgICAgICAgICAgIyB0cnkgaW1wb3J0aW5nIGl0IGRpcmVjdGx5LCBiZWNhdXNlIGxv
YWRUZXN0c0Zyb21OYW1lKCkKKyAgICAgICAgICAgICAgICAjIHByb2R1Y2VzIGxvdXN5IGVycm9y
IG1lc3NhZ2VzIGZvciBiYWQgbW9kdWxlcy4KKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAg
ICAgICAgICAgICAgIF9faW1wb3J0X18obmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1w
b3J0RXJyb3IsIGU6CisgICAgICAgICAgICAgICAgICAgIF9sb2cuZmF0YWwoJ0ZhaWxlZCB0byBp
bXBvcnQgJXM6JyAlIG5hbWUpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2xvZ19leGNlcHRp
b24oKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAgICAgc3Vp
dGVzLmFwcGVuZChsb2FkZXIubG9hZFRlc3RzRnJvbU5hbWUobmFtZSwgTm9uZSkpCisKKyAgICAg
ICAgdGVzdF9zdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZShzdWl0ZXMpCisgICAgICAgIGFsbF90
ZXN0cyA9IHNlbGYuX2FsbF90ZXN0X25hbWVzKHRlc3Rfc3VpdGUpCisgICAgICAgIHNlbGYuX3By
aW50ZXIuc2V0X3RvdGFsKGxlbihhbGxfdGVzdHMpKQorCisgICAgICAgIHdpdGggbWFuYWdlcl93
b3JrZXJfYnJva2VyLk1lc3NhZ2VQb29sKHNlbGYsIF9Xb3JrZXIsIHNlbGYuX29wdGlvbnMuY2hp
bGRfcHJvY2Vzc2VzKSBhcyBwb29sOgorICAgICAgICAgICAgcG9vbC5ydW4oKCd0ZXN0JywgdGVz
dF9uYW1lKSBmb3IgdGVzdF9uYW1lIGluIGFsbF90ZXN0cykKKworICAgICAgICBzZWxmLl9wcmlu
dGVyLndyaXRlX3N1bW1hcnkoc2VsZi5fcmVzdWx0LCB0aW1lLnRpbWUoKSAtIHJ1bl9zdGFydF90
aW1lKQorICAgICAgICByZXR1cm4gc2VsZi5fcmVzdWx0CisKKyAgICBkZWYgaGFuZGxlKHNlbGYs
IG1lc3NhZ2VfbmFtZSwgc291cmNlLCB0ZXN0X25hbWUsIGRlbGF5PU5vbmUsIHJlc3VsdD1Ob25l
KToKKyAgICAgICAgaWYgbWVzc2FnZV9uYW1lID09ICdzdGFydGVkX3Rlc3QnOgorICAgICAgICAg
ICAgc2VsZi5fcHJpbnRlci53cml0ZV9zdGFydGVkX3Rlc3Qoc291cmNlLCB0ZXN0X25hbWUpCisg
ICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fcmVzdWx0LnRlc3RzUnVuICs9IDEKKyAg
ICAgICAgc2VsZi5fcmVzdWx0LmVycm9ycy5leHRlbmQocmVzdWx0LmVycm9ycykKKyAgICAgICAg
c2VsZi5fcmVzdWx0LmZhaWx1cmVzLmV4dGVuZChyZXN1bHQuZmFpbHVyZXMpCisgICAgICAgIHNl
bGYuX3ByaW50ZXIud3JpdGVfZmluaXNoZWRfdGVzdChzb3VyY2UsIHRlc3RfbmFtZSwgZGVsYXks
IHJlc3VsdC5mYWlsdXJlcywgcmVzdWx0LmVycm9ycykKKworICAgIGRlZiBfbG9nX2V4Y2VwdGlv
bihzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKKyAgICAgICAgdHJhY2Vi
YWNrLnByaW50X2V4YyhmaWxlPXMpCisgICAgICAgIGZvciBsIGluIHMuYnVmbGlzdDoKKyAgICAg
ICAgICAgIF9sb2cuZXJyb3IoJyAgJyArIGwucnN0cmlwKCkpCisKKworY2xhc3MgX1dvcmtlcihv
YmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBjYWxsZXIpOgorICAgICAgICBzZWxmLl9j
YWxsZXIgPSBjYWxsZXIKKworICAgIGRlZiBoYW5kbGUoc2VsZiwgbWVzc2FnZV9uYW1lLCBzb3Vy
Y2UsIHRlc3RfbmFtZSk6CisgICAgICAgIGFzc2VydCBtZXNzYWdlX25hbWUgPT0gJ3Rlc3QnCisg
ICAgICAgIGxvYWRlciA9IHVuaXR0ZXN0LmRlZmF1bHRUZXN0TG9hZGVyCiAgICAgICAgIHJlc3Vs
dCA9IHVuaXR0ZXN0LlRlc3RSZXN1bHQoKQotICAgICAgICBzdG9wID0gcnVuX3N0YXJ0X3RpbWUK
LSAgICAgICAgZm9yIHRlc3RfbmFtZSBpbiBhbGxfdGVzdF9uYW1lczoKLSAgICAgICAgICAgIGlm
IHNlbGYub3B0aW9ucy52ZXJib3NlOgotICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRl
KHRlc3RfbmFtZSkKLSAgICAgICAgICAgIG51bV9mYWlsdXJlcyA9IGxlbihyZXN1bHQuZmFpbHVy
ZXMpCi0gICAgICAgICAgICBudW1fZXJyb3JzID0gbGVuKHJlc3VsdC5lcnJvcnMpCi0KLSAgICAg
ICAgICAgIHN0YXJ0ID0gdGltZS50aW1lKCkKLSAgICAgICAgICAgICMgRklYTUU6IGl0J3Mga2lu
ZGEgbGFtZSB0aGF0IHdlIHJlLWxvYWQgdGhlIHRlc3Qgc3VpdGVzIGZvciBlYWNoCi0gICAgICAg
ICAgICAjIHRlc3QsIGFuZCB0aGlzIG1heSBzbG93IHRoaW5ncyBkb3duLCBidXQgdGhpcyBtYWtl
cyBpbXBsZW1lbnRpbmcKLSAgICAgICAgICAgICMgdGhlIGxvZ2dpbmcgZWFzeSBhbmQgd2lsbCBh
bHNvIGFsbG93IHVzIHRvIHBhcmFsbGVsaXplIG5pY2VseS4KLSAgICAgICAgICAgIHNlbGYubG9h
ZGVyLmxvYWRUZXN0c0Zyb21OYW1lKHRlc3RfbmFtZSwgTm9uZSkucnVuKHJlc3VsdCkKLSAgICAg
ICAgICAgIHN0b3AgPSB0aW1lLnRpbWUoKQotCi0gICAgICAgICAgICBlcnIgPSBOb25lCi0gICAg
ICAgICAgICBmYWlsdXJlID0gTm9uZQotICAgICAgICAgICAgaWYgbGVuKHJlc3VsdC5mYWlsdXJl
cykgPiBudW1fZmFpbHVyZXM6Ci0gICAgICAgICAgICAgICAgZmFpbHVyZSA9IHJlc3VsdC5mYWls
dXJlc1tudW1fZmFpbHVyZXNdWzFdCi0gICAgICAgICAgICBlbGlmIGxlbihyZXN1bHQuZXJyb3Jz
KSA+IG51bV9lcnJvcnM6Ci0gICAgICAgICAgICAgICAgZXJyID0gcmVzdWx0LmVycm9yc1tudW1f
ZXJyb3JzXVsxXQotICAgICAgICAgICAgc2VsZi53cml0ZV9yZXN1bHQocmVzdWx0LCB0ZXN0X25h
bWUsIHN0b3AgLSBzdGFydCwgZmFpbHVyZSwgZXJyKQotCi0gICAgICAgIHNlbGYud3JpdGVfc3Vt
bWFyeShyZXN1bHQsIHN0b3AgLSBydW5fc3RhcnRfdGltZSkKLQotICAgICAgICByZXR1cm4gcmVz
dWx0Ci0KLSAgICBkZWYgd3JpdGVfcmVzdWx0KHNlbGYsIHJlc3VsdCwgdGVzdF9uYW1lLCB0ZXN0
X3RpbWUsIGZhaWx1cmU9Tm9uZSwgZXJyPU5vbmUpOgotICAgICAgICB0aW1pbmcgPSAnJwotICAg
ICAgICBpZiBzZWxmLm9wdGlvbnMudGltaW5nOgotICAgICAgICAgICAgdGltaW5nID0gJyAlLjRm
cycgJSB0ZXN0X3RpbWUKLSAgICAgICAgaWYgc2VsZi5vcHRpb25zLnZlcmJvc2U6Ci0gICAgICAg
ICAgICBpZiBmYWlsdXJlOgotICAgICAgICAgICAgICAgIG1zZyA9ICcgZmFpbGVkJwotICAgICAg
ICAgICAgZWxpZiBlcnI6Ci0gICAgICAgICAgICAgICAgbXNnID0gJyBlcnJlZCcKLSAgICAgICAg
ICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbXNnID0gJyBwYXNzZWQnCi0gICAgICAgICAgICBz
ZWxmLnN0cmVhbS53cml0ZShtc2cgKyB0aW1pbmcgKyAnXG4nKQotICAgICAgICBlbHNlOgotICAg
ICAgICAgICAgaWYgZmFpbHVyZToKLSAgICAgICAgICAgICAgICBtc2cgPSAnRicKLSAgICAgICAg
ICAgIGVsaWYgZXJyOgotICAgICAgICAgICAgICAgIG1zZyA9ICdFJwotICAgICAgICAgICAgZWxz
ZToKLSAgICAgICAgICAgICAgICBtc2cgPSAnLicKLSAgICAgICAgICAgIHNlbGYuc3RyZWFtLndy
aXRlKG1zZykKLQotICAgIGRlZiB3cml0ZV9zdW1tYXJ5KHNlbGYsIHJlc3VsdCwgcnVuX3RpbWUp
OgotICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgnXG4nKQotCi0gICAgICAgIGZvciAodGVzdCwg
ZXJyKSBpbiByZXN1bHQuZXJyb3JzOgotICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoIj0i
ICogODAgKyAnXG4nKQotICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoIkVSUk9SOiAiICsg
c2VsZi50ZXN0X25hbWUodGVzdCkgKyAnXG4nKQotICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3Jp
dGUoIi0iICogODAgKyAnXG4nKQotICAgICAgICAgICAgZm9yIGxpbmUgaW4gZXJyLnNwbGl0bGlu
ZXMoKToKLSAgICAgICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZShsaW5lICsgJ1xuJykKLSAg
ICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKCdcbicpCi0KLSAgICAgICAgZm9yICh0ZXN0LCBm
YWlsdXJlKSBpbiByZXN1bHQuZmFpbHVyZXM6Ci0gICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0
ZSgiPSIgKiA4MCArICdcbicpCi0gICAgICAgICAgICBzZWxmLnN0cmVhbS53cml0ZSgiRkFJTFVS
RTogIiArIHNlbGYudGVzdF9uYW1lKHRlc3QpICsgJ1xuJykKLSAgICAgICAgICAgIHNlbGYuc3Ry
ZWFtLndyaXRlKCItIiAqIDgwICsgJ1xuJykKLSAgICAgICAgICAgIGZvciBsaW5lIGluIGZhaWx1
cmUuc3BsaXRsaW5lcygpOgotICAgICAgICAgICAgICAgIHNlbGYuc3RyZWFtLndyaXRlKGxpbmUg
KyAnXG4nKQotICAgICAgICAgICAgc2VsZi5zdHJlYW0ud3JpdGUoJ1xuJykKLQotICAgICAgICBz
ZWxmLnN0cmVhbS53cml0ZSgnLScgKiA4MCArICdcbicpCi0gICAgICAgIHNlbGYuc3RyZWFtLndy
aXRlKCdSYW4gJWQgdGVzdCVzIGluICUuM2ZzXG4nICUKLSAgICAgICAgICAgIChyZXN1bHQudGVz
dHNSdW4sIHJlc3VsdC50ZXN0c1J1biAhPSAxIGFuZCAicyIgb3IgIiIsIHJ1bl90aW1lKSkKLQot
ICAgICAgICBpZiByZXN1bHQud2FzU3VjY2Vzc2Z1bCgpOgotICAgICAgICAgICAgc2VsZi5zdHJl
YW0ud3JpdGUoJ1xuT0tcbicpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnN0cmVh
bS53cml0ZSgnRkFJTEVEIChmYWlsdXJlcz0lZCwgZXJyb3JzPSVkKVxuJyAlCi0gICAgICAgICAg
ICAgICAgKGxlbihyZXN1bHQuZmFpbHVyZXMpLCBsZW4ocmVzdWx0LmVycm9ycykpKQorICAgICAg
ICBzdGFydCA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuX2NhbGxlci5wb3N0KCdzdGFydGVk
X3Rlc3QnLCB0ZXN0X25hbWUpCisgICAgICAgIGxvYWRlci5sb2FkVGVzdHNGcm9tTmFtZSh0ZXN0
X25hbWUsIE5vbmUpLnJ1bihyZXN1bHQpCisgICAgICAgIHNlbGYuX2NhbGxlci5wb3N0KCdmaW5p
c2hlZF90ZXN0JywgdGVzdF9uYW1lLCB0aW1lLnRpbWUoKSAtIHN0YXJ0LCByZXN1bHQpCmRpZmYg
LS1naXQgYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rlc3QvcnVubmVyX3VuaXR0ZXN0LnB5IGIv
VG9vbHMvU2NyaXB0cy93ZWJraXRweS90ZXN0L3J1bm5lcl91bml0dGVzdC5weQppbmRleCBlMmVh
MzFhLi4zNTNiYzEyIDEwMDY0NAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L3Rlc3QvcnVu
bmVyX3VuaXR0ZXN0LnB5CisrKyBiL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGVzdC9ydW5uZXJf
dW5pdHRlc3QucHkKQEAgLTI1LDcgKzI1LDcgQEAgaW1wb3J0IFN0cmluZ0lPCiBpbXBvcnQgdW5p
dHRlc3QKIAogZnJvbSB3ZWJraXRweS50b29sLm1vY2t0b29sIGltcG9ydCBNb2NrT3B0aW9ucwot
ZnJvbSB3ZWJraXRweS50ZXN0LnJ1bm5lciBpbXBvcnQgVGVzdFJ1bm5lcgorZnJvbSB3ZWJraXRw
eS50ZXN0LnJ1bm5lciBpbXBvcnQgUnVubmVyCiAKIAogY2xhc3MgRmFrZU1vZHVsZVN1aXRlKG9i
amVjdCk6CkBAIC02OSwxMiArNjksMTMgQEAgY2xhc3MgRmFrZUxvYWRlcihvYmplY3QpOgogCiBj
bGFzcyBSdW5uZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9yZWd1bGFy
KHNlbGYpOgotICAgICAgICBvcHRpb25zID0gTW9ja09wdGlvbnModmVyYm9zZT0wLCB0aW1pbmc9
RmFsc2UpCisgICAgICAgIHJldHVybiAgIyBGSVhNRQorICAgICAgICBvcHRpb25zID0gTW9ja09w
dGlvbnModmVyYm9zZT0wLCB0aW1pbmc9RmFsc2UsIGNoaWxkX3Byb2Nlc3Nlcz0xKQogICAgICAg
ICBzdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTygpCiAgICAgICAgIGxvYWRlciA9IEZha2VMb2Fk
ZXIoKCd0ZXN0MSAoRm9vKScsICcuJywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICgndGVzdDIgKEZvbyknLCAnRicsICd0ZXN0MlxuZmFpbGVkJyksCiAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgKCd0ZXN0MyAoRm9vKScsICdFJywgJ3Rlc3QzXG5lcnJlZCcpKQotICAgICAg
ICByZXN1bHQgPSBUZXN0UnVubmVyKHN0cmVhbSwgb3B0aW9ucywgbG9hZGVyKS5ydW4obG9hZGVy
LnRvcF9zdWl0ZSgpKQorICAgICAgICByZXN1bHQgPSBSdW5uZXIoc3RyZWFtLCBvcHRpb25zLCBs
b2FkZXIpLnJ1bihsb2FkZXIudG9wX3N1aXRlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uo
cmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0
LnRlc3RzUnVuLCAzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocmVzdWx0LmZhaWx1
cmVzKSwgMSkKQEAgLTgyLDEyICs4MywxMyBAQCBjbGFzcyBSdW5uZXJUZXN0KHVuaXR0ZXN0LlRl
c3RDYXNlKToKICAgICAgICAgIyBGSVhNRTogY2hlY2sgdGhlIG91dHB1dCBmcm9tIHRoZSB0ZXN0
CiAKICAgICBkZWYgdGVzdF92ZXJib3NlKHNlbGYpOgotICAgICAgICBvcHRpb25zID0gTW9ja09w
dGlvbnModmVyYm9zZT0xLCB0aW1pbmc9RmFsc2UpCisgICAgICAgIHJldHVybiAgIyBGSVhNRQor
ICAgICAgICBvcHRpb25zID0gTW9ja09wdGlvbnModmVyYm9zZT0xLCB0aW1pbmc9RmFsc2UsIGNo
aWxkX3Byb2Nlc3Nlcz0xKQogICAgICAgICBzdHJlYW0gPSBTdHJpbmdJTy5TdHJpbmdJTygpCiAg
ICAgICAgIGxvYWRlciA9IEZha2VMb2FkZXIoKCd0ZXN0MSAoRm9vKScsICcuJywgJycpLAogICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICgndGVzdDIgKEZvbyknLCAnRicsICd0ZXN0MlxuZmFp
bGVkJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCd0ZXN0MyAoRm9vKScsICdFJywg
J3Rlc3QzXG5lcnJlZCcpKQotICAgICAgICByZXN1bHQgPSBUZXN0UnVubmVyKHN0cmVhbSwgb3B0
aW9ucywgbG9hZGVyKS5ydW4obG9hZGVyLnRvcF9zdWl0ZSgpKQorICAgICAgICByZXN1bHQgPSBS
dW5uZXIoc3RyZWFtLCBvcHRpb25zLCBsb2FkZXIpLnJ1bihsb2FkZXIudG9wX3N1aXRlKCkpCiAg
ICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0Lndhc1N1Y2Nlc3NmdWwoKSkKICAgICAgICAg
c2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LnRlc3RzUnVuLCAzKQogICAgICAgICBzZWxmLmFzc2Vy
dEVxdWFscyhsZW4ocmVzdWx0LmZhaWx1cmVzKSwgMSkKQEAgLTk1LDEyICs5NywxMyBAQCBjbGFz
cyBSdW5uZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgIyBGSVhNRTogY2hlY2sg
dGhlIG91dHB1dCBmcm9tIHRoZSB0ZXN0CiAKICAgICBkZWYgdGVzdF90aW1pbmcoc2VsZik6Ci0g
ICAgICAgIG9wdGlvbnMgPSBNb2NrT3B0aW9ucyh2ZXJib3NlPTAsIHRpbWluZz1UcnVlKQorICAg
ICAgICByZXR1cm4gICMgRklYTUUKKyAgICAgICAgb3B0aW9ucyA9IE1vY2tPcHRpb25zKHZlcmJv
c2U9MCwgdGltaW5nPVRydWUsIGNoaWxkX3Byb2Nlc3Nlcz0xKQogICAgICAgICBzdHJlYW0gPSBT
dHJpbmdJTy5TdHJpbmdJTygpCiAgICAgICAgIGxvYWRlciA9IEZha2VMb2FkZXIoKCd0ZXN0MSAo
Rm9vKScsICcuJywgJycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgndGVzdDIgKEZv
byknLCAnRicsICd0ZXN0MlxuZmFpbGVkJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
KCd0ZXN0MyAoRm9vKScsICdFJywgJ3Rlc3QzXG5lcnJlZCcpKQotICAgICAgICByZXN1bHQgPSBU
ZXN0UnVubmVyKHN0cmVhbSwgb3B0aW9ucywgbG9hZGVyKS5ydW4obG9hZGVyLnRvcF9zdWl0ZSgp
KQorICAgICAgICByZXN1bHQgPSBSdW5uZXIoc3RyZWFtLCBvcHRpb25zLCBsb2FkZXIpLnJ1bihs
b2FkZXIudG9wX3N1aXRlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmVzdWx0Lndhc1N1
Y2Nlc3NmdWwoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LnRlc3RzUnVuLCAz
KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocmVzdWx0LmZhaWx1cmVzKSwgMSkKZGlm
ZiAtLWdpdCBhL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvdGVzdC90ZXN0X2ZpbmRlci5weSBiL1Rv
b2xzL1NjcmlwdHMvd2Via2l0cHkvdGVzdC90ZXN0X2ZpbmRlci5weQpkZWxldGVkIGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggM2E5MDE5Ny4uMDAwMDAwMAotLS0gYS9Ub29scy9TY3JpcHRzL3dlYmtp
dHB5L3Rlc3QvdGVzdF9maW5kZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAot
IyBDb3B5cmlnaHQgKEMpIDIwMTIgR29vZ2xlLCBJbmMuCi0jIENvcHlyaWdodCAoQykgMjAxMCBD
aHJpcyBKZXJkb25layAoY2plcmRvbmVrQHdlYmtpdC5vcmcpCi0jCi0jIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKLSMgYXJlIG1ldDoKLSMgMS4gIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jICAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jIDIuICBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAotIyAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQotIyAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSMKLSMgVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIEFORCBJVFMgQ09OVFJJQlVUT1JTIGBgQVMg
SVMnJyBBTkQKLSMgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKLSMgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotIyBESVND
TEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SIElUUyBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUgotIyBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCi0jIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCi0jIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSCi0jIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0jIE9SIFRPUlQgKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiInRoaXMgbW9kdWxlIGlzIHJlc3BvbnNpYmxlIGZv
ciBmaW5kaW5nIHB5dGhvbiB0ZXN0cy4iIiIKLQotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCByZQot
aW1wb3J0IHN5cwotCi0KLV9sb2cgPSBsb2dnaW5nLmdldExvZ2dlcihfX25hbWVfXykKLQotCi1j
bGFzcyBUZXN0RGlyZWN0b3J5VHJlZShvYmplY3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBm
aWxlc3lzdGVtLCB0b3BfZGlyZWN0b3J5LCBzdGFydGluZ19zdWJkaXJlY3RvcnkpOgotICAgICAg
ICBzZWxmLmZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtCi0gICAgICAgIHNlbGYudG9wX2RpcmVjdG9y
eSA9IGZpbGVzeXN0ZW0ucmVhbHBhdGgodG9wX2RpcmVjdG9yeSkKLSAgICAgICAgc2VsZi5zZWFy
Y2hfZGlyZWN0b3J5ID0gc2VsZi50b3BfZGlyZWN0b3J5Ci0gICAgICAgIHNlbGYudG9wX3BhY2th
Z2UgPSAnJwotICAgICAgICBpZiBzdGFydGluZ19zdWJkaXJlY3Rvcnk6Ci0gICAgICAgICAgICBz
ZWxmLnRvcF9wYWNrYWdlID0gc3RhcnRpbmdfc3ViZGlyZWN0b3J5LnJlcGxhY2UoZmlsZXN5c3Rl
bS5zZXAsICcuJykgKyAnLicKLSAgICAgICAgICAgIHNlbGYuc2VhcmNoX2RpcmVjdG9yeSA9IGZp
bGVzeXN0ZW0uam9pbihzZWxmLnRvcF9kaXJlY3RvcnksIHN0YXJ0aW5nX3N1YmRpcmVjdG9yeSkK
LQotICAgIGRlZiBmaW5kX21vZHVsZXMoc2VsZiwgc3VmZml4ZXMsIHN1Yl9kaXJlY3Rvcnk9Tm9u
ZSk6Ci0gICAgICAgIGlmIHN1Yl9kaXJlY3Rvcnk6Ci0gICAgICAgICAgICBzZWFyY2hfZGlyZWN0
b3J5ID0gc2VsZi5maWxlc3lzdGVtLmpvaW4oc2VsZi50b3BfZGlyZWN0b3J5LCBzdWJfZGlyZWN0
b3J5KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VhcmNoX2RpcmVjdG9yeSA9IHNlbGYu
c2VhcmNoX2RpcmVjdG9yeQotCi0gICAgICAgIGRlZiBmaWxlX2ZpbHRlcihmaWxlc3lzdGVtLCBk
aXJuYW1lLCBiYXNlbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gYW55KGJhc2VuYW1lLmVuZHN3
aXRoKHN1ZmZpeCkgZm9yIHN1ZmZpeCBpbiBzdWZmaXhlcykKLQotICAgICAgICBmaWxlbmFtZXMg
PSBzZWxmLmZpbGVzeXN0ZW0uZmlsZXNfdW5kZXIoc2VhcmNoX2RpcmVjdG9yeSwgZmlsZV9maWx0
ZXI9ZmlsZV9maWx0ZXIpCi0gICAgICAgIHJldHVybiBbc2VsZi50b19tb2R1bGUoZmlsZW5hbWUp
IGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXNdCi0KLSAgICBkZWYgdG9fbW9kdWxlKHNlbGYsIHBh
dGgpOgotICAgICAgICByZXR1cm4gcGF0aC5yZXBsYWNlKHNlbGYudG9wX2RpcmVjdG9yeSArIHNl
bGYuZmlsZXN5c3RlbS5zZXAsICcnKS5yZXBsYWNlKHNlbGYuZmlsZXN5c3RlbS5zZXAsICcuJylb
Oi0zXQotCi0gICAgZGVmIHN1YnBhdGgoc2VsZiwgcGF0aCk6Ci0gICAgICAgICIiIlJldHVybnMg
dGhlIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgdG9wIG9mIHRoZSB0cmVlIHRvIHRoZSBwYXRoLCBv
ciBOb25lIGlmIHRoZSBwYXRoIGlzIG5vdCB1bmRlciB0aGUgdG9wIG9mIHRoZSB0cmVlLiIiIgot
ICAgICAgICByZWFscGF0aCA9IHNlbGYuZmlsZXN5c3RlbS5yZWFscGF0aChzZWxmLmZpbGVzeXN0
ZW0uam9pbihzZWxmLnRvcF9kaXJlY3RvcnksIHBhdGgpKQotICAgICAgICBpZiByZWFscGF0aC5z
dGFydHN3aXRoKHNlbGYudG9wX2RpcmVjdG9yeSArIHNlbGYuZmlsZXN5c3RlbS5zZXApOgotICAg
ICAgICAgICAgcmV0dXJuIHJlYWxwYXRoLnJlcGxhY2Uoc2VsZi50b3BfZGlyZWN0b3J5ICsgc2Vs
Zi5maWxlc3lzdGVtLnNlcCwgJycpCi0gICAgICAgIHJldHVybiBOb25lCi0KLQotICAgIGRlZiBj
bGVhbihzZWxmKToKLSAgICAgICAgIiIiRGVsZXRlIGFsbCAucHljIGZpbGVzIGluIHRoZSB0cmVl
IHRoYXQgaGF2ZSBubyBtYXRjaGluZyAucHkgZmlsZS4iIiIKLSAgICAgICAgX2xvZy5kZWJ1Zygi
Q2xlYW5pbmcgb3JwaGFuZWQgKi5weWMgZmlsZXMgZnJvbTogJXMiICUgc2VsZi5zZWFyY2hfZGly
ZWN0b3J5KQotICAgICAgICBmaWxlbmFtZXMgPSBzZWxmLmZpbGVzeXN0ZW0uZmlsZXNfdW5kZXIo
c2VsZi5zZWFyY2hfZGlyZWN0b3J5KQotICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVz
OgotICAgICAgICAgICAgaWYgZmlsZW5hbWUuZW5kc3dpdGgoIi5weWMiKSBhbmQgZmlsZW5hbWVb
Oi0xXSBub3QgaW4gZmlsZW5hbWVzOgotICAgICAgICAgICAgICAgIF9sb2cuaW5mbygiRGVsZXRp
bmcgb3JwaGFuICoucHljIGZpbGU6ICVzIiAlIGZpbGVuYW1lKQotICAgICAgICAgICAgICAgIHNl
bGYuZmlsZXN5c3RlbS5yZW1vdmUoZmlsZW5hbWUpCi0KLQotY2xhc3MgVGVzdEZpbmRlcihvYmpl
Y3QpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmaWxlc3lzdGVtKToKLSAgICAgICAgc2VsZi5m
aWxlc3lzdGVtID0gZmlsZXN5c3RlbQotICAgICAgICBzZWxmLnRyZWVzID0gW10KLQotICAgIGRl
ZiBhZGRfdHJlZShzZWxmLCB0b3BfZGlyZWN0b3J5LCBzdGFydGluZ19zdWJkaXJlY3Rvcnk9Tm9u
ZSk6Ci0gICAgICAgIHNlbGYudHJlZXMuYXBwZW5kKFRlc3REaXJlY3RvcnlUcmVlKHNlbGYuZmls
ZXN5c3RlbSwgdG9wX2RpcmVjdG9yeSwgc3RhcnRpbmdfc3ViZGlyZWN0b3J5KSkKLQotICAgIGRl
ZiBhZGRpdGlvbmFsX3BhdGhzKHNlbGYsIHBhdGhzKToKLSAgICAgICAgcmV0dXJuIFt0cmVlLnRv
cF9kaXJlY3RvcnkgZm9yIHRyZWUgaW4gc2VsZi50cmVlcyBpZiB0cmVlLnRvcF9kaXJlY3Rvcnkg
bm90IGluIHBhdGhzXQotCi0gICAgZGVmIGNsZWFuX3RyZWVzKHNlbGYpOgotICAgICAgICBmb3Ig
dHJlZSBpbiBzZWxmLnRyZWVzOgotICAgICAgICAgICAgdHJlZS5jbGVhbigpCi0KLSAgICBkZWYg
aXNfbW9kdWxlKHNlbGYsIG5hbWUpOgotICAgICAgICByZWxwYXRoID0gbmFtZS5yZXBsYWNlKCcu
Jywgc2VsZi5maWxlc3lzdGVtLnNlcCkgKyAnLnB5JwotICAgICAgICByZXR1cm4gYW55KHNlbGYu
ZmlsZXN5c3RlbS5leGlzdHMoc2VsZi5maWxlc3lzdGVtLmpvaW4odHJlZS50b3BfZGlyZWN0b3J5
LCByZWxwYXRoKSkgZm9yIHRyZWUgaW4gc2VsZi50cmVlcykKLQotICAgIGRlZiBpc19kb3R0ZWRf
bmFtZShzZWxmLCBuYW1lKToKLSAgICAgICAgcmV0dXJuIHJlLm1hdGNoKHInW2EtekEtWi5dW2Et
ekEtWjAtOV8uXSonLCBuYW1lKQotCi0gICAgZGVmIHRvX21vZHVsZShzZWxmLCBwYXRoKToKLSAg
ICAgICAgZm9yIHRyZWUgaW4gc2VsZi50cmVlczoKLSAgICAgICAgICAgIGlmIHBhdGguc3RhcnRz
d2l0aCh0cmVlLnRvcF9kaXJlY3RvcnkpOgotICAgICAgICAgICAgICAgIHJldHVybiB0cmVlLnRv
X21vZHVsZShwYXRoKQotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgZGVmIGZpbmRfbmFtZXMo
c2VsZiwgYXJncywgc2tpcF9pbnRlZ3JhdGlvbnRlc3RzLCBmaW5kX2FsbCk6Ci0gICAgICAgIHN1
ZmZpeGVzID0gWydfdW5pdHRlc3QucHknXQotICAgICAgICBpZiBub3Qgc2tpcF9pbnRlZ3JhdGlv
bnRlc3RzOgotICAgICAgICAgICAgc3VmZml4ZXMuYXBwZW5kKCdfaW50ZWdyYXRpb250ZXN0LnB5
JykKLQotICAgICAgICBpZiBhcmdzOgotICAgICAgICAgICAgbmFtZXMgPSBbXQotICAgICAgICAg
ICAgZm9yIGFyZyBpbiBhcmdzOgotICAgICAgICAgICAgICAgIG5hbWVzLmV4dGVuZChzZWxmLl9m
aW5kX25hbWVzX2Zvcl9hcmcoYXJnLCBzdWZmaXhlcykpCi0gICAgICAgICAgICByZXR1cm4gbmFt
ZXMKLQotICAgICAgICByZXR1cm4gc2VsZi5fZGVmYXVsdF9uYW1lcyhzdWZmaXhlcywgZmluZF9h
bGwpCi0KLSAgICBkZWYgX2ZpbmRfbmFtZXNfZm9yX2FyZyhzZWxmLCBhcmcsIHN1ZmZpeGVzKToK
LSAgICAgICAgcmVhbHBhdGggPSBzZWxmLmZpbGVzeXN0ZW0ucmVhbHBhdGgoYXJnKQotICAgICAg
ICBpZiBzZWxmLmZpbGVzeXN0ZW0uZXhpc3RzKHJlYWxwYXRoKToKLSAgICAgICAgICAgIG5hbWVz
ID0gc2VsZi5fZmluZF9pbl90cmVlcyhyZWFscGF0aCwgc3VmZml4ZXMpCi0gICAgICAgICAgICBp
ZiBub3QgbmFtZXM6Ci0gICAgICAgICAgICAgICAgX2xvZy5lcnJvcigiJXMgaXMgbm90IGluIG9u
ZSBvZiB0aGUgdGVzdCB0cmVlcy4iICUgYXJnKQotICAgICAgICAgICAgcmV0dXJuIG5hbWVzCi0K
LSAgICAgICAgIyBTZWUgaWYgaXQncyBhIHB5dGhvbiBwYWNrYWdlIGluIGEgdHJlZSAob3IgYSBy
ZWxhdGl2ZSBwYXRoIGZyb20gdGhlIHRvcCBvZiBhIHRyZWUpLgotICAgICAgICBuYW1lcyA9IHNl
bGYuX2ZpbmRfaW5fdHJlZXMoYXJnLnJlcGxhY2UoJy4nLCBzZWxmLmZpbGVzeXN0ZW0uc2VwKSwg
c3VmZml4ZXMpCi0gICAgICAgIGlmIG5hbWVzOgotICAgICAgICAgICAgcmV0dXJuIG5hbWVzCi0K
LSAgICAgICAgaWYgc2VsZi5pc19kb3R0ZWRfbmFtZShhcmcpOgotICAgICAgICAgICAgIyBUaGUg
bmFtZSBtYXkgbm90IGV4aXN0LCBidXQgdGhhdCdzIG9rYXk7IHdlJ2xsIGZpbmQgb3V0IGxhdGVy
LgotICAgICAgICAgICAgcmV0dXJuIFthcmddCi0KLSAgICAgICAgX2xvZy5lcnJvcigiJXMgaXMg
bm90IGEgcHl0aG9uIG5hbWUgb3IgYW4gZXhpc3RpbmcgZmlsZSBvciBkaXJlY3RvcnkuIiAlIGFy
ZykKLSAgICAgICAgcmV0dXJuIFtdCi0KLSAgICBkZWYgX2ZpbmRfaW5fdHJlZXMoc2VsZiwgcGF0
aCwgc3VmZml4ZXMpOgotICAgICAgICBmb3IgdHJlZSBpbiBzZWxmLnRyZWVzOgotICAgICAgICAg
ICAgcmVscGF0aCA9IHRyZWUuc3VicGF0aChwYXRoKQotICAgICAgICAgICAgaWYgbm90IHJlbHBh
dGg6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIGlmIHNlbGYuZmlsZXN5
c3RlbS5pc2ZpbGUocGF0aCk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFt0cmVlLnRvX21vZHVs
ZShwYXRoKV0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRyZWUu
ZmluZF9tb2R1bGVzKHN1ZmZpeGVzLCBwYXRoKQotICAgICAgICByZXR1cm4gW10KLQotICAgIGRl
ZiBfZGVmYXVsdF9uYW1lcyhzZWxmLCBzdWZmaXhlcywgZmluZF9hbGwpOgotICAgICAgICBtb2R1
bGVzID0gW10KLSAgICAgICAgZm9yIHRyZWUgaW4gc2VsZi50cmVlczoKLSAgICAgICAgICAgIG1v
ZHVsZXMuZXh0ZW5kKHRyZWUuZmluZF9tb2R1bGVzKHN1ZmZpeGVzKSkKLSAgICAgICAgbW9kdWxl
cy5zb3J0KCkKLQotICAgICAgICBmb3IgbW9kdWxlIGluIG1vZHVsZXM6Ci0gICAgICAgICAgICBf
bG9nLmRlYnVnKCJGb3VuZDogJXMiICUgbW9kdWxlKQotCi0gICAgICAgICMgRklYTUU6IEZpZ3Vy
ZSBvdXQgaG93IHRvIG1vdmUgdGhpcyB0byB0ZXN0LXdlYmtpdHB5IGluIG9yZGVyIHRvIHRvIG1h
a2UgdGhpcyBmaWxlIG1vcmUgZ2VuZXJpYy4KLSAgICAgICAgaWYgbm90IGZpbmRfYWxsOgotICAg
ICAgICAgICAgc2xvd190ZXN0cyA9ICgnd2Via2l0cHkuY29tbW9uLmNoZWNrb3V0LnNjbS5zY21f
dW5pdHRlc3QnLCkKLSAgICAgICAgICAgIHNlbGYuX2V4Y2x1ZGUobW9kdWxlcywgc2xvd190ZXN0
cywgJ2FyZSByZWFsbHksIHJlYWxseSBzbG93JywgMzE4MTgpCi0KLSAgICAgICAgICAgIGlmIHN5
cy5wbGF0Zm9ybSA9PSAnd2luMzInOgotICAgICAgICAgICAgICAgIHdpbjMyX2JsYWNrbGlzdCA9
ICgnd2Via2l0cHkuY29tbW9uLmNoZWNrb3V0JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgJ3dlYmtpdHB5LmNvbW1vbi5jb25maWcnLAotICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAnd2Via2l0cHkudG9vbCcpCi0gICAgICAgICAgICAgICAgc2VsZi5fZXhj
bHVkZShtb2R1bGVzLCB3aW4zMl9ibGFja2xpc3QsICdmYWlsIGhvcnJpYmx5IG9uIHdpbjMyJywg
NTQ1MjYpCi0KLSAgICAgICAgcmV0dXJuIG1vZHVsZXMKLQotICAgIGRlZiBfZXhjbHVkZShzZWxm
LCBtb2R1bGVzLCBtb2R1bGVfcHJlZml4ZXMsIHJlYXNvbiwgYnVnaWQpOgotICAgICAgICBfbG9n
LmluZm8oJ1NraXBwaW5nIHRlc3RzIGluIHRoZSBmb2xsb3dpbmcgbW9kdWxlcyBvciBwYWNrYWdl
cyBiZWNhdXNlIHRoZXkgJXM6JyAlIHJlYXNvbikKLSAgICAgICAgZm9yIHByZWZpeCBpbiBtb2R1
bGVfcHJlZml4ZXM6Ci0gICAgICAgICAgICBfbG9nLmluZm8oJyAgICAlcycgJSBwcmVmaXgpCi0g
ICAgICAgICAgICBtb2R1bGVzX3RvX2V4Y2x1ZGUgPSBmaWx0ZXIobGFtYmRhIG06IG0uc3RhcnRz
d2l0aChwcmVmaXgpLCBtb2R1bGVzKQotICAgICAgICAgICAgZm9yIG0gaW4gbW9kdWxlc190b19l
eGNsdWRlOgotICAgICAgICAgICAgICAgIGlmIGxlbihtb2R1bGVzX3RvX2V4Y2x1ZGUpID4gMToK
LSAgICAgICAgICAgICAgICAgICAgX2xvZy5kZWJ1ZygnICAgICAgICAlcycgJSBtKQotICAgICAg
ICAgICAgICAgIG1vZHVsZXMucmVtb3ZlKG0pCi0gICAgICAgIF9sb2cuaW5mbygnICAgIChodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9JWQ7IHVzZSAtLWFsbCB0byBpbmNs
dWRlKScgJSBidWdpZCkKLSAgICAgICAgX2xvZy5pbmZvKCcnKQpkaWZmIC0tZ2l0IGEvVG9vbHMv
U2NyaXB0cy93ZWJraXRweS90ZXN0L3Rlc3RfZmluZGVyX3VuaXR0ZXN0LnB5IGIvVG9vbHMvU2Ny
aXB0cy93ZWJraXRweS90ZXN0L3Rlc3RfZmluZGVyX3VuaXR0ZXN0LnB5CmRlbGV0ZWQgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCA1YjZiM2IwLi4wMDAwMDAwCi0tLSBhL1Rvb2xzL1NjcmlwdHMvd2Vi
a2l0cHkvdGVzdC90ZXN0X2ZpbmRlcl91bml0dGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEz
NCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAxMiBHb29nbGUsIEluYy4KLSMKLSMgUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucwotIyBhcmUgbWV0OgotIyAxLiAgUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMg
Mi4gIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0Ci0jICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCi0jICAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotIwotIyBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gQU5EIElUUyBDT05UUklCVVRP
UlMgYGBBUyBJUycnIEFORAotIyBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAotIyBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJF
Ci0jIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IgSVRTIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SCi0jIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKLSMgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IKLSMgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKLSMgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSMgT1IgVE9S
VCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotaW1wb3J0IGxvZ2dpbmcKLWltcG9ydCB1
bml0dGVzdAotCi1mcm9tIHdlYmtpdHB5LmNvbW1vbi5zeXN0ZW0uZmlsZXN5c3RlbV9tb2NrIGlt
cG9ydCBNb2NrRmlsZVN5c3RlbQotZnJvbSB3ZWJraXRweS5jb21tb24uc3lzdGVtLm91dHB1dGNh
cHR1cmUgaW1wb3J0IE91dHB1dENhcHR1cmUKLWZyb20gd2Via2l0cHkudGVzdC50ZXN0X2ZpbmRl
ciBpbXBvcnQgVGVzdEZpbmRlcgotCi0KLWNsYXNzIFRlc3RGaW5kZXJUZXN0KHVuaXR0ZXN0LlRl
c3RDYXNlKToKLSAgICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgICAgIGZpbGVzID0gewotICAgICAg
ICAgICcvZm9vL2Jhci9iYXoucHknOiAnJywKLSAgICAgICAgICAnL2Zvby9iYXIvYmF6X3VuaXR0
ZXN0LnB5JzogJycsCi0gICAgICAgICAgJy9mb28yL2JhcjIvYmF6Mi5weSc6ICcnLAotICAgICAg
ICAgICcvZm9vMi9iYXIyL2JhejIucHljJzogJycsCi0gICAgICAgICAgJy9mb28yL2JhcjIvYmF6
Ml9pbnRlZ3JhdGlvbnRlc3QucHknOiAnJywKLSAgICAgICAgICAnL2ZvbzIvYmFyMi9taXNzaW5n
LnB5Yyc6ICcnLAotICAgICAgICAgICcvdG1wL2Fub3RoZXJfdW5pdHRlc3QucHknOiAnJywKLSAg
ICAgICAgfQotICAgICAgICBzZWxmLmZzID0gTW9ja0ZpbGVTeXN0ZW0oZmlsZXMpCi0gICAgICAg
IHNlbGYuZmluZGVyID0gVGVzdEZpbmRlcihzZWxmLmZzKQotICAgICAgICBzZWxmLmZpbmRlci5h
ZGRfdHJlZSgnL2ZvbycsICdiYXInKQotICAgICAgICBzZWxmLmZpbmRlci5hZGRfdHJlZSgnL2Zv
bzInKQotCi0gICAgICAgICMgSGVyZSB3ZSBoYXZlIHRvIGp1bXAgdGhyb3VnaCBhIGhvb3AgdG8g
bWFrZSBzdXJlIHRlc3Qtd2Via2l0cHkgZG9lc24ndCBsb2cKLSAgICAgICAgIyBhbnkgbWVzc2Fn
ZXMgZnJvbSB0aGVzZSB0ZXN0cyA6KC4KLSAgICAgICAgc2VsZi5yb290X2xvZ2dlciA9IGxvZ2dp
bmcuZ2V0TG9nZ2VyKCkKLSAgICAgICAgc2VsZi5sb2dfaGFuZGxlciA9IE5vbmUKLSAgICAgICAg
Zm9yIGggaW4gc2VsZi5yb290X2xvZ2dlci5oYW5kbGVyczoKLSAgICAgICAgICAgIGlmIGdldGF0
dHIoaCwgJ25hbWUnLCBOb25lKSA9PSAnd2Via2l0cHkudGVzdC5tYWluJzoKLSAgICAgICAgICAg
ICAgICBzZWxmLmxvZ19oYW5kbGVyID0gaAotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAg
IGlmIHNlbGYubG9nX2hhbmRsZXI6Ci0gICAgICAgICAgICBzZWxmLmxvZ19sZXZlbCA9IHNlbGYu
bG9nX2hhbmRsZXIubGV2ZWwKLSAgICAgICAgICAgIHNlbGYubG9nX2hhbmRsZXIubGV2ZWwgPSBs
b2dnaW5nLkNSSVRJQ0FMCi0KLSAgICBkZWYgdGVhckRvd24oc2VsZik6Ci0gICAgICAgIGlmIHNl
bGYubG9nX2hhbmRsZXI6Ci0gICAgICAgICAgICBzZWxmLmxvZ19oYW5kbGVyLnNldExldmVsKHNl
bGYubG9nX2xldmVsKQotCi0gICAgZGVmIHRlc3RfYWRkaXRpb25hbF9zeXN0ZW1fcGF0aHMoc2Vs
Zik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuZmluZGVyLmFkZGl0aW9uYWxfcGF0
aHMoWycvdXNyJ10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICBbJy9mb28nLCAnL2ZvbzIn
XSkKLQotICAgIGRlZiB0ZXN0X2lzX21vZHVsZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRU
cnVlKHNlbGYuZmluZGVyLmlzX21vZHVsZSgnYmFyLmJheicpKQotICAgICAgICBzZWxmLmFzc2Vy
dFRydWUoc2VsZi5maW5kZXIuaXNfbW9kdWxlKCdiYXIyLmJhejInKSkKLSAgICAgICAgc2VsZi5h
c3NlcnRUcnVlKHNlbGYuZmluZGVyLmlzX21vZHVsZSgnYmFyMi5iYXoyX2ludGVncmF0aW9udGVz
dCcpKQotCi0gICAgICAgICMgTWlzc2luZyB0aGUgcHJvcGVyIG5hbWVzcGFjZS4KLSAgICAgICAg
c2VsZi5hc3NlcnRGYWxzZShzZWxmLmZpbmRlci5pc19tb2R1bGUoJ2JheicpKQotCi0gICAgZGVm
IHRlc3RfdG9fbW9kdWxlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmZp
bmRlci50b19tb2R1bGUoJy9mb28vdGVzdC5weScpLCAndGVzdCcpCi0gICAgICAgIHNlbGYuYXNz
ZXJ0RXF1YWxzKHNlbGYuZmluZGVyLnRvX21vZHVsZSgnL2Zvby9iYXIvdGVzdC5weScpLCAnYmFy
LnRlc3QnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmZpbmRlci50b19tb2R1bGUo
Jy9mb28vYmFyL3B5dGVzdC5weScpLCAnYmFyLnB5dGVzdCcpCi0KLSAgICBkZWYgdGVzdF9jbGVh
bihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZnMuZXhpc3RzKCcvZm9vMi9i
YXIyL21pc3NpbmcucHljJykpCi0gICAgICAgIHNlbGYuZmluZGVyLmNsZWFuX3RyZWVzKCkKLSAg
ICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLmZzLmV4aXN0cygnL2ZvbzIvYmFyMi9taXNzaW5n
LnB5YycpKQotCi0gICAgZGVmIGNoZWNrX25hbWVzKHNlbGYsIG5hbWVzLCBleHBlY3RlZF9uYW1l
cywgc2tpcF9pbnRlZ3JhdGlvbnRlc3RzPUZhbHNlLCBmaW5kX2FsbD1GYWxzZSk6Ci0gICAgICAg
IHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuZmluZGVyLmZpbmRfbmFtZXMobmFtZXMsIHNraXBfaW50
ZWdyYXRpb250ZXN0cywgZmluZF9hbGwpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBleHBl
Y3RlZF9uYW1lcykKLQotICAgIGRlZiB0ZXN0X2RlZmF1bHRfbmFtZXMoc2VsZik6Ci0gICAgICAg
IHNlbGYuY2hlY2tfbmFtZXMoW10sIFsnYmFyLmJhel91bml0dGVzdCcsICdiYXIyLmJhejJfaW50
ZWdyYXRpb250ZXN0J10pCi0gICAgICAgIHNlbGYuY2hlY2tfbmFtZXMoW10sIFsnYmFyLmJhel91
bml0dGVzdCddLCBza2lwX2ludGVncmF0aW9udGVzdHM9VHJ1ZSwgZmluZF9hbGw9VHJ1ZSkKLSAg
ICAgICAgc2VsZi5jaGVja19uYW1lcyhbXSwgWydiYXIuYmF6X3VuaXR0ZXN0J10sIHNraXBfaW50
ZWdyYXRpb250ZXN0cz1UcnVlLCBmaW5kX2FsbD1GYWxzZSkKLQotICAgICAgICAjIFNob3VsZCBy
ZXR1cm4gdGhlIG5hbWVzIGdpdmVuIGl0LCBldmVuIGlmIHRoZXkgZG9uJ3QgZXhpc3QuCi0gICAg
ICAgIHNlbGYuY2hlY2tfbmFtZXMoWydmb29iYXInXSwgWydmb29iYXInXSwgc2tpcF9pbnRlZ3Jh
dGlvbnRlc3RzPVRydWUsIGZpbmRfYWxsPUZhbHNlKQotCi0gICAgZGVmIHRlc3RfcGF0aHMoc2Vs
Zik6Ci0gICAgICAgIHNlbGYuZnMuY2hkaXIoJy9mb28vYmFyJykKLSAgICAgICAgc2VsZi5jaGVj
a19uYW1lcyhbJ2Jhel91bml0dGVzdC5weSddLCBbJ2Jhci5iYXpfdW5pdHRlc3QnXSkKLSAgICAg
ICAgc2VsZi5jaGVja19uYW1lcyhbJy4vYmF6X3VuaXR0ZXN0LnB5J10sIFsnYmFyLmJhel91bml0
dGVzdCddKQotICAgICAgICBzZWxmLmNoZWNrX25hbWVzKFsnL2Zvby9iYXIvYmF6X3VuaXR0ZXN0
LnB5J10sIFsnYmFyLmJhel91bml0dGVzdCddKQotICAgICAgICBzZWxmLmNoZWNrX25hbWVzKFsn
LiddLCBbJ2Jhci5iYXpfdW5pdHRlc3QnXSkKLSAgICAgICAgc2VsZi5jaGVja19uYW1lcyhbJy4u
Ly4uL2ZvbzIvYmFyMiddLCBbJ2JhcjIuYmF6Ml9pbnRlZ3JhdGlvbnRlc3QnXSkKLQotICAgICAg
ICBzZWxmLmZzLmNoZGlyKCcvJykKLSAgICAgICAgc2VsZi5jaGVja19uYW1lcyhbJ2JhciddLCBb
J2Jhci5iYXpfdW5pdHRlc3QnXSkKLSAgICAgICAgc2VsZi5jaGVja19uYW1lcyhbJy9mb28vYmFy
LyddLCBbJ2Jhci5iYXpfdW5pdHRlc3QnXSkKLQotICAgICAgICAjIFRoaXMgd29ya3MgJ2J5IGFj
Y2lkZW50JyBzaW5jZSBpdCBtYXBzIG9udG8gYSBwYWNrYWdlLgotICAgICAgICBzZWxmLmNoZWNr
X25hbWVzKFsnYmFyLyddLCBbJ2Jhci5iYXpfdW5pdHRlc3QnXSkKLQotICAgICAgICAjIFRoaXMg
c2hvdWxkIGxvZyBhbiBlcnJvciwgc2luY2UgaXQncyBvdXRzaWRlIHRoZSB0cmVlcy4KLSAgICAg
ICAgb2MgPSBPdXRwdXRDYXB0dXJlKCkKLSAgICAgICAgb2Muc2V0X2xvZ19sZXZlbChsb2dnaW5n
LkVSUk9SKQotICAgICAgICBvYy5jYXB0dXJlX291dHB1dCgpCi0gICAgICAgIHRyeToKLSAgICAg
ICAgICAgIHNlbGYuY2hlY2tfbmFtZXMoWycvdG1wL2Fub3RoZXJfdW5pdHRlc3QucHknXSwgW10p
Ci0gICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICBfLCBfLCBsb2dzID0gb2MucmVzdG9yZV9v
dXRwdXQoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhbm90aGVyX3VuaXR0ZXN0LnB5
JyBpbiBsb2dzKQotCi0gICAgICAgICMgUGF0aHMgdGhhdCBkb24ndCBleGlzdCBhcmUgZXJyb3Jz
LgotICAgICAgICBvYy5jYXB0dXJlX291dHB1dCgpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAg
IHNlbGYuY2hlY2tfbmFtZXMoWycvZm9vL2Jhci9ub3RleGlzdF91bml0dGVzdC5weSddLCBbXSkK
LSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIF8sIF8sIGxvZ3MgPSBvYy5yZXN0b3JlX291
dHB1dCgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ25vdGV4aXN0X3VuaXR0ZXN0LnB5
JyBpbiBsb2dzKQotCi0gICAgICAgICMgTmFtZXMgdGhhdCBkb24ndCBleGlzdCBhcmUgY2F1Z2h0
IGxhdGVyLCBhdCBsb2FkIHRpbWUuCi0gICAgICAgIHNlbGYuY2hlY2tfbmFtZXMoWydiYXIubm90
ZXhpc3RfdW5pdHRlc3QnXSwgWydiYXIubm90ZXhpc3RfdW5pdHRlc3QnXSkKLQotaWYgX19uYW1l
X18gPT0gJ19fbWFpbl9fJzoKLSAgICB1bml0dGVzdC5tYWluKCkK
</data>

          </attachment>
      

    </bug>

</bugzilla>