<?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>175925</bug_id>
          
          <creation_ts>2017-08-23 21:42:40 -0700</creation_ts>
          <short_desc>Initial reference implementation scaffolding for WebGPU Shading Language prototype</short_desc>
          <delta_ts>2018-10-13 14:19:00 -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>WebGPU</component>
          <version>WebKit Nightly Build</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>176199</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>joepeck</cc>
    
    <cc>keith_miller</cc>
    
    <cc>lforschler</cc>
    
    <cc>mmaxfield</cc>
    
    <cc>saam</cc>
    
    <cc>sam</cc>
    
    <cc>webkit-bug-importer</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1341965</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-23 21:42:40 -0700</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1341966</commentid>
    <comment_count>1</comment_count>
      <attachid>318967</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-23 21:43:16 -0700</bug_when>
    <thetext>Created attachment 318967
it&apos;s a start</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1341967</commentid>
    <comment_count>2</comment_count>
      <attachid>318967</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-08-23 21:48:46 -0700</bug_when>
    <thetext>Comment on attachment 318967
it&apos;s a start

Cool, I think we should consider using ES6 modules for this though. It will be harder to change to later if we don&apos;t start with it now and it will help us enforce some amount of abstraction boundaries.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342126</commentid>
    <comment_count>3</comment_count>
      <attachid>319008</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-24 12:36:59 -0700</bug_when>
    <thetext>Created attachment 319008
a little more

Nothing more fun than a Thursday morning hacking spree.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342307</commentid>
    <comment_count>4</comment_count>
      <attachid>319056</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-24 19:21:26 -0700</bug_when>
    <thetext>Created attachment 319056
more</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342325</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-24 22:30:38 -0700</bug_when>
    <thetext>Fixed component.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342326</commentid>
    <comment_count>6</comment_count>
      <attachid>319065</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-24 22:33:51 -0700</bug_when>
    <thetext>Created attachment 319065
core type checker is looking good</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342520</commentid>
    <comment_count>7</comment_count>
      <attachid>319100</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-25 14:14:38 -0700</bug_when>
    <thetext>Created attachment 319100
steadily adding expressions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342579</commentid>
    <comment_count>8</comment_count>
      <attachid>319116</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-25 16:44:51 -0700</bug_when>
    <thetext>Created attachment 319116
a bit more things

The AST is rich enough to say things like:

int32 foo(int32 x)
{
    return x + 42;
}

But we cannot parse this yet.

Also, I haven&apos;t even tried running it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342600</commentid>
    <comment_count>9</comment_count>
      <attachid>319122</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-25 17:57:22 -0700</bug_when>
    <thetext>Created attachment 319122
started writing the parser</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342661</commentid>
    <comment_count>10</comment_count>
      <attachid>319136</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-26 11:48:54 -0700</bug_when>
    <thetext>Created attachment 319136
a bit more

Working through the parser.  Almost at the point where it can parse interesting things.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342668</commentid>
    <comment_count>11</comment_count>
      <attachid>319140</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-26 14:52:52 -0700</bug_when>
    <thetext>Created attachment 319140
parser is getting real</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342685</commentid>
    <comment_count>12</comment_count>
      <attachid>319143</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-26 17:31:43 -0700</bug_when>
    <thetext>Created attachment 319143
lot more code in the parser

The parser is so dense.  It&apos;s not done yet.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342693</commentid>
    <comment_count>13</comment_count>
      <attachid>319147</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-26 19:12:21 -0700</bug_when>
    <thetext>Created attachment 319147
more parser</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342739</commentid>
    <comment_count>14</comment_count>
      <attachid>319162</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-27 15:11:58 -0700</bug_when>
    <thetext>Created attachment 319162
more

I&apos;m mostly done with the parser.

I&apos;m also starting to notice some weirdnesses in the type system regarding arrays.

Overall it&apos;s looking pretty good.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342929</commentid>
    <comment_count>15</comment_count>
      <attachid>319205</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-28 13:53:22 -0700</bug_when>
    <thetext>Created attachment 319205
added more overload resolution machinery</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1342998</commentid>
    <comment_count>16</comment_count>
      <attachid>319220</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-28 17:28:12 -0700</bug_when>
    <thetext>Created attachment 319220
started working on the interrpeter</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343018</commentid>
    <comment_count>17</comment_count>
      <attachid>319226</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-28 18:36:28 -0700</bug_when>
    <thetext>Created attachment 319226
wrote an inliner

That let me do the hash-cons type instantiation, which allows me to allocate LValues.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343028</commentid>
    <comment_count>18</comment_count>
      <attachid>319229</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-28 19:16:22 -0700</bug_when>
    <thetext>Created attachment 319229
more</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343060</commentid>
    <comment_count>19</comment_count>
      <attachid>319244</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-28 21:49:30 -0700</bug_when>
    <thetext>Created attachment 319244
inching forward with native functions</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343130</commentid>
    <comment_count>20</comment_count>
      <attachid>319256</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-29 09:56:49 -0700</bug_when>
    <thetext>Created attachment 319256
it is written

Now I need to test it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343142</commentid>
    <comment_count>21</comment_count>
      <attachid>319259</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-29 10:43:12 -0700</bug_when>
    <thetext>Created attachment 319259
starting to debug</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343172</commentid>
    <comment_count>22</comment_count>
      <attachid>319268</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-29 11:44:16 -0700</bug_when>
    <thetext>Created attachment 319268
getting close to parsing the first test</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343225</commentid>
    <comment_count>23</comment_count>
      <attachid>319284</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-29 14:34:29 -0700</bug_when>
    <thetext>Created attachment 319284
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343295</commentid>
    <comment_count>24</comment_count>
      <attachid>319284</attachid>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2017-08-29 16:16:07 -0700</bug_when>
    <thetext>Comment on attachment 319284
the patch

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

Using Source/WebInspectorUI/.eslintrc with ESLint I trimmed down to a list of things that look like legit issues that would cause unexpected behavior or runtime exceptions and a few pedantic things like missing semicolons. Probably would be worth addressing these early otherwise they will just have to be debugged and addressed later when hooking up sections of the code:

    Tools/ArrayLangRI/ArrayType.js
      28:5   error  Expected to call &apos;super()&apos;              constructor-super
      30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super
      31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super
      32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super

    Tools/ArrayLangRI/Block.js
      48:51  error  Expected an assignment or function call and instead saw an expression  no-unused-expressions
      48:51  error  Unreachable code                                                       no-unreachable

    Tools/ArrayLangRI/ConstexprTypeParameter.js
      28:5   error  Expected to call &apos;super()&apos;                          constructor-super
      30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;              no-this-before-super
      31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;              no-this-before-super
      32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;              no-this-before-super

    Tools/ArrayLangRI/FuncInstantiator.js
      61:13  error  &apos;parameters&apos; is not defined                   no-undef
      62:13  error  &apos;body&apos; is not defined                         no-undef
  
    Tools/ArrayLangRI/FunctionLikeBlock.js
      28:5   error  Expected to call &apos;super()&apos;                     constructor-super
      30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;         no-this-before-super
      31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;         no-this-before-super
      32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;         no-this-before-super
      33:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;         no-this-before-super
      43:26  error  &apos;parameters&apos; is not defined                    no-undef
      43:48  error  &apos;block&apos; is not defined                         no-undef
      43:64  error  &apos;argumentList&apos; is not defined                  no-undef

    Tools/ArrayLangRI/NameContext.js
      158:18  error  &apos;map&apos; is assigned a value but never used  no-unused-vars
      - Yeah this does seem peculiar but it might not be wrong.

    Tools/ArrayLangRI/NameResolver.js
      132:37  error  &apos;node&apos; is not defined                     no-undef
      141:39  error  &apos;node&apos; is not defined                     no-undef
      157:35  error  &apos;origin&apos; is not defined                   no-undef
      163:39  error  &apos;origin&apos; is not defined                   no-undef
      165:39  error  &apos;origin&apos; is not defined                   no-undef

    Tools/ArrayLangRI/NativeTypeInstance.js
      28:5   error  Expected to call &apos;super()&apos;                      constructor-super
      30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;          no-this-before-super
      31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;          no-this-before-super

    Tools/ArrayLangRI/Parse.js
      223:43  error  Missing semicolon                                                semi
      239:13  error  Expected a conditional expression and instead saw an assignment  no-cond-assign
      475:60  error  &apos;term&apos; is not defined                                            no-undef
      544:48  error  Missing semicolon                                                semi

    Tools/ArrayLangRI/Protocol.js
      28:5   error  Expected to call &apos;super()&apos;              constructor-super
      30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super
      31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super

    Tools/ArrayLangRI/ProtocolDecl.js
       30:28  error  Missing semicolon                                       semi
       78:21  error  &apos;signature&apos; is not defined                              no-undef
       88:18  error  &apos;abstractSignature&apos; is assigned a value but never used  no-unused-vars

    Tools/ArrayLangRI/PtrType.js
      30:13  error  Unexpected negating the left operand of &apos;instanceof&apos; operator  no-unsafe-negation

    Tools/ArrayLangRI/Rewriter.js
       51:53  error  &apos;typeParameter&apos; is not defined           no-undef
       - This one looks like a typo

    Tools/ArrayLangRI/StructType.js
      28:5   error  Expected to call &apos;super()&apos;              constructor-super
      30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super
      31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super
      32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super
      33:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;  no-this-before-super

    Tools/ArrayLangRI/TypeOrVariableRef.js
      28:5   error  Expected to call &apos;super()&apos;                     constructor-super
      30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;         no-this-before-super
      31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;         no-this-before-super

    Tools/ArrayLangRI/TypeRef.js
      47:32  error  &apos;type&apos; is not defined                no-undef
      47:39  error  &apos;type&apos; is not defined                no-undef

    Tools/ArrayLangRI/TypeVariable.js
      28:5   error  Expected to call &apos;super()&apos;                constructor-super
      30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;    no-this-before-super
      31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;    no-this-before-super
      32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;    no-this-before-super

    Tools/ArrayLangRI/Visitor.js
       89:18  error  &apos;typeParamter&apos; is assigned a value but never used  no-unused-vars
       90:13  error  &apos;typeParameter&apos; is not defined                     no-undef

&gt; Tools/ArrayLangRI/ALSyntaxError.js:23
&gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 

The trailing whitespace in these copyright comments is like a small virus that spreads throughout our codebase =)

&gt; Tools/ArrayLangRI/AddressSpace.js:27
&gt; +const addressSpaces = [&quot;constant&quot;, &quot;device&quot;, &quot;threadgroup&quot;, &quot;thread&quot;];

In a browser, I think the the lexical nature of the `const` would prevent this constant from being used outside of this file. Same with the cases of just `class Foo { ... };`. In your case I think it all works in because All.js just inline `load(...)`s all the individual files. You don&apos;t need to change, just something to consider if you want to try running this in a browser eventually.

&gt; Tools/ArrayLangRI/Block.js:48
&gt; +        return &quot;{ &quot; + this.statements.join(&quot;; &quot;); + &quot;; }&quot;;

The semicolon after the join breaks the intended behavior here.

&gt; Tools/ArrayLangRI/CommaExpression.js:44
&gt; +};

ESLint had some warnings about these as unnecessary semicolons. You have them sometimes and sometimes you don&apos;t. Up to you if you want to clean them up.

&gt; Tools/ArrayLangRI/FuncSignature.js:26
&gt; +&quot;use strict&quot;;
&gt; +

This file is empty! Drop it?

&gt; Tools/ArrayLangRI/NameResolver.js:34
&gt; +    // It&apos;s totally OK to instantiate this with zero arguments (i.e. passing undefined for both of
&gt; +    // them) if you&apos;re creating a Checker to visit a Program.

This alludes to multiple arguments but that is no longer the case. Seems the comment is stale.

&gt; Tools/ArrayLangRI/ProtocolDecl.js:40
&gt; +        // FIXME: Check this! (OOPS!)

Heh, should this be tweaked now or later?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343397</commentid>
    <comment_count>25</comment_count>
      <attachid>319284</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2017-08-29 19:40:19 -0700</bug_when>
    <thetext>Comment on attachment 319284
the patch

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

Partial review, not done.

&gt; Tools/ChangeLog:3
&gt; +        Initial reference implementation scaffolding for ArrayLang

WebGPU Shading Language

&gt; Tools/ChangeLog:9
&gt; +        experimental shader language we are calling ArrayLang for now.

Ditto.

&gt; Tools/ChangeLog:17
&gt; +        protocol Addable { Addable operator+(Addable, Addable); }

And &quot;int operator+(int, int);&quot;

&gt; Tools/ChangeLog:24
&gt; +        Each variable behaves as if it was declared &quot;static&quot;, with one copy per type instantiation.

Using C++&apos;s notion of &quot;static&quot; variables

&gt;&gt; Tools/ArrayLangRI/AddressSpace.js:27
&gt;&gt; +const addressSpaces = [&quot;constant&quot;, &quot;device&quot;, &quot;threadgroup&quot;, &quot;thread&quot;];
&gt; 
&gt; In a browser, I think the the lexical nature of the `const` would prevent this constant from being used outside of this file. Same with the cases of just `class Foo { ... };`. In your case I think it all works in because All.js just inline `load(...)`s all the individual files. You don&apos;t need to change, just something to consider if you want to try running this in a browser eventually.

We don&apos;t want to run this in a browser eventually. This is a proof-of-concept.

&gt; Tools/ArrayLangRI/ArrayRefType.js:36
&gt; +            if (this.addressSpace != &quot;thread&quot;)
&gt; +                return false;

This looks like a great jumping-off point for me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343401</commentid>
    <comment_count>26</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-29 19:49:30 -0700</bug_when>
    <thetext>(In reply to Myles C. Maxfield from comment #25)
&gt; Comment on attachment 319284 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=319284&amp;action=review
&gt; 
&gt; Partial review, not done.
&gt; 
&gt; &gt; Tools/ChangeLog:3
&gt; &gt; +        Initial reference implementation scaffolding for ArrayLang
&gt; 
&gt; WebGPU Shading Language
&gt; 
&gt; &gt; Tools/ChangeLog:9
&gt; &gt; +        experimental shader language we are calling ArrayLang for now.
&gt; 
&gt; Ditto.

Let’s come up with a shorter name, or use ArrayLang in the initial commit. Renaming is easy. 

&gt; 
&gt; &gt; Tools/ChangeLog:17
&gt; &gt; +        protocol Addable { Addable operator+(Addable, Addable); }
&gt; 
&gt; And &quot;int operator+(int, int);&quot;

Not sure what you mean. That operator is provided by the system. I’m saying that the user could write an Addable protocol, as an example of what the typesyatem is capable of. 

&gt; 
&gt; &gt; Tools/ChangeLog:24
&gt; &gt; +        Each variable behaves as if it was declared &quot;static&quot;, with one copy per type instantiation.
&gt; 
&gt; Using C++&apos;s notion of &quot;static&quot; variables
&gt; 
&gt; &gt;&gt; Tools/ArrayLangRI/AddressSpace.js:27
&gt; &gt;&gt; +const addressSpaces = [&quot;constant&quot;, &quot;device&quot;, &quot;threadgroup&quot;, &quot;thread&quot;];
&gt; &gt; 
&gt; &gt; In a browser, I think the the lexical nature of the `const` would prevent this constant from being used outside of this file. Same with the cases of just `class Foo { ... };`. In your case I think it all works in because All.js just inline `load(...)`s all the individual files. You don&apos;t need to change, just something to consider if you want to try running this in a browser eventually.
&gt; 
&gt; We don&apos;t want to run this in a browser eventually. This is a
&gt; proof-of-concept.

This reference implementation will run in a browser in the sense that we will make it a page you can navigate to. 

&gt; 
&gt; &gt; Tools/ArrayLangRI/ArrayRefType.js:36
&gt; &gt; +            if (this.addressSpace != &quot;thread&quot;)
&gt; &gt; +                return false;
&gt; 
&gt; This looks like a great jumping-off point for me.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343407</commentid>
    <comment_count>27</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2017-08-29 20:15:48 -0700</bug_when>
    <thetext>&gt; &gt; &gt; In a browser, I think the the lexical nature of the `const` would prevent this constant from being used outside of this file. Same with the cases of just `class Foo { ... };`. In your case I think it all works in because All.js just inline `load(...)`s all the individual files. You don&apos;t need to change, just something to consider if you want to try running this in a browser eventually.
&gt; &gt; 
&gt; &gt; We don&apos;t want to run this in a browser eventually. This is a proof-of-concept.
&gt; 
&gt; This reference implementation will run in a browser in the sense that we
&gt; will make it a page you can navigate to. 

I just tested this and a global const variable defined in one &lt;script&gt; was accessible in another &lt;script&gt;. So it appears my comment is incorrect (or perhaps just outdated).

I do know we had to make a change to Web Inspector code for exactly this situation in the past:
https://trac.webkit.org/changeset/187012/webkit#file82

However, many things could have changed with global `const` behavior between then (the original introduction) and now!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343408</commentid>
    <comment_count>28</comment_count>
    <who name="Saam Barati">saam</who>
    <bug_when>2017-08-29 20:18:52 -0700</bug_when>
    <thetext>(In reply to Joseph Pecoraro from comment #27)
&gt; &gt; &gt; &gt; In a browser, I think the the lexical nature of the `const` would prevent this constant from being used outside of this file. Same with the cases of just `class Foo { ... };`. In your case I think it all works in because All.js just inline `load(...)`s all the individual files. You don&apos;t need to change, just something to consider if you want to try running this in a browser eventually.
&gt; &gt; &gt; 
&gt; &gt; &gt; We don&apos;t want to run this in a browser eventually. This is a proof-of-concept.
&gt; &gt; 
&gt; &gt; This reference implementation will run in a browser in the sense that we
&gt; &gt; will make it a page you can navigate to. 
&gt; 
&gt; I just tested this and a global const variable defined in one &lt;script&gt; was
&gt; accessible in another &lt;script&gt;. So it appears my comment is incorrect (or
&gt; perhaps just outdated).
Yeah this is the specced behavior.
&gt; 
&gt; I do know we had to make a change to Web Inspector code for exactly this
&gt; situation in the past:
&gt; https://trac.webkit.org/changeset/187012/webkit#file82
&gt; 
&gt; However, many things could have changed with global `const` behavior between
&gt; then (the original introduction) and now!
Yeah Yue behavior did change. I originally implemented it incorrectly, which had let/const visible only per script. I later fixed it by making top level let/const visible across scripts.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343471</commentid>
    <comment_count>29</comment_count>
      <attachid>319284</attachid>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2017-08-29 23:15:34 -0700</bug_when>
    <thetext>Comment on attachment 319284
the patch

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

At a high level, this seems fine. I really appreciate the current design&apos;s primary goal being clarity. I&apos;d like to take this and run with it; there are lots of ideas I have for what we can do next with it. It doesn&apos;t seem that being extremely detail-oriented would be valuable for this first patch, as this is intended to be platform for further evolution of the language. There is a chance that some piece of this code will end up in production, but that chance is slim.

&gt; Tools/ArrayLangRI/EBufferBuilder.js:33
&gt; +        // NOTE: I don&apos;t think that this is necessary.

FIXME?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343476</commentid>
    <comment_count>30</comment_count>
      <attachid>319284</attachid>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-08-30 00:07:09 -0700</bug_when>
    <thetext>Comment on attachment 319284
the patch

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

It&apos;s Keith&apos;s beddy-bye time, I&apos;m tentatively r-ing based on my comments. I&apos;ll read more details tomorrow to make sure I understand correctly.

&gt;&gt;&gt; Tools/ChangeLog:3
&gt;&gt;&gt; +        Initial reference implementation scaffolding for ArrayLang
&gt;&gt; 
&gt;&gt; WebGPU Shading Language
&gt; 
&gt; Let’s come up with a shorter name, or use ArrayLang in the initial commit. Renaming is easy.

Why not WebSL? Are there any shader languages that wouldn&apos;t be for the GPU?

&gt;&gt;&gt; Tools/ChangeLog:24
&gt;&gt;&gt; +        Each variable behaves as if it was declared &quot;static&quot;, with one copy per type instantiation.
&gt;&gt; 
&gt;&gt; Using C++&apos;s notion of &quot;static&quot; variables
&gt; 
&gt; This reference implementation will run in a browser in the sense that we will make it a page you can navigate to.

I don&apos;t like this semantics, unless it&apos;s a compile error to use an uninitialized value. In fact, I&apos;ll r- on this point alone. e.g.

int foo() {
    int a;
    return a++;
}

would return a different value on each invocation.

&gt;&gt; Tools/ArrayLangRI/ALSyntaxError.js:23
&gt;&gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
&gt; 
&gt; The trailing whitespace in these copyright comments is like a small virus that spreads throughout our codebase =)

Indeed, pizlo needs to install https://github.com/lewang/ws-butler. I recommended it to him previously but he chose to ignore me :(

&gt;&gt;&gt; Tools/ArrayLangRI/AddressSpace.js:27
&gt;&gt;&gt; +const addressSpaces = [&quot;constant&quot;, &quot;device&quot;, &quot;threadgroup&quot;, &quot;thread&quot;];
&gt;&gt; 
&gt;&gt; In a browser, I think the the lexical nature of the `const` would prevent this constant from being used outside of this file. Same with the cases of just `class Foo { ... };`. In your case I think it all works in because All.js just inline `load(...)`s all the individual files. You don&apos;t need to change, just something to consider if you want to try running this in a browser eventually.
&gt; 
&gt; We don&apos;t want to run this in a browser eventually. This is a proof-of-concept.

Unless I have misunderstood you Myles, I think we do want this to run in a browser. My understanding is this would be more or less a reference implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343530</commentid>
    <comment_count>31</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-30 07:29:59 -0700</bug_when>
    <thetext>(In reply to Keith Miller from comment #30)
&gt; Comment on attachment 319284 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=319284&amp;action=review
&gt; 
&gt; It&apos;s Keith&apos;s beddy-bye time, I&apos;m tentatively r-ing based on my comments.
&gt; I&apos;ll read more details tomorrow to make sure I understand correctly.

Can you please undo that?  The purpose of landing this is so that someone other than me can make changes. We are blocked on this landing. Using r- to indicate that you don’t understand the semantics is not really great since this is a super rough draft. I would have advocated landing as is even if I did not yet have a story for how variables get initialized. It’s great if stuff like that happens after this lands so that I’m on the only one working on it. 

&gt; 
&gt; &gt;&gt;&gt; Tools/ChangeLog:3
&gt; &gt;&gt;&gt; +        Initial reference implementation scaffolding for ArrayLang
&gt; &gt;&gt; 
&gt; &gt;&gt; WebGPU Shading Language
&gt; &gt; 
&gt; &gt; Let’s come up with a shorter name, or use ArrayLang in the initial commit. Renaming is easy.
&gt; 
&gt; Why not WebSL? Are there any shader languages that wouldn&apos;t be for the GPU?
&gt; 
&gt; &gt;&gt;&gt; Tools/ChangeLog:24
&gt; &gt;&gt;&gt; +        Each variable behaves as if it was declared &quot;static&quot;, with one copy per type instantiation.
&gt; &gt;&gt; 
&gt; &gt;&gt; Using C++&apos;s notion of &quot;static&quot; variables
&gt; &gt; 
&gt; &gt; This reference implementation will run in a browser in the sense that we will make it a page you can navigate to.
&gt; 
&gt; I don&apos;t like this semantics, unless it&apos;s a compile error to use an
&gt; uninitialized value. 

There are no uniniyialized values. Variables get initialized to the default value for the type at the moment the variable declaration executes. 

&gt; In fact, I&apos;ll r- on this point alone. e.g.
&gt; 
&gt; int foo() {
&gt;     int a;
&gt;     return a++;
&gt; }
&gt; 
&gt; would return a different value on each invocation.

This always returns zero. 

&gt; 
&gt; &gt;&gt; Tools/ArrayLangRI/ALSyntaxError.js:23
&gt; &gt;&gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
&gt; &gt; 
&gt; &gt; The trailing whitespace in these copyright comments is like a small virus that spreads throughout our codebase =)
&gt; 
&gt; Indeed, pizlo needs to install https://github.com/lewang/ws-butler. I
&gt; recommended it to him previously but he chose to ignore me :(
&gt; 
&gt; &gt;&gt;&gt; Tools/ArrayLangRI/AddressSpace.js:27
&gt; &gt;&gt;&gt; +const addressSpaces = [&quot;constant&quot;, &quot;device&quot;, &quot;threadgroup&quot;, &quot;thread&quot;];
&gt; &gt;&gt; 
&gt; &gt;&gt; In a browser, I think the the lexical nature of the `const` would prevent this constant from being used outside of this file. Same with the cases of just `class Foo { ... };`. In your case I think it all works in because All.js just inline `load(...)`s all the individual files. You don&apos;t need to change, just something to consider if you want to try running this in a browser eventually.
&gt; &gt; 
&gt; &gt; We don&apos;t want to run this in a browser eventually. This is a proof-of-concept.
&gt; 
&gt; Unless I have misunderstood you Myles, I think we do want this to run in a
&gt; browser. My understanding is this would be more or less a reference
&gt; implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343547</commentid>
    <comment_count>32</comment_count>
    <who name="Keith Miller">keith_miller</who>
    <bug_when>2017-08-30 08:51:13 -0700</bug_when>
    <thetext>(In reply to Filip Pizlo from comment #31)
&gt; (In reply to Keith Miller from comment #30)
&gt; &gt; Comment on attachment 319284 [details]
&gt; &gt; the patch
&gt; &gt; 
&gt; &gt; View in context:
&gt; &gt; https://bugs.webkit.org/attachment.cgi?id=319284&amp;action=review
&gt; &gt; 
&gt; &gt; It&apos;s Keith&apos;s beddy-bye time, I&apos;m tentatively r-ing based on my comments.
&gt; &gt; I&apos;ll read more details tomorrow to make sure I understand correctly.
&gt; 
&gt; Can you please undo that?  The purpose of landing this is so that someone
&gt; other than me can make changes. We are blocked on this landing. Using r- to
&gt; indicate that you don’t understand the semantics is not really great since
&gt; this is a super rough draft. I would have advocated landing as is even if I
&gt; did not yet have a story for how variables get initialized. It’s great if
&gt; stuff like that happens after this lands so that I’m on the only one working
&gt; on it. 
&gt; 

That&apos;s a fair point. My goal was to make my objection adamantly clear. If the patch landed in it&apos;s &quot;old&quot; state (I use quotes because it appears I was mistaken), I was concerned that the language might proceed with the &quot;old&quot; semantics. Such a language decision would have been a disaster in my opinion.

&gt; &gt; 
&gt; &gt; &gt;&gt;&gt; Tools/ChangeLog:3
&gt; &gt; &gt;&gt;&gt; +        Initial reference implementation scaffolding for ArrayLang
&gt; &gt; &gt;&gt; 
&gt; &gt; &gt;&gt; WebGPU Shading Language
&gt; &gt; &gt; 
&gt; &gt; &gt; Let’s come up with a shorter name, or use ArrayLang in the initial commit. Renaming is easy.
&gt; &gt; 
&gt; &gt; Why not WebSL? Are there any shader languages that wouldn&apos;t be for the GPU?
&gt; &gt; 
&gt; &gt; &gt;&gt;&gt; Tools/ChangeLog:24
&gt; &gt; &gt;&gt;&gt; +        Each variable behaves as if it was declared &quot;static&quot;, with one copy per type instantiation.
&gt; &gt; &gt;&gt; 
&gt; &gt; &gt;&gt; Using C++&apos;s notion of &quot;static&quot; variables
&gt; &gt; &gt; 
&gt; &gt; &gt; This reference implementation will run in a browser in the sense that we will make it a page you can navigate to.
&gt; &gt; 
&gt; &gt; I don&apos;t like this semantics, unless it&apos;s a compile error to use an
&gt; &gt; uninitialized value. 
&gt; 
&gt; There are no uniniyialized values. Variables get initialized to the default
&gt; value for the type at the moment the variable declaration executes.

I see, I misunderstood your statement as a statement about how the language would be specified rather than an implementation detail of the interpreter.
 
&gt; 
&gt; &gt; In fact, I&apos;ll r- on this point alone. e.g.
&gt; &gt; 
&gt; &gt; int foo() {
&gt; &gt;     int a;
&gt; &gt;     return a++;
&gt; &gt; }
&gt; &gt; 
&gt; &gt; would return a different value on each invocation.
&gt; 
&gt; This always returns zero. 
&gt; 
&gt; &gt; 
&gt; &gt; &gt;&gt; Tools/ArrayLangRI/ALSyntaxError.js:23
&gt; &gt; &gt;&gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
&gt; &gt; &gt; 
&gt; &gt; &gt; The trailing whitespace in these copyright comments is like a small virus that spreads throughout our codebase =)
&gt; &gt; 
&gt; &gt; Indeed, pizlo needs to install https://github.com/lewang/ws-butler. I
&gt; &gt; recommended it to him previously but he chose to ignore me :(
&gt; &gt; 
&gt; &gt; &gt;&gt;&gt; Tools/ArrayLangRI/AddressSpace.js:27
&gt; &gt; &gt;&gt;&gt; +const addressSpaces = [&quot;constant&quot;, &quot;device&quot;, &quot;threadgroup&quot;, &quot;thread&quot;];
&gt; &gt; &gt;&gt; 
&gt; &gt; &gt;&gt; In a browser, I think the the lexical nature of the `const` would prevent this constant from being used outside of this file. Same with the cases of just `class Foo { ... };`. In your case I think it all works in because All.js just inline `load(...)`s all the individual files. You don&apos;t need to change, just something to consider if you want to try running this in a browser eventually.
&gt; &gt; &gt; 
&gt; &gt; &gt; We don&apos;t want to run this in a browser eventually. This is a proof-of-concept.
&gt; &gt; 
&gt; &gt; Unless I have misunderstood you Myles, I think we do want this to run in a
&gt; &gt; browser. My understanding is this would be more or less a reference
&gt; &gt; implementation.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343589</commentid>
    <comment_count>33</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-30 10:31:47 -0700</bug_when>
    <thetext>(In reply to Joseph Pecoraro from comment #24)
&gt; Comment on attachment 319284 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=319284&amp;action=review
&gt; 
&gt; Using Source/WebInspectorUI/.eslintrc with ESLint I trimmed down to a list
&gt; of things that look like legit issues that would cause unexpected behavior
&gt; or runtime exceptions and a few pedantic things like missing semicolons.
&gt; Probably would be worth addressing these early otherwise they will just have
&gt; to be debugged and addressed later when hooking up sections of the code:
&gt; 
&gt;     Tools/ArrayLangRI/ArrayType.js
&gt;       28:5   error  Expected to call &apos;super()&apos;              constructor-super
&gt;       30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt;       31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt;       32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt; 
&gt;     Tools/ArrayLangRI/Block.js
&gt;       48:51  error  Expected an assignment or function call and instead saw
&gt; an expression  no-unused-expressions
&gt;       48:51  error  Unreachable code                                        
&gt; no-unreachable
&gt; 
&gt;     Tools/ArrayLangRI/ConstexprTypeParameter.js
&gt;       28:5   error  Expected to call &apos;super()&apos;                         
&gt; constructor-super
&gt;       30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;             
&gt; no-this-before-super
&gt;       31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;             
&gt; no-this-before-super
&gt;       32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;             
&gt; no-this-before-super
&gt; 
&gt;     Tools/ArrayLangRI/FuncInstantiator.js
&gt;       61:13  error  &apos;parameters&apos; is not defined                   no-undef
&gt;       62:13  error  &apos;body&apos; is not defined                         no-undef
&gt;   
&gt;     Tools/ArrayLangRI/FunctionLikeBlock.js
&gt;       28:5   error  Expected to call &apos;super()&apos;                    
&gt; constructor-super
&gt;       30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;        
&gt; no-this-before-super
&gt;       31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;        
&gt; no-this-before-super
&gt;       32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;        
&gt; no-this-before-super
&gt;       33:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;        
&gt; no-this-before-super
&gt;       43:26  error  &apos;parameters&apos; is not defined                    no-undef
&gt;       43:48  error  &apos;block&apos; is not defined                         no-undef
&gt;       43:64  error  &apos;argumentList&apos; is not defined                  no-undef
&gt; 
&gt;     Tools/ArrayLangRI/NameContext.js
&gt;       158:18  error  &apos;map&apos; is assigned a value but never used  no-unused-vars
&gt;       - Yeah this does seem peculiar but it might not be wrong.
&gt; 
&gt;     Tools/ArrayLangRI/NameResolver.js
&gt;       132:37  error  &apos;node&apos; is not defined                     no-undef
&gt;       141:39  error  &apos;node&apos; is not defined                     no-undef
&gt;       157:35  error  &apos;origin&apos; is not defined                   no-undef
&gt;       163:39  error  &apos;origin&apos; is not defined                   no-undef
&gt;       165:39  error  &apos;origin&apos; is not defined                   no-undef
&gt; 
&gt;     Tools/ArrayLangRI/NativeTypeInstance.js
&gt;       28:5   error  Expected to call &apos;super()&apos;                     
&gt; constructor-super
&gt;       30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;         
&gt; no-this-before-super
&gt;       31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;         
&gt; no-this-before-super
&gt; 
&gt;     Tools/ArrayLangRI/Parse.js
&gt;       223:43  error  Missing semicolon                                      
&gt; semi
&gt;       239:13  error  Expected a conditional expression and instead saw an
&gt; assignment  no-cond-assign
&gt;       475:60  error  &apos;term&apos; is not defined                                  
&gt; no-undef
&gt;       544:48  error  Missing semicolon                                      
&gt; semi
&gt; 
&gt;     Tools/ArrayLangRI/Protocol.js
&gt;       28:5   error  Expected to call &apos;super()&apos;              constructor-super
&gt;       30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt;       31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt; 
&gt;     Tools/ArrayLangRI/ProtocolDecl.js
&gt;        30:28  error  Missing semicolon                                      
&gt; semi
&gt;        78:21  error  &apos;signature&apos; is not defined                             
&gt; no-undef
&gt;        88:18  error  &apos;abstractSignature&apos; is assigned a value but never used 
&gt; no-unused-vars
&gt; 
&gt;     Tools/ArrayLangRI/PtrType.js
&gt;       30:13  error  Unexpected negating the left operand of &apos;instanceof&apos;
&gt; operator  no-unsafe-negation
&gt; 
&gt;     Tools/ArrayLangRI/Rewriter.js
&gt;        51:53  error  &apos;typeParameter&apos; is not defined           no-undef
&gt;        - This one looks like a typo
&gt; 
&gt;     Tools/ArrayLangRI/StructType.js
&gt;       28:5   error  Expected to call &apos;super()&apos;              constructor-super
&gt;       30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt;       31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt;       32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt;       33:9   error  &apos;this&apos; is not allowed before &apos;super()&apos; 
&gt; no-this-before-super
&gt; 
&gt;     Tools/ArrayLangRI/TypeOrVariableRef.js
&gt;       28:5   error  Expected to call &apos;super()&apos;                    
&gt; constructor-super
&gt;       30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;        
&gt; no-this-before-super
&gt;       31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;        
&gt; no-this-before-super
&gt; 
&gt;     Tools/ArrayLangRI/TypeRef.js
&gt;       47:32  error  &apos;type&apos; is not defined                no-undef
&gt;       47:39  error  &apos;type&apos; is not defined                no-undef
&gt; 
&gt;     Tools/ArrayLangRI/TypeVariable.js
&gt;       28:5   error  Expected to call &apos;super()&apos;               
&gt; constructor-super
&gt;       30:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;   
&gt; no-this-before-super
&gt;       31:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;   
&gt; no-this-before-super
&gt;       32:9   error  &apos;this&apos; is not allowed before &apos;super()&apos;   
&gt; no-this-before-super
&gt; 
&gt;     Tools/ArrayLangRI/Visitor.js
&gt;        89:18  error  &apos;typeParamter&apos; is assigned a value but never used 
&gt; no-unused-vars
&gt;        90:13  error  &apos;typeParameter&apos; is not defined                    
&gt; no-undef

I fixed almost all of these.

I think that this is OK, so I left it:

if (token = parseThings())
    doThings(token);

&gt; 
&gt; &gt; Tools/ArrayLangRI/ALSyntaxError.js:23
&gt; &gt; + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
&gt; 
&gt; The trailing whitespace in these copyright comments is like a small virus
&gt; that spreads throughout our codebase =)
&gt; 
&gt; &gt; Tools/ArrayLangRI/AddressSpace.js:27
&gt; &gt; +const addressSpaces = [&quot;constant&quot;, &quot;device&quot;, &quot;threadgroup&quot;, &quot;thread&quot;];
&gt; 
&gt; In a browser, I think the the lexical nature of the `const` would prevent
&gt; this constant from being used outside of this file. Same with the cases of
&gt; just `class Foo { ... };`. In your case I think it all works in because
&gt; All.js just inline `load(...)`s all the individual files. You don&apos;t need to
&gt; change, just something to consider if you want to try running this in a
&gt; browser eventually.
&gt; 
&gt; &gt; Tools/ArrayLangRI/Block.js:48
&gt; &gt; +        return &quot;{ &quot; + this.statements.join(&quot;; &quot;); + &quot;; }&quot;;
&gt; 
&gt; The semicolon after the join breaks the intended behavior here.

Yeah!  Ha!  I fixed it.

&gt; 
&gt; &gt; Tools/ArrayLangRI/CommaExpression.js:44
&gt; &gt; +};
&gt; 
&gt; ESLint had some warnings about these as unnecessary semicolons. You have
&gt; them sometimes and sometimes you don&apos;t. Up to you if you want to clean them
&gt; up.

Ooops.

&gt; 
&gt; &gt; Tools/ArrayLangRI/FuncSignature.js:26
&gt; &gt; +&quot;use strict&quot;;
&gt; &gt; +
&gt; 
&gt; This file is empty! Drop it?

Yeah.  I dropped it.

&gt; 
&gt; &gt; Tools/ArrayLangRI/NameResolver.js:34
&gt; &gt; +    // It&apos;s totally OK to instantiate this with zero arguments (i.e. passing undefined for both of
&gt; &gt; +    // them) if you&apos;re creating a Checker to visit a Program.
&gt; 
&gt; This alludes to multiple arguments but that is no longer the case. Seems the
&gt; comment is stale.

It&apos;s a valid comment, I just needed to change &quot;Checker&quot; to &quot;NameResolver&quot;.

&gt; 
&gt; &gt; Tools/ArrayLangRI/ProtocolDecl.js:40
&gt; &gt; +        // FIXME: Check this! (OOPS!)
&gt; 
&gt; Heh, should this be tweaked now or later?

I already implemented that in Checker!  I removed the FIXME.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343590</commentid>
    <comment_count>34</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-30 10:32:07 -0700</bug_when>
    <thetext>(In reply to Myles C. Maxfield from comment #29)
&gt; Comment on attachment 319284 [details]
&gt; the patch
&gt; 
&gt; View in context:
&gt; https://bugs.webkit.org/attachment.cgi?id=319284&amp;action=review
&gt; 
&gt; At a high level, this seems fine. I really appreciate the current design&apos;s
&gt; primary goal being clarity. I&apos;d like to take this and run with it; there are
&gt; lots of ideas I have for what we can do next with it. It doesn&apos;t seem that
&gt; being extremely detail-oriented would be valuable for this first patch, as
&gt; this is intended to be platform for further evolution of the language. There
&gt; is a chance that some piece of this code will end up in production, but that
&gt; chance is slim.
&gt; 
&gt; &gt; Tools/ArrayLangRI/EBufferBuilder.js:33
&gt; &gt; +        // NOTE: I don&apos;t think that this is necessary.
&gt; 
&gt; FIXME?

Yup, I removed it.  It wasn&apos;t necessary.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343592</commentid>
    <comment_count>35</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-30 10:33:43 -0700</bug_when>
    <thetext>Landed in https://trac.webkit.org/changeset/221380/webkit</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343593</commentid>
    <comment_count>36</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2017-08-30 10:34:33 -0700</bug_when>
    <thetext>&lt;rdar://problem/34165454&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343599</commentid>
    <comment_count>37</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2017-08-30 10:39:00 -0700</bug_when>
    <thetext>(In reply to Keith Miller from comment #2)
&gt; Comment on attachment 318967 [details]
&gt; it&apos;s a start
&gt; 
&gt; Cool, I think we should consider using ES6 modules for this though. It will
&gt; be harder to change to later if we don&apos;t start with it now and it will help
&gt; us enforce some amount of abstraction boundaries.

Now that it&apos;s checked in, is that something that would be easy for you to do?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1343612</commentid>
    <comment_count>38</comment_count>
    <who name="Joseph Pecoraro">joepeck</who>
    <bug_when>2017-08-30 11:23:06 -0700</bug_when>
    <thetext>&gt; I think that this is OK, so I left it:
&gt; 
&gt; if (token = parseThings())
&gt;     doThings(token);

Oops, yeah I meant to cull those particular warnings and must have missed one.

Thanks for addressing the rest!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1468789</commentid>
    <comment_count>39</comment_count>
    <who name="Myles C. Maxfield">mmaxfield</who>
    <bug_when>2018-10-13 14:19:00 -0700</bug_when>
    <thetext>Migrated to https://github.com/gpuweb/WHLSL/issues/12</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>318967</attachid>
            <date>2017-08-23 21:43:16 -0700</date>
            <delta_ts>2017-08-24 12:36:59 -0700</delta_ts>
            <desc>it&apos;s a start</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>6141</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL0xleGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0xl
eGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIExleGVy
IHsKKyAgICBjb25zdHJ1Y3Rvcih0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRl
eHQ7CisgICAgICAgIHRoaXMuX2luZGV4ID0gMDsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpbmVO
dW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlckZvckluZGV4KHRo
aXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgbGluZU51bWJlckZvckluZGV4KGluZGV4KQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQuc3Vic3RyaW5nKDAsIGluZGV4KS5tYXRj
aCgvXG4vZykubGVuZ3RoOworICAgIH0KKyAgICAKKyAgICBuZXh0KCkKKyAgICB7CisgICAgICAg
IGlmICh0aGlzLl9pbmRleCA+PSB0aGlzLl90ZXh0Lmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVy
biBudWxsOworICAgICAgICAKKyAgICAgICAgY29uc3QgaXNDQ29tbWVudEJlZ2luID0gL1wvXCov
OworICAgICAgICBjb25zdCBpc0NQbHVzUGx1c0NvbW1lbnRCZWdpbiA9IC9cL1wvLzsKKyAgICAg
ICAgCisgICAgICAgIGxldCByZXN1bHQgPSAoa2luZCkgPT4geworICAgICAgICAgICAgbGV0IHRl
eHQgPSBSZWdFeHAubGFzdE1hdGNoOworICAgICAgICAgICAgbGV0IHRva2VuID0gbmV3IExleGVy
VG9rZW4odGhpcywgdGhpcy5faW5kZXgsIGtpbmQsIHRleHQpOworICAgICAgICAgICAgdGhpcy5f
aW5kZXggKz0gdGV4dC5sZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAg
IH0KKworICAgICAgICBpZiAoKTsKKyAgICAgICAgCisgICAgICAgIGxldCByZWxldmFudFRleHQ7
CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHJlbGV2YW50VGV4dCA9IHRoaXMuX3Rl
eHQuc3Vic3RyaW5nKHRoaXMuX2luZGV4KTsKKyAgICAgICAgICAgIGlmICgvXlxzKy8udGVzdChy
ZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxh
c3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAoL15cL1wqLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAg
ICAgICAgICBsZXQgZW5kSW5kZXggPSByZWxldmFudFRleHQuc2VhcmNoKC9cKlwvLyk7CisgICAg
ICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5m
YWlsKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIpOworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4
ICs9IGVuZEluZGV4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKC9eXC9cLy4qLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAg
ICAgICAgICB0aGlzLl9pbmRleCArPSBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlzIGRvIFVuaWNvZGUu
CisgICAgICAgIGlmICgvXlteXGRcV11cdyovLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAg
ICAgIHJldHVybiByZXN1bHQoImlkZW50aWZpZXIiKTsKKworICAgICAgICBpZiAoL15bMC05XSsv
LnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImludGVnZXJM
aXRlcmFsIik7CisKKyAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBoYW5kbGUgZXhwLWZvcm0g
bGl0ZXJhbHMgbGlrZSAxZTEuCisgICAgICAgIGlmICgvXihbMC05XSpcLlswLTldKyl8KFswLTld
K1wuWzAtOV0qKS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dCgiZmxvYXRMaXRlcmFsIik7CisgICAgICAgIAorICAgICAgICBpZiAoL14odm9pZHxzdHJ1Y3R8
cHJvdG9jb2x8dHlwZXxpZnxlbHNlfGVudW18Y29udGludWV8YnJlYWt8c3dpdGNofGNhc2V8ZGVm
YXVsdHxmb3J8d2hpbGV8ZG98cmV0dXJufHNpemVvZnxjb25zdGFudHxkZXZpY2V8dGhyZWFkZ3Jv
dXB8dGhyZWFkKS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dCgia2V5d29yZCIpOworICAgICAgICAKKyAgICAgICAgaWYgKC9eKFt7fSgpXFtcXT86PSsqXC8s
LiUhfl4mfDw+LV18LT58PT58PD18PT18IT18Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50
ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlv
biIpOworICAgICAgICAKKyAgICAgICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmlu
ZyB3aXRoOiAiICsgcmVsZXZhbnRUZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KK30KSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9MZXhlclRva2VuLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgTGV4ZXJUb2tlbiB7CisgICAgY29uc3RydWN0b3IobGV4ZXIsIGluZGV4LCBraW5kLCB0
ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhlcjsKKyAgICAgICAgdGhpcy5f
aW5kZXggPSBpbmRleDsKKyAgICAgICAgdGhpcy5fa2luZCA9IGtpbmQ7CisgICAgICAgIHRoaXMu
X3RleHQgPSB0ZXh0OworICAgIH0KKyAgICAKKyAgICBnZXQga2luZCgpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fa2luZDsKKyAgICB9CisgICAgCisgICAgZ2V0IHRleHQoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQ7CisgICAgfQorICAgIAorICAgIGdldCBsaW5lTnVt
YmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9sZXhlci5saW5lTnVtYmVyRm9ySW5k
ZXgodGhpcy5faW5kZXgpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAg
ICAgICByZXR1cm4gIkxleGVyVG9rZW4oIiArIHRoaXMua2luZCArICIsICIgKyB0aGlzLnRleHQg
KyAiLCAiICsgdGhpcy5saW5lTnVtYmVyICsgIikiOworICAgIH0KK30K
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319008</attachid>
            <date>2017-08-24 12:36:59 -0700</date>
            <delta_ts>2017-08-24 19:21:26 -0700</delta_ts>
            <desc>a little more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>50959</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihsaW5lTnVtYmVyLCBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgc3VwZXIoIlN5bnRh
eCBlcnJvciBhdCBsaW5lIG51bWJlciAiICsgKGxpbmVOdW1iZXIgKyAxKSArICI6ICIgKyBtZXNz
YWdlKTsKKyAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKKyAgICAgICAgdGhp
cy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRyZXNz
U3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1NwYWNl
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gdmFsaWRh
dGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAgIHN3aXRjaCAoYWRkcmVzc1NwYWNl
KSB7CisgICAgY2FzZSAiY29uc3RhbnQiOgorICAgIGNhc2UgImRldmljZSI6CisgICAgY2FzZSAi
dGhyZWFkZ3JvdXAiOgorICAgIGNhc2UgInRocmVhZCI6CisgICAgICAgIHJldHVybjsKKyAgICBk
ZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBhZGRyZXNzIHNwYWNlOiAiICsg
YWRkcmVzc1NwYWNlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9BcnJheVJl
ZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlSZWZUeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5UmVmVHlwZSBleHRl
bmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAg
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBBcnJheVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rvcihv
cmlnaW4sIGVsZW1lbnRUeXBlLCBudW1FbGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29y
aWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsK
KyAgICAgICAgdGhpcy5fbnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50
VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRz
KCkgeyByZXR1cm4gdGhpcy5fbnVtRWxlbWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7
IHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJp
bmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlz
Lm51bUVsZW1lbnRzICsgIl0iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
RnVuY3Rpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb24uanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb24uanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlvbiB7CisgICAgY29uc3Ry
dWN0b3IobmFtZSwgcmV0dXJuVHlwZSwgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgdGhp
cy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOwor
ICAgICAgICB0aGlzLl9hcmd1bWVudExpc3QgPSBhcmd1bWVudExpc3Q7CisgICAgfQorICAgIAor
ICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCByZXR1cm5UeXBl
KCkgeyByZXR1cm4gdGhpcy5fcmV0dXJuVHlwZTsgfQorICAgIGdldCBhcmd1bWVudExpc3QoKSB7
IHJldHVybiB0aGlzLl9hcmd1bWVudExpc3Q7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5UeXBlICsgIiAiICsgdGhpcy5uYW1lICsgIigi
ICsgdGhpcy5hcmd1bWVudExpc3QgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9GdW5jdGlvbkFyZ3VtZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0Z1bmN0aW9uQXJndW1lbnQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvRnVuY3Rpb25Bcmd1bWVudC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIEZ1bmN0aW9uQXJndW1lbnQgeworICAgIC8vIFRoZSBuYW1lIGlzIG9wdGlvbmFs
LiBJdCdzIE9LIGZvciBpdCB0byBiZSBudWxsIQorICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUp
CisgICAgeworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9
IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsg
fQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9MZXhlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBMZXhlciB7CisgICAgY29uc3RydWN0b3IodGV4dCkKKyAgICB7CisgICAgICAgIHRo
aXMuX3RleHQgPSB0ZXh0OworICAgICAgICB0aGlzLl9pbmRleCA9IDA7CisgICAgfQorICAgIAor
ICAgIGdldCBsaW5lTnVtYmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxpbmVOdW1i
ZXJGb3JJbmRleCh0aGlzLl9pbmRleCk7CisgICAgfQorICAgIAorICAgIGxpbmVOdW1iZXJGb3JJ
bmRleChpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0LnN1YnN0cmluZygw
LCBpbmRleCkubWF0Y2goL1xuL2cpLmxlbmd0aDsKKyAgICB9CisgICAgCisgICAgZ2V0IHN0YXRl
KCkgeyByZXR1cm4gdGhpcy5faW5kZXg7IH0KKyAgICBzZXQgc3RhdGUodmFsdWUpIHsgdGhpcy5f
aW5kZXggPSB2YWx1ZTsgfQorICAgIAorICAgIG5leHQoKQorICAgIHsKKyAgICAgICAgaWYgKHRo
aXMuX2luZGV4ID49IHRoaXMuX3RleHQubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7
CisgICAgICAgIAorICAgICAgICBjb25zdCBpc0NDb21tZW50QmVnaW4gPSAvXC9cKi87CisgICAg
ICAgIGNvbnN0IGlzQ1BsdXNQbHVzQ29tbWVudEJlZ2luID0gL1wvXC8vOworICAgICAgICAKKyAg
ICAgICAgbGV0IHJlc3VsdCA9IChraW5kKSA9PiB7CisgICAgICAgICAgICBsZXQgdGV4dCA9IFJl
Z0V4cC5sYXN0TWF0Y2g7CisgICAgICAgICAgICBsZXQgdG9rZW4gPSBuZXcgTGV4ZXJUb2tlbih0
aGlzLCB0aGlzLl9pbmRleCwga2luZCwgdGV4dCk7CisgICAgICAgICAgICB0aGlzLl9pbmRleCAr
PSB0ZXh0Lmxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfTsKKwor
ICAgICAgICBsZXQgcmVsZXZhbnRUZXh0OworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAg
ICByZWxldmFudFRleHQgPSB0aGlzLl90ZXh0LnN1YnN0cmluZyh0aGlzLl9pbmRleCk7CisgICAg
ICAgICAgICBpZiAoL15ccysvLnRlc3QocmVsZXZhbnRUZXh0KSkgeworICAgICAgICAgICAgICAg
IHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gubGVuZ3RoOworICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9cKi8udGVzdChy
ZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gcmVsZXZhbnRU
ZXh0LnNlYXJjaCgvXCpcLy8pOworICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA8IDApCisg
ICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbCgiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTsKKyAg
ICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBlbmRJbmRleDsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgvXlwvXC8uKi8udGVzdChy
ZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxh
c3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRklY
TUU6IE1ha2UgdGhpcyBkbyBVbmljb2RlLgorICAgICAgICBpZiAoL15bXlxkXFddXHcqLy50ZXN0
KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJpZGVudGlmaWVyIik7
CisKKyAgICAgICAgaWYgKC9eWzAtOV0rLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAg
ICByZXR1cm4gcmVzdWx0KCJpbnRlZ2VyTGl0ZXJhbCIpOworCisgICAgICAgIC8vIEZJWE1FOiBN
YWtlIHRoaXMgaGFuZGxlIGV4cC1mb3JtIGxpdGVyYWxzIGxpa2UgMWUxLgorICAgICAgICBpZiAo
L14oWzAtOV0qXC5bMC05XSspfChbMC05XStcLlswLTldKikvLnRlc3QocmVsZXZhbnRUZXh0KSkK
KyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImZsb2F0TGl0ZXJhbCIpOworICAgICAgICAKKyAg
ICAgICAgaWYgKC9eKHZvaWR8c3RydWN0fHByb3RvY29sfHR5cGV8aWZ8ZWxzZXxlbnVtfGNvbnRp
bnVlfGJyZWFrfHN3aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxlfGRvfHJldHVybnxzaXplb2Z8
Y29uc3RhbnR8ZGV2aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVyYXRvcikvLnRlc3QocmVsZXZh
bnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImtleXdvcmQiKTsKKyAgICAgICAg
CisgICAgICAgIGlmICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5eJnw8PlxcLV18LT58PT58PD18
PT18IT18Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0KHJlbGV2YW50VGV4dCkpCisg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIpOworICAgICAgICAKKyAgICAg
ICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3aXRoOiAiICsgcmVsZXZhbnRU
ZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAgICBmYWlsKGVycm9yKQorICAg
IHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4RXJyb3IodGhpcy5saW5lTnVtYmVyLCBlcnJv
cik7CisgICAgfQorICAgIAorICAgIGJhY2t0cmFja2luZ1Njb3BlKGNhbGxiYWNrKQorICAgIHsK
KyAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAg
ICAgIHJldHVybiBjYWxsYmFjaygpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAg
ICBpZiAoZSBpbnN0YW5jZW9mIEFMU3ludGF4RXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aGlz
LnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorfQpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9MZXhlclRva2VuLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0xl
eGVyVG9rZW4uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBM
ZXhlclRva2VuIHsKKyAgICBjb25zdHJ1Y3RvcihsZXhlciwgaW5kZXgsIGtpbmQsIHRleHQpCisg
ICAgeworICAgICAgICB0aGlzLl9sZXhlciA9IGxleGVyOworICAgICAgICB0aGlzLl9pbmRleCA9
IGluZGV4OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAgdGhpcy5fdGV4dCA9
IHRleHQ7CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLl9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpbmVOdW1iZXIoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2xleGVyLmxpbmVOdW1iZXJGb3JJbmRleCh0aGlz
Ll9pbmRleCk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwgIiArIHRoaXMudGV4dCArICIsICIg
KyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvTmF0aXZlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVU
eXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVUeXBlIGV4
dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBpc1ByaW1pdGl2ZSwg
dHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9pc1ByaW1pdGl2ZSA9IGlz
UHJpbWl0aXZlOworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJz
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1bnIgdGhpcy5fb3JpZ2luOyB9
CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGlzUHJpbWl0
aXZlKCkgeyByZXR1cm4gdGhpcy5faXNQcmltaXRpdmU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRl
cnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAgIHRvU3RyaW5n
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAibmF0aXZlICIgKyAodGhpcy5pc1ByaW1pdGl2ZSA/
ICJwcmltaXRpdmUgIiA6ICIiKSArICJ0eXBlICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5
cGVQYXJhbWV0ZXJzICsgIj4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
Tm9kZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBOb2RlIHsKKyAgICB2aXNpdCh2aXNpdG9yKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHZpc2l0b3JbInZpc2l0IiArIHRoaXMuY29uc3RydWN0b3IubmFtZV0o
dGhpcyk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTnVsbFJld3JpdGVyLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL051bGxSZXdyaXRlci5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OdWxsUmV3cml0ZXIuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOdWxsUmV3cml0ZXIgeworICAgIHZpc2l0
UHJvZ3JhbShub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBQcm9ncmFtKCk7
CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykK
KyAgICAgICAgICAgIHJlc3VsdC5hZGRUb3BMZXZlbFN0YXRlbWVudChzdGF0ZW1lbnQudmlzaXQo
dGhpcykpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1
bmN0aW9uKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKG5vZGUubmFt
ZSwgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KHRoaXMpLCBub2RlLmFyZ3VtZW50TGlzdC5tYXAoYXJn
dW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRG
dW5jdGlvbkFyZ3VtZW50KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9u
QXJndW1lbnQobm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgVHlwZVJl
Zihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1
bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRUeXBlSW5zdGFudGlhdGlvbihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUeXBl
SW5zdGFudGlhdGlvbihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMu
bWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRUeXBlRGVjbGFyYXRpb24obm9kZSkKKyAgICB7CisgICAgfQorICAgIAor
ICAgIHZpc2l0TmF0aXZlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdmlzaXRUeXBlRGVjbGFy
YXRpb24obm9kZSk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNp
dFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgbm9kZS5jb25z
dHJ1Y3Rvcihub2RlLnJvZ2lpbiwgbm9kZS5hZGRyZXNzU3BhY2UsIG5vZGUuZWxlbWVudFR5cGUu
dmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJh
eVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlUeXBlKG5vZGUub3Jp
Z2luLCBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1BhcnNlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9QYXJzZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2VyLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcGFyc2UodGV4
dCkKK3sKKyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIodGV4dCk7CisgICAgCisgICAgLy8gVGhl
IGhhcmRlc3QgcGFydCBvZiBkZWFsaW5nIHdpdGggQy1saWtlIGxhbmd1YWdlcyBpcyBwYXJzaW5n
IHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudHMuCisgICAgLy8gTGV0J3MgY29uc2lkZXIg
aWYgdGhpcyBoYXBwZW5zIGluIEFycmF5TGFuZy4gSGVyZSBhcmUgdGhlIHZhbGlkIHN0YXRlbWVu
dHMgaW4gQXJyYXlMYW5nIHRoYXQKKyAgICAvLyBiZWdpbiB3aXRoIGFuIGlkZW50aWZpZXIsIGlm
IHdlIGFzc3VtZSB0aGF0IGFueSBleHByZXNzaW9uIGNhbiBiZSBhIHN0YW5kYWxvbmUgc3RhdGVt
ZW50LgorICAgIC8vCisgICAgLy8gICAgIHg7CisgICAgLy8gICAgIHggPGJpbm9wPiB5OworICAg
IC8vICAgICB4IDwgeTsKKyAgICAvLyAgICAgeCA8IHkgPiB6OworICAgIC8vICAgICB4ID0geTsK
KyAgICAvLyAgICAgeC5mID0geTsKKyAgICAvLyAgICAgXGV4cCA9IHk7CisgICAgLy8gICAgIHhb
NDJdID0geTsKKyAgICAvLyAgICAgeCgpOworICAgIC8vICAgICB4PHk+KCk7CisgICAgLy8gICAg
IHggeTsKKyAgICAvLyAgICAgeDx5PiB6OworICAgIC8vICAgICB4W10geTsKKyAgICAvLyAgICAg
eFs0Ml0geTsKKyAgICAvLyAgICAgeF4geTsKKyAgICAvLworICAgIC8vIFRoaXMgaGFzIHR3byBw
cm9ibGVtIGFyZWFzOgorICAgIC8vCisgICAgLy8gICAgIC0geDx5PnogY2FuIHBhcnNlIHR3byBk
aWZmZXJlbnQgd2F5cyAoYXMgKHggPCB5KSA+IHogb3IgeDx5PiB6KS4KKyAgICAvLyAgICAgLSB4
WzQyXSBjb3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNs
YXJhdGlvbi4KKyAgICAvLyAgICAgLSB4PHk+IGNvdWxkIGJlY29tZSBlaXRoZXIgYW4gYXNzaWdu
bWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vCisgICAgLy8gV2Ugc29sdmUg
dGhlIGZpcnN0IHByb2JsZW0gYnkgZm9yYmlkZGluZyBleHByZXNzaW9ucyBhcyBzdGF0ZW1lbnRz
LiBUaGUgbGFjayBvZiBmdW5jdGlvbgorICAgIC8vIHBvaW50ZXJzIG1lYW5zIHRoYXQgd2UgY2Fu
IHN0aWxsIGFsbG93IGZ1bmN0aW9uIGNhbGwgc3RhdGVtZW50cyAtIHVubGlrZSBpbiBDLCB0aG9z
ZSBjYW5ub3QKKyAgICAvLyBoYXZlIGFyYml0cmFyeSBleHByZXNzaW9ucyBhcyB0aGUgY2FsbGVl
LiBUaGUgcmVtYWluaW5nIHR3byBwcm9ibGVtcyBhcmUgc29sdmVkIGJ5CisgICAgLy8gYmFja3Ry
YWNraW5nLiBJbiBhbGwgb3RoZXIgcmVzcGVjdHMsIHRoaXMgaXMgYSBzaW1wbGUgcmVjdXJzaXZl
IGRlc2NlbnQgcGFyc2VyLgorICAgIAorICAgIGZ1bmN0aW9uIG5ld05vZGUobm9kZSwgZGF0YSkK
KyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG5vZGUsIGRhdGEpOworICAgIH0K
KyAgICAKKyAgICAKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBQcm9ncmFtIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Io
KQorICAgIHsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzID0gW107CisgICAgICAg
IHRoaXMuX2Z1bmN0aW9ucyA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fdHlwZXMgPSBuZXcg
TWFwKCk7CisgICAgfQorICAgIAorICAgIGdldCB0b3BMZXZlbFN0YXRlbWVudHMoKSB7IHJldHVy
biB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHM7IH0KKyAgICBnZXQgZnVuY3Rpb25zKCkgeyByZXR1
cm4gdGhpcy5fZnVuY3Rpb25zOyB9CisgICAgZ2V0IHR5cGVzKCkgeyByZXR1cm4gdGhpcy5fdHlw
ZXM7IH0KKyAgICAKKyAgICBhZGRUb3BMZXZlbFN0YXRlbWVudChzdGF0ZW1lbnQpCisgICAgewor
ICAgICAgICBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pCisgICAgICAgICAgICB0
aGlzLl9mdW5jdGlvbnMuc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBl
bHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAgdGhpcy5fdHlw
ZXMuc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlvbiBvciB0eXBl
OiAiICsgc3RhdGVtZW50KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzLnB1c2go
c3RhdGVtZW50KTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHRyVHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5cGUgewor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSAr
ICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiXiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1JlZmVyZW5jZVR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
UmVmZXJlbmNlVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIFJlZmVyZW5jZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4s
IGFkZHJlc3NTcGFjZSwgZWxlbWVudFR5cGUpCisgICAgeworICAgICAgICB2YWxpZGF0ZUFkZHJl
c3NTcGFjZShhZGRyZXNzU3BhY2UpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX2FkZHJlc3NTcGFjZSA9IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgdGhpcy5f
ZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigp
IHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBhZGRyZXNzU3BhY2UoKSB7IHJldHVy
biB0aGlzLl9hZGRyZXNzU3BhY2U7IH0KKyAgICBnZXQgZWxlbWVudFR5cGUoKSB7IHJldHVybiB0
aGlzLl9lbGVtZW50VHlwZTsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNl
OyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9UeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
VHlwZSBleHRlbmRzIE5vZGUgeworfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZUVycm9yLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVFcnJvci5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFMVHlwZUVycm9yIGV4dGVuZHMgRXJyb3Ig
eworICAgIGNvbnN0cnVjdG9yKGxpbmVOdW1iZXIsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBz
dXBlcigiVHlwZSBlcnJvciBhdCBsaW5lIG51bWJlciAiICsgKGxpbmVOdW1iZXIgKyAxKSArICI6
ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKKyAg
ICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVJbnN0YW50aWF0aW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL1R5cGVJbnN0YW50aWF0aW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL1R5cGVJbnN0YW50aWF0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgVHlwZUluc3RhbnRpYXRpb24gZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIHR5cGUsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICB0aGlz
Ll9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgICAgICB0
aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgCisgICAgZ2V0IG9y
aWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4g
dGhpcy5fdHlwZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlw
ZUFyZ3VtZW50czsgfQorICAgIAorICAgIHJlc29sdmUocmVzb2x1dGlvbkNvbnRleHQpCisgICAg
eworICAgICAgICByZXR1cm4gcmVzb2x1dGlvbkNvbnRleHQuaW5zdGFudGlhdGVUeXBlKAorICAg
ICAgICAgICAgdGhpcy50eXBlLCB0aGlzLm9yaWdpbiwgdGhpcy50eXBlQXJndW1lbnRzLm1hcCh0
eXBlQXJndW1lbnQgPT4gdHlwZUFyZ3VtZW50LnJlc29sdmUocmVzb2x1dGlvbkNvbnRleHQpKSk7
CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
LnR5cGUubmFtZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVJbnN0YW50aWF0b3IuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZUluc3RhbnRpYXRvci5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9UeXBlSW5zdGFudGlhdG9yLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZUluc3RhbnRpYXRvciBleHRlbmRzIE51bGxS
ZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fcnVubmlu
Z01hcCA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVjbGFyYXRpb24o
bm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3J1bm5pbmdNYXAuc2V0KG5vZGUubmFtZSwgbm9k
ZSk7CisgICAgICAgIHJldHVybiBzdXBlci52aXNpdE5hdGl2ZVR5cGUobm9kZSk7CisgICAgfQor
ICAgIAorICAgIC8vIEZJWE1FOiBWaXNpdCBhbGwgb3RoZXIgdG9wLWxldmVsIHR5cGUgZGVjbGFy
YXRpb25zLgorICAgIAorICAgIHZpc2l0VHlwZUluc3RhbnRpYXRpb24obm9kZSkKKyAgICB7Cisg
ICAgICAgIC8vIFRoaXMgcmVzb2x2ZXMgb3VyIHR5cGUgYXJndW1lbnRzLgorICAgICAgICBub2Rl
ID0gc3VwZXIudmlzaXRUeXBlSW5zdGFudGlhdGlvbihub2RlKTsKKyAgICAgICAgCisgICAgICAg
IGxldCB0eXBlID0gdGhpcy5fcnVubmluZ01hcC5nZXQobm9kZS5uYW1lKTsKKyAgICAgICAgaWYg
KCF0eXBlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxp
bmVOdW1iZXIsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAg
ICAgICAKKyAgICAgICAgcmV0dXJuIG5ldyBUeXBlSW5zdGFudGlhdGlvbihub2RlLm9yaWdpbiwg
dHlwZSwgbm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1R5cGVQYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZVBhcmFtZXRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBl
UGFyYW1ldGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
VHlwZVBhcmFtZXRlciB7IH0KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBUeXBlUmVmIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3Jp
Z2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5f
dHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorIAorICAgIGdldCBvcmlnaW4o
KSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1
bWVudHM7IH0KKyAgICAKKyAgICByZXNvbHZlKHJlc29sdXRpb25Db250ZXh0KQorICAgIHsKKyAg
ICAgICAgbGV0IGFjdHVhbFR5cGUgPSByZXNvbHV0aW9uQ29udGV4dC5yZXNvbHZlVHlwZVJlZkJ5
TmFtZSh0aGlzLm5hbWUpOworICAgICAgICBpZiAoIWFjdHVhbFR5cGUpCisgICAgICAgICAgICB0
aHJvdyBuZXcgVHlwZUVycm9yKHRoaXMub3JpZ2luLmxpbmVOdW1iZXIsICJDYW5ub3QgZmluZCBh
IHR5cGUgbmFtZWQgIiArIHRoaXMubmFtZSk7CisgICAgICAgIHJldHVybiByZXNvbHV0aW9uQ29u
dGV4dC5pbnN0YW50aWF0ZVR5cGUoCisgICAgICAgICAgICBhY3R1YWxUeXBlLCB0aGlzLm9yaWdp
biwgdGhpcy50eXBlQXJndW1lbnRzLm1hcCh0eXBlQXJndW1lbnQgPT4gdHlwZUFyZ3VtZW50LnJl
c29sdmUocmVzb2x1dGlvbkNvbnRleHQpKSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVu
dHMgKyAiPiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmUmVz
b2x2ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZlJlc29sdmVy
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWZSZXNvbHZlci5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWZSZXNv
bHZlciBleHRlbmRzIE51bGxSZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9m
dWxsTWFwID0gbm9kZS50eXBlczsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0UHJvZ3JhbShu
b2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAg
ICAvLyBUaGlzIHJlc29sdmVzIG91ciB0eXBlIGFyZ3VtZW50cy4KKyAgICAgICAgbm9kZSA9IHN1
cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICAgICAgCisgICAgICAgIGxldCB0eXBlID0gdGhp
cy5fZnVsbE1hcC5nZXQobm9kZS5uYW1lKTsKKyAgICAgICAgaWYgKCF0eXBlKQorICAgICAgICAg
ICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJDb3VsZCBu
b3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICAKKyAgICAgICAgcmV0
dXJuIG5ldyBUeXBlSW5zdGFudGlhdGlvbihub2RlLm9yaWdpbiwgdHlwZSwgbm9kZS50eXBlQXJn
dW1lbnRzKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJs
ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVZhcmlhYmxlIGV4dGVuZHMg
VHlwZVBhcmFtZXRlciB7CisgICAgY29uc3RydWN0b3IobmFtZSwgcHJvdG9jb2wpCisgICAgewor
ICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fcHJvdG9jb2wgPSBwcm90
b2NvbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9
CisgICAgZ2V0IHByb3RvY29sKCkgeyByZXR1cm4gdGhpcy5fcHJvdG9jb2w7IH0KKyAgICAKKyAg
ICByZXNvbHZlKHJlc29sdXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHJlc29s
dXRpb25Db250ZXh0LnJlc29sdmVUeXBlVmFyaWFibGUodGhpcyk7CisgICAgfQorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQor
Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319056</attachid>
            <date>2017-08-24 19:21:26 -0700</date>
            <delta_ts>2017-08-24 22:33:51 -0700</delta_ts>
            <desc>more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>83179</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihsaW5lTnVtYmVyLCBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgc3VwZXIoIlN5bnRh
eCBlcnJvciBhdCBsaW5lIG51bWJlciAiICsgKGxpbmVOdW1iZXIgKyAxKSArICI6ICIgKyBtZXNz
YWdlKTsKKyAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKKyAgICAgICAgdGhp
cy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0FMVHlwZUVycm9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVy
cm9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVycm9yLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQUxUeXBlRXJyb3Ig
ZXh0ZW5kcyBFcnJvciB7CisgICAgY29uc3RydWN0b3IobGluZU51bWJlciwgbWVzc2FnZSkKKyAg
ICB7CisgICAgICAgIHN1cGVyKCJUeXBlIGVycm9yIGF0IGxpbmUgbnVtYmVyICIgKyAobGluZU51
bWJlciArIDEpICsgIjogIiArIG1lc3NhZ2UpOworICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBs
aW5lTnVtYmVyOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1NwYWNlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0FkZHJlc3NTcGFjZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9BZGRyZXNzU3BhY2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7Cisg
ICAgc3dpdGNoIChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2Fz
ZSAiZGV2aWNlIjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoK
KyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigi
QmFkIGFkZHJlc3Mgc3BhY2U6ICIgKyBhZGRyZXNzU3BhY2UpOworICAgIH0KK30KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9BcnJheVJlZlR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvQXJyYXlSZWZUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc1NwYWNlICsgIiAiICsgdGhpcy5l
bGVtZW50VHlwZSArICJbXSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9B
cnJheVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5VHlwZSBleHRlbmRzIFR5
cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgZWxlbWVudFR5cGUsIG51bUVsZW1lbnRzKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9lbGVt
ZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICB0aGlzLl9udW1FbGVtZW50cyA9IG51bUVs
ZW1lbnRzOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5fZWxlbWVudFR5cGU7
IH0KKyAgICBnZXQgbnVtRWxlbWVudHMoKSB7IHJldHVybiB0aGlzLl9udW1FbGVtZW50czsgfQor
ICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuaXNQcmltaXRp
dmU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5l
bGVtZW50VHlwZSArICJbIiArIHRoaXMubnVtRWxlbWVudHMgKyAiXSI7CisgICAgfQorICAgIAor
ICAgIHVuaWZ5SW1wbCh1bmlmaWNhdG9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBp
ZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIAorICAgICAgICAvLyBXYWl0ISAgTWF5YmUgdGhpcyBzaG91bGQgYmUgdW5p
ZmllZD8gIExpa2Ugd2hhdCBpZiB0aGlzIGlzIGEgY29uc3RleHByPworICAgICAgICBpZiAodGhp
cy5udW1FbGVtZW50cyAhPSBvdGhlci5udW1FbGVtZW50cykKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgCisgICAgICAgIAorICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvQ2hlY2tlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DaGVja2Vy
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2hlY2tlciBleHRlbmRzIFZp
c2l0b3IgeworICAgIC8vIEl0J3MgdG90YWxseSBPSyB0byBpbnN0YW50aWF0ZSB0aGlzIHdpdGgg
emVybyBhcmd1bWVudHMgKGkuZS4gcGFzc2luZyB1bmRlZmluZWQgZm9yIGJvdGggb2YKKyAgICAv
LyB0aGVtKSBpZiB5b3UncmUgY3JlYXRpbmcgYSBDaGVja2VyIHRvIHZpc2l0IGEgUHJvZ3JhbS4K
KyAgICBjb25zdHJ1Y3RvcihuYW1lQ29udGV4dCwgZGVmTmFtZUNvbnRleHQpCisgICAgeworICAg
ICAgICB0aGlzLl9uYW1lQ29udGV4dCA9IG5hbWVDb250ZXh0OworICAgICAgICB0aGlzLl9kZWZO
YW1lQ29udGV4dCA9IGRlZk5hbWVDb250ZXh0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb2dy
YW0obm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5vZGUubmFtZUNvbnRl
eHQ7CisgICAgICAgIGxldCBkZWZOYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCgpOworICAg
ICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5vZGUubmFtZUNvbnRleHQsIGRlZk5hbWVD
b250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0
ZW1lbnRzKSB7CisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQoY2hlY2tlcik7CisgICAgICAg
ICAgICBkZWZOYW1lQ29udGV4dC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAg
ICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29u
dGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGxldCBk
ZWZOYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9kZWZOYW1lQ29udGV4dCk7Cisg
ICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgewor
ICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVD
b250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgICAgIGRlZk5hbWVDb250ZXh0LmFk
ZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBD
aGVja2VyKG5hbWVDb250ZXh0LCBkZWZOYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IGZp
ZWxkIG9mIG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQoY2hlY2tlcik7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHR5
cGUgPSB0aGlzLl9kZWZOYW1lQ29udGV4dC5nZXQoVHlwZSwgbm9kZS5uYW1lKTsKKyAgICAgICAg
aWYgKCF0eXBlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmdldChUeXBl
LCBub2RlLm5hbWUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2Rl
Lm9yaWdpbi5saW5lTnVtYmVyLCAiQ291bGQgbm90IGZpbmQgdHlwZSBuYW1lZCAiICsgbm9kZS5u
YW1lKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5l
TnVtYmVyLCAiSWxsZWdhbCBmb3J3YXJkIHVzZSBvZiB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUp
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodHlwZS50eXBlUGFyYW1ldGVycy5s
ZW5ndGggIT0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5l
dyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiV3JvbmcgbnVtYmVyIG9mIHR5
cGUgYXJndW1lbnRzIik7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZS50eXBlUGFy
YW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcklzVHlwZSA9
IHR5cGUudHlwZVBhcmFtZXRlcnNbaV0gaW5zdGFuY2VvZiBUeXBlVmFyaWFibGU7CisgICAgICAg
ICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0gaW5zdGFuY2Vv
ZiBUeXBlOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcklzVHlwZSAmJiAhYXJndW1lbnRJc1R5
cGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxp
bmVOdW1iZXIsICJFeHBlY3RlZCB0eXBlLCBidXQgZ290IHZhbHVlIGF0IGFyZ3VtZW50ICMiICsg
aSk7CisgICAgICAgICAgICBpZiAoIXBhcmFtZXRlcklzVHlwZSAmJiBhcmd1bWVudElzVHlwZSkK
KyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51
bWJlciwgIkV4cGVjdGVkIHZhbHVlLCBidXQgZ290IHR5cGUgYXQgYXJndW1lbnQgIyIgKyBpKTsK
KyAgICAgICAgICAgIGlmICghYXJndW1lbnRJc1R5cGUpIHsKKyAgICAgICAgICAgICAgICBpZiAo
IW5vZGUudHlwZUFyZ3VtZW50c1tpXS5pc0NvbnN0RXhwcikKKyAgICAgICAgICAgICAgICAgICAg
dGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJFeHBlY3RlZCBj
b25zdGV4cHIgdmFsdWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZh
cmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fcmVzb2x2
ZXIoVmFsdWUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAg
dGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJDb3VsZCBub3Qg
ZmluZCB2YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZp
c2l0KG5ldyBDaGVja2VyKHRoaXMuX25hbWVDb250ZXh0LCB0aGlzLl9uYW1lQ29udGV4dCkpOwor
ICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUuYWRkcmVzc1NwYWNlID09ICJ0aHJlYWQiKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKCFub2RlLmVsZW1lbnRUeXBl
Lmluc3RhbnRpYXRlZFR5cGUodGhpcy5fbmFtZUNvbnRleHQpLmlzUHJpbWl0aXZlKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJJbGxl
Z2FsIHBvaW50ZXIgdG8gbm9uLXByaW1pdGl2ZSB0eXBlIik7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENvbnN0ZXhwclR5cGVQYXJhbWV0
ZXIgZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1l
ID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdl
dCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4g
dGhpcy5fdHlwZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRydWU7IH0KKyAg
ICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAi
ICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVz
c2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVmFs
dWUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAg
IAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgdHlw
ZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Zp
ZWxkLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRmllbGQgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
bmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAg
ICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0
aGlzLl90eXBlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMudHlwZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9GdW5jdGlvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5j
dGlvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbi5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmN0aW9uIGV4dGVu
ZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3IobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRl
cnMsIHBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAg
ICAgdGhpcy5fcmV0dXJuVHlwZSA9IHJldHVyblR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJh
bWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBwYXJh
bWV0ZXJzOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7
IH0KKyAgICBnZXQgcmV0dXJuVHlwZSgpIHsgcmV0dXJuIHRoaXMuX3JldHVyblR5cGU7IH0KKyAg
ICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQor
ICAgIGdldCBwYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fcGFyYW1ldGVyczsgfQorICAgIAor
ICAgIGdldCBraW5kKCkgeyByZXR1cm4gRnVuY3Rpb247IH0KKyAgICAKKyAgICB1bmlmeUltcGwo
dW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghKG90aGVyIGlu
c3RhbmNlb2YgRnVuY3Rpb24pKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAK
KyAgICAgICAgaWYgKHRoaXMubmFtZSAhPSBvdGhlci5uYW1lKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAKKyAgICAgICAgaWYgKCF0aGlzLnJldHVyblR5cGUudW5pZnlJbXBs
KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIucmV0dXJuVHlwZSkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIAorICAgICAgICBpZiAodGhpcy5wYXJhbWV0ZXJzLmxlbmd0aCAh
PSBvdGhlci5wYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgCisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5wYXJhbWV0ZXJzLmxlbmd0
aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMucGFyYW1ldGVyc1tpXS51bmlmeUltcGwo
b3RoZXIucGFyYW1ldGVyc1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuVHlwZSArICIgIiAr
IHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPigiICsgdGhpcy5wYXJh
bWV0ZXJzICsgIikiOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rp
b25Bcmd1bWVudC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkFy
Z3VtZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uQXJn
dW1lbnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5j
dGlvbkFyZ3VtZW50IHsKKyAgICAvLyBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSXQncyBPSyBmb3Ig
aXQgdG8gYmUgbnVsbCEKKyAgICBjb25zdHJ1Y3RvcihuYW1lLCB0eXBlKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0K
KyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlw
ZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25TaWduYXR1cmUuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25TaWduYXR1cmUuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25TaWduYXR1cmUuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEy
MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBMZXhlciB7CisgICAgY29uc3RydWN0b3IodGV4dCkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3RleHQgPSB0ZXh0OworICAgICAgICB0aGlzLl9pbmRleCA9IDA7CisgICAg
fQorICAgIAorICAgIGdldCBsaW5lTnVtYmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
LmxpbmVOdW1iZXJGb3JJbmRleCh0aGlzLl9pbmRleCk7CisgICAgfQorICAgIAorICAgIGxpbmVO
dW1iZXJGb3JJbmRleChpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0LnN1
YnN0cmluZygwLCBpbmRleCkubWF0Y2goL1xuL2cpLmxlbmd0aDsKKyAgICB9CisgICAgCisgICAg
Z2V0IHN0YXRlKCkgeyByZXR1cm4gdGhpcy5faW5kZXg7IH0KKyAgICBzZXQgc3RhdGUodmFsdWUp
IHsgdGhpcy5faW5kZXggPSB2YWx1ZTsgfQorICAgIAorICAgIG5leHQoKQorICAgIHsKKyAgICAg
ICAgaWYgKHRoaXMuX2luZGV4ID49IHRoaXMuX3RleHQubGVuZ3RoKQorICAgICAgICAgICAgcmV0
dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICBjb25zdCBpc0NDb21tZW50QmVnaW4gPSAvXC9c
Ki87CisgICAgICAgIGNvbnN0IGlzQ1BsdXNQbHVzQ29tbWVudEJlZ2luID0gL1wvXC8vOworICAg
ICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9IChraW5kKSA9PiB7CisgICAgICAgICAgICBsZXQg
dGV4dCA9IFJlZ0V4cC5sYXN0TWF0Y2g7CisgICAgICAgICAgICBsZXQgdG9rZW4gPSBuZXcgTGV4
ZXJUb2tlbih0aGlzLCB0aGlzLl9pbmRleCwga2luZCwgdGV4dCk7CisgICAgICAgICAgICB0aGlz
Ll9pbmRleCArPSB0ZXh0Lmxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAg
ICAgfTsKKworICAgICAgICBsZXQgcmVsZXZhbnRUZXh0OworICAgICAgICBmb3IgKDs7KSB7Cisg
ICAgICAgICAgICByZWxldmFudFRleHQgPSB0aGlzLl90ZXh0LnN1YnN0cmluZyh0aGlzLl9pbmRl
eCk7CisgICAgICAgICAgICBpZiAoL15ccysvLnRlc3QocmVsZXZhbnRUZXh0KSkgeworICAgICAg
ICAgICAgICAgIHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gubGVuZ3RoOworICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9c
Ki8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0g
cmVsZXZhbnRUZXh0LnNlYXJjaCgvXCpcLy8pOworICAgICAgICAgICAgICAgIGlmIChlbmRJbmRl
eCA8IDApCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbCgiVW50ZXJtaW5hdGVkIGNvbW1l
bnQiKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBlbmRJbmRleDsKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgvXlwvXC8u
Ki8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggKz0g
UmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAg
ICAgLy8gRklYTUU6IE1ha2UgdGhpcyBkbyBVbmljb2RlLgorICAgICAgICBpZiAoL15bXlxkXFdd
XHcqLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJpZGVu
dGlmaWVyIik7CisKKyAgICAgICAgaWYgKC9eWzAtOV0rLy50ZXN0KHJlbGV2YW50VGV4dCkpCisg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJpbnRlZ2VyTGl0ZXJhbCIpOworCisgICAgICAgIC8v
IEZJWE1FOiBNYWtlIHRoaXMgaGFuZGxlIGV4cC1mb3JtIGxpdGVyYWxzIGxpa2UgMWUxLgorICAg
ICAgICBpZiAoL14oWzAtOV0qXC5bMC05XSspfChbMC05XStcLlswLTldKikvLnRlc3QocmVsZXZh
bnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImZsb2F0TGl0ZXJhbCIpOworICAg
ICAgICAKKyAgICAgICAgaWYgKC9eKHN0cnVjdHxwcm90b2NvbHx0eXBlfGlmfGVsc2V8ZW51bXxj
b250aW51ZXxicmVha3xzd2l0Y2h8Y2FzZXxkZWZhdWx0fGZvcnx3aGlsZXxkb3xyZXR1cm58c2l6
ZW9mfGNvbnN0YW50fGRldmljZXx0aHJlYWRncm91cHx0aHJlYWR8b3BlcmF0b3IpLy50ZXN0KHJl
bGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJrZXl3b3JkIik7CisgICAg
ICAgIAorICAgICAgICBpZiAoL14oW3t9KClcW1xdPzo9KypcLywuJSF+XiZ8PD5cXC1dfC0+fD0+
fDw9fD09fCE9fCs9fC09fFwqPXxcLz18JT18Xj18XHw9fCY9KS8udGVzdChyZWxldmFudFRleHQp
KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgicHVuY3R1YXRpb24iKTsKKyAgICAgICAgCisg
ICAgICAgIGZhaWwoIlVucmVjb2duaXplZCB0b2tlbiBiZWdpbm5pbmcgd2l0aDogIiArIHJlbGV2
YW50VGV4dC5zdWJzdHJpbmcoMCwgMTApKTsKKyAgICB9CisgICAgCisgICAgZmFpbChlcnJvcikK
KyAgICB7CisgICAgICAgIHRocm93IG5ldyBBTFN5bnRheEVycm9yKHRoaXMubGluZU51bWJlciwg
ZXJyb3IpOworICAgIH0KKyAgICAKKyAgICBiYWNrdHJhY2tpbmdTY29wZShjYWxsYmFjaykKKyAg
ICB7CisgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7CisgICAgICAgIHRyeSB7CisgICAg
ICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAg
ICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBTFN5bnRheEVycm9yKSB7CisgICAgICAgICAgICAgICAg
dGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KK30KSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9MZXhlclRva2VuLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgTGV4ZXJUb2tlbiB7CisgICAgY29uc3RydWN0b3IobGV4ZXIsIGluZGV4LCBraW5kLCB0ZXh0
KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhlcjsKKyAgICAgICAgdGhpcy5faW5k
ZXggPSBpbmRleDsKKyAgICAgICAgdGhpcy5fa2luZCA9IGtpbmQ7CisgICAgICAgIHRoaXMuX3Rl
eHQgPSB0ZXh0OworICAgIH0KKyAgICAKKyAgICBnZXQga2luZCgpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5fa2luZDsKKyAgICB9CisgICAgCisgICAgZ2V0IHRleHQoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuX3RleHQ7CisgICAgfQorICAgIAorICAgIGdldCBsaW5lTnVtYmVy
KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9sZXhlci5saW5lTnVtYmVyRm9ySW5kZXgo
dGhpcy5faW5kZXgpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gIkxleGVyVG9rZW4oIiArIHRoaXMua2luZCArICIsICIgKyB0aGlzLnRleHQgKyAi
LCAiICsgdGhpcy5saW5lTnVtYmVyICsgIikiOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL05hbWVDb250ZXh0LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05h
bWVDb250ZXh0LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250
ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTmFtZUNv
bnRleHQgeworICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5f
dHlwZXMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3ZhbHVlcyA9IG5ldyBNYXAoKTsKKyAg
ICAgICAgdGhpcy5fcHJvdG9jb2xzID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9mdW5jdGlv
bnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbnVsbDsKKyAgICB9Cisg
ICAgCisgICAgbWFwRm9yKGtpbmQpCisgICAgeworICAgICAgICBpZiAoa2luZCA9PSBWYWx1ZSkK
KyAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXM7CisgICAgICAgIGlmIChraW5kID09IFR5
cGUpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fdHlwZXM7CisgICAgICAgIGlmIChraW5kID09
IFByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sczsKKyAgICAgICAg
aWYgKGtpbmQgPT0gRnVuY3Rpb24pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fZnVuY3Rpb25z
OworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBraW5kOiAiICsga2luZCk7CisgICAgfQor
ICAgIAorICAgIGFkZCh0aGluZykKKyAgICB7CisgICAgICAgIGxldCBtYXAgPSBtYXBGb3IodGhp
bmcua2luZCk7CisgICAgICAgIGlmIChtYXAuaGFzKHRoaW5nLm5hbWUpKQorICAgICAgICAgICAg
dGhyb3cgbmV3IEFMVHlwZUVycm9yKHRoaW5nLm9yaWdpbi5saW5lTnVtYmVyLCAiRHVwbGljYXRl
IG5hbWU6ICIgKyB0aGluZy5uYW1lKTsKKyAgICAgICAgbWFwLnNldCh0aGluZy5uYW1lLCB0aGlu
Zyk7CisgICAgfQorICAgIAorICAgIGdldChraW5kLCBuYW1lKQorICAgIHsKKyAgICAgICAgbGV0
IHJlc3VsdCA9IG1hcEZvcihraW5kKS5nZXQobmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0ICYm
IHRoaXMuZGVsZWdhdGUpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5nZXQoa2lu
ZCwgbmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgICpbU3lt
Ym9sLml0ZXJhdG9yXSgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlIG9mIHRoaXMuX3R5
cGVzKQorICAgICAgICAgICAgeWllbGQgdHlwZTsKKyAgICAgICAgZm9yIChsZXQgdmFsdWUgb2Yg
dGhpcy5fdmFsdWVzKQorICAgICAgICAgICAgeWllbGQgdmFsdWU7CisgICAgICAgIGZvciAobGV0
IHByb3RvY29sIG9mIHRoaXMuX3Byb3RvY29scykKKyAgICAgICAgICAgIHlpZWxkIHByb3RvY29s
OworICAgICAgICBmb3IgKGxldCBwaHVuY3Rpb24gb2YgdGhpcy5fZnVuY3Rpb25zKQorICAgICAg
ICAgICAgeWllbGQgcGh1bmN0aW9uOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L05hdGl2ZVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlw
ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTmF0aXZlVHlwZSBleHRl
bmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgaXNQcmltaXRpdmUsIHR5
cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAg
ICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5faXNQcmltaXRpdmUgPSBpc1By
aW1pdGl2ZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsK
KyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dW5yIHRoaXMuX29yaWdpbjsgfQor
ICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc1ByaW1pdGl2
ZSgpIHsgcmV0dXJuIHRoaXMuX2lzUHJpbWl0aXZlOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJz
KCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICAKKyAgICBpbnN0YW50aWF0
ZShvcmlnaW4sIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50
cy5sZW5ndGggIT0gdGhpcy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICB0aHJv
dyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLmxpbmVOdW1iZXIsICJXcm9uZyBudW1iZXIgb2YgdHlw
ZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICBpZiAoIXR5cGVBcmd1bWVu
dHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVybiBuZXcg
TmF0aXZlVHlwZUluc3RhbmNlKHRoaXMsIG9yaWdpbiwgdHlwZUFyZ3VtZW50cyk7CisgICAgfQor
ICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAibmF0aXZlICIgKyAo
dGhpcy5pc1ByaW1pdGl2ZSA/ICJwcmltaXRpdmUgIiA6ICIiKSArICJ0eXBlICIgKyB0aGlzLm5h
bWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4iOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVUeXBlSW5zdGFuY2UgZXh0ZW5kcyBUeXBl
IHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBlLCBvcmlnaW4sIHR5cGVBcmd1bWVudHMpCisgICAgewor
ICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2lu
OworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgZ2V0IG9yaWdp
bigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyBy
ZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAi
PiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvTm9kZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDg0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIE5vZGUgeworICAgIHZpc2l0KHZpc2l0b3IpCisgICAgeworICAgICAgICBsZXQgcmV0
dXJuVmFsdWUgPSB2aXNpdG9yWyJ2aXNpdCIgKyB0aGlzLmNvbnN0cnVjdG9yLm5hbWVdKHRoaXMp
OworICAgICAgICBpZiAoInJldHVyblZhbHVlIiBpbiB2aXNpdG9yKQorICAgICAgICAgICAgcmV0
dXJuIHZpc2l0b3IucmV0dXJuVmFsdWU7CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAg
ICB9CisgICAgCisgICAgYXBwbGllc1RvKG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0IHVuaWZp
Y2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQoKTsKKyAgICAgICAgaWYgKCF0
aGlzLnVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKSkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgCisgICAgICAgIGNsYXNzIFZlcmlmeUFzQXJndW1lbnQgZXh0
ZW5kcyBWaXNpdG9yIHsKKyAgICAgICAgICAgIGNvbnN0cnVjdG9yKCkKKyAgICAgICAgICAgIHsK
KyAgICAgICAgICAgICAgICB0aGlzLnJldHVyblZhbHVlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIAorICAgICAgICAgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAgICAg
ICAgICAgIHsKKyAgICAgICAgICAgICAgICBsZXQgcmVhbE5vZGUgPSB1bmlmaWNhdGlvbkNvbnRl
eHQuZmluZChub2RlKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAvLyBUaGUg
dGhpbmcgd2UgZ2V0IHVuaWZpZWQgd2l0aCBtdXN0IGJlIGEgdHlwZSB2YXJpYWJsZSB0aGF0IGFj
Y2VwdHMgYSBicm9hZGVyIHNldCBvZgorICAgICAgICAgICAgICAgIC8vIHRoaW5ncyB0aGFuIHdl
IGRvLgorICAgICAgICAgICAgICAgIGlmICghKHJlYWxOb2RlIGluc3RhbmNlb2YgVHlwZVZhcmlh
YmxlKSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnJldHVyblZhbHVlID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgaWYgKCFub2RlLnByb3RvY29sLmluaGVyaXRzKHJlYWxO
b2RlLnByb3RvY29sKSkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5WYWx1ZSA9IGZh
bHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBjbGFzcyBW
ZXJpZnlBc1BhcmFtZXRlciBleHRlbmRzIFZpc2l0b3IgeworICAgICAgICAgICAgY29uc3RydWN0
b3IoKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWUgPSB0
cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB2aXNpdFR5cGVW
YXJpYWJsZShub2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghdW5pZmlj
YXRpb25Db250ZXh0LmZpbmQobm9kZSkuaW5oZXJpdHMobm9kZS5wcm90b2NvbCkpCisgICAgICAg
ICAgICAgICAgICAgIHRoaXMucmV0dXJuVmFsdWUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXQobmV3IFZlcmlmeUFz
QXJndW1lbnQoKSkgJiYgb3RoZXIudmlzaXQobmV3IFZlcmlmeUFzUGFyYW1ldGVyKCkpOworICAg
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzID09IG90aGVyOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1BhcnNlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QYXJz
ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2VyLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcGFyc2UodGV4dCkKK3sK
KyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIodGV4dCk7CisgICAgCisgICAgLy8gVGhlIGhhcmRl
c3QgcGFydCBvZiBkZWFsaW5nIHdpdGggQy1saWtlIGxhbmd1YWdlcyBpcyBwYXJzaW5nIHZhcmlh
YmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudHMuCisgICAgLy8gTGV0J3MgY29uc2lkZXIgaWYgdGhp
cyBoYXBwZW5zIGluIEFycmF5TGFuZy4gSGVyZSBhcmUgdGhlIHZhbGlkIHN0YXRlbWVudHMgaW4g
QXJyYXlMYW5nIHRoYXQKKyAgICAvLyBiZWdpbiB3aXRoIGFuIGlkZW50aWZpZXIsIGlmIHdlIGFz
c3VtZSB0aGF0IGFueSBleHByZXNzaW9uIGNhbiBiZSBhIHN0YW5kYWxvbmUgc3RhdGVtZW50Lgor
ICAgIC8vCisgICAgLy8gICAgIHg7CisgICAgLy8gICAgIHggPGJpbm9wPiB5OworICAgIC8vICAg
ICB4IDwgeTsKKyAgICAvLyAgICAgeCA8IHkgPiB6OworICAgIC8vICAgICB4ID0geTsKKyAgICAv
LyAgICAgeC5mID0geTsKKyAgICAvLyAgICAgXGV4cCA9IHk7CisgICAgLy8gICAgIHhbNDJdID0g
eTsKKyAgICAvLyAgICAgeCgpOworICAgIC8vICAgICB4PHk+KCk7CisgICAgLy8gICAgIHggeTsK
KyAgICAvLyAgICAgeDx5PiB6OworICAgIC8vICAgICB4W10geTsKKyAgICAvLyAgICAgeFs0Ml0g
eTsKKyAgICAvLyAgICAgeF4geTsKKyAgICAvLworICAgIC8vIFRoaXMgaGFzIHR3byBwcm9ibGVt
IGFyZWFzOgorICAgIC8vCisgICAgLy8gICAgIC0geDx5PnogY2FuIHBhcnNlIHR3byBkaWZmZXJl
bnQgd2F5cyAoYXMgKHggPCB5KSA+IHogb3IgeDx5PiB6KS4KKyAgICAvLyAgICAgLSB4WzQyXSBj
b3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlv
bi4KKyAgICAvLyAgICAgLSB4PHk+IGNvdWxkIGJlY29tZSBlaXRoZXIgYW4gYXNzaWdubWVudCBv
ciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vCisgICAgLy8gV2Ugc29sdmUgdGhlIGZp
cnN0IHByb2JsZW0gYnkgZm9yYmlkZGluZyBleHByZXNzaW9ucyBhcyBzdGF0ZW1lbnRzLiBUaGUg
bGFjayBvZiBmdW5jdGlvbgorICAgIC8vIHBvaW50ZXJzIG1lYW5zIHRoYXQgd2UgY2FuIHN0aWxs
IGFsbG93IGZ1bmN0aW9uIGNhbGwgc3RhdGVtZW50cyAtIHVubGlrZSBpbiBDLCB0aG9zZSBjYW5u
b3QKKyAgICAvLyBoYXZlIGFyYml0cmFyeSBleHByZXNzaW9ucyBhcyB0aGUgY2FsbGVlLiBUaGUg
cmVtYWluaW5nIHR3byBwcm9ibGVtcyBhcmUgc29sdmVkIGJ5CisgICAgLy8gYmFja3RyYWNraW5n
LiBJbiBhbGwgb3RoZXIgcmVzcGVjdHMsIHRoaXMgaXMgYSBzaW1wbGUgcmVjdXJzaXZlIGRlc2Nl
bnQgcGFyc2VyLgorICAgIAorICAgIGZ1bmN0aW9uIG5ld05vZGUobm9kZSwgZGF0YSkKKyAgICB7
CisgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG5vZGUsIGRhdGEpOworICAgIH0KKyAgICAK
KyAgICAKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBQcm9ncmFtIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3IoKQorICAg
IHsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzID0gW107CisgICAgICAgIHRoaXMu
X2Z1bmN0aW9ucyA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fdHlwZXMgPSBuZXcgTWFwKCk7
CisgICAgfQorICAgIAorICAgIGdldCB0b3BMZXZlbFN0YXRlbWVudHMoKSB7IHJldHVybiB0aGlz
Ll90b3BMZXZlbFN0YXRlbWVudHM7IH0KKyAgICBnZXQgZnVuY3Rpb25zKCkgeyByZXR1cm4gdGhp
cy5fZnVuY3Rpb25zOyB9CisgICAgZ2V0IHR5cGVzKCkgeyByZXR1cm4gdGhpcy5fdHlwZXM7IH0K
KyAgICAKKyAgICBhZGRUb3BMZXZlbFN0YXRlbWVudChzdGF0ZW1lbnQpCisgICAgeworICAgICAg
ICBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pCisgICAgICAgICAgICB0aGlzLl9m
dW5jdGlvbnMuc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlIGlm
IChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAgdGhpcy5fdHlwZXMuc2V0
KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0
aHJvdyBuZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlvbiBvciB0eXBlOiAiICsg
c3RhdGVtZW50KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzLnB1c2goc3RhdGVt
ZW50KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAg
IGxldCByZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVt
ZW50IG9mIHRoaXMudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChz
dGF0ZW1lbnQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvUHJvdG9jb2wuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9j
b2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2Nv
bCBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7
CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0K
KyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQga2luZCgpIHsg
cmV0dXJuIFByb3RvY29sOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Qcm90
b2NvbERlY2wuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNs
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb3RvY29sRGVjbCBl
eHRlbmRzIFByb3RvY29sIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgewor
ICAgICAgICBzdXBlcihvcmlnaW4sIG5hbWUpCisgICAgICAgIHRoaXMuX3NpZ25hdHVyZXMgPSBb
XTsKKyAgICB9CisgICAgCisgICAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAg
ICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChzaWduYXR1cmUpOworICAgIH0KKyAgICAKKyAgICBn
ZXQgc2lnbmF0dXJlcygpIHsgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZXM7IH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInByb3RvY29sICIgKyB0aGlzLm5hbWUg
KyAiIHsgIiArIHRoaXMuc2lnbmF0dXJlcy5qb2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQor
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgUHJvdG9jb2xSZWYgZXh0ZW5kcyBQcm90b2NvbCB7IH0KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvUHRyVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBl
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHRyVHlwZSBl
eHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiXiI7Cisg
ICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJlZmVyZW5jZVR5cGUgZXh0ZW5kcyBUeXBlIHsK
KyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFkZHJlc3NTcGFjZSwgZWxlbWVudFR5cGUpCisgICAg
eworICAgICAgICB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpOworICAgICAgICB0
aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2FkZHJlc3NTcGFjZSA9IGFkZHJl
c3NTcGFjZTsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdl
dCBhZGRyZXNzU3BhY2UoKSB7IHJldHVybiB0aGlzLl9hZGRyZXNzU3BhY2U7IH0KKyAgICBnZXQg
ZWxlbWVudFR5cGUoKSB7IHJldHVybiB0aGlzLl9lbGVtZW50VHlwZTsgfQorICAgIGdldCBpc1By
aW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0
aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAodGhpcy5jb25zdHJ1Y3RvciAh
PSBvdGhlci5jb25zdHJ1Y3RvcikKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
cmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3Ro
ZXIuZWxlbWVudFR5cGUpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmV3
cml0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV3cml0ZXIgeworICAgIHZpc2l0UHJv
Z3JhbShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fcmVzdWx0aW5nUHJvZ3JhbSA9IG5ldyBQ
cm9ncmFtKCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3Rh
dGVtZW50cykKKyAgICAgICAgICAgIHRoaXMuX3Jlc3VsdGluZ1Byb2dyYW0uYWRkVG9wTGV2ZWxT
dGF0ZW1lbnQoc3RhdGVtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3Jl
c3VsdGluZ1Byb2dyYW07CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rpb24obm9kZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oCisgICAgICAgICAgICBub2RlLm5hbWUs
IG5vZGUucmV0dXJuVHlwZS52aXNpdCh0aGlzKSwKKyAgICAgICAgICAgIG5vZGUudHlwZVBhcmFt
ZXRlcnMubWFwKHR5cGVQYXJtZXRlciA9PiB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpKSwKKyAg
ICAgICAgICAgIG5vZGUucGFyYW1ldGVycy5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRlci52aXNp
dCh0aGlzKSkpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uQXJndW1lbnQobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25Bcmd1bWVudChub2RlLm5hbWUsIG5v
ZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xSZWYo
bm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNp
dFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBQcm90
b2NvbERlY2wobm9kZS5vcmlnaW4sIG5vZGUubmFtZSk7CisgICAgICAgIGZvciAobGV0IHNpZ25h
dHVyZSBvZiBub2RlLnNpZ25hdHVyZXMpCisgICAgICAgICAgICByZXN1bHQuYWRkU2lnbmF0dXJl
KHNpZ25hdHVyZS52aXNpdCh0aGlzKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBU
eXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodHlw
ZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSkpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdFR5cGVJbnN0YW50aWF0aW9uKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3
IFR5cGVJbnN0YW50aWF0aW9uKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3Vt
ZW50cy5tYXAodHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSkpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVy
biBuZXcgTmF0aXZlVHlwZQorICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgU3RydWN0VHlwZShub2RlLm9yaWdpbiwg
bm9kZS5uYW1lLCBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFyYW1ldGVyID0+IHR5cGVQ
YXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5m
aWVsZHMpCisgICAgICAgICAgICByZXN1bHQuYWRkRmllbGQoZmllbGQudmlzaXQodGhpcykpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVWYXJpYWJs
ZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAorICAgIHZp
c2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5l
dyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlw
ZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0RmllbGQobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBuZXcgRmllbGQobm9kZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50
eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5v
ZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IG5vZGUuY29uc3RydWN0b3Iobm9kZS5yb2dp
aW4sIG5vZGUuYWRkcmVzc1NwYWNlLCBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRQdHJUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy52aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJy
YXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy52aXNpdFJlZmVyZW5j
ZVR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAg
eworICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShub2RlLm9yaWdpbiwgbm9kZS5lbGVtZW50
VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9k
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9TdHJ1Y3RUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVj
dFR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdHJ1
Y3RUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBl
UGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAg
ICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlw
ZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX2ZpZWxkcyA9IG5ldyBNYXAoKTsKKyAgICB9Cisg
ICAgCisgICAgYWRkRmllbGQoZmllbGQpCisgICAgeworICAgICAgICBpZiAodGhpcy5fZmllbGRz
LmhhcyhmaWVsZC5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihmaWVs
ZC5vcmlnaW4ubGluZU51bWJlciwgIkR1cGxpY2F0ZSBmaWVsZCBuYW1lOiAiICsgZmllbGQubmFt
ZSk7CisgICAgICAgIHRoaXMuX2ZpZWxkcy5zZXQoZmllbGQubmFtZSwgZmllbGQpOworICAgIH0K
KyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlw
ZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAg
IGdldCBmaWVsZE5hbWVzKCkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmtleXMoKTsgfQorICAgIGZp
ZWxkQnlOYW1lKG5hbWUpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy5nZXQobmFtZSk7IH0KKyAgICBn
ZXQgZmllbGRzKCkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmVudHJpZXMoKTsgfQorICAgIGdldCBm
aWVsZE1hcCgpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkczsgfQorICAgIAorICAgIGdldCBuYW1lQ29u
dGV4dCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE5hbWVDb250ZXh0KCk7Cisg
ICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhpcy50eXBlUGFyYW1ldGVycykKKyAg
ICB9CisgICAgCisgICAgaW5zdGFudGlhdGUob3JpZ2luLCB0eXBlQXJndW1lbnRzKQorICAgIHsK
KyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMu
bGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5saW5lTnVt
YmVyLCAiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3RhbnRpYXRpb24iKTsK
KyAgICAgICAgCisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCgpOwor
ICAgICAgICAKKyAgICAgICAgbGV0IG1hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgZm9yIChsZXQg
aSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgbWFwLnNl
dCh0aGlzLnR5cGVQYXJhbWV0ZXJzW2ldLCB0eXBlQXJndW1lbnRzW2ldKTsKKyAgICAgICAgCisg
ICAgICAgIGNsYXNzIFN1YnN0aXR1dGUgZXh0ZW5kcyBSZXdyaXRlciB7CisgICAgICAgICAgICB2
aXNpdFR5cGVWYXJpYWJsZShub2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIAor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiAic3RydWN0ICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5
cGVQYXJhbWV0ZXJzICsgIj4geyAiICsgQXJyYXkuZnJvbSh0aGlzLmZpZWxkcykuam9pbigiOyAi
KSArICI7IH0iOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9UeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgVHlwZSBleHRlbmRzIE5vZGUgeworICAgIGdldCB0eXBlUGFyYW1ldGVycygp
IHsgcmV0dXJuIFtdOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBUeXBlOyB9CisgICAgCisg
ICAgaW5oZXJpdHMocHJvdG9jb2wpCisgICAgeworICAgICAgICAvLyBGSVhNRQorICAgIH0KKyAg
ICAKKyAgICBpbnN0YW50aWF0ZWRUeXBlKG5hbWVDb250ZXh0KSB7IHJldHVybiB0aGlzOyB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9UeXBlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgVHlwZVJlZiBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwg
dHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAg
ICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0
eXBlQXJndW1lbnRzOworICAgIH0KKyAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5f
b3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0
IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0
IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICAvLyBVc2UgdGhpcyB0
byBleHBsb3JlIHByb3BlcnRpZXMgb2YgdGhlIGluc3RhbnRpYXRlZCB0eXBlLCBidXQgdHJ5IG5v
dCB0byBrZWVwIGl0IGFyb3VuZC4KKyAgICBpbnN0YW50aWF0ZWRUeXBlKG5hbWVDb250ZXh0KQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG5hbWVDb250ZXh0LmdldChUeXBlLCB0aGlzLm5hbWUpLmlu
c3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlQXJndW1lbnRz
ICsgIj4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxl
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlVmFyaWFibGUgZXh0ZW5kcyBU
eXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHByb3RvY29sKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsK
KyAgICAgICAgdGhpcy5fcHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICB9CisgICAgCisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHByb3RvY29sKCkgeyByZXR1
cm4gdGhpcy5fcHJvdG9jb2w7IH0KKyAgICAKKyAgICBnZXQgaXNQcmltaXRpdmUoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sICYmIHRoaXMuX3Byb3RvY29sLmlzUHJpbWl0
aXZlOworICAgIH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHByb3RvY29sKTsKKyAgICB9CisgICAgCisg
ICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBs
ZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYg
KHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnlJbXBs
KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgICAgICAKKyAgICAgICAgdW5pZmljYXRp
b25Db250ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0Lmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFVuaWZpY2F0aW9u
Q29udGV4dCB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmV4dE1h
cCA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgdW5pb24oYSwgYikKKyAgICB7CisgICAg
ICAgIGEgPSBmaW5kKGEpOworICAgICAgICBiID0gZmluZChiKTsKKyAgICAgICAgaWYgKCEoYiBp
bnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkpCisgICAgICAgICAgICBbYSwgYl0gPSBbYiwgYV07Cisg
ICAgICAgIGlmICghKGEgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGUpKQorICAgICAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJDYW5ub3QgdW5pZnkgbm9uLXZhcmlhYmxlcyB0eXBlcyAiICsgYSArICIg
YW5kICIgKyBiKTsKKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQoYSwgYik7CisgICAgfQorICAg
IAorICAgIGZpbmQobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7
CisgICAgICAgIGxldCBuZXh0Tm9kZSA9IHRoaXMuX25leHRNYXAuZ2V0KGN1cnJlbnROb2RlKTsK
KyAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTsK
KyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0Tm9kZTsK
KyAgICAgICAgICAgIG5leHROb2RlID0gdGhpcy5fbmV4dE1hcC5nZXQoY3VycmVudE5vZGUpOwor
ICAgICAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICB0aGlzLl9uZXh0TWFwLnNldChub2RlLCBjdXJyZW50Tm9kZSk7CisgICAg
ICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1ZhbHVlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFsdWUgZXh0ZW5kcyBOb2RlIHsKKyAgICBn
ZXQga2luZCgpIHsgcmV0dXJuIFZhbHVlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1
cm4gZmFsc2U7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVSZWYuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVSZWYuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVSZWYuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWYXJpYWJsZVJlZiBleHRlbmRzIEV4cHJlc3Np
b24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVy
KG9yaWdpbiwgbnVsbCk7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0KKyAgICAK
KyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvVmlzaXRvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9y
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZpc2l0b3Ig
eworICAgIHZpc2l0UHJvZ3JhbShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVt
ZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZp
c2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uKG5vZGUpCisgICAgewor
ICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHR5
cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJh
bWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBh
cmFtZXRlcnMpCisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc2l0RnVuY3Rpb25Bcmd1bWVudChub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50
eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sUmVmKG5vZGUp
CisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsK
KyAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAg
ICAgIHNpZ25hdHVyZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVm
KG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50eXBl
QXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFR5cGVJbnN0YW50aWF0aW9uKG5vZGUpCisgICAgeworICAgICAgICBm
b3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAg
dHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdE5hdGl2ZVR5
cGUobm9kZSkKKyAgICB7CisgICAgICAgIC8vIEZJWE1FCisgICAgfQorICAgIAorICAgIHZpc2l0
U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBv
ZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0
aGlzKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAg
ICBmaWVsZC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUo
bm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRl
cihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RWxlbWVudGFsVHlwZShub2RlKQorICAgIHsK
KyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRQdHJUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlw
ZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7
CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRh
bFR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAg
ICB7CisgICAgfQorfQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319065</attachid>
            <date>2017-08-24 22:33:51 -0700</date>
            <delta_ts>2017-08-25 14:14:38 -0700</delta_ts>
            <desc>core type checker is looking good</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>91637</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihsaW5lTnVtYmVyLCBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgc3VwZXIoIlN5bnRh
eCBlcnJvciBhdCBsaW5lIG51bWJlciAiICsgKGxpbmVOdW1iZXIgKyAxKSArICI6ICIgKyBtZXNz
YWdlKTsKKyAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKKyAgICAgICAgdGhp
cy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0FMVHlwZUVycm9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVy
cm9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVycm9yLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQUxUeXBlRXJyb3Ig
ZXh0ZW5kcyBFcnJvciB7CisgICAgY29uc3RydWN0b3IobGluZU51bWJlciwgbWVzc2FnZSkKKyAg
ICB7CisgICAgICAgIHN1cGVyKCJUeXBlIGVycm9yIGF0IGxpbmUgbnVtYmVyICIgKyAobGluZU51
bWJlciArIDEpICsgIjogIiArIG1lc3NhZ2UpOworICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBs
aW5lTnVtYmVyOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1NwYWNlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0FkZHJlc3NTcGFjZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9BZGRyZXNzU3BhY2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7Cisg
ICAgc3dpdGNoIChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2Fz
ZSAiZGV2aWNlIjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoK
KyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigi
QmFkIGFkZHJlc3Mgc3BhY2U6ICIgKyBhZGRyZXNzU3BhY2UpOworICAgIH0KK30KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9BcnJheVJlZlR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvQXJyYXlSZWZUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc1NwYWNlICsgIiAiICsgdGhpcy5l
bGVtZW50VHlwZSArICJbXSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9B
cnJheVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5VHlwZSBleHRlbmRzIFR5
cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgZWxlbWVudFR5cGUsIG51bUVsZW1lbnRzKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9lbGVt
ZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICB0aGlzLl9udW1FbGVtZW50cyA9IG51bUVs
ZW1lbnRzOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5fZWxlbWVudFR5cGU7
IH0KKyAgICBnZXQgbnVtRWxlbWVudHMoKSB7IHJldHVybiB0aGlzLl9udW1FbGVtZW50czsgfQor
ICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuaXNQcmltaXRp
dmU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5l
bGVtZW50VHlwZSArICJbIiArIHRoaXMubnVtRWxlbWVudHMgKyAiXSI7CisgICAgfQorICAgIAor
ICAgIHVuaWZ5SW1wbCh1bmlmaWNhdG9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBp
ZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIAorICAgICAgICBpZiAoIXRoaXMubnVtRWxlbWVudHMudW5pZnkodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlci5udW1FbGVtZW50cykpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvQ2hlY2tlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DaGVja2Vy
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENoZWNrZXIg
ZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAvLyBJdCdzIHRvdGFsbHkgT0sgdG8gaW5zdGFudGlhdGUg
dGhpcyB3aXRoIHplcm8gYXJndW1lbnRzIChpLmUuIHBhc3NpbmcgdW5kZWZpbmVkIGZvciBib3Ro
IG9mCisgICAgLy8gdGhlbSkgaWYgeW91J3JlIGNyZWF0aW5nIGEgQ2hlY2tlciB0byB2aXNpdCBh
IFByb2dyYW0uCisgICAgY29uc3RydWN0b3IobmFtZUNvbnRleHQsIGRlZk5hbWVDb250ZXh0KQor
ICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZUNvbnRleHQgPSBuYW1lQ29udGV4dDsKKyAgICAgICAg
dGhpcy5fZGVmTmFtZUNvbnRleHQgPSBkZWZOYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAg
dmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBub2Rl
Lm5hbWVDb250ZXh0OworICAgICAgICBsZXQgZGVmTmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRl
eHQoKTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihub2RlLm5hbWVDb250ZXh0
LCBkZWZOYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRv
cExldmVsU3RhdGVtZW50cykgeworICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KGNoZWNrZXIp
OworICAgICAgICAgICAgZGVmTmFtZUNvbnRleHQuYWRkKHN0YXRlbWVudCk7CisgICAgICAgIH0K
KyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAgeworICAgICAgICBs
ZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAg
ICAgICBsZXQgZGVmTmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fZGVmTmFtZUNv
bnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFt
ZXRlcnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAg
ICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICBkZWZOYW1l
Q29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAgbGV0IGNoZWNr
ZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCwgZGVmTmFtZUNvbnRleHQpOworICAgICAgICBm
b3IgKGxldCBmaWVsZCBvZiBub2RlLmZpZWxkcykKKyAgICAgICAgICAgIGZpZWxkLnZpc2l0KGNo
ZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAg
ICAgIGxldCB0eXBlID0gdGhpcy5fZGVmTmFtZUNvbnRleHQuZ2V0KFR5cGUsIG5vZGUubmFtZSk7
CisgICAgICAgIGlmICghdHlwZSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLl9uYW1lQ29udGV4
dC5nZXQoVHlwZSwgbm9kZS5uYW1lKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBl
RXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIkNvdWxkIG5vdCBmaW5kIHR5cGUgbmFtZWQg
IiArIG5vZGUubmFtZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5v
cmlnaW4ubGluZU51bWJlciwgIklsbGVnYWwgZm9yd2FyZCB1c2Ugb2YgdHlwZSBuYW1lZCAiICsg
bm9kZS5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBub2RlLnR5cGUgPSB0eXBlOworICAgICAg
ICAKKyAgICAgICAgaWYgKHR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IG5vZGUudHlwZUFy
Z3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5v
cmlnaW4ubGluZU51bWJlciwgIldyb25nIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyIpOworICAg
ICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kp
IHsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJJc1R5cGUgPSB0eXBlLnR5cGVQYXJhbWV0ZXJz
W2ldIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlOworICAgICAgICAgICAgbGV0IGFyZ3VtZW50SXNU
eXBlID0gbm9kZS50eXBlQXJndW1lbnRzW2ldIGluc3RhbmNlb2YgVHlwZTsKKyAgICAgICAgICAg
IGlmIChwYXJhbWV0ZXJJc1R5cGUgJiYgIWFyZ3VtZW50SXNUeXBlKQorICAgICAgICAgICAgICAg
IHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiRXhwZWN0ZWQg
dHlwZSwgYnV0IGdvdCB2YWx1ZSBhdCBhcmd1bWVudCAjIiArIGkpOworICAgICAgICAgICAgaWYg
KCFwYXJhbWV0ZXJJc1R5cGUgJiYgYXJndW1lbnRJc1R5cGUpCisgICAgICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJFeHBlY3RlZCB2YWx1
ZSwgYnV0IGdvdCB0eXBlIGF0IGFyZ3VtZW50ICMiICsgaSk7CisgICAgICAgICAgICBpZiAoIWFy
Z3VtZW50SXNUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub2RlLnR5cGVBcmd1bWVudHNb
aV0uaXNDb25zdEV4cHIpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJv
cihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiRXhwZWN0ZWQgY29uc3RleHByIHZhbHVlIik7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHN1cGVyLnZpc2l0VHlw
ZVJlZihub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAg
IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3Jlc29sdmVyKFZhbHVlLCBub2RlLm5hbWUp
OworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJv
cihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiQ291bGQgbm90IGZpbmQgdmFyaWFibGUgbmFtZWQg
IiArIG5vZGUubmFtZSk7CisgICAgICAgIG5vZGUudmFyaWFibGUgPSByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5l
bGVtZW50VHlwZS52aXNpdChuZXcgQ2hlY2tlcih0aGlzLl9uYW1lQ29udGV4dCwgdGhpcy5fbmFt
ZUNvbnRleHQpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChub2RlLmFkZHJlc3NTcGFjZSA9PSAi
dGhyZWFkIikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICghbm9k
ZS5lbGVtZW50VHlwZS5pbnN0YW50aWF0ZWRUeXBlKHRoaXMuX25hbWVDb250ZXh0KS5pc1ByaW1p
dGl2ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5l
TnVtYmVyLCAiSWxsZWdhbCBwb2ludGVyIHRvIG5vbi1wcmltaXRpdmUgdHlwZSIpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgLy8gRklY
TUU6IGNoZWNrIHRoYXQgdGhlIHNpZ25hdHVyZXMgYWxsIGZvbGxvdyB0aGUgcnVsZXMuCisgICAg
ICAgIHN1cGVyLnZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpOworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDb25zdGV4cHJUeXBlUGFyYW1ldGVy
IGV4dGVuZHMgVmFsdWUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkKKyAg
ICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9
IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQg
bmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRo
aXMuX3R5cGU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAg
CisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAg
ICBpZiAoIXRoaXMudHlwZS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGUpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZp
Y2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykK
KyAgICAgICAgICAgIHJldHVybiByZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90
aGVyKTsKKyAgICAgICAgCisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFZhcmlhYmxlUmVm
KQorICAgICAgICAgICAgb3RoZXIgPSBvdGhlci52YXJpYWJsZTsKKyAgICAgICAgCisgICAgICAg
IHVuaWZpY2F0aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhlcik7CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc0FyZ3VtZW50KHVuaWZpY2F0aW9uQ29udGV4
dCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlB
c1BhcmFtZXRlcih1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMudHlwZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL0V4cHJlc3Npb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRXhw
cmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9u
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRXhwcmVzc2lv
biBleHRlbmRzIFZhbHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHR5cGUpCisgICAgewor
ICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBl
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9
CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9GaWVsZC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GaWVs
ZC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZpZWxkIHsKKyAgICBjb25zdHJ1
Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0g
dHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBl
KCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvRnVuY3Rpb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
RnVuY3Rpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBG
dW5jdGlvbiBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG5hbWUsIHJldHVyblR5cGUs
IHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9
IG5hbWU7CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICB0
aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9wYXJh
bWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVy
biB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHJldHVyblR5cGUoKSB7IHJldHVybiB0aGlzLl9yZXR1
cm5UeXBlOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBh
cmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRl
cnM7IH0KKyAgICBnZXQgcGFyYW1ldGVyVHlwZXMoKSB7IHJldHVybiB0aGlzLnBhcmFtZXRlcnMu
bWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudHlwZSk7IH0KKyAgICAKKyAgICBnZXQga2luZCgp
IHsgcmV0dXJuIEZ1bmN0aW9uOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMucmV0dXJuVHlwZSArICIgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMu
dHlwZVBhcmFtZXRlcnMgKyAiPigiICsgdGhpcy5wYXJhbWV0ZXJzICsgIikiOworICAgIH0KK30K
KwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlvblBhcmFtZXRlciB7CisgICAg
Ly8gVGhlIG5hbWUgaXMgb3B0aW9uYWwuIEl0J3MgT0sgZm9yIGl0IHRvIGJlIG51bGwhCisgICAg
Y29uc3RydWN0b3IobmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUo
KSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90
eXBlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
dHlwZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0Z1bmN0aW9uU2lnbmF0dXJlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0Z1bmN0aW9uU2lnbmF0dXJlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0Z1bmN0aW9uU2lnbmF0dXJlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjYgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvTGV4ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
TGV4ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4
ZXIgeworICAgIGNvbnN0cnVjdG9yKHRleHQpCisgICAgeworICAgICAgICB0aGlzLl90ZXh0ID0g
dGV4dDsKKyAgICAgICAgdGhpcy5faW5kZXggPSAwOworICAgIH0KKyAgICAKKyAgICBnZXQgbGlu
ZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyRm9ySW5kZXgo
dGhpcy5faW5kZXgpOworICAgIH0KKyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5kZXgoaW5kZXgp
CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpLm1h
dGNoKC9cbi9nKS5sZW5ndGg7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJu
IHRoaXMuX2luZGV4OyB9CisgICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2luZGV4ID0gdmFs
dWU7IH0KKyAgICAKKyAgICBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9pbmRleCA+
PSB0aGlzLl90ZXh0Lmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAK
KyAgICAgICAgY29uc3QgaXNDQ29tbWVudEJlZ2luID0gL1wvXCovOworICAgICAgICBjb25zdCBp
c0NQbHVzUGx1c0NvbW1lbnRCZWdpbiA9IC9cL1wvLzsKKyAgICAgICAgCisgICAgICAgIGxldCBy
ZXN1bHQgPSAoa2luZCkgPT4geworICAgICAgICAgICAgbGV0IHRleHQgPSBSZWdFeHAubGFzdE1h
dGNoOworICAgICAgICAgICAgbGV0IHRva2VuID0gbmV3IExleGVyVG9rZW4odGhpcywgdGhpcy5f
aW5kZXgsIGtpbmQsIHRleHQpOworICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gdGV4dC5sZW5n
dGg7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH07CisKKyAgICAgICAgbGV0
IHJlbGV2YW50VGV4dDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcmVsZXZhbnRU
ZXh0ID0gdGhpcy5fdGV4dC5zdWJzdHJpbmcodGhpcy5faW5kZXgpOworICAgICAgICAgICAgaWYg
KC9eXHMrLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRl
eCArPSBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgvXlwvXCovLnRlc3QocmVsZXZhbnRUZXh0
KSkgeworICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHJlbGV2YW50VGV4dC5zZWFyY2go
L1wqXC8vKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCAwKQorICAgICAgICAgICAg
ICAgICAgICB0aGlzLmZhaWwoIlVudGVybWluYXRlZCBjb21tZW50Iik7CisgICAgICAgICAgICAg
ICAgdGhpcy5faW5kZXggKz0gZW5kSW5kZXg7CisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wvLiovLnRlc3QocmVsZXZhbnRUZXh0
KSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gubGVu
Z3RoOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FOiBNYWtlIHRo
aXMgZG8gVW5pY29kZS4KKyAgICAgICAgaWYgKC9eW15cZFxXXVx3Ki8udGVzdChyZWxldmFudFRl
eHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiaWRlbnRpZmllciIpOworCisgICAgICAg
IGlmICgvXlswLTldKy8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJl
c3VsdCgiaW50ZWdlckxpdGVyYWwiKTsKKworICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlzIGhh
bmRsZSBleHAtZm9ybSBsaXRlcmFscyBsaWtlIDFlMS4KKyAgICAgICAgaWYgKC9eKFswLTldKlwu
WzAtOV0rKXwoWzAtOV0rXC5bMC05XSopLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAg
ICByZXR1cm4gcmVzdWx0KCJmbG9hdExpdGVyYWwiKTsKKyAgICAgICAgCisgICAgICAgIGlmICgv
XihzdHJ1Y3R8cHJvdG9jb2x8dHlwZXxpZnxlbHNlfGVudW18Y29udGludWV8YnJlYWt8c3dpdGNo
fGNhc2V8ZGVmYXVsdHxmb3J8d2hpbGV8ZG98cmV0dXJufHNpemVvZnxjb25zdGFudHxkZXZpY2V8
dGhyZWFkZ3JvdXB8dGhyZWFkfG9wZXJhdG9yKS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAg
ICAgICAgcmV0dXJuIHJlc3VsdCgia2V5d29yZCIpOworICAgICAgICAKKyAgICAgICAgaWYgKC9e
KFt7fSgpXFtcXT86PSsqXC8sLiUhfl4mfDw+XFwtXXwtPnw9Pnw8PXw9PXwhPXwrPXwtPXxcKj18
XC89fCU9fF49fFx8PXwmPSkvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVy
biByZXN1bHQoInB1bmN0dWF0aW9uIik7CisgICAgICAgIAorICAgICAgICBmYWlsKCJVbnJlY29n
bml6ZWQgdG9rZW4gYmVnaW5uaW5nIHdpdGg6ICIgKyByZWxldmFudFRleHQuc3Vic3RyaW5nKDAs
IDEwKSk7CisgICAgfQorICAgIAorICAgIGZhaWwoZXJyb3IpCisgICAgeworICAgICAgICB0aHJv
dyBuZXcgQUxTeW50YXhFcnJvcih0aGlzLmxpbmVOdW1iZXIsIGVycm9yKTsKKyAgICB9CisgICAg
CisgICAgYmFja3RyYWNraW5nU2NvcGUoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgc3Rh
dGUgPSB0aGlzLnN0YXRlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxi
YWNrKCk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNl
b2YgQUxTeW50YXhFcnJvcikgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsK
KyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IHRocm93IGU7CisgICAgICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9M
ZXhlclRva2VuLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4u
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIExleGVyVG9rZW4geworICAg
IGNvbnN0cnVjdG9yKGxleGVyLCBpbmRleCwga2luZCwgdGV4dCkKKyAgICB7CisgICAgICAgIHRo
aXMuX2xleGVyID0gbGV4ZXI7CisgICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7CisgICAgICAg
IHRoaXMuX2tpbmQgPSBraW5kOworICAgICAgICB0aGlzLl90ZXh0ID0gdGV4dDsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IGtpbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2tpbmQ7Cisg
ICAgfQorICAgIAorICAgIGdldCB0ZXh0KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90
ZXh0OworICAgIH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5fbGV4ZXIubGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJMZXhlclRva2Vu
KCIgKyB0aGlzLmtpbmQgKyAiLCAiICsgdGhpcy50ZXh0ICsgIiwgIiArIHRoaXMubGluZU51bWJl
ciArICIpIjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29udGV4dC5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29udGV4dC5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29udGV4dC5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5hbWVDb250ZXh0IHsKKyAgICBjb25zdHJ1
Y3RvcihkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGVzID0gbmV3IE1hcCgpOwor
ICAgICAgICB0aGlzLl92YWx1ZXMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3Byb3RvY29s
cyA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fZnVuY3Rpb25zID0gbmV3IE1hcCgpOworICAg
ICAgICB0aGlzLl9kZWxlZ2F0ZSA9IG51bGw7CisgICAgfQorICAgIAorICAgIG1hcEZvcihraW5k
KQorICAgIHsKKyAgICAgICAgaWYgKGtpbmQgPT0gVmFsdWUpCisgICAgICAgICAgICByZXR1cm4g
dGhpcy5fdmFsdWVzOworICAgICAgICBpZiAoa2luZCA9PSBUeXBlKQorICAgICAgICAgICAgcmV0
dXJuIHRoaXMuX3R5cGVzOworICAgICAgICBpZiAoa2luZCA9PSBQcm90b2NvbCkKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzLl9wcm90b2NvbHM7CisgICAgICAgIGlmIChraW5kID09IEZ1bmN0aW9u
KQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Z1bmN0aW9uczsKKyAgICAgICAgdGhyb3cgbmV3
IEVycm9yKCJCYWQga2luZDogIiArIGtpbmQpOworICAgIH0KKyAgICAKKyAgICBhZGQodGhpbmcp
CisgICAgeworICAgICAgICBsZXQgbWFwID0gbWFwRm9yKHRoaW5nLmtpbmQpOworICAgICAgICBp
ZiAobWFwLmhhcyh0aGluZy5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJv
cih0aGluZy5vcmlnaW4ubGluZU51bWJlciwgIkR1cGxpY2F0ZSBuYW1lOiAiICsgdGhpbmcubmFt
ZSk7CisgICAgICAgIG1hcC5zZXQodGhpbmcubmFtZSwgdGhpbmcpOworICAgIH0KKyAgICAKKyAg
ICBnZXQoa2luZCwgbmFtZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBtYXBGb3Ioa2lu
ZCkuZ2V0KG5hbWUpOworICAgICAgICBpZiAoIXJlc3VsdCAmJiB0aGlzLmRlbGVnYXRlKQorICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0KGtpbmQsIG5hbWUpOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKQorICAg
IHsKKyAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcykKKyAgICAgICAgICAgIHlp
ZWxkIHR5cGU7CisgICAgICAgIGZvciAobGV0IHZhbHVlIG9mIHRoaXMuX3ZhbHVlcykKKyAgICAg
ICAgICAgIHlpZWxkIHZhbHVlOworICAgICAgICBmb3IgKGxldCBwcm90b2NvbCBvZiB0aGlzLl9w
cm90b2NvbHMpCisgICAgICAgICAgICB5aWVsZCBwcm90b2NvbDsKKyAgICAgICAgZm9yIChsZXQg
cGh1bmN0aW9uIG9mIHRoaXMuX2Z1bmN0aW9ucykKKyAgICAgICAgICAgIHlpZWxkIHBodW5jdGlv
bjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGlzUHJpbWl0aXZlLCB0eXBlUGFyYW1ldGVycykKKyAgICB7
CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5h
bWU7CisgICAgICAgIHRoaXMuX2lzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7CisgICAgICAgIHRo
aXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgfQorICAgIAorICAgIGdl
dCBvcmlnaW4oKSB7IHJldHVuciB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0
dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLl9p
c1ByaW1pdGl2ZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5
cGVQYXJhbWV0ZXJzOyB9CisgICAgCisgICAgaW5zdGFudGlhdGUob3JpZ2luLCB0eXBlQXJndW1l
bnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlw
ZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9y
aWdpbi5saW5lTnVtYmVyLCAiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3Rh
bnRpYXRpb24iKTsKKyAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzOworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5cGVJbnN0YW5jZSh0
aGlzLCBvcmlnaW4sIHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygp
CisgICAgeworICAgICAgICByZXR1cm4gIm5hdGl2ZSAiICsgKHRoaXMuaXNQcmltaXRpdmUgPyAi
cHJpbWl0aXZlICIgOiAiIikgKyAidHlwZSAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBl
UGFyYW1ldGVycyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05h
dGl2ZVR5cGVJbnN0YW5jZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRp
dmVUeXBlSW5zdGFuY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0
aXZlVHlwZUluc3RhbmNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgTmF0aXZlVHlwZUluc3RhbmNlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Io
dHlwZSwgb3JpZ2luLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fdHlwZSA9
IHR5cGU7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdHlw
ZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAorICAgIGdldCB0eXBlKCkg
eyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9v
cmlnaW47IH0KKyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1
bWVudHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy50eXBlICsgIjwiICsgdGhpcy50eXBlQXJndW1lbnRzICsgIj4iOworICAgIH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9Ob2RlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOb2RlIHsKKyAgICB2
aXNpdCh2aXNpdG9yKQorICAgIHsKKyAgICAgICAgbGV0IHJldHVyblZhbHVlID0gdmlzaXRvclsi
dmlzaXQiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXSh0aGlzKTsKKyAgICAgICAgaWYgKCJyZXR1
cm5WYWx1ZSIgaW4gdmlzaXRvcikKKyAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnJldHVyblZh
bHVlOworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorICAgIAorICAgIHVuaWZ5
KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBsZXQgdW5pZnlUaGlz
ID0gdGhpcy51bmlmeU5vZGU7CisgICAgICAgIGxldCB1bmlmeU90aGVyID0gb3RoZXIudW5pZnlO
b2RlOworICAgICAgICBpZiAodW5pZnlPdGhlci50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlv
bkNvbnRleHQsIHVuaWZ5VGhpcykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
cmV0dXJuIHVuaWZ5VGhpcy51bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCB1bmlmeU90aGVy
KTsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIp
CisgICAgeworICAgICAgICBpZiAob3RoZXIudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCB0aGlzKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4g
dGhpcyA9PSBvdGhlcjsKKyAgICB9CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IHVuaWZ5Tm9kZSgpIHsgcmV0dXJuIHRoaXM7IH0KK30KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1BhcnNlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9QYXJzZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2VyLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcGFyc2UodGV4
dCkKK3sKKyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIodGV4dCk7CisgICAgCisgICAgLy8gVGhl
IGhhcmRlc3QgcGFydCBvZiBkZWFsaW5nIHdpdGggQy1saWtlIGxhbmd1YWdlcyBpcyBwYXJzaW5n
IHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudHMuCisgICAgLy8gTGV0J3MgY29uc2lkZXIg
aWYgdGhpcyBoYXBwZW5zIGluIEFycmF5TGFuZy4gSGVyZSBhcmUgdGhlIHZhbGlkIHN0YXRlbWVu
dHMgaW4gQXJyYXlMYW5nIHRoYXQKKyAgICAvLyBiZWdpbiB3aXRoIGFuIGlkZW50aWZpZXIsIGlm
IHdlIGFzc3VtZSB0aGF0IGFueSBleHByZXNzaW9uIGNhbiBiZSBhIHN0YW5kYWxvbmUgc3RhdGVt
ZW50LgorICAgIC8vCisgICAgLy8gICAgIHg7CisgICAgLy8gICAgIHggPGJpbm9wPiB5OworICAg
IC8vICAgICB4IDwgeTsKKyAgICAvLyAgICAgeCA8IHkgPiB6OworICAgIC8vICAgICB4ID0geTsK
KyAgICAvLyAgICAgeC5mID0geTsKKyAgICAvLyAgICAgXGV4cCA9IHk7CisgICAgLy8gICAgIHhb
NDJdID0geTsKKyAgICAvLyAgICAgeCgpOworICAgIC8vICAgICB4PHk+KCk7CisgICAgLy8gICAg
IHggeTsKKyAgICAvLyAgICAgeDx5PiB6OworICAgIC8vICAgICB4W10geTsKKyAgICAvLyAgICAg
eFs0Ml0geTsKKyAgICAvLyAgICAgeF4geTsKKyAgICAvLworICAgIC8vIFRoaXMgaGFzIHR3byBw
cm9ibGVtIGFyZWFzOgorICAgIC8vCisgICAgLy8gICAgIC0geDx5PnogY2FuIHBhcnNlIHR3byBk
aWZmZXJlbnQgd2F5cyAoYXMgKHggPCB5KSA+IHogb3IgeDx5PiB6KS4KKyAgICAvLyAgICAgLSB4
WzQyXSBjb3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNs
YXJhdGlvbi4KKyAgICAvLyAgICAgLSB4PHk+IGNvdWxkIGJlY29tZSBlaXRoZXIgYW4gYXNzaWdu
bWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vCisgICAgLy8gV2Ugc29sdmUg
dGhlIGZpcnN0IHByb2JsZW0gYnkgZm9yYmlkZGluZyBleHByZXNzaW9ucyBhcyBzdGF0ZW1lbnRz
LiBUaGUgbGFjayBvZiBmdW5jdGlvbgorICAgIC8vIHBvaW50ZXJzIG1lYW5zIHRoYXQgd2UgY2Fu
IHN0aWxsIGFsbG93IGZ1bmN0aW9uIGNhbGwgc3RhdGVtZW50cyAtIHVubGlrZSBpbiBDLCB0aG9z
ZSBjYW5ub3QKKyAgICAvLyBoYXZlIGFyYml0cmFyeSBleHByZXNzaW9ucyBhcyB0aGUgY2FsbGVl
LiBUaGUgcmVtYWluaW5nIHR3byBwcm9ibGVtcyBhcmUgc29sdmVkIGJ5CisgICAgLy8gYmFja3Ry
YWNraW5nLiBJbiBhbGwgb3RoZXIgcmVzcGVjdHMsIHRoaXMgaXMgYSBzaW1wbGUgcmVjdXJzaXZl
IGRlc2NlbnQgcGFyc2VyLgorICAgIAorICAgIGZ1bmN0aW9uIG5ld05vZGUobm9kZSwgZGF0YSkK
KyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG5vZGUsIGRhdGEpOworICAgIH0K
KyAgICAKKyAgICAKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9y
KCkKKyAgICB7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50cyA9IFtdOworICAgICAg
ICB0aGlzLl9mdW5jdGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVzID0gbmV3
IE1hcCgpOworICAgIH0KKyAgICAKKyAgICBnZXQgdG9wTGV2ZWxTdGF0ZW1lbnRzKCkgeyByZXR1
cm4gdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzOyB9CisgICAgZ2V0IGZ1bmN0aW9ucygpIHsgcmV0
dXJuIHRoaXMuX2Z1bmN0aW9uczsgfQorICAgIGdldCB0eXBlcygpIHsgcmV0dXJuIHRoaXMuX3R5
cGVzOyB9CisgICAgCisgICAgYWRkVG9wTGV2ZWxTdGF0ZW1lbnQoc3RhdGVtZW50KQorICAgIHsK
KyAgICAgICAgc3RhdGVtZW50LnByb2dyYW0gPSB0aGlzOworICAgICAgICBpZiAoc3RhdGVtZW50
IGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IHRoaXMuX2Z1
bmN0aW9ucy5nZXQoc3RhdGVtZW50Lm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAg
ICAgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbnMuc2V0KHN0YXRlbWVudC5uYW1lLCBhcnJheSA9
IFtdKTsKKyAgICAgICAgICAgIGFycmF5LnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfSBlbHNl
IGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAgdGhpcy5fdHlwZXMu
c2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICB0aHJvdyBuZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlvbiBvciB0eXBlOiAi
ICsgc3RhdGVtZW50KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzLnB1c2goc3Rh
dGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVzb2x2ZUZ1bmN0aW9uT3ZlcmxvYWQobmFtZSwg
dHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcykKKyAgICB7CisgICAgICAgIGxldCBmdW5jdGlv
bnMgPSB0aGlzLmZ1bmN0aW9ucy5nZXQobmFtZSk7CisgICAgICAgIGlmICghZnVuY3Rpb25zKQor
ICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBwaHVu
Y3Rpb24gb2YgZnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5n
dGggJiYgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gcGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxl
bmd0aCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVu
dFR5cGVzLmxlbmd0aCAhPSBwaHVuY3Rpb24ucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3
IFVuaWZpY2F0aW9uQ29udGV4dCgpOworICAgICAgICAgICAgbGV0IG9rID0gdHJ1ZTsKKyAgICAg
ICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewor
ICAgICAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07CisgICAgICAg
ICAgICAgICAgbGV0IHBhcmFtZXRlciA9IHBodW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXTsKKyAg
ICAgICAgICAgICAgICBpZiAoKGFyZ3VtZW50IGluc3RhbmNlb2YgVHlwZSkgIT0gKHBhcmFtZXRl
ciBpbnN0YW5jZW9mIFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7Cisg
ICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICBpZiAoIWFyZ3VtZW50LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgcGFyYW1ldGVyKSkg
eworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
IW9rKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChsZXQgaSA9
IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYg
KCFhcmd1bWVudFR5cGVzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgcGh1bmN0aW9uLnBh
cmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeShwaHVuY3Rpb24udHlwZVBhcmFt
ZXRlcnMpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0IHNob3Vs
ZEJ1aWxkVHlwZUFyZ3VtZW50cyA9ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgICAg
IGlmIChzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICAgICAgdHlwZUFyZ3Vt
ZW50cyA9IFtdOworICAgICAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBwaHVuY3Rp
b24udHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0g
dW5pZmljYXRpb25Db250ZXh0LmZpbmQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAg
aWYgKHR5cGVBcmd1bWVudCA9PSB0eXBlUGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgICAg
IG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQnVpbGRUeXBlQXJndW1lbnRzKQorICAgICAg
ICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnB1c2godHlwZUFyZ3VtZW50KTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgICAgICByZXR1cm4ge3BodW5jdGlvbiwgdW5pZmljYXRpb25Db250ZXh0fTsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIGdl
dCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE5hbWVDb250
ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiB0aGlzLnRvcExldmVsU3RhdGVt
ZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2wgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmln
aW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBnZXQgb3Jp
Z2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0
aGlzLl9uYW1lOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBQcm90b2NvbDsgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQor
fQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xEZWNsIGV4dGVuZHMgUHJvdG9jb2wgeworICAgIGNv
bnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbmFt
ZSkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdOworICAgICAgICB0aGlzLl9zaWduYXR1
cmVNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVWYXJpYWJsZSA9IG5ldyBUeXBl
VmFyaWFibGUob3JpZ2luLCBuYW1lLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgYWRkU2lnbmF0
dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAgICAgIC8vIE5PVEU6IEFueSB0eXBlIHBhcmFtZXRl
cnMgZm91bmQgaW4gdGhlIHNpZ25hdHVyZSBtdXN0IGJlIGluZmVyYWJsZSBmcm9tIHRoZSB2YWx1
ZQorICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAgICAgICAvLyBGSVhNRTogQ2hlY2sgdGhpcyEg
KE9PUFMhKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlKTsKKyAgICAg
ICAgbGV0IG92ZXJsb2FkcyA9IHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQoc2lnbmF0dXJlLm5hbWUp
OworICAgICAgICBpZiAoIW92ZXJsb2FkcykKKyAgICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZU1h
cC5zZXQoc2lnbmF0dXJlLm5hbWUsIG92ZXJsb2FkcyA9IFtdKTsKKyAgICAgICAgb3ZlcmxvYWRz
LnB1c2goc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHNpZ25hdHVyZXMoKSB7IHJl
dHVybiB0aGlzLl9zaWduYXR1cmVzOyB9CisgICAgc2lnbmF0dXJlc0J5TmFtZShuYW1lKSB7IHJl
dHVybiB0aGlzLl9zaWduYXR1cmVNYXAuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IHR5cGVWYXJpYWJs
ZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGVWYXJpYWJsZTsgfQorICAgIAorICAgIGluaGVyaXRzKG90
aGVyUHJvdG9jb2wpCisgICAgeworICAgICAgICBpZiAoIW90aGVyUHJvdG9jb2wpCisgICAgICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChvdGhlclByb3RvY29sIGlu
c3RhbmNlb2YgUHJvdG9jb2xSZWYpCisgICAgICAgICAgICBvdGhlclByb3RvY29sID0gb3RoZXJQ
cm90b2NvbC5wcm90b2NvbERlY2w7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBvdGhlclNp
Z25hdHVyZSA6IG90aGVyUHJvdG9jb2wuc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNp
Z25hdHVyZXMgPSB0aGlzLnNpZ25hdHVyZXNCeU5hbWUob3RoZXJTaWduYXR1cmUubmFtZSk7Cisg
ICAgICAgICAgICBpZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGxldCBz
aWduYXR1cmUgOiBzaWduYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS5w
YXJhbWV0ZXJzLmxlbmd0aCAhPSBvdGhlclNpZ25hdHVyZS5wYXJhbWV0ZXJzLmxlbmd0aCkKKyAg
ICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAg
ICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQoKTsK
KyAgICAgICAgICAgICAgICBsZXQgb2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAobGV0
IGkgPSAwOyBpIDwgc2lnbmF0dXJlLnBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAg
ICAgICAgICAgICAgaWYgKCFzaWduYXR1cmUucGFyYW1ldGVyc1tpXS50eXBlLnVuaWZ5KG90aGVy
U2lnbmF0dXJlLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAg
IG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW9rKQor
ICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZmlj
YXRpb25Db250ZXh0LnZlcmlmeShvdGhlclNpZ25hdHVyZS50eXBlUGFyYW1ldGVycy5jb25jYXQo
b3RoZXJQcm90b2NvbC50eXBlVmFyaWFibGUpKSkgeworICAgICAgICAgICAgICAgICAgICBmb3Vu
ZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAg
ICAKKyAgICBoYXNIZWlyKHR5cGUpCisgICAgeworICAgICAgICBsZXQgbWFwID0gbmV3IE1hcCgp
OworICAgICAgICBtYXAuc2V0KHRoaXMuX3R5cGVWYXJpYWJsZSwgdHlwZSk7CisgICAgICAgIGxl
dCBzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3RpdHV0aW9uKG1hcCk7CisgICAgICAgIGZvciAobGV0
IGFic3RyYWN0U2lnbmF0dXJlIG9mIHRoaXMuX3NpZ25hdHVyZXMpIHsKKyAgICAgICAgICAgIGxl
dCBzaWduYXR1cmUgPSBzaWduYXR1cmUudmlzaXQoc3Vic3RpdHV0aW9uKTsKKyAgICAgICAgICAg
IGxldCBvdmVybG9hZCA9IHRoaXMucHJvZ3JhbS5yZXNvbHZlRnVuY3Rpb25PdmVybG9hZChzaWdu
YXR1cmUubmFtZSwgW10sIHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcyk7CisgICAgICAgICAgICBp
ZiAoIW92ZXJsb2FkKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
IGlmICghb3ZlcmxvYWQucGh1bmN0aW9uLnJldHVyblR5cGUudW5pZnkob3ZlcmxvYWQudW5pZmlj
YXRpb25Db250ZXh0LCBzaWduYXR1cmUucmV0dXJuVHlwZSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInByb3RvY29sICIgKyB0aGlz
Lm5hbWUgKyAiIHsgIiArIHRoaXMuc2lnbmF0dXJlcy5qb2luKCI7ICIpICsgIjsgfSI7CisgICAg
fQorfQorCisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xSZWYgZXh0ZW5kcyBQcm90b2NvbCB7CisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luLCBu
YW1lKTsKKyAgICAgICAgdGhpcy5wcm90b2NvbERlY2wgPSBudWxsOworICAgIH0KKyAgICAKKyAg
ICBpbmhlcml0cyhvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVj
bC5pbmhlcml0cyhvdGhlcik7CisgICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVjbC5oYXNIZWlyKHR5cGUpOworICAgIH0K
K30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9QdHJUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgUHRyVHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5
cGUgKyAiXiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VU
eXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJlZmVyZW5jZVR5cGUgZXh0
ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFkZHJlc3NTcGFjZSwgZWxlbWVu
dFR5cGUpCisgICAgeworICAgICAgICB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2Up
OworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2FkZHJlc3NT
cGFjZSA9IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50
VHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBhZGRyZXNzU3BhY2UoKSB7IHJldHVybiB0aGlzLl9hZGRyZXNzU3BhY2U7
IH0KKyAgICBnZXQgZWxlbWVudFR5cGUoKSB7IHJldHVybiB0aGlzLl9lbGVtZW50VHlwZTsgfQor
ICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAgdW5pZnlJ
bXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAodGhpcy5j
b25zdHJ1Y3RvciAhPSBvdGhlci5jb25zdHJ1Y3RvcikKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlci5lbGVtZW50VHlwZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9SZXdyaXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRl
ci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJld3JpdGVyIHsKKyAgICB2
aXNpdEZ1bmN0aW9uKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKAor
ICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyksCisgICAg
ICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFybWV0ZXIgPT4gdHlwZVBhcmFt
ZXRlci52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFt
ZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRG
dW5jdGlvblBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlv
bkFyZ3VtZW50KG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7
CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIG5ldyBUeXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3VtZW50
cy5tYXAodHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSkpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IG5vZGU7CisgICAgfQorICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2Rl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUu
b3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0RmllbGQobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGQobm9k
ZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3
IG5vZGUuY29uc3RydWN0b3Iobm9kZS5yb2dpaW4sIG5vZGUuYWRkcmVzc1NwYWNlLCBub2RlLmVs
ZW1lbnRUeXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJUeXBlKG5v
ZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy52aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7
CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy52aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAg
IHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlw
ZShub2RlLm9yaWdpbiwgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAg
IAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2Rl
OworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBTdHJ1Y3RUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHRo
aXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX2Zp
ZWxkcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgYWRkRmllbGQoZmllbGQpCisgICAg
eworICAgICAgICBpZiAodGhpcy5fZmllbGRzLmhhcyhmaWVsZC5uYW1lKSkKKyAgICAgICAgICAg
IHRocm93IG5ldyBBTFR5cGVFcnJvcihmaWVsZC5vcmlnaW4ubGluZU51bWJlciwgIkR1cGxpY2F0
ZSBmaWVsZCBuYW1lOiAiICsgZmllbGQubmFtZSk7CisgICAgICAgIHRoaXMuX2ZpZWxkcy5zZXQo
ZmllbGQubmFtZSwgZmllbGQpOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJu
IHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90
eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAgIGdldCBmaWVsZE5hbWVzKCkgeyByZXR1cm4gdGhp
cy5fZmllbGRzLmtleXMoKTsgfQorICAgIGZpZWxkQnlOYW1lKG5hbWUpIHsgcmV0dXJuIHRoaXMu
X2ZpZWxkcy5nZXQobmFtZSk7IH0KKyAgICBnZXQgZmllbGRzKCkgeyByZXR1cm4gdGhpcy5fZmll
bGRzLnZhbHVlcygpOyB9CisgICAgZ2V0IGZpZWxkTWFwKCkgeyByZXR1cm4gdGhpcy5fZmllbGRz
OyB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1
bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBv
ZiB0aGlzLnR5cGVQYXJhbWV0ZXJzKQorICAgIH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZShvcmln
aW4sIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5n
dGggIT0gdGhpcy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcg
QUxUeXBlRXJyb3Iob3JpZ2luLmxpbmVOdW1iZXIsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1
bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWVDb250
ZXh0ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIAorICAgICAgICBsZXQgbWFwID0gbmV3
IE1hcCgpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3Ro
OyArK2kpCisgICAgICAgICAgICBtYXAuc2V0KHRoaXMudHlwZVBhcmFtZXRlcnNbaV0sIHR5cGVB
cmd1bWVudHNbaV0pOworICAgICAgICAKKyAgICAgICAgY2xhc3MgU3Vic3RpdHV0ZSBleHRlbmRz
IFJld3JpdGVyIHsKKyAgICAgICAgICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJzdHJ1Y3QgIiAr
IHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPiB7ICIgKyBBcnJheS5m
cm9tKHRoaXMuZmllbGRzKS5qb2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9TdWJzdGl0dXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBTdWJzdGl0dXRpb24gZXh0ZW5kcyBSZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IobWFw
KQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbWFwOworICAgIH0KKyAgICAKKyAgICB2aXNp
dFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHRoaXMuX21h
cC5nZXQobm9kZS50eXBlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7CisgICAgICAgICAg
ICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBu
ZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBhcmd1bWVudHMgb24gdHlwZSB2YXJpYWJsZSIpOwor
ICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICB9CisgICAgICAgIAorICAg
ICAgICByZXR1cm4gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgIH0KKworICAgIHZpc2l0
VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHRoaXMu
X21hcC5nZXQobm9kZS52YXJpYWJsZSk7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCkKKyAgICAg
ICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzdXBl
ci52aXNpdFZhcmlhYmxlUmVmKG5vZGUpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlIGV4dGVuZHMgTm9kZSB7CisgICAgZ2V0
IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gW107IH0KKyAgICBnZXQga2luZCgpIHsgcmV0dXJu
IFR5cGU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBwcm90b2NvbC5oYXNIZWlyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICBpbnN0YW50aWF0
ZWRUeXBlKG5hbWVDb250ZXh0KSB7IHJldHVybiB0aGlzOyB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlw
ZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVJlZiBleHRlbmRz
IFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZUFyZ3VtZW50cykKKyAg
ICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9
IG5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IG51bGw7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1
bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgIH0KKyAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1
cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9
CisgICAgZ2V0IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9
CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICAvLyBV
c2UgdGhpcyB0byBleHBsb3JlIHByb3BlcnRpZXMgb2YgdGhlIGluc3RhbnRpYXRlZCB0eXBlLCBi
dXQgdHJ5IG5vdCB0byBrZWVwIGl0IGFyb3VuZC4KKyAgICBpbnN0YW50aWF0ZWRUeXBlKG5hbWVD
b250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5pbnN0YW50aWF0ZSh0eXBl
QXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHVuaWZ5Tm9kZSgpCisgICAgeworICAg
ICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4g
dGhpcy50eXBlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgdW5pZnlJ
bXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhl
ciBpbnN0YW5jZW9mIFR5cGVSZWYpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBpZiAoIXRoaXMudHlwZS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGUpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodGhpcy50eXBlQXJndW1lbnRz
Lmxlbmd0aCAhPSBvdGhlci50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnR5cGVBcmd1bWVudHMu
bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzW2ldLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZUFyZ3VtZW50c1tpXSkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5u
YW1lICsgIjwiICsgdGhpcy50eXBlQXJndW1lbnRzICsgIj4iOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9UeXBlVmFyaWFibGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBUeXBlVmFyaWFibGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rvcihvcmln
aW4sIG5hbWUsIHByb3RvY29sKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2lu
OworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fcHJvdG9jb2wgPSBw
cm90b2NvbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1l
OyB9CisgICAgZ2V0IHByb3RvY29sKCkgeyByZXR1cm4gdGhpcy5fcHJvdG9jb2w7IH0KKyAgICAK
KyAgICBnZXQgaXNQcmltaXRpdmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3Rv
Y29sICYmIHRoaXMuX3Byb3RvY29sLmlzUHJpbWl0aXZlOworICAgIH0KKyAgICAKKyAgICBpbmhl
cml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghcHJvdG9jb2wpCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhwcm90
b2NvbCk7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNv
bnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAg
ICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7Cisg
ICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIpOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0
aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlVmFyaWFi
bGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICB9CisgICAgCisgICAgdmVy
aWZ5QXNBcmd1bWVudCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICBsZXQgcmVh
bFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgCisgICAgICAg
IC8vIFRoZSB0aGluZyB3ZSBnZXQgdW5pZmllZCB3aXRoIG11c3QgYmUgYSB0eXBlIHZhcmlhYmxl
IHRoYXQgYWNjZXB0cyBhIGJyb2FkZXIgc2V0IG9mCisgICAgICAgIC8vIHRoaW5ncyB0aGFuIHdl
IGRvLgorICAgICAgICBpZiAoIShyZWFsVGhpcyBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlmICghdGhpcy5wcm90
b2NvbCkKKyAgICAgICAgICAgIHJldHVybiAhcmVhbFRoaXMucHJvdG9jb2w7CisgICAgICAgIAor
ICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhyZWFsVGhpcy5wcm90b2NvbCk7
CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4dCkK
KyAgICB7CisgICAgICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICByZXR1cm4gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcykuaW5oZXJp
dHModGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvVW5pZmljYXRpb25Db250ZXh0LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDkyIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIFVuaWZpY2F0aW9uQ29udGV4dCB7CisgICAgc3RhdGljIGhhc0FjY2VwdGFi
bGVUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIFR5cGVW
YXJpYWJsZQorICAgICAgICAgICAgfHwgbm9kZSBpbnN0YW5jZW9mIENvbnN0ZXhwclR5cGVQYXJh
bWV0ZXI7CisgICAgfQorICAgIAorICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRo
aXMuX25leHRNYXAgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIHVuaW9uKGEsIGIpCisg
ICAgeworICAgICAgICBhID0gZmluZChhKTsKKyAgICAgICAgYiA9IGZpbmQoYik7CisgICAgICAg
IGlmICghaGFzQWNjZXB0YWJsZVR5cGUoYikpCisgICAgICAgICAgICBbYSwgYl0gPSBbYiwgYV07
CisgICAgICAgIGlmICghaGFzQWNjZXB0YWJsZVR5cGUoYSkpCisgICAgICAgICAgICB0aHJvdyBu
ZXcgRXJyb3IoIkNhbm5vdCB1bmlmeSBub24tdW5pZmlhYmxlIHRoaW5ncyAiICsgYSArICIgYW5k
ICIgKyBiKTsKKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQoYSwgYik7CisgICAgfQorICAgIAor
ICAgIGZpbmQobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7Cisg
ICAgICAgIGxldCBuZXh0Tm9kZSA9IHRoaXMuX25leHRNYXAuZ2V0KGN1cnJlbnROb2RlKTsKKyAg
ICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAg
ICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0Tm9kZTsKKyAg
ICAgICAgICAgIG5leHROb2RlID0gdGhpcy5fbmV4dE1hcC5nZXQoY3VycmVudE5vZGUpOworICAg
ICAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
fQorICAgICAgICB0aGlzLl9uZXh0TWFwLnNldChub2RlLCBjdXJyZW50Tm9kZSk7CisgICAgICAg
IHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5vZGVzKCkKKyAgICB7
CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7CisgICAgICAgIGZvciAobGV0IFtrZXks
IHZhbHVlXSBvZiB0aGlzLl9uZXh0TWFwKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGtleSk7
CisgICAgICAgICAgICByZXN1bHQuYWRkKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2ZXJpZnkodHlwZVBhcmFtZXRlcnMpCisgICAg
eworICAgICAgICB0eXBlUGFyYW1ldGVycyA9IG5ldyBTZXQodHlwZVBhcmFtZXRlcnMpOworICAg
ICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAg
ICAgICBpZiAoIXR5cGVQYXJhbWV0ZXIudmVyaWZ5QXNQYXJhbWV0ZXIodGhpcykpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAobGV0IHR5cGVB
cmd1bWVudCBvZiB0aGlzLm5vZGVzKSB7CisgICAgICAgICAgICBpZiAodHlwZVBhcmFtZXRlcnMu
aGFzKHR5cGVBcmd1bWVudCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICBpZiAoIXR5cGVBcmd1bWVudC52ZXJpZnlBc0FyZ3VtZW50KHRoaXMpKQorICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1ZhbHVlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
VmFsdWUgZXh0ZW5kcyBOb2RlIHsKKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIFZhbHVlOyB9Cisg
ICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gZmFsc2U7IH0KK30KKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvVmFyaWFibGVSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvVmFyaWFibGVSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmFy
aWFibGVSZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBW
YXJpYWJsZVJlZiBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
bmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbnVsbCk7CisgICAgICAgIHRoaXMu
X25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhcmlhYmxlID0gbnVsbDsKKyAgICB9CisgICAg
CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGlzQ29uc3Rl
eHByKCkgeyByZXR1cm4gdGhpcy52YXJpYWJsZS5pc0NvbnN0ZXhwcjsgfQorICAgIGdldCB1bmlm
eU5vZGUoKSB7IHJldHVybiB0aGlzLnZhcmlhYmxlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9WaXNpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zp
c2l0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWaXNpdG9yIHsKKyAg
ICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBv
ZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0
aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvbihub2RlKQorICAgIHsKKyAgICAg
ICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFy
YW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVy
LnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0
ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdEZ1bmN0aW9uUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUu
dmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkKKyAg
ICB7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAg
ICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAgICAg
c2lnbmF0dXJlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9k
ZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1
bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc2l0TmF0aXZlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlw
ZVBhcmFtdGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1l
dGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkK
KyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1l
dGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIGZv
ciAobGV0IGZpZWxkIG9mIG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQodGhp
cyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAgeworICAg
IH0KKyAgICAKKyAgICB2aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7Cisg
ICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGaWVs
ZChub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEVsZW1lbnRhbFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUuZWxl
bWVudFR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHRyVHlwZShub2Rl
KQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgfQor
ICAgIAorICAgIHZpc2l0QXJyYXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZp
c2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVR5cGUo
bm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAg
ICAgICBub2RlLm51bUVsZW1lbnRzLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgIH0KK30KKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319100</attachid>
            <date>2017-08-25 14:14:38 -0700</date>
            <delta_ts>2017-08-25 16:44:51 -0700</delta_ts>
            <desc>steadily adding expressions</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>109310</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihsaW5lTnVtYmVyLCBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgc3VwZXIoIlN5bnRh
eCBlcnJvciBhdCBsaW5lIG51bWJlciAiICsgKGxpbmVOdW1iZXIgKyAxKSArICI6ICIgKyBtZXNz
YWdlKTsKKyAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKKyAgICAgICAgdGhp
cy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0FMVHlwZUVycm9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVy
cm9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVycm9yLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQUxUeXBlRXJyb3Ig
ZXh0ZW5kcyBFcnJvciB7CisgICAgY29uc3RydWN0b3IobGluZU51bWJlciwgbWVzc2FnZSkKKyAg
ICB7CisgICAgICAgIHN1cGVyKCJUeXBlIGVycm9yIGF0IGxpbmUgbnVtYmVyICIgKyAobGluZU51
bWJlciArIDEpICsgIjogIiArIG1lc3NhZ2UpOworICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBs
aW5lTnVtYmVyOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1NwYWNlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0FkZHJlc3NTcGFjZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9BZGRyZXNzU3BhY2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7Cisg
ICAgc3dpdGNoIChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2Fz
ZSAiZGV2aWNlIjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoK
KyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigi
QmFkIGFkZHJlc3Mgc3BhY2U6ICIgKyBhZGRyZXNzU3BhY2UpOworICAgIH0KK30KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9BcnJheVJlZlR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvQXJyYXlSZWZUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc1NwYWNlICsgIiAiICsgdGhpcy5l
bGVtZW50VHlwZSArICJbXSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9B
cnJheVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5VHlwZSBleHRlbmRzIFR5
cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgZWxlbWVudFR5cGUsIG51bUVsZW1lbnRzKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9lbGVt
ZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICB0aGlzLl9udW1FbGVtZW50cyA9IG51bUVs
ZW1lbnRzOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5fZWxlbWVudFR5cGU7
IH0KKyAgICBnZXQgbnVtRWxlbWVudHMoKSB7IHJldHVybiB0aGlzLl9udW1FbGVtZW50czsgfQor
ICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuaXNQcmltaXRp
dmU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5l
bGVtZW50VHlwZSArICJbIiArIHRoaXMubnVtRWxlbWVudHMgKyAiXSI7CisgICAgfQorICAgIAor
ICAgIHVuaWZ5SW1wbCh1bmlmaWNhdG9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBp
ZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIAorICAgICAgICBpZiAoIXRoaXMubnVtRWxlbWVudHMudW5pZnkodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlci5udW1FbGVtZW50cykpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9B
c3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
QXNzaWdubWVudCBleHRlbmRzIFZhbHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxocywg
cmhzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlz
Ll9saHMgPSBsaHM7CisgICAgICAgIHRoaXMuX3JocyA9IHJoczsKKyAgICB9CisgICAgCisgICAg
Z2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBsaHMoKSB7IHJl
dHVybiB0aGlzLl9saHM7IH0KKyAgICBnZXQgcmhzKCkgeyByZXR1cm4gdGhpcy5fcmhzOyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsgIiA9
ICIgKyB0aGlzLnJoczsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9CbG9j
ay5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIEJsb2NrIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAg
ICB0aGlzLl9zdGF0ZW1lbnRzID0gW107CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7
IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICBhZGQoc3RhdGVtZW50KQorICAgIHsK
KyAgICAgICAgdGhpcy5fc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAor
ICAgIGdldCBzdGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fc3RhdGVtZW50czsgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAieyAiICsgdGhpcy5zdGF0ZW1l
bnRzLmpvaW4oIjsgIik7ICsgIjsgfSI7CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvQ2hlY2tlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DaGVja2Vy
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2hlY2tlciBleHRlbmRzIFZp
c2l0b3IgeworICAgIC8vIEl0J3MgdG90YWxseSBPSyB0byBpbnN0YW50aWF0ZSB0aGlzIHdpdGgg
emVybyBhcmd1bWVudHMgKGkuZS4gcGFzc2luZyB1bmRlZmluZWQgZm9yIGJvdGggb2YKKyAgICAv
LyB0aGVtKSBpZiB5b3UncmUgY3JlYXRpbmcgYSBDaGVja2VyIHRvIHZpc2l0IGEgUHJvZ3JhbS4K
KyAgICBjb25zdHJ1Y3RvcihuYW1lQ29udGV4dCwgYmxhY2tsaXN0KQorICAgIHsKKyAgICAgICAg
dGhpcy5fbmFtZUNvbnRleHQgPSBuYW1lQ29udGV4dDsKKyAgICAgICAgdGhpcy5fYmxhY2tsaXN0
ID0gYmxhY2tsaXN0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7
CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29u
dGV4dCk7CisgICAgICAgIGxldCBibGFja2xpc3QgPSBuZXcgU2V0KCk7CisgICAgICAgIGZvciAo
bGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykgeworICAgICAgICAgICAg
bmFtZUNvbnRleHQuYWRkKHN0YXRlbWVudCk7CisgICAgICAgICAgICBibGFja2xpc3QuYWRkKHN0
YXRlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihu
YW1lQ29udGV4dCwgYmxhY2tsaXN0KTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5v
ZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKSB7CisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQoY2hl
Y2tlcik7CisgICAgICAgICAgICBibGFja2xpc3QuZGVsZXRlKHN0YXRlbWVudCk7CisgICAgICAg
IH0KKyAgICB9CisgICAgCisgICAgX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250
ZXh0KG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRl
eHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9m
IG5vZGUudHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBl
UGFyYW1ldGVyKTsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWVDb250ZXh0OworICAgIH0KKyAgICAKKyAgICB2aXNp
dEZ1bmN0aW9uKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2Vy
KHRoaXMuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpLCB0aGlz
Ll9ibGFja2xpc3QpOworICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQoY2hlY2tlcik7Cisg
ICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMpCisgICAgICAgICAg
ICBwYXJhbWV0ZXIudmlzaXQoY2hlY2tlcik7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rp
b25EZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJz
ID0gdGhpcy5fdmlzaXRUeXBlUGFyYW1ldGVyc0FuZEJ1aWxkTmFtZUNvbnRleHQobm9kZSk7Cisg
ICAgICAgIGxldCBjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzID0gbmV3IENoZWNrZXIoY29udGV4
dFdpdGhUeXBlUGFyYW1ldGVycywgdGhpcy5fYmxhY2tsaXN0KTsKKyAgICAgICAgbm9kZS5yZXR1
cm5UeXBlLnZpc2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMpOworICAgICAgICBsZXQgY29u
dGV4dFdpdGhQYXJhbWV0ZXJzID0gbmV3IE5hbWVDb250ZXh0KGNvbnRleHRXaXRoVHlwZVBhcmFt
ZXRlcnMpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKSB7
CisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7
CisgICAgICAgICAgICBjb250ZXh0V2l0aFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CisgICAg
ICAgIH0KKyAgICAgICAgbGV0IGNoZWNrZXJXaXRoUGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNv
bnRleHRXaXRoUGFyYW1ldGVycywgdGhpcy5fYmxhY2tsaXN0KTsKKyAgICAgICAgbm9kZS5ib2R5
LnZpc2l0KGNoZWNrZXJXaXRoUGFyYW1ldGVycyk7CisgICAgfQorICAgIAorICAgIHZpc2l0Qmxv
Y2sobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmV3IE5h
bWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KSwgdGhpcy5fYmxhY2tsaXN0KTsKKyAgICAgICAg
Zm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRl
bWVudC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbERlY2wo
bm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBub2RlLnNpZ25hdHVy
ZXMpIHsKKyAgICAgICAgICAgIGxldCBzZXQgPSBuZXcgU2V0KCk7CisgICAgICAgICAgICBmdW5j
dGlvbiBjb25zaWRlcih0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAo
dGhpbmcuaXNVbmlmaWFibGUpCisgICAgICAgICAgICAgICAgICAgIHNldC5hZGQodGhpbmcpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xhc3MgTm90aWNlVHlwZVZhcmlhYmxlIGV4dGVu
ZHMgVmlzaXRvciB7CisgICAgICAgICAgICAgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgICAg
ICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zaWRlcihub2RlLnR5cGUpOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisg
ICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zaWRlcihub2RlLnZhcmlh
YmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXQg
bm90aWNlVHlwZVZhcmlhYmxlID0gbmV3IE5vdGljZVR5cGVWYXJpYWJsZSgpOworICAgICAgICAg
ICAgZm9yIChsZXQgcGFyYW1ldGVyVHlwZSBvZiBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpCisg
ICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZS52aXNpdChub3RpY2VUeXBlVmFyaWFibGUpOwor
ICAgICAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBzaWduYXR1cmUudHlwZVBhcmFt
ZXRlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXNldC5oYXModHlwZVBhcmFtZXRlcikpCisg
ICAgICAgICAgICAgICAgICAgIHRocm93IEFMVHlwZUVycm9yKHR5cGVQYXJhbWV0ZXIub3JpZ2lu
LmxpbmVOdW1iZXIsICJUeXBlIHBhcmFtZXRlciB0byBwcm90b2NvbCBzaWduYXR1cmUgbm90IGlu
ZmVycmFibGUgZnJvbSB2YWx1ZSBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICB9CisgICAgICAg
IH0KKyAgICAgICAgCisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0
aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250ZXh0LmFkZChub2RlLnR5cGVWYXJp
YWJsZSk7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFtZUNvbnRleHQsIHRo
aXMuX2JsYWNrbGlzdCk7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBub2RlLnNpZ25h
dHVyZXMpCisgICAgICAgICAgICBzaWduYXR1cmUudmlzaXQoY2hlY2tlcik7CisgICAgfQorICAg
IAorICAgIHZpc2l0VHlwZURlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0
ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQg
dHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICB0eXBl
UGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRkKHR5cGVQ
YXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIo
bmFtZUNvbnRleHQsIHRoaXMuX2JsYWNrbGlzdCk7CisgICAgICAgIG5vZGUudHlwZS52aXNpdChj
aGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAgewor
ICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRl
eHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRl
cnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgICAg
ICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAgbGV0
IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCwgdGhpcy5fYmxhY2tsaXN0KTsKKyAg
ICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52
aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgdHlwZSA9IHRoaXMuX25hbWVDb250ZXh0LmdldChUeXBlLCBub2RlLm5h
bWUpOworICAgICAgICBpZiAoIXR5cGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJy
b3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIkNvdWxkIG5vdCBmaW5kIHR5cGUgbmFtZWQgIiAr
IG5vZGUubmFtZSk7CisgICAgICAgIGlmICh0aGlzLl9ibGFja2xpc3QuaGFzKHR5cGUpKQorICAg
ICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJJ
bGxlZ2FsIGZvcndhcmQgdXNlIG9mIHR5cGUgbmFtZWQgIiArIG5vZGUubmFtZSk7CisgICAgICAg
IG5vZGUudHlwZSA9IHR5cGU7CisgICAgICAgIAorICAgICAgICBpZiAodHlwZS50eXBlUGFyYW1l
dGVycy5sZW5ndGggIT0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiV3JvbmcgbnVtYmVy
IG9mIHR5cGUgYXJndW1lbnRzIik7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZS50
eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcklz
VHlwZSA9IHR5cGUudHlwZVBhcmFtZXRlcnNbaV0gaW5zdGFuY2VvZiBUeXBlVmFyaWFibGU7Cisg
ICAgICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0gaW5z
dGFuY2VvZiBUeXBlOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcklzVHlwZSAmJiAhYXJndW1l
bnRJc1R5cGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3Jp
Z2luLmxpbmVOdW1iZXIsICJFeHBlY3RlZCB0eXBlLCBidXQgZ290IHZhbHVlIGF0IGFyZ3VtZW50
ICMiICsgaSk7CisgICAgICAgICAgICBpZiAoIXBhcmFtZXRlcklzVHlwZSAmJiBhcmd1bWVudElz
VHlwZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4u
bGluZU51bWJlciwgIkV4cGVjdGVkIHZhbHVlLCBidXQgZ290IHR5cGUgYXQgYXJndW1lbnQgIyIg
KyBpKTsKKyAgICAgICAgICAgIGlmICghYXJndW1lbnRJc1R5cGUpIHsKKyAgICAgICAgICAgICAg
ICBpZiAoIW5vZGUudHlwZUFyZ3VtZW50c1tpXS5pc0NvbnN0RXhwcikKKyAgICAgICAgICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJFeHBl
Y3RlZCBjb25zdGV4cHIgdmFsdWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgICAgICAKKyAgICAgICAg
d2hpbGUgKG5vZGUudHlwZSBpbnN0YW5jZW9mIFR5cGVEZWYpIHsKKyAgICAgICAgICAgIGxldCB1
bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KG5vZGUudHlwZS50eXBl
UGFyYW1ldGVycyk7CisgICAgICAgICAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCAh
PSBub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigiYXJndW1lbnQvcGFyYW1ldGVyIG1pc21hdGNoIChzaG91bGQgaGF2ZSBiZWVu
IGNhdWdodCBlYXJsaWVyKSIpOworICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rl
LnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgbm9kZS50eXBlQXJn
dW1lbnRzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgbm9kZS50eXBlLnR5cGVQYXJhbWV0
ZXJzW2ldKTsKKyAgICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQor
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVt
YmVyLCAiVHlwZSByZWZlcmVuY2UgdG8gYSB0eXBlIGRlZmluaXRpb24gdmlvbGF0ZXMgcHJvdG9j
b2wgY29uc3RyYWludHMiKTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbm9kZS50eXBlID0g
bm9kZS50eXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKG5vZGUudHlwZS50eXBlUGFyYW1ldGVy
cywgdW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNp
dFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUuZWxlbWVudFR5cGUudmlz
aXQobmV3IENoZWNrZXIodGhpcy5fbmFtZUNvbnRleHQsIG5ldyBTZXQoKSkpOworICAgICAgICAK
KyAgICAgICAgaWYgKG5vZGUuYWRkcmVzc1NwYWNlID09ICJ0aHJlYWQiKQorICAgICAgICAgICAg
cmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKCFub2RlLmVsZW1lbnRUeXBlLmluc3RhbnRp
YXRlZFR5cGUodGhpcy5fbmFtZUNvbnRleHQpLmlzUHJpbWl0aXZlKQorICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJJbGxlZ2FsIHBvaW50
ZXIgdG8gbm9uLXByaW1pdGl2ZSB0eXBlIik7CisgICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdu
bWVudChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGxoc1R5cGUgPSBub2RlLmxocy52aXNpdCh0
aGlzKTsKKyAgICAgICAgbGV0IHJoc1R5cGUgPSBub2RlLnJocy52aXNpdCh0aGlzKTsKKyAgICAg
ICAgaWYgKCFsaHNUeXBlLmVxdWFscyhyaHNUeXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBB
TFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiVHlwZSBtaXNtYXRjaCBpbiBhc3Np
Z25tZW50OiAiICsgbGhzVHlwZSArICIgdmVyc3VzICIgKyByaHNUeXBlKTsKKyAgICAgICAgcmV0
dXJuIGxoc1R5cGU7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAg
ICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVmFsdWUsIG5v
ZGUubmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFM
VHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJDb3VsZCBub3QgZmluZCB2YXJpYWJs
ZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHJlc3VsdDsK
KyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQudHlwZTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAgIC8vIEZJWE1FOiBWYWxpZGF0ZSB2b2lk
IHJldHVybi4KKyAgICAgICAgaWYgKG5vZGUudmFsdWUpCisgICAgICAgICAgICBub2RlLnZhbHVl
LnZpc2l0KHRoaXMpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3Rl
eHByVHlwZVBhcmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Db25z
dGV4cHJUeXBlUGFyYW1ldGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3MSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVmFsdWUgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29y
aWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMu
X3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICBnZXQg
aXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyBy
ZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90
aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBs
ZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYg
KHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5p
ZmljYXRpb25Db250ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICBpZiAob3RoZXIgaW5z
dGFuY2VvZiBWYXJpYWJsZVJlZikKKyAgICAgICAgICAgIG90aGVyID0gb3RoZXIudmFyaWFibGU7
CisgICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIp
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVu
dCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisgICAgCisgICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvRXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM2IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIEV4cHJlc3Npb24gZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3Jp
Z2luLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAg
ICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0
dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsg
fQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvRmllbGQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvRmllbGQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBG
aWVsZCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAg
ICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7
IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25h
bWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5u
YW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb24gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3Rv
cihuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycykKKyAgICB7Cisg
ICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9yZXR1cm5UeXBlID0gcmV0
dXJuVHlwZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsK
KyAgICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgfQorICAgIAorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCByZXR1cm5UeXBlKCkg
eyByZXR1cm4gdGhpcy5fcmV0dXJuVHlwZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsg
cmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlcnMoKSB7IHJl
dHVybiB0aGlzLl9wYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlclR5cGVzKCkgeyByZXR1
cm4gdGhpcy5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLnR5cGUpOyB9Cisg
ICAgCisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBGdW5jdGlvbjsgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnJldHVyblR5cGUgKyAiICIgKyB0aGlz
Lm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4oIiArIHRoaXMucGFyYW1ldGVy
cyArICIpIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uRGVm
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uRGVmLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uRGVmLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb25EZWYgZXh0ZW5kcyBGdW5j
dGlvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFy
YW1ldGVycywgcGFyYW1ldGVycywgYm9keSkKKyAgICB7CisgICAgICAgIHN1cGVyKG5hbWUsIHJl
dHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5fb3Jp
Z2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBib2R5KCkg
eyByZXR1cm4gdGhpcy5fYm9keTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiB7ICIgKyBib2R5ICsgIiB9IjsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb25QYXJhbWV0ZXIgewor
ICAgIC8vIFRoZSBuYW1lIGlzIG9wdGlvbmFsLiBJdCdzIE9LIGZvciBpdCB0byBiZSBudWxsIQor
ICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9uYW1lID0g
bmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBu
YW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhp
cy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI2IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0xleGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL0xleGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IExleGVyIHsKKyAgICBjb25zdHJ1Y3Rvcih0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fdGV4
dCA9IHRleHQ7CisgICAgICAgIHRoaXMuX2luZGV4ID0gMDsKKyAgICB9CisgICAgCisgICAgZ2V0
IGxpbmVOdW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlckZvcklu
ZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgbGluZU51bWJlckZvckluZGV4KGlu
ZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQuc3Vic3RyaW5nKDAsIGluZGV4
KS5tYXRjaCgvXG4vZykubGVuZ3RoOworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGUoKSB7IHJl
dHVybiB0aGlzLl9pbmRleDsgfQorICAgIHNldCBzdGF0ZSh2YWx1ZSkgeyB0aGlzLl9pbmRleCA9
IHZhbHVlOyB9CisgICAgCisgICAgbmV4dCgpCisgICAgeworICAgICAgICBpZiAodGhpcy5faW5k
ZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAg
ICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1lbnRCZWdpbiA9IC9cL1wqLzsKKyAgICAgICAgY29u
c3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4gPSAvXC9cLy87CisgICAgICAgIAorICAgICAgICBs
ZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZXh0ID0gUmVnRXhwLmxh
c3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0b2tlbiA9IG5ldyBMZXhlclRva2VuKHRoaXMsIHRo
aXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IHRleHQu
bGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICB9OworCisgICAgICAg
IGxldCByZWxldmFudFRleHQ7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHJlbGV2
YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3RyaW5nKHRoaXMuX2luZGV4KTsKKyAgICAgICAgICAg
IGlmICgvXlxzKy8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5f
aW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wqLy50ZXN0KHJlbGV2YW50
VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSByZWxldmFudFRleHQuc2Vh
cmNoKC9cKlwvLyk7CisgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgMCkKKyAgICAgICAg
ICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIpOworICAgICAgICAg
ICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZEluZGV4OworICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9cLy4qLy50ZXN0KHJlbGV2YW50
VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBSZWdFeHAubGFzdE1hdGNo
Lmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGSVhNRTogTWFr
ZSB0aGlzIGRvIFVuaWNvZGUuCisgICAgICAgIGlmICgvXlteXGRcV11cdyovLnRlc3QocmVsZXZh
bnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImlkZW50aWZpZXIiKTsKKworICAg
ICAgICBpZiAoL15bMC05XSsvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVy
biByZXN1bHQoImludGVnZXJMaXRlcmFsIik7CisKKyAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhp
cyBoYW5kbGUgZXhwLWZvcm0gbGl0ZXJhbHMgbGlrZSAxZTEuCisgICAgICAgIGlmICgvXihbMC05
XSpcLlswLTldKyl8KFswLTldK1wuWzAtOV0qKS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAg
ICAgICAgcmV0dXJuIHJlc3VsdCgiZmxvYXRMaXRlcmFsIik7CisgICAgICAgIAorICAgICAgICBp
ZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8aWZ8ZWxzZXxlbnVtfGNvbnRpbnVlfGJyZWFrfHN3
aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxlfGRvfHJldHVybnxzaXplb2Z8Y29uc3RhbnR8ZGV2
aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVyYXRvcikvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHQoImtleXdvcmQiKTsKKyAgICAgICAgCisgICAgICAgIGlm
ICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5eJnw8PlxcLV18LT58PT58PD18PT18IT18Kz18LT18
XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgZmFpbCgiVW5y
ZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3aXRoOiAiICsgcmVsZXZhbnRUZXh0LnN1YnN0cmlu
ZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAgICBmYWlsKGVycm9yKQorICAgIHsKKyAgICAgICAg
dGhyb3cgbmV3IEFMU3ludGF4RXJyb3IodGhpcy5saW5lTnVtYmVyLCBlcnJvcik7CisgICAgfQor
ICAgIAorICAgIGJhY2t0cmFja2luZ1Njb3BlKGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0
IHN0YXRlID0gdGhpcy5zdGF0ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBj
YWxsYmFjaygpOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBpZiAoZSBpbnN0
YW5jZW9mIEFMU3ludGF4RXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3Rh
dGU7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvTGV4ZXJUb2tlbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlclRv
a2VuLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBMZXhlclRva2VuIHsK
KyAgICBjb25zdHJ1Y3RvcihsZXhlciwgaW5kZXgsIGtpbmQsIHRleHQpCisgICAgeworICAgICAg
ICB0aGlzLl9sZXhlciA9IGxleGVyOworICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4OworICAg
ICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAg
fQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9raW5k
OworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpbmVOdW1iZXIoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMuX2xleGVyLmxpbmVOdW1iZXJGb3JJbmRleCh0aGlzLl9pbmRleCk7Cisg
ICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiTGV4ZXJU
b2tlbigiICsgdGhpcy5raW5kICsgIiwgIiArIHRoaXMudGV4dCArICIsICIgKyB0aGlzLmxpbmVO
dW1iZXIgKyAiKSI7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRl
eHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYW1lQ29udGV4dCB7CisgICAgY29u
c3RydWN0b3IoZGVsZWdhdGUpCisgICAgeworICAgICAgICB0aGlzLl90eXBlcyA9IG5ldyBNYXAo
KTsKKyAgICAgICAgdGhpcy5fdmFsdWVzID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9wcm90
b2NvbHMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX2Z1bmN0aW9ucyA9IG5ldyBNYXAoKTsK
KyAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBtYXBGb3Io
a2luZCkKKyAgICB7CisgICAgICAgIGlmIChraW5kID09IFZhbHVlKQorICAgICAgICAgICAgcmV0
dXJuIHRoaXMuX3ZhbHVlczsKKyAgICAgICAgaWYgKGtpbmQgPT0gVHlwZSkKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLl90eXBlczsKKyAgICAgICAgaWYgKGtpbmQgPT0gUHJvdG9jb2wpCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5fcHJvdG9jb2xzOworICAgICAgICBpZiAoa2luZCA9PSBGdW5j
dGlvbikKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9mdW5jdGlvbnM7CisgICAgICAgIHRocm93
IG5ldyBFcnJvcigiQmFkIGtpbmQ6ICIgKyBraW5kKTsKKyAgICB9CisgICAgCisgICAgYWRkKHRo
aW5nKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGluZy5uYW1lKQorICAgICAgICAgICAgcmV0dXJu
OworICAgICAgICBsZXQgbWFwID0gbWFwRm9yKHRoaW5nLmtpbmQpOworICAgICAgICBpZiAobWFw
Lmhhcyh0aGluZy5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGlu
Zy5vcmlnaW4ubGluZU51bWJlciwgIkR1cGxpY2F0ZSBuYW1lOiAiICsgdGhpbmcubmFtZSk7Cisg
ICAgICAgIG1hcC5zZXQodGhpbmcubmFtZSwgdGhpbmcpOworICAgIH0KKyAgICAKKyAgICBnZXQo
a2luZCwgbmFtZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBtYXBGb3Ioa2luZCkuZ2V0
KG5hbWUpOworICAgICAgICBpZiAoIXJlc3VsdCAmJiB0aGlzLmRlbGVnYXRlKQorICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuZ2V0KGtpbmQsIG5hbWUpOworICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH0KKyAgICAKKyAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKQorICAgIHsKKyAg
ICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcykKKyAgICAgICAgICAgIHlpZWxkIHR5
cGU7CisgICAgICAgIGZvciAobGV0IHZhbHVlIG9mIHRoaXMuX3ZhbHVlcykKKyAgICAgICAgICAg
IHlpZWxkIHZhbHVlOworICAgICAgICBmb3IgKGxldCBwcm90b2NvbCBvZiB0aGlzLl9wcm90b2Nv
bHMpCisgICAgICAgICAgICB5aWVsZCBwcm90b2NvbDsKKyAgICAgICAgZm9yIChsZXQgcGh1bmN0
aW9uIG9mIHRoaXMuX2Z1bmN0aW9ucykKKyAgICAgICAgICAgIHlpZWxkIHBodW5jdGlvbjsKKyAg
ICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIG5hbWUsIGlzUHJpbWl0aXZlLCB0eXBlUGFyYW1ldGVycykKKyAgICB7CisgICAg
ICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7Cisg
ICAgICAgIHRoaXMuX2lzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7CisgICAgICAgIHRoaXMuX3R5
cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgfQorICAgIAorICAgIGdldCBvcmln
aW4oKSB7IHJldHVuciB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRo
aXMuX25hbWU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLl9pc1ByaW1p
dGl2ZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJh
bWV0ZXJzOyB9CisgICAgCisgICAgaW5zdGFudGlhdGUob3JpZ2luLCB0eXBlQXJndW1lbnRzKQor
ICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFt
ZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5s
aW5lTnVtYmVyLCAiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3RhbnRpYXRp
b24iKTsKKyAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzOworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5cGVJbnN0YW5jZSh0aGlzLCBv
cmlnaW4sIHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAg
eworICAgICAgICByZXR1cm4gIm5hdGl2ZSAiICsgKHRoaXMuaXNQcmltaXRpdmUgPyAicHJpbWl0
aXZlICIgOiAiIikgKyAidHlwZSAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1l
dGVycyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5
cGVJbnN0YW5jZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBl
SW5zdGFuY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlw
ZUluc3RhbmNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
TmF0aXZlVHlwZUluc3RhbmNlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3IodHlwZSwg
b3JpZ2luLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7
CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdHlwZUFyZ3Vt
ZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAorICAgIGdldCB0eXBlKCkgeyByZXR1
cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47
IH0KKyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7
CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIu
dHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7Cisg
ICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNv
bnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICI8IiArIHRoaXMu
dHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L05vZGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTm9kZSB7CisgICAgdmlzaXQodmlzaXRvcikKKyAgICB7
CisgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IHZpc2l0b3JbInZpc2l0IiArIHRoaXMuY29uc3Ry
dWN0b3IubmFtZV0odGhpcyk7CisgICAgICAgIGlmICgicmV0dXJuVmFsdWUiIGluIHZpc2l0b3Ip
CisgICAgICAgICAgICByZXR1cm4gdmlzaXRvci5yZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJu
IHJldHVyblZhbHVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0IHVuaWZ5VGhpcyA9IHRoaXMudW5pZnlOb2RlOwor
ICAgICAgICBsZXQgdW5pZnlPdGhlciA9IG90aGVyLnVuaWZ5Tm9kZTsKKyAgICAgICAgaWYgKHVu
aWZ5T3RoZXIudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCB1bmlmeVRoaXMp
KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB1bmlmeVRoaXMudW5p
ZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlPdGhlcik7CisgICAgfQorICAgIAorICAg
IHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYg
KG90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdGhpcykpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXI7CisgICAg
fQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIp
CisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGdldCB1bmlm
eU5vZGUoKSB7IHJldHVybiB0aGlzOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4g
ZmFsc2U7IH0KKyAgICAKKyAgICBlcXVhbHMob3RoZXIpCisgICAgeworICAgICAgICBsZXQgdW5p
ZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dCgpOworICAgICAgICByZXR1
cm4gdGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKSAmJiB1bmlmaWNhdGlvbkNv
bnRleHQuaXNVbnVuaWZpZWQoKTsKKyAgICB9CisgICAgCisgICAgc3Vic3RpdHV0ZShwYXJhbWV0
ZXJzLCBhcmd1bWVudExpc3QpCisgICAgeworICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGgg
IT0gYXJndW1lbnRMaXN0Lmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUGFy
YW1ldGVycyBhbmQgYXJndW1lbnRzIGFyZSBtaXNtYXRjaGVkIik7CisgICAgICAgIGxldCBtYXAg
PSBuZXcgTWFwKCk7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5n
dGg7ICsraSkKKyAgICAgICAgICAgIG1hcC5zZXQocGFyYW1ldGVyc1tpXSwgYXJndW1lbnRMaXN0
W2ldKTsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXQobmV3IFN1YnN0aXR1dGlvbihtYXApKTsK
KyAgICB9CisgICAgCisgICAgc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24ocGFyYW1ldGVycywgdW5p
ZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUocGFyYW1l
dGVycywgcGFyYW1ldGVycy5tYXAodHlwZSA9PiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0eXBl
KSkpOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlci5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QYXJzZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvUGFyc2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworZnVuY3Rpb24gcGFyc2UodGV4dCkKK3sKKyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIo
dGV4dCk7CisgICAgCisgICAgLy8gVGhlIGhhcmRlc3QgcGFydCBvZiBkZWFsaW5nIHdpdGggQy1s
aWtlIGxhbmd1YWdlcyBpcyBwYXJzaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVudHMu
CisgICAgLy8gTGV0J3MgY29uc2lkZXIgaWYgdGhpcyBoYXBwZW5zIGluIEFycmF5TGFuZy4gSGVy
ZSBhcmUgdGhlIHZhbGlkIHN0YXRlbWVudHMgaW4gQXJyYXlMYW5nIHRoYXQKKyAgICAvLyBiZWdp
biB3aXRoIGFuIGlkZW50aWZpZXIsIGlmIHdlIGFzc3VtZSB0aGF0IGFueSBleHByZXNzaW9uIGNh
biBiZSBhIHN0YW5kYWxvbmUgc3RhdGVtZW50LgorICAgIC8vCisgICAgLy8gICAgIHg7CisgICAg
Ly8gICAgIHggPGJpbm9wPiB5OworICAgIC8vICAgICB4IDwgeTsKKyAgICAvLyAgICAgeCA8IHkg
PiB6OworICAgIC8vICAgICB4ID0geTsKKyAgICAvLyAgICAgeC5mID0geTsKKyAgICAvLyAgICAg
XGV4cCA9IHk7CisgICAgLy8gICAgIHhbNDJdID0geTsKKyAgICAvLyAgICAgeCgpOworICAgIC8v
ICAgICB4PHk+KCk7CisgICAgLy8gICAgIHggeTsKKyAgICAvLyAgICAgeDx5PiB6OworICAgIC8v
ICAgICB4W10geTsKKyAgICAvLyAgICAgeFs0Ml0geTsKKyAgICAvLyAgICAgeF4geTsKKyAgICAv
LworICAgIC8vIFRoaXMgaGFzIHR3byBwcm9ibGVtIGFyZWFzOgorICAgIC8vCisgICAgLy8gICAg
IC0geDx5PnogY2FuIHBhcnNlIHR3byBkaWZmZXJlbnQgd2F5cyAoYXMgKHggPCB5KSA+IHogb3Ig
eDx5PiB6KS4KKyAgICAvLyAgICAgLSB4WzQyXSBjb3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2ln
bm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAvLyAgICAgLSB4PHk+IGNvdWxk
IGJlY29tZSBlaXRoZXIgYW4gYXNzaWdubWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgor
ICAgIC8vCisgICAgLy8gV2Ugc29sdmUgdGhlIGZpcnN0IHByb2JsZW0gYnkgZm9yYmlkZGluZyBl
eHByZXNzaW9ucyBhcyBzdGF0ZW1lbnRzLiBUaGUgbGFjayBvZiBmdW5jdGlvbgorICAgIC8vIHBv
aW50ZXJzIG1lYW5zIHRoYXQgd2UgY2FuIHN0aWxsIGFsbG93IGZ1bmN0aW9uIGNhbGwgc3RhdGVt
ZW50cyAtIHVubGlrZSBpbiBDLCB0aG9zZSBjYW5ub3QKKyAgICAvLyBoYXZlIGFyYml0cmFyeSBl
eHByZXNzaW9ucyBhcyB0aGUgY2FsbGVlLiBUaGUgcmVtYWluaW5nIHR3byBwcm9ibGVtcyBhcmUg
c29sdmVkIGJ5CisgICAgLy8gYmFja3RyYWNraW5nLiBJbiBhbGwgb3RoZXIgcmVzcGVjdHMsIHRo
aXMgaXMgYSBzaW1wbGUgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyLgorICAgIAorICAgIGZ1bmN0
aW9uIG5ld05vZGUobm9kZSwgZGF0YSkKKyAgICB7CisgICAgICAgIHJldHVybiBPYmplY3QuY3Jl
YXRlKG5vZGUsIGRhdGEpOworICAgIH0KKyAgICAKKyAgICAKK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvUHJvZ3JhbS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Qcm9n
cmFtLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvZ3JhbSBleHRlbmRz
IE5vZGUgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3RvcExldmVs
U3RhdGVtZW50cyA9IFtdOworICAgICAgICB0aGlzLl9mdW5jdGlvbnMgPSBuZXcgTWFwKCk7Cisg
ICAgICAgIHRoaXMuX3R5cGVzID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICBnZXQgdG9w
TGV2ZWxTdGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzOyB9Cisg
ICAgZ2V0IGZ1bmN0aW9ucygpIHsgcmV0dXJuIHRoaXMuX2Z1bmN0aW9uczsgfQorICAgIGdldCB0
eXBlcygpIHsgcmV0dXJuIHRoaXMuX3R5cGVzOyB9CisgICAgCisgICAgYWRkVG9wTGV2ZWxTdGF0
ZW1lbnQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAgc3RhdGVtZW50LnByb2dyYW0gPSB0aGlz
OworICAgICAgICBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKKyAgICAgICAg
ICAgIGxldCBhcnJheSA9IHRoaXMuX2Z1bmN0aW9ucy5nZXQoc3RhdGVtZW50Lm5hbWUpOworICAg
ICAgICAgICAgaWYgKCFhcnJheSkKKyAgICAgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbnMuc2V0
KHN0YXRlbWVudC5uYW1lLCBhcnJheSA9IFtdKTsKKyAgICAgICAgICAgIGFycmF5LnB1c2goc3Rh
dGVtZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQor
ICAgICAgICAgICAgdGhpcy5fdHlwZXMuc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBu
b3QgYSBmdW5jdGlvbiBvciB0eXBlOiAiICsgc3RhdGVtZW50KTsKKyAgICAgICAgdGhpcy5fdG9w
TGV2ZWxTdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVzb2x2
ZUZ1bmN0aW9uT3ZlcmxvYWQobmFtZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcykKKyAg
ICB7CisgICAgICAgIGxldCBmdW5jdGlvbnMgPSB0aGlzLmZ1bmN0aW9ucy5nZXQobmFtZSk7Cisg
ICAgICAgIGlmICghZnVuY3Rpb25zKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAg
IAorICAgICAgICBmb3IgKGxldCBwaHVuY3Rpb24gb2YgZnVuY3Rpb25zKSB7CisgICAgICAgICAg
ICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggJiYgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gcGh1
bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIGlmIChhcmd1bWVudFR5cGVzLmxlbmd0aCAhPSBwaHVuY3Rpb24ucGFyYW1l
dGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBsZXQg
dW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dChwaHVuY3Rpb24udHlw
ZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgbGV0IG9rID0gdHJ1ZTsKKyAgICAgICAgICAgIGZv
ciAobGV0IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAg
ICAgICAgIGxldCBhcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07CisgICAgICAgICAgICAgICAg
bGV0IHBhcmFtZXRlciA9IHBodW5jdGlvbi50eXBlUGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAg
ICAgICBpZiAoKGFyZ3VtZW50IGluc3RhbmNlb2YgVHlwZSkgIT0gKHBhcmFtZXRlciBpbnN0YW5j
ZW9mIFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAo
IWFyZ3VtZW50LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgcGFyYW1ldGVyKSkgeworICAgICAg
ICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW9rKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBh
cmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVu
dFR5cGVzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgcGh1bmN0aW9uLnBhcmFtZXRlcnNb
aV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlm
ICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgbGV0IHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cyA9ICF0eXBlQXJndW1l
bnRzLmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMpCisg
ICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IFtdOworICAgICAgICAgICAgZm9yIChsZXQg
dHlwZVBhcmFtZXRlciBvZiBwaHVuY3Rpb24udHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAg
ICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodHlwZVBhcmFt
ZXRlcik7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudCA9PSB0eXBlUGFyYW1ldGVy
KSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQnVp
bGRUeXBlQXJndW1lbnRzKQorICAgICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnB1c2go
dHlwZUFyZ3VtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghb2spCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4ge3BodW5jdGlvbiwgdW5p
ZmljYXRpb25Db250ZXh0LCB0eXBlQXJndW1lbnRzfTsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lQ29udGV4dCgpCisg
ICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIGZv
ciAobGV0IHN0YXRlbWVudCBvZiB0aGlzLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAg
IHJlc3VsdC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL1Byb3RvY29sLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgUHJvdG9jb2wgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5h
bWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMu
X25hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhp
cy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAg
Z2V0IGtpbmQoKSB7IHJldHVybiBQcm90b2NvbDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb3RvY29sRGVjbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90
b2NvbERlY2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
UHJvdG9jb2xEZWNsIGV4dGVuZHMgUHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
bmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbmFtZSkKKyAgICAgICAgdGhpcy5f
c2lnbmF0dXJlcyA9IFtdOworICAgICAgICB0aGlzLl9zaWduYXR1cmVNYXAgPSBuZXcgTWFwKCk7
CisgICAgICAgIHRoaXMuX3R5cGVWYXJpYWJsZSA9IG5ldyBUeXBlVmFyaWFibGUob3JpZ2luLCBu
YW1lLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZSkKKyAg
ICB7CisgICAgICAgIC8vIE5PVEU6IEFueSB0eXBlIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIHNp
Z25hdHVyZSBtdXN0IGJlIGluZmVyYWJsZSBmcm9tIHRoZSB2YWx1ZQorICAgICAgICAvLyBwYXJh
bWV0ZXJzLgorICAgICAgICAvLyBGSVhNRTogQ2hlY2sgdGhpcyEgKE9PUFMhKQorICAgICAgICB0
aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlKTsKKyAgICAgICAgbGV0IG92ZXJsb2FkcyA9
IHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQoc2lnbmF0dXJlLm5hbWUpOworICAgICAgICBpZiAoIW92
ZXJsb2FkcykKKyAgICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZU1hcC5zZXQoc2lnbmF0dXJlLm5h
bWUsIG92ZXJsb2FkcyA9IFtdKTsKKyAgICAgICAgb3ZlcmxvYWRzLnB1c2goc2lnbmF0dXJlKTsK
KyAgICB9CisgICAgCisgICAgZ2V0IHNpZ25hdHVyZXMoKSB7IHJldHVybiB0aGlzLl9zaWduYXR1
cmVzOyB9CisgICAgc2lnbmF0dXJlc0J5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9zaWduYXR1
cmVNYXAuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IHR5cGVWYXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMu
X3R5cGVWYXJpYWJsZTsgfQorICAgIAorICAgIGluaGVyaXRzKG90aGVyUHJvdG9jb2wpCisgICAg
eworICAgICAgICBpZiAoIW90aGVyUHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgCisgICAgICAgIGlmIChvdGhlclByb3RvY29sIGluc3RhbmNlb2YgUHJvdG9jb2xS
ZWYpCisgICAgICAgICAgICBvdGhlclByb3RvY29sID0gb3RoZXJQcm90b2NvbC5wcm90b2NvbERl
Y2w7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBvdGhlclNpZ25hdHVyZSBvZiBvdGhlclBy
b3RvY29sLnNpZ25hdHVyZXMpIHsKKyAgICAgICAgICAgIGxldCBzaWduYXR1cmVzID0gdGhpcy5z
aWduYXR1cmVzQnlOYW1lKG90aGVyU2lnbmF0dXJlLm5hbWUpOworICAgICAgICAgICAgaWYgKCFz
aWduYXR1cmVzKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGxl
dCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIDogc2lnbmF0
dXJlcykgeworICAgICAgICAgICAgICAgIGlmIChzaWduYXR1cmUucGFyYW1ldGVycy5sZW5ndGgg
IT0gb3RoZXJTaWduYXR1cmUucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxldCB0eXBlUGFy
YW1ldGVycyA9IHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycy5jb25jYXQodGhpcy50eXBlVmFyaWFi
bGUpOworICAgICAgICAgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmlj
YXRpb25Db250ZXh0KHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBsZXQgb2sgPSB0
cnVlOworICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2lnbmF0dXJlLnBhcmFt
ZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzaWduYXR1cmUu
cGFyYW1ldGVyc1tpXS50eXBlLnVuaWZ5KG90aGVyU2lnbmF0dXJlLnBhcmFtZXRlcnNbaV0udHlw
ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPQorICAgICAgICAg
ICAgICAgICAgICAgICAgc2lnbmF0dXJlLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRp
b24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMsIHVuaWZpY2F0
aW9uQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5U
eXBlLmVxdWFscyhvdGhlclNpZ25hdHVyZS5yZXR1cm5UeXBlKSkKKyAgICAgICAgICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAg
ICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmb3VuZCkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIGxldCBtYXAg
PSBuZXcgTWFwKCk7CisgICAgICAgIG1hcC5zZXQodGhpcy5fdHlwZVZhcmlhYmxlLCB0eXBlKTsK
KyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IG5ldyBTdWJzdGl0dXRpb24obWFwKTsKKyAgICAg
ICAgZm9yIChsZXQgYWJzdHJhY3RTaWduYXR1cmUgb2YgdGhpcy5fc2lnbmF0dXJlcykgeworICAg
ICAgICAgICAgbGV0IHNpZ25hdHVyZSA9IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pOwor
ICAgICAgICAgICAgbGV0IG92ZXJsb2FkID0gdGhpcy5wcm9ncmFtLnJlc29sdmVGdW5jdGlvbk92
ZXJsb2FkKHNpZ25hdHVyZS5uYW1lLCBbXSwgc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKTsKKyAg
ICAgICAgICAgIGlmICghb3ZlcmxvYWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0gb3Zl
cmxvYWQucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigKKyAgICAgICAgICAgICAg
ICBvdmVybG9hZC5waHVuY3Rpb24udHlwZVBhcmFtZXRlcnMsIG92ZXJsb2FkLnVuaWZpY2F0aW9u
Q29udGV4dCk7CisgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGVkUmV0dXJuVHlwZS5lcXVhbHMo
c2lnbmF0dXJlLnJldHVyblR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuICJwcm90b2NvbCAiICsgdGhpcy5uYW1lICsgIiB7ICIg
KyB0aGlzLnNpZ25hdHVyZXMuam9pbigiOyAiKSArICI7IH0iOworICAgIH0KK30KKworCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbFJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9Qcm90b2NvbFJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9Qcm90b2NvbFJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIFByb3RvY29sUmVmIGV4dGVuZHMgUHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9y
aWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbmFtZSk7CisgICAgICAg
IHRoaXMucHJvdG9jb2xEZWNsID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgaW5oZXJpdHMob3Ro
ZXIpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbERlY2wuaW5oZXJpdHMob3Ro
ZXIpOworICAgIH0KKyAgICAKKyAgICBoYXNIZWlyKHR5cGUpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy5wcm90b2NvbERlY2wuaGFzSGVpcih0eXBlKTsKKyAgICB9Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1B0clR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFB0clR5cGUgZXh0
ZW5kcyBSZWZlcmVuY2VUeXBlIHsKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy5hZGRyZXNzU3BhY2UgKyAiICIgKyB0aGlzLmVsZW1lbnRUeXBlICsgIl4iOworICAg
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZWZlcmVuY2VUeXBlIGV4dGVuZHMgVHlwZSB7Cisg
ICAgY29uc3RydWN0b3Iob3JpZ2luLCBhZGRyZXNzU3BhY2UsIGVsZW1lbnRUeXBlKQorICAgIHsK
KyAgICAgICAgdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKTsKKyAgICAgICAgdGhp
cy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9hZGRyZXNzU3BhY2UgPSBhZGRyZXNz
U3BhY2U7CisgICAgICAgIHRoaXMuX2VsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgfQor
ICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQg
YWRkcmVzc1NwYWNlKCkgeyByZXR1cm4gdGhpcy5fYWRkcmVzc1NwYWNlOyB9CisgICAgZ2V0IGVs
ZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5fZWxlbWVudFR5cGU7IH0KKyAgICBnZXQgaXNQcmlt
aXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlv
bkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgIT0g
b3RoZXIuY29uc3RydWN0b3IpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJl
dHVybiB0aGlzLmVsZW1lbnRUeXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxl
bWVudFR5cGUpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBSZXR1cm4gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOwor
ICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2lu
KCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhp
cy5fdmFsdWU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4g
InsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0KK307CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jld3JpdGVyLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL1Jld3JpdGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1Jld3JpdGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTExIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIFJld3JpdGVyIHsKKyAgICB2aXNpdEZ1bmN0aW9uKG5vZGUpCisgICAgeworICAgICAgICBy
ZXR1cm4gbmV3IEZ1bmN0aW9uKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnJldHVyblR5
cGUudmlzaXQodGhpcyksCisgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBl
UGFybWV0ZXIgPT4gdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2Rl
LnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvblBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5ldyBGdW5jdGlvbkFyZ3VtZW50KG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0
KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAgICAg
ICAgbGV0IHJlc3VsdCA9IG5ldyBCbG9jayhub2RlLm9yaWdpbik7CisgICAgICAgIGZvciAobGV0
IHN0YXRlbWVudCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICByZXN1bHQuYWRkKHN0
YXRlbWVudC52aXNpdCh0aGlzKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAg
IAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2Rl
OworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxl
dCByZXN1bHQgPSBuZXcgVHlwZVJlZihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGVB
cmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpKTsK
KyAgICAgICAgcmVzdWx0LnR5cGUgPSBub2RlLnR5cGU7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAgeworICAgICAg
ICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRDb25zdGV4cHJUeXBlUGFyYW1l
dGVyKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IENvbnN0ZXhwclR5cGVQYXJhbWV0
ZXIobm9kZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRGaWVsZChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBG
aWVsZChub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiBuZXcgbm9kZS5jb25zdHJ1Y3Rvcihub2RlLnJvZ2lpbiwgbm9kZS5hZGRyZXNzU3BhY2Us
IG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFB0
clR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlw
ZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcg
QXJyYXlUeXBlKG5vZGUub3JpZ2luLCBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAgICAgICByZXR1
cm4gbmV3IEFzc2lnbm1lbnQobm9kZS5vcmlnaW4sIG5vZGUubGhzLnZpc2l0KHRoaXMpLCBub2Rl
LnJocy52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9k
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJl
dHVybihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4obm9kZS5vcmlnaW4s
IG5vZGUudmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvU3RydWN0VHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgwIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIFN0cnVjdFR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rvcihvcmln
aW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0g
b3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZVBh
cmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fZmllbGRzID0gbmV3IE1h
cCgpOworICAgIH0KKyAgICAKKyAgICBhZGRGaWVsZChmaWVsZCkKKyAgICB7CisgICAgICAgIGlm
ICh0aGlzLl9maWVsZHMuaGFzKGZpZWxkLm5hbWUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFM
VHlwZUVycm9yKGZpZWxkLm9yaWdpbi5saW5lTnVtYmVyLCAiRHVwbGljYXRlIGZpZWxkIG5hbWU6
ICIgKyBmaWVsZC5uYW1lKTsKKyAgICAgICAgdGhpcy5fZmllbGRzLnNldChmaWVsZC5uYW1lLCBm
aWVsZCk7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsg
fQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJz
OyB9CisgICAgCisgICAgZ2V0IGZpZWxkTmFtZXMoKSB7IHJldHVybiB0aGlzLl9maWVsZHMua2V5
cygpOyB9CisgICAgZmllbGRCeU5hbWUobmFtZSkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmdldChu
YW1lKTsgfQorICAgIGdldCBmaWVsZHMoKSB7IHJldHVybiB0aGlzLl9maWVsZHMudmFsdWVzKCk7
IH0KKyAgICBnZXQgZmllbGRNYXAoKSB7IHJldHVybiB0aGlzLl9maWVsZHM7IH0KKyAgICAKKyAg
ICBnZXQgbmFtZUNvbnRleHQoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBOYW1l
Q29udGV4dCgpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMudHlwZVBh
cmFtZXRlcnMpCisgICAgfQorICAgIAorICAgIGluc3RhbnRpYXRlKG9yaWdpbiwgdHlwZUFyZ3Vt
ZW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSB0aGlzLnR5
cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihv
cmlnaW4ubGluZU51bWJlciwgIldyb25nIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyB0byBpbnN0
YW50aWF0aW9uIik7CisgICAgICAgIAorICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFt
ZUNvbnRleHQoKTsKKyAgICAgICAgCisgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7CisgICAg
ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkKKyAgICAg
ICAgICAgIG1hcC5zZXQodGhpcy50eXBlUGFyYW1ldGVyc1tpXSwgdHlwZUFyZ3VtZW50c1tpXSk7
CisgICAgICAgIAorICAgICAgICBjbGFzcyBTdWJzdGl0dXRlIGV4dGVuZHMgUmV3cml0ZXIgewor
ICAgICAgICAgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAgICAgICAgICAgIHsKKyAgICAg
ICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInN0cnVjdCAiICsgdGhpcy5uYW1lICsg
IjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+IHsgIiArIEFycmF5LmZyb20odGhpcy5maWVs
ZHMpLmpvaW4oIjsgIikgKyAiOyB9IjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9TdWJzdGl0dXRpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3Rp
dHV0aW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlv
bi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN1YnN0aXR1
dGlvbiBleHRlbmRzIFJld3JpdGVyIHsKKyAgICBjb25zdHJ1Y3RvcihtYXApCisgICAgeworICAg
ICAgICB0aGlzLl9tYXAgPSBtYXA7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2Rl
KQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChub2RlLnR5
cGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChub2RlLnR5
cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5l
eHBlY3RlZCB0eXBlIGFyZ3VtZW50cyBvbiB0eXBlIHZhcmlhYmxlIik7CisgICAgICAgICAgICBy
ZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBz
dXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgfQorCisgICAgdmlzaXRWYXJpYWJsZVJlZihu
b2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChub2Rl
LnZhcmlhYmxlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50KQorICAgICAgICAgICAgcmV0dXJu
IHJlcGxhY2VtZW50OworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0VmFyaWFi
bGVSZWYobm9kZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM4
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIFR5cGUgZXh0ZW5kcyBOb2RlIHsKKyAgICBnZXQgdHlwZVBhcmFtZXRl
cnMoKSB7IHJldHVybiBbXTsgfQorICAgIGdldCBraW5kKCkgeyByZXR1cm4gVHlwZTsgfQorICAg
IAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb3RvY29s
Lmhhc0hlaXIodGhpcyk7CisgICAgfQorICAgIAorICAgIGluc3RhbnRpYXRlZFR5cGUobmFtZUNv
bnRleHQpIHsgcmV0dXJuIHRoaXM7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlw
ZURlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlRGVmIGV4dGVuZHMgVHlwZSB7CisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7
CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAg
IHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1
cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9
CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7
IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9UeXBlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlUmVmIGV4
dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRz
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gbnVsbDsKKyAgICAgICAgdGhpcy5fdHlw
ZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorIAorICAgIGdldCBvcmlnaW4oKSB7
IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25h
bWU7IH0KKyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVu
dHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAg
IC8vIFVzZSB0aGlzIHRvIGV4cGxvcmUgcHJvcGVydGllcyBvZiB0aGUgaW5zdGFudGlhdGVkIHR5
cGUsIGJ1dCB0cnkgbm90IHRvIGtlZXAgaXQgYXJvdW5kLgorICAgIGluc3RhbnRpYXRlZFR5cGUo
bmFtZUNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlLmluc3RhbnRpYXRl
KHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkKKyAgICB7
CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzLnR5cGUudW5pZnlOb2RlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cisg
ICAgCisgICAgc2V0VHlwZUFuZEFyZ3VtZW50cyh0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsK
KyAgICAgICAgdGhpcy5fbmFtZSA9IHR5cGUubmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlw
ZTsKKyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQor
ICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAg
ICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUeXBlUmVmKSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0
LCBvdGhlci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRo
aXMudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhp
cy50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlw
ZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVu
dHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVZhcmlhYmxlIGV4dGVuZHMgVHlwZSB7CisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRo
aXMuX3Byb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyBy
ZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBwcm90b2NvbCgpIHsgcmV0dXJuIHRoaXMuX3By
b3RvY29sOyB9CisgICAgCisgICAgZ2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLl9wcm90b2NvbCAmJiB0aGlzLl9wcm90b2NvbC5pc1ByaW1pdGl2ZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAg
IGluaGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgaWYgKCFwcm90b2NvbCkKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRz
KHByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRp
b25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0
aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAg
ICAgICAgICAgIHJldHVybiByZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVy
KTsKKyAgICAgICAgCisgICAgICAgIHVuaWZpY2F0aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhl
cik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5p
ZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVW
YXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgIH0KKyAgICAKKyAg
ICB2ZXJpZnlBc0FyZ3VtZW50KHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGxl
dCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICAKKyAg
ICAgICAgLy8gVGhlIHRoaW5nIHdlIGdldCB1bmlmaWVkIHdpdGggbXVzdCBiZSBhIHR5cGUgdmFy
aWFibGUgdGhhdCBhY2NlcHRzIGEgYnJvYWRlciBzZXQgb2YKKyAgICAgICAgLy8gdGhpbmdzIHRo
YW4gd2UgZG8uCisgICAgICAgIGlmICghKHJlYWxUaGlzIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxl
KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKCF0aGlz
LnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuICFyZWFsVGhpcy5wcm90b2NvbDsKKyAgICAg
ICAgCisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHJlYWxUaGlzLnByb3Rv
Y29sKTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250
ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgICAgIHJldHVybiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKS5p
bmhlcml0cyh0aGlzLnByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
OTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgVW5pZmljYXRpb25Db250ZXh0IHsKKyAgICBjb25zdHJ1Y3Rvcih0
eXBlUGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gbmV3
IFNldCh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHRoaXMuX25leHRNYXAgPSBuZXcgTWFwKCk7
CisgICAgfQorICAgIAorICAgIHVuaW9uKGEsIGIpCisgICAgeworICAgICAgICBhID0gZmluZChh
KTsKKyAgICAgICAgYiA9IGZpbmQoYik7CisgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIAorICAgICAgICBpZiAoIWIuaXNVbmlmaWFibGUpCisgICAgICAg
ICAgICBbYSwgYl0gPSBbYiwgYV07CisgICAgICAgIGlmICghYS5pc1VuaWZpYWJsZSkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVuaWZ5IG5vbi11bmlmaWFibGUgdGhpbmdz
ICIgKyBhICsgIiBhbmQgIiArIGIpOworICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRo
YXQgdHlwZSBwYXJhbWV0ZXJzIGRvbid0IGVuZCB1cCBiZWluZyByb290cy4KKyAgICAgICAgaWYg
KGEuaXNVbmlmaWFibGUgJiYgYi5pc1VuaWZpYWJsZSAmJiB0aGlzLl90eXBlUGFyYW1ldGVycy5o
YXMoYikpCisgICAgICAgICAgICBbYSwgYl0gPSBbYiwgYV07CisKKyAgICAgICAgdGhpcy5fbmV4
dE1hcC5zZXQoYSwgYik7CisgICAgfQorICAgIAorICAgIGZpbmQobm9kZSkKKyAgICB7CisgICAg
ICAgIGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7CisgICAgICAgIGxldCBuZXh0Tm9kZSA9IHRoaXMu
X25leHRNYXAuZ2V0KGN1cnJlbnROb2RlKTsKKyAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAg
ICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAg
ICAgY3VycmVudE5vZGUgPSBuZXh0Tm9kZTsKKyAgICAgICAgICAgIG5leHROb2RlID0gdGhpcy5f
bmV4dE1hcC5nZXQoY3VycmVudE5vZGUpOworICAgICAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLl9uZXh0TWFwLnNl
dChub2RlLCBjdXJyZW50Tm9kZSk7CisgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IG5vZGVzKCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcg
U2V0KCk7CisgICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9uZXh0TWFwKSB7
CisgICAgICAgICAgICByZXN1bHQuYWRkKGtleSk7CisgICAgICAgICAgICByZXN1bHQuYWRkKHZh
bHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAg
ICB2ZXJpZnkoKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiB0aGlz
Ll90eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLnZlcmlm
eUFzUGFyYW1ldGVyKHRoaXMpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2YgdGhpcy5ub2RlcykgeworICAg
ICAgICAgICAgaWYgKHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhhcyh0eXBlQXJndW1lbnQpKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnQudmVy
aWZ5QXNBcmd1bWVudCh0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlzVW51bmlmaWVk
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAhdGhpcy5fbmV4dE1hcC5zaXplKCk7CisgICAgfQor
fQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9WYWx1ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9WYWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZh
bHVlIGV4dGVuZHMgTm9kZSB7CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBWYWx1ZTsgfQorICAg
IGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1ZhcmlhYmxlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Zhcmlh
YmxlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFy
aWFibGVSZWYgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5h
bWUpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4sIG51bGwpOworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52YXJpYWJsZSA9IG51bGw7CisgICAgfQorICAgIAor
ICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc0NvbnN0ZXhw
cigpIHsgcmV0dXJuIHRoaXMudmFyaWFibGUuaXNDb25zdGV4cHI7IH0KKyAgICBnZXQgdW5pZnlO
b2RlKCkgeyByZXR1cm4gdGhpcy52YXJpYWJsZS51bmlmeU5vZGU7IH0KKyAgICAKKyAgICB0b1N0
cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvVmlzaXRvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WaXNp
dG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZpc2l0
b3IgeworICAgIHZpc2l0UHJvZ3JhbShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3Rh
dGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50
LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uKG5vZGUpCisgICAg
eworICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0
IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQ
YXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2Rl
LnBhcmFtZXRlcnMpCisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQor
ICAgIAorICAgIHZpc2l0RnVuY3Rpb25QYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5v
ZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvbkRlZihu
b2RlKQorICAgIHsKKyAgICAgICAgdmlzaXRGdW5jdGlvbihub2RlKTsKKyAgICAgICAgbm9kZS5i
b2R5LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAg
eworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAgICAg
ICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3Rv
Y29sUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChu
b2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJl
cykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQg
b2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7CisgICAg
ICAgIGZvciAobGV0IHR5cGVQYXJhbXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAg
ICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRU
eXBlRGVmKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5v
ZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMp
OworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0
U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBv
ZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0
aGlzKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAg
ICBmaWVsZC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUo
bm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRl
cihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RWxlbWVudGFsVHlwZShub2RlKQorICAgIHsK
KyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRQdHJUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlw
ZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7
CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRh
bFR5cGUobm9kZSk7CisgICAgICAgIG5vZGUubnVtRWxlbWVudHMudmlzaXQodGhpcyk7CisgICAg
fQorICAgIAorICAgIHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5s
aHMudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2
aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAgaWYgKG5vZGUudmFsdWUpCisgICAgICAg
ICAgICBub2RlLnZhbHVlLnZpc2l0KHRoaXMpOworICAgIH0KK30KKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319116</attachid>
            <date>2017-08-25 16:44:51 -0700</date>
            <delta_ts>2017-08-25 17:57:22 -0700</delta_ts>
            <desc>a bit more things</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>119071</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihsaW5lTnVtYmVyLCBtZXNzYWdlKQorICAgIHsKKyAgICAgICAgc3VwZXIoIlN5bnRh
eCBlcnJvciBhdCBsaW5lIG51bWJlciAiICsgKGxpbmVOdW1iZXIgKyAxKSArICI6ICIgKyBtZXNz
YWdlKTsKKyAgICAgICAgdGhpcy5saW5lTnVtYmVyID0gbGluZU51bWJlcjsKKyAgICAgICAgdGhp
cy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0FMVHlwZUVycm9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVy
cm9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVycm9yLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQUxUeXBlRXJyb3Ig
ZXh0ZW5kcyBFcnJvciB7CisgICAgY29uc3RydWN0b3IobGluZU51bWJlciwgbWVzc2FnZSkKKyAg
ICB7CisgICAgICAgIHN1cGVyKCJUeXBlIGVycm9yIGF0IGxpbmUgbnVtYmVyICIgKyAobGluZU51
bWJlciArIDEpICsgIjogIiArIG1lc3NhZ2UpOworICAgICAgICB0aGlzLmxpbmVOdW1iZXIgPSBs
aW5lTnVtYmVyOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1NwYWNlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0FkZHJlc3NTcGFjZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9BZGRyZXNzU3BhY2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7Cisg
ICAgc3dpdGNoIChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2Fz
ZSAiZGV2aWNlIjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoK
KyAgICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBFcnJvcigi
QmFkIGFkZHJlc3Mgc3BhY2U6ICIgKyBhZGRyZXNzU3BhY2UpOworICAgIH0KK30KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9BcnJheVJlZlR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvQXJyYXlSZWZUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc1NwYWNlICsgIiAiICsgdGhpcy5l
bGVtZW50VHlwZSArICJbXSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9B
cnJheVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5VHlwZSBleHRlbmRzIFR5
cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgZWxlbWVudFR5cGUsIG51bUVsZW1lbnRzKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9lbGVt
ZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgICAgICB0aGlzLl9udW1FbGVtZW50cyA9IG51bUVs
ZW1lbnRzOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5fZWxlbWVudFR5cGU7
IH0KKyAgICBnZXQgbnVtRWxlbWVudHMoKSB7IHJldHVybiB0aGlzLl9udW1FbGVtZW50czsgfQor
ICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUuaXNQcmltaXRp
dmU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5l
bGVtZW50VHlwZSArICJbIiArIHRoaXMubnVtRWxlbWVudHMgKyAiXSI7CisgICAgfQorICAgIAor
ICAgIHVuaWZ5SW1wbCh1bmlmaWNhdG9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBp
ZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIAorICAgICAgICBpZiAoIXRoaXMubnVtRWxlbWVudHMudW5pZnkodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlci5udW1FbGVtZW50cykpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9B
c3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
QXNzaWdubWVudCBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
bGhzLCByaHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9s
aHMgPSBsaHM7CisgICAgICAgIHRoaXMuX3JocyA9IHJoczsKKyAgICB9CisgICAgCisgICAgZ2V0
IGxocygpIHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0aGlz
Ll9yaHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5saHMgKyAiID0gIiArIHRoaXMucmhzOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL0Jsb2NrLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQmxvY2sgZXh0ZW5kcyBOb2RlIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4pCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmln
aW47CisgICAgICAgIHRoaXMuX3N0YXRlbWVudHMgPSBbXTsKKyAgICB9CisgICAgCisgICAgZ2V0
IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIAorICAgIGFkZChzdGF0ZW1l
bnQpCisgICAgeworICAgICAgICB0aGlzLl9zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IHN0YXRlbWVudHMoKSB7IHJldHVybiB0aGlzLl9zdGF0ZW1lbnRz
OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ7ICIgKyB0
aGlzLnN0YXRlbWVudHMuam9pbigiOyAiKTsgKyAiOyB9IjsKKyAgICB9Cit9OworCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIENhbGxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudExpc3QpCisgICAg
eworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAg
ICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgICAgIHRoaXMu
X2FyZ3VtZW50TGlzdCA9IGFyZ3VtZW50TGlzdDsKKyAgICAgICAgdGhpcy5waHVuY3Rpb24gPSBu
dWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0K
KyAgICBnZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8
IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCArICIpIjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9DaGVja2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjQ3IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIENoZWNrZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAvLyBJdCdzIHRvdGFs
bHkgT0sgdG8gaW5zdGFudGlhdGUgdGhpcyB3aXRoIHplcm8gYXJndW1lbnRzIChpLmUuIHBhc3Np
bmcgdW5kZWZpbmVkIGZvciBib3RoIG9mCisgICAgLy8gdGhlbSkgaWYgeW91J3JlIGNyZWF0aW5n
IGEgQ2hlY2tlciB0byB2aXNpdCBhIFByb2dyYW0uCisgICAgY29uc3RydWN0b3IobmFtZUNvbnRl
eHQpCisgICAgeworICAgICAgICB0aGlzLl9uYW1lQ29udGV4dCA9IG5hbWVDb250ZXh0OworICAg
IH0KKyAgICAKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1l
Q29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5h
bWVDb250ZXh0LnByb2dyYW0gPSBub2RlOworICAgICAgICBuYW1lQ29udGV4dC5yZWNvZ25pemVJ
bnRyaW5zaWNzKCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVs
U3RhdGVtZW50cykKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZChzdGF0ZW1lbnQpOworICAg
ICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9y
IChsZXQgc3RhdGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAg
bmFtZUNvbnRleHQuZG9TdGF0ZW1lbnQoKCkgPT4gc3RhdGVtZW50LnZpc2l0KGNoZWNrZXIpKTsK
KyAgICB9CisgICAgCisgICAgX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0
KG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQo
dGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5v
ZGUudHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFy
YW1ldGVyKTsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIG5hbWVDb250ZXh0OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1
bmN0aW9uKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKHRo
aXMuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAgICAg
ICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KGNoZWNrZXIpOworICAgICAgICBmb3IgKGxldCBwYXJh
bWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNo
ZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uRGVmKG5vZGUpCisgICAgewor
ICAgICAgICBsZXQgY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyA9IHRoaXMuX3Zpc2l0VHlwZVBh
cmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpOworICAgICAgICBsZXQgY2hlY2tlcldp
dGhUeXBlUGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNvbnRleHRXaXRoVHlwZVBhcmFtZXRlcnMp
OworICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVy
cyk7CisgICAgICAgIGxldCBjb250ZXh0V2l0aFBhcmFtZXRlcnMgPSBuZXcgTmFtZUNvbnRleHQo
Y29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBv
ZiBub2RlLnBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChjaGVja2Vy
V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIGNvbnRleHRXaXRoUGFyYW1ldGVycy5h
ZGQocGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlcldpdGhQYXJhbWV0
ZXJzID0gbmV3IENoZWNrZXIoY29udGV4dFdpdGhQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5i
b2R5LnZpc2l0KGNoZWNrZXJXaXRoUGFyYW1ldGVycyk7CisgICAgfQorICAgIAorICAgIHZpc2l0
QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmV3
IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KSk7CisgICAgICAgIGZvciAobGV0IHN0YXRl
bWVudCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQoY2hl
Y2tlcik7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgewor
ICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKSB7CisgICAgICAg
ICAgICBsZXQgc2V0ID0gbmV3IFNldCgpOworICAgICAgICAgICAgZnVuY3Rpb24gY29uc2lkZXIo
dGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaW5nLmlzVW5pZmlh
YmxlKQorICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHRoaW5nKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGNsYXNzIE5vdGljZVR5cGVWYXJpYWJsZSBleHRlbmRzIFZpc2l0b3Igewor
ICAgICAgICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgICAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICAgICAgY29uc2lkZXIobm9kZS50eXBlKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgICAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc2lkZXIobm9kZS52YXJpYWJsZSk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0IG5vdGljZVR5cGVWYXJp
YWJsZSA9IG5ldyBOb3RpY2VUeXBlVmFyaWFibGUoKTsKKyAgICAgICAgICAgIGZvciAobGV0IHBh
cmFtZXRlclR5cGUgb2Ygc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKQorICAgICAgICAgICAgICAg
IHBhcmFtZXRlclR5cGUudmlzaXQobm90aWNlVHlwZVZhcmlhYmxlKTsKKyAgICAgICAgICAgIGZv
ciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICAgICAgaWYgKCFzZXQuaGFzKHR5cGVQYXJhbWV0ZXIpKQorICAgICAgICAgICAgICAg
ICAgICB0aHJvdyBBTFR5cGVFcnJvcih0eXBlUGFyYW1ldGVyLm9yaWdpbi5saW5lTnVtYmVyLCAi
VHlwZSBwYXJhbWV0ZXIgdG8gcHJvdG9jb2wgc2lnbmF0dXJlIG5vdCBpbmZlcnJhYmxlIGZyb20g
dmFsdWUgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRl
eHQpOworICAgICAgICBuYW1lQ29udGV4dC5hZGQobm9kZS50eXBlVmFyaWFibGUpOworICAgICAg
ICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChs
ZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52
aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNv
bnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFt
ZXRlcnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAg
ICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAg
bGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIG5vZGUudHlw
ZS52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUp
CisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5f
bmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlw
ZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7Cisg
ICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAg
ICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZv
ciAobGV0IGZpZWxkIG9mIG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQoY2hl
Y2tlcik7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAg
ICAgbGV0IHR5cGUgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVHlwZSwgbm9kZS5uYW1lKTsKKyAg
ICAgICAgaWYgKCF0eXBlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUu
b3JpZ2luLmxpbmVOdW1iZXIsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5h
bWUpOworICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmlzRGVmaW5lZCh0eXBlKSkKKyAg
ICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAi
SWxsZWdhbCBmb3J3YXJkIHVzZSBvZiB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAg
ICBub2RlLnR5cGUgPSB0eXBlOworICAgICAgICAKKyAgICAgICAgaWYgKHR5cGUudHlwZVBhcmFt
ZXRlcnMubGVuZ3RoICE9IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICB0
aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIldyb25nIG51bWJl
ciBvZiB0eXBlIGFyZ3VtZW50cyIpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGUu
dHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJJ
c1R5cGUgPSB0eXBlLnR5cGVQYXJhbWV0ZXJzW2ldIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlOwor
ICAgICAgICAgICAgbGV0IGFyZ3VtZW50SXNUeXBlID0gbm9kZS50eXBlQXJndW1lbnRzW2ldIGlu
c3RhbmNlb2YgVHlwZTsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJJc1R5cGUgJiYgIWFyZ3Vt
ZW50SXNUeXBlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9y
aWdpbi5saW5lTnVtYmVyLCAiRXhwZWN0ZWQgdHlwZSwgYnV0IGdvdCB2YWx1ZSBhdCBhcmd1bWVu
dCAjIiArIGkpOworICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJJc1R5cGUgJiYgYXJndW1lbnRJ
c1R5cGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2lu
LmxpbmVOdW1iZXIsICJFeHBlY3RlZCB2YWx1ZSwgYnV0IGdvdCB0eXBlIGF0IGFyZ3VtZW50ICMi
ICsgaSk7CisgICAgICAgICAgICBpZiAoIWFyZ3VtZW50SXNUeXBlKSB7CisgICAgICAgICAgICAg
ICAgaWYgKCFub2RlLnR5cGVBcmd1bWVudHNbaV0uaXNDb25zdEV4cHIpCisgICAgICAgICAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiRXhw
ZWN0ZWQgY29uc3RleHByIHZhbHVlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICAgICAgCisgICAgICAg
IHdoaWxlIChub2RlLnR5cGUgaW5zdGFuY2VvZiBUeXBlRGVmKSB7CisgICAgICAgICAgICBsZXQg
dW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dChub2RlLnR5cGUudHlw
ZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgg
IT0gbm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJv
dyBuZXcgRXJyb3IoImFyZ3VtZW50L3BhcmFtZXRlciBtaXNtYXRjaCAoc2hvdWxkIGhhdmUgYmVl
biBjYXVnaHQgZWFybGllcikiKTsKKyAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9k
ZS50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIG5vZGUudHlwZUFy
Z3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG5vZGUudHlwZS50eXBlUGFyYW1l
dGVyc1tpXSk7CisgICAgICAgICAgICBpZiAoIXVuaWZpY2F0aW9uQ29udGV4dC52ZXJpZnkoKSkK
KyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51
bWJlciwgIlR5cGUgcmVmZXJlbmNlIHRvIGEgdHlwZSBkZWZpbml0aW9uIHZpb2xhdGVzIHByb3Rv
Y29sIGNvbnN0cmFpbnRzIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5vZGUudHlwZSA9
IG5vZGUudHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihub2RlLnR5cGUudHlwZVBhcmFtZXRl
cnMsIHVuaWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdmlz
aXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBu
ZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5k
ZWZpbmVBbGwoKTsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgQ2hlY2tlcihu
YW1lQ29udGV4dCkpOworICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUuYWRkcmVzc1NwYWNlID09
ICJ0aHJlYWQiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKCFu
b2RlLmVsZW1lbnRUeXBlLmluc3RhbnRpYXRlZFR5cGUodGhpcy5fbmFtZUNvbnRleHQpLmlzUHJp
bWl0aXZlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxp
bmVOdW1iZXIsICJJbGxlZ2FsIHBvaW50ZXIgdG8gbm9uLXByaW1pdGl2ZSB0eXBlIik7CisgICAg
fQorICAgIAorICAgIHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGxo
c1R5cGUgPSBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IHJoc1R5cGUgPSBub2Rl
LnJocy52aXNpdCh0aGlzKTsKKyAgICAgICAgaWYgKCFsaHNUeXBlLmVxdWFscyhyaHNUeXBlKSkK
KyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVy
LCAiVHlwZSBtaXNtYXRjaCBpbiBhc3NpZ25tZW50OiAiICsgbGhzVHlwZSArICIgdmVyc3VzICIg
KyByaHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIGxoc1R5cGU7CisgICAgfQorICAgIAorICAgIHZp
c2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9u
YW1lQ29udGV4dC5nZXQoVmFsdWUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0KQor
ICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIs
ICJDb3VsZCBub3QgZmluZCB2YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAg
bm9kZS52YXJpYWJsZSA9IHJlc3VsdDsKKyAgICAgICAgbm9kZS4KKyAgICAgICAgCisgICAgICAg
IHJldHVybiByZXN1bHQudHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkK
KyAgICB7CisgICAgICAgIGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAgICBsZXQgcmVzdWx0
VHlwZSA9IG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXRoaXMuX25h
bWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUuZXF1YWxzKHJlc3VsdFR5cGUp
KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5l
TnVtYmVyLCAiVHJ5aW5nIHRvIHJldHVybiAiICsgcmVzdWx0VHlwZSArICIgaW4gYSBmdW5jdGlv
biB0aGF0IHJldHVybnMgIiArIHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0
dXJuVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAg
ICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUu
ZXF1YWxzKHRoaXMuX25hbWVDb250ZXh0LmludHJpbnNpY3Mudm9pZCkpCisgICAgICAgICAgICB0
aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIk5vbi12b2lkIGZ1
bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUiKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRJbnRM
aXRlcmFsKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbmFtZUNvbnRleHQuaW50
cmluc2ljcy5pbnQzMjsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2Rl
KQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3Vt
ZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0
IGFyZ3VtZW50VHlwZXMgPSBub2RlLmFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1l
bnQudmlzaXQodGhpcykpOworICAgICAgICBsZXQgb3ZlcmxvYWQgPSB0aGlzLl9uYW1lQ29udGV4
dC5wcm9ncmFtLnJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKAorICAgICAgICAgICAgbm9kZS5uYW1l
LCBub2RlLnR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICBpZiAoIW92ZXJs
b2FkKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVO
dW1iZXIsICJEaWQgbm90IGZpbmQgZnVuY3Rpb24gZm9yIGNhbGwiKTsKKyAgICAgICAgcmV0dXJu
IG92ZXJsb2FkLnBodW5jdGlvbi5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAor
ICAgICAgICAgICAgb3ZlcmxvYWQucGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51
bmlmaWNhdGlvbkNvbnRleHQpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
Q29uc3RleHByVHlwZVBhcmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVmFsdWUg
eworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRo
aXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJu
IHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAg
ICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxl
KCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRl
eHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRp
b25Db250ZXh0LCBvdGhlci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAg
ICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAg
ICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5p
ZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICBpZiAob3Ro
ZXIgaW5zdGFuY2VvZiBWYXJpYWJsZVJlZikKKyAgICAgICAgICAgIG90aGVyID0gb3RoZXIudmFy
aWFibGU7CisgICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywg
b3RoZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNB
cmd1bWVudCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIEV4cHJlc3Npb24gZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cit9CkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9GaWVsZC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZpZWxkIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9v
cmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlz
Ll90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRo
aXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAg
IGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAg
fQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb24uanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvRnVuY3Rpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBGdW5jdGlvbiBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG5hbWUsIHJl
dHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhp
cy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOwor
ICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0
aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUo
KSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHJldHVyblR5cGUoKSB7IHJldHVybiB0
aGlzLl9yZXR1cm5UeXBlOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhp
cy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMu
X3BhcmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVyVHlwZXMoKSB7IHJldHVybiB0aGlzLnBh
cmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudHlwZSk7IH0KKyAgICAKKyAgICBn
ZXQga2luZCgpIHsgcmV0dXJuIEZ1bmN0aW9uOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuVHlwZSArICIgIiArIHRoaXMubmFtZSArICI8
IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPigiICsgdGhpcy5wYXJhbWV0ZXJzICsgIikiOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25EZWYuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25EZWYuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25EZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlvbkRlZiBleHRlbmRzIEZ1bmN0aW9uIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBw
YXJhbWV0ZXJzLCBib2R5KQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmV0dXJuVHlwZSwg
dHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmln
aW47CisgICAgICAgIHRoaXMuX2JvZHkgPSBib2R5OworICAgIH0KKyAgICAKKyAgICBnZXQgb3Jp
Z2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGJvZHkoKSB7IHJldHVybiB0
aGlzLl9ib2R5OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHN1cGVyLnRvU3RyaW5nKCkgKyAiIHsgIiArIGJvZHkgKyAiIH0iOworICAgIH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlvblBhcmFtZXRlciB7CisgICAgLy8gVGhl
IG5hbWUgaXMgb3B0aW9uYWwuIEl0J3MgT0sgZm9yIGl0IHRvIGJlIG51bGwhCisgICAgY29uc3Ry
dWN0b3IobmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAg
ICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJl
dHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSAr
ICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1
bmN0aW9uU2lnbmF0dXJlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0
aW9uU2lnbmF0dXJlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0
aW9uU2lnbmF0dXJlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL0ludExpdGVyYWwuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBJbnRMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3Jp
Z2luLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMu
X3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRo
aXMuX3ZhbHVlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAg
IAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiIiArIHRoaXMuX3ZhbHVl
OworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBJbnRyaW5zaWNzIHsKKyAgICBjb25zdHJ1Y3RvcigpCisg
ICAgeworICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7CisKKyAgICAgICAgdGhpcy5fbWFw
LnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUgdm9pZDw+IiwKKyAgICAg
ICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy52b2lkID0gdHlwZTsKKyAg
ICAgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0
aXZlIHByaW1pdGl2ZSB0eXBlIGludDMyPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAg
ICAgICAgICAgICAgICB0aGlzLmludDMyID0gdHlwZTsKKyAgICAgICAgICAgIH0pOworCisgICAg
ICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBlIGRv
dWJsZTw+IiwKKyAgICAgICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5k
b3VibGUgPSB0eXBlOworICAgICAgICAgICAgfSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9MZXhlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhl
ci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBMZXhlciB7CisgICAgY29uc3Ry
dWN0b3IodGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX3RleHQgPSB0ZXh0OworICAgICAgICB0
aGlzLl9pbmRleCA9IDA7CisgICAgfQorICAgIAorICAgIGdldCBsaW5lTnVtYmVyKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLmxpbmVOdW1iZXJGb3JJbmRleCh0aGlzLl9pbmRleCk7Cisg
ICAgfQorICAgIAorICAgIGxpbmVOdW1iZXJGb3JJbmRleChpbmRleCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLl90ZXh0LnN1YnN0cmluZygwLCBpbmRleCkubWF0Y2goL1xuL2cpLmxlbmd0
aDsKKyAgICB9CisgICAgCisgICAgZ2V0IHN0YXRlKCkgeyByZXR1cm4gdGhpcy5faW5kZXg7IH0K
KyAgICBzZXQgc3RhdGUodmFsdWUpIHsgdGhpcy5faW5kZXggPSB2YWx1ZTsgfQorICAgIAorICAg
IG5leHQoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IHRoaXMuX3RleHQubGVu
Z3RoKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICBjb25zdCBp
c0NDb21tZW50QmVnaW4gPSAvXC9cKi87CisgICAgICAgIGNvbnN0IGlzQ1BsdXNQbHVzQ29tbWVu
dEJlZ2luID0gL1wvXC8vOworICAgICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9IChraW5kKSA9
PiB7CisgICAgICAgICAgICBsZXQgdGV4dCA9IFJlZ0V4cC5sYXN0TWF0Y2g7CisgICAgICAgICAg
ICBsZXQgdG9rZW4gPSBuZXcgTGV4ZXJUb2tlbih0aGlzLCB0aGlzLl9pbmRleCwga2luZCwgdGV4
dCk7CisgICAgICAgICAgICB0aGlzLl9pbmRleCArPSB0ZXh0Lmxlbmd0aDsKKyAgICAgICAgICAg
IHJldHVybiB0b2tlbjsKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgcmVsZXZhbnRUZXh0Owor
ICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICByZWxldmFudFRleHQgPSB0aGlzLl90ZXh0
LnN1YnN0cmluZyh0aGlzLl9pbmRleCk7CisgICAgICAgICAgICBpZiAoL15ccysvLnRlc3QocmVs
ZXZhbnRUZXh0KSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0
TWF0Y2gubGVuZ3RoOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKC9eXC9cKi8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAg
ICAgICAgbGV0IGVuZEluZGV4ID0gcmVsZXZhbnRUZXh0LnNlYXJjaCgvXCpcLy8pOworICAgICAg
ICAgICAgICAgIGlmIChlbmRJbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFp
bCgiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCAr
PSBlbmRJbmRleDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmICgvXlwvXC8uKi8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAg
ICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBkbyBVbmljb2RlLgor
ICAgICAgICBpZiAoL15bXlxkXFddXHcqLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAg
ICByZXR1cm4gcmVzdWx0KCJpZGVudGlmaWVyIik7CisKKyAgICAgICAgaWYgKC9eWzAtOV0rLy50
ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJpbnRlZ2VyTGl0
ZXJhbCIpOworCisgICAgICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgaGFuZGxlIGV4cC1mb3JtIGxp
dGVyYWxzIGxpa2UgMWUxLgorICAgICAgICBpZiAoL14oWzAtOV0qXC5bMC05XSspfChbMC05XStc
LlswLTldKikvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQo
ImZsb2F0TGl0ZXJhbCIpOworICAgICAgICAKKyAgICAgICAgaWYgKC9eKHN0cnVjdHxwcm90b2Nv
bHx0eXBlfGlmfGVsc2V8ZW51bXxjb250aW51ZXxicmVha3xzd2l0Y2h8Y2FzZXxkZWZhdWx0fGZv
cnx3aGlsZXxkb3xyZXR1cm58c2l6ZW9mfGNvbnN0YW50fGRldmljZXx0aHJlYWRncm91cHx0aHJl
YWR8b3BlcmF0b3IpLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVz
dWx0KCJrZXl3b3JkIik7CisgICAgICAgIAorICAgICAgICBpZiAoL14oW3t9KClcW1xdPzo9Kypc
LywuJSF+XiZ8PD5cXC1dfC0+fD0+fDw9fD09fCE9fCs9fC09fFwqPXxcLz18JT18Xj18XHw9fCY9
KS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgicHVuY3R1
YXRpb24iKTsKKyAgICAgICAgCisgICAgICAgIGZhaWwoIlVucmVjb2duaXplZCB0b2tlbiBiZWdp
bm5pbmcgd2l0aDogIiArIHJlbGV2YW50VGV4dC5zdWJzdHJpbmcoMCwgMTApKTsKKyAgICB9Cisg
ICAgCisgICAgZmFpbChlcnJvcikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBBTFN5bnRheEVy
cm9yKHRoaXMubGluZU51bWJlciwgZXJyb3IpOworICAgIH0KKyAgICAKKyAgICBiYWNrdHJhY2tp
bmdTY29wZShjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7
CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKKyAgICAgICAg
fSBjYXRjaCAoZSkgeworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBTFN5bnRheEVycm9y
KSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAg
IHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAg
ICAgfQorICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4ZXJUb2tlbiB7CisgICAgY29uc3RydWN0b3IobGV4
ZXIsIGluZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhl
cjsKKyAgICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsKKyAgICAgICAgdGhpcy5fa2luZCA9IGtp
bmQ7CisgICAgICAgIHRoaXMuX3RleHQgPSB0ZXh0OworICAgIH0KKyAgICAKKyAgICBnZXQga2lu
ZCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fa2luZDsKKyAgICB9CisgICAgCisgICAg
Z2V0IHRleHQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQ7CisgICAgfQorICAg
IAorICAgIGdldCBsaW5lTnVtYmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9sZXhl
ci5saW5lTnVtYmVyRm9ySW5kZXgodGhpcy5faW5kZXgpOworICAgIH0KKyAgICAKKyAgICB0b1N0
cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIkxleGVyVG9rZW4oIiArIHRoaXMua2luZCAr
ICIsICIgKyB0aGlzLnRleHQgKyAiLCAiICsgdGhpcy5saW5lTnVtYmVyICsgIikiOworICAgIH0K
K30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTUz
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NvbnN0IG5hbWVhYmxlU2ltcGxlS2luZHMgPSBuZXcgU2V0KFtUeXBlLCBWYWx1
ZSwgUHJvdG9jb2xdKTsKK2NvbnN0IG5hbWVhYmxlT3ZlcmxvYWRhYmxlS2luZHMgPSBuZXcgU2V0
KFtGdW5jdGlvbl0pOworY29uc3QgbmFtZWFibGVLaW5kcyA9IG5ldyBTZXQoQXJyYXkuZnJvbShu
YW1lYWJsZVNpbXBsZUtpbmRzKS5jb25jYXQoQXJyYXkuZnJvbShuYW1lYWJsZU92ZXJsb2FkYWJs
ZUtpbmRzKSkpOworCitjbGFzcyBOYW1lQ29udGV4dCB7CisgICAgY29uc3RydWN0b3IoZGVsZWdh
dGUpCisgICAgeworICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIGZvciAo
bGV0IGtpbmQgb2YgbmFtZWFibGVLaW5kcykKKyAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2lu
ZCwgbmV3IE1hcCgpKTsKKyAgICAgICAgdGhpcy5fZGVmaW5lZCA9IG5ldyBTZXQoKTsKKyAgICAg
ICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIHRoaXMuX2RlbGVnYXRl
ID0gbnVsbDsKKyAgICAgICAgdGhpcy5faW50cmluc2ljcyA9IG51bGw7CisgICAgICAgIHRoaXMu
X3Byb2dyYW0gPSBudWxsOworICAgIH0KKyAgICAKKyAgICBtYXBGb3Ioa2luZCkKKyAgICB7Cisg
ICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9tYXAuZ2V0KGtpbmQpOworICAgICAgICBpZiAoIXJl
c3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQmFkIGtpbmQ6ICIgKyBraW5kKTsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgYWRkKHRoaW5nKQorICAg
IHsKKyAgICAgICAgaWYgKCF0aGluZy5uYW1lKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAg
ICAKKyAgICAgICAgaWYgKHRoaW5nLmlzTmF0aXZlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMu
X2ludHJpbnNpY3MpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOYXRpdmUgZnVu
Y3Rpb24gaW4gYSBzY29wZSB0aGF0IGRvZXMgbm90IHJlY29nbml6ZSBpbnRyaW5zaWNzIik7Cisg
ICAgICAgICAgICB0aGlzLl9pbnRyaW5zaWNzLmFkZCh0aGluZyk7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIGxldCBtYXAgPSBtYXBGb3IodGhpbmcua2luZCk7CisgICAgICAgIGlmIChu
YW1lYWJsZU92ZXJsb2FkYWJsZUtpbmRzLmhhcyh0aGluZy5raW5kKSkgeworICAgICAgICAgICAg
bGV0IGFycmF5ID0gbWFwLmdldCh0aGluZy5uYW1lKTsKKyAgICAgICAgICAgIGlmICghYXJyYXkp
CisgICAgICAgICAgICAgICAgbWFwLnNldCh0aGluZy5uYW1lLCBhcnJheSA9IFtdKTsKKyAgICAg
ICAgICAgIGFycmF5LnB1c2godGhpbmcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9
CisgICAgICAgIGlmIChtYXAuaGFzKHRoaW5nLm5hbWUpKQorICAgICAgICAgICAgdGhyb3cgbmV3
IEFMVHlwZUVycm9yKHRoaW5nLm9yaWdpbi5saW5lTnVtYmVyLCAiRHVwbGljYXRlIG5hbWU6ICIg
KyB0aGluZy5uYW1lKTsKKyAgICAgICAgbWFwLnNldCh0aGluZy5uYW1lLCB0aGluZyk7CisgICAg
fQorICAgIAorICAgIGdldChraW5kLCBuYW1lKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9
IG1hcEZvcihraW5kKS5nZXQobmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0ICYmIHRoaXMuX2Rl
bGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmdldChraW5kLCBuYW1l
KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZ2V0IGN1cnJlbnRT
dGF0ZW1lbnQoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQpCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudFN0YXRlbWVudDsKKyAgICAgICAgaWYgKHRo
aXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmN1cnJlbnRT
dGF0ZW1lbnQ7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBpc0RlZmlu
ZWQodGhpbmcpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fZGVmaW5lZC5oYXModGhpbmcp
CisgICAgICAgICAgICB8fCAodGhpcy5fZGVsZWdhdGUgJiYgdGhpcy5fZGVsZWdhdGUuaXNEZWZp
bmVkKHRoaW5nKSk7CisgICAgfQorICAgIAorICAgIGRlZmluZSh0aGluZykKKyAgICB7CisgICAg
ICAgIHRoaXMuX2RlZmluZWQuc2V0KHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZGVmaW5lQWxs
KCkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHRoaW5nIG9mIHRoaXMpCisgICAgICAgICAgICBk
ZWZpbmUodGhpbmcpOworICAgIH0KKyAgICAKKyAgICBkb1N0YXRlbWVudChzdGF0ZW1lbnQsIGNh
bGxiYWNrKQorICAgIHsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9IHN0YXRlbWVu
dDsKKyAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9
IG51bGw7CisgICAgICAgIGRlZmluZShzdGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICByZWNv
Z25pemVJbnRyaW5zaWNzKCkKKyAgICB7CisgICAgICAgIHRoaXMuX2ludHJpbnNpY3MgPSBuZXcg
SW50cmluc2ljcygpOworICAgIH0KKyAgICAKKyAgICBnZXQgaW50cmluc2ljcygpCisgICAgewor
ICAgICAgICBpZiAodGhpcy5faW50cmluc2ljcykKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9p
bnRyaW5zaWNzOworICAgICAgICBpZiAodGhpcy5fZGVsZWdhdGUpCisgICAgICAgICAgICByZXR1
cm4gdGhpcy5fZGVsZWdhdGUuaW50cmluc2ljczsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAg
fQorICAgIAorICAgIHNldCBwcm9ncmFtKHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5fcHJv
Z3JhbSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgcHJvZ3JhbSgpCisgICAgeworICAg
ICAgICBpZiAodGhpcy5fcHJvZ3JhbSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmFt
OworICAgICAgICBpZiAodGhpcy5fZGVsZWdhdGUpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5f
ZGVsZWdhdGUucHJvZ3JhbTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAg
ICpbU3ltYm9sLml0ZXJhdG9yXSgpCisgICAgeworICAgICAgICBmb3IgKGxldCBtYXAgb2YgdGhp
cy5fbWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICBmb3IgKGxldCB0eXBlIG9mIHRoaXMuX3R5
cGVzLnZhbHVlcygpKQorICAgICAgICAgICAgICAgIHlpZWxkIHR5cGU7CisgICAgICAgIH0KKyAg
ICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIG5hbWUsIGlzUHJpbWl0aXZlLCB0eXBlUGFyYW1ldGVycykKKyAgICB7CisgICAg
ICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7Cisg
ICAgICAgIHRoaXMuX2lzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7CisgICAgICAgIHRoaXMuX3R5
cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgfQorICAgIAorICAgIGdldCBvcmln
aW4oKSB7IHJldHVuciB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRo
aXMuX25hbWU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLl9pc1ByaW1p
dGl2ZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJh
bWV0ZXJzOyB9CisgICAgZ2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAg
IGluc3RhbnRpYXRlKG9yaWdpbiwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGlmICh0
eXBlQXJndW1lbnRzLmxlbmd0aCAhPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ubGluZU51bWJlciwgIldyb25nIG51
bWJlciBvZiB0eXBlIGFyZ3VtZW50cyB0byBpbnN0YW50aWF0aW9uIik7CisgICAgICAgIGlmICgh
dHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAg
cmV0dXJuIG5ldyBOYXRpdmVUeXBlSW5zdGFuY2UodGhpcywgb3JpZ2luLCB0eXBlQXJndW1lbnRz
KTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJu
YXRpdmUgIiArICh0aGlzLmlzUHJpbWl0aXZlID8gInByaW1pdGl2ZSAiIDogIiIpICsgInR5cGUg
IiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPiI7CisgICAgfQor
fQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5cGVJbnN0YW5jZSBl
eHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIG9yaWdpbiwgdHlwZUFyZ3VtZW50
cykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgICAgICB0aGlzLl9vcmln
aW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRz
OworICAgIH0KKyAgICAKKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAg
ICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IHR5cGVBcmd1
bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgCisgICAgdW5pZnlJ
bXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAodGhpcy50
eXBlICE9IG90aGVyLnR5cGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlm
ICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3Ro
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8
IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCF0aGlz
LnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlQXJn
dW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTm9kZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIE5vZGUgeworICAgIHZpc2l0KHZpc2l0b3IpCisgICAgeworICAgICAgICBsZXQgcmV0dXJu
VmFsdWUgPSB2aXNpdG9yWyJ2aXNpdCIgKyB0aGlzLmNvbnN0cnVjdG9yLm5hbWVdKHRoaXMpOwor
ICAgICAgICBpZiAoInJldHVyblZhbHVlIiBpbiB2aXNpdG9yKQorICAgICAgICAgICAgcmV0dXJu
IHZpc2l0b3IucmV0dXJuVmFsdWU7CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAgICB9
CisgICAgCisgICAgdW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAg
ICAgIGxldCB1bmlmeVRoaXMgPSB0aGlzLnVuaWZ5Tm9kZTsKKyAgICAgICAgbGV0IHVuaWZ5T3Ro
ZXIgPSBvdGhlci51bmlmeU5vZGU7CisgICAgICAgIGlmICh1bmlmeU90aGVyLnR5cGVWYXJpYWJs
ZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlUaGlzKSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICByZXR1cm4gdW5pZnlUaGlzLnVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNv
bnRleHQsIHVuaWZ5T3RoZXIpOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRp
b25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmIChvdGhlci50eXBlVmFyaWFibGVV
bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHRoaXMpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIHJldHVybiB0aGlzID09IG90aGVyOworICAgIH0KKyAgICAKKyAgICB0eXBlVmFy
aWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkgeyByZXR1cm4gdGhp
czsgfQorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAg
Z2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBlcXVhbHMob3RoZXIp
CisgICAgeworICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9u
Q29udGV4dCgpOworICAgICAgICByZXR1cm4gdGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyKSAmJiB1bmlmaWNhdGlvbkNvbnRleHQuaXNVbnVuaWZpZWQoKTsKKyAgICB9CisgICAg
CisgICAgc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3QpCisgICAgeworICAgICAg
ICBpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRMaXN0Lmxlbmd0aCkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBhbmQgYXJndW1lbnRzIGFyZSBtaXNtYXRj
aGVkIik7CisgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIG1hcC5zZXQocGFy
YW1ldGVyc1tpXSwgYXJndW1lbnRMaXN0W2ldKTsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXQo
bmV3IFN1YnN0aXR1dGlvbihtYXApKTsKKyAgICB9CisgICAgCisgICAgc3Vic3RpdHV0ZVRvVW5p
ZmljYXRpb24ocGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHN1YnN0aXR1dGUocGFyYW1ldGVycywgcGFyYW1ldGVycy5tYXAodHlwZSA9PiB1bmlm
aWNhdGlvbkNvbnRleHQuZmluZCh0eXBlKSkpOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1BhcnNlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QYXJzZXIu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2VyLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcGFyc2UodGV4dCkKK3sKKyAg
ICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIodGV4dCk7CisgICAgCisgICAgLy8gVGhlIGhhcmRlc3Qg
cGFydCBvZiBkZWFsaW5nIHdpdGggQy1saWtlIGxhbmd1YWdlcyBpcyBwYXJzaW5nIHZhcmlhYmxl
IGRlY2xhcmF0aW9uIHN0YXRlbWVudHMuCisgICAgLy8gTGV0J3MgY29uc2lkZXIgaWYgdGhpcyBo
YXBwZW5zIGluIEFycmF5TGFuZy4gSGVyZSBhcmUgdGhlIHZhbGlkIHN0YXRlbWVudHMgaW4gQXJy
YXlMYW5nIHRoYXQKKyAgICAvLyBiZWdpbiB3aXRoIGFuIGlkZW50aWZpZXIsIGlmIHdlIGFzc3Vt
ZSB0aGF0IGFueSBleHByZXNzaW9uIGNhbiBiZSBhIHN0YW5kYWxvbmUgc3RhdGVtZW50LgorICAg
IC8vCisgICAgLy8gICAgIHg7CisgICAgLy8gICAgIHggPGJpbm9wPiB5OworICAgIC8vICAgICB4
IDwgeTsKKyAgICAvLyAgICAgeCA8IHkgPiB6OworICAgIC8vICAgICB4ID0geTsKKyAgICAvLyAg
ICAgeC5mID0geTsKKyAgICAvLyAgICAgXGV4cCA9IHk7CisgICAgLy8gICAgIHhbNDJdID0geTsK
KyAgICAvLyAgICAgeCgpOworICAgIC8vICAgICB4PHk+KCk7CisgICAgLy8gICAgIHggeTsKKyAg
ICAvLyAgICAgeDx5PiB6OworICAgIC8vICAgICB4W10geTsKKyAgICAvLyAgICAgeFs0Ml0geTsK
KyAgICAvLyAgICAgeF4geTsKKyAgICAvLworICAgIC8vIFRoaXMgaGFzIHR3byBwcm9ibGVtIGFy
ZWFzOgorICAgIC8vCisgICAgLy8gICAgIC0geDx5PnogY2FuIHBhcnNlIHR3byBkaWZmZXJlbnQg
d2F5cyAoYXMgKHggPCB5KSA+IHogb3IgeDx5PiB6KS4KKyAgICAvLyAgICAgLSB4WzQyXSBjb3Vs
ZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4K
KyAgICAvLyAgICAgLSB4PHk+IGNvdWxkIGJlY29tZSBlaXRoZXIgYW4gYXNzaWdubWVudCBvciBh
IHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vCisgICAgLy8gV2Ugc29sdmUgdGhlIGZpcnN0
IHByb2JsZW0gYnkgZm9yYmlkZGluZyBleHByZXNzaW9ucyBhcyBzdGF0ZW1lbnRzLiBUaGUgbGFj
ayBvZiBmdW5jdGlvbgorICAgIC8vIHBvaW50ZXJzIG1lYW5zIHRoYXQgd2UgY2FuIHN0aWxsIGFs
bG93IGZ1bmN0aW9uIGNhbGwgc3RhdGVtZW50cyAtIHVubGlrZSBpbiBDLCB0aG9zZSBjYW5ub3QK
KyAgICAvLyBoYXZlIGFyYml0cmFyeSBleHByZXNzaW9ucyBhcyB0aGUgY2FsbGVlLiBUaGUgcmVt
YWluaW5nIHR3byBwcm9ibGVtcyBhcmUgc29sdmVkIGJ5CisgICAgLy8gYmFja3RyYWNraW5nLiBJ
biBhbGwgb3RoZXIgcmVzcGVjdHMsIHRoaXMgaXMgYSBzaW1wbGUgcmVjdXJzaXZlIGRlc2NlbnQg
cGFyc2VyLgorICAgIAorICAgIGZ1bmN0aW9uIG5ld05vZGUobm9kZSwgZGF0YSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBPYmplY3QuY3JlYXRlKG5vZGUsIGRhdGEpOworICAgIH0KKyAgICAKKyAg
ICAKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL1Byb2dyYW0uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTkgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7
CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50cyA9IFtdOworICAgICAgICB0aGlzLl9m
dW5jdGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVzID0gbmV3IE1hcCgpOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgdG9wTGV2ZWxTdGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5f
dG9wTGV2ZWxTdGF0ZW1lbnRzOyB9CisgICAgZ2V0IGZ1bmN0aW9ucygpIHsgcmV0dXJuIHRoaXMu
X2Z1bmN0aW9uczsgfQorICAgIGdldCB0eXBlcygpIHsgcmV0dXJuIHRoaXMuX3R5cGVzOyB9Cisg
ICAgCisgICAgYWRkVG9wTGV2ZWxTdGF0ZW1lbnQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAg
c3RhdGVtZW50LnByb2dyYW0gPSB0aGlzOworICAgICAgICBpZiAoc3RhdGVtZW50IGluc3RhbmNl
b2YgRnVuY3Rpb24pIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IHRoaXMuX2Z1bmN0aW9ucy5n
ZXQoc3RhdGVtZW50Lm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAgICAgICAgICAg
ICAgICB0aGlzLl9mdW5jdGlvbnMuc2V0KHN0YXRlbWVudC5uYW1lLCBhcnJheSA9IFtdKTsKKyAg
ICAgICAgICAgIGFycmF5LnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0
ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAgdGhpcy5fdHlwZXMuc2V0KHN0YXRl
bWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBu
ZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlvbiBvciB0eXBlOiAiICsgc3RhdGVt
ZW50KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsK
KyAgICB9CisgICAgCisgICAgcmVzb2x2ZUZ1bmN0aW9uT3ZlcmxvYWQobmFtZSwgdHlwZUFyZ3Vt
ZW50cywgYXJndW1lbnRUeXBlcykKKyAgICB7CisgICAgICAgIGxldCBmdW5jdGlvbnMgPSB0aGlz
LmZ1bmN0aW9ucy5nZXQobmFtZSk7CisgICAgICAgIGlmICghZnVuY3Rpb25zKQorICAgICAgICAg
ICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBwaHVuY3Rpb24gb2Yg
ZnVuY3Rpb25zKSB7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggJiYgdHlw
ZUFyZ3VtZW50cy5sZW5ndGggIT0gcGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudFR5cGVzLmxl
bmd0aCAhPSBwaHVuY3Rpb24ucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0
aW9uQ29udGV4dChwaHVuY3Rpb24udHlwZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgbGV0IG9r
ID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5s
ZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IHR5cGVBcmd1bWVu
dHNbaV07CisgICAgICAgICAgICAgICAgbGV0IHBhcmFtZXRlciA9IHBodW5jdGlvbi50eXBlUGFy
YW1ldGVyc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoKGFyZ3VtZW50IGluc3RhbmNlb2YgVHlw
ZSkgIT0gKHBhcmFtZXRlciBpbnN0YW5jZW9mIFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAg
IG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4
dCwgcGFyYW1ldGVyKSkgeworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAg
ICAgICAgICAgICAgaWYgKCFhcmd1bWVudFR5cGVzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4
dCwgcGh1bmN0aW9uLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAg
b2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0IHNob3VsZEJ1aWxkVHlw
ZUFyZ3VtZW50cyA9ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChzaG91
bGRCdWlsZFR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IFtd
OworICAgICAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBwaHVuY3Rpb24udHlwZVBh
cmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdW5pZmljYXRp
b25Db250ZXh0LmZpbmQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVB
cmd1bWVudCA9PSB0eXBlUGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFs
c2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgICAgICBpZiAoc2hvdWxkQnVpbGRUeXBlQXJndW1lbnRzKQorICAgICAgICAgICAgICAg
ICAgICB0eXBlQXJndW1lbnRzLnB1c2godHlwZUFyZ3VtZW50KTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICByZXR1cm4ge3BodW5jdGlvbiwgdW5pZmljYXRpb25Db250ZXh0LCB0eXBlQXJndW1lbnRzfTsK
KyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAor
ICAgIGdldCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE5h
bWVDb250ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiB0aGlzLnRvcExldmVs
U3RhdGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3Rv
Y29sLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2wgZXh0ZW5kcyBOb2RlIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4g
PSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBn
ZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJl
dHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBQcm90b2NvbDsgfQor
ICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7Cisg
ICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xEZWNsIGV4dGVuZHMgUHJvdG9jb2wgewor
ICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdp
biwgbmFtZSkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdOworICAgICAgICB0aGlzLl9z
aWduYXR1cmVNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVWYXJpYWJsZSA9IG5l
dyBUeXBlVmFyaWFibGUob3JpZ2luLCBuYW1lLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgYWRk
U2lnbmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAgICAgIC8vIE5PVEU6IEFueSB0eXBlIHBh
cmFtZXRlcnMgZm91bmQgaW4gdGhlIHNpZ25hdHVyZSBtdXN0IGJlIGluZmVyYWJsZSBmcm9tIHRo
ZSB2YWx1ZQorICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAgICAgICAvLyBGSVhNRTogQ2hlY2sg
dGhpcyEgKE9PUFMhKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlKTsK
KyAgICAgICAgbGV0IG92ZXJsb2FkcyA9IHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQoc2lnbmF0dXJl
Lm5hbWUpOworICAgICAgICBpZiAoIW92ZXJsb2FkcykKKyAgICAgICAgICAgIHRoaXMuX3NpZ25h
dHVyZU1hcC5zZXQoc2lnbmF0dXJlLm5hbWUsIG92ZXJsb2FkcyA9IFtdKTsKKyAgICAgICAgb3Zl
cmxvYWRzLnB1c2goc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHNpZ25hdHVyZXMo
KSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVzOyB9CisgICAgc2lnbmF0dXJlc0J5TmFtZShuYW1l
KSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVNYXAuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IHR5cGVW
YXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGVWYXJpYWJsZTsgfQorICAgIAorICAgIGluaGVy
aXRzKG90aGVyUHJvdG9jb2wpCisgICAgeworICAgICAgICBpZiAoIW90aGVyUHJvdG9jb2wpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChvdGhlclByb3Rv
Y29sIGluc3RhbmNlb2YgUHJvdG9jb2xSZWYpCisgICAgICAgICAgICBvdGhlclByb3RvY29sID0g
b3RoZXJQcm90b2NvbC5wcm90b2NvbERlY2w7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBv
dGhlclNpZ25hdHVyZSBvZiBvdGhlclByb3RvY29sLnNpZ25hdHVyZXMpIHsKKyAgICAgICAgICAg
IGxldCBzaWduYXR1cmVzID0gdGhpcy5zaWduYXR1cmVzQnlOYW1lKG90aGVyU2lnbmF0dXJlLm5h
bWUpOworICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVzKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9y
IChsZXQgc2lnbmF0dXJlIDogc2lnbmF0dXJlcykgeworICAgICAgICAgICAgICAgIGlmIChzaWdu
YXR1cmUucGFyYW1ldGVycy5sZW5ndGggIT0gb3RoZXJTaWduYXR1cmUucGFyYW1ldGVycy5sZW5n
dGgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIAorICAg
ICAgICAgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHNpZ25hdHVyZS50eXBlUGFyYW1ldGVy
cy5jb25jYXQodGhpcy50eXBlVmFyaWFibGUpOworICAgICAgICAgICAgICAgIGxldCB1bmlmaWNh
dGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KHR5cGVQYXJhbWV0ZXJzKTsKKyAg
ICAgICAgICAgICAgICBsZXQgb2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgc2lnbmF0dXJlLnBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAg
ICAgICAgICAgaWYgKCFzaWduYXR1cmUucGFyYW1ldGVyc1tpXS50eXBlLnVuaWZ5KG90aGVyU2ln
bmF0dXJlLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9r
ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW9rKQorICAg
ICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZmljYXRp
b25Db250ZXh0LnZlcmlmeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBzdWJzdGl0dXRl
ZFJldHVyblR5cGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLnJldHVyblR5
cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
dHlwZVBhcmFtZXRlcnMsIHVuaWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAg
IGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhvdGhlclNpZ25hdHVyZS5yZXR1cm5U
eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAg
ICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAg
ICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkK
KyAgICB7CisgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIG1hcC5zZXQodGhp
cy5fdHlwZVZhcmlhYmxlLCB0eXBlKTsKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IG5ldyBT
dWJzdGl0dXRpb24obWFwKTsKKyAgICAgICAgZm9yIChsZXQgYWJzdHJhY3RTaWduYXR1cmUgb2Yg
dGhpcy5fc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZSA9IHNpZ25hdHVy
ZS52aXNpdChzdWJzdGl0dXRpb24pOworICAgICAgICAgICAgbGV0IG92ZXJsb2FkID0gdGhpcy5w
cm9ncmFtLnJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKHNpZ25hdHVyZS5uYW1lLCBbXSwgc2lnbmF0
dXJlLnBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgICAgIGlmICghb3ZlcmxvYWQpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBsZXQgc3Vi
c3RpdHV0ZWRSZXR1cm5UeXBlID0gb3ZlcmxvYWQucGh1bmN0aW9uLnJldHVyblR5cGUuc3Vic3Rp
dHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAgb3ZlcmxvYWQucGh1bmN0aW9uLnR5
cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlvbkNvbnRleHQpOworICAgICAgICAgICAg
aWYgKCFzdWJzdGl0dXRlZFJldHVyblR5cGUuZXF1YWxzKHNpZ25hdHVyZS5yZXR1cm5UeXBlKSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVy
biAicHJvdG9jb2wgIiArIHRoaXMubmFtZSArICIgeyAiICsgdGhpcy5zaWduYXR1cmVzLmpvaW4o
IjsgIikgKyAiOyB9IjsKKyAgICB9Cit9CisKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJv
dG9jb2xSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xSZWYu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xSZWYuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2NvbFJlZiBleHRl
bmRzIFByb3RvY29sIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAg
ICAgICBzdXBlcihvcmlnaW4sIG5hbWUpOworICAgICAgICB0aGlzLnByb3RvY29sRGVjbCA9IG51
bGw7CisgICAgfQorICAgIAorICAgIGluaGVyaXRzKG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMucHJvdG9jb2xEZWNsLmluaGVyaXRzKG90aGVyKTsKKyAgICB9CisgICAgCisgICAg
aGFzSGVpcih0eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvdG9jb2xEZWNsLmhh
c0hlaXIodHlwZSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBQdHJUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7Cisg
ICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc1NwYWNlICsg
IiAiICsgdGhpcy5lbGVtZW50VHlwZSArICJeIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvUmVmZXJlbmNlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9S
ZWZlcmVuY2VUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgUmVmZXJlbmNlVHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
YWRkcmVzc1NwYWNlLCBlbGVtZW50VHlwZSkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlQWRkcmVz
c1NwYWNlKGFkZHJlc3NTcGFjZSk7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAg
ICAgICAgdGhpcy5fYWRkcmVzc1NwYWNlID0gYWRkcmVzc1NwYWNlOworICAgICAgICB0aGlzLl9l
bGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkg
eyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGFkZHJlc3NTcGFjZSgpIHsgcmV0dXJu
IHRoaXMuX2FkZHJlc3NTcGFjZTsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRo
aXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gZmFsc2U7
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7
CisgICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yICE9IG90aGVyLmNvbnN0cnVjdG9yKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51
bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9Cit9CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9SZXR1cm4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
UmV0dXJuLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV0
dXJuIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB2YWx1ZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2
YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ7ICIgKyB0aGlzLnN0YXRlbWVudHMu
am9pbigiOyAiKTsgKyAiOyB9IjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9SZXdyaXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXdyaXRlciB7CisgICAgdmlz
aXRGdW5jdGlvbihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbigKKyAg
ICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KHRoaXMpLAorICAgICAg
ICAgICAgbm9kZS50eXBlUGFyYW1ldGVycy5tYXAodHlwZVBhcm1ldGVyID0+IHR5cGVQYXJhbWV0
ZXIudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0
ZXIgPT4gcGFyYW1ldGVyLnZpc2l0KHRoaXMpKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVu
Y3Rpb25QYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25B
cmd1bWVudChub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgQmxv
Y2sobm9kZS5vcmlnaW4pOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0
ZW1lbnRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChzdGF0ZW1lbnQudmlzaXQodGhpcykpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sUmVm
KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFR5cGVSZWYo
bm9kZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50eXBlQXJndW1lbnRzLm1hcCh0eXBlQXJndW1l
bnQgPT4gdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgICAgIHJlc3VsdC50eXBlID0g
bm9kZS50eXBlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNp
dFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQor
ICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5ldyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUub3JpZ2luLCBub2RlLm5h
bWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0RmllbGQo
bm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGQobm9kZS5vcmlnaW4sIG5vZGUu
bmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZl
cmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IG5vZGUuY29uc3RydWN0
b3Iobm9kZS5yb2dpaW4sIG5vZGUuYWRkcmVzc1NwYWNlLCBub2RlLmVsZW1lbnRUeXBlLnZpc2l0
KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJUeXBlKG5vZGUpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy52aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0QXJyYXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy52
aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlUeXBl
KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShub2RlLm9yaWdpbiwg
bm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXNz
aWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3NpZ25tZW50KG5vZGUu
b3JpZ2luLCBub2RlLmxocy52aXNpdCh0aGlzKSwgbm9kZS5yaHMudmlzaXQodGhpcykpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgICAgICByZXR1
cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAg
ICAgIHJldHVybiBuZXcgUmV0dXJuKG5vZGUub3JpZ2luLCBub2RlLnZhbHVlID8gbm9kZS52YWx1
ZS52aXNpdCh0aGlzKSA6IG51bGwpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEludExpdGVyYWwo
bm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIHZpc2l0Q2Fs
bEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ2FsbEV4cHJlc3Np
b24oCisgICAgICAgICAgICBub2RlLm9yaWdpbiwgbm9kZS5uYW1lLAorICAgICAgICAgICAgbm9k
ZS50eXBlQXJndW1lbnRzLm1hcCh0eXBlQXJndW1lbnQgPT4gdHlwZUFyZ3VtZW50LnZpc2l0KHRo
aXMpKSwKKyAgICAgICAgICAgIG5vZGUuYXJndW1lbnRsaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1
bWVudC52aXNpdCh0aGlzKSkpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
U3RydWN0VHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdHJ1Y3RUeXBlIGV4dGVu
ZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycykK
KyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7
CisgICAgICAgIHRoaXMuX2ZpZWxkcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgYWRk
RmllbGQoZmllbGQpCisgICAgeworICAgICAgICBpZiAodGhpcy5fZmllbGRzLmhhcyhmaWVsZC5u
YW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihmaWVsZC5vcmlnaW4ubGlu
ZU51bWJlciwgIkR1cGxpY2F0ZSBmaWVsZCBuYW1lOiAiICsgZmllbGQubmFtZSk7CisgICAgICAg
IHRoaXMuX2ZpZWxkcy5zZXQoZmllbGQubmFtZSwgZmllbGQpOworICAgIH0KKyAgICAKKyAgICBn
ZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMo
KSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAgIGdldCBmaWVsZE5h
bWVzKCkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmtleXMoKTsgfQorICAgIGZpZWxkQnlOYW1lKG5h
bWUpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy5nZXQobmFtZSk7IH0KKyAgICBnZXQgZmllbGRzKCkg
eyByZXR1cm4gdGhpcy5fZmllbGRzLnZhbHVlcygpOyB9CisgICAgZ2V0IGZpZWxkTWFwKCkgeyBy
ZXR1cm4gdGhpcy5fZmllbGRzOyB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7
CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChs
ZXQgdHlwZVBhcmFtZXRlciBvZiB0aGlzLnR5cGVQYXJhbWV0ZXJzKQorICAgIH0KKyAgICAKKyAg
ICBpbnN0YW50aWF0ZShvcmlnaW4sIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBpZiAo
dHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gdGhpcy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAg
ICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLmxpbmVOdW1iZXIsICJXcm9uZyBu
dW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICAKKyAg
ICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIAorICAg
ICAgICBsZXQgbWFwID0gbmV3IE1hcCgpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5
cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBtYXAuc2V0KHRoaXMudHlwZVBh
cmFtZXRlcnNbaV0sIHR5cGVBcmd1bWVudHNbaV0pOworICAgICAgICAKKyAgICAgICAgY2xhc3Mg
U3Vic3RpdHV0ZSBleHRlbmRzIFJld3JpdGVyIHsKKyAgICAgICAgICAgIHZpc2l0VHlwZVZhcmlh
YmxlKG5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9
CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuICJzdHJ1Y3QgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMg
KyAiPiB7ICIgKyBBcnJheS5mcm9tKHRoaXMuZmllbGRzKS5qb2luKCI7ICIpICsgIjsgfSI7Cisg
ICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBTdWJzdGl0dXRpb24gZXh0ZW5kcyBSZXdyaXRlciB7Cisg
ICAgY29uc3RydWN0b3IobWFwKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbWFwOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBs
YWNlbWVudCA9IHRoaXMuX21hcC5nZXQobm9kZS50eXBlKTsKKyAgICAgICAgaWYgKHJlcGxhY2Vt
ZW50KSB7CisgICAgICAgICAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAg
ICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBhcmd1bWVudHMgb24g
dHlwZSB2YXJpYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAg
ICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOwor
ICAgIH0KKworICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBy
ZXBsYWNlbWVudCA9IHRoaXMuX21hcC5nZXQobm9kZS52YXJpYWJsZSk7CisgICAgICAgIGlmIChy
ZXBsYWNlbWVudCkKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgCisg
ICAgICAgIHJldHVybiBzdXBlci52aXNpdFZhcmlhYmxlUmVmKG5vZGUpOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9UeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlIGV4dGVu
ZHMgTm9kZSB7CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gW107IH0KKyAgICBn
ZXQga2luZCgpIHsgcmV0dXJuIFR5cGU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkK
KyAgICB7CisgICAgICAgIHJldHVybiBwcm90b2NvbC5oYXNIZWlyKHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICBpbnN0YW50aWF0ZWRUeXBlKG5hbWVDb250ZXh0KSB7IHJldHVybiB0aGlzOyB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZURlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9UeXBlRGVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgVHlwZURlZiBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwg
dHlwZVBhcmFtZXRlcnMsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmln
aW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlUGFyYW1l
dGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdl
dCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygp
IHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVy
biB0aGlzLl90eXBlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVJlZiBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVj
dG9yKG9yaWdpbiwgbmFtZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29y
aWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMu
dHlwZSA9IG51bGw7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRz
OworICAgIH0KKyAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVBcmd1bWVu
dHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZl
KCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICAvLyBVc2UgdGhpcyB0byBleHBsb3JlIHBy
b3BlcnRpZXMgb2YgdGhlIGluc3RhbnRpYXRlZCB0eXBlLCBidXQgdHJ5IG5vdCB0byBrZWVwIGl0
IGFyb3VuZC4KKyAgICBpbnN0YW50aWF0ZWRUeXBlKG5hbWVDb250ZXh0KQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMudHlwZS5pbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IHVuaWZ5Tm9kZSgpCisgICAgeworICAgICAgICBpZiAoIXRoaXMudHlwZUFy
Z3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnVuaWZ5Tm9kZTsK
KyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAorICAgIHNldFR5cGVBbmRBcmd1bWVu
dHModHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSB0eXBl
Lm5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1
bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgVHlwZVJlZikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhp
cy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9
IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsr
aSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIg
KyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9UeXBlVmFyaWFibGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZVZhcmlhYmxlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVW
YXJpYWJsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5
cGVWYXJpYWJsZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwg
cHJvdG9jb2wpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAg
IHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9wcm90b2NvbCA9IHByb3RvY29sOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBn
ZXQgcHJvdG9jb2woKSB7IHJldHVybiB0aGlzLl9wcm90b2NvbDsgfQorICAgIAorICAgIGdldCBp
c1ByaW1pdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fcHJvdG9jb2wgJiYgdGhp
cy5fcHJvdG9jb2wuaXNQcmltaXRpdmU7CisgICAgfQorICAgIAorICAgIGdldCBpc1VuaWZpYWJs
ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7
CisgICAgICAgIGlmICghcHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhwcm90b2NvbCk7CisgICAgfQorICAgIAor
ICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgewor
ICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAg
ICAgICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMu
dW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICB1bmlm
aWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNv
bnRleHQsIG90aGVyKTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNh
dGlvbkNvbnRleHQpCisgICAgeworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNv
bnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSB0aGluZyB3ZSBnZXQg
dW5pZmllZCB3aXRoIG11c3QgYmUgYSB0eXBlIHZhcmlhYmxlIHRoYXQgYWNjZXB0cyBhIGJyb2Fk
ZXIgc2V0IG9mCisgICAgICAgIC8vIHRoaW5ncyB0aGFuIHdlIGRvLgorICAgICAgICBpZiAoIShy
ZWFsVGhpcyBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgCisgICAgICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJl
dHVybiAhcmVhbFRoaXMucHJvdG9jb2w7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5w
cm90b2NvbC5pbmhlcml0cyhyZWFsVGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHZl
cmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmICgh
dGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4g
dW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcykuaW5oZXJpdHModGhpcy5wcm90b2NvbCk7Cisg
ICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5h
bWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRl
eHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4
dC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFVuaWZpY2F0
aW9uQ29udGV4dCB7CisgICAgY29uc3RydWN0b3IodHlwZVBhcmFtZXRlcnMpCisgICAgeworICAg
ICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IG5ldyBTZXQodHlwZVBhcmFtZXRlcnMpOworICAg
ICAgICB0aGlzLl9uZXh0TWFwID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICB1bmlvbihh
LCBiKQorICAgIHsKKyAgICAgICAgYSA9IGZpbmQoYSk7CisgICAgICAgIGIgPSBmaW5kKGIpOwor
ICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAg
ICAgaWYgKCFiLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgW2EsIGJdID0gW2IsIGFdOworICAg
ICAgICBpZiAoIWEuaXNVbmlmaWFibGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNh
bm5vdCB1bmlmeSBub24tdW5pZmlhYmxlIHRoaW5ncyAiICsgYSArICIgYW5kICIgKyBiKTsKKyAg
ICAgICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHR5cGUgcGFyYW1ldGVycyBkb24ndCBl
bmQgdXAgYmVpbmcgcm9vdHMuCisgICAgICAgIGlmIChhLmlzVW5pZmlhYmxlICYmIGIuaXNVbmlm
aWFibGUgJiYgdGhpcy5fdHlwZVBhcmFtZXRlcnMuaGFzKGIpKQorICAgICAgICAgICAgW2EsIGJd
ID0gW2IsIGFdOworCisgICAgICAgIHRoaXMuX25leHRNYXAuc2V0KGEsIGIpOworICAgIH0KKyAg
ICAKKyAgICBmaW5kKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBub2Rl
OworICAgICAgICBsZXQgbmV4dE5vZGUgPSB0aGlzLl9uZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7
CisgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7
CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbmV4dE5vZGU7
CisgICAgICAgICAgICBuZXh0Tm9kZSA9IHRoaXMuX25leHRNYXAuZ2V0KGN1cnJlbnROb2RlKTsK
KyAgICAgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQobm9kZSwgY3VycmVudE5vZGUpOworICAg
ICAgICByZXR1cm4gY3VycmVudE5vZGU7CisgICAgfQorICAgIAorICAgIGdldCBub2RlcygpCisg
ICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFNldCgpOworICAgICAgICBmb3IgKGxldCBb
a2V5LCB2YWx1ZV0gb2YgdGhpcy5fbmV4dE1hcCkgeworICAgICAgICAgICAgcmVzdWx0LmFkZChr
ZXkpOworICAgICAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5KCkKKyAgICB7CisgICAgICAg
IGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhpcy5fdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAg
ICAgICAgIGlmICghdHlwZVBhcmFtZXRlci52ZXJpZnlBc1BhcmFtZXRlcih0aGlzKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChsZXQgdHlw
ZUFyZ3VtZW50IG9mIHRoaXMubm9kZXMpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLl90eXBlUGFy
YW1ldGVycy5oYXModHlwZUFyZ3VtZW50KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50LnZlcmlmeUFzQXJndW1lbnQodGhpcykpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKyAgICAKKyAgICBpc1VudW5pZmllZCgpCisgICAgeworICAgICAgICByZXR1cm4g
IXRoaXMuX25leHRNYXAuc2l6ZSgpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvVmFsdWUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWYWx1ZSBleHRlbmRzIE5vZGUgeworICAgIGdl
dCBraW5kKCkgeyByZXR1cm4gVmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVy
biBmYWxzZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhcmlhYmxlUmVmIGV4dGVuZHMgRXhwcmVzc2lv
biB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIo
b3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFyaWFi
bGUgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25h
bWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0aGlzLnZhcmlhYmxlLmlzQ29u
c3RleHByOyB9CisgICAgZ2V0IHVuaWZ5Tm9kZSgpIHsgcmV0dXJuIHRoaXMudmFyaWFibGUudW5p
ZnlOb2RlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBWaXNpdG9yIHsKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAg
ICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50
cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRGdW5jdGlvbihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0
KHRoaXMpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFt
ZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBm
b3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1l
dGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uUGFyYW1ldGVy
KG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc2l0RnVuY3Rpb25EZWYobm9kZSkKKyAgICB7CisgICAgICAgIHZpc2l0RnVuY3Rp
b24obm9kZSk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9m
IG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICB9CisgICAg
CisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHNp
Z25hdHVyZSBvZiBub2RlLnNpZ25hdHVyZXMpCisgICAgICAgICAgICBzaWduYXR1cmUudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAg
ICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXROYXRp
dmVUeXBlKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW10ZXIgb2Ygbm9k
ZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7
CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZURlZihub2RlKQorICAgIHsKKyAgICAgICAgZm9y
IChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAg
dHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAgICAg
IGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAg
ICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IGZpZWxkIG9m
IG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2
aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlw
ZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGaWVsZChub2RlKQorICAgIHsK
KyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEVs
ZW1lbnRhbFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUuZWxlbWVudFR5cGUudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAgIHsKKyAgICAg
ICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0
QXJyYXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlw
ZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgICAgICBub2RlLm51bUVs
ZW1lbnRzLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9k
ZSkKKyAgICB7CisgICAgICAgIG5vZGUubGhzLnZpc2l0KHRoaXMpOworICAgICAgICBub2RlLnJo
cy52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQor
ICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAg
IGlmIChub2RlLnZhbHVlKQorICAgICAgICAgICAgbm9kZS52YWx1ZS52aXNpdCh0aGlzKTsKKyAg
ICB9CisgICAgCisgICAgdmlzdEludExpdGVyYWwobm9kZSkKKyAgICB7CisgICAgfQorICAgIAor
ICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5
cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1l
bnQudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IGFyZ3VtZW50IG9mIG5vZGUuYXJndW1l
bnRMaXN0KQorICAgICAgICAgICAgYXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorfQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319122</attachid>
            <date>2017-08-25 17:57:22 -0700</date>
            <delta_ts>2017-08-26 11:48:54 -0700</delta_ts>
            <desc>started writing the parser</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>123110</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gdmFs
aWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAgIHN3aXRjaCAoYWRkcmVzc1Nw
YWNlKSB7CisgICAgY2FzZSAiY29uc3RhbnQiOgorICAgIGNhc2UgImRldmljZSI6CisgICAgY2Fz
ZSAidGhyZWFkZ3JvdXAiOgorICAgIGNhc2UgInRocmVhZCI6CisgICAgICAgIHJldHVybjsKKyAg
ICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBhZGRyZXNzIHNwYWNlOiAi
ICsgYWRkcmVzc1NwYWNlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9BcnJh
eVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlSZWZUeXBl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5UmVmVHlwZSBl
eHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1FbGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlw
ZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAg
CisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVt
ZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1l
bnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxlbWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUo
KSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9T
dHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0
aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2Vv
ZiBBcnJheVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgaWYgKCF0aGlzLm51bUVsZW1lbnRzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIu
bnVtRWxlbWVudHMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci5lbGVtZW50VHlwZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Bc3Np
Z25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFzc2lnbm1lbnQgZXh0ZW5kcyBF
eHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0
aGlzLl9yaHMgPSByaHM7CisgICAgfQorICAgIAorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlz
Ll9saHM7IH0KKyAgICBnZXQgcmhzKCkgeyByZXR1cm4gdGhpcy5fcmhzOyB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsgIiA9ICIgKyB0aGlz
LnJoczsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIEJsb2NrIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9z
dGF0ZW1lbnRzID0gW107CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICBhZGQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAg
dGhpcy5fc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIGdldCBz
dGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fc3RhdGVtZW50czsgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAieyAiICsgdGhpcy5zdGF0ZW1lbnRzLmpvaW4o
IjsgIik7ICsgIjsgfSI7CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2Fs
bEV4cHJlc3Npb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEV4cHJl
c3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEV4cHJlc3Np
b24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDYWxsRXhw
cmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFt
ZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgc3VwZXIob3Jp
Z2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1
bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgICAgICB0aGlzLl9hcmd1bWVudExpc3QgPSBhcmd1
bWVudExpc3Q7CisgICAgICAgIHRoaXMucGh1bmN0aW9uID0gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVBcmd1bWVu
dHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGFyZ3VtZW50TGlz
dCgpIHsgcmV0dXJuIHRoaXMuX2FyZ3VtZW50TGlzdDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVu
dHMgKyAiPigiICsgdGhpcy5hcmd1bWVudExpc3QgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9DaGVja2VyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0NoZWNrZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tl
ci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDaGVja2Vy
IGV4dGVuZHMgVmlzaXRvciB7CisgICAgLy8gSXQncyB0b3RhbGx5IE9LIHRvIGluc3RhbnRpYXRl
IHRoaXMgd2l0aCB6ZXJvIGFyZ3VtZW50cyAoaS5lLiBwYXNzaW5nIHVuZGVmaW5lZCBmb3IgYm90
aCBvZgorICAgIC8vIHRoZW0pIGlmIHlvdSdyZSBjcmVhdGluZyBhIENoZWNrZXIgdG8gdmlzaXQg
YSBQcm9ncmFtLgorICAgIGNvbnN0cnVjdG9yKG5hbWVDb250ZXh0KQorICAgIHsKKyAgICAgICAg
dGhpcy5fbmFtZUNvbnRleHQgPSBuYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQ
cm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNv
bnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5wcm9ncmFtID0g
bm9kZTsKKyAgICAgICAgbmFtZUNvbnRleHQucmVjb2duaXplSW50cmluc2ljcygpOworICAgICAg
ICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAg
ICAgICBuYW1lQ29udGV4dC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBu
ZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBu
b2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmRvU3RhdGVt
ZW50KCgpID0+IHN0YXRlbWVudC52aXNpdChjaGVja2VyKSk7CisgICAgfQorICAgIAorICAgIF92
aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2RlKQorICAgIHsKKyAgICAg
ICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsK
KyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7
CisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAg
ICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBu
YW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvbihub2RlKQorICAgIHsK
KyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcih0aGlzLl92aXNpdFR5cGVQYXJhbWV0
ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2RlKSk7CisgICAgICAgIG5vZGUucmV0dXJuVHlwZS52
aXNpdChjaGVja2VyKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1l
dGVycykKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRGdW5jdGlvbkRlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNvbnRleHRX
aXRoVHlwZVBhcmFtZXRlcnMgPSB0aGlzLl92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1l
Q29udGV4dChub2RlKTsKKyAgICAgICAgbGV0IGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMgPSBu
ZXcgQ2hlY2tlcihjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5yZXR1
cm5UeXBlLnZpc2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMpOworICAgICAgICBsZXQgY29u
dGV4dFdpdGhQYXJhbWV0ZXJzID0gbmV3IE5hbWVDb250ZXh0KGNvbnRleHRXaXRoVHlwZVBhcmFt
ZXRlcnMpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKSB7
CisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7
CisgICAgICAgICAgICBjb250ZXh0V2l0aFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CisgICAg
ICAgIH0KKyAgICAgICAgbGV0IGNoZWNrZXJXaXRoUGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNv
bnRleHRXaXRoUGFyYW1ldGVycyk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdChjaGVja2VyV2l0
aFBhcmFtZXRlcnMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgewor
ICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5ldyBOYW1lQ29udGV4dCh0aGlzLl9u
YW1lQ29udGV4dCkpOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1l
bnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc2ln
bmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNldCA9IG5ldyBT
ZXQoKTsKKyAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnNpZGVyKHRoaW5nKQorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIGlmICh0aGluZy5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgICAg
ICAgICAgc2V0LmFkZCh0aGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGFzcyBO
b3RpY2VUeXBlVmFyaWFibGUgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAgICAgICAgICAgICB2aXNp
dFR5cGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNv
bnNpZGVyKG5vZGUudHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZp
c2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
ICAgIGNvbnNpZGVyKG5vZGUudmFyaWFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGxldCBub3RpY2VUeXBlVmFyaWFibGUgPSBuZXcgTm90aWNlVHlw
ZVZhcmlhYmxlKCk7CisgICAgICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXJUeXBlIG9mIHNpZ25h
dHVyZS5wYXJhbWV0ZXJUeXBlcykKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlLnZpc2l0
KG5vdGljZVR5cGVWYXJpYWJsZSk7CisgICAgICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVy
IG9mIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIGlmICghc2V0
Lmhhcyh0eXBlUGFyYW1ldGVyKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgQUxUeXBlRXJy
b3IodHlwZVBhcmFtZXRlci5vcmlnaW4ubGluZU51bWJlciwgIlR5cGUgcGFyYW1ldGVyIHRvIHBy
b3RvY29sIHNpZ25hdHVyZSBub3QgaW5mZXJyYWJsZSBmcm9tIHZhbHVlIHBhcmFtZXRlcnMiKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbGV0IG5hbWVDb250
ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgbmFtZUNv
bnRleHQuYWRkKG5vZGUudHlwZVZhcmlhYmxlKTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcg
Q2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBub2Rl
LnNpZ25hdHVyZXMpCisgICAgICAgICAgICBzaWduYXR1cmUudmlzaXQoY2hlY2tlcik7CisgICAg
fQorICAgIAorICAgIHZpc2l0VHlwZURlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVD
b250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9y
IChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAg
ICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRk
KHR5cGVQYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENo
ZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBub2RlLnR5cGUudmlzaXQoY2hlY2tlcik7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgbmFtZUNvbnRl
eHQuYWRkKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyID0g
bmV3IENoZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBub2Rl
LmZpZWxkcykKKyAgICAgICAgICAgIGZpZWxkLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCB0eXBlID0gdGhpcy5f
bmFtZUNvbnRleHQuZ2V0KFR5cGUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghdHlwZSkKKyAg
ICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAi
Q291bGQgbm90IGZpbmQgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgaWYgKCF0
aGlzLl9uYW1lQ29udGV4dC5pc0RlZmluZWQodHlwZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcg
QUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIklsbGVnYWwgZm9yd2FyZCB1c2Ug
b2YgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS50eXBlID0gdHlwZTsK
KyAgICAgICAgCisgICAgICAgIGlmICh0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSBub2Rl
LnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9y
KG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMi
KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0
aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgcGFyYW1ldGVySXNUeXBlID0gdHlwZS50eXBlUGFy
YW1ldGVyc1tpXSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZTsKKyAgICAgICAgICAgIGxldCBhcmd1
bWVudElzVHlwZSA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIFR5cGU7CisgICAg
ICAgICAgICBpZiAocGFyYW1ldGVySXNUeXBlICYmICFhcmd1bWVudElzVHlwZSkKKyAgICAgICAg
ICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIkV4
cGVjdGVkIHR5cGUsIGJ1dCBnb3QgdmFsdWUgYXQgYXJndW1lbnQgIyIgKyBpKTsKKyAgICAgICAg
ICAgIGlmICghcGFyYW1ldGVySXNUeXBlICYmIGFyZ3VtZW50SXNUeXBlKQorICAgICAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiRXhwZWN0
ZWQgdmFsdWUsIGJ1dCBnb3QgdHlwZSBhdCBhcmd1bWVudCAjIiArIGkpOworICAgICAgICAgICAg
aWYgKCFhcmd1bWVudElzVHlwZSkgeworICAgICAgICAgICAgICAgIGlmICghbm9kZS50eXBlQXJn
dW1lbnRzW2ldLmlzQ29uc3RFeHByKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxU
eXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIkV4cGVjdGVkIGNvbnN0ZXhwciB2YWx1
ZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdXBlci52
aXNpdFR5cGVSZWYobm9kZSk7CisgICAgICAgIAorICAgICAgICB3aGlsZSAobm9kZS50eXBlIGlu
c3RhbmNlb2YgVHlwZURlZikgeworICAgICAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9
IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQobm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzKTsKKyAgICAg
ICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlwZS50eXBlUGFy
YW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhcmd1bWVu
dC9wYXJhbWV0ZXIgbWlzbWF0Y2ggKHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGVhcmxpZXIpIik7
CisgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5n
dGg7ICsraSkKKyAgICAgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5p
ZmljYXRpb25Db250ZXh0LCBub2RlLnR5cGUudHlwZVBhcmFtZXRlcnNbaV0pOworICAgICAgICAg
ICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJUeXBlIHJlZmVyZW5j
ZSB0byBhIHR5cGUgZGVmaW5pdGlvbiB2aW9sYXRlcyBwcm90b2NvbCBjb25zdHJhaW50cyIpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBub2RlLnR5cGUgPSBub2RlLnR5cGUuc3Vic3RpdHV0
ZVRvVW5pZmljYXRpb24obm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzLCB1bmlmaWNhdGlvbkNvbnRl
eHQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2Rl
KQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMu
X25hbWVDb250ZXh0KTsKKyAgICAgICAgbmFtZUNvbnRleHQuZGVmaW5lQWxsKCk7CisgICAgICAg
IG5vZGUuZWxlbWVudFR5cGUudmlzaXQobmV3IENoZWNrZXIobmFtZUNvbnRleHQpKTsKKyAgICAg
ICAgCisgICAgICAgIGlmIChub2RlLmFkZHJlc3NTcGFjZSA9PSAidGhyZWFkIikKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGNsYXNzIEluc3RhbnRpYXRlSW1tZWRpYXRl
cyBleHRlbmRzIFJld3JpdGVyIHsKKyAgICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAg
ICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vZGUgPSBzdXBlci52aXNpdFR5cGVSZWYobm9k
ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuaW5zdGFudGlhdGVkVHlwZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5v
ZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghbm9kZS5lbGVtZW50VHlw
ZS52aXNpdChuZXcgSW5zdGFudGlhdGVJbW1lZGlhdGVzKCkpLmlzUHJpbWl0aXZlKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJJbGxl
Z2FsIHBvaW50ZXIgdG8gbm9uLXByaW1pdGl2ZSB0eXBlIik7CisgICAgfQorICAgIAorICAgIHZp
c2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGxoc1R5cGUgPSBub2RlLmxo
cy52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IHJoc1R5cGUgPSBub2RlLnJocy52aXNpdCh0aGlz
KTsKKyAgICAgICAgaWYgKCFsaHNUeXBlLmVxdWFscyhyaHNUeXBlKSkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiVHlwZSBtaXNtYXRj
aCBpbiBhc3NpZ25tZW50OiAiICsgbGhzVHlwZSArICIgdmVyc3VzICIgKyByaHNUeXBlKTsKKyAg
ICAgICAgcmV0dXJuIGxoc1R5cGU7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYo
bm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQo
VmFsdWUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJDb3VsZCBub3QgZmlu
ZCB2YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9
IHJlc3VsdDsKKyAgICAgICAgbm9kZS4KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQu
dHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAg
IGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAgICBsZXQgcmVzdWx0VHlwZSA9IG5vZGUudmFs
dWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmN1cnJl
bnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUuZXF1YWxzKHJlc3VsdFR5cGUpKQorICAgICAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiVHJ5aW5n
IHRvIHJldHVybiAiICsgcmVzdWx0VHlwZSArICIgaW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMg
IiArIHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIXRoaXMu
X25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUuZXF1YWxzKHRoaXMuX25h
bWVDb250ZXh0LmludHJpbnNpY3Mudm9pZCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBl
RXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIk5vbi12b2lkIGZ1bmN0aW9uIG11c3QgcmV0
dXJuIGEgdmFsdWUiKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbmFtZUNvbnRleHQuaW50cmluc2ljcy5pbnQzMjsK
KyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAg
ICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50VHlwZXMg
PSBub2RlLmFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykp
OworICAgICAgICBsZXQgb3ZlcmxvYWQgPSB0aGlzLl9uYW1lQ29udGV4dC5wcm9ncmFtLnJlc29s
dmVGdW5jdGlvbk92ZXJsb2FkKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1
bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAg
ICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJEaWQgbm90
IGZpbmQgZnVuY3Rpb24gZm9yIGNhbGwiKTsKKyAgICAgICAgcmV0dXJuIG92ZXJsb2FkLnBodW5j
dGlvbi5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAorICAgICAgICAgICAgb3Zl
cmxvYWQucGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlvbkNvbnRl
eHQpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBh
cmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBl
UGFyYW1ldGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhw
clR5cGVQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVmFsdWUgeworICAgIGNvbnN0cnVj
dG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9y
aWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0
eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICBnZXQgaXNDb25zdGV4
cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gdHJ1
ZTsgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAg
IHsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBsZXQgcmVhbFRo
aXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlz
ICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBW
YXJpYWJsZVJlZikKKyAgICAgICAgICAgIG90aGVyID0gb3RoZXIudmFyaWFibGU7CisgICAgICAg
IAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNh
dGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisg
ICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL0V4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
RXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IEV4cHJlc3Npb24gZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luKQorICAg
IHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQg
b3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cit9CkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9GaWVsZC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZpZWxkIHsKKyAgICBjb25zdHJ1Y3Rvcihv
cmlnaW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47
CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsK
KyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQor
ICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyBy
ZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvRnVuY3Rpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvRnVuY3Rpb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rp
b24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlv
biBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG5hbWUsIHJldHVyblR5cGUsIHR5cGVQ
YXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7
CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICB0aGlzLl90
eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9wYXJhbWV0ZXJz
ID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlz
Ll9uYW1lOyB9CisgICAgZ2V0IHJldHVyblR5cGUoKSB7IHJldHVybiB0aGlzLl9yZXR1cm5UeXBl
OyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRl
cnM7IH0KKyAgICBnZXQgcGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7IH0K
KyAgICBnZXQgcGFyYW1ldGVyVHlwZXMoKSB7IHJldHVybiB0aGlzLnBhcmFtZXRlcnMubWFwKHBh
cmFtZXRlciA9PiBwYXJhbWV0ZXIudHlwZSk7IH0KKyAgICAKKyAgICBnZXQga2luZCgpIHsgcmV0
dXJuIEZ1bmN0aW9uOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMucmV0dXJuVHlwZSArICIgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBh
cmFtZXRlcnMgKyAiPigiICsgdGhpcy5wYXJhbWV0ZXJzICsgIikiOworICAgIH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25EZWYuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvRnVuY3Rpb25EZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvRnVuY3Rpb25EZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBGdW5jdGlvbkRlZiBleHRlbmRzIEZ1bmN0aW9uIHsKKyAgICBjb25zdHJ1Y3Rvcihv
cmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLCBib2R5
KQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMs
IHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRo
aXMuX2JvZHkgPSBib2R5OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4g
dGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGJvZHkoKSB7IHJldHVybiB0aGlzLl9ib2R5OyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5n
KCkgKyAiIHsgIiArIGJvZHkgKyAiIH0iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBGdW5jdGlvblBhcmFtZXRlciB7CisgICAgLy8gVGhlIG5hbWUgaXMgb3B0aW9u
YWwuIEl0J3MgT0sgZm9yIGl0IHRvIGJlIG51bGwhCisgICAgY29uc3RydWN0b3IobmFtZSwgdHlw
ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBl
ID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1l
OyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgCisgICAgdG9T
dHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMubmFt
ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uU2lnbmF0dXJl
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uU2lnbmF0dXJlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uU2lnbmF0dXJlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvSW50TGl0ZXJhbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbnRM
aXRlcmFsLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBJbnRMaXRlcmFs
IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB2YWx1ZSkKKyAg
ICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7
CisgICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9Cisg
ICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHRvU3RyaW5n
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAiIiArIHRoaXMuX3ZhbHVlOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL0ludHJpbnNpY3MuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBJbnRyaW5zaWNzIHsKKyAgICBjb25zdHJ1Y3RvcigpCisgICAgeworICAgICAgICB0
aGlzLl9tYXAgPSBuZXcgTWFwKCk7CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAg
ICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUgdm9pZDw+IiwKKyAgICAgICAgICAgICh0eXBlKSA9
PiB7CisgICAgICAgICAgICAgICAgdGhpcy52b2lkID0gdHlwZTsKKyAgICAgICAgICAgIH0pOwor
CisgICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0
eXBlIGludDMyPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0
aGlzLmludDMyID0gdHlwZTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX21hcC5z
ZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBlIGRvdWJsZTw+IiwKKyAgICAg
ICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5kb3VibGUgPSB0eXBlOwor
ICAgICAgICAgICAgfSk7CisgICAgfQorICAgIAorICAgIGFkZCh0aGluZykKKyAgICB7CisgICAg
ICAgIGxldCBpbnRyaW5zaWMgPSB0aGlzLl9tYXAuZ2V0KHRoaW5nLm5hbWUpOworICAgICAgICBp
ZiAoIWludHJpbnNpYykKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5v
cmlnaW4ubGluZU51bWJlciwgIlVucmVjb2duaXplZCBpbnRyaW5zaWM6ICIgKyB0aGluZyk7Cisg
ICAgICAgIGludHJpbnNpYyh0aGluZyk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9MZXhlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBMZXhlciB7CisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAg
ICAgICB0aGlzLl90ZXh0ID0gdGV4dDsKKyAgICAgICAgdGhpcy5faW5kZXggPSAwOworICAgICAg
ICB0aGlzLl9zdGFjayA9IFtdOworICAgIH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyRm9ySW5kZXgodGhpcy5faW5kZXgp
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLl9vcmlnaW4gKyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQor
ICAgIAorICAgIGxpbmVOdW1iZXJGb3JJbmRleChpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLl90ZXh0LnN1YnN0cmluZygwLCBpbmRleCkubWF0Y2goL1xuL2cpLmxlbmd0aDsKKyAg
ICB9CisgICAgCisgICAgZ2V0IHN0YXRlKCkgeyByZXR1cm4gdGhpcy5faW5kZXg7IH0KKyAgICBz
ZXQgc3RhdGUodmFsdWUpIHsgdGhpcy5faW5kZXggPSB2YWx1ZTsgfQorICAgIAorICAgIG5leHQo
KQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3N0YWNrLmxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzLl9zdGFjay5wb3AoKTsKKyAgICAgICAgCisgICAgICAgIGlmICh0aGlzLl9pbmRl
eCA+PSB0aGlzLl90ZXh0Lmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAg
ICAKKyAgICAgICAgY29uc3QgaXNDQ29tbWVudEJlZ2luID0gL1wvXCovOworICAgICAgICBjb25z
dCBpc0NQbHVzUGx1c0NvbW1lbnRCZWdpbiA9IC9cL1wvLzsKKyAgICAgICAgCisgICAgICAgIGxl
dCByZXN1bHQgPSAoa2luZCkgPT4geworICAgICAgICAgICAgbGV0IHRleHQgPSBSZWdFeHAubGFz
dE1hdGNoOworICAgICAgICAgICAgbGV0IHRva2VuID0gbmV3IExleGVyVG9rZW4odGhpcywgdGhp
cy5faW5kZXgsIGtpbmQsIHRleHQpOworICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gdGV4dC5s
ZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH07CisKKyAgICAgICAg
bGV0IHJlbGV2YW50VGV4dDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcmVsZXZh
bnRUZXh0ID0gdGhpcy5fdGV4dC5zdWJzdHJpbmcodGhpcy5faW5kZXgpOworICAgICAgICAgICAg
aWYgKC9eXHMrLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9p
bmRleCArPSBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgvXlwvXCovLnRlc3QocmVsZXZhbnRU
ZXh0KSkgeworICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHJlbGV2YW50VGV4dC5zZWFy
Y2goL1wqXC8vKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCAwKQorICAgICAgICAg
ICAgICAgICAgICB0aGlzLmZhaWwoIlVudGVybWluYXRlZCBjb21tZW50Iik7CisgICAgICAgICAg
ICAgICAgdGhpcy5faW5kZXggKz0gZW5kSW5kZXg7CisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wvLiovLnRlc3QocmVsZXZhbnRU
ZXh0KSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gu
bGVuZ3RoOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FOiBNYWtl
IHRoaXMgZG8gVW5pY29kZS4KKyAgICAgICAgaWYgKC9eW15cZFxXXVx3Ki8udGVzdChyZWxldmFu
dFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiaWRlbnRpZmllciIpOworCisgICAg
ICAgIGlmICgvXlswLTldKy8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdCgiaW50ZWdlckxpdGVyYWwiKTsKKworICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlz
IGhhbmRsZSBleHAtZm9ybSBsaXRlcmFscyBsaWtlIDFlMS4KKyAgICAgICAgaWYgKC9eKFswLTld
KlwuWzAtOV0rKXwoWzAtOV0rXC5bMC05XSopLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAg
ICAgICByZXR1cm4gcmVzdWx0KCJmbG9hdExpdGVyYWwiKTsKKyAgICAgICAgCisgICAgICAgIGlm
ICgvXihzdHJ1Y3R8cHJvdG9jb2x8dHlwZXxpZnxlbHNlfGVudW18Y29udGludWV8YnJlYWt8c3dp
dGNofGNhc2V8ZGVmYXVsdHxmb3J8d2hpbGV8ZG98cmV0dXJufHNpemVvZnxjb25zdGFudHxkZXZp
Y2V8dGhyZWFkZ3JvdXB8dGhyZWFkfG9wZXJhdG9yKS8udGVzdChyZWxldmFudFRleHQpKQorICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdCgia2V5d29yZCIpOworICAgICAgICAKKyAgICAgICAgaWYg
KC9eKFt7fSgpXFtcXT86PSsqXC8sLiUhfl4mfDw+XFwtXXwtPnw9Pnw8PXw9PXwhPXwrPXwtPXxc
Kj18XC89fCU9fF49fFx8PXwmPSkvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJl
dHVybiByZXN1bHQoInB1bmN0dWF0aW9uIik7CisgICAgICAgIAorICAgICAgICBmYWlsKCJVbnJl
Y29nbml6ZWQgdG9rZW4gYmVnaW5uaW5nIHdpdGg6ICIgKyByZWxldmFudFRleHQuc3Vic3RyaW5n
KDAsIDEwKSk7CisgICAgfQorICAgIAorICAgIHB1c2godG9rZW4pCisgICAgeworICAgICAgICB0
aGlzLl9zdGFjay5wdXNoKHRva2VuKTsKKyAgICB9CisgICAgCisgICAgcGVlaygpCisgICAgewor
ICAgICAgICBsZXQgcmVzdWx0ID0gbmV4dCgpOworICAgICAgICBwdXNoKHJlc3VsdCk7CisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZhaWwoZXJyb3IpCisgICAgewor
ICAgICAgICB0aHJvdyBuZXcgQUxTeW50YXhFcnJvcih0aGlzLm9yaWdpblN0cmluZywgZXJyb3Ip
OworICAgIH0KKyAgICAKKyAgICBiYWNrdHJhY2tpbmdTY29wZShjYWxsYmFjaykKKyAgICB7Cisg
ICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAg
ICByZXR1cm4gY2FsbGJhY2soKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAg
aWYgKGUgaW5zdGFuY2VvZiBBTFN5bnRheEVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhpcy5z
dGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KK30KSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvTGV4ZXJUb2tlbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhl
clRva2VuLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4
ZXJUb2tlbiB7CisgICAgY29uc3RydWN0b3IobGV4ZXIsIG9yaWdpbiwgaW5kZXgsIGtpbmQsIHRl
eHQpCisgICAgeworICAgICAgICB0aGlzLl9sZXhlciA9IGxleGVyOworICAgICAgICB0aGlzLl9v
cmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7CisgICAgICAgIHRo
aXMuX2tpbmQgPSBraW5kOworICAgICAgICB0aGlzLl90ZXh0ID0gdGV4dDsKKyAgICB9CisgICAg
CisgICAgZ2V0IGtpbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2tpbmQ7CisgICAg
fQorICAgIAorICAgIGdldCB0ZXh0KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLl9vcmlnaW47CisgICAgfQorICAgIAorICAgIGdldCBpbmRleCgpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5faW5kZXg7CisgICAgfQorICAgIAorICAgIGdldCBsaW5lTnVtYmVyKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9sZXhlci5saW5lTnVtYmVyRm9ySW5kZXgodGhp
cy5faW5kZXgpOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiArICI6IiArICh0aGlzLmxpbmVOdW1iZXIgKyAxKTsK
KyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJMZXhl
clRva2VuKCIgKyB0aGlzLmtpbmQgKyAiLCAiICsgdGhpcy50ZXh0ICsgIiwgIiArIHRoaXMubGlu
ZU51bWJlciArICIpIjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29u
dGV4dC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29udGV4dC5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29udGV4dC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjb25zdCBuYW1lYWJsZVNpbXBsZUtpbmRz
ID0gbmV3IFNldChbVHlwZSwgVmFsdWUsIFByb3RvY29sXSk7Citjb25zdCBuYW1lYWJsZU92ZXJs
b2FkYWJsZUtpbmRzID0gbmV3IFNldChbRnVuY3Rpb25dKTsKK2NvbnN0IG5hbWVhYmxlS2luZHMg
PSBuZXcgU2V0KEFycmF5LmZyb20obmFtZWFibGVTaW1wbGVLaW5kcykuY29uY2F0KEFycmF5LmZy
b20obmFtZWFibGVPdmVybG9hZGFibGVLaW5kcykpKTsKKworY2xhc3MgTmFtZUNvbnRleHQgewor
ICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3
IE1hcCgpOworICAgICAgICBmb3IgKGxldCBraW5kIG9mIG5hbWVhYmxlS2luZHMpCisgICAgICAg
ICAgICB0aGlzLl9tYXAuc2V0KGtpbmQsIG5ldyBNYXAoKSk7CisgICAgICAgIHRoaXMuX2RlZmlu
ZWQgPSBuZXcgU2V0KCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOwor
ICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IG51bGw7CisgICAgICAgIHRoaXMuX2ludHJpbnNpY3Mg
PSBudWxsOworICAgICAgICB0aGlzLl9wcm9ncmFtID0gbnVsbDsKKyAgICB9CisgICAgCisgICAg
bWFwRm9yKGtpbmQpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbWFwLmdldChr
aW5kKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Io
IkJhZCBraW5kOiAiICsga2luZCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAg
IAorICAgIGFkZCh0aGluZykKKyAgICB7CisgICAgICAgIGlmICghdGhpbmcubmFtZSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICh0aGluZy5pc05hdGl2ZSkgewor
ICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigiTmF0aXZlIGZ1bmN0aW9uIGluIGEgc2NvcGUgdGhhdCBkb2VzIG5vdCByZWNv
Z25pemUgaW50cmluc2ljcyIpOworICAgICAgICAgICAgdGhpcy5faW50cmluc2ljcy5hZGQodGhp
bmcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBsZXQgbWFwID0gbWFwRm9yKHRoaW5n
LmtpbmQpOworICAgICAgICBpZiAobmFtZWFibGVPdmVybG9hZGFibGVLaW5kcy5oYXModGhpbmcu
a2luZCkpIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IG1hcC5nZXQodGhpbmcubmFtZSk7Cisg
ICAgICAgICAgICBpZiAoIWFycmF5KQorICAgICAgICAgICAgICAgIG1hcC5zZXQodGhpbmcubmFt
ZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFwLmhhcyh0aGluZy5uYW1lKSkK
KyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ubGluZU51bWJl
ciwgIkR1cGxpY2F0ZSBuYW1lOiAiICsgdGhpbmcubmFtZSk7CisgICAgICAgIG1hcC5zZXQodGhp
bmcubmFtZSwgdGhpbmcpOworICAgIH0KKyAgICAKKyAgICBnZXQoa2luZCwgbmFtZSkKKyAgICB7
CisgICAgICAgIGxldCByZXN1bHQgPSBtYXBGb3Ioa2luZCkuZ2V0KG5hbWUpOworICAgICAgICBp
ZiAoIXJlc3VsdCAmJiB0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9k
ZWxlZ2F0ZS5nZXQoa2luZCwgbmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIGdldCBjdXJyZW50U3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlz
Ll9jdXJyZW50U3RhdGVtZW50KQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0
ZW1lbnQ7CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLl9kZWxlZ2F0ZS5jdXJyZW50U3RhdGVtZW50OworICAgICAgICByZXR1cm4gbnVsbDsKKyAg
ICB9CisgICAgCisgICAgaXNEZWZpbmVkKHRoaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMuX2RlZmluZWQuaGFzKHRoaW5nKQorICAgICAgICAgICAgfHwgKHRoaXMuX2RlbGVnYXRlICYm
IHRoaXMuX2RlbGVnYXRlLmlzRGVmaW5lZCh0aGluZykpOworICAgIH0KKyAgICAKKyAgICBkZWZp
bmUodGhpbmcpCisgICAgeworICAgICAgICB0aGlzLl9kZWZpbmVkLnNldCh0aGluZyk7CisgICAg
fQorICAgIAorICAgIGRlZmluZUFsbCgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0aGluZyBv
ZiB0aGlzKQorICAgICAgICAgICAgZGVmaW5lKHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZG9T
dGF0ZW1lbnQoc3RhdGVtZW50LCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHRoaXMuX2N1cnJl
bnRTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIHRo
aXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBkZWZpbmUoc3RhdGVtZW50KTsK
KyAgICB9CisgICAgCisgICAgcmVjb2duaXplSW50cmluc2ljcygpCisgICAgeworICAgICAgICB0
aGlzLl9pbnRyaW5zaWNzID0gbmV3IEludHJpbnNpY3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0
IGludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5faW50cmluc2ljczsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVn
YXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAg
ICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAg
ICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0
IHByb2dyYW0oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAg
ICByZXR1cm4gdGhpcy5fcHJvZ3JhbTsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnByb2dyYW07CisgICAgICAgIHJldHVybiBu
dWxsOworICAgIH0KKyAgICAKKyAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgbWFwIG9mIHRoaXMuX21hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9y
IChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVs
ZCB0eXBlOworICAgICAgICB9CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0
aXZlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVUeXBlIGV4dGVuZHMg
VHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBpc1ByaW1pdGl2ZSwgdHlwZVBh
cmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAg
IHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0
aXZlOworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAg
IH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1bnIgdGhpcy5fb3JpZ2luOyB9CisgICAg
Z2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkg
eyByZXR1cm4gdGhpcy5faXNQcmltaXRpdmU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7
IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0
dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsK
KyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMu
bGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgdHlw
ZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICBpZiAoIXR5cGVBcmd1bWVu
dHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVybiBuZXcg
TmF0aXZlVHlwZUluc3RhbmNlKHRoaXMsIHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAg
ICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIm5hdGl2ZSAiICsgKHRoaXMuaXNQ
cmltaXRpdmUgPyAicHJpbWl0aXZlICIgOiAiIikgKyAidHlwZSAiICsgdGhpcy5uYW1lICsgIjwi
ICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgTmF0aXZlVHlwZUluc3RhbmNlIGV4dGVuZHMgVHlwZSB7CisgICAg
Y29uc3RydWN0b3IodHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5
cGUgPSB0eXBlOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsK
KyAgICB9CisgICAgCisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAg
Z2V0IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAg
Z2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5fdHlwZS5pc1ByaW1pdGl2ZTsgfQorICAg
IGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5p
ZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0g
b3RoZXIudHlwZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMu
dHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50
eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFy
Z3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNb
aV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMudHlwZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9Ob2RlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTm9k
ZSB7CisgICAgdmlzaXQodmlzaXRvcikKKyAgICB7CisgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9
IHZpc2l0b3JbInZpc2l0IiArIHRoaXMuY29uc3RydWN0b3IubmFtZV0odGhpcyk7CisgICAgICAg
IGlmICgicmV0dXJuVmFsdWUiIGluIHZpc2l0b3IpCisgICAgICAgICAgICByZXR1cm4gdmlzaXRv
ci5yZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKyAgICAK
KyAgICB1bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0
IHVuaWZ5VGhpcyA9IHRoaXMudW5pZnlOb2RlOworICAgICAgICBsZXQgdW5pZnlPdGhlciA9IG90
aGVyLnVuaWZ5Tm9kZTsKKyAgICAgICAgaWYgKHVuaWZ5T3RoZXIudHlwZVZhcmlhYmxlVW5pZnko
dW5pZmljYXRpb25Db250ZXh0LCB1bmlmeVRoaXMpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIHJldHVybiB1bmlmeVRoaXMudW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwg
dW5pZnlPdGhlcik7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRl
eHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKG90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgdGhpcykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgcmV0dXJuIHRoaXMgPT0gb3RoZXI7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorICAgIAorICAgIGdldCB1bmlmeU5vZGUoKSB7IHJldHVybiB0aGlzOyB9Cisg
ICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaXNO
YXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIGVxdWFscyhvdGhlcikKKyAgICB7
CisgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0
KCk7CisgICAgICAgIHJldHVybiB0aGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIp
ICYmIHVuaWZpY2F0aW9uQ29udGV4dC5pc1VudW5pZmllZCgpOworICAgIH0KKyAgICAKKyAgICBz
dWJzdGl0dXRlKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLnZpc2l0KFN1YnN0aXR1dGlvbi5tYXBwaW5nKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlz
dCkpOworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihwYXJhbWV0ZXJz
LCB1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZShw
YXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLm1hcCh0eXBlID0+IHVuaWZpY2F0aW9uQ29udGV4dC5maW5k
KHR5cGUpKSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzIg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworZnVuY3Rpb24gcGFyc2UocHJvZ3JhbSwgb3JpZ2luLCB0ZXh0KQoreworICAgIGxl
dCBsZXhlciA9IG5ldyBMZXhlcihvcmlnaW4sIHRleHQpOworICAgIAorICAgIC8vIFRoZSBoYXJk
ZXN0IHBhcnQgb2YgZGVhbGluZyB3aXRoIEMtbGlrZSBsYW5ndWFnZXMgaXMgcGFyc2luZyB2YXJp
YWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnRzLgorICAgIC8vIExldCdzIGNvbnNpZGVyIGlmIHRo
aXMgaGFwcGVucyBpbiBBcnJheUxhbmcuIEhlcmUgYXJlIHRoZSB2YWxpZCBzdGF0ZW1lbnRzIGlu
IEFycmF5TGFuZyB0aGF0CisgICAgLy8gYmVnaW4gd2l0aCBhbiBpZGVudGlmaWVyLCBpZiB3ZSBh
c3N1bWUgdGhhdCBhbnkgZXhwcmVzc2lvbiBjYW4gYmUgYSBzdGFuZGFsb25lIHN0YXRlbWVudC4K
KyAgICAvLworICAgIC8vICAgICB4OworICAgIC8vICAgICB4IDxiaW5vcD4geTsKKyAgICAvLyAg
ICAgeCA8IHk7CisgICAgLy8gICAgIHggPCB5ID4gejsKKyAgICAvLyAgICAgeCA9IHk7CisgICAg
Ly8gICAgIHguZiA9IHk7CisgICAgLy8gICAgIFxleHAgPSB5OworICAgIC8vICAgICB4WzQyXSA9
IHk7CisgICAgLy8gICAgIHgoKTsKKyAgICAvLyAgICAgeDx5PigpOworICAgIC8vICAgICB4IHk7
CisgICAgLy8gICAgIHg8eT4gejsKKyAgICAvLyAgICAgeFtdIHk7CisgICAgLy8gICAgIHhbNDJd
IHk7CisgICAgLy8gICAgIHheIHk7CisgICAgLy8KKyAgICAvLyBUaGlzIGhhcyB0d28gcHJvYmxl
bSBhcmVhczoKKyAgICAvLworICAgIC8vICAgICAtIHg8eT56IGNhbiBwYXJzZSB0d28gZGlmZmVy
ZW50IHdheXMgKGFzICh4IDwgeSkgPiB6IG9yIHg8eT4geikuCisgICAgLy8gICAgIC0geFs0Ml0g
Y291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9yIGEgdmFyaWFibGUgZGVjbGFyYXRp
b24uCisgICAgLy8gICAgIC0geDx5PiBjb3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQg
b3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAvLworICAgIC8vIFdlIHNvbHZlIHRoZSBm
aXJzdCBwcm9ibGVtIGJ5IGZvcmJpZGRpbmcgZXhwcmVzc2lvbnMgYXMgc3RhdGVtZW50cy4gVGhl
IGxhY2sgb2YgZnVuY3Rpb24KKyAgICAvLyBwb2ludGVycyBtZWFucyB0aGF0IHdlIGNhbiBzdGls
bCBhbGxvdyBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudHMgLSB1bmxpa2UgaW4gQywgdGhvc2UgY2Fu
bm90CisgICAgLy8gaGF2ZSBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgYXMgdGhlIGNhbGxlZS4gVGhl
IHJlbWFpbmluZyB0d28gcHJvYmxlbXMgYXJlIHNvbHZlZCBieQorICAgIC8vIGJhY2t0cmFja2lu
Zy4gSW4gYWxsIG90aGVyIHJlc3BlY3RzLCB0aGlzIGlzIGEgc2ltcGxlIHJlY3Vyc2l2ZSBkZXNj
ZW50IHBhcnNlci4KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmljQ29uc3VtZShjYWxsYmFjaykK
KyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLm5leHQoKTsKKyAgICAgICAgaWYgKCF0
b2tlbikKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsK
KyAgICAgICAgaWYgKGNhbGxiYWNrKHRva2VuKSkKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVu
ZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50ZXh0ICsgIjsgZXhwZWN0ZWQ6ICIgKyB0ZXh0KTsK
KyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBjb25zdW1l
KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNDb25zdW1lKHRva2VuID0+
IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
Y29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljQ29uc3VtZSh0
b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBh
c3NlcnROZXh0KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgbGV4ZXIucHVzaChjb25zdW1lKC4u
LnRleHRzKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGdlbmVyaWNUZXN0KGNhbGxiYWNr
KQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAo
dG9rZW4gJiYgY2FsbGJhY2sodG9rZW4pKQorICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAg
ICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdGVzdCguLi50ZXh0
cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljVGVzdCh0b2tlbiA9PiB0ZXh0cy5pbmNs
dWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRlc3RLaW5kKGtp
bmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Rlc3QodG9rZW4gPT4gdG9rZW4ua2lu
ZCA9PSBraW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5Q29uc3VtZSguLi50ZXh0
cykKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0KC4uLnRleHRzKTsKKyAgICAgICAg
aWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQcm90b2NvbFJlZigpCisgICAg
eworICAgICAgICBsZXQgcHJvdG9jb2xUb2tlbiA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7
CisgICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xSZWYocHJvdG9jb2xUb2tlbi5vcmlnaW4sIHBy
b3RvY29sVG9rZW4udGV4dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlwZVBh
cmFtZXRlcnMoKQorICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8IikpCisgICAgICAgICAgICBy
ZXR1cm4gW107CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gW107CisgICAgICAgIGNv
bnN1bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+IikpIHsKKyAgICAgICAgICAgIGxl
dCBjb25zdGV4cHIgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAgICAg
ICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9
IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgi
LCIsICI+Iik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisg
ICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29uc3RleHByKTsKKyAgICAgICAgICAgIGVsc2Ug
eworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsK
KyAgICAgICAgICAgICAgICBsZXQgcHJvdG9jb2wgPSB0cnlDb25zdW1lKCI6IikgPyBwYXJzZVBy
b3RvY29sUmVmKCkgOiBudWxsOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBl
VmFyaWFibGUobmFtZS5vcmlnaW4sIG5hbWUudGV4dCwgcHJvdG9jb2wpKTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWUoIj4iKTsKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VUeXBlRGVmKCkKKyAgICB7Cisg
ICAgICAgIGNvbnN1bWUoInR5cGUiKTsKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgi
aWRlbnRpZmllciIpLnRleHQ7CisgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHBhcnNlVHlw
ZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIGZvciAoOzspIHsKKyAg
ICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAoIXRva2VuKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAidHlwZSIpCisgICAg
ICAgICAgICBwYXJzZVR5cGVEZWYoKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAi
bmF0aXZlIikKKyAgICAgICAgICAgIHBhcnNlTmF0aXZlVHlwZSgpOworICAgICAgICBlbHNlIGlm
ICh0b2tlbi50ZXh0ID09ICJzdHJ1Y3QiKQorICAgICAgICAgICAgcGFyc2VTdHJ1Y3RUeXBlKCk7
CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gImVudW0iKQorICAgICAgICAgICAgcGFy
c2VFbnVtKCk7CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gInByb3RvY29sIikKKyAg
ICAgICAgICAgIHBhcnNlUHJvdG9jb2xEZWNsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAg
IHBhcnNlRnVuY3Rpb25EZWYoKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb2dyYW0uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb2dyYW0gZXh0ZW5kcyBOb2RlIHsK
KyAgICBjb25zdHJ1Y3RvcigpCisgICAgeworICAgICAgICB0aGlzLl90b3BMZXZlbFN0YXRlbWVu
dHMgPSBbXTsKKyAgICAgICAgdGhpcy5fZnVuY3Rpb25zID0gbmV3IE1hcCgpOworICAgICAgICB0
aGlzLl90eXBlcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHRvcExldmVsU3Rh
dGVtZW50cygpIHsgcmV0dXJuIHRoaXMuX3RvcExldmVsU3RhdGVtZW50czsgfQorICAgIGdldCBm
dW5jdGlvbnMoKSB7IHJldHVybiB0aGlzLl9mdW5jdGlvbnM7IH0KKyAgICBnZXQgdHlwZXMoKSB7
IHJldHVybiB0aGlzLl90eXBlczsgfQorICAgIAorICAgIGFkZFRvcExldmVsU3RhdGVtZW50KHN0
YXRlbWVudCkKKyAgICB7CisgICAgICAgIHN0YXRlbWVudC5wcm9ncmFtID0gdGhpczsKKyAgICAg
ICAgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CisgICAgICAgICAgICBsZXQg
YXJyYXkgPSB0aGlzLl9mdW5jdGlvbnMuZ2V0KHN0YXRlbWVudC5uYW1lKTsKKyAgICAgICAgICAg
IGlmICghYXJyYXkpCisgICAgICAgICAgICAgICAgdGhpcy5fZnVuY3Rpb25zLnNldChzdGF0ZW1l
bnQubmFtZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHN0YXRlbWVudCk7
CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgVHlwZSkKKyAgICAgICAg
ICAgIHRoaXMuX3R5cGVzLnNldChzdGF0ZW1lbnQubmFtZSwgc3RhdGVtZW50KTsKKyAgICAgICAg
ZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdGF0ZW1lbnQgaXMgbm90IGEgZnVu
Y3Rpb24gb3IgdHlwZTogIiArIHN0YXRlbWVudCk7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3Rh
dGVtZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHJlc29sdmVGdW5jdGlv
bk92ZXJsb2FkKG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpCisgICAgeworICAg
ICAgICBsZXQgZnVuY3Rpb25zID0gdGhpcy5mdW5jdGlvbnMuZ2V0KG5hbWUpOworICAgICAgICBp
ZiAoIWZ1bmN0aW9ucykKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAg
ICAgZm9yIChsZXQgcGh1bmN0aW9uIG9mIGZ1bmN0aW9ucykgeworICAgICAgICAgICAgaWYgKHR5
cGVBcmd1bWVudHMubGVuZ3RoICYmIHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHBodW5jdGlvbi50
eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICBpZiAoYXJndW1lbnRUeXBlcy5sZW5ndGggIT0gcGh1bmN0aW9uLnBhcmFtZXRlcnMubGVu
Z3RoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0IHVuaWZpY2F0
aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQocGh1bmN0aW9uLnR5cGVQYXJhbWV0
ZXJzKTsKKyAgICAgICAgICAgIGxldCBvayA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGxldCBp
ID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBs
ZXQgYXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOworICAgICAgICAgICAgICAgIGxldCBwYXJh
bWV0ZXIgPSBwaHVuY3Rpb24udHlwZVBhcmFtZXRlcnNbaV07CisgICAgICAgICAgICAgICAgaWYg
KChhcmd1bWVudCBpbnN0YW5jZW9mIFR5cGUpICE9IChwYXJhbWV0ZXIgaW5zdGFuY2VvZiBUeXBl
KSkgeworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVu
dC51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHBhcmFtZXRlcikpIHsKKyAgICAgICAgICAgICAg
ICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRU
eXBlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnRUeXBlc1tp
XS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHBodW5jdGlvbi5wYXJhbWV0ZXJzW2ldLnR5cGUp
KSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
ICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIXVuaWZp
Y2F0aW9uQ29udGV4dC52ZXJpZnkoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIGxldCBzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMgPSAhdHlwZUFyZ3VtZW50cy5sZW5n
dGg7CisgICAgICAgICAgICBpZiAoc2hvdWxkQnVpbGRUeXBlQXJndW1lbnRzKQorICAgICAgICAg
ICAgICAgIHR5cGVBcmd1bWVudHMgPSBbXTsKKyAgICAgICAgICAgIGZvciAobGV0IHR5cGVQYXJh
bWV0ZXIgb2YgcGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgbGV0
IHR5cGVBcmd1bWVudCA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHR5cGVQYXJhbWV0ZXIpOwor
ICAgICAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnQgPT0gdHlwZVBhcmFtZXRlcikgeworICAg
ICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFy
Z3VtZW50cykKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5wdXNoKHR5cGVBcmd1
bWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuIHtwaHVuY3Rpb24sIHVuaWZpY2F0aW9u
Q29udGV4dCwgdHlwZUFyZ3VtZW50c307CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJl
dHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZUNvbnRleHQoKQorICAgIHsKKyAg
ICAgICAgbGV0IHJlc3VsdCA9IG5ldyBOYW1lQ29udGV4dCgpOworICAgICAgICBmb3IgKGxldCBz
dGF0ZW1lbnQgb2YgdGhpcy50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICByZXN1bHQu
YWRkKHN0YXRlbWVudCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQorCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9Qcm90b2NvbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Q
cm90b2NvbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFBy
b3RvY29sIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAg
IHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0g
bmFtZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBraW5k
KCkgeyByZXR1cm4gUHJvdG9jb2w7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb3RvY29sRGVjbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Qcm90b2Nv
bERlY2wuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNs
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb3RvY29s
RGVjbCBleHRlbmRzIFByb3RvY29sIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisg
ICAgeworICAgICAgICBzdXBlcihvcmlnaW4sIG5hbWUpCisgICAgICAgIHRoaXMuX3NpZ25hdHVy
ZXMgPSBbXTsKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlTWFwID0gbmV3IE1hcCgpOworICAgICAg
ICB0aGlzLl90eXBlVmFyaWFibGUgPSBuZXcgVHlwZVZhcmlhYmxlKG9yaWdpbiwgbmFtZSwgbnVs
bCk7CisgICAgfQorICAgIAorICAgIGFkZFNpZ25hdHVyZShzaWduYXR1cmUpCisgICAgeworICAg
ICAgICAvLyBOT1RFOiBBbnkgdHlwZSBwYXJhbWV0ZXJzIGZvdW5kIGluIHRoZSBzaWduYXR1cmUg
bXVzdCBiZSBpbmZlcmFibGUgZnJvbSB0aGUgdmFsdWUKKyAgICAgICAgLy8gcGFyYW1ldGVycy4K
KyAgICAgICAgLy8gRklYTUU6IENoZWNrIHRoaXMhIChPT1BTISkKKyAgICAgICAgdGhpcy5fc2ln
bmF0dXJlcy5wdXNoKHNpZ25hdHVyZSk7CisgICAgICAgIGxldCBvdmVybG9hZHMgPSB0aGlzLl9z
aWduYXR1cmVNYXAuZ2V0KHNpZ25hdHVyZS5uYW1lKTsKKyAgICAgICAgaWYgKCFvdmVybG9hZHMp
CisgICAgICAgICAgICB0aGlzLl9zaWduYXR1cmVNYXAuc2V0KHNpZ25hdHVyZS5uYW1lLCBvdmVy
bG9hZHMgPSBbXSk7CisgICAgICAgIG92ZXJsb2Fkcy5wdXNoKHNpZ25hdHVyZSk7CisgICAgfQor
ICAgIAorICAgIGdldCBzaWduYXR1cmVzKCkgeyByZXR1cm4gdGhpcy5fc2lnbmF0dXJlczsgfQor
ICAgIHNpZ25hdHVyZXNCeU5hbWUobmFtZSkgeyByZXR1cm4gdGhpcy5fc2lnbmF0dXJlTWFwLmdl
dChuYW1lKTsgfQorICAgIGdldCB0eXBlVmFyaWFibGUoKSB7IHJldHVybiB0aGlzLl90eXBlVmFy
aWFibGU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhvdGhlclByb3RvY29sKQorICAgIHsKKyAgICAg
ICAgaWYgKCFvdGhlclByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAg
IAorICAgICAgICBpZiAob3RoZXJQcm90b2NvbCBpbnN0YW5jZW9mIFByb3RvY29sUmVmKQorICAg
ICAgICAgICAgb3RoZXJQcm90b2NvbCA9IG90aGVyUHJvdG9jb2wucHJvdG9jb2xEZWNsOworICAg
ICAgICAKKyAgICAgICAgZm9yIChsZXQgb3RoZXJTaWduYXR1cmUgb2Ygb3RoZXJQcm90b2NvbC5z
aWduYXR1cmVzKSB7CisgICAgICAgICAgICBsZXQgc2lnbmF0dXJlcyA9IHRoaXMuc2lnbmF0dXJl
c0J5TmFtZShvdGhlclNpZ25hdHVyZS5uYW1lKTsKKyAgICAgICAgICAgIGlmICghc2lnbmF0dXJl
cykKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBsZXQgZm91bmQg
PSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSA6IHNpZ25hdHVyZXMpIHsK
KyAgICAgICAgICAgICAgICBpZiAoc2lnbmF0dXJlLnBhcmFtZXRlcnMubGVuZ3RoICE9IG90aGVy
U2lnbmF0dXJlLnBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMg
PSBzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMuY29uY2F0KHRoaXMudHlwZVZhcmlhYmxlKTsKKyAg
ICAgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29u
dGV4dCh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgbGV0IG9rID0gdHJ1ZTsKKyAg
ICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNpZ25hdHVyZS5wYXJhbWV0ZXJzLmxl
bmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc2lnbmF0dXJlLnBhcmFtZXRl
cnNbaV0udHlwZS51bmlmeShvdGhlclNpZ25hdHVyZS5wYXJhbWV0ZXJzW2ldLnR5cGUpKSB7Cisg
ICAgICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAg
ICAgICAgICAgICAgaWYgKHVuaWZpY2F0aW9uQ29udGV4dC52ZXJpZnkoKSkgeworICAgICAgICAg
ICAgICAgICAgICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0KKyAgICAgICAgICAgICAgICAg
ICAgICAgIHNpZ25hdHVyZS5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXJzLCB1bmlmaWNhdGlvbkNvbnRl
eHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGVkUmV0dXJuVHlwZS5lcXVh
bHMob3RoZXJTaWduYXR1cmUucmV0dXJuVHlwZSkpCisgICAgICAgICAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICBm
b3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0K
KyAgICAKKyAgICBoYXNIZWlyKHR5cGUpCisgICAgeworICAgICAgICBsZXQgc3Vic3RpdHV0aW9u
ID0gU3Vic3RpdHV0aW9uLm1hcHBpbmcoW3RoaXMuX3R5cGVWYXJpYWJsZV0sIFt0eXBlXSk7Cisg
ICAgICAgIGZvciAobGV0IGFic3RyYWN0U2lnbmF0dXJlIG9mIHRoaXMuX3NpZ25hdHVyZXMpIHsK
KyAgICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBzaWduYXR1cmUudmlzaXQoc3Vic3RpdHV0aW9u
KTsKKyAgICAgICAgICAgIGxldCBvdmVybG9hZCA9IHRoaXMucHJvZ3JhbS5yZXNvbHZlRnVuY3Rp
b25PdmVybG9hZChzaWduYXR1cmUubmFtZSwgW10sIHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcyk7
CisgICAgICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGVkUmV0dXJuVHlwZSA9
IG92ZXJsb2FkLnBodW5jdGlvbi5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAor
ICAgICAgICAgICAgICAgIG92ZXJsb2FkLnBodW5jdGlvbi50eXBlUGFyYW1ldGVycywgb3Zlcmxv
YWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1
cm5UeXBlLmVxdWFscyhzaWduYXR1cmUucmV0dXJuVHlwZSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInByb3RvY29sICIgKyB0aGlz
Lm5hbWUgKyAiIHsgIiArIHRoaXMuc2lnbmF0dXJlcy5qb2luKCI7ICIpICsgIjsgfSI7CisgICAg
fQorfQorCisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xSZWYgZXh0ZW5kcyBQcm90b2NvbCB7CisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luLCBu
YW1lKTsKKyAgICAgICAgdGhpcy5wcm90b2NvbERlY2wgPSBudWxsOworICAgIH0KKyAgICAKKyAg
ICBpbmhlcml0cyhvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVj
bC5pbmhlcml0cyhvdGhlcik7CisgICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVjbC5oYXNIZWlyKHR5cGUpOworICAgIH0K
K30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9QdHJUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgUHRyVHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5
cGUgKyAiXiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VU
eXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJlZmVyZW5jZVR5cGUgZXh0
ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFkZHJlc3NTcGFjZSwgZWxlbWVu
dFR5cGUpCisgICAgeworICAgICAgICB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2Up
OworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2FkZHJlc3NT
cGFjZSA9IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50
VHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBhZGRyZXNzU3BhY2UoKSB7IHJldHVybiB0aGlzLl9hZGRyZXNzU3BhY2U7
IH0KKyAgICBnZXQgZWxlbWVudFR5cGUoKSB7IHJldHVybiB0aGlzLl9lbGVtZW50VHlwZTsgfQor
ICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAgdW5pZnlJ
bXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAodGhpcy5j
b25zdHJ1Y3RvciAhPSBvdGhlci5jb25zdHJ1Y3RvcikKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlci5lbGVtZW50VHlwZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9SZXR1cm4uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJldHVybiBleHRlbmRzIE5vZGUgewor
ICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgdmFsdWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmln
aW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAor
ICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgdmFsdWUo
KSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiAieyAiICsgdGhpcy5zdGF0ZW1lbnRzLmpvaW4oIjsgIik7ICsgIjsgfSI7
CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgUmV3cml0ZXIgeworICAgIHZpc2l0RnVuY3Rpb24obm9kZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oCisgICAgICAgICAgICBub2RlLm5hbWUs
IG5vZGUucmV0dXJuVHlwZS52aXNpdCh0aGlzKSwKKyAgICAgICAgICAgIG5vZGUudHlwZVBhcmFt
ZXRlcnMubWFwKHR5cGVQYXJtZXRlciA9PiB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpKSwKKyAg
ICAgICAgICAgIG5vZGUucGFyYW1ldGVycy5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRlci52aXNp
dCh0aGlzKSkpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uUGFyYW1ldGVyKG5vZGUp
CisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uQXJndW1lbnQobm9kZS5uYW1lLCBu
b2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUp
CisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEJsb2NrKG5vZGUub3JpZ2luKTsKKyAg
ICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAg
IHJlc3VsdC5hZGQoc3RhdGVtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAg
IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUeXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5h
bWUsIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52
aXNpdCh0aGlzKSkpOworICAgICAgICByZXN1bHQudHlwZSA9IG5vZGUudHlwZTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0
ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29uc3Rl
eHByVHlwZVBhcmFtZXRlcihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQo
dGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAg
ICByZXR1cm4gbmV3IEZpZWxkKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNp
dCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG5ldyBub2RlLmNvbnN0cnVjdG9yKG5vZGUucm9naWluLCBub2Rl
LmFkZHJlc3NTcGFjZSwgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAg
IAorICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlz
aXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlw
ZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5v
ZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5ldyBBcnJheVR5cGUobm9kZS5vcmlnaW4sIG5vZGUuZWxlbWVudFR5cGUudmlz
aXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudChub2RlLm9yaWdpbiwgbm9kZS5saHMudmlz
aXQodGhpcyksIG5vZGUucmhzLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRW
YXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAg
IAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFJldHVy
bihub2RlLm9yaWdpbiwgbm9kZS52YWx1ZSA/IG5vZGUudmFsdWUudmlzaXQodGhpcykgOiBudWxs
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgICAg
ICByZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisg
ICAgeworICAgICAgICByZXR1cm4gbmV3IENhbGxFeHByZXNzaW9uKAorICAgICAgICAgICAgbm9k
ZS5vcmlnaW4sIG5vZGUubmFtZSwKKyAgICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAo
dHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBu
b2RlLmFyZ3VtZW50bGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykpKTsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgU3RydWN0VHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0
cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlz
Ll9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0
aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9maWVs
ZHMgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIGFkZChmaWVsZCkKKyAgICB7CisgICAg
ICAgIGlmICh0aGlzLl9maWVsZHMuaGFzKGZpZWxkLm5hbWUpKQorICAgICAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKGZpZWxkLm9yaWdpbi5saW5lTnVtYmVyLCAiRHVwbGljYXRlIGZpZWxk
IG5hbWU6ICIgKyBmaWVsZC5uYW1lKTsKKyAgICAgICAgdGhpcy5fZmllbGRzLnNldChmaWVsZC5u
YW1lLCBmaWVsZCk7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5f
bmFtZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJh
bWV0ZXJzOyB9CisgICAgCisgICAgZ2V0IGZpZWxkTmFtZXMoKSB7IHJldHVybiB0aGlzLl9maWVs
ZHMua2V5cygpOyB9CisgICAgZmllbGRCeU5hbWUobmFtZSkgeyByZXR1cm4gdGhpcy5fZmllbGRz
LmdldChuYW1lKTsgfQorICAgIGdldCBmaWVsZHMoKSB7IHJldHVybiB0aGlzLl9maWVsZHMudmFs
dWVzKCk7IH0KKyAgICBnZXQgZmllbGRNYXAoKSB7IHJldHVybiB0aGlzLl9maWVsZHM7IH0KKyAg
ICAKKyAgICBnZXQgbmFtZUNvbnRleHQoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5l
dyBOYW1lQ29udGV4dCgpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMu
dHlwZVBhcmFtZXRlcnMpCisgICAgfQorICAgIAorICAgIGluc3RhbnRpYXRlKHR5cGVBcmd1bWVu
dHMpCisgICAgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gdGhpcy50eXBl
UGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3Jp
Z2luLmxpbmVOdW1iZXIsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8gaW5zdGFu
dGlhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVD
b250ZXh0KCk7CisgICAgICAgIAorICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0
aW9uLm1hcHBpbmcodGhpcy50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAg
IGxldCByZXN1bHQgPSBuZXcgU3RydWN0VHlwZSh0aGlzLm9yaWdpbiwgdGhpcy5uYW1lLCBbXSk7
CisgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKQorICAgICAgICAgICAgcmVz
dWx0LmFkZChmaWVsZC52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJz
dHJ1Y3QgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPiB7ICIg
KyBBcnJheS5mcm9tKHRoaXMuZmllbGRzKS5qb2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBTdWJzdGl0dXRpb24gZXh0ZW5kcyBSZXdyaXRlciB7CisgICAgY29uc3Ry
dWN0b3IobWFwKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbWFwOworICAgIH0KKyAgICAK
KyAgICBzdGF0aWMgbWFwcGluZyhwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3QpCisgICAgeworICAg
ICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRMaXN0Lmxlbmd0aCkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBhbmQgYXJndW1lbnRzIGFyZSBtaXNt
YXRjaGVkIik7CisgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIGZvciAobGV0
IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIG1hcC5zZXQo
cGFyYW1ldGVyc1tpXSwgYXJndW1lbnRMaXN0W2ldKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJz
dGl0dXRpb24obWFwKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0KG5vZGUudHlwZSk7Cisg
ICAgICAgIGlmIChyZXBsYWNlbWVudCkgeworICAgICAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3Vt
ZW50cy5sZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVk
IHR5cGUgYXJndW1lbnRzIG9uIHR5cGUgdmFyaWFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiBy
ZXBsYWNlbWVudDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZp
c2l0VHlwZVJlZihub2RlKTsKKyAgICB9CisKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisg
ICAgeworICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0KG5vZGUudmFyaWFi
bGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpCisgICAgICAgICAgICByZXR1cm4gcmVwbGFj
ZW1lbnQ7CisgICAgICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRWYXJpYWJsZVJlZihu
b2RlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9UeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgVHlwZSBleHRlbmRzIE5vZGUgeworICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsg
cmV0dXJuIFtdOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBUeXBlOyB9CisgICAgCisgICAg
aW5oZXJpdHMocHJvdG9jb2wpCisgICAgeworICAgICAgICByZXR1cm4gcHJvdG9jb2wuaGFzSGVp
cih0aGlzKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGluc3RhbnRpYXRlZFR5cGUoKSB7IHJldHVy
biB0aGlzOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgVHlwZURlZiBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9y
aWdpbiwgbmFtZSwgdHlwZVBhcmFtZXRlcnMsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9v
cmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlz
Ll90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl90eXBlID0g
dHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBl
UGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHR5
cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1R5cGVSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVJlZiBleHRlbmRzIFR5cGUgewor
ICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAg
ICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7Cisg
ICAgICAgIHRoaXMudHlwZSA9IG51bGw7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0
eXBlQXJndW1lbnRzOworICAgIH0KKyAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5f
b3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0
IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0
IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdHlwZSA/IHR5cGUuaXNQcmltaXRpdmUgOiBmYWxzZTsg
fQorICAgIAorICAgIGdldCBpbnN0YW50aWF0ZWRUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLnR5cGUuaW5zdGFudGlhdGUodHlwZUFyZ3VtZW50cyk7CisgICAgfQorICAgIAorICAg
IGdldCB1bmlmeU5vZGUoKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHMu
bGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS51bmlmeU5vZGU7CisgICAgICAg
IHJldHVybiB0aGlzOworICAgIH0KKyAgICAKKyAgICBzZXRUeXBlQW5kQXJndW1lbnRzKHR5cGUs
IHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl9uYW1lID0gdHlwZS5uYW1lOwor
ICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0g
dHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFR5cGVS
ZWYpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMudHlwZS51
bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGUpKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICBpZiAodGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCAhPSBvdGhlci50
eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
Zm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKKyAg
ICAgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIudHlwZUFyZ3VtZW50c1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgIjwiICsgdGhpcy50
eXBlQXJndW1lbnRzICsgIj4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZVZhcmlhYmxlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJp
YWJsZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlVmFyaWFi
bGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHByb3RvY29s
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fcHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHByb3Rv
Y29sKCkgeyByZXR1cm4gdGhpcy5fcHJvdG9jb2w7IH0KKyAgICAKKyAgICBnZXQgaXNQcmltaXRp
dmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sICYmIHRoaXMuX3Byb3Rv
Y29sLmlzUHJpbWl0aXZlOworICAgIH0KKyAgICAKKyAgICBnZXQgaXNVbmlmaWFibGUoKSB7IHJl
dHVybiB0cnVlOyB9CisgICAgCisgICAgaW5oZXJpdHMocHJvdG9jb2wpCisgICAgeworICAgICAg
ICBpZiAoIXByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICgh
dGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJu
IHRoaXMucHJvdG9jb2wuaW5oZXJpdHMocHJvdG9jb2wpOworICAgIH0KKyAgICAKKyAgICB0eXBl
VmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAg
bGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcyk7CisgICAgICAgIGlm
IChyZWFsVGhpcyAhPSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHJlYWxUaGlzLnVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgICAgICAKKyAgICAgICAgdW5pZmljYXRpb25D
b250ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBv
dGhlcik7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzQXJndW1lbnQodW5pZmljYXRpb25Db250
ZXh0KQorICAgIHsKKyAgICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25Db250ZXh0LmZp
bmQodGhpcyk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgdGhpbmcgd2UgZ2V0IHVuaWZpZWQg
d2l0aCBtdXN0IGJlIGEgdHlwZSB2YXJpYWJsZSB0aGF0IGFjY2VwdHMgYSBicm9hZGVyIHNldCBv
ZgorICAgICAgICAvLyB0aGluZ3MgdGhhbiB3ZSBkby4KKyAgICAgICAgaWYgKCEocmVhbFRoaXMg
aW5zdGFuY2VvZiBUeXBlVmFyaWFibGUpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIAorICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gIXJl
YWxUaGlzLnByb3RvY29sOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvdG9jb2wu
aW5oZXJpdHMocmVhbFRoaXMucHJvdG9jb2wpOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc1Bh
cmFtZXRlcih1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICBpZiAoIXRoaXMucHJv
dG9jb2wpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHVuaWZpY2F0
aW9uQ29udGV4dC5maW5kKHRoaXMpLmluaGVyaXRzKHRoaXMucHJvdG9jb2wpOworICAgIH0KKyAg
ICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAg
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBVbmlmaWNhdGlvbkNvbnRl
eHQgeworICAgIGNvbnN0cnVjdG9yKHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhp
cy5fdHlwZVBhcmFtZXRlcnMgPSBuZXcgU2V0KHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhp
cy5fbmV4dE1hcCA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgdW5pb24oYSwgYikKKyAg
ICB7CisgICAgICAgIGEgPSBmaW5kKGEpOworICAgICAgICBiID0gZmluZChiKTsKKyAgICAgICAg
aWYgKGEgPT0gYikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICgh
Yi5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBhXTsKKyAgICAgICAgaWYg
KCFhLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdW5p
Znkgbm9uLXVuaWZpYWJsZSB0aGluZ3MgIiArIGEgKyAiIGFuZCAiICsgYik7CisgICAgICAgIAor
ICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0eXBlIHBhcmFtZXRlcnMgZG9uJ3QgZW5kIHVwIGJl
aW5nIHJvb3RzLgorICAgICAgICBpZiAoYS5pc1VuaWZpYWJsZSAmJiBiLmlzVW5pZmlhYmxlICYm
IHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhhcyhiKSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBh
XTsKKworICAgICAgICB0aGlzLl9uZXh0TWFwLnNldChhLCBiKTsKKyAgICB9CisgICAgCisgICAg
ZmluZChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTsKKyAgICAg
ICAgbGV0IG5leHROb2RlID0gdGhpcy5fbmV4dE1hcC5nZXQoY3VycmVudE5vZGUpOworICAgICAg
ICBpZiAoIW5leHROb2RlKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOworICAgICAg
ICBmb3IgKDs7KSB7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IG5leHROb2RlOworICAgICAg
ICAgICAgbmV4dE5vZGUgPSB0aGlzLl9uZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7CisgICAgICAg
ICAgICBpZiAoIW5leHROb2RlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIHRoaXMuX25leHRNYXAuc2V0KG5vZGUsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgcmV0
dXJuIGN1cnJlbnROb2RlOworICAgIH0KKyAgICAKKyAgICBnZXQgbm9kZXMoKQorICAgIHsKKyAg
ICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTZXQoKTsKKyAgICAgICAgZm9yIChsZXQgW2tleSwgdmFs
dWVdIG9mIHRoaXMuX25leHRNYXApIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoa2V5KTsKKyAg
ICAgICAgICAgIHJlc3VsdC5hZGQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZlcmlmeSgpCisgICAgeworICAgICAgICBmb3IgKGxl
dCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMuX3R5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBp
ZiAoIXR5cGVQYXJhbWV0ZXIudmVyaWZ5QXNQYXJhbWV0ZXIodGhpcykpCisgICAgICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVu
dCBvZiB0aGlzLm5vZGVzKSB7CisgICAgICAgICAgICBpZiAodGhpcy5fdHlwZVBhcmFtZXRlcnMu
aGFzKHR5cGVBcmd1bWVudCkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICBpZiAoIXR5cGVBcmd1bWVudC52ZXJpZnlBc0FyZ3VtZW50KHRoaXMpKQorICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisgICAgCisgICAgaXNVbnVuaWZpZWQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICF0aGlzLl9u
ZXh0TWFwLnNpemUoKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVl
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFsdWUgZXh0ZW5kcyBOb2RlIHsKKyAgICBnZXQga2luZCgp
IHsgcmV0dXJuIFZhbHVlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gZmFsc2U7
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVSZWYuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVSZWYuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVSZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBWYXJpYWJsZVJlZiBleHRlbmRzIEV4cHJlc3Npb24geworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7
CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhcmlhYmxlID0gbnVs
bDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9Cisg
ICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdGhpcy52YXJpYWJsZS5pc0NvbnN0ZXhwcjsg
fQorICAgIGdldCB1bmlmeU5vZGUoKSB7IHJldHVybiB0aGlzLnZhcmlhYmxlLnVuaWZ5Tm9kZTsg
fQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7
CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjAgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgVmlzaXRvciB7CisgICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAg
ICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAg
ICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVu
Y3Rpb24obm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUucmV0dXJuVHlwZS52aXNpdCh0aGlzKTsK
KyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQor
ICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQg
cGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNp
dCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvblBhcmFtZXRlcihub2RlKQor
ICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEZ1bmN0aW9uRGVmKG5vZGUpCisgICAgeworICAgICAgICB2aXNpdEZ1bmN0aW9uKG5vZGUp
OworICAgICAgICBub2RlLmJvZHkudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0
QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnN0
YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZp
c2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUg
b2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAgICAgc2lnbmF0dXJlLnZpc2l0KHRoaXMpOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAo
bGV0IHR5cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0eXBl
QXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0TmF0aXZlVHlwZShu
b2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtdGVyIG9mIG5vZGUudHlwZVBh
cmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5
cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJh
bWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxl
dCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBl
UGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBub2RlLmZp
ZWxkcykKKyAgICAgICAgICAgIGZpZWxkLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRDb25z
dGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RmllbGQobm9kZSkKKyAgICB7CisgICAgICAg
IG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRFbGVtZW50YWxU
eXBlKG5vZGUpCisgICAgeworICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMu
dmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVm
VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7
CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0
aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICAgICAgbm9kZS5udW1FbGVtZW50cy52
aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAg
eworICAgICAgICBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9kZS5yaHMudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICBpZiAobm9k
ZS52YWx1ZSkKKyAgICAgICAgICAgIG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc3RJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNp
dENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1l
bnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0
KHRoaXMpOworICAgICAgICBmb3IgKGxldCBhcmd1bWVudCBvZiBub2RlLmFyZ3VtZW50TGlzdCkK
KyAgICAgICAgICAgIGFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0KK30KKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319136</attachid>
            <date>2017-08-26 11:48:54 -0700</date>
            <delta_ts>2017-08-26 14:52:52 -0700</delta_ts>
            <desc>a bit more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>125232</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gdmFs
aWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAgIHN3aXRjaCAoYWRkcmVzc1Nw
YWNlKSB7CisgICAgY2FzZSAiY29uc3RhbnQiOgorICAgIGNhc2UgImRldmljZSI6CisgICAgY2Fz
ZSAidGhyZWFkZ3JvdXAiOgorICAgIGNhc2UgInRocmVhZCI6CisgICAgICAgIHJldHVybjsKKyAg
ICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBhZGRyZXNzIHNwYWNlOiAi
ICsgYWRkcmVzc1NwYWNlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9BcnJh
eVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlSZWZUeXBl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5UmVmVHlwZSBl
eHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1FbGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlw
ZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAg
CisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVt
ZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1l
bnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxlbWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUo
KSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9T
dHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0
aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2Vv
ZiBBcnJheVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgaWYgKCF0aGlzLm51bUVsZW1lbnRzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIu
bnVtRWxlbWVudHMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci5lbGVtZW50VHlwZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Bc3Np
Z25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFzc2lnbm1lbnQgZXh0ZW5kcyBF
eHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0
aGlzLl9yaHMgPSByaHM7CisgICAgfQorICAgIAorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlz
Ll9saHM7IH0KKyAgICBnZXQgcmhzKCkgeyByZXR1cm4gdGhpcy5fcmhzOyB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsgIiA9ICIgKyB0aGlz
LnJoczsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIEJsb2NrIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9z
dGF0ZW1lbnRzID0gW107CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICBhZGQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAg
dGhpcy5fc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIGdldCBz
dGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fc3RhdGVtZW50czsgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAieyAiICsgdGhpcy5zdGF0ZW1lbnRzLmpvaW4o
IjsgIik7ICsgIjsgfSI7CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2Fs
bEV4cHJlc3Npb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEV4cHJl
c3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEV4cHJlc3Np
b24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDYWxsRXhw
cmVzc2lvbiBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFt
ZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgc3VwZXIob3Jp
Z2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1
bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgICAgICB0aGlzLl9hcmd1bWVudExpc3QgPSBhcmd1
bWVudExpc3Q7CisgICAgICAgIHRoaXMucGh1bmN0aW9uID0gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVBcmd1bWVu
dHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGFyZ3VtZW50TGlz
dCgpIHsgcmV0dXJuIHRoaXMuX2FyZ3VtZW50TGlzdDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVu
dHMgKyAiPigiICsgdGhpcy5hcmd1bWVudExpc3QgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9DaGVja2VyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0NoZWNrZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tl
ci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDaGVja2Vy
IGV4dGVuZHMgVmlzaXRvciB7CisgICAgLy8gSXQncyB0b3RhbGx5IE9LIHRvIGluc3RhbnRpYXRl
IHRoaXMgd2l0aCB6ZXJvIGFyZ3VtZW50cyAoaS5lLiBwYXNzaW5nIHVuZGVmaW5lZCBmb3IgYm90
aCBvZgorICAgIC8vIHRoZW0pIGlmIHlvdSdyZSBjcmVhdGluZyBhIENoZWNrZXIgdG8gdmlzaXQg
YSBQcm9ncmFtLgorICAgIGNvbnN0cnVjdG9yKG5hbWVDb250ZXh0KQorICAgIHsKKyAgICAgICAg
dGhpcy5fbmFtZUNvbnRleHQgPSBuYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQ
cm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNv
bnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5wcm9ncmFtID0g
bm9kZTsKKyAgICAgICAgbmFtZUNvbnRleHQucmVjb2duaXplSW50cmluc2ljcygpOworICAgICAg
ICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAg
ICAgICBuYW1lQ29udGV4dC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBu
ZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBu
b2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmRvU3RhdGVt
ZW50KCgpID0+IHN0YXRlbWVudC52aXNpdChjaGVja2VyKSk7CisgICAgfQorICAgIAorICAgIF92
aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2RlKQorICAgIHsKKyAgICAg
ICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsK
KyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7
CisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAg
ICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBu
YW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvbihub2RlKQorICAgIHsK
KyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcih0aGlzLl92aXNpdFR5cGVQYXJhbWV0
ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2RlKSk7CisgICAgICAgIG5vZGUucmV0dXJuVHlwZS52
aXNpdChjaGVja2VyKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1l
dGVycykKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRGdW5jdGlvbkRlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNvbnRleHRX
aXRoVHlwZVBhcmFtZXRlcnMgPSB0aGlzLl92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1l
Q29udGV4dChub2RlKTsKKyAgICAgICAgbGV0IGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMgPSBu
ZXcgQ2hlY2tlcihjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5yZXR1
cm5UeXBlLnZpc2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMpOworICAgICAgICBsZXQgY29u
dGV4dFdpdGhQYXJhbWV0ZXJzID0gbmV3IE5hbWVDb250ZXh0KGNvbnRleHRXaXRoVHlwZVBhcmFt
ZXRlcnMpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKSB7
CisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7
CisgICAgICAgICAgICBjb250ZXh0V2l0aFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CisgICAg
ICAgIH0KKyAgICAgICAgbGV0IGNoZWNrZXJXaXRoUGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNv
bnRleHRXaXRoUGFyYW1ldGVycyk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdChjaGVja2VyV2l0
aFBhcmFtZXRlcnMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgewor
ICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5ldyBOYW1lQ29udGV4dCh0aGlzLl9u
YW1lQ29udGV4dCkpOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1l
bnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc2ln
bmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNldCA9IG5ldyBT
ZXQoKTsKKyAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnNpZGVyKHRoaW5nKQorICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgIGlmICh0aGluZy5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgICAg
ICAgICAgc2V0LmFkZCh0aGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGFzcyBO
b3RpY2VUeXBlVmFyaWFibGUgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAgICAgICAgICAgICB2aXNp
dFR5cGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNv
bnNpZGVyKG5vZGUudHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZp
c2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
ICAgIGNvbnNpZGVyKG5vZGUudmFyaWFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGxldCBub3RpY2VUeXBlVmFyaWFibGUgPSBuZXcgTm90aWNlVHlw
ZVZhcmlhYmxlKCk7CisgICAgICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXJUeXBlIG9mIHNpZ25h
dHVyZS5wYXJhbWV0ZXJUeXBlcykKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlLnZpc2l0
KG5vdGljZVR5cGVWYXJpYWJsZSk7CisgICAgICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVy
IG9mIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIGlmICghc2V0
Lmhhcyh0eXBlUGFyYW1ldGVyKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgQUxUeXBlRXJy
b3IodHlwZVBhcmFtZXRlci5vcmlnaW4ubGluZU51bWJlciwgIlR5cGUgcGFyYW1ldGVyIHRvIHBy
b3RvY29sIHNpZ25hdHVyZSBub3QgaW5mZXJyYWJsZSBmcm9tIHZhbHVlIHBhcmFtZXRlcnMiKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbGV0IG5hbWVDb250
ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgbmFtZUNv
bnRleHQuYWRkKG5vZGUudHlwZVZhcmlhYmxlKTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcg
Q2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBub2Rl
LnNpZ25hdHVyZXMpCisgICAgICAgICAgICBzaWduYXR1cmUudmlzaXQoY2hlY2tlcik7CisgICAg
fQorICAgIAorICAgIHZpc2l0VHlwZURlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVD
b250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9y
IChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAg
ICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRk
KHR5cGVQYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENo
ZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBub2RlLnR5cGUudmlzaXQoY2hlY2tlcik7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgbmFtZUNvbnRl
eHQuYWRkKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyID0g
bmV3IENoZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBub2Rl
LmZpZWxkcykKKyAgICAgICAgICAgIGZpZWxkLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCB0eXBlID0gdGhpcy5f
bmFtZUNvbnRleHQuZ2V0KFR5cGUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghdHlwZSkKKyAg
ICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAi
Q291bGQgbm90IGZpbmQgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgaWYgKCF0
aGlzLl9uYW1lQ29udGV4dC5pc0RlZmluZWQodHlwZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcg
QUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIklsbGVnYWwgZm9yd2FyZCB1c2Ug
b2YgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS50eXBlID0gdHlwZTsK
KyAgICAgICAgCisgICAgICAgIGlmICh0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCAhPSBub2Rl
LnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9y
KG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMi
KTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0
aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgcGFyYW1ldGVySXNUeXBlID0gdHlwZS50eXBlUGFy
YW1ldGVyc1tpXSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZTsKKyAgICAgICAgICAgIGxldCBhcmd1
bWVudElzVHlwZSA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIFR5cGU7CisgICAg
ICAgICAgICBpZiAocGFyYW1ldGVySXNUeXBlICYmICFhcmd1bWVudElzVHlwZSkKKyAgICAgICAg
ICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIkV4
cGVjdGVkIHR5cGUsIGJ1dCBnb3QgdmFsdWUgYXQgYXJndW1lbnQgIyIgKyBpKTsKKyAgICAgICAg
ICAgIGlmICghcGFyYW1ldGVySXNUeXBlICYmIGFyZ3VtZW50SXNUeXBlKQorICAgICAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiRXhwZWN0
ZWQgdmFsdWUsIGJ1dCBnb3QgdHlwZSBhdCBhcmd1bWVudCAjIiArIGkpOworICAgICAgICAgICAg
aWYgKCFhcmd1bWVudElzVHlwZSkgeworICAgICAgICAgICAgICAgIGlmICghbm9kZS50eXBlQXJn
dW1lbnRzW2ldLmlzQ29uc3RFeHByKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxU
eXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIkV4cGVjdGVkIGNvbnN0ZXhwciB2YWx1
ZSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBzdXBlci52
aXNpdFR5cGVSZWYobm9kZSk7CisgICAgICAgIAorICAgICAgICB3aGlsZSAobm9kZS50eXBlIGlu
c3RhbmNlb2YgVHlwZURlZikgeworICAgICAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9
IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQobm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzKTsKKyAgICAg
ICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlwZS50eXBlUGFy
YW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhcmd1bWVu
dC9wYXJhbWV0ZXIgbWlzbWF0Y2ggKHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGVhcmxpZXIpIik7
CisgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5n
dGg7ICsraSkKKyAgICAgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5p
ZmljYXRpb25Db250ZXh0LCBub2RlLnR5cGUudHlwZVBhcmFtZXRlcnNbaV0pOworICAgICAgICAg
ICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJUeXBlIHJlZmVyZW5j
ZSB0byBhIHR5cGUgZGVmaW5pdGlvbiB2aW9sYXRlcyBwcm90b2NvbCBjb25zdHJhaW50cyIpOwor
ICAgICAgICAgICAgCisgICAgICAgICAgICBub2RlLnR5cGUgPSBub2RlLnR5cGUuc3Vic3RpdHV0
ZVRvVW5pZmljYXRpb24obm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzLCB1bmlmaWNhdGlvbkNvbnRl
eHQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2Rl
KQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMu
X25hbWVDb250ZXh0KTsKKyAgICAgICAgbmFtZUNvbnRleHQuZGVmaW5lQWxsKCk7CisgICAgICAg
IG5vZGUuZWxlbWVudFR5cGUudmlzaXQobmV3IENoZWNrZXIobmFtZUNvbnRleHQpKTsKKyAgICAg
ICAgCisgICAgICAgIGlmIChub2RlLmFkZHJlc3NTcGFjZSA9PSAidGhyZWFkIikKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGNsYXNzIEluc3RhbnRpYXRlSW1tZWRpYXRl
cyBleHRlbmRzIFJld3JpdGVyIHsKKyAgICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAg
ICAgICAgICAgeworICAgICAgICAgICAgICAgIG5vZGUgPSBzdXBlci52aXNpdFR5cGVSZWYobm9k
ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuaW5zdGFudGlhdGVkVHlwZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5v
ZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghbm9kZS5lbGVtZW50VHlw
ZS52aXNpdChuZXcgSW5zdGFudGlhdGVJbW1lZGlhdGVzKCkpLmlzUHJpbWl0aXZlKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJJbGxl
Z2FsIHBvaW50ZXIgdG8gbm9uLXByaW1pdGl2ZSB0eXBlIik7CisgICAgfQorICAgIAorICAgIHZp
c2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGxoc1R5cGUgPSBub2RlLmxo
cy52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IHJoc1R5cGUgPSBub2RlLnJocy52aXNpdCh0aGlz
KTsKKyAgICAgICAgaWYgKCFsaHNUeXBlLmVxdWFscyhyaHNUeXBlKSkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiVHlwZSBtaXNtYXRj
aCBpbiBhc3NpZ25tZW50OiAiICsgbGhzVHlwZSArICIgdmVyc3VzICIgKyByaHNUeXBlKTsKKyAg
ICAgICAgcmV0dXJuIGxoc1R5cGU7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYo
bm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQo
VmFsdWUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJDb3VsZCBub3QgZmlu
ZCB2YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9
IHJlc3VsdDsKKyAgICAgICAgbm9kZS4KKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXN1bHQu
dHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAg
IGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAgICBsZXQgcmVzdWx0VHlwZSA9IG5vZGUudmFs
dWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmN1cnJl
bnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUuZXF1YWxzKHJlc3VsdFR5cGUpKQorICAgICAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiVHJ5aW5n
IHRvIHJldHVybiAiICsgcmVzdWx0VHlwZSArICIgaW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMg
IiArIHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIXRoaXMu
X25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUuZXF1YWxzKHRoaXMuX25h
bWVDb250ZXh0LmludHJpbnNpY3Mudm9pZCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBl
RXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIk5vbi12b2lkIGZ1bmN0aW9uIG11c3QgcmV0
dXJuIGEgdmFsdWUiKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbmFtZUNvbnRleHQuaW50cmluc2ljcy5pbnQzMjsK
KyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAg
ICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50VHlwZXMg
PSBub2RlLmFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykp
OworICAgICAgICBsZXQgb3ZlcmxvYWQgPSB0aGlzLl9uYW1lQ29udGV4dC5wcm9ncmFtLnJlc29s
dmVGdW5jdGlvbk92ZXJsb2FkKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1
bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAg
ICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVOdW1iZXIsICJEaWQgbm90
IGZpbmQgZnVuY3Rpb24gZm9yIGNhbGwiKTsKKyAgICAgICAgcmV0dXJuIG92ZXJsb2FkLnBodW5j
dGlvbi5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAorICAgICAgICAgICAgb3Zl
cmxvYWQucGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlvbkNvbnRl
eHQpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBh
cmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBl
UGFyYW1ldGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhw
clR5cGVQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVmFsdWUgeworICAgIGNvbnN0cnVj
dG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9y
aWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0
eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICBnZXQgaXNDb25zdGV4
cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gdHJ1
ZTsgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAg
IHsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBsZXQgcmVhbFRo
aXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlz
ICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBW
YXJpYWJsZVJlZikKKyAgICAgICAgICAgIG90aGVyID0gb3RoZXIudmFyaWFibGU7CisgICAgICAg
IAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIpOworICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNh
dGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisg
ICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL0V4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
RXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IEV4cHJlc3Npb24gZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luKQorICAg
IHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQg
b3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cit9CkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9GaWVsZC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZpZWxkIHsKKyAgICBjb25zdHJ1Y3Rvcihv
cmlnaW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47
CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsK
KyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQor
ICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyBy
ZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvRnVuY3Rpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvRnVuY3Rpb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rp
b24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlv
biBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG5hbWUsIHJldHVyblR5cGUsIHR5cGVQ
YXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7
CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICB0aGlzLl90
eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9wYXJhbWV0ZXJz
ID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlz
Ll9uYW1lOyB9CisgICAgZ2V0IHJldHVyblR5cGUoKSB7IHJldHVybiB0aGlzLl9yZXR1cm5UeXBl
OyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRl
cnM7IH0KKyAgICBnZXQgcGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7IH0K
KyAgICBnZXQgcGFyYW1ldGVyVHlwZXMoKSB7IHJldHVybiB0aGlzLnBhcmFtZXRlcnMubWFwKHBh
cmFtZXRlciA9PiBwYXJhbWV0ZXIudHlwZSk7IH0KKyAgICAKKyAgICBnZXQga2luZCgpIHsgcmV0
dXJuIEZ1bmN0aW9uOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMucmV0dXJuVHlwZSArICIgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBh
cmFtZXRlcnMgKyAiPigiICsgdGhpcy5wYXJhbWV0ZXJzICsgIikiOworICAgIH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25EZWYuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvRnVuY3Rpb25EZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvRnVuY3Rpb25EZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBGdW5jdGlvbkRlZiBleHRlbmRzIEZ1bmN0aW9uIHsKKyAgICBjb25zdHJ1Y3Rvcihv
cmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLCBib2R5
KQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMs
IHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRo
aXMuX2JvZHkgPSBib2R5OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4g
dGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGJvZHkoKSB7IHJldHVybiB0aGlzLl9ib2R5OyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5n
KCkgKyAiIHsgIiArIGJvZHkgKyAiIH0iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBGdW5jdGlvblBhcmFtZXRlciB7CisgICAgLy8gVGhlIG5hbWUgaXMgb3B0aW9u
YWwuIEl0J3MgT0sgZm9yIGl0IHRvIGJlIG51bGwhCisgICAgY29uc3RydWN0b3IobmFtZSwgdHlw
ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBl
ID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1l
OyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgCisgICAgdG9T
dHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMubmFt
ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uU2lnbmF0dXJl
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uU2lnbmF0dXJlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uU2lnbmF0dXJlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvSW50TGl0ZXJhbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbnRM
aXRlcmFsLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBJbnRMaXRlcmFs
IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB2YWx1ZSkKKyAg
ICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7
CisgICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9Cisg
ICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHRvU3RyaW5n
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAiIiArIHRoaXMuX3ZhbHVlOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL0ludHJpbnNpY3MuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBJbnRyaW5zaWNzIHsKKyAgICBjb25zdHJ1Y3RvcigpCisgICAgeworICAgICAgICB0
aGlzLl9tYXAgPSBuZXcgTWFwKCk7CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAg
ICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUgdm9pZDw+IiwKKyAgICAgICAgICAgICh0eXBlKSA9
PiB7CisgICAgICAgICAgICAgICAgdGhpcy52b2lkID0gdHlwZTsKKyAgICAgICAgICAgIH0pOwor
CisgICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0
eXBlIGludDMyPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0
aGlzLmludDMyID0gdHlwZTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX21hcC5z
ZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBlIGRvdWJsZTw+IiwKKyAgICAg
ICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5kb3VibGUgPSB0eXBlOwor
ICAgICAgICAgICAgfSk7CisgICAgfQorICAgIAorICAgIGFkZCh0aGluZykKKyAgICB7CisgICAg
ICAgIGxldCBpbnRyaW5zaWMgPSB0aGlzLl9tYXAuZ2V0KHRoaW5nLm5hbWUpOworICAgICAgICBp
ZiAoIWludHJpbnNpYykKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5v
cmlnaW4ubGluZU51bWJlciwgIlVucmVjb2duaXplZCBpbnRyaW5zaWM6ICIgKyB0aGluZyk7Cisg
ICAgICAgIGludHJpbnNpYyh0aGluZyk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9MZXhlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBMZXhlciB7CisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAg
ICAgICB0aGlzLl90ZXh0ID0gdGV4dDsKKyAgICAgICAgdGhpcy5faW5kZXggPSAwOworICAgICAg
ICB0aGlzLl9zdGFjayA9IFtdOworICAgIH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyRm9ySW5kZXgodGhpcy5faW5kZXgp
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLl9vcmlnaW4gKyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQor
ICAgIAorICAgIGxpbmVOdW1iZXJGb3JJbmRleChpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLl90ZXh0LnN1YnN0cmluZygwLCBpbmRleCkubWF0Y2goL1xuL2cpLmxlbmd0aDsKKyAg
ICB9CisgICAgCisgICAgZ2V0IHN0YXRlKCkgeyByZXR1cm4gdGhpcy5faW5kZXg7IH0KKyAgICBz
ZXQgc3RhdGUodmFsdWUpIHsgdGhpcy5faW5kZXggPSB2YWx1ZTsgfQorICAgIAorICAgIG5leHQo
KQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3N0YWNrLmxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzLl9zdGFjay5wb3AoKTsKKyAgICAgICAgCisgICAgICAgIGlmICh0aGlzLl9pbmRl
eCA+PSB0aGlzLl90ZXh0Lmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAg
ICAKKyAgICAgICAgY29uc3QgaXNDQ29tbWVudEJlZ2luID0gL1wvXCovOworICAgICAgICBjb25z
dCBpc0NQbHVzUGx1c0NvbW1lbnRCZWdpbiA9IC9cL1wvLzsKKyAgICAgICAgCisgICAgICAgIGxl
dCByZXN1bHQgPSAoa2luZCkgPT4geworICAgICAgICAgICAgbGV0IHRleHQgPSBSZWdFeHAubGFz
dE1hdGNoOworICAgICAgICAgICAgbGV0IHRva2VuID0gbmV3IExleGVyVG9rZW4odGhpcywgdGhp
cy5faW5kZXgsIGtpbmQsIHRleHQpOworICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gdGV4dC5s
ZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH07CisKKyAgICAgICAg
bGV0IHJlbGV2YW50VGV4dDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcmVsZXZh
bnRUZXh0ID0gdGhpcy5fdGV4dC5zdWJzdHJpbmcodGhpcy5faW5kZXgpOworICAgICAgICAgICAg
aWYgKC9eXHMrLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9p
bmRleCArPSBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgvXlwvXCovLnRlc3QocmVsZXZhbnRU
ZXh0KSkgeworICAgICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHJlbGV2YW50VGV4dC5zZWFy
Y2goL1wqXC8vKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCAwKQorICAgICAgICAg
ICAgICAgICAgICB0aGlzLmZhaWwoIlVudGVybWluYXRlZCBjb21tZW50Iik7CisgICAgICAgICAg
ICAgICAgdGhpcy5faW5kZXggKz0gZW5kSW5kZXg7CisgICAgICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wvLiovLnRlc3QocmVsZXZhbnRU
ZXh0KSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gu
bGVuZ3RoOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FOiBNYWtl
IHRoaXMgZG8gVW5pY29kZS4KKyAgICAgICAgaWYgKC9eW15cZFxXXVx3Ki8udGVzdChyZWxldmFu
dFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiaWRlbnRpZmllciIpOworCisgICAg
ICAgIGlmICgvXlswLTldKy8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdCgiaW50ZWdlckxpdGVyYWwiKTsKKworICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlz
IGhhbmRsZSBleHAtZm9ybSBsaXRlcmFscyBsaWtlIDFlMS4KKyAgICAgICAgaWYgKC9eKFswLTld
KlwuWzAtOV0rKXwoWzAtOV0rXC5bMC05XSopLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAg
ICAgICByZXR1cm4gcmVzdWx0KCJmbG9hdExpdGVyYWwiKTsKKyAgICAgICAgCisgICAgICAgIGlm
ICgvXihzdHJ1Y3R8cHJvdG9jb2x8dHlwZXxpZnxlbHNlfGVudW18Y29udGludWV8YnJlYWt8c3dp
dGNofGNhc2V8ZGVmYXVsdHxmb3J8d2hpbGV8ZG98cmV0dXJufHNpemVvZnxjb25zdGFudHxkZXZp
Y2V8dGhyZWFkZ3JvdXB8dGhyZWFkfG9wZXJhdG9yKS8udGVzdChyZWxldmFudFRleHQpKQorICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdCgia2V5d29yZCIpOworICAgICAgICAKKyAgICAgICAgaWYg
KC9eKFt7fSgpXFtcXT86PSsqXC8sLiUhfl4mfDw+XFwtXXwtPnw9Pnw8PXw9PXwhPXwrPXwtPXxc
Kj18XC89fCU9fF49fFx8PXwmPSkvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJl
dHVybiByZXN1bHQoInB1bmN0dWF0aW9uIik7CisgICAgICAgIAorICAgICAgICBmYWlsKCJVbnJl
Y29nbml6ZWQgdG9rZW4gYmVnaW5uaW5nIHdpdGg6ICIgKyByZWxldmFudFRleHQuc3Vic3RyaW5n
KDAsIDEwKSk7CisgICAgfQorICAgIAorICAgIHB1c2godG9rZW4pCisgICAgeworICAgICAgICB0
aGlzLl9zdGFjay5wdXNoKHRva2VuKTsKKyAgICB9CisgICAgCisgICAgcGVlaygpCisgICAgewor
ICAgICAgICBsZXQgcmVzdWx0ID0gbmV4dCgpOworICAgICAgICBwdXNoKHJlc3VsdCk7CisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZhaWwoZXJyb3IpCisgICAgewor
ICAgICAgICB0aHJvdyBuZXcgQUxTeW50YXhFcnJvcih0aGlzLm9yaWdpblN0cmluZywgZXJyb3Ip
OworICAgIH0KKyAgICAKKyAgICBiYWNrdHJhY2tpbmdTY29wZShjYWxsYmFjaykKKyAgICB7Cisg
ICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAg
ICByZXR1cm4gY2FsbGJhY2soKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAg
aWYgKGUgaW5zdGFuY2VvZiBBTFN5bnRheEVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhpcy5z
dGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KK30KSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvTGV4ZXJUb2tlbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhl
clRva2VuLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4
ZXJUb2tlbiB7CisgICAgY29uc3RydWN0b3IobGV4ZXIsIG9yaWdpbiwgaW5kZXgsIGtpbmQsIHRl
eHQpCisgICAgeworICAgICAgICB0aGlzLl9sZXhlciA9IGxleGVyOworICAgICAgICB0aGlzLl9v
cmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7CisgICAgICAgIHRo
aXMuX2tpbmQgPSBraW5kOworICAgICAgICB0aGlzLl90ZXh0ID0gdGV4dDsKKyAgICB9CisgICAg
CisgICAgZ2V0IGtpbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2tpbmQ7CisgICAg
fQorICAgIAorICAgIGdldCB0ZXh0KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLl9vcmlnaW47CisgICAgfQorICAgIAorICAgIGdldCBpbmRleCgpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5faW5kZXg7CisgICAgfQorICAgIAorICAgIGdldCBsaW5lTnVtYmVyKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9sZXhlci5saW5lTnVtYmVyRm9ySW5kZXgodGhp
cy5faW5kZXgpOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLm9yaWdpbiArICI6IiArICh0aGlzLmxpbmVOdW1iZXIgKyAxKTsK
KyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJMZXhl
clRva2VuKCIgKyB0aGlzLmtpbmQgKyAiLCAiICsgdGhpcy50ZXh0ICsgIiwgIiArIHRoaXMubGlu
ZU51bWJlciArICIpIjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29u
dGV4dC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29udGV4dC5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OYW1lQ29udGV4dC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjb25zdCBuYW1lYWJsZVNpbXBsZUtpbmRz
ID0gbmV3IFNldChbVHlwZSwgVmFsdWUsIFByb3RvY29sXSk7Citjb25zdCBuYW1lYWJsZU92ZXJs
b2FkYWJsZUtpbmRzID0gbmV3IFNldChbRnVuY3Rpb25dKTsKK2NvbnN0IG5hbWVhYmxlS2luZHMg
PSBuZXcgU2V0KEFycmF5LmZyb20obmFtZWFibGVTaW1wbGVLaW5kcykuY29uY2F0KEFycmF5LmZy
b20obmFtZWFibGVPdmVybG9hZGFibGVLaW5kcykpKTsKKworY2xhc3MgTmFtZUNvbnRleHQgewor
ICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3
IE1hcCgpOworICAgICAgICBmb3IgKGxldCBraW5kIG9mIG5hbWVhYmxlS2luZHMpCisgICAgICAg
ICAgICB0aGlzLl9tYXAuc2V0KGtpbmQsIG5ldyBNYXAoKSk7CisgICAgICAgIHRoaXMuX2RlZmlu
ZWQgPSBuZXcgU2V0KCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOwor
ICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IG51bGw7CisgICAgICAgIHRoaXMuX2ludHJpbnNpY3Mg
PSBudWxsOworICAgICAgICB0aGlzLl9wcm9ncmFtID0gbnVsbDsKKyAgICB9CisgICAgCisgICAg
bWFwRm9yKGtpbmQpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbWFwLmdldChr
aW5kKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Io
IkJhZCBraW5kOiAiICsga2luZCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAg
IAorICAgIGFkZCh0aGluZykKKyAgICB7CisgICAgICAgIGlmICghdGhpbmcubmFtZSkKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICh0aGluZy5pc05hdGl2ZSkgewor
ICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigiTmF0aXZlIGZ1bmN0aW9uIGluIGEgc2NvcGUgdGhhdCBkb2VzIG5vdCByZWNv
Z25pemUgaW50cmluc2ljcyIpOworICAgICAgICAgICAgdGhpcy5faW50cmluc2ljcy5hZGQodGhp
bmcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBsZXQgbWFwID0gbWFwRm9yKHRoaW5n
LmtpbmQpOworICAgICAgICBpZiAobmFtZWFibGVPdmVybG9hZGFibGVLaW5kcy5oYXModGhpbmcu
a2luZCkpIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IG1hcC5nZXQodGhpbmcubmFtZSk7Cisg
ICAgICAgICAgICBpZiAoIWFycmF5KQorICAgICAgICAgICAgICAgIG1hcC5zZXQodGhpbmcubmFt
ZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFwLmhhcyh0aGluZy5uYW1lKSkK
KyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ubGluZU51bWJl
ciwgIkR1cGxpY2F0ZSBuYW1lOiAiICsgdGhpbmcubmFtZSk7CisgICAgICAgIG1hcC5zZXQodGhp
bmcubmFtZSwgdGhpbmcpOworICAgIH0KKyAgICAKKyAgICBnZXQoa2luZCwgbmFtZSkKKyAgICB7
CisgICAgICAgIGxldCByZXN1bHQgPSBtYXBGb3Ioa2luZCkuZ2V0KG5hbWUpOworICAgICAgICBp
ZiAoIXJlc3VsdCAmJiB0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9k
ZWxlZ2F0ZS5nZXQoa2luZCwgbmFtZSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIGdldCBjdXJyZW50U3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlz
Ll9jdXJyZW50U3RhdGVtZW50KQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0
ZW1lbnQ7CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLl9kZWxlZ2F0ZS5jdXJyZW50U3RhdGVtZW50OworICAgICAgICByZXR1cm4gbnVsbDsKKyAg
ICB9CisgICAgCisgICAgaXNEZWZpbmVkKHRoaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMuX2RlZmluZWQuaGFzKHRoaW5nKQorICAgICAgICAgICAgfHwgKHRoaXMuX2RlbGVnYXRlICYm
IHRoaXMuX2RlbGVnYXRlLmlzRGVmaW5lZCh0aGluZykpOworICAgIH0KKyAgICAKKyAgICBkZWZp
bmUodGhpbmcpCisgICAgeworICAgICAgICB0aGlzLl9kZWZpbmVkLnNldCh0aGluZyk7CisgICAg
fQorICAgIAorICAgIGRlZmluZUFsbCgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0aGluZyBv
ZiB0aGlzKQorICAgICAgICAgICAgZGVmaW5lKHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZG9T
dGF0ZW1lbnQoc3RhdGVtZW50LCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHRoaXMuX2N1cnJl
bnRTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIHRo
aXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBkZWZpbmUoc3RhdGVtZW50KTsK
KyAgICB9CisgICAgCisgICAgcmVjb2duaXplSW50cmluc2ljcygpCisgICAgeworICAgICAgICB0
aGlzLl9pbnRyaW5zaWNzID0gbmV3IEludHJpbnNpY3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0
IGludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5faW50cmluc2ljczsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVn
YXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAg
ICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAg
ICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0
IHByb2dyYW0oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAg
ICByZXR1cm4gdGhpcy5fcHJvZ3JhbTsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnByb2dyYW07CisgICAgICAgIHJldHVybiBu
dWxsOworICAgIH0KKyAgICAKKyAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgbWFwIG9mIHRoaXMuX21hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9y
IChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVs
ZCB0eXBlOworICAgICAgICB9CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0
aXZlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVUeXBlIGV4dGVuZHMg
VHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBpc1ByaW1pdGl2ZSwgdHlwZVBh
cmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAg
IHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0
aXZlOworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAg
IH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1bnIgdGhpcy5fb3JpZ2luOyB9CisgICAg
Z2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkg
eyByZXR1cm4gdGhpcy5faXNQcmltaXRpdmU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7
IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0
dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsK
KyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMu
bGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgdHlw
ZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICBpZiAoIXR5cGVBcmd1bWVu
dHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVybiBuZXcg
TmF0aXZlVHlwZUluc3RhbmNlKHRoaXMsIHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAg
ICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIm5hdGl2ZSAiICsgKHRoaXMuaXNQ
cmltaXRpdmUgPyAicHJpbWl0aXZlICIgOiAiIikgKyAidHlwZSAiICsgdGhpcy5uYW1lICsgIjwi
ICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgTmF0aXZlVHlwZUluc3RhbmNlIGV4dGVuZHMgVHlwZSB7CisgICAg
Y29uc3RydWN0b3IodHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5
cGUgPSB0eXBlOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsK
KyAgICB9CisgICAgCisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAg
Z2V0IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAg
Z2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5fdHlwZS5pc1ByaW1pdGl2ZTsgfQorICAg
IGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5p
ZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0g
b3RoZXIudHlwZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMu
dHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50
eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFy
Z3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNb
aV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMudHlwZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9Ob2RlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTm9k
ZSB7CisgICAgdmlzaXQodmlzaXRvcikKKyAgICB7CisgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9
IHZpc2l0b3JbInZpc2l0IiArIHRoaXMuY29uc3RydWN0b3IubmFtZV0odGhpcyk7CisgICAgICAg
IGlmICgicmV0dXJuVmFsdWUiIGluIHZpc2l0b3IpCisgICAgICAgICAgICByZXR1cm4gdmlzaXRv
ci5yZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKyAgICAK
KyAgICB1bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0
IHVuaWZ5VGhpcyA9IHRoaXMudW5pZnlOb2RlOworICAgICAgICBsZXQgdW5pZnlPdGhlciA9IG90
aGVyLnVuaWZ5Tm9kZTsKKyAgICAgICAgaWYgKHVuaWZ5T3RoZXIudHlwZVZhcmlhYmxlVW5pZnko
dW5pZmljYXRpb25Db250ZXh0LCB1bmlmeVRoaXMpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgICAgIHJldHVybiB1bmlmeVRoaXMudW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwg
dW5pZnlPdGhlcik7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRl
eHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKG90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgdGhpcykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAg
ICAgcmV0dXJuIHRoaXMgPT0gb3RoZXI7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgfQorICAgIAorICAgIGdldCB1bmlmeU5vZGUoKSB7IHJldHVybiB0aGlzOyB9Cisg
ICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaXNO
YXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIGVxdWFscyhvdGhlcikKKyAgICB7
CisgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0
KCk7CisgICAgICAgIHJldHVybiB0aGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIp
ICYmIHVuaWZpY2F0aW9uQ29udGV4dC5pc1VudW5pZmllZCgpOworICAgIH0KKyAgICAKKyAgICBz
dWJzdGl0dXRlKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLnZpc2l0KFN1YnN0aXR1dGlvbi5tYXBwaW5nKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlz
dCkpOworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihwYXJhbWV0ZXJz
LCB1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZShw
YXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLm1hcCh0eXBlID0+IHVuaWZpY2F0aW9uQ29udGV4dC5maW5k
KHR5cGUpKSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyMzYg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworZnVuY3Rpb24gcGFyc2UocHJvZ3JhbSwgb3JpZ2luLCB0ZXh0KQoreworICAgIGxl
dCBsZXhlciA9IG5ldyBMZXhlcihvcmlnaW4sIHRleHQpOworICAgIAorICAgIC8vIFRoZSBoYXJk
ZXN0IHBhcnQgb2YgZGVhbGluZyB3aXRoIEMtbGlrZSBsYW5ndWFnZXMgaXMgcGFyc2luZyB2YXJp
YWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnRzLgorICAgIC8vIExldCdzIGNvbnNpZGVyIGlmIHRo
aXMgaGFwcGVucyBpbiBBcnJheUxhbmcuIEhlcmUgYXJlIHRoZSB2YWxpZCBzdGF0ZW1lbnRzIGlu
IEFycmF5TGFuZyB0aGF0CisgICAgLy8gYmVnaW4gd2l0aCBhbiBpZGVudGlmaWVyLCBpZiB3ZSBh
c3N1bWUgdGhhdCBhbnkgZXhwcmVzc2lvbiBjYW4gYmUgYSBzdGFuZGFsb25lIHN0YXRlbWVudC4K
KyAgICAvLworICAgIC8vICAgICB4OworICAgIC8vICAgICB4IDxiaW5vcD4geTsKKyAgICAvLyAg
ICAgeCA8IHk7CisgICAgLy8gICAgIHggPCB5ID4gejsKKyAgICAvLyAgICAgeCA9IHk7CisgICAg
Ly8gICAgIHguZiA9IHk7CisgICAgLy8gICAgIFxleHAgPSB5OworICAgIC8vICAgICB4WzQyXSA9
IHk7CisgICAgLy8gICAgIHgoKTsKKyAgICAvLyAgICAgeDx5PigpOworICAgIC8vICAgICB4IHk7
CisgICAgLy8gICAgIHg8eT4gejsKKyAgICAvLyAgICAgeFtdIHk7CisgICAgLy8gICAgIHhbNDJd
IHk7CisgICAgLy8gICAgIHheIHk7CisgICAgLy8KKyAgICAvLyBUaGlzIGhhcyB0d28gcHJvYmxl
bSBhcmVhczoKKyAgICAvLworICAgIC8vICAgICAtIHg8eT56IGNhbiBwYXJzZSB0d28gZGlmZmVy
ZW50IHdheXMgKGFzICh4IDwgeSkgPiB6IG9yIHg8eT4geikuCisgICAgLy8gICAgIC0geFs0Ml0g
Y291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9yIGEgdmFyaWFibGUgZGVjbGFyYXRp
b24uCisgICAgLy8gICAgIC0geDx5PiBjb3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQg
b3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAvLworICAgIC8vIFdlIHNvbHZlIHRoZSBm
aXJzdCBwcm9ibGVtIGJ5IGZvcmJpZGRpbmcgZXhwcmVzc2lvbnMgYXMgc3RhdGVtZW50cy4gVGhl
IGxhY2sgb2YgZnVuY3Rpb24KKyAgICAvLyBwb2ludGVycyBtZWFucyB0aGF0IHdlIGNhbiBzdGls
bCBhbGxvdyBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudHMgLSB1bmxpa2UgaW4gQywgdGhvc2UgY2Fu
bm90CisgICAgLy8gaGF2ZSBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgYXMgdGhlIGNhbGxlZS4gVGhl
IHJlbWFpbmluZyB0d28gcHJvYmxlbXMgYXJlIHNvbHZlZCBieQorICAgIC8vIGJhY2t0cmFja2lu
Zy4gSW4gYWxsIG90aGVyIHJlc3BlY3RzLCB0aGlzIGlzIGEgc2ltcGxlIHJlY3Vyc2l2ZSBkZXNj
ZW50IHBhcnNlci4KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmljQ29uc3VtZShjYWxsYmFjaykK
KyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLm5leHQoKTsKKyAgICAgICAgaWYgKCF0
b2tlbikKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsK
KyAgICAgICAgaWYgKGNhbGxiYWNrKHRva2VuKSkKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVu
ZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50ZXh0ICsgIjsgZXhwZWN0ZWQ6ICIgKyB0ZXh0KTsK
KyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBjb25zdW1l
KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNDb25zdW1lKHRva2VuID0+
IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
Y29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljQ29uc3VtZSh0
b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBh
c3NlcnROZXh0KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgbGV4ZXIucHVzaChjb25zdW1lKC4u
LnRleHRzKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGdlbmVyaWNUZXN0KGNhbGxiYWNr
KQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAo
dG9rZW4gJiYgY2FsbGJhY2sodG9rZW4pKQorICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAg
ICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdGVzdCguLi50ZXh0
cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljVGVzdCh0b2tlbiA9PiB0ZXh0cy5pbmNs
dWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRlc3RLaW5kKGtp
bmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Rlc3QodG9rZW4gPT4gdG9rZW4ua2lu
ZCA9PSBraW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5Q29uc3VtZSguLi50ZXh0
cykKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0KC4uLnRleHRzKTsKKyAgICAgICAg
aWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQcm90b2NvbFJlZigpCisgICAg
eworICAgICAgICBsZXQgcHJvdG9jb2xUb2tlbiA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7
CisgICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xSZWYocHJvdG9jb2xUb2tlbi5vcmlnaW4sIHBy
b3RvY29sVG9rZW4udGV4dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlwZVBh
cmFtZXRlcnMoKQorICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8IikpCisgICAgICAgICAgICBy
ZXR1cm4gW107CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gW107CisgICAgICAgIGNv
bnN1bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+IikpIHsKKyAgICAgICAgICAgIGxl
dCBjb25zdGV4cHIgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAgICAg
ICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9
IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgi
LCIsICI+Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdGV4cHJUeXBlUGFyYW1l
dGVyKHR5cGUub3JpZ2luLCBuYW1lLCB0eXBlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAg
ICAgaWYgKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaChjb25zdGV4cHIp
OworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1l
S2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgICAgIGxldCBwcm90b2NvbCA9IHRyeUNv
bnN1bWUoIjoiKSA/IHBhcnNlUHJvdG9jb2xSZWYoKSA6IG51bGw7CisgICAgICAgICAgICAgICAg
cmVzdWx0LnB1c2gobmV3IFR5cGVWYXJpYWJsZShuYW1lLm9yaWdpbiwgbmFtZS50ZXh0LCBwcm90
b2NvbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikp
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgiPiIp
OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJz
ZVR5cGVEZWYoKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInR5cGUiKS5v
cmlnaW47CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKS50ZXh0
OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7Cisg
ICAgICAgIGNvbnN1bWUoIj0iKTsKKyAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAg
ICAgICAgY29uc3VtZSgiOyIpOworICAgICAgICByZXR1cm4gbmV3IFR5cGVEZWYob3JpZ2luLCBu
YW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlU3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsK
KyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIjsiKSB7CisgICAgICAgICAgICBsZXhlci5uZXh0
KCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9r
ZW4udGV4dCA9PSAicmV0dXJuIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVJldHVybigpOwor
ICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiYnJlYWsiKQorICAgICAgICAgICAgcmV0dXJuIHBh
cnNlQnJlYWsoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImNvbnRpbnVlIikKKyAgICAg
ICAgICAgIHJldHVybiBwYXJzZUNvbnRpbnVlKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09
ICJ3aGlsZSIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VXaGlsZSgpOworICAgICAgICBpZiAo
dG9rZW4udGV4dCA9PSAiZG8iKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlRG8oKTsKKyAgICAg
ICAgaWYgKHRva2VuLnRleHQgPT0gImZvciIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VGb3Io
KTsKKyAgICAgICAgbGV0IGFzc2lnbm1lbnQgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9
PiB7IHJldHVybiBwYXJzZUFzc2lnbm1lbnQoKTsgfSk7CisgICAgICAgIGlmIChhc3NpZ25tZW50
KQorICAgICAgICAgICAgcmV0dXJuIGFzc2lnbm1lbnQ7CisgICAgICAgIGxldCB2YXJpYWJsZURl
Y2wgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7IHJldHVybiBwYXJzZVZhcmlhYmxl
RGVjbCgpOyB9KTsKKyAgICAgICAgaWYgKHZhcmlhYmxlRGVjbCkKKyAgICAgICAgICAgIHJldHVy
biB2YXJpYWJsZURlY2w7CisgICAgICAgIHJldHVybiBwYXJzZUNhbGxFeHByZXNzaW9uKCk7Cisg
ICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQmxvY2soKQorICAgIHsKKyAgICAgICAgbGV0
IG9yaWdpbiA9IGNvbnN1bWUoInsiKS5vcmlnaW47CisgICAgICAgIGxldCBibG9jayA9IG5ldyBC
bG9jayhvcmlnaW4pOworICAgICAgICB3aGlsZSAoIXRlc3QoIn0iKSkgeworICAgICAgICAgICAg
bGV0IHN0YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CisgICAgICAgICAgICBpZiAoc3RhdGVt
ZW50KQorICAgICAgICAgICAgICAgIGJsb2NrLnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfQor
ICAgICAgICBjb25zdW1lKCJ9Iik7CisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gcGFyc2VGdW5jdGlvbkRlZigpCisgICAgeworICAgICAgICBsZXQgcmV0
dXJuVHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJp
ZGVudGlmaWVyIikudGV4dDsKKyAgICAgICAgbGV0IHR5cGVQYXJhbWV0ZXJzID0gcGFyc2VUeXBl
UGFyYW1ldGVycygpOworICAgICAgICBjb25zdW1lKCIoIik7CisgICAgICAgIGxldCBwYXJhbWV0
ZXJzID0gW107CisgICAgICAgIHdoaWxlICghdGVzdCgiKSIpKSB7CisgICAgICAgICAgICBwYXJh
bWV0ZXJzLnB1c2gocGFyc2VQYXJhbWV0ZXIoKSk7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1
bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25z
dW1lKCIpIik7CisgICAgICAgIGxldCBibG9jayA9IHBhcnNlQmxvY2soKTsKKyAgICAgICAgcmV0
dXJuIEZ1bmN0aW9uRGVmKHJldHVyblR5cGUub3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBl
UGFyYW1ldGVycywgcGFyYW1ldGVycywgYm9keSk7CisgICAgfQorICAgIAorICAgIGZvciAoOzsp
IHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAoIXRva2Vu
KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiOyIpCisg
ICAgICAgICAgICBsZXhlci5uZXh0KCk7CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0g
InR5cGUiKQorICAgICAgICAgICAgcGFyc2VUeXBlRGVmKCk7CisgICAgICAgIGVsc2UgaWYgKHRv
a2VuLnRleHQgPT0gIm5hdGl2ZSIpCisgICAgICAgICAgICBwYXJzZU5hdGl2ZVR5cGUoKTsKKyAg
ICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAic3RydWN0IikKKyAgICAgICAgICAgIHBhcnNl
U3RydWN0VHlwZSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJlbnVtIikKKyAg
ICAgICAgICAgIHBhcnNlRW51bSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJw
cm90b2NvbCIpCisgICAgICAgICAgICBwYXJzZVByb3RvY29sRGVjbCgpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICBwYXJzZUZ1bmN0aW9uRGVmKCk7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb2dyYW0uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm9ncmFtIGV4
dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fdG9w
TGV2ZWxTdGF0ZW1lbnRzID0gW107CisgICAgICAgIHRoaXMuX2Z1bmN0aW9ucyA9IG5ldyBNYXAo
KTsKKyAgICAgICAgdGhpcy5fdHlwZXMgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIGdl
dCB0b3BMZXZlbFN0YXRlbWVudHMoKSB7IHJldHVybiB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHM7
IH0KKyAgICBnZXQgZnVuY3Rpb25zKCkgeyByZXR1cm4gdGhpcy5fZnVuY3Rpb25zOyB9CisgICAg
Z2V0IHR5cGVzKCkgeyByZXR1cm4gdGhpcy5fdHlwZXM7IH0KKyAgICAKKyAgICBhZGRUb3BMZXZl
bFN0YXRlbWVudChzdGF0ZW1lbnQpCisgICAgeworICAgICAgICBzdGF0ZW1lbnQucHJvZ3JhbSA9
IHRoaXM7CisgICAgICAgIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBGdW5jdGlvbikgeworICAg
ICAgICAgICAgbGV0IGFycmF5ID0gdGhpcy5fZnVuY3Rpb25zLmdldChzdGF0ZW1lbnQubmFtZSk7
CisgICAgICAgICAgICBpZiAoIWFycmF5KQorICAgICAgICAgICAgICAgIHRoaXMuX2Z1bmN0aW9u
cy5zZXQoc3RhdGVtZW50Lm5hbWUsIGFycmF5ID0gW10pOworICAgICAgICAgICAgYXJyYXkucHVz
aChzdGF0ZW1lbnQpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIFR5
cGUpCisgICAgICAgICAgICB0aGlzLl90eXBlcy5zZXQoc3RhdGVtZW50Lm5hbWUsIHN0YXRlbWVu
dCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU3RhdGVtZW50
IGlzIG5vdCBhIGZ1bmN0aW9uIG9yIHR5cGU6ICIgKyBzdGF0ZW1lbnQpOworICAgICAgICB0aGlz
Ll90b3BMZXZlbFN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBy
ZXNvbHZlRnVuY3Rpb25PdmVybG9hZChuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVz
KQorICAgIHsKKyAgICAgICAgbGV0IGZ1bmN0aW9ucyA9IHRoaXMuZnVuY3Rpb25zLmdldChuYW1l
KTsKKyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAg
ICAgICAgCisgICAgICAgIGZvciAobGV0IHBodW5jdGlvbiBvZiBmdW5jdGlvbnMpIHsKKyAgICAg
ICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAmJiB0eXBlQXJndW1lbnRzLmxlbmd0aCAh
PSBwaHVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50VHlwZXMubGVuZ3RoICE9IHBodW5jdGlvbi5w
YXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
IGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KHBodW5jdGlv
bi50eXBlUGFyYW1ldGVycyk7CisgICAgICAgICAgICBsZXQgb2sgPSB0cnVlOworICAgICAgICAg
ICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAg
ICAgICAgICAgICAgbGV0IGFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpXTsKKyAgICAgICAgICAg
ICAgICBsZXQgcGFyYW1ldGVyID0gcGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzW2ldOworICAgICAg
ICAgICAgICAgIGlmICgoYXJndW1lbnQgaW5zdGFuY2VvZiBUeXBlKSAhPSAocGFyYW1ldGVyIGlu
c3RhbmNlb2YgVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
IGlmICghYXJndW1lbnQudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBwYXJhbWV0ZXIpKSB7Cisg
ICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFr
OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghb2sp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsg
aSA8IGFyZ3VtZW50VHlwZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWFy
Z3VtZW50VHlwZXNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBwaHVuY3Rpb24ucGFyYW1l
dGVyc1tpXS50eXBlKSkgeworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAg
ICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICBsZXQgc2hvdWxkQnVpbGRUeXBlQXJndW1lbnRzID0gIXR5cGVB
cmd1bWVudHMubGVuZ3RoOworICAgICAgICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50
cykKKyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzID0gW107CisgICAgICAgICAgICBmb3Ig
KGxldCB0eXBlUGFyYW1ldGVyIG9mIHBodW5jdGlvbi50eXBlUGFyYW1ldGVycykgeworICAgICAg
ICAgICAgICAgIGxldCB0eXBlQXJndW1lbnQgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0eXBl
UGFyYW1ldGVyKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50ID09IHR5cGVQYXJh
bWV0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaG91
bGRCdWlsZFR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMu
cHVzaCh0eXBlQXJndW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvaykK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIHJldHVybiB7cGh1bmN0aW9u
LCB1bmlmaWNhdGlvbkNvbnRleHQsIHR5cGVBcmd1bWVudHN9OworICAgICAgICB9CisgICAgICAg
IAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0
KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAg
ICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIHRoaXMudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAg
ICAgICAgcmVzdWx0LmFkZChzdGF0ZW1lbnQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvUHJvdG9jb2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBQcm90b2NvbCBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdp
biwgbmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fbmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVy
biB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQga2luZCgpIHsgcmV0dXJuIFByb3RvY29sOyB9CisgICAgCisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvUHJvdG9jb2xEZWNsLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb3RvY29sRGVjbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBQcm90b2NvbERlY2wgZXh0ZW5kcyBQcm90b2NvbCB7CisgICAgY29uc3RydWN0b3Iob3Jp
Z2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luLCBuYW1lKQorICAgICAgICB0
aGlzLl9zaWduYXR1cmVzID0gW107CisgICAgICAgIHRoaXMuX3NpZ25hdHVyZU1hcCA9IG5ldyBN
YXAoKTsKKyAgICAgICAgdGhpcy5fdHlwZVZhcmlhYmxlID0gbmV3IFR5cGVWYXJpYWJsZShvcmln
aW4sIG5hbWUsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBhZGRTaWduYXR1cmUoc2lnbmF0dXJl
KQorICAgIHsKKyAgICAgICAgLy8gTk9URTogQW55IHR5cGUgcGFyYW1ldGVycyBmb3VuZCBpbiB0
aGUgc2lnbmF0dXJlIG11c3QgYmUgaW5mZXJhYmxlIGZyb20gdGhlIHZhbHVlCisgICAgICAgIC8v
IHBhcmFtZXRlcnMuCisgICAgICAgIC8vIEZJWE1FOiBDaGVjayB0aGlzISAoT09QUyEpCisgICAg
ICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChzaWduYXR1cmUpOworICAgICAgICBsZXQgb3Zlcmxv
YWRzID0gdGhpcy5fc2lnbmF0dXJlTWFwLmdldChzaWduYXR1cmUubmFtZSk7CisgICAgICAgIGlm
ICghb3ZlcmxvYWRzKQorICAgICAgICAgICAgdGhpcy5fc2lnbmF0dXJlTWFwLnNldChzaWduYXR1
cmUubmFtZSwgb3ZlcmxvYWRzID0gW10pOworICAgICAgICBvdmVybG9hZHMucHVzaChzaWduYXR1
cmUpOworICAgIH0KKyAgICAKKyAgICBnZXQgc2lnbmF0dXJlcygpIHsgcmV0dXJuIHRoaXMuX3Np
Z25hdHVyZXM7IH0KKyAgICBzaWduYXR1cmVzQnlOYW1lKG5hbWUpIHsgcmV0dXJuIHRoaXMuX3Np
Z25hdHVyZU1hcC5nZXQobmFtZSk7IH0KKyAgICBnZXQgdHlwZVZhcmlhYmxlKCkgeyByZXR1cm4g
dGhpcy5fdHlwZVZhcmlhYmxlOyB9CisgICAgCisgICAgaW5oZXJpdHMob3RoZXJQcm90b2NvbCkK
KyAgICB7CisgICAgICAgIGlmICghb3RoZXJQcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyUHJvdG9jb2wgaW5zdGFuY2VvZiBQcm90
b2NvbFJlZikKKyAgICAgICAgICAgIG90aGVyUHJvdG9jb2wgPSBvdGhlclByb3RvY29sLnByb3Rv
Y29sRGVjbDsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0IG90aGVyU2lnbmF0dXJlIG9mIG90
aGVyUHJvdG9jb2wuc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZXMgPSB0
aGlzLnNpZ25hdHVyZXNCeU5hbWUob3RoZXJTaWduYXR1cmUubmFtZSk7CisgICAgICAgICAgICBp
ZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgbGV0IGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgOiBz
aWduYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS5wYXJhbWV0ZXJzLmxl
bmd0aCAhPSBvdGhlclNpZ25hdHVyZS5wYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbGV0IHR5
cGVQYXJhbWV0ZXJzID0gc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzLmNvbmNhdCh0aGlzLnR5cGVW
YXJpYWJsZSk7CisgICAgICAgICAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBV
bmlmaWNhdGlvbkNvbnRleHQodHlwZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIGxldCBv
ayA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWduYXR1cmUu
cGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNpZ25h
dHVyZS5wYXJhbWV0ZXJzW2ldLnR5cGUudW5pZnkob3RoZXJTaWduYXR1cmUucGFyYW1ldGVyc1tp
XS50eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgICAgIGlmICh1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkp
IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGVkUmV0dXJuVHlwZSA9CisgICAg
ICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9Vbmlm
aWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVycywgdW5p
ZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzdGl0dXRlZFJl
dHVyblR5cGUuZXF1YWxzKG90aGVyU2lnbmF0dXJlLnJldHVyblR5cGUpKQorICAgICAgICAgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4g
dHJ1ZTsKKyAgICB9CisgICAgCisgICAgaGFzSGVpcih0eXBlKQorICAgIHsKKyAgICAgICAgbGV0
IHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5tYXBwaW5nKFt0aGlzLl90eXBlVmFyaWFibGVd
LCBbdHlwZV0pOworICAgICAgICBmb3IgKGxldCBhYnN0cmFjdFNpZ25hdHVyZSBvZiB0aGlzLl9z
aWduYXR1cmVzKSB7CisgICAgICAgICAgICBsZXQgc2lnbmF0dXJlID0gc2lnbmF0dXJlLnZpc2l0
KHN1YnN0aXR1dGlvbik7CisgICAgICAgICAgICBsZXQgb3ZlcmxvYWQgPSB0aGlzLnByb2dyYW0u
cmVzb2x2ZUZ1bmN0aW9uT3ZlcmxvYWQoc2lnbmF0dXJlLm5hbWUsIFtdLCBzaWduYXR1cmUucGFy
YW1ldGVyVHlwZXMpOworICAgICAgICAgICAgaWYgKCFvdmVybG9hZCkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxldCBzdWJzdGl0dXRl
ZFJldHVyblR5cGUgPSBvdmVybG9hZC5waHVuY3Rpb24ucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9V
bmlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICBvdmVybG9hZC5waHVuY3Rpb24udHlwZVBhcmFt
ZXRlcnMsIG92ZXJsb2FkLnVuaWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICBpZiAoIXN1
YnN0aXR1dGVkUmV0dXJuVHlwZS5lcXVhbHMoc2lnbmF0dXJlLnJldHVyblR5cGUpKQorICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJwcm90
b2NvbCAiICsgdGhpcy5uYW1lICsgIiB7ICIgKyB0aGlzLnNpZ25hdHVyZXMuam9pbigiOyAiKSAr
ICI7IH0iOworICAgIH0KK30KKworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbFJl
Zi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbFJlZi5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbFJlZi5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb3RvY29sUmVmIGV4dGVuZHMgUHJv
dG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1
cGVyKG9yaWdpbiwgbmFtZSk7CisgICAgICAgIHRoaXMucHJvdG9jb2xEZWNsID0gbnVsbDsKKyAg
ICB9CisgICAgCisgICAgaW5oZXJpdHMob3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5wcm90b2NvbERlY2wuaW5oZXJpdHMob3RoZXIpOworICAgIH0KKyAgICAKKyAgICBoYXNIZWly
KHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbERlY2wuaGFzSGVpcih0
eXBlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMz
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIFB0clR5cGUgZXh0ZW5kcyBSZWZlcmVuY2VUeXBlIHsKKyAgICB0b1N0
cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzU3BhY2UgKyAiICIgKyB0
aGlzLmVsZW1lbnRUeXBlICsgIl4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvUmVmZXJlbmNlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZWZl
cmVuY2VUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5j
ZVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZWZl
cmVuY2VUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBhZGRyZXNz
U3BhY2UsIGVsZW1lbnRUeXBlKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVBZGRyZXNzU3BhY2Uo
YWRkcmVzc1NwYWNlKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0
aGlzLl9hZGRyZXNzU3BhY2UgPSBhZGRyZXNzU3BhY2U7CisgICAgICAgIHRoaXMuX2VsZW1lbnRU
eXBlID0gZWxlbWVudFR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVy
biB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgYWRkcmVzc1NwYWNlKCkgeyByZXR1cm4gdGhpcy5f
YWRkcmVzc1NwYWNlOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5fZWxl
bWVudFR5cGU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAg
IAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAg
ICAgaWYgKHRoaXMuY29uc3RydWN0b3IgIT0gb3RoZXIuY29uc3RydWN0b3IpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1JldHVybi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4u
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXR1cm4gZXh0
ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cisg
ICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7
ICIpOyArICI7IH0iOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jld3Jp
dGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Jld3JpdGVyLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jld3JpdGVyLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJld3JpdGVyIHsKKyAgICB2aXNpdEZ1bmN0
aW9uKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKAorICAgICAgICAg
ICAgbm9kZS5uYW1lLCBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyksCisgICAgICAgICAgICBu
b2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFybWV0ZXIgPT4gdHlwZVBhcmFtZXRlci52aXNp
dCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBw
YXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvblBh
cmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkFyZ3VtZW50
KG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBCbG9jayhub2Rl
Lm9yaWdpbik7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnN0YXRlbWVudHMp
CisgICAgICAgICAgICByZXN1bHQuYWRkKHN0YXRlbWVudC52aXNpdCh0aGlzKSk7CisgICAgICAg
IHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVS
ZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlwZVJlZihub2RlLm9y
aWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0
eXBlQXJndW1lbnQudmlzaXQodGhpcykpKTsKKyAgICAgICAgcmVzdWx0LnR5cGUgPSBub2RlLnR5
cGU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVZh
cmlhYmxlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICByZXR1
cm4gbmV3IENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9k
ZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGaWVsZChub2RlKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZChub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBu
b2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5
cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgbm9kZS5jb25zdHJ1Y3Rvcihub2Rl
LnJvZ2lpbiwgbm9kZS5hZGRyZXNzU3BhY2UsIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcykp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVm
ZXJlbmNlVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlUeXBlKG5vZGUub3JpZ2luLCBub2RlLmVs
ZW1lbnRUeXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50
KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQobm9kZS5vcmlnaW4s
IG5vZGUubGhzLnZpc2l0KHRoaXMpLCBub2RlLnJocy52aXNpdCh0aGlzKSk7CisgICAgfQorICAg
IAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2Rl
OworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIG5ldyBSZXR1cm4obm9kZS5vcmlnaW4sIG5vZGUudmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0
KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAgIAorICAgIHZpc2l0SW50TGl0ZXJhbChub2RlKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgdmlzaXRDYWxsRXhwcmVz
c2lvbihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDYWxsRXhwcmVzc2lvbigKKyAg
ICAgICAgICAgIG5vZGUub3JpZ2luLCBub2RlLm5hbWUsCisgICAgICAgICAgICBub2RlLnR5cGVB
cmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpLAor
ICAgICAgICAgICAgbm9kZS5hcmd1bWVudGxpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZp
c2l0KHRoaXMpKSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RU
eXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN0cnVjdFR5cGUgZXh0ZW5kcyBUeXBl
IHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJzKQorICAgIHsK
KyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFt
ZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAg
ICAgdGhpcy5fZmllbGRzID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICBhZGQoZmllbGQp
CisgICAgeworICAgICAgICBpZiAodGhpcy5fZmllbGRzLmhhcyhmaWVsZC5uYW1lKSkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihmaWVsZC5vcmlnaW4ubGluZU51bWJlciwgIkR1
cGxpY2F0ZSBmaWVsZCBuYW1lOiAiICsgZmllbGQubmFtZSk7CisgICAgICAgIHRoaXMuX2ZpZWxk
cy5zZXQoZmllbGQubmFtZSwgZmllbGQpOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsg
cmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0
aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAgIGdldCBmaWVsZE5hbWVzKCkgeyByZXR1
cm4gdGhpcy5fZmllbGRzLmtleXMoKTsgfQorICAgIGZpZWxkQnlOYW1lKG5hbWUpIHsgcmV0dXJu
IHRoaXMuX2ZpZWxkcy5nZXQobmFtZSk7IH0KKyAgICBnZXQgZmllbGRzKCkgeyByZXR1cm4gdGhp
cy5fZmllbGRzLnZhbHVlcygpOyB9CisgICAgZ2V0IGZpZWxkTWFwKCkgeyByZXR1cm4gdGhpcy5f
ZmllbGRzOyB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGxl
dCByZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFt
ZXRlciBvZiB0aGlzLnR5cGVQYXJhbWV0ZXJzKQorICAgIH0KKyAgICAKKyAgICBpbnN0YW50aWF0
ZSh0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3Ro
ICE9IHRoaXMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFM
VHlwZUVycm9yKG9yaWdpbi5saW5lTnVtYmVyLCAiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1l
bnRzIHRvIGluc3RhbnRpYXRpb24iKTsKKyAgICAgICAgCisgICAgICAgIGxldCBuYW1lQ29udGV4
dCA9IG5ldyBOYW1lQ29udGV4dCgpOworICAgICAgICAKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlv
biA9IFN1YnN0aXR1dGlvbi5tYXBwaW5nKHRoaXMudHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVu
dHMpOworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cnVjdFR5cGUodGhpcy5vcmlnaW4sIHRo
aXMubmFtZSwgW10pOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxkcykKKyAg
ICAgICAgICAgIHJlc3VsdC5hZGQoZmllbGQudmlzaXQoc3Vic3RpdHV0aW9uKSk7CisgICAgICAg
IHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiAic3RydWN0ICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0
ZXJzICsgIj4geyAiICsgQXJyYXkuZnJvbSh0aGlzLmZpZWxkcykuam9pbigiOyAiKSArICI7IH0i
OworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgU3Vic3RpdHV0aW9uIGV4dGVuZHMgUmV3cml0ZXIg
eworICAgIGNvbnN0cnVjdG9yKG1hcCkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG1hcDsK
KyAgICB9CisgICAgCisgICAgc3RhdGljIG1hcHBpbmcocGFyYW1ldGVycywgYXJndW1lbnRMaXN0
KQorICAgIHsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoICE9IGFyZ3VtZW50TGlzdC5s
ZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlcnMgYW5kIGFyZ3Vt
ZW50cyBhcmUgbWlzbWF0Y2hlZCIpOworICAgICAgICBsZXQgbWFwID0gbmV3IE1hcCgpOworICAg
ICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyArK2kpCisgICAgICAg
ICAgICBtYXAuc2V0KHBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50TGlzdFtpXSk7CisgICAgICAgIHJl
dHVybiBuZXcgU3Vic3RpdHV0aW9uKG1hcCk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJl
Zihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChu
b2RlLnR5cGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChu
b2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJv
cigiVW5leHBlY3RlZCB0eXBlIGFyZ3VtZW50cyBvbiB0eXBlIHZhcmlhYmxlIik7CisgICAgICAg
ICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJl
dHVybiBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgfQorCisgICAgdmlzaXRWYXJpYWJs
ZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdl
dChub2RlLnZhcmlhYmxlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50KQorICAgICAgICAgICAg
cmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0
VmFyaWFibGVSZWYobm9kZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9U
eXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGUgZXh0ZW5kcyBOb2RlIHsKKyAgICBnZXQgdHlwZVBh
cmFtZXRlcnMoKSB7IHJldHVybiBbXTsgfQorICAgIGdldCBraW5kKCkgeyByZXR1cm4gVHlwZTsg
fQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBy
b3RvY29sLmhhc0hlaXIodGhpcyk7CisgICAgfQorICAgIAorICAgIGdldCBpbnN0YW50aWF0ZWRU
eXBlKCkgeyByZXR1cm4gdGhpczsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBl
RGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZi5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVEZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBj
b25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsK
KyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAg
dGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVy
biB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsg
fQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1R5cGVSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWYgZXh0
ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMp
CisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25h
bWUgPSBuYW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgICAgICB0aGlzLl90eXBl
QXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgCisgICAgZ2V0IG9yaWdpbigpIHsg
cmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFt
ZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50
czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHR5cGUgPyB0eXBlLmlzUHJpbWl0
aXZlIDogZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy50eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOworICAg
IH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50
eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUudW5pZnlO
b2RlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgc2V0VHlwZUFuZEFy
Z3VtZW50cyh0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9
IHR5cGUubmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5fdHlw
ZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1
bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5z
dGFuY2VvZiBUeXBlUmVmKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYg
KCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlKSkKKyAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cy5sZW5n
dGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0
aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1
bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSAr
ICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9UeXBlVmFyaWFibGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZVZhcmlhYmxlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgVHlwZVZhcmlhYmxlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBu
YW1lLCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAg
ICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3Byb3RvY29sID0gcHJvdG9j
b2w7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQor
ICAgIGdldCBwcm90b2NvbCgpIHsgcmV0dXJuIHRoaXMuX3Byb3RvY29sOyB9CisgICAgCisgICAg
Z2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9wcm90b2NvbCAm
JiB0aGlzLl9wcm90b2NvbC5pc1ByaW1pdGl2ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IGlzVW5p
ZmlhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29sKQor
ICAgIHsKKyAgICAgICAgaWYgKCFwcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHByb3RvY29sKTsKKyAgICB9Cisg
ICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAg
ICB7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMp
OworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiByZWFs
VGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICAgICAgCisgICAgICAg
IHVuaWZpY2F0aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhlcik7CisgICAgICAgIHJldHVybiB0
cnVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
cikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0
aW9uQ29udGV4dCwgb3RoZXIpOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc0FyZ3VtZW50KHVu
aWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0
aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHRoaW5nIHdl
IGdldCB1bmlmaWVkIHdpdGggbXVzdCBiZSBhIHR5cGUgdmFyaWFibGUgdGhhdCBhY2NlcHRzIGEg
YnJvYWRlciBzZXQgb2YKKyAgICAgICAgLy8gdGhpbmdzIHRoYW4gd2UgZG8uCisgICAgICAgIGlm
ICghKHJlYWxUaGlzIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAg
ICAgcmV0dXJuICFyZWFsVGhpcy5wcm90b2NvbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0
aGlzLnByb3RvY29sLmluaGVyaXRzKHJlYWxUaGlzLnByb3RvY29sKTsKKyAgICB9CisgICAgCisg
ICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAg
aWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJl
dHVybiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKS5pbmhlcml0cyh0aGlzLnByb3RvY29s
KTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9u
Q29udGV4dC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNv
bnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25D
b250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVW5p
ZmljYXRpb25Db250ZXh0IHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBlUGFyYW1ldGVycykKKyAgICB7
CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gbmV3IFNldCh0eXBlUGFyYW1ldGVycyk7
CisgICAgICAgIHRoaXMuX25leHRNYXAgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIHVu
aW9uKGEsIGIpCisgICAgeworICAgICAgICBhID0gZmluZChhKTsKKyAgICAgICAgYiA9IGZpbmQo
Yik7CisgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAor
ICAgICAgICBpZiAoIWIuaXNVbmlmaWFibGUpCisgICAgICAgICAgICBbYSwgYl0gPSBbYiwgYV07
CisgICAgICAgIGlmICghYS5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJv
cigiQ2Fubm90IHVuaWZ5IG5vbi11bmlmaWFibGUgdGhpbmdzICIgKyBhICsgIiBhbmQgIiArIGIp
OworICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdHlwZSBwYXJhbWV0ZXJzIGRv
bid0IGVuZCB1cCBiZWluZyByb290cy4KKyAgICAgICAgaWYgKGEuaXNVbmlmaWFibGUgJiYgYi5p
c1VuaWZpYWJsZSAmJiB0aGlzLl90eXBlUGFyYW1ldGVycy5oYXMoYikpCisgICAgICAgICAgICBb
YSwgYl0gPSBbYiwgYV07CisKKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQoYSwgYik7CisgICAg
fQorICAgIAorICAgIGZpbmQobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9
IG5vZGU7CisgICAgICAgIGxldCBuZXh0Tm9kZSA9IHRoaXMuX25leHRNYXAuZ2V0KGN1cnJlbnRO
b2RlKTsKKyAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50
Tm9kZTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0
Tm9kZTsKKyAgICAgICAgICAgIG5leHROb2RlID0gdGhpcy5fbmV4dE1hcC5nZXQoY3VycmVudE5v
ZGUpOworICAgICAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgfQorICAgICAgICB0aGlzLl9uZXh0TWFwLnNldChub2RlLCBjdXJyZW50Tm9kZSk7
CisgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5vZGVz
KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7CisgICAgICAgIGZvciAo
bGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9uZXh0TWFwKSB7CisgICAgICAgICAgICByZXN1bHQu
YWRkKGtleSk7CisgICAgICAgICAgICByZXN1bHQuYWRkKHZhbHVlKTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2ZXJpZnkoKQorICAgIHsKKyAg
ICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiB0aGlzLl90eXBlUGFyYW1ldGVycykgewor
ICAgICAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLnZlcmlmeUFzUGFyYW1ldGVyKHRoaXMpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGxl
dCB0eXBlQXJndW1lbnQgb2YgdGhpcy5ub2RlcykgeworICAgICAgICAgICAgaWYgKHRoaXMuX3R5
cGVQYXJhbWV0ZXJzLmhhcyh0eXBlQXJndW1lbnQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnQudmVyaWZ5QXNBcmd1bWVudCh0aGlzKSkK
KyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgfQorICAgIAorICAgIGlzVW51bmlmaWVkKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiAhdGhpcy5fbmV4dE1hcC5zaXplKCk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9WYWx1ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhbHVlIGV4dGVuZHMgTm9kZSB7Cisg
ICAgZ2V0IGtpbmQoKSB7IHJldHVybiBWYWx1ZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsg
cmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVm
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFyaWFibGVSZWYgZXh0ZW5kcyBFeHBy
ZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICBz
dXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52
YXJpYWJsZSA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhp
cy5fbmFtZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRoaXMudmFyaWFibGUu
aXNDb25zdGV4cHI7IH0KKyAgICBnZXQgdW5pZnlOb2RlKCkgeyByZXR1cm4gdGhpcy52YXJpYWJs
ZS51bmlmeU5vZGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3Iu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZpc2l0b3IgeworICAgIHZpc2l0UHJvZ3JhbShub2Rl
KQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0
ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdEZ1bmN0aW9uKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnJldHVyblR5cGUu
dmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBl
UGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAg
ICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMpCisgICAgICAgICAgICBw
YXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rpb25QYXJh
bWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRGdW5jdGlvbkRlZihub2RlKQorICAgIHsKKyAgICAgICAgdmlzaXRG
dW5jdGlvbihub2RlKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzdGF0ZW1l
bnQgb2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sUmVmKG5vZGUpCisgICAgeworICAgIH0K
KyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChs
ZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52
aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgewor
ICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAg
ICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbXRlciBv
ZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0
aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5vZGUpCisgICAgeworICAgICAg
ICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAg
ICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBub2RlLnR5cGUudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAg
ICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAg
ICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgZmll
bGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52aXNpdCh0aGlzKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAgICB7CisgICAgfQorICAgIAor
ICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9k
ZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisg
ICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZp
c2l0RWxlbWVudGFsVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52
aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJUeXBlKG5vZGUpCisgICAgewor
ICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50
YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAg
IHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgICAgIG5vZGUu
bnVtRWxlbWVudHMudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdubWVu
dChub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5saHMudmlzaXQodGhpcyk7CisgICAgICAgIG5v
ZGUucmhzLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5v
ZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAg
ICAgICAgaWYgKG5vZGUudmFsdWUpCisgICAgICAgICAgICBub2RlLnZhbHVlLnZpc2l0KHRoaXMp
OworICAgIH0KKyAgICAKKyAgICB2aXN0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChs
ZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVB
cmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgYXJndW1lbnQgb2Ygbm9kZS5h
cmd1bWVudExpc3QpCisgICAgICAgICAgICBhcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICB9Cit9
CisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319140</attachid>
            <date>2017-08-26 14:52:52 -0700</date>
            <delta_ts>2017-08-26 17:31:43 -0700</delta_ts>
            <desc>parser is getting real</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>132088</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gdmFs
aWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAgIHN3aXRjaCAoYWRkcmVzc1Nw
YWNlKSB7CisgICAgY2FzZSAiY29uc3RhbnQiOgorICAgIGNhc2UgImRldmljZSI6CisgICAgY2Fz
ZSAidGhyZWFkZ3JvdXAiOgorICAgIGNhc2UgInRocmVhZCI6CisgICAgICAgIHJldHVybjsKKyAg
ICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBhZGRyZXNzIHNwYWNlOiAi
ICsgYWRkcmVzc1NwYWNlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9BcnJh
eVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlSZWZUeXBl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5UmVmVHlwZSBl
eHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1FbGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlw
ZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAg
CisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVt
ZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1l
bnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxlbWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUo
KSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9T
dHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0
aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2Vv
ZiBBcnJheVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgaWYgKCF0aGlzLm51bUVsZW1lbnRzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIu
bnVtRWxlbWVudHMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci5lbGVtZW50VHlwZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Bc3Np
Z25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFzc2lnbm1lbnQgZXh0ZW5kcyBF
eHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0
aGlzLl9yaHMgPSByaHM7CisgICAgfQorICAgIAorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlz
Ll9saHM7IH0KKyAgICBnZXQgcmhzKCkgeyByZXR1cm4gdGhpcy5fcmhzOyB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsgIiA9ICIgKyB0aGlz
LnJoczsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIEJsb2NrIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9z
dGF0ZW1lbnRzID0gW107CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICBhZGQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAg
dGhpcy5fc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIGdldCBz
dGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fc3RhdGVtZW50czsgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAieyAiICsgdGhpcy5zdGF0ZW1lbnRzLmpvaW4o
IjsgIik7ICsgIjsgfSI7CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2Fs
bEFzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEFzc2ln
bm1lbnQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEFzc2lnbm1l
bnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDYWxsQXNz
aWdubWVudCBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFt
ZSwgbGhzLCByaHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlz
Ll9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0aGlzLl9y
aHMgPSByaHM7CisgICAgICAgIHRoaXMucGh1bmN0aW9uID0gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGxocygpIHsgcmV0
dXJuIHRoaXMuX2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0aGlzLl9yaHM7IH0KKyAg
ICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMgKyAiICIg
KyB0aGlzLm5hbWUgKyAiPSAiICsgdGhpcy5yaHM7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9DYWxsRXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIENhbGxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudExpc3QpCisgICAgeworICAg
ICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAg
dGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgICAgIHRoaXMuX2FyZ3Vt
ZW50TGlzdCA9IGFyZ3VtZW50TGlzdDsKKyAgICAgICAgdGhpcy5waHVuY3Rpb24gPSBudWxsOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBn
ZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0KKyAgICBn
ZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9CisgICAgCisg
ICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8IiArIHRo
aXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCArICIpIjsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9DaGVja2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjYxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIENoZWNrZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAvLyBJdCdzIHRvdGFsbHkgT0sg
dG8gaW5zdGFudGlhdGUgdGhpcyB3aXRoIHplcm8gYXJndW1lbnRzIChpLmUuIHBhc3NpbmcgdW5k
ZWZpbmVkIGZvciBib3RoIG9mCisgICAgLy8gdGhlbSkgaWYgeW91J3JlIGNyZWF0aW5nIGEgQ2hl
Y2tlciB0byB2aXNpdCBhIFByb2dyYW0uCisgICAgY29uc3RydWN0b3IobmFtZUNvbnRleHQpCisg
ICAgeworICAgICAgICB0aGlzLl9uYW1lQ29udGV4dCA9IG5hbWVDb250ZXh0OworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4
dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250
ZXh0LnByb2dyYW0gPSBub2RlOworICAgICAgICBuYW1lQ29udGV4dC5yZWNvZ25pemVJbnRyaW5z
aWNzKCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVt
ZW50cykKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZChzdGF0ZW1lbnQpOworICAgICAgICBs
ZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQg
c3RhdGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgbmFtZUNv
bnRleHQuZG9TdGF0ZW1lbnQoKCkgPT4gc3RhdGVtZW50LnZpc2l0KGNoZWNrZXIpKTsKKyAgICB9
CisgICAgCisgICAgX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUp
CisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5f
bmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlw
ZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVy
KTsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIG5hbWVDb250ZXh0OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9u
KG5vZGUpCisgICAgeworICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKHRoaXMuX3Zp
c2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAgICAgICAgbm9k
ZS5yZXR1cm5UeXBlLnZpc2l0KGNoZWNrZXIpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIg
b2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXIp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uRGVmKG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyA9IHRoaXMuX3Zpc2l0VHlwZVBhcmFtZXRl
cnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpOworICAgICAgICBsZXQgY2hlY2tlcldpdGhUeXBl
UGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNvbnRleHRXaXRoVHlwZVBhcmFtZXRlcnMpOworICAg
ICAgICBub2RlLnJldHVyblR5cGUudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7Cisg
ICAgICAgIGxldCBjb250ZXh0V2l0aFBhcmFtZXRlcnMgPSBuZXcgTmFtZUNvbnRleHQoY29udGV4
dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2Rl
LnBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChjaGVja2VyV2l0aFR5
cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIGNvbnRleHRXaXRoUGFyYW1ldGVycy5hZGQocGFy
YW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlcldpdGhQYXJhbWV0ZXJzID0g
bmV3IENoZWNrZXIoY29udGV4dFdpdGhQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5ib2R5LnZp
c2l0KGNoZWNrZXJXaXRoUGFyYW1ldGVycyk7CisgICAgfQorICAgIAorICAgIHZpc2l0QmxvY2so
bm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmV3IE5hbWVD
b250ZXh0KHRoaXMuX25hbWVDb250ZXh0KSk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBv
ZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQoY2hlY2tlcik7
CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAgICAg
ICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKSB7CisgICAgICAgICAgICBs
ZXQgc2V0ID0gbmV3IFNldCgpOworICAgICAgICAgICAgZnVuY3Rpb24gY29uc2lkZXIodGhpbmcp
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaW5nLmlzVW5pZmlhYmxlKQor
ICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHRoaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGNsYXNzIE5vdGljZVR5cGVWYXJpYWJsZSBleHRlbmRzIFZpc2l0b3IgeworICAgICAg
ICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICAgICAgY29uc2lkZXIobm9kZS50eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgICAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICAgICAgY29uc2lkZXIobm9kZS52YXJpYWJsZSk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0IG5vdGljZVR5cGVWYXJpYWJsZSA9
IG5ldyBOb3RpY2VUeXBlVmFyaWFibGUoKTsKKyAgICAgICAgICAgIGZvciAobGV0IHBhcmFtZXRl
clR5cGUgb2Ygc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKQorICAgICAgICAgICAgICAgIHBhcmFt
ZXRlclR5cGUudmlzaXQobm90aWNlVHlwZVZhcmlhYmxlKTsKKyAgICAgICAgICAgIGZvciAobGV0
IHR5cGVQYXJhbWV0ZXIgb2Ygc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAg
ICAgICAgaWYgKCFzZXQuaGFzKHR5cGVQYXJhbWV0ZXIpKQorICAgICAgICAgICAgICAgICAgICB0
aHJvdyBBTFR5cGVFcnJvcih0eXBlUGFyYW1ldGVyLm9yaWdpbi5saW5lTnVtYmVyLCAiVHlwZSBw
YXJhbWV0ZXIgdG8gcHJvdG9jb2wgc2lnbmF0dXJlIG5vdCBpbmZlcnJhYmxlIGZyb20gdmFsdWUg
cGFyYW1ldGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOwor
ICAgICAgICBuYW1lQ29udGV4dC5hZGQobm9kZS50eXBlVmFyaWFibGUpOworICAgICAgICBsZXQg
Y2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgc2ln
bmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52aXNpdChj
aGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5vZGUpCisgICAgeworICAg
ICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQp
OworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMp
IHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgICAgICBu
YW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAgbGV0IGNo
ZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIG5vZGUudHlwZS52aXNp
dChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNv
bnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFt
ZXRlcnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAg
ICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAg
bGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0
IGZpZWxkIG9mIG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQoY2hlY2tlcik7
CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IHR5cGUgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVHlwZSwgbm9kZS5uYW1lKTsKKyAgICAgICAg
aWYgKCF0eXBlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2lu
LmxpbmVOdW1iZXIsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOwor
ICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmlzRGVmaW5lZCh0eXBlKSkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiSWxsZWdh
bCBmb3J3YXJkIHVzZSBvZiB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBub2Rl
LnR5cGUgPSB0eXBlOworICAgICAgICAKKyAgICAgICAgaWYgKHR5cGUudHlwZVBhcmFtZXRlcnMu
bGVuZ3RoICE9IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIldyb25nIG51bWJlciBvZiB0
eXBlIGFyZ3VtZW50cyIpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGUudHlwZVBh
cmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJJc1R5cGUg
PSB0eXBlLnR5cGVQYXJhbWV0ZXJzW2ldIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlOworICAgICAg
ICAgICAgbGV0IGFyZ3VtZW50SXNUeXBlID0gbm9kZS50eXBlQXJndW1lbnRzW2ldIGluc3RhbmNl
b2YgVHlwZTsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJJc1R5cGUgJiYgIWFyZ3VtZW50SXNU
eXBlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5s
aW5lTnVtYmVyLCAiRXhwZWN0ZWQgdHlwZSwgYnV0IGdvdCB2YWx1ZSBhdCBhcmd1bWVudCAjIiAr
IGkpOworICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJJc1R5cGUgJiYgYXJndW1lbnRJc1R5cGUp
CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVO
dW1iZXIsICJFeHBlY3RlZCB2YWx1ZSwgYnV0IGdvdCB0eXBlIGF0IGFyZ3VtZW50ICMiICsgaSk7
CisgICAgICAgICAgICBpZiAoIWFyZ3VtZW50SXNUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYg
KCFub2RlLnR5cGVBcmd1bWVudHNbaV0uaXNDb25zdEV4cHIpCisgICAgICAgICAgICAgICAgICAg
IHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiRXhwZWN0ZWQg
Y29uc3RleHByIHZhbHVlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICAgICAgCisgICAgICAgIHdoaWxl
IChub2RlLnR5cGUgaW5zdGFuY2VvZiBUeXBlRGVmKSB7CisgICAgICAgICAgICBsZXQgdW5pZmlj
YXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dChub2RlLnR5cGUudHlwZVBhcmFt
ZXRlcnMpOworICAgICAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gbm9k
ZS50eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoImFyZ3VtZW50L3BhcmFtZXRlciBtaXNtYXRjaCAoc2hvdWxkIGhhdmUgYmVlbiBjYXVn
aHQgZWFybGllcikiKTsKKyAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS50eXBl
QXJndW1lbnRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50
c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG5vZGUudHlwZS50eXBlUGFyYW1ldGVyc1tp
XSk7CisgICAgICAgICAgICBpZiAoIXVuaWZpY2F0aW9uQ29udGV4dC52ZXJpZnkoKSkKKyAgICAg
ICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwg
IlR5cGUgcmVmZXJlbmNlIHRvIGEgdHlwZSBkZWZpbml0aW9uIHZpb2xhdGVzIHByb3RvY29sIGNv
bnN0cmFpbnRzIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5vZGUudHlwZSA9IG5vZGUu
dHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMsIHVu
aWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZl
cmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFt
ZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5kZWZpbmVB
bGwoKTsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgQ2hlY2tlcihuYW1lQ29u
dGV4dCkpOworICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUuYWRkcmVzc1NwYWNlID09ICJ0aHJl
YWQiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgY2xhc3MgSW5zdGFu
dGlhdGVJbW1lZGlhdGVzIGV4dGVuZHMgUmV3cml0ZXIgeworICAgICAgICAgICAgdmlzaXRUeXBl
UmVmKG5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm9kZSA9IHN1cGVyLnZp
c2l0VHlwZVJlZihub2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pbnN0YW50aWF0
ZWRUeXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB2aXNpdFJl
ZmVyZW5jZVR5cGUobm9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFu
b2RlLmVsZW1lbnRUeXBlLnZpc2l0KG5ldyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMoKSkuaXNQcmlt
aXRpdmUpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGlu
ZU51bWJlciwgIklsbGVnYWwgcG9pbnRlciB0byBub24tcHJpbWl0aXZlIHR5cGUiKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAgICAgICAvLyBGSVhN
RTogV2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBsaHMgaXMgYXNzaWduYWJsZS4KKyAgICAgICAg
bGV0IGxoc1R5cGUgPSBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IHJoc1R5cGUg
PSBub2RlLnJocy52aXNpdCh0aGlzKTsKKyAgICAgICAgaWYgKCFsaHNUeXBlLmVxdWFscyhyaHNU
eXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5l
TnVtYmVyLCAiVHlwZSBtaXNtYXRjaCBpbiBhc3NpZ25tZW50OiAiICsgbGhzVHlwZSArICIgdmVy
c3VzICIgKyByaHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIGxoc1R5cGU7CisgICAgfQorICAgIAor
ICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0
aGlzLl9uYW1lQ29udGV4dC5nZXQoVmFsdWUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVz
dWx0KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVO
dW1iZXIsICJDb3VsZCBub3QgZmluZCB2YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAg
ICAgICAgbm9kZS52YXJpYWJsZSA9IHJlc3VsdDsKKyAgICAgICAgbm9kZS4KKyAgICAgICAgCisg
ICAgICAgIHJldHVybiByZXN1bHQudHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4o
bm9kZSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAgICBsZXQg
cmVzdWx0VHlwZSA9IG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXRo
aXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUuZXF1YWxzKHJlc3Vs
dFR5cGUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdp
bi5saW5lTnVtYmVyLCAiVHJ5aW5nIHRvIHJldHVybiAiICsgcmVzdWx0VHlwZSArICIgaW4gYSBm
dW5jdGlvbiB0aGF0IHJldHVybnMgIiArIHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1l
bnQucmV0dXJuVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAg
IAorICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJu
VmFsdWUuZXF1YWxzKHRoaXMuX25hbWVDb250ZXh0LmludHJpbnNpY3Mudm9pZCkpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIk5vbi12
b2lkIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUiKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbmFtZUNvbnRl
eHQuaW50cmluc2ljcy5pbnQzMjsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lv
bihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlw
ZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAg
ICAgbGV0IGFyZ3VtZW50VHlwZXMgPSBub2RlLmFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4g
YXJndW1lbnQudmlzaXQodGhpcykpOworICAgICAgICBsZXQgb3ZlcmxvYWQgPSB0aGlzLl9uYW1l
Q29udGV4dC5wcm9ncmFtLnJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKAorICAgICAgICAgICAgbm9k
ZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICBpZiAo
IW92ZXJsb2FkKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2lu
LmxpbmVOdW1iZXIsICJEaWQgbm90IGZpbmQgZnVuY3Rpb24gZm9yIGNhbGwiKTsKKyAgICAgICAg
cmV0dXJuIG92ZXJsb2FkLnBodW5jdGlvbi5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0
aW9uKAorICAgICAgICAgICAgb3ZlcmxvYWQucGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBvdmVy
bG9hZC51bmlmaWNhdGlvbkNvbnRleHQpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0NvbW1hRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9D
b21tYUV4cHJlc3Npb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBDb21tYUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGxpc3QpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0
aGlzLl9saXN0ID0gbGlzdDsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpc3QoKSB7IHJldHVybiB0
aGlzLl9saXN0OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
ICIoIiArIHRoaXMubGlzdC50b1N0cmluZygpICsgIikiOworICAgIH0KK307CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ29uc3RleHByVHlwZVBhcmFtZXRl
ciBleHRlbmRzIFZhbHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUpCisg
ICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUg
PSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0
aGlzLl90eXBlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAg
IGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUltcGwo
dW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBl
LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25Db250ZXh0LmZp
bmQodGhpcyk7CisgICAgICAgIGlmIChyZWFsVGhpcyAhPSB0aGlzKQorICAgICAgICAgICAgcmV0
dXJuIHJlYWxUaGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgICAgICAK
KyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVmFyaWFibGVSZWYpCisgICAgICAgICAgICBv
dGhlciA9IG90aGVyLnZhcmlhYmxlOworICAgICAgICAKKyAgICAgICAgdW5pZmljYXRpb25Db250
ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IAorICAgIHZlcmlmeUFzQXJndW1lbnQodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZp
Y2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsg
dGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lv
bi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVmFsdWUg
eworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29y
aWdpbjsgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvRmllbGQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBGaWVsZCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsK
KyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFt
ZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmln
aW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRo
aXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsg
dGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb24gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25z
dHJ1Y3RvcihuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycykKKyAg
ICB7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9yZXR1cm5UeXBl
ID0gcmV0dXJuVHlwZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1l
dGVyczsKKyAgICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgfQorICAg
IAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCByZXR1cm5U
eXBlKCkgeyByZXR1cm4gdGhpcy5fcmV0dXJuVHlwZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVy
cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlcnMo
KSB7IHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlclR5cGVzKCkg
eyByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLnR5cGUp
OyB9CisgICAgCisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBGdW5jdGlvbjsgfQorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnJldHVyblR5cGUgKyAiICIg
KyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4oIiArIHRoaXMucGFy
YW1ldGVycyArICIpIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0
aW9uRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uRGVmLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uRGVmLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb25EZWYgZXh0ZW5k
cyBGdW5jdGlvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0
eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycywgYm9keSkKKyAgICB7CisgICAgICAgIHN1cGVyKG5h
bWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhp
cy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBi
b2R5KCkgeyByZXR1cm4gdGhpcy5fYm9keTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiB7ICIgKyBib2R5ICsgIiB9IjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb25QYXJhbWV0
ZXIgeworICAgIC8vIFRoZSBuYW1lIGlzIG9wdGlvbmFsLiBJdCdzIE9LIGZvciBpdCB0byBiZSBu
dWxsIQorICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1
cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNl
IHN0cmljdCI7CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgSW50TGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24geworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgdmFsdWUpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4p
OworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgdmFs
dWUoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0
dXJuIHRydWU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4g
IiIgKyB0aGlzLl92YWx1ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0lu
dHJpbnNpY3MuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgSW50cmluc2ljcyB7CisgICAg
Y29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOworCisg
ICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBl
IHZvaWQ8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAgICAgICAgICAgIHRoaXMu
dm9pZCA9IHR5cGU7CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAor
ICAgICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSBpbnQzMjw+IiwKKyAgICAgICAgICAg
ICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5pbnQzMiA9IHR5cGU7CisgICAgICAg
ICAgICB9KTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBw
cmltaXRpdmUgdHlwZSBkb3VibGU8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAg
ICAgICAgICAgIHRoaXMuZG91YmxlID0gdHlwZTsKKyAgICAgICAgICAgIH0pOworICAgIH0KKyAg
ICAKKyAgICBhZGQodGhpbmcpCisgICAgeworICAgICAgICBsZXQgaW50cmluc2ljID0gdGhpcy5f
bWFwLmdldCh0aGluZy5uYW1lKTsKKyAgICAgICAgaWYgKCFpbnRyaW5zaWMpCisgICAgICAgICAg
ICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IodGhpbmcub3JpZ2luLmxpbmVOdW1iZXIsICJVbnJlY29n
bml6ZWQgaW50cmluc2ljOiAiICsgdGhpbmcpOworICAgICAgICBpbnRyaW5zaWModGhpbmcpOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTGV4ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgTGV4ZXIgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgdGV4dCkKKyAgICB7CisgICAg
ICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7Cisg
ICAgICAgIHRoaXMuX2luZGV4ID0gMDsKKyAgICAgICAgdGhpcy5fc3RhY2sgPSBbXTsKKyAgICB9
CisgICAgCisgICAgZ2V0IGxpbmVOdW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
bGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9y
aWdpblN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luICsgIjoiICsg
KHRoaXMubGluZU51bWJlciArIDEpOworICAgIH0KKyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5k
ZXgoaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwg
aW5kZXgpLm1hdGNoKC9cbi9nKS5sZW5ndGg7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgp
IHsgcmV0dXJuIHRoaXMuX2luZGV4OyB9CisgICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2lu
ZGV4ID0gdmFsdWU7IH0KKyAgICAKKyAgICBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlz
Ll9zdGFjay5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhY2sucG9wKCk7Cisg
ICAgICAgIAorICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisg
ICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1l
bnRCZWdpbiA9IC9cL1wqLzsKKyAgICAgICAgY29uc3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4g
PSAvXC9cLy87CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAg
ICAgICAgICAgIGxldCB0ZXh0ID0gUmVnRXhwLmxhc3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0
b2tlbiA9IG5ldyBMZXhlclRva2VuKHRoaXMsIHRoaXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAg
ICAgICAgICAgIHRoaXMuX2luZGV4ICs9IHRleHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJu
IHRva2VuOworICAgICAgICB9OworCisgICAgICAgIGxldCByZWxldmFudFRleHQ7CisgICAgICAg
IGZvciAoOzspIHsKKyAgICAgICAgICAgIHJlbGV2YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3Ry
aW5nKHRoaXMuX2luZGV4KTsKKyAgICAgICAgICAgIGlmICgvXlxzKy8udGVzdChyZWxldmFudFRl
eHQpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5s
ZW5ndGg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoL15cL1wqLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBs
ZXQgZW5kSW5kZXggPSByZWxldmFudFRleHQuc2VhcmNoKC9cKlwvLyk7CisgICAgICAgICAgICAg
ICAgaWYgKGVuZEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRl
cm1pbmF0ZWQgY29tbWVudCIpOworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZElu
ZGV4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKC9eXC9cLy4qLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0
aGlzLl9pbmRleCArPSBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlzIGRvIFVuaWNvZGUuCisgICAgICAg
IGlmICgvXlteXGRcV11cdyovLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVy
biByZXN1bHQoImlkZW50aWZpZXIiKTsKKworICAgICAgICBpZiAoL15bMC05XSsvLnRlc3QocmVs
ZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImludGVnZXJMaXRlcmFsIik7
CisKKyAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBoYW5kbGUgZXhwLWZvcm0gbGl0ZXJhbHMg
bGlrZSAxZTEuCisgICAgICAgIGlmICgvXihbMC05XSpcLlswLTldKyl8KFswLTldK1wuWzAtOV0q
KS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiZmxvYXRM
aXRlcmFsIik7CisgICAgICAgIAorICAgICAgICBpZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8
aWZ8ZWxzZXxlbnVtfGNvbnRpbnVlfGJyZWFrfHN3aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxl
fGRvfHJldHVybnxzaXplb2Z8Y29uc3RhbnR8ZGV2aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVy
YXRvcikvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImtl
eXdvcmQiKTsKKyAgICAgICAgCisgICAgICAgIGlmICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5e
Jnw8PlxcLV18LT58PT58PD18PT18IT18Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0
KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIp
OworICAgICAgICAKKyAgICAgICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3
aXRoOiAiICsgcmVsZXZhbnRUZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAg
ICBwdXNoKHRva2VuKQorICAgIHsKKyAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7Cisg
ICAgfQorICAgIAorICAgIHBlZWsoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQo
KTsKKyAgICAgICAgcHVzaChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K
KyAgICAKKyAgICBmYWlsKGVycm9yKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4
RXJyb3IodGhpcy5vcmlnaW5TdHJpbmcsIGVycm9yKTsKKyAgICB9CisgICAgCisgICAgYmFja3Ry
YWNraW5nU2NvcGUoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0
YXRlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAg
ICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhF
cnJvcikgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7Cisg
ICAgICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIExleGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9y
KGxleGVyLCBvcmlnaW4sIGluZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5f
bGV4ZXIgPSBsZXhlcjsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0
aGlzLl9pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAg
dGhpcy5fdGV4dCA9IHRleHQ7CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLl9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9y
aWdpbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAK
KyAgICBnZXQgaW5kZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAg
IH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fbGV4ZXIubGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4g
KyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5n
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwg
IiArIHRoaXMudGV4dCArICIsICIgKyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY29uc3QgbmFtZWFibGVTaW1wbGVLaW5kcyA9IG5ldyBTZXQoW1R5cGUsIFZhbHVlLCBQ
cm90b2NvbF0pOworY29uc3QgbmFtZWFibGVPdmVybG9hZGFibGVLaW5kcyA9IG5ldyBTZXQoW0Z1
bmN0aW9uXSk7Citjb25zdCBuYW1lYWJsZUtpbmRzID0gbmV3IFNldChBcnJheS5mcm9tKG5hbWVh
YmxlU2ltcGxlS2luZHMpLmNvbmNhdChBcnJheS5mcm9tKG5hbWVhYmxlT3ZlcmxvYWRhYmxlS2lu
ZHMpKSk7CisKK2NsYXNzIE5hbWVDb250ZXh0IHsKKyAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkK
KyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgZm9yIChsZXQg
a2luZCBvZiBuYW1lYWJsZUtpbmRzKQorICAgICAgICAgICAgdGhpcy5fbWFwLnNldChraW5kLCBu
ZXcgTWFwKCkpOworICAgICAgICB0aGlzLl9kZWZpbmVkID0gbmV3IFNldCgpOworICAgICAgICB0
aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBu
dWxsOworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbnVsbDsKKyAgICAgICAgdGhpcy5fcHJv
Z3JhbSA9IG51bGw7CisgICAgfQorICAgIAorICAgIG1hcEZvcihraW5kKQorICAgIHsKKyAgICAg
ICAgbGV0IHJlc3VsdCA9IHRoaXMuX21hcC5nZXQoa2luZCk7CisgICAgICAgIGlmICghcmVzdWx0
KQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQga2luZDogIiArIGtpbmQpOworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBhZGQodGhpbmcpCisgICAgewor
ICAgICAgICBpZiAoIXRoaW5nLm5hbWUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAor
ICAgICAgICBpZiAodGhpbmcuaXNOYXRpdmUpIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5faW50
cmluc2ljcykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5hdGl2ZSBmdW5jdGlv
biBpbiBhIHNjb3BlIHRoYXQgZG9lcyBub3QgcmVjb2duaXplIGludHJpbnNpY3MiKTsKKyAgICAg
ICAgICAgIHRoaXMuX2ludHJpbnNpY3MuYWRkKHRoaW5nKTsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgbGV0IG1hcCA9IG1hcEZvcih0aGluZy5raW5kKTsKKyAgICAgICAgaWYgKG5hbWVh
YmxlT3ZlcmxvYWRhYmxlS2luZHMuaGFzKHRoaW5nLmtpbmQpKSB7CisgICAgICAgICAgICBsZXQg
YXJyYXkgPSBtYXAuZ2V0KHRoaW5nLm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAg
ICAgICAgICAgICAgICBtYXAuc2V0KHRoaW5nLm5hbWUsIGFycmF5ID0gW10pOworICAgICAgICAg
ICAgYXJyYXkucHVzaCh0aGluZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKG1hcC5oYXModGhpbmcubmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxU
eXBlRXJyb3IodGhpbmcub3JpZ2luLmxpbmVOdW1iZXIsICJEdXBsaWNhdGUgbmFtZTogIiArIHRo
aW5nLm5hbWUpOworICAgICAgICBtYXAuc2V0KHRoaW5nLm5hbWUsIHRoaW5nKTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0KGtpbmQsIG5hbWUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbWFw
Rm9yKGtpbmQpLmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQgJiYgdGhpcy5fZGVsZWdh
dGUpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZ2V0KGtpbmQsIG5hbWUpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBnZXQgY3VycmVudFN0YXRl
bWVudCgpCisgICAgeworICAgICAgICBpZiAodGhpcy5fY3VycmVudFN0YXRlbWVudCkKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50U3RhdGVtZW50OworICAgICAgICBpZiAodGhpcy5f
ZGVsZWdhdGUpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY3VycmVudFN0YXRl
bWVudDsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIGlzRGVmaW5lZCh0
aGluZykKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9kZWZpbmVkLmhhcyh0aGluZykKKyAg
ICAgICAgICAgIHx8ICh0aGlzLl9kZWxlZ2F0ZSAmJiB0aGlzLl9kZWxlZ2F0ZS5pc0RlZmluZWQo
dGhpbmcpKTsKKyAgICB9CisgICAgCisgICAgZGVmaW5lKHRoaW5nKQorICAgIHsKKyAgICAgICAg
dGhpcy5fZGVmaW5lZC5zZXQodGhpbmcpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmVBbGwoKQor
ICAgIHsKKyAgICAgICAgZm9yIChsZXQgdGhpbmcgb2YgdGhpcykKKyAgICAgICAgICAgIGRlZmlu
ZSh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRvU3RhdGVtZW50KHN0YXRlbWVudCwgY2FsbGJh
Y2spCisgICAgeworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gc3RhdGVtZW50Owor
ICAgICAgICBjYWxsYmFjaygpOworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gbnVs
bDsKKyAgICAgICAgZGVmaW5lKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHJlY29nbml6
ZUludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAgdGhpcy5faW50cmluc2ljcyA9IG5ldyBJbnRy
aW5zaWNzKCk7CisgICAgfQorICAgIAorICAgIGdldCBpbnRyaW5zaWNzKCkKKyAgICB7CisgICAg
ICAgIGlmICh0aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludHJp
bnNpY3M7CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLl9kZWxlZ2F0ZS5pbnRyaW5zaWNzOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cisg
ICAgCisgICAgc2V0IHByb2dyYW0odmFsdWUpCisgICAgeworICAgICAgICB0aGlzLl9wcm9ncmFt
ID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCBwcm9ncmFtKCkKKyAgICB7CisgICAgICAg
IGlmICh0aGlzLl9wcm9ncmFtKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyYW07Cisg
ICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxl
Z2F0ZS5wcm9ncmFtOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgKltT
eW1ib2wuaXRlcmF0b3JdKCkKKyAgICB7CisgICAgICAgIGZvciAobGV0IG1hcCBvZiB0aGlzLl9t
YXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAobGV0IHR5cGUgb2YgdGhpcy5fdHlwZXMu
dmFsdWVzKCkpCisgICAgICAgICAgICAgICAgeWllbGQgdHlwZTsKKyAgICAgICAgfQorICAgIH0K
K30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgTmF0aXZlVHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9y
aWdpbiwgbmFtZSwgaXNQcmltaXRpdmUsIHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAg
dGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAg
ICAgdGhpcy5faXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTsKKyAgICAgICAgdGhpcy5fdHlwZVBh
cmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigp
IHsgcmV0dW5yIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5f
bmFtZTsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuX2lzUHJpbWl0aXZl
OyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRl
cnM7IH0KKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgaW5z
dGFudGlhdGUodHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRz
Lmxlbmd0aCAhPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3RhbnRpYXRp
b24iKTsKKyAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzOworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5cGVJbnN0YW5jZSh0aGlzLCB0
eXBlQXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuICJuYXRpdmUgIiArICh0aGlzLmlzUHJpbWl0aXZlID8gInByaW1pdGl2ZSAiIDog
IiIpICsgInR5cGUgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAi
PiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFu
Y2UuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5j
ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5
cGVJbnN0YW5jZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHR5cGVBcmd1
bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5f
dHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAorICAgIGdldCB0eXBl
KCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1
cm4gdGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJu
IHRoaXMuX3R5cGUuaXNQcmltaXRpdmU7IH0KKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0
cnVlOyB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisg
ICAgeworICAgICAgICBpZiAodGhpcy50eXBlICE9IG90aGVyLnR5cGUpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90
aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkg
eworICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRp
b25Db250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiPCIgKyB0
aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9Ob2RlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5vZGUgeworICAgIHZpc2l0KHZpc2l0b3IpCisg
ICAgeworICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSB2aXNpdG9yWyJ2aXNpdCIgKyB0aGlzLmNv
bnN0cnVjdG9yLm5hbWVdKHRoaXMpOworICAgICAgICBpZiAoInJldHVyblZhbHVlIiBpbiB2aXNp
dG9yKQorICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IucmV0dXJuVmFsdWU7CisgICAgICAgIHJl
dHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisgICAgCisgICAgdW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGxldCB1bmlmeVRoaXMgPSB0aGlzLnVuaWZ5Tm9k
ZTsKKyAgICAgICAgbGV0IHVuaWZ5T3RoZXIgPSBvdGhlci51bmlmeU5vZGU7CisgICAgICAgIGlm
ICh1bmlmeU90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlU
aGlzKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gdW5pZnlUaGlz
LnVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIHVuaWZ5T3RoZXIpOworICAgIH0KKyAgICAK
KyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAg
IGlmIChvdGhlci50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHRoaXMpKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB0aGlzID09IG90aGVyOwor
ICAgIH0KKyAgICAKKyAgICB0eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90
aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBnZXQg
dW5pZnlOb2RlKCkgeyByZXR1cm4gdGhpczsgfQorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0
dXJuIGZhbHNlOyB9CisgICAgCisgICAgZ2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0K
KyAgICAKKyAgICBlcXVhbHMob3RoZXIpCisgICAgeworICAgICAgICBsZXQgdW5pZmljYXRpb25D
b250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dCgpOworICAgICAgICByZXR1cm4gdGhpcy51
bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKSAmJiB1bmlmaWNhdGlvbkNvbnRleHQuaXNV
bnVuaWZpZWQoKTsKKyAgICB9CisgICAgCisgICAgc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBhcmd1
bWVudExpc3QpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy52aXNpdChTdWJzdGl0dXRpb24u
bWFwcGluZyhwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3QpKTsKKyAgICB9CisgICAgCisgICAgc3Vi
c3RpdHV0ZVRvVW5pZmljYXRpb24ocGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUocGFyYW1ldGVycywgcGFyYW1ldGVycy5tYXAo
dHlwZSA9PiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0eXBlKSkpOworICAgIH0KK30KSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1BhcnNlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHBhcnNlKHBy
b2dyYW0sIG9yaWdpbiwgdGV4dCkKK3sKKyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIob3JpZ2lu
LCB0ZXh0KTsKKyAgICAKKyAgICAvLyBUaGUgaGFyZGVzdCBwYXJ0IG9mIGRlYWxpbmcgd2l0aCBD
LWxpa2UgbGFuZ3VhZ2VzIGlzIHBhcnNpbmcgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50
cy4KKyAgICAvLyBMZXQncyBjb25zaWRlciBpZiB0aGlzIGhhcHBlbnMgaW4gQXJyYXlMYW5nLiBI
ZXJlIGFyZSB0aGUgdmFsaWQgc3RhdGVtZW50cyBpbiBBcnJheUxhbmcgdGhhdAorICAgIC8vIGJl
Z2luIHdpdGggYW4gaWRlbnRpZmllciwgaWYgd2UgYXNzdW1lIHRoYXQgYW55IGV4cHJlc3Npb24g
Y2FuIGJlIGEgc3RhbmRhbG9uZSBzdGF0ZW1lbnQuCisgICAgLy8KKyAgICAvLyAgICAgeDsKKyAg
ICAvLyAgICAgeCA8Ymlub3A+IHk7CisgICAgLy8gICAgIHggPCB5OworICAgIC8vICAgICB4IDwg
eSA+IHo7CisgICAgLy8gICAgIHggPSB5OworICAgIC8vICAgICB4LmYgPSB5OworICAgIC8vICAg
ICBcZXhwID0geTsKKyAgICAvLyAgICAgeFs0Ml0gPSB5OworICAgIC8vICAgICB4KCk7CisgICAg
Ly8gICAgIHg8eT4oKTsKKyAgICAvLyAgICAgeCB5OworICAgIC8vICAgICB4PHk+IHo7CisgICAg
Ly8gICAgIHhbXSB5OworICAgIC8vICAgICB4WzQyXSB5OworICAgIC8vICAgICB4XiB5OworICAg
IC8vCisgICAgLy8gVGhpcyBoYXMgdHdvIHByb2JsZW0gYXJlYXM6CisgICAgLy8KKyAgICAvLyAg
ICAgLSB4PHk+eiBjYW4gcGFyc2UgdHdvIGRpZmZlcmVudCB3YXlzIChhcyAoeCA8IHkpID4geiBv
ciB4PHk+IHopLgorICAgIC8vICAgICAtIHhbNDJdIGNvdWxkIGJlY29tZSBlaXRoZXIgYW4gYXNz
aWdubWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vICAgICAtIHg8eT4gY291
bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24u
CisgICAgLy8KKyAgICAvLyBXZSBzb2x2ZSB0aGUgZmlyc3QgcHJvYmxlbSBieSBmb3JiaWRkaW5n
IGV4cHJlc3Npb25zIGFzIHN0YXRlbWVudHMuIFRoZSBsYWNrIG9mIGZ1bmN0aW9uCisgICAgLy8g
cG9pbnRlcnMgbWVhbnMgdGhhdCB3ZSBjYW4gc3RpbGwgYWxsb3cgZnVuY3Rpb24gY2FsbCBzdGF0
ZW1lbnRzIC0gdW5saWtlIGluIEMsIHRob3NlIGNhbm5vdAorICAgIC8vIGhhdmUgYXJiaXRyYXJ5
IGV4cHJlc3Npb25zIGFzIHRoZSBjYWxsZWUuIFRoZSByZW1haW5pbmcgdHdvIHByb2JsZW1zIGFy
ZSBzb2x2ZWQgYnkKKyAgICAvLyBiYWNrdHJhY2tpbmcuIEluIGFsbCBvdGhlciByZXNwZWN0cywg
dGhpcyBpcyBhIHNpbXBsZSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuCisgICAgCisgICAgZnVu
Y3Rpb24gZ2VuZXJpY0NvbnN1bWUoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgdG9rZW4g
PSBsZXhlci5uZXh0KCk7CisgICAgICAgIGlmICghdG9rZW4pCisgICAgICAgICAgICBsZXhlci5m
YWlsKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisgICAgICAgIGlmIChjYWxsYmFjayh0b2tl
bikpCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4cGVjdGVkIHRva2VuOiAiICsgdG9rZW4u
dGV4dCArICI7IGV4cGVjdGVkOiAiICsgdGV4dCk7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gY29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAg
IHJldHVybiBnZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0
KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGNvbnN1bWVLaW5kKGtpbmQpCisgICAgewor
ICAgICAgICByZXR1cm4gZ2VuZXJpY0NvbnN1bWUodG9rZW4gPT4gdG9rZW4ua2luZCA9PSBraW5k
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gYXNzZXJ0TmV4dCguLi50ZXh0cykKKyAgICB7
CisgICAgICAgIGxleGVyLnB1c2goY29uc3VtZSguLi50ZXh0cykpOworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiBnZW5lcmljVGVzdChjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCB0b2tl
biA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuICYmIGNhbGxiYWNrKHRva2VuKSkK
KyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHRlc3QoLi4udGV4dHMpCisgICAgeworICAgICAgICByZXR1cm4g
Z2VuZXJpY1Rlc3QodG9rZW4gPT4gdGV4dHMuaW5jbHVkZXModG9rZW4udGV4dCkpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiB0ZXN0S2luZChraW5kKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGdlbmVyaWNUZXN0KHRva2VuID0+IHRva2VuLmtpbmQgPT0ga2luZCk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHRyeUNvbnN1bWUoLi4udGV4dHMpCisgICAgeworICAgICAgICBsZXQgcmVz
dWx0ID0gdGVzdCguLi50ZXh0cyk7CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICBs
ZXhlci5uZXh0KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIHBhcnNlUHJvdG9jb2xSZWYoKQorICAgIHsKKyAgICAgICAgbGV0IHByb3RvY29sVG9r
ZW4gPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICByZXR1cm4gbmV3IFByb3Rv
Y29sUmVmKHByb3RvY29sVG9rZW4ub3JpZ2luLCBwcm90b2NvbFRva2VuLnRleHQpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiBjb25zdW1lRW5kT2ZUeXBlQXJncygpCisgICAgeworICAgICAg
ICBsZXQgcmlnaHRTaGlmdCA9IHRyeUNvbnN1bWUoIj4+Iik7CisgICAgICAgIGlmIChyaWdodFNo
aWZ0KQorICAgICAgICAgICAgbGV4ZXIucHVzaChuZXcgTGV4ZXJUb2tlbihsZXhlciwgcmlnaHRT
aGlmdC5vcmlnaW4sIHJpZ2h0U2hpZnQuaW5kZXgsIHJpZ2h0U2hpZnQua2luZCwgIj4iKSk7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbnN1bWUoIj4iKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VUeXBlUGFyYW1ldGVycygpCisgICAgeworICAgICAgICBpZiAoIXRlc3Qo
IjwiKSkKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1
bHQgPSBbXTsKKyAgICAgICAgY29uc3VtZSgiPCIpOworICAgICAgICB3aGlsZSAoIXRlc3QoIj4i
KSkgeworICAgICAgICAgICAgbGV0IGNvbnN0ZXhwciA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3Bl
KCgpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAg
ICAgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAg
ICAgICAgICBhc3NlcnROZXh0KCIsIiwgIj4iLCAiPj4iKTsKKyAgICAgICAgICAgICAgICByZXR1
cm4gbmV3IENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIodHlwZS5vcmlnaW4sIG5hbWUsIHR5cGUpOwor
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoY29uc3RleHByKQorICAgICAgICAgICAg
ICAgIHJlc3VsdC5wdXNoKGNvbnN0ZXhwcik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAg
ICAgICAgbGV0IHByb3RvY29sID0gdHJ5Q29uc3VtZSgiOiIpID8gcGFyc2VQcm90b2NvbFJlZigp
IDogbnVsbDsKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVHlwZVZhcmlhYmxlKG5h
bWUub3JpZ2luLCBuYW1lLnRleHQsIHByb3RvY29sKSk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBjb25zdW1lRW5kT2ZUeXBlQXJncygpOworICAgICAgICByZXR1cm4gcmVz
dWx0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVEZWYoKQorICAgIHsKKyAg
ICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInR5cGUiKS5vcmlnaW47CisgICAgICAgIGxldCBu
YW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKS50ZXh0OworICAgICAgICBsZXQgdHlwZVBh
cmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgIGNvbnN1bWUoIj0iKTsK
KyAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgY29uc3VtZSgiOyIpOwor
ICAgICAgICByZXR1cm4gbmV3IFR5cGVEZWYob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywg
dHlwZSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRGVyZWZlcmVuY2UoKQorICAg
IHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoIl4iKS5vcmlnaW47CisgICAgICAgIHJl
dHVybiBuZXcgRGVyZWZlcmVuY2Uob3JpZ2luLCBwYXJzZUV4cHJlc3Npb24oKSk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KG1vZGUpCisgICAgewor
ICAgICAgICBsZXQgdGVybXMgPSBbXTsKKyAgICAgICAgbGV0IHRyYWlsaW5nVGVybTsKKyAgICAg
ICAgZm9yICg7OykgeworICAgICAgICAgICAgdHJhaWxpbmdUZXJtID0gcGFyc2VUZXJuYXJ5Q29u
ZGl0aW9uYWwoKTsKKyAgICAgICAgICAgIGxldCBvcGVyYXRvciA9IHRyeUNvbnN1bWUoIj0iLCAi
Kz0iLCAiLT0iLCAiKj0iLCAiLz0iLCAiJT0iLCAiXj0iLCAifD0iLCAiJj0iKTsKKyAgICAgICAg
ICAgIGlmICghb3BlcmF0b3IpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB0
ZXJtcy5wdXNoKHtvcGVyYXRvciwgdGVybTogdHJhaWxpbmdUZXJtfSk7CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKG1vZGUgPT0gInJlcXVpcmVBc3NpZ25tZW50IiAmJiAhdGVybXMubGVuZ3RoKQor
ICAgICAgICAgICAgbGV4ZXIuZmFpbCgiRXhwZWN0ZWQgYXNzaWdubWVudCIpOworICAgICAgICB3
aGlsZSAodGVybXMubGVuZ3RoKSB7CisgICAgICAgICAgICBsZXQgdGVybSA9IHRlcm1zLnBvcCgp
OworICAgICAgICAgICAgaWYgKHRlcm0ub3BlcmF0b3IgPT0gIj0iKSB7CisgICAgICAgICAgICAg
ICAgdHJhaWxpbmdUZXJtID0gbmV3IEFzc2lnbm1lbnQodGVybS50ZXJtLm9yaWdpbiwgdGVybSwg
dHJhaWxpbmdUZXJtKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGxldCBvcGVyYXRvciA9IHRlcm0ub3BlcmF0b3Iuc3Vic3RyaW5nKDAsIHRl
cm0ub3BlcmF0b3IubGVuZ3RoIC0gMSk7CisgICAgICAgICAgICB0cmFpbGluZ1Rlcm0gPSBuZXcg
Q2FsbEFzc2lnbm1lbnQodGVybS50ZXJtLm9yaWdpbiwgIm9wZXJhdG9yIiArIG9wZXJhdG9yLCB0
ZXJtLCB0cmFpbGluZ1Rlcm0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cmFpbGluZ1Rl
cm07CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQXNzaWdubWVudCgpCisgICAgewor
ICAgICAgICByZXR1cm4gcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoInJlcXVpcmVBc3NpZ25tZW50
Iik7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRWZmZWN0ZnVsRXhwcmVzc2lvbigp
CisgICAgeworICAgICAgICBsZXQgYXNzaWdubWVudCA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3Bl
KCgpID0+IHsgcmV0dXJuIHBhcnNlQXNzaWdubWVudCgpOyB9KTsKKyAgICAgICAgaWYgKGFzc2ln
bm1lbnQpCisgICAgICAgICAgICByZXR1cm4gYXNzaWdubWVudDsKKyAgICAgICAgcmV0dXJuIHBh
cnNlQ2FsbEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDb21t
YUV4cHJlc3Npb24oZWZmZWN0TW9kZSkKKyAgICB7CisgICAgICAgIGxldCBsaXN0ID0gW107Cisg
ICAgICAgIGxldCBvcmlnaW4gPSBsZXhlci5wZWVrKCk7CisgICAgICAgIGlmICghb3JpZ2luKQor
ICAgICAgICAgICAgbGV4ZXIuZmFpbCgiVW5leHBlY3J0ZWQgZW5kIG9mIGZpbGUiKTsKKyAgICAg
ICAgb3JpZ2luID0gb3JpZ2luLm9yaWdpbjsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAg
ICAgbGV0IGVmZmVjdGZ1bEV4cHJlc3Npb24gPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9
PiB7IHJldHVybiBwYXJzZUVmZmVjdGZ1bEV4cHJlc3Npb24oKTsgfSk7CisgICAgICAgICAgICBp
ZiAoIWVmZmVjdGZ1bEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBpZiAoZWZmZWN0TW9k
ZSA9PSAicmVxdWlyZUVmZmVjdCIgJiYgIWxpc3QubGVuZ3RoKQorICAgICAgICAgICAgICAgICAg
ICBsZXhlci5mYWlsKCJEaWQgbm90IGZpbmQgcmVxdWlyZWQgZWZmZWN0IGluIGNvbW1hIGV4cHJl
c3Npb24iKTsKKyAgICAgICAgICAgICAgICBsaXN0LnB1c2gocGFyc2VQb3NzaWJsZUFzc2lnbm1l
bnQoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICBsaXN0LnB1c2goZWZmZWN0ZnVsRXhwcmVzc2lvbik7CisgICAgICAgICAgICBpZiAoIXRyeUNv
bnN1bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gbmV3IENvbW1hRXhwcmVzc2lvbihvcmlnaW4sIGxpc3QpOworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNl
Q29tbWFFeHByZXNzaW9uKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQ29tbWFT
dGF0ZW1lbnQoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHBhcnNlQ29tbWFFeHByZXNz
aW9uKCJyZXF1aXJlRWZmZWN0Iik7CisgICAgICAgIGNvbnN1bWUoIjsiKTsKKyAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VSZXR1cm4oKQorICAg
IHsKKyAgICAgICAgY29uc3VtZSgicmV0dXJuIik7CisgICAgICAgIHJldHVybiBwYXJzZUV4cHJl
c3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnQoKQorICAg
IHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAodG9rZW4u
dGV4dCA9PSAiOyIpIHsKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJl
dHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJyZXR1cm4i
KQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmV0dXJuKCk7CisgICAgICAgIGlmICh0b2tlbi50
ZXh0ID09ICJicmVhayIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VCcmVhaygpOworICAgICAg
ICBpZiAodG9rZW4udGV4dCA9PSAiY29udGludWUiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNl
Q29udGludWUoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIndoaWxlIikKKyAgICAgICAg
ICAgIHJldHVybiBwYXJzZVdoaWxlKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJkbyIp
CisgICAgICAgICAgICByZXR1cm4gcGFyc2VEbygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9
PSAiZm9yIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUZvcigpOworICAgICAgICBsZXQgY29t
bWFFeHByZXNzaW9uID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFy
c2VDb21tYVN0YXRlbWVudCgpOyB9KTsKKyAgICAgICAgaWYgKGNvbW1hRXhwcmVzc2lvbikKKyAg
ICAgICAgICAgIHJldHVybiBjb21tYUV4cHJlc3Npb247CisgICAgICAgIHJldHVybiBwYXJzZVZh
cmlhYmxlRGVjbCgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUJsb2NrKCkKKyAg
ICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1lKCJ7Iikub3JpZ2luOworICAgICAgICBs
ZXQgYmxvY2sgPSBuZXcgQmxvY2sob3JpZ2luKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCJ9Iikp
IHsKKyAgICAgICAgICAgIGxldCBzdGF0ZW1lbnQgPSBwYXJzZVN0YXRlbWVudCgpOworICAgICAg
ICAgICAgaWYgKHN0YXRlbWVudCkKKyAgICAgICAgICAgICAgICBibG9jay5wdXNoKHN0YXRlbWVu
dCk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgifSIpOworICAgICAgICByZXR1cm4gYmxv
Y2s7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRnVuY3Rpb25EZWYoKQorICAgIHsK
KyAgICAgICAgbGV0IHJldHVyblR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgbGV0IG5hbWUg
PSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpLnRleHQ7CisgICAgICAgIGxldCB0eXBlUGFyYW1l
dGVycyA9IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgY29uc3VtZSgiKCIpOworICAg
ICAgICBsZXQgcGFyYW1ldGVycyA9IFtdOworICAgICAgICB3aGlsZSAoIXRlc3QoIikiKSkgewor
ICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKHBhcnNlUGFyYW1ldGVyKCkpOworICAgICAgICAg
ICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgY29uc3VtZSgiKSIpOworICAgICAgICBsZXQgYmxvY2sgPSBwYXJzZUJsb2Nr
KCk7CisgICAgICAgIHJldHVybiBGdW5jdGlvbkRlZihyZXR1cm5UeXBlLm9yaWdpbiwgbmFtZSwg
cmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMsIGJvZHkpOworICAgIH0KKyAg
ICAKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAg
ICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHRva2Vu
LnRleHQgPT0gIjsiKQorICAgICAgICAgICAgbGV4ZXIubmV4dCgpOworICAgICAgICBlbHNlIGlm
ICh0b2tlbi50ZXh0ID09ICJ0eXBlIikKKyAgICAgICAgICAgIHBhcnNlVHlwZURlZigpOworICAg
ICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJuYXRpdmUiKQorICAgICAgICAgICAgcGFyc2VO
YXRpdmVUeXBlKCk7CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gInN0cnVjdCIpCisg
ICAgICAgICAgICBwYXJzZVN0cnVjdFR5cGUoKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4
dCA9PSAiZW51bSIpCisgICAgICAgICAgICBwYXJzZUVudW0oKTsKKyAgICAgICAgZWxzZSBpZiAo
dG9rZW4udGV4dCA9PSAicHJvdG9jb2wiKQorICAgICAgICAgICAgcGFyc2VQcm90b2NvbERlY2wo
KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFyc2VGdW5jdGlvbkRlZigpOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL1Byb2dyYW0uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50cyA9IFtdOworICAgICAgICB0aGlzLl9mdW5j
dGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVzID0gbmV3IE1hcCgpOworICAg
IH0KKyAgICAKKyAgICBnZXQgdG9wTGV2ZWxTdGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdG9w
TGV2ZWxTdGF0ZW1lbnRzOyB9CisgICAgZ2V0IGZ1bmN0aW9ucygpIHsgcmV0dXJuIHRoaXMuX2Z1
bmN0aW9uczsgfQorICAgIGdldCB0eXBlcygpIHsgcmV0dXJuIHRoaXMuX3R5cGVzOyB9CisgICAg
CisgICAgYWRkVG9wTGV2ZWxTdGF0ZW1lbnQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAgc3Rh
dGVtZW50LnByb2dyYW0gPSB0aGlzOworICAgICAgICBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2Yg
RnVuY3Rpb24pIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IHRoaXMuX2Z1bmN0aW9ucy5nZXQo
c3RhdGVtZW50Lm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAgICAgICAgICAgICAg
ICB0aGlzLl9mdW5jdGlvbnMuc2V0KHN0YXRlbWVudC5uYW1lLCBhcnJheSA9IFtdKTsKKyAgICAg
ICAgICAgIGFycmF5LnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZW1l
bnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAgdGhpcy5fdHlwZXMuc2V0KHN0YXRlbWVu
dC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlvbiBvciB0eXBlOiAiICsgc3RhdGVtZW50
KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsKKyAg
ICB9CisgICAgCisgICAgcmVzb2x2ZUZ1bmN0aW9uT3ZlcmxvYWQobmFtZSwgdHlwZUFyZ3VtZW50
cywgYXJndW1lbnRUeXBlcykKKyAgICB7CisgICAgICAgIGxldCBmdW5jdGlvbnMgPSB0aGlzLmZ1
bmN0aW9ucy5nZXQobmFtZSk7CisgICAgICAgIGlmICghZnVuY3Rpb25zKQorICAgICAgICAgICAg
cmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBwaHVuY3Rpb24gb2YgZnVu
Y3Rpb25zKSB7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggJiYgdHlwZUFy
Z3VtZW50cy5sZW5ndGggIT0gcGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudFR5cGVzLmxlbmd0
aCAhPSBwaHVuY3Rpb24ucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9u
Q29udGV4dChwaHVuY3Rpb24udHlwZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgbGV0IG9rID0g
dHJ1ZTsKKyAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5n
dGg7ICsraSkgeworICAgICAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IHR5cGVBcmd1bWVudHNb
aV07CisgICAgICAgICAgICAgICAgbGV0IHBhcmFtZXRlciA9IHBodW5jdGlvbi50eXBlUGFyYW1l
dGVyc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoKGFyZ3VtZW50IGluc3RhbmNlb2YgVHlwZSkg
IT0gKHBhcmFtZXRlciBpbnN0YW5jZW9mIFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG9r
ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBpZiAoIWFyZ3VtZW50LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwg
cGFyYW1ldGVyKSkgeworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAg
ICAgICAgICAgaWYgKCFhcmd1bWVudFR5cGVzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwg
cGh1bmN0aW9uLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sg
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0IHNob3VsZEJ1aWxkVHlwZUFy
Z3VtZW50cyA9ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChzaG91bGRC
dWlsZFR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IFtdOwor
ICAgICAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBwaHVuY3Rpb24udHlwZVBhcmFt
ZXRlcnMpIHsKKyAgICAgICAgICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdW5pZmljYXRpb25D
b250ZXh0LmZpbmQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVBcmd1
bWVudCA9PSB0eXBlUGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7
CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgICAgICBpZiAoc2hvdWxkQnVpbGRUeXBlQXJndW1lbnRzKQorICAgICAgICAgICAgICAgICAg
ICB0eXBlQXJndW1lbnRzLnB1c2godHlwZUFyZ3VtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBy
ZXR1cm4ge3BodW5jdGlvbiwgdW5pZmljYXRpb25Db250ZXh0LCB0eXBlQXJndW1lbnRzfTsKKyAg
ICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAg
IGdldCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE5hbWVD
b250ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiB0aGlzLnRvcExldmVsU3Rh
dGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29s
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2wgZXh0ZW5kcyBOb2RlIHsKKyAgICBj
b25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBnZXQg
b3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVy
biB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBQcm90b2NvbDsgfQorICAg
IAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAg
fQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xEZWNsIGV4dGVuZHMgUHJvdG9jb2wgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwg
bmFtZSkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdOworICAgICAgICB0aGlzLl9zaWdu
YXR1cmVNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVWYXJpYWJsZSA9IG5ldyBU
eXBlVmFyaWFibGUob3JpZ2luLCBuYW1lLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgYWRkU2ln
bmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAgICAgIC8vIE5PVEU6IEFueSB0eXBlIHBhcmFt
ZXRlcnMgZm91bmQgaW4gdGhlIHNpZ25hdHVyZSBtdXN0IGJlIGluZmVyYWJsZSBmcm9tIHRoZSB2
YWx1ZQorICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAgICAgICAvLyBGSVhNRTogQ2hlY2sgdGhp
cyEgKE9PUFMhKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlKTsKKyAg
ICAgICAgbGV0IG92ZXJsb2FkcyA9IHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQoc2lnbmF0dXJlLm5h
bWUpOworICAgICAgICBpZiAoIW92ZXJsb2FkcykKKyAgICAgICAgICAgIHRoaXMuX3NpZ25hdHVy
ZU1hcC5zZXQoc2lnbmF0dXJlLm5hbWUsIG92ZXJsb2FkcyA9IFtdKTsKKyAgICAgICAgb3Zlcmxv
YWRzLnB1c2goc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHNpZ25hdHVyZXMoKSB7
IHJldHVybiB0aGlzLl9zaWduYXR1cmVzOyB9CisgICAgc2lnbmF0dXJlc0J5TmFtZShuYW1lKSB7
IHJldHVybiB0aGlzLl9zaWduYXR1cmVNYXAuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IHR5cGVWYXJp
YWJsZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGVWYXJpYWJsZTsgfQorICAgIAorICAgIGluaGVyaXRz
KG90aGVyUHJvdG9jb2wpCisgICAgeworICAgICAgICBpZiAoIW90aGVyUHJvdG9jb2wpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChvdGhlclByb3RvY29s
IGluc3RhbmNlb2YgUHJvdG9jb2xSZWYpCisgICAgICAgICAgICBvdGhlclByb3RvY29sID0gb3Ro
ZXJQcm90b2NvbC5wcm90b2NvbERlY2w7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBvdGhl
clNpZ25hdHVyZSBvZiBvdGhlclByb3RvY29sLnNpZ25hdHVyZXMpIHsKKyAgICAgICAgICAgIGxl
dCBzaWduYXR1cmVzID0gdGhpcy5zaWduYXR1cmVzQnlOYW1lKG90aGVyU2lnbmF0dXJlLm5hbWUp
OworICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVzKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChs
ZXQgc2lnbmF0dXJlIDogc2lnbmF0dXJlcykgeworICAgICAgICAgICAgICAgIGlmIChzaWduYXR1
cmUucGFyYW1ldGVycy5sZW5ndGggIT0gb3RoZXJTaWduYXR1cmUucGFyYW1ldGVycy5sZW5ndGgp
CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIAorICAgICAg
ICAgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycy5j
b25jYXQodGhpcy50eXBlVmFyaWFibGUpOworICAgICAgICAgICAgICAgIGxldCB1bmlmaWNhdGlv
bkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAg
ICAgICAgICAgICBsZXQgb2sgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAw
OyBpIDwgc2lnbmF0dXJlLnBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAg
ICAgICAgaWYgKCFzaWduYXR1cmUucGFyYW1ldGVyc1tpXS50eXBlLnVuaWZ5KG90aGVyU2lnbmF0
dXJlLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9rID0g
ZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW9rKQorICAgICAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICBpZiAodW5pZmljYXRpb25D
b250ZXh0LnZlcmlmeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxldCBzdWJzdGl0dXRlZFJl
dHVyblR5cGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLnJldHVyblR5cGUu
c3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlw
ZVBhcmFtZXRlcnMsIHVuaWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGlm
ICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhvdGhlclNpZ25hdHVyZS5yZXR1cm5UeXBl
KSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAg
ICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKCFmb3VuZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAg
ICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24ubWFwcGluZyhbdGhp
cy5fdHlwZVZhcmlhYmxlXSwgW3R5cGVdKTsKKyAgICAgICAgZm9yIChsZXQgYWJzdHJhY3RTaWdu
YXR1cmUgb2YgdGhpcy5fc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZSA9
IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pOworICAgICAgICAgICAgbGV0IG92ZXJsb2Fk
ID0gdGhpcy5wcm9ncmFtLnJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKHNpZ25hdHVyZS5uYW1lLCBb
XSwgc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgICAgIGlmICghb3ZlcmxvYWQp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAg
ICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0gb3ZlcmxvYWQucGh1bmN0aW9uLnJldHVyblR5
cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAgb3ZlcmxvYWQucGh1
bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlvbkNvbnRleHQpOworICAg
ICAgICAgICAgaWYgKCFzdWJzdGl0dXRlZFJldHVyblR5cGUuZXF1YWxzKHNpZ25hdHVyZS5yZXR1
cm5UeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiAicHJvdG9jb2wgIiArIHRoaXMubmFtZSArICIgeyAiICsgdGhpcy5zaWduYXR1
cmVzLmpvaW4oIjsgIikgKyAiOyB9IjsKKyAgICB9Cit9CisKKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvUHJvdG9jb2xSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJv
dG9jb2xSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xS
ZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2Nv
bFJlZiBleHRlbmRzIFByb3RvY29sIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisg
ICAgeworICAgICAgICBzdXBlcihvcmlnaW4sIG5hbWUpOworICAgICAgICB0aGlzLnByb3RvY29s
RGVjbCA9IG51bGw7CisgICAgfQorICAgIAorICAgIGluaGVyaXRzKG90aGVyKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMucHJvdG9jb2xEZWNsLmluaGVyaXRzKG90aGVyKTsKKyAgICB9Cisg
ICAgCisgICAgaGFzSGVpcih0eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvdG9j
b2xEZWNsLmhhc0hlaXIodHlwZSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
UHRyVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQdHJUeXBlIGV4dGVuZHMgUmVmZXJlbmNl
VHlwZSB7CisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVz
c1NwYWNlICsgIiAiICsgdGhpcy5lbGVtZW50VHlwZSArICJeIjsKKyAgICB9Cit9CisKSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDggQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgUmVmZXJlbmNlVHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9y
KG9yaWdpbiwgYWRkcmVzc1NwYWNlLCBlbGVtZW50VHlwZSkKKyAgICB7CisgICAgICAgIHZhbGlk
YXRlQWRkcmVzc1NwYWNlKGFkZHJlc3NTcGFjZSk7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9y
aWdpbjsKKyAgICAgICAgdGhpcy5fYWRkcmVzc1NwYWNlID0gYWRkcmVzc1NwYWNlOworICAgICAg
ICB0aGlzLl9lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgIH0KKyAgICAKKyAgICBnZXQg
b3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGFkZHJlc3NTcGFjZSgp
IHsgcmV0dXJuIHRoaXMuX2FkZHJlc3NTcGFjZTsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsg
cmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1
cm4gZmFsc2U7IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
cikKKyAgICB7CisgICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yICE9IG90aGVyLmNvbnN0cnVj
dG9yKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5lbGVt
ZW50VHlwZS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvUmV0dXJuLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgUmV0dXJuIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB2YWx1
ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5f
dmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRo
aXMuX29yaWdpbjsgfQorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ7ICIgKyB0aGlzLnN0
YXRlbWVudHMuam9pbigiOyAiKTsgKyAiOyB9IjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9SZXdyaXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9S
ZXdyaXRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXdyaXRlciB7
CisgICAgdmlzaXRGdW5jdGlvbihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5j
dGlvbigKKyAgICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KHRoaXMp
LAorICAgICAgICAgICAgbm9kZS50eXBlUGFyYW1ldGVycy5tYXAodHlwZVBhcm1ldGVyID0+IHR5
cGVQYXJhbWV0ZXIudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJzLm1h
cChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLnZpc2l0KHRoaXMpKSk7CisgICAgfQorICAgIAorICAg
IHZpc2l0RnVuY3Rpb25QYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcg
RnVuY3Rpb25Bcmd1bWVudChub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAg
fQorICAgIAorICAgIHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQg
PSBuZXcgQmxvY2sobm9kZS5vcmlnaW4pOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Yg
bm9kZS5zdGF0ZW1lbnRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChzdGF0ZW1lbnQudmlzaXQo
dGhpcykpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFBy
b3RvY29sUmVmKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3
IFR5cGVSZWYobm9kZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50eXBlQXJndW1lbnRzLm1hcCh0
eXBlQXJndW1lbnQgPT4gdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgICAgIHJlc3Vs
dC50eXBlID0gbm9kZS50eXBlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7
CisgICAgfQorICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUub3JpZ2lu
LCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZp
c2l0RmllbGQobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGQobm9kZS5vcmln
aW4sIG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IG5vZGUu
Y29uc3RydWN0b3Iobm9kZS5yb2dpaW4sIG5vZGUuYWRkcmVzc1NwYWNlLCBub2RlLmVsZW1lbnRU
eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJUeXBlKG5vZGUpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy52aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7CisgICAg
fQorICAgIAorICAgIHZpc2l0QXJyYXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy52aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0
QXJyYXlUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShub2Rl
Lm9yaWdpbiwgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAg
IHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3NpZ25t
ZW50KG5vZGUub3JpZ2luLCBub2RlLmxocy52aXNpdCh0aGlzKSwgbm9kZS5yaHMudmlzaXQodGhp
cykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAg
ICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiBuZXcgUmV0dXJuKG5vZGUub3JpZ2luLCBub2RlLnZhbHVlID8g
bm9kZS52YWx1ZS52aXNpdCh0aGlzKSA6IG51bGwpOworICAgIH0KKyAgICAKKyAgICB2aXNpdElu
dExpdGVyYWwobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAg
IHZpc2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ2Fs
bEV4cHJlc3Npb24oCisgICAgICAgICAgICBub2RlLm9yaWdpbiwgbm9kZS5uYW1lLAorICAgICAg
ICAgICAgbm9kZS50eXBlQXJndW1lbnRzLm1hcCh0eXBlQXJndW1lbnQgPT4gdHlwZUFyZ3VtZW50
LnZpc2l0KHRoaXMpKSwKKyAgICAgICAgICAgIG5vZGUuYXJndW1lbnRsaXN0Lm1hcChhcmd1bWVu
dCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSkpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvU3RydWN0VHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9T
dHJ1Y3RUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5
cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdHJ1Y3RU
eXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFy
YW1ldGVycykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBh
cmFtZXRlcnM7CisgICAgICAgIHRoaXMuX2ZpZWxkcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAg
CisgICAgYWRkKGZpZWxkKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcy5oYXMoZmll
bGQubmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IoZmllbGQub3JpZ2lu
LmxpbmVOdW1iZXIsICJEdXBsaWNhdGUgZmllbGQgbmFtZTogIiArIGZpZWxkLm5hbWUpOworICAg
ICAgICB0aGlzLl9maWVsZHMuc2V0KGZpZWxkLm5hbWUsIGZpZWxkKTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0
ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICAKKyAgICBnZXQgZmll
bGROYW1lcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy5rZXlzKCk7IH0KKyAgICBmaWVsZEJ5TmFt
ZShuYW1lKSB7IHJldHVybiB0aGlzLl9maWVsZHMuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IGZpZWxk
cygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy52YWx1ZXMoKTsgfQorICAgIGdldCBmaWVsZE1hcCgp
IHsgcmV0dXJuIHRoaXMuX2ZpZWxkczsgfQorICAgIAorICAgIGdldCBuYW1lQ29udGV4dCgpCisg
ICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIGZv
ciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhpcy50eXBlUGFyYW1ldGVycykKKyAgICB9CisgICAg
CisgICAgaW5zdGFudGlhdGUodHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBl
QXJndW1lbnRzLmxlbmd0aCAhPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ubGluZU51bWJlciwgIldyb25nIG51bWJl
ciBvZiB0eXBlIGFyZ3VtZW50cyB0byBpbnN0YW50aWF0aW9uIik7CisgICAgICAgIAorICAgICAg
ICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgCisgICAgICAg
IGxldCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24ubWFwcGluZyh0aGlzLnR5cGVQYXJhbWV0
ZXJzLCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTdHJ1Y3RUeXBl
KHRoaXMub3JpZ2luLCB0aGlzLm5hbWUsIFtdKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Yg
dGhpcy5maWVsZHMpCisgICAgICAgICAgICByZXN1bHQuYWRkKGZpZWxkLnZpc2l0KHN1YnN0aXR1
dGlvbikpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gInN0cnVjdCAiICsgdGhpcy5uYW1lICsgIjwiICsg
dGhpcy50eXBlUGFyYW1ldGVycyArICI+IHsgIiArIEFycmF5LmZyb20odGhpcy5maWVsZHMpLmpv
aW4oIjsgIikgKyAiOyB9IjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdWJz
dGl0dXRpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9u
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN1YnN0aXR1dGlvbiBl
eHRlbmRzIFJld3JpdGVyIHsKKyAgICBjb25zdHJ1Y3RvcihtYXApCisgICAgeworICAgICAgICB0
aGlzLl9tYXAgPSBtYXA7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBtYXBwaW5nKHBhcmFtZXRl
cnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCAh
PSBhcmd1bWVudExpc3QubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJh
bWV0ZXJzIGFuZCBhcmd1bWVudHMgYXJlIG1pc21hdGNoZWQiKTsKKyAgICAgICAgbGV0IG1hcCA9
IG5ldyBNYXAoKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0
aDsgKytpKQorICAgICAgICAgICAgbWFwLnNldChwYXJhbWV0ZXJzW2ldLCBhcmd1bWVudExpc3Rb
aV0pOworICAgICAgICByZXR1cm4gbmV3IFN1YnN0aXR1dGlvbihtYXApOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBsYWNlbWVudCA9
IHRoaXMuX21hcC5nZXQobm9kZS50eXBlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7Cisg
ICAgICAgICAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgICAg
ICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBhcmd1bWVudHMgb24gdHlwZSB2YXJp
YWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgIH0KKwor
ICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBsYWNlbWVu
dCA9IHRoaXMuX21hcC5nZXQobm9kZS52YXJpYWJsZSk7CisgICAgICAgIGlmIChyZXBsYWNlbWVu
dCkKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgCisgICAgICAgIHJl
dHVybiBzdXBlci52aXNpdFZhcmlhYmxlUmVmKG5vZGUpOworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9U
eXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlIGV4dGVuZHMgTm9kZSB7
CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gW107IH0KKyAgICBnZXQga2luZCgp
IHsgcmV0dXJuIFR5cGU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBwcm90b2NvbC5oYXNIZWlyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICBn
ZXQgaW5zdGFudGlhdGVkVHlwZSgpIHsgcmV0dXJuIHRoaXM7IH0KK30KKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvVHlwZURlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9U
eXBlRGVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlRGVmIGV4dGVu
ZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywg
dHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhp
cy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFt
ZXRlcnM7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQg
b3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVy
biB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5f
dHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL1R5cGVSZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBUeXBlUmVmIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1l
LCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOwor
ICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gbnVsbDsKKyAg
ICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorIAorICAg
IGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsg
cmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRo
aXMuX3R5cGVBcmd1bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0eXBl
ID8gdHlwZS5pc1ByaW1pdGl2ZSA6IGZhbHNlOyB9CisgICAgCisgICAgZ2V0IGluc3RhbnRpYXRl
ZFR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5pbnN0YW50aWF0ZSh0eXBl
QXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHVuaWZ5Tm9kZSgpCisgICAgeworICAg
ICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4g
dGhpcy50eXBlLnVuaWZ5Tm9kZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorICAgIAor
ICAgIHNldFR5cGVBbmRBcmd1bWVudHModHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAg
ICAgIHRoaXMuX25hbWUgPSB0eXBlLm5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Cisg
ICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgIH0KKyAgICAK
KyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAg
IGlmICghKG90aGVyIGluc3RhbmNlb2YgVHlwZVJlZikpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIGlmICghdGhpcy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3Ro
ZXIudHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5
cGVBcmd1bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlw
ZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1
bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ld
KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7CisgICAgfQor
fQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNl
IHN0cmljdCI7CisKK2NsYXNzIFR5cGVWYXJpYWJsZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0
cnVjdG9yKG9yaWdpbiwgbmFtZSwgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0aGlzLl9vcmln
aW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9w
cm90b2NvbCA9IHByb3RvY29sOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJu
IHRoaXMuX25hbWU7IH0KKyAgICBnZXQgcHJvdG9jb2woKSB7IHJldHVybiB0aGlzLl9wcm90b2Nv
bDsgfQorICAgIAorICAgIGdldCBpc1ByaW1pdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5fcHJvdG9jb2wgJiYgdGhpcy5fcHJvdG9jb2wuaXNQcmltaXRpdmU7CisgICAgfQorICAg
IAorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbmhl
cml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghcHJvdG9jb2wpCisgICAgICAgICAg
ICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhwcm90
b2NvbCk7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNv
bnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAg
ICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7Cisg
ICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIpOwor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0
aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlVmFyaWFi
bGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICB9CisgICAgCisgICAgdmVy
aWZ5QXNBcmd1bWVudCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICBsZXQgcmVh
bFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgCisgICAgICAg
IC8vIFRoZSB0aGluZyB3ZSBnZXQgdW5pZmllZCB3aXRoIG11c3QgYmUgYSB0eXBlIHZhcmlhYmxl
IHRoYXQgYWNjZXB0cyBhIGJyb2FkZXIgc2V0IG9mCisgICAgICAgIC8vIHRoaW5ncyB0aGFuIHdl
IGRvLgorICAgICAgICBpZiAoIShyZWFsVGhpcyBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlmICghdGhpcy5wcm90
b2NvbCkKKyAgICAgICAgICAgIHJldHVybiAhcmVhbFRoaXMucHJvdG9jb2w7CisgICAgICAgIAor
ICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhyZWFsVGhpcy5wcm90b2NvbCk7
CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4dCkK
KyAgICB7CisgICAgICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0
cnVlOworICAgICAgICByZXR1cm4gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcykuaW5oZXJp
dHModGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvVW5pZmljYXRpb25Db250ZXh0LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIFVuaWZpY2F0aW9uQ29udGV4dCB7CisgICAgY29uc3RydWN0b3IodHlwZVBh
cmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IG5ldyBTZXQo
dHlwZVBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9uZXh0TWFwID0gbmV3IE1hcCgpOworICAg
IH0KKyAgICAKKyAgICB1bmlvbihhLCBiKQorICAgIHsKKyAgICAgICAgYSA9IGZpbmQoYSk7Cisg
ICAgICAgIGIgPSBmaW5kKGIpOworICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKCFiLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAg
W2EsIGJdID0gW2IsIGFdOworICAgICAgICBpZiAoIWEuaXNVbmlmaWFibGUpCisgICAgICAgICAg
ICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCB1bmlmeSBub24tdW5pZmlhYmxlIHRoaW5ncyAiICsg
YSArICIgYW5kICIgKyBiKTsKKyAgICAgICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHR5
cGUgcGFyYW1ldGVycyBkb24ndCBlbmQgdXAgYmVpbmcgcm9vdHMuCisgICAgICAgIGlmIChhLmlz
VW5pZmlhYmxlICYmIGIuaXNVbmlmaWFibGUgJiYgdGhpcy5fdHlwZVBhcmFtZXRlcnMuaGFzKGIp
KQorICAgICAgICAgICAgW2EsIGJdID0gW2IsIGFdOworCisgICAgICAgIHRoaXMuX25leHRNYXAu
c2V0KGEsIGIpOworICAgIH0KKyAgICAKKyAgICBmaW5kKG5vZGUpCisgICAgeworICAgICAgICBs
ZXQgY3VycmVudE5vZGUgPSBub2RlOworICAgICAgICBsZXQgbmV4dE5vZGUgPSB0aGlzLl9uZXh0
TWFwLmdldChjdXJyZW50Tm9kZSk7CisgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAg
ICByZXR1cm4gY3VycmVudE5vZGU7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGN1
cnJlbnROb2RlID0gbmV4dE5vZGU7CisgICAgICAgICAgICBuZXh0Tm9kZSA9IHRoaXMuX25leHRN
YXAuZ2V0KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQobm9k
ZSwgY3VycmVudE5vZGUpOworICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7CisgICAgfQorICAg
IAorICAgIGdldCBub2RlcygpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFNldCgp
OworICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fbmV4dE1hcCkgeworICAg
ICAgICAgICAgcmVzdWx0LmFkZChrZXkpOworICAgICAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmVy
aWZ5KCkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhpcy5fdHlw
ZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGlmICghdHlwZVBhcmFtZXRlci52ZXJpZnlBc1Bh
cmFtZXRlcih0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIHRoaXMubm9kZXMpIHsKKyAgICAgICAg
ICAgIGlmICh0aGlzLl90eXBlUGFyYW1ldGVycy5oYXModHlwZUFyZ3VtZW50KSkKKyAgICAgICAg
ICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50LnZlcmlmeUFz
QXJndW1lbnQodGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBpc1VudW5pZmllZCgpCisg
ICAgeworICAgICAgICByZXR1cm4gIXRoaXMuX25leHRNYXAuc2l6ZSgpOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvVmFsdWUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmFs
dWUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWYWx1ZSBl
eHRlbmRzIE5vZGUgeworICAgIGdldCBraW5kKCkgeyByZXR1cm4gVmFsdWU7IH0KKyAgICBnZXQg
aXNDb25zdGV4cHIoKSB7IHJldHVybiBmYWxzZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9WYXJpYWJsZVJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WYXJp
YWJsZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJl
Zi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhcmlhYmxl
UmVmIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQor
ICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7
CisgICAgICAgIHRoaXMudmFyaWFibGUgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFt
ZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVy
biB0aGlzLnZhcmlhYmxlLmlzQ29uc3RleHByOyB9CisgICAgZ2V0IHVuaWZ5Tm9kZSgpIHsgcmV0
dXJuIHRoaXMudmFyaWFibGUudW5pZnlOb2RlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9WaXNpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0
b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWaXNpdG9yIHsKKyAgICB2
aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBu
b2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlz
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvbihub2RlKQorICAgIHsKKyAgICAgICAg
bm9kZS5yZXR1cm5UeXBlLnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1l
dGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZp
c2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJz
KQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEZ1bmN0aW9uUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlz
aXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rpb25EZWYobm9kZSkKKyAgICB7
CisgICAgICAgIHZpc2l0RnVuY3Rpb24obm9kZSk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdCh0
aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAg
Zm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRl
bWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbFJlZihub2Rl
KQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAgICB7
CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBub2RlLnNpZ25hdHVyZXMpCisgICAgICAg
ICAgICBzaWduYXR1cmUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJl
Zihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlw
ZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXROYXRpdmVUeXBlKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxl
dCB0eXBlUGFyYW10ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQ
YXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZURlZihub2Rl
KQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJh
bWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAg
bm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUo
bm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBl
UGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAg
ICAgIGZvciAobGV0IGZpZWxkIG9mIG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlz
aXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAg
eworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAg
ICB7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRGaWVsZChub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEVsZW1lbnRhbFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIG5v
ZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHRyVHlw
ZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0
aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJh
eVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUp
OworICAgICAgICBub2RlLm51bUVsZW1lbnRzLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUubGhzLnZpc2l0KHRo
aXMpOworICAgICAgICBub2RlLnJocy52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4o
bm9kZSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLnZhbHVlKQorICAgICAgICAgICAgbm9kZS52
YWx1ZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzdEludExpdGVyYWwobm9kZSkK
KyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7
CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisg
ICAgICAgICAgICB0eXBlQXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IGFy
Z3VtZW50IG9mIG5vZGUuYXJndW1lbnRMaXN0KQorICAgICAgICAgICAgYXJndW1lbnQudmlzaXQo
dGhpcyk7CisgICAgfQorfQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319143</attachid>
            <date>2017-08-26 17:31:43 -0700</date>
            <delta_ts>2017-08-26 19:12:21 -0700</delta_ts>
            <desc>lot more code in the parser</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>134655</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gdmFs
aWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAgIHN3aXRjaCAoYWRkcmVzc1Nw
YWNlKSB7CisgICAgY2FzZSAiY29uc3RhbnQiOgorICAgIGNhc2UgImRldmljZSI6CisgICAgY2Fz
ZSAidGhyZWFkZ3JvdXAiOgorICAgIGNhc2UgInRocmVhZCI6CisgICAgICAgIHJldHVybjsKKyAg
ICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBhZGRyZXNzIHNwYWNlOiAi
ICsgYWRkcmVzc1NwYWNlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9BcnJh
eVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlSZWZUeXBl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5UmVmVHlwZSBl
eHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1FbGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlw
ZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAg
CisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVt
ZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1l
bnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxlbWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUo
KSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9T
dHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0
aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2Vv
ZiBBcnJheVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgaWYgKCF0aGlzLm51bUVsZW1lbnRzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIu
bnVtRWxlbWVudHMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci5lbGVtZW50VHlwZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Bc3Np
Z25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFzc2lnbm1lbnQgZXh0ZW5kcyBF
eHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0
aGlzLl9yaHMgPSByaHM7CisgICAgfQorICAgIAorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlz
Ll9saHM7IH0KKyAgICBnZXQgcmhzKCkgeyByZXR1cm4gdGhpcy5fcmhzOyB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsgIiA9ICIgKyB0aGlz
LnJoczsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIEJsb2NrIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9z
dGF0ZW1lbnRzID0gW107CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICBhZGQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAg
dGhpcy5fc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIGdldCBz
dGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fc3RhdGVtZW50czsgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAieyAiICsgdGhpcy5zdGF0ZW1lbnRzLmpvaW4o
IjsgIik7ICsgIjsgfSI7CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2Fs
bEFzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEFzc2ln
bm1lbnQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEFzc2lnbm1l
bnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDYWxsQXNz
aWdubWVudCBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFt
ZSwgbGhzLCByaHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlz
Ll9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0aGlzLl9y
aHMgPSByaHM7CisgICAgICAgIHRoaXMucGh1bmN0aW9uID0gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGxocygpIHsgcmV0
dXJuIHRoaXMuX2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0aGlzLl9yaHM7IH0KKyAg
ICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMgKyAiICIg
KyB0aGlzLm5hbWUgKyAiPSAiICsgdGhpcy5yaHM7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9DYWxsRXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIENhbGxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudExpc3QpCisgICAgeworICAg
ICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAg
dGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgICAgIHRoaXMuX2FyZ3Vt
ZW50TGlzdCA9IGFyZ3VtZW50TGlzdDsKKyAgICAgICAgdGhpcy5waHVuY3Rpb24gPSBudWxsOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBn
ZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0KKyAgICBn
ZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9CisgICAgCisg
ICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8IiArIHRo
aXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCArICIpIjsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9DaGVja2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjYxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIENoZWNrZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAvLyBJdCdzIHRvdGFsbHkgT0sg
dG8gaW5zdGFudGlhdGUgdGhpcyB3aXRoIHplcm8gYXJndW1lbnRzIChpLmUuIHBhc3NpbmcgdW5k
ZWZpbmVkIGZvciBib3RoIG9mCisgICAgLy8gdGhlbSkgaWYgeW91J3JlIGNyZWF0aW5nIGEgQ2hl
Y2tlciB0byB2aXNpdCBhIFByb2dyYW0uCisgICAgY29uc3RydWN0b3IobmFtZUNvbnRleHQpCisg
ICAgeworICAgICAgICB0aGlzLl9uYW1lQ29udGV4dCA9IG5hbWVDb250ZXh0OworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4
dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250
ZXh0LnByb2dyYW0gPSBub2RlOworICAgICAgICBuYW1lQ29udGV4dC5yZWNvZ25pemVJbnRyaW5z
aWNzKCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVt
ZW50cykKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZChzdGF0ZW1lbnQpOworICAgICAgICBs
ZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQg
c3RhdGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgbmFtZUNv
bnRleHQuZG9TdGF0ZW1lbnQoKCkgPT4gc3RhdGVtZW50LnZpc2l0KGNoZWNrZXIpKTsKKyAgICB9
CisgICAgCisgICAgX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUp
CisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5f
bmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlw
ZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVy
KTsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIG5hbWVDb250ZXh0OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9u
KG5vZGUpCisgICAgeworICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKHRoaXMuX3Zp
c2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAgICAgICAgbm9k
ZS5yZXR1cm5UeXBlLnZpc2l0KGNoZWNrZXIpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIg
b2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXIp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uRGVmKG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyA9IHRoaXMuX3Zpc2l0VHlwZVBhcmFtZXRl
cnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpOworICAgICAgICBsZXQgY2hlY2tlcldpdGhUeXBl
UGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNvbnRleHRXaXRoVHlwZVBhcmFtZXRlcnMpOworICAg
ICAgICBub2RlLnJldHVyblR5cGUudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7Cisg
ICAgICAgIGxldCBjb250ZXh0V2l0aFBhcmFtZXRlcnMgPSBuZXcgTmFtZUNvbnRleHQoY29udGV4
dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2Rl
LnBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChjaGVja2VyV2l0aFR5
cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIGNvbnRleHRXaXRoUGFyYW1ldGVycy5hZGQocGFy
YW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlcldpdGhQYXJhbWV0ZXJzID0g
bmV3IENoZWNrZXIoY29udGV4dFdpdGhQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5ib2R5LnZp
c2l0KGNoZWNrZXJXaXRoUGFyYW1ldGVycyk7CisgICAgfQorICAgIAorICAgIHZpc2l0QmxvY2so
bm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmV3IE5hbWVD
b250ZXh0KHRoaXMuX25hbWVDb250ZXh0KSk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBv
ZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQoY2hlY2tlcik7
CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAgICAg
ICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKSB7CisgICAgICAgICAgICBs
ZXQgc2V0ID0gbmV3IFNldCgpOworICAgICAgICAgICAgZnVuY3Rpb24gY29uc2lkZXIodGhpbmcp
CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaW5nLmlzVW5pZmlhYmxlKQor
ICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHRoaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIGNsYXNzIE5vdGljZVR5cGVWYXJpYWJsZSBleHRlbmRzIFZpc2l0b3IgeworICAgICAg
ICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAg
ICAgICAgICAgICAgY29uc2lkZXIobm9kZS50eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgICAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICAgICAgY29uc2lkZXIobm9kZS52YXJpYWJsZSk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0IG5vdGljZVR5cGVWYXJpYWJsZSA9
IG5ldyBOb3RpY2VUeXBlVmFyaWFibGUoKTsKKyAgICAgICAgICAgIGZvciAobGV0IHBhcmFtZXRl
clR5cGUgb2Ygc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKQorICAgICAgICAgICAgICAgIHBhcmFt
ZXRlclR5cGUudmlzaXQobm90aWNlVHlwZVZhcmlhYmxlKTsKKyAgICAgICAgICAgIGZvciAobGV0
IHR5cGVQYXJhbWV0ZXIgb2Ygc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAg
ICAgICAgaWYgKCFzZXQuaGFzKHR5cGVQYXJhbWV0ZXIpKQorICAgICAgICAgICAgICAgICAgICB0
aHJvdyBBTFR5cGVFcnJvcih0eXBlUGFyYW1ldGVyLm9yaWdpbi5saW5lTnVtYmVyLCAiVHlwZSBw
YXJhbWV0ZXIgdG8gcHJvdG9jb2wgc2lnbmF0dXJlIG5vdCBpbmZlcnJhYmxlIGZyb20gdmFsdWUg
cGFyYW1ldGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOwor
ICAgICAgICBuYW1lQ29udGV4dC5hZGQobm9kZS50eXBlVmFyaWFibGUpOworICAgICAgICBsZXQg
Y2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgc2ln
bmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52aXNpdChj
aGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5vZGUpCisgICAgeworICAg
ICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQp
OworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMp
IHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgICAgICBu
YW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAgbGV0IGNo
ZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIG5vZGUudHlwZS52aXNp
dChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNv
bnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFt
ZXRlcnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAg
ICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAg
bGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0
IGZpZWxkIG9mIG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQoY2hlY2tlcik7
CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IHR5cGUgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVHlwZSwgbm9kZS5uYW1lKTsKKyAgICAgICAg
aWYgKCF0eXBlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2lu
LmxpbmVOdW1iZXIsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOwor
ICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmlzRGVmaW5lZCh0eXBlKSkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiSWxsZWdh
bCBmb3J3YXJkIHVzZSBvZiB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBub2Rl
LnR5cGUgPSB0eXBlOworICAgICAgICAKKyAgICAgICAgaWYgKHR5cGUudHlwZVBhcmFtZXRlcnMu
bGVuZ3RoICE9IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIldyb25nIG51bWJlciBvZiB0
eXBlIGFyZ3VtZW50cyIpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGUudHlwZVBh
cmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJJc1R5cGUg
PSB0eXBlLnR5cGVQYXJhbWV0ZXJzW2ldIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlOworICAgICAg
ICAgICAgbGV0IGFyZ3VtZW50SXNUeXBlID0gbm9kZS50eXBlQXJndW1lbnRzW2ldIGluc3RhbmNl
b2YgVHlwZTsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJJc1R5cGUgJiYgIWFyZ3VtZW50SXNU
eXBlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5s
aW5lTnVtYmVyLCAiRXhwZWN0ZWQgdHlwZSwgYnV0IGdvdCB2YWx1ZSBhdCBhcmd1bWVudCAjIiAr
IGkpOworICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJJc1R5cGUgJiYgYXJndW1lbnRJc1R5cGUp
CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVO
dW1iZXIsICJFeHBlY3RlZCB2YWx1ZSwgYnV0IGdvdCB0eXBlIGF0IGFyZ3VtZW50ICMiICsgaSk7
CisgICAgICAgICAgICBpZiAoIWFyZ3VtZW50SXNUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYg
KCFub2RlLnR5cGVBcmd1bWVudHNbaV0uaXNDb25zdEV4cHIpCisgICAgICAgICAgICAgICAgICAg
IHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5lTnVtYmVyLCAiRXhwZWN0ZWQg
Y29uc3RleHByIHZhbHVlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICAgICAgCisgICAgICAgIHdoaWxl
IChub2RlLnR5cGUgaW5zdGFuY2VvZiBUeXBlRGVmKSB7CisgICAgICAgICAgICBsZXQgdW5pZmlj
YXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dChub2RlLnR5cGUudHlwZVBhcmFt
ZXRlcnMpOworICAgICAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gbm9k
ZS50eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoImFyZ3VtZW50L3BhcmFtZXRlciBtaXNtYXRjaCAoc2hvdWxkIGhhdmUgYmVlbiBjYXVn
aHQgZWFybGllcikiKTsKKyAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS50eXBl
QXJndW1lbnRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50
c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG5vZGUudHlwZS50eXBlUGFyYW1ldGVyc1tp
XSk7CisgICAgICAgICAgICBpZiAoIXVuaWZpY2F0aW9uQ29udGV4dC52ZXJpZnkoKSkKKyAgICAg
ICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwg
IlR5cGUgcmVmZXJlbmNlIHRvIGEgdHlwZSBkZWZpbml0aW9uIHZpb2xhdGVzIHByb3RvY29sIGNv
bnN0cmFpbnRzIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIG5vZGUudHlwZSA9IG5vZGUu
dHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMsIHVu
aWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZl
cmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFt
ZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5kZWZpbmVB
bGwoKTsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgQ2hlY2tlcihuYW1lQ29u
dGV4dCkpOworICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUuYWRkcmVzc1NwYWNlID09ICJ0aHJl
YWQiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgY2xhc3MgSW5zdGFu
dGlhdGVJbW1lZGlhdGVzIGV4dGVuZHMgUmV3cml0ZXIgeworICAgICAgICAgICAgdmlzaXRUeXBl
UmVmKG5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbm9kZSA9IHN1cGVyLnZp
c2l0VHlwZVJlZihub2RlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pbnN0YW50aWF0
ZWRUeXBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB2aXNpdFJl
ZmVyZW5jZVR5cGUobm9kZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bm9kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFu
b2RlLmVsZW1lbnRUeXBlLnZpc2l0KG5ldyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMoKSkuaXNQcmlt
aXRpdmUpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGlu
ZU51bWJlciwgIklsbGVnYWwgcG9pbnRlciB0byBub24tcHJpbWl0aXZlIHR5cGUiKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAgICAgICAvLyBGSVhN
RTogV2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBsaHMgaXMgYXNzaWduYWJsZS4KKyAgICAgICAg
bGV0IGxoc1R5cGUgPSBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IHJoc1R5cGUg
PSBub2RlLnJocy52aXNpdCh0aGlzKTsKKyAgICAgICAgaWYgKCFsaHNUeXBlLmVxdWFscyhyaHNU
eXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5saW5l
TnVtYmVyLCAiVHlwZSBtaXNtYXRjaCBpbiBhc3NpZ25tZW50OiAiICsgbGhzVHlwZSArICIgdmVy
c3VzICIgKyByaHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIGxoc1R5cGU7CisgICAgfQorICAgIAor
ICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0
aGlzLl9uYW1lQ29udGV4dC5nZXQoVmFsdWUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVz
dWx0KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLmxpbmVO
dW1iZXIsICJDb3VsZCBub3QgZmluZCB2YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAg
ICAgICAgbm9kZS52YXJpYWJsZSA9IHJlc3VsdDsKKyAgICAgICAgbm9kZS4KKyAgICAgICAgCisg
ICAgICAgIHJldHVybiByZXN1bHQudHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4o
bm9kZSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAgICBsZXQg
cmVzdWx0VHlwZSA9IG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXRo
aXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUuZXF1YWxzKHJlc3Vs
dFR5cGUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdp
bi5saW5lTnVtYmVyLCAiVHJ5aW5nIHRvIHJldHVybiAiICsgcmVzdWx0VHlwZSArICIgaW4gYSBm
dW5jdGlvbiB0aGF0IHJldHVybnMgIiArIHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1l
bnQucmV0dXJuVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAg
IAorICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJu
VmFsdWUuZXF1YWxzKHRoaXMuX25hbWVDb250ZXh0LmludHJpbnNpY3Mudm9pZCkpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ubGluZU51bWJlciwgIk5vbi12
b2lkIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUiKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbmFtZUNvbnRl
eHQuaW50cmluc2ljcy5pbnQzMjsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lv
bihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlw
ZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAg
ICAgbGV0IGFyZ3VtZW50VHlwZXMgPSBub2RlLmFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4g
YXJndW1lbnQudmlzaXQodGhpcykpOworICAgICAgICBsZXQgb3ZlcmxvYWQgPSB0aGlzLl9uYW1l
Q29udGV4dC5wcm9ncmFtLnJlc29sdmVGdW5jdGlvbk92ZXJsb2FkKAorICAgICAgICAgICAgbm9k
ZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICBpZiAo
IW92ZXJsb2FkKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2lu
LmxpbmVOdW1iZXIsICJEaWQgbm90IGZpbmQgZnVuY3Rpb24gZm9yIGNhbGwiKTsKKyAgICAgICAg
cmV0dXJuIG92ZXJsb2FkLnBodW5jdGlvbi5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0
aW9uKAorICAgICAgICAgICAgb3ZlcmxvYWQucGh1bmN0aW9uLnR5cGVQYXJhbWV0ZXJzLCBvdmVy
bG9hZC51bmlmaWNhdGlvbkNvbnRleHQpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0NvbW1hRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9D
b21tYUV4cHJlc3Npb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBDb21tYUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGxpc3QpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0
aGlzLl9saXN0ID0gbGlzdDsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpc3QoKSB7IHJldHVybiB0
aGlzLl9saXN0OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
ICIoIiArIHRoaXMubGlzdC50b1N0cmluZygpICsgIikiOworICAgIH0KK307CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ29uc3RleHByVHlwZVBhcmFtZXRl
ciBleHRlbmRzIFZhbHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUpCisg
ICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUg
PSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0
aGlzLl90eXBlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAg
IGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUltcGwo
dW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBl
LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25Db250ZXh0LmZp
bmQodGhpcyk7CisgICAgICAgIGlmIChyZWFsVGhpcyAhPSB0aGlzKQorICAgICAgICAgICAgcmV0
dXJuIHJlYWxUaGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgICAgICAK
KyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVmFyaWFibGVSZWYpCisgICAgICAgICAgICBv
dGhlciA9IG90aGVyLnZhcmlhYmxlOworICAgICAgICAKKyAgICAgICAgdW5pZmljYXRpb25Db250
ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IAorICAgIHZlcmlmeUFzQXJndW1lbnQodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZp
Y2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsg
dGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lv
bi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVmFsdWUg
eworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29y
aWdpbjsgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvRmllbGQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBGaWVsZCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsK
KyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFt
ZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmln
aW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRo
aXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsg
dGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb24gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25z
dHJ1Y3RvcihuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycykKKyAg
ICB7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9yZXR1cm5UeXBl
ID0gcmV0dXJuVHlwZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1l
dGVyczsKKyAgICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgfQorICAg
IAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCByZXR1cm5U
eXBlKCkgeyByZXR1cm4gdGhpcy5fcmV0dXJuVHlwZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVy
cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlcnMo
KSB7IHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlclR5cGVzKCkg
eyByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLnR5cGUp
OyB9CisgICAgCisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBGdW5jdGlvbjsgfQorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnJldHVyblR5cGUgKyAiICIg
KyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4oIiArIHRoaXMucGFy
YW1ldGVycyArICIpIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0
aW9uRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uRGVmLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uRGVmLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb25EZWYgZXh0ZW5k
cyBGdW5jdGlvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0
eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycywgYm9keSkKKyAgICB7CisgICAgICAgIHN1cGVyKG5h
bWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhp
cy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBi
b2R5KCkgeyByZXR1cm4gdGhpcy5fYm9keTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiB7ICIgKyBib2R5ICsgIiB9IjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uUGFyYW1ldGVyLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb25QYXJhbWV0
ZXIgeworICAgIC8vIFRoZSBuYW1lIGlzIG9wdGlvbmFsLiBJdCdzIE9LIGZvciBpdCB0byBiZSBu
dWxsIQorICAgIGNvbnN0cnVjdG9yKG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1
cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9GdW5jdGlvblNpZ25hdHVyZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNl
IHN0cmljdCI7CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgSW50TGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24geworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgdmFsdWUpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4p
OworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgdmFs
dWUoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0
dXJuIHRydWU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4g
IiIgKyB0aGlzLl92YWx1ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0lu
dHJpbnNpY3MuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgSW50cmluc2ljcyB7CisgICAg
Y29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOworCisg
ICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBl
IHZvaWQ8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAgICAgICAgICAgIHRoaXMu
dm9pZCA9IHR5cGU7CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAor
ICAgICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSBpbnQzMjw+IiwKKyAgICAgICAgICAg
ICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy5pbnQzMiA9IHR5cGU7CisgICAgICAg
ICAgICB9KTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBw
cmltaXRpdmUgdHlwZSBkb3VibGU8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAg
ICAgICAgICAgIHRoaXMuZG91YmxlID0gdHlwZTsKKyAgICAgICAgICAgIH0pOworICAgIH0KKyAg
ICAKKyAgICBhZGQodGhpbmcpCisgICAgeworICAgICAgICBsZXQgaW50cmluc2ljID0gdGhpcy5f
bWFwLmdldCh0aGluZy5uYW1lKTsKKyAgICAgICAgaWYgKCFpbnRyaW5zaWMpCisgICAgICAgICAg
ICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IodGhpbmcub3JpZ2luLmxpbmVOdW1iZXIsICJVbnJlY29n
bml6ZWQgaW50cmluc2ljOiAiICsgdGhpbmcpOworICAgICAgICBpbnRyaW5zaWModGhpbmcpOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTGV4ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgTGV4ZXIgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgdGV4dCkKKyAgICB7CisgICAg
ICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7Cisg
ICAgICAgIHRoaXMuX2luZGV4ID0gMDsKKyAgICAgICAgdGhpcy5fc3RhY2sgPSBbXTsKKyAgICB9
CisgICAgCisgICAgZ2V0IGxpbmVOdW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
bGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9y
aWdpblN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luICsgIjoiICsg
KHRoaXMubGluZU51bWJlciArIDEpOworICAgIH0KKyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5k
ZXgoaW5kZXgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwg
aW5kZXgpLm1hdGNoKC9cbi9nKS5sZW5ndGg7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgp
IHsgcmV0dXJuIHRoaXMuX2luZGV4OyB9CisgICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2lu
ZGV4ID0gdmFsdWU7IH0KKyAgICAKKyAgICBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlz
Ll9zdGFjay5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhY2sucG9wKCk7Cisg
ICAgICAgIAorICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisg
ICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1l
bnRCZWdpbiA9IC9cL1wqLzsKKyAgICAgICAgY29uc3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4g
PSAvXC9cLy87CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAg
ICAgICAgICAgIGxldCB0ZXh0ID0gUmVnRXhwLmxhc3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0
b2tlbiA9IG5ldyBMZXhlclRva2VuKHRoaXMsIHRoaXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAg
ICAgICAgICAgIHRoaXMuX2luZGV4ICs9IHRleHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJu
IHRva2VuOworICAgICAgICB9OworCisgICAgICAgIGxldCByZWxldmFudFRleHQ7CisgICAgICAg
IGZvciAoOzspIHsKKyAgICAgICAgICAgIHJlbGV2YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3Ry
aW5nKHRoaXMuX2luZGV4KTsKKyAgICAgICAgICAgIGlmICgvXlxzKy8udGVzdChyZWxldmFudFRl
eHQpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5s
ZW5ndGg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoL15cL1wqLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBs
ZXQgZW5kSW5kZXggPSByZWxldmFudFRleHQuc2VhcmNoKC9cKlwvLyk7CisgICAgICAgICAgICAg
ICAgaWYgKGVuZEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRl
cm1pbmF0ZWQgY29tbWVudCIpOworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZElu
ZGV4OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKC9eXC9cLy4qLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0
aGlzLl9pbmRleCArPSBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlzIGRvIFVuaWNvZGUuCisgICAgICAg
IGlmICgvXlteXGRcV11cdyovLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVy
biByZXN1bHQoImlkZW50aWZpZXIiKTsKKworICAgICAgICBpZiAoL15bMC05XSsvLnRlc3QocmVs
ZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImludGVnZXJMaXRlcmFsIik7
CisKKyAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBoYW5kbGUgZXhwLWZvcm0gbGl0ZXJhbHMg
bGlrZSAxZTEuCisgICAgICAgIGlmICgvXihbMC05XSpcLlswLTldKyl8KFswLTldK1wuWzAtOV0q
KS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiZmxvYXRM
aXRlcmFsIik7CisgICAgICAgIAorICAgICAgICBpZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8
aWZ8ZWxzZXxlbnVtfGNvbnRpbnVlfGJyZWFrfHN3aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxl
fGRvfHJldHVybnxzaXplb2Z8Y29uc3RhbnR8ZGV2aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVy
YXRvcikvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImtl
eXdvcmQiKTsKKyAgICAgICAgCisgICAgICAgIGlmICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5e
Jnw8PlxcLV18LT58PT58PD18PT18IT18Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0
KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIp
OworICAgICAgICAKKyAgICAgICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3
aXRoOiAiICsgcmVsZXZhbnRUZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAg
ICBwdXNoKHRva2VuKQorICAgIHsKKyAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7Cisg
ICAgfQorICAgIAorICAgIHBlZWsoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQo
KTsKKyAgICAgICAgcHVzaChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K
KyAgICAKKyAgICBmYWlsKGVycm9yKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4
RXJyb3IodGhpcy5vcmlnaW5TdHJpbmcsIGVycm9yKTsKKyAgICB9CisgICAgCisgICAgYmFja3Ry
YWNraW5nU2NvcGUoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0
YXRlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAg
ICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhF
cnJvcikgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7Cisg
ICAgICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIExleGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9y
KGxleGVyLCBvcmlnaW4sIGluZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5f
bGV4ZXIgPSBsZXhlcjsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0
aGlzLl9pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAg
dGhpcy5fdGV4dCA9IHRleHQ7CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLl9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9y
aWdpbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAK
KyAgICBnZXQgaW5kZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAg
IH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fbGV4ZXIubGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4g
KyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5n
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwg
IiArIHRoaXMudGV4dCArICIsICIgKyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY29uc3QgbmFtZWFibGVTaW1wbGVLaW5kcyA9IG5ldyBTZXQoW1R5cGUsIFZhbHVlLCBQ
cm90b2NvbF0pOworY29uc3QgbmFtZWFibGVPdmVybG9hZGFibGVLaW5kcyA9IG5ldyBTZXQoW0Z1
bmN0aW9uXSk7Citjb25zdCBuYW1lYWJsZUtpbmRzID0gbmV3IFNldChBcnJheS5mcm9tKG5hbWVh
YmxlU2ltcGxlS2luZHMpLmNvbmNhdChBcnJheS5mcm9tKG5hbWVhYmxlT3ZlcmxvYWRhYmxlS2lu
ZHMpKSk7CisKK2NsYXNzIE5hbWVDb250ZXh0IHsKKyAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkK
KyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgZm9yIChsZXQg
a2luZCBvZiBuYW1lYWJsZUtpbmRzKQorICAgICAgICAgICAgdGhpcy5fbWFwLnNldChraW5kLCBu
ZXcgTWFwKCkpOworICAgICAgICB0aGlzLl9kZWZpbmVkID0gbmV3IFNldCgpOworICAgICAgICB0
aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgdGhpcy5fZGVsZWdhdGUgPSBu
dWxsOworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbnVsbDsKKyAgICAgICAgdGhpcy5fcHJv
Z3JhbSA9IG51bGw7CisgICAgfQorICAgIAorICAgIG1hcEZvcihraW5kKQorICAgIHsKKyAgICAg
ICAgbGV0IHJlc3VsdCA9IHRoaXMuX21hcC5nZXQoa2luZCk7CisgICAgICAgIGlmICghcmVzdWx0
KQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQga2luZDogIiArIGtpbmQpOworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBhZGQodGhpbmcpCisgICAgewor
ICAgICAgICBpZiAoIXRoaW5nLm5hbWUpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAor
ICAgICAgICBpZiAodGhpbmcuaXNOYXRpdmUpIHsKKyAgICAgICAgICAgIGlmICghdGhpcy5faW50
cmluc2ljcykKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5hdGl2ZSBmdW5jdGlv
biBpbiBhIHNjb3BlIHRoYXQgZG9lcyBub3QgcmVjb2duaXplIGludHJpbnNpY3MiKTsKKyAgICAg
ICAgICAgIHRoaXMuX2ludHJpbnNpY3MuYWRkKHRoaW5nKTsKKyAgICAgICAgfQorICAgICAgICAK
KyAgICAgICAgbGV0IG1hcCA9IG1hcEZvcih0aGluZy5raW5kKTsKKyAgICAgICAgaWYgKG5hbWVh
YmxlT3ZlcmxvYWRhYmxlS2luZHMuaGFzKHRoaW5nLmtpbmQpKSB7CisgICAgICAgICAgICBsZXQg
YXJyYXkgPSBtYXAuZ2V0KHRoaW5nLm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAg
ICAgICAgICAgICAgICBtYXAuc2V0KHRoaW5nLm5hbWUsIGFycmF5ID0gW10pOworICAgICAgICAg
ICAgYXJyYXkucHVzaCh0aGluZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAg
ICAgICAgaWYgKG1hcC5oYXModGhpbmcubmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxU
eXBlRXJyb3IodGhpbmcub3JpZ2luLmxpbmVOdW1iZXIsICJEdXBsaWNhdGUgbmFtZTogIiArIHRo
aW5nLm5hbWUpOworICAgICAgICBtYXAuc2V0KHRoaW5nLm5hbWUsIHRoaW5nKTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0KGtpbmQsIG5hbWUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbWFw
Rm9yKGtpbmQpLmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQgJiYgdGhpcy5fZGVsZWdh
dGUpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZ2V0KGtpbmQsIG5hbWUpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBnZXQgY3VycmVudFN0YXRl
bWVudCgpCisgICAgeworICAgICAgICBpZiAodGhpcy5fY3VycmVudFN0YXRlbWVudCkKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50U3RhdGVtZW50OworICAgICAgICBpZiAodGhpcy5f
ZGVsZWdhdGUpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY3VycmVudFN0YXRl
bWVudDsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIGlzRGVmaW5lZCh0
aGluZykKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9kZWZpbmVkLmhhcyh0aGluZykKKyAg
ICAgICAgICAgIHx8ICh0aGlzLl9kZWxlZ2F0ZSAmJiB0aGlzLl9kZWxlZ2F0ZS5pc0RlZmluZWQo
dGhpbmcpKTsKKyAgICB9CisgICAgCisgICAgZGVmaW5lKHRoaW5nKQorICAgIHsKKyAgICAgICAg
dGhpcy5fZGVmaW5lZC5zZXQodGhpbmcpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmVBbGwoKQor
ICAgIHsKKyAgICAgICAgZm9yIChsZXQgdGhpbmcgb2YgdGhpcykKKyAgICAgICAgICAgIGRlZmlu
ZSh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRvU3RhdGVtZW50KHN0YXRlbWVudCwgY2FsbGJh
Y2spCisgICAgeworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gc3RhdGVtZW50Owor
ICAgICAgICBjYWxsYmFjaygpOworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gbnVs
bDsKKyAgICAgICAgZGVmaW5lKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHJlY29nbml6
ZUludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAgdGhpcy5faW50cmluc2ljcyA9IG5ldyBJbnRy
aW5zaWNzKCk7CisgICAgfQorICAgIAorICAgIGdldCBpbnRyaW5zaWNzKCkKKyAgICB7CisgICAg
ICAgIGlmICh0aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludHJp
bnNpY3M7CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLl9kZWxlZ2F0ZS5pbnRyaW5zaWNzOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cisg
ICAgCisgICAgc2V0IHByb2dyYW0odmFsdWUpCisgICAgeworICAgICAgICB0aGlzLl9wcm9ncmFt
ID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCBwcm9ncmFtKCkKKyAgICB7CisgICAgICAg
IGlmICh0aGlzLl9wcm9ncmFtKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyYW07Cisg
ICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxl
Z2F0ZS5wcm9ncmFtOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgKltT
eW1ib2wuaXRlcmF0b3JdKCkKKyAgICB7CisgICAgICAgIGZvciAobGV0IG1hcCBvZiB0aGlzLl9t
YXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAobGV0IHR5cGUgb2YgdGhpcy5fdHlwZXMu
dmFsdWVzKCkpCisgICAgICAgICAgICAgICAgeWllbGQgdHlwZTsKKyAgICAgICAgfQorICAgIH0K
K30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgTmF0aXZlVHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9y
aWdpbiwgbmFtZSwgaXNQcmltaXRpdmUsIHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAg
dGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAg
ICAgdGhpcy5faXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTsKKyAgICAgICAgdGhpcy5fdHlwZVBh
cmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigp
IHsgcmV0dW5yIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5f
bmFtZTsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuX2lzUHJpbWl0aXZl
OyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRl
cnM7IH0KKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgaW5z
dGFudGlhdGUodHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRz
Lmxlbmd0aCAhPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3RhbnRpYXRp
b24iKTsKKyAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzOworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5cGVJbnN0YW5jZSh0aGlzLCB0
eXBlQXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuICJuYXRpdmUgIiArICh0aGlzLmlzUHJpbWl0aXZlID8gInByaW1pdGl2ZSAiIDog
IiIpICsgInR5cGUgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAi
PiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFu
Y2UuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5j
ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5
cGVJbnN0YW5jZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHR5cGVBcmd1
bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5f
dHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAorICAgIGdldCB0eXBl
KCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1
cm4gdGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJu
IHRoaXMuX3R5cGUuaXNQcmltaXRpdmU7IH0KKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0
cnVlOyB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisg
ICAgeworICAgICAgICBpZiAodGhpcy50eXBlICE9IG90aGVyLnR5cGUpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90
aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkg
eworICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRp
b25Db250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiPCIgKyB0
aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9Ob2RlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5vZGUgeworICAgIHZpc2l0KHZpc2l0b3IpCisg
ICAgeworICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSB2aXNpdG9yWyJ2aXNpdCIgKyB0aGlzLmNv
bnN0cnVjdG9yLm5hbWVdKHRoaXMpOworICAgICAgICBpZiAoInJldHVyblZhbHVlIiBpbiB2aXNp
dG9yKQorICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IucmV0dXJuVmFsdWU7CisgICAgICAgIHJl
dHVybiByZXR1cm5WYWx1ZTsKKyAgICB9CisgICAgCisgICAgdW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGxldCB1bmlmeVRoaXMgPSB0aGlzLnVuaWZ5Tm9k
ZTsKKyAgICAgICAgbGV0IHVuaWZ5T3RoZXIgPSBvdGhlci51bmlmeU5vZGU7CisgICAgICAgIGlm
ICh1bmlmeU90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlU
aGlzKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gdW5pZnlUaGlz
LnVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIHVuaWZ5T3RoZXIpOworICAgIH0KKyAgICAK
KyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAg
IGlmIChvdGhlci50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHRoaXMpKQor
ICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB0aGlzID09IG90aGVyOwor
ICAgIH0KKyAgICAKKyAgICB0eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90
aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBnZXQg
dW5pZnlOb2RlKCkgeyByZXR1cm4gdGhpczsgfQorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0
dXJuIGZhbHNlOyB9CisgICAgCisgICAgZ2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0K
KyAgICAKKyAgICBlcXVhbHMob3RoZXIpCisgICAgeworICAgICAgICBsZXQgdW5pZmljYXRpb25D
b250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dCgpOworICAgICAgICByZXR1cm4gdGhpcy51
bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKSAmJiB1bmlmaWNhdGlvbkNvbnRleHQuaXNV
bnVuaWZpZWQoKTsKKyAgICB9CisgICAgCisgICAgc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBhcmd1
bWVudExpc3QpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy52aXNpdChTdWJzdGl0dXRpb24u
bWFwcGluZyhwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3QpKTsKKyAgICB9CisgICAgCisgICAgc3Vi
c3RpdHV0ZVRvVW5pZmljYXRpb24ocGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUocGFyYW1ldGVycywgcGFyYW1ldGVycy5tYXAo
dHlwZSA9PiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0eXBlKSkpOworICAgIH0KK30KSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1BhcnNlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHBhcnNlKHBy
b2dyYW0sIG9yaWdpbiwgdGV4dCkKK3sKKyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIob3JpZ2lu
LCB0ZXh0KTsKKyAgICAKKyAgICAvLyBUaGUgaGFyZGVzdCBwYXJ0IG9mIGRlYWxpbmcgd2l0aCBD
LWxpa2UgbGFuZ3VhZ2VzIGlzIHBhcnNpbmcgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50
cy4KKyAgICAvLyBMZXQncyBjb25zaWRlciBpZiB0aGlzIGhhcHBlbnMgaW4gQXJyYXlMYW5nLiBI
ZXJlIGFyZSB0aGUgdmFsaWQgc3RhdGVtZW50cyBpbiBBcnJheUxhbmcgdGhhdAorICAgIC8vIGJl
Z2luIHdpdGggYW4gaWRlbnRpZmllciwgaWYgd2UgYXNzdW1lIHRoYXQgYW55IGV4cHJlc3Npb24g
Y2FuIGJlIGEgc3RhbmRhbG9uZSBzdGF0ZW1lbnQuCisgICAgLy8KKyAgICAvLyAgICAgeDsKKyAg
ICAvLyAgICAgeCA8Ymlub3A+IHk7CisgICAgLy8gICAgIHggPCB5OworICAgIC8vICAgICB4IDwg
eSA+IHo7CisgICAgLy8gICAgIHggPSB5OworICAgIC8vICAgICB4LmYgPSB5OworICAgIC8vICAg
ICBcZXhwID0geTsKKyAgICAvLyAgICAgeFs0Ml0gPSB5OworICAgIC8vICAgICB4KCk7CisgICAg
Ly8gICAgIHg8eT4oKTsKKyAgICAvLyAgICAgeCB5OworICAgIC8vICAgICB4PHk+IHo7CisgICAg
Ly8gICAgIHhbXSB5OworICAgIC8vICAgICB4WzQyXSB5OworICAgIC8vICAgICB4XiB5OworICAg
IC8vCisgICAgLy8gVGhpcyBoYXMgdHdvIHByb2JsZW0gYXJlYXM6CisgICAgLy8KKyAgICAvLyAg
ICAgLSB4PHk+eiBjYW4gcGFyc2UgdHdvIGRpZmZlcmVudCB3YXlzIChhcyAoeCA8IHkpID4geiBv
ciB4PHk+IHopLgorICAgIC8vICAgICAtIHhbNDJdIGNvdWxkIGJlY29tZSBlaXRoZXIgYW4gYXNz
aWdubWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vICAgICAtIHg8eT4gY291
bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24u
CisgICAgLy8KKyAgICAvLyBXZSBzb2x2ZSB0aGUgZmlyc3QgcHJvYmxlbSBieSBmb3JiaWRkaW5n
IGV4cHJlc3Npb25zIGFzIHN0YXRlbWVudHMuIFRoZSBsYWNrIG9mIGZ1bmN0aW9uCisgICAgLy8g
cG9pbnRlcnMgbWVhbnMgdGhhdCB3ZSBjYW4gc3RpbGwgYWxsb3cgZnVuY3Rpb24gY2FsbCBzdGF0
ZW1lbnRzIC0gdW5saWtlIGluIEMsIHRob3NlIGNhbm5vdAorICAgIC8vIGhhdmUgYXJiaXRyYXJ5
IGV4cHJlc3Npb25zIGFzIHRoZSBjYWxsZWUuIFRoZSByZW1haW5pbmcgdHdvIHByb2JsZW1zIGFy
ZSBzb2x2ZWQgYnkKKyAgICAvLyBiYWNrdHJhY2tpbmcuIEluIGFsbCBvdGhlciByZXNwZWN0cywg
dGhpcyBpcyBhIHNpbXBsZSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuCisgICAgCisgICAgZnVu
Y3Rpb24gZ2VuZXJpY0NvbnN1bWUoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgdG9rZW4g
PSBsZXhlci5uZXh0KCk7CisgICAgICAgIGlmICghdG9rZW4pCisgICAgICAgICAgICBsZXhlci5m
YWlsKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisgICAgICAgIGlmIChjYWxsYmFjayh0b2tl
bikpCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4cGVjdGVkIHRva2VuOiAiICsgdG9rZW4u
dGV4dCArICI7IGV4cGVjdGVkOiAiICsgdGV4dCk7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gY29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAg
IHJldHVybiBnZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0
KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGNvbnN1bWVLaW5kKGtpbmQpCisgICAgewor
ICAgICAgICByZXR1cm4gZ2VuZXJpY0NvbnN1bWUodG9rZW4gPT4gdG9rZW4ua2luZCA9PSBraW5k
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gYXNzZXJ0TmV4dCguLi50ZXh0cykKKyAgICB7
CisgICAgICAgIGxleGVyLnB1c2goY29uc3VtZSguLi50ZXh0cykpOworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiBnZW5lcmljVGVzdChjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCB0b2tl
biA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuICYmIGNhbGxiYWNrKHRva2VuKSkK
KyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHRlc3QoLi4udGV4dHMpCisgICAgeworICAgICAgICByZXR1cm4g
Z2VuZXJpY1Rlc3QodG9rZW4gPT4gdGV4dHMuaW5jbHVkZXModG9rZW4udGV4dCkpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiB0ZXN0S2luZChraW5kKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGdlbmVyaWNUZXN0KHRva2VuID0+IHRva2VuLmtpbmQgPT0ga2luZCk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHRyeUNvbnN1bWUoLi4udGV4dHMpCisgICAgeworICAgICAgICBsZXQgcmVz
dWx0ID0gdGVzdCguLi50ZXh0cyk7CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICBs
ZXhlci5uZXh0KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIHBhcnNlUHJvdG9jb2xSZWYoKQorICAgIHsKKyAgICAgICAgbGV0IHByb3RvY29sVG9r
ZW4gPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICByZXR1cm4gbmV3IFByb3Rv
Y29sUmVmKHByb3RvY29sVG9rZW4ub3JpZ2luLCBwcm90b2NvbFRva2VuLnRleHQpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiBjb25zdW1lRW5kT2ZUeXBlQXJncygpCisgICAgeworICAgICAg
ICBsZXQgcmlnaHRTaGlmdCA9IHRyeUNvbnN1bWUoIj4+Iik7CisgICAgICAgIGlmIChyaWdodFNo
aWZ0KQorICAgICAgICAgICAgbGV4ZXIucHVzaChuZXcgTGV4ZXJUb2tlbihsZXhlciwgcmlnaHRT
aGlmdC5vcmlnaW4sIHJpZ2h0U2hpZnQuaW5kZXgsIHJpZ2h0U2hpZnQua2luZCwgIj4iKSk7Cisg
ICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbnN1bWUoIj4iKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VUeXBlUGFyYW1ldGVycygpCisgICAgeworICAgICAgICBpZiAoIXRlc3Qo
IjwiKSkKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1
bHQgPSBbXTsKKyAgICAgICAgY29uc3VtZSgiPCIpOworICAgICAgICB3aGlsZSAoIXRlc3QoIj4i
KSkgeworICAgICAgICAgICAgbGV0IGNvbnN0ZXhwciA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3Bl
KCgpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAg
ICAgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAg
ICAgICAgICBhc3NlcnROZXh0KCIsIiwgIj4iLCAiPj4iKTsKKyAgICAgICAgICAgICAgICByZXR1
cm4gbmV3IENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIodHlwZS5vcmlnaW4sIG5hbWUsIHR5cGUpOwor
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoY29uc3RleHByKQorICAgICAgICAgICAg
ICAgIHJlc3VsdC5wdXNoKGNvbnN0ZXhwcik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAg
ICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAg
ICAgICAgbGV0IHByb3RvY29sID0gdHJ5Q29uc3VtZSgiOiIpID8gcGFyc2VQcm90b2NvbFJlZigp
IDogbnVsbDsKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaChuZXcgVHlwZVZhcmlhYmxlKG5h
bWUub3JpZ2luLCBuYW1lLnRleHQsIHByb3RvY29sKSk7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBjb25zdW1lRW5kT2ZUeXBlQXJncygpOworICAgICAgICByZXR1cm4gcmVz
dWx0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVEZWYoKQorICAgIHsKKyAg
ICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInR5cGUiKS5vcmlnaW47CisgICAgICAgIGxldCBu
YW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKS50ZXh0OworICAgICAgICBsZXQgdHlwZVBh
cmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgIGNvbnN1bWUoIj0iKTsK
KyAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgY29uc3VtZSgiOyIpOwor
ICAgICAgICByZXR1cm4gbmV3IFR5cGVEZWYob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywg
dHlwZSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRGVyZWZlcmVuY2UoKQorICAg
IHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoIl4iKS5vcmlnaW47CisgICAgICAgIHJl
dHVybiBuZXcgRGVyZWZlcmVuY2Uob3JpZ2luLCBwYXJzZUV4cHJlc3Npb24oKSk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIGdlbmVyaWNQYXJzZUxlZnQodGV4dHMsIG5leHRQYXJzZXIsIGNv
bnN0cnVjdG9yKQorICAgIHsKKyAgICAgICAgbGV0IGxlZnQgPSBuZXh0UGFyc2VyKCk7CisgICAg
ICAgIGxldCB0b2tlbjsKKyAgICAgICAgd2hpbGUgKHRva2VuID0gdHJ5Q29uc3VtZSguLi50ZXh0
cykpCisgICAgICAgICAgICBsZWZ0ID0gY29uc3RydWN0b3IodG9rZW4sIGxlZnQsIG5leHRQYXJz
ZXIoKSk7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZUxlZnRPcGVyYXRvckNhbGwodGV4dHMsIG5leHRQYXJzZXIpCisgICAgeworICAgICAgICBy
ZXR1cm4gZ2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAgICAgIHRleHRzLCBuZXh0UGFyc2VyLAor
ICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkgPT4KKyAgICAgICAgICAgICAgICBuZXcg
Q2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3IiICsgdG9rZW4udGV4dCwgW10s
IFtsZWZ0LCByaWdodF0pKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJs
ZVByZWZpeCgpCisgICAgeworICAgICAgICAvLyBGSVhNRQorICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVBvc3NpYmxlUHJvZHVjdCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VM
ZWZ0T3BlcmF0b3JDYWxsKFsiKiIsICIvIiwgIiUiXSwgcGFyc2VQb3NzaWJsZVByZWZpeCk7Cisg
ICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVTdW0oKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIisiLCAiLSJdLCBwYXJzZVBvc3NpYmxl
UHJvZHVjdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVTaGlmdCgp
CisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiPDwiLCAiPj4i
XSwgcGFyc2VQb3NzaWJsZVN1bSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9z
c2libGVSZWxhdGlvbmFsSW5lcXVhbGl0eSgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VM
ZWZ0T3BlcmF0b3JDYWxsKFsiPCIsICI+IiwgIjw9IiwgIj0+Il0sIHBhcnNlUG9zc2libGVTaGlm
dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVSZWxhdGlvbmFsRXF1
YWxpdHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNQYXJzZUxlZnQoCisgICAgICAg
ICAgICBbIj09IiwgIiE9Il0sIHBhcnNlUG9zc2libGVSZWxhdGlvbmFsSW5lcXVhbGl0eSwKKyAg
ICAgICAgICAgICh0b2tlbiwgbGVmdCwgcmlnaHQpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQg
cmVzdWx0ID0gbmV3IENhbGxFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgIm9wZXJhdG9yPT0iLCBb
XSwgW2xlZnQsIHJpZ2h0XSk7CisgICAgICAgICAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIiE9
IikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENhbGxFeHByZXNzaW9uKHRva2Vu
Lm9yaWdpbiwgIm9wZXJhdG9yISIsIFtdLCBbcmVzdWx0XSk7CisgICAgICAgICAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZVBvc3NpYmxlQml0d2lzZUFuZCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0
T3BlcmF0b3JDYWxsKFsiJiJdLCBwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEVxdWFsaXR5KTsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VYb3IoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIl4iXSwgcGFyc2VQb3NzaWJs
ZUJpdHdpc2VBbmQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlQml0
d2lzZU9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyJ8
Il0sIHBhcnNlUG9zc2libGVCaXR3aXNlWG9yKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
cGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24odGV4dHMsIG5leHRQYXJzZXIpCisgICAgeworICAg
ICAgICByZXR1cm4gZ2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAgICAgIHRleHRzLCBuZXh0UGFy
c2VyLAorICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkgPT4gbmV3IExvZ2ljYWxFeHBy
ZXNzaW9uKHRva2VuLm9yaWdpbiwgdG9rZW4udGV4dCwgbGVmdCwgcmlnaHQpKTsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUxvZ2ljYWxBbmQoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHBhcnNlTGVmdExvZ2ljYWxFeHByZXNzaW9uKFsiJiYiXSwgcGFyc2VQb3NzaWJs
ZUJpdHdpc2VPcik7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVMb2dp
Y2FsT3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdExvZ2ljYWxFeHByZXNzaW9u
KFsifHwiXSwgcGFyc2VQb3NzaWJsZUxvZ2ljYWxBbmQpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVBvc3NpYmxlVGVybmFyeUNvbmRpdGlvbmFsKCkKKyAgICB7CisgICAgICAgIGxl
dCBwcmVkaWNhdGUgPSBwYXJzZVBvc3NpYmxlTG9naWNhbE9yKCk7CisgICAgICAgIGxldCBvcGVy
YXRvciA9IHRyeUNvbnN1bWUoIj8iKTsKKyAgICAgICAgaWYgKCFvcGVyYXRvcikKKyAgICAgICAg
ICAgIHJldHVybiBwcmVkaWNhdGU7CisgICAgICAgIHJldHVybiBuZXcgVGVybmFyeUV4cHJlc3Np
b24ob3BlcmF0b3Iub3JpZ2luLCBwcmVkaWNhdGUsIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KCks
IHBhcnNlUG9zc2libGVBc3NpZ25tZW50KCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZVBvc3NpYmxlQXNzaWdubWVudChtb2RlKQorICAgIHsKKyAgICAgICAgbGV0IGxocyA9IHBh
cnNlUG9zc2libGVUZXJuYXJ5Q29uZGl0aW9uYWwoKTsKKyAgICAgICAgbGV0IG9wZXJhdG9yID0g
dHJ5Q29uc3VtZSgiPSIsICIrPSIsICItPSIsICIqPSIsICIvPSIsICIlPSIsICJePSIsICJ8PSIs
ICImPSIpOworICAgICAgICBpZiAoIW9wZXJhdG9yKSB7CisgICAgICAgICAgICBpZiAobW9kZSA9
PSAicmVxdWlyZWQiKQorICAgICAgICAgICAgICAgIGxleGVyLmZhaWwoIkV4cGVjdGVkIGFzc2ln
bm1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBsaHM7CisgICAgICAgIH0KKyAgICAgICAgaWYg
KG9wZXJhdG9yLnRleHQgPT0gIj0iKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3NpZ25tZW50
KG9wZXJhdG9yLm9yaWdpbiwgbGhzLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpKTsKKyAgICAg
ICAgb3BlcmF0b3IgPSBvcGVyYXRvci50ZXh0LnN1YnN0cmluZygwLCB0ZXJtLm9wZXJhdG9yLmxl
bmd0aCAtIDEpOworICAgICAgICByZXR1cm4gbmV3IENhbGxBc3NpZ25tZW50KGxocy5vcmlnaW4s
ICJvcGVyYXRvciIgKyBvcGVyYXRvciwgbGhzLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VBc3NpZ25tZW50KCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgicmVxdWlyZWQiKTsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKCkKKyAgICB7CisgICAg
ICAgIGxldCBhc3NpZ25tZW50ID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1
cm4gcGFyc2VBc3NpZ25tZW50KCk7IH0pOworICAgICAgICBpZiAoYXNzaWdubWVudCkKKyAgICAg
ICAgICAgIHJldHVybiBhc3NpZ25tZW50OworICAgICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVz
c2lvbigpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmljUGFyc2VDb21tYUV4cHJl
c3Npb24oZmluYWxFeHByZXNzaW9uUGFyc2VyKQorICAgIHsKKyAgICAgICAgbGV0IGxpc3QgPSBb
XTsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKCFvcmln
aW4pCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Cisg
ICAgICAgIG9yaWdpbiA9IG9yaWdpbi5vcmlnaW47CisgICAgICAgIGZvciAoOzspIHsKKyAgICAg
ICAgICAgIGxldCBlZmZlY3RmdWxFeHByZXNzaW9uID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUo
KCkgPT4geyByZXR1cm4gcGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKCk7IH0pOworICAgICAgICAg
ICAgaWYgKCFlZmZlY3RmdWxFeHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgbGlzdC5wdXNo
KGZpbmFsRXhwcmVzc2lvblBhcnNlcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QucHVzaChlZmZlY3RmdWxFeHByZXNzaW9uKTsKKyAg
ICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQ29tbWFFeHByZXNzaW9uKG9yaWdpbiwgbGlz
dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQ29tbWFFeHByZXNzaW9uKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBnZW5lcmljUGFyc2VDb21tYUV4cHJlc3Npb24ocGFyc2VQb3Nz
aWJsZUFzc2lnbm1lbnQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUV4cHJlc3Np
b24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ29tbWFFeHByZXNzaW9uKCk7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQXNzaWdubWVudFN0YXRlbWVudCgpCisgICAgewor
ICAgICAgICBsZXQgcmVzdWx0ID0gZ2VuZXJpY1BhcnNlQ29tbWFFeHByZXNzaW9uKHBhcnNlRWZm
ZWN0ZnVsRXhwcmVzc2lvbik7CisgICAgICAgIGNvbnN1bWUoIjsiKTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VSZXR1cm4oKQorICAgIHsK
KyAgICAgICAgY29uc3VtZSgicmV0dXJuIik7CisgICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Np
b24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnQoKQorICAgIHsK
KyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAodG9rZW4udGV4
dCA9PSAiOyIpIHsKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJldHVy
biBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJyZXR1cm4iKQor
ICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmV0dXJuKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0
ID09ICJicmVhayIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VCcmVhaygpOworICAgICAgICBp
ZiAodG9rZW4udGV4dCA9PSAiY29udGludWUiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29u
dGludWUoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIndoaWxlIikKKyAgICAgICAgICAg
IHJldHVybiBwYXJzZVdoaWxlKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJkbyIpCisg
ICAgICAgICAgICByZXR1cm4gcGFyc2VEbygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAi
Zm9yIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUZvcigpOworICAgICAgICBsZXQgY29tbWFF
eHByZXNzaW9uID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFyc2VB
c3NpZ25tZW50U3RhdGVtZW50KCk7IH0pOworICAgICAgICBpZiAoY29tbWFFeHByZXNzaW9uKQor
ICAgICAgICAgICAgcmV0dXJuIGNvbW1hRXhwcmVzc2lvbjsKKyAgICAgICAgcmV0dXJuIHBhcnNl
VmFyaWFibGVEZWNsKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQmxvY2soKQor
ICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInsiKS5vcmlnaW47CisgICAgICAg
IGxldCBibG9jayA9IG5ldyBCbG9jayhvcmlnaW4pOworICAgICAgICB3aGlsZSAoIXRlc3QoIn0i
KSkgeworICAgICAgICAgICAgbGV0IHN0YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CisgICAg
ICAgICAgICBpZiAoc3RhdGVtZW50KQorICAgICAgICAgICAgICAgIGJsb2NrLnB1c2goc3RhdGVt
ZW50KTsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lKCJ9Iik7CisgICAgICAgIHJldHVybiBi
bG9jazsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VGdW5jdGlvbkRlZigpCisgICAg
eworICAgICAgICBsZXQgcmV0dXJuVHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAgICBsZXQgbmFt
ZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIikudGV4dDsKKyAgICAgICAgbGV0IHR5cGVQYXJh
bWV0ZXJzID0gcGFyc2VUeXBlUGFyYW1ldGVycygpOworICAgICAgICBjb25zdW1lKCIoIik7Cisg
ICAgICAgIGxldCBwYXJhbWV0ZXJzID0gW107CisgICAgICAgIHdoaWxlICghdGVzdCgiKSIpKSB7
CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2gocGFyc2VQYXJhbWV0ZXIoKSk7CisgICAgICAg
ICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgfQorICAgICAgICBjb25zdW1lKCIpIik7CisgICAgICAgIGxldCBibG9jayA9IHBhcnNlQmxv
Y2soKTsKKyAgICAgICAgcmV0dXJuIEZ1bmN0aW9uRGVmKHJldHVyblR5cGUub3JpZ2luLCBuYW1l
LCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycywgYm9keSk7CisgICAgfQor
ICAgIAorICAgIGZvciAoOzspIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOwor
ICAgICAgICBpZiAoIXRva2VuKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBpZiAodG9r
ZW4udGV4dCA9PSAiOyIpCisgICAgICAgICAgICBsZXhlci5uZXh0KCk7CisgICAgICAgIGVsc2Ug
aWYgKHRva2VuLnRleHQgPT0gInR5cGUiKQorICAgICAgICAgICAgcGFyc2VUeXBlRGVmKCk7Cisg
ICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gIm5hdGl2ZSIpCisgICAgICAgICAgICBwYXJz
ZU5hdGl2ZVR5cGUoKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAic3RydWN0IikK
KyAgICAgICAgICAgIHBhcnNlU3RydWN0VHlwZSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50
ZXh0ID09ICJlbnVtIikKKyAgICAgICAgICAgIHBhcnNlRW51bSgpOworICAgICAgICBlbHNlIGlm
ICh0b2tlbi50ZXh0ID09ICJwcm90b2NvbCIpCisgICAgICAgICAgICBwYXJzZVByb3RvY29sRGVj
bCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJzZUZ1bmN0aW9uRGVmKCk7CisgICAg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvUHJvZ3JhbS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDExOSBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBQcm9ncmFtIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsK
KyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzID0gW107CisgICAgICAgIHRoaXMuX2Z1
bmN0aW9ucyA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fdHlwZXMgPSBuZXcgTWFwKCk7Cisg
ICAgfQorICAgIAorICAgIGdldCB0b3BMZXZlbFN0YXRlbWVudHMoKSB7IHJldHVybiB0aGlzLl90
b3BMZXZlbFN0YXRlbWVudHM7IH0KKyAgICBnZXQgZnVuY3Rpb25zKCkgeyByZXR1cm4gdGhpcy5f
ZnVuY3Rpb25zOyB9CisgICAgZ2V0IHR5cGVzKCkgeyByZXR1cm4gdGhpcy5fdHlwZXM7IH0KKyAg
ICAKKyAgICBhZGRUb3BMZXZlbFN0YXRlbWVudChzdGF0ZW1lbnQpCisgICAgeworICAgICAgICBz
dGF0ZW1lbnQucHJvZ3JhbSA9IHRoaXM7CisgICAgICAgIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2Vv
ZiBGdW5jdGlvbikgeworICAgICAgICAgICAgbGV0IGFycmF5ID0gdGhpcy5fZnVuY3Rpb25zLmdl
dChzdGF0ZW1lbnQubmFtZSk7CisgICAgICAgICAgICBpZiAoIWFycmF5KQorICAgICAgICAgICAg
ICAgIHRoaXMuX2Z1bmN0aW9ucy5zZXQoc3RhdGVtZW50Lm5hbWUsIGFycmF5ID0gW10pOworICAg
ICAgICAgICAgYXJyYXkucHVzaChzdGF0ZW1lbnQpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRl
bWVudCBpbnN0YW5jZW9mIFR5cGUpCisgICAgICAgICAgICB0aGlzLl90eXBlcy5zZXQoc3RhdGVt
ZW50Lm5hbWUsIHN0YXRlbWVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5l
dyBFcnJvcigiU3RhdGVtZW50IGlzIG5vdCBhIGZ1bmN0aW9uIG9yIHR5cGU6ICIgKyBzdGF0ZW1l
bnQpOworICAgICAgICB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpOwor
ICAgIH0KKyAgICAKKyAgICByZXNvbHZlRnVuY3Rpb25PdmVybG9hZChuYW1lLCB0eXBlQXJndW1l
bnRzLCBhcmd1bWVudFR5cGVzKQorICAgIHsKKyAgICAgICAgbGV0IGZ1bmN0aW9ucyA9IHRoaXMu
ZnVuY3Rpb25zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisgICAgICAgICAg
ICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0IHBodW5jdGlvbiBvZiBm
dW5jdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAmJiB0eXBl
QXJndW1lbnRzLmxlbmd0aCAhPSBwaHVuY3Rpb24udHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50VHlwZXMubGVu
Z3RoICE9IHBodW5jdGlvbi5wYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRp
b25Db250ZXh0KHBodW5jdGlvbi50eXBlUGFyYW1ldGVycyk7CisgICAgICAgICAgICBsZXQgb2sg
PSB0cnVlOworICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxl
bmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgbGV0IGFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50
c1tpXTsKKyAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyID0gcGh1bmN0aW9uLnR5cGVQYXJh
bWV0ZXJzW2ldOworICAgICAgICAgICAgICAgIGlmICgoYXJndW1lbnQgaW5zdGFuY2VvZiBUeXBl
KSAhPSAocGFyYW1ldGVyIGluc3RhbmNlb2YgVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAg
b2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgICAgIGlmICghYXJndW1lbnQudW5pZnkodW5pZmljYXRpb25Db250ZXh0
LCBwYXJhbWV0ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICBmb3IgKGxldCBpID0gMDsgaSA8IGFyZ3VtZW50VHlwZXMubGVuZ3RoOyArK2kpIHsKKyAgICAg
ICAgICAgICAgICBpZiAoIWFyZ3VtZW50VHlwZXNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0
LCBwaHVuY3Rpb24ucGFyYW1ldGVyc1tpXS50eXBlKSkgeworICAgICAgICAgICAgICAgICAgICBv
ayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBsZXQgc2hvdWxkQnVpbGRUeXBl
QXJndW1lbnRzID0gIXR5cGVBcmd1bWVudHMubGVuZ3RoOworICAgICAgICAgICAgaWYgKHNob3Vs
ZEJ1aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzID0gW107
CisgICAgICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHBodW5jdGlvbi50eXBlUGFy
YW1ldGVycykgeworICAgICAgICAgICAgICAgIGxldCB0eXBlQXJndW1lbnQgPSB1bmlmaWNhdGlv
bkNvbnRleHQuZmluZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUFy
Z3VtZW50ID09IHR5cGVQYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgICAgIGlmIChzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICAgICAg
ICAgIHR5cGVBcmd1bWVudHMucHVzaCh0eXBlQXJndW1lbnQpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
IHJldHVybiB7cGh1bmN0aW9uLCB1bmlmaWNhdGlvbkNvbnRleHQsIHR5cGVBcmd1bWVudHN9Owor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgTmFt
ZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIHRoaXMudG9wTGV2ZWxT
dGF0ZW1lbnRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChzdGF0ZW1lbnQpOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9j
b2wuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2NvbCBleHRlbmRzIE5vZGUgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAgIGdl
dCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0
dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIFByb3RvY29sOyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAg
ICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2NvbERlY2wgZXh0ZW5kcyBQcm90b2NvbCB7Cisg
ICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2lu
LCBuYW1lKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzID0gW107CisgICAgICAgIHRoaXMuX3Np
Z25hdHVyZU1hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fdHlwZVZhcmlhYmxlID0gbmV3
IFR5cGVWYXJpYWJsZShvcmlnaW4sIG5hbWUsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBhZGRT
aWduYXR1cmUoc2lnbmF0dXJlKQorICAgIHsKKyAgICAgICAgLy8gTk9URTogQW55IHR5cGUgcGFy
YW1ldGVycyBmb3VuZCBpbiB0aGUgc2lnbmF0dXJlIG11c3QgYmUgaW5mZXJhYmxlIGZyb20gdGhl
IHZhbHVlCisgICAgICAgIC8vIHBhcmFtZXRlcnMuCisgICAgICAgIC8vIEZJWE1FOiBDaGVjayB0
aGlzISAoT09QUyEpCisgICAgICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChzaWduYXR1cmUpOwor
ICAgICAgICBsZXQgb3ZlcmxvYWRzID0gdGhpcy5fc2lnbmF0dXJlTWFwLmdldChzaWduYXR1cmUu
bmFtZSk7CisgICAgICAgIGlmICghb3ZlcmxvYWRzKQorICAgICAgICAgICAgdGhpcy5fc2lnbmF0
dXJlTWFwLnNldChzaWduYXR1cmUubmFtZSwgb3ZlcmxvYWRzID0gW10pOworICAgICAgICBvdmVy
bG9hZHMucHVzaChzaWduYXR1cmUpOworICAgIH0KKyAgICAKKyAgICBnZXQgc2lnbmF0dXJlcygp
IHsgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZXM7IH0KKyAgICBzaWduYXR1cmVzQnlOYW1lKG5hbWUp
IHsgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQobmFtZSk7IH0KKyAgICBnZXQgdHlwZVZh
cmlhYmxlKCkgeyByZXR1cm4gdGhpcy5fdHlwZVZhcmlhYmxlOyB9CisgICAgCisgICAgaW5oZXJp
dHMob3RoZXJQcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghb3RoZXJQcm90b2NvbCkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyUHJvdG9j
b2wgaW5zdGFuY2VvZiBQcm90b2NvbFJlZikKKyAgICAgICAgICAgIG90aGVyUHJvdG9jb2wgPSBv
dGhlclByb3RvY29sLnByb3RvY29sRGVjbDsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0IG90
aGVyU2lnbmF0dXJlIG9mIG90aGVyUHJvdG9jb2wuc2lnbmF0dXJlcykgeworICAgICAgICAgICAg
bGV0IHNpZ25hdHVyZXMgPSB0aGlzLnNpZ25hdHVyZXNCeU5hbWUob3RoZXJTaWduYXR1cmUubmFt
ZSk7CisgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3Ig
KGxldCBzaWduYXR1cmUgOiBzaWduYXR1cmVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25h
dHVyZS5wYXJhbWV0ZXJzLmxlbmd0aCAhPSBvdGhlclNpZ25hdHVyZS5wYXJhbWV0ZXJzLmxlbmd0
aCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAg
ICAgICAgICAgICAgbGV0IHR5cGVQYXJhbWV0ZXJzID0gc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJz
LmNvbmNhdCh0aGlzLnR5cGVWYXJpYWJsZSk7CisgICAgICAgICAgICAgICAgbGV0IHVuaWZpY2F0
aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQodHlwZVBhcmFtZXRlcnMpOworICAg
ICAgICAgICAgICAgIGxldCBvayA9IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9
IDA7IGkgPCBzaWduYXR1cmUucGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAg
ICAgICAgICBpZiAoIXNpZ25hdHVyZS5wYXJhbWV0ZXJzW2ldLnR5cGUudW5pZnkob3RoZXJTaWdu
YXR1cmUucGFyYW1ldGVyc1tpXS50eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sg
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb2spCisgICAg
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmICh1bmlmaWNhdGlv
bkNvbnRleHQudmVyaWZ5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGVk
UmV0dXJuVHlwZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUucmV0dXJuVHlw
ZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0
eXBlUGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAg
aWYgKCFzdWJzdGl0dXRlZFJldHVyblR5cGUuZXF1YWxzKG90aGVyU2lnbmF0dXJlLnJldHVyblR5
cGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICBpZiAoIWZvdW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaGFzSGVpcih0eXBlKQor
ICAgIHsKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5tYXBwaW5nKFt0
aGlzLl90eXBlVmFyaWFibGVdLCBbdHlwZV0pOworICAgICAgICBmb3IgKGxldCBhYnN0cmFjdFNp
Z25hdHVyZSBvZiB0aGlzLl9zaWduYXR1cmVzKSB7CisgICAgICAgICAgICBsZXQgc2lnbmF0dXJl
ID0gc2lnbmF0dXJlLnZpc2l0KHN1YnN0aXR1dGlvbik7CisgICAgICAgICAgICBsZXQgb3Zlcmxv
YWQgPSB0aGlzLnByb2dyYW0ucmVzb2x2ZUZ1bmN0aW9uT3ZlcmxvYWQoc2lnbmF0dXJlLm5hbWUs
IFtdLCBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAgICAgICAgaWYgKCFvdmVybG9h
ZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAg
ICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPSBvdmVybG9hZC5waHVuY3Rpb24ucmV0dXJu
VHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICBvdmVybG9hZC5w
aHVuY3Rpb24udHlwZVBhcmFtZXRlcnMsIG92ZXJsb2FkLnVuaWZpY2F0aW9uQ29udGV4dCk7Cisg
ICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGVkUmV0dXJuVHlwZS5lcXVhbHMoc2lnbmF0dXJlLnJl
dHVyblR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuICJwcm90b2NvbCAiICsgdGhpcy5uYW1lICsgIiB7ICIgKyB0aGlzLnNpZ25h
dHVyZXMuam9pbigiOyAiKSArICI7IH0iOworICAgIH0KK30KKworCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9Qcm90b2NvbFJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Q
cm90b2NvbFJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2Nv
bFJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb3Rv
Y29sUmVmIGV4dGVuZHMgUHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkK
KyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbmFtZSk7CisgICAgICAgIHRoaXMucHJvdG9j
b2xEZWNsID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgaW5oZXJpdHMob3RoZXIpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbERlY2wuaW5oZXJpdHMob3RoZXIpOworICAgIH0K
KyAgICAKKyAgICBoYXNIZWlyKHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5wcm90
b2NvbERlY2wuaGFzSGVpcih0eXBlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9QdHJUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFB0clR5cGUgZXh0ZW5kcyBSZWZlcmVu
Y2VUeXBlIHsKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5hZGRy
ZXNzU3BhY2UgKyAiICIgKyB0aGlzLmVsZW1lbnRUeXBlICsgIl4iOworICAgIH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBSZWZlcmVuY2VUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCBhZGRyZXNzU3BhY2UsIGVsZW1lbnRUeXBlKQorICAgIHsKKyAgICAgICAgdmFs
aWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0g
b3JpZ2luOworICAgICAgICB0aGlzLl9hZGRyZXNzU3BhY2UgPSBhZGRyZXNzU3BhY2U7CisgICAg
ICAgIHRoaXMuX2VsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgfQorICAgIAorICAgIGdl
dCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgYWRkcmVzc1NwYWNl
KCkgeyByZXR1cm4gdGhpcy5fYWRkcmVzc1NwYWNlOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkg
eyByZXR1cm4gdGhpcy5fZWxlbWVudFR5cGU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJl
dHVybiBmYWxzZTsgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90
aGVyKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IgIT0gb3RoZXIuY29uc3Ry
dWN0b3IpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLmVs
ZW1lbnRUeXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9SZXR1cm4uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBSZXR1cm4gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHZh
bHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlz
Ll92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4g
dGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0K
KyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInsgIiArIHRoaXMu
c3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0KK307CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1Jld3JpdGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1Jld3JpdGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jld3JpdGVy
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJld3JpdGVy
IHsKKyAgICB2aXNpdEZ1bmN0aW9uKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1
bmN0aW9uKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnJldHVyblR5cGUudmlzaXQodGhp
cyksCisgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFybWV0ZXIgPT4g
dHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMu
bWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRGdW5jdGlvblBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5l
dyBGdW5jdGlvbkFyZ3VtZW50KG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3Vs
dCA9IG5ldyBCbG9jayhub2RlLm9yaWdpbik7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBv
ZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICByZXN1bHQuYWRkKHN0YXRlbWVudC52aXNp
dCh0aGlzKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0
UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBu
ZXcgVHlwZVJlZihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMubWFw
KHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpKTsKKyAgICAgICAgcmVz
dWx0LnR5cGUgPSBub2RlLnR5cGU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAg
IAorICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9k
ZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUpCisg
ICAgeworICAgICAgICByZXR1cm4gbmV3IENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZS5vcmln
aW4sIG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRGaWVsZChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZChub2RlLm9y
aWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgbm9k
ZS5jb25zdHJ1Y3Rvcihub2RlLnJvZ2lpbiwgbm9kZS5hZGRyZXNzU3BhY2UsIG5vZGUuZWxlbWVu
dFR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRBcnJheVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlUeXBlKG5v
ZGUub3JpZ2luLCBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFzc2ln
bm1lbnQobm9kZS5vcmlnaW4sIG5vZGUubGhzLnZpc2l0KHRoaXMpLCBub2RlLnJocy52aXNpdCh0
aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4obm9kZS5vcmlnaW4sIG5vZGUudmFsdWUg
PyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAgIAorICAgIHZpc2l0
SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisg
ICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBD
YWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgIG5vZGUub3JpZ2luLCBub2RlLm5hbWUsCisgICAg
ICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1l
bnQudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5hcmd1bWVudGxpc3QubWFwKGFyZ3Vt
ZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1N0cnVjdFR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0
VHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN0cnVj
dFR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVQ
YXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAg
ICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBl
UGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fZmllbGRzID0gbmV3IE1hcCgpOworICAgIH0KKyAg
ICAKKyAgICBhZGQoZmllbGQpCisgICAgeworICAgICAgICBpZiAodGhpcy5fZmllbGRzLmhhcyhm
aWVsZC5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihmaWVsZC5vcmln
aW4ubGluZU51bWJlciwgIkR1cGxpY2F0ZSBmaWVsZCBuYW1lOiAiICsgZmllbGQubmFtZSk7Cisg
ICAgICAgIHRoaXMuX2ZpZWxkcy5zZXQoZmllbGQubmFtZSwgZmllbGQpOworICAgIH0KKyAgICAK
KyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFt
ZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAgIGdldCBm
aWVsZE5hbWVzKCkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmtleXMoKTsgfQorICAgIGZpZWxkQnlO
YW1lKG5hbWUpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy5nZXQobmFtZSk7IH0KKyAgICBnZXQgZmll
bGRzKCkgeyByZXR1cm4gdGhpcy5fZmllbGRzLnZhbHVlcygpOyB9CisgICAgZ2V0IGZpZWxkTWFw
KCkgeyByZXR1cm4gdGhpcy5fZmllbGRzOyB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAg
Zm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiB0aGlzLnR5cGVQYXJhbWV0ZXJzKQorICAgIH0KKyAg
ICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5
cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5saW5lTnVtYmVyLCAiV3JvbmcgbnVt
YmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3RhbnRpYXRpb24iKTsKKyAgICAgICAgCisgICAg
ICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCgpOworICAgICAgICAKKyAgICAg
ICAgbGV0IHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5tYXBwaW5nKHRoaXMudHlwZVBhcmFt
ZXRlcnMsIHR5cGVBcmd1bWVudHMpOworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cnVjdFR5
cGUodGhpcy5vcmlnaW4sIHRoaXMubmFtZSwgW10pOworICAgICAgICBmb3IgKGxldCBmaWVsZCBv
ZiB0aGlzLmZpZWxkcykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoZmllbGQudmlzaXQoc3Vic3Rp
dHV0aW9uKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAic3RydWN0ICIgKyB0aGlzLm5hbWUgKyAiPCIg
KyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4geyAiICsgQXJyYXkuZnJvbSh0aGlzLmZpZWxkcyku
am9pbigiOyAiKSArICI7IH0iOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1
YnN0aXR1dGlvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRp
b24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgU3Vic3RpdHV0aW9u
IGV4dGVuZHMgUmV3cml0ZXIgeworICAgIGNvbnN0cnVjdG9yKG1hcCkKKyAgICB7CisgICAgICAg
IHRoaXMuX21hcCA9IG1hcDsKKyAgICB9CisgICAgCisgICAgc3RhdGljIG1hcHBpbmcocGFyYW1l
dGVycywgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3Ro
ICE9IGFyZ3VtZW50TGlzdC5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBh
cmFtZXRlcnMgYW5kIGFyZ3VtZW50cyBhcmUgbWlzbWF0Y2hlZCIpOworICAgICAgICBsZXQgbWFw
ID0gbmV3IE1hcCgpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVu
Z3RoOyArK2kpCisgICAgICAgICAgICBtYXAuc2V0KHBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50TGlz
dFtpXSk7CisgICAgICAgIHJldHVybiBuZXcgU3Vic3RpdHV0aW9uKG1hcCk7CisgICAgfQorICAg
IAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50
ID0gdGhpcy5fbWFwLmdldChub2RlLnR5cGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsK
KyAgICAgICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAg
ICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB0eXBlIGFyZ3VtZW50cyBvbiB0eXBlIHZh
cmlhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAgICAgIH0KKyAg
ICAgICAgCisgICAgICAgIHJldHVybiBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgfQor
CisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2Vt
ZW50ID0gdGhpcy5fbWFwLmdldChub2RlLnZhcmlhYmxlKTsKKyAgICAgICAgaWYgKHJlcGxhY2Vt
ZW50KQorICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICAKKyAgICAgICAg
cmV0dXJuIHN1cGVyLnZpc2l0VmFyaWFibGVSZWYobm9kZSk7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9UeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1R5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGUgZXh0ZW5kcyBOb2Rl
IHsKKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiBbXTsgfQorICAgIGdldCBraW5k
KCkgeyByZXR1cm4gVHlwZTsgfQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHByb3RvY29sLmhhc0hlaXIodGhpcyk7CisgICAgfQorICAgIAorICAg
IGdldCBpbnN0YW50aWF0ZWRUeXBlKCkgeyByZXR1cm4gdGhpczsgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1R5cGVEZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZi5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVEZWYgZXh0
ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJz
LCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0
aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFy
YW1ldGVyczsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdl
dCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0
dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlz
Ll90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvVHlwZVJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgwIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIFR5cGVSZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5h
bWUsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47
CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOwor
ICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgCisg
ICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkg
eyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4g
dGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHR5
cGUgPyB0eXBlLmlzUHJpbWl0aXZlIDogZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlh
dGVkVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlLmluc3RhbnRpYXRlKHR5
cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkKKyAgICB7Cisg
ICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVy
biB0aGlzLnR5cGUudW5pZnlOb2RlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAg
CisgICAgc2V0VHlwZUFuZEFyZ3VtZW50cyh0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fbmFtZSA9IHR5cGUubmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsK
KyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAg
IAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAg
ICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUeXBlUmVmKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBv
dGhlci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMu
dHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50
eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFy
Z3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNb
aV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVZhcmlhYmxlIGV4dGVuZHMgVHlwZSB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lLCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRoaXMuX29y
aWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMu
X3Byb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1
cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBwcm90b2NvbCgpIHsgcmV0dXJuIHRoaXMuX3Byb3Rv
Y29sOyB9CisgICAgCisgICAgZ2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLl9wcm90b2NvbCAmJiB0aGlzLl9wcm90b2NvbC5pc1ByaW1pdGl2ZTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIGlu
aGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgaWYgKCFwcm90b2NvbCkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHBy
b3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9u
Q29udGV4dC5maW5kKHRoaXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAgICAg
ICAgICAgIHJldHVybiByZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsK
KyAgICAgICAgCisgICAgICAgIHVuaWZpY2F0aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhlcik7
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVWYXJp
YWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgIH0KKyAgICAKKyAgICB2
ZXJpZnlBc0FyZ3VtZW50KHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGxldCBy
ZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICAKKyAgICAg
ICAgLy8gVGhlIHRoaW5nIHdlIGdldCB1bmlmaWVkIHdpdGggbXVzdCBiZSBhIHR5cGUgdmFyaWFi
bGUgdGhhdCBhY2NlcHRzIGEgYnJvYWRlciBzZXQgb2YKKyAgICAgICAgLy8gdGhpbmdzIHRoYW4g
d2UgZG8uCisgICAgICAgIGlmICghKHJlYWxUaGlzIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKCF0aGlzLnBy
b3RvY29sKQorICAgICAgICAgICAgcmV0dXJuICFyZWFsVGhpcy5wcm90b2NvbDsKKyAgICAgICAg
CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHJlYWxUaGlzLnByb3RvY29s
KTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0
KQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIHJldHVybiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKS5pbmhl
cml0cyh0aGlzLnByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTkg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgVW5pZmljYXRpb25Db250ZXh0IHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBl
UGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gbmV3IFNl
dCh0eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHRoaXMuX25leHRNYXAgPSBuZXcgTWFwKCk7Cisg
ICAgfQorICAgIAorICAgIHVuaW9uKGEsIGIpCisgICAgeworICAgICAgICBhID0gZmluZChhKTsK
KyAgICAgICAgYiA9IGZpbmQoYik7CisgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIAorICAgICAgICBpZiAoIWIuaXNVbmlmaWFibGUpCisgICAgICAgICAg
ICBbYSwgYl0gPSBbYiwgYV07CisgICAgICAgIGlmICghYS5pc1VuaWZpYWJsZSkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVuaWZ5IG5vbi11bmlmaWFibGUgdGhpbmdzICIg
KyBhICsgIiBhbmQgIiArIGIpOworICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQg
dHlwZSBwYXJhbWV0ZXJzIGRvbid0IGVuZCB1cCBiZWluZyByb290cy4KKyAgICAgICAgaWYgKGEu
aXNVbmlmaWFibGUgJiYgYi5pc1VuaWZpYWJsZSAmJiB0aGlzLl90eXBlUGFyYW1ldGVycy5oYXMo
YikpCisgICAgICAgICAgICBbYSwgYl0gPSBbYiwgYV07CisKKyAgICAgICAgdGhpcy5fbmV4dE1h
cC5zZXQoYSwgYik7CisgICAgfQorICAgIAorICAgIGZpbmQobm9kZSkKKyAgICB7CisgICAgICAg
IGxldCBjdXJyZW50Tm9kZSA9IG5vZGU7CisgICAgICAgIGxldCBuZXh0Tm9kZSA9IHRoaXMuX25l
eHRNYXAuZ2V0KGN1cnJlbnROb2RlKTsKKyAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAg
ICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAg
Y3VycmVudE5vZGUgPSBuZXh0Tm9kZTsKKyAgICAgICAgICAgIG5leHROb2RlID0gdGhpcy5fbmV4
dE1hcC5nZXQoY3VycmVudE5vZGUpOworICAgICAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLl9uZXh0TWFwLnNldChu
b2RlLCBjdXJyZW50Tm9kZSk7CisgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG5vZGVzKCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgU2V0
KCk7CisgICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9uZXh0TWFwKSB7Cisg
ICAgICAgICAgICByZXN1bHQuYWRkKGtleSk7CisgICAgICAgICAgICByZXN1bHQuYWRkKHZhbHVl
KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2
ZXJpZnkoKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiB0aGlzLl90
eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLnZlcmlmeUFz
UGFyYW1ldGVyKHRoaXMpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
fQorICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2YgdGhpcy5ub2RlcykgeworICAgICAg
ICAgICAgaWYgKHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhhcyh0eXBlQXJndW1lbnQpKQorICAgICAg
ICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnQudmVyaWZ5
QXNBcmd1bWVudCh0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlzVW51bmlmaWVkKCkK
KyAgICB7CisgICAgICAgIHJldHVybiAhdGhpcy5fbmV4dE1hcC5zaXplKCk7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9WYWx1ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9W
YWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhbHVl
IGV4dGVuZHMgTm9kZSB7CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBWYWx1ZTsgfQorICAgIGdl
dCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zh
cmlhYmxlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxl
UmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFyaWFi
bGVSZWYgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUp
CisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFt
ZTsKKyAgICAgICAgdGhpcy52YXJpYWJsZSA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBu
YW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0
dXJuIHRoaXMudmFyaWFibGUuaXNDb25zdGV4cHI7IH0KKyAgICBnZXQgdW5pZnlOb2RlKCkgeyBy
ZXR1cm4gdGhpcy52YXJpYWJsZS51bmlmeU5vZGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1Zpc2l0b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmlz
aXRvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZpc2l0b3IgeworICAg
IHZpc2l0UHJvZ3JhbShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9m
IG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uKG5vZGUpCisgICAgeworICAgICAg
ICBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJh
bWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIu
dmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRl
cnMpCisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAg
IHZpc2l0RnVuY3Rpb25QYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlwZS52
aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvbkRlZihub2RlKQorICAg
IHsKKyAgICAgICAgdmlzaXRGdW5jdGlvbihub2RlKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0
KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAg
ICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3Rh
dGVtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sUmVmKG5v
ZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAg
IHsKKyAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAg
ICAgICAgIHNpZ25hdHVyZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBl
UmVmKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50
eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAo
bGV0IHR5cGVQYXJhbXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlw
ZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5v
ZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBh
cmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAg
ICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0U3RydWN0VHlw
ZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5
cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAg
ICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52
aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAg
ICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQor
ICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0RWxlbWVudGFsVHlwZShub2RlKQorICAgIHsKKyAgICAgICAg
bm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJU
eXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAg
IHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFy
cmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9k
ZSk7CisgICAgICAgIG5vZGUubnVtRWxlbWVudHMudmlzaXQodGhpcyk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5saHMudmlzaXQo
dGhpcyk7CisgICAgICAgIG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVy
bihub2RlKQorICAgIHsKKyAgICAgICAgaWYgKG5vZGUudmFsdWUpCisgICAgICAgICAgICBub2Rl
LnZhbHVlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXN0SW50TGl0ZXJhbChub2Rl
KQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAg
IHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykK
KyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQg
YXJndW1lbnQgb2Ygbm9kZS5hcmd1bWVudExpc3QpCisgICAgICAgICAgICBhcmd1bWVudC52aXNp
dCh0aGlzKTsKKyAgICB9Cit9CisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319147</attachid>
            <date>2017-08-26 19:12:21 -0700</date>
            <delta_ts>2017-08-27 15:11:58 -0700</delta_ts>
            <desc>more parser</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>143756</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gdmFs
aWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAgIHN3aXRjaCAoYWRkcmVzc1Nw
YWNlKSB7CisgICAgY2FzZSAiY29uc3RhbnQiOgorICAgIGNhc2UgImRldmljZSI6CisgICAgY2Fz
ZSAidGhyZWFkZ3JvdXAiOgorICAgIGNhc2UgInRocmVhZCI6CisgICAgICAgIHJldHVybjsKKyAg
ICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBhZGRyZXNzIHNwYWNlOiAi
ICsgYWRkcmVzc1NwYWNlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9BcnJh
eVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlSZWZUeXBl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFycmF5UmVmVHlwZSBl
eHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FycmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1FbGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlw
ZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAg
CisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVt
ZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1l
bnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxlbWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUo
KSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9T
dHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0
aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2Vv
ZiBBcnJheVR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgaWYgKCF0aGlzLm51bUVsZW1lbnRzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIu
bnVtRWxlbWVudHMpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAKKyAgICAg
ICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci5lbGVtZW50VHlwZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Bc3Np
Z25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFzc2lnbm1lbnQgZXh0ZW5kcyBF
eHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0
aGlzLl9yaHMgPSByaHM7CisgICAgfQorICAgIAorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlz
Ll9saHM7IH0KKyAgICBnZXQgcmhzKCkgeyByZXR1cm4gdGhpcy5fcmhzOyB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsgIiA9ICIgKyB0aGlz
LnJoczsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIEJsb2NrIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9z
dGF0ZW1lbnRzID0gW107CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICBhZGQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAg
dGhpcy5fc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIGdldCBz
dGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fc3RhdGVtZW50czsgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAieyAiICsgdGhpcy5zdGF0ZW1lbnRzLmpvaW4o
IjsgIik7ICsgIjsgfSI7CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2Fs
bEFzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEFzc2ln
bm1lbnQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEFzc2lnbm1l
bnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDYWxsQXNz
aWdubWVudCBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFt
ZSwgbGhzLCByaHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlz
Ll9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0aGlzLl9y
aHMgPSByaHM7CisgICAgICAgIHRoaXMuZnVuYyA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdl
dCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBsaHMoKSB7IHJldHVybiB0
aGlzLl9saHM7IH0KKyAgICBnZXQgcmhzKCkgeyByZXR1cm4gdGhpcy5fcmhzOyB9IC8vIFRoaXMg
Y2FuIGJlIG51bGwuCisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMubGhzICsgIiAiICsgdGhpcy5uYW1lICsgKHRoaXMucmhzID8gIj0gIiArIHRoaXMucmhz
IDogIiIpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEV4cHJlc3Np
b24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEV4cHJlc3Npb24uanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEV4cHJlc3Npb24uanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDYWxsRXhwcmVzc2lvbiBl
eHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZUFy
Z3VtZW50cywgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAg
ICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0
eXBlQXJndW1lbnRzOworICAgICAgICB0aGlzLl9hcmd1bWVudExpc3QgPSBhcmd1bWVudExpc3Q7
CisgICAgICAgIHRoaXMuZnVuYyA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkg
eyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4g
dGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBhcmd1bWVudExpc3QoKSB7IHJldHVybiB0
aGlzLl9hcmd1bWVudExpc3Q7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlQXJndW1lbnRzICsgIj4oIiArIHRo
aXMuYXJndW1lbnRMaXN0ICsgIikiOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvQ2hlY2tlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DaGVja2VyLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2hlY2tlciBleHRlbmRzIFZpc2l0
b3IgeworICAgIC8vIEl0J3MgdG90YWxseSBPSyB0byBpbnN0YW50aWF0ZSB0aGlzIHdpdGggemVy
byBhcmd1bWVudHMgKGkuZS4gcGFzc2luZyB1bmRlZmluZWQgZm9yIGJvdGggb2YKKyAgICAvLyB0
aGVtKSBpZiB5b3UncmUgY3JlYXRpbmcgYSBDaGVja2VyIHRvIHZpc2l0IGEgUHJvZ3JhbS4KKyAg
ICBjb25zdHJ1Y3RvcihuYW1lQ29udGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWVDb250
ZXh0ID0gbmFtZUNvbnRleHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvZ3JhbShub2RlKQor
ICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25h
bWVDb250ZXh0KTsKKyAgICAgICAgbmFtZUNvbnRleHQucHJvZ3JhbSA9IG5vZGU7CisgICAgICAg
IG5hbWVDb250ZXh0LnJlY29nbml6ZUludHJpbnNpY3MoKTsKKyAgICAgICAgZm9yIChsZXQgc3Rh
dGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgbmFtZUNvbnRl
eHQuYWRkKHN0YXRlbWVudCk7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFt
ZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0
YXRlbWVudHMpCisgICAgICAgICAgICBuYW1lQ29udGV4dC5kb1N0YXRlbWVudCgoKSA9PiBzdGF0
ZW1lbnQudmlzaXQoY2hlY2tlcikpOworICAgIH0KKyAgICAKKyAgICBfdmlzaXRUeXBlUGFyYW1l
dGVyc0FuZEJ1aWxkTmFtZUNvbnRleHQobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29u
dGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAo
bGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAg
bmFtZUNvbnRleHQuYWRkKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICAgICAgdHlwZVBhcmFtZXRl
ci52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZUNvbnRleHQ7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNoZWNr
ZXIgPSBuZXcgQ2hlY2tlcih0aGlzLl92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29u
dGV4dChub2RlKSk7CisgICAgICAgIG5vZGUucmV0dXJuVHlwZS52aXNpdChjaGVja2VyKTsKKyAg
ICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykKKyAgICAgICAgICAg
IHBhcmFtZXRlci52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jRGVm
KG5vZGUpCisgICAgeworICAgICAgICBsZXQgY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyA9IHRo
aXMuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpOworICAgICAg
ICBsZXQgY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNvbnRleHRXaXRo
VHlwZVBhcmFtZXRlcnMpOworICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQoY2hlY2tlcldp
dGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIGxldCBjb250ZXh0V2l0aFBhcmFtZXRlcnMgPSBu
ZXcgTmFtZUNvbnRleHQoY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIGZvciAo
bGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRl
ci52aXNpdChjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIGNvbnRleHRX
aXRoUGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hl
Y2tlcldpdGhQYXJhbWV0ZXJzID0gbmV3IENoZWNrZXIoY29udGV4dFdpdGhQYXJhbWV0ZXJzKTsK
KyAgICAgICAgbm9kZS5ib2R5LnZpc2l0KGNoZWNrZXJXaXRoUGFyYW1ldGVycyk7CisgICAgfQor
ICAgIAorICAgIHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjaGVja2VyID0g
bmV3IENoZWNrZXIobmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KSk7CisgICAgICAg
IGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0
ZW1lbnQudmlzaXQoY2hlY2tlcik7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNs
KG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1
cmVzKSB7CisgICAgICAgICAgICBsZXQgc2V0ID0gbmV3IFNldCgpOworICAgICAgICAgICAgZnVu
Y3Rpb24gY29uc2lkZXIodGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYg
KHRoaW5nLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHRoaW5nKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXNzIE5vdGljZVR5cGVWYXJpYWJsZSBleHRl
bmRzIFZpc2l0b3IgeworICAgICAgICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgICAg
ICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc2lkZXIobm9kZS50eXBlKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQor
ICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc2lkZXIobm9kZS52YXJp
YWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0
IG5vdGljZVR5cGVWYXJpYWJsZSA9IG5ldyBOb3RpY2VUeXBlVmFyaWFibGUoKTsKKyAgICAgICAg
ICAgIGZvciAobGV0IHBhcmFtZXRlclR5cGUgb2Ygc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKQor
ICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGUudmlzaXQobm90aWNlVHlwZVZhcmlhYmxlKTsK
KyAgICAgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygc2lnbmF0dXJlLnR5cGVQYXJh
bWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzZXQuaGFzKHR5cGVQYXJhbWV0ZXIpKQor
ICAgICAgICAgICAgICAgICAgICB0aHJvdyBBTFR5cGVFcnJvcih0eXBlUGFyYW1ldGVyLm9yaWdp
bi5vcmlnaW5TdHJpbmcsICJUeXBlIHBhcmFtZXRlciB0byBwcm90b2NvbCBzaWduYXR1cmUgbm90
IGluZmVycmFibGUgZnJvbSB2YWx1ZSBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICB9CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4
dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250ZXh0LmFkZChub2RlLnR5cGVW
YXJpYWJsZSk7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFtZUNvbnRleHQp
OworICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAg
ICAgICAgc2lnbmF0dXJlLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5
cGVEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29u
dGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIg
b2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNp
dCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAg
ICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsK
KyAgICAgICAgbm9kZS50eXBlLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dFN0cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBO
YW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJh
bWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgdHlwZVBhcmFtZXRl
ci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVy
KTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250
ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAg
ICBmaWVsZC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgX3Jlc29sdmVUeXBlVmFy
aWFibGVBbWJpZ3VpdHkodHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IHR5
cGVBcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07CisgICAgICAgICAgICBpZiAoISh0eXBlQXJn
dW1lbnQgaW5zdGFuY2VvZiBUeXBlT3JWYXJpYWJsZVJlZikpCisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICBsZXQgdGhpbmcgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVHlw
ZU9yVmFsdWUsIHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAgICAgIGlmICghdGhpbmcpCisg
ICAgICAgICAgICAgICAgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywg
IkNvdWxkIG5vdCBmaW5kIHR5cGUgb3IgdmFyaWFibGUgbmFtZWQgIiArIHR5cGVBcmd1bWVudC5u
YW1lKTsKKyAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIFZhbHVlKQorICAgICAgICAg
ICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBWYXJpYWJsZVJlZih0eXBlQXJndW1lbnQub3Jp
Z2luLCB0eXBlQXJndW1lbnQubmFtZSk7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgdHlwZUFyZ3VtZW50W2ldID0gbmV3IFR5cGVSZWYodHlwZUFyZ3VtZW50Lm9yaWdpbiwgdHlw
ZUFyZ3VtZW50Lm5hbWUsIFtdKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBfY2hlY2tU
eXBlQXJndW1lbnRzKG9yaWdpbiwgdHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpCisgICAg
eworICAgICAgICBpZiAodHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IHR5cGVBcmd1bWVudHMubGVu
Z3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJp
bmcsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMiKTsKKyAgICAgICAgdGhpcy5fcmVz
b2x2ZVR5cGVWYXJpYWJsZUFtYmlndWl0eSh0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgZm9yIChs
ZXQgaSA9IDA7IGkgPCB0eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAg
bGV0IHBhcmFtZXRlcklzVHlwZSA9IHR5cGVQYXJhbWV0ZXJzW2ldIGluc3RhbmNlb2YgVHlwZVZh
cmlhYmxlOworICAgICAgICAgICAgbGV0IGFyZ3VtZW50SXNUeXBlID0gdHlwZUFyZ3VtZW50c1tp
XSBpbnN0YW5jZW9mIFR5cGU7CisgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdHlwZUFyZ3VtZW50
c1tpXS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJJc1R5cGUgJiYgIWFy
Z3VtZW50SXNUeXBlKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmln
aW4ub3JpZ2luU3RyaW5nLCAiRXhwZWN0ZWQgdHlwZSwgYnV0IGdvdCB2YWx1ZSBhdCBhcmd1bWVu
dCAjIiArIGkpOworICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJJc1R5cGUgJiYgYXJndW1lbnRJ
c1R5cGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmln
aW5TdHJpbmcsICJFeHBlY3RlZCB2YWx1ZSwgYnV0IGdvdCB0eXBlIGF0IGFyZ3VtZW50ICMiICsg
aSk7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRJc1R5cGUpIHsKKyAgICAgICAgICAgICAgICBp
ZiAoIXR5cGVBcmd1bWVudHNbaV0uaW5oZXJpdHModHlwZUFyZ3VtZW50c1tpXSkpCisgICAgICAg
ICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAi
VHlwZSBhcmd1bWVudCBkb2VzIG5vdCBpbmhlcml0IHByb3RvY29sIik7CisgICAgICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50c1tpXS5pc0NvbnN0RXhw
cikKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmln
aW5TdHJpbmcsICJFeHBlY3RlZCBjb25zdGV4cHIgdmFsdWUiKTsKKyAgICAgICAgICAgICAgICBp
ZiAoIXJlc3VsdC5lcXVhbHModHlwZVBhcmFtZXRlcnNbaV0udHlwZSkpCisgICAgICAgICAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiV3Jvbmcg
dHlwZSBmb3IgY29uc3RleHByIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cisg
ICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgdHlwZSA9IHRo
aXMuX25hbWVDb250ZXh0LmdldChUeXBlLCBub2RlLm5hbWUpOworICAgICAgICBpZiAoIXR5cGUp
CisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3Ry
aW5nLCAiQ291bGQgbm90IGZpbmQgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAg
aWYgKCF0aGlzLl9uYW1lQ29udGV4dC5pc0RlZmluZWQodHlwZSkpCisgICAgICAgICAgICB0aHJv
dyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiSWxsZWdhbCBmb3J3
YXJkIHVzZSBvZiB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBub2RlLnR5cGUg
PSB0eXBlOworICAgICAgICAKKyAgICAgICAgdGhpcy5fY2hlY2tUeXBlQXJndW1lbnRzKG5vZGUu
b3JpZ2luLCB0eXBlLnR5cGVQYXJhbWV0ZXJzLCBub2RlLnR5cGVBcmd1bWVudHMpOworICAgICAg
ICAKKyAgICAgICAgc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgICAgICAKKyAgICAgICAg
d2hpbGUgKG5vZGUudHlwZSBpbnN0YW5jZW9mIFR5cGVEZWYpIHsKKyAgICAgICAgICAgIGxldCB1
bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KG5vZGUudHlwZS50eXBl
UGFyYW1ldGVycyk7CisgICAgICAgICAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCAh
PSBub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigiYXJndW1lbnQvcGFyYW1ldGVyIG1pc21hdGNoIChzaG91bGQgaGF2ZSBiZWVu
IGNhdWdodCBlYXJsaWVyKSIpOworICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2Rl
LnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgbm9kZS50eXBlQXJn
dW1lbnRzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgbm9kZS50eXBlLnR5cGVQYXJhbWV0
ZXJzW2ldKTsKKyAgICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQor
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5T
dHJpbmcsICJUeXBlIHJlZmVyZW5jZSB0byBhIHR5cGUgZGVmaW5pdGlvbiB2aW9sYXRlcyBwcm90
b2NvbCBjb25zdHJhaW50cyIpOworICAgICAgICAgICAgCisgICAgICAgICAgICBub2RlLnNldFR5
cGVBbmRBcmd1bWVudHMobm9kZS50eXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKG5vZGUudHlw
ZS50eXBlUGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KSwgW10pOworICAgICAgICB9Cisg
ICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAg
bGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAg
ICAgICAgbmFtZUNvbnRleHQuZGVmaW5lQWxsKCk7CisgICAgICAgIG5vZGUuZWxlbWVudFR5cGUu
dmlzaXQobmV3IENoZWNrZXIobmFtZUNvbnRleHQpKTsKKyAgICAgICAgCisgICAgICAgIGlmIChu
b2RlLmFkZHJlc3NTcGFjZSA9PSAidGhyZWFkIikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAg
ICAgCisgICAgICAgIGNsYXNzIEluc3RhbnRpYXRlSW1tZWRpYXRlcyBleHRlbmRzIFJld3JpdGVy
IHsKKyAgICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgICAgICAgICAgeworICAgICAg
ICAgICAgICAgIG5vZGUgPSBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIG5vZGUuaW5zdGFudGlhdGVkVHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgICAgICAgICB7
CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIGlmICghbm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgSW5zdGFu
dGlhdGVJbW1lZGlhdGVzKCkpLmlzUHJpbWl0aXZlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFM
VHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIklsbGVnYWwgcG9pbnRlciB0byBu
b24tcHJpbWl0aXZlIHR5cGUiKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5v
ZGUpCisgICAgeworICAgICAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBs
aHMgaXMgYXNzaWduYWJsZS4KKyAgICAgICAgbGV0IGxoc1R5cGUgPSBub2RlLmxocy52aXNpdCh0
aGlzKTsKKyAgICAgICAgbGV0IHJoc1R5cGUgPSBub2RlLnJocy52aXNpdCh0aGlzKTsKKyAgICAg
ICAgaWYgKCFsaHNUeXBlLmVxdWFscyhyaHNUeXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBB
TFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUeXBlIG1pc21hdGNoIGluIGFz
c2lnbm1lbnQ6ICIgKyBsaHNUeXBlICsgIiB2ZXJzdXMgIiArIHJoc1R5cGUpOworICAgICAgICBy
ZXR1cm4gbGhzVHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQor
ICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX25hbWVDb250ZXh0LmdldChWYWx1ZSwg
bm9kZS5uYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICB0aHJvdyBuZXcg
QUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiQ291bGQgbm90IGZpbmQgdmFy
aWFibGUgbmFtZWQgIiArIG5vZGUubmFtZSk7CisgICAgICAgIG5vZGUudmFyaWFibGUgPSByZXN1
bHQ7CisgICAgICAgIG5vZGUuCisgICAgICAgIAorICAgICAgICByZXR1cm4gcmVzdWx0LnR5cGU7
CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICBpZiAo
bm9kZS52YWx1ZSkgeworICAgICAgICAgICAgbGV0IHJlc3VsdFR5cGUgPSBub2RlLnZhbHVlLnZp
c2l0KHRoaXMpOworICAgICAgICAgICAgaWYgKCF0aGlzLl9uYW1lQ29udGV4dC5jdXJyZW50U3Rh
dGVtZW50LnJldHVyblZhbHVlLmVxdWFscyhyZXN1bHRUeXBlKSkKKyAgICAgICAgICAgICAgICB0
aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHJ5aW5nIHRv
IHJldHVybiAiICsgcmVzdWx0VHlwZSArICIgaW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgIiAr
IHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUpOworICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIXRoaXMuX25h
bWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQucmV0dXJuVmFsdWUuZXF1YWxzKHRoaXMuX25hbWVD
b250ZXh0LmludHJpbnNpY3Mudm9pZCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJy
b3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiTm9uLXZvaWQgZnVuY3Rpb24gbXVzdCByZXR1
cm4gYSB2YWx1ZSIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEludExpdGVyYWwobm9kZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLl9uYW1lQ29udGV4dC5pbnRyaW5zaWNzLmludDMyOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAg
ICB0aGlzLl9yZXNvbHZlVHlwZVZhcmlhYmxlQW1iaWd1aXR5KG5vZGUudHlwZUFyZ3VtZW50cyk7
CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpIHsK
KyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIGlmICh0
eXBlQXJndW1lbnQgaW5zdGFuY2VvZiBWYWx1ZQorICAgICAgICAgICAgICAgICYmICF0eXBlQXJn
dW1lbnQuaXNDb25zdGV4cHIpCisgICAgICAgICAgICAgICAgdGhyb3cgQUxUeXBlRXJyb3Iobm9k
ZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRXhwZWN0ZWQgY29uc3RleHByIHZhbHVlIik7CisgICAg
ICAgIH0KKyAgICAgICAgbGV0IGFyZ3VtZW50VHlwZXMgPSBub2RlLmFyZ3VtZW50TGlzdC5tYXAo
YXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykpOworICAgICAgICBsZXQgb3ZlcmxvYWQg
PSB0aGlzLl9uYW1lQ29udGV4dC5wcm9ncmFtLnJlc29sdmVGdW5jT3ZlcmxvYWQoCisgICAgICAg
ICAgICBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAg
ICAgIGlmICghb3ZlcmxvYWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9k
ZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRGlkIG5vdCBmaW5kIGZ1bmN0aW9uIGZvciBjYWxsIik7
CisgICAgICAgIHJldHVybiBvdmVybG9hZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5p
ZmljYXRpb24oCisgICAgICAgICAgICBvdmVybG9hZC5mdW5jLnR5cGVQYXJhbWV0ZXJzLCBvdmVy
bG9hZC51bmlmaWNhdGlvbkNvbnRleHQpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0NvbW1hRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9D
b21tYUV4cHJlc3Npb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBDb21tYUV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGxpc3QpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0
aGlzLl9saXN0ID0gbGlzdDsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpc3QoKSB7IHJldHVybiB0
aGlzLl9saXN0OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
ICIoIiArIHRoaXMubGlzdC50b1N0cmluZygpICsgIikiOworICAgIH0KK307CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ29uc3RleHByVHlwZVBhcmFtZXRl
ciBleHRlbmRzIFZhbHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUpCisg
ICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUg
PSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0
aGlzLl90eXBlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAg
IGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUltcGwo
dW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBl
LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisKKyAgICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25Db250ZXh0LmZp
bmQodGhpcyk7CisgICAgICAgIGlmIChyZWFsVGhpcyAhPSB0aGlzKQorICAgICAgICAgICAgcmV0
dXJuIHJlYWxUaGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgICAgICAK
KyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVmFyaWFibGVSZWYpCisgICAgICAgICAgICBv
dGhlciA9IG90aGVyLnZhcmlhYmxlOworICAgICAgICAKKyAgICAgICAgdW5pZmljYXRpb25Db250
ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IAorICAgIHZlcmlmeUFzQXJndW1lbnQodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZp
Y2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsg
dGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lv
bi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVmFsdWUg
eworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29y
aWdpbjsgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvRmllbGQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBGaWVsZCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsK
KyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFt
ZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmln
aW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRo
aXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsg
dGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuYyBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVj
dG9yKG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKQorICAgIHsK
KyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSBy
ZXR1cm5UeXBlOworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJz
OworICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHJldHVyblR5cGUo
KSB7IHJldHVybiB0aGlzLl9yZXR1cm5UeXBlOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkg
eyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVycygpIHsg
cmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVyVHlwZXMoKSB7IHJl
dHVybiB0aGlzLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudHlwZSk7IH0K
KyAgICAKKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIEZ1bmM7IH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5UeXBlICsgIiAiICsgdGhpcy5u
YW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+KCIgKyB0aGlzLnBhcmFtZXRlcnMg
KyAiKSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkRlZi5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkRlZi5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkRlZi5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmNEZWYgZXh0ZW5kcyBGdW5jIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBw
YXJhbWV0ZXJzLCBib2R5KQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmV0dXJuVHlwZSwg
dHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmln
aW47CisgICAgICAgIHRoaXMuX2JvZHkgPSBib2R5OworICAgIH0KKyAgICAKKyAgICBnZXQgb3Jp
Z2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGJvZHkoKSB7IHJldHVybiB0
aGlzLl9ib2R5OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHN1cGVyLnRvU3RyaW5nKCkgKyAiIHsgIiArIGJvZHkgKyAiIH0iOworICAgIH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25QYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jUGFyYW1ldGVyIHsKKyAgICAvLyBUaGUgbmFt
ZSBpcyBvcHRpb25hbC4gSXQncyBPSyBmb3IgaXQgdG8gYmUgbnVsbCEKKyAgICBjb25zdHJ1Y3Rv
cihuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJu
IHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAg
ICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAi
ICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rp
b25TaWduYXR1cmUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25T
aWduYXR1cmUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25T
aWduYXR1cmUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL0ludExpdGVyYWwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
SW50TGl0ZXJhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IEludExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4s
IHZhbHVlKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fdmFs
dWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5f
dmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisg
ICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIiICsgdGhpcy5fdmFsdWU7Cisg
ICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNl
IHN0cmljdCI7CisKK2NsYXNzIEludHJpbnNpY3MgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7
CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0
KAorICAgICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSB2b2lkPD4iLAorICAgICAgICAg
ICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnZvaWQgPSB0eXBlOworICAgICAg
ICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUg
cHJpbWl0aXZlIHR5cGUgaW50MzI8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAg
ICAgICAgICAgIHRoaXMuaW50MzIgPSB0eXBlOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAg
dGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUgZG91Ymxl
PD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLmRvdWJs
ZSA9IHR5cGU7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgYWRkKHRoaW5nKQor
ICAgIHsKKyAgICAgICAgbGV0IGludHJpbnNpYyA9IHRoaXMuX21hcC5nZXQodGhpbmcubmFtZSk7
CisgICAgICAgIGlmICghaW50cmluc2ljKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVy
cm9yKHRoaW5nLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJVbnJlY29nbml6ZWQgaW50cmluc2ljOiAi
ICsgdGhpbmcpOworICAgICAgICBpbnRyaW5zaWModGhpbmcpOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvTGV4ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4ZXIgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgdGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAgICAgIHRoaXMuX2luZGV4
ID0gMDsKKyAgICAgICAgdGhpcy5fc3RhY2sgPSBbXTsKKyAgICB9CisgICAgCisgICAgZ2V0IGxp
bmVOdW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlckZvckluZGV4
KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luICsgIjoiICsgKHRoaXMubGluZU51bWJlciAr
IDEpOworICAgIH0KKyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5kZXgoaW5kZXgpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpLm1hdGNoKC9cbi9n
KS5sZW5ndGg7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMuX2lu
ZGV4OyB9CisgICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2luZGV4ID0gdmFsdWU7IH0KKyAg
ICAKKyAgICBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9zdGFjay5sZW5ndGgpCisg
ICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhY2sucG9wKCk7CisgICAgICAgIAorICAgICAgICBp
ZiAodGhpcy5faW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4g
bnVsbDsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1lbnRCZWdpbiA9IC9cL1wqLzsK
KyAgICAgICAgY29uc3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4gPSAvXC9cLy87CisgICAgICAg
IAorICAgICAgICBsZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZXh0
ID0gUmVnRXhwLmxhc3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0b2tlbiA9IG5ldyBMZXhlclRv
a2VuKHRoaXMsIHRoaXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAgICAgICAgICAgIHRoaXMuX2lu
ZGV4ICs9IHRleHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICB9
OworCisgICAgICAgIGxldCByZWxldmFudFRleHQ7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAg
ICAgICAgIHJlbGV2YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3RyaW5nKHRoaXMuX2luZGV4KTsK
KyAgICAgICAgICAgIGlmICgvXlxzKy8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAg
ICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wqLy50
ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSByZWxl
dmFudFRleHQuc2VhcmNoKC9cKlwvLyk7CisgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwg
MCkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIp
OworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZEluZGV4OworICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9cLy4qLy50
ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBSZWdF
eHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAv
LyBGSVhNRTogTWFrZSB0aGlzIGRvIFVuaWNvZGUuCisgICAgICAgIGlmICgvXlteXGRcV11cdyov
LnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImlkZW50aWZp
ZXIiKTsKKworICAgICAgICBpZiAoL15bMC05XSsvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAg
ICAgICAgIHJldHVybiByZXN1bHQoImludGVnZXJMaXRlcmFsIik7CisKKyAgICAgICAgLy8gRklY
TUU6IE1ha2UgdGhpcyBoYW5kbGUgZXhwLWZvcm0gbGl0ZXJhbHMgbGlrZSAxZTEuCisgICAgICAg
IGlmICgvXihbMC05XSpcLlswLTldKyl8KFswLTldK1wuWzAtOV0qKS8udGVzdChyZWxldmFudFRl
eHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiZmxvYXRMaXRlcmFsIik7CisgICAgICAg
IAorICAgICAgICBpZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8aWZ8ZWxzZXxlbnVtfGNvbnRp
bnVlfGJyZWFrfHN3aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxlfGRvfHJldHVybnxzaXplb2Z8
Y29uc3RhbnR8ZGV2aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVyYXRvcikvLnRlc3QocmVsZXZh
bnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImtleXdvcmQiKTsKKyAgICAgICAg
CisgICAgICAgIGlmICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5eJnw8PlxcLV18LT58PT58PD18
PT18IT18Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0KHJlbGV2YW50VGV4dCkpCisg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIpOworICAgICAgICAKKyAgICAg
ICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3aXRoOiAiICsgcmVsZXZhbnRU
ZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAgICBwdXNoKHRva2VuKQorICAg
IHsKKyAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7CisgICAgfQorICAgIAorICAgIHBl
ZWsoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQoKTsKKyAgICAgICAgcHVzaChy
ZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmYWlsKGVy
cm9yKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4RXJyb3IodGhpcy5vcmlnaW5T
dHJpbmcsIGVycm9yKTsKKyAgICB9CisgICAgCisgICAgYmFja3RyYWNraW5nU2NvcGUoY2FsbGJh
Y2spCisgICAgeworICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlOworICAgICAgICB0cnkg
eworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsK
KyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhFcnJvcikgeworICAgICAgICAg
ICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9Cit9
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIExleGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9yKGxleGVyLCBvcmlnaW4sIGlu
ZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhlcjsKKyAg
ICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4
OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7
CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
Ll9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5kZXgoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAgIH0KKyAgICAKKyAgICBnZXQg
bGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbGV4ZXIubGluZU51bWJl
ckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gKyAiOiIgKyAodGhpcy5saW5l
TnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAg
IHJldHVybiAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwgIiArIHRoaXMudGV4dCArICIs
ICIgKyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvTmFtZUNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmFt
ZUNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRl
eHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgVHlwZU9y
VmFsdWUgPSBTeW1ib2woKTsKKworY2xhc3MgTmFtZUNvbnRleHQgeworICAgIGNvbnN0cnVjdG9y
KGRlbGVnYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOworICAgICAg
ICBsZXQgdHlwZUFuZFZhbHVlTWFwID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9tYXAuc2V0
KFR5cGUsIHR5cGVBbmRWYWx1ZU1hcCk7CisgICAgICAgIHRoaXMuX21hcC5zZXQoVmFsdWUsIHR5
cGVBbmRWYWx1ZU1hcCk7CisgICAgICAgIGZvciAobGV0IGtpbmQgb2YgbmFtZWFibGVLaW5kcykK
KyAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2luZCwgbmV3IE1hcCgpKTsKKyAgICAgICAgdGhp
cy5fZGVmaW5lZCA9IG5ldyBTZXQoKTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9
IG51bGw7CisgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbnVsbDsKKyAgICAgICAgdGhpcy5faW50
cmluc2ljcyA9IG51bGw7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsOworICAgIH0KKyAg
ICAKKyAgICBtYXBGb3Ioa2luZCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9t
YXAuZ2V0KGtpbmQpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5l
dyBFcnJvcigiQmFkIGtpbmQ6ICIgKyBraW5kKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICB9CisgICAgCisgICAgYWRkKHRoaW5nKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGluZy5uYW1l
KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHRoaW5nLmlzTmF0
aXZlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICAg
ICAgdGhyb3cgbmV3IEVycm9yKCJOYXRpdmUgZnVuY3Rpb24gaW4gYSBzY29wZSB0aGF0IGRvZXMg
bm90IHJlY29nbml6ZSBpbnRyaW5zaWNzIik7CisgICAgICAgICAgICB0aGlzLl9pbnRyaW5zaWNz
LmFkZCh0aGluZyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxldCBtYXAgPSBtYXBG
b3IodGhpbmcua2luZCk7CisgICAgICAgIGlmICh0aGluZy5raW5kID09IEZ1bmMpIHsKKyAgICAg
ICAgICAgIGxldCBhcnJheSA9IG1hcC5nZXQodGhpbmcubmFtZSk7CisgICAgICAgICAgICBpZiAo
IWFycmF5KQorICAgICAgICAgICAgICAgIG1hcC5zZXQodGhpbmcubmFtZSwgYXJyYXkgPSBbXSk7
CisgICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgfQorICAgICAgICBpZiAobWFwLmhhcyh0aGluZy5uYW1lKSkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRHVwbGljYXRl
IG5hbWU6ICIgKyB0aGluZy5uYW1lKTsKKyAgICAgICAgbWFwLnNldCh0aGluZy5uYW1lLCB0aGlu
Zyk7CisgICAgfQorICAgIAorICAgIGdldChraW5kLCBuYW1lKQorICAgIHsKKyAgICAgICAgbGV0
IHJlc3VsdCA9IG1hcEZvcihraW5kID09IFR5cGVPclZhbHVlID8gVHlwZSA6IGtpbmQpLmdldChu
YW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQgJiYgdGhpcy5fZGVsZWdhdGUpCisgICAgICAgICAg
ICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZ2V0KGtpbmQsIG5hbWUpOworICAgICAgICBpZiAoa2lu
ZCA9PSBWYWx1ZSB8fCBraW5kID09IFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQua2lu
ZCAhPSBraW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGdldCBjdXJyZW50U3RhdGVtZW50
KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9jdXJyZW50U3RhdGVtZW50KQorICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIGlmICh0aGlzLl9kZWxl
Z2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jdXJyZW50U3RhdGVtZW50
OworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgaXNEZWZpbmVkKHRoaW5n
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmluZWQuaGFzKHRoaW5nKQorICAgICAg
ICAgICAgfHwgKHRoaXMuX2RlbGVnYXRlICYmIHRoaXMuX2RlbGVnYXRlLmlzRGVmaW5lZCh0aGlu
ZykpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmUodGhpbmcpCisgICAgeworICAgICAgICB0aGlz
Ll9kZWZpbmVkLnNldCh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRlZmluZUFsbCgpCisgICAg
eworICAgICAgICBmb3IgKGxldCB0aGluZyBvZiB0aGlzKQorICAgICAgICAgICAgZGVmaW5lKHRo
aW5nKTsKKyAgICB9CisgICAgCisgICAgZG9TdGF0ZW1lbnQoc3RhdGVtZW50LCBjYWxsYmFjaykK
KyAgICB7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisgICAg
ICAgIGNhbGxiYWNrKCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOwor
ICAgICAgICBkZWZpbmUoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVjb2duaXplSW50
cmluc2ljcygpCisgICAgeworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbmV3IEludHJpbnNp
Y3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAg
aWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50cmluc2lj
czsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMu
X2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAK
KyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSB2
YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHByb2dyYW0oKQorICAgIHsKKyAgICAgICAgaWYg
KHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbTsKKyAgICAg
ICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRl
LnByb2dyYW07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAqW1N5bWJv
bC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgbWFwIG9mIHRoaXMuX21hcC52
YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcy52YWx1
ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVsZCB0eXBlOworICAgICAgICB9CisgICAgfQorfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL05hdGl2ZVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBOYXRpdmVUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
LCBuYW1lLCBpc1ByaW1pdGl2ZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlz
Ll9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0
aGlzLl9pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlOworICAgICAgICB0aGlzLl90eXBlUGFyYW1l
dGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyBy
ZXR1bnIgdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1l
OyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5faXNQcmltaXRpdmU7IH0K
KyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsg
fQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbnN0YW50
aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVu
Z3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3
IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIp
OworICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJu
IHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlVHlwZUluc3RhbmNlKHRoaXMsIHR5cGVB
cmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gIm5hdGl2ZSAiICsgKHRoaXMuaXNQcmltaXRpdmUgPyAicHJpbWl0aXZlICIgOiAiIikg
KyAidHlwZSAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+IjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTmF0aXZlVHlwZUlu
c3RhbmNlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3IodHlwZSwgdHlwZUFyZ3VtZW50
cykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgICAgICB0aGlzLl90eXBl
QXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IHR5cGUoKSB7
IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgZ2V0IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0
aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhp
cy5fdHlwZS5pc1ByaW1pdGl2ZTsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7
CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIu
dHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7Cisg
ICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNv
bnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICI8IiArIHRoaXMu
dHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L05vZGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTm9kZSB7CisgICAgdmlzaXQodmlzaXRvcikKKyAgICB7
CisgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IHZpc2l0b3JbInZpc2l0IiArIHRoaXMuY29uc3Ry
dWN0b3IubmFtZV0odGhpcyk7CisgICAgICAgIGlmICgicmV0dXJuVmFsdWUiIGluIHZpc2l0b3Ip
CisgICAgICAgICAgICByZXR1cm4gdmlzaXRvci5yZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJu
IHJldHVyblZhbHVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0IHVuaWZ5VGhpcyA9IHRoaXMudW5pZnlOb2RlOwor
ICAgICAgICBsZXQgdW5pZnlPdGhlciA9IG90aGVyLnVuaWZ5Tm9kZTsKKyAgICAgICAgaWYgKHVu
aWZ5T3RoZXIudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCB1bmlmeVRoaXMp
KQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB1bmlmeVRoaXMudW5p
ZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlPdGhlcik7CisgICAgfQorICAgIAorICAg
IHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYg
KG90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdGhpcykpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXI7CisgICAg
fQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIp
CisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGdldCB1bmlm
eU5vZGUoKSB7IHJldHVybiB0aGlzOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4g
ZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAg
IAorICAgIGVxdWFscyhvdGhlcikKKyAgICB7CisgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRl
eHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KCk7CisgICAgICAgIHJldHVybiB0aGlzLnVuaWZ5
KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpICYmIHVuaWZpY2F0aW9uQ29udGV4dC5pc1VudW5p
ZmllZCgpOworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0dXRlKHBhcmFtZXRlcnMsIGFyZ3VtZW50
TGlzdCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0KFN1YnN0aXR1dGlvbi5tYXBw
aW5nKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkpOworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0
dXRlVG9VbmlmaWNhdGlvbihwYXJhbWV0ZXJzLCB1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgewor
ICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLm1hcCh0eXBl
ID0+IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHR5cGUpKSk7CisgICAgfQorfQpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvUGFyc2UuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
UGFyc2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcGFyc2UocHJvZ3Jh
bSwgb3JpZ2luLCB0ZXh0KQoreworICAgIGxldCBsZXhlciA9IG5ldyBMZXhlcihvcmlnaW4sIHRl
eHQpOworICAgIAorICAgIC8vIFRoZSBoYXJkZXN0IHBhcnQgb2YgZGVhbGluZyB3aXRoIEMtbGlr
ZSBsYW5ndWFnZXMgaXMgcGFyc2luZyB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnRzLgor
ICAgIC8vIExldCdzIGNvbnNpZGVyIGlmIHRoaXMgaGFwcGVucyBpbiBBcnJheUxhbmcuIEhlcmUg
YXJlIHRoZSB2YWxpZCBzdGF0ZW1lbnRzIGluIEFycmF5TGFuZyB0aGF0CisgICAgLy8gYmVnaW4g
d2l0aCBhbiBpZGVudGlmaWVyLCBpZiB3ZSBhc3N1bWUgdGhhdCBhbnkgZXhwcmVzc2lvbiBjYW4g
YmUgYSBzdGFuZGFsb25lIHN0YXRlbWVudC4KKyAgICAvLworICAgIC8vICAgICB4OworICAgIC8v
ICAgICB4IDxiaW5vcD4geTsKKyAgICAvLyAgICAgeCA8IHk7CisgICAgLy8gICAgIHggPCB5ID4g
ejsKKyAgICAvLyAgICAgeCA9IHk7CisgICAgLy8gICAgIHguZiA9IHk7CisgICAgLy8gICAgIFxl
eHAgPSB5OworICAgIC8vICAgICB4WzQyXSA9IHk7CisgICAgLy8gICAgIHgoKTsKKyAgICAvLyAg
ICAgeDx5PigpOworICAgIC8vICAgICB4IHk7CisgICAgLy8gICAgIHg8eT4gejsKKyAgICAvLyAg
ICAgeFtdIHk7CisgICAgLy8gICAgIHhbNDJdIHk7CisgICAgLy8gICAgIHheIHk7CisgICAgLy8K
KyAgICAvLyBUaGlzIGhhcyB0d28gcHJvYmxlbSBhcmVhczoKKyAgICAvLworICAgIC8vICAgICAt
IHg8eT56IGNhbiBwYXJzZSB0d28gZGlmZmVyZW50IHdheXMgKGFzICh4IDwgeSkgPiB6IG9yIHg8
eT4geikuCisgICAgLy8gICAgIC0geFs0Ml0gY291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25t
ZW50IG9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgLy8gICAgIC0geDx5PiBjb3VsZCBi
ZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAg
ICAvLworICAgIC8vIFdlIHNvbHZlIHRoZSBmaXJzdCBwcm9ibGVtIGJ5IGZvcmJpZGRpbmcgZXhw
cmVzc2lvbnMgYXMgc3RhdGVtZW50cy4gVGhlIGxhY2sgb2YgZnVuY3Rpb24KKyAgICAvLyBwb2lu
dGVycyBtZWFucyB0aGF0IHdlIGNhbiBzdGlsbCBhbGxvdyBmdW5jdGlvbiBjYWxsIHN0YXRlbWVu
dHMgLSB1bmxpa2UgaW4gQywgdGhvc2UgY2Fubm90CisgICAgLy8gaGF2ZSBhcmJpdHJhcnkgZXhw
cmVzc2lvbnMgYXMgdGhlIGNhbGxlZS4gVGhlIHJlbWFpbmluZyB0d28gcHJvYmxlbXMgYXJlIHNv
bHZlZCBieQorICAgIC8vIGJhY2t0cmFja2luZy4gSW4gYWxsIG90aGVyIHJlc3BlY3RzLCB0aGlz
IGlzIGEgc2ltcGxlIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4KKyAgICAKKyAgICBmdW5jdGlv
biBnZW5lcmljQ29uc3VtZShjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxl
eGVyLm5leHQoKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIGxleGVyLmZhaWwo
IlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrKHRva2VuKSkK
KyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50ZXh0
ICsgIjsgZXhwZWN0ZWQ6ICIgKyB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiBjb25zdW1lKC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGdlbmVyaWNDb25zdW1lKHRva2VuID0+IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gY29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBnZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOwor
ICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBhc3NlcnROZXh0KC4uLnRleHRzKQorICAgIHsKKyAg
ICAgICAgbGV4ZXIucHVzaChjb25zdW1lKC4uLnRleHRzKSk7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIGdlbmVyaWNUZXN0KGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0g
bGV4ZXIucGVlaygpOworICAgICAgICBpZiAodG9rZW4gJiYgY2FsbGJhY2sodG9rZW4pKQorICAg
ICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gdGVzdCguLi50ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5l
cmljVGVzdCh0b2tlbiA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIHRlc3RLaW5kKGtpbmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2Vu
ZXJpY1Rlc3QodG9rZW4gPT4gdG9rZW4ua2luZCA9PSBraW5kKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gdHJ5Q29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQg
PSB0ZXN0KC4uLnRleHRzKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVy
Lm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gcGFyc2VQcm90b2NvbFJlZigpCisgICAgeworICAgICAgICBsZXQgcHJvdG9jb2xUb2tlbiA9
IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xS
ZWYocHJvdG9jb2xUb2tlbi5vcmlnaW4sIHByb3RvY29sVG9rZW4udGV4dCk7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCkKKyAgICB7CisgICAgICAgIGxl
dCByaWdodFNoaWZ0ID0gdHJ5Q29uc3VtZSgiPj4iKTsKKyAgICAgICAgaWYgKHJpZ2h0U2hpZnQp
CisgICAgICAgICAgICBsZXhlci5wdXNoKG5ldyBMZXhlclRva2VuKGxleGVyLCByaWdodFNoaWZ0
Lm9yaWdpbiwgcmlnaHRTaGlmdC5pbmRleCwgcmlnaHRTaGlmdC5raW5kLCAiPiIpKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgY29uc3VtZSgiPiIpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVR5cGVQYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICAgIGlmICghdGVzdCgiPCIp
KQorICAgICAgICAgICAgcmV0dXJuIFtdOworICAgICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9
IFtdOworICAgICAgICBjb25zdW1lKCI8Iik7CisgICAgICAgIHdoaWxlICghdGVzdCgiPiIpKSB7
CisgICAgICAgICAgICBsZXQgY29uc3RleHByID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkg
PT4geworICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcGFyc2VUeXBlKCk7CisgICAgICAgICAg
ICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAg
ICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgIHJldHVybiBu
ZXcgQ29uc3RleHByVHlwZVBhcmFtZXRlcih0eXBlLm9yaWdpbiwgbmFtZSwgdHlwZSk7CisgICAg
ICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAg
cmVzdWx0LnB1c2goY29uc3RleHByKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgICAgICAg
ICBsZXQgcHJvdG9jb2wgPSB0cnlDb25zdW1lKCI6IikgPyBwYXJzZVByb3RvY29sUmVmKCkgOiBu
dWxsOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlVmFyaWFibGUobmFtZS5v
cmlnaW4sIG5hbWUudGV4dCwgcHJvdG9jb2wpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVGVybSgpCisgICAgeworICAgICAgICAv
LyBGSVhNRQorICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNvbnN0ZXhwcigpCisgICAg
eworICAgICAgICByZXR1cm4gcGFyc2VUZXJtKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IHBhcnNlVHlwZUFyZ3VtZW50cygpCisgICAgeworICAgICAgICBpZiAoIXRlc3QoIjwiKSkKKyAg
ICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1bHQgPSBbXTsK
KyAgICAgICAgY29uc3VtZSgiPCIpOworICAgICAgICB3aGlsZSAoIXRlc3QoIj4iKSkgeworICAg
ICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSBmb3IgYSBjb25zdGV4cHIgb3IgdHlwZSBjYW4gc3lu
dGFjdGljYWxseSBvdmVybGFwIGluIHRoZSBzaW5nbGUKKyAgICAgICAgICAgIC8vIGlkZW50aWZp
ZXIgY2FzZS4gTGV0J3MgY29uc2lkZXIgdGhlIHBvc3NpYmlsaXRpZXM6CisgICAgICAgICAgICAv
LworICAgICAgICAgICAgLy8gICAgIFQgICAgICAgICAgY291bGQgYmUgdHlwZSBvciBjb25zdGV4
cHIKKyAgICAgICAgICAgIC8vICAgICBUW10gICAgICAgIG9ubHkgdHlwZQorICAgICAgICAgICAg
Ly8gICAgIFRbNDJdICAgICAgb25seSB0eXBlIChjb25zdGV4cHIgY2Fubm90IGRvIGluZGV4aW5n
KQorICAgICAgICAgICAgLy8gICAgIDQyICAgICAgICAgb25seSBjb25zdGV4cHIKKyAgICAgICAg
ICAgIC8vCisgICAgICAgICAgICAvLyBJbiB0aGUgZnV0dXJlIHdlJ2xsIGFsbG93IGNvbnN0ZXhw
cnMgdG8gZG8gbW9yZSB0aGluZ3MsIGFuZCB0aGVuIHdlJ2xsIHN0aWxsIGhhdmUKKyAgICAgICAg
ICAgIC8vIHRoZSBwcm9ibGVtIHRoYXQgc29tZXRoaW5nIG9mIHRoZSBmb3JtIFRbMV1bMl1bM10u
Li4gY2FuIGVpdGhlciBiZSBhIHR5cGUgb3IgYQorICAgICAgICAgICAgLy8gY29uc3RleHByLCBh
bmQgd2UgY2FuIGZpZ3VyZSBvdXQgaW4gdGhlIGNoZWNrZXIgd2hpY2ggaXQgaXMuCisgICAgICAg
ICAgICBsZXQgdHlwZU9yVmFyaWFibGVSZWYgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9
PiB7CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVy
Iik7CisgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgiLCIsICI+IiwgIj4+Iik7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIG5ldyBUeXBlT3JWYXJpYWJsZVJlZihyZXN1bHQub3JpZ2luLCByZXN1
bHQudGV4dCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICh0eXBlT3JWYXJpYWJs
ZVJlZikKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlT3JWYXJpYWJsZVJlZik7Cisg
ICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgY29uc3RleHByID0gbGV4ZXIu
YmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0
ID0gcGFyc2VDb25zdGV4cHIoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgiLCIs
ICI+IiwgIj4+Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAg
ICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0ZXhwcikKKyAgICAgICAgICAg
ICAgICAgICAgcmVzdWx0LnB1c2goY29uc3RleHByKQorICAgICAgICAgICAgICAgIGVsc2UKKyAg
ICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VUeXBlKCkpOworICAgICAgICAgICAg
fQorICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZUVuZE9mVHlwZUFyZ3MoKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VUeXBlRGVmKCkK
KyAgICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1lKCJ0eXBlIikub3JpZ2luOworICAg
ICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIikudGV4dDsKKyAgICAgICAg
bGV0IHR5cGVQYXJhbWV0ZXJzID0gcGFyc2VUeXBlUGFyYW1ldGVycygpOworICAgICAgICBjb25z
dW1lKCI9Iik7CisgICAgICAgIGxldCB0eXBlID0gcGFyc2VUeXBlKCk7CisgICAgICAgIGNvbnN1
bWUoIjsiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUeXBlRGVmKG9yaWdpbiwgbmFtZSwgdHlwZVBh
cmFtZXRlcnMsIHR5cGUpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmljUGFyc2VM
ZWZ0KHRleHRzLCBuZXh0UGFyc2VyLCBjb25zdHJ1Y3RvcikKKyAgICB7CisgICAgICAgIGxldCBs
ZWZ0ID0gbmV4dFBhcnNlcigpOworICAgICAgICBsZXQgdG9rZW47CisgICAgICAgIHdoaWxlICh0
b2tlbiA9IHRyeUNvbnN1bWUoLi4udGV4dHMpKQorICAgICAgICAgICAgbGVmdCA9IGNvbnN0cnVj
dG9yKHRva2VuLCBsZWZ0LCBuZXh0UGFyc2VyKCkpOworICAgICAgICByZXR1cm4gbGVmdDsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKHRleHRzLCBuZXh0
UGFyc2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNQYXJzZUxlZnQoCisgICAgICAg
ICAgICB0ZXh0cywgbmV4dFBhcnNlciwKKyAgICAgICAgICAgICh0b2tlbiwgbGVmdCwgcmlnaHQp
ID0+CisgICAgICAgICAgICAgICAgbmV3IENhbGxFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgIm9w
ZXJhdG9yIiArIHRva2VuLnRleHQsIFtdLCBbbGVmdCwgcmlnaHRdKSk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlQ2FsbEV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgbGV0IG5h
bWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVN1ZmZpeCgpCisgICAgeworICAgICAgICBsZXQgc2lt
cGxlQ2FzZSA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKCgpID0+IHsKKyAgICAgICAgICAgIGxl
dCBsZWZ0ID0gcGFyc2VUZXJtKCk7CisgICAgICAgICAgICBsZXQgdG9rZW47CisgICAgICAgICAg
ICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1lKCIrKyIsICItLSIsICIuIiwgIi0+IiwgIlsiKSkg
eworICAgICAgICAgICAgICAgIHN3aXRjaCAodG9rZW4udGV4dCkgeworICAgICAgICAgICAgICAg
IGNhc2UgIisrIjoKKyAgICAgICAgICAgICAgICBjYXNlICItLSI6CisgICAgICAgICAgICAgICAg
ICAgIGxlZnQgPSBuZXcgU3VmZml4Q2FsbEFzc2lnbm1lbnQodG9rZW4ub3JpZ2luLCAib3BlcmF0
b3IiICsgdG9rZW4udGV4dCwgbGVmdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIGNhc2UgIi4iOgorICAgICAgICAgICAgICAgIGNhc2UgIi0+IjoKKyAgICAg
ICAgICAgICAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIi0+IikKKyAgICAgICAgICAgICAgICAg
ICAgICAgIGxlZnQgPSBuZXcgRGVyZWZlcmVuY2VFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgbGVm
dCk7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBuZXcgRG90RXhwcmVzc2lvbih0b2tlbi5v
cmlnaW4sIGxlZnQsIGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIikpOworICAgICAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICJbIjogeworICAgICAgICAgICAgICAg
ICAgICBsZXQgaW5kZXggPSBwYXJzZUV4cHJlc3Npb24oKTsKKyAgICAgICAgICAgICAgICAgICAg
Y29uc3VtZSgiXSIpOworICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IEluZGV4RXhwcmVz
c2lvbih0b2tlbi5vcmlnaW4sIGxlZnQsIGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAg
ICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQmFkIHRva2VuOiAiICsgdG9rZW4pOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsZWZ0Owor
ICAgICAgICB9KTsKKyAgICAgICAgaWYgKHNpbXBsZUNhc2UpCisgICAgICAgICAgICByZXR1cm4g
c2ltcGxlQ2FzZTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBwYXJzZUNhbGxFeHByZXNzaW9u
KCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVQcmVmaXgoKQorICAg
IHsKKyAgICAgICAgbGV0IHRva2VuOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCIr
KyIsICItLSIsICIrIiwgIi0iLCAiISIsICJ+IikpCisgICAgICAgICAgICByZXR1cm4gbmV3IENh
bGxBc3NpZ25tZW50KHRva2VuLm9yaWdpbiwgIm9wZXJhdG9yIiArIHRva2VuLnRleHQsIHBhcnNl
UG9zc2libGVQcmVmaXgoKSk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIl4iKSkK
KyAgICAgICAgICAgIHJldHVybiBuZXcgRGVyZWZlcmVuY2VFeHByZXNzaW9uKHRva2VuLm9yaWdp
biwgcGFyc2VQb3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3Vt
ZSgiXFwiKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWRkcmVzc09mRXhwcmVzc2lvbih0b2tl
bi5vcmlnaW4sIHBhcnNlUG9zc2libGVQcmVmaXgoKSk7CisgICAgICAgIHJldHVybiBwYXJzZVBv
c3NpYmxlU3VmZml4KCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVQ
cm9kdWN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyIq
IiwgIi8iLCAiJSJdLCBwYXJzZVBvc3NpYmxlUHJlZml4KTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gcGFyc2VQb3NzaWJsZVN1bSgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0
T3BlcmF0b3JDYWxsKFsiKyIsICItIl0sIHBhcnNlUG9zc2libGVQcm9kdWN0KTsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVNoaWZ0KCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyI8PCIsICI+PiJdLCBwYXJzZVBvc3NpYmxlU3Vt
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxJbmVx
dWFsaXR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyI8
IiwgIj4iLCAiPD0iLCAiPT4iXSwgcGFyc2VQb3NzaWJsZVNoaWZ0KTsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxFcXVhbGl0eSgpCisgICAgeworICAg
ICAgICByZXR1cm4gZ2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAgICAgIFsiPT0iLCAiIT0iXSwg
cGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxJbmVxdWFsaXR5LAorICAgICAgICAgICAgKHRva2VuLCBs
ZWZ0LCByaWdodCkgPT4geworICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ2FsbEV4
cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3I9PSIsIFtdLCBbbGVmdCwgcmlnaHRdKTsK
KyAgICAgICAgICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiIT0iKQorICAgICAgICAgICAgICAg
ICAgICByZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3Ih
IiwgW10sIFtyZXN1bHRdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAg
ICAgICAgfSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNl
QW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyImIl0s
IHBhcnNlUG9zc2libGVSZWxhdGlvbmFsRXF1YWxpdHkpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVBvc3NpYmxlQml0d2lzZVhvcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFy
c2VMZWZ0T3BlcmF0b3JDYWxsKFsiXiJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZUFuZCk7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlT3IoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbInwiXSwgcGFyc2VQb3NzaWJsZUJp
dHdpc2VYb3IpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUxlZnRMb2dpY2FsRXhw
cmVzc2lvbih0ZXh0cywgbmV4dFBhcnNlcikKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmlj
UGFyc2VMZWZ0KAorICAgICAgICAgICAgdGV4dHMsIG5leHRQYXJzZXIsCisgICAgICAgICAgICAo
dG9rZW4sIGxlZnQsIHJpZ2h0KSA9PiBuZXcgTG9naWNhbEV4cHJlc3Npb24odG9rZW4ub3JpZ2lu
LCB0b2tlbi50ZXh0LCBsZWZ0LCByaWdodCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZVBvc3NpYmxlTG9naWNhbEFuZCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0
TG9naWNhbEV4cHJlc3Npb24oWyImJiJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZU9yKTsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUxvZ2ljYWxPcigpCisgICAgeworICAg
ICAgICByZXR1cm4gcGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24oWyJ8fCJdLCBwYXJzZVBvc3Np
YmxlTG9naWNhbEFuZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVU
ZXJuYXJ5Q29uZGl0aW9uYWwoKQorICAgIHsKKyAgICAgICAgbGV0IHByZWRpY2F0ZSA9IHBhcnNl
UG9zc2libGVMb2dpY2FsT3IoKTsKKyAgICAgICAgbGV0IG9wZXJhdG9yID0gdHJ5Q29uc3VtZSgi
PyIpOworICAgICAgICBpZiAoIW9wZXJhdG9yKQorICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0
ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXJuYXJ5RXhwcmVzc2lvbihvcGVyYXRvci5vcmlnaW4s
IHByZWRpY2F0ZSwgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSwgcGFyc2VQb3NzaWJsZUFzc2ln
bm1lbnQoKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVBc3NpZ25t
ZW50KG1vZGUpCisgICAgeworICAgICAgICBsZXQgbGhzID0gcGFyc2VQb3NzaWJsZVRlcm5hcnlD
b25kaXRpb25hbCgpOworICAgICAgICBsZXQgb3BlcmF0b3IgPSB0cnlDb25zdW1lKCI9IiwgIis9
IiwgIi09IiwgIio9IiwgIi89IiwgIiU9IiwgIl49IiwgInw9IiwgIiY9Iik7CisgICAgICAgIGlm
ICghb3BlcmF0b3IpIHsKKyAgICAgICAgICAgIGlmIChtb2RlID09ICJyZXF1aXJlZCIpCisgICAg
ICAgICAgICAgICAgbGV4ZXIuZmFpbCgiRXhwZWN0ZWQgYXNzaWdubWVudCIpOworICAgICAgICAg
ICAgcmV0dXJuIGxoczsKKyAgICAgICAgfQorICAgICAgICBpZiAob3BlcmF0b3IudGV4dCA9PSAi
PSIpCisgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQob3BlcmF0b3Iub3JpZ2luLCBs
aHMsIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KCkpOworICAgICAgICBsZXQgbmFtZSA9ICJvcGVy
YXRvciIgKyBvcGVyYXRvci50ZXh0LnN1YnN0cmluZygwLCB0ZXJtLm9wZXJhdG9yLmxlbmd0aCAt
IDEpOworICAgICAgICByZXR1cm4gbmV3IENhbGxBc3NpZ25tZW50KG9wZXJhdG9yLm9yaWdpbiwg
bmFtZSwgbGhzLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VBc3NpZ25tZW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZVBv
c3NpYmxlQXNzaWdubWVudCgicmVxdWlyZWQiKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
cGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIGxldCBhc3NpZ25tZW50
ID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFyc2VBc3NpZ25tZW50
KCk7IH0pOworICAgICAgICBpZiAoYXNzaWdubWVudCkKKyAgICAgICAgICAgIHJldHVybiBhc3Np
Z25tZW50OworICAgICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVzc2lvbigpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBnZW5lcmljUGFyc2VDb21tYUV4cHJlc3Npb24oZmluYWxFeHByZXNz
aW9uUGFyc2VyKQorICAgIHsKKyAgICAgICAgbGV0IGxpc3QgPSBbXTsKKyAgICAgICAgbGV0IG9y
aWdpbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKCFvcmlnaW4pCisgICAgICAgICAgICBs
ZXhlci5mYWlsKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisgICAgICAgIG9yaWdpbiA9IG9y
aWdpbi5vcmlnaW47CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGxldCBlZmZlY3Rm
dWxFeHByZXNzaW9uID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFy
c2VFZmZlY3RmdWxFeHByZXNzaW9uKCk7IH0pOworICAgICAgICAgICAgaWYgKCFlZmZlY3RmdWxF
eHByZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgbGlzdC5wdXNoKGZpbmFsRXhwcmVzc2lvblBh
cnNlcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGxpc3QucHVzaChlZmZlY3RmdWxFeHByZXNzaW9uKTsKKyAgICAgICAgICAgIGlmICghdHJ5
Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IHJldHVybiBuZXcgQ29tbWFFeHByZXNzaW9uKG9yaWdpbiwgbGlzdCk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlQ29tbWFFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVy
biBnZW5lcmljUGFyc2VDb21tYUV4cHJlc3Npb24ocGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQpOwor
ICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHBhcnNlQ29tbWFFeHByZXNzaW9uKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlQXNzaWdubWVudFN0YXRlbWVudCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0
ID0gZ2VuZXJpY1BhcnNlQ29tbWFFeHByZXNzaW9uKHBhcnNlRWZmZWN0ZnVsRXhwcmVzc2lvbik7
CisgICAgICAgIGNvbnN1bWUoIjsiKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VSZXR1cm4oKQorICAgIHsKKyAgICAgICAgY29uc3VtZSgi
cmV0dXJuIik7CisgICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oKTsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnQoKQorICAgIHsKKyAgICAgICAgbGV0IHRva2Vu
ID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiOyIpIHsKKyAgICAg
ICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9
CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJyZXR1cm4iKQorICAgICAgICAgICAgcmV0dXJu
IHBhcnNlUmV0dXJuKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJicmVhayIpCisgICAg
ICAgICAgICByZXR1cm4gcGFyc2VCcmVhaygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAi
Y29udGludWUiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29udGludWUoKTsKKyAgICAgICAg
aWYgKHRva2VuLnRleHQgPT0gIndoaWxlIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVdoaWxl
KCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJkbyIpCisgICAgICAgICAgICByZXR1cm4g
cGFyc2VEbygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiZm9yIikKKyAgICAgICAgICAg
IHJldHVybiBwYXJzZUZvcigpOworICAgICAgICBsZXQgY29tbWFFeHByZXNzaW9uID0gbGV4ZXIu
YmFja3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFyc2VBc3NpZ25tZW50U3RhdGVtZW50
KCk7IH0pOworICAgICAgICBpZiAoY29tbWFFeHByZXNzaW9uKQorICAgICAgICAgICAgcmV0dXJu
IGNvbW1hRXhwcmVzc2lvbjsKKyAgICAgICAgcmV0dXJuIHBhcnNlVmFyaWFibGVEZWNsKCk7Cisg
ICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQmxvY2soKQorICAgIHsKKyAgICAgICAgbGV0
IG9yaWdpbiA9IGNvbnN1bWUoInsiKS5vcmlnaW47CisgICAgICAgIGxldCBibG9jayA9IG5ldyBC
bG9jayhvcmlnaW4pOworICAgICAgICB3aGlsZSAoIXRlc3QoIn0iKSkgeworICAgICAgICAgICAg
bGV0IHN0YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CisgICAgICAgICAgICBpZiAoc3RhdGVt
ZW50KQorICAgICAgICAgICAgICAgIGJsb2NrLnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfQor
ICAgICAgICBjb25zdW1lKCJ9Iik7CisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gcGFyc2VGdW5jRGVmKCkKKyAgICB7CisgICAgICAgIGxldCByZXR1cm5U
eXBlID0gcGFyc2VUeXBlKCk7CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50
aWZpZXIiKS50ZXh0OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJh
bWV0ZXJzKCk7CisgICAgICAgIGNvbnN1bWUoIigiKTsKKyAgICAgICAgbGV0IHBhcmFtZXRlcnMg
PSBbXTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCIpIikpIHsKKyAgICAgICAgICAgIHBhcmFtZXRl
cnMucHVzaChwYXJzZVBhcmFtZXRlcigpKTsKKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgi
LCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWUo
IikiKTsKKyAgICAgICAgbGV0IGJsb2NrID0gcGFyc2VCbG9jaygpOworICAgICAgICByZXR1cm4g
RnVuY0RlZihyZXR1cm5UeXBlLm9yaWdpbiwgbmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRl
cnMsIHBhcmFtZXRlcnMsIGJvZHkpOworICAgIH0KKyAgICAKKyAgICBmb3IgKDs7KSB7CisgICAg
ICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAg
ICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIjsiKQorICAgICAgICAg
ICAgbGV4ZXIubmV4dCgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJ0eXBlIikK
KyAgICAgICAgICAgIHBhcnNlVHlwZURlZigpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0
ID09ICJuYXRpdmUiKQorICAgICAgICAgICAgcGFyc2VOYXRpdmVUeXBlKCk7CisgICAgICAgIGVs
c2UgaWYgKHRva2VuLnRleHQgPT0gInN0cnVjdCIpCisgICAgICAgICAgICBwYXJzZVN0cnVjdFR5
cGUoKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAiZW51bSIpCisgICAgICAgICAg
ICBwYXJzZUVudW0oKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAicHJvdG9jb2wi
KQorICAgICAgICAgICAgcGFyc2VQcm90b2NvbERlY2woKTsKKyAgICAgICAgZWxzZQorICAgICAg
ICAgICAgcGFyc2VGdW5jRGVmKCk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9Qcm9ncmFtLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm9ncmFtIGV4dGVuZHMgTm9kZSB7
CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1l
bnRzID0gW107CisgICAgICAgIHRoaXMuX2Z1bmN0aW9ucyA9IG5ldyBNYXAoKTsKKyAgICAgICAg
dGhpcy5fdHlwZXMgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIGdldCB0b3BMZXZlbFN0
YXRlbWVudHMoKSB7IHJldHVybiB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHM7IH0KKyAgICBnZXQg
ZnVuY3Rpb25zKCkgeyByZXR1cm4gdGhpcy5fZnVuY3Rpb25zOyB9CisgICAgZ2V0IHR5cGVzKCkg
eyByZXR1cm4gdGhpcy5fdHlwZXM7IH0KKyAgICAKKyAgICBhZGRUb3BMZXZlbFN0YXRlbWVudChz
dGF0ZW1lbnQpCisgICAgeworICAgICAgICBzdGF0ZW1lbnQucHJvZ3JhbSA9IHRoaXM7CisgICAg
ICAgIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBGdW5jKSB7CisgICAgICAgICAgICBsZXQgYXJy
YXkgPSB0aGlzLl9mdW5jdGlvbnMuZ2V0KHN0YXRlbWVudC5uYW1lKTsKKyAgICAgICAgICAgIGlm
ICghYXJyYXkpCisgICAgICAgICAgICAgICAgdGhpcy5fZnVuY3Rpb25zLnNldChzdGF0ZW1lbnQu
bmFtZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHN0YXRlbWVudCk7Cisg
ICAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgVHlwZSkKKyAgICAgICAgICAg
IHRoaXMuX3R5cGVzLnNldChzdGF0ZW1lbnQubmFtZSwgc3RhdGVtZW50KTsKKyAgICAgICAgZWxz
ZQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdGF0ZW1lbnQgaXMgbm90IGEgZnVuY3Rp
b24gb3IgdHlwZTogIiArIHN0YXRlbWVudCk7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVt
ZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHJlc29sdmVGdW5jT3Zlcmxv
YWQobmFtZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcykKKyAgICB7CisgICAgICAgIGxl
dCBmdW5jdGlvbnMgPSB0aGlzLmZ1bmN0aW9ucy5nZXQobmFtZSk7CisgICAgICAgIGlmICghZnVu
Y3Rpb25zKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICBmb3Ig
KGxldCBmdW5jIG9mIGZ1bmN0aW9ucykgeworICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMu
bGVuZ3RoICYmIHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IGZ1bmMudHlwZVBhcmFtZXRlcnMubGVu
Z3RoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGFyZ3VtZW50
VHlwZXMubGVuZ3RoICE9IGZ1bmMucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZp
Y2F0aW9uQ29udGV4dChmdW5jLnR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIGxldCBvayA9
IHRydWU7CisgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVu
Z3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBsZXQgYXJndW1lbnQgPSB0eXBlQXJndW1lbnRz
W2ldOworICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXIgPSBmdW5jLnR5cGVQYXJhbWV0ZXJz
W2ldOworICAgICAgICAgICAgICAgIGlmICgoYXJndW1lbnQgaW5zdGFuY2VvZiBUeXBlKSAhPSAo
cGFyYW1ldGVyIGluc3RhbmNlb2YgVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBm
YWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIGlmICghYXJndW1lbnQudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBwYXJh
bWV0ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBmb3Ig
KGxldCBpID0gMDsgaSA8IGFyZ3VtZW50VHlwZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAg
ICAgICBpZiAoIWFyZ3VtZW50VHlwZXNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBmdW5j
LnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsK
KyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAg
ICAgfQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0IHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cyA9
ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgICAgIGlmIChzaG91bGRCdWlsZFR5cGVB
cmd1bWVudHMpCisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IFtdOworICAgICAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBmdW5jLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICAgICAgbGV0IHR5cGVBcmd1bWVudCA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHR5
cGVQYXJhbWV0ZXIpOworICAgICAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnQgPT0gdHlwZVBh
cmFtZXRlcikgeworICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNo
b3VsZEJ1aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50
cy5wdXNoKHR5cGVBcmd1bWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW9r
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuIHtmdW5jLCB1
bmlmaWNhdGlvbkNvbnRleHQsIHR5cGVBcmd1bWVudHN9OworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAg
Zm9yIChsZXQgc3RhdGVtZW50IG9mIHRoaXMudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAg
ICAgcmVzdWx0LmFkZChzdGF0ZW1lbnQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvUHJvdG9jb2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBQcm90b2NvbCBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
bmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhp
cy5fbmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAg
ICBnZXQga2luZCgpIHsgcmV0dXJuIFByb3RvY29sOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvUHJvdG9jb2xEZWNsLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1By
b3RvY29sRGVjbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBQcm90b2NvbERlY2wgZXh0ZW5kcyBQcm90b2NvbCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
LCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luLCBuYW1lKQorICAgICAgICB0aGlz
Ll9zaWduYXR1cmVzID0gW107CisgICAgICAgIHRoaXMuX3NpZ25hdHVyZU1hcCA9IG5ldyBNYXAo
KTsKKyAgICAgICAgdGhpcy5fdHlwZVZhcmlhYmxlID0gbmV3IFR5cGVWYXJpYWJsZShvcmlnaW4s
IG5hbWUsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBhZGRTaWduYXR1cmUoc2lnbmF0dXJlKQor
ICAgIHsKKyAgICAgICAgLy8gTk9URTogQW55IHR5cGUgcGFyYW1ldGVycyBmb3VuZCBpbiB0aGUg
c2lnbmF0dXJlIG11c3QgYmUgaW5mZXJhYmxlIGZyb20gdGhlIHZhbHVlCisgICAgICAgIC8vIHBh
cmFtZXRlcnMuCisgICAgICAgIC8vIEZJWE1FOiBDaGVjayB0aGlzISAoT09QUyEpCisgICAgICAg
IHRoaXMuX3NpZ25hdHVyZXMucHVzaChzaWduYXR1cmUpOworICAgICAgICBsZXQgb3ZlcmxvYWRz
ID0gdGhpcy5fc2lnbmF0dXJlTWFwLmdldChzaWduYXR1cmUubmFtZSk7CisgICAgICAgIGlmICgh
b3ZlcmxvYWRzKQorICAgICAgICAgICAgdGhpcy5fc2lnbmF0dXJlTWFwLnNldChzaWduYXR1cmUu
bmFtZSwgb3ZlcmxvYWRzID0gW10pOworICAgICAgICBvdmVybG9hZHMucHVzaChzaWduYXR1cmUp
OworICAgIH0KKyAgICAKKyAgICBnZXQgc2lnbmF0dXJlcygpIHsgcmV0dXJuIHRoaXMuX3NpZ25h
dHVyZXM7IH0KKyAgICBzaWduYXR1cmVzQnlOYW1lKG5hbWUpIHsgcmV0dXJuIHRoaXMuX3NpZ25h
dHVyZU1hcC5nZXQobmFtZSk7IH0KKyAgICBnZXQgdHlwZVZhcmlhYmxlKCkgeyByZXR1cm4gdGhp
cy5fdHlwZVZhcmlhYmxlOyB9CisgICAgCisgICAgaW5oZXJpdHMob3RoZXJQcm90b2NvbCkKKyAg
ICB7CisgICAgICAgIGlmICghb3RoZXJQcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyUHJvdG9jb2wgaW5zdGFuY2VvZiBQcm90b2Nv
bFJlZikKKyAgICAgICAgICAgIG90aGVyUHJvdG9jb2wgPSBvdGhlclByb3RvY29sLnByb3RvY29s
RGVjbDsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0IG90aGVyU2lnbmF0dXJlIG9mIG90aGVy
UHJvdG9jb2wuc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZXMgPSB0aGlz
LnNpZ25hdHVyZXNCeU5hbWUob3RoZXJTaWduYXR1cmUubmFtZSk7CisgICAgICAgICAgICBpZiAo
IXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
bGV0IGZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgOiBzaWdu
YXR1cmVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHNpZ25hdHVyZS5wYXJhbWV0ZXJzLmxlbmd0
aCAhPSBvdGhlclNpZ25hdHVyZS5wYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbGV0IHR5cGVQ
YXJhbWV0ZXJzID0gc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzLmNvbmNhdCh0aGlzLnR5cGVWYXJp
YWJsZSk7CisgICAgICAgICAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlm
aWNhdGlvbkNvbnRleHQodHlwZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIGxldCBvayA9
IHRydWU7CisgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaWduYXR1cmUucGFy
YW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNpZ25hdHVy
ZS5wYXJhbWV0ZXJzW2ldLnR5cGUudW5pZnkob3RoZXJTaWduYXR1cmUucGFyYW1ldGVyc1tpXS50
eXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgICAgIGlmICh1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpIHsK
KyAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGVkUmV0dXJuVHlwZSA9CisgICAgICAg
ICAgICAgICAgICAgICAgICBzaWduYXR1cmUucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNh
dGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVycywgdW5pZmlj
YXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdWJzdGl0dXRlZFJldHVy
blR5cGUuZXF1YWxzKG90aGVyU2lnbmF0dXJlLnJldHVyblR5cGUpKQorICAgICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAg
ICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICB9CisgICAgCisgICAgaGFzSGVpcih0eXBlKQorICAgIHsKKyAgICAgICAgbGV0IHN1
YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5tYXBwaW5nKFt0aGlzLl90eXBlVmFyaWFibGVdLCBb
dHlwZV0pOworICAgICAgICBmb3IgKGxldCBhYnN0cmFjdFNpZ25hdHVyZSBvZiB0aGlzLl9zaWdu
YXR1cmVzKSB7CisgICAgICAgICAgICBsZXQgc2lnbmF0dXJlID0gc2lnbmF0dXJlLnZpc2l0KHN1
YnN0aXR1dGlvbik7CisgICAgICAgICAgICBsZXQgb3ZlcmxvYWQgPSB0aGlzLnByb2dyYW0ucmVz
b2x2ZUZ1bmNPdmVybG9hZChzaWduYXR1cmUubmFtZSwgW10sIHNpZ25hdHVyZS5wYXJhbWV0ZXJU
eXBlcyk7CisgICAgICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGVkUmV0dXJu
VHlwZSA9IG92ZXJsb2FkLmZ1bmMucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigK
KyAgICAgICAgICAgICAgICBvdmVybG9hZC5mdW5jLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51
bmlmaWNhdGlvbkNvbnRleHQpOworICAgICAgICAgICAgaWYgKCFzdWJzdGl0dXRlZFJldHVyblR5
cGUuZXF1YWxzKHNpZ25hdHVyZS5yZXR1cm5UeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAicHJvdG9jb2wgIiArIHRoaXMubmFt
ZSArICIgeyAiICsgdGhpcy5zaWduYXR1cmVzLmpvaW4oIjsgIikgKyAiOyB9IjsKKyAgICB9Cit9
CisKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xSZWYuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xSZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBQcm90b2NvbFJlZiBleHRlbmRzIFByb3RvY29sIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4sIG5hbWUp
OworICAgICAgICB0aGlzLnByb3RvY29sRGVjbCA9IG51bGw7CisgICAgfQorICAgIAorICAgIGlu
aGVyaXRzKG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvdG9jb2xEZWNsLmlu
aGVyaXRzKG90aGVyKTsKKyAgICB9CisgICAgCisgICAgaGFzSGVpcih0eXBlKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMucHJvdG9jb2xEZWNsLmhhc0hlaXIodHlwZSk7CisgICAgfQorfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9QdHJUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L1B0clR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQ
dHJUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc1NwYWNlICsgIiAiICsgdGhpcy5lbGVtZW50VHlwZSAr
ICJeIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmVmZXJlbmNlVHlwZSBleHRlbmRz
IFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgYWRkcmVzc1NwYWNlLCBlbGVtZW50VHlw
ZSkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlQWRkcmVzc1NwYWNlKGFkZHJlc3NTcGFjZSk7Cisg
ICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fYWRkcmVzc1NwYWNl
ID0gYWRkcmVzc1NwYWNlOworICAgICAgICB0aGlzLl9lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBl
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9
CisgICAgZ2V0IGFkZHJlc3NTcGFjZSgpIHsgcmV0dXJuIHRoaXMuX2FkZHJlc3NTcGFjZTsgfQor
ICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAg
Z2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICB1bmlmeUltcGwo
dW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICh0aGlzLmNvbnN0
cnVjdG9yICE9IG90aGVyLmNvbnN0cnVjdG9yKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1JldHVybi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4uanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV0dXJuIGV4dGVuZHMgTm9kZSB7CisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAg
Z2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCB2YWx1ZSgpIHsg
cmV0dXJuIHRoaXMuX3ZhbHVlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuICJ7ICIgKyB0aGlzLnN0YXRlbWVudHMuam9pbigiOyAiKTsgKyAiOyB9IjsKKyAg
ICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEyNCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBSZXdyaXRlciB7CisgICAgdmlzaXRGdW5jKG5vZGUpCisgICAgeworICAg
ICAgICByZXR1cm4gbmV3IEZ1bmMoCisgICAgICAgICAgICBub2RlLm5hbWUsIG5vZGUucmV0dXJu
VHlwZS52aXNpdCh0aGlzKSwKKyAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMubWFwKHR5
cGVQYXJtZXRlciA9PiB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpKSwKKyAgICAgICAgICAgIG5v
ZGUucGFyYW1ldGVycy5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRlci52aXNpdCh0aGlzKSkpOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAg
IHJldHVybiBuZXcgRnVuY0FyZ3VtZW50KG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMp
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IHJlc3VsdCA9IG5ldyBCbG9jayhub2RlLm9yaWdpbik7CisgICAgICAgIGZvciAobGV0IHN0YXRl
bWVudCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICByZXN1bHQuYWRkKHN0YXRlbWVu
dC52aXNpdCh0aGlzKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAg
IHZpc2l0UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1
bHQgPSBuZXcgVHlwZVJlZihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVu
dHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpKTsKKyAgICAg
ICAgcmVzdWx0LnR5cGUgPSBub2RlLnR5cGU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fQorICAgIAorICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAgeworICAgICAgICByZXR1
cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5v
ZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9k
ZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRGaWVsZChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZChu
b2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBu
ZXcgbm9kZS5jb25zdHJ1Y3Rvcihub2RlLnJvZ2lpbiwgbm9kZS5hZGRyZXNzU3BhY2UsIG5vZGUu
ZWxlbWVudFR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUo
bm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2Rl
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlU
eXBlKG5vZGUub3JpZ2luLCBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3
IEFzc2lnbm1lbnQobm9kZS5vcmlnaW4sIG5vZGUubGhzLnZpc2l0KHRoaXMpLCBub2RlLnJocy52
aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihu
b2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4obm9kZS5vcmlnaW4sIG5vZGUu
dmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAgIAorICAg
IHZpc2l0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAg
fQorCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IG5ldyBDYWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgIG5vZGUub3JpZ2luLCBub2RlLm5hbWUs
CisgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBl
QXJndW1lbnQudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5hcmd1bWVudGxpc3QubWFw
KGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL1N0cnVjdFR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
U3RydWN0VHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IFN0cnVjdFR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUs
IHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOwor
ICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMg
PSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fZmllbGRzID0gbmV3IE1hcCgpOworICAg
IH0KKyAgICAKKyAgICBhZGQoZmllbGQpCisgICAgeworICAgICAgICBpZiAodGhpcy5fZmllbGRz
LmhhcyhmaWVsZC5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihmaWVs
ZC5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRHVwbGljYXRlIGZpZWxkIG5hbWU6ICIgKyBmaWVsZC5u
YW1lKTsKKyAgICAgICAgdGhpcy5fZmllbGRzLnNldChmaWVsZC5uYW1lLCBmaWVsZCk7CisgICAg
fQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0
eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgCisg
ICAgZ2V0IGZpZWxkTmFtZXMoKSB7IHJldHVybiB0aGlzLl9maWVsZHMua2V5cygpOyB9CisgICAg
ZmllbGRCeU5hbWUobmFtZSkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmdldChuYW1lKTsgfQorICAg
IGdldCBmaWVsZHMoKSB7IHJldHVybiB0aGlzLl9maWVsZHMudmFsdWVzKCk7IH0KKyAgICBnZXQg
ZmllbGRNYXAoKSB7IHJldHVybiB0aGlzLl9maWVsZHM7IH0KKyAgICAKKyAgICBnZXQgbmFtZUNv
bnRleHQoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBOYW1lQ29udGV4dCgpOwor
ICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMudHlwZVBhcmFtZXRlcnMpCisg
ICAgfQorICAgIAorICAgIGluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAg
ICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gdGhpcy50eXBlUGFyYW1ldGVycy5sZW5ndGgp
CisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywg
Ildyb25nIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyB0byBpbnN0YW50aWF0aW9uIik7CisgICAg
ICAgIAorICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAg
ICAgCisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24ubWFwcGluZyh0aGlz
LnR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5l
dyBTdHJ1Y3RUeXBlKHRoaXMub3JpZ2luLCB0aGlzLm5hbWUsIFtdKTsKKyAgICAgICAgZm9yIChs
ZXQgZmllbGQgb2YgdGhpcy5maWVsZHMpCisgICAgICAgICAgICByZXN1bHQuYWRkKGZpZWxkLnZp
c2l0KHN1YnN0aXR1dGlvbikpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInN0cnVjdCAiICsgdGhpcy5u
YW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+IHsgIiArIEFycmF5LmZyb20odGhp
cy5maWVsZHMpLmpvaW4oIjsgIikgKyAiOyB9IjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9TdWJzdGl0dXRpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
U3Vic3RpdHV0aW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0
aXR1dGlvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN1
YnN0aXR1dGlvbiBleHRlbmRzIFJld3JpdGVyIHsKKyAgICBjb25zdHJ1Y3RvcihtYXApCisgICAg
eworICAgICAgICB0aGlzLl9tYXAgPSBtYXA7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBtYXBw
aW5nKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7CisgICAgICAgIGlmIChwYXJhbWV0
ZXJzLmxlbmd0aCAhPSBhcmd1bWVudExpc3QubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3
IEVycm9yKCJQYXJhbWV0ZXJzIGFuZCBhcmd1bWVudHMgYXJlIG1pc21hdGNoZWQiKTsKKyAgICAg
ICAgbGV0IG1hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJh
bWV0ZXJzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgbWFwLnNldChwYXJhbWV0ZXJzW2ldLCBh
cmd1bWVudExpc3RbaV0pOworICAgICAgICByZXR1cm4gbmV3IFN1YnN0aXR1dGlvbihtYXApOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBy
ZXBsYWNlbWVudCA9IHRoaXMuX21hcC5nZXQobm9kZS50eXBlKTsKKyAgICAgICAgaWYgKHJlcGxh
Y2VtZW50KSB7CisgICAgICAgICAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAg
ICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBhcmd1bWVudHMg
b24gdHlwZSB2YXJpYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUp
OworICAgIH0KKworICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxl
dCByZXBsYWNlbWVudCA9IHRoaXMuX21hcC5nZXQobm9kZS52YXJpYWJsZSk7CisgICAgICAgIGlm
IChyZXBsYWNlbWVudCkKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAg
CisgICAgICAgIHJldHVybiBzdXBlci52aXNpdFZhcmlhYmxlUmVmKG5vZGUpOworICAgIH0KK30K
KwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdWZmaXhDYWxsQXNzaWdu
bWVudCBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwg
bGhzKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9
IG5hbWU7CisgICAgICAgIHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5mdW5jID0gbnVs
bDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9Cisg
ICAgZ2V0IGxocygpIHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxocyArICIgc3VmZml4ICIgKyB0aGlzLm5hbWU7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM4IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIFR5cGUgZXh0ZW5kcyBOb2RlIHsKKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVy
biBbXTsgfQorICAgIGdldCBraW5kKCkgeyByZXR1cm4gVHlwZTsgfQorICAgIAorICAgIGluaGVy
aXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb3RvY29sLmhhc0hlaXIodGhp
cyk7CisgICAgfQorICAgIAorICAgIGdldCBpbnN0YW50aWF0ZWRUeXBlKCkgeyByZXR1cm4gdGhp
czsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvVHlwZURlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIFR5cGVEZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4s
IG5hbWUsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2lu
ID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlw
ZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7
CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0K
KyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFt
ZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCB0eXBlKCkg
eyByZXR1cm4gdGhpcy5fdHlwZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBl
T3JWYXJpYWJsZVJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JW
YXJpYWJsZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JW
YXJpYWJsZVJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IFR5cGVPclZhcmlhYmxlUmVmIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
LCBuYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0
aGlzLl9uYW1lID0gbmFtZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQor
CisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9
Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvVHlwZVJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgwIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIFR5cGVSZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUs
IHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAg
ICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgCisgICAg
Z2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyBy
ZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4gdGhp
cy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHR5cGUg
PyB0eXBlLmlzUHJpbWl0aXZlIDogZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlhdGVk
VHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlLmluc3RhbnRpYXRlKHR5cGVB
cmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkKKyAgICB7CisgICAg
ICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLnR5cGUudW5pZnlOb2RlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisg
ICAgc2V0VHlwZUFuZEFyZ3VtZW50cyh0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fbmFtZSA9IHR5cGUubmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAg
ICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAor
ICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAg
aWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUeXBlUmVmKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlw
ZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBl
QXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3Vt
ZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0p
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
OTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgVHlwZVZhcmlhYmxlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBuYW1lLCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdp
biA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3By
b3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4g
dGhpcy5fbmFtZTsgfQorICAgIGdldCBwcm90b2NvbCgpIHsgcmV0dXJuIHRoaXMuX3Byb3RvY29s
OyB9CisgICAgCisgICAgZ2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLl9wcm90b2NvbCAmJiB0aGlzLl9wcm90b2NvbC5pc1ByaW1pdGl2ZTsKKyAgICB9CisgICAg
CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIGluaGVy
aXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgaWYgKCFwcm90b2NvbCkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpCisgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHByb3Rv
Y29sKTsKKyAgICB9CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29u
dGV4dC5maW5kKHRoaXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAgICAgICAg
ICAgIHJldHVybiByZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAg
ICAgICAgCisgICAgICAgIHVuaWZpY2F0aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhlcik7Cisg
ICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRp
b25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVWYXJpYWJs
ZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgIH0KKyAgICAKKyAgICB2ZXJp
ZnlBc0FyZ3VtZW50KHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGxldCByZWFs
VGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICAKKyAgICAgICAg
Ly8gVGhlIHRoaW5nIHdlIGdldCB1bmlmaWVkIHdpdGggbXVzdCBiZSBhIHR5cGUgdmFyaWFibGUg
dGhhdCBhY2NlcHRzIGEgYnJvYWRlciBzZXQgb2YKKyAgICAgICAgLy8gdGhpbmdzIHRoYW4gd2Ug
ZG8uCisgICAgICAgIGlmICghKHJlYWxUaGlzIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKCF0aGlzLnByb3Rv
Y29sKQorICAgICAgICAgICAgcmV0dXJuICFyZWFsVGhpcy5wcm90b2NvbDsKKyAgICAgICAgCisg
ICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHJlYWxUaGlzLnByb3RvY29sKTsK
KyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQor
ICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIHJldHVybiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKS5pbmhlcml0
cyh0aGlzLnByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9VbmlmaWNhdGlvbkNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvVW5pZmljYXRpb25Db250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgVW5pZmljYXRpb25Db250ZXh0IHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBlUGFy
YW1ldGVycykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gbmV3IFNldCh0
eXBlUGFyYW1ldGVycyk7CisgICAgICAgIHRoaXMuX25leHRNYXAgPSBuZXcgTWFwKCk7CisgICAg
fQorICAgIAorICAgIHVuaW9uKGEsIGIpCisgICAgeworICAgICAgICBhID0gZmluZChhKTsKKyAg
ICAgICAgYiA9IGZpbmQoYik7CisgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgICAgICBpZiAoIWIuaXNVbmlmaWFibGUpCisgICAgICAgICAgICBb
YSwgYl0gPSBbYiwgYV07CisgICAgICAgIGlmICghYS5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAg
IHRocm93IG5ldyBFcnJvcigiQ2Fubm90IHVuaWZ5IG5vbi11bmlmaWFibGUgdGhpbmdzICIgKyBh
ICsgIiBhbmQgIiArIGIpOworICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdHlw
ZSBwYXJhbWV0ZXJzIGRvbid0IGVuZCB1cCBiZWluZyByb290cy4KKyAgICAgICAgaWYgKGEuaXNV
bmlmaWFibGUgJiYgYi5pc1VuaWZpYWJsZSAmJiB0aGlzLl90eXBlUGFyYW1ldGVycy5oYXMoYikp
CisgICAgICAgICAgICBbYSwgYl0gPSBbYiwgYV07CisKKyAgICAgICAgdGhpcy5fbmV4dE1hcC5z
ZXQoYSwgYik7CisgICAgfQorICAgIAorICAgIGZpbmQobm9kZSkKKyAgICB7CisgICAgICAgIGxl
dCBjdXJyZW50Tm9kZSA9IG5vZGU7CisgICAgICAgIGxldCBuZXh0Tm9kZSA9IHRoaXMuX25leHRN
YXAuZ2V0KGN1cnJlbnROb2RlKTsKKyAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAg
IHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgY3Vy
cmVudE5vZGUgPSBuZXh0Tm9kZTsKKyAgICAgICAgICAgIG5leHROb2RlID0gdGhpcy5fbmV4dE1h
cC5nZXQoY3VycmVudE5vZGUpOworICAgICAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aGlzLl9uZXh0TWFwLnNldChub2Rl
LCBjdXJyZW50Tm9kZSk7CisgICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICB9CisgICAg
CisgICAgZ2V0IG5vZGVzKCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7
CisgICAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9uZXh0TWFwKSB7CisgICAg
ICAgICAgICByZXN1bHQuYWRkKGtleSk7CisgICAgICAgICAgICByZXN1bHQuYWRkKHZhbHVlKTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2ZXJp
ZnkoKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiB0aGlzLl90eXBl
UGFyYW1ldGVycykgeworICAgICAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLnZlcmlmeUFzUGFy
YW1ldGVyKHRoaXMpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2YgdGhpcy5ub2RlcykgeworICAgICAgICAg
ICAgaWYgKHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhhcyh0eXBlQXJndW1lbnQpKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnQudmVyaWZ5QXNB
cmd1bWVudCh0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlzVW51bmlmaWVkKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiAhdGhpcy5fbmV4dE1hcC5zaXplKCk7CisgICAgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9WYWx1ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WYWx1
ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhbHVlIGV4
dGVuZHMgTm9kZSB7CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBWYWx1ZTsgfQorICAgIGdldCBp
c0NvbnN0ZXhwcigpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1ZhcmlhYmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zhcmlh
YmxlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVm
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFyaWFibGVS
ZWYgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisg
ICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsK
KyAgICAgICAgdGhpcy52YXJpYWJsZSA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1l
KCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJu
IHRoaXMudmFyaWFibGUuaXNDb25zdGV4cHI7IH0KKyAgICBnZXQgdW5pZnlOb2RlKCkgeyByZXR1
cm4gdGhpcy52YXJpYWJsZS51bmlmeU5vZGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1Zpc2l0b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRv
ci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZpc2l0b3IgeworICAgIHZp
c2l0UHJvZ3JhbShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5v
ZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmMobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUu
cmV0dXJuVHlwZS52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBv
ZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0
aGlzKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykKKyAg
ICAgICAgICAgIHBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRG
dW5jUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7
CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY0RlZihub2RlKQorICAgIHsKKyAgICAgICAgdmlz
aXRGdW5jKG5vZGUpOworICAgICAgICBub2RlLmJvZHkudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVu
dCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7
CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7CisgICAgfQor
ICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxl
dCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAgICAgc2lnbmF0dXJlLnZp
c2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7Cisg
ICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAg
ICAgICAgICB0eXBlQXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0
TmF0aXZlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtdGVyIG9m
IG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7CisgICAgICAg
IGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAg
ICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0
aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAgeworICAg
ICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAg
ICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBmaWVs
ZCBvZiBub2RlLmZpZWxkcykKKyAgICAgICAgICAgIGZpZWxkLnZpc2l0KHRoaXMpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBub2Rl
LnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RmllbGQobm9kZSkKKyAg
ICB7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRFbGVtZW50YWxUeXBlKG5vZGUpCisgICAgeworICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZp
c2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUobm9kZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEFycmF5UmVmVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRh
bFR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAg
eworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICAgICAgbm9kZS5u
dW1FbGVtZW50cy52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50
KG5vZGUpCisgICAgeworICAgICAgICBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9k
ZS5yaHMudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9k
ZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAg
ICAgICBpZiAobm9kZS52YWx1ZSkKKyAgICAgICAgICAgIG5vZGUudmFsdWUudmlzaXQodGhpcyk7
CisgICAgfQorICAgIAorICAgIHZpc3RJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgIH0KKyAg
ICAKKyAgICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxl
dCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFy
Z3VtZW50LnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBhcmd1bWVudCBvZiBub2RlLmFy
Z3VtZW50TGlzdCkKKyAgICAgICAgICAgIGFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0KK30K
Kwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319162</attachid>
            <date>2017-08-27 15:11:58 -0700</date>
            <delta_ts>2017-08-28 13:53:22 -0700</delta_ts>
            <desc>more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>152357</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgYWRkcmVz
c1NwYWNlcyA9IFsiY29uc3RhbnQiLCAiZGV2aWNlIiwgInRocmVhZGdyb3VwIiwgInRocmVhZCJd
OworCitmdW5jdGlvbiBpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7CisgICAgc3dpdGNo
IChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2FzZSAiZGV2aWNl
IjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
K30KKworZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAg
IGlmICghaXNBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKSkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYWRkcmVzcyBzcGFjZTogIiArIGFkZHJlc3NTcGFjZSk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFzIFRbY10gZm9y
IGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1YWdlLgorY2xh
c3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0
YW5jZW9mIEFycmF5UmVmVHlwZSB8fCBvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIg
IiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fy
cmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1F
bGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVu
dHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vs
ZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxl
bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAg
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsK
KyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBBcnJheVJlZlR5cGUpKSB7CisgICAgICAg
ICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkpCisgICAgICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIXRoaXMubnVtRWxl
bWVudHMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci5udW1FbGVtZW50cykpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBy
ZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLmVs
ZW1lbnRUeXBlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1l
bnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Bc3NpZ25tZW50LmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQXNzaWdubWVudCBleHRlbmRzIEV4cHJl
c3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbGhzLCByaHMpCisgICAgeworICAgICAg
ICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9saHMgPSBsaHM7CisgICAgICAgIHRoaXMu
X3JocyA9IHJoczsKKyAgICB9CisgICAgCisgICAgZ2V0IGxocygpIHsgcmV0dXJuIHRoaXMuX2xo
czsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0aGlzLl9yaHM7IH0KKyAgICAKKyAgICB0b1N0
cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMgKyAiID0gIiArIHRoaXMucmhz
OworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0Jsb2NrLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDggQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgQmxvY2sgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4pCisg
ICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX3N0YXRl
bWVudHMgPSBbXTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMu
X29yaWdpbjsgfQorICAgIAorICAgIGFkZChzdGF0ZW1lbnQpCisgICAgeworICAgICAgICB0aGlz
Ll9zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgZ2V0IHN0YXRl
bWVudHMoKSB7IHJldHVybiB0aGlzLl9zdGF0ZW1lbnRzOyB9CisgICAgCisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ7ICIgKyB0aGlzLnN0YXRlbWVudHMuam9pbigiOyAi
KTsgKyAiOyB9IjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9DYWxsQXNz
aWdubWVudC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DYWxsQXNzaWdubWVu
dC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DYWxsQXNzaWdubWVudC5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENhbGxBc3NpZ25t
ZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBs
aHMsIHJocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25h
bWUgPSBuYW1lOworICAgICAgICB0aGlzLl9saHMgPSBsaHM7CisgICAgICAgIHRoaXMuX3JocyA9
IHJoczsKKyAgICAgICAgdGhpcy5mdW5jID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5h
bWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGxocygpIHsgcmV0dXJuIHRoaXMu
X2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0aGlzLl9yaHM7IH0gLy8gVGhpcyBjYW4g
YmUgbnVsbC4KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5saHMgKyAiICIgKyB0aGlzLm5hbWUgKyAodGhpcy5yaHMgPyAiPSAiICsgdGhpcy5yaHMgOiAi
Iik7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENhbGxFeHByZXNzaW9uIGV4dGVu
ZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1l
bnRzLCBhcmd1bWVudExpc3QpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAg
ICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVB
cmd1bWVudHM7CisgICAgICAgIHRoaXMuX2FyZ3VtZW50TGlzdCA9IGFyZ3VtZW50TGlzdDsKKyAg
ICAgICAgdGhpcy5mdW5jID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJl
dHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlz
Ll90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGFyZ3VtZW50TGlzdCgpIHsgcmV0dXJuIHRoaXMu
X2FyZ3VtZW50TGlzdDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPigiICsgdGhpcy5h
cmd1bWVudExpc3QgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9D
aGVja2VyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDaGVja2VyIGV4dGVuZHMgVmlzaXRvciB7
CisgICAgY29uc3RydWN0b3IocHJvZ3JhbSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0g
PSBwcm9ncmFtOworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAg
IHsKKyAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykgeworICAg
ICAgICAgICAgbGV0IHNldCA9IG5ldyBTZXQoKTsKKyAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnNp
ZGVyKHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGluZy5pc1Vu
aWZpYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgc2V0LmFkZCh0aGluZyk7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBjbGFzcyBOb3RpY2VUeXBlVmFyaWFibGUgZXh0ZW5kcyBWaXNpdG9y
IHsKKyAgICAgICAgICAgICAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7
CisgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyKG5vZGUudHlwZSk7CisgICAgICAgICAgICAg
ICAgfQorICAgICAgICAgICAgICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICAgICAgICAg
ICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyKG5vZGUudmFyaWFibGUpOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBub3RpY2VUeXBl
VmFyaWFibGUgPSBuZXcgTm90aWNlVHlwZVZhcmlhYmxlKCk7CisgICAgICAgICAgICBmb3IgKGxl
dCBwYXJhbWV0ZXJUeXBlIG9mIHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcykKKyAgICAgICAgICAg
ICAgICBwYXJhbWV0ZXJUeXBlLnZpc2l0KG5vdGljZVR5cGVWYXJpYWJsZSk7CisgICAgICAgICAg
ICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycykgewor
ICAgICAgICAgICAgICAgIGlmICghc2V0Lmhhcyh0eXBlUGFyYW1ldGVyKSkKKyAgICAgICAgICAg
ICAgICAgICAgdGhyb3cgQUxUeXBlRXJyb3IodHlwZVBhcmFtZXRlci5vcmlnaW4ub3JpZ2luU3Ry
aW5nLCAiVHlwZSBwYXJhbWV0ZXIgdG8gcHJvdG9jb2wgc2lnbmF0dXJlIG5vdCBpbmZlcnJhYmxl
IGZyb20gdmFsdWUgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorICAgIAorICAgIF9jaGVja1R5cGVBcmd1bWVudHMob3JpZ2luLCB0eXBlUGFyYW1ldGVycywg
dHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVBh
cmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCBhcmd1bWVudElzVHlwZSA9
IHR5cGVBcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBUeXBlOworICAgICAgICAgICAgbGV0IHJlc3Vs
dCA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIGlmIChh
cmd1bWVudElzVHlwZSkgeworICAgICAgICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50c1tpXS5p
bmhlcml0cyh0eXBlQXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJUeXBlIGFyZ3VtZW50IGRvZXMgbm90
IGluaGVyaXQgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg
ICAgaWYgKCFyZXN1bHQuZXF1YWxzKHR5cGVQYXJhbWV0ZXJzW2ldLnR5cGUpKQorICAgICAgICAg
ICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIldy
b25nIHR5cGUgZm9yIGNvbnN0ZXhwciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAg
fQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fY2hl
Y2tUeXBlQXJndW1lbnRzKG5vZGUub3JpZ2luLCB0eXBlLnR5cGVQYXJhbWV0ZXJzLCBub2RlLnR5
cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkK
KyAgICB7CisgICAgICAgIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIAor
ICAgICAgICBpZiAobm9kZS5hZGRyZXNzU3BhY2UgPT0gInRocmVhZCIpCisgICAgICAgICAgICBy
ZXR1cm47CisgICAgICAgIAorICAgICAgICBjbGFzcyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMgZXh0
ZW5kcyBSZXdyaXRlciB7CisgICAgICAgICAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICAgICAg
ICAgIHsKKyAgICAgICAgICAgICAgICBub2RlID0gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOwor
ICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmluc3RhbnRpYXRlZFR5cGUudmlzaXQodGhpcyk7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZpc2l0UmVmZXJlbmNl
VHlwZShub2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIW5vZGUuZWxl
bWVudFR5cGUudmlzaXQobmV3IEluc3RhbnRpYXRlSW1tZWRpYXRlcygpKS5pc1ByaW1pdGl2ZSkK
KyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJp
bmcsICJJbGxlZ2FsIHBvaW50ZXIgdG8gbm9uLXByaW1pdGl2ZSB0eXBlIik7CisgICAgfQorICAg
IAorICAgIHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAgeworICAgICAgICBpZiAoIW5vZGUubnVt
RWxlbWVudHMuaXNDb25zdGV4cHIpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Io
bm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiQXJyYXkgbGVuZ3RoIG11c3QgYmUgY29uc3RleHBy
Iik7CisgICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAg
ICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgbGhzIGlzIGFzc2lnbmFibGUu
CisgICAgICAgIGxldCBsaHNUeXBlID0gbm9kZS5saHMudmlzaXQodGhpcyk7CisgICAgICAgIGxl
dCByaHNUeXBlID0gbm9kZS5yaHMudmlzaXQodGhpcyk7CisgICAgICAgIGlmICghbGhzVHlwZS5l
cXVhbHMocmhzVHlwZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5v
cmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBtaXNtYXRjaCBpbiBhc3NpZ25tZW50OiAiICsgbGhz
VHlwZSArICIgdmVyc3VzICIgKyByaHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIGxoc1R5cGU7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiByZXN1bHQudHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAg
ICB7CisgICAgICAgIGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAgICBsZXQgcmVzdWx0VHlw
ZSA9IG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXRoaXMuZnVuYy5y
ZXR1cm5WYWx1ZS5lcXVhbHMocmVzdWx0VHlwZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIlRyeWluZyB0byByZXR1cm4g
IiArIHJlc3VsdFR5cGUgKyAiIGluIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zICIgKyBmdW5jLnJl
dHVyblZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAg
ICAgICAgaWYgKCFmdW5jLnJldHVyblZhbHVlLmVxdWFscyh0aGlzLl9wcm9ncmFtLmludHJpbnNp
Y3Mudm9pZCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4u
b3JpZ2luU3RyaW5nLCAiTm9uLXZvaWQgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSB2YWx1ZSIpOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdEludExpdGVyYWwobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLl9wcm9ncmFtLmludHJpbnNpY3MuaW50MzI7CisgICAgfQorICAgIAorICAgIHZp
c2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1
bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1lbnQudmlz
aXQodGhpcyk7CisgICAgICAgIGxldCBhcmd1bWVudFR5cGVzID0gbm9kZS5hcmd1bWVudExpc3Qu
bWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgbGV0IG92ZXJs
b2FkID0gdGhpcy5fbmFtZUNvbnRleHQucHJvZ3JhbS5yZXNvbHZlRnVuY092ZXJsb2FkKAorICAg
ICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOwor
ICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9y
KG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkRpZCBub3QgZmluZCBmdW5jdGlvbiBmb3IgY2Fs
bCIpOworICAgICAgICByZXR1cm4gb3ZlcmxvYWQuZnVuYy5yZXR1cm5UeXBlLnN1YnN0aXR1dGVU
b1VuaWZpY2F0aW9uKAorICAgICAgICAgICAgb3ZlcmxvYWQuZnVuYy50eXBlUGFyYW1ldGVycywg
b3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0NvbW1hRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9Db21tYUV4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvQ29tbWFFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgQ29tbWFFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBsaXN0KQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAg
ICAgdGhpcy5fbGlzdCA9IGxpc3Q7CisgICAgfQorICAgIAorICAgIGdldCBsaXN0KCkgeyByZXR1
cm4gdGhpcy5fbGlzdDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiAiKCIgKyB0aGlzLmxpc3QudG9TdHJpbmcoKSArICIpIjsKKyAgICB9Cit9OworCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENvbnN0ZXhwclR5cGVQYXJh
bWV0ZXIgZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBl
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1
cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRydWU7IH0K
KyAgICBnZXQgaXNVbmlmaWFibGUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgdHlwZVZh
cmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlm
ICghKG90aGVyIGluc3RhbmNlb2YgVmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgICAgIGlmICghdGhpcy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIu
dHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbGV0IHJlYWxUaGlz
ID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcyk7CisgICAgICAgIGlmIChyZWFsVGhpcyAh
PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHJlYWxUaGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIpOworICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVmFy
aWFibGVSZWYpCisgICAgICAgICAgICBvdGhlciA9IG90aGVyLnZhcmlhYmxlOworICAgICAgICAK
KyAgICAgICAgdW5pZmljYXRpb25Db250ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRl
eHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlVW5pZnko
dW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzQXJn
dW1lbnQodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4dCkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVmFsdWUgeworICAgIGNvbnN0cnVjdG9y
KG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorfQpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvRmllbGQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGaWVsZCB7CisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3Jp
Z2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5f
dHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlz
Ll9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBn
ZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0K
K30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvRnVuYy5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9G
dW5jLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuYyBl
eHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJh
bWV0ZXJzLCBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7Cisg
ICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICB0aGlzLl90eXBl
UGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzID0g
cGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9u
YW1lOyB9CisgICAgZ2V0IHJldHVyblR5cGUoKSB7IHJldHVybiB0aGlzLl9yZXR1cm5UeXBlOyB9
CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7
IH0KKyAgICBnZXQgcGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7IH0KKyAg
ICBnZXQgcGFyYW1ldGVyVHlwZXMoKSB7IHJldHVybiB0aGlzLnBhcmFtZXRlcnMubWFwKHBhcmFt
ZXRlciA9PiBwYXJhbWV0ZXIudHlwZSk7IH0KKyAgICAKKyAgICBnZXQga2luZCgpIHsgcmV0dXJu
IEZ1bmM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5yZXR1cm5UeXBlICsgIiAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVy
cyArICI+KCIgKyB0aGlzLnBhcmFtZXRlcnMgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9GdW5jRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0Z1bmNEZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0RlZi5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmNEZWYgZXh0
ZW5kcyBGdW5jIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5
cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLCBib2R5KQorICAgIHsKKyAgICAgICAgc3VwZXIobmFt
ZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMpOworICAgICAgICB0aGlz
Ll9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2JvZHkgPSBib2R5OworICAgIH0KKyAg
ICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGJv
ZHkoKSB7IHJldHVybiB0aGlzLl9ib2R5OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIHsgIiArIGJvZHkgKyAiIH0iOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY1BhcmFtZXRlci5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jUGFyYW1ldGVyLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jUGFyYW1ldGVyIHsKKyAgICAvLyBUaGUg
bmFtZSBpcyBvcHRpb25hbC4gSXQncyBPSyBmb3IgaXQgdG8gYmUgbnVsbCEKKyAgICBjb25zdHJ1
Y3RvcihuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAg
ICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0
dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0K
KyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsg
IiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVu
Y1NpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jU2lnbmF0
dXJlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNTaWduYXR1cmUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9JbnRMaXRlcmFsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0lu
dExpdGVyYWwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJh
bC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEludExpdGVy
YWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQor
ICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1
ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0K
KyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgdG9TdHJp
bmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIiICsgdGhpcy5fdmFsdWU7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvSW50cmluc2ljcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIEludHJpbnNpY3MgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAg
IHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAgICAg
ICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSB2b2lkPD4iLAorICAgICAgICAgICAgKHR5cGUp
ID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnZvaWQgPSB0eXBlOworICAgICAgICAgICAgfSk7
CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZl
IHR5cGUgaW50MzI8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAgICAgICAgICAg
IHRoaXMuaW50MzIgPSB0eXBlOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5fbWFw
LnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUgZG91YmxlPD4iLAorICAg
ICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZSA9IHR5cGU7
CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgYWRkKHRoaW5nKQorICAgIHsKKyAg
ICAgICAgbGV0IGludHJpbnNpYyA9IHRoaXMuX21hcC5nZXQodGhpbmcubmFtZSk7CisgICAgICAg
IGlmICghaW50cmluc2ljKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKHRoaW5n
Lm9yaWdpbi5vcmlnaW5TdHJpbmcsICJVbnJlY29nbml6ZWQgaW50cmluc2ljOiAiICsgdGhpbmcp
OworICAgICAgICBpbnRyaW5zaWModGhpbmcpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvTGV4ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4ZXIgeworICAgIGNvbnN0cnVj
dG9yKG9yaWdpbiwgdGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsK
KyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAgICAgIHRoaXMuX2luZGV4ID0gMDsKKyAg
ICAgICAgdGhpcy5fc3RhY2sgPSBbXTsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpbmVOdW1iZXIo
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlckZvckluZGV4KHRoaXMuX2lu
ZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fb3JpZ2luICsgIjoiICsgKHRoaXMubGluZU51bWJlciArIDEpOworICAg
IH0KKyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5kZXgoaW5kZXgpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpLm1hdGNoKC9cbi9nKS5sZW5ndGg7
CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMuX2luZGV4OyB9Cisg
ICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2luZGV4ID0gdmFsdWU7IH0KKyAgICAKKyAgICBu
ZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9zdGFjay5sZW5ndGgpCisgICAgICAgICAg
ICByZXR1cm4gdGhpcy5fc3RhY2sucG9wKCk7CisgICAgICAgIAorICAgICAgICBpZiAodGhpcy5f
aW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAg
ICAgICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1lbnRCZWdpbiA9IC9cL1wqLzsKKyAgICAgICAg
Y29uc3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4gPSAvXC9cLy87CisgICAgICAgIAorICAgICAg
ICBsZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZXh0ID0gUmVnRXhw
Lmxhc3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0b2tlbiA9IG5ldyBMZXhlclRva2VuKHRoaXMs
IHRoaXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IHRl
eHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICB9OworCisgICAg
ICAgIGxldCByZWxldmFudFRleHQ7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIHJl
bGV2YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3RyaW5nKHRoaXMuX2luZGV4KTsKKyAgICAgICAg
ICAgIGlmICgvXlxzKy8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhp
cy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wqLy50ZXN0KHJlbGV2
YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSByZWxldmFudFRleHQu
c2VhcmNoKC9cKlwvLyk7CisgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgMCkKKyAgICAg
ICAgICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIpOworICAgICAg
ICAgICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZEluZGV4OworICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9cLy4qLy50ZXN0KHJlbGV2
YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBSZWdFeHAubGFzdE1h
dGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBGSVhNRTog
TWFrZSB0aGlzIGRvIFVuaWNvZGUuCisgICAgICAgIGlmICgvXlteXGRcV11cdyovLnRlc3QocmVs
ZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImlkZW50aWZpZXIiKTsKKwor
ICAgICAgICBpZiAoL15bMC05XSsvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJl
dHVybiByZXN1bHQoImludExpdGVyYWwiKTsKKworICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlz
IGhhbmRsZSBleHAtZm9ybSBsaXRlcmFscyBsaWtlIDFlMS4KKyAgICAgICAgaWYgKC9eKFswLTld
KlwuWzAtOV0rKXwoWzAtOV0rXC5bMC05XSopLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAg
ICAgICByZXR1cm4gcmVzdWx0KCJkb3VibGVMaXRlcmFsIik7CisgICAgICAgIAorICAgICAgICBp
ZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8aWZ8ZWxzZXxlbnVtfGNvbnRpbnVlfGJyZWFrfHN3
aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxlfGRvfHJldHVybnxzaXplb2Z8Y29uc3RhbnR8ZGV2
aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVyYXRvcikvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHQoImtleXdvcmQiKTsKKyAgICAgICAgCisgICAgICAgIGlm
ICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5eJnw8PlxcLV18LT58PT58PD18PT18IT18Kz18LT18
XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICBy
ZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgZmFpbCgiVW5y
ZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3aXRoOiAiICsgcmVsZXZhbnRUZXh0LnN1YnN0cmlu
ZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAgICBwdXNoKHRva2VuKQorICAgIHsKKyAgICAgICAg
dGhpcy5fc3RhY2sucHVzaCh0b2tlbik7CisgICAgfQorICAgIAorICAgIHBlZWsoKQorICAgIHsK
KyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQoKTsKKyAgICAgICAgcHVzaChyZXN1bHQpOworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmYWlsKGVycm9yKQorICAgIHsK
KyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4RXJyb3IodGhpcy5vcmlnaW5TdHJpbmcsIGVycm9y
KTsKKyAgICB9CisgICAgCisgICAgYmFja3RyYWNraW5nU2NvcGUoY2FsbGJhY2spCisgICAgewor
ICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlOworICAgICAgICB0cnkgeworICAgICAgICAg
ICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAg
IGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhFcnJvcikgeworICAgICAgICAgICAgICAgIHRoaXMu
c3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4
ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIExl
eGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9yKGxleGVyLCBvcmlnaW4sIGluZGV4LCBraW5kLCB0
ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhlcjsKKyAgICAgICAgdGhpcy5f
b3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4OworICAgICAgICB0
aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAgfQorICAg
IAorICAgIGdldCBraW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9raW5kOworICAg
IH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4
dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5kZXgoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAgIH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigp
CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbGV4ZXIubGluZU51bWJlckZvckluZGV4KHRo
aXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gKyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7
CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiTGV4
ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwgIiArIHRoaXMudGV4dCArICIsICIgKyB0aGlzLmxp
bmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNv
bnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgVHlwZU9yVmFsdWUgPSBTeW1i
b2woKTsKKworY2xhc3MgTmFtZUNvbnRleHQgeworICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOworICAgICAgICBsZXQgdHlwZUFu
ZFZhbHVlTWFwID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9tYXAuc2V0KFR5cGUsIHR5cGVB
bmRWYWx1ZU1hcCk7CisgICAgICAgIHRoaXMuX21hcC5zZXQoVmFsdWUsIHR5cGVBbmRWYWx1ZU1h
cCk7CisgICAgICAgIGZvciAobGV0IGtpbmQgb2YgbmFtZWFibGVLaW5kcykKKyAgICAgICAgICAg
IHRoaXMuX21hcC5zZXQoa2luZCwgbmV3IE1hcCgpKTsKKyAgICAgICAgdGhpcy5fZGVmaW5lZCA9
IG5ldyBTZXQoKTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9IG51bGw7CisgICAg
ICAgIHRoaXMuX2RlbGVnYXRlID0gbnVsbDsKKyAgICAgICAgdGhpcy5faW50cmluc2ljcyA9IG51
bGw7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsOworICAgIH0KKyAgICAKKyAgICBtYXBG
b3Ioa2luZCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9tYXAuZ2V0KGtpbmQp
OworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQmFk
IGtpbmQ6ICIgKyBraW5kKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisg
ICAgYWRkKHRoaW5nKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGluZy5uYW1lKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHRoaW5nLmlzTmF0aXZlKSB7CisgICAg
ICAgICAgICBpZiAoIXRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IEVycm9yKCJOYXRpdmUgZnVuY3Rpb24gaW4gYSBzY29wZSB0aGF0IGRvZXMgbm90IHJlY29nbml6
ZSBpbnRyaW5zaWNzIik7CisgICAgICAgICAgICB0aGlzLl9pbnRyaW5zaWNzLmFkZCh0aGluZyk7
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxldCBtYXAgPSBtYXBGb3IodGhpbmcua2lu
ZCk7CisgICAgICAgIGlmICh0aGluZy5raW5kID09IEZ1bmMpIHsKKyAgICAgICAgICAgIGxldCBh
cnJheSA9IG1hcC5nZXQodGhpbmcubmFtZSk7CisgICAgICAgICAgICBpZiAoIWFycmF5KQorICAg
ICAgICAgICAgICAgIG1hcC5zZXQodGhpbmcubmFtZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAg
ICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAg
ICAgICBpZiAobWFwLmhhcyh0aGluZy5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5
cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRHVwbGljYXRlIG5hbWU6ICIgKyB0
aGluZy5uYW1lKTsKKyAgICAgICAgbWFwLnNldCh0aGluZy5uYW1lLCB0aGluZyk7CisgICAgfQor
ICAgIAorICAgIGdldChraW5kLCBuYW1lKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG1h
cEZvcihraW5kID09IFR5cGVPclZhbHVlID8gVHlwZSA6IGtpbmQpLmdldChuYW1lKTsKKyAgICAg
ICAgaWYgKCFyZXN1bHQgJiYgdGhpcy5fZGVsZWdhdGUpCisgICAgICAgICAgICByZXR1cm4gdGhp
cy5fZGVsZWdhdGUuZ2V0KGtpbmQsIG5hbWUpOworICAgICAgICBpZiAoa2luZCA9PSBWYWx1ZSB8
fCBraW5kID09IFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQua2luZCAhPSBraW5kKQor
ICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgfQorICAgIAorICAgIGdldCBjdXJyZW50U3RhdGVtZW50KCkKKyAgICB7Cisg
ICAgICAgIGlmICh0aGlzLl9jdXJyZW50U3RhdGVtZW50KQorICAgICAgICAgICAgcmV0dXJuIHRo
aXMuX2N1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jdXJyZW50U3RhdGVtZW50OworICAgICAgICBy
ZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgaXNEZWZpbmVkKHRoaW5nKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuX2RlZmluZWQuaGFzKHRoaW5nKQorICAgICAgICAgICAgfHwgKHRo
aXMuX2RlbGVnYXRlICYmIHRoaXMuX2RlbGVnYXRlLmlzRGVmaW5lZCh0aGluZykpOworICAgIH0K
KyAgICAKKyAgICBkZWZpbmUodGhpbmcpCisgICAgeworICAgICAgICB0aGlzLl9kZWZpbmVkLnNl
dCh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRlZmluZUFsbCgpCisgICAgeworICAgICAgICBm
b3IgKGxldCB0aGluZyBvZiB0aGlzKQorICAgICAgICAgICAgZGVmaW5lKHRoaW5nKTsKKyAgICB9
CisgICAgCisgICAgZG9TdGF0ZW1lbnQoc3RhdGVtZW50LCBjYWxsYmFjaykKKyAgICB7CisgICAg
ICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIGNhbGxiYWNr
KCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBkZWZp
bmUoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVjb2duaXplSW50cmluc2ljcygpCisg
ICAgeworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbmV3IEludHJpbnNpY3MoKTsKKyAgICB9
CisgICAgCisgICAgZ2V0IGludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2lu
dHJpbnNpY3MpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50cmluc2ljczsKKyAgICAgICAg
aWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmlu
dHJpbnNpY3M7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBzZXQgcHJv
Z3JhbSh2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSB2YWx1ZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IHByb2dyYW0oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3Byb2dy
YW0pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbTsKKyAgICAgICAgaWYgKHRoaXMu
X2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnByb2dyYW07Cisg
ICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAqW1N5bWJvbC5pdGVyYXRvcl0o
KQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgbWFwIG9mIHRoaXMuX21hcC52YWx1ZXMoKSkgewor
ICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcy52YWx1ZXMoKSkKKyAgICAg
ICAgICAgICAgICB5aWVsZCB0eXBlOworICAgICAgICB9CisgICAgfQorfQpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9OYXRpdmVUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2
ZVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRp
dmVUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBpc1By
aW1pdGl2ZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9pc1ByaW1p
dGl2ZSA9IGlzUHJpbWl0aXZlOworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQ
YXJhbWV0ZXJzOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1bnIgdGhpcy5f
b3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0
IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5faXNQcmltaXRpdmU7IH0KKyAgICBnZXQgdHlw
ZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCBp
c05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJn
dW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMu
dHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9u
ZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICBp
ZiAoIXR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAg
ICAgIHJldHVybiBuZXcgTmF0aXZlVHlwZUluc3RhbmNlKHRoaXMsIHR5cGVBcmd1bWVudHMpOwor
ICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIm5hdGl2
ZSAiICsgKHRoaXMuaXNQcmltaXRpdmUgPyAicHJpbWl0aXZlICIgOiAiIikgKyAidHlwZSAiICsg
dGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+IjsKKyAgICB9Cit9CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTmF0aXZlVHlwZUluc3RhbmNlIGV4dGVu
ZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3IodHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0g
dHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlz
Ll90eXBlOyB9CisgICAgZ2V0IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJn
dW1lbnRzOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5fdHlwZS5pc1By
aW1pdGl2ZTsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAg
ICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlm
ICh0aGlzLnR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAg
ICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50
cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBp
ZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVy
LnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50
cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgTm9kZSB7CisgICAgdmlzaXQodmlzaXRvcikKKyAgICB7CisgICAgICAgIGxl
dCByZXR1cm5WYWx1ZSA9IHZpc2l0b3JbInZpc2l0IiArIHRoaXMuY29uc3RydWN0b3IubmFtZV0o
dGhpcyk7CisgICAgICAgIGlmICgicmV0dXJuVmFsdWUiIGluIHZpc2l0b3IpCisgICAgICAgICAg
ICByZXR1cm4gdmlzaXRvci5yZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVl
OworICAgIH0KKyAgICAKKyAgICB1bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAg
IHsKKyAgICAgICAgbGV0IHVuaWZ5VGhpcyA9IHRoaXMudW5pZnlOb2RlOworICAgICAgICBsZXQg
dW5pZnlPdGhlciA9IG90aGVyLnVuaWZ5Tm9kZTsKKyAgICAgICAgaWYgKHVuaWZ5T3RoZXIudHlw
ZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCB1bmlmeVRoaXMpKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB1bmlmeVRoaXMudW5pZnlJbXBsKHVuaWZp
Y2F0aW9uQ29udGV4dCwgdW5pZnlPdGhlcik7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1
bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKG90aGVyLnR5cGVW
YXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdGhpcykpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXI7CisgICAgfQorICAgIAorICAg
IHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGdldCB1bmlmeU5vZGUoKSB7IHJl
dHVybiB0aGlzOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAg
ICAKKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIGVxdWFs
cyhvdGhlcikKKyAgICB7CisgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5p
ZmljYXRpb25Db250ZXh0KCk7CisgICAgICAgIHJldHVybiB0aGlzLnVuaWZ5KHVuaWZpY2F0aW9u
Q29udGV4dCwgb3RoZXIpICYmIHVuaWZpY2F0aW9uQ29udGV4dC5pc1VudW5pZmllZCgpOworICAg
IH0KKyAgICAKKyAgICBzdWJzdGl0dXRlKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0KFN1YnN0aXR1dGlvbi5tYXBwaW5nKHBhcmFtZXRl
cnMsIGFyZ3VtZW50TGlzdCkpOworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0dXRlVG9VbmlmaWNh
dGlvbihwYXJhbWV0ZXJzLCB1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1
cm4gc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLm1hcCh0eXBlID0+IHVuaWZpY2F0
aW9uQ29udGV4dC5maW5kKHR5cGUpKSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvUGFyc2UuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw1ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcGFyc2UocHJvZ3JhbSwgb3JpZ2luLCB0
ZXh0KQoreworICAgIGxldCBsZXhlciA9IG5ldyBMZXhlcihvcmlnaW4sIHRleHQpOworICAgIAor
ICAgIC8vIFRoZSBoYXJkZXN0IHBhcnQgb2YgZGVhbGluZyB3aXRoIEMtbGlrZSBsYW5ndWFnZXMg
aXMgcGFyc2luZyB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnRzLgorICAgIC8vIExldCdz
IGNvbnNpZGVyIGlmIHRoaXMgaGFwcGVucyBpbiBBcnJheUxhbmcuIEhlcmUgYXJlIHRoZSB2YWxp
ZCBzdGF0ZW1lbnRzIGluIEFycmF5TGFuZyB0aGF0CisgICAgLy8gYmVnaW4gd2l0aCBhbiBpZGVu
dGlmaWVyLCBpZiB3ZSBhc3N1bWUgdGhhdCBhbnkgZXhwcmVzc2lvbiBjYW4gYmUgYSBzdGFuZGFs
b25lIHN0YXRlbWVudC4KKyAgICAvLworICAgIC8vICAgICB4OworICAgIC8vICAgICB4IDxiaW5v
cD4geTsKKyAgICAvLyAgICAgeCA8IHk7CisgICAgLy8gICAgIHggPCB5ID4gejsKKyAgICAvLyAg
ICAgeCA9IHk7CisgICAgLy8gICAgIHguZiA9IHk7CisgICAgLy8gICAgIFxleHAgPSB5OworICAg
IC8vICAgICB4WzQyXSA9IHk7CisgICAgLy8gICAgIHgoKTsKKyAgICAvLyAgICAgeDx5PigpOwor
ICAgIC8vICAgICB4IHk7CisgICAgLy8gICAgIHg8eT4gejsKKyAgICAvLyAgICAgZGV2aWNlIHhb
XSB5OworICAgIC8vICAgICB4WzQyXSB5OworICAgIC8vICAgICBkZXZpY2UgeF4geTsKKyAgICAv
LyAgICAgdGhyZWFkIHheXiB5OworICAgIC8vICAgICB4XnRocmVhZF50aHJlYWQgeTsKKyAgICAv
LyAgICAgeF5kZXZpY2VedGhyZWFkIHk7CisgICAgLy8KKyAgICAvLyBUaGlzIGhhcyB0d28gcHJv
YmxlbSBhcmVhczoKKyAgICAvLworICAgIC8vICAgICAtIHg8eT56IGNhbiBwYXJzZSB0d28gZGlm
ZmVyZW50IHdheXMgKGFzICh4IDwgeSkgPiB6IG9yIHg8eT4geikuCisgICAgLy8gICAgIC0geFs0
Ml0gY291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9yIGEgdmFyaWFibGUgZGVjbGFy
YXRpb24uCisgICAgLy8gICAgIC0geDx5PiBjb3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1l
bnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAvLworICAgIC8vIFdlIHNvbHZlIHRo
ZSBmaXJzdCBwcm9ibGVtIGJ5IGZvcmJpZGRpbmcgZXhwcmVzc2lvbnMgYXMgc3RhdGVtZW50cy4g
VGhlIGxhY2sgb2YgZnVuY3Rpb24KKyAgICAvLyBwb2ludGVycyBtZWFucyB0aGF0IHdlIGNhbiBz
dGlsbCBhbGxvdyBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudHMgLSB1bmxpa2UgaW4gQywgdGhvc2Ug
Y2Fubm90CisgICAgLy8gaGF2ZSBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgYXMgdGhlIGNhbGxlZS4g
VGhlIHJlbWFpbmluZyB0d28gcHJvYmxlbXMgYXJlIHNvbHZlZCBieQorICAgIC8vIGJhY2t0cmFj
a2luZy4gSW4gYWxsIG90aGVyIHJlc3BlY3RzLCB0aGlzIGlzIGEgc2ltcGxlIHJlY3Vyc2l2ZSBk
ZXNjZW50IHBhcnNlci4KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmljQ29uc3VtZShjYWxsYmFj
aykKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLm5leHQoKTsKKyAgICAgICAgaWYg
KCF0b2tlbikKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUi
KTsKKyAgICAgICAgaWYgKGNhbGxiYWNrKHRva2VuKSkKKyAgICAgICAgICAgIGxleGVyLmZhaWwo
IlVuZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50ZXh0ICsgIjsgZXhwZWN0ZWQ6ICIgKyB0ZXh0
KTsKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBjb25z
dW1lKC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNDb25zdW1lKHRva2Vu
ID0+IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gY29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljQ29uc3Vt
ZSh0b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlv
biBhc3NlcnROZXh0KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgbGV4ZXIucHVzaChjb25zdW1l
KC4uLnRleHRzKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGdlbmVyaWNUZXN0KGNhbGxi
YWNrKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBp
ZiAodG9rZW4gJiYgY2FsbGJhY2sodG9rZW4pKQorICAgICAgICAgICAgcmV0dXJuIHRva2VuOwor
ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdGVzdCguLi50
ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljVGVzdCh0b2tlbiA9PiB0ZXh0cy5p
bmNsdWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRlc3RLaW5k
KGtpbmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Rlc3QodG9rZW4gPT4gdG9rZW4u
a2luZCA9PSBraW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5Q29uc3VtZSguLi50
ZXh0cykKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0KC4uLnRleHRzKTsKKyAgICAg
ICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5Q29uc3VtZUtpbmQoa2luZCkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0S2luZChraW5kKTsKKyAgICAgICAgaWYg
KHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQcm90b2NvbFJlZigpCisgICAgewor
ICAgICAgICBsZXQgcHJvdG9jb2xUb2tlbiA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7Cisg
ICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xSZWYocHJvdG9jb2xUb2tlbi5vcmlnaW4sIHByb3Rv
Y29sVG9rZW4udGV4dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGNvbnN1bWVFbmRPZlR5
cGVBcmdzKCkKKyAgICB7CisgICAgICAgIGxldCByaWdodFNoaWZ0ID0gdHJ5Q29uc3VtZSgiPj4i
KTsKKyAgICAgICAgaWYgKHJpZ2h0U2hpZnQpCisgICAgICAgICAgICBsZXhlci5wdXNoKG5ldyBM
ZXhlclRva2VuKGxleGVyLCByaWdodFNoaWZ0Lm9yaWdpbiwgcmlnaHRTaGlmdC5pbmRleCwgcmln
aHRTaGlmdC5raW5kLCAiPiIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29uc3VtZSgi
PiIpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVQYXJhbWV0ZXJzKCkKKyAg
ICB7CisgICAgICAgIGlmICghdGVzdCgiPCIpKQorICAgICAgICAgICAgcmV0dXJuIFtdOworICAg
ICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9IFtdOworICAgICAgICBjb25zdW1lKCI8Iik7Cisg
ICAgICAgIHdoaWxlICghdGVzdCgiPiIpKSB7CisgICAgICAgICAgICBsZXQgY29uc3RleHByID0g
bGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgICAgIGxldCB0eXBl
ID0gcGFyc2VUeXBlKCk7CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgi
aWRlbnRpZmllciIpOworICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIp
OworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RleHByVHlwZVBhcmFtZXRlcih0eXBl
Lm9yaWdpbiwgbmFtZSwgdHlwZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChj
b25zdGV4cHIpCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29uc3RleHByKTsKKyAgICAg
ICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlk
ZW50aWZpZXIiKTsKKyAgICAgICAgICAgICAgICBsZXQgcHJvdG9jb2wgPSB0cnlDb25zdW1lKCI6
IikgPyBwYXJzZVByb3RvY29sUmVmKCkgOiBudWxsOworICAgICAgICAgICAgICAgIHJlc3VsdC5w
dXNoKG5ldyBUeXBlVmFyaWFibGUobmFtZS5vcmlnaW4sIG5hbWUudGV4dCwgcHJvdG9jb2wpKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVBcmdz
KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlVGVybSgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47CisgICAgICAgIGlmICh0b2tlbiA9
IHRyeUNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIikpCisgICAgICAgICAgICByZXR1cm4gbmV3IFZh
cmlhYmxlUmVmKHRva2VuLm9yaWdpbiwgdG9rZW4udGV4dCk7CisgICAgICAgIGlmICh0b2tlbiA9
IHRyeUNvbnN1bWVLaW5kKCJpbnRMaXRlcmFsIikpIHsKKyAgICAgICAgICAgIGxldCBpbnRWZXJz
aW9uID0gdG9rZW4udGV4dCB8IDA7CisgICAgICAgICAgICBpZiAoaW50VmVyc2lvbiAhPSB0b2tl
bi50ZXh0KQorICAgICAgICAgICAgICAgIGxleGVyLmZhaWwoIkludGVnZXIgbGl0ZXJhbCBpcyBu
b3QgMzItYml0IGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50TGl0ZXJhbCh0
b2tlbi5vcmlnaW4sIGludFZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FOiBO
ZWVkIHN1cHBvcnQgZm9yIGZsb2F0IGxpdGVyYWxzIGFuZCBwcm9iYWJseSBvdGhlciBsaXRlcmFs
cyB0b28uCisgICAgICAgIHRva2VuID0gY29uc3VtZUtpbmQoImRvdWJsZUxpdGVyYWwiKTsKKyAg
ICAgICAgcmV0dXJuIG5ldyBEb3VibGVMaXRlcmFsKHRva2VuLm9yaWdpbiwgK3Rva2VuLnRleHQp
OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNvbnN0ZXhwcigpCisgICAgeworICAg
ICAgICByZXR1cm4gcGFyc2VUZXJtKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNl
VHlwZUFyZ3VtZW50cygpCisgICAgeworICAgICAgICBpZiAoIXRlc3QoIjwiKSkKKyAgICAgICAg
ICAgIHJldHVybiBbXTsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1bHQgPSBbXTsKKyAgICAg
ICAgY29uc3VtZSgiPCIpOworICAgICAgICB3aGlsZSAoIXRlc3QoIj4iKSkgeworICAgICAgICAg
ICAgLy8gSXQncyBwb3NzaWJsZSBmb3IgYSBjb25zdGV4cHIgb3IgdHlwZSBjYW4gc3ludGFjdGlj
YWxseSBvdmVybGFwIGluIHRoZSBzaW5nbGUKKyAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgY2Fz
ZS4gTGV0J3MgY29uc2lkZXIgdGhlIHBvc3NpYmlsaXRpZXM6CisgICAgICAgICAgICAvLworICAg
ICAgICAgICAgLy8gICAgIFQgICAgICAgICAgY291bGQgYmUgdHlwZSBvciBjb25zdGV4cHIKKyAg
ICAgICAgICAgIC8vICAgICBUW10gICAgICAgIG9ubHkgdHlwZQorICAgICAgICAgICAgLy8gICAg
IFRbNDJdICAgICAgb25seSB0eXBlIChjb25zdGV4cHIgY2Fubm90IGRvIGluZGV4aW5nKQorICAg
ICAgICAgICAgLy8gICAgIDQyICAgICAgICAgb25seSBjb25zdGV4cHIKKyAgICAgICAgICAgIC8v
CisgICAgICAgICAgICAvLyBJbiB0aGUgZnV0dXJlIHdlJ2xsIGFsbG93IGNvbnN0ZXhwcnMgdG8g
ZG8gbW9yZSB0aGluZ3MsIGFuZCB0aGVuIHdlJ2xsIHN0aWxsIGhhdmUKKyAgICAgICAgICAgIC8v
IHRoZSBwcm9ibGVtIHRoYXQgc29tZXRoaW5nIG9mIHRoZSBmb3JtIFRbMV1bMl1bM10uLi4gY2Fu
IGVpdGhlciBiZSBhIHR5cGUgb3IgYQorICAgICAgICAgICAgLy8gY29uc3RleHByLCBhbmQgd2Ug
Y2FuIGZpZ3VyZSBvdXQgaW4gdGhlIGNoZWNrZXIgd2hpY2ggaXQgaXMuCisgICAgICAgICAgICBs
ZXQgdHlwZU9yVmFyaWFibGVSZWYgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7Cisg
ICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7Cisg
ICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgiLCIsICI+IiwgIj4+Iik7CisgICAgICAgICAgICAg
ICAgcmV0dXJuIG5ldyBUeXBlT3JWYXJpYWJsZVJlZihyZXN1bHQub3JpZ2luLCByZXN1bHQudGV4
dCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICh0eXBlT3JWYXJpYWJsZVJlZikK
KyAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlT3JWYXJpYWJsZVJlZik7CisgICAgICAg
ICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgY29uc3RleHByID0gbGV4ZXIuYmFja3Ry
YWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcGFy
c2VDb25zdGV4cHIoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgiLCIsICI+Iiwg
Ij4+Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAg
ICAgfSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICAg
ICAgcmVzdWx0LnB1c2goY29uc3RleHByKQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VUeXBlKCkpOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgIH0KKyAgICAgICAgY29uc3VtZUVuZE9mVHlwZUFyZ3MoKTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VUeXBlKCkKKyAgICB7Cisg
ICAgICAgIGxldCB0b2tlbjsKKyAgICAgICAgbGV0IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgbGV0
IGFkZHJlc3NTcGFjZUNvbnN1bWVkID0gZmFsc2U7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNv
bnN1bWUoLi4uYWRkcmVzc1NwYWNlcykpCisgICAgICAgICAgICBhZGRyZXNzU3BhY2UgPSB0b2tl
bi50ZXh0OworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRp
ZmllciIpOworICAgICAgICBsZXQgdHlwZUFyZ3VtZW50cyA9IHBhcnNlVHlwZUFyZ3VtZW50cygp
OworICAgICAgICBsZXQgdHlwZSA9IG5ldyBUeXBlUmVmKG5hbWUub3JpZ2luLCBuYW1lLnRleHQs
IHR5cGVBcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAgZnVuY3Rpb24gZ2V0QWRkcmVzc1Nw
YWNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkcmVzc1NwYWNlQ29uc3VtZWQgPSB0cnVl
OworICAgICAgICAgICAgaWYgKGFkZHJlc3NTcGFjZSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
YWRkcmVzc1NwYWNlOworICAgICAgICAgICAgcmV0dXJuIHRyeUNvbnN1bWUoLi4uYWRkcmVzc1Nw
YWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHdoaWxlICh0b2tlbiA9IHRyeUNv
bnN1bWUoIl4iLCAiWyIpKSB7CisgICAgICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiXiIpIHsK
KyAgICAgICAgICAgICAgICB0eXBlID0gbmV3IFB0clR5cGUodG9rZW4ub3JpZ2luLCBnZXRBZGRy
ZXNzU3BhY2UoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0cnlDb25zdW1lKCJdIikpIHsKKyAg
ICAgICAgICAgICAgICB0eXBlID0gbmV3IEFycmF5UmVmVHlwZSh0b2tlbi5vcmlnaW4sIGdldEFk
ZHJlc3NTcGFjZSgpLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVR5cGUodG9r
ZW4ub3JpZ2luLCB0eXBlLCBwYXJzZUNvbnN0ZXhwcigpKTsKKyAgICAgICAgICAgIGNvbnN1bWUo
Il0iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGFkZHJlc3NTcGFjZSAmJiAh
YWRkcmVzc1NwYWNlQ29uc3VtZWQpCisgICAgICAgICAgICBsZXhlci5mYWlsKCJBZGRyZXNzIHNw
YWNlIHNwZWNpZmllZCBmb3IgdHlwZSB0aGF0IGRvZXMgbm90IG5lZWQgYWRkcmVzcyBzcGFjZSIp
OworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlVHlwZURlZigpCisgICAgeworICAgICAgICBsZXQgb3JpZ2luID0gY29uc3VtZSgi
dHlwZSIpLm9yaWdpbjsKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmll
ciIpLnRleHQ7CisgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHBhcnNlVHlwZVBhcmFtZXRl
cnMoKTsKKyAgICAgICAgY29uc3VtZSgiPSIpOworICAgICAgICBsZXQgdHlwZSA9IHBhcnNlVHlw
ZSgpOworICAgICAgICBjb25zdW1lKCI7Iik7CisgICAgICAgIHJldHVybiBuZXcgVHlwZURlZihv
cmlnaW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlKTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gZ2VuZXJpY1BhcnNlTGVmdCh0ZXh0cywgbmV4dFBhcnNlciwgY29uc3RydWN0b3IpCisg
ICAgeworICAgICAgICBsZXQgbGVmdCA9IG5leHRQYXJzZXIoKTsKKyAgICAgICAgbGV0IHRva2Vu
OworICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1lKC4uLnRleHRzKSkKKyAgICAgICAg
ICAgIGxlZnQgPSBjb25zdHJ1Y3Rvcih0b2tlbiwgbGVmdCwgbmV4dFBhcnNlcigpKTsKKyAgICAg
ICAgcmV0dXJuIGxlZnQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTGVmdE9wZXJh
dG9yQ2FsbCh0ZXh0cywgbmV4dFBhcnNlcikKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmlj
UGFyc2VMZWZ0KAorICAgICAgICAgICAgdGV4dHMsIG5leHRQYXJzZXIsCisgICAgICAgICAgICAo
dG9rZW4sIGxlZnQsIHJpZ2h0KSA9PgorICAgICAgICAgICAgICAgIG5ldyBDYWxsRXhwcmVzc2lv
bih0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBbXSwgW2xlZnQsIHJpZ2h0
XSkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNhbGxFeHByZXNzaW9uKCkKKyAg
ICB7CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAg
ICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgY29u
c3VtZSgiKCIpOworICAgICAgICBsZXQgYXJndW1lbnRMaXN0ID0gW107CisgICAgICAgIHdoaWxl
ICghdGVzdCgiKSIpKSB7CisgICAgICAgICAgICBhcmd1bWVudExpc3QucHVzaChwYXJzZUV4cHJl
c3Npb24oKSk7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lKCIpIik7CisgICAgICAgIHJl
dHVybiBuZXcgQ2FsbEV4cHJlc3Npb24obmFtZS5vcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMs
IGFyZ3VtZW50TGlzdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVT
dWZmaXgoKQorICAgIHsKKyAgICAgICAgbGV0IHNpbXBsZUNhc2UgPSBsZXhlci5iYWNrdHJhY2tp
bmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICBsZXQgbGVmdCA9IHBhcnNlVGVybSgpOworICAg
ICAgICAgICAgbGV0IHRva2VuOworICAgICAgICAgICAgd2hpbGUgKHRva2VuID0gdHJ5Q29uc3Vt
ZSgiKysiLCAiLS0iLCAiLiIsICItPiIsICJbIikpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2gg
KHRva2VuLnRleHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlICIrKyI6CisgICAgICAgICAgICAg
ICAgY2FzZSAiLS0iOgorICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IFN1ZmZpeENhbGxB
c3NpZ25tZW50KHRva2VuLm9yaWdpbiwgIm9wZXJhdG9yIiArIHRva2VuLnRleHQsIGxlZnQpOwor
ICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICIuIjoKKyAg
ICAgICAgICAgICAgICBjYXNlICItPiI6CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tlbi50
ZXh0ID09ICItPiIpCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IERlcmVmZXJl
bmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIGxlZnQpOworICAgICAgICAgICAgICAgICAgICBs
ZWZ0ID0gbmV3IERvdEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0LCBjb25zdW1lS2luZCgi
aWRlbnRpZmllciIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAg
ICAgY2FzZSAiWyI6IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcGFyc2VFeHBy
ZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIl0iKTsKKyAgICAgICAgICAg
ICAgICAgICAgbGVmdCA9IG5ldyBJbmRleEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0LCBp
bmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJy
b3IoIkJhZCB0b2tlbjogIiArIHRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgfSk7CisgICAgICAgIGlmIChz
aW1wbGVDYXNlKQorICAgICAgICAgICAgcmV0dXJuIHNpbXBsZUNhc2U7CisgICAgICAgIAorICAg
ICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVzc2lvbigpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVBvc3NpYmxlUHJlZml4KCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbjsKKyAg
ICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiKysiLCAiLS0iLCAiKyIsICItIiwgIiEiLCAi
fiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWxsQXNzaWdubWVudCh0b2tlbi5vcmlnaW4s
ICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBwYXJzZVBvc3NpYmxlUHJlZml4KCkpOworICAgICAg
ICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJeIikpCisgICAgICAgICAgICByZXR1cm4gbmV3IERl
cmVmZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2libGVQcmVmaXgoKSk7
CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIlxcIikpCisgICAgICAgICAgICByZXR1
cm4gbmV3IEFkZHJlc3NPZkV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBwYXJzZVBvc3NpYmxlUHJl
Zml4KCkpOworICAgICAgICByZXR1cm4gcGFyc2VQb3NzaWJsZVN1ZmZpeCgpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUHJvZHVjdCgpCisgICAgeworICAgICAgICBy
ZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiKiIsICIvIiwgIiUiXSwgcGFyc2VQb3NzaWJs
ZVByZWZpeCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVTdW0oKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIisiLCAiLSJdLCBw
YXJzZVBvc3NpYmxlUHJvZHVjdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9z
c2libGVTaGlmdCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxs
KFsiPDwiLCAiPj4iXSwgcGFyc2VQb3NzaWJsZVN1bSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlUG9zc2libGVSZWxhdGlvbmFsSW5lcXVhbGl0eSgpCisgICAgeworICAgICAgICBy
ZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiPCIsICI+IiwgIjw9IiwgIj0+Il0sIHBhcnNl
UG9zc2libGVTaGlmdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVS
ZWxhdGlvbmFsRXF1YWxpdHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNQYXJzZUxl
ZnQoCisgICAgICAgICAgICBbIj09IiwgIiE9Il0sIHBhcnNlUG9zc2libGVSZWxhdGlvbmFsSW5l
cXVhbGl0eSwKKyAgICAgICAgICAgICh0b2tlbiwgbGVmdCwgcmlnaHQpID0+IHsKKyAgICAgICAg
ICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IENhbGxFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgIm9w
ZXJhdG9yPT0iLCBbXSwgW2xlZnQsIHJpZ2h0XSk7CisgICAgICAgICAgICAgICAgaWYgKHRva2Vu
LnRleHQgPT0gIiE9IikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IENhbGxFeHBy
ZXNzaW9uKHRva2VuLm9yaWdpbiwgIm9wZXJhdG9yISIsIFtdLCBbcmVzdWx0XSk7CisgICAgICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlQml0d2lzZUFuZCgpCisgICAgeworICAgICAgICByZXR1
cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiJiJdLCBwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEVx
dWFsaXR5KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VY
b3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIl4iXSwg
cGFyc2VQb3NzaWJsZUJpdHdpc2VBbmQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJz
ZVBvc3NpYmxlQml0d2lzZU9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVy
YXRvckNhbGwoWyJ8Il0sIHBhcnNlUG9zc2libGVCaXR3aXNlWG9yKTsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24odGV4dHMsIG5leHRQYXJzZXIp
CisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAgICAgIHRl
eHRzLCBuZXh0UGFyc2VyLAorICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkgPT4gbmV3
IExvZ2ljYWxFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgdG9rZW4udGV4dCwgbGVmdCwgcmlnaHQp
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUxvZ2ljYWxBbmQoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdExvZ2ljYWxFeHByZXNzaW9uKFsiJiYiXSwg
cGFyc2VQb3NzaWJsZUJpdHdpc2VPcik7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNl
UG9zc2libGVMb2dpY2FsT3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdExvZ2lj
YWxFeHByZXNzaW9uKFsifHwiXSwgcGFyc2VQb3NzaWJsZUxvZ2ljYWxBbmQpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlVGVybmFyeUNvbmRpdGlvbmFsKCkKKyAgICB7
CisgICAgICAgIGxldCBwcmVkaWNhdGUgPSBwYXJzZVBvc3NpYmxlTG9naWNhbE9yKCk7CisgICAg
ICAgIGxldCBvcGVyYXRvciA9IHRyeUNvbnN1bWUoIj8iKTsKKyAgICAgICAgaWYgKCFvcGVyYXRv
cikKKyAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGU7CisgICAgICAgIHJldHVybiBuZXcgVGVy
bmFyeUV4cHJlc3Npb24ob3BlcmF0b3Iub3JpZ2luLCBwcmVkaWNhdGUsIHBhcnNlUG9zc2libGVB
c3NpZ25tZW50KCksIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KCkpOworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlQXNzaWdubWVudChtb2RlKQorICAgIHsKKyAgICAgICAg
bGV0IGxocyA9IHBhcnNlUG9zc2libGVUZXJuYXJ5Q29uZGl0aW9uYWwoKTsKKyAgICAgICAgbGV0
IG9wZXJhdG9yID0gdHJ5Q29uc3VtZSgiPSIsICIrPSIsICItPSIsICIqPSIsICIvPSIsICIlPSIs
ICJePSIsICJ8PSIsICImPSIpOworICAgICAgICBpZiAoIW9wZXJhdG9yKSB7CisgICAgICAgICAg
ICBpZiAobW9kZSA9PSAicmVxdWlyZWQiKQorICAgICAgICAgICAgICAgIGxleGVyLmZhaWwoIkV4
cGVjdGVkIGFzc2lnbm1lbnQiKTsKKyAgICAgICAgICAgIHJldHVybiBsaHM7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKG9wZXJhdG9yLnRleHQgPT0gIj0iKQorICAgICAgICAgICAgcmV0dXJuIG5l
dyBBc3NpZ25tZW50KG9wZXJhdG9yLm9yaWdpbiwgbGhzLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVu
dCgpKTsKKyAgICAgICAgbGV0IG5hbWUgPSAib3BlcmF0b3IiICsgb3BlcmF0b3IudGV4dC5zdWJz
dHJpbmcoMCwgdGVybS5vcGVyYXRvci5sZW5ndGggLSAxKTsKKyAgICAgICAgcmV0dXJuIG5ldyBD
YWxsQXNzaWdubWVudChvcGVyYXRvci5vcmlnaW4sIG5hbWUsIGxocywgcGFyc2VQb3NzaWJsZUFz
c2lnbm1lbnQoKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQXNzaWdubWVudCgp
CisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoInJlcXVpcmVk
Iik7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRWZmZWN0ZnVsRXhwcmVzc2lvbigp
CisgICAgeworICAgICAgICBsZXQgYXNzaWdubWVudCA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3Bl
KCgpID0+IHsgcmV0dXJuIHBhcnNlQXNzaWdubWVudCgpOyB9KTsKKyAgICAgICAgaWYgKGFzc2ln
bm1lbnQpCisgICAgICAgICAgICByZXR1cm4gYXNzaWdubWVudDsKKyAgICAgICAgcmV0dXJuIHBh
cnNlQ2FsbEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gZ2VuZXJpY1Bh
cnNlQ29tbWFFeHByZXNzaW9uKGZpbmFsRXhwcmVzc2lvblBhcnNlcikKKyAgICB7CisgICAgICAg
IGxldCBsaXN0ID0gW107CisgICAgICAgIGxldCBvcmlnaW4gPSBsZXhlci5wZWVrKCk7CisgICAg
ICAgIGlmICghb3JpZ2luKQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiVW5leHBlY3RlZCBlbmQg
b2YgZmlsZSIpOworICAgICAgICBvcmlnaW4gPSBvcmlnaW4ub3JpZ2luOworICAgICAgICBmb3Ig
KDs7KSB7CisgICAgICAgICAgICBsZXQgZWZmZWN0ZnVsRXhwcmVzc2lvbiA9IGxleGVyLmJhY2t0
cmFja2luZ1Njb3BlKCgpID0+IHsgcmV0dXJuIHBhcnNlRWZmZWN0ZnVsRXhwcmVzc2lvbigpOyB9
KTsKKyAgICAgICAgICAgIGlmICghZWZmZWN0ZnVsRXhwcmVzc2lvbikgeworICAgICAgICAgICAg
ICAgIGxpc3QucHVzaChmaW5hbEV4cHJlc3Npb25QYXJzZXIoKSk7CisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0LnB1c2goZWZmZWN0ZnVsRXhw
cmVzc2lvbik7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENvbW1hRXhwcmVzc2lv
bihvcmlnaW4sIGxpc3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNvbW1hRXhw
cmVzc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1BhcnNlQ29tbWFFeHByZXNz
aW9uKHBhcnNlUG9zc2libGVBc3NpZ25tZW50KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
cGFyc2VFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUNvbW1hRXhwcmVz
c2lvbigpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUFzc2lnbm1lbnRTdGF0ZW1l
bnQoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IGdlbmVyaWNQYXJzZUNvbW1hRXhwcmVz
c2lvbihwYXJzZUVmZmVjdGZ1bEV4cHJlc3Npb24pOworICAgICAgICBjb25zdW1lKCI7Iik7Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUmV0
dXJuKCkKKyAgICB7CisgICAgICAgIGNvbnN1bWUoInJldHVybiIpOworICAgICAgICByZXR1cm4g
cGFyc2VFeHByZXNzaW9uKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlU3RhdGVt
ZW50KCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAg
aWYgKHRva2VuLnRleHQgPT0gIjsiKSB7CisgICAgICAgICAgICBsZXhlci5uZXh0KCk7CisgICAg
ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9rZW4udGV4dCA9
PSAicmV0dXJuIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVJldHVybigpOworICAgICAgICBp
ZiAodG9rZW4udGV4dCA9PSAiYnJlYWsiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQnJlYWso
KTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImNvbnRpbnVlIikKKyAgICAgICAgICAgIHJl
dHVybiBwYXJzZUNvbnRpbnVlKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJ3aGlsZSIp
CisgICAgICAgICAgICByZXR1cm4gcGFyc2VXaGlsZSgpOworICAgICAgICBpZiAodG9rZW4udGV4
dCA9PSAiZG8iKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlRG8oKTsKKyAgICAgICAgaWYgKHRv
a2VuLnRleHQgPT0gImZvciIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VGb3IoKTsKKyAgICAg
ICAgbGV0IGNvbW1hRXhwcmVzc2lvbiA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKCgpID0+IHsg
cmV0dXJuIHBhcnNlQXNzaWdubWVudFN0YXRlbWVudCgpOyB9KTsKKyAgICAgICAgaWYgKGNvbW1h
RXhwcmVzc2lvbikKKyAgICAgICAgICAgIHJldHVybiBjb21tYUV4cHJlc3Npb247CisgICAgICAg
IHJldHVybiBwYXJzZVZhcmlhYmxlRGVjbCgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZUJsb2NrKCkKKyAgICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1lKCJ7Iikub3Jp
Z2luOworICAgICAgICBsZXQgYmxvY2sgPSBuZXcgQmxvY2sob3JpZ2luKTsKKyAgICAgICAgd2hp
bGUgKCF0ZXN0KCJ9IikpIHsKKyAgICAgICAgICAgIGxldCBzdGF0ZW1lbnQgPSBwYXJzZVN0YXRl
bWVudCgpOworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCkKKyAgICAgICAgICAgICAgICBibG9j
ay5wdXNoKHN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgifSIpOworICAg
ICAgICByZXR1cm4gYmxvY2s7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRnVuY0Rl
ZigpCisgICAgeworICAgICAgICBsZXQgcmV0dXJuVHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAg
ICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIikudGV4dDsKKyAgICAgICAgbGV0
IHR5cGVQYXJhbWV0ZXJzID0gcGFyc2VUeXBlUGFyYW1ldGVycygpOworICAgICAgICBjb25zdW1l
KCIoIik7CisgICAgICAgIGxldCBwYXJhbWV0ZXJzID0gW107CisgICAgICAgIHdoaWxlICghdGVz
dCgiKSIpKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1c2gocGFyc2VQYXJhbWV0ZXIoKSk7
CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lKCIpIik7CisgICAgICAgIGxldCBibG9jayA9
IHBhcnNlQmxvY2soKTsKKyAgICAgICAgcmV0dXJuIEZ1bmNEZWYocmV0dXJuVHlwZS5vcmlnaW4s
IG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLCBib2R5KTsKKyAg
ICB9CisgICAgCisgICAgZm9yICg7OykgeworICAgICAgICBsZXQgdG9rZW4gPSBsZXhlci5wZWVr
KCk7CisgICAgICAgIGlmICghdG9rZW4pCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGlm
ICh0b2tlbi50ZXh0ID09ICI7IikKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAg
ZWxzZSBpZiAodG9rZW4udGV4dCA9PSAidHlwZSIpCisgICAgICAgICAgICBwYXJzZVR5cGVEZWYo
KTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAibmF0aXZlIikKKyAgICAgICAgICAg
IHBhcnNlTmF0aXZlVHlwZSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJzdHJ1
Y3QiKQorICAgICAgICAgICAgcGFyc2VTdHJ1Y3RUeXBlKCk7CisgICAgICAgIGVsc2UgaWYgKHRv
a2VuLnRleHQgPT0gImVudW0iKQorICAgICAgICAgICAgcGFyc2VFbnVtKCk7CisgICAgICAgIGVs
c2UgaWYgKHRva2VuLnRleHQgPT0gInByb3RvY29sIikKKyAgICAgICAgICAgIHBhcnNlUHJvdG9j
b2xEZWNsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcnNlRnVuY0RlZigpOworICAg
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL1Byb2dyYW0uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMTUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7
CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50cyA9IFtdOworICAgICAgICB0aGlzLl9m
dW5jdGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVzID0gbmV3IE1hcCgpOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgdG9wTGV2ZWxTdGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5f
dG9wTGV2ZWxTdGF0ZW1lbnRzOyB9CisgICAgZ2V0IGZ1bmN0aW9ucygpIHsgcmV0dXJuIHRoaXMu
X2Z1bmN0aW9uczsgfQorICAgIGdldCB0eXBlcygpIHsgcmV0dXJuIHRoaXMuX3R5cGVzOyB9Cisg
ICAgCisgICAgYWRkVG9wTGV2ZWxTdGF0ZW1lbnQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAg
c3RhdGVtZW50LnByb2dyYW0gPSB0aGlzOworICAgICAgICBpZiAoc3RhdGVtZW50IGluc3RhbmNl
b2YgRnVuYykgeworICAgICAgICAgICAgbGV0IGFycmF5ID0gdGhpcy5fZnVuY3Rpb25zLmdldChz
dGF0ZW1lbnQubmFtZSk7CisgICAgICAgICAgICBpZiAoIWFycmF5KQorICAgICAgICAgICAgICAg
IHRoaXMuX2Z1bmN0aW9ucy5zZXQoc3RhdGVtZW50Lm5hbWUsIGFycmF5ID0gW10pOworICAgICAg
ICAgICAgYXJyYXkucHVzaChzdGF0ZW1lbnQpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlbWVu
dCBpbnN0YW5jZW9mIFR5cGUpCisgICAgICAgICAgICB0aGlzLl90eXBlcy5zZXQoc3RhdGVtZW50
Lm5hbWUsIHN0YXRlbWVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBF
cnJvcigiU3RhdGVtZW50IGlzIG5vdCBhIGZ1bmN0aW9uIG9yIHR5cGU6ICIgKyBzdGF0ZW1lbnQp
OworICAgICAgICB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpOworICAg
IH0KKyAgICAKKyAgICByZXNvbHZlRnVuY092ZXJsb2FkKG5hbWUsIHR5cGVBcmd1bWVudHMsIGFy
Z3VtZW50VHlwZXMpCisgICAgeworICAgICAgICBsZXQgZnVuY3Rpb25zID0gdGhpcy5mdW5jdGlv
bnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAoIWZ1bmN0aW9ucykKKyAgICAgICAgICAgIHJldHVy
biBudWxsOworICAgICAgICAKKyAgICAgICAgZm9yIChsZXQgZnVuYyBvZiBmdW5jdGlvbnMpIHsK
KyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAmJiB0eXBlQXJndW1lbnRzLmxl
bmd0aCAhPSBmdW5jLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudFR5cGVzLmxlbmd0aCAhPSBmdW5jLnBhcmFt
ZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0
IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQoZnVuYy50eXBlUGFy
YW1ldGVycyk7CisgICAgICAgICAgICBsZXQgb2sgPSB0cnVlOworICAgICAgICAgICAgZm9yIChs
ZXQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAg
ICAgbGV0IGFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpXTsKKyAgICAgICAgICAgICAgICBsZXQg
cGFyYW1ldGVyID0gZnVuYy50eXBlUGFyYW1ldGVyc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAo
IWFyZ3VtZW50LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgcGFyYW1ldGVyKSkgeworICAgICAg
ICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW9rKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBh
cmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhcmd1bWVu
dFR5cGVzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgZnVuYy5wYXJhbWV0ZXJzW2ldLnR5
cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGlmICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIXVu
aWZpY2F0aW9uQ29udGV4dC52ZXJpZnkoKSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAg
ICAgICAgICAgIGxldCBzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMgPSAhdHlwZUFyZ3VtZW50cy5s
ZW5ndGg7CisgICAgICAgICAgICBpZiAoc2hvdWxkQnVpbGRUeXBlQXJndW1lbnRzKQorICAgICAg
ICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBbXTsKKyAgICAgICAgICAgIGZvciAobGV0IHR5cGVQ
YXJhbWV0ZXIgb2YgZnVuYy50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIGxldCB0
eXBlQXJndW1lbnQgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0eXBlUGFyYW1ldGVyKTsKKyAg
ICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50ID09IHR5cGVQYXJhbWV0ZXIpIHsKKyAgICAg
ICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzaG91bGRCdWlsZFR5cGVBcmd1
bWVudHMpCisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMucHVzaCh0eXBlQXJndW1l
bnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIHJldHVybiB7ZnVuYywgdW5pZmljYXRpb25Db250ZXh0
LCB0eXBlQXJndW1lbnRzfTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIG51
bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAgICBs
ZXQgcmVzdWx0ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVu
dCBvZiB0aGlzLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3Rh
dGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb3RvY29sLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29s
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2wg
ZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAg
ICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJl
dHVybiBQcm90b2NvbDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9j
b2xEZWNsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xEZWNsIGV4
dGVuZHMgUHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7Cisg
ICAgICAgIHN1cGVyKG9yaWdpbiwgbmFtZSkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtd
OworICAgICAgICB0aGlzLl9zaWduYXR1cmVNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMu
X3R5cGVWYXJpYWJsZSA9IG5ldyBUeXBlVmFyaWFibGUob3JpZ2luLCBuYW1lLCBudWxsKTsKKyAg
ICB9CisgICAgCisgICAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAgICAgIC8v
IE5PVEU6IEFueSB0eXBlIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIHNpZ25hdHVyZSBtdXN0IGJl
IGluZmVyYWJsZSBmcm9tIHRoZSB2YWx1ZQorICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAgICAg
ICAvLyBGSVhNRTogQ2hlY2sgdGhpcyEgKE9PUFMhKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVz
LnB1c2goc2lnbmF0dXJlKTsKKyAgICAgICAgbGV0IG92ZXJsb2FkcyA9IHRoaXMuX3NpZ25hdHVy
ZU1hcC5nZXQoc2lnbmF0dXJlLm5hbWUpOworICAgICAgICBpZiAoIW92ZXJsb2FkcykKKyAgICAg
ICAgICAgIHRoaXMuX3NpZ25hdHVyZU1hcC5zZXQoc2lnbmF0dXJlLm5hbWUsIG92ZXJsb2FkcyA9
IFtdKTsKKyAgICAgICAgb3ZlcmxvYWRzLnB1c2goc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IHNpZ25hdHVyZXMoKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVzOyB9CisgICAgc2ln
bmF0dXJlc0J5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVNYXAuZ2V0KG5hbWUp
OyB9CisgICAgZ2V0IHR5cGVWYXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGVWYXJpYWJsZTsg
fQorICAgIAorICAgIGluaGVyaXRzKG90aGVyUHJvdG9jb2wpCisgICAgeworICAgICAgICBpZiAo
IW90aGVyUHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAg
ICAgIGlmIChvdGhlclByb3RvY29sIGluc3RhbmNlb2YgUHJvdG9jb2xSZWYpCisgICAgICAgICAg
ICBvdGhlclByb3RvY29sID0gb3RoZXJQcm90b2NvbC5wcm90b2NvbERlY2w7CisgICAgICAgIAor
ICAgICAgICBmb3IgKGxldCBvdGhlclNpZ25hdHVyZSBvZiBvdGhlclByb3RvY29sLnNpZ25hdHVy
ZXMpIHsKKyAgICAgICAgICAgIGxldCBzaWduYXR1cmVzID0gdGhpcy5zaWduYXR1cmVzQnlOYW1l
KG90aGVyU2lnbmF0dXJlLm5hbWUpOworICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVzKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNl
OworICAgICAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIDogc2lnbmF0dXJlcykgeworICAgICAg
ICAgICAgICAgIGlmIChzaWduYXR1cmUucGFyYW1ldGVycy5sZW5ndGggIT0gb3RoZXJTaWduYXR1
cmUucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHNpZ25h
dHVyZS50eXBlUGFyYW1ldGVycy5jb25jYXQodGhpcy50eXBlVmFyaWFibGUpOworICAgICAgICAg
ICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KHR5
cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBsZXQgb2sgPSB0cnVlOworICAgICAgICAg
ICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2lnbmF0dXJlLnBhcmFtZXRlcnMubGVuZ3RoOyAr
K2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzaWduYXR1cmUucGFyYW1ldGVyc1tpXS50
eXBlLnVuaWZ5KG90aGVyU2lnbmF0dXJlLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAg
ICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
ICAgICBpZiAoIW9rKQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
ICAgICBpZiAodW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKSB7CisgICAgICAgICAgICAgICAg
ICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPQorICAgICAgICAgICAgICAgICAgICAgICAg
c2lnbmF0dXJlLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnMsIHVuaWZpY2F0aW9uQ29udGV4dCk7Cisg
ICAgICAgICAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhvdGhl
clNpZ25hdHVyZS5yZXR1cm5UeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0g
dHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmb3VuZCkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAor
ICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBTdWJz
dGl0dXRpb24ubWFwcGluZyhbdGhpcy5fdHlwZVZhcmlhYmxlXSwgW3R5cGVdKTsKKyAgICAgICAg
Zm9yIChsZXQgYWJzdHJhY3RTaWduYXR1cmUgb2YgdGhpcy5fc2lnbmF0dXJlcykgeworICAgICAg
ICAgICAgbGV0IHNpZ25hdHVyZSA9IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pOworICAg
ICAgICAgICAgbGV0IG92ZXJsb2FkID0gdGhpcy5wcm9ncmFtLnJlc29sdmVGdW5jT3ZlcmxvYWQo
c2lnbmF0dXJlLm5hbWUsIFtdLCBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAgICAg
ICAgaWYgKCFvdmVybG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPSBvdmVybG9hZC5m
dW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAg
b3ZlcmxvYWQuZnVuYy50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0
KTsKKyAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhzaWduYXR1
cmUucmV0dXJuVHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAg
eworICAgICAgICByZXR1cm4gInByb3RvY29sICIgKyB0aGlzLm5hbWUgKyAiIHsgIiArIHRoaXMu
c2lnbmF0dXJlcy5qb2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQorCisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1Byb3RvY29sUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1By
b3RvY29sUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
UHJvdG9jb2xSZWYgZXh0ZW5kcyBQcm90b2NvbCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBu
YW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luLCBuYW1lKTsKKyAgICAgICAgdGhpcy5w
cm90b2NvbERlY2wgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBpbmhlcml0cyhvdGhlcikKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVjbC5pbmhlcml0cyhvdGhlcik7Cisg
ICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
LnByb3RvY29sRGVjbC5oYXNIZWlyKHR5cGUpOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1B0clR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlw
ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHRyVHlwZSBleHRlbmRzIFJl
ZmVyZW5jZVR5cGUgeworICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQor
ICAgIHsKKyAgICAgICAgaWYgKCFvdGhlciBpbnN0YW5jZW9mIFB0clR5cGUpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRo
aXMuZWxlbWVudFR5cGUgKyAiXiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9SZWZlcmVuY2VUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVy
ZW5jZVR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNl
VHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJlZmVy
ZW5jZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFkZHJlc3NT
cGFjZSwgZWxlbWVudFR5cGUpCisgICAgeworICAgICAgICB2YWxpZGF0ZUFkZHJlc3NTcGFjZShh
ZGRyZXNzU3BhY2UpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRo
aXMuX2FkZHJlc3NTcGFjZSA9IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5
cGUgPSBlbGVtZW50VHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBhZGRyZXNzU3BhY2UoKSB7IHJldHVybiB0aGlzLl9h
ZGRyZXNzU3BhY2U7IH0KKyAgICBnZXQgZWxlbWVudFR5cGUoKSB7IHJldHVybiB0aGlzLl9lbGVt
ZW50VHlwZTsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVyLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL1Jlc29sdmVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1Jlc29sdmVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IFRoaXMgb25seSByZXNvbHZlcyBuYW1lcy4gQWZ0ZXIgdGhpcyBwaGFzZSBydW5zLCBhbGwgbmFt
ZXMgd2lsbCBiZSByZXNvbHZlZC4gVGhpcyBtZWFucyB0aGF0IGFsbAorLy8gWFlaUmVmIG9iamVj
dHMgbm93IGtub3cgd2hvIHRoZXkgcmVzb2x2ZSB0by4gVGhpcyBkb2VzIG5vdCB5ZXQgYWxsb3cg
dHlwZSBhbmFseXNpcywgYmVjYXVzZSB0aGVyZQorLy8gYXJlIHN0aWxsIFR5cGVEZWZzLiBUaGlz
IHRocm93cyB0eXBlIGVycm9ycyBmb3IgZmFpbGVkIG5hbWUgcmVzb2x1dGlvbnMgYW5kIGZvciB0
aGluZ3MgdGhhdCBhcmUKKy8vIG1vcmUgY29udmVuaWVudCB0byBjaGVjayBoZXJlIHRoYW4gaW4g
dGhlIENoZWNrZXIuIFRoaXMgdXN1YWxseSBpbnZvbHZlcyB0aGluZ3MgdGhhdCBuZWVkIHRvIGJl
CisvLyBjaGVja2VkIGJlZm9yZSBUeXBlUmVmVG9UeXBlRGVmU2tpcHBlci4KK2NsYXNzIFJlc29s
dmVyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgLy8gSXQncyB0b3RhbGx5IE9LIHRvIGluc3RhbnRp
YXRlIHRoaXMgd2l0aCB6ZXJvIGFyZ3VtZW50cyAoaS5lLiBwYXNzaW5nIHVuZGVmaW5lZCBmb3Ig
Ym90aCBvZgorICAgIC8vIHRoZW0pIGlmIHlvdSdyZSBjcmVhdGluZyBhIENoZWNrZXIgdG8gdmlz
aXQgYSBQcm9ncmFtLgorICAgIGNvbnN0cnVjdG9yKG5hbWVDb250ZXh0KQorICAgIHsKKyAgICAg
ICAgdGhpcy5fbmFtZUNvbnRleHQgPSBuYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlz
aXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFt
ZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5wcm9ncmFt
ID0gbm9kZTsKKyAgICAgICAgbmFtZUNvbnRleHQucmVjb2duaXplSW50cmluc2ljcygpOworICAg
ICAgICBub2RlLmludHJpbnNpY3MgPSBuYW1lQ29udGV4dC5pbnRyaW5zaWNzOworICAgICAgICBm
b3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAg
ICBuYW1lQ29udGV4dC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcg
Q2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2Rl
LnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmRvU3RhdGVtZW50
KCgpID0+IHN0YXRlbWVudC52aXNpdChjaGVja2VyKSk7CisgICAgfQorICAgIAorICAgIF92aXNp
dFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2RlKQorICAgIHsKKyAgICAgICAg
bGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAg
ICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7Cisg
ICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICB0
eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1l
Q29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jKG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKHRoaXMuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRC
dWlsZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KGNo
ZWNrZXIpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQor
ICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEZ1bmNEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjb250ZXh0V2l0aFR5cGVQYXJh
bWV0ZXJzID0gdGhpcy5fdmlzaXRUeXBlUGFyYW1ldGVyc0FuZEJ1aWxkTmFtZUNvbnRleHQobm9k
ZSk7CisgICAgICAgIGxldCBjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzID0gbmV3IENoZWNrZXIo
Y29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIG5vZGUucmV0dXJuVHlwZS52aXNp
dChjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgbGV0IGNvbnRleHRXaXRoUGFy
YW1ldGVycyA9IG5ldyBOYW1lQ29udGV4dChjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAg
ICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykgeworICAgICAgICAg
ICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMpOworICAgICAgICAg
ICAgY29udGV4dFdpdGhQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOworICAgICAgICB9CisgICAg
ICAgIGxldCBjaGVja2VyV2l0aFBhcmFtZXRlcnMgPSBuZXcgQ2hlY2tlcihjb250ZXh0V2l0aFBh
cmFtZXRlcnMpOworICAgICAgICBub2RlLmJvZHkudmlzaXQoY2hlY2tlcldpdGhQYXJhbWV0ZXJz
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQp
KTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAg
ICAgICAgIHN0YXRlbWVudC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQ
cm90b2NvbERlY2wobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBO
YW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250ZXh0LmFkZChu
b2RlLnR5cGVWYXJpYWJsZSk7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFt
ZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVz
KQorICAgICAgICAgICAgc2lnbmF0dXJlLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5l
dyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQ
YXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgdHlwZVBhcmFt
ZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1l
dGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVD
b250ZXh0KTsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4
dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0
IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgdHlw
ZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBl
UGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2Vy
KG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisg
ICAgICAgICAgICBmaWVsZC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgX3Jlc29s
dmVUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBmb3IgKGxldCBp
ID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCB0
eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOworICAgICAgICAgICAgaWYgKHR5cGVBcmd1
bWVudCBpbnN0YW5jZW9mIFR5cGVPclZhcmlhYmxlUmVmKSB7CisgICAgICAgICAgICAgICAgbGV0
IHRoaW5nID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFR5cGVPclZhbHVlLCB0eXBlQXJndW1lbnQu
bmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCF0aGluZykKKyAgICAgICAgICAgICAgICAgICAg
bmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkNvdWxkIG5vdCBmaW5k
IHR5cGUgb3IgdmFyaWFibGUgbmFtZWQgIiArIHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAg
ICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBWYWx1ZSkgeworICAgICAgICAgICAgICAgICAg
ICB0eXBlQXJndW1lbnRbaV0gPSBuZXcgVmFyaWFibGVSZWYodHlwZUFyZ3VtZW50Lm9yaWdpbiwg
dHlwZUFyZ3VtZW50Lm5hbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAg
ICAgICAgICB0eXBlQXJndW1lbnRbaV0gPSBuZXcgVHlwZVJlZih0eXBlQXJndW1lbnQub3JpZ2lu
LCB0eXBlQXJndW1lbnQubmFtZSwgW10pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisg
ICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50W2ldIGluc3RhbmNlb2YgVmFsdWUKKyAgICAgICAg
ICAgICAgICAmJiAhdHlwZUFyZ3VtZW50W2ldLmlzQ29uc3RleHByKQorICAgICAgICAgICAgICAg
IHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJFeHBlY3Rl
ZCBjb25zdGV4cHIiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYo
bm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Jlc29sdmVUeXBlQXJndW1lbnRzKG5vZGUudHlw
ZUFyZ3VtZW50cyk7CisgICAgICAgIAorICAgICAgICBsZXQgdHlwZSA9IHRoaXMuX25hbWVDb250
ZXh0LmdldChUeXBlLCBub2RlLm5hbWUpOworICAgICAgICBpZiAoIXR5cGUpCisgICAgICAgICAg
ICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiQ291bGQg
bm90IGZpbmQgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgaWYgKCF0aGlzLl9u
YW1lQ29udGV4dC5pc0RlZmluZWQodHlwZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBl
RXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiSWxsZWdhbCBmb3J3YXJkIHVzZSBvZiB0
eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBub2RlLnR5cGUgPSB0eXBlOworICAg
ICAgICAKKyAgICAgICAgaWYgKHR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9IG5vZGUudHlw
ZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3Jp
Z2luLm9yaWdpblN0cmluZywgIldyb25nIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50cyIpOworICAg
ICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kp
IHsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJJc1R5cGUgPSB0eXBlLnR5cGVQYXJhbWV0ZXJz
W2ldIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlOworICAgICAgICAgICAgbGV0IGFyZ3VtZW50SXNU
eXBlID0gbm9kZS50eXBlQXJndW1lbnRzW2ldIGluc3RhbmNlb2YgVHlwZTsKKyAgICAgICAgICAg
IG5vZGUudHlwZUFyZ3VtZW50c1tpXS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIGlmIChwYXJh
bWV0ZXJJc1R5cGUgJiYgIWFyZ3VtZW50SXNUeXBlKQorICAgICAgICAgICAgICAgIHRocm93IG5l
dyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiRXhwZWN0ZWQgdHlwZSwgYnV0IGdv
dCB2YWx1ZSBhdCBhcmd1bWVudCAjIiArIGkpOworICAgICAgICAgICAgaWYgKCFwYXJhbWV0ZXJJ
c1R5cGUgJiYgYXJndW1lbnRJc1R5cGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlw
ZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJFeHBlY3RlZCB2YWx1ZSwgYnV0IGdvdCB0eXBl
IGF0IGFyZ3VtZW50ICMiICsgaSk7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci52aXNpdFR5
cGVSZWYobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQor
ICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25h
bWVDb250ZXh0KTsKKyAgICAgICAgbmFtZUNvbnRleHQuZGVmaW5lQWxsKCk7CisgICAgICAgIG5v
ZGUuZWxlbWVudFR5cGUudmlzaXQobmV3IENoZWNrZXIobmFtZUNvbnRleHQpKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3Vs
dCA9IHRoaXMuX25hbWVDb250ZXh0LmdldChWYWx1ZSwgbm9kZS5uYW1lKTsKKyAgICAgICAgaWYg
KCFyZXN1bHQpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4u
b3JpZ2luU3RyaW5nLCAiQ291bGQgbm90IGZpbmQgdmFyaWFibGUgbmFtZWQgIiArIG5vZGUubmFt
ZSk7CisgICAgICAgIG5vZGUudmFyaWFibGUgPSByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZp
c2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICBub2RlLmZ1bmMgPSB0aGlzLl9uYW1lQ29u
dGV4dC5jdXJyZW50U3RhdGVtZW50OworICAgICAgICBzdXBlci52aXNpdFJldHVybihub2RlKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fcmVzb2x2ZVR5cGVBcmd1bWVudHMobm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICAg
ICAgc3VwZXIudmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9SZXR1cm4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV0dXJuIGV4dGVu
ZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB2YWx1ZSkKKyAgICB7CisgICAgICAg
IHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAg
IGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9CisgICAgCisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ7ICIgKyB0aGlzLnN0YXRlbWVudHMuam9pbigiOyAi
KTsgKyAiOyB9IjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRl
ci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXdyaXRlciB7CisgICAgdmlzaXRGdW5jKG5v
ZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmMoCisgICAgICAgICAgICBub2RlLm5h
bWUsIG5vZGUucmV0dXJuVHlwZS52aXNpdCh0aGlzKSwKKyAgICAgICAgICAgIG5vZGUudHlwZVBh
cmFtZXRlcnMubWFwKHR5cGVQYXJtZXRlciA9PiB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpKSwK
KyAgICAgICAgICAgIG5vZGUucGFyYW1ldGVycy5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRlci52
aXNpdCh0aGlzKSkpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNQYXJhbWV0ZXIobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY0FyZ3VtZW50KG5vZGUubmFtZSwgbm9kZS50
eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQorICAg
IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBCbG9jayhub2RlLm9yaWdpbik7CisgICAgICAg
IGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICByZXN1
bHQuYWRkKHN0YXRlbWVudC52aXNpdCh0aGlzKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7Cisg
ICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlwZVJlZihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBu
b2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQo
dGhpcykpKTsKKyAgICAgICAgcmVzdWx0LnR5cGUgPSBub2RlLnR5cGU7CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAg
eworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRDb25zdGV4cHJU
eXBlUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IENvbnN0ZXhwclR5
cGVQYXJhbWV0ZXIobm9kZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMp
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGaWVsZChub2RlKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIG5ldyBGaWVsZChub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhp
cykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBuZXcgbm9kZS5jb25zdHJ1Y3Rvcihub2RlLnJvZ2lpbiwgbm9kZS5hZGRy
ZXNzU3BhY2UsIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdFB0clR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVm
ZXJlbmNlVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9k
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiBuZXcgQXJyYXlUeXBlKG5vZGUub3JpZ2luLCBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRo
aXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAg
ICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQobm9kZS5vcmlnaW4sIG5vZGUubGhzLnZpc2l0KHRo
aXMpLCBub2RlLnJocy52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFi
bGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4obm9k
ZS5vcmlnaW4sIG5vZGUudmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIG5vZGU7CisgICAgfQorCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIG5ldyBDYWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgIG5vZGUub3Jp
Z2luLCBub2RlLm5hbWUsCisgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVB
cmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5h
cmd1bWVudGxpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIFN0cnVjdFR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3Jp
Z2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5f
dHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fZmllbGRzID0g
bmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICBhZGQoZmllbGQpCisgICAgeworICAgICAgICBp
ZiAodGhpcy5fZmllbGRzLmhhcyhmaWVsZC5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBB
TFR5cGVFcnJvcihmaWVsZC5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRHVwbGljYXRlIGZpZWxkIG5h
bWU6ICIgKyBmaWVsZC5uYW1lKTsKKyAgICAgICAgdGhpcy5fZmllbGRzLnNldChmaWVsZC5uYW1l
LCBmaWVsZCk7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFt
ZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0
ZXJzOyB9CisgICAgCisgICAgZ2V0IGZpZWxkTmFtZXMoKSB7IHJldHVybiB0aGlzLl9maWVsZHMu
a2V5cygpOyB9CisgICAgZmllbGRCeU5hbWUobmFtZSkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmdl
dChuYW1lKTsgfQorICAgIGdldCBmaWVsZHMoKSB7IHJldHVybiB0aGlzLl9maWVsZHMudmFsdWVz
KCk7IH0KKyAgICBnZXQgZmllbGRNYXAoKSB7IHJldHVybiB0aGlzLl9maWVsZHM7IH0KKyAgICBn
ZXQgaXNQcmltaXRpdmUoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRydWU7CisgICAg
ICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKQorICAgICAgICAgICAgcmVzdWx0ICY9
IGZpZWxkLnR5cGUuaXNQcmltaXRpdmU7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIGdldCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0g
bmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhp
cy50eXBlUGFyYW1ldGVycykKKyAgICB9CisgICAgCisgICAgaW5zdGFudGlhdGUodHlwZUFyZ3Vt
ZW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSB0aGlzLnR5
cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihv
cmlnaW4ub3JpZ2luU3RyaW5nLCAiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGlu
c3RhbnRpYXRpb24iKTsKKyAgICAgICAgCisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBO
YW1lQ29udGV4dCgpOworICAgICAgICAKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IFN1YnN0
aXR1dGlvbi5tYXBwaW5nKHRoaXMudHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpOworICAg
ICAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cnVjdFR5cGUodGhpcy5vcmlnaW4sIHRoaXMubmFtZSwg
W10pOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxkcykKKyAgICAgICAgICAg
IHJlc3VsdC5hZGQoZmllbGQudmlzaXQoc3Vic3RpdHV0aW9uKSk7CisgICAgICAgIHJldHVybiBy
ZXN1bHQ7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVy
biAic3RydWN0ICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4g
eyAiICsgQXJyYXkuZnJvbSh0aGlzLmZpZWxkcykuam9pbigiOyAiKSArICI7IH0iOworICAgIH0K
K30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgU3Vic3RpdHV0aW9uIGV4dGVuZHMgUmV3cml0ZXIgeworICAgIGNv
bnN0cnVjdG9yKG1hcCkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG1hcDsKKyAgICB9Cisg
ICAgCisgICAgc3RhdGljIG1hcHBpbmcocGFyYW1ldGVycywgYXJndW1lbnRMaXN0KQorICAgIHsK
KyAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoICE9IGFyZ3VtZW50TGlzdC5sZW5ndGgpCisg
ICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlcnMgYW5kIGFyZ3VtZW50cyBhcmUg
bWlzbWF0Y2hlZCIpOworICAgICAgICBsZXQgbWFwID0gbmV3IE1hcCgpOworICAgICAgICBmb3Ig
KGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBtYXAu
c2V0KHBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50TGlzdFtpXSk7CisgICAgICAgIHJldHVybiBuZXcg
U3Vic3RpdHV0aW9uKG1hcCk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQor
ICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChub2RlLnR5cGUp
OworICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChub2RlLnR5cGVB
cmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBl
Y3RlZCB0eXBlIGFyZ3VtZW50cyBvbiB0eXBlIHZhcmlhYmxlIik7CisgICAgICAgICAgICByZXR1
cm4gcmVwbGFjZW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBzdXBl
ci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgfQorCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2Rl
KQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChub2RlLnZh
cmlhYmxlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50KQorICAgICAgICAgICAgcmV0dXJuIHJl
cGxhY2VtZW50OworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0VmFyaWFibGVS
ZWYobm9kZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdWZmaXhDYWxs
QXNzaWdubWVudC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdWZmaXhDYWxs
QXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9TdWZmaXhD
YWxsQXNzaWdubWVudC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIFN1ZmZpeENhbGxBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBuYW1lLCBsaHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOwor
ICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAg
ICAgICB0aGlzLmZ1bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0
dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsgIiBz
dWZmaXggIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1R5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZSBleHRlbmRzIE5vZGUgeworICAgIGdldCB0eXBl
UGFyYW1ldGVycygpIHsgcmV0dXJuIFtdOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBUeXBl
OyB9CisgICAgCisgICAgaW5oZXJpdHMocHJvdG9jb2wpCisgICAgeworICAgICAgICByZXR1cm4g
cHJvdG9jb2wuaGFzSGVpcih0aGlzKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGluc3RhbnRpYXRl
ZFR5cGUoKSB7IHJldHVybiB0aGlzOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5
cGVEZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZi5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZURlZiBleHRlbmRzIFR5cGUgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZVBhcmFtZXRlcnMsIHR5cGUpCisgICAgewor
ICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAg
ICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0
dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsg
fQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJz
OyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZU9yVmFyaWFibGVSZWYgZXh0ZW5kcyBOb2RlIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4g
PSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBn
ZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJl
dHVybiB0aGlzLl9uYW1lOyB9CisKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVJlZiBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0
cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRo
aXMudHlwZSA9IG51bGw7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1l
bnRzOworICAgIH0KKyAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9
CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVBcmd1
bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGlzUHJpbWl0
aXZlKCkgeyByZXR1cm4gdHlwZSA/IHR5cGUuaXNQcmltaXRpdmUgOiBmYWxzZTsgfQorICAgIAor
ICAgIGdldCBpbnN0YW50aWF0ZWRUeXBlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5
cGUuaW5zdGFudGlhdGUodHlwZUFyZ3VtZW50cyk7CisgICAgfQorICAgIAorICAgIGdldCB1bmlm
eU5vZGUoKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoKQor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZS51bmlmeU5vZGU7CisgICAgICAgIHJldHVybiB0
aGlzOworICAgIH0KKyAgICAKKyAgICBzZXRUeXBlQW5kQXJndW1lbnRzKHR5cGUsIHR5cGVBcmd1
bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl9uYW1lID0gdHlwZS5uYW1lOworICAgICAgICB0
aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3Vt
ZW50czsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3Ro
ZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFR5cGVSZWYpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMudHlwZS51bmlmeSh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBpZiAodGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCAhPSBvdGhlci50eXBlQXJndW1l
bnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChsZXQg
aSA9IDA7IGkgPCB0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAg
IGlmICghdGhpcy50eXBlQXJndW1lbnRzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3Ro
ZXIudHlwZUFyZ3VtZW50c1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygp
CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlQXJndW1l
bnRzICsgIj4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZlRv
VHlwZURlZlNraXBwZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJl
ZlRvVHlwZURlZlNraXBwZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZVJlZlRvVHlwZURlZlNraXBwZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBUeXBlUmVmVG9UeXBlRGVmU2tpcHBlciBleHRlbmRzIFZpc2l0b3Igewor
ICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gbmV3IFNl
dCgpOworICAgIH0KKyAgICAKKyAgICBfZG9WaXNpdCh0aGluZywgY2FsbGJhY2spCisgICAgewor
ICAgICAgICBpZiAodGhpcy5fdmlzaXRpbmcuaGFzKHRoaW5nKSkKKyAgICAgICAgICAgIHRocm93
IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiUmVjdXJzaXZlIFR5
cGVEZWYiKTsKKyAgICAgICAgdGhpcy5fdmlzaXRpbmcuYWRkKHRoaW5nKTsKKyAgICAgICAgdHJ5
IHsKKyAgICAgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAg
ICAgICB0aGlzLl92aXNpdGluZy5kZWxldGUodGhpbmcpOworICAgICAgICB9CisgICAgfQorICAg
IAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fZG9WaXNpdChu
b2RlLCAoKSA9PiB7CisgICAgICAgICAgICBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAg
ICAgICAgICBpZiAobm9kZS50eXBlIGluc3RhbmNlb2YgVHlwZURlZikgeworICAgICAgICAgICAg
ICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KG5vZGUu
dHlwZS50eXBlUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3Vt
ZW50cy5sZW5ndGggIT0gbm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAg
ICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhcmd1bWVudC9wYXJhbWV0ZXIgbWlzbWF0Y2gg
KHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGVhcmxpZXIpIik7CisgICAgICAgICAgICAgICAgZm9y
IChsZXQgaSA9IDA7IGkgPCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpCisgICAgICAg
ICAgICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRl
eHQsIG5vZGUudHlwZS50eXBlUGFyYW1ldGVyc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKCF1
bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5l
dyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUeXBlIHJlZmVyZW5jZSB0
byBhIHR5cGUgZGVmaW5pdGlvbiB2aW9sYXRlcyBwcm90b2NvbCBjb25zdHJhaW50cyIpOworICAg
ICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxldCBuZXdUeXBlID0gbm9kZS50eXBlLnN1
YnN0aXR1dGVUb1VuaWZpY2F0aW9uKG5vZGUudHlwZS50eXBlUGFyYW1ldGVycywgdW5pZmljYXRp
b25Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBuZXdUeXBlLnZpc2l0KHRoaXMpOworICAgICAg
ICAgICAgICAgIG5vZGUuc2V0VHlwZUFuZEFyZ3VlbW50cyhuZXdUeXBlLCBbXSk7CisgICAgICAg
ICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5
cGVWYXJpYWJsZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFi
bGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVZhcmlhYmxl
IGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBwcm90b2NvbCkK
KyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3Byb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorICAg
IAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBwcm90b2Nv
bCgpIHsgcmV0dXJuIHRoaXMuX3Byb3RvY29sOyB9CisgICAgCisgICAgZ2V0IGlzUHJpbWl0aXZl
KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9wcm90b2NvbCAmJiB0aGlzLl9wcm90b2Nv
bC5pc1ByaW1pdGl2ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1
cm4gdHJ1ZTsgfQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAg
aWYgKCFwcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIXRo
aXMucHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0
aGlzLnByb3RvY29sLmluaGVyaXRzKHByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdHlwZVZh
cmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlm
ICghKG90aGVyIGluc3RhbmNlb2YgVHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAg
ICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiByZWFsVGhpcy51
bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICAgICAgCisgICAgICAgIHVuaWZp
Y2F0aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhlcik7CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIpOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc0FyZ3VtZW50KHVuaWZpY2F0
aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29u
dGV4dC5maW5kKHRoaXMpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHRoaW5nIHdlIGdldCB1
bmlmaWVkIHdpdGggbXVzdCBiZSBhIHR5cGUgdmFyaWFibGUgdGhhdCBhY2NlcHRzIGEgYnJvYWRl
ciBzZXQgb2YKKyAgICAgICAgLy8gdGhpbmdzIHRoYW4gd2UgZG8uCisgICAgICAgIGlmICghKHJl
YWxUaGlzIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVl
OworICAgICAgICAKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0
dXJuICFyZWFsVGhpcy5wcm90b2NvbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnBy
b3RvY29sLmluaGVyaXRzKHJlYWxUaGlzLnByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdmVy
aWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCF0
aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB1
bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKS5pbmhlcml0cyh0aGlzLnByb3RvY29sKTsKKyAg
ICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFt
ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4
dC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFVuaWZpY2F0
aW9uQ29udGV4dCB7CisgICAgY29uc3RydWN0b3IodHlwZVBhcmFtZXRlcnMpCisgICAgeworICAg
ICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IG5ldyBTZXQodHlwZVBhcmFtZXRlcnMpOworICAg
ICAgICB0aGlzLl9uZXh0TWFwID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICB1bmlvbihh
LCBiKQorICAgIHsKKyAgICAgICAgYSA9IGZpbmQoYSk7CisgICAgICAgIGIgPSBmaW5kKGIpOwor
ICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAg
ICAgaWYgKCFiLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgW2EsIGJdID0gW2IsIGFdOworICAg
ICAgICBpZiAoIWEuaXNVbmlmaWFibGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNh
bm5vdCB1bmlmeSBub24tdW5pZmlhYmxlIHRoaW5ncyAiICsgYSArICIgYW5kICIgKyBiKTsKKyAg
ICAgICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHR5cGUgcGFyYW1ldGVycyBkb24ndCBl
bmQgdXAgYmVpbmcgcm9vdHMuCisgICAgICAgIGlmIChhLmlzVW5pZmlhYmxlICYmIGIuaXNVbmlm
aWFibGUgJiYgdGhpcy5fdHlwZVBhcmFtZXRlcnMuaGFzKGIpKQorICAgICAgICAgICAgW2EsIGJd
ID0gW2IsIGFdOworCisgICAgICAgIHRoaXMuX25leHRNYXAuc2V0KGEsIGIpOworICAgIH0KKyAg
ICAKKyAgICBmaW5kKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBub2Rl
OworICAgICAgICBsZXQgbmV4dE5vZGUgPSB0aGlzLl9uZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7
CisgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7
CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbmV4dE5vZGU7
CisgICAgICAgICAgICBuZXh0Tm9kZSA9IHRoaXMuX25leHRNYXAuZ2V0KGN1cnJlbnROb2RlKTsK
KyAgICAgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAg
ICAgIH0KKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQobm9kZSwgY3VycmVudE5vZGUpOworICAg
ICAgICByZXR1cm4gY3VycmVudE5vZGU7CisgICAgfQorICAgIAorICAgIGdldCBub2RlcygpCisg
ICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFNldCgpOworICAgICAgICBmb3IgKGxldCBb
a2V5LCB2YWx1ZV0gb2YgdGhpcy5fbmV4dE1hcCkgeworICAgICAgICAgICAgcmVzdWx0LmFkZChr
ZXkpOworICAgICAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5KCkKKyAgICB7CisgICAgICAg
IGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhpcy5fdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAg
ICAgICAgIGlmICghdHlwZVBhcmFtZXRlci52ZXJpZnlBc1BhcmFtZXRlcih0aGlzKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChsZXQgdHlw
ZUFyZ3VtZW50IG9mIHRoaXMubm9kZXMpIHsKKyAgICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50
LmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYg
KHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhhcyh0eXBlQXJndW1lbnQpKQorICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnQudmVyaWZ5QXNBcmd1bWVu
dCh0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlzVW51bmlmaWVkKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiAhdGhpcy5fbmV4dE1hcC5zaXplKCk7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9WYWx1ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhbHVlIGV4dGVuZHMg
Tm9kZSB7CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBWYWx1ZTsgfQorICAgIGdldCBpc0NvbnN0
ZXhwcigpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Zh
cmlhYmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVm
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFyaWFibGVSZWYgZXh0
ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgewor
ICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAg
ICAgdGhpcy52YXJpYWJsZSA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyBy
ZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRoaXMu
dmFyaWFibGUuaXNDb25zdGV4cHI7IH0KKyAgICBnZXQgdW5pZnlOb2RlKCkgeyByZXR1cm4gdGhp
cy52YXJpYWJsZS51bmlmeU5vZGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1Zpc2l0b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZpc2l0b3IgeworICAgIHZpc2l0UHJv
Z3JhbShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUudG9w
TGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEZ1bmMobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUucmV0dXJu
VHlwZS52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2Rl
LnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsK
KyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykKKyAgICAgICAg
ICAgIHBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jUGFy
YW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAg
fQorICAgIAorICAgIHZpc2l0RnVuY0RlZihub2RlKQorICAgIHsKKyAgICAgICAgdmlzaXRGdW5j
KG5vZGUpOworICAgICAgICBub2RlLmJvZHkudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAg
IHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBu
b2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7CisgICAg
fQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7CisgICAgfQorICAgIAor
ICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzaWdu
YXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAgICAgc2lnbmF0dXJlLnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAg
IGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAg
ICB0eXBlQXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0TmF0aXZl
VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtdGVyIG9mIG5vZGUu
dHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAo
bGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5
cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAgeworICAgICAgICBm
b3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAg
ICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBu
b2RlLmZpZWxkcykKKyAgICAgICAgICAgIGZpZWxkLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlz
aXRDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUu
dmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RmllbGQobm9kZSkKKyAgICB7Cisg
ICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRFbGVt
ZW50YWxUeXBlKG5vZGUpCisgICAgeworICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUobm9kZSkKKyAgICB7CisgICAgICAg
IHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFy
cmF5UmVmVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUo
bm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAgeworICAg
ICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICAgICAgbm9kZS5udW1FbGVt
ZW50cy52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUp
CisgICAgeworICAgICAgICBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9kZS5yaHMu
dmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAg
ICB7CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICBp
ZiAobm9kZS52YWx1ZSkKKyAgICAgICAgICAgIG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAg
fQorICAgIAorICAgIHZpc3RJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAg
ICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBl
QXJndW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50
LnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBhcmd1bWVudCBvZiBub2RlLmFyZ3VtZW50
TGlzdCkKKyAgICAgICAgICAgIGFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0KK30KKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319205</attachid>
            <date>2017-08-28 13:53:22 -0700</date>
            <delta_ts>2017-08-28 17:28:12 -0700</delta_ts>
            <desc>added more overload resolution machinery</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>154833</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgYWRkcmVz
c1NwYWNlcyA9IFsiY29uc3RhbnQiLCAiZGV2aWNlIiwgInRocmVhZGdyb3VwIiwgInRocmVhZCJd
OworCitmdW5jdGlvbiBpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7CisgICAgc3dpdGNo
IChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2FzZSAiZGV2aWNl
IjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
K30KKworZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAg
IGlmICghaXNBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKSkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYWRkcmVzcyBzcGFjZTogIiArIGFkZHJlc3NTcGFjZSk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFzIFRbY10gZm9y
IGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1YWdlLgorY2xh
c3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0
YW5jZW9mIEFycmF5UmVmVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBpZiAodGhpcy5hZGRyZXNzU3BhY2UgIT0gInRocmVhZCIpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIg
IiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fy
cmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1F
bGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVu
dHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vs
ZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxl
bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAg
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsK
KyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQXJyYXlSZWZUeXBlKSB7CisgICAgICAgICAg
ICBpZiAob3RoZXIuYWRkcmVzc1NwYWNlICE9ICJ0aHJlYWQiKQorICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGlu
c3RhbmNlb2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmICghdGhpcy5udW1FbGVtZW50cy51bmlmeSh1bmlmaWNh
dGlvbkNvbnRleHQsIG90aGVyLm51bUVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRU
eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9Bc3NpZ25tZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBsaHMsIHJocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7Cisg
ICAgICAgIHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgIH0K
KyAgICAKKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJocygp
IHsgcmV0dXJuIHRoaXMuX3JoczsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmxocyArICIgPSAiICsgdGhpcy5yaHM7CisgICAgfQorfTsKKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2suanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQmxvY2suanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2su
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBCbG9jayBleHRl
bmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fc3RhdGVtZW50cyA9IFtdOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgCisg
ICAgYWRkKHN0YXRlbWVudCkKKyAgICB7CisgICAgICAgIHRoaXMuX3N0YXRlbWVudHMucHVzaChz
dGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGVtZW50cygpIHsgcmV0dXJuIHRo
aXMuX3N0YXRlbWVudHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0K
K307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNz
aW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgICAgICB0aGlz
LmZ1bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJo
cygpIHsgcmV0dXJuIHRoaXMuX3JoczsgfSAvLyBUaGlzIGNhbiBiZSBudWxsLgorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxocyArICIgIiArIHRoaXMu
bmFtZSArICh0aGlzLnJocyA/ICI9ICIgKyB0aGlzLnJocyA6ICIiKTsKKyAgICB9Cit9CisKSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQ2FsbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkK
KyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICAgICAg
dGhpcy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAgICAgICB0aGlzLmZ1bmMgPSBu
dWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0K
KyAgICBnZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8
IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCArICIpIjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9DaGVja2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTg2IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIENoZWNrZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICBjb25zdHJ1Y3Rvcihw
cm9ncmFtKQorICAgIHsKKyAgICAgICAgdGhpcy5fcHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAg
IHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgIH0KKyAgICAKKyAgICB2aXNpdFBy
b2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRv
cExldmVsU3RhdGVtZW50cykgeworICAgICAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9
IHN0YXRlbWVudDsKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykgeworICAgICAgICAgICAg
bGV0IHNldCA9IG5ldyBTZXQoKTsKKyAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnNpZGVyKHRoaW5n
KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGluZy5pc1VuaWZpYWJsZSkK
KyAgICAgICAgICAgICAgICAgICAgc2V0LmFkZCh0aGluZyk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBjbGFzcyBOb3RpY2VUeXBlVmFyaWFibGUgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAg
ICAgICAgICAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgICAgIGNvbnNpZGVyKG5vZGUudHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7Cisg
ICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyKG5vZGUudmFyaWFibGUpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBub3RpY2VUeXBlVmFyaWFibGUg
PSBuZXcgTm90aWNlVHlwZVZhcmlhYmxlKCk7CisgICAgICAgICAgICBmb3IgKGxldCBwYXJhbWV0
ZXJUeXBlIG9mIHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcykKKyAgICAgICAgICAgICAgICBwYXJh
bWV0ZXJUeXBlLnZpc2l0KG5vdGljZVR5cGVWYXJpYWJsZSk7CisgICAgICAgICAgICBmb3IgKGxl
dCB0eXBlUGFyYW1ldGVyIG9mIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAg
ICAgICAgIGlmICghc2V0Lmhhcyh0eXBlUGFyYW1ldGVyKSkKKyAgICAgICAgICAgICAgICAgICAg
dGhyb3cgQUxUeXBlRXJyb3IodHlwZVBhcmFtZXRlci5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlw
ZSBwYXJhbWV0ZXIgdG8gcHJvdG9jb2wgc2lnbmF0dXJlIG5vdCBpbmZlcnJhYmxlIGZyb20gdmFs
dWUgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZXQuaGFz
KG5vZGUudHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJy
b3Ioc2lnbmF0dXJlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJQcm90b2NvbCdzIHR5cGUgdmFyaWFi
bGUgbm90IG1lbnRpb25lZCBpbiBzaWduYXR1cmUiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICBfY2hlY2tUeXBlQXJndW1lbnRzKG9yaWdpbiwgdHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1
bWVudHMpCisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJz
Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSB0eXBlQXJn
dW1lbnRzW2ldIGluc3RhbmNlb2YgVHlwZTsKKyAgICAgICAgICAgIGxldCByZXN1bHQgPSBub2Rl
LnR5cGVBcmd1bWVudHNbaV0udmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRJ
c1R5cGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHNbaV0uaW5oZXJpdHMo
dHlwZUFyZ3VtZW50c1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVF
cnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBhcmd1bWVudCBkb2VzIG5vdCBpbmhlcml0
IHByb3RvY29sIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgh
cmVzdWx0LmVxdWFscyh0eXBlUGFyYW1ldGVyc1tpXS50eXBlKSkKKyAgICAgICAgICAgICAgICAg
ICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyB0eXBl
IGZvciBjb25zdGV4cHIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2NoZWNrVHlwZUFy
Z3VtZW50cyhub2RlLm9yaWdpbiwgdHlwZS50eXBlUGFyYW1ldGVycywgbm9kZS50eXBlQXJndW1l
bnRzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgewor
ICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpOworICAgICAgICAKKyAgICAgICAg
aWYgKG5vZGUuYWRkcmVzc1NwYWNlID09ICJ0aHJlYWQiKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAKKyAgICAgICAgY2xhc3MgSW5zdGFudGlhdGVJbW1lZGlhdGVzIGV4dGVuZHMgUmV3
cml0ZXIgeworICAgICAgICAgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgICAgICAgICB7Cisg
ICAgICAgICAgICAgICAgbm9kZSA9IHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gbm9kZS5pbnN0YW50aWF0ZWRUeXBlLnZpc2l0KHRoaXMpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9k
ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFub2RlLmVsZW1lbnRUeXBl
LnZpc2l0KG5ldyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMoKSkuaXNQcmltaXRpdmUpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiSWxs
ZWdhbCBwb2ludGVyIHRvIG5vbi1wcmltaXRpdmUgdHlwZSIpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgaWYgKCFub2RlLm51bUVsZW1lbnRz
LmlzQ29uc3RleHByKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3Jp
Z2luLm9yaWdpblN0cmluZywgIkFycmF5IGxlbmd0aCBtdXN0IGJlIGNvbnN0ZXhwciIpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7CisgICAgICAgIC8vIEZJ
WE1FOiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGxocyBpcyBhc3NpZ25hYmxlLgorICAgICAg
ICBsZXQgbGhzVHlwZSA9IG5vZGUubGhzLnZpc2l0KHRoaXMpOworICAgICAgICBsZXQgcmhzVHlw
ZSA9IG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgICAgICBpZiAoIWxoc1R5cGUuZXF1YWxzKHJo
c1R5cGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9y
aWdpblN0cmluZywgIlR5cGUgbWlzbWF0Y2ggaW4gYXNzaWdubWVudDogIiArIGxoc1R5cGUgKyAi
IHZlcnN1cyAiICsgcmhzVHlwZSk7CisgICAgICAgIHJldHVybiBsaHNUeXBlOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gcmVz
dWx0LnR5cGU7CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAg
ICAgICBpZiAobm9kZS52YWx1ZSkgeworICAgICAgICAgICAgbGV0IHJlc3VsdFR5cGUgPSBub2Rl
LnZhbHVlLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgaWYgKCF0aGlzLmZ1bmMucmV0dXJuVmFs
dWUuZXF1YWxzKHJlc3VsdFR5cGUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVF
cnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUcnlpbmcgdG8gcmV0dXJuICIgKyByZXN1
bHRUeXBlICsgIiBpbiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAiICsgZnVuYy5yZXR1cm5WYWx1
ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
ICghZnVuYy5yZXR1cm5WYWx1ZS5lcXVhbHModGhpcy5fcHJvZ3JhbS5pbnRyaW5zaWNzLnZvaWQp
KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0
cmluZywgIk5vbi12b2lkIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUiKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fcHJvZ3JhbS5pbnRyaW5zaWNzLmludDMyOworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxF
eHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Yg
bm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMp
OworICAgICAgICBsZXQgYXJndW1lbnRUeXBlcyA9IG5vZGUuYXJndW1lbnRMaXN0Lm1hcChhcmd1
bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSk7CisgICAgICAgIAorICAgICAgICBsZXQgb3Zl
cmxvYWQgPSBudWxsOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMuX2N1
cnJlbnRTdGF0ZW1lbnQudHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGlmICghKHR5cGVQ
YXJhbWV0ZXIgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGUpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLnByb3RvY29sKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZXMgPQorICAgICAgICAg
ICAgICAgIHR5cGVQYXJhbWV0ZXIucHJvdG9jb2wuc2lnbmF0dXJlc0J5TmFtZVdpdGhUeXBlVmFy
aWFibGUobm9kZS5uYW1lLCB0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgICAgIGlmICghc2lnbmF0
dXJlcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG92ZXJsb2FkID0g
cmVzb2x2ZU92ZXJsb2FkSW1wbChzaWduYXR1cmVzLCBub2RlLnR5cGVBcmd1bWVudHMsIGFyZ3Vt
ZW50VHlwZXMpOworICAgICAgICAgICAgaWYgKG92ZXJsb2FkKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghb3ZlcmxvYWQpIHsKKyAgICAgICAgICAgIG92
ZXJsb2FkID0gdGhpcy5fbmFtZUNvbnRleHQucHJvZ3JhbS5yZXNvbHZlRnVuY092ZXJsb2FkKAor
ICAgICAgICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS50eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5
cGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkRpZCBub3QgZmlu
ZCBmdW5jdGlvbiBmb3IgY2FsbCIpOworICAgICAgICByZXR1cm4gb3ZlcmxvYWQuZnVuYy5yZXR1
cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAorICAgICAgICAgICAgb3ZlcmxvYWQuZnVu
Yy50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NvbW1hRXhwcmVzc2lvbi5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Db21tYUV4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ29tbWFFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVz
c2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBsaXN0KQorICAgIHsKKyAgICAgICAgc3Vw
ZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGlzdCA9IGxpc3Q7CisgICAgfQorICAgIAorICAg
IGdldCBsaXN0KCkgeyByZXR1cm4gdGhpcy5fbGlzdDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiAiKCIgKyB0aGlzLmxpc3QudG9TdHJpbmcoKSArICIpIjsK
KyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1l
dGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJh
bWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlw
ZVBhcmFtZXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIgZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2lu
OworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7
CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAg
IGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigp
IHsgcmV0dXJuIHRydWU7IH0KKyAgICBnZXQgaXNVbmlmaWFibGUoKSB7IHJldHVybiB0cnVlOyB9
CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikK
KyAgICB7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVmFsdWUpKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghdGhpcy50eXBlLnVuaWZ5KHVuaWZpY2F0
aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAg
ICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcyk7CisgICAg
ICAgIGlmIChyZWFsVGhpcyAhPSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHJlYWxUaGlzLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgICAgICAKKyAgICAgICAgaWYgKG90
aGVyIGluc3RhbmNlb2YgVmFyaWFibGVSZWYpCisgICAgICAgICAgICBvdGhlciA9IG90aGVyLnZh
cmlhYmxlOworICAgICAgICAKKyAgICAgICAgdW5pZmljYXRpb25Db250ZXh0LnVuaWZ5KHRoaXMs
IG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1w
bCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
dHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7CisgICAgfQorICAg
IAorICAgIHZlcmlmeUFzQXJndW1lbnQodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZp
Y2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsg
dGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lv
bi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVmFsdWUg
eworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29y
aWdpbjsgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvRmllbGQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBGaWVsZCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsK
KyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFt
ZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmln
aW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRo
aXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsg
dGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuYy5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9GdW5jLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDkgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgRnVuYyBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG5hbWUsIHJl
dHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhp
cy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOwor
ICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0
aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUo
KSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHJldHVyblR5cGUoKSB7IHJldHVybiB0
aGlzLl9yZXR1cm5UeXBlOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhp
cy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMu
X3BhcmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVyVHlwZXMoKSB7IHJldHVybiB0aGlzLnBh
cmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudHlwZSk7IH0KKyAgICAKKyAgICBn
ZXQga2luZCgpIHsgcmV0dXJuIEZ1bmM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5UeXBlICsgIiAiICsgdGhpcy5uYW1lICsgIjwiICsg
dGhpcy50eXBlUGFyYW1ldGVycyArICI+KCIgKyB0aGlzLnBhcmFtZXRlcnMgKyAiKSI7CisgICAg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jRGVmLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNEZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvRnVuY0RlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIEZ1bmNEZWYgZXh0ZW5kcyBGdW5jIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5h
bWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLCBib2R5KQorICAgIHsK
KyAgICAgICAgc3VwZXIobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRl
cnMpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2JvZHkg
PSBib2R5OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgZ2V0IGJvZHkoKSB7IHJldHVybiB0aGlzLl9ib2R5OyB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCkgKyAiIHsg
IiArIGJvZHkgKyAiIH0iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVu
Y1BhcmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jUGFyYW1l
dGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNQYXJhbWV0ZXIu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jUGFyYW1l
dGVyIHsKKyAgICAvLyBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSXQncyBPSyBmb3IgaXQgdG8gYmUg
bnVsbCEKKyAgICBjb25zdHJ1Y3RvcihuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5f
bmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAg
ICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0
dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvRnVuY1NpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9GdW5jU2lnbmF0dXJlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL0Z1bmNTaWduYXR1cmUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvSW50TGl0ZXJhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIEludExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAg
dGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1
cm4gdGhpcy5fdmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIiICsgdGhpcy5f
dmFsdWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEludHJpbnNpY3MgeworICAgIGNvbnN0cnVjdG9y
KCkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKworICAgICAgICB0aGlz
Ll9tYXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSB2b2lkPD4iLAor
ICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnZvaWQgPSB0eXBl
OworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAg
ICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUgaW50MzI8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4g
eworICAgICAgICAgICAgICAgIHRoaXMuaW50MzIgPSB0eXBlOworICAgICAgICAgICAgfSk7CisK
KyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5
cGUgZG91YmxlPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0
aGlzLmRvdWJsZSA9IHR5cGU7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgYWRk
KHRoaW5nKQorICAgIHsKKyAgICAgICAgbGV0IGludHJpbnNpYyA9IHRoaXMuX21hcC5nZXQodGhp
bmcubmFtZSk7CisgICAgICAgIGlmICghaW50cmluc2ljKQorICAgICAgICAgICAgdGhyb3cgbmV3
IEFMVHlwZUVycm9yKHRoaW5nLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJVbnJlY29nbml6ZWQgaW50
cmluc2ljOiAiICsgdGhpbmcpOworICAgICAgICBpbnRyaW5zaWModGhpbmcpOworICAgIH0KK30K
KwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvTGV4ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
TGV4ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4
ZXIgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgdGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAgICAgIHRo
aXMuX2luZGV4ID0gMDsKKyAgICAgICAgdGhpcy5fc3RhY2sgPSBbXTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IGxpbmVOdW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJl
ckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luICsgIjoiICsgKHRoaXMubGlu
ZU51bWJlciArIDEpOworICAgIH0KKyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5kZXgoaW5kZXgp
CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpLm1h
dGNoKC9cbi9nKS5sZW5ndGg7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJu
IHRoaXMuX2luZGV4OyB9CisgICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2luZGV4ID0gdmFs
dWU7IH0KKyAgICAKKyAgICBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9zdGFjay5s
ZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhY2sucG9wKCk7CisgICAgICAgIAor
ICAgICAgICBpZiAodGhpcy5faW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisgICAgICAgICAg
ICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1lbnRCZWdpbiA9
IC9cL1wqLzsKKyAgICAgICAgY29uc3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4gPSAvXC9cLy87
CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAgICAgICAgICAg
IGxldCB0ZXh0ID0gUmVnRXhwLmxhc3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0b2tlbiA9IG5l
dyBMZXhlclRva2VuKHRoaXMsIHRoaXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAgICAgICAgICAg
IHRoaXMuX2luZGV4ICs9IHRleHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOwor
ICAgICAgICB9OworCisgICAgICAgIGxldCByZWxldmFudFRleHQ7CisgICAgICAgIGZvciAoOzsp
IHsKKyAgICAgICAgICAgIHJlbGV2YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3RyaW5nKHRoaXMu
X2luZGV4KTsKKyAgICAgICAgICAgIGlmICgvXlxzKy8udGVzdChyZWxldmFudFRleHQpKSB7Cisg
ICAgICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7Cisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
L15cL1wqLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBsZXQgZW5kSW5k
ZXggPSByZWxldmFudFRleHQuc2VhcmNoKC9cKlwvLyk7CisgICAgICAgICAgICAgICAgaWYgKGVu
ZEluZGV4IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRlcm1pbmF0ZWQg
Y29tbWVudCIpOworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZEluZGV4OworICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9e
XC9cLy4qLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRl
eCArPSBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlzIGRvIFVuaWNvZGUuCisgICAgICAgIGlmICgvXlte
XGRcV11cdyovLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQo
ImlkZW50aWZpZXIiKTsKKworICAgICAgICBpZiAoL15bMC05XSsvLnRlc3QocmVsZXZhbnRUZXh0
KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImludExpdGVyYWwiKTsKKworICAgICAgICAv
LyBGSVhNRTogTWFrZSB0aGlzIGhhbmRsZSBleHAtZm9ybSBsaXRlcmFscyBsaWtlIDFlMS4KKyAg
ICAgICAgaWYgKC9eKFswLTldKlwuWzAtOV0rKXwoWzAtOV0rXC5bMC05XSopLy50ZXN0KHJlbGV2
YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJkb3VibGVMaXRlcmFsIik7Cisg
ICAgICAgIAorICAgICAgICBpZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8aWZ8ZWxzZXxlbnVt
fGNvbnRpbnVlfGJyZWFrfHN3aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxlfGRvfHJldHVybnxz
aXplb2Z8Y29uc3RhbnR8ZGV2aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVyYXRvcikvLnRlc3Qo
cmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImtleXdvcmQiKTsKKyAg
ICAgICAgCisgICAgICAgIGlmICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5eJnw8PlxcLV18LT58
PT58PD18PT18IT18Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0KHJlbGV2YW50VGV4
dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIpOworICAgICAgICAK
KyAgICAgICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3aXRoOiAiICsgcmVs
ZXZhbnRUZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAgICBwdXNoKHRva2Vu
KQorICAgIHsKKyAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7CisgICAgfQorICAgIAor
ICAgIHBlZWsoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQoKTsKKyAgICAgICAg
cHVzaChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBm
YWlsKGVycm9yKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4RXJyb3IodGhpcy5v
cmlnaW5TdHJpbmcsIGVycm9yKTsKKyAgICB9CisgICAgCisgICAgYmFja3RyYWNraW5nU2NvcGUo
Y2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlOworICAgICAg
ICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAgICAgIH0gY2F0Y2gg
KGUpIHsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhFcnJvcikgeworICAg
ICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAg
ICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIExleGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9yKGxleGVyLCBvcmln
aW4sIGluZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhl
cjsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9pbmRleCA9
IGluZGV4OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAgdGhpcy5fdGV4dCA9
IHRleHQ7CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLl9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5k
ZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAgIH0KKyAgICAKKyAg
ICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbGV4ZXIubGlu
ZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdp
blN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gKyAiOiIgKyAodGhp
cy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwgIiArIHRoaXMudGV4
dCArICIsICIgKyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvTmFtZUNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmFt
ZUNvbnRleHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3Qg
VHlwZU9yVmFsdWUgPSBTeW1ib2woKTsKKworY2xhc3MgTmFtZUNvbnRleHQgeworICAgIGNvbnN0
cnVjdG9yKGRlbGVnYXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOwor
ICAgICAgICBsZXQgdHlwZUFuZFZhbHVlTWFwID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9t
YXAuc2V0KFR5cGUsIHR5cGVBbmRWYWx1ZU1hcCk7CisgICAgICAgIHRoaXMuX21hcC5zZXQoVmFs
dWUsIHR5cGVBbmRWYWx1ZU1hcCk7CisgICAgICAgIGZvciAobGV0IGtpbmQgb2YgbmFtZWFibGVL
aW5kcykKKyAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2luZCwgbmV3IE1hcCgpKTsKKyAgICAg
ICAgdGhpcy5fZGVmaW5lZCA9IG5ldyBTZXQoKTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRl
bWVudCA9IG51bGw7CisgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbnVsbDsKKyAgICAgICAgdGhp
cy5faW50cmluc2ljcyA9IG51bGw7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsOworICAg
IH0KKyAgICAKKyAgICBtYXBGb3Ioa2luZCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0
aGlzLl9tYXAuZ2V0KGtpbmQpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBFcnJvcigiQmFkIGtpbmQ6ICIgKyBraW5kKTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgYWRkKHRoaW5nKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlu
Zy5uYW1lKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHRoaW5n
LmlzTmF0aXZlKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMuX2ludHJpbnNpY3MpCisgICAgICAg
ICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOYXRpdmUgZnVuY3Rpb24gaW4gYSBzY29wZSB0aGF0
IGRvZXMgbm90IHJlY29nbml6ZSBpbnRyaW5zaWNzIik7CisgICAgICAgICAgICB0aGlzLl9pbnRy
aW5zaWNzLmFkZCh0aGluZyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxldCBtYXAg
PSBtYXBGb3IodGhpbmcua2luZCk7CisgICAgICAgIGlmICh0aGluZy5raW5kID09IEZ1bmMpIHsK
KyAgICAgICAgICAgIGxldCBhcnJheSA9IG1hcC5nZXQodGhpbmcubmFtZSk7CisgICAgICAgICAg
ICBpZiAoIWFycmF5KQorICAgICAgICAgICAgICAgIG1hcC5zZXQodGhpbmcubmFtZSwgYXJyYXkg
PSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAgICAgIHJldHVy
bjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFwLmhhcyh0aGluZy5uYW1lKSkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRHVw
bGljYXRlIG5hbWU6ICIgKyB0aGluZy5uYW1lKTsKKyAgICAgICAgbWFwLnNldCh0aGluZy5uYW1l
LCB0aGluZyk7CisgICAgfQorICAgIAorICAgIGdldChraW5kLCBuYW1lKQorICAgIHsKKyAgICAg
ICAgbGV0IHJlc3VsdCA9IG1hcEZvcihraW5kID09IFR5cGVPclZhbHVlID8gVHlwZSA6IGtpbmQp
LmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQgJiYgdGhpcy5fZGVsZWdhdGUpCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuZ2V0KGtpbmQsIG5hbWUpOworICAgICAgICBp
ZiAoa2luZCA9PSBWYWx1ZSB8fCBraW5kID09IFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChyZXN1
bHQua2luZCAhPSBraW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9
CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGdldCBjdXJyZW50U3Rh
dGVtZW50KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9jdXJyZW50U3RhdGVtZW50KQorICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIGlmICh0aGlz
Ll9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jdXJyZW50U3Rh
dGVtZW50OworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgaXNEZWZpbmVk
KHRoaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmluZWQuaGFzKHRoaW5nKQor
ICAgICAgICAgICAgfHwgKHRoaXMuX2RlbGVnYXRlICYmIHRoaXMuX2RlbGVnYXRlLmlzRGVmaW5l
ZCh0aGluZykpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmUodGhpbmcpCisgICAgeworICAgICAg
ICB0aGlzLl9kZWZpbmVkLnNldCh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRlZmluZUFsbCgp
CisgICAgeworICAgICAgICBmb3IgKGxldCB0aGluZyBvZiB0aGlzKQorICAgICAgICAgICAgZGVm
aW5lKHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZG9TdGF0ZW1lbnQoc3RhdGVtZW50LCBjYWxs
YmFjaykKKyAgICB7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7
CisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBu
dWxsOworICAgICAgICBkZWZpbmUoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVjb2du
aXplSW50cmluc2ljcygpCisgICAgeworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbmV3IElu
dHJpbnNpY3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGludHJpbnNpY3MoKQorICAgIHsKKyAg
ICAgICAgaWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50
cmluc2ljczsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJu
IHRoaXMuX2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0K
KyAgICAKKyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dy
YW0gPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHByb2dyYW0oKQorICAgIHsKKyAgICAg
ICAgaWYgKHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbTsK
KyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rl
bGVnYXRlLnByb2dyYW07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAq
W1N5bWJvbC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgbWFwIG9mIHRoaXMu
X21hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLl90eXBl
cy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVsZCB0eXBlOworICAgICAgICB9CisgICAg
fQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBOYXRpdmVUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCBuYW1lLCBpc1ByaW1pdGl2ZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAg
ICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAg
ICAgICB0aGlzLl9pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlOworICAgICAgICB0aGlzLl90eXBl
UGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2lu
KCkgeyByZXR1bnIgdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlz
Ll9uYW1lOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5faXNQcmltaXRp
dmU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1l
dGVyczsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICBp
bnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVu
dHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8gaW5zdGFudGlh
dGlvbiIpOworICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAg
cmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlVHlwZUluc3RhbmNlKHRoaXMs
IHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAg
ICAgICByZXR1cm4gIm5hdGl2ZSAiICsgKHRoaXMuaXNQcmltaXRpdmUgPyAicHJpbWl0aXZlICIg
OiAiIikgKyAidHlwZSAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyAr
ICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0
YW5jZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFu
Y2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3Rh
bmNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTmF0aXZl
VHlwZUluc3RhbmNlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3IodHlwZSwgdHlwZUFy
Z3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgICAgICB0aGlz
Ll90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IHR5
cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgZ2V0IHR5cGVBcmd1bWVudHMoKSB7IHJl
dHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1
cm4gdGhpcy5fdHlwZS5pc1ByaW1pdGl2ZTsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJu
IHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikK
KyAgICB7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0g
b3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytp
KSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNh
dGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAg
CisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICI8IiAr
IHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL05vZGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTm9kZSB7CisgICAgdmlzaXQodmlzaXRvcikK
KyAgICB7CisgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IHZpc2l0b3JbInZpc2l0IiArIHRoaXMu
Y29uc3RydWN0b3IubmFtZV0odGhpcyk7CisgICAgICAgIGlmICgicmV0dXJuVmFsdWUiIGluIHZp
c2l0b3IpCisgICAgICAgICAgICByZXR1cm4gdmlzaXRvci5yZXR1cm5WYWx1ZTsKKyAgICAgICAg
cmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeSh1bmlmaWNhdGlvbkNv
bnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0IHVuaWZ5VGhpcyA9IHRoaXMudW5pZnlO
b2RlOworICAgICAgICBsZXQgdW5pZnlPdGhlciA9IG90aGVyLnVuaWZ5Tm9kZTsKKyAgICAgICAg
aWYgKHVuaWZ5T3RoZXIudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCB1bmlm
eVRoaXMpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB1bmlmeVRo
aXMudW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlPdGhlcik7CisgICAgfQorICAg
IAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAg
ICAgaWYgKG90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdGhpcykp
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXI7
CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwg
b3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGdl
dCB1bmlmeU5vZGUoKSB7IHJldHVybiB0aGlzOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyBy
ZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiBmYWxzZTsg
fQorICAgIAorICAgIGVxdWFscyhvdGhlcikKKyAgICB7CisgICAgICAgIGxldCB1bmlmaWNhdGlv
bkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KCk7CisgICAgICAgIHJldHVybiB0aGlz
LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpICYmIHVuaWZpY2F0aW9uQ29udGV4dC5p
c1VudW5pZmllZCgpOworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0dXRlKHBhcmFtZXRlcnMsIGFy
Z3VtZW50TGlzdCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0KFN1YnN0aXR1dGlv
bi5tYXBwaW5nKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkpOworICAgIH0KKyAgICAKKyAgICBz
dWJzdGl0dXRlVG9VbmlmaWNhdGlvbihwYXJhbWV0ZXJzLCB1bmlmaWNhdGlvbkNvbnRleHQpCisg
ICAgeworICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLm1h
cCh0eXBlID0+IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHR5cGUpKSk7CisgICAgfQorfQpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvUGFyc2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2Uu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcGFyc2Uo
cHJvZ3JhbSwgb3JpZ2luLCB0ZXh0KQoreworICAgIGxldCBsZXhlciA9IG5ldyBMZXhlcihvcmln
aW4sIHRleHQpOworICAgIAorICAgIC8vIFRoZSBoYXJkZXN0IHBhcnQgb2YgZGVhbGluZyB3aXRo
IEMtbGlrZSBsYW5ndWFnZXMgaXMgcGFyc2luZyB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1l
bnRzLgorICAgIC8vIExldCdzIGNvbnNpZGVyIGlmIHRoaXMgaGFwcGVucyBpbiBBcnJheUxhbmcu
IEhlcmUgYXJlIHRoZSB2YWxpZCBzdGF0ZW1lbnRzIGluIEFycmF5TGFuZyB0aGF0CisgICAgLy8g
YmVnaW4gd2l0aCBhbiBpZGVudGlmaWVyLCBpZiB3ZSBhc3N1bWUgdGhhdCBhbnkgZXhwcmVzc2lv
biBjYW4gYmUgYSBzdGFuZGFsb25lIHN0YXRlbWVudC4KKyAgICAvLworICAgIC8vICAgICB4Owor
ICAgIC8vICAgICB4IDxiaW5vcD4geTsKKyAgICAvLyAgICAgeCA8IHk7CisgICAgLy8gICAgIHgg
PCB5ID4gejsKKyAgICAvLyAgICAgeCA9IHk7CisgICAgLy8gICAgIHguZiA9IHk7CisgICAgLy8g
ICAgIFxleHAgPSB5OworICAgIC8vICAgICB4WzQyXSA9IHk7CisgICAgLy8gICAgIHgoKTsKKyAg
ICAvLyAgICAgeDx5PigpOworICAgIC8vICAgICB4IHk7CisgICAgLy8gICAgIHg8eT4gejsKKyAg
ICAvLyAgICAgZGV2aWNlIHhbXSB5OworICAgIC8vICAgICB4WzQyXSB5OworICAgIC8vICAgICBk
ZXZpY2UgeF4geTsKKyAgICAvLyAgICAgdGhyZWFkIHheXiB5OworICAgIC8vICAgICB4XnRocmVh
ZF50aHJlYWQgeTsKKyAgICAvLyAgICAgeF5kZXZpY2VedGhyZWFkIHk7CisgICAgLy8KKyAgICAv
LyBUaGlzIGhhcyB0d28gcHJvYmxlbSBhcmVhczoKKyAgICAvLworICAgIC8vICAgICAtIHg8eT56
IGNhbiBwYXJzZSB0d28gZGlmZmVyZW50IHdheXMgKGFzICh4IDwgeSkgPiB6IG9yIHg8eT4geiku
CisgICAgLy8gICAgIC0geFs0Ml0gY291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9y
IGEgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgLy8gICAgIC0geDx5PiBjb3VsZCBiZWNvbWUg
ZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAvLwor
ICAgIC8vIFdlIHNvbHZlIHRoZSBmaXJzdCBwcm9ibGVtIGJ5IGZvcmJpZGRpbmcgZXhwcmVzc2lv
bnMgYXMgc3RhdGVtZW50cy4gVGhlIGxhY2sgb2YgZnVuY3Rpb24KKyAgICAvLyBwb2ludGVycyBt
ZWFucyB0aGF0IHdlIGNhbiBzdGlsbCBhbGxvdyBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudHMgLSB1
bmxpa2UgaW4gQywgdGhvc2UgY2Fubm90CisgICAgLy8gaGF2ZSBhcmJpdHJhcnkgZXhwcmVzc2lv
bnMgYXMgdGhlIGNhbGxlZS4gVGhlIHJlbWFpbmluZyB0d28gcHJvYmxlbXMgYXJlIHNvbHZlZCBi
eQorICAgIC8vIGJhY2t0cmFja2luZy4gSW4gYWxsIG90aGVyIHJlc3BlY3RzLCB0aGlzIGlzIGEg
c2ltcGxlIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5l
cmljQ29uc3VtZShjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLm5l
eHQoKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhw
ZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrKHRva2VuKSkKKyAgICAg
ICAgICAgIGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50ZXh0ICsgIjsg
ZXhwZWN0ZWQ6ICIgKyB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBjb25zdW1lKC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdl
bmVyaWNDb25zdW1lKHRva2VuID0+IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gY29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBnZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiBhc3NlcnROZXh0KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAg
bGV4ZXIucHVzaChjb25zdW1lKC4uLnRleHRzKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IGdlbmVyaWNUZXN0KGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIu
cGVlaygpOworICAgICAgICBpZiAodG9rZW4gJiYgY2FsbGJhY2sodG9rZW4pKQorICAgICAgICAg
ICAgcmV0dXJuIHRva2VuOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gdGVzdCguLi50ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljVGVz
dCh0b2tlbiA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAgIAorICAg
IGZ1bmN0aW9uIHRlc3RLaW5kKGtpbmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Rl
c3QodG9rZW4gPT4gdG9rZW4ua2luZCA9PSBraW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gdHJ5Q29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0
KC4uLnRleHRzKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQo
KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5
Q29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0S2luZChr
aW5kKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQcm90
b2NvbFJlZigpCisgICAgeworICAgICAgICBsZXQgcHJvdG9jb2xUb2tlbiA9IGNvbnN1bWVLaW5k
KCJpZGVudGlmaWVyIik7CisgICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xSZWYocHJvdG9jb2xU
b2tlbi5vcmlnaW4sIHByb3RvY29sVG9rZW4udGV4dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCkKKyAgICB7CisgICAgICAgIGxldCByaWdodFNoaWZ0
ID0gdHJ5Q29uc3VtZSgiPj4iKTsKKyAgICAgICAgaWYgKHJpZ2h0U2hpZnQpCisgICAgICAgICAg
ICBsZXhlci5wdXNoKG5ldyBMZXhlclRva2VuKGxleGVyLCByaWdodFNoaWZ0Lm9yaWdpbiwgcmln
aHRTaGlmdC5pbmRleCwgcmlnaHRTaGlmdC5raW5kLCAiPiIpKTsKKyAgICAgICAgZWxzZQorICAg
ICAgICAgICAgY29uc3VtZSgiPiIpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5
cGVQYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICAgIGlmICghdGVzdCgiPCIpKQorICAgICAgICAg
ICAgcmV0dXJuIFtdOworICAgICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9IFtdOworICAgICAg
ICBjb25zdW1lKCI8Iik7CisgICAgICAgIHdoaWxlICghdGVzdCgiPiIpKSB7CisgICAgICAgICAg
ICBsZXQgY29uc3RleHByID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAg
ICAgICAgICAgIGxldCB0eXBlID0gcGFyc2VUeXBlKCk7CisgICAgICAgICAgICAgICAgbGV0IG5h
bWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgICAgIGFzc2VydE5l
eHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RleHBy
VHlwZVBhcmFtZXRlcih0eXBlLm9yaWdpbiwgbmFtZSwgdHlwZSk7CisgICAgICAgICAgICB9KTsK
KyAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2go
Y29uc3RleHByKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBuYW1l
ID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgICAgICAgICBsZXQgcHJvdG9j
b2wgPSB0cnlDb25zdW1lKCI6IikgPyBwYXJzZVByb3RvY29sUmVmKCkgOiBudWxsOworICAgICAg
ICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlVmFyaWFibGUobmFtZS5vcmlnaW4sIG5hbWUu
dGV4dCwgcHJvdG9jb2wpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJ5Q29u
c3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNv
bnN1bWVFbmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIHBhcnNlVGVybSgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47Cisg
ICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIikpCisgICAgICAg
ICAgICByZXR1cm4gbmV3IFZhcmlhYmxlUmVmKHRva2VuLm9yaWdpbiwgdG9rZW4udGV4dCk7Cisg
ICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWVLaW5kKCJpbnRMaXRlcmFsIikpIHsKKyAgICAg
ICAgICAgIGxldCBpbnRWZXJzaW9uID0gdG9rZW4udGV4dCB8IDA7CisgICAgICAgICAgICBpZiAo
aW50VmVyc2lvbiAhPSB0b2tlbi50ZXh0KQorICAgICAgICAgICAgICAgIGxleGVyLmZhaWwoIklu
dGVnZXIgbGl0ZXJhbCBpcyBub3QgMzItYml0IGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVy
biBuZXcgSW50TGl0ZXJhbCh0b2tlbi5vcmlnaW4sIGludFZlcnNpb24pOworICAgICAgICB9Cisg
ICAgICAgIC8vIEZJWE1FOiBOZWVkIHN1cHBvcnQgZm9yIGZsb2F0IGxpdGVyYWxzIGFuZCBwcm9i
YWJseSBvdGhlciBsaXRlcmFscyB0b28uCisgICAgICAgIHRva2VuID0gY29uc3VtZUtpbmQoImRv
dWJsZUxpdGVyYWwiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVMaXRlcmFsKHRva2VuLm9y
aWdpbiwgK3Rva2VuLnRleHQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNvbnN0
ZXhwcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VUZXJtKCk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlVHlwZUFyZ3VtZW50cygpCisgICAgeworICAgICAgICBpZiAoIXRl
c3QoIjwiKSkKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgCisgICAgICAgIGxldCBy
ZXN1bHQgPSBbXTsKKyAgICAgICAgY29uc3VtZSgiPCIpOworICAgICAgICB3aGlsZSAoIXRlc3Qo
Ij4iKSkgeworICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSBmb3IgYSBjb25zdGV4cHIgb3Ig
dHlwZSBjYW4gc3ludGFjdGljYWxseSBvdmVybGFwIGluIHRoZSBzaW5nbGUKKyAgICAgICAgICAg
IC8vIGlkZW50aWZpZXIgY2FzZS4gTGV0J3MgY29uc2lkZXIgdGhlIHBvc3NpYmlsaXRpZXM6Cisg
ICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gICAgIFQgICAgICAgICAgY291bGQgYmUgdHlw
ZSBvciBjb25zdGV4cHIKKyAgICAgICAgICAgIC8vICAgICBUW10gICAgICAgIG9ubHkgdHlwZQor
ICAgICAgICAgICAgLy8gICAgIFRbNDJdICAgICAgb25seSB0eXBlIChjb25zdGV4cHIgY2Fubm90
IGRvIGluZGV4aW5nKQorICAgICAgICAgICAgLy8gICAgIDQyICAgICAgICAgb25seSBjb25zdGV4
cHIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJbiB0aGUgZnV0dXJlIHdlJ2xsIGFs
bG93IGNvbnN0ZXhwcnMgdG8gZG8gbW9yZSB0aGluZ3MsIGFuZCB0aGVuIHdlJ2xsIHN0aWxsIGhh
dmUKKyAgICAgICAgICAgIC8vIHRoZSBwcm9ibGVtIHRoYXQgc29tZXRoaW5nIG9mIHRoZSBmb3Jt
IFRbMV1bMl1bM10uLi4gY2FuIGVpdGhlciBiZSBhIHR5cGUgb3IgYQorICAgICAgICAgICAgLy8g
Y29uc3RleHByLCBhbmQgd2UgY2FuIGZpZ3VyZSBvdXQgaW4gdGhlIGNoZWNrZXIgd2hpY2ggaXQg
aXMuCisgICAgICAgICAgICBsZXQgdHlwZU9yVmFyaWFibGVSZWYgPSBsZXhlci5iYWNrdHJhY2tp
bmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGNvbnN1bWVLaW5k
KCJpZGVudGlmaWVyIik7CisgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgiLCIsICI+IiwgIj4+
Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlT3JWYXJpYWJsZVJlZihyZXN1bHQu
b3JpZ2luLCByZXN1bHQudGV4dCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICh0
eXBlT3JWYXJpYWJsZVJlZikKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlT3JWYXJp
YWJsZVJlZik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgY29uc3Rl
eHByID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgICAgICAg
ICBsZXQgcmVzdWx0ID0gcGFyc2VDb25zdGV4cHIoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNz
ZXJ0TmV4dCgiLCIsICI+IiwgIj4+Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0ZXhwcikK
KyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29uc3RleHByKQorICAgICAgICAgICAg
ICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VUeXBlKCkpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZUVuZE9mVHlwZUFyZ3Mo
KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFy
c2VUeXBlKCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbjsKKyAgICAgICAgbGV0IGFkZHJlc3NT
cGFjZTsKKyAgICAgICAgbGV0IGFkZHJlc3NTcGFjZUNvbnN1bWVkID0gZmFsc2U7CisgICAgICAg
IGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoLi4uYWRkcmVzc1NwYWNlcykpCisgICAgICAgICAgICBh
ZGRyZXNzU3BhY2UgPSB0b2tlbi50ZXh0OworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWUgPSBj
b25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICBsZXQgdHlwZUFyZ3VtZW50cyA9IHBh
cnNlVHlwZUFyZ3VtZW50cygpOworICAgICAgICBsZXQgdHlwZSA9IG5ldyBUeXBlUmVmKG5hbWUu
b3JpZ2luLCBuYW1lLnRleHQsIHR5cGVBcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAgZnVu
Y3Rpb24gZ2V0QWRkcmVzc1NwYWNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkcmVzc1Nw
YWNlQ29uc3VtZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGFkZHJlc3NTcGFjZSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gYWRkcmVzc1NwYWNlOworICAgICAgICAgICAgcmV0dXJuIHRyeUNv
bnN1bWUoLi4uYWRkcmVzc1NwYWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHdo
aWxlICh0b2tlbiA9IHRyeUNvbnN1bWUoIl4iLCAiWyIpKSB7CisgICAgICAgICAgICBpZiAodG9r
ZW4udGV4dCA9PSAiXiIpIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gbmV3IFB0clR5cGUodG9r
ZW4ub3JpZ2luLCBnZXRBZGRyZXNzU3BhY2UoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0cnlD
b25zdW1lKCJdIikpIHsKKyAgICAgICAgICAgICAgICB0eXBlID0gbmV3IEFycmF5UmVmVHlwZSh0
b2tlbi5vcmlnaW4sIGdldEFkZHJlc3NTcGFjZSgpLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHlwZSA9
IG5ldyBBcnJheVR5cGUodG9rZW4ub3JpZ2luLCB0eXBlLCBwYXJzZUNvbnN0ZXhwcigpKTsKKyAg
ICAgICAgICAgIGNvbnN1bWUoIl0iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYg
KGFkZHJlc3NTcGFjZSAmJiAhYWRkcmVzc1NwYWNlQ29uc3VtZWQpCisgICAgICAgICAgICBsZXhl
ci5mYWlsKCJBZGRyZXNzIHNwYWNlIHNwZWNpZmllZCBmb3IgdHlwZSB0aGF0IGRvZXMgbm90IG5l
ZWQgYWRkcmVzcyBzcGFjZSIpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlwZURlZigpCisgICAgeworICAgICAgICBsZXQg
b3JpZ2luID0gY29uc3VtZSgidHlwZSIpLm9yaWdpbjsKKyAgICAgICAgbGV0IG5hbWUgPSBjb25z
dW1lS2luZCgiaWRlbnRpZmllciIpLnRleHQ7CisgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9
IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgY29uc3VtZSgiPSIpOworICAgICAgICBs
ZXQgdHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAgICBjb25zdW1lKCI7Iik7CisgICAgICAgIHJl
dHVybiBuZXcgVHlwZURlZihvcmlnaW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlKTsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gZ2VuZXJpY1BhcnNlTGVmdCh0ZXh0cywgbmV4dFBhcnNl
ciwgY29uc3RydWN0b3IpCisgICAgeworICAgICAgICBsZXQgbGVmdCA9IG5leHRQYXJzZXIoKTsK
KyAgICAgICAgbGV0IHRva2VuOworICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1lKC4u
LnRleHRzKSkKKyAgICAgICAgICAgIGxlZnQgPSBjb25zdHJ1Y3Rvcih0b2tlbiwgbGVmdCwgbmV4
dFBhcnNlcigpKTsKKyAgICAgICAgcmV0dXJuIGxlZnQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbCh0ZXh0cywgbmV4dFBhcnNlcikKKyAgICB7CisgICAg
ICAgIHJldHVybiBnZW5lcmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgdGV4dHMsIG5leHRQYXJz
ZXIsCisgICAgICAgICAgICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9PgorICAgICAgICAgICAgICAg
IG5ldyBDYWxsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0
LCBbXSwgW2xlZnQsIHJpZ2h0XSkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNh
bGxFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlk
ZW50aWZpZXIiKTsKKyAgICAgICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5cGVBcmd1bWVu
dHMoKTsKKyAgICAgICAgY29uc3VtZSgiKCIpOworICAgICAgICBsZXQgYXJndW1lbnRMaXN0ID0g
W107CisgICAgICAgIHdoaWxlICghdGVzdCgiKSIpKSB7CisgICAgICAgICAgICBhcmd1bWVudExp
c3QucHVzaChwYXJzZUV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUo
IiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1l
KCIpIik7CisgICAgICAgIHJldHVybiBuZXcgQ2FsbEV4cHJlc3Npb24obmFtZS5vcmlnaW4sIG5h
bWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlUG9zc2libGVTdWZmaXgoKQorICAgIHsKKyAgICAgICAgbGV0IHNpbXBsZUNhc2Ug
PSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICBsZXQgbGVmdCA9
IHBhcnNlVGVybSgpOworICAgICAgICAgICAgbGV0IHRva2VuOworICAgICAgICAgICAgd2hpbGUg
KHRva2VuID0gdHJ5Q29uc3VtZSgiKysiLCAiLS0iLCAiLiIsICItPiIsICJbIikpIHsKKyAgICAg
ICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnRleHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlICIr
KyI6CisgICAgICAgICAgICAgICAgY2FzZSAiLS0iOgorICAgICAgICAgICAgICAgICAgICBsZWZ0
ID0gbmV3IFN1ZmZpeENhbGxBc3NpZ25tZW50KHRva2VuLm9yaWdpbiwgIm9wZXJhdG9yIiArIHRv
a2VuLnRleHQsIGxlZnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
ICAgICBjYXNlICIuIjoKKyAgICAgICAgICAgICAgICBjYXNlICItPiI6CisgICAgICAgICAgICAg
ICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICItPiIpCisgICAgICAgICAgICAgICAgICAgICAgICBs
ZWZ0ID0gbmV3IERlcmVmZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIGxlZnQpOworICAg
ICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IERvdEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBs
ZWZ0LCBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJl
YWs7CisgICAgICAgICAgICAgICAgY2FzZSAiWyI6IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0
IGluZGV4ID0gcGFyc2VFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUo
Il0iKTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBJbmRleEV4cHJlc3Npb24odG9r
ZW4ub3JpZ2luLCBsZWZ0LCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCB0b2tlbjogIiArIHRva2VuKTsKKyAgICAgICAgICAg
ICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAg
fSk7CisgICAgICAgIGlmIChzaW1wbGVDYXNlKQorICAgICAgICAgICAgcmV0dXJuIHNpbXBsZUNh
c2U7CisgICAgICAgIAorICAgICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVzc2lvbigpOworICAg
IH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUHJlZml4KCkKKyAgICB7CisgICAg
ICAgIGxldCB0b2tlbjsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiKysiLCAiLS0i
LCAiKyIsICItIiwgIiEiLCAifiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWxsQXNzaWdu
bWVudCh0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBwYXJzZVBvc3NpYmxl
UHJlZml4KCkpOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJeIikpCisgICAgICAg
ICAgICByZXR1cm4gbmV3IERlcmVmZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNl
UG9zc2libGVQcmVmaXgoKSk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIlxcIikp
CisgICAgICAgICAgICByZXR1cm4gbmV3IE1ha2VQdHJFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwg
cGFyc2VQb3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgi
JiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNYWtlQXJyYXlSZWZFeHByZXNzaW9uKHRva2Vu
Lm9yaWdpbiwgcGFyc2VQb3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlUG9z
c2libGVTdWZmaXgoKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVBy
b2R1Y3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIioi
LCAiLyIsICIlIl0sIHBhcnNlUG9zc2libGVQcmVmaXgpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVBvc3NpYmxlU3VtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRP
cGVyYXRvckNhbGwoWyIrIiwgIi0iXSwgcGFyc2VQb3NzaWJsZVByb2R1Y3QpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlU2hpZnQoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIjw8IiwgIj4+Il0sIHBhcnNlUG9zc2libGVTdW0p
OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEluZXF1
YWxpdHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIjwi
LCAiPiIsICI8PSIsICI9PiJdLCBwYXJzZVBvc3NpYmxlU2hpZnQpOworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEVxdWFsaXR5KCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBnZW5lcmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgWyI9PSIsICIhPSJdLCBw
YXJzZVBvc3NpYmxlUmVsYXRpb25hbEluZXF1YWxpdHksCisgICAgICAgICAgICAodG9rZW4sIGxl
ZnQsIHJpZ2h0KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBDYWxsRXhw
cmVzc2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvcj09IiwgW10sIFtsZWZ0LCByaWdodF0pOwor
ICAgICAgICAgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICIhPSIpCisgICAgICAgICAgICAgICAg
ICAgIHJlc3VsdCA9IG5ldyBDYWxsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvciEi
LCBbXSwgW3Jlc3VsdF0pOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAg
ICAgICB9KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VB
bmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIiYiXSwg
cGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxFcXVhbGl0eSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlWG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJz
ZUxlZnRPcGVyYXRvckNhbGwoWyJeIl0sIHBhcnNlUG9zc2libGVCaXR3aXNlQW5kKTsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VPcigpCisgICAgeworICAg
ICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsifCJdLCBwYXJzZVBvc3NpYmxlQml0
d2lzZVhvcik7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTGVmdExvZ2ljYWxFeHBy
ZXNzaW9uKHRleHRzLCBuZXh0UGFyc2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNQ
YXJzZUxlZnQoCisgICAgICAgICAgICB0ZXh0cywgbmV4dFBhcnNlciwKKyAgICAgICAgICAgICh0
b2tlbiwgbGVmdCwgcmlnaHQpID0+IG5ldyBMb2dpY2FsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4s
IHRva2VuLnRleHQsIGxlZnQsIHJpZ2h0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlUG9zc2libGVMb2dpY2FsQW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRM
b2dpY2FsRXhwcmVzc2lvbihbIiYmIl0sIHBhcnNlUG9zc2libGVCaXR3aXNlT3IpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlTG9naWNhbE9yKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBwYXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lvbihbInx8Il0sIHBhcnNlUG9zc2li
bGVMb2dpY2FsQW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVRl
cm5hcnlDb25kaXRpb25hbCgpCisgICAgeworICAgICAgICBsZXQgcHJlZGljYXRlID0gcGFyc2VQ
b3NzaWJsZUxvZ2ljYWxPcigpOworICAgICAgICBsZXQgb3BlcmF0b3IgPSB0cnlDb25zdW1lKCI/
Iik7CisgICAgICAgIGlmICghb3BlcmF0b3IpCisgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRl
OworICAgICAgICByZXR1cm4gbmV3IFRlcm5hcnlFeHByZXNzaW9uKG9wZXJhdG9yLm9yaWdpbiwg
cHJlZGljYXRlLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpLCBwYXJzZVBvc3NpYmxlQXNzaWdu
bWVudCgpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUFzc2lnbm1l
bnQobW9kZSkKKyAgICB7CisgICAgICAgIGxldCBsaHMgPSBwYXJzZVBvc3NpYmxlVGVybmFyeUNv
bmRpdGlvbmFsKCk7CisgICAgICAgIGxldCBvcGVyYXRvciA9IHRyeUNvbnN1bWUoIj0iLCAiKz0i
LCAiLT0iLCAiKj0iLCAiLz0iLCAiJT0iLCAiXj0iLCAifD0iLCAiJj0iKTsKKyAgICAgICAgaWYg
KCFvcGVyYXRvcikgeworICAgICAgICAgICAgaWYgKG1vZGUgPT0gInJlcXVpcmVkIikKKyAgICAg
ICAgICAgICAgICBsZXhlci5mYWlsKCJFeHBlY3RlZCBhc3NpZ25tZW50Iik7CisgICAgICAgICAg
ICByZXR1cm4gbGhzOworICAgICAgICB9CisgICAgICAgIGlmIChvcGVyYXRvci50ZXh0ID09ICI9
IikKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudChvcGVyYXRvci5vcmlnaW4sIGxo
cywgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSk7CisgICAgICAgIGxldCBuYW1lID0gIm9wZXJh
dG9yIiArIG9wZXJhdG9yLnRleHQuc3Vic3RyaW5nKDAsIHRlcm0ub3BlcmF0b3IubGVuZ3RoIC0g
MSk7CisgICAgICAgIHJldHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQob3BlcmF0b3Iub3JpZ2luLCBu
YW1lLCBsaHMsIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KCkpOworICAgIH0KKyAgICAKKyAgICBm
dW5jdGlvbiBwYXJzZUFzc2lnbm1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlUG9z
c2libGVBc3NpZ25tZW50KCJyZXF1aXJlZCIpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZUVmZmVjdGZ1bEV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgbGV0IGFzc2lnbm1lbnQg
PSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7IHJldHVybiBwYXJzZUFzc2lnbm1lbnQo
KTsgfSk7CisgICAgICAgIGlmIChhc3NpZ25tZW50KQorICAgICAgICAgICAgcmV0dXJuIGFzc2ln
bm1lbnQ7CisgICAgICAgIHJldHVybiBwYXJzZUNhbGxFeHByZXNzaW9uKCk7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIGdlbmVyaWNQYXJzZUNvbW1hRXhwcmVzc2lvbihmaW5hbEV4cHJlc3Np
b25QYXJzZXIpCisgICAgeworICAgICAgICBsZXQgbGlzdCA9IFtdOworICAgICAgICBsZXQgb3Jp
Z2luID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAoIW9yaWdpbikKKyAgICAgICAgICAgIGxl
eGVyLmZhaWwoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKyAgICAgICAgb3JpZ2luID0gb3Jp
Z2luLm9yaWdpbjsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgbGV0IGVmZmVjdGZ1
bEV4cHJlc3Npb24gPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7IHJldHVybiBwYXJz
ZUVmZmVjdGZ1bEV4cHJlc3Npb24oKTsgfSk7CisgICAgICAgICAgICBpZiAoIWVmZmVjdGZ1bEV4
cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBsaXN0LnB1c2goZmluYWxFeHByZXNzaW9uUGFy
c2VyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgbGlzdC5wdXNoKGVmZmVjdGZ1bEV4cHJlc3Npb24pOworICAgICAgICAgICAgaWYgKCF0cnlD
b25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIG5ldyBDb21tYUV4cHJlc3Npb24ob3JpZ2luLCBsaXN0KTsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VDb21tYUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGdlbmVyaWNQYXJzZUNvbW1hRXhwcmVzc2lvbihwYXJzZVBvc3NpYmxlQXNzaWdubWVudCk7Cisg
ICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbigpCisgICAgeworICAgICAg
ICByZXR1cm4gcGFyc2VDb21tYUV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gcGFyc2VBc3NpZ25tZW50U3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQg
PSBnZW5lcmljUGFyc2VDb21tYUV4cHJlc3Npb24ocGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKTsK
KyAgICAgICAgY29uc3VtZSgiOyIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZVJldHVybigpCisgICAgeworICAgICAgICBjb25zdW1lKCJy
ZXR1cm4iKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbigpOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBwYXJzZVN0YXRlbWVudCgpCisgICAgeworICAgICAgICBsZXQgdG9rZW4g
PSBsZXhlci5wZWVrKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICI7IikgeworICAgICAg
ICAgICAgbGV4ZXIubmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0K
KyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gInJldHVybiIpCisgICAgICAgICAgICByZXR1cm4g
cGFyc2VSZXR1cm4oKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImJyZWFrIikKKyAgICAg
ICAgICAgIHJldHVybiBwYXJzZUJyZWFrKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJj
b250aW51ZSIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VDb250aW51ZSgpOworICAgICAgICBp
ZiAodG9rZW4udGV4dCA9PSAid2hpbGUiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlV2hpbGUo
KTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImRvIikKKyAgICAgICAgICAgIHJldHVybiBw
YXJzZURvKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJmb3IiKQorICAgICAgICAgICAg
cmV0dXJuIHBhcnNlRm9yKCk7CisgICAgICAgIGxldCBjb21tYUV4cHJlc3Npb24gPSBsZXhlci5i
YWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7IHJldHVybiBwYXJzZUFzc2lnbm1lbnRTdGF0ZW1lbnQo
KTsgfSk7CisgICAgICAgIGlmIChjb21tYUV4cHJlc3Npb24pCisgICAgICAgICAgICByZXR1cm4g
Y29tbWFFeHByZXNzaW9uOworICAgICAgICByZXR1cm4gcGFyc2VWYXJpYWJsZURlY2woKTsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VCbG9jaygpCisgICAgeworICAgICAgICBsZXQg
b3JpZ2luID0gY29uc3VtZSgieyIpLm9yaWdpbjsKKyAgICAgICAgbGV0IGJsb2NrID0gbmV3IEJs
b2NrKG9yaWdpbik7CisgICAgICAgIHdoaWxlICghdGVzdCgifSIpKSB7CisgICAgICAgICAgICBs
ZXQgc3RhdGVtZW50ID0gcGFyc2VTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1l
bnQpCisgICAgICAgICAgICAgICAgYmxvY2sucHVzaChzdGF0ZW1lbnQpOworICAgICAgICB9Cisg
ICAgICAgIGNvbnN1bWUoIn0iKTsKKyAgICAgICAgcmV0dXJuIGJsb2NrOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBwYXJzZUZ1bmNEZWYoKQorICAgIHsKKyAgICAgICAgbGV0IHJldHVyblR5
cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRp
ZmllciIpLnRleHQ7CisgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHBhcnNlVHlwZVBhcmFt
ZXRlcnMoKTsKKyAgICAgICAgY29uc3VtZSgiKCIpOworICAgICAgICBsZXQgcGFyYW1ldGVycyA9
IFtdOworICAgICAgICB3aGlsZSAoIXRlc3QoIikiKSkgeworICAgICAgICAgICAgcGFyYW1ldGVy
cy5wdXNoKHBhcnNlUGFyYW1ldGVyKCkpOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIs
IikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgi
KSIpOworICAgICAgICBsZXQgYmxvY2sgPSBwYXJzZUJsb2NrKCk7CisgICAgICAgIHJldHVybiBG
dW5jRGVmKHJldHVyblR5cGUub3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVy
cywgcGFyYW1ldGVycywgYm9keSk7CisgICAgfQorICAgIAorICAgIGZvciAoOzspIHsKKyAgICAg
ICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAoIXRva2VuKQorICAgICAg
ICAgICAgcmV0dXJuOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiOyIpCisgICAgICAgICAg
ICBsZXhlci5uZXh0KCk7CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gInR5cGUiKQor
ICAgICAgICAgICAgcGFyc2VUeXBlRGVmKCk7CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQg
PT0gIm5hdGl2ZSIpCisgICAgICAgICAgICBwYXJzZU5hdGl2ZVR5cGUoKTsKKyAgICAgICAgZWxz
ZSBpZiAodG9rZW4udGV4dCA9PSAic3RydWN0IikKKyAgICAgICAgICAgIHBhcnNlU3RydWN0VHlw
ZSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJlbnVtIikKKyAgICAgICAgICAg
IHBhcnNlRW51bSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJwcm90b2NvbCIp
CisgICAgICAgICAgICBwYXJzZVByb3RvY29sRGVjbCgpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICBwYXJzZUZ1bmNEZWYoKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb2dyYW0uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgewor
ICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50
cyA9IFtdOworICAgICAgICB0aGlzLl9mdW5jdGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRo
aXMuX3R5cGVzID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICBnZXQgdG9wTGV2ZWxTdGF0
ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzOyB9CisgICAgZ2V0IGZ1
bmN0aW9ucygpIHsgcmV0dXJuIHRoaXMuX2Z1bmN0aW9uczsgfQorICAgIGdldCB0eXBlcygpIHsg
cmV0dXJuIHRoaXMuX3R5cGVzOyB9CisgICAgCisgICAgYWRkVG9wTGV2ZWxTdGF0ZW1lbnQoc3Rh
dGVtZW50KQorICAgIHsKKyAgICAgICAgc3RhdGVtZW50LnByb2dyYW0gPSB0aGlzOworICAgICAg
ICBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgRnVuYykgeworICAgICAgICAgICAgbGV0IGFycmF5
ID0gdGhpcy5fZnVuY3Rpb25zLmdldChzdGF0ZW1lbnQubmFtZSk7CisgICAgICAgICAgICBpZiAo
IWFycmF5KQorICAgICAgICAgICAgICAgIHRoaXMuX2Z1bmN0aW9ucy5zZXQoc3RhdGVtZW50Lm5h
bWUsIGFycmF5ID0gW10pOworICAgICAgICAgICAgYXJyYXkucHVzaChzdGF0ZW1lbnQpOworICAg
ICAgICB9IGVsc2UgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIFR5cGUpCisgICAgICAgICAgICB0
aGlzLl90eXBlcy5zZXQoc3RhdGVtZW50Lm5hbWUsIHN0YXRlbWVudCk7CisgICAgICAgIGVsc2UK
KyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU3RhdGVtZW50IGlzIG5vdCBhIGZ1bmN0aW9u
IG9yIHR5cGU6ICIgKyBzdGF0ZW1lbnQpOworICAgICAgICB0aGlzLl90b3BMZXZlbFN0YXRlbWVu
dHMucHVzaChzdGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICByZXNvbHZlRnVuY092ZXJsb2Fk
KG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpCisgICAgeworICAgICAgICBsZXQg
ZnVuY3Rpb25zID0gdGhpcy5mdW5jdGlvbnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAoIWZ1bmN0
aW9ucykKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgcmV0dXJu
IHJlc29sdmVPdmVybG9hZEltcGwoZnVuY3Rpb25zLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5
cGVzKTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAg
IGxldCByZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVt
ZW50IG9mIHRoaXMudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChz
dGF0ZW1lbnQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvUHJvdG9jb2wuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9j
b2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2Nv
bCBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7
CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0K
KyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQga2luZCgpIHsg
cmV0dXJuIFByb3RvY29sOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Qcm90
b2NvbERlY2wuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNs
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2NvbERlY2wg
ZXh0ZW5kcyBQcm90b2NvbCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsK
KyAgICAgICAgc3VwZXIob3JpZ2luLCBuYW1lKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzID0g
W107CisgICAgICAgIHRoaXMuX3NpZ25hdHVyZU1hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhp
cy5fdHlwZVZhcmlhYmxlID0gbmV3IFR5cGVWYXJpYWJsZShvcmlnaW4sIG5hbWUsIG51bGwpOwor
ICAgIH0KKyAgICAKKyAgICBhZGRTaWduYXR1cmUoc2lnbmF0dXJlKQorICAgIHsKKyAgICAgICAg
Ly8gTk9URTogQW55IHR5cGUgcGFyYW1ldGVycyBmb3VuZCBpbiB0aGUgc2lnbmF0dXJlIG11c3Qg
YmUgaW5mZXJhYmxlIGZyb20gdGhlIHZhbHVlCisgICAgICAgIC8vIHBhcmFtZXRlcnMuCisgICAg
ICAgIC8vIEZJWE1FOiBDaGVjayB0aGlzISAoT09QUyEpCisgICAgICAgIHRoaXMuX3NpZ25hdHVy
ZXMucHVzaChzaWduYXR1cmUpOworICAgICAgICBsZXQgb3ZlcmxvYWRzID0gdGhpcy5fc2lnbmF0
dXJlTWFwLmdldChzaWduYXR1cmUubmFtZSk7CisgICAgICAgIGlmICghb3ZlcmxvYWRzKQorICAg
ICAgICAgICAgdGhpcy5fc2lnbmF0dXJlTWFwLnNldChzaWduYXR1cmUubmFtZSwgb3ZlcmxvYWRz
ID0gW10pOworICAgICAgICBvdmVybG9hZHMucHVzaChzaWduYXR1cmUpOworICAgIH0KKyAgICAK
KyAgICBnZXQgc2lnbmF0dXJlcygpIHsgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZXM7IH0KKyAgICBz
aWduYXR1cmVzQnlOYW1lKG5hbWUpIHsgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQobmFt
ZSk7IH0KKyAgICBnZXQgdHlwZVZhcmlhYmxlKCkgeyByZXR1cm4gdGhpcy5fdHlwZVZhcmlhYmxl
OyB9CisgICAgCisgICAgc2lnbmF0dXJlc0J5TmFtZVdpdGhUeXBlVmFyaWFibGUobmFtZSwgdHlw
ZVZhcmlhYmxlKQorICAgIHsKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IG5ldyBTdWJzdGl0
dXRpb24oW3RoaXMudHlwZVZhcmlhYmxlXSwgW3R5cGVWYXJpYWJsZV0pOworICAgICAgICBsZXQg
cmVzdWx0ID0gdGhpcy5zaWduYXR1cmVzQnlOYW1lKG5hbWUpOworICAgICAgICBpZiAoIXJlc3Vs
dCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChz
aWduYXR1cmUgPT4gc2lnbmF0dXJlLnZpc2l0KHN1YnN0aXR1dGlvbikpOworICAgIH0KKyAgICAK
KyAgICBpbmhlcml0cyhvdGhlclByb3RvY29sKQorICAgIHsKKyAgICAgICAgaWYgKCFvdGhlclBy
b3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIAorICAgICAgICBpZiAo
b3RoZXJQcm90b2NvbCBpbnN0YW5jZW9mIFByb3RvY29sUmVmKQorICAgICAgICAgICAgb3RoZXJQ
cm90b2NvbCA9IG90aGVyUHJvdG9jb2wucHJvdG9jb2xEZWNsOworICAgICAgICAKKyAgICAgICAg
Zm9yIChsZXQgb3RoZXJTaWduYXR1cmUgb2Ygb3RoZXJQcm90b2NvbC5zaWduYXR1cmVzKSB7Cisg
ICAgICAgICAgICBsZXQgc2lnbmF0dXJlcyA9IHRoaXMuc2lnbmF0dXJlc0J5TmFtZShvdGhlclNp
Z25hdHVyZS5uYW1lKTsKKyAgICAgICAgICAgIGlmICghc2lnbmF0dXJlcykKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBsZXQgb3ZlcmxvYWQgPSByZXNvbHZlT3Zl
cmxvYWRJbXBsKHNpZ25hdHVyZXMsIFtdLCBvdGhlclNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcyk7
CisgICAgICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPQorICAgICAgICAgICAg
ICAgIG92ZXJsb2FkLmZ1bmMucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigKKyAg
ICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlm
aWNhdGlvbkNvbnRleHQpOworICAgICAgICAgICAgaWYgKCFzdWJzdGl0dXRlZFJldHVyblR5cGUu
ZXF1YWxzKG90aGVyU2lnbmF0dXJlLnJldHVyblR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisg
ICAgaGFzSGVpcih0eXBlKQorICAgIHsKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IFN1YnN0
aXR1dGlvbi5tYXBwaW5nKFt0aGlzLl90eXBlVmFyaWFibGVdLCBbdHlwZV0pOworICAgICAgICBm
b3IgKGxldCBhYnN0cmFjdFNpZ25hdHVyZSBvZiB0aGlzLl9zaWduYXR1cmVzKSB7CisgICAgICAg
ICAgICBsZXQgc2lnbmF0dXJlID0gc2lnbmF0dXJlLnZpc2l0KHN1YnN0aXR1dGlvbik7CisgICAg
ICAgICAgICBsZXQgb3ZlcmxvYWQgPSB0aGlzLnByb2dyYW0ucmVzb2x2ZUZ1bmNPdmVybG9hZChz
aWduYXR1cmUubmFtZSwgW10sIHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcyk7CisgICAgICAgICAg
ICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
ICAgIAorICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGVkUmV0dXJuVHlwZSA9IG92ZXJsb2FkLmZ1
bmMucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICBv
dmVybG9hZC5mdW5jLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlvbkNvbnRleHQp
OworICAgICAgICAgICAgaWYgKCFzdWJzdGl0dXRlZFJldHVyblR5cGUuZXF1YWxzKHNpZ25hdHVy
ZS5yZXR1cm5UeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiAicHJvdG9jb2wgIiArIHRoaXMubmFtZSArICIgeyAiICsgdGhpcy5z
aWduYXR1cmVzLmpvaW4oIjsgIikgKyAiOyB9IjsKKyAgICB9Cit9CisKKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvUHJvdG9jb2xSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvUHJvdG9jb2xSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJv
dG9jb2xSZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQ
cm90b2NvbFJlZiBleHRlbmRzIFByb3RvY29sIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5h
bWUpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4sIG5hbWUpOworICAgICAgICB0aGlzLnBy
b3RvY29sRGVjbCA9IG51bGw7CisgICAgfQorICAgIAorICAgIGluaGVyaXRzKG90aGVyKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvdG9jb2xEZWNsLmluaGVyaXRzKG90aGVyKTsKKyAg
ICB9CisgICAgCisgICAgaGFzSGVpcih0eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
cHJvdG9jb2xEZWNsLmhhc0hlaXIodHlwZSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvUHRyVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQdHJUeXBlIGV4dGVuZHMgUmVm
ZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisg
ICAgeworICAgICAgICBpZiAoIW90aGVyIGluc3RhbmNlb2YgUHRyVHlwZSkKKyAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5p
ZmljYXRpb25Db250ZXh0LCBvdGhlci5lbGVtZW50VHlwZSk7CisgICAgfQorCisgICAgdG9TdHJp
bmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc1NwYWNlICsgIiAiICsgdGhp
cy5lbGVtZW50VHlwZSArICJeIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1JlZmVyZW5jZVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJl
bmNlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VU
eXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmVmZXJl
bmNlVHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgYWRkcmVzc1Nw
YWNlLCBlbGVtZW50VHlwZSkKKyAgICB7CisgICAgICAgIHZhbGlkYXRlQWRkcmVzc1NwYWNlKGFk
ZHJlc3NTcGFjZSk7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhp
cy5fYWRkcmVzc1NwYWNlID0gYWRkcmVzc1NwYWNlOworICAgICAgICB0aGlzLl9lbGVtZW50VHlw
ZSA9IGVsZW1lbnRUeXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4g
dGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGFkZHJlc3NTcGFjZSgpIHsgcmV0dXJuIHRoaXMuX2Fk
ZHJlc3NTcGFjZTsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1l
bnRUeXBlOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU92ZXJsb2FkSW1wbC5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlT3ZlcmxvYWRJbXBsLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVPdmVybG9hZEltcGwuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitmdW5jdGlvbiByZXNvbHZlT3ZlcmxvYWRJbXBs
KGZ1bmN0aW9ucywgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcykKK3sKKyAgICBmb3IgKGxl
dCBmdW5jIG9mIGZ1bmN0aW9ucykgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGgg
JiYgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gZnVuYy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGFyZ3VtZW50VHlwZXMubGVuZ3RoICE9
IGZ1bmMucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
bGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQoZnVuYy50eXBl
UGFyYW1ldGVycyk7CisgICAgICAgIGxldCBvayA9IHRydWU7CisgICAgICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IGFy
Z3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpXTsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXIgPSBm
dW5jLnR5cGVQYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgaWYgKCFhcmd1bWVudC51bmlmeSh1
bmlmaWNhdGlvbkNvbnRleHQsIHBhcmFtZXRlcikpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZh
bHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIGlmICghb2spCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChsZXQg
aSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAo
IWFyZ3VtZW50VHlwZXNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBmdW5jLnBhcmFtZXRl
cnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghb2spCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVy
aWZ5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbGV0IHNob3VsZEJ1aWxkVHlw
ZUFyZ3VtZW50cyA9ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgaWYgKHNob3VsZEJ1
aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBbXTsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBmdW5jLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodHlwZVBh
cmFtZXRlcik7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50ID09IHR5cGVQYXJhbWV0ZXIp
IHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cykK
KyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnB1c2godHlwZUFyZ3VtZW50KTsKKyAgICAg
ICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJl
dHVybiB7ZnVuYywgdW5pZmljYXRpb25Db250ZXh0LCB0eXBlQXJndW1lbnRzfTsKKyAgICB9Cisg
ICAgCisgICAgcmV0dXJuIG51bGw7Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZl
ci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlci5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlci5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCisvLyBUaGlzIG9ubHkgcmVzb2x2ZXMgbmFtZXMuIEFmdGVy
IHRoaXMgcGhhc2UgcnVucywgYWxsIG5hbWVzIHdpbGwgYmUgcmVzb2x2ZWQuIFRoaXMgbWVhbnMg
dGhhdCBhbGwKKy8vIFhZWlJlZiBvYmplY3RzIG5vdyBrbm93IHdobyB0aGV5IHJlc29sdmUgdG8u
IFRoaXMgZG9lcyBub3QgeWV0IGFsbG93IHR5cGUgYW5hbHlzaXMsIGJlY2F1c2UgdGhlcmUKKy8v
IGFyZSBzdGlsbCBUeXBlRGVmcy4gVGhpcyB0aHJvd3MgdHlwZSBlcnJvcnMgZm9yIGZhaWxlZCBu
YW1lIHJlc29sdXRpb25zIGFuZCBmb3IgdGhpbmdzIHRoYXQgYXJlCisvLyBtb3JlIGNvbnZlbmll
bnQgdG8gY2hlY2sgaGVyZSB0aGFuIGluIHRoZSBDaGVja2VyLiBUaGlzIHVzdWFsbHkgaW52b2x2
ZXMgdGhpbmdzIHRoYXQgbmVlZCB0byBiZQorLy8gY2hlY2tlZCBiZWZvcmUgVHlwZVJlZlRvVHlw
ZURlZlNraXBwZXIuCitjbGFzcyBSZXNvbHZlciBleHRlbmRzIFZpc2l0b3IgeworICAgIC8vIEl0
J3MgdG90YWxseSBPSyB0byBpbnN0YW50aWF0ZSB0aGlzIHdpdGggemVybyBhcmd1bWVudHMgKGku
ZS4gcGFzc2luZyB1bmRlZmluZWQgZm9yIGJvdGggb2YKKyAgICAvLyB0aGVtKSBpZiB5b3UncmUg
Y3JlYXRpbmcgYSBDaGVja2VyIHRvIHZpc2l0IGEgUHJvZ3JhbS4KKyAgICBjb25zdHJ1Y3Rvcihu
YW1lQ29udGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWVDb250ZXh0ID0gbmFtZUNvbnRl
eHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvZ3JhbShub2RlKQorICAgIHsKKyAgICAgICAg
bGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAg
ICAgICAgbmFtZUNvbnRleHQucHJvZ3JhbSA9IG5vZGU7CisgICAgICAgIG5hbWVDb250ZXh0LnJl
Y29nbml6ZUludHJpbnNpY3MoKTsKKyAgICAgICAgbm9kZS5pbnRyaW5zaWNzID0gbmFtZUNvbnRl
eHQuaW50cmluc2ljczsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUudG9wTGV2
ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRkKHN0YXRlbWVudCk7Cisg
ICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBm
b3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAg
ICBuYW1lQ29udGV4dC5kb1N0YXRlbWVudCgoKSA9PiBzdGF0ZW1lbnQudmlzaXQoY2hlY2tlcikp
OworICAgIH0KKyAgICAKKyAgICBfdmlzaXRUeXBlUGFyYW1ldGVyc0FuZEJ1aWxkTmFtZUNvbnRl
eHQobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4
dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Yg
bm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRkKHR5cGVQ
YXJhbWV0ZXIpOworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAg
ICAgfQorICAgICAgICByZXR1cm4gbmFtZUNvbnRleHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0
RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcih0aGlz
Ll92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2RlKSk7CisgICAgICAg
IG5vZGUucmV0dXJuVHlwZS52aXNpdChjaGVja2VyKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1l
dGVyIG9mIG5vZGUucGFyYW1ldGVycykKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChjaGVj
a2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jRGVmKG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyA9IHRoaXMuX3Zpc2l0VHlwZVBhcmFtZXRl
cnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpOworICAgICAgICBsZXQgY2hlY2tlcldpdGhUeXBl
UGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNvbnRleHRXaXRoVHlwZVBhcmFtZXRlcnMpOworICAg
ICAgICBub2RlLnJldHVyblR5cGUudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7Cisg
ICAgICAgIGxldCBjb250ZXh0V2l0aFBhcmFtZXRlcnMgPSBuZXcgTmFtZUNvbnRleHQoY29udGV4
dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2Rl
LnBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChjaGVja2VyV2l0aFR5
cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIGNvbnRleHRXaXRoUGFyYW1ldGVycy5hZGQocGFy
YW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlcldpdGhQYXJhbWV0ZXJzID0g
bmV3IENoZWNrZXIoY29udGV4dFdpdGhQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5ib2R5LnZp
c2l0KGNoZWNrZXJXaXRoUGFyYW1ldGVycyk7CisgICAgfQorICAgIAorICAgIHZpc2l0QmxvY2so
bm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmV3IE5hbWVD
b250ZXh0KHRoaXMuX25hbWVDb250ZXh0KSk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBv
ZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQoY2hlY2tlcik7
CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOwor
ICAgICAgICBuYW1lQ29udGV4dC5hZGQobm9kZS50eXBlVmFyaWFibGUpOworICAgICAgICBsZXQg
Y2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgc2ln
bmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52aXNpdChj
aGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5vZGUpCisgICAgeworICAg
ICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQp
OworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMp
IHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgICAgICBu
YW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAgbGV0IGNo
ZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIG5vZGUudHlwZS52aXNp
dChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNv
bnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFt
ZXRlcnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAg
ICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAg
bGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0
IGZpZWxkIG9mIG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQoY2hlY2tlcik7
CisgICAgfQorICAgIAorICAgIF9yZXNvbHZlVHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRzKQor
ICAgIHsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsg
KytpKSB7CisgICAgICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpXTsK
KyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnQgaW5zdGFuY2VvZiBUeXBlT3JWYXJpYWJsZVJl
ZikgeworICAgICAgICAgICAgICAgIGxldCB0aGluZyA9IHRoaXMuX25hbWVDb250ZXh0LmdldChU
eXBlT3JWYWx1ZSwgdHlwZUFyZ3VtZW50Lm5hbWUpOworICAgICAgICAgICAgICAgIGlmICghdGhp
bmcpCisgICAgICAgICAgICAgICAgICAgIG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmln
aW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB0eXBlIG9yIHZhcmlhYmxlIG5hbWVkICIgKyB0eXBl
QXJndW1lbnQubmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2YgVmFs
dWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50W2ldID0gbmV3IFZhcmlhYmxl
UmVmKHR5cGVBcmd1bWVudC5vcmlnaW4sIHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAgICAg
ICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50W2ldID0gbmV3IFR5
cGVSZWYodHlwZUFyZ3VtZW50Lm9yaWdpbiwgdHlwZUFyZ3VtZW50Lm5hbWUsIFtdKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudFtpXSBp
bnN0YW5jZW9mIFZhbHVlCisgICAgICAgICAgICAgICAgJiYgIXR5cGVBcmd1bWVudFtpXS5pc0Nv
bnN0ZXhwcikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmln
aW4ub3JpZ2luU3RyaW5nLCAiRXhwZWN0ZWQgY29uc3RleHByIik7CisgICAgICAgIH0KKyAgICB9
CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9yZXNv
bHZlVHlwZUFyZ3VtZW50cyhub2RlLnR5cGVBcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAg
bGV0IHR5cGUgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVHlwZSwgbm9kZS5uYW1lKTsKKyAgICAg
ICAgaWYgKCF0eXBlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3Jp
Z2luLm9yaWdpblN0cmluZywgIkNvdWxkIG5vdCBmaW5kIHR5cGUgbmFtZWQgIiArIG5vZGUubmFt
ZSk7CisgICAgICAgIGlmICghdGhpcy5fbmFtZUNvbnRleHQuaXNEZWZpbmVkKHR5cGUpKQorICAg
ICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywg
IklsbGVnYWwgZm9yd2FyZCB1c2Ugb2YgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAg
ICAgbm9kZS50eXBlID0gdHlwZTsKKyAgICAgICAgCisgICAgICAgIGlmICh0eXBlLnR5cGVQYXJh
bWV0ZXJzLmxlbmd0aCAhPSBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAg
dGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyBudW1iZXIg
b2YgdHlwZSBhcmd1bWVudHMiKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlLnR5
cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgcGFyYW1ldGVySXNU
eXBlID0gdHlwZS50eXBlUGFyYW1ldGVyc1tpXSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZTsKKyAg
ICAgICAgICAgIGxldCBhcmd1bWVudElzVHlwZSA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXSBpbnN0
YW5jZW9mIFR5cGU7CisgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHNbaV0udmlzaXQodGhp
cyk7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVySXNUeXBlICYmICFhcmd1bWVudElzVHlwZSkK
KyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmlu
ZywgIkV4cGVjdGVkIHR5cGUsIGJ1dCBnb3QgdmFsdWUgYXQgYXJndW1lbnQgIyIgKyBpKTsKKyAg
ICAgICAgICAgIGlmICghcGFyYW1ldGVySXNUeXBlICYmIGFyZ3VtZW50SXNUeXBlKQorICAgICAg
ICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiRXhw
ZWN0ZWQgdmFsdWUsIGJ1dCBnb3QgdHlwZSBhdCBhcmd1bWVudCAjIiArIGkpOworICAgICAgICB9
CisKKyAgICAgICAgc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9
IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250ZXh0
LmRlZmluZUFsbCgpOworICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KG5ldyBDaGVja2Vy
KG5hbWVDb250ZXh0KSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVmFsdWUs
IG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgdGhyb3cgbmV3
IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkNvdWxkIG5vdCBmaW5kIHZh
cmlhYmxlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBub2RlLnZhcmlhYmxlID0gcmVz
dWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAg
bm9kZS5mdW5jID0gdGhpcy5fbmFtZUNvbnRleHQuY3VycmVudFN0YXRlbWVudDsKKyAgICAgICAg
c3VwZXIudmlzaXRSZXR1cm4obm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2FsbEV4cHJl
c3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Jlc29sdmVUeXBlQXJndW1lbnRzKG5v
ZGUudHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHN1cGVyLnZpc2l0Q2FsbEV4cHJlc3Npb24obm9k
ZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4uanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIFJldHVybiBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdp
biwgdmFsdWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAg
IHRoaXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJl
dHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLl92YWx1
ZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAieyAiICsg
dGhpcy5zdGF0ZW1lbnRzLmpvaW4oIjsgIik7ICsgIjsgfSI7CisgICAgfQorfTsKKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvUmV3cml0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmV3
cml0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV3
cml0ZXIgeworICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBG
dW5jKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyks
CisgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFybWV0ZXIgPT4gdHlw
ZVBhcmFtZXRlci52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFw
KHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRGdW5jUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZ1bmNB
cmd1bWVudChub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgQmxv
Y2sobm9kZS5vcmlnaW4pOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0
ZW1lbnRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChzdGF0ZW1lbnQudmlzaXQodGhpcykpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sUmVm
KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFR5cGVSZWYo
bm9kZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50eXBlQXJndW1lbnRzLm1hcCh0eXBlQXJndW1l
bnQgPT4gdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgICAgIHJlc3VsdC50eXBlID0g
bm9kZS50eXBlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNp
dFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQor
ICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5ldyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUub3JpZ2luLCBub2RlLm5h
bWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0RmllbGQo
bm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGQobm9kZS5vcmlnaW4sIG5vZGUu
bmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZl
cmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IG5vZGUuY29uc3RydWN0
b3Iobm9kZS5yb2dpaW4sIG5vZGUuYWRkcmVzc1NwYWNlLCBub2RlLmVsZW1lbnRUeXBlLnZpc2l0
KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJUeXBlKG5vZGUpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy52aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0QXJyYXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy52
aXNpdFJlZmVyZW5jZVR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlUeXBl
KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5VHlwZShub2RlLm9yaWdpbiwg
bm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXNz
aWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3NpZ25tZW50KG5vZGUu
b3JpZ2luLCBub2RlLmxocy52aXNpdCh0aGlzKSwgbm9kZS5yaHMudmlzaXQodGhpcykpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgICAgICByZXR1
cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAg
ICAgIHJldHVybiBuZXcgUmV0dXJuKG5vZGUub3JpZ2luLCBub2RlLnZhbHVlID8gbm9kZS52YWx1
ZS52aXNpdCh0aGlzKSA6IG51bGwpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEludExpdGVyYWwo
bm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIHZpc2l0Q2Fs
bEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ2FsbEV4cHJlc3Np
b24oCisgICAgICAgICAgICBub2RlLm9yaWdpbiwgbm9kZS5uYW1lLAorICAgICAgICAgICAgbm9k
ZS50eXBlQXJndW1lbnRzLm1hcCh0eXBlQXJndW1lbnQgPT4gdHlwZUFyZ3VtZW50LnZpc2l0KHRo
aXMpKSwKKyAgICAgICAgICAgIG5vZGUuYXJndW1lbnRsaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1
bWVudC52aXNpdCh0aGlzKSkpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
U3RydWN0VHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdHJ1Y3RUeXBlIGV4dGVu
ZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycykK
KyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7
CisgICAgICAgIHRoaXMuX2ZpZWxkcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgYWRk
KGZpZWxkKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcy5oYXMoZmllbGQubmFtZSkp
CisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IoZmllbGQub3JpZ2luLm9yaWdpblN0
cmluZywgIkR1cGxpY2F0ZSBmaWVsZCBuYW1lOiAiICsgZmllbGQubmFtZSk7CisgICAgICAgIHRo
aXMuX2ZpZWxkcy5zZXQoZmllbGQubmFtZSwgZmllbGQpOworICAgIH0KKyAgICAKKyAgICBnZXQg
bmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7
IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAgIGdldCBmaWVsZE5hbWVz
KCkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmtleXMoKTsgfQorICAgIGZpZWxkQnlOYW1lKG5hbWUp
IHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy5nZXQobmFtZSk7IH0KKyAgICBnZXQgZmllbGRzKCkgeyBy
ZXR1cm4gdGhpcy5fZmllbGRzLnZhbHVlcygpOyB9CisgICAgZ2V0IGZpZWxkTWFwKCkgeyByZXR1
cm4gdGhpcy5fZmllbGRzOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAg
IGxldCByZXN1bHQgPSB0cnVlOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxk
cykKKyAgICAgICAgICAgIHJlc3VsdCAmPSBmaWVsZC50eXBlLmlzUHJpbWl0aXZlOworICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZUNvbnRleHQoKQorICAg
IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBOYW1lQ29udGV4dCgpOworICAgICAgICBmb3Ig
KGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMudHlwZVBhcmFtZXRlcnMpCisgICAgfQorICAgIAor
ICAgIGluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBpZiAodHlwZUFy
Z3VtZW50cy5sZW5ndGggIT0gdGhpcy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAg
ICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIldyb25nIG51bWJl
ciBvZiB0eXBlIGFyZ3VtZW50cyB0byBpbnN0YW50aWF0aW9uIik7CisgICAgICAgIAorICAgICAg
ICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgCisgICAgICAg
IGxldCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24ubWFwcGluZyh0aGlzLnR5cGVQYXJhbWV0
ZXJzLCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTdHJ1Y3RUeXBl
KHRoaXMub3JpZ2luLCB0aGlzLm5hbWUsIFtdKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Yg
dGhpcy5maWVsZHMpCisgICAgICAgICAgICByZXN1bHQuYWRkKGZpZWxkLnZpc2l0KHN1YnN0aXR1
dGlvbikpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gInN0cnVjdCAiICsgdGhpcy5uYW1lICsgIjwiICsg
dGhpcy50eXBlUGFyYW1ldGVycyArICI+IHsgIiArIEFycmF5LmZyb20odGhpcy5maWVsZHMpLmpv
aW4oIjsgIikgKyAiOyB9IjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdWJz
dGl0dXRpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9u
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN1YnN0aXR1dGlvbiBl
eHRlbmRzIFJld3JpdGVyIHsKKyAgICBjb25zdHJ1Y3RvcihtYXApCisgICAgeworICAgICAgICB0
aGlzLl9tYXAgPSBtYXA7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBtYXBwaW5nKHBhcmFtZXRl
cnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCAh
PSBhcmd1bWVudExpc3QubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJh
bWV0ZXJzIGFuZCBhcmd1bWVudHMgYXJlIG1pc21hdGNoZWQiKTsKKyAgICAgICAgbGV0IG1hcCA9
IG5ldyBNYXAoKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0
aDsgKytpKQorICAgICAgICAgICAgbWFwLnNldChwYXJhbWV0ZXJzW2ldLCBhcmd1bWVudExpc3Rb
aV0pOworICAgICAgICByZXR1cm4gbmV3IFN1YnN0aXR1dGlvbihtYXApOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBsYWNlbWVudCA9
IHRoaXMuX21hcC5nZXQobm9kZS50eXBlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7Cisg
ICAgICAgICAgICBpZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgICAg
ICB0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBhcmd1bWVudHMgb24gdHlwZSB2YXJp
YWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgIH0KKwor
ICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBsYWNlbWVu
dCA9IHRoaXMuX21hcC5nZXQobm9kZS52YXJpYWJsZSk7CisgICAgICAgIGlmIChyZXBsYWNlbWVu
dCkKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgCisgICAgICAgIHJl
dHVybiBzdXBlci52aXNpdFZhcmlhYmxlUmVmKG5vZGUpOworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdWZmaXhDYWxsQXNzaWdubWVudCBleHRlbmRz
IEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgbGhzKQorICAgIHsK
KyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAg
ICAgIHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5mdW5jID0gbnVsbDsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGxocygp
IHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmxocyArICIgc3VmZml4ICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlw
ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGUgZXh0
ZW5kcyBOb2RlIHsKKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiBbXTsgfQorICAg
IGdldCBraW5kKCkgeyByZXR1cm4gVHlwZTsgfQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29s
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb3RvY29sLmhhc0hlaXIodGhpcyk7CisgICAgfQor
ICAgIAorICAgIGdldCBpbnN0YW50aWF0ZWRUeXBlKCkgeyByZXR1cm4gdGhpczsgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVEZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZURlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5
cGVEZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVQ
YXJhbWV0ZXJzLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOwor
ICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMg
PSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAg
IAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFt
ZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJl
dHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhp
cy5fdHlwZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJl
Zi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVPclZhcmlh
YmxlUmVmIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAg
IHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0g
bmFtZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorCisgICAgdG9TdHJp
bmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1R5cGVSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJl
Zi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWYg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVu
dHMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMu
X25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgICAgICB0aGlzLl90
eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgCisgICAgZ2V0IG9yaWdpbigp
IHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5f
bmFtZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3Vt
ZW50czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHR5cGUgPyB0eXBlLmlzUHJp
bWl0aXZlIDogZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy50eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkKKyAgICB7CisgICAgICAgIGlmICghdGhp
cy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUudW5p
ZnlOb2RlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgc2V0VHlwZUFu
ZEFyZ3VtZW50cyh0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IHR5cGUubmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5f
dHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1w
bCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIg
aW5zdGFuY2VvZiBUeXBlUmVmKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
aWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlKSkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cy5s
ZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRzLmxl
bmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51bmlm
eSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFt
ZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1R5cGVSZWZUb1R5cGVEZWZTa2lwcGVyLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWZUb1R5cGVEZWZTa2lwcGVyLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWZUb1R5cGVEZWZTa2lwcGVyLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVJlZlRvVHlwZURlZlNr
aXBwZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICBjb25zdHJ1Y3RvcigpCisgICAgeworICAgICAg
ICB0aGlzLl92aXNpdGluZyA9IG5ldyBTZXQoKTsKKyAgICB9CisgICAgCisgICAgX2RvVmlzaXQo
dGhpbmcsIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3Zpc2l0aW5nLmhhcyh0
aGluZykpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IodGhpbmcub3JpZ2luLm9y
aWdpblN0cmluZywgIlJlY3Vyc2l2ZSBUeXBlRGVmIik7CisgICAgICAgIHRoaXMuX3Zpc2l0aW5n
LmFkZCh0aGluZyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjYWxsYmFjaygpOworICAg
ICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdGhpcy5fdmlzaXRpbmcuZGVsZXRlKHRoaW5n
KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX2RvVmlzaXQobm9kZSwgKCkgPT4geworICAgICAgICAgICAgc3VwZXIu
dmlzaXRUeXBlUmVmKG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUudHlwZSBpbnN0YW5jZW9m
IFR5cGVEZWYpIHsKKyAgICAgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3
IFVuaWZpY2F0aW9uQ29udGV4dChub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMpOworICAgICAgICAg
ICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlwZS50eXBlUGFy
YW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYXJn
dW1lbnQvcGFyYW1ldGVyIG1pc21hdGNoIChzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBlYXJsaWVy
KSIpOworICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS50eXBlQXJndW1l
bnRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHNb
aV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBub2RlLnR5cGUudHlwZVBhcmFtZXRlcnNbaV0p
OworICAgICAgICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQorICAg
ICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2lu
U3RyaW5nLCAiVHlwZSByZWZlcmVuY2UgdG8gYSB0eXBlIGRlZmluaXRpb24gdmlvbGF0ZXMgcHJv
dG9jb2wgY29uc3RyYWludHMiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBs
ZXQgbmV3VHlwZSA9IG5vZGUudHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihub2RlLnR5cGUu
dHlwZVBhcmFtZXRlcnMsIHVuaWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICAgICAgbmV3
VHlwZS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICBub2RlLnNldFR5cGVBbmRBcmd1ZW1u
dHMobmV3VHlwZSwgW10pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9Cklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIFR5cGVWYXJpYWJsZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9y
KG9yaWdpbiwgbmFtZSwgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9wcm90b2Nv
bCA9IHByb3RvY29sOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgcHJvdG9jb2woKSB7IHJldHVybiB0aGlzLl9wcm90b2NvbDsgfQor
ICAgIAorICAgIGdldCBpc1ByaW1pdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5f
cHJvdG9jb2wgJiYgdGhpcy5fcHJvdG9jb2wuaXNQcmltaXRpdmU7CisgICAgfQorICAgIAorICAg
IGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhw
cm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghcHJvdG9jb2wpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhwcm90b2NvbCk7
CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwg
b3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFR5cGUpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlv
bkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAg
ICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7
CisgICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIp
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZp
Y2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlVmFy
aWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICB9CisgICAgCisgICAg
dmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICBsZXQg
cmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgCisgICAg
ICAgIC8vIFRoZSB0aGluZyB3ZSBnZXQgdW5pZmllZCB3aXRoIG11c3QgYmUgYSB0eXBlIHZhcmlh
YmxlIHRoYXQgYWNjZXB0cyBhIGJyb2FkZXIgc2V0IG9mCisgICAgICAgIC8vIHRoaW5ncyB0aGFu
IHdlIGRvLgorICAgICAgICBpZiAoIShyZWFsVGhpcyBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkp
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlmICghdGhpcy5w
cm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiAhcmVhbFRoaXMucHJvdG9jb2w7CisgICAgICAg
IAorICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhyZWFsVGhpcy5wcm90b2Nv
bCk7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4
dCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICByZXR1cm4gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcykuaW5o
ZXJpdHModGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEw
MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBVbmlmaWNhdGlvbkNvbnRleHQgeworICAgIGNvbnN0cnVjdG9yKHR5
cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSBuZXcg
U2V0KHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5fbmV4dE1hcCA9IG5ldyBNYXAoKTsK
KyAgICB9CisgICAgCisgICAgdW5pb24oYSwgYikKKyAgICB7CisgICAgICAgIGEgPSBmaW5kKGEp
OworICAgICAgICBiID0gZmluZChiKTsKKyAgICAgICAgaWYgKGEgPT0gYikKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICghYi5pc1VuaWZpYWJsZSkKKyAgICAgICAg
ICAgIFthLCBiXSA9IFtiLCBhXTsKKyAgICAgICAgaWYgKCFhLmlzVW5pZmlhYmxlKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdW5pZnkgbm9uLXVuaWZpYWJsZSB0aGluZ3Mg
IiArIGEgKyAiIGFuZCAiICsgYik7CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgdGhh
dCB0eXBlIHBhcmFtZXRlcnMgZG9uJ3QgZW5kIHVwIGJlaW5nIHJvb3RzLgorICAgICAgICBpZiAo
YS5pc1VuaWZpYWJsZSAmJiBiLmlzVW5pZmlhYmxlICYmIHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhh
cyhiKSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBhXTsKKworICAgICAgICB0aGlzLl9uZXh0
TWFwLnNldChhLCBiKTsKKyAgICB9CisgICAgCisgICAgZmluZChub2RlKQorICAgIHsKKyAgICAg
ICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTsKKyAgICAgICAgbGV0IG5leHROb2RlID0gdGhpcy5f
bmV4dE1hcC5nZXQoY3VycmVudE5vZGUpOworICAgICAgICBpZiAoIW5leHROb2RlKQorICAgICAg
ICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAg
ICBjdXJyZW50Tm9kZSA9IG5leHROb2RlOworICAgICAgICAgICAgbmV4dE5vZGUgPSB0aGlzLl9u
ZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICBpZiAoIW5leHROb2RlKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMuX25leHRNYXAuc2V0
KG5vZGUsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOworICAgIH0K
KyAgICAKKyAgICBnZXQgbm9kZXMoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBT
ZXQoKTsKKyAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuX25leHRNYXApIHsK
KyAgICAgICAgICAgIHJlc3VsdC5hZGQoa2V5KTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQodmFs
dWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAg
IHZlcmlmeSgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMu
X3R5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBpZiAoIXR5cGVQYXJhbWV0ZXIudmVyaWZ5
QXNQYXJhbWV0ZXIodGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICB9CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiB0aGlzLm5vZGVzKSB7CisgICAg
ICAgICAgICBpZiAoIXR5cGVBcmd1bWVudC5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIGlmICh0aGlzLl90eXBlUGFyYW1ldGVycy5oYXModHlwZUFy
Z3VtZW50KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghdHlw
ZUFyZ3VtZW50LnZlcmlmeUFzQXJndW1lbnQodGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAg
ICBpc1VudW5pZmllZCgpCisgICAgeworICAgICAgICByZXR1cm4gIXRoaXMuX25leHRNYXAuc2l6
ZSgpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBWYWx1ZSBleHRlbmRzIE5vZGUgeworICAgIGdldCBraW5kKCkgeyByZXR1cm4g
VmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiBmYWxzZTsgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9WYXJpYWJsZVJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIFZhcmlhYmxlUmVmIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAg
dGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFyaWFibGUgPSBudWxsOworICAgIH0K
KyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgaXND
b25zdGV4cHIoKSB7IHJldHVybiB0aGlzLnZhcmlhYmxlLmlzQ29uc3RleHByOyB9CisgICAgZ2V0
IHVuaWZ5Tm9kZSgpIHsgcmV0dXJuIHRoaXMudmFyaWFibGUudW5pZnlOb2RlOyB9CisgICAgCisg
ICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvVmlzaXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2MCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBWaXNpdG9yIHsKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAo
bGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0
YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jKG5vZGUpCisg
ICAgeworICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAo
bGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5
cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBu
b2RlLnBhcmFtZXRlcnMpCisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAg
fQorICAgIAorICAgIHZpc2l0RnVuY1BhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9k
ZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNEZWYobm9kZSkK
KyAgICB7CisgICAgICAgIHZpc2l0RnVuYyhub2RlKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0
KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAg
ICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3Rh
dGVtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sUmVmKG5v
ZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAg
IHsKKyAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAg
ICAgICAgIHNpZ25hdHVyZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBl
UmVmKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50
eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAo
bGV0IHR5cGVQYXJhbXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlw
ZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5v
ZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBh
cmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAg
ICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0U3RydWN0VHlw
ZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5
cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAg
ICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52
aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAg
ICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQor
ICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0RWxlbWVudGFsVHlwZShub2RlKQorICAgIHsKKyAgICAgICAg
bm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJU
eXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAg
IHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFy
cmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9k
ZSk7CisgICAgICAgIG5vZGUubnVtRWxlbWVudHMudmlzaXQodGhpcyk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5saHMudmlzaXQo
dGhpcyk7CisgICAgICAgIG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVy
bihub2RlKQorICAgIHsKKyAgICAgICAgaWYgKG5vZGUudmFsdWUpCisgICAgICAgICAgICBub2Rl
LnZhbHVlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXN0SW50TGl0ZXJhbChub2Rl
KQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAg
IHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykK
KyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQg
YXJndW1lbnQgb2Ygbm9kZS5hcmd1bWVudExpc3QpCisgICAgICAgICAgICBhcmd1bWVudC52aXNp
dCh0aGlzKTsKKyAgICB9Cit9CisK
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319220</attachid>
            <date>2017-08-28 17:28:12 -0700</date>
            <delta_ts>2017-08-28 18:36:28 -0700</delta_ts>
            <desc>started working on the interrpeter</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>171340</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgYWRkcmVz
c1NwYWNlcyA9IFsiY29uc3RhbnQiLCAiZGV2aWNlIiwgInRocmVhZGdyb3VwIiwgInRocmVhZCJd
OworCitmdW5jdGlvbiBpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7CisgICAgc3dpdGNo
IChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2FzZSAiZGV2aWNl
IjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
K30KKworZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAg
IGlmICghaXNBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKSkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYWRkcmVzcyBzcGFjZTogIiArIGFkZHJlc3NTcGFjZSk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFzIFRbY10gZm9y
IGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1YWdlLgorY2xh
c3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0
YW5jZW9mIEFycmF5UmVmVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBpZiAodGhpcy5hZGRyZXNzU3BhY2UgIT0gInRocmVhZCIpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIg
IiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fy
cmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1F
bGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVu
dHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vs
ZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxl
bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAg
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsK
KyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQXJyYXlSZWZUeXBlKSB7CisgICAgICAgICAg
ICBpZiAob3RoZXIuYWRkcmVzc1NwYWNlICE9ICJ0aHJlYWQiKQorICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGlu
c3RhbmNlb2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmICghdGhpcy5udW1FbGVtZW50cy51bmlmeSh1bmlmaWNh
dGlvbkNvbnRleHQsIG90aGVyLm51bUVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRU
eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9Bc3NpZ25tZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBsaHMsIHJocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7Cisg
ICAgICAgIHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgIH0K
KyAgICAKKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJocygp
IHsgcmV0dXJuIHRoaXMuX3JoczsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmxocyArICIgPSAiICsgdGhpcy5yaHM7CisgICAgfQorfTsKKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2suanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQmxvY2suanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2su
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBCbG9jayBleHRl
bmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fc3RhdGVtZW50cyA9IFtdOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgCisg
ICAgYWRkKHN0YXRlbWVudCkKKyAgICB7CisgICAgICAgIHRoaXMuX3N0YXRlbWVudHMucHVzaChz
dGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGVtZW50cygpIHsgcmV0dXJuIHRo
aXMuX3N0YXRlbWVudHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0K
K307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNz
aW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgICAgICB0aGlz
LmZ1bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJo
cygpIHsgcmV0dXJuIHRoaXMuX3JoczsgfSAvLyBUaGlzIGNhbiBiZSBudWxsLgorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxocyArICIgIiArIHRoaXMu
bmFtZSArICh0aGlzLnJocyA/ICI9ICIgKyB0aGlzLnJocyA6ICIiKTsKKyAgICB9Cit9CisKSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQ2FsbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkK
KyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICAgICAg
dGhpcy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAgICAgICB0aGlzLmZ1bmMgPSBu
dWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0K
KyAgICBnZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8
IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCArICIpIjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9DaGVja2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTg4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIENoZWNrZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICBjb25zdHJ1Y3Rvcihw
cm9ncmFtKQorICAgIHsKKyAgICAgICAgdGhpcy5fcHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAg
IHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgIH0KKyAgICAKKyAgICB2aXNpdFBy
b2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRv
cExldmVsU3RhdGVtZW50cykgeworICAgICAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9
IHN0YXRlbWVudDsKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAg
fQorICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykgeworICAgICAgICAgICAg
bGV0IHNldCA9IG5ldyBTZXQoKTsKKyAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnNpZGVyKHRoaW5n
KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGluZy5pc1VuaWZpYWJsZSkK
KyAgICAgICAgICAgICAgICAgICAgc2V0LmFkZCh0aGluZyk7CisgICAgICAgICAgICB9CisgICAg
ICAgICAgICBjbGFzcyBOb3RpY2VUeXBlVmFyaWFibGUgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAg
ICAgICAgICAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAg
ICAgICAgICAgICAgIGNvbnNpZGVyKG5vZGUudHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7Cisg
ICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyKG5vZGUudmFyaWFibGUpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBub3RpY2VUeXBlVmFyaWFibGUg
PSBuZXcgTm90aWNlVHlwZVZhcmlhYmxlKCk7CisgICAgICAgICAgICBmb3IgKGxldCBwYXJhbWV0
ZXJUeXBlIG9mIHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcykKKyAgICAgICAgICAgICAgICBwYXJh
bWV0ZXJUeXBlLnZpc2l0KG5vdGljZVR5cGVWYXJpYWJsZSk7CisgICAgICAgICAgICBmb3IgKGxl
dCB0eXBlUGFyYW1ldGVyIG9mIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAg
ICAgICAgIGlmICghc2V0Lmhhcyh0eXBlUGFyYW1ldGVyKSkKKyAgICAgICAgICAgICAgICAgICAg
dGhyb3cgQUxUeXBlRXJyb3IodHlwZVBhcmFtZXRlci5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlw
ZSBwYXJhbWV0ZXIgdG8gcHJvdG9jb2wgc2lnbmF0dXJlIG5vdCBpbmZlcnJhYmxlIGZyb20gdmFs
dWUgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZXQuaGFz
KG5vZGUudHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJy
b3Ioc2lnbmF0dXJlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJQcm90b2NvbCdzIHR5cGUgdmFyaWFi
bGUgbm90IG1lbnRpb25lZCBpbiBzaWduYXR1cmUiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICBfY2hlY2tUeXBlQXJndW1lbnRzKG9yaWdpbiwgdHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1
bWVudHMpCisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJz
Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSB0eXBlQXJn
dW1lbnRzW2ldIGluc3RhbmNlb2YgVHlwZTsKKyAgICAgICAgICAgIGxldCByZXN1bHQgPSBub2Rl
LnR5cGVBcmd1bWVudHNbaV0udmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRJ
c1R5cGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHNbaV0uaW5oZXJpdHMo
dHlwZUFyZ3VtZW50c1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVF
cnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBhcmd1bWVudCBkb2VzIG5vdCBpbmhlcml0
IHByb3RvY29sIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgh
cmVzdWx0LmVxdWFscyh0eXBlUGFyYW1ldGVyc1tpXS50eXBlKSkKKyAgICAgICAgICAgICAgICAg
ICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyB0eXBl
IGZvciBjb25zdGV4cHIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAK
KyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2NoZWNrVHlwZUFy
Z3VtZW50cyhub2RlLm9yaWdpbiwgdHlwZS50eXBlUGFyYW1ldGVycywgbm9kZS50eXBlQXJndW1l
bnRzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgewor
ICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpOworICAgICAgICAKKyAgICAgICAg
aWYgKG5vZGUuYWRkcmVzc1NwYWNlID09ICJ0aHJlYWQiKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICAKKyAgICAgICAgY2xhc3MgSW5zdGFudGlhdGVJbW1lZGlhdGVzIGV4dGVuZHMgUmV3
cml0ZXIgeworICAgICAgICAgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgICAgICAgICB7Cisg
ICAgICAgICAgICAgICAgbm9kZSA9IHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICAgICAg
ICAgICAgICByZXR1cm4gbm9kZS5pbnN0YW50aWF0ZWRUeXBlLnZpc2l0KHRoaXMpOworICAgICAg
ICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9k
ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKCFub2RlLmVsZW1lbnRUeXBl
LnZpc2l0KG5ldyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMoKSkuaXNQcmltaXRpdmUpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiSWxs
ZWdhbCBwb2ludGVyIHRvIG5vbi1wcmltaXRpdmUgdHlwZSIpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgaWYgKCFub2RlLm51bUVsZW1lbnRz
LmlzQ29uc3RleHByKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3Jp
Z2luLm9yaWdpblN0cmluZywgIkFycmF5IGxlbmd0aCBtdXN0IGJlIGNvbnN0ZXhwciIpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7CisgICAgICAgIC8vIEZJ
WE1FOiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGxocyBpcyBhc3NpZ25hYmxlLgorICAgICAg
ICBsZXQgbGhzVHlwZSA9IG5vZGUubGhzLnZpc2l0KHRoaXMpOworICAgICAgICBsZXQgcmhzVHlw
ZSA9IG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgICAgICBpZiAoIWxoc1R5cGUuZXF1YWxzKHJo
c1R5cGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9y
aWdpblN0cmluZywgIlR5cGUgbWlzbWF0Y2ggaW4gYXNzaWdubWVudDogIiArIGxoc1R5cGUgKyAi
IHZlcnN1cyAiICsgcmhzVHlwZSk7CisgICAgICAgIHJldHVybiBsaHNUeXBlOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gcmVz
dWx0LnR5cGU7CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAg
ICAgICBpZiAobm9kZS52YWx1ZSkgeworICAgICAgICAgICAgbGV0IHJlc3VsdFR5cGUgPSBub2Rl
LnZhbHVlLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgaWYgKCF0aGlzLmZ1bmMucmV0dXJuVmFs
dWUuZXF1YWxzKHJlc3VsdFR5cGUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVF
cnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUcnlpbmcgdG8gcmV0dXJuICIgKyByZXN1
bHRUeXBlICsgIiBpbiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAiICsgZnVuYy5yZXR1cm5WYWx1
ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlm
ICghZnVuYy5yZXR1cm5WYWx1ZS5lcXVhbHModGhpcy5fcHJvZ3JhbS5pbnRyaW5zaWNzLnZvaWQp
KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0
cmluZywgIk5vbi12b2lkIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUiKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fcHJvZ3JhbS5pbnRyaW5zaWNzLmludDMyOworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxF
eHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Yg
bm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMp
OworICAgICAgICBsZXQgYXJndW1lbnRUeXBlcyA9IG5vZGUuYXJndW1lbnRMaXN0Lm1hcChhcmd1
bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSk7CisgICAgICAgIAorICAgICAgICBsZXQgb3Zl
cmxvYWQgPSBudWxsOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMuX2N1
cnJlbnRTdGF0ZW1lbnQudHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGlmICghKHR5cGVQ
YXJhbWV0ZXIgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGUpKQorICAgICAgICAgICAgICAgIGNvbnRp
bnVlOworICAgICAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLnByb3RvY29sKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZXMgPQorICAgICAgICAg
ICAgICAgIHR5cGVQYXJhbWV0ZXIucHJvdG9jb2wuc2lnbmF0dXJlc0J5TmFtZVdpdGhUeXBlVmFy
aWFibGUobm9kZS5uYW1lLCB0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgICAgIGlmICghc2lnbmF0
dXJlcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG92ZXJsb2FkID0g
cmVzb2x2ZU92ZXJsb2FkSW1wbChzaWduYXR1cmVzLCBub2RlLnR5cGVBcmd1bWVudHMsIGFyZ3Vt
ZW50VHlwZXMpOworICAgICAgICAgICAgaWYgKG92ZXJsb2FkKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghb3ZlcmxvYWQpIHsKKyAgICAgICAgICAgIG92
ZXJsb2FkID0gdGhpcy5fbmFtZUNvbnRleHQucHJvZ3JhbS5yZXNvbHZlRnVuY092ZXJsb2FkKAor
ICAgICAgICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS50eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5
cGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkRpZCBub3QgZmlu
ZCBmdW5jdGlvbiBmb3IgY2FsbCIpOworICAgICAgICBub2RlLmZ1bmMgPSBvdmVybG9hZC5mdW5j
OworICAgICAgICBub2RlLmFjdHVhbFR5cGVBcmd1bWVudHMgPSBvdmVybG9hZC50eXBlQXJndW1l
bnRzOworICAgICAgICByZXR1cm4gb3ZlcmxvYWQuZnVuYy5yZXR1cm5UeXBlLnN1YnN0aXR1dGVU
b1VuaWZpY2F0aW9uKAorICAgICAgICAgICAgb3ZlcmxvYWQuZnVuYy50eXBlUGFyYW1ldGVycywg
b3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0NvbW1hRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9Db21tYUV4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvQ29tbWFFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgQ29tbWFFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBsaXN0KQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAg
ICAgdGhpcy5fbGlzdCA9IGxpc3Q7CisgICAgfQorICAgIAorICAgIGdldCBsaXN0KCkgeyByZXR1
cm4gdGhpcy5fbGlzdDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiAiKCIgKyB0aGlzLmxpc3QudG9TdHJpbmcoKSArICIpIjsKKyAgICB9Cit9OworCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENvbnN0ZXhwclR5cGVQYXJh
bWV0ZXIgZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBl
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1
cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRydWU7IH0K
KyAgICBnZXQgaXNVbmlmaWFibGUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgdHlwZVZh
cmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlm
ICghKG90aGVyIGluc3RhbmNlb2YgVmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
CisgICAgICAgIGlmICghdGhpcy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIu
dHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbGV0IHJlYWxUaGlz
ID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcyk7CisgICAgICAgIGlmIChyZWFsVGhpcyAh
PSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHJlYWxUaGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIpOworICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVmFy
aWFibGVSZWYpCisgICAgICAgICAgICBvdGhlciA9IG90aGVyLnZhcmlhYmxlOworICAgICAgICAK
KyAgICAgICAgdW5pZmljYXRpb25Db250ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRl
eHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlVW5pZnko
dW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzQXJn
dW1lbnQodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4dCkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRUZsb2F0LmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0VGbG9hdC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9FRmxvYXQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBFRmxvYXQgZXh0ZW5kcyBFVmFsdWUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKQor
ICAgIHsKKyAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7
CisgICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0VJbnQuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvRUludC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9F
SW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRUludCBl
eHRlbmRzIEVWYWx1ZSB7CisgICAgY29uc3RydWN0b3IodHlwZSwgdmFsdWUpCisgICAgeworICAg
ICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICBh
ZGQob3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEVJbnQodGhpcy50eXBlLCAodGhp
cy52YWx1ZSArIG90aGVyLnZhbHVlKSB8IDApOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygp
CisgICAgeworICAgICAgICByZXR1cm4gIiIgKyB0aGlzLnZhbHVlOworICAgIH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvRVZhbHVlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL0VWYWx1ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FVmFs
dWUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFVmFsdWUg
eworICAgIGNvbnN0cnVjdG9yKHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl90eXBlID0gdHlw
ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRpb25Db21tb24uanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdGlvbkNvbW1vbi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0aW9uQ29tbW9uLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgQnJlYWtFeGNlcHRpb24gPSBTeW1ib2woIkJy
ZWFrRXhjZXB0aW9uIik7Citjb25zdCBDb250aW51ZUV4Y2VwdGlvbiA9IFN5bWJvbCgiQ29udGlu
dWVFeGNlcHRpb24iKTsKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRvci5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0b3IuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgRXZhbHVhdG9yIGV4dGVuZHMgVmlzaXRvciB7CisgICAgY29u
c3RydWN0b3IoKQorICAgIHsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0V4
cHJlc3Npb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lvbi5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRz
IFZhbHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4pCisgICAgeworICAgICAgICB0aGlzLl9v
cmlnaW4gPSBvcmlnaW47CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgRmllbGQgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkK
KyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBn
ZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJl
dHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSAr
ICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5j
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuYy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNl
IHN0cmljdCI7CisKK2NsYXNzIEZ1bmMgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3Rvcihu
YW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycykKKyAgICB7CisgICAg
ICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9yZXR1cm5UeXBlID0gcmV0dXJu
VHlwZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAg
ICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgfQorICAgIAorICAgIGdl
dCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCByZXR1cm5UeXBlKCkgeyBy
ZXR1cm4gdGhpcy5fcmV0dXJuVHlwZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0
dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlcnMoKSB7IHJldHVy
biB0aGlzLl9wYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlclR5cGVzKCkgeyByZXR1cm4g
dGhpcy5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLnR5cGUpOyB9CisgICAg
CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBGdW5jOyB9CisgICAgCisgICAgdW5pZnlJbXBsKG90
aGVyKQorICAgIHsKKyAgICAgICAgCisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnJldHVyblR5cGUgKyAiICIgKyB0aGlzLm5hbWUgKyAiPCIg
KyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4oIiArIHRoaXMucGFyYW1ldGVycyArICIpIjsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNEZWYuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0RlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9GdW5jRGVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgRnVuY0RlZiBleHRlbmRzIEZ1bmMgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
bmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMsIGJvZHkpCisgICAg
eworICAgICAgICBzdXBlcihuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1l
dGVycyk7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fYm9k
eSA9IGJvZHk7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9v
cmlnaW47IH0KKyAgICBnZXQgYm9keSgpIHsgcmV0dXJuIHRoaXMuX2JvZHk7IH0KKyAgICAKKyAg
ICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIg
eyAiICsgYm9keSArICIgfSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9G
dW5jSW5zdGFudGlhdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNJ
bnN0YW50aWF0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0lu
c3RhbnRpYXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IEZ1bmNJbnN0YW50aWF0b3IgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRo
aXMuX2luc3RhbmNlcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgLy8gUmV0dXJucyBh
IEZ1bmMgb2JqZWN0IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgc3lzdGVt
IG9mIHR5cGUgYXJndW1lbnRzLgorICAgIGdldFVuaXF1ZShmdW5jLCB0eXBlQXJndW1lbnRzKQor
ICAgIHsKKyAgICAgICAgbGV0IGluc3RhbmNlcyA9IHRoaXMuX2luc3RhbmNlcy5nZXQoZnVuYyk7
CisgICAgICAgIGlmICghZnVuY3Rpb25zKQorICAgICAgICAgICAgdGhpcy5fZnVuY3Rpb25zLnNl
dChmdW5jLCBmdW5jdGlvbnMgPSBbXSk7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBpbnN0
YW5jZSBvZiBpbnN0YW5jZXMpIHsKKyAgICAgICAgICAgIGxldCBvayA9IHRydWU7CisgICAgICAg
ICAgICBmb3IgKGxldCBpID0gaW5zdGFuY2UudHlwZUFyZ3VtZW50cy5sZW5ndGg7IGktLTspIHsK
KyAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlLnR5cGVBcmd1bWVudHNbaV0uZXF1YWxzKHR5
cGVBcmd1bWVudHNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZJ
WE1FOiBJbnN0YW50aWF0ZSB0aGUgZGFnZ29uZSB0aGluZworICAgICAgICBsZXQgaW5zdGFuY2Ug
PSB0aGluZ3M7CisgICAgICAgIGluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTsKKyAgICAgICAgcmV0
dXJuIGluc3RhbmNlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY1Bh
cmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jUGFyYW1ldGVy
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNQYXJhbWV0ZXIuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jUGFyYW1ldGVy
IHsKKyAgICAvLyBUaGUgbmFtZSBpcyBvcHRpb25hbC4gSXQncyBPSyBmb3IgaXQgdG8gYmUgbnVs
bCEKKyAgICBjb25zdHJ1Y3RvcihuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBn
ZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJu
IHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvRnVuY1NpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9GdW5jU2lnbmF0dXJlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0Z1bmNTaWduYXR1cmUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvSW50TGl0ZXJhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIEludExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3Rvcihv
cmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhp
cy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4g
dGhpcy5fdmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIiICsgdGhpcy5fdmFs
dWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIEludHJpbnNpY3MgeworICAgIGNvbnN0cnVjdG9yKCkK
KyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKworICAgICAgICB0aGlzLl9t
YXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSB2b2lkPD4iLAorICAg
ICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnZvaWQgPSB0eXBlOwor
ICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJu
YXRpdmUgcHJpbWl0aXZlIHR5cGUgaW50MzI8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4gewor
ICAgICAgICAgICAgICAgIHRoaXMuaW50MzIgPSB0eXBlOworICAgICAgICAgICAgfSk7CisKKyAg
ICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUg
ZG91YmxlPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlz
LmRvdWJsZSA9IHR5cGU7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgYWRkKHRo
aW5nKQorICAgIHsKKyAgICAgICAgbGV0IGludHJpbnNpYyA9IHRoaXMuX21hcC5nZXQodGhpbmcu
bmFtZSk7CisgICAgICAgIGlmICghaW50cmluc2ljKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFM
VHlwZUVycm9yKHRoaW5nLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJVbnJlY29nbml6ZWQgaW50cmlu
c2ljOiAiICsgdGhpbmcpOworICAgICAgICBpbnRyaW5zaWModGhpbmcpOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTEhTRXZhbHVhdG9yLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0xIU0V2YWx1YXRvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9MSFNFdmFsdWF0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBMSFNFdmFsdWF0b3IgeworICAgIAorfQorCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9MVmFsdWUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTFZhbHVl
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0xWYWx1ZS5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIExWYWx1ZSB7CisgICAgY29uc3Ry
dWN0b3IodmFsdWUpCisgICAgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQor
ICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiTDooIiArIHRoaXMu
dmFsdWUgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlci5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBMZXhlciB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB0ZXh0
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl90
ZXh0ID0gdGV4dDsKKyAgICAgICAgdGhpcy5faW5kZXggPSAwOworICAgICAgICB0aGlzLl9zdGFj
ayA9IFtdOworICAgIH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5saW5lTnVtYmVyRm9ySW5kZXgodGhpcy5faW5kZXgpOworICAgIH0KKyAg
ICAKKyAgICBnZXQgb3JpZ2luU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9v
cmlnaW4gKyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIGxp
bmVOdW1iZXJGb3JJbmRleChpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0
LnN1YnN0cmluZygwLCBpbmRleCkubWF0Y2goL1xuL2cpLmxlbmd0aDsKKyAgICB9CisgICAgCisg
ICAgZ2V0IHN0YXRlKCkgeyByZXR1cm4gdGhpcy5faW5kZXg7IH0KKyAgICBzZXQgc3RhdGUodmFs
dWUpIHsgdGhpcy5faW5kZXggPSB2YWx1ZTsgfQorICAgIAorICAgIG5leHQoKQorICAgIHsKKyAg
ICAgICAgaWYgKHRoaXMuX3N0YWNrLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9z
dGFjay5wb3AoKTsKKyAgICAgICAgCisgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSB0aGlzLl90
ZXh0Lmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAg
Y29uc3QgaXNDQ29tbWVudEJlZ2luID0gL1wvXCovOworICAgICAgICBjb25zdCBpc0NQbHVzUGx1
c0NvbW1lbnRCZWdpbiA9IC9cL1wvLzsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1bHQgPSAo
a2luZCkgPT4geworICAgICAgICAgICAgbGV0IHRleHQgPSBSZWdFeHAubGFzdE1hdGNoOworICAg
ICAgICAgICAgbGV0IHRva2VuID0gbmV3IExleGVyVG9rZW4odGhpcywgdGhpcy5faW5kZXgsIGtp
bmQsIHRleHQpOworICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gdGV4dC5sZW5ndGg7CisgICAg
ICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IHJlbGV2YW50
VGV4dDsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgcmVsZXZhbnRUZXh0ID0gdGhp
cy5fdGV4dC5zdWJzdHJpbmcodGhpcy5faW5kZXgpOworICAgICAgICAgICAgaWYgKC9eXHMrLy50
ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBSZWdF
eHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgIGlmICgvXlwvXCovLnRlc3QocmVsZXZhbnRUZXh0KSkgeworICAg
ICAgICAgICAgICAgIGxldCBlbmRJbmRleCA9IHJlbGV2YW50VGV4dC5zZWFyY2goL1wqXC8vKTsK
KyAgICAgICAgICAgICAgICBpZiAoZW5kSW5kZXggPCAwKQorICAgICAgICAgICAgICAgICAgICB0
aGlzLmZhaWwoIlVudGVybWluYXRlZCBjb21tZW50Iik7CisgICAgICAgICAgICAgICAgdGhpcy5f
aW5kZXggKz0gZW5kSW5kZXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICB9CisgICAgICAgICAgICBpZiAoL15cL1wvLiovLnRlc3QocmVsZXZhbnRUZXh0KSkgeworICAg
ICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gubGVuZ3RoOworICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgZG8gVW5p
Y29kZS4KKyAgICAgICAgaWYgKC9eW15cZFxXXVx3Ki8udGVzdChyZWxldmFudFRleHQpKQorICAg
ICAgICAgICAgcmV0dXJuIHJlc3VsdCgiaWRlbnRpZmllciIpOworCisgICAgICAgIGlmICgvXlsw
LTldKy8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiaW50
TGl0ZXJhbCIpOworCisgICAgICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgaGFuZGxlIGV4cC1mb3Jt
IGxpdGVyYWxzIGxpa2UgMWUxLgorICAgICAgICBpZiAoL14oWzAtOV0qXC5bMC05XSspfChbMC05
XStcLlswLTldKikvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1
bHQoImRvdWJsZUxpdGVyYWwiKTsKKyAgICAgICAgCisgICAgICAgIGlmICgvXihzdHJ1Y3R8cHJv
dG9jb2x8dHlwZXxpZnxlbHNlfGVudW18Y29udGludWV8YnJlYWt8c3dpdGNofGNhc2V8ZGVmYXVs
dHxmb3J8d2hpbGV8ZG98cmV0dXJufHNpemVvZnxjb25zdGFudHxkZXZpY2V8dGhyZWFkZ3JvdXB8
dGhyZWFkfG9wZXJhdG9yKS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJu
IHJlc3VsdCgia2V5d29yZCIpOworICAgICAgICAKKyAgICAgICAgaWYgKC9eKFt7fSgpXFtcXT86
PSsqXC8sLiUhfl4mfDw+XFwtXXwtPnw9Pnw8PXw9PXwhPXwrPXwtPXxcKj18XC89fCU9fF49fFx8
PXwmPSkvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoInB1
bmN0dWF0aW9uIik7CisgICAgICAgIAorICAgICAgICBmYWlsKCJVbnJlY29nbml6ZWQgdG9rZW4g
YmVnaW5uaW5nIHdpdGg6ICIgKyByZWxldmFudFRleHQuc3Vic3RyaW5nKDAsIDEwKSk7CisgICAg
fQorICAgIAorICAgIHB1c2godG9rZW4pCisgICAgeworICAgICAgICB0aGlzLl9zdGFjay5wdXNo
KHRva2VuKTsKKyAgICB9CisgICAgCisgICAgcGVlaygpCisgICAgeworICAgICAgICBsZXQgcmVz
dWx0ID0gbmV4dCgpOworICAgICAgICBwdXNoKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgfQorICAgIAorICAgIGZhaWwoZXJyb3IpCisgICAgeworICAgICAgICB0aHJvdyBu
ZXcgQUxTeW50YXhFcnJvcih0aGlzLm9yaWdpblN0cmluZywgZXJyb3IpOworICAgIH0KKyAgICAK
KyAgICBiYWNrdHJhY2tpbmdTY29wZShjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCBzdGF0
ZSA9IHRoaXMuc3RhdGU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY2FsbGJh
Y2soKTsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2Vv
ZiBBTFN5bnRheEVycm9yKSB7CisgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwor
ICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
dGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xl
eGVyVG9rZW4uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4ZXJUb2tlbiB7CisgICAg
Y29uc3RydWN0b3IobGV4ZXIsIG9yaWdpbiwgaW5kZXgsIGtpbmQsIHRleHQpCisgICAgeworICAg
ICAgICB0aGlzLl9sZXhlciA9IGxleGVyOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47
CisgICAgICAgIHRoaXMuX2luZGV4ID0gaW5kZXg7CisgICAgICAgIHRoaXMuX2tpbmQgPSBraW5k
OworICAgICAgICB0aGlzLl90ZXh0ID0gdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IGtpbmQo
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2tpbmQ7CisgICAgfQorICAgIAorICAgIGdl
dCB0ZXh0KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0OworICAgIH0KKyAgICAK
KyAgICBnZXQgb3JpZ2luKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9vcmlnaW47Cisg
ICAgfQorICAgIAorICAgIGdldCBpbmRleCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5f
aW5kZXg7CisgICAgfQorICAgIAorICAgIGdldCBsaW5lTnVtYmVyKCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLl9sZXhlci5saW5lTnVtYmVyRm9ySW5kZXgodGhpcy5faW5kZXgpOworICAg
IH0KKyAgICAKKyAgICBnZXQgb3JpZ2luU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLm9yaWdpbiArICI6IiArICh0aGlzLmxpbmVOdW1iZXIgKyAxKTsKKyAgICB9CisgICAgCisg
ICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJMZXhlclRva2VuKCIgKyB0aGlz
LmtpbmQgKyAiLCAiICsgdGhpcy50ZXh0ICsgIiwgIiArIHRoaXMubGluZU51bWJlciArICIpIjsK
KyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Nb25vbW9ycGhpc2VyLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL01vbm9tb3JwaGlzZXIuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTW9ub21vcnBoaXNlci5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NvbnN0IFR5cGVPclZhbHVlID0gU3ltYm9sKCk7
CisKK2NsYXNzIE5hbWVDb250ZXh0IHsKKyAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgbGV0IHR5cGVBbmRWYWx1
ZU1hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fbWFwLnNldChUeXBlLCB0eXBlQW5kVmFs
dWVNYXApOworICAgICAgICB0aGlzLl9tYXAuc2V0KFZhbHVlLCB0eXBlQW5kVmFsdWVNYXApOwor
ICAgICAgICBmb3IgKGxldCBraW5kIG9mIG5hbWVhYmxlS2luZHMpCisgICAgICAgICAgICB0aGlz
Ll9tYXAuc2V0KGtpbmQsIG5ldyBNYXAoKSk7CisgICAgICAgIHRoaXMuX2RlZmluZWQgPSBuZXcg
U2V0KCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgICAgICB0
aGlzLl9kZWxlZ2F0ZSA9IG51bGw7CisgICAgICAgIHRoaXMuX2ludHJpbnNpY3MgPSBudWxsOwor
ICAgICAgICB0aGlzLl9wcm9ncmFtID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgbWFwRm9yKGtp
bmQpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbWFwLmdldChraW5kKTsKKyAg
ICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBraW5k
OiAiICsga2luZCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGFk
ZCh0aGluZykKKyAgICB7CisgICAgICAgIGlmICghdGhpbmcubmFtZSkKKyAgICAgICAgICAgIHJl
dHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICh0aGluZy5pc05hdGl2ZSkgeworICAgICAgICAg
ICAgaWYgKCF0aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJv
cigiTmF0aXZlIGZ1bmN0aW9uIGluIGEgc2NvcGUgdGhhdCBkb2VzIG5vdCByZWNvZ25pemUgaW50
cmluc2ljcyIpOworICAgICAgICAgICAgdGhpcy5faW50cmluc2ljcy5hZGQodGhpbmcpOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICBsZXQgbWFwID0gbWFwRm9yKHRoaW5nLmtpbmQpOwor
ICAgICAgICBpZiAodGhpbmcua2luZCA9PSBGdW5jKSB7CisgICAgICAgICAgICBsZXQgYXJyYXkg
PSBtYXAuZ2V0KHRoaW5nLm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAgICAgICAg
ICAgICAgICBtYXAuc2V0KHRoaW5nLm5hbWUsIGFycmF5ID0gW10pOworICAgICAgICAgICAgYXJy
YXkucHVzaCh0aGluZyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAg
aWYgKG1hcC5oYXModGhpbmcubmFtZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJy
b3IodGhpbmcub3JpZ2luLm9yaWdpblN0cmluZywgIkR1cGxpY2F0ZSBuYW1lOiAiICsgdGhpbmcu
bmFtZSk7CisgICAgICAgIG1hcC5zZXQodGhpbmcubmFtZSwgdGhpbmcpOworICAgIH0KKyAgICAK
KyAgICBnZXQoa2luZCwgbmFtZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBtYXBGb3Io
a2luZCA9PSBUeXBlT3JWYWx1ZSA/IFR5cGUgOiBraW5kKS5nZXQobmFtZSk7CisgICAgICAgIGlm
ICghcmVzdWx0ICYmIHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rl
bGVnYXRlLmdldChraW5kLCBuYW1lKTsKKyAgICAgICAgaWYgKGtpbmQgPT0gVmFsdWUgfHwga2lu
ZCA9PSBUeXBlKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0LmtpbmQgIT0ga2luZCkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0
OworICAgIH0KKyAgICAKKyAgICBnZXQgY3VycmVudFN0YXRlbWVudCgpCisgICAgeworICAgICAg
ICBpZiAodGhpcy5fY3VycmVudFN0YXRlbWVudCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9j
dXJyZW50U3RhdGVtZW50OworICAgICAgICBpZiAodGhpcy5fZGVsZWdhdGUpCisgICAgICAgICAg
ICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY3VycmVudFN0YXRlbWVudDsKKyAgICAgICAgcmV0dXJu
IG51bGw7CisgICAgfQorICAgIAorICAgIGlzRGVmaW5lZCh0aGluZykKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLl9kZWZpbmVkLmhhcyh0aGluZykKKyAgICAgICAgICAgIHx8ICh0aGlzLl9k
ZWxlZ2F0ZSAmJiB0aGlzLl9kZWxlZ2F0ZS5pc0RlZmluZWQodGhpbmcpKTsKKyAgICB9CisgICAg
CisgICAgZGVmaW5lKHRoaW5nKQorICAgIHsKKyAgICAgICAgdGhpcy5fZGVmaW5lZC5zZXQodGhp
bmcpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmVBbGwoKQorICAgIHsKKyAgICAgICAgZm9yIChs
ZXQgdGhpbmcgb2YgdGhpcykKKyAgICAgICAgICAgIGRlZmluZSh0aGluZyk7CisgICAgfQorICAg
IAorICAgIGRvU3RhdGVtZW50KHN0YXRlbWVudCwgY2FsbGJhY2spCisgICAgeworICAgICAgICB0
aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gc3RhdGVtZW50OworICAgICAgICBjYWxsYmFjaygpOwor
ICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gbnVsbDsKKyAgICAgICAgZGVmaW5lKHN0
YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHJlY29nbml6ZUludHJpbnNpY3MoKQorICAgIHsK
KyAgICAgICAgdGhpcy5faW50cmluc2ljcyA9IG5ldyBJbnRyaW5zaWNzKCk7CisgICAgfQorICAg
IAorICAgIGdldCBpbnRyaW5zaWNzKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9pbnRyaW5z
aWNzKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ludHJpbnNpY3M7CisgICAgICAgIGlmICh0
aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5pbnRyaW5z
aWNzOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgc2V0IHByb2dyYW0o
dmFsdWUpCisgICAgeworICAgICAgICB0aGlzLl9wcm9ncmFtID0gdmFsdWU7CisgICAgfQorICAg
IAorICAgIGdldCBwcm9ncmFtKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9wcm9ncmFtKQor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb2dyYW07CisgICAgICAgIGlmICh0aGlzLl9kZWxl
Z2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5wcm9ncmFtOworICAgICAg
ICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkKKyAg
ICB7CisgICAgICAgIGZvciAobGV0IG1hcCBvZiB0aGlzLl9tYXAudmFsdWVzKCkpIHsKKyAgICAg
ICAgICAgIGZvciAobGV0IHR5cGUgb2YgdGhpcy5fdHlwZXMudmFsdWVzKCkpCisgICAgICAgICAg
ICAgICAgeWllbGQgdHlwZTsKKyAgICAgICAgfQorICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL05hdGl2ZVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmF0
aXZlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBl
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTmF0aXZlVHlw
ZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgaXNQcmltaXRp
dmUsIHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2lu
OworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5faXNQcmltaXRpdmUg
PSBpc1ByaW1pdGl2ZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1l
dGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dW5yIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc1By
aW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuX2lzUHJpbWl0aXZlOyB9CisgICAgZ2V0IHR5cGVQYXJh
bWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQgaXNOYXRp
dmUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgaW5zdGFudGlhdGUodHlwZUFyZ3VtZW50
cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSB0aGlzLnR5cGVQ
YXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV3JvbmcgbnVt
YmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3RhbnRpYXRpb24iKTsKKyAgICAgICAgaWYgKCF0
eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICBy
ZXR1cm4gbmV3IE5hdGl2ZVR5cGVJbnN0YW5jZSh0aGlzLCB0eXBlQXJndW1lbnRzKTsKKyAgICB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJuYXRpdmUgIiAr
ICh0aGlzLmlzUHJpbWl0aXZlID8gInByaW1pdGl2ZSAiIDogIiIpICsgInR5cGUgIiArIHRoaXMu
bmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPiI7CisgICAgfQorfQorCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5cGVJbnN0YW5jZSBleHRlbmRzIFR5
cGUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAg
ICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVB
cmd1bWVudHM7CisgICAgfQorICAgIAorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlw
ZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50
czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGUuaXNQcmltaXRp
dmU7IH0KKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgdW5p
ZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAodGhp
cy50eXBlICE9IG90aGVyLnR5cGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IGlmICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVu
Z3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGxldCBpID0gMDsg
aSA8IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCF0
aGlzLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBl
QXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAi
PiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvTm9kZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc3IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIE5vZGUgeworICAgIHZpc2l0KHZpc2l0b3IpCisgICAgeworICAgICAgICBsZXQgcmV0
dXJuVmFsdWUgPSB2aXNpdG9yWyJ2aXNpdCIgKyB0aGlzLmNvbnN0cnVjdG9yLm5hbWVdKHRoaXMp
OworICAgICAgICBpZiAoInJldHVyblZhbHVlIiBpbiB2aXNpdG9yKQorICAgICAgICAgICAgcmV0
dXJuIHZpc2l0b3IucmV0dXJuVmFsdWU7CisgICAgICAgIHJldHVybiByZXR1cm5WYWx1ZTsKKyAg
ICB9CisgICAgCisgICAgdW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7Cisg
ICAgICAgIGxldCB1bmlmeVRoaXMgPSB0aGlzLnVuaWZ5Tm9kZTsKKyAgICAgICAgbGV0IHVuaWZ5
T3RoZXIgPSBvdGhlci51bmlmeU5vZGU7CisgICAgICAgIGlmICh1bmlmeU90aGVyLnR5cGVWYXJp
YWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlUaGlzKSkKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICByZXR1cm4gdW5pZnlUaGlzLnVuaWZ5SW1wbCh1bmlmaWNhdGlv
bkNvbnRleHQsIHVuaWZ5T3RoZXIpOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmIChvdGhlci50eXBlVmFyaWFi
bGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHRoaXMpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIHJldHVybiB0aGlzID09IG90aGVyOworICAgIH0KKyAgICAKKyAgICB0eXBl
VmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkgeyByZXR1cm4g
dGhpczsgfQorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisg
ICAgZ2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBlcXVhbHMob3Ro
ZXIpCisgICAgeworICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0
aW9uQ29udGV4dCgpOworICAgICAgICByZXR1cm4gdGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRl
eHQsIG90aGVyKSAmJiB1bmlmaWNhdGlvbkNvbnRleHQuaXNVbnVuaWZpZWQoKTsKKyAgICB9Cisg
ICAgCisgICAgc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3QpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy52aXNpdChTdWJzdGl0dXRpb24ubWFwcGluZyhwYXJhbWV0ZXJzLCBh
cmd1bWVudExpc3QpKTsKKyAgICB9CisgICAgCisgICAgc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24o
cGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1
YnN0aXR1dGUocGFyYW1ldGVycywgcGFyYW1ldGVycy5tYXAodHlwZSA9PiB1bmlmaWNhdGlvbkNv
bnRleHQuZmluZCh0eXBlKSkpOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Bh
cnNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHBhcnNlKHByb2dyYW0sIG9yaWdpbiwgdGV4dCkK
K3sKKyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIob3JpZ2luLCB0ZXh0KTsKKyAgICAKKyAgICAv
LyBUaGUgaGFyZGVzdCBwYXJ0IG9mIGRlYWxpbmcgd2l0aCBDLWxpa2UgbGFuZ3VhZ2VzIGlzIHBh
cnNpbmcgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50cy4KKyAgICAvLyBMZXQncyBjb25z
aWRlciBpZiB0aGlzIGhhcHBlbnMgaW4gQXJyYXlMYW5nLiBIZXJlIGFyZSB0aGUgdmFsaWQgc3Rh
dGVtZW50cyBpbiBBcnJheUxhbmcgdGhhdAorICAgIC8vIGJlZ2luIHdpdGggYW4gaWRlbnRpZmll
ciwgaWYgd2UgYXNzdW1lIHRoYXQgYW55IGV4cHJlc3Npb24gY2FuIGJlIGEgc3RhbmRhbG9uZSBz
dGF0ZW1lbnQuCisgICAgLy8KKyAgICAvLyAgICAgeDsKKyAgICAvLyAgICAgeCA8Ymlub3A+IHk7
CisgICAgLy8gICAgIHggPCB5OworICAgIC8vICAgICB4IDwgeSA+IHo7CisgICAgLy8gICAgIHgg
PSB5OworICAgIC8vICAgICB4LmYgPSB5OworICAgIC8vICAgICBcZXhwID0geTsKKyAgICAvLyAg
ICAgeFs0Ml0gPSB5OworICAgIC8vICAgICB4KCk7CisgICAgLy8gICAgIHg8eT4oKTsKKyAgICAv
LyAgICAgeCB5OworICAgIC8vICAgICB4PHk+IHo7CisgICAgLy8gICAgIGRldmljZSB4W10geTsK
KyAgICAvLyAgICAgeFs0Ml0geTsKKyAgICAvLyAgICAgZGV2aWNlIHheIHk7CisgICAgLy8gICAg
IHRocmVhZCB4Xl4geTsKKyAgICAvLyAgICAgeF50aHJlYWRedGhyZWFkIHk7CisgICAgLy8gICAg
IHheZGV2aWNlXnRocmVhZCB5OworICAgIC8vCisgICAgLy8gVGhpcyBoYXMgdHdvIHByb2JsZW0g
YXJlYXM6CisgICAgLy8KKyAgICAvLyAgICAgLSB4PHk+eiBjYW4gcGFyc2UgdHdvIGRpZmZlcmVu
dCB3YXlzIChhcyAoeCA8IHkpID4geiBvciB4PHk+IHopLgorICAgIC8vICAgICAtIHhbNDJdIGNv
dWxkIGJlY29tZSBlaXRoZXIgYW4gYXNzaWdubWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9u
LgorICAgIC8vICAgICAtIHg8eT4gY291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9y
IGEgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgLy8KKyAgICAvLyBXZSBzb2x2ZSB0aGUgZmly
c3QgcHJvYmxlbSBieSBmb3JiaWRkaW5nIGV4cHJlc3Npb25zIGFzIHN0YXRlbWVudHMuIFRoZSBs
YWNrIG9mIGZ1bmN0aW9uCisgICAgLy8gcG9pbnRlcnMgbWVhbnMgdGhhdCB3ZSBjYW4gc3RpbGwg
YWxsb3cgZnVuY3Rpb24gY2FsbCBzdGF0ZW1lbnRzIC0gdW5saWtlIGluIEMsIHRob3NlIGNhbm5v
dAorICAgIC8vIGhhdmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGFzIHRoZSBjYWxsZWUuIFRoZSBy
ZW1haW5pbmcgdHdvIHByb2JsZW1zIGFyZSBzb2x2ZWQgYnkKKyAgICAvLyBiYWNrdHJhY2tpbmcu
IEluIGFsbCBvdGhlciByZXNwZWN0cywgdGhpcyBpcyBhIHNpbXBsZSByZWN1cnNpdmUgZGVzY2Vu
dCBwYXJzZXIuCisgICAgCisgICAgZnVuY3Rpb24gZ2VuZXJpY0NvbnN1bWUoY2FsbGJhY2spCisg
ICAgeworICAgICAgICBsZXQgdG9rZW4gPSBsZXhlci5uZXh0KCk7CisgICAgICAgIGlmICghdG9r
ZW4pCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7Cisg
ICAgICAgIGlmIChjYWxsYmFjayh0b2tlbikpCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4
cGVjdGVkIHRva2VuOiAiICsgdG9rZW4udGV4dCArICI7IGV4cGVjdGVkOiAiICsgdGV4dCk7Cisg
ICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gY29uc3VtZSgu
Li50ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0
ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGNv
bnN1bWVLaW5kKGtpbmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY0NvbnN1bWUodG9r
ZW4gPT4gdG9rZW4ua2luZCA9PSBraW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gYXNz
ZXJ0TmV4dCguLi50ZXh0cykKKyAgICB7CisgICAgICAgIGxleGVyLnB1c2goY29uc3VtZSguLi50
ZXh0cykpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmljVGVzdChjYWxsYmFjaykK
KyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKHRv
a2VuICYmIGNhbGxiYWNrKHRva2VuKSkKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAg
ICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRlc3QoLi4udGV4dHMp
CisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Rlc3QodG9rZW4gPT4gdGV4dHMuaW5jbHVk
ZXModG9rZW4udGV4dCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiB0ZXN0S2luZChraW5k
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNUZXN0KHRva2VuID0+IHRva2VuLmtpbmQg
PT0ga2luZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRyeUNvbnN1bWUoLi4udGV4dHMp
CisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGVzdCguLi50ZXh0cyk7CisgICAgICAgIGlm
IChyZXN1bHQpCisgICAgICAgICAgICBsZXhlci5uZXh0KCk7CisgICAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRyeUNvbnN1bWVLaW5kKGtpbmQpCisgICAg
eworICAgICAgICBsZXQgcmVzdWx0ID0gdGVzdEtpbmQoa2luZCk7CisgICAgICAgIGlmIChyZXN1
bHQpCisgICAgICAgICAgICBsZXhlci5uZXh0KCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUHJvdG9jb2xSZWYoKQorICAgIHsKKyAgICAg
ICAgbGV0IHByb3RvY29sVG9rZW4gPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAg
ICByZXR1cm4gbmV3IFByb3RvY29sUmVmKHByb3RvY29sVG9rZW4ub3JpZ2luLCBwcm90b2NvbFRv
a2VuLnRleHQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBjb25zdW1lRW5kT2ZUeXBlQXJn
cygpCisgICAgeworICAgICAgICBsZXQgcmlnaHRTaGlmdCA9IHRyeUNvbnN1bWUoIj4+Iik7Cisg
ICAgICAgIGlmIChyaWdodFNoaWZ0KQorICAgICAgICAgICAgbGV4ZXIucHVzaChuZXcgTGV4ZXJU
b2tlbihsZXhlciwgcmlnaHRTaGlmdC5vcmlnaW4sIHJpZ2h0U2hpZnQuaW5kZXgsIHJpZ2h0U2hp
ZnQua2luZCwgIj4iKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGNvbnN1bWUoIj4iKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VUeXBlUGFyYW1ldGVycygpCisgICAgewor
ICAgICAgICBpZiAoIXRlc3QoIjwiKSkKKyAgICAgICAgICAgIHJldHVybiBbXTsKKyAgICAgICAg
CisgICAgICAgIGxldCByZXN1bHQgPSBbXTsKKyAgICAgICAgY29uc3VtZSgiPCIpOworICAgICAg
ICB3aGlsZSAoIXRlc3QoIj4iKSkgeworICAgICAgICAgICAgbGV0IGNvbnN0ZXhwciA9IGxleGVy
LmJhY2t0cmFja2luZ1Njb3BlKCgpID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHBh
cnNlVHlwZSgpOworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50
aWZpZXIiKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROZXh0KCIsIiwgIj4iLCAiPj4iKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIodHlwZS5vcmln
aW4sIG5hbWUsIHR5cGUpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoY29uc3Rl
eHByKQorICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnN0ZXhwcik7CisgICAgICAgICAg
ICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlm
aWVyIik7CisgICAgICAgICAgICAgICAgbGV0IHByb3RvY29sID0gdHJ5Q29uc3VtZSgiOiIpID8g
cGFyc2VQcm90b2NvbFJlZigpIDogbnVsbDsKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaChu
ZXcgVHlwZVZhcmlhYmxlKG5hbWUub3JpZ2luLCBuYW1lLnRleHQsIHByb3RvY29sKSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAg
ICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lRW5kT2ZUeXBlQXJncygpOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVRl
cm0oKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuOworICAgICAgICBpZiAodG9rZW4gPSB0cnlD
b25zdW1lS2luZCgiaWRlbnRpZmllciIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJs
ZVJlZih0b2tlbi5vcmlnaW4sIHRva2VuLnRleHQpOworICAgICAgICBpZiAodG9rZW4gPSB0cnlD
b25zdW1lS2luZCgiaW50TGl0ZXJhbCIpKSB7CisgICAgICAgICAgICBsZXQgaW50VmVyc2lvbiA9
IHRva2VuLnRleHQgfCAwOworICAgICAgICAgICAgaWYgKGludFZlcnNpb24gIT0gdG9rZW4udGV4
dCkKKyAgICAgICAgICAgICAgICBsZXhlci5mYWlsKCJJbnRlZ2VyIGxpdGVyYWwgaXMgbm90IDMy
LWJpdCBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwodG9rZW4u
b3JpZ2luLCBpbnRWZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTogTmVlZCBz
dXBwb3J0IGZvciBmbG9hdCBsaXRlcmFscyBhbmQgcHJvYmFibHkgb3RoZXIgbGl0ZXJhbHMgdG9v
LgorICAgICAgICB0b2tlbiA9IGNvbnN1bWVLaW5kKCJkb3VibGVMaXRlcmFsIik7CisgICAgICAg
IHJldHVybiBuZXcgRG91YmxlTGl0ZXJhbCh0b2tlbi5vcmlnaW4sICt0b2tlbi50ZXh0KTsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDb25zdGV4cHIoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHBhcnNlVGVybSgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVB
cmd1bWVudHMoKQorICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8IikpCisgICAgICAgICAgICBy
ZXR1cm4gW107CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gW107CisgICAgICAgIGNv
bnN1bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+IikpIHsKKyAgICAgICAgICAgIC8v
IEl0J3MgcG9zc2libGUgZm9yIGEgY29uc3RleHByIG9yIHR5cGUgY2FuIHN5bnRhY3RpY2FsbHkg
b3ZlcmxhcCBpbiB0aGUgc2luZ2xlCisgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGNhc2UuIExl
dCdzIGNvbnNpZGVyIHRoZSBwb3NzaWJpbGl0aWVzOgorICAgICAgICAgICAgLy8KKyAgICAgICAg
ICAgIC8vICAgICBUICAgICAgICAgIGNvdWxkIGJlIHR5cGUgb3IgY29uc3RleHByCisgICAgICAg
ICAgICAvLyAgICAgVFtdICAgICAgICBvbmx5IHR5cGUKKyAgICAgICAgICAgIC8vICAgICBUWzQy
XSAgICAgIG9ubHkgdHlwZSAoY29uc3RleHByIGNhbm5vdCBkbyBpbmRleGluZykKKyAgICAgICAg
ICAgIC8vICAgICA0MiAgICAgICAgIG9ubHkgY29uc3RleHByCisgICAgICAgICAgICAvLworICAg
ICAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSB3ZSdsbCBhbGxvdyBjb25zdGV4cHJzIHRvIGRvIG1v
cmUgdGhpbmdzLCBhbmQgdGhlbiB3ZSdsbCBzdGlsbCBoYXZlCisgICAgICAgICAgICAvLyB0aGUg
cHJvYmxlbSB0aGF0IHNvbWV0aGluZyBvZiB0aGUgZm9ybSBUWzFdWzJdWzNdLi4uIGNhbiBlaXRo
ZXIgYmUgYSB0eXBlIG9yIGEKKyAgICAgICAgICAgIC8vIGNvbnN0ZXhwciwgYW5kIHdlIGNhbiBm
aWd1cmUgb3V0IGluIHRoZSBjaGVja2VyIHdoaWNoIGl0IGlzLgorICAgICAgICAgICAgbGV0IHR5
cGVPclZhcmlhYmxlUmVmID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAg
ICAgICAgICAgIGxldCByZXN1bHQgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAg
ICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgIHJl
dHVybiBuZXcgVHlwZU9yVmFyaWFibGVSZWYocmVzdWx0Lm9yaWdpbiwgcmVzdWx0LnRleHQpOwor
ICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAodHlwZU9yVmFyaWFibGVSZWYpCisgICAg
ICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZU9yVmFyaWFibGVSZWYpOworICAgICAgICAgICAg
ZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IGNvbnN0ZXhwciA9IGxleGVyLmJhY2t0cmFja2lu
Z1Njb3BlKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHBhcnNlQ29u
c3RleHByKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIp
OworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0p
OworICAgICAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAgICAgIHJl
c3VsdC5wdXNoKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAg
ICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlwZSgpCisgICAgeworICAgICAg
ICBsZXQgdG9rZW47CisgICAgICAgIGxldCBhZGRyZXNzU3BhY2U7CisgICAgICAgIGxldCBhZGRy
ZXNzU3BhY2VDb25zdW1lZCA9IGZhbHNlOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1l
KC4uLmFkZHJlc3NTcGFjZXMpKQorICAgICAgICAgICAgYWRkcmVzc1NwYWNlID0gdG9rZW4udGV4
dDsKKyAgICAgICAgCisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIi
KTsKKyAgICAgICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5cGVBcmd1bWVudHMoKTsKKyAg
ICAgICAgbGV0IHR5cGUgPSBuZXcgVHlwZVJlZihuYW1lLm9yaWdpbiwgbmFtZS50ZXh0LCB0eXBl
QXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGZ1bmN0aW9uIGdldEFkZHJlc3NTcGFjZSgp
CisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZHJlc3NTcGFjZUNvbnN1bWVkID0gdHJ1ZTsKKyAg
ICAgICAgICAgIGlmIChhZGRyZXNzU3BhY2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJl
c3NTcGFjZTsKKyAgICAgICAgICAgIHJldHVybiB0cnlDb25zdW1lKC4uLmFkZHJlc3NTcGFjZXMp
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1l
KCJeIiwgIlsiKSkgeworICAgICAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIl4iKSB7CisgICAg
ICAgICAgICAgICAgdHlwZSA9IG5ldyBQdHJUeXBlKHRva2VuLm9yaWdpbiwgZ2V0QWRkcmVzc1Nw
YWNlKCksIHR5cGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodHJ5Q29uc3VtZSgiXSIpKSB7CisgICAgICAg
ICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVJlZlR5cGUodG9rZW4ub3JpZ2luLCBnZXRBZGRyZXNz
U3BhY2UoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHR5cGUgPSBuZXcgQXJyYXlUeXBlKHRva2VuLm9y
aWdpbiwgdHlwZSwgcGFyc2VDb25zdGV4cHIoKSk7CisgICAgICAgICAgICBjb25zdW1lKCJdIik7
CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhZGRyZXNzU3BhY2UgJiYgIWFkZHJl
c3NTcGFjZUNvbnN1bWVkKQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiQWRkcmVzcyBzcGFjZSBz
cGVjaWZpZWQgZm9yIHR5cGUgdGhhdCBkb2VzIG5vdCBuZWVkIGFkZHJlc3Mgc3BhY2UiKTsKKyAg
ICAgICAgCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZVR5cGVEZWYoKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInR5cGUi
KS5vcmlnaW47CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKS50
ZXh0OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7
CisgICAgICAgIGNvbnN1bWUoIj0iKTsKKyAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsK
KyAgICAgICAgY29uc3VtZSgiOyIpOworICAgICAgICByZXR1cm4gbmV3IFR5cGVEZWYob3JpZ2lu
LCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IGdlbmVyaWNQYXJzZUxlZnQodGV4dHMsIG5leHRQYXJzZXIsIGNvbnN0cnVjdG9yKQorICAgIHsK
KyAgICAgICAgbGV0IGxlZnQgPSBuZXh0UGFyc2VyKCk7CisgICAgICAgIGxldCB0b2tlbjsKKyAg
ICAgICAgd2hpbGUgKHRva2VuID0gdHJ5Q29uc3VtZSguLi50ZXh0cykpCisgICAgICAgICAgICBs
ZWZ0ID0gY29uc3RydWN0b3IodG9rZW4sIGxlZnQsIG5leHRQYXJzZXIoKSk7CisgICAgICAgIHJl
dHVybiBsZWZ0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUxlZnRPcGVyYXRvckNh
bGwodGV4dHMsIG5leHRQYXJzZXIpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1BhcnNl
TGVmdCgKKyAgICAgICAgICAgIHRleHRzLCBuZXh0UGFyc2VyLAorICAgICAgICAgICAgKHRva2Vu
LCBsZWZ0LCByaWdodCkgPT4KKyAgICAgICAgICAgICAgICBuZXcgQ2FsbEV4cHJlc3Npb24odG9r
ZW4ub3JpZ2luLCAib3BlcmF0b3IiICsgdG9rZW4udGV4dCwgW10sIFtsZWZ0LCByaWdodF0pKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDYWxsRXhwcmVzc2lvbigpCisgICAgewor
ICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgIGxl
dCB0eXBlQXJndW1lbnRzID0gcGFyc2VUeXBlQXJndW1lbnRzKCk7CisgICAgICAgIGNvbnN1bWUo
IigiKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50TGlzdCA9IFtdOworICAgICAgICB3aGlsZSAoIXRl
c3QoIikiKSkgeworICAgICAgICAgICAgYXJndW1lbnRMaXN0LnB1c2gocGFyc2VFeHByZXNzaW9u
KCkpOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgiKSIpOworICAgICAgICByZXR1cm4g
bmV3IENhbGxFeHByZXNzaW9uKG5hbWUub3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1
bWVudExpc3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlU3VmZml4
KCkKKyAgICB7CisgICAgICAgIGxldCBzaW1wbGVDYXNlID0gbGV4ZXIuYmFja3RyYWNraW5nU2Nv
cGUoKCkgPT4geworICAgICAgICAgICAgbGV0IGxlZnQgPSBwYXJzZVRlcm0oKTsKKyAgICAgICAg
ICAgIGxldCB0b2tlbjsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbiA9IHRyeUNvbnN1bWUoIisr
IiwgIi0tIiwgIi4iLCAiLT4iLCAiWyIpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0b2tl
bi50ZXh0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAiKysiOgorICAgICAgICAgICAgICAgIGNh
c2UgIi0tIjoKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBTdWZmaXhDYWxsQXNzaWdu
bWVudCh0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBsZWZ0KTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiLiI6CisgICAgICAg
ICAgICAgICAgY2FzZSAiLT4iOgorICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udGV4dCA9
PSAiLT4iKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBEZXJlZmVyZW5jZUV4
cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9
IG5ldyBEb3RFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgbGVmdCwgY29uc3VtZUtpbmQoImlkZW50
aWZpZXIiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNh
c2UgIlsiOiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHBhcnNlRXhwcmVzc2lv
bigpOworICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCJdIik7CisgICAgICAgICAgICAgICAg
ICAgIGxlZnQgPSBuZXcgSW5kZXhFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgbGVmdCwgaW5kZXgp
OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJC
YWQgdG9rZW46ICIgKyB0b2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CisgICAgICAgIH0pOworICAgICAgICBpZiAoc2ltcGxl
Q2FzZSkKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVDYXNlOworICAgICAgICAKKyAgICAgICAg
cmV0dXJuIHBhcnNlQ2FsbEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
cGFyc2VQb3NzaWJsZVByZWZpeCgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47CisgICAgICAg
IGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIisrIiwgIi0tIiwgIisiLCAiLSIsICIhIiwgIn4iKSkK
KyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQodG9rZW4ub3JpZ2luLCAib3Bl
cmF0b3IiICsgdG9rZW4udGV4dCwgcGFyc2VQb3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgaWYg
KHRva2VuID0gdHJ5Q29uc3VtZSgiXiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXJlZmVy
ZW5jZUV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBwYXJzZVBvc3NpYmxlUHJlZml4KCkpOworICAg
ICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJcXCIpKQorICAgICAgICAgICAgcmV0dXJuIG5l
dyBNYWtlUHRyRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2libGVQcmVmaXgoKSk7
CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIiYiKSkKKyAgICAgICAgICAgIHJldHVy
biBuZXcgTWFrZUFycmF5UmVmRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2libGVQ
cmVmaXgoKSk7CisgICAgICAgIHJldHVybiBwYXJzZVBvc3NpYmxlU3VmZml4KCk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVQcm9kdWN0KCkKKyAgICB7CisgICAgICAg
IHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyIqIiwgIi8iLCAiJSJdLCBwYXJzZVBvc3Np
YmxlUHJlZml4KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVN1bSgp
CisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiKyIsICItIl0s
IHBhcnNlUG9zc2libGVQcm9kdWN0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQ
b3NzaWJsZVNoaWZ0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNh
bGwoWyI8PCIsICI+PiJdLCBwYXJzZVBvc3NpYmxlU3VtKTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxJbmVxdWFsaXR5KCkKKyAgICB7CisgICAgICAg
IHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyI8IiwgIj4iLCAiPD0iLCAiPT4iXSwgcGFy
c2VQb3NzaWJsZVNoaWZ0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJs
ZVJlbGF0aW9uYWxFcXVhbGl0eSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1BhcnNl
TGVmdCgKKyAgICAgICAgICAgIFsiPT0iLCAiIT0iXSwgcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxJ
bmVxdWFsaXR5LAorICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkgPT4geworICAgICAg
ICAgICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAi
b3BlcmF0b3I9PSIsIFtdLCBbbGVmdCwgcmlnaHRdKTsKKyAgICAgICAgICAgICAgICBpZiAodG9r
ZW4udGV4dCA9PSAiIT0iKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FsbEV4
cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3IhIiwgW10sIFtyZXN1bHRdKTsKKyAgICAg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlQW5kKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyImIl0sIHBhcnNlUG9zc2libGVSZWxhdGlvbmFs
RXF1YWxpdHkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlQml0d2lz
ZVhvcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiXiJd
LCBwYXJzZVBvc3NpYmxlQml0d2lzZUFuZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlUG9zc2libGVCaXR3aXNlT3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9w
ZXJhdG9yQ2FsbChbInwiXSwgcGFyc2VQb3NzaWJsZUJpdHdpc2VYb3IpOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBwYXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lvbih0ZXh0cywgbmV4dFBhcnNl
cikKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljUGFyc2VMZWZ0KAorICAgICAgICAgICAg
dGV4dHMsIG5leHRQYXJzZXIsCisgICAgICAgICAgICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9PiBu
ZXcgTG9naWNhbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCB0b2tlbi50ZXh0LCBsZWZ0LCByaWdo
dCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlTG9naWNhbEFuZCgp
CisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24oWyImJiJd
LCBwYXJzZVBvc3NpYmxlQml0d2lzZU9yKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFy
c2VQb3NzaWJsZUxvZ2ljYWxPcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0TG9n
aWNhbEV4cHJlc3Npb24oWyJ8fCJdLCBwYXJzZVBvc3NpYmxlTG9naWNhbEFuZCk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVUZXJuYXJ5Q29uZGl0aW9uYWwoKQorICAg
IHsKKyAgICAgICAgbGV0IHByZWRpY2F0ZSA9IHBhcnNlUG9zc2libGVMb2dpY2FsT3IoKTsKKyAg
ICAgICAgbGV0IG9wZXJhdG9yID0gdHJ5Q29uc3VtZSgiPyIpOworICAgICAgICBpZiAoIW9wZXJh
dG9yKQorICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBU
ZXJuYXJ5RXhwcmVzc2lvbihvcGVyYXRvci5vcmlnaW4sIHByZWRpY2F0ZSwgcGFyc2VQb3NzaWJs
ZUFzc2lnbm1lbnQoKSwgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KG1vZGUpCisgICAgeworICAgICAg
ICBsZXQgbGhzID0gcGFyc2VQb3NzaWJsZVRlcm5hcnlDb25kaXRpb25hbCgpOworICAgICAgICBs
ZXQgb3BlcmF0b3IgPSB0cnlDb25zdW1lKCI9IiwgIis9IiwgIi09IiwgIio9IiwgIi89IiwgIiU9
IiwgIl49IiwgInw9IiwgIiY9Iik7CisgICAgICAgIGlmICghb3BlcmF0b3IpIHsKKyAgICAgICAg
ICAgIGlmIChtb2RlID09ICJyZXF1aXJlZCIpCisgICAgICAgICAgICAgICAgbGV4ZXIuZmFpbCgi
RXhwZWN0ZWQgYXNzaWdubWVudCIpOworICAgICAgICAgICAgcmV0dXJuIGxoczsKKyAgICAgICAg
fQorICAgICAgICBpZiAob3BlcmF0b3IudGV4dCA9PSAiPSIpCisgICAgICAgICAgICByZXR1cm4g
bmV3IEFzc2lnbm1lbnQob3BlcmF0b3Iub3JpZ2luLCBsaHMsIHBhcnNlUG9zc2libGVBc3NpZ25t
ZW50KCkpOworICAgICAgICBsZXQgbmFtZSA9ICJvcGVyYXRvciIgKyBvcGVyYXRvci50ZXh0LnN1
YnN0cmluZygwLCB0ZXJtLm9wZXJhdG9yLmxlbmd0aCAtIDEpOworICAgICAgICByZXR1cm4gbmV3
IENhbGxBc3NpZ25tZW50KG9wZXJhdG9yLm9yaWdpbiwgbmFtZSwgbGhzLCBwYXJzZVBvc3NpYmxl
QXNzaWdubWVudCgpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VBc3NpZ25tZW50
KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgicmVxdWly
ZWQiKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VFZmZlY3RmdWxFeHByZXNzaW9u
KCkKKyAgICB7CisgICAgICAgIGxldCBhc3NpZ25tZW50ID0gbGV4ZXIuYmFja3RyYWNraW5nU2Nv
cGUoKCkgPT4geyByZXR1cm4gcGFyc2VBc3NpZ25tZW50KCk7IH0pOworICAgICAgICBpZiAoYXNz
aWdubWVudCkKKyAgICAgICAgICAgIHJldHVybiBhc3NpZ25tZW50OworICAgICAgICByZXR1cm4g
cGFyc2VDYWxsRXhwcmVzc2lvbigpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmlj
UGFyc2VDb21tYUV4cHJlc3Npb24oZmluYWxFeHByZXNzaW9uUGFyc2VyKQorICAgIHsKKyAgICAg
ICAgbGV0IGxpc3QgPSBbXTsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGxleGVyLnBlZWsoKTsKKyAg
ICAgICAgaWYgKCFvcmlnaW4pCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4cGVjdGVkIGVu
ZCBvZiBmaWxlIik7CisgICAgICAgIG9yaWdpbiA9IG9yaWdpbi5vcmlnaW47CisgICAgICAgIGZv
ciAoOzspIHsKKyAgICAgICAgICAgIGxldCBlZmZlY3RmdWxFeHByZXNzaW9uID0gbGV4ZXIuYmFj
a3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKCk7
IH0pOworICAgICAgICAgICAgaWYgKCFlZmZlY3RmdWxFeHByZXNzaW9uKSB7CisgICAgICAgICAg
ICAgICAgbGlzdC5wdXNoKGZpbmFsRXhwcmVzc2lvblBhcnNlcigpKTsKKyAgICAgICAgICAgICAg
ICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QucHVzaChlZmZlY3RmdWxF
eHByZXNzaW9uKTsKKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQ29tbWFFeHByZXNz
aW9uKG9yaWdpbiwgbGlzdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQ29tbWFF
eHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljUGFyc2VDb21tYUV4cHJl
c3Npb24ocGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlv
biBwYXJzZUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ29tbWFFeHBy
ZXNzaW9uKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQXNzaWdubWVudFN0YXRl
bWVudCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gZ2VuZXJpY1BhcnNlQ29tbWFFeHBy
ZXNzaW9uKHBhcnNlRWZmZWN0ZnVsRXhwcmVzc2lvbik7CisgICAgICAgIGNvbnN1bWUoIjsiKTsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VS
ZXR1cm4oKQorICAgIHsKKyAgICAgICAgY29uc3VtZSgicmV0dXJuIik7CisgICAgICAgIHJldHVy
biBwYXJzZUV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VTdGF0
ZW1lbnQoKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAg
ICBpZiAodG9rZW4udGV4dCA9PSAiOyIpIHsKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAg
ICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlbi50ZXh0
ID09ICJyZXR1cm4iKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmV0dXJuKCk7CisgICAgICAg
IGlmICh0b2tlbi50ZXh0ID09ICJicmVhayIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VCcmVh
aygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiY29udGludWUiKQorICAgICAgICAgICAg
cmV0dXJuIHBhcnNlQ29udGludWUoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIndoaWxl
IikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVdoaWxlKCk7CisgICAgICAgIGlmICh0b2tlbi50
ZXh0ID09ICJkbyIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VEbygpOworICAgICAgICBpZiAo
dG9rZW4udGV4dCA9PSAiZm9yIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUZvcigpOworICAg
ICAgICBsZXQgY29tbWFFeHByZXNzaW9uID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4g
eyByZXR1cm4gcGFyc2VBc3NpZ25tZW50U3RhdGVtZW50KCk7IH0pOworICAgICAgICBpZiAoY29t
bWFFeHByZXNzaW9uKQorICAgICAgICAgICAgcmV0dXJuIGNvbW1hRXhwcmVzc2lvbjsKKyAgICAg
ICAgcmV0dXJuIHBhcnNlVmFyaWFibGVEZWNsKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IHBhcnNlQmxvY2soKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInsiKS5v
cmlnaW47CisgICAgICAgIGxldCBibG9jayA9IG5ldyBCbG9jayhvcmlnaW4pOworICAgICAgICB3
aGlsZSAoIXRlc3QoIn0iKSkgeworICAgICAgICAgICAgbGV0IHN0YXRlbWVudCA9IHBhcnNlU3Rh
dGVtZW50KCk7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50KQorICAgICAgICAgICAgICAgIGJs
b2NrLnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lKCJ9Iik7Cisg
ICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VGdW5j
RGVmKCkKKyAgICB7CisgICAgICAgIGxldCByZXR1cm5UeXBlID0gcGFyc2VUeXBlKCk7CisgICAg
ICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKS50ZXh0OworICAgICAgICBs
ZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgIGNvbnN1
bWUoIigiKTsKKyAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSBbXTsKKyAgICAgICAgd2hpbGUgKCF0
ZXN0KCIpIikpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChwYXJzZVBhcmFtZXRlcigp
KTsKKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWUoIikiKTsKKyAgICAgICAgbGV0IGJsb2Nr
ID0gcGFyc2VCbG9jaygpOworICAgICAgICByZXR1cm4gRnVuY0RlZihyZXR1cm5UeXBlLm9yaWdp
biwgbmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMsIGJvZHkpOwor
ICAgIH0KKyAgICAKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBl
ZWsoKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
aWYgKHRva2VuLnRleHQgPT0gIjsiKQorICAgICAgICAgICAgbGV4ZXIubmV4dCgpOworICAgICAg
ICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJ0eXBlIikKKyAgICAgICAgICAgIHBhcnNlVHlwZURl
ZigpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJuYXRpdmUiKQorICAgICAgICAg
ICAgcGFyc2VOYXRpdmVUeXBlKCk7CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gInN0
cnVjdCIpCisgICAgICAgICAgICBwYXJzZVN0cnVjdFR5cGUoKTsKKyAgICAgICAgZWxzZSBpZiAo
dG9rZW4udGV4dCA9PSAiZW51bSIpCisgICAgICAgICAgICBwYXJzZUVudW0oKTsKKyAgICAgICAg
ZWxzZSBpZiAodG9rZW4udGV4dCA9PSAicHJvdG9jb2wiKQorICAgICAgICAgICAgcGFyc2VQcm90
b2NvbERlY2woKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcGFyc2VGdW5jRGVmKCk7Cisg
ICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIFByb2dyYW0gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcigpCisgICAg
eworICAgICAgICB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHMgPSBbXTsKKyAgICAgICAgdGhpcy5f
ZnVuY3Rpb25zID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl90eXBlcyA9IG5ldyBNYXAoKTsK
KyAgICB9CisgICAgCisgICAgZ2V0IHRvcExldmVsU3RhdGVtZW50cygpIHsgcmV0dXJuIHRoaXMu
X3RvcExldmVsU3RhdGVtZW50czsgfQorICAgIGdldCBmdW5jdGlvbnMoKSB7IHJldHVybiB0aGlz
Ll9mdW5jdGlvbnM7IH0KKyAgICBnZXQgdHlwZXMoKSB7IHJldHVybiB0aGlzLl90eXBlczsgfQor
ICAgIAorICAgIGFkZFRvcExldmVsU3RhdGVtZW50KHN0YXRlbWVudCkKKyAgICB7CisgICAgICAg
IHN0YXRlbWVudC5wcm9ncmFtID0gdGhpczsKKyAgICAgICAgaWYgKHN0YXRlbWVudCBpbnN0YW5j
ZW9mIEZ1bmMpIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IHRoaXMuX2Z1bmN0aW9ucy5nZXQo
c3RhdGVtZW50Lm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAgICAgICAgICAgICAg
ICB0aGlzLl9mdW5jdGlvbnMuc2V0KHN0YXRlbWVudC5uYW1lLCBhcnJheSA9IFtdKTsKKyAgICAg
ICAgICAgIGFycmF5LnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZW1l
bnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAgdGhpcy5fdHlwZXMuc2V0KHN0YXRlbWVu
dC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlvbiBvciB0eXBlOiAiICsgc3RhdGVtZW50
KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsKKyAg
ICB9CisgICAgCisgICAgcmVzb2x2ZUZ1bmNPdmVybG9hZChuYW1lLCB0eXBlQXJndW1lbnRzLCBh
cmd1bWVudFR5cGVzKQorICAgIHsKKyAgICAgICAgbGV0IGZ1bmN0aW9ucyA9IHRoaXMuZnVuY3Rp
b25zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisgICAgICAgICAgICByZXR1
cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXNvbHZlT3ZlcmxvYWRJbXBsKGZ1
bmN0aW9ucywgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAgfQorICAgIAorICAg
IGdldCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE5hbWVD
b250ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiB0aGlzLnRvcExldmVsU3Rh
dGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29s
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2wgZXh0ZW5kcyBOb2RlIHsKKyAgICBj
b25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBnZXQg
b3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVy
biB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBQcm90b2NvbDsgfQorICAg
IAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAg
fQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xEZWNsIGV4dGVuZHMgUHJvdG9jb2wgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwg
bmFtZSkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdOworICAgICAgICB0aGlzLl9zaWdu
YXR1cmVNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVWYXJpYWJsZSA9IG5ldyBU
eXBlVmFyaWFibGUob3JpZ2luLCBuYW1lLCBudWxsKTsKKyAgICB9CisgICAgCisgICAgYWRkU2ln
bmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAgICAgIC8vIE5PVEU6IEFueSB0eXBlIHBhcmFt
ZXRlcnMgZm91bmQgaW4gdGhlIHNpZ25hdHVyZSBtdXN0IGJlIGluZmVyYWJsZSBmcm9tIHRoZSB2
YWx1ZQorICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAgICAgICAvLyBGSVhNRTogQ2hlY2sgdGhp
cyEgKE9PUFMhKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlKTsKKyAg
ICAgICAgbGV0IG92ZXJsb2FkcyA9IHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQoc2lnbmF0dXJlLm5h
bWUpOworICAgICAgICBpZiAoIW92ZXJsb2FkcykKKyAgICAgICAgICAgIHRoaXMuX3NpZ25hdHVy
ZU1hcC5zZXQoc2lnbmF0dXJlLm5hbWUsIG92ZXJsb2FkcyA9IFtdKTsKKyAgICAgICAgb3Zlcmxv
YWRzLnB1c2goc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHNpZ25hdHVyZXMoKSB7
IHJldHVybiB0aGlzLl9zaWduYXR1cmVzOyB9CisgICAgc2lnbmF0dXJlc0J5TmFtZShuYW1lKSB7
IHJldHVybiB0aGlzLl9zaWduYXR1cmVNYXAuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IHR5cGVWYXJp
YWJsZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGVWYXJpYWJsZTsgfQorICAgIAorICAgIHNpZ25hdHVy
ZXNCeU5hbWVXaXRoVHlwZVZhcmlhYmxlKG5hbWUsIHR5cGVWYXJpYWJsZSkKKyAgICB7CisgICAg
ICAgIGxldCBzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3RpdHV0aW9uKFt0aGlzLnR5cGVWYXJpYWJs
ZV0sIFt0eXBlVmFyaWFibGVdKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuc2lnbmF0dXJl
c0J5TmFtZShuYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4g
bnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoc2lnbmF0dXJlID0+IHNpZ25hdHVyZS52
aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICB9CisgICAgCisgICAgaW5oZXJpdHMob3RoZXJQcm90
b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghb3RoZXJQcm90b2NvbCkKKyAgICAgICAgICAgIHJl
dHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyUHJvdG9jb2wgaW5zdGFuY2Vv
ZiBQcm90b2NvbFJlZikKKyAgICAgICAgICAgIG90aGVyUHJvdG9jb2wgPSBvdGhlclByb3RvY29s
LnByb3RvY29sRGVjbDsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0IG90aGVyU2lnbmF0dXJl
IG9mIG90aGVyUHJvdG9jb2wuc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNpZ25hdHVy
ZXMgPSB0aGlzLnNpZ25hdHVyZXNCeU5hbWUob3RoZXJTaWduYXR1cmUubmFtZSk7CisgICAgICAg
ICAgICBpZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICAgICAgbGV0IG92ZXJsb2FkID0gcmVzb2x2ZU92ZXJsb2FkSW1wbChzaWduYXR1cmVzLCBb
XSwgb3RoZXJTaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAgICAgICAgaWYgKCFvdmVy
bG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBsZXQgc3Vi
c3RpdHV0ZWRSZXR1cm5UeXBlID0KKyAgICAgICAgICAgICAgICBvdmVybG9hZC5mdW5jLnJldHVy
blR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAgICAgIHNpZ25h
dHVyZS50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAg
ICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhvdGhlclNpZ25hdHVyZS5y
ZXR1cm5UeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7
CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24ubWFwcGluZyhbdGhpcy5f
dHlwZVZhcmlhYmxlXSwgW3R5cGVdKTsKKyAgICAgICAgZm9yIChsZXQgYWJzdHJhY3RTaWduYXR1
cmUgb2YgdGhpcy5fc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZSA9IHNp
Z25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pOworICAgICAgICAgICAgbGV0IG92ZXJsb2FkID0g
dGhpcy5wcm9ncmFtLnJlc29sdmVGdW5jT3ZlcmxvYWQoc2lnbmF0dXJlLm5hbWUsIFtdLCBzaWdu
YXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAgICAgICAgaWYgKCFvdmVybG9hZCkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxldCBz
dWJzdGl0dXRlZFJldHVyblR5cGUgPSBvdmVybG9hZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0
ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAgb3ZlcmxvYWQuZnVuYy50eXBlUGFyYW1l
dGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgIGlmICghc3Vi
c3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhzaWduYXR1cmUucmV0dXJuVHlwZSkpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInByb3Rv
Y29sICIgKyB0aGlzLm5hbWUgKyAiIHsgIiArIHRoaXMuc2lnbmF0dXJlcy5qb2luKCI7ICIpICsg
IjsgfSI7CisgICAgfQorfQorCisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVm
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xSZWYgZXh0ZW5kcyBQcm90
b2NvbCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3Vw
ZXIob3JpZ2luLCBuYW1lKTsKKyAgICAgICAgdGhpcy5wcm90b2NvbERlY2wgPSBudWxsOworICAg
IH0KKyAgICAKKyAgICBpbmhlcml0cyhvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
LnByb3RvY29sRGVjbC5pbmhlcml0cyhvdGhlcik7CisgICAgfQorICAgIAorICAgIGhhc0hlaXIo
dHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVjbC5oYXNIZWlyKHR5
cGUpOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgUHRyVHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHVuaWZ5
SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCFvdGhl
ciBpbnN0YW5jZW9mIFB0clR5cGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIu
ZWxlbWVudFR5cGUpOworICAgIH0KKworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiXiI7Cisg
ICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJlZmVyZW5jZVR5cGUgZXh0ZW5kcyBUeXBlIHsK
KyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFkZHJlc3NTcGFjZSwgZWxlbWVudFR5cGUpCisgICAg
eworICAgICAgICB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpOworICAgICAgICB0
aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2FkZHJlc3NTcGFjZSA9IGFkZHJl
c3NTcGFjZTsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdl
dCBhZGRyZXNzU3BhY2UoKSB7IHJldHVybiB0aGlzLl9hZGRyZXNzU3BhY2U7IH0KKyAgICBnZXQg
ZWxlbWVudFR5cGUoKSB7IHJldHVybiB0aGlzLl9lbGVtZW50VHlwZTsgfQorICAgIGdldCBpc1By
aW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1Jlc29sdmVPdmVybG9hZEltcGwuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
UmVzb2x2ZU92ZXJsb2FkSW1wbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9SZXNvbHZlT3ZlcmxvYWRJbXBsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworZnVuY3Rpb24gcmVzb2x2ZU92ZXJsb2FkSW1wbChmdW5jdGlvbnMsIHR5cGVBcmd1bWVu
dHMsIGFyZ3VtZW50VHlwZXMpCit7CisgICAgZm9yIChsZXQgZnVuYyBvZiBmdW5jdGlvbnMpIHsK
KyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICYmIHR5cGVBcmd1bWVudHMubGVuZ3Ro
ICE9IGZ1bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIGlmIChhcmd1bWVudFR5cGVzLmxlbmd0aCAhPSBmdW5jLnBhcmFtZXRlcnMubGVuZ3Ro
KQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQg
PSBuZXcgVW5pZmljYXRpb25Db250ZXh0KGZ1bmMudHlwZVBhcmFtZXRlcnMpOworICAgICAgICBs
ZXQgb2sgPSB0cnVlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMu
bGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IHR5cGVBcmd1bWVudHNb
aV07CisgICAgICAgICAgICBsZXQgcGFyYW1ldGVyID0gZnVuYy50eXBlUGFyYW1ldGVyc1tpXTsK
KyAgICAgICAgICAgIGlmICghYXJndW1lbnQudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBwYXJh
bWV0ZXIpKSB7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAg
ICAgICAgY29udGludWU7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBl
cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCFhcmd1bWVudFR5cGVzW2ldLnVuaWZ5
KHVuaWZpY2F0aW9uQ29udGV4dCwgZnVuYy5wYXJhbWV0ZXJzW2ldLnR5cGUpKSB7CisgICAgICAg
ICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIGxldCBzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMgPSAhdHlwZUFyZ3Vt
ZW50cy5sZW5ndGg7CisgICAgICAgIGlmIChzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMpCisgICAg
ICAgICAgICB0eXBlQXJndW1lbnRzID0gW107CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0
ZXIgb2YgZnVuYy50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgbGV0IHR5cGVBcmd1bWVu
dCA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICAgICAg
aWYgKHR5cGVBcmd1bWVudCA9PSB0eXBlUGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgb2sg
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAg
ICAgIGlmIChzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICAgICAgdHlwZUFy
Z3VtZW50cy5wdXNoKHR5cGVBcmd1bWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvaykK
KyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICByZXR1cm4ge2Z1bmMsIHVuaWZpY2F0aW9u
Q29udGV4dCwgdHlwZUFyZ3VtZW50c307CisgICAgfQorICAgIAorICAgIHJldHVybiBudWxsOwor
fQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZXIuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvUmVzb2x2ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Ly8gVGhpcyBvbmx5IHJlc29sdmVzIG5hbWVzLiBBZnRlciB0aGlzIHBoYXNlIHJ1bnMsIGFsbCBu
YW1lcyB3aWxsIGJlIHJlc29sdmVkLiBUaGlzIG1lYW5zIHRoYXQgYWxsCisvLyBYWVpSZWYgb2Jq
ZWN0cyBub3cga25vdyB3aG8gdGhleSByZXNvbHZlIHRvLiBUaGlzIGRvZXMgbm90IHlldCBhbGxv
dyB0eXBlIGFuYWx5c2lzLCBiZWNhdXNlIHRoZXJlCisvLyBhcmUgc3RpbGwgVHlwZURlZnMuIFRo
aXMgdGhyb3dzIHR5cGUgZXJyb3JzIGZvciBmYWlsZWQgbmFtZSByZXNvbHV0aW9ucyBhbmQgZm9y
IHRoaW5ncyB0aGF0IGFyZQorLy8gbW9yZSBjb252ZW5pZW50IHRvIGNoZWNrIGhlcmUgdGhhbiBp
biB0aGUgQ2hlY2tlci4gVGhpcyB1c3VhbGx5IGludm9sdmVzIHRoaW5ncyB0aGF0IG5lZWQgdG8g
YmUKKy8vIGNoZWNrZWQgYmVmb3JlIFR5cGVSZWZUb1R5cGVEZWZTa2lwcGVyLgorY2xhc3MgUmVz
b2x2ZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAvLyBJdCdzIHRvdGFsbHkgT0sgdG8gaW5zdGFu
dGlhdGUgdGhpcyB3aXRoIHplcm8gYXJndW1lbnRzIChpLmUuIHBhc3NpbmcgdW5kZWZpbmVkIGZv
ciBib3RoIG9mCisgICAgLy8gdGhlbSkgaWYgeW91J3JlIGNyZWF0aW5nIGEgQ2hlY2tlciB0byB2
aXNpdCBhIFByb2dyYW0uCisgICAgY29uc3RydWN0b3IobmFtZUNvbnRleHQpCisgICAgeworICAg
ICAgICB0aGlzLl9uYW1lQ29udGV4dCA9IG5hbWVDb250ZXh0OworICAgIH0KKyAgICAKKyAgICB2
aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBO
YW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250ZXh0LnByb2dy
YW0gPSBub2RlOworICAgICAgICBuYW1lQ29udGV4dC5yZWNvZ25pemVJbnRyaW5zaWNzKCk7Cisg
ICAgICAgIG5vZGUuaW50cmluc2ljcyA9IG5hbWVDb250ZXh0LmludHJpbnNpY3M7CisgICAgICAg
IGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAg
ICAgIG5hbWVDb250ZXh0LmFkZChzdGF0ZW1lbnQpOworICAgICAgICBsZXQgY2hlY2tlciA9IG5l
dyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5v
ZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgbmFtZUNvbnRleHQuZG9TdGF0ZW1l
bnQoKCkgPT4gc3RhdGVtZW50LnZpc2l0KGNoZWNrZXIpKTsKKyAgICB9CisgICAgCisgICAgX3Zp
c2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOwor
ICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpIHsK
KyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgICAg
IHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5h
bWVDb250ZXh0OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmMobm9kZSkKKyAgICB7CisgICAg
ICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIodGhpcy5fdmlzaXRUeXBlUGFyYW1ldGVyc0Fu
ZEJ1aWxkTmFtZUNvbnRleHQobm9kZSkpOworICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQo
Y2hlY2tlcik7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMp
CisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQoY2hlY2tlcik7CisgICAgfQorICAgIAorICAg
IHZpc2l0RnVuY0RlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNvbnRleHRXaXRoVHlwZVBh
cmFtZXRlcnMgPSB0aGlzLl92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29udGV4dChu
b2RlKTsKKyAgICAgICAgbGV0IGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMgPSBuZXcgQ2hlY2tl
cihjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBlLnZp
c2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMpOworICAgICAgICBsZXQgY29udGV4dFdpdGhQ
YXJhbWV0ZXJzID0gbmV3IE5hbWVDb250ZXh0KGNvbnRleHRXaXRoVHlwZVBhcmFtZXRlcnMpOwor
ICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKSB7CisgICAgICAg
ICAgICBwYXJhbWV0ZXIudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAg
ICAgICBjb250ZXh0V2l0aFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CisgICAgICAgIH0KKyAg
ICAgICAgbGV0IGNoZWNrZXJXaXRoUGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNvbnRleHRXaXRo
UGFyYW1ldGVycyk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdChjaGVja2VyV2l0aFBhcmFtZXRl
cnMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBs
ZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4
dCkpOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAg
ICAgICAgICAgc3RhdGVtZW50LnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3
IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgbmFtZUNvbnRleHQuYWRk
KG5vZGUudHlwZVZhcmlhYmxlKTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihu
YW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBub2RlLnNpZ25hdHVy
ZXMpCisgICAgICAgICAgICBzaWduYXR1cmUudmlzaXQoY2hlY2tlcik7CisgICAgfQorICAgIAor
ICAgIHZpc2l0VHlwZURlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0g
bmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgdHlw
ZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICB0eXBlUGFy
YW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRkKHR5cGVQYXJh
bWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFt
ZUNvbnRleHQpOworICAgICAgICBub2RlLnR5cGUudmlzaXQoY2hlY2tlcik7CisgICAgfQorICAg
IAorICAgIHZpc2l0U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250
ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChs
ZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICB0
eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRkKHR5
cGVQYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNr
ZXIobmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBub2RlLmZpZWxkcykK
KyAgICAgICAgICAgIGZpZWxkLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICBfcmVz
b2x2ZVR5cGVBcmd1bWVudHModHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGZvciAobGV0
IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0
IHR5cGVBcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07CisgICAgICAgICAgICBpZiAodHlwZUFy
Z3VtZW50IGluc3RhbmNlb2YgVHlwZU9yVmFyaWFibGVSZWYpIHsKKyAgICAgICAgICAgICAgICBs
ZXQgdGhpbmcgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVHlwZU9yVmFsdWUsIHR5cGVBcmd1bWVu
dC5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaW5nKQorICAgICAgICAgICAgICAgICAg
ICBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiQ291bGQgbm90IGZp
bmQgdHlwZSBvciB2YXJpYWJsZSBuYW1lZCAiICsgdHlwZUFyZ3VtZW50Lm5hbWUpOworICAgICAg
ICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIFZhbHVlKSB7CisgICAgICAgICAgICAgICAg
ICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBWYXJpYWJsZVJlZih0eXBlQXJndW1lbnQub3JpZ2lu
LCB0eXBlQXJndW1lbnQubmFtZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAg
ICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBUeXBlUmVmKHR5cGVBcmd1bWVudC5vcmln
aW4sIHR5cGVBcmd1bWVudC5uYW1lLCBbXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAK
KyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRbaV0gaW5zdGFuY2VvZiBWYWx1ZQorICAgICAg
ICAgICAgICAgICYmICF0eXBlQXJndW1lbnRbaV0uaXNDb25zdGV4cHIpCisgICAgICAgICAgICAg
ICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkV4cGVj
dGVkIGNvbnN0ZXhwciIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJl
Zihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fcmVzb2x2ZVR5cGVBcmd1bWVudHMobm9kZS50
eXBlQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGxldCB0eXBlID0gdGhpcy5fbmFtZUNv
bnRleHQuZ2V0KFR5cGUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghdHlwZSkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJDb3Vs
ZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBpZiAoIXRoaXMu
X25hbWVDb250ZXh0LmlzRGVmaW5lZCh0eXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5
cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJJbGxlZ2FsIGZvcndhcmQgdXNlIG9m
IHR5cGUgbmFtZWQgIiArIG5vZGUubmFtZSk7CisgICAgICAgIG5vZGUudHlwZSA9IHR5cGU7Cisg
ICAgICAgIAorICAgICAgICBpZiAodHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gbm9kZS50
eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihv
cmlnaW4ub3JpZ2luU3RyaW5nLCAiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIik7Cisg
ICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsr
aSkgeworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcklzVHlwZSA9IHR5cGUudHlwZVBhcmFtZXRl
cnNbaV0gaW5zdGFuY2VvZiBUeXBlVmFyaWFibGU7CisgICAgICAgICAgICBsZXQgYXJndW1lbnRJ
c1R5cGUgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBUeXBlOworICAgICAgICAg
ICAgbm9kZS50eXBlQXJndW1lbnRzW2ldLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgaWYgKHBh
cmFtZXRlcklzVHlwZSAmJiAhYXJndW1lbnRJc1R5cGUpCisgICAgICAgICAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJFeHBlY3RlZCB0eXBlLCBidXQg
Z290IHZhbHVlIGF0IGFyZ3VtZW50ICMiICsgaSk7CisgICAgICAgICAgICBpZiAoIXBhcmFtZXRl
cklzVHlwZSAmJiBhcmd1bWVudElzVHlwZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxU
eXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIkV4cGVjdGVkIHZhbHVlLCBidXQgZ290IHR5
cGUgYXQgYXJndW1lbnQgIyIgKyBpKTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnZpc2l0
VHlwZVJlZihub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUp
CisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5f
bmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5kZWZpbmVBbGwoKTsKKyAgICAgICAg
bm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCkpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVz
dWx0ID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFZhbHVlLCBub2RlLm5hbWUpOworICAgICAgICBp
ZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdp
bi5vcmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB2YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5u
YW1lKTsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHJlc3VsdDsKKyAgICB9CisgICAgCisgICAg
dmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUuZnVuYyA9IHRoaXMuX25hbWVD
b250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIHN1cGVyLnZpc2l0UmV0dXJuKG5vZGUp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAg
ICAgICB0aGlzLl9yZXNvbHZlVHlwZUFyZ3VtZW50cyhub2RlLnR5cGVBcmd1bWVudHMpOworICAg
ICAgICBzdXBlci52aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1JldHVybi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4u
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXR1cm4gZXh0
ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cisg
ICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7
ICIpOyArICI7IH0iOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jld3Jp
dGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Jld3JpdGVyLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jld3JpdGVyLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJld3JpdGVyIHsKKyAgICB2aXNpdEZ1bmMo
bm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuYygKKyAgICAgICAgICAgIG5vZGUu
bmFtZSwgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KHRoaXMpLAorICAgICAgICAgICAgbm9kZS50eXBl
UGFyYW1ldGVycy5tYXAodHlwZVBhcm1ldGVyID0+IHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcykp
LAorICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVy
LnZpc2l0KHRoaXMpKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY1BhcmFtZXRlcihub2Rl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jQXJndW1lbnQobm9kZS5uYW1lLCBub2Rl
LnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisg
ICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEJsb2NrKG5vZGUub3JpZ2luKTsKKyAgICAg
ICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHJl
c3VsdC5hZGQoc3RhdGVtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIG5vZGU7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsK
KyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUeXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5hbWUs
IG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNp
dCh0aGlzKSkpOworICAgICAgICByZXN1bHQudHlwZSA9IG5vZGUudHlwZTsKKyAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0ZXhw
clR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29uc3RleHBy
VHlwZVBhcmFtZXRlcihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhp
cykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICBy
ZXR1cm4gbmV3IEZpZWxkKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0
aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIG5ldyBub2RlLmNvbnN0cnVjdG9yKG5vZGUucm9naWluLCBub2RlLmFk
ZHJlc3NTcGFjZSwgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRS
ZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlwZShu
b2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIG5ldyBBcnJheVR5cGUobm9kZS5vcmlnaW4sIG5vZGUuZWxlbWVudFR5cGUudmlzaXQo
dGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudChub2RlLm9yaWdpbiwgbm9kZS5saHMudmlzaXQo
dGhpcyksIG5vZGUucmhzLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJp
YWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAor
ICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IFJldHVybihu
b2RlLm9yaWdpbiwgbm9kZS52YWx1ZSA/IG5vZGUudmFsdWUudmlzaXQodGhpcykgOiBudWxsKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgICAgICBy
ZXR1cm4gbm9kZTsKKyAgICB9CisKKyAgICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAg
eworICAgICAgICByZXR1cm4gbmV3IENhbGxFeHByZXNzaW9uKAorICAgICAgICAgICAgbm9kZS5v
cmlnaW4sIG5vZGUubmFtZSwKKyAgICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodHlw
ZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2Rl
LmFyZ3VtZW50bGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykpKTsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
ODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgU3RydWN0VHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVj
dG9yKG9yaWdpbiwgbmFtZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9v
cmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlz
Ll90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9maWVsZHMg
PSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIGFkZChmaWVsZCkKKyAgICB7CisgICAgICAg
IGlmICh0aGlzLl9maWVsZHMuaGFzKGZpZWxkLm5hbWUpKQorICAgICAgICAgICAgdGhyb3cgbmV3
IEFMVHlwZUVycm9yKGZpZWxkLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJEdXBsaWNhdGUgZmllbGQg
bmFtZTogIiArIGZpZWxkLm5hbWUpOworICAgICAgICB0aGlzLl9maWVsZHMuc2V0KGZpZWxkLm5h
bWUsIGZpZWxkKTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9u
YW1lOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFt
ZXRlcnM7IH0KKyAgICAKKyAgICBnZXQgZmllbGROYW1lcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxk
cy5rZXlzKCk7IH0KKyAgICBmaWVsZEJ5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9maWVsZHMu
Z2V0KG5hbWUpOyB9CisgICAgZ2V0IGZpZWxkcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy52YWx1
ZXMoKTsgfQorICAgIGdldCBmaWVsZE1hcCgpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkczsgfQorICAg
IGdldCBpc1ByaW1pdGl2ZSgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKKyAg
ICAgICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5maWVsZHMpCisgICAgICAgICAgICByZXN1bHQg
Jj0gZmllbGQudHlwZS5pc1ByaW1pdGl2ZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQg
PSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiB0
aGlzLnR5cGVQYXJhbWV0ZXJzKQorICAgIH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJn
dW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMu
dHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9y
KG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8g
aW5zdGFudGlhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3
IE5hbWVDb250ZXh0KCk7CisgICAgICAgIAorICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gU3Vi
c3RpdHV0aW9uLm1hcHBpbmcodGhpcy50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7Cisg
ICAgICAgIGxldCByZXN1bHQgPSBuZXcgU3RydWN0VHlwZSh0aGlzLm9yaWdpbiwgdGhpcy5uYW1l
LCBbXSk7CisgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKQorICAgICAgICAg
ICAgcmVzdWx0LmFkZChmaWVsZC52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuICJzdHJ1Y3QgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAi
PiB7ICIgKyBBcnJheS5mcm9tKHRoaXMuZmllbGRzKS5qb2luKCI7ICIpICsgIjsgfSI7CisgICAg
fQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBTdWJzdGl0dXRpb24gZXh0ZW5kcyBSZXdyaXRlciB7CisgICAg
Y29uc3RydWN0b3IobWFwKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbWFwOworICAgIH0K
KyAgICAKKyAgICBzdGF0aWMgbWFwcGluZyhwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3QpCisgICAg
eworICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRMaXN0Lmxlbmd0aCkK
KyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBhbmQgYXJndW1lbnRzIGFy
ZSBtaXNtYXRjaGVkIik7CisgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIGZv
ciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIG1h
cC5zZXQocGFyYW1ldGVyc1tpXSwgYXJndW1lbnRMaXN0W2ldKTsKKyAgICAgICAgcmV0dXJuIG5l
dyBTdWJzdGl0dXRpb24obWFwKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUp
CisgICAgeworICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0KG5vZGUudHlw
ZSk7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCkgeworICAgICAgICAgICAgaWYgKG5vZGUudHlw
ZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4
cGVjdGVkIHR5cGUgYXJndW1lbnRzIG9uIHR5cGUgdmFyaWFibGUiKTsKKyAgICAgICAgICAgIHJl
dHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1
cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICB9CisKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5v
ZGUpCisgICAgeworICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0KG5vZGUu
dmFyaWFibGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpCisgICAgICAgICAgICByZXR1cm4g
cmVwbGFjZW1lbnQ7CisgICAgICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRWYXJpYWJs
ZVJlZihub2RlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1ZmZpeENh
bGxBc3NpZ25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N1ZmZpeENh
bGxBc3NpZ25tZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N1ZmZp
eENhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgU3VmZml4Q2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7
CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9saHMgPSBsaHM7Cisg
ICAgICAgIHRoaXMuZnVuYyA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyBy
ZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlzLl9saHM7IH0K
KyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMgKyAi
IHN1ZmZpeCAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlIGV4dGVuZHMgTm9kZSB7CisgICAgZ2V0IHR5
cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gW107IH0KKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIFR5
cGU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHJldHVy
biBwcm90b2NvbC5oYXNIZWlyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlh
dGVkVHlwZSgpIHsgcmV0dXJuIHRoaXM7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZURlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlRGVmIGV4dGVuZHMgVHlwZSB7Cisg
ICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5h
bWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAg
ICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyBy
ZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1l
OyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRl
cnM7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvVHlwZU9yVmFyaWFibGVSZWYuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZU9yVmFyaWFibGVSZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZU9yVmFyaWFibGVSZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlT3JWYXJpYWJsZVJlZiBleHRlbmRzIE5vZGUgewor
ICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdp
biA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAg
IGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsg
cmV0dXJuIHRoaXMuX25hbWU7IH0KKworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJl
Zi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlUmVmIGV4dGVuZHMgVHlwZSB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhp
cy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAg
dGhpcy50eXBlID0gbnVsbDsKKyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1
bWVudHM7CisgICAgfQorIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47
IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZUFy
Z3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0KKyAgICBnZXQgaXNQcmlt
aXRpdmUoKSB7IHJldHVybiB0eXBlID8gdHlwZS5pc1ByaW1pdGl2ZSA6IGZhbHNlOyB9CisgICAg
CisgICAgZ2V0IGluc3RhbnRpYXRlZFR5cGUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
dHlwZS5pbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHVu
aWZ5Tm9kZSgpCisgICAgeworICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGgp
CisgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnVuaWZ5Tm9kZTsKKyAgICAgICAgcmV0dXJu
IHRoaXM7CisgICAgfQorICAgIAorICAgIHNldFR5cGVBbmRBcmd1bWVudHModHlwZSwgdHlwZUFy
Z3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSB0eXBlLm5hbWU7CisgICAgICAg
IHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJn
dW1lbnRzOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBv
dGhlcikKKyAgICB7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVHlwZVJlZikpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy50eXBlLnVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1
bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGxl
dCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAg
ICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBv
dGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5n
KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1
bWVudHMgKyAiPiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVm
VG9UeXBlRGVmU2tpcHBlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBl
UmVmVG9UeXBlRGVmU2tpcHBlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9UeXBlUmVmVG9UeXBlRGVmU2tpcHBlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY0
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIFR5cGVSZWZUb1R5cGVEZWZTa2lwcGVyIGV4dGVuZHMgVmlzaXRvciB7
CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fdmlzaXRpbmcgPSBuZXcg
U2V0KCk7CisgICAgfQorICAgIAorICAgIF9kb1Zpc2l0KHRoaW5nLCBjYWxsYmFjaykKKyAgICB7
CisgICAgICAgIGlmICh0aGlzLl92aXNpdGluZy5oYXModGhpbmcpKQorICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKHRoaW5nLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJSZWN1cnNpdmUg
VHlwZURlZiIpOworICAgICAgICB0aGlzLl92aXNpdGluZy5hZGQodGhpbmcpOworICAgICAgICB0
cnkgeworICAgICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAg
ICAgICAgIHRoaXMuX3Zpc2l0aW5nLmRlbGV0ZSh0aGluZyk7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9kb1Zpc2l0
KG5vZGUsICgpID0+IHsKKyAgICAgICAgICAgIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAg
ICAgICAgICAgIGlmIChub2RlLnR5cGUgaW5zdGFuY2VvZiBUeXBlRGVmKSB7CisgICAgICAgICAg
ICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQobm9k
ZS50eXBlLnR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlQXJn
dW1lbnRzLmxlbmd0aCAhPSBub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAg
ICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFyZ3VtZW50L3BhcmFtZXRlciBtaXNtYXRj
aCAoc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQgZWFybGllcikiKTsKKyAgICAgICAgICAgICAgICBm
b3IgKGxldCBpID0gMDsgaSA8IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkKKyAgICAg
ICAgICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgbm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAo
IXVuaWZpY2F0aW9uQ29udGV4dC52ZXJpZnkoKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIlR5cGUgcmVmZXJlbmNl
IHRvIGEgdHlwZSBkZWZpbml0aW9uIHZpb2xhdGVzIHByb3RvY29sIGNvbnN0cmFpbnRzIik7Cisg
ICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgbGV0IG5ld1R5cGUgPSBub2RlLnR5cGUu
c3Vic3RpdHV0ZVRvVW5pZmljYXRpb24obm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzLCB1bmlmaWNh
dGlvbkNvbnRleHQpOworICAgICAgICAgICAgICAgIG5ld1R5cGUudmlzaXQodGhpcyk7CisgICAg
ICAgICAgICAgICAgbm9kZS5zZXRUeXBlQW5kQXJndWVtbnRzKG5ld1R5cGUsIFtdKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZVZhcmlhYmxlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJp
YWJsZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlVmFyaWFi
bGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHByb3RvY29s
KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fcHJvdG9jb2wgPSBwcm90b2NvbDsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHByb3Rv
Y29sKCkgeyByZXR1cm4gdGhpcy5fcHJvdG9jb2w7IH0KKyAgICAKKyAgICBnZXQgaXNQcmltaXRp
dmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvY29sICYmIHRoaXMuX3Byb3Rv
Y29sLmlzUHJpbWl0aXZlOworICAgIH0KKyAgICAKKyAgICBnZXQgaXNVbmlmaWFibGUoKSB7IHJl
dHVybiB0cnVlOyB9CisgICAgCisgICAgaW5oZXJpdHMocHJvdG9jb2wpCisgICAgeworICAgICAg
ICBpZiAoIXByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICgh
dGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJu
IHRoaXMucHJvdG9jb2wuaW5oZXJpdHMocHJvdG9jb2wpOworICAgIH0KKyAgICAKKyAgICB0eXBl
VmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAg
aWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUeXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcyk7Cisg
ICAgICAgIGlmIChyZWFsVGhpcyAhPSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHJlYWxUaGlz
LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgICAgICAKKyAgICAgICAgdW5p
ZmljYXRpb25Db250ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCBvdGhlcik7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzQXJndW1lbnQodW5pZmlj
YXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25D
b250ZXh0LmZpbmQodGhpcyk7CisgICAgICAgIAorICAgICAgICAvLyBUaGUgdGhpbmcgd2UgZ2V0
IHVuaWZpZWQgd2l0aCBtdXN0IGJlIGEgdHlwZSB2YXJpYWJsZSB0aGF0IGFjY2VwdHMgYSBicm9h
ZGVyIHNldCBvZgorICAgICAgICAvLyB0aGluZ3MgdGhhbiB3ZSBkby4KKyAgICAgICAgaWYgKCEo
cmVhbFRoaXMgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGUpKQorICAgICAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgICAgIAorICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpCisgICAgICAgICAgICBy
ZXR1cm4gIXJlYWxUaGlzLnByb3RvY29sOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMu
cHJvdG9jb2wuaW5oZXJpdHMocmVhbFRoaXMucHJvdG9jb2wpOworICAgIH0KKyAgICAKKyAgICB2
ZXJpZnlBc1BhcmFtZXRlcih1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICBpZiAo
IXRoaXMucHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJu
IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpLmluaGVyaXRzKHRoaXMucHJvdG9jb2wpOwor
ICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5u
YW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250
ZXh0LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4
dC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRl
eHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVW5pZmlj
YXRpb25Db250ZXh0IHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBlUGFyYW1ldGVycykKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gbmV3IFNldCh0eXBlUGFyYW1ldGVycyk7Cisg
ICAgICAgIHRoaXMuX25leHRNYXAgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIHVuaW9u
KGEsIGIpCisgICAgeworICAgICAgICBhID0gZmluZChhKTsKKyAgICAgICAgYiA9IGZpbmQoYik7
CisgICAgICAgIGlmIChhID09IGIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAg
ICAgICBpZiAoIWIuaXNVbmlmaWFibGUpCisgICAgICAgICAgICBbYSwgYl0gPSBbYiwgYV07Cisg
ICAgICAgIGlmICghYS5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigi
Q2Fubm90IHVuaWZ5IG5vbi11bmlmaWFibGUgdGhpbmdzICIgKyBhICsgIiBhbmQgIiArIGIpOwor
ICAgICAgICAKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdHlwZSBwYXJhbWV0ZXJzIGRvbid0
IGVuZCB1cCBiZWluZyByb290cy4KKyAgICAgICAgaWYgKGEuaXNVbmlmaWFibGUgJiYgYi5pc1Vu
aWZpYWJsZSAmJiB0aGlzLl90eXBlUGFyYW1ldGVycy5oYXMoYikpCisgICAgICAgICAgICBbYSwg
Yl0gPSBbYiwgYV07CisKKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQoYSwgYik7CisgICAgfQor
ICAgIAorICAgIGZpbmQobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IG5v
ZGU7CisgICAgICAgIGxldCBuZXh0Tm9kZSA9IHRoaXMuX25leHRNYXAuZ2V0KGN1cnJlbnROb2Rl
KTsKKyAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Tm9k
ZTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgY3VycmVudE5vZGUgPSBuZXh0Tm9k
ZTsKKyAgICAgICAgICAgIG5leHROb2RlID0gdGhpcy5fbmV4dE1hcC5nZXQoY3VycmVudE5vZGUp
OworICAgICAgICAgICAgaWYgKCFuZXh0Tm9kZSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgfQorICAgICAgICB0aGlzLl9uZXh0TWFwLnNldChub2RlLCBjdXJyZW50Tm9kZSk7Cisg
ICAgICAgIHJldHVybiBjdXJyZW50Tm9kZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5vZGVzKCkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgU2V0KCk7CisgICAgICAgIGZvciAobGV0
IFtrZXksIHZhbHVlXSBvZiB0aGlzLl9uZXh0TWFwKSB7CisgICAgICAgICAgICByZXN1bHQuYWRk
KGtleSk7CisgICAgICAgICAgICByZXN1bHQuYWRkKHZhbHVlKTsKKyAgICAgICAgfQorICAgICAg
ICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2ZXJpZnkoKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiB0aGlzLl90eXBlUGFyYW1ldGVycykgeworICAg
ICAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLnZlcmlmeUFzUGFyYW1ldGVyKHRoaXMpKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGxldCB0
eXBlQXJndW1lbnQgb2YgdGhpcy5ub2RlcykgeworICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1l
bnQuaXNVbmlmaWFibGUpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBp
ZiAodGhpcy5fdHlwZVBhcmFtZXRlcnMuaGFzKHR5cGVBcmd1bWVudCkpCisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVudC52ZXJpZnlBc0FyZ3Vt
ZW50KHRoaXMpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaXNVbnVuaWZpZWQoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuICF0aGlzLl9uZXh0TWFwLnNpemUoKTsKKyAgICB9Cit9CisKSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1ZhbHVlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFsdWUgZXh0ZW5k
cyBOb2RlIHsKKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIFZhbHVlOyB9CisgICAgZ2V0IGlzQ29u
c3RleHByKCkgeyByZXR1cm4gZmFsc2U7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
VmFyaWFibGVSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVS
ZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVSZWYuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWYXJpYWJsZVJlZiBl
eHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7
CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAg
ICAgICB0aGlzLnZhcmlhYmxlID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7
IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdGhp
cy52YXJpYWJsZS5pc0NvbnN0ZXhwcjsgfQorICAgIGdldCB1bmlmeU5vZGUoKSB7IHJldHVybiB0
aGlzLnZhcmlhYmxlLnVuaWZ5Tm9kZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvVmlzaXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmlzaXRvciB7CisgICAgdmlzaXRQ
cm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50
b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5yZXR1
cm5UeXBlLnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5v
ZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMp
OworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAg
ICAgICAgcGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNQ
YXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRGdW5jRGVmKG5vZGUpCisgICAgeworICAgICAgICB2aXNpdEZ1
bmMobm9kZSk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9m
IG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICB9CisgICAg
CisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHNp
Z25hdHVyZSBvZiBub2RlLnNpZ25hdHVyZXMpCisgICAgICAgICAgICBzaWduYXR1cmUudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAg
ICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXROYXRp
dmVUeXBlKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW10ZXIgb2Ygbm9k
ZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7
CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZURlZihub2RlKQorICAgIHsKKyAgICAgICAgZm9y
IChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAg
dHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAgICAg
IGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAg
ICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IGZpZWxkIG9m
IG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc2l0VHlwZVZhcmlhYmxlKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2
aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlw
ZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGaWVsZChub2RlKQorICAgIHsK
KyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEVs
ZW1lbnRhbFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUuZWxlbWVudFR5cGUudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAgIHsKKyAgICAg
ICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0
QXJyYXlSZWZUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlw
ZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgICAgICBub2RlLm51bUVs
ZW1lbnRzLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9k
ZSkKKyAgICB7CisgICAgICAgIG5vZGUubGhzLnZpc2l0KHRoaXMpOworICAgICAgICBub2RlLnJo
cy52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQor
ICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAg
IGlmIChub2RlLnZhbHVlKQorICAgICAgICAgICAgbm9kZS52YWx1ZS52aXNpdCh0aGlzKTsKKyAg
ICB9CisgICAgCisgICAgdmlzdEludExpdGVyYWwobm9kZSkKKyAgICB7CisgICAgfQorICAgIAor
ICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5
cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1l
bnQudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IGFyZ3VtZW50IG9mIG5vZGUuYXJndW1l
bnRMaXN0KQorICAgICAgICAgICAgYXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorfQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319226</attachid>
            <date>2017-08-28 18:36:28 -0700</date>
            <delta_ts>2017-08-28 19:16:22 -0700</delta_ts>
            <desc>wrote an inliner</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>189557</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgYWRkcmVz
c1NwYWNlcyA9IFsiY29uc3RhbnQiLCAiZGV2aWNlIiwgInRocmVhZGdyb3VwIiwgInRocmVhZCJd
OworCitmdW5jdGlvbiBpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7CisgICAgc3dpdGNo
IChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2FzZSAiZGV2aWNl
IjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
K30KKworZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAg
IGlmICghaXNBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKSkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYWRkcmVzcyBzcGFjZTogIiArIGFkZHJlc3NTcGFjZSk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFzIFRbY10gZm9y
IGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1YWdlLgorY2xh
c3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0
YW5jZW9mIEFycmF5UmVmVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBpZiAodGhpcy5hZGRyZXNzU3BhY2UgIT0gInRocmVhZCIpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIg
IiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fy
cmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1F
bGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVu
dHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vs
ZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxl
bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAg
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsK
KyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQXJyYXlSZWZUeXBlKSB7CisgICAgICAgICAg
ICBpZiAob3RoZXIuYWRkcmVzc1NwYWNlICE9ICJ0aHJlYWQiKQorICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGlu
c3RhbmNlb2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmICghdGhpcy5udW1FbGVtZW50cy51bmlmeSh1bmlmaWNh
dGlvbkNvbnRleHQsIG90aGVyLm51bUVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRU
eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9Bc3NpZ25tZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBsaHMsIHJocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7Cisg
ICAgICAgIHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgIH0K
KyAgICAKKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJocygp
IHsgcmV0dXJuIHRoaXMuX3JoczsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmxocyArICIgPSAiICsgdGhpcy5yaHM7CisgICAgfQorfTsKKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2suanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQmxvY2suanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2su
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBCbG9jayBleHRl
bmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fc3RhdGVtZW50cyA9IFtdOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgCisg
ICAgYWRkKHN0YXRlbWVudCkKKyAgICB7CisgICAgICAgIHRoaXMuX3N0YXRlbWVudHMucHVzaChz
dGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGVtZW50cygpIHsgcmV0dXJuIHRo
aXMuX3N0YXRlbWVudHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0K
K307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNz
aW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgICAgICB0aGlz
LmZ1bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJo
cygpIHsgcmV0dXJuIHRoaXMuX3JoczsgfSAvLyBUaGlzIGNhbiBiZSBudWxsLgorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxocyArICIgIiArIHRoaXMu
bmFtZSArICh0aGlzLnJocyA/ICI9ICIgKyB0aGlzLnJocyA6ICIiKTsKKyAgICB9Cit9CisKSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQ2FsbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkK
KyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICAgICAg
dGhpcy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAgICAgICB0aGlzLmZ1bmMgPSBu
dWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0K
KyAgICBnZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8
IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCArICIpIjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL0NoZWNrLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
ZnVuY3Rpb24gY2hlY2socHJvZ3JhbSkKK3sKKyAgICBwcm9ncmFtLnZpc2l0KG5ldyBDaGVja2Vy
KHByb2dyYW0pKTsKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DaGVja2VyLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
ODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQ2hlY2tlciBleHRlbmRzIFZpc2l0b3IgeworICAgIGNvbnN0cnVj
dG9yKHByb2dyYW0pCisgICAgeworICAgICAgICB0aGlzLl9wcm9ncmFtID0gcHJvZ3JhbTsKKyAg
ICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9IG51bGw7CisgICAgfQorICAgIAorICAgIHZp
c2l0UHJvZ3JhbShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5v
ZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKSB7CisgICAgICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVt
ZW50ID0gc3RhdGVtZW50OworICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAg
ICAgICB9CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgewor
ICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKSB7CisgICAgICAg
ICAgICBsZXQgc2V0ID0gbmV3IFNldCgpOworICAgICAgICAgICAgZnVuY3Rpb24gY29uc2lkZXIo
dGhpbmcpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHRoaW5nLmlzVW5pZmlh
YmxlKQorICAgICAgICAgICAgICAgICAgICBzZXQuYWRkKHRoaW5nKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGNsYXNzIE5vdGljZVR5cGVWYXJpYWJsZSBleHRlbmRzIFZpc2l0b3Igewor
ICAgICAgICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgICAgICAgICAgICAgIHsKKyAg
ICAgICAgICAgICAgICAgICAgY29uc2lkZXIobm9kZS50eXBlKTsKKyAgICAgICAgICAgICAgICB9
CisgICAgICAgICAgICAgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgICAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICAgICAgY29uc2lkZXIobm9kZS52YXJpYWJsZSk7CisgICAgICAg
ICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGV0IG5vdGljZVR5cGVWYXJp
YWJsZSA9IG5ldyBOb3RpY2VUeXBlVmFyaWFibGUoKTsKKyAgICAgICAgICAgIGZvciAobGV0IHBh
cmFtZXRlclR5cGUgb2Ygc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKQorICAgICAgICAgICAgICAg
IHBhcmFtZXRlclR5cGUudmlzaXQobm90aWNlVHlwZVZhcmlhYmxlKTsKKyAgICAgICAgICAgIGZv
ciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygc2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICAgICAgaWYgKCFzZXQuaGFzKHR5cGVQYXJhbWV0ZXIpKQorICAgICAgICAgICAgICAg
ICAgICB0aHJvdyBBTFR5cGVFcnJvcih0eXBlUGFyYW1ldGVyLm9yaWdpbi5vcmlnaW5TdHJpbmcs
ICJUeXBlIHBhcmFtZXRlciB0byBwcm90b2NvbCBzaWduYXR1cmUgbm90IGluZmVycmFibGUgZnJv
bSB2YWx1ZSBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNl
dC5oYXMobm9kZS50eXBlVmFyaWFibGUpKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5
cGVFcnJvcihzaWduYXR1cmUub3JpZ2luLm9yaWdpblN0cmluZywgIlByb3RvY29sJ3MgdHlwZSB2
YXJpYWJsZSBub3QgbWVudGlvbmVkIGluIHNpZ25hdHVyZSIpOworICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIF9jaGVja1R5cGVBcmd1bWVudHMob3JpZ2luLCB0eXBlUGFyYW1ldGVycywgdHlw
ZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVBhcmFt
ZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCBhcmd1bWVudElzVHlwZSA9IHR5
cGVBcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBUeXBlOworICAgICAgICAgICAgbGV0IHJlc3VsdCA9
IG5vZGUudHlwZUFyZ3VtZW50c1tpXS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIGlmIChhcmd1
bWVudElzVHlwZSkgeworICAgICAgICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50c1tpXS5pbmhl
cml0cyh0eXBlQXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFM
VHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJUeXBlIGFyZ3VtZW50IGRvZXMgbm90IGlu
aGVyaXQgcHJvdG9jb2wiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAg
aWYgKCFyZXN1bHQuZXF1YWxzKHR5cGVQYXJhbWV0ZXJzW2ldLnR5cGUpKQorICAgICAgICAgICAg
ICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIldyb25n
IHR5cGUgZm9yIGNvbnN0ZXhwciIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fY2hlY2tU
eXBlQXJndW1lbnRzKG5vZGUub3JpZ2luLCB0eXBlLnR5cGVQYXJhbWV0ZXJzLCBub2RlLnR5cGVB
cmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAg
ICB7CisgICAgICAgIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIAorICAg
ICAgICBpZiAobm9kZS5hZGRyZXNzU3BhY2UgPT0gInRocmVhZCIpCisgICAgICAgICAgICByZXR1
cm47CisgICAgICAgIAorICAgICAgICBjbGFzcyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMgZXh0ZW5k
cyBSZXdyaXRlciB7CisgICAgICAgICAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICAgICAgICAg
IHsKKyAgICAgICAgICAgICAgICBub2RlID0gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAg
ICAgICAgICAgICAgIHJldHVybiBub2RlLmluc3RhbnRpYXRlZFR5cGUudmlzaXQodGhpcyk7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHZpc2l0UmVmZXJlbmNlVHlw
ZShub2RlKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybiBub2RlOworICAg
ICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIW5vZGUuZWxlbWVu
dFR5cGUudmlzaXQobmV3IEluc3RhbnRpYXRlSW1tZWRpYXRlcygpKS5pc1ByaW1pdGl2ZSkKKyAg
ICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcs
ICJJbGxlZ2FsIHBvaW50ZXIgdG8gbm9uLXByaW1pdGl2ZSB0eXBlIik7CisgICAgfQorICAgIAor
ICAgIHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAgeworICAgICAgICBpZiAoIW5vZGUubnVtRWxl
bWVudHMuaXNDb25zdGV4cHIpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9k
ZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiQXJyYXkgbGVuZ3RoIG11c3QgYmUgY29uc3RleHByIik7
CisgICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAg
Ly8gRklYTUU6IFdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgbGhzIGlzIGFzc2lnbmFibGUuCisg
ICAgICAgIGxldCBsaHNUeXBlID0gbm9kZS5saHMudmlzaXQodGhpcyk7CisgICAgICAgIGxldCBy
aHNUeXBlID0gbm9kZS5yaHMudmlzaXQodGhpcyk7CisgICAgICAgIGlmICghbGhzVHlwZS5lcXVh
bHMocmhzVHlwZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmln
aW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBtaXNtYXRjaCBpbiBhc3NpZ25tZW50OiAiICsgbGhzVHlw
ZSArICIgdmVyc3VzICIgKyByaHNUeXBlKTsKKyAgICAgICAgcmV0dXJuIGxoc1R5cGU7CisgICAg
fQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVy
biByZXN1bHQudHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7
CisgICAgICAgIGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAgICBsZXQgcmVzdWx0VHlwZSA9
IG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXRoaXMuZnVuYy5yZXR1
cm5WYWx1ZS5lcXVhbHMocmVzdWx0VHlwZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFM
VHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIlRyeWluZyB0byByZXR1cm4gIiAr
IHJlc3VsdFR5cGUgKyAiIGluIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zICIgKyBmdW5jLnJldHVy
blZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAg
ICAgaWYgKCFmdW5jLnJldHVyblZhbHVlLmVxdWFscyh0aGlzLl9wcm9ncmFtLmludHJpbnNpY3Mu
dm9pZCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3Jp
Z2luU3RyaW5nLCAiTm9uLXZvaWQgZnVuY3Rpb24gbXVzdCByZXR1cm4gYSB2YWx1ZSIpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEludExpdGVyYWwobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLl9wcm9ncmFtLmludHJpbnNpY3MuaW50MzI7CisgICAgfQorICAgIAorICAgIHZpc2l0
Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVu
dCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1lbnQudmlzaXQo
dGhpcyk7CisgICAgICAgIGxldCBhcmd1bWVudFR5cGVzID0gbm9kZS5hcmd1bWVudExpc3QubWFw
KGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgCisgICAgICAgIGxl
dCBvdmVybG9hZCA9IG51bGw7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhp
cy5fY3VycmVudFN0YXRlbWVudC50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgaWYgKCEo
dHlwZVBhcmFtZXRlciBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkpCisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICBpZiAoIXR5cGVQYXJhbWV0ZXIucHJvdG9jb2wpCisgICAg
ICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBsZXQgc2lnbmF0dXJlcyA9CisgICAg
ICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5wcm90b2NvbC5zaWduYXR1cmVzQnlOYW1lV2l0aFR5
cGVWYXJpYWJsZShub2RlLm5hbWUsIHR5cGVQYXJhbWV0ZXIpOworICAgICAgICAgICAgaWYgKCFz
aWduYXR1cmVzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgb3Zlcmxv
YWQgPSByZXNvbHZlT3ZlcmxvYWRJbXBsKHNpZ25hdHVyZXMsIG5vZGUudHlwZUFyZ3VtZW50cywg
YXJndW1lbnRUeXBlcyk7CisgICAgICAgICAgICBpZiAob3ZlcmxvYWQpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvdmVybG9hZCkgeworICAgICAgICAg
ICAgb3ZlcmxvYWQgPSB0aGlzLl9uYW1lQ29udGV4dC5wcm9ncmFtLnJlc29sdmVGdW5jT3Zlcmxv
YWQoCisgICAgICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMsIGFyZ3Vt
ZW50VHlwZXMpOworICAgICAgICB9CisgICAgICAgIGlmICghb3ZlcmxvYWQpCisgICAgICAgICAg
ICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRGlkIG5v
dCBmaW5kIGZ1bmN0aW9uIGZvciBjYWxsIik7CisgICAgICAgIG5vZGUuZnVuYyA9IG92ZXJsb2Fk
LmZ1bmM7CisgICAgICAgIG5vZGUuYWN0dWFsVHlwZUFyZ3VtZW50cyA9IG92ZXJsb2FkLnR5cGVB
cmd1bWVudHMubWFwKFR5cGVSZWYud3JhcCk7CisgICAgICAgIHJldHVybiBvdmVybG9hZC5mdW5j
LnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICBvdmVybG9h
ZC5mdW5jLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlvbkNvbnRleHQpOworICAg
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NvbW1hRXhwcmVzc2lvbi5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Db21tYUV4cHJlc3Npb24uanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDb21tYUV4cHJlc3Npb24gZXh0ZW5kcyBF
eHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxpc3QpCisgICAgeworICAgICAg
ICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9saXN0ID0gbGlzdDsKKyAgICB9CisgICAg
CisgICAgZ2V0IGxpc3QoKSB7IHJldHVybiB0aGlzLl9saXN0OyB9CisgICAgCisgICAgdG9TdHJp
bmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIoIiArIHRoaXMubGlzdC50b1N0cmluZygpICsg
IikiOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQ
YXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlw
ZVBhcmFtZXRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4
cHJUeXBlUGFyYW1ldGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgQ29uc3RleHByVHlwZVBhcmFtZXRlciBleHRlbmRzIFZhbHVlIHsKKyAgICBjb25zdHJ1
Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0g
dHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9
CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgZ2V0IGlzQ29uc3Rl
eHByKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRy
dWU7IH0KKyAgICAKKyAgICB0eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90
aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBWYWx1ZSkpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5p
ZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsK
KyAgICAgICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRo
aXMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICBp
ZiAob3RoZXIgaW5zdGFuY2VvZiBWYXJpYWJsZVJlZikKKyAgICAgICAgICAgIG90aGVyID0gb3Ro
ZXIudmFyaWFibGU7CisgICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnko
dGhpcywgb3RoZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdW5p
ZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICB9
CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgewor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNQYXJhbWV0ZXIo
dW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAi
ICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FRmxv
YXQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRUZsb2F0LmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0VGbG9hdC5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIEVGbG9hdCBleHRlbmRzIEVWYWx1ZSB7CisgICAgY29u
c3RydWN0b3IodHlwZSwgdmFsdWUpCisgICAgeworICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAg
ICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyBy
ZXR1cm4gdGhpcy5fdmFsdWU7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRUludC5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FSW50LmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0VJbnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBFSW50IGV4dGVuZHMgRVZhbHVlIHsKKyAgICBjb25zdHJ1Y3Rvcih0
eXBlLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKHR5cGUpOworICAgICAgICB0aGlzLl92
YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlz
Ll92YWx1ZTsgfQorICAgIAorICAgIGFkZChvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBu
ZXcgRUludCh0aGlzLnR5cGUsICh0aGlzLnZhbHVlICsgb3RoZXIudmFsdWUpIHwgMCk7CisgICAg
fQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiIiArIHRoaXMu
dmFsdWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FVmFsdWUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRVZhbHVlLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0VWYWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIEVWYWx1ZSB7CisgICAgY29uc3RydWN0b3IodHlwZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgdHlwZSgpIHsg
cmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVh
dGlvbkNvbW1vbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0aW9u
Q29tbW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRpb25D
b21tb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjb25zdCBCcmVh
a0V4Y2VwdGlvbiA9IFN5bWJvbCgiQnJlYWtFeGNlcHRpb24iKTsKK2NvbnN0IENvbnRpbnVlRXhj
ZXB0aW9uID0gU3ltYm9sKCJDb250aW51ZUV4Y2VwdGlvbiIpOworY29uc3QgUmV0dXJuRXhjZXB0
aW9uID0gU3ltYm9sKCJSZXR1cm5FeGNlcHRpb24iKTsKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0V2YWx1YXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0b3Iu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdG9yLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRXZhbHVhdG9yIGV4dGVuZHMg
VmlzaXRvciB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9F
eHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
RXhwcmVzc2lvbiBleHRlbmRzIFZhbHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4pCisgICAg
eworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgfQorICAgIAorICAgIGdldCBv
cmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0ZpZWxkLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRmllbGQgeworICAgIGNvbnN0cnVjdG9yKG9y
aWdpbiwgbmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsK
KyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJl
dHVybiB0aGlzLl90eXBlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9GdW5jLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1
bmMuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuYy5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmMgZXh0ZW5kcyBOb2RlIHsK
KyAgICBjb25zdHJ1Y3RvcihuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1l
dGVycykKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9y
ZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0
eXBlUGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7Cisg
ICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdl
dCByZXR1cm5UeXBlKCkgeyByZXR1cm4gdGhpcy5fcmV0dXJuVHlwZTsgfQorICAgIGdldCB0eXBl
UGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBh
cmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRl
clR5cGVzKCkgeyByZXR1cm4gdGhpcy5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1l
dGVyLnR5cGUpOyB9CisgICAgCisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBGdW5jOyB9CisgICAg
CisgICAgdW5pZnlJbXBsKG90aGVyKQorICAgIHsKKyAgICAgICAgCisgICAgfQorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnJldHVyblR5cGUgKyAiICIg
KyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4oIiArIHRoaXMucGFy
YW1ldGVycyArICIpIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNE
ZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0RlZi5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jRGVmLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY0RlZiBleHRlbmRzIEZ1bmMgeworICAgIGNv
bnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFt
ZXRlcnMsIGJvZHkpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCByZXR1cm5UeXBlLCB0eXBl
UGFyYW1ldGVycywgcGFyYW1ldGVycyk7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsK
KyAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigp
IHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiB7ICIgKyBib2R5ICsgIiB9IjsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNJbnN0YW50aWF0b3IuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0luc3RhbnRpYXRvci5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jSW5zdGFudGlhdG9yLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY0luc3RhbnRpYXRvciB7Cisg
ICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5faW5zdGFuY2VzID0gbmV3IE1h
cCgpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIGEgRnVuYyBvYmplY3QgdGhhdCB1bmlx
dWVseSBpZGVudGlmaWVzIGEgcGFydGljdWxhciBzeXN0ZW0gb2YgdHlwZSBhcmd1bWVudHMuCisg
ICAgZ2V0VW5pcXVlKGZ1bmMsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBpZiAoIWZ1
bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmM7CisgICAg
ICAgIAorICAgICAgICBsZXQgaW5zdGFuY2VzID0gdGhpcy5faW5zdGFuY2VzLmdldChmdW5jKTsK
KyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbnMuc2V0
KGZ1bmMsIGZ1bmN0aW9ucyA9IFtdKTsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0IGluc3Rh
bmNlIG9mIGluc3RhbmNlcykgeworICAgICAgICAgICAgbGV0IG9rID0gdHJ1ZTsKKyAgICAgICAg
ICAgIGZvciAobGV0IGkgPSBpbnN0YW5jZS50eXBlQXJndW1lbnRzLmxlbmd0aDsgaS0tOykgewor
ICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2UudHlwZUFyZ3VtZW50c1tpXS5lcXVhbHModHlw
ZUFyZ3VtZW50c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIHJldHVybiBpbnN0YW5jZS5mdW5jOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBs
ZXQgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLm1hcHBpbmcoZnVuYy50eXBlUGFyYW1ldGVy
cywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIGxldCBmdW5jID0gbmV3IEZ1bmNEZWYoCisgICAg
ICAgICAgICBmdW5jLm9yaWdpbiwgZnVuYy5uYW1lLAorICAgICAgICAgICAgZnVuYy5yZXR1cm5U
eXBlLnZpc2l0KHN1YnN0aXR1dGlvbiksCisgICAgICAgICAgICBbXSwgLy8gV2UncmUgaW5zdGFu
dGlhdGVkIHNvIHdlIG5vIGxvbmdlciB0YWtlIHR5cGUgcGFyYW1ldGVycy4KKyAgICAgICAgICAg
IHBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQoc3Vic3RpdHV0aW9u
KSksCisgICAgICAgICAgICBib2R5LnZpc2l0KHN1YnN0aXR1dGlvbikpOworICAgICAgICBsZXQg
aW5zdGFuY2UgPSB7ZnVuYywgdHlwZUFyZ3VtZW50c307CisgICAgICAgIGluc3RhbmNlcy5wdXNo
KGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGZ1bmM7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9GdW5jUGFyYW1ldGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL0Z1bmNQYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvRnVuY1BhcmFtZXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ1IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIEZ1bmNQYXJhbWV0ZXIgZXh0ZW5kcyBWYWx1ZSB7CisgICAgLy8gVGhlIG5hbWUgaXMg
b3B0aW9uYWwuIEl0J3MgT0sgZm9yIGl0IHRvIGJlIG51bGwhCisgICAgY29uc3RydWN0b3Iob3Jp
Z2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOwor
ICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7Cisg
ICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAg
ICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0
dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvRnVuY1NpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9GdW5jU2lnbmF0dXJlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL0Z1bmNTaWduYXR1cmUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmN0aW9uTGlrZUJsb2NrIGV4dGVuZHMg
VmFsdWUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgYXJndW1lbnRMaXN0LCBwYXJhbWV0ZXJz
LCBib2R5KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0
aGlzLl9hcmd1bWVudExpc3QgPSBhcmd1bWVudExpc3Q7CisgICAgICAgIHRoaXMuX3BhcmFtZXRl
cnMgPSBwYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTsKKyAgICB9CisgICAg
CisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBhcmd1
bWVudExpc3QoKSB7IHJldHVybiB0aGlzLl9hcmd1bWVudExpc3Q7IH0KKyAgICBnZXQgcGFyYW1l
dGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7IH0KKyAgICBnZXQgYm9keSgpIHsgcmV0
dXJuIHRoaXMuX2JvZHk7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gIlsmXSAoIiArIHBhcmFtZXRlcnMgKyAiKSB7ICIgKyBibG9jayArICIgfSgiICsgYXJn
dW1lbnRMaXN0ICsgIikiOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0lubGlu
ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbmxpbmUuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5lLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gaW5saW5lKHByb2dyYW0pCit7CisgICAgZm9yIChs
ZXQgZnVuYyBvZiBwcm9ncmFtLmZ1bmN0aW9ucykgeworICAgICAgICBpZiAoIWZ1bmMudHlwZVBh
cmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgX2lubGluZUZ1bmN0aW9uKHByb2dyYW0sIGZ1
bmMsIG5ldyBWaXNpdGluZ1NldCgpKTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIF9pbmxpbmVGdW5j
dGlvbihwcm9ncmFtLCBmdW5jLCB2aXNpdGluZykKK3sKKyAgICB2aXNpdGluZy5kb1Zpc2l0KGZ1
bmMsICgpID0+IHsKKyAgICAgICAgaWYgKGZ1bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAg
ICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5saW5lIGZ1bmN0aW9uIHRoYXQgaGFz
IHR5cGUgcGFyYW1ldGVycyIpOworICAgICAgICBpZiAoZnVuYy5pbmxpbmVkKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICBmdW5jLnZpc2l0KG5ldyBMVmFsdWVCdWlsZGVyKCkpOworICAg
ICAgICBmdW5jLmJvZHkgPSBmdW5jLmJvZHkudmlzaXQobmV3IElubGluZXIocHJvZ3JhbSwgZnVu
YywgdmlzaXRpbmcpKTsKKyAgICAgICAgZnVuYy5pbmxpbmVkID0gdHJ1ZTsKKyAgICB9KTsKK30K
KworZnVuY3Rpb24gcmVzb2x2ZUlubGluZWRGdW5jdGlvbihwcm9ncmFtLCBuYW1lLCB0eXBlQXJn
dW1lbnRzLCBhcmd1bWVudFR5cGVzKQoreworICAgIGxldCBvdmVybG9hZCA9IHByb2dyYW0ucmVz
b2x2ZUZ1bmNPdmVybG9hZChuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKTsKKyAg
ICBpZiAoIW92ZXJsb2FkLmZ1bmMudHlwZVBhcmFtZXRlcnMpCisgICAgICAgIHJldHVybiBvdmVy
bG9hZC5mdW5jOworICAgIGxldCBmdW5jID0gcHJvZ3JhbS5mdW5jSW5zdGFudGlhdG9yLmdldFVu
aXF1ZShvdmVybG9hZC5mdW5jLCBvdmVybG9hZC50eXBlQXJndW1lbnRzKTsKKyAgICBfaW5saW5l
RnVuY3Rpb24ocHJvZ3JhbSwgZnVuYywgbmV3IFZpc2l0aW5nU2V0KCkpOworICAgIHJldHVybiBm
dW5jOworfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5lci5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9JbmxpbmVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL0lubGluZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBJbmxpbmVyIGV4dGVuZHMgUmV3cml0ZXIgeworICAgIGNvbnN0cnVjdG9yKHByb2dy
YW0sIGZ1bmMsIHZpc2l0aW5nKQorICAgIHsKKyAgICAgICAgdGhpcy5fcHJvZ3JhbSA9IHByb2dy
YW07CisgICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gdmlzaXRpbmc7CisgICAgfQorICAgIAorICAg
IHZpc2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGxldCBmdW5jID0gdGhp
cy5fcHJvZ3JhbS5mdW5jSW5zdGFudGlhdG9yLmdldFVuaXF1ZShub2RlLmZ1bmMsIG5vZGUuYWN0
dWFsVHlwZUFyZ3VtZW50cyk7CisgICAgICAgIF9pbmxpbmVGdW5jdGlvbih0aGlzLl9wcm9ncmFt
LCBmdW5jLCB0aGlzLl92aXNpdGluZyk7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25MaWtl
QmxvY2soCisgICAgICAgICAgICBub2RlLm9yaWdpbiwKKyAgICAgICAgICAgIG5vZGUuYXJndW1l
bnRMaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSksCisgICAgICAgICAg
ICBmdW5jLnBhcmFtZXRlcnMsIGZ1bmMuYm9keSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0ludExpdGVyYWwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0
ZXJhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEludExp
dGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHZhbHVl
KQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2
YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7
IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgdG9T
dHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIiICsgdGhpcy5fdmFsdWU7CisgICAgfQor
fQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIEludHJpbnNpY3MgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAg
ICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAg
ICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSB2b2lkPD4iLAorICAgICAgICAgICAgKHR5
cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnZvaWQgPSB0eXBlOworICAgICAgICAgICAg
fSk7CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0
aXZlIHR5cGUgaW50MzI8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAgICAgICAg
ICAgIHRoaXMuaW50MzIgPSB0eXBlOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5f
bWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUgZG91YmxlPD4iLAor
ICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLmRvdWJsZSA9IHR5
cGU7CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgYWRkKHRoaW5nKQorICAgIHsK
KyAgICAgICAgbGV0IGludHJpbnNpYyA9IHRoaXMuX21hcC5nZXQodGhpbmcubmFtZSk7CisgICAg
ICAgIGlmICghaW50cmluc2ljKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKHRo
aW5nLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJVbnJlY29nbml6ZWQgaW50cmluc2ljOiAiICsgdGhp
bmcpOworICAgICAgICBpbnRyaW5zaWModGhpbmcpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvTEhTRXZhbHVhdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0xIU0V2YWx1YXRvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9M
SFNFdmFsdWF0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBMSFNFdmFsdWF0b3IgeworICAgIAorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MVmFs
dWUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTFZhbHVlLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0xWYWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIExWYWx1ZSB7CisgICAgY29uc3RydWN0b3IodmFsdWUp
CisgICAgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIHJl
c2V0KCkKKyAgICB7CisgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlLnR5cGUuZGVmYXVs
dFZhbHVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1
cm4gIkw6KCIgKyB0aGlzLnZhbHVlICsgIikiOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvTFZhbHVlQnVpbGRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9MVmFsdWVCdWlsZGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0xW
YWx1ZUJ1aWxkZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBMVmFsdWVCdWlsZGVyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgY29uc3RydWN0b3IocHJvZ3Jh
bSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBwcm9ncmFtOworICAgIH0KKyAgICAK
KyAgICBfY3JlYXRlTFZhbHVlKHR5cGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3
IExWYWx1ZSh0eXBlLmRlZmF1bHRWYWx1ZSk7CisgICAgICAgIHRoaXMuX3Byb2dyYW0ubFZhbHVl
cy5wdXNoKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAg
IHZpc2l0RnVuY1BhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5sVmFsdWUgPSBu
ZXcgTFZhbHVlKG5vZGUudHlwZS5kZWZhdWx0VmFsdWUpOworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
TGV4ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTGV4ZXIgeworICAgIGNv
bnN0cnVjdG9yKG9yaWdpbiwgdGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9y
aWdpbjsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAgICAgIHRoaXMuX2luZGV4ID0g
MDsKKyAgICAgICAgdGhpcy5fc3RhY2sgPSBbXTsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpbmVO
dW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlckZvckluZGV4KHRo
aXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luICsgIjoiICsgKHRoaXMubGluZU51bWJlciArIDEp
OworICAgIH0KKyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5kZXgoaW5kZXgpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpLm1hdGNoKC9cbi9nKS5s
ZW5ndGg7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMuX2luZGV4
OyB9CisgICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2luZGV4ID0gdmFsdWU7IH0KKyAgICAK
KyAgICBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9zdGFjay5sZW5ndGgpCisgICAg
ICAgICAgICByZXR1cm4gdGhpcy5fc3RhY2sucG9wKCk7CisgICAgICAgIAorICAgICAgICBpZiAo
dGhpcy5faW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gbnVs
bDsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1lbnRCZWdpbiA9IC9cL1wqLzsKKyAg
ICAgICAgY29uc3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4gPSAvXC9cLy87CisgICAgICAgIAor
ICAgICAgICBsZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZXh0ID0g
UmVnRXhwLmxhc3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0b2tlbiA9IG5ldyBMZXhlclRva2Vu
KHRoaXMsIHRoaXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAgICAgICAgICAgIHRoaXMuX2luZGV4
ICs9IHRleHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICB9Owor
CisgICAgICAgIGxldCByZWxldmFudFRleHQ7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAg
ICAgIHJlbGV2YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3RyaW5nKHRoaXMuX2luZGV4KTsKKyAg
ICAgICAgICAgIGlmICgvXlxzKy8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAg
ICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wqLy50ZXN0
KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSByZWxldmFu
dFRleHQuc2VhcmNoKC9cKlwvLyk7CisgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgMCkK
KyAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIpOwor
ICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZEluZGV4OworICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9cLy4qLy50ZXN0
KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBSZWdFeHAu
bGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICAvLyBG
SVhNRTogTWFrZSB0aGlzIGRvIFVuaWNvZGUuCisgICAgICAgIGlmICgvXlteXGRcV11cdyovLnRl
c3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImlkZW50aWZpZXIi
KTsKKworICAgICAgICBpZiAoL15bMC05XSsvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAg
ICAgIHJldHVybiByZXN1bHQoImludExpdGVyYWwiKTsKKworICAgICAgICAvLyBGSVhNRTogTWFr
ZSB0aGlzIGhhbmRsZSBleHAtZm9ybSBsaXRlcmFscyBsaWtlIDFlMS4KKyAgICAgICAgaWYgKC9e
KFswLTldKlwuWzAtOV0rKXwoWzAtOV0rXC5bMC05XSopLy50ZXN0KHJlbGV2YW50VGV4dCkpCisg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJkb3VibGVMaXRlcmFsIik7CisgICAgICAgIAorICAg
ICAgICBpZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8aWZ8ZWxzZXxlbnVtfGNvbnRpbnVlfGJy
ZWFrfHN3aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxlfGRvfHJldHVybnxzaXplb2Z8Y29uc3Rh
bnR8ZGV2aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVyYXRvcikvLnRlc3QocmVsZXZhbnRUZXh0
KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImtleXdvcmQiKTsKKyAgICAgICAgCisgICAg
ICAgIGlmICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5eJnw8PlxcLV18LT58PT58PD18PT18IT18
Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAg
ICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgZmFp
bCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3aXRoOiAiICsgcmVsZXZhbnRUZXh0LnN1
YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAgICBwdXNoKHRva2VuKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7CisgICAgfQorICAgIAorICAgIHBlZWsoKQor
ICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQoKTsKKyAgICAgICAgcHVzaChyZXN1bHQp
OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmYWlsKGVycm9yKQor
ICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4RXJyb3IodGhpcy5vcmlnaW5TdHJpbmcs
IGVycm9yKTsKKyAgICB9CisgICAgCisgICAgYmFja3RyYWNraW5nU2NvcGUoY2FsbGJhY2spCisg
ICAgeworICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlOworICAgICAgICB0cnkgeworICAg
ICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAg
ICAgICAgIGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhFcnJvcikgeworICAgICAgICAgICAgICAg
IHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9Cit9CkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvTGV4ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIExleGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9yKGxleGVyLCBvcmlnaW4sIGluZGV4LCBr
aW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhlcjsKKyAgICAgICAg
dGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9pbmRleCA9IGluZGV4OworICAg
ICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAg
fQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9raW5k
OworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5kZXgoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAgIH0KKyAgICAKKyAgICBnZXQgbGluZU51
bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbGV4ZXIubGluZU51bWJlckZvcklu
ZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gKyAiOiIgKyAodGhpcy5saW5lTnVtYmVy
ICsgMSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVy
biAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwgIiArIHRoaXMudGV4dCArICIsICIgKyB0
aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
TmFtZUNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRl
eHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgVHlwZU9yVmFsdWUg
PSBTeW1ib2woKTsKKworY2xhc3MgTmFtZUNvbnRleHQgeworICAgIGNvbnN0cnVjdG9yKGRlbGVn
YXRlKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOworICAgICAgICBsZXQg
dHlwZUFuZFZhbHVlTWFwID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9tYXAuc2V0KFR5cGUs
IHR5cGVBbmRWYWx1ZU1hcCk7CisgICAgICAgIHRoaXMuX21hcC5zZXQoVmFsdWUsIHR5cGVBbmRW
YWx1ZU1hcCk7CisgICAgICAgIGZvciAobGV0IGtpbmQgb2YgbmFtZWFibGVLaW5kcykKKyAgICAg
ICAgICAgIHRoaXMuX21hcC5zZXQoa2luZCwgbmV3IE1hcCgpKTsKKyAgICAgICAgdGhpcy5fZGVm
aW5lZCA9IG5ldyBTZXQoKTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9IG51bGw7
CisgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbnVsbDsKKyAgICAgICAgdGhpcy5faW50cmluc2lj
cyA9IG51bGw7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsOworICAgIH0KKyAgICAKKyAg
ICBtYXBGb3Ioa2luZCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9tYXAuZ2V0
KGtpbmQpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJv
cigiQmFkIGtpbmQ6ICIgKyBraW5kKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cisg
ICAgCisgICAgYWRkKHRoaW5nKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGluZy5uYW1lKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHRoaW5nLmlzTmF0aXZlKSB7
CisgICAgICAgICAgICBpZiAoIXRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJOYXRpdmUgZnVuY3Rpb24gaW4gYSBzY29wZSB0aGF0IGRvZXMgbm90IHJl
Y29nbml6ZSBpbnRyaW5zaWNzIik7CisgICAgICAgICAgICB0aGlzLl9pbnRyaW5zaWNzLmFkZCh0
aGluZyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxldCBtYXAgPSBtYXBGb3IodGhp
bmcua2luZCk7CisgICAgICAgIGlmICh0aGluZy5raW5kID09IEZ1bmMpIHsKKyAgICAgICAgICAg
IGxldCBhcnJheSA9IG1hcC5nZXQodGhpbmcubmFtZSk7CisgICAgICAgICAgICBpZiAoIWFycmF5
KQorICAgICAgICAgICAgICAgIG1hcC5zZXQodGhpbmcubmFtZSwgYXJyYXkgPSBbXSk7CisgICAg
ICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgICAgICBpZiAobWFwLmhhcyh0aGluZy5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5l
dyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRHVwbGljYXRlIG5hbWU6
ICIgKyB0aGluZy5uYW1lKTsKKyAgICAgICAgbWFwLnNldCh0aGluZy5uYW1lLCB0aGluZyk7Cisg
ICAgfQorICAgIAorICAgIGdldChraW5kLCBuYW1lKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3Vs
dCA9IG1hcEZvcihraW5kID09IFR5cGVPclZhbHVlID8gVHlwZSA6IGtpbmQpLmdldChuYW1lKTsK
KyAgICAgICAgaWYgKCFyZXN1bHQgJiYgdGhpcy5fZGVsZWdhdGUpCisgICAgICAgICAgICByZXR1
cm4gdGhpcy5fZGVsZWdhdGUuZ2V0KGtpbmQsIG5hbWUpOworICAgICAgICBpZiAoa2luZCA9PSBW
YWx1ZSB8fCBraW5kID09IFR5cGUpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQua2luZCAhPSBr
aW5kKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGdldCBjdXJyZW50U3RhdGVtZW50KCkKKyAg
ICB7CisgICAgICAgIGlmICh0aGlzLl9jdXJyZW50U3RhdGVtZW50KQorICAgICAgICAgICAgcmV0
dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkK
KyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jdXJyZW50U3RhdGVtZW50OworICAg
ICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgaXNEZWZpbmVkKHRoaW5nKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmluZWQuaGFzKHRoaW5nKQorICAgICAgICAgICAg
fHwgKHRoaXMuX2RlbGVnYXRlICYmIHRoaXMuX2RlbGVnYXRlLmlzRGVmaW5lZCh0aGluZykpOwor
ICAgIH0KKyAgICAKKyAgICBkZWZpbmUodGhpbmcpCisgICAgeworICAgICAgICB0aGlzLl9kZWZp
bmVkLnNldCh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRlZmluZUFsbCgpCisgICAgeworICAg
ICAgICBmb3IgKGxldCB0aGluZyBvZiB0aGlzKQorICAgICAgICAgICAgZGVmaW5lKHRoaW5nKTsK
KyAgICB9CisgICAgCisgICAgZG9TdGF0ZW1lbnQoc3RhdGVtZW50LCBjYWxsYmFjaykKKyAgICB7
CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIGNh
bGxiYWNrKCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgICAg
ICBkZWZpbmUoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVjb2duaXplSW50cmluc2lj
cygpCisgICAgeworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbmV3IEludHJpbnNpY3MoKTsK
KyAgICB9CisgICAgCisgICAgZ2V0IGludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAgaWYgKHRo
aXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50cmluc2ljczsKKyAg
ICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVn
YXRlLmludHJpbnNpY3M7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBz
ZXQgcHJvZ3JhbSh2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSB2YWx1ZTsK
KyAgICB9CisgICAgCisgICAgZ2V0IHByb2dyYW0oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMu
X3Byb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbTsKKyAgICAgICAgaWYg
KHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnByb2dy
YW07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAqW1N5bWJvbC5pdGVy
YXRvcl0oKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgbWFwIG9mIHRoaXMuX21hcC52YWx1ZXMo
KSkgeworICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcy52YWx1ZXMoKSkK
KyAgICAgICAgICAgICAgICB5aWVsZCB0eXBlOworICAgICAgICB9CisgICAgfQorfQpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvTmFtZVJlc29sdmVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL05hbWVSZXNvbHZlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9OYW1lUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTcgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworLy8gVGhpcyBvbmx5IHJlc29sdmVzIG5hbWVzLiBBZnRlciB0aGlzIHBoYXNlIHJ1bnMsIGFs
bCBuYW1lcyB3aWxsIGJlIHJlc29sdmVkLiBUaGlzIG1lYW5zIHRoYXQgYWxsCisvLyBYWVpSZWYg
b2JqZWN0cyBub3cga25vdyB3aG8gdGhleSByZXNvbHZlIHRvLiBUaGlzIGRvZXMgbm90IHlldCBh
bGxvdyB0eXBlIGFuYWx5c2lzLCBiZWNhdXNlIHRoZXJlCisvLyBhcmUgc3RpbGwgVHlwZURlZnMu
IFRoaXMgdGhyb3dzIHR5cGUgZXJyb3JzIGZvciBmYWlsZWQgbmFtZSByZXNvbHV0aW9ucyBhbmQg
Zm9yIHRoaW5ncyB0aGF0IGFyZQorLy8gbW9yZSBjb252ZW5pZW50IHRvIGNoZWNrIGhlcmUgdGhh
biBpbiB0aGUgQ2hlY2tlci4gVGhpcyB1c3VhbGx5IGludm9sdmVzIHRoaW5ncyB0aGF0IG5lZWQg
dG8gYmUKKy8vIGNoZWNrZWQgYmVmb3JlIFR5cGVSZWZUb1R5cGVEZWZTa2lwcGVyLgorY2xhc3Mg
TmFtZVJlc29sdmVyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgLy8gSXQncyB0b3RhbGx5IE9LIHRv
IGluc3RhbnRpYXRlIHRoaXMgd2l0aCB6ZXJvIGFyZ3VtZW50cyAoaS5lLiBwYXNzaW5nIHVuZGVm
aW5lZCBmb3IgYm90aCBvZgorICAgIC8vIHRoZW0pIGlmIHlvdSdyZSBjcmVhdGluZyBhIENoZWNr
ZXIgdG8gdmlzaXQgYSBQcm9ncmFtLgorICAgIGNvbnN0cnVjdG9yKG5hbWVDb250ZXh0KQorICAg
IHsKKyAgICAgICAgdGhpcy5fbmFtZUNvbnRleHQgPSBuYW1lQ29udGV4dDsKKyAgICB9CisgICAg
CisgICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQg
PSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4
dC5wcm9ncmFtID0gbm9kZTsKKyAgICAgICAgbmFtZUNvbnRleHQucmVjb2duaXplSW50cmluc2lj
cygpOworICAgICAgICBub2RlLmludHJpbnNpY3MgPSBuYW1lQ29udGV4dC5pbnRyaW5zaWNzOwor
ICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisg
ICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgbGV0IGNoZWNr
ZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVu
dCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmRv
U3RhdGVtZW50KCgpID0+IHN0YXRlbWVudC52aXNpdChjaGVja2VyKSk7CisgICAgfQorICAgIAor
ICAgIF92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2RlKQorICAgIHsK
KyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250
ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0
ZXJzKSB7CisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAg
ICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiBuYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKHRoaXMuX3Zpc2l0VHlwZVBhcmFt
ZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBl
LnZpc2l0KGNoZWNrZXIpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJh
bWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEZ1bmNEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjb250ZXh0V2l0
aFR5cGVQYXJhbWV0ZXJzID0gdGhpcy5fdmlzaXRUeXBlUGFyYW1ldGVyc0FuZEJ1aWxkTmFtZUNv
bnRleHQobm9kZSk7CisgICAgICAgIGxldCBjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzID0gbmV3
IENoZWNrZXIoY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIG5vZGUucmV0dXJu
VHlwZS52aXNpdChjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgbGV0IGNvbnRl
eHRXaXRoUGFyYW1ldGVycyA9IG5ldyBOYW1lQ29udGV4dChjb250ZXh0V2l0aFR5cGVQYXJhbWV0
ZXJzKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykgewor
ICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMpOwor
ICAgICAgICAgICAgY29udGV4dFdpdGhQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOworICAgICAg
ICB9CisgICAgICAgIGxldCBjaGVja2VyV2l0aFBhcmFtZXRlcnMgPSBuZXcgQ2hlY2tlcihjb250
ZXh0V2l0aFBhcmFtZXRlcnMpOworICAgICAgICBub2RlLmJvZHkudmlzaXQoY2hlY2tlcldpdGhQ
YXJhbWV0ZXJzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAg
ICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFt
ZUNvbnRleHQpKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50
cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4
dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250
ZXh0LmFkZChub2RlLnR5cGVWYXJpYWJsZSk7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENo
ZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5z
aWduYXR1cmVzKQorICAgICAgICAgICAgc2lnbmF0dXJlLnZpc2l0KGNoZWNrZXIpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29u
dGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAo
bGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAg
dHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0
eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVj
a2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KGNoZWNrZXIpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBu
YW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAg
IGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAg
ICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0
LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9IG5l
dyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5m
aWVsZHMpCisgICAgICAgICAgICBmaWVsZC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisg
ICAgX3Jlc29sdmVUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBm
b3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAg
ICAgIGxldCB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOworICAgICAgICAgICAgaWYg
KHR5cGVBcmd1bWVudCBpbnN0YW5jZW9mIFR5cGVPclZhcmlhYmxlUmVmKSB7CisgICAgICAgICAg
ICAgICAgbGV0IHRoaW5nID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFR5cGVPclZhbHVlLCB0eXBl
QXJndW1lbnQubmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKCF0aGluZykKKyAgICAgICAgICAg
ICAgICAgICAgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkNvdWxk
IG5vdCBmaW5kIHR5cGUgb3IgdmFyaWFibGUgbmFtZWQgIiArIHR5cGVBcmd1bWVudC5uYW1lKTsK
KyAgICAgICAgICAgICAgICBpZiAodGhpbmcgaW5zdGFuY2VvZiBWYWx1ZSkgeworICAgICAgICAg
ICAgICAgICAgICB0eXBlQXJndW1lbnRbaV0gPSBuZXcgVmFyaWFibGVSZWYodHlwZUFyZ3VtZW50
Lm9yaWdpbiwgdHlwZUFyZ3VtZW50Lm5hbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAg
ICAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRbaV0gPSBuZXcgVHlwZVJlZih0eXBlQXJndW1l
bnQub3JpZ2luLCB0eXBlQXJndW1lbnQubmFtZSwgW10pOworICAgICAgICAgICAgfQorICAgICAg
ICAgICAgCisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50W2ldIGluc3RhbmNlb2YgVmFsdWUK
KyAgICAgICAgICAgICAgICAmJiAhdHlwZUFyZ3VtZW50W2ldLmlzQ29uc3RleHByKQorICAgICAg
ICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcs
ICJFeHBlY3RlZCBjb25zdGV4cHIiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNp
dFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Jlc29sdmVUeXBlQXJndW1lbnRz
KG5vZGUudHlwZUFyZ3VtZW50cyk7CisgICAgICAgIAorICAgICAgICBsZXQgdHlwZSA9IHRoaXMu
X25hbWVDb250ZXh0LmdldChUeXBlLCBub2RlLm5hbWUpOworICAgICAgICBpZiAoIXR5cGUpCisg
ICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5n
LCAiQ291bGQgbm90IGZpbmQgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgaWYg
KCF0aGlzLl9uYW1lQ29udGV4dC5pc0RlZmluZWQodHlwZSkpCisgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiSWxsZWdhbCBmb3J3YXJk
IHVzZSBvZiB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBub2RlLnR5cGUgPSB0
eXBlOworICAgICAgICAKKyAgICAgICAgaWYgKHR5cGUudHlwZVBhcmFtZXRlcnMubGVuZ3RoICE9
IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBl
RXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIldyb25nIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50
cyIpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGUudHlwZVBhcmFtZXRlcnMubGVu
Z3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJJc1R5cGUgPSB0eXBlLnR5cGVQ
YXJhbWV0ZXJzW2ldIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlOworICAgICAgICAgICAgbGV0IGFy
Z3VtZW50SXNUeXBlID0gbm9kZS50eXBlQXJndW1lbnRzW2ldIGluc3RhbmNlb2YgVHlwZTsKKyAg
ICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50c1tpXS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAg
IGlmIChwYXJhbWV0ZXJJc1R5cGUgJiYgIWFyZ3VtZW50SXNUeXBlKQorICAgICAgICAgICAgICAg
IHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiRXhwZWN0ZWQgdHlw
ZSwgYnV0IGdvdCB2YWx1ZSBhdCBhcmd1bWVudCAjIiArIGkpOworICAgICAgICAgICAgaWYgKCFw
YXJhbWV0ZXJJc1R5cGUgJiYgYXJndW1lbnRJc1R5cGUpCisgICAgICAgICAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJFeHBlY3RlZCB2YWx1ZSwgYnV0
IGdvdCB0eXBlIGF0IGFyZ3VtZW50ICMiICsgaSk7CisgICAgICAgIH0KKworICAgICAgICBzdXBl
ci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlw
ZShub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0
KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgbmFtZUNvbnRleHQuZGVmaW5lQWxsKCk7Cisg
ICAgICAgIG5vZGUuZWxlbWVudFR5cGUudmlzaXQobmV3IENoZWNrZXIobmFtZUNvbnRleHQpKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAg
bGV0IHJlc3VsdCA9IHRoaXMuX25hbWVDb250ZXh0LmdldChWYWx1ZSwgbm9kZS5uYW1lKTsKKyAg
ICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9k
ZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiQ291bGQgbm90IGZpbmQgdmFyaWFibGUgbmFtZWQgIiAr
IG5vZGUubmFtZSk7CisgICAgICAgIG5vZGUudmFyaWFibGUgPSByZXN1bHQ7CisgICAgfQorICAg
IAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICBub2RlLmZ1bmMgPSB0aGlz
Ll9uYW1lQ29udGV4dC5jdXJyZW50U3RhdGVtZW50OworICAgICAgICBzdXBlci52aXNpdFJldHVy
bihub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAg
IHsKKyAgICAgICAgdGhpcy5fcmVzb2x2ZVR5cGVBcmd1bWVudHMobm9kZS50eXBlQXJndW1lbnRz
KTsKKyAgICAgICAgc3VwZXIudmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKTsKKyAgICB9Cit9CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9OYXRpdmVUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTYgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgTmF0aXZlVHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdp
biwgbmFtZSwgaXNQcmltaXRpdmUsIHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhp
cy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAg
dGhpcy5faXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFt
ZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsg
cmV0dW5yIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFt
ZTsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuX2lzUHJpbWl0aXZlOyB9
CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7
IH0KKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgaW5zdGFu
dGlhdGUodHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxl
bmd0aCAhPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5l
dyBFcnJvcigiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3RhbnRpYXRpb24i
KTsKKyAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVy
biB0aGlzOworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5cGVJbnN0YW5jZSh0aGlzLCB0eXBl
QXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuICJuYXRpdmUgIiArICh0aGlzLmlzUHJpbWl0aXZlID8gInByaW1pdGl2ZSAiIDogIiIp
ICsgInR5cGUgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPiI7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2Uu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5cGVJ
bnN0YW5jZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHR5cGVBcmd1bWVu
dHMpCisgICAgeworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5fdHlw
ZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAorICAgIGdldCB0eXBlKCkg
eyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4g
dGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHRo
aXMuX3R5cGUuaXNQcmltaXRpdmU7IH0KKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0cnVl
OyB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAg
eworICAgICAgICBpZiAodGhpcy50eXBlICE9IG90aGVyLnR5cGUpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90aGVy
LnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewor
ICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiPCIgKyB0aGlz
LnR5cGVBcmd1bWVudHMgKyAiPiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9Ob2RlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5vZGUgeworICAgIHZpc2l0KHZpc2l0b3IpCisgICAg
eworICAgICAgICBsZXQgcmV0dXJuVmFsdWUgPSB2aXNpdG9yWyJ2aXNpdCIgKyB0aGlzLmNvbnN0
cnVjdG9yLm5hbWVdKHRoaXMpOworICAgICAgICBpZiAoInJldHVyblZhbHVlIiBpbiB2aXNpdG9y
KQorICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IucmV0dXJuVmFsdWU7CisgICAgICAgIHJldHVy
biByZXR1cm5WYWx1ZTsKKyAgICB9CisgICAgCisgICAgdW5pZnkodW5pZmljYXRpb25Db250ZXh0
LCBvdGhlcikKKyAgICB7CisgICAgICAgIGxldCB1bmlmeVRoaXMgPSB0aGlzLnVuaWZ5Tm9kZTsK
KyAgICAgICAgbGV0IHVuaWZ5T3RoZXIgPSBvdGhlci51bmlmeU5vZGU7CisgICAgICAgIGlmICh1
bmlmeU90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlUaGlz
KSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gdW5pZnlUaGlzLnVu
aWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIHVuaWZ5T3RoZXIpOworICAgIH0KKyAgICAKKyAg
ICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlm
IChvdGhlci50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHRoaXMpKQorICAg
ICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB0aGlzID09IG90aGVyOworICAg
IH0KKyAgICAKKyAgICB0eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVy
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAKKyAgICBnZXQgdW5p
ZnlOb2RlKCkgeyByZXR1cm4gdGhpczsgfQorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJu
IGZhbHNlOyB9CisgICAgCisgICAgZ2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAg
ICAKKyAgICBlcXVhbHMob3RoZXIpCisgICAgeworICAgICAgICBsZXQgdW5pZmljYXRpb25Db250
ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dCgpOworICAgICAgICByZXR1cm4gdGhpcy51bmlm
eSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKSAmJiB1bmlmaWNhdGlvbkNvbnRleHQuaXNVbnVu
aWZpZWQoKTsKKyAgICB9CisgICAgCisgICAgc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBhcmd1bWVu
dExpc3QpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy52aXNpdChTdWJzdGl0dXRpb24ubWFw
cGluZyhwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3QpKTsKKyAgICB9CisgICAgCisgICAgc3Vic3Rp
dHV0ZVRvVW5pZmljYXRpb24ocGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHN1YnN0aXR1dGUocGFyYW1ldGVycywgcGFyYW1ldGVycy5tYXAodHlw
ZSA9PiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0eXBlKSkpOworICAgIH0KK30KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1BhcnNlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHBhcnNlKHByb2dy
YW0sIG9yaWdpbiwgdGV4dCkKK3sKKyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIob3JpZ2luLCB0
ZXh0KTsKKyAgICAKKyAgICAvLyBUaGUgaGFyZGVzdCBwYXJ0IG9mIGRlYWxpbmcgd2l0aCBDLWxp
a2UgbGFuZ3VhZ2VzIGlzIHBhcnNpbmcgdmFyaWFibGUgZGVjbGFyYXRpb24gc3RhdGVtZW50cy4K
KyAgICAvLyBMZXQncyBjb25zaWRlciBpZiB0aGlzIGhhcHBlbnMgaW4gQXJyYXlMYW5nLiBIZXJl
IGFyZSB0aGUgdmFsaWQgc3RhdGVtZW50cyBpbiBBcnJheUxhbmcgdGhhdAorICAgIC8vIGJlZ2lu
IHdpdGggYW4gaWRlbnRpZmllciwgaWYgd2UgYXNzdW1lIHRoYXQgYW55IGV4cHJlc3Npb24gY2Fu
IGJlIGEgc3RhbmRhbG9uZSBzdGF0ZW1lbnQuCisgICAgLy8KKyAgICAvLyAgICAgeDsKKyAgICAv
LyAgICAgeCA8Ymlub3A+IHk7CisgICAgLy8gICAgIHggPCB5OworICAgIC8vICAgICB4IDwgeSA+
IHo7CisgICAgLy8gICAgIHggPSB5OworICAgIC8vICAgICB4LmYgPSB5OworICAgIC8vICAgICBc
ZXhwID0geTsKKyAgICAvLyAgICAgeFs0Ml0gPSB5OworICAgIC8vICAgICB4KCk7CisgICAgLy8g
ICAgIHg8eT4oKTsKKyAgICAvLyAgICAgeCB5OworICAgIC8vICAgICB4PHk+IHo7CisgICAgLy8g
ICAgIGRldmljZSB4W10geTsKKyAgICAvLyAgICAgeFs0Ml0geTsKKyAgICAvLyAgICAgZGV2aWNl
IHheIHk7CisgICAgLy8gICAgIHRocmVhZCB4Xl4geTsKKyAgICAvLyAgICAgeF50aHJlYWRedGhy
ZWFkIHk7CisgICAgLy8gICAgIHheZGV2aWNlXnRocmVhZCB5OworICAgIC8vCisgICAgLy8gVGhp
cyBoYXMgdHdvIHByb2JsZW0gYXJlYXM6CisgICAgLy8KKyAgICAvLyAgICAgLSB4PHk+eiBjYW4g
cGFyc2UgdHdvIGRpZmZlcmVudCB3YXlzIChhcyAoeCA8IHkpID4geiBvciB4PHk+IHopLgorICAg
IC8vICAgICAtIHhbNDJdIGNvdWxkIGJlY29tZSBlaXRoZXIgYW4gYXNzaWdubWVudCBvciBhIHZh
cmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vICAgICAtIHg8eT4gY291bGQgYmVjb21lIGVpdGhl
ciBhbiBhc3NpZ25tZW50IG9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgLy8KKyAgICAv
LyBXZSBzb2x2ZSB0aGUgZmlyc3QgcHJvYmxlbSBieSBmb3JiaWRkaW5nIGV4cHJlc3Npb25zIGFz
IHN0YXRlbWVudHMuIFRoZSBsYWNrIG9mIGZ1bmN0aW9uCisgICAgLy8gcG9pbnRlcnMgbWVhbnMg
dGhhdCB3ZSBjYW4gc3RpbGwgYWxsb3cgZnVuY3Rpb24gY2FsbCBzdGF0ZW1lbnRzIC0gdW5saWtl
IGluIEMsIHRob3NlIGNhbm5vdAorICAgIC8vIGhhdmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGFz
IHRoZSBjYWxsZWUuIFRoZSByZW1haW5pbmcgdHdvIHByb2JsZW1zIGFyZSBzb2x2ZWQgYnkKKyAg
ICAvLyBiYWNrdHJhY2tpbmcuIEluIGFsbCBvdGhlciByZXNwZWN0cywgdGhpcyBpcyBhIHNpbXBs
ZSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuCisgICAgCisgICAgZnVuY3Rpb24gZ2VuZXJpY0Nv
bnN1bWUoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgdG9rZW4gPSBsZXhlci5uZXh0KCk7
CisgICAgICAgIGlmICghdG9rZW4pCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4cGVjdGVk
IGVuZCBvZiBmaWxlIik7CisgICAgICAgIGlmIChjYWxsYmFjayh0b2tlbikpCisgICAgICAgICAg
ICBsZXhlci5mYWlsKCJVbmV4cGVjdGVkIHRva2VuOiAiICsgdG9rZW4udGV4dCArICI7IGV4cGVj
dGVkOiAiICsgdGV4dCk7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gY29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmlj
Q29uc3VtZSh0b2tlbiA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIGNvbnN1bWVLaW5kKGtpbmQpCisgICAgeworICAgICAgICByZXR1cm4g
Z2VuZXJpY0NvbnN1bWUodG9rZW4gPT4gdG9rZW4ua2luZCA9PSBraW5kKTsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gYXNzZXJ0TmV4dCguLi50ZXh0cykKKyAgICB7CisgICAgICAgIGxleGVy
LnB1c2goY29uc3VtZSguLi50ZXh0cykpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5l
cmljVGVzdChjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWso
KTsKKyAgICAgICAgaWYgKHRva2VuICYmIGNhbGxiYWNrKHRva2VuKSkKKyAgICAgICAgICAgIHJl
dHVybiB0b2tlbjsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHRlc3QoLi4udGV4dHMpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Rlc3QodG9r
ZW4gPT4gdGV4dHMuaW5jbHVkZXModG9rZW4udGV4dCkpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiB0ZXN0S2luZChraW5kKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNUZXN0KHRv
a2VuID0+IHRva2VuLmtpbmQgPT0ga2luZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRy
eUNvbnN1bWUoLi4udGV4dHMpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGVzdCguLi50
ZXh0cyk7CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICBsZXhlci5uZXh0KCk7Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRyeUNvbnN1
bWVLaW5kKGtpbmQpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGVzdEtpbmQoa2luZCk7
CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICBsZXhlci5uZXh0KCk7CisgICAgICAg
IHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUHJvdG9jb2xS
ZWYoKQorICAgIHsKKyAgICAgICAgbGV0IHByb3RvY29sVG9rZW4gPSBjb25zdW1lS2luZCgiaWRl
bnRpZmllciIpOworICAgICAgICByZXR1cm4gbmV3IFByb3RvY29sUmVmKHByb3RvY29sVG9rZW4u
b3JpZ2luLCBwcm90b2NvbFRva2VuLnRleHQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBj
b25zdW1lRW5kT2ZUeXBlQXJncygpCisgICAgeworICAgICAgICBsZXQgcmlnaHRTaGlmdCA9IHRy
eUNvbnN1bWUoIj4+Iik7CisgICAgICAgIGlmIChyaWdodFNoaWZ0KQorICAgICAgICAgICAgbGV4
ZXIucHVzaChuZXcgTGV4ZXJUb2tlbihsZXhlciwgcmlnaHRTaGlmdC5vcmlnaW4sIHJpZ2h0U2hp
ZnQuaW5kZXgsIHJpZ2h0U2hpZnQua2luZCwgIj4iKSk7CisgICAgICAgIGVsc2UKKyAgICAgICAg
ICAgIGNvbnN1bWUoIj4iKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VUeXBlUGFy
YW1ldGVycygpCisgICAgeworICAgICAgICBpZiAoIXRlc3QoIjwiKSkKKyAgICAgICAgICAgIHJl
dHVybiBbXTsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1bHQgPSBbXTsKKyAgICAgICAgY29u
c3VtZSgiPCIpOworICAgICAgICB3aGlsZSAoIXRlc3QoIj4iKSkgeworICAgICAgICAgICAgbGV0
IGNvbnN0ZXhwciA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKCgpID0+IHsKKyAgICAgICAgICAg
ICAgICBsZXQgdHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAgICAgICAgICAgIGxldCBuYW1lID0g
Y29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgICAgICAgICBhc3NlcnROZXh0KCIs
IiwgIj4iLCAiPj4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbnN0ZXhwclR5cGVQ
YXJhbWV0ZXIodHlwZS5vcmlnaW4sIG5hbWUsIHR5cGUpOworICAgICAgICAgICAgfSk7CisgICAg
ICAgICAgICBpZiAoY29uc3RleHByKQorICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnN0
ZXhwcik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGNv
bnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAgICAgICAgbGV0IHByb3RvY29sID0g
dHJ5Q29uc3VtZSgiOiIpID8gcGFyc2VQcm90b2NvbFJlZigpIDogbnVsbDsKKyAgICAgICAgICAg
ICAgICByZXN1bHQucHVzaChuZXcgVHlwZVZhcmlhYmxlKG5hbWUub3JpZ2luLCBuYW1lLnRleHQs
IHByb3RvY29sKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUo
IiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1l
RW5kT2ZUeXBlQXJncygpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiBwYXJzZVRlcm0oKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuOworICAgICAg
ICBpZiAodG9rZW4gPSB0cnlDb25zdW1lS2luZCgiaWRlbnRpZmllciIpKQorICAgICAgICAgICAg
cmV0dXJuIG5ldyBWYXJpYWJsZVJlZih0b2tlbi5vcmlnaW4sIHRva2VuLnRleHQpOworICAgICAg
ICBpZiAodG9rZW4gPSB0cnlDb25zdW1lS2luZCgiaW50TGl0ZXJhbCIpKSB7CisgICAgICAgICAg
ICBsZXQgaW50VmVyc2lvbiA9IHRva2VuLnRleHQgfCAwOworICAgICAgICAgICAgaWYgKGludFZl
cnNpb24gIT0gdG9rZW4udGV4dCkKKyAgICAgICAgICAgICAgICBsZXhlci5mYWlsKCJJbnRlZ2Vy
IGxpdGVyYWwgaXMgbm90IDMyLWJpdCBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gbmV3
IEludExpdGVyYWwodG9rZW4ub3JpZ2luLCBpbnRWZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAg
ICAvLyBGSVhNRTogTmVlZCBzdXBwb3J0IGZvciBmbG9hdCBsaXRlcmFscyBhbmQgcHJvYmFibHkg
b3RoZXIgbGl0ZXJhbHMgdG9vLgorICAgICAgICB0b2tlbiA9IGNvbnN1bWVLaW5kKCJkb3VibGVM
aXRlcmFsIik7CisgICAgICAgIHJldHVybiBuZXcgRG91YmxlTGl0ZXJhbCh0b2tlbi5vcmlnaW4s
ICt0b2tlbi50ZXh0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDb25zdGV4cHIo
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlVGVybSgpOworICAgIH0KKyAgICAKKyAgICBm
dW5jdGlvbiBwYXJzZVR5cGVBcmd1bWVudHMoKQorICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8
IikpCisgICAgICAgICAgICByZXR1cm4gW107CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0
ID0gW107CisgICAgICAgIGNvbnN1bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+Iikp
IHsKKyAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgZm9yIGEgY29uc3RleHByIG9yIHR5cGUg
Y2FuIHN5bnRhY3RpY2FsbHkgb3ZlcmxhcCBpbiB0aGUgc2luZ2xlCisgICAgICAgICAgICAvLyBp
ZGVudGlmaWVyIGNhc2UuIExldCdzIGNvbnNpZGVyIHRoZSBwb3NzaWJpbGl0aWVzOgorICAgICAg
ICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBUICAgICAgICAgIGNvdWxkIGJlIHR5cGUgb3Ig
Y29uc3RleHByCisgICAgICAgICAgICAvLyAgICAgVFtdICAgICAgICBvbmx5IHR5cGUKKyAgICAg
ICAgICAgIC8vICAgICBUWzQyXSAgICAgIG9ubHkgdHlwZSAoY29uc3RleHByIGNhbm5vdCBkbyBp
bmRleGluZykKKyAgICAgICAgICAgIC8vICAgICA0MiAgICAgICAgIG9ubHkgY29uc3RleHByCisg
ICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSB3ZSdsbCBhbGxvdyBj
b25zdGV4cHJzIHRvIGRvIG1vcmUgdGhpbmdzLCBhbmQgdGhlbiB3ZSdsbCBzdGlsbCBoYXZlCisg
ICAgICAgICAgICAvLyB0aGUgcHJvYmxlbSB0aGF0IHNvbWV0aGluZyBvZiB0aGUgZm9ybSBUWzFd
WzJdWzNdLi4uIGNhbiBlaXRoZXIgYmUgYSB0eXBlIG9yIGEKKyAgICAgICAgICAgIC8vIGNvbnN0
ZXhwciwgYW5kIHdlIGNhbiBmaWd1cmUgb3V0IGluIHRoZSBjaGVja2VyIHdoaWNoIGl0IGlzLgor
ICAgICAgICAgICAgbGV0IHR5cGVPclZhcmlhYmxlUmVmID0gbGV4ZXIuYmFja3RyYWNraW5nU2Nv
cGUoKCkgPT4geworICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBjb25zdW1lS2luZCgiaWRl
bnRpZmllciIpOworICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOwor
ICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZU9yVmFyaWFibGVSZWYocmVzdWx0Lm9yaWdp
biwgcmVzdWx0LnRleHQpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAodHlwZU9y
VmFyaWFibGVSZWYpCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZU9yVmFyaWFibGVS
ZWYpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IGNvbnN0ZXhwciA9
IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0
IHJlc3VsdCA9IHBhcnNlQ29uc3RleHByKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5l
eHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisgICAg
ICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICBl
bHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlVHlwZSgpKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlw
ZSgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47CisgICAgICAgIGxldCBhZGRyZXNzU3BhY2U7
CisgICAgICAgIGxldCBhZGRyZXNzU3BhY2VDb25zdW1lZCA9IGZhbHNlOworICAgICAgICBpZiAo
dG9rZW4gPSB0cnlDb25zdW1lKC4uLmFkZHJlc3NTcGFjZXMpKQorICAgICAgICAgICAgYWRkcmVz
c1NwYWNlID0gdG9rZW4udGV4dDsKKyAgICAgICAgCisgICAgICAgIGxldCBuYW1lID0gY29uc3Vt
ZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5
cGVBcmd1bWVudHMoKTsKKyAgICAgICAgbGV0IHR5cGUgPSBuZXcgVHlwZVJlZihuYW1lLm9yaWdp
biwgbmFtZS50ZXh0LCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGZ1bmN0aW9u
IGdldEFkZHJlc3NTcGFjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZHJlc3NTcGFjZUNv
bnN1bWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzU3BhY2UpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGFkZHJlc3NTcGFjZTsKKyAgICAgICAgICAgIHJldHVybiB0cnlDb25zdW1l
KC4uLmFkZHJlc3NTcGFjZXMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB3aGlsZSAo
dG9rZW4gPSB0cnlDb25zdW1lKCJeIiwgIlsiKSkgeworICAgICAgICAgICAgaWYgKHRva2VuLnRl
eHQgPT0gIl4iKSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IG5ldyBQdHJUeXBlKHRva2VuLm9y
aWdpbiwgZ2V0QWRkcmVzc1NwYWNlKCksIHR5cGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodHJ5Q29uc3Vt
ZSgiXSIpKSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVJlZlR5cGUodG9rZW4u
b3JpZ2luLCBnZXRBZGRyZXNzU3BhY2UoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHR5cGUgPSBuZXcg
QXJyYXlUeXBlKHRva2VuLm9yaWdpbiwgdHlwZSwgcGFyc2VDb25zdGV4cHIoKSk7CisgICAgICAg
ICAgICBjb25zdW1lKCJdIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhZGRy
ZXNzU3BhY2UgJiYgIWFkZHJlc3NTcGFjZUNvbnN1bWVkKQorICAgICAgICAgICAgbGV4ZXIuZmFp
bCgiQWRkcmVzcyBzcGFjZSBzcGVjaWZpZWQgZm9yIHR5cGUgdGhhdCBkb2VzIG5vdCBuZWVkIGFk
ZHJlc3Mgc3BhY2UiKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVEZWYoKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdp
biA9IGNvbnN1bWUoInR5cGUiKS5vcmlnaW47CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtp
bmQoImlkZW50aWZpZXIiKS50ZXh0OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJz
ZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgIGNvbnN1bWUoIj0iKTsKKyAgICAgICAgbGV0IHR5
cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgY29uc3VtZSgiOyIpOworICAgICAgICByZXR1cm4g
bmV3IFR5cGVEZWYob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIGdlbmVyaWNQYXJzZUxlZnQodGV4dHMsIG5leHRQYXJzZXIsIGNv
bnN0cnVjdG9yKQorICAgIHsKKyAgICAgICAgbGV0IGxlZnQgPSBuZXh0UGFyc2VyKCk7CisgICAg
ICAgIGxldCB0b2tlbjsKKyAgICAgICAgd2hpbGUgKHRva2VuID0gdHJ5Q29uc3VtZSguLi50ZXh0
cykpCisgICAgICAgICAgICBsZWZ0ID0gY29uc3RydWN0b3IodG9rZW4sIGxlZnQsIG5leHRQYXJz
ZXIoKSk7CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZUxlZnRPcGVyYXRvckNhbGwodGV4dHMsIG5leHRQYXJzZXIpCisgICAgeworICAgICAgICBy
ZXR1cm4gZ2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAgICAgIHRleHRzLCBuZXh0UGFyc2VyLAor
ICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkgPT4KKyAgICAgICAgICAgICAgICBuZXcg
Q2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3IiICsgdG9rZW4udGV4dCwgW10s
IFtsZWZ0LCByaWdodF0pKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDYWxsRXhw
cmVzc2lvbigpCisgICAgeworICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlm
aWVyIik7CisgICAgICAgIGxldCB0eXBlQXJndW1lbnRzID0gcGFyc2VUeXBlQXJndW1lbnRzKCk7
CisgICAgICAgIGNvbnN1bWUoIigiKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50TGlzdCA9IFtdOwor
ICAgICAgICB3aGlsZSAoIXRlc3QoIikiKSkgeworICAgICAgICAgICAgYXJndW1lbnRMaXN0LnB1
c2gocGFyc2VFeHByZXNzaW9uKCkpOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikp
CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgiKSIp
OworICAgICAgICByZXR1cm4gbmV3IENhbGxFeHByZXNzaW9uKG5hbWUub3JpZ2luLCBuYW1lLCB0
eXBlQXJndW1lbnRzLCBhcmd1bWVudExpc3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZVBvc3NpYmxlU3VmZml4KCkKKyAgICB7CisgICAgICAgIGxldCBzaW1wbGVDYXNlID0gbGV4
ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgbGV0IGxlZnQgPSBwYXJz
ZVRlcm0oKTsKKyAgICAgICAgICAgIGxldCB0b2tlbjsKKyAgICAgICAgICAgIHdoaWxlICh0b2tl
biA9IHRyeUNvbnN1bWUoIisrIiwgIi0tIiwgIi4iLCAiLT4iLCAiWyIpKSB7CisgICAgICAgICAg
ICAgICAgc3dpdGNoICh0b2tlbi50ZXh0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAiKysiOgor
ICAgICAgICAgICAgICAgIGNhc2UgIi0tIjoKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5l
dyBTdWZmaXhDYWxsQXNzaWdubWVudCh0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50
ZXh0LCBsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAg
Y2FzZSAiLiI6CisgICAgICAgICAgICAgICAgY2FzZSAiLT4iOgorICAgICAgICAgICAgICAgICAg
ICBpZiAodG9rZW4udGV4dCA9PSAiLT4iKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9
IG5ldyBEZXJlZmVyZW5jZUV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0KTsKKyAgICAgICAg
ICAgICAgICAgICAgbGVmdCA9IG5ldyBEb3RFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgbGVmdCwg
Y29uc3VtZUtpbmQoImlkZW50aWZpZXIiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgICAgIGNhc2UgIlsiOiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBpbmRl
eCA9IHBhcnNlRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCJdIik7
CisgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBuZXcgSW5kZXhFeHByZXNzaW9uKHRva2VuLm9y
aWdpbiwgbGVmdCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAg
dGhyb3cgbmV3IEVycm9yKCJCYWQgdG9rZW46ICIgKyB0b2tlbik7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CisgICAgICAgIH0pOwor
ICAgICAgICBpZiAoc2ltcGxlQ2FzZSkKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVDYXNlOwor
ICAgICAgICAKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2FsbEV4cHJlc3Npb24oKTsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVByZWZpeCgpCisgICAgeworICAgICAgICBs
ZXQgdG9rZW47CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIisrIiwgIi0tIiwgIisi
LCAiLSIsICIhIiwgIn4iKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQo
dG9rZW4ub3JpZ2luLCAib3BlcmF0b3IiICsgdG9rZW4udGV4dCwgcGFyc2VQb3NzaWJsZVByZWZp
eCgpKTsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiXiIpKQorICAgICAgICAgICAg
cmV0dXJuIG5ldyBEZXJlZmVyZW5jZUV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBwYXJzZVBvc3Np
YmxlUHJlZml4KCkpOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJcXCIpKQorICAg
ICAgICAgICAgcmV0dXJuIG5ldyBNYWtlUHRyRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNl
UG9zc2libGVQcmVmaXgoKSk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIiYiKSkK
KyAgICAgICAgICAgIHJldHVybiBuZXcgTWFrZUFycmF5UmVmRXhwcmVzc2lvbih0b2tlbi5vcmln
aW4sIHBhcnNlUG9zc2libGVQcmVmaXgoKSk7CisgICAgICAgIHJldHVybiBwYXJzZVBvc3NpYmxl
U3VmZml4KCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVQcm9kdWN0
KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyIqIiwgIi8i
LCAiJSJdLCBwYXJzZVBvc3NpYmxlUHJlZml4KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
cGFyc2VQb3NzaWJsZVN1bSgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0
b3JDYWxsKFsiKyIsICItIl0sIHBhcnNlUG9zc2libGVQcm9kdWN0KTsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVNoaWZ0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBw
YXJzZUxlZnRPcGVyYXRvckNhbGwoWyI8PCIsICI+PiJdLCBwYXJzZVBvc3NpYmxlU3VtKTsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxJbmVxdWFsaXR5
KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyI8IiwgIj4i
LCAiPD0iLCAiPT4iXSwgcGFyc2VQb3NzaWJsZVNoaWZ0KTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxFcXVhbGl0eSgpCisgICAgeworICAgICAgICBy
ZXR1cm4gZ2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAgICAgIFsiPT0iLCAiIT0iXSwgcGFyc2VQ
b3NzaWJsZVJlbGF0aW9uYWxJbmVxdWFsaXR5LAorICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCBy
aWdodCkgPT4geworICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Np
b24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3I9PSIsIFtdLCBbbGVmdCwgcmlnaHRdKTsKKyAgICAg
ICAgICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiIT0iKQorICAgICAgICAgICAgICAgICAgICBy
ZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3IhIiwgW10s
IFtyZXN1bHRdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAg
fSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlQW5kKCkK
KyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyImIl0sIHBhcnNl
UG9zc2libGVSZWxhdGlvbmFsRXF1YWxpdHkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZVBvc3NpYmxlQml0d2lzZVhvcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0
T3BlcmF0b3JDYWxsKFsiXiJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZUFuZCk7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlT3IoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbInwiXSwgcGFyc2VQb3NzaWJsZUJpdHdpc2VY
b3IpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lv
bih0ZXh0cywgbmV4dFBhcnNlcikKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljUGFyc2VM
ZWZ0KAorICAgICAgICAgICAgdGV4dHMsIG5leHRQYXJzZXIsCisgICAgICAgICAgICAodG9rZW4s
IGxlZnQsIHJpZ2h0KSA9PiBuZXcgTG9naWNhbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCB0b2tl
bi50ZXh0LCBsZWZ0LCByaWdodCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBv
c3NpYmxlTG9naWNhbEFuZCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0TG9naWNh
bEV4cHJlc3Npb24oWyImJiJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZU9yKTsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUxvZ2ljYWxPcigpCisgICAgeworICAgICAgICBy
ZXR1cm4gcGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24oWyJ8fCJdLCBwYXJzZVBvc3NpYmxlTG9n
aWNhbEFuZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVUZXJuYXJ5
Q29uZGl0aW9uYWwoKQorICAgIHsKKyAgICAgICAgbGV0IHByZWRpY2F0ZSA9IHBhcnNlUG9zc2li
bGVMb2dpY2FsT3IoKTsKKyAgICAgICAgbGV0IG9wZXJhdG9yID0gdHJ5Q29uc3VtZSgiPyIpOwor
ICAgICAgICBpZiAoIW9wZXJhdG9yKQorICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZTsKKyAg
ICAgICAgcmV0dXJuIG5ldyBUZXJuYXJ5RXhwcmVzc2lvbihvcGVyYXRvci5vcmlnaW4sIHByZWRp
Y2F0ZSwgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSwgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQo
KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KG1v
ZGUpCisgICAgeworICAgICAgICBsZXQgbGhzID0gcGFyc2VQb3NzaWJsZVRlcm5hcnlDb25kaXRp
b25hbCgpOworICAgICAgICBsZXQgb3BlcmF0b3IgPSB0cnlDb25zdW1lKCI9IiwgIis9IiwgIi09
IiwgIio9IiwgIi89IiwgIiU9IiwgIl49IiwgInw9IiwgIiY9Iik7CisgICAgICAgIGlmICghb3Bl
cmF0b3IpIHsKKyAgICAgICAgICAgIGlmIChtb2RlID09ICJyZXF1aXJlZCIpCisgICAgICAgICAg
ICAgICAgbGV4ZXIuZmFpbCgiRXhwZWN0ZWQgYXNzaWdubWVudCIpOworICAgICAgICAgICAgcmV0
dXJuIGxoczsKKyAgICAgICAgfQorICAgICAgICBpZiAob3BlcmF0b3IudGV4dCA9PSAiPSIpCisg
ICAgICAgICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQob3BlcmF0b3Iub3JpZ2luLCBsaHMsIHBh
cnNlUG9zc2libGVBc3NpZ25tZW50KCkpOworICAgICAgICBsZXQgbmFtZSA9ICJvcGVyYXRvciIg
KyBvcGVyYXRvci50ZXh0LnN1YnN0cmluZygwLCB0ZXJtLm9wZXJhdG9yLmxlbmd0aCAtIDEpOwor
ICAgICAgICByZXR1cm4gbmV3IENhbGxBc3NpZ25tZW50KG9wZXJhdG9yLm9yaWdpbiwgbmFtZSwg
bGhzLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gcGFyc2VBc3NpZ25tZW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZVBvc3NpYmxl
QXNzaWdubWVudCgicmVxdWlyZWQiKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VF
ZmZlY3RmdWxFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIGxldCBhc3NpZ25tZW50ID0gbGV4
ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFyc2VBc3NpZ25tZW50KCk7IH0p
OworICAgICAgICBpZiAoYXNzaWdubWVudCkKKyAgICAgICAgICAgIHJldHVybiBhc3NpZ25tZW50
OworICAgICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVzc2lvbigpOworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiBnZW5lcmljUGFyc2VDb21tYUV4cHJlc3Npb24oZmluYWxFeHByZXNzaW9uUGFy
c2VyKQorICAgIHsKKyAgICAgICAgbGV0IGxpc3QgPSBbXTsKKyAgICAgICAgbGV0IG9yaWdpbiA9
IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKCFvcmlnaW4pCisgICAgICAgICAgICBsZXhlci5m
YWlsKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisgICAgICAgIG9yaWdpbiA9IG9yaWdpbi5v
cmlnaW47CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGxldCBlZmZlY3RmdWxFeHBy
ZXNzaW9uID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFyc2VFZmZl
Y3RmdWxFeHByZXNzaW9uKCk7IH0pOworICAgICAgICAgICAgaWYgKCFlZmZlY3RmdWxFeHByZXNz
aW9uKSB7CisgICAgICAgICAgICAgICAgbGlzdC5wdXNoKGZpbmFsRXhwcmVzc2lvblBhcnNlcigp
KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxp
c3QucHVzaChlZmZlY3RmdWxFeHByZXNzaW9uKTsKKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3Vt
ZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVy
biBuZXcgQ29tbWFFeHByZXNzaW9uKG9yaWdpbiwgbGlzdCk7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIHBhcnNlQ29tbWFFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5l
cmljUGFyc2VDb21tYUV4cHJlc3Npb24ocGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHBhcnNlQ29tbWFFeHByZXNzaW9uKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlQXNzaWdubWVudFN0YXRlbWVudCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gZ2Vu
ZXJpY1BhcnNlQ29tbWFFeHByZXNzaW9uKHBhcnNlRWZmZWN0ZnVsRXhwcmVzc2lvbik7CisgICAg
ICAgIGNvbnN1bWUoIjsiKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VSZXR1cm4oKQorICAgIHsKKyAgICAgICAgY29uc3VtZSgicmV0dXJu
Iik7CisgICAgICAgIHJldHVybiBwYXJzZUV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnQoKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4
ZXIucGVlaygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiOyIpIHsKKyAgICAgICAgICAg
IGxleGVyLm5leHQoKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAg
ICAgIGlmICh0b2tlbi50ZXh0ID09ICJyZXR1cm4iKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNl
UmV0dXJuKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJicmVhayIpCisgICAgICAgICAg
ICByZXR1cm4gcGFyc2VCcmVhaygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiY29udGlu
dWUiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29udGludWUoKTsKKyAgICAgICAgaWYgKHRv
a2VuLnRleHQgPT0gIndoaWxlIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVdoaWxlKCk7Cisg
ICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJkbyIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VE
bygpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiZm9yIikKKyAgICAgICAgICAgIHJldHVy
biBwYXJzZUZvcigpOworICAgICAgICBsZXQgY29tbWFFeHByZXNzaW9uID0gbGV4ZXIuYmFja3Ry
YWNraW5nU2NvcGUoKCkgPT4geyByZXR1cm4gcGFyc2VBc3NpZ25tZW50U3RhdGVtZW50KCk7IH0p
OworICAgICAgICBpZiAoY29tbWFFeHByZXNzaW9uKQorICAgICAgICAgICAgcmV0dXJuIGNvbW1h
RXhwcmVzc2lvbjsKKyAgICAgICAgcmV0dXJuIHBhcnNlVmFyaWFibGVEZWNsKCk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQmxvY2soKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdp
biA9IGNvbnN1bWUoInsiKS5vcmlnaW47CisgICAgICAgIGxldCBibG9jayA9IG5ldyBCbG9jayhv
cmlnaW4pOworICAgICAgICB3aGlsZSAoIXRlc3QoIn0iKSkgeworICAgICAgICAgICAgbGV0IHN0
YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50KQor
ICAgICAgICAgICAgICAgIGJsb2NrLnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgICAg
ICBjb25zdW1lKCJ9Iik7CisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VGdW5jRGVmKCkKKyAgICB7CisgICAgICAgIGxldCByZXR1cm5UeXBlID0g
cGFyc2VUeXBlKCk7CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIi
KS50ZXh0OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJz
KCk7CisgICAgICAgIGNvbnN1bWUoIigiKTsKKyAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSBbXTsK
KyAgICAgICAgd2hpbGUgKCF0ZXN0KCIpIikpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHVz
aChwYXJzZVBhcmFtZXRlcigpKTsKKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQor
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWUoIikiKTsK
KyAgICAgICAgbGV0IGJsb2NrID0gcGFyc2VCbG9jaygpOworICAgICAgICByZXR1cm4gRnVuY0Rl
ZihyZXR1cm5UeXBlLm9yaWdpbiwgbmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBh
cmFtZXRlcnMsIGJvZHkpOworICAgIH0KKyAgICAKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxl
dCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIjsiKQorICAgICAgICAgICAgbGV4
ZXIubmV4dCgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJ0eXBlIikKKyAgICAg
ICAgICAgIHBhcnNlVHlwZURlZigpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJu
YXRpdmUiKQorICAgICAgICAgICAgcGFyc2VOYXRpdmVUeXBlKCk7CisgICAgICAgIGVsc2UgaWYg
KHRva2VuLnRleHQgPT0gInN0cnVjdCIpCisgICAgICAgICAgICBwYXJzZVN0cnVjdFR5cGUoKTsK
KyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAiZW51bSIpCisgICAgICAgICAgICBwYXJz
ZUVudW0oKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAicHJvdG9jb2wiKQorICAg
ICAgICAgICAgcGFyc2VQcm90b2NvbERlY2woKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAg
cGFyc2VGdW5jRGVmKCk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9QcmVw
YXJlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ByZXBhcmUuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJlcGFyZS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHByZXBhcmUob3JpZ2luLCB0ZXh0KQorewor
ICAgIGxldCBwcm9ncmFtID0gbmV3IFByb2dyYW0oKTsKKyAgICBwYXJzZShwcm9ncmFtLCBvcmln
aW4sIHRleHQpOworICAgIHJlc29sdmVOYW1lcyhwcm9ncmFtKTsKKyAgICByZXNvbHZlVHlwZURl
ZnMocHJvZ3JhbSk7CisgICAgY2hlY2socHJvZ3JhbSk7CisgICAgaW5saW5lKHByb2dyYW0pOwor
ICAgIHJldHVybiBwcm9ncmFtOworfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFt
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb2dyYW0gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25z
dHJ1Y3RvcigpCisgICAgeworICAgICAgICB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHMgPSBbXTsK
KyAgICAgICAgdGhpcy5fZnVuY3Rpb25zID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl90eXBl
cyA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fZnVuY0luc3RhbnRpYXRvciA9IG5ldyBGdW5j
SW5zdGFudGlhdG9yKCk7CisgICAgfQorICAgIAorICAgIGdldCB0b3BMZXZlbFN0YXRlbWVudHMo
KSB7IHJldHVybiB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHM7IH0KKyAgICBnZXQgZnVuY3Rpb25z
KCkgeyByZXR1cm4gdGhpcy5fZnVuY3Rpb25zOyB9CisgICAgZ2V0IHR5cGVzKCkgeyByZXR1cm4g
dGhpcy5fdHlwZXM7IH0KKyAgICBnZXQgZnVuY0luc3RhbnRpYXRvcigpIHsgcmV0dXJuIHRoaXMu
X2Z1bmNJbnN0YW50aWF0b3I7IH0KKyAgICAKKyAgICBhZGRUb3BMZXZlbFN0YXRlbWVudChzdGF0
ZW1lbnQpCisgICAgeworICAgICAgICBzdGF0ZW1lbnQucHJvZ3JhbSA9IHRoaXM7CisgICAgICAg
IGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBGdW5jKSB7CisgICAgICAgICAgICBsZXQgYXJyYXkg
PSB0aGlzLl9mdW5jdGlvbnMuZ2V0KHN0YXRlbWVudC5uYW1lKTsKKyAgICAgICAgICAgIGlmICgh
YXJyYXkpCisgICAgICAgICAgICAgICAgdGhpcy5fZnVuY3Rpb25zLnNldChzdGF0ZW1lbnQubmFt
ZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHN0YXRlbWVudCk7CisgICAg
ICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgVHlwZSkKKyAgICAgICAgICAgIHRo
aXMuX3R5cGVzLnNldChzdGF0ZW1lbnQubmFtZSwgc3RhdGVtZW50KTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdGF0ZW1lbnQgaXMgbm90IGEgZnVuY3Rpb24g
b3IgdHlwZTogIiArIHN0YXRlbWVudCk7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50
cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHJlc29sdmVGdW5jT3ZlcmxvYWQo
bmFtZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcykKKyAgICB7CisgICAgICAgIGxldCBm
dW5jdGlvbnMgPSB0aGlzLmZ1bmN0aW9ucy5nZXQobmFtZSk7CisgICAgICAgIGlmICghZnVuY3Rp
b25zKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICByZXR1cm4g
cmVzb2x2ZU92ZXJsb2FkSW1wbChmdW5jdGlvbnMsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlw
ZXMpOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZUNvbnRleHQoKQorICAgIHsKKyAgICAgICAg
bGV0IHJlc3VsdCA9IG5ldyBOYW1lQ29udGV4dCgpOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1l
bnQgb2YgdGhpcy50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICByZXN1bHQuYWRkKHN0
YXRlbWVudCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9Qcm90b2NvbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9Qcm90b2NvbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2Nv
bC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb3RvY29s
IGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsK
KyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQor
ICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBraW5kKCkgeyBy
ZXR1cm4gUHJvdG9jb2w7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3Rv
Y29sRGVjbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb3RvY29sRGVjbCBl
eHRlbmRzIFByb3RvY29sIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgewor
ICAgICAgICBzdXBlcihvcmlnaW4sIG5hbWUpCisgICAgICAgIHRoaXMuX3NpZ25hdHVyZXMgPSBb
XTsKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlTWFwID0gbmV3IE1hcCgpOworICAgICAgICB0aGlz
Ll90eXBlVmFyaWFibGUgPSBuZXcgVHlwZVZhcmlhYmxlKG9yaWdpbiwgbmFtZSwgbnVsbCk7Cisg
ICAgfQorICAgIAorICAgIGFkZFNpZ25hdHVyZShzaWduYXR1cmUpCisgICAgeworICAgICAgICAv
LyBOT1RFOiBBbnkgdHlwZSBwYXJhbWV0ZXJzIGZvdW5kIGluIHRoZSBzaWduYXR1cmUgbXVzdCBi
ZSBpbmZlcmFibGUgZnJvbSB0aGUgdmFsdWUKKyAgICAgICAgLy8gcGFyYW1ldGVycy4KKyAgICAg
ICAgLy8gRklYTUU6IENoZWNrIHRoaXMhIChPT1BTISkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJl
cy5wdXNoKHNpZ25hdHVyZSk7CisgICAgICAgIGxldCBvdmVybG9hZHMgPSB0aGlzLl9zaWduYXR1
cmVNYXAuZ2V0KHNpZ25hdHVyZS5uYW1lKTsKKyAgICAgICAgaWYgKCFvdmVybG9hZHMpCisgICAg
ICAgICAgICB0aGlzLl9zaWduYXR1cmVNYXAuc2V0KHNpZ25hdHVyZS5uYW1lLCBvdmVybG9hZHMg
PSBbXSk7CisgICAgICAgIG92ZXJsb2Fkcy5wdXNoKHNpZ25hdHVyZSk7CisgICAgfQorICAgIAor
ICAgIGdldCBzaWduYXR1cmVzKCkgeyByZXR1cm4gdGhpcy5fc2lnbmF0dXJlczsgfQorICAgIHNp
Z25hdHVyZXNCeU5hbWUobmFtZSkgeyByZXR1cm4gdGhpcy5fc2lnbmF0dXJlTWFwLmdldChuYW1l
KTsgfQorICAgIGdldCB0eXBlVmFyaWFibGUoKSB7IHJldHVybiB0aGlzLl90eXBlVmFyaWFibGU7
IH0KKyAgICAKKyAgICBzaWduYXR1cmVzQnlOYW1lV2l0aFR5cGVWYXJpYWJsZShuYW1lLCB0eXBl
VmFyaWFibGUpCisgICAgeworICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gbmV3IFN1YnN0aXR1
dGlvbihbdGhpcy50eXBlVmFyaWFibGVdLCBbdHlwZVZhcmlhYmxlXSk7CisgICAgICAgIGxldCBy
ZXN1bHQgPSB0aGlzLnNpZ25hdHVyZXNCeU5hbWUobmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0
KQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQubWFwKHNp
Z25hdHVyZSA9PiBzaWduYXR1cmUudmlzaXQoc3Vic3RpdHV0aW9uKSk7CisgICAgfQorICAgIAor
ICAgIGluaGVyaXRzKG90aGVyUHJvdG9jb2wpCisgICAgeworICAgICAgICBpZiAoIW90aGVyUHJv
dG9jb2wpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlmIChv
dGhlclByb3RvY29sIGluc3RhbmNlb2YgUHJvdG9jb2xSZWYpCisgICAgICAgICAgICBvdGhlclBy
b3RvY29sID0gb3RoZXJQcm90b2NvbC5wcm90b2NvbERlY2w7CisgICAgICAgIAorICAgICAgICBm
b3IgKGxldCBvdGhlclNpZ25hdHVyZSBvZiBvdGhlclByb3RvY29sLnNpZ25hdHVyZXMpIHsKKyAg
ICAgICAgICAgIGxldCBzaWduYXR1cmVzID0gdGhpcy5zaWduYXR1cmVzQnlOYW1lKG90aGVyU2ln
bmF0dXJlLm5hbWUpOworICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVzKQorICAgICAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGxldCBvdmVybG9hZCA9IHJlc29sdmVPdmVy
bG9hZEltcGwoc2lnbmF0dXJlcywgW10sIG90aGVyU2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKTsK
KyAgICAgICAgICAgIGlmICghb3ZlcmxvYWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNl
OworICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGVkUmV0dXJuVHlwZSA9CisgICAgICAgICAgICAg
ICAgb3ZlcmxvYWQuZnVuYy5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAorICAg
ICAgICAgICAgICAgICAgICBzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMsIG92ZXJsb2FkLnVuaWZp
Y2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGVkUmV0dXJuVHlwZS5l
cXVhbHMob3RoZXJTaWduYXR1cmUucmV0dXJuVHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAg
ICBoYXNIZWlyKHR5cGUpCisgICAgeworICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gU3Vic3Rp
dHV0aW9uLm1hcHBpbmcoW3RoaXMuX3R5cGVWYXJpYWJsZV0sIFt0eXBlXSk7CisgICAgICAgIGZv
ciAobGV0IGFic3RyYWN0U2lnbmF0dXJlIG9mIHRoaXMuX3NpZ25hdHVyZXMpIHsKKyAgICAgICAg
ICAgIGxldCBzaWduYXR1cmUgPSBzaWduYXR1cmUudmlzaXQoc3Vic3RpdHV0aW9uKTsKKyAgICAg
ICAgICAgIGxldCBvdmVybG9hZCA9IHRoaXMucHJvZ3JhbS5yZXNvbHZlRnVuY092ZXJsb2FkKHNp
Z25hdHVyZS5uYW1lLCBbXSwgc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAgICAg
IGlmICghb3ZlcmxvYWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAg
ICAgCisgICAgICAgICAgICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0gb3ZlcmxvYWQuZnVu
Yy5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAorICAgICAgICAgICAgICAgIG92
ZXJsb2FkLmZ1bmMudHlwZVBhcmFtZXRlcnMsIG92ZXJsb2FkLnVuaWZpY2F0aW9uQ29udGV4dCk7
CisgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGVkUmV0dXJuVHlwZS5lcXVhbHMoc2lnbmF0dXJl
LnJldHVyblR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuICJwcm90b2NvbCAiICsgdGhpcy5uYW1lICsgIiB7ICIgKyB0aGlzLnNp
Z25hdHVyZXMuam9pbigiOyAiKSArICI7IH0iOworICAgIH0KK30KKworCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9Qcm90b2NvbFJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9Qcm90b2NvbFJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90
b2NvbFJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFBy
b3RvY29sUmVmIGV4dGVuZHMgUHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFt
ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbmFtZSk7CisgICAgICAgIHRoaXMucHJv
dG9jb2xEZWNsID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgaW5oZXJpdHMob3RoZXIpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbERlY2wuaW5oZXJpdHMob3RoZXIpOworICAg
IH0KKyAgICAKKyAgICBoYXNIZWlyKHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5w
cm90b2NvbERlY2wuaGFzSGVpcih0eXBlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9QdHJUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFB0clR5cGUgZXh0ZW5kcyBSZWZl
cmVuY2VUeXBlIHsKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAg
ICB7CisgICAgICAgIGlmICghb3RoZXIgaW5zdGFuY2VvZiBQdHJUeXBlKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9CisKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzU3BhY2UgKyAiICIgKyB0aGlz
LmVsZW1lbnRUeXBlICsgIl4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
UmVmZXJlbmNlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVu
Y2VUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5
cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZWZlcmVu
Y2VUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBhZGRyZXNzU3Bh
Y2UsIGVsZW1lbnRUeXBlKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRk
cmVzc1NwYWNlKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlz
Ll9hZGRyZXNzU3BhY2UgPSBhZGRyZXNzU3BhY2U7CisgICAgICAgIHRoaXMuX2VsZW1lbnRUeXBl
ID0gZWxlbWVudFR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgYWRkcmVzc1NwYWNlKCkgeyByZXR1cm4gdGhpcy5fYWRk
cmVzc1NwYWNlOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5fZWxlbWVu
dFR5cGU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlTmFtZXMuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU5hbWVzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL1Jlc29sdmVOYW1lcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2Z1bmN0aW9uIHJlc29sdmVOYW1lcyhwcm9ncmFtKQoreworICAgIHByb2dyYW0udmlz
aXQobmV3IE5hbWVSZXNvbHZlcigpKTsKK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29s
dmVPdmVybG9hZEltcGwuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2
ZU92ZXJsb2FkSW1wbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXNv
bHZlT3ZlcmxvYWRJbXBsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
ZnVuY3Rpb24gcmVzb2x2ZU92ZXJsb2FkSW1wbChmdW5jdGlvbnMsIHR5cGVBcmd1bWVudHMsIGFy
Z3VtZW50VHlwZXMpCit7CisgICAgZm9yIChsZXQgZnVuYyBvZiBmdW5jdGlvbnMpIHsKKyAgICAg
ICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICYmIHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IGZ1
bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IGlmIChhcmd1bWVudFR5cGVzLmxlbmd0aCAhPSBmdW5jLnBhcmFtZXRlcnMubGVuZ3RoKQorICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcg
VW5pZmljYXRpb25Db250ZXh0KGZ1bmMudHlwZVBhcmFtZXRlcnMpOworICAgICAgICBsZXQgb2sg
PSB0cnVlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3Ro
OyArK2kpIHsKKyAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07Cisg
ICAgICAgICAgICBsZXQgcGFyYW1ldGVyID0gZnVuYy50eXBlUGFyYW1ldGVyc1tpXTsKKyAgICAg
ICAgICAgIGlmICghYXJndW1lbnQudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBwYXJhbWV0ZXIp
KSB7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBlcy5sZW5n
dGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCFhcmd1bWVudFR5cGVzW2ldLnVuaWZ5KHVuaWZp
Y2F0aW9uQ29udGV4dCwgZnVuYy5wYXJhbWV0ZXJzW2ldLnR5cGUpKSB7CisgICAgICAgICAgICAg
ICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQorICAgICAgICAgICAgY29udGludWU7
CisgICAgICAgIGxldCBzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMgPSAhdHlwZUFyZ3VtZW50cy5s
ZW5ndGg7CisgICAgICAgIGlmIChzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMpCisgICAgICAgICAg
ICB0eXBlQXJndW1lbnRzID0gW107CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Yg
ZnVuYy50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgbGV0IHR5cGVBcmd1bWVudCA9IHVu
aWZpY2F0aW9uQ29udGV4dC5maW5kKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICAgICAgaWYgKHR5
cGVBcmd1bWVudCA9PSB0eXBlUGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
IChzaG91bGRCdWlsZFR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50
cy5wdXNoKHR5cGVBcmd1bWVudCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvaykKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICByZXR1cm4ge2Z1bmMsIHVuaWZpY2F0aW9uQ29udGV4
dCwgdHlwZUFyZ3VtZW50c307CisgICAgfQorICAgIAorICAgIHJldHVybiBudWxsOworfQpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZVR5cGVEZWZzLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVUeXBlRGVmcy5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9SZXNvbHZlVHlwZURlZnMuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitmdW5jdGlvbiByZXNvbHZlVHlwZURlZnMocHJvZ3JhbSkKK3sKKyAgICBw
cm9ncmFtLnZpc2l0KG5ldyBUeXBlRGVmUmVzb2x2ZXIoKSk7Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1JldHVybi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXR1
cm4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV0dXJuIGV4dGVuZHMgTm9k
ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCB2
YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuICJ7ICIgKyB0aGlzLnN0YXRlbWVudHMuam9pbigiOyAiKTsgKyAi
OyB9IjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBSZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IoKQorICAg
IHsKKyAgICAgICAgdGhpcy5fbWFwcGluZyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAg
X21hcChvbGRJdGVtLCBuZXdJdGVtKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwcGluZy5zZXQo
b2xkSXRlbSwgbmV3SXRlbSk7CisgICAgICAgIHJldHVybiBuZXdJdGVtOworICAgIH0KKyAgICAK
KyAgICBfZ2V0TWFwcGluZyhvbGRJdGVtKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRo
aXMuX21hcHBpbmcuZ2V0KG9sZEl0ZW0pOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIG9sZEl0ZW07CisgICAgfQorICAgIAor
ICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jKAorICAg
ICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyksCisgICAgICAg
ICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFybWV0ZXIgPT4gdHlwZVBhcmFtZXRl
ci52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRl
ciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5j
UGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEZ1bmNQYXJh
bWV0ZXIobm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgICAgICB0aGlzLl9t
YXAobm9kZSwgcmVzdWx0KTsKKyAgICAgICAgcmVzdWx0LmxWYWx1ZSA9IG5vZGUubFZhbHVlOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUp
CisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEJsb2NrKG5vZGUub3JpZ2luKTsKKyAg
ICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAg
IHJlc3VsdC5hZGQoc3RhdGVtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAg
IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUeXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5h
bWUsIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52
aXNpdCh0aGlzKSkpOworICAgICAgICByZXN1bHQudHlwZSA9IG5vZGUudHlwZTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0
ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29uc3Rl
eHByVHlwZVBhcmFtZXRlcihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQo
dGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAg
ICByZXR1cm4gbmV3IEZpZWxkKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNp
dCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG5ldyBub2RlLmNvbnN0cnVjdG9yKG5vZGUucm9naWluLCBub2Rl
LmFkZHJlc3NTcGFjZSwgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAg
IAorICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlz
aXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlw
ZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5v
ZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5ldyBBcnJheVR5cGUobm9kZS5vcmlnaW4sIG5vZGUuZWxlbWVudFR5cGUudmlz
aXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudChub2RlLm9yaWdpbiwgbm9kZS5saHMudmlz
aXQodGhpcyksIG5vZGUucmhzLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRW
YXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHRoaXMuX2dl
dE1hcHBpbmcobm9kZS52YXJpYWJsZSk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1
cm4obm9kZS5vcmlnaW4sIG5vZGUudmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVs
bCk7CisgICAgfQorICAgIAorICAgIHZpc2l0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQor
ICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBDYWxsRXhwcmVzc2lvbigKKyAgICAgICAg
ICAgIG5vZGUub3JpZ2luLCBub2RlLm5hbWUsCisgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVu
dHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpLAorICAgICAg
ICAgICAgbm9kZS5hcmd1bWVudGxpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRo
aXMpKSk7CisgICAgICAgIGxldCBhY3R1YWxUeXBlQXJndW1lbnRzID0gbm9kZS5hY3R1YWxUeXBl
QXJndW1lbnRzOworICAgICAgICBpZiAoYWN0dWFsVHlwZUFyZ3VtZW50cykgeworICAgICAgICAg
ICAgcmVzdWx0LmFjdHVhbFR5cGVBcmd1bWVudHMgPQorICAgICAgICAgICAgICAgIGFjdHVhbFR5
cGVBcmd1bWVudHMubWFwKGFjdHVhbFR5cGVBcmd1bWVudCA9PiBhY3R1YWxUeXBlQXJndW1lbnQu
dmlzaXQodGhpcykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIHZpc2l0RnVuY3Rpb25MaWtlQmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiBuZXcgRnVuY3Rpb25MaWtlQmxvY2soCisgICAgICAgICAgICBub2RlLm9yaWdpbiwKKyAg
ICAgICAgICAgIG5vZGUuYXJndW1lbnRMaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNp
dCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBw
YXJhbWV0ZXIudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMp
KTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgU3RydWN0VHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNv
bnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0
aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAg
ICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9m
aWVsZHMgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIGFkZChmaWVsZCkKKyAgICB7Cisg
ICAgICAgIGlmICh0aGlzLl9maWVsZHMuaGFzKGZpZWxkLm5hbWUpKQorICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKGZpZWxkLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJEdXBsaWNhdGUg
ZmllbGQgbmFtZTogIiArIGZpZWxkLm5hbWUpOworICAgICAgICB0aGlzLl9maWVsZHMuc2V0KGZp
ZWxkLm5hbWUsIGZpZWxkKTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0
aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlw
ZVBhcmFtZXRlcnM7IH0KKyAgICAKKyAgICBnZXQgZmllbGROYW1lcygpIHsgcmV0dXJuIHRoaXMu
X2ZpZWxkcy5rZXlzKCk7IH0KKyAgICBmaWVsZEJ5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9m
aWVsZHMuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IGZpZWxkcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxk
cy52YWx1ZXMoKTsgfQorICAgIGdldCBmaWVsZE1hcCgpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkczsg
fQorICAgIGdldCBpc1ByaW1pdGl2ZSgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1
ZTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5maWVsZHMpCisgICAgICAgICAgICBy
ZXN1bHQgJj0gZmllbGQudHlwZS5pc1ByaW1pdGl2ZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGxldCBy
ZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRl
ciBvZiB0aGlzLnR5cGVQYXJhbWV0ZXJzKQorICAgIH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0
eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9
IHRoaXMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlw
ZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVu
dHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0
ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIAorICAgICAgICBsZXQgc3Vic3RpdHV0aW9u
ID0gU3Vic3RpdHV0aW9uLm1hcHBpbmcodGhpcy50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50
cyk7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgU3RydWN0VHlwZSh0aGlzLm9yaWdpbiwgdGhp
cy5uYW1lLCBbXSk7CisgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKQorICAg
ICAgICAgICAgcmVzdWx0LmFkZChmaWVsZC52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuICJzdHJ1Y3QgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRl
cnMgKyAiPiB7ICIgKyBBcnJheS5mcm9tKHRoaXMuZmllbGRzKS5qb2luKCI7ICIpICsgIjsgfSI7
CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdWJzdGl0dXRpb24gZXh0ZW5kcyBSZXdyaXRlciB7
CisgICAgY29uc3RydWN0b3IobWFwKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbWFwOwor
ICAgIH0KKyAgICAKKyAgICBzdGF0aWMgbWFwcGluZyhwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3Qp
CisgICAgeworICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRMaXN0Lmxl
bmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBhbmQgYXJndW1l
bnRzIGFyZSBtaXNtYXRjaGVkIik7CisgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7CisgICAg
ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAg
ICAgIG1hcC5zZXQocGFyYW1ldGVyc1tpXSwgYXJndW1lbnRMaXN0W2ldKTsKKyAgICAgICAgcmV0
dXJuIG5ldyBTdWJzdGl0dXRpb24obWFwKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVm
KG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0KG5v
ZGUudHlwZSk7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCkgeworICAgICAgICAgICAgaWYgKG5v
ZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCJVbmV4cGVjdGVkIHR5cGUgYXJndW1lbnRzIG9uIHR5cGUgdmFyaWFibGUiKTsKKyAgICAgICAg
ICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0
dXJuIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICB9CisKKyAgICB2aXNpdFZhcmlhYmxl
UmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0
KG5vZGUudmFyaWFibGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpCisgICAgICAgICAgICBy
ZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAgICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRW
YXJpYWJsZVJlZihub2RlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1
ZmZpeENhbGxBc3NpZ25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N1
ZmZpeENhbGxBc3NpZ25tZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L1N1ZmZpeENhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgU3VmZml4Q2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9y
aWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9saHMgPSBs
aHM7CisgICAgICAgIHRoaXMuZnVuYyA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1l
KCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlzLl9s
aHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5s
aHMgKyAiIHN1ZmZpeCAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlIGV4dGVuZHMgTm9kZSB7CisgICAg
Z2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gW107IH0KKyAgICBnZXQga2luZCgpIHsgcmV0
dXJuIFR5cGU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAg
IHJldHVybiBwcm90b2NvbC5oYXNIZWlyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5z
dGFudGlhdGVkVHlwZSgpIHsgcmV0dXJuIHRoaXM7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvVHlwZURlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVm
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlRGVmIGV4dGVuZHMgVHlw
ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSkK
KyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7
CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2lu
KCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlz
Ll9uYW1lOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBh
cmFtZXRlcnM7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZlJlc29sdmVyLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWZSZXNvbHZlci5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9UeXBlRGVmUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlRGVmUmVzb2x2ZXIgZXh0ZW5kcyBWaXNpdG9yIHsK
KyAgICBjb25zdHJ1Y3RvcigpCisgICAgeworICAgICAgICB0aGlzLl92aXNpdGluZyA9IG5ldyBW
aXNpdGluZ1NldCgpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX3Zpc2l0aW5nLmRvVmlzaXQobm9kZSwgKCkgPT4geworICAgICAgICAg
ICAgc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUudHlwZSBp
bnN0YW5jZW9mIFR5cGVEZWYpIHsKKyAgICAgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250
ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dChub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMpOwor
ICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlw
ZS50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBF
cnJvcigiYXJndW1lbnQvcGFyYW1ldGVyIG1pc21hdGNoIChzaG91bGQgaGF2ZSBiZWVuIGNhdWdo
dCBlYXJsaWVyKSIpOworICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS50
eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGVB
cmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBub2RlLnR5cGUudHlwZVBhcmFt
ZXRlcnNbaV0pOworICAgICAgICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlm
eSgpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmln
aW4ub3JpZ2luU3RyaW5nLCAiVHlwZSByZWZlcmVuY2UgdG8gYSB0eXBlIGRlZmluaXRpb24gdmlv
bGF0ZXMgcHJvdG9jb2wgY29uc3RyYWludHMiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBsZXQgbmV3VHlwZSA9IG5vZGUudHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihu
b2RlLnR5cGUudHlwZVBhcmFtZXRlcnMsIHVuaWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAg
ICAgICAgbmV3VHlwZS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICBub2RlLnNldFR5cGVB
bmRBcmd1ZW1udHMobmV3VHlwZSwgW10pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAg
ICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVPclZhcmlhYmxlUmVmIGV4
dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9UeXBlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVS
ZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWYgZXh0ZW5kcyBU
eXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMpCisgICAg
eworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBu
YW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgICAgICB0aGlzLl90eXBlQXJndW1l
bnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHdyYXAodHlwZSkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlwZVJlZih0eXBlLm9yaWdpbiwgdHlw
ZS5uYW1lLCBbXSk7CisgICAgICAgIHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBl
QXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1By
aW1pdGl2ZSgpIHsgcmV0dXJuIHR5cGUgPyB0eXBlLmlzUHJpbWl0aXZlIDogZmFsc2U7IH0KKyAg
ICAKKyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy50eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBnZXQg
dW5pZnlOb2RlKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0
aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUudW5pZnlOb2RlOworICAgICAgICByZXR1
cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgc2V0VHlwZUFuZEFyZ3VtZW50cyh0eXBlLCB0eXBl
QXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9IHR5cGUubmFtZTsKKyAgICAg
ICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVB
cmd1bWVudHM7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUeXBlUmVmKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnko
dW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxz
ZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFy
Z3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAo
bGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAg
ICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyLnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsK
KyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJp
bmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZUFy
Z3VtZW50cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVW
YXJpYWJsZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVZhcmlhYmxlIGV4
dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBwcm90b2NvbCkKKyAg
ICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9
IG5hbWU7CisgICAgICAgIHRoaXMuX3Byb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorICAgIAor
ICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBwcm90b2NvbCgp
IHsgcmV0dXJuIHRoaXMuX3Byb3RvY29sOyB9CisgICAgCisgICAgZ2V0IGlzUHJpbWl0aXZlKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9wcm90b2NvbCAmJiB0aGlzLl9wcm90b2NvbC5p
c1ByaW1pdGl2ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4g
dHJ1ZTsgfQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgaWYg
KCFwcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIXRoaXMu
cHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlz
LnByb3RvY29sLmluaGVyaXRzKHByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdHlwZVZhcmlh
YmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICgh
KG90aGVyIGluc3RhbmNlb2YgVHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAg
ICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiByZWFsVGhpcy51bmlm
eSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICAgICAgCisgICAgICAgIHVuaWZpY2F0
aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4
dCwgb3RoZXIpOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc0FyZ3VtZW50KHVuaWZpY2F0aW9u
Q29udGV4dCkKKyAgICB7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4
dC5maW5kKHRoaXMpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHRoaW5nIHdlIGdldCB1bmlm
aWVkIHdpdGggbXVzdCBiZSBhIHR5cGUgdmFyaWFibGUgdGhhdCBhY2NlcHRzIGEgYnJvYWRlciBz
ZXQgb2YKKyAgICAgICAgLy8gdGhpbmdzIHRoYW4gd2UgZG8uCisgICAgICAgIGlmICghKHJlYWxU
aGlzIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwor
ICAgICAgICAKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJu
ICFyZWFsVGhpcy5wcm90b2NvbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnByb3Rv
Y29sLmluaGVyaXRzKHJlYWxUaGlzLnByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5
QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlz
LnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB1bmlm
aWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKS5pbmhlcml0cyh0aGlzLnByb3RvY29sKTsKKyAgICB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0Lmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFVuaWZpY2F0aW9u
Q29udGV4dCB7CisgICAgY29uc3RydWN0b3IodHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAg
ICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IG5ldyBTZXQodHlwZVBhcmFtZXRlcnMpOworICAgICAg
ICB0aGlzLl9uZXh0TWFwID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICB1bmlvbihhLCBi
KQorICAgIHsKKyAgICAgICAgYSA9IGZpbmQoYSk7CisgICAgICAgIGIgPSBmaW5kKGIpOworICAg
ICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAg
aWYgKCFiLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgW2EsIGJdID0gW2IsIGFdOworICAgICAg
ICBpZiAoIWEuaXNVbmlmaWFibGUpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5v
dCB1bmlmeSBub24tdW5pZmlhYmxlIHRoaW5ncyAiICsgYSArICIgYW5kICIgKyBiKTsKKyAgICAg
ICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHR5cGUgcGFyYW1ldGVycyBkb24ndCBlbmQg
dXAgYmVpbmcgcm9vdHMuCisgICAgICAgIGlmIChhLmlzVW5pZmlhYmxlICYmIGIuaXNVbmlmaWFi
bGUgJiYgdGhpcy5fdHlwZVBhcmFtZXRlcnMuaGFzKGIpKQorICAgICAgICAgICAgW2EsIGJdID0g
W2IsIGFdOworCisgICAgICAgIHRoaXMuX25leHRNYXAuc2V0KGEsIGIpOworICAgIH0KKyAgICAK
KyAgICBmaW5kKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBub2RlOwor
ICAgICAgICBsZXQgbmV4dE5vZGUgPSB0aGlzLl9uZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7Cisg
ICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7Cisg
ICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGN1cnJlbnROb2RlID0gbmV4dE5vZGU7Cisg
ICAgICAgICAgICBuZXh0Tm9kZSA9IHRoaXMuX25leHRNYXAuZ2V0KGN1cnJlbnROb2RlKTsKKyAg
ICAgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQobm9kZSwgY3VycmVudE5vZGUpOworICAgICAg
ICByZXR1cm4gY3VycmVudE5vZGU7CisgICAgfQorICAgIAorICAgIGdldCBub2RlcygpCisgICAg
eworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFNldCgpOworICAgICAgICBmb3IgKGxldCBba2V5
LCB2YWx1ZV0gb2YgdGhpcy5fbmV4dE1hcCkgeworICAgICAgICAgICAgcmVzdWx0LmFkZChrZXkp
OworICAgICAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5KCkKKyAgICB7CisgICAgICAgIGZv
ciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhpcy5fdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAg
ICAgIGlmICghdHlwZVBhcmFtZXRlci52ZXJpZnlBc1BhcmFtZXRlcih0aGlzKSkKKyAgICAgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChsZXQgdHlwZUFy
Z3VtZW50IG9mIHRoaXMubm9kZXMpIHsKKyAgICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50Lmlz
VW5pZmlhYmxlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHRo
aXMuX3R5cGVQYXJhbWV0ZXJzLmhhcyh0eXBlQXJndW1lbnQpKQorICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnQudmVyaWZ5QXNBcmd1bWVudCh0
aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlzVW51bmlmaWVkKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiAhdGhpcy5fbmV4dE1hcC5zaXplKCk7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9WYWx1ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9W
YWx1ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhbHVlIGV4dGVuZHMgTm9k
ZSB7CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBWYWx1ZTsgfQorICAgIGdldCBpc0NvbnN0ZXhw
cigpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Zhcmlh
YmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFyaWFibGVSZWYgZXh0ZW5k
cyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAg
ICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAg
dGhpcy52YXJpYWJsZSA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1
cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRoaXMudmFy
aWFibGUuaXNDb25zdGV4cHI7IH0KKyAgICBnZXQgdW5pZnlOb2RlKCkgeyByZXR1cm4gdGhpcy52
YXJpYWJsZS51bmlmeU5vZGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Zp
c2l0aW5nU2V0LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0LmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmlzaXRpbmdTZXQgewor
ICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3NldCA9IG5ldyBTZXQoKTsK
KyAgICB9CisgICAgCisgICAgYWRkKGl0ZW0pCisgICAgeworICAgICAgICB0aGlzLl9zZXQuYWRk
KGl0ZW0pOworICAgIH0KKyAgICAKKyAgICBkb1Zpc2l0KGl0ZW0sIGNhbGxiYWNrKQorICAgIHsK
KyAgICAgICAgaWYgKHRoaXMuX3NldC5oYXMoaXRlbSkpCisgICAgICAgICAgICB0aHJvdyBuZXcg
QUxUeXBlRXJyb3IoaXRlbS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiUmVjdXJzaXZlICIgKyBpdGVt
LmtpbmQpOworICAgICAgICB0aGlzLl9zZXQuYWRkKGl0ZW0pOworICAgICAgICB0cnkgeworICAg
ICAgICAgICAgY2FsbGJhY2soKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRo
aXMuX3NldC5kZWxldGUoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9WaXNpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zp
c2l0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWaXNpdG9yIHsKKyAg
ICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBv
ZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0
aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jKG5vZGUpCisgICAgeworICAgICAgICBu
b2RlLnJldHVyblR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0
ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlz
aXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMp
CisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZp
c2l0RnVuY1BhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNEZWYobm9kZSkKKyAgICB7CisgICAgICAg
IHZpc2l0RnVuYyhub2RlKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzdGF0
ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sUmVmKG5vZGUpCisgICAgeworICAg
IH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9y
IChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVy
ZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAg
eworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQor
ICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbXRl
ciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNp
dCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5vZGUpCisgICAgeworICAg
ICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAg
ICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBub2RlLnR5cGUudmlz
aXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0U3RydWN0VHlwZShub2RlKQorICAgIHsK
KyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQor
ICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQg
ZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52aXNpdCh0aGlzKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAgICB7CisgICAgfQorICAg
IAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAg
bm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUp
CisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAg
IHZpc2l0RWxlbWVudGFsVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlw
ZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJUeXBlKG5vZGUpCisgICAg
eworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVt
ZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQor
ICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgICAgIG5v
ZGUubnVtRWxlbWVudHMudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdu
bWVudChub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5saHMudmlzaXQodGhpcyk7CisgICAgICAg
IG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVm
KG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsK
KyAgICAgICAgaWYgKG5vZGUudmFsdWUpCisgICAgICAgICAgICBub2RlLnZhbHVlLnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXN0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICB9
CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgZm9y
IChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5
cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgYXJndW1lbnQgb2Ygbm9k
ZS5hcmd1bWVudExpc3QpCisgICAgICAgICAgICBhcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRGdW5jdGlvbkxpa2VCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAg
Zm9yIChsZXQgYXJndW1lbnQgb2Ygbm9kZS5hcmd1bWVudExpc3QpCisgICAgICAgICAgICBhcmd1
bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFy
YW1ldGVycykKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9k
ZS5ib2R5LnZpc2l0KHRoaXMpOworICAgIH0KK30KKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319229</attachid>
            <date>2017-08-28 19:16:22 -0700</date>
            <delta_ts>2017-08-28 21:49:30 -0700</delta_ts>
            <desc>more</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>197051</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgYWRkcmVz
c1NwYWNlcyA9IFsiY29uc3RhbnQiLCAiZGV2aWNlIiwgInRocmVhZGdyb3VwIiwgInRocmVhZCJd
OworCitmdW5jdGlvbiBpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7CisgICAgc3dpdGNo
IChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2FzZSAiZGV2aWNl
IjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
K30KKworZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAg
IGlmICghaXNBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKSkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYWRkcmVzcyBzcGFjZTogIiArIGFkZHJlc3NTcGFjZSk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFzIFRbY10gZm9y
IGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1YWdlLgorY2xh
c3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0
YW5jZW9mIEFycmF5UmVmVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBpZiAodGhpcy5hZGRyZXNzU3BhY2UgIT0gInRocmVhZCIpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIg
IiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fy
cmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1F
bGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVu
dHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vs
ZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxl
bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAg
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsK
KyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQXJyYXlSZWZUeXBlKSB7CisgICAgICAgICAg
ICBpZiAob3RoZXIuYWRkcmVzc1NwYWNlICE9ICJ0aHJlYWQiKQorICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGlu
c3RhbmNlb2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmICghdGhpcy5udW1FbGVtZW50cy51bmlmeSh1bmlmaWNh
dGlvbkNvbnRleHQsIG90aGVyLm51bUVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRU
eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9Bc3NpZ25tZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBsaHMsIHJocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7Cisg
ICAgICAgIHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgIH0K
KyAgICAKKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJocygp
IHsgcmV0dXJuIHRoaXMuX3JoczsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmxocyArICIgPSAiICsgdGhpcy5yaHM7CisgICAgfQorfTsKKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2suanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQmxvY2suanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2su
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBCbG9jayBleHRl
bmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fc3RhdGVtZW50cyA9IFtdOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgCisg
ICAgYWRkKHN0YXRlbWVudCkKKyAgICB7CisgICAgICAgIHRoaXMuX3N0YXRlbWVudHMucHVzaChz
dGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGVtZW50cygpIHsgcmV0dXJuIHRo
aXMuX3N0YXRlbWVudHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0K
K307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNz
aW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgICAgICB0aGlz
LmZ1bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJo
cygpIHsgcmV0dXJuIHRoaXMuX3JoczsgfSAvLyBUaGlzIGNhbiBiZSBudWxsLgorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxocyArICIgIiArIHRoaXMu
bmFtZSArICh0aGlzLnJocyA/ICI9ICIgKyB0aGlzLnJocyA6ICIiKTsKKyAgICB9Cit9CisKSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQ2FsbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkK
KyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICAgICAg
dGhpcy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAgICAgICB0aGlzLmZ1bmMgPSBu
dWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0K
KyAgICBnZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8
IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCArICIpIjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxGdW5jdGlvbi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DYWxsRnVuY3Rpb24uanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEZ1bmN0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gY2FsbEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUs
IHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkKK3sKKyAgICBmb3IgKGxldCBsVmFsdWUgb2Yg
cHJvZ3JhbS5sVmFsdWVzKQorICAgICAgICBsVmFsdWUucmVzZXQoKTsKKyAgICBsZXQgYXJndW1l
bnRUeXBlcyA9IGFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudHlwZSk7Cisg
ICAgbGV0IGZ1bmMgPSByZXNvbHZlSW5saW5lZEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUsIHR5cGVB
cmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgIGlmICghZnVuYykKKyAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKCI8Y2FsbEZ1bmN0aW9uPiIsICJDYW5ub3QgcmVzb2x2ZSBmdW5jdGlv
biBjYWxsICIgKyBuYW1lICsgIjwiICsgdHlwZUFyZ3VtZW50cyArICI+KCIgKyBhcmd1bWVudExp
c3QgKyAiKSIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnVuYy5wYXJhbWV0ZXJzLmxlbmd0
aDsgKytpKQorICAgICAgICBmdW5jLnBhcmFtZXRlcnNbaV0ubFZhbHVlLnZhbHVlID0gYXJndW1l
bnRMaXN0W2ldOworICAgIHJldHVybiBuZXcgRXZhbHVhdG9yKCkudmlzaXRGdW5jdGlvbkJvZHko
ZnVuYy5ib2R5KTsKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2suanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2suanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvQ2hlY2suanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitmdW5jdGlvbiBjaGVjayhwcm9ncmFtKQoreworICAgIHByb2dyYW0udmlzaXQobmV3IENo
ZWNrZXIocHJvZ3JhbSkpOworfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9DaGVja2VyLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBDaGVja2VyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgY29u
c3RydWN0b3IocHJvZ3JhbSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBwcm9ncmFt
OworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQg
b2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpIHsKKyAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRT
dGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7
CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAg
ICB7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBub2RlLnNpZ25hdHVyZXMpIHsKKyAg
ICAgICAgICAgIGxldCBzZXQgPSBuZXcgU2V0KCk7CisgICAgICAgICAgICBmdW5jdGlvbiBjb25z
aWRlcih0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpbmcuaXNV
bmlmaWFibGUpCisgICAgICAgICAgICAgICAgICAgIHNldC5hZGQodGhpbmcpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgY2xhc3MgTm90aWNlVHlwZVZhcmlhYmxlIGV4dGVuZHMgVmlzaXRv
ciB7CisgICAgICAgICAgICAgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgICAgICBjb25zaWRlcihub2RlLnR5cGUpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zaWRlcihub2RlLnZhcmlhYmxlKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXQgbm90aWNlVHlw
ZVZhcmlhYmxlID0gbmV3IE5vdGljZVR5cGVWYXJpYWJsZSgpOworICAgICAgICAgICAgZm9yIChs
ZXQgcGFyYW1ldGVyVHlwZSBvZiBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpCisgICAgICAgICAg
ICAgICAgcGFyYW1ldGVyVHlwZS52aXNpdChub3RpY2VUeXBlVmFyaWFibGUpOworICAgICAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMpIHsK
KyAgICAgICAgICAgICAgICBpZiAoIXNldC5oYXModHlwZVBhcmFtZXRlcikpCisgICAgICAgICAg
ICAgICAgICAgIHRocm93IEFMVHlwZUVycm9yKHR5cGVQYXJhbWV0ZXIub3JpZ2luLm9yaWdpblN0
cmluZywgIlR5cGUgcGFyYW1ldGVyIHRvIHByb3RvY29sIHNpZ25hdHVyZSBub3QgaW5mZXJyYWJs
ZSBmcm9tIHZhbHVlIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
ICghc2V0Lmhhcyhub2RlLnR5cGVWYXJpYWJsZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IEFMVHlwZUVycm9yKHNpZ25hdHVyZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiUHJvdG9jb2wncyB0
eXBlIHZhcmlhYmxlIG5vdCBtZW50aW9uZWQgaW4gc2lnbmF0dXJlIik7CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgX2NoZWNrVHlwZUFyZ3VtZW50cyhvcmlnaW4sIHR5cGVQYXJhbWV0ZXJz
LCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBl
UGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IGFyZ3VtZW50SXNUeXBl
ID0gdHlwZUFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIFR5cGU7CisgICAgICAgICAgICBsZXQgcmVz
dWx0ID0gbm9kZS50eXBlQXJndW1lbnRzW2ldLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgaWYg
KGFyZ3VtZW50SXNUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzW2ld
LmluaGVyaXRzKHR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIlR5cGUgYXJndW1lbnQgZG9lcyBu
b3QgaW5oZXJpdCBwcm90b2NvbCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBpZiAoIXJlc3VsdC5lcXVhbHModHlwZVBhcmFtZXRlcnNbaV0udHlwZSkpCisgICAgICAg
ICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAi
V3JvbmcgdHlwZSBmb3IgY29uc3RleHByIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9j
aGVja1R5cGVBcmd1bWVudHMobm9kZS5vcmlnaW4sIHR5cGUudHlwZVBhcmFtZXRlcnMsIG5vZGUu
dHlwZUFyZ3VtZW50cyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2Rl
KQorICAgIHsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICAgICAg
CisgICAgICAgIGlmIChub2RlLmFkZHJlc3NTcGFjZSA9PSAidGhyZWFkIikKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGNsYXNzIEluc3RhbnRpYXRlSW1tZWRpYXRlcyBl
eHRlbmRzIFJld3JpdGVyIHsKKyAgICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIG5vZGUgPSBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuaW5zdGFudGlhdGVkVHlwZS52aXNpdCh0aGlz
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmlzaXRSZWZlcmVu
Y2VUeXBlKG5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghbm9kZS5l
bGVtZW50VHlwZS52aXNpdChuZXcgSW5zdGFudGlhdGVJbW1lZGlhdGVzKCkpLmlzUHJpbWl0aXZl
KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0
cmluZywgIklsbGVnYWwgcG9pbnRlciB0byBub24tcHJpbWl0aXZlIHR5cGUiKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGlmICghbm9kZS5u
dW1FbGVtZW50cy5pc0NvbnN0ZXhwcikKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJv
cihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJBcnJheSBsZW5ndGggbXVzdCBiZSBjb25zdGV4
cHIiKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAg
ICAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBsaHMgaXMgYXNzaWduYWJs
ZS4KKyAgICAgICAgbGV0IGxoc1R5cGUgPSBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAg
bGV0IHJoc1R5cGUgPSBub2RlLnJocy52aXNpdCh0aGlzKTsKKyAgICAgICAgaWYgKCFsaHNUeXBl
LmVxdWFscyhyaHNUeXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2Rl
Lm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUeXBlIG1pc21hdGNoIGluIGFzc2lnbm1lbnQ6ICIgKyBs
aHNUeXBlICsgIiB2ZXJzdXMgIiArIHJoc1R5cGUpOworICAgICAgICByZXR1cm4gbGhzVHlwZTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdC50eXBlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQor
ICAgIHsKKyAgICAgICAgaWYgKG5vZGUudmFsdWUpIHsKKyAgICAgICAgICAgIGxldCByZXN1bHRU
eXBlID0gbm9kZS52YWx1ZS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIGlmICghdGhpcy5mdW5j
LnJldHVyblZhbHVlLmVxdWFscyhyZXN1bHRUeXBlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHJ5aW5nIHRvIHJldHVy
biAiICsgcmVzdWx0VHlwZSArICIgaW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgIiArIGZ1bmMu
cmV0dXJuVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICBpZiAoIWZ1bmMucmV0dXJuVmFsdWUuZXF1YWxzKHRoaXMuX3Byb2dyYW0uaW50cmlu
c2ljcy52b2lkKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdp
bi5vcmlnaW5TdHJpbmcsICJOb24tdm9pZCBmdW5jdGlvbiBtdXN0IHJldHVybiBhIHZhbHVlIik7
CisgICAgfQorICAgIAorICAgIHZpc2l0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMuX3Byb2dyYW0uaW50cmluc2ljcy5pbnQzMjsKKyAgICB9CisgICAgCisgICAg
dmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFy
Z3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52
aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50VHlwZXMgPSBub2RlLmFyZ3VtZW50TGlz
dC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykpOworICAgICAgICAKKyAgICAg
ICAgbGV0IG92ZXJsb2FkID0gbnVsbDsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBv
ZiB0aGlzLl9jdXJyZW50U3RhdGVtZW50LnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBp
ZiAoISh0eXBlUGFyYW1ldGVyIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghdHlwZVBhcmFtZXRlci5wcm90b2NvbCkK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGxldCBzaWduYXR1cmVzID0K
KyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnByb3RvY29sLnNpZ25hdHVyZXNCeU5hbWVX
aXRoVHlwZVZhcmlhYmxlKG5vZGUubmFtZSwgdHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICBp
ZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBv
dmVybG9hZCA9IHJlc29sdmVPdmVybG9hZEltcGwoc2lnbmF0dXJlcywgbm9kZS50eXBlQXJndW1l
bnRzLCBhcmd1bWVudFR5cGVzKTsKKyAgICAgICAgICAgIGlmIChvdmVybG9hZCkKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW92ZXJsb2FkKSB7CisgICAg
ICAgICAgICBvdmVybG9hZCA9IHRoaXMuX25hbWVDb250ZXh0LnByb2dyYW0ucmVzb2x2ZUZ1bmNP
dmVybG9hZCgKKyAgICAgICAgICAgICAgICBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3VtZW50cywg
YXJndW1lbnRUeXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvdmVybG9hZCkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJE
aWQgbm90IGZpbmQgZnVuY3Rpb24gZm9yIGNhbGwiKTsKKyAgICAgICAgbm9kZS5mdW5jID0gb3Zl
cmxvYWQuZnVuYzsKKyAgICAgICAgbm9kZS5hY3R1YWxUeXBlQXJndW1lbnRzID0gb3ZlcmxvYWQu
dHlwZUFyZ3VtZW50cy5tYXAoVHlwZVJlZi53cmFwKTsKKyAgICAgICAgcmV0dXJuIG92ZXJsb2Fk
LmZ1bmMucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigKKyAgICAgICAgICAgIG92
ZXJsb2FkLmZ1bmMudHlwZVBhcmFtZXRlcnMsIG92ZXJsb2FkLnVuaWZpY2F0aW9uQ29udGV4dCk7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Db21tYUV4cHJlc3Npb24uanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NvbW1hRXhwcmVzc2lvbi5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENvbW1hRXhwcmVzc2lvbiBleHRl
bmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbGlzdCkKKyAgICB7Cisg
ICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX2xpc3QgPSBsaXN0OworICAgIH0K
KyAgICAKKyAgICBnZXQgbGlzdCgpIHsgcmV0dXJuIHRoaXMuX2xpc3Q7IH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIigiICsgdGhpcy5saXN0LnRvU3RyaW5n
KCkgKyAiKSI7CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHBy
VHlwZVBhcmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4
cHJUeXBlUGFyYW1ldGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Nv
bnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVmFsdWUgeworICAgIGNv
bnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdp
biA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5
cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25h
bWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICBnZXQgaXND
b25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1
cm4gdHJ1ZTsgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4
dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFZhbHVlKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIXRoaXMudHlwZS51bmlm
eSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRo
aXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiBy
ZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICAgICAgCisgICAg
ICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFZhcmlhYmxlUmVmKQorICAgICAgICAgICAgb3RoZXIg
PSBvdGhlci52YXJpYWJsZTsKKyAgICAgICAgCisgICAgICAgIHVuaWZpY2F0aW9uQ29udGV4dC51
bmlmeSh0aGlzLCBvdGhlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAg
ICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOwor
ICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc0FyZ3VtZW50KHVuaWZpY2F0aW9uQ29udGV4dCkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc1BhcmFt
ZXRlcih1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlw
ZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0VGbG9hdC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FRmxvYXQuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRUZsb2F0LmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRUZsb2F0IGV4dGVuZHMgRVZhbHVlIHsKKyAg
ICBjb25zdHJ1Y3Rvcih0eXBlLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKHR5cGUpOwor
ICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgdmFsdWUo
KSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIAorICAgIGFkZChvdGhlcikKKyAgICB7Cisg
ICAgICAgIHJldHVybiBuZXcgRUZsb2F0KHRoaXMudHlwZSwgdGhpcy52YWx1ZSArIG90aGVyLnZh
bHVlKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
ICIiICsgdGhpcy52YWx1ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0VJ
bnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRUludC5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FSW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgRUludCBleHRlbmRzIEVWYWx1ZSB7CisgICAgY29uc3RydWN0
b3IodHlwZSwgdmFsdWUpCisgICAgeworICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgdGhp
cy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4g
dGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICBhZGQob3RoZXIpCisgICAgeworICAgICAgICByZXR1
cm4gbmV3IEVJbnQodGhpcy50eXBlLCAodGhpcy52YWx1ZSArIG90aGVyLnZhbHVlKSB8IDApOwor
ICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIiIgKyB0
aGlzLnZhbHVlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRVB0ci5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FUHRyLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0VQdHIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBFUHRyIGV4dGVuZHMgRVZhbHVlIHsKKyAgICAvLyBOdWxsIGlzIHNpZ25p
ZmllZCB3aXRoIGxWYWx1ZSA9IG51bGwuCisgICAgY29uc3RydWN0b3IodHlwZSwgbFZhbHVlKQor
ICAgIHsKKyAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgIHRoaXMuX2xWYWx1ZSA9IGxWYWx1
ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IGxWYWx1ZSgpIHsgcmV0dXJuIHRoaXMuX2xWYWx1ZTsg
fQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiXiIgKyB0aGlz
LmxWYWx1ZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FVmFsdWUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRVZhbHVlLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0VWYWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIEVWYWx1ZSB7CisgICAgY29uc3RydWN0b3IodHlwZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgdHlwZSgpIHsg
cmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVh
dGlvbkNvbW1vbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0aW9u
Q29tbW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRpb25D
b21tb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjb25zdCBCcmVh
a0V4Y2VwdGlvbiA9IFN5bWJvbCgiQnJlYWtFeGNlcHRpb24iKTsKK2NvbnN0IENvbnRpbnVlRXhj
ZXB0aW9uID0gU3ltYm9sKCJDb250aW51ZUV4Y2VwdGlvbiIpOworCisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0V2YWx1YXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9F
dmFsdWF0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdG9y
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRXZhbHVhdG9y
IGV4dGVuZHMgVmlzaXRvciB7CisgICAgdmlzaXRGdW5jdGlvbkJvZHkoYmxvY2spCisgICAgewor
ICAgICAgICB0cnkgeworICAgICAgICAgICAgYmxvY2sudmlzaXQodGhpcyk7CisgICAgICAgICAg
ICAvLyBGSVhNRTogV2Ugc2hvdWxkIGhhdmUgYSBjaGVjayB0aGF0IHRoZXJlIGlzIG5vIHdheSB0
byBkcm9wIG91dCBvZiBhIGZ1bmN0aW9uIHdpdGhvdXQKKyAgICAgICAgICAgIC8vIHJldHVybmlu
ZyB1bmxlc3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgdm9pZC4KKyAgICAgICAgICAgIHJldHVybiBu
dWxsOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBpZiAoZSA9PSBCcmVha0V4
Y2VwdGlvbiB8fCBlID09IENvbnRpbnVlRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigiU2hvdWxkIG5vdCBzZWUgYnJlYWsvY29udGludWUgYXQgZnVuY3Rpb24gc2Nv
cGUiKTsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmV0dXJuRXhjZXB0aW9uKQorICAg
ICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uTGlrZUJsb2NrKG5vZGUpCisgICAg
eworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuYXJndW1lbnRMaXN0Lmxlbmd0aDsg
KytpKQorICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJzW2ldLmxWYWx1ZS52YWx1ZSA9IG5vZGUu
YXJndW1lbnRMaXN0W2ldLnZpc2l0KHRoaXMpOworICAgICAgICByZXR1cm4gdmlzaXRGdW5jdGlv
bkJvZHkobm9kZS5ibG9jayk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisg
ICAgeworICAgICAgICB0aHJvdyBuZXcgUmV0dXJuRXhjZXB0aW9uKG5vZGUudmFsdWUgPyBub2Rl
LnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAgIAorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0V4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRXhw
cmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEV4
cHJlc3Npb24gZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luKQorICAgIHsK
KyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQgb3Jp
Z2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9GaWVsZC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZpZWxkIHsKKyAgICBjb25zdHJ1Y3Rvcihvcmln
aW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1
cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvRnVuYy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5j
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jIGV4dGVuZHMgTm9kZSB7Cisg
ICAgY29uc3RydWN0b3IobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRl
cnMpCisgICAgeworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fcmV0
dXJuVHlwZSA9IHJldHVyblR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlw
ZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAg
IH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQg
cmV0dXJuVHlwZSgpIHsgcmV0dXJuIHRoaXMuX3JldHVyblR5cGU7IH0KKyAgICBnZXQgdHlwZVBh
cmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCBwYXJh
bWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fcGFyYW1ldGVyczsgfQorICAgIGdldCBwYXJhbWV0ZXJU
eXBlcygpIHsgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRl
ci50eXBlKTsgfQorICAgIAorICAgIGdldCBraW5kKCkgeyByZXR1cm4gRnVuYzsgfQorICAgIAor
ICAgIHVuaWZ5SW1wbChvdGhlcikKKyAgICB7CisgICAgICAgIAorICAgIH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5UeXBlICsgIiAiICsg
dGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+KCIgKyB0aGlzLnBhcmFt
ZXRlcnMgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jRGVm
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNEZWYuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0RlZi5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmNEZWYgZXh0ZW5kcyBGdW5jIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0
ZXJzLCBib2R5KQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBh
cmFtZXRlcnMsIHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7
IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAg
ICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgeyAiICsgYm9keSArICIgfSI7CisgICAg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jSW5zdGFudGlhdG9yLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNJbnN0YW50aWF0b3IuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0luc3RhbnRpYXRvci5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmNJbnN0YW50aWF0b3IgeworICAg
IGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX2luc3RhbmNlcyA9IG5ldyBNYXAo
KTsKKyAgICB9CisgICAgCisgICAgLy8gUmV0dXJucyBhIEZ1bmMgb2JqZWN0IHRoYXQgdW5pcXVl
bHkgaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgc3lzdGVtIG9mIHR5cGUgYXJndW1lbnRzLgorICAg
IGdldFVuaXF1ZShmdW5jLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKCFmdW5j
LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiBmdW5jOworICAgICAg
ICAKKyAgICAgICAgbGV0IGluc3RhbmNlcyA9IHRoaXMuX2luc3RhbmNlcy5nZXQoZnVuYyk7Cisg
ICAgICAgIGlmICghZnVuY3Rpb25zKQorICAgICAgICAgICAgdGhpcy5fZnVuY3Rpb25zLnNldChm
dW5jLCBmdW5jdGlvbnMgPSBbXSk7CisgICAgICAgIAorICAgICAgICBmb3IgKGxldCBpbnN0YW5j
ZSBvZiBpbnN0YW5jZXMpIHsKKyAgICAgICAgICAgIGxldCBvayA9IHRydWU7CisgICAgICAgICAg
ICBmb3IgKGxldCBpID0gaW5zdGFuY2UudHlwZUFyZ3VtZW50cy5sZW5ndGg7IGktLTspIHsKKyAg
ICAgICAgICAgICAgICBpZiAoIWluc3RhbmNlLnR5cGVBcmd1bWVudHNbaV0uZXF1YWxzKHR5cGVB
cmd1bWVudHNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmICghb2spCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAg
ICByZXR1cm4gaW5zdGFuY2UuZnVuYzsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgbGV0
IHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5tYXBwaW5nKGZ1bmMudHlwZVBhcmFtZXRlcnMs
IHR5cGVBcmd1bWVudHMpOworICAgICAgICBsZXQgZnVuYyA9IG5ldyBGdW5jRGVmKAorICAgICAg
ICAgICAgZnVuYy5vcmlnaW4sIGZ1bmMubmFtZSwKKyAgICAgICAgICAgIGZ1bmMucmV0dXJuVHlw
ZS52aXNpdChzdWJzdGl0dXRpb24pLAorICAgICAgICAgICAgW10sIC8vIFdlJ3JlIGluc3RhbnRp
YXRlZCBzbyB3ZSBubyBsb25nZXIgdGFrZSB0eXBlIHBhcmFtZXRlcnMuCisgICAgICAgICAgICBw
YXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLnZpc2l0KHN1YnN0aXR1dGlvbikp
LAorICAgICAgICAgICAgYm9keS52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICAgICAgbGV0IGlu
c3RhbmNlID0ge2Z1bmMsIHR5cGVBcmd1bWVudHN9OworICAgICAgICBpbnN0YW5jZXMucHVzaChp
bnN0YW5jZSk7CisgICAgICAgIHJldHVybiBmdW5jOworICAgIH0KK30KKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvRnVuY1BhcmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9GdW5jUGFyYW1ldGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0Z1bmNQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBGdW5jUGFyYW1ldGVyIGV4dGVuZHMgVmFsdWUgeworICAgIC8vIFRoZSBuYW1lIGlzIG9w
dGlvbmFsLiBJdCdzIE9LIGZvciBpdCB0byBiZSBudWxsIQorICAgIGNvbnN0cnVjdG9yKG9yaWdp
biwgbmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAg
ICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAg
IH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAg
Z2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVy
biB0aGlzLl90eXBlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL0Z1bmNTaWduYXR1cmUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvRnVuY1NpZ25hdHVyZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9GdW5jU2lnbmF0dXJlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtlQmxvY2suanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtlQmxvY2suanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtlQmxvY2suanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlvbkxpa2VCbG9jayBleHRlbmRzIFZh
bHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFyZ3VtZW50TGlzdCwgcGFyYW1ldGVycywg
Ym9keSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhp
cy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAgICAgICB0aGlzLl9wYXJhbWV0ZXJz
ID0gcGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fYm9keSA9IGJvZHk7CisgICAgfQorICAgIAor
ICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgYXJndW1l
bnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9CisgICAgZ2V0IHBhcmFtZXRl
cnMoKSB7IHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzOyB9CisgICAgZ2V0IGJvZHkoKSB7IHJldHVy
biB0aGlzLl9ib2R5OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuICJbJl0gKCIgKyBwYXJhbWV0ZXJzICsgIikgeyAiICsgYmxvY2sgKyAiIH0oIiArIGFyZ3Vt
ZW50TGlzdCArICIpIjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbmxpbmUu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5lLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0lubGluZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIGlubGluZShwcm9ncmFtKQoreworICAgIGZvciAobGV0
IGZ1bmMgb2YgcHJvZ3JhbS5mdW5jdGlvbnMpIHsKKyAgICAgICAgaWYgKCFmdW5jLnR5cGVQYXJh
bWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIF9pbmxpbmVGdW5jdGlvbihwcm9ncmFtLCBmdW5j
LCBuZXcgVmlzaXRpbmdTZXQoZnVuYykpOworICAgIH0KK30KKworZnVuY3Rpb24gX2lubGluZUZ1
bmN0aW9uKHByb2dyYW0sIGZ1bmMsIHZpc2l0aW5nKQoreworICAgIGlmIChmdW5jLnR5cGVQYXJh
bWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgaW5saW5lIGZ1
bmN0aW9uIHRoYXQgaGFzIHR5cGUgcGFyYW1ldGVycyIpOworICAgIGlmIChmdW5jLmlubGluZWQp
CisgICAgICAgIHJldHVybjsKKyAgICBmdW5jLnZpc2l0KG5ldyBMVmFsdWVCdWlsZGVyKCkpOwor
ICAgIGZ1bmMuYm9keSA9IGZ1bmMuYm9keS52aXNpdChuZXcgSW5saW5lcihwcm9ncmFtLCBmdW5j
LCB2aXNpdGluZykpOworICAgIGZ1bmMuaW5saW5lZCA9IHRydWU7Cit9CisKK2Z1bmN0aW9uIHJl
c29sdmVJbmxpbmVkRnVuY3Rpb24ocHJvZ3JhbSwgbmFtZSwgdHlwZUFyZ3VtZW50cywgYXJndW1l
bnRUeXBlcykKK3sKKyAgICBsZXQgb3ZlcmxvYWQgPSBwcm9ncmFtLnJlc29sdmVGdW5jT3Zlcmxv
YWQobmFtZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAgaWYgKCFvdmVybG9h
ZCkKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgaWYgKCFvdmVybG9hZC5mdW5jLnR5cGVQYXJh
bWV0ZXJzKQorICAgICAgICByZXR1cm4gb3ZlcmxvYWQuZnVuYzsKKyAgICBsZXQgZnVuYyA9IHBy
b2dyYW0uZnVuY0luc3RhbnRpYXRvci5nZXRVbmlxdWUob3ZlcmxvYWQuZnVuYywgb3ZlcmxvYWQu
dHlwZUFyZ3VtZW50cyk7CisgICAgX2lubGluZUZ1bmN0aW9uKHByb2dyYW0sIGZ1bmMsIG5ldyBW
aXNpdGluZ1NldChvdmVybG9hZC5mdW5jKSk7CisgICAgcmV0dXJuIGZ1bmM7Cit9CkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9JbmxpbmVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0lubGluZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5l
ci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIElubGluZXIg
ZXh0ZW5kcyBSZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IocHJvZ3JhbSwgZnVuYywgdmlzaXRp
bmcpCisgICAgeworICAgICAgICB0aGlzLl9wcm9ncmFtID0gcHJvZ3JhbTsKKyAgICAgICAgdGhp
cy5fdmlzaXRpbmcgPSB2aXNpdGluZzsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVz
c2lvbihub2RlKQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IFdoYXQgaWYgaXQncyBhIG5hdGl2
ZSBmdW5jdGlvbj8KKyAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2l0aW5nLmRvVmlzaXQobm9kZS5m
dW5jLCAoKSA9PiB7CisgICAgICAgICAgICBsZXQgZnVuYyA9IHRoaXMuX3Byb2dyYW0uZnVuY0lu
c3RhbnRpYXRvci5nZXRVbmlxdWUobm9kZS5mdW5jLCBub2RlLmFjdHVhbFR5cGVBcmd1bWVudHMp
OworICAgICAgICAgICAgX2lubGluZUZ1bmN0aW9uKHRoaXMuX3Byb2dyYW0sIGZ1bmMsIHRoaXMu
X3Zpc2l0aW5nKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25MaWtlQmxvY2soCisg
ICAgICAgICAgICAgICAgbm9kZS5vcmlnaW4sCisgICAgICAgICAgICAgICAgbm9kZS5hcmd1bWVu
dExpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSwKKyAgICAgICAgICAg
ICAgICBmdW5jLnBhcmFtZXRlcnMsIGZ1bmMuYm9keSk7CisgICAgICAgIH0pOworICAgIH0KK30K
KwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL0ludExpdGVyYWwuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBJbnRMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAg
IHRoaXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0
dXJuIHRoaXMuX3ZhbHVlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdHJ1ZTsg
fQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiIiArIHRoaXMu
X3ZhbHVlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBJbnRyaW5zaWNzIHsKKyAgICBjb25zdHJ1Y3Rv
cigpCisgICAgeworICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7CisKKyAgICAgICAgdGhp
cy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5cGUgdm9pZDw+IiwK
KyAgICAgICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhpcy52b2lkID0gdHlw
ZTsKKyAgICAgICAgICAgICAgICB0eXBlLl9fZGVmaW5lR2V0dGVyX18oImRlZmF1bHRWYWx1ZSIs
ICgpID0+IHsgdGhyb3cgbmV3IEVycm9yKCJ2b2lkIGhhcyBubyBkZWZhdWx0VmFsdWUiKTsgfSk7
CisgICAgICAgICAgICB9KTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAg
Im5hdGl2ZSBwcmltaXRpdmUgdHlwZSBpbnQzMjw+IiwKKyAgICAgICAgICAgICh0eXBlKSA9PiB7
CisgICAgICAgICAgICAgICAgdGhpcy5pbnQzMiA9IHR5cGU7CisgICAgICAgICAgICAgICAgdHlw
ZS5kZWZhdWx0VmFsdWUgPSBuZXcgRUludCh0eXBlLCAwKTsKKyAgICAgICAgICAgIH0pOworCisg
ICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBl
IGRvdWJsZTw+IiwKKyAgICAgICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhp
cy5kb3VibGUgPSB0eXBlOworICAgICAgICAgICAgICAgIHR5cGUuZGVmYXVsdFZBbHVlID0gbmV3
IEVGbG9hdCh0eXBlLCAwKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KKyAgICAKKyAgICBhZGQo
dGhpbmcpCisgICAgeworICAgICAgICBsZXQgaW50cmluc2ljID0gdGhpcy5fbWFwLmdldCh0aGlu
Zy5uYW1lKTsKKyAgICAgICAgaWYgKCFpbnRyaW5zaWMpCisgICAgICAgICAgICB0aHJvdyBuZXcg
QUxUeXBlRXJyb3IodGhpbmcub3JpZ2luLm9yaWdpblN0cmluZywgIlVucmVjb2duaXplZCBpbnRy
aW5zaWM6ICIgKyB0aGluZyk7CisgICAgICAgIGludHJpbnNpYyh0aGluZyk7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MSFNFdmFsdWF0b3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvTEhTRXZhbHVhdG9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0xIU0V2YWx1YXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMw
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIExIU0V2YWx1YXRvciB7CisgICAgCit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0xWYWx1ZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MVmFs
dWUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTFZhbHVlLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTFZhbHVlIHsKKyAgICBjb25z
dHJ1Y3Rvcih2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9
CisgICAgCisgICAgcmVzZXQoKQorICAgIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMudmFs
dWUudHlwZS5kZWZhdWx0VmFsdWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiAiTDooIiArIHRoaXMudmFsdWUgKyAiKSI7CisgICAgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9MVmFsdWVCdWlsZGVyLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0xWYWx1ZUJ1aWxkZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvTFZhbHVlQnVpbGRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIExWYWx1ZUJ1aWxkZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICBjb25z
dHJ1Y3Rvcihwcm9ncmFtKQorICAgIHsKKyAgICAgICAgdGhpcy5fcHJvZ3JhbSA9IHByb2dyYW07
CisgICAgfQorICAgIAorICAgIF9jcmVhdGVMVmFsdWUodHlwZSkKKyAgICB7CisgICAgICAgIGxl
dCByZXN1bHQgPSBuZXcgTFZhbHVlKHR5cGUuZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgdGhpcy5f
cHJvZ3JhbS5sVmFsdWVzLnB1c2gocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRGdW5jUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBu
b2RlLmxWYWx1ZSA9IG5ldyBMVmFsdWUobm9kZS50eXBlLmRlZmF1bHRWYWx1ZSk7CisgICAgfQor
fQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9MZXhlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9MZXhlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBM
ZXhlciB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhp
cy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl90ZXh0ID0gdGV4dDsKKyAgICAgICAg
dGhpcy5faW5kZXggPSAwOworICAgICAgICB0aGlzLl9zdGFjayA9IFtdOworICAgIH0KKyAgICAK
KyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saW5lTnVt
YmVyRm9ySW5kZXgodGhpcy5faW5kZXgpOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9vcmlnaW4gKyAiOiIgKyAodGhpcy5s
aW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIGxpbmVOdW1iZXJGb3JJbmRleChpbmRl
eCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90ZXh0LnN1YnN0cmluZygwLCBpbmRleCku
bWF0Y2goL1xuL2cpLmxlbmd0aDsKKyAgICB9CisgICAgCisgICAgZ2V0IHN0YXRlKCkgeyByZXR1
cm4gdGhpcy5faW5kZXg7IH0KKyAgICBzZXQgc3RhdGUodmFsdWUpIHsgdGhpcy5faW5kZXggPSB2
YWx1ZTsgfQorICAgIAorICAgIG5leHQoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3N0YWNr
Lmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFjay5wb3AoKTsKKyAgICAgICAg
CisgICAgICAgIGlmICh0aGlzLl9pbmRleCA+PSB0aGlzLl90ZXh0Lmxlbmd0aCkKKyAgICAgICAg
ICAgIHJldHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgY29uc3QgaXNDQ29tbWVudEJlZ2lu
ID0gL1wvXCovOworICAgICAgICBjb25zdCBpc0NQbHVzUGx1c0NvbW1lbnRCZWdpbiA9IC9cL1wv
LzsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1bHQgPSAoa2luZCkgPT4geworICAgICAgICAg
ICAgbGV0IHRleHQgPSBSZWdFeHAubGFzdE1hdGNoOworICAgICAgICAgICAgbGV0IHRva2VuID0g
bmV3IExleGVyVG9rZW4odGhpcywgdGhpcy5faW5kZXgsIGtpbmQsIHRleHQpOworICAgICAgICAg
ICAgdGhpcy5faW5kZXggKz0gdGV4dC5sZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gdG9rZW47
CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IHJlbGV2YW50VGV4dDsKKyAgICAgICAgZm9yICg7
OykgeworICAgICAgICAgICAgcmVsZXZhbnRUZXh0ID0gdGhpcy5fdGV4dC5zdWJzdHJpbmcodGhp
cy5faW5kZXgpOworICAgICAgICAgICAgaWYgKC9eXHMrLy50ZXN0KHJlbGV2YW50VGV4dCkpIHsK
KyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBSZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
ICgvXlwvXCovLnRlc3QocmVsZXZhbnRUZXh0KSkgeworICAgICAgICAgICAgICAgIGxldCBlbmRJ
bmRleCA9IHJlbGV2YW50VGV4dC5zZWFyY2goL1wqXC8vKTsKKyAgICAgICAgICAgICAgICBpZiAo
ZW5kSW5kZXggPCAwKQorICAgICAgICAgICAgICAgICAgICB0aGlzLmZhaWwoIlVudGVybWluYXRl
ZCBjb21tZW50Iik7CisgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gZW5kSW5kZXg7Cisg
ICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAo
L15cL1wvLiovLnRlc3QocmVsZXZhbnRUZXh0KSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2lu
ZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gubGVuZ3RoOworICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAg
CisgICAgICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgZG8gVW5pY29kZS4KKyAgICAgICAgaWYgKC9e
W15cZFxXXVx3Ki8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dCgiaWRlbnRpZmllciIpOworCisgICAgICAgIGlmICgvXlswLTldKy8udGVzdChyZWxldmFudFRl
eHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiaW50TGl0ZXJhbCIpOworCisgICAgICAg
IC8vIEZJWE1FOiBNYWtlIHRoaXMgaGFuZGxlIGV4cC1mb3JtIGxpdGVyYWxzIGxpa2UgMWUxLgor
ICAgICAgICBpZiAoL14oWzAtOV0qXC5bMC05XSspfChbMC05XStcLlswLTldKikvLnRlc3QocmVs
ZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImRvdWJsZUxpdGVyYWwiKTsK
KyAgICAgICAgCisgICAgICAgIGlmICgvXihzdHJ1Y3R8cHJvdG9jb2x8dHlwZXxpZnxlbHNlfGVu
dW18Y29udGludWV8YnJlYWt8c3dpdGNofGNhc2V8ZGVmYXVsdHxmb3J8d2hpbGV8ZG98cmV0dXJu
fHNpemVvZnxjb25zdGFudHxkZXZpY2V8dGhyZWFkZ3JvdXB8dGhyZWFkfG9wZXJhdG9yfG51bGwp
Ly50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJrZXl3b3Jk
Iik7CisgICAgICAgIAorICAgICAgICBpZiAoL14oW3t9KClcW1xdPzo9KypcLywuJSF+XiZ8PD5c
XC1dfC0+fD0+fDw9fD09fCE9fCs9fC09fFwqPXxcLz18JT18Xj18XHw9fCY9KS8udGVzdChyZWxl
dmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgicHVuY3R1YXRpb24iKTsKKyAg
ICAgICAgCisgICAgICAgIGZhaWwoIlVucmVjb2duaXplZCB0b2tlbiBiZWdpbm5pbmcgd2l0aDog
IiArIHJlbGV2YW50VGV4dC5zdWJzdHJpbmcoMCwgMTApKTsKKyAgICB9CisgICAgCisgICAgcHVz
aCh0b2tlbikKKyAgICB7CisgICAgICAgIHRoaXMuX3N0YWNrLnB1c2godG9rZW4pOworICAgIH0K
KyAgICAKKyAgICBwZWVrKCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXh0KCk7Cisg
ICAgICAgIHB1c2gocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAg
CisgICAgZmFpbChlcnJvcikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBBTFN5bnRheEVycm9y
KHRoaXMub3JpZ2luU3RyaW5nLCBlcnJvcik7CisgICAgfQorICAgIAorICAgIGJhY2t0cmFja2lu
Z1Njb3BlKGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZTsK
KyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOworICAgICAgICB9
IGNhdGNoIChlKSB7CisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEFMU3ludGF4RXJyb3Ip
IHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAg
cmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAg
ICB9CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBMZXhlclRva2VuIHsKKyAgICBjb25zdHJ1Y3RvcihsZXhl
ciwgb3JpZ2luLCBpbmRleCwga2luZCwgdGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX2xleGVy
ID0gbGV4ZXI7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5f
aW5kZXggPSBpbmRleDsKKyAgICAgICAgdGhpcy5fa2luZCA9IGtpbmQ7CisgICAgICAgIHRoaXMu
X3RleHQgPSB0ZXh0OworICAgIH0KKyAgICAKKyAgICBnZXQga2luZCgpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fa2luZDsKKyAgICB9CisgICAgCisgICAgZ2V0IHRleHQoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQ7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4o
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX29yaWdpbjsKKyAgICB9CisgICAgCisgICAg
Z2V0IGluZGV4KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9pbmRleDsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IGxpbmVOdW1iZXIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2xl
eGVyLmxpbmVOdW1iZXJGb3JJbmRleCh0aGlzLl9pbmRleCk7CisgICAgfQorICAgIAorICAgIGdl
dCBvcmlnaW5TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMub3JpZ2luICsgIjoi
ICsgKHRoaXMubGluZU51bWJlciArIDEpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gIkxleGVyVG9rZW4oIiArIHRoaXMua2luZCArICIsICIgKyB0
aGlzLnRleHQgKyAiLCAiICsgdGhpcy5saW5lTnVtYmVyICsgIikiOworICAgIH0KK30KSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL05hbWVDb250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTU4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NvbnN0IFR5cGVPclZhbHVlID0gU3ltYm9sKCk7CisKK2NsYXNzIE5hbWVDb250ZXh0IHsKKyAg
ICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBN
YXAoKTsKKyAgICAgICAgbGV0IHR5cGVBbmRWYWx1ZU1hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAg
dGhpcy5fbWFwLnNldChUeXBlLCB0eXBlQW5kVmFsdWVNYXApOworICAgICAgICB0aGlzLl9tYXAu
c2V0KFZhbHVlLCB0eXBlQW5kVmFsdWVNYXApOworICAgICAgICBmb3IgKGxldCBraW5kIG9mIG5h
bWVhYmxlS2luZHMpCisgICAgICAgICAgICB0aGlzLl9tYXAuc2V0KGtpbmQsIG5ldyBNYXAoKSk7
CisgICAgICAgIHRoaXMuX2RlZmluZWQgPSBuZXcgU2V0KCk7CisgICAgICAgIHRoaXMuX2N1cnJl
bnRTdGF0ZW1lbnQgPSBudWxsOworICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IG51bGw7CisgICAg
ICAgIHRoaXMuX2ludHJpbnNpY3MgPSBudWxsOworICAgICAgICB0aGlzLl9wcm9ncmFtID0gbnVs
bDsKKyAgICB9CisgICAgCisgICAgbWFwRm9yKGtpbmQpCisgICAgeworICAgICAgICBsZXQgcmVz
dWx0ID0gdGhpcy5fbWFwLmdldChraW5kKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBraW5kOiAiICsga2luZCk7CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGFkZCh0aGluZykKKyAgICB7CisgICAgICAgIGlm
ICghdGhpbmcubmFtZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlm
ICh0aGluZy5pc05hdGl2ZSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnRyaW5zaWNzKQor
ICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTmF0aXZlIGZ1bmN0aW9uIGluIGEgc2Nv
cGUgdGhhdCBkb2VzIG5vdCByZWNvZ25pemUgaW50cmluc2ljcyIpOworICAgICAgICAgICAgdGhp
cy5faW50cmluc2ljcy5hZGQodGhpbmcpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBs
ZXQgbWFwID0gbWFwRm9yKHRoaW5nLmtpbmQpOworICAgICAgICBpZiAodGhpbmcua2luZCA9PSBG
dW5jKSB7CisgICAgICAgICAgICBsZXQgYXJyYXkgPSBtYXAuZ2V0KHRoaW5nLm5hbWUpOworICAg
ICAgICAgICAgaWYgKCFhcnJheSkKKyAgICAgICAgICAgICAgICBtYXAuc2V0KHRoaW5nLm5hbWUs
IGFycmF5ID0gW10pOworICAgICAgICAgICAgYXJyYXkucHVzaCh0aGluZyk7CisgICAgICAgICAg
ICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1hcC5oYXModGhpbmcubmFtZSkpCisg
ICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IodGhpbmcub3JpZ2luLm9yaWdpblN0cmlu
ZywgIkR1cGxpY2F0ZSBuYW1lOiAiICsgdGhpbmcubmFtZSk7CisgICAgICAgIG1hcC5zZXQodGhp
bmcubmFtZSwgdGhpbmcpOworICAgIH0KKyAgICAKKyAgICBnZXQoa2luZCwgbmFtZSkKKyAgICB7
CisgICAgICAgIGxldCByZXN1bHQgPSBtYXBGb3Ioa2luZCA9PSBUeXBlT3JWYWx1ZSA/IFR5cGUg
OiBraW5kKS5nZXQobmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0ICYmIHRoaXMuX2RlbGVnYXRl
KQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmdldChraW5kLCBuYW1lKTsKKyAg
ICAgICAgaWYgKGtpbmQgPT0gVmFsdWUgfHwga2luZCA9PSBUeXBlKSB7CisgICAgICAgICAgICBp
ZiAocmVzdWx0LmtpbmQgIT0ga2luZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBnZXQgY3Vy
cmVudFN0YXRlbWVudCgpCisgICAgeworICAgICAgICBpZiAodGhpcy5fY3VycmVudFN0YXRlbWVu
dCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50U3RhdGVtZW50OworICAgICAgICBp
ZiAodGhpcy5fZGVsZWdhdGUpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVsZWdhdGUuY3Vy
cmVudFN0YXRlbWVudDsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICAgIAorICAgIGlz
RGVmaW5lZCh0aGluZykKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9kZWZpbmVkLmhhcyh0
aGluZykKKyAgICAgICAgICAgIHx8ICh0aGlzLl9kZWxlZ2F0ZSAmJiB0aGlzLl9kZWxlZ2F0ZS5p
c0RlZmluZWQodGhpbmcpKTsKKyAgICB9CisgICAgCisgICAgZGVmaW5lKHRoaW5nKQorICAgIHsK
KyAgICAgICAgdGhpcy5fZGVmaW5lZC5zZXQodGhpbmcpOworICAgIH0KKyAgICAKKyAgICBkZWZp
bmVBbGwoKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdGhpbmcgb2YgdGhpcykKKyAgICAgICAg
ICAgIGRlZmluZSh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRvU3RhdGVtZW50KHN0YXRlbWVu
dCwgY2FsbGJhY2spCisgICAgeworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gc3Rh
dGVtZW50OworICAgICAgICBjYWxsYmFjaygpOworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVt
ZW50ID0gbnVsbDsKKyAgICAgICAgZGVmaW5lKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAg
IHJlY29nbml6ZUludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAgdGhpcy5faW50cmluc2ljcyA9
IG5ldyBJbnRyaW5zaWNzKCk7CisgICAgfQorICAgIAorICAgIGdldCBpbnRyaW5zaWNzKCkKKyAg
ICB7CisgICAgICAgIGlmICh0aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgcmV0dXJuIHRo
aXMuX2ludHJpbnNpY3M7CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAg
IHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5pbnRyaW5zaWNzOworICAgICAgICByZXR1cm4gbnVsbDsK
KyAgICB9CisgICAgCisgICAgc2V0IHByb2dyYW0odmFsdWUpCisgICAgeworICAgICAgICB0aGlz
Ll9wcm9ncmFtID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCBwcm9ncmFtKCkKKyAgICB7
CisgICAgICAgIGlmICh0aGlzLl9wcm9ncmFtKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3By
b2dyYW07CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLl9kZWxlZ2F0ZS5wcm9ncmFtOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAg
CisgICAgKltTeW1ib2wuaXRlcmF0b3JdKCkKKyAgICB7CisgICAgICAgIGZvciAobGV0IG1hcCBv
ZiB0aGlzLl9tYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZvciAobGV0IHR5cGUgb2YgdGhp
cy5fdHlwZXMudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgeWllbGQgdHlwZTsKKyAgICAgICAg
fQorICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hbWVSZXNvbHZlci5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYW1lUmVzb2x2ZXIuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmFtZVJlc29sdmVyLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKKy8vIFRoaXMgb25seSByZXNvbHZlcyBuYW1lcy4gQWZ0ZXIg
dGhpcyBwaGFzZSBydW5zLCBhbGwgbmFtZXMgd2lsbCBiZSByZXNvbHZlZC4gVGhpcyBtZWFucyB0
aGF0IGFsbAorLy8gWFlaUmVmIG9iamVjdHMgbm93IGtub3cgd2hvIHRoZXkgcmVzb2x2ZSB0by4g
VGhpcyBkb2VzIG5vdCB5ZXQgYWxsb3cgdHlwZSBhbmFseXNpcywgYmVjYXVzZSB0aGVyZQorLy8g
YXJlIHN0aWxsIFR5cGVEZWZzLiBUaGlzIHRocm93cyB0eXBlIGVycm9ycyBmb3IgZmFpbGVkIG5h
bWUgcmVzb2x1dGlvbnMgYW5kIGZvciB0aGluZ3MgdGhhdCBhcmUKKy8vIG1vcmUgY29udmVuaWVu
dCB0byBjaGVjayBoZXJlIHRoYW4gaW4gdGhlIENoZWNrZXIuIFRoaXMgdXN1YWxseSBpbnZvbHZl
cyB0aGluZ3MgdGhhdCBuZWVkIHRvIGJlCisvLyBjaGVja2VkIGJlZm9yZSBUeXBlUmVmVG9UeXBl
RGVmU2tpcHBlci4KK2NsYXNzIE5hbWVSZXNvbHZlciBleHRlbmRzIFZpc2l0b3IgeworICAgIC8v
IEl0J3MgdG90YWxseSBPSyB0byBpbnN0YW50aWF0ZSB0aGlzIHdpdGggemVybyBhcmd1bWVudHMg
KGkuZS4gcGFzc2luZyB1bmRlZmluZWQgZm9yIGJvdGggb2YKKyAgICAvLyB0aGVtKSBpZiB5b3Un
cmUgY3JlYXRpbmcgYSBDaGVja2VyIHRvIHZpc2l0IGEgUHJvZ3JhbS4KKyAgICBjb25zdHJ1Y3Rv
cihuYW1lQ29udGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWVDb250ZXh0ID0gbmFtZUNv
bnRleHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvZ3JhbShub2RlKQorICAgIHsKKyAgICAg
ICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsK
KyAgICAgICAgbmFtZUNvbnRleHQucHJvZ3JhbSA9IG5vZGU7CisgICAgICAgIG5hbWVDb250ZXh0
LnJlY29nbml6ZUludHJpbnNpY3MoKTsKKyAgICAgICAgbm9kZS5pbnRyaW5zaWNzID0gbmFtZUNv
bnRleHQuaW50cmluc2ljczsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUudG9w
TGV2ZWxTdGF0ZW1lbnRzKQorICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRkKHN0YXRlbWVudCk7
CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFtZUNvbnRleHQpOworICAgICAg
ICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAg
ICAgICBuYW1lQ29udGV4dC5kb1N0YXRlbWVudCgoKSA9PiBzdGF0ZW1lbnQudmlzaXQoY2hlY2tl
cikpOworICAgIH0KKyAgICAKKyAgICBfdmlzaXRUeXBlUGFyYW1ldGVyc0FuZEJ1aWxkTmFtZUNv
bnRleHQobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29u
dGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIg
b2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgbmFtZUNvbnRleHQuYWRkKHR5
cGVQYXJhbWV0ZXIpOworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAg
ICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZUNvbnRleHQ7CisgICAgfQorICAgIAorICAgIHZp
c2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcih0
aGlzLl92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2RlKSk7CisgICAg
ICAgIG5vZGUucmV0dXJuVHlwZS52aXNpdChjaGVja2VyKTsKKyAgICAgICAgZm9yIChsZXQgcGFy
YW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChj
aGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jRGVmKG5vZGUpCisgICAgeworICAg
ICAgICBsZXQgY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyA9IHRoaXMuX3Zpc2l0VHlwZVBhcmFt
ZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpOworICAgICAgICBsZXQgY2hlY2tlcldpdGhU
eXBlUGFyYW1ldGVycyA9IG5ldyBDaGVja2VyKGNvbnRleHRXaXRoVHlwZVBhcmFtZXRlcnMpOwor
ICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7
CisgICAgICAgIGxldCBjb250ZXh0V2l0aFBhcmFtZXRlcnMgPSBuZXcgTmFtZUNvbnRleHQoY29u
dGV4dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBu
b2RlLnBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdChjaGVja2VyV2l0
aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgICAgIGNvbnRleHRXaXRoUGFyYW1ldGVycy5hZGQo
cGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlcldpdGhQYXJhbWV0ZXJz
ID0gbmV3IENoZWNrZXIoY29udGV4dFdpdGhQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5ib2R5
LnZpc2l0KGNoZWNrZXJXaXRoUGFyYW1ldGVycyk7CisgICAgfQorICAgIAorICAgIHZpc2l0Qmxv
Y2sobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmV3IE5h
bWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KSk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVu
dCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQoY2hlY2tl
cik7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAg
ICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQp
OworICAgICAgICBuYW1lQ29udGV4dC5hZGQobm9kZS50eXBlVmFyaWFibGUpOworICAgICAgICBs
ZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQg
c2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52aXNp
dChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5vZGUpCisgICAgewor
ICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRl
eHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRl
cnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgICAg
ICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAgbGV0
IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIG5vZGUudHlwZS52
aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisg
ICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFt
ZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBh
cmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAg
ICAgICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAg
ICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAo
bGV0IGZpZWxkIG9mIG5vZGUuZmllbGRzKQorICAgICAgICAgICAgZmllbGQudmlzaXQoY2hlY2tl
cik7CisgICAgfQorICAgIAorICAgIF9yZXNvbHZlVHlwZUFyZ3VtZW50cyh0eXBlQXJndW1lbnRz
KQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0
aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50c1tp
XTsKKyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnQgaW5zdGFuY2VvZiBUeXBlT3JWYXJpYWJs
ZVJlZikgeworICAgICAgICAgICAgICAgIGxldCB0aGluZyA9IHRoaXMuX25hbWVDb250ZXh0Lmdl
dChUeXBlT3JWYWx1ZSwgdHlwZUFyZ3VtZW50Lm5hbWUpOworICAgICAgICAgICAgICAgIGlmICgh
dGhpbmcpCisgICAgICAgICAgICAgICAgICAgIG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5v
cmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB0eXBlIG9yIHZhcmlhYmxlIG5hbWVkICIgKyB0
eXBlQXJndW1lbnQubmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHRoaW5nIGluc3RhbmNlb2Yg
VmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50W2ldID0gbmV3IFZhcmlh
YmxlUmVmKHR5cGVBcmd1bWVudC5vcmlnaW4sIHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAg
ICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50W2ldID0gbmV3
IFR5cGVSZWYodHlwZUFyZ3VtZW50Lm9yaWdpbiwgdHlwZUFyZ3VtZW50Lm5hbWUsIFtdKTsKKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudFtp
XSBpbnN0YW5jZW9mIFZhbHVlCisgICAgICAgICAgICAgICAgJiYgIXR5cGVBcmd1bWVudFtpXS5p
c0NvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5v
cmlnaW4ub3JpZ2luU3RyaW5nLCAiRXhwZWN0ZWQgY29uc3RleHByIik7CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9y
ZXNvbHZlVHlwZUFyZ3VtZW50cyhub2RlLnR5cGVBcmd1bWVudHMpOworICAgICAgICAKKyAgICAg
ICAgbGV0IHR5cGUgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVHlwZSwgbm9kZS5uYW1lKTsKKyAg
ICAgICAgaWYgKCF0eXBlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUu
b3JpZ2luLm9yaWdpblN0cmluZywgIkNvdWxkIG5vdCBmaW5kIHR5cGUgbmFtZWQgIiArIG5vZGUu
bmFtZSk7CisgICAgICAgIGlmICghdGhpcy5fbmFtZUNvbnRleHQuaXNEZWZpbmVkKHR5cGUpKQor
ICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmlu
ZywgIklsbGVnYWwgZm9yd2FyZCB1c2Ugb2YgdHlwZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAg
ICAgICAgbm9kZS50eXBlID0gdHlwZTsKKyAgICAgICAgCisgICAgICAgIGlmICh0eXBlLnR5cGVQ
YXJhbWV0ZXJzLmxlbmd0aCAhPSBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAg
ICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyBudW1i
ZXIgb2YgdHlwZSBhcmd1bWVudHMiKTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBl
LnR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgcGFyYW1ldGVy
SXNUeXBlID0gdHlwZS50eXBlUGFyYW1ldGVyc1tpXSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZTsK
KyAgICAgICAgICAgIGxldCBhcmd1bWVudElzVHlwZSA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXSBp
bnN0YW5jZW9mIFR5cGU7CisgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHNbaV0udmlzaXQo
dGhpcyk7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVySXNUeXBlICYmICFhcmd1bWVudElzVHlw
ZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0
cmluZywgIkV4cGVjdGVkIHR5cGUsIGJ1dCBnb3QgdmFsdWUgYXQgYXJndW1lbnQgIyIgKyBpKTsK
KyAgICAgICAgICAgIGlmICghcGFyYW1ldGVySXNUeXBlICYmIGFyZ3VtZW50SXNUeXBlKQorICAg
ICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAi
RXhwZWN0ZWQgdmFsdWUsIGJ1dCBnb3QgdHlwZSBhdCBhcmd1bWVudCAjIiArIGkpOworICAgICAg
ICB9CisKKyAgICAgICAgc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4
dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250
ZXh0LmRlZmluZUFsbCgpOworICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KG5ldyBDaGVj
a2VyKG5hbWVDb250ZXh0KSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9k
ZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVmFs
dWUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkNvdWxkIG5vdCBmaW5k
IHZhcmlhYmxlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBub2RlLnZhcmlhYmxlID0g
cmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAg
ICAgbm9kZS5mdW5jID0gdGhpcy5fbmFtZUNvbnRleHQuY3VycmVudFN0YXRlbWVudDsKKyAgICAg
ICAgc3VwZXIudmlzaXRSZXR1cm4obm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2FsbEV4
cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Jlc29sdmVUeXBlQXJndW1lbnRz
KG5vZGUudHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHN1cGVyLnZpc2l0Q2FsbEV4cHJlc3Npb24o
bm9kZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGlzUHJpbWl0aXZlLCB0eXBlUGFyYW1ldGVycykK
KyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX2lzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7CisgICAg
ICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgfQorICAgIAor
ICAgIGdldCBvcmlnaW4oKSB7IHJldHVuciB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgp
IHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0
aGlzLl9pc1ByaW1pdGl2ZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRo
aXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gdHJ1ZTsg
fQorICAgIAorICAgIGluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBp
ZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gdGhpcy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisg
ICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiB0eXBlIGFyZ3VtZW50
cyB0byBpbnN0YW50aWF0aW9uIik7CisgICAgICAgIGlmICghdHlwZUFyZ3VtZW50cy5sZW5ndGgp
CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgcmV0dXJuIG5ldyBOYXRpdmVUeXBl
SW5zdGFuY2UodGhpcywgdHlwZUFyZ3VtZW50cyk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5n
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAibmF0aXZlICIgKyAodGhpcy5pc1ByaW1pdGl2ZSA/
ICJwcmltaXRpdmUgIiA6ICIiKSArICJ0eXBlICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5
cGVQYXJhbWV0ZXJzICsgIj4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
TmF0aXZlVHlwZUluc3RhbmNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05h
dGl2ZVR5cGVJbnN0YW5jZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9O
YXRpdmVUeXBlSW5zdGFuY2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NyBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBOYXRpdmVUeXBlSW5zdGFuY2UgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cih0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7
CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgIH0KKyAg
ICAKKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICBnZXQgdHlwZUFy
Z3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0KKyAgICBnZXQgaXNQcmlt
aXRpdmUoKSB7IHJldHVybiB0aGlzLl90eXBlLmlzUHJpbWl0aXZlOyB9CisgICAgZ2V0IGlzTmF0
aXZlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNv
bnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMudHlwZSAhPSBvdGhlci50eXBl
KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodGhpcy50eXBlQXJndW1l
bnRzLmxlbmd0aCAhPSBvdGhlci50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnR5cGVBcmd1bWVu
dHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzW2ld
LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZUFyZ3VtZW50c1tpXSkpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVl
OworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy50eXBlICsgIjwiICsgdGhpcy50eXBlQXJndW1lbnRzICsgIj4iOworICAgIH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9Ob2RlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOb2RlIHsKKyAgICB2
aXNpdCh2aXNpdG9yKQorICAgIHsKKyAgICAgICAgbGV0IHJldHVyblZhbHVlID0gdmlzaXRvclsi
dmlzaXQiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXSh0aGlzKTsKKyAgICAgICAgaWYgKCJyZXR1
cm5WYWx1ZSIgaW4gdmlzaXRvcikKKyAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnJldHVyblZh
bHVlOworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorICAgIAorICAgIHVuaWZ5
KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBsZXQgdW5pZnlUaGlz
ID0gdGhpcy51bmlmeU5vZGU7CisgICAgICAgIGxldCB1bmlmeU90aGVyID0gb3RoZXIudW5pZnlO
b2RlOworICAgICAgICBpZiAodW5pZnlPdGhlci50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlv
bkNvbnRleHQsIHVuaWZ5VGhpcykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
cmV0dXJuIHVuaWZ5VGhpcy51bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCB1bmlmeU90aGVy
KTsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIp
CisgICAgeworICAgICAgICBpZiAob3RoZXIudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCB0aGlzKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4g
dGhpcyA9PSBvdGhlcjsKKyAgICB9CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IHVuaWZ5Tm9kZSgpIHsgcmV0dXJuIHRoaXM7IH0KKyAgICBnZXQgaXNV
bmlmaWFibGUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIGdldCBpc05hdGl2ZSgpIHsg
cmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAgZXF1YWxzKG90aGVyKQorICAgIHsKKyAgICAgICAg
bGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQoKTsKKyAgICAg
ICAgcmV0dXJuIHRoaXMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikgJiYgdW5pZmlj
YXRpb25Db250ZXh0LmlzVW51bmlmaWVkKCk7CisgICAgfQorICAgIAorICAgIHN1YnN0aXR1dGUo
cGFyYW1ldGVycywgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlz
aXQoU3Vic3RpdHV0aW9uLm1hcHBpbmcocGFyYW1ldGVycywgYXJndW1lbnRMaXN0KSk7CisgICAg
fQorICAgIAorICAgIHN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKHBhcmFtZXRlcnMsIHVuaWZpY2F0
aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWJzdGl0dXRlKHBhcmFtZXRlcnMs
IHBhcmFtZXRlcnMubWFwKHR5cGUgPT4gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodHlwZSkpKTsK
KyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9QYXJzZS5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9QYXJzZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9QYXJzZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU4NiBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitm
dW5jdGlvbiBwYXJzZShwcm9ncmFtLCBvcmlnaW4sIHRleHQpCit7CisgICAgbGV0IGxleGVyID0g
bmV3IExleGVyKG9yaWdpbiwgdGV4dCk7CisgICAgCisgICAgLy8gVGhlIGhhcmRlc3QgcGFydCBv
ZiBkZWFsaW5nIHdpdGggQy1saWtlIGxhbmd1YWdlcyBpcyBwYXJzaW5nIHZhcmlhYmxlIGRlY2xh
cmF0aW9uIHN0YXRlbWVudHMuCisgICAgLy8gTGV0J3MgY29uc2lkZXIgaWYgdGhpcyBoYXBwZW5z
IGluIEFycmF5TGFuZy4gSGVyZSBhcmUgdGhlIHZhbGlkIHN0YXRlbWVudHMgaW4gQXJyYXlMYW5n
IHRoYXQKKyAgICAvLyBiZWdpbiB3aXRoIGFuIGlkZW50aWZpZXIsIGlmIHdlIGFzc3VtZSB0aGF0
IGFueSBleHByZXNzaW9uIGNhbiBiZSBhIHN0YW5kYWxvbmUgc3RhdGVtZW50LgorICAgIC8vCisg
ICAgLy8gICAgIHg7CisgICAgLy8gICAgIHggPGJpbm9wPiB5OworICAgIC8vICAgICB4IDwgeTsK
KyAgICAvLyAgICAgeCA8IHkgPiB6OworICAgIC8vICAgICB4ID0geTsKKyAgICAvLyAgICAgeC5m
ID0geTsKKyAgICAvLyAgICAgXGV4cCA9IHk7CisgICAgLy8gICAgIHhbNDJdID0geTsKKyAgICAv
LyAgICAgeCgpOworICAgIC8vICAgICB4PHk+KCk7CisgICAgLy8gICAgIHggeTsKKyAgICAvLyAg
ICAgeDx5PiB6OworICAgIC8vICAgICBkZXZpY2UgeFtdIHk7CisgICAgLy8gICAgIHhbNDJdIHk7
CisgICAgLy8gICAgIGRldmljZSB4XiB5OworICAgIC8vICAgICB0aHJlYWQgeF5eIHk7CisgICAg
Ly8gICAgIHhedGhyZWFkXnRocmVhZCB5OworICAgIC8vICAgICB4XmRldmljZV50aHJlYWQgeTsK
KyAgICAvLworICAgIC8vIFRoaXMgaGFzIHR3byBwcm9ibGVtIGFyZWFzOgorICAgIC8vCisgICAg
Ly8gICAgIC0geDx5PnogY2FuIHBhcnNlIHR3byBkaWZmZXJlbnQgd2F5cyAoYXMgKHggPCB5KSA+
IHogb3IgeDx5PiB6KS4KKyAgICAvLyAgICAgLSB4WzQyXSBjb3VsZCBiZWNvbWUgZWl0aGVyIGFu
IGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAvLyAgICAgLSB4PHk+
IGNvdWxkIGJlY29tZSBlaXRoZXIgYW4gYXNzaWdubWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0
aW9uLgorICAgIC8vCisgICAgLy8gV2Ugc29sdmUgdGhlIGZpcnN0IHByb2JsZW0gYnkgZm9yYmlk
ZGluZyBleHByZXNzaW9ucyBhcyBzdGF0ZW1lbnRzLiBUaGUgbGFjayBvZiBmdW5jdGlvbgorICAg
IC8vIHBvaW50ZXJzIG1lYW5zIHRoYXQgd2UgY2FuIHN0aWxsIGFsbG93IGZ1bmN0aW9uIGNhbGwg
c3RhdGVtZW50cyAtIHVubGlrZSBpbiBDLCB0aG9zZSBjYW5ub3QKKyAgICAvLyBoYXZlIGFyYml0
cmFyeSBleHByZXNzaW9ucyBhcyB0aGUgY2FsbGVlLiBUaGUgcmVtYWluaW5nIHR3byBwcm9ibGVt
cyBhcmUgc29sdmVkIGJ5CisgICAgLy8gYmFja3RyYWNraW5nLiBJbiBhbGwgb3RoZXIgcmVzcGVj
dHMsIHRoaXMgaXMgYSBzaW1wbGUgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyLgorICAgIAorICAg
IGZ1bmN0aW9uIGdlbmVyaWNDb25zdW1lKGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0IHRv
a2VuID0gbGV4ZXIubmV4dCgpOworICAgICAgICBpZiAoIXRva2VuKQorICAgICAgICAgICAgbGV4
ZXIuZmFpbCgiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworICAgICAgICBpZiAoY2FsbGJhY2so
dG9rZW4pKQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiVW5leHBlY3RlZCB0b2tlbjogIiArIHRv
a2VuLnRleHQgKyAiOyBleHBlY3RlZDogIiArIHRleHQpOworICAgICAgICByZXR1cm4gdG9rZW47
CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGNvbnN1bWUoLi4udGV4dHMpCisgICAgeworICAg
ICAgICByZXR1cm4gZ2VuZXJpY0NvbnN1bWUodG9rZW4gPT4gdGV4dHMuaW5jbHVkZXModG9rZW4u
dGV4dCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBjb25zdW1lS2luZChraW5kKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNDb25zdW1lKHRva2VuID0+IHRva2VuLmtpbmQgPT0g
a2luZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGFzc2VydE5leHQoLi4udGV4dHMpCisg
ICAgeworICAgICAgICBsZXhlci5wdXNoKGNvbnN1bWUoLi4udGV4dHMpKTsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gZ2VuZXJpY1Rlc3QoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQg
dG9rZW4gPSBsZXhlci5wZWVrKCk7CisgICAgICAgIGlmICh0b2tlbiAmJiBjYWxsYmFjayh0b2tl
bikpCisgICAgICAgICAgICByZXR1cm4gdG9rZW47CisgICAgICAgIHJldHVybiBudWxsOworICAg
IH0KKyAgICAKKyAgICBmdW5jdGlvbiB0ZXN0KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIGdlbmVyaWNUZXN0KHRva2VuID0+IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gdGVzdEtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBnZW5lcmljVGVzdCh0b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiB0cnlDb25zdW1lKC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgbGV0
IHJlc3VsdCA9IHRlc3QoLi4udGV4dHMpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAg
ICAgbGV4ZXIubmV4dCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAg
ICBmdW5jdGlvbiB0cnlDb25zdW1lS2luZChraW5kKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3Vs
dCA9IHRlc3RLaW5kKGtpbmQpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgbGV4
ZXIubmV4dCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVByb3RvY29sUmVmKCkKKyAgICB7CisgICAgICAgIGxldCBwcm90b2NvbFRva2Vu
ID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQcm90b2Nv
bFJlZihwcm90b2NvbFRva2VuLm9yaWdpbiwgcHJvdG9jb2xUb2tlbi50ZXh0KTsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gY29uc3VtZUVuZE9mVHlwZUFyZ3MoKQorICAgIHsKKyAgICAgICAg
bGV0IHJpZ2h0U2hpZnQgPSB0cnlDb25zdW1lKCI+PiIpOworICAgICAgICBpZiAocmlnaHRTaGlm
dCkKKyAgICAgICAgICAgIGxleGVyLnB1c2gobmV3IExleGVyVG9rZW4obGV4ZXIsIHJpZ2h0U2hp
ZnQub3JpZ2luLCByaWdodFNoaWZ0LmluZGV4LCByaWdodFNoaWZ0LmtpbmQsICI+IikpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICBjb25zdW1lKCI+Iik7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIHBhcnNlVHlwZVBhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8
IikpCisgICAgICAgICAgICByZXR1cm4gW107CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0
ID0gW107CisgICAgICAgIGNvbnN1bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+Iikp
IHsKKyAgICAgICAgICAgIGxldCBjb25zdGV4cHIgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgo
KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAg
ICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAg
ICAgICAgYXNzZXJ0TmV4dCgiLCIsICI+IiwgIj4+Iik7CisgICAgICAgICAgICAgICAgcmV0dXJu
IG5ldyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyKHR5cGUub3JpZ2luLCBuYW1lLCB0eXBlKTsKKyAg
ICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAg
ICByZXN1bHQucHVzaChjb25zdGV4cHIpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAg
ICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAg
ICAgIGxldCBwcm90b2NvbCA9IHRyeUNvbnN1bWUoIjoiKSA/IHBhcnNlUHJvdG9jb2xSZWYoKSA6
IG51bGw7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFR5cGVWYXJpYWJsZShuYW1l
Lm9yaWdpbiwgbmFtZS50ZXh0LCBwcm90b2NvbCkpOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgY29uc3VtZUVuZE9mVHlwZUFyZ3MoKTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VUZXJtKCkKKyAgICB7CisgICAgICAg
IGxldCB0b2tlbjsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgibnVsbCIpKQorICAg
ICAgICAgICAgcmV0dXJuIG5ldyBOdWxsKHRva2VuLm9yaWdpbik7CisgICAgICAgIGlmICh0b2tl
biA9IHRyeUNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIikpCisgICAgICAgICAgICByZXR1cm4gbmV3
IFZhcmlhYmxlUmVmKHRva2VuLm9yaWdpbiwgdG9rZW4udGV4dCk7CisgICAgICAgIGlmICh0b2tl
biA9IHRyeUNvbnN1bWVLaW5kKCJpbnRMaXRlcmFsIikpIHsKKyAgICAgICAgICAgIGxldCBpbnRW
ZXJzaW9uID0gdG9rZW4udGV4dCB8IDA7CisgICAgICAgICAgICBpZiAoaW50VmVyc2lvbiAhPSB0
b2tlbi50ZXh0KQorICAgICAgICAgICAgICAgIGxleGVyLmZhaWwoIkludGVnZXIgbGl0ZXJhbCBp
cyBub3QgMzItYml0IGludGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50TGl0ZXJh
bCh0b2tlbi5vcmlnaW4sIGludFZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1F
OiBOZWVkIHN1cHBvcnQgZm9yIGZsb2F0IGxpdGVyYWxzIGFuZCBwcm9iYWJseSBvdGhlciBsaXRl
cmFscyB0b28uCisgICAgICAgIHRva2VuID0gY29uc3VtZUtpbmQoImRvdWJsZUxpdGVyYWwiKTsK
KyAgICAgICAgcmV0dXJuIG5ldyBEb3VibGVMaXRlcmFsKHRva2VuLm9yaWdpbiwgK3Rva2VuLnRl
eHQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNvbnN0ZXhwcigpCisgICAgewor
ICAgICAgICByZXR1cm4gcGFyc2VUZXJtKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlVHlwZUFyZ3VtZW50cygpCisgICAgeworICAgICAgICBpZiAoIXRlc3QoIjwiKSkKKyAgICAg
ICAgICAgIHJldHVybiBbXTsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1bHQgPSBbXTsKKyAg
ICAgICAgY29uc3VtZSgiPCIpOworICAgICAgICB3aGlsZSAoIXRlc3QoIj4iKSkgeworICAgICAg
ICAgICAgLy8gSXQncyBwb3NzaWJsZSBmb3IgYSBjb25zdGV4cHIgb3IgdHlwZSBjYW4gc3ludGFj
dGljYWxseSBvdmVybGFwIGluIHRoZSBzaW5nbGUKKyAgICAgICAgICAgIC8vIGlkZW50aWZpZXIg
Y2FzZS4gTGV0J3MgY29uc2lkZXIgdGhlIHBvc3NpYmlsaXRpZXM6CisgICAgICAgICAgICAvLwor
ICAgICAgICAgICAgLy8gICAgIFQgICAgICAgICAgY291bGQgYmUgdHlwZSBvciBjb25zdGV4cHIK
KyAgICAgICAgICAgIC8vICAgICBUW10gICAgICAgIG9ubHkgdHlwZQorICAgICAgICAgICAgLy8g
ICAgIFRbNDJdICAgICAgb25seSB0eXBlIChjb25zdGV4cHIgY2Fubm90IGRvIGluZGV4aW5nKQor
ICAgICAgICAgICAgLy8gICAgIDQyICAgICAgICAgb25seSBjb25zdGV4cHIKKyAgICAgICAgICAg
IC8vCisgICAgICAgICAgICAvLyBJbiB0aGUgZnV0dXJlIHdlJ2xsIGFsbG93IGNvbnN0ZXhwcnMg
dG8gZG8gbW9yZSB0aGluZ3MsIGFuZCB0aGVuIHdlJ2xsIHN0aWxsIGhhdmUKKyAgICAgICAgICAg
IC8vIHRoZSBwcm9ibGVtIHRoYXQgc29tZXRoaW5nIG9mIHRoZSBmb3JtIFRbMV1bMl1bM10uLi4g
Y2FuIGVpdGhlciBiZSBhIHR5cGUgb3IgYQorICAgICAgICAgICAgLy8gY29uc3RleHByLCBhbmQg
d2UgY2FuIGZpZ3VyZSBvdXQgaW4gdGhlIGNoZWNrZXIgd2hpY2ggaXQgaXMuCisgICAgICAgICAg
ICBsZXQgdHlwZU9yVmFyaWFibGVSZWYgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7
CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7
CisgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgiLCIsICI+IiwgIj4+Iik7CisgICAgICAgICAg
ICAgICAgcmV0dXJuIG5ldyBUeXBlT3JWYXJpYWJsZVJlZihyZXN1bHQub3JpZ2luLCByZXN1bHQu
dGV4dCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICh0eXBlT3JWYXJpYWJsZVJl
ZikKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0eXBlT3JWYXJpYWJsZVJlZik7CisgICAg
ICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZXQgY29uc3RleHByID0gbGV4ZXIuYmFj
a3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0g
cGFyc2VDb25zdGV4cHIoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgiLCIsICI+
IiwgIj4+Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAg
ICAgICAgfSk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAg
ICAgICAgcmVzdWx0LnB1c2goY29uc3RleHByKQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAg
ICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VUeXBlKCkpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZUVuZE9mVHlwZUFyZ3MoKTsKKyAgICAgICAgcmV0
dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VUeXBlKCkKKyAgICB7
CisgICAgICAgIGxldCB0b2tlbjsKKyAgICAgICAgbGV0IGFkZHJlc3NTcGFjZTsKKyAgICAgICAg
bGV0IGFkZHJlc3NTcGFjZUNvbnN1bWVkID0gZmFsc2U7CisgICAgICAgIGlmICh0b2tlbiA9IHRy
eUNvbnN1bWUoLi4uYWRkcmVzc1NwYWNlcykpCisgICAgICAgICAgICBhZGRyZXNzU3BhY2UgPSB0
b2tlbi50ZXh0OworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRl
bnRpZmllciIpOworICAgICAgICBsZXQgdHlwZUFyZ3VtZW50cyA9IHBhcnNlVHlwZUFyZ3VtZW50
cygpOworICAgICAgICBsZXQgdHlwZSA9IG5ldyBUeXBlUmVmKG5hbWUub3JpZ2luLCBuYW1lLnRl
eHQsIHR5cGVBcmd1bWVudHMpOworICAgICAgICAKKyAgICAgICAgZnVuY3Rpb24gZ2V0QWRkcmVz
c1NwYWNlKCkKKyAgICAgICAgeworICAgICAgICAgICAgYWRkcmVzc1NwYWNlQ29uc3VtZWQgPSB0
cnVlOworICAgICAgICAgICAgaWYgKGFkZHJlc3NTcGFjZSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gYWRkcmVzc1NwYWNlOworICAgICAgICAgICAgcmV0dXJuIHRyeUNvbnN1bWUoLi4uYWRkcmVz
c1NwYWNlcyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHdoaWxlICh0b2tlbiA9IHRy
eUNvbnN1bWUoIl4iLCAiWyIpKSB7CisgICAgICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiXiIp
IHsKKyAgICAgICAgICAgICAgICB0eXBlID0gbmV3IFB0clR5cGUodG9rZW4ub3JpZ2luLCBnZXRB
ZGRyZXNzU3BhY2UoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0cnlDb25zdW1lKCJdIikpIHsK
KyAgICAgICAgICAgICAgICB0eXBlID0gbmV3IEFycmF5UmVmVHlwZSh0b2tlbi5vcmlnaW4sIGdl
dEFkZHJlc3NTcGFjZSgpLCB0eXBlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVR5cGUo
dG9rZW4ub3JpZ2luLCB0eXBlLCBwYXJzZUNvbnN0ZXhwcigpKTsKKyAgICAgICAgICAgIGNvbnN1
bWUoIl0iKTsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGFkZHJlc3NTcGFjZSAm
JiAhYWRkcmVzc1NwYWNlQ29uc3VtZWQpCisgICAgICAgICAgICBsZXhlci5mYWlsKCJBZGRyZXNz
IHNwYWNlIHNwZWNpZmllZCBmb3IgdHlwZSB0aGF0IGRvZXMgbm90IG5lZWQgYWRkcmVzcyBzcGFj
ZSIpOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIHBhcnNlVHlwZURlZigpCisgICAgeworICAgICAgICBsZXQgb3JpZ2luID0gY29uc3Vt
ZSgidHlwZSIpLm9yaWdpbjsKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRp
ZmllciIpLnRleHQ7CisgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHBhcnNlVHlwZVBhcmFt
ZXRlcnMoKTsKKyAgICAgICAgY29uc3VtZSgiPSIpOworICAgICAgICBsZXQgdHlwZSA9IHBhcnNl
VHlwZSgpOworICAgICAgICBjb25zdW1lKCI7Iik7CisgICAgICAgIHJldHVybiBuZXcgVHlwZURl
ZihvcmlnaW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gZ2VuZXJpY1BhcnNlTGVmdCh0ZXh0cywgbmV4dFBhcnNlciwgY29uc3RydWN0b3Ip
CisgICAgeworICAgICAgICBsZXQgbGVmdCA9IG5leHRQYXJzZXIoKTsKKyAgICAgICAgbGV0IHRv
a2VuOworICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1lKC4uLnRleHRzKSkKKyAgICAg
ICAgICAgIGxlZnQgPSBjb25zdHJ1Y3Rvcih0b2tlbiwgbGVmdCwgbmV4dFBhcnNlcigpKTsKKyAg
ICAgICAgcmV0dXJuIGxlZnQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTGVmdE9w
ZXJhdG9yQ2FsbCh0ZXh0cywgbmV4dFBhcnNlcikKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5l
cmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgdGV4dHMsIG5leHRQYXJzZXIsCisgICAgICAgICAg
ICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9PgorICAgICAgICAgICAgICAgIG5ldyBDYWxsRXhwcmVz
c2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBbXSwgW2xlZnQsIHJp
Z2h0XSkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNhbGxFeHByZXNzaW9uKCkK
KyAgICB7CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAg
ICAgICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAg
Y29uc3VtZSgiKCIpOworICAgICAgICBsZXQgYXJndW1lbnRMaXN0ID0gW107CisgICAgICAgIHdo
aWxlICghdGVzdCgiKSIpKSB7CisgICAgICAgICAgICBhcmd1bWVudExpc3QucHVzaChwYXJzZUV4
cHJlc3Npb24oKSk7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lKCIpIik7CisgICAgICAg
IHJldHVybiBuZXcgQ2FsbEV4cHJlc3Npb24obmFtZS5vcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVu
dHMsIGFyZ3VtZW50TGlzdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2li
bGVTdWZmaXgoKQorICAgIHsKKyAgICAgICAgbGV0IHNpbXBsZUNhc2UgPSBsZXhlci5iYWNrdHJh
Y2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICBsZXQgbGVmdCA9IHBhcnNlVGVybSgpOwor
ICAgICAgICAgICAgbGV0IHRva2VuOworICAgICAgICAgICAgd2hpbGUgKHRva2VuID0gdHJ5Q29u
c3VtZSgiKysiLCAiLS0iLCAiLiIsICItPiIsICJbIikpIHsKKyAgICAgICAgICAgICAgICBzd2l0
Y2ggKHRva2VuLnRleHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlICIrKyI6CisgICAgICAgICAg
ICAgICAgY2FzZSAiLS0iOgorICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IFN1ZmZpeENh
bGxBc3NpZ25tZW50KHRva2VuLm9yaWdpbiwgIm9wZXJhdG9yIiArIHRva2VuLnRleHQsIGxlZnQp
OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICIuIjoK
KyAgICAgICAgICAgICAgICBjYXNlICItPiI6CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tl
bi50ZXh0ID09ICItPiIpCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IERlcmVm
ZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIGxlZnQpOworICAgICAgICAgICAgICAgICAg
ICBsZWZ0ID0gbmV3IERvdEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0LCBjb25zdW1lS2lu
ZCgiaWRlbnRpZmllciIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgY2FzZSAiWyI6IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcGFyc2VF
eHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIl0iKTsKKyAgICAgICAg
ICAgICAgICAgICAgbGVmdCA9IG5ldyBJbmRleEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0
LCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoIkJhZCB0b2tlbjogIiArIHRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgfSk7CisgICAgICAgIGlm
IChzaW1wbGVDYXNlKQorICAgICAgICAgICAgcmV0dXJuIHNpbXBsZUNhc2U7CisgICAgICAgIAor
ICAgICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVzc2lvbigpOworICAgIH0KKyAgICAKKyAgICBm
dW5jdGlvbiBwYXJzZVBvc3NpYmxlUHJlZml4KCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbjsK
KyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiKysiLCAiLS0iLCAiKyIsICItIiwgIiEi
LCAifiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWxsQXNzaWdubWVudCh0b2tlbi5vcmln
aW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBwYXJzZVBvc3NpYmxlUHJlZml4KCkpOworICAg
ICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJeIikpCisgICAgICAgICAgICByZXR1cm4gbmV3
IERlcmVmZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2libGVQcmVmaXgo
KSk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIlxcIikpCisgICAgICAgICAgICBy
ZXR1cm4gbmV3IE1ha2VQdHJFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgcGFyc2VQb3NzaWJsZVBy
ZWZpeCgpKTsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiJiIpKQorICAgICAgICAg
ICAgcmV0dXJuIG5ldyBNYWtlQXJyYXlSZWZFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgcGFyc2VQ
b3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlUG9zc2libGVTdWZmaXgoKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVByb2R1Y3QoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIioiLCAiLyIsICIlIl0sIHBh
cnNlUG9zc2libGVQcmVmaXgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3Np
YmxlU3VtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyIr
IiwgIi0iXSwgcGFyc2VQb3NzaWJsZVByb2R1Y3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlv
biBwYXJzZVBvc3NpYmxlU2hpZnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9w
ZXJhdG9yQ2FsbChbIjw8IiwgIj4+Il0sIHBhcnNlUG9zc2libGVTdW0pOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEluZXF1YWxpdHkoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIjwiLCAiPiIsICI8PSIsICI9
PiJdLCBwYXJzZVBvc3NpYmxlU2hpZnQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJz
ZVBvc3NpYmxlUmVsYXRpb25hbEVxdWFsaXR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5l
cmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgWyI9PSIsICIhPSJdLCBwYXJzZVBvc3NpYmxlUmVs
YXRpb25hbEluZXF1YWxpdHksCisgICAgICAgICAgICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9PiB7
CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBDYWxsRXhwcmVzc2lvbih0b2tlbi5v
cmlnaW4sICJvcGVyYXRvcj09IiwgW10sIFtsZWZ0LCByaWdodF0pOworICAgICAgICAgICAgICAg
IGlmICh0b2tlbi50ZXh0ID09ICIhPSIpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5l
dyBDYWxsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvciEiLCBbXSwgW3Jlc3VsdF0p
OworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KTsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VBbmQoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIiYiXSwgcGFyc2VQb3NzaWJsZVJl
bGF0aW9uYWxFcXVhbGl0eSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2li
bGVCaXR3aXNlWG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNh
bGwoWyJeIl0sIHBhcnNlUG9zc2libGVCaXR3aXNlQW5kKTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VPcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFy
c2VMZWZ0T3BlcmF0b3JDYWxsKFsifCJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZVhvcik7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTGVmdExvZ2ljYWxFeHByZXNzaW9uKHRleHRzLCBu
ZXh0UGFyc2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNQYXJzZUxlZnQoCisgICAg
ICAgICAgICB0ZXh0cywgbmV4dFBhcnNlciwKKyAgICAgICAgICAgICh0b2tlbiwgbGVmdCwgcmln
aHQpID0+IG5ldyBMb2dpY2FsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHRva2VuLnRleHQsIGxl
ZnQsIHJpZ2h0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVMb2dp
Y2FsQW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lv
bihbIiYmIl0sIHBhcnNlUG9zc2libGVCaXR3aXNlT3IpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVBvc3NpYmxlTG9naWNhbE9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJz
ZUxlZnRMb2dpY2FsRXhwcmVzc2lvbihbInx8Il0sIHBhcnNlUG9zc2libGVMb2dpY2FsQW5kKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVRlcm5hcnlDb25kaXRpb25h
bCgpCisgICAgeworICAgICAgICBsZXQgcHJlZGljYXRlID0gcGFyc2VQb3NzaWJsZUxvZ2ljYWxP
cigpOworICAgICAgICBsZXQgb3BlcmF0b3IgPSB0cnlDb25zdW1lKCI/Iik7CisgICAgICAgIGlm
ICghb3BlcmF0b3IpCisgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlOworICAgICAgICByZXR1
cm4gbmV3IFRlcm5hcnlFeHByZXNzaW9uKG9wZXJhdG9yLm9yaWdpbiwgcHJlZGljYXRlLCBwYXJz
ZVBvc3NpYmxlQXNzaWdubWVudCgpLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpKTsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQobW9kZSkKKyAgICB7
CisgICAgICAgIGxldCBsaHMgPSBwYXJzZVBvc3NpYmxlVGVybmFyeUNvbmRpdGlvbmFsKCk7Cisg
ICAgICAgIGxldCBvcGVyYXRvciA9IHRyeUNvbnN1bWUoIj0iLCAiKz0iLCAiLT0iLCAiKj0iLCAi
Lz0iLCAiJT0iLCAiXj0iLCAifD0iLCAiJj0iKTsKKyAgICAgICAgaWYgKCFvcGVyYXRvcikgewor
ICAgICAgICAgICAgaWYgKG1vZGUgPT0gInJlcXVpcmVkIikKKyAgICAgICAgICAgICAgICBsZXhl
ci5mYWlsKCJFeHBlY3RlZCBhc3NpZ25tZW50Iik7CisgICAgICAgICAgICByZXR1cm4gbGhzOwor
ICAgICAgICB9CisgICAgICAgIGlmIChvcGVyYXRvci50ZXh0ID09ICI9IikKKyAgICAgICAgICAg
IHJldHVybiBuZXcgQXNzaWdubWVudChvcGVyYXRvci5vcmlnaW4sIGxocywgcGFyc2VQb3NzaWJs
ZUFzc2lnbm1lbnQoKSk7CisgICAgICAgIGxldCBuYW1lID0gIm9wZXJhdG9yIiArIG9wZXJhdG9y
LnRleHQuc3Vic3RyaW5nKDAsIHRlcm0ub3BlcmF0b3IubGVuZ3RoIC0gMSk7CisgICAgICAgIHJl
dHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQob3BlcmF0b3Iub3JpZ2luLCBuYW1lLCBsaHMsIHBhcnNl
UG9zc2libGVBc3NpZ25tZW50KCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUFz
c2lnbm1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlUG9zc2libGVBc3NpZ25tZW50
KCJyZXF1aXJlZCIpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUVmZmVjdGZ1bEV4
cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgbGV0IGFzc2lnbm1lbnQgPSBsZXhlci5iYWNrdHJh
Y2tpbmdTY29wZSgoKSA9PiB7IHJldHVybiBwYXJzZUFzc2lnbm1lbnQoKTsgfSk7CisgICAgICAg
IGlmIChhc3NpZ25tZW50KQorICAgICAgICAgICAgcmV0dXJuIGFzc2lnbm1lbnQ7CisgICAgICAg
IHJldHVybiBwYXJzZUNhbGxFeHByZXNzaW9uKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IGdlbmVyaWNQYXJzZUNvbW1hRXhwcmVzc2lvbihmaW5hbEV4cHJlc3Npb25QYXJzZXIpCisgICAg
eworICAgICAgICBsZXQgbGlzdCA9IFtdOworICAgICAgICBsZXQgb3JpZ2luID0gbGV4ZXIucGVl
aygpOworICAgICAgICBpZiAoIW9yaWdpbikKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhw
ZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKyAgICAgICAgb3JpZ2luID0gb3JpZ2luLm9yaWdpbjsKKyAg
ICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgbGV0IGVmZmVjdGZ1bEV4cHJlc3Npb24gPSBs
ZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7IHJldHVybiBwYXJzZUVmZmVjdGZ1bEV4cHJl
c3Npb24oKTsgfSk7CisgICAgICAgICAgICBpZiAoIWVmZmVjdGZ1bEV4cHJlc3Npb24pIHsKKyAg
ICAgICAgICAgICAgICBsaXN0LnB1c2goZmluYWxFeHByZXNzaW9uUGFyc2VyKCkpOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5wdXNoKGVm
ZmVjdGZ1bEV4cHJlc3Npb24pOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisg
ICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDb21t
YUV4cHJlc3Npb24ob3JpZ2luLCBsaXN0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFy
c2VDb21tYUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNQYXJzZUNv
bW1hRXhwcmVzc2lvbihwYXJzZVBvc3NpYmxlQXNzaWdubWVudCk7CisgICAgfQorICAgIAorICAg
IGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VD
b21tYUV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VBc3NpZ25t
ZW50U3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBnZW5lcmljUGFyc2VD
b21tYUV4cHJlc3Npb24ocGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKTsKKyAgICAgICAgY29uc3Vt
ZSgiOyIpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlv
biBwYXJzZVJldHVybigpCisgICAgeworICAgICAgICBjb25zdW1lKCJyZXR1cm4iKTsKKyAgICAg
ICAgcmV0dXJuIHBhcnNlRXhwcmVzc2lvbigpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZVN0YXRlbWVudCgpCisgICAgeworICAgICAgICBsZXQgdG9rZW4gPSBsZXhlci5wZWVrKCk7
CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICI7IikgeworICAgICAgICAgICAgbGV4ZXIubmV4
dCgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRv
a2VuLnRleHQgPT0gInJldHVybiIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VSZXR1cm4oKTsK
KyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImJyZWFrIikKKyAgICAgICAgICAgIHJldHVybiBw
YXJzZUJyZWFrKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJjb250aW51ZSIpCisgICAg
ICAgICAgICByZXR1cm4gcGFyc2VDb250aW51ZSgpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9
PSAid2hpbGUiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlV2hpbGUoKTsKKyAgICAgICAgaWYg
KHRva2VuLnRleHQgPT0gImRvIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZURvKCk7CisgICAg
ICAgIGlmICh0b2tlbi50ZXh0ID09ICJmb3IiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlRm9y
KCk7CisgICAgICAgIGxldCBjb21tYUV4cHJlc3Npb24gPSBsZXhlci5iYWNrdHJhY2tpbmdTY29w
ZSgoKSA9PiB7IHJldHVybiBwYXJzZUFzc2lnbm1lbnRTdGF0ZW1lbnQoKTsgfSk7CisgICAgICAg
IGlmIChjb21tYUV4cHJlc3Npb24pCisgICAgICAgICAgICByZXR1cm4gY29tbWFFeHByZXNzaW9u
OworICAgICAgICByZXR1cm4gcGFyc2VWYXJpYWJsZURlY2woKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VCbG9jaygpCisgICAgeworICAgICAgICBsZXQgb3JpZ2luID0gY29uc3Vt
ZSgieyIpLm9yaWdpbjsKKyAgICAgICAgbGV0IGJsb2NrID0gbmV3IEJsb2NrKG9yaWdpbik7Cisg
ICAgICAgIHdoaWxlICghdGVzdCgifSIpKSB7CisgICAgICAgICAgICBsZXQgc3RhdGVtZW50ID0g
cGFyc2VTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQpCisgICAgICAgICAg
ICAgICAgYmxvY2sucHVzaChzdGF0ZW1lbnQpOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWUo
In0iKTsKKyAgICAgICAgcmV0dXJuIGJsb2NrOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZUZ1bmNEZWYoKQorICAgIHsKKyAgICAgICAgbGV0IHJldHVyblR5cGUgPSBwYXJzZVR5cGUo
KTsKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpLnRleHQ7Cisg
ICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAg
ICAgY29uc3VtZSgiKCIpOworICAgICAgICBsZXQgcGFyYW1ldGVycyA9IFtdOworICAgICAgICB3
aGlsZSAoIXRlc3QoIikiKSkgeworICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKHBhcnNlUGFy
YW1ldGVyKCkpOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgiKSIpOworICAgICAgICBs
ZXQgYmxvY2sgPSBwYXJzZUJsb2NrKCk7CisgICAgICAgIHJldHVybiBGdW5jRGVmKHJldHVyblR5
cGUub3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycywg
Ym9keSk7CisgICAgfQorICAgIAorICAgIGZvciAoOzspIHsKKyAgICAgICAgbGV0IHRva2VuID0g
bGV4ZXIucGVlaygpOworICAgICAgICBpZiAoIXRva2VuKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiOyIpCisgICAgICAgICAgICBsZXhlci5uZXh0KCk7
CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gInR5cGUiKQorICAgICAgICAgICAgcGFy
c2VUeXBlRGVmKCk7CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gIm5hdGl2ZSIpCisg
ICAgICAgICAgICBwYXJzZU5hdGl2ZVR5cGUoKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4
dCA9PSAic3RydWN0IikKKyAgICAgICAgICAgIHBhcnNlU3RydWN0VHlwZSgpOworICAgICAgICBl
bHNlIGlmICh0b2tlbi50ZXh0ID09ICJlbnVtIikKKyAgICAgICAgICAgIHBhcnNlRW51bSgpOwor
ICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJwcm90b2NvbCIpCisgICAgICAgICAgICBw
YXJzZVByb3RvY29sRGVjbCgpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJzZUZ1bmNE
ZWYoKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ByZXBhcmUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJlcGFyZS5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9QcmVwYXJlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworZnVuY3Rpb24gcHJlcGFyZShvcmlnaW4sIHRleHQpCit7CisgICAgbGV0IHBy
b2dyYW0gPSBuZXcgUHJvZ3JhbSgpOworICAgIHBhcnNlKHByb2dyYW0sIG9yaWdpbiwgdGV4dCk7
CisgICAgcmVzb2x2ZU5hbWVzKHByb2dyYW0pOworICAgIHJlc29sdmVUeXBlRGVmcyhwcm9ncmFt
KTsKKyAgICBjaGVjayhwcm9ncmFtKTsKKyAgICBpbmxpbmUocHJvZ3JhbSk7CisgICAgcmV0dXJu
IHByb2dyYW07Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzMg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKCkK
KyAgICB7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50cyA9IFtdOworICAgICAgICB0
aGlzLl9mdW5jdGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVzID0gbmV3IE1h
cCgpOworICAgICAgICB0aGlzLl9mdW5jSW5zdGFudGlhdG9yID0gbmV3IEZ1bmNJbnN0YW50aWF0
b3IoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHRvcExldmVsU3RhdGVtZW50cygpIHsgcmV0dXJu
IHRoaXMuX3RvcExldmVsU3RhdGVtZW50czsgfQorICAgIGdldCBmdW5jdGlvbnMoKSB7IHJldHVy
biB0aGlzLl9mdW5jdGlvbnM7IH0KKyAgICBnZXQgdHlwZXMoKSB7IHJldHVybiB0aGlzLl90eXBl
czsgfQorICAgIGdldCBmdW5jSW5zdGFudGlhdG9yKCkgeyByZXR1cm4gdGhpcy5fZnVuY0luc3Rh
bnRpYXRvcjsgfQorICAgIAorICAgIGFkZFRvcExldmVsU3RhdGVtZW50KHN0YXRlbWVudCkKKyAg
ICB7CisgICAgICAgIHN0YXRlbWVudC5wcm9ncmFtID0gdGhpczsKKyAgICAgICAgaWYgKHN0YXRl
bWVudCBpbnN0YW5jZW9mIEZ1bmMpIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IHRoaXMuX2Z1
bmN0aW9ucy5nZXQoc3RhdGVtZW50Lm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAg
ICAgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbnMuc2V0KHN0YXRlbWVudC5uYW1lLCBhcnJheSA9
IFtdKTsKKyAgICAgICAgICAgIGFycmF5LnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfSBlbHNl
IGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAgdGhpcy5fdHlwZXMu
c2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAg
ICB0aHJvdyBuZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlvbiBvciB0eXBlOiAi
ICsgc3RhdGVtZW50KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzLnB1c2goc3Rh
dGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVzb2x2ZUZ1bmNPdmVybG9hZChuYW1lLCB0eXBl
QXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKQorICAgIHsKKyAgICAgICAgbGV0IGZ1bmN0aW9ucyA9
IHRoaXMuZnVuY3Rpb25zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisgICAg
ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXNvbHZlT3Zl
cmxvYWRJbXBsKGZ1bmN0aW9ucywgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAg
fQorICAgIAorICAgIGdldCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0
ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiB0aGlz
LnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50KTsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1Byb3RvY29sLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29s
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2wgZXh0ZW5kcyBO
b2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0aGlz
Ll9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0KKyAg
ICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5h
bWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBQcm90
b2NvbDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
Lm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xEZWNsIGV4dGVuZHMgUHJv
dG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHN1
cGVyKG9yaWdpbiwgbmFtZSkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdOworICAgICAg
ICB0aGlzLl9zaWduYXR1cmVNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVWYXJp
YWJsZSA9IG5ldyBUeXBlVmFyaWFibGUob3JpZ2luLCBuYW1lLCBudWxsKTsKKyAgICB9CisgICAg
CisgICAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAgICAgIC8vIE5PVEU6IEFu
eSB0eXBlIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIHNpZ25hdHVyZSBtdXN0IGJlIGluZmVyYWJs
ZSBmcm9tIHRoZSB2YWx1ZQorICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAgICAgICAvLyBGSVhN
RTogQ2hlY2sgdGhpcyEgKE9PUFMhKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2goc2ln
bmF0dXJlKTsKKyAgICAgICAgbGV0IG92ZXJsb2FkcyA9IHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQo
c2lnbmF0dXJlLm5hbWUpOworICAgICAgICBpZiAoIW92ZXJsb2FkcykKKyAgICAgICAgICAgIHRo
aXMuX3NpZ25hdHVyZU1hcC5zZXQoc2lnbmF0dXJlLm5hbWUsIG92ZXJsb2FkcyA9IFtdKTsKKyAg
ICAgICAgb3ZlcmxvYWRzLnB1c2goc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHNp
Z25hdHVyZXMoKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVzOyB9CisgICAgc2lnbmF0dXJlc0J5
TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVNYXAuZ2V0KG5hbWUpOyB9CisgICAg
Z2V0IHR5cGVWYXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGVWYXJpYWJsZTsgfQorICAgIAor
ICAgIHNpZ25hdHVyZXNCeU5hbWVXaXRoVHlwZVZhcmlhYmxlKG5hbWUsIHR5cGVWYXJpYWJsZSkK
KyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3RpdHV0aW9uKFt0aGlz
LnR5cGVWYXJpYWJsZV0sIFt0eXBlVmFyaWFibGVdKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRo
aXMuc2lnbmF0dXJlc0J5TmFtZShuYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAgICAg
ICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoc2lnbmF0dXJlID0+
IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICB9CisgICAgCisgICAgaW5oZXJp
dHMob3RoZXJQcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghb3RoZXJQcm90b2NvbCkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyUHJvdG9j
b2wgaW5zdGFuY2VvZiBQcm90b2NvbFJlZikKKyAgICAgICAgICAgIG90aGVyUHJvdG9jb2wgPSBv
dGhlclByb3RvY29sLnByb3RvY29sRGVjbDsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0IG90
aGVyU2lnbmF0dXJlIG9mIG90aGVyUHJvdG9jb2wuc2lnbmF0dXJlcykgeworICAgICAgICAgICAg
bGV0IHNpZ25hdHVyZXMgPSB0aGlzLnNpZ25hdHVyZXNCeU5hbWUob3RoZXJTaWduYXR1cmUubmFt
ZSk7CisgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICAgICAgbGV0IG92ZXJsb2FkID0gcmVzb2x2ZU92ZXJsb2FkSW1wbChz
aWduYXR1cmVzLCBbXSwgb3RoZXJTaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAgICAg
ICAgaWYgKCFvdmVybG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0KKyAgICAgICAgICAgICAgICBvdmVybG9h
ZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAg
ICAgICAgIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250
ZXh0KTsKKyAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhvdGhl
clNpZ25hdHVyZS5yZXR1cm5UeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGhhc0hlaXIo
dHlwZSkKKyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24ubWFw
cGluZyhbdGhpcy5fdHlwZVZhcmlhYmxlXSwgW3R5cGVdKTsKKyAgICAgICAgZm9yIChsZXQgYWJz
dHJhY3RTaWduYXR1cmUgb2YgdGhpcy5fc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNp
Z25hdHVyZSA9IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pOworICAgICAgICAgICAgbGV0
IG92ZXJsb2FkID0gdGhpcy5wcm9ncmFtLnJlc29sdmVGdW5jT3ZlcmxvYWQoc2lnbmF0dXJlLm5h
bWUsIFtdLCBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAgICAgICAgaWYgKCFvdmVy
bG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAgICAg
ICAgICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPSBvdmVybG9hZC5mdW5jLnJldHVyblR5
cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAgb3ZlcmxvYWQuZnVu
Yy50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAg
ICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhzaWduYXR1cmUucmV0dXJuVHlw
ZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gInByb3RvY29sICIgKyB0aGlzLm5hbWUgKyAiIHsgIiArIHRoaXMuc2lnbmF0dXJlcy5q
b2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQorCisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb3RvY29sUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29s
UmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xSZWYg
ZXh0ZW5kcyBQcm90b2NvbCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsK
KyAgICAgICAgc3VwZXIob3JpZ2luLCBuYW1lKTsKKyAgICAgICAgdGhpcy5wcm90b2NvbERlY2wg
PSBudWxsOworICAgIH0KKyAgICAKKyAgICBpbmhlcml0cyhvdGhlcikKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLnByb3RvY29sRGVjbC5pbmhlcml0cyhvdGhlcik7CisgICAgfQorICAgIAor
ICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVj
bC5oYXNIZWlyKHR5cGUpOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5
cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHRyVHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5cGUg
eworICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAg
ICAgaWYgKCFvdGhlciBpbnN0YW5jZW9mIFB0clR5cGUpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5
cGUgKyAiXiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VU
eXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJlZmVyZW5jZVR5cGUgZXh0
ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFkZHJlc3NTcGFjZSwgZWxlbWVu
dFR5cGUpCisgICAgeworICAgICAgICB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2Up
OworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2FkZHJlc3NT
cGFjZSA9IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50
VHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBhZGRyZXNzU3BhY2UoKSB7IHJldHVybiB0aGlzLl9hZGRyZXNzU3BhY2U7
IH0KKyAgICBnZXQgZWxlbWVudFR5cGUoKSB7IHJldHVybiB0aGlzLl9lbGVtZW50VHlwZTsgfQor
ICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1Jlc29sdmVOYW1lcy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9SZXNvbHZlTmFtZXMuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
UmVzb2x2ZU5hbWVzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVu
Y3Rpb24gcmVzb2x2ZU5hbWVzKHByb2dyYW0pCit7CisgICAgcHJvZ3JhbS52aXNpdChuZXcgTmFt
ZVJlc29sdmVyKCkpOworfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU92ZXJsb2Fk
SW1wbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlT3ZlcmxvYWRJ
bXBsLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVPdmVybG9h
ZEltcGwuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitmdW5jdGlvbiBy
ZXNvbHZlT3ZlcmxvYWRJbXBsKGZ1bmN0aW9ucywgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBl
cykKK3sKKyAgICBmb3IgKGxldCBmdW5jIG9mIGZ1bmN0aW9ucykgeworICAgICAgICBpZiAodHlw
ZUFyZ3VtZW50cy5sZW5ndGggJiYgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gZnVuYy50eXBlUGFy
YW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGFyZ3Vt
ZW50VHlwZXMubGVuZ3RoICE9IGZ1bmMucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlv
bkNvbnRleHQoZnVuYy50eXBlUGFyYW1ldGVycyk7CisgICAgICAgIGxldCBvayA9IHRydWU7Cisg
ICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgewor
ICAgICAgICAgICAgbGV0IGFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpXTsKKyAgICAgICAgICAg
IGxldCBwYXJhbWV0ZXIgPSBmdW5jLnR5cGVQYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgaWYg
KCFhcmd1bWVudC51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHBhcmFtZXRlcikpIHsKKyAgICAg
ICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAg
ICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7
CisgICAgICAgICAgICBpZiAoIWFyZ3VtZW50VHlwZXNbaV0udW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBmdW5jLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZh
bHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIGlmICghb2spCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCF1bmlm
aWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
bGV0IHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cyA9ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAg
ICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1
bWVudHMgPSBbXTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBmdW5jLnR5cGVQ
YXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdW5pZmljYXRpb25D
b250ZXh0LmZpbmQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50
ID09IHR5cGVQYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNob3VsZEJ1
aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnB1c2godHlw
ZUFyZ3VtZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIHJldHVybiB7ZnVuYywgdW5pZmljYXRpb25Db250ZXh0LCB0eXBlQXJn
dW1lbnRzfTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG51bGw7Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9SZXNvbHZlVHlwZURlZnMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvUmVzb2x2ZVR5cGVEZWZzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1Jlc29sdmVUeXBlRGVmcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2Z1bmN0aW9uIHJlc29sdmVUeXBlRGVmcyhwcm9ncmFtKQoreworICAgIHByb2dyYW0udmlz
aXQobmV3IFR5cGVEZWZSZXNvbHZlcigpKTsKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
UmV0dXJuLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4uanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXR1cm4gZXh0ZW5kcyBOb2RlIHsKKyAgICBj
b25zdHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0g
b3JpZ2luOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBn
ZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IHZhbHVlKCkgeyBy
ZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAg
IH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybkV4Y2VwdGlvbi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXR1cm5FeGNlcHRpb24uanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuRXhjZXB0aW9uLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV0dXJuRXhjZXB0aW9uIHsKKyAgICBj
b25zdHJ1Y3Rvcih2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7Cisg
ICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9Cit9Cklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9SZXdyaXRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9SZXdyaXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBSZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFw
cGluZyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgX21hcChvbGRJdGVtLCBuZXdJdGVt
KQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwcGluZy5zZXQob2xkSXRlbSwgbmV3SXRlbSk7Cisg
ICAgICAgIHJldHVybiBuZXdJdGVtOworICAgIH0KKyAgICAKKyAgICBfZ2V0TWFwcGluZyhvbGRJ
dGVtKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX21hcHBpbmcuZ2V0KG9sZEl0
ZW0pOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICAgICAgcmV0dXJuIG9sZEl0ZW07CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBu
b2RlLnJldHVyblR5cGUudmlzaXQodGhpcyksCisgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0
ZXJzLm1hcCh0eXBlUGFybWV0ZXIgPT4gdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKSksCisgICAg
ICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQo
dGhpcykpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jUGFyYW1ldGVyKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEZ1bmNQYXJhbWV0ZXIobm9kZS5uYW1lLCBub2Rl
LnR5cGUudmlzaXQodGhpcykpOworICAgICAgICB0aGlzLl9tYXAobm9kZSwgcmVzdWx0KTsKKyAg
ICAgICAgcmVzdWx0LmxWYWx1ZSA9IG5vZGUubFZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0
OworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBsZXQg
cmVzdWx0ID0gbmV3IEJsb2NrKG5vZGUub3JpZ2luKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVt
ZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50
LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAg
dmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAg
fQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3Vs
dCA9IG5ldyBUeXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3VtZW50
cy5tYXAodHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSkpOworICAgICAg
ICByZXN1bHQudHlwZSA9IG5vZGUudHlwZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVy
biBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9k
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29uc3RleHByVHlwZVBhcmFtZXRlcihub2Rl
Lm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkKG5v
ZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAg
IAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5l
dyBub2RlLmNvbnN0cnVjdG9yKG5vZGUucm9naWluLCBub2RlLmFkZHJlc3NTcGFjZSwgbm9kZS5l
bGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHRyVHlwZShu
b2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlwZShub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheVR5
cGUobm9kZS5vcmlnaW4sIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcg
QXNzaWdubWVudChub2RlLm9yaWdpbiwgbm9kZS5saHMudmlzaXQodGhpcyksIG5vZGUucmhzLnZp
c2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAg
IHsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHRoaXMuX2dldE1hcHBpbmcobm9kZS52YXJpYWJs
ZSk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihu
b2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4obm9kZS5vcmlnaW4sIG5vZGUu
dmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAgIAorICAg
IHZpc2l0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAg
fQorCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJl
c3VsdCA9IG5ldyBDYWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgIG5vZGUub3JpZ2luLCBub2Rl
Lm5hbWUsCisgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9
PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5hcmd1bWVudGxp
c3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgICAgIGxldCBh
Y3R1YWxUeXBlQXJndW1lbnRzID0gbm9kZS5hY3R1YWxUeXBlQXJndW1lbnRzOworICAgICAgICBp
ZiAoYWN0dWFsVHlwZUFyZ3VtZW50cykgeworICAgICAgICAgICAgcmVzdWx0LmFjdHVhbFR5cGVB
cmd1bWVudHMgPQorICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVBcmd1bWVudHMubWFwKGFjdHVh
bFR5cGVBcmd1bWVudCA9PiBhY3R1YWxUeXBlQXJndW1lbnQudmlzaXQodGhpcykpOworICAgICAg
ICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rp
b25MaWtlQmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25MaWtl
QmxvY2soCisgICAgICAgICAgICBub2RlLm9yaWdpbiwKKyAgICAgICAgICAgIG5vZGUuYXJndW1l
bnRMaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSksCisgICAgICAgICAg
ICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykp
LAorICAgICAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpKTsKKyAgICB9Cit9CisKSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvU3RydWN0VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9TdHJ1Y3RUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgU3RydWN0VHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFt
ZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47
CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVy
cyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9maWVsZHMgPSBuZXcgTWFwKCk7Cisg
ICAgfQorICAgIAorICAgIGFkZChmaWVsZCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9maWVs
ZHMuaGFzKGZpZWxkLm5hbWUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKGZp
ZWxkLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJEdXBsaWNhdGUgZmllbGQgbmFtZTogIiArIGZpZWxk
Lm5hbWUpOworICAgICAgICB0aGlzLl9maWVsZHMuc2V0KGZpZWxkLm5hbWUsIGZpZWxkKTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0
IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICAK
KyAgICBnZXQgZmllbGROYW1lcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy5rZXlzKCk7IH0KKyAg
ICBmaWVsZEJ5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9maWVsZHMuZ2V0KG5hbWUpOyB9Cisg
ICAgZ2V0IGZpZWxkcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy52YWx1ZXMoKTsgfQorICAgIGdl
dCBmaWVsZE1hcCgpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkczsgfQorICAgIGdldCBpc1ByaW1pdGl2
ZSgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChsZXQg
ZmllbGQgb2YgdGhpcy5maWVsZHMpCisgICAgICAgICAgICByZXN1bHQgJj0gZmllbGQudHlwZS5p
c1ByaW1pdGl2ZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZ2V0
IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgTmFtZUNvbnRl
eHQoKTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiB0aGlzLnR5cGVQYXJhbWV0
ZXJzKQorICAgIH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsK
KyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMu
bGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5T
dHJpbmcsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIp
OworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KCk7
CisgICAgICAgIAorICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLm1hcHBp
bmcodGhpcy50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIGxldCByZXN1
bHQgPSBuZXcgU3RydWN0VHlwZSh0aGlzLm9yaWdpbiwgdGhpcy5uYW1lLCBbXSk7CisgICAgICAg
IGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChm
aWVsZC52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJzdHJ1Y3QgIiAr
IHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPiB7ICIgKyBBcnJheS5m
cm9tKHRoaXMuZmllbGRzKS5qb2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9TdWJzdGl0dXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAq
IENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgor
ICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0
aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhh
dCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1
dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9k
dWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50
YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRp
b24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMg
SVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNI
QU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBE
SVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVU
T1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJ
QUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S
IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNT
IElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJ
QUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAor
ICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZ
IE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0Yg
VEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitj
bGFzcyBTdWJzdGl0dXRpb24gZXh0ZW5kcyBSZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IobWFw
KQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbWFwOworICAgIH0KKyAgICAKKyAgICBzdGF0
aWMgbWFwcGluZyhwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3QpCisgICAgeworICAgICAgICBpZiAo
cGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRMaXN0Lmxlbmd0aCkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBhbmQgYXJndW1lbnRzIGFyZSBtaXNtYXRjaGVkIik7
CisgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBp
IDwgcGFyYW1ldGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgICAgIG1hcC5zZXQocGFyYW1ldGVy
c1tpXSwgYXJndW1lbnRMaXN0W2ldKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJzdGl0dXRpb24o
bWFwKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0KG5vZGUudHlwZSk7CisgICAgICAgIGlm
IChyZXBsYWNlbWVudCkgeworICAgICAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5n
dGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIHR5cGUgYXJn
dW1lbnRzIG9uIHR5cGUgdmFyaWFibGUiKTsKKyAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVu
dDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0VHlwZVJl
Zihub2RlKTsKKyAgICB9CisKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAg
ICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0KG5vZGUudmFyaWFibGUpOworICAg
ICAgICBpZiAocmVwbGFjZW1lbnQpCisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7Cisg
ICAgICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRWYXJpYWJsZVJlZihub2RlKTsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1ZmZpeENhbGxBc3NpZ25tZW50Lmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N1ZmZpeENhbGxBc3NpZ25tZW50Lmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N1ZmZpeENhbGxBc3NpZ25tZW50
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgU3VmZml4Q2Fs
bEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4s
IG5hbWUsIGxocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMu
X25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9saHMgPSBsaHM7CisgICAgICAgIHRoaXMuZnVu
YyA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFt
ZTsgfQorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlzLl9saHM7IH0KKyAgICAKKyAgICB0b1N0
cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMgKyAiIHN1ZmZpeCAiICsgdGhp
cy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBUeXBlIGV4dGVuZHMgTm9kZSB7CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkg
eyByZXR1cm4gW107IH0KKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIFR5cGU7IH0KKyAgICAKKyAg
ICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHJldHVybiBwcm90b2NvbC5oYXNI
ZWlyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpIHsgcmV0
dXJuIHRoaXM7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBUeXBlRGVmIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRo
aXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX3R5cGUg
PSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5
cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQg
dHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvVHlwZURlZlJlc29sdmVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5
cGVEZWZSZXNvbHZlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBl
RGVmUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBUeXBlRGVmUmVzb2x2ZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICBjb25zdHJ1Y3RvcigpCisg
ICAgeworICAgICAgICB0aGlzLl92aXNpdGluZyA9IG5ldyBWaXNpdGluZ1NldCgpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Zpc2l0
aW5nLmRvVmlzaXQobm9kZSwgKCkgPT4geworICAgICAgICAgICAgc3VwZXIudmlzaXRUeXBlUmVm
KG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUudHlwZSBpbnN0YW5jZW9mIFR5cGVEZWYpIHsK
KyAgICAgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9u
Q29udGV4dChub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgICAgIGlmIChu
b2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlwZS50eXBlUGFyYW1ldGVycy5sZW5n
dGgpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYXJndW1lbnQvcGFyYW1l
dGVyIG1pc21hdGNoIChzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBlYXJsaWVyKSIpOworICAgICAg
ICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aDsg
KytpKQorICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5p
ZmljYXRpb25Db250ZXh0LCBub2RlLnR5cGUudHlwZVBhcmFtZXRlcnNbaV0pOworICAgICAgICAg
ICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgpKQorICAgICAgICAgICAgICAg
ICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlw
ZSByZWZlcmVuY2UgdG8gYSB0eXBlIGRlZmluaXRpb24gdmlvbGF0ZXMgcHJvdG9jb2wgY29uc3Ry
YWludHMiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICBsZXQgbmV3VHlwZSA9
IG5vZGUudHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihub2RlLnR5cGUudHlwZVBhcmFtZXRl
cnMsIHVuaWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICAgICAgbmV3VHlwZS52aXNpdCh0
aGlzKTsKKyAgICAgICAgICAgICAgICBub2RlLnNldFR5cGVBbmRBcmd1ZW1udHMobmV3VHlwZSwg
W10pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIFR5cGVPclZhcmlhYmxlUmVmIGV4dGVuZHMgTm9kZSB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3Jp
Z2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9y
aWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4g
dGhpcy5fbmFtZTsgfQorCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNl
IHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl9vcmln
aW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnR5
cGUgPSBudWxsOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsK
KyAgICB9CisgICAgCisgICAgc3RhdGljIHdyYXAodHlwZSkKKyAgICB7CisgICAgICAgIGxldCBy
ZXN1bHQgPSBuZXcgVHlwZVJlZih0eXBlLm9yaWdpbiwgdHlwZS5uYW1lLCBbXSk7CisgICAgICAg
IHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgCisg
ICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkg
eyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4g
dGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHR5
cGUgPyB0eXBlLmlzUHJpbWl0aXZlIDogZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlh
dGVkVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlLmluc3RhbnRpYXRlKHR5
cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkKKyAgICB7Cisg
ICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVy
biB0aGlzLnR5cGUudW5pZnlOb2RlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisgICAg
CisgICAgZ2V0IGRlZmF1bHRWYWx1ZSgpCisgICAgeworICAgICAgICBpZiAoIXRoaXMudHlwZUFy
Z3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLmRlZmF1bHRWYWx1
ZTsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgZ2V0IGRlZmF1bHQgdmFsdWUgb2Yg
YSB0eXBlIGluc3RhbnRpYXRpb24iKTsKKyAgICB9CisgICAgCisgICAgc2V0VHlwZUFuZEFyZ3Vt
ZW50cyh0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZSA9IHR5
cGUubmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5fdHlwZUFy
Z3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFu
Y2VvZiBUeXBlUmVmKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0
aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGgg
IT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsg
KytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8
IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9UeXBlVmFyaWFibGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlw
ZVZhcmlhYmxlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
VHlwZVZhcmlhYmxlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1l
LCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAg
ICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3Byb3RvY29sID0gcHJvdG9jb2w7
CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAg
IGdldCBwcm90b2NvbCgpIHsgcmV0dXJuIHRoaXMuX3Byb3RvY29sOyB9CisgICAgCisgICAgZ2V0
IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl9wcm90b2NvbCAmJiB0
aGlzLl9wcm90b2NvbC5pc1ByaW1pdGl2ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IGlzVW5pZmlh
YmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAg
IHsKKyAgICAgICAgaWYgKCFwcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICBpZiAoIXRoaXMucHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHByb3RvY29sKTsKKyAgICB9CisgICAg
CisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7
CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVHlwZSkpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5k
KHRoaXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAgICAgICAgICAgIHJldHVy
biByZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICAgICAgCisg
ICAgICAgIHVuaWZpY2F0aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhlcik7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0
LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVWYXJpYWJsZVVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc0FyZ3Vt
ZW50KHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVu
aWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICAKKyAgICAgICAgLy8gVGhlIHRo
aW5nIHdlIGdldCB1bmlmaWVkIHdpdGggbXVzdCBiZSBhIHR5cGUgdmFyaWFibGUgdGhhdCBhY2Nl
cHRzIGEgYnJvYWRlciBzZXQgb2YKKyAgICAgICAgLy8gdGhpbmdzIHRoYW4gd2UgZG8uCisgICAg
ICAgIGlmICghKHJlYWxUaGlzIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAg
ICAgICAgICAgcmV0dXJuICFyZWFsVGhpcy5wcm90b2NvbDsKKyAgICAgICAgCisgICAgICAgIHJl
dHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHJlYWxUaGlzLnByb3RvY29sKTsKKyAgICB9Cisg
ICAgCisgICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAg
ICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
ICAgIHJldHVybiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKS5pbmhlcml0cyh0aGlzLnBy
b3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZp
Y2F0aW9uQ29udGV4dC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNh
dGlvbkNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmlj
YXRpb25Db250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIFVuaWZpY2F0aW9uQ29udGV4dCB7CisgICAgY29uc3RydWN0b3IodHlwZVBhcmFtZXRlcnMp
CisgICAgeworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IG5ldyBTZXQodHlwZVBhcmFt
ZXRlcnMpOworICAgICAgICB0aGlzLl9uZXh0TWFwID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAK
KyAgICB1bmlvbihhLCBiKQorICAgIHsKKyAgICAgICAgYSA9IGZpbmQoYSk7CisgICAgICAgIGIg
PSBmaW5kKGIpOworICAgICAgICBpZiAoYSA9PSBiKQorICAgICAgICAgICAgcmV0dXJuOworICAg
ICAgICAKKyAgICAgICAgaWYgKCFiLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgW2EsIGJdID0g
W2IsIGFdOworICAgICAgICBpZiAoIWEuaXNVbmlmaWFibGUpCisgICAgICAgICAgICB0aHJvdyBu
ZXcgRXJyb3IoIkNhbm5vdCB1bmlmeSBub24tdW5pZmlhYmxlIHRoaW5ncyAiICsgYSArICIgYW5k
ICIgKyBiKTsKKyAgICAgICAgCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHR5cGUgcGFyYW1l
dGVycyBkb24ndCBlbmQgdXAgYmVpbmcgcm9vdHMuCisgICAgICAgIGlmIChhLmlzVW5pZmlhYmxl
ICYmIGIuaXNVbmlmaWFibGUgJiYgdGhpcy5fdHlwZVBhcmFtZXRlcnMuaGFzKGIpKQorICAgICAg
ICAgICAgW2EsIGJdID0gW2IsIGFdOworCisgICAgICAgIHRoaXMuX25leHRNYXAuc2V0KGEsIGIp
OworICAgIH0KKyAgICAKKyAgICBmaW5kKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY3VycmVu
dE5vZGUgPSBub2RlOworICAgICAgICBsZXQgbmV4dE5vZGUgPSB0aGlzLl9uZXh0TWFwLmdldChj
dXJyZW50Tm9kZSk7CisgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAgICByZXR1cm4g
Y3VycmVudE5vZGU7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGN1cnJlbnROb2Rl
ID0gbmV4dE5vZGU7CisgICAgICAgICAgICBuZXh0Tm9kZSA9IHRoaXMuX25leHRNYXAuZ2V0KGN1
cnJlbnROb2RlKTsKKyAgICAgICAgICAgIGlmICghbmV4dE5vZGUpCisgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fbmV4dE1hcC5zZXQobm9kZSwgY3VycmVu
dE5vZGUpOworICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7CisgICAgfQorICAgIAorICAgIGdl
dCBub2RlcygpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFNldCgpOworICAgICAg
ICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fbmV4dE1hcCkgeworICAgICAgICAgICAg
cmVzdWx0LmFkZChrZXkpOworICAgICAgICAgICAgcmVzdWx0LmFkZCh2YWx1ZSk7CisgICAgICAg
IH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5KCkKKyAg
ICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2YgdGhpcy5fdHlwZVBhcmFtZXRl
cnMpIHsKKyAgICAgICAgICAgIGlmICghdHlwZVBhcmFtZXRlci52ZXJpZnlBc1BhcmFtZXRlcih0
aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAg
Zm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIHRoaXMubm9kZXMpIHsKKyAgICAgICAgICAgIGlmICgh
dHlwZUFyZ3VtZW50LmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAg
ICAgICAgICAgaWYgKHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhhcyh0eXBlQXJndW1lbnQpKQorICAg
ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnQudmVy
aWZ5QXNBcmd1bWVudCh0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGlzVW51bmlmaWVk
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAhdGhpcy5fbmV4dE1hcC5zaXplKCk7CisgICAgfQor
fQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9WYWx1ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9WYWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZh
bHVlIGV4dGVuZHMgTm9kZSB7CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBWYWx1ZTsgfQorICAg
IGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIGZhbHNlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1ZhcmlhYmxlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Zhcmlh
YmxlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFy
aWFibGVSZWYgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5h
bWUpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0g
bmFtZTsKKyAgICAgICAgdGhpcy52YXJpYWJsZSA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdl
dCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsg
cmV0dXJuIHRoaXMudmFyaWFibGUuaXNDb25zdGV4cHI7IH0KKyAgICBnZXQgdW5pZnlOb2RlKCkg
eyByZXR1cm4gdGhpcy52YXJpYWJsZS51bmlmeU5vZGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygp
CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1Zpc2l0aW5nU2V0LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Zp
c2l0aW5nU2V0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
VmlzaXRpbmdTZXQgeworICAgIGNvbnN0cnVjdG9yKC4uLml0ZW1zKQorICAgIHsKKyAgICAgICAg
dGhpcy5fc2V0ID0gbmV3IFNldChpdGVtcyk7CisgICAgfQorICAgIAorICAgIGRvVmlzaXQoaXRl
bSwgY2FsbGJhY2spCisgICAgeworICAgICAgICBpZiAodGhpcy5fc2V0LmhhcyhpdGVtKSkKKyAg
ICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihpdGVtLm9yaWdpbi5vcmlnaW5TdHJpbmcs
ICJSZWN1cnNpdmUgIiArIGl0ZW0ua2luZCk7CisgICAgICAgIHRoaXMuX3NldC5hZGQoaXRlbSk7
CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKKyAgICAgICAg
fSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRoaXMuX3NldC5kZWxldGUoaXRlbSk7CisgICAgICAg
IH0KKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2OSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBWaXNpdG9yIHsKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7Cisg
ICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAg
ICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRG
dW5jKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyk7Cisg
ICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAg
ICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHBh
cmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMpCisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQo
dGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY1BhcmFtZXRlcihub2RlKQorICAgIHsK
KyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1
bmNEZWYobm9kZSkKKyAgICB7CisgICAgICAgIHZpc2l0RnVuYyhub2RlKTsKKyAgICAgICAgbm9k
ZS5ib2R5LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisg
ICAgeworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAg
ICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFBy
b3RvY29sUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVj
bChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0
dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1l
bnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0
KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7Cisg
ICAgICAgIGZvciAobGV0IHR5cGVQYXJhbXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAg
ICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRUeXBlRGVmKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9m
IG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRo
aXMpOworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZp
c2l0U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRl
ciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNp
dCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAg
ICAgICBmaWVsZC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFi
bGUobm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBhcmFt
ZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlz
aXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RWxlbWVudGFsVHlwZShub2RlKQorICAg
IHsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRQdHJUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFs
VHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkKKyAg
ICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1l
bnRhbFR5cGUobm9kZSk7CisgICAgICAgIG5vZGUubnVtRWxlbWVudHMudmlzaXQodGhpcyk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAgbm9k
ZS5saHMudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAg
ICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAgaWYgKG5vZGUudmFsdWUpCisgICAg
ICAgICAgICBub2RlLnZhbHVlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXN0SW50
TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lv
bihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIG5vZGUudHlw
ZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAg
ICAgZm9yIChsZXQgYXJndW1lbnQgb2Ygbm9kZS5hcmd1bWVudExpc3QpCisgICAgICAgICAgICBh
cmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvbkxpa2VC
bG9jayhub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgYXJndW1lbnQgb2Ygbm9kZS5hcmd1
bWVudExpc3QpCisgICAgICAgICAgICBhcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9y
IChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykKKyAgICAgICAgICAgIHBhcmFtZXRl
ci52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpOworICAgIH0KK30K
Kwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319244</attachid>
            <date>2017-08-28 21:49:30 -0700</date>
            <delta_ts>2017-08-29 09:56:49 -0700</delta_ts>
            <desc>inching forward with native functions</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>197870</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgYWRkcmVz
c1NwYWNlcyA9IFsiY29uc3RhbnQiLCAiZGV2aWNlIiwgInRocmVhZGdyb3VwIiwgInRocmVhZCJd
OworCitmdW5jdGlvbiBpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7CisgICAgc3dpdGNo
IChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2FzZSAiZGV2aWNl
IjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
K30KKworZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAg
IGlmICghaXNBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKSkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYWRkcmVzcyBzcGFjZTogIiArIGFkZHJlc3NTcGFjZSk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFzIFRbY10gZm9y
IGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1YWdlLgorY2xh
c3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0
YW5jZW9mIEFycmF5UmVmVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBpZiAodGhpcy5hZGRyZXNzU3BhY2UgIT0gInRocmVhZCIpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIg
IiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fy
cmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1F
bGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVu
dHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vs
ZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxl
bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAg
IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRvbkNvbnRleHQsIG90aGVyKQorICAgIHsK
KyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQXJyYXlSZWZUeXBlKSB7CisgICAgICAgICAg
ICBpZiAob3RoZXIuYWRkcmVzc1NwYWNlICE9ICJ0aHJlYWQiKQorICAgICAgICAgICAgICAgIHJl
dHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGlu
c3RhbmNlb2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICAKKyAgICAgICAgICAgIGlmICghdGhpcy5udW1FbGVtZW50cy51bmlmeSh1bmlmaWNh
dGlvbkNvbnRleHQsIG90aGVyLm51bUVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRU
eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9Bc3NpZ25tZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBsaHMsIHJocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7Cisg
ICAgICAgIHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgIH0K
KyAgICAKKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJocygp
IHsgcmV0dXJuIHRoaXMuX3JoczsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmxocyArICIgPSAiICsgdGhpcy5yaHM7CisgICAgfQorfTsKKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2suanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQmxvY2suanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQmxvY2su
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBCbG9jayBleHRl
bmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fc3RhdGVtZW50cyA9IFtdOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgCisg
ICAgYWRkKHN0YXRlbWVudCkKKyAgICB7CisgICAgICAgIHRoaXMuX3N0YXRlbWVudHMucHVzaChz
dGF0ZW1lbnQpOworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGVtZW50cygpIHsgcmV0dXJuIHRo
aXMuX3N0YXRlbWVudHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0K
K307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNz
aW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocywgcmhzKQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAg
IHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgICAgICB0aGlz
LmZ1bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgZ2V0IHJo
cygpIHsgcmV0dXJuIHRoaXMuX3JoczsgfSAvLyBUaGlzIGNhbiBiZSBudWxsLgorICAgIAorICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxocyArICIgIiArIHRoaXMu
bmFtZSArICh0aGlzLnJocyA/ICI9ICIgKyB0aGlzLnJocyA6ICIiKTsKKyAgICB9Cit9CisKSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQ2FsbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkK
KyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICAgICAg
dGhpcy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAgICAgICB0aGlzLmZ1bmMgPSBu
dWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0K
KyAgICBnZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZSArICI8
IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCArICIpIjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxGdW5jdGlvbi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DYWxsRnVuY3Rpb24uanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEZ1bmN0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gY2FsbEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUs
IHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkKK3sKKyAgICBmb3IgKGxldCBsVmFsdWUgb2Yg
cHJvZ3JhbS5sVmFsdWVzKQorICAgICAgICBsVmFsdWUucmVzZXQoKTsKKyAgICBsZXQgYXJndW1l
bnRUeXBlcyA9IGFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudHlwZSk7Cisg
ICAgbGV0IGZ1bmMgPSByZXNvbHZlSW5saW5lZEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUsIHR5cGVB
cmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgIGlmICghZnVuYykKKyAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKCI8Y2FsbEZ1bmN0aW9uPiIsICJDYW5ub3QgcmVzb2x2ZSBmdW5jdGlv
biBjYWxsICIgKyBuYW1lICsgIjwiICsgdHlwZUFyZ3VtZW50cyArICI+KCIgKyBhcmd1bWVudExp
c3QgKyAiKSIpOworICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZnVuYy5wYXJhbWV0ZXJzLmxlbmd0
aDsgKytpKQorICAgICAgICBmdW5jLnBhcmFtZXRlcnNbaV0ubFZhbHVlLnZhbHVlID0gYXJndW1l
bnRMaXN0W2ldOworICAgIHJldHVybiBuZXcgRXZhbHVhdG9yKCkudmlzaXRGdW5jdGlvbkJvZHko
ZnVuYy5ib2R5KTsKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2suanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2suanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvQ2hlY2suanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitmdW5jdGlvbiBjaGVjayhwcm9ncmFtKQoreworICAgIHByb2dyYW0udmlzaXQobmV3IENo
ZWNrZXIocHJvZ3JhbSkpOworfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9DaGVja2VyLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBDaGVja2VyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgY29u
c3RydWN0b3IocHJvZ3JhbSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBwcm9ncmFt
OworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQg
b2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpIHsKKyAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRT
dGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7
CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAg
ICB7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBub2RlLnNpZ25hdHVyZXMpIHsKKyAg
ICAgICAgICAgIGxldCBzZXQgPSBuZXcgU2V0KCk7CisgICAgICAgICAgICBmdW5jdGlvbiBjb25z
aWRlcih0aGluZykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAodGhpbmcuaXNV
bmlmaWFibGUpCisgICAgICAgICAgICAgICAgICAgIHNldC5hZGQodGhpbmcpOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgY2xhc3MgTm90aWNlVHlwZVZhcmlhYmxlIGV4dGVuZHMgVmlzaXRv
ciB7CisgICAgICAgICAgICAgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgICAgICAgICAgICAg
eworICAgICAgICAgICAgICAgICAgICBjb25zaWRlcihub2RlLnR5cGUpOworICAgICAgICAgICAg
ICAgIH0KKyAgICAgICAgICAgICAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zaWRlcihub2RlLnZhcmlhYmxlKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZXQgbm90aWNlVHlw
ZVZhcmlhYmxlID0gbmV3IE5vdGljZVR5cGVWYXJpYWJsZSgpOworICAgICAgICAgICAgZm9yIChs
ZXQgcGFyYW1ldGVyVHlwZSBvZiBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpCisgICAgICAgICAg
ICAgICAgcGFyYW1ldGVyVHlwZS52aXNpdChub3RpY2VUeXBlVmFyaWFibGUpOworICAgICAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMpIHsK
KyAgICAgICAgICAgICAgICBpZiAoIXNldC5oYXModHlwZVBhcmFtZXRlcikpCisgICAgICAgICAg
ICAgICAgICAgIHRocm93IEFMVHlwZUVycm9yKHR5cGVQYXJhbWV0ZXIub3JpZ2luLm9yaWdpblN0
cmluZywgIlR5cGUgcGFyYW1ldGVyIHRvIHByb3RvY29sIHNpZ25hdHVyZSBub3QgaW5mZXJyYWJs
ZSBmcm9tIHZhbHVlIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
ICghc2V0Lmhhcyhub2RlLnR5cGVWYXJpYWJsZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IEFMVHlwZUVycm9yKHNpZ25hdHVyZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiUHJvdG9jb2wncyB0
eXBlIHZhcmlhYmxlIG5vdCBtZW50aW9uZWQgaW4gc2lnbmF0dXJlIik7CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgX2NoZWNrVHlwZUFyZ3VtZW50cyhvcmlnaW4sIHR5cGVQYXJhbWV0ZXJz
LCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBl
UGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IGFyZ3VtZW50SXNUeXBl
ID0gdHlwZUFyZ3VtZW50c1tpXSBpbnN0YW5jZW9mIFR5cGU7CisgICAgICAgICAgICBsZXQgcmVz
dWx0ID0gbm9kZS50eXBlQXJndW1lbnRzW2ldLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgaWYg
KGFyZ3VtZW50SXNUeXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzW2ld
LmluaGVyaXRzKHR5cGVBcmd1bWVudHNbaV0pKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIlR5cGUgYXJndW1lbnQgZG9lcyBu
b3QgaW5oZXJpdCBwcm90b2NvbCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAg
ICAgICBpZiAoIXJlc3VsdC5lcXVhbHModHlwZVBhcmFtZXRlcnNbaV0udHlwZSkpCisgICAgICAg
ICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAi
V3JvbmcgdHlwZSBmb3IgY29uc3RleHByIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAg
ICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9j
aGVja1R5cGVBcmd1bWVudHMobm9kZS5vcmlnaW4sIHR5cGUudHlwZVBhcmFtZXRlcnMsIG5vZGUu
dHlwZUFyZ3VtZW50cyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2Rl
KQorICAgIHsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICAgICAg
CisgICAgICAgIGlmIChub2RlLmFkZHJlc3NTcGFjZSA9PSAidGhyZWFkIikKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGNsYXNzIEluc3RhbnRpYXRlSW1tZWRpYXRlcyBl
eHRlbmRzIFJld3JpdGVyIHsKKyAgICAgICAgICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIG5vZGUgPSBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7
CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuaW5zdGFudGlhdGVkVHlwZS52aXNpdCh0aGlz
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgdmlzaXRSZWZlcmVu
Y2VUeXBlKG5vZGUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7
CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICghbm9kZS5l
bGVtZW50VHlwZS52aXNpdChuZXcgSW5zdGFudGlhdGVJbW1lZGlhdGVzKCkpLmlzUHJpbWl0aXZl
KQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0
cmluZywgIklsbGVnYWwgcG9pbnRlciB0byBub24tcHJpbWl0aXZlIHR5cGUiKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGlmICghbm9kZS5u
dW1FbGVtZW50cy5pc0NvbnN0ZXhwcikKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJv
cihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJBcnJheSBsZW5ndGggbXVzdCBiZSBjb25zdGV4
cHIiKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAg
ICAgICAvLyBGSVhNRTogV2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBsaHMgaXMgYXNzaWduYWJs
ZS4KKyAgICAgICAgbGV0IGxoc1R5cGUgPSBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAg
bGV0IHJoc1R5cGUgPSBub2RlLnJocy52aXNpdCh0aGlzKTsKKyAgICAgICAgaWYgKCFsaHNUeXBl
LmVxdWFscyhyaHNUeXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2Rl
Lm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUeXBlIG1pc21hdGNoIGluIGFzc2lnbm1lbnQ6ICIgKyBs
aHNUeXBlICsgIiB2ZXJzdXMgIiArIHJoc1R5cGUpOworICAgICAgICByZXR1cm4gbGhzVHlwZTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdC50eXBlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQor
ICAgIHsKKyAgICAgICAgaWYgKG5vZGUudmFsdWUpIHsKKyAgICAgICAgICAgIGxldCByZXN1bHRU
eXBlID0gbm9kZS52YWx1ZS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIGlmICghdGhpcy5mdW5j
LnJldHVyblZhbHVlLmVxdWFscyhyZXN1bHRUeXBlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHJ5aW5nIHRvIHJldHVy
biAiICsgcmVzdWx0VHlwZSArICIgaW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgIiArIGZ1bmMu
cmV0dXJuVmFsdWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICBpZiAoIWZ1bmMucmV0dXJuVmFsdWUuZXF1YWxzKHRoaXMuX3Byb2dyYW0uaW50cmlu
c2ljcy52b2lkKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdp
bi5vcmlnaW5TdHJpbmcsICJOb24tdm9pZCBmdW5jdGlvbiBtdXN0IHJldHVybiBhIHZhbHVlIik7
CisgICAgfQorICAgIAorICAgIHZpc2l0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMuX3Byb2dyYW0uaW50cmluc2ljcy5pbnQzMjsKKyAgICB9CisgICAgCisgICAg
dmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZUFy
Z3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudC52
aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50VHlwZXMgPSBub2RlLmFyZ3VtZW50TGlz
dC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykpOworICAgICAgICAKKyAgICAg
ICAgbGV0IG92ZXJsb2FkID0gbnVsbDsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBv
ZiB0aGlzLl9jdXJyZW50U3RhdGVtZW50LnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBp
ZiAoISh0eXBlUGFyYW1ldGVyIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAg
ICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghdHlwZVBhcmFtZXRlci5wcm90b2NvbCkK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGxldCBzaWduYXR1cmVzID0K
KyAgICAgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnByb3RvY29sLnNpZ25hdHVyZXNCeU5hbWVX
aXRoVHlwZVZhcmlhYmxlKG5vZGUubmFtZSwgdHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICBp
ZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBv
dmVybG9hZCA9IHJlc29sdmVPdmVybG9hZEltcGwoc2lnbmF0dXJlcywgbm9kZS50eXBlQXJndW1l
bnRzLCBhcmd1bWVudFR5cGVzKTsKKyAgICAgICAgICAgIGlmIChvdmVybG9hZCkKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW92ZXJsb2FkKSB7CisgICAg
ICAgICAgICBvdmVybG9hZCA9IHRoaXMuX25hbWVDb250ZXh0LnByb2dyYW0ucmVzb2x2ZUZ1bmNP
dmVybG9hZCgKKyAgICAgICAgICAgICAgICBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3VtZW50cywg
YXJndW1lbnRUeXBlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvdmVybG9hZCkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJE
aWQgbm90IGZpbmQgZnVuY3Rpb24gZm9yIGNhbGwiKTsKKyAgICAgICAgbm9kZS5mdW5jID0gb3Zl
cmxvYWQuZnVuYzsKKyAgICAgICAgbm9kZS5hY3R1YWxUeXBlQXJndW1lbnRzID0gb3ZlcmxvYWQu
dHlwZUFyZ3VtZW50cy5tYXAoVHlwZVJlZi53cmFwKTsKKyAgICAgICAgcmV0dXJuIG92ZXJsb2Fk
LmZ1bmMucmV0dXJuVHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigKKyAgICAgICAgICAgIG92
ZXJsb2FkLmZ1bmMudHlwZVBhcmFtZXRlcnMsIG92ZXJsb2FkLnVuaWZpY2F0aW9uQ29udGV4dCk7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Db21tYUV4cHJlc3Npb24uanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NvbW1hRXhwcmVzc2lvbi5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENvbW1hRXhwcmVzc2lvbiBleHRl
bmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbGlzdCkKKyAgICB7Cisg
ICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX2xpc3QgPSBsaXN0OworICAgIH0K
KyAgICAKKyAgICBnZXQgbGlzdCgpIHsgcmV0dXJuIHRoaXMuX2xpc3Q7IH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIigiICsgdGhpcy5saXN0LnRvU3RyaW5n
KCkgKyAiKSI7CisgICAgfQorfTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHBy
VHlwZVBhcmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4
cHJUeXBlUGFyYW1ldGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Nv
bnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3OSBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBDb25zdGV4cHJUeXBlUGFyYW1ldGVyIGV4dGVuZHMgVmFsdWUgeworICAgIGNv
bnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdp
biA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5
cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25h
bWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICBnZXQgaXND
b25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1
cm4gdHJ1ZTsgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4
dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFZhbHVlKSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBpZiAoIXRoaXMudHlwZS51bmlm
eSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworCisgICAgICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRo
aXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhpcykKKyAgICAgICAgICAgIHJldHVybiBy
ZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICAgICAgCisgICAg
ICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFZhcmlhYmxlUmVmKQorICAgICAgICAgICAgb3RoZXIg
PSBvdGhlci52YXJpYWJsZTsKKyAgICAgICAgCisgICAgICAgIHVuaWZpY2F0aW9uQ29udGV4dC51
bmlmeSh0aGlzLCBvdGhlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAg
ICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOwor
ICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc0FyZ3VtZW50KHVuaWZpY2F0aW9uQ29udGV4dCkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc1BhcmFt
ZXRlcih1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlw
ZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0VGbG9hdC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FRmxvYXQuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRUZsb2F0LmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRUZsb2F0IGV4dGVuZHMgRVZhbHVlIHsKKyAg
ICBjb25zdHJ1Y3Rvcih0eXBlLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKHR5cGUpOwor
ICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgdmFsdWUo
KSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIAorICAgIGFkZChvdGhlcikKKyAgICB7Cisg
ICAgICAgIHJldHVybiBuZXcgRUZsb2F0KHRoaXMudHlwZSwgdGhpcy52YWx1ZSArIG90aGVyLnZh
bHVlKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
ICIiICsgdGhpcy52YWx1ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0VJ
bnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRUludC5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FSW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgRUludCBleHRlbmRzIEVWYWx1ZSB7CisgICAgY29uc3RydWN0
b3IodHlwZSwgdmFsdWUpCisgICAgeworICAgICAgICBzdXBlcih0eXBlKTsKKyAgICAgICAgdGhp
cy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4g
dGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICBhZGQob3RoZXIpCisgICAgeworICAgICAgICByZXR1
cm4gbmV3IEVJbnQodGhpcy50eXBlLCAodGhpcy52YWx1ZSArIG90aGVyLnZhbHVlKSB8IDApOwor
ICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIiIgKyB0
aGlzLnZhbHVlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRVB0ci5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FUHRyLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0VQdHIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBFUHRyIGV4dGVuZHMgRVZhbHVlIHsKKyAgICAvLyBOdWxsIGlzIHNpZ25p
ZmllZCB3aXRoIGxWYWx1ZSA9IG51bGwuCisgICAgY29uc3RydWN0b3IodHlwZSwgbFZhbHVlKQor
ICAgIHsKKyAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgIHRoaXMuX2xWYWx1ZSA9IGxWYWx1
ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IGxWYWx1ZSgpIHsgcmV0dXJuIHRoaXMuX2xWYWx1ZTsg
fQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiXiIgKyB0aGlz
LmxWYWx1ZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FVmFsdWUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRVZhbHVlLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0VWYWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM1
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIEVWYWx1ZSB7CisgICAgY29uc3RydWN0b3IodHlwZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgdHlwZSgpIHsg
cmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVh
dGlvbkNvbW1vbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0aW9u
Q29tbW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRpb25D
b21tb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjb25zdCBCcmVh
a0V4Y2VwdGlvbiA9IFN5bWJvbCgiQnJlYWtFeGNlcHRpb24iKTsKK2NvbnN0IENvbnRpbnVlRXhj
ZXB0aW9uID0gU3ltYm9sKCJDb250aW51ZUV4Y2VwdGlvbiIpOworCisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0V2YWx1YXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9F
dmFsdWF0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdG9y
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRXZhbHVhdG9y
IGV4dGVuZHMgVmlzaXRvciB7CisgICAgdmlzaXRGdW5jdGlvbkJvZHkoYmxvY2spCisgICAgewor
ICAgICAgICB0cnkgeworICAgICAgICAgICAgYmxvY2sudmlzaXQodGhpcyk7CisgICAgICAgICAg
ICAvLyBGSVhNRTogV2Ugc2hvdWxkIGhhdmUgYSBjaGVjayB0aGF0IHRoZXJlIGlzIG5vIHdheSB0
byBkcm9wIG91dCBvZiBhIGZ1bmN0aW9uIHdpdGhvdXQKKyAgICAgICAgICAgIC8vIHJldHVybmlu
ZyB1bmxlc3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgdm9pZC4KKyAgICAgICAgICAgIHJldHVybiBu
dWxsOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAgICBpZiAoZSA9PSBCcmVha0V4
Y2VwdGlvbiB8fCBlID09IENvbnRpbnVlRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigiU2hvdWxkIG5vdCBzZWUgYnJlYWsvY29udGludWUgYXQgZnVuY3Rpb24gc2Nv
cGUiKTsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmV0dXJuRXhjZXB0aW9uKQorICAg
ICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlOworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAg
ICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uTGlrZUJsb2NrKG5vZGUpCisgICAg
eworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuYXJndW1lbnRMaXN0Lmxlbmd0aDsg
KytpKQorICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJzW2ldLmxWYWx1ZS52YWx1ZSA9IG5vZGUu
YXJndW1lbnRMaXN0W2ldLnZpc2l0KHRoaXMpOworICAgICAgICByZXR1cm4gdmlzaXRGdW5jdGlv
bkJvZHkobm9kZS5ibG9jayk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisg
ICAgeworICAgICAgICB0aHJvdyBuZXcgUmV0dXJuRXhjZXB0aW9uKG5vZGUudmFsdWUgPyBub2Rl
LnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAgIAorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0V4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRXhw
cmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEV4
cHJlc3Npb24gZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luKQorICAgIHsK
KyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQgb3Jp
Z2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9GaWVsZC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZpZWxkIHsKKyAgICBjb25zdHJ1Y3Rvcihvcmln
aW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1
cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvRnVuYy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5j
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jIGV4dGVuZHMgTm9kZSB7Cisg
ICAgY29uc3RydWN0b3IobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRl
cnMpCisgICAgeworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fcmV0
dXJuVHlwZSA9IHJldHVyblR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlw
ZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAg
IH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQg
cmV0dXJuVHlwZSgpIHsgcmV0dXJuIHRoaXMuX3JldHVyblR5cGU7IH0KKyAgICBnZXQgdHlwZVBh
cmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCBwYXJh
bWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fcGFyYW1ldGVyczsgfQorICAgIGdldCBwYXJhbWV0ZXJU
eXBlcygpIHsgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRl
ci50eXBlKTsgfQorICAgIAorICAgIGdldCBraW5kKCkgeyByZXR1cm4gRnVuYzsgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnJldHVyblR5cGUgKyAi
ICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4oIiArIHRoaXMu
cGFyYW1ldGVycyArICIpIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1
bmNEZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0RlZi5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jRGVmLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY0RlZiBleHRlbmRzIEZ1bmMgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBh
cmFtZXRlcnMsIGJvZHkpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCByZXR1cm5UeXBlLCB0
eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycyk7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdp
bjsKKyAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdp
bigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiB7ICIgKyBib2R5ICsgIiB9IjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNJbnN0YW50aWF0b3IuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0luc3RhbnRpYXRvci5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jSW5zdGFudGlhdG9yLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY0luc3RhbnRpYXRvciB7
CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5faW5zdGFuY2VzID0gbmV3
IE1hcCgpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIGEgRnVuYyBvYmplY3QgdGhhdCB1
bmlxdWVseSBpZGVudGlmaWVzIGEgcGFydGljdWxhciBzeXN0ZW0gb2YgdHlwZSBhcmd1bWVudHMu
CisgICAgZ2V0VW5pcXVlKGZ1bmMsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBpZiAo
IWZ1bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZ1bmM7Cisg
ICAgICAgIAorICAgICAgICBsZXQgaW5zdGFuY2VzID0gdGhpcy5faW5zdGFuY2VzLmdldChmdW5j
KTsKKyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbnMu
c2V0KGZ1bmMsIGZ1bmN0aW9ucyA9IFtdKTsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0IGlu
c3RhbmNlIG9mIGluc3RhbmNlcykgeworICAgICAgICAgICAgbGV0IG9rID0gdHJ1ZTsKKyAgICAg
ICAgICAgIGZvciAobGV0IGkgPSBpbnN0YW5jZS50eXBlQXJndW1lbnRzLmxlbmd0aDsgaS0tOykg
eworICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2UudHlwZUFyZ3VtZW50c1tpXS5lcXVhbHMo
dHlwZUFyZ3VtZW50c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIHJldHVybiBpbnN0YW5jZS5mdW5jOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICBsZXQgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLm1hcHBpbmcoZnVuYy50eXBlUGFyYW1l
dGVycywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIGxldCBmdW5jID0gbmV3IEZ1bmNEZWYoCisg
ICAgICAgICAgICBmdW5jLm9yaWdpbiwgZnVuYy5uYW1lLAorICAgICAgICAgICAgZnVuYy5yZXR1
cm5UeXBlLnZpc2l0KHN1YnN0aXR1dGlvbiksCisgICAgICAgICAgICBbXSwgLy8gV2UncmUgaW5z
dGFudGlhdGVkIHNvIHdlIG5vIGxvbmdlciB0YWtlIHR5cGUgcGFyYW1ldGVycy4KKyAgICAgICAg
ICAgIHBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQoc3Vic3RpdHV0
aW9uKSksCisgICAgICAgICAgICBib2R5LnZpc2l0KHN1YnN0aXR1dGlvbikpOworICAgICAgICBs
ZXQgaW5zdGFuY2UgPSB7ZnVuYywgdHlwZUFyZ3VtZW50c307CisgICAgICAgIGluc3RhbmNlcy5w
dXNoKGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGZ1bmM7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9GdW5jUGFyYW1ldGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL0Z1bmNQYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvRnVuY1BhcmFtZXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ1IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIEZ1bmNQYXJhbWV0ZXIgZXh0ZW5kcyBWYWx1ZSB7CisgICAgLy8gVGhlIG5hbWUg
aXMgb3B0aW9uYWwuIEl0J3MgT0sgZm9yIGl0IHRvIGJlIG51bGwhCisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2lu
OworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7
CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0K
KyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsg
cmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvRnVuY1NpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9GdW5jU2lnbmF0dXJlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL0Z1bmNTaWduYXR1cmUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwyNiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmN0aW9uTGlrZUJsb2NrIGV4dGVu
ZHMgVmFsdWUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgYXJndW1lbnRMaXN0LCBwYXJhbWV0
ZXJzLCBib2R5KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAg
ICB0aGlzLl9hcmd1bWVudExpc3QgPSBhcmd1bWVudExpc3Q7CisgICAgICAgIHRoaXMuX3BhcmFt
ZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBh
cmd1bWVudExpc3QoKSB7IHJldHVybiB0aGlzLl9hcmd1bWVudExpc3Q7IH0KKyAgICBnZXQgcGFy
YW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7IH0KKyAgICBnZXQgYm9keSgpIHsg
cmV0dXJuIHRoaXMuX2JvZHk7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gIlsmXSAoIiArIHBhcmFtZXRlcnMgKyAiKSB7ICIgKyBibG9jayArICIgfSgiICsg
YXJndW1lbnRMaXN0ICsgIikiOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0lu
bGluZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbmxpbmUuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5lLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gaW5saW5lKHByb2dyYW0pCit7CisgICAgZm9y
IChsZXQgZnVuYyBvZiBwcm9ncmFtLmZ1bmN0aW9ucykgeworICAgICAgICBpZiAoIWZ1bmMudHlw
ZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgX2lubGluZUZ1bmN0aW9uKHByb2dyYW0s
IGZ1bmMsIG5ldyBWaXNpdGluZ1NldChmdW5jKSk7CisgICAgfQorfQorCitmdW5jdGlvbiBfaW5s
aW5lRnVuY3Rpb24ocHJvZ3JhbSwgZnVuYywgdmlzaXRpbmcpCit7CisgICAgaWYgKGZ1bmMudHlw
ZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBpbmxp
bmUgZnVuY3Rpb24gdGhhdCBoYXMgdHlwZSBwYXJhbWV0ZXJzIik7CisgICAgaWYgKGZ1bmMuaW5s
aW5lZCkKKyAgICAgICAgcmV0dXJuOworICAgIGZ1bmMudmlzaXQobmV3IExWYWx1ZUJ1aWxkZXIo
KSk7CisgICAgZnVuYy5ib2R5ID0gZnVuYy5ib2R5LnZpc2l0KG5ldyBJbmxpbmVyKHByb2dyYW0s
IGZ1bmMsIHZpc2l0aW5nKSk7CisgICAgZnVuYy5pbmxpbmVkID0gdHJ1ZTsKK30KKworZnVuY3Rp
b24gcmVzb2x2ZUlubGluZWRGdW5jdGlvbihwcm9ncmFtLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBh
cmd1bWVudFR5cGVzKQoreworICAgIGxldCBvdmVybG9hZCA9IHByb2dyYW0ucmVzb2x2ZUZ1bmNP
dmVybG9hZChuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKTsKKyAgICBpZiAoIW92
ZXJsb2FkKQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICBpZiAoIW92ZXJsb2FkLmZ1bmMudHlw
ZVBhcmFtZXRlcnMpCisgICAgICAgIHJldHVybiBvdmVybG9hZC5mdW5jOworICAgIGxldCBmdW5j
ID0gcHJvZ3JhbS5mdW5jSW5zdGFudGlhdG9yLmdldFVuaXF1ZShvdmVybG9hZC5mdW5jLCBvdmVy
bG9hZC50eXBlQXJndW1lbnRzKTsKKyAgICBfaW5saW5lRnVuY3Rpb24ocHJvZ3JhbSwgZnVuYywg
bmV3IFZpc2l0aW5nU2V0KG92ZXJsb2FkLmZ1bmMpKTsKKyAgICByZXR1cm4gZnVuYzsKK30KSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0lubGluZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvSW5saW5lci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9J
bmxpbmVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgSW5s
aW5lciBleHRlbmRzIFJld3JpdGVyIHsKKyAgICBjb25zdHJ1Y3Rvcihwcm9ncmFtLCBmdW5jLCB2
aXNpdGluZykKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBwcm9ncmFtOworICAgICAg
ICB0aGlzLl92aXNpdGluZyA9IHZpc2l0aW5nOworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxF
eHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICAvLyBGSVhNRTogV2hhdCBpZiBpdCdzIGEg
bmF0aXZlIGZ1bmN0aW9uPworICAgICAgICByZXR1cm4gdGhpcy5fdmlzaXRpbmcuZG9WaXNpdChu
b2RlLmZ1bmMsICgpID0+IHsKKyAgICAgICAgICAgIGxldCBmdW5jID0gdGhpcy5fcHJvZ3JhbS5m
dW5jSW5zdGFudGlhdG9yLmdldFVuaXF1ZShub2RlLmZ1bmMsIG5vZGUuYWN0dWFsVHlwZUFyZ3Vt
ZW50cyk7CisgICAgICAgICAgICBfaW5saW5lRnVuY3Rpb24odGhpcy5fcHJvZ3JhbSwgZnVuYywg
dGhpcy5fdmlzaXRpbmcpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkxpa2VCbG9j
aygKKyAgICAgICAgICAgICAgICBub2RlLm9yaWdpbiwKKyAgICAgICAgICAgICAgICBub2RlLmFy
Z3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykpLAorICAgICAg
ICAgICAgICAgIGZ1bmMucGFyYW1ldGVycywgZnVuYy5ib2R5KTsKKyAgICAgICAgfSk7CisgICAg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIEludExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAg
ICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkg
eyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0
cnVlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIiICsg
dGhpcy5fdmFsdWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5z
aWNzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEludHJpbnNpY3MgeworICAgIGNvbnN0
cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKworICAgICAg
ICB0aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSB2b2lk
PD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnZvaWQg
PSB0eXBlOworICAgICAgICAgICAgICAgIHR5cGUuX19kZWZpbmVHZXR0ZXJfXygiZGVmYXVsdFZh
bHVlIiwgKCkgPT4geyB0aHJvdyBuZXcgRXJyb3IoInZvaWQgaGFzIG5vIGRlZmF1bHRWYWx1ZSIp
OyB9KTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAg
ICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBlIGludDMyPD4iLAorICAgICAgICAgICAgKHR5cGUp
ID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLmludDMyID0gdHlwZTsKKyAgICAgICAgICAgICAg
ICB0eXBlLmRlZmF1bHRWYWx1ZSA9IG5ldyBFSW50KHR5cGUsIDApOworICAgICAgICAgICAgfSk7
CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZl
IHR5cGUgZG91YmxlPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAg
ICB0aGlzLmRvdWJsZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgdHlwZS5kZWZhdWx0VkFsdWUg
PSBuZXcgRUZsb2F0KHR5cGUsIDApOworICAgICAgICAgICAgfSk7CisgICAgfQorICAgIAorICAg
IGFkZCh0aGluZykKKyAgICB7CisgICAgICAgIGxldCBpbnRyaW5zaWMgPSB0aGlzLl9tYXAuZ2V0
KHRoaW5nLm5hbWUpOworICAgICAgICBpZiAoIWludHJpbnNpYykKKyAgICAgICAgICAgIHRocm93
IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVW5yZWNvZ25pemVk
IGludHJpbnNpYzogIiArIHRoaW5nKTsKKyAgICAgICAgaW50cmluc2ljKHRoaW5nKTsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xIU0V2YWx1YXRvci5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MSFNFdmFsdWF0b3IuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvTEhTRXZhbHVhdG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgTEhTRXZhbHVhdG9yIHsKKyAgICAKK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvTFZhbHVlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0xWYWx1ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9MVmFsdWUuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBMVmFsdWUgeworICAg
IGNvbnN0cnVjdG9yKHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwor
ICAgIH0KKyAgICAKKyAgICByZXNldCgpCisgICAgeworICAgICAgICB0aGlzLnZhbHVlID0gdGhp
cy52YWx1ZS50eXBlLmRlZmF1bHRWYWx1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuICJMOigiICsgdGhpcy52YWx1ZSArICIpIjsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xWYWx1ZUJ1aWxkZXIuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvTFZhbHVlQnVpbGRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9MVmFsdWVCdWlsZGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgTFZhbHVlQnVpbGRlciBleHRlbmRzIFZpc2l0b3IgeworICAg
IGNvbnN0cnVjdG9yKHByb2dyYW0pCisgICAgeworICAgICAgICB0aGlzLl9wcm9ncmFtID0gcHJv
Z3JhbTsKKyAgICB9CisgICAgCisgICAgX2NyZWF0ZUxWYWx1ZSh0eXBlKQorICAgIHsKKyAgICAg
ICAgbGV0IHJlc3VsdCA9IG5ldyBMVmFsdWUodHlwZS5kZWZhdWx0VmFsdWUpOworICAgICAgICB0
aGlzLl9wcm9ncmFtLmxWYWx1ZXMucHVzaChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0
OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAg
ICAgIG5vZGUubFZhbHVlID0gbmV3IExWYWx1ZShub2RlLnR5cGUuZGVmYXVsdFZhbHVlKTsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL0xleGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIExleGVyIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHRleHQpCisgICAgeworICAgICAg
ICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX3RleHQgPSB0ZXh0OworICAg
ICAgICB0aGlzLl9pbmRleCA9IDA7CisgICAgICAgIHRoaXMuX3N0YWNrID0gW107CisgICAgfQor
ICAgIAorICAgIGdldCBsaW5lTnVtYmVyKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxp
bmVOdW1iZXJGb3JJbmRleCh0aGlzLl9pbmRleCk7CisgICAgfQorICAgIAorICAgIGdldCBvcmln
aW5TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX29yaWdpbiArICI6IiArICh0
aGlzLmxpbmVOdW1iZXIgKyAxKTsKKyAgICB9CisgICAgCisgICAgbGluZU51bWJlckZvckluZGV4
KGluZGV4KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQuc3Vic3RyaW5nKDAsIGlu
ZGV4KS5tYXRjaCgvXG4vZykubGVuZ3RoOworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGUoKSB7
IHJldHVybiB0aGlzLl9pbmRleDsgfQorICAgIHNldCBzdGF0ZSh2YWx1ZSkgeyB0aGlzLl9pbmRl
eCA9IHZhbHVlOyB9CisgICAgCisgICAgbmV4dCgpCisgICAgeworICAgICAgICBpZiAodGhpcy5f
c3RhY2subGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWNrLnBvcCgpOworICAg
ICAgICAKKyAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IHRoaXMuX3RleHQubGVuZ3RoKQorICAg
ICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICBjb25zdCBpc0NDb21tZW50
QmVnaW4gPSAvXC9cKi87CisgICAgICAgIGNvbnN0IGlzQ1BsdXNQbHVzQ29tbWVudEJlZ2luID0g
L1wvXC8vOworICAgICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9IChraW5kKSA9PiB7CisgICAg
ICAgICAgICBsZXQgdGV4dCA9IFJlZ0V4cC5sYXN0TWF0Y2g7CisgICAgICAgICAgICBsZXQgdG9r
ZW4gPSBuZXcgTGV4ZXJUb2tlbih0aGlzLCB0aGlzLl9pbmRleCwga2luZCwgdGV4dCk7CisgICAg
ICAgICAgICB0aGlzLl9pbmRleCArPSB0ZXh0Lmxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiB0
b2tlbjsKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgcmVsZXZhbnRUZXh0OworICAgICAgICBm
b3IgKDs7KSB7CisgICAgICAgICAgICByZWxldmFudFRleHQgPSB0aGlzLl90ZXh0LnN1YnN0cmlu
Zyh0aGlzLl9pbmRleCk7CisgICAgICAgICAgICBpZiAoL15ccysvLnRlc3QocmVsZXZhbnRUZXh0
KSkgeworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gubGVu
Z3RoOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAg
ICAgaWYgKC9eXC9cKi8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgbGV0
IGVuZEluZGV4ID0gcmVsZXZhbnRUZXh0LnNlYXJjaCgvXCpcLy8pOworICAgICAgICAgICAgICAg
IGlmIChlbmRJbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbCgiVW50ZXJt
aW5hdGVkIGNvbW1lbnQiKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBlbmRJbmRl
eDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGlmICgvXlwvXC8uKi8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhp
cy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBkbyBVbmljb2RlLgorICAgICAgICBp
ZiAoL15bXlxkXFddXHcqLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4g
cmVzdWx0KCJpZGVudGlmaWVyIik7CisKKyAgICAgICAgaWYgKC9eWzAtOV0rLy50ZXN0KHJlbGV2
YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJpbnRMaXRlcmFsIik7CisKKyAg
ICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBoYW5kbGUgZXhwLWZvcm0gbGl0ZXJhbHMgbGlrZSAx
ZTEuCisgICAgICAgIGlmICgvXihbMC05XSpcLlswLTldKyl8KFswLTldK1wuWzAtOV0qKS8udGVz
dChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiZG91YmxlTGl0ZXJh
bCIpOworICAgICAgICAKKyAgICAgICAgaWYgKC9eKHN0cnVjdHxwcm90b2NvbHx0eXBlfGlmfGVs
c2V8ZW51bXxjb250aW51ZXxicmVha3xzd2l0Y2h8Y2FzZXxkZWZhdWx0fGZvcnx3aGlsZXxkb3xy
ZXR1cm58c2l6ZW9mfGNvbnN0YW50fGRldmljZXx0aHJlYWRncm91cHx0aHJlYWR8b3BlcmF0b3J8
bnVsbCkvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImtl
eXdvcmQiKTsKKyAgICAgICAgCisgICAgICAgIGlmICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5e
Jnw8PlxcLV18LT58PT58PD18PT18IT18Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0
KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIp
OworICAgICAgICAKKyAgICAgICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3
aXRoOiAiICsgcmVsZXZhbnRUZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAg
ICBwdXNoKHRva2VuKQorICAgIHsKKyAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7Cisg
ICAgfQorICAgIAorICAgIHBlZWsoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQo
KTsKKyAgICAgICAgcHVzaChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K
KyAgICAKKyAgICBmYWlsKGVycm9yKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4
RXJyb3IodGhpcy5vcmlnaW5TdHJpbmcsIGVycm9yKTsKKyAgICB9CisgICAgCisgICAgYmFja3Ry
YWNraW5nU2NvcGUoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0
YXRlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAg
ICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhF
cnJvcikgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAg
ICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7Cisg
ICAgICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIExleGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9y
KGxleGVyLCBvcmlnaW4sIGluZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5f
bGV4ZXIgPSBsZXhlcjsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0
aGlzLl9pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAg
dGhpcy5fdGV4dCA9IHRleHQ7CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiB0aGlzLl9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9y
aWdpbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAK
KyAgICBnZXQgaW5kZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAg
IH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5fbGV4ZXIubGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4g
KyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5n
KCkKKyAgICB7CisgICAgICAgIHJldHVybiAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwg
IiArIHRoaXMudGV4dCArICIsICIgKyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjMgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY29uc3QgTm90RnVuYyA9IFN5bWJvbCgpOworCitmdW5jdGlvbiBpc1dpbGRjYXJkS2lu
ZChraW5kKQoreworICAgIHJldHVybiBraW5kID09IE5vdEZ1bmM7Cit9CisKK2NsYXNzIE5hbWVD
b250ZXh0IHsKKyAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMu
X2Z1bmNNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKyAg
ICAgICAgdGhpcy5fZGVmaW5lZCA9IG5ldyBTZXQoKTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0
YXRlbWVudCA9IG51bGw7CisgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbnVsbDsKKyAgICAgICAg
dGhpcy5faW50cmluc2ljcyA9IG51bGw7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsOwor
ICAgIH0KKyAgICAKKyAgICBtYXBGb3Ioa2luZCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2lu
ZCkgeworICAgICAgICBjYXNlIE5vdEZ1bmM6CisgICAgICAgIGNhc2UgVmFsdWU6CisgICAgICAg
IGNhc2UgVHlwZToKKyAgICAgICAgY2FzZSBQcm90b2NvbDoKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLl9tYXA7CisgICAgICAgIGNhc2UgRnVuYzoKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9m
dW5jTWFwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJC
YWQga2luZDogIiArIGtpbmQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFkZCh0aGlu
ZykKKyAgICB7CisgICAgICAgIGlmICghdGhpbmcubmFtZSkKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgCisgICAgICAgIGlmICh0aGluZy5pc05hdGl2ZSkgeworICAgICAgICAgICAgaWYg
KCF0aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTmF0
aXZlIGZ1bmN0aW9uIGluIGEgc2NvcGUgdGhhdCBkb2VzIG5vdCByZWNvZ25pemUgaW50cmluc2lj
cyIpOworICAgICAgICAgICAgdGhpcy5faW50cmluc2ljcy5hZGQodGhpbmcpOworICAgICAgICB9
CisgICAgICAgIAorICAgICAgICBpZiAodGhpbmcua2luZCA9PSBGdW5jKSB7CisgICAgICAgICAg
ICBsZXQgYXJyYXkgPSB0aGlzLl9mdW5jTWFwLmdldCh0aGluZy5uYW1lKTsKKyAgICAgICAgICAg
IGlmICghYXJyYXkpCisgICAgICAgICAgICAgICAgdGhpcy5fZnVuY01hcC5zZXQodGhpbmcubmFt
ZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5fbWFwLmhhcyh0aGluZy5u
YW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3Jp
Z2luU3RyaW5nLCAiRHVwbGljYXRlIG5hbWU6ICIgKyB0aGluZy5uYW1lKTsKKyAgICAgICAgdGhp
cy5fbWFwLnNldCh0aGluZy5uYW1lLCB0aGluZyk7CisgICAgfQorICAgIAorICAgIGdldChraW5k
LCBuYW1lKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG1hcEZvcihraW5kKS5nZXQobmFt
ZSk7CisgICAgICAgIGlmICghcmVzdWx0ICYmIHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAg
cmV0dXJuIHRoaXMuX2RlbGVnYXRlLmdldChraW5kLCBuYW1lKTsKKyAgICAgICAgaWYgKCFpc1dp
bGRjYXJkS2luZChraW5kKSAmJiByZXN1bHQua2luZCAhPSBraW5kKQorICAgICAgICAgICAgcmV0
dXJuIG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGdldCBj
dXJyZW50U3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9jdXJyZW50U3RhdGVt
ZW50KQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAg
IGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5j
dXJyZW50U3RhdGVtZW50OworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAg
aXNEZWZpbmVkKHRoaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmluZWQuaGFz
KHRoaW5nKQorICAgICAgICAgICAgfHwgKHRoaXMuX2RlbGVnYXRlICYmIHRoaXMuX2RlbGVnYXRl
LmlzRGVmaW5lZCh0aGluZykpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmUodGhpbmcpCisgICAg
eworICAgICAgICB0aGlzLl9kZWZpbmVkLnNldCh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRl
ZmluZUFsbCgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0aGluZyBvZiB0aGlzKQorICAgICAg
ICAgICAgZGVmaW5lKHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZG9TdGF0ZW1lbnQoc3RhdGVt
ZW50LCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBz
dGF0ZW1lbnQ7CisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0
ZW1lbnQgPSBudWxsOworICAgICAgICBkZWZpbmUoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisg
ICAgcmVjb2duaXplSW50cmluc2ljcygpCisgICAgeworICAgICAgICB0aGlzLl9pbnRyaW5zaWNz
ID0gbmV3IEludHJpbnNpY3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGludHJpbnNpY3MoKQor
ICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICByZXR1cm4g
dGhpcy5faW50cmluc2ljczsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAgICAgIHJldHVybiBudWxs
OworICAgIH0KKyAgICAKKyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAgICB7CisgICAgICAgIHRo
aXMuX3Byb2dyYW0gPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHByb2dyYW0oKQorICAg
IHsKKyAgICAgICAgaWYgKHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5f
cHJvZ3JhbTsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJu
IHRoaXMuX2RlbGVnYXRlLnByb2dyYW07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAg
ICAKKyAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgbWFw
IG9mIHRoaXMuX21hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0
aGlzLl90eXBlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVsZCB0eXBlOworICAgICAg
ICB9CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZVJlc29sdmVyLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hbWVSZXNvbHZlci5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OYW1lUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBvbmx5IHJlc29sdmVzIG5hbWVzLiBBZnRl
ciB0aGlzIHBoYXNlIHJ1bnMsIGFsbCBuYW1lcyB3aWxsIGJlIHJlc29sdmVkLiBUaGlzIG1lYW5z
IHRoYXQgYWxsCisvLyBYWVpSZWYgb2JqZWN0cyBub3cga25vdyB3aG8gdGhleSByZXNvbHZlIHRv
LiBUaGlzIGRvZXMgbm90IHlldCBhbGxvdyB0eXBlIGFuYWx5c2lzLCBiZWNhdXNlIHRoZXJlCisv
LyBhcmUgc3RpbGwgVHlwZURlZnMuIFRoaXMgdGhyb3dzIHR5cGUgZXJyb3JzIGZvciBmYWlsZWQg
bmFtZSByZXNvbHV0aW9ucyBhbmQgZm9yIHRoaW5ncyB0aGF0IGFyZQorLy8gbW9yZSBjb252ZW5p
ZW50IHRvIGNoZWNrIGhlcmUgdGhhbiBpbiB0aGUgQ2hlY2tlci4gVGhpcyB1c3VhbGx5IGludm9s
dmVzIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUKKy8vIGNoZWNrZWQgYmVmb3JlIFR5cGVSZWZUb1R5
cGVEZWZTa2lwcGVyLgorY2xhc3MgTmFtZVJlc29sdmVyIGV4dGVuZHMgVmlzaXRvciB7CisgICAg
Ly8gSXQncyB0b3RhbGx5IE9LIHRvIGluc3RhbnRpYXRlIHRoaXMgd2l0aCB6ZXJvIGFyZ3VtZW50
cyAoaS5lLiBwYXNzaW5nIHVuZGVmaW5lZCBmb3IgYm90aCBvZgorICAgIC8vIHRoZW0pIGlmIHlv
dSdyZSBjcmVhdGluZyBhIENoZWNrZXIgdG8gdmlzaXQgYSBQcm9ncmFtLgorICAgIGNvbnN0cnVj
dG9yKG5hbWVDb250ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZUNvbnRleHQgPSBuYW1l
Q29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAg
ICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQp
OworICAgICAgICBuYW1lQ29udGV4dC5wcm9ncmFtID0gbm9kZTsKKyAgICAgICAgbmFtZUNvbnRl
eHQucmVjb2duaXplSW50cmluc2ljcygpOworICAgICAgICBub2RlLmludHJpbnNpY3MgPSBuYW1l
Q29udGV4dC5pbnRyaW5zaWNzOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50
b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQoc3RhdGVtZW50
KTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAg
ICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAg
ICAgICAgIG5hbWVDb250ZXh0LmRvU3RhdGVtZW50KCgpID0+IHN0YXRlbWVudC52aXNpdChjaGVj
a2VyKSk7CisgICAgfQorICAgIAorICAgIF92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1l
Q29udGV4dChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVD
b250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRl
ciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQo
dHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAg
dmlzaXRGdW5jKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2Vy
KHRoaXMuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAg
ICAgICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KGNoZWNrZXIpOworICAgICAgICBmb3IgKGxldCBw
YXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0
KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNEZWYobm9kZSkKKyAgICB7Cisg
ICAgICAgIGxldCBjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzID0gdGhpcy5fdmlzaXRUeXBlUGFy
YW1ldGVyc0FuZEJ1aWxkTmFtZUNvbnRleHQobm9kZSk7CisgICAgICAgIGxldCBjaGVja2VyV2l0
aFR5cGVQYXJhbWV0ZXJzID0gbmV3IENoZWNrZXIoY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyk7
CisgICAgICAgIG5vZGUucmV0dXJuVHlwZS52aXNpdChjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJz
KTsKKyAgICAgICAgbGV0IGNvbnRleHRXaXRoUGFyYW1ldGVycyA9IG5ldyBOYW1lQ29udGV4dChj
b250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9m
IG5vZGUucGFyYW1ldGVycykgeworICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXJX
aXRoVHlwZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgY29udGV4dFdpdGhQYXJhbWV0ZXJzLmFk
ZChwYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyV2l0aFBhcmFtZXRl
cnMgPSBuZXcgQ2hlY2tlcihjb250ZXh0V2l0aFBhcmFtZXRlcnMpOworICAgICAgICBub2RlLmJv
ZHkudmlzaXQoY2hlY2tlcldpdGhQYXJhbWV0ZXJzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRC
bG9jayhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuZXcg
TmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVt
ZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdChjaGVj
a2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAgICB7Cisg
ICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4
dCk7CisgICAgICAgIG5hbWVDb250ZXh0LmFkZChub2RlLnR5cGVWYXJpYWJsZSk7CisgICAgICAg
IGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxl
dCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAgICAgc2lnbmF0dXJlLnZp
c2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7
CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29u
dGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1l
dGVycykgeworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAg
ICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBs
ZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgbm9kZS50eXBl
LnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkK
KyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9u
YW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBl
UGFyYW1ldGVycykgeworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAg
ICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAg
ICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9y
IChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52aXNpdChjaGVj
a2VyKTsKKyAgICB9CisgICAgCisgICAgX3Jlc29sdmVUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVu
dHMpCisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVu
Z3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRz
W2ldOworICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudCBpbnN0YW5jZW9mIFR5cGVPclZhcmlh
YmxlUmVmKSB7CisgICAgICAgICAgICAgICAgbGV0IHRoaW5nID0gdGhpcy5fbmFtZUNvbnRleHQu
Z2V0KE5vdEZ1bmMsIHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRo
aW5nKQorICAgICAgICAgICAgICAgICAgICBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3Jp
Z2luU3RyaW5nLCAiQ291bGQgbm90IGZpbmQgdHlwZSBvciB2YXJpYWJsZSBuYW1lZCAiICsgdHlw
ZUFyZ3VtZW50Lm5hbWUpOworICAgICAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIFZh
bHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBWYXJpYWJs
ZVJlZih0eXBlQXJndW1lbnQub3JpZ2luLCB0eXBlQXJndW1lbnQubmFtZSk7CisgICAgICAgICAg
ICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBU
eXBlUmVmKHR5cGVBcmd1bWVudC5vcmlnaW4sIHR5cGVBcmd1bWVudC5uYW1lLCBbXSk7CisgICAg
ICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRbaV0g
aW5zdGFuY2VvZiBWYWx1ZQorICAgICAgICAgICAgICAgICYmICF0eXBlQXJndW1lbnRbaV0uaXND
b25zdGV4cHIpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3Jp
Z2luLm9yaWdpblN0cmluZywgIkV4cGVjdGVkIGNvbnN0ZXhwciIpOworICAgICAgICB9CisgICAg
fQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fcmVz
b2x2ZVR5cGVBcmd1bWVudHMobm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAg
IGxldCB0eXBlID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFR5cGUsIG5vZGUubmFtZSk7CisgICAg
ICAgIGlmICghdHlwZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9y
aWdpbi5vcmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5h
bWUpOworICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmlzRGVmaW5lZCh0eXBlKSkKKyAg
ICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcs
ICJJbGxlZ2FsIGZvcndhcmQgdXNlIG9mIHR5cGUgbmFtZWQgIiArIG5vZGUubmFtZSk7CisgICAg
ICAgIG5vZGUudHlwZSA9IHR5cGU7CisgICAgICAgIAorICAgICAgICBpZiAodHlwZS50eXBlUGFy
YW1ldGVycy5sZW5ndGggIT0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAg
IHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiV3JvbmcgbnVtYmVy
IG9mIHR5cGUgYXJndW1lbnRzIik7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZS50
eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcklz
VHlwZSA9IHR5cGUudHlwZVBhcmFtZXRlcnNbaV0gaW5zdGFuY2VvZiBUeXBlVmFyaWFibGU7Cisg
ICAgICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0gaW5z
dGFuY2VvZiBUeXBlOworICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzW2ldLnZpc2l0KHRo
aXMpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcklzVHlwZSAmJiAhYXJndW1lbnRJc1R5cGUp
CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJp
bmcsICJFeHBlY3RlZCB0eXBlLCBidXQgZ290IHZhbHVlIGF0IGFyZ3VtZW50ICMiICsgaSk7Cisg
ICAgICAgICAgICBpZiAoIXBhcmFtZXRlcklzVHlwZSAmJiBhcmd1bWVudElzVHlwZSkKKyAgICAg
ICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIkV4
cGVjdGVkIHZhbHVlLCBidXQgZ290IHR5cGUgYXQgYXJndW1lbnQgIyIgKyBpKTsKKyAgICAgICAg
fQorCisgICAgICAgIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQg
PSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4
dC5kZWZpbmVBbGwoKTsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgQ2hlY2tl
cihuYW1lQ29udGV4dCkpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUp
CisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFZhbHVl
LCBub2RlLm5hbWUpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5l
dyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB2
YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHJl
c3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAg
IG5vZGUuZnVuYyA9IHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAg
IHN1cGVyLnZpc2l0UmV0dXJuKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHBy
ZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9yZXNvbHZlVHlwZUFyZ3VtZW50cyhu
b2RlLnR5cGVBcmd1bWVudHMpOworICAgICAgICBzdXBlci52aXNpdENhbGxFeHByZXNzaW9uKG5v
ZGUpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBpc1ByaW1pdGl2ZSwgdHlwZVBhcmFtZXRlcnMpCisg
ICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUg
PSBuYW1lOworICAgICAgICB0aGlzLl9pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlOworICAgICAg
ICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgIH0KKyAgICAKKyAg
ICBnZXQgb3JpZ2luKCkgeyByZXR1bnIgdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7
IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhp
cy5faXNQcmltaXRpdmU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlz
Ll90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0K
KyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYg
KHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAg
ICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMg
dG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHMubGVuZ3RoKQor
ICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlVHlwZUlu
c3RhbmNlKHRoaXMsIHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygp
CisgICAgeworICAgICAgICByZXR1cm4gIm5hdGl2ZSAiICsgKHRoaXMuaXNQcmltaXRpdmUgPyAi
cHJpbWl0aXZlICIgOiAiIikgKyAidHlwZSAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBl
UGFyYW1ldGVycyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05h
dGl2ZVR5cGVJbnN0YW5jZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRp
dmVUeXBlSW5zdGFuY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0
aXZlVHlwZUluc3RhbmNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgTmF0aXZlVHlwZUluc3RhbmNlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Io
dHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOwor
ICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAg
CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgZ2V0IHR5cGVBcmd1
bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGlzUHJpbWl0
aXZlKCkgeyByZXR1cm4gdGhpcy5fdHlwZS5pc1ByaW1pdGl2ZTsgfQorICAgIGdldCBpc05hdGl2
ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3RoZXIudHlwZSkK
KyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlwZUFyZ3VtZW50
cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBlQXJndW1lbnRz
Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50c1tpXS51
bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0pKQorICAgICAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
dHlwZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvTm9kZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTm9kZSB7CisgICAgdmlz
aXQodmlzaXRvcikKKyAgICB7CisgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IHZpc2l0b3JbInZp
c2l0IiArIHRoaXMuY29uc3RydWN0b3IubmFtZV0odGhpcyk7CisgICAgICAgIGlmICgicmV0dXJu
VmFsdWUiIGluIHZpc2l0b3IpCisgICAgICAgICAgICByZXR1cm4gdmlzaXRvci5yZXR1cm5WYWx1
ZTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeSh1
bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0IHVuaWZ5VGhpcyA9
IHRoaXMudW5pZnlOb2RlOworICAgICAgICBsZXQgdW5pZnlPdGhlciA9IG90aGVyLnVuaWZ5Tm9k
ZTsKKyAgICAgICAgaWYgKHVuaWZ5T3RoZXIudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCB1bmlmeVRoaXMpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJl
dHVybiB1bmlmeVRoaXMudW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgdW5pZnlPdGhlcik7
CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQor
ICAgIHsKKyAgICAgICAgaWYgKG90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgdGhpcykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRo
aXMgPT0gb3RoZXI7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0
aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQor
ICAgIAorICAgIGdldCB1bmlmeU5vZGUoKSB7IHJldHVybiB0aGlzOyB9CisgICAgZ2V0IGlzVW5p
ZmlhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJl
dHVybiBmYWxzZTsgfQorICAgIAorICAgIGVxdWFscyhvdGhlcikKKyAgICB7CisgICAgICAgIGxl
dCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KCk7CisgICAgICAg
IHJldHVybiB0aGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpICYmIHVuaWZpY2F0
aW9uQ29udGV4dC5pc1VudW5pZmllZCgpOworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0dXRlKHBh
cmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0
KFN1YnN0aXR1dGlvbi5tYXBwaW5nKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkpOworICAgIH0K
KyAgICAKKyAgICBzdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihwYXJhbWV0ZXJzLCB1bmlmaWNhdGlv
bkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZShwYXJhbWV0ZXJzLCBw
YXJhbWV0ZXJzLm1hcCh0eXBlID0+IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHR5cGUpKSk7Cisg
ICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvUGFyc2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MTYgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVu
Y3Rpb24gcGFyc2UocHJvZ3JhbSwgb3JpZ2luLCB0ZXh0KQoreworICAgIGxldCBsZXhlciA9IG5l
dyBMZXhlcihvcmlnaW4sIHRleHQpOworICAgIAorICAgIC8vIFRoZSBoYXJkZXN0IHBhcnQgb2Yg
ZGVhbGluZyB3aXRoIEMtbGlrZSBsYW5ndWFnZXMgaXMgcGFyc2luZyB2YXJpYWJsZSBkZWNsYXJh
dGlvbiBzdGF0ZW1lbnRzLgorICAgIC8vIExldCdzIGNvbnNpZGVyIGlmIHRoaXMgaGFwcGVucyBp
biBBcnJheUxhbmcuIEhlcmUgYXJlIHRoZSB2YWxpZCBzdGF0ZW1lbnRzIGluIEFycmF5TGFuZyB0
aGF0CisgICAgLy8gYmVnaW4gd2l0aCBhbiBpZGVudGlmaWVyLCBpZiB3ZSBhc3N1bWUgdGhhdCBh
bnkgZXhwcmVzc2lvbiBjYW4gYmUgYSBzdGFuZGFsb25lIHN0YXRlbWVudC4KKyAgICAvLworICAg
IC8vICAgICB4OworICAgIC8vICAgICB4IDxiaW5vcD4geTsKKyAgICAvLyAgICAgeCA8IHk7Cisg
ICAgLy8gICAgIHggPCB5ID4gejsKKyAgICAvLyAgICAgeCA9IHk7CisgICAgLy8gICAgIHguZiA9
IHk7CisgICAgLy8gICAgIFxleHAgPSB5OworICAgIC8vICAgICB4WzQyXSA9IHk7CisgICAgLy8g
ICAgIHgoKTsKKyAgICAvLyAgICAgeDx5PigpOworICAgIC8vICAgICB4IHk7CisgICAgLy8gICAg
IHg8eT4gejsKKyAgICAvLyAgICAgZGV2aWNlIHhbXSB5OworICAgIC8vICAgICB4WzQyXSB5Owor
ICAgIC8vICAgICBkZXZpY2UgeF4geTsKKyAgICAvLyAgICAgdGhyZWFkIHheXiB5OworICAgIC8v
ICAgICB4XnRocmVhZF50aHJlYWQgeTsKKyAgICAvLyAgICAgeF5kZXZpY2VedGhyZWFkIHk7Cisg
ICAgLy8KKyAgICAvLyBUaGlzIGhhcyB0d28gcHJvYmxlbSBhcmVhczoKKyAgICAvLworICAgIC8v
ICAgICAtIHg8eT56IGNhbiBwYXJzZSB0d28gZGlmZmVyZW50IHdheXMgKGFzICh4IDwgeSkgPiB6
IG9yIHg8eT4geikuCisgICAgLy8gICAgIC0geFs0Ml0gY291bGQgYmVjb21lIGVpdGhlciBhbiBh
c3NpZ25tZW50IG9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgLy8gICAgIC0geDx5PiBj
b3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlv
bi4KKyAgICAvLworICAgIC8vIFdlIHNvbHZlIHRoZSBmaXJzdCBwcm9ibGVtIGJ5IGZvcmJpZGRp
bmcgZXhwcmVzc2lvbnMgYXMgc3RhdGVtZW50cy4gVGhlIGxhY2sgb2YgZnVuY3Rpb24KKyAgICAv
LyBwb2ludGVycyBtZWFucyB0aGF0IHdlIGNhbiBzdGlsbCBhbGxvdyBmdW5jdGlvbiBjYWxsIHN0
YXRlbWVudHMgLSB1bmxpa2UgaW4gQywgdGhvc2UgY2Fubm90CisgICAgLy8gaGF2ZSBhcmJpdHJh
cnkgZXhwcmVzc2lvbnMgYXMgdGhlIGNhbGxlZS4gVGhlIHJlbWFpbmluZyB0d28gcHJvYmxlbXMg
YXJlIHNvbHZlZCBieQorICAgIC8vIGJhY2t0cmFja2luZy4gSW4gYWxsIG90aGVyIHJlc3BlY3Rz
LCB0aGlzIGlzIGEgc2ltcGxlIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4KKyAgICAKKyAgICBm
dW5jdGlvbiBnZW5lcmljQ29uc3VtZShjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCB0b2tl
biA9IGxleGVyLm5leHQoKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIGxleGVy
LmZhaWwoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrKHRv
a2VuKSkKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tl
bi50ZXh0ICsgIjsgZXhwZWN0ZWQ6ICIgKyB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIHRva2VuOwor
ICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBjb25zdW1lKC4uLnRleHRzKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIGdlbmVyaWNDb25zdW1lKHRva2VuID0+IHRleHRzLmluY2x1ZGVzKHRva2VuLnRl
eHQpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gY29uc3VtZUtpbmQoa2luZCkKKyAgICB7
CisgICAgICAgIHJldHVybiBnZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0b2tlbi5raW5kID09IGtp
bmQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBhc3NlcnROZXh0KC4uLnRleHRzKQorICAg
IHsKKyAgICAgICAgbGV4ZXIucHVzaChjb25zdW1lKC4uLnRleHRzKSk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIGdlbmVyaWNUZXN0KGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0IHRv
a2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAodG9rZW4gJiYgY2FsbGJhY2sodG9rZW4p
KQorICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gdGVzdCguLi50ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVy
biBnZW5lcmljVGVzdCh0b2tlbiA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0KSk7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHRlc3RLaW5kKGtpbmQpCisgICAgeworICAgICAgICByZXR1
cm4gZ2VuZXJpY1Rlc3QodG9rZW4gPT4gdG9rZW4ua2luZCA9PSBraW5kKTsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gdHJ5Q29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAgIGxldCBy
ZXN1bHQgPSB0ZXN0KC4uLnRleHRzKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAg
IGxleGVyLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gdHJ5Q29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQg
PSB0ZXN0S2luZChraW5kKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVy
Lm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gcGFyc2VQcm90b2NvbFJlZigpCisgICAgeworICAgICAgICBsZXQgcHJvdG9jb2xUb2tlbiA9
IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xS
ZWYocHJvdG9jb2xUb2tlbi5vcmlnaW4sIHByb3RvY29sVG9rZW4udGV4dCk7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCkKKyAgICB7CisgICAgICAgIGxl
dCByaWdodFNoaWZ0ID0gdHJ5Q29uc3VtZSgiPj4iKTsKKyAgICAgICAgaWYgKHJpZ2h0U2hpZnQp
CisgICAgICAgICAgICBsZXhlci5wdXNoKG5ldyBMZXhlclRva2VuKGxleGVyLCByaWdodFNoaWZ0
Lm9yaWdpbiwgcmlnaHRTaGlmdC5pbmRleCwgcmlnaHRTaGlmdC5raW5kLCAiPiIpKTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgY29uc3VtZSgiPiIpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVR5cGVQYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICAgIGlmICghdGVzdCgiPCIp
KQorICAgICAgICAgICAgcmV0dXJuIFtdOworICAgICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9
IFtdOworICAgICAgICBjb25zdW1lKCI8Iik7CisgICAgICAgIHdoaWxlICghdGVzdCgiPiIpKSB7
CisgICAgICAgICAgICBsZXQgY29uc3RleHByID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkg
PT4geworICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcGFyc2VUeXBlKCk7CisgICAgICAgICAg
ICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAg
ICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgIHJldHVybiBu
ZXcgQ29uc3RleHByVHlwZVBhcmFtZXRlcih0eXBlLm9yaWdpbiwgbmFtZSwgdHlwZSk7CisgICAg
ICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAg
cmVzdWx0LnB1c2goY29uc3RleHByKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAg
ICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgICAgICAg
ICBsZXQgcHJvdG9jb2wgPSB0cnlDb25zdW1lKCI6IikgPyBwYXJzZVByb3RvY29sUmVmKCkgOiBu
dWxsOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlVmFyaWFibGUobmFtZS5v
cmlnaW4sIG5hbWUudGV4dCwgcHJvdG9jb2wpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVGVybSgpCisgICAgeworICAgICAgICBs
ZXQgdG9rZW47CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIm51bGwiKSkKKyAgICAg
ICAgICAgIHJldHVybiBuZXcgTnVsbCh0b2tlbi5vcmlnaW4pOworICAgICAgICBpZiAodG9rZW4g
PSB0cnlDb25zdW1lS2luZCgiaWRlbnRpZmllciIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBW
YXJpYWJsZVJlZih0b2tlbi5vcmlnaW4sIHRva2VuLnRleHQpOworICAgICAgICBpZiAodG9rZW4g
PSB0cnlDb25zdW1lS2luZCgiaW50TGl0ZXJhbCIpKSB7CisgICAgICAgICAgICBsZXQgaW50VmVy
c2lvbiA9IHRva2VuLnRleHQgfCAwOworICAgICAgICAgICAgaWYgKGludFZlcnNpb24gIT0gdG9r
ZW4udGV4dCkKKyAgICAgICAgICAgICAgICBsZXhlci5mYWlsKCJJbnRlZ2VyIGxpdGVyYWwgaXMg
bm90IDMyLWJpdCBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwo
dG9rZW4ub3JpZ2luLCBpbnRWZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTog
TmVlZCBzdXBwb3J0IGZvciBmbG9hdCBsaXRlcmFscyBhbmQgcHJvYmFibHkgb3RoZXIgbGl0ZXJh
bHMgdG9vLgorICAgICAgICB0b2tlbiA9IGNvbnN1bWVLaW5kKCJkb3VibGVMaXRlcmFsIik7Cisg
ICAgICAgIHJldHVybiBuZXcgRG91YmxlTGl0ZXJhbCh0b2tlbi5vcmlnaW4sICt0b2tlbi50ZXh0
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDb25zdGV4cHIoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHBhcnNlVGVybSgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJz
ZVR5cGVBcmd1bWVudHMoKQorICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8IikpCisgICAgICAg
ICAgICByZXR1cm4gW107CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gW107CisgICAg
ICAgIGNvbnN1bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+IikpIHsKKyAgICAgICAg
ICAgIC8vIEl0J3MgcG9zc2libGUgZm9yIGEgY29uc3RleHByIG9yIHR5cGUgY2FuIHN5bnRhY3Rp
Y2FsbHkgb3ZlcmxhcCBpbiB0aGUgc2luZ2xlCisgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGNh
c2UuIExldCdzIGNvbnNpZGVyIHRoZSBwb3NzaWJpbGl0aWVzOgorICAgICAgICAgICAgLy8KKyAg
ICAgICAgICAgIC8vICAgICBUICAgICAgICAgIGNvdWxkIGJlIHR5cGUgb3IgY29uc3RleHByCisg
ICAgICAgICAgICAvLyAgICAgVFtdICAgICAgICBvbmx5IHR5cGUKKyAgICAgICAgICAgIC8vICAg
ICBUWzQyXSAgICAgIG9ubHkgdHlwZSAoY29uc3RleHByIGNhbm5vdCBkbyBpbmRleGluZykKKyAg
ICAgICAgICAgIC8vICAgICA0MiAgICAgICAgIG9ubHkgY29uc3RleHByCisgICAgICAgICAgICAv
LworICAgICAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSB3ZSdsbCBhbGxvdyBjb25zdGV4cHJzIHRv
IGRvIG1vcmUgdGhpbmdzLCBhbmQgdGhlbiB3ZSdsbCBzdGlsbCBoYXZlCisgICAgICAgICAgICAv
LyB0aGUgcHJvYmxlbSB0aGF0IHNvbWV0aGluZyBvZiB0aGUgZm9ybSBUWzFdWzJdWzNdLi4uIGNh
biBlaXRoZXIgYmUgYSB0eXBlIG9yIGEKKyAgICAgICAgICAgIC8vIGNvbnN0ZXhwciwgYW5kIHdl
IGNhbiBmaWd1cmUgb3V0IGluIHRoZSBjaGVja2VyIHdoaWNoIGl0IGlzLgorICAgICAgICAgICAg
bGV0IHR5cGVPclZhcmlhYmxlUmVmID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4gewor
ICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOwor
ICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAg
ICAgIHJldHVybiBuZXcgVHlwZU9yVmFyaWFibGVSZWYocmVzdWx0Lm9yaWdpbiwgcmVzdWx0LnRl
eHQpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAodHlwZU9yVmFyaWFibGVSZWYp
CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZU9yVmFyaWFibGVSZWYpOworICAgICAg
ICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IGNvbnN0ZXhwciA9IGxleGVyLmJhY2t0
cmFja2luZ1Njb3BlKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHBh
cnNlQ29uc3RleHByKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIs
ICI+PiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAg
ICAgIH0pOworICAgICAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAg
ICAgIHJlc3VsdC5wdXNoKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAg
ICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICB9CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlwZSgpCisgICAgewor
ICAgICAgICBsZXQgdG9rZW47CisgICAgICAgIGxldCBhZGRyZXNzU3BhY2U7CisgICAgICAgIGxl
dCBhZGRyZXNzU3BhY2VDb25zdW1lZCA9IGZhbHNlOworICAgICAgICBpZiAodG9rZW4gPSB0cnlD
b25zdW1lKC4uLmFkZHJlc3NTcGFjZXMpKQorICAgICAgICAgICAgYWRkcmVzc1NwYWNlID0gdG9r
ZW4udGV4dDsKKyAgICAgICAgCisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50
aWZpZXIiKTsKKyAgICAgICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5cGVBcmd1bWVudHMo
KTsKKyAgICAgICAgbGV0IHR5cGUgPSBuZXcgVHlwZVJlZihuYW1lLm9yaWdpbiwgbmFtZS50ZXh0
LCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGZ1bmN0aW9uIGdldEFkZHJlc3NT
cGFjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZHJlc3NTcGFjZUNvbnN1bWVkID0gdHJ1
ZTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzU3BhY2UpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgICAgIHJldHVybiB0cnlDb25zdW1lKC4uLmFkZHJlc3NT
cGFjZXMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlD
b25zdW1lKCJeIiwgIlsiKSkgeworICAgICAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIl4iKSB7
CisgICAgICAgICAgICAgICAgdHlwZSA9IG5ldyBQdHJUeXBlKHRva2VuLm9yaWdpbiwgZ2V0QWRk
cmVzc1NwYWNlKCksIHR5cGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAg
ICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAodHJ5Q29uc3VtZSgiXSIpKSB7Cisg
ICAgICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVJlZlR5cGUodG9rZW4ub3JpZ2luLCBnZXRB
ZGRyZXNzU3BhY2UoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHR5cGUgPSBuZXcgQXJyYXlUeXBlKHRv
a2VuLm9yaWdpbiwgdHlwZSwgcGFyc2VDb25zdGV4cHIoKSk7CisgICAgICAgICAgICBjb25zdW1l
KCJdIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhZGRyZXNzU3BhY2UgJiYg
IWFkZHJlc3NTcGFjZUNvbnN1bWVkKQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiQWRkcmVzcyBz
cGFjZSBzcGVjaWZpZWQgZm9yIHR5cGUgdGhhdCBkb2VzIG5vdCBuZWVkIGFkZHJlc3Mgc3BhY2Ui
KTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVR5cGVEZWYoKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUo
InR5cGUiKS5vcmlnaW47CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZp
ZXIiKS50ZXh0OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0
ZXJzKCk7CisgICAgICAgIGNvbnN1bWUoIj0iKTsKKyAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5
cGUoKTsKKyAgICAgICAgY29uc3VtZSgiOyIpOworICAgICAgICByZXR1cm4gbmV3IFR5cGVEZWYo
b3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSk7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIHBhcnNlTmF0aXZlKCkKKyAgICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1l
KCJuYXRpdmUiKS5vcmlnaW47CisgICAgICAgIGxldCBpc1R5cGUgPSBsZXhlci5iYWNrdHJhY2tp
bmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICBpZiAodHJ5Q29uc3VtZSgidHlwZSIpKQorICAg
ICAgICAgICAgICAgIHJldHVybiAibm9ybWFsIjsKKyAgICAgICAgICAgIGNvbnN1bWUoInByaW1p
dGl2ZSIpOworICAgICAgICAgICAgY29uc3VtZSgidHlwZSIpOworICAgICAgICAgICAgcmV0dXJu
ICJwcmltaXRpdmUiOworICAgICAgICB9KTsKKyAgICAgICAgaWYgKGlzVHlwZSkgeworICAgICAg
ICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAg
bGV0IHBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBjb25z
dW1lKCI7Iik7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5cGUob3JpZ2luLCBuYW1l
LnRleHQsIGlzVHlwZSA9PSAicHJpbWl0aXZlIiwgcGFyYW1ldGVycyk7CisgICAgICAgIH0KKyAg
ICAgICAgbGV0IHJldHVyblR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgbGV0IG5hbWUgPSBj
b25zdW1lS2luZCgiaWRlbnRpZmllciIpLnRleHQ7CisgICAgICAgIGxldCB0eXBlUGFyYW1ldGVy
cyA9IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSBwYXJz
ZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgY29uc3VtZSgiOyIpOworICAgICAgICByZXR1cm4gTmF0
aXZlRnVuYyhvcmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0
ZXJzKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gZ2VuZXJpY1BhcnNlTGVmdCh0ZXh0cywg
bmV4dFBhcnNlciwgY29uc3RydWN0b3IpCisgICAgeworICAgICAgICBsZXQgbGVmdCA9IG5leHRQ
YXJzZXIoKTsKKyAgICAgICAgbGV0IHRva2VuOworICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlD
b25zdW1lKC4uLnRleHRzKSkKKyAgICAgICAgICAgIGxlZnQgPSBjb25zdHJ1Y3Rvcih0b2tlbiwg
bGVmdCwgbmV4dFBhcnNlcigpKTsKKyAgICAgICAgcmV0dXJuIGxlZnQ7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbCh0ZXh0cywgbmV4dFBhcnNlcikKKyAg
ICB7CisgICAgICAgIHJldHVybiBnZW5lcmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgdGV4dHMs
IG5leHRQYXJzZXIsCisgICAgICAgICAgICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9PgorICAgICAg
ICAgICAgICAgIG5ldyBDYWxsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0
b2tlbi50ZXh0LCBbXSwgW2xlZnQsIHJpZ2h0XSkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlv
biBwYXJzZUNhbGxFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIGxldCBuYW1lID0gY29uc3Vt
ZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5
cGVBcmd1bWVudHMoKTsKKyAgICAgICAgY29uc3VtZSgiKCIpOworICAgICAgICBsZXQgYXJndW1l
bnRMaXN0ID0gW107CisgICAgICAgIHdoaWxlICghdGVzdCgiKSIpKSB7CisgICAgICAgICAgICBh
cmd1bWVudExpc3QucHVzaChwYXJzZUV4cHJlc3Npb24oKSk7CisgICAgICAgICAgICBpZiAoIXRy
eUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAg
ICBjb25zdW1lKCIpIik7CisgICAgICAgIHJldHVybiBuZXcgQ2FsbEV4cHJlc3Npb24obmFtZS5v
cmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVTdWZmaXgoKQorICAgIHsKKyAgICAgICAgbGV0IHNp
bXBsZUNhc2UgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICBs
ZXQgbGVmdCA9IHBhcnNlVGVybSgpOworICAgICAgICAgICAgbGV0IHRva2VuOworICAgICAgICAg
ICAgd2hpbGUgKHRva2VuID0gdHJ5Q29uc3VtZSgiKysiLCAiLS0iLCAiLiIsICItPiIsICJbIikp
IHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHRva2VuLnRleHQpIHsKKyAgICAgICAgICAgICAg
ICBjYXNlICIrKyI6CisgICAgICAgICAgICAgICAgY2FzZSAiLS0iOgorICAgICAgICAgICAgICAg
ICAgICBsZWZ0ID0gbmV3IFN1ZmZpeENhbGxBc3NpZ25tZW50KHRva2VuLm9yaWdpbiwgIm9wZXJh
dG9yIiArIHRva2VuLnRleHQsIGxlZnQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAg
ICAgICAgICAgICAgICBjYXNlICIuIjoKKyAgICAgICAgICAgICAgICBjYXNlICItPiI6CisgICAg
ICAgICAgICAgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICItPiIpCisgICAgICAgICAgICAgICAg
ICAgICAgICBsZWZ0ID0gbmV3IERlcmVmZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIGxl
ZnQpOworICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IERvdEV4cHJlc3Npb24odG9rZW4u
b3JpZ2luLCBsZWZ0LCBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpKTsKKyAgICAgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiWyI6IHsKKyAgICAgICAgICAgICAg
ICAgICAgbGV0IGluZGV4ID0gcGFyc2VFeHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAg
IGNvbnN1bWUoIl0iKTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBJbmRleEV4cHJl
c3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0LCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJy
ZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAg
ICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCB0b2tlbjogIiArIHRva2VuKTsKKyAg
ICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVmdDsK
KyAgICAgICAgfSk7CisgICAgICAgIGlmIChzaW1wbGVDYXNlKQorICAgICAgICAgICAgcmV0dXJu
IHNpbXBsZUNhc2U7CisgICAgICAgIAorICAgICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVzc2lv
bigpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUHJlZml4KCkKKyAg
ICB7CisgICAgICAgIGxldCB0b2tlbjsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgi
KysiLCAiLS0iLCAiKyIsICItIiwgIiEiLCAifiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBD
YWxsQXNzaWdubWVudCh0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBwYXJz
ZVBvc3NpYmxlUHJlZml4KCkpOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJeIikp
CisgICAgICAgICAgICByZXR1cm4gbmV3IERlcmVmZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmln
aW4sIHBhcnNlUG9zc2libGVQcmVmaXgoKSk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1
bWUoIlxcIikpCisgICAgICAgICAgICByZXR1cm4gbmV3IE1ha2VQdHJFeHByZXNzaW9uKHRva2Vu
Lm9yaWdpbiwgcGFyc2VQb3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5
Q29uc3VtZSgiJiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNYWtlQXJyYXlSZWZFeHByZXNz
aW9uKHRva2VuLm9yaWdpbiwgcGFyc2VQb3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgcmV0dXJu
IHBhcnNlUG9zc2libGVTdWZmaXgoKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQ
b3NzaWJsZVByb2R1Y3QoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9y
Q2FsbChbIioiLCAiLyIsICIlIl0sIHBhcnNlUG9zc2libGVQcmVmaXgpOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlU3VtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBw
YXJzZUxlZnRPcGVyYXRvckNhbGwoWyIrIiwgIi0iXSwgcGFyc2VQb3NzaWJsZVByb2R1Y3QpOwor
ICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlU2hpZnQoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIjw8IiwgIj4+Il0sIHBhcnNlUG9z
c2libGVTdW0pOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUmVsYXRp
b25hbEluZXF1YWxpdHkoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9y
Q2FsbChbIjwiLCAiPiIsICI8PSIsICI9PiJdLCBwYXJzZVBvc3NpYmxlU2hpZnQpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEVxdWFsaXR5KCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBnZW5lcmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgWyI9PSIs
ICIhPSJdLCBwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEluZXF1YWxpdHksCisgICAgICAgICAgICAo
dG9rZW4sIGxlZnQsIHJpZ2h0KSA9PiB7CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5l
dyBDYWxsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvcj09IiwgW10sIFtsZWZ0LCBy
aWdodF0pOworICAgICAgICAgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICIhPSIpCisgICAgICAg
ICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYWxsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sICJv
cGVyYXRvciEiLCBbXSwgW3Jlc3VsdF0pOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJs
ZUJpdHdpc2VBbmQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2Fs
bChbIiYiXSwgcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxFcXVhbGl0eSk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlWG9yKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyJeIl0sIHBhcnNlUG9zc2libGVCaXR3aXNlQW5k
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VPcigpCisg
ICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsifCJdLCBwYXJzZVBv
c3NpYmxlQml0d2lzZVhvcik7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTGVmdExv
Z2ljYWxFeHByZXNzaW9uKHRleHRzLCBuZXh0UGFyc2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGdlbmVyaWNQYXJzZUxlZnQoCisgICAgICAgICAgICB0ZXh0cywgbmV4dFBhcnNlciwKKyAgICAg
ICAgICAgICh0b2tlbiwgbGVmdCwgcmlnaHQpID0+IG5ldyBMb2dpY2FsRXhwcmVzc2lvbih0b2tl
bi5vcmlnaW4sIHRva2VuLnRleHQsIGxlZnQsIHJpZ2h0KSk7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIHBhcnNlUG9zc2libGVMb2dpY2FsQW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBw
YXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lvbihbIiYmIl0sIHBhcnNlUG9zc2libGVCaXR3aXNlT3Ip
OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlTG9naWNhbE9yKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lvbihbInx8Il0sIHBh
cnNlUG9zc2libGVMb2dpY2FsQW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQ
b3NzaWJsZVRlcm5hcnlDb25kaXRpb25hbCgpCisgICAgeworICAgICAgICBsZXQgcHJlZGljYXRl
ID0gcGFyc2VQb3NzaWJsZUxvZ2ljYWxPcigpOworICAgICAgICBsZXQgb3BlcmF0b3IgPSB0cnlD
b25zdW1lKCI/Iik7CisgICAgICAgIGlmICghb3BlcmF0b3IpCisgICAgICAgICAgICByZXR1cm4g
cHJlZGljYXRlOworICAgICAgICByZXR1cm4gbmV3IFRlcm5hcnlFeHByZXNzaW9uKG9wZXJhdG9y
Lm9yaWdpbiwgcHJlZGljYXRlLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpLCBwYXJzZVBvc3Np
YmxlQXNzaWdubWVudCgpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJs
ZUFzc2lnbm1lbnQobW9kZSkKKyAgICB7CisgICAgICAgIGxldCBsaHMgPSBwYXJzZVBvc3NpYmxl
VGVybmFyeUNvbmRpdGlvbmFsKCk7CisgICAgICAgIGxldCBvcGVyYXRvciA9IHRyeUNvbnN1bWUo
Ij0iLCAiKz0iLCAiLT0iLCAiKj0iLCAiLz0iLCAiJT0iLCAiXj0iLCAifD0iLCAiJj0iKTsKKyAg
ICAgICAgaWYgKCFvcGVyYXRvcikgeworICAgICAgICAgICAgaWYgKG1vZGUgPT0gInJlcXVpcmVk
IikKKyAgICAgICAgICAgICAgICBsZXhlci5mYWlsKCJFeHBlY3RlZCBhc3NpZ25tZW50Iik7Cisg
ICAgICAgICAgICByZXR1cm4gbGhzOworICAgICAgICB9CisgICAgICAgIGlmIChvcGVyYXRvci50
ZXh0ID09ICI9IikKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudChvcGVyYXRvci5v
cmlnaW4sIGxocywgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSk7CisgICAgICAgIGxldCBuYW1l
ID0gIm9wZXJhdG9yIiArIG9wZXJhdG9yLnRleHQuc3Vic3RyaW5nKDAsIHRlcm0ub3BlcmF0b3Iu
bGVuZ3RoIC0gMSk7CisgICAgICAgIHJldHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQob3BlcmF0b3Iu
b3JpZ2luLCBuYW1lLCBsaHMsIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KCkpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZUFzc2lnbm1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHBhcnNlUG9zc2libGVBc3NpZ25tZW50KCJyZXF1aXJlZCIpOworICAgIH0KKyAgICAKKyAgICBm
dW5jdGlvbiBwYXJzZUVmZmVjdGZ1bEV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgbGV0IGFz
c2lnbm1lbnQgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZShwYXJzZUFzc2lnbm1lbnQpOworICAg
ICAgICBpZiAoYXNzaWdubWVudCkKKyAgICAgICAgICAgIHJldHVybiBhc3NpZ25tZW50OworICAg
ICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVzc2lvbigpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBnZW5lcmljUGFyc2VDb21tYUV4cHJlc3Npb24oZmluYWxFeHByZXNzaW9uUGFyc2VyKQor
ICAgIHsKKyAgICAgICAgbGV0IGxpc3QgPSBbXTsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGxleGVy
LnBlZWsoKTsKKyAgICAgICAgaWYgKCFvcmlnaW4pCisgICAgICAgICAgICBsZXhlci5mYWlsKCJV
bmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisgICAgICAgIG9yaWdpbiA9IG9yaWdpbi5vcmlnaW47
CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIGxldCBlZmZlY3RmdWxFeHByZXNzaW9u
ID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUocGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKTsKKyAg
ICAgICAgICAgIGlmICghZWZmZWN0ZnVsRXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIGxp
c3QucHVzaChmaW5hbEV4cHJlc3Npb25QYXJzZXIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7
CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0LnB1c2goZWZmZWN0ZnVsRXhwcmVzc2lv
bik7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBi
cmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENvbW1hRXhwcmVzc2lvbihvcmln
aW4sIGxpc3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNvbW1hRXhwcmVzc2lv
bigpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1BhcnNlQ29tbWFFeHByZXNzaW9uKHBh
cnNlUG9zc2libGVBc3NpZ25tZW50KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VF
eHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUNvbW1hRXhwcmVzc2lvbigp
OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUVmZmVjdGZ1bFN0YXRlbWVudCgpCisg
ICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gZ2VuZXJpY1BhcnNlQ29tbWFFeHByZXNzaW9uKHBh
cnNlRWZmZWN0ZnVsRXhwcmVzc2lvbik7CisgICAgICAgIGNvbnN1bWUoIjsiKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VSZXR1cm4oKQor
ICAgIHsKKyAgICAgICAgY29uc3VtZSgicmV0dXJuIik7CisgICAgICAgIHJldHVybiBwYXJzZUV4
cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnQoKQor
ICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAodG9r
ZW4udGV4dCA9PSAiOyIpIHsKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgICAg
IHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJyZXR1
cm4iKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlUmV0dXJuKCk7CisgICAgICAgIGlmICh0b2tl
bi50ZXh0ID09ICJicmVhayIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VCcmVhaygpOworICAg
ICAgICBpZiAodG9rZW4udGV4dCA9PSAiY29udGludWUiKQorICAgICAgICAgICAgcmV0dXJuIHBh
cnNlQ29udGludWUoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIndoaWxlIikKKyAgICAg
ICAgICAgIHJldHVybiBwYXJzZVdoaWxlKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJk
byIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VEbygpOworICAgICAgICBpZiAodG9rZW4udGV4
dCA9PSAiZm9yIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUZvcigpOworICAgICAgICBsZXQg
dmFyaWFibGVEZWNsID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUocGFyc2VWYXJpYWJsZURlY2wp
OworICAgICAgICBpZiAodmFyaWFibGVEZWNsKQorICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxl
RGVjbDsKKyAgICAgICAgcmV0dXJuIHBhcnNlRWZmZWN0ZnVsU3RhdGVtZW50KCk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlQmxvY2soKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdp
biA9IGNvbnN1bWUoInsiKS5vcmlnaW47CisgICAgICAgIGxldCBibG9jayA9IG5ldyBCbG9jayhv
cmlnaW4pOworICAgICAgICB3aGlsZSAoIXRlc3QoIn0iKSkgeworICAgICAgICAgICAgbGV0IHN0
YXRlbWVudCA9IHBhcnNlU3RhdGVtZW50KCk7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50KQor
ICAgICAgICAgICAgICAgIGJsb2NrLnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfQorICAgICAg
ICBjb25zdW1lKCJ9Iik7CisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VQYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICAgIGNvbnN1bWUoIigiKTsK
KyAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSBbXTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCIpIikp
IHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChwYXJzZVBhcmFtZXRlcigpKTsKKyAgICAg
ICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIGNvbnN1bWUoIikiKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7
CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRnVuY0RlZigpCisgICAgeworICAgICAg
ICBsZXQgcmV0dXJuVHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAgICBsZXQgbmFtZSA9IGNvbnN1
bWVLaW5kKCJpZGVudGlmaWVyIikudGV4dDsKKyAgICAgICAgbGV0IHR5cGVQYXJhbWV0ZXJzID0g
cGFyc2VUeXBlUGFyYW1ldGVycygpOworICAgICAgICBsZXQgcGFyYW1ldGVycyA9IHBhcnNlUGFy
YW1ldGVycygpOworICAgICAgICBsZXQgYmxvY2sgPSBwYXJzZUJsb2NrKCk7CisgICAgICAgIHJl
dHVybiBuZXcgRnVuY0RlZihyZXR1cm5UeXBlLm9yaWdpbiwgbmFtZSwgcmV0dXJuVHlwZSwgdHlw
ZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMsIGJvZHkpOworICAgIH0KKyAgICAKKyAgICBmb3IgKDs7
KSB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKCF0b2tl
bikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIjsiKQor
ICAgICAgICAgICAgbGV4ZXIubmV4dCgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09
ICJ0eXBlIikKKyAgICAgICAgICAgIHBhcnNlVHlwZURlZigpOworICAgICAgICBlbHNlIGlmICh0
b2tlbi50ZXh0ID09ICJuYXRpdmUiKQorICAgICAgICAgICAgcGFyc2VOYXRpdmUoKTsKKyAgICAg
ICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAic3RydWN0IikKKyAgICAgICAgICAgIHBhcnNlU3Ry
dWN0VHlwZSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJlbnVtIikKKyAgICAg
ICAgICAgIHBhcnNlRW51bSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJwcm90
b2NvbCIpCisgICAgICAgICAgICBwYXJzZVByb3RvY29sRGVjbCgpOworICAgICAgICBlbHNlCisg
ICAgICAgICAgICBwYXJzZUZ1bmNEZWYoKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1ByZXBhcmUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJlcGFy
ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QcmVwYXJlLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcHJlcGFyZShvcmlnaW4s
IHRleHQpCit7CisgICAgbGV0IHByb2dyYW0gPSBuZXcgUHJvZ3JhbSgpOworICAgIHBhcnNlKHBy
b2dyYW0sIG9yaWdpbiwgdGV4dCk7CisgICAgcmVzb2x2ZU5hbWVzKHByb2dyYW0pOworICAgIHJl
c29sdmVUeXBlRGVmcyhwcm9ncmFtKTsKKyAgICBjaGVjayhwcm9ncmFtKTsKKyAgICBpbmxpbmUo
cHJvZ3JhbSk7CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1Byb2dyYW0uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUg
eworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVt
ZW50cyA9IFtdOworICAgICAgICB0aGlzLl9mdW5jdGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAg
IHRoaXMuX3R5cGVzID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9mdW5jSW5zdGFudGlhdG9y
ID0gbmV3IEZ1bmNJbnN0YW50aWF0b3IoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHRvcExldmVs
U3RhdGVtZW50cygpIHsgcmV0dXJuIHRoaXMuX3RvcExldmVsU3RhdGVtZW50czsgfQorICAgIGdl
dCBmdW5jdGlvbnMoKSB7IHJldHVybiB0aGlzLl9mdW5jdGlvbnM7IH0KKyAgICBnZXQgdHlwZXMo
KSB7IHJldHVybiB0aGlzLl90eXBlczsgfQorICAgIGdldCBmdW5jSW5zdGFudGlhdG9yKCkgeyBy
ZXR1cm4gdGhpcy5fZnVuY0luc3RhbnRpYXRvcjsgfQorICAgIAorICAgIGFkZFRvcExldmVsU3Rh
dGVtZW50KHN0YXRlbWVudCkKKyAgICB7CisgICAgICAgIHN0YXRlbWVudC5wcm9ncmFtID0gdGhp
czsKKyAgICAgICAgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIEZ1bmMpIHsKKyAgICAgICAgICAg
IGxldCBhcnJheSA9IHRoaXMuX2Z1bmN0aW9ucy5nZXQoc3RhdGVtZW50Lm5hbWUpOworICAgICAg
ICAgICAgaWYgKCFhcnJheSkKKyAgICAgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbnMuc2V0KHN0
YXRlbWVudC5uYW1lLCBhcnJheSA9IFtdKTsKKyAgICAgICAgICAgIGFycmF5LnB1c2goc3RhdGVt
ZW50KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQorICAg
ICAgICAgICAgdGhpcy5fdHlwZXMuc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAg
ICAgICBlbHNlCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBub3Qg
YSBmdW5jdGlvbiBvciB0eXBlOiAiICsgc3RhdGVtZW50KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2
ZWxTdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVzb2x2ZUZ1
bmNPdmVybG9hZChuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKQorICAgIHsKKyAg
ICAgICAgbGV0IGZ1bmN0aW9ucyA9IHRoaXMuZnVuY3Rpb25zLmdldChuYW1lKTsKKyAgICAgICAg
aWYgKCFmdW5jdGlvbnMpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAg
ICAgIHJldHVybiByZXNvbHZlT3ZlcmxvYWRJbXBsKGZ1bmN0aW9ucywgdHlwZUFyZ3VtZW50cywg
YXJndW1lbnRUeXBlcyk7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lQ29udGV4dCgpCisgICAg
eworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIGZvciAo
bGV0IHN0YXRlbWVudCBvZiB0aGlzLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHJl
c3VsdC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1Byb3RvY29sLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgUHJvdG9jb2wgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUp
CisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25h
bWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5f
b3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0
IGtpbmQoKSB7IHJldHVybiBQcm90b2NvbDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvUHJvdG9jb2xEZWNsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1By
b3RvY29sRGVjbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2Nv
bERlY2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJv
dG9jb2xEZWNsIGV4dGVuZHMgUHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFt
ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbmFtZSkKKyAgICAgICAgdGhpcy5fc2ln
bmF0dXJlcyA9IFtdOworICAgICAgICB0aGlzLl9zaWduYXR1cmVNYXAgPSBuZXcgTWFwKCk7Cisg
ICAgICAgIHRoaXMuX3R5cGVWYXJpYWJsZSA9IG5ldyBUeXBlVmFyaWFibGUob3JpZ2luLCBuYW1l
LCBudWxsKTsKKyAgICB9CisgICAgCisgICAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7
CisgICAgICAgIC8vIE5PVEU6IEFueSB0eXBlIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIHNpZ25h
dHVyZSBtdXN0IGJlIGluZmVyYWJsZSBmcm9tIHRoZSB2YWx1ZQorICAgICAgICAvLyBwYXJhbWV0
ZXJzLgorICAgICAgICAvLyBGSVhNRTogQ2hlY2sgdGhpcyEgKE9PUFMhKQorICAgICAgICB0aGlz
Ll9zaWduYXR1cmVzLnB1c2goc2lnbmF0dXJlKTsKKyAgICAgICAgbGV0IG92ZXJsb2FkcyA9IHRo
aXMuX3NpZ25hdHVyZU1hcC5nZXQoc2lnbmF0dXJlLm5hbWUpOworICAgICAgICBpZiAoIW92ZXJs
b2FkcykKKyAgICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZU1hcC5zZXQoc2lnbmF0dXJlLm5hbWUs
IG92ZXJsb2FkcyA9IFtdKTsKKyAgICAgICAgb3ZlcmxvYWRzLnB1c2goc2lnbmF0dXJlKTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IHNpZ25hdHVyZXMoKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVz
OyB9CisgICAgc2lnbmF0dXJlc0J5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVN
YXAuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IHR5cGVWYXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMuX3R5
cGVWYXJpYWJsZTsgfQorICAgIAorICAgIHNpZ25hdHVyZXNCeU5hbWVXaXRoVHlwZVZhcmlhYmxl
KG5hbWUsIHR5cGVWYXJpYWJsZSkKKyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBu
ZXcgU3Vic3RpdHV0aW9uKFt0aGlzLnR5cGVWYXJpYWJsZV0sIFt0eXBlVmFyaWFibGVdKTsKKyAg
ICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuc2lnbmF0dXJlc0J5TmFtZShuYW1lKTsKKyAgICAgICAg
aWYgKCFyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJl
c3VsdC5tYXAoc2lnbmF0dXJlID0+IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAg
ICB9CisgICAgCisgICAgaW5oZXJpdHMob3RoZXJQcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlm
ICghb3RoZXJQcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAg
ICAgICAgaWYgKG90aGVyUHJvdG9jb2wgaW5zdGFuY2VvZiBQcm90b2NvbFJlZikKKyAgICAgICAg
ICAgIG90aGVyUHJvdG9jb2wgPSBvdGhlclByb3RvY29sLnByb3RvY29sRGVjbDsKKyAgICAgICAg
CisgICAgICAgIGZvciAobGV0IG90aGVyU2lnbmF0dXJlIG9mIG90aGVyUHJvdG9jb2wuc2lnbmF0
dXJlcykgeworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZXMgPSB0aGlzLnNpZ25hdHVyZXNCeU5h
bWUob3RoZXJTaWduYXR1cmUubmFtZSk7CisgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZXMpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbGV0IG92ZXJsb2FkID0g
cmVzb2x2ZU92ZXJsb2FkSW1wbChzaWduYXR1cmVzLCBbXSwgb3RoZXJTaWduYXR1cmUucGFyYW1l
dGVyVHlwZXMpOworICAgICAgICAgICAgaWYgKCFvdmVybG9hZCkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0KKyAg
ICAgICAgICAgICAgICBvdmVybG9hZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmlj
YXRpb24oCisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycywgb3Zl
cmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRS
ZXR1cm5UeXBlLmVxdWFscyhvdGhlclNpZ25hdHVyZS5yZXR1cm5UeXBlKSkKKyAgICAgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAg
fQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRp
b24gPSBTdWJzdGl0dXRpb24ubWFwcGluZyhbdGhpcy5fdHlwZVZhcmlhYmxlXSwgW3R5cGVdKTsK
KyAgICAgICAgZm9yIChsZXQgYWJzdHJhY3RTaWduYXR1cmUgb2YgdGhpcy5fc2lnbmF0dXJlcykg
eworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZSA9IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRp
b24pOworICAgICAgICAgICAgbGV0IG92ZXJsb2FkID0gdGhpcy5wcm9ncmFtLnJlc29sdmVGdW5j
T3ZlcmxvYWQoc2lnbmF0dXJlLm5hbWUsIFtdLCBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOwor
ICAgICAgICAgICAgaWYgKCFvdmVybG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPSBv
dmVybG9hZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAg
ICAgICAgICAgb3ZlcmxvYWQuZnVuYy50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRp
b25Db250ZXh0KTsKKyAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFs
cyhzaWduYXR1cmUucmV0dXJuVHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gInByb3RvY29sICIgKyB0aGlzLm5hbWUgKyAiIHsg
IiArIHRoaXMuc2lnbmF0dXJlcy5qb2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQorCisKSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL1Byb3RvY29sUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgUHJvdG9jb2xSZWYgZXh0ZW5kcyBQcm90b2NvbCB7CisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luLCBuYW1lKTsKKyAgICAg
ICAgdGhpcy5wcm90b2NvbERlY2wgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBpbmhlcml0cyhv
dGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVjbC5pbmhlcml0cyhv
dGhlcik7CisgICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnByb3RvY29sRGVjbC5oYXNIZWlyKHR5cGUpOworICAgIH0KK30KSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvUHRyVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBl
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHRyVHlwZSBl
eHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCFvdGhlciBpbnN0YW5jZW9mIFB0clR5cGUpCisg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKwor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSAr
ICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiXiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1JlZmVyZW5jZVR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
UmVmZXJlbmNlVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIFJlZmVyZW5jZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4s
IGFkZHJlc3NTcGFjZSwgZWxlbWVudFR5cGUpCisgICAgeworICAgICAgICB2YWxpZGF0ZUFkZHJl
c3NTcGFjZShhZGRyZXNzU3BhY2UpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX2FkZHJlc3NTcGFjZSA9IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgdGhpcy5f
ZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigp
IHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBhZGRyZXNzU3BhY2UoKSB7IHJldHVy
biB0aGlzLl9hZGRyZXNzU3BhY2U7IH0KKyAgICBnZXQgZWxlbWVudFR5cGUoKSB7IHJldHVybiB0
aGlzLl9lbGVtZW50VHlwZTsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNl
OyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVOYW1lcy5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlTmFtZXMuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU5hbWVzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcmVzb2x2ZU5hbWVzKHByb2dyYW0pCit7CisgICAg
cHJvZ3JhbS52aXNpdChuZXcgTmFtZVJlc29sdmVyKCkpOworfQpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvUmVzb2x2ZU92ZXJsb2FkSW1wbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9SZXNvbHZlT3ZlcmxvYWRJbXBsLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL1Jlc29sdmVPdmVybG9hZEltcGwuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitmdW5jdGlvbiByZXNvbHZlT3ZlcmxvYWRJbXBsKGZ1bmN0aW9ucywgdHlwZUFy
Z3VtZW50cywgYXJndW1lbnRUeXBlcykKK3sKKyAgICBmb3IgKGxldCBmdW5jIG9mIGZ1bmN0aW9u
cykgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggJiYgdHlwZUFyZ3VtZW50cy5s
ZW5ndGggIT0gZnVuYy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgaWYgKGFyZ3VtZW50VHlwZXMubGVuZ3RoICE9IGZ1bmMucGFyYW1ldGVycy5s
ZW5ndGgpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29u
dGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQoZnVuYy50eXBlUGFyYW1ldGVycyk7CisgICAg
ICAgIGxldCBvayA9IHRydWU7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZUFyZ3Vt
ZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IGFyZ3VtZW50ID0gdHlwZUFyZ3Vt
ZW50c1tpXTsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXIgPSBmdW5jLnR5cGVQYXJhbWV0ZXJz
W2ldOworICAgICAgICAgICAgaWYgKCFhcmd1bWVudC51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQs
IHBhcmFtZXRlcikpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghb2spCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVu
dFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWFyZ3VtZW50VHlwZXNbaV0u
dW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBmdW5jLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAg
ICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICBjb250aW51
ZTsKKyAgICAgICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgbGV0IHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cyA9ICF0eXBl
QXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cykK
KyAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBbXTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBh
cmFtZXRlciBvZiBmdW5jLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBsZXQgdHlwZUFy
Z3VtZW50ID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodHlwZVBhcmFtZXRlcik7CisgICAgICAg
ICAgICBpZiAodHlwZUFyZ3VtZW50ID09IHR5cGVQYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgICAg
ICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgICAgICB0
eXBlQXJndW1lbnRzLnB1c2godHlwZUFyZ3VtZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAo
IW9rKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJldHVybiB7ZnVuYywgdW5pZmlj
YXRpb25Db250ZXh0LCB0eXBlQXJndW1lbnRzfTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG51
bGw7Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlVHlwZURlZnMuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZVR5cGVEZWZzLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVUeXBlRGVmcy5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHJlc29sdmVUeXBlRGVmcyhwcm9ncmFt
KQoreworICAgIHByb2dyYW0udmlzaXQobmV3IFR5cGVEZWZSZXNvbHZlcigpKTsKK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL1JldHVybi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXR1
cm4uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXR1cm4g
ZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVl
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9
CisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICB0b1N0
cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2lu
KCI7ICIpOyArICI7IH0iOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jl
dHVybkV4Y2VwdGlvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXR1cm5F
eGNlcHRpb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuRXhj
ZXB0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV0
dXJuRXhjZXB0aW9uIHsKKyAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkKKyAgICB7CisgICAgICAgIHRo
aXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJu
IHRoaXMuX3ZhbHVlOyB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBSZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IoKQorICAg
IHsKKyAgICAgICAgdGhpcy5fbWFwcGluZyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAg
X21hcChvbGRJdGVtLCBuZXdJdGVtKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwcGluZy5zZXQo
b2xkSXRlbSwgbmV3SXRlbSk7CisgICAgICAgIHJldHVybiBuZXdJdGVtOworICAgIH0KKyAgICAK
KyAgICBfZ2V0TWFwcGluZyhvbGRJdGVtKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRo
aXMuX21hcHBpbmcuZ2V0KG9sZEl0ZW0pOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAg
ICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIG9sZEl0ZW07CisgICAgfQorICAgIAor
ICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jKAorICAg
ICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyksCisgICAgICAg
ICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFybWV0ZXIgPT4gdHlwZVBhcmFtZXRl
ci52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRl
ciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5j
UGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEZ1bmNQYXJh
bWV0ZXIobm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgICAgICB0aGlzLl9t
YXAobm9kZSwgcmVzdWx0KTsKKyAgICAgICAgcmVzdWx0LmxWYWx1ZSA9IG5vZGUubFZhbHVlOwor
ICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUp
CisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEJsb2NrKG5vZGUub3JpZ2luKTsKKyAg
ICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAg
IHJlc3VsdC5hZGQoc3RhdGVtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAg
IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUeXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5h
bWUsIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52
aXNpdCh0aGlzKSkpOworICAgICAgICByZXN1bHQudHlwZSA9IG5vZGUudHlwZTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0
ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29uc3Rl
eHByVHlwZVBhcmFtZXRlcihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQo
dGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAg
ICByZXR1cm4gbmV3IEZpZWxkKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNp
dCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG5ldyBub2RlLmNvbnN0cnVjdG9yKG5vZGUucm9naWluLCBub2Rl
LmFkZHJlc3NTcGFjZSwgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAg
IAorICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlz
aXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlw
ZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5v
ZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5ldyBBcnJheVR5cGUobm9kZS5vcmlnaW4sIG5vZGUuZWxlbWVudFR5cGUudmlz
aXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudChub2RlLm9yaWdpbiwgbm9kZS5saHMudmlz
aXQodGhpcyksIG5vZGUucmhzLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRW
YXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHRoaXMuX2dl
dE1hcHBpbmcobm9kZS52YXJpYWJsZSk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1
cm4obm9kZS5vcmlnaW4sIG5vZGUudmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVs
bCk7CisgICAgfQorICAgIAorICAgIHZpc2l0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQor
ICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBDYWxsRXhwcmVzc2lvbigKKyAgICAgICAg
ICAgIG5vZGUub3JpZ2luLCBub2RlLm5hbWUsCisgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVu
dHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpLAorICAgICAg
ICAgICAgbm9kZS5hcmd1bWVudGxpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRo
aXMpKSk7CisgICAgICAgIGxldCBhY3R1YWxUeXBlQXJndW1lbnRzID0gbm9kZS5hY3R1YWxUeXBl
QXJndW1lbnRzOworICAgICAgICBpZiAoYWN0dWFsVHlwZUFyZ3VtZW50cykgeworICAgICAgICAg
ICAgcmVzdWx0LmFjdHVhbFR5cGVBcmd1bWVudHMgPQorICAgICAgICAgICAgICAgIGFjdHVhbFR5
cGVBcmd1bWVudHMubWFwKGFjdHVhbFR5cGVBcmd1bWVudCA9PiBhY3R1YWxUeXBlQXJndW1lbnQu
dmlzaXQodGhpcykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIHZpc2l0RnVuY3Rpb25MaWtlQmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiBuZXcgRnVuY3Rpb25MaWtlQmxvY2soCisgICAgICAgICAgICBub2RlLm9yaWdpbiwKKyAg
ICAgICAgICAgIG5vZGUuYXJndW1lbnRMaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNp
dCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBw
YXJhbWV0ZXIudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMp
KTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgU3RydWN0VHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNv
bnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0
aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAg
ICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9m
aWVsZHMgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAgIGFkZChmaWVsZCkKKyAgICB7Cisg
ICAgICAgIGlmICh0aGlzLl9maWVsZHMuaGFzKGZpZWxkLm5hbWUpKQorICAgICAgICAgICAgdGhy
b3cgbmV3IEFMVHlwZUVycm9yKGZpZWxkLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJEdXBsaWNhdGUg
ZmllbGQgbmFtZTogIiArIGZpZWxkLm5hbWUpOworICAgICAgICB0aGlzLl9maWVsZHMuc2V0KGZp
ZWxkLm5hbWUsIGZpZWxkKTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0
aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlw
ZVBhcmFtZXRlcnM7IH0KKyAgICAKKyAgICBnZXQgZmllbGROYW1lcygpIHsgcmV0dXJuIHRoaXMu
X2ZpZWxkcy5rZXlzKCk7IH0KKyAgICBmaWVsZEJ5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9m
aWVsZHMuZ2V0KG5hbWUpOyB9CisgICAgZ2V0IGZpZWxkcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxk
cy52YWx1ZXMoKTsgfQorICAgIGdldCBmaWVsZE1hcCgpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkczsg
fQorICAgIGdldCBpc1ByaW1pdGl2ZSgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1
ZTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5maWVsZHMpCisgICAgICAgICAgICBy
ZXN1bHQgJj0gZmllbGQudHlwZS5pc1ByaW1pdGl2ZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisgICAgCisgICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGxldCBy
ZXN1bHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRl
ciBvZiB0aGlzLnR5cGVQYXJhbWV0ZXJzKQorICAgIH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0
eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9
IHRoaXMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlw
ZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVu
dHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0
ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIAorICAgICAgICBsZXQgc3Vic3RpdHV0aW9u
ID0gU3Vic3RpdHV0aW9uLm1hcHBpbmcodGhpcy50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50
cyk7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgU3RydWN0VHlwZSh0aGlzLm9yaWdpbiwgdGhp
cy5uYW1lLCBbXSk7CisgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIHRoaXMuZmllbGRzKQorICAg
ICAgICAgICAgcmVzdWx0LmFkZChmaWVsZC52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuICJzdHJ1Y3QgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZVBhcmFtZXRl
cnMgKyAiPiB7ICIgKyBBcnJheS5mcm9tKHRoaXMuZmllbGRzKS5qb2luKCI7ICIpICsgIjsgfSI7
CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdWJzdGl0dXRpb24gZXh0ZW5kcyBSZXdyaXRlciB7
CisgICAgY29uc3RydWN0b3IobWFwKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbWFwOwor
ICAgIH0KKyAgICAKKyAgICBzdGF0aWMgbWFwcGluZyhwYXJhbWV0ZXJzLCBhcmd1bWVudExpc3Qp
CisgICAgeworICAgICAgICBpZiAocGFyYW1ldGVycy5sZW5ndGggIT0gYXJndW1lbnRMaXN0Lmxl
bmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUGFyYW1ldGVycyBhbmQgYXJndW1l
bnRzIGFyZSBtaXNtYXRjaGVkIik7CisgICAgICAgIGxldCBtYXAgPSBuZXcgTWFwKCk7CisgICAg
ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1ldGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAg
ICAgIG1hcC5zZXQocGFyYW1ldGVyc1tpXSwgYXJndW1lbnRMaXN0W2ldKTsKKyAgICAgICAgcmV0
dXJuIG5ldyBTdWJzdGl0dXRpb24obWFwKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVm
KG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0KG5v
ZGUudHlwZSk7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCkgeworICAgICAgICAgICAgaWYgKG5v
ZGUudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCJVbmV4cGVjdGVkIHR5cGUgYXJndW1lbnRzIG9uIHR5cGUgdmFyaWFibGUiKTsKKyAgICAgICAg
ICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcmV0
dXJuIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICB9CisKKyAgICB2aXNpdFZhcmlhYmxl
UmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVwbGFjZW1lbnQgPSB0aGlzLl9tYXAuZ2V0
KG5vZGUudmFyaWFibGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpCisgICAgICAgICAgICBy
ZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAgICAgIAorICAgICAgICByZXR1cm4gc3VwZXIudmlzaXRW
YXJpYWJsZVJlZihub2RlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1
ZmZpeENhbGxBc3NpZ25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1N1
ZmZpeENhbGxBc3NpZ25tZW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L1N1ZmZpeENhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgU3VmZml4Q2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9y
aWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9saHMgPSBs
aHM7CisgICAgICAgIHRoaXMuZnVuYyA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1l
KCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBsaHMoKSB7IHJldHVybiB0aGlzLl9s
aHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5s
aHMgKyAiIHN1ZmZpeCAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlIGV4dGVuZHMgTm9kZSB7CisgICAg
Z2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gW107IH0KKyAgICBnZXQga2luZCgpIHsgcmV0
dXJuIFR5cGU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAg
IHJldHVybiBwcm90b2NvbC5oYXNIZWlyKHRoaXMpOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5z
dGFudGlhdGVkVHlwZSgpIHsgcmV0dXJuIHRoaXM7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvVHlwZURlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVm
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlRGVmIGV4dGVuZHMgVHlw
ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSkK
KyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7
CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2lu
KCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlz
Ll9uYW1lOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBh
cmFtZXRlcnM7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZlJlc29sdmVyLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWZSZXNvbHZlci5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9UeXBlRGVmUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBUeXBlRGVmUmVzb2x2ZXIgZXh0ZW5kcyBWaXNpdG9yIHsK
KyAgICBjb25zdHJ1Y3RvcigpCisgICAgeworICAgICAgICB0aGlzLl92aXNpdGluZyA9IG5ldyBW
aXNpdGluZ1NldCgpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX3Zpc2l0aW5nLmRvVmlzaXQobm9kZSwgKCkgPT4geworICAgICAgICAg
ICAgc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUudHlwZSBp
bnN0YW5jZW9mIFR5cGVEZWYpIHsKKyAgICAgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250
ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dChub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMpOwor
ICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlw
ZS50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBF
cnJvcigiYXJndW1lbnQvcGFyYW1ldGVyIG1pc21hdGNoIChzaG91bGQgaGF2ZSBiZWVuIGNhdWdo
dCBlYXJsaWVyKSIpOworICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS50
eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGVB
cmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBub2RlLnR5cGUudHlwZVBhcmFt
ZXRlcnNbaV0pOworICAgICAgICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlm
eSgpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmln
aW4ub3JpZ2luU3RyaW5nLCAiVHlwZSByZWZlcmVuY2UgdG8gYSB0eXBlIGRlZmluaXRpb24gdmlv
bGF0ZXMgcHJvdG9jb2wgY29uc3RyYWludHMiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAg
ICAgICAgICBsZXQgbmV3VHlwZSA9IG5vZGUudHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihu
b2RlLnR5cGUudHlwZVBhcmFtZXRlcnMsIHVuaWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAg
ICAgICAgbmV3VHlwZS52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgICAgICBub2RlLnNldFR5cGVB
bmRBcmd1ZW1udHMobmV3VHlwZSwgW10pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAg
ICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVPclZhcmlhYmxlUmVmIGV4
dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAg
IGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9UeXBlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVS
ZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWYgZXh0ZW5kcyBU
eXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMpCisgICAg
eworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBu
YW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgICAgICB0aGlzLl90eXBlQXJndW1l
bnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHdyYXAodHlwZSkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlwZVJlZih0eXBlLm9yaWdpbiwgdHlw
ZS5uYW1lLCBbXSk7CisgICAgICAgIHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBl
QXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1By
aW1pdGl2ZSgpIHsgcmV0dXJuIHR5cGUgPyB0eXBlLmlzUHJpbWl0aXZlIDogZmFsc2U7IH0KKyAg
ICAKKyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy50eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBnZXQg
dW5pZnlOb2RlKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0
aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUudW5pZnlOb2RlOworICAgICAgICByZXR1
cm4gdGhpczsKKyAgICB9CisgICAgCisgICAgZ2V0IGRlZmF1bHRWYWx1ZSgpCisgICAgeworICAg
ICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4g
dGhpcy50eXBlLmRlZmF1bHRWYWx1ZTsKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qg
Z2V0IGRlZmF1bHQgdmFsdWUgb2YgYSB0eXBlIGluc3RhbnRpYXRpb24iKTsKKyAgICB9CisgICAg
CisgICAgc2V0VHlwZUFuZEFyZ3VtZW50cyh0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fbmFtZSA9IHR5cGUubmFtZTsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsK
KyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQorICAg
IAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAg
ICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBUeXBlUmVmKSkKKyAgICAgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBv
dGhlci50eXBlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMu
dHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAg
ICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50
eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFy
Z3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNb
aV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBy
ZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIHRoaXMubmFtZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZVZhcmlhYmxlIGV4dGVuZHMgVHlwZSB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lLCBwcm90b2NvbCkKKyAgICB7CisgICAgICAgIHRoaXMuX29y
aWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMu
X3Byb3RvY29sID0gcHJvdG9jb2w7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1
cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBwcm90b2NvbCgpIHsgcmV0dXJuIHRoaXMuX3Byb3Rv
Y29sOyB9CisgICAgCisgICAgZ2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLl9wcm90b2NvbCAmJiB0aGlzLl9wcm90b2NvbC5pc1ByaW1pdGl2ZTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIGlu
aGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgaWYgKCFwcm90b2NvbCkKKyAgICAgICAg
ICAgIHJldHVybiB0cnVlOworICAgICAgICBpZiAoIXRoaXMucHJvdG9jb2wpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHBy
b3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVHlw
ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGxldCByZWFsVGhpcyA9IHVu
aWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0gdGhp
cykKKyAgICAgICAgICAgIHJldHVybiByZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyKTsKKyAgICAgICAgCisgICAgICAgIHVuaWZpY2F0aW9uQ29udGV4dC51bmlmeSh0aGlz
LCBvdGhlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeUlt
cGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
LnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgIH0KKyAg
ICAKKyAgICB2ZXJpZnlBc0FyZ3VtZW50KHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAg
ICAgIGxldCByZWFsVGhpcyA9IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAg
ICAKKyAgICAgICAgLy8gVGhlIHRoaW5nIHdlIGdldCB1bmlmaWVkIHdpdGggbXVzdCBiZSBhIHR5
cGUgdmFyaWFibGUgdGhhdCBhY2NlcHRzIGEgYnJvYWRlciBzZXQgb2YKKyAgICAgICAgLy8gdGhp
bmdzIHRoYW4gd2UgZG8uCisgICAgICAgIGlmICghKHJlYWxUaGlzIGluc3RhbmNlb2YgVHlwZVZh
cmlhYmxlKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYg
KCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuICFyZWFsVGhpcy5wcm90b2NvbDsK
KyAgICAgICAgCisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sLmluaGVyaXRzKHJlYWxUaGlz
LnByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRp
b25Db250ZXh0KQorICAgIHsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAg
ICAgcmV0dXJuIHRydWU7CisgICAgICAgIHJldHVybiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0
aGlzKS5pbmhlcml0cyh0aGlzLnByb3RvY29sKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIFVuaWZpY2F0aW9uQ29udGV4dCB7CisgICAgY29uc3Ry
dWN0b3IodHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVy
cyA9IG5ldyBTZXQodHlwZVBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9uZXh0TWFwID0gbmV3
IE1hcCgpOworICAgIH0KKyAgICAKKyAgICB1bmlvbihhLCBiKQorICAgIHsKKyAgICAgICAgYSA9
IGZpbmQoYSk7CisgICAgICAgIGIgPSBmaW5kKGIpOworICAgICAgICBpZiAoYSA9PSBiKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKCFiLmlzVW5pZmlhYmxlKQor
ICAgICAgICAgICAgW2EsIGJdID0gW2IsIGFdOworICAgICAgICBpZiAoIWEuaXNVbmlmaWFibGUp
CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCB1bmlmeSBub24tdW5pZmlhYmxl
IHRoaW5ncyAiICsgYSArICIgYW5kICIgKyBiKTsKKyAgICAgICAgCisgICAgICAgIC8vIE1ha2Ug
c3VyZSB0aGF0IHR5cGUgcGFyYW1ldGVycyBkb24ndCBlbmQgdXAgYmVpbmcgcm9vdHMuCisgICAg
ICAgIGlmIChhLmlzVW5pZmlhYmxlICYmIGIuaXNVbmlmaWFibGUgJiYgdGhpcy5fdHlwZVBhcmFt
ZXRlcnMuaGFzKGIpKQorICAgICAgICAgICAgW2EsIGJdID0gW2IsIGFdOworCisgICAgICAgIHRo
aXMuX25leHRNYXAuc2V0KGEsIGIpOworICAgIH0KKyAgICAKKyAgICBmaW5kKG5vZGUpCisgICAg
eworICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBub2RlOworICAgICAgICBsZXQgbmV4dE5vZGUg
PSB0aGlzLl9uZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7CisgICAgICAgIGlmICghbmV4dE5vZGUp
CisgICAgICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7CisgICAgICAgIGZvciAoOzspIHsKKyAg
ICAgICAgICAgIGN1cnJlbnROb2RlID0gbmV4dE5vZGU7CisgICAgICAgICAgICBuZXh0Tm9kZSA9
IHRoaXMuX25leHRNYXAuZ2V0KGN1cnJlbnROb2RlKTsKKyAgICAgICAgICAgIGlmICghbmV4dE5v
ZGUpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fbmV4
dE1hcC5zZXQobm9kZSwgY3VycmVudE5vZGUpOworICAgICAgICByZXR1cm4gY3VycmVudE5vZGU7
CisgICAgfQorICAgIAorICAgIGdldCBub2RlcygpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0
ID0gbmV3IFNldCgpOworICAgICAgICBmb3IgKGxldCBba2V5LCB2YWx1ZV0gb2YgdGhpcy5fbmV4
dE1hcCkgeworICAgICAgICAgICAgcmVzdWx0LmFkZChrZXkpOworICAgICAgICAgICAgcmVzdWx0
LmFkZCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cisg
ICAgCisgICAgdmVyaWZ5KCkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIg
b2YgdGhpcy5fdHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGlmICghdHlwZVBhcmFtZXRl
ci52ZXJpZnlBc1BhcmFtZXRlcih0aGlzKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKyAgICAgICAgZm9yIChsZXQgdHlwZUFyZ3VtZW50IG9mIHRoaXMubm9kZXMp
IHsKKyAgICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50LmlzVW5pZmlhYmxlKQorICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhh
cyh0eXBlQXJndW1lbnQpKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAg
aWYgKCF0eXBlQXJndW1lbnQudmVyaWZ5QXNBcmd1bWVudCh0aGlzKSkKKyAgICAgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQor
ICAgIAorICAgIGlzVW51bmlmaWVkKCkKKyAgICB7CisgICAgICAgIHJldHVybiAhdGhpcy5fbmV4
dE1hcC5zaXplKCk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9WYWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNl
IHN0cmljdCI7CisKK2NsYXNzIFZhbHVlIGV4dGVuZHMgTm9kZSB7CisgICAgZ2V0IGtpbmQoKSB7
IHJldHVybiBWYWx1ZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIGZhbHNlOyB9
Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgVmFyaWFibGVSZWYgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBj
b25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOwor
ICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52YXJpYWJsZSA9IG51bGw7
CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAg
IGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRoaXMudmFyaWFibGUuaXNDb25zdGV4cHI7IH0K
KyAgICBnZXQgdW5pZnlOb2RlKCkgeyByZXR1cm4gdGhpcy52YXJpYWJsZS51bmlmeU5vZGU7IH0K
KyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOwor
ICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0LmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0LmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgVmlzaXRpbmdTZXQgeworICAgIGNvbnN0cnVjdG9yKC4uLml0
ZW1zKQorICAgIHsKKyAgICAgICAgdGhpcy5fc2V0ID0gbmV3IFNldChpdGVtcyk7CisgICAgfQor
ICAgIAorICAgIGRvVmlzaXQoaXRlbSwgY2FsbGJhY2spCisgICAgeworICAgICAgICBpZiAodGhp
cy5fc2V0LmhhcyhpdGVtKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihpdGVt
Lm9yaWdpbi5vcmlnaW5TdHJpbmcsICJSZWN1cnNpdmUgIiArIGl0ZW0ua2luZCk7CisgICAgICAg
IHRoaXMuX3NldC5hZGQoaXRlbSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4g
Y2FsbGJhY2soKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRoaXMuX3NldC5k
ZWxldGUoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9WaXNpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWaXNpdG9yIHsKKyAgICB2aXNpdFBy
b2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRv
cExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRGdW5jKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnJldHVy
blR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9k
ZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7
CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMpCisgICAgICAg
ICAgICBwYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY1Bh
cmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEZ1bmNEZWYobm9kZSkKKyAgICB7CisgICAgICAgIHZpc2l0RnVu
Yyhub2RlKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Yg
bm9kZS5zdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29sUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAK
KyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc2ln
bmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52aXNpdCh0
aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAg
ICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAg
ICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdE5hdGl2
ZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbXRlciBvZiBub2Rl
LnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlRGVmKG5vZGUpCisgICAgeworICAgICAgICBmb3Ig
KGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0
eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7
CisgICAgfQorICAgIAorICAgIHZpc2l0U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAgICAgICAg
Zm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAg
ICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Yg
bm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZp
c2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBl
LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgewor
ICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RWxl
bWVudGFsVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0
aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQdHJUeXBlKG5vZGUpCisgICAgeworICAgICAg
ICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRB
cnJheVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBl
KG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAg
ICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgICAgIG5vZGUubnVtRWxl
bWVudHMudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdubWVudChub2Rl
KQorICAgIHsKKyAgICAgICAgbm9kZS5saHMudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUucmhz
LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisg
ICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAg
aWYgKG5vZGUudmFsdWUpCisgICAgICAgICAgICBub2RlLnZhbHVlLnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXN0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlw
ZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVu
dC52aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgYXJndW1lbnQgb2Ygbm9kZS5hcmd1bWVu
dExpc3QpCisgICAgICAgICAgICBhcmd1bWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRGdW5jdGlvbkxpa2VCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQg
YXJndW1lbnQgb2Ygbm9kZS5hcmd1bWVudExpc3QpCisgICAgICAgICAgICBhcmd1bWVudC52aXNp
dCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykK
KyAgICAgICAgICAgIHBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9kZS5ib2R5LnZp
c2l0KHRoaXMpOworICAgIH0KK30KKwo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319256</attachid>
            <date>2017-08-29 09:56:49 -0700</date>
            <delta_ts>2017-08-29 10:43:12 -0700</delta_ts>
            <desc>it is written</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>207601</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgYWRkcmVz
c1NwYWNlcyA9IFsiY29uc3RhbnQiLCAiZGV2aWNlIiwgInRocmVhZGdyb3VwIiwgInRocmVhZCJd
OworCitmdW5jdGlvbiBpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7CisgICAgc3dpdGNo
IChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2FzZSAiZGV2aWNl
IjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
K30KKworZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAg
IGlmICghaXNBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKSkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYWRkcmVzcyBzcGFjZTogIiArIGFkZHJlc3NTcGFjZSk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFzIFRbY10gZm9y
IGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1YWdlLgorY2xh
c3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0
YW5jZW9mIEFycmF5UmVmVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBpZiAodGhpcy5hZGRyZXNzU3BhY2UgIT0gInRocmVhZCIpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIg
IiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fy
cmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1F
bGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVu
dHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vs
ZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxl
bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAg
IH0KKyAgICAKKyAgICBnZXQgc2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5lbGVt
ZW50VHlwZS5zaXplICogdGhpcy5udW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgdW5pZnlJ
bXBsKHVuaWZpY2F0b25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmIChvdGhlciBp
bnN0YW5jZW9mIEFycmF5UmVmVHlwZSkgeworICAgICAgICAgICAgaWYgKG90aGVyLmFkZHJlc3NT
cGFjZSAhPSAidGhyZWFkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAg
ICBpZiAoIXRoaXMubnVtRWxlbWVudHMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci5u
dW1FbGVtZW50cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1bmlmaWNhdGlv
bkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
QXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Bc3NpZ25t
ZW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQXNzaWdu
bWVudCBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbGhzLCBy
aHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9saHMgPSBs
aHM7CisgICAgICAgIHRoaXMuX3JocyA9IHJoczsKKyAgICB9CisgICAgCisgICAgZ2V0IGxocygp
IHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0aGlzLl9yaHM7
IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMg
KyAiID0gIiArIHRoaXMucmhzOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0Jsb2NrLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQmxvY2sgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4pCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX3N0YXRlbWVudHMgPSBbXTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdp
bigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIAorICAgIGFkZChzdGF0ZW1lbnQpCisg
ICAgeworICAgICAgICB0aGlzLl9zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IHN0YXRlbWVudHMoKSB7IHJldHVybiB0aGlzLl9zdGF0ZW1lbnRzOyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ7ICIgKyB0aGlzLnN0
YXRlbWVudHMuam9pbigiOyAiKTsgKyAiOyB9IjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9DYWxsQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9DYWxsQXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9DYWxsQXNzaWdubWVudC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIENhbGxBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCBuYW1lLCBsaHMsIHJocykKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7
CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9saHMgPSBsaHM7Cisg
ICAgICAgIHRoaXMuX3JocyA9IHJoczsKKyAgICAgICAgdGhpcy5mdW5jID0gbnVsbDsKKyAgICB9
CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGxo
cygpIHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0aGlzLl9y
aHM7IH0gLy8gVGhpcyBjYW4gYmUgbnVsbC4KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5saHMgKyAiICIgKyB0aGlzLm5hbWUgKyAodGhpcy5yaHMgPyAi
PSAiICsgdGhpcy5yaHMgOiAiIik7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9DYWxsRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DYWxs
RXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DYWxsRXhw
cmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENh
bGxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2lu
LCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudExpc3QpCisgICAgeworICAgICAgICBzdXBl
cihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlw
ZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgICAgIHRoaXMuX2FyZ3VtZW50TGlzdCA9
IGFyZ3VtZW50TGlzdDsKKyAgICAgICAgdGhpcy5mdW5jID0gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGVBcmd1bWVu
dHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGFyZ3VtZW50TGlz
dCgpIHsgcmV0dXJuIHRoaXMuX2FyZ3VtZW50TGlzdDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVu
dHMgKyAiPigiICsgdGhpcy5hcmd1bWVudExpc3QgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9DYWxsRnVuY3Rpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvQ2FsbEZ1bmN0aW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL0NhbGxGdW5jdGlvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM5IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2Z1bmN0aW9uIGNhbGxGdW5jdGlvbihwcm9ncmFtLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1
bWVudExpc3QpCit7CisgICAgZm9yIChsZXQgcmVzZXQgb2YgcHJvZ3JhbS5yZXNldHMpCisgICAg
ICAgIHJlc2V0KCk7CisgICAgbGV0IGFyZ3VtZW50VHlwZXMgPSBhcmd1bWVudExpc3QubWFwKGFy
Z3VtZW50ID0+IGFyZ3VtZW50LnR5cGUpOworICAgIGxldCBmdW5jID0gcmVzb2x2ZUlubGluZWRG
dW5jdGlvbihwcm9ncmFtLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKTsKKyAg
ICBpZiAoIWZ1bmMpCisgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcigiPGNhbGxGdW5jdGlv
bj4iLCAiQ2Fubm90IHJlc29sdmUgZnVuY3Rpb24gY2FsbCAiICsgbmFtZSArICI8IiArIHR5cGVB
cmd1bWVudHMgKyAiPigiICsgYXJndW1lbnRMaXN0ICsgIikiKTsKKyAgICBmb3IgKGxldCBpID0g
MDsgaSA8IGZ1bmMucGFyYW1ldGVycy5sZW5ndGg7ICsraSkKKyAgICAgICAgZnVuYy5wYXJhbWV0
ZXJzW2ldLmxWYWx1ZS52YWx1ZSA9IGFyZ3VtZW50TGlzdFtpXTsKKyAgICByZXR1cm4gbmV3IEV2
YWx1YXRvcigpLnZpc2l0RnVuY3Rpb25Cb2R5KGZ1bmMuYm9keSk7Cit9CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL0NoZWNrLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0No
ZWNrLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gY2hlY2socHJvZ3JhbSkK
K3sKKyAgICBwcm9ncmFtLnZpc2l0KG5ldyBDaGVja2VyKHByb2dyYW0pKTsKK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9DaGVja2VyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNr
ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2hlY2tl
ciBleHRlbmRzIFZpc2l0b3IgeworICAgIGNvbnN0cnVjdG9yKHByb2dyYW0pCisgICAgeworICAg
ICAgICB0aGlzLl9wcm9ncmFtID0gcHJvZ3JhbTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRl
bWVudCA9IG51bGw7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvZ3JhbShub2RlKQorICAgIHsK
KyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRzKSB7
CisgICAgICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gc3RhdGVtZW50OworICAgICAg
ICAgICAgc3RhdGVtZW50LnZpc2l0KHRoaXMpOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzaWduYXR1
cmUgb2Ygbm9kZS5zaWduYXR1cmVzKSB7CisgICAgICAgICAgICBsZXQgc2V0ID0gbmV3IFNldCgp
OworICAgICAgICAgICAgZnVuY3Rpb24gY29uc2lkZXIodGhpbmcpCisgICAgICAgICAgICB7Cisg
ICAgICAgICAgICAgICAgaWYgKHRoaW5nLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgICAgICAg
ICBzZXQuYWRkKHRoaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXNzIE5vdGlj
ZVR5cGVWYXJpYWJsZSBleHRlbmRzIFZpc2l0b3IgeworICAgICAgICAgICAgICAgIHZpc2l0VHlw
ZVJlZihub2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc2lk
ZXIobm9kZS50eXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmlzaXRW
YXJpYWJsZVJlZihub2RlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAg
Y29uc2lkZXIobm9kZS52YXJpYWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICAgICAgbGV0IG5vdGljZVR5cGVWYXJpYWJsZSA9IG5ldyBOb3RpY2VUeXBlVmFy
aWFibGUoKTsKKyAgICAgICAgICAgIGZvciAobGV0IHBhcmFtZXRlclR5cGUgb2Ygc2lnbmF0dXJl
LnBhcmFtZXRlclR5cGVzKQorICAgICAgICAgICAgICAgIHBhcmFtZXRlclR5cGUudmlzaXQobm90
aWNlVHlwZVZhcmlhYmxlKTsKKyAgICAgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Yg
c2lnbmF0dXJlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFzZXQuaGFz
KHR5cGVQYXJhbWV0ZXIpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBBTFR5cGVFcnJvcih0
eXBlUGFyYW1ldGVyLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUeXBlIHBhcmFtZXRlciB0byBwcm90
b2NvbCBzaWduYXR1cmUgbm90IGluZmVycmFibGUgZnJvbSB2YWx1ZSBwYXJhbWV0ZXJzIik7Cisg
ICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXNldC5oYXMobm9kZS50eXBlVmFyaWFibGUp
KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihzaWduYXR1cmUub3JpZ2lu
Lm9yaWdpblN0cmluZywgIlByb3RvY29sJ3MgdHlwZSB2YXJpYWJsZSBub3QgbWVudGlvbmVkIGlu
IHNpZ25hdHVyZSIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIF9jaGVja1R5cGVBcmd1
bWVudHMob3JpZ2luLCB0eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAg
ICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZVBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAg
ICAgICAgICAgIGxldCBhcmd1bWVudElzVHlwZSA9IHR5cGVBcmd1bWVudHNbaV0gaW5zdGFuY2Vv
ZiBUeXBlOworICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXS52
aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIGlmIChhcmd1bWVudElzVHlwZSkgeworICAgICAgICAg
ICAgICAgIGlmICghdHlwZUFyZ3VtZW50c1tpXS5pbmhlcml0cyh0eXBlQXJndW1lbnRzW2ldKSkK
KyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5T
dHJpbmcsICJUeXBlIGFyZ3VtZW50IGRvZXMgbm90IGluaGVyaXQgcHJvdG9jb2wiKTsKKyAgICAg
ICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQuZXF1YWxzKHR5cGVQ
YXJhbWV0ZXJzW2ldLnR5cGUpKQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBl
RXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIldyb25nIHR5cGUgZm9yIGNvbnN0ZXhwciIpOwor
ICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihu
b2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fY2hlY2tUeXBlQXJndW1lbnRzKG5vZGUub3JpZ2lu
LCB0eXBlLnR5cGVQYXJhbWV0ZXJzLCBub2RlLnR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAK
KyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUuZWxlbWVu
dFR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIAorICAgICAgICBpZiAobm9kZS5hZGRyZXNzU3Bh
Y2UgPT0gInRocmVhZCIpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIAorICAgICAgICBp
ZiAoIW5vZGUuZWxlbWVudFR5cGUud2l0aFJlY3Vyc2l2ZWx5SW5zdGFudGlhdGVkSW1tZWRpYXRl
cy5pc1ByaW1pdGl2ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9y
aWdpbi5vcmlnaW5TdHJpbmcsICJJbGxlZ2FsIHBvaW50ZXIgdG8gbm9uLXByaW1pdGl2ZSB0eXBl
Iik7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAgeworICAgICAg
ICBpZiAoIW5vZGUubnVtRWxlbWVudHMuaXNDb25zdGV4cHIpCisgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiQXJyYXkgbGVuZ3RoIG11
c3QgYmUgY29uc3RleHByIik7CisgICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdubWVudChub2Rl
KQorICAgIHsKKyAgICAgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gY2hlY2sgdGhhdCB0aGUgbGhz
IGlzIGFzc2lnbmFibGUuCisgICAgICAgIGxldCBsaHNUeXBlID0gbm9kZS5saHMudmlzaXQodGhp
cyk7CisgICAgICAgIGxldCByaHNUeXBlID0gbm9kZS5yaHMudmlzaXQodGhpcyk7CisgICAgICAg
IGlmICghbGhzVHlwZS5lcXVhbHMocmhzVHlwZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxU
eXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBtaXNtYXRjaCBpbiBhc3Np
Z25tZW50OiAiICsgbGhzVHlwZSArICIgdmVyc3VzICIgKyByaHNUeXBlKTsKKyAgICAgICAgcmV0
dXJuIGxoc1R5cGU7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiByZXN1bHQudHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRS
ZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAg
ICBsZXQgcmVzdWx0VHlwZSA9IG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBp
ZiAoIXRoaXMuZnVuYy5yZXR1cm5WYWx1ZS5lcXVhbHMocmVzdWx0VHlwZSkpCisgICAgICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIlRy
eWluZyB0byByZXR1cm4gIiArIHJlc3VsdFR5cGUgKyAiIGluIGEgZnVuY3Rpb24gdGhhdCByZXR1
cm5zICIgKyBmdW5jLnJldHVyblZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAg
fQorICAgICAgICAKKyAgICAgICAgaWYgKCFmdW5jLnJldHVyblZhbHVlLmVxdWFscyh0aGlzLl9w
cm9ncmFtLmludHJpbnNpY3Mudm9pZCkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJy
b3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiTm9uLXZvaWQgZnVuY3Rpb24gbXVzdCByZXR1
cm4gYSB2YWx1ZSIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEludExpdGVyYWwobm9kZSkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLl9wcm9ncmFtLmludHJpbnNpY3MuaW50MzI7CisgICAg
fQorICAgIAorICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGZv
ciAobGV0IHR5cGVBcmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0
eXBlQXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgICAgIGxldCBhcmd1bWVudFR5cGVzID0gbm9k
ZS5hcmd1bWVudExpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKTsKKyAg
ICAgICAgCisgICAgICAgIGxldCBvdmVybG9hZCA9IG51bGw7CisgICAgICAgIGZvciAobGV0IHR5
cGVQYXJhbWV0ZXIgb2YgdGhpcy5fY3VycmVudFN0YXRlbWVudC50eXBlUGFyYW1ldGVycykgewor
ICAgICAgICAgICAgaWYgKCEodHlwZVBhcmFtZXRlciBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkp
CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIXR5cGVQYXJhbWV0
ZXIucHJvdG9jb2wpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBsZXQg
c2lnbmF0dXJlcyA9CisgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5wcm90b2NvbC5zaWdu
YXR1cmVzQnlOYW1lV2l0aFR5cGVWYXJpYWJsZShub2RlLm5hbWUsIHR5cGVQYXJhbWV0ZXIpOwor
ICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOwor
ICAgICAgICAgICAgb3ZlcmxvYWQgPSByZXNvbHZlT3ZlcmxvYWRJbXBsKHNpZ25hdHVyZXMsIG5v
ZGUudHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAgICAgICAgICBpZiAob3Zlcmxv
YWQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvdmVy
bG9hZCkgeworICAgICAgICAgICAgb3ZlcmxvYWQgPSB0aGlzLl9uYW1lQ29udGV4dC5wcm9ncmFt
LnJlc29sdmVGdW5jT3ZlcmxvYWQoCisgICAgICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnR5
cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICB9CisgICAgICAgIGlmICghb3Zl
cmxvYWQpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3Jp
Z2luU3RyaW5nLCAiRGlkIG5vdCBmaW5kIGZ1bmN0aW9uIGZvciBjYWxsIik7CisgICAgICAgIG5v
ZGUuZnVuYyA9IG92ZXJsb2FkLmZ1bmM7CisgICAgICAgIG5vZGUuYWN0dWFsVHlwZUFyZ3VtZW50
cyA9IG92ZXJsb2FkLnR5cGVBcmd1bWVudHMubWFwKFR5cGVSZWYud3JhcCk7CisgICAgICAgIHJl
dHVybiBvdmVybG9hZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisg
ICAgICAgICAgICBvdmVybG9hZC5mdW5jLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNh
dGlvbkNvbnRleHQpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ29tbWFF
eHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NvbW1hRXhwcmVz
c2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Db21tYUV4cHJlc3Np
b24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDb21tYUV4
cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxp
c3QpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9saXN0ID0g
bGlzdDsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpc3QoKSB7IHJldHVybiB0aGlzLl9saXN0OyB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIoIiArIHRoaXMu
bGlzdC50b1N0cmluZygpICsgIikiOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ29uc3RleHByVHlwZVBhcmFtZXRlciBleHRlbmRzIFZh
bHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAg
ICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAg
ICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJl
dHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9
CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIGdldCBpc1VuaWZp
YWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB0eXBlVmFyaWFibGVVbmlmeSh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFu
Y2VvZiBWYWx1ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgaWYgKCF0
aGlzLnR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlKSkKKyAgICAgICAg
ICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNv
bnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAg
ICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7Cisg
ICAgICAgIAorICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBWYXJpYWJsZVJlZikKKyAgICAg
ICAgICAgIG90aGVyID0gb3RoZXIudmFyaWFibGU7CisgICAgICAgIAorICAgICAgICB1bmlmaWNh
dGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAg
ICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRl
eHQsIG90aGVyKTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNhdGlv
bkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
dmVyaWZ5QXNQYXJhbWV0ZXIodW5pZmljYXRpb25Db250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9FQnVmZmVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0VCdWZmZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRUJ1ZmZlci5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2xldCBlQnVmZmVyQ291bnQg
PSAwOworCitjbGFzcyBFQnVmZmVyIHsKKyAgICBjb25zdHJ1Y3RvcihzaXplKQorICAgIHsKKyAg
ICAgICAgdGhpcy5faW5kZXggPSBlQnVmZmVyQ291bnQrKzsKKyAgICAgICAgdGhpcy5fYXJyYXkg
PSBuZXcgQXJyYXkoc2l6ZSk7CisgICAgfQorICAgIAorICAgIGdldChpbmRleCkKKyAgICB7Cisg
ICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fYXJyYXkubGVuZ3RoKQorICAg
ICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJvdXQgb2YgYm91bmRzIGJ1ZmZlciBhY2Nlc3MiKTsK
KyAgICAgICAgcmV0dXJuIHRoaXMuX2FycmF5W2luZGV4XTsKKyAgICB9CisgICAgCisgICAgc2V0
KGluZGV4LCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2FycmF5W2luZGV4XSA9IHZhbHVl
OworICAgIH0KKyAgICAKKyAgICBnZXQgaW5kZXgoKSB7IHJldHVybiB0aGlzLl9pbmRleDsgfQor
ICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiQiIgKyB0aGlzLl9p
bmRleCArICI6WyIgKyB0aGlzLl9hcnJheSArICJdIjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9FQnVmZmVyQnVpbGRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9FQnVmZmVyQnVpbGRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9FQnVmZmVyQnVpbGRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUxIEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIEVCdWZmZXJCdWlsZGVyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgY29uc3RydWN0b3Io
cHJvZ3JhbSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBwcm9ncmFtOworICAgICAg
ICAKKyAgICAgICAgbGV0IHJlc2V0cyA9IFtdOworICAgICAgICB0aGlzLl9yZXNldHMgPSByZXNl
dHM7CisgICAgICAgIHByb2dyYW0ucmVzZXRzID0gcmVzZXRzOworICAgIH0KKyAgICAKKyAgICBf
Y3JlYXRlRVB0cih0eXBlKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHR5cGUud2l0aFJlY3Vyc2l2
ZWx5SW5zdGFudGlhdGVkSW1tZWRpYXRlczsKKyAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBFQnVm
ZmVyKHR5cGUuc2l6ZSk7CisgICAgICAgIHR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUoYnVmZmVy
LCAwKTsKKyAgICAgICAgdGhpcy5fcmVzZXRzLnB1c2goKCkgPT4gdHlwZS5wb3B1bGF0ZURlZmF1
bHRWYWx1ZShidWZmZXIsIDApKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFUHRyKHR5cGUsIGJ1ZmZl
ciwgMCk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY1BhcmFtZXRlcihub2RlKQorICAgIHsK
KyAgICAgICAgbm9kZS5lUHRyID0gdGhpcy5fY3JlYXRlRVB0cihub2RlLnR5cGUpOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRUZsb2F0LmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0VGbG9hdC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9FRmxvYXQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBFRmxvYXQgZXh0ZW5kcyBFVmFsdWUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKQor
ICAgIHsKKyAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7
CisgICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9Cisg
ICAgCisgICAgYWRkKG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFRmxvYXQodGhp
cy50eXBlLCB0aGlzLnZhbHVlICsgb3RoZXIudmFsdWUpOworICAgIH0KKyAgICAKKyAgICB0b1N0
cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIiIgKyB0aGlzLnZhbHVlOworICAgIH0KK30K
KwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRUludC5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9FSW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0VJ
bnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFSW50IGV4
dGVuZHMgRVZhbHVlIHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBlLCB2YWx1ZSkKKyAgICB7CisgICAg
ICAgIHN1cGVyKHR5cGUpOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAg
ICAKKyAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIAorICAgIGFk
ZChvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRUludCh0aGlzLnR5cGUsICh0aGlz
LnZhbHVlICsgb3RoZXIudmFsdWUpIHwgMCk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiAiIiArIHRoaXMudmFsdWU7CisgICAgfQorfQorCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9FUHRyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0VQdHIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRVB0ci5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEVQdHIgZXh0ZW5kcyBF
VmFsdWUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIGJ1ZmZlciwgb2Zmc2V0KQorICAgIHsKKyAg
ICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgIHRoaXMuX2J1ZmZlciA9IGJ1ZmZlcjsKKyAgICAg
ICAgdGhpcy5fb2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKyAgICAKKyAgICAvLyBUaGUgaW50ZXJw
cmV0ZXIgYWx3YXlzIHBhc3NlcyBhcm91bmQgcG9pbnRlcnMgdG8gdGhpbmdzLiBUaGlzIG1lYW5z
IHRoYXQgc29tZXRpbWVzIHdlIHdpbGwKKyAgICAvLyB3YW50IHRvIHJldHVybiBhIHZhbHVlIGJ1
dCB3ZSBoYXZlIHRvICJpbnZlbnQiIGEgcG9pbnRlciB0byB0aGF0IHZhbHVlLiBObyBwcm9ibGVt
LCB0aGlzCisgICAgLy8gZnVuY3Rpb24gaXMgaGVyZSB0byBoZWxwLgorICAgIC8vCisgICAgLy8g
SW4gYSByZWFsIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCwgdXNlcyBvZiB0aGlzIG1hbmlmZXN0IGFz
IFNTQSB0ZW1wb3Jhcmllcy4KKyAgICBzdGF0aWMgYm94KHZhbHVlKQorICAgIHsKKyAgICAgICAg
bGV0IGJ1ZmZlciA9IG5ldyBFQnVmZmVyKDEpOworICAgICAgICBidWZmZXIuc2V0KDAsIHZhbHVl
KTsKKyAgICAgICAgcmV0dXJuIG5ldyBFUHRyKG5ldyBQdHJUeXBlKHZhbHVlLnR5cGUub3JpZ2lu
LCAidGhyZWFkIiwgdmFsdWUudHlwZSksIGJ1ZmZlciwgMCk7CisgICAgfQorICAgIAorICAgIGdl
dCBidWZmZXIoKSB7IHJldHVybiB0aGlzLl9idWZmZXI7IH0KKyAgICBnZXQgb2Zmc2V0KCkgeyBy
ZXR1cm4gdGhpcy5fb2Zmc2V0OyB9CisgICAgCisgICAgbG9hZFZhbHVlKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmJ1ZmZlci5nZXQodGhpcy5vZmZzZXQpOworICAgIH0KKyAgICAKKyAg
ICB0b1N0cmluZygpCisgICAgeworICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKQorICAgICAgICAg
ICAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgcmV0dXJuICJeQiIgKyB0aGlzLmJ1ZmZlci5pbmRl
eCArICI6IiArIHRoaXMub2Zmc2V0OworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvRVZhbHVlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0VWYWx1ZS5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FVmFsdWUuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFVmFsdWUgeworICAgIGNvbnN0cnVjdG9y
KHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0V2YWx1YXRpb25Db21tb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvRXZhbHVhdGlvbkNvbW1vbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9FdmFsdWF0aW9uQ29tbW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzAgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY29uc3QgQnJlYWtFeGNlcHRpb24gPSBTeW1ib2woIkJyZWFrRXhjZXB0aW9uIik7Citj
b25zdCBDb250aW51ZUV4Y2VwdGlvbiA9IFN5bWJvbCgiQ29udGludWVFeGNlcHRpb24iKTsKKwor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0b3IuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvRXZhbHVhdG9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL0V2YWx1YXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
Ky8vIFRoaXMgaXMgYSBjb21iaW5lZCBMSFMvUkhTIGV2YWx1YXRvciB0aGF0IHBhc3NlcyBhcm91
bmQgRVB0cidzIHRvIGV2ZXJ5dGhpbmcuCitjbGFzcyBFdmFsdWF0b3IgZXh0ZW5kcyBWaXNpdG9y
IHsKKyAgICB2aXNpdEZ1bmN0aW9uQm9keShibG9jaykKKyAgICB7CisgICAgICAgIHRyeSB7Cisg
ICAgICAgICAgICBibG9jay52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBz
aG91bGQgaGF2ZSBhIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIGRyb3Agb3V0IG9mIGEg
ZnVuY3Rpb24gd2l0aG91dAorICAgICAgICAgICAgLy8gcmV0dXJuaW5nIHVubGVzcyB0aGUgZnVu
Y3Rpb24gcmV0dXJucyB2b2lkLgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0g
Y2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGlmIChlID09IEJyZWFrRXhjZXB0aW9uIHx8IGUgPT0g
Q29udGludWVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTaG91
bGQgbm90IHNlZSBicmVhay9jb250aW51ZSBhdCBmdW5jdGlvbiBzY29wZSIpOworICAgICAgICAg
ICAgaWYgKGUgaW5zdGFuY2VvZiBSZXR1cm5FeGNlcHRpb24pCisgICAgICAgICAgICAgICAgcmV0
dXJuIGUudmFsdWU7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorICAg
IAorICAgIHZpc2l0RnVuY3Rpb25MaWtlQmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAo
bGV0IGkgPSAwOyBpIDwgbm9kZS5hcmd1bWVudExpc3QubGVuZ3RoOyArK2kpCisgICAgICAgICAg
ICBub2RlLnBhcmFtZXRlcnNbaV0ubFZhbHVlLnZhbHVlID0gbm9kZS5hcmd1bWVudExpc3RbaV0u
dmlzaXQodGhpcyk7CisgICAgICAgIHJldHVybiB2aXNpdEZ1bmN0aW9uQm9keShub2RlLmJsb2Nr
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAgIHRo
cm93IG5ldyBSZXR1cm5FeGNlcHRpb24obm9kZS52YWx1ZSA/IG5vZGUudmFsdWUudmlzaXQodGhp
cykgOiBudWxsKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQor
ICAgIHsKKyAgICAgICAgLy8gV2UgZXZhbHVhdGUgaW5saW5lZCBBU1RzLCBzbyB0aGlzIGNhbiBv
bmx5IGJlIGEgbmF0aXZlIGNhbGwuCisgICAgICAgIGxldCBjYWxsQXJndW1lbnRzID0gbm9kZS5h
cmd1bWVudExpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAg
ICAgcmV0dXJuIG5vZGUuaW1wbGVtZW50YXRpb24oY2FsbEFyZ3VtZW50cyk7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvRXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIEV4cHJlc3Npb24gZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3Jp
Z2luKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgIH0KKyAgICAK
KyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9GaWVsZC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9G
aWVsZC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GaWVsZC5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZpZWxkIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4g
PSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBl
ID0gdHlwZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29y
aWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0
eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuYy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9GdW5jLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jIGV4dGVu
ZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3IobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRl
cnMsIHBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAg
ICAgdGhpcy5fcmV0dXJuVHlwZSA9IHJldHVyblR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJh
bWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX3BhcmFtZXRlcnMgPSBwYXJh
bWV0ZXJzOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7
IH0KKyAgICBnZXQgcmV0dXJuVHlwZSgpIHsgcmV0dXJuIHRoaXMuX3JldHVyblR5cGU7IH0KKyAg
ICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQor
ICAgIGdldCBwYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fcGFyYW1ldGVyczsgfQorICAgIGdl
dCBwYXJhbWV0ZXJUeXBlcygpIHsgcmV0dXJuIHRoaXMucGFyYW1ldGVycy5tYXAocGFyYW1ldGVy
ID0+IHBhcmFtZXRlci50eXBlKTsgfQorICAgIAorICAgIGdldCBraW5kKCkgeyByZXR1cm4gRnVu
YzsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnJl
dHVyblR5cGUgKyAiICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsg
Ij4oIiArIHRoaXMucGFyYW1ldGVycyArICIpIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0Z1bmNEZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVu
Y0RlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jRGVmLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY0RlZiBleHRlbmRz
IEZ1bmMgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBh
cmFtZXRlcnMsIHBhcmFtZXRlcnMsIGJvZHkpCisgICAgeworICAgICAgICBzdXBlcihuYW1lLCBy
ZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycyk7CisgICAgICAgIHRoaXMuX29y
aWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5ib2R5ID0gYm9keTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpICsgIiB7ICIgKyBi
b2R5ICsgIiB9IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNJbnN0
YW50aWF0b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0luc3RhbnRp
YXRvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jSW5zdGFudGlh
dG9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY0lu
c3RhbnRpYXRvciB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5faW5z
dGFuY2VzID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIGEgRnVuYyBv
YmplY3QgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgcGFydGljdWxhciBzeXN0ZW0gb2YgdHlw
ZSBhcmd1bWVudHMuCisgICAgZ2V0VW5pcXVlKGZ1bmMsIHR5cGVBcmd1bWVudHMpCisgICAgewor
ICAgICAgICBpZiAoIWZ1bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgcmV0
dXJuIGZ1bmM7CisgICAgICAgIAorICAgICAgICBsZXQgaW5zdGFuY2VzID0gdGhpcy5faW5zdGFu
Y2VzLmdldChmdW5jKTsKKyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisgICAgICAgICAgICB0aGlz
Ll9mdW5jdGlvbnMuc2V0KGZ1bmMsIGZ1bmN0aW9ucyA9IFtdKTsKKyAgICAgICAgCisgICAgICAg
IGZvciAobGV0IGluc3RhbmNlIG9mIGluc3RhbmNlcykgeworICAgICAgICAgICAgbGV0IG9rID0g
dHJ1ZTsKKyAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbnN0YW5jZS50eXBlQXJndW1lbnRzLmxl
bmd0aDsgaS0tOykgeworICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2UudHlwZUFyZ3VtZW50
c1tpXS5lcXVhbHModHlwZUFyZ3VtZW50c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sg
PSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250
aW51ZTsKKyAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5mdW5jOworICAgICAgICB9CisgICAg
ICAgIAorICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLm1hcHBpbmcoZnVu
Yy50eXBlUGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIGxldCBmdW5jID0gbmV3
IEZ1bmNEZWYoCisgICAgICAgICAgICBmdW5jLm9yaWdpbiwgZnVuYy5uYW1lLAorICAgICAgICAg
ICAgZnVuYy5yZXR1cm5UeXBlLnZpc2l0KHN1YnN0aXR1dGlvbiksCisgICAgICAgICAgICBbXSwg
Ly8gV2UncmUgaW5zdGFudGlhdGVkIHNvIHdlIG5vIGxvbmdlciB0YWtlIHR5cGUgcGFyYW1ldGVy
cy4KKyAgICAgICAgICAgIHBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlz
aXQoc3Vic3RpdHV0aW9uKSksCisgICAgICAgICAgICBib2R5LnZpc2l0KHN1YnN0aXR1dGlvbikp
OworICAgICAgICBsZXQgaW5zdGFuY2UgPSB7ZnVuYywgdHlwZUFyZ3VtZW50c307CisgICAgICAg
IGluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGZ1bmM7CisgICAgfQor
fQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jUGFyYW1ldGVyLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNQYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvRnVuY1BhcmFtZXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmNQYXJhbWV0ZXIgZXh0ZW5kcyBWYWx1ZSB7CisgICAg
Ly8gVGhlIG5hbWUgaXMgb3B0aW9uYWwuIEl0J3MgT0sgZm9yIGl0IHRvIGJlIG51bGwhCisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3Jp
Z2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5f
dHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlz
Ll9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBn
ZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICBpZiAoIXRoaXMubmFtZSkKKyAgICAgICAgICAgIHJldHVybiAiIiArIHRo
aXMudHlwZTsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMubmFtZTsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNTaWduYXR1cmUuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY1NpZ25hdHVyZS5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jU2lnbmF0dXJlLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtl
QmxvY2suanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtlQmxv
Y2suanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtlQmxv
Y2suanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlv
bkxpa2VCbG9jayBleHRlbmRzIFZhbHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFyZ3Vt
ZW50TGlzdCwgcGFyYW1ldGVycywgYm9keSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAg
ICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fYm9keSA9
IGJvZHk7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmln
aW47IH0KKyAgICBnZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0
OyB9CisgICAgZ2V0IHBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzOyB9Cisg
ICAgZ2V0IGJvZHkoKSB7IHJldHVybiB0aGlzLl9ib2R5OyB9CisgICAgCisgICAgdG9TdHJpbmco
KQorICAgIHsKKyAgICAgICAgcmV0dXJuICJbJl0gKCIgKyBwYXJhbWV0ZXJzICsgIikgeyAiICsg
YmxvY2sgKyAiIH0oIiArIGFyZ3VtZW50TGlzdCArICIpIjsKKyAgICB9Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9JbmxpbmUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
SW5saW5lLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0lubGluZS5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIGlubGluZShwcm9n
cmFtKQoreworICAgIGZvciAobGV0IGZ1bmMgb2YgcHJvZ3JhbS5mdW5jdGlvbnMpIHsKKyAgICAg
ICAgaWYgKCFmdW5jLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIF9pbmxpbmVG
dW5jdGlvbihwcm9ncmFtLCBmdW5jLCBuZXcgVmlzaXRpbmdTZXQoZnVuYykpOworICAgIH0KK30K
KworZnVuY3Rpb24gX2lubGluZUZ1bmN0aW9uKHByb2dyYW0sIGZ1bmMsIHZpc2l0aW5nKQorewor
ICAgIGlmIChmdW5jLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJDYW5ub3QgaW5saW5lIGZ1bmN0aW9uIHRoYXQgaGFzIHR5cGUgcGFyYW1ldGVycyIpOwor
ICAgIGlmIChmdW5jLmlubGluZWQpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAgICAvLyBUaGlz
IGlzIHRoZSBwcmVjaXNlIHRpbWUgd2hlbiB3ZSBjYW4gYnVpbGQgRUJ1ZmZlcnMgaW4gb3JkZXIg
dG8gZ2V0IHRoZW0gdG8gYmUgdW5pcXVlZCBieQorICAgIC8vIHR5cGUgaW5zdGFudGlhdGlvbiBi
dXQgbm90aGluZyBlbHNlLgorICAgIGZ1bmMudmlzaXQobmV3IEVCdWZmZXJCdWlsZGVyKCkpOwor
ICAgIAorICAgIGZ1bmMuYm9keSA9IGZ1bmMuYm9keS52aXNpdChuZXcgSW5saW5lcihwcm9ncmFt
LCBmdW5jLCB2aXNpdGluZykpOworICAgIGZ1bmMuaW5saW5lZCA9IHRydWU7Cit9CisKK2Z1bmN0
aW9uIHJlc29sdmVJbmxpbmVkRnVuY3Rpb24ocHJvZ3JhbSwgbmFtZSwgdHlwZUFyZ3VtZW50cywg
YXJndW1lbnRUeXBlcykKK3sKKyAgICBsZXQgb3ZlcmxvYWQgPSBwcm9ncmFtLnJlc29sdmVGdW5j
T3ZlcmxvYWQobmFtZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAgaWYgKCFv
dmVybG9hZCkKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgaWYgKCFvdmVybG9hZC5mdW5jLnR5
cGVQYXJhbWV0ZXJzKQorICAgICAgICByZXR1cm4gb3ZlcmxvYWQuZnVuYzsKKyAgICBsZXQgZnVu
YyA9IHByb2dyYW0uZnVuY0luc3RhbnRpYXRvci5nZXRVbmlxdWUob3ZlcmxvYWQuZnVuYywgb3Zl
cmxvYWQudHlwZUFyZ3VtZW50cyk7CisgICAgX2lubGluZUZ1bmN0aW9uKHByb2dyYW0sIGZ1bmMs
IG5ldyBWaXNpdGluZ1NldChvdmVybG9hZC5mdW5jKSk7CisgICAgcmV0dXJuIGZ1bmM7Cit9Cklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbmxpbmVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL0lubGluZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
SW5saW5lci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIElu
bGluZXIgZXh0ZW5kcyBSZXdyaXRlciB7CisgICAgY29uc3RydWN0b3IocHJvZ3JhbSwgZnVuYywg
dmlzaXRpbmcpCisgICAgeworICAgICAgICB0aGlzLl9wcm9ncmFtID0gcHJvZ3JhbTsKKyAgICAg
ICAgdGhpcy5fdmlzaXRpbmcgPSB2aXNpdGluZzsKKyAgICB9CisgICAgCisgICAgdmlzaXRDYWxs
RXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgaWYgKG5vZGUuZnVuYy5pc05hdGl2ZSkK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2l0aW5nLmRvVmlz
aXQobm9kZS5mdW5jLCAoKSA9PiB7CisgICAgICAgICAgICBsZXQgZnVuYyA9IHRoaXMuX3Byb2dy
YW0uZnVuY0luc3RhbnRpYXRvci5nZXRVbmlxdWUobm9kZS5mdW5jLCBub2RlLmFjdHVhbFR5cGVB
cmd1bWVudHMpOworICAgICAgICAgICAgX2lubGluZUZ1bmN0aW9uKHRoaXMuX3Byb2dyYW0sIGZ1
bmMsIHRoaXMuX3Zpc2l0aW5nKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25MaWtl
QmxvY2soCisgICAgICAgICAgICAgICAgbm9kZS5vcmlnaW4sCisgICAgICAgICAgICAgICAgbm9k
ZS5hcmd1bWVudExpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSwKKyAg
ICAgICAgICAgICAgICBmdW5jLnBhcmFtZXRlcnMsIGZ1bmMuYm9keSk7CisgICAgICAgIH0pOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW5zdGFudGlhdGVJbW1lZGlhdGVz
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0luc3RhbnRpYXRlSW1tZWRpYXRl
cy5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9JbnN0YW50aWF0ZUltbWVk
aWF0ZXMuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBJbnN0
YW50aWF0ZUltbWVkaWF0ZXMgZXh0ZW5kcyBSZXdyaXRlciB7CisgICAgdmlzaXRUeXBlUmVmKG5v
ZGUpCisgICAgeworICAgICAgICBub2RlID0gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAg
ICAgICByZXR1cm4gbm9kZS5pbnN0YW50aWF0ZWRUeXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBu
b2RlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBJbnRMaXRlcmFsIGV4dGVuZHMgRXhwcmVzc2lvbiB7
CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9y
aWdpbik7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdl
dCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkg
eyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiAiIiArIHRoaXMuX3ZhbHVlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvSW50cmluc2ljcy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5z
aWNzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBJbnRyaW5zaWNzIHsK
KyAgICBjb25zdHJ1Y3RvcigpCisgICAgeworICAgICAgICB0aGlzLl9tYXAgPSBuZXcgTWFwKCk7
CisKKyAgICAgICAgLy8gTk9URTogSW50cmluc2ljIHJlc29sdXRpb24gaGFwcGVucyBiZWZvcmUg
dHlwZSBuYW1lIHJlc29sdXRpb24sIHNvIHRoZSBzdHJpbmdzIHdlIHVzZSBoZXJlCisgICAgICAg
IC8vIHRvIGNhdGNoIHRoZSBpbnRyaW5zaWNzIG11c3QgYmUgYmFzZWQgb24gdGhlIHR5cGUgbmFt
ZXMgdGhhdCBTdGFuZGFyZExpYnJhcnkuanMgdXNlcy4gRm9yCisgICAgICAgIC8vIGV4YW1wbGUs
IGlmIGEgbmF0aXZlIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIHVzaW5nICJpbnQiIHJhdGhlciB0aGFu
ICJpbnQzMiIsIHRoZW4gd2UgbXVzdCB1c2UKKyAgICAgICAgLy8gImludCIgaGVyZSwgc2luY2Ug
d2UgZG9uJ3QgeWV0IGtub3cgdGhhdCB0aGV5IGFyZSB0aGUgc2FtZSB0eXBlLgorICAgICAgICAK
KyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0aXZlIHR5
cGUgdm9pZDw+IiwKKyAgICAgICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAgICAgICAgdGhp
cy52b2lkID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0eXBlLnNpemUgPSAwOworICAgICAgICAg
ICAgICAgIHR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUgPSAoKSA9PiB7IH07CisgICAgICAgICAg
ICB9KTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBwcmlt
aXRpdmUgdHlwZSBpbnQzMjw+IiwKKyAgICAgICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAg
ICAgICAgdGhpcy5pbnQzMiA9IHR5cGU7CisgICAgICAgICAgICAgICAgdHlwZS5zaXplID0gMTsK
KyAgICAgICAgICAgICAgICB0eXBlLnBvcHVsYXRlRGVmYXVsdFZhbHVlID0gKGJ1ZmZlciwgb2Zm
c2V0KSA9PiBidWZmZXIuc2V0KG9mZnNldCwgbmV3IEVJbnQodHlwZSwgMCkpOworICAgICAgICAg
ICAgfSk7CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJp
bWl0aXZlIHR5cGUgZG91YmxlPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAg
ICAgICAgICB0aGlzLmRvdWJsZSA9IHR5cGU7CisgICAgICAgICAgICAgICAgdHlwZS5zaXplID0g
MTsKKyAgICAgICAgICAgICAgICB0eXBlLnBvcHVsYXRlRGVmYXVsdFZhbHVlID0KKyAgICAgICAg
ICAgICAgICAgICAgKGJ1ZmZlciwgb2Zmc2V0KSA9PiBidWZmZXIuc2V0KG9mZnNldCwgbmV3IEVG
bG9hdCh0eXBlLCAwKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgCisgICAgICAgIHRoaXMu
X21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIGludCBvcGVyYXRvcis8PihpbnQsaW50KSIs
CisgICAgICAgICAgICAoZnVuYykgPT4geworICAgICAgICAgICAgICAgIGZ1bmMuaW1wbGVtZW50
YXRpb24gPQorICAgICAgICAgICAgICAgICAgICAoW2xlZnQsIHJpZ2h0XSkgPT4gRVB0ci5ib3go
bGVmdC5sb2FkVmFsdWUoKS5hZGQocmlnaHQubG9hZFZhbHVlKCkpKTsKKyAgICAgICAgICAgIH0p
OworICAgIH0KKyAgICAKKyAgICBhZGQodGhpbmcpCisgICAgeworICAgICAgICBsZXQgaW50cmlu
c2ljID0gdGhpcy5fbWFwLmdldCh0aGluZy5uYW1lKTsKKyAgICAgICAgaWYgKCFpbnRyaW5zaWMp
CisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IodGhpbmcub3JpZ2luLm9yaWdpblN0
cmluZywgIlVucmVjb2duaXplZCBpbnRyaW5zaWM6ICIgKyB0aGluZyk7CisgICAgICAgIGludHJp
bnNpYyh0aGluZyk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlci5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9MZXhlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBMZXhlciB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBsaW5l
TnVtYmVyT2Zmc2V0LCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2lu
OworICAgICAgICB0aGlzLl9saW5lTnVtYmVyT2Zmc2V0ID0gbGluZU51bWJlck9mZnNldDsKKyAg
ICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAgICAgIHRoaXMuX2luZGV4ID0gMDsKKyAgICAg
ICAgdGhpcy5fc3RhY2sgPSBbXTsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpbmVOdW1iZXIoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4
KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5fb3JpZ2luICsgIjoiICsgKHRoaXMubGluZU51bWJlciArIDEpOworICAgIH0K
KyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5kZXgoaW5kZXgpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpLm1hdGNoKC9cbi9nKS5sZW5ndGggKyB0
aGlzLl9saW5lTnVtYmVyT2Zmc2V0OworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGUoKSB7IHJl
dHVybiB0aGlzLl9pbmRleDsgfQorICAgIHNldCBzdGF0ZSh2YWx1ZSkgeyB0aGlzLl9pbmRleCA9
IHZhbHVlOyB9CisgICAgCisgICAgbmV4dCgpCisgICAgeworICAgICAgICBpZiAodGhpcy5fc3Rh
Y2subGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0YWNrLnBvcCgpOworICAgICAg
ICAKKyAgICAgICAgaWYgKHRoaXMuX2luZGV4ID49IHRoaXMuX3RleHQubGVuZ3RoKQorICAgICAg
ICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAgICBjb25zdCBpc0NDb21tZW50QmVn
aW4gPSAvXC9cKi87CisgICAgICAgIGNvbnN0IGlzQ1BsdXNQbHVzQ29tbWVudEJlZ2luID0gL1wv
XC8vOworICAgICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9IChraW5kKSA9PiB7CisgICAgICAg
ICAgICBsZXQgdGV4dCA9IFJlZ0V4cC5sYXN0TWF0Y2g7CisgICAgICAgICAgICBsZXQgdG9rZW4g
PSBuZXcgTGV4ZXJUb2tlbih0aGlzLCB0aGlzLl9pbmRleCwga2luZCwgdGV4dCk7CisgICAgICAg
ICAgICB0aGlzLl9pbmRleCArPSB0ZXh0Lmxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiB0b2tl
bjsKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgcmVsZXZhbnRUZXh0OworICAgICAgICBmb3Ig
KDs7KSB7CisgICAgICAgICAgICByZWxldmFudFRleHQgPSB0aGlzLl90ZXh0LnN1YnN0cmluZyh0
aGlzLl9pbmRleCk7CisgICAgICAgICAgICBpZiAoL15ccysvLnRlc3QocmVsZXZhbnRUZXh0KSkg
eworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gubGVuZ3Ro
OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
aWYgKC9eXC9cKi8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgbGV0IGVu
ZEluZGV4ID0gcmVsZXZhbnRUZXh0LnNlYXJjaCgvXCpcLy8pOworICAgICAgICAgICAgICAgIGlm
IChlbmRJbmRleCA8IDApCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbCgiVW50ZXJtaW5h
dGVkIGNvbW1lbnQiKTsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBlbmRJbmRleDsK
KyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlm
ICgvXlwvXC8uKi8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5f
aW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAgY29udGlu
dWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAg
ICAKKyAgICAgICAgLy8gRklYTUU6IE1ha2UgdGhpcyBkbyBVbmljb2RlLgorICAgICAgICBpZiAo
L15bXlxkXFddXHcqLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVz
dWx0KCJpZGVudGlmaWVyIik7CisKKyAgICAgICAgaWYgKC9eWzAtOV0rLy50ZXN0KHJlbGV2YW50
VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJpbnRMaXRlcmFsIik7CisKKyAgICAg
ICAgLy8gRklYTUU6IE1ha2UgdGhpcyBoYW5kbGUgZXhwLWZvcm0gbGl0ZXJhbHMgbGlrZSAxZTEu
CisgICAgICAgIGlmICgvXihbMC05XSpcLlswLTldKyl8KFswLTldK1wuWzAtOV0qKS8udGVzdChy
ZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiZG91YmxlTGl0ZXJhbCIp
OworICAgICAgICAKKyAgICAgICAgaWYgKC9eKHN0cnVjdHxwcm90b2NvbHx0eXBlfGlmfGVsc2V8
ZW51bXxjb250aW51ZXxicmVha3xzd2l0Y2h8Y2FzZXxkZWZhdWx0fGZvcnx3aGlsZXxkb3xyZXR1
cm58c2l6ZW9mfGNvbnN0YW50fGRldmljZXx0aHJlYWRncm91cHx0aHJlYWR8b3BlcmF0b3J8bnVs
bCkvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImtleXdv
cmQiKTsKKyAgICAgICAgCisgICAgICAgIGlmICgvXihbe30oKVxbXF0/Oj0rKlwvLC4lIX5eJnw8
PlxcLV18LT58PT58PD18PT18IT18Kz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0KHJl
bGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIpOwor
ICAgICAgICAKKyAgICAgICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3aXRo
OiAiICsgcmVsZXZhbnRUZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAgICBw
dXNoKHRva2VuKQorICAgIHsKKyAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7CisgICAg
fQorICAgIAorICAgIHBlZWsoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQoKTsK
KyAgICAgICAgcHVzaChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAg
ICAKKyAgICBmYWlsKGVycm9yKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4RXJy
b3IodGhpcy5vcmlnaW5TdHJpbmcsIGVycm9yKTsKKyAgICB9CisgICAgCisgICAgYmFja3RyYWNr
aW5nU2NvcGUoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRl
OworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAgICAg
IH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhFcnJv
cikgeworICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAg
ICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAg
ICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIExleGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9yKGxl
eGVyLCBvcmlnaW4sIGluZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4
ZXIgPSBsZXhlcjsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlz
Ll9pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAgdGhp
cy5fdGV4dCA9IHRleHQ7CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLl9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdp
bigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAKKyAg
ICBnZXQgaW5kZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAgIH0K
KyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5f
bGV4ZXIubGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAg
Z2V0IG9yaWdpblN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gKyAi
OiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwgIiAr
IHRoaXMudGV4dCArICIsICIgKyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvTmFtZUNvbnRleHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjMgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY29uc3QgTm90RnVuYyA9IFN5bWJvbCgpOworCitmdW5jdGlvbiBpc1dpbGRjYXJkS2luZChr
aW5kKQoreworICAgIHJldHVybiBraW5kID09IE5vdEZ1bmM7Cit9CisKK2NsYXNzIE5hbWVDb250
ZXh0IHsKKyAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2Z1
bmNNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKyAgICAg
ICAgdGhpcy5fZGVmaW5lZCA9IG5ldyBTZXQoKTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRl
bWVudCA9IG51bGw7CisgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbnVsbDsKKyAgICAgICAgdGhp
cy5faW50cmluc2ljcyA9IG51bGw7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsOworICAg
IH0KKyAgICAKKyAgICBtYXBGb3Ioa2luZCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCkg
eworICAgICAgICBjYXNlIE5vdEZ1bmM6CisgICAgICAgIGNhc2UgVmFsdWU6CisgICAgICAgIGNh
c2UgVHlwZToKKyAgICAgICAgY2FzZSBQcm90b2NvbDoKKyAgICAgICAgICAgIHJldHVybiB0aGlz
Ll9tYXA7CisgICAgICAgIGNhc2UgRnVuYzoKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9mdW5j
TWFwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQg
a2luZDogIiArIGtpbmQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFkZCh0aGluZykK
KyAgICB7CisgICAgICAgIGlmICghdGhpbmcubmFtZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAg
ICAgICAgCisgICAgICAgIGlmICh0aGluZy5pc05hdGl2ZSkgeworICAgICAgICAgICAgaWYgKCF0
aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTmF0aXZl
IGZ1bmN0aW9uIGluIGEgc2NvcGUgdGhhdCBkb2VzIG5vdCByZWNvZ25pemUgaW50cmluc2ljcyIp
OworICAgICAgICAgICAgdGhpcy5faW50cmluc2ljcy5hZGQodGhpbmcpOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICBpZiAodGhpbmcua2luZCA9PSBGdW5jKSB7CisgICAgICAgICAgICBs
ZXQgYXJyYXkgPSB0aGlzLl9mdW5jTWFwLmdldCh0aGluZy5uYW1lKTsKKyAgICAgICAgICAgIGlm
ICghYXJyYXkpCisgICAgICAgICAgICAgICAgdGhpcy5fZnVuY01hcC5zZXQodGhpbmcubmFtZSwg
YXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5fbWFwLmhhcyh0aGluZy5uYW1l
KSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2lu
U3RyaW5nLCAiRHVwbGljYXRlIG5hbWU6ICIgKyB0aGluZy5uYW1lKTsKKyAgICAgICAgdGhpcy5f
bWFwLnNldCh0aGluZy5uYW1lLCB0aGluZyk7CisgICAgfQorICAgIAorICAgIGdldChraW5kLCBu
YW1lKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG1hcEZvcihraW5kKS5nZXQobmFtZSk7
CisgICAgICAgIGlmICghcmVzdWx0ICYmIHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0
dXJuIHRoaXMuX2RlbGVnYXRlLmdldChraW5kLCBuYW1lKTsKKyAgICAgICAgaWYgKCFpc1dpbGRj
YXJkS2luZChraW5kKSAmJiByZXN1bHQua2luZCAhPSBraW5kKQorICAgICAgICAgICAgcmV0dXJu
IG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGdldCBjdXJy
ZW50U3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9jdXJyZW50U3RhdGVtZW50
KQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIGlm
ICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jdXJy
ZW50U3RhdGVtZW50OworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgaXNE
ZWZpbmVkKHRoaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmluZWQuaGFzKHRo
aW5nKQorICAgICAgICAgICAgfHwgKHRoaXMuX2RlbGVnYXRlICYmIHRoaXMuX2RlbGVnYXRlLmlz
RGVmaW5lZCh0aGluZykpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmUodGhpbmcpCisgICAgewor
ICAgICAgICB0aGlzLl9kZWZpbmVkLnNldCh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRlZmlu
ZUFsbCgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0aGluZyBvZiB0aGlzKQorICAgICAgICAg
ICAgZGVmaW5lKHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZG9TdGF0ZW1lbnQoc3RhdGVtZW50
LCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBzdGF0
ZW1lbnQ7CisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1l
bnQgPSBudWxsOworICAgICAgICBkZWZpbmUoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAg
cmVjb2duaXplSW50cmluc2ljcygpCisgICAgeworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0g
bmV3IEludHJpbnNpY3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGludHJpbnNpY3MoKQorICAg
IHsKKyAgICAgICAgaWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICByZXR1cm4gdGhp
cy5faW50cmluc2ljczsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAg
cmV0dXJuIHRoaXMuX2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAgICAgIHJldHVybiBudWxsOwor
ICAgIH0KKyAgICAKKyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMu
X3Byb2dyYW0gPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHByb2dyYW0oKQorICAgIHsK
KyAgICAgICAgaWYgKHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJv
Z3JhbTsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRo
aXMuX2RlbGVnYXRlLnByb2dyYW07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAK
KyAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgbWFwIG9m
IHRoaXMuX21hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlz
Ll90eXBlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVsZCB0eXBlOworICAgICAgICB9
CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZVJlc29sdmVyLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hbWVSZXNvbHZlci5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9OYW1lUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBvbmx5IHJlc29sdmVzIG5hbWVzLiBBZnRlciB0
aGlzIHBoYXNlIHJ1bnMsIGFsbCBuYW1lcyB3aWxsIGJlIHJlc29sdmVkLiBUaGlzIG1lYW5zIHRo
YXQgYWxsCisvLyBYWVpSZWYgb2JqZWN0cyBub3cga25vdyB3aG8gdGhleSByZXNvbHZlIHRvLiBU
aGlzIGRvZXMgbm90IHlldCBhbGxvdyB0eXBlIGFuYWx5c2lzLCBiZWNhdXNlIHRoZXJlCisvLyBh
cmUgc3RpbGwgVHlwZURlZnMuIFRoaXMgdGhyb3dzIHR5cGUgZXJyb3JzIGZvciBmYWlsZWQgbmFt
ZSByZXNvbHV0aW9ucyBhbmQgZm9yIHRoaW5ncyB0aGF0IGFyZQorLy8gbW9yZSBjb252ZW5pZW50
IHRvIGNoZWNrIGhlcmUgdGhhbiBpbiB0aGUgQ2hlY2tlci4gVGhpcyB1c3VhbGx5IGludm9sdmVz
IHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUKKy8vIGNoZWNrZWQgYmVmb3JlIFR5cGVSZWZUb1R5cGVE
ZWZTa2lwcGVyLgorY2xhc3MgTmFtZVJlc29sdmVyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgLy8g
SXQncyB0b3RhbGx5IE9LIHRvIGluc3RhbnRpYXRlIHRoaXMgd2l0aCB6ZXJvIGFyZ3VtZW50cyAo
aS5lLiBwYXNzaW5nIHVuZGVmaW5lZCBmb3IgYm90aCBvZgorICAgIC8vIHRoZW0pIGlmIHlvdSdy
ZSBjcmVhdGluZyBhIENoZWNrZXIgdG8gdmlzaXQgYSBQcm9ncmFtLgorICAgIGNvbnN0cnVjdG9y
KG5hbWVDb250ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZUNvbnRleHQgPSBuYW1lQ29u
dGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOwor
ICAgICAgICBuYW1lQ29udGV4dC5wcm9ncmFtID0gbm9kZTsKKyAgICAgICAgbmFtZUNvbnRleHQu
cmVjb2duaXplSW50cmluc2ljcygpOworICAgICAgICBub2RlLmludHJpbnNpY3MgPSBuYW1lQ29u
dGV4dC5pbnRyaW5zaWNzOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BM
ZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQoc3RhdGVtZW50KTsK
KyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAg
IGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAg
ICAgIG5hbWVDb250ZXh0LmRvU3RhdGVtZW50KCgpID0+IHN0YXRlbWVudC52aXNpdChjaGVja2Vy
KSk7CisgICAgfQorICAgIAorICAgIF92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29u
dGV4dChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250
ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBv
ZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQodHlw
ZVBhcmFtZXRlcik7CisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAg
ICAgICB9CisgICAgICAgIHJldHVybiBuYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlz
aXRGdW5jKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKHRo
aXMuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAgICAg
ICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KGNoZWNrZXIpOworICAgICAgICBmb3IgKGxldCBwYXJh
bWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNo
ZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNEZWYobm9kZSkKKyAgICB7CisgICAg
ICAgIGxldCBjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzID0gdGhpcy5fdmlzaXRUeXBlUGFyYW1l
dGVyc0FuZEJ1aWxkTmFtZUNvbnRleHQobm9kZSk7CisgICAgICAgIGxldCBjaGVja2VyV2l0aFR5
cGVQYXJhbWV0ZXJzID0gbmV3IENoZWNrZXIoY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyk7Cisg
ICAgICAgIG5vZGUucmV0dXJuVHlwZS52aXNpdChjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzKTsK
KyAgICAgICAgbGV0IGNvbnRleHRXaXRoUGFyYW1ldGVycyA9IG5ldyBOYW1lQ29udGV4dChjb250
ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5v
ZGUucGFyYW1ldGVycykgeworICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXJXaXRo
VHlwZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgY29udGV4dFdpdGhQYXJhbWV0ZXJzLmFkZChw
YXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyV2l0aFBhcmFtZXRlcnMg
PSBuZXcgQ2hlY2tlcihjb250ZXh0V2l0aFBhcmFtZXRlcnMpOworICAgICAgICBub2RlLmJvZHku
dmlzaXQoY2hlY2tlcldpdGhQYXJhbWV0ZXJzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9j
ayhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuZXcgTmFt
ZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50
IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdChjaGVja2Vy
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAgICB7CisgICAg
ICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7
CisgICAgICAgIG5hbWVDb250ZXh0LmFkZChub2RlLnR5cGVWYXJpYWJsZSk7CisgICAgICAgIGxl
dCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCBz
aWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAgICAgc2lnbmF0dXJlLnZpc2l0
KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7Cisg
ICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4
dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVy
cykgeworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAg
IG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQg
Y2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgbm9kZS50eXBlLnZp
c2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkKKyAg
ICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1l
Q29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFy
YW1ldGVycykgeworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAg
ICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAg
ICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChs
ZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52aXNpdChjaGVja2Vy
KTsKKyAgICB9CisgICAgCisgICAgX3Jlc29sdmVUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMp
CisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3Ro
OyArK2kpIHsKKyAgICAgICAgICAgIGxldCB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ld
OworICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudCBpbnN0YW5jZW9mIFR5cGVPclZhcmlhYmxl
UmVmKSB7CisgICAgICAgICAgICAgICAgbGV0IHRoaW5nID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0
KE5vdEZ1bmMsIHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaW5n
KQorICAgICAgICAgICAgICAgICAgICBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2lu
U3RyaW5nLCAiQ291bGQgbm90IGZpbmQgdHlwZSBvciB2YXJpYWJsZSBuYW1lZCAiICsgdHlwZUFy
Z3VtZW50Lm5hbWUpOworICAgICAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIFZhbHVl
KSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBWYXJpYWJsZVJl
Zih0eXBlQXJndW1lbnQub3JpZ2luLCB0eXBlQXJndW1lbnQubmFtZSk7CisgICAgICAgICAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBUeXBl
UmVmKHR5cGVBcmd1bWVudC5vcmlnaW4sIHR5cGVBcmd1bWVudC5uYW1lLCBbXSk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRbaV0gaW5z
dGFuY2VvZiBWYWx1ZQorICAgICAgICAgICAgICAgICYmICF0eXBlQXJndW1lbnRbaV0uaXNDb25z
dGV4cHIpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2lu
Lm9yaWdpblN0cmluZywgIkV4cGVjdGVkIGNvbnN0ZXhwciIpOworICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fcmVzb2x2
ZVR5cGVBcmd1bWVudHMobm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGxl
dCB0eXBlID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFR5cGUsIG5vZGUubmFtZSk7CisgICAgICAg
IGlmICghdHlwZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdp
bi5vcmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUp
OworICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmlzRGVmaW5lZCh0eXBlKSkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJJ
bGxlZ2FsIGZvcndhcmQgdXNlIG9mIHR5cGUgbmFtZWQgIiArIG5vZGUubmFtZSk7CisgICAgICAg
IG5vZGUudHlwZSA9IHR5cGU7CisgICAgICAgIAorICAgICAgICBpZiAodHlwZS50eXBlUGFyYW1l
dGVycy5sZW5ndGggIT0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiV3JvbmcgbnVtYmVyIG9m
IHR5cGUgYXJndW1lbnRzIik7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZS50eXBl
UGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcklzVHlw
ZSA9IHR5cGUudHlwZVBhcmFtZXRlcnNbaV0gaW5zdGFuY2VvZiBUeXBlVmFyaWFibGU7CisgICAg
ICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0gaW5zdGFu
Y2VvZiBUeXBlOworICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzW2ldLnZpc2l0KHRoaXMp
OworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcklzVHlwZSAmJiAhYXJndW1lbnRJc1R5cGUpCisg
ICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcs
ICJFeHBlY3RlZCB0eXBlLCBidXQgZ290IHZhbHVlIGF0IGFyZ3VtZW50ICMiICsgaSk7CisgICAg
ICAgICAgICBpZiAoIXBhcmFtZXRlcklzVHlwZSAmJiBhcmd1bWVudElzVHlwZSkKKyAgICAgICAg
ICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIkV4cGVj
dGVkIHZhbHVlLCBidXQgZ290IHR5cGUgYXQgYXJndW1lbnQgIyIgKyBpKTsKKyAgICAgICAgfQor
CisgICAgICAgIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBu
ZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5k
ZWZpbmVBbGwoKTsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgQ2hlY2tlcihu
YW1lQ29udGV4dCkpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisg
ICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFZhbHVlLCBu
b2RlLm5hbWUpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBB
TFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB2YXJp
YWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAgIG5v
ZGUuZnVuYyA9IHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIHN1
cGVyLnZpc2l0UmV0dXJuKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHByZXNz
aW9uKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9yZXNvbHZlVHlwZUFyZ3VtZW50cyhub2Rl
LnR5cGVBcmd1bWVudHMpOworICAgICAgICBzdXBlci52aXNpdENhbGxFeHByZXNzaW9uKG5vZGUp
OworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlRnVuYy5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVGdW5jLmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZUZ1bmMuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVGdW5jIGV4dGVuZHMgTm9kZSB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1l
dGVycykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhp
cy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOwor
ICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0
aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdp
bigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJu
IHRydWU7IH0KKworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAibmF0aXZl
ICIgKyBzdXBlci50b1N0cmluZygpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvTmF0aXZlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVU
eXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVUeXBlIGV4
dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBpc1ByaW1pdGl2ZSwg
dHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9pc1ByaW1pdGl2ZSA9IGlz
UHJpbWl0aXZlOworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJz
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1bnIgdGhpcy5fb3JpZ2luOyB9
CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGlzUHJpbWl0
aXZlKCkgeyByZXR1cm4gdGhpcy5faXNQcmltaXRpdmU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRl
cnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCBpc05hdGl2ZSgp
IHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQor
ICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFt
ZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIg
b2YgdHlwZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICBpZiAoIXR5cGVB
cmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVy
biBuZXcgTmF0aXZlVHlwZUluc3RhbmNlKHRoaXMsIHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAg
ICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIm5hdGl2ZSAiICsgKHRo
aXMuaXNQcmltaXRpdmUgPyAicHJpbWl0aXZlICIgOiAiIikgKyAidHlwZSAiICsgdGhpcy5uYW1l
ICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTmF0aXZlVHlwZUluc3RhbmNlIGV4dGVuZHMgVHlwZSB7
CisgICAgY29uc3RydWN0b3IodHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRo
aXMuX3R5cGUgPSB0eXBlOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3Vt
ZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9
CisgICAgZ2V0IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9
CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5fdHlwZS5pc1ByaW1pdGl2ZTsg
fQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUlt
cGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICh0aGlzLnR5
cGUgIT0gb3RoZXIudHlwZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYg
KHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwg
dGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMu
dHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1
bWVudHNbaV0pKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMudHlwZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9Ob2RlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgTm9kZSB7CisgICAgdmlzaXQodmlzaXRvcikKKyAgICB7CisgICAgICAgIGxldCByZXR1cm5W
YWx1ZSA9IHZpc2l0b3JbInZpc2l0IiArIHRoaXMuY29uc3RydWN0b3IubmFtZV0odGhpcyk7Cisg
ICAgICAgIGlmICgicmV0dXJuVmFsdWUiIGluIHZpc2l0b3IpCisgICAgICAgICAgICByZXR1cm4g
dmlzaXRvci5yZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0K
KyAgICAKKyAgICB1bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAg
ICAgbGV0IHVuaWZ5VGhpcyA9IHRoaXMudW5pZnlOb2RlOworICAgICAgICBsZXQgdW5pZnlPdGhl
ciA9IG90aGVyLnVuaWZ5Tm9kZTsKKyAgICAgICAgaWYgKHVuaWZ5T3RoZXIudHlwZVZhcmlhYmxl
VW5pZnkodW5pZmljYXRpb25Db250ZXh0LCB1bmlmeVRoaXMpKQorICAgICAgICAgICAgcmV0dXJu
IHRydWU7CisgICAgICAgIHJldHVybiB1bmlmeVRoaXMudW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29u
dGV4dCwgdW5pZnlPdGhlcik7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlv
bkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKG90aGVyLnR5cGVWYXJpYWJsZVVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgdGhpcykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICAgICAgcmV0dXJuIHRoaXMgPT0gb3RoZXI7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJp
YWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgfQorICAgIAorICAgIGdldCB1bmlmeU5vZGUoKSB7IHJldHVybiB0aGlz
OyB9CisgICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBn
ZXQgaXNOYXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIGVxdWFscyhvdGhlcikK
KyAgICB7CisgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25D
b250ZXh0KCk7CisgICAgICAgIHJldHVybiB0aGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwg
b3RoZXIpICYmIHVuaWZpY2F0aW9uQ29udGV4dC5pc1VudW5pZmllZCgpOworICAgIH0KKyAgICAK
KyAgICBzdWJzdGl0dXRlKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLnZpc2l0KFN1YnN0aXR1dGlvbi5tYXBwaW5nKHBhcmFtZXRlcnMsIGFyZ3Vt
ZW50TGlzdCkpOworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihwYXJh
bWV0ZXJzLCB1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gc3Vic3Rp
dHV0ZShwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLm1hcCh0eXBlID0+IHVuaWZpY2F0aW9uQ29udGV4
dC5maW5kKHR5cGUpKSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTnVsbFR5
cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTnVsbFR5cGUuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTnVsbFR5cGUuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOdWxsVHlwZSBleHRlbmRzIFR5cGUgeworICAg
IC8vIEZJWE1FOiBUaGlzIHdpbGwgaGF2ZSB0byBiZWhhdmUgbGlrZSBhIHR5cGUgdmFyaWFibGUg
Zm9yIHRoZSBwdXJwb3NlcyBvZiB1bmlmaWNhdGlvbiwgc28gdGhhdAorICAgIC8vIGl0IGNhbiBi
ZSB1bmlmaWVkIHdpdGggYW55IHBvaW50ZXIgdHlwZS4gVGhlbiwgd2UgY2FuIGRvIGEgdmVyaWZp
Y2F0aW9uIGF0IHRoZSBlbmQgdG8gc2VlIGlmCisgICAgLy8gd2UgZ290IHVuaWZpZWQgd2l0aCBh
IHBvaW50ZXIgdHlwZS4KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2Mjkg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworZnVuY3Rpb24gcGFyc2UocHJvZ3JhbSwgb3JpZ2luLCBsaW5lTnVtYmVyT2Zmc2V0
LCB0ZXh0KQoreworICAgIGxldCBsZXhlciA9IG5ldyBMZXhlcihvcmlnaW4sIGxpbmVOdW1iZXJP
ZmZzZXQsIHRleHQpOworICAgIAorICAgIC8vIFRoZSBoYXJkZXN0IHBhcnQgb2YgZGVhbGluZyB3
aXRoIEMtbGlrZSBsYW5ndWFnZXMgaXMgcGFyc2luZyB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0
ZW1lbnRzLgorICAgIC8vIExldCdzIGNvbnNpZGVyIGlmIHRoaXMgaGFwcGVucyBpbiBBcnJheUxh
bmcuIEhlcmUgYXJlIHRoZSB2YWxpZCBzdGF0ZW1lbnRzIGluIEFycmF5TGFuZyB0aGF0CisgICAg
Ly8gYmVnaW4gd2l0aCBhbiBpZGVudGlmaWVyLCBpZiB3ZSBhc3N1bWUgdGhhdCBhbnkgZXhwcmVz
c2lvbiBjYW4gYmUgYSBzdGFuZGFsb25lIHN0YXRlbWVudC4KKyAgICAvLworICAgIC8vICAgICB4
OworICAgIC8vICAgICB4IDxiaW5vcD4geTsKKyAgICAvLyAgICAgeCA8IHk7CisgICAgLy8gICAg
IHggPCB5ID4gejsKKyAgICAvLyAgICAgeCA9IHk7CisgICAgLy8gICAgIHguZiA9IHk7CisgICAg
Ly8gICAgIFxleHAgPSB5OworICAgIC8vICAgICB4WzQyXSA9IHk7CisgICAgLy8gICAgIHgoKTsK
KyAgICAvLyAgICAgeDx5PigpOworICAgIC8vICAgICB4IHk7CisgICAgLy8gICAgIHg8eT4gejsK
KyAgICAvLyAgICAgZGV2aWNlIHhbXSB5OworICAgIC8vICAgICB4WzQyXSB5OworICAgIC8vICAg
ICBkZXZpY2UgeF4geTsKKyAgICAvLyAgICAgdGhyZWFkIHheXiB5OworICAgIC8vICAgICB4XnRo
cmVhZF50aHJlYWQgeTsKKyAgICAvLyAgICAgeF5kZXZpY2VedGhyZWFkIHk7CisgICAgLy8KKyAg
ICAvLyBUaGlzIGhhcyB0d28gcHJvYmxlbSBhcmVhczoKKyAgICAvLworICAgIC8vICAgICAtIHg8
eT56IGNhbiBwYXJzZSB0d28gZGlmZmVyZW50IHdheXMgKGFzICh4IDwgeSkgPiB6IG9yIHg8eT4g
eikuCisgICAgLy8gICAgIC0geFs0Ml0gY291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50
IG9yIGEgdmFyaWFibGUgZGVjbGFyYXRpb24uCisgICAgLy8gICAgIC0geDx5PiBjb3VsZCBiZWNv
bWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAv
LworICAgIC8vIFdlIHNvbHZlIHRoZSBmaXJzdCBwcm9ibGVtIGJ5IGZvcmJpZGRpbmcgZXhwcmVz
c2lvbnMgYXMgc3RhdGVtZW50cy4gVGhlIGxhY2sgb2YgZnVuY3Rpb24KKyAgICAvLyBwb2ludGVy
cyBtZWFucyB0aGF0IHdlIGNhbiBzdGlsbCBhbGxvdyBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudHMg
LSB1bmxpa2UgaW4gQywgdGhvc2UgY2Fubm90CisgICAgLy8gaGF2ZSBhcmJpdHJhcnkgZXhwcmVz
c2lvbnMgYXMgdGhlIGNhbGxlZS4gVGhlIHJlbWFpbmluZyB0d28gcHJvYmxlbXMgYXJlIHNvbHZl
ZCBieQorICAgIC8vIGJhY2t0cmFja2luZy4gSW4gYWxsIG90aGVyIHJlc3BlY3RzLCB0aGlzIGlz
IGEgc2ltcGxlIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4KKyAgICAKKyAgICBmdW5jdGlvbiBn
ZW5lcmljQ29uc3VtZShjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVy
Lm5leHQoKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVu
ZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrKHRva2VuKSkKKyAg
ICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50ZXh0ICsg
IjsgZXhwZWN0ZWQ6ICIgKyB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBjb25zdW1lKC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IGdlbmVyaWNDb25zdW1lKHRva2VuID0+IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gY29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAg
IHJldHVybiBnZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOworICAg
IH0KKyAgICAKKyAgICBmdW5jdGlvbiBhc3NlcnROZXh0KC4uLnRleHRzKQorICAgIHsKKyAgICAg
ICAgbGV4ZXIucHVzaChjb25zdW1lKC4uLnRleHRzKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIGdlbmVyaWNUZXN0KGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4
ZXIucGVlaygpOworICAgICAgICBpZiAodG9rZW4gJiYgY2FsbGJhY2sodG9rZW4pKQorICAgICAg
ICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gdGVzdCguLi50ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmlj
VGVzdCh0b2tlbiA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHRlc3RLaW5kKGtpbmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJp
Y1Rlc3QodG9rZW4gPT4gdG9rZW4ua2luZCA9PSBraW5kKTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gdHJ5Q29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0
ZXN0KC4uLnRleHRzKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5l
eHQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
dHJ5Q29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0S2lu
ZChraW5kKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQ
cm90b2NvbFJlZigpCisgICAgeworICAgICAgICBsZXQgcHJvdG9jb2xUb2tlbiA9IGNvbnN1bWVL
aW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xSZWYocHJvdG9j
b2xUb2tlbi5vcmlnaW4sIHByb3RvY29sVG9rZW4udGV4dCk7CisgICAgfQorICAgIAorICAgIGZ1
bmN0aW9uIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCkKKyAgICB7CisgICAgICAgIGxldCByaWdodFNo
aWZ0ID0gdHJ5Q29uc3VtZSgiPj4iKTsKKyAgICAgICAgaWYgKHJpZ2h0U2hpZnQpCisgICAgICAg
ICAgICBsZXhlci5wdXNoKG5ldyBMZXhlclRva2VuKGxleGVyLCByaWdodFNoaWZ0Lm9yaWdpbiwg
cmlnaHRTaGlmdC5pbmRleCwgcmlnaHRTaGlmdC5raW5kLCAiPiIpKTsKKyAgICAgICAgZWxzZQor
ICAgICAgICAgICAgY29uc3VtZSgiPiIpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJz
ZVR5cGVQYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICAgIGlmICghdGVzdCgiPCIpKQorICAgICAg
ICAgICAgcmV0dXJuIFtdOworICAgICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9IFtdOworICAg
ICAgICBjb25zdW1lKCI8Iik7CisgICAgICAgIHdoaWxlICghdGVzdCgiPiIpKSB7CisgICAgICAg
ICAgICBsZXQgY29uc3RleHByID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAg
ICAgICAgICAgICAgIGxldCB0eXBlID0gcGFyc2VUeXBlKCk7CisgICAgICAgICAgICAgICAgbGV0
IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgICAgIGFzc2Vy
dE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3Rl
eHByVHlwZVBhcmFtZXRlcih0eXBlLm9yaWdpbiwgbmFtZSwgdHlwZSk7CisgICAgICAgICAgICB9
KTsKKyAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1
c2goY29uc3RleHByKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBu
YW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgICAgICAgICBsZXQgcHJv
dG9jb2wgPSB0cnlDb25zdW1lKCI6IikgPyBwYXJzZVByb3RvY29sUmVmKCkgOiBudWxsOworICAg
ICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlVmFyaWFibGUobmFtZS5vcmlnaW4sIG5h
bWUudGV4dCwgcHJvdG9jb2wpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJ5
Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVGVybSgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47
CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIm51bGwiKSkKKyAgICAgICAgICAgIHJl
dHVybiBuZXcgTnVsbCh0b2tlbi5vcmlnaW4pOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25z
dW1lS2luZCgiaWRlbnRpZmllciIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVJl
Zih0b2tlbi5vcmlnaW4sIHRva2VuLnRleHQpOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25z
dW1lS2luZCgiaW50TGl0ZXJhbCIpKSB7CisgICAgICAgICAgICBsZXQgaW50VmVyc2lvbiA9IHRv
a2VuLnRleHQgfCAwOworICAgICAgICAgICAgaWYgKGludFZlcnNpb24gIT0gdG9rZW4udGV4dCkK
KyAgICAgICAgICAgICAgICBsZXhlci5mYWlsKCJJbnRlZ2VyIGxpdGVyYWwgaXMgbm90IDMyLWJp
dCBpbnRlZ2VyIik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwodG9rZW4ub3Jp
Z2luLCBpbnRWZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTogTmVlZCBzdXBw
b3J0IGZvciBmbG9hdCBsaXRlcmFscyBhbmQgcHJvYmFibHkgb3RoZXIgbGl0ZXJhbHMgdG9vLgor
ICAgICAgICB0b2tlbiA9IGNvbnN1bWVLaW5kKCJkb3VibGVMaXRlcmFsIik7CisgICAgICAgIHJl
dHVybiBuZXcgRG91YmxlTGl0ZXJhbCh0b2tlbi5vcmlnaW4sICt0b2tlbi50ZXh0KTsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDb25zdGV4cHIoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHBhcnNlVGVybSgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVBcmd1
bWVudHMoKQorICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8IikpCisgICAgICAgICAgICByZXR1
cm4gW107CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gW107CisgICAgICAgIGNvbnN1
bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+IikpIHsKKyAgICAgICAgICAgIC8vIEl0
J3MgcG9zc2libGUgZm9yIGEgY29uc3RleHByIG9yIHR5cGUgY2FuIHN5bnRhY3RpY2FsbHkgb3Zl
cmxhcCBpbiB0aGUgc2luZ2xlCisgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGNhc2UuIExldCdz
IGNvbnNpZGVyIHRoZSBwb3NzaWJpbGl0aWVzOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAg
IC8vICAgICBUICAgICAgICAgIGNvdWxkIGJlIHR5cGUgb3IgY29uc3RleHByCisgICAgICAgICAg
ICAvLyAgICAgVFtdICAgICAgICBvbmx5IHR5cGUKKyAgICAgICAgICAgIC8vICAgICBUWzQyXSAg
ICAgIG9ubHkgdHlwZSAoY29uc3RleHByIGNhbm5vdCBkbyBpbmRleGluZykKKyAgICAgICAgICAg
IC8vICAgICA0MiAgICAgICAgIG9ubHkgY29uc3RleHByCisgICAgICAgICAgICAvLworICAgICAg
ICAgICAgLy8gSW4gdGhlIGZ1dHVyZSB3ZSdsbCBhbGxvdyBjb25zdGV4cHJzIHRvIGRvIG1vcmUg
dGhpbmdzLCBhbmQgdGhlbiB3ZSdsbCBzdGlsbCBoYXZlCisgICAgICAgICAgICAvLyB0aGUgcHJv
YmxlbSB0aGF0IHNvbWV0aGluZyBvZiB0aGUgZm9ybSBUWzFdWzJdWzNdLi4uIGNhbiBlaXRoZXIg
YmUgYSB0eXBlIG9yIGEKKyAgICAgICAgICAgIC8vIGNvbnN0ZXhwciwgYW5kIHdlIGNhbiBmaWd1
cmUgb3V0IGluIHRoZSBjaGVja2VyIHdoaWNoIGl0IGlzLgorICAgICAgICAgICAgbGV0IHR5cGVP
clZhcmlhYmxlUmVmID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAg
ICAgICAgIGxldCByZXN1bHQgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAg
ICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgIHJldHVy
biBuZXcgVHlwZU9yVmFyaWFibGVSZWYocmVzdWx0Lm9yaWdpbiwgcmVzdWx0LnRleHQpOworICAg
ICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAodHlwZU9yVmFyaWFibGVSZWYpCisgICAgICAg
ICAgICAgICAgcmVzdWx0LnB1c2godHlwZU9yVmFyaWFibGVSZWYpOworICAgICAgICAgICAgZWxz
ZSB7CisgICAgICAgICAgICAgICAgbGV0IGNvbnN0ZXhwciA9IGxleGVyLmJhY2t0cmFja2luZ1Nj
b3BlKCgpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHBhcnNlQ29uc3Rl
eHByKCk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOwor
ICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0pOwor
ICAgICAgICAgICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAgICAgIHJlc3Vs
dC5wdXNoKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAg
ICAgIHJlc3VsdC5wdXNoKHBhcnNlVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9
CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7
CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlwZSgpCisgICAgeworICAgICAgICBs
ZXQgdG9rZW47CisgICAgICAgIGxldCBhZGRyZXNzU3BhY2U7CisgICAgICAgIGxldCBhZGRyZXNz
U3BhY2VDb25zdW1lZCA9IGZhbHNlOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKC4u
LmFkZHJlc3NTcGFjZXMpKQorICAgICAgICAgICAgYWRkcmVzc1NwYWNlID0gdG9rZW4udGV4dDsK
KyAgICAgICAgCisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsK
KyAgICAgICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5cGVBcmd1bWVudHMoKTsKKyAgICAg
ICAgbGV0IHR5cGUgPSBuZXcgVHlwZVJlZihuYW1lLm9yaWdpbiwgbmFtZS50ZXh0LCB0eXBlQXJn
dW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGZ1bmN0aW9uIGdldEFkZHJlc3NTcGFjZSgpCisg
ICAgICAgIHsKKyAgICAgICAgICAgIGFkZHJlc3NTcGFjZUNvbnN1bWVkID0gdHJ1ZTsKKyAgICAg
ICAgICAgIGlmIChhZGRyZXNzU3BhY2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3NT
cGFjZTsKKyAgICAgICAgICAgIHJldHVybiB0cnlDb25zdW1lKC4uLmFkZHJlc3NTcGFjZXMpOwor
ICAgICAgICB9CisgICAgICAgIAorICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1lKCJe
IiwgIlsiKSkgeworICAgICAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIl4iKSB7CisgICAgICAg
ICAgICAgICAgdHlwZSA9IG5ldyBQdHJUeXBlKHRva2VuLm9yaWdpbiwgZ2V0QWRkcmVzc1NwYWNl
KCksIHR5cGUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgCisgICAgICAgICAgICBpZiAodHJ5Q29uc3VtZSgiXSIpKSB7CisgICAgICAgICAg
ICAgICAgdHlwZSA9IG5ldyBBcnJheVJlZlR5cGUodG9rZW4ub3JpZ2luLCBnZXRBZGRyZXNzU3Bh
Y2UoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIHR5cGUgPSBuZXcgQXJyYXlUeXBlKHRva2VuLm9yaWdp
biwgdHlwZSwgcGFyc2VDb25zdGV4cHIoKSk7CisgICAgICAgICAgICBjb25zdW1lKCJdIik7Cisg
ICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChhZGRyZXNzU3BhY2UgJiYgIWFkZHJlc3NT
cGFjZUNvbnN1bWVkKQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiQWRkcmVzcyBzcGFjZSBzcGVj
aWZpZWQgZm9yIHR5cGUgdGhhdCBkb2VzIG5vdCBuZWVkIGFkZHJlc3Mgc3BhY2UiKTsKKyAgICAg
ICAgCisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJz
ZVR5cGVEZWYoKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInR5cGUiKS5v
cmlnaW47CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKS50ZXh0
OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7Cisg
ICAgICAgIGNvbnN1bWUoIj0iKTsKKyAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAg
ICAgICAgY29uc3VtZSgiOyIpOworICAgICAgICByZXR1cm4gbmV3IFR5cGVEZWYob3JpZ2luLCBu
YW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlTmF0aXZlKCkKKyAgICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1lKCJuYXRpdmUi
KS5vcmlnaW47CisgICAgICAgIGxldCBpc1R5cGUgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgo
KSA9PiB7CisgICAgICAgICAgICBpZiAodHJ5Q29uc3VtZSgidHlwZSIpKQorICAgICAgICAgICAg
ICAgIHJldHVybiAibm9ybWFsIjsKKyAgICAgICAgICAgIGNvbnN1bWUoInByaW1pdGl2ZSIpOwor
ICAgICAgICAgICAgY29uc3VtZSgidHlwZSIpOworICAgICAgICAgICAgcmV0dXJuICJwcmltaXRp
dmUiOworICAgICAgICB9KTsKKyAgICAgICAgaWYgKGlzVHlwZSkgeworICAgICAgICAgICAgbGV0
IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgbGV0IHBhcmFt
ZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBjb25zdW1lKCI7Iik7
CisgICAgICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5cGUob3JpZ2luLCBuYW1lLnRleHQsIGlz
VHlwZSA9PSAicHJpbWl0aXZlIiwgcGFyYW1ldGVycyk7CisgICAgICAgIH0KKyAgICAgICAgbGV0
IHJldHVyblR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgbGV0IG5hbWUgPSBwYXJzZUZ1bmNO
YW1lKCk7CisgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHBhcnNlVHlwZVBhcmFtZXRlcnMo
KTsKKyAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSBwYXJzZVBhcmFtZXRlcnMoKTsKKyAgICAgICAg
Y29uc3VtZSgiOyIpOworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZUZ1bmMob3JpZ2luLCBuYW1l
LCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycyk7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIGdlbmVyaWNQYXJzZUxlZnQodGV4dHMsIG5leHRQYXJzZXIsIGNvbnN0cnVj
dG9yKQorICAgIHsKKyAgICAgICAgbGV0IGxlZnQgPSBuZXh0UGFyc2VyKCk7CisgICAgICAgIGxl
dCB0b2tlbjsKKyAgICAgICAgd2hpbGUgKHRva2VuID0gdHJ5Q29uc3VtZSguLi50ZXh0cykpCisg
ICAgICAgICAgICBsZWZ0ID0gY29uc3RydWN0b3IodG9rZW4sIGxlZnQsIG5leHRQYXJzZXIoKSk7
CisgICAgICAgIHJldHVybiBsZWZ0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUxl
ZnRPcGVyYXRvckNhbGwodGV4dHMsIG5leHRQYXJzZXIpCisgICAgeworICAgICAgICByZXR1cm4g
Z2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAgICAgIHRleHRzLCBuZXh0UGFyc2VyLAorICAgICAg
ICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkgPT4KKyAgICAgICAgICAgICAgICBuZXcgQ2FsbEV4
cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3IiICsgdG9rZW4udGV4dCwgW10sIFtsZWZ0
LCByaWdodF0pKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDYWxsRXhwcmVzc2lv
bigpCisgICAgeworICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7
CisgICAgICAgIGxldCB0eXBlQXJndW1lbnRzID0gcGFyc2VUeXBlQXJndW1lbnRzKCk7CisgICAg
ICAgIGNvbnN1bWUoIigiKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50TGlzdCA9IFtdOworICAgICAg
ICB3aGlsZSAoIXRlc3QoIikiKSkgeworICAgICAgICAgICAgYXJndW1lbnRMaXN0LnB1c2gocGFy
c2VFeHByZXNzaW9uKCkpOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgiKSIpOworICAg
ICAgICByZXR1cm4gbmV3IENhbGxFeHByZXNzaW9uKG5hbWUub3JpZ2luLCBuYW1lLCB0eXBlQXJn
dW1lbnRzLCBhcmd1bWVudExpc3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBv
c3NpYmxlU3VmZml4KCkKKyAgICB7CisgICAgICAgIGxldCBzaW1wbGVDYXNlID0gbGV4ZXIuYmFj
a3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgbGV0IGxlZnQgPSBwYXJzZVRlcm0o
KTsKKyAgICAgICAgICAgIGxldCB0b2tlbjsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbiA9IHRy
eUNvbnN1bWUoIisrIiwgIi0tIiwgIi4iLCAiLT4iLCAiWyIpKSB7CisgICAgICAgICAgICAgICAg
c3dpdGNoICh0b2tlbi50ZXh0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAiKysiOgorICAgICAg
ICAgICAgICAgIGNhc2UgIi0tIjoKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBTdWZm
aXhDYWxsQXNzaWdubWVudCh0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBs
ZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAi
LiI6CisgICAgICAgICAgICAgICAgY2FzZSAiLT4iOgorICAgICAgICAgICAgICAgICAgICBpZiAo
dG9rZW4udGV4dCA9PSAiLT4iKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBE
ZXJlZmVyZW5jZUV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0KTsKKyAgICAgICAgICAgICAg
ICAgICAgbGVmdCA9IG5ldyBEb3RFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgbGVmdCwgY29uc3Vt
ZUtpbmQoImlkZW50aWZpZXIiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgIGNhc2UgIlsiOiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHBh
cnNlRXhwcmVzc2lvbigpOworICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCJdIik7CisgICAg
ICAgICAgICAgICAgICAgIGxlZnQgPSBuZXcgSW5kZXhFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwg
bGVmdCwgaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAg
ICB9CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cg
bmV3IEVycm9yKCJCYWQgdG9rZW46ICIgKyB0b2tlbik7CisgICAgICAgICAgICAgICAgfQorICAg
ICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CisgICAgICAgIH0pOworICAgICAg
ICBpZiAoc2ltcGxlQ2FzZSkKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVDYXNlOworICAgICAg
ICAKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2FsbEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVByZWZpeCgpCisgICAgeworICAgICAgICBsZXQgdG9r
ZW47CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIisrIiwgIi0tIiwgIisiLCAiLSIs
ICIhIiwgIn4iKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQodG9rZW4u
b3JpZ2luLCAib3BlcmF0b3IiICsgdG9rZW4udGV4dCwgcGFyc2VQb3NzaWJsZVByZWZpeCgpKTsK
KyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiXiIpKQorICAgICAgICAgICAgcmV0dXJu
IG5ldyBEZXJlZmVyZW5jZUV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBwYXJzZVBvc3NpYmxlUHJl
Zml4KCkpOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJcXCIpKQorICAgICAgICAg
ICAgcmV0dXJuIG5ldyBNYWtlUHRyRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2li
bGVQcmVmaXgoKSk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIiYiKSkKKyAgICAg
ICAgICAgIHJldHVybiBuZXcgTWFrZUFycmF5UmVmRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBh
cnNlUG9zc2libGVQcmVmaXgoKSk7CisgICAgICAgIHJldHVybiBwYXJzZVBvc3NpYmxlU3VmZml4
KCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVQcm9kdWN0KCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyIqIiwgIi8iLCAiJSJd
LCBwYXJzZVBvc3NpYmxlUHJlZml4KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQ
b3NzaWJsZVN1bSgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxs
KFsiKyIsICItIl0sIHBhcnNlUG9zc2libGVQcm9kdWN0KTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gcGFyc2VQb3NzaWJsZVNoaWZ0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxl
ZnRPcGVyYXRvckNhbGwoWyI8PCIsICI+PiJdLCBwYXJzZVBvc3NpYmxlU3VtKTsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxJbmVxdWFsaXR5KCkKKyAg
ICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyI8IiwgIj4iLCAiPD0i
LCAiPT4iXSwgcGFyc2VQb3NzaWJsZVNoaWZ0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
cGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxFcXVhbGl0eSgpCisgICAgeworICAgICAgICByZXR1cm4g
Z2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAgICAgIFsiPT0iLCAiIT0iXSwgcGFyc2VQb3NzaWJs
ZVJlbGF0aW9uYWxJbmVxdWFsaXR5LAorICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkg
PT4geworICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Npb24odG9r
ZW4ub3JpZ2luLCAib3BlcmF0b3I9PSIsIFtdLCBbbGVmdCwgcmlnaHRdKTsKKyAgICAgICAgICAg
ICAgICBpZiAodG9rZW4udGV4dCA9PSAiIT0iKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQg
PSBuZXcgQ2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3IhIiwgW10sIFtyZXN1
bHRdKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7Cisg
ICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlQW5kKCkKKyAgICB7
CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyImIl0sIHBhcnNlUG9zc2li
bGVSZWxhdGlvbmFsRXF1YWxpdHkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBv
c3NpYmxlQml0d2lzZVhvcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0
b3JDYWxsKFsiXiJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZUFuZCk7CisgICAgfQorICAgIAorICAg
IGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlT3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbInwiXSwgcGFyc2VQb3NzaWJsZUJpdHdpc2VYb3IpOwor
ICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lvbih0ZXh0
cywgbmV4dFBhcnNlcikKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljUGFyc2VMZWZ0KAor
ICAgICAgICAgICAgdGV4dHMsIG5leHRQYXJzZXIsCisgICAgICAgICAgICAodG9rZW4sIGxlZnQs
IHJpZ2h0KSA9PiBuZXcgTG9naWNhbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCB0b2tlbi50ZXh0
LCBsZWZ0LCByaWdodCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxl
TG9naWNhbEFuZCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0TG9naWNhbEV4cHJl
c3Npb24oWyImJiJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZU9yKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUxvZ2ljYWxPcigpCisgICAgeworICAgICAgICByZXR1cm4g
cGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24oWyJ8fCJdLCBwYXJzZVBvc3NpYmxlTG9naWNhbEFu
ZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVUZXJuYXJ5Q29uZGl0
aW9uYWwoKQorICAgIHsKKyAgICAgICAgbGV0IHByZWRpY2F0ZSA9IHBhcnNlUG9zc2libGVMb2dp
Y2FsT3IoKTsKKyAgICAgICAgbGV0IG9wZXJhdG9yID0gdHJ5Q29uc3VtZSgiPyIpOworICAgICAg
ICBpZiAoIW9wZXJhdG9yKQorICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZTsKKyAgICAgICAg
cmV0dXJuIG5ldyBUZXJuYXJ5RXhwcmVzc2lvbihvcGVyYXRvci5vcmlnaW4sIHByZWRpY2F0ZSwg
cGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSwgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSk7Cisg
ICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KG1vZGUpCisg
ICAgeworICAgICAgICBsZXQgbGhzID0gcGFyc2VQb3NzaWJsZVRlcm5hcnlDb25kaXRpb25hbCgp
OworICAgICAgICBsZXQgb3BlcmF0b3IgPSB0cnlDb25zdW1lKCI9IiwgIis9IiwgIi09IiwgIio9
IiwgIi89IiwgIiU9IiwgIl49IiwgInw9IiwgIiY9Iik7CisgICAgICAgIGlmICghb3BlcmF0b3Ip
IHsKKyAgICAgICAgICAgIGlmIChtb2RlID09ICJyZXF1aXJlZCIpCisgICAgICAgICAgICAgICAg
bGV4ZXIuZmFpbCgiRXhwZWN0ZWQgYXNzaWdubWVudCIpOworICAgICAgICAgICAgcmV0dXJuIGxo
czsKKyAgICAgICAgfQorICAgICAgICBpZiAob3BlcmF0b3IudGV4dCA9PSAiPSIpCisgICAgICAg
ICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQob3BlcmF0b3Iub3JpZ2luLCBsaHMsIHBhcnNlUG9z
c2libGVBc3NpZ25tZW50KCkpOworICAgICAgICBsZXQgbmFtZSA9ICJvcGVyYXRvciIgKyBvcGVy
YXRvci50ZXh0LnN1YnN0cmluZygwLCB0ZXJtLm9wZXJhdG9yLmxlbmd0aCAtIDEpOworICAgICAg
ICByZXR1cm4gbmV3IENhbGxBc3NpZ25tZW50KG9wZXJhdG9yLm9yaWdpbiwgbmFtZSwgbGhzLCBw
YXJzZVBvc3NpYmxlQXNzaWdubWVudCgpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFy
c2VBc3NpZ25tZW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZVBvc3NpYmxlQXNzaWdu
bWVudCgicmVxdWlyZWQiKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VFZmZlY3Rm
dWxFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIGxldCBhc3NpZ25tZW50ID0gbGV4ZXIuYmFj
a3RyYWNraW5nU2NvcGUocGFyc2VBc3NpZ25tZW50KTsKKyAgICAgICAgaWYgKGFzc2lnbm1lbnQp
CisgICAgICAgICAgICByZXR1cm4gYXNzaWdubWVudDsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2Fs
bEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gZ2VuZXJpY1BhcnNlQ29t
bWFFeHByZXNzaW9uKGZpbmFsRXhwcmVzc2lvblBhcnNlcikKKyAgICB7CisgICAgICAgIGxldCBs
aXN0ID0gW107CisgICAgICAgIGxldCBvcmlnaW4gPSBsZXhlci5wZWVrKCk7CisgICAgICAgIGlm
ICghb3JpZ2luKQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiVW5leHBlY3RlZCBlbmQgb2YgZmls
ZSIpOworICAgICAgICBvcmlnaW4gPSBvcmlnaW4ub3JpZ2luOworICAgICAgICBmb3IgKDs7KSB7
CisgICAgICAgICAgICBsZXQgZWZmZWN0ZnVsRXhwcmVzc2lvbiA9IGxleGVyLmJhY2t0cmFja2lu
Z1Njb3BlKHBhcnNlRWZmZWN0ZnVsRXhwcmVzc2lvbik7CisgICAgICAgICAgICBpZiAoIWVmZmVj
dGZ1bEV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgICAgICBsaXN0LnB1c2goZmluYWxFeHByZXNz
aW9uUGFyc2VyKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICAgICAgbGlzdC5wdXNoKGVmZmVjdGZ1bEV4cHJlc3Npb24pOworICAgICAgICAgICAgaWYg
KCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgcmV0dXJuIG5ldyBDb21tYUV4cHJlc3Npb24ob3JpZ2luLCBsaXN0KTsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VDb21tYUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIGdlbmVyaWNQYXJzZUNvbW1hRXhwcmVzc2lvbihwYXJzZVBvc3NpYmxlQXNzaWdubWVu
dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbigpCisgICAgewor
ICAgICAgICByZXR1cm4gcGFyc2VDb21tYUV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VFZmZlY3RmdWxTdGF0ZW1lbnQoKQorICAgIHsKKyAgICAgICAgbGV0IHJl
c3VsdCA9IGdlbmVyaWNQYXJzZUNvbW1hRXhwcmVzc2lvbihwYXJzZUVmZmVjdGZ1bEV4cHJlc3Np
b24pOworICAgICAgICBjb25zdW1lKCI7Iik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUmV0dXJuKCkKKyAgICB7CisgICAgICAgIGNvbnN1
bWUoInJldHVybiIpOworICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uKCk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlU3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGxldCB0
b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIjsiKSB7Cisg
ICAgICAgICAgICBsZXhlci5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAg
ICAgfQorICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAicmV0dXJuIikKKyAgICAgICAgICAgIHJl
dHVybiBwYXJzZVJldHVybigpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiYnJlYWsiKQor
ICAgICAgICAgICAgcmV0dXJuIHBhcnNlQnJlYWsoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQg
PT0gImNvbnRpbnVlIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUNvbnRpbnVlKCk7CisgICAg
ICAgIGlmICh0b2tlbi50ZXh0ID09ICJ3aGlsZSIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VX
aGlsZSgpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiZG8iKQorICAgICAgICAgICAgcmV0
dXJuIHBhcnNlRG8oKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImZvciIpCisgICAgICAg
ICAgICByZXR1cm4gcGFyc2VGb3IoKTsKKyAgICAgICAgbGV0IHZhcmlhYmxlRGVjbCA9IGxleGVy
LmJhY2t0cmFja2luZ1Njb3BlKHBhcnNlVmFyaWFibGVEZWNsKTsKKyAgICAgICAgaWYgKHZhcmlh
YmxlRGVjbCkKKyAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZURlY2w7CisgICAgICAgIHJldHVy
biBwYXJzZUVmZmVjdGZ1bFN0YXRlbWVudCgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZUJsb2NrKCkKKyAgICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1lKCJ7Iikub3Jp
Z2luOworICAgICAgICBsZXQgYmxvY2sgPSBuZXcgQmxvY2sob3JpZ2luKTsKKyAgICAgICAgd2hp
bGUgKCF0ZXN0KCJ9IikpIHsKKyAgICAgICAgICAgIGxldCBzdGF0ZW1lbnQgPSBwYXJzZVN0YXRl
bWVudCgpOworICAgICAgICAgICAgaWYgKHN0YXRlbWVudCkKKyAgICAgICAgICAgICAgICBibG9j
ay5wdXNoKHN0YXRlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgifSIpOworICAg
ICAgICByZXR1cm4gYmxvY2s7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUGFyYW1l
dGVycygpCisgICAgeworICAgICAgICBjb25zdW1lKCIoIik7CisgICAgICAgIGxldCBwYXJhbWV0
ZXJzID0gW107CisgICAgICAgIHdoaWxlICghdGVzdCgiKSIpKSB7CisgICAgICAgICAgICBwYXJh
bWV0ZXJzLnB1c2gocGFyc2VQYXJhbWV0ZXIoKSk7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1
bWUoIiwiKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25z
dW1lKCIpIik7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgIH0KKyAgICAKKyAgICBm
dW5jdGlvbiBwYXJzZUZ1bmNOYW1lKCkKKyAgICB7CisgICAgICAgIGlmICh0cnlDb25zdW1lKCJv
cGVyYXRvciIpKSB7CisgICAgICAgICAgICBsZXQgdG9rZW4gPSBjb25zdW1lKCIrIiwgIi0iLCAi
KiIsICIvIiwgIiUiLCAiXiIsICImIiwgInwiLCAiPCIsICI+IiwgIjw9IiwgIj49IiwgIiEiLCAi
PT0iLCAiKysiLCAiLS0iLCAiXFwiKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi50ZXh0ICE9ICJc
XCIpCisgICAgICAgICAgICAgICAgcmV0dXJuICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0OworICAg
ICAgICAgICAgY29uc3VtZSgiWyIpOworICAgICAgICAgICAgY29uc3VtZSgiXSIpOworICAgICAg
ICAgICAgcmV0dXJuICJvcGVyYXRvclxcW10iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBj
b25zdW1lS2luZCgiaWRlbnRpZmllciIpLnRleHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IHBhcnNlRnVuY0RlZigpCisgICAgeworICAgICAgICBsZXQgcmV0dXJuVHlwZSA9IHBhcnNlVHlw
ZSgpOworICAgICAgICBsZXQgbmFtZSA9IHBhcnNlRnVuY05hbWUoKTsKKyAgICAgICAgbGV0IHR5
cGVQYXJhbWV0ZXJzID0gcGFyc2VUeXBlUGFyYW1ldGVycygpOworICAgICAgICBsZXQgcGFyYW1l
dGVycyA9IHBhcnNlUGFyYW1ldGVycygpOworICAgICAgICBsZXQgYmxvY2sgPSBwYXJzZUJsb2Nr
KCk7CisgICAgICAgIHJldHVybiBuZXcgRnVuY0RlZihyZXR1cm5UeXBlLm9yaWdpbiwgbmFtZSwg
cmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMsIGJvZHkpOworICAgIH0KKyAg
ICAKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAg
ICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHRva2Vu
LnRleHQgPT0gIjsiKQorICAgICAgICAgICAgbGV4ZXIubmV4dCgpOworICAgICAgICBlbHNlIGlm
ICh0b2tlbi50ZXh0ID09ICJ0eXBlIikKKyAgICAgICAgICAgIHBhcnNlVHlwZURlZigpOworICAg
ICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJuYXRpdmUiKQorICAgICAgICAgICAgcGFyc2VO
YXRpdmUoKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAic3RydWN0IikKKyAgICAg
ICAgICAgIHBhcnNlU3RydWN0VHlwZSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09
ICJlbnVtIikKKyAgICAgICAgICAgIHBhcnNlRW51bSgpOworICAgICAgICBlbHNlIGlmICh0b2tl
bi50ZXh0ID09ICJwcm90b2NvbCIpCisgICAgICAgICAgICBwYXJzZVByb3RvY29sRGVjbCgpOwor
ICAgICAgICBlbHNlCisgICAgICAgICAgICBwYXJzZUZ1bmNEZWYoKTsKKyAgICB9Cit9CisKSW5k
ZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ByZXBhcmUuanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvUHJlcGFyZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Q
cmVwYXJlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24g
cHJlcGFyZShvcmlnaW4sIGxpbmVOdW1iZXJPZmZzZXQsIHRleHQpCit7CisgICAgbGV0IHByb2dy
YW0gPSBuZXcgUHJvZ3JhbSgpOworICAgIHBhcnNlKHByb2dyYW0sICI8c3RkbGliPiIsIDI4LCBz
dGFuZGFyZExpYnJhcnkpOworICAgIHBhcnNlKHByb2dyYW0sIG9yaWdpbiwgbGluZU51bWJlck9m
ZnNldCwgdGV4dCk7CisgICAgcmVzb2x2ZU5hbWVzKHByb2dyYW0pOworICAgIHJlc29sdmVUeXBl
RGVmcyhwcm9ncmFtKTsKKyAgICBjaGVjayhwcm9ncmFtKTsKKyAgICBpbmxpbmUocHJvZ3JhbSk7
CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dy
YW0uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgeworICAgIGNv
bnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50cyA9IFtd
OworICAgICAgICB0aGlzLl9mdW5jdGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5
cGVzID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9mdW5jSW5zdGFudGlhdG9yID0gbmV3IEZ1
bmNJbnN0YW50aWF0b3IoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHRvcExldmVsU3RhdGVtZW50
cygpIHsgcmV0dXJuIHRoaXMuX3RvcExldmVsU3RhdGVtZW50czsgfQorICAgIGdldCBmdW5jdGlv
bnMoKSB7IHJldHVybiB0aGlzLl9mdW5jdGlvbnM7IH0KKyAgICBnZXQgdHlwZXMoKSB7IHJldHVy
biB0aGlzLl90eXBlczsgfQorICAgIGdldCBmdW5jSW5zdGFudGlhdG9yKCkgeyByZXR1cm4gdGhp
cy5fZnVuY0luc3RhbnRpYXRvcjsgfQorICAgIAorICAgIGFkZFRvcExldmVsU3RhdGVtZW50KHN0
YXRlbWVudCkKKyAgICB7CisgICAgICAgIHN0YXRlbWVudC5wcm9ncmFtID0gdGhpczsKKyAgICAg
ICAgaWYgKHN0YXRlbWVudCBpbnN0YW5jZW9mIEZ1bmMpIHsKKyAgICAgICAgICAgIGxldCBhcnJh
eSA9IHRoaXMuX2Z1bmN0aW9ucy5nZXQoc3RhdGVtZW50Lm5hbWUpOworICAgICAgICAgICAgaWYg
KCFhcnJheSkKKyAgICAgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbnMuc2V0KHN0YXRlbWVudC5u
YW1lLCBhcnJheSA9IFtdKTsKKyAgICAgICAgICAgIGFycmF5LnB1c2goc3RhdGVtZW50KTsKKyAg
ICAgICAgfSBlbHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAg
dGhpcy5fdHlwZXMuc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNl
CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlv
biBvciB0eXBlOiAiICsgc3RhdGVtZW50KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1l
bnRzLnB1c2goc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVzb2x2ZUZ1bmNPdmVybG9h
ZChuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKQorICAgIHsKKyAgICAgICAgbGV0
IGZ1bmN0aW9ucyA9IHRoaXMuZnVuY3Rpb25zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFmdW5j
dGlvbnMpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHJldHVy
biByZXNvbHZlT3ZlcmxvYWRJbXBsKGZ1bmN0aW9ucywgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRU
eXBlcyk7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAg
ICBsZXQgcmVzdWx0ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHN0YXRl
bWVudCBvZiB0aGlzLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQo
c3RhdGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1Byb3RvY29sLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3Rv
Y29sLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9j
b2wgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgewor
ICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9
CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGtpbmQoKSB7
IHJldHVybiBQcm90b2NvbDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJv
dG9jb2xEZWNsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVj
bC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xEZWNs
IGV4dGVuZHMgUHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7
CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbmFtZSkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9
IFtdOworICAgICAgICB0aGlzLl9zaWduYXR1cmVNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRo
aXMuX3R5cGVWYXJpYWJsZSA9IG5ldyBUeXBlVmFyaWFibGUob3JpZ2luLCBuYW1lLCBudWxsKTsK
KyAgICB9CisgICAgCisgICAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAgICAg
IC8vIE5PVEU6IEFueSB0eXBlIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIHNpZ25hdHVyZSBtdXN0
IGJlIGluZmVyYWJsZSBmcm9tIHRoZSB2YWx1ZQorICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAg
ICAgICAvLyBGSVhNRTogQ2hlY2sgdGhpcyEgKE9PUFMhKQorICAgICAgICB0aGlzLl9zaWduYXR1
cmVzLnB1c2goc2lnbmF0dXJlKTsKKyAgICAgICAgbGV0IG92ZXJsb2FkcyA9IHRoaXMuX3NpZ25h
dHVyZU1hcC5nZXQoc2lnbmF0dXJlLm5hbWUpOworICAgICAgICBpZiAoIW92ZXJsb2FkcykKKyAg
ICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZU1hcC5zZXQoc2lnbmF0dXJlLm5hbWUsIG92ZXJsb2Fk
cyA9IFtdKTsKKyAgICAgICAgb3ZlcmxvYWRzLnB1c2goc2lnbmF0dXJlKTsKKyAgICB9CisgICAg
CisgICAgZ2V0IHNpZ25hdHVyZXMoKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVzOyB9CisgICAg
c2lnbmF0dXJlc0J5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVNYXAuZ2V0KG5h
bWUpOyB9CisgICAgZ2V0IHR5cGVWYXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGVWYXJpYWJs
ZTsgfQorICAgIAorICAgIHNpZ25hdHVyZXNCeU5hbWVXaXRoVHlwZVZhcmlhYmxlKG5hbWUsIHR5
cGVWYXJpYWJsZSkKKyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3Rp
dHV0aW9uKFt0aGlzLnR5cGVWYXJpYWJsZV0sIFt0eXBlVmFyaWFibGVdKTsKKyAgICAgICAgbGV0
IHJlc3VsdCA9IHRoaXMuc2lnbmF0dXJlc0J5TmFtZShuYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1
bHQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAo
c2lnbmF0dXJlID0+IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICB9CisgICAg
CisgICAgaW5oZXJpdHMob3RoZXJQcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghb3RoZXJQ
cm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYg
KG90aGVyUHJvdG9jb2wgaW5zdGFuY2VvZiBQcm90b2NvbFJlZikKKyAgICAgICAgICAgIG90aGVy
UHJvdG9jb2wgPSBvdGhlclByb3RvY29sLnByb3RvY29sRGVjbDsKKyAgICAgICAgCisgICAgICAg
IGZvciAobGV0IG90aGVyU2lnbmF0dXJlIG9mIG90aGVyUHJvdG9jb2wuc2lnbmF0dXJlcykgewor
ICAgICAgICAgICAgbGV0IHNpZ25hdHVyZXMgPSB0aGlzLnNpZ25hdHVyZXNCeU5hbWUob3RoZXJT
aWduYXR1cmUubmFtZSk7CisgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgbGV0IG92ZXJsb2FkID0gcmVzb2x2ZU92
ZXJsb2FkSW1wbChzaWduYXR1cmVzLCBbXSwgb3RoZXJTaWduYXR1cmUucGFyYW1ldGVyVHlwZXMp
OworICAgICAgICAgICAgaWYgKCFvdmVybG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisgICAgICAgICAgICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0KKyAgICAgICAgICAg
ICAgICBvdmVybG9hZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisg
ICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5p
ZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBl
LmVxdWFscyhvdGhlclNpZ25hdHVyZS5yZXR1cm5UeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1
cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAor
ICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBTdWJz
dGl0dXRpb24ubWFwcGluZyhbdGhpcy5fdHlwZVZhcmlhYmxlXSwgW3R5cGVdKTsKKyAgICAgICAg
Zm9yIChsZXQgYWJzdHJhY3RTaWduYXR1cmUgb2YgdGhpcy5fc2lnbmF0dXJlcykgeworICAgICAg
ICAgICAgbGV0IHNpZ25hdHVyZSA9IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pOworICAg
ICAgICAgICAgbGV0IG92ZXJsb2FkID0gdGhpcy5wcm9ncmFtLnJlc29sdmVGdW5jT3ZlcmxvYWQo
c2lnbmF0dXJlLm5hbWUsIFtdLCBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAgICAg
ICAgaWYgKCFvdmVybG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPSBvdmVybG9hZC5m
dW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAg
b3ZlcmxvYWQuZnVuYy50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0
KTsKKyAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhzaWduYXR1
cmUucmV0dXJuVHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAg
eworICAgICAgICByZXR1cm4gInByb3RvY29sICIgKyB0aGlzLm5hbWUgKyAiIHsgIiArIHRoaXMu
c2lnbmF0dXJlcy5qb2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQorCisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1Byb3RvY29sUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL1Byb3RvY29sUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1By
b3RvY29sUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
UHJvdG9jb2xSZWYgZXh0ZW5kcyBQcm90b2NvbCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBu
YW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luLCBuYW1lKTsKKyAgICAgICAgdGhpcy5w
cm90b2NvbERlY2wgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBpbmhlcml0cyhvdGhlcikKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVjbC5pbmhlcml0cyhvdGhlcik7Cisg
ICAgfQorICAgIAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
LnByb3RvY29sRGVjbC5oYXNIZWlyKHR5cGUpOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1B0clR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlw
ZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHRyVHlwZSBleHRlbmRzIFJl
ZmVyZW5jZVR5cGUgeworICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQor
ICAgIHsKKyAgICAgICAgaWYgKCFvdGhlciBpbnN0YW5jZW9mIFB0clR5cGUpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzU3BhY2UgKyAiICIg
KyB0aGlzLmVsZW1lbnRUeXBlICsgIl4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvUmVmZXJlbmNlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9S
ZWZlcmVuY2VUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVy
ZW5jZVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBS
ZWZlcmVuY2VUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBhZGRy
ZXNzU3BhY2UsIGVsZW1lbnRUeXBlKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVBZGRyZXNzU3Bh
Y2UoYWRkcmVzc1NwYWNlKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAg
ICB0aGlzLl9hZGRyZXNzU3BhY2UgPSBhZGRyZXNzU3BhY2U7CisgICAgICAgIHRoaXMuX2VsZW1l
bnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJl
dHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgYWRkcmVzc1NwYWNlKCkgeyByZXR1cm4gdGhp
cy5fYWRkcmVzc1NwYWNlOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5f
ZWxlbWVudFR5cGU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQor
CisgICAgZ2V0IHNpemUoKSB7IHJldHVybiAxOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1Jlc29sdmVOYW1lcy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNv
bHZlTmFtZXMuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU5h
bWVzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcmVz
b2x2ZU5hbWVzKHByb2dyYW0pCit7CisgICAgcHJvZ3JhbS52aXNpdChuZXcgTmFtZVJlc29sdmVy
KCkpOworfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU92ZXJsb2FkSW1wbC5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlT3ZlcmxvYWRJbXBsLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVPdmVybG9hZEltcGwuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitmdW5jdGlvbiByZXNvbHZlT3Zl
cmxvYWRJbXBsKGZ1bmN0aW9ucywgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcykKK3sKKyAg
ICBmb3IgKGxldCBmdW5jIG9mIGZ1bmN0aW9ucykgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50
cy5sZW5ndGggJiYgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gZnVuYy50eXBlUGFyYW1ldGVycy5s
ZW5ndGgpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGFyZ3VtZW50VHlwZXMu
bGVuZ3RoICE9IGZ1bmMucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQo
ZnVuYy50eXBlUGFyYW1ldGVycyk7CisgICAgICAgIGxldCBvayA9IHRydWU7CisgICAgICAgIGZv
ciAobGV0IGkgPSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAg
ICAgbGV0IGFyZ3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpXTsKKyAgICAgICAgICAgIGxldCBwYXJh
bWV0ZXIgPSBmdW5jLnR5cGVQYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgaWYgKCFhcmd1bWVu
dC51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHBhcmFtZXRlcikpIHsKKyAgICAgICAgICAgICAg
ICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAg
ICAgICB9CisgICAgICAgIGlmICghb2spCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
Zm9yIChsZXQgaSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAg
ICAgICBpZiAoIWFyZ3VtZW50VHlwZXNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBmdW5j
LnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlm
ICghb2spCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCF1bmlmaWNhdGlvbkNv
bnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbGV0IHNob3Vs
ZEJ1aWxkVHlwZUFyZ3VtZW50cyA9ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgaWYg
KHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBb
XTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBmdW5jLnR5cGVQYXJhbWV0ZXJz
KSB7CisgICAgICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdW5pZmljYXRpb25Db250ZXh0LmZp
bmQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50ID09IHR5cGVQ
YXJhbWV0ZXIpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAg
IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFy
Z3VtZW50cykKKyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnB1c2godHlwZUFyZ3VtZW50
KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgY29udGludWU7Cisg
ICAgICAgIHJldHVybiB7ZnVuYywgdW5pZmljYXRpb25Db250ZXh0LCB0eXBlQXJndW1lbnRzfTsK
KyAgICB9CisgICAgCisgICAgcmV0dXJuIG51bGw7Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9SZXNvbHZlVHlwZURlZnMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmVz
b2x2ZVR5cGVEZWZzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29s
dmVUeXBlRGVmcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0
aW9uIHJlc29sdmVUeXBlRGVmcyhwcm9ncmFtKQoreworICAgIHByb2dyYW0udmlzaXQobmV3IFR5
cGVEZWZSZXNvbHZlcigpKTsKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBSZXR1cm4gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOwor
ICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2lu
KCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhp
cy5fdmFsdWU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4g
InsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0KK307CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybkV4Y2VwdGlvbi5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9SZXR1cm5FeGNlcHRpb24uanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuRXhjZXB0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV0dXJuRXhjZXB0aW9uIHsKKyAgICBjb25zdHJ1Y3Rv
cih2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAg
IAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9SZXdyaXRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRl
ci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXdyaXRl
ciB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwcGluZyA9IG5l
dyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgX21hcChvbGRJdGVtLCBuZXdJdGVtKQorICAgIHsK
KyAgICAgICAgdGhpcy5fbWFwcGluZy5zZXQob2xkSXRlbSwgbmV3SXRlbSk7CisgICAgICAgIHJl
dHVybiBuZXdJdGVtOworICAgIH0KKyAgICAKKyAgICBfZ2V0TWFwcGluZyhvbGRJdGVtKQorICAg
IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX21hcHBpbmcuZ2V0KG9sZEl0ZW0pOworICAg
ICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0
dXJuIG9sZEl0ZW07CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIG5ldyBGdW5jKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnJldHVy
blR5cGUudmlzaXQodGhpcyksCisgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0
eXBlUGFybWV0ZXIgPT4gdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBu
b2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAg
ICBsZXQgcmVzdWx0ID0gbmV3IEZ1bmNQYXJhbWV0ZXIobm9kZS5uYW1lLCBub2RlLnR5cGUudmlz
aXQodGhpcykpOworICAgICAgICB0aGlzLl9tYXAobm9kZSwgcmVzdWx0KTsKKyAgICAgICAgcmVz
dWx0LmxWYWx1ZSA9IG5vZGUubFZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0K
KyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0g
bmV3IEJsb2NrKG5vZGUub3JpZ2luKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5v
ZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50LnZpc2l0KHRo
aXMpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90
b2NvbFJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAor
ICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBU
eXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodHlw
ZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSkpOworICAgICAgICByZXN1bHQu
dHlwZSA9IG5vZGUudHlwZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBuZXcgQ29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlLm9yaWdpbiwg
bm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkKG5vZGUub3JpZ2lu
LCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZp
c2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBub2RlLmNv
bnN0cnVjdG9yKG5vZGUucm9naWluLCBub2RlLmFkZHJlc3NTcGFjZSwgbm9kZS5lbGVtZW50VHlw
ZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFy
cmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheVR5cGUobm9kZS5v
cmlnaW4sIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVu
dChub2RlLm9yaWdpbiwgbm9kZS5saHMudmlzaXQodGhpcyksIG5vZGUucmhzLnZpc2l0KHRoaXMp
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAg
ICAgbm9kZS52YXJpYWJsZSA9IHRoaXMuX2dldE1hcHBpbmcobm9kZS52YXJpYWJsZSk7CisgICAg
ICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4obm9kZS5vcmlnaW4sIG5vZGUudmFsdWUgPyBu
b2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAgIAorICAgIHZpc2l0SW50
TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAg
dmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5l
dyBDYWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgIG5vZGUub3JpZ2luLCBub2RlLm5hbWUsCisg
ICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJn
dW1lbnQudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5hcmd1bWVudGxpc3QubWFwKGFy
Z3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgICAgIGxldCBhY3R1YWxUeXBl
QXJndW1lbnRzID0gbm9kZS5hY3R1YWxUeXBlQXJndW1lbnRzOworICAgICAgICBpZiAoYWN0dWFs
VHlwZUFyZ3VtZW50cykgeworICAgICAgICAgICAgcmVzdWx0LmFjdHVhbFR5cGVBcmd1bWVudHMg
PQorICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVBcmd1bWVudHMubWFwKGFjdHVhbFR5cGVBcmd1
bWVudCA9PiBhY3R1YWxUeXBlQXJndW1lbnQudmlzaXQodGhpcykpOworICAgICAgICB9CisgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rpb25MaWtlQmxv
Y2sobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25MaWtlQmxvY2soCisg
ICAgICAgICAgICBub2RlLm9yaWdpbiwKKyAgICAgICAgICAgIG5vZGUuYXJndW1lbnRMaXN0Lm1h
cChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBh
cmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpLAorICAgICAg
ICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1N0YW5kYXJkTGlicmFyeS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9TdGFuZGFyZExpYnJhcnkuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvU3RhbmRhcmRMaWJyYXJ5LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworLy8gTk9URTogVGhlIG5leHQgbGluZSBpcyBsaW5lIDI4LCBhbmQgd2UgcmVseSBvbiB0aGlz
IGluIFByZXBhcmUuanMuCitjb25zdCBzdGFuZGFyZExpYnJhcnkgPSBgCisvLyBUaGlzIGlzIHRo
ZSBBcnJheUxhbmcgc3RhbmRhcmQgbGlicmFyeS4gSW1wbGVtZW50YXRpb25zIG9mIGFsbCBvZiB0
aGVzZSB0aGluZ3MgYXJlIGluCisvLyBJbnRyaW5zaWNzLmpzLgorCisvLyBOZWVkIHRvIGJvb3Rz
dHJhcCB2b2lkIGZpcnN0LgorbmF0aXZlIHByaW1pdGl2ZSB0eXBlIHZvaWQ7CituYXRpdmUgcHJp
bWl0aXZlIHR5cGUgaW50MzI7Cit0eXBlIGludCA9IGludDMyOworCituYXRpdmUgaW50IG9wZXJh
dG9yKyhpbnQsIGludCk7CitgOwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdHJ1Y3RUeXBlIGV4dGVuZHMgVHlwZSB7Cisg
ICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycykKKyAgICB7CisgICAg
ICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7Cisg
ICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHRo
aXMuX2ZpZWxkcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgYWRkKGZpZWxkKQorICAg
IHsKKyAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcy5oYXMoZmllbGQubmFtZSkpCisgICAgICAgICAg
ICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IoZmllbGQub3JpZ2luLm9yaWdpblN0cmluZywgIkR1cGxp
Y2F0ZSBmaWVsZCBuYW1lOiAiICsgZmllbGQubmFtZSk7CisgICAgICAgIHRoaXMuX2ZpZWxkcy5z
ZXQoZmllbGQubmFtZSwgZmllbGQpOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0
dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlz
Ll90eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAgIGdldCBmaWVsZE5hbWVzKCkgeyByZXR1cm4g
dGhpcy5fZmllbGRzLmtleXMoKTsgfQorICAgIGZpZWxkQnlOYW1lKG5hbWUpIHsgcmV0dXJuIHRo
aXMuX2ZpZWxkcy5nZXQobmFtZSk7IH0KKyAgICBnZXQgZmllbGRzKCkgeyByZXR1cm4gdGhpcy5f
ZmllbGRzLnZhbHVlcygpOyB9CisgICAgZ2V0IGZpZWxkTWFwKCkgeyByZXR1cm4gdGhpcy5fZmll
bGRzOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQg
PSB0cnVlOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxkcykKKyAgICAgICAg
ICAgIHJlc3VsdCAmPSBmaWVsZC50eXBlLmlzUHJpbWl0aXZlOworICAgICAgICByZXR1cm4gcmVz
dWx0OworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZUNvbnRleHQoKQorICAgIHsKKyAgICAgICAg
bGV0IHJlc3VsdCA9IG5ldyBOYW1lQ29udGV4dCgpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFy
YW1ldGVyIG9mIHRoaXMudHlwZVBhcmFtZXRlcnMpCisgICAgfQorICAgIAorICAgIGluc3RhbnRp
YXRlKHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5n
dGggIT0gdGhpcy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcg
QUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIldyb25nIG51bWJlciBvZiB0eXBlIGFy
Z3VtZW50cyB0byBpbnN0YW50aWF0aW9uIik7CisgICAgICAgIAorICAgICAgICBsZXQgbmFtZUNv
bnRleHQgPSBuZXcgTmFtZUNvbnRleHQoKTsKKyAgICAgICAgCisgICAgICAgIGxldCBzdWJzdGl0
dXRpb24gPSBTdWJzdGl0dXRpb24ubWFwcGluZyh0aGlzLnR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJn
dW1lbnRzKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTdHJ1Y3RUeXBlKHRoaXMub3JpZ2lu
LCB0aGlzLm5hbWUsIFtdKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2YgdGhpcy5maWVsZHMp
CisgICAgICAgICAgICByZXN1bHQuYWRkKGZpZWxkLnZpc2l0KHN1YnN0aXR1dGlvbikpOworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgewor
ICAgICAgICByZXR1cm4gInN0cnVjdCAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlUGFy
YW1ldGVycyArICI+IHsgIiArIEFycmF5LmZyb20odGhpcy5maWVsZHMpLmpvaW4oIjsgIikgKyAi
OyB9IjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN1YnN0aXR1dGlvbiBleHRlbmRzIFJld3Jp
dGVyIHsKKyAgICBjb25zdHJ1Y3RvcihtYXApCisgICAgeworICAgICAgICB0aGlzLl9tYXAgPSBt
YXA7CisgICAgfQorICAgIAorICAgIHN0YXRpYyBtYXBwaW5nKHBhcmFtZXRlcnMsIGFyZ3VtZW50
TGlzdCkKKyAgICB7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzLmxlbmd0aCAhPSBhcmd1bWVudExp
c3QubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXJhbWV0ZXJzIGFuZCBh
cmd1bWVudHMgYXJlIG1pc21hdGNoZWQiKTsKKyAgICAgICAgbGV0IG1hcCA9IG5ldyBNYXAoKTsK
KyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgKytpKQorICAg
ICAgICAgICAgbWFwLnNldChwYXJhbWV0ZXJzW2ldLCBhcmd1bWVudExpc3RbaV0pOworICAgICAg
ICByZXR1cm4gbmV3IFN1YnN0aXR1dGlvbihtYXApOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5
cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHRoaXMuX21hcC5n
ZXQobm9kZS50eXBlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50KSB7CisgICAgICAgICAgICBp
ZiAobm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoIlVuZXhwZWN0ZWQgdHlwZSBhcmd1bWVudHMgb24gdHlwZSB2YXJpYWJsZSIpOworICAg
ICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICByZXR1cm4gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgIH0KKworICAgIHZpc2l0VmFy
aWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHRoaXMuX21h
cC5nZXQobm9kZS52YXJpYWJsZSk7CisgICAgICAgIGlmIChyZXBsYWNlbWVudCkKKyAgICAgICAg
ICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiBzdXBlci52
aXNpdFZhcmlhYmxlUmVmKG5vZGUpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBTdWZmaXhDYWxsQXNzaWdubWVudCBleHRlbmRzIEV4cHJlc3Npb24g
eworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgbGhzKQorICAgIHsKKyAgICAgICAgc3Vw
ZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX2xo
cyA9IGxoczsKKyAgICAgICAgdGhpcy5mdW5jID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGxocygpIHsgcmV0dXJuIHRo
aXMuX2xoczsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLmxocyArICIgc3VmZml4ICIgKyB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9UeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5
cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkod29ya2lu
ZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGUgZXh0ZW5kcyBOb2RlIHsK
KyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiBbXTsgfQorICAgIGdldCBraW5kKCkg
eyByZXR1cm4gVHlwZTsgfQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHByb3RvY29sLmhhc0hlaXIodGhpcyk7CisgICAgfQorICAgIAorICAgIGdl
dCBpbnN0YW50aWF0ZWRUeXBlKCkgeyByZXR1cm4gdGhpczsgfQorICAgIAorICAgIGdldCB3aXRo
UmVjdXJzaXZlbHlJbnN0YW50aWF0ZWRJbW1lZGlhdGVzKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLnZpc2l0KG5ldyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMoKSk7CisgICAgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVEZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZURlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5
cGVEZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVQ
YXJhbWV0ZXJzLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOwor
ICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMg
PSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAg
IAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFt
ZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJl
dHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhp
cy5fdHlwZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmUmVzb2x2ZXIu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZlJlc29sdmVyLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWZSZXNvbHZlci5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVEZWZSZXNvbHZlciBl
eHRlbmRzIFZpc2l0b3IgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMu
X3Zpc2l0aW5nID0gbmV3IFZpc2l0aW5nU2V0KCk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlw
ZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fdmlzaXRpbmcuZG9WaXNpdChub2RlLCAo
KSA9PiB7CisgICAgICAgICAgICBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgICAgICAg
ICBpZiAobm9kZS50eXBlIGluc3RhbmNlb2YgVHlwZURlZikgeworICAgICAgICAgICAgICAgIGxl
dCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KG5vZGUudHlwZS50
eXBlUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5s
ZW5ndGggIT0gbm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAg
ICAgICAgdGhyb3cgbmV3IEVycm9yKCJhcmd1bWVudC9wYXJhbWV0ZXIgbWlzbWF0Y2ggKHNob3Vs
ZCBoYXZlIGJlZW4gY2F1Z2h0IGVhcmxpZXIpIik7CisgICAgICAgICAgICAgICAgZm9yIChsZXQg
aSA9IDA7IGkgPCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICAg
ICAgICAgIG5vZGUudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG5v
ZGUudHlwZS50eXBlUGFyYW1ldGVyc1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKCF1bmlmaWNh
dGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5
cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUeXBlIHJlZmVyZW5jZSB0byBhIHR5
cGUgZGVmaW5pdGlvbiB2aW9sYXRlcyBwcm90b2NvbCBjb25zdHJhaW50cyIpOworICAgICAgICAg
ICAgICAgIAorICAgICAgICAgICAgICAgIGxldCBuZXdUeXBlID0gbm9kZS50eXBlLnN1YnN0aXR1
dGVUb1VuaWZpY2F0aW9uKG5vZGUudHlwZS50eXBlUGFyYW1ldGVycywgdW5pZmljYXRpb25Db250
ZXh0KTsKKyAgICAgICAgICAgICAgICBuZXdUeXBlLnZpc2l0KHRoaXMpOworICAgICAgICAgICAg
ICAgIG5vZGUuc2V0VHlwZUFuZEFyZ3VlbW50cyhuZXdUeXBlLCBbXSk7CisgICAgICAgICAgICB9
CisgICAgICAgIH0pOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZh
cmlhYmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlh
YmxlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlh
YmxlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlw
ZU9yVmFyaWFibGVSZWYgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5h
bWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMu
X25hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhp
cy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisKKyAg
ICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30K
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvVHlwZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9UeXBlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IFR5cGVSZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5
cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAg
ICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgICAg
ICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAg
c3RhdGljIHdyYXAodHlwZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlwZVJl
Zih0eXBlLm9yaWdpbiwgdHlwZS5uYW1lLCBbXSk7CisgICAgICAgIHJlc3VsdC50eXBlID0gdHlw
ZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgCisgICAgZ2V0IG9yaWdpbigpIHsg
cmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFt
ZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50
czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHR5cGUgPyB0eXBlLmlzUHJpbWl0
aXZlIDogZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy50eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOworICAg
IH0KKyAgICAKKyAgICBnZXQgdW5pZnlOb2RlKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50
eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUudW5pZnlO
b2RlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwb3B1bGF0ZURlZmF1bHRW
YWx1ZShidWZmZXIsIG9mZnNldCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1l
bnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUucG9wdWxhdGVEZWZhdWx0
VmFsdWUoYnVmZmVyLCBvZmZzZXQpOworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBn
ZXQgZGVmYXVsdCB2YWx1ZSBvZiBhIHR5cGUgaW5zdGFudGlhdGlvbiIpOworICAgIH0KKyAgICAK
KyAgICBnZXQgc2l6ZSgpCisgICAgeworICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50cy5s
ZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlLnNpemU7CisgICAgICAgIHRocm93
IG5ldyBFcnJvcigiQ2Fubm90IGdldCBzaXplIG9mIGEgdHlwZSBpbnN0YW50aWF0aW9uIik7Cisg
ICAgfQorICAgIAorICAgIHNldFR5cGVBbmRBcmd1bWVudHModHlwZSwgdHlwZUFyZ3VtZW50cykK
KyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSB0eXBlLm5hbWU7CisgICAgICAgIHRoaXMudHlw
ZSA9IHR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOwor
ICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAg
ICB7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVHlwZVJlZikpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9u
Q29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IGlmICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVu
Z3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGxldCBpID0gMDsg
aSA8IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCF0
aGlzLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBl
QXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzLm5hbWU7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5
cGVBcmd1bWVudHMgKyAiPiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9U
eXBlVmFyaWFibGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlh
YmxlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVWYXJpYWJs
ZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgcHJvdG9jb2wp
CisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25h
bWUgPSBuYW1lOworICAgICAgICB0aGlzLl9wcm90b2NvbCA9IHByb3RvY29sOworICAgIH0KKyAg
ICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgcHJvdG9j
b2woKSB7IHJldHVybiB0aGlzLl9wcm90b2NvbDsgfQorICAgIAorICAgIGdldCBpc1ByaW1pdGl2
ZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fcHJvdG9jb2wgJiYgdGhpcy5fcHJvdG9j
b2wuaXNQcmltaXRpdmU7CisgICAgfQorICAgIAorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0
dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAg
IGlmICghcHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCF0
aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4g
dGhpcy5wcm90b2NvbC5pbmhlcml0cyhwcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHR5cGVW
YXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBp
ZiAoIShvdGhlciBpbnN0YW5jZW9mIFR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAg
ICAgICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMu
dW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICB1bmlm
aWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsK
KyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNv
bnRleHQsIG90aGVyKTsKKyAgICB9CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNh
dGlvbkNvbnRleHQpCisgICAgeworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNv
bnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgCisgICAgICAgIC8vIFRoZSB0aGluZyB3ZSBnZXQg
dW5pZmllZCB3aXRoIG11c3QgYmUgYSB0eXBlIHZhcmlhYmxlIHRoYXQgYWNjZXB0cyBhIGJyb2Fk
ZXIgc2V0IG9mCisgICAgICAgIC8vIHRoaW5ncyB0aGFuIHdlIGRvLgorICAgICAgICBpZiAoIShy
ZWFsVGhpcyBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgCisgICAgICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJl
dHVybiAhcmVhbFRoaXMucHJvdG9jb2w7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5w
cm90b2NvbC5pbmhlcml0cyhyZWFsVGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHZl
cmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmICgh
dGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4g
dW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcykuaW5oZXJpdHModGhpcy5wcm90b2NvbCk7Cisg
ICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5h
bWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRl
eHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4
dC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBVbmlmaWNh
dGlvbkNvbnRleHQgeworICAgIGNvbnN0cnVjdG9yKHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSBuZXcgU2V0KHR5cGVQYXJhbWV0ZXJzKTsKKyAg
ICAgICAgdGhpcy5fbmV4dE1hcCA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgdW5pb24o
YSwgYikKKyAgICB7CisgICAgICAgIGEgPSBmaW5kKGEpOworICAgICAgICBiID0gZmluZChiKTsK
KyAgICAgICAgaWYgKGEgPT0gYikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAg
ICAgIGlmICghYi5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBhXTsKKyAg
ICAgICAgaWYgKCFhLmlzVW5pZmlhYmxlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJD
YW5ub3QgdW5pZnkgbm9uLXVuaWZpYWJsZSB0aGluZ3MgIiArIGEgKyAiIGFuZCAiICsgYik7Cisg
ICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0eXBlIHBhcmFtZXRlcnMgZG9uJ3Qg
ZW5kIHVwIGJlaW5nIHJvb3RzLgorICAgICAgICBpZiAoYS5pc1VuaWZpYWJsZSAmJiBiLmlzVW5p
ZmlhYmxlICYmIHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhhcyhiKSkKKyAgICAgICAgICAgIFthLCBi
XSA9IFtiLCBhXTsKKworICAgICAgICB0aGlzLl9uZXh0TWFwLnNldChhLCBiKTsKKyAgICB9Cisg
ICAgCisgICAgZmluZChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9k
ZTsKKyAgICAgICAgbGV0IG5leHROb2RlID0gdGhpcy5fbmV4dE1hcC5nZXQoY3VycmVudE5vZGUp
OworICAgICAgICBpZiAoIW5leHROb2RlKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2Rl
OworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IG5leHROb2Rl
OworICAgICAgICAgICAgbmV4dE5vZGUgPSB0aGlzLl9uZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7
CisgICAgICAgICAgICBpZiAoIW5leHROb2RlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAg
ICAgICB9CisgICAgICAgIHRoaXMuX25leHRNYXAuc2V0KG5vZGUsIGN1cnJlbnROb2RlKTsKKyAg
ICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOworICAgIH0KKyAgICAKKyAgICBnZXQgbm9kZXMoKQor
ICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBTZXQoKTsKKyAgICAgICAgZm9yIChsZXQg
W2tleSwgdmFsdWVdIG9mIHRoaXMuX25leHRNYXApIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQo
a2V5KTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQodmFsdWUpOworICAgICAgICB9CisgICAgICAg
IHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZlcmlmeSgpCisgICAgeworICAgICAg
ICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMuX3R5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICBpZiAoIXR5cGVQYXJhbWV0ZXIudmVyaWZ5QXNQYXJhbWV0ZXIodGhpcykpCisgICAg
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAobGV0IHR5
cGVBcmd1bWVudCBvZiB0aGlzLm5vZGVzKSB7CisgICAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVu
dC5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlm
ICh0aGlzLl90eXBlUGFyYW1ldGVycy5oYXModHlwZUFyZ3VtZW50KSkKKyAgICAgICAgICAgICAg
ICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghdHlwZUFyZ3VtZW50LnZlcmlmeUFzQXJndW1l
bnQodGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAg
ICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICBpc1VudW5pZmllZCgpCisgICAgewor
ICAgICAgICByZXR1cm4gIXRoaXMuX25leHRNYXAuc2l6ZSgpOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvVmFsdWUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWYWx1ZSBleHRlbmRz
IE5vZGUgeworICAgIGdldCBraW5kKCkgeyByZXR1cm4gVmFsdWU7IH0KKyAgICBnZXQgaXNDb25z
dGV4cHIoKSB7IHJldHVybiBmYWxzZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9W
YXJpYWJsZVJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJl
Zi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhcmlhYmxlUmVmIGV4
dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsK
KyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAg
ICAgIHRoaXMudmFyaWFibGUgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsg
cmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0aGlz
LnZhcmlhYmxlLmlzQ29uc3RleHByOyB9CisgICAgZ2V0IHVuaWZ5Tm9kZSgpIHsgcmV0dXJuIHRo
aXMudmFyaWFibGUudW5pZnlOb2RlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9WaXNpdGluZ1NldC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WaXNpdGlu
Z1NldC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9WaXNpdGluZ1NldC5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZpc2l0aW5nU2V0
IHsKKyAgICBjb25zdHJ1Y3RvciguLi5pdGVtcykKKyAgICB7CisgICAgICAgIHRoaXMuX3NldCA9
IG5ldyBTZXQoaXRlbXMpOworICAgIH0KKyAgICAKKyAgICBkb1Zpc2l0KGl0ZW0sIGNhbGxiYWNr
KQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3NldC5oYXMoaXRlbSkpCisgICAgICAgICAgICB0
aHJvdyBuZXcgQUxUeXBlRXJyb3IoaXRlbS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiUmVjdXJzaXZl
ICIgKyBpdGVtLmtpbmQpOworICAgICAgICB0aGlzLl9zZXQuYWRkKGl0ZW0pOworICAgICAgICB0
cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAgICAgIH0gZmluYWxseSB7
CisgICAgICAgICAgICB0aGlzLl9zZXQuZGVsZXRlKGl0ZW0pOworICAgICAgICB9CisgICAgfQor
fQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1Zpc2l0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgVmlzaXRvciB7CisgICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBmb3Ig
KGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICBz
dGF0ZW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQor
ICAgIHsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KHRoaXMpOworICAgICAgICBmb3Ig
KGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0
eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Yg
bm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEZ1bmNQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5v
ZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jRGVmKG5vZGUp
CisgICAgeworICAgICAgICB2aXNpdEZ1bmMobm9kZSk7CisgICAgICAgIG5vZGUuYm9keS52aXNp
dCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXROYXRpdmVGdW5jKG5vZGUpCisgICAgewor
ICAgICAgICB2aXNpdEZ1bmMobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QmxvY2sobm9k
ZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnN0YXRlbWVudHMp
CisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZp
c2l0UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9j
b2xEZWNsKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5z
aWduYXR1cmVzKQorICAgICAgICAgICAgc2lnbmF0dXJlLnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVB
cmd1bWVudCBvZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1lbnQu
dmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0TmF0aXZlVHlwZShub2RlKQorICAg
IHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtdGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMp
CisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0
ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlz
aXQodGhpcyk7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFy
YW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVy
LnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiBub2RlLmZpZWxkcykKKyAg
ICAgICAgICAgIGZpZWxkLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVW
YXJpYWJsZShub2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRDb25zdGV4cHJUeXBl
UGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0RmllbGQobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlw
ZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRFbGVtZW50YWxUeXBlKG5vZGUp
CisgICAgeworICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFB0clR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVt
ZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlwZShub2Rl
KQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgfQor
ICAgIAorICAgIHZpc2l0QXJyYXlUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0
RWxlbWVudGFsVHlwZShub2RlKTsKKyAgICAgICAgbm9kZS5udW1FbGVtZW50cy52aXNpdCh0aGlz
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAgICAg
ICBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9kZS5yaHMudmlzaXQodGhpcyk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgfQorICAg
IAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICBpZiAobm9kZS52YWx1ZSkK
KyAgICAgICAgICAgIG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZp
c3RJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHBy
ZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9k
ZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOwor
ICAgICAgICBmb3IgKGxldCBhcmd1bWVudCBvZiBub2RlLmFyZ3VtZW50TGlzdCkKKyAgICAgICAg
ICAgIGFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9u
TGlrZUJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBhcmd1bWVudCBvZiBub2Rl
LmFyZ3VtZW50TGlzdCkKKyAgICAgICAgICAgIGFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgICAg
ICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFy
YW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICBub2RlLmJvZHkudmlzaXQodGhpcyk7CisgICAg
fQorfQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319259</attachid>
            <date>2017-08-29 10:43:12 -0700</date>
            <delta_ts>2017-08-29 11:44:16 -0700</delta_ts>
            <desc>starting to debug</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>213223</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLm1lc3NhZ2Ug
PSBtZXNzYWdlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJy
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQUxUeXBlRXJyb3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBTFR5cGVFcnJvciBleHRlbmRzIEVy
cm9yIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAg
ICAgICBzdXBlcigiVHlwZSBlcnJvciBhdCAiICsgb3JpZ2luU3RyaW5nICsgIjogIiArIG1lc3Nh
Z2UpOworICAgICAgICB0aGlzLm9yaWdpblN0cmluZyA9IG9yaWdpblN0cmluZzsKKyAgICAgICAg
dGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FkZHJlc3NTcGFjZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BZGRy
ZXNzU3BhY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1Nw
YWNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgYWRkcmVz
c1NwYWNlcyA9IFsiY29uc3RhbnQiLCAiZGV2aWNlIiwgInRocmVhZGdyb3VwIiwgInRocmVhZCJd
OworCitmdW5jdGlvbiBpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpCit7CisgICAgc3dpdGNo
IChhZGRyZXNzU3BhY2UpIHsKKyAgICBjYXNlICJjb25zdGFudCI6CisgICAgY2FzZSAiZGV2aWNl
IjoKKyAgICBjYXNlICJ0aHJlYWRncm91cCI6CisgICAgY2FzZSAidGhyZWFkIjoKKyAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0K
K30KKworZnVuY3Rpb24gdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKQoreworICAg
IGlmICghaXNBZGRyZXNzU3BhY2UoYWRkcmVzc1NwYWNlKSkKKyAgICAgICAgdGhyb3cgbmV3IEVy
cm9yKCJCYWQgYWRkcmVzcyBzcGFjZTogIiArIGFkZHJlc3NTcGFjZSk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BbGwuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQWxs
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FsbC5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitsb2FkKCJOb2RlLmpzIik7Citsb2FkKCJUeXBl
LmpzIik7Citsb2FkKCJSZWZlcmVuY2VUeXBlLmpzIik7Citsb2FkKCJWYWx1ZS5qcyIpOworbG9h
ZCgiRXhwcmVzc2lvbi5qcyIpOworbG9hZCgiUmV3cml0ZXIuanMiKTsKK2xvYWQoIlZpc2l0b3Iu
anMiKTsKK2xvYWQoIkVWYWx1ZS5qcyIpOworCitsb2FkKCJBTFN5bnRheEVycm9yLmpzIik7Cits
b2FkKCJBTFR5cGVFcnJvci5qcyIpOworbG9hZCgiQWRkcmVzc1NwYWNlLmpzIik7Citsb2FkKCJB
cnJheVJlZlR5cGUuanMiKTsKK2xvYWQoIkFycmF5VHlwZS5qcyIpOworbG9hZCgiQXNzaWdubWVu
dC5qcyIpOworbG9hZCgiQmxvY2suanMiKTsKK2xvYWQoIkNhbGxBc3NpZ25tZW50LmpzIik7Cits
b2FkKCJDYWxsRXhwcmVzc2lvbi5qcyIpOworbG9hZCgiQ2FsbEZ1bmN0aW9uLmpzIik7Citsb2Fk
KCJDaGVjay5qcyIpOworbG9hZCgiQ2hlY2tlci5qcyIpOworbG9hZCgiQ29tbWFFeHByZXNzaW9u
LmpzIik7Citsb2FkKCJDb25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzIik7Citsb2FkKCJFQnVmZmVy
LmpzIik7Citsb2FkKCJFQnVmZmVyQnVpbGRlci5qcyIpOworbG9hZCgiRUZsb2F0LmpzIik7Cits
b2FkKCJFSW50LmpzIik7Citsb2FkKCJFUHRyLmpzIik7Citsb2FkKCJFdmFsdWF0aW9uQ29tbW9u
LmpzIik7Citsb2FkKCJFdmFsdWF0b3IuanMiKTsKK2xvYWQoIkZpZWxkLmpzIik7Citsb2FkKCJG
dW5jLmpzIik7Citsb2FkKCJGdW5jRGVmLmpzIik7Citsb2FkKCJGdW5jSW5zdGFudGlhdG9yLmpz
Iik7Citsb2FkKCJGdW5jUGFyYW1ldGVyLmpzIik7Citsb2FkKCJGdW5jU2lnbmF0dXJlLmpzIik7
Citsb2FkKCJGdW5jdGlvbkxpa2VCbG9jay5qcyIpOworbG9hZCgiSW5saW5lLmpzIik7Citsb2Fk
KCJJbmxpbmVyLmpzIik7Citsb2FkKCJJbnN0YW50aWF0ZUltbWVkaWF0ZXMuanMiKTsKK2xvYWQo
IkludExpdGVyYWwuanMiKTsKK2xvYWQoIkludHJpbnNpY3MuanMiKTsKK2xvYWQoIkxleGVyLmpz
Iik7Citsb2FkKCJMZXhlclRva2VuLmpzIik7Citsb2FkKCJOYW1lQ29udGV4dC5qcyIpOworbG9h
ZCgiTmFtZVJlc29sdmVyLmpzIik7Citsb2FkKCJOYXRpdmVGdW5jLmpzIik7Citsb2FkKCJOYXRp
dmVUeXBlLmpzIik7Citsb2FkKCJOYXRpdmVUeXBlSW5zdGFuY2UuanMiKTsKK2xvYWQoIk51bGxU
eXBlLmpzIik7Citsb2FkKCJQYXJzZS5qcyIpOworbG9hZCgiUHJlcGFyZS5qcyIpOworbG9hZCgi
UHJvZ3JhbS5qcyIpOworbG9hZCgiUHJvdG9jb2wuanMiKTsKK2xvYWQoIlByb3RvY29sRGVjbC5q
cyIpOworbG9hZCgiUHJvdG9jb2xSZWYuanMiKTsKK2xvYWQoIlB0clR5cGUuanMiKTsKK2xvYWQo
IlJlc29sdmVOYW1lcy5qcyIpOworbG9hZCgiUmVzb2x2ZU92ZXJsb2FkSW1wbC5qcyIpOworbG9h
ZCgiUmVzb2x2ZVR5cGVEZWZzLmpzIik7Citsb2FkKCJSZXR1cm4uanMiKTsKK2xvYWQoIlJldHVy
bkV4Y2VwdGlvbi5qcyIpOworbG9hZCgiU3RhbmRhcmRMaWJyYXJ5LmpzIik7Citsb2FkKCJTdHJ1
Y3RUeXBlLmpzIik7Citsb2FkKCJTdWJzdGl0dXRpb24uanMiKTsKK2xvYWQoIlN1ZmZpeENhbGxB
c3NpZ25tZW50LmpzIik7Citsb2FkKCJUeXBlRGVmLmpzIik7Citsb2FkKCJUeXBlRGVmUmVzb2x2
ZXIuanMiKTsKK2xvYWQoIlR5cGVPclZhcmlhYmxlUmVmLmpzIik7Citsb2FkKCJUeXBlUmVmLmpz
Iik7Citsb2FkKCJUeXBlVmFyaWFibGUuanMiKTsKK2xvYWQoIlVuaWZpY2F0aW9uQ29udGV4dC5q
cyIpOworbG9hZCgiVmFyaWFibGVSZWYuanMiKTsKK2xvYWQoIlZpc2l0aW5nU2V0LmpzIik7Cklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKKy8vIE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFz
IFRbY10gZm9yIGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1
YWdlLgorY2xhc3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5p
ZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShv
dGhlciBpbnN0YW5jZW9mIEFycmF5UmVmVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVy
IGluc3RhbmNlb2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICBpZiAodGhpcy5hZGRyZXNzU3BhY2UgIT0gInRocmVhZCIpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1l
bnRUeXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAg
IH0KKworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NT
cGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL0FycmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9B
cnJheVR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBB
cnJheVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRU
eXBlLCBudW1FbGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsK
KyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5f
bnVtRWxlbWVudHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigp
IHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJu
IHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhp
cy5fbnVtRWxlbWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVs
ZW1lbnRUeXBlLmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsg
Il0iOworICAgIH0KKyAgICAKKyAgICBnZXQgc2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5lbGVtZW50VHlwZS5zaXplICogdGhpcy5udW1FbGVtZW50czsKKyAgICB9CisgICAgCisg
ICAgdW5pZnlJbXBsKHVuaWZpY2F0b25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlm
IChvdGhlciBpbnN0YW5jZW9mIEFycmF5UmVmVHlwZSkgeworICAgICAgICAgICAgaWYgKG90aGVy
LmFkZHJlc3NTcGFjZSAhPSAidGhyZWFkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEFy
cmF5VHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisg
ICAgICAgICAgICBpZiAoIXRoaXMubnVtRWxlbWVudHMudW5pZnkodW5pZmljYXRpb25Db250ZXh0
LCBvdGhlci5udW1FbGVtZW50cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAg
ICAgICB9CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1
bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9Cit9CisKSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvQXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9Bc3NpZ25tZW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xh
c3MgQXNzaWdubWVudCBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdp
biwgbGhzLCByaHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlz
Ll9saHMgPSBsaHM7CisgICAgICAgIHRoaXMuX3JocyA9IHJoczsKKyAgICB9CisgICAgCisgICAg
Z2V0IGxocygpIHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0
aGlzLl9yaHM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5saHMgKyAiID0gIiArIHRoaXMucmhzOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0Jsb2NrLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2Nr
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQmxvY2sgZXh0ZW5kcyBOb2RlIHsK
KyAgICBjb25zdHJ1Y3RvcihvcmlnaW4pCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX3N0YXRlbWVudHMgPSBbXTsKKyAgICB9CisgICAgCisgICAg
Z2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIAorICAgIGFkZChzdGF0
ZW1lbnQpCisgICAgeworICAgICAgICB0aGlzLl9zdGF0ZW1lbnRzLnB1c2goc3RhdGVtZW50KTsK
KyAgICB9CisgICAgCisgICAgZ2V0IHN0YXRlbWVudHMoKSB7IHJldHVybiB0aGlzLl9zdGF0ZW1l
bnRzOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJ7ICIg
KyB0aGlzLnN0YXRlbWVudHMuam9pbigiOyAiKTsgKyAiOyB9IjsKKyAgICB9Cit9OworCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9DYWxsQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9DYWxsQXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9DYWxsQXNzaWdubWVudC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIENhbGxBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAg
Y29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBsaHMsIHJocykKKyAgICB7CisgICAgICAgIHN1cGVy
KG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9saHMg
PSBsaHM7CisgICAgICAgIHRoaXMuX3JocyA9IHJoczsKKyAgICAgICAgdGhpcy5mdW5jID0gbnVs
bDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9Cisg
ICAgZ2V0IGxocygpIHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVy
biB0aGlzLl9yaHM7IH0gLy8gVGhpcyBjYW4gYmUgbnVsbC4KKyAgICAKKyAgICB0b1N0cmluZygp
CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMgKyAiICIgKyB0aGlzLm5hbWUgKyAodGhp
cy5yaHMgPyAiPSAiICsgdGhpcy5yaHMgOiAiIik7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9DYWxsRXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIENhbGxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudExpc3QpCisgICAgeworICAg
ICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAg
dGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgICAgIHRoaXMuX2FyZ3Vt
ZW50TGlzdCA9IGFyZ3VtZW50TGlzdDsKKyAgICAgICAgdGhpcy5mdW5jID0gbnVsbDsKKyAgICB9
CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5
cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0IGFy
Z3VtZW50TGlzdCgpIHsgcmV0dXJuIHRoaXMuX2FyZ3VtZW50TGlzdDsgfQorICAgIAorICAgIHRv
U3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5
cGVBcmd1bWVudHMgKyAiPigiICsgdGhpcy5hcmd1bWVudExpc3QgKyAiKSI7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9DYWxsRnVuY3Rpb24uanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEZ1bmN0aW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0NhbGxGdW5jdGlvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKKy8vIFRoaXMgYWxsb3dzIHlvdSB0byBwYXNzIHN0cnVjdHMgYW5kIGFycmF5cyBp
bi1wbGFjZSwgYnV0IGl0J3MgYSBtb3JlIGFubm95aW5nIEFQSS4KK2Z1bmN0aW9uIGNhbGxGdW5j
dGlvbkJ5UmVmKHByb2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkKK3sK
KyAgICBmb3IgKGxldCByZXNldCBvZiBwcm9ncmFtLnJlc2V0cykKKyAgICAgICAgcmVzZXQoKTsK
KyAgICBsZXQgYXJndW1lbnRUeXBlcyA9IGFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJn
dW1lbnQudHlwZS5lbGVtZW50VHlwZSk7CisgICAgbGV0IGZ1bmMgPSByZXNvbHZlSW5saW5lZEZ1
bmN0aW9uKHByb2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAg
IGlmICghZnVuYykKKyAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKCI8Y2FsbEZ1bmN0aW9u
PiIsICJDYW5ub3QgcmVzb2x2ZSBmdW5jdGlvbiBjYWxsICIgKyBuYW1lICsgIjwiICsgdHlwZUFy
Z3VtZW50cyArICI+KCIgKyBhcmd1bWVudExpc3QgKyAiKSIpOworICAgIGZvciAobGV0IGkgPSAw
OyBpIDwgZnVuYy5wYXJhbWV0ZXJzLmxlbmd0aDsgKytpKQorICAgICAgICBmdW5jLnBhcmFtZXRl
cnNbaV0uZVB0ci5jb3B5RnJvbShhcmd1bWVudExpc3RbaV0pOworICAgIHJldHVybiBuZXcgRXZh
bHVhdG9yKCkudmlzaXRGdW5jdGlvbkJvZHkoZnVuYy5ib2R5KTsKK30KKworZnVuY3Rpb24gY2Fs
bEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlzdCkKK3sK
KyAgICByZXR1cm4gY2FsbEZ1bmN0aW9uQnlSZWYoCisgICAgICAgIHByb2dyYW0sIG5hbWUsIHR5
cGVBcmd1bWVudHMsCisgICAgICAgIGFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gRVB0ci5i
b3goYXJndW1lbnQpKSkubG9hZFZhbHVlKCk7Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9D
aGVjay5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DaGVjay5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DaGVjay5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIGNoZWNrKHByb2dyYW0pCit7CisgICAgcHJvZ3Jh
bS52aXNpdChuZXcgQ2hlY2tlcihwcm9ncmFtKSk7Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0NoZWNrZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2hlY2tlci5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DaGVja2VyLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENoZWNrZXIgZXh0ZW5kcyBWaXNp
dG9yIHsKKyAgICBjb25zdHJ1Y3Rvcihwcm9ncmFtKQorICAgIHsKKyAgICAgICAgdGhpcy5fcHJv
Z3JhbSA9IHByb2dyYW07CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAo
bGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykgeworICAgICAgICAgICAg
dGhpcy5fY3VycmVudFN0YXRlbWVudCA9IHN0YXRlbWVudDsKKyAgICAgICAgICAgIHN0YXRlbWVu
dC52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29s
RGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2ln
bmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNldCA9IG5ldyBTZXQoKTsKKyAgICAgICAgICAg
IGZ1bmN0aW9uIGNvbnNpZGVyKHRoaW5nKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAg
IGlmICh0aGluZy5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgICAgICAgICAgc2V0LmFkZCh0aGlu
Zyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGFzcyBOb3RpY2VUeXBlVmFyaWFibGUg
ZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAgICAgICAgICAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAg
ICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyKG5vZGUudHlwZSk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZpc2l0VmFyaWFibGVSZWYobm9k
ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNpZGVyKG5vZGUu
dmFyaWFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IGxldCBub3RpY2VUeXBlVmFyaWFibGUgPSBuZXcgTm90aWNlVHlwZVZhcmlhYmxlKCk7CisgICAg
ICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXJUeXBlIG9mIHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBl
cykKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlLnZpc2l0KG5vdGljZVR5cGVWYXJpYWJs
ZSk7CisgICAgICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHNpZ25hdHVyZS50eXBl
UGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIGlmICghc2V0Lmhhcyh0eXBlUGFyYW1ldGVy
KSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgQUxUeXBlRXJyb3IodHlwZVBhcmFtZXRlci5v
cmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBwYXJhbWV0ZXIgdG8gcHJvdG9jb2wgc2lnbmF0dXJl
IG5vdCBpbmZlcnJhYmxlIGZyb20gdmFsdWUgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgfQor
ICAgICAgICAgICAgaWYgKCFzZXQuaGFzKG5vZGUudHlwZVZhcmlhYmxlKSkKKyAgICAgICAgICAg
ICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Ioc2lnbmF0dXJlLm9yaWdpbi5vcmlnaW5TdHJpbmcs
ICJQcm90b2NvbCdzIHR5cGUgdmFyaWFibGUgbm90IG1lbnRpb25lZCBpbiBzaWduYXR1cmUiKTsK
KyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBfY2hlY2tUeXBlQXJndW1lbnRzKG9yaWdpbiwg
dHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBmb3IgKGxldCBp
ID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQg
YXJndW1lbnRJc1R5cGUgPSB0eXBlQXJndW1lbnRzW2ldIGluc3RhbmNlb2YgVHlwZTsKKyAgICAg
ICAgICAgIGxldCByZXN1bHQgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0udmlzaXQodGhpcyk7Cisg
ICAgICAgICAgICBpZiAoYXJndW1lbnRJc1R5cGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXR5
cGVBcmd1bWVudHNbaV0uaW5oZXJpdHModHlwZUFyZ3VtZW50c1tpXSkpCisgICAgICAgICAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBh
cmd1bWVudCBkb2VzIG5vdCBpbmhlcml0IHByb3RvY29sIik7CisgICAgICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmVxdWFscyh0eXBlUGFyYW1ldGVyc1tpXS50
eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5v
cmlnaW5TdHJpbmcsICJXcm9uZyB0eXBlIGZvciBjb25zdGV4cHIiKTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX2NoZWNrVHlwZUFyZ3VtZW50cyhub2RlLm9yaWdpbiwgdHlwZS50eXBlUGFy
YW1ldGVycywgbm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZl
cmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBub2RlLmVsZW1lbnRUeXBlLnZpc2l0KHRo
aXMpOworICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUuYWRkcmVzc1NwYWNlID09ICJ0aHJlYWQi
KQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKCFub2RlLmVsZW1l
bnRUeXBlLndpdGhSZWN1cnNpdmVseUluc3RhbnRpYXRlZEltbWVkaWF0ZXMuaXNQcmltaXRpdmUp
CisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3Ry
aW5nLCAiSWxsZWdhbCBwb2ludGVyIHRvIG5vbi1wcmltaXRpdmUgdHlwZSIpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgaWYgKCFub2RlLm51
bUVsZW1lbnRzLmlzQ29uc3RleHByKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9y
KG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkFycmF5IGxlbmd0aCBtdXN0IGJlIGNvbnN0ZXhw
ciIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7CisgICAg
ICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGxocyBpcyBhc3NpZ25hYmxl
LgorICAgICAgICBsZXQgbGhzVHlwZSA9IG5vZGUubGhzLnZpc2l0KHRoaXMpOworICAgICAgICBs
ZXQgcmhzVHlwZSA9IG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgICAgICBpZiAoIWxoc1R5cGUu
ZXF1YWxzKHJoc1R5cGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUu
b3JpZ2luLm9yaWdpblN0cmluZywgIlR5cGUgbWlzbWF0Y2ggaW4gYXNzaWdubWVudDogIiArIGxo
c1R5cGUgKyAiIHZlcnN1cyAiICsgcmhzVHlwZSk7CisgICAgICAgIHJldHVybiBsaHNUeXBlOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgICAgICBy
ZXR1cm4gcmVzdWx0LnR5cGU7CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5vZGUpCisg
ICAgeworICAgICAgICBpZiAobm9kZS52YWx1ZSkgeworICAgICAgICAgICAgbGV0IHJlc3VsdFR5
cGUgPSBub2RlLnZhbHVlLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgaWYgKCF0aGlzLmZ1bmMu
cmV0dXJuVmFsdWUuZXF1YWxzKHJlc3VsdFR5cGUpKQorICAgICAgICAgICAgICAgIHRocm93IG5l
dyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJUcnlpbmcgdG8gcmV0dXJu
ICIgKyByZXN1bHRUeXBlICsgIiBpbiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAiICsgZnVuYy5y
ZXR1cm5WYWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgCisg
ICAgICAgIGlmICghZnVuYy5yZXR1cm5WYWx1ZS5lcXVhbHModGhpcy5fcHJvZ3JhbS5pbnRyaW5z
aWNzLnZvaWQpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2lu
Lm9yaWdpblN0cmluZywgIk5vbi12b2lkIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUiKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5fcHJvZ3JhbS5pbnRyaW5zaWNzLmludDMyOworICAgIH0KKyAgICAKKyAgICB2
aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJn
dW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZp
c2l0KHRoaXMpOworICAgICAgICBsZXQgYXJndW1lbnRUeXBlcyA9IG5vZGUuYXJndW1lbnRMaXN0
Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSk7CisgICAgICAgIAorICAgICAg
ICBsZXQgb3ZlcmxvYWQgPSBudWxsOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9m
IHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQudHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGlm
ICghKHR5cGVQYXJhbWV0ZXIgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGUpKQorICAgICAgICAgICAg
ICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCF0eXBlUGFyYW1ldGVyLnByb3RvY29sKQor
ICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0IHNpZ25hdHVyZXMgPQor
ICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIucHJvdG9jb2wuc2lnbmF0dXJlc0J5TmFtZVdp
dGhUeXBlVmFyaWFibGUobm9kZS5uYW1lLCB0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgICAgIGlm
ICghc2lnbmF0dXJlcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIG92
ZXJsb2FkID0gcmVzb2x2ZU92ZXJsb2FkSW1wbChzaWduYXR1cmVzLCBub2RlLnR5cGVBcmd1bWVu
dHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICAgICAgaWYgKG92ZXJsb2FkKQorICAgICAgICAg
ICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghb3ZlcmxvYWQpIHsKKyAgICAg
ICAgICAgIG92ZXJsb2FkID0gdGhpcy5fbmFtZUNvbnRleHQucHJvZ3JhbS5yZXNvbHZlRnVuY092
ZXJsb2FkKAorICAgICAgICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS50eXBlQXJndW1lbnRzLCBh
cmd1bWVudFR5cGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkRp
ZCBub3QgZmluZCBmdW5jdGlvbiBmb3IgY2FsbCIpOworICAgICAgICBub2RlLmZ1bmMgPSBvdmVy
bG9hZC5mdW5jOworICAgICAgICBub2RlLmFjdHVhbFR5cGVBcmd1bWVudHMgPSBvdmVybG9hZC50
eXBlQXJndW1lbnRzLm1hcChUeXBlUmVmLndyYXApOworICAgICAgICByZXR1cm4gb3ZlcmxvYWQu
ZnVuYy5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAorICAgICAgICAgICAgb3Zl
cmxvYWQuZnVuYy50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NvbW1hRXhwcmVzc2lvbi5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Db21tYUV4cHJlc3Npb24uanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ29tbWFFeHByZXNzaW9uIGV4dGVu
ZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBsaXN0KQorICAgIHsKKyAg
ICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGlzdCA9IGxpc3Q7CisgICAgfQor
ICAgIAorICAgIGdldCBsaXN0KCkgeyByZXR1cm4gdGhpcy5fbGlzdDsgfQorICAgIAorICAgIHRv
U3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiKCIgKyB0aGlzLmxpc3QudG9TdHJpbmco
KSArICIpIjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJU
eXBlUGFyYW1ldGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhw
clR5cGVQYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ29u
c3RleHByVHlwZVBhcmFtZXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc5IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIgZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2lu
ID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlw
ZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFt
ZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCBpc0Nv
bnN0ZXhwcigpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBnZXQgaXNVbmlmaWFibGUoKSB7IHJldHVy
biB0cnVlOyB9CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0
LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgVmFsdWUpKQor
ICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICghdGhpcy50eXBlLnVuaWZ5
KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAgICByZXR1cm4gZmFs
c2U7CisKKyAgICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhp
cyk7CisgICAgICAgIGlmIChyZWFsVGhpcyAhPSB0aGlzKQorICAgICAgICAgICAgcmV0dXJuIHJl
YWxUaGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgICAgICAKKyAgICAg
ICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVmFyaWFibGVSZWYpCisgICAgICAgICAgICBvdGhlciA9
IG90aGVyLnZhcmlhYmxlOworICAgICAgICAKKyAgICAgICAgdW5pZmljYXRpb25Db250ZXh0LnVu
aWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAg
IHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7Cisg
ICAgfQorICAgIAorICAgIHZlcmlmeUFzQXJndW1lbnQodW5pZmljYXRpb25Db250ZXh0KQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1l
dGVyKHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBl
ICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
RUJ1ZmZlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FQnVmZmVyLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0VCdWZmZXIuanMJKHdvcmtpbmcgY29w
eSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitsZXQgZUJ1ZmZlckNvdW50ID0gMDsKKworY2xhc3Mg
RUJ1ZmZlciB7CisgICAgY29uc3RydWN0b3Ioc2l6ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2lu
ZGV4ID0gZUJ1ZmZlckNvdW50Kys7CisgICAgICAgIHRoaXMuX2FycmF5ID0gbmV3IEFycmF5KHNp
emUpOworICAgIH0KKyAgICAKKyAgICBnZXQoaW5kZXgpCisgICAgeworICAgICAgICBpZiAoaW5k
ZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX2FycmF5Lmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93
IG5ldyBFcnJvcigib3V0IG9mIGJvdW5kcyBidWZmZXIgYWNjZXNzIik7CisgICAgICAgIHJldHVy
biB0aGlzLl9hcnJheVtpbmRleF07CisgICAgfQorICAgIAorICAgIHNldChpbmRleCwgdmFsdWUp
CisgICAgeworICAgICAgICB0aGlzLl9hcnJheVtpbmRleF0gPSB2YWx1ZTsKKyAgICB9CisgICAg
CisgICAgZ2V0IGluZGV4KCkgeyByZXR1cm4gdGhpcy5faW5kZXg7IH0KKyAgICAKKyAgICB0b1N0
cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIkIiICsgdGhpcy5faW5kZXggKyAiOlsiICsg
dGhpcy5fYXJyYXkgKyAiXSI7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRUJ1
ZmZlckJ1aWxkZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRUJ1ZmZlckJ1
aWxkZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRUJ1ZmZlckJ1aWxk
ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAo
QykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmli
dXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0
CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93
aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291
cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICog
Mi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29y
IG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICog
VEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJM
RSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVN
UExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM
T1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElP
TikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hF
VEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElO
RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUg
VVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM
SVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFQnVmZmVy
QnVpbGRlciBleHRlbmRzIFZpc2l0b3IgeworICAgIGNvbnN0cnVjdG9yKHByb2dyYW0pCisgICAg
eworICAgICAgICB0aGlzLl9wcm9ncmFtID0gcHJvZ3JhbTsKKyAgICAgICAgCisgICAgICAgIGxl
dCByZXNldHMgPSBbXTsKKyAgICAgICAgdGhpcy5fcmVzZXRzID0gcmVzZXRzOworICAgICAgICBw
cm9ncmFtLnJlc2V0cyA9IHJlc2V0czsKKyAgICB9CisgICAgCisgICAgX2NyZWF0ZUVQdHIodHlw
ZSkKKyAgICB7CisgICAgICAgIHR5cGUgPSB0eXBlLndpdGhSZWN1cnNpdmVseUluc3RhbnRpYXRl
ZEltbWVkaWF0ZXM7CisgICAgICAgIGxldCBidWZmZXIgPSBuZXcgRUJ1ZmZlcih0eXBlLnNpemUp
OworICAgICAgICB0eXBlLnBvcHVsYXRlRGVmYXVsdFZhbHVlKGJ1ZmZlciwgMCk7CisgICAgICAg
IHRoaXMuX3Jlc2V0cy5wdXNoKCgpID0+IHR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUoYnVmZmVy
LCAwKSk7CisgICAgICAgIHJldHVybiBuZXcgRVB0cih0eXBlLCBidWZmZXIsIDApOworICAgIH0K
KyAgICAKKyAgICB2aXNpdEZ1bmNQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUu
ZVB0ciA9IHRoaXMuX2NyZWF0ZUVQdHIobm9kZS50eXBlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL0VGbG9hdC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9FRmxvYXQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRUZsb2F0Lmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRUZsb2F0IGV4dGVu
ZHMgRVZhbHVlIHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBlLCB2YWx1ZSkKKyAgICB7CisgICAgICAg
IHN1cGVyKHR5cGUpOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAK
KyAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIAorICAgIGFkZChv
dGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRUZsb2F0KHRoaXMudHlwZSwgdGhpcy52
YWx1ZSArIG90aGVyLnZhbHVlKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuICIiICsgdGhpcy52YWx1ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL0VJbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRUlu
dC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FSW50LmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRUludCBleHRlbmRzIEVWYWx1ZSB7
CisgICAgY29uc3RydWN0b3IodHlwZSwgdmFsdWUpCisgICAgeworICAgICAgICBzdXBlcih0eXBl
KTsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZh
bHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICBhZGQob3RoZXIpCisgICAg
eworICAgICAgICByZXR1cm4gbmV3IEVJbnQodGhpcy50eXBlLCAodGhpcy52YWx1ZSArIG90aGVy
LnZhbHVlKSB8IDApOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gIiIgKyB0aGlzLnZhbHVlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvRVB0ci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FUHRyLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0VQdHIuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFUHRyIGV4dGVuZHMgRVZhbHVlIHsKKyAgICBj
b25zdHJ1Y3Rvcih0eXBlLCBidWZmZXIsIG9mZnNldCkKKyAgICB7CisgICAgICAgIHN1cGVyKHR5
cGUpOworICAgICAgICB0aGlzLl9idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHRoaXMuX29mZnNl
dCA9IG9mZnNldDsKKyAgICB9CisgICAgCisgICAgLy8gVGhlIGludGVycHJldGVyIGFsd2F5cyBw
YXNzZXMgYXJvdW5kIHBvaW50ZXJzIHRvIHRoaW5ncy4gVGhpcyBtZWFucyB0aGF0IHNvbWV0aW1l
cyB3ZSB3aWxsCisgICAgLy8gd2FudCB0byByZXR1cm4gYSB2YWx1ZSBidXQgd2UgaGF2ZSB0byAi
aW52ZW50IiBhIHBvaW50ZXIgdG8gdGhhdCB2YWx1ZS4gTm8gcHJvYmxlbSwgdGhpcworICAgIC8v
IGZ1bmN0aW9uIGlzIGhlcmUgdG8gaGVscC4KKyAgICAvLworICAgIC8vIEluIGEgcmVhbCBleGVj
dXRpb24gZW52aXJvbm1lbnQsIHVzZXMgb2YgdGhpcyBtYW5pZmVzdCBhcyBTU0EgdGVtcG9yYXJp
ZXMuCisgICAgc3RhdGljIGJveCh2YWx1ZSkKKyAgICB7CisgICAgICAgIGxldCBidWZmZXIgPSBu
ZXcgRUJ1ZmZlcigxKTsKKyAgICAgICAgYnVmZmVyLnNldCgwLCB2YWx1ZSk7CisgICAgICAgIHJl
dHVybiBuZXcgRVB0cihuZXcgUHRyVHlwZSh2YWx1ZS50eXBlLm9yaWdpbiwgInRocmVhZCIsIHZh
bHVlLnR5cGUpLCBidWZmZXIsIDApOworICAgIH0KKyAgICAKKyAgICBnZXQgYnVmZmVyKCkgeyBy
ZXR1cm4gdGhpcy5fYnVmZmVyOyB9CisgICAgZ2V0IG9mZnNldCgpIHsgcmV0dXJuIHRoaXMuX29m
ZnNldDsgfQorICAgIAorICAgIGxvYWRWYWx1ZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5idWZmZXIuZ2V0KHRoaXMub2Zmc2V0KTsKKyAgICB9CisgICAgCisgICAgY29weUZyb20ob3Ro
ZXIpCisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gdGhpcy50eXBlLmVsZW1lbnRUeXBlLnNp
emU7IGktLTspCisgICAgICAgICAgICB0aGlzLmJ1ZmZlci5zZXQoaSwgb3RoZXIuYnVmZmVyLmdl
dChpKSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmICgh
dGhpcy5idWZmZXIpCisgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICByZXR1cm4g
Il5CIiArIHRoaXMuYnVmZmVyLmluZGV4ICsgIjoiICsgdGhpcy5vZmZzZXQ7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FVmFsdWUuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvRVZhbHVlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0VWYWx1ZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEVW
YWx1ZSB7CisgICAgY29uc3RydWN0b3IodHlwZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGUg
PSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdGlvbkNvbW1vbi5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0aW9uQ29tbW9uLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRpb25Db21tb24uanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjb25zdCBCcmVha0V4Y2VwdGlvbiA9IFN5bWJv
bCgiQnJlYWtFeGNlcHRpb24iKTsKK2NvbnN0IENvbnRpbnVlRXhjZXB0aW9uID0gU3ltYm9sKCJD
b250aW51ZUV4Y2VwdGlvbiIpOworCisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRv
ci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0b3IuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdG9yLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBpcyBhIGNvbWJpbmVkIExIUy9SSFMgZXZh
bHVhdG9yIHRoYXQgcGFzc2VzIGFyb3VuZCBFUHRyJ3MgdG8gZXZlcnl0aGluZy4KK2NsYXNzIEV2
YWx1YXRvciBleHRlbmRzIFZpc2l0b3IgeworICAgIHZpc2l0RnVuY3Rpb25Cb2R5KGJsb2NrKQor
ICAgIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJsb2NrLnZpc2l0KHRoaXMpOworICAg
ICAgICAgICAgLy8gRklYTUU6IFdlIHNob3VsZCBoYXZlIGEgY2hlY2sgdGhhdCB0aGVyZSBpcyBu
byB3YXkgdG8gZHJvcCBvdXQgb2YgYSBmdW5jdGlvbiB3aXRob3V0CisgICAgICAgICAgICAvLyBy
ZXR1cm5pbmcgdW5sZXNzIHRoZSBmdW5jdGlvbiByZXR1cm5zIHZvaWQuCisgICAgICAgICAgICBy
ZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoZSkgeworICAgICAgICAgICAgaWYgKGUgPT0g
QnJlYWtFeGNlcHRpb24gfHwgZSA9PSBDb250aW51ZUV4Y2VwdGlvbikKKyAgICAgICAgICAgICAg
ICB0aHJvdyBuZXcgRXJyb3IoIlNob3VsZCBub3Qgc2VlIGJyZWFrL2NvbnRpbnVlIGF0IGZ1bmN0
aW9uIHNjb3BlIik7CisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIFJldHVybkV4Y2VwdGlv
bikKKyAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZTsKKyAgICAgICAgICAgIHRocm93IGU7
CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jdGlvbkxpa2VCbG9jayhub2Rl
KQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmFyZ3VtZW50TGlzdC5s
ZW5ndGg7ICsraSkKKyAgICAgICAgICAgIG5vZGUucGFyYW1ldGVyc1tpXS5sVmFsdWUudmFsdWUg
PSBub2RlLmFyZ3VtZW50TGlzdFtpXS52aXNpdCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHZpc2l0
RnVuY3Rpb25Cb2R5KG5vZGUuYmxvY2spOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihu
b2RlKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IFJldHVybkV4Y2VwdGlvbihub2RlLnZhbHVl
ID8gbm9kZS52YWx1ZS52aXNpdCh0aGlzKSA6IG51bGwpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICAvLyBXZSBldmFsdWF0ZSBpbmxp
bmVkIEFTVHMsIHNvIHRoaXMgY2FuIG9ubHkgYmUgYSBuYXRpdmUgY2FsbC4KKyAgICAgICAgbGV0
IGNhbGxBcmd1bWVudHMgPSBub2RlLmFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1l
bnQudmlzaXQodGhpcykpOworICAgICAgICByZXR1cm4gbm9kZS5pbXBsZW1lbnRhdGlvbihjYWxs
QXJndW1lbnRzKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Np
b24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lvbi5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRXhwcmVzc2lvbiBleHRlbmRzIFZhbHVl
IHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4pCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4g
PSBvcmlnaW47CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9v
cmlnaW47IH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ZpZWxkLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL0ZpZWxkLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
Y2xhc3MgRmllbGQgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5h
bWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3Jp
Z2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0
aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAg
CisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICIgIiAr
IHRoaXMubmFtZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvRnVuYy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ5IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIEZ1bmMgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihuYW1lLCBy
ZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHRo
aXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9yZXR1cm5UeXBlID0gcmV0dXJuVHlwZTsK
KyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAg
dGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgfQorICAgIAorICAgIGdldCBuYW1l
KCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCByZXR1cm5UeXBlKCkgeyByZXR1cm4g
dGhpcy5fcmV0dXJuVHlwZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygpIHsgcmV0dXJuIHRo
aXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlz
Ll9wYXJhbWV0ZXJzOyB9CisgICAgZ2V0IHBhcmFtZXRlclR5cGVzKCkgeyByZXR1cm4gdGhpcy5w
YXJhbWV0ZXJzLm1hcChwYXJhbWV0ZXIgPT4gcGFyYW1ldGVyLnR5cGUpOyB9CisgICAgCisgICAg
Z2V0IGtpbmQoKSB7IHJldHVybiBGdW5jOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMucmV0dXJuVHlwZSArICIgIiArIHRoaXMubmFtZSArICI8IiAr
IHRoaXMudHlwZVBhcmFtZXRlcnMgKyAiPigiICsgdGhpcy5wYXJhbWV0ZXJzICsgIikiOworICAg
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0RlZi5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9GdW5jRGVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL0Z1bmNEZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBGdW5jRGVmIGV4dGVuZHMgRnVuYyB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBu
YW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycywgYm9keSkKKyAgICB7
CisgICAgICAgIHN1cGVyKG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0
ZXJzKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLmJvZHkg
PSBib2R5OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN1cGVy
LnRvU3RyaW5nKCkgKyAiIHsgIiArIGJvZHkgKyAiIH0iOworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvRnVuY0luc3RhbnRpYXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9GdW5jSW5zdGFudGlhdG9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL0Z1bmNJbnN0YW50aWF0b3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2
OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBGdW5jSW5zdGFudGlhdG9yIHsKKyAgICBjb25zdHJ1Y3RvcigpCisg
ICAgeworICAgICAgICB0aGlzLl9pbnN0YW5jZXMgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAor
ICAgIC8vIFJldHVybnMgYSBGdW5jIG9iamVjdCB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgYSBw
YXJ0aWN1bGFyIHN5c3RlbSBvZiB0eXBlIGFyZ3VtZW50cy4KKyAgICBnZXRVbmlxdWUoZnVuYywg
dHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGlmICghZnVuYy50eXBlUGFyYW1ldGVycy5s
ZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gZnVuYzsKKyAgICAgICAgCisgICAgICAgIGxldCBp
bnN0YW5jZXMgPSB0aGlzLl9pbnN0YW5jZXMuZ2V0KGZ1bmMpOworICAgICAgICBpZiAoIWZ1bmN0
aW9ucykKKyAgICAgICAgICAgIHRoaXMuX2Z1bmN0aW9ucy5zZXQoZnVuYywgZnVuY3Rpb25zID0g
W10pOworICAgICAgICAKKyAgICAgICAgZm9yIChsZXQgaW5zdGFuY2Ugb2YgaW5zdGFuY2VzKSB7
CisgICAgICAgICAgICBsZXQgb2sgPSB0cnVlOworICAgICAgICAgICAgZm9yIChsZXQgaSA9IGlu
c3RhbmNlLnR5cGVBcmd1bWVudHMubGVuZ3RoOyBpLS07KSB7CisgICAgICAgICAgICAgICAgaWYg
KCFpbnN0YW5jZS50eXBlQXJndW1lbnRzW2ldLmVxdWFscyh0eXBlQXJndW1lbnRzW2ldKSkgewor
ICAgICAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVh
azsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW9r
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNl
LmZ1bmM7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBT
dWJzdGl0dXRpb24ubWFwcGluZyhmdW5jLnR5cGVQYXJhbWV0ZXJzLCB0eXBlQXJndW1lbnRzKTsK
KyAgICAgICAgbGV0IHJlc3VsdGluZ0Z1bmMgPSBuZXcgRnVuY0RlZigKKyAgICAgICAgICAgIGZ1
bmMub3JpZ2luLCBmdW5jLm5hbWUsCisgICAgICAgICAgICBmdW5jLnJldHVyblR5cGUudmlzaXQo
c3Vic3RpdHV0aW9uKSwKKyAgICAgICAgICAgIFtdLCAvLyBXZSdyZSBpbnN0YW50aWF0ZWQgc28g
d2Ugbm8gbG9uZ2VyIHRha2UgdHlwZSBwYXJhbWV0ZXJzLgorICAgICAgICAgICAgcGFyYW1ldGVy
cy5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRlci52aXNpdChzdWJzdGl0dXRpb24pKSwKKyAgICAg
ICAgICAgIGJvZHkudmlzaXQoc3Vic3RpdHV0aW9uKSk7CisgICAgICAgIGxldCBpbnN0YW5jZSA9
IHtmdW5jOiByZXN1bHRpbmdGdW5jLCB0eXBlQXJndW1lbnRzfTsKKyAgICAgICAgaW5zdGFuY2Vz
LnB1c2goaW5zdGFuY2UpOworICAgICAgICByZXR1cm4gZnVuYzsKKyAgICB9Cit9CisKSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNQYXJhbWV0ZXIuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvRnVuY1BhcmFtZXRlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9GdW5jUGFyYW1ldGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgRnVuY1BhcmFtZXRlciBleHRlbmRzIFZhbHVlIHsKKyAgICAvLyBUaGUgbmFt
ZSBpcyBvcHRpb25hbC4gSXQncyBPSyBmb3IgaXQgdG8gYmUgbnVsbCEKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIG5hbWUsIHR5cGUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmln
aW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlID0gdHlw
ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsg
fQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkg
eyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIGlmICghdGhpcy5uYW1lKQorICAgICAgICAgICAgcmV0dXJuICIiICsgdGhpcy50eXBlOwor
ICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY1NpZ25hdHVyZS5qcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9BcnJheUxhbmdSSS9GdW5jU2lnbmF0dXJlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0Z1bmNTaWduYXR1cmUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwy
NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jdGlvbkxpa2VCbG9jay5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmN0aW9uTGlrZUJsb2Nr
IGV4dGVuZHMgVmFsdWUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgYXJndW1lbnRMaXN0LCBw
YXJhbWV0ZXJzLCBib2R5KQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOwor
ICAgICAgICB0aGlzLl9hcmd1bWVudExpc3QgPSBhcmd1bWVudExpc3Q7CisgICAgICAgIHRoaXMu
X3BhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9ib2R5ID0gYm9keTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAg
IGdldCBhcmd1bWVudExpc3QoKSB7IHJldHVybiB0aGlzLl9hcmd1bWVudExpc3Q7IH0KKyAgICBn
ZXQgcGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7IH0KKyAgICBnZXQgYm9k
eSgpIHsgcmV0dXJuIHRoaXMuX2JvZHk7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgewor
ICAgICAgICByZXR1cm4gIlsmXSAoIiArIHBhcmFtZXRlcnMgKyAiKSB7ICIgKyBibG9jayArICIg
fSgiICsgYXJndW1lbnRMaXN0ICsgIikiOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0lubGluZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbmxpbmUuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5lLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gaW5saW5lKHByb2dyYW0pCit7Cisg
ICAgZm9yIChsZXQgZnVuYyBvZiBwcm9ncmFtLmZ1bmN0aW9ucykgeworICAgICAgICBpZiAoIWZ1
bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgX2lubGluZUZ1bmN0aW9uKHBy
b2dyYW0sIGZ1bmMsIG5ldyBWaXNpdGluZ1NldChmdW5jKSk7CisgICAgfQorfQorCitmdW5jdGlv
biBfaW5saW5lRnVuY3Rpb24ocHJvZ3JhbSwgZnVuYywgdmlzaXRpbmcpCit7CisgICAgaWYgKGZ1
bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5v
dCBpbmxpbmUgZnVuY3Rpb24gdGhhdCBoYXMgdHlwZSBwYXJhbWV0ZXJzIik7CisgICAgaWYgKGZ1
bmMuaW5saW5lZCkKKyAgICAgICAgcmV0dXJuOworICAgIAorICAgIC8vIFRoaXMgaXMgdGhlIHBy
ZWNpc2UgdGltZSB3aGVuIHdlIGNhbiBidWlsZCBFQnVmZmVycyBpbiBvcmRlciB0byBnZXQgdGhl
bSB0byBiZSB1bmlxdWVkIGJ5CisgICAgLy8gdHlwZSBpbnN0YW50aWF0aW9uIGJ1dCBub3RoaW5n
IGVsc2UuCisgICAgZnVuYy52aXNpdChuZXcgRUJ1ZmZlckJ1aWxkZXIoKSk7CisgICAgCisgICAg
ZnVuYy5ib2R5ID0gZnVuYy5ib2R5LnZpc2l0KG5ldyBJbmxpbmVyKHByb2dyYW0sIGZ1bmMsIHZp
c2l0aW5nKSk7CisgICAgZnVuYy5pbmxpbmVkID0gdHJ1ZTsKK30KKworZnVuY3Rpb24gcmVzb2x2
ZUlubGluZWRGdW5jdGlvbihwcm9ncmFtLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5
cGVzKQoreworICAgIGxldCBvdmVybG9hZCA9IHByb2dyYW0ucmVzb2x2ZUZ1bmNPdmVybG9hZChu
YW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKTsKKyAgICBpZiAoIW92ZXJsb2FkKQor
ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICBpZiAoIW92ZXJsb2FkLmZ1bmMudHlwZVBhcmFtZXRl
cnMpCisgICAgICAgIHJldHVybiBvdmVybG9hZC5mdW5jOworICAgIGxldCBmdW5jID0gcHJvZ3Jh
bS5mdW5jSW5zdGFudGlhdG9yLmdldFVuaXF1ZShvdmVybG9hZC5mdW5jLCBvdmVybG9hZC50eXBl
QXJndW1lbnRzKTsKKyAgICBfaW5saW5lRnVuY3Rpb24ocHJvZ3JhbSwgZnVuYywgbmV3IFZpc2l0
aW5nU2V0KG92ZXJsb2FkLmZ1bmMpKTsKKyAgICByZXR1cm4gZnVuYzsKK30KSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL0lubGluZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
SW5saW5lci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9JbmxpbmVyLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgSW5saW5lciBleHRl
bmRzIFJld3JpdGVyIHsKKyAgICBjb25zdHJ1Y3Rvcihwcm9ncmFtLCBmdW5jLCB2aXNpdGluZykK
KyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBwcm9ncmFtOworICAgICAgICB0aGlzLl92
aXNpdGluZyA9IHZpc2l0aW5nOworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHByZXNzaW9u
KG5vZGUpCisgICAgeworICAgICAgICBpZiAobm9kZS5mdW5jLmlzTmF0aXZlKQorICAgICAgICAg
ICAgcmV0dXJuOworICAgICAgICByZXR1cm4gdGhpcy5fdmlzaXRpbmcuZG9WaXNpdChub2RlLmZ1
bmMsICgpID0+IHsKKyAgICAgICAgICAgIGxldCBmdW5jID0gdGhpcy5fcHJvZ3JhbS5mdW5jSW5z
dGFudGlhdG9yLmdldFVuaXF1ZShub2RlLmZ1bmMsIG5vZGUuYWN0dWFsVHlwZUFyZ3VtZW50cyk7
CisgICAgICAgICAgICBfaW5saW5lRnVuY3Rpb24odGhpcy5fcHJvZ3JhbSwgZnVuYywgdGhpcy5f
dmlzaXRpbmcpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbkxpa2VCbG9jaygKKyAg
ICAgICAgICAgICAgICBub2RlLm9yaWdpbiwKKyAgICAgICAgICAgICAgICBub2RlLmFyZ3VtZW50
TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1lbnQudmlzaXQodGhpcykpLAorICAgICAgICAgICAg
ICAgIGZ1bmMucGFyYW1ldGVycywgZnVuYy5ib2R5KTsKKyAgICAgICAgfSk7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnN0YW50aWF0ZUltbWVkaWF0ZXMuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW5zdGFudGlhdGVJbW1lZGlhdGVzLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0luc3RhbnRpYXRlSW1tZWRpYXRlcy5qcwko
d29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEluc3RhbnRpYXRlSW1t
ZWRpYXRlcyBleHRlbmRzIFJld3JpdGVyIHsKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7
CisgICAgICAgIG5vZGUgPSBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgICAgIHJldHVy
biBub2RlLmluc3RhbnRpYXRlZFR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZp
c2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQy
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIEludExpdGVyYWwgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAg
ICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHZhbHVlKCkg
eyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0
cnVlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICIiICsg
dGhpcy5fdmFsdWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5z
aWNzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ludHJpbnNpY3MuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEludHJpbnNpY3MgeworICAgIGNvbnN0
cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKworICAgICAg
ICAvLyBOT1RFOiBJbnRyaW5zaWMgcmVzb2x1dGlvbiBoYXBwZW5zIGJlZm9yZSB0eXBlIG5hbWUg
cmVzb2x1dGlvbiwgc28gdGhlIHN0cmluZ3Mgd2UgdXNlIGhlcmUKKyAgICAgICAgLy8gdG8gY2F0
Y2ggdGhlIGludHJpbnNpY3MgbXVzdCBiZSBiYXNlZCBvbiB0aGUgdHlwZSBuYW1lcyB0aGF0IFN0
YW5kYXJkTGlicmFyeS5qcyB1c2VzLiBGb3IKKyAgICAgICAgLy8gZXhhbXBsZSwgaWYgYSBuYXRp
dmUgZnVuY3Rpb24gaXMgZGVjbGFyZWQgdXNpbmcgImludCIgcmF0aGVyIHRoYW4gImludDMyIiwg
dGhlbiB3ZSBtdXN0IHVzZQorICAgICAgICAvLyAiaW50IiBoZXJlLCBzaW5jZSB3ZSBkb24ndCB5
ZXQga25vdyB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lIHR5cGUuCisgICAgICAgIAorICAgICAgICB0
aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlwZSB2b2lkPD4i
LAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlzLnZvaWQgPSB0
eXBlOworICAgICAgICAgICAgICAgIHR5cGUuc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgdHlw
ZS5wb3B1bGF0ZURlZmF1bHRWYWx1ZSA9ICgpID0+IHsgfTsKKyAgICAgICAgICAgIH0pOworCisg
ICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBl
IGludDMyPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAgICAgICB0aGlz
LmludDMyID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0eXBlLnNpemUgPSAxOworICAgICAgICAg
ICAgICAgIHR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUgPSAoYnVmZmVyLCBvZmZzZXQpID0+IGJ1
ZmZlci5zZXQob2Zmc2V0LCBuZXcgRUludCh0eXBlLCAwKSk7CisgICAgICAgICAgICB9KTsKKwor
ICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBwcmltaXRpdmUgdHlw
ZSBkb3VibGU8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAgICAgICAgICAgIHRo
aXMuZG91YmxlID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0eXBlLnNpemUgPSAxOworICAgICAg
ICAgICAgICAgIHR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUgPQorICAgICAgICAgICAgICAgICAg
ICAoYnVmZmVyLCBvZmZzZXQpID0+IGJ1ZmZlci5zZXQob2Zmc2V0LCBuZXcgRUZsb2F0KHR5cGUs
IDApKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAKKyAgICAgICAgdGhpcy5fbWFwLnNldCgK
KyAgICAgICAgICAgICJuYXRpdmUgaW50IG9wZXJhdG9yKzw+KGludCxpbnQpIiwKKyAgICAgICAg
ICAgIChmdW5jKSA9PiB7CisgICAgICAgICAgICAgICAgZnVuYy5pbXBsZW1lbnRhdGlvbiA9Cisg
ICAgICAgICAgICAgICAgICAgIChbbGVmdCwgcmlnaHRdKSA9PiBFUHRyLmJveChsZWZ0LmxvYWRW
YWx1ZSgpLmFkZChyaWdodC5sb2FkVmFsdWUoKSkpOworICAgICAgICAgICAgfSk7CisgICAgfQor
ICAgIAorICAgIGFkZCh0aGluZykKKyAgICB7CisgICAgICAgIGxldCBpbnRyaW5zaWMgPSB0aGlz
Ll9tYXAuZ2V0KHRoaW5nLm5hbWUpOworICAgICAgICBpZiAoIWludHJpbnNpYykKKyAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVW5y
ZWNvZ25pemVkIGludHJpbnNpYzogIiArIHRoaW5nKTsKKyAgICAgICAgaW50cmluc2ljKHRoaW5n
KTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0xleGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTQ0IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIExleGVyIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxpbmVOdW1iZXJPZmZz
ZXQsIHRleHQpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAg
IHRoaXMuX2xpbmVOdW1iZXJPZmZzZXQgPSBsaW5lTnVtYmVyT2Zmc2V0OworICAgICAgICB0aGlz
Ll90ZXh0ID0gdGV4dDsKKyAgICAgICAgdGhpcy5faW5kZXggPSAwOworICAgICAgICB0aGlzLl9z
dGFjayA9IFtdOworICAgIH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyRm9ySW5kZXgodGhpcy5faW5kZXgpOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
Ll9vcmlnaW4gKyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAg
IGxpbmVOdW1iZXJGb3JJbmRleChpbmRleCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLl90
ZXh0LnN1YnN0cmluZygwLCBpbmRleCkubWF0Y2goL1xuL2cpLmxlbmd0aCArIHRoaXMuX2xpbmVO
dW1iZXJPZmZzZXQ7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMu
X2luZGV4OyB9CisgICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2luZGV4ID0gdmFsdWU7IH0K
KyAgICAKKyAgICBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9zdGFjay5sZW5ndGgp
CisgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhY2sucG9wKCk7CisgICAgICAgIAorICAgICAg
ICBpZiAodGhpcy5faW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisgICAgICAgICAgICByZXR1
cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1lbnRCZWdpbiA9IC9cL1wq
LzsKKyAgICAgICAgY29uc3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4gPSAvXC9cLy87CisgICAg
ICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAgICAgICAgICAgIGxldCB0
ZXh0ID0gUmVnRXhwLmxhc3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0b2tlbiA9IG5ldyBMZXhl
clRva2VuKHRoaXMsIHRoaXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAgICAgICAgICAgIHRoaXMu
X2luZGV4ICs9IHRleHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAg
ICB9OworCisgICAgICAgIGxldCByZWxldmFudFRleHQ7CisgICAgICAgIGZvciAoOzspIHsKKyAg
ICAgICAgICAgIHJlbGV2YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3RyaW5nKHRoaXMuX2luZGV4
KTsKKyAgICAgICAgICAgIGlmICgvXlxzKy8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAg
ICAgICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wq
Ly50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBy
ZWxldmFudFRleHQuc2VhcmNoKC9cKlwvLyk7CisgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4
IDwgMCkKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRlcm1pbmF0ZWQgY29tbWVu
dCIpOworICAgICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZEluZGV4OworICAgICAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9cLy4q
Ly50ZXN0KHJlbGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBS
ZWdFeHAubGFzdE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICAvLyBGSVhNRTogTWFrZSB0aGlzIGRvIFVuaWNvZGUuCisgICAgICAgIGlmICgvXlteXGRcV11c
dyovLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImlkZW50
aWZpZXIiKTsKKworICAgICAgICBpZiAoL15bMC05XSsvLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAg
ICAgICAgICAgIHJldHVybiByZXN1bHQoImludExpdGVyYWwiKTsKKworICAgICAgICAvLyBGSVhN
RTogTWFrZSB0aGlzIGhhbmRsZSBleHAtZm9ybSBsaXRlcmFscyBsaWtlIDFlMS4KKyAgICAgICAg
aWYgKC9eKFswLTldKlwuWzAtOV0rKXwoWzAtOV0rXC5bMC05XSopLy50ZXN0KHJlbGV2YW50VGV4
dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJkb3VibGVMaXRlcmFsIik7CisgICAgICAg
IAorICAgICAgICBpZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8aWZ8ZWxzZXxlbnVtfGNvbnRp
bnVlfGJyZWFrfHN3aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxlfGRvfHJldHVybnxzaXplb2Z8
Y29uc3RhbnR8ZGV2aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVyYXRvcnxudWxsKS8udGVzdChy
ZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgia2V5d29yZCIpOworICAg
ICAgICAKKyAgICAgICAgaWYgKC9eKFt7fSgpXFtcXT86PSsqXC8sLiUhfl4mfDw+XFwtXXwtPnw9
Pnw8PXw9PXwhPXxcKz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0pLy50ZXN0KHJlbGV2YW50VGV4
dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVhdGlvbiIpOworICAgICAgICAK
KyAgICAgICAgZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3aXRoOiAiICsgcmVs
ZXZhbnRUZXh0LnN1YnN0cmluZygwLCAxMCkpOworICAgIH0KKyAgICAKKyAgICBwdXNoKHRva2Vu
KQorICAgIHsKKyAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7CisgICAgfQorICAgIAor
ICAgIHBlZWsoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5leHQoKTsKKyAgICAgICAg
cHVzaChyZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBm
YWlsKGVycm9yKQorICAgIHsKKyAgICAgICAgdGhyb3cgbmV3IEFMU3ludGF4RXJyb3IodGhpcy5v
cmlnaW5TdHJpbmcsIGVycm9yKTsKKyAgICB9CisgICAgCisgICAgYmFja3RyYWNraW5nU2NvcGUo
Y2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgc3RhdGUgPSB0aGlzLnN0YXRlOworICAgICAg
ICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7CisgICAgICAgIH0gY2F0Y2gg
KGUpIHsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgQUxTeW50YXhFcnJvcikgeworICAg
ICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4g
bnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAg
ICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDcx
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIExleGVyVG9rZW4geworICAgIGNvbnN0cnVjdG9yKGxleGVyLCBvcmln
aW4sIGluZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhl
cjsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9pbmRleCA9
IGluZGV4OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAgICAgICAgdGhpcy5fdGV4dCA9
IHRleHQ7CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLl9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4dCgpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpCisgICAg
eworICAgICAgICByZXR1cm4gdGhpcy5fb3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQgaW5k
ZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4OworICAgIH0KKyAgICAKKyAg
ICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbGV4ZXIubGlu
ZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdp
blN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5vcmlnaW4gKyAiOiIgKyAodGhp
cy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7Cisg
ICAgICAgIHJldHVybiAiTGV4ZXJUb2tlbigiICsgdGhpcy5raW5kICsgIiwgIiArIHRoaXMudGV4
dCArICIsICIgKyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7CisgICAgfQorfQpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvTmFtZUNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmFt
ZUNvbnRleHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY29uc3Qg
Tm90RnVuYyA9IFN5bWJvbCgpOworCitmdW5jdGlvbiBpc1dpbGRjYXJkS2luZChraW5kKQorewor
ICAgIHJldHVybiBraW5kID09IE5vdEZ1bmM7Cit9CisKK2NsYXNzIE5hbWVDb250ZXh0IHsKKyAg
ICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2Z1bmNNYXAgPSBu
ZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5f
ZGVmaW5lZCA9IG5ldyBTZXQoKTsKKyAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9IG51
bGw7CisgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbnVsbDsKKyAgICAgICAgdGhpcy5faW50cmlu
c2ljcyA9IG51bGw7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBudWxsOworICAgIH0KKyAgICAK
KyAgICBtYXBGb3Ioa2luZCkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoa2luZCkgeworICAgICAg
ICBjYXNlIE5vdEZ1bmM6CisgICAgICAgIGNhc2UgVmFsdWU6CisgICAgICAgIGNhc2UgVHlwZToK
KyAgICAgICAgY2FzZSBQcm90b2NvbDoKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXA7Cisg
ICAgICAgIGNhc2UgRnVuYzoKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9mdW5jTWFwOworICAg
ICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQga2luZDogIiAr
IGtpbmQpOworICAgICAgICB9CisgICAgfQorICAgIAorICAgIGFkZCh0aGluZykKKyAgICB7Cisg
ICAgICAgIGlmICghdGhpbmcubmFtZSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisg
ICAgICAgIGlmICh0aGluZy5pc05hdGl2ZSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnRy
aW5zaWNzKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTmF0aXZlIGZ1bmN0aW9u
IGluIGEgc2NvcGUgdGhhdCBkb2VzIG5vdCByZWNvZ25pemUgaW50cmluc2ljcyIpOworICAgICAg
ICAgICAgdGhpcy5faW50cmluc2ljcy5hZGQodGhpbmcpOworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICBpZiAodGhpbmcua2luZCA9PSBGdW5jKSB7CisgICAgICAgICAgICBsZXQgYXJyYXkg
PSB0aGlzLl9mdW5jTWFwLmdldCh0aGluZy5uYW1lKTsKKyAgICAgICAgICAgIGlmICghYXJyYXkp
CisgICAgICAgICAgICAgICAgdGhpcy5fZnVuY01hcC5zZXQodGhpbmcubmFtZSwgYXJyYXkgPSBb
XSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5nKTsKKyAgICAgICAgICAgIHJldHVybjsK
KyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5fbWFwLmhhcyh0aGluZy5uYW1lKSkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAi
RHVwbGljYXRlIG5hbWU6ICIgKyB0aGluZy5uYW1lKTsKKyAgICAgICAgdGhpcy5fbWFwLnNldCh0
aGluZy5uYW1lLCB0aGluZyk7CisgICAgfQorICAgIAorICAgIGdldChraW5kLCBuYW1lKQorICAg
IHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG1hcEZvcihraW5kKS5nZXQobmFtZSk7CisgICAgICAg
IGlmICghcmVzdWx0ICYmIHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMu
X2RlbGVnYXRlLmdldChraW5kLCBuYW1lKTsKKyAgICAgICAgaWYgKCFpc1dpbGRjYXJkS2luZChr
aW5kKSAmJiByZXN1bHQua2luZCAhPSBraW5kKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGdldCBjdXJyZW50U3RhdGVt
ZW50KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9jdXJyZW50U3RhdGVtZW50KQorICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIGlmICh0aGlzLl9k
ZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5jdXJyZW50U3RhdGVt
ZW50OworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgaXNEZWZpbmVkKHRo
aW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2RlZmluZWQuaGFzKHRoaW5nKQorICAg
ICAgICAgICAgfHwgKHRoaXMuX2RlbGVnYXRlICYmIHRoaXMuX2RlbGVnYXRlLmlzRGVmaW5lZCh0
aGluZykpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmUodGhpbmcpCisgICAgeworICAgICAgICB0
aGlzLl9kZWZpbmVkLnNldCh0aGluZyk7CisgICAgfQorICAgIAorICAgIGRlZmluZUFsbCgpCisg
ICAgeworICAgICAgICBmb3IgKGxldCB0aGluZyBvZiB0aGlzKQorICAgICAgICAgICAgZGVmaW5l
KHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZG9TdGF0ZW1lbnQoc3RhdGVtZW50LCBjYWxsYmFj
aykKKyAgICB7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7Cisg
ICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxs
OworICAgICAgICBkZWZpbmUoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVjb2duaXpl
SW50cmluc2ljcygpCisgICAgeworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbmV3IEludHJp
bnNpY3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGludHJpbnNpY3MoKQorICAgIHsKKyAgICAg
ICAgaWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50cmlu
c2ljczsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRo
aXMuX2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAg
ICAKKyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0g
PSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHByb2dyYW0oKQorICAgIHsKKyAgICAgICAg
aWYgKHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbTsKKyAg
ICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVn
YXRlLnByb2dyYW07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAqW1N5
bWJvbC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgbWFwIG9mIHRoaXMuX21h
cC52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcy52
YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVsZCB0eXBlOworICAgICAgICB9CisgICAgfQor
fQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZVJlc29sdmVyLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL05hbWVSZXNvbHZlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9OYW1lUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworLy8gVGhpcyBvbmx5IHJlc29sdmVzIG5hbWVzLiBBZnRlciB0aGlzIHBoYXNl
IHJ1bnMsIGFsbCBuYW1lcyB3aWxsIGJlIHJlc29sdmVkLiBUaGlzIG1lYW5zIHRoYXQgYWxsCisv
LyBYWVpSZWYgb2JqZWN0cyBub3cga25vdyB3aG8gdGhleSByZXNvbHZlIHRvLiBUaGlzIGRvZXMg
bm90IHlldCBhbGxvdyB0eXBlIGFuYWx5c2lzLCBiZWNhdXNlIHRoZXJlCisvLyBhcmUgc3RpbGwg
VHlwZURlZnMuIFRoaXMgdGhyb3dzIHR5cGUgZXJyb3JzIGZvciBmYWlsZWQgbmFtZSByZXNvbHV0
aW9ucyBhbmQgZm9yIHRoaW5ncyB0aGF0IGFyZQorLy8gbW9yZSBjb252ZW5pZW50IHRvIGNoZWNr
IGhlcmUgdGhhbiBpbiB0aGUgQ2hlY2tlci4gVGhpcyB1c3VhbGx5IGludm9sdmVzIHRoaW5ncyB0
aGF0IG5lZWQgdG8gYmUKKy8vIGNoZWNrZWQgYmVmb3JlIFR5cGVSZWZUb1R5cGVEZWZTa2lwcGVy
LgorY2xhc3MgTmFtZVJlc29sdmVyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgLy8gSXQncyB0b3Rh
bGx5IE9LIHRvIGluc3RhbnRpYXRlIHRoaXMgd2l0aCB6ZXJvIGFyZ3VtZW50cyAoaS5lLiBwYXNz
aW5nIHVuZGVmaW5lZCBmb3IgYm90aCBvZgorICAgIC8vIHRoZW0pIGlmIHlvdSdyZSBjcmVhdGlu
ZyBhIENoZWNrZXIgdG8gdmlzaXQgYSBQcm9ncmFtLgorICAgIGNvbnN0cnVjdG9yKG5hbWVDb250
ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZUNvbnRleHQgPSBuYW1lQ29udGV4dDsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFt
ZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBu
YW1lQ29udGV4dC5wcm9ncmFtID0gbm9kZTsKKyAgICAgICAgbmFtZUNvbnRleHQucmVjb2duaXpl
SW50cmluc2ljcygpOworICAgICAgICBub2RlLmludHJpbnNpY3MgPSBuYW1lQ29udGV4dC5pbnRy
aW5zaWNzOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRl
bWVudHMpCisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAg
bGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0
IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIG5hbWVD
b250ZXh0LmRvU3RhdGVtZW50KCgpID0+IHN0YXRlbWVudC52aXNpdChjaGVja2VyKSk7CisgICAg
fQorICAgIAorICAgIF92aXNpdFR5cGVQYXJhbWV0ZXJzQW5kQnVpbGROYW1lQ29udGV4dChub2Rl
KQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMu
X25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5
cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRl
cik7CisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICB9Cisg
ICAgICAgIHJldHVybiBuYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jKG5v
ZGUpCisgICAgeworICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKHRoaXMuX3Zpc2l0
VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAgICAgICAgbm9kZS5y
ZXR1cm5UeXBlLnZpc2l0KGNoZWNrZXIpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Yg
bm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXIpOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBj
b250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzID0gdGhpcy5fdmlzaXRUeXBlUGFyYW1ldGVyc0FuZEJ1
aWxkTmFtZUNvbnRleHQobm9kZSk7CisgICAgICAgIGxldCBjaGVja2VyV2l0aFR5cGVQYXJhbWV0
ZXJzID0gbmV3IENoZWNrZXIoY29udGV4dFdpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAgIG5v
ZGUucmV0dXJuVHlwZS52aXNpdChjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAg
bGV0IGNvbnRleHRXaXRoUGFyYW1ldGVycyA9IG5ldyBOYW1lQ29udGV4dChjb250ZXh0V2l0aFR5
cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgZm9yIChsZXQgcGFyYW1ldGVyIG9mIG5vZGUucGFyYW1l
dGVycykgeworICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFt
ZXRlcnMpOworICAgICAgICAgICAgY29udGV4dFdpdGhQYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIp
OworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyV2l0aFBhcmFtZXRlcnMgPSBuZXcgQ2hl
Y2tlcihjb250ZXh0V2l0aFBhcmFtZXRlcnMpOworICAgICAgICBub2RlLmJvZHkudmlzaXQoY2hl
Y2tlcldpdGhQYXJhbWV0ZXJzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQor
ICAgIHsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuZXcgTmFtZUNvbnRleHQo
dGhpcy5fbmFtZUNvbnRleHQpKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUu
c3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdChjaGVja2VyKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBu
YW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAg
IG5hbWVDb250ZXh0LmFkZChub2RlLnR5cGVWYXJpYWJsZSk7CisgICAgICAgIGxldCBjaGVja2Vy
ID0gbmV3IENoZWNrZXIobmFtZUNvbnRleHQpOworICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUg
b2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAgICAgc2lnbmF0dXJlLnZpc2l0KGNoZWNrZXIp
OworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxl
dCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAg
ICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAg
ICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVDb250
ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9
IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KGNoZWNr
ZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAg
ICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7
CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykg
eworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIG5h
bWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgY2hl
Y2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQg
b2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52aXNpdChjaGVja2VyKTsKKyAgICB9
CisgICAgCisgICAgX3Jlc29sdmVUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMpCisgICAgewor
ICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsK
KyAgICAgICAgICAgIGxldCB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ldOworICAgICAg
ICAgICAgaWYgKHR5cGVBcmd1bWVudCBpbnN0YW5jZW9mIFR5cGVPclZhcmlhYmxlUmVmKSB7Cisg
ICAgICAgICAgICAgICAgbGV0IHRoaW5nID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KE5vdEZ1bmMs
IHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaW5nKQorICAgICAg
ICAgICAgICAgICAgICBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAi
Q291bGQgbm90IGZpbmQgdHlwZSBvciB2YXJpYWJsZSBuYW1lZCAiICsgdHlwZUFyZ3VtZW50Lm5h
bWUpOworICAgICAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIFZhbHVlKSB7CisgICAg
ICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBWYXJpYWJsZVJlZih0eXBlQXJn
dW1lbnQub3JpZ2luLCB0eXBlQXJndW1lbnQubmFtZSk7CisgICAgICAgICAgICAgICAgfSBlbHNl
CisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBUeXBlUmVmKHR5cGVB
cmd1bWVudC5vcmlnaW4sIHR5cGVBcmd1bWVudC5uYW1lLCBbXSk7CisgICAgICAgICAgICB9Cisg
ICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRbaV0gaW5zdGFuY2VvZiBW
YWx1ZQorICAgICAgICAgICAgICAgICYmICF0eXBlQXJndW1lbnRbaV0uaXNDb25zdGV4cHIpCisg
ICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0
cmluZywgIkV4cGVjdGVkIGNvbnN0ZXhwciIpOworICAgICAgICB9CisgICAgfQorICAgIAorICAg
IHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fcmVzb2x2ZVR5cGVBcmd1
bWVudHMobm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGxldCB0eXBlID0g
dGhpcy5fbmFtZUNvbnRleHQuZ2V0KFR5cGUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghdHlw
ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5T
dHJpbmcsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAg
ICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmlzRGVmaW5lZCh0eXBlKSkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJJbGxlZ2FsIGZv
cndhcmQgdXNlIG9mIHR5cGUgbmFtZWQgIiArIG5vZGUubmFtZSk7CisgICAgICAgIG5vZGUudHlw
ZSA9IHR5cGU7CisgICAgICAgIAorICAgICAgICBpZiAodHlwZS50eXBlUGFyYW1ldGVycy5sZW5n
dGggIT0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHRocm93IG5ldyBB
TFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJn
dW1lbnRzIik7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZS50eXBlUGFyYW1ldGVy
cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcklzVHlwZSA9IHR5cGUu
dHlwZVBhcmFtZXRlcnNbaV0gaW5zdGFuY2VvZiBUeXBlVmFyaWFibGU7CisgICAgICAgICAgICBs
ZXQgYXJndW1lbnRJc1R5cGUgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0gaW5zdGFuY2VvZiBUeXBl
OworICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzW2ldLnZpc2l0KHRoaXMpOworICAgICAg
ICAgICAgaWYgKHBhcmFtZXRlcklzVHlwZSAmJiAhYXJndW1lbnRJc1R5cGUpCisgICAgICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJFeHBlY3Rl
ZCB0eXBlLCBidXQgZ290IHZhbHVlIGF0IGFyZ3VtZW50ICMiICsgaSk7CisgICAgICAgICAgICBp
ZiAoIXBhcmFtZXRlcklzVHlwZSAmJiBhcmd1bWVudElzVHlwZSkKKyAgICAgICAgICAgICAgICB0
aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIkV4cGVjdGVkIHZhbHVl
LCBidXQgZ290IHR5cGUgYXQgYXJndW1lbnQgIyIgKyBpKTsKKyAgICAgICAgfQorCisgICAgICAg
IHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZWZlcmVu
Y2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNv
bnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5kZWZpbmVBbGwo
KTsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgQ2hlY2tlcihuYW1lQ29udGV4
dCkpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAg
ICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFZhbHVlLCBub2RlLm5hbWUp
OworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJv
cihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB2YXJpYWJsZSBuYW1l
ZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHJlc3VsdDsKKyAgICB9
CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUuZnVuYyA9
IHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAgIHN1cGVyLnZpc2l0
UmV0dXJuKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUp
CisgICAgeworICAgICAgICB0aGlzLl9yZXNvbHZlVHlwZUFyZ3VtZW50cyhub2RlLnR5cGVBcmd1
bWVudHMpOworICAgICAgICBzdXBlci52aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpOworICAgIH0K
K30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlRnVuYy5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVGdW5jLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL05hdGl2ZUZ1bmMuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBOYXRpdmVGdW5jIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycykKKyAg
ICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9
IG5hbWU7CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICB0
aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9wYXJh
bWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0
dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0K
KworICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAibmF0aXZlICIgKyBzdXBl
ci50b1N0cmluZygpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZl
VHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVUeXBlIGV4dGVuZHMgVHlw
ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBpc1ByaW1pdGl2ZSwgdHlwZVBhcmFt
ZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRo
aXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZl
OworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyBy
ZXR1cm4gdGhpcy5faXNQcmltaXRpdmU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJl
dHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJu
IHRydWU7IH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsKKyAg
ICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMubGVu
Z3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgdHlwZSBh
cmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHMu
bGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgTmF0
aXZlVHlwZUluc3RhbmNlKHRoaXMsIHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIm5hdGl2ZSAiICsgKHRoaXMuaXNQcmlt
aXRpdmUgPyAicHJpbWl0aXZlICIgOiAiIikgKyAidHlwZSAiICsgdGhpcy5uYW1lICsgIjwiICsg
dGhpcy50eXBlUGFyYW1ldGVycyArICI+IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlM
YW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgTmF0aXZlVHlwZUluc3RhbmNlIGV4dGVuZHMgVHlwZSB7CisgICAgY29u
c3RydWN0b3IodHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX3R5cGUg
PSB0eXBlOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAg
ICB9CisgICAgCisgICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgZ2V0
IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRzOyB9CisgICAgZ2V0
IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5fdHlwZS5pc1ByaW1pdGl2ZTsgfQorICAgIGdl
dCBpc05hdGl2ZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICh0aGlzLnR5cGUgIT0gb3Ro
ZXIudHlwZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMudHlw
ZUFyZ3VtZW50cy5sZW5ndGggIT0gb3RoZXIudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy50eXBl
QXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3Vt
ZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5cGVBcmd1bWVudHNbaV0p
KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMudHlwZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+IjsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05vZGUuanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvTm9kZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9O
b2RlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTm9kZSB7
CisgICAgdmlzaXQodmlzaXRvcikKKyAgICB7CisgICAgICAgIGxldCByZXR1cm5WYWx1ZSA9IHZp
c2l0b3JbInZpc2l0IiArIHRoaXMuY29uc3RydWN0b3IubmFtZV0odGhpcyk7CisgICAgICAgIGlm
ICgicmV0dXJuVmFsdWUiIGluIHZpc2l0b3IpCisgICAgICAgICAgICByZXR1cm4gdmlzaXRvci5y
ZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOworICAgIH0KKyAgICAKKyAg
ICB1bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0IHVu
aWZ5VGhpcyA9IHRoaXMudW5pZnlOb2RlOworICAgICAgICBsZXQgdW5pZnlPdGhlciA9IG90aGVy
LnVuaWZ5Tm9kZTsKKyAgICAgICAgaWYgKHVuaWZ5T3RoZXIudHlwZVZhcmlhYmxlVW5pZnkodW5p
ZmljYXRpb25Db250ZXh0LCB1bmlmeVRoaXMpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgICAgIHJldHVybiB1bmlmeVRoaXMudW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgdW5p
ZnlPdGhlcik7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQs
IG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKG90aGVyLnR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZp
Y2F0aW9uQ29udGV4dCwgdGhpcykpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAg
cmV0dXJuIHRoaXMgPT0gb3RoZXI7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5
KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgfQorICAgIAorICAgIGdldCB1bmlmeU5vZGUoKSB7IHJldHVybiB0aGlzOyB9CisgICAg
Z2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaXNOYXRp
dmUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIGVxdWFscyhvdGhlcikKKyAgICB7Cisg
ICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRpb25Db250ZXh0KCk7
CisgICAgICAgIHJldHVybiB0aGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpICYm
IHVuaWZpY2F0aW9uQ29udGV4dC5pc1VudW5pZmllZCgpOworICAgIH0KKyAgICAKKyAgICBzdWJz
dGl0dXRlKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLnZpc2l0KFN1YnN0aXR1dGlvbi5tYXBwaW5nKHBhcmFtZXRlcnMsIGFyZ3VtZW50TGlzdCkp
OworICAgIH0KKyAgICAKKyAgICBzdWJzdGl0dXRlVG9VbmlmaWNhdGlvbihwYXJhbWV0ZXJzLCB1
bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICByZXR1cm4gc3Vic3RpdHV0ZShwYXJh
bWV0ZXJzLCBwYXJhbWV0ZXJzLm1hcCh0eXBlID0+IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHR5
cGUpKSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTnVsbFR5cGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTnVsbFR5cGUuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvTnVsbFR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBOdWxsVHlwZSBleHRlbmRzIFR5cGUgeworICAgIC8vIEZJWE1F
OiBUaGlzIHdpbGwgaGF2ZSB0byBiZWhhdmUgbGlrZSBhIHR5cGUgdmFyaWFibGUgZm9yIHRoZSBw
dXJwb3NlcyBvZiB1bmlmaWNhdGlvbiwgc28gdGhhdAorICAgIC8vIGl0IGNhbiBiZSB1bmlmaWVk
IHdpdGggYW55IHBvaW50ZXIgdHlwZS4gVGhlbiwgd2UgY2FuIGRvIGEgdmVyaWZpY2F0aW9uIGF0
IHRoZSBlbmQgdG8gc2VlIGlmCisgICAgLy8gd2UgZ290IHVuaWZpZWQgd2l0aCBhIHBvaW50ZXIg
dHlwZS4KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvUGFyc2UuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvUGFyc2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2MjkgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
ZnVuY3Rpb24gcGFyc2UocHJvZ3JhbSwgb3JpZ2luLCBsaW5lTnVtYmVyT2Zmc2V0LCB0ZXh0KQor
eworICAgIGxldCBsZXhlciA9IG5ldyBMZXhlcihvcmlnaW4sIGxpbmVOdW1iZXJPZmZzZXQsIHRl
eHQpOworICAgIAorICAgIC8vIFRoZSBoYXJkZXN0IHBhcnQgb2YgZGVhbGluZyB3aXRoIEMtbGlr
ZSBsYW5ndWFnZXMgaXMgcGFyc2luZyB2YXJpYWJsZSBkZWNsYXJhdGlvbiBzdGF0ZW1lbnRzLgor
ICAgIC8vIExldCdzIGNvbnNpZGVyIGlmIHRoaXMgaGFwcGVucyBpbiBBcnJheUxhbmcuIEhlcmUg
YXJlIHRoZSB2YWxpZCBzdGF0ZW1lbnRzIGluIEFycmF5TGFuZyB0aGF0CisgICAgLy8gYmVnaW4g
d2l0aCBhbiBpZGVudGlmaWVyLCBpZiB3ZSBhc3N1bWUgdGhhdCBhbnkgZXhwcmVzc2lvbiBjYW4g
YmUgYSBzdGFuZGFsb25lIHN0YXRlbWVudC4KKyAgICAvLworICAgIC8vICAgICB4OworICAgIC8v
ICAgICB4IDxiaW5vcD4geTsKKyAgICAvLyAgICAgeCA8IHk7CisgICAgLy8gICAgIHggPCB5ID4g
ejsKKyAgICAvLyAgICAgeCA9IHk7CisgICAgLy8gICAgIHguZiA9IHk7CisgICAgLy8gICAgIFxl
eHAgPSB5OworICAgIC8vICAgICB4WzQyXSA9IHk7CisgICAgLy8gICAgIHgoKTsKKyAgICAvLyAg
ICAgeDx5PigpOworICAgIC8vICAgICB4IHk7CisgICAgLy8gICAgIHg8eT4gejsKKyAgICAvLyAg
ICAgZGV2aWNlIHhbXSB5OworICAgIC8vICAgICB4WzQyXSB5OworICAgIC8vICAgICBkZXZpY2Ug
eF4geTsKKyAgICAvLyAgICAgdGhyZWFkIHheXiB5OworICAgIC8vICAgICB4XnRocmVhZF50aHJl
YWQgeTsKKyAgICAvLyAgICAgeF5kZXZpY2VedGhyZWFkIHk7CisgICAgLy8KKyAgICAvLyBUaGlz
IGhhcyB0d28gcHJvYmxlbSBhcmVhczoKKyAgICAvLworICAgIC8vICAgICAtIHg8eT56IGNhbiBw
YXJzZSB0d28gZGlmZmVyZW50IHdheXMgKGFzICh4IDwgeSkgPiB6IG9yIHg8eT4geikuCisgICAg
Ly8gICAgIC0geFs0Ml0gY291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9yIGEgdmFy
aWFibGUgZGVjbGFyYXRpb24uCisgICAgLy8gICAgIC0geDx5PiBjb3VsZCBiZWNvbWUgZWl0aGVy
IGFuIGFzc2lnbm1lbnQgb3IgYSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAvLworICAgIC8v
IFdlIHNvbHZlIHRoZSBmaXJzdCBwcm9ibGVtIGJ5IGZvcmJpZGRpbmcgZXhwcmVzc2lvbnMgYXMg
c3RhdGVtZW50cy4gVGhlIGxhY2sgb2YgZnVuY3Rpb24KKyAgICAvLyBwb2ludGVycyBtZWFucyB0
aGF0IHdlIGNhbiBzdGlsbCBhbGxvdyBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudHMgLSB1bmxpa2Ug
aW4gQywgdGhvc2UgY2Fubm90CisgICAgLy8gaGF2ZSBhcmJpdHJhcnkgZXhwcmVzc2lvbnMgYXMg
dGhlIGNhbGxlZS4gVGhlIHJlbWFpbmluZyB0d28gcHJvYmxlbXMgYXJlIHNvbHZlZCBieQorICAg
IC8vIGJhY2t0cmFja2luZy4gSW4gYWxsIG90aGVyIHJlc3BlY3RzLCB0aGlzIGlzIGEgc2ltcGxl
IHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlci4KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmljQ29u
c3VtZShjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLm5leHQoKTsK
KyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQg
ZW5kIG9mIGZpbGUiKTsKKyAgICAgICAgaWYgKGNhbGxiYWNrKHRva2VuKSkKKyAgICAgICAgICAg
IGxleGVyLmZhaWwoIlVuZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50ZXh0ICsgIjsgZXhwZWN0
ZWQ6ICIgKyB0ZXh0KTsKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKyAgICAKKyAgICBm
dW5jdGlvbiBjb25zdW1lKC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWND
b25zdW1lKHRva2VuID0+IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gY29uc3VtZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIHJldHVybiBn
ZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBhc3NlcnROZXh0KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgbGV4ZXIu
cHVzaChjb25zdW1lKC4uLnRleHRzKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGdlbmVy
aWNUZXN0KGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygp
OworICAgICAgICBpZiAodG9rZW4gJiYgY2FsbGJhY2sodG9rZW4pKQorICAgICAgICAgICAgcmV0
dXJuIHRva2VuOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gdGVzdCguLi50ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljVGVzdCh0b2tl
biA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHRlc3RLaW5kKGtpbmQpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Rlc3QodG9r
ZW4gPT4gdG9rZW4ua2luZCA9PSBraW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5
Q29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0KC4uLnRl
eHRzKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5Q29uc3Vt
ZUtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0S2luZChraW5kKTsK
KyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQcm90b2NvbFJl
ZigpCisgICAgeworICAgICAgICBsZXQgcHJvdG9jb2xUb2tlbiA9IGNvbnN1bWVLaW5kKCJpZGVu
dGlmaWVyIik7CisgICAgICAgIHJldHVybiBuZXcgUHJvdG9jb2xSZWYocHJvdG9jb2xUb2tlbi5v
cmlnaW4sIHByb3RvY29sVG9rZW4udGV4dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGNv
bnN1bWVFbmRPZlR5cGVBcmdzKCkKKyAgICB7CisgICAgICAgIGxldCByaWdodFNoaWZ0ID0gdHJ5
Q29uc3VtZSgiPj4iKTsKKyAgICAgICAgaWYgKHJpZ2h0U2hpZnQpCisgICAgICAgICAgICBsZXhl
ci5wdXNoKG5ldyBMZXhlclRva2VuKGxleGVyLCByaWdodFNoaWZ0Lm9yaWdpbiwgcmlnaHRTaGlm
dC5pbmRleCwgcmlnaHRTaGlmdC5raW5kLCAiPiIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAg
ICAgY29uc3VtZSgiPiIpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVQYXJh
bWV0ZXJzKCkKKyAgICB7CisgICAgICAgIGlmICghdGVzdCgiPCIpKQorICAgICAgICAgICAgcmV0
dXJuIFtdOworICAgICAgICAKKyAgICAgICAgbGV0IHJlc3VsdCA9IFtdOworICAgICAgICBjb25z
dW1lKCI8Iik7CisgICAgICAgIHdoaWxlICghdGVzdCgiPiIpKSB7CisgICAgICAgICAgICBsZXQg
Y29uc3RleHByID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAg
ICAgIGxldCB0eXBlID0gcGFyc2VUeXBlKCk7CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBj
b25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwi
LCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RleHByVHlwZVBh
cmFtZXRlcih0eXBlLm9yaWdpbiwgbmFtZSwgdHlwZSk7CisgICAgICAgICAgICB9KTsKKyAgICAg
ICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29uc3Rl
eHByKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gY29u
c3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgICAgICAgICBsZXQgcHJvdG9jb2wgPSB0
cnlDb25zdW1lKCI6IikgPyBwYXJzZVByb3RvY29sUmVmKCkgOiBudWxsOworICAgICAgICAgICAg
ICAgIHJlc3VsdC5wdXNoKG5ldyBUeXBlVmFyaWFibGUobmFtZS5vcmlnaW4sIG5hbWUudGV4dCwg
cHJvdG9jb2wpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgi
LCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWVF
bmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAg
IGZ1bmN0aW9uIHBhcnNlVGVybSgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47CisgICAgICAg
IGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIm51bGwiKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcg
TnVsbCh0b2tlbi5vcmlnaW4pOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lS2luZCgi
aWRlbnRpZmllciIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVJlZih0b2tlbi5v
cmlnaW4sIHRva2VuLnRleHQpOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lS2luZCgi
aW50TGl0ZXJhbCIpKSB7CisgICAgICAgICAgICBsZXQgaW50VmVyc2lvbiA9IHRva2VuLnRleHQg
fCAwOworICAgICAgICAgICAgaWYgKGludFZlcnNpb24gIT0gdG9rZW4udGV4dCkKKyAgICAgICAg
ICAgICAgICBsZXhlci5mYWlsKCJJbnRlZ2VyIGxpdGVyYWwgaXMgbm90IDMyLWJpdCBpbnRlZ2Vy
Iik7CisgICAgICAgICAgICByZXR1cm4gbmV3IEludExpdGVyYWwodG9rZW4ub3JpZ2luLCBpbnRW
ZXJzaW9uKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGSVhNRTogTmVlZCBzdXBwb3J0IGZvciBm
bG9hdCBsaXRlcmFscyBhbmQgcHJvYmFibHkgb3RoZXIgbGl0ZXJhbHMgdG9vLgorICAgICAgICB0
b2tlbiA9IGNvbnN1bWVLaW5kKCJkb3VibGVMaXRlcmFsIik7CisgICAgICAgIHJldHVybiBuZXcg
RG91YmxlTGl0ZXJhbCh0b2tlbi5vcmlnaW4sICt0b2tlbi50ZXh0KTsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VDb25zdGV4cHIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNl
VGVybSgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVBcmd1bWVudHMoKQor
ICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8IikpCisgICAgICAgICAgICByZXR1cm4gW107Cisg
ICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gW107CisgICAgICAgIGNvbnN1bWUoIjwiKTsK
KyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+IikpIHsKKyAgICAgICAgICAgIC8vIEl0J3MgcG9zc2li
bGUgZm9yIGEgY29uc3RleHByIG9yIHR5cGUgY2FuIHN5bnRhY3RpY2FsbHkgb3ZlcmxhcCBpbiB0
aGUgc2luZ2xlCisgICAgICAgICAgICAvLyBpZGVudGlmaWVyIGNhc2UuIExldCdzIGNvbnNpZGVy
IHRoZSBwb3NzaWJpbGl0aWVzOgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBU
ICAgICAgICAgIGNvdWxkIGJlIHR5cGUgb3IgY29uc3RleHByCisgICAgICAgICAgICAvLyAgICAg
VFtdICAgICAgICBvbmx5IHR5cGUKKyAgICAgICAgICAgIC8vICAgICBUWzQyXSAgICAgIG9ubHkg
dHlwZSAoY29uc3RleHByIGNhbm5vdCBkbyBpbmRleGluZykKKyAgICAgICAgICAgIC8vICAgICA0
MiAgICAgICAgIG9ubHkgY29uc3RleHByCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8g
SW4gdGhlIGZ1dHVyZSB3ZSdsbCBhbGxvdyBjb25zdGV4cHJzIHRvIGRvIG1vcmUgdGhpbmdzLCBh
bmQgdGhlbiB3ZSdsbCBzdGlsbCBoYXZlCisgICAgICAgICAgICAvLyB0aGUgcHJvYmxlbSB0aGF0
IHNvbWV0aGluZyBvZiB0aGUgZm9ybSBUWzFdWzJdWzNdLi4uIGNhbiBlaXRoZXIgYmUgYSB0eXBl
IG9yIGEKKyAgICAgICAgICAgIC8vIGNvbnN0ZXhwciwgYW5kIHdlIGNhbiBmaWd1cmUgb3V0IGlu
IHRoZSBjaGVja2VyIHdoaWNoIGl0IGlzLgorICAgICAgICAgICAgbGV0IHR5cGVPclZhcmlhYmxl
UmVmID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgICAgIGxl
dCByZXN1bHQgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgICAgIGFz
c2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHlw
ZU9yVmFyaWFibGVSZWYocmVzdWx0Lm9yaWdpbiwgcmVzdWx0LnRleHQpOworICAgICAgICAgICAg
fSk7CisgICAgICAgICAgICBpZiAodHlwZU9yVmFyaWFibGVSZWYpCisgICAgICAgICAgICAgICAg
cmVzdWx0LnB1c2godHlwZU9yVmFyaWFibGVSZWYpOworICAgICAgICAgICAgZWxzZSB7CisgICAg
ICAgICAgICAgICAgbGV0IGNvbnN0ZXhwciA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKCgpID0+
IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHBhcnNlQ29uc3RleHByKCk7Cisg
ICAgICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAg
ICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAg
ICAgICAgIGlmIChjb25zdGV4cHIpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNv
bnN0ZXhwcikKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3Vs
dC5wdXNoKHBhcnNlVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJ5
Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAg
IGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlwZSgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47
CisgICAgICAgIGxldCBhZGRyZXNzU3BhY2U7CisgICAgICAgIGxldCBhZGRyZXNzU3BhY2VDb25z
dW1lZCA9IGZhbHNlOworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKC4uLmFkZHJlc3NT
cGFjZXMpKQorICAgICAgICAgICAgYWRkcmVzc1NwYWNlID0gdG9rZW4udGV4dDsKKyAgICAgICAg
CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAg
bGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgbGV0IHR5
cGUgPSBuZXcgVHlwZVJlZihuYW1lLm9yaWdpbiwgbmFtZS50ZXh0LCB0eXBlQXJndW1lbnRzKTsK
KyAgICAgICAgCisgICAgICAgIGZ1bmN0aW9uIGdldEFkZHJlc3NTcGFjZSgpCisgICAgICAgIHsK
KyAgICAgICAgICAgIGFkZHJlc3NTcGFjZUNvbnN1bWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlm
IChhZGRyZXNzU3BhY2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3NTcGFjZTsKKyAg
ICAgICAgICAgIHJldHVybiB0cnlDb25zdW1lKC4uLmFkZHJlc3NTcGFjZXMpOworICAgICAgICB9
CisgICAgICAgIAorICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1lKCJeIiwgIlsiKSkg
eworICAgICAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIl4iKSB7CisgICAgICAgICAgICAgICAg
dHlwZSA9IG5ldyBQdHJUeXBlKHRva2VuLm9yaWdpbiwgZ2V0QWRkcmVzc1NwYWNlKCksIHR5cGUp
OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
CisgICAgICAgICAgICBpZiAodHJ5Q29uc3VtZSgiXSIpKSB7CisgICAgICAgICAgICAgICAgdHlw
ZSA9IG5ldyBBcnJheVJlZlR5cGUodG9rZW4ub3JpZ2luLCBnZXRBZGRyZXNzU3BhY2UoKSwgdHlw
ZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAg
ICAKKyAgICAgICAgICAgIHR5cGUgPSBuZXcgQXJyYXlUeXBlKHRva2VuLm9yaWdpbiwgdHlwZSwg
cGFyc2VDb25zdGV4cHIoKSk7CisgICAgICAgICAgICBjb25zdW1lKCJdIik7CisgICAgICAgIH0K
KyAgICAgICAgCisgICAgICAgIGlmIChhZGRyZXNzU3BhY2UgJiYgIWFkZHJlc3NTcGFjZUNvbnN1
bWVkKQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiQWRkcmVzcyBzcGFjZSBzcGVjaWZpZWQgZm9y
IHR5cGUgdGhhdCBkb2VzIG5vdCBuZWVkIGFkZHJlc3Mgc3BhY2UiKTsKKyAgICAgICAgCisgICAg
ICAgIHJldHVybiB0eXBlOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVEZWYo
KQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInR5cGUiKS5vcmlnaW47Cisg
ICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKS50ZXh0OworICAgICAg
ICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgIGNv
bnN1bWUoIj0iKTsKKyAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgY29u
c3VtZSgiOyIpOworICAgICAgICByZXR1cm4gbmV3IFR5cGVEZWYob3JpZ2luLCBuYW1lLCB0eXBl
UGFyYW1ldGVycywgdHlwZSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTmF0aXZl
KCkKKyAgICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1lKCJuYXRpdmUiKS5vcmlnaW47
CisgICAgICAgIGxldCBpc1R5cGUgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7Cisg
ICAgICAgICAgICBpZiAodHJ5Q29uc3VtZSgidHlwZSIpKQorICAgICAgICAgICAgICAgIHJldHVy
biAibm9ybWFsIjsKKyAgICAgICAgICAgIGNvbnN1bWUoInByaW1pdGl2ZSIpOworICAgICAgICAg
ICAgY29uc3VtZSgidHlwZSIpOworICAgICAgICAgICAgcmV0dXJuICJwcmltaXRpdmUiOworICAg
ICAgICB9KTsKKyAgICAgICAgaWYgKGlzVHlwZSkgeworICAgICAgICAgICAgbGV0IG5hbWUgPSBj
b25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSBw
YXJzZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBjb25zdW1lKCI7Iik7CisgICAgICAg
ICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5cGUob3JpZ2luLCBuYW1lLnRleHQsIGlzVHlwZSA9PSAi
cHJpbWl0aXZlIiwgcGFyYW1ldGVycyk7CisgICAgICAgIH0KKyAgICAgICAgbGV0IHJldHVyblR5
cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgbGV0IG5hbWUgPSBwYXJzZUZ1bmNOYW1lKCk7Cisg
ICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAg
ICAgbGV0IHBhcmFtZXRlcnMgPSBwYXJzZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgY29uc3VtZSgi
OyIpOworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZUZ1bmMob3JpZ2luLCBuYW1lLCByZXR1cm5U
eXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycyk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIGdlbmVyaWNQYXJzZUxlZnQodGV4dHMsIG5leHRQYXJzZXIsIGNvbnN0cnVjdG9yKQorICAg
IHsKKyAgICAgICAgbGV0IGxlZnQgPSBuZXh0UGFyc2VyKCk7CisgICAgICAgIGxldCB0b2tlbjsK
KyAgICAgICAgd2hpbGUgKHRva2VuID0gdHJ5Q29uc3VtZSguLi50ZXh0cykpCisgICAgICAgICAg
ICBsZWZ0ID0gY29uc3RydWN0b3IodG9rZW4sIGxlZnQsIG5leHRQYXJzZXIoKSk7CisgICAgICAg
IHJldHVybiBsZWZ0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUxlZnRPcGVyYXRv
ckNhbGwodGV4dHMsIG5leHRQYXJzZXIpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Bh
cnNlTGVmdCgKKyAgICAgICAgICAgIHRleHRzLCBuZXh0UGFyc2VyLAorICAgICAgICAgICAgKHRv
a2VuLCBsZWZ0LCByaWdodCkgPT4KKyAgICAgICAgICAgICAgICBuZXcgQ2FsbEV4cHJlc3Npb24o
dG9rZW4ub3JpZ2luLCAib3BlcmF0b3IiICsgdG9rZW4udGV4dCwgW10sIFtsZWZ0LCByaWdodF0p
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDYWxsRXhwcmVzc2lvbigpCisgICAg
eworICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAg
IGxldCB0eXBlQXJndW1lbnRzID0gcGFyc2VUeXBlQXJndW1lbnRzKCk7CisgICAgICAgIGNvbnN1
bWUoIigiKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50TGlzdCA9IFtdOworICAgICAgICB3aGlsZSAo
IXRlc3QoIikiKSkgeworICAgICAgICAgICAgYXJndW1lbnRMaXN0LnB1c2gocGFyc2VFeHByZXNz
aW9uKCkpOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAg
ICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgiKSIpOworICAgICAgICByZXR1
cm4gbmV3IENhbGxFeHByZXNzaW9uKG5hbWUub3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBh
cmd1bWVudExpc3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlU3Vm
Zml4KCkKKyAgICB7CisgICAgICAgIGxldCBzaW1wbGVDYXNlID0gbGV4ZXIuYmFja3RyYWNraW5n
U2NvcGUoKCkgPT4geworICAgICAgICAgICAgbGV0IGxlZnQgPSBwYXJzZVRlcm0oKTsKKyAgICAg
ICAgICAgIGxldCB0b2tlbjsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbiA9IHRyeUNvbnN1bWUo
IisrIiwgIi0tIiwgIi4iLCAiLT4iLCAiWyIpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0
b2tlbi50ZXh0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAiKysiOgorICAgICAgICAgICAgICAg
IGNhc2UgIi0tIjoKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBTdWZmaXhDYWxsQXNz
aWdubWVudCh0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBsZWZ0KTsKKyAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiLiI6CisgICAg
ICAgICAgICAgICAgY2FzZSAiLT4iOgorICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udGV4
dCA9PSAiLT4iKQorICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBEZXJlZmVyZW5j
ZUV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgbGVm
dCA9IG5ldyBEb3RFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgbGVmdCwgY29uc3VtZUtpbmQoImlk
ZW50aWZpZXIiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAg
IGNhc2UgIlsiOiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHBhcnNlRXhwcmVz
c2lvbigpOworICAgICAgICAgICAgICAgICAgICBjb25zdW1lKCJdIik7CisgICAgICAgICAgICAg
ICAgICAgIGxlZnQgPSBuZXcgSW5kZXhFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgbGVmdCwgaW5k
ZXgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAg
ICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCJCYWQgdG9rZW46ICIgKyB0b2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
fQorICAgICAgICAgICAgcmV0dXJuIGxlZnQ7CisgICAgICAgIH0pOworICAgICAgICBpZiAoc2lt
cGxlQ2FzZSkKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGVDYXNlOworICAgICAgICAKKyAgICAg
ICAgcmV0dXJuIHBhcnNlQ2FsbEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gcGFyc2VQb3NzaWJsZVByZWZpeCgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47CisgICAg
ICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIisrIiwgIi0tIiwgIisiLCAiLSIsICIhIiwgIn4i
KSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQodG9rZW4ub3JpZ2luLCAi
b3BlcmF0b3IiICsgdG9rZW4udGV4dCwgcGFyc2VQb3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAg
aWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiXiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXJl
ZmVyZW5jZUV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBwYXJzZVBvc3NpYmxlUHJlZml4KCkpOwor
ICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJcXCIpKQorICAgICAgICAgICAgcmV0dXJu
IG5ldyBNYWtlUHRyRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2libGVQcmVmaXgo
KSk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIiYiKSkKKyAgICAgICAgICAgIHJl
dHVybiBuZXcgTWFrZUFycmF5UmVmRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2li
bGVQcmVmaXgoKSk7CisgICAgICAgIHJldHVybiBwYXJzZVBvc3NpYmxlU3VmZml4KCk7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVQcm9kdWN0KCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyIqIiwgIi8iLCAiJSJdLCBwYXJzZVBv
c3NpYmxlUHJlZml4KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVN1
bSgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiKyIsICIt
Il0sIHBhcnNlUG9zc2libGVQcm9kdWN0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFy
c2VQb3NzaWJsZVNoaWZ0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRv
ckNhbGwoWyI8PCIsICI+PiJdLCBwYXJzZVBvc3NpYmxlU3VtKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxJbmVxdWFsaXR5KCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyI8IiwgIj4iLCAiPD0iLCAiPT4iXSwg
cGFyc2VQb3NzaWJsZVNoaWZ0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3Nz
aWJsZVJlbGF0aW9uYWxFcXVhbGl0eSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Bh
cnNlTGVmdCgKKyAgICAgICAgICAgIFsiPT0iLCAiIT0iXSwgcGFyc2VQb3NzaWJsZVJlbGF0aW9u
YWxJbmVxdWFsaXR5LAorICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkgPT4geworICAg
ICAgICAgICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2lu
LCAib3BlcmF0b3I9PSIsIFtdLCBbbGVmdCwgcmlnaHRdKTsKKyAgICAgICAgICAgICAgICBpZiAo
dG9rZW4udGV4dCA9PSAiIT0iKQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2Fs
bEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3IhIiwgW10sIFtyZXN1bHRdKTsKKyAg
ICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3aXNlQW5kKCkKKyAgICB7CisgICAgICAg
IHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyImIl0sIHBhcnNlUG9zc2libGVSZWxhdGlv
bmFsRXF1YWxpdHkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlQml0
d2lzZVhvcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsi
XiJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZUFuZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IHBhcnNlUG9zc2libGVCaXR3aXNlT3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVm
dE9wZXJhdG9yQ2FsbChbInwiXSwgcGFyc2VQb3NzaWJsZUJpdHdpc2VYb3IpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lvbih0ZXh0cywgbmV4dFBh
cnNlcikKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljUGFyc2VMZWZ0KAorICAgICAgICAg
ICAgdGV4dHMsIG5leHRQYXJzZXIsCisgICAgICAgICAgICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9
PiBuZXcgTG9naWNhbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCB0b2tlbi50ZXh0LCBsZWZ0LCBy
aWdodCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlTG9naWNhbEFu
ZCgpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24oWyIm
JiJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZU9yKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
cGFyc2VQb3NzaWJsZUxvZ2ljYWxPcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0
TG9naWNhbEV4cHJlc3Npb24oWyJ8fCJdLCBwYXJzZVBvc3NpYmxlTG9naWNhbEFuZCk7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVUZXJuYXJ5Q29uZGl0aW9uYWwoKQor
ICAgIHsKKyAgICAgICAgbGV0IHByZWRpY2F0ZSA9IHBhcnNlUG9zc2libGVMb2dpY2FsT3IoKTsK
KyAgICAgICAgbGV0IG9wZXJhdG9yID0gdHJ5Q29uc3VtZSgiPyIpOworICAgICAgICBpZiAoIW9w
ZXJhdG9yKQorICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZTsKKyAgICAgICAgcmV0dXJuIG5l
dyBUZXJuYXJ5RXhwcmVzc2lvbihvcGVyYXRvci5vcmlnaW4sIHByZWRpY2F0ZSwgcGFyc2VQb3Nz
aWJsZUFzc2lnbm1lbnQoKSwgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSk7CisgICAgfQorICAg
IAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KG1vZGUpCisgICAgeworICAg
ICAgICBsZXQgbGhzID0gcGFyc2VQb3NzaWJsZVRlcm5hcnlDb25kaXRpb25hbCgpOworICAgICAg
ICBsZXQgb3BlcmF0b3IgPSB0cnlDb25zdW1lKCI9IiwgIis9IiwgIi09IiwgIio9IiwgIi89Iiwg
IiU9IiwgIl49IiwgInw9IiwgIiY9Iik7CisgICAgICAgIGlmICghb3BlcmF0b3IpIHsKKyAgICAg
ICAgICAgIGlmIChtb2RlID09ICJyZXF1aXJlZCIpCisgICAgICAgICAgICAgICAgbGV4ZXIuZmFp
bCgiRXhwZWN0ZWQgYXNzaWdubWVudCIpOworICAgICAgICAgICAgcmV0dXJuIGxoczsKKyAgICAg
ICAgfQorICAgICAgICBpZiAob3BlcmF0b3IudGV4dCA9PSAiPSIpCisgICAgICAgICAgICByZXR1
cm4gbmV3IEFzc2lnbm1lbnQob3BlcmF0b3Iub3JpZ2luLCBsaHMsIHBhcnNlUG9zc2libGVBc3Np
Z25tZW50KCkpOworICAgICAgICBsZXQgbmFtZSA9ICJvcGVyYXRvciIgKyBvcGVyYXRvci50ZXh0
LnN1YnN0cmluZygwLCB0ZXJtLm9wZXJhdG9yLmxlbmd0aCAtIDEpOworICAgICAgICByZXR1cm4g
bmV3IENhbGxBc3NpZ25tZW50KG9wZXJhdG9yLm9yaWdpbiwgbmFtZSwgbGhzLCBwYXJzZVBvc3Np
YmxlQXNzaWdubWVudCgpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VBc3NpZ25t
ZW50KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgicmVx
dWlyZWQiKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VFZmZlY3RmdWxFeHByZXNz
aW9uKCkKKyAgICB7CisgICAgICAgIGxldCBhc3NpZ25tZW50ID0gbGV4ZXIuYmFja3RyYWNraW5n
U2NvcGUocGFyc2VBc3NpZ25tZW50KTsKKyAgICAgICAgaWYgKGFzc2lnbm1lbnQpCisgICAgICAg
ICAgICByZXR1cm4gYXNzaWdubWVudDsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2FsbEV4cHJlc3Np
b24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gZ2VuZXJpY1BhcnNlQ29tbWFFeHByZXNz
aW9uKGZpbmFsRXhwcmVzc2lvblBhcnNlcikKKyAgICB7CisgICAgICAgIGxldCBsaXN0ID0gW107
CisgICAgICAgIGxldCBvcmlnaW4gPSBsZXhlci5wZWVrKCk7CisgICAgICAgIGlmICghb3JpZ2lu
KQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworICAg
ICAgICBvcmlnaW4gPSBvcmlnaW4ub3JpZ2luOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAg
ICAgICBsZXQgZWZmZWN0ZnVsRXhwcmVzc2lvbiA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKHBh
cnNlRWZmZWN0ZnVsRXhwcmVzc2lvbik7CisgICAgICAgICAgICBpZiAoIWVmZmVjdGZ1bEV4cHJl
c3Npb24pIHsKKyAgICAgICAgICAgICAgICBsaXN0LnB1c2goZmluYWxFeHByZXNzaW9uUGFyc2Vy
KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAg
bGlzdC5wdXNoKGVmZmVjdGZ1bEV4cHJlc3Npb24pOworICAgICAgICAgICAgaWYgKCF0cnlDb25z
dW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0
dXJuIG5ldyBDb21tYUV4cHJlc3Npb24ob3JpZ2luLCBsaXN0KTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gcGFyc2VDb21tYUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdl
bmVyaWNQYXJzZUNvbW1hRXhwcmVzc2lvbihwYXJzZVBvc3NpYmxlQXNzaWdubWVudCk7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbigpCisgICAgeworICAgICAgICBy
ZXR1cm4gcGFyc2VDb21tYUV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
cGFyc2VFZmZlY3RmdWxTdGF0ZW1lbnQoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IGdl
bmVyaWNQYXJzZUNvbW1hRXhwcmVzc2lvbihwYXJzZUVmZmVjdGZ1bEV4cHJlc3Npb24pOworICAg
ICAgICBjb25zdW1lKCI7Iik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAor
ICAgIGZ1bmN0aW9uIHBhcnNlUmV0dXJuKCkKKyAgICB7CisgICAgICAgIGNvbnN1bWUoInJldHVy
biIpOworICAgICAgICByZXR1cm4gcGFyc2VFeHByZXNzaW9uKCk7CisgICAgfQorICAgIAorICAg
IGZ1bmN0aW9uIHBhcnNlU3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxl
eGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIjsiKSB7CisgICAgICAgICAg
ICBsZXhlci5uZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAg
ICAgICBpZiAodG9rZW4udGV4dCA9PSAicmV0dXJuIikKKyAgICAgICAgICAgIHJldHVybiBwYXJz
ZVJldHVybigpOworICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiYnJlYWsiKQorICAgICAgICAg
ICAgcmV0dXJuIHBhcnNlQnJlYWsoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImNvbnRp
bnVlIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUNvbnRpbnVlKCk7CisgICAgICAgIGlmICh0
b2tlbi50ZXh0ID09ICJ3aGlsZSIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VXaGlsZSgpOwor
ICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiZG8iKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNl
RG8oKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImZvciIpCisgICAgICAgICAgICByZXR1
cm4gcGFyc2VGb3IoKTsKKyAgICAgICAgbGV0IHZhcmlhYmxlRGVjbCA9IGxleGVyLmJhY2t0cmFj
a2luZ1Njb3BlKHBhcnNlVmFyaWFibGVEZWNsKTsKKyAgICAgICAgaWYgKHZhcmlhYmxlRGVjbCkK
KyAgICAgICAgICAgIHJldHVybiB2YXJpYWJsZURlY2w7CisgICAgICAgIHJldHVybiBwYXJzZUVm
ZmVjdGZ1bFN0YXRlbWVudCgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUJsb2Nr
KCkKKyAgICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1lKCJ7Iikub3JpZ2luOworICAg
ICAgICBsZXQgYmxvY2sgPSBuZXcgQmxvY2sob3JpZ2luKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0
KCJ9IikpIHsKKyAgICAgICAgICAgIGxldCBzdGF0ZW1lbnQgPSBwYXJzZVN0YXRlbWVudCgpOwor
ICAgICAgICAgICAgaWYgKHN0YXRlbWVudCkKKyAgICAgICAgICAgICAgICBibG9jay5wdXNoKHN0
YXRlbWVudCk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgifSIpOworICAgICAgICByZXR1
cm4gYmxvY2s7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUGFyYW1ldGVycygpCisg
ICAgeworICAgICAgICBjb25zdW1lKCIoIik7CisgICAgICAgIGxldCBwYXJhbWV0ZXJzID0gW107
CisgICAgICAgIHdoaWxlICghdGVzdCgiKSIpKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1
c2gocGFyc2VQYXJhbWV0ZXIoKSk7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkK
KyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lKCIpIik7
CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZUZ1bmNOYW1lKCkKKyAgICB7CisgICAgICAgIGlmICh0cnlDb25zdW1lKCJvcGVyYXRvciIp
KSB7CisgICAgICAgICAgICBsZXQgdG9rZW4gPSBjb25zdW1lKCIrIiwgIi0iLCAiKiIsICIvIiwg
IiUiLCAiXiIsICImIiwgInwiLCAiPCIsICI+IiwgIjw9IiwgIj49IiwgIiEiLCAiPT0iLCAiKysi
LCAiLS0iLCAiXFwiKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi50ZXh0ICE9ICJcXCIpCisgICAg
ICAgICAgICAgICAgcmV0dXJuICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0OworICAgICAgICAgICAg
Y29uc3VtZSgiWyIpOworICAgICAgICAgICAgY29uc3VtZSgiXSIpOworICAgICAgICAgICAgcmV0
dXJuICJvcGVyYXRvclxcW10iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25zdW1lS2lu
ZCgiaWRlbnRpZmllciIpLnRleHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRnVu
Y0RlZigpCisgICAgeworICAgICAgICBsZXQgcmV0dXJuVHlwZSA9IHBhcnNlVHlwZSgpOworICAg
ICAgICBsZXQgbmFtZSA9IHBhcnNlRnVuY05hbWUoKTsKKyAgICAgICAgbGV0IHR5cGVQYXJhbWV0
ZXJzID0gcGFyc2VUeXBlUGFyYW1ldGVycygpOworICAgICAgICBsZXQgcGFyYW1ldGVycyA9IHBh
cnNlUGFyYW1ldGVycygpOworICAgICAgICBsZXQgYmxvY2sgPSBwYXJzZUJsb2NrKCk7CisgICAg
ICAgIHJldHVybiBuZXcgRnVuY0RlZihyZXR1cm5UeXBlLm9yaWdpbiwgbmFtZSwgcmV0dXJuVHlw
ZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMsIGJvZHkpOworICAgIH0KKyAgICAKKyAgICBm
b3IgKDs7KSB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYg
KCF0b2tlbikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0g
IjsiKQorICAgICAgICAgICAgbGV4ZXIubmV4dCgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50
ZXh0ID09ICJ0eXBlIikKKyAgICAgICAgICAgIHBhcnNlVHlwZURlZigpOworICAgICAgICBlbHNl
IGlmICh0b2tlbi50ZXh0ID09ICJuYXRpdmUiKQorICAgICAgICAgICAgcGFyc2VOYXRpdmUoKTsK
KyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAic3RydWN0IikKKyAgICAgICAgICAgIHBh
cnNlU3RydWN0VHlwZSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJlbnVtIikK
KyAgICAgICAgICAgIHBhcnNlRW51bSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09
ICJwcm90b2NvbCIpCisgICAgICAgICAgICBwYXJzZVByb3RvY29sRGVjbCgpOworICAgICAgICBl
bHNlCisgICAgICAgICAgICBwYXJzZUZ1bmNEZWYoKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1ByZXBhcmUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
UHJlcGFyZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QcmVwYXJlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcHJlcGFyZShv
cmlnaW4sIGxpbmVOdW1iZXJPZmZzZXQsIHRleHQpCit7CisgICAgbGV0IHByb2dyYW0gPSBuZXcg
UHJvZ3JhbSgpOworICAgIHBhcnNlKHByb2dyYW0sICI8c3RkbGliPiIsIDI4LCBzdGFuZGFyZExp
YnJhcnkpOworICAgIHBhcnNlKHByb2dyYW0sIG9yaWdpbiwgbGluZU51bWJlck9mZnNldCwgdGV4
dCk7CisgICAgcmVzb2x2ZU5hbWVzKHByb2dyYW0pOworICAgIHJlc29sdmVUeXBlRGVmcyhwcm9n
cmFtKTsKKyAgICBjaGVjayhwcm9ncmFtKTsKKyAgICBpbmxpbmUocHJvZ3JhbSk7CisgICAgcmV0
dXJuIHByb2dyYW07Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9y
KCkKKyAgICB7CisgICAgICAgIHRoaXMuX3RvcExldmVsU3RhdGVtZW50cyA9IFtdOworICAgICAg
ICB0aGlzLl9mdW5jdGlvbnMgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVzID0gbmV3
IE1hcCgpOworICAgICAgICB0aGlzLl9mdW5jSW5zdGFudGlhdG9yID0gbmV3IEZ1bmNJbnN0YW50
aWF0b3IoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IHRvcExldmVsU3RhdGVtZW50cygpIHsgcmV0
dXJuIHRoaXMuX3RvcExldmVsU3RhdGVtZW50czsgfQorICAgIGdldCBmdW5jdGlvbnMoKSB7IHJl
dHVybiB0aGlzLl9mdW5jdGlvbnM7IH0KKyAgICBnZXQgdHlwZXMoKSB7IHJldHVybiB0aGlzLl90
eXBlczsgfQorICAgIGdldCBmdW5jSW5zdGFudGlhdG9yKCkgeyByZXR1cm4gdGhpcy5fZnVuY0lu
c3RhbnRpYXRvcjsgfQorICAgIAorICAgIGFkZFRvcExldmVsU3RhdGVtZW50KHN0YXRlbWVudCkK
KyAgICB7CisgICAgICAgIHN0YXRlbWVudC5wcm9ncmFtID0gdGhpczsKKyAgICAgICAgaWYgKHN0
YXRlbWVudCBpbnN0YW5jZW9mIEZ1bmMpIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IHRoaXMu
X2Z1bmN0aW9ucy5nZXQoc3RhdGVtZW50Lm5hbWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkK
KyAgICAgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbnMuc2V0KHN0YXRlbWVudC5uYW1lLCBhcnJh
eSA9IFtdKTsKKyAgICAgICAgICAgIGFycmF5LnB1c2goc3RhdGVtZW50KTsKKyAgICAgICAgfSBl
bHNlIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBUeXBlKQorICAgICAgICAgICAgdGhpcy5fdHlw
ZXMuc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQpOworICAgICAgICBlbHNlCisgICAgICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoIlN0YXRlbWVudCBpcyBub3QgYSBmdW5jdGlvbiBvciB0eXBl
OiAiICsgc3RhdGVtZW50KTsKKyAgICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzLnB1c2go
c3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVzb2x2ZUZ1bmNPdmVybG9hZChuYW1lLCB0
eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKQorICAgIHsKKyAgICAgICAgbGV0IGZ1bmN0aW9u
cyA9IHRoaXMuZnVuY3Rpb25zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisg
ICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgCisgICAgICAgIHJldHVybiByZXNvbHZl
T3ZlcmxvYWRJbXBsKGZ1bmN0aW9ucywgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7Cisg
ICAgfQorICAgIAorICAgIGdldCBuYW1lQ29udGV4dCgpCisgICAgeworICAgICAgICBsZXQgcmVz
dWx0ID0gbmV3IE5hbWVDb250ZXh0KCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiB0
aGlzLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50
KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1Byb3RvY29sLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3Rv
Y29sLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2wgZXh0ZW5k
cyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0
aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBQ
cm90b2NvbDsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLm5hbWU7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNs
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xEZWNsIGV4dGVuZHMg
UHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAg
IHN1cGVyKG9yaWdpbiwgbmFtZSkKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlcyA9IFtdOworICAg
ICAgICB0aGlzLl9zaWduYXR1cmVNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVW
YXJpYWJsZSA9IG5ldyBUeXBlVmFyaWFibGUob3JpZ2luLCBuYW1lLCBudWxsKTsKKyAgICB9Cisg
ICAgCisgICAgYWRkU2lnbmF0dXJlKHNpZ25hdHVyZSkKKyAgICB7CisgICAgICAgIC8vIE5PVEU6
IEFueSB0eXBlIHBhcmFtZXRlcnMgZm91bmQgaW4gdGhlIHNpZ25hdHVyZSBtdXN0IGJlIGluZmVy
YWJsZSBmcm9tIHRoZSB2YWx1ZQorICAgICAgICAvLyBwYXJhbWV0ZXJzLgorICAgICAgICAvLyBG
SVhNRTogQ2hlY2sgdGhpcyEgKE9PUFMhKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzLnB1c2go
c2lnbmF0dXJlKTsKKyAgICAgICAgbGV0IG92ZXJsb2FkcyA9IHRoaXMuX3NpZ25hdHVyZU1hcC5n
ZXQoc2lnbmF0dXJlLm5hbWUpOworICAgICAgICBpZiAoIW92ZXJsb2FkcykKKyAgICAgICAgICAg
IHRoaXMuX3NpZ25hdHVyZU1hcC5zZXQoc2lnbmF0dXJlLm5hbWUsIG92ZXJsb2FkcyA9IFtdKTsK
KyAgICAgICAgb3ZlcmxvYWRzLnB1c2goc2lnbmF0dXJlKTsKKyAgICB9CisgICAgCisgICAgZ2V0
IHNpZ25hdHVyZXMoKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVzOyB9CisgICAgc2lnbmF0dXJl
c0J5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9zaWduYXR1cmVNYXAuZ2V0KG5hbWUpOyB9Cisg
ICAgZ2V0IHR5cGVWYXJpYWJsZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGVWYXJpYWJsZTsgfQorICAg
IAorICAgIHNpZ25hdHVyZXNCeU5hbWVXaXRoVHlwZVZhcmlhYmxlKG5hbWUsIHR5cGVWYXJpYWJs
ZSkKKyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBuZXcgU3Vic3RpdHV0aW9uKFt0
aGlzLnR5cGVWYXJpYWJsZV0sIFt0eXBlVmFyaWFibGVdKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9
IHRoaXMuc2lnbmF0dXJlc0J5TmFtZShuYW1lKTsKKyAgICAgICAgaWYgKCFyZXN1bHQpCisgICAg
ICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoc2lnbmF0dXJl
ID0+IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICB9CisgICAgCisgICAgaW5o
ZXJpdHMob3RoZXJQcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghb3RoZXJQcm90b2NvbCkK
KyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyUHJv
dG9jb2wgaW5zdGFuY2VvZiBQcm90b2NvbFJlZikKKyAgICAgICAgICAgIG90aGVyUHJvdG9jb2wg
PSBvdGhlclByb3RvY29sLnByb3RvY29sRGVjbDsKKyAgICAgICAgCisgICAgICAgIGZvciAobGV0
IG90aGVyU2lnbmF0dXJlIG9mIG90aGVyUHJvdG9jb2wuc2lnbmF0dXJlcykgeworICAgICAgICAg
ICAgbGV0IHNpZ25hdHVyZXMgPSB0aGlzLnNpZ25hdHVyZXNCeU5hbWUob3RoZXJTaWduYXR1cmUu
bmFtZSk7CisgICAgICAgICAgICBpZiAoIXNpZ25hdHVyZXMpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICAgICAgbGV0IG92ZXJsb2FkID0gcmVzb2x2ZU92ZXJsb2FkSW1w
bChzaWduYXR1cmVzLCBbXSwgb3RoZXJTaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAg
ICAgICAgaWYgKCFvdmVybG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgICAgICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0KKyAgICAgICAgICAgICAgICBvdmVy
bG9hZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAg
ICAgICAgICAgIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25D
b250ZXh0KTsKKyAgICAgICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhv
dGhlclNpZ25hdHVyZS5yZXR1cm5UeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7
CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAgIGhhc0hl
aXIodHlwZSkKKyAgICB7CisgICAgICAgIGxldCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24u
bWFwcGluZyhbdGhpcy5fdHlwZVZhcmlhYmxlXSwgW3R5cGVdKTsKKyAgICAgICAgZm9yIChsZXQg
YWJzdHJhY3RTaWduYXR1cmUgb2YgdGhpcy5fc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0
IHNpZ25hdHVyZSA9IHNpZ25hdHVyZS52aXNpdChzdWJzdGl0dXRpb24pOworICAgICAgICAgICAg
bGV0IG92ZXJsb2FkID0gdGhpcy5wcm9ncmFtLnJlc29sdmVGdW5jT3ZlcmxvYWQoc2lnbmF0dXJl
Lm5hbWUsIFtdLCBzaWduYXR1cmUucGFyYW1ldGVyVHlwZXMpOworICAgICAgICAgICAgaWYgKCFv
dmVybG9hZCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAKKyAg
ICAgICAgICAgIGxldCBzdWJzdGl0dXRlZFJldHVyblR5cGUgPSBvdmVybG9hZC5mdW5jLnJldHVy
blR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAgICAgICAgICAgICAgb3ZlcmxvYWQu
ZnVuYy50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAg
ICAgICAgIGlmICghc3Vic3RpdHV0ZWRSZXR1cm5UeXBlLmVxdWFscyhzaWduYXR1cmUucmV0dXJu
VHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gInByb3RvY29sICIgKyB0aGlzLm5hbWUgKyAiIHsgIiArIHRoaXMuc2lnbmF0dXJl
cy5qb2luKCI7ICIpICsgIjsgfSI7CisgICAgfQorfQorCisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1Byb3RvY29sUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3Rv
Y29sUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sUmVm
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvdG9jb2xS
ZWYgZXh0ZW5kcyBQcm90b2NvbCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAg
IHsKKyAgICAgICAgc3VwZXIob3JpZ2luLCBuYW1lKTsKKyAgICAgICAgdGhpcy5wcm90b2NvbERl
Y2wgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBpbmhlcml0cyhvdGhlcikKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLnByb3RvY29sRGVjbC5pbmhlcml0cyhvdGhlcik7CisgICAgfQorICAg
IAorICAgIGhhc0hlaXIodHlwZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnByb3RvY29s
RGVjbC5oYXNIZWlyKHR5cGUpOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1B0
clR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHRyVHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5
cGUgeworICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAg
ICAgICAgaWYgKCFvdGhlciBpbnN0YW5jZW9mIFB0clR5cGUpCisgICAgICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVuaWZ5KHVuaWZpY2F0aW9u
Q29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygp
CisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzU3BhY2UgKyAiICIgKyB0aGlzLmVs
ZW1lbnRUeXBlICsgIl4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmVm
ZXJlbmNlVHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VU
eXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZWZlcmVuY2VU
eXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBhZGRyZXNzU3BhY2Us
IGVsZW1lbnRUeXBlKQorICAgIHsKKyAgICAgICAgdmFsaWRhdGVBZGRyZXNzU3BhY2UoYWRkcmVz
c1NwYWNlKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9h
ZGRyZXNzU3BhY2UgPSBhZGRyZXNzU3BhY2U7CisgICAgICAgIHRoaXMuX2VsZW1lbnRUeXBlID0g
ZWxlbWVudFR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlz
Ll9vcmlnaW47IH0KKyAgICBnZXQgYWRkcmVzc1NwYWNlKCkgeyByZXR1cm4gdGhpcy5fYWRkcmVz
c1NwYWNlOyB9CisgICAgZ2V0IGVsZW1lbnRUeXBlKCkgeyByZXR1cm4gdGhpcy5fZWxlbWVudFR5
cGU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgZ2V0
IHNpemUoKSB7IHJldHVybiAxOyB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29s
dmVOYW1lcy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlTmFtZXMu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU5hbWVzLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcmVzb2x2ZU5hbWVz
KHByb2dyYW0pCit7CisgICAgcHJvZ3JhbS52aXNpdChuZXcgTmFtZVJlc29sdmVyKCkpOworfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU92ZXJsb2FkSW1wbC5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlT3ZlcmxvYWRJbXBsLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVPdmVybG9hZEltcGwuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitmdW5jdGlvbiByZXNvbHZlT3ZlcmxvYWRJbXBs
KGZ1bmN0aW9ucywgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcykKK3sKKyAgICBmb3IgKGxl
dCBmdW5jIG9mIGZ1bmN0aW9ucykgeworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGgg
JiYgdHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gZnVuYy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGFyZ3VtZW50VHlwZXMubGVuZ3RoICE9
IGZ1bmMucGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
bGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRleHQoZnVuYy50eXBl
UGFyYW1ldGVycyk7CisgICAgICAgIGxldCBvayA9IHRydWU7CisgICAgICAgIGZvciAobGV0IGkg
PSAwOyBpIDwgdHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IGFy
Z3VtZW50ID0gdHlwZUFyZ3VtZW50c1tpXTsKKyAgICAgICAgICAgIGxldCBwYXJhbWV0ZXIgPSBm
dW5jLnR5cGVQYXJhbWV0ZXJzW2ldOworICAgICAgICAgICAgaWYgKCFhcmd1bWVudC51bmlmeSh1
bmlmaWNhdGlvbkNvbnRleHQsIHBhcmFtZXRlcikpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZh
bHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIGlmICghb2spCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgZm9yIChsZXQg
aSA9IDA7IGkgPCBhcmd1bWVudFR5cGVzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpZiAo
IWFyZ3VtZW50VHlwZXNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBmdW5jLnBhcmFtZXRl
cnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghb2spCisg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVy
aWZ5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgbGV0IHNob3VsZEJ1aWxkVHlw
ZUFyZ3VtZW50cyA9ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAgICAgICAgaWYgKHNob3VsZEJ1
aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVudHMgPSBbXTsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBmdW5jLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodHlwZVBh
cmFtZXRlcik7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50ID09IHR5cGVQYXJhbWV0ZXIp
IHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cykK
KyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnB1c2godHlwZUFyZ3VtZW50KTsKKyAgICAg
ICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIHJl
dHVybiB7ZnVuYywgdW5pZmljYXRpb25Db250ZXh0LCB0eXBlQXJndW1lbnRzfTsKKyAgICB9Cisg
ICAgCisgICAgcmV0dXJuIG51bGw7Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZl
VHlwZURlZnMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZVR5cGVE
ZWZzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVUeXBlRGVm
cy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHJlc29s
dmVUeXBlRGVmcyhwcm9ncmFtKQoreworICAgIHByb2dyYW0udmlzaXQobmV3IFR5cGVEZWZSZXNv
bHZlcigpKTsKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9SZXR1cm4uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBSZXR1cm4gZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4s
IHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0
aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1
cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7
IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gInsgIiArIHRo
aXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOworICAgIH0KK307CisKSW5kZXg6IFRv
b2xzL0FycmF5TGFuZ1JJL1JldHVybkV4Y2VwdGlvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9SZXR1cm5FeGNlcHRpb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJy
YXlMYW5nUkkvUmV0dXJuRXhjZXB0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzQg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgUmV0dXJuRXhjZXB0aW9uIHsKKyAgICBjb25zdHJ1Y3Rvcih2YWx1ZSkK
KyAgICB7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdl
dCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9Cit9CkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9SZXdyaXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRl
ci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXdyaXRlci5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXdyaXRlciB7CisgICAg
Y29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwcGluZyA9IG5ldyBNYXAoKTsK
KyAgICB9CisgICAgCisgICAgX21hcChvbGRJdGVtLCBuZXdJdGVtKQorICAgIHsKKyAgICAgICAg
dGhpcy5fbWFwcGluZy5zZXQob2xkSXRlbSwgbmV3SXRlbSk7CisgICAgICAgIHJldHVybiBuZXdJ
dGVtOworICAgIH0KKyAgICAKKyAgICBfZ2V0TWFwcGluZyhvbGRJdGVtKQorICAgIHsKKyAgICAg
ICAgbGV0IHJlc3VsdCA9IHRoaXMuX21hcHBpbmcuZ2V0KG9sZEl0ZW0pOworICAgICAgICBpZiAo
cmVzdWx0KQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIG9sZEl0
ZW07CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIG5ldyBGdW5jKAorICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnJldHVyblR5cGUudmlz
aXQodGhpcyksCisgICAgICAgICAgICBub2RlLnR5cGVQYXJhbWV0ZXJzLm1hcCh0eXBlUGFybWV0
ZXIgPT4gdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFt
ZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRGdW5jUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVz
dWx0ID0gbmV3IEZ1bmNQYXJhbWV0ZXIobm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykp
OworICAgICAgICB0aGlzLl9tYXAobm9kZSwgcmVzdWx0KTsKKyAgICAgICAgcmVzdWx0LmxWYWx1
ZSA9IG5vZGUubFZhbHVlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAg
ICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IEJsb2Nr
KG5vZGUub3JpZ2luKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVt
ZW50cykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc3RhdGVtZW50LnZpc2l0KHRoaXMpKTsKKyAg
ICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbFJlZihu
b2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorICAgIAorICAgIHZpc2l0
VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBUeXBlUmVmKG5v
ZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZUFyZ3VtZW50cy5tYXAodHlwZUFyZ3VtZW50
ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSkpOworICAgICAgICByZXN1bHQudHlwZSA9IG5v
ZGUudHlwZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRU
eXBlVmFyaWFibGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAg
IHJldHVybiBuZXcgQ29uc3RleHByVHlwZVBhcmFtZXRlcihub2RlLm9yaWdpbiwgbm9kZS5uYW1l
LCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5v
ZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkKG5vZGUub3JpZ2luLCBub2RlLm5h
bWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJl
bmNlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBub2RlLmNvbnN0cnVjdG9y
KG5vZGUucm9naWluLCBub2RlLmFkZHJlc3NTcGFjZSwgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0
aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdEFycmF5UmVmVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlz
aXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShu
b2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheVR5cGUobm9kZS5vcmlnaW4sIG5v
ZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2ln
bm1lbnQobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQXNzaWdubWVudChub2RlLm9y
aWdpbiwgbm9kZS5saHMudmlzaXQodGhpcyksIG5vZGUucmhzLnZpc2l0KHRoaXMpKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS52
YXJpYWJsZSA9IHRoaXMuX2dldE1hcHBpbmcobm9kZS52YXJpYWJsZSk7CisgICAgICAgIHJldHVy
biBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIG5ldyBSZXR1cm4obm9kZS5vcmlnaW4sIG5vZGUudmFsdWUgPyBub2RlLnZhbHVl
LnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAgIAorICAgIHZpc2l0SW50TGl0ZXJhbChu
b2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgfQorCisgICAgdmlzaXRDYWxs
RXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBDYWxsRXhw
cmVzc2lvbigKKyAgICAgICAgICAgIG5vZGUub3JpZ2luLCBub2RlLm5hbWUsCisgICAgICAgICAg
ICBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJndW1lbnQudmlz
aXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5hcmd1bWVudGxpc3QubWFwKGFyZ3VtZW50ID0+
IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgICAgIGxldCBhY3R1YWxUeXBlQXJndW1lbnRz
ID0gbm9kZS5hY3R1YWxUeXBlQXJndW1lbnRzOworICAgICAgICBpZiAoYWN0dWFsVHlwZUFyZ3Vt
ZW50cykgeworICAgICAgICAgICAgcmVzdWx0LmFjdHVhbFR5cGVBcmd1bWVudHMgPQorICAgICAg
ICAgICAgICAgIGFjdHVhbFR5cGVBcmd1bWVudHMubWFwKGFjdHVhbFR5cGVBcmd1bWVudCA9PiBh
Y3R1YWxUeXBlQXJndW1lbnQudmlzaXQodGhpcykpOworICAgICAgICB9CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rpb25MaWtlQmxvY2sobm9kZSkK
KyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25MaWtlQmxvY2soCisgICAgICAgICAg
ICBub2RlLm9yaWdpbiwKKyAgICAgICAgICAgIG5vZGUuYXJndW1lbnRMaXN0Lm1hcChhcmd1bWVu
dCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSksCisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnMu
bWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9k
ZS5ib2R5LnZpc2l0KHRoaXMpKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1N0YW5kYXJkTGlicmFyeS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdGFu
ZGFyZExpYnJhcnkuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvU3RhbmRh
cmRMaWJyYXJ5LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworLy8gTk9U
RTogVGhlIG5leHQgbGluZSBpcyBsaW5lIDI4LCBhbmQgd2UgcmVseSBvbiB0aGlzIGluIFByZXBh
cmUuanMuCitjb25zdCBzdGFuZGFyZExpYnJhcnkgPSBgCisvLyBUaGlzIGlzIHRoZSBBcnJheUxh
bmcgc3RhbmRhcmQgbGlicmFyeS4gSW1wbGVtZW50YXRpb25zIG9mIGFsbCBvZiB0aGVzZSB0aGlu
Z3MgYXJlIGluCisvLyBJbnRyaW5zaWNzLmpzLgorCisvLyBOZWVkIHRvIGJvb3RzdHJhcCB2b2lk
IGZpcnN0LgorbmF0aXZlIHByaW1pdGl2ZSB0eXBlIHZvaWQ7CituYXRpdmUgcHJpbWl0aXZlIHR5
cGUgaW50MzI7Cit0eXBlIGludCA9IGludDMyOworCituYXRpdmUgaW50IG9wZXJhdG9yKyhpbnQs
IGludCk7CitgOwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBTdHJ1Y3RUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRo
aXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX2ZpZWxk
cyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgYWRkKGZpZWxkKQorICAgIHsKKyAgICAg
ICAgaWYgKHRoaXMuX2ZpZWxkcy5oYXMoZmllbGQubmFtZSkpCisgICAgICAgICAgICB0aHJvdyBu
ZXcgQUxUeXBlRXJyb3IoZmllbGQub3JpZ2luLm9yaWdpblN0cmluZywgIkR1cGxpY2F0ZSBmaWVs
ZCBuYW1lOiAiICsgZmllbGQubmFtZSk7CisgICAgICAgIHRoaXMuX2ZpZWxkcy5zZXQoZmllbGQu
bmFtZSwgZmllbGQpOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFy
YW1ldGVyczsgfQorICAgIAorICAgIGdldCBmaWVsZE5hbWVzKCkgeyByZXR1cm4gdGhpcy5fZmll
bGRzLmtleXMoKTsgfQorICAgIGZpZWxkQnlOYW1lKG5hbWUpIHsgcmV0dXJuIHRoaXMuX2ZpZWxk
cy5nZXQobmFtZSk7IH0KKyAgICBnZXQgZmllbGRzKCkgeyByZXR1cm4gdGhpcy5fZmllbGRzLnZh
bHVlcygpOyB9CisgICAgZ2V0IGZpZWxkTWFwKCkgeyByZXR1cm4gdGhpcy5fZmllbGRzOyB9Cisg
ICAgZ2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0cnVlOwor
ICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxkcykKKyAgICAgICAgICAgIHJlc3Vs
dCAmPSBmaWVsZC50eXBlLmlzUHJpbWl0aXZlOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
IH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAg
aWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQor
ICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJX
cm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8gaW5zdGFudGlhdGlvbiIpOworICAgICAg
ICAKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5tYXBwaW5nKHRoaXMu
dHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpOworICAgICAgICBsZXQgcmVzdWx0ID0gbmV3
IFN0cnVjdFR5cGUodGhpcy5vcmlnaW4sIHRoaXMubmFtZSwgW10pOworICAgICAgICBmb3IgKGxl
dCBmaWVsZCBvZiB0aGlzLmZpZWxkcykKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoZmllbGQudmlz
aXQoc3Vic3RpdHV0aW9uKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAic3RydWN0ICIgKyB0aGlzLm5h
bWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4geyAiICsgQXJyYXkuZnJvbSh0aGlz
LmZpZWxkcykuam9pbigiOyAiKSArICI7IH0iOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9T
dWJzdGl0dXRpb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3Rp
dHV0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmln
aHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9m
IHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4K
KyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFu
ZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoK
KyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5E
IEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJ
VFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1F
RC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgU3Vi
c3RpdHV0aW9uIGV4dGVuZHMgUmV3cml0ZXIgeworICAgIGNvbnN0cnVjdG9yKG1hcCkKKyAgICB7
CisgICAgICAgIHRoaXMuX21hcCA9IG1hcDsKKyAgICB9CisgICAgCisgICAgc3RhdGljIG1hcHBp
bmcocGFyYW1ldGVycywgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgaWYgKHBhcmFtZXRl
cnMubGVuZ3RoICE9IGFyZ3VtZW50TGlzdC5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoIlBhcmFtZXRlcnMgYW5kIGFyZ3VtZW50cyBhcmUgbWlzbWF0Y2hlZCIpOworICAgICAg
ICBsZXQgbWFwID0gbmV3IE1hcCgpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFt
ZXRlcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBtYXAuc2V0KHBhcmFtZXRlcnNbaV0sIGFy
Z3VtZW50TGlzdFtpXSk7CisgICAgICAgIHJldHVybiBuZXcgU3Vic3RpdHV0aW9uKG1hcCk7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJl
cGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChub2RlLnR5cGUpOworICAgICAgICBpZiAocmVwbGFj
ZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAg
ICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB0eXBlIGFyZ3VtZW50cyBv
biB0eXBlIHZhcmlhYmxlIik7CisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7
CisgICAgfQorCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChub2RlLnZhcmlhYmxlKTsKKyAgICAgICAgaWYg
KHJlcGxhY2VtZW50KQorICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICAK
KyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0VmFyaWFibGVSZWYobm9kZSk7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdWZmaXhDYWxsQXNzaWdubWVudC5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdWZmaXhDYWxsQXNzaWdubWVudC5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9TdWZmaXhDYWxsQXNzaWdubWVudC5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN1ZmZpeENhbGxBc3NpZ25t
ZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBs
aHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0g
bmFtZTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0aGlzLmZ1bmMgPSBudWxs
OworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAg
ICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsgIiBzdWZmaXggIiArIHRoaXMubmFtZTsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Rlc3QuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvVGVzdC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9UZXN0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworbG9h
ZCgiQWxsLmpzIik7CisKK3sKKyAgICBsZXQgcHJvZ3JhbSA9IHByZXBhcmUoIjx0ZXN0PiIsIDAs
ICJpbnQgZm9vKGludCB4KSB7IHJldHVybiB4ICsgMTsgfSIpOworICAgIGxldCByZXN1bHQgPSBj
YWxsRnVuY3Rpb24ocHJvZ3JhbSwgImZvbyIsIFtdLCBbbmV3IEVJbnQocHJvZ3JhbS5pbnQzMiwg
NDIpXSk7CisgICAgaWYgKCEocmVzdWx0IGluc3RhbmNlb2YgRUludCkpCisgICAgICAgIHRocm93
IG5ldyBFcnJvcigiV3JvbmcgcmVzdWx0IHR5cGU7IHJlc3VsdDogIiArIHJlc3VsdCk7CisgICAg
aWYgKHJlc3VsdC52YWx1ZSAhPSA0MykKKyAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBy
ZXN1bHQ6ICIgKyByZXN1bHQpOworfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQz
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIFR5cGUgZXh0ZW5kcyBOb2RlIHsKKyAgICBnZXQgdHlwZVBhcmFtZXRl
cnMoKSB7IHJldHVybiBbXTsgfQorICAgIGdldCBraW5kKCkgeyByZXR1cm4gVHlwZTsgfQorICAg
IAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHByb3RvY29s
Lmhhc0hlaXIodGhpcyk7CisgICAgfQorICAgIAorICAgIGdldCBpbnN0YW50aWF0ZWRUeXBlKCkg
eyByZXR1cm4gdGhpczsgfQorICAgIAorICAgIGdldCB3aXRoUmVjdXJzaXZlbHlJbnN0YW50aWF0
ZWRJbW1lZGlhdGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0KG5ldyBJbnN0
YW50aWF0ZUltbWVkaWF0ZXMoKSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9UeXBlRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZi5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVEZWYgZXh0ZW5kcyBUeXBlIHsK
KyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVQYXJhbWV0ZXJzLCB0eXBlKQorICAg
IHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0g
bmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAg
ICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7
IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25h
bWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1l
dGVyczsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorfQorCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmUmVzb2x2ZXIuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZURlZlJlc29sdmVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL1R5cGVEZWZSZXNvbHZlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu
YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRl
ZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAq
IDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZv
cm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQor
ICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQ
UExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5U
SUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJB
TlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAq
IFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9S
CisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5D
SURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VT
IChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNU
SVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklU
UzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRI
RU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklM
SVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklT
SU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4g
SUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNl
IHN0cmljdCI7CisKK2NsYXNzIFR5cGVEZWZSZXNvbHZlciBleHRlbmRzIFZpc2l0b3IgeworICAg
IGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gbmV3IFZpc2l0
aW5nU2V0KCk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fdmlzaXRpbmcuZG9WaXNpdChub2RlLCAoKSA9PiB7CisgICAgICAgICAgICBz
dXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgICAgICAgICBpZiAobm9kZS50eXBlIGluc3Rh
bmNlb2YgVHlwZURlZikgeworICAgICAgICAgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQg
PSBuZXcgVW5pZmljYXRpb25Db250ZXh0KG5vZGUudHlwZS50eXBlUGFyYW1ldGVycyk7CisgICAg
ICAgICAgICAgICAgaWYgKG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gbm9kZS50eXBlLnR5
cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9y
KCJhcmd1bWVudC9wYXJhbWV0ZXIgbWlzbWF0Y2ggKHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGVh
cmxpZXIpIik7CisgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnR5cGVB
cmd1bWVudHMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICAgICAgICAgIG5vZGUudHlwZUFyZ3Vt
ZW50c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG5vZGUudHlwZS50eXBlUGFyYW1ldGVy
c1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkp
CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5v
cmlnaW5TdHJpbmcsICJUeXBlIHJlZmVyZW5jZSB0byBhIHR5cGUgZGVmaW5pdGlvbiB2aW9sYXRl
cyBwcm90b2NvbCBjb25zdHJhaW50cyIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAg
ICAgIGxldCBuZXdUeXBlID0gbm9kZS50eXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKG5vZGUu
dHlwZS50eXBlUGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgICAg
ICBuZXdUeXBlLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgICAgIG5vZGUuc2V0VHlwZUFuZEFy
Z3VlbW50cyhuZXdUeXBlLCBbXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0K
K30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZU9yVmFyaWFibGVSZWYgZXh0ZW5k
cyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0
aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0
IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisKKyAgICB0b1N0cmluZygpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1R5cGVSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxl
IEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNl
IGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNh
dGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9u
cworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0
IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1
dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp
YWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJF
IElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1Mg
T1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhF
CisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZP
UiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBT
SEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElS
RUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09O
U0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBS
T0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBE
QVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENB
VVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRS
QUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0Ug
T1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRI
SVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBE
QU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWYgZXh0ZW5kcyBUeXBl
IHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMpCisgICAgewor
ICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1l
OworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRz
ID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHdyYXAodHlwZSkKKyAg
ICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlwZVJlZih0eXBlLm9yaWdpbiwgdHlwZS5u
YW1lLCBbXSk7CisgICAgICAgIHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICAgICAgcmV0dXJuIHJl
c3VsdDsKKyAgICB9CisgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsg
fQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlQXJn
dW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1ByaW1p
dGl2ZSgpIHsgcmV0dXJuIHR5cGUgPyB0eXBlLmlzUHJpbWl0aXZlIDogZmFsc2U7IH0KKyAgICAK
KyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50
eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBnZXQgdW5p
ZnlOb2RlKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkK
KyAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUudW5pZnlOb2RlOworICAgICAgICByZXR1cm4g
dGhpczsKKyAgICB9CisKKyAgICBwb3B1bGF0ZURlZmF1bHRWYWx1ZShidWZmZXIsIG9mZnNldCkK
KyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzLnR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUoYnVmZmVyLCBvZmZzZXQp
OworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBnZXQgZGVmYXVsdCB2YWx1ZSBvZiBh
IHR5cGUgaW5zdGFudGlhdGlvbiIpOworICAgIH0KKyAgICAKKyAgICBnZXQgc2l6ZSgpCisgICAg
eworICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy50eXBlLnNpemU7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGdl
dCBzaXplIG9mIGEgdHlwZSBpbnN0YW50aWF0aW9uIik7CisgICAgfQorICAgIAorICAgIHNldFR5
cGVBbmRBcmd1bWVudHModHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMu
X25hbWUgPSB0eXBlLm5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRo
aXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICB1bmlm
eUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghKG90
aGVyIGluc3RhbmNlb2YgVHlwZVJlZikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAg
ICAgIGlmICghdGhpcy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkp
CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVu
dHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3VtZW50
cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNbaV0u
dW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50
eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAg
ICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7Cisg
ICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVWYXJpYWJsZSBleHRlbmRzIFR5cGUgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0aGlz
Ll9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0
aGlzLl9wcm90b2NvbCA9IHByb3RvY29sOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsg
cmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgcHJvdG9jb2woKSB7IHJldHVybiB0aGlzLl9w
cm90b2NvbDsgfQorICAgIAorICAgIGdldCBpc1ByaW1pdGl2ZSgpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5fcHJvdG9jb2wgJiYgdGhpcy5fcHJvdG9jb2wuaXNQcmltaXRpdmU7CisgICAg
fQorICAgIAorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAg
ICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghcHJvdG9jb2wpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0
cyhwcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0
aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9m
IFR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBsZXQgcmVhbFRoaXMg
PSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlzICE9
IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnko
dGhpcywgb3RoZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdW5p
ZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICB9
CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgewor
ICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAg
ICAgICAgCisgICAgICAgIC8vIFRoZSB0aGluZyB3ZSBnZXQgdW5pZmllZCB3aXRoIG11c3QgYmUg
YSB0eXBlIHZhcmlhYmxlIHRoYXQgYWNjZXB0cyBhIGJyb2FkZXIgc2V0IG9mCisgICAgICAgIC8v
IHRoaW5ncyB0aGFuIHdlIGRvLgorICAgICAgICBpZiAoIShyZWFsVGhpcyBpbnN0YW5jZW9mIFR5
cGVWYXJpYWJsZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAg
IGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiAhcmVhbFRoaXMucHJvdG9j
b2w7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhyZWFs
VGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZp
Y2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAg
ICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gdW5pZmljYXRpb25Db250ZXh0LmZp
bmQodGhpcykuaW5oZXJpdHModGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHRvU3Ry
aW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4
OiBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBVbmlmaWNhdGlvbkNvbnRleHQgeworICAgIGNv
bnN0cnVjdG9yKHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFt
ZXRlcnMgPSBuZXcgU2V0KHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5fbmV4dE1hcCA9
IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgdW5pb24oYSwgYikKKyAgICB7CisgICAgICAg
IGEgPSBmaW5kKGEpOworICAgICAgICBiID0gZmluZChiKTsKKyAgICAgICAgaWYgKGEgPT0gYikK
KyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICghYi5pc1VuaWZpYWJs
ZSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBhXTsKKyAgICAgICAgaWYgKCFhLmlzVW5pZmlh
YmxlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdW5pZnkgbm9uLXVuaWZp
YWJsZSB0aGluZ3MgIiArIGEgKyAiIGFuZCAiICsgYik7CisgICAgICAgIAorICAgICAgICAvLyBN
YWtlIHN1cmUgdGhhdCB0eXBlIHBhcmFtZXRlcnMgZG9uJ3QgZW5kIHVwIGJlaW5nIHJvb3RzLgor
ICAgICAgICBpZiAoYS5pc1VuaWZpYWJsZSAmJiBiLmlzVW5pZmlhYmxlICYmIHRoaXMuX3R5cGVQ
YXJhbWV0ZXJzLmhhcyhiKSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBhXTsKKworICAgICAg
ICB0aGlzLl9uZXh0TWFwLnNldChhLCBiKTsKKyAgICB9CisgICAgCisgICAgZmluZChub2RlKQor
ICAgIHsKKyAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTsKKyAgICAgICAgbGV0IG5leHRO
b2RlID0gdGhpcy5fbmV4dE1hcC5nZXQoY3VycmVudE5vZGUpOworICAgICAgICBpZiAoIW5leHRO
b2RlKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOworICAgICAgICBmb3IgKDs7KSB7
CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IG5leHROb2RlOworICAgICAgICAgICAgbmV4dE5v
ZGUgPSB0aGlzLl9uZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICBpZiAoIW5l
eHROb2RlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMu
X25leHRNYXAuc2V0KG5vZGUsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRO
b2RlOworICAgIH0KKyAgICAKKyAgICBnZXQgbm9kZXMoKQorICAgIHsKKyAgICAgICAgbGV0IHJl
c3VsdCA9IG5ldyBTZXQoKTsKKyAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMu
X25leHRNYXApIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoa2V5KTsKKyAgICAgICAgICAgIHJl
c3VsdC5hZGQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAg
fQorICAgIAorICAgIHZlcmlmeSgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1l
dGVyIG9mIHRoaXMuX3R5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBpZiAoIXR5cGVQYXJh
bWV0ZXIudmVyaWZ5QXNQYXJhbWV0ZXIodGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICB9CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiB0aGlzLm5v
ZGVzKSB7CisgICAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVudC5pc1VuaWZpYWJsZSkKKyAgICAg
ICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh0aGlzLl90eXBlUGFyYW1ldGVy
cy5oYXModHlwZUFyZ3VtZW50KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
ICAgIGlmICghdHlwZUFyZ3VtZW50LnZlcmlmeUFzQXJndW1lbnQodGhpcykpCisgICAgICAgICAg
ICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKyAgICAKKyAgICBpc1VudW5pZmllZCgpCisgICAgeworICAgICAgICByZXR1cm4gIXRoaXMu
X25leHRNYXAuc2l6ZSgpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVmFs
dWUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBWYWx1ZSBleHRlbmRzIE5vZGUgeworICAgIGdldCBraW5k
KCkgeyByZXR1cm4gVmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiBmYWxz
ZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIFZhcmlhYmxlUmVmIGV4dGVuZHMgRXhwcmVzc2lvbiB7Cisg
ICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2lu
KTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFyaWFibGUgPSBu
dWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0K
KyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0aGlzLnZhcmlhYmxlLmlzQ29uc3RleHBy
OyB9CisgICAgZ2V0IHVuaWZ5Tm9kZSgpIHsgcmV0dXJuIHRoaXMudmFyaWFibGUudW5pZnlOb2Rl
OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFt
ZTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WaXNpdGluZ1NldC5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WaXNpdGluZ1NldC5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9WaXNpdGluZ1NldC5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZpc2l0aW5nU2V0IHsKKyAgICBjb25zdHJ1Y3Rvcigu
Li5pdGVtcykKKyAgICB7CisgICAgICAgIHRoaXMuX3NldCA9IG5ldyBTZXQoaXRlbXMpOworICAg
IH0KKyAgICAKKyAgICBkb1Zpc2l0KGl0ZW0sIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgaWYg
KHRoaXMuX3NldC5oYXMoaXRlbSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Io
aXRlbS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiUmVjdXJzaXZlICIgKyBpdGVtLmtpbmQpOworICAg
ICAgICB0aGlzLl9zZXQuYWRkKGl0ZW0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0
dXJuIGNhbGxiYWNrKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aGlzLl9z
ZXQuZGVsZXRlKGl0ZW0pOworICAgICAgICB9CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvVmlzaXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9y
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmlzaXRvciB7CisgICAgdmlz
aXRQcm9ncmFtKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9k
ZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7
CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5y
ZXR1cm5UeXBlLnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9m
IG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRo
aXMpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAg
ICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1
bmNQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsK
KyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jRGVmKG5vZGUpCisgICAgeworICAgICAgICB2aXNp
dEZ1bmMobm9kZSk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXROYXRpdmVGdW5jKG5vZGUpCisgICAgeworICAgICAgICB2aXNpdEZ1bmMobm9k
ZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGZv
ciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1l
bnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkK
KyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xEZWNsKG5vZGUpCisgICAgewor
ICAgICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAg
ICAgc2lnbmF0dXJlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYo
bm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiBub2RlLnR5cGVB
cmd1bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQor
ICAgIAorICAgIHZpc2l0TmF0aXZlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQg
dHlwZVBhcmFtdGVyIG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFy
YW1ldGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVEZWYobm9kZSkK
KyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1l
dGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIG5v
ZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5v
ZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBh
cmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAg
ICBmb3IgKGxldCBmaWVsZCBvZiBub2RlLmZpZWxkcykKKyAgICAgICAgICAgIGZpZWxkLnZpc2l0
KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsK
KyAgICB9CisgICAgCisgICAgdmlzaXRDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUpCisgICAg
eworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0
RmllbGQobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpCisgICAgeworICAgICAgICBub2Rl
LmVsZW1lbnRUeXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUo
bm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhp
cy52aXNpdEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlU
eXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsK
KyAgICAgICAgbm9kZS5udW1FbGVtZW50cy52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAgICAgICBub2RlLmxocy52aXNpdCh0aGlz
KTsKKyAgICAgICAgbm9kZS5yaHMudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0
VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0UmV0dXJuKG5v
ZGUpCisgICAgeworICAgICAgICBpZiAobm9kZS52YWx1ZSkKKyAgICAgICAgICAgIG5vZGUudmFs
dWUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc3RJbnRMaXRlcmFsKG5vZGUpCisg
ICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgewor
ICAgICAgICBmb3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAg
ICAgICAgICAgdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBhcmd1
bWVudCBvZiBub2RlLmFyZ3VtZW50TGlzdCkKKyAgICAgICAgICAgIGFyZ3VtZW50LnZpc2l0KHRo
aXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uTGlrZUJsb2NrKG5vZGUpCisgICAg
eworICAgICAgICBmb3IgKGxldCBhcmd1bWVudCBvZiBub2RlLmFyZ3VtZW50TGlzdCkKKyAgICAg
ICAgICAgIGFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIg
b2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KHRoaXMpOwor
ICAgICAgICBub2RlLmJvZHkudmlzaXQodGhpcyk7CisgICAgfQorfQorCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319268</attachid>
            <date>2017-08-29 11:44:16 -0700</date>
            <delta_ts>2017-08-29 14:34:29 -0700</delta_ts>
            <desc>getting close to parsing the first test</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>217182</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgQUxTeW50YXhFcnJvciBleHRlbmRzIEVycm9yIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW5TdHJpbmcsIG1lc3NhZ2UpCisgICAgeworICAgICAgICBzdXBlcigiU3lu
dGF4IGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAiOiAiICsgbWVzc2FnZSk7CisgICAgICAg
IHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5nOworICAgICAgICB0aGlzLnN5bnRheEVy
cm9yTWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9BTFR5cGVFcnJvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BTFR5cGVF
cnJvci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BTFR5cGVFcnJvci5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFMVHlwZUVycm9y
IGV4dGVuZHMgRXJyb3IgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpblN0cmluZywgbWVzc2FnZSkK
KyAgICB7CisgICAgICAgIHN1cGVyKCJUeXBlIGVycm9yIGF0ICIgKyBvcmlnaW5TdHJpbmcgKyAi
OiAiICsgbWVzc2FnZSk7CisgICAgICAgIHRoaXMub3JpZ2luU3RyaW5nID0gb3JpZ2luU3RyaW5n
OworICAgICAgICB0aGlzLnR5cGVFcnJvck1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1NwYWNlLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL0FkZHJlc3NTcGFjZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9BZGRyZXNzU3BhY2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjb25zdCBhZGRyZXNzU3BhY2VzID0gWyJjb25zdGFudCIsICJkZXZpY2UiLCAidGhy
ZWFkZ3JvdXAiLCAidGhyZWFkIl07CisKK2Z1bmN0aW9uIGlzQWRkcmVzc1NwYWNlKGFkZHJlc3NT
cGFjZSkKK3sKKyAgICBzd2l0Y2ggKGFkZHJlc3NTcGFjZSkgeworICAgIGNhc2UgImNvbnN0YW50
IjoKKyAgICBjYXNlICJkZXZpY2UiOgorICAgIGNhc2UgInRocmVhZGdyb3VwIjoKKyAgICBjYXNl
ICJ0aHJlYWQiOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitmdW5jdGlvbiB2YWxpZGF0ZUFkZHJlc3NTcGFjZShh
ZGRyZXNzU3BhY2UpCit7CisgICAgaWYgKCFpc0FkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpKQor
ICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkJhZCBhZGRyZXNzIHNwYWNlOiAiICsgYWRkcmVzc1Nw
YWNlKTsKK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0FsbC5qcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9BcnJheUxhbmdSSS9BbGwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvQWxsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2xvYWQoIk5v
ZGUuanMiKTsKK2xvYWQoIlR5cGUuanMiKTsKK2xvYWQoIlJlZmVyZW5jZVR5cGUuanMiKTsKK2xv
YWQoIlZhbHVlLmpzIik7Citsb2FkKCJFeHByZXNzaW9uLmpzIik7Citsb2FkKCJSZXdyaXRlci5q
cyIpOworbG9hZCgiVmlzaXRvci5qcyIpOworbG9hZCgiRVZhbHVlLmpzIik7CisKK2xvYWQoIkFM
U3ludGF4RXJyb3IuanMiKTsKK2xvYWQoIkFMVHlwZUVycm9yLmpzIik7Citsb2FkKCJBZGRyZXNz
U3BhY2UuanMiKTsKK2xvYWQoIkFycmF5UmVmVHlwZS5qcyIpOworbG9hZCgiQXJyYXlUeXBlLmpz
Iik7Citsb2FkKCJBc3NpZ25tZW50LmpzIik7Citsb2FkKCJCbG9jay5qcyIpOworbG9hZCgiQ2Fs
bEFzc2lnbm1lbnQuanMiKTsKK2xvYWQoIkNhbGxFeHByZXNzaW9uLmpzIik7Citsb2FkKCJDYWxs
RnVuY3Rpb24uanMiKTsKK2xvYWQoIkNoZWNrLmpzIik7Citsb2FkKCJDaGVja2VyLmpzIik7Cits
b2FkKCJDb21tYUV4cHJlc3Npb24uanMiKTsKK2xvYWQoIkNvbnN0ZXhwclR5cGVQYXJhbWV0ZXIu
anMiKTsKK2xvYWQoIkVCdWZmZXIuanMiKTsKK2xvYWQoIkVCdWZmZXJCdWlsZGVyLmpzIik7Cits
b2FkKCJFRmxvYXQuanMiKTsKK2xvYWQoIkVJbnQuanMiKTsKK2xvYWQoIkVQdHIuanMiKTsKK2xv
YWQoIkV2YWx1YXRpb25Db21tb24uanMiKTsKK2xvYWQoIkV2YWx1YXRvci5qcyIpOworbG9hZCgi
RmllbGQuanMiKTsKK2xvYWQoIkZ1bmMuanMiKTsKK2xvYWQoIkZ1bmNEZWYuanMiKTsKK2xvYWQo
IkZ1bmNJbnN0YW50aWF0b3IuanMiKTsKK2xvYWQoIkZ1bmNQYXJhbWV0ZXIuanMiKTsKK2xvYWQo
IkZ1bmNTaWduYXR1cmUuanMiKTsKK2xvYWQoIkZ1bmN0aW9uTGlrZUJsb2NrLmpzIik7Citsb2Fk
KCJJbmxpbmUuanMiKTsKK2xvYWQoIklubGluZXIuanMiKTsKK2xvYWQoIkluc3RhbnRpYXRlSW1t
ZWRpYXRlcy5qcyIpOworbG9hZCgiSW50TGl0ZXJhbC5qcyIpOworbG9hZCgiSW50cmluc2ljcy5q
cyIpOworbG9hZCgiTGV4ZXIuanMiKTsKK2xvYWQoIkxleGVyVG9rZW4uanMiKTsKK2xvYWQoIk5h
bWVDb250ZXh0LmpzIik7Citsb2FkKCJOYW1lUmVzb2x2ZXIuanMiKTsKK2xvYWQoIk5hdGl2ZUZ1
bmMuanMiKTsKK2xvYWQoIk5hdGl2ZVR5cGUuanMiKTsKK2xvYWQoIk5hdGl2ZVR5cGVJbnN0YW5j
ZS5qcyIpOworbG9hZCgiTnVsbFR5cGUuanMiKTsKK2xvYWQoIlBhcnNlLmpzIik7Citsb2FkKCJQ
cmVwYXJlLmpzIik7Citsb2FkKCJQcm9ncmFtLmpzIik7Citsb2FkKCJQcm90b2NvbC5qcyIpOwor
bG9hZCgiUHJvdG9jb2xEZWNsLmpzIik7Citsb2FkKCJQcm90b2NvbFJlZi5qcyIpOworbG9hZCgi
UHRyVHlwZS5qcyIpOworbG9hZCgiUmVzb2x2ZU5hbWVzLmpzIik7Citsb2FkKCJSZXNvbHZlT3Zl
cmxvYWRJbXBsLmpzIik7Citsb2FkKCJSZXNvbHZlVHlwZURlZnMuanMiKTsKK2xvYWQoIlJldHVy
bi5qcyIpOworbG9hZCgiUmV0dXJuRXhjZXB0aW9uLmpzIik7Citsb2FkKCJTdGFuZGFyZExpYnJh
cnkuanMiKTsKK2xvYWQoIlN0cnVjdFR5cGUuanMiKTsKK2xvYWQoIlN1YnN0aXR1dGlvbi5qcyIp
OworbG9hZCgiU3VmZml4Q2FsbEFzc2lnbm1lbnQuanMiKTsKK2xvYWQoIlR5cGVEZWYuanMiKTsK
K2xvYWQoIlR5cGVEZWZSZXNvbHZlci5qcyIpOworbG9hZCgiVHlwZU9yVmFyaWFibGVSZWYuanMi
KTsKK2xvYWQoIlR5cGVSZWYuanMiKTsKK2xvYWQoIlR5cGVWYXJpYWJsZS5qcyIpOworbG9hZCgi
VW5pZmljYXRpb25Db250ZXh0LmpzIik7Citsb2FkKCJWYXJpYWJsZURlY2wuanMiKTsKK2xvYWQo
IlZhcmlhYmxlUmVmLmpzIik7Citsb2FkKCJWaXNpdGluZ1NldC5qcyIpOwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvQXJyYXlSZWZUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFu
Z1JJL0FycmF5UmVmVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9B
cnJheVJlZlR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCisvLyBO
b3RlIHRoYXQgd2Ugc2F5IHRoYXQgVFtdIGlzICJ0aGUgc2FtZSB0eXBlIiBhcyBUW2NdIGZvciBh
bnkgVCwgYy4gVGhpcyBncmVhdGx5IHNpbXBsaWZpZXMgdGhlCisvLyBsYW5ndWFnZS4KK2NsYXNz
IEFycmF5UmVmVHlwZSBleHRlbmRzIFJlZmVyZW5jZVR5cGUgeworICAgIHVuaWZ5SW1wbCh1bmlm
aWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFu
Y2VvZiBBcnJheVJlZlR5cGUpKSB7CisgICAgICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9m
IEFycmF5VHlwZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAg
aWYgKHRoaXMuYWRkcmVzc1NwYWNlICE9ICJ0aHJlYWQiKQorICAgICAgICAgICAgICAgIHJldHVy
biBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlm
eSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9CisKKyAgICB0
b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5hZGRyZXNzU3BhY2UgKyAiICIg
KyB0aGlzLmVsZW1lbnRUeXBlICsgIltdIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL0FycmF5VHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9BcnJh
eVR5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQXJyYXlUeXBlIGV4
dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBlbGVtZW50VHlwZSwgbnVtRWxl
bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRo
aXMuX2VsZW1lbnRUeXBlID0gZWxlbWVudFR5cGU7CisgICAgICAgIHRoaXMuX251bUVsZW1lbnRz
ID0gbnVtRWxlbWVudHM7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0
aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgZWxlbWVudFR5cGUoKSB7IHJldHVybiB0aGlzLl9lbGVt
ZW50VHlwZTsgfQorICAgIGdldCBudW1FbGVtZW50cygpIHsgcmV0dXJuIHRoaXMuX251bUVsZW1l
bnRzOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkgeyByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS5p
c1ByaW1pdGl2ZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVy
biB0aGlzLmVsZW1lbnRUeXBlICsgIlsiICsgdGhpcy5udW1FbGVtZW50cyArICJdIjsKKyAgICB9
CisgICAgCisgICAgZ2V0IHNpemUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVu
dFR5cGUuc2l6ZSAqIHRoaXMubnVtRWxlbWVudHM7CisgICAgfQorICAgIAorICAgIHVuaWZ5SW1w
bCh1bmlmaWNhdG9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAob3RoZXIgaW5z
dGFuY2VvZiBBcnJheVJlZlR5cGUpIHsKKyAgICAgICAgICAgIGlmIChvdGhlci5hZGRyZXNzU3Bh
Y2UgIT0gInRocmVhZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9
IGVsc2UgeworICAgICAgICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBBcnJheVR5cGUpKQor
ICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAg
aWYgKCF0aGlzLm51bUVsZW1lbnRzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIubnVt
RWxlbWVudHMpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAg
ICAgICAKKyAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCBvdGhlci5lbGVtZW50VHlwZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9Bc3NpZ25tZW50LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fz
c2lnbm1lbnQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQXNzaWdubWVu
dC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChD
KSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkK
KyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFO
RCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJ
TiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxF
IEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1Q
TEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExP
U1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9O
KSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVU
SEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5H
IE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBV
U0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ
VFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEFzc2lnbm1l
bnQgZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxocywgcmhz
KQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhz
OworICAgICAgICB0aGlzLl9yaHMgPSByaHM7CisgICAgfQorICAgIAorICAgIGdldCBsaHMoKSB7
IHJldHVybiB0aGlzLl9saHM7IH0KKyAgICBnZXQgcmhzKCkgeyByZXR1cm4gdGhpcy5fcmhzOyB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsg
IiA9ICIgKyB0aGlzLnJoczsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9C
bG9jay5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkobm9uZXhp
c3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9CbG9jay5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIEJsb2NrIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5fb3Jp
Z2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9zdGF0ZW1lbnRzID0gW107CisgICAgfQorICAg
IAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICBh
ZGQoc3RhdGVtZW50KQorICAgIHsKKyAgICAgICAgdGhpcy5fc3RhdGVtZW50cy5wdXNoKHN0YXRl
bWVudCk7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5f
c3RhdGVtZW50czsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmICgh
dGhpcy5zdGF0ZW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiAieyB9IjsKKyAgICAg
ICAgcmV0dXJuICJ7ICIgKyB0aGlzLnN0YXRlbWVudHMuam9pbigiOyAiKTsgKyAiOyB9IjsKKyAg
ICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9DYWxsQXNzaWdubWVudC5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DYWxsQXNzaWdubWVudC5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DYWxsQXNzaWdubWVudC5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENhbGxBc3NpZ25tZW50IGV4dGVuZHMgRXhw
cmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBsaHMsIHJocykKKyAgICB7
CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAg
ICAgICB0aGlzLl9saHMgPSBsaHM7CisgICAgICAgIHRoaXMuX3JocyA9IHJoczsKKyAgICAgICAg
dGhpcy5mdW5jID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0
aGlzLl9uYW1lOyB9CisgICAgZ2V0IGxocygpIHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIGdl
dCByaHMoKSB7IHJldHVybiB0aGlzLl9yaHM7IH0gLy8gVGhpcyBjYW4gYmUgbnVsbC4KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMgKyAiICIgKyB0
aGlzLm5hbWUgKyAodGhpcy5yaHMgPyAiPSAiICsgdGhpcy5yaHMgOiAiIik7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9DYWxsRXhwcmVzc2lvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIENhbGxFeHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7
CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudExp
c3QpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0g
bmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAg
ICAgIHRoaXMuX2FyZ3VtZW50TGlzdCA9IGFyZ3VtZW50TGlzdDsKKyAgICAgICAgdGhpcy5mdW5j
ID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1l
OyB9CisgICAgZ2V0IHR5cGVBcmd1bWVudHMoKSB7IHJldHVybiB0aGlzLl90eXBlQXJndW1lbnRz
OyB9CisgICAgZ2V0IGFyZ3VtZW50TGlzdCgpIHsgcmV0dXJuIHRoaXMuX2FyZ3VtZW50TGlzdDsg
fQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWUg
KyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPigiICsgdGhpcy5hcmd1bWVudExpc3QgKyAi
KSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9DYWxsRnVuY3Rpb24uanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEZ1bmN0aW9uLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxGdW5jdGlvbi5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKKy8vIFRoaXMgYWxsb3dzIHlvdSB0byBwYXNzIHN0cnVj
dHMgYW5kIGFycmF5cyBpbi1wbGFjZSwgYnV0IGl0J3MgYSBtb3JlIGFubm95aW5nIEFQSS4KK2Z1
bmN0aW9uIGNhbGxGdW5jdGlvbkJ5UmVmKHByb2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFy
Z3VtZW50TGlzdCkKK3sKKyAgICBmb3IgKGxldCByZXNldCBvZiBwcm9ncmFtLnJlc2V0cykKKyAg
ICAgICAgcmVzZXQoKTsKKyAgICBsZXQgYXJndW1lbnRUeXBlcyA9IGFyZ3VtZW50TGlzdC5tYXAo
YXJndW1lbnQgPT4gYXJndW1lbnQudHlwZS5lbGVtZW50VHlwZSk7CisgICAgbGV0IGZ1bmMgPSBy
ZXNvbHZlSW5saW5lZEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3Vt
ZW50VHlwZXMpOworICAgIGlmICghZnVuYykKKyAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9y
KCI8Y2FsbEZ1bmN0aW9uPiIsICJDYW5ub3QgcmVzb2x2ZSBmdW5jdGlvbiBjYWxsICIgKyBuYW1l
ICsgIjwiICsgdHlwZUFyZ3VtZW50cyArICI+KCIgKyBhcmd1bWVudExpc3QgKyAiKSIpOworICAg
IGZvciAobGV0IGkgPSAwOyBpIDwgZnVuYy5wYXJhbWV0ZXJzLmxlbmd0aDsgKytpKQorICAgICAg
ICBmdW5jLnBhcmFtZXRlcnNbaV0uZVB0ci5jb3B5RnJvbShhcmd1bWVudExpc3RbaV0pOworICAg
IHJldHVybiBuZXcgRXZhbHVhdG9yKCkudmlzaXRGdW5jdGlvbkJvZHkoZnVuYy5ib2R5KTsKK30K
KworZnVuY3Rpb24gY2FsbEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFy
Z3VtZW50TGlzdCkKK3sKKyAgICByZXR1cm4gY2FsbEZ1bmN0aW9uQnlSZWYoCisgICAgICAgIHBy
b2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsCisgICAgICAgIGFyZ3VtZW50TGlzdC5tYXAoYXJn
dW1lbnQgPT4gRVB0ci5ib3goYXJndW1lbnQpKSkubG9hZFZhbHVlKCk7Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9DaGVjay5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9D
aGVjay5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DaGVjay5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIGNoZWNrKHByb2dyYW0p
Cit7CisgICAgcHJvZ3JhbS52aXNpdChuZXcgQ2hlY2tlcihwcm9ncmFtKSk7Cit9CisKSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL0NoZWNrZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQ2hlY2tlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DaGVj
a2VyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENoZWNr
ZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICBjb25zdHJ1Y3Rvcihwcm9ncmFtKQorICAgIHsKKyAg
ICAgICAgdGhpcy5fcHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAgIHRoaXMuX2N1cnJlbnRTdGF0
ZW1lbnQgPSBudWxsOworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7
CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykg
eworICAgICAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9IHN0YXRlbWVudDsKKyAgICAg
ICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAg
ICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc2lnbmF0
dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNldCA9IG5ldyBTZXQo
KTsKKyAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnNpZGVyKHRoaW5nKQorICAgICAgICAgICAgewor
ICAgICAgICAgICAgICAgIGlmICh0aGluZy5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgICAgICAg
ICAgc2V0LmFkZCh0aGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGFzcyBOb3Rp
Y2VUeXBlVmFyaWFibGUgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAgICAgICAgICAgICB2aXNpdFR5
cGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnNp
ZGVyKG5vZGUudHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZpc2l0
VmFyaWFibGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAg
IGNvbnNpZGVyKG5vZGUudmFyaWFibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgICAgIGxldCBub3RpY2VUeXBlVmFyaWFibGUgPSBuZXcgTm90aWNlVHlwZVZh
cmlhYmxlKCk7CisgICAgICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXJUeXBlIG9mIHNpZ25hdHVy
ZS5wYXJhbWV0ZXJUeXBlcykKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlLnZpc2l0KG5v
dGljZVR5cGVWYXJpYWJsZSk7CisgICAgICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9m
IHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIGlmICghc2V0Lmhh
cyh0eXBlUGFyYW1ldGVyKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgQUxUeXBlRXJyb3Io
dHlwZVBhcmFtZXRlci5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBwYXJhbWV0ZXIgdG8gcHJv
dG9jb2wgc2lnbmF0dXJlIG5vdCBpbmZlcnJhYmxlIGZyb20gdmFsdWUgcGFyYW1ldGVycyIpOwor
ICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZXQuaGFzKG5vZGUudHlwZVZhcmlhYmxl
KSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Ioc2lnbmF0dXJlLm9yaWdp
bi5vcmlnaW5TdHJpbmcsICJQcm90b2NvbCdzIHR5cGUgdmFyaWFibGUgbm90IG1lbnRpb25lZCBp
biBzaWduYXR1cmUiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBfY2hlY2tUeXBlQXJn
dW1lbnRzKG9yaWdpbiwgdHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAg
ICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7Cisg
ICAgICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSB0eXBlQXJndW1lbnRzW2ldIGluc3RhbmNl
b2YgVHlwZTsKKyAgICAgICAgICAgIGxldCByZXN1bHQgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0u
dmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRJc1R5cGUpIHsKKyAgICAgICAg
ICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHNbaV0uaW5oZXJpdHModHlwZUFyZ3VtZW50c1tpXSkp
CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2lu
U3RyaW5nLCAiVHlwZSBhcmd1bWVudCBkb2VzIG5vdCBpbmhlcml0IHByb3RvY29sIik7CisgICAg
ICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmVxdWFscyh0eXBl
UGFyYW1ldGVyc1tpXS50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlw
ZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyB0eXBlIGZvciBjb25zdGV4cHIiKTsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYo
bm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX2NoZWNrVHlwZUFyZ3VtZW50cyhub2RlLm9yaWdp
biwgdHlwZS50eXBlUGFyYW1ldGVycywgbm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBub2RlLmVsZW1l
bnRUeXBlLnZpc2l0KHRoaXMpOworICAgICAgICAKKyAgICAgICAgaWYgKG5vZGUuYWRkcmVzc1Nw
YWNlID09ICJ0aHJlYWQiKQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAg
aWYgKCFub2RlLmVsZW1lbnRUeXBlLndpdGhSZWN1cnNpdmVseUluc3RhbnRpYXRlZEltbWVkaWF0
ZXMuaXNQcmltaXRpdmUpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5v
cmlnaW4ub3JpZ2luU3RyaW5nLCAiSWxsZWdhbCBwb2ludGVyIHRvIG5vbi1wcmltaXRpdmUgdHlw
ZSIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAg
ICAgaWYgKCFub2RlLm51bUVsZW1lbnRzLmlzQ29uc3RleHByKQorICAgICAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkFycmF5IGxlbmd0aCBt
dXN0IGJlIGNvbnN0ZXhwciIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9k
ZSkKKyAgICB7CisgICAgICAgIC8vIEZJWE1FOiBXZSBuZWVkIHRvIGNoZWNrIHRoYXQgdGhlIGxo
cyBpcyBhc3NpZ25hYmxlLgorICAgICAgICBsZXQgbGhzVHlwZSA9IG5vZGUubGhzLnZpc2l0KHRo
aXMpOworICAgICAgICBsZXQgcmhzVHlwZSA9IG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAgICAg
ICBpZiAoIWxoc1R5cGUuZXF1YWxzKHJoc1R5cGUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFM
VHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIlR5cGUgbWlzbWF0Y2ggaW4gYXNz
aWdubWVudDogIiArIGxoc1R5cGUgKyAiIHZlcnN1cyAiICsgcmhzVHlwZSk7CisgICAgICAgIHJl
dHVybiBsaHNUeXBlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisg
ICAgeworICAgICAgICByZXR1cm4gcmVzdWx0LnR5cGU7CisgICAgfQorICAgIAorICAgIHZpc2l0
UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICBpZiAobm9kZS52YWx1ZSkgeworICAgICAgICAg
ICAgbGV0IHJlc3VsdFR5cGUgPSBub2RlLnZhbHVlLnZpc2l0KHRoaXMpOworICAgICAgICAgICAg
aWYgKCF0aGlzLmZ1bmMucmV0dXJuVmFsdWUuZXF1YWxzKHJlc3VsdFR5cGUpKQorICAgICAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJU
cnlpbmcgdG8gcmV0dXJuICIgKyByZXN1bHRUeXBlICsgIiBpbiBhIGZ1bmN0aW9uIHRoYXQgcmV0
dXJucyAiICsgZnVuYy5yZXR1cm5WYWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAg
IH0KKyAgICAgICAgCisgICAgICAgIGlmICghZnVuYy5yZXR1cm5WYWx1ZS5lcXVhbHModGhpcy5f
cHJvZ3JhbS5pbnRyaW5zaWNzLnZvaWQpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVy
cm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIk5vbi12b2lkIGZ1bmN0aW9uIG11c3QgcmV0
dXJuIGEgdmFsdWUiKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbS5pbnRyaW5zaWNzLmludDMyOworICAg
IH0KKyAgICAKKyAgICB2aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICBm
b3IgKGxldCB0eXBlQXJndW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAg
dHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpOworICAgICAgICBsZXQgYXJndW1lbnRUeXBlcyA9IG5v
ZGUuYXJndW1lbnRMaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSk7Cisg
ICAgICAgIAorICAgICAgICBsZXQgb3ZlcmxvYWQgPSBudWxsOworICAgICAgICBmb3IgKGxldCB0
eXBlUGFyYW1ldGVyIG9mIHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQudHlwZVBhcmFtZXRlcnMpIHsK
KyAgICAgICAgICAgIGlmICghKHR5cGVQYXJhbWV0ZXIgaW5zdGFuY2VvZiBUeXBlVmFyaWFibGUp
KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKCF0eXBlUGFyYW1l
dGVyLnByb3RvY29sKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgbGV0
IHNpZ25hdHVyZXMgPQorICAgICAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIucHJvdG9jb2wuc2ln
bmF0dXJlc0J5TmFtZVdpdGhUeXBlVmFyaWFibGUobm9kZS5uYW1lLCB0eXBlUGFyYW1ldGVyKTsK
KyAgICAgICAgICAgIGlmICghc2lnbmF0dXJlcykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIG92ZXJsb2FkID0gcmVzb2x2ZU92ZXJsb2FkSW1wbChzaWduYXR1cmVzLCBu
b2RlLnR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICAgICAgaWYgKG92ZXJs
b2FkKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICghb3Zl
cmxvYWQpIHsKKyAgICAgICAgICAgIG92ZXJsb2FkID0gdGhpcy5fbmFtZUNvbnRleHQucHJvZ3Jh
bS5yZXNvbHZlRnVuY092ZXJsb2FkKAorICAgICAgICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS50
eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW92
ZXJsb2FkKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9y
aWdpblN0cmluZywgIkRpZCBub3QgZmluZCBmdW5jdGlvbiBmb3IgY2FsbCIpOworICAgICAgICBu
b2RlLmZ1bmMgPSBvdmVybG9hZC5mdW5jOworICAgICAgICBub2RlLmFjdHVhbFR5cGVBcmd1bWVu
dHMgPSBvdmVybG9hZC50eXBlQXJndW1lbnRzLm1hcChUeXBlUmVmLndyYXApOworICAgICAgICBy
ZXR1cm4gb3ZlcmxvYWQuZnVuYy5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAor
ICAgICAgICAgICAgb3ZlcmxvYWQuZnVuYy50eXBlUGFyYW1ldGVycywgb3ZlcmxvYWQudW5pZmlj
YXRpb25Db250ZXh0KTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NvbW1h
RXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Db21tYUV4cHJl
c3Npb24uanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ29tbWFFeHByZXNz
aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ29tbWFF
eHByZXNzaW9uIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBs
aXN0KQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbGlzdCA9
IGxpc3Q7CisgICAgfQorICAgIAorICAgIGdldCBsaXN0KCkgeyByZXR1cm4gdGhpcy5fbGlzdDsg
fQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiKCIgKyB0aGlz
Lmxpc3QudG9TdHJpbmcoKSArICIpIjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIgZXh0ZW5kcyBW
YWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAg
ICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyBy
ZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsg
fQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBnZXQgaXNVbmlm
aWFibGUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5p
ZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghKG90aGVyIGluc3Rh
bmNlb2YgVmFsdWUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmICgh
dGhpcy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAg
ICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgbGV0IHJlYWxUaGlzID0gdW5pZmljYXRpb25D
b250ZXh0LmZpbmQodGhpcyk7CisgICAgICAgIGlmIChyZWFsVGhpcyAhPSB0aGlzKQorICAgICAg
ICAgICAgcmV0dXJuIHJlYWxUaGlzLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOwor
ICAgICAgICAKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgVmFyaWFibGVSZWYpCisgICAg
ICAgICAgICBvdGhlciA9IG90aGVyLnZhcmlhYmxlOworICAgICAgICAKKyAgICAgICAgdW5pZmlj
YXRpb25Db250ZXh0LnVuaWZ5KHRoaXMsIG90aGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7Cisg
ICAgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBvdGhlcik7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzQXJndW1lbnQodW5pZmljYXRp
b25Db250ZXh0KQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIAorICAg
IHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KKwpJbmRleDogVG9v
bHMvQXJyYXlMYW5nUkkvRUJ1ZmZlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9FQnVmZmVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0VCdWZmZXIu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitsZXQgZUJ1ZmZlckNvdW50
ID0gMDsKKworY2xhc3MgRUJ1ZmZlciB7CisgICAgY29uc3RydWN0b3Ioc2l6ZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX2luZGV4ID0gZUJ1ZmZlckNvdW50Kys7CisgICAgICAgIHRoaXMuX2FycmF5
ID0gbmV3IEFycmF5KHNpemUpOworICAgIH0KKyAgICAKKyAgICBnZXQoaW5kZXgpCisgICAgewor
ICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX2FycmF5Lmxlbmd0aCkKKyAg
ICAgICAgICAgIHRocm93IG5ldyBFcnJvcigib3V0IG9mIGJvdW5kcyBidWZmZXIgYWNjZXNzIik7
CisgICAgICAgIHJldHVybiB0aGlzLl9hcnJheVtpbmRleF07CisgICAgfQorICAgIAorICAgIHNl
dChpbmRleCwgdmFsdWUpCisgICAgeworICAgICAgICB0aGlzLl9hcnJheVtpbmRleF0gPSB2YWx1
ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IGluZGV4KCkgeyByZXR1cm4gdGhpcy5faW5kZXg7IH0K
KyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIkIiICsgdGhpcy5f
aW5kZXggKyAiOlsiICsgdGhpcy5fYXJyYXkgKyAiXSI7CisgICAgfQorfQpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvRUJ1ZmZlckJ1aWxkZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvRUJ1ZmZlckJ1aWxkZXIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvRUJ1ZmZlckJ1aWxkZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MiBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywg
d2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQg
dGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3Ry
aWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAor
ICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk
aXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVw
cm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3Vt
ZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmli
dXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJ
QlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQ
RUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5H
LCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RT
IE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lO
RVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9G
IExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9S
VAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkg
V0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQg
T0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOwor
CitjbGFzcyBFQnVmZmVyQnVpbGRlciBleHRlbmRzIFZpc2l0b3IgeworICAgIGNvbnN0cnVjdG9y
KHByb2dyYW0pCisgICAgeworICAgICAgICB0aGlzLl9wcm9ncmFtID0gcHJvZ3JhbTsKKyAgICAg
CisgICAgICAgIC8vIE5PVEU6IEkgZG9uJ3QgdGhpbmsgdGhhdCB0aGlzIGlzIG5lY2Vzc2FyeS4K
KyAgICAgICAgbGV0IHJlc2V0cyA9IFtdOworICAgICAgICB0aGlzLl9yZXNldHMgPSByZXNldHM7
CisgICAgICAgIHByb2dyYW0ucmVzZXRzID0gcmVzZXRzOworICAgIH0KKyAgICAKKyAgICBfY3Jl
YXRlRVB0cih0eXBlKQorICAgIHsKKyAgICAgICAgdHlwZSA9IHR5cGUud2l0aFJlY3Vyc2l2ZWx5
SW5zdGFudGlhdGVkSW1tZWRpYXRlczsKKyAgICAgICAgbGV0IGJ1ZmZlciA9IG5ldyBFQnVmZmVy
KHR5cGUuc2l6ZSk7CisgICAgICAgIHR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUoYnVmZmVyLCAw
KTsKKyAgICAgICAgdGhpcy5fcmVzZXRzLnB1c2goKCkgPT4gdHlwZS5wb3B1bGF0ZURlZmF1bHRW
YWx1ZShidWZmZXIsIDApKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFUHRyKHR5cGUsIGJ1ZmZlciwg
MCk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY1BhcmFtZXRlcihub2RlKQorICAgIHsKKyAg
ICAgICAgbm9kZS5lUHRyID0gdGhpcy5fY3JlYXRlRVB0cihub2RlLnR5cGUpOworICAgIH0KK30K
KwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRUZsb2F0LmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL0VGbG9hdC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9FRmxvYXQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBF
RmxvYXQgZXh0ZW5kcyBFVmFsdWUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKQorICAg
IHsKKyAgICAgICAgc3VwZXIodHlwZSk7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7Cisg
ICAgfQorICAgIAorICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9CisgICAg
CisgICAgYWRkKG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFRmxvYXQodGhpcy50
eXBlLCB0aGlzLnZhbHVlICsgb3RoZXIudmFsdWUpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICByZXR1cm4gIiIgKyB0aGlzLnZhbHVlOworICAgIH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRUludC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9FSW50LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0VJbnQu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFSW50IGV4dGVu
ZHMgRVZhbHVlIHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBlLCB2YWx1ZSkKKyAgICB7CisgICAgICAg
IHN1cGVyKHR5cGUpOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAK
KyAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIAorICAgIGFkZChv
dGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRUludCh0aGlzLnR5cGUsICh0aGlzLnZh
bHVlICsgb3RoZXIudmFsdWUpIHwgMCk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiAiIiArIHRoaXMudmFsdWU7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9FUHRyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0VQdHIuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRVB0ci5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEVQdHIgZXh0ZW5kcyBFVmFs
dWUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIGJ1ZmZlciwgb2Zmc2V0KQorICAgIHsKKyAgICAg
ICAgc3VwZXIodHlwZSk7CisgICAgICAgIHRoaXMuX2J1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAg
dGhpcy5fb2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKyAgICAKKyAgICAvLyBUaGUgaW50ZXJwcmV0
ZXIgYWx3YXlzIHBhc3NlcyBhcm91bmQgcG9pbnRlcnMgdG8gdGhpbmdzLiBUaGlzIG1lYW5zIHRo
YXQgc29tZXRpbWVzIHdlIHdpbGwKKyAgICAvLyB3YW50IHRvIHJldHVybiBhIHZhbHVlIGJ1dCB3
ZSBoYXZlIHRvICJpbnZlbnQiIGEgcG9pbnRlciB0byB0aGF0IHZhbHVlLiBObyBwcm9ibGVtLCB0
aGlzCisgICAgLy8gZnVuY3Rpb24gaXMgaGVyZSB0byBoZWxwLgorICAgIC8vCisgICAgLy8gSW4g
YSByZWFsIGV4ZWN1dGlvbiBlbnZpcm9ubWVudCwgdXNlcyBvZiB0aGlzIG1hbmlmZXN0IGFzIFNT
QSB0ZW1wb3Jhcmllcy4KKyAgICBzdGF0aWMgYm94KHZhbHVlKQorICAgIHsKKyAgICAgICAgbGV0
IGJ1ZmZlciA9IG5ldyBFQnVmZmVyKDEpOworICAgICAgICBidWZmZXIuc2V0KDAsIHZhbHVlKTsK
KyAgICAgICAgcmV0dXJuIG5ldyBFUHRyKG5ldyBQdHJUeXBlKHZhbHVlLnR5cGUub3JpZ2luLCAi
dGhyZWFkIiwgdmFsdWUudHlwZSksIGJ1ZmZlciwgMCk7CisgICAgfQorICAgIAorICAgIGdldCBi
dWZmZXIoKSB7IHJldHVybiB0aGlzLl9idWZmZXI7IH0KKyAgICBnZXQgb2Zmc2V0KCkgeyByZXR1
cm4gdGhpcy5fb2Zmc2V0OyB9CisgICAgCisgICAgbG9hZFZhbHVlKCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLmJ1ZmZlci5nZXQodGhpcy5vZmZzZXQpOworICAgIH0KKyAgICAKKyAgICBj
b3B5RnJvbShvdGhlcikKKyAgICB7CisgICAgICAgIGZvciAobGV0IGkgPSB0aGlzLnR5cGUuZWxl
bWVudFR5cGUuc2l6ZTsgaS0tOykKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyLnNldChpLCBvdGhl
ci5idWZmZXIuZ2V0KGkpKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAg
ICAgICAgaWYgKCF0aGlzLmJ1ZmZlcikKKyAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAg
ICAgIHJldHVybiAiXkIiICsgdGhpcy5idWZmZXIuaW5kZXggKyAiOiIgKyB0aGlzLm9mZnNldDsK
KyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0VWYWx1ZS5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FVmFsdWUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvRVZhbHVlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgRVZhbHVlIHsKKyAgICBjb25zdHJ1Y3Rvcih0eXBlKQorICAgIHsKKyAgICAgICAg
dGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCB0eXBlKCkgeyByZXR1cm4g
dGhpcy5fdHlwZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0aW9uQ29t
bW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRpb25Db21tb24u
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdGlvbkNvbW1vbi5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NvbnN0IEJyZWFrRXhjZXB0
aW9uID0gU3ltYm9sKCJCcmVha0V4Y2VwdGlvbiIpOworY29uc3QgQ29udGludWVFeGNlcHRpb24g
PSBTeW1ib2woIkNvbnRpbnVlRXhjZXB0aW9uIik7CisKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvRXZhbHVhdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRv
ci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0b3IuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCisvLyBUaGlzIGlzIGEgY29tYmluZWQg
TEhTL1JIUyBldmFsdWF0b3IgdGhhdCBwYXNzZXMgYXJvdW5kIEVQdHIncyB0byBldmVyeXRoaW5n
LgorY2xhc3MgRXZhbHVhdG9yIGV4dGVuZHMgVmlzaXRvciB7CisgICAgdmlzaXRGdW5jdGlvbkJv
ZHkoYmxvY2spCisgICAgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgYmxvY2sudmlzaXQo
dGhpcyk7CisgICAgICAgICAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIGhhdmUgYSBjaGVjayB0aGF0
IHRoZXJlIGlzIG5vIHdheSB0byBkcm9wIG91dCBvZiBhIGZ1bmN0aW9uIHdpdGhvdXQKKyAgICAg
ICAgICAgIC8vIHJldHVybmluZyB1bmxlc3MgdGhlIGZ1bmN0aW9uIHJldHVybnMgdm9pZC4KKyAg
ICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGNhdGNoIChlKSB7CisgICAgICAgICAg
ICBpZiAoZSA9PSBCcmVha0V4Y2VwdGlvbiB8fCBlID09IENvbnRpbnVlRXhjZXB0aW9uKQorICAg
ICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU2hvdWxkIG5vdCBzZWUgYnJlYWsvY29udGlu
dWUgYXQgZnVuY3Rpb24gc2NvcGUiKTsKKyAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgUmV0
dXJuRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlOworICAgICAgICAg
ICAgdGhyb3cgZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uTGlr
ZUJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuYXJn
dW1lbnRMaXN0Lmxlbmd0aDsgKytpKQorICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJzW2ldLmxW
YWx1ZS52YWx1ZSA9IG5vZGUuYXJndW1lbnRMaXN0W2ldLnZpc2l0KHRoaXMpOworICAgICAgICBy
ZXR1cm4gdmlzaXRGdW5jdGlvbkJvZHkobm9kZS5ibG9jayk7CisgICAgfQorICAgIAorICAgIHZp
c2l0UmV0dXJuKG5vZGUpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgUmV0dXJuRXhjZXB0aW9u
KG5vZGUudmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAg
IAorICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIC8vIFdlIGV2
YWx1YXRlIGlubGluZWQgQVNUcywgc28gdGhpcyBjYW4gb25seSBiZSBhIG5hdGl2ZSBjYWxsLgor
ICAgICAgICBsZXQgY2FsbEFyZ3VtZW50cyA9IG5vZGUuYXJndW1lbnRMaXN0Lm1hcChhcmd1bWVu
dCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSk7CisgICAgICAgIHJldHVybiBub2RlLmltcGxlbWVu
dGF0aW9uKGNhbGxBcmd1bWVudHMpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvRXhwcmVzc2lvbi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FeHByZXNz
aW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFeHByZXNzaW9uIGV4
dGVuZHMgVmFsdWUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHN1
cGVyKCk7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICB9CisgICAgCisgICAg
Z2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorfQpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvRmllbGQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGaWVsZCB7CisgICAgY29uc3RydWN0
b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3Jp
Z2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5
cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47
IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgp
IHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvRnVuYy5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuYyBleHRlbmRzIE5v
ZGUgeworICAgIGNvbnN0cnVjdG9yKG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBw
YXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9
IG5hbWU7CisgICAgICAgIHRoaXMuX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICB0
aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9wYXJh
bWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVy
biB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHJldHVyblR5cGUoKSB7IHJldHVybiB0aGlzLl9yZXR1
cm5UeXBlOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBh
cmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRl
cnM7IH0KKyAgICBnZXQgcGFyYW1ldGVyVHlwZXMoKSB7IHJldHVybiB0aGlzLnBhcmFtZXRlcnMu
bWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudHlwZSk7IH0KKyAgICAKKyAgICBnZXQga2luZCgp
IHsgcmV0dXJuIEZ1bmM7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBy
ZXR1cm4gdGhpcy5yZXR1cm5UeXBlICsgIiAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBl
UGFyYW1ldGVycyArICI+KCIgKyB0aGlzLnBhcmFtZXRlcnMgKyAiKSI7CisgICAgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL0Z1bmNEZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
RnVuY0RlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1
bmNEZWYgZXh0ZW5kcyBGdW5jIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHJldHVy
blR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzLCBib2R5KQorICAgIHsKKyAgICAgICAg
c3VwZXIobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMpOworICAg
ICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7Cisg
ICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAg
ICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmco
KSArICIgeyAiICsgYm9keSArICIgfSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9GdW5jSW5zdGFudGlhdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0Z1bmNJbnN0YW50aWF0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkv
RnVuY0luc3RhbnRpYXRvci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY4IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIEZ1bmNJbnN0YW50aWF0b3IgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAg
ICAgIHRoaXMuX2luc3RhbmNlcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgLy8gUmV0
dXJucyBhIEZ1bmMgb2JqZWN0IHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIg
c3lzdGVtIG9mIHR5cGUgYXJndW1lbnRzLgorICAgIGdldFVuaXF1ZShmdW5jLCB0eXBlQXJndW1l
bnRzKQorICAgIHsKKyAgICAgICAgaWYgKCFmdW5jLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAg
ICAgICAgICAgIHJldHVybiBmdW5jOworICAgICAgICAKKyAgICAgICAgbGV0IGluc3RhbmNlcyA9
IHRoaXMuX2luc3RhbmNlcy5nZXQoZnVuYyk7CisgICAgICAgIGlmICghZnVuY3Rpb25zKQorICAg
ICAgICAgICAgdGhpcy5fZnVuY3Rpb25zLnNldChmdW5jLCBmdW5jdGlvbnMgPSBbXSk7CisgICAg
ICAgIAorICAgICAgICBmb3IgKGxldCBpbnN0YW5jZSBvZiBpbnN0YW5jZXMpIHsKKyAgICAgICAg
ICAgIGxldCBvayA9IHRydWU7CisgICAgICAgICAgICBmb3IgKGxldCBpID0gaW5zdGFuY2UudHlw
ZUFyZ3VtZW50cy5sZW5ndGg7IGktLTspIHsKKyAgICAgICAgICAgICAgICBpZiAoIWluc3RhbmNl
LnR5cGVBcmd1bWVudHNbaV0uZXF1YWxzKHR5cGVBcmd1bWVudHNbaV0pKSB7CisgICAgICAgICAg
ICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghb2spCisgICAgICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuZnVuYzsKKyAg
ICAgICAgfQorICAgICAgICAKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlv
bi5tYXBwaW5nKGZ1bmMudHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpOworICAgICAgICBs
ZXQgcmVzdWx0aW5nRnVuYyA9IG5ldyBGdW5jRGVmKAorICAgICAgICAgICAgZnVuYy5vcmlnaW4s
IGZ1bmMubmFtZSwKKyAgICAgICAgICAgIGZ1bmMucmV0dXJuVHlwZS52aXNpdChzdWJzdGl0dXRp
b24pLAorICAgICAgICAgICAgW10sIC8vIFdlJ3JlIGluc3RhbnRpYXRlZCBzbyB3ZSBubyBsb25n
ZXIgdGFrZSB0eXBlIHBhcmFtZXRlcnMuCisgICAgICAgICAgICBwYXJhbWV0ZXJzLm1hcChwYXJh
bWV0ZXIgPT4gcGFyYW1ldGVyLnZpc2l0KHN1YnN0aXR1dGlvbikpLAorICAgICAgICAgICAgYm9k
eS52aXNpdChzdWJzdGl0dXRpb24pKTsKKyAgICAgICAgbGV0IGluc3RhbmNlID0ge2Z1bmM6IHJl
c3VsdGluZ0Z1bmMsIHR5cGVBcmd1bWVudHN9OworICAgICAgICBpbnN0YW5jZXMucHVzaChpbnN0
YW5jZSk7CisgICAgICAgIHJldHVybiBmdW5jOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvRnVuY1BhcmFtZXRlci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdS
SS9GdW5jUGFyYW1ldGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1
bmNQYXJhbWV0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBGdW5jUGFyYW1ldGVyIGV4dGVuZHMgVmFsdWUgeworICAgIC8vIFRoZSBuYW1lIGlzIG9wdGlv
bmFsLiBJdCdzIE9LIGZvciBpdCB0byBiZSBudWxsIQorICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
bmFtZSwgdHlwZSkKKyAgICB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuX29yaWdp
biA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5
cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5f
b3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0
IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgaWYgKCF0aGlzLm5hbWUpCisgICAgICAgICAgICByZXR1cm4gIiIgKyB0aGlz
LnR5cGU7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0aGlzLm5hbWU7CisgICAg
fQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jU2lnbmF0dXJlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNTaWduYXR1cmUuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY1NpZ25hdHVyZS5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uTGlrZUJs
b2NrLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uTGlrZUJsb2Nr
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmN0aW9uTGlrZUJsb2Nr
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY3Rpb25M
aWtlQmxvY2sgZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBhcmd1bWVu
dExpc3QsIHBhcmFtZXRlcnMsIGJvZHkpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX2FyZ3VtZW50TGlzdCA9IGFyZ3VtZW50TGlzdDsKKyAgICAg
ICAgdGhpcy5fcGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX2JvZHkgPSBi
b2R5OworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2lu
OyB9CisgICAgZ2V0IGFyZ3VtZW50TGlzdCgpIHsgcmV0dXJuIHRoaXMuX2FyZ3VtZW50TGlzdDsg
fQorICAgIGdldCBwYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fcGFyYW1ldGVyczsgfQorICAg
IGdldCBib2R5KCkgeyByZXR1cm4gdGhpcy5fYm9keTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkK
KyAgICB7CisgICAgICAgIHJldHVybiAiWyZdICgiICsgcGFyYW1ldGVycyArICIpIHsgIiArIGJs
b2NrICsgIiB9KCIgKyBhcmd1bWVudExpc3QgKyAiKSI7CisgICAgfQorfQpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvSW5saW5lLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0lu
bGluZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9JbmxpbmUuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBB
cHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBS
RVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
IFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZF
TlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5Z
IERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9S
IENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisg
KiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVT
RSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZF
UiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBD
T05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdF
TkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBP
RiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNV
Q0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitmdW5jdGlvbiBpbmxpbmUocHJvZ3Jh
bSkKK3sKKyAgICBmb3IgKGxldCBmdW5jIG9mIHByb2dyYW0uZnVuY3Rpb25zKSB7CisgICAgICAg
IGlmICghZnVuYy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICBfaW5saW5lRnVu
Y3Rpb24ocHJvZ3JhbSwgZnVuYywgbmV3IFZpc2l0aW5nU2V0KGZ1bmMpKTsKKyAgICB9Cit9CisK
K2Z1bmN0aW9uIF9pbmxpbmVGdW5jdGlvbihwcm9ncmFtLCBmdW5jLCB2aXNpdGluZykKK3sKKyAg
ICBpZiAoZnVuYy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgIHRocm93IG5ldyBFcnJv
cigiQ2Fubm90IGlubGluZSBmdW5jdGlvbiB0aGF0IGhhcyB0eXBlIHBhcmFtZXRlcnMiKTsKKyAg
ICBpZiAoZnVuYy5pbmxpbmVkKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gVGhpcyBp
cyB0aGUgcHJlY2lzZSB0aW1lIHdoZW4gd2UgY2FuIGJ1aWxkIEVCdWZmZXJzIGluIG9yZGVyIHRv
IGdldCB0aGVtIHRvIGJlIHVuaXF1ZWQgYnkKKyAgICAvLyB0eXBlIGluc3RhbnRpYXRpb24gYnV0
IG5vdGhpbmcgZWxzZS4KKyAgICBmdW5jLnZpc2l0KG5ldyBFQnVmZmVyQnVpbGRlcigpKTsKKyAg
ICAKKyAgICBmdW5jLmJvZHkgPSBmdW5jLmJvZHkudmlzaXQobmV3IElubGluZXIocHJvZ3JhbSwg
ZnVuYywgdmlzaXRpbmcpKTsKKyAgICBmdW5jLmlubGluZWQgPSB0cnVlOworfQorCitmdW5jdGlv
biByZXNvbHZlSW5saW5lZEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFy
Z3VtZW50VHlwZXMpCit7CisgICAgbGV0IG92ZXJsb2FkID0gcHJvZ3JhbS5yZXNvbHZlRnVuY092
ZXJsb2FkKG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpOworICAgIGlmICghb3Zl
cmxvYWQpCisgICAgICAgIHJldHVybiBudWxsOworICAgIGlmICghb3ZlcmxvYWQuZnVuYy50eXBl
UGFyYW1ldGVycykKKyAgICAgICAgcmV0dXJuIG92ZXJsb2FkLmZ1bmM7CisgICAgbGV0IGZ1bmMg
PSBwcm9ncmFtLmZ1bmNJbnN0YW50aWF0b3IuZ2V0VW5pcXVlKG92ZXJsb2FkLmZ1bmMsIG92ZXJs
b2FkLnR5cGVBcmd1bWVudHMpOworICAgIF9pbmxpbmVGdW5jdGlvbihwcm9ncmFtLCBmdW5jLCBu
ZXcgVmlzaXRpbmdTZXQob3ZlcmxvYWQuZnVuYykpOworICAgIHJldHVybiBmdW5jOworfQpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5lci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJh
eUxhbmdSSS9JbmxpbmVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0lu
bGluZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdo
dCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0
cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRo
b3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9s
bG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Yg
c291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgor
ICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5k
L29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgor
ICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQg
QU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElU
WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVE
LiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJ
QUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBF
WEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VT
OyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ
VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwg
V0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xV
RElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU
SEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJ
QklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBJbmxp
bmVyIGV4dGVuZHMgUmV3cml0ZXIgeworICAgIGNvbnN0cnVjdG9yKHByb2dyYW0sIGZ1bmMsIHZp
c2l0aW5nKQorICAgIHsKKyAgICAgICAgdGhpcy5fcHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAg
IHRoaXMuX3Zpc2l0aW5nID0gdmlzaXRpbmc7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2FsbEV4
cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLmZ1bmMuaXNOYXRpdmUpCisg
ICAgICAgICAgICByZXR1cm47CisgICAgICAgIHJldHVybiB0aGlzLl92aXNpdGluZy5kb1Zpc2l0
KG5vZGUuZnVuYywgKCkgPT4geworICAgICAgICAgICAgbGV0IGZ1bmMgPSB0aGlzLl9wcm9ncmFt
LmZ1bmNJbnN0YW50aWF0b3IuZ2V0VW5pcXVlKG5vZGUuZnVuYywgbm9kZS5hY3R1YWxUeXBlQXJn
dW1lbnRzKTsKKyAgICAgICAgICAgIF9pbmxpbmVGdW5jdGlvbih0aGlzLl9wcm9ncmFtLCBmdW5j
LCB0aGlzLl92aXNpdGluZyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTGlrZUJs
b2NrKAorICAgICAgICAgICAgICAgIG5vZGUub3JpZ2luLAorICAgICAgICAgICAgICAgIG5vZGUu
YXJndW1lbnRMaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSksCisgICAg
ICAgICAgICAgICAgZnVuYy5wYXJhbWV0ZXJzLCBmdW5jLmJvZHkpOworICAgICAgICB9KTsKKyAg
ICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0luc3RhbnRpYXRlSW1tZWRpYXRlcy5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbnN0YW50aWF0ZUltbWVkaWF0ZXMu
anMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW5zdGFudGlhdGVJbW1lZGlh
dGVzLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgSW5zdGFu
dGlhdGVJbW1lZGlhdGVzIGV4dGVuZHMgUmV3cml0ZXIgeworICAgIHZpc2l0VHlwZVJlZihub2Rl
KQorICAgIHsKKyAgICAgICAgbm9kZSA9IHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICAg
ICAgcmV0dXJuIG5vZGUuaW5zdGFudGlhdGVkVHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9k
ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgSW50TGl0ZXJhbCBleHRlbmRzIEV4cHJlc3Npb24gewor
ICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgdmFsdWUpCisgICAgeworICAgICAgICBzdXBlcihvcmln
aW4pOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQg
dmFsdWUoKSB7IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsg
cmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1
cm4gIiIgKyB0aGlzLl92YWx1ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0ludHJpbnNpY3MuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW50cmluc2lj
cy5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgSW50cmluc2ljcyB7Cisg
ICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1hcCgpOwor
CisgICAgICAgIC8vIE5PVEU6IEludHJpbnNpYyByZXNvbHV0aW9uIGhhcHBlbnMgYmVmb3JlIHR5
cGUgbmFtZSByZXNvbHV0aW9uLCBzbyB0aGUgc3RyaW5ncyB3ZSB1c2UgaGVyZQorICAgICAgICAv
LyB0byBjYXRjaCB0aGUgaW50cmluc2ljcyBtdXN0IGJlIGJhc2VkIG9uIHRoZSB0eXBlIG5hbWVz
IHRoYXQgU3RhbmRhcmRMaWJyYXJ5LmpzIHVzZXMuIEZvcgorICAgICAgICAvLyBleGFtcGxlLCBp
ZiBhIG5hdGl2ZSBmdW5jdGlvbiBpcyBkZWNsYXJlZCB1c2luZyAiaW50IiByYXRoZXIgdGhhbiAi
aW50MzIiLCB0aGVuIHdlIG11c3QgdXNlCisgICAgICAgIC8vICJpbnQiIGhlcmUsIHNpbmNlIHdl
IGRvbid0IHlldCBrbm93IHRoYXQgdGhleSBhcmUgdGhlIHNhbWUgdHlwZS4KKyAgICAgICAgCisg
ICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1pdGl2ZSB0eXBl
IHZvaWQ8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAgICAgICAgICAgIHRoaXMu
dm9pZCA9IHR5cGU7CisgICAgICAgICAgICAgICAgdHlwZS5zaXplID0gMDsKKyAgICAgICAgICAg
ICAgICB0eXBlLnBvcHVsYXRlRGVmYXVsdFZhbHVlID0gKCkgPT4geyB9OworICAgICAgICAgICAg
fSk7CisKKyAgICAgICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgcHJpbWl0
aXZlIHR5cGUgaW50MzI8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4geworICAgICAgICAgICAg
ICAgIHRoaXMuaW50MzIgPSB0eXBlOworICAgICAgICAgICAgICAgIHR5cGUuc2l6ZSA9IDE7Cisg
ICAgICAgICAgICAgICAgdHlwZS5wb3B1bGF0ZURlZmF1bHRWYWx1ZSA9IChidWZmZXIsIG9mZnNl
dCkgPT4gYnVmZmVyLnNldChvZmZzZXQsIG5ldyBFSW50KHR5cGUsIDApKTsKKyAgICAgICAgICAg
IH0pOworCisgICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0aXZlIHByaW1p
dGl2ZSB0eXBlIGRvdWJsZTw+IiwKKyAgICAgICAgICAgICh0eXBlKSA9PiB7CisgICAgICAgICAg
ICAgICAgdGhpcy5kb3VibGUgPSB0eXBlOworICAgICAgICAgICAgICAgIHR5cGUuc2l6ZSA9IDE7
CisgICAgICAgICAgICAgICAgdHlwZS5wb3B1bGF0ZURlZmF1bHRWYWx1ZSA9CisgICAgICAgICAg
ICAgICAgICAgIChidWZmZXIsIG9mZnNldCkgPT4gYnVmZmVyLnNldChvZmZzZXQsIG5ldyBFRmxv
YXQodHlwZSwgMCkpOworICAgICAgICAgICAgfSk7CisgICAgICAgIAorICAgICAgICB0aGlzLl9t
YXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBpbnQgb3BlcmF0b3IrPD4oaW50LGludCkiLAor
ICAgICAgICAgICAgKGZ1bmMpID0+IHsKKyAgICAgICAgICAgICAgICBmdW5jLmltcGxlbWVudGF0
aW9uID0KKyAgICAgICAgICAgICAgICAgICAgKFtsZWZ0LCByaWdodF0pID0+IEVQdHIuYm94KGxl
ZnQubG9hZFZhbHVlKCkuYWRkKHJpZ2h0LmxvYWRWYWx1ZSgpKSk7CisgICAgICAgICAgICB9KTsK
KyAgICB9CisgICAgCisgICAgYWRkKHRoaW5nKQorICAgIHsKKyAgICAgICAgbGV0IGludHJpbnNp
YyA9IHRoaXMuX21hcC5nZXQodGhpbmcubmFtZSk7CisgICAgICAgIGlmICghaW50cmluc2ljKQor
ICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKHRoaW5nLm9yaWdpbi5vcmlnaW5TdHJp
bmcsICJVbnJlY29nbml6ZWQgaW50cmluc2ljOiAiICsgdGhpbmcpOworICAgICAgICBpbnRyaW5z
aWModGhpbmcpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwx
NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgTGV4ZXIgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbGluZU51
bWJlck9mZnNldCwgdGV4dCkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsK
KyAgICAgICAgdGhpcy5fbGluZU51bWJlck9mZnNldCA9IGxpbmVOdW1iZXJPZmZzZXQ7CisgICAg
ICAgIHRoaXMuX3RleHQgPSB0ZXh0OworICAgICAgICB0aGlzLl9pbmRleCA9IDA7CisgICAgICAg
IHRoaXMuX3N0YWNrID0gW107CisgICAgfQorICAgIAorICAgIGdldCBsaW5lTnVtYmVyKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLmxpbmVOdW1iZXJGb3JJbmRleCh0aGlzLl9pbmRleCk7
CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0K
KyAgICAKKyAgICBnZXQgb3JpZ2luU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
Ll9vcmlnaW4gKyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAorICAg
IGxpbmVOdW1iZXJGb3JJbmRleChpbmRleCkKKyAgICB7CisgICAgICAgIGxldCBtYXRjaGVzID0g
dGhpcy5fdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpLm1hdGNoKC9cbi9nKTsKKyAgICAgICAgcmV0
dXJuIChtYXRjaGVzID8gbWF0Y2hlcy5sZW5ndGggOiAwKSArIHRoaXMuX2xpbmVOdW1iZXJPZmZz
ZXQ7CisgICAgfQorICAgIAorICAgIGdldCBzdGF0ZSgpIHsgcmV0dXJuIHRoaXMuX2luZGV4OyB9
CisgICAgc2V0IHN0YXRlKHZhbHVlKSB7IHRoaXMuX2luZGV4ID0gdmFsdWU7IH0KKyAgICAKKyAg
ICBuZXh0KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9zdGFjay5sZW5ndGgpCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5fc3RhY2sucG9wKCk7CisgICAgICAgIAorICAgICAgICBpZiAodGhp
cy5faW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsK
KyAgICAgICAgCisgICAgICAgIGNvbnN0IGlzQ0NvbW1lbnRCZWdpbiA9IC9cL1wqLzsKKyAgICAg
ICAgY29uc3QgaXNDUGx1c1BsdXNDb21tZW50QmVnaW4gPSAvXC9cLy87CisgICAgICAgIAorICAg
ICAgICBsZXQgcmVzdWx0ID0gKGtpbmQpID0+IHsKKyAgICAgICAgICAgIGxldCB0ZXh0ID0gUmVn
RXhwLmxhc3RNYXRjaDsKKyAgICAgICAgICAgIGxldCB0b2tlbiA9IG5ldyBMZXhlclRva2VuKHRo
aXMsIHRoaXMuX2luZGV4LCBraW5kLCB0ZXh0KTsKKyAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9
IHRleHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAgICB9OworCisg
ICAgICAgIGxldCByZWxldmFudFRleHQ7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAg
IHJlbGV2YW50VGV4dCA9IHRoaXMuX3RleHQuc3Vic3RyaW5nKHRoaXMuX2luZGV4KTsKKyAgICAg
ICAgICAgIGlmICgvXlxzKy8udGVzdChyZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAg
dGhpcy5faW5kZXggKz0gUmVnRXhwLmxhc3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoL15cL1wqLy50ZXN0KHJl
bGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICBsZXQgZW5kSW5kZXggPSByZWxldmFudFRl
eHQuc2VhcmNoKC9cKlwvLyk7CisgICAgICAgICAgICAgICAgaWYgKGVuZEluZGV4IDwgMCkKKyAg
ICAgICAgICAgICAgICAgICAgdGhpcy5mYWlsKCJVbnRlcm1pbmF0ZWQgY29tbWVudCIpOworICAg
ICAgICAgICAgICAgIHRoaXMuX2luZGV4ICs9IGVuZEluZGV4OworICAgICAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9cLy4qLy50ZXN0KHJl
bGV2YW50VGV4dCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBSZWdFeHAubGFz
dE1hdGNoLmxlbmd0aDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0K
KyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodGhp
cy5faW5kZXggPj0gdGhpcy5fdGV4dC5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsK
KyAgICAgICAgCisgICAgICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgZG8gVW5pY29kZS4KKyAgICAg
ICAgaWYgKC9eW15cZFxXXVx3Ki8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0
dXJuIHJlc3VsdCgiaWRlbnRpZmllciIpOworCisgICAgICAgIGlmICgvXlswLTldKy8udGVzdChy
ZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgiaW50TGl0ZXJhbCIpOwor
CisgICAgICAgIC8vIEZJWE1FOiBNYWtlIHRoaXMgaGFuZGxlIGV4cC1mb3JtIGxpdGVyYWxzIGxp
a2UgMWUxLgorICAgICAgICBpZiAoL14oWzAtOV0qXC5bMC05XSspfChbMC05XStcLlswLTldKikv
LnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImRvdWJsZUxp
dGVyYWwiKTsKKyAgICAgICAgCisgICAgICAgIGlmICgvXihzdHJ1Y3R8cHJvdG9jb2x8dHlwZXxp
ZnxlbHNlfGVudW18Y29udGludWV8YnJlYWt8c3dpdGNofGNhc2V8ZGVmYXVsdHxmb3J8d2hpbGV8
ZG98cmV0dXJufHNpemVvZnxjb25zdGFudHxkZXZpY2V8dGhyZWFkZ3JvdXB8dGhyZWFkfG9wZXJh
dG9yfG51bGwpLy50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0
KCJrZXl3b3JkIik7CisgICAgICAgIAorICAgICAgICBpZiAoL14oW3t9KClcW1xdPzo9KypcLywu
JSF+XiZ8PD5cXDstXXwtPnw9Pnw8PXw9PXwhPXxcKz18LT18XCo9fFwvPXwlPXxePXxcfD18Jj0p
Ly50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJwdW5jdHVh
dGlvbiIpOworICAgICAgICAKKyAgICAgICAgbGV0IHJlbWFpbmluZyA9IHJlbGV2YW50VGV4dC5z
dWJzdHJpbmcoMCwgMjApLnNwbGl0KC9ccy8pWzBdOworICAgICAgICBpZiAoIXJlbWFpbmluZy5s
ZW5ndGgpCisgICAgICAgICAgICByZW1haW5pbmcgPSByZWxldmFudFRleHQuc3Vic3RyaW5nKDAs
IDIwKTsKKyAgICAgICAgdGhpcy5mYWlsKCJVbnJlY29nbml6ZWQgdG9rZW4gYmVnaW5uaW5nIHdp
dGg6ICIgKyByZW1haW5pbmcpOworICAgIH0KKyAgICAKKyAgICBwdXNoKHRva2VuKQorICAgIHsK
KyAgICAgICAgdGhpcy5fc3RhY2sucHVzaCh0b2tlbik7CisgICAgfQorICAgIAorICAgIHBlZWso
KQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMubmV4dCgpOworICAgICAgICB0aGlz
LnB1c2gocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAg
ZmFpbChlcnJvcikKKyAgICB7CisgICAgICAgIHRocm93IG5ldyBBTFN5bnRheEVycm9yKHRoaXMu
b3JpZ2luU3RyaW5nLCBlcnJvcik7CisgICAgfQorICAgIAorICAgIGJhY2t0cmFja2luZ1Njb3Bl
KGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgbGV0IHN0YXRlID0gdGhpcy5zdGF0ZTsKKyAgICAg
ICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjYWxsYmFjaygpOworICAgICAgICB9IGNhdGNo
IChlKSB7CisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEFMU3ludGF4RXJyb3IpIHsKKyAg
ICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICAgICAgcmV0dXJu
IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9Cisg
ICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBMZXhlclRva2VuIHsKKyAgICBjb25zdHJ1Y3RvcihsZXhlciwgaW5k
ZXgsIGtpbmQsIHRleHQpCisgICAgeworICAgICAgICB0aGlzLl9sZXhlciA9IGxleGVyOworICAg
ICAgICB0aGlzLl9pbmRleCA9IGluZGV4OworICAgICAgICB0aGlzLl9raW5kID0ga2luZDsKKyAg
ICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CisgICAgfQorICAgIAorICAgIGdldCBraW5kKCkKKyAg
ICB7CisgICAgICAgIHJldHVybiB0aGlzLl9raW5kOworICAgIH0KKyAgICAKKyAgICBnZXQgdGV4
dCgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fdGV4dDsKKyAgICB9CisgICAgCisgICAg
Z2V0IG9yaWdpbigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fbGV4ZXIub3JpZ2luOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgaW5kZXgoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
X2luZGV4OworICAgIH0KKyAgICAKKyAgICBnZXQgbGluZU51bWJlcigpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fbGV4ZXIubGluZU51bWJlckZvckluZGV4KHRoaXMuX2luZGV4KTsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5vcmlnaW4gKyAiOiIgKyAodGhpcy5saW5lTnVtYmVyICsgMSk7CisgICAgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAiTGV4ZXJUb2tlbigiICsgdGhp
cy5raW5kICsgIiwgIiArIHRoaXMudGV4dCArICIsICIgKyB0aGlzLmxpbmVOdW1iZXIgKyAiKSI7
CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY29uc3QgTm90RnVuYyA9IFN5bWJvbCgpOworCitmdW5jdGlvbiBp
c1dpbGRjYXJkS2luZChraW5kKQoreworICAgIHJldHVybiBraW5kID09IE5vdEZ1bmM7Cit9CisK
K2NsYXNzIE5hbWVDb250ZXh0IHsKKyAgICBjb25zdHJ1Y3RvcihkZWxlZ2F0ZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX2Z1bmNNYXAgPSBuZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX21hcCA9IG5l
dyBNYXAoKTsKKyAgICAgICAgdGhpcy5fZGVmaW5lZCA9IG5ldyBTZXQoKTsKKyAgICAgICAgdGhp
cy5fY3VycmVudFN0YXRlbWVudCA9IG51bGw7CisgICAgICAgIHRoaXMuX2RlbGVnYXRlID0gbnVs
bDsKKyAgICAgICAgdGhpcy5faW50cmluc2ljcyA9IG51bGw7CisgICAgICAgIHRoaXMuX3Byb2dy
YW0gPSBudWxsOworICAgIH0KKyAgICAKKyAgICBtYXBGb3Ioa2luZCkKKyAgICB7CisgICAgICAg
IHN3aXRjaCAoa2luZCkgeworICAgICAgICBjYXNlIE5vdEZ1bmM6CisgICAgICAgIGNhc2UgVmFs
dWU6CisgICAgICAgIGNhc2UgVHlwZToKKyAgICAgICAgY2FzZSBQcm90b2NvbDoKKyAgICAgICAg
ICAgIHJldHVybiB0aGlzLl9tYXA7CisgICAgICAgIGNhc2UgRnVuYzoKKyAgICAgICAgICAgIHJl
dHVybiB0aGlzLl9mdW5jTWFwOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdGhyb3cg
bmV3IEVycm9yKCJCYWQga2luZDogIiArIGtpbmQpOworICAgICAgICB9CisgICAgfQorICAgIAor
ICAgIGFkZCh0aGluZykKKyAgICB7CisgICAgICAgIGlmICghdGhpbmcubmFtZSkKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICh0aGluZy5pc05hdGl2ZSkgeworICAg
ICAgICAgICAgaWYgKCF0aGlzLl9pbnRyaW5zaWNzKQorICAgICAgICAgICAgICAgIHRocm93IG5l
dyBFcnJvcigiTmF0aXZlIGZ1bmN0aW9uIGluIGEgc2NvcGUgdGhhdCBkb2VzIG5vdCByZWNvZ25p
emUgaW50cmluc2ljcyIpOworICAgICAgICAgICAgdGhpcy5faW50cmluc2ljcy5hZGQodGhpbmcp
OworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAodGhpbmcua2luZCA9PSBGdW5jKSB7
CisgICAgICAgICAgICBsZXQgYXJyYXkgPSB0aGlzLl9mdW5jTWFwLmdldCh0aGluZy5uYW1lKTsK
KyAgICAgICAgICAgIGlmICghYXJyYXkpCisgICAgICAgICAgICAgICAgdGhpcy5fZnVuY01hcC5z
ZXQodGhpbmcubmFtZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHRoaW5n
KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5fbWFw
Lmhhcyh0aGluZy5uYW1lKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGlu
Zy5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiRHVwbGljYXRlIG5hbWU6ICIgKyB0aGluZy5uYW1lKTsK
KyAgICAgICAgdGhpcy5fbWFwLnNldCh0aGluZy5uYW1lLCB0aGluZyk7CisgICAgfQorICAgIAor
ICAgIGdldChraW5kLCBuYW1lKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG1hcEZvcihr
aW5kKS5nZXQobmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0ICYmIHRoaXMuX2RlbGVnYXRlKQor
ICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmdldChraW5kLCBuYW1lKTsKKyAgICAg
ICAgaWYgKCFpc1dpbGRjYXJkS2luZChraW5kKSAmJiByZXN1bHQua2luZCAhPSBraW5kKQorICAg
ICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAg
IAorICAgIGdldCBjdXJyZW50U3RhdGVtZW50KCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLl9j
dXJyZW50U3RhdGVtZW50KQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTdGF0ZW1l
bnQ7CisgICAgICAgIGlmICh0aGlzLl9kZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlz
Ll9kZWxlZ2F0ZS5jdXJyZW50U3RhdGVtZW50OworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9
CisgICAgCisgICAgaXNEZWZpbmVkKHRoaW5nKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMu
X2RlZmluZWQuaGFzKHRoaW5nKQorICAgICAgICAgICAgfHwgKHRoaXMuX2RlbGVnYXRlICYmIHRo
aXMuX2RlbGVnYXRlLmlzRGVmaW5lZCh0aGluZykpOworICAgIH0KKyAgICAKKyAgICBkZWZpbmUo
dGhpbmcpCisgICAgeworICAgICAgICB0aGlzLl9kZWZpbmVkLnNldCh0aGluZyk7CisgICAgfQor
ICAgIAorICAgIGRlZmluZUFsbCgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0aGluZyBvZiB0
aGlzKQorICAgICAgICAgICAgZGVmaW5lKHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZG9TdGF0
ZW1lbnQoc3RhdGVtZW50LCBjYWxsYmFjaykKKyAgICB7CisgICAgICAgIHRoaXMuX2N1cnJlbnRT
dGF0ZW1lbnQgPSBzdGF0ZW1lbnQ7CisgICAgICAgIGNhbGxiYWNrKCk7CisgICAgICAgIHRoaXMu
X2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgICAgICBkZWZpbmUoc3RhdGVtZW50KTsKKyAg
ICB9CisgICAgCisgICAgcmVjb2duaXplSW50cmluc2ljcygpCisgICAgeworICAgICAgICB0aGlz
Ll9pbnRyaW5zaWNzID0gbmV3IEludHJpbnNpY3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGlu
dHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAgICAg
ICAgICByZXR1cm4gdGhpcy5faW50cmluc2ljczsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRl
KQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAgICAg
IHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAgICB7
CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSB2YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHBy
b2dyYW0oKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAgICBy
ZXR1cm4gdGhpcy5fcHJvZ3JhbTsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLnByb2dyYW07CisgICAgICAgIHJldHVybiBudWxs
OworICAgIH0KKyAgICAKKyAgICAqW1N5bWJvbC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAgICAg
Zm9yIChsZXQgbWFwIG9mIHRoaXMuX21hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChs
ZXQgdHlwZSBvZiB0aGlzLl90eXBlcy52YWx1ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVsZCB0
eXBlOworICAgICAgICB9CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZVJl
c29sdmVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hbWVSZXNvbHZlci5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OYW1lUmVzb2x2ZXIuanMJKHdv
cmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcg
QXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFu
ZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9k
aWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25k
aXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2Rl
IG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlz
dHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBt
YXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09G
VFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQ
UkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F
U1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVW
RU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFO
WSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBP
UiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAor
ICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBV
U0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VW
RVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g
Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElH
RU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICog
T0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBT
VUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBvbmx5IHJlc29sdmVz
IG5hbWVzLiBBZnRlciB0aGlzIHBoYXNlIHJ1bnMsIGFsbCBuYW1lcyB3aWxsIGJlIHJlc29sdmVk
LiBUaGlzIG1lYW5zIHRoYXQgYWxsCisvLyBYWVpSZWYgb2JqZWN0cyBub3cga25vdyB3aG8gdGhl
eSByZXNvbHZlIHRvLiBUaGlzIGRvZXMgbm90IHlldCBhbGxvdyB0eXBlIGFuYWx5c2lzLCBiZWNh
dXNlIHRoZXJlCisvLyBhcmUgc3RpbGwgVHlwZURlZnMuIFRoaXMgdGhyb3dzIHR5cGUgZXJyb3Jz
IGZvciBmYWlsZWQgbmFtZSByZXNvbHV0aW9ucyBhbmQgZm9yIHRoaW5ncyB0aGF0IGFyZQorLy8g
bW9yZSBjb252ZW5pZW50IHRvIGNoZWNrIGhlcmUgdGhhbiBpbiB0aGUgQ2hlY2tlci4gVGhpcyB1
c3VhbGx5IGludm9sdmVzIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUKKy8vIGNoZWNrZWQgYmVmb3Jl
IFR5cGVSZWZUb1R5cGVEZWZTa2lwcGVyLgorY2xhc3MgTmFtZVJlc29sdmVyIGV4dGVuZHMgVmlz
aXRvciB7CisgICAgLy8gSXQncyB0b3RhbGx5IE9LIHRvIGluc3RhbnRpYXRlIHRoaXMgd2l0aCB6
ZXJvIGFyZ3VtZW50cyAoaS5lLiBwYXNzaW5nIHVuZGVmaW5lZCBmb3IgYm90aCBvZgorICAgIC8v
IHRoZW0pIGlmIHlvdSdyZSBjcmVhdGluZyBhIENoZWNrZXIgdG8gdmlzaXQgYSBQcm9ncmFtLgor
ICAgIGNvbnN0cnVjdG9yKG5hbWVDb250ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbmFtZUNv
bnRleHQgPSBuYW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm9ncmFtKG5vZGUp
CisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5f
bmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5wcm9ncmFtID0gbm9kZTsKKyAgICAg
ICAgbmFtZUNvbnRleHQucmVjb2duaXplSW50cmluc2ljcygpOworICAgICAgICBub2RlLmludHJp
bnNpY3MgPSBuYW1lQ29udGV4dC5pbnRyaW5zaWNzOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1l
bnQgb2Ygbm9kZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICBuYW1lQ29udGV4dC5h
ZGQoc3RhdGVtZW50KTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgQ2hlY2tlcihuYW1lQ29u
dGV4dCk7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3RhdGVt
ZW50cykKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmRvU3RhdGVtZW50KCgpID0+IHN0YXRlbWVu
dC52aXNpdChjaGVja2VyKSk7CisgICAgfQorICAgIAorICAgIF92aXNpdFR5cGVQYXJhbWV0ZXJz
QW5kQnVpbGROYW1lQ29udGV4dChub2RlKQorICAgIHsKKyAgICAgICAgbGV0IG5hbWVDb250ZXh0
ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChsZXQg
dHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBuYW1l
Q29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZp
c2l0KHRoaXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lQ29udGV4dDsKKyAgICB9
CisgICAgCisgICAgdmlzaXRGdW5jKG5vZGUpCisgICAgeworICAgICAgICBsZXQgY2hlY2tlciA9
IG5ldyBDaGVja2VyKHRoaXMuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0
KG5vZGUpKTsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KGNoZWNrZXIpOworICAgICAg
ICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAgcGFy
YW1ldGVyLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNEZWYobm9k
ZSkKKyAgICB7CisgICAgICAgIGxldCBjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzID0gdGhpcy5f
dmlzaXRUeXBlUGFyYW1ldGVyc0FuZEJ1aWxkTmFtZUNvbnRleHQobm9kZSk7CisgICAgICAgIGxl
dCBjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzID0gbmV3IENoZWNrZXIoY29udGV4dFdpdGhUeXBl
UGFyYW1ldGVycyk7CisgICAgICAgIG5vZGUucmV0dXJuVHlwZS52aXNpdChjaGVja2VyV2l0aFR5
cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgbGV0IGNvbnRleHRXaXRoUGFyYW1ldGVycyA9IG5ldyBO
YW1lQ29udGV4dChjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgZm9yIChsZXQg
cGFyYW1ldGVyIG9mIG5vZGUucGFyYW1ldGVycykgeworICAgICAgICAgICAgcGFyYW1ldGVyLnZp
c2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMpOworICAgICAgICAgICAgY29udGV4dFdpdGhQ
YXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2Vy
V2l0aFBhcmFtZXRlcnMgPSBuZXcgQ2hlY2tlcihjb250ZXh0V2l0aFBhcmFtZXRlcnMpOworICAg
ICAgICBub2RlLmJvZHkudmlzaXQoY2hlY2tlcldpdGhQYXJhbWV0ZXJzKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcg
Q2hlY2tlcihuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpKTsKKyAgICAgICAgZm9y
IChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVu
dC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm90b2NvbERlY2wobm9k
ZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlz
Ll9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVDb250ZXh0LmFkZChub2RlLnR5cGVWYXJpYWJs
ZSk7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3IENoZWNrZXIobmFtZUNvbnRleHQpOworICAg
ICAgICBmb3IgKGxldCBzaWduYXR1cmUgb2Ygbm9kZS5zaWduYXR1cmVzKQorICAgICAgICAgICAg
c2lnbmF0dXJlLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVEZWYo
bm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0
aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9k
ZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlz
KTsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAgICAgICAg
fQorICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsKKyAgICAg
ICAgbm9kZS50eXBlLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0cnVj
dFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29udGV4dCA9IG5ldyBOYW1lQ29u
dGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbWV0ZXIg
b2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNp
dCh0aGlzKTsKKyAgICAgICAgICAgIG5hbWVDb250ZXh0LmFkZCh0eXBlUGFyYW1ldGVyKTsKKyAg
ICAgICAgfQorICAgICAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKG5hbWVDb250ZXh0KTsK
KyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVs
ZC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAgCisgICAgX3Jlc29sdmVUeXBlQXJndW1lbnRz
KHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVB
cmd1bWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGxldCB0eXBlQXJndW1lbnQgPSB0
eXBlQXJndW1lbnRzW2ldOworICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudCBpbnN0YW5jZW9m
IFR5cGVPclZhcmlhYmxlUmVmKSB7CisgICAgICAgICAgICAgICAgbGV0IHRoaW5nID0gdGhpcy5f
bmFtZUNvbnRleHQuZ2V0KE5vdEZ1bmMsIHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAgICAg
ICAgICBpZiAoIXRoaW5nKQorICAgICAgICAgICAgICAgICAgICBuZXcgQUxUeXBlRXJyb3Iobm9k
ZS5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiQ291bGQgbm90IGZpbmQgdHlwZSBvciB2YXJpYWJsZSBu
YW1lZCAiICsgdHlwZUFyZ3VtZW50Lm5hbWUpOworICAgICAgICAgICAgICAgIGlmICh0aGluZyBp
bnN0YW5jZW9mIFZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9
IG5ldyBWYXJpYWJsZVJlZih0eXBlQXJndW1lbnQub3JpZ2luLCB0eXBlQXJndW1lbnQubmFtZSk7
CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVu
dFtpXSA9IG5ldyBUeXBlUmVmKHR5cGVBcmd1bWVudC5vcmlnaW4sIHR5cGVBcmd1bWVudC5uYW1l
LCBbXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0eXBl
QXJndW1lbnRbaV0gaW5zdGFuY2VvZiBWYWx1ZQorICAgICAgICAgICAgICAgICYmICF0eXBlQXJn
dW1lbnRbaV0uaXNDb25zdGV4cHIpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVy
cm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkV4cGVjdGVkIGNvbnN0ZXhwciIpOworICAg
ICAgICB9CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAg
ICAgdGhpcy5fcmVzb2x2ZVR5cGVBcmd1bWVudHMobm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICAg
ICAgCisgICAgICAgIGxldCB0eXBlID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFR5cGUsIG5vZGUu
bmFtZSk7CisgICAgICAgIGlmICghdHlwZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVF
cnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVk
ICIgKyBub2RlLm5hbWUpOworICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmlzRGVmaW5l
ZCh0eXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5v
cmlnaW5TdHJpbmcsICJJbGxlZ2FsIGZvcndhcmQgdXNlIG9mIHR5cGUgbmFtZWQgIiArIG5vZGUu
bmFtZSk7CisgICAgICAgIG5vZGUudHlwZSA9IHR5cGU7CisgICAgICAgIAorICAgICAgICBpZiAo
dHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGggIT0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkK
KyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAi
V3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1lbnRzIik7CisgICAgICAgIGZvciAobGV0IGkgPSAw
OyBpIDwgdHlwZS50eXBlUGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0
IHBhcmFtZXRlcklzVHlwZSA9IHR5cGUudHlwZVBhcmFtZXRlcnNbaV0gaW5zdGFuY2VvZiBUeXBl
VmFyaWFibGU7CisgICAgICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSBub2RlLnR5cGVBcmd1
bWVudHNbaV0gaW5zdGFuY2VvZiBUeXBlOworICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRz
W2ldLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcklzVHlwZSAmJiAhYXJn
dW1lbnRJc1R5cGUpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdp
bi5vcmlnaW5TdHJpbmcsICJFeHBlY3RlZCB0eXBlLCBidXQgZ290IHZhbHVlIGF0IGFyZ3VtZW50
ICMiICsgaSk7CisgICAgICAgICAgICBpZiAoIXBhcmFtZXRlcklzVHlwZSAmJiBhcmd1bWVudElz
VHlwZSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdp
blN0cmluZywgIkV4cGVjdGVkIHZhbHVlLCBidXQgZ290IHR5cGUgYXQgYXJndW1lbnQgIyIgKyBp
KTsKKyAgICAgICAgfQorCisgICAgICAgIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBsZXQg
bmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAg
ICBuYW1lQ29udGV4dC5kZWZpbmVBbGwoKTsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNp
dChuZXcgQ2hlY2tlcihuYW1lQ29udGV4dCkpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFZhcmlh
YmxlUmVmKG5vZGUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbmFtZUNvbnRl
eHQuZ2V0KFZhbHVlLCBub2RlLm5hbWUpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJDb3Vs
ZCBub3QgZmluZCB2YXJpYWJsZSBuYW1lZCAiICsgbm9kZS5uYW1lKTsKKyAgICAgICAgbm9kZS52
YXJpYWJsZSA9IHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAg
ICB7CisgICAgICAgIG5vZGUuZnVuYyA9IHRoaXMuX25hbWVDb250ZXh0LmN1cnJlbnRTdGF0ZW1l
bnQ7CisgICAgICAgIHN1cGVyLnZpc2l0UmV0dXJuKG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2
aXNpdENhbGxFeHByZXNzaW9uKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLl9yZXNvbHZlVHlw
ZUFyZ3VtZW50cyhub2RlLnR5cGVBcmd1bWVudHMpOworICAgICAgICBzdXBlci52aXNpdENhbGxF
eHByZXNzaW9uKG5vZGUpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmF0
aXZlRnVuYy5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVGdW5jLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZUZ1bmMuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVGdW5jIGV4dGVuZHMg
RnVuYyB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFy
YW1ldGVycywgcGFyYW1ldGVycykKKyAgICB7CisgICAgICAgIHN1cGVyKG5hbWUsIHJldHVyblR5
cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0g
b3JpZ2luOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgZ2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgdG9TdHJp
bmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJuYXRpdmUgIiArIHN1cGVyLnRvU3RyaW5nKCk7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZVR5cGUgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGlzUHJpbWl0aXZlLCB0eXBlUGFyYW1ldGVycykKKyAgICB7
CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAg
ICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX2lzUHJpbWl0aXZlID0gaXNQcmlt
aXRpdmU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7Cisg
ICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAg
ICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUo
KSB7IHJldHVybiB0aGlzLl9pc1ByaW1pdGl2ZTsgfQorICAgIGdldCB0eXBlUGFyYW1ldGVycygp
IHsgcmV0dXJuIHRoaXMuX3R5cGVQYXJhbWV0ZXJzOyB9CisgICAgZ2V0IGlzTmF0aXZlKCkgeyBy
ZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIGluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpCisgICAg
eworICAgICAgICBpZiAodHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gdGhpcy50eXBlUGFyYW1ldGVy
cy5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiB0
eXBlIGFyZ3VtZW50cyB0byBpbnN0YW50aWF0aW9uIik7CisgICAgICAgIGlmICghdHlwZUFyZ3Vt
ZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgcmV0dXJuIG5l
dyBOYXRpdmVUeXBlSW5zdGFuY2UodGhpcywgdHlwZUFyZ3VtZW50cyk7CisgICAgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAibmF0aXZlICIgKyAodGhpcy5p
c1ByaW1pdGl2ZSA/ICJwcmltaXRpdmUgIiA6ICIiKSArICJ0eXBlICIgKyB0aGlzLm5hbWUgKyAi
PCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsgIj4iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL05hdGl2ZVR5cGVJbnN0YW5jZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9OYXRpdmVUeXBlSW5zdGFuY2UuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBOYXRpdmVUeXBlSW5zdGFuY2UgZXh0ZW5kcyBUeXBlIHsKKyAg
ICBjb25zdHJ1Y3Rvcih0eXBlLCB0eXBlQXJndW1lbnRzKQorICAgIHsKKyAgICAgICAgdGhpcy5f
dHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRz
OworICAgIH0KKyAgICAKKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAg
ICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVudHM7IH0KKyAg
ICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLl90eXBlLmlzUHJpbWl0aXZlOyB9Cisg
ICAgZ2V0IGlzTmF0aXZlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHVuaWZ5SW1wbCh1
bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMudHlwZSAh
PSBvdGhlci50eXBlKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodGhp
cy50eXBlQXJndW1lbnRzLmxlbmd0aCAhPSBvdGhlci50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAg
ICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlz
LnR5cGVBcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghdGhpcy50eXBl
QXJndW1lbnRzW2ldLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZUFyZ3VtZW50
c1tpXSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAg
IHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy50eXBlICsgIjwiICsgdGhpcy50eXBlQXJndW1lbnRzICsgIj4iOworICAg
IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5qcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL05vZGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBO
b2RlIHsKKyAgICB2aXNpdCh2aXNpdG9yKQorICAgIHsKKyAgICAgICAgbGV0IHJldHVyblZhbHVl
ID0gdmlzaXRvclsidmlzaXQiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXSh0aGlzKTsKKyAgICAg
ICAgaWYgKCJyZXR1cm5WYWx1ZSIgaW4gdmlzaXRvcikKKyAgICAgICAgICAgIHJldHVybiB2aXNp
dG9yLnJldHVyblZhbHVlOworICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CisgICAgfQorICAg
IAorICAgIHVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBs
ZXQgdW5pZnlUaGlzID0gdGhpcy51bmlmeU5vZGU7CisgICAgICAgIGxldCB1bmlmeU90aGVyID0g
b3RoZXIudW5pZnlOb2RlOworICAgICAgICBpZiAodW5pZnlPdGhlci50eXBlVmFyaWFibGVVbmlm
eSh1bmlmaWNhdGlvbkNvbnRleHQsIHVuaWZ5VGhpcykpCisgICAgICAgICAgICByZXR1cm4gdHJ1
ZTsKKyAgICAgICAgcmV0dXJuIHVuaWZ5VGhpcy51bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0
LCB1bmlmeU90aGVyKTsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29u
dGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAob3RoZXIudHlwZVZhcmlhYmxlVW5pZnko
dW5pZmljYXRpb25Db250ZXh0LCB0aGlzKSkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAg
ICAgICByZXR1cm4gdGhpcyA9PSBvdGhlcjsKKyAgICB9CisgICAgCisgICAgdHlwZVZhcmlhYmxl
VW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiBm
YWxzZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHVuaWZ5Tm9kZSgpIHsgcmV0dXJuIHRoaXM7IH0K
KyAgICBnZXQgaXNVbmlmaWFibGUoKSB7IHJldHVybiBmYWxzZTsgfQorICAgIAorICAgIGdldCBp
c05hdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAgZXF1YWxzKG90aGVyKQorICAg
IHsKKyAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5ldyBVbmlmaWNhdGlvbkNvbnRl
eHQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
cikgJiYgdW5pZmljYXRpb25Db250ZXh0LmlzVW51bmlmaWVkKCk7CisgICAgfQorICAgIAorICAg
IHN1YnN0aXR1dGUocGFyYW1ldGVycywgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMudmlzaXQoU3Vic3RpdHV0aW9uLm1hcHBpbmcocGFyYW1ldGVycywgYXJndW1lbnRM
aXN0KSk7CisgICAgfQorICAgIAorICAgIHN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKHBhcmFtZXRl
cnMsIHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiBzdWJzdGl0dXRl
KHBhcmFtZXRlcnMsIHBhcmFtZXRlcnMubWFwKHR5cGUgPT4gdW5pZmljYXRpb25Db250ZXh0LmZp
bmQodHlwZSkpKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OdWxsVHlwZS5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9OdWxsVHlwZS5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9OdWxsVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAt
MCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NsYXNzIE51bGxUeXBlIGV4dGVuZHMgVHlwZSB7CisgICAgLy8g
RklYTUU6IFRoaXMgd2lsbCBoYXZlIHRvIGJlaGF2ZSBsaWtlIGEgdHlwZSB2YXJpYWJsZSBmb3Ig
dGhlIHB1cnBvc2VzIG9mIHVuaWZpY2F0aW9uLCBzbyB0aGF0CisgICAgLy8gaXQgY2FuIGJlIHVu
aWZpZWQgd2l0aCBhbnkgcG9pbnRlciB0eXBlLiBUaGVuLCB3ZSBjYW4gZG8gYSB2ZXJpZmljYXRp
b24gYXQgdGhlIGVuZCB0byBzZWUgaWYKKyAgICAvLyB3ZSBnb3QgdW5pZmllZCB3aXRoIGEgcG9p
bnRlciB0eXBlLgorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9QYXJzZS5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QYXJzZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9QYXJzZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDY1MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitmdW5jdGlvbiBwYXJzZShwcm9ncmFtLCBvcmlnaW4sIGxpbmVOdW1iZXJPZmZzZXQsIHRl
eHQpCit7CisgICAgbGV0IGxleGVyID0gbmV3IExleGVyKG9yaWdpbiwgbGluZU51bWJlck9mZnNl
dCwgdGV4dCk7CisgICAgCisgICAgLy8gVGhlIGhhcmRlc3QgcGFydCBvZiBkZWFsaW5nIHdpdGgg
Qy1saWtlIGxhbmd1YWdlcyBpcyBwYXJzaW5nIHZhcmlhYmxlIGRlY2xhcmF0aW9uIHN0YXRlbWVu
dHMuCisgICAgLy8gTGV0J3MgY29uc2lkZXIgaWYgdGhpcyBoYXBwZW5zIGluIEFycmF5TGFuZy4g
SGVyZSBhcmUgdGhlIHZhbGlkIHN0YXRlbWVudHMgaW4gQXJyYXlMYW5nIHRoYXQKKyAgICAvLyBi
ZWdpbiB3aXRoIGFuIGlkZW50aWZpZXIsIGlmIHdlIGFzc3VtZSB0aGF0IGFueSBleHByZXNzaW9u
IGNhbiBiZSBhIHN0YW5kYWxvbmUgc3RhdGVtZW50LgorICAgIC8vCisgICAgLy8gICAgIHg7Cisg
ICAgLy8gICAgIHggPGJpbm9wPiB5OworICAgIC8vICAgICB4IDwgeTsKKyAgICAvLyAgICAgeCA8
IHkgPiB6OworICAgIC8vICAgICB4ID0geTsKKyAgICAvLyAgICAgeC5mID0geTsKKyAgICAvLyAg
ICAgXGV4cCA9IHk7CisgICAgLy8gICAgIHhbNDJdID0geTsKKyAgICAvLyAgICAgeCgpOworICAg
IC8vICAgICB4PHk+KCk7CisgICAgLy8gICAgIHggeTsKKyAgICAvLyAgICAgeDx5PiB6OworICAg
IC8vICAgICBkZXZpY2UgeFtdIHk7CisgICAgLy8gICAgIHhbNDJdIHk7CisgICAgLy8gICAgIGRl
dmljZSB4XiB5OworICAgIC8vICAgICB0aHJlYWQgeF5eIHk7CisgICAgLy8gICAgIHhedGhyZWFk
XnRocmVhZCB5OworICAgIC8vICAgICB4XmRldmljZV50aHJlYWQgeTsKKyAgICAvLworICAgIC8v
IFRoaXMgaGFzIHR3byBwcm9ibGVtIGFyZWFzOgorICAgIC8vCisgICAgLy8gICAgIC0geDx5Pnog
Y2FuIHBhcnNlIHR3byBkaWZmZXJlbnQgd2F5cyAoYXMgKHggPCB5KSA+IHogb3IgeDx5PiB6KS4K
KyAgICAvLyAgICAgLSB4WzQyXSBjb3VsZCBiZWNvbWUgZWl0aGVyIGFuIGFzc2lnbm1lbnQgb3Ig
YSB2YXJpYWJsZSBkZWNsYXJhdGlvbi4KKyAgICAvLyAgICAgLSB4PHk+IGNvdWxkIGJlY29tZSBl
aXRoZXIgYW4gYXNzaWdubWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vCisg
ICAgLy8gV2Ugc29sdmUgdGhlIGZpcnN0IHByb2JsZW0gYnkgZm9yYmlkZGluZyBleHByZXNzaW9u
cyBhcyBzdGF0ZW1lbnRzLiBUaGUgbGFjayBvZiBmdW5jdGlvbgorICAgIC8vIHBvaW50ZXJzIG1l
YW5zIHRoYXQgd2UgY2FuIHN0aWxsIGFsbG93IGZ1bmN0aW9uIGNhbGwgc3RhdGVtZW50cyAtIHVu
bGlrZSBpbiBDLCB0aG9zZSBjYW5ub3QKKyAgICAvLyBoYXZlIGFyYml0cmFyeSBleHByZXNzaW9u
cyBhcyB0aGUgY2FsbGVlLiBUaGUgcmVtYWluaW5nIHR3byBwcm9ibGVtcyBhcmUgc29sdmVkIGJ5
CisgICAgLy8gYmFja3RyYWNraW5nLiBJbiBhbGwgb3RoZXIgcmVzcGVjdHMsIHRoaXMgaXMgYSBz
aW1wbGUgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyLgorICAgIAorICAgIGZ1bmN0aW9uIGdlbmVy
aWNDb25zdW1lKGNhbGxiYWNrLCBleHBsYW5hdGlvbikKKyAgICB7CisgICAgICAgIGxldCB0b2tl
biA9IGxleGVyLm5leHQoKTsKKyAgICAgICAgaWYgKCF0b2tlbikKKyAgICAgICAgICAgIGxleGVy
LmZhaWwoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsKKyAgICAgICAgaWYgKCFjYWxsYmFjayh0
b2tlbikpCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4cGVjdGVkIHRva2VuOiAiICsgdG9r
ZW4udGV4dCArICI7IGV4cGVjdGVkOiAiICsgZXhwbGFuYXRpb24pOworICAgICAgICByZXR1cm4g
dG9rZW47CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGNvbnN1bWUoLi4udGV4dHMpCisgICAg
eworICAgICAgICByZXR1cm4gZ2VuZXJpY0NvbnN1bWUodG9rZW4gPT4gdGV4dHMuaW5jbHVkZXMo
dG9rZW4udGV4dCksIHRleHRzKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gY29uc3VtZUtp
bmQoa2luZCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljQ29uc3VtZSh0b2tlbiA9PiB0
b2tlbi5raW5kID09IGtpbmQsIGtpbmQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBhc3Nl
cnROZXh0KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgbGV4ZXIucHVzaChjb25zdW1lKC4uLnRl
eHRzKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGdlbmVyaWNUZXN0KGNhbGxiYWNrKQor
ICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIucGVlaygpOworICAgICAgICBpZiAodG9r
ZW4gJiYgY2FsbGJhY2sodG9rZW4pKQorICAgICAgICAgICAgcmV0dXJuIHRva2VuOworICAgICAg
ICByZXR1cm4gbnVsbDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdGVzdCguLi50ZXh0cykK
KyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljVGVzdCh0b2tlbiA9PiB0ZXh0cy5pbmNsdWRl
cyh0b2tlbi50ZXh0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHRlc3RLaW5kKGtpbmQp
CisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1Rlc3QodG9rZW4gPT4gdG9rZW4ua2luZCA9
PSBraW5kKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5Q29uc3VtZSguLi50ZXh0cykK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0KC4uLnRleHRzKTsKKyAgICAgICAgaWYg
KHJlc3VsdCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3Vs
dDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gdHJ5Q29uc3VtZUtpbmQoa2luZCkKKyAgICB7
CisgICAgICAgIGxldCByZXN1bHQgPSB0ZXN0S2luZChraW5kKTsKKyAgICAgICAgaWYgKHJlc3Vs
dCkKKyAgICAgICAgICAgIGxleGVyLm5leHQoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQcm90b2NvbFJlZigpCisgICAgeworICAgICAg
ICBsZXQgcHJvdG9jb2xUb2tlbiA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAg
IHJldHVybiBuZXcgUHJvdG9jb2xSZWYocHJvdG9jb2xUb2tlbi5vcmlnaW4sIHByb3RvY29sVG9r
ZW4udGV4dCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGNvbnN1bWVFbmRPZlR5cGVBcmdz
KCkKKyAgICB7CisgICAgICAgIGxldCByaWdodFNoaWZ0ID0gdHJ5Q29uc3VtZSgiPj4iKTsKKyAg
ICAgICAgaWYgKHJpZ2h0U2hpZnQpCisgICAgICAgICAgICBsZXhlci5wdXNoKG5ldyBMZXhlclRv
a2VuKGxleGVyLCByaWdodFNoaWZ0Lm9yaWdpbiwgcmlnaHRTaGlmdC5pbmRleCwgcmlnaHRTaGlm
dC5raW5kLCAiPiIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgY29uc3VtZSgiPiIpOwor
ICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVQYXJhbWV0ZXJzKCkKKyAgICB7Cisg
ICAgICAgIGlmICghdGVzdCgiPCIpKQorICAgICAgICAgICAgcmV0dXJuIFtdOworICAgICAgICAK
KyAgICAgICAgbGV0IHJlc3VsdCA9IFtdOworICAgICAgICBjb25zdW1lKCI8Iik7CisgICAgICAg
IHdoaWxlICghdGVzdCgiPiIpKSB7CisgICAgICAgICAgICBsZXQgY29uc3RleHByID0gbGV4ZXIu
YmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcGFy
c2VUeXBlKCk7CisgICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRp
ZmllciIpOworICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAg
ICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uc3RleHByVHlwZVBhcmFtZXRlcih0eXBlLm9yaWdp
biwgbmFtZSwgdHlwZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmIChjb25zdGV4
cHIpCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goY29uc3RleHByKTsKKyAgICAgICAgICAg
IGVsc2UgeworICAgICAgICAgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZp
ZXIiKTsKKyAgICAgICAgICAgICAgICBsZXQgcHJvdG9jb2wgPSB0cnlDb25zdW1lKCI6IikgPyBw
YXJzZVByb3RvY29sUmVmKCkgOiBudWxsOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5l
dyBUeXBlVmFyaWFibGUobmFtZS5vcmlnaW4sIG5hbWUudGV4dCwgcHJvdG9jb2wpKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVBcmdzKCk7Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVGVy
bSgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNv
bnN1bWUoIm51bGwiKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgTnVsbCh0b2tlbi5vcmlnaW4p
OworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lS2luZCgiaWRlbnRpZmllciIpKQorICAg
ICAgICAgICAgcmV0dXJuIG5ldyBWYXJpYWJsZVJlZih0b2tlbi5vcmlnaW4sIHRva2VuLnRleHQp
OworICAgICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lS2luZCgiaW50TGl0ZXJhbCIpKSB7Cisg
ICAgICAgICAgICBsZXQgaW50VmVyc2lvbiA9IHRva2VuLnRleHQgfCAwOworICAgICAgICAgICAg
aWYgKGludFZlcnNpb24gIT0gdG9rZW4udGV4dCkKKyAgICAgICAgICAgICAgICBsZXhlci5mYWls
KCJJbnRlZ2VyIGxpdGVyYWwgaXMgbm90IDMyLWJpdCBpbnRlZ2VyIik7CisgICAgICAgICAgICBy
ZXR1cm4gbmV3IEludExpdGVyYWwodG9rZW4ub3JpZ2luLCBpbnRWZXJzaW9uKTsKKyAgICAgICAg
fQorICAgICAgICAvLyBGSVhNRTogTmVlZCBzdXBwb3J0IGZvciBmbG9hdCBsaXRlcmFscyBhbmQg
cHJvYmFibHkgb3RoZXIgbGl0ZXJhbHMgdG9vLgorICAgICAgICB0b2tlbiA9IGNvbnN1bWVLaW5k
KCJkb3VibGVMaXRlcmFsIik7CisgICAgICAgIHJldHVybiBuZXcgRG91YmxlTGl0ZXJhbCh0b2tl
bi5vcmlnaW4sICt0b2tlbi50ZXh0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VD
b25zdGV4cHIoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlVGVybSgpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVBcmd1bWVudHMoKQorICAgIHsKKyAgICAgICAgaWYg
KCF0ZXN0KCI8IikpCisgICAgICAgICAgICByZXR1cm4gW107CisgICAgICAgIAorICAgICAgICBs
ZXQgcmVzdWx0ID0gW107CisgICAgICAgIGNvbnN1bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0
ZXN0KCI+IikpIHsKKyAgICAgICAgICAgIC8vIEl0J3MgcG9zc2libGUgZm9yIGEgY29uc3RleHBy
IG9yIHR5cGUgY2FuIHN5bnRhY3RpY2FsbHkgb3ZlcmxhcCBpbiB0aGUgc2luZ2xlCisgICAgICAg
ICAgICAvLyBpZGVudGlmaWVyIGNhc2UuIExldCdzIGNvbnNpZGVyIHRoZSBwb3NzaWJpbGl0aWVz
OgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vICAgICBUICAgICAgICAgIGNvdWxkIGJl
IHR5cGUgb3IgY29uc3RleHByCisgICAgICAgICAgICAvLyAgICAgVFtdICAgICAgICBvbmx5IHR5
cGUKKyAgICAgICAgICAgIC8vICAgICBUWzQyXSAgICAgIG9ubHkgdHlwZSAoY29uc3RleHByIGNh
bm5vdCBkbyBpbmRleGluZykKKyAgICAgICAgICAgIC8vICAgICA0MiAgICAgICAgIG9ubHkgY29u
c3RleHByCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSB3ZSds
bCBhbGxvdyBjb25zdGV4cHJzIHRvIGRvIG1vcmUgdGhpbmdzLCBhbmQgdGhlbiB3ZSdsbCBzdGls
bCBoYXZlCisgICAgICAgICAgICAvLyB0aGUgcHJvYmxlbSB0aGF0IHNvbWV0aGluZyBvZiB0aGUg
Zm9ybSBUWzFdWzJdWzNdLi4uIGNhbiBlaXRoZXIgYmUgYSB0eXBlIG9yIGEKKyAgICAgICAgICAg
IC8vIGNvbnN0ZXhwciwgYW5kIHdlIGNhbiBmaWd1cmUgb3V0IGluIHRoZSBjaGVja2VyIHdoaWNo
IGl0IGlzLgorICAgICAgICAgICAgbGV0IHR5cGVPclZhcmlhYmxlUmVmID0gbGV4ZXIuYmFja3Ry
YWNraW5nU2NvcGUoKCkgPT4geworICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBjb25zdW1l
S2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgICAgIGFzc2VydE5leHQoIiwiLCAiPiIs
ICI+PiIpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZU9yVmFyaWFibGVSZWYocmVz
dWx0Lm9yaWdpbiwgcmVzdWx0LnRleHQpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBp
ZiAodHlwZU9yVmFyaWFibGVSZWYpCisgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godHlwZU9y
VmFyaWFibGVSZWYpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IGNv
bnN0ZXhwciA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKCgpID0+IHsKKyAgICAgICAgICAgICAg
ICAgICAgbGV0IHJlc3VsdCA9IHBhcnNlQ29uc3RleHByKCk7CisgICAgICAgICAgICAgICAgICAg
IGFzc2VydE5leHQoIiwiLCAiPiIsICI+PiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGlmIChjb25zdGV4
cHIpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNvbnN0ZXhwcikKKyAgICAgICAg
ICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlVHlwZSgp
KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWVFbmRPZlR5cGVB
cmdzKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IHBhcnNlVHlwZSgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47CisgICAgICAgIGxldCBhZGRy
ZXNzU3BhY2U7CisgICAgICAgIGxldCBhZGRyZXNzU3BhY2VDb25zdW1lZCA9IGZhbHNlOworICAg
ICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKC4uLmFkZHJlc3NTcGFjZXMpKQorICAgICAgICAg
ICAgYWRkcmVzc1NwYWNlID0gdG9rZW4udGV4dDsKKyAgICAgICAgCisgICAgICAgIGxldCBuYW1l
ID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAgICAgICAgbGV0IHR5cGVBcmd1bWVudHMg
PSBwYXJzZVR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgbGV0IHR5cGUgPSBuZXcgVHlwZVJlZihu
YW1lLm9yaWdpbiwgbmFtZS50ZXh0LCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAg
IGZ1bmN0aW9uIGdldEFkZHJlc3NTcGFjZSgpCisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZHJl
c3NTcGFjZUNvbnN1bWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzU3BhY2UpCisg
ICAgICAgICAgICAgICAgcmV0dXJuIGFkZHJlc3NTcGFjZTsKKyAgICAgICAgICAgIHJldHVybiB0
cnlDb25zdW1lKC4uLmFkZHJlc3NTcGFjZXMpOworICAgICAgICB9CisgICAgICAgIAorICAgICAg
ICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1lKCJeIiwgIlsiKSkgeworICAgICAgICAgICAgaWYg
KHRva2VuLnRleHQgPT0gIl4iKSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IG5ldyBQdHJUeXBl
KHRva2VuLm9yaWdpbiwgZ2V0QWRkcmVzc1NwYWNlKCksIHR5cGUpOworICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAo
dHJ5Q29uc3VtZSgiXSIpKSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVJlZlR5
cGUodG9rZW4ub3JpZ2luLCBnZXRBZGRyZXNzU3BhY2UoKSwgdHlwZSk7CisgICAgICAgICAgICAg
ICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIHR5
cGUgPSBuZXcgQXJyYXlUeXBlKHRva2VuLm9yaWdpbiwgdHlwZSwgcGFyc2VDb25zdGV4cHIoKSk7
CisgICAgICAgICAgICBjb25zdW1lKCJdIik7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAg
IGlmIChhZGRyZXNzU3BhY2UgJiYgIWFkZHJlc3NTcGFjZUNvbnN1bWVkKQorICAgICAgICAgICAg
bGV4ZXIuZmFpbCgiQWRkcmVzcyBzcGFjZSBzcGVjaWZpZWQgZm9yIHR5cGUgdGhhdCBkb2VzIG5v
dCBuZWVkIGFkZHJlc3Mgc3BhY2UiKTsKKyAgICAgICAgCisgICAgICAgIHJldHVybiB0eXBlOwor
ICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVR5cGVEZWYoKQorICAgIHsKKyAgICAgICAg
bGV0IG9yaWdpbiA9IGNvbnN1bWUoInR5cGUiKS5vcmlnaW47CisgICAgICAgIGxldCBuYW1lID0g
Y29uc3VtZUtpbmQoImlkZW50aWZpZXIiKS50ZXh0OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRl
cnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7CisgICAgICAgIGNvbnN1bWUoIj0iKTsKKyAgICAg
ICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgY29uc3VtZSgiOyIpOworICAgICAg
ICByZXR1cm4gbmV3IFR5cGVEZWYob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVycywgdHlwZSk7
CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTmF0aXZlKCkKKyAgICB7CisgICAgICAg
IGxldCBvcmlnaW4gPSBjb25zdW1lKCJuYXRpdmUiKS5vcmlnaW47CisgICAgICAgIGxldCBpc1R5
cGUgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICBpZiAodHJ5
Q29uc3VtZSgidHlwZSIpKQorICAgICAgICAgICAgICAgIHJldHVybiAibm9ybWFsIjsKKyAgICAg
ICAgICAgIGNvbnN1bWUoInByaW1pdGl2ZSIpOworICAgICAgICAgICAgY29uc3VtZSgidHlwZSIp
OworICAgICAgICAgICAgcmV0dXJuICJwcmltaXRpdmUiOworICAgICAgICB9KTsKKyAgICAgICAg
aWYgKGlzVHlwZSkgeworICAgICAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRp
ZmllciIpOworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJz
KCk7CisgICAgICAgICAgICBjb25zdW1lKCI7Iik7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5h
dGl2ZVR5cGUob3JpZ2luLCBuYW1lLnRleHQsIGlzVHlwZSA9PSAicHJpbWl0aXZlIiwgcGFyYW1l
dGVycyk7CisgICAgICAgIH0KKyAgICAgICAgbGV0IHJldHVyblR5cGUgPSBwYXJzZVR5cGUoKTsK
KyAgICAgICAgbGV0IG5hbWUgPSBwYXJzZUZ1bmNOYW1lKCk7CisgICAgICAgIGxldCB0eXBlUGFy
YW1ldGVycyA9IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgbGV0IHBhcmFtZXRlcnMg
PSBwYXJzZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgY29uc3VtZSgiOyIpOworICAgICAgICByZXR1
cm4gbmV3IE5hdGl2ZUZ1bmMob3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVy
cywgcGFyYW1ldGVycyk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIGdlbmVyaWNQYXJzZUxl
ZnQodGV4dHMsIG5leHRQYXJzZXIsIGNvbnN0cnVjdG9yKQorICAgIHsKKyAgICAgICAgbGV0IGxl
ZnQgPSBuZXh0UGFyc2VyKCk7CisgICAgICAgIGxldCB0b2tlbjsKKyAgICAgICAgd2hpbGUgKHRv
a2VuID0gdHJ5Q29uc3VtZSguLi50ZXh0cykpCisgICAgICAgICAgICBsZWZ0ID0gY29uc3RydWN0
b3IodG9rZW4sIGxlZnQsIG5leHRQYXJzZXIoKSk7CisgICAgICAgIHJldHVybiBsZWZ0OworICAg
IH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUxlZnRPcGVyYXRvckNhbGwodGV4dHMsIG5leHRQ
YXJzZXIpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAg
ICAgIHRleHRzLCBuZXh0UGFyc2VyLAorICAgICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkg
PT4KKyAgICAgICAgICAgICAgICBuZXcgQ2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3Bl
cmF0b3IiICsgdG9rZW4udGV4dCwgW10sIFtsZWZ0LCByaWdodF0pKTsKKyAgICB9CisgICAgCisg
ICAgZnVuY3Rpb24gcGFyc2VDYWxsRXhwcmVzc2lvbigpCisgICAgeworICAgICAgICBsZXQgbmFt
ZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgIGxldCB0eXBlQXJndW1lbnRz
ID0gcGFyc2VUeXBlQXJndW1lbnRzKCk7CisgICAgICAgIGNvbnN1bWUoIigiKTsKKyAgICAgICAg
bGV0IGFyZ3VtZW50TGlzdCA9IFtdOworICAgICAgICB3aGlsZSAoIXRlc3QoIikiKSkgeworICAg
ICAgICAgICAgYXJndW1lbnRMaXN0LnB1c2gocGFyc2VFeHByZXNzaW9uKCkpOworICAgICAgICAg
ICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAg
IH0KKyAgICAgICAgY29uc3VtZSgiKSIpOworICAgICAgICByZXR1cm4gbmV3IENhbGxFeHByZXNz
aW9uKG5hbWUub3JpZ2luLCBuYW1lLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudExpc3QpOworICAg
IH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlU3VmZml4KCkKKyAgICB7CisgICAg
ICAgIGxldCBzaW1wbGVDYXNlID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUoKCkgPT4geworICAg
ICAgICAgICAgbGV0IGxlZnQgPSBwYXJzZVRlcm0oKTsKKyAgICAgICAgICAgIGxldCB0b2tlbjsK
KyAgICAgICAgICAgIHdoaWxlICh0b2tlbiA9IHRyeUNvbnN1bWUoIisrIiwgIi0tIiwgIi4iLCAi
LT4iLCAiWyIpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh0b2tlbi50ZXh0KSB7CisgICAg
ICAgICAgICAgICAgY2FzZSAiKysiOgorICAgICAgICAgICAgICAgIGNhc2UgIi0tIjoKKyAgICAg
ICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBTdWZmaXhDYWxsQXNzaWdubWVudCh0b2tlbi5vcmln
aW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAg
YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAiLiI6CisgICAgICAgICAgICAgICAgY2FzZSAi
LT4iOgorICAgICAgICAgICAgICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiLT4iKQorICAgICAg
ICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBEZXJlZmVyZW5jZUV4cHJlc3Npb24odG9rZW4u
b3JpZ2luLCBsZWZ0KTsKKyAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG5ldyBEb3RFeHByZXNz
aW9uKHRva2VuLm9yaWdpbiwgbGVmdCwgY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKSk7CisgICAg
ICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgIlsiOiB7CisgICAg
ICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHBhcnNlRXhwcmVzc2lvbigpOworICAgICAgICAg
ICAgICAgICAgICBjb25zdW1lKCJdIik7CisgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBuZXcg
SW5kZXhFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgbGVmdCwgaW5kZXgpOworICAgICAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGVmYXVs
dDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJCYWQgdG9rZW46ICIgKyB0
b2tlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0
dXJuIGxlZnQ7CisgICAgICAgIH0pOworICAgICAgICBpZiAoc2ltcGxlQ2FzZSkKKyAgICAgICAg
ICAgIHJldHVybiBzaW1wbGVDYXNlOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2Fs
bEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVBy
ZWZpeCgpCisgICAgeworICAgICAgICBsZXQgdG9rZW47CisgICAgICAgIGlmICh0b2tlbiA9IHRy
eUNvbnN1bWUoIisrIiwgIi0tIiwgIisiLCAiLSIsICIhIiwgIn4iKSkKKyAgICAgICAgICAgIHJl
dHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQodG9rZW4ub3JpZ2luLCAib3BlcmF0b3IiICsgdG9rZW4u
dGV4dCwgcGFyc2VQb3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29u
c3VtZSgiXiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXJlZmVyZW5jZUV4cHJlc3Npb24o
dG9rZW4ub3JpZ2luLCBwYXJzZVBvc3NpYmxlUHJlZml4KCkpOworICAgICAgICBpZiAodG9rZW4g
PSB0cnlDb25zdW1lKCJcXCIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNYWtlUHRyRXhwcmVz
c2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2libGVQcmVmaXgoKSk7CisgICAgICAgIGlmICh0
b2tlbiA9IHRyeUNvbnN1bWUoIiYiKSkKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFrZUFycmF5
UmVmRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2libGVQcmVmaXgoKSk7CisgICAg
ICAgIHJldHVybiBwYXJzZVBvc3NpYmxlU3VmZml4KCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlUG9zc2libGVQcm9kdWN0KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxl
ZnRPcGVyYXRvckNhbGwoWyIqIiwgIi8iLCAiJSJdLCBwYXJzZVBvc3NpYmxlUHJlZml4KTsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVN1bSgpCisgICAgeworICAgICAg
ICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiKyIsICItIl0sIHBhcnNlUG9zc2libGVQ
cm9kdWN0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVNoaWZ0KCkK
KyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyI8PCIsICI+PiJd
LCBwYXJzZVBvc3NpYmxlU3VtKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3Nz
aWJsZVJlbGF0aW9uYWxJbmVxdWFsaXR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxl
ZnRPcGVyYXRvckNhbGwoWyI8IiwgIj4iLCAiPD0iLCAiPT4iXSwgcGFyc2VQb3NzaWJsZVNoaWZ0
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxFcXVh
bGl0eSgpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1BhcnNlTGVmdCgKKyAgICAgICAg
ICAgIFsiPT0iLCAiIT0iXSwgcGFyc2VQb3NzaWJsZVJlbGF0aW9uYWxJbmVxdWFsaXR5LAorICAg
ICAgICAgICAgKHRva2VuLCBsZWZ0LCByaWdodCkgPT4geworICAgICAgICAgICAgICAgIGxldCBy
ZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCAib3BlcmF0b3I9PSIsIFtd
LCBbbGVmdCwgcmlnaHRdKTsKKyAgICAgICAgICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiIT0i
KQorICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Npb24odG9rZW4u
b3JpZ2luLCAib3BlcmF0b3IhIiwgW10sIFtyZXN1bHRdKTsKKyAgICAgICAgICAgICAgICByZXR1
cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlUG9zc2libGVCaXR3aXNlQW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRP
cGVyYXRvckNhbGwoWyImIl0sIHBhcnNlUG9zc2libGVSZWxhdGlvbmFsRXF1YWxpdHkpOworICAg
IH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlQml0d2lzZVhvcigpCisgICAgewor
ICAgICAgICByZXR1cm4gcGFyc2VMZWZ0T3BlcmF0b3JDYWxsKFsiXiJdLCBwYXJzZVBvc3NpYmxl
Qml0d2lzZUFuZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVCaXR3
aXNlT3IoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbInwi
XSwgcGFyc2VQb3NzaWJsZUJpdHdpc2VYb3IpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBw
YXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lvbih0ZXh0cywgbmV4dFBhcnNlcikKKyAgICB7CisgICAg
ICAgIHJldHVybiBnZW5lcmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgdGV4dHMsIG5leHRQYXJz
ZXIsCisgICAgICAgICAgICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9PiBuZXcgTG9naWNhbEV4cHJl
c3Npb24odG9rZW4ub3JpZ2luLCB0b2tlbi50ZXh0LCBsZWZ0LCByaWdodCkpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlTG9naWNhbEFuZCgpCisgICAgeworICAgICAg
ICByZXR1cm4gcGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24oWyImJiJdLCBwYXJzZVBvc3NpYmxl
Qml0d2lzZU9yKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUxvZ2lj
YWxPcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24o
WyJ8fCJdLCBwYXJzZVBvc3NpYmxlTG9naWNhbEFuZCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlUG9zc2libGVUZXJuYXJ5Q29uZGl0aW9uYWwoKQorICAgIHsKKyAgICAgICAgbGV0
IHByZWRpY2F0ZSA9IHBhcnNlUG9zc2libGVMb2dpY2FsT3IoKTsKKyAgICAgICAgbGV0IG9wZXJh
dG9yID0gdHJ5Q29uc3VtZSgiPyIpOworICAgICAgICBpZiAoIW9wZXJhdG9yKQorICAgICAgICAg
ICAgcmV0dXJuIHByZWRpY2F0ZTsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXJuYXJ5RXhwcmVzc2lv
bihvcGVyYXRvci5vcmlnaW4sIHByZWRpY2F0ZSwgcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSwg
cGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQoKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBh
cnNlUG9zc2libGVBc3NpZ25tZW50KG1vZGUpCisgICAgeworICAgICAgICBsZXQgbGhzID0gcGFy
c2VQb3NzaWJsZVRlcm5hcnlDb25kaXRpb25hbCgpOworICAgICAgICBsZXQgb3BlcmF0b3IgPSB0
cnlDb25zdW1lKCI9IiwgIis9IiwgIi09IiwgIio9IiwgIi89IiwgIiU9IiwgIl49IiwgInw9Iiwg
IiY9Iik7CisgICAgICAgIGlmICghb3BlcmF0b3IpIHsKKyAgICAgICAgICAgIGlmIChtb2RlID09
ICJyZXF1aXJlZCIpCisgICAgICAgICAgICAgICAgbGV4ZXIuZmFpbCgiRXhwZWN0ZWQgYXNzaWdu
bWVudCIpOworICAgICAgICAgICAgcmV0dXJuIGxoczsKKyAgICAgICAgfQorICAgICAgICBpZiAo
b3BlcmF0b3IudGV4dCA9PSAiPSIpCisgICAgICAgICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQo
b3BlcmF0b3Iub3JpZ2luLCBsaHMsIHBhcnNlUG9zc2libGVBc3NpZ25tZW50KCkpOworICAgICAg
ICBsZXQgbmFtZSA9ICJvcGVyYXRvciIgKyBvcGVyYXRvci50ZXh0LnN1YnN0cmluZygwLCB0ZXJt
Lm9wZXJhdG9yLmxlbmd0aCAtIDEpOworICAgICAgICByZXR1cm4gbmV3IENhbGxBc3NpZ25tZW50
KG9wZXJhdG9yLm9yaWdpbiwgbmFtZSwgbGhzLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VBc3NpZ25tZW50KCkKKyAgICB7CisgICAg
ICAgIHJldHVybiBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgicmVxdWlyZWQiKTsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKCkKKyAgICB7CisgICAg
ICAgIGxldCBhc3NpZ25tZW50ID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUocGFyc2VBc3NpZ25t
ZW50KTsKKyAgICAgICAgaWYgKGFzc2lnbm1lbnQpCisgICAgICAgICAgICByZXR1cm4gYXNzaWdu
bWVudDsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ2FsbEV4cHJlc3Npb24oKTsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gZ2VuZXJpY1BhcnNlQ29tbWFFeHByZXNzaW9uKGZpbmFsRXhwcmVzc2lv
blBhcnNlcikKKyAgICB7CisgICAgICAgIGxldCBsaXN0ID0gW107CisgICAgICAgIGxldCBvcmln
aW4gPSBsZXhlci5wZWVrKCk7CisgICAgICAgIGlmICghb3JpZ2luKQorICAgICAgICAgICAgbGV4
ZXIuZmFpbCgiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworICAgICAgICBvcmlnaW4gPSBvcmln
aW4ub3JpZ2luOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBsZXQgZWZmZWN0ZnVs
RXhwcmVzc2lvbiA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKHBhcnNlRWZmZWN0ZnVsRXhwcmVz
c2lvbik7CisgICAgICAgICAgICBpZiAoIWVmZmVjdGZ1bEV4cHJlc3Npb24pIHsKKyAgICAgICAg
ICAgICAgICBsaXN0LnB1c2goZmluYWxFeHByZXNzaW9uUGFyc2VyKCkpOworICAgICAgICAgICAg
ICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGlzdC5wdXNoKGVmZmVjdGZ1
bEV4cHJlc3Npb24pOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBDb21tYUV4cHJl
c3Npb24ob3JpZ2luLCBsaXN0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VDb21t
YUV4cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNQYXJzZUNvbW1hRXhw
cmVzc2lvbihwYXJzZVBvc3NpYmxlQXNzaWdubWVudCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0
aW9uIHBhcnNlRXhwcmVzc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gcGFyc2VDb21tYUV4
cHJlc3Npb24oKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VFZmZlY3RmdWxTdGF0
ZW1lbnQoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IGdlbmVyaWNQYXJzZUNvbW1hRXhw
cmVzc2lvbihwYXJzZUVmZmVjdGZ1bEV4cHJlc3Npb24pOworICAgICAgICBjb25zdW1lKCI7Iik7
CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNl
UmV0dXJuKCkKKyAgICB7CisgICAgICAgIGxldCBvcmlnaW4gPSBjb25zdW1lKCJyZXR1cm4iKS5v
cmlnaW47CisgICAgICAgIHJldHVybiBuZXcgUmV0dXJuKG9yaWdpbiwgcGFyc2VFeHByZXNzaW9u
KCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVZhcmlhYmxlRGVjbHMoKQorICAg
IHsKKyAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgbGV0IGxpc3QgPSBb
XTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRl
bnRpZmllciIpOworICAgICAgICAgICAgbGV0IGluaXRpYWxpemVyID0gdHJ5Q29uc3VtZSgiPSIp
ID8gcGFyc2VFeHByZXNzaW9uKCkgOiBudWxsOworICAgICAgICAgICAgcHJpbnQobmFtZSk7Cisg
ICAgICAgICAgICBwcmludChuYW1lLnRleHQpOworICAgICAgICAgICAgcHJpbnQoIiIgKyB0eXBl
KTsKKyAgICAgICAgICAgIGxpc3QucHVzaChuZXcgVmFyaWFibGVEZWNsKG5hbWUub3JpZ2luLCBu
YW1lLnRleHQsIHR5cGUsIGluaXRpYWxpemVyKSk7CisgICAgICAgIH0gd2hpbGUgKGNvbnN1bWUo
IiwiLCAiOyIpLnRleHQgPT0gIiwiKQorICAgICAgICByZXR1cm4gbmV3IENvbW1hRXhwcmVzc2lv
bih0eXBlLm9yaWdpbiwgbGlzdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlU3Rh
dGVtZW50KCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAg
ICAgaWYgKHRva2VuLnRleHQgPT0gIjsiKSB7CisgICAgICAgICAgICBsZXhlci5uZXh0KCk7Cisg
ICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9rZW4udGV4
dCA9PSAicmV0dXJuIikKKyAgICAgICAgICAgIHJldHVybiBwYXJzZVJldHVybigpOworICAgICAg
ICBpZiAodG9rZW4udGV4dCA9PSAiYnJlYWsiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQnJl
YWsoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImNvbnRpbnVlIikKKyAgICAgICAgICAg
IHJldHVybiBwYXJzZUNvbnRpbnVlKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJ3aGls
ZSIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VXaGlsZSgpOworICAgICAgICBpZiAodG9rZW4u
dGV4dCA9PSAiZG8iKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlRG8oKTsKKyAgICAgICAgaWYg
KHRva2VuLnRleHQgPT0gImZvciIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VGb3IoKTsKKyAg
ICAgICAgbGV0IHZhcmlhYmxlRGVjbCA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKHBhcnNlVmFy
aWFibGVEZWNscyk7CisgICAgICAgIGlmICh2YXJpYWJsZURlY2wpCisgICAgICAgICAgICByZXR1
cm4gdmFyaWFibGVEZWNsOworICAgICAgICByZXR1cm4gcGFyc2VFZmZlY3RmdWxTdGF0ZW1lbnQo
KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VCbG9jaygpCisgICAgeworICAgICAg
ICBsZXQgb3JpZ2luID0gY29uc3VtZSgieyIpLm9yaWdpbjsKKyAgICAgICAgbGV0IGJsb2NrID0g
bmV3IEJsb2NrKG9yaWdpbik7CisgICAgICAgIHdoaWxlICghdGVzdCgifSIpKSB7CisgICAgICAg
ICAgICBsZXQgc3RhdGVtZW50ID0gcGFyc2VTdGF0ZW1lbnQoKTsKKyAgICAgICAgICAgIGlmIChz
dGF0ZW1lbnQpIHsKKyAgICAgICAgICAgICAgICBwcmludCgiQWRkZWQgc3RhdGVtZW50OiAiICsg
c3RhdGVtZW50ICsgIiAoIiArIHN0YXRlbWVudC5jb25zdHJ1Y3Rvci5uYW1lICsgIikiKTsKKyAg
ICAgICAgICAgICAgICBibG9jay5hZGQoc3RhdGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgfQorICAgICAgICBjb25zdW1lKCJ9Iik7CisgICAgICAgIHJldHVybiBibG9jazsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQYXJhbWV0ZXIoKQorICAgIHsKKyAgICAgICAgbGV0
IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgbGV0IG5hbWUgPSB0cnlDb25zdW1lS2luZCgi
aWRlbnRpZmllciIpOworICAgICAgICByZXR1cm4gbmV3IEZ1bmNQYXJhbWV0ZXIodHlwZS5vcmln
aW4sIG5hbWUgPyBuYW1lLnRleHQgOiBudWxsLCB0eXBlKTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gcGFyc2VQYXJhbWV0ZXJzKCkKKyAgICB7CisgICAgICAgIGNvbnN1bWUoIigiKTsKKyAg
ICAgICAgbGV0IHBhcmFtZXRlcnMgPSBbXTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCIpIikpIHsK
KyAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChwYXJzZVBhcmFtZXRlcigpKTsKKyAgICAgICAg
ICAgIGlmICghdHJ5Q29uc3VtZSgiLCIpKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAg
ICB9CisgICAgICAgIGNvbnN1bWUoIikiKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7Cisg
ICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlRnVuY05hbWUoKQorICAgIHsKKyAgICAgICAg
aWYgKHRyeUNvbnN1bWUoIm9wZXJhdG9yIikpIHsKKyAgICAgICAgICAgIGxldCB0b2tlbiA9IGNv
bnN1bWUoIisiLCAiLSIsICIqIiwgIi8iLCAiJSIsICJeIiwgIiYiLCAifCIsICI8IiwgIj4iLCAi
PD0iLCAiPj0iLCAiISIsICI9PSIsICIrKyIsICItLSIsICJcXCIpOworICAgICAgICAgICAgaWYg
KHRva2VuLnRleHQgIT0gIlxcIikKKyAgICAgICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIiAr
IHRva2VuLnRleHQ7CisgICAgICAgICAgICBjb25zdW1lKCJbIik7CisgICAgICAgICAgICBjb25z
dW1lKCJdIik7CisgICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yXFxbXSI7CisgICAgICAgIH0K
KyAgICAgICAgcmV0dXJuIGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIikudGV4dDsKKyAgICB9Cisg
ICAgCisgICAgZnVuY3Rpb24gcGFyc2VGdW5jRGVmKCkKKyAgICB7CisgICAgICAgIGxldCByZXR1
cm5UeXBlID0gcGFyc2VUeXBlKCk7CisgICAgICAgIGxldCBuYW1lID0gcGFyc2VGdW5jTmFtZSgp
OworICAgICAgICBsZXQgdHlwZVBhcmFtZXRlcnMgPSBwYXJzZVR5cGVQYXJhbWV0ZXJzKCk7Cisg
ICAgICAgIGxldCBwYXJhbWV0ZXJzID0gcGFyc2VQYXJhbWV0ZXJzKCk7CisgICAgICAgIGxldCBi
bG9jayA9IHBhcnNlQmxvY2soKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGdW5jRGVmKHJldHVyblR5
cGUub3JpZ2luLCBuYW1lLCByZXR1cm5UeXBlLCB0eXBlUGFyYW1ldGVycywgcGFyYW1ldGVycywg
Ym9keSk7CisgICAgfQorICAgIAorICAgIGZvciAoOzspIHsKKyAgICAgICAgbGV0IHRva2VuID0g
bGV4ZXIucGVlaygpOworICAgICAgICBpZiAoIXRva2VuKQorICAgICAgICAgICAgcmV0dXJuOwor
ICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiOyIpCisgICAgICAgICAgICBsZXhlci5uZXh0KCk7
CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gInR5cGUiKQorICAgICAgICAgICAgcGFy
c2VUeXBlRGVmKCk7CisgICAgICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gIm5hdGl2ZSIpCisg
ICAgICAgICAgICBwYXJzZU5hdGl2ZSgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09
ICJzdHJ1Y3QiKQorICAgICAgICAgICAgcGFyc2VTdHJ1Y3RUeXBlKCk7CisgICAgICAgIGVsc2Ug
aWYgKHRva2VuLnRleHQgPT0gImVudW0iKQorICAgICAgICAgICAgcGFyc2VFbnVtKCk7CisgICAg
ICAgIGVsc2UgaWYgKHRva2VuLnRleHQgPT0gInByb3RvY29sIikKKyAgICAgICAgICAgIHBhcnNl
UHJvdG9jb2xEZWNsKCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBhcnNlRnVuY0RlZigp
OworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJlcGFyZS5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QcmVwYXJlLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL1ByZXBhcmUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwzOCBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitmdW5jdGlvbiBwcmVwYXJlKG9yaWdpbiwgbGluZU51bWJlck9mZnNldCwgdGV4dCkK
K3sKKyAgICBsZXQgcHJvZ3JhbSA9IG5ldyBQcm9ncmFtKCk7CisgICAgcGFyc2UocHJvZ3JhbSwg
IjxzdGRsaWI+IiwgMjgsIHN0YW5kYXJkTGlicmFyeSk7CisgICAgcGFyc2UocHJvZ3JhbSwgb3Jp
Z2luLCBsaW5lTnVtYmVyT2Zmc2V0LCB0ZXh0KTsKKyAgICByZXNvbHZlTmFtZXMocHJvZ3JhbSk7
CisgICAgcmVzb2x2ZVR5cGVEZWZzKHByb2dyYW0pOworICAgIGNoZWNrKHByb2dyYW0pOworICAg
IGlubGluZShwcm9ncmFtKTsKKyAgICByZXR1cm4gcHJvZ3JhbTsKK30KKwpJbmRleDogVG9vbHMv
QXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Q
cm9ncmFtLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Byb2dyYW0uanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm9ncmFtIGV4dGVu
ZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAg
ICAgICAgdGhpcy5fdG9wTGV2ZWxTdGF0ZW1lbnRzID0gW107CisgICAgICAgIHRoaXMuX2Z1bmN0
aW9ucyA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fdHlwZXMgPSBuZXcgTWFwKCk7CisgICAg
ICAgIHRoaXMuX2Z1bmNJbnN0YW50aWF0b3IgPSBuZXcgRnVuY0luc3RhbnRpYXRvcigpOworICAg
IH0KKyAgICAKKyAgICBnZXQgdG9wTGV2ZWxTdGF0ZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdG9w
TGV2ZWxTdGF0ZW1lbnRzOyB9CisgICAgZ2V0IGZ1bmN0aW9ucygpIHsgcmV0dXJuIHRoaXMuX2Z1
bmN0aW9uczsgfQorICAgIGdldCB0eXBlcygpIHsgcmV0dXJuIHRoaXMuX3R5cGVzOyB9CisgICAg
Z2V0IGZ1bmNJbnN0YW50aWF0b3IoKSB7IHJldHVybiB0aGlzLl9mdW5jSW5zdGFudGlhdG9yOyB9
CisgICAgCisgICAgYWRkVG9wTGV2ZWxTdGF0ZW1lbnQoc3RhdGVtZW50KQorICAgIHsKKyAgICAg
ICAgc3RhdGVtZW50LnByb2dyYW0gPSB0aGlzOworICAgICAgICBpZiAoc3RhdGVtZW50IGluc3Rh
bmNlb2YgRnVuYykgeworICAgICAgICAgICAgbGV0IGFycmF5ID0gdGhpcy5fZnVuY3Rpb25zLmdl
dChzdGF0ZW1lbnQubmFtZSk7CisgICAgICAgICAgICBpZiAoIWFycmF5KQorICAgICAgICAgICAg
ICAgIHRoaXMuX2Z1bmN0aW9ucy5zZXQoc3RhdGVtZW50Lm5hbWUsIGFycmF5ID0gW10pOworICAg
ICAgICAgICAgYXJyYXkucHVzaChzdGF0ZW1lbnQpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRl
bWVudCBpbnN0YW5jZW9mIFR5cGUpCisgICAgICAgICAgICB0aGlzLl90eXBlcy5zZXQoc3RhdGVt
ZW50Lm5hbWUsIHN0YXRlbWVudCk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRocm93IG5l
dyBFcnJvcigiU3RhdGVtZW50IGlzIG5vdCBhIGZ1bmN0aW9uIG9yIHR5cGU6ICIgKyBzdGF0ZW1l
bnQpOworICAgICAgICB0aGlzLl90b3BMZXZlbFN0YXRlbWVudHMucHVzaChzdGF0ZW1lbnQpOwor
ICAgIH0KKyAgICAKKyAgICByZXNvbHZlRnVuY092ZXJsb2FkKG5hbWUsIHR5cGVBcmd1bWVudHMs
IGFyZ3VtZW50VHlwZXMpCisgICAgeworICAgICAgICBsZXQgZnVuY3Rpb25zID0gdGhpcy5mdW5j
dGlvbnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAoIWZ1bmN0aW9ucykKKyAgICAgICAgICAgIHJl
dHVybiBudWxsOworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHJlc29sdmVPdmVybG9hZEltcGwo
ZnVuY3Rpb25zLCB0eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IG5hbWVDb250ZXh0KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgTmFt
ZUNvbnRleHQoKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIHRoaXMudG9wTGV2ZWxT
dGF0ZW1lbnRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChzdGF0ZW1lbnQpOworICAgICAgICBy
ZXR1cm4gcmVzdWx0OworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9j
b2wuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2wuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2NvbCBleHRlbmRzIE5vZGUgeworICAg
IGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9
IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgfQorICAgIAorICAgIGdl
dCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0
dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIFByb3RvY29sOyB9Cisg
ICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAg
ICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1Byb3RvY29sRGVjbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6
CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFy
eSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0
aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3
aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBC
WSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FS
UkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBX
QVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
CisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
InVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2NvbERlY2wgZXh0ZW5kcyBQcm90b2NvbCB7Cisg
ICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2lu
LCBuYW1lKQorICAgICAgICB0aGlzLl9zaWduYXR1cmVzID0gW107CisgICAgICAgIHRoaXMuX3Np
Z25hdHVyZU1hcCA9IG5ldyBNYXAoKTsKKyAgICAgICAgdGhpcy5fdHlwZVZhcmlhYmxlID0gbmV3
IFR5cGVWYXJpYWJsZShvcmlnaW4sIG5hbWUsIG51bGwpOworICAgIH0KKyAgICAKKyAgICBhZGRT
aWduYXR1cmUoc2lnbmF0dXJlKQorICAgIHsKKyAgICAgICAgLy8gTk9URTogQW55IHR5cGUgcGFy
YW1ldGVycyBmb3VuZCBpbiB0aGUgc2lnbmF0dXJlIG11c3QgYmUgaW5mZXJhYmxlIGZyb20gdGhl
IHZhbHVlCisgICAgICAgIC8vIHBhcmFtZXRlcnMuCisgICAgICAgIC8vIEZJWE1FOiBDaGVjayB0
aGlzISAoT09QUyEpCisgICAgICAgIHRoaXMuX3NpZ25hdHVyZXMucHVzaChzaWduYXR1cmUpOwor
ICAgICAgICBsZXQgb3ZlcmxvYWRzID0gdGhpcy5fc2lnbmF0dXJlTWFwLmdldChzaWduYXR1cmUu
bmFtZSk7CisgICAgICAgIGlmICghb3ZlcmxvYWRzKQorICAgICAgICAgICAgdGhpcy5fc2lnbmF0
dXJlTWFwLnNldChzaWduYXR1cmUubmFtZSwgb3ZlcmxvYWRzID0gW10pOworICAgICAgICBvdmVy
bG9hZHMucHVzaChzaWduYXR1cmUpOworICAgIH0KKyAgICAKKyAgICBnZXQgc2lnbmF0dXJlcygp
IHsgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZXM7IH0KKyAgICBzaWduYXR1cmVzQnlOYW1lKG5hbWUp
IHsgcmV0dXJuIHRoaXMuX3NpZ25hdHVyZU1hcC5nZXQobmFtZSk7IH0KKyAgICBnZXQgdHlwZVZh
cmlhYmxlKCkgeyByZXR1cm4gdGhpcy5fdHlwZVZhcmlhYmxlOyB9CisgICAgCisgICAgc2lnbmF0
dXJlc0J5TmFtZVdpdGhUeXBlVmFyaWFibGUobmFtZSwgdHlwZVZhcmlhYmxlKQorICAgIHsKKyAg
ICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IG5ldyBTdWJzdGl0dXRpb24oW3RoaXMudHlwZVZhcmlh
YmxlXSwgW3R5cGVWYXJpYWJsZV0pOworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5zaWduYXR1
cmVzQnlOYW1lKG5hbWUpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHJldHVy
biBudWxsOworICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChzaWduYXR1cmUgPT4gc2lnbmF0dXJl
LnZpc2l0KHN1YnN0aXR1dGlvbikpOworICAgIH0KKyAgICAKKyAgICBpbmhlcml0cyhvdGhlclBy
b3RvY29sKQorICAgIHsKKyAgICAgICAgaWYgKCFvdGhlclByb3RvY29sKQorICAgICAgICAgICAg
cmV0dXJuIHRydWU7CisgICAgICAgIAorICAgICAgICBpZiAob3RoZXJQcm90b2NvbCBpbnN0YW5j
ZW9mIFByb3RvY29sUmVmKQorICAgICAgICAgICAgb3RoZXJQcm90b2NvbCA9IG90aGVyUHJvdG9j
b2wucHJvdG9jb2xEZWNsOworICAgICAgICAKKyAgICAgICAgZm9yIChsZXQgb3RoZXJTaWduYXR1
cmUgb2Ygb3RoZXJQcm90b2NvbC5zaWduYXR1cmVzKSB7CisgICAgICAgICAgICBsZXQgc2lnbmF0
dXJlcyA9IHRoaXMuc2lnbmF0dXJlc0J5TmFtZShvdGhlclNpZ25hdHVyZS5uYW1lKTsKKyAgICAg
ICAgICAgIGlmICghc2lnbmF0dXJlcykKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgICAgICBsZXQgb3ZlcmxvYWQgPSByZXNvbHZlT3ZlcmxvYWRJbXBsKHNpZ25hdHVyZXMs
IFtdLCBvdGhlclNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcyk7CisgICAgICAgICAgICBpZiAoIW92
ZXJsb2FkKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGxldCBz
dWJzdGl0dXRlZFJldHVyblR5cGUgPQorICAgICAgICAgICAgICAgIG92ZXJsb2FkLmZ1bmMucmV0
dXJuVHlwZS5zdWJzdGl0dXRlVG9VbmlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgc2ln
bmF0dXJlLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlvbkNvbnRleHQpOworICAg
ICAgICAgICAgaWYgKCFzdWJzdGl0dXRlZFJldHVyblR5cGUuZXF1YWxzKG90aGVyU2lnbmF0dXJl
LnJldHVyblR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQor
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgaGFzSGVpcih0eXBlKQorICAg
IHsKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IFN1YnN0aXR1dGlvbi5tYXBwaW5nKFt0aGlz
Ll90eXBlVmFyaWFibGVdLCBbdHlwZV0pOworICAgICAgICBmb3IgKGxldCBhYnN0cmFjdFNpZ25h
dHVyZSBvZiB0aGlzLl9zaWduYXR1cmVzKSB7CisgICAgICAgICAgICBsZXQgc2lnbmF0dXJlID0g
c2lnbmF0dXJlLnZpc2l0KHN1YnN0aXR1dGlvbik7CisgICAgICAgICAgICBsZXQgb3ZlcmxvYWQg
PSB0aGlzLnByb2dyYW0ucmVzb2x2ZUZ1bmNPdmVybG9hZChzaWduYXR1cmUubmFtZSwgW10sIHNp
Z25hdHVyZS5wYXJhbWV0ZXJUeXBlcyk7CisgICAgICAgICAgICBpZiAoIW92ZXJsb2FkKQorICAg
ICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgbGV0
IHN1YnN0aXR1dGVkUmV0dXJuVHlwZSA9IG92ZXJsb2FkLmZ1bmMucmV0dXJuVHlwZS5zdWJzdGl0
dXRlVG9VbmlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICBvdmVybG9hZC5mdW5jLnR5cGVQYXJh
bWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlvbkNvbnRleHQpOworICAgICAgICAgICAgaWYgKCFz
dWJzdGl0dXRlZFJldHVyblR5cGUuZXF1YWxzKHNpZ25hdHVyZS5yZXR1cm5UeXBlKSkKKyAgICAg
ICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7
CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiAicHJv
dG9jb2wgIiArIHRoaXMubmFtZSArICIgeyAiICsgdGhpcy5zaWduYXR1cmVzLmpvaW4oIjsgIikg
KyAiOyB9IjsKKyAgICB9Cit9CisKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xS
ZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xSZWYuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xSZWYuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBQcm90b2NvbFJlZiBleHRlbmRzIFBy
b3RvY29sIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICBz
dXBlcihvcmlnaW4sIG5hbWUpOworICAgICAgICB0aGlzLnByb3RvY29sRGVjbCA9IG51bGw7Cisg
ICAgfQorICAgIAorICAgIGluaGVyaXRzKG90aGVyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRo
aXMucHJvdG9jb2xEZWNsLmluaGVyaXRzKG90aGVyKTsKKyAgICB9CisgICAgCisgICAgaGFzSGVp
cih0eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvdG9jb2xEZWNsLmhhc0hlaXIo
dHlwZSk7CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwo9PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9QdHJUeXBlLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5cGUuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBQdHJUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5p
ZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIW90
aGVyIGluc3RhbmNlb2YgUHRyVHlwZSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAg
ICAgcmV0dXJuIHRoaXMuZWxlbWVudFR5cGUudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhl
ci5lbGVtZW50VHlwZSk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAg
ICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIgIiArIHRoaXMuZWxlbWVudFR5cGUgKyAi
XiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZWZlcmVuY2VUeXBlLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVmZXJlbmNlVHlwZS5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJlZmVyZW5jZVR5cGUgZXh0ZW5kcyBU
eXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFkZHJlc3NTcGFjZSwgZWxlbWVudFR5cGUp
CisgICAgeworICAgICAgICB2YWxpZGF0ZUFkZHJlc3NTcGFjZShhZGRyZXNzU3BhY2UpOworICAg
ICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2FkZHJlc3NTcGFjZSA9
IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgdGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsK
KyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQor
ICAgIGdldCBhZGRyZXNzU3BhY2UoKSB7IHJldHVybiB0aGlzLl9hZGRyZXNzU3BhY2U7IH0KKyAg
ICBnZXQgZWxlbWVudFR5cGUoKSB7IHJldHVybiB0aGlzLl9lbGVtZW50VHlwZTsgfQorICAgIGdl
dCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICBnZXQgc2l6ZSgpIHsgcmV0
dXJuIDE7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU5hbWVzLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVOYW1lcy5qcwkobm9uZXhpc3Rl
bnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlTmFtZXMuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitmdW5jdGlvbiByZXNvbHZlTmFtZXMocHJvZ3JhbSkKK3sK
KyAgICBwcm9ncmFtLnZpc2l0KG5ldyBOYW1lUmVzb2x2ZXIoKSk7Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9SZXNvbHZlT3ZlcmxvYWRJbXBsLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL1Jlc29sdmVPdmVybG9hZEltcGwuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMv
QXJyYXlMYW5nUkkvUmVzb2x2ZU92ZXJsb2FkSW1wbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHJlc29sdmVPdmVybG9hZEltcGwoZnVuY3Rpb25zLCB0
eXBlQXJndW1lbnRzLCBhcmd1bWVudFR5cGVzKQoreworICAgIGZvciAobGV0IGZ1bmMgb2YgZnVu
Y3Rpb25zKSB7CisgICAgICAgIGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAmJiB0eXBlQXJndW1l
bnRzLmxlbmd0aCAhPSBmdW5jLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICBpZiAoYXJndW1lbnRUeXBlcy5sZW5ndGggIT0gZnVuYy5wYXJhbWV0
ZXJzLmxlbmd0aCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBsZXQgdW5pZmljYXRp
b25Db250ZXh0ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dChmdW5jLnR5cGVQYXJhbWV0ZXJzKTsK
KyAgICAgICAgbGV0IG9rID0gdHJ1ZTsKKyAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBl
QXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBsZXQgYXJndW1lbnQgPSB0eXBl
QXJndW1lbnRzW2ldOworICAgICAgICAgICAgbGV0IHBhcmFtZXRlciA9IGZ1bmMudHlwZVBhcmFt
ZXRlcnNbaV07CisgICAgICAgICAgICBpZiAoIWFyZ3VtZW50LnVuaWZ5KHVuaWZpY2F0aW9uQ29u
dGV4dCwgcGFyYW1ldGVyKSkgeworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAg
ICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFv
aykKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFy
Z3VtZW50VHlwZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghYXJndW1lbnRUeXBl
c1tpXS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIGZ1bmMucGFyYW1ldGVyc1tpXS50eXBlKSkg
eworICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7Cisg
ICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgIGNv
bnRpbnVlOworICAgICAgICBpZiAoIXVuaWZpY2F0aW9uQ29udGV4dC52ZXJpZnkoKSkKKyAgICAg
ICAgICAgIGNvbnRpbnVlOworICAgICAgICBsZXQgc2hvdWxkQnVpbGRUeXBlQXJndW1lbnRzID0g
IXR5cGVBcmd1bWVudHMubGVuZ3RoOworICAgICAgICBpZiAoc2hvdWxkQnVpbGRUeXBlQXJndW1l
bnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50cyA9IFtdOworICAgICAgICBmb3IgKGxldCB0
eXBlUGFyYW1ldGVyIG9mIGZ1bmMudHlwZVBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIGxldCB0
eXBlQXJndW1lbnQgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0eXBlUGFyYW1ldGVyKTsKKyAg
ICAgICAgICAgIGlmICh0eXBlQXJndW1lbnQgPT0gdHlwZVBhcmFtZXRlcikgeworICAgICAgICAg
ICAgICAgIG9rID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBpZiAoc2hvdWxkQnVpbGRUeXBlQXJndW1lbnRzKQorICAgICAgICAgICAg
ICAgIHR5cGVBcmd1bWVudHMucHVzaCh0eXBlQXJndW1lbnQpOworICAgICAgICB9CisgICAgICAg
IGlmICghb2spCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgcmV0dXJuIHtmdW5jLCB1
bmlmaWNhdGlvbkNvbnRleHQsIHR5cGVBcmd1bWVudHN9OworICAgIH0KKyAgICAKKyAgICByZXR1
cm4gbnVsbDsKK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29sdmVUeXBlRGVmcy5qcwo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlVHlwZURlZnMuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2ZVR5cGVEZWZzLmpzCSh3b3JraW5n
IGNvcHkpCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUg
SW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2Ug
aW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0
aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z
CisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3Qg
cmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv
bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0
aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlh
bHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUg
SVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBP
UiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUK
KyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9S
IEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNI
QUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJF
Q1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05T
RVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJP
Q1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERB
VEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FV
U0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJB
Q1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBP
UiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJ
UyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERB
TUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gcmVzb2x2ZVR5cGVEZWZzKHBy
b2dyYW0pCit7CisgICAgcHJvZ3JhbS52aXNpdChuZXcgVHlwZURlZlJlc29sdmVyKCkpOworfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4uanMKPT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMv
QXJyYXlMYW5nUkkvUmV0dXJuLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L1JldHVybi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJl
dHVybiBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgdmFsdWUpCisgICAg
eworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAg
ICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7
IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLl92
YWx1ZTsgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmICh0aGlzLnZh
bHVlKQorICAgICAgICAgICAgcmV0dXJuICJyZXR1cm4gIiArIHRoaXMudmFsdWU7CisgICAgICAg
IHJldHVybiAicmV0dXJuIjsKKyAgICB9Cit9OworCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9S
ZXR1cm5FeGNlcHRpb24uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJu
RXhjZXB0aW9uLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybkV4
Y2VwdGlvbi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJl
dHVybkV4Y2VwdGlvbiB7CisgICAgY29uc3RydWN0b3IodmFsdWUpCisgICAgeworICAgICAgICB0
aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgdmFsdWUoKSB7IHJldHVy
biB0aGlzLl92YWx1ZTsgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMJKG5vbmV4aXN0ZW50
KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUmV3cml0ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUmV3cml0ZXIgeworICAgIGNvbnN0cnVjdG9yKCkKKyAg
ICB7CisgICAgICAgIHRoaXMuX21hcHBpbmcgPSBuZXcgTWFwKCk7CisgICAgfQorICAgIAorICAg
IF9tYXAob2xkSXRlbSwgbmV3SXRlbSkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcHBpbmcuc2V0
KG9sZEl0ZW0sIG5ld0l0ZW0pOworICAgICAgICByZXR1cm4gbmV3SXRlbTsKKyAgICB9CisgICAg
CisgICAgX2dldE1hcHBpbmcob2xkSXRlbSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0
aGlzLl9tYXBwaW5nLmdldChvbGRJdGVtKTsKKyAgICAgICAgaWYgKHJlc3VsdCkKKyAgICAgICAg
ICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIHJldHVybiBvbGRJdGVtOworICAgIH0KKyAgICAK
KyAgICB2aXNpdEZ1bmMobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuYygKKyAg
ICAgICAgICAgIG5vZGUubmFtZSwgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KHRoaXMpLAorICAgICAg
ICAgICAgbm9kZS50eXBlUGFyYW1ldGVycy5tYXAodHlwZVBhcm1ldGVyID0+IHR5cGVQYXJhbWV0
ZXIudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0
ZXIgPT4gcGFyYW1ldGVyLnZpc2l0KHRoaXMpKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVu
Y1BhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBGdW5jUGFy
YW1ldGVyKG5vZGUubmFtZSwgbm9kZS50eXBlLnZpc2l0KHRoaXMpKTsKKyAgICAgICAgdGhpcy5f
bWFwKG5vZGUsIHJlc3VsdCk7CisgICAgICAgIHJlc3VsdC5sVmFsdWUgPSBub2RlLmxWYWx1ZTsK
KyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2Rl
KQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBCbG9jayhub2RlLm9yaWdpbik7Cisg
ICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnN0YXRlbWVudHMpCisgICAgICAgICAg
ICByZXN1bHQuYWRkKHN0YXRlbWVudC52aXNpdCh0aGlzKSk7CisgICAgICAgIHJldHVybiByZXN1
bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0Q29tbWFFeHByZXNzaW9uKG5vZGUpCisgICAgewor
ICAgICAgICByZXR1cm4gbmV3IENvbW1hRXhwcmVzc2lvbihub2RlLm9yaWdpbiwgbm9kZS5saXN0
Lm1hcChleHByZXNzaW9uID0+IGV4cHJlc3Npb24udmlzaXQodGhpcykpKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7
CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IHJlc3VsdCA9IG5ldyBUeXBlUmVmKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZUFy
Z3VtZW50cy5tYXAodHlwZUFyZ3VtZW50ID0+IHR5cGVBcmd1bWVudC52aXNpdCh0aGlzKSkpOwor
ICAgICAgICByZXN1bHQudHlwZSA9IG5vZGUudHlwZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsK
KyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFyaWFibGUobm9kZSkKKyAgICB7CisgICAgICAg
IHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0
ZXIobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgQ29uc3RleHByVHlwZVBhcmFtZXRl
cihub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5cGUudmlzaXQodGhpcykpOworICAgIH0K
KyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3IEZp
ZWxkKG5vZGUub3JpZ2luLCBub2RlLm5hbWUsIG5vZGUudHlwZS52aXNpdCh0aGlzKSk7CisgICAg
fQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIG5ldyBub2RlLmNvbnN0cnVjdG9yKG5vZGUucm9naWluLCBub2RlLmFkZHJlc3NTcGFjZSwg
bm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHRy
VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBl
KG5vZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFycmF5UmVmVHlwZShub2RlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRSZWZlcmVuY2VUeXBlKG5vZGUpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBB
cnJheVR5cGUobm9kZS5vcmlnaW4sIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcykpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVy
biBuZXcgQXNzaWdubWVudChub2RlLm9yaWdpbiwgbm9kZS5saHMudmlzaXQodGhpcyksIG5vZGUu
cmhzLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2Rl
KQorICAgIHsKKyAgICAgICAgbm9kZS52YXJpYWJsZSA9IHRoaXMuX2dldE1hcHBpbmcobm9kZS52
YXJpYWJsZSk7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJl
dHVybihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4obm9kZS5vcmlnaW4s
IG5vZGUudmFsdWUgPyBub2RlLnZhbHVlLnZpc2l0KHRoaXMpIDogbnVsbCk7CisgICAgfQorICAg
IAorICAgIHZpc2l0SW50TGl0ZXJhbChub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGU7
CisgICAgfQorCisgICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAg
bGV0IHJlc3VsdCA9IG5ldyBDYWxsRXhwcmVzc2lvbigKKyAgICAgICAgICAgIG5vZGUub3JpZ2lu
LCBub2RlLm5hbWUsCisgICAgICAgICAgICBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1
bWVudCA9PiB0eXBlQXJndW1lbnQudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5hcmd1
bWVudGxpc3QubWFwKGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSk7CisgICAgICAg
IGxldCBhY3R1YWxUeXBlQXJndW1lbnRzID0gbm9kZS5hY3R1YWxUeXBlQXJndW1lbnRzOworICAg
ICAgICBpZiAoYWN0dWFsVHlwZUFyZ3VtZW50cykgeworICAgICAgICAgICAgcmVzdWx0LmFjdHVh
bFR5cGVBcmd1bWVudHMgPQorICAgICAgICAgICAgICAgIGFjdHVhbFR5cGVBcmd1bWVudHMubWFw
KGFjdHVhbFR5cGVBcmd1bWVudCA9PiBhY3R1YWxUeXBlQXJndW1lbnQudmlzaXQodGhpcykpOwor
ICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0
RnVuY3Rpb25MaWtlQmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgRnVuY3Rp
b25MaWtlQmxvY2soCisgICAgICAgICAgICBub2RlLm9yaWdpbiwKKyAgICAgICAgICAgIG5vZGUu
YXJndW1lbnRMaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52aXNpdCh0aGlzKSksCisgICAg
ICAgICAgICBub2RlLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIudmlzaXQo
dGhpcykpLAorICAgICAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpKTsKKyAgICB9Cit9CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N0YW5kYXJkTGlicmFyeS5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9TdGFuZGFyZExpYnJhcnkuanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvU3RhbmRhcmRMaWJyYXJ5LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworLy8gTk9URTogVGhlIG5leHQgbGluZSBpcyBsaW5lIDI4LCBhbmQg
d2UgcmVseSBvbiB0aGlzIGluIFByZXBhcmUuanMuCitjb25zdCBzdGFuZGFyZExpYnJhcnkgPSBg
CisvLyBUaGlzIGlzIHRoZSBBcnJheUxhbmcgc3RhbmRhcmQgbGlicmFyeS4gSW1wbGVtZW50YXRp
b25zIG9mIGFsbCBvZiB0aGVzZSB0aGluZ3MgYXJlIGluCisvLyBJbnRyaW5zaWNzLmpzLgorCisv
LyBOZWVkIHRvIGJvb3RzdHJhcCB2b2lkIGZpcnN0LgorbmF0aXZlIHByaW1pdGl2ZSB0eXBlIHZv
aWQ7CituYXRpdmUgcHJpbWl0aXZlIHR5cGUgaW50MzI7Cit0eXBlIGludCA9IGludDMyOworCitu
YXRpdmUgaW50IG9wZXJhdG9yKyhpbnQsIGludCk7CitgOwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvU3RydWN0VHlwZS5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdHJ1Y3RU
eXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBTdHJ1Y3RUeXBlIGV4
dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlUGFyYW1ldGVy
cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5f
bmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRl
cnM7CisgICAgICAgIHRoaXMuX2ZpZWxkcyA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAg
YWRkKGZpZWxkKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX2ZpZWxkcy5oYXMoZmllbGQubmFt
ZSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IoZmllbGQub3JpZ2luLm9yaWdp
blN0cmluZywgIkR1cGxpY2F0ZSBmaWVsZCBuYW1lOiAiICsgZmllbGQubmFtZSk7CisgICAgICAg
IHRoaXMuX2ZpZWxkcy5zZXQoZmllbGQubmFtZSwgZmllbGQpOworICAgIH0KKyAgICAKKyAgICBn
ZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMo
KSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIAorICAgIGdldCBmaWVsZE5h
bWVzKCkgeyByZXR1cm4gdGhpcy5fZmllbGRzLmtleXMoKTsgfQorICAgIGZpZWxkQnlOYW1lKG5h
bWUpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy5nZXQobmFtZSk7IH0KKyAgICBnZXQgZmllbGRzKCkg
eyByZXR1cm4gdGhpcy5fZmllbGRzLnZhbHVlcygpOyB9CisgICAgZ2V0IGZpZWxkTWFwKCkgeyBy
ZXR1cm4gdGhpcy5fZmllbGRzOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkKKyAgICB7CisgICAg
ICAgIGxldCByZXN1bHQgPSB0cnVlOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZp
ZWxkcykKKyAgICAgICAgICAgIHJlc3VsdCAmPSBmaWVsZC50eXBlLmlzUHJpbWl0aXZlOworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBpbnN0YW50aWF0ZSh0eXBlQXJn
dW1lbnRzKQorICAgIHsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IHRoaXMu
dHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9y
KG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyBudW1iZXIgb2YgdHlwZSBhcmd1bWVudHMgdG8g
aW5zdGFudGlhdGlvbiIpOworICAgICAgICAKKyAgICAgICAgbGV0IHN1YnN0aXR1dGlvbiA9IFN1
YnN0aXR1dGlvbi5tYXBwaW5nKHRoaXMudHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpOwor
ICAgICAgICBsZXQgcmVzdWx0ID0gbmV3IFN0cnVjdFR5cGUodGhpcy5vcmlnaW4sIHRoaXMubmFt
ZSwgW10pOworICAgICAgICBmb3IgKGxldCBmaWVsZCBvZiB0aGlzLmZpZWxkcykKKyAgICAgICAg
ICAgIHJlc3VsdC5hZGQoZmllbGQudmlzaXQoc3Vic3RpdHV0aW9uKSk7CisgICAgICAgIHJldHVy
biByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiAic3RydWN0ICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJzICsg
Ij4geyAiICsgQXJyYXkuZnJvbSh0aGlzLmZpZWxkcykuam9pbigiOyAiKSArICI7IH0iOworICAg
IH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKG5vbmV4aXN0ZW50KQorKysg
VG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgU3Vic3RpdHV0aW9uIGV4dGVuZHMgUmV3cml0ZXIgeworICAg
IGNvbnN0cnVjdG9yKG1hcCkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG1hcDsKKyAgICB9
CisgICAgCisgICAgc3RhdGljIG1hcHBpbmcocGFyYW1ldGVycywgYXJndW1lbnRMaXN0KQorICAg
IHsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoICE9IGFyZ3VtZW50TGlzdC5sZW5ndGgp
CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBhcmFtZXRlcnMgYW5kIGFyZ3VtZW50cyBh
cmUgbWlzbWF0Y2hlZCIpOworICAgICAgICBsZXQgbWFwID0gbmV3IE1hcCgpOworICAgICAgICBm
b3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBt
YXAuc2V0KHBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50TGlzdFtpXSk7CisgICAgICAgIHJldHVybiBu
ZXcgU3Vic3RpdHV0aW9uKG1hcCk7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2Rl
KQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChub2RlLnR5
cGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKKyAgICAgICAgICAgIGlmIChub2RlLnR5
cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5l
eHBlY3RlZCB0eXBlIGFyZ3VtZW50cyBvbiB0eXBlIHZhcmlhYmxlIik7CisgICAgICAgICAgICBy
ZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIHJldHVybiBz
dXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgfQorCisgICAgdmlzaXRWYXJpYWJsZVJlZihu
b2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0gdGhpcy5fbWFwLmdldChub2Rl
LnZhcmlhYmxlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50KQorICAgICAgICAgICAgcmV0dXJu
IHJlcGxhY2VtZW50OworICAgICAgICAKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZpc2l0VmFyaWFi
bGVSZWYobm9kZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdWZmaXhD
YWxsQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdWZmaXhD
YWxsQXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9TdWZm
aXhDYWxsQXNzaWdubWVudC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0IEBACisvKgor
ICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAq
CisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3
aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0
aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJp
YnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Cisg
KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXBy
b2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1l
bnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1
dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBB
UyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVS
Q0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJF
IERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklC
VVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BF
Q0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMg
T1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5F
U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0Yg
TElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JU
CisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBX
QVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBP
RiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisK
K2NsYXNzIFN1ZmZpeENhbGxBc3NpZ25tZW50IGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29u
c3RydWN0b3Iob3JpZ2luLCBuYW1lLCBsaHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4p
OworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fbGhzID0gbGhzOwor
ICAgICAgICB0aGlzLmZ1bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsg
cmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9
CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGhzICsg
IiBzdWZmaXggIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL1Rlc3QuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVGVzdC5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UZXN0LmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworbG9hZCgiQWxsLmpzIik7CisKK3sKKyAgICBsZXQgcHJvZ3Jh
bSA9IHByZXBhcmUoIjx0ZXN0PiIsIDAsICJpbnQgZm9vKGludCB4KSB7IHJldHVybiB4ICsgMTsg
fSIpOworICAgIGxldCByZXN1bHQgPSBjYWxsRnVuY3Rpb24ocHJvZ3JhbSwgImZvbyIsIFtdLCBb
bmV3IEVJbnQocHJvZ3JhbS5pbnQzMiwgNDIpXSk7CisgICAgaWYgKCEocmVzdWx0IGluc3RhbmNl
b2YgRUludCkpCisgICAgICAgIHRocm93IG5ldyBFcnJvcigiV3JvbmcgcmVzdWx0IHR5cGU7IHJl
c3VsdDogIiArIHJlc3VsdCk7CisgICAgaWYgKHJlc3VsdC52YWx1ZSAhPSA0MykKKyAgICAgICAg
dGhyb3cgbmV3IEVycm9yKCJXcm9uZyByZXN1bHQ6ICIgKyByZXN1bHQpOworfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9UeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1R5cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGUgZXh0ZW5kcyBOb2Rl
IHsKKyAgICBnZXQgdHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiBbXTsgfQorICAgIGdldCBraW5k
KCkgeyByZXR1cm4gVHlwZTsgfQorICAgIAorICAgIGluaGVyaXRzKHByb3RvY29sKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHByb3RvY29sLmhhc0hlaXIodGhpcyk7CisgICAgfQorICAgIAorICAg
IGdldCBpbnN0YW50aWF0ZWRUeXBlKCkgeyByZXR1cm4gdGhpczsgfQorICAgIAorICAgIGdldCB3
aXRoUmVjdXJzaXZlbHlJbnN0YW50aWF0ZWRJbW1lZGlhdGVzKCkKKyAgICB7CisgICAgICAgIHJl
dHVybiB0aGlzLnZpc2l0KG5ldyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMoKSk7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlRGVmLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL1R5cGVEZWYuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5n
UkkvVHlwZURlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IFR5cGVEZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5
cGVQYXJhbWV0ZXJzLCB0eXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhp
cy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAg
dGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fdHlw
ZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9v
cmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQg
dHlwZVBhcmFtZXRlcnMoKSB7IHJldHVybiB0aGlzLl90eXBlUGFyYW1ldGVyczsgfQorICAgIGdl
dCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9UeXBlRGVmUmVzb2x2ZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
VHlwZURlZlJlc29sdmVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5
cGVEZWZSZXNvbHZlci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDUyIEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Ns
YXNzIFR5cGVEZWZSZXNvbHZlciBleHRlbmRzIFZpc2l0b3IgeworICAgIGNvbnN0cnVjdG9yKCkK
KyAgICB7CisgICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gbmV3IFZpc2l0aW5nU2V0KCk7CisgICAg
fQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fdmlz
aXRpbmcuZG9WaXNpdChub2RlLCAoKSA9PiB7CisgICAgICAgICAgICBzdXBlci52aXNpdFR5cGVS
ZWYobm9kZSk7CisgICAgICAgICAgICBpZiAobm9kZS50eXBlIGluc3RhbmNlb2YgVHlwZURlZikg
eworICAgICAgICAgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcgVW5pZmljYXRp
b25Db250ZXh0KG5vZGUudHlwZS50eXBlUGFyYW1ldGVycyk7CisgICAgICAgICAgICAgICAgaWYg
KG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGggIT0gbm9kZS50eXBlLnR5cGVQYXJhbWV0ZXJzLmxl
bmd0aCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhcmd1bWVudC9wYXJh
bWV0ZXIgbWlzbWF0Y2ggKHNob3VsZCBoYXZlIGJlZW4gY2F1Z2h0IGVhcmxpZXIpIik7CisgICAg
ICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLnR5cGVBcmd1bWVudHMubGVuZ3Ro
OyArK2kpCisgICAgICAgICAgICAgICAgICAgIG5vZGUudHlwZUFyZ3VtZW50c1tpXS51bmlmeSh1
bmlmaWNhdGlvbkNvbnRleHQsIG5vZGUudHlwZS50eXBlUGFyYW1ldGVyc1tpXSk7CisgICAgICAg
ICAgICAgICAgaWYgKCF1bmlmaWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJU
eXBlIHJlZmVyZW5jZSB0byBhIHR5cGUgZGVmaW5pdGlvbiB2aW9sYXRlcyBwcm90b2NvbCBjb25z
dHJhaW50cyIpOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGxldCBuZXdUeXBl
ID0gbm9kZS50eXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKG5vZGUudHlwZS50eXBlUGFyYW1l
dGVycywgdW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAgICAgICAgICBuZXdUeXBlLnZpc2l0
KHRoaXMpOworICAgICAgICAgICAgICAgIG5vZGUuc2V0VHlwZUFuZEFyZ3VlbW50cyhuZXdUeXBl
LCBbXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgVHlwZU9yVmFyaWFibGVSZWYgZXh0ZW5kcyBOb2RlIHsKKyAgICBj
b25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgIH0KKyAgICAKKyAgICBnZXQg
b3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVy
biB0aGlzLl9uYW1lOyB9CisKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVSZWYuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVJlZi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWYgZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1
Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICBzdXBlcigp
OworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBu
YW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgICAgICB0aGlzLl90eXBlQXJndW1l
bnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisgICAgc3RhdGljIHdyYXAodHlwZSkK
KyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlwZVJlZih0eXBlLm9yaWdpbiwgdHlw
ZS5uYW1lLCBbXSk7CisgICAgICAgIHJlc3VsdC50eXBlID0gdHlwZTsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdp
bjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCB0eXBl
QXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1By
aW1pdGl2ZSgpIHsgcmV0dXJuIHR5cGUgPyB0eXBlLmlzUHJpbWl0aXZlIDogZmFsc2U7IH0KKyAg
ICAKKyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy50eXBlLmluc3RhbnRpYXRlKHR5cGVBcmd1bWVudHMpOworICAgIH0KKyAgICAKKyAgICBnZXQg
dW5pZnlOb2RlKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0
aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGUudW5pZnlOb2RlOworICAgICAgICByZXR1
cm4gdGhpczsKKyAgICB9CisKKyAgICBwb3B1bGF0ZURlZmF1bHRWYWx1ZShidWZmZXIsIG9mZnNl
dCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAg
ICAgICAgIHJldHVybiB0aGlzLnR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUoYnVmZmVyLCBvZmZz
ZXQpOworICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBnZXQgZGVmYXVsdCB2YWx1ZSBv
ZiBhIHR5cGUgaW5zdGFudGlhdGlvbiIpOworICAgIH0KKyAgICAKKyAgICBnZXQgc2l6ZSgpCisg
ICAgeworICAgICAgICBpZiAoIXRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAg
ICByZXR1cm4gdGhpcy50eXBlLnNpemU7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90
IGdldCBzaXplIG9mIGEgdHlwZSBpbnN0YW50aWF0aW9uIik7CisgICAgfQorICAgIAorICAgIHNl
dFR5cGVBbmRBcmd1bWVudHModHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRo
aXMuX25hbWUgPSB0eXBlLm5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAg
IHRoaXMuX3R5cGVBcmd1bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICB1
bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICgh
KG90aGVyIGluc3RhbmNlb2YgVHlwZVJlZikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cisg
ICAgICAgIGlmICghdGhpcy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlw
ZSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1
bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3Vt
ZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNb
aV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmICghdGhp
cy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7Cisg
ICAgICAgIHJldHVybiB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7
CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVWYXJpYWJsZSBleHRlbmRzIFR5cGUgewor
ICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0
aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAg
ICB0aGlzLl9wcm90b2NvbCA9IHByb3RvY29sOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgp
IHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgcHJvdG9jb2woKSB7IHJldHVybiB0aGlz
Ll9wcm90b2NvbDsgfQorICAgIAorICAgIGdldCBpc1ByaW1pdGl2ZSgpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5fcHJvdG9jb2wgJiYgdGhpcy5fcHJvdG9jb2wuaXNQcmltaXRpdmU7Cisg
ICAgfQorICAgIAorICAgIGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAK
KyAgICBpbmhlcml0cyhwcm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghcHJvdG9jb2wpCisg
ICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhl
cml0cyhwcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZp
Y2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5j
ZW9mIFR5cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBsZXQgcmVhbFRo
aXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlz
ICE9IHRoaXMpCisgICAgICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25D
b250ZXh0LCBvdGhlcik7CisgICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5p
ZnkodGhpcywgb3RoZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAg
dW5pZnlJbXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1
cm4gdGhpcy50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAg
ICB9CisgICAgCisgICAgdmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAg
eworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsK
KyAgICAgICAgCisgICAgICAgIC8vIFRoZSB0aGluZyB3ZSBnZXQgdW5pZmllZCB3aXRoIG11c3Qg
YmUgYSB0eXBlIHZhcmlhYmxlIHRoYXQgYWNjZXB0cyBhIGJyb2FkZXIgc2V0IG9mCisgICAgICAg
IC8vIHRoaW5ncyB0aGFuIHdlIGRvLgorICAgICAgICBpZiAoIShyZWFsVGhpcyBpbnN0YW5jZW9m
IFR5cGVWYXJpYWJsZSkpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAg
ICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiAhcmVhbFRoaXMucHJv
dG9jb2w7CisgICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhy
ZWFsVGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVu
aWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAg
ICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gdW5pZmljYXRpb25Db250ZXh0
LmZpbmQodGhpcykuaW5oZXJpdHModGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHRv
U3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMu
IEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBz
b3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24s
IGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAq
IGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh
aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25z
IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBw
cm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQ
Uk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElN
UExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICog
SU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQ
QVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwg
QVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBVbmlmaWNhdGlvbkNvbnRleHQgeworICAg
IGNvbnN0cnVjdG9yKHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fdHlwZVBh
cmFtZXRlcnMgPSBuZXcgU2V0KHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5fbmV4dE1h
cCA9IG5ldyBNYXAoKTsKKyAgICB9CisgICAgCisgICAgdW5pb24oYSwgYikKKyAgICB7CisgICAg
ICAgIGEgPSBmaW5kKGEpOworICAgICAgICBiID0gZmluZChiKTsKKyAgICAgICAgaWYgKGEgPT0g
YikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICghYi5pc1VuaWZp
YWJsZSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBhXTsKKyAgICAgICAgaWYgKCFhLmlzVW5p
ZmlhYmxlKQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdW5pZnkgbm9uLXVu
aWZpYWJsZSB0aGluZ3MgIiArIGEgKyAiIGFuZCAiICsgYik7CisgICAgICAgIAorICAgICAgICAv
LyBNYWtlIHN1cmUgdGhhdCB0eXBlIHBhcmFtZXRlcnMgZG9uJ3QgZW5kIHVwIGJlaW5nIHJvb3Rz
LgorICAgICAgICBpZiAoYS5pc1VuaWZpYWJsZSAmJiBiLmlzVW5pZmlhYmxlICYmIHRoaXMuX3R5
cGVQYXJhbWV0ZXJzLmhhcyhiKSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBhXTsKKworICAg
ICAgICB0aGlzLl9uZXh0TWFwLnNldChhLCBiKTsKKyAgICB9CisgICAgCisgICAgZmluZChub2Rl
KQorICAgIHsKKyAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTsKKyAgICAgICAgbGV0IG5l
eHROb2RlID0gdGhpcy5fbmV4dE1hcC5nZXQoY3VycmVudE5vZGUpOworICAgICAgICBpZiAoIW5l
eHROb2RlKQorICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOworICAgICAgICBmb3IgKDs7
KSB7CisgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IG5leHROb2RlOworICAgICAgICAgICAgbmV4
dE5vZGUgPSB0aGlzLl9uZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICBpZiAo
IW5leHROb2RlKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRo
aXMuX25leHRNYXAuc2V0KG5vZGUsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgcmV0dXJuIGN1cnJl
bnROb2RlOworICAgIH0KKyAgICAKKyAgICBnZXQgbm9kZXMoKQorICAgIHsKKyAgICAgICAgbGV0
IHJlc3VsdCA9IG5ldyBTZXQoKTsKKyAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRo
aXMuX25leHRNYXApIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoa2V5KTsKKyAgICAgICAgICAg
IHJlc3VsdC5hZGQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgfQorICAgIAorICAgIHZlcmlmeSgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFy
YW1ldGVyIG9mIHRoaXMuX3R5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBpZiAoIXR5cGVQ
YXJhbWV0ZXIudmVyaWZ5QXNQYXJhbWV0ZXIodGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiB0aGlz
Lm5vZGVzKSB7CisgICAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVudC5pc1VuaWZpYWJsZSkKKyAg
ICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICh0aGlzLl90eXBlUGFyYW1l
dGVycy5oYXModHlwZUFyZ3VtZW50KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAg
ICAgICAgIGlmICghdHlwZUFyZ3VtZW50LnZlcmlmeUFzQXJndW1lbnQodGhpcykpCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIH0KKyAgICAKKyAgICBpc1VudW5pZmllZCgpCisgICAgeworICAgICAgICByZXR1cm4gIXRo
aXMuX25leHRNYXAuc2l6ZSgpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
VmFsdWUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmFsdWUuanMJKHdvcmtpbmcgY29weSkKQEAg
LTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2Ug
YW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBw
ZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBt
ZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJp
bmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGlj
ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBp
biB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRl
ZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF
RCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQg
V0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElF
RCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUg
SU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAq
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAq
LworInVzZSBzdHJpY3QiOworCitjbGFzcyBWYWx1ZSBleHRlbmRzIE5vZGUgeworICAgIGdldCBr
aW5kKCkgeyByZXR1cm4gVmFsdWU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiBm
YWxzZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZURlY2wuanMKPT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVEZWNsLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlRGVjbC5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFZhcmlhYmxlRGVjbCBleHRlbmRzIFZhbHVlIHsK
KyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGUsIGluaXRpYWxpemVyKQorICAgIHsK
KyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAg
ICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgICAg
IHRoaXMuX2luaXRpYWxpemVyID0gaW5pdGlhbGl6ZXI7CisgICAgfQorICAgIAorICAgIGdldCBv
cmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJu
IHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KKyAg
ICBnZXQgaW5pdGlhbGl6ZXIoKSB7IHJldHVybiB0aGlzLl9pbml0aWFsaXplcjsgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGUgKyAiICIgKyB0
aGlzLm5hbWUgKyAodGhpcy5pbml0aWFsaXplciA/ICIgPSAiICsgdGhpcy5pbml0aWFsaXplciA6
ICIiKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1ZhcmlhYmxlUmVmLmpzCSh3b3JraW5nIGNvcHkp
CkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmFyaWFibGVSZWYgZXh0ZW5kcyBFeHByZXNz
aW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAgICAgICBzdXBl
cihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy52YXJp
YWJsZSA9IG51bGw7CisgICAgfQorICAgIAorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5f
bmFtZTsgfQorICAgIGdldCBpc0NvbnN0ZXhwcigpIHsgcmV0dXJuIHRoaXMudmFyaWFibGUuaXND
b25zdGV4cHI7IH0KKyAgICBnZXQgdW5pZnlOb2RlKCkgeyByZXR1cm4gdGhpcy52YXJpYWJsZS51
bmlmeU5vZGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4g
dGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0
LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0LmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0aW5nU2V0LmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmlzaXRpbmdTZXQgeworICAgIGNvbnN0
cnVjdG9yKC4uLml0ZW1zKQorICAgIHsKKyAgICAgICAgdGhpcy5fc2V0ID0gbmV3IFNldChpdGVt
cyk7CisgICAgfQorICAgIAorICAgIGRvVmlzaXQoaXRlbSwgY2FsbGJhY2spCisgICAgeworICAg
ICAgICBpZiAodGhpcy5fc2V0LmhhcyhpdGVtKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5
cGVFcnJvcihpdGVtLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJSZWN1cnNpdmUgIiArIGl0ZW0ua2lu
ZCk7CisgICAgICAgIHRoaXMuX3NldC5hZGQoaXRlbSk7CisgICAgICAgIHRyeSB7CisgICAgICAg
ICAgICByZXR1cm4gY2FsbGJhY2soKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAg
IHRoaXMuX3NldC5kZWxldGUoaXRlbSk7CisgICAgICAgIH0KKyAgICB9Cit9CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L1Zpc2l0b3IuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvVmlzaXRvci5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBWaXNpdG9yIHsK
KyAgICB2aXNpdFByb2dyYW0obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVu
dCBvZiBub2RlLnRvcExldmVsU3RhdGVtZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNp
dCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jKG5vZGUpCisgICAgeworICAgICAg
ICBub2RlLnJldHVyblR5cGUudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJh
bWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIu
dmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRl
cnMpCisgICAgICAgICAgICBwYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAg
IHZpc2l0RnVuY1BhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0
KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNEZWYobm9kZSkKKyAgICB7CisgICAg
ICAgIHZpc2l0RnVuYyhub2RlKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdE5hdGl2ZUZ1bmMobm9kZSkKKyAgICB7CisgICAgICAgIHZpc2l0
RnVuYyhub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRCbG9jayhub2RlKQorICAgIHsKKyAg
ICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVtZW50cykKKyAgICAgICAgICAg
IHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRDb21tYUV4cHJl
c3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IGV4cHJlc3Npb24gb2Ygbm9kZS5s
aXN0KQorICAgICAgICAgICAgZXhwcmVzc2lvbi52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRQcm90b2NvbFJlZihub2RlKQorICAgIHsKKyAgICB9CisgICAgCisgICAgdmlzaXRQ
cm90b2NvbERlY2wobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBvZiBu
b2RlLnNpZ25hdHVyZXMpCisgICAgICAgICAgICBzaWduYXR1cmUudmlzaXQodGhpcyk7CisgICAg
fQorICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQg
dHlwZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1
bWVudC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXROYXRpdmVUeXBlKG5vZGUp
CisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW10ZXIgb2Ygbm9kZS50eXBlUGFyYW1l
dGVycykKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgfQorICAg
IAorICAgIHZpc2l0VHlwZURlZihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBh
cmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRl
ci52aXNpdCh0aGlzKTsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdFN0cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5
cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykKKyAgICAgICAgICAgIHR5cGVQYXJh
bWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIGZvciAobGV0IGZpZWxkIG9mIG5vZGUuZmllbGRz
KQorICAgICAgICAgICAgZmllbGQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0
VHlwZVZhcmlhYmxlKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbnN0ZXhw
clR5cGVQYXJhbWV0ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlz
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGaWVsZChub2RlKQorICAgIHsKKyAgICAgICAgbm9k
ZS50eXBlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEVsZW1lbnRhbFR5cGUo
bm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcyk7CisgICAg
fQorICAgIAorICAgIHZpc2l0UHRyVHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNp
dEVsZW1lbnRhbFR5cGUobm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0QXJyYXlSZWZUeXBl
KG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVudGFsVHlwZShub2RlKTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMu
dmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgICAgICBub2RlLm51bUVsZW1lbnRzLnZpc2l0
KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEFzc2lnbm1lbnQobm9kZSkKKyAgICB7Cisg
ICAgICAgIG5vZGUubGhzLnZpc2l0KHRoaXMpOworICAgICAgICBub2RlLnJocy52aXNpdCh0aGlz
KTsKKyAgICB9CisgICAgCisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICB9
CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAgIGlmIChub2RlLnZh
bHVlKQorICAgICAgICAgICAgbm9kZS52YWx1ZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisg
ICAgdmlzdEludExpdGVyYWwobm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2Fs
bEV4cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBv
ZiBub2RlLnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1lbnQudmlzaXQodGhp
cyk7CisgICAgICAgIGZvciAobGV0IGFyZ3VtZW50IG9mIG5vZGUuYXJndW1lbnRMaXN0KQorICAg
ICAgICAgICAgYXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVu
Y3Rpb25MaWtlQmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IGFyZ3VtZW50IG9m
IG5vZGUuYXJndW1lbnRMaXN0KQorICAgICAgICAgICAgYXJndW1lbnQudmlzaXQodGhpcyk7Cisg
ICAgICAgIGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMpCisgICAgICAgICAg
ICBwYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdCh0aGlzKTsK
KyAgICB9Cit9CisK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>319284</attachid>
            <date>2017-08-29 14:34:29 -0700</date>
            <delta_ts>2017-08-30 08:51:20 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>242997</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFRvb2xzL0NoYW5nZUxvZwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9DaGFuZ2VMb2cJKHJl
dmlzaW9uIDIyMTMxMikKKysrIFRvb2xzL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwz
ICsxLDUzNiBAQAorMjAxNy0wOC0yOSAgRmlsaXAgUGl6bG8gIDxmcGl6bG9AYXBwbGUuY29tPgor
CisgICAgICAgIEluaXRpYWwgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIHNjYWZmb2xkaW5nIGZv
ciBBcnJheUxhbmcKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dp
P2lkPTE3NTkyNQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAg
ICAKKyAgICAgICAgVGhpcyBpbnRyb2R1Y2VzIGEgdmVyeSByb3VnaCBzY2FmZm9sZGluZyBmb3Ig
YW4gQVNUIHdhbGsgaW50ZXJwcmV0ZXIgYW5kIHR5cGUgY2hlY2tlciBmb3IgYW4KKyAgICAgICAg
ZXhwZXJpbWVudGFsIHNoYWRlciBsYW5ndWFnZSB3ZSBhcmUgY2FsbGluZyBBcnJheUxhbmcgZm9y
IG5vdy4KKyAgICAgICAgCisgICAgICAgIFRoZSBpZGVhIGlzIHRvIGhhdmUgYSBzdHJvbmcgY29y
ZSB0eXBlIHN5c3RlbSB0aGF0IGluY2x1ZGVzIGdlbmVyaWNzIGFuZCBtZW1vcnktc2FmZSBwb2lu
dGVycworICAgICAgICBhbmQgYXJyYXkgcmVmZXJlbmNlcy4gRXZlcnl0aGluZyBoYXMgZGV0ZXJt
aW5pc3RpYyBzZW1hbnRpY3MgcmlnaHQgdXAgdG8gdGhlIGxpbWl0IG9mIHdoYXQgaXMKKyAgICAg
ICAgcG9ydGFibHkgcG9zc2libGUuCisgICAgICAgIAorICAgICAgICBUaGlzIGxhbmd1YWdlIHdp
bGwgc3VwcG9ydCBnZW5lcmljcy4gVGhpcyB3aWxsIGJlIHZhbGlkOgorICAgICAgICAKKyAgICAg
ICAgcHJvdG9jb2wgQWRkYWJsZSB7IEFkZGFibGUgb3BlcmF0b3IrKEFkZGFibGUsIEFkZGFibGUp
OyB9CisgICAgICAgIFQgYWRkPFQ6QWRkYWJsZT4oVCBhLCBUIGIpIHsgcmV0dXJuIGEgKyBiOyB9
CisgICAgICAgIAorICAgICAgICBUaGlzIGxhbmd1YWdlIHdpbGwgc3VwcG9ydCBwb2ludGVycyBh
bmQgYXJyYXkgcmVmZXJlbmNlcy4gVGhpcyB3aWxsIGJlIHZhbGlkOgorICAgICAgICAKKyAgICAg
ICAgdGhyZWFkIGludF4gZm9vKCkgeyBpbnQgeDsgcmV0dXJuIFx4OyB9CisgICAgICAgIAorICAg
ICAgICBFYWNoIHZhcmlhYmxlIGJlaGF2ZXMgYXMgaWYgaXQgd2FzIGRlY2xhcmVkICJzdGF0aWMi
LCB3aXRoIG9uZSBjb3B5IHBlciB0eXBlIGluc3RhbnRpYXRpb24uCisgICAgICAgIEZ1bmN0aW9u
cyBjYW5ub3QgcmVjdXJzZSBhbmQgdGhlcmUgaXMgbm8gc3RhY2suCisgICAgICAgIAorICAgICAg
ICBDdXJyZW50bHksIHRoaXMganVzdCB0ZXN0cyB0aGF0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24g
Y2FuIGJlIHBhcnNlZCwgY2hlY2tlZCwgYW5kIGNhbGxlZDoKKyAgICAgICAgCisgICAgICAgIGlu
dCBmb28oaW50IHgpIHsgcmV0dXJuIHggKyAxOyB9CisKKyAgICAgICAgKiBBcnJheUxhbmdSSTog
QWRkZWQuCisgICAgICAgICogQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qczogQWRkZWQuCisg
ICAgICAgIChBTFN5bnRheEVycm9yKToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9BTFR5cGVFcnJv
ci5qczogQWRkZWQuCisgICAgICAgIChBTFR5cGVFcnJvcik6CisgICAgICAgICogQXJyYXlMYW5n
UkkvQWRkcmVzc1NwYWNlLmpzOiBBZGRlZC4KKyAgICAgICAgKGlzQWRkcmVzc1NwYWNlKToKKyAg
ICAgICAgKHZhbGlkYXRlQWRkcmVzc1NwYWNlKToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9BbGwu
anM6IEFkZGVkLgorICAgICAgICAqIEFycmF5TGFuZ1JJL0FycmF5UmVmVHlwZS5qczogQWRkZWQu
CisgICAgICAgIChBcnJheVJlZlR5cGUucHJvdG90eXBlLnVuaWZ5SW1wbCk6CisgICAgICAgIChB
cnJheVJlZlR5cGUucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKEFycmF5UmVmVHlwZSk6
CisgICAgICAgICogQXJyYXlMYW5nUkkvQXJyYXlUeXBlLmpzOiBBZGRlZC4KKyAgICAgICAgKEFy
cmF5VHlwZSk6CisgICAgICAgIChBcnJheVR5cGUucHJvdG90eXBlLmdldCBvcmlnaW4pOgorICAg
ICAgICAoQXJyYXlUeXBlLnByb3RvdHlwZS5nZXQgZWxlbWVudFR5cGUpOgorICAgICAgICAoQXJy
YXlUeXBlLnByb3RvdHlwZS5nZXQgbnVtRWxlbWVudHMpOgorICAgICAgICAoQXJyYXlUeXBlLnBy
b3RvdHlwZS5nZXQgaXNQcmltaXRpdmUpOgorICAgICAgICAoQXJyYXlUeXBlLnByb3RvdHlwZS50
b1N0cmluZyk6CisgICAgICAgIChBcnJheVR5cGUucHJvdG90eXBlLmdldCBzaXplKToKKyAgICAg
ICAgKEFycmF5VHlwZS5wcm90b3R5cGUudW5pZnlJbXBsKToKKyAgICAgICAgKiBBcnJheUxhbmdS
SS9Bc3NpZ25tZW50LmpzOiBBZGRlZC4KKyAgICAgICAgKEFzc2lnbm1lbnQpOgorICAgICAgICAo
QXNzaWdubWVudC5wcm90b3R5cGUuZ2V0IGxocyk6CisgICAgICAgIChBc3NpZ25tZW50LnByb3Rv
dHlwZS5nZXQgcmhzKToKKyAgICAgICAgKEFzc2lnbm1lbnQucHJvdG90eXBlLnRvU3RyaW5nKToK
KyAgICAgICAgKiBBcnJheUxhbmdSSS9CbG9jay5qczogQWRkZWQuCisgICAgICAgIChCbG9jayk6
CisgICAgICAgIChCbG9jay5wcm90b3R5cGUuZ2V0IG9yaWdpbik6CisgICAgICAgIChCbG9jay5w
cm90b3R5cGUuYWRkKToKKyAgICAgICAgKEJsb2NrLnByb3RvdHlwZS5nZXQgc3RhdGVtZW50cyk6
CisgICAgICAgIChCbG9jay5wcm90b3R5cGUudG9TdHJpbmcpOgorICAgICAgICAqIEFycmF5TGFu
Z1JJL0NhbGxBc3NpZ25tZW50LmpzOiBBZGRlZC4KKyAgICAgICAgKENhbGxBc3NpZ25tZW50KToK
KyAgICAgICAgKENhbGxBc3NpZ25tZW50LnByb3RvdHlwZS5nZXQgbmFtZSk6CisgICAgICAgIChD
YWxsQXNzaWdubWVudC5wcm90b3R5cGUuZ2V0IGxocyk6CisgICAgICAgIChDYWxsQXNzaWdubWVu
dC5wcm90b3R5cGUuZ2V0IHJocyk6CisgICAgICAgIChDYWxsQXNzaWdubWVudC5wcm90b3R5cGUu
dG9TdHJpbmcpOgorICAgICAgICAqIEFycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzOiBBZGRl
ZC4KKyAgICAgICAgKENhbGxFeHByZXNzaW9uKToKKyAgICAgICAgKENhbGxFeHByZXNzaW9uLnBy
b3RvdHlwZS5nZXQgbmFtZSk6CisgICAgICAgIChDYWxsRXhwcmVzc2lvbi5wcm90b3R5cGUuZ2V0
IHR5cGVBcmd1bWVudHMpOgorICAgICAgICAoQ2FsbEV4cHJlc3Npb24ucHJvdG90eXBlLmdldCBh
cmd1bWVudExpc3QpOgorICAgICAgICAoQ2FsbEV4cHJlc3Npb24ucHJvdG90eXBlLnRvU3RyaW5n
KToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9DYWxsRnVuY3Rpb24uanM6IEFkZGVkLgorICAgICAg
ICAoY2FsbEZ1bmN0aW9uQnlSZWYpOgorICAgICAgICAoY2FsbEZ1bmN0aW9uKToKKyAgICAgICAg
KiBBcnJheUxhbmdSSS9DaGVjay5qczogQWRkZWQuCisgICAgICAgIChjaGVjayk6CisgICAgICAg
ICogQXJyYXlMYW5nUkkvQ2hlY2tlci5qczogQWRkZWQuCisgICAgICAgIChDaGVja2VyKToKKyAg
ICAgICAgKENoZWNrZXIucHJvdG90eXBlLnZpc2l0UHJvZ3JhbSk6CisgICAgICAgIChDaGVja2Vy
LnByb3RvdHlwZS52aXNpdFByb3RvY29sRGVjbC5Ob3RpY2VUeXBlVmFyaWFibGUucHJvdG90eXBl
LnZpc2l0VHlwZVJlZik6CisgICAgICAgIChDaGVja2VyLnByb3RvdHlwZS52aXNpdFByb3RvY29s
RGVjbC5Ob3RpY2VUeXBlVmFyaWFibGUucHJvdG90eXBlLnZpc2l0VmFyaWFibGVSZWYpOgorICAg
ICAgICAoQ2hlY2tlci5wcm90b3R5cGUudmlzaXRQcm90b2NvbERlY2wuTm90aWNlVHlwZVZhcmlh
YmxlKToKKyAgICAgICAgKENoZWNrZXIucHJvdG90eXBlLnZpc2l0UHJvdG9jb2xEZWNsLnNldCB0
aHJvdyk6CisgICAgICAgICogQXJyYXlMYW5nUkkvQ29tbWFFeHByZXNzaW9uLmpzOiBBZGRlZC4K
KyAgICAgICAgKENvbW1hRXhwcmVzc2lvbik6CisgICAgICAgIChDb21tYUV4cHJlc3Npb24ucHJv
dG90eXBlLmdldCBsaXN0KToKKyAgICAgICAgKENvbW1hRXhwcmVzc2lvbi5wcm90b3R5cGUudG9T
dHJpbmcpOgorICAgICAgICAqIEFycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanM6
IEFkZGVkLgorICAgICAgICAoQ29uc3RleHByVHlwZVBhcmFtZXRlcik6CisgICAgICAgIChDb25z
dGV4cHJUeXBlUGFyYW1ldGVyLnByb3RvdHlwZS5nZXQgbmFtZSk6CisgICAgICAgIChDb25zdGV4
cHJUeXBlUGFyYW1ldGVyLnByb3RvdHlwZS5nZXQgdHlwZSk6CisgICAgICAgIChDb25zdGV4cHJU
eXBlUGFyYW1ldGVyLnByb3RvdHlwZS5nZXQgaXNDb25zdGV4cHIpOgorICAgICAgICAoQ29uc3Rl
eHByVHlwZVBhcmFtZXRlci5wcm90b3R5cGUuZ2V0IGlzVW5pZmlhYmxlKToKKyAgICAgICAgKENv
bnN0ZXhwclR5cGVQYXJhbWV0ZXIucHJvdG90eXBlLnR5cGVWYXJpYWJsZVVuaWZ5KToKKyAgICAg
ICAgKENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIucHJvdG90eXBlLnVuaWZ5SW1wbCk6CisgICAgICAg
IChDb25zdGV4cHJUeXBlUGFyYW1ldGVyLnByb3RvdHlwZS52ZXJpZnlBc0FyZ3VtZW50KToKKyAg
ICAgICAgKENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIucHJvdG90eXBlLnZlcmlmeUFzUGFyYW1ldGVy
KToKKyAgICAgICAgKENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIucHJvdG90eXBlLnRvU3RyaW5nKToK
KyAgICAgICAgKiBBcnJheUxhbmdSSS9FQnVmZmVyLmpzOiBBZGRlZC4KKyAgICAgICAgKEVCdWZm
ZXIpOgorICAgICAgICAoRUJ1ZmZlci5nZXQgaW5kZXgpOgorICAgICAgICAqIEFycmF5TGFuZ1JJ
L0VCdWZmZXJCdWlsZGVyLmpzOiBBZGRlZC4KKyAgICAgICAgKEVCdWZmZXJCdWlsZGVyKToKKyAg
ICAgICAgKEVCdWZmZXJCdWlsZGVyLnByb3RvdHlwZS5fY3JlYXRlRVB0cik6CisgICAgICAgIChF
QnVmZmVyQnVpbGRlci5wcm90b3R5cGUudmlzaXRGdW5jUGFyYW1ldGVyKToKKyAgICAgICAgKiBB
cnJheUxhbmdSSS9FRmxvYXQuanM6IEFkZGVkLgorICAgICAgICAoRUZsb2F0KToKKyAgICAgICAg
KEVGbG9hdC5wcm90b3R5cGUuZ2V0IHZhbHVlKToKKyAgICAgICAgKEVGbG9hdC5wcm90b3R5cGUu
YWRkKToKKyAgICAgICAgKEVGbG9hdC5wcm90b3R5cGUudG9TdHJpbmcpOgorICAgICAgICAqIEFy
cmF5TGFuZ1JJL0VJbnQuanM6IEFkZGVkLgorICAgICAgICAoRUludCk6CisgICAgICAgIChFSW50
LnByb3RvdHlwZS5nZXQgdmFsdWUpOgorICAgICAgICAoRUludC5wcm90b3R5cGUuYWRkKToKKyAg
ICAgICAgKEVJbnQucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9F
UHRyLmpzOiBBZGRlZC4KKyAgICAgICAgKEVQdHIpOgorICAgICAgICAoRVB0ci5ib3gpOgorICAg
ICAgICAoRVB0ci5wcm90b3R5cGUuZ2V0IGJ1ZmZlcik6CisgICAgICAgIChFUHRyLnByb3RvdHlw
ZS5nZXQgb2Zmc2V0KToKKyAgICAgICAgKEVQdHIucHJvdG90eXBlLmxvYWRWYWx1ZSk6CisgICAg
ICAgIChFUHRyLnByb3RvdHlwZS5jb3B5RnJvbSk6CisgICAgICAgIChFUHRyLnByb3RvdHlwZS50
b1N0cmluZyk6CisgICAgICAgICogQXJyYXlMYW5nUkkvRVZhbHVlLmpzOiBBZGRlZC4KKyAgICAg
ICAgKEVWYWx1ZSk6CisgICAgICAgIChFVmFsdWUucHJvdG90eXBlLmdldCB0eXBlKToKKyAgICAg
ICAgKiBBcnJheUxhbmdSSS9FdmFsdWF0aW9uQ29tbW9uLmpzOiBBZGRlZC4KKyAgICAgICAgKiBB
cnJheUxhbmdSSS9FdmFsdWF0b3IuanM6IEFkZGVkLgorICAgICAgICAoRXZhbHVhdG9yKToKKyAg
ICAgICAgKEV2YWx1YXRvci5wcm90b3R5cGUudmlzaXRGdW5jdGlvbkJvZHkpOgorICAgICAgICAo
RXZhbHVhdG9yLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uTGlrZUJsb2NrKToKKyAgICAgICAgKEV2
YWx1YXRvci5wcm90b3R5cGUudmlzaXRSZXR1cm4pOgorICAgICAgICAoRXZhbHVhdG9yLnByb3Rv
dHlwZS52aXNpdENvbW1hRXhwcmVzc2lvbik6CisgICAgICAgIChFdmFsdWF0b3IucHJvdG90eXBl
LnZpc2l0VmFyaWFibGVSZWYpOgorICAgICAgICAoRXZhbHVhdG9yLnByb3RvdHlwZS52aXNpdElu
dExpdGVyYWwpOgorICAgICAgICAoRXZhbHVhdG9yLnByb3RvdHlwZS52aXNpdENhbGxFeHByZXNz
aW9uKToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzOiBBZGRlZC4KKyAgICAg
ICAgKEV4cHJlc3Npb24pOgorICAgICAgICAoRXhwcmVzc2lvbi5wcm90b3R5cGUuZ2V0IG9yaWdp
bik6CisgICAgICAgICogQXJyYXlMYW5nUkkvRmllbGQuanM6IEFkZGVkLgorICAgICAgICAoRmll
bGQpOgorICAgICAgICAoRmllbGQucHJvdG90eXBlLmdldCBvcmlnaW4pOgorICAgICAgICAoRmll
bGQucHJvdG90eXBlLmdldCBuYW1lKToKKyAgICAgICAgKEZpZWxkLnByb3RvdHlwZS5nZXQgdHlw
ZSk6CisgICAgICAgIChGaWVsZC5wcm90b3R5cGUudG9TdHJpbmcpOgorICAgICAgICAqIEFycmF5
TGFuZ1JJL0Z1bmMuanM6IEFkZGVkLgorICAgICAgICAoRnVuYyk6CisgICAgICAgIChGdW5jLnBy
b3RvdHlwZS5nZXQgbmFtZSk6CisgICAgICAgIChGdW5jLnByb3RvdHlwZS5nZXQgcmV0dXJuVHlw
ZSk6CisgICAgICAgIChGdW5jLnByb3RvdHlwZS5nZXQgdHlwZVBhcmFtZXRlcnMpOgorICAgICAg
ICAoRnVuYy5wcm90b3R5cGUuZ2V0IHBhcmFtZXRlcnMpOgorICAgICAgICAoRnVuYy5wcm90b3R5
cGUuZ2V0IHBhcmFtZXRlclR5cGVzKToKKyAgICAgICAgKEZ1bmMucHJvdG90eXBlLmdldCBraW5k
KToKKyAgICAgICAgKEZ1bmMucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKiBBcnJheUxh
bmdSSS9GdW5jRGVmLmpzOiBBZGRlZC4KKyAgICAgICAgKEZ1bmNEZWYpOgorICAgICAgICAoRnVu
Y0RlZi5wcm90b3R5cGUuZ2V0IG9yaWdpbik6CisgICAgICAgIChGdW5jRGVmLnByb3RvdHlwZS50
b1N0cmluZyk6CisgICAgICAgICogQXJyYXlMYW5nUkkvRnVuY0luc3RhbnRpYXRvci5qczogQWRk
ZWQuCisgICAgICAgIChGdW5jSW5zdGFudGlhdG9yKToKKyAgICAgICAgKEZ1bmNJbnN0YW50aWF0
b3IucHJvdG90eXBlLmdldFVuaXF1ZSk6CisgICAgICAgICogQXJyYXlMYW5nUkkvRnVuY1BhcmFt
ZXRlci5qczogQWRkZWQuCisgICAgICAgIChGdW5jUGFyYW1ldGVyKToKKyAgICAgICAgKEZ1bmNQ
YXJhbWV0ZXIucHJvdG90eXBlLmdldCBvcmlnaW4pOgorICAgICAgICAoRnVuY1BhcmFtZXRlci5w
cm90b3R5cGUuZ2V0IG5hbWUpOgorICAgICAgICAoRnVuY1BhcmFtZXRlci5wcm90b3R5cGUuZ2V0
IHR5cGUpOgorICAgICAgICAoRnVuY1BhcmFtZXRlci5wcm90b3R5cGUudG9TdHJpbmcpOgorICAg
ICAgICAqIEFycmF5TGFuZ1JJL0Z1bmNTaWduYXR1cmUuanM6IEFkZGVkLgorICAgICAgICAqIEFy
cmF5TGFuZ1JJL0Z1bmN0aW9uTGlrZUJsb2NrLmpzOiBBZGRlZC4KKyAgICAgICAgKEZ1bmN0aW9u
TGlrZUJsb2NrKToKKyAgICAgICAgKEZ1bmN0aW9uTGlrZUJsb2NrLnByb3RvdHlwZS5nZXQgb3Jp
Z2luKToKKyAgICAgICAgKEZ1bmN0aW9uTGlrZUJsb2NrLnByb3RvdHlwZS5nZXQgYXJndW1lbnRM
aXN0KToKKyAgICAgICAgKEZ1bmN0aW9uTGlrZUJsb2NrLnByb3RvdHlwZS5nZXQgcGFyYW1ldGVy
cyk6CisgICAgICAgIChGdW5jdGlvbkxpa2VCbG9jay5wcm90b3R5cGUuZ2V0IGJvZHkpOgorICAg
ICAgICAoRnVuY3Rpb25MaWtlQmxvY2sucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAgICAgKiBB
cnJheUxhbmdSSS9JbmxpbmUuanM6IEFkZGVkLgorICAgICAgICAoaW5saW5lKToKKyAgICAgICAg
KF9pbmxpbmVGdW5jdGlvbik6CisgICAgICAgIChyZXNvbHZlSW5saW5lZEZ1bmN0aW9uKToKKyAg
ICAgICAgKiBBcnJheUxhbmdSSS9JbmxpbmVyLmpzOiBBZGRlZC4KKyAgICAgICAgKElubGluZXIp
OgorICAgICAgICAoSW5saW5lci5wcm90b3R5cGUudmlzaXRDYWxsRXhwcmVzc2lvbik6CisgICAg
ICAgICogQXJyYXlMYW5nUkkvSW5zdGFudGlhdGVJbW1lZGlhdGVzLmpzOiBBZGRlZC4KKyAgICAg
ICAgKEluc3RhbnRpYXRlSW1tZWRpYXRlcy5wcm90b3R5cGUudmlzaXRUeXBlUmVmKToKKyAgICAg
ICAgKEluc3RhbnRpYXRlSW1tZWRpYXRlcy5wcm90b3R5cGUudmlzaXRSZWZlcmVuY2VUeXBlKToK
KyAgICAgICAgKEluc3RhbnRpYXRlSW1tZWRpYXRlcy5wcm90b3R5cGUudmlzaXRTdHJ1Y3RUeXBl
KToKKyAgICAgICAgKEluc3RhbnRpYXRlSW1tZWRpYXRlcy5wcm90b3R5cGUudmlzaXROYXRpdmVU
eXBlKToKKyAgICAgICAgKEluc3RhbnRpYXRlSW1tZWRpYXRlcy5wcm90b3R5cGUudmlzaXRUeXBl
VmFyaWFibGUpOgorICAgICAgICAoSW5zdGFudGlhdGVJbW1lZGlhdGVzKToKKyAgICAgICAgKiBB
cnJheUxhbmdSSS9JbnRMaXRlcmFsLmpzOiBBZGRlZC4KKyAgICAgICAgKEludExpdGVyYWwpOgor
ICAgICAgICAoSW50TGl0ZXJhbC5wcm90b3R5cGUuZ2V0IHZhbHVlKToKKyAgICAgICAgKEludExp
dGVyYWwucHJvdG90eXBlLmdldCBpc0NvbnN0ZXhwcik6CisgICAgICAgIChJbnRMaXRlcmFsLnBy
b3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgICogQXJyYXlMYW5nUkkvSW50cmluc2ljcy5qczog
QWRkZWQuCisgICAgICAgIChJbnRyaW5zaWNzKToKKyAgICAgICAgKEludHJpbnNpY3MucHJvdG90
eXBlLmFkZCk6CisgICAgICAgICogQXJyYXlMYW5nUkkvTGV4ZXIuanM6IEFkZGVkLgorICAgICAg
ICAoTGV4ZXIpOgorICAgICAgICAoTGV4ZXIucHJvdG90eXBlLmdldCBsaW5lTnVtYmVyKToKKyAg
ICAgICAgKExleGVyLnByb3RvdHlwZS5nZXQgb3JpZ2luKToKKyAgICAgICAgKExleGVyLnByb3Rv
dHlwZS5nZXQgb3JpZ2luU3RyaW5nKToKKyAgICAgICAgKExleGVyLnByb3RvdHlwZS5saW5lTnVt
YmVyRm9ySW5kZXgpOgorICAgICAgICAoTGV4ZXIucHJvdG90eXBlLmdldCBzdGF0ZSk6CisgICAg
ICAgIChMZXhlci5wcm90b3R5cGUuc2V0IHN0YXRlKToKKyAgICAgICAgKExleGVyLnByb3RvdHlw
ZS5uZXh0KToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9MZXhlclRva2VuLmpzOiBBZGRlZC4KKyAg
ICAgICAgKExleGVyVG9rZW4pOgorICAgICAgICAoTGV4ZXJUb2tlbi5wcm90b3R5cGUuZ2V0IGtp
bmQpOgorICAgICAgICAoTGV4ZXJUb2tlbi5wcm90b3R5cGUuZ2V0IHRleHQpOgorICAgICAgICAo
TGV4ZXJUb2tlbi5wcm90b3R5cGUuZ2V0IG9yaWdpbik6CisgICAgICAgIChMZXhlclRva2VuLnBy
b3RvdHlwZS5nZXQgaW5kZXgpOgorICAgICAgICAoTGV4ZXJUb2tlbi5wcm90b3R5cGUuZ2V0IGxp
bmVOdW1iZXIpOgorICAgICAgICAoTGV4ZXJUb2tlbi5wcm90b3R5cGUuZ2V0IG9yaWdpblN0cmlu
Zyk6CisgICAgICAgIChMZXhlclRva2VuLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgICog
QXJyYXlMYW5nUkkvTmFtZUNvbnRleHQuanM6IEFkZGVkLgorICAgICAgICAoaXNXaWxkY2FyZEtp
bmQpOgorICAgICAgICAoTmFtZUNvbnRleHQpOgorICAgICAgICAoTmFtZUNvbnRleHQucHJvdG90
eXBlLm1hcEZvcik6CisgICAgICAgIChOYW1lQ29udGV4dC5wcm90b3R5cGUuYWRkKToKKyAgICAg
ICAgKE5hbWVDb250ZXh0LmdldCBjdXJyZW50U3RhdGVtZW50KToKKyAgICAgICAgKE5hbWVDb250
ZXh0LmdldCBpbnRyaW5zaWNzKToKKyAgICAgICAgKE5hbWVDb250ZXh0LnNldCBwcm9ncmFtKToK
KyAgICAgICAgKE5hbWVDb250ZXh0LmdldCBwcm9ncmFtKToKKyAgICAgICAgKE5hbWVDb250ZXh0
LnByb3RvdHlwZS5nZXQgbGV0KToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9OYW1lUmVzb2x2ZXIu
anM6IEFkZGVkLgorICAgICAgICAoTmFtZVJlc29sdmVyKToKKyAgICAgICAgKE5hbWVSZXNvbHZl
ci5wcm90b3R5cGUudmlzaXRQcm9ncmFtKToKKyAgICAgICAgKE5hbWVSZXNvbHZlci5wcm90b3R5
cGUuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWlsZE5hbWVDb250ZXh0KToKKyAgICAgICAgKE5h
bWVSZXNvbHZlci5wcm90b3R5cGUudmlzaXRGdW5jKToKKyAgICAgICAgKE5hbWVSZXNvbHZlci5w
cm90b3R5cGUudmlzaXRGdW5jRGVmKToKKyAgICAgICAgKE5hbWVSZXNvbHZlci5wcm90b3R5cGUu
dmlzaXRCbG9jayk6CisgICAgICAgIChOYW1lUmVzb2x2ZXIucHJvdG90eXBlLnZpc2l0UHJvdG9j
b2xEZWNsKToKKyAgICAgICAgKE5hbWVSZXNvbHZlci5wcm90b3R5cGUudmlzaXRUeXBlRGVmKToK
KyAgICAgICAgKE5hbWVSZXNvbHZlci5wcm90b3R5cGUudmlzaXRTdHJ1Y3RUeXBlKToKKyAgICAg
ICAgKE5hbWVSZXNvbHZlci5wcm90b3R5cGUuX3Jlc29sdmVUeXBlQXJndW1lbnRzKToKKyAgICAg
ICAgKE5hbWVSZXNvbHZlci5wcm90b3R5cGUudmlzaXRUeXBlUmVmKToKKyAgICAgICAgKE5hbWVS
ZXNvbHZlci5wcm90b3R5cGUudmlzaXRSZWZlcmVuY2VUeXBlKToKKyAgICAgICAgKE5hbWVSZXNv
bHZlci5wcm90b3R5cGUudmlzaXRWYXJpYWJsZVJlZik6CisgICAgICAgIChOYW1lUmVzb2x2ZXIu
cHJvdG90eXBlLnZpc2l0UmV0dXJuKToKKyAgICAgICAgKE5hbWVSZXNvbHZlci5wcm90b3R5cGUu
dmlzaXRDYWxsRXhwcmVzc2lvbik6CisgICAgICAgICogQXJyYXlMYW5nUkkvTmF0aXZlRnVuYy5q
czogQWRkZWQuCisgICAgICAgIChOYXRpdmVGdW5jKToKKyAgICAgICAgKE5hdGl2ZUZ1bmMucHJv
dG90eXBlLmdldCBvcmlnaW4pOgorICAgICAgICAoTmF0aXZlRnVuYy5wcm90b3R5cGUuZ2V0IGlz
TmF0aXZlKToKKyAgICAgICAgKE5hdGl2ZUZ1bmMucHJvdG90eXBlLnRvU3RyaW5nKToKKyAgICAg
ICAgKiBBcnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzOiBBZGRlZC4KKyAgICAgICAgKE5hdGl2ZVR5
cGUpOgorICAgICAgICAoTmF0aXZlVHlwZS5wcm90b3R5cGUuZ2V0IG9yaWdpbik6CisgICAgICAg
IChOYXRpdmVUeXBlLnByb3RvdHlwZS5nZXQgbmFtZSk6CisgICAgICAgIChOYXRpdmVUeXBlLnBy
b3RvdHlwZS5nZXQgaXNQcmltaXRpdmUpOgorICAgICAgICAoTmF0aXZlVHlwZS5wcm90b3R5cGUu
Z2V0IHR5cGVQYXJhbWV0ZXJzKToKKyAgICAgICAgKE5hdGl2ZVR5cGUucHJvdG90eXBlLmdldCBp
c05hdGl2ZSk6CisgICAgICAgIChOYXRpdmVUeXBlLnByb3RvdHlwZS5pbnN0YW50aWF0ZSk6Cisg
ICAgICAgIChOYXRpdmVUeXBlLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgICogQXJyYXlM
YW5nUkkvTmF0aXZlVHlwZUluc3RhbmNlLmpzOiBBZGRlZC4KKyAgICAgICAgKE5hdGl2ZVR5cGVJ
bnN0YW5jZSk6CisgICAgICAgIChOYXRpdmVUeXBlSW5zdGFuY2UucHJvdG90eXBlLmdldCB0eXBl
KToKKyAgICAgICAgKE5hdGl2ZVR5cGVJbnN0YW5jZS5wcm90b3R5cGUuZ2V0IHR5cGVBcmd1bWVu
dHMpOgorICAgICAgICAoTmF0aXZlVHlwZUluc3RhbmNlLnByb3RvdHlwZS5nZXQgaXNQcmltaXRp
dmUpOgorICAgICAgICAoTmF0aXZlVHlwZUluc3RhbmNlLnByb3RvdHlwZS5nZXQgaXNOYXRpdmUp
OgorICAgICAgICAoTmF0aXZlVHlwZUluc3RhbmNlLnByb3RvdHlwZS51bmlmeUltcGwpOgorICAg
ICAgICAoTmF0aXZlVHlwZUluc3RhbmNlLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAgICAgICog
QXJyYXlMYW5nUkkvTm9kZS5qczogQWRkZWQuCisgICAgICAgIChOb2RlLnByb3RvdHlwZS52aXNp
dCk6CisgICAgICAgIChOb2RlLnVuaWZ5KToKKyAgICAgICAgKE5vZGUucHJvdG90eXBlLnVuaWZ5
SW1wbCk6CisgICAgICAgIChOb2RlLnByb3RvdHlwZS50eXBlVmFyaWFibGVVbmlmeSk6CisgICAg
ICAgIChOb2RlLnByb3RvdHlwZS5nZXQgdW5pZnlOb2RlKToKKyAgICAgICAgKE5vZGUucHJvdG90
eXBlLmdldCBpc1VuaWZpYWJsZSk6CisgICAgICAgIChOb2RlLnByb3RvdHlwZS5nZXQgaXNOYXRp
dmUpOgorICAgICAgICAoTm9kZS5wcm90b3R5cGUuZXF1YWxzKToKKyAgICAgICAgKE5vZGUucHJv
dG90eXBlLnN1YnN0aXR1dGUpOgorICAgICAgICAoTm9kZS5wcm90b3R5cGUuc3Vic3RpdHV0ZVRv
VW5pZmljYXRpb24pOgorICAgICAgICAoTm9kZSk6CisgICAgICAgICogQXJyYXlMYW5nUkkvTnVs
bFR5cGUuanM6IEFkZGVkLgorICAgICAgICAoTnVsbFR5cGUpOgorICAgICAgICAqIEFycmF5TGFu
Z1JJL1BhcnNlLmpzOiBBZGRlZC4KKyAgICAgICAgKGdlbmVyaWNDb25zdW1lKToKKyAgICAgICAg
KGNvbnN1bWUpOgorICAgICAgICAoZ2VuZXJpY1Rlc3QpOgorICAgICAgICAodGVzdCk6CisgICAg
ICAgICh0cnlDb25zdW1lS2luZCk6CisgICAgICAgIChwYXJzZVByb3RvY29sUmVmKToKKyAgICAg
ICAgKGNvbnN1bWVFbmRPZlR5cGVBcmdzKToKKyAgICAgICAgKHBhcnNlVHlwZVBhcmFtZXRlcnMp
OgorICAgICAgICAocGFyc2VUZXJtKToKKyAgICAgICAgKHBhcnNlQ29uc3RleHByKToKKyAgICAg
ICAgKHBhcnNlVHlwZUFyZ3VtZW50cyk6CisgICAgICAgIChwYXJzZVR5cGUuZ2V0QWRkcmVzc1Nw
YWNlKToKKyAgICAgICAgKHBhcnNlVHlwZSk6CisgICAgICAgIChwYXJzZVR5cGVEZWYpOgorICAg
ICAgICAocGFyc2VOYXRpdmUpOgorICAgICAgICAoZ2VuZXJpY1BhcnNlTGVmdCk6CisgICAgICAg
IChwYXJzZUxlZnRPcGVyYXRvckNhbGwpOgorICAgICAgICAocGFyc2VQb3NzaWJsZVN1ZmZpeCk6
CisgICAgICAgIChwYXJzZVBvc3NpYmxlUHJlZml4KToKKyAgICAgICAgKHBhcnNlUG9zc2libGVQ
cm9kdWN0KToKKyAgICAgICAgKHBhcnNlUG9zc2libGVTdW0pOgorICAgICAgICAocGFyc2VQb3Nz
aWJsZVNoaWZ0KToKKyAgICAgICAgKHBhcnNlUG9zc2libGVSZWxhdGlvbmFsSW5lcXVhbGl0eSk6
CisgICAgICAgIChwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEVxdWFsaXR5KToKKyAgICAgICAgKHBh
cnNlUG9zc2libGVCaXR3aXNlWG9yKToKKyAgICAgICAgKHBhcnNlUG9zc2libGVCaXR3aXNlT3Ip
OgorICAgICAgICAocGFyc2VMZWZ0TG9naWNhbEV4cHJlc3Npb24pOgorICAgICAgICAocGFyc2VQ
b3NzaWJsZUxvZ2ljYWxPcik6CisgICAgICAgIChwYXJzZVBvc3NpYmxlVGVybmFyeUNvbmRpdGlv
bmFsKToKKyAgICAgICAgKHBhcnNlUG9zc2libGVBc3NpZ25tZW50KToKKyAgICAgICAgKHBhcnNl
QXNzaWdubWVudCk6CisgICAgICAgIChwYXJzZUVmZmVjdGZ1bEV4cHJlc3Npb24pOgorICAgICAg
ICAoZ2VuZXJpY1BhcnNlQ29tbWFFeHByZXNzaW9uKToKKyAgICAgICAgKHBhcnNlQ29tbWFFeHBy
ZXNzaW9uKToKKyAgICAgICAgKHBhcnNlRXhwcmVzc2lvbik6CisgICAgICAgIChwYXJzZUVmZmVj
dGZ1bFN0YXRlbWVudCk6CisgICAgICAgIChwYXJzZVJldHVybik6CisgICAgICAgIChwYXJzZVZh
cmlhYmxlRGVjbHMpOgorICAgICAgICAocGFyc2VTdGF0ZW1lbnQpOgorICAgICAgICAocGFyc2VC
bG9jayk6CisgICAgICAgIChwYXJzZVBhcmFtZXRlcik6CisgICAgICAgIChwYXJzZUZ1bmNOYW1l
KToKKyAgICAgICAgKHBhcnNlRnVuY0RlZik6CisgICAgICAgIChwYXJzZSk6CisgICAgICAgICog
QXJyYXlMYW5nUkkvUHJlcGFyZS5qczogQWRkZWQuCisgICAgICAgIChwcmVwYXJlKToKKyAgICAg
ICAgKiBBcnJheUxhbmdSSS9Qcm9ncmFtLmpzOiBBZGRlZC4KKyAgICAgICAgKFByb2dyYW0pOgor
ICAgICAgICAoUHJvZ3JhbS5wcm90b3R5cGUuZ2V0IHRvcExldmVsU3RhdGVtZW50cyk6CisgICAg
ICAgIChQcm9ncmFtLnByb3RvdHlwZS5nZXQgZnVuY3Rpb25zKToKKyAgICAgICAgKFByb2dyYW0u
cHJvdG90eXBlLmdldCB0eXBlcyk6CisgICAgICAgIChQcm9ncmFtLnByb3RvdHlwZS5nZXQgZnVu
Y0luc3RhbnRpYXRvcik6CisgICAgICAgIChQcm9ncmFtLnByb3RvdHlwZS5hZGQpOgorICAgICAg
ICAoUHJvZ3JhbS5wcm90b3R5cGUucmVzb2x2ZUZ1bmNPdmVybG9hZCk6CisgICAgICAgIChQcm9n
cmFtLnByb3RvdHlwZS5nZXQgbmFtZUNvbnRleHQpOgorICAgICAgICAoUHJvZ3JhbS5wcm90b3R5
cGUudG9TdHJpbmcpOgorICAgICAgICAqIEFycmF5TGFuZ1JJL1Byb3RvY29sLmpzOiBBZGRlZC4K
KyAgICAgICAgKFByb3RvY29sKToKKyAgICAgICAgKFByb3RvY29sLnByb3RvdHlwZS5nZXQgb3Jp
Z2luKToKKyAgICAgICAgKFByb3RvY29sLnByb3RvdHlwZS5nZXQgbmFtZSk6CisgICAgICAgIChQ
cm90b2NvbC5wcm90b3R5cGUuZ2V0IGtpbmQpOgorICAgICAgICAoUHJvdG9jb2wucHJvdG90eXBl
LnRvU3RyaW5nKToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9Qcm90b2NvbERlY2wuanM6IEFkZGVk
LgorICAgICAgICAoUHJvdG9jb2xEZWNsKToKKyAgICAgICAgKFByb3RvY29sRGVjbC5wcm90b3R5
cGUuYWRkU2lnbmF0dXJlKToKKyAgICAgICAgKFByb3RvY29sRGVjbC5wcm90b3R5cGUuZ2V0IHNp
Z25hdHVyZXMpOgorICAgICAgICAoUHJvdG9jb2xEZWNsLnByb3RvdHlwZS5zaWduYXR1cmVzQnlO
YW1lKToKKyAgICAgICAgKFByb3RvY29sRGVjbC5wcm90b3R5cGUuZ2V0IHR5cGVWYXJpYWJsZSk6
CisgICAgICAgIChQcm90b2NvbERlY2wucHJvdG90eXBlLnNpZ25hdHVyZXNCeU5hbWVXaXRoVHlw
ZVZhcmlhYmxlKToKKyAgICAgICAgKFByb3RvY29sRGVjbC5wcm90b3R5cGUuaW5oZXJpdHMpOgor
ICAgICAgICAoUHJvdG9jb2xEZWNsLnByb3RvdHlwZS5oYXNIZWlyKToKKyAgICAgICAgKFByb3Rv
Y29sRGVjbC5wcm90b3R5cGUudG9TdHJpbmcpOgorICAgICAgICAqIEFycmF5TGFuZ1JJL1Byb3Rv
Y29sUmVmLmpzOiBBZGRlZC4KKyAgICAgICAgKFByb3RvY29sUmVmKToKKyAgICAgICAgKFByb3Rv
Y29sUmVmLnByb3RvdHlwZS5pbmhlcml0cyk6CisgICAgICAgIChQcm90b2NvbFJlZi5wcm90b3R5
cGUuaGFzSGVpcik6CisgICAgICAgICogQXJyYXlMYW5nUkkvUHRyVHlwZS5qczogQWRkZWQuCisg
ICAgICAgIChQdHJUeXBlLnByb3RvdHlwZS51bmlmeUltcGwpOgorICAgICAgICAoUHRyVHlwZS5w
cm90b3R5cGUudG9TdHJpbmcpOgorICAgICAgICAoUHRyVHlwZSk6CisgICAgICAgICogQXJyYXlM
YW5nUkkvUmVmZXJlbmNlVHlwZS5qczogQWRkZWQuCisgICAgICAgIChSZWZlcmVuY2VUeXBlKToK
KyAgICAgICAgKFJlZmVyZW5jZVR5cGUucHJvdG90eXBlLmdldCBvcmlnaW4pOgorICAgICAgICAo
UmVmZXJlbmNlVHlwZS5wcm90b3R5cGUuZ2V0IGFkZHJlc3NTcGFjZSk6CisgICAgICAgIChSZWZl
cmVuY2VUeXBlLnByb3RvdHlwZS5nZXQgZWxlbWVudFR5cGUpOgorICAgICAgICAoUmVmZXJlbmNl
VHlwZS5wcm90b3R5cGUuZ2V0IGlzUHJpbWl0aXZlKToKKyAgICAgICAgKFJlZmVyZW5jZVR5cGUu
cHJvdG90eXBlLmdldCBzaXplKToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9SZXNvbHZlTmFtZXMu
anM6IEFkZGVkLgorICAgICAgICAocmVzb2x2ZU5hbWVzKToKKyAgICAgICAgKiBBcnJheUxhbmdS
SS9SZXNvbHZlT3ZlcmxvYWRJbXBsLmpzOiBBZGRlZC4KKyAgICAgICAgKHJlc29sdmVPdmVybG9h
ZEltcGwpOgorICAgICAgICAqIEFycmF5TGFuZ1JJL1Jlc29sdmVUeXBlRGVmcy5qczogQWRkZWQu
CisgICAgICAgIChyZXNvbHZlVHlwZURlZnMpOgorICAgICAgICAqIEFycmF5TGFuZ1JJL1JldHVy
bi5qczogQWRkZWQuCisgICAgICAgIChSZXR1cm4pOgorICAgICAgICAoUmV0dXJuLnByb3RvdHlw
ZS5nZXQgb3JpZ2luKToKKyAgICAgICAgKFJldHVybi5wcm90b3R5cGUuZ2V0IHZhbHVlKToKKyAg
ICAgICAgKFJldHVybi5wcm90b3R5cGUudG9TdHJpbmcpOgorICAgICAgICAqIEFycmF5TGFuZ1JJ
L1JldHVybkV4Y2VwdGlvbi5qczogQWRkZWQuCisgICAgICAgIChSZXR1cm5FeGNlcHRpb24pOgor
ICAgICAgICAoUmV0dXJuRXhjZXB0aW9uLnByb3RvdHlwZS5nZXQgdmFsdWUpOgorICAgICAgICAq
IEFycmF5TGFuZ1JJL1Jld3JpdGVyLmpzOiBBZGRlZC4KKyAgICAgICAgKFJld3JpdGVyKToKKyAg
ICAgICAgKFJld3JpdGVyLnByb3RvdHlwZS5fbWFwKToKKyAgICAgICAgKFJld3JpdGVyLnByb3Rv
dHlwZS5fZ2V0TWFwcGluZyk6CisgICAgICAgIChSZXdyaXRlci5wcm90b3R5cGUudmlzaXRGdW5j
KToKKyAgICAgICAgKFJld3JpdGVyLnByb3RvdHlwZS52aXNpdEZ1bmNQYXJhbWV0ZXIpOgorICAg
ICAgICAoUmV3cml0ZXIucHJvdG90eXBlLnZpc2l0QmxvY2spOgorICAgICAgICAoUmV3cml0ZXIu
cHJvdG90eXBlLnZpc2l0Q29tbWFFeHByZXNzaW9uKToKKyAgICAgICAgKFJld3JpdGVyLnByb3Rv
dHlwZS52aXNpdFByb3RvY29sUmVmKToKKyAgICAgICAgKFJld3JpdGVyLnByb3RvdHlwZS52aXNp
dFR5cGVSZWYpOgorICAgICAgICAoUmV3cml0ZXIucHJvdG90eXBlLnZpc2l0VHlwZVZhcmlhYmxl
KToKKyAgICAgICAgKFJld3JpdGVyLnByb3RvdHlwZS52aXNpdENvbnN0ZXhwclR5cGVQYXJhbWV0
ZXIpOgorICAgICAgICAoUmV3cml0ZXIucHJvdG90eXBlLnZpc2l0RmllbGQpOgorICAgICAgICAo
UmV3cml0ZXIucHJvdG90eXBlLnZpc2l0UmVmZXJlbmNlVHlwZSk6CisgICAgICAgIChSZXdyaXRl
ci52aXNpdFB0clR5cGUpOgorICAgICAgICAoUmV3cml0ZXIucHJvdG90eXBlLnZpc2l0QXJyYXlS
ZWZUeXBlKToKKyAgICAgICAgKFJld3JpdGVyLnByb3RvdHlwZS52aXNpdEFycmF5VHlwZSk6Cisg
ICAgICAgIChSZXdyaXRlci5wcm90b3R5cGUudmlzaXRBc3NpZ25tZW50KToKKyAgICAgICAgKFJl
d3JpdGVyLnByb3RvdHlwZS52aXNpdFZhcmlhYmxlUmVmKToKKyAgICAgICAgKFJld3JpdGVyLnBy
b3RvdHlwZS52aXNpdFJldHVybik6CisgICAgICAgIChSZXdyaXRlci5wcm90b3R5cGUudmlzaXRJ
bnRMaXRlcmFsKToKKyAgICAgICAgKFJld3JpdGVyLnByb3RvdHlwZS52aXNpdENhbGxFeHByZXNz
aW9uKToKKyAgICAgICAgKFJld3JpdGVyLnByb3RvdHlwZS52aXNpdEZ1bmN0aW9uTGlrZUJsb2Nr
KToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9TdGFuZGFyZExpYnJhcnkuanM6IEFkZGVkLgorICAg
ICAgICAqIEFycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanM6IEFkZGVkLgorICAgICAgICAoU3RydWN0
VHlwZSk6CisgICAgICAgIChTdHJ1Y3RUeXBlLnByb3RvdHlwZS5hZGQpOgorICAgICAgICAoU3Ry
dWN0VHlwZS5wcm90b3R5cGUuZ2V0IG5hbWUpOgorICAgICAgICAoU3RydWN0VHlwZS5wcm90b3R5
cGUuZ2V0IHR5cGVQYXJhbWV0ZXJzKToKKyAgICAgICAgKFN0cnVjdFR5cGUucHJvdG90eXBlLmdl
dCBmaWVsZE5hbWVzKToKKyAgICAgICAgKFN0cnVjdFR5cGUucHJvdG90eXBlLmZpZWxkQnlOYW1l
KToKKyAgICAgICAgKFN0cnVjdFR5cGUucHJvdG90eXBlLmdldCBmaWVsZHMpOgorICAgICAgICAo
U3RydWN0VHlwZS5wcm90b3R5cGUuZ2V0IGZpZWxkTWFwKToKKyAgICAgICAgKFN0cnVjdFR5cGUu
cHJvdG90eXBlLmdldCBpc1ByaW1pdGl2ZSk6CisgICAgICAgIChTdHJ1Y3RUeXBlLnByb3RvdHlw
ZS5pbnN0YW50aWF0ZSk6CisgICAgICAgIChTdHJ1Y3RUeXBlLnByb3RvdHlwZS50b1N0cmluZyk6
CisgICAgICAgICogQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzOiBBZGRlZC4KKyAgICAgICAg
KFN1YnN0aXR1dGlvbik6CisgICAgICAgIChTdWJzdGl0dXRpb24ubWFwcGluZyk6CisgICAgICAg
IChTdWJzdGl0dXRpb24ucHJvdG90eXBlLnZpc2l0VHlwZVJlZik6CisgICAgICAgIChTdWJzdGl0
dXRpb24ucHJvdG90eXBlLnZpc2l0VmFyaWFibGVSZWYpOgorICAgICAgICAqIEFycmF5TGFuZ1JJ
L1N1ZmZpeENhbGxBc3NpZ25tZW50LmpzOiBBZGRlZC4KKyAgICAgICAgKFN1ZmZpeENhbGxBc3Np
Z25tZW50KToKKyAgICAgICAgKFN1ZmZpeENhbGxBc3NpZ25tZW50LnByb3RvdHlwZS5nZXQgbmFt
ZSk6CisgICAgICAgIChTdWZmaXhDYWxsQXNzaWdubWVudC5wcm90b3R5cGUuZ2V0IGxocyk6Cisg
ICAgICAgIChTdWZmaXhDYWxsQXNzaWdubWVudC5wcm90b3R5cGUudG9TdHJpbmcpOgorICAgICAg
ICAqIEFycmF5TGFuZ1JJL1Rlc3QuanM6IEFkZGVkLgorICAgICAgICAobG9hZCk6CisgICAgICAg
ICogQXJyYXlMYW5nUkkvVHlwZS5qczogQWRkZWQuCisgICAgICAgIChUeXBlLnByb3RvdHlwZS5n
ZXQgdHlwZVBhcmFtZXRlcnMpOgorICAgICAgICAoVHlwZS5wcm90b3R5cGUuZ2V0IGtpbmQpOgor
ICAgICAgICAoVHlwZS5wcm90b3R5cGUuaW5oZXJpdHMpOgorICAgICAgICAoVHlwZS5wcm90b3R5
cGUuZ2V0IGluc3RhbnRpYXRlZFR5cGUpOgorICAgICAgICAoVHlwZSk6CisgICAgICAgICogQXJy
YXlMYW5nUkkvVHlwZURlZi5qczogQWRkZWQuCisgICAgICAgIChUeXBlRGVmKToKKyAgICAgICAg
KFR5cGVEZWYucHJvdG90eXBlLmdldCBvcmlnaW4pOgorICAgICAgICAoVHlwZURlZi5wcm90b3R5
cGUuZ2V0IG5hbWUpOgorICAgICAgICAoVHlwZURlZi5wcm90b3R5cGUuZ2V0IHR5cGVQYXJhbWV0
ZXJzKToKKyAgICAgICAgKFR5cGVEZWYucHJvdG90eXBlLmdldCB0eXBlKToKKyAgICAgICAgKiBB
cnJheUxhbmdSSS9UeXBlRGVmUmVzb2x2ZXIuanM6IEFkZGVkLgorICAgICAgICAoVHlwZURlZlJl
c29sdmVyKToKKyAgICAgICAgKFR5cGVEZWZSZXNvbHZlci5wcm90b3R5cGUudmlzaXRUeXBlUmVm
KToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9UeXBlT3JWYXJpYWJsZVJlZi5qczogQWRkZWQuCisg
ICAgICAgIChUeXBlT3JWYXJpYWJsZVJlZik6CisgICAgICAgIChUeXBlT3JWYXJpYWJsZVJlZi5w
cm90b3R5cGUuZ2V0IG9yaWdpbik6CisgICAgICAgIChUeXBlT3JWYXJpYWJsZVJlZi5wcm90b3R5
cGUuZ2V0IG5hbWUpOgorICAgICAgICAoVHlwZU9yVmFyaWFibGVSZWYucHJvdG90eXBlLnRvU3Ry
aW5nKToKKyAgICAgICAgKiBBcnJheUxhbmdSSS9UeXBlUmVmLmpzOiBBZGRlZC4KKyAgICAgICAg
KFR5cGVSZWYpOgorICAgICAgICAoVHlwZVJlZi53cmFwKToKKyAgICAgICAgKFR5cGVSZWYucHJv
dG90eXBlLmdldCBvcmlnaW4pOgorICAgICAgICAoVHlwZVJlZi5wcm90b3R5cGUuZ2V0IG5hbWUp
OgorICAgICAgICAoVHlwZVJlZi5wcm90b3R5cGUuZ2V0IHR5cGVBcmd1bWVudHMpOgorICAgICAg
ICAoVHlwZVJlZi5wcm90b3R5cGUuZ2V0IGlzUHJpbWl0aXZlKToKKyAgICAgICAgKFR5cGVSZWYu
cHJvdG90eXBlLmdldCBpbnN0YW50aWF0ZWRUeXBlKToKKyAgICAgICAgKFR5cGVSZWYucHJvdG90
eXBlLmdldCB1bmlmeU5vZGUpOgorICAgICAgICAoVHlwZVJlZi5wcm90b3R5cGUucG9wdWxhdGVE
ZWZhdWx0VmFsdWUpOgorICAgICAgICAoVHlwZVJlZi5wcm90b3R5cGUuZ2V0IHNpemUpOgorICAg
ICAgICAoVHlwZVJlZi5wcm90b3R5cGUuc2V0VHlwZUFuZEFyZ3VtZW50cyk6CisgICAgICAgIChU
eXBlUmVmLnByb3RvdHlwZS51bmlmeUltcGwpOgorICAgICAgICAoVHlwZVJlZi5wcm90b3R5cGUu
dG9TdHJpbmcpOgorICAgICAgICAqIEFycmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qczogQWRkZWQu
CisgICAgICAgIChUeXBlVmFyaWFibGUpOgorICAgICAgICAoVHlwZVZhcmlhYmxlLnByb3RvdHlw
ZS5nZXQgbmFtZSk6CisgICAgICAgIChUeXBlVmFyaWFibGUucHJvdG90eXBlLmdldCBwcm90b2Nv
bCk6CisgICAgICAgIChUeXBlVmFyaWFibGUucHJvdG90eXBlLmdldCBpc1ByaW1pdGl2ZSk6Cisg
ICAgICAgIChUeXBlVmFyaWFibGUucHJvdG90eXBlLmdldCBpc1VuaWZpYWJsZSk6CisgICAgICAg
IChUeXBlVmFyaWFibGUucHJvdG90eXBlLmluaGVyaXRzKToKKyAgICAgICAgKFR5cGVWYXJpYWJs
ZS5wcm90b3R5cGUudHlwZVZhcmlhYmxlVW5pZnkpOgorICAgICAgICAoVHlwZVZhcmlhYmxlLnBy
b3RvdHlwZS51bmlmeUltcGwpOgorICAgICAgICAoVHlwZVZhcmlhYmxlLnByb3RvdHlwZS52ZXJp
ZnlBc0FyZ3VtZW50KToKKyAgICAgICAgKFR5cGVWYXJpYWJsZS5wcm90b3R5cGUudmVyaWZ5QXNQ
YXJhbWV0ZXIpOgorICAgICAgICAoVHlwZVZhcmlhYmxlLnByb3RvdHlwZS50b1N0cmluZyk6Cisg
ICAgICAgICogQXJyYXlMYW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzOiBBZGRlZC4KKyAgICAg
ICAgKFVuaWZpY2F0aW9uQ29udGV4dCk6CisgICAgICAgIChVbmlmaWNhdGlvbkNvbnRleHQucHJv
dG90eXBlLnVuaW9uKToKKyAgICAgICAgKFVuaWZpY2F0aW9uQ29udGV4dC5wcm90b3R5cGUuZmlu
ZCk6CisgICAgICAgIChVbmlmaWNhdGlvbkNvbnRleHQucHJvdG90eXBlLmdldCBub2Rlcyk6Cisg
ICAgICAgIChVbmlmaWNhdGlvbkNvbnRleHQucHJvdG90eXBlLnZlcmlmeSk6CisgICAgICAgIChV
bmlmaWNhdGlvbkNvbnRleHQucHJvdG90eXBlLmlzVW51bmlmaWVkKToKKyAgICAgICAgKiBBcnJh
eUxhbmdSSS9WYWx1ZS5qczogQWRkZWQuCisgICAgICAgIChWYWx1ZS5wcm90b3R5cGUuZ2V0IGtp
bmQpOgorICAgICAgICAoVmFsdWUucHJvdG90eXBlLmdldCBpc0NvbnN0ZXhwcik6CisgICAgICAg
IChWYWx1ZSk6CisgICAgICAgICogQXJyYXlMYW5nUkkvVmFyaWFibGVEZWNsLmpzOiBBZGRlZC4K
KyAgICAgICAgKFZhcmlhYmxlRGVjbCk6CisgICAgICAgIChWYXJpYWJsZURlY2wucHJvdG90eXBl
LmdldCBvcmlnaW4pOgorICAgICAgICAoVmFyaWFibGVEZWNsLnByb3RvdHlwZS5nZXQgbmFtZSk6
CisgICAgICAgIChWYXJpYWJsZURlY2wucHJvdG90eXBlLmdldCB0eXBlKToKKyAgICAgICAgKFZh
cmlhYmxlRGVjbC5wcm90b3R5cGUuZ2V0IGluaXRpYWxpemVyKToKKyAgICAgICAgKFZhcmlhYmxl
RGVjbC5wcm90b3R5cGUudG9TdHJpbmcpOgorICAgICAgICAqIEFycmF5TGFuZ1JJL1ZhcmlhYmxl
UmVmLmpzOiBBZGRlZC4KKyAgICAgICAgKFZhcmlhYmxlUmVmKToKKyAgICAgICAgKFZhcmlhYmxl
UmVmLnByb3RvdHlwZS5nZXQgbmFtZSk6CisgICAgICAgIChWYXJpYWJsZVJlZi5wcm90b3R5cGUu
Z2V0IGlzQ29uc3RleHByKToKKyAgICAgICAgKFZhcmlhYmxlUmVmLnByb3RvdHlwZS5nZXQgdW5p
ZnlOb2RlKToKKyAgICAgICAgKFZhcmlhYmxlUmVmLnByb3RvdHlwZS50b1N0cmluZyk6CisgICAg
ICAgICogQXJyYXlMYW5nUkkvVmlzaXRpbmdTZXQuanM6IEFkZGVkLgorICAgICAgICAoVmlzaXRp
bmdTZXQpOgorICAgICAgICAoVmlzaXRpbmdTZXQucHJvdG90eXBlLmRvVmlzaXQpOgorICAgICAg
ICAqIEFycmF5TGFuZ1JJL1Zpc2l0b3IuanM6IEFkZGVkLgorICAgICAgICAoVmlzaXRvci5wcm90
b3R5cGUudmlzaXRQcm9ncmFtKToKKyAgICAgICAgKFZpc2l0b3IucHJvdG90eXBlLnZpc2l0RnVu
Yyk6CisgICAgICAgIChWaXNpdG9yLnByb3RvdHlwZS52aXNpdEZ1bmNQYXJhbWV0ZXIpOgorICAg
ICAgICAoVmlzaXRvci5wcm90b3R5cGUudmlzaXRGdW5jRGVmKToKKyAgICAgICAgKFZpc2l0b3Iu
cHJvdG90eXBlLnZpc2l0TmF0aXZlRnVuYyk6CisgICAgICAgIChWaXNpdG9yLnByb3RvdHlwZS52
aXNpdEJsb2NrKToKKyAgICAgICAgKFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q29tbWFFeHByZXNz
aW9uKToKKyAgICAgICAgKFZpc2l0b3IucHJvdG90eXBlLnZpc2l0UHJvdG9jb2xSZWYpOgorICAg
ICAgICAoVmlzaXRvci5wcm90b3R5cGUudmlzaXRQcm90b2NvbERlY2wpOgorICAgICAgICAoVmlz
aXRvci5wcm90b3R5cGUudmlzaXRUeXBlUmVmKToKKyAgICAgICAgKFZpc2l0b3IucHJvdG90eXBl
LnZpc2l0TmF0aXZlVHlwZSk6CisgICAgICAgIChWaXNpdG9yLnByb3RvdHlwZS52aXNpdFR5cGVE
ZWYpOgorICAgICAgICAoVmlzaXRvci5wcm90b3R5cGUudmlzaXRTdHJ1Y3RUeXBlKToKKyAgICAg
ICAgKFZpc2l0b3IucHJvdG90eXBlLnZpc2l0VHlwZVZhcmlhYmxlKToKKyAgICAgICAgKFZpc2l0
b3IucHJvdG90eXBlLnZpc2l0Q29uc3RleHByVHlwZVBhcmFtZXRlcik6CisgICAgICAgIChWaXNp
dG9yLnByb3RvdHlwZS52aXNpdEZpZWxkKToKKyAgICAgICAgKFZpc2l0b3IucHJvdG90eXBlLnZp
c2l0RWxlbWVudGFsVHlwZSk6CisgICAgICAgIChWaXNpdG9yLnByb3RvdHlwZS52aXNpdFB0clR5
cGUpOgorICAgICAgICAoVmlzaXRvci5wcm90b3R5cGUudmlzaXRBcnJheVJlZlR5cGUpOgorICAg
ICAgICAoVmlzaXRvci5wcm90b3R5cGUudmlzaXRBcnJheVR5cGUpOgorICAgICAgICAoVmlzaXRv
ci5wcm90b3R5cGUudmlzaXRBc3NpZ25tZW50KToKKyAgICAgICAgKFZpc2l0b3IucHJvdG90eXBl
LnZpc2l0VmFyaWFibGVSZWYpOgorICAgICAgICAoVmlzaXRvci5wcm90b3R5cGUudmlzaXRSZXR1
cm4pOgorICAgICAgICAoVmlzaXRvci5wcm90b3R5cGUudmlzaXRJbnRMaXRlcmFsKToKKyAgICAg
ICAgKFZpc2l0b3IucHJvdG90eXBlLnZpc2l0Q2FsbEV4cHJlc3Npb24pOgorICAgICAgICAoVmlz
aXRvci5wcm90b3R5cGUudmlzaXRGdW5jdGlvbkxpa2VCbG9jayk6CisgICAgICAgIChWaXNpdG9y
KToKKwogMjAxNy0wOC0yOSAgRG9uIE9sbXN0ZWFkICA8ZG9uLm9sbXN0ZWFkQHNvbnkuY29tPgog
CiAgICAgICAgIFtDTWFrZV0gVXNlIGZpbmRfcGFja2FnZSBmb3IgbGlieG1sMiBhbmQgbGlieHN0
bApJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQUxTeW50YXhFcnJvci5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9BTFN5bnRheEVycm9yLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL0FMU3ludGF4RXJyb3IuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBBTFN5bnRheEVycm9yIGV4dGVuZHMgRXJyb3IgeworICAgIGNv
bnN0cnVjdG9yKG9yaWdpblN0cmluZywgbWVzc2FnZSkKKyAgICB7CisgICAgICAgIHN1cGVyKCJT
eW50YXggZXJyb3IgYXQgIiArIG9yaWdpblN0cmluZyArICI6ICIgKyBtZXNzYWdlKTsKKyAgICAg
ICAgdGhpcy5vcmlnaW5TdHJpbmcgPSBvcmlnaW5TdHJpbmc7CisgICAgICAgIHRoaXMuc3ludGF4
RXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFu
Z1JJL0FMVHlwZUVycm9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlw
ZUVycm9yLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0FMVHlwZUVycm9y
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQUxUeXBlRXJy
b3IgZXh0ZW5kcyBFcnJvciB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luU3RyaW5nLCBtZXNzYWdl
KQorICAgIHsKKyAgICAgICAgc3VwZXIoIlR5cGUgZXJyb3IgYXQgIiArIG9yaWdpblN0cmluZyAr
ICI6ICIgKyBtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5vcmlnaW5TdHJpbmcgPSBvcmlnaW5TdHJp
bmc7CisgICAgICAgIHRoaXMudHlwZUVycm9yTWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9BZGRyZXNzU3BhY2UuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvQWRkcmVzc1NwYWNlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL0FkZHJlc3NTcGFjZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NvbnN0IGFkZHJlc3NTcGFjZXMgPSBbImNvbnN0YW50IiwgImRldmljZSIsICJ0
aHJlYWRncm91cCIsICJ0aHJlYWQiXTsKKworZnVuY3Rpb24gaXNBZGRyZXNzU3BhY2UoYWRkcmVz
c1NwYWNlKQoreworICAgIHN3aXRjaCAoYWRkcmVzc1NwYWNlKSB7CisgICAgY2FzZSAiY29uc3Rh
bnQiOgorICAgIGNhc2UgImRldmljZSI6CisgICAgY2FzZSAidGhyZWFkZ3JvdXAiOgorICAgIGNh
c2UgInRocmVhZCI6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAg
IHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Z1bmN0aW9uIHZhbGlkYXRlQWRkcmVzc1NwYWNl
KGFkZHJlc3NTcGFjZSkKK3sKKyAgICBpZiAoIWlzQWRkcmVzc1NwYWNlKGFkZHJlc3NTcGFjZSkp
CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQmFkIGFkZHJlc3Mgc3BhY2U6ICIgKyBhZGRyZXNz
U3BhY2UpOworfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQWxsLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL0FsbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9BbGwuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworbG9hZCgi
Tm9kZS5qcyIpOworbG9hZCgiVHlwZS5qcyIpOworbG9hZCgiUmVmZXJlbmNlVHlwZS5qcyIpOwor
bG9hZCgiVmFsdWUuanMiKTsKK2xvYWQoIkV4cHJlc3Npb24uanMiKTsKK2xvYWQoIlJld3JpdGVy
LmpzIik7Citsb2FkKCJWaXNpdG9yLmpzIik7Citsb2FkKCJFVmFsdWUuanMiKTsKKworbG9hZCgi
QUxTeW50YXhFcnJvci5qcyIpOworbG9hZCgiQUxUeXBlRXJyb3IuanMiKTsKK2xvYWQoIkFkZHJl
c3NTcGFjZS5qcyIpOworbG9hZCgiQXJyYXlSZWZUeXBlLmpzIik7Citsb2FkKCJBcnJheVR5cGUu
anMiKTsKK2xvYWQoIkFzc2lnbm1lbnQuanMiKTsKK2xvYWQoIkJsb2NrLmpzIik7Citsb2FkKCJD
YWxsQXNzaWdubWVudC5qcyIpOworbG9hZCgiQ2FsbEV4cHJlc3Npb24uanMiKTsKK2xvYWQoIkNh
bGxGdW5jdGlvbi5qcyIpOworbG9hZCgiQ2hlY2suanMiKTsKK2xvYWQoIkNoZWNrZXIuanMiKTsK
K2xvYWQoIkNvbW1hRXhwcmVzc2lvbi5qcyIpOworbG9hZCgiQ29uc3RleHByVHlwZVBhcmFtZXRl
ci5qcyIpOworbG9hZCgiRUJ1ZmZlci5qcyIpOworbG9hZCgiRUJ1ZmZlckJ1aWxkZXIuanMiKTsK
K2xvYWQoIkVGbG9hdC5qcyIpOworbG9hZCgiRUludC5qcyIpOworbG9hZCgiRVB0ci5qcyIpOwor
bG9hZCgiRXZhbHVhdGlvbkNvbW1vbi5qcyIpOworbG9hZCgiRXZhbHVhdG9yLmpzIik7Citsb2Fk
KCJGaWVsZC5qcyIpOworbG9hZCgiRnVuYy5qcyIpOworbG9hZCgiRnVuY0RlZi5qcyIpOworbG9h
ZCgiRnVuY0luc3RhbnRpYXRvci5qcyIpOworbG9hZCgiRnVuY1BhcmFtZXRlci5qcyIpOworbG9h
ZCgiRnVuY1NpZ25hdHVyZS5qcyIpOworbG9hZCgiRnVuY3Rpb25MaWtlQmxvY2suanMiKTsKK2xv
YWQoIklubGluZS5qcyIpOworbG9hZCgiSW5saW5lci5qcyIpOworbG9hZCgiSW5zdGFudGlhdGVJ
bW1lZGlhdGVzLmpzIik7Citsb2FkKCJJbnRMaXRlcmFsLmpzIik7Citsb2FkKCJJbnRyaW5zaWNz
LmpzIik7Citsb2FkKCJMZXhlci5qcyIpOworbG9hZCgiTGV4ZXJUb2tlbi5qcyIpOworbG9hZCgi
TmFtZUNvbnRleHQuanMiKTsKK2xvYWQoIk5hbWVSZXNvbHZlci5qcyIpOworbG9hZCgiTmF0aXZl
RnVuYy5qcyIpOworbG9hZCgiTmF0aXZlVHlwZS5qcyIpOworbG9hZCgiTmF0aXZlVHlwZUluc3Rh
bmNlLmpzIik7Citsb2FkKCJOdWxsVHlwZS5qcyIpOworbG9hZCgiUGFyc2UuanMiKTsKK2xvYWQo
IlByZXBhcmUuanMiKTsKK2xvYWQoIlByb2dyYW0uanMiKTsKK2xvYWQoIlByb3RvY29sLmpzIik7
Citsb2FkKCJQcm90b2NvbERlY2wuanMiKTsKK2xvYWQoIlByb3RvY29sUmVmLmpzIik7Citsb2Fk
KCJQdHJUeXBlLmpzIik7Citsb2FkKCJSZXNvbHZlTmFtZXMuanMiKTsKK2xvYWQoIlJlc29sdmVP
dmVybG9hZEltcGwuanMiKTsKK2xvYWQoIlJlc29sdmVUeXBlRGVmcy5qcyIpOworbG9hZCgiUmV0
dXJuLmpzIik7Citsb2FkKCJSZXR1cm5FeGNlcHRpb24uanMiKTsKK2xvYWQoIlN0YW5kYXJkTGli
cmFyeS5qcyIpOworbG9hZCgiU3RydWN0VHlwZS5qcyIpOworbG9hZCgiU3Vic3RpdHV0aW9uLmpz
Iik7Citsb2FkKCJTdWZmaXhDYWxsQXNzaWdubWVudC5qcyIpOworbG9hZCgiVHlwZURlZi5qcyIp
OworbG9hZCgiVHlwZURlZlJlc29sdmVyLmpzIik7Citsb2FkKCJUeXBlT3JWYXJpYWJsZVJlZi5q
cyIpOworbG9hZCgiVHlwZVJlZi5qcyIpOworbG9hZCgiVHlwZVZhcmlhYmxlLmpzIik7Citsb2Fk
KCJVbmlmaWNhdGlvbkNvbnRleHQuanMiKTsKK2xvYWQoIlZhcmlhYmxlRGVjbC5qcyIpOworbG9h
ZCgiVmFyaWFibGVSZWYuanMiKTsKK2xvYWQoIlZpc2l0aW5nU2V0LmpzIik7CkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9BcnJheVJlZlR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvQXJyYXlSZWZUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L0FycmF5UmVmVHlwZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ2IEBACisvKgorICog
Q29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisg
KiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRo
IG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0
IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0
aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1
Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0
aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlv
bi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJ
UycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcs
IEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hB
TlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJ
U0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8v
IE5vdGUgdGhhdCB3ZSBzYXkgdGhhdCBUW10gaXMgInRoZSBzYW1lIHR5cGUiIGFzIFRbY10gZm9y
IGFueSBULCBjLiBUaGlzIGdyZWF0bHkgc2ltcGxpZmllcyB0aGUKKy8vIGxhbmd1YWdlLgorY2xh
c3MgQXJyYXlSZWZUeXBlIGV4dGVuZHMgUmVmZXJlbmNlVHlwZSB7CisgICAgdW5pZnlJbXBsKHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0
YW5jZW9mIEFycmF5UmVmVHlwZSkpIHsKKyAgICAgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgQXJyYXlUeXBlKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAg
ICBpZiAodGhpcy5hZGRyZXNzU3BhY2UgIT0gInRocmVhZCIpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRUeXBlLnVu
aWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIuZWxlbWVudFR5cGUpOworICAgIH0KKworICAg
IHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmFkZHJlc3NTcGFjZSArICIg
IiArIHRoaXMuZWxlbWVudFR5cGUgKyAiW10iOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvQXJyYXlUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Fy
cmF5VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9BcnJheVR5cGUu
anMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykg
MjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRp
b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cisg
KiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5n
IGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlz
IGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4g
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90
aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJ
UyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisg
KiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlU
RUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg
RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4g
Tk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBG
T1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExB
UlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NT
IE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikg
SE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhF
UiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBO
RUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF
CisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZ
IE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBBcnJheVR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGVsZW1lbnRUeXBlLCBudW1F
bGVtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAg
dGhpcy5fZWxlbWVudFR5cGUgPSBlbGVtZW50VHlwZTsKKyAgICAgICAgdGhpcy5fbnVtRWxlbWVu
dHMgPSBudW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJu
IHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBlbGVtZW50VHlwZSgpIHsgcmV0dXJuIHRoaXMuX2Vs
ZW1lbnRUeXBlOyB9CisgICAgZ2V0IG51bUVsZW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fbnVtRWxl
bWVudHM7IH0KKyAgICBnZXQgaXNQcmltaXRpdmUoKSB7IHJldHVybiB0aGlzLmVsZW1lbnRUeXBl
LmlzUHJpbWl0aXZlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuIHRoaXMuZWxlbWVudFR5cGUgKyAiWyIgKyB0aGlzLm51bUVsZW1lbnRzICsgIl0iOworICAg
IH0KKyAgICAKKyAgICBnZXQgc2l6ZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5lbGVt
ZW50VHlwZS5zaXplICogdGhpcy5udW1FbGVtZW50czsKKyAgICB9CisgICAgCisgICAgdW5pZnlJ
bXBsKHVuaWZpY2F0b25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmIChvdGhlciBp
bnN0YW5jZW9mIEFycmF5UmVmVHlwZSkgeworICAgICAgICAgICAgaWYgKG90aGVyLmFkZHJlc3NT
cGFjZSAhPSAidGhyZWFkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAg
IH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEFycmF5VHlwZSkp
CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgCisgICAgICAgICAg
ICBpZiAoIXRoaXMubnVtRWxlbWVudHMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci5u
dW1FbGVtZW50cykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9Cisg
ICAgICAgIAorICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1bmlmaWNhdGlv
bkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0Fzc2lnbm1lbnQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
QXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Bc3NpZ25t
ZW50LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQg
KEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJp
YnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91
dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxv
d2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNv
dXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwg
dGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAq
IDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v
ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAq
IFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFC
TEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhF
TVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsg
TE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJ
T04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdI
RVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJ
TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF
IFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJ
TElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQXNzaWdu
bWVudCBleHRlbmRzIEV4cHJlc3Npb24geworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbGhzLCBy
aHMpCisgICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9saHMgPSBs
aHM7CisgICAgICAgIHRoaXMuX3JocyA9IHJoczsKKyAgICB9CisgICAgCisgICAgZ2V0IGxocygp
IHsgcmV0dXJuIHRoaXMuX2xoczsgfQorICAgIGdldCByaHMoKSB7IHJldHVybiB0aGlzLl9yaHM7
IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saHMg
KyAiID0gIiArIHRoaXMucmhzOworICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L0Jsb2NrLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0Jsb2NrLmpzCSh3b3JraW5nIGNvcHkpCkBA
IC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNl
IGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUg
cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUg
bWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBi
aW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIg
aW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlk
ZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklE
RUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVE
IFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJ
RUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExF
IElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElS
RUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFM
IERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQg
T0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisg
KiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBP
TiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklD
VCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJ
U0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FS
RSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisg
Ki8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQmxvY2sgZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25z
dHJ1Y3RvcihvcmlnaW4pCisgICAgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLl9v
cmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX3N0YXRlbWVudHMgPSBbXTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIAorICAg
IGFkZChzdGF0ZW1lbnQpCisgICAgeworICAgICAgICB0aGlzLl9zdGF0ZW1lbnRzLnB1c2goc3Rh
dGVtZW50KTsKKyAgICB9CisgICAgCisgICAgZ2V0IHN0YXRlbWVudHMoKSB7IHJldHVybiB0aGlz
Ll9zdGF0ZW1lbnRzOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgaWYg
KCF0aGlzLnN0YXRlbWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuICJ7IH0iOworICAg
ICAgICByZXR1cm4gInsgIiArIHRoaXMuc3RhdGVtZW50cy5qb2luKCI7ICIpOyArICI7IH0iOwor
ICAgIH0KK307CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCShub25leGlz
dGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxBc3NpZ25tZW50LmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2FsbEFzc2lnbm1lbnQgZXh0ZW5kcyBF
eHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIGxocywgcmhzKQorICAg
IHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7Cisg
ICAgICAgIHRoaXMuX2xocyA9IGxoczsKKyAgICAgICAgdGhpcy5fcmhzID0gcmhzOworICAgICAg
ICB0aGlzLmZ1bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJu
IHRoaXMuX25hbWU7IH0KKyAgICBnZXQgbGhzKCkgeyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAg
Z2V0IHJocygpIHsgcmV0dXJuIHRoaXMuX3JoczsgfSAvLyBUaGlzIGNhbiBiZSBudWxsLgorICAg
IAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmxocyArICIgIiAr
IHRoaXMubmFtZSArICh0aGlzLnJocyA/ICI9ICIgKyB0aGlzLnJocyA6ICIiKTsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCj09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0K
LS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxFeHByZXNzaW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgQ2FsbEV4cHJlc3Npb24gZXh0ZW5kcyBFeHByZXNzaW9u
IHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50
TGlzdCkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbik7CisgICAgICAgIHRoaXMuX25hbWUg
PSBuYW1lOworICAgICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAg
ICAgICAgdGhpcy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAgICAgICB0aGlzLmZ1
bmMgPSBudWxsOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25h
bWU7IH0KKyAgICBnZXQgdHlwZUFyZ3VtZW50cygpIHsgcmV0dXJuIHRoaXMuX3R5cGVBcmd1bWVu
dHM7IH0KKyAgICBnZXQgYXJndW1lbnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0
OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFt
ZSArICI8IiArIHRoaXMudHlwZUFyZ3VtZW50cyArICI+KCIgKyB0aGlzLmFyZ3VtZW50TGlzdCAr
ICIpIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0NhbGxGdW5jdGlvbi5q
cwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DYWxsRnVuY3Rpb24uanMJKG5vbmV4
aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvQ2FsbEZ1bmN0aW9uLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworLy8gVGhpcyBhbGxvd3MgeW91IHRvIHBhc3Mgc3Ry
dWN0cyBhbmQgYXJyYXlzIGluLXBsYWNlLCBidXQgaXQncyBhIG1vcmUgYW5ub3lpbmcgQVBJLgor
ZnVuY3Rpb24gY2FsbEZ1bmN0aW9uQnlSZWYocHJvZ3JhbSwgbmFtZSwgdHlwZUFyZ3VtZW50cywg
YXJndW1lbnRMaXN0KQoreworICAgIGZvciAobGV0IHJlc2V0IG9mIHByb2dyYW0ucmVzZXRzKQor
ICAgICAgICByZXNldCgpOworICAgIGxldCBhcmd1bWVudFR5cGVzID0gYXJndW1lbnRMaXN0Lm1h
cChhcmd1bWVudCA9PiB7CisgICAgICAgIGxldCByZXN1bHQgPSBhcmd1bWVudC50eXBlLmVsZW1l
bnRUeXBlOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJv
cigiQXJndW1lbnQgaGFzIG5vIGVsZW1lbnQgdHlwZTogIiArIGFyZ3VtZW50KTsKKyAgICAgICAg
cmV0dXJuIHJlc3VsdDsKKyAgICB9KTsKKyAgICBsZXQgZnVuYyA9IHJlc29sdmVJbmxpbmVkRnVu
Y3Rpb24ocHJvZ3JhbSwgbmFtZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAg
aWYgKCFmdW5jKQorICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IoIjxjYWxsRnVuY3Rpb24+
IiwgIkNhbm5vdCByZXNvbHZlIGZ1bmN0aW9uIGNhbGwgIiArIG5hbWUgKyAiPCIgKyB0eXBlQXJn
dW1lbnRzICsgIj4oIiArIGFyZ3VtZW50TGlzdCArICIpIik7CisgICAgZm9yIChsZXQgaSA9IDA7
IGkgPCBmdW5jLnBhcmFtZXRlcnMubGVuZ3RoOyArK2kpCisgICAgICAgIGZ1bmMucGFyYW1ldGVy
c1tpXS5lUHRyLmNvcHlGcm9tKGFyZ3VtZW50TGlzdFtpXSk7CisgICAgcmV0dXJuIG5ldyBFdmFs
dWF0b3IocHJvZ3JhbSkudmlzaXRGdW5jdGlvbkJvZHkoZnVuYy5ib2R5KTsKK30KKworZnVuY3Rp
b24gY2FsbEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50TGlz
dCkKK3sKKyAgICByZXR1cm4gY2FsbEZ1bmN0aW9uQnlSZWYoCisgICAgICAgIHByb2dyYW0sIG5h
bWUsIHR5cGVBcmd1bWVudHMsCisgICAgICAgIGFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4g
RVB0ci5ib3goYXJndW1lbnQpKSkubG9hZFZhbHVlKCk7Cit9CkluZGV4OiBUb29scy9BcnJheUxh
bmdSSS9DaGVjay5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9DaGVjay5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DaGVjay5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIGNoZWNrKHByb2dyYW0pCit7CisgICAg
cHJvZ3JhbS52aXNpdChuZXcgQ2hlY2tlcihwcm9ncmFtKSk7Cit9CisKSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL0NoZWNrZXIuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvQ2hl
Y2tlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9DaGVja2VyLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIENoZWNrZXIgZXh0ZW5k
cyBWaXNpdG9yIHsKKyAgICBjb25zdHJ1Y3Rvcihwcm9ncmFtKQorICAgIHsKKyAgICAgICAgc3Vw
ZXIoKTsKKyAgICAgICAgdGhpcy5fcHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAgIHRoaXMuX2N1
cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb2dyYW0obm9k
ZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHN0YXRlbWVudCBvZiBub2RlLnRvcExldmVsU3Rh
dGVtZW50cykgeworICAgICAgICAgICAgdGhpcy5fY3VycmVudFN0YXRlbWVudCA9IHN0YXRlbWVu
dDsKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgIH0K
KyAgICAKKyAgICB2aXNpdFByb3RvY29sRGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChs
ZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2lnbmF0dXJlcykgeworICAgICAgICAgICAgbGV0IHNldCA9
IG5ldyBTZXQoKTsKKyAgICAgICAgICAgIGZ1bmN0aW9uIGNvbnNpZGVyKHRoaW5nKQorICAgICAg
ICAgICAgeworICAgICAgICAgICAgICAgIGlmICh0aGluZy5pc1VuaWZpYWJsZSkKKyAgICAgICAg
ICAgICAgICAgICAgc2V0LmFkZCh0aGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBj
bGFzcyBOb3RpY2VUeXBlVmFyaWFibGUgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICAgICAgICAgICAg
ICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAg
ICAgIGNvbnNpZGVyKG5vZGUudHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg
ICAgIHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAg
ICAgICAgICAgIGNvbnNpZGVyKG5vZGUudmFyaWFibGUpOworICAgICAgICAgICAgICAgIH0KKyAg
ICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBub3RpY2VUeXBlVmFyaWFibGUgPSBuZXcgTm90
aWNlVHlwZVZhcmlhYmxlKCk7CisgICAgICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXJUeXBlIG9m
IHNpZ25hdHVyZS5wYXJhbWV0ZXJUeXBlcykKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBl
LnZpc2l0KG5vdGljZVR5cGVWYXJpYWJsZSk7CisgICAgICAgICAgICBmb3IgKGxldCB0eXBlUGFy
YW1ldGVyIG9mIHNpZ25hdHVyZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAgICAgICAgIGlm
ICghc2V0Lmhhcyh0eXBlUGFyYW1ldGVyKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgQUxU
eXBlRXJyb3IodHlwZVBhcmFtZXRlci5vcmlnaW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBwYXJhbWV0
ZXIgdG8gcHJvdG9jb2wgc2lnbmF0dXJlIG5vdCBpbmZlcnJhYmxlIGZyb20gdmFsdWUgcGFyYW1l
dGVycyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZXQuaGFzKG5vZGUudHlw
ZVZhcmlhYmxlKSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Ioc2lnbmF0
dXJlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJQcm90b2NvbCdzIHR5cGUgdmFyaWFibGUgbm90IG1l
bnRpb25lZCBpbiBzaWduYXR1cmUiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBfY2hl
Y2tUeXBlQXJndW1lbnRzKG9yaWdpbiwgdHlwZVBhcmFtZXRlcnMsIHR5cGVBcmd1bWVudHMpCisg
ICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVQYXJhbWV0ZXJzLmxlbmd0aDsg
KytpKSB7CisgICAgICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSB0eXBlQXJndW1lbnRzW2ld
IGluc3RhbmNlb2YgVHlwZTsKKyAgICAgICAgICAgIGxldCByZXN1bHQgPSBub2RlLnR5cGVBcmd1
bWVudHNbaV0udmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoYXJndW1lbnRJc1R5cGUpIHsK
KyAgICAgICAgICAgICAgICBpZiAoIXR5cGVBcmd1bWVudHNbaV0uaW5oZXJpdHModHlwZUFyZ3Vt
ZW50c1tpXSkpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmln
aW4ub3JpZ2luU3RyaW5nLCAiVHlwZSBhcmd1bWVudCBkb2VzIG5vdCBpbmhlcml0IHByb3RvY29s
Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghcmVzdWx0LmVx
dWFscyh0eXBlUGFyYW1ldGVyc1tpXS50eXBlKSkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcsICJXcm9uZyB0eXBlIGZvciBjb25z
dGV4cHIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICB2aXNp
dFR5cGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIGlmICghbm9kZS50eXBlKQorICAgICAgICAg
ICAgdGhyb3cgbmV3IEVycm9yKCJUeXBlIHJlZmVyZW5jZSB3aXRob3V0IGEgdHlwZSBpbiBjaGVj
a2VyOiAiICsgbm9kZSArICIgYXQgIiArIG5vZGUub3JpZ2luKTsKKyAgICAgICAgdGhpcy5fY2hl
Y2tUeXBlQXJndW1lbnRzKG5vZGUub3JpZ2luLCBub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMsIG5v
ZGUudHlwZUFyZ3VtZW50cyk7CisgICAgfQorICAgIAorICAgIHZpc2l0UmVmZXJlbmNlVHlwZShu
b2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICAg
ICAgCisgICAgICAgIGlmIChub2RlLmFkZHJlc3NTcGFjZSA9PSAidGhyZWFkIikKKyAgICAgICAg
ICAgIHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICghbm9kZS5lbGVtZW50VHlwZS53aXRo
UmVjdXJzaXZlbHlJbnN0YW50aWF0ZWRJbW1lZGlhdGVzLmlzUHJpbWl0aXZlKQorICAgICAgICAg
ICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIklsbGVn
YWwgcG9pbnRlciB0byBub24tcHJpbWl0aXZlIHR5cGUiKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRBcnJheVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIGlmICghbm9kZS5udW1FbGVtZW50cy5p
c0NvbnN0ZXhwcikKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdp
bi5vcmlnaW5TdHJpbmcsICJBcnJheSBsZW5ndGggbXVzdCBiZSBjb25zdGV4cHIiKTsKKyAgICB9
CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUpCisgICAgeworICAgICAgICAvLyBGSVhN
RTogV2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBsaHMgaXMgYXNzaWduYWJsZS4KKyAgICAgICAg
bGV0IGxoc1R5cGUgPSBub2RlLmxocy52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IHJoc1R5cGUg
PSBub2RlLnJocy52aXNpdCh0aGlzKTsKKyAgICAgICAgaWYgKCFsaHNUeXBlLmVxdWFscyhyaHNU
eXBlKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmln
aW5TdHJpbmcsICJUeXBlIG1pc21hdGNoIGluIGFzc2lnbm1lbnQ6ICIgKyBsaHNUeXBlICsgIiB2
ZXJzdXMgIiArIHJoc1R5cGUpOworICAgICAgICByZXR1cm4gbGhzVHlwZTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGUu
dmFyaWFibGUudHlwZTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7
CisgICAgICAgIGlmIChub2RlLnZhbHVlKSB7CisgICAgICAgICAgICBsZXQgcmVzdWx0VHlwZSA9
IG5vZGUudmFsdWUudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdFR5cGUpCisg
ICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJOdWxsIHJlc3VsdCB0eXBlIGZyb20gIiAr
IG5vZGUudmFsdWUpOworICAgICAgICAgICAgaWYgKCFub2RlLmZ1bmMucmV0dXJuVHlwZS5lcXVh
bHMocmVzdWx0VHlwZSkpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5v
ZGUub3JpZ2luLm9yaWdpblN0cmluZywgIlRyeWluZyB0byByZXR1cm4gIiArIHJlc3VsdFR5cGUg
KyAiIGluIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zICIgKyBmdW5jLnJldHVyblR5cGUpOworICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAoIWZ1bmMu
cmV0dXJuVHlwZS5lcXVhbHModGhpcy5fcHJvZ3JhbS5pbnRyaW5zaWNzLnZvaWQpKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIk5v
bi12b2lkIGZ1bmN0aW9uIG11c3QgcmV0dXJuIGEgdmFsdWUiKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRJbnRMaXRlcmFsKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jh
bS5pbnRyaW5zaWNzLmludDMyOworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbW1hRXhwcmVzc2lv
bihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7CisgICAgICAgIGZvciAo
bGV0IGV4cHJlc3Npb24gb2Ygbm9kZS5saXN0KQorICAgICAgICAgICAgcmVzdWx0ID0gZXhwcmVz
c2lvbi52aXNpdCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisg
ICAgdmlzaXRDYWxsRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlw
ZUFyZ3VtZW50IG9mIG5vZGUudHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1bWVu
dC52aXNpdCh0aGlzKTsKKyAgICAgICAgbGV0IGFyZ3VtZW50VHlwZXMgPSBub2RlLmFyZ3VtZW50
TGlzdC5tYXAoYXJndW1lbnQgPT4geworICAgICAgICAgICAgbGV0IG5ld0FyZ3VtZW50ID0gYXJn
dW1lbnQudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIW5ld0FyZ3VtZW50KQorICAgICAg
ICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidmlzaXRvciByZXR1cm5lZCBudWxsIGZvciAiICsg
YXJndW1lbnQpOworICAgICAgICAgICAgcmV0dXJuIG5ld0FyZ3VtZW50OworICAgICAgICB9KTsK
KyAgICAgICAgCisgICAgICAgIGxldCBvdmVybG9hZCA9IG51bGw7CisgICAgICAgIGZvciAobGV0
IHR5cGVQYXJhbWV0ZXIgb2YgdGhpcy5fY3VycmVudFN0YXRlbWVudC50eXBlUGFyYW1ldGVycykg
eworICAgICAgICAgICAgaWYgKCEodHlwZVBhcmFtZXRlciBpbnN0YW5jZW9mIFR5cGVWYXJpYWJs
ZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoIXR5cGVQYXJh
bWV0ZXIucHJvdG9jb2wpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBs
ZXQgc2lnbmF0dXJlcyA9CisgICAgICAgICAgICAgICAgdHlwZVBhcmFtZXRlci5wcm90b2NvbC5z
aWduYXR1cmVzQnlOYW1lV2l0aFR5cGVWYXJpYWJsZShub2RlLm5hbWUsIHR5cGVQYXJhbWV0ZXIp
OworICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVzKQorICAgICAgICAgICAgICAgIGNvbnRpbnVl
OworICAgICAgICAgICAgb3ZlcmxvYWQgPSByZXNvbHZlT3ZlcmxvYWRJbXBsKHNpZ25hdHVyZXMs
IG5vZGUudHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcyk7CisgICAgICAgICAgICBpZiAob3Zl
cmxvYWQpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFv
dmVybG9hZCkgeworICAgICAgICAgICAgb3ZlcmxvYWQgPSB0aGlzLl9wcm9ncmFtLnJlc29sdmVG
dW5jT3ZlcmxvYWQoCisgICAgICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVu
dHMsIGFyZ3VtZW50VHlwZXMpOworICAgICAgICB9CisgICAgICAgIGlmICghb3ZlcmxvYWQpCisg
ICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2luU3RyaW5n
LCAiRGlkIG5vdCBmaW5kIGZ1bmN0aW9uIGZvciBjYWxsIik7CisgICAgICAgIG5vZGUuZnVuYyA9
IG92ZXJsb2FkLmZ1bmM7CisgICAgICAgIG5vZGUuYWN0dWFsVHlwZUFyZ3VtZW50cyA9IG92ZXJs
b2FkLnR5cGVBcmd1bWVudHMubWFwKFR5cGVSZWYud3JhcCk7CisgICAgICAgIGxldCByZXN1bHQg
PSBvdmVybG9hZC5mdW5jLnJldHVyblR5cGUuc3Vic3RpdHV0ZVRvVW5pZmljYXRpb24oCisgICAg
ICAgICAgICBvdmVybG9hZC5mdW5jLnR5cGVQYXJhbWV0ZXJzLCBvdmVybG9hZC51bmlmaWNhdGlv
bkNvbnRleHQpOworICAgICAgICBpZiAoIXJlc3VsdCkKKyAgICAgICAgICAgIHRocm93IG5ldyBF
cnJvcigiTnVsbCByZXN1bHQgZnJvbSBDYWxsRXhwcmVzc2lvbiIpOworICAgICAgICByZXR1cm4g
cmVzdWx0OworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvQ29tbWFFeHByZXNz
aW9uLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0NvbW1hRXhwcmVzc2lvbi5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Db21tYUV4cHJlc3Npb24uanMJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAx
NyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24g
YW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBt
b2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNv
bmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNv
ZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVk
aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVy
IG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT
T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1Ig
QU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlks
IE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8s
CisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G
IFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9X
RVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJ
TiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdM
SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisg
KiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9G
IFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDb21tYUV4cHJlc3Np
b24gZXh0ZW5kcyBFeHByZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGxpc3QpCisg
ICAgeworICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9saXN0ID0gbGlzdDsK
KyAgICAgICAgZm9yIChsZXQgZXhwcmVzc2lvbiBvZiBsaXN0KSB7CisgICAgICAgICAgICBpZiAo
IWV4cHJlc3Npb24pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJudWxsIGV4cHJl
c3Npb24iKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBnZXQgbGlzdCgpIHsgcmV0dXJu
IHRoaXMuX2xpc3Q7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1
cm4gIigiICsgdGhpcy5saXN0LnRvU3RyaW5nKCkgKyAiKSI7CisgICAgfQorfTsKKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvQ29uc3RleHByVHlwZVBhcmFtZXRlci5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9Db25zdGV4cHJUeXBlUGFyYW1ldGVyLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0NvbnN0ZXhwclR5cGVQYXJhbWV0ZXIuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBDb25zdGV4cHJUeXBlUGFyYW1l
dGVyIGV4dGVuZHMgVmFsdWUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgbmFtZSwgdHlwZSkK
KyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFt
ZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgIH0KKyAgICAKKyAgICBn
ZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJu
IHRoaXMuX3R5cGU7IH0KKyAgICBnZXQgaXNDb25zdGV4cHIoKSB7IHJldHVybiB0cnVlOyB9Cisg
ICAgZ2V0IGlzVW5pZmlhYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQorICAgIAorICAgIHR5cGVWYXJp
YWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAo
IShvdGhlciBpbnN0YW5jZW9mIFZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKwor
ICAgICAgICBpZiAoIXRoaXMudHlwZS51bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLnR5
cGUpKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGxldCByZWFsVGhpcyA9
IHVuaWZpY2F0aW9uQ29udGV4dC5maW5kKHRoaXMpOworICAgICAgICBpZiAocmVhbFRoaXMgIT0g
dGhpcykKKyAgICAgICAgICAgIHJldHVybiByZWFsVGhpcy51bmlmeSh1bmlmaWNhdGlvbkNvbnRl
eHQsIG90aGVyKTsKKyAgICAgICAgCisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFZhcmlh
YmxlUmVmKQorICAgICAgICAgICAgb3RoZXIgPSBvdGhlci52YXJpYWJsZTsKKyAgICAgICAgCisg
ICAgICAgIHVuaWZpY2F0aW9uQ29udGV4dC51bmlmeSh0aGlzLCBvdGhlcik7CisgICAgICAgIHJl
dHVybiB0cnVlOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0
LCBvdGhlcikKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGVWYXJpYWJsZVVuaWZ5KHVu
aWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpOworICAgIH0KKyAgICAKKyAgICB2ZXJpZnlBc0FyZ3Vt
ZW50KHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAgIHJldHVybiB0cnVlOworICAg
IH0KKyAgICAKKyAgICB2ZXJpZnlBc1BhcmFtZXRlcih1bmlmaWNhdGlvbkNvbnRleHQpCisgICAg
eworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0VCdWZmZXIuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvRUJ1ZmZlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9FQnVmZmVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworbGV0
IGVCdWZmZXJDb3VudCA9IDA7CisKK2NsYXNzIEVCdWZmZXIgeworICAgIGNvbnN0cnVjdG9yKHNp
emUpCisgICAgeworICAgICAgICB0aGlzLl9pbmRleCA9IGVCdWZmZXJDb3VudCsrOworICAgICAg
ICB0aGlzLl9hcnJheSA9IG5ldyBBcnJheShzaXplKTsKKyAgICB9CisgICAgCisgICAgZ2V0KGlu
ZGV4KQorICAgIHsKKyAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9hcnJh
eS5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm91dCBvZiBib3VuZHMgYnVm
ZmVyIGFjY2VzcyIpOworICAgICAgICByZXR1cm4gdGhpcy5fYXJyYXlbaW5kZXhdOworICAgIH0K
KyAgICAKKyAgICBzZXQoaW5kZXgsIHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5fYXJyYXlb
aW5kZXhdID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdldCBpbmRleCgpIHsgcmV0dXJuIHRo
aXMuX2luZGV4OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
ICJCIiArIHRoaXMuX2luZGV4ICsgIjpbIiArIHRoaXMuX2FycmF5ICsgIl0iOworICAgIH0KK30K
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0VCdWZmZXJCdWlsZGVyLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL0VCdWZmZXJCdWlsZGVyLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL0VCdWZmZXJCdWlsZGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRz
IHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBi
aW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0
dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0Ogor
ICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92
ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRo
ZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkg
Zm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhl
CisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0
aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkg
QVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJB
TlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FS
UkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgor
ICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4g
T1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJ
TkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFH
RVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VC
U1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9G
SVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkg
VEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFC
SUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFS
SVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZF
TiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1
c2Ugc3RyaWN0IjsKKworY2xhc3MgRUJ1ZmZlckJ1aWxkZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAg
ICBjb25zdHJ1Y3Rvcihwcm9ncmFtKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAg
dGhpcy5fcHJvZ3JhbSA9IHByb2dyYW07CisgICAgIAorICAgICAgICAvLyBOT1RFOiBJIGRvbid0
IHRoaW5rIHRoYXQgdGhpcyBpcyBuZWNlc3NhcnkuCisgICAgICAgIGxldCByZXNldHMgPSBbXTsK
KyAgICAgICAgdGhpcy5fcmVzZXRzID0gcmVzZXRzOworICAgICAgICBwcm9ncmFtLnJlc2V0cyA9
IHJlc2V0czsKKyAgICB9CisgICAgCisgICAgX2NyZWF0ZUVQdHIodHlwZSkKKyAgICB7CisgICAg
ICAgIHR5cGUgPSB0eXBlLmluc3RhbnRpYXRlZFR5cGU7CisgICAgICAgIGxldCBidWZmZXIgPSBu
ZXcgRUJ1ZmZlcih0eXBlLnNpemUpOworICAgICAgICB0eXBlLnBvcHVsYXRlRGVmYXVsdFZhbHVl
KGJ1ZmZlciwgMCk7CisgICAgICAgIHRoaXMuX3Jlc2V0cy5wdXNoKCgpID0+IHR5cGUucG9wdWxh
dGVEZWZhdWx0VmFsdWUoYnVmZmVyLCAwKSk7CisgICAgICAgIHJldHVybiBuZXcgRVB0cihuZXcg
UHRyVHlwZShudWxsLCAidGhyZWFkIiwgdHlwZSksIGJ1ZmZlciwgMCk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0RnVuY1BhcmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5lUHRyID0g
dGhpcy5fY3JlYXRlRVB0cihub2RlLnR5cGUpOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJy
YXlMYW5nUkkvRUZsb2F0LmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0VGbG9h
dC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FRmxvYXQuanMJKHdvcmtp
bmcgY29weSkKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVz
ZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmlj
YXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlv
bnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVz
dCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmli
dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVy
aWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FS
RSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNT
IE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRI
RQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBG
T1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQg
U0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJ
UkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENP
TlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQ
Uk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwg
REFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBD
QVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05U
UkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNF
IE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBU
SElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0gg
REFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFRmxvYXQgZXh0ZW5kcyBFVmFs
dWUgeworICAgIGNvbnN0cnVjdG9yKHR5cGUsIHZhbHVlKQorICAgIHsKKyAgICAgICAgc3VwZXIo
dHlwZSk7CisgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CisgICAgfQorICAgIAorICAgIGdl
dCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9CisgICAgCisgICAgYWRkKG90aGVyKQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFRmxvYXQodGhpcy50eXBlLCB0aGlzLnZhbHVlICsg
b3RoZXIudmFsdWUpOworICAgIH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gIiIgKyB0aGlzLnZhbHVlOworICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlM
YW5nUkkvRUludC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FSW50LmpzCShu
b25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0VJbnQuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBFSW50IGV4dGVuZHMgRVZhbHVlIHsKKyAgICBj
b25zdHJ1Y3Rvcih0eXBlLCB2YWx1ZSkKKyAgICB7CisgICAgICAgIHN1cGVyKHR5cGUpOworICAg
ICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOworICAgIH0KKyAgICAKKyAgICBnZXQgdmFsdWUoKSB7
IHJldHVybiB0aGlzLl92YWx1ZTsgfQorICAgIAorICAgIGFkZChvdGhlcikKKyAgICB7CisgICAg
ICAgIHJldHVybiBuZXcgRUludCh0aGlzLnR5cGUsICh0aGlzLnZhbHVlICsgb3RoZXIudmFsdWUp
IHwgMCk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVy
biAiIiArIHRoaXMudmFsdWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9F
UHRyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0VQdHIuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRVB0ci5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2NsYXNzIEVQdHIgZXh0ZW5kcyBFVmFsdWUgeworICAgIGNvbnN0cnVj
dG9yKHR5cGUsIGJ1ZmZlciwgb2Zmc2V0KQorICAgIHsKKyAgICAgICAgc3VwZXIodHlwZSk7Cisg
ICAgICAgIGlmICghKHR5cGUudW5pZnlOb2RlIGluc3RhbmNlb2YgUHRyVHlwZSkpCisgICAgICAg
ICAgICB0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBjcmVhdGUgRVB0ciB3aXRoIG5vbi1wdHIgdHlw
ZTogIiArIHR5cGUpOworICAgICAgICB0aGlzLl9idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHRo
aXMuX29mZnNldCA9IG9mZnNldDsKKyAgICB9CisgICAgCisgICAgLy8gVGhlIGludGVycHJldGVy
IGFsd2F5cyBwYXNzZXMgYXJvdW5kIHBvaW50ZXJzIHRvIHRoaW5ncy4gVGhpcyBtZWFucyB0aGF0
IHNvbWV0aW1lcyB3ZSB3aWxsCisgICAgLy8gd2FudCB0byByZXR1cm4gYSB2YWx1ZSBidXQgd2Ug
aGF2ZSB0byAiaW52ZW50IiBhIHBvaW50ZXIgdG8gdGhhdCB2YWx1ZS4gTm8gcHJvYmxlbSwgdGhp
cworICAgIC8vIGZ1bmN0aW9uIGlzIGhlcmUgdG8gaGVscC4KKyAgICAvLworICAgIC8vIEluIGEg
cmVhbCBleGVjdXRpb24gZW52aXJvbm1lbnQsIHVzZXMgb2YgdGhpcyBtYW5pZmVzdCBhcyBTU0Eg
dGVtcG9yYXJpZXMuCisgICAgc3RhdGljIGJveCh2YWx1ZSkKKyAgICB7CisgICAgICAgIGlmICgh
dmFsdWUudHlwZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVmFsdWUgaGFzIG5vIHR5
cGU6ICIgKyB2YWx1ZSk7CisgICAgICAgIGxldCBidWZmZXIgPSBuZXcgRUJ1ZmZlcigxKTsKKyAg
ICAgICAgYnVmZmVyLnNldCgwLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiBuZXcgRVB0cihuZXcg
UHRyVHlwZShudWxsLCAidGhyZWFkIiwgdmFsdWUudHlwZSksIGJ1ZmZlciwgMCk7CisgICAgfQor
ICAgIAorICAgIGdldCBidWZmZXIoKSB7IHJldHVybiB0aGlzLl9idWZmZXI7IH0KKyAgICBnZXQg
b2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5fb2Zmc2V0OyB9CisgICAgCisgICAgbG9hZFZhbHVlKCkK
KyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5nZXQodGhpcy5vZmZzZXQpOworICAg
IH0KKyAgICAKKyAgICBjb3B5RnJvbShvdGhlcikKKyAgICB7CisgICAgICAgIGxldCBlbGVtZW50
VHlwZSA9IHRoaXMudHlwZS5lbGVtZW50VHlwZTsKKyAgICAgICAgaWYgKCFlbGVtZW50VHlwZSkK
KyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gZWxlbWVudCB0eXBlOiAiICsgdGhpcyk7
CisgICAgICAgIGZvciAobGV0IGkgPSBlbGVtZW50VHlwZS5zaXplOyBpLS07KQorICAgICAgICAg
ICAgdGhpcy5idWZmZXIuc2V0KGksIG90aGVyLmJ1ZmZlci5nZXQoaSkpOworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKQorICAgICAg
ICAgICAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgcmV0dXJuIHRoaXMudHlwZSArICJCIiArIHRo
aXMuYnVmZmVyLmluZGV4ICsgIjoiICsgdGhpcy5vZmZzZXQ7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9FVmFsdWUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5n
UkkvRVZhbHVlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0VWYWx1ZS5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEVWYWx1ZSB7Cisg
ICAgY29uc3RydWN0b3IodHlwZSkKKyAgICB7CisgICAgICAgIGlmICghdHlwZSkKKyAgICAgICAg
ICAgIHRocm93IG5ldyBFcnJvcigiTm8gdHlwZSIpOworICAgICAgICB0aGlzLl90eXBlID0gdHlw
ZS51bmlmeU5vZGU7CisgICAgfQorICAgIAorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5f
dHlwZTsgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0aW9uQ29tbW9uLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRpb25Db21tb24uanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRXZhbHVhdGlvbkNvbW1vbi5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NvbnN0IEJyZWFrRXhjZXB0aW9uID0g
U3ltYm9sKCJCcmVha0V4Y2VwdGlvbiIpOworY29uc3QgQ29udGludWVFeGNlcHRpb24gPSBTeW1i
b2woIkNvbnRpbnVlRXhjZXB0aW9uIik7CisKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXZh
bHVhdG9yLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0V2YWx1YXRvci5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9FdmFsdWF0b3IuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCisvLyBUaGlzIGlzIGEgY29tYmluZWQgTEhTL1JI
UyBldmFsdWF0b3IgdGhhdCBwYXNzZXMgYXJvdW5kIEVQdHIncyB0byBldmVyeXRoaW5nLgorY2xh
c3MgRXZhbHVhdG9yIGV4dGVuZHMgVmlzaXRvciB7CisgICAgY29uc3RydWN0b3IocHJvZ3JhbSkK
KyAgICB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSBwcm9ncmFt
OworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uQm9keShibG9jaykKKyAgICB7CisgICAg
ICAgIHRyeSB7CisgICAgICAgICAgICBibG9jay52aXNpdCh0aGlzKTsKKyAgICAgICAgICAgIC8v
IEZJWE1FOiBXZSBzaG91bGQgaGF2ZSBhIGNoZWNrIHRoYXQgdGhlcmUgaXMgbm8gd2F5IHRvIGRy
b3Agb3V0IG9mIGEgZnVuY3Rpb24gd2l0aG91dAorICAgICAgICAgICAgLy8gcmV0dXJuaW5nIHVu
bGVzcyB0aGUgZnVuY3Rpb24gcmV0dXJucyB2b2lkLgorICAgICAgICAgICAgcmV0dXJuIG51bGw7
CisgICAgICAgIH0gY2F0Y2ggKGUpIHsKKyAgICAgICAgICAgIGlmIChlID09IEJyZWFrRXhjZXB0
aW9uIHx8IGUgPT0gQ29udGludWVFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3
IEVycm9yKCJTaG91bGQgbm90IHNlZSBicmVhay9jb250aW51ZSBhdCBmdW5jdGlvbiBzY29wZSIp
OworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBSZXR1cm5FeGNlcHRpb24pCisgICAgICAg
ICAgICAgICAgcmV0dXJuIGUudmFsdWU7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9
CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rpb25MaWtlQmxvY2sobm9kZSkKKyAgICB7Cisg
ICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5hcmd1bWVudExpc3QubGVuZ3RoOyArK2kp
CisgICAgICAgICAgICBub2RlLnBhcmFtZXRlcnNbaV0ubFZhbHVlLnZhbHVlID0gbm9kZS5hcmd1
bWVudExpc3RbaV0udmlzaXQodGhpcyk7CisgICAgICAgIHJldHVybiB2aXNpdEZ1bmN0aW9uQm9k
eShub2RlLmJsb2NrKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7
CisgICAgICAgIHRocm93IG5ldyBSZXR1cm5FeGNlcHRpb24obm9kZS52YWx1ZSA/IG5vZGUudmFs
dWUudmlzaXQodGhpcykgOiBudWxsKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRDb21tYUV4cHJl
c3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQ7CisgICAgICAgIGZvciAobGV0
IGV4cHJlc3Npb24gb2Ygbm9kZS5saXN0KQorICAgICAgICAgICAgcmVzdWx0ID0gZXhwcmVzc2lv
bi52aXNpdCh0aGlzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAg
dmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5vZGUudmFyaWFi
bGUuZVB0cjsKKyAgICB9CisgICAgCisgICAgdmlzaXRJbnRMaXRlcmFsKG5vZGUpCisgICAgewor
ICAgICAgICByZXR1cm4gRVB0ci5ib3gobmV3IEVJbnQodGhpcy5fcHJvZ3JhbS5pbnRyaW5zaWNz
LmludDMyLCBub2RlLnZhbHVlKSk7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2FsbEV4cHJlc3Np
b24obm9kZSkKKyAgICB7CisgICAgICAgIC8vIFdlIGV2YWx1YXRlIGlubGluZWQgQVNUcywgc28g
dGhpcyBjYW4gb25seSBiZSBhIG5hdGl2ZSBjYWxsLgorICAgICAgICBsZXQgY2FsbEFyZ3VtZW50
cyA9IG5vZGUuYXJndW1lbnRMaXN0Lm1hcChhcmd1bWVudCA9PiB7CisgICAgICAgICAgICBsZXQg
cmVzdWx0ID0gYXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgICAgICAgICBpZiAoIXJlc3VsdCkK
KyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk51bGwgcmVzdWx0IGZyb20gIiArIGFy
Z3VtZW50KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0pOworICAgICAg
ICByZXR1cm4gbm9kZS5mdW5jLmltcGxlbWVudGF0aW9uKGNhbGxBcmd1bWVudHMsIG5vZGUpOwor
ICAgIH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRXhwcmVzc2lvbi5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9FeHByZXNzaW9uLmpzCShub25leGlzdGVudCkKKysr
IFRvb2xzL0FycmF5TGFuZ1JJL0V4cHJlc3Npb24uanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMg
cmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFO
VElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJS
QU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisg
KiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBP
UgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElO
Q0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdF
UyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJT
VElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJ
VFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBU
SEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJ
TElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJ
U0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVO
IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVz
ZSBzdHJpY3QiOworCitjbGFzcyBFeHByZXNzaW9uIGV4dGVuZHMgVmFsdWUgeworICAgIGNvbnN0
cnVjdG9yKG9yaWdpbikKKyAgICB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuX29y
aWdpbiA9IG9yaWdpbjsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRo
aXMuX29yaWdpbjsgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRmllbGQuanMJKG5vbmV4aXN0ZW50KQorKysgVG9v
bHMvQXJyYXlMYW5nUkkvRmllbGQuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBGaWVsZCB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQor
ICAgIHsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1l
ID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQorICAgIAorICAgIGdl
dCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgbmFtZSgpIHsgcmV0
dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0K
KyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsg
IiAiICsgdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmMu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuYy5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgRnVuYyBleHRlbmRzIE5vZGUgeworICAgIGNvbnN0cnVjdG9yKG5h
bWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKQorICAgIHsKKyAgICAg
ICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuX3Jl
dHVyblR5cGUgPSByZXR1cm5UeXBlOworICAgICAgICB0aGlzLl90eXBlUGFyYW1ldGVycyA9IHR5
cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAg
ICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0
IHJldHVyblR5cGUoKSB7IHJldHVybiB0aGlzLl9yZXR1cm5UeXBlOyB9CisgICAgZ2V0IHR5cGVQ
YXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQgcGFy
YW1ldGVycygpIHsgcmV0dXJuIHRoaXMuX3BhcmFtZXRlcnM7IH0KKyAgICBnZXQgcGFyYW1ldGVy
VHlwZXMoKSB7IHJldHVybiB0aGlzLnBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0
ZXIudHlwZSk7IH0KKyAgICAKKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIEZ1bmM7IH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5yZXR1cm5UeXBlICsg
IiAiICsgdGhpcy5uYW1lICsgIjwiICsgdGhpcy50eXBlUGFyYW1ldGVycyArICI+KCIgKyB0aGlz
LnBhcmFtZXRlcnMgKyAiKSI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9G
dW5jRGVmLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNEZWYuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0RlZi5qcwkod29ya2luZyBjb3B5
KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4g
QWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv
dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwg
YXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICog
YXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFp
biB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMg
aW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHBy
b3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBS
T1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1Q
TElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJ
TVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBB
UlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBB
UFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ
TkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVO
VElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVN
RU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBP
UgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBB
TkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBT
VFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RI
RVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09G
VFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0Uu
IAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmNEZWYgZXh0ZW5kcyBGdW5jIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBw
YXJhbWV0ZXJzLCBib2R5KQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmV0dXJuVHlwZSwg
dHlwZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmln
aW47CisgICAgICAgIHRoaXMuYm9keSA9IGJvZHk7CisgICAgfQorICAgIAorICAgIGdldCBvcmln
aW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAg
eworICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgeyAiICsgdGhpcy5ib2R5ICsg
IiB9IjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNJbnN0YW50aWF0
b3IuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY0luc3RhbnRpYXRvci5q
cwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9GdW5jSW5zdGFudGlhdG9yLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIw
MTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9u
IGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICog
bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBj
b25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBj
b2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJl
ZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl
ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMg
U09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICog
RVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5P
IEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9S
IEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZ
LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRP
LAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBP
RiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhP
V0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIg
SU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVH
TElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQor
ICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBP
RiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgRnVuY0luc3RhbnRp
YXRvciB7CisgICAgY29uc3RydWN0b3IoKQorICAgIHsKKyAgICAgICAgdGhpcy5faW5zdGFuY2Vz
ID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICAvLyBSZXR1cm5zIGEgRnVuYyBvYmplY3Qg
dGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIGEgcGFydGljdWxhciBzeXN0ZW0gb2YgdHlwZSBhcmd1
bWVudHMuCisgICAgZ2V0VW5pcXVlKGZ1bmMsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAg
ICBpZiAoIWZ1bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZ1
bmM7CisgICAgICAgIAorICAgICAgICBsZXQgaW5zdGFuY2VzID0gdGhpcy5faW5zdGFuY2VzLmdl
dChmdW5jKTsKKyAgICAgICAgaWYgKCFmdW5jdGlvbnMpCisgICAgICAgICAgICB0aGlzLl9mdW5j
dGlvbnMuc2V0KGZ1bmMsIGZ1bmN0aW9ucyA9IFtdKTsKKyAgICAgICAgCisgICAgICAgIGZvciAo
bGV0IGluc3RhbmNlIG9mIGluc3RhbmNlcykgeworICAgICAgICAgICAgbGV0IG9rID0gdHJ1ZTsK
KyAgICAgICAgICAgIGZvciAobGV0IGkgPSBpbnN0YW5jZS50eXBlQXJndW1lbnRzLmxlbmd0aDsg
aS0tOykgeworICAgICAgICAgICAgICAgIGlmICghaW5zdGFuY2UudHlwZUFyZ3VtZW50c1tpXS5l
cXVhbHModHlwZUFyZ3VtZW50c1tpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgb2sgPSBmYWxz
ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAg
ICAgICAgfQorICAgICAgICAgICAgaWYgKCFvaykKKyAgICAgICAgICAgICAgICBjb250aW51ZTsK
KyAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5mdW5jOworICAgICAgICB9CisgICAgICAgIAor
ICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gU3Vic3RpdHV0aW9uLm1hcHBpbmcoZnVuYy50eXBl
UGFyYW1ldGVycywgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIGxldCByZXN1bHRpbmdGdW5jID0g
bmV3IEZ1bmNEZWYoCisgICAgICAgICAgICBmdW5jLm9yaWdpbiwgZnVuYy5uYW1lLAorICAgICAg
ICAgICAgZnVuYy5yZXR1cm5UeXBlLnZpc2l0KHN1YnN0aXR1dGlvbiksCisgICAgICAgICAgICBb
XSwgLy8gV2UncmUgaW5zdGFudGlhdGVkIHNvIHdlIG5vIGxvbmdlciB0YWtlIHR5cGUgcGFyYW1l
dGVycy4KKyAgICAgICAgICAgIHBhcmFtZXRlcnMubWFwKHBhcmFtZXRlciA9PiBwYXJhbWV0ZXIu
dmlzaXQoc3Vic3RpdHV0aW9uKSksCisgICAgICAgICAgICBib2R5LnZpc2l0KHN1YnN0aXR1dGlv
bikpOworICAgICAgICBsZXQgaW5zdGFuY2UgPSB7ZnVuYzogcmVzdWx0aW5nRnVuYywgdHlwZUFy
Z3VtZW50c307CisgICAgICAgIGluc3RhbmNlcy5wdXNoKGluc3RhbmNlKTsKKyAgICAgICAgcmV0
dXJuIGZ1bmM7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9GdW5jUGFyYW1l
dGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0Z1bmNQYXJhbWV0ZXIuanMJ
KG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY1BhcmFtZXRlci5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEZ1bmNQYXJhbWV0ZXIgZXh0
ZW5kcyBWYWx1ZSB7CisgICAgLy8gVGhlIG5hbWUgaXMgb3B0aW9uYWwuIEl0J3MgT0sgZm9yIGl0
IHRvIGJlIG51bGwhCisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBlKQorICAgIHsK
KyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAg
ICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5fdHlwZSA9IHR5cGU7CisgICAgfQor
ICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQg
bmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRo
aXMuX3R5cGU7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICBpZiAoIXRo
aXMubmFtZSkKKyAgICAgICAgICAgIHJldHVybiAiIiArIHRoaXMudHlwZTsKKyAgICAgICAgcmV0
dXJuIHRoaXMudHlwZSArICIgIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL0Z1bmNTaWduYXR1cmUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvRnVuY1NpZ25hdHVyZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdS
SS9GdW5jU2lnbmF0dXJlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtlQmxvY2suanMKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtlQmxvY2suanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvRnVuY3Rpb25MaWtlQmxvY2suanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBGdW5jdGlvbkxpa2VCbG9jayBleHRlbmRzIFZh
bHVlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIGFyZ3VtZW50TGlzdCwgcGFyYW1ldGVycywg
Ym9keSkKKyAgICB7CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhp
cy5fYXJndW1lbnRMaXN0ID0gYXJndW1lbnRMaXN0OworICAgICAgICB0aGlzLl9wYXJhbWV0ZXJz
ID0gcGFyYW1ldGVyczsKKyAgICAgICAgdGhpcy5fYm9keSA9IGJvZHk7CisgICAgfQorICAgIAor
ICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAgICBnZXQgYXJndW1l
bnRMaXN0KCkgeyByZXR1cm4gdGhpcy5fYXJndW1lbnRMaXN0OyB9CisgICAgZ2V0IHBhcmFtZXRl
cnMoKSB7IHJldHVybiB0aGlzLl9wYXJhbWV0ZXJzOyB9CisgICAgZ2V0IGJvZHkoKSB7IHJldHVy
biB0aGlzLl9ib2R5OyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0
dXJuICJbJl0gKCIgKyBwYXJhbWV0ZXJzICsgIikgeyAiICsgYmxvY2sgKyAiIH0oIiArIGFyZ3Vt
ZW50TGlzdCArICIpIjsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbmxpbmUu
anMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5lLmpzCShub25leGlzdGVu
dCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0lubGluZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCww
ICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0
cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg
YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p
dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK
KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv
dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5
IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRo
ZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdp
dGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ
IEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMu
IE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwg
SU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1B
R0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNV
QlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJP
RklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5Z
IFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB
QklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBB
UklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVW
RU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisi
dXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIGlubGluZShwcm9ncmFtKQoreworICAgIGZvciAobGV0
IGZ1bmNMaXN0IG9mIHByb2dyYW0uZnVuY3Rpb25zLnZhbHVlcygpKSB7CisgICAgICAgIGZvciAo
bGV0IGZ1bmMgb2YgZnVuY0xpc3QpIHsKKyAgICAgICAgICAgIGlmICghZnVuYy50eXBlUGFyYW1l
dGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgX2lubGluZUZ1bmN0aW9uKHByb2dyYW0sIGZ1
bmMsIG5ldyBWaXNpdGluZ1NldChmdW5jKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Z1bmN0
aW9uIF9pbmxpbmVGdW5jdGlvbihwcm9ncmFtLCBmdW5jLCB2aXNpdGluZykKK3sKKyAgICBpZiAo
ZnVuYy50eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fu
bm90IGlubGluZSBmdW5jdGlvbiB0aGF0IGhhcyB0eXBlIHBhcmFtZXRlcnMiKTsKKyAgICBpZiAo
ZnVuYy5pbmxpbmVkIHx8IGZ1bmMuaXNOYXRpdmUpCisgICAgICAgIHJldHVybjsKKyAgICAKKyAg
ICAvLyBUaGlzIGlzIHRoZSBwcmVjaXNlIHRpbWUgd2hlbiB3ZSBjYW4gYnVpbGQgRUJ1ZmZlcnMg
aW4gb3JkZXIgdG8gZ2V0IHRoZW0gdG8gYmUgdW5pcXVlZCBieQorICAgIC8vIHR5cGUgaW5zdGFu
dGlhdGlvbiBidXQgbm90aGluZyBlbHNlLgorICAgIGZ1bmMudmlzaXQobmV3IEVCdWZmZXJCdWls
ZGVyKHByb2dyYW0pKTsKKyAgICAKKyAgICBmdW5jLmJvZHkgPSBmdW5jLmJvZHkudmlzaXQobmV3
IElubGluZXIocHJvZ3JhbSwgZnVuYywgdmlzaXRpbmcpKTsKKyAgICBmdW5jLmlubGluZWQgPSB0
cnVlOworfQorCitmdW5jdGlvbiByZXNvbHZlSW5saW5lZEZ1bmN0aW9uKHByb2dyYW0sIG5hbWUs
IHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlwZXMpCit7CisgICAgbGV0IG92ZXJsb2FkID0gcHJv
Z3JhbS5yZXNvbHZlRnVuY092ZXJsb2FkKG5hbWUsIHR5cGVBcmd1bWVudHMsIGFyZ3VtZW50VHlw
ZXMpOworICAgIGlmICghb3ZlcmxvYWQpCisgICAgICAgIHJldHVybiBudWxsOworICAgIGlmICgh
b3ZlcmxvYWQuZnVuYy50eXBlUGFyYW1ldGVycykKKyAgICAgICAgcmV0dXJuIG92ZXJsb2FkLmZ1
bmM7CisgICAgbGV0IGZ1bmMgPSBwcm9ncmFtLmZ1bmNJbnN0YW50aWF0b3IuZ2V0VW5pcXVlKG92
ZXJsb2FkLmZ1bmMsIG92ZXJsb2FkLnR5cGVBcmd1bWVudHMpOworICAgIF9pbmxpbmVGdW5jdGlv
bihwcm9ncmFtLCBmdW5jLCBuZXcgVmlzaXRpbmdTZXQob3ZlcmxvYWQuZnVuYykpOworICAgIHJl
dHVybiBmdW5jOworfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvSW5saW5lci5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9JbmxpbmVyLmpzCShub25leGlzdGVudCkKKysrIFRv
b2xzL0FycmF5TGFuZ1JJL0lubGluZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0OSBA
QAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2
ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBm
b3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJv
dmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBS
ZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11
c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0
IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAg
IGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBk
aXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJ
TkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywg
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVT
IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQ
T1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICog
Q09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5U
QUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRF
IEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9S
IEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkK
KyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwg
T1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ
TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFE
VklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJp
Y3QiOworCitjbGFzcyBJbmxpbmVyIGV4dGVuZHMgUmV3cml0ZXIgeworICAgIGNvbnN0cnVjdG9y
KHByb2dyYW0sIGZ1bmMsIHZpc2l0aW5nKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAg
ICAgdGhpcy5fcHJvZ3JhbSA9IHByb2dyYW07CisgICAgICAgIHRoaXMuX3Zpc2l0aW5nID0gdmlz
aXRpbmc7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24obm9kZSkKKyAgICB7
CisgICAgICAgIGlmIChub2RlLmZ1bmMuaXNOYXRpdmUpCisgICAgICAgICAgICByZXR1cm4gbm9k
ZTsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2l0aW5nLmRvVmlzaXQobm9kZS5mdW5jLCAoKSA9
PiB7CisgICAgICAgICAgICBsZXQgZnVuYyA9IHRoaXMuX3Byb2dyYW0uZnVuY0luc3RhbnRpYXRv
ci5nZXRVbmlxdWUobm9kZS5mdW5jLCBub2RlLmFjdHVhbFR5cGVBcmd1bWVudHMpOworICAgICAg
ICAgICAgX2lubGluZUZ1bmN0aW9uKHRoaXMuX3Byb2dyYW0sIGZ1bmMsIHRoaXMuX3Zpc2l0aW5n
KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb25MaWtlQmxvY2soCisgICAgICAgICAg
ICAgICAgbm9kZS5vcmlnaW4sCisgICAgICAgICAgICAgICAgbm9kZS5hcmd1bWVudExpc3QubWFw
KGFyZ3VtZW50ID0+IGFyZ3VtZW50LnZpc2l0KHRoaXMpKSwKKyAgICAgICAgICAgICAgICBmdW5j
LnBhcmFtZXRlcnMsIGZ1bmMuYm9keSk7CisgICAgICAgIH0pOworICAgIH0KK30KKwpJbmRleDog
VG9vbHMvQXJyYXlMYW5nUkkvSW5zdGFudGlhdGVJbW1lZGlhdGVzLmpzCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0FycmF5TGFuZ1JJL0luc3RhbnRpYXRlSW1tZWRpYXRlcy5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9JbnN0YW50aWF0ZUltbWVkaWF0ZXMuanMJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJ
bmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp
biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRp
b24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMK
KyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCBy
ZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRp
b25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFs
cyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJ
UyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S
IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor
ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB
TEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVD
VCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNF
UVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9D
VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFU
QSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVT
RUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFD
VCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9S
IE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElT
IFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFN
QUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMg
ZXh0ZW5kcyBSZXdyaXRlciB7CisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAg
ICBub2RlID0gc3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgICAgICByZXR1cm4gbm9kZS5p
bnN0YW50aWF0ZWRUeXBlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9k
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFN0
cnVjdFR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAK
KyAgICB2aXNpdE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBub2RlOwor
ICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVWYXJpYWJsZShub2RlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIG5vZGU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9JbnRMaXRl
cmFsLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0ludExpdGVyYWwuanMJKG5v
bmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW50TGl0ZXJhbC5qcwkod29ya2luZyBj
b3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEludExpdGVyYWwgZXh0ZW5kcyBFeHBy
ZXNzaW9uIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAg
c3VwZXIob3JpZ2luKTsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9CisgICAg
CisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICBnZXQgaXNDb25z
dGV4cHIoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuICIiICsgdGhpcy5fdmFsdWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9JbnRyaW5zaWNzLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L0ludHJpbnNpY3MuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvSW50cmlu
c2ljcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIEludHJp
bnNpY3MgeworICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHRoaXMuX21hcCA9IG5l
dyBNYXAoKTsKKworICAgICAgICAvLyBOT1RFOiBJbnRyaW5zaWMgcmVzb2x1dGlvbiBoYXBwZW5z
IGJlZm9yZSB0eXBlIG5hbWUgcmVzb2x1dGlvbiwgc28gdGhlIHN0cmluZ3Mgd2UgdXNlIGhlcmUK
KyAgICAgICAgLy8gdG8gY2F0Y2ggdGhlIGludHJpbnNpY3MgbXVzdCBiZSBiYXNlZCBvbiB0aGUg
dHlwZSBuYW1lcyB0aGF0IFN0YW5kYXJkTGlicmFyeS5qcyB1c2VzLiBGb3IKKyAgICAgICAgLy8g
ZXhhbXBsZSwgaWYgYSBuYXRpdmUgZnVuY3Rpb24gaXMgZGVjbGFyZWQgdXNpbmcgImludCIgcmF0
aGVyIHRoYW4gImludDMyIiwgdGhlbiB3ZSBtdXN0IHVzZQorICAgICAgICAvLyAiaW50IiBoZXJl
LCBzaW5jZSB3ZSBkb24ndCB5ZXQga25vdyB0aGF0IHRoZXkgYXJlIHRoZSBzYW1lIHR5cGUuCisg
ICAgICAgIAorICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAgIm5hdGl2ZSBwcmlt
aXRpdmUgdHlwZSB2b2lkPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAgICAgICAgICAg
ICAgICB0aGlzLnZvaWQgPSB0eXBlOworICAgICAgICAgICAgICAgIHR5cGUuc2l6ZSA9IDA7Cisg
ICAgICAgICAgICAgICAgdHlwZS5wb3B1bGF0ZURlZmF1bHRWYWx1ZSA9ICgpID0+IHsgfTsKKyAg
ICAgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuX21hcC5zZXQoCisgICAgICAgICAgICAibmF0
aXZlIHByaW1pdGl2ZSB0eXBlIGludDMyPD4iLAorICAgICAgICAgICAgKHR5cGUpID0+IHsKKyAg
ICAgICAgICAgICAgICB0aGlzLmludDMyID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0eXBlLnNp
emUgPSAxOworICAgICAgICAgICAgICAgIHR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUgPSAoYnVm
ZmVyLCBvZmZzZXQpID0+IGJ1ZmZlci5zZXQob2Zmc2V0LCBuZXcgRUludCh0eXBlLCAwKSk7Cisg
ICAgICAgICAgICB9KTsKKworICAgICAgICB0aGlzLl9tYXAuc2V0KAorICAgICAgICAgICAgIm5h
dGl2ZSBwcmltaXRpdmUgdHlwZSBkb3VibGU8PiIsCisgICAgICAgICAgICAodHlwZSkgPT4gewor
ICAgICAgICAgICAgICAgIHRoaXMuZG91YmxlID0gdHlwZTsKKyAgICAgICAgICAgICAgICB0eXBl
LnNpemUgPSAxOworICAgICAgICAgICAgICAgIHR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUgPQor
ICAgICAgICAgICAgICAgICAgICAoYnVmZmVyLCBvZmZzZXQpID0+IGJ1ZmZlci5zZXQob2Zmc2V0
LCBuZXcgRUZsb2F0KHR5cGUsIDApKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAKKyAgICAg
ICAgdGhpcy5fbWFwLnNldCgKKyAgICAgICAgICAgICJuYXRpdmUgaW50IG9wZXJhdG9yKzw+KGlu
dCxpbnQpIiwKKyAgICAgICAgICAgIChmdW5jKSA9PiB7CisgICAgICAgICAgICAgICAgZnVuYy5p
bXBsZW1lbnRhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIChbbGVmdCwgcmlnaHRdKSA9PiBF
UHRyLmJveChsZWZ0LmxvYWRWYWx1ZSgpLmFkZChyaWdodC5sb2FkVmFsdWUoKSkpOworICAgICAg
ICAgICAgfSk7CisgICAgfQorICAgIAorICAgIGFkZCh0aGluZykKKyAgICB7CisgICAgICAgIGxl
dCBpbnRyaW5zaWMgPSB0aGlzLl9tYXAuZ2V0KHRoaW5nLnRvU3RyaW5nKCkpOworICAgICAgICBp
ZiAoIWludHJpbnNpYykKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcih0aGluZy5v
cmlnaW4ub3JpZ2luU3RyaW5nLCAiVW5yZWNvZ25pemVkIGludHJpbnNpYzogIiArIHRoaW5nKTsK
KyAgICAgICAgaW50cmluc2ljKHRoaW5nKTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL0xleGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIExleGVyIHsKKyAgICBjb25zdHJ1Y3Rv
cihvcmlnaW4sIGxpbmVOdW1iZXJPZmZzZXQsIHRleHQpCisgICAgeworICAgICAgICB0aGlzLl9v
cmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX2xpbmVOdW1iZXJPZmZzZXQgPSBsaW5lTnVt
YmVyT2Zmc2V0OworICAgICAgICB0aGlzLl90ZXh0ID0gdGV4dDsKKyAgICAgICAgdGhpcy5faW5k
ZXggPSAwOworICAgICAgICB0aGlzLl9zdGFjayA9IFtdOworICAgIH0KKyAgICAKKyAgICBnZXQg
bGluZU51bWJlcigpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5saW5lTnVtYmVyRm9ySW5k
ZXgodGhpcy5faW5kZXgpOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4g
dGhpcy5fb3JpZ2luOyB9CisgICAgCisgICAgZ2V0IG9yaWdpblN0cmluZygpCisgICAgeworICAg
ICAgICByZXR1cm4gdGhpcy5fb3JpZ2luICsgIjoiICsgKHRoaXMubGluZU51bWJlciArIDEpOwor
ICAgIH0KKyAgICAKKyAgICBsaW5lTnVtYmVyRm9ySW5kZXgoaW5kZXgpCisgICAgeworICAgICAg
ICBsZXQgbWF0Y2hlcyA9IHRoaXMuX3RleHQuc3Vic3RyaW5nKDAsIGluZGV4KS5tYXRjaCgvXG4v
Zyk7CisgICAgICAgIHJldHVybiAobWF0Y2hlcyA/IG1hdGNoZXMubGVuZ3RoIDogMCkgKyB0aGlz
Ll9saW5lTnVtYmVyT2Zmc2V0OworICAgIH0KKyAgICAKKyAgICBnZXQgc3RhdGUoKSB7IHJldHVy
biB7aW5kZXg6IHRoaXMuX2luZGV4LCBzdGFjazogdGhpcy5fc3RhY2suY29uY2F0KCl9OyB9Cisg
ICAgc2V0IHN0YXRlKHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5faW5kZXggPSB2YWx1ZS5p
bmRleDsKKyAgICAgICAgdGhpcy5fc3RhY2sgPSB2YWx1ZS5zdGFjazsKKyAgICB9CisgICAgCisg
ICAgbmV4dCgpCisgICAgeworICAgICAgICBpZiAodGhpcy5fc3RhY2subGVuZ3RoKQorICAgICAg
ICAgICAgcmV0dXJuIHRoaXMuX3N0YWNrLnBvcCgpOworICAgICAgICAKKyAgICAgICAgaWYgKHRo
aXMuX2luZGV4ID49IHRoaXMuX3RleHQubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7
CisgICAgICAgIAorICAgICAgICBjb25zdCBpc0NDb21tZW50QmVnaW4gPSAvXC9cKi87CisgICAg
ICAgIGNvbnN0IGlzQ1BsdXNQbHVzQ29tbWVudEJlZ2luID0gL1wvXC8vOworICAgICAgICAKKyAg
ICAgICAgbGV0IHJlc3VsdCA9IChraW5kKSA9PiB7CisgICAgICAgICAgICBsZXQgdGV4dCA9IFJl
Z0V4cC5sYXN0TWF0Y2g7CisgICAgICAgICAgICBsZXQgdG9rZW4gPSBuZXcgTGV4ZXJUb2tlbih0
aGlzLCB0aGlzLl9pbmRleCwga2luZCwgdGV4dCk7CisgICAgICAgICAgICB0aGlzLl9pbmRleCAr
PSB0ZXh0Lmxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfTsKKwor
ICAgICAgICBsZXQgcmVsZXZhbnRUZXh0OworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAg
ICByZWxldmFudFRleHQgPSB0aGlzLl90ZXh0LnN1YnN0cmluZyh0aGlzLl9pbmRleCk7CisgICAg
ICAgICAgICBpZiAoL15ccysvLnRlc3QocmVsZXZhbnRUZXh0KSkgeworICAgICAgICAgICAgICAg
IHRoaXMuX2luZGV4ICs9IFJlZ0V4cC5sYXN0TWF0Y2gubGVuZ3RoOworICAgICAgICAgICAgICAg
IGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKC9eXC9cKi8udGVzdChy
ZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gcmVsZXZhbnRU
ZXh0LnNlYXJjaCgvXCpcLy8pOworICAgICAgICAgICAgICAgIGlmIChlbmRJbmRleCA8IDApCisg
ICAgICAgICAgICAgICAgICAgIHRoaXMuZmFpbCgiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTsKKyAg
ICAgICAgICAgICAgICB0aGlzLl9pbmRleCArPSBlbmRJbmRleDsKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgvXlwvXC8uKi8udGVzdChy
ZWxldmFudFRleHQpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5faW5kZXggKz0gUmVnRXhwLmxh
c3RNYXRjaC5sZW5ndGg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9
CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKHRo
aXMuX2luZGV4ID49IHRoaXMuX3RleHQubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7
CisgICAgICAgIAorICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlzIGRvIFVuaWNvZGUuCisgICAg
ICAgIGlmICgvXlteXGRcV11cdyovLnRlc3QocmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJl
dHVybiByZXN1bHQoImlkZW50aWZpZXIiKTsKKworICAgICAgICBpZiAoL15bMC05XSsvLnRlc3Qo
cmVsZXZhbnRUZXh0KSkKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQoImludExpdGVyYWwiKTsK
KworICAgICAgICAvLyBGSVhNRTogTWFrZSB0aGlzIGhhbmRsZSBleHAtZm9ybSBsaXRlcmFscyBs
aWtlIDFlMS4KKyAgICAgICAgaWYgKC9eKFswLTldKlwuWzAtOV0rKXwoWzAtOV0rXC5bMC05XSop
Ly50ZXN0KHJlbGV2YW50VGV4dCkpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0KCJkb3VibGVM
aXRlcmFsIik7CisgICAgICAgIAorICAgICAgICBpZiAoL14oc3RydWN0fHByb3RvY29sfHR5cGV8
aWZ8ZWxzZXxlbnVtfGNvbnRpbnVlfGJyZWFrfHN3aXRjaHxjYXNlfGRlZmF1bHR8Zm9yfHdoaWxl
fGRvfHJldHVybnxzaXplb2Z8Y29uc3RhbnR8ZGV2aWNlfHRocmVhZGdyb3VwfHRocmVhZHxvcGVy
YXRvcnxudWxsKS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3Vs
dCgia2V5d29yZCIpOworICAgICAgICAKKyAgICAgICAgaWYgKC9eKFt7fSgpXFtcXT86PSsqXC8s
LiUhfl4mfDw+XFw7LV18LT58PT58PD18PT18IT18XCs9fC09fFwqPXxcLz18JT18Xj18XHw9fCY9
KS8udGVzdChyZWxldmFudFRleHQpKQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCgicHVuY3R1
YXRpb24iKTsKKyAgICAgICAgCisgICAgICAgIGxldCByZW1haW5pbmcgPSByZWxldmFudFRleHQu
c3Vic3RyaW5nKDAsIDIwKS5zcGxpdCgvXHMvKVswXTsKKyAgICAgICAgaWYgKCFyZW1haW5pbmcu
bGVuZ3RoKQorICAgICAgICAgICAgcmVtYWluaW5nID0gcmVsZXZhbnRUZXh0LnN1YnN0cmluZygw
LCAyMCk7CisgICAgICAgIHRoaXMuZmFpbCgiVW5yZWNvZ25pemVkIHRva2VuIGJlZ2lubmluZyB3
aXRoOiAiICsgcmVtYWluaW5nKTsKKyAgICB9CisgICAgCisgICAgcHVzaCh0b2tlbikKKyAgICB7
CisgICAgICAgIHRoaXMuX3N0YWNrLnB1c2godG9rZW4pOworICAgIH0KKyAgICAKKyAgICBwZWVr
KCkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLm5leHQoKTsKKyAgICAgICAgdGhp
cy5wdXNoKHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAg
IGZhaWwoZXJyb3IpCisgICAgeworICAgICAgICB0aHJvdyBuZXcgQUxTeW50YXhFcnJvcih0aGlz
Lm9yaWdpblN0cmluZywgZXJyb3IpOworICAgIH0KKyAgICAKKyAgICBiYWNrdHJhY2tpbmdTY29w
ZShjYWxsYmFjaykKKyAgICB7CisgICAgICAgIGxldCBzdGF0ZSA9IHRoaXMuc3RhdGU7CisgICAg
ICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2soKTsKKyAgICAgICAgfSBjYXRj
aCAoZSkgeworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBTFN5bnRheEVycm9yKSB7Cisg
ICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOworICAgICAgICAgICAgICAgIHJldHVy
biBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfQor
ICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL0xleGVyVG9rZW4uanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvTGV4ZXJUb2tlbi5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9MZXhlclRva2VuLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEs
NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICog
MS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBj
b3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBm
b2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9y
bSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisg
KiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0
aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQ
TEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICog
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ug
c3RyaWN0IjsKKworY2xhc3MgTGV4ZXJUb2tlbiB7CisgICAgY29uc3RydWN0b3IobGV4ZXIsIGlu
ZGV4LCBraW5kLCB0ZXh0KQorICAgIHsKKyAgICAgICAgdGhpcy5fbGV4ZXIgPSBsZXhlcjsKKyAg
ICAgICAgdGhpcy5faW5kZXggPSBpbmRleDsKKyAgICAgICAgdGhpcy5fa2luZCA9IGtpbmQ7Cisg
ICAgICAgIHRoaXMuX3RleHQgPSB0ZXh0OworICAgIH0KKyAgICAKKyAgICBnZXQga2luZCgpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5fa2luZDsKKyAgICB9CisgICAgCisgICAgZ2V0IHRl
eHQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX3RleHQ7CisgICAgfQorICAgIAorICAg
IGdldCBvcmlnaW4oKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuX2xleGVyLm9yaWdpbjsK
KyAgICB9CisgICAgCisgICAgZ2V0IGluZGV4KCkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlz
Ll9pbmRleDsKKyAgICB9CisgICAgCisgICAgZ2V0IGxpbmVOdW1iZXIoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMuX2xleGVyLmxpbmVOdW1iZXJGb3JJbmRleCh0aGlzLl9pbmRleCk7Cisg
ICAgfQorICAgIAorICAgIGdldCBvcmlnaW5TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJu
IHRoaXMub3JpZ2luICsgIjoiICsgKHRoaXMubGluZU51bWJlciArIDEpOworICAgIH0KKyAgICAK
KyAgICB0b1N0cmluZygpCisgICAgeworICAgICAgICByZXR1cm4gIkxleGVyVG9rZW4oIiArIHRo
aXMua2luZCArICIsICIgKyB0aGlzLnRleHQgKyAiLCAiICsgdGhpcy5saW5lTnVtYmVyICsgIiki
OworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCj09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCShub25leGlzdGVudCkK
KysrIFRvb2xzL0FycmF5TGFuZ1JJL05hbWVDb250ZXh0LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJp
Z2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBl
cm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1l
dDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu
ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNl
LCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGlu
IHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVk
IHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVE
IEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBX
QVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVE
IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VM
QVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJ
TkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVD
VCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBE
QU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9G
IFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICog
UFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04g
QU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1Qg
TElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNF
KSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUs
IEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICov
CisidXNlIHN0cmljdCI7CisKK2NvbnN0IE5vdEZ1bmMgPSBTeW1ib2woKTsKKworZnVuY3Rpb24g
aXNXaWxkY2FyZEtpbmQoa2luZCkKK3sKKyAgICByZXR1cm4ga2luZCA9PSBOb3RGdW5jOworfQor
CitjbGFzcyBOYW1lQ29udGV4dCB7CisgICAgY29uc3RydWN0b3IoZGVsZWdhdGUpCisgICAgewor
ICAgICAgICB0aGlzLl9mdW5jTWFwID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9tYXAgPSBu
ZXcgTWFwKCk7CisgICAgICAgIHRoaXMuX2RlZmluZWQgPSBuZXcgU2V0KCk7CisgICAgICAgIHRo
aXMuX2N1cnJlbnRTdGF0ZW1lbnQgPSBudWxsOworICAgICAgICB0aGlzLl9kZWxlZ2F0ZSA9IGRl
bGVnYXRlOworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbnVsbDsKKyAgICAgICAgdGhpcy5f
cHJvZ3JhbSA9IG51bGw7CisgICAgfQorICAgIAorICAgIG1hcEZvcihraW5kKQorICAgIHsKKyAg
ICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICAgIGNhc2UgTm90RnVuYzoKKyAgICAgICAgY2Fz
ZSBWYWx1ZToKKyAgICAgICAgY2FzZSBUeXBlOgorICAgICAgICBjYXNlIFByb3RvY29sOgorICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuX21hcDsKKyAgICAgICAgY2FzZSBGdW5jOgorICAgICAgICAg
ICAgcmV0dXJuIHRoaXMuX2Z1bmNNYXA7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0
aHJvdyBuZXcgRXJyb3IoIkJhZCBraW5kOiAiICsga2luZCk7CisgICAgICAgIH0KKyAgICB9Cisg
ICAgCisgICAgYWRkKHRoaW5nKQorICAgIHsKKyAgICAgICAgaWYgKCF0aGluZy5uYW1lKQorICAg
ICAgICAgICAgcmV0dXJuOworICAgICAgICAKKyAgICAgICAgaWYgKHRoaW5nLmlzTmF0aXZlKSB7
CisgICAgICAgICAgICBpZiAoIXRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICAgICAgdGhy
b3cgbmV3IEVycm9yKCJOYXRpdmUgZnVuY3Rpb24gaW4gYSBzY29wZSB0aGF0IGRvZXMgbm90IHJl
Y29nbml6ZSBpbnRyaW5zaWNzIik7CisgICAgICAgICAgICB0aGlzLl9pbnRyaW5zaWNzLmFkZCh0
aGluZyk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmICh0aGluZy5raW5kID09IEZ1
bmMpIHsKKyAgICAgICAgICAgIGxldCBhcnJheSA9IHRoaXMuX2Z1bmNNYXAuZ2V0KHRoaW5nLm5h
bWUpOworICAgICAgICAgICAgaWYgKCFhcnJheSkKKyAgICAgICAgICAgICAgICB0aGlzLl9mdW5j
TWFwLnNldCh0aGluZy5uYW1lLCBhcnJheSA9IFtdKTsKKyAgICAgICAgICAgIGFycmF5LnB1c2go
dGhpbmcpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlz
Ll9tYXAuaGFzKHRoaW5nLm5hbWUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9y
KHRoaW5nLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJEdXBsaWNhdGUgbmFtZTogIiArIHRoaW5nLm5h
bWUpOworICAgICAgICB0aGlzLl9tYXAuc2V0KHRoaW5nLm5hbWUsIHRoaW5nKTsKKyAgICB9Cisg
ICAgCisgICAgZ2V0KGtpbmQsIG5hbWUpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhp
cy5tYXBGb3Ioa2luZCkuZ2V0KG5hbWUpOworICAgICAgICBpZiAoIXJlc3VsdCAmJiB0aGlzLl9k
ZWxlZ2F0ZSkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWxlZ2F0ZS5nZXQoa2luZCwgbmFt
ZSk7CisgICAgICAgIGlmIChyZXN1bHQgJiYgIWlzV2lsZGNhcmRLaW5kKGtpbmQpICYmIHJlc3Vs
dC5raW5kICE9IGtpbmQpCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgcmV0dXJu
IHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZ2V0IGN1cnJlbnRTdGF0ZW1lbnQoKQorICAgIHsK
KyAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTdGF0ZW1lbnQpCisgICAgICAgICAgICByZXR1cm4g
dGhpcy5fY3VycmVudFN0YXRlbWVudDsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAg
ICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRlLmN1cnJlbnRTdGF0ZW1lbnQ7CisgICAgICAg
IHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBpc0RlZmluZWQodGhpbmcpCisgICAgewor
ICAgICAgICByZXR1cm4gdGhpcy5fZGVmaW5lZC5oYXModGhpbmcpCisgICAgICAgICAgICB8fCAo
dGhpcy5fZGVsZWdhdGUgJiYgdGhpcy5fZGVsZWdhdGUuaXNEZWZpbmVkKHRoaW5nKSk7CisgICAg
fQorICAgIAorICAgIGRlZmluZSh0aGluZykKKyAgICB7CisgICAgICAgIHRoaXMuX2RlZmluZWQu
YWRkKHRoaW5nKTsKKyAgICB9CisgICAgCisgICAgZGVmaW5lQWxsKCkKKyAgICB7CisgICAgICAg
IGZvciAobGV0IHRoaW5nIG9mIHRoaXMpCisgICAgICAgICAgICB0aGlzLmRlZmluZSh0aGluZyk7
CisgICAgfQorICAgIAorICAgIGRvU3RhdGVtZW50KHN0YXRlbWVudCwgY2FsbGJhY2spCisgICAg
eworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gc3RhdGVtZW50OworICAgICAgICBj
YWxsYmFjaygpOworICAgICAgICB0aGlzLl9jdXJyZW50U3RhdGVtZW50ID0gbnVsbDsKKyAgICAg
ICAgdGhpcy5kZWZpbmUoc3RhdGVtZW50KTsKKyAgICB9CisgICAgCisgICAgcmVjb2duaXplSW50
cmluc2ljcygpCisgICAgeworICAgICAgICB0aGlzLl9pbnRyaW5zaWNzID0gbmV3IEludHJpbnNp
Y3MoKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGludHJpbnNpY3MoKQorICAgIHsKKyAgICAgICAg
aWYgKHRoaXMuX2ludHJpbnNpY3MpCisgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50cmluc2lj
czsKKyAgICAgICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMu
X2RlbGVnYXRlLmludHJpbnNpY3M7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAK
KyAgICBzZXQgcHJvZ3JhbSh2YWx1ZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Byb2dyYW0gPSB2
YWx1ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHByb2dyYW0oKQorICAgIHsKKyAgICAgICAgaWYg
KHRoaXMuX3Byb2dyYW0pCisgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvZ3JhbTsKKyAgICAg
ICAgaWYgKHRoaXMuX2RlbGVnYXRlKQorICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGVnYXRl
LnByb2dyYW07CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICAqW1N5bWJv
bC5pdGVyYXRvcl0oKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgbWFwIG9mIHRoaXMuX21hcC52
YWx1ZXMoKSkgeworICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiB0aGlzLl90eXBlcy52YWx1
ZXMoKSkKKyAgICAgICAgICAgICAgICB5aWVsZCB0eXBlOworICAgICAgICB9CisgICAgfQorfQpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvTmFtZVJlc29sdmVyLmpzCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRv
b2xzL0FycmF5TGFuZ1JJL05hbWVSZXNvbHZlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9OYW1lUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxOTgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworLy8gVGhpcyBvbmx5IHJlc29sdmVzIG5hbWVzLiBBZnRlciB0aGlzIHBoYXNlIHJ1
bnMsIGFsbCBuYW1lcyB3aWxsIGJlIHJlc29sdmVkLiBUaGlzIG1lYW5zIHRoYXQgYWxsCisvLyBY
WVpSZWYgb2JqZWN0cyBub3cga25vdyB3aG8gdGhleSByZXNvbHZlIHRvLiBUaGlzIGRvZXMgbm90
IHlldCBhbGxvdyB0eXBlIGFuYWx5c2lzLCBiZWNhdXNlIHRoZXJlCisvLyBhcmUgc3RpbGwgVHlw
ZURlZnMuIFRoaXMgdGhyb3dzIHR5cGUgZXJyb3JzIGZvciBmYWlsZWQgbmFtZSByZXNvbHV0aW9u
cyBhbmQgZm9yIHRoaW5ncyB0aGF0IGFyZQorLy8gbW9yZSBjb252ZW5pZW50IHRvIGNoZWNrIGhl
cmUgdGhhbiBpbiB0aGUgQ2hlY2tlci4gVGhpcyB1c3VhbGx5IGludm9sdmVzIHRoaW5ncyB0aGF0
IG5lZWQgdG8gYmUKKy8vIGNoZWNrZWQgYmVmb3JlIFR5cGVSZWZUb1R5cGVEZWZTa2lwcGVyLgor
Y2xhc3MgTmFtZVJlc29sdmVyIGV4dGVuZHMgVmlzaXRvciB7CisgICAgLy8gSXQncyB0b3RhbGx5
IE9LIHRvIGluc3RhbnRpYXRlIHRoaXMgd2l0aCB6ZXJvIGFyZ3VtZW50cyAoaS5lLiBwYXNzaW5n
IHVuZGVmaW5lZCBmb3IgYm90aCBvZgorICAgIC8vIHRoZW0pIGlmIHlvdSdyZSBjcmVhdGluZyBh
IENoZWNrZXIgdG8gdmlzaXQgYSBQcm9ncmFtLgorICAgIGNvbnN0cnVjdG9yKG5hbWVDb250ZXh0
KQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy5fbmFtZUNvbnRleHQgPSBu
YW1lQ29udGV4dDsKKyAgICB9CisgICAgCisgICAgdmlzaXRQcm9ncmFtKG5vZGUpCisgICAgewor
ICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRl
eHQpOworICAgICAgICBuYW1lQ29udGV4dC5wcm9ncmFtID0gbm9kZTsKKyAgICAgICAgbmFtZUNv
bnRleHQucmVjb2duaXplSW50cmluc2ljcygpOworICAgICAgICBub2RlLmludHJpbnNpY3MgPSBu
YW1lQ29udGV4dC5pbnRyaW5zaWNzOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9k
ZS50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICBuYW1lQ29udGV4dC5hZGQoc3RhdGVt
ZW50KTsKKyAgICAgICAgbGV0IGNoZWNrZXIgPSBuZXcgTmFtZVJlc29sdmVyKG5hbWVDb250ZXh0
KTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUudG9wTGV2ZWxTdGF0ZW1lbnRz
KQorICAgICAgICAgICAgbmFtZUNvbnRleHQuZG9TdGF0ZW1lbnQoc3RhdGVtZW50LCAoKSA9PiBz
dGF0ZW1lbnQudmlzaXQoY2hlY2tlcikpOworICAgIH0KKyAgICAKKyAgICBfdmlzaXRUeXBlUGFy
YW1ldGVyc0FuZEJ1aWxkTmFtZUNvbnRleHQobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1l
Q29udGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIGZv
ciAobGV0IHR5cGVQYXJhbWV0ZXIgb2Ygbm9kZS50eXBlUGFyYW1ldGVycykgeworICAgICAgICAg
ICAgbmFtZUNvbnRleHQuYWRkKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICAgICAgdHlwZVBhcmFt
ZXRlci52aXNpdCh0aGlzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZUNvbnRleHQ7
CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgbGV0IGNo
ZWNrZXIgPSBuZXcgTmFtZVJlc29sdmVyKHRoaXMuX3Zpc2l0VHlwZVBhcmFtZXRlcnNBbmRCdWls
ZE5hbWVDb250ZXh0KG5vZGUpKTsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBlLnZpc2l0KGNoZWNr
ZXIpOworICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAg
ICAgICAgICAgcGFyYW1ldGVyLnZpc2l0KGNoZWNrZXIpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dEZ1bmNEZWYobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBjb250ZXh0V2l0aFR5cGVQYXJhbWV0
ZXJzID0gdGhpcy5fdmlzaXRUeXBlUGFyYW1ldGVyc0FuZEJ1aWxkTmFtZUNvbnRleHQobm9kZSk7
CisgICAgICAgIGxldCBjaGVja2VyV2l0aFR5cGVQYXJhbWV0ZXJzID0gbmV3IE5hbWVSZXNvbHZl
cihjb250ZXh0V2l0aFR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBlLnZp
c2l0KGNoZWNrZXJXaXRoVHlwZVBhcmFtZXRlcnMpOworICAgICAgICBsZXQgY29udGV4dFdpdGhQ
YXJhbWV0ZXJzID0gbmV3IE5hbWVDb250ZXh0KGNvbnRleHRXaXRoVHlwZVBhcmFtZXRlcnMpOwor
ICAgICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKSB7CisgICAgICAg
ICAgICBwYXJhbWV0ZXIudmlzaXQoY2hlY2tlcldpdGhUeXBlUGFyYW1ldGVycyk7CisgICAgICAg
ICAgICBjb250ZXh0V2l0aFBhcmFtZXRlcnMuYWRkKHBhcmFtZXRlcik7CisgICAgICAgIH0KKyAg
ICAgICAgbGV0IGNoZWNrZXJXaXRoUGFyYW1ldGVycyA9IG5ldyBOYW1lUmVzb2x2ZXIoY29udGV4
dFdpdGhQYXJhbWV0ZXJzKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0KGNoZWNrZXJXaXRoUGFy
YW1ldGVycyk7CisgICAgfQorICAgIAorICAgIHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAg
ICAgIGxldCBjaGVja2VyID0gbmV3IE5hbWVSZXNvbHZlcihuZXcgTmFtZUNvbnRleHQodGhpcy5f
bmFtZUNvbnRleHQpKTsKKyAgICAgICAgZm9yIChsZXQgc3RhdGVtZW50IG9mIG5vZGUuc3RhdGVt
ZW50cykKKyAgICAgICAgICAgIHN0YXRlbWVudC52aXNpdChjaGVja2VyKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRQcm90b2NvbERlY2wobm9kZSkKKyAgICB7CisgICAgICAgIGxldCBuYW1lQ29u
dGV4dCA9IG5ldyBOYW1lQ29udGV4dCh0aGlzLl9uYW1lQ29udGV4dCk7CisgICAgICAgIG5hbWVD
b250ZXh0LmFkZChub2RlLnR5cGVWYXJpYWJsZSk7CisgICAgICAgIGxldCBjaGVja2VyID0gbmV3
IE5hbWVSZXNvbHZlcihuYW1lQ29udGV4dCk7CisgICAgICAgIGZvciAobGV0IHNpZ25hdHVyZSBv
ZiBub2RlLnNpZ25hdHVyZXMpCisgICAgICAgICAgICBzaWduYXR1cmUudmlzaXQoY2hlY2tlcik7
CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZURlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0
IG5hbWVDb250ZXh0ID0gbmV3IE5hbWVDb250ZXh0KHRoaXMuX25hbWVDb250ZXh0KTsKKyAgICAg
ICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKSB7CisgICAg
ICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgbmFtZUNvbnRl
eHQuYWRkKHR5cGVQYXJhbWV0ZXIpOworICAgICAgICB9CisgICAgICAgIGxldCBjaGVja2VyID0g
bmV3IE5hbWVSZXNvbHZlcihuYW1lQ29udGV4dCk7CisgICAgICAgIG5vZGUudHlwZS52aXNpdChj
aGVja2VyKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRTdHJ1Y3RUeXBlKG5vZGUpCisgICAgewor
ICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBuZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRl
eHQpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlwZVBhcmFtZXRl
cnMpIHsKKyAgICAgICAgICAgIHR5cGVQYXJhbWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgICAg
ICBuYW1lQ29udGV4dC5hZGQodHlwZVBhcmFtZXRlcik7CisgICAgICAgIH0KKyAgICAgICAgbGV0
IGNoZWNrZXIgPSBuZXcgTmFtZVJlc29sdmVyKG5hbWVDb250ZXh0KTsKKyAgICAgICAgZm9yIChs
ZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAgICAgICAgICBmaWVsZC52aXNpdChjaGVja2Vy
KTsKKyAgICB9CisgICAgCisgICAgX3Jlc29sdmVUeXBlQXJndW1lbnRzKHR5cGVBcmd1bWVudHMp
CisgICAgeworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3Ro
OyArK2kpIHsKKyAgICAgICAgICAgIGxldCB0eXBlQXJndW1lbnQgPSB0eXBlQXJndW1lbnRzW2ld
OworICAgICAgICAgICAgaWYgKHR5cGVBcmd1bWVudCBpbnN0YW5jZW9mIFR5cGVPclZhcmlhYmxl
UmVmKSB7CisgICAgICAgICAgICAgICAgbGV0IHRoaW5nID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0
KE5vdEZ1bmMsIHR5cGVBcmd1bWVudC5uYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRoaW5n
KQorICAgICAgICAgICAgICAgICAgICBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4ub3JpZ2lu
U3RyaW5nLCAiQ291bGQgbm90IGZpbmQgdHlwZSBvciB2YXJpYWJsZSBuYW1lZCAiICsgdHlwZUFy
Z3VtZW50Lm5hbWUpOworICAgICAgICAgICAgICAgIGlmICh0aGluZyBpbnN0YW5jZW9mIFZhbHVl
KSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBWYXJpYWJsZVJl
Zih0eXBlQXJndW1lbnQub3JpZ2luLCB0eXBlQXJndW1lbnQubmFtZSk7CisgICAgICAgICAgICAg
ICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudFtpXSA9IG5ldyBUeXBl
UmVmKHR5cGVBcmd1bWVudC5vcmlnaW4sIHR5cGVBcmd1bWVudC5uYW1lLCBbXSk7CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICh0eXBlQXJndW1lbnRbaV0gaW5z
dGFuY2VvZiBWYWx1ZQorICAgICAgICAgICAgICAgICYmICF0eXBlQXJndW1lbnRbaV0uaXNDb25z
dGV4cHIpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2lu
Lm9yaWdpblN0cmluZywgIkV4cGVjdGVkIGNvbnN0ZXhwciIpOworICAgICAgICB9CisgICAgfQor
ICAgIAorICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy5fcmVzb2x2
ZVR5cGVBcmd1bWVudHMobm9kZS50eXBlQXJndW1lbnRzKTsKKyAgICAgICAgCisgICAgICAgIGxl
dCB0eXBlID0gdGhpcy5fbmFtZUNvbnRleHQuZ2V0KFR5cGUsIG5vZGUubmFtZSk7CisgICAgICAg
IGlmICghdHlwZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdp
bi5vcmlnaW5TdHJpbmcsICJDb3VsZCBub3QgZmluZCB0eXBlIG5hbWVkICIgKyBub2RlLm5hbWUp
OworICAgICAgICBpZiAoIXRoaXMuX25hbWVDb250ZXh0LmlzRGVmaW5lZCh0eXBlKSkKKyAgICAg
ICAgICAgIHRocm93IG5ldyBBTFR5cGVFcnJvcihub2RlLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJJ
bGxlZ2FsIGZvcndhcmQgdXNlIG9mIHR5cGUgbmFtZWQgIiArIG5vZGUubmFtZSk7CisgICAgICAg
IG5vZGUudHlwZSA9IHR5cGU7CisgICAgICAgIAorICAgICAgICBpZiAodHlwZS50eXBlUGFyYW1l
dGVycy5sZW5ndGggIT0gbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHRo
cm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiV3JvbmcgbnVtYmVyIG9m
IHR5cGUgYXJndW1lbnRzIik7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZS50eXBl
UGFyYW1ldGVycy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGV0IHBhcmFtZXRlcklzVHlw
ZSA9IHR5cGUudHlwZVBhcmFtZXRlcnNbaV0gaW5zdGFuY2VvZiBUeXBlVmFyaWFibGU7CisgICAg
ICAgICAgICBsZXQgYXJndW1lbnRJc1R5cGUgPSBub2RlLnR5cGVBcmd1bWVudHNbaV0gaW5zdGFu
Y2VvZiBUeXBlOworICAgICAgICAgICAgbm9kZS50eXBlQXJndW1lbnRzW2ldLnZpc2l0KHRoaXMp
OworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcklzVHlwZSAmJiAhYXJndW1lbnRJc1R5cGUpCisg
ICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVycm9yKG9yaWdpbi5vcmlnaW5TdHJpbmcs
ICJFeHBlY3RlZCB0eXBlLCBidXQgZ290IHZhbHVlIGF0IGFyZ3VtZW50ICMiICsgaSk7CisgICAg
ICAgICAgICBpZiAoIXBhcmFtZXRlcklzVHlwZSAmJiBhcmd1bWVudElzVHlwZSkKKyAgICAgICAg
ICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iob3JpZ2luLm9yaWdpblN0cmluZywgIkV4cGVj
dGVkIHZhbHVlLCBidXQgZ290IHR5cGUgYXQgYXJndW1lbnQgIyIgKyBpKTsKKyAgICAgICAgfQor
CisgICAgICAgIHN1cGVyLnZpc2l0VHlwZVJlZihub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRSZWZlcmVuY2VUeXBlKG5vZGUpCisgICAgeworICAgICAgICBsZXQgbmFtZUNvbnRleHQgPSBu
ZXcgTmFtZUNvbnRleHQodGhpcy5fbmFtZUNvbnRleHQpOworICAgICAgICBuYW1lQ29udGV4dC5k
ZWZpbmVBbGwoKTsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdChuZXcgTmFtZVJlc29s
dmVyKG5hbWVDb250ZXh0KSk7CisgICAgfQorICAgIAorICAgIHZpc2l0VmFyaWFibGVSZWYobm9k
ZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl9uYW1lQ29udGV4dC5nZXQoVmFs
dWUsIG5vZGUubmFtZSk7CisgICAgICAgIGlmICghcmVzdWx0KQorICAgICAgICAgICAgdGhyb3cg
bmV3IEFMVHlwZUVycm9yKG5vZGUub3JpZ2luLm9yaWdpblN0cmluZywgIkNvdWxkIG5vdCBmaW5k
IHZhcmlhYmxlIG5hbWVkICIgKyBub2RlLm5hbWUpOworICAgICAgICBub2RlLnZhcmlhYmxlID0g
cmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAg
ICAgbm9kZS5mdW5jID0gdGhpcy5fbmFtZUNvbnRleHQuY3VycmVudFN0YXRlbWVudDsKKyAgICAg
ICAgc3VwZXIudmlzaXRSZXR1cm4obm9kZSk7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2FsbEV4
cHJlc3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMuX3Jlc29sdmVUeXBlQXJndW1lbnRz
KG5vZGUudHlwZUFyZ3VtZW50cyk7CisgICAgICAgIHN1cGVyLnZpc2l0Q2FsbEV4cHJlc3Npb24o
bm9kZSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9OYXRpdmVGdW5jLmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZUZ1bmMuanMJKG5vbmV4aXN0
ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlRnVuYy5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5hdGl2ZUZ1bmMgZXh0ZW5kcyBGdW5jIHsKKyAg
ICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHJldHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBw
YXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgc3VwZXIobmFtZSwgcmV0dXJuVHlwZSwgdHlwZVBh
cmFtZXRlcnMsIHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgfQorICAgIAorICAgIGdldCBvcmlnaW4oKSB7IHJldHVybiB0aGlzLl9vcmlnaW47IH0KKyAg
ICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB0b1N0cmluZygpCisgICAg
eworICAgICAgICByZXR1cm4gIm5hdGl2ZSAiICsgc3VwZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL05hdGl2ZVR5cGUuanMKPT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0g
VG9vbHMvQXJyYXlMYW5nUkkvTmF0aXZlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9OYXRpdmVUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNTcgQEAK
Ky8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVk
LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5D
LiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBP
RiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9T
RSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0
IjsKKworY2xhc3MgTmF0aXZlVHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9y
aWdpbiwgbmFtZSwgaXNQcmltaXRpdmUsIHR5cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAg
c3VwZXIoKTsKKyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9u
YW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5faXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTsKKyAg
ICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSB0eXBlUGFyYW1ldGVyczsKKyAgICB9CisgICAg
CisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1l
KCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJu
IHRoaXMuX2lzUHJpbWl0aXZlOyB9CisgICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4g
dGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQgaXNOYXRpdmUoKSB7IHJldHVybiB0cnVl
OyB9CisgICAgCisgICAgaW5zdGFudGlhdGUodHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAg
IGlmICh0eXBlQXJndW1lbnRzLmxlbmd0aCAhPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkK
KyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiV3JvbmcgbnVtYmVyIG9mIHR5cGUgYXJndW1l
bnRzIHRvIGluc3RhbnRpYXRpb24iKTsKKyAgICAgICAgaWYgKCF0eXBlQXJndW1lbnRzLmxlbmd0
aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICByZXR1cm4gbmV3IE5hdGl2ZVR5
cGVJbnN0YW5jZSh0aGlzLCB0eXBlQXJndW1lbnRzKTsKKyAgICB9CisgICAgCisgICAgdG9TdHJp
bmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuICJuYXRpdmUgIiArICh0aGlzLmlzUHJpbWl0aXZl
ID8gInByaW1pdGl2ZSAiIDogIiIpICsgInR5cGUgIiArIHRoaXMubmFtZSArICI8IiArIHRoaXMu
dHlwZVBhcmFtZXRlcnMgKyAiPiI7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdS
SS9OYXRpdmVUeXBlSW5zdGFuY2UuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
TmF0aXZlVHlwZUluc3RhbmNlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L05hdGl2ZVR5cGVJbnN0YW5jZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDU3IEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2NsYXNzIE5hdGl2ZVR5cGVJbnN0YW5jZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVj
dG9yKHR5cGUsIHR5cGVBcmd1bWVudHMpCisgICAgeworICAgICAgICB0aGlzLl90eXBlID0gdHlw
ZTsKKyAgICAgICAgdGhpcy5fdHlwZUFyZ3VtZW50cyA9IHR5cGVBcmd1bWVudHM7CisgICAgfQor
ICAgIAorICAgIGdldCB0eXBlKCkgeyByZXR1cm4gdGhpcy5fdHlwZTsgfQorICAgIGdldCB0eXBl
QXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3VtZW50czsgfQorICAgIGdldCBpc1By
aW1pdGl2ZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGUuaXNQcmltaXRpdmU7IH0KKyAgICBnZXQgaXNO
YXRpdmUoKSB7IHJldHVybiB0cnVlOyB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZpY2F0aW9u
Q29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAodGhpcy50eXBlICE9IG90aGVyLnR5
cGUpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1
bWVudHMubGVuZ3RoICE9IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAg
cmV0dXJuIGZhbHNlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3Vt
ZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNb
aV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAg
ICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRy
dWU7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLnR5cGUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7CisgICAgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9Ob2RlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL05vZGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvTm9kZS5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIE5vZGUgeworICAg
IHZpc2l0KHZpc2l0b3IpCisgICAgeworICAgICAgICBsZXQgdmlzaXRGdW5jID0gdmlzaXRvclsi
dmlzaXQiICsgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lXTsKKyAgICAgICAgaWYgKCF2aXNpdEZ1bmMp
CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIHZpc2l0IGZ1bmN0aW9uIGZvciAiICsg
dGhpcy5jb25zdHJ1Y3Rvci5uYW1lICsgIiBpbiAiICsgdmlzaXRvci5jb25zdHJ1Y3Rvci5uYW1l
KTsKKyAgICAgICAgbGV0IHJldHVyblZhbHVlID0gdmlzaXRGdW5jLmNhbGwodmlzaXRvciwgdGhp
cyk7CisgICAgICAgIGlmICgicmV0dXJuVmFsdWUiIGluIHZpc2l0b3IpCisgICAgICAgICAgICBy
ZXR1cm4gdmlzaXRvci5yZXR1cm5WYWx1ZTsKKyAgICAgICAgcmV0dXJuIHJldHVyblZhbHVlOwor
ICAgIH0KKyAgICAKKyAgICB1bmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKQorICAgIHsK
KyAgICAgICAgaWYgKCFvdGhlcikKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTnVsbCBv
dGhlciIpOworICAgICAgICBsZXQgdW5pZnlUaGlzID0gdGhpcy51bmlmeU5vZGU7CisgICAgICAg
IGxldCB1bmlmeU90aGVyID0gb3RoZXIudW5pZnlOb2RlOworICAgICAgICBpZiAodW5pZnlPdGhl
ci50eXBlVmFyaWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIHVuaWZ5VGhpcykpCisgICAg
ICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHVuaWZ5VGhpcy51bmlmeUltcGwo
dW5pZmljYXRpb25Db250ZXh0LCB1bmlmeU90aGVyKTsKKyAgICB9CisgICAgCisgICAgdW5pZnlJ
bXBsKHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICBpZiAob3RoZXIu
dHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCB0aGlzKSkKKyAgICAgICAgICAg
IHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlcjsKKyAgICB9CisgICAg
CisgICAgdHlwZVZhcmlhYmxlVW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7
CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgCisgICAgZ2V0IHVuaWZ5Tm9kZSgp
IHsgcmV0dXJuIHRoaXM7IH0KKyAgICBnZXQgaXNVbmlmaWFibGUoKSB7IHJldHVybiBmYWxzZTsg
fQorICAgIAorICAgIGdldCBpc05hdGl2ZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgCisgICAg
ZXF1YWxzKG90aGVyKQorICAgIHsKKyAgICAgICAgbGV0IHVuaWZpY2F0aW9uQ29udGV4dCA9IG5l
dyBVbmlmaWNhdGlvbkNvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXMudW5pZnkodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlcikgJiYgdW5pZmljYXRpb25Db250ZXh0LmlzVW51bmlmaWVkKCk7
CisgICAgfQorICAgIAorICAgIHN1YnN0aXR1dGUocGFyYW1ldGVycywgYXJndW1lbnRMaXN0KQor
ICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudmlzaXQoU3Vic3RpdHV0aW9uLm1hcHBpbmcocGFy
YW1ldGVycywgYXJndW1lbnRMaXN0KSk7CisgICAgfQorICAgIAorICAgIHN1YnN0aXR1dGVUb1Vu
aWZpY2F0aW9uKHBhcmFtZXRlcnMsIHVuaWZpY2F0aW9uQ29udGV4dCkKKyAgICB7CisgICAgICAg
IHJldHVybiB0aGlzLnN1YnN0aXR1dGUocGFyYW1ldGVycywgcGFyYW1ldGVycy5tYXAodHlwZSA9
PiB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0eXBlKSkpOworICAgIH0KK30KSW5kZXg6IFRvb2xz
L0FycmF5TGFuZ1JJL051bGxUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJ
L051bGxUeXBlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL051bGxUeXBl
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgTnVsbFR5cGUg
ZXh0ZW5kcyBUeXBlIHsKKyAgICAvLyBGSVhNRTogVGhpcyB3aWxsIGhhdmUgdG8gYmVoYXZlIGxp
a2UgYSB0eXBlIHZhcmlhYmxlIGZvciB0aGUgcHVycG9zZXMgb2YgdW5pZmljYXRpb24sIHNvIHRo
YXQKKyAgICAvLyBpdCBjYW4gYmUgdW5pZmllZCB3aXRoIGFueSBwb2ludGVyIHR5cGUuIFRoZW4s
IHdlIGNhbiBkbyBhIHZlcmlmaWNhdGlvbiBhdCB0aGUgZW5kIHRvIHNlZSBpZgorICAgIC8vIHdl
IGdvdCB1bmlmaWVkIHdpdGggYSBwb2ludGVyIHR5cGUuCit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1BhcnNlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpz
CShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1BhcnNlLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsNjQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIElu
Yy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1Ig
SU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisg
KiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFM
TCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNU
LCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VR
VUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NV
UkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRB
LCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNF
RCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNU
LCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1Ig
T1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMg
U09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1B
R0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHBhcnNlKHByb2dyYW0sIG9yaWdp
biwgbGluZU51bWJlck9mZnNldCwgdGV4dCkKK3sKKyAgICBsZXQgbGV4ZXIgPSBuZXcgTGV4ZXIo
b3JpZ2luLCBsaW5lTnVtYmVyT2Zmc2V0LCB0ZXh0KTsKKyAgICAKKyAgICAvLyBUaGUgaGFyZGVz
dCBwYXJ0IG9mIGRlYWxpbmcgd2l0aCBDLWxpa2UgbGFuZ3VhZ2VzIGlzIHBhcnNpbmcgdmFyaWFi
bGUgZGVjbGFyYXRpb24gc3RhdGVtZW50cy4KKyAgICAvLyBMZXQncyBjb25zaWRlciBpZiB0aGlz
IGhhcHBlbnMgaW4gQXJyYXlMYW5nLiBIZXJlIGFyZSB0aGUgdmFsaWQgc3RhdGVtZW50cyBpbiBB
cnJheUxhbmcgdGhhdAorICAgIC8vIGJlZ2luIHdpdGggYW4gaWRlbnRpZmllciwgaWYgd2UgYXNz
dW1lIHRoYXQgYW55IGV4cHJlc3Npb24gY2FuIGJlIGEgc3RhbmRhbG9uZSBzdGF0ZW1lbnQuCisg
ICAgLy8KKyAgICAvLyAgICAgeDsKKyAgICAvLyAgICAgeCA8Ymlub3A+IHk7CisgICAgLy8gICAg
IHggPCB5OworICAgIC8vICAgICB4IDwgeSA+IHo7CisgICAgLy8gICAgIHggPSB5OworICAgIC8v
ICAgICB4LmYgPSB5OworICAgIC8vICAgICBcZXhwID0geTsKKyAgICAvLyAgICAgeFs0Ml0gPSB5
OworICAgIC8vICAgICB4KCk7CisgICAgLy8gICAgIHg8eT4oKTsKKyAgICAvLyAgICAgeCB5Owor
ICAgIC8vICAgICB4PHk+IHo7CisgICAgLy8gICAgIGRldmljZSB4W10geTsKKyAgICAvLyAgICAg
eFs0Ml0geTsKKyAgICAvLyAgICAgZGV2aWNlIHheIHk7CisgICAgLy8gICAgIHRocmVhZCB4Xl4g
eTsKKyAgICAvLyAgICAgeF50aHJlYWRedGhyZWFkIHk7CisgICAgLy8gICAgIHheZGV2aWNlXnRo
cmVhZCB5OworICAgIC8vCisgICAgLy8gVGhpcyBoYXMgdHdvIHByb2JsZW0gYXJlYXM6CisgICAg
Ly8KKyAgICAvLyAgICAgLSB4PHk+eiBjYW4gcGFyc2UgdHdvIGRpZmZlcmVudCB3YXlzIChhcyAo
eCA8IHkpID4geiBvciB4PHk+IHopLgorICAgIC8vICAgICAtIHhbNDJdIGNvdWxkIGJlY29tZSBl
aXRoZXIgYW4gYXNzaWdubWVudCBvciBhIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgIC8vICAg
ICAtIHg8eT4gY291bGQgYmVjb21lIGVpdGhlciBhbiBhc3NpZ25tZW50IG9yIGEgdmFyaWFibGUg
ZGVjbGFyYXRpb24uCisgICAgLy8KKyAgICAvLyBXZSBzb2x2ZSB0aGUgZmlyc3QgcHJvYmxlbSBi
eSBmb3JiaWRkaW5nIGV4cHJlc3Npb25zIGFzIHN0YXRlbWVudHMuIFRoZSBsYWNrIG9mIGZ1bmN0
aW9uCisgICAgLy8gcG9pbnRlcnMgbWVhbnMgdGhhdCB3ZSBjYW4gc3RpbGwgYWxsb3cgZnVuY3Rp
b24gY2FsbCBzdGF0ZW1lbnRzIC0gdW5saWtlIGluIEMsIHRob3NlIGNhbm5vdAorICAgIC8vIGhh
dmUgYXJiaXRyYXJ5IGV4cHJlc3Npb25zIGFzIHRoZSBjYWxsZWUuIFRoZSByZW1haW5pbmcgdHdv
IHByb2JsZW1zIGFyZSBzb2x2ZWQgYnkKKyAgICAvLyBiYWNrdHJhY2tpbmcuIEluIGFsbCBvdGhl
ciByZXNwZWN0cywgdGhpcyBpcyBhIHNpbXBsZSByZWN1cnNpdmUgZGVzY2VudCBwYXJzZXIuCisg
ICAgCisgICAgZnVuY3Rpb24gZ2VuZXJpY0NvbnN1bWUoY2FsbGJhY2ssIGV4cGxhbmF0aW9uKQor
ICAgIHsKKyAgICAgICAgbGV0IHRva2VuID0gbGV4ZXIubmV4dCgpOworICAgICAgICBpZiAoIXRv
a2VuKQorICAgICAgICAgICAgbGV4ZXIuZmFpbCgiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOwor
ICAgICAgICBpZiAoIWNhbGxiYWNrKHRva2VuKSkKKyAgICAgICAgICAgIGxleGVyLmZhaWwoIlVu
ZXhwZWN0ZWQgdG9rZW46ICIgKyB0b2tlbi50ZXh0ICsgIjsgZXhwZWN0ZWQ6ICIgKyBleHBsYW5h
dGlvbik7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
Y29uc3VtZSguLi50ZXh0cykKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljQ29uc3VtZSh0
b2tlbiA9PiB0ZXh0cy5pbmNsdWRlcyh0b2tlbi50ZXh0KSwgdGV4dHMpOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBjb25zdW1lS2luZChraW5kKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdl
bmVyaWNDb25zdW1lKHRva2VuID0+IHRva2VuLmtpbmQgPT0ga2luZCwga2luZCk7CisgICAgfQor
ICAgIAorICAgIGZ1bmN0aW9uIGFzc2VydE5leHQoLi4udGV4dHMpCisgICAgeworICAgICAgICBs
ZXhlci5wdXNoKGNvbnN1bWUoLi4udGV4dHMpKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24g
Z2VuZXJpY1Rlc3QoY2FsbGJhY2spCisgICAgeworICAgICAgICBsZXQgdG9rZW4gPSBsZXhlci5w
ZWVrKCk7CisgICAgICAgIGlmICh0b2tlbiAmJiBjYWxsYmFjayh0b2tlbikpCisgICAgICAgICAg
ICByZXR1cm4gdG9rZW47CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBm
dW5jdGlvbiB0ZXN0KC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNUZXN0
KHRva2VuID0+IHRleHRzLmluY2x1ZGVzKHRva2VuLnRleHQpKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gdGVzdEtpbmQoa2luZCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5lcmljVGVz
dCh0b2tlbiA9PiB0b2tlbi5raW5kID09IGtpbmQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlv
biB0cnlDb25zdW1lKC4uLnRleHRzKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRlc3Qo
Li4udGV4dHMpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgbGV4ZXIubmV4dCgp
OworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiB0cnlD
b25zdW1lS2luZChraW5kKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IHRlc3RLaW5kKGtp
bmQpOworICAgICAgICBpZiAocmVzdWx0KQorICAgICAgICAgICAgbGV4ZXIubmV4dCgpOworICAg
ICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVByb3Rv
Y29sUmVmKCkKKyAgICB7CisgICAgICAgIGxldCBwcm90b2NvbFRva2VuID0gY29uc3VtZUtpbmQo
ImlkZW50aWZpZXIiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQcm90b2NvbFJlZihwcm90b2NvbFRv
a2VuLm9yaWdpbiwgcHJvdG9jb2xUb2tlbi50ZXh0KTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rp
b24gY29uc3VtZUVuZE9mVHlwZUFyZ3MoKQorICAgIHsKKyAgICAgICAgbGV0IHJpZ2h0U2hpZnQg
PSB0cnlDb25zdW1lKCI+PiIpOworICAgICAgICBpZiAocmlnaHRTaGlmdCkKKyAgICAgICAgICAg
IGxleGVyLnB1c2gobmV3IExleGVyVG9rZW4obGV4ZXIsIHJpZ2h0U2hpZnQub3JpZ2luLCByaWdo
dFNoaWZ0LmluZGV4LCByaWdodFNoaWZ0LmtpbmQsICI+IikpOworICAgICAgICBlbHNlCisgICAg
ICAgICAgICBjb25zdW1lKCI+Iik7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlw
ZVBhcmFtZXRlcnMoKQorICAgIHsKKyAgICAgICAgaWYgKCF0ZXN0KCI8IikpCisgICAgICAgICAg
ICByZXR1cm4gW107CisgICAgICAgIAorICAgICAgICBsZXQgcmVzdWx0ID0gW107CisgICAgICAg
IGNvbnN1bWUoIjwiKTsKKyAgICAgICAgd2hpbGUgKCF0ZXN0KCI+IikpIHsKKyAgICAgICAgICAg
IGxldCBjb25zdGV4cHIgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAg
ICAgICAgICAgbGV0IHR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAgICAgICAgICBsZXQgbmFt
ZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAgICAgICAgYXNzZXJ0TmV4
dCgiLCIsICI+IiwgIj4+Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdGV4cHJU
eXBlUGFyYW1ldGVyKHR5cGUub3JpZ2luLCBuYW1lLCB0eXBlKTsKKyAgICAgICAgICAgIH0pOwor
ICAgICAgICAgICAgaWYgKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICByZXN1bHQucHVzaChj
b25zdGV4cHIpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbGV0IG5hbWUg
PSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAgICAgICAgICAgICAgIGxldCBwcm90b2Nv
bCA9IHRyeUNvbnN1bWUoIjoiKSA/IHBhcnNlUHJvdG9jb2xSZWYoKSA6IG51bGw7CisgICAgICAg
ICAgICAgICAgcmVzdWx0LnB1c2gobmV3IFR5cGVWYXJpYWJsZShuYW1lLm9yaWdpbiwgbmFtZS50
ZXh0LCBwcm90b2NvbCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF0cnlDb25z
dW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29u
c3VtZUVuZE9mVHlwZUFyZ3MoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAg
CisgICAgZnVuY3Rpb24gcGFyc2VUZXJtKCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbjsKKyAg
ICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgibnVsbCIpKQorICAgICAgICAgICAgcmV0dXJu
IG5ldyBOdWxsKHRva2VuLm9yaWdpbik7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWVL
aW5kKCJpZGVudGlmaWVyIikpCisgICAgICAgICAgICByZXR1cm4gbmV3IFZhcmlhYmxlUmVmKHRv
a2VuLm9yaWdpbiwgdG9rZW4udGV4dCk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWVL
aW5kKCJpbnRMaXRlcmFsIikpIHsKKyAgICAgICAgICAgIGxldCBpbnRWZXJzaW9uID0gdG9rZW4u
dGV4dCB8IDA7CisgICAgICAgICAgICBpZiAoaW50VmVyc2lvbiAhPSB0b2tlbi50ZXh0KQorICAg
ICAgICAgICAgICAgIGxleGVyLmZhaWwoIkludGVnZXIgbGl0ZXJhbCBpcyBub3QgMzItYml0IGlu
dGVnZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50TGl0ZXJhbCh0b2tlbi5vcmlnaW4s
IGludFZlcnNpb24pOworICAgICAgICB9CisgICAgICAgIC8vIEZJWE1FOiBOZWVkIHN1cHBvcnQg
Zm9yIGZsb2F0IGxpdGVyYWxzIGFuZCBwcm9iYWJseSBvdGhlciBsaXRlcmFscyB0b28uCisgICAg
ICAgIHRva2VuID0gY29uc3VtZUtpbmQoImRvdWJsZUxpdGVyYWwiKTsKKyAgICAgICAgcmV0dXJu
IG5ldyBEb3VibGVMaXRlcmFsKHRva2VuLm9yaWdpbiwgK3Rva2VuLnRleHQpOworICAgIH0KKyAg
ICAKKyAgICBmdW5jdGlvbiBwYXJzZUNvbnN0ZXhwcigpCisgICAgeworICAgICAgICByZXR1cm4g
cGFyc2VUZXJtKCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlwZUFyZ3VtZW50
cygpCisgICAgeworICAgICAgICBpZiAoIXRlc3QoIjwiKSkKKyAgICAgICAgICAgIHJldHVybiBb
XTsKKyAgICAgICAgCisgICAgICAgIGxldCByZXN1bHQgPSBbXTsKKyAgICAgICAgY29uc3VtZSgi
PCIpOworICAgICAgICB3aGlsZSAoIXRlc3QoIj4iKSkgeworICAgICAgICAgICAgLy8gSXQncyBw
b3NzaWJsZSBmb3IgYSBjb25zdGV4cHIgb3IgdHlwZSBjYW4gc3ludGFjdGljYWxseSBvdmVybGFw
IGluIHRoZSBzaW5nbGUKKyAgICAgICAgICAgIC8vIGlkZW50aWZpZXIgY2FzZS4gTGV0J3MgY29u
c2lkZXIgdGhlIHBvc3NpYmlsaXRpZXM6CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8g
ICAgIFQgICAgICAgICAgY291bGQgYmUgdHlwZSBvciBjb25zdGV4cHIKKyAgICAgICAgICAgIC8v
ICAgICBUW10gICAgICAgIG9ubHkgdHlwZQorICAgICAgICAgICAgLy8gICAgIFRbNDJdICAgICAg
b25seSB0eXBlIChjb25zdGV4cHIgY2Fubm90IGRvIGluZGV4aW5nKQorICAgICAgICAgICAgLy8g
ICAgIDQyICAgICAgICAgb25seSBjb25zdGV4cHIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAg
ICAvLyBJbiB0aGUgZnV0dXJlIHdlJ2xsIGFsbG93IGNvbnN0ZXhwcnMgdG8gZG8gbW9yZSB0aGlu
Z3MsIGFuZCB0aGVuIHdlJ2xsIHN0aWxsIGhhdmUKKyAgICAgICAgICAgIC8vIHRoZSBwcm9ibGVt
IHRoYXQgc29tZXRoaW5nIG9mIHRoZSBmb3JtIFRbMV1bMl1bM10uLi4gY2FuIGVpdGhlciBiZSBh
IHR5cGUgb3IgYQorICAgICAgICAgICAgLy8gY29uc3RleHByLCBhbmQgd2UgY2FuIGZpZ3VyZSBv
dXQgaW4gdGhlIGNoZWNrZXIgd2hpY2ggaXQgaXMuCisgICAgICAgICAgICBsZXQgdHlwZU9yVmFy
aWFibGVSZWYgPSBsZXhlci5iYWNrdHJhY2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICAg
ICAgbGV0IHJlc3VsdCA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAgICAg
ICAgYXNzZXJ0TmV4dCgiLCIsICI+IiwgIj4+Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5l
dyBUeXBlT3JWYXJpYWJsZVJlZihyZXN1bHQub3JpZ2luLCByZXN1bHQudGV4dCk7CisgICAgICAg
ICAgICB9KTsKKyAgICAgICAgICAgIGlmICh0eXBlT3JWYXJpYWJsZVJlZikKKyAgICAgICAgICAg
ICAgICByZXN1bHQucHVzaCh0eXBlT3JWYXJpYWJsZVJlZik7CisgICAgICAgICAgICBlbHNlIHsK
KyAgICAgICAgICAgICAgICBsZXQgY29uc3RleHByID0gbGV4ZXIuYmFja3RyYWNraW5nU2NvcGUo
KCkgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gcGFyc2VDb25zdGV4cHIo
KTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TmV4dCgiLCIsICI+IiwgIj4+Iik7CisgICAg
ICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAg
ICAgICAgICAgICAgaWYgKGNvbnN0ZXhwcikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1
c2goY29uc3RleHByKQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAg
cmVzdWx0LnB1c2gocGFyc2VUeXBlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYg
KCF0cnlDb25zdW1lKCIsIikpCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAg
ICAgICAgY29uc3VtZUVuZE9mVHlwZUFyZ3MoKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAg
ICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VUeXBlKCkKKyAgICB7CisgICAgICAgIGxldCB0
b2tlbjsKKyAgICAgICAgbGV0IGFkZHJlc3NTcGFjZTsKKyAgICAgICAgbGV0IGFkZHJlc3NTcGFj
ZUNvbnN1bWVkID0gZmFsc2U7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoLi4uYWRk
cmVzc1NwYWNlcykpCisgICAgICAgICAgICBhZGRyZXNzU3BhY2UgPSB0b2tlbi50ZXh0OworICAg
ICAgICAKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpOworICAg
ICAgICBsZXQgdHlwZUFyZ3VtZW50cyA9IHBhcnNlVHlwZUFyZ3VtZW50cygpOworICAgICAgICBs
ZXQgdHlwZSA9IG5ldyBUeXBlUmVmKG5hbWUub3JpZ2luLCBuYW1lLnRleHQsIHR5cGVBcmd1bWVu
dHMpOworICAgICAgICAKKyAgICAgICAgZnVuY3Rpb24gZ2V0QWRkcmVzc1NwYWNlKCkKKyAgICAg
ICAgeworICAgICAgICAgICAgYWRkcmVzc1NwYWNlQ29uc3VtZWQgPSB0cnVlOworICAgICAgICAg
ICAgaWYgKGFkZHJlc3NTcGFjZSkKKyAgICAgICAgICAgICAgICByZXR1cm4gYWRkcmVzc1NwYWNl
OworICAgICAgICAgICAgcmV0dXJuIHRyeUNvbnN1bWUoLi4uYWRkcmVzc1NwYWNlcyk7CisgICAg
ICAgIH0KKyAgICAgICAgCisgICAgICAgIHdoaWxlICh0b2tlbiA9IHRyeUNvbnN1bWUoIl4iLCAi
WyIpKSB7CisgICAgICAgICAgICBpZiAodG9rZW4udGV4dCA9PSAiXiIpIHsKKyAgICAgICAgICAg
ICAgICB0eXBlID0gbmV3IFB0clR5cGUodG9rZW4ub3JpZ2luLCBnZXRBZGRyZXNzU3BhY2UoKSwg
dHlwZSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAg
ICAgICAKKyAgICAgICAgICAgIGlmICh0cnlDb25zdW1lKCJdIikpIHsKKyAgICAgICAgICAgICAg
ICB0eXBlID0gbmV3IEFycmF5UmVmVHlwZSh0b2tlbi5vcmlnaW4sIGdldEFkZHJlc3NTcGFjZSgp
LCB0eXBlKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAg
ICAgICAgIAorICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheVR5cGUodG9rZW4ub3JpZ2luLCB0
eXBlLCBwYXJzZUNvbnN0ZXhwcigpKTsKKyAgICAgICAgICAgIGNvbnN1bWUoIl0iKTsKKyAgICAg
ICAgfQorICAgICAgICAKKyAgICAgICAgaWYgKGFkZHJlc3NTcGFjZSAmJiAhYWRkcmVzc1NwYWNl
Q29uc3VtZWQpCisgICAgICAgICAgICBsZXhlci5mYWlsKCJBZGRyZXNzIHNwYWNlIHNwZWNpZmll
ZCBmb3IgdHlwZSB0aGF0IGRvZXMgbm90IG5lZWQgYWRkcmVzcyBzcGFjZSIpOworICAgICAgICAK
KyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVHlw
ZURlZigpCisgICAgeworICAgICAgICBsZXQgb3JpZ2luID0gY29uc3VtZSgidHlwZSIpLm9yaWdp
bjsKKyAgICAgICAgbGV0IG5hbWUgPSBjb25zdW1lS2luZCgiaWRlbnRpZmllciIpLnRleHQ7Cisg
ICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAg
ICAgY29uc3VtZSgiPSIpOworICAgICAgICBsZXQgdHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAg
ICBjb25zdW1lKCI7Iik7CisgICAgICAgIHJldHVybiBuZXcgVHlwZURlZihvcmlnaW4sIG5hbWUs
IHR5cGVQYXJhbWV0ZXJzLCB0eXBlKTsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VO
YXRpdmUoKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoIm5hdGl2ZSIpLm9y
aWdpbjsKKyAgICAgICAgbGV0IGlzVHlwZSA9IGxleGVyLmJhY2t0cmFja2luZ1Njb3BlKCgpID0+
IHsKKyAgICAgICAgICAgIGlmICh0cnlDb25zdW1lKCJ0eXBlIikpCisgICAgICAgICAgICAgICAg
cmV0dXJuICJub3JtYWwiOworICAgICAgICAgICAgY29uc3VtZSgicHJpbWl0aXZlIik7CisgICAg
ICAgICAgICBjb25zdW1lKCJ0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gInByaW1pdGl2ZSI7
CisgICAgICAgIH0pOworICAgICAgICBpZiAoaXNUeXBlKSB7CisgICAgICAgICAgICBsZXQgbmFt
ZSA9IGNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgICAgICBsZXQgcGFyYW1ldGVy
cyA9IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGNvbnN1bWUoIjsiKTsKKyAg
ICAgICAgICAgIHJldHVybiBuZXcgTmF0aXZlVHlwZShvcmlnaW4sIG5hbWUudGV4dCwgaXNUeXBl
ID09ICJwcmltaXRpdmUiLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgfQorICAgICAgICBsZXQgcmV0
dXJuVHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAgICBsZXQgbmFtZSA9IHBhcnNlRnVuY05hbWUo
KTsKKyAgICAgICAgbGV0IHR5cGVQYXJhbWV0ZXJzID0gcGFyc2VUeXBlUGFyYW1ldGVycygpOwor
ICAgICAgICBsZXQgcGFyYW1ldGVycyA9IHBhcnNlUGFyYW1ldGVycygpOworICAgICAgICBjb25z
dW1lKCI7Iik7CisgICAgICAgIHJldHVybiBuZXcgTmF0aXZlRnVuYyhvcmlnaW4sIG5hbWUsIHJl
dHVyblR5cGUsIHR5cGVQYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzKTsKKyAgICB9CisgICAgCisgICAg
ZnVuY3Rpb24gZ2VuZXJpY1BhcnNlTGVmdCh0ZXh0cywgbmV4dFBhcnNlciwgY29uc3RydWN0b3Ip
CisgICAgeworICAgICAgICBsZXQgbGVmdCA9IG5leHRQYXJzZXIoKTsKKyAgICAgICAgbGV0IHRv
a2VuOworICAgICAgICB3aGlsZSAodG9rZW4gPSB0cnlDb25zdW1lKC4uLnRleHRzKSkKKyAgICAg
ICAgICAgIGxlZnQgPSBjb25zdHJ1Y3Rvcih0b2tlbiwgbGVmdCwgbmV4dFBhcnNlcigpKTsKKyAg
ICAgICAgcmV0dXJuIGxlZnQ7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTGVmdE9w
ZXJhdG9yQ2FsbCh0ZXh0cywgbmV4dFBhcnNlcikKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5l
cmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgdGV4dHMsIG5leHRQYXJzZXIsCisgICAgICAgICAg
ICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9PgorICAgICAgICAgICAgICAgIG5ldyBDYWxsRXhwcmVz
c2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBbXSwgW2xlZnQsIHJp
Z2h0XSkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNhbGxFeHByZXNzaW9uKCkK
KyAgICB7CisgICAgICAgIGxldCBuYW1lID0gY29uc3VtZUtpbmQoImlkZW50aWZpZXIiKTsKKyAg
ICAgICAgbGV0IHR5cGVBcmd1bWVudHMgPSBwYXJzZVR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAg
Y29uc3VtZSgiKCIpOworICAgICAgICBsZXQgYXJndW1lbnRMaXN0ID0gW107CisgICAgICAgIHdo
aWxlICghdGVzdCgiKSIpKSB7CisgICAgICAgICAgICBhcmd1bWVudExpc3QucHVzaChwYXJzZUV4
cHJlc3Npb24oKSk7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAgICAg
ICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdW1lKCIpIik7CisgICAgICAg
IHJldHVybiBuZXcgQ2FsbEV4cHJlc3Npb24obmFtZS5vcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVu
dHMsIGFyZ3VtZW50TGlzdCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2li
bGVTdWZmaXgoKQorICAgIHsKKyAgICAgICAgbGV0IHNpbXBsZUNhc2UgPSBsZXhlci5iYWNrdHJh
Y2tpbmdTY29wZSgoKSA9PiB7CisgICAgICAgICAgICBsZXQgbGVmdCA9IHBhcnNlVGVybSgpOwor
ICAgICAgICAgICAgbGV0IHRva2VuOworICAgICAgICAgICAgd2hpbGUgKHRva2VuID0gdHJ5Q29u
c3VtZSgiKysiLCAiLS0iLCAiLiIsICItPiIsICJbIikpIHsKKyAgICAgICAgICAgICAgICBzd2l0
Y2ggKHRva2VuLnRleHQpIHsKKyAgICAgICAgICAgICAgICBjYXNlICIrKyI6CisgICAgICAgICAg
ICAgICAgY2FzZSAiLS0iOgorICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IFN1ZmZpeENh
bGxBc3NpZ25tZW50KHRva2VuLm9yaWdpbiwgIm9wZXJhdG9yIiArIHRva2VuLnRleHQsIGxlZnQp
OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICIuIjoK
KyAgICAgICAgICAgICAgICBjYXNlICItPiI6CisgICAgICAgICAgICAgICAgICAgIGlmICh0b2tl
bi50ZXh0ID09ICItPiIpCisgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IERlcmVm
ZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIGxlZnQpOworICAgICAgICAgICAgICAgICAg
ICBsZWZ0ID0gbmV3IERvdEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0LCBjb25zdW1lS2lu
ZCgiaWRlbnRpZmllciIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAg
ICAgICAgY2FzZSAiWyI6IHsKKyAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcGFyc2VF
eHByZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWUoIl0iKTsKKyAgICAgICAg
ICAgICAgICAgICAgbGVmdCA9IG5ldyBJbmRleEV4cHJlc3Npb24odG9rZW4ub3JpZ2luLCBsZWZ0
LCBpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0K
KyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcg
RXJyb3IoIkJhZCB0b2tlbjogIiArIHRva2VuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAg
ICAgICB9CisgICAgICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgfSk7CisgICAgICAgIGlm
IChzaW1wbGVDYXNlKQorICAgICAgICAgICAgcmV0dXJuIHNpbXBsZUNhc2U7CisgICAgICAgIAor
ICAgICAgICByZXR1cm4gcGFyc2VDYWxsRXhwcmVzc2lvbigpOworICAgIH0KKyAgICAKKyAgICBm
dW5jdGlvbiBwYXJzZVBvc3NpYmxlUHJlZml4KCkKKyAgICB7CisgICAgICAgIGxldCB0b2tlbjsK
KyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiKysiLCAiLS0iLCAiKyIsICItIiwgIiEi
LCAifiIpKQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWxsQXNzaWdubWVudCh0b2tlbi5vcmln
aW4sICJvcGVyYXRvciIgKyB0b2tlbi50ZXh0LCBwYXJzZVBvc3NpYmxlUHJlZml4KCkpOworICAg
ICAgICBpZiAodG9rZW4gPSB0cnlDb25zdW1lKCJeIikpCisgICAgICAgICAgICByZXR1cm4gbmV3
IERlcmVmZXJlbmNlRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHBhcnNlUG9zc2libGVQcmVmaXgo
KSk7CisgICAgICAgIGlmICh0b2tlbiA9IHRyeUNvbnN1bWUoIlxcIikpCisgICAgICAgICAgICBy
ZXR1cm4gbmV3IE1ha2VQdHJFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgcGFyc2VQb3NzaWJsZVBy
ZWZpeCgpKTsKKyAgICAgICAgaWYgKHRva2VuID0gdHJ5Q29uc3VtZSgiJiIpKQorICAgICAgICAg
ICAgcmV0dXJuIG5ldyBNYWtlQXJyYXlSZWZFeHByZXNzaW9uKHRva2VuLm9yaWdpbiwgcGFyc2VQ
b3NzaWJsZVByZWZpeCgpKTsKKyAgICAgICAgcmV0dXJuIHBhcnNlUG9zc2libGVTdWZmaXgoKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVByb2R1Y3QoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIioiLCAiLyIsICIlIl0sIHBh
cnNlUG9zc2libGVQcmVmaXgpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBvc3Np
YmxlU3VtKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNhbGwoWyIr
IiwgIi0iXSwgcGFyc2VQb3NzaWJsZVByb2R1Y3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlv
biBwYXJzZVBvc3NpYmxlU2hpZnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9w
ZXJhdG9yQ2FsbChbIjw8IiwgIj4+Il0sIHBhcnNlUG9zc2libGVTdW0pOworICAgIH0KKyAgICAK
KyAgICBmdW5jdGlvbiBwYXJzZVBvc3NpYmxlUmVsYXRpb25hbEluZXF1YWxpdHkoKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIjwiLCAiPiIsICI8PSIsICI9
PiJdLCBwYXJzZVBvc3NpYmxlU2hpZnQpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJz
ZVBvc3NpYmxlUmVsYXRpb25hbEVxdWFsaXR5KCkKKyAgICB7CisgICAgICAgIHJldHVybiBnZW5l
cmljUGFyc2VMZWZ0KAorICAgICAgICAgICAgWyI9PSIsICIhPSJdLCBwYXJzZVBvc3NpYmxlUmVs
YXRpb25hbEluZXF1YWxpdHksCisgICAgICAgICAgICAodG9rZW4sIGxlZnQsIHJpZ2h0KSA9PiB7
CisgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBDYWxsRXhwcmVzc2lvbih0b2tlbi5v
cmlnaW4sICJvcGVyYXRvcj09IiwgW10sIFtsZWZ0LCByaWdodF0pOworICAgICAgICAgICAgICAg
IGlmICh0b2tlbi50ZXh0ID09ICIhPSIpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5l
dyBDYWxsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sICJvcGVyYXRvciEiLCBbXSwgW3Jlc3VsdF0p
OworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KTsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VBbmQoKQorICAgIHsKKyAg
ICAgICAgcmV0dXJuIHBhcnNlTGVmdE9wZXJhdG9yQ2FsbChbIiYiXSwgcGFyc2VQb3NzaWJsZVJl
bGF0aW9uYWxFcXVhbGl0eSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2li
bGVCaXR3aXNlWG9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRPcGVyYXRvckNh
bGwoWyJeIl0sIHBhcnNlUG9zc2libGVCaXR3aXNlQW5kKTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gcGFyc2VQb3NzaWJsZUJpdHdpc2VPcigpCisgICAgeworICAgICAgICByZXR1cm4gcGFy
c2VMZWZ0T3BlcmF0b3JDYWxsKFsifCJdLCBwYXJzZVBvc3NpYmxlQml0d2lzZVhvcik7CisgICAg
fQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlTGVmdExvZ2ljYWxFeHByZXNzaW9uKHRleHRzLCBu
ZXh0UGFyc2VyKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNQYXJzZUxlZnQoCisgICAg
ICAgICAgICB0ZXh0cywgbmV4dFBhcnNlciwKKyAgICAgICAgICAgICh0b2tlbiwgbGVmdCwgcmln
aHQpID0+IG5ldyBMb2dpY2FsRXhwcmVzc2lvbih0b2tlbi5vcmlnaW4sIHRva2VuLnRleHQsIGxl
ZnQsIHJpZ2h0KSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlUG9zc2libGVMb2dp
Y2FsQW5kKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUxlZnRMb2dpY2FsRXhwcmVzc2lv
bihbIiYmIl0sIHBhcnNlUG9zc2libGVCaXR3aXNlT3IpOworICAgIH0KKyAgICAKKyAgICBmdW5j
dGlvbiBwYXJzZVBvc3NpYmxlTG9naWNhbE9yKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJz
ZUxlZnRMb2dpY2FsRXhwcmVzc2lvbihbInx8Il0sIHBhcnNlUG9zc2libGVMb2dpY2FsQW5kKTsK
KyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZVRlcm5hcnlDb25kaXRpb25h
bCgpCisgICAgeworICAgICAgICBsZXQgcHJlZGljYXRlID0gcGFyc2VQb3NzaWJsZUxvZ2ljYWxP
cigpOworICAgICAgICBsZXQgb3BlcmF0b3IgPSB0cnlDb25zdW1lKCI/Iik7CisgICAgICAgIGlm
ICghb3BlcmF0b3IpCisgICAgICAgICAgICByZXR1cm4gcHJlZGljYXRlOworICAgICAgICByZXR1
cm4gbmV3IFRlcm5hcnlFeHByZXNzaW9uKG9wZXJhdG9yLm9yaWdpbiwgcHJlZGljYXRlLCBwYXJz
ZVBvc3NpYmxlQXNzaWdubWVudCgpLCBwYXJzZVBvc3NpYmxlQXNzaWdubWVudCgpKTsKKyAgICB9
CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VQb3NzaWJsZUFzc2lnbm1lbnQobW9kZSkKKyAgICB7
CisgICAgICAgIGxldCBsaHMgPSBwYXJzZVBvc3NpYmxlVGVybmFyeUNvbmRpdGlvbmFsKCk7Cisg
ICAgICAgIGxldCBvcGVyYXRvciA9IHRyeUNvbnN1bWUoIj0iLCAiKz0iLCAiLT0iLCAiKj0iLCAi
Lz0iLCAiJT0iLCAiXj0iLCAifD0iLCAiJj0iKTsKKyAgICAgICAgaWYgKCFvcGVyYXRvcikgewor
ICAgICAgICAgICAgaWYgKG1vZGUgPT0gInJlcXVpcmVkIikKKyAgICAgICAgICAgICAgICBsZXhl
ci5mYWlsKCJFeHBlY3RlZCBhc3NpZ25tZW50Iik7CisgICAgICAgICAgICByZXR1cm4gbGhzOwor
ICAgICAgICB9CisgICAgICAgIGlmIChvcGVyYXRvci50ZXh0ID09ICI9IikKKyAgICAgICAgICAg
IHJldHVybiBuZXcgQXNzaWdubWVudChvcGVyYXRvci5vcmlnaW4sIGxocywgcGFyc2VQb3NzaWJs
ZUFzc2lnbm1lbnQoKSk7CisgICAgICAgIGxldCBuYW1lID0gIm9wZXJhdG9yIiArIG9wZXJhdG9y
LnRleHQuc3Vic3RyaW5nKDAsIHRlcm0ub3BlcmF0b3IubGVuZ3RoIC0gMSk7CisgICAgICAgIHJl
dHVybiBuZXcgQ2FsbEFzc2lnbm1lbnQob3BlcmF0b3Iub3JpZ2luLCBuYW1lLCBsaHMsIHBhcnNl
UG9zc2libGVBc3NpZ25tZW50KCkpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUFz
c2lnbm1lbnQoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlUG9zc2libGVBc3NpZ25tZW50
KCJyZXF1aXJlZCIpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUVmZmVjdGZ1bEV4
cHJlc3Npb24oKQorICAgIHsKKyAgICAgICAgbGV0IGFzc2lnbm1lbnQgPSBsZXhlci5iYWNrdHJh
Y2tpbmdTY29wZShwYXJzZUFzc2lnbm1lbnQpOworICAgICAgICBpZiAoYXNzaWdubWVudCkKKyAg
ICAgICAgICAgIHJldHVybiBhc3NpZ25tZW50OworICAgICAgICByZXR1cm4gcGFyc2VDYWxsRXhw
cmVzc2lvbigpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBnZW5lcmljUGFyc2VDb21tYUV4
cHJlc3Npb24oZmluYWxFeHByZXNzaW9uUGFyc2VyKQorICAgIHsKKyAgICAgICAgbGV0IGxpc3Qg
PSBbXTsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKCFv
cmlnaW4pCisgICAgICAgICAgICBsZXhlci5mYWlsKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7
CisgICAgICAgIG9yaWdpbiA9IG9yaWdpbi5vcmlnaW47CisgICAgICAgIGZvciAoOzspIHsKKyAg
ICAgICAgICAgIGxldCBlZmZlY3RmdWxFeHByZXNzaW9uID0gbGV4ZXIuYmFja3RyYWNraW5nU2Nv
cGUocGFyc2VFZmZlY3RmdWxFeHByZXNzaW9uKTsKKyAgICAgICAgICAgIGlmICghZWZmZWN0ZnVs
RXhwcmVzc2lvbikgeworICAgICAgICAgICAgICAgIGxldCBmaW5hbCA9IGZpbmFsRXhwcmVzc2lv
blBhcnNlcigpOworICAgICAgICAgICAgICAgIGxpc3QucHVzaChmaW5hbCk7CisgICAgICAgICAg
ICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0LnB1c2goZWZmZWN0
ZnVsRXhwcmVzc2lvbik7CisgICAgICAgICAgICBpZiAoIXRyeUNvbnN1bWUoIiwiKSkKKyAgICAg
ICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IENvbW1hRXhw
cmVzc2lvbihvcmlnaW4sIGxpc3QpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUNv
bW1hRXhwcmVzc2lvbigpCisgICAgeworICAgICAgICByZXR1cm4gZ2VuZXJpY1BhcnNlQ29tbWFF
eHByZXNzaW9uKHBhcnNlUG9zc2libGVBc3NpZ25tZW50KTsKKyAgICB9CisgICAgCisgICAgZnVu
Y3Rpb24gcGFyc2VFeHByZXNzaW9uKCkKKyAgICB7CisgICAgICAgIHJldHVybiBwYXJzZUNvbW1h
RXhwcmVzc2lvbigpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUVmZmVjdGZ1bFN0
YXRlbWVudCgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gZ2VuZXJpY1BhcnNlQ29tbWFF
eHByZXNzaW9uKHBhcnNlRWZmZWN0ZnVsRXhwcmVzc2lvbik7CisgICAgICAgIGNvbnN1bWUoIjsi
KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFy
c2VSZXR1cm4oKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInJldHVybiIp
Lm9yaWdpbjsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXR1cm4ob3JpZ2luLCBwYXJzZUV4cHJlc3Np
b24oKSk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9uIHBhcnNlVmFyaWFibGVEZWNscygpCisg
ICAgeworICAgICAgICBsZXQgdHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAgICBsZXQgbGlzdCA9
IFtdOworICAgICAgICBkbyB7CisgICAgICAgICAgICBsZXQgbmFtZSA9IGNvbnN1bWVLaW5kKCJp
ZGVudGlmaWVyIik7CisgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSB0cnlDb25zdW1lKCI9
IikgPyBwYXJzZUV4cHJlc3Npb24oKSA6IG51bGw7CisgICAgICAgICAgICBsaXN0LnB1c2gobmV3
IFZhcmlhYmxlRGVjbChuYW1lLm9yaWdpbiwgbmFtZS50ZXh0LCB0eXBlLCBpbml0aWFsaXplcikp
OworICAgICAgICB9IHdoaWxlIChjb25zdW1lKCIsIiwgIjsiKS50ZXh0ID09ICIsIikKKyAgICAg
ICAgcmV0dXJuIG5ldyBDb21tYUV4cHJlc3Npb24odHlwZS5vcmlnaW4sIGxpc3QpOworICAgIH0K
KyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVN0YXRlbWVudCgpCisgICAgeworICAgICAgICBsZXQg
dG9rZW4gPSBsZXhlci5wZWVrKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICI7Iikgewor
ICAgICAgICAgICAgbGV4ZXIubmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAg
ICAgIH0KKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gInJldHVybiIpCisgICAgICAgICAgICBy
ZXR1cm4gcGFyc2VSZXR1cm4oKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImJyZWFrIikK
KyAgICAgICAgICAgIHJldHVybiBwYXJzZUJyZWFrKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0
ID09ICJjb250aW51ZSIpCisgICAgICAgICAgICByZXR1cm4gcGFyc2VDb250aW51ZSgpOworICAg
ICAgICBpZiAodG9rZW4udGV4dCA9PSAid2hpbGUiKQorICAgICAgICAgICAgcmV0dXJuIHBhcnNl
V2hpbGUoKTsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gImRvIikKKyAgICAgICAgICAgIHJl
dHVybiBwYXJzZURvKCk7CisgICAgICAgIGlmICh0b2tlbi50ZXh0ID09ICJmb3IiKQorICAgICAg
ICAgICAgcmV0dXJuIHBhcnNlRm9yKCk7CisgICAgICAgIGxldCB2YXJpYWJsZURlY2wgPSBsZXhl
ci5iYWNrdHJhY2tpbmdTY29wZShwYXJzZVZhcmlhYmxlRGVjbHMpOworICAgICAgICBpZiAodmFy
aWFibGVEZWNsKQorICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlRGVjbDsKKyAgICAgICAgcmV0
dXJuIHBhcnNlRWZmZWN0ZnVsU3RhdGVtZW50KCk7CisgICAgfQorICAgIAorICAgIGZ1bmN0aW9u
IHBhcnNlQmxvY2soKQorICAgIHsKKyAgICAgICAgbGV0IG9yaWdpbiA9IGNvbnN1bWUoInsiKS5v
cmlnaW47CisgICAgICAgIGxldCBibG9jayA9IG5ldyBCbG9jayhvcmlnaW4pOworICAgICAgICB3
aGlsZSAoIXRlc3QoIn0iKSkgeworICAgICAgICAgICAgbGV0IHN0YXRlbWVudCA9IHBhcnNlU3Rh
dGVtZW50KCk7CisgICAgICAgICAgICBpZiAoc3RhdGVtZW50KQorICAgICAgICAgICAgICAgIGJs
b2NrLmFkZChzdGF0ZW1lbnQpOworICAgICAgICB9CisgICAgICAgIGNvbnN1bWUoIn0iKTsKKyAg
ICAgICAgcmV0dXJuIGJsb2NrOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBhcmFt
ZXRlcigpCisgICAgeworICAgICAgICBsZXQgdHlwZSA9IHBhcnNlVHlwZSgpOworICAgICAgICBs
ZXQgbmFtZSA9IHRyeUNvbnN1bWVLaW5kKCJpZGVudGlmaWVyIik7CisgICAgICAgIHJldHVybiBu
ZXcgRnVuY1BhcmFtZXRlcih0eXBlLm9yaWdpbiwgbmFtZSA/IG5hbWUudGV4dCA6IG51bGwsIHR5
cGUpOworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZVBhcmFtZXRlcnMoKQorICAgIHsK
KyAgICAgICAgY29uc3VtZSgiKCIpOworICAgICAgICBsZXQgcGFyYW1ldGVycyA9IFtdOworICAg
ICAgICB3aGlsZSAoIXRlc3QoIikiKSkgeworICAgICAgICAgICAgcGFyYW1ldGVycy5wdXNoKHBh
cnNlUGFyYW1ldGVyKCkpOworICAgICAgICAgICAgaWYgKCF0cnlDb25zdW1lKCIsIikpCisgICAg
ICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3VtZSgiKSIpOworICAg
ICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisgICAgCisgICAgZnVuY3Rpb24gcGFyc2VG
dW5jTmFtZSgpCisgICAgeworICAgICAgICBpZiAodHJ5Q29uc3VtZSgib3BlcmF0b3IiKSkgewor
ICAgICAgICAgICAgbGV0IHRva2VuID0gY29uc3VtZSgiKyIsICItIiwgIioiLCAiLyIsICIlIiwg
Il4iLCAiJiIsICJ8IiwgIjwiLCAiPiIsICI8PSIsICI+PSIsICIhIiwgIj09IiwgIisrIiwgIi0t
IiwgIlxcIik7CisgICAgICAgICAgICBpZiAodG9rZW4udGV4dCAhPSAiXFwiKQorICAgICAgICAg
ICAgICAgIHJldHVybiAib3BlcmF0b3IiICsgdG9rZW4udGV4dDsKKyAgICAgICAgICAgIGNvbnN1
bWUoIlsiKTsKKyAgICAgICAgICAgIGNvbnN1bWUoIl0iKTsKKyAgICAgICAgICAgIHJldHVybiAi
b3BlcmF0b3JcXFtdIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uc3VtZUtpbmQoImlk
ZW50aWZpZXIiKS50ZXh0OworICAgIH0KKyAgICAKKyAgICBmdW5jdGlvbiBwYXJzZUZ1bmNEZWYo
KQorICAgIHsKKyAgICAgICAgbGV0IHJldHVyblR5cGUgPSBwYXJzZVR5cGUoKTsKKyAgICAgICAg
bGV0IG5hbWUgPSBwYXJzZUZ1bmNOYW1lKCk7CisgICAgICAgIGxldCB0eXBlUGFyYW1ldGVycyA9
IHBhcnNlVHlwZVBhcmFtZXRlcnMoKTsKKyAgICAgICAgbGV0IHBhcmFtZXRlcnMgPSBwYXJzZVBh
cmFtZXRlcnMoKTsKKyAgICAgICAgbGV0IGJvZHkgPSBwYXJzZUJsb2NrKCk7CisgICAgICAgIHJl
dHVybiBuZXcgRnVuY0RlZihyZXR1cm5UeXBlLm9yaWdpbiwgbmFtZSwgcmV0dXJuVHlwZSwgdHlw
ZVBhcmFtZXRlcnMsIHBhcmFtZXRlcnMsIGJvZHkpOworICAgIH0KKyAgICAKKyAgICBmb3IgKDs7
KSB7CisgICAgICAgIGxldCB0b2tlbiA9IGxleGVyLnBlZWsoKTsKKyAgICAgICAgaWYgKCF0b2tl
bikKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKHRva2VuLnRleHQgPT0gIjsiKQor
ICAgICAgICAgICAgbGV4ZXIubmV4dCgpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09
ICJ0eXBlIikKKyAgICAgICAgICAgIHByb2dyYW0uYWRkKHBhcnNlVHlwZURlZigpKTsKKyAgICAg
ICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAibmF0aXZlIikKKyAgICAgICAgICAgIHByb2dyYW0u
YWRkKHBhcnNlTmF0aXZlKCkpOworICAgICAgICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJzdHJ1
Y3QiKQorICAgICAgICAgICAgcHJvZ3JhbS5hZGQocGFyc2VTdHJ1Y3RUeXBlKCkpOworICAgICAg
ICBlbHNlIGlmICh0b2tlbi50ZXh0ID09ICJlbnVtIikKKyAgICAgICAgICAgIHByb2dyYW0uYWRk
KHBhcnNlRW51bSgpKTsKKyAgICAgICAgZWxzZSBpZiAodG9rZW4udGV4dCA9PSAicHJvdG9jb2wi
KQorICAgICAgICAgICAgcHJvZ3JhbS5hZGQocGFyc2VQcm90b2NvbERlY2woKSk7CisgICAgICAg
IGVsc2UKKyAgICAgICAgICAgIHByb2dyYW0uYWRkKHBhcnNlRnVuY0RlZigpKTsKKyAgICB9Cit9
CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ByZXBhcmUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvUHJlcGFyZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxh
bmdSSS9QcmVwYXJlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBD
b3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElT
JycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworZnVu
Y3Rpb24gcHJlcGFyZShvcmlnaW4sIGxpbmVOdW1iZXJPZmZzZXQsIHRleHQpCit7CisgICAgbGV0
IHByb2dyYW0gPSBuZXcgUHJvZ3JhbSgpOworICAgIHBhcnNlKHByb2dyYW0sICI8c3RkbGliPiIs
IDI4LCBzdGFuZGFyZExpYnJhcnkpOworICAgIHBhcnNlKHByb2dyYW0sIG9yaWdpbiwgbGluZU51
bWJlck9mZnNldCwgdGV4dCk7CisgICAgcmVzb2x2ZU5hbWVzKHByb2dyYW0pOworICAgIHJlc29s
dmVUeXBlRGVmcyhwcm9ncmFtKTsKKyAgICBjaGVjayhwcm9ncmFtKTsKKyAgICBpbmxpbmUocHJv
Z3JhbSk7CisgICAgcmV0dXJuIHByb2dyYW07Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJ
L1Byb2dyYW0uanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUHJvZ3JhbS5qcwko
bm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm9ncmFtLmpzCSh3b3JraW5nIGNv
cHkpCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5j
LiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4g
c291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9u
LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisg
KiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0
YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRp
dGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9u
cyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAg
ICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns
YWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMg
cHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMg
UFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJ
TVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAq
IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEg
UEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxM
IEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1Qs
IElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFV
RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VS
RU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEs
IE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VE
IEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1Qs
IFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBP
VEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBT
T0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFH
RS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgUHJvZ3JhbSBleHRlbmRzIE5vZGUgewor
ICAgIGNvbnN0cnVjdG9yKCkKKyAgICB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMu
X3RvcExldmVsU3RhdGVtZW50cyA9IFtdOworICAgICAgICB0aGlzLl9mdW5jdGlvbnMgPSBuZXcg
TWFwKCk7CisgICAgICAgIHRoaXMuX3R5cGVzID0gbmV3IE1hcCgpOworICAgICAgICB0aGlzLl9m
dW5jSW5zdGFudGlhdG9yID0gbmV3IEZ1bmNJbnN0YW50aWF0b3IoKTsKKyAgICB9CisgICAgCisg
ICAgZ2V0IHRvcExldmVsU3RhdGVtZW50cygpIHsgcmV0dXJuIHRoaXMuX3RvcExldmVsU3RhdGVt
ZW50czsgfQorICAgIGdldCBmdW5jdGlvbnMoKSB7IHJldHVybiB0aGlzLl9mdW5jdGlvbnM7IH0K
KyAgICBnZXQgdHlwZXMoKSB7IHJldHVybiB0aGlzLl90eXBlczsgfQorICAgIGdldCBmdW5jSW5z
dGFudGlhdG9yKCkgeyByZXR1cm4gdGhpcy5fZnVuY0luc3RhbnRpYXRvcjsgfQorICAgIAorICAg
IGFkZChzdGF0ZW1lbnQpCisgICAgeworICAgICAgICBzdGF0ZW1lbnQucHJvZ3JhbSA9IHRoaXM7
CisgICAgICAgIGlmIChzdGF0ZW1lbnQgaW5zdGFuY2VvZiBGdW5jKSB7CisgICAgICAgICAgICBs
ZXQgYXJyYXkgPSB0aGlzLl9mdW5jdGlvbnMuZ2V0KHN0YXRlbWVudC5uYW1lKTsKKyAgICAgICAg
ICAgIGlmICghYXJyYXkpCisgICAgICAgICAgICAgICAgdGhpcy5fZnVuY3Rpb25zLnNldChzdGF0
ZW1lbnQubmFtZSwgYXJyYXkgPSBbXSk7CisgICAgICAgICAgICBhcnJheS5wdXNoKHN0YXRlbWVu
dCk7CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGVtZW50IGluc3RhbmNlb2YgVHlwZSkKKyAgICAg
ICAgICAgIHRoaXMuX3R5cGVzLnNldChzdGF0ZW1lbnQubmFtZSwgc3RhdGVtZW50KTsKKyAgICAg
ICAgZWxzZQorICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdGF0ZW1lbnQgaXMgbm90IGEg
ZnVuY3Rpb24gb3IgdHlwZTogIiArIHN0YXRlbWVudCk7CisgICAgICAgIHRoaXMuX3RvcExldmVs
U3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudCk7CisgICAgfQorICAgIAorICAgIHJlc29sdmVGdW5j
T3ZlcmxvYWQobmFtZSwgdHlwZUFyZ3VtZW50cywgYXJndW1lbnRUeXBlcykKKyAgICB7CisgICAg
ICAgIGxldCBmdW5jdGlvbnMgPSB0aGlzLmZ1bmN0aW9ucy5nZXQobmFtZSk7CisgICAgICAgIGlm
ICghZnVuY3Rpb25zKQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIAorICAgICAg
ICByZXR1cm4gcmVzb2x2ZU92ZXJsb2FkSW1wbChmdW5jdGlvbnMsIHR5cGVBcmd1bWVudHMsIGFy
Z3VtZW50VHlwZXMpOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZUNvbnRleHQoKQorICAgIHsK
KyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBOYW1lQ29udGV4dCgpOworICAgICAgICBmb3IgKGxl
dCBzdGF0ZW1lbnQgb2YgdGhpcy50b3BMZXZlbFN0YXRlbWVudHMpCisgICAgICAgICAgICByZXN1
bHQuYWRkKHN0YXRlbWVudCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAor
ICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5fdG9wTGV2ZWxTdGF0ZW1l
bnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgcmV0dXJuIHRoaXMu
X3RvcExldmVsU3RhdGVtZW50cy5qb2luKCI7IikgKyAiOyI7CisgICAgfQorfQorCkluZGV4OiBU
b29scy9BcnJheUxhbmdSSS9Qcm90b2NvbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9Qcm90b2NvbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Qcm90
b2NvbC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0
IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3Ry
aWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhv
dXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs
b3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz
b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisg
KiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFi
b3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQg
dGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQv
b3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisg
KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBB
TlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZ
IEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu
ICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElB
QkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVY
RU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElN
SVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7
IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU
SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBX
SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVE
SU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRI
RSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lC
SUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb3Rv
Y29sIGV4dGVuZHMgTm9kZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsK
KyAgICAgICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl9uYW1lID0gbmFt
ZTsKKyAgICB9CisgICAgCisgICAgZ2V0IG9yaWdpbigpIHsgcmV0dXJuIHRoaXMuX29yaWdpbjsg
fQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5fbmFtZTsgfQorICAgIGdldCBraW5kKCkg
eyByZXR1cm4gUHJvdG9jb2w7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisgICAgeworICAgICAg
ICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1By
b3RvY29sRGVjbC5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9Qcm90b2NvbERl
Y2wuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHJvdG9jb2xEZWNsLmpz
CSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFByb3RvY29sRGVj
bCBleHRlbmRzIFByb3RvY29sIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAg
eworICAgICAgICBzdXBlcihvcmlnaW4sIG5hbWUpCisgICAgICAgIHRoaXMuX3NpZ25hdHVyZXMg
PSBbXTsKKyAgICAgICAgdGhpcy5fc2lnbmF0dXJlTWFwID0gbmV3IE1hcCgpOworICAgICAgICB0
aGlzLl90eXBlVmFyaWFibGUgPSBuZXcgVHlwZVZhcmlhYmxlKG9yaWdpbiwgbmFtZSwgbnVsbCk7
CisgICAgfQorICAgIAorICAgIGFkZFNpZ25hdHVyZShzaWduYXR1cmUpCisgICAgeworICAgICAg
ICAvLyBOT1RFOiBBbnkgdHlwZSBwYXJhbWV0ZXJzIGZvdW5kIGluIHRoZSBzaWduYXR1cmUgbXVz
dCBiZSBpbmZlcmFibGUgZnJvbSB0aGUgdmFsdWUKKyAgICAgICAgLy8gcGFyYW1ldGVycy4KKyAg
ICAgICAgLy8gRklYTUU6IENoZWNrIHRoaXMhIChPT1BTISkKKyAgICAgICAgdGhpcy5fc2lnbmF0
dXJlcy5wdXNoKHNpZ25hdHVyZSk7CisgICAgICAgIGxldCBvdmVybG9hZHMgPSB0aGlzLl9zaWdu
YXR1cmVNYXAuZ2V0KHNpZ25hdHVyZS5uYW1lKTsKKyAgICAgICAgaWYgKCFvdmVybG9hZHMpCisg
ICAgICAgICAgICB0aGlzLl9zaWduYXR1cmVNYXAuc2V0KHNpZ25hdHVyZS5uYW1lLCBvdmVybG9h
ZHMgPSBbXSk7CisgICAgICAgIG92ZXJsb2Fkcy5wdXNoKHNpZ25hdHVyZSk7CisgICAgfQorICAg
IAorICAgIGdldCBzaWduYXR1cmVzKCkgeyByZXR1cm4gdGhpcy5fc2lnbmF0dXJlczsgfQorICAg
IHNpZ25hdHVyZXNCeU5hbWUobmFtZSkgeyByZXR1cm4gdGhpcy5fc2lnbmF0dXJlTWFwLmdldChu
YW1lKTsgfQorICAgIGdldCB0eXBlVmFyaWFibGUoKSB7IHJldHVybiB0aGlzLl90eXBlVmFyaWFi
bGU7IH0KKyAgICAKKyAgICBzaWduYXR1cmVzQnlOYW1lV2l0aFR5cGVWYXJpYWJsZShuYW1lLCB0
eXBlVmFyaWFibGUpCisgICAgeworICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gbmV3IFN1YnN0
aXR1dGlvbihbdGhpcy50eXBlVmFyaWFibGVdLCBbdHlwZVZhcmlhYmxlXSk7CisgICAgICAgIGxl
dCByZXN1bHQgPSB0aGlzLnNpZ25hdHVyZXNCeU5hbWUobmFtZSk7CisgICAgICAgIGlmICghcmVz
dWx0KQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIHJldHVybiByZXN1bHQubWFw
KHNpZ25hdHVyZSA9PiBzaWduYXR1cmUudmlzaXQoc3Vic3RpdHV0aW9uKSk7CisgICAgfQorICAg
IAorICAgIGluaGVyaXRzKG90aGVyUHJvdG9jb2wpCisgICAgeworICAgICAgICBpZiAoIW90aGVy
UHJvdG9jb2wpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlm
IChvdGhlclByb3RvY29sIGluc3RhbmNlb2YgUHJvdG9jb2xSZWYpCisgICAgICAgICAgICBvdGhl
clByb3RvY29sID0gb3RoZXJQcm90b2NvbC5wcm90b2NvbERlY2w7CisgICAgICAgIAorICAgICAg
ICBmb3IgKGxldCBvdGhlclNpZ25hdHVyZSBvZiBvdGhlclByb3RvY29sLnNpZ25hdHVyZXMpIHsK
KyAgICAgICAgICAgIGxldCBzaWduYXR1cmVzID0gdGhpcy5zaWduYXR1cmVzQnlOYW1lKG90aGVy
U2lnbmF0dXJlLm5hbWUpOworICAgICAgICAgICAgaWYgKCFzaWduYXR1cmVzKQorICAgICAgICAg
ICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGxldCBvdmVybG9hZCA9IHJlc29sdmVP
dmVybG9hZEltcGwoc2lnbmF0dXJlcywgW10sIG90aGVyU2lnbmF0dXJlLnBhcmFtZXRlclR5cGVz
KTsKKyAgICAgICAgICAgIGlmICghb3ZlcmxvYWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZh
bHNlOworICAgICAgICAgICAgbGV0IHN1YnN0aXR1dGVkUmV0dXJuVHlwZSA9CisgICAgICAgICAg
ICAgICAgb3ZlcmxvYWQuZnVuYy5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAor
ICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUudHlwZVBhcmFtZXRlcnMsIG92ZXJsb2FkLnVu
aWZpY2F0aW9uQ29udGV4dCk7CisgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGVkUmV0dXJuVHlw
ZS5lcXVhbHMob3RoZXJTaWduYXR1cmUucmV0dXJuVHlwZSkpCisgICAgICAgICAgICAgICAgcmV0
dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAK
KyAgICBoYXNIZWlyKHR5cGUpCisgICAgeworICAgICAgICBsZXQgc3Vic3RpdHV0aW9uID0gU3Vi
c3RpdHV0aW9uLm1hcHBpbmcoW3RoaXMuX3R5cGVWYXJpYWJsZV0sIFt0eXBlXSk7CisgICAgICAg
IGZvciAobGV0IGFic3RyYWN0U2lnbmF0dXJlIG9mIHRoaXMuX3NpZ25hdHVyZXMpIHsKKyAgICAg
ICAgICAgIGxldCBzaWduYXR1cmUgPSBzaWduYXR1cmUudmlzaXQoc3Vic3RpdHV0aW9uKTsKKyAg
ICAgICAgICAgIGxldCBvdmVybG9hZCA9IHRoaXMucHJvZ3JhbS5yZXNvbHZlRnVuY092ZXJsb2Fk
KHNpZ25hdHVyZS5uYW1lLCBbXSwgc2lnbmF0dXJlLnBhcmFtZXRlclR5cGVzKTsKKyAgICAgICAg
ICAgIGlmICghb3ZlcmxvYWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICAgICAgCisgICAgICAgICAgICBsZXQgc3Vic3RpdHV0ZWRSZXR1cm5UeXBlID0gb3ZlcmxvYWQu
ZnVuYy5yZXR1cm5UeXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9uKAorICAgICAgICAgICAgICAg
IG92ZXJsb2FkLmZ1bmMudHlwZVBhcmFtZXRlcnMsIG92ZXJsb2FkLnVuaWZpY2F0aW9uQ29udGV4
dCk7CisgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGVkUmV0dXJuVHlwZS5lcXVhbHMoc2lnbmF0
dXJlLnJldHVyblR5cGUpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAg
fQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAg
IHsKKyAgICAgICAgcmV0dXJuICJwcm90b2NvbCAiICsgdGhpcy5uYW1lICsgIiB7ICIgKyB0aGlz
LnNpZ25hdHVyZXMuam9pbigiOyAiKSArICI7IH0iOworICAgIH0KK30KKworCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9Qcm90b2NvbFJlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxh
bmdSSS9Qcm90b2NvbFJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9Q
cm90b2NvbFJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29w
eXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBS
ZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9y
IHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo
ZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9u
cyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2Ug
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlv
biBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4K
KyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycn
IEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRB
QklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NM
QUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMg
QkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwK
KyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VS
VklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5U
RVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklM
SVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAo
SU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VU
IE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUg
UE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNz
IFByb3RvY29sUmVmIGV4dGVuZHMgUHJvdG9jb2wgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwg
bmFtZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG9yaWdpbiwgbmFtZSk7CisgICAgICAgIHRoaXMu
cHJvdG9jb2xEZWNsID0gbnVsbDsKKyAgICB9CisgICAgCisgICAgaW5oZXJpdHMob3RoZXIpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbERlY2wuaW5oZXJpdHMob3RoZXIpOwor
ICAgIH0KKyAgICAKKyAgICBoYXNIZWlyKHR5cGUpCisgICAgeworICAgICAgICByZXR1cm4gdGhp
cy5wcm90b2NvbERlY2wuaGFzSGVpcih0eXBlKTsKKyAgICB9Cit9CkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9QdHJUeXBlLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1B0clR5
cGUuanMJKG5vbmV4aXN0ZW50KQorKysgVG9vbHMvQXJyYXlMYW5nUkkvUHRyVHlwZS5qcwkod29y
a2luZyBjb3B5KQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFw
cGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywg
VEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVO
VCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFB0clR5cGUgZXh0ZW5kcyBS
ZWZlcmVuY2VUeXBlIHsKKyAgICB1bmlmeUltcGwodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcikK
KyAgICB7CisgICAgICAgIGlmICghb3RoZXIgaW5zdGFuY2VvZiBQdHJUeXBlKQorICAgICAgICAg
ICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50VHlwZS51bmlmeSh1
bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyLmVsZW1lbnRUeXBlKTsKKyAgICB9CisgICAgCisgICAg
dG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYWRkcmVzc1NwYWNlICsgIiAi
ICsgdGhpcy5lbGVtZW50VHlwZSArICJeIjsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5
TGFuZ1JJL1JlZmVyZW5jZVR5cGUuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkv
UmVmZXJlbmNlVHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZWZl
cmVuY2VUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5
cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl
ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig
d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl
IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z
IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9u
IGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgor
ICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycg
QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC
SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB
SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBC
RSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAor
ICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5P
VCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJW
SUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRF
UlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJ
VFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJ
TkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQg
T0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQ
T1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3Mg
UmVmZXJlbmNlVHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdpbiwgYWRk
cmVzc1NwYWNlLCBlbGVtZW50VHlwZSkKKyAgICB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAg
IHZhbGlkYXRlQWRkcmVzc1NwYWNlKGFkZHJlc3NTcGFjZSk7CisgICAgICAgIHRoaXMuX29yaWdp
biA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fYWRkcmVzc1NwYWNlID0gYWRkcmVzc1NwYWNlOwor
ICAgICAgICB0aGlzLl9lbGVtZW50VHlwZSA9IGVsZW1lbnRUeXBlOworICAgIH0KKyAgICAKKyAg
ICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IGFkZHJlc3NT
cGFjZSgpIHsgcmV0dXJuIHRoaXMuX2FkZHJlc3NTcGFjZTsgfQorICAgIGdldCBlbGVtZW50VHlw
ZSgpIHsgcmV0dXJuIHRoaXMuX2VsZW1lbnRUeXBlOyB9CisgICAgZ2V0IGlzUHJpbWl0aXZlKCkg
eyByZXR1cm4gZmFsc2U7IH0KKworICAgIGdldCBzaXplKCkgeyByZXR1cm4gMTsgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9SZXNvbHZlTmFtZXMuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvUmVzb2x2ZU5hbWVzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL1Jlc29sdmVOYW1lcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMwIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2Z1bmN0aW9uIHJlc29sdmVOYW1lcyhwcm9ncmFtKQoreworICAgIHByb2dyYW0udmlz
aXQobmV3IE5hbWVSZXNvbHZlcigpKTsKK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Jlc29s
dmVPdmVybG9hZEltcGwuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvUmVzb2x2
ZU92ZXJsb2FkSW1wbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXNv
bHZlT3ZlcmxvYWRJbXBsLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisg
KiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoK
KyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdp
dGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRo
YXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmli
dXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAq
ICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlz
Y2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv
ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVu
dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0
aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFT
IElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJD
SEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUg
RElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJV
VE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVD
SUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywg
QlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBP
UiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVT
UyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBM
SUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQK
KyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdB
WSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9G
IFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKwor
ZnVuY3Rpb24gcmVzb2x2ZU92ZXJsb2FkSW1wbChmdW5jdGlvbnMsIHR5cGVBcmd1bWVudHMsIGFy
Z3VtZW50VHlwZXMpCit7CisgICAgZm9yIChsZXQgZnVuYyBvZiBmdW5jdGlvbnMpIHsKKyAgICAg
ICAgaWYgKHR5cGVBcmd1bWVudHMubGVuZ3RoICYmIHR5cGVBcmd1bWVudHMubGVuZ3RoICE9IGZ1
bmMudHlwZVBhcmFtZXRlcnMubGVuZ3RoKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAg
IGlmIChhcmd1bWVudFR5cGVzLmxlbmd0aCAhPSBmdW5jLnBhcmFtZXRlcnMubGVuZ3RoKQorICAg
ICAgICAgICAgY29udGludWU7CisgICAgICAgIGxldCB1bmlmaWNhdGlvbkNvbnRleHQgPSBuZXcg
VW5pZmljYXRpb25Db250ZXh0KGZ1bmMudHlwZVBhcmFtZXRlcnMpOworICAgICAgICBsZXQgb2sg
PSB0cnVlOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVBcmd1bWVudHMubGVuZ3Ro
OyArK2kpIHsKKyAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07Cisg
ICAgICAgICAgICBsZXQgcGFyYW1ldGVyID0gZnVuYy50eXBlUGFyYW1ldGVyc1tpXTsKKyAgICAg
ICAgICAgIGlmICghYXJndW1lbnQudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBwYXJhbWV0ZXIp
KSB7CisgICAgICAgICAgICAgICAgb2sgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsK
KyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAg
Y29udGludWU7CisgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBlcy5sZW5n
dGg7ICsraSkgeworICAgICAgICAgICAgaWYgKCFhcmd1bWVudFR5cGVzW2ldKQorICAgICAgICAg
ICAgICAgIHRocm93IG5ldyBFcnJvcigiTnVsbCBhcmd1bWVudCB0eXBlIGF0IGkgPSAiICsgaSk7
CisgICAgICAgICAgICBpZiAoIWFyZ3VtZW50VHlwZXNbaV0udW5pZnkodW5pZmljYXRpb25Db250
ZXh0LCBmdW5jLnBhcmFtZXRlcnNbaV0udHlwZSkpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZh
bHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9Cisg
ICAgICAgIGlmICghb2spCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKCF1bmlm
aWNhdGlvbkNvbnRleHQudmVyaWZ5KCkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAg
bGV0IHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cyA9ICF0eXBlQXJndW1lbnRzLmxlbmd0aDsKKyAg
ICAgICAgaWYgKHNob3VsZEJ1aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgIHR5cGVBcmd1
bWVudHMgPSBbXTsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFtZXRlciBvZiBmdW5jLnR5cGVQ
YXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBsZXQgdHlwZUFyZ3VtZW50ID0gdW5pZmljYXRpb25D
b250ZXh0LmZpbmQodHlwZVBhcmFtZXRlcik7CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50
ID09IHR5cGVQYXJhbWV0ZXIpIHsKKyAgICAgICAgICAgICAgICBvayA9IGZhbHNlOworICAgICAg
ICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNob3VsZEJ1
aWxkVHlwZUFyZ3VtZW50cykKKyAgICAgICAgICAgICAgICB0eXBlQXJndW1lbnRzLnB1c2godHlw
ZUFyZ3VtZW50KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9rKQorICAgICAgICAgICAgY29u
dGludWU7CisgICAgICAgIHJldHVybiB7ZnVuYywgdW5pZmljYXRpb25Db250ZXh0LCB0eXBlQXJn
dW1lbnRzfTsKKyAgICB9CisgICAgCisgICAgcmV0dXJuIG51bGw7Cit9CkluZGV4OiBUb29scy9B
cnJheUxhbmdSSS9SZXNvbHZlVHlwZURlZnMuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvUmVzb2x2ZVR5cGVEZWZzLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFu
Z1JJL1Jlc29sdmVUeXBlRGVmcy5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDMxIEBACisv
KgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4K
KyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1z
LCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRl
ZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2Yg
Y29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9j
dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3Ry
aWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4g
YGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0Yg
TUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0Ug
QVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05U
UklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwg
U1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJ
TkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09P
RFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVT
SU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICog
T0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBU
T1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFO
WSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNF
RCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7
CisKK2Z1bmN0aW9uIHJlc29sdmVUeXBlRGVmcyhwcm9ncmFtKQoreworICAgIHByb2dyYW0udmlz
aXQobmV3IFR5cGVEZWZSZXNvbHZlcigpKTsKK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkv
UmV0dXJuLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybi5qcwkobm9u
ZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9SZXR1cm4uanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXR1cm4gZXh0ZW5kcyBOb2RlIHsKKyAgICBj
b25zdHJ1Y3RvcihvcmlnaW4sIHZhbHVlKQorICAgIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAg
ICAgdGhpcy5fb3JpZ2luID0gb3JpZ2luOworICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cisg
ICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KKyAgICAKKyAgICB0b1N0cmlu
ZygpCisgICAgeworICAgICAgICBpZiAodGhpcy52YWx1ZSkKKyAgICAgICAgICAgIHJldHVybiAi
cmV0dXJuICIgKyB0aGlzLnZhbHVlOworICAgICAgICByZXR1cm4gInJldHVybiI7CisgICAgfQor
fTsKKwpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvUmV0dXJuRXhjZXB0aW9uLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1JldHVybkV4Y2VwdGlvbi5qcwkobm9uZXhpc3RlbnQp
CisrKyBUb29scy9BcnJheUxhbmdSSS9SZXR1cm5FeGNlcHRpb24uanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFs
bCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3Vy
Y2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFy
ZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFy
ZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4g
dGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9u
cyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGlu
IGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v
dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l
ciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92
aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9W
SURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJ
RUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1Q
TElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJU
SUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQ
TEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5E
SVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJ
QUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVO
VCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IK
KyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5E
IE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RS
SUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVS
V0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRX
QVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAK
KyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBSZXR1cm5FeGNlcHRpb24geworICAgIGNvbnN0
cnVjdG9yKHZhbHVlKQorICAgIHsKKyAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKKyAgICB9
CisgICAgCisgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KK30KSW5kZXg6
IFRvb2xzL0FycmF5TGFuZ1JJL1Jld3JpdGVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5
TGFuZ1JJL1Jld3JpdGVyLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Jl
d3JpdGVyLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJp
Z2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFO
RCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBO
T1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklM
SVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlN
RUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUg
TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAq
IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1Qg
TElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklD
RVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJS
VVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZ
LCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5D
TFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9G
IFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T
U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFJl
d3JpdGVyIHsKKyAgICBjb25zdHJ1Y3RvcigpCisgICAgeworICAgICAgICB0aGlzLl9tYXBwaW5n
ID0gbmV3IE1hcCgpOworICAgIH0KKyAgICAKKyAgICBfbWFwKG9sZEl0ZW0sIG5ld0l0ZW0pCisg
ICAgeworICAgICAgICB0aGlzLl9tYXBwaW5nLnNldChvbGRJdGVtLCBuZXdJdGVtKTsKKyAgICAg
ICAgcmV0dXJuIG5ld0l0ZW07CisgICAgfQorICAgIAorICAgIF9nZXRNYXBwaW5nKG9sZEl0ZW0p
CisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fbWFwcGluZy5nZXQob2xkSXRlbSk7
CisgICAgICAgIGlmIChyZXN1bHQpCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAg
ICByZXR1cm4gb2xkSXRlbTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGdW5jKG5vZGUpCisgICAg
eworICAgICAgICByZXR1cm4gbmV3IEZ1bmMoCisgICAgICAgICAgICBub2RlLm5hbWUsIG5vZGUu
cmV0dXJuVHlwZS52aXNpdCh0aGlzKSwKKyAgICAgICAgICAgIG5vZGUudHlwZVBhcmFtZXRlcnMu
bWFwKHR5cGVQYXJtZXRlciA9PiB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpKSwKKyAgICAgICAg
ICAgIG5vZGUucGFyYW1ldGVycy5tYXAocGFyYW1ldGVyID0+IHBhcmFtZXRlci52aXNpdCh0aGlz
KSkpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNQYXJhbWV0ZXIobm9kZSkKKyAgICB7Cisg
ICAgICAgIGxldCByZXN1bHQgPSBuZXcgRnVuY1BhcmFtZXRlcihub2RlLm5hbWUsIG5vZGUudHlw
ZS52aXNpdCh0aGlzKSk7CisgICAgICAgIHRoaXMuX21hcChub2RlLCByZXN1bHQpOworICAgICAg
ICByZXN1bHQubFZhbHVlID0gbm9kZS5sVmFsdWU7CisgICAgICAgIHJldHVybiByZXN1bHQ7Cisg
ICAgfQorICAgIAorICAgIHZpc2l0QmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1
bHQgPSBuZXcgQmxvY2sobm9kZS5vcmlnaW4pOworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQg
b2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAgICAgICAgICAgcmVzdWx0LmFkZChzdGF0ZW1lbnQudmlz
aXQodGhpcykpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICB2aXNp
dENvbW1hRXhwcmVzc2lvbihub2RlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21tYUV4
cHJlc3Npb24obm9kZS5vcmlnaW4sIG5vZGUubGlzdC5tYXAoZXhwcmVzc2lvbiA9PiB7CisgICAg
ICAgICAgICBsZXQgcmVzdWx0ID0gZXhwcmVzc2lvbi52aXNpdCh0aGlzKTsKKyAgICAgICAgICAg
IGlmICghcmVzdWx0KQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTnVsbCByZXN1
bHQgZnJvbSAiICsgZXhwcmVzc2lvbik7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAg
ICAgICB9KSk7CisgICAgfQorICAgIAorICAgIHZpc2l0UHJvdG9jb2xSZWYobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9k
ZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlwZVJlZihub2RlLm9yaWdpbiwg
bm9kZS5uYW1lLCBub2RlLnR5cGVBcmd1bWVudHMubWFwKHR5cGVBcmd1bWVudCA9PiB0eXBlQXJn
dW1lbnQudmlzaXQodGhpcykpKTsKKyAgICAgICAgcmVzdWx0LnR5cGUgPSBub2RlLnR5cGU7Cisg
ICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHZpc2l0VHlwZVZhcmlhYmxl
KG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbm9kZTsKKyAgICB9CisgICAgCisgICAgdmlz
aXRDb25zdGV4cHJUeXBlUGFyYW1ldGVyKG5vZGUpCisgICAgeworICAgICAgICByZXR1cm4gbmV3
IENvbnN0ZXhwclR5cGVQYXJhbWV0ZXIobm9kZS5vcmlnaW4sIG5vZGUubmFtZSwgbm9kZS50eXBl
LnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRGaWVsZChub2RlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZChub2RlLm9yaWdpbiwgbm9kZS5uYW1lLCBub2RlLnR5
cGUudmlzaXQodGhpcykpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFJlZmVyZW5jZVR5cGUobm9k
ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBuZXcgbm9kZS5jb25zdHJ1Y3Rvcihub2RlLnJvZ2lp
biwgbm9kZS5hZGRyZXNzU3BhY2UsIG5vZGUuZWxlbWVudFR5cGUudmlzaXQodGhpcykpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFB0clR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0
aGlzLnZpc2l0UmVmZXJlbmNlVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJh
eVJlZlR5cGUobm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiB0aGlzLnZpc2l0UmVmZXJlbmNl
VHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVR5cGUobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlUeXBlKG5vZGUub3JpZ2luLCBub2RlLmVsZW1lbnRU
eXBlLnZpc2l0KHRoaXMpKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBc3NpZ25tZW50KG5vZGUp
CisgICAgeworICAgICAgICByZXR1cm4gbmV3IEFzc2lnbm1lbnQobm9kZS5vcmlnaW4sIG5vZGUu
bGhzLnZpc2l0KHRoaXMpLCBub2RlLnJocy52aXNpdCh0aGlzKSk7CisgICAgfQorICAgIAorICAg
IHZpc2l0VmFyaWFibGVSZWYobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudmFyaWFibGUgPSB0
aGlzLl9nZXRNYXBwaW5nKG5vZGUudmFyaWFibGUpOworICAgICAgICByZXR1cm4gbm9kZTsKKyAg
ICB9CisgICAgCisgICAgdmlzaXRSZXR1cm4obm9kZSkKKyAgICB7CisgICAgICAgIHJldHVybiBu
ZXcgUmV0dXJuKG5vZGUub3JpZ2luLCBub2RlLnZhbHVlID8gbm9kZS52YWx1ZS52aXNpdCh0aGlz
KSA6IG51bGwpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEludExpdGVyYWwobm9kZSkKKyAgICB7
CisgICAgICAgIHJldHVybiBub2RlOworICAgIH0KKworICAgIHZpc2l0Q2FsbEV4cHJlc3Npb24o
bm9kZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgQ2FsbEV4cHJlc3Npb24oCisg
ICAgICAgICAgICBub2RlLm9yaWdpbiwgbm9kZS5uYW1lLAorICAgICAgICAgICAgbm9kZS50eXBl
QXJndW1lbnRzLm1hcCh0eXBlQXJndW1lbnQgPT4gdHlwZUFyZ3VtZW50LnZpc2l0KHRoaXMpKSwK
KyAgICAgICAgICAgIG5vZGUuYXJndW1lbnRsaXN0Lm1hcChhcmd1bWVudCA9PiBhcmd1bWVudC52
aXNpdCh0aGlzKSkpOworICAgICAgICBsZXQgYWN0dWFsVHlwZUFyZ3VtZW50cyA9IG5vZGUuYWN0
dWFsVHlwZUFyZ3VtZW50czsKKyAgICAgICAgaWYgKGFjdHVhbFR5cGVBcmd1bWVudHMpIHsKKyAg
ICAgICAgICAgIHJlc3VsdC5hY3R1YWxUeXBlQXJndW1lbnRzID0KKyAgICAgICAgICAgICAgICBh
Y3R1YWxUeXBlQXJndW1lbnRzLm1hcChhY3R1YWxUeXBlQXJndW1lbnQgPT4gYWN0dWFsVHlwZUFy
Z3VtZW50LnZpc2l0KHRoaXMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0Owor
ICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmN0aW9uTGlrZUJsb2NrKG5vZGUpCisgICAgeworICAg
ICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uTGlrZUJsb2NrKAorICAgICAgICAgICAgbm9kZS5vcmln
aW4sCisgICAgICAgICAgICBub2RlLmFyZ3VtZW50TGlzdC5tYXAoYXJndW1lbnQgPT4gYXJndW1l
bnQudmlzaXQodGhpcykpLAorICAgICAgICAgICAgbm9kZS5wYXJhbWV0ZXJzLm1hcChwYXJhbWV0
ZXIgPT4gcGFyYW1ldGVyLnZpc2l0KHRoaXMpKSwKKyAgICAgICAgICAgIG5vZGUuYm9keS52aXNp
dCh0aGlzKSk7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9TdGFuZGFyZExp
YnJhcnkuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvU3RhbmRhcmRMaWJyYXJ5
LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1N0YW5kYXJkTGlicmFyeS5q
cwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAy
MDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlv
biBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAq
IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcg
Y29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2Ug
Y29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMg
bGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBS
ZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3Ro
ZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElT
IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAq
IEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRF
RCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBG
SVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBO
TyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZP
UiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFS
WSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1Mg
T0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI
T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVS
IElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5F
R0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UK
KyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkg
T0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKKy8vIE5PVEU6IFRoZSBuZXh0
IGxpbmUgaXMgbGluZSAyOCwgYW5kIHdlIHJlbHkgb24gdGhpcyBpbiBQcmVwYXJlLmpzLgorY29u
c3Qgc3RhbmRhcmRMaWJyYXJ5ID0gYAorLy8gVGhpcyBpcyB0aGUgQXJyYXlMYW5nIHN0YW5kYXJk
IGxpYnJhcnkuIEltcGxlbWVudGF0aW9ucyBvZiBhbGwgb2YgdGhlc2UgdGhpbmdzIGFyZSBpbgor
Ly8gSW50cmluc2ljcy5qcy4KKworLy8gTmVlZCB0byBib290c3RyYXAgdm9pZCBmaXJzdC4KK25h
dGl2ZSBwcmltaXRpdmUgdHlwZSB2b2lkOworbmF0aXZlIHByaW1pdGl2ZSB0eXBlIGludDMyOwor
dHlwZSBpbnQgPSBpbnQzMjsKKworbmF0aXZlIGludCBvcGVyYXRvcisoaW50LCBpbnQpOworYDsK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N0cnVjdFR5cGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvU3RydWN0VHlwZS5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9TdHJ1Y3RUeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsNzUgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgU3RydWN0VHlwZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9yKG9yaWdp
biwgbmFtZSwgdHlwZVBhcmFtZXRlcnMpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl90eXBlUGFy
YW1ldGVycyA9IHR5cGVQYXJhbWV0ZXJzOworICAgICAgICB0aGlzLl9maWVsZHMgPSBuZXcgTWFw
KCk7CisgICAgfQorICAgIAorICAgIGFkZChmaWVsZCkKKyAgICB7CisgICAgICAgIGlmICh0aGlz
Ll9maWVsZHMuaGFzKGZpZWxkLm5hbWUpKQorICAgICAgICAgICAgdGhyb3cgbmV3IEFMVHlwZUVy
cm9yKGZpZWxkLm9yaWdpbi5vcmlnaW5TdHJpbmcsICJEdXBsaWNhdGUgZmllbGQgbmFtZTogIiAr
IGZpZWxkLm5hbWUpOworICAgICAgICB0aGlzLl9maWVsZHMuc2V0KGZpZWxkLm5hbWUsIGZpZWxk
KTsKKyAgICB9CisgICAgCisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9Cisg
ICAgZ2V0IHR5cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0K
KyAgICAKKyAgICBnZXQgZmllbGROYW1lcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy5rZXlzKCk7
IH0KKyAgICBmaWVsZEJ5TmFtZShuYW1lKSB7IHJldHVybiB0aGlzLl9maWVsZHMuZ2V0KG5hbWUp
OyB9CisgICAgZ2V0IGZpZWxkcygpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkcy52YWx1ZXMoKTsgfQor
ICAgIGdldCBmaWVsZE1hcCgpIHsgcmV0dXJuIHRoaXMuX2ZpZWxkczsgfQorICAgIGdldCBpc1By
aW1pdGl2ZSgpCisgICAgeworICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKKyAgICAgICAgZm9y
IChsZXQgZmllbGQgb2YgdGhpcy5maWVsZHMpCisgICAgICAgICAgICByZXN1bHQgJj0gZmllbGQu
dHlwZS5pc1ByaW1pdGl2ZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgCisg
ICAgaW5zdGFudGlhdGUodHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIGlmICh0eXBlQXJn
dW1lbnRzLmxlbmd0aCAhPSB0aGlzLnR5cGVQYXJhbWV0ZXJzLmxlbmd0aCkKKyAgICAgICAgICAg
IHRocm93IG5ldyBBTFR5cGVFcnJvcihvcmlnaW4ub3JpZ2luU3RyaW5nLCAiV3JvbmcgbnVtYmVy
IG9mIHR5cGUgYXJndW1lbnRzIHRvIGluc3RhbnRpYXRpb24iKTsKKyAgICAgICAgCisgICAgICAg
IGxldCBzdWJzdGl0dXRpb24gPSBTdWJzdGl0dXRpb24ubWFwcGluZyh0aGlzLnR5cGVQYXJhbWV0
ZXJzLCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgbGV0IGluc3RhbnRpYXRlSW1tZWRpYXRlcyA9
IG5ldyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMoKTsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBT
dHJ1Y3RUeXBlKHRoaXMub3JpZ2luLCB0aGlzLm5hbWUsIFtdKTsKKyAgICAgICAgZm9yIChsZXQg
ZmllbGQgb2YgdGhpcy5maWVsZHMpCisgICAgICAgICAgICByZXN1bHQuYWRkKGZpZWxkLnZpc2l0
KHN1YnN0aXR1dGlvbikudmlzaXQoaW5zdGFudGlhdGVJbW1lZGlhdGVzKSk7CisgICAgICAgIHJl
dHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAg
IHJldHVybiAic3RydWN0ICIgKyB0aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVQYXJhbWV0ZXJz
ICsgIj4geyAiICsgQXJyYXkuZnJvbSh0aGlzLmZpZWxkcykuam9pbigiOyAiKSArICI7IH0iOwor
ICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1N1YnN0aXR1dGlvbi5qcwo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9TdWJzdGl0dXRpb24uanMJKG5vbmV4aXN0ZW50KQor
KysgVG9vbHMvQXJyYXlMYW5nUkkvU3Vic3RpdHV0aW9uLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0w
LDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFu
ZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0
OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBh
Ym92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5k
IHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5h
cnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2Us
IHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4g
dGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQg
d2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQg
QlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdB
UlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQg
V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxB
UgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElO
Qy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNU
LCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERB
TUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0Yg
U1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQ
Uk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBB
TlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBM
SUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up
IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwg
RVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8K
KyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgU3Vic3RpdHV0aW9uIGV4dGVuZHMgUmV3cml0ZXIgewor
ICAgIGNvbnN0cnVjdG9yKG1hcCkKKyAgICB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRo
aXMuX21hcCA9IG1hcDsKKyAgICB9CisgICAgCisgICAgc3RhdGljIG1hcHBpbmcocGFyYW1ldGVy
cywgYXJndW1lbnRMaXN0KQorICAgIHsKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMubGVuZ3RoICE9
IGFyZ3VtZW50TGlzdC5sZW5ndGgpCisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBhcmFt
ZXRlcnMgYW5kIGFyZ3VtZW50cyBhcmUgbWlzbWF0Y2hlZCIpOworICAgICAgICBsZXQgbWFwID0g
bmV3IE1hcCgpOworICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3Ro
OyArK2kpCisgICAgICAgICAgICBtYXAuc2V0KHBhcmFtZXRlcnNbaV0sIGFyZ3VtZW50TGlzdFtp
XSk7CisgICAgICAgIHJldHVybiBuZXcgU3Vic3RpdHV0aW9uKG1hcCk7CisgICAgfQorICAgIAor
ICAgIHZpc2l0VHlwZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50ID0g
dGhpcy5fbWFwLmdldChub2RlLnR5cGUpOworICAgICAgICBpZiAocmVwbGFjZW1lbnQpIHsKKyAg
ICAgICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgICAg
IHRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB0eXBlIGFyZ3VtZW50cyBvbiB0eXBlIHZhcmlh
YmxlIik7CisgICAgICAgICAgICByZXR1cm4gcmVwbGFjZW1lbnQ7CisgICAgICAgIH0KKyAgICAg
ICAgCisgICAgICAgIHJldHVybiBzdXBlci52aXNpdFR5cGVSZWYobm9kZSk7CisgICAgfQorCisg
ICAgdmlzaXRWYXJpYWJsZVJlZihub2RlKQorICAgIHsKKyAgICAgICAgbGV0IHJlcGxhY2VtZW50
ID0gdGhpcy5fbWFwLmdldChub2RlLnZhcmlhYmxlKTsKKyAgICAgICAgaWYgKHJlcGxhY2VtZW50
KQorICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICAKKyAgICAgICAgcmV0
dXJuIHN1cGVyLnZpc2l0VmFyaWFibGVSZWYobm9kZSk7CisgICAgfQorfQorCkluZGV4OiBUb29s
cy9BcnJheUxhbmdSSS9TdWZmaXhDYWxsQXNzaWdubWVudC5qcwo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29s
cy9BcnJheUxhbmdSSS9TdWZmaXhDYWxsQXNzaWdubWVudC5qcwkobm9uZXhpc3RlbnQpCisrKyBU
b29scy9BcnJheUxhbmdSSS9TdWZmaXhDYWxsQXNzaWdubWVudC5qcwkod29ya2luZyBjb3B5KQpA
QCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxs
IHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJj
ZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJl
IHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJl
IG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0
aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25z
IGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4g
YmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
IGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp
ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJ
REVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElF
RCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBM
SUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJ
Q1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBM
RSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJ
UkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElB
TCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5U
IE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgor
ICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQg
T04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJ
Q1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJX
SVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdB
UkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAor
ICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFN1ZmZpeENhbGxBc3NpZ25tZW50IGV4dGVuZHMg
RXhwcmVzc2lvbiB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCBsaHMpCisgICAgewor
ICAgICAgICBzdXBlcihvcmlnaW4pOworICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKKyAgICAg
ICAgdGhpcy5fbGhzID0gbGhzOworICAgICAgICB0aGlzLmZ1bmMgPSBudWxsOworICAgIH0KKyAg
ICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQgbGhzKCkg
eyByZXR1cm4gdGhpcy5fbGhzOyB9CisgICAgCisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAg
ICAgcmV0dXJuIHRoaXMubGhzICsgIiBzdWZmaXggIiArIHRoaXMubmFtZTsKKyAgICB9Cit9CisK
SW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1Rlc3QuanMKPT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJy
YXlMYW5nUkkvVGVzdC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UZXN0
LmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0
aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAor
ICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu
ZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJj
ZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIu
IFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUg
Y29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUg
Zm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBv
dGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRI
SVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQor
ICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1J
VEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5E
IEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElO
IE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE
IFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworbG9hZCgiQWxsLmpzIik7
CisKK3sKKyAgICBsZXQgcHJvZ3JhbSA9IHByZXBhcmUoIjx0ZXN0PiIsIDAsICJpbnQgZm9vKGlu
dCB4KSB7IHJldHVybiB4ICsgMTsgfSIpOworICAgIGxldCByZXN1bHQgPSBjYWxsRnVuY3Rpb24o
cHJvZ3JhbSwgImZvbyIsIFtdLCBbbmV3IEVJbnQocHJvZ3JhbS5pbnRyaW5zaWNzLmludDMyLCA0
MildKTsKKyAgICBpZiAoIShyZXN1bHQgaW5zdGFuY2VvZiBFSW50KSkKKyAgICAgICAgdGhyb3cg
bmV3IEVycm9yKCJXcm9uZyByZXN1bHQgdHlwZTsgcmVzdWx0OiAiICsgcmVzdWx0KTsKKyAgICBp
ZiAocmVzdWx0LnZhbHVlICE9IDQzKQorICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIHJl
c3VsdDogIiArIHJlc3VsdCk7Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGUuanMK
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlwZS5qcwkobm9uZXhpc3RlbnQpCisr
KyBUb29scy9BcnJheUxhbmdSSS9UeXBlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzgg
QEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkg
Zm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHBy
b3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4g
UmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5
cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBt
dXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAg
ICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUg
ZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUg
SU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMs
IElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElF
UyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVS
UE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAq
IENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVO
VEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElO
Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU
RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBP
UiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZ
CisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFks
IE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcg
SU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBB
RFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3Ry
aWN0IjsKKworY2xhc3MgVHlwZSBleHRlbmRzIE5vZGUgeworICAgIGdldCB0eXBlUGFyYW1ldGVy
cygpIHsgcmV0dXJuIFtdOyB9CisgICAgZ2V0IGtpbmQoKSB7IHJldHVybiBUeXBlOyB9CisgICAg
CisgICAgaW5oZXJpdHMocHJvdG9jb2wpCisgICAgeworICAgICAgICByZXR1cm4gcHJvdG9jb2wu
aGFzSGVpcih0aGlzKTsKKyAgICB9CisgICAgCisgICAgZ2V0IGluc3RhbnRpYXRlZFR5cGUoKSB7
IHJldHVybiB0aGlzLnZpc2l0KG5ldyBJbnN0YW50aWF0ZUltbWVkaWF0ZXMoKSk7IH0KK30KKwpJ
bmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVHlwZURlZi5qcwo9PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9B
cnJheUxhbmdSSS9UeXBlRGVmLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJ
L1R5cGVEZWYuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHly
aWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVk
aXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3
aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUg
Zm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMg
b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90
aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVy
LgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRo
ZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMg
YW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24g
YW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisg
KgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMnJyBB
TkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ
TElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJ
TUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJF
IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisg
KiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9U
IExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJ
Q0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVS
UlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElU
WSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElO
Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBP
RiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBP
U1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFzcyBU
eXBlRGVmIGV4dGVuZHMgVHlwZSB7CisgICAgY29uc3RydWN0b3Iob3JpZ2luLCBuYW1lLCB0eXBl
UGFyYW1ldGVycywgdHlwZSkKKyAgICB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMu
X29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRo
aXMuX3R5cGVQYXJhbWV0ZXJzID0gdHlwZVBhcmFtZXRlcnM7CisgICAgICAgIHRoaXMuX3R5cGUg
PSB0eXBlOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3Jp
Z2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisgICAgZ2V0IHR5
cGVQYXJhbWV0ZXJzKCkgeyByZXR1cm4gdGhpcy5fdHlwZVBhcmFtZXRlcnM7IH0KKyAgICBnZXQg
dHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KK30KKwpJbmRleDogVG9vbHMvQXJyYXlMYW5n
UkkvVHlwZURlZlJlc29sdmVyLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5
cGVEZWZSZXNvbHZlci5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBl
RGVmUmVzb2x2ZXIuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICog
UmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBv
ciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0
aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlv
bnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAg
bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFp
bWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRp
b24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24u
CisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09OVFJJQlVUT1JT
IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUws
CisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQg
Tk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNF
UlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElO
VEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJ
TElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICog
KElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V
VCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhF
IFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3QiOworCitjbGFz
cyBUeXBlRGVmUmVzb2x2ZXIgZXh0ZW5kcyBWaXNpdG9yIHsKKyAgICBjb25zdHJ1Y3RvcigpCisg
ICAgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLl92aXNpdGluZyA9IG5ldyBWaXNp
dGluZ1NldCgpOworICAgIH0KKyAgICAKKyAgICB2aXNpdFR5cGVSZWYobm9kZSkKKyAgICB7Cisg
ICAgICAgIHRoaXMuX3Zpc2l0aW5nLmRvVmlzaXQobm9kZSwgKCkgPT4geworICAgICAgICAgICAg
c3VwZXIudmlzaXRUeXBlUmVmKG5vZGUpOworICAgICAgICAgICAgaWYgKG5vZGUudHlwZSBpbnN0
YW5jZW9mIFR5cGVEZWYpIHsKKyAgICAgICAgICAgICAgICBsZXQgdW5pZmljYXRpb25Db250ZXh0
ID0gbmV3IFVuaWZpY2F0aW9uQ29udGV4dChub2RlLnR5cGUudHlwZVBhcmFtZXRlcnMpOworICAg
ICAgICAgICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9IG5vZGUudHlwZS50
eXBlUGFyYW1ldGVycy5sZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJv
cigiYXJndW1lbnQvcGFyYW1ldGVyIG1pc21hdGNoIChzaG91bGQgaGF2ZSBiZWVuIGNhdWdodCBl
YXJsaWVyKSIpOworICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS50eXBl
QXJndW1lbnRzLmxlbmd0aDsgKytpKQorICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGVBcmd1
bWVudHNbaV0udW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBub2RlLnR5cGUudHlwZVBhcmFtZXRl
cnNbaV0pOworICAgICAgICAgICAgICAgIGlmICghdW5pZmljYXRpb25Db250ZXh0LnZlcmlmeSgp
KQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3Iobm9kZS5vcmlnaW4u
b3JpZ2luU3RyaW5nLCAiVHlwZSByZWZlcmVuY2UgdG8gYSB0eXBlIGRlZmluaXRpb24gdmlvbGF0
ZXMgcHJvdG9jb2wgY29uc3RyYWludHMiKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAg
ICAgICBsZXQgbmV3VHlwZSA9IG5vZGUudHlwZS50eXBlLnN1YnN0aXR1dGVUb1VuaWZpY2F0aW9u
KG5vZGUudHlwZS50eXBlUGFyYW1ldGVycywgdW5pZmljYXRpb25Db250ZXh0KTsKKyAgICAgICAg
ICAgICAgICBuZXdUeXBlLnZpc2l0KHRoaXMpOworICAgICAgICAgICAgICAgIG5vZGUuc2V0VHlw
ZUFuZEFyZ3VtZW50cyhuZXdUeXBlLCBbXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOwor
ICAgIH0KK30KSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1R5cGVPclZhcmlhYmxlUmVmLmpzCSh3b3Jr
aW5nIGNvcHkpCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBw
bGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1
c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZp
Y2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRp
b25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11
c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJp
YnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n
IGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl
cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdB
UkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVT
UyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBU
SEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1Mg
Rk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5U
IFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBE
SVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBD
T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICog
UFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0Us
IERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIg
Q0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09O
VFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5D
RSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0Yg
VEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNI
IERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVHlwZU9yVmFyaWFibGVSZWYg
ZXh0ZW5kcyBOb2RlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUpCisgICAgeworICAg
ICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOwor
ICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4gdGhpcy5fb3JpZ2luOyB9Cisg
ICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9CisKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KK30KSW5kZXg6IFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVSZWYuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlMYW5nUkkvVHlw
ZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJheUxhbmdSSS9UeXBlUmVmLmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3
IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBh
bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1v
ZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29u
ZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29k
ZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlz
dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRp
c3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHly
aWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv
d2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIg
bWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNP
RlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVY
UFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBU
TywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBF
VkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBB
TlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwg
T1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywK
KyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0Yg
VVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dF
VkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElO
IENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJ
R0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAq
IE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0Yg
U1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmljdCI7CisKK2NsYXNzIFR5cGVSZWYgZXh0ZW5k
cyBUeXBlIHsKKyAgICBjb25zdHJ1Y3RvcihvcmlnaW4sIG5hbWUsIHR5cGVBcmd1bWVudHMpCisg
ICAgeworICAgICAgICBzdXBlcigpOworICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47Cisg
ICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAg
ICAgICB0aGlzLl90eXBlQXJndW1lbnRzID0gdHlwZUFyZ3VtZW50czsKKyAgICB9CisgICAgCisg
ICAgc3RhdGljIHdyYXAodHlwZSkKKyAgICB7CisgICAgICAgIGxldCByZXN1bHQgPSBuZXcgVHlw
ZVJlZih0eXBlLm9yaWdpbiwgdHlwZS5uYW1lLCBbXSk7CisgICAgICAgIHJlc3VsdC50eXBlID0g
dHlwZTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgCisgICAgZ2V0IG9yaWdpbigp
IHsgcmV0dXJuIHRoaXMuX29yaWdpbjsgfQorICAgIGdldCBuYW1lKCkgeyByZXR1cm4gdGhpcy5f
bmFtZTsgfQorICAgIGdldCB0eXBlQXJndW1lbnRzKCkgeyByZXR1cm4gdGhpcy5fdHlwZUFyZ3Vt
ZW50czsgfQorICAgIGdldCBpc1ByaW1pdGl2ZSgpIHsgcmV0dXJuIHR5cGUgPyB0eXBlLmlzUHJp
bWl0aXZlIDogZmFsc2U7IH0KKyAgICAKKyAgICBnZXQgaW5zdGFudGlhdGVkVHlwZSgpCisgICAg
eworICAgICAgICBsZXQgdHlwZSA9IHRoaXMudHlwZS51bmlmeU5vZGU7CisgICAgICAgIGlmICgh
dHlwZS5pbnN0YW50aWF0ZSkKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidHlwZSBkb2Vz
IG5vdCBzdXBwb3J0IGluc3RhbnRpYXRpb246ICIgKyB0eXBlICsgIiAoIiArIHR5cGUuY29uc3Ry
dWN0b3IubmFtZSArICIpIik7CisgICAgICAgIHJldHVybiB0eXBlLmluc3RhbnRpYXRlKHRoaXMu
dHlwZUFyZ3VtZW50cyk7CisgICAgfQorICAgIAorICAgIGdldCB1bmlmeU5vZGUoKQorICAgIHsK
KyAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0
dXJuIHRoaXMudHlwZS51bmlmeU5vZGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKyAg
ICAKKyAgICBwb3B1bGF0ZURlZmF1bHRWYWx1ZShidWZmZXIsIG9mZnNldCkKKyAgICB7CisgICAg
ICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRzLmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0
aGlzLnR5cGUucG9wdWxhdGVEZWZhdWx0VmFsdWUoYnVmZmVyLCBvZmZzZXQpOworICAgICAgICB0
aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBnZXQgZGVmYXVsdCB2YWx1ZSBvZiBhIHR5cGUgaW5zdGFu
dGlhdGlvbiIpOworICAgIH0KKyAgICAKKyAgICBnZXQgc2l6ZSgpCisgICAgeworICAgICAgICBp
ZiAoIXRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGgpCisgICAgICAgICAgICByZXR1cm4gdGhpcy50
eXBlLnNpemU7CisgICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IGdldCBzaXplIG9mIGEg
dHlwZSBpbnN0YW50aWF0aW9uIik7CisgICAgfQorICAgIAorICAgIHNldFR5cGVBbmRBcmd1bWVu
dHModHlwZSwgdHlwZUFyZ3VtZW50cykKKyAgICB7CisgICAgICAgIHRoaXMuX25hbWUgPSB0eXBl
Lm5hbWU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuX3R5cGVBcmd1
bWVudHMgPSB0eXBlQXJndW1lbnRzOworICAgIH0KKyAgICAKKyAgICB1bmlmeUltcGwodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlcikKKyAgICB7CisgICAgICAgIGlmICghKG90aGVyIGluc3RhbmNl
b2YgVHlwZVJlZikpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhp
cy50eXBlLnVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwgb3RoZXIudHlwZSkpCisgICAgICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICh0aGlzLnR5cGVBcmd1bWVudHMubGVuZ3RoICE9
IG90aGVyLnR5cGVBcmd1bWVudHMubGVuZ3RoKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwor
ICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudHlwZUFyZ3VtZW50cy5sZW5ndGg7ICsr
aSkgeworICAgICAgICAgICAgaWYgKCF0aGlzLnR5cGVBcmd1bWVudHNbaV0udW5pZnkodW5pZmlj
YXRpb25Db250ZXh0LCBvdGhlci50eXBlQXJndW1lbnRzW2ldKSkKKyAgICAgICAgICAgICAgICBy
ZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAg
IAorICAgIHRvU3RyaW5nKCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy50eXBlQXJndW1lbnRz
Lmxlbmd0aCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgICAgIHJldHVybiB0
aGlzLm5hbWUgKyAiPCIgKyB0aGlzLnR5cGVBcmd1bWVudHMgKyAiPiI7CisgICAgfQorfQorCklu
ZGV4OiBUb29scy9BcnJheUxhbmdSSS9UeXBlVmFyaWFibGUuanMKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9v
bHMvQXJyYXlMYW5nUkkvVHlwZVZhcmlhYmxlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0Fy
cmF5TGFuZ1JJL1R5cGVWYXJpYWJsZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDk4IEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIFR5cGVWYXJpYWJsZSBleHRlbmRzIFR5cGUgeworICAgIGNvbnN0cnVjdG9y
KG9yaWdpbiwgbmFtZSwgcHJvdG9jb2wpCisgICAgeworICAgICAgICB0aGlzLl9vcmlnaW4gPSBv
cmlnaW47CisgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOworICAgICAgICB0aGlzLl9wcm90b2Nv
bCA9IHByb3RvY29sOworICAgIH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMu
X25hbWU7IH0KKyAgICBnZXQgcHJvdG9jb2woKSB7IHJldHVybiB0aGlzLl9wcm90b2NvbDsgfQor
ICAgIAorICAgIGdldCBpc1ByaW1pdGl2ZSgpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy5f
cHJvdG9jb2wgJiYgdGhpcy5fcHJvdG9jb2wuaXNQcmltaXRpdmU7CisgICAgfQorICAgIAorICAg
IGdldCBpc1VuaWZpYWJsZSgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICAKKyAgICBpbmhlcml0cyhw
cm90b2NvbCkKKyAgICB7CisgICAgICAgIGlmICghcHJvdG9jb2wpCisgICAgICAgICAgICByZXR1
cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCF0aGlzLnByb3RvY29sKQorICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhwcm90b2NvbCk7
CisgICAgfQorICAgIAorICAgIHR5cGVWYXJpYWJsZVVuaWZ5KHVuaWZpY2F0aW9uQ29udGV4dCwg
b3RoZXIpCisgICAgeworICAgICAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFR5cGUpKQorICAg
ICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBsZXQgcmVhbFRoaXMgPSB1bmlmaWNhdGlv
bkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgaWYgKHJlYWxUaGlzICE9IHRoaXMpCisgICAg
ICAgICAgICByZXR1cm4gcmVhbFRoaXMudW5pZnkodW5pZmljYXRpb25Db250ZXh0LCBvdGhlcik7
CisgICAgICAgIAorICAgICAgICB1bmlmaWNhdGlvbkNvbnRleHQudW5pZnkodGhpcywgb3RoZXIp
OworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgCisgICAgdW5pZnlJbXBsKHVuaWZp
Y2F0aW9uQ29udGV4dCwgb3RoZXIpCisgICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlVmFy
aWFibGVVbmlmeSh1bmlmaWNhdGlvbkNvbnRleHQsIG90aGVyKTsKKyAgICB9CisgICAgCisgICAg
dmVyaWZ5QXNBcmd1bWVudCh1bmlmaWNhdGlvbkNvbnRleHQpCisgICAgeworICAgICAgICBsZXQg
cmVhbFRoaXMgPSB1bmlmaWNhdGlvbkNvbnRleHQuZmluZCh0aGlzKTsKKyAgICAgICAgCisgICAg
ICAgIC8vIFRoZSB0aGluZyB3ZSBnZXQgdW5pZmllZCB3aXRoIG11c3QgYmUgYSB0eXBlIHZhcmlh
YmxlIHRoYXQgYWNjZXB0cyBhIGJyb2FkZXIgc2V0IG9mCisgICAgICAgIC8vIHRoaW5ncyB0aGFu
IHdlIGRvLgorICAgICAgICBpZiAoIShyZWFsVGhpcyBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkp
CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgCisgICAgICAgIGlmICghdGhpcy5w
cm90b2NvbCkKKyAgICAgICAgICAgIHJldHVybiAhcmVhbFRoaXMucHJvdG9jb2w7CisgICAgICAg
IAorICAgICAgICByZXR1cm4gdGhpcy5wcm90b2NvbC5pbmhlcml0cyhyZWFsVGhpcy5wcm90b2Nv
bCk7CisgICAgfQorICAgIAorICAgIHZlcmlmeUFzUGFyYW1ldGVyKHVuaWZpY2F0aW9uQ29udGV4
dCkKKyAgICB7CisgICAgICAgIGlmICghdGhpcy5wcm90b2NvbCkKKyAgICAgICAgICAgIHJldHVy
biB0cnVlOworICAgICAgICByZXR1cm4gdW5pZmljYXRpb25Db250ZXh0LmZpbmQodGhpcykuaW5o
ZXJpdHModGhpcy5wcm90b2NvbCk7CisgICAgfQorICAgIAorICAgIHRvU3RyaW5nKCkKKyAgICB7
CisgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorfQorCkluZGV4OiBUb29scy9BcnJh
eUxhbmdSSS9VbmlmaWNhdGlvbkNvbnRleHQuanMKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvQXJyYXlM
YW5nUkkvVW5pZmljYXRpb25Db250ZXh0LmpzCShub25leGlzdGVudCkKKysrIFRvb2xzL0FycmF5
TGFuZ1JJL1VuaWZpY2F0aW9uQ29udGV4dC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEw
MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVz
ZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFy
eSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQg
cHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAx
LiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNv
cHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZv
bGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3Jt
IG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBs
aXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAq
ICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRo
ZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBM
RSBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElF
UywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5U
SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQ
VVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgor
ICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lE
RU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAo
SU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElU
VVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7
IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVP
UlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElU
WSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lO
RyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElG
IEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBz
dHJpY3QiOworCitjbGFzcyBVbmlmaWNhdGlvbkNvbnRleHQgeworICAgIGNvbnN0cnVjdG9yKHR5
cGVQYXJhbWV0ZXJzKQorICAgIHsKKyAgICAgICAgdGhpcy5fdHlwZVBhcmFtZXRlcnMgPSBuZXcg
U2V0KHR5cGVQYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5fbmV4dE1hcCA9IG5ldyBNYXAoKTsK
KyAgICB9CisgICAgCisgICAgdW5pb24oYSwgYikKKyAgICB7CisgICAgICAgIGEgPSBmaW5kKGEp
OworICAgICAgICBiID0gZmluZChiKTsKKyAgICAgICAgaWYgKGEgPT0gYikKKyAgICAgICAgICAg
IHJldHVybjsKKyAgICAgICAgCisgICAgICAgIGlmICghYi5pc1VuaWZpYWJsZSkKKyAgICAgICAg
ICAgIFthLCBiXSA9IFtiLCBhXTsKKyAgICAgICAgaWYgKCFhLmlzVW5pZmlhYmxlKQorICAgICAg
ICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3QgdW5pZnkgbm9uLXVuaWZpYWJsZSB0aGluZ3Mg
IiArIGEgKyAiIGFuZCAiICsgYik7CisgICAgICAgIAorICAgICAgICAvLyBNYWtlIHN1cmUgdGhh
dCB0eXBlIHBhcmFtZXRlcnMgZG9uJ3QgZW5kIHVwIGJlaW5nIHJvb3RzLgorICAgICAgICBpZiAo
YS5pc1VuaWZpYWJsZSAmJiBiLmlzVW5pZmlhYmxlICYmIHRoaXMuX3R5cGVQYXJhbWV0ZXJzLmhh
cyhiKSkKKyAgICAgICAgICAgIFthLCBiXSA9IFtiLCBhXTsKKworICAgICAgICB0aGlzLl9uZXh0
TWFwLnNldChhLCBiKTsKKyAgICB9CisgICAgCisgICAgZmluZChub2RlKQorICAgIHsKKyAgICAg
ICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZTsKKyAgICAgICAgbGV0IG5leHROb2RlID0gdGhpcy5f
bmV4dE1hcC5nZXQoY3VycmVudE5vZGUpOworICAgICAgICBpZiAoIW5leHROb2RlKQorICAgICAg
ICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAg
ICBjdXJyZW50Tm9kZSA9IG5leHROb2RlOworICAgICAgICAgICAgbmV4dE5vZGUgPSB0aGlzLl9u
ZXh0TWFwLmdldChjdXJyZW50Tm9kZSk7CisgICAgICAgICAgICBpZiAoIW5leHROb2RlKQorICAg
ICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRoaXMuX25leHRNYXAuc2V0
KG5vZGUsIGN1cnJlbnROb2RlKTsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOworICAgIH0K
KyAgICAKKyAgICBnZXQgbm9kZXMoKQorICAgIHsKKyAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBT
ZXQoKTsKKyAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuX25leHRNYXApIHsK
KyAgICAgICAgICAgIHJlc3VsdC5hZGQoa2V5KTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQodmFs
dWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIAorICAg
IHZlcmlmeSgpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIHRoaXMu
X3R5cGVQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBpZiAoIXR5cGVQYXJhbWV0ZXIudmVyaWZ5
QXNQYXJhbWV0ZXIodGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAg
ICB9CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiB0aGlzLm5vZGVzKSB7CisgICAg
ICAgICAgICBpZiAoIXR5cGVBcmd1bWVudC5pc1VuaWZpYWJsZSkKKyAgICAgICAgICAgICAgICBj
b250aW51ZTsKKyAgICAgICAgICAgIGlmICh0aGlzLl90eXBlUGFyYW1ldGVycy5oYXModHlwZUFy
Z3VtZW50KSkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICghdHlw
ZUFyZ3VtZW50LnZlcmlmeUFzQXJndW1lbnQodGhpcykpCisgICAgICAgICAgICAgICAgcmV0dXJu
IGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAKKyAg
ICBpc1VudW5pZmllZCgpCisgICAgeworICAgICAgICByZXR1cm4gIXRoaXMuX25leHRNYXAuc2l6
ZTsKKyAgICB9Cit9CisKSW5kZXg6IFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCj09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT0KLS0tIFRvb2xzL0FycmF5TGFuZ1JJL1ZhbHVlLmpzCShub25leGlzdGVudCkKKysrIFRvb2xz
L0FycmF5TGFuZ1JJL1ZhbHVlLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMzEgQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMs
IHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVk
IHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0
cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQK
KyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcg
ZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJl
cHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBj
b25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1
bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp
YnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgSU5DLiBg
YEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBN
RVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBB
UkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIElOQy4gT1IKKyAqIENPTlRS
SUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBT
UEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElO
RywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E
UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJ
TkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBP
RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRP
UlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5Z
IFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VE
IE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKyJ1c2Ugc3RyaWN0IjsK
KworY2xhc3MgVmFsdWUgZXh0ZW5kcyBOb2RlIHsKKyAgICBnZXQga2luZCgpIHsgcmV0dXJuIFZh
bHVlOyB9CisgICAgZ2V0IGlzQ29uc3RleHByKCkgeyByZXR1cm4gZmFsc2U7IH0KK30KKwpJbmRl
eDogVG9vbHMvQXJyYXlMYW5nUkkvVmFyaWFibGVEZWNsLmpzCj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFRvb2xz
L0FycmF5TGFuZ1JJL1ZhcmlhYmxlRGVjbC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9BcnJh
eUxhbmdSSS9WYXJpYWJsZURlY2wuanMJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSw0NyBAQAor
LyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQu
CisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jt
cywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlk
ZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRp
c3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3Qg
cmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9m
IGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRv
Y3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0
cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBJTkMu
IGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5D
TFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9G
IE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NF
IEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgSU5DLiBPUgorICogQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
IFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKKyAq
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLworInVzZSBzdHJpY3Qi
OworCitjbGFzcyBWYXJpYWJsZURlY2wgZXh0ZW5kcyBWYWx1ZSB7CisgICAgY29uc3RydWN0b3Io
b3JpZ2luLCBuYW1lLCB0eXBlLCBpbml0aWFsaXplcikKKyAgICB7CisgICAgICAgIHN1cGVyKCk7
CisgICAgICAgIHRoaXMuX29yaWdpbiA9IG9yaWdpbjsKKyAgICAgICAgdGhpcy5fbmFtZSA9IG5h
bWU7CisgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgICAgICB0aGlzLl9pbml0aWFsaXpl
ciA9IGluaXRpYWxpemVyOworICAgIH0KKyAgICAKKyAgICBnZXQgb3JpZ2luKCkgeyByZXR1cm4g
dGhpcy5fb3JpZ2luOyB9CisgICAgZ2V0IG5hbWUoKSB7IHJldHVybiB0aGlzLl9uYW1lOyB9Cisg
ICAgZ2V0IHR5cGUoKSB7IHJldHVybiB0aGlzLl90eXBlOyB9CisgICAgZ2V0IGluaXRpYWxpemVy
KCkgeyByZXR1cm4gdGhpcy5faW5pdGlhbGl6ZXI7IH0KKyAgICAKKyAgICB0b1N0cmluZygpCisg
ICAgeworICAgICAgICByZXR1cm4gdGhpcy50eXBlICsgIiAiICsgdGhpcy5uYW1lICsgKHRoaXMu
aW5pdGlhbGl6ZXIgPyAiID0gIiArIHRoaXMuaW5pdGlhbGl6ZXIgOiAiIik7CisgICAgfQorfQor
CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwo9PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBU
b29scy9BcnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29scy9B
cnJheUxhbmdSSS9WYXJpYWJsZVJlZi5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQzIEBA
CisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZl
ZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZv
cm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92
aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJl
ZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJp
Z2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93
aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVz
dCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAg
ZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp
c3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisgKiBD
T05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRB
TCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM
VURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUg
R09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1Ig
QlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQor
ICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBP
UiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElO
IEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURW
SVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0cmlj
dCI7CisKK2NsYXNzIFZhcmlhYmxlUmVmIGV4dGVuZHMgRXhwcmVzc2lvbiB7CisgICAgY29uc3Ry
dWN0b3Iob3JpZ2luLCBuYW1lKQorICAgIHsKKyAgICAgICAgc3VwZXIob3JpZ2luKTsKKyAgICAg
ICAgdGhpcy5fbmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFyaWFibGUgPSBudWxsOworICAg
IH0KKyAgICAKKyAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KKyAgICBnZXQg
aXNDb25zdGV4cHIoKSB7IHJldHVybiB0aGlzLnZhcmlhYmxlLmlzQ29uc3RleHByOyB9CisgICAg
Z2V0IHVuaWZ5Tm9kZSgpIHsgcmV0dXJuIHRoaXMudmFyaWFibGUudW5pZnlOb2RlOyB9CisgICAg
CisgICAgdG9TdHJpbmcoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9
Cit9CkluZGV4OiBUb29scy9BcnJheUxhbmdSSS9WaXNpdGluZ1NldC5qcwo9PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0t
LSBUb29scy9BcnJheUxhbmdSSS9WaXNpdGluZ1NldC5qcwkobm9uZXhpc3RlbnQpCisrKyBUb29s
cy9BcnJheUxhbmdSSS9WaXNpdGluZ1NldC5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDQ0
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNl
cnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5
IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBw
cm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEu
IFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29w
eXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9s
bG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0g
bXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICog
ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhl
IGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExF
IElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVT
LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJ
RVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBV
UlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBJTkMuIE9SCisg
KiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURF
TlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRV
VEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsg
T1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9S
WQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ
LCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5H
IElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg
QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisidXNlIHN0
cmljdCI7CisKK2NsYXNzIFZpc2l0aW5nU2V0IHsKKyAgICBjb25zdHJ1Y3RvciguLi5pdGVtcykK
KyAgICB7CisgICAgICAgIHRoaXMuX3NldCA9IG5ldyBTZXQoaXRlbXMpOworICAgIH0KKyAgICAK
KyAgICBkb1Zpc2l0KGl0ZW0sIGNhbGxiYWNrKQorICAgIHsKKyAgICAgICAgaWYgKHRoaXMuX3Nl
dC5oYXMoaXRlbSkpCisgICAgICAgICAgICB0aHJvdyBuZXcgQUxUeXBlRXJyb3IoaXRlbS5vcmln
aW4ub3JpZ2luU3RyaW5nLCAiUmVjdXJzaXZlICIgKyBpdGVtLmtpbmQpOworICAgICAgICB0aGlz
Ll9zZXQuYWRkKGl0ZW0pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNhbGxi
YWNrKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0aGlzLl9zZXQuZGVsZXRl
KGl0ZW0pOworICAgICAgICB9CisgICAgfQorfQpJbmRleDogVG9vbHMvQXJyYXlMYW5nUkkvVmlz
aXRvci5qcwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09Ci0tLSBUb29scy9BcnJheUxhbmdSSS9WaXNpdG9yLmpzCShub25l
eGlzdGVudCkKKysrIFRvb2xzL0FycmF5TGFuZ1JJL1Zpc2l0b3IuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgQXBwbGUgSW5jLiBB
bGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291
cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBh
cmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBh
cmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWlu
IHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv
bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBp
biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBu
b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWlt
ZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJv
dmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJP
VklERUQgQlkgQVBQTEUgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElO
RElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5U
SUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1F
TlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9S
CisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFO
RCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNU
UklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhF
UldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZU
V0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4g
CisgKi8KKyJ1c2Ugc3RyaWN0IjsKKworY2xhc3MgVmlzaXRvciB7CisgICAgdmlzaXRQcm9ncmFt
KG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS50b3BMZXZl
bFN0YXRlbWVudHMpCisgICAgICAgICAgICBzdGF0ZW1lbnQudmlzaXQodGhpcyk7CisgICAgfQor
ICAgIAorICAgIHZpc2l0RnVuYyhub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS5yZXR1cm5UeXBl
LnZpc2l0KHRoaXMpOworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVyIG9mIG5vZGUudHlw
ZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAg
ICAgICBmb3IgKGxldCBwYXJhbWV0ZXIgb2Ygbm9kZS5wYXJhbWV0ZXJzKQorICAgICAgICAgICAg
cGFyYW1ldGVyLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEZ1bmNQYXJhbWV0
ZXIobm9kZSkKKyAgICB7CisgICAgICAgIG5vZGUudHlwZS52aXNpdCh0aGlzKTsKKyAgICB9Cisg
ICAgCisgICAgdmlzaXRGdW5jRGVmKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RnVu
Yyhub2RlKTsKKyAgICAgICAgbm9kZS5ib2R5LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAg
ICB2aXNpdE5hdGl2ZUZ1bmMobm9kZSkKKyAgICB7CisgICAgICAgIHRoaXMudmlzaXRGdW5jKG5v
ZGUpOworICAgIH0KKyAgICAKKyAgICB2aXNpdEJsb2NrKG5vZGUpCisgICAgeworICAgICAgICBm
b3IgKGxldCBzdGF0ZW1lbnQgb2Ygbm9kZS5zdGF0ZW1lbnRzKQorICAgICAgICAgICAgc3RhdGVt
ZW50LnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdENvbW1hRXhwcmVzc2lvbihu
b2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgZXhwcmVzc2lvbiBvZiBub2RlLmxpc3QpCisg
ICAgICAgICAgICBleHByZXNzaW9uLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dFByb3RvY29sUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAKKyAgICB2aXNpdFByb3RvY29s
RGVjbChub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgc2lnbmF0dXJlIG9mIG5vZGUuc2ln
bmF0dXJlcykKKyAgICAgICAgICAgIHNpZ25hdHVyZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRUeXBlUmVmKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlQXJn
dW1lbnQgb2Ygbm9kZS50eXBlQXJndW1lbnRzKQorICAgICAgICAgICAgdHlwZUFyZ3VtZW50LnZp
c2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNpdE5hdGl2ZVR5cGUobm9kZSkKKyAgICB7
CisgICAgICAgIGZvciAobGV0IHR5cGVQYXJhbXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQor
ICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAg
dmlzaXRUeXBlRGVmKG5vZGUpCisgICAgeworICAgICAgICBmb3IgKGxldCB0eXBlUGFyYW1ldGVy
IG9mIG5vZGUudHlwZVBhcmFtZXRlcnMpCisgICAgICAgICAgICB0eXBlUGFyYW1ldGVyLnZpc2l0
KHRoaXMpOworICAgICAgICBub2RlLnR5cGUudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAg
IHZpc2l0U3RydWN0VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgZm9yIChsZXQgdHlwZVBhcmFt
ZXRlciBvZiBub2RlLnR5cGVQYXJhbWV0ZXJzKQorICAgICAgICAgICAgdHlwZVBhcmFtZXRlci52
aXNpdCh0aGlzKTsKKyAgICAgICAgZm9yIChsZXQgZmllbGQgb2Ygbm9kZS5maWVsZHMpCisgICAg
ICAgICAgICBmaWVsZC52aXNpdCh0aGlzKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRUeXBlVmFy
aWFibGUobm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q29uc3RleHByVHlwZVBh
cmFtZXRlcihub2RlKQorICAgIHsKKyAgICAgICAgbm9kZS50eXBlLnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdEZpZWxkKG5vZGUpCisgICAgeworICAgICAgICBub2RlLnR5cGUu
dmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RWxlbWVudGFsVHlwZShub2RlKQor
ICAgIHsKKyAgICAgICAgbm9kZS5lbGVtZW50VHlwZS52aXNpdCh0aGlzKTsKKyAgICB9CisgICAg
CisgICAgdmlzaXRQdHJUeXBlKG5vZGUpCisgICAgeworICAgICAgICB0aGlzLnZpc2l0RWxlbWVu
dGFsVHlwZShub2RlKTsKKyAgICB9CisgICAgCisgICAgdmlzaXRBcnJheVJlZlR5cGUobm9kZSkK
KyAgICB7CisgICAgICAgIHRoaXMudmlzaXRFbGVtZW50YWxUeXBlKG5vZGUpOworICAgIH0KKyAg
ICAKKyAgICB2aXNpdEFycmF5VHlwZShub2RlKQorICAgIHsKKyAgICAgICAgdGhpcy52aXNpdEVs
ZW1lbnRhbFR5cGUobm9kZSk7CisgICAgICAgIG5vZGUubnVtRWxlbWVudHMudmlzaXQodGhpcyk7
CisgICAgfQorICAgIAorICAgIHZpc2l0QXNzaWdubWVudChub2RlKQorICAgIHsKKyAgICAgICAg
bm9kZS5saHMudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUucmhzLnZpc2l0KHRoaXMpOworICAg
IH0KKyAgICAKKyAgICB2aXNpdFZhcmlhYmxlUmVmKG5vZGUpCisgICAgeworICAgIH0KKyAgICAK
KyAgICB2aXNpdFJldHVybihub2RlKQorICAgIHsKKyAgICAgICAgaWYgKG5vZGUudmFsdWUpCisg
ICAgICAgICAgICBub2RlLnZhbHVlLnZpc2l0KHRoaXMpOworICAgIH0KKyAgICAKKyAgICB2aXNp
dEludExpdGVyYWwobm9kZSkKKyAgICB7CisgICAgfQorICAgIAorICAgIHZpc2l0Q2FsbEV4cHJl
c3Npb24obm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IHR5cGVBcmd1bWVudCBvZiBub2Rl
LnR5cGVBcmd1bWVudHMpCisgICAgICAgICAgICB0eXBlQXJndW1lbnQudmlzaXQodGhpcyk7Cisg
ICAgICAgIGZvciAobGV0IGFyZ3VtZW50IG9mIG5vZGUuYXJndW1lbnRMaXN0KQorICAgICAgICAg
ICAgYXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgfQorICAgIAorICAgIHZpc2l0RnVuY3Rpb25M
aWtlQmxvY2sobm9kZSkKKyAgICB7CisgICAgICAgIGZvciAobGV0IGFyZ3VtZW50IG9mIG5vZGUu
YXJndW1lbnRMaXN0KQorICAgICAgICAgICAgYXJndW1lbnQudmlzaXQodGhpcyk7CisgICAgICAg
IGZvciAobGV0IHBhcmFtZXRlciBvZiBub2RlLnBhcmFtZXRlcnMpCisgICAgICAgICAgICBwYXJh
bWV0ZXIudmlzaXQodGhpcyk7CisgICAgICAgIG5vZGUuYm9keS52aXNpdCh0aGlzKTsKKyAgICB9
Cit9CisK
</data>
<flag name="review"
          id="339584"
          type_id="1"
          status="+"
          setter="keith_miller"
    />
          </attachment>
      

    </bug>

</bugzilla>