<?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>52340</bug_id>
          
          <creation_ts>2011-01-12 17:15:17 -0800</creation_ts>
          <short_desc>Look into possibilities of typedef in webkit idl files</short_desc>
          <delta_ts>2013-02-14 18:09:22 -0800</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebGL</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>PC</rep_platform>
          <op_sys>OS X 10.5</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>109060</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Zhenyao Mo">zmo</reporter>
          <assigned_to name="Andrey Adaikin">aandrey</assigned_to>
          <cc>aandrey</cc>
    
    <cc>abarth</cc>
    
    <cc>antonm</cc>
    
    <cc>arv</cc>
    
    <cc>cmarrin</cc>
    
    <cc>dglazkov</cc>
    
    <cc>enne</cc>
    
    <cc>eric</cc>
    
    <cc>haraken</cc>
    
    <cc>japhet</cc>
    
    <cc>kbr</cc>
    
    <cc>loislo</cc>
    
    <cc>nbarth</cc>
    
    <cc>ojan.autocc</cc>
    
    <cc>ojan</cc>
    
    <cc>pfeldman</cc>
    
    <cc>rniwa</cc>
    
    <cc>tonikitoo</cc>
    
    <cc>webkit.review.bot</cc>
    
    <cc>yurys</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>333443</commentid>
    <comment_count>0</comment_count>
    <who name="Zhenyao Mo">zmo</who>
    <bug_when>2011-01-12 17:15:17 -0800</bug_when>
    <thetext>Then we can  define GL types in WebGLRenderingContext.idl and use them in GL function signatures</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>826485</commentid>
    <comment_count>1</comment_count>
      <attachid>186866</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-06 08:55:08 -0800</bug_when>
    <thetext>Created attachment 186866
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>826638</commentid>
    <comment_count>2</comment_count>
      <attachid>186866</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2013-02-06 12:31:04 -0800</bug_when>
    <thetext>Comment on attachment 186866
Patch

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

This patch is very exciting; it would be a huge cleanup to be able to use typedefs in WebGL&apos;s IDL for example. However, I perceive a few problems with this implementation. Perhaps others who work on the bindings will have more and better suggestions, but there are at least a couple of things that I definitely think need to be cleaned up.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:102
&gt; +struct( ExtendedType =&gt; {

The name of this class is not clear. It actually represents either a type or a typedef. Also, for consistency, it should probably not start with a capital letter.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:104
&gt; +    type =&gt; &apos;$&apos;, # Type of typedef

This comment is not clear. Please change it to something like: &quot;If this represents a typedef, the actual type it refers to.&quot;

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:166
&gt; +    my $msg = &quot;Unexpected ExtendedAttributeList in typedef \&quot;$name\&quot; at &quot; . $self-&gt;{Line};

For consistency I think this should read &quot;extendedAttributeList&quot; (no initial capital letter).

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:749
&gt; +    my $extendedAttributeList = shift; # ignored: Extended attributes are not applicable to typedefs themselves

Then please change the call sites to no longer pass this argument, leaving this comment here though.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:754
&gt; +        my $typedef = $self-&gt;parseExtendedType();

I strongly think you should call assertNoExtendedAttributesInTypedef here so that errors are caught when the typedef is parsed, not when it&apos;s used.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:759
&gt; +        die &quot;typedef redifinition for &quot; . $name . &quot; at &quot; . $self-&gt;{Line} if exists $typedefs{$name};

typo: redifinition -&gt; redefinition

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1066
&gt; +        $extendedAttributeList = $typedef-&gt;extendedAttributes();

Is this correct? Won&apos;t this override any extended attributes for the attribute with those for its type?

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1349
&gt; +        $paramDataNode-&gt;extendedAttributes($typedef-&gt;extendedAttributes());

Same question about whether overriding the domSignature&apos;s extendedAttributes with those coming from the parsed type is correct.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1673
&gt; +sub parseExtendedType

I think a name like &quot;parseTypeOrTypedef&quot; would be clearer.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1679
&gt; +        $extendedAttributeList = $self-&gt;parseExtendedAttributeListAllowEmpty();

Is this really correct? We only parse extended attributes on a type if there aren&apos;t any specified e.g. on the attribute or operation? This seems wrong.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1690
&gt; +            $self-&gt;assertNoExtendedAttributesInTypedef($next-&gt;value(), __LINE__);

As mentioned above, I think this check should go inside parseTypedef.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1787
&gt; +        $self-&gt;assertNoExtendedAttributesInTypedef($next-&gt;value(), __LINE__);

Again, this check should be done earlier.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>826644</commentid>
    <comment_count>3</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2013-02-06 12:33:57 -0800</bug_when>
    <thetext>Is this part of WebIDL (mostly curious).

I assume the goal is to replace all the &quot;unsigned int&quot; usage in WebGLRenderingContext?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>826646</commentid>
    <comment_count>4</comment_count>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2013-02-06 12:35:38 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; Is this part of WebIDL (mostly curious).

Yes, Web IDL supports typedefs.

&gt; I assume the goal is to replace all the &quot;unsigned int&quot; usage in WebGLRenderingContext?

That would be one goal. It would make the WebKit IDL for WebGL much closer to the real Web IDL.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>826653</commentid>
    <comment_count>5</comment_count>
    <who name="Eric Seidel (no email)">eric</who>
    <bug_when>2013-02-06 12:40:08 -0800</bug_when>
    <thetext>OK.  Sounds fantastic.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>827109</commentid>
    <comment_count>6</comment_count>
      <attachid>186866</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-07 00:29:17 -0800</bug_when>
    <thetext>Comment on attachment 186866
Patch

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

Thanks for the review.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:102
&gt;&gt; +struct( ExtendedType =&gt; {
&gt; 
&gt; The name of this class is not clear. It actually represents either a type or a typedef. Also, for consistency, it should probably not start with a capital letter.

Generally speaking it has nothing to do with a typedef. This (helper) class is used to represent a parsed result of the WebIDL grammar &quot;ExtendedAttributeList Type&quot;.
The typedef is just a binding from a string name to an ExtendedType.

AFAIU, all exported types start with a lowercase letter (like &quot;idlDocument&quot;, &quot;domInterface&quot;), whereas types used internally with a capital letter (like &quot;Token&quot;). Is my understanding correct? I introduce an internal type.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:104
&gt;&gt; +    type =&gt; &apos;$&apos;, # Type of typedef
&gt; 
&gt; This comment is not clear. Please change it to something like: &quot;If this represents a typedef, the actual type it refers to.&quot;

Sorry about that. I changed it to &quot;# Type of data&quot;.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:166
&gt;&gt; +    my $msg = &quot;Unexpected ExtendedAttributeList in typedef \&quot;$name\&quot; at &quot; . $self-&gt;{Line};
&gt; 
&gt; For consistency I think this should read &quot;extendedAttributeList&quot; (no initial capital letter).

done.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:749
&gt;&gt; +    my $extendedAttributeList = shift; # ignored: Extended attributes are not applicable to typedefs themselves
&gt; 
&gt; Then please change the call sites to no longer pass this argument, leaving this comment here though.

For consistency I think this should stay as is, like in parseEnum subroutine (I stole this comment from there) and others.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:754
&gt;&gt; +        my $typedef = $self-&gt;parseExtendedType();
&gt; 
&gt; I strongly think you should call assertNoExtendedAttributesInTypedef here so that errors are caught when the typedef is parsed, not when it&apos;s used.

But we do want an extendedAttribute here, if provided. The WebIDL grammar of typedef:

&gt; ExtendedAttributeList &quot;typedef&quot; ExtendedAttributeList Type identifier &quot;;&quot;

The first ExtendedAttributeList is to be ignored. The second one is a part of typedef. For example:

&gt; typedef [Clamp] unsigned int CLAMPED_UINT;

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:759
&gt;&gt; +        die &quot;typedef redifinition for &quot; . $name . &quot; at &quot; . $self-&gt;{Line} if exists $typedefs{$name};
&gt; 
&gt; typo: redifinition -&gt; redefinition

done.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1066
&gt;&gt; +        $extendedAttributeList = $typedef-&gt;extendedAttributes();
&gt; 
&gt; Is this correct? Won&apos;t this override any extended attributes for the attribute with those for its type?

Yes, as far as I can see. We should parse an ExtendedType here instead of a type. If $extendedAttributeList is not empty it will be never overridden.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1673
&gt;&gt; +sub parseExtendedType
&gt; 
&gt; I think a name like &quot;parseTypeOrTypedef&quot; would be clearer.

Renamed to &quot;parseTypeOrExtendedType&quot;.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1679
&gt;&gt; +        $extendedAttributeList = $self-&gt;parseExtendedAttributeListAllowEmpty();
&gt; 
&gt; Is this really correct? We only parse extended attributes on a type if there aren&apos;t any specified e.g. on the attribute or operation? This seems wrong.

Yes, as far as I can see. At this point we expect 0 or 1 ExtendedAttributeList. The $extendedAttributeList passed in tells us if we already have parsed an ExtendedAttributeList.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1690
&gt;&gt; +            $self-&gt;assertNoExtendedAttributesInTypedef($next-&gt;value(), __LINE__);
&gt; 
&gt; As mentioned above, I think this check should go inside parseTypedef.

Here we protect from the following:

typedef [Clamp] unsigned int CLAMPED_UINT;
...
void func(in [Optional] CLAMPED_UINT x);   // should die, equal to: void func(in [Optional] [Clamp] unsigned int x);

Quote from the WebIDL spec (http://www.w3.org/TR/WebIDL/#idl-typedefs):
&quot;A typedef must not be used as the type of a construct if an extended attribute that appears after the typedef keyword would be disallowed from appearing directly on that construct.&quot;

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1787
&gt;&gt; +        $self-&gt;assertNoExtendedAttributesInTypedef($next-&gt;value(), __LINE__);
&gt; 
&gt; Again, this check should be done earlier.

Here we still want to support typedefs, but an ExtendedAttribute is not appropriate (was already parsed).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>827115</commentid>
    <comment_count>7</comment_count>
      <attachid>187006</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-07 00:37:01 -0800</bug_when>
    <thetext>Created attachment 187006
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>829526</commentid>
    <comment_count>8</comment_count>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-11 02:35:11 -0800</bug_when>
    <thetext>review anyone please?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>829531</commentid>
    <comment_count>9</comment_count>
      <attachid>187006</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-11 02:48:10 -0800</bug_when>
    <thetext>Comment on attachment 187006
Patch

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

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:102
&gt; +struct( ExtendedType =&gt; {

Maybe &apos;DefinedType&apos; would be a better wording?

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1674
&gt; +sub parseTypeOrExtendedType

What is this parsing in the IDL grammer (http://www.w3.org/TR/WebIDL/#idl-grammar)? We&apos;d like to make the parser as much as conformant with the IDL grammer.

&gt; Source/WebCore/bindings/scripts/test/TestCallback.idl:32
&gt; +typedef Class2 TYPEDEF_CLASS2;

Would you add new tests for &apos;typedef&apos; instead of replacing existing tests? Replacing existing tests makes the intention of the existing tests unclear.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>830516</commentid>
    <comment_count>10</comment_count>
      <attachid>186866</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2013-02-11 20:41:17 -0800</bug_when>
    <thetext>Comment on attachment 186866
Patch

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

&gt;&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:754
&gt;&gt;&gt; +        my $typedef = $self-&gt;parseExtendedType();
&gt;&gt; 
&gt;&gt; I strongly think you should call assertNoExtendedAttributesInTypedef here so that errors are caught when the typedef is parsed, not when it&apos;s used.
&gt; 
&gt; But we do want an extendedAttribute here, if provided. The WebIDL grammar of typedef:

I see, yes, extended attributes should be allowed here. However, I don&apos;t agree with your reading of the Web IDL grammar for typedef. Typedef itself doesn&apos;t have an ExtendedAttributeList preceding it. The initial ExtendedAttributeList you describe is associated with grammar rules like Definitions, Argument, etc. The grammar for Typedef is:

&quot;typedef&quot; ExtendedAttributeList Type identifier &quot;;&quot;

I also don&apos;t agree that for example the Argument&apos;s ExtendedAttributeList is simply ignored. As far as I can tell from reading the Web IDL spec, if an extended attribute is specified for an argument, and the argument&apos;s type is also a typedef, then the extended attributes applied are the combination of those two lists. If it turns out that the two lists contain incompatible extended attributes, then an error is raised.

&gt;&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1679
&gt;&gt;&gt; +        $extendedAttributeList = $self-&gt;parseExtendedAttributeListAllowEmpty();
&gt;&gt; 
&gt;&gt; Is this really correct? We only parse extended attributes on a type if there aren&apos;t any specified e.g. on the attribute or operation? This seems wrong.
&gt; 
&gt; Yes, as far as I can see. At this point we expect 0 or 1 ExtendedAttributeList. The $extendedAttributeList passed in tells us if we already have parsed an ExtendedAttributeList.

The only situation where we call this and an extended attribute list is allowed is if we&apos;re parsing a typedef. Otherwise the extended attribute list has already been parsed and is associated with another grammar rule like Argument.

&gt;&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1690
&gt;&gt;&gt; +            $self-&gt;assertNoExtendedAttributesInTypedef($next-&gt;value(), __LINE__);
&gt;&gt; 
&gt;&gt; As mentioned above, I think this check should go inside parseTypedef.
&gt; 
&gt; Here we protect from the following:
&gt; 
&gt; typedef [Clamp] unsigned int CLAMPED_UINT;
&gt; ...
&gt; void func(in [Optional] CLAMPED_UINT x);   // should die, equal to: void func(in [Optional] [Clamp] unsigned int x);
&gt; 
&gt; Quote from the WebIDL spec (http://www.w3.org/TR/WebIDL/#idl-typedefs):
&gt; &quot;A typedef must not be used as the type of a construct if an extended attribute that appears after the typedef keyword would be disallowed from appearing directly on that construct.&quot;

OK. I agree that this check is in the right place, but it&apos;s checking the wrong thing. It should be assembling the combined extended attributes from e.g. the Argument and the typedef and then checking the whole set for incompatible extended attributes.

&gt;&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1787
&gt;&gt;&gt; +        $self-&gt;assertNoExtendedAttributesInTypedef($next-&gt;value(), __LINE__);
&gt;&gt; 
&gt;&gt; Again, this check should be done earlier.
&gt; 
&gt; Here we still want to support typedefs, but an ExtendedAttribute is not appropriate (was already parsed).

Extended attributes can still be applied to arguments even if the argument&apos;s type is a typedef.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>830524</commentid>
    <comment_count>11</comment_count>
      <attachid>187006</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2013-02-11 21:10:46 -0800</bug_when>
    <thetext>Comment on attachment 187006
Patch

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

As I&apos;m studying this patch and the Web IDL grammar more, it&apos;s becoming clearer to me that this patch is not correct as written. Please look at the comments above and correct any misunderstandings I have.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1674
&gt;&gt; +sub parseTypeOrExtendedType
&gt; 
&gt; What is this parsing in the IDL grammer (http://www.w3.org/TR/WebIDL/#idl-grammar)? We&apos;d like to make the parser as much as conformant with the IDL grammer.

This is an excellent point. There is no concept of an &quot;extended type&quot; in the IDL grammar. This patch seems to associate the ExtendedAttributeList which a typedef may contain with the type that follows it. However, throughout the grammar, the ExtendedAttributeList is associated with a different production: Argument, Definitions, etc.

The patch should be restructured to follow the grammar. Then it will make more sense, and confusion I had earlier about ignoring incoming ExtendedAttributeLists in certain circumstances will be cleared up. Fundamentally, what this patch should be doing is (a) doing the missing lookup in the typedef dictionary when parsing a type, and (b) merging the ExtendedAttributeLists that apply to Argument and those that were specified in the Typedef.

Here are the key rules in http://dev.w3.org/2006/webapi/WebIDL/ :

&quot;No extended attributes defined in this specification are applicable to typedefs themselves.&quot; This means that in rule [1] Definitions, the ExtendedAttributeList must be empty if parsing a typedef.

&quot;Any extended attributes that apply to a construct due to their appearing on a referenced typedef are considered to appear after those that are specified explicitly on the construct...&quot; This clearly means that it&apos;s legal to specify an ExtendedAttributeList for an Argument even if the Argument&apos;s type is a typedef, and that the extended attribute lists are concatenated. Later text states &quot;none of the extended attributes defined in this specification that can validly be used in a typedef are sensitive to order.&quot;

&quot;A typedef must not be used as the type of a construct if an extended attribute that appears after the typedef keyword would be disallowed from appearing directly on that construct.&quot; You&apos;ve pointed out this rule earlier. This means that the validation of the extended attribute list has to occur when the entire production (e.g. Argument) has been parsed, and the whole extended attribute list and type have been assembled.

In the grammar, typedef lookup is handled in the NonAnyType production.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:1788
&gt; +        $self-&gt;assertNoExtendedAttributesInTypedef($next-&gt;value(), __LINE__);

This assertion is incorrect. It&apos;s legal for an argument to have an extended attribute list and also, if the argument refers to a typedef, for the typedef to have had an ExtendedAttributeList.

&gt;&gt; Source/WebCore/bindings/scripts/test/TestCallback.idl:32
&gt;&gt; +typedef Class2 TYPEDEF_CLASS2;
&gt; 
&gt; Would you add new tests for &apos;typedef&apos; instead of replacing existing tests? Replacing existing tests makes the intention of the existing tests unclear.

Agree with this.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832016</commentid>
    <comment_count>12</comment_count>
      <attachid>188111</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-13 10:11:08 -0800</bug_when>
    <thetext>Created attachment 188111
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832020</commentid>
    <comment_count>13</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-02-13 10:16:26 -0800</bug_when>
    <thetext>Attachment 188111 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/bindings/scripts/IDLParser.pm&apos;, u&apos;Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefsPrivate.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefs.mm&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefsInternal.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/TestTypedefs.idl&apos;, u&apos;Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.h&apos;]&quot; exit_code: 1
Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefsInternal.h:32:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.cpp:32:  wtf includes should be &lt;wtf/file.h&gt; instead of &quot;wtf/file.h&quot;.  [build/include] [4]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:150:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:152:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:153:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:154:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:157:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:159:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:161:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:162:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:163:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:164:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h:59:  More than one command on the same line in if  [whitespace/parens] [4]
Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.cpp:46:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 14 in 15 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832027</commentid>
    <comment_count>14</comment_count>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-13 10:19:45 -0800</bug_when>
    <thetext>Thanks for the review.

I think I addressed all the comments (if I not missed something). Also I apply the typedefs post factum, according to the following WebIDL spec:

&quot;Within an IDL fragment, a reference to a definition need not appear after the declaration of the referenced definition. References can also be made across IDL fragments.&quot;

&quot;Therefore, the following IDL fragment is valid:

interface B : A {
  void f(ArrayOfLongs x);
};

interface A {
};

typedef long[] ArrayOfLongs;
&quot;

The only weak place is a regex replace to address union types, sequence&lt;Type&gt; and etc. A more honest approach, I think, would be to introduce new structs like Type, SingleType, UnionType, NonAnyType and etc. and return those from the parseType() and other subroutines. This seemed to me an overkill, provided that we do not support union types anyway.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832492</commentid>
    <comment_count>15</comment_count>
      <attachid>188111</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-13 16:26:45 -0800</bug_when>
    <thetext>Comment on attachment 188111
Patch

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

Thanks for the patch!

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:361
&gt; +                if (exists $typedefs{$constant-&gt;type()}) {

Nit: type() =&gt; type

The same comments for other parts.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:363
&gt; +                    $self-&gt;assertNoExtendedAttributesInTypedef($constant-&gt;type(), __LINE__);

Is this speced?

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:368
&gt; +                $self-&gt;applyTypedefsForSignature($attribute-&gt;signature());

Nit: signature() =&gt; signature

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:392
&gt; +    my $type = $signature-&gt;type();
&gt; +    $type =~ s/[\?\[\]]+$//g;
&gt; +    my $typeSuffix = $signature-&gt;type();
&gt; +    $typeSuffix =~ s/^[^\?\[\]]+//g;

How about simply replacing a typedefed-type with a real type during parsing, instead of doing the replacement at the end of the parsing? By doing this, you don&apos;t need tricky regular expressions to replace types. Simply, every time you parse a type, you can check if the type is in the typedef structure. If it is found, you can just replace it at the point.

As far as I read the spec, we can assume that typedef should appear before being used. So you don&apos;t need to apply the replacement at the end of parsing.
http://www.w3.org/TR/WebIDL/#idl-typedefs</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832494</commentid>
    <comment_count>16</comment_count>
      <attachid>188111</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-13 16:28:01 -0800</bug_when>
    <thetext>Comment on attachment 188111
Patch

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

&gt; Source/WebCore/bindings/scripts/test/TestTypedefs.idl:70
&gt; +typedef float                      DOUBLE;
&gt; +typedef unsigned long long         ULONGLONG;
&gt; +typedef [Clamp] unsigned long long ULONGLONG_CLAMP;
&gt; +typedef SerializedScriptValue      SCRIPT_VALUE;
&gt; +typedef long[]                     ARRAY_OF_LONGS;
&gt; +typedef SVGPoint                   SVGPOINT;
&gt; +typedef DOMString                  STRING;
&gt; +typedef [Optional] DOMString       OPTIONAL_STRING;
&gt; +typedef DOMString[]                ARRAY_OF_STRINGS;
&gt; +typedef [Callback] TestCallback    TEST_CALLBACK;
&gt; +typedef [TransferList=txx] SerializedScriptValue TRANSFER_TXX_SCRIPT_VALUE;

You need to write them at the head of the file. (As far as I read the spec, I think that typedef should appear before being used.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832631</commentid>
    <comment_count>17</comment_count>
      <attachid>188111</attachid>
    <who name="Kenneth Russell">kbr</who>
    <bug_when>2013-02-13 18:11:24 -0800</bug_when>
    <thetext>Comment on attachment 188111
Patch

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

Thanks for persisting with this patch. It looks good to me at this point. Deferring to haraken for the remainder of the review since all of my concerns have been addressed. Happy to review further revisions though.

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:358
&gt; +    foreach my $definition (@$definitions) {

Is this descent into these data structures sufficient to find all the typedefs? What about for example raised exceptions? Can those refer to typedefs?

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:392
&gt;&gt; +    $typeSuffix =~ s/^[^\?\[\]]+//g;
&gt; 
&gt; How about simply replacing a typedefed-type with a real type during parsing, instead of doing the replacement at the end of the parsing? By doing this, you don&apos;t need tricky regular expressions to replace types. Simply, every time you parse a type, you can check if the type is in the typedef structure. If it is found, you can just replace it at the point.
&gt; 
&gt; As far as I read the spec, we can assume that typedef should appear before being used. So you don&apos;t need to apply the replacement at the end of parsing.
&gt; http://www.w3.org/TR/WebIDL/#idl-typedefs

Unfortunately as Andrey pointed out, a typedef can follow its first use in the file. http://www.w3.org/TR/WebIDL/#idl-names &quot;Within an IDL fragment, ...&quot; I agree this is pretty awful and wonder whether it&apos;s worth raising on public-script-coord.

I wonder whether it&apos;s worth diverging from the Web IDL spec, and requiring that a typedef precede its first use, if it makes the implementation simpler and more correct. See comment above about whether the replacement of typedefs is fully correct.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832638</commentid>
    <comment_count>18</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-13 18:22:20 -0800</bug_when>
    <thetext>(In reply to comment #17)
&gt; Unfortunately as Andrey pointed out, a typedef can follow its first use in the file. http://www.w3.org/TR/WebIDL/#idl-names &quot;Within an IDL fragment, ...&quot; I agree this is pretty awful and wonder whether it&apos;s worth raising on public-script-coord.

Thanks for clarification. Then the current patch looks OK to me, with a couple of nits I pointed out.

I think it would be worth raising the issue to public discussion, but I don&apos;t want to block your work by that. So I&apos;m happy to go with the current patch for now.

&gt; &gt; Source/WebCore/bindings/scripts/IDLParser.pm:358
&gt; &gt; +    foreach my $definition (@$definitions) {
&gt; 
&gt; Is this descent into these data structures sufficient to find all the typedefs? What about for example raised exceptions? Can those refer to typedefs?

(If we could mechanically replace a type with a typedef-ed type every time we find a type, this kind of concern would go away... I guess the current Web IDL spec is not good.)</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832788</commentid>
    <comment_count>19</comment_count>
      <attachid>188111</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-14 00:28:05 -0800</bug_when>
    <thetext>Comment on attachment 188111
Patch

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

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:358
&gt;&gt; +    foreach my $definition (@$definitions) {
&gt; 
&gt; Is this descent into these data structures sufficient to find all the typedefs? What about for example raised exceptions? Can those refer to typedefs?

We represent an exception with a domInterface struct (see parseException). As such they will be iterated below as well. I added test cases for those.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:361
&gt;&gt; +                if (exists $typedefs{$constant-&gt;type()}) {
&gt; 
&gt; Nit: type() =&gt; type
&gt; 
&gt; The same comments for other parts.

done

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:363
&gt;&gt; +                    $self-&gt;assertNoExtendedAttributesInTypedef($constant-&gt;type(), __LINE__);
&gt; 
&gt; Is this speced?

WebIDL: &quot;The type of a constant (matching ConstType) must not be any type other than a primitive type or a nullable primitive type. If an identifier is used, it must reference a typedef whose type is a primitive type or a nullable primitive type.&quot;
So, I just disallow extended attributes here. The other checks, if we care, should already be there in some place.

&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:368
&gt;&gt; +                $self-&gt;applyTypedefsForSignature($attribute-&gt;signature());
&gt; 
&gt; Nit: signature() =&gt; signature

done.

&gt;&gt;&gt; Source/WebCore/bindings/scripts/IDLParser.pm:392
&gt;&gt;&gt; +    $typeSuffix =~ s/^[^\?\[\]]+//g;
&gt;&gt; 
&gt;&gt; How about simply replacing a typedefed-type with a real type during parsing, instead of doing the replacement at the end of the parsing? By doing this, you don&apos;t need tricky regular expressions to replace types. Simply, every time you parse a type, you can check if the type is in the typedef structure. If it is found, you can just replace it at the point.
&gt;&gt; 
&gt;&gt; As far as I read the spec, we can assume that typedef should appear before being used. So you don&apos;t need to apply the replacement at the end of parsing.
&gt;&gt; http://www.w3.org/TR/WebIDL/#idl-typedefs
&gt; 
&gt; Unfortunately as Andrey pointed out, a typedef can follow its first use in the file. http://www.w3.org/TR/WebIDL/#idl-names &quot;Within an IDL fragment, ...&quot; I agree this is pretty awful and wonder whether it&apos;s worth raising on public-script-coord.
&gt; 
&gt; I wonder whether it&apos;s worth diverging from the Web IDL spec, and requiring that a typedef precede its first use, if it makes the implementation simpler and more correct. See comment above about whether the replacement of typedefs is fully correct.

@haraken:
&gt;Simply, every time you parse a type, you can check if the type is in the typedef structure. If it is found, you can just replace it at the point.

Even if we require typedefs to precede its first use, what to do with it&apos;s extended attributes? Those may be applied to a const or an attribute or a function/constructor signature - we don&apos;t have an access to these at the parseNonAnyType() function.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832789</commentid>
    <comment_count>20</comment_count>
      <attachid>188276</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-14 00:32:18 -0800</bug_when>
    <thetext>Created attachment 188276
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832791</commentid>
    <comment_count>21</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-02-14 00:36:02 -0800</bug_when>
    <thetext>Attachment 188276 did not pass style-queue:

Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefsInternal.h:32:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.cpp:32:  wtf includes should be &lt;wtf/file.h&gt; instead of &quot;wtf/file.h&quot;.  [build/include] [4]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:190:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:192:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:193:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:194:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:197:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:199:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:201:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:202:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:203:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:204:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:206:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:208:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:209:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:210:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:213:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:215:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:217:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:218:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:219:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:222:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:224:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:226:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:227:  Weird number of spaces at line-start.  Are you usinFailed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/bindings/scripts/IDLParser.pm&apos;, u&apos;Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefsPrivate.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefs.mm&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefsInternal.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/TestTypedefs.idl&apos;, u&apos;Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.h&apos;]&quot; exit_code: 1
g a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:228:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:229:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:231:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:233:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:234:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:235:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:236:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h:59:  More than one command on the same line in if  [whitespace/parens] [4]
Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.cpp:46:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 34 in 15 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832798</commentid>
    <comment_count>22</comment_count>
      <attachid>188276</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-14 00:44:36 -0800</bug_when>
    <thetext>Comment on attachment 188276
Patch

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

&gt; Source/WebCore/bindings/scripts/IDLParser.pm:392
&gt; +    $type =~ s/[\?\[\]]+$//g;
&gt; +    my $typeSuffix = $signature-&gt;type;
&gt; +    $typeSuffix =~ s/^[^\?\[\]]+//g;

Do you need this?

It seems that you are assuming something like:

typedef Foo Bar;
attribute Bar[] xxx;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832800</commentid>
    <comment_count>23</comment_count>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-14 00:52:58 -0800</bug_when>
    <thetext>(In reply to comment #22)
&gt; (From update of attachment 188276 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=188276&amp;action=review
&gt; 
&gt; &gt; Source/WebCore/bindings/scripts/IDLParser.pm:392
&gt; &gt; +    $type =~ s/[\?\[\]]+$//g;
&gt; &gt; +    my $typeSuffix = $signature-&gt;type;
&gt; &gt; +    $typeSuffix =~ s/^[^\?\[\]]+//g;
&gt; 
&gt; Do you need this?
&gt; 
&gt; It seems that you are assuming something like:
&gt; 
&gt; typedef Foo Bar;
&gt; attribute Bar[] xxx;

Exactly.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832801</commentid>
    <comment_count>24</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-14 00:55:06 -0800</bug_when>
    <thetext>(In reply to comment #23)
&gt; &gt; typedef Foo Bar;
&gt; &gt; attribute Bar[] xxx;
&gt; 
&gt; Exactly.

From the spec, it is not clear to me if we should support it or not. Would you elaborate on that?

If we should support it, please add a test case.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832813</commentid>
    <comment_count>25</comment_count>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-14 01:09:16 -0800</bug_when>
    <thetext>(In reply to comment #24)
&gt; (In reply to comment #23)
&gt; &gt; &gt; typedef Foo Bar;
&gt; &gt; &gt; attribute Bar[] xxx;
&gt; &gt; 
&gt; &gt; Exactly.
&gt; 
&gt; From the spec, it is not clear to me if we should support it or not. Would you elaborate on that?
&gt; 
&gt; If we should support it, please add a test case.

[24]	Typedef	→	&quot;typedef&quot; ExtendedAttributeList Type identifier &quot;;&quot;

[62]	NonAnyType	→	PrimitiveType TypeSuffix 
 | &quot;DOMString&quot; TypeSuffix 
 | identifier TypeSuffix 
 | &quot;sequence&quot; &quot;&lt;&quot; Type &quot;&gt;&quot; Null 
 | &quot;object&quot; TypeSuffix 
 | &quot;Date&quot; TypeSuffix

So, if a NonAnyType == &quot;identifier TypeSuffix&quot;, the identifier may point to a typedef, resolving to &quot;ExtendedAttributeList Type TypeSuffix&quot;. At least this is how I understand the spec.

I&apos;ll add a test.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832816</commentid>
    <comment_count>26</comment_count>
      <attachid>188280</attachid>
    <who name="Andrey Adaikin">aandrey</who>
    <bug_when>2013-02-14 01:11:41 -0800</bug_when>
    <thetext>Created attachment 188280
with a test case for STRING[]</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832817</commentid>
    <comment_count>27</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-14 01:12:03 -0800</bug_when>
    <thetext>(In reply to comment #25)
&gt; [24]    Typedef    →    &quot;typedef&quot; ExtendedAttributeList Type identifier &quot;;&quot;
&gt; 
&gt; [62]    NonAnyType    →    PrimitiveType TypeSuffix 
&gt;  | &quot;DOMString&quot; TypeSuffix 
&gt;  | identifier TypeSuffix 
&gt;  | &quot;sequence&quot; &quot;&lt;&quot; Type &quot;&gt;&quot; Null 
&gt;  | &quot;object&quot; TypeSuffix 
&gt;  | &quot;Date&quot; TypeSuffix
&gt; 
&gt; So, if a NonAnyType == &quot;identifier TypeSuffix&quot;, the identifier may point to a typedef, resolving to &quot;ExtendedAttributeList Type TypeSuffix&quot;. At least this is how I understand the spec.
&gt; 
&gt; I&apos;ll add a test.

Thanks, you&apos;re right. I think the current Web IDL spec is not good. I&apos;m happy to go with the current patch for now, but would you raise the issue to the community?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832818</commentid>
    <comment_count>28</comment_count>
      <attachid>188280</attachid>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-14 01:12:25 -0800</bug_when>
    <thetext>Comment on attachment 188280
with a test case for STRING[]

LGTM. Thanks!</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832821</commentid>
    <comment_count>29</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-02-14 01:16:05 -0800</bug_when>
    <thetext>Attachment 188280 did not pass style-queue:

Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefsInternal.h:32:  Code inside a namespace should not be indented.  [whitespace/indent] [4]
Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.cpp:32:  wtf includes should be &lt;wtf/file.h&gt; instead of &quot;wtf/file.h&quot;.  [build/include] [4]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:190:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:192:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:193:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:194:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:197:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:199:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:201:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:202:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:203:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:204:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:206:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:208:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:209:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:210:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:213:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:215:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:217:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:218:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:219:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:222:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:224:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:226:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:227:  Weird number of spaces at line-start.  Are you usinFailed to run &quot;[&apos;Tools/Scripts/check-webkit-style&apos;, &apos;--diff-files&apos;, u&apos;Source/WebCore/ChangeLog&apos;, u&apos;Source/WebCore/bindings/scripts/IDLParser.pm&apos;, u&apos;Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/CPP/WebDOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefsPrivate.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefs.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefs.mm&apos;, u&apos;Source/WebCore/bindings/scripts/test/ObjC/DOMTestTypedefsInternal.h&apos;, u&apos;Source/WebCore/bindings/scripts/test/TestTypedefs.idl&apos;, u&apos;Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.cpp&apos;, u&apos;Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.h&apos;]&quot; exit_code: 1
g a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:228:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:229:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:231:  When wrapping a line, only indent 4 spaces.  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:233:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:234:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:235:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/GObject/WebKitDOMTestTypedefs.cpp:236:  Weird number of spaces at line-start.  Are you using a 4-space indent?  [whitespace/indent] [3]
Source/WebCore/bindings/scripts/test/JS/JSTestTypedefs.h:59:  More than one command on the same line in if  [whitespace/parens] [4]
Source/WebCore/bindings/scripts/test/V8/V8TestTypedefs.cpp:46:  Extra space before ( in function call  [whitespace/parens] [4]
Total errors found: 34 in 15 files


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832920</commentid>
    <comment_count>30</comment_count>
      <attachid>188280</attachid>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-02-14 03:55:36 -0800</bug_when>
    <thetext>Comment on attachment 188280
with a test case for STRING[]

Clearing flags on attachment: 188280

Committed r142865: &lt;http://trac.webkit.org/changeset/142865&gt;</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>832922</commentid>
    <comment_count>31</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2013-02-14 03:55:42 -0800</bug_when>
    <thetext>All reviewed patches have been landed.  Closing bug.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>833603</commentid>
    <comment_count>32</comment_count>
    <who name="Ryosuke Niwa">rniwa</who>
    <bug_when>2013-02-14 18:05:25 -0800</bug_when>
    <thetext>binding tests started failing after this patch:
http://build.webkit.org/builders/Apple%20MountainLion%20Release%20WK2%20%28Tests%29/builds/5943/steps/bindings-generation-tests/logs/stdio


--- WebCore/bindings/scripts/test/V8/V8TestTypedefs.cpp	2013-02-14 04:38:13.000000000 -0800
+++ /var/folders/40/g3vmqrl1701740n0crx6dcjw0000gn/T/tmpCKB29V/V8TestTypedefs.cpp	2013-02-14 05:16:39.000000000 -0800
@@ -286,7 +286,7 @@
     TestTypedefs* imp = V8TestTypedefs::toNative(args.Holder());
     unsigned long long arg1 = 0;
     V8TRYCATCH(double, arg1NativeValue, args[0]-&gt;NumberValue());
-    if (!isnan(arg1NativeValue))
+    if (!std::isnan(arg1NativeValue))
         arg1 = clampTo&lt;unsigned long long&gt;(arg1NativeValue);
     if (args.Length() &lt;= 1) {
         imp-&gt;funcWithClamp(arg1);
@@ -294,7 +294,7 @@
     }
     unsigned long long arg2 = 0;
     V8TRYCATCH(double, arg2NativeValue, args[1]-&gt;NumberValue());
-    if (!isnan(arg2NativeValue))
+    if (!std::isnan(arg2NativeValue))
         arg2 = clampTo&lt;unsigned long long&gt;(arg2NativeValue);
     imp-&gt;funcWithClamp(arg1, arg2);
     return v8Undefined();</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>833604</commentid>
    <comment_count>33</comment_count>
    <who name="Kentaro Hara">haraken</who>
    <bug_when>2013-02-14 18:09:22 -0800</bug_when>
    <thetext>Rebaselined run-bindings-tests in r142951.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>186866</attachid>
            <date>2013-02-06 08:55:08 -0800</date>
            <delta_ts>2013-02-11 20:41:17 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52340-20130206205145.patch</filename>
            <type>text/plain</type>
            <size>13714</size>
            <attacher name="Andrey Adaikin">aandrey</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQxNTc5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZWE5ZjQxYTFmYjRhYWVm
NDk3NWUxNGQ0YTYzNTc3NDUwMmJhNWU2Ni4uM2JlNTNlZDk0OGY4YmY2YTgyZmU1NjQ3NzkxZGY1
ZjQzNzZmZTVlMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI0IEBACisyMDEzLTAyLTA2ICBBbmRy
ZXkgQWRhaWtpbiAgPGFhbmRyZXlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIExvb2sgaW50byBw
b3NzaWJpbGl0aWVzIG9mIHR5cGVkZWYgaW4gd2Via2l0IGlkbCBmaWxlcworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTIzNDAKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgdHlwZWRlZiBzdXBwb3J0IGZv
ciBXZWJLaXQgSURMIHBhcnNlci4KKyAgICAgICAgRHJpdmUgYnk6IGZpeGVkIGEgYnVnIG9mIGdl
bmVyYXRpbmcgInVucmVzdHJpY3RlZGZsb2F0IiB3aXRob3V0IGEgc3BhY2UuCisKKyAgICAgICAg
KiBiaW5kaW5ncy9zY3JpcHRzL0lETFBhcnNlci5wbToKKyAgICAgICAgKGFzc2VydE5vRXh0ZW5k
ZWRBdHRyaWJ1dGVzSW5UeXBlZGVmKToKKyAgICAgICAgKHBhcnNlVHlwZWRlZik6CisgICAgICAg
IChwYXJzZUF0dHJpYnV0ZVJlc3QpOgorICAgICAgICAocGFyc2VPcHRpb25hbE9yUmVxdWlyZWRB
cmd1bWVudCk6CisgICAgICAgIChwYXJzZUV4dGVuZGVkVHlwZSk6CisgICAgICAgIChwYXJzZU5v
bkFueVR5cGUpOgorICAgICAgICAocGFyc2VVbnJlc3RyaWN0ZWRGbG9hdFR5cGUpOgorICAgICAg
ICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0Q2FsbGJhY2suaWRsOiBSZXBsYWNlIHNvbWUg
dHlwZXMgYnkgdHlwZWRlZnMKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdE9i
ai5pZGw6IFJlcGxhY2Ugc29tZSB0eXBlcyBieSB0eXBlZGVmcworCiAyMDEzLTAyLTAxICBQYXZl
bCBGZWxkbWFuICA8cGZlbGRtYW5AY2hyb21pdW0ub3JnPgogCiAgICAgICAgIFdlYiBJbnNwZWN0
b3I6IEZvbGxvdyB1cCB0byByMTQxMjYwOiBmaXhpbmcgcmVuYW1lZCBzdHlsZS4KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvSURMUGFyc2VyLnBtIGIvU291cmNl
L1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIucG0KaW5kZXggNmFlOGI5ZTBkZDJj
Zjk4Mjg4MThjYTIxYmI3ZWJkYjA3NjI5NjI2Yy4uY2RhYTc2OGZlYmQ0NjY3YWE2YTQwMDk5Y2Y1
ZTc0MjY4ODk3OWE1NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0
cy9JRExQYXJzZXIucG0KKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9JRExQ
YXJzZXIucG0KQEAgLTk4LDYgKzk4LDE0IEBAIHN0cnVjdCggVG9rZW4gPT4gewogICAgIHZhbHVl
ID0+ICckJyAjIHZhbHVlIG9mIHRva2VuCiB9KTsKIAorIyBVc2VkIHRvIHJlcHJlc2VudCBhIHR5
cGUgd2l0aCBhbiBvcHRpb25hbCBFeHRlbmRlZEF0dHJpYnV0ZUxpc3QKK3N0cnVjdCggRXh0ZW5k
ZWRUeXBlID0+IHsKKyAgICBleHRlbmRlZEF0dHJpYnV0ZXMgPT4gJyQnLCAjIEV4dGVuZGVkIGF0
dHJpYnV0ZXMKKyAgICB0eXBlID0+ICckJywgIyBUeXBlIG9mIHR5cGVkZWYKK30pOworCitteSAl
dHlwZWRlZnMgPSAoKTsKKwogc3ViIG5ldyB7CiAgICAgbXkgJGNsYXNzID0gc2hpZnQ7CiAKQEAg
LTE0OSw2ICsxNTcsMTkgQEAgc3ViIGFzc2VydFVuZXhwZWN0ZWRUb2tlbgogICAgIGRpZSAkbXNn
OwogfQogCitzdWIgYXNzZXJ0Tm9FeHRlbmRlZEF0dHJpYnV0ZXNJblR5cGVkZWYKK3sKKyAgICBt
eSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRuYW1lID0gc2hpZnQ7CisgICAgbXkgJGxpbmUgPSBz
aGlmdDsKKyAgICBteSAkdHlwZWRlZiA9ICR0eXBlZGVmc3skbmFtZX07CisgICAgbXkgJG1zZyA9
ICJVbmV4cGVjdGVkIEV4dGVuZGVkQXR0cmlidXRlTGlzdCBpbiB0eXBlZGVmIFwiJG5hbWVcIiBh
dCAiIC4gJHNlbGYtPntMaW5lfTsKKyAgICBpZiAoZGVmaW5lZCAoJGxpbmUpKSB7CisgICAgICAg
ICRtc2cgLj0gIiBJRExQYXJzZXIucG06IiAuICRsaW5lOworICAgIH0KKyAgICBkaWUgJG1zZyBp
ZiAleyR0eXBlZGVmLT5leHRlbmRlZEF0dHJpYnV0ZXMoKX07Cit9CisKIHN1YiBQYXJzZQogewog
ICAgIG15ICRzZWxmID0gc2hpZnQ7CkBAIC03MjUsMTUgKzc0NiwxOCBAQCBzdWIgcGFyc2VDYWxs
YmFja1Jlc3QKIHN1YiBwYXJzZVR5cGVkZWYKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwotICAg
IG15ICRleHRlbmRlZEF0dHJpYnV0ZUxpc3QgPSBzaGlmdDsKKyAgICBteSAkZXh0ZW5kZWRBdHRy
aWJ1dGVMaXN0ID0gc2hpZnQ7ICMgaWdub3JlZDogRXh0ZW5kZWQgYXR0cmlidXRlcyBhcmUgbm90
IGFwcGxpY2FibGUgdG8gdHlwZWRlZnMgdGhlbXNlbHZlcwogCiAgICAgbXkgJG5leHQgPSAkc2Vs
Zi0+bmV4dFRva2VuKCk7CiAgICAgaWYgKCRuZXh0LT52YWx1ZSgpIGVxICJ0eXBlZGVmIikgewog
ICAgICAgICAkc2VsZi0+YXNzZXJ0VG9rZW5WYWx1ZSgkc2VsZi0+Z2V0VG9rZW4oKSwgInR5cGVk
ZWYiLCBfX0xJTkVfXyk7Ci0gICAgICAgICRzZWxmLT5wYXJzZUV4dGVuZGVkQXR0cmlidXRlTGlz
dCgpOwotICAgICAgICAkc2VsZi0+cGFyc2VUeXBlKCk7Ci0gICAgICAgICRzZWxmLT5hc3NlcnRU
b2tlblR5cGUoJHNlbGYtPmdldFRva2VuKCksIElkZW50aWZpZXJUb2tlbik7CisgICAgICAgIG15
ICR0eXBlZGVmID0gJHNlbGYtPnBhcnNlRXh0ZW5kZWRUeXBlKCk7CisgICAgICAgIG15ICRuYW1l
VG9rZW4gPSAkc2VsZi0+Z2V0VG9rZW4oKTsKKyAgICAgICAgJHNlbGYtPmFzc2VydFRva2VuVHlw
ZSgkbmFtZVRva2VuLCBJZGVudGlmaWVyVG9rZW4pOwogICAgICAgICAkc2VsZi0+YXNzZXJ0VG9r
ZW5WYWx1ZSgkc2VsZi0+Z2V0VG9rZW4oKSwgIjsiLCBfX0xJTkVfXyk7CisgICAgICAgIG15ICRu
YW1lID0gJG5hbWVUb2tlbi0+dmFsdWUoKTsKKyAgICAgICAgZGllICJ0eXBlZGVmIHJlZGlmaW5p
dGlvbiBmb3IgIiAuICRuYW1lIC4gIiBhdCAiIC4gJHNlbGYtPntMaW5lfSBpZiBleGlzdHMgJHR5
cGVkZWZzeyRuYW1lfTsKKyAgICAgICAgJHR5cGVkZWZzeyRuYW1lfSA9ICR0eXBlZGVmOwogICAg
ICAgICByZXR1cm47CiAgICAgfQogICAgICRzZWxmLT5hc3NlcnRVbmV4cGVjdGVkVG9rZW4oJG5l
eHQtPnZhbHVlKCksIF9fTElORV9fKTsKQEAgLTEwMzgsNyArMTA2Miw5IEBAIHN1YiBwYXJzZUF0
dHJpYnV0ZVJlc3QKICAgICAgICAgfQogICAgICAgICAkc2VsZi0+YXNzZXJ0VG9rZW5WYWx1ZSgk
c2VsZi0+Z2V0VG9rZW4oKSwgImF0dHJpYnV0ZSIsIF9fTElORV9fKTsKICAgICAgICAgJG5ld0Rh
dGFOb2RlLT5zaWduYXR1cmUoZG9tU2lnbmF0dXJlLT5uZXcoKSk7Ci0gICAgICAgICRuZXdEYXRh
Tm9kZS0+c2lnbmF0dXJlLT50eXBlKCRzZWxmLT5wYXJzZVR5cGUoKSk7CisgICAgICAgIG15ICR0
eXBlZGVmID0gJHNlbGYtPnBhcnNlRXh0ZW5kZWRUeXBlKCRleHRlbmRlZEF0dHJpYnV0ZUxpc3Qp
OworICAgICAgICAkZXh0ZW5kZWRBdHRyaWJ1dGVMaXN0ID0gJHR5cGVkZWYtPmV4dGVuZGVkQXR0
cmlidXRlcygpOworICAgICAgICAkbmV3RGF0YU5vZGUtPnNpZ25hdHVyZS0+dHlwZSgkdHlwZWRl
Zi0+dHlwZSgpKTsKICAgICAgICAgbXkgJHRva2VuID0gJHNlbGYtPmdldFRva2VuKCk7CiAgICAg
ICAgICRzZWxmLT5hc3NlcnRUb2tlblR5cGUoJHRva2VuLCBJZGVudGlmaWVyVG9rZW4pOwogICAg
ICAgICAkbmV3RGF0YU5vZGUtPnNpZ25hdHVyZS0+bmFtZSgkdG9rZW4tPnZhbHVlKCkpOwpAQCAt
MTMxOCw3ICsxMzQ0LDkgQEAgc3ViIHBhcnNlT3B0aW9uYWxPclJlcXVpcmVkQXJndW1lbnQKICAg
ICAgICAgcmV0dXJuICRwYXJhbURhdGFOb2RlOwogICAgIH0KICAgICBpZiAoJG5leHQtPnR5cGUo
KSA9PSBJZGVudGlmaWVyVG9rZW4gfHwgJG5leHQtPnZhbHVlKCkgPX4gLyRuZXh0RXhjZXB0aW9u
RmllbGRfMS8pIHsKLSAgICAgICAgbXkgJHR5cGUgPSAkc2VsZi0+cGFyc2VUeXBlKCk7CisgICAg
ICAgIG15ICR0eXBlZGVmID0gJHNlbGYtPnBhcnNlRXh0ZW5kZWRUeXBlKCRleHRlbmRlZEF0dHJp
YnV0ZUxpc3QpOworICAgICAgICBteSAkdHlwZSA9ICR0eXBlZGVmLT50eXBlKCk7CisgICAgICAg
ICRwYXJhbURhdGFOb2RlLT5leHRlbmRlZEF0dHJpYnV0ZXMoJHR5cGVkZWYtPmV4dGVuZGVkQXR0
cmlidXRlcygpKTsKICAgICAgICAgIyBkb21EYXRhTm9kZSBjYW4gb25seSBjb25zaWRlciBsYXN0
ICI/Ii4KICAgICAgICAgaWYgKCR0eXBlID1+IC9cPyQvKSB7CiAgICAgICAgICAgICAkcGFyYW1E
YXRhTm9kZS0+aXNOdWxsYWJsZSgxKTsKQEAgLTE2NDIsNiArMTY3MCwzNCBAQCBzdWIgcGFyc2VB
cmd1bWVudE5hbWVLZXl3b3JkCiAgICAgJHNlbGYtPmFzc2VydFVuZXhwZWN0ZWRUb2tlbigkbmV4
dC0+dmFsdWUoKSwgX19MSU5FX18pOwogfQogCitzdWIgcGFyc2VFeHRlbmRlZFR5cGUKK3sKKyAg
ICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRleHRlbmRlZEF0dHJpYnV0ZUxpc3QgPSBzaGlm
dDsKKworICAgIGlmICghZGVmaW5lZCgkZXh0ZW5kZWRBdHRyaWJ1dGVMaXN0KSBvciAhJXskZXh0
ZW5kZWRBdHRyaWJ1dGVMaXN0fSkgeworICAgICAgICAkZXh0ZW5kZWRBdHRyaWJ1dGVMaXN0ID0g
JHNlbGYtPnBhcnNlRXh0ZW5kZWRBdHRyaWJ1dGVMaXN0QWxsb3dFbXB0eSgpOworICAgIH0KKwor
ICAgIG15ICRyZXN1bHQgPSBFeHRlbmRlZFR5cGUtPm5ldygpOworICAgICRyZXN1bHQtPmV4dGVu
ZGVkQXR0cmlidXRlcygkZXh0ZW5kZWRBdHRyaWJ1dGVMaXN0KTsKKworICAgIG15ICRuZXh0ID0g
JHNlbGYtPm5leHRUb2tlbigpOworICAgIGlmIChleGlzdHMgJHR5cGVkZWZzeyRuZXh0LT52YWx1
ZSgpfSkgeworICAgICAgICAkc2VsZi0+YXNzZXJ0VG9rZW5UeXBlKCRzZWxmLT5nZXRUb2tlbigp
LCBJZGVudGlmaWVyVG9rZW4pOworICAgICAgICBteSAkdHlwZWRlZiA9ICR0eXBlZGVmc3skbmV4
dC0+dmFsdWUoKX07CisgICAgICAgIGlmICgleyRyZXN1bHQtPmV4dGVuZGVkQXR0cmlidXRlcygp
fSkgeworICAgICAgICAgICAgJHNlbGYtPmFzc2VydE5vRXh0ZW5kZWRBdHRyaWJ1dGVzSW5UeXBl
ZGVmKCRuZXh0LT52YWx1ZSgpLCBfX0xJTkVfXyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAg
ICAgICAkcmVzdWx0LT5leHRlbmRlZEF0dHJpYnV0ZXMoJHR5cGVkZWYtPmV4dGVuZGVkQXR0cmli
dXRlcygpKTsKKyAgICAgICAgfQorICAgICAgICAkcmVzdWx0LT50eXBlKCR0eXBlZGVmLT50eXBl
KCkgLiAkc2VsZi0+cGFyc2VUeXBlU3VmZml4KCkpOworICAgIH0gZWxzZSB7CisgICAgICAgICRy
ZXN1bHQtPnR5cGUoJHNlbGYtPnBhcnNlVHlwZSgpKTsKKyAgICB9CisgICAgcmV0dXJuICRyZXN1
bHQ7Cit9CisKIHN1YiBwYXJzZVR5cGUKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwpAQCAtMTcy
NSw2ICsxNzgxLDEyIEBAIHN1YiBwYXJzZU5vbkFueVR5cGUKIHsKICAgICBteSAkc2VsZiA9IHNo
aWZ0OwogICAgIG15ICRuZXh0ID0gJHNlbGYtPm5leHRUb2tlbigpOworCisgICAgaWYgKGV4aXN0
cyAkdHlwZWRlZnN7JG5leHQtPnZhbHVlKCl9KSB7CisgICAgICAgICRzZWxmLT5hc3NlcnRUb2tl
blR5cGUoJHNlbGYtPmdldFRva2VuKCksIElkZW50aWZpZXJUb2tlbik7CisgICAgICAgICRzZWxm
LT5hc3NlcnROb0V4dGVuZGVkQXR0cmlidXRlc0luVHlwZWRlZigkbmV4dC0+dmFsdWUoKSwgX19M
SU5FX18pOworICAgICAgICByZXR1cm4gJHR5cGVkZWZzeyRuZXh0LT52YWx1ZSgpfS0+dHlwZSgp
IC4gJHNlbGYtPnBhcnNlVHlwZVN1ZmZpeCgpOworICAgIH0KICAgICBpZiAoJG5leHQtPnZhbHVl
KCkgPX4gLyRuZXh0Tm9uQW55VHlwZV8xLykgewogICAgICAgICByZXR1cm4gJHNlbGYtPnBhcnNl
UHJpbWl0aXZlVHlwZSgpIC4gJHNlbGYtPnBhcnNlVHlwZVN1ZmZpeCgpOwogICAgIH0KQEAgLTE4
MDMsNyArMTg2NSw3IEBAIHN1YiBwYXJzZVVucmVzdHJpY3RlZEZsb2F0VHlwZQogICAgIG15ICRu
ZXh0ID0gJHNlbGYtPm5leHRUb2tlbigpOwogICAgIGlmICgkbmV4dC0+dmFsdWUoKSBlcSAidW5y
ZXN0cmljdGVkIikgewogICAgICAgICAkc2VsZi0+YXNzZXJ0VG9rZW5WYWx1ZSgkc2VsZi0+Z2V0
VG9rZW4oKSwgInVucmVzdHJpY3RlZCIsIF9fTElORV9fKTsKLSAgICAgICAgcmV0dXJuICJ1bnJl
c3RyaWN0ZWQiIC4gJHNlbGYtPnBhcnNlRmxvYXRUeXBlKCk7CisgICAgICAgIHJldHVybiAidW5y
ZXN0cmljdGVkICIgLiAkc2VsZi0+cGFyc2VGbG9hdFR5cGUoKTsKICAgICB9CiAgICAgaWYgKCRu
ZXh0LT52YWx1ZSgpID1+IC8kbmV4dFVucmVzdHJpY3RlZEZsb2F0VHlwZV8xLykgewogICAgICAg
ICByZXR1cm4gJHNlbGYtPnBhcnNlRmxvYXRUeXBlKCk7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2Vi
Q29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdENhbGxiYWNrLmlkbCBiL1NvdXJjZS9XZWJD
b3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0Q2FsbGJhY2suaWRsCmluZGV4IGVkMTk0NDc5
NzU1MGQ4NmUyMDVkNWU3ZjU5MjUwOGIxMTliMGVmOTcuLjM4NjEzZDdiNGVlMzljMjhhNDY2NWZk
YzE3NWJkMWE4N2JkY2FmYzUgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3Nj
cmlwdHMvdGVzdC9UZXN0Q2FsbGJhY2suaWRsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdz
L3NjcmlwdHMvdGVzdC9UZXN0Q2FsbGJhY2suaWRsCkBAIC0yOCwxMyArMjgsMTYgQEAKIAogLy8g
VGhpcyBJREwgZmlsZSBpcyBmb3IgdGVzdGluZyB0aGUgYmluZGluZ3MgY29kZSBnZW5lcmF0b3Ig
d2l0aCBhbiBpbnRlcmZhY2UKIC8vIHRoYXQgaGFzIHRoZSAiQ2FsbGJhY2siIGF0dHJpYnV0ZSBh
bmQgZm9yIHRyYWNraW5nIGNoYW5nZXMgaW4gaXRzIG91cHV0LgorCit0eXBlZGVmIENsYXNzMiBU
WVBFREVGX0NMQVNTMjsKKwogWwogICAgIENvbmRpdGlvbmFsPVNRTF9EQVRBQkFTRSwKICAgICBD
YWxsYmFjawogXSBpbnRlcmZhY2UgVGVzdENhbGxiYWNrIHsKICAgYm9vbGVhbiBjYWxsYmFja1dp
dGhOb1BhcmFtKCk7CiAgIGJvb2xlYW4gY2FsbGJhY2tXaXRoQ2xhc3MxUGFyYW0oaW4gQ2xhc3Mx
IGNsYXNzMVBhcmFtKTsKLSAgYm9vbGVhbiBjYWxsYmFja1dpdGhDbGFzczJQYXJhbShpbiBDbGFz
czIgY2xhc3MyUGFyYW0sIGluIERPTVN0cmluZyBzdHJBcmcpOworICBib29sZWFuIGNhbGxiYWNr
V2l0aENsYXNzMlBhcmFtKGluIFRZUEVERUZfQ0xBU1MyIGNsYXNzMlBhcmFtLCBpbiBET01TdHJp
bmcgc3RyQXJnKTsKICAgbG9uZyBjYWxsYmFja1dpdGhOb25Cb29sUmV0dXJuVHlwZShpbiBDbGFz
czMgY2xhc3MzUGFyYW0pOwogICBbQ3VzdG9tXSBsb25nIGN1c3RvbUNhbGxiYWNrKGluIENsYXNz
NSBjbGFzczVQYXJhbSwgaW4gQ2xhc3M2IGNsYXNzNlBhcmFtKTsKICAgYm9vbGVhbiBjYWxsYmFj
a1dpdGhTdHJpbmdMaXN0KGluIERPTVN0cmluZ0xpc3QgbGlzdFBhcmFtKTsKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0T2JqLmlkbCBiL1NvdXJj
ZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0T2JqLmlkbAppbmRleCBjMDYzMGUz
NzJjZTZkN2U0MGIxMjJkOTJjYWJhZjZkMjk2ZmZmZTQ4Li5iMDFlOWZiNzQ3OTE3NDQxNzFkZGRl
M2Q1MDczYzViODQ0OTJiZjk2IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9z
Y3JpcHRzL3Rlc3QvVGVzdE9iai5pZGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2Ny
aXB0cy90ZXN0L1Rlc3RPYmouaWRsCkBAIC0zMiw2ICszMiwxNCBAQAogCiBlbnVtIFRlc3RFbnVt
VHlwZSB7ICIiLCAiRW51bVZhbHVlMSIsICJFbnVtVmFsdWUyIiwgIkVudW1WYWx1ZTMiIH07CiAK
K3R5cGVkZWYgbG9uZyBsb25nIFRZUEVERUZfTE9OR19MT05HOwordHlwZWRlZiBET01TdHJpbmcg
VFlQRURFRl9TVFJJTkc7Cit0eXBlZGVmIERPTVN0cmluZ1tdIFRZUEVERUZfU1RSSU5HX0FSUkFZ
OwordHlwZWRlZiBzZXF1ZW5jZTx1bnNpZ25lZCBsb25nPiBUWVBFREVGX1VMT05HX0FSUkFZOwor
dHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBUWVBFREVGX1VTSE9SVDsKK3R5cGVkZWYgW0NsYW1wXSB1
bnNpZ25lZCBzaG9ydCBUWVBFREVGX0NMQU1QX1VTSE9SVDsKK3R5cGVkZWYgW09wdGlvbmFsXSBi
b29sZWFuIFRZUEVERUZfT1BUSU9OQUxfQk9PTDsKKwogWwogICAgIENvbnN0cnVjdG9yKGluIFtD
YWxsYmFja10gVGVzdENhbGxiYWNrIHRlc3RDYWxsYmFjayksCiAgICAgSW50ZXJmYWNlTmFtZT1U
ZXN0T2JqZWN0CkBAIC00Nyw5ICs1NSw5IEBAIGVudW0gVGVzdEVudW1UeXBlIHsgIiIsICJFbnVt
VmFsdWUxIiwgIkVudW1WYWx1ZTIiLCAiRW51bVZhbHVlMyIgfTsKICAgICBhdHRyaWJ1dGUgc2hv
cnQgICAgICAgICAgICAgICAgICAgIHNob3J0QXR0cjsKICAgICBhdHRyaWJ1dGUgdW5zaWduZWQg
c2hvcnQgICAgICAgICAgIHVuc2lnbmVkU2hvcnRBdHRyOwogICAgIGF0dHJpYnV0ZSBsb25nICAg
ICAgICAgICAgICAgICAgICAgbG9uZ0F0dHI7Ci0gICAgYXR0cmlidXRlIGxvbmcgbG9uZyAgICAg
ICAgICAgICAgICBsb25nTG9uZ0F0dHI7CisgICAgYXR0cmlidXRlIFRZUEVERUZfTE9OR19MT05H
ICAgICAgICBsb25nTG9uZ0F0dHI7CiAgICAgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbG9uZyAg
ICAgICB1bnNpZ25lZExvbmdMb25nQXR0cjsKLSAgICBhdHRyaWJ1dGUgRE9NU3RyaW5nICAgICAg
ICAgICAgICAgIHN0cmluZ0F0dHI7CisgICAgYXR0cmlidXRlIFRZUEVERUZfU1RSSU5HICAgICAg
ICAgICBzdHJpbmdBdHRyOwogICAgIFtWOE1lYXN1cmVBcz1UZXN0RmVhdHVyZV0gYXR0cmlidXRl
IFRlc3RPYmogdGVzdE9iakF0dHI7CiAKICAgICAvLyBXS191Y2ZpcnN0LCBXS19sY2ZpcnN0IGV4
Y2VwdGlvbmFsIGNhc2VzLgpAQCAtNzYsNyArODQsNyBAQCBlbnVtIFRlc3RFbnVtVHlwZSB7ICIi
LCAiRW51bVZhbHVlMSIsICJFbnVtVmFsdWUyIiwgIkVudW1WYWx1ZTMiIH07CiAgICAgbG9uZyAg
ICBsb25nTWV0aG9kKCk7CiAgICAgbG9uZyAgICBsb25nTWV0aG9kV2l0aEFyZ3MoaW4gbG9uZyBs
b25nQXJnLCBpbiBET01TdHJpbmcgc3RyQXJnLCBpbiBUZXN0T2JqIG9iakFyZyk7CiAgICAgW1Y4
TWVhc3VyZUFzPVRlc3RGZWF0dXJlXSBUZXN0T2JqIG9iak1ldGhvZCgpOwotICAgIFRlc3RPYmog
b2JqTWV0aG9kV2l0aEFyZ3MoaW4gbG9uZyBsb25nQXJnLCBpbiBET01TdHJpbmcgc3RyQXJnLCBp
biBUZXN0T2JqIG9iakFyZyk7CisgICAgVGVzdE9iaiBvYmpNZXRob2RXaXRoQXJncyhpbiBsb25n
IGxvbmdBcmcsIGluIFRZUEVERUZfU1RSSU5HIHN0ckFyZywgaW4gVGVzdE9iaiBvYmpBcmcpOwog
CiAgICAgdm9pZCBtZXRob2RXaXRoU2VxdWVuY2VBcmcoaW4gc2VxdWVuY2U8U2NyaXB0UHJvZmls
ZT4gc2VxdWVuY2VBcmcpOwogICAgIHNlcXVlbmNlPFNjcmlwdFByb2ZpbGU+IG1ldGhvZFJldHVy
bmluZ1NlcXVlbmNlKGluIGxvbmcgbG9uZ0FyZyk7CkBAIC05Miw3ICsxMDAsNyBAQCBlbnVtIFRl
c3RFbnVtVHlwZSB7ICIiLCAiRW51bVZhbHVlMSIsICJFbnVtVmFsdWUyIiwgIkVudW1WYWx1ZTMi
IH07CiAgICAgYXR0cmlidXRlIGxvbmcgYXR0cldpdGhHZXR0ZXJFeGNlcHRpb24gZ2V0dGVyIHJh
aXNlcyhET01FeGNlcHRpb24pOwogICAgIGF0dHJpYnV0ZSBsb25nIGF0dHJXaXRoU2V0dGVyRXhj
ZXB0aW9uIHNldHRlciByYWlzZXMoRE9NRXhjZXB0aW9uKTsKICAgICBhdHRyaWJ1dGUgRE9NU3Ry
aW5nIHN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uIGdldHRlciByYWlzZXMoRE9NRXhjZXB0
aW9uKTsKLSAgICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0
aW9uIHNldHRlciByYWlzZXMoRE9NRXhjZXB0aW9uKTsKKyAgICBhdHRyaWJ1dGUgVFlQRURFRl9T
VFJJTkcgc3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24gc2V0dGVyIHJhaXNlcyhET01FeGNl
cHRpb24pOwogCiAgICAgLy8gJ0N1c3RvbScgZXh0ZW5kZWQgYXR0cmlidXRlCiAgICAgW0N1c3Rv
bV0gYXR0cmlidXRlIGxvbmcgICAgICAgICAgICBjdXN0b21BdHRyOwpAQCAtMTAyLDkgKzExMCw5
IEBAIGVudW0gVGVzdEVudW1UeXBlIHsgIiIsICJFbnVtVmFsdWUxIiwgIkVudW1WYWx1ZTIiLCAi
RW51bVZhbHVlMyIgfTsKICAgICB2b2lkIGFkZEV2ZW50TGlzdGVuZXIoaW4gRE9NU3RyaW5nIHR5
cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBFdmVudExpc3RlbmVyIGxpc3RlbmVy
LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gW09wdGlvbmFsXSBib29sZWFuIHVzZUNh
cHR1cmUpOwotICAgIHZvaWQgcmVtb3ZlRXZlbnRMaXN0ZW5lcihpbiBET01TdHJpbmcgdHlwZSwg
CisgICAgdm9pZCByZW1vdmVFdmVudExpc3RlbmVyKGluIFRZUEVERUZfU1RSSU5HIHR5cGUsIAog
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBFdmVudExpc3RlbmVyIGxpc3RlbmVyLCAK
LSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gW09wdGlvbmFsXSBib29sZWFuIHVzZUNh
cHR1cmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBUWVBFREVGX09QVElPTkFM
X0JPT0wgdXNlQ2FwdHVyZSk7CiAKICAgICAvLyAnQ2FsbFdpdGgnIGV4dGVuZGVkIGF0dHJpYnV0
ZQogICAgIFtDYWxsV2l0aD1TY3JpcHRTdGF0ZV0gdm9pZCB3aXRoU2NyaXB0U3RhdGVWb2lkKCk7
CkBAIC0xMzgsNyArMTQ2LDcgQEAgZW51bSBUZXN0RW51bVR5cGUgeyAiIiwgIkVudW1WYWx1ZTEi
LCAiRW51bVZhbHVlMiIsICJFbnVtVmFsdWUzIiB9OwogICAgIHZvaWQgICAgbWV0aG9kV2l0aE5v
bk9wdGlvbmFsQXJnQW5kVHdvT3B0aW9uYWxBcmdzKGluIGxvbmcgbm9uT3B0LCBpbiBbT3B0aW9u
YWxdIGxvbmcgb3B0MSwgaW4gW09wdGlvbmFsXSBsb25nIG9wdDIpOwogICAgIHZvaWQgICAgbWV0
aG9kV2l0aE9wdGlvbmFsU3RyaW5nKGluIFtPcHRpb25hbF0gRE9NU3RyaW5nIHN0cik7CiAgICAg
dm9pZCAgICBtZXRob2RXaXRoT3B0aW9uYWxTdHJpbmdJc1VuZGVmaW5lZChpbiBbT3B0aW9uYWw9
RGVmYXVsdElzVW5kZWZpbmVkXSBET01TdHJpbmcgc3RyKTsKLSAgICB2b2lkICAgIG1ldGhvZFdp
dGhPcHRpb25hbFN0cmluZ0lzTnVsbFN0cmluZyhpbiBbT3B0aW9uYWw9RGVmYXVsdElzTnVsbFN0
cmluZ10gRE9NU3RyaW5nIHN0cik7CisgICAgdm9pZCAgICBtZXRob2RXaXRoT3B0aW9uYWxTdHJp
bmdJc051bGxTdHJpbmcoaW4gW09wdGlvbmFsPURlZmF1bHRJc051bGxTdHJpbmddIFRZUEVERUZf
U1RSSU5HIHN0cik7CiAKICNpZiBkZWZpbmVkKFRFU1RJTkdfVjgpIHx8IGRlZmluZWQoVEVTVElO
R19KUykKICAgICAvLyAnQ2FsbGJhY2snIGV4dGVuZGVkIGF0dHJpYnV0ZQpAQCAtMTc4LDEwICsx
ODYsMTAgQEAgZW51bSBUZXN0RW51bVR5cGUgeyAiIiwgIkVudW1WYWx1ZTEiLCAiRW51bVZhbHVl
MiIsICJFbnVtVmFsdWUzIiB9OwogICAgIHZvaWQgICAgb3ZlcmxvYWRlZE1ldGhvZChpbiBsb25n
IGxvbmdBcmcpOwogICAgIHZvaWQgICAgb3ZlcmxvYWRlZE1ldGhvZChpbiBbQ2FsbGJhY2tdIFRl
c3RDYWxsYmFjayBjYWxsYmFjayk7CiAgICAgdm9pZCAgICBvdmVybG9hZGVkTWV0aG9kKGluIERP
TVN0cmluZ0xpc3Q/IGxpc3RBcmcpOwotICAgIHZvaWQgICAgb3ZlcmxvYWRlZE1ldGhvZChpbiBE
T01TdHJpbmdbXT8gYXJyYXlBcmcpOworICAgIHZvaWQgICAgb3ZlcmxvYWRlZE1ldGhvZChpbiBU
WVBFREVGX1NUUklOR19BUlJBWT8gYXJyYXlBcmcpOwogICAgIHZvaWQgICAgb3ZlcmxvYWRlZE1l
dGhvZChpbiBUZXN0T2JqIG9iakFyZyk7CiAgICAgdm9pZCAgICBvdmVybG9hZGVkTWV0aG9kKGlu
IERPTVN0cmluZ1tdIGFycmF5QXJnKTsKLSAgICB2b2lkICAgIG92ZXJsb2FkZWRNZXRob2QoaW4g
c2VxdWVuY2U8dW5zaWduZWQgbG9uZz4gYXJyYXlBcmcpOworICAgIHZvaWQgICAgb3ZlcmxvYWRl
ZE1ldGhvZChpbiBUWVBFREVGX1VMT05HX0FSUkFZIGFycmF5QXJnKTsKICAgICB2b2lkICAgIG92
ZXJsb2FkZWRNZXRob2QoaW4gRE9NU3RyaW5nIHN0ckFyZyk7CiAjZW5kaWYKIApAQCAtMTk0LDcg
KzIwMiw3IEBAIGVudW0gVGVzdEVudW1UeXBlIHsgIiIsICJFbnVtVmFsdWUxIiwgIkVudW1WYWx1
ZTIiLCAiRW51bVZhbHVlMyIgfTsKICAgICBbQ29uZGl0aW9uYWw9Q29uZGl0aW9uMV0gc3RhdGlj
IHZvaWQgb3ZlcmxvYWRlZE1ldGhvZDEoaW4gbG9uZyBhcmcpOwogICAgIFtDb25kaXRpb25hbD1D
b25kaXRpb24xXSBzdGF0aWMgdm9pZCBvdmVybG9hZGVkTWV0aG9kMShpbiBbU3RyaWN0VHlwZUNo
ZWNraW5nXSBET01TdHJpbmcgdHlwZSk7CiAKLSAgICB2b2lkIGNsYXNzTWV0aG9kV2l0aENsYW1w
KGluIFtDbGFtcF0gdW5zaWduZWQgc2hvcnQgb2JqQXJnc1Nob3J0LCBpbiBbQ2xhbXBdIHVuc2ln
bmVkIGxvbmcgb2JqQXJnc0xvbmcpOworICAgIHZvaWQgY2xhc3NNZXRob2RXaXRoQ2xhbXAoaW4g
VFlQRURFRl9DTEFNUF9VU0hPUlQgb2JqQXJnc1Nob3J0LCBpbiBbQ2xhbXBdIHVuc2lnbmVkIGxv
bmcgb2JqQXJnc0xvbmcpOwogCiAjaWYgZGVmaW5lZChURVNUSU5HX1Y4KQogICAgIC8vICdWOEVu
YWJsZWRBdFJ1bnRpbWUnIG1ldGhvZHMgYW5kIGF0dHJpYnV0ZXMuCkBAIC0yMTksNyArMjI3LDcg
QEAgZW51bSBUZXN0RW51bVR5cGUgeyAiIiwgIkVudW1WYWx1ZTEiLCAiRW51bVZhbHVlMiIsICJF
bnVtVmFsdWUzIiB9OwogICAgIHZvaWQgbWV0aG9kV2l0aFVuc2lnbmVkTG9uZ1NlcXVlbmNlKGlu
IHNlcXVlbmNlPHVuc2lnbmVkIGxvbmc+IHVuc2lnbmVkTG9uZ1NlcXVlbmNlKTsKICNlbmRpZgog
I2lmIGRlZmluZWQoVEVTVElOR19WOCkgfHwgZGVmaW5lZChURVNUSU5HX0pTKQotICAgIERPTVN0
cmluZ1tdIHN0cmluZ0FycmF5RnVuY3Rpb24oaW4gRE9NU3RyaW5nW10gdmFsdWVzKSByYWlzZXMo
RE9NRXhjZXB0aW9uKTsKKyAgICBUWVBFREVGX1NUUklOR1tdIHN0cmluZ0FycmF5RnVuY3Rpb24o
aW4gVFlQRURFRl9TVFJJTkdfQVJSQVkgdmFsdWVzKSByYWlzZXMoRE9NRXhjZXB0aW9uKTsKICAg
ICBET01TdHJpbmdMaXN0IGRvbVN0cmluZ0xpc3RGdW5jdGlvbihpbiBET01TdHJpbmdMaXN0IHZh
bHVlcykgcmFpc2VzKERPTUV4Y2VwdGlvbik7CiAjZW5kaWYKIApAQCAtMjUxLDcgKzI1OSw3IEBA
IGVudW0gVGVzdEVudW1UeXBlIHsgIiIsICJFbnVtVmFsdWUxIiwgIkVudW1WYWx1ZTIiLCAiRW51
bVZhbHVlMyIgfTsKIAogICAgIC8vIENoZWNrIGNvbnN0YW50cyBhbmQgZW51bXMuCiAgICAgY29u
c3QgdW5zaWduZWQgc2hvcnQgQ09OU1RfVkFMVUVfMCA9IDA7Ci0gICAgY29uc3QgdW5zaWduZWQg
c2hvcnQgQ09OU1RfVkFMVUVfMSA9IDE7CisgICAgY29uc3QgVFlQRURFRl9VU0hPUlQgQ09OU1Rf
VkFMVUVfMSA9IDE7CiAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ09OU1RfVkFMVUVfMiA9IDI7
CiAgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ09OU1RfVkFMVUVfNCA9IDQ7CiAgICAgY29uc3Qg
dW5zaWduZWQgc2hvcnQgQ09OU1RfVkFMVUVfOCA9IDg7Cg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>187006</attachid>
            <date>2013-02-07 00:37:01 -0800</date>
            <delta_ts>2013-02-13 10:11:01 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52340-20130207123336.patch</filename>
            <type>text/plain</type>
            <size>19271</size>
            <attacher name="Andrey Adaikin">aandrey</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQxNTc5CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggZWE5ZjQxYTFmYjRhYWVm
NDk3NWUxNGQ0YTYzNTc3NDUwMmJhNWU2Ni4uOTAxZGZmYjdmNDIxOTliN2NkZjViYzg1ZDVmNTll
OWU1NjUzYmIzMSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDI4IEBACisyMDEzLTAyLTA2ICBBbmRy
ZXkgQWRhaWtpbiAgPGFhbmRyZXlAY2hyb21pdW0ub3JnPgorCisgICAgICAgIExvb2sgaW50byBw
b3NzaWJpbGl0aWVzIG9mIHR5cGVkZWYgaW4gd2Via2l0IGlkbCBmaWxlcworICAgICAgICBodHRw
czovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTIzNDAKKworICAgICAgICBSZXZp
ZXdlZCBieSBOT0JPRFkgKE9PUFMhKS4KKworICAgICAgICBBZGQgdHlwZWRlZiBzdXBwb3J0IGZv
ciBXZWJLaXQgSURMIHBhcnNlci4KKyAgICAgICAgRHJpdmUgYnk6IGZpeGVkIGEgYnVnIG9mIGdl
bmVyYXRpbmcgInVucmVzdHJpY3RlZGZsb2F0IiB3aXRob3V0IGEgc3BhY2UuCisKKyAgICAgICAg
KiBiaW5kaW5ncy9zY3JpcHRzL0lETFBhcnNlci5wbToKKyAgICAgICAgKGFzc2VydE5vRXh0ZW5k
ZWRBdHRyaWJ1dGVzSW5UeXBlZGVmKToKKyAgICAgICAgKHBhcnNlVHlwZWRlZik6CisgICAgICAg
IChwYXJzZUF0dHJpYnV0ZVJlc3QpOgorICAgICAgICAocGFyc2VPcHRpb25hbE9yUmVxdWlyZWRB
cmd1bWVudCk6CisgICAgICAgIChwYXJzZUV4dGVuZGVkVHlwZSk6CisgICAgICAgIChwYXJzZU5v
bkFueVR5cGUpOgorICAgICAgICAocGFyc2VVbnJlc3RyaWN0ZWRGbG9hdFR5cGUpOgorICAgICAg
ICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0Q2FsbGJhY2suaWRsOgorICAgICAgICAqIGJp
bmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0SW50ZXJmYWNlLmlkbDoKKyAgICAgICAgKiBiaW5kaW5n
cy9zY3JpcHRzL3Rlc3QvVGVzdE5hbWVkQ29uc3RydWN0b3IuaWRsOgorICAgICAgICAqIGJpbmRp
bmdzL3NjcmlwdHMvdGVzdC9UZXN0T2JqLmlkbDoKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRz
L3Rlc3QvVGVzdFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZUludGVyZmFjZS5pZGw6CisgICAgICAgICAg
IFJlcGxhY2VkIHNvbWUgdHlwZXMgd2l0aCB0eXBlZGVmcy4KKwogMjAxMy0wMi0wMSAgUGF2ZWwg
RmVsZG1hbiAgPHBmZWxkbWFuQGNocm9taXVtLm9yZz4KIAogICAgICAgICBXZWIgSW5zcGVjdG9y
OiBGb2xsb3cgdXAgdG8gcjE0MTI2MDogZml4aW5nIHJlbmFtZWQgc3R5bGUuCmRpZmYgLS1naXQg
YS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL0lETFBhcnNlci5wbSBiL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvSURMUGFyc2VyLnBtCmluZGV4IDZhZThiOWUwZGQyY2Y5
ODI4ODE4Y2EyMWJiN2ViZGIwNzYyOTYyNmMuLmRiZjkzM2I1ZTNhMTE3ZjI3YTAwZWEyNDlkNzAx
MTE4MTEwNDI1MWIgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMv
SURMUGFyc2VyLnBtCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvSURMUGFy
c2VyLnBtCkBAIC05OCw2ICs5OCwxNSBAQCBzdHJ1Y3QoIFRva2VuID0+IHsKICAgICB2YWx1ZSA9
PiAnJCcgIyB2YWx1ZSBvZiB0b2tlbgogfSk7CiAKKyMgVXNlZCB0byByZXByZXNlbnQgYSB0eXBl
IHByZWZpeGVkIHdpdGggYW4gKG9wdGlvbmFsKSBFeHRlbmRlZEF0dHJpYnV0ZUxpc3QKK3N0cnVj
dCggRXh0ZW5kZWRUeXBlID0+IHsKKyAgICBleHRlbmRlZEF0dHJpYnV0ZXMgPT4gJyQnLCAjIEV4
dGVuZGVkIGF0dHJpYnV0ZXMgKG1heWJlIGVtcHR5KQorICAgIHR5cGUgPT4gJyQnLCAjIFR5cGUg
b2YgZGF0YQorfSk7CisKKyMgTWFwcyAndHlwZWRlZiBuYW1lJyAtPiBFeHRlbmRlZFR5cGUKK215
ICV0eXBlZGVmcyA9ICgpOworCiBzdWIgbmV3IHsKICAgICBteSAkY2xhc3MgPSBzaGlmdDsKIApA
QCAtMTQ5LDYgKzE1OCwxOSBAQCBzdWIgYXNzZXJ0VW5leHBlY3RlZFRva2VuCiAgICAgZGllICRt
c2c7CiB9CiAKK3N1YiBhc3NlcnROb0V4dGVuZGVkQXR0cmlidXRlc0luVHlwZWRlZgoreworICAg
IG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkbGluZSA9
IHNoaWZ0OworICAgIG15ICR0eXBlZGVmID0gJHR5cGVkZWZzeyRuYW1lfTsKKyAgICBteSAkbXNn
ID0gIlVuZXhwZWN0ZWQgZXh0ZW5kZWRBdHRyaWJ1dGVMaXN0IGluIHR5cGVkZWYgXCIkbmFtZVwi
IGF0ICIgLiAkc2VsZi0+e0xpbmV9OworICAgIGlmIChkZWZpbmVkICgkbGluZSkpIHsKKyAgICAg
ICAgJG1zZyAuPSAiIElETFBhcnNlci5wbToiIC4gJGxpbmU7CisgICAgfQorICAgIGRpZSAkbXNn
IGlmICV7JHR5cGVkZWYtPmV4dGVuZGVkQXR0cmlidXRlcygpfTsKK30KKwogc3ViIFBhcnNlCiB7
CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKQEAgLTcyNSwxNSArNzQ3LDE4IEBAIHN1YiBwYXJzZUNh
bGxiYWNrUmVzdAogc3ViIHBhcnNlVHlwZWRlZgogewogICAgIG15ICRzZWxmID0gc2hpZnQ7Ci0g
ICAgbXkgJGV4dGVuZGVkQXR0cmlidXRlTGlzdCA9IHNoaWZ0OworICAgIG15ICRleHRlbmRlZEF0
dHJpYnV0ZUxpc3QgPSBzaGlmdDsgIyBpZ25vcmVkOiBFeHRlbmRlZCBhdHRyaWJ1dGVzIGFyZSBu
b3QgYXBwbGljYWJsZSB0byB0eXBlZGVmcyB0aGVtc2VsdmVzCiAKICAgICBteSAkbmV4dCA9ICRz
ZWxmLT5uZXh0VG9rZW4oKTsKICAgICBpZiAoJG5leHQtPnZhbHVlKCkgZXEgInR5cGVkZWYiKSB7
CiAgICAgICAgICRzZWxmLT5hc3NlcnRUb2tlblZhbHVlKCRzZWxmLT5nZXRUb2tlbigpLCAidHlw
ZWRlZiIsIF9fTElORV9fKTsKLSAgICAgICAgJHNlbGYtPnBhcnNlRXh0ZW5kZWRBdHRyaWJ1dGVM
aXN0KCk7Ci0gICAgICAgICRzZWxmLT5wYXJzZVR5cGUoKTsKLSAgICAgICAgJHNlbGYtPmFzc2Vy
dFRva2VuVHlwZSgkc2VsZi0+Z2V0VG9rZW4oKSwgSWRlbnRpZmllclRva2VuKTsKKyAgICAgICAg
bXkgJGV4dGVuZGVkVHlwZSA9ICRzZWxmLT5wYXJzZVR5cGVPckV4dGVuZGVkVHlwZSgpOworICAg
ICAgICBteSAkbmFtZVRva2VuID0gJHNlbGYtPmdldFRva2VuKCk7CisgICAgICAgICRzZWxmLT5h
c3NlcnRUb2tlblR5cGUoJG5hbWVUb2tlbiwgSWRlbnRpZmllclRva2VuKTsKICAgICAgICAgJHNl
bGYtPmFzc2VydFRva2VuVmFsdWUoJHNlbGYtPmdldFRva2VuKCksICI7IiwgX19MSU5FX18pOwor
ICAgICAgICBteSAkbmFtZSA9ICRuYW1lVG9rZW4tPnZhbHVlKCk7CisgICAgICAgIGRpZSAidHlw
ZWRlZiByZWRlZmluaXRpb24gZm9yICIgLiAkbmFtZSAuICIgYXQgIiAuICRzZWxmLT57TGluZX0g
aWYgZXhpc3RzICR0eXBlZGVmc3skbmFtZX07CisgICAgICAgICR0eXBlZGVmc3skbmFtZX0gPSAk
ZXh0ZW5kZWRUeXBlOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgICRzZWxmLT5hc3NlcnRV
bmV4cGVjdGVkVG9rZW4oJG5leHQtPnZhbHVlKCksIF9fTElORV9fKTsKQEAgLTEwMzgsNyArMTA2
Myw5IEBAIHN1YiBwYXJzZUF0dHJpYnV0ZVJlc3QKICAgICAgICAgfQogICAgICAgICAkc2VsZi0+
YXNzZXJ0VG9rZW5WYWx1ZSgkc2VsZi0+Z2V0VG9rZW4oKSwgImF0dHJpYnV0ZSIsIF9fTElORV9f
KTsKICAgICAgICAgJG5ld0RhdGFOb2RlLT5zaWduYXR1cmUoZG9tU2lnbmF0dXJlLT5uZXcoKSk7
Ci0gICAgICAgICRuZXdEYXRhTm9kZS0+c2lnbmF0dXJlLT50eXBlKCRzZWxmLT5wYXJzZVR5cGUo
KSk7CisgICAgICAgIG15ICRleHRlbmRlZFR5cGUgPSAkc2VsZi0+cGFyc2VUeXBlT3JFeHRlbmRl
ZFR5cGUoJGV4dGVuZGVkQXR0cmlidXRlTGlzdCk7CisgICAgICAgICRleHRlbmRlZEF0dHJpYnV0
ZUxpc3QgPSAkZXh0ZW5kZWRUeXBlLT5leHRlbmRlZEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgJG5l
d0RhdGFOb2RlLT5zaWduYXR1cmUtPnR5cGUoJGV4dGVuZGVkVHlwZS0+dHlwZSgpKTsKICAgICAg
ICAgbXkgJHRva2VuID0gJHNlbGYtPmdldFRva2VuKCk7CiAgICAgICAgICRzZWxmLT5hc3NlcnRU
b2tlblR5cGUoJHRva2VuLCBJZGVudGlmaWVyVG9rZW4pOwogICAgICAgICAkbmV3RGF0YU5vZGUt
PnNpZ25hdHVyZS0+bmFtZSgkdG9rZW4tPnZhbHVlKCkpOwpAQCAtMTI5OCwxMiArMTMyNSwxMiBA
QCBzdWIgcGFyc2VPcHRpb25hbE9yUmVxdWlyZWRBcmd1bWVudAogICAgIG15ICRleHRlbmRlZEF0
dHJpYnV0ZUxpc3QgPSBzaGlmdDsKIAogICAgIG15ICRwYXJhbURhdGFOb2RlID0gZG9tU2lnbmF0
dXJlLT5uZXcoKTsKLSAgICAkcGFyYW1EYXRhTm9kZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzKCRleHRl
bmRlZEF0dHJpYnV0ZUxpc3QpOwotCiAgICAgbXkgJG5leHQgPSAkc2VsZi0+bmV4dFRva2VuKCk7
CiAgICAgaWYgKCRuZXh0LT52YWx1ZSgpIGVxICJvcHRpb25hbCIpIHsKICAgICAgICAgJHNlbGYt
PmFzc2VydFRva2VuVmFsdWUoJHNlbGYtPmdldFRva2VuKCksICJvcHRpb25hbCIsIF9fTElORV9f
KTsKLSAgICAgICAgbXkgJHR5cGUgPSAkc2VsZi0+cGFyc2VUeXBlKCk7CisgICAgICAgIG15ICRl
eHRlbmRlZFR5cGUgPSAkc2VsZi0+cGFyc2VUeXBlT3JFeHRlbmRlZFR5cGUoJGV4dGVuZGVkQXR0
cmlidXRlTGlzdCk7CisgICAgICAgIG15ICR0eXBlID0gJGV4dGVuZGVkVHlwZS0+dHlwZSgpOwor
ICAgICAgICAkcGFyYW1EYXRhTm9kZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzKCRleHRlbmRlZFR5cGUt
PmV4dGVuZGVkQXR0cmlidXRlcygpKTsKICAgICAgICAgIyBkb21EYXRhTm9kZSBjYW4gb25seSBj
b25zaWRlciBsYXN0ICI/Ii4KICAgICAgICAgaWYgKCR0eXBlID1+IC9cPyQvKSB7CiAgICAgICAg
ICAgICAkcGFyYW1EYXRhTm9kZS0+aXNOdWxsYWJsZSgxKTsKQEAgLTEzMTgsNyArMTM0NSw5IEBA
IHN1YiBwYXJzZU9wdGlvbmFsT3JSZXF1aXJlZEFyZ3VtZW50CiAgICAgICAgIHJldHVybiAkcGFy
YW1EYXRhTm9kZTsKICAgICB9CiAgICAgaWYgKCRuZXh0LT50eXBlKCkgPT0gSWRlbnRpZmllclRv
a2VuIHx8ICRuZXh0LT52YWx1ZSgpID1+IC8kbmV4dEV4Y2VwdGlvbkZpZWxkXzEvKSB7Ci0gICAg
ICAgIG15ICR0eXBlID0gJHNlbGYtPnBhcnNlVHlwZSgpOworICAgICAgICBteSAkZXh0ZW5kZWRU
eXBlID0gJHNlbGYtPnBhcnNlVHlwZU9yRXh0ZW5kZWRUeXBlKCRleHRlbmRlZEF0dHJpYnV0ZUxp
c3QpOworICAgICAgICBteSAkdHlwZSA9ICRleHRlbmRlZFR5cGUtPnR5cGUoKTsKKyAgICAgICAg
JHBhcmFtRGF0YU5vZGUtPmV4dGVuZGVkQXR0cmlidXRlcygkZXh0ZW5kZWRUeXBlLT5leHRlbmRl
ZEF0dHJpYnV0ZXMoKSk7CiAgICAgICAgICMgZG9tRGF0YU5vZGUgY2FuIG9ubHkgY29uc2lkZXIg
bGFzdCAiPyIuCiAgICAgICAgIGlmICgkdHlwZSA9fiAvXD8kLykgewogICAgICAgICAgICAgJHBh
cmFtRGF0YU5vZGUtPmlzTnVsbGFibGUoMSk7CkBAIC0xNjQyLDYgKzE2NzEsMzQgQEAgc3ViIHBh
cnNlQXJndW1lbnROYW1lS2V5d29yZAogICAgICRzZWxmLT5hc3NlcnRVbmV4cGVjdGVkVG9rZW4o
JG5leHQtPnZhbHVlKCksIF9fTElORV9fKTsKIH0KIAorc3ViIHBhcnNlVHlwZU9yRXh0ZW5kZWRU
eXBlCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBteSAkZXh0ZW5kZWRBdHRyaWJ1dGVM
aXN0ID0gc2hpZnQ7CisKKyAgICBpZiAoIWRlZmluZWQoJGV4dGVuZGVkQXR0cmlidXRlTGlzdCkg
b3IgISV7JGV4dGVuZGVkQXR0cmlidXRlTGlzdH0pIHsKKyAgICAgICAgJGV4dGVuZGVkQXR0cmli
dXRlTGlzdCA9ICRzZWxmLT5wYXJzZUV4dGVuZGVkQXR0cmlidXRlTGlzdEFsbG93RW1wdHkoKTsK
KyAgICB9CisKKyAgICBteSAkcmVzdWx0ID0gRXh0ZW5kZWRUeXBlLT5uZXcoKTsKKyAgICAkcmVz
dWx0LT5leHRlbmRlZEF0dHJpYnV0ZXMoJGV4dGVuZGVkQXR0cmlidXRlTGlzdCk7CisKKyAgICBt
eSAkbmV4dCA9ICRzZWxmLT5uZXh0VG9rZW4oKTsKKyAgICBpZiAoZXhpc3RzICR0eXBlZGVmc3sk
bmV4dC0+dmFsdWUoKX0pIHsKKyAgICAgICAgJHNlbGYtPmFzc2VydFRva2VuVHlwZSgkc2VsZi0+
Z2V0VG9rZW4oKSwgSWRlbnRpZmllclRva2VuKTsKKyAgICAgICAgbXkgJHR5cGVkZWYgPSAkdHlw
ZWRlZnN7JG5leHQtPnZhbHVlKCl9OworICAgICAgICBpZiAoJXskcmVzdWx0LT5leHRlbmRlZEF0
dHJpYnV0ZXMoKX0pIHsKKyAgICAgICAgICAgICRzZWxmLT5hc3NlcnROb0V4dGVuZGVkQXR0cmli
dXRlc0luVHlwZWRlZigkbmV4dC0+dmFsdWUoKSwgX19MSU5FX18pOworICAgICAgICB9IGVsc2Ug
eworICAgICAgICAgICAgJHJlc3VsdC0+ZXh0ZW5kZWRBdHRyaWJ1dGVzKCR0eXBlZGVmLT5leHRl
bmRlZEF0dHJpYnV0ZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgJHJlc3VsdC0+dHlwZSgkdHlw
ZWRlZi0+dHlwZSgpIC4gJHNlbGYtPnBhcnNlVHlwZVN1ZmZpeCgpKTsKKyAgICB9IGVsc2Ugewor
ICAgICAgICAkcmVzdWx0LT50eXBlKCRzZWxmLT5wYXJzZVR5cGUoKSk7CisgICAgfQorICAgIHJl
dHVybiAkcmVzdWx0OworfQorCiBzdWIgcGFyc2VUeXBlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlm
dDsKQEAgLTE3MjUsNiArMTc4MiwxMiBAQCBzdWIgcGFyc2VOb25BbnlUeXBlCiB7CiAgICAgbXkg
JHNlbGYgPSBzaGlmdDsKICAgICBteSAkbmV4dCA9ICRzZWxmLT5uZXh0VG9rZW4oKTsKKworICAg
IGlmIChleGlzdHMgJHR5cGVkZWZzeyRuZXh0LT52YWx1ZSgpfSkgeworICAgICAgICAkc2VsZi0+
YXNzZXJ0VG9rZW5UeXBlKCRzZWxmLT5nZXRUb2tlbigpLCBJZGVudGlmaWVyVG9rZW4pOworICAg
ICAgICAkc2VsZi0+YXNzZXJ0Tm9FeHRlbmRlZEF0dHJpYnV0ZXNJblR5cGVkZWYoJG5leHQtPnZh
bHVlKCksIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuICR0eXBlZGVmc3skbmV4dC0+dmFsdWUo
KX0tPnR5cGUoKSAuICRzZWxmLT5wYXJzZVR5cGVTdWZmaXgoKTsKKyAgICB9CiAgICAgaWYgKCRu
ZXh0LT52YWx1ZSgpID1+IC8kbmV4dE5vbkFueVR5cGVfMS8pIHsKICAgICAgICAgcmV0dXJuICRz
ZWxmLT5wYXJzZVByaW1pdGl2ZVR5cGUoKSAuICRzZWxmLT5wYXJzZVR5cGVTdWZmaXgoKTsKICAg
ICB9CkBAIC0xODAzLDcgKzE4NjYsNyBAQCBzdWIgcGFyc2VVbnJlc3RyaWN0ZWRGbG9hdFR5cGUK
ICAgICBteSAkbmV4dCA9ICRzZWxmLT5uZXh0VG9rZW4oKTsKICAgICBpZiAoJG5leHQtPnZhbHVl
KCkgZXEgInVucmVzdHJpY3RlZCIpIHsKICAgICAgICAgJHNlbGYtPmFzc2VydFRva2VuVmFsdWUo
JHNlbGYtPmdldFRva2VuKCksICJ1bnJlc3RyaWN0ZWQiLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJl
dHVybiAidW5yZXN0cmljdGVkIiAuICRzZWxmLT5wYXJzZUZsb2F0VHlwZSgpOworICAgICAgICBy
ZXR1cm4gInVucmVzdHJpY3RlZCAiIC4gJHNlbGYtPnBhcnNlRmxvYXRUeXBlKCk7CiAgICAgfQog
ICAgIGlmICgkbmV4dC0+dmFsdWUoKSA9fiAvJG5leHRVbnJlc3RyaWN0ZWRGbG9hdFR5cGVfMS8p
IHsKICAgICAgICAgcmV0dXJuICRzZWxmLT5wYXJzZUZsb2F0VHlwZSgpOwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RDYWxsYmFjay5pZGwgYi9T
b3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdENhbGxiYWNrLmlkbAppbmRl
eCBlZDE5NDQ3OTc1NTBkODZlMjA1ZDVlN2Y1OTI1MDhiMTE5YjBlZjk3Li4zODYxM2Q3YjRlZTM5
YzI4YTQ2NjVmZGMxNzViZDFhODdiZGNhZmM1IDEwMDY0NAotLS0gYS9Tb3VyY2UvV2ViQ29yZS9i
aW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdENhbGxiYWNrLmlkbAorKysgYi9Tb3VyY2UvV2ViQ29y
ZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdENhbGxiYWNrLmlkbApAQCAtMjgsMTMgKzI4LDE2
IEBACiAKIC8vIFRoaXMgSURMIGZpbGUgaXMgZm9yIHRlc3RpbmcgdGhlIGJpbmRpbmdzIGNvZGUg
Z2VuZXJhdG9yIHdpdGggYW4gaW50ZXJmYWNlCiAvLyB0aGF0IGhhcyB0aGUgIkNhbGxiYWNrIiBh
dHRyaWJ1dGUgYW5kIGZvciB0cmFja2luZyBjaGFuZ2VzIGluIGl0cyBvdXB1dC4KKwordHlwZWRl
ZiBDbGFzczIgVFlQRURFRl9DTEFTUzI7CisKIFsKICAgICBDb25kaXRpb25hbD1TUUxfREFUQUJB
U0UsCiAgICAgQ2FsbGJhY2sKIF0gaW50ZXJmYWNlIFRlc3RDYWxsYmFjayB7CiAgIGJvb2xlYW4g
Y2FsbGJhY2tXaXRoTm9QYXJhbSgpOwogICBib29sZWFuIGNhbGxiYWNrV2l0aENsYXNzMVBhcmFt
KGluIENsYXNzMSBjbGFzczFQYXJhbSk7Ci0gIGJvb2xlYW4gY2FsbGJhY2tXaXRoQ2xhc3MyUGFy
YW0oaW4gQ2xhc3MyIGNsYXNzMlBhcmFtLCBpbiBET01TdHJpbmcgc3RyQXJnKTsKKyAgYm9vbGVh
biBjYWxsYmFja1dpdGhDbGFzczJQYXJhbShpbiBUWVBFREVGX0NMQVNTMiBjbGFzczJQYXJhbSwg
aW4gRE9NU3RyaW5nIHN0ckFyZyk7CiAgIGxvbmcgY2FsbGJhY2tXaXRoTm9uQm9vbFJldHVyblR5
cGUoaW4gQ2xhc3MzIGNsYXNzM1BhcmFtKTsKICAgW0N1c3RvbV0gbG9uZyBjdXN0b21DYWxsYmFj
ayhpbiBDbGFzczUgY2xhc3M1UGFyYW0sIGluIENsYXNzNiBjbGFzczZQYXJhbSk7CiAgIGJvb2xl
YW4gY2FsbGJhY2tXaXRoU3RyaW5nTGlzdChpbiBET01TdHJpbmdMaXN0IGxpc3RQYXJhbSk7CmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdEludGVy
ZmFjZS5pZGwgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdEludGVy
ZmFjZS5pZGwKaW5kZXggZjQwOWU4NDFkNzBjNGYzN2NmNTU4YThmYTY2NzU0ZjRlYWFmZTEzNi4u
YmFhZDMxMjIyZjM3NGI0ZjM5ZDMxZWZmOTNhOWE0NWFhYzAzMzQ3MCAxMDA2NDQKLS0tIGEvU291
cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RJbnRlcmZhY2UuaWRsCisrKyBi
L1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0SW50ZXJmYWNlLmlkbApA
QCAtMjgsMTIgKzI4LDE1IEBACiAKIC8vIFRoaXMgSURMIGZpbGUgaXMgZm9yIHRlc3RpbmcgdGhl
IGJpbmRpbmdzIGNvZGUgZ2VuZXJhdG9yIGFuZCBmb3IgdHJhY2tpbmcKIC8vIGNoYW5nZXMgaW4g
aXRzIG91cHV0LgorCit0eXBlZGVmIFtPcHRpb25hbD1EZWZhdWx0SXNVbmRlZmluZWRdIERPTVN0
cmluZyBPUFRJT05BTF9TVFJJTkc7CisKIFsKICAgICBBY3RpdmVET01PYmplY3QsCiAgICAgQ3Vz
dG9tTmFtZWRTZXR0ZXIsCiAgICAgQ29uZGl0aW9uYWw9Q29uZGl0aW9uMXxDb25kaXRpb24yLAog
ICAgIENhbGxXaXRoPVNjcmlwdEV4ZWN1dGlvbkNvbnRleHQsCi0gICAgQ29uc3RydWN0b3IoaW4g
RE9NU3RyaW5nIHN0cjEsIGluIFtPcHRpb25hbD1EZWZhdWx0SXNVbmRlZmluZWRdIERPTVN0cmlu
ZyBzdHIyKSwKKyAgICBDb25zdHJ1Y3RvcihpbiBET01TdHJpbmcgc3RyMSwgaW4gT1BUSU9OQUxf
U1RSSU5HIHN0cjIpLAogICAgIENvbnN0cnVjdG9yUmFpc2VzRXhjZXB0aW9uLAogICAgIENvbnN0
cnVjdG9yQ29uZGl0aW9uYWw9VEVTVF9JTlRFUkZBQ0UKIF0gaW50ZXJmYWNlIFRlc3RJbnRlcmZh
Y2UgewpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rl
c3ROYW1lZENvbnN0cnVjdG9yLmlkbCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMv
dGVzdC9UZXN0TmFtZWRDb25zdHJ1Y3Rvci5pZGwKaW5kZXggOTk4ZWZiNTU5ODMxZjRkZTQzMmI0
ZTQ1NjMzMzhmMDc2ZmZkOTVhOS4uZTUzMzUwMmEyOTU2OGYzOTQ1NTc1ODc2MWU1Njc3NWQ0ZGRl
Yjg5MCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rl
c3ROYW1lZENvbnN0cnVjdG9yLmlkbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3Jp
cHRzL3Rlc3QvVGVzdE5hbWVkQ29uc3RydWN0b3IuaWRsCkBAIC0yOCw5ICsyOCwxMiBAQAogCiAv
LyBUaGlzIElETCBmaWxlIGlzIGZvciB0ZXN0aW5nIHRoZSBiaW5kaW5ncyBjb2RlIGdlbmVyYXRv
ciBhbmQgZm9yIHRyYWNraW5nCiAvLyBjaGFuZ2VzIGluIGl0cyBvdXB1dC4KKwordHlwZWRlZiBb
T3B0aW9uYWw9RGVmYXVsdElzVW5kZWZpbmVkXSBET01TdHJpbmcgT1BUSU9OQUxfU1RSSU5HOwor
CiBbCiAgICAgQWN0aXZlRE9NT2JqZWN0LAotICAgIE5hbWVkQ29uc3RydWN0b3I9QXVkaW8oaW4g
RE9NU3RyaW5nIHN0cjEsIGluIFtPcHRpb25hbD1EZWZhdWx0SXNVbmRlZmluZWRdIERPTVN0cmlu
ZyBzdHIyLCBpbiBbT3B0aW9uYWw9RGVmYXVsdElzTnVsbFN0cmluZ10gRE9NU3RyaW5nIHN0cjMp
LAorICAgIE5hbWVkQ29uc3RydWN0b3I9QXVkaW8oaW4gRE9NU3RyaW5nIHN0cjEsIGluIE9QVElP
TkFMX1NUUklORyBzdHIyLCBpbiBbT3B0aW9uYWw9RGVmYXVsdElzTnVsbFN0cmluZ10gRE9NU3Ry
aW5nIHN0cjMpLAogICAgIENvbnN0cnVjdG9yUmFpc2VzRXhjZXB0aW9uCiBdIGludGVyZmFjZSBU
ZXN0TmFtZWRDb25zdHJ1Y3RvciB7CiB9OwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RPYmouaWRsIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L1Rlc3RPYmouaWRsCmluZGV4IGMwNjMwZTM3MmNlNmQ3ZTQwYjEyMmQ5MmNh
YmFmNmQyOTZmZmZlNDguLmM0NjI4YzU1Y2ZkMzY1YWE2NDZhNmYxNzcyODQ4NTI4Yzc2YjRiOWYg
MTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0T2Jq
LmlkbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdE9iai5p
ZGwKQEAgLTMyLDggKzMyLDE4IEBACiAKIGVudW0gVGVzdEVudW1UeXBlIHsgIiIsICJFbnVtVmFs
dWUxIiwgIkVudW1WYWx1ZTIiLCAiRW51bVZhbHVlMyIgfTsKIAordHlwZWRlZiBsb25nIGxvbmcg
VFlQRURFRl9MT05HX0xPTkc7Cit0eXBlZGVmIERPTVN0cmluZyBUWVBFREVGX1NUUklORzsKK3R5
cGVkZWYgRE9NU3RyaW5nW10gVFlQRURFRl9TVFJJTkdfQVJSQVk7Cit0eXBlZGVmIHNlcXVlbmNl
PHVuc2lnbmVkIGxvbmc+IFRZUEVERUZfVUxPTkdfQVJSQVk7Cit0eXBlZGVmIHVuc2lnbmVkIHNo
b3J0IFRZUEVERUZfVVNIT1JUOwordHlwZWRlZiBbQ2xhbXBdIHVuc2lnbmVkIHNob3J0IFRZUEVE
RUZfQ0xBTVBfVVNIT1JUOwordHlwZWRlZiBbT3B0aW9uYWxdIGJvb2xlYW4gVFlQRURFRl9PUFRJ
T05BTF9CT09MOwordHlwZWRlZiBTVkdQb2ludCBUWVBFREVGX1NWR1BPSU5UOwordHlwZWRlZiBb
Q2FsbGJhY2tdIFRlc3RDYWxsYmFjayBUWVBFREVGX1RFU1RfQ0FMTEJBQ0s7CisKIFsKLSAgICBD
b25zdHJ1Y3RvcihpbiBbQ2FsbGJhY2tdIFRlc3RDYWxsYmFjayB0ZXN0Q2FsbGJhY2spLAorICAg
IENvbnN0cnVjdG9yKGluIFRZUEVERUZfVEVTVF9DQUxMQkFDSyB0ZXN0Q2FsbGJhY2spLAogICAg
IEludGVyZmFjZU5hbWU9VGVzdE9iamVjdAogXSBpbnRlcmZhY2UgVGVzdE9iaiB7CiAgICAgLy8g
QXR0cmlidXRlcwpAQCAtNDcsOSArNTcsOSBAQCBlbnVtIFRlc3RFbnVtVHlwZSB7ICIiLCAiRW51
bVZhbHVlMSIsICJFbnVtVmFsdWUyIiwgIkVudW1WYWx1ZTMiIH07CiAgICAgYXR0cmlidXRlIHNo
b3J0ICAgICAgICAgICAgICAgICAgICBzaG9ydEF0dHI7CiAgICAgYXR0cmlidXRlIHVuc2lnbmVk
IHNob3J0ICAgICAgICAgICB1bnNpZ25lZFNob3J0QXR0cjsKICAgICBhdHRyaWJ1dGUgbG9uZyAg
ICAgICAgICAgICAgICAgICAgIGxvbmdBdHRyOwotICAgIGF0dHJpYnV0ZSBsb25nIGxvbmcgICAg
ICAgICAgICAgICAgbG9uZ0xvbmdBdHRyOworICAgIGF0dHJpYnV0ZSBUWVBFREVGX0xPTkdfTE9O
RyAgICAgICAgbG9uZ0xvbmdBdHRyOwogICAgIGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxvbmcg
ICAgICAgdW5zaWduZWRMb25nTG9uZ0F0dHI7Ci0gICAgYXR0cmlidXRlIERPTVN0cmluZyAgICAg
ICAgICAgICAgICBzdHJpbmdBdHRyOworICAgIGF0dHJpYnV0ZSBUWVBFREVGX1NUUklORyAgICAg
ICAgICAgc3RyaW5nQXR0cjsKICAgICBbVjhNZWFzdXJlQXM9VGVzdEZlYXR1cmVdIGF0dHJpYnV0
ZSBUZXN0T2JqIHRlc3RPYmpBdHRyOwogCiAgICAgLy8gV0tfdWNmaXJzdCwgV0tfbGNmaXJzdCBl
eGNlcHRpb25hbCBjYXNlcy4KQEAgLTc2LDcgKzg2LDcgQEAgZW51bSBUZXN0RW51bVR5cGUgeyAi
IiwgIkVudW1WYWx1ZTEiLCAiRW51bVZhbHVlMiIsICJFbnVtVmFsdWUzIiB9OwogICAgIGxvbmcg
ICAgbG9uZ01ldGhvZCgpOwogICAgIGxvbmcgICAgbG9uZ01ldGhvZFdpdGhBcmdzKGluIGxvbmcg
bG9uZ0FyZywgaW4gRE9NU3RyaW5nIHN0ckFyZywgaW4gVGVzdE9iaiBvYmpBcmcpOwogICAgIFtW
OE1lYXN1cmVBcz1UZXN0RmVhdHVyZV0gVGVzdE9iaiBvYmpNZXRob2QoKTsKLSAgICBUZXN0T2Jq
IG9iak1ldGhvZFdpdGhBcmdzKGluIGxvbmcgbG9uZ0FyZywgaW4gRE9NU3RyaW5nIHN0ckFyZywg
aW4gVGVzdE9iaiBvYmpBcmcpOworICAgIFRlc3RPYmogb2JqTWV0aG9kV2l0aEFyZ3MoaW4gbG9u
ZyBsb25nQXJnLCBpbiBUWVBFREVGX1NUUklORyBzdHJBcmcsIGluIFRlc3RPYmogb2JqQXJnKTsK
IAogICAgIHZvaWQgbWV0aG9kV2l0aFNlcXVlbmNlQXJnKGluIHNlcXVlbmNlPFNjcmlwdFByb2Zp
bGU+IHNlcXVlbmNlQXJnKTsKICAgICBzZXF1ZW5jZTxTY3JpcHRQcm9maWxlPiBtZXRob2RSZXR1
cm5pbmdTZXF1ZW5jZShpbiBsb25nIGxvbmdBcmcpOwpAQCAtOTIsNyArMTAyLDcgQEAgZW51bSBU
ZXN0RW51bVR5cGUgeyAiIiwgIkVudW1WYWx1ZTEiLCAiRW51bVZhbHVlMiIsICJFbnVtVmFsdWUz
IiB9OwogICAgIGF0dHJpYnV0ZSBsb25nIGF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uIGdldHRlciBy
YWlzZXMoRE9NRXhjZXB0aW9uKTsKICAgICBhdHRyaWJ1dGUgbG9uZyBhdHRyV2l0aFNldHRlckV4
Y2VwdGlvbiBzZXR0ZXIgcmFpc2VzKERPTUV4Y2VwdGlvbik7CiAgICAgYXR0cmlidXRlIERPTVN0
cmluZyBzdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbiBnZXR0ZXIgcmFpc2VzKERPTUV4Y2Vw
dGlvbik7Ci0gICAgYXR0cmlidXRlIERPTVN0cmluZyBzdHJpbmdBdHRyV2l0aFNldHRlckV4Y2Vw
dGlvbiBzZXR0ZXIgcmFpc2VzKERPTUV4Y2VwdGlvbik7CisgICAgYXR0cmlidXRlIFRZUEVERUZf
U1RSSU5HIHN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uIHNldHRlciByYWlzZXMoRE9NRXhj
ZXB0aW9uKTsKIAogICAgIC8vICdDdXN0b20nIGV4dGVuZGVkIGF0dHJpYnV0ZQogICAgIFtDdXN0
b21dIGF0dHJpYnV0ZSBsb25nICAgICAgICAgICAgY3VzdG9tQXR0cjsKQEAgLTEwMiw5ICsxMTIs
OSBAQCBlbnVtIFRlc3RFbnVtVHlwZSB7ICIiLCAiRW51bVZhbHVlMSIsICJFbnVtVmFsdWUyIiwg
IkVudW1WYWx1ZTMiIH07CiAgICAgdm9pZCBhZGRFdmVudExpc3RlbmVyKGluIERPTVN0cmluZyB0
eXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gRXZlbnRMaXN0ZW5lciBsaXN0ZW5l
ciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFtPcHRpb25hbF0gYm9vbGVhbiB1c2VD
YXB0dXJlKTsKLSAgICB2b2lkIHJlbW92ZUV2ZW50TGlzdGVuZXIoaW4gRE9NU3RyaW5nIHR5cGUs
IAorICAgIHZvaWQgcmVtb3ZlRXZlbnRMaXN0ZW5lcihpbiBUWVBFREVGX1NUUklORyB0eXBlLCAK
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwg
Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFtPcHRpb25hbF0gYm9vbGVhbiB1c2VD
YXB0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gVFlQRURFRl9PUFRJT05B
TF9CT09MIHVzZUNhcHR1cmUpOwogCiAgICAgLy8gJ0NhbGxXaXRoJyBleHRlbmRlZCBhdHRyaWJ1
dGUKICAgICBbQ2FsbFdpdGg9U2NyaXB0U3RhdGVdIHZvaWQgd2l0aFNjcmlwdFN0YXRlVm9pZCgp
OwpAQCAtMTM4LDEyICsxNDgsMTIgQEAgZW51bSBUZXN0RW51bVR5cGUgeyAiIiwgIkVudW1WYWx1
ZTEiLCAiRW51bVZhbHVlMiIsICJFbnVtVmFsdWUzIiB9OwogICAgIHZvaWQgICAgbWV0aG9kV2l0
aE5vbk9wdGlvbmFsQXJnQW5kVHdvT3B0aW9uYWxBcmdzKGluIGxvbmcgbm9uT3B0LCBpbiBbT3B0
aW9uYWxdIGxvbmcgb3B0MSwgaW4gW09wdGlvbmFsXSBsb25nIG9wdDIpOwogICAgIHZvaWQgICAg
bWV0aG9kV2l0aE9wdGlvbmFsU3RyaW5nKGluIFtPcHRpb25hbF0gRE9NU3RyaW5nIHN0cik7CiAg
ICAgdm9pZCAgICBtZXRob2RXaXRoT3B0aW9uYWxTdHJpbmdJc1VuZGVmaW5lZChpbiBbT3B0aW9u
YWw9RGVmYXVsdElzVW5kZWZpbmVkXSBET01TdHJpbmcgc3RyKTsKLSAgICB2b2lkICAgIG1ldGhv
ZFdpdGhPcHRpb25hbFN0cmluZ0lzTnVsbFN0cmluZyhpbiBbT3B0aW9uYWw9RGVmYXVsdElzTnVs
bFN0cmluZ10gRE9NU3RyaW5nIHN0cik7CisgICAgdm9pZCAgICBtZXRob2RXaXRoT3B0aW9uYWxT
dHJpbmdJc051bGxTdHJpbmcoaW4gW09wdGlvbmFsPURlZmF1bHRJc051bGxTdHJpbmddIFRZUEVE
RUZfU1RSSU5HIHN0cik7CiAKICNpZiBkZWZpbmVkKFRFU1RJTkdfVjgpIHx8IGRlZmluZWQoVEVT
VElOR19KUykKICAgICAvLyAnQ2FsbGJhY2snIGV4dGVuZGVkIGF0dHJpYnV0ZQogICAgIHZvaWQg
ICAgbWV0aG9kV2l0aENhbGxiYWNrQXJnKGluIFtDYWxsYmFja10gVGVzdENhbGxiYWNrIGNhbGxi
YWNrKTsKLSAgICB2b2lkICAgIG1ldGhvZFdpdGhOb25DYWxsYmFja0FyZ0FuZENhbGxiYWNrQXJn
KGluIGxvbmcgbm9uQ2FsbGJhY2ssIGluIFtDYWxsYmFja10gVGVzdENhbGxiYWNrIGNhbGxiYWNr
KTsKKyAgICB2b2lkICAgIG1ldGhvZFdpdGhOb25DYWxsYmFja0FyZ0FuZENhbGxiYWNrQXJnKGlu
IGxvbmcgbm9uQ2FsbGJhY2ssIGluIFRZUEVERUZfVEVTVF9DQUxMQkFDSyBjYWxsYmFjayk7CiAg
ICAgdm9pZCAgICBtZXRob2RXaXRoQ2FsbGJhY2tBbmRPcHRpb25hbEFyZyhpbiBbQ2FsbGJhY2ss
IE9wdGlvbmFsXSBUZXN0Q2FsbGJhY2sgY2FsbGJhY2spOwogI2VuZGlmCiAKQEAgLTE3OCwxMCAr
MTg4LDEwIEBAIGVudW0gVGVzdEVudW1UeXBlIHsgIiIsICJFbnVtVmFsdWUxIiwgIkVudW1WYWx1
ZTIiLCAiRW51bVZhbHVlMyIgfTsKICAgICB2b2lkICAgIG92ZXJsb2FkZWRNZXRob2QoaW4gbG9u
ZyBsb25nQXJnKTsKICAgICB2b2lkICAgIG92ZXJsb2FkZWRNZXRob2QoaW4gW0NhbGxiYWNrXSBU
ZXN0Q2FsbGJhY2sgY2FsbGJhY2spOwogICAgIHZvaWQgICAgb3ZlcmxvYWRlZE1ldGhvZChpbiBE
T01TdHJpbmdMaXN0PyBsaXN0QXJnKTsKLSAgICB2b2lkICAgIG92ZXJsb2FkZWRNZXRob2QoaW4g
RE9NU3RyaW5nW10/IGFycmF5QXJnKTsKKyAgICB2b2lkICAgIG92ZXJsb2FkZWRNZXRob2QoaW4g
VFlQRURFRl9TVFJJTkdfQVJSQVk/IGFycmF5QXJnKTsKICAgICB2b2lkICAgIG92ZXJsb2FkZWRN
ZXRob2QoaW4gVGVzdE9iaiBvYmpBcmcpOwogICAgIHZvaWQgICAgb3ZlcmxvYWRlZE1ldGhvZChp
biBET01TdHJpbmdbXSBhcnJheUFyZyk7Ci0gICAgdm9pZCAgICBvdmVybG9hZGVkTWV0aG9kKGlu
IHNlcXVlbmNlPHVuc2lnbmVkIGxvbmc+IGFycmF5QXJnKTsKKyAgICB2b2lkICAgIG92ZXJsb2Fk
ZWRNZXRob2QoaW4gVFlQRURFRl9VTE9OR19BUlJBWSBhcnJheUFyZyk7CiAgICAgdm9pZCAgICBv
dmVybG9hZGVkTWV0aG9kKGluIERPTVN0cmluZyBzdHJBcmcpOwogI2VuZGlmCiAKQEAgLTE5NCw3
ICsyMDQsNyBAQCBlbnVtIFRlc3RFbnVtVHlwZSB7ICIiLCAiRW51bVZhbHVlMSIsICJFbnVtVmFs
dWUyIiwgIkVudW1WYWx1ZTMiIH07CiAgICAgW0NvbmRpdGlvbmFsPUNvbmRpdGlvbjFdIHN0YXRp
YyB2b2lkIG92ZXJsb2FkZWRNZXRob2QxKGluIGxvbmcgYXJnKTsKICAgICBbQ29uZGl0aW9uYWw9
Q29uZGl0aW9uMV0gc3RhdGljIHZvaWQgb3ZlcmxvYWRlZE1ldGhvZDEoaW4gW1N0cmljdFR5cGVD
aGVja2luZ10gRE9NU3RyaW5nIHR5cGUpOwogCi0gICAgdm9pZCBjbGFzc01ldGhvZFdpdGhDbGFt
cChpbiBbQ2xhbXBdIHVuc2lnbmVkIHNob3J0IG9iakFyZ3NTaG9ydCwgaW4gW0NsYW1wXSB1bnNp
Z25lZCBsb25nIG9iakFyZ3NMb25nKTsKKyAgICB2b2lkIGNsYXNzTWV0aG9kV2l0aENsYW1wKGlu
IFRZUEVERUZfQ0xBTVBfVVNIT1JUIG9iakFyZ3NTaG9ydCwgaW4gW0NsYW1wXSB1bnNpZ25lZCBs
b25nIG9iakFyZ3NMb25nKTsKIAogI2lmIGRlZmluZWQoVEVTVElOR19WOCkKICAgICAvLyAnVjhF
bmFibGVkQXRSdW50aW1lJyBtZXRob2RzIGFuZCBhdHRyaWJ1dGVzLgpAQCAtMjE5LDcgKzIyOSw3
IEBAIGVudW0gVGVzdEVudW1UeXBlIHsgIiIsICJFbnVtVmFsdWUxIiwgIkVudW1WYWx1ZTIiLCAi
RW51bVZhbHVlMyIgfTsKICAgICB2b2lkIG1ldGhvZFdpdGhVbnNpZ25lZExvbmdTZXF1ZW5jZShp
biBzZXF1ZW5jZTx1bnNpZ25lZCBsb25nPiB1bnNpZ25lZExvbmdTZXF1ZW5jZSk7CiAjZW5kaWYK
ICNpZiBkZWZpbmVkKFRFU1RJTkdfVjgpIHx8IGRlZmluZWQoVEVTVElOR19KUykKLSAgICBET01T
dHJpbmdbXSBzdHJpbmdBcnJheUZ1bmN0aW9uKGluIERPTVN0cmluZ1tdIHZhbHVlcykgcmFpc2Vz
KERPTUV4Y2VwdGlvbik7CisgICAgVFlQRURFRl9TVFJJTkdbXSBzdHJpbmdBcnJheUZ1bmN0aW9u
KGluIFRZUEVERUZfU1RSSU5HX0FSUkFZIHZhbHVlcykgcmFpc2VzKERPTUV4Y2VwdGlvbik7CiAg
ICAgRE9NU3RyaW5nTGlzdCBkb21TdHJpbmdMaXN0RnVuY3Rpb24oaW4gRE9NU3RyaW5nTGlzdCB2
YWx1ZXMpIHJhaXNlcyhET01FeGNlcHRpb24pOwogI2VuZGlmCiAKQEAgLTIzMyw5ICsyNDMsOSBA
QCBlbnVtIFRlc3RFbnVtVHlwZSB7ICIiLCAiRW51bVZhbHVlMSIsICJFbnVtVmFsdWUyIiwgIkVu
dW1WYWx1ZTMiIH07CiAgICAgdm9pZCBjb252ZXJ0NShpbiBbVHJlYXROdWxsQXM9TnVsbFN0cmlu
ZywgVHJlYXRVbmRlZmluZWRBcz1OdWxsU3RyaW5nXSBlIHZhbHVlKTsKIAogICAgIGF0dHJpYnV0
ZSBTVkdQb2ludCBtdXRhYmxlUG9pbnQ7Ci0gICAgW0ltbXV0YWJsZV0gYXR0cmlidXRlIFNWR1Bv
aW50IGltbXV0YWJsZVBvaW50OworICAgIFtJbW11dGFibGVdIGF0dHJpYnV0ZSBUWVBFREVGX1NW
R1BPSU5UIGltbXV0YWJsZVBvaW50OwogICAgIFNWR1BvaW50IG11dGFibGVQb2ludEZ1bmN0aW9u
KCk7Ci0gICAgW0ltbXV0YWJsZV0gU1ZHUG9pbnQgaW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpOwor
ICAgIFtJbW11dGFibGVdIFRZUEVERUZfU1ZHUE9JTlQgaW1tdXRhYmxlUG9pbnRGdW5jdGlvbigp
OwogCiAgICAgW0ltcGxlbWVudGVkQXM9YmFuYW5hXSB2b2lkIG9yYW5nZSgpOwogICAgIFtJbXBs
ZW1lbnRlZEFzPWJsdWViZXJyeV0gYXR0cmlidXRlIGxvbmcgc3RyYXdiZXJyeTsKQEAgLTI1MSw3
ICsyNjEsNyBAQCBlbnVtIFRlc3RFbnVtVHlwZSB7ICIiLCAiRW51bVZhbHVlMSIsICJFbnVtVmFs
dWUyIiwgIkVudW1WYWx1ZTMiIH07CiAKICAgICAvLyBDaGVjayBjb25zdGFudHMgYW5kIGVudW1z
LgogICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IENPTlNUX1ZBTFVFXzAgPSAwOwotICAgIGNvbnN0
IHVuc2lnbmVkIHNob3J0IENPTlNUX1ZBTFVFXzEgPSAxOworICAgIGNvbnN0IFRZUEVERUZfVVNI
T1JUIENPTlNUX1ZBTFVFXzEgPSAxOwogICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IENPTlNUX1ZB
TFVFXzIgPSAyOwogICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IENPTlNUX1ZBTFVFXzQgPSA0Owog
ICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IENPTlNUX1ZBTFVFXzggPSA4OwpkaWZmIC0tZ2l0IGEv
U291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RTZXJpYWxpemVkU2NyaXB0
VmFsdWVJbnRlcmZhY2UuaWRsIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0
L1Rlc3RTZXJpYWxpemVkU2NyaXB0VmFsdWVJbnRlcmZhY2UuaWRsCmluZGV4IDY4N2VhYzU0Nzcx
MzU2ZjYwMTJlZTc3Nzk4YzIyY2MwMDAzODc2MmEuLjA3YmZmNGYyZTlhYmVhMmU1Yzc0ZWVjMTFi
YzA1YTFlZDZkMmI0ODEgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3Njcmlw
dHMvdGVzdC9UZXN0U2VyaWFsaXplZFNjcmlwdFZhbHVlSW50ZXJmYWNlLmlkbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVGVzdFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZUludGVyZmFjZS5pZGwKQEAgLTI1LDYgKzI1LDkgQEAKIAogLy8gVGhpcyBJREwgZmlsZSBpcyBm
b3IgdGVzdGluZyB0aGUgYmluZGluZ3MgY29kZSBnZW5lcmF0b3IgYW5kIGZvciB0cmFja2luZwog
Ly8gY2hhbmdlcyBpbiBpdHMgb3VwdXQuCisKK3R5cGVkZWYgW09wdGlvbmFsLCBUcmFuc2Zlckxp
c3Q9dHh4XSBTZXJpYWxpemVkU2NyaXB0VmFsdWUgVFlQRURFRl9TRVJJQUxJWkVEX1NDUklQVF9W
QUxVRTsKKwogWwogICAgIENvbmRpdGlvbmFsPUNvbmRpdGlvbjF8Q29uZGl0aW9uMiwKICAgICBD
b25zdHJ1Y3RvcihpbiBET01TdHJpbmcgaGVsbG8sIGluIFtUcmFuc2Zlckxpc3Q9dHJhbnNmZXJM
aXN0XSBTZXJpYWxpemVkU2NyaXB0VmFsdWUgZGF0YSwgaW4gW09wdGlvbmFsPURlZmF1bHRJc1Vu
ZGVmaW5lZF0gQXJyYXkgdHJhbnNmZXJMaXN0KSwKQEAgLTM1LDUgKzM4LDUgQEAKICAgICByZWFk
b25seSBhdHRyaWJ1dGUgTWVzc2FnZVBvcnRBcnJheSBwb3J0czsKICAgICBbQ2FjaGVkQXR0cmli
dXRlXSByZWFkb25seSBhdHRyaWJ1dGUgU2VyaWFsaXplZFNjcmlwdFZhbHVlIGNhY2hlZFJlYWRv
bmx5VmFsdWU7CiAgICAgdm9pZCBhY2NlcHRUcmFuc2Zlckxpc3QoaW4gW1RyYW5zZmVyTGlzdD10
cmFuc2Zlckxpc3RdIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSBkYXRhLCBpbiBbT3B0aW9uYWxdIEFy
cmF5IHRyYW5zZmVyTGlzdCk7Ci0gICAgdm9pZCBtdWx0aVRyYW5zZmVyTGlzdChpbiBbT3B0aW9u
YWwsIFRyYW5zZmVyTGlzdD10eF0gU2VyaWFsaXplZFNjcmlwdFZhbHVlIGZpcnN0LCBpbiBbT3B0
aW9uYWxdIEFycmF5IHR4LCBpbiBbT3B0aW9uYWwsIFRyYW5zZmVyTGlzdD10eHhdIFNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSBzZWNvbmQsIGluIFtPcHRpb25hbF0gQXJyYXkgdHh4KTsKKyAgICB2b2lk
IG11bHRpVHJhbnNmZXJMaXN0KGluIFtPcHRpb25hbCwgVHJhbnNmZXJMaXN0PXR4XSBTZXJpYWxp
emVkU2NyaXB0VmFsdWUgZmlyc3QsIGluIFtPcHRpb25hbF0gQXJyYXkgdHgsIGluIFRZUEVERUZf
U0VSSUFMSVpFRF9TQ1JJUFRfVkFMVUUgc2Vjb25kLCBpbiBbT3B0aW9uYWxdIEFycmF5IHR4eCk7
CiB9Owo=
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>188111</attachid>
            <date>2013-02-13 10:11:08 -0800</date>
            <delta_ts>2013-02-14 00:32:11 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52340-20130213220736.patch</filename>
            <type>text/plain</type>
            <size>110791</size>
            <attacher name="Andrey Adaikin">aandrey</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQyNjM1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNWNiZWQyNTQwZjhjNDMw
YjcyNGI2NDc5ZTE5YzNiODE5MzBiNGIyNi4uOGJkYWRiMWY1YjFjY2RjZGUyNGMxMmFkYzBjYjU2
NzA2ZjAxODU4NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3OSBAQAorMjAxMy0wMi0xMyAgQW5k
cmV5IEFkYWlraW4gIDxhYW5kcmV5QGNocm9taXVtLm9yZz4KKworICAgICAgICBMb29rIGludG8g
cG9zc2liaWxpdGllcyBvZiB0eXBlZGVmIGluIHdlYmtpdCBpZGwgZmlsZXMKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyMzQwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIHR5cGVkZWYgc3VwcG9ydCBm
b3IgV2ViS2l0IElETCBwYXJzZXIuCisgICAgICAgIERyaXZlIGJ5OiBmaXhlZCBhIGJ1ZyBvZiBn
ZW5lcmF0aW5nICJ1bnJlc3RyaWN0ZWRmbG9hdCIgd2l0aG91dCBhIHNwYWNlLgorCisgICAgICAg
IEFkZGVkIGEgbmV3IElETCB0ZXN0IFRlc3RUeXBlZGVmcy5pZGwuIFRoZSByZXN1bHRzIHdlcmUg
Z2VuZXJhdGVkIHdpdGhvdXQgdHlwZWRlZnMuCisKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRz
L0lETFBhcnNlci5wbToKKyAgICAgICAgKGFzc2VydE5vRXh0ZW5kZWRBdHRyaWJ1dGVzSW5UeXBl
ZGVmKToKKyAgICAgICAgKHBhcnNlRGVmaW5pdGlvbnMpOgorICAgICAgICAoYXBwbHlUeXBlZGVm
cyk6CisgICAgICAgIChhcHBseVR5cGVkZWZzRm9yU2lnbmF0dXJlKToKKyAgICAgICAgKHBhcnNl
VHlwZWRlZik6CisgICAgICAgIChwYXJzZVVucmVzdHJpY3RlZEZsb2F0VHlwZSk6CisgICAgICAg
ICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0
ZTo6V2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSk6CisgICAgICAgIChXZWJET01UZXN0VHlwZWRl
ZnM6OldlYkRPTVRlc3RUeXBlZGVmc1ByaXZhdGUpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVk
ZWZzOjpXZWJET01UZXN0VHlwZWRlZnMpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpv
cGVyYXRvcj0pOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjppbXBsKToKKyAgICAgICAg
KFdlYkRPTVRlc3RUeXBlZGVmczo6fldlYkRPTVRlc3RUeXBlZGVmcyk6CisgICAgICAgIChXZWJE
T01UZXN0VHlwZWRlZnM6OnVuc2lnbmVkTG9uZ0xvbmdBdHRyKToKKyAgICAgICAgKFdlYkRPTVRl
c3RUeXBlZGVmczo6c2V0VW5zaWduZWRMb25nTG9uZ0F0dHIpOgorICAgICAgICAoV2ViRE9NVGVz
dFR5cGVkZWZzOjppbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAgICAgICAoV2Vi
RE9NVGVzdFR5cGVkZWZzOjpzZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAg
ICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpmdW5jKToKKyAgICAgICAgKFdlYkRPTVRlc3RUeXBl
ZGVmczo6bXVsdGlUcmFuc2Zlckxpc3QpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpz
ZXRTaGFkb3cpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpudWxsYWJsZUFycmF5QXJn
KToKKyAgICAgICAgKFdlYkRPTVRlc3RUeXBlZGVmczo6aW1tdXRhYmxlUG9pbnRGdW5jdGlvbik6
CisgICAgICAgICh0b1dlYkNvcmUpOgorICAgICAgICAodG9XZWJLaXQpOgorICAgICAgICAqIGJp
bmRpbmdzL3NjcmlwdHMvdGVzdC9DUFAvV2ViRE9NVGVzdFR5cGVkZWZzLmg6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJET01UZXN0VHlwZWRlZnMpOgorICAgICAgICAq
IGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmcy5jcHA6
IEFkZGVkLgorICAgICAgICAoX1dlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUpOgorICAgICAg
ICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6a2l0KToKKyAgICAgICAgKFdlYktpdDo6Y29y
ZSk6CisgICAgICAgIChXZWJLaXQ6OndyYXBUZXN0VHlwZWRlZnMpOgorICAgICAgICAod2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2ZpbmFsaXplKToKKyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90
eXBlZGVmc19zZXRfcHJvcGVydHkpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X2dldF9wcm9wZXJ0eSk6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfY29uc3Ry
dWN0b3IpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2NsYXNzX2luaXQpOgor
ICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2luaXQpOgorICAgICAgICAod2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2Z1bmMpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX211bHRpX3RyYW5zZmVyX2xpc3QpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX3NldF9zaGFkb3cpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX251bGxh
YmxlX2FycmF5X2FyZyk6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfaW1tdXRh
YmxlX3BvaW50X2Z1bmN0aW9uKToKKyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19z
dHJpbmdfYXJyYXlfZnVuY3Rpb24pOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X2dldF91bnNpZ25lZF9sb25nX2xvbmdfYXR0cik6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3Rf
dHlwZWRlZnNfc2V0X3Vuc2lnbmVkX2xvbmdfbG9uZ19hdHRyKToKKyAgICAgICAgKHdlYmtpdF9k
b21fdGVzdF90eXBlZGVmc19nZXRfaW1tdXRhYmxlX3NlcmlhbGl6ZWRfc2NyaXB0X3ZhbHVlKToK
KyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfaW1tdXRhYmxlX3NlcmlhbGl6
ZWRfc2NyaXB0X3ZhbHVlKToKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvR09iamVj
dC9XZWJLaXRET01UZXN0VHlwZWRlZnMuaDogQWRkZWQuCisgICAgICAgIChfV2ViS2l0RE9NVGVz
dFR5cGVkZWZzKToKKyAgICAgICAgKF9XZWJLaXRET01UZXN0VHlwZWRlZnNDbGFzcyk6CisgICAg
ICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZz
UHJpdmF0ZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgICogYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L0pTL0pTVGVzdFR5cGVkZWZzLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmNvbnN0
cnVjdEpTVGVzdFR5cGVkZWZzKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29u
c3RydWN0b3I6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6
SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6ZmluaXNoQ3JlYXRpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6Z2V0T3duUHJvcGVydHlTbG90KToKKyAg
ICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmdldE93blByb3BlcnR5
RGVzY3JpcHRvcik6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9y
OjpnZXRDb25zdHJ1Y3REYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJv
dG90eXBlOjpzZWxmKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJvdG90eXBl
OjpnZXRPd25Qcm9wZXJ0eVNsb3QpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNQ
cm90b3R5cGU6OmdldE93blByb3BlcnR5RGVzY3JpcHRvcik6CisgICAgICAgIChXZWJDb3JlOjpK
U1Rlc3RUeXBlZGVmczo6SlNUZXN0VHlwZWRlZnMpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0
VHlwZWRlZnM6OmZpbmlzaENyZWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVk
ZWZzOjpjcmVhdGVQcm90b3R5cGUpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6
OmRlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6On5KU1Rlc3RUeXBl
ZGVmcyk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Z2V0T3duUHJvcGVydHlT
bG90KToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpnZXRPd25Qcm9wZXJ0eURl
c2NyaXB0b3IpOgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdM
b25nQXR0cik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0ltbXV0YWJsZVNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0NvbnN0
cnVjdG9yVGVzdFN1Yk9iaik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0NvbnN0
cnVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpwdXQpOgorICAgICAg
ICAoV2ViQ29yZTo6c2V0SlNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdMb25nQXR0cik6CisgICAg
ICAgIChXZWJDb3JlOjpzZXRKU1Rlc3RUeXBlZGVmc0ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Z2V0Q29uc3RydWN0b3Ip
OgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbkZ1bmMp
OgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk11bHRp
VHJhbnNmZXJMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OmpzVGVzdFR5cGVkZWZzUHJvdG90eXBl
RnVuY3Rpb25TZXRTaGFkb3cpOgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90
b3R5cGVGdW5jdGlvbk1ldGhvZFdpdGhTZXF1ZW5jZUFyZyk6CisgICAgICAgIChXZWJDb3JlOjpq
c1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uTnVsbGFibGVBcnJheUFyZyk6CisgICAgICAg
IChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uRnVuY1dpdGhDbGFtcCk6
CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uSW1tdXRh
YmxlUG9pbnRGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3Rv
dHlwZUZ1bmN0aW9uU3RyaW5nQXJyYXlGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjppc09i
c2VydmFibGUpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNPd25lcjo6aXNSZWFj
aGFibGVGcm9tT3BhcXVlUm9vdHMpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNP
d25lcjo6ZmluYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6dG9KUyk6CisgICAgICAgIChXZWJD
b3JlOjp0b1Rlc3RUeXBlZGVmcyk6CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pT
L0pTVGVzdFR5cGVkZWZzLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChK
U1Rlc3RUeXBlZGVmcyk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Y3JlYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpjcmVhdGVTdHJ1Y3R1cmUpOgor
ICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6OmltcGwpOgorICAgICAgICAoV2ViQ29y
ZTo6SlNUZXN0VHlwZWRlZnM6OnJlbGVhc2VJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVz
dFR5cGVkZWZzOjpyZWxlYXNlSW1wbElmTm90TnVsbCk6CisgICAgICAgIChKU1Rlc3RUeXBlZGVm
c093bmVyKToKKyAgICAgICAgKFdlYkNvcmU6OndyYXBwZXJPd25lcik6CisgICAgICAgIChXZWJD
b3JlOjp3cmFwcGVyQ29udGV4dCk6CisgICAgICAgIChKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSk6
CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZTo6Y3JlYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJvdG90eXBlOjpjcmVhdGVTdHJ1Y3R1cmUp
OgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6OkpTVGVzdFR5cGVk
ZWZzUHJvdG90eXBlKToKKyAgICAgICAgKEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IpOgorICAg
ICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6Y3JlYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmNyZWF0ZVN0cnVjdHVyZSk6
CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLmg6
IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBl
ZGVmcy5tbTogQWRkZWQuCisgICAgICAgICgtW0RPTVRlc3RUeXBlZGVmcyBkZWFsbG9jXSk6Cisg
ICAgICAgICgtW0RPTVRlc3RUeXBlZGVmcyBmaW5hbGl6ZV0pOgorICAgICAgICAoLVtET01UZXN0
VHlwZWRlZnMgdW5zaWduZWRMb25nTG9uZ0F0dHJdKToKKyAgICAgICAgKC1bRE9NVGVzdFR5cGVk
ZWZzIHNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyOl0pOgorICAgICAgICAoLVtET01UZXN0VHlwZWRl
ZnMgaW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlXSk6CisgICAgICAgICgtW0RPTVRlc3RU
eXBlZGVmcyBzZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWU6XSk6CisgICAgICAgICgt
W0RPTVRlc3RUeXBlZGVmcyBtdWx0aVRyYW5zZmVyTGlzdDp0eDpzZWNvbmQ6dHh4Ol0pOgorICAg
ICAgICAoLVtET01UZXN0VHlwZWRlZnMgc2V0U2hhZG93OmhlaWdodDpibHVyOmNvbG9yOmFscGhh
Ol0pOgorICAgICAgICAoLVtET01UZXN0VHlwZWRlZnMgaW1tdXRhYmxlUG9pbnRGdW5jdGlvbl0p
OgorICAgICAgICAoY29yZSk6CisgICAgICAgIChraXQpOgorICAgICAgICAqIGJpbmRpbmdzL3Nj
cmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBlZGVmc0ludGVybmFsLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZSk6CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RUeXBlZGVm
cy5pZGw6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RU
eXBlZGVmcy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpjaGVja1R5cGVPckRpZVRyeWluZyk6CisgICAgICAgIChUZXN0VHlwZWRlZnNWOEludGVybmFs
KToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OlY4X1VTRSk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNWOEludGVybmFsOjp1bnNpZ25lZExvbmdMb25n
QXR0ckF0dHJHZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5h
bDo6dW5zaWduZWRMb25nTG9uZ0F0dHJBdHRyU2V0dGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
c3RUeXBlZGVmc1Y4SW50ZXJuYWw6OmltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZUF0dHJH
ZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRh
YmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlQXR0clNldHRlcik6CisgICAgICAgIChXZWJDb3JlOjpU
ZXN0VHlwZWRlZnNWOEludGVybmFsOjpUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvckdldHRlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNWOEludGVybmFsOjpUZXN0VHlwZWRlZnNSZXBs
YWNlYWJsZUF0dHJTZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRl
cm5hbDo6ZnVuY0NhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50
ZXJuYWw6Om11bHRpVHJhbnNmZXJMaXN0Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VGVz
dFR5cGVkZWZzVjhJbnRlcm5hbDo6c2V0U2hhZG93Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29y
ZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6bWV0aG9kV2l0aFNlcXVlbmNlQXJnQ2FsbGJhY2sp
OgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6bnVsbGFibGVBcnJh
eUFyZ0NhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6
OmZ1bmNXaXRoQ2xhbXBDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNW
OEludGVybmFsOjppbW11dGFibGVQb2ludEZ1bmN0aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6c3RyaW5nQXJyYXlGdW5jdGlvbkNhbGxiYWNr
KToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjpjb25zdHJ1Y3RvckNhbGxiYWNr
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbmZpZ3VyZVY4VGVzdFR5cGVkZWZzVGVtcGxhdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6VjhUZXN0VHlwZWRlZnM6OkdldFJhd1RlbXBsYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjpHZXRUZW1wbGF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpWOFRlc3RUeXBlZGVmczo6SGFzSW5zdGFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6VjhU
ZXN0VHlwZWRlZnM6OmNyZWF0ZVdyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhUZXN0VHlw
ZWRlZnM6OmRlcmVmT2JqZWN0KToKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgv
VjhUZXN0VHlwZWRlZnMuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFY4
VGVzdFR5cGVkZWZzKToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjp0b05hdGl2
ZSk6CisgICAgICAgIChXZWJDb3JlOjpWOFRlc3RUeXBlZGVmczo6aW5zdGFsbFBlckNvbnRleHRQ
cm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjppbnN0YWxsUGVy
Q29udGV4dFByb3RvdHlwZVByb3BlcnRpZXMpOgorICAgICAgICAoV2ViQ29yZTo6d3JhcCk6Cisg
ICAgICAgIChXZWJDb3JlOjp0b1Y4KToKKyAgICAgICAgKFdlYkNvcmU6OnRvVjhGYXN0KToKKwog
MjAxMy0wMi0xMiAgUmFmYWVsIFdlaW5zdGVpbiAgPHJhZmFlbHdAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFtIVE1MVGVtcGxhdGVFbGVtZW50XSA8dGVtcGxhdGU+IGluc2lkZSBvZiA8aGVhZD4g
bWF5IG5vdCBjcmVhdGUgPGJvZHk+IGlmIEVPRiBpcyBoaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvSURMUGFyc2VyLnBtIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIucG0KaW5kZXggNmFlOGI5ZTBkZDJjZjk4Mjg4MThjYTIx
YmI3ZWJkYjA3NjI5NjI2Yy4uMTFkNzhhZDNjYWMzMTk2NzRkODdjMjBiYmJkOWM3MzUzZWE0Nzkz
OSAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIu
cG0KKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIucG0KQEAg
LTQ4LDcgKzQ4LDcgQEAgc3RydWN0KCBkb21JbnRlcmZhY2UgPT4gewogICAgIGZ1bmN0aW9ucyA9
PiAnQCcsICAgICMgTGlzdCBvZiAnZG9tRnVuY3Rpb24nCiAgICAgYXR0cmlidXRlcyA9PiAnQCcs
ICAgICMgTGlzdCBvZiAnZG9tQXR0cmlidXRlJyAgICAKICAgICBleHRlbmRlZEF0dHJpYnV0ZXMg
PT4gJyQnLCAjIEV4dGVuZGVkIGF0dHJpYnV0ZXMKLSAgICBjb25zdHJ1Y3RvcnMgPT4gJ0AnLCAj
IENvbnN0cnVjdG9yCisgICAgY29uc3RydWN0b3JzID0+ICdAJywgIyBDb25zdHJ1Y3RvcnMsIGxp
c3Qgb2YgJ2RvbUZ1bmN0aW9uJwogICAgIGlzRXhjZXB0aW9uID0+ICckJywgIyBVc2VkIGZvciBl
eGNlcHRpb24gaW50ZXJmYWNlcwogfSk7CiAKQEAgLTk4LDYgKzk4LDE0IEBAIHN0cnVjdCggVG9r
ZW4gPT4gewogICAgIHZhbHVlID0+ICckJyAjIHZhbHVlIG9mIHRva2VuCiB9KTsKIAorc3RydWN0
KCBUeXBlZGVmID0+IHsKKyAgICBleHRlbmRlZEF0dHJpYnV0ZXMgPT4gJyQnLCAjIEV4dGVuZGVk
IGF0dHJpYnV0ZXMKKyAgICB0eXBlID0+ICckJywgIyBUeXBlIG9mIGRhdGEKK30pOworCisjIE1h
cHMgJ3R5cGVkZWYgbmFtZScgLT4gVHlwZWRlZgorbXkgJXR5cGVkZWZzID0gKCk7CisKIHN1YiBu
ZXcgewogICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogCkBAIC0xNDksNiArMTU3LDE5IEBAIHN1YiBh
c3NlcnRVbmV4cGVjdGVkVG9rZW4KICAgICBkaWUgJG1zZzsKIH0KIAorc3ViIGFzc2VydE5vRXh0
ZW5kZWRBdHRyaWJ1dGVzSW5UeXBlZGVmCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBt
eSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRsaW5lID0gc2hpZnQ7CisgICAgbXkgJHR5cGVkZWYg
PSAkdHlwZWRlZnN7JG5hbWV9OworICAgIG15ICRtc2cgPSAiVW5leHBlY3RlZCBleHRlbmRlZEF0
dHJpYnV0ZUxpc3QgaW4gdHlwZWRlZiBcIiRuYW1lXCIgYXQgIiAuICRzZWxmLT57TGluZX07Cisg
ICAgaWYgKGRlZmluZWQgKCRsaW5lKSkgeworICAgICAgICAkbXNnIC49ICIgSURMUGFyc2VyLnBt
OiIgLiAkbGluZTsKKyAgICB9CisgICAgZGllICRtc2cgaWYgJXskdHlwZWRlZi0+ZXh0ZW5kZWRB
dHRyaWJ1dGVzKCl9OworfQorCiBzdWIgUGFyc2UKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwpA
QCAtMzIyLDkgKzM0Myw3MyBAQCBzdWIgcGFyc2VEZWZpbml0aW9ucwogICAgICAgICAgICAgcHVz
aChAZGVmaW5pdGlvbnMsICRkZWZpbml0aW9uKTsKICAgICAgICAgfQogICAgIH0KKyAgICAkc2Vs
Zi0+YXBwbHlUeXBlZGVmcyhcQGRlZmluaXRpb25zKTsKICAgICByZXR1cm4gXEBkZWZpbml0aW9u
czsKIH0KIAorc3ViIGFwcGx5VHlwZWRlZnMKK3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAg
IG15ICRkZWZpbml0aW9ucyA9IHNoaWZ0OworICAgCisgICAgaWYgKCEldHlwZWRlZnMpIHsKKyAg
ICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3JlYWNoIG15ICRkZWZpbml0aW9uIChAJGRlZmlu
aXRpb25zKSB7CisgICAgICAgIGlmIChyZWYoJGRlZmluaXRpb24pIGVxICJkb21JbnRlcmZhY2Ui
KSB7CisgICAgICAgICAgICBmb3JlYWNoIG15ICRjb25zdGFudCAoQHskZGVmaW5pdGlvbi0+Y29u
c3RhbnRzfSkgeworICAgICAgICAgICAgICAgIGlmIChleGlzdHMgJHR5cGVkZWZzeyRjb25zdGFu
dC0+dHlwZSgpfSkgeworICAgICAgICAgICAgICAgICAgICBteSAkdHlwZWRlZiA9ICR0eXBlZGVm
c3skY29uc3RhbnQtPnR5cGUoKX07CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5hc3NlcnRO
b0V4dGVuZGVkQXR0cmlidXRlc0luVHlwZWRlZigkY29uc3RhbnQtPnR5cGUoKSwgX19MSU5FX18p
OworICAgICAgICAgICAgICAgICAgICAkY29uc3RhbnQtPnR5cGUoJHR5cGVkZWYtPnR5cGUoKSk7
CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yZWFjaCBt
eSAkYXR0cmlidXRlIChAeyRkZWZpbml0aW9uLT5hdHRyaWJ1dGVzfSkgeworICAgICAgICAgICAg
ICAgICRzZWxmLT5hcHBseVR5cGVkZWZzRm9yU2lnbmF0dXJlKCRhdHRyaWJ1dGUtPnNpZ25hdHVy
ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJGZ1bmN0aW9uIChA
eyRkZWZpbml0aW9uLT5mdW5jdGlvbnN9LCBAeyRkZWZpbml0aW9uLT5jb25zdHJ1Y3RvcnN9KSB7
CisgICAgICAgICAgICAgICAgJHNlbGYtPmFwcGx5VHlwZWRlZnNGb3JTaWduYXR1cmUoJGZ1bmN0
aW9uLT5zaWduYXR1cmUoKSk7CisgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkc2lnbmF0dXJl
IChAeyRmdW5jdGlvbi0+cGFyYW1ldGVyc30pIHsKKyAgICAgICAgICAgICAgICAgICAgJHNlbGYt
PmFwcGx5VHlwZWRlZnNGb3JTaWduYXR1cmUoJHNpZ25hdHVyZSk7CisgICAgICAgICAgICAgICAg
fQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdWIgYXBwbHlUeXBlZGVm
c0ZvclNpZ25hdHVyZQoreworICAgIG15ICRzZWxmID0gc2hpZnQ7CisgICAgbXkgJHNpZ25hdHVy
ZSA9IHNoaWZ0OworCisgICAgaWYgKCFkZWZpbmVkICgkc2lnbmF0dXJlLT50eXBlKCkpKSB7Cisg
ICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBteSAkdHlwZSA9ICRzaWduYXR1cmUtPnR5cGUo
KTsKKyAgICAkdHlwZSA9fiBzL1tcP1xbXF1dKyQvL2c7CisgICAgbXkgJHR5cGVTdWZmaXggPSAk
c2lnbmF0dXJlLT50eXBlKCk7CisgICAgJHR5cGVTdWZmaXggPX4gcy9eW15cP1xbXF1dKy8vZzsK
KyAgICBpZiAoZXhpc3RzICR0eXBlZGVmc3skdHlwZX0pIHsKKyAgICAgICAgbXkgJHR5cGVkZWYg
PSAkdHlwZWRlZnN7JHR5cGV9OworICAgICAgICAkc2lnbmF0dXJlLT50eXBlKCR0eXBlZGVmLT50
eXBlKCkgLiAkdHlwZVN1ZmZpeCk7CisgICAgICAgIGNvcHlFeHRlbmRlZEF0dHJpYnV0ZXMoJHNp
Z25hdHVyZS0+ZXh0ZW5kZWRBdHRyaWJ1dGVzKCksICR0eXBlZGVmLT5leHRlbmRlZEF0dHJpYnV0
ZXMoKSk7CisgICAgfQorCisgICAgIyBIYW5kbGUgdW5pb24gdHlwZXMsIHNlcXVlbmNlcyBhbmQg
ZXRjLgorICAgIGZvcmVhY2ggbXkgJG5hbWUgKCV0eXBlZGVmcykgeworICAgICAgICBpZiAoIWV4
aXN0cyAkdHlwZWRlZnN7JG5hbWV9KSB7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9Cisg
ICAgICAgIG15ICR0eXBlZGVmID0gJHR5cGVkZWZzeyRuYW1lfTsKKyAgICAgICAgbXkgJHJlZ2V4
ID0gJ1xcYicgLiAkbmFtZSAuICdcXGInOworICAgICAgICBteSAkcmVwbGFjZW1lbnQgPSAkdHlw
ZWRlZi0+dHlwZSgpOworICAgICAgICBteSAkdHlwZSA9ICRzaWduYXR1cmUtPnR5cGUoKTsKKyAg
ICAgICAgJHR5cGUgPX4gcy8oJHJlZ2V4KS8kcmVwbGFjZW1lbnQvZzsKKyAgICAgICAgJHNpZ25h
dHVyZS0+dHlwZSgkdHlwZSk7CisgICAgfQorfQorCiBzdWIgcGFyc2VEZWZpbml0aW9uCiB7CiAg
ICAgbXkgJHNlbGYgPSBzaGlmdDsKQEAgLTcyNiwxNCArODExLDIwIEBAIHN1YiBwYXJzZVR5cGVk
ZWYKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0OwogICAgIG15ICRleHRlbmRlZEF0dHJpYnV0ZUxp
c3QgPSBzaGlmdDsKKyAgICBkaWUgIkV4dGVuZGVkIGF0dHJpYnV0ZXMgYXJlIG5vdCBhcHBsaWNh
YmxlIHRvIHR5cGVkZWZzIHRoZW1zZWx2ZXM6ICIgLiAkc2VsZi0+e0xpbmV9IGlmICV7JGV4dGVu
ZGVkQXR0cmlidXRlTGlzdH07CiAKICAgICBteSAkbmV4dCA9ICRzZWxmLT5uZXh0VG9rZW4oKTsK
ICAgICBpZiAoJG5leHQtPnZhbHVlKCkgZXEgInR5cGVkZWYiKSB7CiAgICAgICAgICRzZWxmLT5h
c3NlcnRUb2tlblZhbHVlKCRzZWxmLT5nZXRUb2tlbigpLCAidHlwZWRlZiIsIF9fTElORV9fKTsK
LSAgICAgICAgJHNlbGYtPnBhcnNlRXh0ZW5kZWRBdHRyaWJ1dGVMaXN0KCk7Ci0gICAgICAgICRz
ZWxmLT5wYXJzZVR5cGUoKTsKLSAgICAgICAgJHNlbGYtPmFzc2VydFRva2VuVHlwZSgkc2VsZi0+
Z2V0VG9rZW4oKSwgSWRlbnRpZmllclRva2VuKTsKKyAgICAgICAgbXkgJHR5cGVkZWYgPSBUeXBl
ZGVmLT5uZXcoKTsKKyAgICAgICAgJHR5cGVkZWYtPmV4dGVuZGVkQXR0cmlidXRlcygkc2VsZi0+
cGFyc2VFeHRlbmRlZEF0dHJpYnV0ZUxpc3RBbGxvd0VtcHR5KCkpOworICAgICAgICAkdHlwZWRl
Zi0+dHlwZSgkc2VsZi0+cGFyc2VUeXBlKCkpOworICAgICAgICBteSAkbmFtZVRva2VuID0gJHNl
bGYtPmdldFRva2VuKCk7CisgICAgICAgICRzZWxmLT5hc3NlcnRUb2tlblR5cGUoJG5hbWVUb2tl
biwgSWRlbnRpZmllclRva2VuKTsKICAgICAgICAgJHNlbGYtPmFzc2VydFRva2VuVmFsdWUoJHNl
bGYtPmdldFRva2VuKCksICI7IiwgX19MSU5FX18pOworICAgICAgICBteSAkbmFtZSA9ICRuYW1l
VG9rZW4tPnZhbHVlKCk7CisgICAgICAgIGRpZSAidHlwZWRlZiByZWRlZmluaXRpb24gZm9yICIg
LiAkbmFtZSAuICIgYXQgIiAuICRzZWxmLT57TGluZX0gaWYgZXhpc3RzICR0eXBlZGVmc3skbmFt
ZX07CisgICAgICAgICR0eXBlZGVmc3skbmFtZX0gPSAkdHlwZWRlZjsKICAgICAgICAgcmV0dXJu
OwogICAgIH0KICAgICAkc2VsZi0+YXNzZXJ0VW5leHBlY3RlZFRva2VuKCRuZXh0LT52YWx1ZSgp
LCBfX0xJTkVfXyk7CkBAIC0xODAzLDcgKzE4OTQsNyBAQCBzdWIgcGFyc2VVbnJlc3RyaWN0ZWRG
bG9hdFR5cGUKICAgICBteSAkbmV4dCA9ICRzZWxmLT5uZXh0VG9rZW4oKTsKICAgICBpZiAoJG5l
eHQtPnZhbHVlKCkgZXEgInVucmVzdHJpY3RlZCIpIHsKICAgICAgICAgJHNlbGYtPmFzc2VydFRv
a2VuVmFsdWUoJHNlbGYtPmdldFRva2VuKCksICJ1bnJlc3RyaWN0ZWQiLCBfX0xJTkVfXyk7Ci0g
ICAgICAgIHJldHVybiAidW5yZXN0cmljdGVkIiAuICRzZWxmLT5wYXJzZUZsb2F0VHlwZSgpOwor
ICAgICAgICByZXR1cm4gInVucmVzdHJpY3RlZCAiIC4gJHNlbGYtPnBhcnNlRmxvYXRUeXBlKCk7
CiAgICAgfQogICAgIGlmICgkbmV4dC0+dmFsdWUoKSA9fiAvJG5leHRVbnJlc3RyaWN0ZWRGbG9h
dFR5cGVfMS8pIHsKICAgICAgICAgcmV0dXJuICRzZWxmLT5wYXJzZUZsb2F0VHlwZSgpOwpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01U
ZXN0VHlwZWRlZnMuY3BwIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQ
UC9XZWJET01UZXN0VHlwZWRlZnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjU3OWRmMjI3MTQwZmE4MDdmNjMx
MDYwYzYxZjFkZWRlYjQ0ZjkwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9i
aW5kaW5ncy9zY3JpcHRzL3Rlc3QvQ1BQL1dlYkRPTVRlc3RUeXBlZGVmcy5jcHAKQEAgLTAsMCAr
MSwxNjEgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IG9wZW4gc291
cmNlIHByb2plY3QuCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGdlbmVyYXRl
LWJpbmRpbmdzLnBsLiBETyBOT1QgTU9ESUZZIQorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVl
IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1
bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNl
bnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIK
KyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0
ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv
cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsg
d2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k
YXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24s
IE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVk
ZSAiV2ViRE9NVGVzdFR5cGVkZWZzLmgiCisKKyNpbmNsdWRlICJBcnJheS5oIgorI2luY2x1ZGUg
IktVUkwuaCIKKyNpbmNsdWRlICJTVkdQb2ludC5oIgorI2luY2x1ZGUgIlNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZS5oIgorI2luY2x1ZGUgIldlYkRPTUFycmF5LmgiCisjaW5jbHVkZSAiV2ViRE9NU1ZH
UG9pbnQuaCIKKyNpbmNsdWRlICJXZWJET01TdHJpbmcuaCIKKyNpbmNsdWRlICJXZWJFeGNlcHRp
b25IYW5kbGVyLmgiCisjaW5jbHVkZSAid3RmL3RleHQvQXRvbWljU3RyaW5nLmgiCisjaW5jbHVk
ZSA8d3RmL0dldFB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworc3RydWN0IFdlYkRP
TVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSB7CisgICAgV2ViRE9NVGVz
dFR5cGVkZWZzUHJpdmF0ZShXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIG9iamVjdCA9IDApCisgICAg
ICAgIDogaW1wbChvYmplY3QpCisgICAgeworICAgIH0KKworICAgIFJlZlB0cjxXZWJDb3JlOjpU
ZXN0VHlwZWRlZnM+IGltcGw7Cit9OworCitXZWJET01UZXN0VHlwZWRlZnM6OldlYkRPTVRlc3RU
eXBlZGVmcygpCisgICAgOiBXZWJET01PYmplY3QoKQorICAgICwgbV9pbXBsKDApCit7Cit9CisK
K1dlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVkZWZzKFdlYkNvcmU6OlRlc3RUeXBl
ZGVmcyogaW1wbCkKKyAgICA6IFdlYkRPTU9iamVjdCgpCisgICAgLCBtX2ltcGwobmV3IFdlYkRP
TVRlc3RUeXBlZGVmc1ByaXZhdGUoaW1wbCkpCit7Cit9CisKK1dlYkRPTVRlc3RUeXBlZGVmczo6
V2ViRE9NVGVzdFR5cGVkZWZzKGNvbnN0IFdlYkRPTVRlc3RUeXBlZGVmcyYgY29weSkKKyAgICA6
IFdlYkRPTU9iamVjdCgpCit7CisgICAgbV9pbXBsID0gY29weS5pbXBsKCkgPyBuZXcgV2ViRE9N
VGVzdFR5cGVkZWZzUHJpdmF0ZShjb3B5LmltcGwoKSkgOiAwOworfQorCitXZWJET01UZXN0VHlw
ZWRlZnMmIFdlYkRPTVRlc3RUeXBlZGVmczo6b3BlcmF0b3I9KGNvbnN0IFdlYkRPTVRlc3RUeXBl
ZGVmcyYgY29weSkKK3sKKyAgICBkZWxldGUgbV9pbXBsOworICAgIG1faW1wbCA9IGNvcHkuaW1w
bCgpID8gbmV3IFdlYkRPTVRlc3RUeXBlZGVmc1ByaXZhdGUoY29weS5pbXBsKCkpIDogMDsKKyAg
ICByZXR1cm4gKnRoaXM7Cit9CisKK1dlYkNvcmU6OlRlc3RUeXBlZGVmcyogV2ViRE9NVGVzdFR5
cGVkZWZzOjppbXBsKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbV9pbXBsID8gV1RGOjpnZXRQdHIo
bV9pbXBsLT5pbXBsKSA6IDA7Cit9CisKK1dlYkRPTVRlc3RUeXBlZGVmczo6fldlYkRPTVRlc3RU
eXBlZGVmcygpCit7CisgICAgZGVsZXRlIG1faW1wbDsKKyAgICBtX2ltcGwgPSAwOworfQorCit1
bnNpZ25lZCBsb25nIGxvbmcgV2ViRE9NVGVzdFR5cGVkZWZzOjp1bnNpZ25lZExvbmdMb25nQXR0
cigpIGNvbnN0Cit7CisgICAgaWYgKCFpbXBsKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAg
cmV0dXJuIGltcGwoKS0+dW5zaWduZWRMb25nTG9uZ0F0dHIoKTsKK30KKwordm9pZCBXZWJET01U
ZXN0VHlwZWRlZnM6OnNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyKHVuc2lnbmVkIGxvbmcgbG9uZyBu
ZXdVbnNpZ25lZExvbmdMb25nQXR0cikKK3sKKyAgICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0
dXJuOworCisgICAgaW1wbCgpLT5zZXRVbnNpZ25lZExvbmdMb25nQXR0cihuZXdVbnNpZ25lZExv
bmdMb25nQXR0cik7Cit9CisKK1dlYkRPTVN0cmluZyBXZWJET01UZXN0VHlwZWRlZnM6OmltbXV0
YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpIGNvbnN0Cit7CisgICAgaWYgKCFpbXBsKCkpCisg
ICAgICAgIHJldHVybiBXZWJET01TdHJpbmcoKTsKKworICAgIHJldHVybiBpbXBsKCktPmltbXV0
YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpLT50b1N0cmluZygpOworfQorCit2b2lkIFdlYkRP
TVRlc3RUeXBlZGVmczo6c2V0SW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKGNvbnN0IFdl
YkRPTVN0cmluZyYgbmV3SW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKQoreworICAgIGlm
ICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbXBsKCktPnNldEltbXV0YWJsZVNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZShXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0
ZShXVEY6OlN0cmluZyhuZXdJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpKSk7Cit9CisK
K3ZvaWQgV2ViRE9NVGVzdFR5cGVkZWZzOjpmdW5jKGNvbnN0IFdlYkRPTWxvbmdbXSYgeCkKK3sK
KyAgICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW1wbCgpLT5mdW5jKHRv
V2ViQ29yZSh4KSk7Cit9CisKK3ZvaWQgV2ViRE9NVGVzdFR5cGVkZWZzOjptdWx0aVRyYW5zZmVy
TGlzdChjb25zdCBXZWJET01TdHJpbmcmIGZpcnN0LCBjb25zdCBXZWJET01BcnJheSYgdHgsIGNv
bnN0IFdlYkRPTVN0cmluZyYgc2Vjb25kLCBjb25zdCBXZWJET01BcnJheSYgdHh4KQoreworICAg
IGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbXBsKCktPm11bHRpVHJhbnNm
ZXJMaXN0KFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKFdURjo6U3RyaW5n
KGZpcnN0KSksIHRvV2ViQ29yZSh0eCksIFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6
Y3JlYXRlKFdURjo6U3RyaW5nKHNlY29uZCkpLCB0b1dlYkNvcmUodHh4KSk7Cit9CisKK3ZvaWQg
V2ViRE9NVGVzdFR5cGVkZWZzOjpzZXRTaGFkb3coZmxvYXQgd2lkdGgsIGZsb2F0IGhlaWdodCwg
ZmxvYXQgYmx1ciwgY29uc3QgV2ViRE9NU3RyaW5nJiBjb2xvciwgZmxvYXQgYWxwaGEpCit7Cisg
ICAgaWYgKCFpbXBsKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGltcGwoKS0+c2V0U2hhZG93
KHdpZHRoLCBoZWlnaHQsIGJsdXIsIGNvbG9yLCBhbHBoYSk7Cit9CisKK3ZvaWQgV2ViRE9NVGVz
dFR5cGVkZWZzOjpudWxsYWJsZUFycmF5QXJnKGNvbnN0IFdlYkRPTURPTVN0cmluZ1tdJiBhcnJh
eUFyZykKK3sKKyAgICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW1wbCgp
LT5udWxsYWJsZUFycmF5QXJnKHRvV2ViQ29yZShhcnJheUFyZykpOworfQorCitXZWJET01TVkdQ
b2ludCBXZWJET01UZXN0VHlwZWRlZnM6OmltbXV0YWJsZVBvaW50RnVuY3Rpb24oKQoreworICAg
IGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm4gV2ViRE9NU1ZHUG9pbnQoKTsKKworICAgIHJl
dHVybiB0b1dlYktpdChXVEY6OmdldFB0cihpbXBsKCktPmltbXV0YWJsZVBvaW50RnVuY3Rpb24o
KSkpOworfQorCitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIHRvV2ViQ29yZShjb25zdCBXZWJET01U
ZXN0VHlwZWRlZnMmIHdyYXBwZXIpCit7CisgICAgcmV0dXJuIHdyYXBwZXIuaW1wbCgpOworfQor
CitXZWJET01UZXN0VHlwZWRlZnMgdG9XZWJLaXQoV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiB2YWx1
ZSkKK3sKKyAgICByZXR1cm4gV2ViRE9NVGVzdFR5cGVkZWZzKHZhbHVlKTsKK30KZGlmZiAtLWdp
dCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9DUFAvV2ViRE9NVGVzdFR5
cGVkZWZzLmggYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvQ1BQL1dlYkRP
TVRlc3RUeXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmYyMDk1M2FmMTdhMjkzZjk5NzllNzBiMmU5ZjNk
NjExY2RhYjM4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9z
Y3JpcHRzL3Rlc3QvQ1BQL1dlYkRPTVRlc3RUeXBlZGVmcy5oCkBAIC0wLDAgKzEsNjggQEAKKy8q
CisgKiBDb3B5cmlnaHQgKEMpIFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCBy
aWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUsIDIwMDYsIDIwMDcs
IDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0
IChDKSAyMDA2IFNhbXVlbCBXZWluaWcgPHNhbS53ZWluaWdAZ21haWwuY29tPgorICogQ29weXJp
Z2h0IChDKSBSZXNlYXJjaCBJbiBNb3Rpb24gTGltaXRlZCAyMDEwLiBBbGwgcmlnaHRzIHJlc2Vy
dmVkLgorICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz
dHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO
VSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUg
RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlz
IGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1
bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcg
d2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3Jp
dGUgdG8KKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGlu
IFN0cmVldCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAq
LworCisjaWZuZGVmIFdlYkRPTVRlc3RUeXBlZGVmc19oCisjZGVmaW5lIFdlYkRPTVRlc3RUeXBl
ZGVmc19oCisKKyNpbmNsdWRlIDxXZWJET01PYmplY3QuaD4KKyNpbmNsdWRlIDxXZWJET01TdHJp
bmcuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworY2xhc3MgVGVzdFR5cGVkZWZzOworfTsKKwor
Y2xhc3MgV2ViRE9NQXJyYXk7CitjbGFzcyBXZWJET01ET01TdHJpbmdbXTsKK2NsYXNzIFdlYkRP
TVNWR1BvaW50OworY2xhc3MgV2ViRE9NU3RyaW5nOworY2xhc3MgV2ViRE9NbG9uZ1tdOworCitj
bGFzcyBXZWJET01UZXN0VHlwZWRlZnMgOiBwdWJsaWMgV2ViRE9NT2JqZWN0IHsKK3B1YmxpYzoK
KyAgICBXZWJET01UZXN0VHlwZWRlZnMoKTsKKyAgICBleHBsaWNpdCBXZWJET01UZXN0VHlwZWRl
ZnMoV2ViQ29yZTo6VGVzdFR5cGVkZWZzKik7CisgICAgV2ViRE9NVGVzdFR5cGVkZWZzKGNvbnN0
IFdlYkRPTVRlc3RUeXBlZGVmcyYpOworICAgIFdlYkRPTVRlc3RUeXBlZGVmcyYgb3BlcmF0b3I9
KGNvbnN0IFdlYkRPTVRlc3RUeXBlZGVmcyYpOworICAgIHZpcnR1YWwgfldlYkRPTVRlc3RUeXBl
ZGVmcygpOworCisgICAgdW5zaWduZWQgbG9uZyBsb25nIHVuc2lnbmVkTG9uZ0xvbmdBdHRyKCkg
Y29uc3Q7CisgICAgdm9pZCBzZXRVbnNpZ25lZExvbmdMb25nQXR0cih1bnNpZ25lZCBsb25nIGxv
bmcpOworICAgIFdlYkRPTVN0cmluZyBpbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSBj
b25zdDsKKyAgICB2b2lkIHNldEltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShjb25zdCBX
ZWJET01TdHJpbmcmKTsKKworICAgIHZvaWQgZnVuYyhjb25zdCBXZWJET01sb25nW10mIHgpOwor
ICAgIHZvaWQgbXVsdGlUcmFuc2Zlckxpc3QoY29uc3QgV2ViRE9NU3RyaW5nJiBmaXJzdCwgY29u
c3QgV2ViRE9NQXJyYXkmIHR4LCBjb25zdCBXZWJET01TdHJpbmcmIHNlY29uZCwgY29uc3QgV2Vi
RE9NQXJyYXkmIHR4eCk7CisgICAgdm9pZCBzZXRTaGFkb3coZmxvYXQgd2lkdGgsIGZsb2F0IGhl
aWdodCwgZmxvYXQgYmx1ciwgY29uc3QgV2ViRE9NU3RyaW5nJiBjb2xvciwgZmxvYXQgYWxwaGEp
OworICAgIHZvaWQgbnVsbGFibGVBcnJheUFyZyhjb25zdCBXZWJET01ET01TdHJpbmdbXSYgYXJy
YXlBcmcpOworICAgIFdlYkRPTVNWR1BvaW50IGltbXV0YWJsZVBvaW50RnVuY3Rpb24oKTsKKwor
ICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaW1wbCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6Cisg
ICAgc3RydWN0IFdlYkRPTVRlc3RUeXBlZGVmc1ByaXZhdGU7CisgICAgV2ViRE9NVGVzdFR5cGVk
ZWZzUHJpdmF0ZSogbV9pbXBsOworfTsKKworV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiB0b1dlYkNv
cmUoY29uc3QgV2ViRE9NVGVzdFR5cGVkZWZzJik7CitXZWJET01UZXN0VHlwZWRlZnMgdG9XZWJL
aXQoV2ViQ29yZTo6VGVzdFR5cGVkZWZzKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNl
L1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dl
YktpdERPTVRlc3RUeXBlZGVmcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uZjg5Y2Y1YjlkNzQxNDJhMjE5MGEw
ZmIyN2YxZThmNWJkM2ZmNzJhZQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2Jp
bmRpbmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmcy5jcHAKQEAg
LTAsMCArMSwyOTAgQEAKKy8qCisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBv
cGVuIHNvdXJjZSBwcm9qZWN0LgorICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkg
Z2VuZXJhdGUtYmluZGluZ3MucGwuIERPIE5PVCBNT0RJRlkhCisKKyAgICBUaGlzIGxpYnJhcnkg
aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9k
aWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMK
KyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
OyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlv
bikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQg
aW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkg
V0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNI
QU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUg
R05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMu
CisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFy
eSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNl
ZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29y
LAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2luY2x1ZGUgImNvbmZp
Zy5oIgorI2luY2x1ZGUgIldlYktpdERPTVRlc3RUeXBlZGVmcy5oIgorCisjaW5jbHVkZSAiRE9N
T2JqZWN0Q2FjaGUuaCIKKyNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCisjaW5jbHVkZSAiSlNN
YWluVGhyZWFkRXhlY1N0YXRlLmgiCisjaW5jbHVkZSAiV2ViS2l0RE9NQXJyYXlQcml2YXRlLmgi
CisjaW5jbHVkZSAiV2ViS2l0RE9NQmluZGluZy5oIgorI2luY2x1ZGUgIldlYktpdERPTURPTVN0
cmluZ1tdUHJpdmF0ZS5oIgorI2luY2x1ZGUgIldlYktpdERPTVNWR1BvaW50UHJpdmF0ZS5oIgor
I2luY2x1ZGUgIldlYktpdERPTVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZVByaXZhdGUuaCIKKyNpbmNs
dWRlICJXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlLmgiCisjaW5jbHVkZSAiV2ViS2l0RE9N
bG9uZ1tdUHJpdmF0ZS5oIgorI2luY2x1ZGUgImdvYmplY3QvQ29udmVydFRvVVRGOFN0cmluZy5o
IgorI2luY2x1ZGUgPHd0Zi9HZXRQdHIuaD4KKyNpbmNsdWRlIDx3dGYvUmVmUHRyLmg+CisKKyNk
ZWZpbmUgV0VCS0lUX0RPTV9URVNUX1RZUEVERUZTX0dFVF9QUklWQVRFKG9iaikgR19UWVBFX0lO
U1RBTkNFX0dFVF9QUklWQVRFKG9iaiwgV0VCS0lUX1RZUEVfRE9NX1RFU1RfVFlQRURFRlMsIFdl
YktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUpCisKK3R5cGVkZWYgc3RydWN0IF9XZWJLaXRET01U
ZXN0VHlwZWRlZnNQcml2YXRlIHsKKyAgICBSZWZQdHI8V2ViQ29yZTo6VGVzdFR5cGVkZWZzPiBj
b3JlT2JqZWN0OworfSBXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlOworCituYW1lc3BhY2Ug
V2ViS2l0IHsKKworV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBraXQoV2ViQ29yZTo6VGVzdFR5cGVk
ZWZzKiBvYmopCit7CisgICAgaWYgKCFvYmopCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYg
KGdwb2ludGVyIHJldCA9IERPTU9iamVjdENhY2hlOjpnZXQob2JqKSkKKyAgICAgICAgcmV0dXJu
IFdFQktJVF9ET01fVEVTVF9UWVBFREVGUyhyZXQpOworCisgICAgcmV0dXJuIHdyYXBUZXN0VHlw
ZWRlZnMob2JqKTsKK30KKworV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBjb3JlKFdlYktpdERPTVRl
c3RUeXBlZGVmcyogcmVxdWVzdCkKK3sKKyAgICByZXR1cm4gcmVxdWVzdCA/IHN0YXRpY19jYXN0
PFdlYkNvcmU6OlRlc3RUeXBlZGVmcyo+KFdFQktJVF9ET01fT0JKRUNUKHJlcXVlc3QpLT5jb3Jl
T2JqZWN0KSA6IDA7Cit9CisKK1dlYktpdERPTVRlc3RUeXBlZGVmcyogd3JhcFRlc3RUeXBlZGVm
cyhXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGNvcmVPYmplY3QpCit7CisgICAgQVNTRVJUKGNvcmVP
YmplY3QpOworICAgIHJldHVybiBXRUJLSVRfRE9NX1RFU1RfVFlQRURFRlMoZ19vYmplY3RfbmV3
KFdFQktJVF9UWVBFX0RPTV9URVNUX1RZUEVERUZTLCAiY29yZS1vYmplY3QiLCBjb3JlT2JqZWN0
LCBOVUxMKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdlYktpdAorCitHX0RFRklORV9UWVBFKFdl
YktpdERPTVRlc3RUeXBlZGVmcywgd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzLCBXRUJLSVRfVFlQ
RV9ET01fT0JKRUNUKQorCitlbnVtIHsKKyAgICBQUk9QXzAsCisgICAgUFJPUF9VTlNJR05FRF9M
T05HX0xPTkdfQVRUUiwKKyAgICBQUk9QX0lNTVVUQUJMRV9TRVJJQUxJWkVEX1NDUklQVF9WQUxV
RSwKK307CisKK3N0YXRpYyB2b2lkIHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19maW5hbGl6ZShH
T2JqZWN0KiBvYmplY3QpCit7CisgICAgV2ViS2l0RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSogcHJp
diA9IFdFQktJVF9ET01fVEVTVF9UWVBFREVGU19HRVRfUFJJVkFURShvYmplY3QpOworCisgICAg
V2ViS2l0OjpET01PYmplY3RDYWNoZTo6Zm9yZ2V0KHByaXYtPmNvcmVPYmplY3QuZ2V0KCkpOwor
CisgICAgcHJpdi0+fldlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUoKTsKKyAgICBHX09CSkVD
VF9DTEFTUyh3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUo
b2JqZWN0KTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9w
cm9wZXJ0eShHT2JqZWN0KiBvYmplY3QsIGd1aW50IHByb3BlcnR5SWQsIGNvbnN0IEdWYWx1ZSog
dmFsdWUsIEdQYXJhbVNwZWMqIHBzcGVjKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51
bGxTdGF0ZSBzdGF0ZTsKKworICAgIFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiA9IFdFQktJ
VF9ET01fVEVTVF9UWVBFREVGUyhvYmplY3QpOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyog
Y29yZVNlbGYgPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisKKyAgICBzd2l0Y2ggKHByb3BlcnR5SWQp
IHsKKyAgICBjYXNlIFBST1BfVU5TSUdORURfTE9OR19MT05HX0FUVFI6IHsKKyAgICAgICAgY29y
ZVNlbGYtPnNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyKChnX3ZhbHVlX2dldF91aW50NjQodmFsdWUp
KSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBHX09CSkVD
VF9XQVJOX0lOVkFMSURfUFJPUEVSVFlfSUQob2JqZWN0LCBwcm9wZXJ0eUlkLCBwc3BlYyk7Cisg
ICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIHZvaWQgd2Via2l0X2RvbV90ZXN0X3R5
cGVkZWZzX2dldF9wcm9wZXJ0eShHT2JqZWN0KiBvYmplY3QsIGd1aW50IHByb3BlcnR5SWQsIEdW
YWx1ZSogdmFsdWUsIEdQYXJhbVNwZWMqIHBzcGVjKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRo
cmVhZE51bGxTdGF0ZSBzdGF0ZTsKKworICAgIFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiA9
IFdFQktJVF9ET01fVEVTVF9UWVBFREVGUyhvYmplY3QpOworICAgIFdlYkNvcmU6OlRlc3RUeXBl
ZGVmcyogY29yZVNlbGYgPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisKKyAgICBzd2l0Y2ggKHByb3Bl
cnR5SWQpIHsKKyAgICBjYXNlIFBST1BfVU5TSUdORURfTE9OR19MT05HX0FUVFI6IHsKKyAgICAg
ICAgZ192YWx1ZV9zZXRfdWludDY0KHZhbHVlLCBjb3JlU2VsZi0+dW5zaWduZWRMb25nTG9uZ0F0
dHIoKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfSU1NVVRBQkxFX1NF
UklBTElaRURfU0NSSVBUX1ZBTFVFOiB7CisgICAgICAgIFJlZlB0cjxXZWJDb3JlOjpTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IHB0ciA9IGNvcmVTZWxmLT5pbW11dGFibGVTZXJpYWxpemVkU2NyaXB0
VmFsdWUoKTsKKyAgICAgICAgZ192YWx1ZV9zZXRfb2JqZWN0KHZhbHVlLCBXZWJLaXQ6OmtpdChw
dHIuZ2V0KCkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAg
IEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRChvYmplY3QsIHByb3BlcnR5SWQsIHBz
cGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMgR09iamVjdCogd2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2NvbnN0cnVjdG9yKEdUeXBlIHR5cGUsIGd1aW50IGNvbnN0cnVj
dFByb3BlcnRpZXNDb3VudCwgR09iamVjdENvbnN0cnVjdFBhcmFtKiBjb25zdHJ1Y3RQcm9wZXJ0
aWVzKQoreworICAgIEdPYmplY3QqIG9iamVjdCA9IEdfT0JKRUNUX0NMQVNTKHdlYmtpdF9kb21f
dGVzdF90eXBlZGVmc19wYXJlbnRfY2xhc3MpLT5jb25zdHJ1Y3Rvcih0eXBlLCBjb25zdHJ1Y3RQ
cm9wZXJ0aWVzQ291bnQsIGNvbnN0cnVjdFByb3BlcnRpZXMpOworCisgICAgV2ViS2l0RE9NVGVz
dFR5cGVkZWZzUHJpdmF0ZSogcHJpdiA9IFdFQktJVF9ET01fVEVTVF9UWVBFREVGU19HRVRfUFJJ
VkFURShvYmplY3QpOworICAgIHByaXYtPmNvcmVPYmplY3QgPSBzdGF0aWNfY2FzdDxXZWJDb3Jl
OjpUZXN0VHlwZWRlZnMqPihXRUJLSVRfRE9NX09CSkVDVChvYmplY3QpLT5jb3JlT2JqZWN0KTsK
KyAgICBXZWJLaXQ6OkRPTU9iamVjdENhY2hlOjpwdXQocHJpdi0+Y29yZU9iamVjdC5nZXQoKSwg
b2JqZWN0KTsKKworICAgIHJldHVybiBvYmplY3Q7Cit9CisKK3N0YXRpYyB2b2lkIHdlYmtpdF9k
b21fdGVzdF90eXBlZGVmc19jbGFzc19pbml0KFdlYktpdERPTVRlc3RUeXBlZGVmc0NsYXNzKiBy
ZXF1ZXN0Q2xhc3MpCit7CisgICAgR09iamVjdENsYXNzKiBnb2JqZWN0Q2xhc3MgPSBHX09CSkVD
VF9DTEFTUyhyZXF1ZXN0Q2xhc3MpOworICAgIGdfdHlwZV9jbGFzc19hZGRfcHJpdmF0ZShnb2Jq
ZWN0Q2xhc3MsIHNpemVvZihXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlKSk7CisgICAgZ29i
amVjdENsYXNzLT5jb25zdHJ1Y3RvciA9IHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19jb25zdHJ1
Y3RvcjsKKyAgICBnb2JqZWN0Q2xhc3MtPmZpbmFsaXplID0gd2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX2ZpbmFsaXplOworICAgIGdvYmplY3RDbGFzcy0+c2V0X3Byb3BlcnR5ID0gd2Via2l0X2Rv
bV90ZXN0X3R5cGVkZWZzX3NldF9wcm9wZXJ0eTsKKyAgICBnb2JqZWN0Q2xhc3MtPmdldF9wcm9w
ZXJ0eSA9IHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfcHJvcGVydHk7CisKKyAgICBnX29i
amVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5KGdvYmplY3RDbGFzcywKKyAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgIFBST1BfVU5TSUdORURfTE9OR19MT05HX0FUVFIsCisgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnX3BhcmFtX3NwZWNfdWludDY0KCJ1bnNp
Z25lZC1sb25nLWxvbmctYXR0ciIsIC8qIG5hbWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3RfdHlwZWRlZnNfdW5zaWdu
ZWQtbG9uZy1sb25nLWF0dHIiLCAvKiBzaG9ydCBkZXNjcmlwdGlvbiAqLworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZC13cml0
ZSAgZ3VpbnQ2NCBUZXN0VHlwZWRlZnMudW5zaWduZWQtbG9uZy1sb25nLWF0dHIiLCAvKiBsb25n
ZXIgLSBjb3VsZCBkbyB3aXRoIHNvbWUgZXh0cmEgZG9jIHN0dWZmIGhlcmUgKi8KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLyog
bWluICovCitHX01BWFVJTlQ2NCwgLyogbWluICovCiswLCAvKiBkZWZhdWx0ICovCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQktJ
VF9QQVJBTV9SRUFEV1JJVEUpKTsKKyAgICBnX29iamVjdF9jbGFzc19pbnN0YWxsX3Byb3BlcnR5
KGdvYmplY3RDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1Bf
SU1NVVRBQkxFX1NFUklBTElaRURfU0NSSVBUX1ZBTFVFLAorICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgZ19wYXJhbV9zcGVjX29iamVjdCgiaW1tdXRhYmxlLXNlcmlhbGl6ZWQt
c2NyaXB0LXZhbHVlIiwgLyogbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF90eXBlZGVmc19pbW11dGFibGUtc2Vy
aWFsaXplZC1zY3JpcHQtdmFsdWUiLCAvKiBzaG9ydCBkZXNjcmlwdGlvbiAqLworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZC13
cml0ZSAgV2ViS2l0RE9NU2VyaWFsaXplZFNjcmlwdFZhbHVlKiBUZXN0VHlwZWRlZnMuaW1tdXRh
YmxlLXNlcmlhbGl6ZWQtc2NyaXB0LXZhbHVlIiwgLyogbG9uZ2VyIC0gY291bGQgZG8gd2l0aCBz
b21lIGV4dHJhIGRvYyBzdHVmZiBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQktJVF9UWVBFX0RPTV9TRVJJQUxJWkVE
X1NDUklQVF9WQUxVRSwgLyogZ29iamVjdCB0eXBlICovCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdFQktJVF9QQVJBTV9SRUFEV1JJ
VEUpKTsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2luaXQoV2Vi
S2l0RE9NVGVzdFR5cGVkZWZzKiByZXF1ZXN0KQoreworICAgIFdlYktpdERPTVRlc3RUeXBlZGVm
c1ByaXZhdGUqIHByaXYgPSBXRUJLSVRfRE9NX1RFU1RfVFlQRURFRlNfR0VUX1BSSVZBVEUocmVx
dWVzdCk7CisgICAgbmV3IChwcml2KSBXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlKCk7Cit9
CisKK3ZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19mdW5jKFdlYktpdERPTVRlc3RUeXBl
ZGVmcyogc2VsZiwgV2ViS2l0RE9NbG9uZ1tdKiB4KQoreworICAgIFdlYkNvcmU6OkpTTWFpblRo
cmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNf
VEVTVF9UWVBFREVGUyhzZWxmKSk7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lT
X0xPTkdbXSh4KSk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpj
b3JlKHNlbGYpOworICAgIFdlYkNvcmU6OmxvbmdbXSogY29udmVydGVkWCA9IFdlYktpdDo6Y29y
ZSh4KTsKKyAgICBpdGVtLT5mdW5jKGNvbnZlcnRlZFgpOworfQorCit2b2lkCit3ZWJraXRfZG9t
X3Rlc3RfdHlwZWRlZnNfbXVsdGlfdHJhbnNmZXJfbGlzdChXZWJLaXRET01UZXN0VHlwZWRlZnMq
IHNlbGYsIFdlYktpdERPTVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogZmlyc3QsIFdlYktpdERPTUFy
cmF5KiB0eCwgV2ViS2l0RE9NU2VyaWFsaXplZFNjcmlwdFZhbHVlKiBzZWNvbmQsIFdlYktpdERP
TUFycmF5KiB0eHgpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRl
OworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYp
KTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfU0VSSUFMSVpFRF9TQ1JJUFRf
VkFMVUUoZmlyc3QpKTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfQVJSQVko
dHgpKTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfU0VSSUFMSVpFRF9TQ1JJ
UFRfVkFMVUUoc2Vjb25kKSk7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lTX0FS
UkFZKHR4eCkpOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29y
ZShzZWxmKTsKKyAgICBXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUqIGNvbnZlcnRlZEZp
cnN0ID0gV2ViS2l0Ojpjb3JlKGZpcnN0KTsKKyAgICBXZWJDb3JlOjpBcnJheSogY29udmVydGVk
VHggPSBXZWJLaXQ6OmNvcmUodHgpOworICAgIFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZSogY29udmVydGVkU2Vjb25kID0gV2ViS2l0Ojpjb3JlKHNlY29uZCk7CisgICAgV2ViQ29yZTo6
QXJyYXkqIGNvbnZlcnRlZFR4eCA9IFdlYktpdDo6Y29yZSh0eHgpOworICAgIGl0ZW0tPm11bHRp
VHJhbnNmZXJMaXN0KGNvbnZlcnRlZEZpcnN0LCBjb252ZXJ0ZWRUeCwgY29udmVydGVkU2Vjb25k
LCBjb252ZXJ0ZWRUeHgpOworfQorCit2b2lkCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0
X3NoYWRvdyhXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIGdmbG9hdCB3aWR0aCwgZ2Zsb2F0
IGhlaWdodCwgZ2Zsb2F0IGJsdXIsIGNvbnN0IGdjaGFyKiBjb2xvciwgZ2Zsb2F0IGFscGhhKQor
eworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVy
bl9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSk7CisgICAgZ19yZXR1
cm5faWZfZmFpbChjb2xvcik7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2Vi
S2l0Ojpjb3JlKHNlbGYpOworICAgIFdURjo6U3RyaW5nIGNvbnZlcnRlZENvbG9yID0gV1RGOjpT
dHJpbmc6OmZyb21VVEY4KGNvbG9yKTsKKyAgICBpdGVtLT5zZXRTaGFkb3cod2lkdGgsIGhlaWdo
dCwgYmx1ciwgY29udmVydGVkQ29sb3IsIGFscGhhKTsKK30KKwordm9pZAord2Via2l0X2RvbV90
ZXN0X3R5cGVkZWZzX251bGxhYmxlX2FycmF5X2FyZyhXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNl
bGYsIFdlYktpdERPTURPTVN0cmluZ1tdKiBhcnJheUFyZykKK3sKKyAgICBXZWJDb3JlOjpKU01h
aW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9N
X0lTX1RFU1RfVFlQRURFRlMoc2VsZikpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RP
TV9JU19ET01fU1RSSU5HW10oYXJyYXlBcmcpKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMq
IGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgV2ViQ29yZTo6RE9NU3RyaW5nW10qIGNv
bnZlcnRlZEFycmF5QXJnID0gV2ViS2l0Ojpjb3JlKGFycmF5QXJnKTsKKyAgICBpdGVtLT5udWxs
YWJsZUFycmF5QXJnKGNvbnZlcnRlZEFycmF5QXJnKTsKK30KKworV2ViS2l0RE9NU1ZHUG9pbnQq
Cit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfaW1tdXRhYmxlX3BvaW50X2Z1bmN0aW9uKFdlYktp
dERPTVRlc3RUeXBlZGVmcyogc2VsZikKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxs
U3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNU
X1RZUEVERUZTKHNlbGYpLCAwKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBX
ZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgUmVmUHRyPFdlYkNvcmU6OlNWR1BvaW50PiBnb2JqZWN0
UmVzdWx0ID0gV1RGOjpnZXRQdHIoaXRlbS0+aW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpKTsKKyAg
ICByZXR1cm4gV2ViS2l0OjpraXQoZ29iamVjdFJlc3VsdC5nZXQoKSk7Cit9CisKK1dlYktpdERP
TURPTVN0cmluZ1tdKgord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3N0cmluZ19hcnJheV9mdW5j
dGlvbihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIFdlYktpdERPTURPTVN0cmluZ1tdKiB2
YWx1ZXMsIEdFcnJvcioqIGVycm9yKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxT
dGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfRE9NX0lTX1RFU1Rf
VFlQRURFRlMoc2VsZiksIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9ET01f
SVNfRE9NX1NUUklOR1tdKHZhbHVlcyksIDApOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKCFl
cnJvciB8fCAhKmVycm9yLCAwKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBX
ZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgV2ViQ29yZTo6RE9NU3RyaW5nW10qIGNvbnZlcnRlZFZh
bHVlcyA9IFdlYktpdDo6Y29yZSh2YWx1ZXMpOworICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUg
ZWMgPSAwOworICAgIFJlZlB0cjxXZWJDb3JlOjpET01TdHJpbmdbXT4gZ29iamVjdFJlc3VsdCA9
IFdURjo6Z2V0UHRyKGl0ZW0tPnN0cmluZ0FycmF5RnVuY3Rpb24oY29udmVydGVkVmFsdWVzLCBl
YykpOworICAgIGlmIChlYykgeworICAgICAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlRGVzY3Jp
cHRpb24gZWNkZXNjKGVjKTsKKyAgICAgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbChlcnJvciwgZ19x
dWFya19mcm9tX3N0cmluZygiV0VCS0lUX0RPTSIpLCBlY2Rlc2MuY29kZSwgZWNkZXNjLm5hbWUp
OworICAgIH0KKyAgICByZXR1cm4gV2ViS2l0OjpraXQoZ29iamVjdFJlc3VsdC5nZXQoKSk7Cit9
CisKK2d1aW50NjQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfdW5zaWduZWRfbG9uZ19s
b25nX2F0dHIoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmKQoreworICAgIFdlYkNvcmU6OkpT
TWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJL
SVRfRE9NX0lTX1RFU1RfVFlQRURFRlMoc2VsZiksIDApOworICAgIFdlYkNvcmU6OlRlc3RUeXBl
ZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBndWludDY0IHJlc3VsdCA9IGl0
ZW0tPnVuc2lnbmVkTG9uZ0xvbmdBdHRyKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9p
ZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF91bnNpZ25lZF9sb25nX2xvbmdfYXR0cihX
ZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIGd1aW50NjQgdmFsdWUpCit7CisgICAgV2ViQ29y
ZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VC
S0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRl
ZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgaXRlbS0+c2V0VW5zaWduZWRMb25n
TG9uZ0F0dHIodmFsdWUpOworfQorCitXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqCit3
ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X2ltbXV0YWJsZV9zZXJpYWxpemVkX3NjcmlwdF92
YWx1ZShXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYpCit7CisgICAgV2ViQ29yZTo6SlNNYWlu
VGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9E
T01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSwgMCk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZz
KiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAgIFJlZlB0cjxXZWJDb3JlOjpTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IGdvYmplY3RSZXN1bHQgPSBXVEY6OmdldFB0cihpdGVtLT5pbW11dGFi
bGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSk7CisgICAgcmV0dXJuIFdlYktpdDo6a2l0KGdvYmpl
Y3RSZXN1bHQuZ2V0KCkpOworfQorCit2b2lkCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0
X2ltbXV0YWJsZV9zZXJpYWxpemVkX3NjcmlwdF92YWx1ZShXZWJLaXRET01UZXN0VHlwZWRlZnMq
IHNlbGYsIFdlYktpdERPTVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogdmFsdWUpCit7CisgICAgV2Vi
Q29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIGdfcmV0dXJuX2lmX2ZhaWwo
V0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpKTsKKyAgICBnX3JldHVybl9pZl9mYWls
KFdFQktJVF9ET01fSVNfU0VSSUFMSVpFRF9TQ1JJUFRfVkFMVUUodmFsdWUpKTsKKyAgICBXZWJD
b3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgV2ViQ29y
ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlKiBjb252ZXJ0ZWRWYWx1ZSA9IFdlYktpdDo6Y29yZSh2
YWx1ZSk7CisgICAgaXRlbS0+c2V0SW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKGNvbnZl
cnRlZFZhbHVlKTsKK30KKwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2Ny
aXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZzLmggYi9Tb3VyY2UvV2ViQ29y
ZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvR09iamVjdC9XZWJLaXRET01UZXN0VHlwZWRlZnMuaApu
ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwLi45OGQzZDA2YjhlN2FjNWUzZjE0NGY5ZGY4MjA3YTNiNmE5MmQ5MTUwCi0tLSAv
ZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmpl
Y3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZzLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgICAgVGhp
cyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNvdXJjZSBwcm9qZWN0LgorICAgIFRo
aXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtYmluZGluZ3MucGwuIERPIE5P
VCBNT0RJRlkhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy
ZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0
aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi
eSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2Yg
dGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAg
ICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJl
IHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUg
aW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBB
IFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVj
ZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisg
ICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElm
IG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1
MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMw
MSwgVVNBLgorKi8KKworI2lmbmRlZiBXZWJLaXRET01UZXN0VHlwZWRlZnNfaAorI2RlZmluZSBX
ZWJLaXRET01UZXN0VHlwZWRlZnNfaAorCisjaW5jbHVkZSA8Z2xpYi1vYmplY3QuaD4KKyNpbmNs
dWRlIDx3ZWJraXRkb20vV2ViS2l0RE9NT2JqZWN0Lmg+CisjaW5jbHVkZSA8d2Via2l0ZG9tL3dl
YmtpdGRvbWRlZmluZXMuaD4KKworR19CRUdJTl9ERUNMUworCisjZGVmaW5lIFdFQktJVF9UWVBF
X0RPTV9URVNUX1RZUEVERUZTICAgICAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19n
ZXRfdHlwZSgpKQorI2RlZmluZSBXRUJLSVRfRE9NX1RFU1RfVFlQRURFRlMob2JqKSAgICAgICAg
ICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfQ0FTVCgob2JqKSwgV0VCS0lUX1RZUEVfRE9NX1RF
U1RfVFlQRURFRlMsIFdlYktpdERPTVRlc3RUeXBlZGVmcykpCisjZGVmaW5lIFdFQktJVF9ET01f
VEVTVF9UWVBFREVGU19DTEFTUyhrbGFzcykgICAgKEdfVFlQRV9DSEVDS19DTEFTU19DQVNUKChr
bGFzcyksICBXRUJLSVRfVFlQRV9ET01fVEVTVF9UWVBFREVGUywgV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzQ2xhc3MpCisjZGVmaW5lIFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhvYmopICAgICAg
ICAgKEdfVFlQRV9DSEVDS19JTlNUQU5DRV9UWVBFKChvYmopLCBXRUJLSVRfVFlQRV9ET01fVEVT
VF9UWVBFREVGUykpCisjZGVmaW5lIFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGU19DTEFTUyhr
bGFzcykgKEdfVFlQRV9DSEVDS19DTEFTU19UWVBFKChrbGFzcyksICBXRUJLSVRfVFlQRV9ET01f
VEVTVF9UWVBFREVGUykpCisjZGVmaW5lIFdFQktJVF9ET01fVEVTVF9UWVBFREVGU19HRVRfQ0xB
U1Mob2JqKSAgKEdfVFlQRV9JTlNUQU5DRV9HRVRfQ0xBU1MoKG9iaiksICBXRUJLSVRfVFlQRV9E
T01fVEVTVF9UWVBFREVGUywgV2ViS2l0RE9NVGVzdFR5cGVkZWZzQ2xhc3MpKQorCitzdHJ1Y3Qg
X1dlYktpdERPTVRlc3RUeXBlZGVmcyB7CisgICAgV2ViS2l0RE9NT2JqZWN0IHBhcmVudF9pbnN0
YW5jZTsKK307CisKK3N0cnVjdCBfV2ViS2l0RE9NVGVzdFR5cGVkZWZzQ2xhc3MgeworICAgIFdl
YktpdERPTU9iamVjdENsYXNzIHBhcmVudF9jbGFzczsKK307CisKK1dFQktJVF9BUEkgR1R5cGUK
K3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfdHlwZSAodm9pZCk7CisKKy8qKgorICogd2Vi
a2l0X2RvbV90ZXN0X3R5cGVkZWZzX2Z1bmM6CisgKiBAc2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5
cGVkZWZzCisgKiBAeDogQSAjV2ViS2l0RE9NbG9uZ1tdCisgKgorICogUmV0dXJuczoKKyAqCisq
Ki8KK1dFQktJVF9BUEkgdm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2Z1bmMoV2ViS2l0
RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJLaXRET01sb25nW10qIHgpOworCisvKioKKyAqIHdl
YmtpdF9kb21fdGVzdF90eXBlZGVmc19tdWx0aV90cmFuc2Zlcl9saXN0OgorICogQHNlbGY6IEEg
I1dlYktpdERPTVRlc3RUeXBlZGVmcworICogQGZpcnN0OiBBICNXZWJLaXRET01TZXJpYWxpemVk
U2NyaXB0VmFsdWUKKyAqIEB0eDogQSAjV2ViS2l0RE9NQXJyYXkKKyAqIEBzZWNvbmQ6IEEgI1dl
YktpdERPTVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZQorICogQHR4eDogQSAjV2ViS2l0RE9NQXJyYXkK
KyAqCisgKiBSZXR1cm5zOgorICoKKyoqLworV0VCS0lUX0FQSSB2b2lkCit3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfbXVsdGlfdHJhbnNmZXJfbGlzdChXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNl
bGYsIFdlYktpdERPTVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogZmlyc3QsIFdlYktpdERPTUFycmF5
KiB0eCwgV2ViS2l0RE9NU2VyaWFsaXplZFNjcmlwdFZhbHVlKiBzZWNvbmQsIFdlYktpdERPTUFy
cmF5KiB0eHgpOworCisvKioKKyAqIHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfc2hhZG93
OgorICogQHNlbGY6IEEgI1dlYktpdERPTVRlc3RUeXBlZGVmcworICogQHdpZHRoOiBBICNnZmxv
YXQKKyAqIEBoZWlnaHQ6IEEgI2dmbG9hdAorICogQGJsdXI6IEEgI2dmbG9hdAorICogQGNvbG9y
OiBBICNnY2hhcgorICogQGFscGhhOiBBICNnZmxvYXQKKyAqCisgKiBSZXR1cm5zOgorICoKKyoq
LworV0VCS0lUX0FQSSB2b2lkCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X3NoYWRvdyhX
ZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIGdmbG9hdCB3aWR0aCwgZ2Zsb2F0IGhlaWdodCwg
Z2Zsb2F0IGJsdXIsIGNvbnN0IGdjaGFyKiBjb2xvciwgZ2Zsb2F0IGFscGhhKTsKKworLyoqCisg
KiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfbnVsbGFibGVfYXJyYXlfYXJnOgorICogQHNlbGY6
IEEgI1dlYktpdERPTVRlc3RUeXBlZGVmcworICogQGFycmF5QXJnOiBBICNXZWJLaXRET01ET01T
dHJpbmdbXQorICoKKyAqIFJldHVybnM6CisgKgorKiovCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtp
dF9kb21fdGVzdF90eXBlZGVmc19udWxsYWJsZV9hcnJheV9hcmcoV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzKiBzZWxmLCBXZWJLaXRET01ET01TdHJpbmdbXSogYXJyYXlBcmcpOworCisvKioKKyAqIHdl
YmtpdF9kb21fdGVzdF90eXBlZGVmc19pbW11dGFibGVfcG9pbnRfZnVuY3Rpb246CisgKiBAc2Vs
ZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisgKgorICogUmV0dXJuczogKHRyYW5zZmVyIG5v
bmUpOgorICoKKyoqLworV0VCS0lUX0FQSSBXZWJLaXRET01TVkdQb2ludCoKK3dlYmtpdF9kb21f
dGVzdF90eXBlZGVmc19pbW11dGFibGVfcG9pbnRfZnVuY3Rpb24oV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzKiBzZWxmKTsKKworLyoqCisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc3RyaW5nX2Fy
cmF5X2Z1bmN0aW9uOgorICogQHNlbGY6IEEgI1dlYktpdERPTVRlc3RUeXBlZGVmcworICogQHZh
bHVlczogQSAjV2ViS2l0RE9NRE9NU3RyaW5nW10KKyAqIEBlcnJvcjogI0dFcnJvcgorICoKKyAq
IFJldHVybnM6ICh0cmFuc2ZlciBub25lKToKKyAqCisqKi8KK1dFQktJVF9BUEkgV2ViS2l0RE9N
RE9NU3RyaW5nW10qCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc3RyaW5nX2FycmF5X2Z1bmN0
aW9uKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgV2ViS2l0RE9NRE9NU3RyaW5nW10qIHZh
bHVlcywgR0Vycm9yKiogZXJyb3IpOworCisvKioKKyAqIHdlYmtpdF9kb21fdGVzdF90eXBlZGVm
c19nZXRfdW5zaWduZWRfbG9uZ19sb25nX2F0dHI6CisgKiBAc2VsZjogQSAjV2ViS2l0RE9NVGVz
dFR5cGVkZWZzCisgKgorICogUmV0dXJuczoKKyAqCisqKi8KK1dFQktJVF9BUEkgZ3VpbnQ2NAor
d2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF91bnNpZ25lZF9sb25nX2xvbmdfYXR0cihXZWJL
aXRET01UZXN0VHlwZWRlZnMqIHNlbGYpOworCisvKioKKyAqIHdlYmtpdF9kb21fdGVzdF90eXBl
ZGVmc19zZXRfdW5zaWduZWRfbG9uZ19sb25nX2F0dHI6CisgKiBAc2VsZjogQSAjV2ViS2l0RE9N
VGVzdFR5cGVkZWZzCisgKiBAdmFsdWU6IEEgI2d1aW50NjQKKyAqCisgKiBSZXR1cm5zOgorICoK
KyoqLworV0VCS0lUX0FQSSB2b2lkCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X3Vuc2ln
bmVkX2xvbmdfbG9uZ19hdHRyKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgZ3VpbnQ2NCB2
YWx1ZSk7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF9pbW11dGFibGVf
c2VyaWFsaXplZF9zY3JpcHRfdmFsdWU6CisgKiBAc2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzCisgKgorICogUmV0dXJuczogKHRyYW5zZmVyIG5vbmUpOgorICoKKyoqLworV0VCS0lUX0FQ
SSBXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRl
ZnNfZ2V0X2ltbXV0YWJsZV9zZXJpYWxpemVkX3NjcmlwdF92YWx1ZShXZWJLaXRET01UZXN0VHlw
ZWRlZnMqIHNlbGYpOworCisvKioKKyAqIHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfaW1t
dXRhYmxlX3NlcmlhbGl6ZWRfc2NyaXB0X3ZhbHVlOgorICogQHNlbGY6IEEgI1dlYktpdERPTVRl
c3RUeXBlZGVmcworICogQHZhbHVlOiBBICNXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUK
KyAqCisgKiBSZXR1cm5zOiAodHJhbnNmZXIgbm9uZSk6CisgKgorKiovCitXRUJLSVRfQVBJIHZv
aWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfaW1tdXRhYmxlX3NlcmlhbGl6ZWRfc2Ny
aXB0X3ZhbHVlKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgV2ViS2l0RE9NU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlKiB2YWx1ZSk7CisKK0dfRU5EX0RFQ0xTCisKKyNlbmRpZiAvKiBXZWJLaXRE
T01UZXN0VHlwZWRlZnNfaCAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZS5oIGIvU291
cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5
cGVkZWZzUHJpdmF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjNiODkwYmU1NTQ5YzQ2MzlhYThmY2YyN2M2ZGY5
MGEzODI3ZThkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9z
Y3JpcHRzL3Rlc3QvR09iamVjdC9XZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlLmgKQEAgLTAs
MCArMSwzMyBAQAorLyoKKyAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IG9wZW4g
c291cmNlIHByb2plY3QuCisgICAgVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBnZW5l
cmF0ZS1iaW5kaW5ncy5wbC4gRE8gTk9UIE1PRElGWSEKKworICAgIFRoaXMgbGlicmFyeSBpcyBm
cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkg
aXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAg
IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp
dGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBh
bnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0
aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJS
QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRB
QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUK
KyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKwor
ICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdl
bmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRo
ZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3
YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisg
ICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaWZuZGVmIFdlYktpdERPTVRl
c3RUeXBlZGVmc1ByaXZhdGVfaAorI2RlZmluZSBXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRl
X2gKKworI2luY2x1ZGUgIlRlc3RUeXBlZGVmcy5oIgorI2luY2x1ZGUgPHdlYmtpdGRvbS9XZWJL
aXRET01UZXN0VHlwZWRlZnMuaD4KKworbmFtZXNwYWNlIFdlYktpdCB7CitXZWJLaXRET01UZXN0
VHlwZWRlZnMqIHdyYXBUZXN0VHlwZWRlZnMoV2ViQ29yZTo6VGVzdFR5cGVkZWZzKik7CitXZWJD
b3JlOjpUZXN0VHlwZWRlZnMqIGNvcmUoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiByZXF1ZXN0KTsK
K1dlYktpdERPTVRlc3RUeXBlZGVmcyoga2l0KFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogbm9kZSk7
Cit9IC8vIG5hbWVzcGFjZSBXZWJLaXQKKworI2VuZGlmIC8qIFdlYktpdERPTVRlc3RUeXBlZGVm
c1ByaXZhdGVfaCAqLwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0
cy90ZXN0L0pTL0pTVGVzdFR5cGVkZWZzLmNwcCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3Nj
cmlwdHMvdGVzdC9KUy9KU1Rlc3RUeXBlZGVmcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uN2NjYTY1NjA5MGVj
YTIzNjc0MTk0MmFlY2IyZmM1MTEzZjdkNWQ3MgotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RUeXBlZGVmcy5jcHAKQEAgLTAs
MCArMSw0OTggQEAKKy8qCisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVu
IHNvdXJjZSBwcm9qZWN0LgorICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgZ2Vu
ZXJhdGUtYmluZGluZ3MucGwuIERPIE5PVCBNT0RJRlkhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMg
ZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5
IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAg
ICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBl
aXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikg
YW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4g
dGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FS
UkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5U
QUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05V
CisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisK
KyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0
aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0
d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAor
ICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2luY2x1ZGUgImNvbmZpZy5o
IgorI2luY2x1ZGUgIkpTVGVzdFR5cGVkZWZzLmgiCisKKyNpbmNsdWRlICJET01TdHJpbmdMaXN0
LmgiCisjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgorI2luY2x1ZGUgIkpTQXJyYXkuaCIKKyNp
bmNsdWRlICJKU0RPTUJpbmRpbmcuaCIKKyNpbmNsdWRlICJKU0RPTVN0cmluZ0xpc3QuaCIKKyNp
bmNsdWRlICJKU1NWR1BvaW50LmgiCisjaW5jbHVkZSAiSlNTZXJpYWxpemVkU2NyaXB0VmFsdWUu
aCIKKyNpbmNsdWRlICJKU1Rlc3RDYWxsYmFjay5oIgorI2luY2x1ZGUgIkpTVGVzdFN1Yk9iai5o
IgorI2luY2x1ZGUgIlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorI2luY2x1ZGUgIlRlc3RUeXBl
ZGVmcy5oIgorI2luY2x1ZGUgPHJ1bnRpbWUvRXJyb3IuaD4KKyNpbmNsdWRlIDxydW50aW1lL0pT
QXJyYXkuaD4KKyNpbmNsdWRlIDx3dGYvR2V0UHRyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M7
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLyogSGFzaCB0YWJsZSAqLworCitzdGF0aWMgY29u
c3QgSGFzaFRhYmxlVmFsdWUgSlNUZXN0VHlwZWRlZnNUYWJsZVZhbHVlc1tdID0KK3sKKyAgICB7
ICJ1bnNpZ25lZExvbmdMb25nQXR0ciIsIERvbnREZWxldGUsIChpbnRwdHJfdClzdGF0aWNfY2Fz
dDxQcm9wZXJ0eVNsb3Q6OkdldFZhbHVlRnVuYz4oanNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdM
b25nQXR0ciksIChpbnRwdHJfdClzZXRKU1Rlc3RUeXBlZGVmc1Vuc2lnbmVkTG9uZ0xvbmdBdHRy
LCBOb0ludHJpbnNpYyB9LAorICAgIHsgImltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSIs
IERvbnREZWxldGUsIChpbnRwdHJfdClzdGF0aWNfY2FzdDxQcm9wZXJ0eVNsb3Q6OkdldFZhbHVl
RnVuYz4oanNUZXN0VHlwZWRlZnNJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpLCAoaW50
cHRyX3Qpc2V0SlNUZXN0VHlwZWRlZnNJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUsIE5v
SW50cmluc2ljIH0sCisgICAgeyAiY29uc3RydWN0b3IiLCBEb250RW51bSB8IFJlYWRPbmx5LCAo
aW50cHRyX3Qpc3RhdGljX2Nhc3Q8UHJvcGVydHlTbG90OjpHZXRWYWx1ZUZ1bmM+KGpzVGVzdFR5
cGVkZWZzQ29uc3RydWN0b3IpLCAoaW50cHRyX3QpMCwgTm9JbnRyaW5zaWMgfSwKKyAgICB7IDAs
IDAsIDAsIDAsIE5vSW50cmluc2ljIH0KK307CisKK3N0YXRpYyBjb25zdCBIYXNoVGFibGUgSlNU
ZXN0VHlwZWRlZnNUYWJsZSA9IHsgOCwgNywgSlNUZXN0VHlwZWRlZnNUYWJsZVZhbHVlcywgMCB9
OworLyogSGFzaCB0YWJsZSBmb3IgY29uc3RydWN0b3IgKi8KKworc3RhdGljIGNvbnN0IEhhc2hU
YWJsZVZhbHVlIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3JUYWJsZVZhbHVlc1tdID0KK3sKKyAg
ICB7ICJUZXN0U3ViT2JqIiwgRG9udERlbGV0ZSB8IFJlYWRPbmx5LCAoaW50cHRyX3Qpc3RhdGlj
X2Nhc3Q8UHJvcGVydHlTbG90OjpHZXRWYWx1ZUZ1bmM+KGpzVGVzdFR5cGVkZWZzQ29uc3RydWN0
b3JUZXN0U3ViT2JqKSwgKGludHB0cl90KTAsIE5vSW50cmluc2ljIH0sCisgICAgeyAwLCAwLCAw
LCAwLCBOb0ludHJpbnNpYyB9Cit9OworCitzdGF0aWMgY29uc3QgSGFzaFRhYmxlIEpTVGVzdFR5
cGVkZWZzQ29uc3RydWN0b3JUYWJsZSA9IHsgMSwgMCwgSlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rv
clRhYmxlVmFsdWVzLCAwIH07CitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIEpTVGVzdFR5
cGVkZWZzQ29uc3RydWN0b3I6OmNvbnN0cnVjdEpTVGVzdFR5cGVkZWZzKEV4ZWNTdGF0ZSogZXhl
YykKK3sKKyAgICBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yKiBjYXN0ZWRUaGlzID0ganNDYXN0
PEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IqPihleGVjLT5jYWxsZWUoKSk7CisgICAgaWYgKGV4
ZWMtPmFyZ3VtZW50Q291bnQoKSA8IDIpCisgICAgICAgIHJldHVybiB0aHJvd1ZNRXJyb3IoZXhl
YywgY3JlYXRlTm90RW5vdWdoQXJndW1lbnRzRXJyb3IoZXhlYykpOworICAgIGNvbnN0IFN0cmlu
ZyYgaGVsbG8oTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZp
bmVkKS5pc0VtcHR5KCkgPyBTdHJpbmcoKSA6IE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMs
IDAsIERlZmF1bHRJc1VuZGVmaW5lZCkudG9TdHJpbmcoZXhlYyktPnZhbHVlKGV4ZWMpKTsKKyAg
ICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNv
ZGUoanNVbmRlZmluZWQoKSk7CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50Q291bnQoKSA8PSAxIHx8
ICFleGVjLT5hcmd1bWVudCgxKS5pc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiB0aHJvd1ZN
VHlwZUVycm9yKGV4ZWMpOworICAgIFJlZlB0cjxUZXN0Q2FsbGJhY2s+IHRlc3RDYWxsYmFjayA9
IEpTVGVzdENhbGxiYWNrOjpjcmVhdGUoYXNPYmplY3QoZXhlYy0+YXJndW1lbnQoMSkpLCBjYXN0
ZWRUaGlzLT5nbG9iYWxPYmplY3QoKSk7CisgICAgUmVmUHRyPFRlc3RUeXBlZGVmcz4gb2JqZWN0
ID0gVGVzdFR5cGVkZWZzOjpjcmVhdGUoaGVsbG8sIHRlc3RDYWxsYmFjayk7CisgICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZShhc09iamVjdCh0b0pTKGV4ZWMsIGNhc3RlZFRoaXMtPmdsb2JhbE9i
amVjdCgpLCBvYmplY3QuZ2V0KCkpKSk7Cit9CisKK2NvbnN0IENsYXNzSW5mbyBKU1Rlc3RUeXBl
ZGVmc0NvbnN0cnVjdG9yOjpzX2luZm8gPSB7ICJUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvciIsICZC
YXNlOjpzX2luZm8sICZKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yVGFibGUsIDAsIENSRUFURV9N
RVRIT0RfVEFCTEUoSlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvcikgfTsKKworSlNUZXN0VHlwZWRl
ZnNDb25zdHJ1Y3Rvcjo6SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvcihTdHJ1Y3R1cmUqIHN0cnVj
dHVyZSwgSlNET01HbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCkKKyAgICA6IERPTUNvbnN0cnVj
dG9yT2JqZWN0KHN0cnVjdHVyZSwgZ2xvYmFsT2JqZWN0KQoreworfQorCit2b2lkIEpTVGVzdFR5
cGVkZWZzQ29uc3RydWN0b3I6OmZpbmlzaENyZWF0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNET01H
bG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCkKK3sKKyAgICBCYXNlOjpmaW5pc2hDcmVhdGlvbihl
eGVjLT5nbG9iYWxEYXRhKCkpOworICAgIEFTU0VSVChpbmhlcml0cygmc19pbmZvKSk7CisgICAg
cHV0RGlyZWN0KGV4ZWMtPmdsb2JhbERhdGEoKSwgZXhlYy0+cHJvcGVydHlOYW1lcygpLnByb3Rv
dHlwZSwgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6OnNlbGYoZXhlYywgZ2xvYmFsT2JqZWN0KSwg
RG9udERlbGV0ZSB8IFJlYWRPbmx5KTsKKyAgICBwdXREaXJlY3QoZXhlYy0+Z2xvYmFsRGF0YSgp
LCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkubGVuZ3RoLCBqc051bWJlcigyKSwgUmVhZE9ubHkgfCBE
b250RGVsZXRlIHwgRG9udEVudW0pOworfQorCitib29sIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0
b3I6OmdldE93blByb3BlcnR5U2xvdChKU0NlbGwqIGNlbGwsIEV4ZWNTdGF0ZSogZXhlYywgUHJv
cGVydHlOYW1lIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQoreworICAgIHJldHVy
biBnZXRTdGF0aWNWYWx1ZVNsb3Q8SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvciwgSlNET01XcmFw
cGVyPihleGVjLCAmSlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvclRhYmxlLCBqc0Nhc3Q8SlNUZXN0
VHlwZWRlZnNDb25zdHJ1Y3Rvcio+KGNlbGwpLCBwcm9wZXJ0eU5hbWUsIHNsb3QpOworfQorCiti
b29sIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmdldE93blByb3BlcnR5RGVzY3JpcHRvcihK
U09iamVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5h
bWUsIFByb3BlcnR5RGVzY3JpcHRvciYgZGVzY3JpcHRvcikKK3sKKyAgICByZXR1cm4gZ2V0U3Rh
dGljVmFsdWVEZXNjcmlwdG9yPEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IsIEpTRE9NV3JhcHBl
cj4oZXhlYywgJkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3JUYWJsZSwganNDYXN0PEpTVGVzdFR5
cGVkZWZzQ29uc3RydWN0b3IqPihvYmplY3QpLCBwcm9wZXJ0eU5hbWUsIGRlc2NyaXB0b3IpOwor
fQorCitDb25zdHJ1Y3RUeXBlIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmdldENvbnN0cnVj
dERhdGEoSlNDZWxsKiwgQ29uc3RydWN0RGF0YSYgY29uc3RydWN0RGF0YSkKK3sKKyAgICBjb25z
dHJ1Y3REYXRhLm5hdGl2ZS5mdW5jdGlvbiA9IGNvbnN0cnVjdEpTVGVzdFR5cGVkZWZzOworICAg
IHJldHVybiBDb25zdHJ1Y3RUeXBlSG9zdDsKK30KKworLyogSGFzaCB0YWJsZSBmb3IgcHJvdG90
eXBlICovCisKK3N0YXRpYyBjb25zdCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RUeXBlZGVmc1Byb3Rv
dHlwZVRhYmxlVmFsdWVzW10gPQoreworICAgIHsgImZ1bmMiLCBEb250RGVsZXRlIHwgSlNDOjpG
dW5jdGlvbiwgKGludHB0cl90KXN0YXRpY19jYXN0PE5hdGl2ZUZ1bmN0aW9uPihqc1Rlc3RUeXBl
ZGVmc1Byb3RvdHlwZUZ1bmN0aW9uRnVuYyksIChpbnRwdHJfdCkxLCBOb0ludHJpbnNpYyB9LAor
ICAgIHsgIm11bHRpVHJhbnNmZXJMaXN0IiwgRG9udERlbGV0ZSB8IEpTQzo6RnVuY3Rpb24sIChp
bnRwdHJfdClzdGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4oanNUZXN0VHlwZWRlZnNQcm90b3R5
cGVGdW5jdGlvbk11bHRpVHJhbnNmZXJMaXN0KSwgKGludHB0cl90KTQsIE5vSW50cmluc2ljIH0s
CisgICAgeyAic2V0U2hhZG93IiwgRG9udERlbGV0ZSB8IEpTQzo6RnVuY3Rpb24sIChpbnRwdHJf
dClzdGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4oanNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5j
dGlvblNldFNoYWRvdyksIChpbnRwdHJfdCk1LCBOb0ludHJpbnNpYyB9LAorICAgIHsgIm1ldGhv
ZFdpdGhTZXF1ZW5jZUFyZyIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qp
c3RhdGljX2Nhc3Q8TmF0aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rp
b25NZXRob2RXaXRoU2VxdWVuY2VBcmcpLCAoaW50cHRyX3QpMSwgTm9JbnRyaW5zaWMgfSwKKyAg
ICB7ICJudWxsYWJsZUFycmF5QXJnIiwgRG9udERlbGV0ZSB8IEpTQzo6RnVuY3Rpb24sIChpbnRw
dHJfdClzdGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4oanNUZXN0VHlwZWRlZnNQcm90b3R5cGVG
dW5jdGlvbk51bGxhYmxlQXJyYXlBcmcpLCAoaW50cHRyX3QpMSwgTm9JbnRyaW5zaWMgfSwKKyAg
ICB7ICJmdW5jV2l0aENsYW1wIiwgRG9udERlbGV0ZSB8IEpTQzo6RnVuY3Rpb24sIChpbnRwdHJf
dClzdGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4oanNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5j
dGlvbkZ1bmNXaXRoQ2xhbXApLCAoaW50cHRyX3QpMiwgTm9JbnRyaW5zaWMgfSwKKyAgICB7ICJp
bW11dGFibGVQb2ludEZ1bmN0aW9uIiwgRG9udERlbGV0ZSB8IEpTQzo6RnVuY3Rpb24sIChpbnRw
dHJfdClzdGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4oanNUZXN0VHlwZWRlZnNQcm90b3R5cGVG
dW5jdGlvbkltbXV0YWJsZVBvaW50RnVuY3Rpb24pLCAoaW50cHRyX3QpMCwgTm9JbnRyaW5zaWMg
fSwKKyAgICB7ICJzdHJpbmdBcnJheUZ1bmN0aW9uIiwgRG9udERlbGV0ZSB8IEpTQzo6RnVuY3Rp
b24sIChpbnRwdHJfdClzdGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4oanNUZXN0VHlwZWRlZnNQ
cm90b3R5cGVGdW5jdGlvblN0cmluZ0FycmF5RnVuY3Rpb24pLCAoaW50cHRyX3QpMSwgTm9JbnRy
aW5zaWMgfSwKKyAgICB7IDAsIDAsIDAsIDAsIE5vSW50cmluc2ljIH0KK307CisKK3N0YXRpYyBj
b25zdCBIYXNoVGFibGUgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGVUYWJsZSA9IHsgMTcsIDE1LCBK
U1Rlc3RUeXBlZGVmc1Byb3RvdHlwZVRhYmxlVmFsdWVzLCAwIH07Citjb25zdCBDbGFzc0luZm8g
SlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6OnNfaW5mbyA9IHsgIlRlc3RUeXBlZGVmc1Byb3RvdHlw
ZSIsICZCYXNlOjpzX2luZm8sICZKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZVRhYmxlLCAwLCBDUkVB
VEVfTUVUSE9EX1RBQkxFKEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlKSB9OworCitKU09iamVjdCog
SlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6OnNlbGYoRXhlY1N0YXRlKiBleGVjLCBKU0dsb2JhbE9i
amVjdCogZ2xvYmFsT2JqZWN0KQoreworICAgIHJldHVybiBnZXRET01Qcm90b3R5cGU8SlNUZXN0
VHlwZWRlZnM+KGV4ZWMsIGdsb2JhbE9iamVjdCk7Cit9CisKK2Jvb2wgSlNUZXN0VHlwZWRlZnNQ
cm90b3R5cGU6OmdldE93blByb3BlcnR5U2xvdChKU0NlbGwqIGNlbGwsIEV4ZWNTdGF0ZSogZXhl
YywgUHJvcGVydHlOYW1lIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQoreworICAg
IEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEpTVGVzdFR5cGVk
ZWZzUHJvdG90eXBlKj4oY2VsbCk7CisgICAgcmV0dXJuIGdldFN0YXRpY0Z1bmN0aW9uU2xvdDxK
U09iamVjdD4oZXhlYywgJkpTVGVzdFR5cGVkZWZzUHJvdG90eXBlVGFibGUsIHRoaXNPYmplY3Qs
IHByb3BlcnR5TmFtZSwgc2xvdCk7Cit9CisKK2Jvb2wgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6
OmdldE93blByb3BlcnR5RGVzY3JpcHRvcihKU09iamVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4
ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5RGVzY3JpcHRvciYgZGVzY3Jp
cHRvcikKK3sKKyAgICBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSogdGhpc09iamVjdCA9IGpzQ2Fz
dDxKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSo+KG9iamVjdCk7CisgICAgcmV0dXJuIGdldFN0YXRp
Y0Z1bmN0aW9uRGVzY3JpcHRvcjxKU09iamVjdD4oZXhlYywgJkpTVGVzdFR5cGVkZWZzUHJvdG90
eXBlVGFibGUsIHRoaXNPYmplY3QsIHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcik7Cit9CisKK2Nv
bnN0IENsYXNzSW5mbyBKU1Rlc3RUeXBlZGVmczo6c19pbmZvID0geyAiVGVzdFR5cGVkZWZzIiwg
JkJhc2U6OnNfaW5mbywgJkpTVGVzdFR5cGVkZWZzVGFibGUsIDAgLCBDUkVBVEVfTUVUSE9EX1RB
QkxFKEpTVGVzdFR5cGVkZWZzKSB9OworCitKU1Rlc3RUeXBlZGVmczo6SlNUZXN0VHlwZWRlZnMo
U3RydWN0dXJlKiBzdHJ1Y3R1cmUsIEpTRE9NR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIFBh
c3NSZWZQdHI8VGVzdFR5cGVkZWZzPiBpbXBsKQorICAgIDogSlNET01XcmFwcGVyKHN0cnVjdHVy
ZSwgZ2xvYmFsT2JqZWN0KQorICAgICwgbV9pbXBsKGltcGwubGVha1JlZigpKQoreworfQorCit2
b2lkIEpTVGVzdFR5cGVkZWZzOjpmaW5pc2hDcmVhdGlvbihKU0dsb2JhbERhdGEmIGdsb2JhbERh
dGEpCit7CisgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24oZ2xvYmFsRGF0YSk7CisgICAgQVNTRVJU
KGluaGVyaXRzKCZzX2luZm8pKTsKK30KKworSlNPYmplY3QqIEpTVGVzdFR5cGVkZWZzOjpjcmVh
dGVQcm90b3R5cGUoRXhlY1N0YXRlKiBleGVjLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0
KQoreworICAgIHJldHVybiBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZTo6Y3JlYXRlKGV4ZWMtPmds
b2JhbERhdGEoKSwgZ2xvYmFsT2JqZWN0LCBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZTo6Y3JlYXRl
U3RydWN0dXJlKGdsb2JhbE9iamVjdC0+Z2xvYmFsRGF0YSgpLCBnbG9iYWxPYmplY3QsIGdsb2Jh
bE9iamVjdC0+b2JqZWN0UHJvdG90eXBlKCkpKTsKK30KKwordm9pZCBKU1Rlc3RUeXBlZGVmczo6
ZGVzdHJveShKU0M6OkpTQ2VsbCogY2VsbCkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogdGhpc09i
amVjdCA9IHN0YXRpY19jYXN0PEpTVGVzdFR5cGVkZWZzKj4oY2VsbCk7CisgICAgdGhpc09iamVj
dC0+SlNUZXN0VHlwZWRlZnM6On5KU1Rlc3RUeXBlZGVmcygpOworfQorCitKU1Rlc3RUeXBlZGVm
czo6fkpTVGVzdFR5cGVkZWZzKCkKK3sKKyAgICByZWxlYXNlSW1wbElmTm90TnVsbCgpOworfQor
Citib29sIEpTVGVzdFR5cGVkZWZzOjpnZXRPd25Qcm9wZXJ0eVNsb3QoSlNDZWxsKiBjZWxsLCBF
eGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYg
c2xvdCkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogdGhpc09iamVjdCA9IGpzQ2FzdDxKU1Rlc3RU
eXBlZGVmcyo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVj
dCwgJnNfaW5mbyk7CisgICAgcmV0dXJuIGdldFN0YXRpY1ZhbHVlU2xvdDxKU1Rlc3RUeXBlZGVm
cywgQmFzZT4oZXhlYywgJkpTVGVzdFR5cGVkZWZzVGFibGUsIHRoaXNPYmplY3QsIHByb3BlcnR5
TmFtZSwgc2xvdCk7Cit9CisKK2Jvb2wgSlNUZXN0VHlwZWRlZnM6OmdldE93blByb3BlcnR5RGVz
Y3JpcHRvcihKU09iamVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBw
cm9wZXJ0eU5hbWUsIFByb3BlcnR5RGVzY3JpcHRvciYgZGVzY3JpcHRvcikKK3sKKyAgICBKU1Rl
c3RUeXBlZGVmcyogdGhpc09iamVjdCA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KG9iamVjdCk7
CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCAmc19pbmZvKTsKKyAg
ICByZXR1cm4gZ2V0U3RhdGljVmFsdWVEZXNjcmlwdG9yPEpTVGVzdFR5cGVkZWZzLCBCYXNlPihl
eGVjLCAmSlNUZXN0VHlwZWRlZnNUYWJsZSwgdGhpc09iamVjdCwgcHJvcGVydHlOYW1lLCBkZXNj
cmlwdG9yKTsKK30KKworSlNWYWx1ZSBqc1Rlc3RUeXBlZGVmc1Vuc2lnbmVkTG9uZ0xvbmdBdHRy
KEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSBzbG90QmFzZSwgUHJvcGVydHlOYW1lKQoreworICAg
IEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNP
YmplY3Qoc2xvdEJhc2UpKTsKKyAgICBVTlVTRURfUEFSQU0oZXhlYyk7CisgICAgVGVzdFR5cGVk
ZWZzKiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgp
KTsKKyAgICBKU1ZhbHVlIHJlc3VsdCA9IGpzTnVtYmVyKGltcGwtPnVuc2lnbmVkTG9uZ0xvbmdB
dHRyKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworSlNWYWx1ZSBqc1Rlc3RUeXBlZGVm
c0ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUg
c2xvdEJhc2UsIFByb3BlcnR5TmFtZSkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhp
cyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHNsb3RCYXNlKSk7CisgICAgVU5V
U0VEX1BBUkFNKGV4ZWMpOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRl
c3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgSlNWYWx1ZSByZXN1bHQgPSBp
bXBsLT5pbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSA/IGltcGwtPmltbXV0YWJsZVNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZSgpLT5kZXNlcmlhbGl6ZShleGVjLCBjYXN0ZWRUaGlzLT5nbG9i
YWxPYmplY3QoKSwgMCkgOiBqc051bGwoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0pT
VmFsdWUganNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvclRlc3RTdWJPYmooRXhlY1N0YXRlKiBleGVj
LCBKU1ZhbHVlIHNsb3RCYXNlLCBQcm9wZXJ0eU5hbWUpCit7CisgICAgSlNUZXN0VHlwZWRlZnMq
IGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihhc09iamVjdChzbG90QmFzZSkp
OworICAgIHJldHVybiBKU1Rlc3RTdWJPYmo6OmdldENvbnN0cnVjdG9yKGV4ZWMsIGNhc3RlZFRo
aXMtPmdsb2JhbE9iamVjdCgpKTsKK30KKworCitKU1ZhbHVlIGpzVGVzdFR5cGVkZWZzQ29uc3Ry
dWN0b3IoRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIHNsb3RCYXNlLCBQcm9wZXJ0eU5hbWUpCit7
CisgICAgSlNUZXN0VHlwZWRlZnMqIGRvbU9iamVjdCA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+
KGFzT2JqZWN0KHNsb3RCYXNlKSk7CisgICAgcmV0dXJuIEpTVGVzdFR5cGVkZWZzOjpnZXRDb25z
dHJ1Y3RvcihleGVjLCBkb21PYmplY3QtPmdsb2JhbE9iamVjdCgpKTsKK30KKwordm9pZCBKU1Rl
c3RUeXBlZGVmczo6cHV0KEpTQ2VsbCogY2VsbCwgRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5h
bWUgcHJvcGVydHlOYW1lLCBKU1ZhbHVlIHZhbHVlLCBQdXRQcm9wZXJ0eVNsb3QmIHNsb3QpCit7
CisgICAgSlNUZXN0VHlwZWRlZnMqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMq
PihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKHRoaXNPYmplY3QsICZzX2lu
Zm8pOworICAgIGxvb2t1cFB1dDxKU1Rlc3RUeXBlZGVmcywgQmFzZT4oZXhlYywgcHJvcGVydHlO
YW1lLCB2YWx1ZSwgJkpTVGVzdFR5cGVkZWZzVGFibGUsIHRoaXNPYmplY3QsIHNsb3QpOworfQor
Cit2b2lkIHNldEpTVGVzdFR5cGVkZWZzVW5zaWduZWRMb25nTG9uZ0F0dHIoRXhlY1N0YXRlKiBl
eGVjLCBKU09iamVjdCogdGhpc09iamVjdCwgSlNWYWx1ZSB2YWx1ZSkKK3sKKyAgICBVTlVTRURf
UEFSQU0oZXhlYyk7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNU
ZXN0VHlwZWRlZnMqPih0aGlzT2JqZWN0KTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBzdGF0
aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIGltcGwtPnNl
dFVuc2lnbmVkTG9uZ0xvbmdBdHRyKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4odmFs
dWUudG9JbnRlZ2VyKGV4ZWMpKSk7Cit9CisKKwordm9pZCBzZXRKU1Rlc3RUeXBlZGVmc0ltbXV0
YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlz
T2JqZWN0LCBKU1ZhbHVlIHZhbHVlKQoreworICAgIFVOVVNFRF9QQVJBTShleGVjKTsKKyAgICBK
U1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KHRoaXNP
YmplY3QpOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVm
cyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgaW1wbC0+c2V0SW1tdXRhYmxlU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlKFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGV4ZWMsIHZhbHVlLCAw
LCAwKSk7Cit9CisKKworSlNWYWx1ZSBKU1Rlc3RUeXBlZGVmczo6Z2V0Q29uc3RydWN0b3IoRXhl
Y1N0YXRlKiBleGVjLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQoreworICAgIHJldHVy
biBnZXRET01Db25zdHJ1Y3RvcjxKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yPihleGVjLCBqc0Nh
c3Q8SlNET01HbG9iYWxPYmplY3QqPihnbG9iYWxPYmplY3QpKTsKK30KKworRW5jb2RlZEpTVmFs
dWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uRnVuYyhFeGVj
U3RhdGUqIGV4ZWMpCit7CisgICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1Zh
bHVlKCk7CisgICAgaWYgKCF0aGlzVmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2lu
Zm8pKQorICAgICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RU
eXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRo
aXNWYWx1ZSkpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpT
VGVzdFR5cGVkZWZzOjpzX2luZm8pOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19j
YXN0PFRlc3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisKKyAgICBzaXplX3QgYXJn
c0NvdW50ID0gZXhlYy0+YXJndW1lbnRDb3VudCgpOworICAgIGlmIChhcmdzQ291bnQgPD0gMCkg
eworICAgICAgICBpbXBsLT5mdW5jKCk7CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUo
anNVbmRlZmluZWQoKSk7CisgICAgfQorCisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50Q291bnQoKSA+
IDAgJiYgIWV4ZWMtPmFyZ3VtZW50KDApLmlzVW5kZWZpbmVkT3JOdWxsKCkgJiYgIWV4ZWMtPmFy
Z3VtZW50KDApLmluaGVyaXRzKCZKU2xvbmdbXTo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIHRo
cm93Vk1UeXBlRXJyb3IoZXhlYyk7CisgICAgVmVjdG9yPGludD4geCh0b05hdGl2ZUFycmF5PGlu
dD4oZXhlYywgTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZp
bmVkKSkpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIEpT
VmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICBpbXBsLT5mdW5jKHgpOworICAgIHJl
dHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Cit9CisKK0VuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk11bHRpVHJhbnNm
ZXJMaXN0KEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBKU1ZhbHVlIHRoaXNWYWx1ZSA9IGV4ZWMt
Pmhvc3RUaGlzVmFsdWUoKTsKKyAgICBpZiAoIXRoaXNWYWx1ZS5pbmhlcml0cygmSlNUZXN0VHlw
ZWRlZnM6OnNfaW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd1ZNVHlwZUVycm9yKGV4ZWMpOwor
ICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4o
YXNPYmplY3QodGhpc1ZhbHVlKSk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyhjYXN0
ZWRUaGlzLCAmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbyk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBs
ID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBp
ZiAoZXhlYy0+YXJndW1lbnRDb3VudCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1FcnJv
cihleGVjLCBjcmVhdGVOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihleGVjKSk7CisgICAgUmVmUHRy
PFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gZmlyc3QoU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVh
dGUoZXhlYywgTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZp
bmVkKSwgMCwgMCkpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKworICAgIHNpemVfdCBhcmdzQ291
bnQgPSBleGVjLT5hcmd1bWVudENvdW50KCk7CisgICAgaWYgKGFyZ3NDb3VudCA8PSAxKSB7Cisg
ICAgICAgIGltcGwtPm11bHRpVHJhbnNmZXJMaXN0KGZpcnN0KTsKKyAgICAgICAgcmV0dXJuIEpT
VmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICB9CisKKyAgICBBcnJheSogdHgodG9B
cnJheShNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAxLCBEZWZhdWx0SXNVbmRlZmluZWQp
KSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1
ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAgIGlmIChhcmdzQ291bnQgPD0gMikgeworICAg
ICAgICBpbXBsLT5tdWx0aVRyYW5zZmVyTGlzdChmaXJzdCwgdHgpOworICAgICAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAgIH0KKworICAgIFJlZlB0cjxTZXJp
YWxpemVkU2NyaXB0VmFsdWU+IHNlY29uZChTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShl
eGVjLCBNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAyLCBEZWZhdWx0SXNVbmRlZmluZWQp
LCAwLCAwKSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAgIGlmIChhcmdzQ291bnQgPD0gMykg
eworICAgICAgICBpbXBsLT5tdWx0aVRyYW5zZmVyTGlzdChmaXJzdCwgdHgsIHNlY29uZCk7Cisg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgfQorCisg
ICAgQXJyYXkqIHR4eCh0b0FycmF5KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDMsIERl
ZmF1bHRJc1VuZGVmaW5lZCkpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAg
ICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgaW1wbC0+bXVs
dGlUcmFuc2Zlckxpc3QoZmlyc3QsIHR4LCBzZWNvbmQsIHR4eCk7CisgICAgcmV0dXJuIEpTVmFs
dWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uU2V0U2hhZG93KEV4ZWNTdGF0ZSog
ZXhlYykKK3sKKyAgICBKU1ZhbHVlIHRoaXNWYWx1ZSA9IGV4ZWMtPmhvc3RUaGlzVmFsdWUoKTsK
KyAgICBpZiAoIXRoaXNWYWx1ZS5pbmhlcml0cygmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbykpCisg
ICAgICAgIHJldHVybiB0aHJvd1ZNVHlwZUVycm9yKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZz
KiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3QodGhpc1ZhbHVl
KSk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyhjYXN0ZWRUaGlzLCAmSlNUZXN0VHlw
ZWRlZnM6OnNfaW5mbyk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVz
dFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBpZiAoZXhlYy0+YXJndW1lbnRD
b3VudCgpIDwgMykKKyAgICAgICAgcmV0dXJuIHRocm93Vk1FcnJvcihleGVjLCBjcmVhdGVOb3RF
bm91Z2hBcmd1bWVudHNFcnJvcihleGVjKSk7CisgICAgZmxvYXQgd2lkdGgoTUFZQkVfTUlTU0lO
R19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKS50b0Zsb2F0KGV4ZWMpKTsK
KyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjpl
bmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgZmxvYXQgaGVpZ2h0KE1BWUJFX01JU1NJTkdfUEFS
QU1FVEVSKGV4ZWMsIDEsIERlZmF1bHRJc1VuZGVmaW5lZCkudG9GbG9hdChleGVjKSk7CisgICAg
aWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2Rl
KGpzVW5kZWZpbmVkKCkpOworICAgIGZsb2F0IGJsdXIoTUFZQkVfTUlTU0lOR19QQVJBTUVURVIo
ZXhlYywgMiwgRGVmYXVsdElzVW5kZWZpbmVkKS50b0Zsb2F0KGV4ZWMpKTsKKyAgICBpZiAoZXhl
Yy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRl
ZmluZWQoKSk7CisKKyAgICBzaXplX3QgYXJnc0NvdW50ID0gZXhlYy0+YXJndW1lbnRDb3VudCgp
OworICAgIGlmIChhcmdzQ291bnQgPD0gMykgeworICAgICAgICBpbXBsLT5zZXRTaGFkb3cod2lk
dGgsIGhlaWdodCwgYmx1cik7CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRl
ZmluZWQoKSk7CisgICAgfQorCisgICAgY29uc3QgU3RyaW5nJiBjb2xvcihNQVlCRV9NSVNTSU5H
X1BBUkFNRVRFUihleGVjLCAzLCBEZWZhdWx0SXNVbmRlZmluZWQpLmlzRW1wdHkoKSA/IFN0cmlu
ZygpIDogTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMywgRGVmYXVsdElzVW5kZWZpbmVk
KS50b1N0cmluZyhleGVjKS0+dmFsdWUoZXhlYykpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRp
b24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAg
ICBpZiAoYXJnc0NvdW50IDw9IDQpIHsKKyAgICAgICAgaW1wbC0+c2V0U2hhZG93KHdpZHRoLCBo
ZWlnaHQsIGJsdXIsIGNvbG9yKTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1Vu
ZGVmaW5lZCgpKTsKKyAgICB9CisKKyAgICBmbG9hdCBhbHBoYShNQVlCRV9NSVNTSU5HX1BBUkFN
RVRFUihleGVjLCA0LCBEZWZhdWx0SXNVbmRlZmluZWQpLnRvRmxvYXQoZXhlYykpOworICAgIGlm
IChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShq
c1VuZGVmaW5lZCgpKTsKKyAgICBpbXBsLT5zZXRTaGFkb3cod2lkdGgsIGhlaWdodCwgYmx1ciwg
Y29sb3IsIGFscGhhKTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkp
OworfQorCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90
eXBlRnVuY3Rpb25NZXRob2RXaXRoU2VxdWVuY2VBcmcoRXhlY1N0YXRlKiBleGVjKQoreworICAg
IEpTVmFsdWUgdGhpc1ZhbHVlID0gZXhlYy0+aG9zdFRoaXNWYWx1ZSgpOworICAgIGlmICghdGhp
c1ZhbHVlLmluaGVyaXRzKCZKU1Rlc3RUeXBlZGVmczo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJu
IHRocm93Vk1UeXBlRXJyb3IoZXhlYyk7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMg
PSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihhc09iamVjdCh0aGlzVmFsdWUpKTsKKyAgICBBU1NF
UlRfR0NfT0JKRUNUX0lOSEVSSVRTKGNhc3RlZFRoaXMsICZKU1Rlc3RUeXBlZGVmczo6c19pbmZv
KTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBzdGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihj
YXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIGlmIChleGVjLT5hcmd1bWVudENvdW50KCkgPCAxKQor
ICAgICAgICByZXR1cm4gdGhyb3dWTUVycm9yKGV4ZWMsIGNyZWF0ZU5vdEVub3VnaEFyZ3VtZW50
c0Vycm9yKGV4ZWMpKTsKKyAgICBWZWN0b3I8UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4+
IHNlcXVlbmNlQXJnKCh0b1JlZlB0ck5hdGl2ZUFycmF5PFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSwg
SlNTZXJpYWxpemVkU2NyaXB0VmFsdWU+KGV4ZWMsIE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4
ZWMsIDAsIERlZmF1bHRJc1VuZGVmaW5lZCksICZ0b1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZSkpKTsK
KyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjpl
bmNvZGUoanNVbmRlZmluZWQoKSk7CisKKyAgICBKU0M6OkpTVmFsdWUgcmVzdWx0ID0ganNOdW1i
ZXIoaW1wbC0+bWV0aG9kV2l0aFNlcXVlbmNlQXJnKHNlcXVlbmNlQXJnKSk7CisgICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZShyZXN1bHQpOworfQorCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9D
QUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25OdWxsYWJsZUFycmF5QXJnKEV4ZWNT
dGF0ZSogZXhlYykKK3sKKyAgICBKU1ZhbHVlIHRoaXNWYWx1ZSA9IGV4ZWMtPmhvc3RUaGlzVmFs
dWUoKTsKKyAgICBpZiAoIXRoaXNWYWx1ZS5pbmhlcml0cygmSlNUZXN0VHlwZWRlZnM6OnNfaW5m
bykpCisgICAgICAgIHJldHVybiB0aHJvd1ZNVHlwZUVycm9yKGV4ZWMpOworICAgIEpTVGVzdFR5
cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3QodGhp
c1ZhbHVlKSk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyhjYXN0ZWRUaGlzLCAmSlNU
ZXN0VHlwZWRlZnM6OnNfaW5mbyk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGljX2Nh
c3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBpZiAoZXhlYy0+YXJn
dW1lbnRDb3VudCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1FcnJvcihleGVjLCBjcmVh
dGVOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihleGVjKSk7CisgICAgVmVjdG9yPFN0cmluZz4gYXJy
YXlBcmcodG9OYXRpdmVBcnJheTxTdHJpbmc+KGV4ZWMsIE1BWUJFX01JU1NJTkdfUEFSQU1FVEVS
KGV4ZWMsIDAsIERlZmF1bHRJc1VuZGVmaW5lZCkpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0
aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7Cisg
ICAgaW1wbC0+bnVsbGFibGVBcnJheUFyZyhhcnJheUFyZyk7CisgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FM
TCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uRnVuY1dpdGhDbGFtcChFeGVjU3RhdGUq
IGV4ZWMpCit7CisgICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7
CisgICAgaWYgKCF0aGlzVmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pKQor
ICAgICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVm
cyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1
ZSkpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5
cGVkZWZzOjpzX2luZm8pOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRl
c3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50
Q291bnQoKSA8IDEpCisgICAgICAgIHJldHVybiB0aHJvd1ZNRXJyb3IoZXhlYywgY3JlYXRlTm90
RW5vdWdoQXJndW1lbnRzRXJyb3IoZXhlYykpOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBhcmcx
ID0gMDsKKyAgICBkb3VibGUgYXJnMU5hdGl2ZVZhbHVlID0gZXhlYy0+YXJndW1lbnQoMCkudG9O
dW1iZXIoZXhlYyk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1
cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworCisgICAgaWYgKCFpc25hbihhcmcx
TmF0aXZlVmFsdWUpKQorICAgICAgICBhcmcxID0gY2xhbXBUbzx1bnNpZ25lZCBsb25nIGxvbmc+
KGFyZzFOYXRpdmVWYWx1ZSk7CisKKworICAgIHNpemVfdCBhcmdzQ291bnQgPSBleGVjLT5hcmd1
bWVudENvdW50KCk7CisgICAgaWYgKGFyZ3NDb3VudCA8PSAxKSB7CisgICAgICAgIGltcGwtPmZ1
bmNXaXRoQ2xhbXAoYXJnMSk7CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRl
ZmluZWQoKSk7CisgICAgfQorCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGFyZzIgPSAwOworICAg
IGRvdWJsZSBhcmcyTmF0aXZlVmFsdWUgPSBleGVjLT5hcmd1bWVudCgxKS50b051bWJlcihleGVj
KTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVl
OjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisKKyAgICBpZiAoIWlzbmFuKGFyZzJOYXRpdmVWYWx1
ZSkpCisgICAgICAgIGFyZzIgPSBjbGFtcFRvPHVuc2lnbmVkIGxvbmcgbG9uZz4oYXJnMk5hdGl2
ZVZhbHVlKTsKKworICAgIGltcGwtPmZ1bmNXaXRoQ2xhbXAoYXJnMSwgYXJnMik7CisgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUg
SlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uSW1tdXRhYmxlUG9p
bnRGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBl
eGVjLT5ob3N0VGhpc1ZhbHVlKCk7CisgICAgaWYgKCF0aGlzVmFsdWUuaW5oZXJpdHMoJkpTVGVz
dFR5cGVkZWZzOjpzX2luZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihleGVj
KTsKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVm
cyo+KGFzT2JqZWN0KHRoaXNWYWx1ZSkpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFMo
Y2FzdGVkVGhpcywgJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pOworICAgIFRlc3RUeXBlZGVmcyog
aW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisK
KyAgICBKU0M6OkpTVmFsdWUgcmVzdWx0ID0gdG9KUyhleGVjLCBjYXN0ZWRUaGlzLT5nbG9iYWxP
YmplY3QoKSwgV1RGOjpnZXRQdHIoU1ZHUHJvcGVydHlUZWFyT2ZmPEZsb2F0UG9pbnQ+OjpjcmVh
dGUoaW1wbC0+aW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpKSkpOworICAgIHJldHVybiBKU1ZhbHVl
OjplbmNvZGUocmVzdWx0KTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rl
c3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uU3RyaW5nQXJyYXlGdW5jdGlvbihFeGVjU3RhdGUq
IGV4ZWMpCit7CisgICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7
CisgICAgaWYgKCF0aGlzVmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pKQor
ICAgICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVm
cyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1
ZSkpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5
cGVkZWZzOjpzX2luZm8pOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRl
c3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50
Q291bnQoKSA8IDEpCisgICAgICAgIHJldHVybiB0aHJvd1ZNRXJyb3IoZXhlYywgY3JlYXRlTm90
RW5vdWdoQXJndW1lbnRzRXJyb3IoZXhlYykpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwor
ICAgIFZlY3RvcjxTdHJpbmc+IHZhbHVlcyh0b05hdGl2ZUFycmF5PFN0cmluZz4oZXhlYywgTUFZ
QkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSkpOworICAg
IGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29k
ZShqc1VuZGVmaW5lZCgpKTsKKworICAgIEpTQzo6SlNWYWx1ZSByZXN1bHQgPSBqc0FycmF5KGV4
ZWMsIGNhc3RlZFRoaXMtPmdsb2JhbE9iamVjdCgpLCBpbXBsLT5zdHJpbmdBcnJheUZ1bmN0aW9u
KHZhbHVlcywgZWMpKTsKKyAgICBzZXRET01FeGNlcHRpb24oZXhlYywgZWMpOworICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUocmVzdWx0KTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzT2Jz
ZXJ2YWJsZShKU1Rlc3RUeXBlZGVmcyoganNUZXN0VHlwZWRlZnMpCit7CisgICAgaWYgKGpzVGVz
dFR5cGVkZWZzLT5oYXNDdXN0b21Qcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVybiB0cnVlOwor
ICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBKU1Rlc3RUeXBlZGVmc093bmVyOjppc1JlYWNo
YWJsZUZyb21PcGFxdWVSb290cyhKU0M6OkhhbmRsZTxKU0M6OlVua25vd24+IGhhbmRsZSwgdm9p
ZCosIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIEpTVGVzdFR5cGVkZWZzKiBqc1Rlc3RU
eXBlZGVmcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGhhbmRsZS5nZXQoKS5hc0NlbGwoKSk7
CisgICAgaWYgKCFpc09ic2VydmFibGUoanNUZXN0VHlwZWRlZnMpKQorICAgICAgICByZXR1cm4g
ZmFsc2U7CisgICAgVU5VU0VEX1BBUkFNKHZpc2l0b3IpOworICAgIHJldHVybiBmYWxzZTsKK30K
Kwordm9pZCBKU1Rlc3RUeXBlZGVmc093bmVyOjpmaW5hbGl6ZShKU0M6OkhhbmRsZTxKU0M6OlVu
a25vd24+IGhhbmRsZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyoganNU
ZXN0VHlwZWRlZnMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihoYW5kbGUuZ2V0KCkuYXNDZWxs
KCkpOworICAgIERPTVdyYXBwZXJXb3JsZCogd29ybGQgPSBzdGF0aWNfY2FzdDxET01XcmFwcGVy
V29ybGQqPihjb250ZXh0KTsKKyAgICB1bmNhY2hlV3JhcHBlcih3b3JsZCwganNUZXN0VHlwZWRl
ZnMtPmltcGwoKSwganNUZXN0VHlwZWRlZnMpOworICAgIGpzVGVzdFR5cGVkZWZzLT5yZWxlYXNl
SW1wbCgpOworfQorCitKU0M6OkpTVmFsdWUgdG9KUyhKU0M6OkV4ZWNTdGF0ZSogZXhlYywgSlNE
T01HbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgVGVzdFR5cGVkZWZzKiBpbXBsKQoreworICAg
IHJldHVybiB3cmFwPEpTVGVzdFR5cGVkZWZzPihleGVjLCBnbG9iYWxPYmplY3QsIGltcGwpOwor
fQorCitUZXN0VHlwZWRlZnMqIHRvVGVzdFR5cGVkZWZzKEpTQzo6SlNWYWx1ZSB2YWx1ZSkKK3sK
KyAgICByZXR1cm4gdmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pID8ganND
YXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3QodmFsdWUpKS0+aW1wbCgpIDogMDsKK30KKwor
fQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pT
VGVzdFR5cGVkZWZzLmggYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMv
SlNUZXN0VHlwZWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4wY2I5MmJmNjU2ZGZhYmEwZDgxODExOTY1MmQ4
NmE5NDZlNWFkMDE2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L0pTL0pTVGVzdFR5cGVkZWZzLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisg
ICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNvdXJjZSBwcm9qZWN0Lgor
ICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtYmluZGluZ3MucGwu
IERPIE5PVCBNT0RJRlkhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJt
cyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxp
c2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9u
IDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24u
CisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3
aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZl
biB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNT
IEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhh
dmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNl
bnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJ
Qi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJ
bmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIx
MTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBKU1Rlc3RUeXBlZGVmc19oCisjZGVmaW5lIEpT
VGVzdFR5cGVkZWZzX2gKKworI2luY2x1ZGUgIkpTRE9NQmluZGluZy5oIgorI2luY2x1ZGUgIlRl
c3RUeXBlZGVmcy5oIgorI2luY2x1ZGUgPHJ1bnRpbWUvSlNHbG9iYWxPYmplY3QuaD4KKyNpbmNs
dWRlIDxydW50aW1lL0pTT2JqZWN0Lmg+CisjaW5jbHVkZSA8cnVudGltZS9PYmplY3RQcm90b3R5
cGUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBKU1Rlc3RUeXBlZGVmcyA6IHB1
YmxpYyBKU0RPTVdyYXBwZXIgeworcHVibGljOgorICAgIHR5cGVkZWYgSlNET01XcmFwcGVyIEJh
c2U7CisgICAgc3RhdGljIEpTVGVzdFR5cGVkZWZzKiBjcmVhdGUoSlNDOjpTdHJ1Y3R1cmUqIHN0
cnVjdHVyZSwgSlNET01HbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgUGFzc1JlZlB0cjxUZXN0
VHlwZWRlZnM+IGltcGwpCisgICAgeworICAgICAgICBKU1Rlc3RUeXBlZGVmcyogcHRyID0gbmV3
IChOb3ROdWxsLCBKU0M6OmFsbG9jYXRlQ2VsbDxKU1Rlc3RUeXBlZGVmcz4oZ2xvYmFsT2JqZWN0
LT5nbG9iYWxEYXRhKCkuaGVhcCkpIEpTVGVzdFR5cGVkZWZzKHN0cnVjdHVyZSwgZ2xvYmFsT2Jq
ZWN0LCBpbXBsKTsKKyAgICAgICAgcHRyLT5maW5pc2hDcmVhdGlvbihnbG9iYWxPYmplY3QtPmds
b2JhbERhdGEoKSk7CisgICAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisgICAgc3RhdGljIEpT
Qzo6SlNPYmplY3QqIGNyZWF0ZVByb3RvdHlwZShKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNHbG9i
YWxPYmplY3QqKTsKKyAgICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3QoSlNDOjpKU0Nl
bGwqLCBKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6UHJvcGVydHlOYW1lLCBKU0M6OlByb3BlcnR5U2xv
dCYpOworICAgIHN0YXRpYyBib29sIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihKU0M6OkpTT2Jq
ZWN0KiwgSlNDOjpFeGVjU3RhdGUqLCBKU0M6OlByb3BlcnR5TmFtZSwgSlNDOjpQcm9wZXJ0eURl
c2NyaXB0b3ImKTsKKyAgICBzdGF0aWMgdm9pZCBwdXQoSlNDOjpKU0NlbGwqLCBKU0M6OkV4ZWNT
dGF0ZSosIEpTQzo6UHJvcGVydHlOYW1lLCBKU0M6OkpTVmFsdWUsIEpTQzo6UHV0UHJvcGVydHlT
bG90Jik7CisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0M6OkpTQ2VsbCopOworICAgIH5KU1Rl
c3RUeXBlZGVmcygpOworICAgIHN0YXRpYyBjb25zdCBKU0M6OkNsYXNzSW5mbyBzX2luZm87CisK
KyAgICBzdGF0aWMgSlNDOjpTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShKU0M6OkpTR2xvYmFs
RGF0YSYgZ2xvYmFsRGF0YSwgSlNDOjpKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU0M6
OkpTVmFsdWUgcHJvdG90eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEpTQzo6U3RydWN0dXJl
OjpjcmVhdGUoZ2xvYmFsRGF0YSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5cGUsIEpTQzo6VHlwZUlu
Zm8oSlNDOjpPYmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyksICZzX2luZm8pOworICAgIH0KKwor
ICAgIHN0YXRpYyBKU0M6OkpTVmFsdWUgZ2V0Q29uc3RydWN0b3IoSlNDOjpFeGVjU3RhdGUqLCBK
U0M6OkpTR2xvYmFsT2JqZWN0Kik7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsKCkgY29uc3QgeyBy
ZXR1cm4gbV9pbXBsOyB9CisgICAgdm9pZCByZWxlYXNlSW1wbCgpIHsgbV9pbXBsLT5kZXJlZigp
OyBtX2ltcGwgPSAwOyB9CisKKyAgICB2b2lkIHJlbGVhc2VJbXBsSWZOb3ROdWxsKCkgeyBpZiAo
bV9pbXBsKSB7IG1faW1wbC0+ZGVyZWYoKTsgbV9pbXBsID0gMDsgfSB9CisKK3ByaXZhdGU6Cisg
ICAgVGVzdFR5cGVkZWZzKiBtX2ltcGw7Citwcm90ZWN0ZWQ6CisgICAgSlNUZXN0VHlwZWRlZnMo
SlNDOjpTdHJ1Y3R1cmUqLCBKU0RPTUdsb2JhbE9iamVjdCosIFBhc3NSZWZQdHI8VGVzdFR5cGVk
ZWZzPik7CisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihKU0M6OkpTR2xvYmFsRGF0YSYpOworICAg
IHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEpTQzo6T3ZlcnJpZGVzR2V0
T3duUHJvcGVydHlTbG90IHwgSlNDOjpJbnRlcmNlcHRzR2V0T3duUHJvcGVydHlTbG90QnlJbmRl
eEV2ZW5XaGVuTGVuZ3RoSXNOb3RaZXJvIHwgQmFzZTo6U3RydWN0dXJlRmxhZ3M7Cit9OworCitj
bGFzcyBKU1Rlc3RUeXBlZGVmc093bmVyIDogcHVibGljIEpTQzo6V2Vha0hhbmRsZU93bmVyIHsK
K3B1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgaXNSZWFjaGFibGVGcm9tT3BhcXVlUm9vdHMoSlND
OjpIYW5kbGU8SlNDOjpVbmtub3duPiwgdm9pZCogY29udGV4dCwgSlNDOjpTbG90VmlzaXRvciYp
OworICAgIHZpcnR1YWwgdm9pZCBmaW5hbGl6ZShKU0M6OkhhbmRsZTxKU0M6OlVua25vd24+LCB2
b2lkKiBjb250ZXh0KTsKK307CisKK2lubGluZSBKU0M6OldlYWtIYW5kbGVPd25lciogd3JhcHBl
ck93bmVyKERPTVdyYXBwZXJXb3JsZCosIFRlc3RUeXBlZGVmcyopCit7CisgICAgREVGSU5FX1NU
QVRJQ19MT0NBTChKU1Rlc3RUeXBlZGVmc093bmVyLCBqc1Rlc3RUeXBlZGVmc093bmVyLCAoKSk7
CisgICAgcmV0dXJuICZqc1Rlc3RUeXBlZGVmc093bmVyOworfQorCitpbmxpbmUgdm9pZCogd3Jh
cHBlckNvbnRleHQoRE9NV3JhcHBlcldvcmxkKiB3b3JsZCwgVGVzdFR5cGVkZWZzKikKK3sKKyAg
ICByZXR1cm4gd29ybGQ7Cit9CisKK0pTQzo6SlNWYWx1ZSB0b0pTKEpTQzo6RXhlY1N0YXRlKiwg
SlNET01HbG9iYWxPYmplY3QqLCBUZXN0VHlwZWRlZnMqKTsKK1Rlc3RUeXBlZGVmcyogdG9UZXN0
VHlwZWRlZnMoSlNDOjpKU1ZhbHVlKTsKKworY2xhc3MgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGUg
OiBwdWJsaWMgSlNDOjpKU05vbkZpbmFsT2JqZWN0IHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEpT
Qzo6SlNOb25GaW5hbE9iamVjdCBCYXNlOworICAgIHN0YXRpYyBKU0M6OkpTT2JqZWN0KiBzZWxm
KEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpKU0dsb2JhbE9iamVjdCopOworICAgIHN0YXRpYyBKU1Rl
c3RUeXBlZGVmc1Byb3RvdHlwZSogY3JlYXRlKEpTQzo6SlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRh
LCBKU0M6OkpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTQzo6U3RydWN0dXJlKiBzdHJ1
Y3R1cmUpCisgICAgeworICAgICAgICBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSogcHRyID0gbmV3
IChOb3ROdWxsLCBKU0M6OmFsbG9jYXRlQ2VsbDxKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZT4oZ2xv
YmFsRGF0YS5oZWFwKSkgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGUoZ2xvYmFsRGF0YSwgZ2xvYmFs
T2JqZWN0LCBzdHJ1Y3R1cmUpOworICAgICAgICBwdHItPmZpbmlzaENyZWF0aW9uKGdsb2JhbERh
dGEpOworICAgICAgICByZXR1cm4gcHRyOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdCBKU0M6
OkNsYXNzSW5mbyBzX2luZm87CisgICAgc3RhdGljIGJvb2wgZ2V0T3duUHJvcGVydHlTbG90KEpT
Qzo6SlNDZWxsKiwgSlNDOjpFeGVjU3RhdGUqLCBKU0M6OlByb3BlcnR5TmFtZSwgSlNDOjpQcm9w
ZXJ0eVNsb3QmKTsKKyAgICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSlND
OjpKU09iamVjdCosIEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpQcm9wZXJ0eU5hbWUsIEpTQzo6UHJv
cGVydHlEZXNjcmlwdG9yJik7CisgICAgc3RhdGljIEpTQzo6U3RydWN0dXJlKiBjcmVhdGVTdHJ1
Y3R1cmUoSlNDOjpKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIEpTQzo6SlNHbG9iYWxPYmplY3Qq
IGdsb2JhbE9iamVjdCwgSlNDOjpKU1ZhbHVlIHByb3RvdHlwZSkKKyAgICB7CisgICAgICAgIHJl
dHVybiBKU0M6OlN0cnVjdHVyZTo6Y3JlYXRlKGdsb2JhbERhdGEsIGdsb2JhbE9iamVjdCwgcHJv
dG90eXBlLCBKU0M6OlR5cGVJbmZvKEpTQzo6T2JqZWN0VHlwZSwgU3RydWN0dXJlRmxhZ3MpLCAm
c19pbmZvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGUo
SlNDOjpKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIEpTQzo6SlNHbG9iYWxPYmplY3QqLCBKU0M6
OlN0cnVjdHVyZSogc3RydWN0dXJlKSA6IEpTQzo6SlNOb25GaW5hbE9iamVjdChnbG9iYWxEYXRh
LCBzdHJ1Y3R1cmUpIHsgfQorcHJvdGVjdGVkOgorICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBT
dHJ1Y3R1cmVGbGFncyA9IEpTQzo6T3ZlcnJpZGVzR2V0T3duUHJvcGVydHlTbG90IHwgQmFzZTo6
U3RydWN0dXJlRmxhZ3M7Cit9OworCitjbGFzcyBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yIDog
cHVibGljIERPTUNvbnN0cnVjdG9yT2JqZWN0IHsKK3ByaXZhdGU6CisgICAgSlNUZXN0VHlwZWRl
ZnNDb25zdHJ1Y3RvcihKU0M6OlN0cnVjdHVyZSosIEpTRE9NR2xvYmFsT2JqZWN0Kik7CisgICAg
dm9pZCBmaW5pc2hDcmVhdGlvbihKU0M6OkV4ZWNTdGF0ZSosIEpTRE9NR2xvYmFsT2JqZWN0Kik7
CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIERPTUNvbnN0cnVjdG9yT2JqZWN0IEJhc2U7CisgICAg
c3RhdGljIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IqIGNyZWF0ZShKU0M6OkV4ZWNTdGF0ZSog
ZXhlYywgSlNDOjpTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgSlNET01HbG9iYWxPYmplY3QqIGdsb2Jh
bE9iamVjdCkKKyAgICB7CisgICAgICAgIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IqIHB0ciA9
IG5ldyAoTm90TnVsbCwgSlNDOjphbGxvY2F0ZUNlbGw8SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rv
cj4oKmV4ZWMtPmhlYXAoKSkpIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3Ioc3RydWN0dXJlLCBn
bG9iYWxPYmplY3QpOworICAgICAgICBwdHItPmZpbmlzaENyZWF0aW9uKGV4ZWMsIGdsb2JhbE9i
amVjdCk7CisgICAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgZ2V0
T3duUHJvcGVydHlTbG90KEpTQzo6SlNDZWxsKiwgSlNDOjpFeGVjU3RhdGUqLCBKU0M6OlByb3Bl
cnR5TmFtZSwgSlNDOjpQcm9wZXJ0eVNsb3QmKTsKKyAgICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9w
ZXJ0eURlc2NyaXB0b3IoSlNDOjpKU09iamVjdCosIEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpQcm9w
ZXJ0eU5hbWUsIEpTQzo6UHJvcGVydHlEZXNjcmlwdG9yJik7CisgICAgc3RhdGljIGNvbnN0IEpT
Qzo6Q2xhc3NJbmZvIHNfaW5mbzsKKyAgICBzdGF0aWMgSlNDOjpTdHJ1Y3R1cmUqIGNyZWF0ZVN0
cnVjdHVyZShKU0M6OkpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgSlNDOjpKU0dsb2JhbE9iamVj
dCogZ2xvYmFsT2JqZWN0LCBKU0M6OkpTVmFsdWUgcHJvdG90eXBlKQorICAgIHsKKyAgICAgICAg
cmV0dXJuIEpTQzo6U3RydWN0dXJlOjpjcmVhdGUoZ2xvYmFsRGF0YSwgZ2xvYmFsT2JqZWN0LCBw
cm90b3R5cGUsIEpTQzo6VHlwZUluZm8oSlNDOjpPYmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyks
ICZzX2luZm8pOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQg
U3RydWN0dXJlRmxhZ3MgPSBKU0M6Ok92ZXJyaWRlc0dldE93blByb3BlcnR5U2xvdCB8IEpTQzo6
SW1wbGVtZW50c0hhc0luc3RhbmNlIHwgRE9NQ29uc3RydWN0b3JPYmplY3Q6OlN0cnVjdHVyZUZs
YWdzOworICAgIHN0YXRpYyBKU0M6OkVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwgY29uc3Ry
dWN0SlNUZXN0VHlwZWRlZnMoSlNDOjpFeGVjU3RhdGUqKTsKKyAgICBzdGF0aWMgSlNDOjpDb25z
dHJ1Y3RUeXBlIGdldENvbnN0cnVjdERhdGEoSlNDOjpKU0NlbGwqLCBKU0M6OkNvbnN0cnVjdERh
dGEmKTsKK307CisKKy8vIEZ1bmN0aW9ucworCitKU0M6OkVuY29kZWRKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbkZ1bmMoSlNDOjpFeGVjU3RhdGUq
KTsKK0pTQzo6RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3Rv
dHlwZUZ1bmN0aW9uTXVsdGlUcmFuc2Zlckxpc3QoSlNDOjpFeGVjU3RhdGUqKTsKK0pTQzo6RW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9u
U2V0U2hhZG93KEpTQzo6RXhlY1N0YXRlKik7CitKU0M6OkVuY29kZWRKU1ZhbHVlIEpTQ19IT1NU
X0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk1ldGhvZFdpdGhTZXF1ZW5jZUFy
ZyhKU0M6OkV4ZWNTdGF0ZSopOworSlNDOjpFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpz
VGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25OdWxsYWJsZUFycmF5QXJnKEpTQzo6RXhlY1N0
YXRlKik7CitKU0M6OkVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQ
cm90b3R5cGVGdW5jdGlvbkZ1bmNXaXRoQ2xhbXAoSlNDOjpFeGVjU3RhdGUqKTsKK0pTQzo6RW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9u
SW1tdXRhYmxlUG9pbnRGdW5jdGlvbihKU0M6OkV4ZWNTdGF0ZSopOworSlNDOjpFbmNvZGVkSlNW
YWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25TdHJpbmdB
cnJheUZ1bmN0aW9uKEpTQzo6RXhlY1N0YXRlKik7CisvLyBBdHRyaWJ1dGVzCisKK0pTQzo6SlNW
YWx1ZSBqc1Rlc3RUeXBlZGVmc1Vuc2lnbmVkTG9uZ0xvbmdBdHRyKEpTQzo6RXhlY1N0YXRlKiwg
SlNDOjpKU1ZhbHVlLCBKU0M6OlByb3BlcnR5TmFtZSk7Cit2b2lkIHNldEpTVGVzdFR5cGVkZWZz
VW5zaWduZWRMb25nTG9uZ0F0dHIoSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTT2JqZWN0KiwgSlND
OjpKU1ZhbHVlKTsKK0pTQzo6SlNWYWx1ZSBqc1Rlc3RUeXBlZGVmc0ltbXV0YWJsZVNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZShKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNWYWx1ZSwgSlNDOjpQcm9wZXJ0
eU5hbWUpOwordm9pZCBzZXRKU1Rlc3RUeXBlZGVmc0ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZShKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNPYmplY3QqLCBKU0M6OkpTVmFsdWUpOworSlND
OjpKU1ZhbHVlIGpzVGVzdFR5cGVkZWZzQ29uc3RydWN0b3JUZXN0U3ViT2JqKEpTQzo6RXhlY1N0
YXRlKiwgSlNDOjpKU1ZhbHVlLCBKU0M6OlByb3BlcnR5TmFtZSk7CitKU0M6OkpTVmFsdWUganNU
ZXN0VHlwZWRlZnNDb25zdHJ1Y3RvcihKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNWYWx1ZSwgSlND
OjpQcm9wZXJ0eU5hbWUpOworCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCisKKyNlbmRpZgpkaWZm
IC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVz
dFR5cGVkZWZzLmggYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvT2JqQy9E
T01UZXN0VHlwZWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZDQyZWZkYWYyNWM4NjY3ZjM2ODlkYTg2NDY3
NDZlNjViYTFhMDZmCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLmgKQEAgLTAsMCArMSw0NCBAQAorLyoK
KyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwgMjAwOSBBcHBs
ZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgU2FtdWVs
IFdlaW5pZyA8c2FtLndlaW5pZ0BnbWFpbC5jb20+CisgKgorICogUmVkaXN0cmlidXRpb24gYW5k
IHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2Rp
ZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRp
dGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUg
bXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qg
b2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0
cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZU
V0FSRSBJUyBQUk9WSURFRCBCWSBBUFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFO
WQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkg
QU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4g
IElOIE5PIEVWRU5UIFNIQUxMIEFQUExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRP
UlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lB
TCwKKyAqIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJV
VCBOT1QgTElNSVRFRCBUTywKKyAqIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1Ig
U0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1Mg
SU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElB
QklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisg
KiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkg
T1VUIE9GIFRIRSBVU0UKKyAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU
SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuIAorICovCisKKyNpbXBvcnQgPFdlYkNvcmUv
RE9NT2JqZWN0Lmg+CisKKyNpZiBXRUJLSVRfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBXRUJLSVRf
VkVSU0lPTl9MQVRFU1QKKworQGNsYXNzIERPTUFycmF5OworQGNsYXNzIERPTVNWR1BvaW50Owor
QGNsYXNzIE5TU3RyaW5nOworCitAaW50ZXJmYWNlIERPTVRlc3RUeXBlZGVmcyA6IERPTU9iamVj
dAorQHByb3BlcnR5IHVuc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZExvbmdMb25nQXR0cjsKK0Bw
cm9wZXJ0eShyZXRhaW4pIE5TU3RyaW5nICppbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWU7
CisKKy0gKHZvaWQpbXVsdGlUcmFuc2Zlckxpc3Q6KE5TU3RyaW5nICopZmlyc3QgdHg6KERPTUFy
cmF5ICopdHggc2Vjb25kOihOU1N0cmluZyAqKXNlY29uZCB0eHg6KERPTUFycmF5ICopdHh4Owor
LSAodm9pZClzZXRTaGFkb3c6KGZsb2F0KXdpZHRoIGhlaWdodDooZmxvYXQpaGVpZ2h0IGJsdXI6
KGZsb2F0KWJsdXIgY29sb3I6KE5TU3RyaW5nICopY29sb3IgYWxwaGE6KGZsb2F0KWFscGhhOwor
LSAoRE9NU1ZHUG9pbnQgKilpbW11dGFibGVQb2ludEZ1bmN0aW9uOworQGVuZAorCisjZW5kaWYK
ZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9PYmpDL0RP
TVRlc3RUeXBlZGVmcy5tbSBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9P
YmpDL0RPTVRlc3RUeXBlZGVmcy5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi45YmUyZDI5ZmVmNTk5NmRjY2E0MTUy
N2FlNDI2ZmRjZDJhOGI3M2NlCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLm1tCkBAIC0wLDAgKzEsMTM2
IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNvdXJjZSBw
cm9qZWN0LgorICogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBnZW5lcmF0ZS1iaW5k
aW5ncy5wbC4gRE8gTk9UIE1PRElGWSEKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGlu
IHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlv
biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor
ICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl
dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25k
aXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlv
bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog
ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNj
bGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxz
IHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBF
WFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQg
VE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklU
TkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8g
RVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBM
SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLAorICog
RVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM
SU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF
UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJV
UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFCSUxJVFks
IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNM
VURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg
VEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT
SUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgiCisjaW1w
b3J0ICJET01JbnRlcm5hbC5oIgorCisjaW1wb3J0ICJET01UZXN0VHlwZWRlZnMuaCIKKworI2lt
cG9ydCAiQXJyYXkuaCIKKyNpbXBvcnQgIkRPTUFycmF5SW50ZXJuYWwuaCIKKyNpbXBvcnQgIkRP
TUJsb2JJbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9NQ1NTUnVsZUludGVybmFsLmgiCisjaW1wb3J0
ICJET01DU1NWYWx1ZUludGVybmFsLmgiCisjaW1wb3J0ICJET01FdmVudEludGVybmFsLmgiCisj
aW1wb3J0ICJET01Ob2RlSW50ZXJuYWwuaCIKKyNpbXBvcnQgIkRPTVNWR1BvaW50SW50ZXJuYWwu
aCIKKyNpbXBvcnQgIkRPTVN0eWxlU2hlZXRJbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9NVGVzdFR5
cGVkZWZzSW50ZXJuYWwuaCIKKyNpbXBvcnQgIkV4Y2VwdGlvbkhhbmRsZXJzLmgiCisjaW1wb3J0
ICJKU01haW5UaHJlYWRFeGVjU3RhdGUuaCIKKyNpbXBvcnQgIktVUkwuaCIKKyNpbXBvcnQgIlNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorI2ltcG9ydCAiVGVzdFR5cGVkZWZzLmgiCisjaW1wb3J0
ICJUaHJlYWRDaGVjay5oIgorI2ltcG9ydCAiV2ViQ29yZU9iakNFeHRyYXMuaCIKKyNpbXBvcnQg
IldlYlNjcmlwdE9iamVjdFByaXZhdGUuaCIKKyNpbXBvcnQgPHd0Zi9HZXRQdHIuaD4KKworI2Rl
ZmluZSBJTVBMIHJlaW50ZXJwcmV0X2Nhc3Q8V2ViQ29yZTo6VGVzdFR5cGVkZWZzKj4oX2ludGVy
bmFsKQorCitAaW1wbGVtZW50YXRpb24gRE9NVGVzdFR5cGVkZWZzCisKKy0gKHZvaWQpZGVhbGxv
YworeworICAgIGlmIChXZWJDb3JlT2JqQ1NjaGVkdWxlRGVhbGxvY2F0ZU9uTWFpblRocmVhZChb
RE9NVGVzdFR5cGVkZWZzIGNsYXNzXSwgc2VsZikpCisgICAgICAgIHJldHVybjsKKworICAgIGlm
IChfaW50ZXJuYWwpCisgICAgICAgIElNUEwtPmRlcmVmKCk7CisgICAgW3N1cGVyIGRlYWxsb2Nd
OworfQorCistICh2b2lkKWZpbmFsaXplCit7CisgICAgaWYgKF9pbnRlcm5hbCkKKyAgICAgICAg
SU1QTC0+ZGVyZWYoKTsKKyAgICBbc3VwZXIgZmluYWxpemVdOworfQorCistICh1bnNpZ25lZCBs
b25nIGxvbmcpdW5zaWduZWRMb25nTG9uZ0F0dHIKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJl
YWROdWxsU3RhdGUgc3RhdGU7CisgICAgcmV0dXJuIElNUEwtPnVuc2lnbmVkTG9uZ0xvbmdBdHRy
KCk7Cit9CisKKy0gKHZvaWQpc2V0VW5zaWduZWRMb25nTG9uZ0F0dHI6KHVuc2lnbmVkIGxvbmcg
bG9uZyluZXdVbnNpZ25lZExvbmdMb25nQXR0cgoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVh
ZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBJTVBMLT5zZXRVbnNpZ25lZExvbmdMb25nQXR0cihuZXdV
bnNpZ25lZExvbmdMb25nQXR0cik7Cit9CisKKy0gKE5TU3RyaW5nICopaW1tdXRhYmxlU2VyaWFs
aXplZFNjcmlwdFZhbHVlCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0
YXRlOworICAgIHJldHVybiBJTVBMLT5pbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKS0+
dG9TdHJpbmcoKTsKK30KKworLSAodm9pZClzZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFs
dWU6KE5TU3RyaW5nICopbmV3SW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlCit7CisgICAg
V2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIEFTU0VSVChuZXdJbW11
dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpOworCisgICAgSU1QTC0+c2V0SW1tdXRhYmxlU2Vy
aWFsaXplZFNjcmlwdFZhbHVlKFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRl
KFdURjo6U3RyaW5nKG5ld0ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSkpKTsKK30KKwor
LSAodm9pZCltdWx0aVRyYW5zZmVyTGlzdDooTlNTdHJpbmcgKilmaXJzdCB0eDooRE9NQXJyYXkg
Kil0eCBzZWNvbmQ6KE5TU3RyaW5nICopc2Vjb25kIHR4eDooRE9NQXJyYXkgKil0eHgKK3sKKyAg
ICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgSU1QTC0+bXVsdGlU
cmFuc2Zlckxpc3QoV2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoV1RGOjpT
dHJpbmcoZmlyc3QpKSwgY29yZSh0eCksIFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6
Y3JlYXRlKFdURjo6U3RyaW5nKHNlY29uZCkpLCBjb3JlKHR4eCkpOworfQorCistICh2b2lkKXNl
dFNoYWRvdzooZmxvYXQpd2lkdGggaGVpZ2h0OihmbG9hdCloZWlnaHQgYmx1cjooZmxvYXQpYmx1
ciBjb2xvcjooTlNTdHJpbmcgKiljb2xvciBhbHBoYTooZmxvYXQpYWxwaGEKK3sKKyAgICBXZWJD
b3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgSU1QTC0+c2V0U2hhZG93KHdp
ZHRoLCBoZWlnaHQsIGJsdXIsIGNvbG9yLCBhbHBoYSk7Cit9CisKKy0gKERPTVNWR1BvaW50ICop
aW1tdXRhYmxlUG9pbnRGdW5jdGlvbgoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxT
dGF0ZSBzdGF0ZTsKKyAgICByZXR1cm4ga2l0KFdURjo6Z2V0UHRyKFdlYkNvcmU6OlNWR1Byb3Bl
cnR5VGVhck9mZjxXZWJDb3JlOjpGbG9hdFBvaW50Pjo6Y3JlYXRlKElNUEwtPmltbXV0YWJsZVBv
aW50RnVuY3Rpb24oKSkpKTsKK30KKworQGVuZAorCitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGNv
cmUoRE9NVGVzdFR5cGVkZWZzICp3cmFwcGVyKQoreworICAgIHJldHVybiB3cmFwcGVyID8gcmVp
bnRlcnByZXRfY2FzdDxXZWJDb3JlOjpUZXN0VHlwZWRlZnMqPih3cmFwcGVyLT5faW50ZXJuYWwp
IDogMDsKK30KKworRE9NVGVzdFR5cGVkZWZzICpraXQoV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiB2
YWx1ZSkKK3sKKyAgICB7IERPTV9BU1NFUlRfTUFJTl9USFJFQUQoKTsgV2ViQ29yZVRocmVhZFZp
b2xhdGlvbkNoZWNrUm91bmRPbmUoKTsgfTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1
cm4gbmlsOworICAgIGlmIChET01UZXN0VHlwZWRlZnMgKndyYXBwZXIgPSBnZXRET01XcmFwcGVy
KHZhbHVlKSkKKyAgICAgICAgcmV0dXJuIFtbd3JhcHBlciByZXRhaW5dIGF1dG9yZWxlYXNlXTsK
KyAgICBET01UZXN0VHlwZWRlZnMgKndyYXBwZXIgPSBbW0RPTVRlc3RUeXBlZGVmcyBhbGxvY10g
X2luaXRdOworICAgIHdyYXBwZXItPl9pbnRlcm5hbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RE9NT2Jq
ZWN0SW50ZXJuYWwqPih2YWx1ZSk7CisgICAgdmFsdWUtPnJlZigpOworICAgIGFkZERPTVdyYXBw
ZXIod3JhcHBlciwgdmFsdWUpOworICAgIHJldHVybiBbd3JhcHBlciBhdXRvcmVsZWFzZV07Cit9
CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvT2JqQy9E
T01UZXN0VHlwZWRlZnNJbnRlcm5hbC5oIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0
cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZGE4YmMz
NzdlM2UwNzQ0ZjUxNDYyMmM1NjUyMWY4NGZmZWRkOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzSW50
ZXJuYWwuaApAQCAtMCwwICsxLDM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhl
IFdlYktpdCBvcGVuIHNvdXJjZSBwcm9qZWN0LgorICogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVy
YXRlZCBieSBnZW5lcmF0ZS1iaW5kaW5ncy5wbC4gRE8gTk9UIE1PRElGWSEKKyAqCisgKiBSZWRp
c3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdp
dGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBm
b2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBv
ZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3Rp
Y2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIu
CisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhl
IGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBh
bmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBh
bmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAq
CisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBg
QVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVE
SU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1F
UkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFS
RSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IK
KyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJ
REVOVEFMLCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMg
KElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJ
VFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRT
OyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhF
T1JZCisgKiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJ
VFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ
TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJ
RiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2lt
cG9ydCA8V2ViQ29yZS9ET01UZXN0VHlwZWRlZnMuaD4KKworI2lmIFdFQktJVF9WRVJTSU9OX01B
WF9BTExPV0VEID49IFdFQktJVF9WRVJTSU9OX0xBVEVTVAorCituYW1lc3BhY2UgV2ViQ29yZSB7
CisgICAgY2xhc3MgVGVzdFR5cGVkZWZzOworfQorCitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGNv
cmUoRE9NVGVzdFR5cGVkZWZzICopOworRE9NVGVzdFR5cGVkZWZzICpraXQoV2ViQ29yZTo6VGVz
dFR5cGVkZWZzKik7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGlu
Z3Mvc2NyaXB0cy90ZXN0L1Rlc3RUeXBlZGVmcy5pZGwgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5n
cy9zY3JpcHRzL3Rlc3QvVGVzdFR5cGVkZWZzLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl
eCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi43ZDYxZjkzZWVlOWNh
M2VjZGU1YmE4NDI5OGI1YmIyODQ1ZGQwOGIzCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dl
YkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RUeXBlZGVmcy5pZGwKQEAgLTAsMCArMSw3
MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJl
c2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5h
cnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVk
IHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoK
KyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUg
YWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0
aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmlu
YXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0
aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBp
biB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg
dGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2ds
ZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQg
dG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0
d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09O
VFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJ
RVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFO
VElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAor
ICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJF
Q1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwg
REFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBP
RiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9S
IFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9O
IEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNU
IExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lT
RSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJF
LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICov
CisKKy8vIFRoaXMgSURMIGZpbGUgaXMgZm9yIHRlc3RpbmcgdGhlIGJpbmRpbmdzIGNvZGUgZ2Vu
ZXJhdG9yIGFuZCBmb3IgdHJhY2tpbmcKKy8vIGNoYW5nZXMgaW4gaXRzIG91cHV0LgorCitbCisg
ICAgQ29uc3RydWN0b3IoaW4gU1RSSU5HIGhlbGxvLCBpbiBURVNUX0NBTExCQUNLIHRlc3RDYWxs
YmFjayksCitdIGludGVyZmFjZSBUZXN0VHlwZWRlZnMgeworICAgIGF0dHJpYnV0ZSBVTE9OR0xP
TkcgdW5zaWduZWRMb25nTG9uZ0F0dHI7CisKKyAgICBbSW1tdXRhYmxlXSBhdHRyaWJ1dGUgU0NS
SVBUX1ZBTFVFIGltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTsKKyAgICAKKyAgICBzdGF0
aWMgcmVhZG9ubHkgYXR0cmlidXRlIFRlc3RTdWJPYmpDb25zdHJ1Y3RvciBUZXN0U3ViT2JqOwor
CisgICAgW1N0cmljdFR5cGVDaGVja2luZ10gdm9pZCBmdW5jKGluIFtPcHRpb25hbF0gQVJSQVlf
T0ZfTE9OR1MgeCk7CisKKyAgICB2b2lkIG11bHRpVHJhbnNmZXJMaXN0KGluIFtUcmFuc2Zlckxp
c3Q9dHhdIFNDUklQVF9WQUxVRSBmaXJzdCwgaW4gW09wdGlvbmFsXSBBcnJheSB0eCwgaW4gW09w
dGlvbmFsXSBUUkFOU0ZFUl9UWFhfU0NSSVBUX1ZBTFVFIHNlY29uZCwgaW4gW09wdGlvbmFsXSBB
cnJheSB0eHgpOworCisgICAgdm9pZCBzZXRTaGFkb3coaW4gRE9VQkxFIHdpZHRoLCBpbiBET1VC
TEUgaGVpZ2h0LCBpbiBmbG9hdCBibHVyLCBpbiBbU3RyaWN0VHlwZUNoZWNraW5nXSBPUFRJT05B
TF9TVFJJTkcgY29sb3IsIGluIFtPcHRpb25hbF0gRE9VQkxFIGFscGhhKTsKKworICAgIFVMT05H
TE9ORyBtZXRob2RXaXRoU2VxdWVuY2VBcmcoaW4gc2VxdWVuY2U8U0NSSVBUX1ZBTFVFPiBzZXF1
ZW5jZUFyZyk7CisKKyAgICB2b2lkIG51bGxhYmxlQXJyYXlBcmcoaW4gQVJSQVlfT0ZfU1RSSU5H
Uz8gYXJyYXlBcmcpOworCisgICAgdm9pZCBmdW5jV2l0aENsYW1wKGluIFVMT05HTE9OR19DTEFN
UCBhcmcxLCBpbiBbT3B0aW9uYWxdIFVMT05HTE9OR19DTEFNUCBhcmcyKTsKKworICAgIFtJbW11
dGFibGVdIFNWR1BPSU5UIGltbXV0YWJsZVBvaW50RnVuY3Rpb24oKTsKKworICAgIEFSUkFZX09G
X1NUUklOR1Mgc3RyaW5nQXJyYXlGdW5jdGlvbihpbiBBUlJBWV9PRl9TVFJJTkdTIHZhbHVlcykg
cmFpc2VzKERPTUV4Y2VwdGlvbik7Cit9OworCit0eXBlZGVmIGZsb2F0ICAgICAgICAgICAgICAg
ICAgICAgIERPVUJMRTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICAgICAgICAgVUxPTkdM
T05HOwordHlwZWRlZiBbQ2xhbXBdIHVuc2lnbmVkIGxvbmcgbG9uZyBVTE9OR0xPTkdfQ0xBTVA7
Cit0eXBlZGVmIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSAgICAgIFNDUklQVF9WQUxVRTsKK3R5cGVk
ZWYgbG9uZ1tdICAgICAgICAgICAgICAgICAgICAgQVJSQVlfT0ZfTE9OR1M7Cit0eXBlZGVmIFNW
R1BvaW50ICAgICAgICAgICAgICAgICAgIFNWR1BPSU5UOwordHlwZWRlZiBET01TdHJpbmcgICAg
ICAgICAgICAgICAgICBTVFJJTkc7Cit0eXBlZGVmIFtPcHRpb25hbF0gRE9NU3RyaW5nICAgICAg
IE9QVElPTkFMX1NUUklORzsKK3R5cGVkZWYgRE9NU3RyaW5nW10gICAgICAgICAgICAgICAgQVJS
QVlfT0ZfU1RSSU5HUzsKK3R5cGVkZWYgW0NhbGxiYWNrXSBUZXN0Q2FsbGJhY2sgICAgVEVTVF9D
QUxMQkFDSzsKK3R5cGVkZWYgW1RyYW5zZmVyTGlzdD10eHhdIFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZSBUUkFOU0ZFUl9UWFhfU0NSSVBUX1ZBTFVFOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUv
YmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdFR5cGVkZWZzLmNwcCBiL1NvdXJjZS9XZWJD
b3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RUeXBlZGVmcy5jcHAKbmV3IGZpbGUg
bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MC4uNTYzMGIyZjlhNjA5OGM4ZWU1YjNkNDFmMDQ0YWU3Y2VjZGM5YWI4MQotLS0gL2Rldi9udWxs
CisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RUeXBl
ZGVmcy5jcHAKQEAgLTAsMCArMSwzOTEgQEAKKy8qCisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2Yg
dGhlIFdlYktpdCBvcGVuIHNvdXJjZSBwcm9qZWN0LgorICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBn
ZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtYmluZGluZ3MucGwuIERPIE5PVCBNT0RJRlkhCisKKyAgICBU
aGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k
L29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChh
dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMg
ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQg
V0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBv
ZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9T
RS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBt
b3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRo
ZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlz
IGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAg
ICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBT
dWl0ZSAzMzAsCisgICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqLworCisjaW5jbHVk
ZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiVjhUZXN0VHlwZWRlZnMuaCIKKworI2luY2x1ZGUgIkJp
bmRpbmdTdGF0ZS5oIgorI2luY2x1ZGUgIkNvbnRleHRGZWF0dXJlcy5oIgorI2luY2x1ZGUgIkRP
TVN0cmluZ0xpc3QuaCIKKyNpbmNsdWRlICJFeGNlcHRpb25Db2RlLmgiCisjaW5jbHVkZSAiRnJh
bWUuaCIKKyNpbmNsdWRlICJNZXNzYWdlUG9ydC5oIgorI2luY2x1ZGUgIlJ1bnRpbWVFbmFibGVk
RmVhdHVyZXMuaCIKKyNpbmNsdWRlICJTVkdQcm9wZXJ0eVRlYXJPZmYuaCIKKyNpbmNsdWRlICJT
ZXJpYWxpemVkU2NyaXB0VmFsdWUuaCIKKyNpbmNsdWRlICJWOEJpbmRpbmcuaCIKKyNpbmNsdWRl
ICJWOERPTVN0cmluZ0xpc3QuaCIKKyNpbmNsdWRlICJWOERPTVdyYXBwZXIuaCIKKyNpbmNsdWRl
ICJWOFNWR1BvaW50LmgiCisjaW5jbHVkZSAiVjhTZXJpYWxpemVkU2NyaXB0VmFsdWUuaCIKKyNp
bmNsdWRlICJWOFRlc3RDYWxsYmFjay5oIgorI2luY2x1ZGUgIlY4VGVzdFN1Yk9iai5oIgorI2lu
Y2x1ZGUgPHd0Zi9BcnJheUJ1ZmZlci5oPgorI2luY2x1ZGUgPHd0Zi9VbnVzZWRQYXJhbS5oPgor
CisjaWYgRU5BQkxFKEJJTkRJTkdfSU5URUdSSVRZKQorI2lmIGRlZmluZWQoT1NfV0lOKQorI3By
YWdtYSB3YXJuaW5nKGRpc2FibGU6IDQ0ODMpCitleHRlcm4gIkMiIHsgZXh0ZXJuIHZvaWQgKCpj
b25zdCBfX2lkZW50aWZpZXIoIj8/XzdUZXN0VHlwZWRlZnNAV2ViQ29yZUBANkJAIilbXSkoKTsg
fQorI2Vsc2UKK2V4dGVybiAiQyIgeyBleHRlcm4gdm9pZCogX1pUVk43V2ViQ29yZTEyVGVzdFR5
cGVkZWZzRVtdOyB9CisjZW5kaWYKKyNlbmRpZiAvLyBFTkFCTEUoQklORElOR19JTlRFR1JJVFkp
CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworI2lmIEVOQUJMRShCSU5ESU5HX0lOVEVHUklUWSkK
K2lubGluZSB2b2lkIGNoZWNrVHlwZU9yRGllVHJ5aW5nKFRlc3RUeXBlZGVmcyogb2JqZWN0KQor
eworICAgIHZvaWQqIGFjdHVhbFZUYWJsZVBvaW50ZXIgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dm9p
ZCoqPihvYmplY3QpKTsKKyNpZiBkZWZpbmVkKE9TX1dJTikKKyAgICB2b2lkKiBleHBlY3RlZFZU
YWJsZVBvaW50ZXIgPSByZWludGVycHJldF9jYXN0PHZvaWQqPihfX2lkZW50aWZpZXIoIj8/XzdU
ZXN0VHlwZWRlZnNAV2ViQ29yZUBANkJAIikpOworI2Vsc2UKKyAgICB2b2lkKiBleHBlY3RlZFZU
YWJsZVBvaW50ZXIgPSAmX1pUVk43V2ViQ29yZTEyVGVzdFR5cGVkZWZzRVsyXTsKKyNlbmRpZgor
ICAgIGlmIChhY3R1YWxWVGFibGVQb2ludGVyICE9IGV4cGVjdGVkVlRhYmxlUG9pbnRlcikKKyAg
ICAgICAgQ1JBU0goKTsKK30KKyNlbmRpZiAvLyBFTkFCTEUoQklORElOR19JTlRFR1JJVFkpCisK
K1dyYXBwZXJUeXBlSW5mbyBWOFRlc3RUeXBlZGVmczo6aW5mbyA9IHsgVjhUZXN0VHlwZWRlZnM6
OkdldFRlbXBsYXRlLCBWOFRlc3RUeXBlZGVmczo6ZGVyZWZPYmplY3QsIDAsIDAsIDAsIFY4VGVz
dFR5cGVkZWZzOjppbnN0YWxsUGVyQ29udGV4dFByb3RvdHlwZVByb3BlcnRpZXMsIDAsIFdyYXBw
ZXJUeXBlT2JqZWN0UHJvdG90eXBlIH07CisKK25hbWVzcGFjZSBUZXN0VHlwZWRlZnNWOEludGVy
bmFsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgVjhfVVNFKFQpIHsgfQorCitzdGF0
aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHVuc2lnbmVkTG9uZ0xvbmdBdHRyQXR0ckdldHRlcih2
ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbykK
K3sKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShpbmZv
LkhvbGRlcigpKTsKKyAgICByZXR1cm4gdjg6Ok51bWJlcjo6TmV3KHN0YXRpY19jYXN0PGRvdWJs
ZT4oaW1wLT51bnNpZ25lZExvbmdMb25nQXR0cigpKSk7Cit9CisKK3N0YXRpYyB2b2lkIHVuc2ln
bmVkTG9uZ0xvbmdBdHRyQXR0clNldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgdjg6
OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCit7
CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6dG9OYXRpdmUoaW5mby5I
b2xkZXIoKSk7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIHYgPSB0b0ludDY0KHZhbHVlKTsKKyAg
ICBpbXAtPnNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyKHYpOworICAgIHJldHVybjsKK30KKworc3Rh
dGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBpbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWVB
dHRyR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJ
bmZvJiBpbmZvKQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRv
TmF0aXZlKGluZm8uSG9sZGVyKCkpOworICAgIHJldHVybiBpbXAtPmltbXV0YWJsZVNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSgpID8gaW1wLT5pbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKS0+
ZGVzZXJpYWxpemUoKSA6IHY4OjpIYW5kbGU8djg6OlZhbHVlPih2OE51bGwoaW5mby5HZXRJc29s
YXRlKCkpKTsKK30KKworc3RhdGljIHZvaWQgaW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVl
QXR0clNldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgdjg6OkxvY2FsPHY4OjpWYWx1
ZT4gdmFsdWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCit7CisgICAgVGVzdFR5cGVk
ZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6dG9OYXRpdmUoaW5mby5Ib2xkZXIoKSk7CisgICAg
UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gdiA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6
Y3JlYXRlKHZhbHVlLCBpbmZvLkdldElzb2xhdGUoKSk7CisgICAgaW1wLT5zZXRJbW11dGFibGVT
ZXJpYWxpemVkU2NyaXB0VmFsdWUoV1RGOjpnZXRQdHIodikpOworICAgIHJldHVybjsKK30KKwor
c3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvckdldHRl
cih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5m
bykKK3sKKyAgICB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZGF0YSA9IGluZm8uRGF0YSgpOworICAg
IEFTU0VSVChkYXRhLT5Jc0V4dGVybmFsKCkpOworICAgIFY4UGVyQ29udGV4dERhdGEqIHBlckNv
bnRleHREYXRhID0gVjhQZXJDb250ZXh0RGF0YTo6ZnJvbShpbmZvLkhvbGRlcigpLT5DcmVhdGlv
bkNvbnRleHQoKSk7CisgICAgaWYgKCFwZXJDb250ZXh0RGF0YSkKKyAgICAgICAgcmV0dXJuIHY4
VW5kZWZpbmVkKCk7CisgICAgcmV0dXJuIHBlckNvbnRleHREYXRhLT5jb25zdHJ1Y3RvckZvclR5
cGUoV3JhcHBlclR5cGVJbmZvOjp1bndyYXAoZGF0YSkpOworfQorc3RhdGljIHZvaWQgVGVzdFR5
cGVkZWZzUmVwbGFjZWFibGVBdHRyU2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCB2
ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbykK
K3sKKyAgICBpbmZvLlRoaXMoKS0+Rm9yY2VTZXQobmFtZSwgdmFsdWUpOworfQorCitzdGF0aWMg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IGZ1bmNDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBh
cmdzKQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZl
KGFyZ3MuSG9sZGVyKCkpOworICAgIGlmIChhcmdzLkxlbmd0aCgpIDw9IDApIHsKKyAgICAgICAg
aW1wLT5mdW5jKCk7CisgICAgICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworICAgIH0KKyAgICBp
ZiAoYXJncy5MZW5ndGgoKSA+IDAgJiYgIWlzVW5kZWZpbmVkT3JOdWxsKGFyZ3NbMF0pICYmICFW
OGxvbmdbXTo6SGFzSW5zdGFuY2UoYXJnc1swXSwgYXJncy5HZXRJc29sYXRlKCkpKQorICAgICAg
ICByZXR1cm4gdGhyb3dUeXBlRXJyb3IoMCwgYXJncy5HZXRJc29sYXRlKCkpOworICAgIFY4VFJZ
Q0FUQ0goVmVjdG9yPGludD4sIHgsIHRvTmF0aXZlQXJyYXk8aW50PihNQVlCRV9NSVNTSU5HX1BB
UkFNRVRFUihhcmdzLCAwLCBEZWZhdWx0SXNVbmRlZmluZWQpKSk7CisgICAgaW1wLT5mdW5jKHgp
OworICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IG11bHRpVHJhbnNmZXJMaXN0Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJn
cykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCisgICAgICAgIHJldHVybiB0aHJvd05v
dEVub3VnaEFyZ3VtZW50c0Vycm9yKGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICBUZXN0VHlwZWRl
ZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKKyAgICBN
ZXNzYWdlUG9ydEFycmF5IG1lc3NhZ2VQb3J0QXJyYXlUeDsKKyAgICBBcnJheUJ1ZmZlckFycmF5
IGFycmF5QnVmZmVyQXJyYXlUeDsKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA+IDEpIHsKKyAgICAg
ICAgaWYgKCFleHRyYWN0VHJhbnNmZXJhYmxlcyhhcmdzWzFdLCBtZXNzYWdlUG9ydEFycmF5VHgs
IGFycmF5QnVmZmVyQXJyYXlUeCwgYXJncy5HZXRJc29sYXRlKCkpKQorICAgICAgICAgICAgcmV0
dXJuIHRocm93VHlwZUVycm9yKCJDb3VsZCBub3QgZXh0cmFjdCB0cmFuc2ZlcmFibGVzIiwgYXJn
cy5HZXRJc29sYXRlKCkpOworICAgIH0KKyAgICBib29sIGZpcnN0RGlkVGhyb3cgPSBmYWxzZTsK
KyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBmaXJzdCA9IFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZTo6Y3JlYXRlKGFyZ3NbMF0sICZtZXNzYWdlUG9ydEFycmF5VHgsICZhcnJheUJ1ZmZl
ckFycmF5VHgsIGZpcnN0RGlkVGhyb3csIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICBpZiAoZmly
c3REaWRUaHJvdykKKyAgICAgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7CisgICAgaWYgKGFyZ3Mu
TGVuZ3RoKCkgPD0gMSkgeworICAgICAgICBpbXAtPm11bHRpVHJhbnNmZXJMaXN0KGZpcnN0KTsK
KyAgICAgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7CisgICAgfQorICAgIGlmIChhcmdzLkxlbmd0
aCgpIDw9IDIpIHsKKyAgICAgICAgaW1wLT5tdWx0aVRyYW5zZmVyTGlzdChmaXJzdCwgbWVzc2Fn
ZVBvcnRBcnJheVR4KTsKKyAgICAgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7CisgICAgfQorICAg
IE1lc3NhZ2VQb3J0QXJyYXkgbWVzc2FnZVBvcnRBcnJheVR4eDsKKyAgICBBcnJheUJ1ZmZlckFy
cmF5IGFycmF5QnVmZmVyQXJyYXlUeHg7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAzKSB7Cisg
ICAgICAgIGlmICghZXh0cmFjdFRyYW5zZmVyYWJsZXMoYXJnc1szXSwgbWVzc2FnZVBvcnRBcnJh
eVR4eCwgYXJyYXlCdWZmZXJBcnJheVR4eCwgYXJncy5HZXRJc29sYXRlKCkpKQorICAgICAgICAg
ICAgcmV0dXJuIHRocm93VHlwZUVycm9yKCJDb3VsZCBub3QgZXh0cmFjdCB0cmFuc2ZlcmFibGVz
IiwgYXJncy5HZXRJc29sYXRlKCkpOworICAgIH0KKyAgICBib29sIHNlY29uZERpZFRocm93ID0g
ZmFsc2U7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2Vjb25kID0gU2VyaWFs
aXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1syXSwgJm1lc3NhZ2VQb3J0QXJyYXlUeHgsICZh
cnJheUJ1ZmZlckFycmF5VHh4LCBzZWNvbmREaWRUaHJvdywgYXJncy5HZXRJc29sYXRlKCkpOwor
ICAgIGlmIChzZWNvbmREaWRUaHJvdykKKyAgICAgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7Cisg
ICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPD0gMykgeworICAgICAgICBpbXAtPm11bHRpVHJhbnNmZXJM
aXN0KGZpcnN0LCBtZXNzYWdlUG9ydEFycmF5VHgsIHNlY29uZCk7CisgICAgICAgIHJldHVybiB2
OFVuZGVmaW5lZCgpOworICAgIH0KKyAgICBpbXAtPm11bHRpVHJhbnNmZXJMaXN0KGZpcnN0LCBt
ZXNzYWdlUG9ydEFycmF5VHgsIHNlY29uZCwgbWVzc2FnZVBvcnRBcnJheVR4eCk7CisgICAgcmV0
dXJuIHY4VW5kZWZpbmVkKCk7Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gc2V0
U2hhZG93Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJn
cy5MZW5ndGgoKSA8IDMpCisgICAgICAgIHJldHVybiB0aHJvd05vdEVub3VnaEFyZ3VtZW50c0Vy
cm9yKGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5
cGVkZWZzOjp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKKyAgICBWOFRSWUNBVENIKGZsb2F0LCB3
aWR0aCwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGFyZ3MsIDAs
IERlZmF1bHRJc1VuZGVmaW5lZCktPk51bWJlclZhbHVlKCkpKTsKKyAgICBWOFRSWUNBVENIKGZs
b2F0LCBoZWlnaHQsIHN0YXRpY19jYXN0PGZsb2F0PihNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihh
cmdzLCAxLCBEZWZhdWx0SXNVbmRlZmluZWQpLT5OdW1iZXJWYWx1ZSgpKSk7CisgICAgVjhUUllD
QVRDSChmbG9hdCwgYmx1ciwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KE1BWUJFX01JU1NJTkdfUEFSQU1F
VEVSKGFyZ3MsIDIsIERlZmF1bHRJc1VuZGVmaW5lZCktPk51bWJlclZhbHVlKCkpKTsKKyAgICBp
ZiAoYXJncy5MZW5ndGgoKSA8PSAzKSB7CisgICAgICAgIGltcC0+c2V0U2hhZG93KHdpZHRoLCBo
ZWlnaHQsIGJsdXIpOworICAgICAgICByZXR1cm4gdjhVbmRlZmluZWQoKTsKKyAgICB9CisgICAg
VjhUUllDQVRDSF9GT1JfVjhTVFJJTkdSRVNPVVJDRShWOFN0cmluZ1Jlc291cmNlPD4sIGNvbG9y
LCBNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihhcmdzLCAzLCBEZWZhdWx0SXNVbmRlZmluZWQpKTsK
KyAgICBpZiAoYXJncy5MZW5ndGgoKSA8PSA0KSB7CisgICAgICAgIGltcC0+c2V0U2hhZG93KHdp
ZHRoLCBoZWlnaHQsIGJsdXIsIGNvbG9yKTsKKyAgICAgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7
CisgICAgfQorICAgIFY4VFJZQ0FUQ0goZmxvYXQsIGFscGhhLCBzdGF0aWNfY2FzdDxmbG9hdD4o
TUFZQkVfTUlTU0lOR19QQVJBTUVURVIoYXJncywgNCwgRGVmYXVsdElzVW5kZWZpbmVkKS0+TnVt
YmVyVmFsdWUoKSkpOworICAgIGltcC0+c2V0U2hhZG93KHdpZHRoLCBoZWlnaHQsIGJsdXIsIGNv
bG9yLCBhbHBoYSk7CisgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7Cit9CisKK3N0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gbWV0aG9kV2l0aFNlcXVlbmNlQXJnQ2FsbGJhY2soY29uc3Qgdjg6
OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCisgICAgICAg
IHJldHVybiB0aHJvd05vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGFyZ3MuR2V0SXNvbGF0ZSgpKTsK
KyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShhcmdzLkhv
bGRlcigpKTsKKyAgICBWOFRSWUNBVENIKFZlY3RvcjxSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZh
bHVlPiA+LCBzZXF1ZW5jZUFyZywgKHRvUmVmUHRyTmF0aXZlQXJyYXk8U2VyaWFsaXplZFNjcmlw
dFZhbHVlLCBWOFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4oTUFZQkVfTUlTU0lOR19QQVJBTUVURVIo
YXJncywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSwgYXJncy5HZXRJc29sYXRlKCkpKSk7CisgICAg
cmV0dXJuIHY4OjpOdW1iZXI6Ok5ldyhzdGF0aWNfY2FzdDxkb3VibGU+KGltcC0+bWV0aG9kV2l0
aFNlcXVlbmNlQXJnKHNlcXVlbmNlQXJnKSkpOworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IG51bGxhYmxlQXJyYXlBcmdDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdz
KQoreworICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93Tm90
RW5vdWdoQXJndW1lbnRzRXJyb3IoYXJncy5HZXRJc29sYXRlKCkpOworICAgIFRlc3RUeXBlZGVm
cyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOworICAgIFY4
VFJZQ0FUQ0goVmVjdG9yPFN0cmluZz4sIGFycmF5QXJnLCB0b05hdGl2ZUFycmF5PFN0cmluZz4o
TUFZQkVfTUlTU0lOR19QQVJBTUVURVIoYXJncywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSkpOwor
ICAgIGltcC0+bnVsbGFibGVBcnJheUFyZyhhcnJheUFyZyk7CisgICAgcmV0dXJuIHY4VW5kZWZp
bmVkKCk7Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZnVuY1dpdGhDbGFtcENh
bGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgaWYgKGFyZ3MuTGVuZ3Ro
KCkgPCAxKQorICAgICAgICByZXR1cm4gdGhyb3dOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihhcmdz
LkdldElzb2xhdGUoKSk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6
dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGFyZzEgPSAw
OworICAgIFY4VFJZQ0FUQ0goZG91YmxlLCBhcmcxTmF0aXZlVmFsdWUsIGFyZ3NbMF0tPk51bWJl
clZhbHVlKCkpOworICAgIGlmICghaXNuYW4oYXJnMU5hdGl2ZVZhbHVlKSkKKyAgICAgICAgYXJn
MSA9IGNsYW1wVG88dW5zaWduZWQgbG9uZyBsb25nPihhcmcxTmF0aXZlVmFsdWUpOworICAgIGlm
IChhcmdzLkxlbmd0aCgpIDw9IDEpIHsKKyAgICAgICAgaW1wLT5mdW5jV2l0aENsYW1wKGFyZzEp
OworICAgICAgICByZXR1cm4gdjhVbmRlZmluZWQoKTsKKyAgICB9CisgICAgdW5zaWduZWQgbG9u
ZyBsb25nIGFyZzIgPSAwOworICAgIFY4VFJZQ0FUQ0goZG91YmxlLCBhcmcyTmF0aXZlVmFsdWUs
IGFyZ3NbMV0tPk51bWJlclZhbHVlKCkpOworICAgIGlmICghaXNuYW4oYXJnMk5hdGl2ZVZhbHVl
KSkKKyAgICAgICAgYXJnMiA9IGNsYW1wVG88dW5zaWduZWQgbG9uZyBsb25nPihhcmcyTmF0aXZl
VmFsdWUpOworICAgIGltcC0+ZnVuY1dpdGhDbGFtcChhcmcxLCBhcmcyKTsKKyAgICByZXR1cm4g
djhVbmRlZmluZWQoKTsKK30KKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBpbW11dGFi
bGVQb2ludEZ1bmN0aW9uQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAg
ICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShhcmdzLkhvbGRl
cigpKTsKKyAgICByZXR1cm4gdG9WOChXVEY6OmdldFB0cihTVkdQcm9wZXJ0eVRlYXJPZmY8Rmxv
YXRQb2ludD46OmNyZWF0ZShpbXAtPmltbXV0YWJsZVBvaW50RnVuY3Rpb24oKSkpLCBhcmdzLkhv
bGRlcigpLCBhcmdzLkdldElzb2xhdGUoKSk7Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpW
YWx1ZT4gc3RyaW5nQXJyYXlGdW5jdGlvbkNhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFy
Z3MpCit7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQorICAgICAgICByZXR1cm4gdGhyb3dO
b3RFbm91Z2hBcmd1bWVudHNFcnJvcihhcmdzLkdldElzb2xhdGUoKSk7CisgICAgVGVzdFR5cGVk
ZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7CisgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgeworICAgIFY4VFJZQ0FUQ0goVmVjdG9yPFN0cmlu
Zz4sIHZhbHVlcywgdG9OYXRpdmVBcnJheTxTdHJpbmc+KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVS
KGFyZ3MsIDAsIERlZmF1bHRJc1VuZGVmaW5lZCkpKTsKKyAgICBWZWN0b3I8U3RyaW5nPiByZXN1
bHQgPSBpbXAtPnN0cmluZ0FycmF5RnVuY3Rpb24odmFsdWVzLCBlYyk7CisgICAgaWYgKFVOTElL
RUxZKGVjKSkKKyAgICAgICAgZ290byBmYWlsOworICAgIHJldHVybiB2OEFycmF5KHJlc3VsdCwg
YXJncy5HZXRJc29sYXRlKCkpOworICAgIH0KKyAgICBmYWlsOgorICAgIHJldHVybiBzZXRET01F
eGNlcHRpb24oZWMsIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgVGVz
dFR5cGVkZWZzVjhJbnRlcm5hbAorCitzdGF0aWMgY29uc3QgVjhET01Db25maWd1cmF0aW9uOjpC
YXRjaGVkQXR0cmlidXRlIFY4VGVzdFR5cGVkZWZzQXR0cnNbXSA9IHsKKyAgICAvLyBBdHRyaWJ1
dGUgJ3Vuc2lnbmVkTG9uZ0xvbmdBdHRyJyAoVHlwZTogJ2F0dHJpYnV0ZScgRXh0QXR0cjogJycp
CisgICAgeyJ1bnNpZ25lZExvbmdMb25nQXR0ciIsIFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OnVu
c2lnbmVkTG9uZ0xvbmdBdHRyQXR0ckdldHRlciwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6dW5z
aWduZWRMb25nTG9uZ0F0dHJBdHRyU2V0dGVyLCAwIC8qIG5vIGRhdGEgKi8sIHN0YXRpY19jYXN0
PHY4OjpBY2Nlc3NDb250cm9sPih2ODo6REVGQVVMVCksIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0
eUF0dHJpYnV0ZT4odjg6Ok5vbmUpLCAwIC8qIG9uIGluc3RhbmNlICovfSwKKyAgICAvLyBBdHRy
aWJ1dGUgJ2ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZScgKFR5cGU6ICdhdHRyaWJ1dGUn
IEV4dEF0dHI6ICdJbW11dGFibGUnKQorICAgIHsiaW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZh
bHVlIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZh
bHVlQXR0ckdldHRlciwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRhYmxlU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlQXR0clNldHRlciwgMCAvKiBubyBkYXRhICovLCBzdGF0aWNfY2FzdDx2ODo6
QWNjZXNzQ29udHJvbD4odjg6OkRFRkFVTFQpLCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRy
aWJ1dGU+KHY4OjpOb25lKSwgMCAvKiBvbiBpbnN0YW5jZSAqL30sCisgICAgLy8gQXR0cmlidXRl
ICdUZXN0U3ViT2JqJyAoVHlwZTogJ3JlYWRvbmx5IGF0dHJpYnV0ZScgRXh0QXR0cjogJycpCisg
ICAgeyJUZXN0U3ViT2JqIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6VGVzdFR5cGVkZWZzQ29u
c3RydWN0b3JHZXR0ZXIsIDAsICZWOFRlc3RTdWJPYmo6OmluZm8sIHN0YXRpY19jYXN0PHY4OjpB
Y2Nlc3NDb250cm9sPih2ODo6REVGQVVMVCksIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJp
YnV0ZT4odjg6Ok5vbmUpLCAwIC8qIG9uIGluc3RhbmNlICovfSwKK307CisKK3N0YXRpYyBjb25z
dCBWOERPTUNvbmZpZ3VyYXRpb246OkJhdGNoZWRDYWxsYmFjayBWOFRlc3RUeXBlZGVmc0NhbGxi
YWNrc1tdID0geworICAgIHsiZnVuYyIsIFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OmZ1bmNDYWxs
YmFja30sCisgICAgeyJtdWx0aVRyYW5zZmVyTGlzdCIsIFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6
Om11bHRpVHJhbnNmZXJMaXN0Q2FsbGJhY2t9LAorICAgIHsic2V0U2hhZG93IiwgVGVzdFR5cGVk
ZWZzVjhJbnRlcm5hbDo6c2V0U2hhZG93Q2FsbGJhY2t9LAorICAgIHsiZnVuY1dpdGhDbGFtcCIs
IFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OmZ1bmNXaXRoQ2xhbXBDYWxsYmFja30sCisgICAgeyJp
bW11dGFibGVQb2ludEZ1bmN0aW9uIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRhYmxl
UG9pbnRGdW5jdGlvbkNhbGxiYWNrfSwKK307CisKK3Y4OjpIYW5kbGU8djg6OlZhbHVlPiBWOFRl
c3RUeXBlZGVmczo6Y29uc3RydWN0b3JDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdz
KQoreworICAgIAorICAgIGlmICghYXJncy5Jc0NvbnN0cnVjdENhbGwoKSkKKyAgICAgICAgcmV0
dXJuIHRocm93VHlwZUVycm9yKCJET00gb2JqZWN0IGNvbnN0cnVjdG9yIGNhbm5vdCBiZSBjYWxs
ZWQgYXMgYSBmdW5jdGlvbi4iLCBhcmdzLkdldElzb2xhdGUoKSk7CisKKyAgICBpZiAoQ29uc3Ry
dWN0b3JNb2RlOjpjdXJyZW50KCkgPT0gQ29uc3RydWN0b3JNb2RlOjpXcmFwRXhpc3RpbmdPYmpl
Y3QpCisgICAgICAgIHJldHVybiBhcmdzLkhvbGRlcigpOworICAgIGlmIChhcmdzLkxlbmd0aCgp
IDwgMikKKyAgICAgICAgcmV0dXJuIHRocm93Tm90RW5vdWdoQXJndW1lbnRzRXJyb3IoYXJncy5H
ZXRJc29sYXRlKCkpOworICAgIFY4VFJZQ0FUQ0hfRk9SX1Y4U1RSSU5HUkVTT1VSQ0UoVjhTdHJp
bmdSZXNvdXJjZTw+LCBoZWxsbywgTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoYXJncywgMCwgRGVm
YXVsdElzVW5kZWZpbmVkKSk7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPD0gMSB8fCAhYXJnc1sx
XS0+SXNGdW5jdGlvbigpKQorICAgICAgICByZXR1cm4gdGhyb3dUeXBlRXJyb3IoMCwgYXJncy5H
ZXRJc29sYXRlKCkpOworICAgIFJlZlB0cjxUZXN0Q2FsbGJhY2s+IHRlc3RDYWxsYmFjayA9IFY4
VGVzdENhbGxiYWNrOjpjcmVhdGUoYXJnc1sxXSwgZ2V0U2NyaXB0RXhlY3V0aW9uQ29udGV4dCgp
KTsKKworICAgIFJlZlB0cjxUZXN0VHlwZWRlZnM+IGltcGwgPSBUZXN0VHlwZWRlZnM6OmNyZWF0
ZShoZWxsbywgdGVzdENhbGxiYWNrKTsKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBw
ZXIgPSBhcmdzLkhvbGRlcigpOworCisgICAgVjhET01XcmFwcGVyOjphc3NvY2lhdGVPYmplY3RX
aXRoV3JhcHBlcihpbXBsLnJlbGVhc2UoKSwgJmluZm8sIHdyYXBwZXIsIGFyZ3MuR2V0SXNvbGF0
ZSgpLCBXcmFwcGVyQ29uZmlndXJhdGlvbjo6RGVwZW5kZW50KTsKKyAgICByZXR1cm4gd3JhcHBl
cjsKK30KKworc3RhdGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBDb25m
aWd1cmVWOFRlc3RUeXBlZGVmc1RlbXBsYXRlKHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRl
bXBsYXRlPiBkZXNjLCB2ODo6SXNvbGF0ZSogaXNvbGF0ZSkKK3sKKyAgICBkZXNjLT5SZWFkT25s
eVByb3RvdHlwZSgpOworCisgICAgdjg6OkxvY2FsPHY4OjpTaWduYXR1cmU+IGRlZmF1bHRTaWdu
YXR1cmU7CisgICAgZGVmYXVsdFNpZ25hdHVyZSA9IFY4RE9NQ29uZmlndXJhdGlvbjo6Y29uZmln
dXJlVGVtcGxhdGUoZGVzYywgIlRlc3RUeXBlZGVmcyIsIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5j
dGlvblRlbXBsYXRlPigpLCBWOFRlc3RUeXBlZGVmczo6aW50ZXJuYWxGaWVsZENvdW50LAorICAg
ICAgICBWOFRlc3RUeXBlZGVmc0F0dHJzLCBXVEZfQVJSQVlfTEVOR1RIKFY4VGVzdFR5cGVkZWZz
QXR0cnMpLAorICAgICAgICBWOFRlc3RUeXBlZGVmc0NhbGxiYWNrcywgV1RGX0FSUkFZX0xFTkdU
SChWOFRlc3RUeXBlZGVmc0NhbGxiYWNrcyksIGlzb2xhdGUpOworICAgIFVOVVNFRF9QQVJBTShk
ZWZhdWx0U2lnbmF0dXJlKTsgLy8gSW4gc29tZSBjYXNlcywgaXQgd2lsbCBub3QgYmUgdXNlZC4K
KyAgICBkZXNjLT5TZXRDYWxsSGFuZGxlcihWOFRlc3RUeXBlZGVmczo6Y29uc3RydWN0b3JDYWxs
YmFjayk7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4gaW5zdGFuY2UgPSBkZXNj
LT5JbnN0YW5jZVRlbXBsYXRlKCk7CisgICAgdjg6OkxvY2FsPHY4OjpPYmplY3RUZW1wbGF0ZT4g
cHJvdG8gPSBkZXNjLT5Qcm90b3R5cGVUZW1wbGF0ZSgpOworICAgIFVOVVNFRF9QQVJBTShpbnN0
YW5jZSk7IC8vIEluIHNvbWUgY2FzZXMsIGl0IHdpbGwgbm90IGJlIHVzZWQuCisgICAgVU5VU0VE
X1BBUkFNKHByb3RvKTsgLy8gSW4gc29tZSBjYXNlcywgaXQgd2lsbCBub3QgYmUgdXNlZC4KKyAg
ICAKKworICAgIC8vIEN1c3RvbSBTaWduYXR1cmUgJ21ldGhvZFdpdGhTZXF1ZW5jZUFyZycKKyAg
ICBjb25zdCBpbnQgbWV0aG9kV2l0aFNlcXVlbmNlQXJnQXJnYyA9IDE7CisgICAgdjg6OkhhbmRs
ZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gbWV0aG9kV2l0aFNlcXVlbmNlQXJnQXJndlttZXRob2RX
aXRoU2VxdWVuY2VBcmdBcmdjXSA9IHsgVjhzZXF1ZW5jZTxTZXJpYWxpemVkU2NyaXB0VmFsdWU+
OjpHZXRSYXdUZW1wbGF0ZShpc29sYXRlKSB9OworICAgIHY4OjpIYW5kbGU8djg6OlNpZ25hdHVy
ZT4gbWV0aG9kV2l0aFNlcXVlbmNlQXJnU2lnbmF0dXJlID0gdjg6OlNpZ25hdHVyZTo6TmV3KGRl
c2MsIG1ldGhvZFdpdGhTZXF1ZW5jZUFyZ0FyZ2MsIG1ldGhvZFdpdGhTZXF1ZW5jZUFyZ0FyZ3Yp
OworICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJtZXRob2RXaXRoU2VxdWVu
Y2VBcmciKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0VHlwZWRlZnNWOEludGVybmFs
OjptZXRob2RXaXRoU2VxdWVuY2VBcmdDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgbWV0aG9kV2l0
aFNlcXVlbmNlQXJnU2lnbmF0dXJlKSk7CisKKyAgICAvLyBDdXN0b20gU2lnbmF0dXJlICdudWxs
YWJsZUFycmF5QXJnJworICAgIGNvbnN0IGludCBudWxsYWJsZUFycmF5QXJnQXJnYyA9IDE7Cisg
ICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gbnVsbGFibGVBcnJheUFyZ0FyZ3Zb
bnVsbGFibGVBcnJheUFyZ0FyZ2NdID0geyBWOERPTVN0cmluZ1tdOjpHZXRSYXdUZW1wbGF0ZShp
c29sYXRlKSB9OworICAgIHY4OjpIYW5kbGU8djg6OlNpZ25hdHVyZT4gbnVsbGFibGVBcnJheUFy
Z1NpZ25hdHVyZSA9IHY4OjpTaWduYXR1cmU6Ok5ldyhkZXNjLCBudWxsYWJsZUFycmF5QXJnQXJn
YywgbnVsbGFibGVBcnJheUFyZ0FyZ3YpOworICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3
U3ltYm9sKCJudWxsYWJsZUFycmF5QXJnIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVz
dFR5cGVkZWZzVjhJbnRlcm5hbDo6bnVsbGFibGVBcnJheUFyZ0NhbGxiYWNrLCB2OFVuZGVmaW5l
ZCgpLCBudWxsYWJsZUFycmF5QXJnU2lnbmF0dXJlKSk7CisKKyAgICAvLyBDdXN0b20gU2lnbmF0
dXJlICdzdHJpbmdBcnJheUZ1bmN0aW9uJworICAgIGNvbnN0IGludCBzdHJpbmdBcnJheUZ1bmN0
aW9uQXJnYyA9IDE7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gc3RyaW5n
QXJyYXlGdW5jdGlvbkFyZ3Zbc3RyaW5nQXJyYXlGdW5jdGlvbkFyZ2NdID0geyBWOERPTVN0cmlu
Z1tdOjpHZXRSYXdUZW1wbGF0ZShpc29sYXRlKSB9OworICAgIHY4OjpIYW5kbGU8djg6OlNpZ25h
dHVyZT4gc3RyaW5nQXJyYXlGdW5jdGlvblNpZ25hdHVyZSA9IHY4OjpTaWduYXR1cmU6Ok5ldyhk
ZXNjLCBzdHJpbmdBcnJheUZ1bmN0aW9uQXJnYywgc3RyaW5nQXJyYXlGdW5jdGlvbkFyZ3YpOwor
ICAgIHByb3RvLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJzdHJpbmdBcnJheUZ1bmN0aW9u
IiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6c3Ry
aW5nQXJyYXlGdW5jdGlvbkNhbGxiYWNrLCB2OFVuZGVmaW5lZCgpLCBzdHJpbmdBcnJheUZ1bmN0
aW9uU2lnbmF0dXJlKSk7CisKKyAgICAvLyBDdXN0b20gdG9TdHJpbmcgdGVtcGxhdGUKKyAgICBk
ZXNjLT5TZXQodjg6OlN0cmluZzo6TmV3U3ltYm9sKCJ0b1N0cmluZyIpLCBWOFBlcklzb2xhdGVE
YXRhOjpjdXJyZW50KCktPnRvU3RyaW5nVGVtcGxhdGUoKSk7CisgICAgcmV0dXJuIGRlc2M7Cit9
CisKK3Y4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBWOFRlc3RUeXBlZGVmczo6
R2V0UmF3VGVtcGxhdGUodjg6Oklzb2xhdGUqIGlzb2xhdGUpCit7CisgICAgVjhQZXJJc29sYXRl
RGF0YSogZGF0YSA9IFY4UGVySXNvbGF0ZURhdGE6OmZyb20oaXNvbGF0ZSk7CisgICAgVjhQZXJJ
c29sYXRlRGF0YTo6VGVtcGxhdGVNYXA6Oml0ZXJhdG9yIHJlc3VsdCA9IGRhdGEtPnJhd1RlbXBs
YXRlTWFwKCkuZmluZCgmaW5mbyk7CisgICAgaWYgKHJlc3VsdCAhPSBkYXRhLT5yYXdUZW1wbGF0
ZU1hcCgpLmVuZCgpKQorICAgICAgICByZXR1cm4gcmVzdWx0LT52YWx1ZTsKKworICAgIHY4OjpI
YW5kbGVTY29wZSBoYW5kbGVTY29wZTsKKyAgICB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25U
ZW1wbGF0ZT4gdGVtcGwgPSBjcmVhdGVSYXdUZW1wbGF0ZShpc29sYXRlKTsKKyAgICBkYXRhLT5y
YXdUZW1wbGF0ZU1hcCgpLmFkZCgmaW5mbywgdGVtcGwpOworICAgIHJldHVybiB0ZW1wbDsKK30K
Kwordjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IFY4VGVzdFR5cGVkZWZzOjpH
ZXRUZW1wbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkKK3sKKyAgICBWOFBlcklzb2xhdGVEYXRh
KiBkYXRhID0gVjhQZXJJc29sYXRlRGF0YTo6ZnJvbShpc29sYXRlKTsKKyAgICBWOFBlcklzb2xh
dGVEYXRhOjpUZW1wbGF0ZU1hcDo6aXRlcmF0b3IgcmVzdWx0ID0gZGF0YS0+dGVtcGxhdGVNYXAo
KS5maW5kKCZpbmZvKTsKKyAgICBpZiAocmVzdWx0ICE9IGRhdGEtPnRlbXBsYXRlTWFwKCkuZW5k
KCkpCisgICAgICAgIHJldHVybiByZXN1bHQtPnZhbHVlOworCisgICAgdjg6OkhhbmRsZVNjb3Bl
IGhhbmRsZVNjb3BlOworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiB0
ZW1wbCA9CisgICAgICAgIENvbmZpZ3VyZVY4VGVzdFR5cGVkZWZzVGVtcGxhdGUoR2V0UmF3VGVt
cGxhdGUoaXNvbGF0ZSksIGlzb2xhdGUpOworICAgIGRhdGEtPnRlbXBsYXRlTWFwKCkuYWRkKCZp
bmZvLCB0ZW1wbCk7CisgICAgcmV0dXJuIHRlbXBsOworfQorCitib29sIFY4VGVzdFR5cGVkZWZz
OjpIYXNJbnN0YW5jZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdmFsdWUsIHY4OjpJc29sYXRlKiBp
c29sYXRlKQoreworICAgIHJldHVybiBHZXRSYXdUZW1wbGF0ZShpc29sYXRlKS0+SGFzSW5zdGFu
Y2UodmFsdWUpOworfQorCisKK3Y4OjpIYW5kbGU8djg6Ok9iamVjdD4gVjhUZXN0VHlwZWRlZnM6
OmNyZWF0ZVdyYXBwZXIoUGFzc1JlZlB0cjxUZXN0VHlwZWRlZnM+IGltcGwsIHY4OjpIYW5kbGU8
djg6Ok9iamVjdD4gY3JlYXRpb25Db250ZXh0LCB2ODo6SXNvbGF0ZSogaXNvbGF0ZSkKK3sKKyAg
ICBBU1NFUlQoaW1wbC5nZXQoKSk7CisgICAgQVNTRVJUKERPTURhdGFTdG9yZTo6Z2V0V3JhcHBl
cihpbXBsLmdldCgpLCBpc29sYXRlKS5Jc0VtcHR5KCkpOworCisjaWYgRU5BQkxFKEJJTkRJTkdf
SU5URUdSSVRZKQorICAgIGNoZWNrVHlwZU9yRGllVHJ5aW5nKGltcGwuZ2V0KCkpOworI2VuZGlm
CisKKyAgICB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXBwZXIgPSBWOERPTVdyYXBwZXI6OmNy
ZWF0ZVdyYXBwZXIoY3JlYXRpb25Db250ZXh0LCAmaW5mbywgaW1wbC5nZXQoKSwgaXNvbGF0ZSk7
CisgICAgaWYgKFVOTElLRUxZKHdyYXBwZXIuSXNFbXB0eSgpKSkKKyAgICAgICAgcmV0dXJuIHdy
YXBwZXI7CisKKyAgICBpbnN0YWxsUGVyQ29udGV4dFByb3BlcnRpZXMod3JhcHBlciwgaW1wbC5n
ZXQoKSwgaXNvbGF0ZSk7CisgICAgVjhET01XcmFwcGVyOjphc3NvY2lhdGVPYmplY3RXaXRoV3Jh
cHBlcihpbXBsLCAmaW5mbywgd3JhcHBlciwgaXNvbGF0ZSwgaGFzRGVwZW5kZW50TGlmZXRpbWUg
PyBXcmFwcGVyQ29uZmlndXJhdGlvbjo6RGVwZW5kZW50IDogV3JhcHBlckNvbmZpZ3VyYXRpb246
OkluZGVwZW5kZW50KTsKKyAgICByZXR1cm4gd3JhcHBlcjsKK30KK3ZvaWQgVjhUZXN0VHlwZWRl
ZnM6OmRlcmVmT2JqZWN0KHZvaWQqIG9iamVjdCkKK3sKKyAgICBzdGF0aWNfY2FzdDxUZXN0VHlw
ZWRlZnMqPihvYmplY3QpLT5kZXJlZigpOworfQorCit9IC8vIG5hbWVzcGFjZSBXZWJDb3JlCmRp
ZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgvVjhUZXN0
VHlwZWRlZnMuaCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRl
c3RUeXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmMxZTZmMjk2ODlhMzg1YTQyNzYyYjMyZDcxZmZlNGZj
NDhkYzM1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3Jp
cHRzL3Rlc3QvVjgvVjhUZXN0VHlwZWRlZnMuaApAQCAtMCwwICsxLDk3IEBACisvKgorICAgIFRo
aXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBXZWJLaXQgb3BlbiBzb3VyY2UgcHJvamVjdC4KKyAgICBU
aGlzIGZpbGUgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWJpbmRpbmdzLnBsLiBETyBO
T1QgTU9ESUZZIQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g
cmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2Yg
dGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQg
YnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9m
IHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisg
ICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBi
ZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhl
IGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1Ig
QSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJl
Y2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor
ICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJ
ZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwg
NTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywg
VVNBLgorKi8KKworI2lmbmRlZiBWOFRlc3RUeXBlZGVmc19oCisjZGVmaW5lIFY4VGVzdFR5cGVk
ZWZzX2gKKworI2luY2x1ZGUgIlRlc3RUeXBlZGVmcy5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5o
IgorI2luY2x1ZGUgIlY4RE9NV3JhcHBlci5oIgorI2luY2x1ZGUgIldyYXBwZXJUeXBlSW5mby5o
IgorI2luY2x1ZGUgPHY4Lmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KKyNpbmNsdWRlIDx3
dGYvdGV4dC9TdHJpbmdIYXNoLmg+CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworY2xhc3MgVjhU
ZXN0VHlwZWRlZnMgeworcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBib29sIGhhc0RlcGVuZGVu
dExpZmV0aW1lID0gZmFsc2U7CisgICAgc3RhdGljIGJvb2wgSGFzSW5zdGFuY2Uodjg6OkhhbmRs
ZTx2ODo6VmFsdWU+LCB2ODo6SXNvbGF0ZSopOworICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2
ODo6RnVuY3Rpb25UZW1wbGF0ZT4gR2V0UmF3VGVtcGxhdGUodjg6Oklzb2xhdGUqKTsKKyAgICBz
dGF0aWMgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IEdldFRlbXBsYXRlKHY4
OjpJc29sYXRlKik7CisgICAgc3RhdGljIFRlc3RUeXBlZGVmcyogdG9OYXRpdmUodjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiBvYmplY3QpCisgICAgeworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRf
Y2FzdDxUZXN0VHlwZWRlZnMqPihvYmplY3QtPkdldEFsaWduZWRQb2ludGVyRnJvbUludGVybmFs
RmllbGQodjhET01XcmFwcGVyT2JqZWN0SW5kZXgpKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQg
ZGVyZWZPYmplY3Qodm9pZCopOworICAgIHN0YXRpYyBXcmFwcGVyVHlwZUluZm8gaW5mbzsKKyAg
ICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGNvbnN0cnVjdG9yQ2FsbGJhY2soY29uc3Qg
djg6OkFyZ3VtZW50cyYpOworICAgIHN0YXRpYyBjb25zdCBpbnQgaW50ZXJuYWxGaWVsZENvdW50
ID0gdjhEZWZhdWx0V3JhcHBlckludGVybmFsRmllbGRDb3VudCArIDA7CisgICAgc3RhdGljIHZv
aWQgaW5zdGFsbFBlckNvbnRleHRQcm9wZXJ0aWVzKHY4OjpIYW5kbGU8djg6Ok9iamVjdD4sIFRl
c3RUeXBlZGVmcyosIHY4OjpJc29sYXRlKikgeyB9CisgICAgc3RhdGljIHZvaWQgaW5zdGFsbFBl
ckNvbnRleHRQcm90b3R5cGVQcm9wZXJ0aWVzKHY4OjpIYW5kbGU8djg6Ok9iamVjdD4sIHY4OjpJ
c29sYXRlKikgeyB9Citwcml2YXRlOgorICAgIGZyaWVuZCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+
IHdyYXAoVGVzdFR5cGVkZWZzKiwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRl
eHQsIHY4OjpJc29sYXRlKik7CisgICAgc3RhdGljIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gY3Jl
YXRlV3JhcHBlcihQYXNzUmVmUHRyPFRlc3RUeXBlZGVmcz4sIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gY3JlYXRpb25Db250ZXh0LCB2ODo6SXNvbGF0ZSopOworfTsKKworCitpbmxpbmUgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiB3cmFwKFRlc3RUeXBlZGVmcyogaW1wbCwgdjg6OkhhbmRsZTx2ODo6
T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4OjpJc29sYXRlKiBpc29sYXRlKQoreworICAgIEFT
U0VSVChpbXBsKTsKKyAgICBBU1NFUlQoRE9NRGF0YVN0b3JlOjpnZXRXcmFwcGVyKGltcGwsIGlz
b2xhdGUpLklzRW1wdHkoKSk7CisgICAgcmV0dXJuIFY4VGVzdFR5cGVkZWZzOjpjcmVhdGVXcmFw
cGVyKGltcGwsIGNyZWF0aW9uQ29udGV4dCwgaXNvbGF0ZSk7Cit9CisKK2lubGluZSB2ODo6SGFu
ZGxlPHY4OjpWYWx1ZT4gdG9WOChUZXN0VHlwZWRlZnMqIGltcGwsIHY4OjpIYW5kbGU8djg6Ok9i
amVjdD4gY3JlYXRpb25Db250ZXh0LCB2ODo6SXNvbGF0ZSogaXNvbGF0ZSkKK3sKKyAgICBpZiAo
VU5MSUtFTFkoIWltcGwpKQorICAgICAgICByZXR1cm4gdjhOdWxsV2l0aENoZWNrKGlzb2xhdGUp
OworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB3cmFwcGVyID0gRE9NRGF0YVN0b3JlOjpnZXRX
cmFwcGVyKGltcGwsIGlzb2xhdGUpOworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAg
ICAgIHJldHVybiB3cmFwcGVyOworICAgIHJldHVybiB3cmFwKGltcGwsIGNyZWF0aW9uQ29udGV4
dCwgaXNvbGF0ZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEhvbGRlckNvbnRhaW5lciwgY2xhc3Mg
V3JhcHBhYmxlPgoraW5saW5lIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0b1Y4RmFzdChUZXN0VHlw
ZWRlZnMqIGltcGwsIGNvbnN0IEhvbGRlckNvbnRhaW5lciYgY29udGFpbmVyLCBXcmFwcGFibGUq
IHdyYXBwYWJsZSkKK3sKKyAgICBpZiAoVU5MSUtFTFkoIWltcGwpKQorICAgICAgICByZXR1cm4g
djhOdWxsKGNvbnRhaW5lci5HZXRJc29sYXRlKCkpOworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVj
dD4gd3JhcHBlciA9IERPTURhdGFTdG9yZTo6Z2V0V3JhcHBlckZhc3QoaW1wbCwgY29udGFpbmVy
LCB3cmFwcGFibGUpOworICAgIGlmICghd3JhcHBlci5Jc0VtcHR5KCkpCisgICAgICAgIHJldHVy
biB3cmFwcGVyOworICAgIHJldHVybiB3cmFwKGltcGwsIGNvbnRhaW5lci5Ib2xkZXIoKSwgY29u
dGFpbmVyLkdldElzb2xhdGUoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIEhvbGRlckNvbnRhaW5l
ciwgY2xhc3MgV3JhcHBhYmxlPgoraW5saW5lIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0b1Y4RmFz
dChQYXNzUmVmUHRyPCBUZXN0VHlwZWRlZnMgPiBpbXBsLCBjb25zdCBIb2xkZXJDb250YWluZXIm
IGNvbnRhaW5lciwgV3JhcHBhYmxlKiB3cmFwcGFibGUpCit7CisgICAgcmV0dXJuIHRvVjhGYXN0
KGltcGwuZ2V0KCksIGNvbnRhaW5lciwgd3JhcHBhYmxlKTsKK30KKworaW5saW5lIHY4OjpIYW5k
bGU8djg6OlZhbHVlPiB0b1Y4KFBhc3NSZWZQdHI8IFRlc3RUeXBlZGVmcyA+IGltcGwsIHY4OjpI
YW5kbGU8djg6Ok9iamVjdD4gY3JlYXRpb25Db250ZXh0LCB2ODo6SXNvbGF0ZSogaXNvbGF0ZSkK
K3sKKyAgICByZXR1cm4gdG9WOChpbXBsLmdldCgpLCBjcmVhdGlvbkNvbnRleHQsIGlzb2xhdGUp
OworfQorCit9CisKKyNlbmRpZiAvLyBWOFRlc3RUeXBlZGVmc19oCg==
</data>

          </attachment>
          <attachment
              isobsolete="1"
              ispatch="1"
              isprivate="0"
          >
            <attachid>188276</attachid>
            <date>2013-02-14 00:32:18 -0800</date>
            <delta_ts>2013-02-14 01:11:33 -0800</delta_ts>
            <desc>Patch</desc>
            <filename>bug-52340-20130214122845.patch</filename>
            <type>text/plain</type>
            <size>138057</size>
            <attacher name="Andrey Adaikin">aandrey</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQyNjM1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNWNiZWQyNTQwZjhjNDMw
YjcyNGI2NDc5ZTE5YzNiODE5MzBiNGIyNi4uOGJkYWRiMWY1YjFjY2RjZGUyNGMxMmFkYzBjYjU2
NzA2ZjAxODU4NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3OSBAQAorMjAxMy0wMi0xMyAgQW5k
cmV5IEFkYWlraW4gIDxhYW5kcmV5QGNocm9taXVtLm9yZz4KKworICAgICAgICBMb29rIGludG8g
cG9zc2liaWxpdGllcyBvZiB0eXBlZGVmIGluIHdlYmtpdCBpZGwgZmlsZXMKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyMzQwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIHR5cGVkZWYgc3VwcG9ydCBm
b3IgV2ViS2l0IElETCBwYXJzZXIuCisgICAgICAgIERyaXZlIGJ5OiBmaXhlZCBhIGJ1ZyBvZiBn
ZW5lcmF0aW5nICJ1bnJlc3RyaWN0ZWRmbG9hdCIgd2l0aG91dCBhIHNwYWNlLgorCisgICAgICAg
IEFkZGVkIGEgbmV3IElETCB0ZXN0IFRlc3RUeXBlZGVmcy5pZGwuIFRoZSByZXN1bHRzIHdlcmUg
Z2VuZXJhdGVkIHdpdGhvdXQgdHlwZWRlZnMuCisKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRz
L0lETFBhcnNlci5wbToKKyAgICAgICAgKGFzc2VydE5vRXh0ZW5kZWRBdHRyaWJ1dGVzSW5UeXBl
ZGVmKToKKyAgICAgICAgKHBhcnNlRGVmaW5pdGlvbnMpOgorICAgICAgICAoYXBwbHlUeXBlZGVm
cyk6CisgICAgICAgIChhcHBseVR5cGVkZWZzRm9yU2lnbmF0dXJlKToKKyAgICAgICAgKHBhcnNl
VHlwZWRlZik6CisgICAgICAgIChwYXJzZVVucmVzdHJpY3RlZEZsb2F0VHlwZSk6CisgICAgICAg
ICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0
ZTo6V2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSk6CisgICAgICAgIChXZWJET01UZXN0VHlwZWRl
ZnM6OldlYkRPTVRlc3RUeXBlZGVmc1ByaXZhdGUpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVk
ZWZzOjpXZWJET01UZXN0VHlwZWRlZnMpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpv
cGVyYXRvcj0pOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjppbXBsKToKKyAgICAgICAg
KFdlYkRPTVRlc3RUeXBlZGVmczo6fldlYkRPTVRlc3RUeXBlZGVmcyk6CisgICAgICAgIChXZWJE
T01UZXN0VHlwZWRlZnM6OnVuc2lnbmVkTG9uZ0xvbmdBdHRyKToKKyAgICAgICAgKFdlYkRPTVRl
c3RUeXBlZGVmczo6c2V0VW5zaWduZWRMb25nTG9uZ0F0dHIpOgorICAgICAgICAoV2ViRE9NVGVz
dFR5cGVkZWZzOjppbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAgICAgICAoV2Vi
RE9NVGVzdFR5cGVkZWZzOjpzZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAg
ICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpmdW5jKToKKyAgICAgICAgKFdlYkRPTVRlc3RUeXBl
ZGVmczo6bXVsdGlUcmFuc2Zlckxpc3QpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpz
ZXRTaGFkb3cpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpudWxsYWJsZUFycmF5QXJn
KToKKyAgICAgICAgKFdlYkRPTVRlc3RUeXBlZGVmczo6aW1tdXRhYmxlUG9pbnRGdW5jdGlvbik6
CisgICAgICAgICh0b1dlYkNvcmUpOgorICAgICAgICAodG9XZWJLaXQpOgorICAgICAgICAqIGJp
bmRpbmdzL3NjcmlwdHMvdGVzdC9DUFAvV2ViRE9NVGVzdFR5cGVkZWZzLmg6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJET01UZXN0VHlwZWRlZnMpOgorICAgICAgICAq
IGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmcy5jcHA6
IEFkZGVkLgorICAgICAgICAoX1dlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUpOgorICAgICAg
ICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6a2l0KToKKyAgICAgICAgKFdlYktpdDo6Y29y
ZSk6CisgICAgICAgIChXZWJLaXQ6OndyYXBUZXN0VHlwZWRlZnMpOgorICAgICAgICAod2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2ZpbmFsaXplKToKKyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90
eXBlZGVmc19zZXRfcHJvcGVydHkpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X2dldF9wcm9wZXJ0eSk6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfY29uc3Ry
dWN0b3IpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2NsYXNzX2luaXQpOgor
ICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2luaXQpOgorICAgICAgICAod2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2Z1bmMpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX211bHRpX3RyYW5zZmVyX2xpc3QpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX3NldF9zaGFkb3cpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX251bGxh
YmxlX2FycmF5X2FyZyk6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfaW1tdXRh
YmxlX3BvaW50X2Z1bmN0aW9uKToKKyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19z
dHJpbmdfYXJyYXlfZnVuY3Rpb24pOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X2dldF91bnNpZ25lZF9sb25nX2xvbmdfYXR0cik6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3Rf
dHlwZWRlZnNfc2V0X3Vuc2lnbmVkX2xvbmdfbG9uZ19hdHRyKToKKyAgICAgICAgKHdlYmtpdF9k
b21fdGVzdF90eXBlZGVmc19nZXRfaW1tdXRhYmxlX3NlcmlhbGl6ZWRfc2NyaXB0X3ZhbHVlKToK
KyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfaW1tdXRhYmxlX3NlcmlhbGl6
ZWRfc2NyaXB0X3ZhbHVlKToKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvR09iamVj
dC9XZWJLaXRET01UZXN0VHlwZWRlZnMuaDogQWRkZWQuCisgICAgICAgIChfV2ViS2l0RE9NVGVz
dFR5cGVkZWZzKToKKyAgICAgICAgKF9XZWJLaXRET01UZXN0VHlwZWRlZnNDbGFzcyk6CisgICAg
ICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZz
UHJpdmF0ZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgICogYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L0pTL0pTVGVzdFR5cGVkZWZzLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmNvbnN0
cnVjdEpTVGVzdFR5cGVkZWZzKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29u
c3RydWN0b3I6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6
SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6ZmluaXNoQ3JlYXRpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6Z2V0T3duUHJvcGVydHlTbG90KToKKyAg
ICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmdldE93blByb3BlcnR5
RGVzY3JpcHRvcik6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9y
OjpnZXRDb25zdHJ1Y3REYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJv
dG90eXBlOjpzZWxmKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJvdG90eXBl
OjpnZXRPd25Qcm9wZXJ0eVNsb3QpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNQ
cm90b3R5cGU6OmdldE93blByb3BlcnR5RGVzY3JpcHRvcik6CisgICAgICAgIChXZWJDb3JlOjpK
U1Rlc3RUeXBlZGVmczo6SlNUZXN0VHlwZWRlZnMpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0
VHlwZWRlZnM6OmZpbmlzaENyZWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVk
ZWZzOjpjcmVhdGVQcm90b3R5cGUpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6
OmRlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6On5KU1Rlc3RUeXBl
ZGVmcyk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Z2V0T3duUHJvcGVydHlT
bG90KToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpnZXRPd25Qcm9wZXJ0eURl
c2NyaXB0b3IpOgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdM
b25nQXR0cik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0ltbXV0YWJsZVNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0NvbnN0
cnVjdG9yVGVzdFN1Yk9iaik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0NvbnN0
cnVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpwdXQpOgorICAgICAg
ICAoV2ViQ29yZTo6c2V0SlNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdMb25nQXR0cik6CisgICAg
ICAgIChXZWJDb3JlOjpzZXRKU1Rlc3RUeXBlZGVmc0ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Z2V0Q29uc3RydWN0b3Ip
OgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbkZ1bmMp
OgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk11bHRp
VHJhbnNmZXJMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OmpzVGVzdFR5cGVkZWZzUHJvdG90eXBl
RnVuY3Rpb25TZXRTaGFkb3cpOgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90
b3R5cGVGdW5jdGlvbk1ldGhvZFdpdGhTZXF1ZW5jZUFyZyk6CisgICAgICAgIChXZWJDb3JlOjpq
c1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uTnVsbGFibGVBcnJheUFyZyk6CisgICAgICAg
IChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uRnVuY1dpdGhDbGFtcCk6
CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uSW1tdXRh
YmxlUG9pbnRGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3Rv
dHlwZUZ1bmN0aW9uU3RyaW5nQXJyYXlGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjppc09i
c2VydmFibGUpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNPd25lcjo6aXNSZWFj
aGFibGVGcm9tT3BhcXVlUm9vdHMpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNP
d25lcjo6ZmluYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6dG9KUyk6CisgICAgICAgIChXZWJD
b3JlOjp0b1Rlc3RUeXBlZGVmcyk6CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pT
L0pTVGVzdFR5cGVkZWZzLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChK
U1Rlc3RUeXBlZGVmcyk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Y3JlYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpjcmVhdGVTdHJ1Y3R1cmUpOgor
ICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6OmltcGwpOgorICAgICAgICAoV2ViQ29y
ZTo6SlNUZXN0VHlwZWRlZnM6OnJlbGVhc2VJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVz
dFR5cGVkZWZzOjpyZWxlYXNlSW1wbElmTm90TnVsbCk6CisgICAgICAgIChKU1Rlc3RUeXBlZGVm
c093bmVyKToKKyAgICAgICAgKFdlYkNvcmU6OndyYXBwZXJPd25lcik6CisgICAgICAgIChXZWJD
b3JlOjp3cmFwcGVyQ29udGV4dCk6CisgICAgICAgIChKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSk6
CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZTo6Y3JlYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJvdG90eXBlOjpjcmVhdGVTdHJ1Y3R1cmUp
OgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6OkpTVGVzdFR5cGVk
ZWZzUHJvdG90eXBlKToKKyAgICAgICAgKEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IpOgorICAg
ICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6Y3JlYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmNyZWF0ZVN0cnVjdHVyZSk6
CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLmg6
IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBl
ZGVmcy5tbTogQWRkZWQuCisgICAgICAgICgtW0RPTVRlc3RUeXBlZGVmcyBkZWFsbG9jXSk6Cisg
ICAgICAgICgtW0RPTVRlc3RUeXBlZGVmcyBmaW5hbGl6ZV0pOgorICAgICAgICAoLVtET01UZXN0
VHlwZWRlZnMgdW5zaWduZWRMb25nTG9uZ0F0dHJdKToKKyAgICAgICAgKC1bRE9NVGVzdFR5cGVk
ZWZzIHNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyOl0pOgorICAgICAgICAoLVtET01UZXN0VHlwZWRl
ZnMgaW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlXSk6CisgICAgICAgICgtW0RPTVRlc3RU
eXBlZGVmcyBzZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWU6XSk6CisgICAgICAgICgt
W0RPTVRlc3RUeXBlZGVmcyBtdWx0aVRyYW5zZmVyTGlzdDp0eDpzZWNvbmQ6dHh4Ol0pOgorICAg
ICAgICAoLVtET01UZXN0VHlwZWRlZnMgc2V0U2hhZG93OmhlaWdodDpibHVyOmNvbG9yOmFscGhh
Ol0pOgorICAgICAgICAoLVtET01UZXN0VHlwZWRlZnMgaW1tdXRhYmxlUG9pbnRGdW5jdGlvbl0p
OgorICAgICAgICAoY29yZSk6CisgICAgICAgIChraXQpOgorICAgICAgICAqIGJpbmRpbmdzL3Nj
cmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBlZGVmc0ludGVybmFsLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZSk6CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RUeXBlZGVm
cy5pZGw6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RU
eXBlZGVmcy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpjaGVja1R5cGVPckRpZVRyeWluZyk6CisgICAgICAgIChUZXN0VHlwZWRlZnNWOEludGVybmFs
KToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OlY4X1VTRSk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNWOEludGVybmFsOjp1bnNpZ25lZExvbmdMb25n
QXR0ckF0dHJHZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5h
bDo6dW5zaWduZWRMb25nTG9uZ0F0dHJBdHRyU2V0dGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
c3RUeXBlZGVmc1Y4SW50ZXJuYWw6OmltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZUF0dHJH
ZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRh
YmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlQXR0clNldHRlcik6CisgICAgICAgIChXZWJDb3JlOjpU
ZXN0VHlwZWRlZnNWOEludGVybmFsOjpUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvckdldHRlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNWOEludGVybmFsOjpUZXN0VHlwZWRlZnNSZXBs
YWNlYWJsZUF0dHJTZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRl
cm5hbDo6ZnVuY0NhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50
ZXJuYWw6Om11bHRpVHJhbnNmZXJMaXN0Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VGVz
dFR5cGVkZWZzVjhJbnRlcm5hbDo6c2V0U2hhZG93Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29y
ZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6bWV0aG9kV2l0aFNlcXVlbmNlQXJnQ2FsbGJhY2sp
OgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6bnVsbGFibGVBcnJh
eUFyZ0NhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6
OmZ1bmNXaXRoQ2xhbXBDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNW
OEludGVybmFsOjppbW11dGFibGVQb2ludEZ1bmN0aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6c3RyaW5nQXJyYXlGdW5jdGlvbkNhbGxiYWNr
KToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjpjb25zdHJ1Y3RvckNhbGxiYWNr
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbmZpZ3VyZVY4VGVzdFR5cGVkZWZzVGVtcGxhdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6VjhUZXN0VHlwZWRlZnM6OkdldFJhd1RlbXBsYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjpHZXRUZW1wbGF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpWOFRlc3RUeXBlZGVmczo6SGFzSW5zdGFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6VjhU
ZXN0VHlwZWRlZnM6OmNyZWF0ZVdyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhUZXN0VHlw
ZWRlZnM6OmRlcmVmT2JqZWN0KToKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgv
VjhUZXN0VHlwZWRlZnMuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFY4
VGVzdFR5cGVkZWZzKToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjp0b05hdGl2
ZSk6CisgICAgICAgIChXZWJDb3JlOjpWOFRlc3RUeXBlZGVmczo6aW5zdGFsbFBlckNvbnRleHRQ
cm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjppbnN0YWxsUGVy
Q29udGV4dFByb3RvdHlwZVByb3BlcnRpZXMpOgorICAgICAgICAoV2ViQ29yZTo6d3JhcCk6Cisg
ICAgICAgIChXZWJDb3JlOjp0b1Y4KToKKyAgICAgICAgKFdlYkNvcmU6OnRvVjhGYXN0KToKKwog
MjAxMy0wMi0xMiAgUmFmYWVsIFdlaW5zdGVpbiAgPHJhZmFlbHdAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFtIVE1MVGVtcGxhdGVFbGVtZW50XSA8dGVtcGxhdGU+IGluc2lkZSBvZiA8aGVhZD4g
bWF5IG5vdCBjcmVhdGUgPGJvZHk+IGlmIEVPRiBpcyBoaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvSURMUGFyc2VyLnBtIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIucG0KaW5kZXggNmFlOGI5ZTBkZDJjZjk4Mjg4MThjYTIx
YmI3ZWJkYjA3NjI5NjI2Yy4uN2Y1ODNhNDVmOTA1NTQzMmRkYTg1MWNmY2VlOTM3M2E5NzZiNzJh
NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIu
cG0KKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIucG0KQEAg
LTQ4LDcgKzQ4LDcgQEAgc3RydWN0KCBkb21JbnRlcmZhY2UgPT4gewogICAgIGZ1bmN0aW9ucyA9
PiAnQCcsICAgICMgTGlzdCBvZiAnZG9tRnVuY3Rpb24nCiAgICAgYXR0cmlidXRlcyA9PiAnQCcs
ICAgICMgTGlzdCBvZiAnZG9tQXR0cmlidXRlJyAgICAKICAgICBleHRlbmRlZEF0dHJpYnV0ZXMg
PT4gJyQnLCAjIEV4dGVuZGVkIGF0dHJpYnV0ZXMKLSAgICBjb25zdHJ1Y3RvcnMgPT4gJ0AnLCAj
IENvbnN0cnVjdG9yCisgICAgY29uc3RydWN0b3JzID0+ICdAJywgIyBDb25zdHJ1Y3RvcnMsIGxp
c3Qgb2YgJ2RvbUZ1bmN0aW9uJwogICAgIGlzRXhjZXB0aW9uID0+ICckJywgIyBVc2VkIGZvciBl
eGNlcHRpb24gaW50ZXJmYWNlcwogfSk7CiAKQEAgLTk4LDYgKzk4LDE0IEBAIHN0cnVjdCggVG9r
ZW4gPT4gewogICAgIHZhbHVlID0+ICckJyAjIHZhbHVlIG9mIHRva2VuCiB9KTsKIAorc3RydWN0
KCBUeXBlZGVmID0+IHsKKyAgICBleHRlbmRlZEF0dHJpYnV0ZXMgPT4gJyQnLCAjIEV4dGVuZGVk
IGF0dHJpYnV0ZXMKKyAgICB0eXBlID0+ICckJywgIyBUeXBlIG9mIGRhdGEKK30pOworCisjIE1h
cHMgJ3R5cGVkZWYgbmFtZScgLT4gVHlwZWRlZgorbXkgJXR5cGVkZWZzID0gKCk7CisKIHN1YiBu
ZXcgewogICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogCkBAIC0xNDksNiArMTU3LDE5IEBAIHN1YiBh
c3NlcnRVbmV4cGVjdGVkVG9rZW4KICAgICBkaWUgJG1zZzsKIH0KIAorc3ViIGFzc2VydE5vRXh0
ZW5kZWRBdHRyaWJ1dGVzSW5UeXBlZGVmCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBt
eSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRsaW5lID0gc2hpZnQ7CisgICAgbXkgJHR5cGVkZWYg
PSAkdHlwZWRlZnN7JG5hbWV9OworICAgIG15ICRtc2cgPSAiVW5leHBlY3RlZCBleHRlbmRlZEF0
dHJpYnV0ZUxpc3QgaW4gdHlwZWRlZiBcIiRuYW1lXCIgYXQgIiAuICRzZWxmLT57TGluZX07Cisg
ICAgaWYgKGRlZmluZWQgKCRsaW5lKSkgeworICAgICAgICAkbXNnIC49ICIgSURMUGFyc2VyLnBt
OiIgLiAkbGluZTsKKyAgICB9CisgICAgZGllICRtc2cgaWYgJXskdHlwZWRlZi0+ZXh0ZW5kZWRB
dHRyaWJ1dGVzfTsKK30KKwogc3ViIFBhcnNlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKQEAg
LTMyMiw5ICszNDMsNzMgQEAgc3ViIHBhcnNlRGVmaW5pdGlvbnMKICAgICAgICAgICAgIHB1c2go
QGRlZmluaXRpb25zLCAkZGVmaW5pdGlvbik7CiAgICAgICAgIH0KICAgICB9CisgICAgJHNlbGYt
PmFwcGx5VHlwZWRlZnMoXEBkZWZpbml0aW9ucyk7CiAgICAgcmV0dXJuIFxAZGVmaW5pdGlvbnM7
CiB9CiAKK3N1YiBhcHBseVR5cGVkZWZzCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBt
eSAkZGVmaW5pdGlvbnMgPSBzaGlmdDsKKyAgIAorICAgIGlmICghJXR5cGVkZWZzKSB7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yZWFjaCBteSAkZGVmaW5pdGlvbiAoQCRkZWZpbml0
aW9ucykgeworICAgICAgICBpZiAocmVmKCRkZWZpbml0aW9uKSBlcSAiZG9tSW50ZXJmYWNlIikg
eworICAgICAgICAgICAgZm9yZWFjaCBteSAkY29uc3RhbnQgKEB7JGRlZmluaXRpb24tPmNvbnN0
YW50c30pIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhpc3RzICR0eXBlZGVmc3skY29uc3RhbnQt
PnR5cGV9KSB7CisgICAgICAgICAgICAgICAgICAgIG15ICR0eXBlZGVmID0gJHR5cGVkZWZzeyRj
b25zdGFudC0+dHlwZX07CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5hc3NlcnROb0V4dGVu
ZGVkQXR0cmlidXRlc0luVHlwZWRlZigkY29uc3RhbnQtPnR5cGUsIF9fTElORV9fKTsKKyAgICAg
ICAgICAgICAgICAgICAgJGNvbnN0YW50LT50eXBlKCR0eXBlZGVmLT50eXBlKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoIG15ICRhdHRyaWJ1
dGUgKEB7JGRlZmluaXRpb24tPmF0dHJpYnV0ZXN9KSB7CisgICAgICAgICAgICAgICAgJHNlbGYt
PmFwcGx5VHlwZWRlZnNGb3JTaWduYXR1cmUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJGZ1bmN0aW9uIChAeyRkZWZpbml0aW9u
LT5mdW5jdGlvbnN9LCBAeyRkZWZpbml0aW9uLT5jb25zdHJ1Y3RvcnN9KSB7CisgICAgICAgICAg
ICAgICAgJHNlbGYtPmFwcGx5VHlwZWRlZnNGb3JTaWduYXR1cmUoJGZ1bmN0aW9uLT5zaWduYXR1
cmUpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHNpZ25hdHVyZSAoQHskZnVuY3Rpb24t
PnBhcmFtZXRlcnN9KSB7CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5hcHBseVR5cGVkZWZz
Rm9yU2lnbmF0dXJlKCRzaWduYXR1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3ViIGFwcGx5VHlwZWRlZnNGb3JTaWduYXR1cmUK
K3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzaWduYXR1cmUgPSBzaGlmdDsKKwor
ICAgIGlmICghZGVmaW5lZCAoJHNpZ25hdHVyZS0+dHlwZSkpIHsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIG15ICR0eXBlID0gJHNpZ25hdHVyZS0+dHlwZTsKKyAgICAkdHlwZSA9fiBz
L1tcP1xbXF1dKyQvL2c7CisgICAgbXkgJHR5cGVTdWZmaXggPSAkc2lnbmF0dXJlLT50eXBlOwor
ICAgICR0eXBlU3VmZml4ID1+IHMvXlteXD9cW1xdXSsvL2c7CisgICAgaWYgKGV4aXN0cyAkdHlw
ZWRlZnN7JHR5cGV9KSB7CisgICAgICAgIG15ICR0eXBlZGVmID0gJHR5cGVkZWZzeyR0eXBlfTsK
KyAgICAgICAgJHNpZ25hdHVyZS0+dHlwZSgkdHlwZWRlZi0+dHlwZSAuICR0eXBlU3VmZml4KTsK
KyAgICAgICAgY29weUV4dGVuZGVkQXR0cmlidXRlcygkc2lnbmF0dXJlLT5leHRlbmRlZEF0dHJp
YnV0ZXMsICR0eXBlZGVmLT5leHRlbmRlZEF0dHJpYnV0ZXMpOworICAgIH0KKworICAgICMgSGFu
ZGxlIHVuaW9uIHR5cGVzLCBzZXF1ZW5jZXMgYW5kIGV0Yy4KKyAgICBmb3JlYWNoIG15ICRuYW1l
ICgldHlwZWRlZnMpIHsKKyAgICAgICAgaWYgKCFleGlzdHMgJHR5cGVkZWZzeyRuYW1lfSkgewor
ICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorICAgICAgICBteSAkdHlwZWRlZiA9ICR0eXBl
ZGVmc3skbmFtZX07CisgICAgICAgIG15ICRyZWdleCA9ICdcXGInIC4gJG5hbWUgLiAnXFxiJzsK
KyAgICAgICAgbXkgJHJlcGxhY2VtZW50ID0gJHR5cGVkZWYtPnR5cGU7CisgICAgICAgIG15ICR0
eXBlID0gJHNpZ25hdHVyZS0+dHlwZTsKKyAgICAgICAgJHR5cGUgPX4gcy8oJHJlZ2V4KS8kcmVw
bGFjZW1lbnQvZzsKKyAgICAgICAgJHNpZ25hdHVyZS0+dHlwZSgkdHlwZSk7CisgICAgfQorfQor
CiBzdWIgcGFyc2VEZWZpbml0aW9uCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKQEAgLTcyNiwx
NCArODExLDIwIEBAIHN1YiBwYXJzZVR5cGVkZWYKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0Owog
ICAgIG15ICRleHRlbmRlZEF0dHJpYnV0ZUxpc3QgPSBzaGlmdDsKKyAgICBkaWUgIkV4dGVuZGVk
IGF0dHJpYnV0ZXMgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIHR5cGVkZWZzIHRoZW1zZWx2ZXM6ICIg
LiAkc2VsZi0+e0xpbmV9IGlmICV7JGV4dGVuZGVkQXR0cmlidXRlTGlzdH07CiAKICAgICBteSAk
bmV4dCA9ICRzZWxmLT5uZXh0VG9rZW4oKTsKICAgICBpZiAoJG5leHQtPnZhbHVlKCkgZXEgInR5
cGVkZWYiKSB7CiAgICAgICAgICRzZWxmLT5hc3NlcnRUb2tlblZhbHVlKCRzZWxmLT5nZXRUb2tl
bigpLCAidHlwZWRlZiIsIF9fTElORV9fKTsKLSAgICAgICAgJHNlbGYtPnBhcnNlRXh0ZW5kZWRB
dHRyaWJ1dGVMaXN0KCk7Ci0gICAgICAgICRzZWxmLT5wYXJzZVR5cGUoKTsKLSAgICAgICAgJHNl
bGYtPmFzc2VydFRva2VuVHlwZSgkc2VsZi0+Z2V0VG9rZW4oKSwgSWRlbnRpZmllclRva2VuKTsK
KyAgICAgICAgbXkgJHR5cGVkZWYgPSBUeXBlZGVmLT5uZXcoKTsKKyAgICAgICAgJHR5cGVkZWYt
PmV4dGVuZGVkQXR0cmlidXRlcygkc2VsZi0+cGFyc2VFeHRlbmRlZEF0dHJpYnV0ZUxpc3RBbGxv
d0VtcHR5KCkpOworICAgICAgICAkdHlwZWRlZi0+dHlwZSgkc2VsZi0+cGFyc2VUeXBlKCkpOwor
ICAgICAgICBteSAkbmFtZVRva2VuID0gJHNlbGYtPmdldFRva2VuKCk7CisgICAgICAgICRzZWxm
LT5hc3NlcnRUb2tlblR5cGUoJG5hbWVUb2tlbiwgSWRlbnRpZmllclRva2VuKTsKICAgICAgICAg
JHNlbGYtPmFzc2VydFRva2VuVmFsdWUoJHNlbGYtPmdldFRva2VuKCksICI7IiwgX19MSU5FX18p
OworICAgICAgICBteSAkbmFtZSA9ICRuYW1lVG9rZW4tPnZhbHVlKCk7CisgICAgICAgIGRpZSAi
dHlwZWRlZiByZWRlZmluaXRpb24gZm9yICIgLiAkbmFtZSAuICIgYXQgIiAuICRzZWxmLT57TGlu
ZX0gaWYgZXhpc3RzICR0eXBlZGVmc3skbmFtZX07CisgICAgICAgICR0eXBlZGVmc3skbmFtZX0g
PSAkdHlwZWRlZjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAkc2VsZi0+YXNzZXJ0VW5l
eHBlY3RlZFRva2VuKCRuZXh0LT52YWx1ZSgpLCBfX0xJTkVfXyk7CkBAIC0xODAzLDcgKzE4OTQs
NyBAQCBzdWIgcGFyc2VVbnJlc3RyaWN0ZWRGbG9hdFR5cGUKICAgICBteSAkbmV4dCA9ICRzZWxm
LT5uZXh0VG9rZW4oKTsKICAgICBpZiAoJG5leHQtPnZhbHVlKCkgZXEgInVucmVzdHJpY3RlZCIp
IHsKICAgICAgICAgJHNlbGYtPmFzc2VydFRva2VuVmFsdWUoJHNlbGYtPmdldFRva2VuKCksICJ1
bnJlc3RyaWN0ZWQiLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJldHVybiAidW5yZXN0cmljdGVkIiAu
ICRzZWxmLT5wYXJzZUZsb2F0VHlwZSgpOworICAgICAgICByZXR1cm4gInVucmVzdHJpY3RlZCAi
IC4gJHNlbGYtPnBhcnNlRmxvYXRUeXBlKCk7CiAgICAgfQogICAgIGlmICgkbmV4dC0+dmFsdWUo
KSA9fiAvJG5leHRVbnJlc3RyaWN0ZWRGbG9hdFR5cGVfMS8pIHsKICAgICAgICAgcmV0dXJuICRz
ZWxmLT5wYXJzZUZsb2F0VHlwZSgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGlu
Z3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMuY3BwIGIvU291cmNlL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmQwMTZhMzQ5MzgyMzllZTdlNjc4MzU1ZGIyZjNiMjQ3Y2NmMDNlMzkKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvQ1BQL1dlYkRP
TVRlc3RUeXBlZGVmcy5jcHAKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMg
cGFydCBvZiB0aGUgV2ViS2l0IG9wZW4gc291cmNlIHByb2plY3QuCisgKiBUaGlzIGZpbGUgaGFz
IGJlZW4gZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWJpbmRpbmdzLnBsLiBETyBOT1QgTU9ESUZZIQor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiV2ViRE9NVGVzdFR5cGVkZWZzLmgiCisKKyNp
bmNsdWRlICJBcnJheS5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJTVkdQb2ludC5o
IgorI2luY2x1ZGUgIlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorI2luY2x1ZGUgIldlYkRPTUFy
cmF5LmgiCisjaW5jbHVkZSAiV2ViRE9NU1ZHUG9pbnQuaCIKKyNpbmNsdWRlICJXZWJET01TdHJp
bmcuaCIKKyNpbmNsdWRlICJXZWJFeGNlcHRpb25IYW5kbGVyLmgiCisjaW5jbHVkZSAid3RmL3Rl
eHQvQXRvbWljU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL0dldFB0ci5oPgorI2luY2x1ZGUgPHd0
Zi9SZWZQdHIuaD4KKworc3RydWN0IFdlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVk
ZWZzUHJpdmF0ZSB7CisgICAgV2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0ZShXZWJDb3JlOjpUZXN0
VHlwZWRlZnMqIG9iamVjdCA9IDApCisgICAgICAgIDogaW1wbChvYmplY3QpCisgICAgeworICAg
IH0KKworICAgIFJlZlB0cjxXZWJDb3JlOjpUZXN0VHlwZWRlZnM+IGltcGw7Cit9OworCitXZWJE
T01UZXN0VHlwZWRlZnM6OldlYkRPTVRlc3RUeXBlZGVmcygpCisgICAgOiBXZWJET01PYmplY3Qo
KQorICAgICwgbV9pbXBsKDApCit7Cit9CisKK1dlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVz
dFR5cGVkZWZzKFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaW1wbCkKKyAgICA6IFdlYkRPTU9iamVj
dCgpCisgICAgLCBtX2ltcGwobmV3IFdlYkRPTVRlc3RUeXBlZGVmc1ByaXZhdGUoaW1wbCkpCit7
Cit9CisKK1dlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVkZWZzKGNvbnN0IFdlYkRP
TVRlc3RUeXBlZGVmcyYgY29weSkKKyAgICA6IFdlYkRPTU9iamVjdCgpCit7CisgICAgbV9pbXBs
ID0gY29weS5pbXBsKCkgPyBuZXcgV2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0ZShjb3B5LmltcGwo
KSkgOiAwOworfQorCitXZWJET01UZXN0VHlwZWRlZnMmIFdlYkRPTVRlc3RUeXBlZGVmczo6b3Bl
cmF0b3I9KGNvbnN0IFdlYkRPTVRlc3RUeXBlZGVmcyYgY29weSkKK3sKKyAgICBkZWxldGUgbV9p
bXBsOworICAgIG1faW1wbCA9IGNvcHkuaW1wbCgpID8gbmV3IFdlYkRPTVRlc3RUeXBlZGVmc1By
aXZhdGUoY29weS5pbXBsKCkpIDogMDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK1dlYkNvcmU6
OlRlc3RUeXBlZGVmcyogV2ViRE9NVGVzdFR5cGVkZWZzOjppbXBsKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9pbXBsID8gV1RGOjpnZXRQdHIobV9pbXBsLT5pbXBsKSA6IDA7Cit9CisKK1dlYkRP
TVRlc3RUeXBlZGVmczo6fldlYkRPTVRlc3RUeXBlZGVmcygpCit7CisgICAgZGVsZXRlIG1faW1w
bDsKKyAgICBtX2ltcGwgPSAwOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgV2ViRE9NVGVzdFR5
cGVkZWZzOjp1bnNpZ25lZExvbmdMb25nQXR0cigpIGNvbnN0Cit7CisgICAgaWYgKCFpbXBsKCkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGltcGwoKS0+dW5zaWduZWRMb25nTG9u
Z0F0dHIoKTsKK30KKwordm9pZCBXZWJET01UZXN0VHlwZWRlZnM6OnNldFVuc2lnbmVkTG9uZ0xv
bmdBdHRyKHVuc2lnbmVkIGxvbmcgbG9uZyBuZXdVbnNpZ25lZExvbmdMb25nQXR0cikKK3sKKyAg
ICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW1wbCgpLT5zZXRVbnNpZ25l
ZExvbmdMb25nQXR0cihuZXdVbnNpZ25lZExvbmdMb25nQXR0cik7Cit9CisKK1dlYkRPTVN0cmlu
ZyBXZWJET01UZXN0VHlwZWRlZnM6OmltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpIGNv
bnN0Cit7CisgICAgaWYgKCFpbXBsKCkpCisgICAgICAgIHJldHVybiBXZWJET01TdHJpbmcoKTsK
KworICAgIHJldHVybiBpbXBsKCktPmltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpLT50
b1N0cmluZygpOworfQorCit2b2lkIFdlYkRPTVRlc3RUeXBlZGVmczo6c2V0SW1tdXRhYmxlU2Vy
aWFsaXplZFNjcmlwdFZhbHVlKGNvbnN0IFdlYkRPTVN0cmluZyYgbmV3SW1tdXRhYmxlU2VyaWFs
aXplZFNjcmlwdFZhbHVlKQoreworICAgIGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBpbXBsKCktPnNldEltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShXZWJDb3JlOjpT
ZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShXVEY6OlN0cmluZyhuZXdJbW11dGFibGVTZXJp
YWxpemVkU2NyaXB0VmFsdWUpKSk7Cit9CisKK2ludCBXZWJET01UZXN0VHlwZWRlZnM6OmF0dHJX
aXRoR2V0dGVyRXhjZXB0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoIWltcGwoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBpbnQg
cmVzdWx0ID0gaW1wbCgpLT5hdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYyk7CisgICAgd2ViRE9N
UmFpc2VFcnJvcihzdGF0aWNfY2FzdDxXZWJET01FeGNlcHRpb25Db2RlPihlYykpOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgV2ViRE9NVGVzdFR5cGVkZWZzOjpzZXRBdHRyV2l0aEdl
dHRlckV4Y2VwdGlvbihpbnQgbmV3QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24pCit7CisgICAgaWYg
KCFpbXBsKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGltcGwoKS0+c2V0QXR0cldpdGhHZXR0
ZXJFeGNlcHRpb24obmV3QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24pOworfQorCitpbnQgV2ViRE9N
VGVzdFR5cGVkZWZzOjphdHRyV2l0aFNldHRlckV4Y2VwdGlvbigpIGNvbnN0Cit7CisgICAgaWYg
KCFpbXBsKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGltcGwoKS0+YXR0cldp
dGhTZXR0ZXJFeGNlcHRpb24oKTsKK30KKwordm9pZCBXZWJET01UZXN0VHlwZWRlZnM6OnNldEF0
dHJXaXRoU2V0dGVyRXhjZXB0aW9uKGludCBuZXdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbikKK3sK
KyAgICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6RXhjZXB0
aW9uQ29kZSBlYyA9IDA7CisgICAgaW1wbCgpLT5zZXRBdHRyV2l0aFNldHRlckV4Y2VwdGlvbihu
ZXdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbiwgZWMpOworICAgIHdlYkRPTVJhaXNlRXJyb3Ioc3Rh
dGljX2Nhc3Q8V2ViRE9NRXhjZXB0aW9uQ29kZT4oZWMpKTsKK30KKworV2ViRE9NU3RyaW5nIFdl
YkRPTVRlc3RUeXBlZGVmczo6c3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oKSBjb25zdAor
eworICAgIGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm4gV2ViRE9NU3RyaW5nKCk7CisKKyAg
ICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBXZWJET01TdHJpbmcgcmVzdWx0
ID0gaW1wbCgpLT5zdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYyk7CisgICAgd2ViRE9N
UmFpc2VFcnJvcihzdGF0aWNfY2FzdDxXZWJET01FeGNlcHRpb25Db2RlPihlYykpOworICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxjb25zdCBXVEY6OlN0cmluZyY+KHJlc3VsdCk7Cit9CisKK3ZvaWQg
V2ViRE9NVGVzdFR5cGVkZWZzOjpzZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihjb25z
dCBXZWJET01TdHJpbmcmIG5ld1N0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKQoreworICAg
IGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbXBsKCktPnNldFN0cmluZ0F0
dHJXaXRoR2V0dGVyRXhjZXB0aW9uKG5ld1N0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKTsK
K30KKworV2ViRE9NU3RyaW5nIFdlYkRPTVRlc3RUeXBlZGVmczo6c3RyaW5nQXR0cldpdGhTZXR0
ZXJFeGNlcHRpb24oKSBjb25zdAoreworICAgIGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm4g
V2ViRE9NU3RyaW5nKCk7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgV1RGOjpTdHJp
bmcmPihpbXBsKCktPnN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKCkpOworfQorCit2b2lk
IFdlYkRPTVRlc3RUeXBlZGVmczo6c2V0U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oY29u
c3QgV2ViRE9NU3RyaW5nJiBuZXdTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbikKK3sKKyAg
ICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6RXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgaW1wbCgpLT5zZXRTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlv
bihuZXdTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbiwgZWMpOworICAgIHdlYkRPTVJhaXNl
RXJyb3Ioc3RhdGljX2Nhc3Q8V2ViRE9NRXhjZXB0aW9uQ29kZT4oZWMpKTsKK30KKwordm9pZCBX
ZWJET01UZXN0VHlwZWRlZnM6OmZ1bmMoY29uc3QgV2ViRE9NbG9uZ1tdJiB4KQoreworICAgIGlm
ICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbXBsKCktPmZ1bmModG9XZWJDb3Jl
KHgpKTsKK30KKwordm9pZCBXZWJET01UZXN0VHlwZWRlZnM6Om11bHRpVHJhbnNmZXJMaXN0KGNv
bnN0IFdlYkRPTVN0cmluZyYgZmlyc3QsIGNvbnN0IFdlYkRPTUFycmF5JiB0eCwgY29uc3QgV2Vi
RE9NU3RyaW5nJiBzZWNvbmQsIGNvbnN0IFdlYkRPTUFycmF5JiB0eHgpCit7CisgICAgaWYgKCFp
bXBsKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGltcGwoKS0+bXVsdGlUcmFuc2Zlckxpc3Qo
V2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoV1RGOjpTdHJpbmcoZmlyc3Qp
KSwgdG9XZWJDb3JlKHR4KSwgV2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUo
V1RGOjpTdHJpbmcoc2Vjb25kKSksIHRvV2ViQ29yZSh0eHgpKTsKK30KKwordm9pZCBXZWJET01U
ZXN0VHlwZWRlZnM6OnNldFNoYWRvdyhmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBi
bHVyLCBjb25zdCBXZWJET01TdHJpbmcmIGNvbG9yLCBmbG9hdCBhbHBoYSkKK3sKKyAgICBpZiAo
IWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW1wbCgpLT5zZXRTaGFkb3cod2lkdGgs
IGhlaWdodCwgYmx1ciwgY29sb3IsIGFscGhhKTsKK30KKwordm9pZCBXZWJET01UZXN0VHlwZWRl
ZnM6Om51bGxhYmxlQXJyYXlBcmcoY29uc3QgV2ViRE9NRE9NU3RyaW5nW10mIGFycmF5QXJnKQor
eworICAgIGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbXBsKCktPm51bGxh
YmxlQXJyYXlBcmcodG9XZWJDb3JlKGFycmF5QXJnKSk7Cit9CisKK1dlYkRPTVNWR1BvaW50IFdl
YkRPTVRlc3RUeXBlZGVmczo6aW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpCit7CisgICAgaWYgKCFp
bXBsKCkpCisgICAgICAgIHJldHVybiBXZWJET01TVkdQb2ludCgpOworCisgICAgcmV0dXJuIHRv
V2ViS2l0KFdURjo6Z2V0UHRyKGltcGwoKS0+aW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpKSk7Cit9
CisKK3ZvaWQgV2ViRE9NVGVzdFR5cGVkZWZzOjptZXRob2RXaXRoRXhjZXB0aW9uKCkKK3sKKyAg
ICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6RXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgaW1wbCgpLT5tZXRob2RXaXRoRXhjZXB0aW9uKGVjKTsKKyAgICB3
ZWJET01SYWlzZUVycm9yKHN0YXRpY19jYXN0PFdlYkRPTUV4Y2VwdGlvbkNvZGU+KGVjKSk7Cit9
CisKK1dlYkNvcmU6OlRlc3RUeXBlZGVmcyogdG9XZWJDb3JlKGNvbnN0IFdlYkRPTVRlc3RUeXBl
ZGVmcyYgd3JhcHBlcikKK3sKKyAgICByZXR1cm4gd3JhcHBlci5pbXBsKCk7Cit9CisKK1dlYkRP
TVRlc3RUeXBlZGVmcyB0b1dlYktpdChXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIHZhbHVlKQorewor
ICAgIHJldHVybiBXZWJET01UZXN0VHlwZWRlZnModmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMu
aCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9DUFAvV2ViRE9NVGVzdFR5
cGVkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uN2RjMTkyNThkN2ZjZTYyNTI1MTNiOTA4NzI5YTYyYzIyOWM3
OTFjNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMv
dGVzdC9DUFAvV2ViRE9NVGVzdFR5cGVkZWZzLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMC4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDYgU2FtdWVsIFdlaW5pZyA8c2FtLndlaW5pZ0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMp
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNp
Zm5kZWYgV2ViRE9NVGVzdFR5cGVkZWZzX2gKKyNkZWZpbmUgV2ViRE9NVGVzdFR5cGVkZWZzX2gK
KworI2luY2x1ZGUgPFdlYkRPTU9iamVjdC5oPgorI2luY2x1ZGUgPFdlYkRPTVN0cmluZy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBUZXN0VHlwZWRlZnM7Cit9OworCitjbGFzcyBX
ZWJET01BcnJheTsKK2NsYXNzIFdlYkRPTURPTVN0cmluZ1tdOworY2xhc3MgV2ViRE9NU1ZHUG9p
bnQ7CitjbGFzcyBXZWJET01TdHJpbmc7CitjbGFzcyBXZWJET01sb25nW107CisKK2NsYXNzIFdl
YkRPTVRlc3RUeXBlZGVmcyA6IHB1YmxpYyBXZWJET01PYmplY3QgeworcHVibGljOgorICAgIFdl
YkRPTVRlc3RUeXBlZGVmcygpOworICAgIGV4cGxpY2l0IFdlYkRPTVRlc3RUeXBlZGVmcyhXZWJD
b3JlOjpUZXN0VHlwZWRlZnMqKTsKKyAgICBXZWJET01UZXN0VHlwZWRlZnMoY29uc3QgV2ViRE9N
VGVzdFR5cGVkZWZzJik7CisgICAgV2ViRE9NVGVzdFR5cGVkZWZzJiBvcGVyYXRvcj0oY29uc3Qg
V2ViRE9NVGVzdFR5cGVkZWZzJik7CisgICAgdmlydHVhbCB+V2ViRE9NVGVzdFR5cGVkZWZzKCk7
CisKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdW5zaWduZWRMb25nTG9uZ0F0dHIoKSBjb25zdDsK
KyAgICB2b2lkIHNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyKHVuc2lnbmVkIGxvbmcgbG9uZyk7Cisg
ICAgV2ViRE9NU3RyaW5nIGltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpIGNvbnN0Owor
ICAgIHZvaWQgc2V0SW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKGNvbnN0IFdlYkRPTVN0
cmluZyYpOworICAgIGludCBhdHRyV2l0aEdldHRlckV4Y2VwdGlvbigpIGNvbnN0OworICAgIHZv
aWQgc2V0QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oaW50KTsKKyAgICBpbnQgYXR0cldpdGhTZXR0
ZXJFeGNlcHRpb24oKSBjb25zdDsKKyAgICB2b2lkIHNldEF0dHJXaXRoU2V0dGVyRXhjZXB0aW9u
KGludCk7CisgICAgV2ViRE9NU3RyaW5nIHN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKCkg
Y29uc3Q7CisgICAgdm9pZCBzZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihjb25zdCBX
ZWJET01TdHJpbmcmKTsKKyAgICBXZWJET01TdHJpbmcgc3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNl
cHRpb24oKSBjb25zdDsKKyAgICB2b2lkIHNldFN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9u
KGNvbnN0IFdlYkRPTVN0cmluZyYpOworCisgICAgdm9pZCBmdW5jKGNvbnN0IFdlYkRPTWxvbmdb
XSYgeCk7CisgICAgdm9pZCBtdWx0aVRyYW5zZmVyTGlzdChjb25zdCBXZWJET01TdHJpbmcmIGZp
cnN0LCBjb25zdCBXZWJET01BcnJheSYgdHgsIGNvbnN0IFdlYkRPTVN0cmluZyYgc2Vjb25kLCBj
b25zdCBXZWJET01BcnJheSYgdHh4KTsKKyAgICB2b2lkIHNldFNoYWRvdyhmbG9hdCB3aWR0aCwg
ZmxvYXQgaGVpZ2h0LCBmbG9hdCBibHVyLCBjb25zdCBXZWJET01TdHJpbmcmIGNvbG9yLCBmbG9h
dCBhbHBoYSk7CisgICAgdm9pZCBudWxsYWJsZUFycmF5QXJnKGNvbnN0IFdlYkRPTURPTVN0cmlu
Z1tdJiBhcnJheUFyZyk7CisgICAgV2ViRE9NU1ZHUG9pbnQgaW1tdXRhYmxlUG9pbnRGdW5jdGlv
bigpOworICAgIHZvaWQgbWV0aG9kV2l0aEV4Y2VwdGlvbigpOworCisgICAgV2ViQ29yZTo6VGVz
dFR5cGVkZWZzKiBpbXBsKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgV2ViRE9N
VGVzdFR5cGVkZWZzUHJpdmF0ZTsKKyAgICBXZWJET01UZXN0VHlwZWRlZnNQcml2YXRlKiBtX2lt
cGw7Cit9OworCitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIHRvV2ViQ29yZShjb25zdCBXZWJET01U
ZXN0VHlwZWRlZnMmKTsKK1dlYkRPTVRlc3RUeXBlZGVmcyB0b1dlYktpdChXZWJDb3JlOjpUZXN0
VHlwZWRlZnMqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5n
cy9zY3JpcHRzL3Rlc3QvR09iamVjdC9XZWJLaXRET01UZXN0VHlwZWRlZnMuY3BwIGIvU291cmNl
L1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi43MDEyNDBhZDgzNDYzMDlkYzBlMTFhZDkwYmNkNjFkYWU5Mjkx
YTJhCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90
ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZzLmNwcApAQCAtMCwwICsxLDQ3NyBAQAor
LyoKKyAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IG9wZW4gc291cmNlIHByb2pl
Y3QuCisgICAgVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBnZW5lcmF0ZS1iaW5kaW5n
cy5wbC4gRE8gTk9UIE1PRElGWSEKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
V2ViS2l0RE9NVGVzdFR5cGVkZWZzLmgiCisKKyNpbmNsdWRlICJET01PYmplY3RDYWNoZS5oIgor
I2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNpbmNsdWRlICJKU01haW5UaHJlYWRFeGVjU3Rh
dGUuaCIKKyNpbmNsdWRlICJXZWJLaXRET01BcnJheVByaXZhdGUuaCIKKyNpbmNsdWRlICJXZWJL
aXRET01CaW5kaW5nLmgiCisjaW5jbHVkZSAiV2ViS2l0RE9NRE9NU3RyaW5nW11Qcml2YXRlLmgi
CisjaW5jbHVkZSAiV2ViS2l0RE9NU1ZHUG9pbnRQcml2YXRlLmgiCisjaW5jbHVkZSAiV2ViS2l0
RE9NU2VyaWFsaXplZFNjcmlwdFZhbHVlUHJpdmF0ZS5oIgorI2luY2x1ZGUgIldlYktpdERPTVRl
c3RUeXBlZGVmc1ByaXZhdGUuaCIKKyNpbmNsdWRlICJXZWJLaXRET01sb25nW11Qcml2YXRlLmgi
CisjaW5jbHVkZSAiZ29iamVjdC9Db252ZXJ0VG9VVEY4U3RyaW5nLmgiCisjaW5jbHVkZSA8d3Rm
L0dldFB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworI2RlZmluZSBXRUJLSVRfRE9N
X1RFU1RfVFlQRURFRlNfR0VUX1BSSVZBVEUob2JqKSBHX1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZB
VEUob2JqLCBXRUJLSVRfVFlQRV9ET01fVEVTVF9UWVBFREVGUywgV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzUHJpdmF0ZSkKKwordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZh
dGUgeworICAgIFJlZlB0cjxXZWJDb3JlOjpUZXN0VHlwZWRlZnM+IGNvcmVPYmplY3Q7Cit9IFdl
YktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitXZWJL
aXRET01UZXN0VHlwZWRlZnMqIGtpdChXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIG9iaikKK3sKKyAg
ICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoZ3BvaW50ZXIgcmV0ID0g
RE9NT2JqZWN0Q2FjaGU6OmdldChvYmopKQorICAgICAgICByZXR1cm4gV0VCS0lUX0RPTV9URVNU
X1RZUEVERUZTKHJldCk7CisKKyAgICByZXR1cm4gd3JhcFRlc3RUeXBlZGVmcyhvYmopOworfQor
CitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGNvcmUoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiByZXF1
ZXN0KQoreworICAgIHJldHVybiByZXF1ZXN0ID8gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6VGVzdFR5
cGVkZWZzKj4oV0VCS0lUX0RPTV9PQkpFQ1QocmVxdWVzdCktPmNvcmVPYmplY3QpIDogMDsKK30K
KworV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiB3cmFwVGVzdFR5cGVkZWZzKFdlYkNvcmU6OlRlc3RU
eXBlZGVmcyogY29yZU9iamVjdCkKK3sKKyAgICBBU1NFUlQoY29yZU9iamVjdCk7CisgICAgcmV0
dXJuIFdFQktJVF9ET01fVEVTVF9UWVBFREVGUyhnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfRE9N
X1RFU1RfVFlQRURFRlMsICJjb3JlLW9iamVjdCIsIGNvcmVPYmplY3QsIE5VTEwpKTsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKK0dfREVGSU5FX1RZUEUoV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzLCB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnMsIFdFQktJVF9UWVBFX0RPTV9PQkpFQ1QpCisK
K2VudW0geworICAgIFBST1BfMCwKKyAgICBQUk9QX1VOU0lHTkVEX0xPTkdfTE9OR19BVFRSLAor
ICAgIFBST1BfSU1NVVRBQkxFX1NFUklBTElaRURfU0NSSVBUX1ZBTFVFLAorICAgIFBST1BfQVRU
Ul9XSVRIX0dFVFRFUl9FWENFUFRJT04sCisgICAgUFJPUF9BVFRSX1dJVEhfU0VUVEVSX0VYQ0VQ
VElPTiwKKyAgICBQUk9QX1NUUklOR19BVFRSX1dJVEhfR0VUVEVSX0VYQ0VQVElPTiwKKyAgICBQ
Uk9QX1NUUklOR19BVFRSX1dJVEhfU0VUVEVSX0VYQ0VQVElPTiwKK307CisKK3N0YXRpYyB2b2lk
IHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19maW5hbGl6ZShHT2JqZWN0KiBvYmplY3QpCit7Cisg
ICAgV2ViS2l0RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSogcHJpdiA9IFdFQktJVF9ET01fVEVTVF9U
WVBFREVGU19HRVRfUFJJVkFURShvYmplY3QpOworCisgICAgV2ViS2l0OjpET01PYmplY3RDYWNo
ZTo6Zm9yZ2V0KHByaXYtPmNvcmVPYmplY3QuZ2V0KCkpOworCisgICAgcHJpdi0+fldlYktpdERP
TVRlc3RUeXBlZGVmc1ByaXZhdGUoKTsKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUob2JqZWN0KTsKK30KKworc3RhdGlj
IHZvaWQgd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9wcm9wZXJ0eShHT2JqZWN0KiBvYmpl
Y3QsIGd1aW50IHByb3BlcnR5SWQsIGNvbnN0IEdWYWx1ZSogdmFsdWUsIEdQYXJhbVNwZWMqIHBz
cGVjKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKworICAg
IFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiA9IFdFQktJVF9ET01fVEVTVF9UWVBFREVGUyhv
YmplY3QpOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogY29yZVNlbGYgPSBXZWJLaXQ6OmNv
cmUoc2VsZik7CisKKyAgICBzd2l0Y2ggKHByb3BlcnR5SWQpIHsKKyAgICBjYXNlIFBST1BfVU5T
SUdORURfTE9OR19MT05HX0FUVFI6IHsKKyAgICAgICAgY29yZVNlbGYtPnNldFVuc2lnbmVkTG9u
Z0xvbmdBdHRyKChnX3ZhbHVlX2dldF91aW50NjQodmFsdWUpKSk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKyAgICBjYXNlIFBST1BfQVRUUl9XSVRIX0dFVFRFUl9FWENFUFRJT046IHsKKyAgICAg
ICAgY29yZVNlbGYtPnNldEF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKChnX3ZhbHVlX2dldF9sb25n
KHZhbHVlKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0FUVFJfV0lU
SF9TRVRURVJfRVhDRVBUSU9OOiB7CisgICAgICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMg
PSAwOworICAgICAgICBjb3JlU2VsZi0+c2V0QXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oKGdfdmFs
dWVfZ2V0X2xvbmcodmFsdWUpKSwgZWMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2Fz
ZSBQUk9QX1NUUklOR19BVFRSX1dJVEhfR0VUVEVSX0VYQ0VQVElPTjogeworICAgICAgICBjb3Jl
U2VsZi0+c2V0U3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oV1RGOjpTdHJpbmc6OmZyb21V
VEY4KGdfdmFsdWVfZ2V0X3N0cmluZyh2YWx1ZSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIGNhc2UgUFJPUF9TVFJJTkdfQVRUUl9XSVRIX1NFVFRFUl9FWENFUFRJT046IHsKKyAgICAg
ICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgICAgIGNvcmVTZWxmLT5zZXRT
dHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbihXVEY6OlN0cmluZzo6ZnJvbVVURjgoZ192YWx1
ZV9nZXRfc3RyaW5nKHZhbHVlKSksIGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRl
ZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRChvYmplY3Qs
IHByb3BlcnR5SWQsIHBzcGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X3Byb3BlcnR5KEdPYmplY3QqIG9iamVj
dCwgZ3VpbnQgcHJvcGVydHlJZCwgR1ZhbHVlKiB2YWx1ZSwgR1BhcmFtU3BlYyogcHNwZWMpCit7
CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworCisgICAgV2ViS2l0
RE9NVGVzdFR5cGVkZWZzKiBzZWxmID0gV0VCS0lUX0RPTV9URVNUX1RZUEVERUZTKG9iamVjdCk7
CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBjb3JlU2VsZiA9IFdlYktpdDo6Y29yZShzZWxm
KTsKKworICAgIHN3aXRjaCAocHJvcGVydHlJZCkgeworICAgIGNhc2UgUFJPUF9VTlNJR05FRF9M
T05HX0xPTkdfQVRUUjogeworICAgICAgICBnX3ZhbHVlX3NldF91aW50NjQodmFsdWUsIGNvcmVT
ZWxmLT51bnNpZ25lZExvbmdMb25nQXR0cigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IGNhc2UgUFJPUF9JTU1VVEFCTEVfU0VSSUFMSVpFRF9TQ1JJUFRfVkFMVUU6IHsKKyAgICAgICAg
UmVmUHRyPFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcHRyID0gY29yZVNlbGYtPmlt
bXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpOworICAgICAgICBnX3ZhbHVlX3NldF9vYmpl
Y3QodmFsdWUsIFdlYktpdDo6a2l0KHB0ci5nZXQoKSkpOworICAgICAgICBicmVhazsKKyAgICB9
CisgICAgY2FzZSBQUk9QX0FUVFJfV0lUSF9HRVRURVJfRVhDRVBUSU9OOiB7CisgICAgICAgIFdl
YkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgICAgICBnX3ZhbHVlX3NldF9sb25nKHZh
bHVlLCBjb3JlU2VsZi0+YXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oZWMpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9BVFRSX1dJVEhfU0VUVEVSX0VYQ0VQVElPTjogewor
ICAgICAgICBnX3ZhbHVlX3NldF9sb25nKHZhbHVlLCBjb3JlU2VsZi0+YXR0cldpdGhTZXR0ZXJF
eGNlcHRpb24oKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfU1RSSU5H
X0FUVFJfV0lUSF9HRVRURVJfRVhDRVBUSU9OOiB7CisgICAgICAgIFdlYkNvcmU6OkV4Y2VwdGlv
bkNvZGUgZWMgPSAwOworICAgICAgICBnX3ZhbHVlX3Rha2Vfc3RyaW5nKHZhbHVlLCBjb252ZXJ0
VG9VVEY4U3RyaW5nKGNvcmVTZWxmLT5zdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYykp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TVFJJTkdfQVRUUl9XSVRI
X1NFVFRFUl9FWENFUFRJT046IHsKKyAgICAgICAgZ192YWx1ZV90YWtlX3N0cmluZyh2YWx1ZSwg
Y29udmVydFRvVVRGOFN0cmluZyhjb3JlU2VsZi0+c3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRp
b24oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgR19P
QkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEKG9iamVjdCwgcHJvcGVydHlJZCwgcHNwZWMp
OworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBHT2JqZWN0KiB3ZWJraXRfZG9t
X3Rlc3RfdHlwZWRlZnNfY29uc3RydWN0b3IoR1R5cGUgdHlwZSwgZ3VpbnQgY29uc3RydWN0UHJv
cGVydGllc0NvdW50LCBHT2JqZWN0Q29uc3RydWN0UGFyYW0qIGNvbnN0cnVjdFByb3BlcnRpZXMp
Cit7CisgICAgR09iamVjdCogb2JqZWN0ID0gR19PQkpFQ1RfQ0xBU1Mod2Via2l0X2RvbV90ZXN0
X3R5cGVkZWZzX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdG9yKHR5cGUsIGNvbnN0cnVjdFByb3Bl
cnRpZXNDb3VudCwgY29uc3RydWN0UHJvcGVydGllcyk7CisKKyAgICBXZWJLaXRET01UZXN0VHlw
ZWRlZnNQcml2YXRlKiBwcml2ID0gV0VCS0lUX0RPTV9URVNUX1RZUEVERUZTX0dFVF9QUklWQVRF
KG9iamVjdCk7CisgICAgcHJpdi0+Y29yZU9iamVjdCA9IHN0YXRpY19jYXN0PFdlYkNvcmU6OlRl
c3RUeXBlZGVmcyo+KFdFQktJVF9ET01fT0JKRUNUKG9iamVjdCktPmNvcmVPYmplY3QpOworICAg
IFdlYktpdDo6RE9NT2JqZWN0Q2FjaGU6OnB1dChwcml2LT5jb3JlT2JqZWN0LmdldCgpLCBvYmpl
Y3QpOworCisgICAgcmV0dXJuIG9iamVjdDsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X2RvbV90
ZXN0X3R5cGVkZWZzX2NsYXNzX2luaXQoV2ViS2l0RE9NVGVzdFR5cGVkZWZzQ2xhc3MqIHJlcXVl
c3RDbGFzcykKK3sKKyAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RDbGFzcyA9IEdfT0JKRUNUX0NM
QVNTKHJlcXVlc3RDbGFzcyk7CisgICAgZ190eXBlX2NsYXNzX2FkZF9wcml2YXRlKGdvYmplY3RD
bGFzcywgc2l6ZW9mKFdlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUpKTsKKyAgICBnb2JqZWN0
Q2xhc3MtPmNvbnN0cnVjdG9yID0gd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2NvbnN0cnVjdG9y
OworICAgIGdvYmplY3RDbGFzcy0+ZmluYWxpemUgPSB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNf
ZmluYWxpemU7CisgICAgZ29iamVjdENsYXNzLT5zZXRfcHJvcGVydHkgPSB3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfc2V0X3Byb3BlcnR5OworICAgIGdvYmplY3RDbGFzcy0+Z2V0X3Byb3BlcnR5
ID0gd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF9wcm9wZXJ0eTsKKworICAgIGdfb2JqZWN0
X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29iamVjdENsYXNzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgUFJPUF9VTlNJR05FRF9MT05HX0xPTkdfQVRUUiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfcGFyYW1fc3BlY191aW50NjQoInVuc2lnbmVk
LWxvbmctbG9uZy1hdHRyIiwgLyogbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF90eXBlZGVmc191bnNpZ25lZC1s
b25nLWxvbmctYXR0ciIsIC8qIHNob3J0IGRlc2NyaXB0aW9uICovCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkLXdyaXRlICBn
dWludDY0IFRlc3RUeXBlZGVmcy51bnNpZ25lZC1sb25nLWxvbmctYXR0ciIsIC8qIGxvbmdlciAt
IGNvdWxkIGRvIHdpdGggc29tZSBleHRyYSBkb2Mgc3R1ZmYgaGVyZSAqLworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4g
Ki8KK0dfTUFYVUlOVDY0LCAvKiBtaW4gKi8KKzAsIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BB
UkFNX1JFQURXUklURSkpOworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29i
amVjdENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9JTU1V
VEFCTEVfU0VSSUFMSVpFRF9TQ1JJUFRfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0KCJpbW11dGFibGUtc2VyaWFsaXplZC1zY3Jp
cHQtdmFsdWUiLCAvKiBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3R5cGVkZWZzX2ltbXV0YWJsZS1zZXJpYWxp
emVkLXNjcmlwdC12YWx1ZSIsIC8qIHNob3J0IGRlc2NyaXB0aW9uICovCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkLXdyaXRl
ICBXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqIFRlc3RUeXBlZGVmcy5pbW11dGFibGUt
c2VyaWFsaXplZC1zY3JpcHQtdmFsdWUiLCAvKiBsb25nZXIgLSBjb3VsZCBkbyB3aXRoIHNvbWUg
ZXh0cmEgZG9jIHN0dWZmIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1RZUEVfRE9NX1NFUklBTElaRURfU0NS
SVBUX1ZBTFVFLCAvKiBnb2JqZWN0IHR5cGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURXUklURSkp
OworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29iamVjdENsYXNzLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9BVFRSX1dJVEhfR0VUVEVSX0VY
Q0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfcGFyYW1fc3Bl
Y19sb25nKCJhdHRyLXdpdGgtZ2V0dGVyLWV4Y2VwdGlvbiIsIC8qIG5hbWUgKi8KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Rf
dHlwZWRlZnNfYXR0ci13aXRoLWdldHRlci1leGNlcHRpb24iLCAvKiBzaG9ydCBkZXNjcmlwdGlv
biAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAicmVhZC13cml0ZSAgZ2xvbmcgVGVzdFR5cGVkZWZzLmF0dHItd2l0aC1nZXR0ZXIt
ZXhjZXB0aW9uIiwgLyogbG9uZ2VyIC0gY291bGQgZG8gd2l0aCBzb21lIGV4dHJhIGRvYyBzdHVm
ZiBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEdfTUlOTE9ORywgLyogbWluICovCitHX01BWExPTkcsIC8qIG1heCAqLwor
MCwgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBXRUJLSVRfUEFSQU1fUkVBRFdSSVRFKSk7CisgICAgZ19vYmpl
Y3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eShnb2JqZWN0Q2xhc3MsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBQUk9QX0FUVFJfV0lUSF9TRVRURVJfRVhDRVBUSU9OLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19wYXJhbV9zcGVjX2xvbmcoImF0dHIt
d2l0aC1zZXR0ZXItZXhjZXB0aW9uIiwgLyogbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF90eXBlZGVmc19hdHRy
LXdpdGgtc2V0dGVyLWV4Y2VwdGlvbiIsIC8qIHNob3J0IGRlc2NyaXB0aW9uICovCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFk
LXdyaXRlICBnbG9uZyBUZXN0VHlwZWRlZnMuYXR0ci13aXRoLXNldHRlci1leGNlcHRpb24iLCAv
KiBsb25nZXIgLSBjb3VsZCBkbyB3aXRoIHNvbWUgZXh0cmEgZG9jIHN0dWZmIGhlcmUgKi8KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
R19NSU5MT05HLCAvKiBtaW4gKi8KK0dfTUFYTE9ORywgLyogbWF4ICovCiswLCAvKiBkZWZhdWx0
ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFdFQktJVF9QQVJBTV9SRUFEV1JJVEUpKTsKKyAgICBnX29iamVjdF9jbGFzc19pbnN0
YWxsX3Byb3BlcnR5KGdvYmplY3RDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFBST1BfU1RSSU5HX0FUVFJfV0lUSF9HRVRURVJfRVhDRVBUSU9OLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZygic3RyaW5nLWF0
dHItd2l0aC1nZXR0ZXItZXhjZXB0aW9uIiwgLyogbmFtZSAqLworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF90eXBlZGVmc19z
dHJpbmctYXR0ci13aXRoLWdldHRlci1leGNlcHRpb24iLCAvKiBzaG9ydCBkZXNjcmlwdGlvbiAq
LworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAicmVhZC13cml0ZSAgZ2NoYXIqIFRlc3RUeXBlZGVmcy5zdHJpbmctYXR0ci13aXRoLWdl
dHRlci1leGNlcHRpb24iLCAvKiBsb25nZXIgLSBjb3VsZCBkbyB3aXRoIHNvbWUgZXh0cmEgZG9j
IHN0dWZmIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIiIsIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURX
UklURSkpOworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29iamVjdENsYXNz
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9TVFJJTkdfQVRUUl9X
SVRIX1NFVFRFUl9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBnX3BhcmFtX3NwZWNfc3RyaW5nKCJzdHJpbmctYXR0ci13aXRoLXNldHRlci1leGNlcHRpb24i
LCAvKiBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJ0ZXN0X3R5cGVkZWZzX3N0cmluZy1hdHRyLXdpdGgtc2V0dGVyLWV4
Y2VwdGlvbiIsIC8qIHNob3J0IGRlc2NyaXB0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkLXdyaXRlICBnY2hhciog
VGVzdFR5cGVkZWZzLnN0cmluZy1hdHRyLXdpdGgtc2V0dGVyLWV4Y2VwdGlvbiIsIC8qIGxvbmdl
ciAtIGNvdWxkIGRvIHdpdGggc29tZSBleHRyYSBkb2Mgc3R1ZmYgaGVyZSAqLworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgLyog
ZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBXRUJLSVRfUEFSQU1fUkVBRFdSSVRFKSk7Cit9CisKK3N0YXRpYyB2b2lk
IHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19pbml0KFdlYktpdERPTVRlc3RUeXBlZGVmcyogcmVx
dWVzdCkKK3sKKyAgICBXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlKiBwcml2ID0gV0VCS0lU
X0RPTV9URVNUX1RZUEVERUZTX0dFVF9QUklWQVRFKHJlcXVlc3QpOworICAgIG5ldyAocHJpdikg
V2ViS2l0RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSgpOworfQorCit2b2lkCit3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfZnVuYyhXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIFdlYktpdERPTWxv
bmdbXSogeCkKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7Cisg
ICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMoc2VsZikpOwor
ICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19MT05HW10oeCkpOworICAgIFdlYkNv
cmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBXZWJDb3Jl
Ojpsb25nW10qIGNvbnZlcnRlZFggPSBXZWJLaXQ6OmNvcmUoeCk7CisgICAgaXRlbS0+ZnVuYyhj
b252ZXJ0ZWRYKTsKK30KKwordm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX211bHRpX3Ry
YW5zZmVyX2xpc3QoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJLaXRET01TZXJpYWxp
emVkU2NyaXB0VmFsdWUqIGZpcnN0LCBXZWJLaXRET01BcnJheSogdHgsIFdlYktpdERPTVNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZSogc2Vjb25kLCBXZWJLaXRET01BcnJheSogdHh4KQoreworICAgIFdl
YkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl9pZl9mYWls
KFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSk7CisgICAgZ19yZXR1cm5faWZfZmFp
bChXRUJLSVRfRE9NX0lTX1NFUklBTElaRURfU0NSSVBUX1ZBTFVFKGZpcnN0KSk7CisgICAgZ19y
ZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lTX0FSUkFZKHR4KSk7CisgICAgZ19yZXR1cm5faWZf
ZmFpbChXRUJLSVRfRE9NX0lTX1NFUklBTElaRURfU0NSSVBUX1ZBTFVFKHNlY29uZCkpOworICAg
IGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19BUlJBWSh0eHgpKTsKKyAgICBXZWJDb3Jl
OjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgV2ViQ29yZTo6
U2VyaWFsaXplZFNjcmlwdFZhbHVlKiBjb252ZXJ0ZWRGaXJzdCA9IFdlYktpdDo6Y29yZShmaXJz
dCk7CisgICAgV2ViQ29yZTo6QXJyYXkqIGNvbnZlcnRlZFR4ID0gV2ViS2l0Ojpjb3JlKHR4KTsK
KyAgICBXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUqIGNvbnZlcnRlZFNlY29uZCA9IFdl
YktpdDo6Y29yZShzZWNvbmQpOworICAgIFdlYkNvcmU6OkFycmF5KiBjb252ZXJ0ZWRUeHggPSBX
ZWJLaXQ6OmNvcmUodHh4KTsKKyAgICBpdGVtLT5tdWx0aVRyYW5zZmVyTGlzdChjb252ZXJ0ZWRG
aXJzdCwgY29udmVydGVkVHgsIGNvbnZlcnRlZFNlY29uZCwgY29udmVydGVkVHh4KTsKK30KKwor
dm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9zaGFkb3coV2ViS2l0RE9NVGVzdFR5
cGVkZWZzKiBzZWxmLCBnZmxvYXQgd2lkdGgsIGdmbG9hdCBoZWlnaHQsIGdmbG9hdCBibHVyLCBj
b25zdCBnY2hhciogY29sb3IsIGdmbG9hdCBhbHBoYSkKK3sKKyAgICBXZWJDb3JlOjpKU01haW5U
aHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lT
X1RFU1RfVFlQRURFRlMoc2VsZikpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoY29sb3IpOworICAg
IFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBX
VEY6OlN0cmluZyBjb252ZXJ0ZWRDb2xvciA9IFdURjo6U3RyaW5nOjpmcm9tVVRGOChjb2xvcik7
CisgICAgaXRlbS0+c2V0U2hhZG93KHdpZHRoLCBoZWlnaHQsIGJsdXIsIGNvbnZlcnRlZENvbG9y
LCBhbHBoYSk7Cit9CisKK3ZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19udWxsYWJsZV9h
cnJheV9hcmcoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJLaXRET01ET01TdHJpbmdb
XSogYXJyYXlBcmcpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRl
OworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYp
KTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfRE9NX1NUUklOR1tdKGFycmF5
QXJnKSk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNl
bGYpOworICAgIFdlYkNvcmU6OkRPTVN0cmluZ1tdKiBjb252ZXJ0ZWRBcnJheUFyZyA9IFdlYktp
dDo6Y29yZShhcnJheUFyZyk7CisgICAgaXRlbS0+bnVsbGFibGVBcnJheUFyZyhjb252ZXJ0ZWRB
cnJheUFyZyk7Cit9CisKK1dlYktpdERPTVNWR1BvaW50Kgord2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX2ltbXV0YWJsZV9wb2ludF9mdW5jdGlvbihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYp
Cit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIGdfcmV0
dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSwgMCk7Cisg
ICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAg
IFJlZlB0cjxXZWJDb3JlOjpTVkdQb2ludD4gZ29iamVjdFJlc3VsdCA9IFdURjo6Z2V0UHRyKGl0
ZW0tPmltbXV0YWJsZVBvaW50RnVuY3Rpb24oKSk7CisgICAgcmV0dXJuIFdlYktpdDo6a2l0KGdv
YmplY3RSZXN1bHQuZ2V0KCkpOworfQorCitXZWJLaXRET01ET01TdHJpbmdbXSoKK3dlYmtpdF9k
b21fdGVzdF90eXBlZGVmc19zdHJpbmdfYXJyYXlfZnVuY3Rpb24oV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzKiBzZWxmLCBXZWJLaXRET01ET01TdHJpbmdbXSogdmFsdWVzLCBHRXJyb3IqKiBlcnJvcikK
K3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1
cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpLCAwKTsKKyAg
ICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfRE9NX0lTX0RPTV9TVFJJTkdbXSh2YWx1ZXMp
LCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCghZXJyb3IgfHwgISplcnJvciwgMCk7Cisg
ICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAg
IFdlYkNvcmU6OkRPTVN0cmluZ1tdKiBjb252ZXJ0ZWRWYWx1ZXMgPSBXZWJLaXQ6OmNvcmUodmFs
dWVzKTsKKyAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBSZWZQdHI8V2Vi
Q29yZTo6RE9NU3RyaW5nW10+IGdvYmplY3RSZXN1bHQgPSBXVEY6OmdldFB0cihpdGVtLT5zdHJp
bmdBcnJheUZ1bmN0aW9uKGNvbnZlcnRlZFZhbHVlcywgZWMpKTsKKyAgICBpZiAoZWMpIHsKKyAg
ICAgICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZURlc2NyaXB0aW9uIGVjZGVzYyhlYyk7CisgICAg
ICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwoZXJyb3IsIGdfcXVhcmtfZnJvbV9zdHJpbmcoIldFQktJ
VF9ET00iKSwgZWNkZXNjLmNvZGUsIGVjZGVzYy5uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIFdl
YktpdDo6a2l0KGdvYmplY3RSZXN1bHQuZ2V0KCkpOworfQorCit2b2lkCit3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfbWV0aG9kX3dpdGhfZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBlZGVmcyog
c2VsZiwgR0Vycm9yKiogZXJyb3IpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0
YXRlIHN0YXRlOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVE
RUZTKHNlbGYpKTsKKyAgICBnX3JldHVybl9pZl9mYWlsKCFlcnJvciB8fCAhKmVycm9yKTsKKyAg
ICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAg
V2ViQ29yZTo6RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgaXRlbS0+bWV0aG9kV2l0aEV4Y2Vw
dGlvbihlYyk7CisgICAgaWYgKGVjKSB7CisgICAgICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGVE
ZXNjcmlwdGlvbiBlY2Rlc2MoZWMpOworICAgICAgICBnX3NldF9lcnJvcl9saXRlcmFsKGVycm9y
LCBnX3F1YXJrX2Zyb21fc3RyaW5nKCJXRUJLSVRfRE9NIiksIGVjZGVzYy5jb2RlLCBlY2Rlc2Mu
bmFtZSk7CisgICAgfQorfQorCitndWludDY0Cit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0
X3Vuc2lnbmVkX2xvbmdfbG9uZ19hdHRyKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZikKK3sK
KyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5f
dmFsX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpLCAwKTsKKyAgICBX
ZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgZ3Vp
bnQ2NCByZXN1bHQgPSBpdGVtLT51bnNpZ25lZExvbmdMb25nQXR0cigpOworICAgIHJldHVybiBy
ZXN1bHQ7Cit9CisKK3ZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfdW5zaWduZWRf
bG9uZ19sb25nX2F0dHIoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBndWludDY0IHZhbHVl
KQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3Jl
dHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSk7CisgICAgV2Vi
Q29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAgIGl0ZW0t
PnNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyKHZhbHVlKTsKK30KKworV2ViS2l0RE9NU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlKgord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF9pbW11dGFibGVfc2Vy
aWFsaXplZF9zY3JpcHRfdmFsdWUoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmKQoreworICAg
IFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl92YWxf
aWZfZmFpbChXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMoc2VsZiksIDApOworICAgIFdlYkNv
cmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBSZWZQdHI8
V2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBnb2JqZWN0UmVzdWx0ID0gV1RGOjpnZXRQ
dHIoaXRlbS0+aW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKCkpOworICAgIHJldHVybiBX
ZWJLaXQ6OmtpdChnb2JqZWN0UmVzdWx0LmdldCgpKTsKK30KKwordm9pZAord2Via2l0X2RvbV90
ZXN0X3R5cGVkZWZzX3NldF9pbW11dGFibGVfc2VyaWFsaXplZF9zY3JpcHRfdmFsdWUoV2ViS2l0
RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqIHZh
bHVlKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBn
X3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSk7CisgICAg
Z19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lTX1NFUklBTElaRURfU0NSSVBUX1ZBTFVFKHZh
bHVlKSk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNl
bGYpOworICAgIFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogY29udmVydGVkVmFsdWUg
PSBXZWJLaXQ6OmNvcmUodmFsdWUpOworICAgIGl0ZW0tPnNldEltbXV0YWJsZVNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZShjb252ZXJ0ZWRWYWx1ZSk7Cit9CisKK2dsb25nCit3ZWJraXRfZG9tX3Rlc3Rf
dHlwZWRlZnNfZ2V0X2F0dHJfd2l0aF9nZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBl
ZGVmcyogc2VsZiwgR0Vycm9yKiogZXJyb3IpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFk
TnVsbFN0YXRlIHN0YXRlOworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9ET01fSVNf
VEVTVF9UWVBFREVGUyhzZWxmKSwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoIWVycm9y
IHx8ICEqZXJyb3IsIDApOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktp
dDo6Y29yZShzZWxmKTsKKyAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBn
bG9uZyByZXN1bHQgPSBpdGVtLT5hdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYyk7CisgICAgaWYg
KGVjKSB7CisgICAgICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGVEZXNjcmlwdGlvbiBlY2Rlc2Mo
ZWMpOworICAgICAgICBnX3NldF9lcnJvcl9saXRlcmFsKGVycm9yLCBnX3F1YXJrX2Zyb21fc3Ry
aW5nKCJXRUJLSVRfRE9NIiksIGVjZGVzYy5jb2RlLCBlY2Rlc2MubmFtZSk7CisgICAgfQorICAg
IHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRf
YXR0cl93aXRoX2dldHRlcl9leGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBn
bG9uZyB2YWx1ZSkKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7
CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMoc2VsZikp
OworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsK
KyAgICBpdGVtLT5zZXRBdHRyV2l0aEdldHRlckV4Y2VwdGlvbih2YWx1ZSk7Cit9CisKK2dsb25n
Cit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X2F0dHJfd2l0aF9zZXR0ZXJfZXhjZXB0aW9u
KFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZikKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJl
YWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0RPTV9J
U19URVNUX1RZUEVERUZTKHNlbGYpLCAwKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0
ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgZ2xvbmcgcmVzdWx0ID0gaXRlbS0+YXR0cldp
dGhTZXR0ZXJFeGNlcHRpb24oKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCit3ZWJr
aXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X2F0dHJfd2l0aF9zZXR0ZXJfZXhjZXB0aW9uKFdlYktp
dERPTVRlc3RUeXBlZGVmcyogc2VsZiwgZ2xvbmcgdmFsdWUsIEdFcnJvcioqIGVycm9yKQorewor
ICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl9p
Zl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSk7CisgICAgZ19yZXR1cm5f
aWZfZmFpbCghZXJyb3IgfHwgISplcnJvcik7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBp
dGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMg
PSAwOworICAgIGl0ZW0tPnNldEF0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKHZhbHVlLCBlYyk7Cisg
ICAgaWYgKGVjKSB7CisgICAgICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGVEZXNjcmlwdGlvbiBl
Y2Rlc2MoZWMpOworICAgICAgICBnX3NldF9lcnJvcl9saXRlcmFsKGVycm9yLCBnX3F1YXJrX2Zy
b21fc3RyaW5nKCJXRUJLSVRfRE9NIiksIGVjZGVzYy5jb2RlLCBlY2Rlc2MubmFtZSk7CisgICAg
fQorfQorCitnY2hhcioKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfc3RyaW5nX2F0dHJf
d2l0aF9nZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgR0Vycm9y
KiogZXJyb3IpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOwor
ICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxm
KSwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoIWVycm9yIHx8ICEqZXJyb3IsIDApOwor
ICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAg
ICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBnY2hhciogcmVzdWx0ID0gY29u
dmVydFRvVVRGOFN0cmluZyhpdGVtLT5zdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYykp
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVm
c19zZXRfc3RyaW5nX2F0dHJfd2l0aF9nZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBl
ZGVmcyogc2VsZiwgY29uc3QgZ2NoYXIqIHZhbHVlKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRo
cmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNf
VEVTVF9UWVBFREVGUyhzZWxmKSk7CisgICAgZ19yZXR1cm5faWZfZmFpbCh2YWx1ZSk7CisgICAg
V2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAgIFdU
Rjo6U3RyaW5nIGNvbnZlcnRlZFZhbHVlID0gV1RGOjpTdHJpbmc6OmZyb21VVEY4KHZhbHVlKTsK
KyAgICBpdGVtLT5zZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihjb252ZXJ0ZWRWYWx1
ZSk7Cit9CisKK2djaGFyKgord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF9zdHJpbmdfYXR0
cl93aXRoX3NldHRlcl9leGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmKQorewor
ICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl92
YWxfaWZfZmFpbChXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMoc2VsZiksIDApOworICAgIFdl
YkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBnY2hh
ciogcmVzdWx0ID0gY29udmVydFRvVVRGOFN0cmluZyhpdGVtLT5zdHJpbmdBdHRyV2l0aFNldHRl
ckV4Y2VwdGlvbigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCit3ZWJraXRfZG9t
X3Rlc3RfdHlwZWRlZnNfc2V0X3N0cmluZ19hdHRyX3dpdGhfc2V0dGVyX2V4Y2VwdGlvbihXZWJL
aXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIGNvbnN0IGdjaGFyKiB2YWx1ZSwgR0Vycm9yKiogZXJy
b3IpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIGdf
cmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpKTsKKyAgICBn
X3JldHVybl9pZl9mYWlsKHZhbHVlKTsKKyAgICBnX3JldHVybl9pZl9mYWlsKCFlcnJvciB8fCAh
KmVycm9yKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUo
c2VsZik7CisgICAgV1RGOjpTdHJpbmcgY29udmVydGVkVmFsdWUgPSBXVEY6OlN0cmluZzo6ZnJv
bVVURjgodmFsdWUpOworICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIGl0
ZW0tPnNldFN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKGNvbnZlcnRlZFZhbHVlLCBlYyk7
CisgICAgaWYgKGVjKSB7CisgICAgICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGVEZXNjcmlwdGlv
biBlY2Rlc2MoZWMpOworICAgICAgICBnX3NldF9lcnJvcl9saXRlcmFsKGVycm9yLCBnX3F1YXJr
X2Zyb21fc3RyaW5nKCJXRUJLSVRfRE9NIiksIGVjZGVzYy5jb2RlLCBlY2Rlc2MubmFtZSk7Cisg
ICAgfQorfQorCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rl
c3QvR09iamVjdC9XZWJLaXRET01UZXN0VHlwZWRlZnMuaCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmcy5oCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLjFhODJhNDhlNmVlNmU4ZTRiODE0OGYyYjFiMGI5YzA0ZmFmZWQ3NGMKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvR09iamVjdC9XZWJL
aXRET01UZXN0VHlwZWRlZnMuaApAQCAtMCwwICsxLDI2NCBAQAorLyoKKyAgICBUaGlzIGZpbGUg
aXMgcGFydCBvZiB0aGUgV2ViS2l0IG9wZW4gc291cmNlIHByb2plY3QuCisgICAgVGhpcyBmaWxl
IGhhcyBiZWVuIGdlbmVyYXRlZCBieSBnZW5lcmF0ZS1iaW5kaW5ncy5wbC4gRE8gTk9UIE1PRElG
WSEKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp
YnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg
TGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBG
cmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGlj
ZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMg
bGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVs
LAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVk
IHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElD
VUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExp
Y2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBh
IGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9u
ZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3
cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5r
bGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0Eu
CisqLworCisjaWZuZGVmIFdlYktpdERPTVRlc3RUeXBlZGVmc19oCisjZGVmaW5lIFdlYktpdERP
TVRlc3RUeXBlZGVmc19oCisKKyNpbmNsdWRlIDxnbGliLW9iamVjdC5oPgorI2luY2x1ZGUgPHdl
YmtpdGRvbS9XZWJLaXRET01PYmplY3QuaD4KKyNpbmNsdWRlIDx3ZWJraXRkb20vd2Via2l0ZG9t
ZGVmaW5lcy5oPgorCitHX0JFR0lOX0RFQ0xTCisKKyNkZWZpbmUgV0VCS0lUX1RZUEVfRE9NX1RF
U1RfVFlQRURFRlMgICAgICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF90eXBl
KCkpCisjZGVmaW5lIFdFQktJVF9ET01fVEVTVF9UWVBFREVGUyhvYmopICAgICAgICAgICAgKEdf
VFlQRV9DSEVDS19JTlNUQU5DRV9DQVNUKChvYmopLCBXRUJLSVRfVFlQRV9ET01fVEVTVF9UWVBF
REVGUywgV2ViS2l0RE9NVGVzdFR5cGVkZWZzKSkKKyNkZWZpbmUgV0VCS0lUX0RPTV9URVNUX1RZ
UEVERUZTX0NMQVNTKGtsYXNzKSAgICAoR19UWVBFX0NIRUNLX0NMQVNTX0NBU1QoKGtsYXNzKSwg
IFdFQktJVF9UWVBFX0RPTV9URVNUX1RZUEVERUZTLCBXZWJLaXRET01UZXN0VHlwZWRlZnNDbGFz
cykKKyNkZWZpbmUgV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKG9iaikgICAgICAgICAoR19U
WVBFX0NIRUNLX0lOU1RBTkNFX1RZUEUoKG9iaiksIFdFQktJVF9UWVBFX0RPTV9URVNUX1RZUEVE
RUZTKSkKKyNkZWZpbmUgV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTX0NMQVNTKGtsYXNzKSAo
R19UWVBFX0NIRUNLX0NMQVNTX1RZUEUoKGtsYXNzKSwgIFdFQktJVF9UWVBFX0RPTV9URVNUX1RZ
UEVERUZTKSkKKyNkZWZpbmUgV0VCS0lUX0RPTV9URVNUX1RZUEVERUZTX0dFVF9DTEFTUyhvYmop
ICAoR19UWVBFX0lOU1RBTkNFX0dFVF9DTEFTUygob2JqKSwgIFdFQktJVF9UWVBFX0RPTV9URVNU
X1RZUEVERUZTLCBXZWJLaXRET01UZXN0VHlwZWRlZnNDbGFzcykpCisKK3N0cnVjdCBfV2ViS2l0
RE9NVGVzdFR5cGVkZWZzIHsKKyAgICBXZWJLaXRET01PYmplY3QgcGFyZW50X2luc3RhbmNlOwor
fTsKKworc3RydWN0IF9XZWJLaXRET01UZXN0VHlwZWRlZnNDbGFzcyB7CisgICAgV2ViS2l0RE9N
T2JqZWN0Q2xhc3MgcGFyZW50X2NsYXNzOworfTsKKworV0VCS0lUX0FQSSBHVHlwZQord2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2dldF90eXBlICh2b2lkKTsKKworLyoqCisgKiB3ZWJraXRfZG9t
X3Rlc3RfdHlwZWRlZnNfZnVuYzoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMK
KyAqIEB4OiBBICNXZWJLaXRET01sb25nW10KKyAqCisgKiBSZXR1cm5zOgorICoKKyoqLworV0VC
S0lUX0FQSSB2b2lkCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZnVuYyhXZWJLaXRET01UZXN0
VHlwZWRlZnMqIHNlbGYsIFdlYktpdERPTWxvbmdbXSogeCk7CisKKy8qKgorICogd2Via2l0X2Rv
bV90ZXN0X3R5cGVkZWZzX211bHRpX3RyYW5zZmVyX2xpc3Q6CisgKiBAc2VsZjogQSAjV2ViS2l0
RE9NVGVzdFR5cGVkZWZzCisgKiBAZmlyc3Q6IEEgI1dlYktpdERPTVNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZQorICogQHR4OiBBICNXZWJLaXRET01BcnJheQorICogQHNlY29uZDogQSAjV2ViS2l0RE9N
U2VyaWFsaXplZFNjcmlwdFZhbHVlCisgKiBAdHh4OiBBICNXZWJLaXRET01BcnJheQorICoKKyAq
IFJldHVybnM6CisgKgorKiovCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBl
ZGVmc19tdWx0aV90cmFuc2Zlcl9saXN0KFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgV2Vi
S2l0RE9NU2VyaWFsaXplZFNjcmlwdFZhbHVlKiBmaXJzdCwgV2ViS2l0RE9NQXJyYXkqIHR4LCBX
ZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqIHNlY29uZCwgV2ViS2l0RE9NQXJyYXkqIHR4
eCk7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9zaGFkb3c6CisgKiBA
c2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisgKiBAd2lkdGg6IEEgI2dmbG9hdAorICog
QGhlaWdodDogQSAjZ2Zsb2F0CisgKiBAYmx1cjogQSAjZ2Zsb2F0CisgKiBAY29sb3I6IEEgI2dj
aGFyCisgKiBAYWxwaGE6IEEgI2dmbG9hdAorICoKKyAqIFJldHVybnM6CisgKgorKiovCitXRUJL
SVRfQVBJIHZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfc2hhZG93KFdlYktpdERP
TVRlc3RUeXBlZGVmcyogc2VsZiwgZ2Zsb2F0IHdpZHRoLCBnZmxvYXQgaGVpZ2h0LCBnZmxvYXQg
Ymx1ciwgY29uc3QgZ2NoYXIqIGNvbG9yLCBnZmxvYXQgYWxwaGEpOworCisvKioKKyAqIHdlYmtp
dF9kb21fdGVzdF90eXBlZGVmc19udWxsYWJsZV9hcnJheV9hcmc6CisgKiBAc2VsZjogQSAjV2Vi
S2l0RE9NVGVzdFR5cGVkZWZzCisgKiBAYXJyYXlBcmc6IEEgI1dlYktpdERPTURPTVN0cmluZ1td
CisgKgorICogUmV0dXJuczoKKyAqCisqKi8KK1dFQktJVF9BUEkgdm9pZAord2Via2l0X2RvbV90
ZXN0X3R5cGVkZWZzX251bGxhYmxlX2FycmF5X2FyZyhXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNl
bGYsIFdlYktpdERPTURPTVN0cmluZ1tdKiBhcnJheUFyZyk7CisKKy8qKgorICogd2Via2l0X2Rv
bV90ZXN0X3R5cGVkZWZzX2ltbXV0YWJsZV9wb2ludF9mdW5jdGlvbjoKKyAqIEBzZWxmOiBBICNX
ZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqCisgKiBSZXR1cm5zOiAodHJhbnNmZXIgbm9uZSk6Cisg
KgorKiovCitXRUJLSVRfQVBJIFdlYktpdERPTVNWR1BvaW50Kgord2Via2l0X2RvbV90ZXN0X3R5
cGVkZWZzX2ltbXV0YWJsZV9wb2ludF9mdW5jdGlvbihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNl
bGYpOworCisvKioKKyAqIHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zdHJpbmdfYXJyYXlfZnVu
Y3Rpb246CisgKiBAc2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisgKiBAdmFsdWVzOiBB
ICNXZWJLaXRET01ET01TdHJpbmdbXQorICogQGVycm9yOiAjR0Vycm9yCisgKgorICogUmV0dXJu
czogKHRyYW5zZmVyIG5vbmUpOgorICoKKyoqLworV0VCS0lUX0FQSSBXZWJLaXRET01ET01TdHJp
bmdbXSoKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zdHJpbmdfYXJyYXlfZnVuY3Rpb24oV2Vi
S2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJLaXRET01ET01TdHJpbmdbXSogdmFsdWVzLCBH
RXJyb3IqKiBlcnJvcik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX21ldGhv
ZF93aXRoX2V4Y2VwdGlvbjoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAq
IEBlcnJvcjogI0dFcnJvcgorICoKKyAqIFJldHVybnM6CisgKgorKiovCitXRUJLSVRfQVBJIHZv
aWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19tZXRob2Rfd2l0aF9leGNlcHRpb24oV2ViS2l0
RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBHRXJyb3IqKiBlcnJvcik7CisKKy8qKgorICogd2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2dldF91bnNpZ25lZF9sb25nX2xvbmdfYXR0cjoKKyAqIEBzZWxm
OiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqCisgKiBSZXR1cm5zOgorICoKKyoqLworV0VC
S0lUX0FQSSBndWludDY0Cit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X3Vuc2lnbmVkX2xv
bmdfbG9uZ19hdHRyKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZik7CisKKy8qKgorICogd2Vi
a2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF91bnNpZ25lZF9sb25nX2xvbmdfYXR0cjoKKyAqIEBz
ZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqIEB2YWx1ZTogQSAjZ3VpbnQ2NAorICoK
KyAqIFJldHVybnM6CisgKgorKiovCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF9kb21fdGVzdF90
eXBlZGVmc19zZXRfdW5zaWduZWRfbG9uZ19sb25nX2F0dHIoV2ViS2l0RE9NVGVzdFR5cGVkZWZz
KiBzZWxmLCBndWludDY0IHZhbHVlKTsKKworLyoqCisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRl
ZnNfZ2V0X2ltbXV0YWJsZV9zZXJpYWxpemVkX3NjcmlwdF92YWx1ZToKKyAqIEBzZWxmOiBBICNX
ZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqCisgKiBSZXR1cm5zOiAodHJhbnNmZXIgbm9uZSk6Cisg
KgorKiovCitXRUJLSVRfQVBJIFdlYktpdERPTVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSoKK3dlYmtp
dF9kb21fdGVzdF90eXBlZGVmc19nZXRfaW1tdXRhYmxlX3NlcmlhbGl6ZWRfc2NyaXB0X3ZhbHVl
KFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0
X3R5cGVkZWZzX3NldF9pbW11dGFibGVfc2VyaWFsaXplZF9zY3JpcHRfdmFsdWU6CisgKiBAc2Vs
ZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisgKiBAdmFsdWU6IEEgI1dlYktpdERPTVNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZQorICoKKyAqIFJldHVybnM6ICh0cmFuc2ZlciBub25lKToKKyAqCisq
Ki8KK1dFQktJVF9BUEkgdm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9pbW11dGFi
bGVfc2VyaWFsaXplZF9zY3JpcHRfdmFsdWUoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBX
ZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqIHZhbHVlKTsKKworLyoqCisgKiB3ZWJraXRf
ZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X2F0dHJfd2l0aF9nZXR0ZXJfZXhjZXB0aW9uOgorICogQHNl
bGY6IEEgI1dlYktpdERPTVRlc3RUeXBlZGVmcworICogQGVycm9yOiAjR0Vycm9yCisgKgorICog
UmV0dXJuczoKKyAqCisqKi8KK1dFQktJVF9BUEkgZ2xvbmcKK3dlYmtpdF9kb21fdGVzdF90eXBl
ZGVmc19nZXRfYXR0cl93aXRoX2dldHRlcl9leGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZz
KiBzZWxmLCBHRXJyb3IqKiBlcnJvcik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX3NldF9hdHRyX3dpdGhfZ2V0dGVyX2V4Y2VwdGlvbjoKKyAqIEBzZWxmOiBBICNXZWJLaXRE
T01UZXN0VHlwZWRlZnMKKyAqIEB2YWx1ZTogQSAjZ2xvbmcKKyAqCisgKiBSZXR1cm5zOgorICoK
KyoqLworV0VCS0lUX0FQSSB2b2lkCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X2F0dHJf
d2l0aF9nZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgZ2xvbmcg
dmFsdWUpOworCisvKioKKyAqIHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfYXR0cl93aXRo
X3NldHRlcl9leGNlcHRpb246CisgKiBAc2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisg
KgorICogUmV0dXJuczoKKyAqCisqKi8KK1dFQktJVF9BUEkgZ2xvbmcKK3dlYmtpdF9kb21fdGVz
dF90eXBlZGVmc19nZXRfYXR0cl93aXRoX3NldHRlcl9leGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5
cGVkZWZzKiBzZWxmKTsKKworLyoqCisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X2F0
dHJfd2l0aF9zZXR0ZXJfZXhjZXB0aW9uOgorICogQHNlbGY6IEEgI1dlYktpdERPTVRlc3RUeXBl
ZGVmcworICogQHZhbHVlOiBBICNnbG9uZworICogQGVycm9yOiAjR0Vycm9yCisgKgorICogUmV0
dXJuczoKKyAqCisqKi8KK1dFQktJVF9BUEkgdm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X3NldF9hdHRyX3dpdGhfc2V0dGVyX2V4Y2VwdGlvbihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNl
bGYsIGdsb25nIHZhbHVlLCBHRXJyb3IqKiBlcnJvcik7CisKKy8qKgorICogd2Via2l0X2RvbV90
ZXN0X3R5cGVkZWZzX2dldF9zdHJpbmdfYXR0cl93aXRoX2dldHRlcl9leGNlcHRpb246CisgKiBA
c2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisgKiBAZXJyb3I6ICNHRXJyb3IKKyAqCisg
KiBSZXR1cm5zOgorICoKKyoqLworV0VCS0lUX0FQSSBnY2hhcioKK3dlYmtpdF9kb21fdGVzdF90
eXBlZGVmc19nZXRfc3RyaW5nX2F0dHJfd2l0aF9nZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRl
c3RUeXBlZGVmcyogc2VsZiwgR0Vycm9yKiogZXJyb3IpOworCisvKioKKyAqIHdlYmtpdF9kb21f
dGVzdF90eXBlZGVmc19zZXRfc3RyaW5nX2F0dHJfd2l0aF9nZXR0ZXJfZXhjZXB0aW9uOgorICog
QHNlbGY6IEEgI1dlYktpdERPTVRlc3RUeXBlZGVmcworICogQHZhbHVlOiBBICNnY2hhcgorICoK
KyAqIFJldHVybnM6CisgKgorKiovCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF9kb21fdGVzdF90
eXBlZGVmc19zZXRfc3RyaW5nX2F0dHJfd2l0aF9nZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRl
c3RUeXBlZGVmcyogc2VsZiwgY29uc3QgZ2NoYXIqIHZhbHVlKTsKKworLyoqCisgKiB3ZWJraXRf
ZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X3N0cmluZ19hdHRyX3dpdGhfc2V0dGVyX2V4Y2VwdGlvbjoK
KyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqCisgKiBSZXR1cm5zOgorICoK
KyoqLworV0VCS0lUX0FQSSBnY2hhcioKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfc3Ry
aW5nX2F0dHJfd2l0aF9zZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2Vs
Zik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9zdHJpbmdfYXR0cl93
aXRoX3NldHRlcl9leGNlcHRpb246CisgKiBAc2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZz
CisgKiBAdmFsdWU6IEEgI2djaGFyCisgKiBAZXJyb3I6ICNHRXJyb3IKKyAqCisgKiBSZXR1cm5z
OgorICoKKyoqLworV0VCS0lUX0FQSSB2b2lkCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0
X3N0cmluZ19hdHRyX3dpdGhfc2V0dGVyX2V4Y2VwdGlvbihXZWJLaXRET01UZXN0VHlwZWRlZnMq
IHNlbGYsIGNvbnN0IGdjaGFyKiB2YWx1ZSwgR0Vycm9yKiogZXJyb3IpOworCitHX0VORF9ERUNM
UworCisjZW5kaWYgLyogV2ViS2l0RE9NVGVzdFR5cGVkZWZzX2ggKi8KZGlmZiAtLWdpdCBhL1Nv
dXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RU
eXBlZGVmc1ByaXZhdGUuaCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9H
T2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0
NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi4zYjg5MGJl
NTU0OWM0NjM5YWE4ZmNmMjdjNmRmOTBhMzgyN2U4ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvU291
cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5
cGVkZWZzUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgICAgVGhpcyBmaWxlIGlzIHBh
cnQgb2YgdGhlIFdlYktpdCBvcGVuIHNvdXJjZSBwcm9qZWN0LgorICAgIFRoaXMgZmlsZSBoYXMg
YmVlbiBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtYmluZGluZ3MucGwuIERPIE5PVCBNT0RJRlkhCisK
KyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUg
aXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2Us
IG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAg
ICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJy
YW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIg
UFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNl
IGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5
IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0
aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUg
dG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBT
dHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8K
KworI2lmbmRlZiBXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlX2gKKyNkZWZpbmUgV2ViS2l0
RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZV9oCisKKyNpbmNsdWRlICJUZXN0VHlwZWRlZnMuaCIKKyNp
bmNsdWRlIDx3ZWJraXRkb20vV2ViS2l0RE9NVGVzdFR5cGVkZWZzLmg+CisKK25hbWVzcGFjZSBX
ZWJLaXQgeworV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiB3cmFwVGVzdFR5cGVkZWZzKFdlYkNvcmU6
OlRlc3RUeXBlZGVmcyopOworV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBjb3JlKFdlYktpdERPTVRl
c3RUeXBlZGVmcyogcmVxdWVzdCk7CitXZWJLaXRET01UZXN0VHlwZWRlZnMqIGtpdChXZWJDb3Jl
OjpUZXN0VHlwZWRlZnMqIG5vZGUpOworfSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAv
KiBXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlX2ggKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RUeXBlZGVmcy5jcHAgYi9Tb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0VHlwZWRlZnMuY3BwCm5l
dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAuLmI5MzJjOTg3ZjEyZDM3NTBiOGUxNWY1NjBkMzExYmIwM2Q1YjQ2ZjMKLS0tIC9k
ZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNU
ZXN0VHlwZWRlZnMuY3BwCkBAIC0wLDAgKzEsNjAxIEBACisvKgorICAgIFRoaXMgZmlsZSBpcyBw
YXJ0IG9mIHRoZSBXZWJLaXQgb3BlbiBzb3VyY2UgcHJvamVjdC4KKyAgICBUaGlzIGZpbGUgaGFz
IGJlZW4gZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWJpbmRpbmdzLnBsLiBETyBOT1QgTU9ESUZZIQor
CisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUg
U29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl
LCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJy
YXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisg
ICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2Fy
cmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS
IFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29w
eSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdp
dGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRl
IHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4g
U3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyov
CisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNsdWRlICJKU1Rlc3RUeXBlZGVmcy5oIgorCisj
aW5jbHVkZSAiRE9NU3RyaW5nTGlzdC5oIgorI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNp
bmNsdWRlICJKU0FycmF5LmgiCisjaW5jbHVkZSAiSlNET01CaW5kaW5nLmgiCisjaW5jbHVkZSAi
SlNET01TdHJpbmdMaXN0LmgiCisjaW5jbHVkZSAiSlNTVkdQb2ludC5oIgorI2luY2x1ZGUgIkpT
U2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCisjaW5jbHVkZSAiSlNUZXN0Q2FsbGJhY2suaCIKKyNp
bmNsdWRlICJKU1Rlc3RTdWJPYmouaCIKKyNpbmNsdWRlICJLVVJMLmgiCisjaW5jbHVkZSAiU2Vy
aWFsaXplZFNjcmlwdFZhbHVlLmgiCisjaW5jbHVkZSAiVGVzdFR5cGVkZWZzLmgiCisjaW5jbHVk
ZSA8cnVudGltZS9FcnJvci5oPgorI2luY2x1ZGUgPHJ1bnRpbWUvSlNBcnJheS5oPgorI2luY2x1
ZGUgPHJ1bnRpbWUvSlNTdHJpbmcuaD4KKyNpbmNsdWRlIDx3dGYvR2V0UHRyLmg+CisKK3VzaW5n
IG5hbWVzcGFjZSBKU0M7CisKK25hbWVzcGFjZSBXZWJDb3JlIHsKKworLyogSGFzaCB0YWJsZSAq
LworCitzdGF0aWMgY29uc3QgSGFzaFRhYmxlVmFsdWUgSlNUZXN0VHlwZWRlZnNUYWJsZVZhbHVl
c1tdID0KK3sKKyAgICB7ICJ1bnNpZ25lZExvbmdMb25nQXR0ciIsIERvbnREZWxldGUsIChpbnRw
dHJfdClzdGF0aWNfY2FzdDxQcm9wZXJ0eVNsb3Q6OkdldFZhbHVlRnVuYz4oanNUZXN0VHlwZWRl
ZnNVbnNpZ25lZExvbmdMb25nQXR0ciksIChpbnRwdHJfdClzZXRKU1Rlc3RUeXBlZGVmc1Vuc2ln
bmVkTG9uZ0xvbmdBdHRyLCBOb0ludHJpbnNpYyB9LAorICAgIHsgImltbXV0YWJsZVNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSIsIERvbnREZWxldGUsIChpbnRwdHJfdClzdGF0aWNfY2FzdDxQcm9wZXJ0
eVNsb3Q6OkdldFZhbHVlRnVuYz4oanNUZXN0VHlwZWRlZnNJbW11dGFibGVTZXJpYWxpemVkU2Ny
aXB0VmFsdWUpLCAoaW50cHRyX3Qpc2V0SlNUZXN0VHlwZWRlZnNJbW11dGFibGVTZXJpYWxpemVk
U2NyaXB0VmFsdWUsIE5vSW50cmluc2ljIH0sCisgICAgeyAiYXR0cldpdGhHZXR0ZXJFeGNlcHRp
b24iLCBEb250RGVsZXRlLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8UHJvcGVydHlTbG90OjpHZXRW
YWx1ZUZ1bmM+KGpzVGVzdFR5cGVkZWZzQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24pLCAoaW50cHRy
X3Qpc2V0SlNUZXN0VHlwZWRlZnNBdHRyV2l0aEdldHRlckV4Y2VwdGlvbiwgTm9JbnRyaW5zaWMg
fSwKKyAgICB7ICJhdHRyV2l0aFNldHRlckV4Y2VwdGlvbiIsIERvbnREZWxldGUsIChpbnRwdHJf
dClzdGF0aWNfY2FzdDxQcm9wZXJ0eVNsb3Q6OkdldFZhbHVlRnVuYz4oanNUZXN0VHlwZWRlZnNB
dHRyV2l0aFNldHRlckV4Y2VwdGlvbiksIChpbnRwdHJfdClzZXRKU1Rlc3RUeXBlZGVmc0F0dHJX
aXRoU2V0dGVyRXhjZXB0aW9uLCBOb0ludHJpbnNpYyB9LAorICAgIHsgInN0cmluZ0F0dHJXaXRo
R2V0dGVyRXhjZXB0aW9uIiwgRG9udERlbGV0ZSwgKGludHB0cl90KXN0YXRpY19jYXN0PFByb3Bl
cnR5U2xvdDo6R2V0VmFsdWVGdW5jPihqc1Rlc3RUeXBlZGVmc1N0cmluZ0F0dHJXaXRoR2V0dGVy
RXhjZXB0aW9uKSwgKGludHB0cl90KXNldEpTVGVzdFR5cGVkZWZzU3RyaW5nQXR0cldpdGhHZXR0
ZXJFeGNlcHRpb24sIE5vSW50cmluc2ljIH0sCisgICAgeyAic3RyaW5nQXR0cldpdGhTZXR0ZXJF
eGNlcHRpb24iLCBEb250RGVsZXRlLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8UHJvcGVydHlTbG90
OjpHZXRWYWx1ZUZ1bmM+KGpzVGVzdFR5cGVkZWZzU3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRp
b24pLCAoaW50cHRyX3Qpc2V0SlNUZXN0VHlwZWRlZnNTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2Vw
dGlvbiwgTm9JbnRyaW5zaWMgfSwKKyAgICB7ICJjb25zdHJ1Y3RvciIsIERvbnRFbnVtIHwgUmVh
ZE9ubHksIChpbnRwdHJfdClzdGF0aWNfY2FzdDxQcm9wZXJ0eVNsb3Q6OkdldFZhbHVlRnVuYz4o
anNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvciksIChpbnRwdHJfdCkwLCBOb0ludHJpbnNpYyB9LAor
ICAgIHsgMCwgMCwgMCwgMCwgTm9JbnRyaW5zaWMgfQorfTsKKworc3RhdGljIGNvbnN0IEhhc2hU
YWJsZSBKU1Rlc3RUeXBlZGVmc1RhYmxlID0geyAxOCwgMTUsIEpTVGVzdFR5cGVkZWZzVGFibGVW
YWx1ZXMsIDAgfTsKKy8qIEhhc2ggdGFibGUgZm9yIGNvbnN0cnVjdG9yICovCisKK3N0YXRpYyBj
b25zdCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yVGFibGVWYWx1ZXNb
XSA9Cit7CisgICAgeyAiVGVzdFN1Yk9iaiIsIERvbnREZWxldGUgfCBSZWFkT25seSwgKGludHB0
cl90KXN0YXRpY19jYXN0PFByb3BlcnR5U2xvdDo6R2V0VmFsdWVGdW5jPihqc1Rlc3RUeXBlZGVm
c0NvbnN0cnVjdG9yVGVzdFN1Yk9iaiksIChpbnRwdHJfdCkwLCBOb0ludHJpbnNpYyB9LAorICAg
IHsgMCwgMCwgMCwgMCwgTm9JbnRyaW5zaWMgfQorfTsKKworc3RhdGljIGNvbnN0IEhhc2hUYWJs
ZSBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yVGFibGUgPSB7IDEsIDAsIEpTVGVzdFR5cGVkZWZz
Q29uc3RydWN0b3JUYWJsZVZhbHVlcywgMCB9OworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FM
TCBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yOjpjb25zdHJ1Y3RKU1Rlc3RUeXBlZGVmcyhFeGVj
U3RhdGUqIGV4ZWMpCit7CisgICAgSlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvciogY2FzdGVkVGhp
cyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yKj4oZXhlYy0+Y2FsbGVlKCkpOwor
ICAgIGlmIChleGVjLT5hcmd1bWVudENvdW50KCkgPCAyKQorICAgICAgICByZXR1cm4gdGhyb3dW
TUVycm9yKGV4ZWMsIGNyZWF0ZU5vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGV4ZWMpKTsKKyAgICBj
b25zdCBTdHJpbmcmIGhlbGxvKE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDAsIERlZmF1
bHRJc1VuZGVmaW5lZCkuaXNFbXB0eSgpID8gU3RyaW5nKCkgOiBNQVlCRV9NSVNTSU5HX1BBUkFN
RVRFUihleGVjLCAwLCBEZWZhdWx0SXNVbmRlZmluZWQpLnRvU3RyaW5nKGV4ZWMpLT52YWx1ZShl
eGVjKSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNW
YWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAgIGlmIChleGVjLT5hcmd1bWVudENvdW50
KCkgPD0gMSB8fCAhZXhlYy0+YXJndW1lbnQoMSkuaXNGdW5jdGlvbigpKQorICAgICAgICByZXR1
cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBSZWZQdHI8VGVzdENhbGxiYWNrPiB0ZXN0
Q2FsbGJhY2sgPSBKU1Rlc3RDYWxsYmFjazo6Y3JlYXRlKGFzT2JqZWN0KGV4ZWMtPmFyZ3VtZW50
KDEpKSwgY2FzdGVkVGhpcy0+Z2xvYmFsT2JqZWN0KCkpOworICAgIFJlZlB0cjxUZXN0VHlwZWRl
ZnM+IG9iamVjdCA9IFRlc3RUeXBlZGVmczo6Y3JlYXRlKGhlbGxvLCB0ZXN0Q2FsbGJhY2spOwor
ICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoYXNPYmplY3QodG9KUyhleGVjLCBjYXN0ZWRUaGlz
LT5nbG9iYWxPYmplY3QoKSwgb2JqZWN0LmdldCgpKSkpOworfQorCitjb25zdCBDbGFzc0luZm8g
SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6c19pbmZvID0geyAiVGVzdFR5cGVkZWZzQ29uc3Ry
dWN0b3IiLCAmQmFzZTo6c19pbmZvLCAmSlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvclRhYmxlLCAw
LCBDUkVBVEVfTUVUSE9EX1RBQkxFKEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IpIH07CisKK0pT
VGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IoU3RydWN0
dXJlKiBzdHJ1Y3R1cmUsIEpTRE9NR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QpCisgICAgOiBE
T01Db25zdHJ1Y3Rvck9iamVjdChzdHJ1Y3R1cmUsIGdsb2JhbE9iamVjdCkKK3sKK30KKwordm9p
ZCBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yOjpmaW5pc2hDcmVhdGlvbihFeGVjU3RhdGUqIGV4
ZWMsIEpTRE9NR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QpCit7CisgICAgQmFzZTo6ZmluaXNo
Q3JlYXRpb24oZXhlYy0+Z2xvYmFsRGF0YSgpKTsKKyAgICBBU1NFUlQoaW5oZXJpdHMoJnNfaW5m
bykpOworICAgIHB1dERpcmVjdChleGVjLT5nbG9iYWxEYXRhKCksIGV4ZWMtPnByb3BlcnR5TmFt
ZXMoKS5wcm90b3R5cGUsIEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlOjpzZWxmKGV4ZWMsIGdsb2Jh
bE9iamVjdCksIERvbnREZWxldGUgfCBSZWFkT25seSk7CisgICAgcHV0RGlyZWN0KGV4ZWMtPmds
b2JhbERhdGEoKSwgZXhlYy0+cHJvcGVydHlOYW1lcygpLmxlbmd0aCwganNOdW1iZXIoMiksIFJl
YWRPbmx5IHwgRG9udERlbGV0ZSB8IERvbnRFbnVtKTsKK30KKworYm9vbCBKU1Rlc3RUeXBlZGVm
c0NvbnN0cnVjdG9yOjpnZXRPd25Qcm9wZXJ0eVNsb3QoSlNDZWxsKiBjZWxsLCBFeGVjU3RhdGUq
IGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xvdCkKK3sK
KyAgICByZXR1cm4gZ2V0U3RhdGljVmFsdWVTbG90PEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3Is
IEpTRE9NV3JhcHBlcj4oZXhlYywgJkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3JUYWJsZSwganND
YXN0PEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IqPihjZWxsKSwgcHJvcGVydHlOYW1lLCBzbG90
KTsKK30KKworYm9vbCBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yOjpnZXRPd25Qcm9wZXJ0eURl
c2NyaXB0b3IoSlNPYmplY3QqIG9iamVjdCwgRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWUg
cHJvcGVydHlOYW1lLCBQcm9wZXJ0eURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpCit7CisgICAgcmV0
dXJuIGdldFN0YXRpY1ZhbHVlRGVzY3JpcHRvcjxKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yLCBK
U0RPTVdyYXBwZXI+KGV4ZWMsICZKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yVGFibGUsIGpzQ2Fz
dDxKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yKj4ob2JqZWN0KSwgcHJvcGVydHlOYW1lLCBkZXNj
cmlwdG9yKTsKK30KKworQ29uc3RydWN0VHlwZSBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yOjpn
ZXRDb25zdHJ1Y3REYXRhKEpTQ2VsbCosIENvbnN0cnVjdERhdGEmIGNvbnN0cnVjdERhdGEpCit7
CisgICAgY29uc3RydWN0RGF0YS5uYXRpdmUuZnVuY3Rpb24gPSBjb25zdHJ1Y3RKU1Rlc3RUeXBl
ZGVmczsKKyAgICByZXR1cm4gQ29uc3RydWN0VHlwZUhvc3Q7Cit9CisKKy8qIEhhc2ggdGFibGUg
Zm9yIHByb3RvdHlwZSAqLworCitzdGF0aWMgY29uc3QgSGFzaFRhYmxlVmFsdWUgSlNUZXN0VHlw
ZWRlZnNQcm90b3R5cGVUYWJsZVZhbHVlc1tdID0KK3sKKyAgICB7ICJmdW5jIiwgRG9udERlbGV0
ZSB8IEpTQzo6RnVuY3Rpb24sIChpbnRwdHJfdClzdGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4o
anNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbkZ1bmMpLCAoaW50cHRyX3QpMSwgTm9JbnRy
aW5zaWMgfSwKKyAgICB7ICJtdWx0aVRyYW5zZmVyTGlzdCIsIERvbnREZWxldGUgfCBKU0M6OkZ1
bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVk
ZWZzUHJvdG90eXBlRnVuY3Rpb25NdWx0aVRyYW5zZmVyTGlzdCksIChpbnRwdHJfdCk0LCBOb0lu
dHJpbnNpYyB9LAorICAgIHsgInNldFNoYWRvdyIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9u
LCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJv
dG90eXBlRnVuY3Rpb25TZXRTaGFkb3cpLCAoaW50cHRyX3QpNSwgTm9JbnRyaW5zaWMgfSwKKyAg
ICB7ICJtZXRob2RXaXRoU2VxdWVuY2VBcmciLCBEb250RGVsZXRlIHwgSlNDOjpGdW5jdGlvbiwg
KGludHB0cl90KXN0YXRpY19jYXN0PE5hdGl2ZUZ1bmN0aW9uPihqc1Rlc3RUeXBlZGVmc1Byb3Rv
dHlwZUZ1bmN0aW9uTWV0aG9kV2l0aFNlcXVlbmNlQXJnKSwgKGludHB0cl90KTEsIE5vSW50cmlu
c2ljIH0sCisgICAgeyAibnVsbGFibGVBcnJheUFyZyIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0
aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZz
UHJvdG90eXBlRnVuY3Rpb25OdWxsYWJsZUFycmF5QXJnKSwgKGludHB0cl90KTEsIE5vSW50cmlu
c2ljIH0sCisgICAgeyAiZnVuY1dpdGhDbGFtcCIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9u
LCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJv
dG90eXBlRnVuY3Rpb25GdW5jV2l0aENsYW1wKSwgKGludHB0cl90KTIsIE5vSW50cmluc2ljIH0s
CisgICAgeyAiaW1tdXRhYmxlUG9pbnRGdW5jdGlvbiIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0
aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZz
UHJvdG90eXBlRnVuY3Rpb25JbW11dGFibGVQb2ludEZ1bmN0aW9uKSwgKGludHB0cl90KTAsIE5v
SW50cmluc2ljIH0sCisgICAgeyAic3RyaW5nQXJyYXlGdW5jdGlvbiIsIERvbnREZWxldGUgfCBK
U0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZlRnVuY3Rpb24+KGpzVGVz
dFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25TdHJpbmdBcnJheUZ1bmN0aW9uKSwgKGludHB0cl90
KTEsIE5vSW50cmluc2ljIH0sCisgICAgeyAibWV0aG9kV2l0aEV4Y2VwdGlvbiIsIERvbnREZWxl
dGUgfCBKU0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZlRnVuY3Rpb24+
KGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25NZXRob2RXaXRoRXhjZXB0aW9uKSwgKGlu
dHB0cl90KTAsIE5vSW50cmluc2ljIH0sCisgICAgeyAwLCAwLCAwLCAwLCBOb0ludHJpbnNpYyB9
Cit9OworCitzdGF0aWMgY29uc3QgSGFzaFRhYmxlIEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlVGFi
bGUgPSB7IDMzLCAzMSwgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGVUYWJsZVZhbHVlcywgMCB9Owor
Y29uc3QgQ2xhc3NJbmZvIEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlOjpzX2luZm8gPSB7ICJUZXN0
VHlwZWRlZnNQcm90b3R5cGUiLCAmQmFzZTo6c19pbmZvLCAmSlNUZXN0VHlwZWRlZnNQcm90b3R5
cGVUYWJsZSwgMCwgQ1JFQVRFX01FVEhPRF9UQUJMRShKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSkg
fTsKKworSlNPYmplY3QqIEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlOjpzZWxmKEV4ZWNTdGF0ZSog
ZXhlYywgSlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCkKK3sKKyAgICByZXR1cm4gZ2V0RE9N
UHJvdG90eXBlPEpTVGVzdFR5cGVkZWZzPihleGVjLCBnbG9iYWxPYmplY3QpOworfQorCitib29s
IEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlOjpnZXRPd25Qcm9wZXJ0eVNsb3QoSlNDZWxsKiBjZWxs
LCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xv
dCYgc2xvdCkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSogdGhpc09iamVjdCA9IGpz
Q2FzdDxKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSo+KGNlbGwpOworICAgIHJldHVybiBnZXRTdGF0
aWNGdW5jdGlvblNsb3Q8SlNPYmplY3Q+KGV4ZWMsICZKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZVRh
YmxlLCB0aGlzT2JqZWN0LCBwcm9wZXJ0eU5hbWUsIHNsb3QpOworfQorCitib29sIEpTVGVzdFR5
cGVkZWZzUHJvdG90eXBlOjpnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSlNPYmplY3QqIG9iamVj
dCwgRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eURl
c2NyaXB0b3ImIGRlc2NyaXB0b3IpCit7CisgICAgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGUqIHRo
aXNPYmplY3QgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnNQcm90b3R5cGUqPihvYmplY3QpOworICAg
IHJldHVybiBnZXRTdGF0aWNGdW5jdGlvbkRlc2NyaXB0b3I8SlNPYmplY3Q+KGV4ZWMsICZKU1Rl
c3RUeXBlZGVmc1Byb3RvdHlwZVRhYmxlLCB0aGlzT2JqZWN0LCBwcm9wZXJ0eU5hbWUsIGRlc2Ny
aXB0b3IpOworfQorCitjb25zdCBDbGFzc0luZm8gSlNUZXN0VHlwZWRlZnM6OnNfaW5mbyA9IHsg
IlRlc3RUeXBlZGVmcyIsICZCYXNlOjpzX2luZm8sICZKU1Rlc3RUeXBlZGVmc1RhYmxlLCAwICwg
Q1JFQVRFX01FVEhPRF9UQUJMRShKU1Rlc3RUeXBlZGVmcykgfTsKKworSlNUZXN0VHlwZWRlZnM6
OkpTVGVzdFR5cGVkZWZzKFN0cnVjdHVyZSogc3RydWN0dXJlLCBKU0RPTUdsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0LCBQYXNzUmVmUHRyPFRlc3RUeXBlZGVmcz4gaW1wbCkKKyAgICA6IEpTRE9N
V3JhcHBlcihzdHJ1Y3R1cmUsIGdsb2JhbE9iamVjdCkKKyAgICAsIG1faW1wbChpbXBsLmxlYWtS
ZWYoKSkKK3sKK30KKwordm9pZCBKU1Rlc3RUeXBlZGVmczo6ZmluaXNoQ3JlYXRpb24oSlNHbG9i
YWxEYXRhJiBnbG9iYWxEYXRhKQoreworICAgIEJhc2U6OmZpbmlzaENyZWF0aW9uKGdsb2JhbERh
dGEpOworICAgIEFTU0VSVChpbmhlcml0cygmc19pbmZvKSk7Cit9CisKK0pTT2JqZWN0KiBKU1Rl
c3RUeXBlZGVmczo6Y3JlYXRlUHJvdG90eXBlKEV4ZWNTdGF0ZSogZXhlYywgSlNHbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCkKK3sKKyAgICByZXR1cm4gSlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6
OmNyZWF0ZShleGVjLT5nbG9iYWxEYXRhKCksIGdsb2JhbE9iamVjdCwgSlNUZXN0VHlwZWRlZnNQ
cm90b3R5cGU6OmNyZWF0ZVN0cnVjdHVyZShnbG9iYWxPYmplY3QtPmdsb2JhbERhdGEoKSwgZ2xv
YmFsT2JqZWN0LCBnbG9iYWxPYmplY3QtPm9iamVjdFByb3RvdHlwZSgpKSk7Cit9CisKK3ZvaWQg
SlNUZXN0VHlwZWRlZnM6OmRlc3Ryb3koSlNDOjpKU0NlbGwqIGNlbGwpCit7CisgICAgSlNUZXN0
VHlwZWRlZnMqIHRoaXNPYmplY3QgPSBzdGF0aWNfY2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGNlbGwp
OworICAgIHRoaXNPYmplY3QtPkpTVGVzdFR5cGVkZWZzOjp+SlNUZXN0VHlwZWRlZnMoKTsKK30K
KworSlNUZXN0VHlwZWRlZnM6On5KU1Rlc3RUeXBlZGVmcygpCit7CisgICAgcmVsZWFzZUltcGxJ
Zk5vdE51bGwoKTsKK30KKworYm9vbCBKU1Rlc3RUeXBlZGVmczo6Z2V0T3duUHJvcGVydHlTbG90
KEpTQ2VsbCogY2VsbCwgRXhlY1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1l
LCBQcm9wZXJ0eVNsb3QmIHNsb3QpCit7CisgICAgSlNUZXN0VHlwZWRlZnMqIHRoaXNPYmplY3Qg
PSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihjZWxsKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lO
SEVSSVRTKHRoaXNPYmplY3QsICZzX2luZm8pOworICAgIHJldHVybiBnZXRTdGF0aWNWYWx1ZVNs
b3Q8SlNUZXN0VHlwZWRlZnMsIEJhc2U+KGV4ZWMsICZKU1Rlc3RUeXBlZGVmc1RhYmxlLCB0aGlz
T2JqZWN0LCBwcm9wZXJ0eU5hbWUsIHNsb3QpOworfQorCitib29sIEpTVGVzdFR5cGVkZWZzOjpn
ZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSlNPYmplY3QqIG9iamVjdCwgRXhlY1N0YXRlKiBleGVj
LCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eURlc2NyaXB0b3ImIGRlc2NyaXB0
b3IpCit7CisgICAgSlNUZXN0VHlwZWRlZnMqIHRoaXNPYmplY3QgPSBqc0Nhc3Q8SlNUZXN0VHlw
ZWRlZnMqPihvYmplY3QpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVj
dCwgJnNfaW5mbyk7CisgICAgcmV0dXJuIGdldFN0YXRpY1ZhbHVlRGVzY3JpcHRvcjxKU1Rlc3RU
eXBlZGVmcywgQmFzZT4oZXhlYywgJkpTVGVzdFR5cGVkZWZzVGFibGUsIHRoaXNPYmplY3QsIHBy
b3BlcnR5TmFtZSwgZGVzY3JpcHRvcik7Cit9CisKK0pTVmFsdWUganNUZXN0VHlwZWRlZnNVbnNp
Z25lZExvbmdMb25nQXR0cihFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgc2xvdEJhc2UsIFByb3Bl
cnR5TmFtZSkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rl
c3RUeXBlZGVmcyo+KGFzT2JqZWN0KHNsb3RCYXNlKSk7CisgICAgVU5VU0VEX1BBUkFNKGV4ZWMp
OworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNh
c3RlZFRoaXMtPmltcGwoKSk7CisgICAgSlNWYWx1ZSByZXN1bHQgPSBqc051bWJlcihpbXBsLT51
bnNpZ25lZExvbmdMb25nQXR0cigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0pTVmFs
dWUganNUZXN0VHlwZWRlZnNJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoRXhlY1N0YXRl
KiBleGVjLCBKU1ZhbHVlIHNsb3RCYXNlLCBQcm9wZXJ0eU5hbWUpCit7CisgICAgSlNUZXN0VHlw
ZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihhc09iamVjdChzbG90
QmFzZSkpOworICAgIFVOVVNFRF9QQVJBTShleGVjKTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwg
PSBzdGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIEpT
VmFsdWUgcmVzdWx0ID0gaW1wbC0+aW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKCkgPyBp
bXBsLT5pbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKS0+ZGVzZXJpYWxpemUoZXhlYywg
Y2FzdGVkVGhpcy0+Z2xvYmFsT2JqZWN0KCksIDApIDoganNOdWxsKCk7CisgICAgcmV0dXJuIHJl
c3VsdDsKK30KKworCitKU1ZhbHVlIGpzVGVzdFR5cGVkZWZzQ29uc3RydWN0b3JUZXN0U3ViT2Jq
KEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSBzbG90QmFzZSwgUHJvcGVydHlOYW1lKQoreworICAg
IEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNP
YmplY3Qoc2xvdEJhc2UpKTsKKyAgICByZXR1cm4gSlNUZXN0U3ViT2JqOjpnZXRDb25zdHJ1Y3Rv
cihleGVjLCBjYXN0ZWRUaGlzLT5nbG9iYWxPYmplY3QoKSk7Cit9CisKKworSlNWYWx1ZSBqc1Rl
c3RUeXBlZGVmc0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1
ZSBzbG90QmFzZSwgUHJvcGVydHlOYW1lKQoreworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRU
aGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3Qoc2xvdEJhc2UpKTsKKyAgICBF
eGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBzdGF0aWNfY2Fz
dDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIEpTQzo6SlNWYWx1ZSBy
ZXN1bHQgPSBqc051bWJlcihpbXBsLT5hdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYykpOworICAg
IHNldERPTUV4Y2VwdGlvbihleGVjLCBlYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitK
U1ZhbHVlIGpzVGVzdFR5cGVkZWZzQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oRXhlY1N0YXRlKiBl
eGVjLCBKU1ZhbHVlIHNsb3RCYXNlLCBQcm9wZXJ0eU5hbWUpCit7CisgICAgSlNUZXN0VHlwZWRl
ZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihhc09iamVjdChzbG90QmFz
ZSkpOworICAgIFVOVVNFRF9QQVJBTShleGVjKTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBz
dGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIEpTVmFs
dWUgcmVzdWx0ID0ganNOdW1iZXIoaW1wbC0+YXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oKSk7Cisg
ICAgcmV0dXJuIHJlc3VsdDsKK30KKworCitKU1ZhbHVlIGpzVGVzdFR5cGVkZWZzU3RyaW5nQXR0
cldpdGhHZXR0ZXJFeGNlcHRpb24oRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIHNsb3RCYXNlLCBQ
cm9wZXJ0eU5hbWUpCit7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8
SlNUZXN0VHlwZWRlZnMqPihhc09iamVjdChzbG90QmFzZSkpOworICAgIEV4Y2VwdGlvbkNvZGUg
ZWMgPSAwOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVm
cyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgSlNDOjpKU1ZhbHVlIHJlc3VsdCA9IGpzU3Ry
aW5nV2l0aENhY2hlKGV4ZWMsIGltcGwtPnN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKGVj
KSk7CisgICAgc2V0RE9NRXhjZXB0aW9uKGV4ZWMsIGVjKTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCisKK0pTVmFsdWUganNUZXN0VHlwZWRlZnNTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlv
bihFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgc2xvdEJhc2UsIFByb3BlcnR5TmFtZSkKK3sKKyAg
ICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFz
T2JqZWN0KHNsb3RCYXNlKSk7CisgICAgVU5VU0VEX1BBUkFNKGV4ZWMpOworICAgIFRlc3RUeXBl
ZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwo
KSk7CisgICAgSlNWYWx1ZSByZXN1bHQgPSBqc1N0cmluZ1dpdGhDYWNoZShleGVjLCBpbXBsLT5z
dHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CisKK0pTVmFsdWUganNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvcihFeGVjU3RhdGUqIGV4ZWMsIEpT
VmFsdWUgc2xvdEJhc2UsIFByb3BlcnR5TmFtZSkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogZG9t
T2JqZWN0ID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3Qoc2xvdEJhc2UpKTsKKyAg
ICByZXR1cm4gSlNUZXN0VHlwZWRlZnM6OmdldENvbnN0cnVjdG9yKGV4ZWMsIGRvbU9iamVjdC0+
Z2xvYmFsT2JqZWN0KCkpOworfQorCit2b2lkIEpTVGVzdFR5cGVkZWZzOjpwdXQoSlNDZWxsKiBj
ZWxsLCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIEpTVmFsdWUg
dmFsdWUsIFB1dFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogdGhp
c09iamVjdCA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19P
QkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgJnNfaW5mbyk7CisgICAgbG9va3VwUHV0PEpTVGVz
dFR5cGVkZWZzLCBCYXNlPihleGVjLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCAmSlNUZXN0VHlwZWRl
ZnNUYWJsZSwgdGhpc09iamVjdCwgc2xvdCk7Cit9CisKK3ZvaWQgc2V0SlNUZXN0VHlwZWRlZnNV
bnNpZ25lZExvbmdMb25nQXR0cihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqZWN0
LCBKU1ZhbHVlIHZhbHVlKQoreworICAgIFVOVVNFRF9QQVJBTShleGVjKTsKKyAgICBKU1Rlc3RU
eXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KHRoaXNPYmplY3Qp
OworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNh
c3RlZFRoaXMtPmltcGwoKSk7CisgICAgaW1wbC0+c2V0VW5zaWduZWRMb25nTG9uZ0F0dHIoc3Rh
dGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPih2YWx1ZS50b0ludGVnZXIoZXhlYykpKTsKK30K
KworCit2b2lkIHNldEpTVGVzdFR5cGVkZWZzSW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVl
KEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmplY3QsIEpTVmFsdWUgdmFsdWUpCit7
CisgICAgVU5VU0VEX1BBUkFNKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlz
ID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4odGhpc09iamVjdCk7CisgICAgVGVzdFR5cGVkZWZz
KiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsK
KyAgICBpbXBsLT5zZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoU2VyaWFsaXplZFNj
cmlwdFZhbHVlOjpjcmVhdGUoZXhlYywgdmFsdWUsIDAsIDApKTsKK30KKworCit2b2lkIHNldEpT
VGVzdFR5cGVkZWZzQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oRXhlY1N0YXRlKiBleGVjLCBKU09i
amVjdCogdGhpc09iamVjdCwgSlNWYWx1ZSB2YWx1ZSkKK3sKKyAgICBVTlVTRURfUEFSQU0oZXhl
Yyk7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRl
ZnMqPih0aGlzT2JqZWN0KTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBzdGF0aWNfY2FzdDxU
ZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIGltcGwtPnNldEF0dHJXaXRo
R2V0dGVyRXhjZXB0aW9uKHZhbHVlLnRvSW50MzIoZXhlYykpOworfQorCisKK3ZvaWQgc2V0SlNU
ZXN0VHlwZWRlZnNBdHRyV2l0aFNldHRlckV4Y2VwdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2Jq
ZWN0KiB0aGlzT2JqZWN0LCBKU1ZhbHVlIHZhbHVlKQoreworICAgIFVOVVNFRF9QQVJBTShleGVj
KTsKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVm
cyo+KHRoaXNPYmplY3QpOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRl
c3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgRXhjZXB0aW9uQ29kZSBlYyA9
IDA7CisgICAgaW1wbC0+c2V0QXR0cldpdGhTZXR0ZXJFeGNlcHRpb24odmFsdWUudG9JbnQzMihl
eGVjKSwgZWMpOworICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Cit9CisKKwordm9pZCBz
ZXRKU1Rlc3RUeXBlZGVmc1N0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKEV4ZWNTdGF0ZSog
ZXhlYywgSlNPYmplY3QqIHRoaXNPYmplY3QsIEpTVmFsdWUgdmFsdWUpCit7CisgICAgVU5VU0VE
X1BBUkFNKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpT
VGVzdFR5cGVkZWZzKj4odGhpc09iamVjdCk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0gc3Rh
dGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBpbXBsLT5z
ZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbih2YWx1ZS5pc0VtcHR5KCkgPyBTdHJpbmco
KSA6IHZhbHVlLnRvU3RyaW5nKGV4ZWMpLT52YWx1ZShleGVjKSk7Cit9CisKKwordm9pZCBzZXRK
U1Rlc3RUeXBlZGVmc1N0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKEV4ZWNTdGF0ZSogZXhl
YywgSlNPYmplY3QqIHRoaXNPYmplY3QsIEpTVmFsdWUgdmFsdWUpCit7CisgICAgVU5VU0VEX1BB
UkFNKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVz
dFR5cGVkZWZzKj4odGhpc09iamVjdCk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGlj
X2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBFeGNlcHRpb25D
b2RlIGVjID0gMDsKKyAgICBpbXBsLT5zZXRTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbih2
YWx1ZS5pc0VtcHR5KCkgPyBTdHJpbmcoKSA6IHZhbHVlLnRvU3RyaW5nKGV4ZWMpLT52YWx1ZShl
eGVjKSwgZWMpOworICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBlYyk7Cit9CisKKworSlNWYWx1
ZSBKU1Rlc3RUeXBlZGVmczo6Z2V0Q29uc3RydWN0b3IoRXhlY1N0YXRlKiBleGVjLCBKU0dsb2Jh
bE9iamVjdCogZ2xvYmFsT2JqZWN0KQoreworICAgIHJldHVybiBnZXRET01Db25zdHJ1Y3RvcjxK
U1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yPihleGVjLCBqc0Nhc3Q8SlNET01HbG9iYWxPYmplY3Qq
PihnbG9iYWxPYmplY3QpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rl
c3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uRnVuYyhFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAg
SlNWYWx1ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7CisgICAgaWYgKCF0aGlz
VmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pKQorICAgICAgICByZXR1cm4g
dGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9
IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1ZSkpOworICAgIEFTU0VS
VF9HQ19PQkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8p
OworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNh
c3RlZFRoaXMtPmltcGwoKSk7CisKKyAgICBzaXplX3QgYXJnc0NvdW50ID0gZXhlYy0+YXJndW1l
bnRDb3VudCgpOworICAgIGlmIChhcmdzQ291bnQgPD0gMCkgeworICAgICAgICBpbXBsLT5mdW5j
KCk7CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAg
fQorCisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50Q291bnQoKSA+IDAgJiYgIWV4ZWMtPmFyZ3VtZW50
KDApLmlzVW5kZWZpbmVkT3JOdWxsKCkgJiYgIWV4ZWMtPmFyZ3VtZW50KDApLmluaGVyaXRzKCZK
U2xvbmdbXTo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1UeXBlRXJyb3IoZXhlYyk7
CisgICAgVmVjdG9yPGludD4geCh0b05hdGl2ZUFycmF5PGludD4oZXhlYywgTUFZQkVfTUlTU0lO
R19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSkpOworICAgIGlmIChleGVj
LT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVm
aW5lZCgpKTsKKyAgICBpbXBsLT5mdW5jKHgpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUo
anNVbmRlZmluZWQoKSk7Cit9CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwganNUZXN0
VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk11bHRpVHJhbnNmZXJMaXN0KEV4ZWNTdGF0ZSogZXhl
YykKK3sKKyAgICBKU1ZhbHVlIHRoaXNWYWx1ZSA9IGV4ZWMtPmhvc3RUaGlzVmFsdWUoKTsKKyAg
ICBpZiAoIXRoaXNWYWx1ZS5pbmhlcml0cygmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbykpCisgICAg
ICAgIHJldHVybiB0aHJvd1ZNVHlwZUVycm9yKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZzKiBj
YXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3QodGhpc1ZhbHVlKSk7
CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyhjYXN0ZWRUaGlzLCAmSlNUZXN0VHlwZWRl
ZnM6OnNfaW5mbyk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5
cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBpZiAoZXhlYy0+YXJndW1lbnRDb3Vu
dCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1FcnJvcihleGVjLCBjcmVhdGVOb3RFbm91
Z2hBcmd1bWVudHNFcnJvcihleGVjKSk7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1
ZT4gZmlyc3QoU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoZXhlYywgTUFZQkVfTUlTU0lO
R19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSwgMCwgMCkpOworICAgIGlm
IChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShq
c1VuZGVmaW5lZCgpKTsKKworICAgIHNpemVfdCBhcmdzQ291bnQgPSBleGVjLT5hcmd1bWVudENv
dW50KCk7CisgICAgaWYgKGFyZ3NDb3VudCA8PSAxKSB7CisgICAgICAgIGltcGwtPm11bHRpVHJh
bnNmZXJMaXN0KGZpcnN0KTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVm
aW5lZCgpKTsKKyAgICB9CisKKyAgICBBcnJheSogdHgodG9BcnJheShNQVlCRV9NSVNTSU5HX1BB
UkFNRVRFUihleGVjLCAxLCBEZWZhdWx0SXNVbmRlZmluZWQpKSk7CisgICAgaWYgKGV4ZWMtPmhh
ZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVk
KCkpOworICAgIGlmIChhcmdzQ291bnQgPD0gMikgeworICAgICAgICBpbXBsLT5tdWx0aVRyYW5z
ZmVyTGlzdChmaXJzdCwgdHgpOworICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5k
ZWZpbmVkKCkpOworICAgIH0KKworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHNl
Y29uZChTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShleGVjLCBNQVlCRV9NSVNTSU5HX1BB
UkFNRVRFUihleGVjLCAyLCBEZWZhdWx0SXNVbmRlZmluZWQpLCAwLCAwKSk7CisgICAgaWYgKGV4
ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5k
ZWZpbmVkKCkpOworICAgIGlmIChhcmdzQ291bnQgPD0gMykgeworICAgICAgICBpbXBsLT5tdWx0
aVRyYW5zZmVyTGlzdChmaXJzdCwgdHgsIHNlY29uZCk7CisgICAgICAgIHJldHVybiBKU1ZhbHVl
OjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgfQorCisgICAgQXJyYXkqIHR4eCh0b0FycmF5
KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDMsIERlZmF1bHRJc1VuZGVmaW5lZCkpKTsK
KyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjpl
bmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgaW1wbC0+bXVsdGlUcmFuc2Zlckxpc3QoZmlyc3Qs
IHR4LCBzZWNvbmQsIHR4eCk7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5l
ZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1By
b3RvdHlwZUZ1bmN0aW9uU2V0U2hhZG93KEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBKU1ZhbHVl
IHRoaXNWYWx1ZSA9IGV4ZWMtPmhvc3RUaGlzVmFsdWUoKTsKKyAgICBpZiAoIXRoaXNWYWx1ZS5p
bmhlcml0cygmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd1ZN
VHlwZUVycm9yKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0
PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3QodGhpc1ZhbHVlKSk7CisgICAgQVNTRVJUX0dDX09C
SkVDVF9JTkhFUklUUyhjYXN0ZWRUaGlzLCAmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbyk7CisgICAg
VGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhp
cy0+aW1wbCgpKTsKKyAgICBpZiAoZXhlYy0+YXJndW1lbnRDb3VudCgpIDwgMykKKyAgICAgICAg
cmV0dXJuIHRocm93Vk1FcnJvcihleGVjLCBjcmVhdGVOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihl
eGVjKSk7CisgICAgZmxvYXQgd2lkdGgoTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMCwg
RGVmYXVsdElzVW5kZWZpbmVkKS50b0Zsb2F0KGV4ZWMpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhj
ZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7
CisgICAgZmxvYXQgaGVpZ2h0KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDEsIERlZmF1
bHRJc1VuZGVmaW5lZCkudG9GbG9hdChleGVjKSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlv
bigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAg
IGZsb2F0IGJsdXIoTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMiwgRGVmYXVsdElzVW5k
ZWZpbmVkKS50b0Zsb2F0KGV4ZWMpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisKKyAgICBzaXpl
X3QgYXJnc0NvdW50ID0gZXhlYy0+YXJndW1lbnRDb3VudCgpOworICAgIGlmIChhcmdzQ291bnQg
PD0gMykgeworICAgICAgICBpbXBsLT5zZXRTaGFkb3cod2lkdGgsIGhlaWdodCwgYmx1cik7Cisg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgfQorCisg
ICAgY29uc3QgU3RyaW5nJiBjb2xvcihNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAzLCBE
ZWZhdWx0SXNVbmRlZmluZWQpLmlzRW1wdHkoKSA/IFN0cmluZygpIDogTUFZQkVfTUlTU0lOR19Q
QVJBTUVURVIoZXhlYywgMywgRGVmYXVsdElzVW5kZWZpbmVkKS50b1N0cmluZyhleGVjKS0+dmFs
dWUoZXhlYykpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJu
IEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICBpZiAoYXJnc0NvdW50IDw9IDQp
IHsKKyAgICAgICAgaW1wbC0+c2V0U2hhZG93KHdpZHRoLCBoZWlnaHQsIGJsdXIsIGNvbG9yKTsK
KyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICB9CisK
KyAgICBmbG9hdCBhbHBoYShNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCA0LCBEZWZhdWx0
SXNVbmRlZmluZWQpLnRvRmxvYXQoZXhlYykpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24o
KSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICBp
bXBsLT5zZXRTaGFkb3cod2lkdGgsIGhlaWdodCwgYmx1ciwgY29sb3IsIGFscGhhKTsKKyAgICBy
ZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworfQorCitFbmNvZGVkSlNWYWx1
ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25NZXRob2RXaXRo
U2VxdWVuY2VBcmcoRXhlY1N0YXRlKiBleGVjKQoreworICAgIEpTVmFsdWUgdGhpc1ZhbHVlID0g
ZXhlYy0+aG9zdFRoaXNWYWx1ZSgpOworICAgIGlmICghdGhpc1ZhbHVlLmluaGVyaXRzKCZKU1Rl
c3RUeXBlZGVmczo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1UeXBlRXJyb3IoZXhl
Yyk7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRl
ZnMqPihhc09iamVjdCh0aGlzVmFsdWUpKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRT
KGNhc3RlZFRoaXMsICZKU1Rlc3RUeXBlZGVmczo6c19pbmZvKTsKKyAgICBUZXN0VHlwZWRlZnMq
IGltcGwgPSBzdGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOwor
ICAgIGlmIChleGVjLT5hcmd1bWVudENvdW50KCkgPCAxKQorICAgICAgICByZXR1cm4gdGhyb3dW
TUVycm9yKGV4ZWMsIGNyZWF0ZU5vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGV4ZWMpKTsKKyAgICBW
ZWN0b3I8UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4+IHNlcXVlbmNlQXJnKCh0b1JlZlB0
ck5hdGl2ZUFycmF5PFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSwgSlNTZXJpYWxpemVkU2NyaXB0VmFs
dWU+KGV4ZWMsIE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDAsIERlZmF1bHRJc1VuZGVm
aW5lZCksICZ0b1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZSkpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhj
ZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7
CisKKyAgICBKU0M6OkpTVmFsdWUgcmVzdWx0ID0ganNOdW1iZXIoaW1wbC0+bWV0aG9kV2l0aFNl
cXVlbmNlQXJnKHNlcXVlbmNlQXJnKSk7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShyZXN1
bHQpOworfQorCitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJv
dG90eXBlRnVuY3Rpb25OdWxsYWJsZUFycmF5QXJnKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBK
U1ZhbHVlIHRoaXNWYWx1ZSA9IGV4ZWMtPmhvc3RUaGlzVmFsdWUoKTsKKyAgICBpZiAoIXRoaXNW
YWx1ZS5pbmhlcml0cygmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbykpCisgICAgICAgIHJldHVybiB0
aHJvd1ZNVHlwZUVycm9yKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0g
anNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3QodGhpc1ZhbHVlKSk7CisgICAgQVNTRVJU
X0dDX09CSkVDVF9JTkhFUklUUyhjYXN0ZWRUaGlzLCAmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbyk7
CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2Fz
dGVkVGhpcy0+aW1wbCgpKTsKKyAgICBpZiAoZXhlYy0+YXJndW1lbnRDb3VudCgpIDwgMSkKKyAg
ICAgICAgcmV0dXJuIHRocm93Vk1FcnJvcihleGVjLCBjcmVhdGVOb3RFbm91Z2hBcmd1bWVudHNF
cnJvcihleGVjKSk7CisgICAgVmVjdG9yPFN0cmluZz4gYXJyYXlBcmcodG9OYXRpdmVBcnJheTxT
dHJpbmc+KGV4ZWMsIE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDAsIERlZmF1bHRJc1Vu
ZGVmaW5lZCkpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVy
biBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgaW1wbC0+bnVsbGFibGVBcnJh
eUFyZyhhcnJheUFyZyk7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgp
KTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3Rv
dHlwZUZ1bmN0aW9uRnVuY1dpdGhDbGFtcChFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgSlNWYWx1
ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7CisgICAgaWYgKCF0aGlzVmFsdWUu
aW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dW
TVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2Fz
dDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1ZSkpOworICAgIEFTU0VSVF9HQ19P
QkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pOworICAg
IFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNhc3RlZFRo
aXMtPmltcGwoKSk7CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50Q291bnQoKSA8IDEpCisgICAgICAg
IHJldHVybiB0aHJvd1ZNRXJyb3IoZXhlYywgY3JlYXRlTm90RW5vdWdoQXJndW1lbnRzRXJyb3Io
ZXhlYykpOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBhcmcxID0gMDsKKyAgICBkb3VibGUgYXJn
MU5hdGl2ZVZhbHVlID0gZXhlYy0+YXJndW1lbnQoMCkudG9OdW1iZXIoZXhlYyk7CisgICAgaWYg
KGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpz
VW5kZWZpbmVkKCkpOworCisgICAgaWYgKCFpc25hbihhcmcxTmF0aXZlVmFsdWUpKQorICAgICAg
ICBhcmcxID0gY2xhbXBUbzx1bnNpZ25lZCBsb25nIGxvbmc+KGFyZzFOYXRpdmVWYWx1ZSk7CisK
KworICAgIHNpemVfdCBhcmdzQ291bnQgPSBleGVjLT5hcmd1bWVudENvdW50KCk7CisgICAgaWYg
KGFyZ3NDb3VudCA8PSAxKSB7CisgICAgICAgIGltcGwtPmZ1bmNXaXRoQ2xhbXAoYXJnMSk7Cisg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgfQorCisg
ICAgdW5zaWduZWQgbG9uZyBsb25nIGFyZzIgPSAwOworICAgIGRvdWJsZSBhcmcyTmF0aXZlVmFs
dWUgPSBleGVjLT5hcmd1bWVudCgxKS50b051bWJlcihleGVjKTsKKyAgICBpZiAoZXhlYy0+aGFk
RXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQo
KSk7CisKKyAgICBpZiAoIWlzbmFuKGFyZzJOYXRpdmVWYWx1ZSkpCisgICAgICAgIGFyZzIgPSBj
bGFtcFRvPHVuc2lnbmVkIGxvbmcgbG9uZz4oYXJnMk5hdGl2ZVZhbHVlKTsKKworICAgIGltcGwt
PmZ1bmNXaXRoQ2xhbXAoYXJnMSwgYXJnMik7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShq
c1VuZGVmaW5lZCgpKTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RU
eXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uSW1tdXRhYmxlUG9pbnRGdW5jdGlvbihFeGVjU3RhdGUq
IGV4ZWMpCit7CisgICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7
CisgICAgaWYgKCF0aGlzVmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pKQor
ICAgICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVm
cyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1
ZSkpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5
cGVkZWZzOjpzX2luZm8pOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRl
c3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisKKyAgICBKU0M6OkpTVmFsdWUgcmVz
dWx0ID0gdG9KUyhleGVjLCBjYXN0ZWRUaGlzLT5nbG9iYWxPYmplY3QoKSwgV1RGOjpnZXRQdHIo
U1ZHUHJvcGVydHlUZWFyT2ZmPEZsb2F0UG9pbnQ+OjpjcmVhdGUoaW1wbC0+aW1tdXRhYmxlUG9p
bnRGdW5jdGlvbigpKSkpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUocmVzdWx0KTsKK30K
KworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1
bmN0aW9uU3RyaW5nQXJyYXlGdW5jdGlvbihFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgSlNWYWx1
ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7CisgICAgaWYgKCF0aGlzVmFsdWUu
aW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dW
TVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2Fz
dDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1ZSkpOworICAgIEFTU0VSVF9HQ19P
QkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pOworICAg
IFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNhc3RlZFRo
aXMtPmltcGwoKSk7CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50Q291bnQoKSA8IDEpCisgICAgICAg
IHJldHVybiB0aHJvd1ZNRXJyb3IoZXhlYywgY3JlYXRlTm90RW5vdWdoQXJndW1lbnRzRXJyb3Io
ZXhlYykpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIFZlY3RvcjxTdHJpbmc+IHZh
bHVlcyh0b05hdGl2ZUFycmF5PFN0cmluZz4oZXhlYywgTUFZQkVfTUlTU0lOR19QQVJBTUVURVIo
ZXhlYywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSkpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRp
b24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKwor
ICAgIEpTQzo6SlNWYWx1ZSByZXN1bHQgPSBqc0FycmF5KGV4ZWMsIGNhc3RlZFRoaXMtPmdsb2Jh
bE9iamVjdCgpLCBpbXBsLT5zdHJpbmdBcnJheUZ1bmN0aW9uKHZhbHVlcywgZWMpKTsKKyAgICBz
ZXRET01FeGNlcHRpb24oZXhlYywgZWMpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUocmVz
dWx0KTsKK30KKworRW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1By
b3RvdHlwZUZ1bmN0aW9uTWV0aG9kV2l0aEV4Y2VwdGlvbihFeGVjU3RhdGUqIGV4ZWMpCit7Cisg
ICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7CisgICAgaWYgKCF0
aGlzVmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pKQorICAgICAgICByZXR1
cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhp
cyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1ZSkpOworICAgIEFT
U0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5cGVkZWZzOjpzX2lu
Zm8pOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+
KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgaW1w
bC0+bWV0aG9kV2l0aEV4Y2VwdGlvbihlYyk7CisgICAgc2V0RE9NRXhjZXB0aW9uKGV4ZWMsIGVj
KTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworfQorCitzdGF0
aWMgaW5saW5lIGJvb2wgaXNPYnNlcnZhYmxlKEpTVGVzdFR5cGVkZWZzKiBqc1Rlc3RUeXBlZGVm
cykKK3sKKyAgICBpZiAoanNUZXN0VHlwZWRlZnMtPmhhc0N1c3RvbVByb3BlcnRpZXMoKSkKKyAg
ICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEpTVGVzdFR5
cGVkZWZzT3duZXI6OmlzUmVhY2hhYmxlRnJvbU9wYXF1ZVJvb3RzKEpTQzo6SGFuZGxlPEpTQzo6
VW5rbm93bj4gaGFuZGxlLCB2b2lkKiwgU2xvdFZpc2l0b3ImIHZpc2l0b3IpCit7CisgICAgSlNU
ZXN0VHlwZWRlZnMqIGpzVGVzdFR5cGVkZWZzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oaGFu
ZGxlLmdldCgpLmFzQ2VsbCgpKTsKKyAgICBpZiAoIWlzT2JzZXJ2YWJsZShqc1Rlc3RUeXBlZGVm
cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBVTlVTRURfUEFSQU0odmlzaXRvcik7Cisg
ICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEpTVGVzdFR5cGVkZWZzT3duZXI6OmZpbmFsaXpl
KEpTQzo6SGFuZGxlPEpTQzo6VW5rbm93bj4gaGFuZGxlLCB2b2lkKiBjb250ZXh0KQoreworICAg
IEpTVGVzdFR5cGVkZWZzKiBqc1Rlc3RUeXBlZGVmcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+
KGhhbmRsZS5nZXQoKS5hc0NlbGwoKSk7CisgICAgRE9NV3JhcHBlcldvcmxkKiB3b3JsZCA9IHN0
YXRpY19jYXN0PERPTVdyYXBwZXJXb3JsZCo+KGNvbnRleHQpOworICAgIHVuY2FjaGVXcmFwcGVy
KHdvcmxkLCBqc1Rlc3RUeXBlZGVmcy0+aW1wbCgpLCBqc1Rlc3RUeXBlZGVmcyk7CisgICAganNU
ZXN0VHlwZWRlZnMtPnJlbGVhc2VJbXBsKCk7Cit9CisKK0pTQzo6SlNWYWx1ZSB0b0pTKEpTQzo6
RXhlY1N0YXRlKiBleGVjLCBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBUZXN0VHlw
ZWRlZnMqIGltcGwpCit7CisgICAgcmV0dXJuIHdyYXA8SlNUZXN0VHlwZWRlZnM+KGV4ZWMsIGds
b2JhbE9iamVjdCwgaW1wbCk7Cit9CisKK1Rlc3RUeXBlZGVmcyogdG9UZXN0VHlwZWRlZnMoSlND
OjpKU1ZhbHVlIHZhbHVlKQoreworICAgIHJldHVybiB2YWx1ZS5pbmhlcml0cygmSlNUZXN0VHlw
ZWRlZnM6OnNfaW5mbykgPyBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihhc09iamVjdCh2YWx1ZSkp
LT5pbXBsKCkgOiAwOworfQorCit9CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5n
cy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0VHlwZWRlZnMuaCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvdGVzdC9KUy9KU1Rlc3RUeXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0
CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjc3MDEzYzE4
ZTIzY2QyYjRlODVjNDMwMDQ5YWZkODQzYmI2MmJmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3Vy
Y2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0VHlwZWRlZnMuaApAQCAt
MCwwICsxLDE3MSBAQAorLyoKKyAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IG9w
ZW4gc291cmNlIHByb2plY3QuCisgICAgVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBn
ZW5lcmF0ZS1iaW5kaW5ncy5wbC4gRE8gTk9UIE1PRElGWSEKKworICAgIFRoaXMgbGlicmFyeSBp
cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2Rp
ZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYwor
ICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247
IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9u
KSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBp
biB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBX
QVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hB
TlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBH
TlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K
KworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2Vl
IHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3Is
CisgICAgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaWZuZGVmIEpTVGVzdFR5
cGVkZWZzX2gKKyNkZWZpbmUgSlNUZXN0VHlwZWRlZnNfaAorCisjaW5jbHVkZSAiSlNET01CaW5k
aW5nLmgiCisjaW5jbHVkZSAiVGVzdFR5cGVkZWZzLmgiCisjaW5jbHVkZSA8cnVudGltZS9KU0ds
b2JhbE9iamVjdC5oPgorI2luY2x1ZGUgPHJ1bnRpbWUvSlNPYmplY3QuaD4KKyNpbmNsdWRlIDxy
dW50aW1lL09iamVjdFByb3RvdHlwZS5oPgorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKK2NsYXNz
IEpTVGVzdFR5cGVkZWZzIDogcHVibGljIEpTRE9NV3JhcHBlciB7CitwdWJsaWM6CisgICAgdHlw
ZWRlZiBKU0RPTVdyYXBwZXIgQmFzZTsKKyAgICBzdGF0aWMgSlNUZXN0VHlwZWRlZnMqIGNyZWF0
ZShKU0M6OlN0cnVjdHVyZSogc3RydWN0dXJlLCBKU0RPTUdsb2JhbE9iamVjdCogZ2xvYmFsT2Jq
ZWN0LCBQYXNzUmVmUHRyPFRlc3RUeXBlZGVmcz4gaW1wbCkKKyAgICB7CisgICAgICAgIEpTVGVz
dFR5cGVkZWZzKiBwdHIgPSBuZXcgKE5vdE51bGwsIEpTQzo6YWxsb2NhdGVDZWxsPEpTVGVzdFR5
cGVkZWZzPihnbG9iYWxPYmplY3QtPmdsb2JhbERhdGEoKS5oZWFwKSkgSlNUZXN0VHlwZWRlZnMo
c3RydWN0dXJlLCBnbG9iYWxPYmplY3QsIGltcGwpOworICAgICAgICBwdHItPmZpbmlzaENyZWF0
aW9uKGdsb2JhbE9iamVjdC0+Z2xvYmFsRGF0YSgpKTsKKyAgICAgICAgcmV0dXJuIHB0cjsKKyAg
ICB9CisKKyAgICBzdGF0aWMgSlNDOjpKU09iamVjdCogY3JlYXRlUHJvdG90eXBlKEpTQzo6RXhl
Y1N0YXRlKiwgSlNDOjpKU0dsb2JhbE9iamVjdCopOworICAgIHN0YXRpYyBib29sIGdldE93blBy
b3BlcnR5U2xvdChKU0M6OkpTQ2VsbCosIEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpQcm9wZXJ0eU5h
bWUsIEpTQzo6UHJvcGVydHlTbG90Jik7CisgICAgc3RhdGljIGJvb2wgZ2V0T3duUHJvcGVydHlE
ZXNjcmlwdG9yKEpTQzo6SlNPYmplY3QqLCBKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6UHJvcGVydHlO
YW1lLCBKU0M6OlByb3BlcnR5RGVzY3JpcHRvciYpOworICAgIHN0YXRpYyB2b2lkIHB1dChKU0M6
OkpTQ2VsbCosIEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpQcm9wZXJ0eU5hbWUsIEpTQzo6SlNWYWx1
ZSwgSlNDOjpQdXRQcm9wZXJ0eVNsb3QmKTsKKyAgICBzdGF0aWMgdm9pZCBkZXN0cm95KEpTQzo6
SlNDZWxsKik7CisgICAgfkpTVGVzdFR5cGVkZWZzKCk7CisgICAgc3RhdGljIGNvbnN0IEpTQzo6
Q2xhc3NJbmZvIHNfaW5mbzsKKworICAgIHN0YXRpYyBKU0M6OlN0cnVjdHVyZSogY3JlYXRlU3Ry
dWN0dXJlKEpTQzo6SlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRhLCBKU0M6OkpTR2xvYmFsT2JqZWN0
KiBnbG9iYWxPYmplY3QsIEpTQzo6SlNWYWx1ZSBwcm90b3R5cGUpCisgICAgeworICAgICAgICBy
ZXR1cm4gSlNDOjpTdHJ1Y3R1cmU6OmNyZWF0ZShnbG9iYWxEYXRhLCBnbG9iYWxPYmplY3QsIHBy
b3RvdHlwZSwgSlNDOjpUeXBlSW5mbyhKU0M6Ok9iamVjdFR5cGUsIFN0cnVjdHVyZUZsYWdzKSwg
JnNfaW5mbyk7CisgICAgfQorCisgICAgc3RhdGljIEpTQzo6SlNWYWx1ZSBnZXRDb25zdHJ1Y3Rv
cihKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNHbG9iYWxPYmplY3QqKTsKKyAgICBUZXN0VHlwZWRl
ZnMqIGltcGwoKSBjb25zdCB7IHJldHVybiBtX2ltcGw7IH0KKyAgICB2b2lkIHJlbGVhc2VJbXBs
KCkgeyBtX2ltcGwtPmRlcmVmKCk7IG1faW1wbCA9IDA7IH0KKworICAgIHZvaWQgcmVsZWFzZUlt
cGxJZk5vdE51bGwoKSB7IGlmIChtX2ltcGwpIHsgbV9pbXBsLT5kZXJlZigpOyBtX2ltcGwgPSAw
OyB9IH0KKworcHJpdmF0ZToKKyAgICBUZXN0VHlwZWRlZnMqIG1faW1wbDsKK3Byb3RlY3RlZDoK
KyAgICBKU1Rlc3RUeXBlZGVmcyhKU0M6OlN0cnVjdHVyZSosIEpTRE9NR2xvYmFsT2JqZWN0Kiwg
UGFzc1JlZlB0cjxUZXN0VHlwZWRlZnM+KTsKKyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKEpTQzo6
SlNHbG9iYWxEYXRhJik7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdz
ID0gSlNDOjpPdmVycmlkZXNHZXRPd25Qcm9wZXJ0eVNsb3QgfCBKU0M6OkludGVyY2VwdHNHZXRP
d25Qcm9wZXJ0eVNsb3RCeUluZGV4RXZlbldoZW5MZW5ndGhJc05vdFplcm8gfCBCYXNlOjpTdHJ1
Y3R1cmVGbGFnczsKK307CisKK2NsYXNzIEpTVGVzdFR5cGVkZWZzT3duZXIgOiBwdWJsaWMgSlND
OjpXZWFrSGFuZGxlT3duZXIgeworcHVibGljOgorICAgIHZpcnR1YWwgYm9vbCBpc1JlYWNoYWJs
ZUZyb21PcGFxdWVSb290cyhKU0M6OkhhbmRsZTxKU0M6OlVua25vd24+LCB2b2lkKiBjb250ZXh0
LCBKU0M6OlNsb3RWaXNpdG9yJik7CisgICAgdmlydHVhbCB2b2lkIGZpbmFsaXplKEpTQzo6SGFu
ZGxlPEpTQzo6VW5rbm93bj4sIHZvaWQqIGNvbnRleHQpOworfTsKKworaW5saW5lIEpTQzo6V2Vh
a0hhbmRsZU93bmVyKiB3cmFwcGVyT3duZXIoRE9NV3JhcHBlcldvcmxkKiwgVGVzdFR5cGVkZWZz
KikKK3sKKyAgICBERUZJTkVfU1RBVElDX0xPQ0FMKEpTVGVzdFR5cGVkZWZzT3duZXIsIGpzVGVz
dFR5cGVkZWZzT3duZXIsICgpKTsKKyAgICByZXR1cm4gJmpzVGVzdFR5cGVkZWZzT3duZXI7Cit9
CisKK2lubGluZSB2b2lkKiB3cmFwcGVyQ29udGV4dChET01XcmFwcGVyV29ybGQqIHdvcmxkLCBU
ZXN0VHlwZWRlZnMqKQoreworICAgIHJldHVybiB3b3JsZDsKK30KKworSlNDOjpKU1ZhbHVlIHRv
SlMoSlNDOjpFeGVjU3RhdGUqLCBKU0RPTUdsb2JhbE9iamVjdCosIFRlc3RUeXBlZGVmcyopOwor
VGVzdFR5cGVkZWZzKiB0b1Rlc3RUeXBlZGVmcyhKU0M6OkpTVmFsdWUpOworCitjbGFzcyBKU1Rl
c3RUeXBlZGVmc1Byb3RvdHlwZSA6IHB1YmxpYyBKU0M6OkpTTm9uRmluYWxPYmplY3QgeworcHVi
bGljOgorICAgIHR5cGVkZWYgSlNDOjpKU05vbkZpbmFsT2JqZWN0IEJhc2U7CisgICAgc3RhdGlj
IEpTQzo6SlNPYmplY3QqIHNlbGYoSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTR2xvYmFsT2JqZWN0
Kik7CisgICAgc3RhdGljIEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlKiBjcmVhdGUoSlNDOjpKU0ds
b2JhbERhdGEmIGdsb2JhbERhdGEsIEpTQzo6SlNHbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwg
SlNDOjpTdHJ1Y3R1cmUqIHN0cnVjdHVyZSkKKyAgICB7CisgICAgICAgIEpTVGVzdFR5cGVkZWZz
UHJvdG90eXBlKiBwdHIgPSBuZXcgKE5vdE51bGwsIEpTQzo6YWxsb2NhdGVDZWxsPEpTVGVzdFR5
cGVkZWZzUHJvdG90eXBlPihnbG9iYWxEYXRhLmhlYXApKSBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlw
ZShnbG9iYWxEYXRhLCBnbG9iYWxPYmplY3QsIHN0cnVjdHVyZSk7CisgICAgICAgIHB0ci0+Zmlu
aXNoQ3JlYXRpb24oZ2xvYmFsRGF0YSk7CisgICAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisg
ICAgc3RhdGljIGNvbnN0IEpTQzo6Q2xhc3NJbmZvIHNfaW5mbzsKKyAgICBzdGF0aWMgYm9vbCBn
ZXRPd25Qcm9wZXJ0eVNsb3QoSlNDOjpKU0NlbGwqLCBKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6UHJv
cGVydHlOYW1lLCBKU0M6OlByb3BlcnR5U2xvdCYpOworICAgIHN0YXRpYyBib29sIGdldE93blBy
b3BlcnR5RGVzY3JpcHRvcihKU0M6OkpTT2JqZWN0KiwgSlNDOjpFeGVjU3RhdGUqLCBKU0M6OlBy
b3BlcnR5TmFtZSwgSlNDOjpQcm9wZXJ0eURlc2NyaXB0b3ImKTsKKyAgICBzdGF0aWMgSlNDOjpT
dHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShKU0M6OkpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwg
SlNDOjpKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU0M6OkpTVmFsdWUgcHJvdG90eXBl
KQorICAgIHsKKyAgICAgICAgcmV0dXJuIEpTQzo6U3RydWN0dXJlOjpjcmVhdGUoZ2xvYmFsRGF0
YSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5cGUsIEpTQzo6VHlwZUluZm8oSlNDOjpPYmplY3RUeXBl
LCBTdHJ1Y3R1cmVGbGFncyksICZzX2luZm8pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBKU1Rl
c3RUeXBlZGVmc1Byb3RvdHlwZShKU0M6OkpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgSlNDOjpK
U0dsb2JhbE9iamVjdCosIEpTQzo6U3RydWN0dXJlKiBzdHJ1Y3R1cmUpIDogSlNDOjpKU05vbkZp
bmFsT2JqZWN0KGdsb2JhbERhdGEsIHN0cnVjdHVyZSkgeyB9Citwcm90ZWN0ZWQ6CisgICAgc3Rh
dGljIGNvbnN0IHVuc2lnbmVkIFN0cnVjdHVyZUZsYWdzID0gSlNDOjpPdmVycmlkZXNHZXRPd25Q
cm9wZXJ0eVNsb3QgfCBCYXNlOjpTdHJ1Y3R1cmVGbGFnczsKK307CisKK2NsYXNzIEpTVGVzdFR5
cGVkZWZzQ29uc3RydWN0b3IgOiBwdWJsaWMgRE9NQ29uc3RydWN0b3JPYmplY3QgeworcHJpdmF0
ZToKKyAgICBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yKEpTQzo6U3RydWN0dXJlKiwgSlNET01H
bG9iYWxPYmplY3QqKTsKKyAgICB2b2lkIGZpbmlzaENyZWF0aW9uKEpTQzo6RXhlY1N0YXRlKiwg
SlNET01HbG9iYWxPYmplY3QqKTsKKworcHVibGljOgorICAgIHR5cGVkZWYgRE9NQ29uc3RydWN0
b3JPYmplY3QgQmFzZTsKKyAgICBzdGF0aWMgSlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvciogY3Jl
YXRlKEpTQzo6RXhlY1N0YXRlKiBleGVjLCBKU0M6OlN0cnVjdHVyZSogc3RydWN0dXJlLCBKU0RP
TUdsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQorICAgIHsKKyAgICAgICAgSlNUZXN0VHlwZWRl
ZnNDb25zdHJ1Y3RvciogcHRyID0gbmV3IChOb3ROdWxsLCBKU0M6OmFsbG9jYXRlQ2VsbDxKU1Rl
c3RUeXBlZGVmc0NvbnN0cnVjdG9yPigqZXhlYy0+aGVhcCgpKSkgSlNUZXN0VHlwZWRlZnNDb25z
dHJ1Y3RvcihzdHJ1Y3R1cmUsIGdsb2JhbE9iamVjdCk7CisgICAgICAgIHB0ci0+ZmluaXNoQ3Jl
YXRpb24oZXhlYywgZ2xvYmFsT2JqZWN0KTsKKyAgICAgICAgcmV0dXJuIHB0cjsKKyAgICB9CisK
KyAgICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3QoSlNDOjpKU0NlbGwqLCBKU0M6OkV4
ZWNTdGF0ZSosIEpTQzo6UHJvcGVydHlOYW1lLCBKU0M6OlByb3BlcnR5U2xvdCYpOworICAgIHN0
YXRpYyBib29sIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihKU0M6OkpTT2JqZWN0KiwgSlNDOjpF
eGVjU3RhdGUqLCBKU0M6OlByb3BlcnR5TmFtZSwgSlNDOjpQcm9wZXJ0eURlc2NyaXB0b3ImKTsK
KyAgICBzdGF0aWMgY29uc3QgSlNDOjpDbGFzc0luZm8gc19pbmZvOworICAgIHN0YXRpYyBKU0M6
OlN0cnVjdHVyZSogY3JlYXRlU3RydWN0dXJlKEpTQzo6SlNHbG9iYWxEYXRhJiBnbG9iYWxEYXRh
LCBKU0M6OkpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTQzo6SlNWYWx1ZSBwcm90b3R5
cGUpCisgICAgeworICAgICAgICByZXR1cm4gSlNDOjpTdHJ1Y3R1cmU6OmNyZWF0ZShnbG9iYWxE
YXRhLCBnbG9iYWxPYmplY3QsIHByb3RvdHlwZSwgSlNDOjpUeXBlSW5mbyhKU0M6Ok9iamVjdFR5
cGUsIFN0cnVjdHVyZUZsYWdzKSwgJnNfaW5mbyk7CisgICAgfQorcHJvdGVjdGVkOgorICAgIHN0
YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEpTQzo6T3ZlcnJpZGVzR2V0T3du
UHJvcGVydHlTbG90IHwgSlNDOjpJbXBsZW1lbnRzSGFzSW5zdGFuY2UgfCBET01Db25zdHJ1Y3Rv
ck9iamVjdDo6U3RydWN0dXJlRmxhZ3M7CisgICAgc3RhdGljIEpTQzo6RW5jb2RlZEpTVmFsdWUg
SlNDX0hPU1RfQ0FMTCBjb25zdHJ1Y3RKU1Rlc3RUeXBlZGVmcyhKU0M6OkV4ZWNTdGF0ZSopOwor
ICAgIHN0YXRpYyBKU0M6OkNvbnN0cnVjdFR5cGUgZ2V0Q29uc3RydWN0RGF0YShKU0M6OkpTQ2Vs
bCosIEpTQzo6Q29uc3RydWN0RGF0YSYpOworfTsKKworLy8gRnVuY3Rpb25zCisKK0pTQzo6RW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9u
RnVuYyhKU0M6OkV4ZWNTdGF0ZSopOworSlNDOjpFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxM
IGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25NdWx0aVRyYW5zZmVyTGlzdChKU0M6OkV4
ZWNTdGF0ZSopOworSlNDOjpFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVk
ZWZzUHJvdG90eXBlRnVuY3Rpb25TZXRTaGFkb3coSlNDOjpFeGVjU3RhdGUqKTsKK0pTQzo6RW5j
b2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9u
TWV0aG9kV2l0aFNlcXVlbmNlQXJnKEpTQzo6RXhlY1N0YXRlKik7CitKU0M6OkVuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk51bGxhYmxl
QXJyYXlBcmcoSlNDOjpFeGVjU3RhdGUqKTsKK0pTQzo6RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1Rf
Q0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uRnVuY1dpdGhDbGFtcChKU0M6OkV4
ZWNTdGF0ZSopOworSlNDOjpFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVk
ZWZzUHJvdG90eXBlRnVuY3Rpb25JbW11dGFibGVQb2ludEZ1bmN0aW9uKEpTQzo6RXhlY1N0YXRl
Kik7CitKU0M6OkVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90
b3R5cGVGdW5jdGlvblN0cmluZ0FycmF5RnVuY3Rpb24oSlNDOjpFeGVjU3RhdGUqKTsKK0pTQzo6
RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0
aW9uTWV0aG9kV2l0aEV4Y2VwdGlvbihKU0M6OkV4ZWNTdGF0ZSopOworLy8gQXR0cmlidXRlcwor
CitKU0M6OkpTVmFsdWUganNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdMb25nQXR0cihKU0M6OkV4
ZWNTdGF0ZSosIEpTQzo6SlNWYWx1ZSwgSlNDOjpQcm9wZXJ0eU5hbWUpOwordm9pZCBzZXRKU1Rl
c3RUeXBlZGVmc1Vuc2lnbmVkTG9uZ0xvbmdBdHRyKEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpKU09i
amVjdCosIEpTQzo6SlNWYWx1ZSk7CitKU0M6OkpTVmFsdWUganNUZXN0VHlwZWRlZnNJbW11dGFi
bGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTVmFsdWUsIEpT
Qzo6UHJvcGVydHlOYW1lKTsKK3ZvaWQgc2V0SlNUZXN0VHlwZWRlZnNJbW11dGFibGVTZXJpYWxp
emVkU2NyaXB0VmFsdWUoSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTT2JqZWN0KiwgSlNDOjpKU1Zh
bHVlKTsKK0pTQzo6SlNWYWx1ZSBqc1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yVGVzdFN1Yk9iaihK
U0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNWYWx1ZSwgSlNDOjpQcm9wZXJ0eU5hbWUpOworSlNDOjpK
U1ZhbHVlIGpzVGVzdFR5cGVkZWZzQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oSlNDOjpFeGVjU3Rh
dGUqLCBKU0M6OkpTVmFsdWUsIEpTQzo6UHJvcGVydHlOYW1lKTsKK3ZvaWQgc2V0SlNUZXN0VHlw
ZWRlZnNBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNPYmpl
Y3QqLCBKU0M6OkpTVmFsdWUpOworSlNDOjpKU1ZhbHVlIGpzVGVzdFR5cGVkZWZzQXR0cldpdGhT
ZXR0ZXJFeGNlcHRpb24oSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTVmFsdWUsIEpTQzo6UHJvcGVy
dHlOYW1lKTsKK3ZvaWQgc2V0SlNUZXN0VHlwZWRlZnNBdHRyV2l0aFNldHRlckV4Y2VwdGlvbihK
U0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNPYmplY3QqLCBKU0M6OkpTVmFsdWUpOworSlNDOjpKU1Zh
bHVlIGpzVGVzdFR5cGVkZWZzU3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oSlNDOjpFeGVj
U3RhdGUqLCBKU0M6OkpTVmFsdWUsIEpTQzo6UHJvcGVydHlOYW1lKTsKK3ZvaWQgc2V0SlNUZXN0
VHlwZWRlZnNTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihKU0M6OkV4ZWNTdGF0ZSosIEpT
Qzo6SlNPYmplY3QqLCBKU0M6OkpTVmFsdWUpOworSlNDOjpKU1ZhbHVlIGpzVGVzdFR5cGVkZWZz
U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTVmFs
dWUsIEpTQzo6UHJvcGVydHlOYW1lKTsKK3ZvaWQgc2V0SlNUZXN0VHlwZWRlZnNTdHJpbmdBdHRy
V2l0aFNldHRlckV4Y2VwdGlvbihKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNPYmplY3QqLCBKU0M6
OkpTVmFsdWUpOworSlNDOjpKU1ZhbHVlIGpzVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IoSlNDOjpF
eGVjU3RhdGUqLCBKU0M6OkpTVmFsdWUsIEpTQzo6UHJvcGVydHlOYW1lKTsKKworfSAvLyBuYW1l
c3BhY2UgV2ViQ29yZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBlZGVmcy5oIGIvU291cmNlL1dlYkNvcmUv
YmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLmgKbmV3IGZpbGUgbW9k
ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4u
NGZmZDdmMzAwMDljYzgyMWVmMDJjMTZkY2MzNWJlMjAwMDFjMWE5YwotLS0gL2Rldi9udWxsCisr
KyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBl
ZGVmcy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIDIwMDUs
IDIwMDYsIDIwMDcsIDIwMDgsIDIwMDkgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgor
ICogQ29weXJpZ2h0IChDKSAyMDA2IFNhbXVlbCBXZWluaWcgPHNhbS53ZWluaWdAZ21haWwuY29t
PgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9y
bXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3Zp
ZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVk
aXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmln
aHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dp
bmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0
IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBk
b2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlz
dHJpYnV0aW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09N
UFVURVIsIElOQy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJS
QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdB
UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIK
KyAqIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01Q
VVRFUiwgSU5DLiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg
SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVF
TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJF
TUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg
T1IKKyAqIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg
QU5EIE9OIEFOWSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwg
U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9U
SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNP
RlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF
LiAKKyAqLworCisjaW1wb3J0IDxXZWJDb3JlL0RPTU9iamVjdC5oPgorCisjaWYgV0VCS0lUX1ZF
UlNJT05fTUFYX0FMTE9XRUQgPj0gV0VCS0lUX1ZFUlNJT05fTEFURVNUCisKK0BjbGFzcyBET01B
cnJheTsKK0BjbGFzcyBET01TVkdQb2ludDsKK0BjbGFzcyBOU1N0cmluZzsKKworQGludGVyZmFj
ZSBET01UZXN0VHlwZWRlZnMgOiBET01PYmplY3QKK0Bwcm9wZXJ0eSB1bnNpZ25lZCBsb25nIGxv
bmcgdW5zaWduZWRMb25nTG9uZ0F0dHI7CitAcHJvcGVydHkocmV0YWluKSBOU1N0cmluZyAqaW1t
dXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlOworQHByb3BlcnR5IGludCBhdHRyV2l0aEdldHRl
ckV4Y2VwdGlvbjsKK0Bwcm9wZXJ0eSBpbnQgYXR0cldpdGhTZXR0ZXJFeGNlcHRpb247CitAcHJv
cGVydHkoY29weSkgTlNTdHJpbmcgKnN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uOworQHBy
b3BlcnR5KGNvcHkpIE5TU3RyaW5nICpzdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbjsKKwor
LSAodm9pZCltdWx0aVRyYW5zZmVyTGlzdDooTlNTdHJpbmcgKilmaXJzdCB0eDooRE9NQXJyYXkg
Kil0eCBzZWNvbmQ6KE5TU3RyaW5nICopc2Vjb25kIHR4eDooRE9NQXJyYXkgKil0eHg7CistICh2
b2lkKXNldFNoYWRvdzooZmxvYXQpd2lkdGggaGVpZ2h0OihmbG9hdCloZWlnaHQgYmx1cjooZmxv
YXQpYmx1ciBjb2xvcjooTlNTdHJpbmcgKiljb2xvciBhbHBoYTooZmxvYXQpYWxwaGE7CistIChE
T01TVkdQb2ludCAqKWltbXV0YWJsZVBvaW50RnVuY3Rpb247CistICh2b2lkKW1ldGhvZFdpdGhF
eGNlcHRpb247CitAZW5kCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLm1tIGIvU291cmNlL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLm1tCm5ldyBmaWxl
IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAuLmViMDJhMDIyYjJkMzc5NDYzZjZlZTljMzkwM2E1MzY3NGUxNDRhNTEKLS0tIC9kZXYvbnVs
bAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvT2JqQy9ET01UZXN0
VHlwZWRlZnMubW0KQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMgcGFydCBv
ZiB0aGUgV2ViS2l0IG9wZW4gc291cmNlIHByb2plY3QuCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4g
Z2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWJpbmRpbmdzLnBsLiBETyBOT1QgTU9ESUZZIQorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRp
b25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAg
IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh
aW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVj
ZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp
b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0
aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9u
LgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgQVBQTEUgQ09NUFVURVIsIElO
Qy4gYGBBUyBJUycnIEFORCBBTlkKKyAqIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJ
TkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMg
T0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKKyAqIFBVUlBP
U0UgQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBBUFBMRSBDT01QVVRFUiwgSU5D
LiBPUgorICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1Qs
IElOQ0lERU5UQUwsIFNQRUNJQUwsCisgKiBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFN
QUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCisgKiBQUk9DVVJFTUVOVCBPRiBT
VUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAqIFBS
T0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFO
WSBUSEVPUlkKKyAqIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJ
QUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkg
QVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBF
VkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKyAqLwor
CisjaW1wb3J0ICJjb25maWcuaCIKKyNpbXBvcnQgIkRPTUludGVybmFsLmgiCisKKyNpbXBvcnQg
IkRPTVRlc3RUeXBlZGVmcy5oIgorCisjaW1wb3J0ICJBcnJheS5oIgorI2ltcG9ydCAiRE9NQXJy
YXlJbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9NQmxvYkludGVybmFsLmgiCisjaW1wb3J0ICJET01D
U1NSdWxlSW50ZXJuYWwuaCIKKyNpbXBvcnQgIkRPTUNTU1ZhbHVlSW50ZXJuYWwuaCIKKyNpbXBv
cnQgIkRPTUV2ZW50SW50ZXJuYWwuaCIKKyNpbXBvcnQgIkRPTU5vZGVJbnRlcm5hbC5oIgorI2lt
cG9ydCAiRE9NU1ZHUG9pbnRJbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9NU3R5bGVTaGVldEludGVy
bmFsLmgiCisjaW1wb3J0ICJET01UZXN0VHlwZWRlZnNJbnRlcm5hbC5oIgorI2ltcG9ydCAiRXhj
ZXB0aW9uSGFuZGxlcnMuaCIKKyNpbXBvcnQgIkpTTWFpblRocmVhZEV4ZWNTdGF0ZS5oIgorI2lt
cG9ydCAiS1VSTC5oIgorI2ltcG9ydCAiU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCisjaW1wb3J0
ICJUZXN0VHlwZWRlZnMuaCIKKyNpbXBvcnQgIlRocmVhZENoZWNrLmgiCisjaW1wb3J0ICJXZWJD
b3JlT2JqQ0V4dHJhcy5oIgorI2ltcG9ydCAiV2ViU2NyaXB0T2JqZWN0UHJpdmF0ZS5oIgorI2lt
cG9ydCA8d3RmL0dldFB0ci5oPgorCisjZGVmaW5lIElNUEwgcmVpbnRlcnByZXRfY2FzdDxXZWJD
b3JlOjpUZXN0VHlwZWRlZnMqPihfaW50ZXJuYWwpCisKK0BpbXBsZW1lbnRhdGlvbiBET01UZXN0
VHlwZWRlZnMKKworLSAodm9pZClkZWFsbG9jCit7CisgICAgaWYgKFdlYkNvcmVPYmpDU2NoZWR1
bGVEZWFsbG9jYXRlT25NYWluVGhyZWFkKFtET01UZXN0VHlwZWRlZnMgY2xhc3NdLCBzZWxmKSkK
KyAgICAgICAgcmV0dXJuOworCisgICAgaWYgKF9pbnRlcm5hbCkKKyAgICAgICAgSU1QTC0+ZGVy
ZWYoKTsKKyAgICBbc3VwZXIgZGVhbGxvY107Cit9CisKKy0gKHZvaWQpZmluYWxpemUKK3sKKyAg
ICBpZiAoX2ludGVybmFsKQorICAgICAgICBJTVBMLT5kZXJlZigpOworICAgIFtzdXBlciBmaW5h
bGl6ZV07Cit9CisKKy0gKHVuc2lnbmVkIGxvbmcgbG9uZyl1bnNpZ25lZExvbmdMb25nQXR0cgor
eworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICByZXR1cm4g
SU1QTC0+dW5zaWduZWRMb25nTG9uZ0F0dHIoKTsKK30KKworLSAodm9pZClzZXRVbnNpZ25lZExv
bmdMb25nQXR0cjoodW5zaWduZWQgbG9uZyBsb25nKW5ld1Vuc2lnbmVkTG9uZ0xvbmdBdHRyCit7
CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIElNUEwtPnNl
dFVuc2lnbmVkTG9uZ0xvbmdBdHRyKG5ld1Vuc2lnbmVkTG9uZ0xvbmdBdHRyKTsKK30KKworLSAo
TlNTdHJpbmcgKilpbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUKK3sKKyAgICBXZWJDb3Jl
OjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgcmV0dXJuIElNUEwtPmltbXV0YWJs
ZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpLT50b1N0cmluZygpOworfQorCistICh2b2lkKXNldElt
bXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTooTlNTdHJpbmcgKiluZXdJbW11dGFibGVTZXJp
YWxpemVkU2NyaXB0VmFsdWUKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUg
c3RhdGU7CisgICAgQVNTRVJUKG5ld0ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSk7CisK
KyAgICBJTVBMLT5zZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoV2ViQ29yZTo6U2Vy
aWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoV1RGOjpTdHJpbmcobmV3SW1tdXRhYmxlU2VyaWFs
aXplZFNjcmlwdFZhbHVlKSkpOworfQorCistIChpbnQpYXR0cldpdGhHZXR0ZXJFeGNlcHRpb24K
K3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgV2ViQ29y
ZTo6RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgaW50IHJlc3VsdCA9IElNUEwtPmF0dHJXaXRo
R2V0dGVyRXhjZXB0aW9uKGVjKTsKKyAgICBXZWJDb3JlOjpyYWlzZU9uRE9NRXJyb3IoZWMpOwor
ICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy0gKHZvaWQpc2V0QXR0cldpdGhHZXR0ZXJFeGNlcHRp
b246KGludCluZXdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbgoreworICAgIFdlYkNvcmU6OkpTTWFp
blRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBJTVBMLT5zZXRBdHRyV2l0aEdldHRlckV4Y2Vw
dGlvbihuZXdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbik7Cit9CisKKy0gKGludClhdHRyV2l0aFNl
dHRlckV4Y2VwdGlvbgoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0
ZTsKKyAgICByZXR1cm4gSU1QTC0+YXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oKTsKK30KKworLSAo
dm9pZClzZXRBdHRyV2l0aFNldHRlckV4Y2VwdGlvbjooaW50KW5ld0F0dHJXaXRoU2V0dGVyRXhj
ZXB0aW9uCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAg
IFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIElNUEwtPnNldEF0dHJXaXRoU2V0
dGVyRXhjZXB0aW9uKG5ld0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uLCBlYyk7CisgICAgV2ViQ29y
ZTo6cmFpc2VPbkRPTUVycm9yKGVjKTsKK30KKworLSAoTlNTdHJpbmcgKilzdHJpbmdBdHRyV2l0
aEdldHRlckV4Y2VwdGlvbgoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBz
dGF0ZTsKKyAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBOU1N0cmluZyAq
cmVzdWx0ID0gSU1QTC0+c3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oZWMpOworICAgIFdl
YkNvcmU6OnJhaXNlT25ET01FcnJvcihlYyk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLSAo
dm9pZClzZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbjooTlNTdHJpbmcgKiluZXdTdHJp
bmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbgoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51
bGxTdGF0ZSBzdGF0ZTsKKyAgICBJTVBMLT5zZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlv
bihuZXdTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbik7Cit9CisKKy0gKE5TU3RyaW5nICop
c3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24KK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJl
YWROdWxsU3RhdGUgc3RhdGU7CisgICAgcmV0dXJuIElNUEwtPnN0cmluZ0F0dHJXaXRoU2V0dGVy
RXhjZXB0aW9uKCk7Cit9CisKKy0gKHZvaWQpc2V0U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRp
b246KE5TU3RyaW5nICopbmV3U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24KK3sKKyAgICBX
ZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgV2ViQ29yZTo6RXhjZXB0
aW9uQ29kZSBlYyA9IDA7CisgICAgSU1QTC0+c2V0U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRp
b24obmV3U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24sIGVjKTsKKyAgICBXZWJDb3JlOjpy
YWlzZU9uRE9NRXJyb3IoZWMpOworfQorCistICh2b2lkKW11bHRpVHJhbnNmZXJMaXN0OihOU1N0
cmluZyAqKWZpcnN0IHR4OihET01BcnJheSAqKXR4IHNlY29uZDooTlNTdHJpbmcgKilzZWNvbmQg
dHh4OihET01BcnJheSAqKXR4eAoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0
ZSBzdGF0ZTsKKyAgICBJTVBMLT5tdWx0aVRyYW5zZmVyTGlzdChXZWJDb3JlOjpTZXJpYWxpemVk
U2NyaXB0VmFsdWU6OmNyZWF0ZShXVEY6OlN0cmluZyhmaXJzdCkpLCBjb3JlKHR4KSwgV2ViQ29y
ZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoV1RGOjpTdHJpbmcoc2Vjb25kKSksIGNv
cmUodHh4KSk7Cit9CisKKy0gKHZvaWQpc2V0U2hhZG93OihmbG9hdCl3aWR0aCBoZWlnaHQ6KGZs
b2F0KWhlaWdodCBibHVyOihmbG9hdClibHVyIGNvbG9yOihOU1N0cmluZyAqKWNvbG9yIGFscGhh
OihmbG9hdClhbHBoYQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0
ZTsKKyAgICBJTVBMLT5zZXRTaGFkb3cod2lkdGgsIGhlaWdodCwgYmx1ciwgY29sb3IsIGFscGhh
KTsKK30KKworLSAoRE9NU1ZHUG9pbnQgKilpbW11dGFibGVQb2ludEZ1bmN0aW9uCit7CisgICAg
V2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIHJldHVybiBraXQoV1RG
OjpnZXRQdHIoV2ViQ29yZTo6U1ZHUHJvcGVydHlUZWFyT2ZmPFdlYkNvcmU6OkZsb2F0UG9pbnQ+
OjpjcmVhdGUoSU1QTC0+aW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpKSkpOworfQorCistICh2b2lk
KW1ldGhvZFdpdGhFeGNlcHRpb24KK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3Rh
dGUgc3RhdGU7CisgICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgSU1QTC0+
bWV0aG9kV2l0aEV4Y2VwdGlvbihlYyk7CisgICAgV2ViQ29yZTo6cmFpc2VPbkRPTUVycm9yKGVj
KTsKK30KKworQGVuZAorCitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGNvcmUoRE9NVGVzdFR5cGVk
ZWZzICp3cmFwcGVyKQoreworICAgIHJldHVybiB3cmFwcGVyID8gcmVpbnRlcnByZXRfY2FzdDxX
ZWJDb3JlOjpUZXN0VHlwZWRlZnMqPih3cmFwcGVyLT5faW50ZXJuYWwpIDogMDsKK30KKworRE9N
VGVzdFR5cGVkZWZzICpraXQoV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiB2YWx1ZSkKK3sKKyAgICB7
IERPTV9BU1NFUlRfTUFJTl9USFJFQUQoKTsgV2ViQ29yZVRocmVhZFZpb2xhdGlvbkNoZWNrUm91
bmRPbmUoKTsgfTsKKyAgICBpZiAoIXZhbHVlKQorICAgICAgICByZXR1cm4gbmlsOworICAgIGlm
IChET01UZXN0VHlwZWRlZnMgKndyYXBwZXIgPSBnZXRET01XcmFwcGVyKHZhbHVlKSkKKyAgICAg
ICAgcmV0dXJuIFtbd3JhcHBlciByZXRhaW5dIGF1dG9yZWxlYXNlXTsKKyAgICBET01UZXN0VHlw
ZWRlZnMgKndyYXBwZXIgPSBbW0RPTVRlc3RUeXBlZGVmcyBhbGxvY10gX2luaXRdOworICAgIHdy
YXBwZXItPl9pbnRlcm5hbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8RE9NT2JqZWN0SW50ZXJuYWwqPih2
YWx1ZSk7CisgICAgdmFsdWUtPnJlZigpOworICAgIGFkZERPTVdyYXBwZXIod3JhcHBlciwgdmFs
dWUpOworICAgIHJldHVybiBbd3JhcHBlciBhdXRvcmVsZWFzZV07Cit9CmRpZmYgLS1naXQgYS9T
b3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvT2JqQy9ET01UZXN0VHlwZWRlZnNJ
bnRlcm5hbC5oIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9N
VGVzdFR5cGVkZWZzSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lZGE4YmMzNzdlM2UwNzQ0ZjUxNDYy
MmM1NjUyMWY4NGZmZWRkOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzSW50ZXJuYWwuaApAQCAtMCww
ICsxLDM4IEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNv
dXJjZSBwcm9qZWN0LgorICogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBnZW5lcmF0
ZS1iaW5kaW5ncy5wbC4gRE8gTk9UIE1PRElGWSEKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2ltcG9ydCA8V2ViQ29yZS9E
T01UZXN0VHlwZWRlZnMuaD4KKworI2lmIFdFQktJVF9WRVJTSU9OX01BWF9BTExPV0VEID49IFdF
QktJVF9WRVJTSU9OX0xBVEVTVAorCituYW1lc3BhY2UgV2ViQ29yZSB7CisgICAgY2xhc3MgVGVz
dFR5cGVkZWZzOworfQorCitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGNvcmUoRE9NVGVzdFR5cGVk
ZWZzICopOworRE9NVGVzdFR5cGVkZWZzICpraXQoV2ViQ29yZTo6VGVzdFR5cGVkZWZzKik7CisK
KyNlbmRpZgpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0
L1Rlc3RUeXBlZGVmcy5pZGwgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3Qv
VGVzdFR5cGVkZWZzLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi41OGJlNGYzOTVlM2ZmNWU0MDdkYmE3N2I5OTJh
MDdlMGE0ZWIwNGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L1Rlc3RUeXBlZGVmcy5pZGwKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAq
IFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGgg
b3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQg
dGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlz
dHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0
CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRp
c2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCBy
ZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29u
ZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRh
dGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmli
dXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUg
bmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBw
cm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNw
ZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElT
IFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAi
QVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywg
QlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFO
VEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElT
Q0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09O
VFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUws
CisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVE
SU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdP
T0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV
U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZ
IE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1Ig
VE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBB
TlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklT
RUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vIFRoaXMgSURM
IGZpbGUgaXMgZm9yIHRlc3RpbmcgdGhlIGJpbmRpbmdzIGNvZGUgZ2VuZXJhdG9yIGFuZCBmb3Ig
dHJhY2tpbmcKKy8vIGNoYW5nZXMgaW4gaXRzIG91cHV0LgorCitbCisgICAgQ29uc3RydWN0b3Io
aW4gU1RSSU5HIGhlbGxvLCBpbiBURVNUX0NBTExCQUNLIHRlc3RDYWxsYmFjayksCitdIGludGVy
ZmFjZSBUZXN0VHlwZWRlZnMgeworICAgIGF0dHJpYnV0ZSBVTE9OR0xPTkcgdW5zaWduZWRMb25n
TG9uZ0F0dHI7CisKKyAgICBbSW1tdXRhYmxlXSBhdHRyaWJ1dGUgU0NSSVBUX1ZBTFVFIGltbXV0
YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTsKKyAgICAKKyAgICBzdGF0aWMgcmVhZG9ubHkgYXR0
cmlidXRlIFQgVGVzdFN1Yk9iajsKKworICAgIFtTdHJpY3RUeXBlQ2hlY2tpbmddIHZvaWQgZnVu
YyhpbiBbT3B0aW9uYWxdIEFSUkFZX09GX0xPTkdTIHgpOworCisgICAgdm9pZCBtdWx0aVRyYW5z
ZmVyTGlzdChpbiBbVHJhbnNmZXJMaXN0PXR4XSBTQ1JJUFRfVkFMVUUgZmlyc3QsIGluIFtPcHRp
b25hbF0gQVJSQVkgdHgsIGluIFtPcHRpb25hbF0gVFJBTlNGRVJfVFhYX1NDUklQVF9WQUxVRSBz
ZWNvbmQsIGluIFtPcHRpb25hbF0gQVJSQVkgdHh4KTsKKworICAgIHZvaWQgc2V0U2hhZG93KGlu
IERPVUJMRSB3aWR0aCwgaW4gRE9VQkxFIGhlaWdodCwgaW4gZmxvYXQgYmx1ciwgaW4gW1N0cmlj
dFR5cGVDaGVja2luZ10gT1BUSU9OQUxfU1RSSU5HIGNvbG9yLCBpbiBbT3B0aW9uYWxdIERPVUJM
RSBhbHBoYSk7CisKKyAgICBVTE9OR0xPTkcgbWV0aG9kV2l0aFNlcXVlbmNlQXJnKGluIHNlcXVl
bmNlPFNDUklQVF9WQUxVRT4gc2VxdWVuY2VBcmcpOworCisgICAgdm9pZCBudWxsYWJsZUFycmF5
QXJnKGluIEFSUkFZX09GX1NUUklOR1M/IGFycmF5QXJnKTsKKworICAgIHZvaWQgZnVuY1dpdGhD
bGFtcChpbiBVTE9OR0xPTkdfQ0xBTVAgYXJnMSwgaW4gW09wdGlvbmFsXSBVTE9OR0xPTkdfQ0xB
TVAgYXJnMik7CisKKyAgICBbSW1tdXRhYmxlXSBTVkdQT0lOVCBpbW11dGFibGVQb2ludEZ1bmN0
aW9uKCk7CisKKyAgICBBUlJBWV9PRl9TVFJJTkdTIHN0cmluZ0FycmF5RnVuY3Rpb24oaW4gQVJS
QVlfT0ZfU1RSSU5HUyB2YWx1ZXMpIHJhaXNlcyhFKTsKKworICAgIC8vIEV4Y2VwdGlvbnMKKyAg
ICB2b2lkIG1ldGhvZFdpdGhFeGNlcHRpb24oKSByYWlzZXMoRSk7CisgICAgYXR0cmlidXRlIGxv
bmcgYXR0cldpdGhHZXR0ZXJFeGNlcHRpb24gZ2V0dGVyIHJhaXNlcyhFKTsKKyAgICBhdHRyaWJ1
dGUgbG9uZyBhdHRyV2l0aFNldHRlckV4Y2VwdGlvbiBzZXR0ZXIgcmFpc2VzKEUpOworICAgIGF0
dHJpYnV0ZSBET01TdHJpbmcgc3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24gZ2V0dGVyIHJh
aXNlcyhFKTsKKyAgICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHN0cmluZ0F0dHJXaXRoU2V0dGVyRXhj
ZXB0aW9uIHNldHRlciByYWlzZXMoRSk7Cit9OworCit0eXBlZGVmIGZsb2F0ICAgICAgICAgICAg
ICAgICAgICAgIERPVUJMRTsKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICAgICAgICAgVUxP
TkdMT05HOwordHlwZWRlZiBbQ2xhbXBdIHVuc2lnbmVkIGxvbmcgbG9uZyBVTE9OR0xPTkdfQ0xB
TVA7Cit0eXBlZGVmIFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSAgICAgIFNDUklQVF9WQUxVRTsKK3R5
cGVkZWYgbG9uZ1tdICAgICAgICAgICAgICAgICAgICAgQVJSQVlfT0ZfTE9OR1M7Cit0eXBlZGVm
IFNWR1BvaW50ICAgICAgICAgICAgICAgICAgIFNWR1BPSU5UOwordHlwZWRlZiBET01TdHJpbmcg
ICAgICAgICAgICAgICAgICBTVFJJTkc7Cit0eXBlZGVmIFtPcHRpb25hbF0gRE9NU3RyaW5nICAg
ICAgIE9QVElPTkFMX1NUUklORzsKK3R5cGVkZWYgRE9NU3RyaW5nW10gICAgICAgICAgICAgICAg
QVJSQVlfT0ZfU1RSSU5HUzsKK3R5cGVkZWYgW0NhbGxiYWNrXSBUZXN0Q2FsbGJhY2sgICAgVEVT
VF9DQUxMQkFDSzsKK3R5cGVkZWYgVGVzdFN1Yk9iakNvbnN0cnVjdG9yICAgICAgVDsKK3R5cGVk
ZWYgQXJyYXkgICAgICAgICAgICAgICAgICAgICAgQVJSQVk7Cit0eXBlZGVmIERPTUV4Y2VwdGlv
biAgICAgICAgICAgICAgIEU7Cit0eXBlZGVmIFtUcmFuc2Zlckxpc3Q9dHh4XSBTZXJpYWxpemVk
U2NyaXB0VmFsdWUgVFJBTlNGRVJfVFhYX1NDUklQVF9WQUxVRTsKZGlmZiAtLWdpdCBhL1NvdXJj
ZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RUeXBlZGVmcy5jcHAgYi9T
b3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgvVjhUZXN0VHlwZWRlZnMuY3Bw
Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAuLjE0Y2UxNjNkN2EzYTNiZTY1MjZlODNlMjRkNTk3YTk3OGFjYWMxYzEKLS0t
IC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgv
VjhUZXN0VHlwZWRlZnMuY3BwCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICAgIFRoaXMgZmlsZSBp
cyBwYXJ0IG9mIHRoZSBXZWJLaXQgb3BlbiBzb3VyY2UgcHJvamVjdC4KKyAgICBUaGlzIGZpbGUg
aGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWJpbmRpbmdzLnBsLiBETyBOT1QgTU9ESUZZ
IQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmli
dXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBM
aWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZy
ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNl
bnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBs
aWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWws
CisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQg
d2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNV
TEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEg
Y29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25n
IHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5MSUIuICBJZiBub3QsIHdy
aXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxl
IFBsYWNlIC0gU3VpdGUgMzMwLAorICAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKi8K
KworI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgIlY4VGVzdFR5cGVkZWZzLmgiCisKKyNp
bmNsdWRlICJCaW5kaW5nU3RhdGUuaCIKKyNpbmNsdWRlICJDb250ZXh0RmVhdHVyZXMuaCIKKyNp
bmNsdWRlICJET01TdHJpbmdMaXN0LmgiCisjaW5jbHVkZSAiRXhjZXB0aW9uQ29kZS5oIgorI2lu
Y2x1ZGUgIkZyYW1lLmgiCisjaW5jbHVkZSAiTWVzc2FnZVBvcnQuaCIKKyNpbmNsdWRlICJSdW50
aW1lRW5hYmxlZEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiU1ZHUHJvcGVydHlUZWFyT2ZmLmgiCisj
aW5jbHVkZSAiU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCisjaW5jbHVkZSAiVjhCaW5kaW5nLmgi
CisjaW5jbHVkZSAiVjhET01TdHJpbmdMaXN0LmgiCisjaW5jbHVkZSAiVjhET01XcmFwcGVyLmgi
CisjaW5jbHVkZSAiVjhTVkdQb2ludC5oIgorI2luY2x1ZGUgIlY4U2VyaWFsaXplZFNjcmlwdFZh
bHVlLmgiCisjaW5jbHVkZSAiVjhUZXN0Q2FsbGJhY2suaCIKKyNpbmNsdWRlICJWOFRlc3RTdWJP
YmouaCIKKyNpbmNsdWRlIDx3dGYvQXJyYXlCdWZmZXIuaD4KKyNpbmNsdWRlIDx3dGYvVW51c2Vk
UGFyYW0uaD4KKworI2lmIEVOQUJMRShCSU5ESU5HX0lOVEVHUklUWSkKKyNpZiBkZWZpbmVkKE9T
X1dJTikKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlOiA0NDgzKQorZXh0ZXJuICJDIiB7IGV4dGVy
biB2b2lkICgqY29uc3QgX19pZGVudGlmaWVyKCI/P183VGVzdFR5cGVkZWZzQFdlYkNvcmVAQDZC
QCIpW10pKCk7IH0KKyNlbHNlCitleHRlcm4gIkMiIHsgZXh0ZXJuIHZvaWQqIF9aVFZON1dlYkNv
cmUxMlRlc3RUeXBlZGVmc0VbXTsgfQorI2VuZGlmCisjZW5kaWYgLy8gRU5BQkxFKEJJTkRJTkdf
SU5URUdSSVRZKQorCituYW1lc3BhY2UgV2ViQ29yZSB7CisKKyNpZiBFTkFCTEUoQklORElOR19J
TlRFR1JJVFkpCitpbmxpbmUgdm9pZCBjaGVja1R5cGVPckRpZVRyeWluZyhUZXN0VHlwZWRlZnMq
IG9iamVjdCkKK3sKKyAgICB2b2lkKiBhY3R1YWxWVGFibGVQb2ludGVyID0gKihyZWludGVycHJl
dF9jYXN0PHZvaWQqKj4ob2JqZWN0KSk7CisjaWYgZGVmaW5lZChPU19XSU4pCisgICAgdm9pZCog
ZXhwZWN0ZWRWVGFibGVQb2ludGVyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oX19pZGVudGlm
aWVyKCI/P183VGVzdFR5cGVkZWZzQFdlYkNvcmVAQDZCQCIpKTsKKyNlbHNlCisgICAgdm9pZCog
ZXhwZWN0ZWRWVGFibGVQb2ludGVyID0gJl9aVFZON1dlYkNvcmUxMlRlc3RUeXBlZGVmc0VbMl07
CisjZW5kaWYKKyAgICBpZiAoYWN0dWFsVlRhYmxlUG9pbnRlciAhPSBleHBlY3RlZFZUYWJsZVBv
aW50ZXIpCisgICAgICAgIENSQVNIKCk7Cit9CisjZW5kaWYgLy8gRU5BQkxFKEJJTkRJTkdfSU5U
RUdSSVRZKQorCitXcmFwcGVyVHlwZUluZm8gVjhUZXN0VHlwZWRlZnM6OmluZm8gPSB7IFY4VGVz
dFR5cGVkZWZzOjpHZXRUZW1wbGF0ZSwgVjhUZXN0VHlwZWRlZnM6OmRlcmVmT2JqZWN0LCAwLCAw
LCAwLCBWOFRlc3RUeXBlZGVmczo6aW5zdGFsbFBlckNvbnRleHRQcm90b3R5cGVQcm9wZXJ0aWVz
LCAwLCBXcmFwcGVyVHlwZU9iamVjdFByb3RvdHlwZSB9OworCituYW1lc3BhY2UgVGVzdFR5cGVk
ZWZzVjhJbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIFY4X1VTRShUKSB7
IH0KKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB1bnNpZ25lZExvbmdMb25nQXR0ckF0
dHJHZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IG5hbWUsIGNvbnN0IHY4OjpBY2Nlc3Nvcklu
Zm8mIGluZm8pCit7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6dG9O
YXRpdmUoaW5mby5Ib2xkZXIoKSk7CisgICAgcmV0dXJuIHY4OjpOdW1iZXI6Ok5ldyhzdGF0aWNf
Y2FzdDxkb3VibGU+KGltcC0+dW5zaWduZWRMb25nTG9uZ0F0dHIoKSkpOworfQorCitzdGF0aWMg
dm9pZCB1bnNpZ25lZExvbmdMb25nQXR0ckF0dHJTZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+
IG5hbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZv
JiBpbmZvKQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0
aXZlKGluZm8uSG9sZGVyKCkpOworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB2ID0gdG9JbnQ2NCh2
YWx1ZSk7CisgICAgaW1wLT5zZXRVbnNpZ25lZExvbmdMb25nQXR0cih2KTsKKyAgICByZXR1cm47
Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaW1tdXRhYmxlU2VyaWFsaXplZFNj
cmlwdFZhbHVlQXR0ckdldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgY29uc3Qgdjg6
OkFjY2Vzc29ySW5mbyYgaW5mbykKK3sKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5
cGVkZWZzOjp0b05hdGl2ZShpbmZvLkhvbGRlcigpKTsKKyAgICByZXR1cm4gaW1wLT5pbW11dGFi
bGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSA/IGltcC0+aW1tdXRhYmxlU2VyaWFsaXplZFNjcmlw
dFZhbHVlKCktPmRlc2VyaWFsaXplKCkgOiB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4odjhOdWxsKGlu
Zm8uR2V0SXNvbGF0ZSgpKSk7Cit9CisKK3N0YXRpYyB2b2lkIGltbXV0YWJsZVNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZUF0dHJTZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IG5hbWUsIHY4OjpMb2Nh
bDx2ODo6VmFsdWU+IHZhbHVlLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQoreworICAg
IFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGluZm8uSG9sZGVy
KCkpOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IHYgPSBTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZSh2YWx1ZSwgaW5mby5HZXRJc29sYXRlKCkpOworICAgIGltcC0+c2V0
SW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKFdURjo6Z2V0UHRyKHYpKTsKKyAgICByZXR1
cm47Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXR0cldpdGhHZXR0ZXJFeGNl
cHRpb25BdHRyR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNj
ZXNzb3JJbmZvJiBpbmZvKQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRl
ZnM6OnRvTmF0aXZlKGluZm8uSG9sZGVyKCkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwor
ICAgIGludCB2ID0gaW1wLT5hdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYyk7CisgICAgaWYgKFVO
TElLRUxZKGVjKSkKKyAgICAgICAgcmV0dXJuIHNldERPTUV4Y2VwdGlvbihlYywgaW5mby5HZXRJ
c29sYXRlKCkpOworICAgIHJldHVybiB2OEludGVnZXIodiwgaW5mby5HZXRJc29sYXRlKCkpOwor
fQorCitzdGF0aWMgdm9pZCBhdHRyV2l0aEdldHRlckV4Y2VwdGlvbkF0dHJTZXR0ZXIodjg6Okxv
Y2FsPHY4OjpTdHJpbmc+IG5hbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBjb25zdCB2
ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0
VHlwZWRlZnM6OnRvTmF0aXZlKGluZm8uSG9sZGVyKCkpOworICAgIGludCB2ID0gdG9JbnQzMih2
YWx1ZSk7CisgICAgaW1wLT5zZXRBdHRyV2l0aEdldHRlckV4Y2VwdGlvbih2KTsKKyAgICByZXR1
cm47Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gYXR0cldpdGhTZXR0ZXJFeGNl
cHRpb25BdHRyR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNj
ZXNzb3JJbmZvJiBpbmZvKQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRl
ZnM6OnRvTmF0aXZlKGluZm8uSG9sZGVyKCkpOworICAgIHJldHVybiB2OEludGVnZXIoaW1wLT5h
dHRyV2l0aFNldHRlckV4Y2VwdGlvbigpLCBpbmZvLkdldElzb2xhdGUoKSk7Cit9CisKK3N0YXRp
YyB2b2lkIGF0dHJXaXRoU2V0dGVyRXhjZXB0aW9uQXR0clNldHRlcih2ODo6TG9jYWw8djg6OlN0
cmluZz4gbmFtZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUsIGNvbnN0IHY4OjpBY2Nlc3Nv
ckluZm8mIGluZm8pCit7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6
dG9OYXRpdmUoaW5mby5Ib2xkZXIoKSk7CisgICAgaW50IHYgPSB0b0ludDMyKHZhbHVlKTsKKyAg
ICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBpbXAtPnNldEF0dHJXaXRoU2V0dGVyRXhjZXB0
aW9uKHYsIGVjKTsKKyAgICBpZiAoVU5MSUtFTFkoZWMpKQorICAgICAgICBzZXRET01FeGNlcHRp
b24oZWMsIGluZm8uR2V0SXNvbGF0ZSgpKTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2ODo6
SGFuZGxlPHY4OjpWYWx1ZT4gc3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb25BdHRyR2V0dGVy
KHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZv
KQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGlu
Zm8uSG9sZGVyKCkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIFN0cmluZyB2ID0g
aW1wLT5zdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYyk7CisgICAgaWYgKFVOTElLRUxZ
KGVjKSkKKyAgICAgICAgcmV0dXJuIHNldERPTUV4Y2VwdGlvbihlYywgaW5mby5HZXRJc29sYXRl
KCkpOworICAgIHJldHVybiB2OFN0cmluZyh2LCBpbmZvLkdldElzb2xhdGUoKSwgUmV0dXJuVW5z
YWZlSGFuZGxlKTsKK30KKworc3RhdGljIHZvaWQgc3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRp
b25BdHRyU2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCB2ODo6TG9jYWw8djg6OlZh
bHVlPiB2YWx1ZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbykKK3sKKyAgICBUZXN0VHlw
ZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShpbmZvLkhvbGRlcigpKTsKKyAg
ICBWOFRSWUNBVENIX0ZPUl9WOFNUUklOR1JFU09VUkNFX1ZPSUQoVjhTdHJpbmdSZXNvdXJjZTw+
LCB2LCB2YWx1ZSk7CisgICAgaW1wLT5zZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbih2
KTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gc3RyaW5n
QXR0cldpdGhTZXR0ZXJFeGNlcHRpb25BdHRyR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBu
YW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQoreworICAgIFRlc3RUeXBlZGVmcyog
aW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGluZm8uSG9sZGVyKCkpOworICAgIHJldHVy
biB2OFN0cmluZyhpbXAtPnN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKCksIGluZm8uR2V0
SXNvbGF0ZSgpLCBSZXR1cm5VbnNhZmVIYW5kbGUpOworfQorCitzdGF0aWMgdm9pZCBzdHJpbmdB
dHRyV2l0aFNldHRlckV4Y2VwdGlvbkF0dHJTZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IG5h
bWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBp
bmZvKQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZl
KGluZm8uSG9sZGVyKCkpOworICAgIFY4VFJZQ0FUQ0hfRk9SX1Y4U1RSSU5HUkVTT1VSQ0VfVk9J
RChWOFN0cmluZ1Jlc291cmNlPD4sIHYsIHZhbHVlKTsKKyAgICBFeGNlcHRpb25Db2RlIGVjID0g
MDsKKyAgICBpbXAtPnNldFN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKHYsIGVjKTsKKyAg
ICBpZiAoVU5MSUtFTFkoZWMpKQorICAgICAgICBzZXRET01FeGNlcHRpb24oZWMsIGluZm8uR2V0
SXNvbGF0ZSgpKTsKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1
ZT4gVGVzdFR5cGVkZWZzQ29uc3RydWN0b3JHZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IG5h
bWUsIGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCit7CisgICAgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IGRhdGEgPSBpbmZvLkRhdGEoKTsKKyAgICBBU1NFUlQoZGF0YS0+SXNFeHRlcm5hbCgp
KTsKKyAgICBWOFBlckNvbnRleHREYXRhKiBwZXJDb250ZXh0RGF0YSA9IFY4UGVyQ29udGV4dERh
dGE6OmZyb20oaW5mby5Ib2xkZXIoKS0+Q3JlYXRpb25Db250ZXh0KCkpOworICAgIGlmICghcGVy
Q29udGV4dERhdGEpCisgICAgICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworICAgIHJldHVybiBw
ZXJDb250ZXh0RGF0YS0+Y29uc3RydWN0b3JGb3JUeXBlKFdyYXBwZXJUeXBlSW5mbzo6dW53cmFw
KGRhdGEpKTsKK30KK3N0YXRpYyB2b2lkIFRlc3RUeXBlZGVmc1JlcGxhY2VhYmxlQXR0clNldHRl
cih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUs
IGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCit7CisgICAgaW5mby5UaGlzKCktPkZvcmNl
U2V0KG5hbWUsIHZhbHVlKTsKK30KKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBmdW5j
Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBUZXN0VHlwZWRlZnMq
IGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKKyAgICBpZiAo
YXJncy5MZW5ndGgoKSA8PSAwKSB7CisgICAgICAgIGltcC0+ZnVuYygpOworICAgICAgICByZXR1
cm4gdjhVbmRlZmluZWQoKTsKKyAgICB9CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPiAwICYmICFp
c1VuZGVmaW5lZE9yTnVsbChhcmdzWzBdKSAmJiAhVjhsb25nW106Okhhc0luc3RhbmNlKGFyZ3Nb
MF0sIGFyZ3MuR2V0SXNvbGF0ZSgpKSkKKyAgICAgICAgcmV0dXJuIHRocm93VHlwZUVycm9yKDAs
IGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICBWOFRSWUNBVENIKFZlY3RvcjxpbnQ+LCB4LCB0b05h
dGl2ZUFycmF5PGludD4oTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoYXJncywgMCwgRGVmYXVsdElz
VW5kZWZpbmVkKSkpOworICAgIGltcC0+ZnVuYyh4KTsKKyAgICByZXR1cm4gdjhVbmRlZmluZWQo
KTsKK30KKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBtdWx0aVRyYW5zZmVyTGlzdENh
bGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgaWYgKGFyZ3MuTGVuZ3Ro
KCkgPCAxKQorICAgICAgICByZXR1cm4gdGhyb3dOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihhcmdz
LkdldElzb2xhdGUoKSk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6
dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7CisgICAgTWVzc2FnZVBvcnRBcnJheSBtZXNzYWdlUG9y
dEFycmF5VHg7CisgICAgQXJyYXlCdWZmZXJBcnJheSBhcnJheUJ1ZmZlckFycmF5VHg7CisgICAg
aWYgKGFyZ3MuTGVuZ3RoKCkgPiAxKSB7CisgICAgICAgIGlmICghZXh0cmFjdFRyYW5zZmVyYWJs
ZXMoYXJnc1sxXSwgbWVzc2FnZVBvcnRBcnJheVR4LCBhcnJheUJ1ZmZlckFycmF5VHgsIGFyZ3Mu
R2V0SXNvbGF0ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiB0aHJvd1R5cGVFcnJvcigiQ291bGQg
bm90IGV4dHJhY3QgdHJhbnNmZXJhYmxlcyIsIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICB9Cisg
ICAgYm9vbCBmaXJzdERpZFRocm93ID0gZmFsc2U7CisgICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZT4gZmlyc3QgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzBdLCAm
bWVzc2FnZVBvcnRBcnJheVR4LCAmYXJyYXlCdWZmZXJBcnJheVR4LCBmaXJzdERpZFRocm93LCBh
cmdzLkdldElzb2xhdGUoKSk7CisgICAgaWYgKGZpcnN0RGlkVGhyb3cpCisgICAgICAgIHJldHVy
biB2OFVuZGVmaW5lZCgpOworICAgIGlmIChhcmdzLkxlbmd0aCgpIDw9IDEpIHsKKyAgICAgICAg
aW1wLT5tdWx0aVRyYW5zZmVyTGlzdChmaXJzdCk7CisgICAgICAgIHJldHVybiB2OFVuZGVmaW5l
ZCgpOworICAgIH0KKyAgICBpZiAoYXJncy5MZW5ndGgoKSA8PSAyKSB7CisgICAgICAgIGltcC0+
bXVsdGlUcmFuc2Zlckxpc3QoZmlyc3QsIG1lc3NhZ2VQb3J0QXJyYXlUeCk7CisgICAgICAgIHJl
dHVybiB2OFVuZGVmaW5lZCgpOworICAgIH0KKyAgICBNZXNzYWdlUG9ydEFycmF5IG1lc3NhZ2VQ
b3J0QXJyYXlUeHg7CisgICAgQXJyYXlCdWZmZXJBcnJheSBhcnJheUJ1ZmZlckFycmF5VHh4Owor
ICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMykgeworICAgICAgICBpZiAoIWV4dHJhY3RUcmFuc2Zl
cmFibGVzKGFyZ3NbM10sIG1lc3NhZ2VQb3J0QXJyYXlUeHgsIGFycmF5QnVmZmVyQXJyYXlUeHgs
IGFyZ3MuR2V0SXNvbGF0ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiB0aHJvd1R5cGVFcnJvcigi
Q291bGQgbm90IGV4dHJhY3QgdHJhbnNmZXJhYmxlcyIsIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAg
ICB9CisgICAgYm9vbCBzZWNvbmREaWRUaHJvdyA9IGZhbHNlOworICAgIFJlZlB0cjxTZXJpYWxp
emVkU2NyaXB0VmFsdWU+IHNlY29uZCA9IFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6Y3JlYXRlKGFy
Z3NbMl0sICZtZXNzYWdlUG9ydEFycmF5VHh4LCAmYXJyYXlCdWZmZXJBcnJheVR4eCwgc2Vjb25k
RGlkVGhyb3csIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICBpZiAoc2Vjb25kRGlkVGhyb3cpCisg
ICAgICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworICAgIGlmIChhcmdzLkxlbmd0aCgpIDw9IDMp
IHsKKyAgICAgICAgaW1wLT5tdWx0aVRyYW5zZmVyTGlzdChmaXJzdCwgbWVzc2FnZVBvcnRBcnJh
eVR4LCBzZWNvbmQpOworICAgICAgICByZXR1cm4gdjhVbmRlZmluZWQoKTsKKyAgICB9CisgICAg
aW1wLT5tdWx0aVRyYW5zZmVyTGlzdChmaXJzdCwgbWVzc2FnZVBvcnRBcnJheVR4LCBzZWNvbmQs
IG1lc3NhZ2VQb3J0QXJyYXlUeHgpOworICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworfQorCitz
dGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHNldFNoYWRvd0NhbGxiYWNrKGNvbnN0IHY4OjpB
cmd1bWVudHMmIGFyZ3MpCit7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAzKQorICAgICAgICBy
ZXR1cm4gdGhyb3dOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihhcmdzLkdldElzb2xhdGUoKSk7Cisg
ICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6dG9OYXRpdmUoYXJncy5Ib2xk
ZXIoKSk7CisgICAgVjhUUllDQVRDSChmbG9hdCwgd2lkdGgsIHN0YXRpY19jYXN0PGZsb2F0PihN
QVlCRV9NSVNTSU5HX1BBUkFNRVRFUihhcmdzLCAwLCBEZWZhdWx0SXNVbmRlZmluZWQpLT5OdW1i
ZXJWYWx1ZSgpKSk7CisgICAgVjhUUllDQVRDSChmbG9hdCwgaGVpZ2h0LCBzdGF0aWNfY2FzdDxm
bG9hdD4oTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoYXJncywgMSwgRGVmYXVsdElzVW5kZWZpbmVk
KS0+TnVtYmVyVmFsdWUoKSkpOworICAgIFY4VFJZQ0FUQ0goZmxvYXQsIGJsdXIsIHN0YXRpY19j
YXN0PGZsb2F0PihNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihhcmdzLCAyLCBEZWZhdWx0SXNVbmRl
ZmluZWQpLT5OdW1iZXJWYWx1ZSgpKSk7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPD0gMykgewor
ICAgICAgICBpbXAtPnNldFNoYWRvdyh3aWR0aCwgaGVpZ2h0LCBibHVyKTsKKyAgICAgICAgcmV0
dXJuIHY4VW5kZWZpbmVkKCk7CisgICAgfQorICAgIFY4VFJZQ0FUQ0hfRk9SX1Y4U1RSSU5HUkVT
T1VSQ0UoVjhTdHJpbmdSZXNvdXJjZTw+LCBjb2xvciwgTUFZQkVfTUlTU0lOR19QQVJBTUVURVIo
YXJncywgMywgRGVmYXVsdElzVW5kZWZpbmVkKSk7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPD0g
NCkgeworICAgICAgICBpbXAtPnNldFNoYWRvdyh3aWR0aCwgaGVpZ2h0LCBibHVyLCBjb2xvcik7
CisgICAgICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworICAgIH0KKyAgICBWOFRSWUNBVENIKGZs
b2F0LCBhbHBoYSwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGFy
Z3MsIDQsIERlZmF1bHRJc1VuZGVmaW5lZCktPk51bWJlclZhbHVlKCkpKTsKKyAgICBpbXAtPnNl
dFNoYWRvdyh3aWR0aCwgaGVpZ2h0LCBibHVyLCBjb2xvciwgYWxwaGEpOworICAgIHJldHVybiB2
OFVuZGVmaW5lZCgpOworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IG1ldGhvZFdp
dGhTZXF1ZW5jZUFyZ0NhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAg
aWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQorICAgICAgICByZXR1cm4gdGhyb3dOb3RFbm91Z2hBcmd1
bWVudHNFcnJvcihhcmdzLkdldElzb2xhdGUoKSk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBW
OFRlc3RUeXBlZGVmczo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7CisgICAgVjhUUllDQVRDSChW
ZWN0b3I8UmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gPiwgc2VxdWVuY2VBcmcsICh0b1Jl
ZlB0ck5hdGl2ZUFycmF5PFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSwgVjhTZXJpYWxpemVkU2NyaXB0
VmFsdWU+KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGFyZ3MsIDAsIERlZmF1bHRJc1VuZGVmaW5l
ZCksIGFyZ3MuR2V0SXNvbGF0ZSgpKSkpOworICAgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcoc3Rh
dGljX2Nhc3Q8ZG91YmxlPihpbXAtPm1ldGhvZFdpdGhTZXF1ZW5jZUFyZyhzZXF1ZW5jZUFyZykp
KTsKK30KKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBudWxsYWJsZUFycmF5QXJnQ2Fs
bGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgo
KSA8IDEpCisgICAgICAgIHJldHVybiB0aHJvd05vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGFyZ3Mu
R2V0SXNvbGF0ZSgpKTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0
b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKKyAgICBWOFRSWUNBVENIKFZlY3RvcjxTdHJpbmc+LCBh
cnJheUFyZywgdG9OYXRpdmVBcnJheTxTdHJpbmc+KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGFy
Z3MsIDAsIERlZmF1bHRJc1VuZGVmaW5lZCkpKTsKKyAgICBpbXAtPm51bGxhYmxlQXJyYXlBcmco
YXJyYXlBcmcpOworICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworfQorCitzdGF0aWMgdjg6Okhh
bmRsZTx2ODo6VmFsdWU+IGZ1bmNXaXRoQ2xhbXBDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRz
JiBhcmdzKQoreworICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRo
cm93Tm90RW5vdWdoQXJndW1lbnRzRXJyb3IoYXJncy5HZXRJc29sYXRlKCkpOworICAgIFRlc3RU
eXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOwor
ICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBhcmcxID0gMDsKKyAgICBWOFRSWUNBVENIKGRvdWJsZSwg
YXJnMU5hdGl2ZVZhbHVlLCBhcmdzWzBdLT5OdW1iZXJWYWx1ZSgpKTsKKyAgICBpZiAoIWlzbmFu
KGFyZzFOYXRpdmVWYWx1ZSkpCisgICAgICAgIGFyZzEgPSBjbGFtcFRvPHVuc2lnbmVkIGxvbmcg
bG9uZz4oYXJnMU5hdGl2ZVZhbHVlKTsKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA8PSAxKSB7Cisg
ICAgICAgIGltcC0+ZnVuY1dpdGhDbGFtcChhcmcxKTsKKyAgICAgICAgcmV0dXJuIHY4VW5kZWZp
bmVkKCk7CisgICAgfQorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBhcmcyID0gMDsKKyAgICBWOFRS
WUNBVENIKGRvdWJsZSwgYXJnMk5hdGl2ZVZhbHVlLCBhcmdzWzFdLT5OdW1iZXJWYWx1ZSgpKTsK
KyAgICBpZiAoIWlzbmFuKGFyZzJOYXRpdmVWYWx1ZSkpCisgICAgICAgIGFyZzIgPSBjbGFtcFRv
PHVuc2lnbmVkIGxvbmcgbG9uZz4oYXJnMk5hdGl2ZVZhbHVlKTsKKyAgICBpbXAtPmZ1bmNXaXRo
Q2xhbXAoYXJnMSwgYXJnMik7CisgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7Cit9CisKK3N0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gaW1tdXRhYmxlUG9pbnRGdW5jdGlvbkNhbGxiYWNrKGNv
bnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRl
c3RUeXBlZGVmczo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7CisgICAgcmV0dXJuIHRvVjgoV1RG
OjpnZXRQdHIoU1ZHUHJvcGVydHlUZWFyT2ZmPEZsb2F0UG9pbnQ+OjpjcmVhdGUoaW1wLT5pbW11
dGFibGVQb2ludEZ1bmN0aW9uKCkpKSwgYXJncy5Ib2xkZXIoKSwgYXJncy5HZXRJc29sYXRlKCkp
OworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHN0cmluZ0FycmF5RnVuY3Rpb25D
YWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQoreworICAgIGlmIChhcmdzLkxlbmd0
aCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93Tm90RW5vdWdoQXJndW1lbnRzRXJyb3IoYXJn
cy5HZXRJc29sYXRlKCkpOworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6
OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAg
IHsKKyAgICBWOFRSWUNBVENIKFZlY3RvcjxTdHJpbmc+LCB2YWx1ZXMsIHRvTmF0aXZlQXJyYXk8
U3RyaW5nPihNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihhcmdzLCAwLCBEZWZhdWx0SXNVbmRlZmlu
ZWQpKSk7CisgICAgVmVjdG9yPFN0cmluZz4gcmVzdWx0ID0gaW1wLT5zdHJpbmdBcnJheUZ1bmN0
aW9uKHZhbHVlcywgZWMpOworICAgIGlmIChVTkxJS0VMWShlYykpCisgICAgICAgIGdvdG8gZmFp
bDsKKyAgICByZXR1cm4gdjhBcnJheShyZXN1bHQsIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICB9
CisgICAgZmFpbDoKKyAgICByZXR1cm4gc2V0RE9NRXhjZXB0aW9uKGVjLCBhcmdzLkdldElzb2xh
dGUoKSk7Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gbWV0aG9kV2l0aEV4Y2Vw
dGlvbkNhbGxiYWNrKGNvbnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgVGVzdFR5cGVk
ZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7CisgICAg
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgeworICAgIGltcC0+bWV0aG9kV2l0aEV4Y2VwdGlv
bihlYyk7CisgICAgaWYgKFVOTElLRUxZKGVjKSkKKyAgICAgICAgZ290byBmYWlsOworICAgIHJl
dHVybiB2OFVuZGVmaW5lZCgpOworICAgIH0KKyAgICBmYWlsOgorICAgIHJldHVybiBzZXRET01F
eGNlcHRpb24oZWMsIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgVGVz
dFR5cGVkZWZzVjhJbnRlcm5hbAorCitzdGF0aWMgY29uc3QgVjhET01Db25maWd1cmF0aW9uOjpC
YXRjaGVkQXR0cmlidXRlIFY4VGVzdFR5cGVkZWZzQXR0cnNbXSA9IHsKKyAgICAvLyBBdHRyaWJ1
dGUgJ3Vuc2lnbmVkTG9uZ0xvbmdBdHRyJyAoVHlwZTogJ2F0dHJpYnV0ZScgRXh0QXR0cjogJycp
CisgICAgeyJ1bnNpZ25lZExvbmdMb25nQXR0ciIsIFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OnVu
c2lnbmVkTG9uZ0xvbmdBdHRyQXR0ckdldHRlciwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6dW5z
aWduZWRMb25nTG9uZ0F0dHJBdHRyU2V0dGVyLCAwIC8qIG5vIGRhdGEgKi8sIHN0YXRpY19jYXN0
PHY4OjpBY2Nlc3NDb250cm9sPih2ODo6REVGQVVMVCksIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0
eUF0dHJpYnV0ZT4odjg6Ok5vbmUpLCAwIC8qIG9uIGluc3RhbmNlICovfSwKKyAgICAvLyBBdHRy
aWJ1dGUgJ2ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZScgKFR5cGU6ICdhdHRyaWJ1dGUn
IEV4dEF0dHI6ICdJbW11dGFibGUnKQorICAgIHsiaW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZh
bHVlIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZh
bHVlQXR0ckdldHRlciwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRhYmxlU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlQXR0clNldHRlciwgMCAvKiBubyBkYXRhICovLCBzdGF0aWNfY2FzdDx2ODo6
QWNjZXNzQ29udHJvbD4odjg6OkRFRkFVTFQpLCBzdGF0aWNfY2FzdDx2ODo6UHJvcGVydHlBdHRy
aWJ1dGU+KHY4OjpOb25lKSwgMCAvKiBvbiBpbnN0YW5jZSAqL30sCisgICAgLy8gQXR0cmlidXRl
ICdUZXN0U3ViT2JqJyAoVHlwZTogJ3JlYWRvbmx5IGF0dHJpYnV0ZScgRXh0QXR0cjogJycpCisg
ICAgeyJUZXN0U3ViT2JqIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6VGVzdFR5cGVkZWZzQ29u
c3RydWN0b3JHZXR0ZXIsIDAsICZWOFRlc3RTdWJPYmo6OmluZm8sIHN0YXRpY19jYXN0PHY4OjpB
Y2Nlc3NDb250cm9sPih2ODo6REVGQVVMVCksIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJp
YnV0ZT4odjg6Ok5vbmUpLCAwIC8qIG9uIGluc3RhbmNlICovfSwKKyAgICAvLyBBdHRyaWJ1dGUg
J2F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uJyAoVHlwZTogJ2F0dHJpYnV0ZScgRXh0QXR0cjogJycp
CisgICAgeyJhdHRyV2l0aEdldHRlckV4Y2VwdGlvbiIsIFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6
OmF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uQXR0ckdldHRlciwgVGVzdFR5cGVkZWZzVjhJbnRlcm5h
bDo6YXR0cldpdGhHZXR0ZXJFeGNlcHRpb25BdHRyU2V0dGVyLCAwIC8qIG5vIGRhdGEgKi8sIHN0
YXRpY19jYXN0PHY4OjpBY2Nlc3NDb250cm9sPih2ODo6REVGQVVMVCksIHN0YXRpY19jYXN0PHY4
OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6Ok5vbmUpLCAwIC8qIG9uIGluc3RhbmNlICovfSwKKyAg
ICAvLyBBdHRyaWJ1dGUgJ2F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uJyAoVHlwZTogJ2F0dHJpYnV0
ZScgRXh0QXR0cjogJycpCisgICAgeyJhdHRyV2l0aFNldHRlckV4Y2VwdGlvbiIsIFRlc3RUeXBl
ZGVmc1Y4SW50ZXJuYWw6OmF0dHJXaXRoU2V0dGVyRXhjZXB0aW9uQXR0ckdldHRlciwgVGVzdFR5
cGVkZWZzVjhJbnRlcm5hbDo6YXR0cldpdGhTZXR0ZXJFeGNlcHRpb25BdHRyU2V0dGVyLCAwIC8q
IG5vIGRhdGEgKi8sIHN0YXRpY19jYXN0PHY4OjpBY2Nlc3NDb250cm9sPih2ODo6REVGQVVMVCks
IHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4odjg6Ok5vbmUpLCAwIC8qIG9uIGlu
c3RhbmNlICovfSwKKyAgICAvLyBBdHRyaWJ1dGUgJ3N0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0
aW9uJyAoVHlwZTogJ2F0dHJpYnV0ZScgRXh0QXR0cjogJycpCisgICAgeyJzdHJpbmdBdHRyV2l0
aEdldHRlckV4Y2VwdGlvbiIsIFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OnN0cmluZ0F0dHJXaXRo
R2V0dGVyRXhjZXB0aW9uQXR0ckdldHRlciwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6c3RyaW5n
QXR0cldpdGhHZXR0ZXJFeGNlcHRpb25BdHRyU2V0dGVyLCAwIC8qIG5vIGRhdGEgKi8sIHN0YXRp
Y19jYXN0PHY4OjpBY2Nlc3NDb250cm9sPih2ODo6REVGQVVMVCksIHN0YXRpY19jYXN0PHY4OjpQ
cm9wZXJ0eUF0dHJpYnV0ZT4odjg6Ok5vbmUpLCAwIC8qIG9uIGluc3RhbmNlICovfSwKKyAgICAv
LyBBdHRyaWJ1dGUgJ3N0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uJyAoVHlwZTogJ2F0dHJp
YnV0ZScgRXh0QXR0cjogJycpCisgICAgeyJzdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbiIs
IFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OnN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uQXR0
ckdldHRlciwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6c3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNl
cHRpb25BdHRyU2V0dGVyLCAwIC8qIG5vIGRhdGEgKi8sIHN0YXRpY19jYXN0PHY4OjpBY2Nlc3ND
b250cm9sPih2ODo6REVGQVVMVCksIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0ZT4o
djg6Ok5vbmUpLCAwIC8qIG9uIGluc3RhbmNlICovfSwKK307CisKK3N0YXRpYyBjb25zdCBWOERP
TUNvbmZpZ3VyYXRpb246OkJhdGNoZWRDYWxsYmFjayBWOFRlc3RUeXBlZGVmc0NhbGxiYWNrc1td
ID0geworICAgIHsiZnVuYyIsIFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OmZ1bmNDYWxsYmFja30s
CisgICAgeyJtdWx0aVRyYW5zZmVyTGlzdCIsIFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6Om11bHRp
VHJhbnNmZXJMaXN0Q2FsbGJhY2t9LAorICAgIHsic2V0U2hhZG93IiwgVGVzdFR5cGVkZWZzVjhJ
bnRlcm5hbDo6c2V0U2hhZG93Q2FsbGJhY2t9LAorICAgIHsiZnVuY1dpdGhDbGFtcCIsIFRlc3RU
eXBlZGVmc1Y4SW50ZXJuYWw6OmZ1bmNXaXRoQ2xhbXBDYWxsYmFja30sCisgICAgeyJpbW11dGFi
bGVQb2ludEZ1bmN0aW9uIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRhYmxlUG9pbnRG
dW5jdGlvbkNhbGxiYWNrfSwKKyAgICB7Im1ldGhvZFdpdGhFeGNlcHRpb24iLCBUZXN0VHlwZWRl
ZnNWOEludGVybmFsOjptZXRob2RXaXRoRXhjZXB0aW9uQ2FsbGJhY2t9LAorfTsKKwordjg6Okhh
bmRsZTx2ODo6VmFsdWU+IFY4VGVzdFR5cGVkZWZzOjpjb25zdHJ1Y3RvckNhbGxiYWNrKGNvbnN0
IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgCisgICAgaWYgKCFhcmdzLklzQ29uc3RydWN0
Q2FsbCgpKQorICAgICAgICByZXR1cm4gdGhyb3dUeXBlRXJyb3IoIkRPTSBvYmplY3QgY29uc3Ry
dWN0b3IgY2Fubm90IGJlIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLiIsIGFyZ3MuR2V0SXNvbGF0ZSgp
KTsKKworICAgIGlmIChDb25zdHJ1Y3Rvck1vZGU6OmN1cnJlbnQoKSA9PSBDb25zdHJ1Y3Rvck1v
ZGU6OldyYXBFeGlzdGluZ09iamVjdCkKKyAgICAgICAgcmV0dXJuIGFyZ3MuSG9sZGVyKCk7Cisg
ICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAyKQorICAgICAgICByZXR1cm4gdGhyb3dOb3RFbm91Z2hB
cmd1bWVudHNFcnJvcihhcmdzLkdldElzb2xhdGUoKSk7CisgICAgVjhUUllDQVRDSF9GT1JfVjhT
VFJJTkdSRVNPVVJDRShWOFN0cmluZ1Jlc291cmNlPD4sIGhlbGxvLCBNQVlCRV9NSVNTSU5HX1BB
UkFNRVRFUihhcmdzLCAwLCBEZWZhdWx0SXNVbmRlZmluZWQpKTsKKyAgICBpZiAoYXJncy5MZW5n
dGgoKSA8PSAxIHx8ICFhcmdzWzFdLT5Jc0Z1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiB0aHJv
d1R5cGVFcnJvcigwLCBhcmdzLkdldElzb2xhdGUoKSk7CisgICAgUmVmUHRyPFRlc3RDYWxsYmFj
az4gdGVzdENhbGxiYWNrID0gVjhUZXN0Q2FsbGJhY2s6OmNyZWF0ZShhcmdzWzFdLCBnZXRTY3Jp
cHRFeGVjdXRpb25Db250ZXh0KCkpOworCisgICAgUmVmUHRyPFRlc3RUeXBlZGVmcz4gaW1wbCA9
IFRlc3RUeXBlZGVmczo6Y3JlYXRlKGhlbGxvLCB0ZXN0Q2FsbGJhY2spOworICAgIHY4OjpIYW5k
bGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IGFyZ3MuSG9sZGVyKCk7CisKKyAgICBWOERPTVdyYXBw
ZXI6OmFzc29jaWF0ZU9iamVjdFdpdGhXcmFwcGVyKGltcGwucmVsZWFzZSgpLCAmaW5mbywgd3Jh
cHBlciwgYXJncy5HZXRJc29sYXRlKCksIFdyYXBwZXJDb25maWd1cmF0aW9uOjpEZXBlbmRlbnQp
OworICAgIHJldHVybiB3cmFwcGVyOworfQorCitzdGF0aWMgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1
bmN0aW9uVGVtcGxhdGU+IENvbmZpZ3VyZVY4VGVzdFR5cGVkZWZzVGVtcGxhdGUodjg6OlBlcnNp
c3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IGRlc2MsIHY4OjpJc29sYXRlKiBpc29sYXRlKQor
eworICAgIGRlc2MtPlJlYWRPbmx5UHJvdG90eXBlKCk7CisKKyAgICB2ODo6TG9jYWw8djg6OlNp
Z25hdHVyZT4gZGVmYXVsdFNpZ25hdHVyZTsKKyAgICBkZWZhdWx0U2lnbmF0dXJlID0gVjhET01D
b25maWd1cmF0aW9uOjpjb25maWd1cmVUZW1wbGF0ZShkZXNjLCAiVGVzdFR5cGVkZWZzIiwgdjg6
OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+KCksIFY4VGVzdFR5cGVkZWZzOjppbnRl
cm5hbEZpZWxkQ291bnQsCisgICAgICAgIFY4VGVzdFR5cGVkZWZzQXR0cnMsIFdURl9BUlJBWV9M
RU5HVEgoVjhUZXN0VHlwZWRlZnNBdHRycyksCisgICAgICAgIFY4VGVzdFR5cGVkZWZzQ2FsbGJh
Y2tzLCBXVEZfQVJSQVlfTEVOR1RIKFY4VGVzdFR5cGVkZWZzQ2FsbGJhY2tzKSwgaXNvbGF0ZSk7
CisgICAgVU5VU0VEX1BBUkFNKGRlZmF1bHRTaWduYXR1cmUpOyAvLyBJbiBzb21lIGNhc2VzLCBp
dCB3aWxsIG5vdCBiZSB1c2VkLgorICAgIGRlc2MtPlNldENhbGxIYW5kbGVyKFY4VGVzdFR5cGVk
ZWZzOjpjb25zdHJ1Y3RvckNhbGxiYWNrKTsKKyAgICB2ODo6TG9jYWw8djg6Ok9iamVjdFRlbXBs
YXRlPiBpbnN0YW5jZSA9IGRlc2MtPkluc3RhbmNlVGVtcGxhdGUoKTsKKyAgICB2ODo6TG9jYWw8
djg6Ok9iamVjdFRlbXBsYXRlPiBwcm90byA9IGRlc2MtPlByb3RvdHlwZVRlbXBsYXRlKCk7Cisg
ICAgVU5VU0VEX1BBUkFNKGluc3RhbmNlKTsgLy8gSW4gc29tZSBjYXNlcywgaXQgd2lsbCBub3Qg
YmUgdXNlZC4KKyAgICBVTlVTRURfUEFSQU0ocHJvdG8pOyAvLyBJbiBzb21lIGNhc2VzLCBpdCB3
aWxsIG5vdCBiZSB1c2VkLgorICAgIAorCisgICAgLy8gQ3VzdG9tIFNpZ25hdHVyZSAnbWV0aG9k
V2l0aFNlcXVlbmNlQXJnJworICAgIGNvbnN0IGludCBtZXRob2RXaXRoU2VxdWVuY2VBcmdBcmdj
ID0gMTsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBtZXRob2RXaXRoU2Vx
dWVuY2VBcmdBcmd2W21ldGhvZFdpdGhTZXF1ZW5jZUFyZ0FyZ2NdID0geyBWOHNlcXVlbmNlPFNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZT46OkdldFJhd1RlbXBsYXRlKGlzb2xhdGUpIH07CisgICAgdjg6
OkhhbmRsZTx2ODo6U2lnbmF0dXJlPiBtZXRob2RXaXRoU2VxdWVuY2VBcmdTaWduYXR1cmUgPSB2
ODo6U2lnbmF0dXJlOjpOZXcoZGVzYywgbWV0aG9kV2l0aFNlcXVlbmNlQXJnQXJnYywgbWV0aG9k
V2l0aFNlcXVlbmNlQXJnQXJndik7CisgICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1i
b2woIm1ldGhvZFdpdGhTZXF1ZW5jZUFyZyIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRl
c3RUeXBlZGVmc1Y4SW50ZXJuYWw6Om1ldGhvZFdpdGhTZXF1ZW5jZUFyZ0NhbGxiYWNrLCB2OFVu
ZGVmaW5lZCgpLCBtZXRob2RXaXRoU2VxdWVuY2VBcmdTaWduYXR1cmUpKTsKKworICAgIC8vIEN1
c3RvbSBTaWduYXR1cmUgJ251bGxhYmxlQXJyYXlBcmcnCisgICAgY29uc3QgaW50IG51bGxhYmxl
QXJyYXlBcmdBcmdjID0gMTsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5jdGlvblRlbXBsYXRlPiBu
dWxsYWJsZUFycmF5QXJnQXJndltudWxsYWJsZUFycmF5QXJnQXJnY10gPSB7IFY4RE9NU3RyaW5n
W106OkdldFJhd1RlbXBsYXRlKGlzb2xhdGUpIH07CisgICAgdjg6OkhhbmRsZTx2ODo6U2lnbmF0
dXJlPiBudWxsYWJsZUFycmF5QXJnU2lnbmF0dXJlID0gdjg6OlNpZ25hdHVyZTo6TmV3KGRlc2Ms
IG51bGxhYmxlQXJyYXlBcmdBcmdjLCBudWxsYWJsZUFycmF5QXJnQXJndik7CisgICAgcHJvdG8t
PlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woIm51bGxhYmxlQXJyYXlBcmciKSwgdjg6OkZ1bmN0
aW9uVGVtcGxhdGU6Ok5ldyhUZXN0VHlwZWRlZnNWOEludGVybmFsOjpudWxsYWJsZUFycmF5QXJn
Q2FsbGJhY2ssIHY4VW5kZWZpbmVkKCksIG51bGxhYmxlQXJyYXlBcmdTaWduYXR1cmUpKTsKKwor
ICAgIC8vIEN1c3RvbSBTaWduYXR1cmUgJ3N0cmluZ0FycmF5RnVuY3Rpb24nCisgICAgY29uc3Qg
aW50IHN0cmluZ0FycmF5RnVuY3Rpb25BcmdjID0gMTsKKyAgICB2ODo6SGFuZGxlPHY4OjpGdW5j
dGlvblRlbXBsYXRlPiBzdHJpbmdBcnJheUZ1bmN0aW9uQXJndltzdHJpbmdBcnJheUZ1bmN0aW9u
QXJnY10gPSB7IFY4RE9NU3RyaW5nW106OkdldFJhd1RlbXBsYXRlKGlzb2xhdGUpIH07CisgICAg
djg6OkhhbmRsZTx2ODo6U2lnbmF0dXJlPiBzdHJpbmdBcnJheUZ1bmN0aW9uU2lnbmF0dXJlID0g
djg6OlNpZ25hdHVyZTo6TmV3KGRlc2MsIHN0cmluZ0FycmF5RnVuY3Rpb25BcmdjLCBzdHJpbmdB
cnJheUZ1bmN0aW9uQXJndik7CisgICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2wo
InN0cmluZ0FycmF5RnVuY3Rpb24iKSwgdjg6OkZ1bmN0aW9uVGVtcGxhdGU6Ok5ldyhUZXN0VHlw
ZWRlZnNWOEludGVybmFsOjpzdHJpbmdBcnJheUZ1bmN0aW9uQ2FsbGJhY2ssIHY4VW5kZWZpbmVk
KCksIHN0cmluZ0FycmF5RnVuY3Rpb25TaWduYXR1cmUpKTsKKworICAgIC8vIEN1c3RvbSB0b1N0
cmluZyB0ZW1wbGF0ZQorICAgIGRlc2MtPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woInRvU3Ry
aW5nIiksIFY4UGVySXNvbGF0ZURhdGE6OmN1cnJlbnQoKS0+dG9TdHJpbmdUZW1wbGF0ZSgpKTsK
KyAgICByZXR1cm4gZGVzYzsKK30KKwordjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxh
dGU+IFY4VGVzdFR5cGVkZWZzOjpHZXRSYXdUZW1wbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkK
K3sKKyAgICBWOFBlcklzb2xhdGVEYXRhKiBkYXRhID0gVjhQZXJJc29sYXRlRGF0YTo6ZnJvbShp
c29sYXRlKTsKKyAgICBWOFBlcklzb2xhdGVEYXRhOjpUZW1wbGF0ZU1hcDo6aXRlcmF0b3IgcmVz
dWx0ID0gZGF0YS0+cmF3VGVtcGxhdGVNYXAoKS5maW5kKCZpbmZvKTsKKyAgICBpZiAocmVzdWx0
ICE9IGRhdGEtPnJhd1RlbXBsYXRlTWFwKCkuZW5kKCkpCisgICAgICAgIHJldHVybiByZXN1bHQt
PnZhbHVlOworCisgICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpQZXJz
aXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiB0ZW1wbCA9IGNyZWF0ZVJhd1RlbXBsYXRlKGlz
b2xhdGUpOworICAgIGRhdGEtPnJhd1RlbXBsYXRlTWFwKCkuYWRkKCZpbmZvLCB0ZW1wbCk7Cisg
ICAgcmV0dXJuIHRlbXBsOworfQorCit2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0
ZT4gVjhUZXN0VHlwZWRlZnM6OkdldFRlbXBsYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKQorewor
ICAgIFY4UGVySXNvbGF0ZURhdGEqIGRhdGEgPSBWOFBlcklzb2xhdGVEYXRhOjpmcm9tKGlzb2xh
dGUpOworICAgIFY4UGVySXNvbGF0ZURhdGE6OlRlbXBsYXRlTWFwOjppdGVyYXRvciByZXN1bHQg
PSBkYXRhLT50ZW1wbGF0ZU1hcCgpLmZpbmQoJmluZm8pOworICAgIGlmIChyZXN1bHQgIT0gZGF0
YS0+dGVtcGxhdGVNYXAoKS5lbmQoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdC0+dmFsdWU7CisK
KyAgICB2ODo6SGFuZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6
OkZ1bmN0aW9uVGVtcGxhdGU+IHRlbXBsID0KKyAgICAgICAgQ29uZmlndXJlVjhUZXN0VHlwZWRl
ZnNUZW1wbGF0ZShHZXRSYXdUZW1wbGF0ZShpc29sYXRlKSwgaXNvbGF0ZSk7CisgICAgZGF0YS0+
dGVtcGxhdGVNYXAoKS5hZGQoJmluZm8sIHRlbXBsKTsKKyAgICByZXR1cm4gdGVtcGw7Cit9CisK
K2Jvb2wgVjhUZXN0VHlwZWRlZnM6Okhhc0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2
YWx1ZSwgdjg6Oklzb2xhdGUqIGlzb2xhdGUpCit7CisgICAgcmV0dXJuIEdldFJhd1RlbXBsYXRl
KGlzb2xhdGUpLT5IYXNJbnN0YW5jZSh2YWx1ZSk7Cit9CisKKwordjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBWOFRlc3RUeXBlZGVmczo6Y3JlYXRlV3JhcHBlcihQYXNzUmVmUHRyPFRlc3RUeXBlZGVm
cz4gaW1wbCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4OjpJc29s
YXRlKiBpc29sYXRlKQoreworICAgIEFTU0VSVChpbXBsLmdldCgpKTsKKyAgICBBU1NFUlQoRE9N
RGF0YVN0b3JlOjpnZXRXcmFwcGVyKGltcGwuZ2V0KCksIGlzb2xhdGUpLklzRW1wdHkoKSk7CisK
KyNpZiBFTkFCTEUoQklORElOR19JTlRFR1JJVFkpCisgICAgY2hlY2tUeXBlT3JEaWVUcnlpbmco
aW1wbC5nZXQoKSk7CisjZW5kaWYKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBl
ciA9IFY4RE9NV3JhcHBlcjo6Y3JlYXRlV3JhcHBlcihjcmVhdGlvbkNvbnRleHQsICZpbmZvLCBp
bXBsLmdldCgpLCBpc29sYXRlKTsKKyAgICBpZiAoVU5MSUtFTFkod3JhcHBlci5Jc0VtcHR5KCkp
KQorICAgICAgICByZXR1cm4gd3JhcHBlcjsKKworICAgIGluc3RhbGxQZXJDb250ZXh0UHJvcGVy
dGllcyh3cmFwcGVyLCBpbXBsLmdldCgpLCBpc29sYXRlKTsKKyAgICBWOERPTVdyYXBwZXI6OmFz
c29jaWF0ZU9iamVjdFdpdGhXcmFwcGVyKGltcGwsICZpbmZvLCB3cmFwcGVyLCBpc29sYXRlLCBo
YXNEZXBlbmRlbnRMaWZldGltZSA/IFdyYXBwZXJDb25maWd1cmF0aW9uOjpEZXBlbmRlbnQgOiBX
cmFwcGVyQ29uZmlndXJhdGlvbjo6SW5kZXBlbmRlbnQpOworICAgIHJldHVybiB3cmFwcGVyOwor
fQordm9pZCBWOFRlc3RUeXBlZGVmczo6ZGVyZWZPYmplY3Qodm9pZCogb2JqZWN0KQoreworICAg
IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KG9iamVjdCktPmRlcmVmKCk7Cit9CisKK30gLy8g
bmFtZXNwYWNlIFdlYkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3Nj
cmlwdHMvdGVzdC9WOC9WOFRlc3RUeXBlZGVmcy5oIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdFR5cGVkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k
ZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzFlNmYyOTY4OWEz
ODVhNDI3NjJiMzJkNzFmZmU0ZmM0OGRjMzViYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RUeXBlZGVmcy5oCkBAIC0wLDAg
KzEsOTcgQEAKKy8qCisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNv
dXJjZSBwcm9qZWN0LgorICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgZ2VuZXJh
dGUtYmluZGluZ3MucGwuIERPIE5PVCBNT0RJRlkhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJl
ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0
IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBM
aWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo
ZXIKKyAgICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55
IGxhdGVyIHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhl
IGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFO
VFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJ
TElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisg
ICAgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAg
ICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUg
ZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2Fy
ZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICAgQm9z
dG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisqLworCisjaWZuZGVmIFY4VGVzdFR5cGVkZWZzX2gK
KyNkZWZpbmUgVjhUZXN0VHlwZWRlZnNfaAorCisjaW5jbHVkZSAiVGVzdFR5cGVkZWZzLmgiCisj
aW5jbHVkZSAiVjhCaW5kaW5nLmgiCisjaW5jbHVkZSAiVjhET01XcmFwcGVyLmgiCisjaW5jbHVk
ZSAiV3JhcHBlclR5cGVJbmZvLmgiCisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx3dGYvSGFz
aE1hcC5oPgorI2luY2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKworbmFtZXNwYWNlIFdl
YkNvcmUgeworCitjbGFzcyBWOFRlc3RUeXBlZGVmcyB7CitwdWJsaWM6CisgICAgc3RhdGljIGNv
bnN0IGJvb2wgaGFzRGVwZW5kZW50TGlmZXRpbWUgPSBmYWxzZTsKKyAgICBzdGF0aWMgYm9vbCBI
YXNJbnN0YW5jZSh2ODo6SGFuZGxlPHY4OjpWYWx1ZT4sIHY4OjpJc29sYXRlKik7CisgICAgc3Rh
dGljIHY4OjpQZXJzaXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBHZXRSYXdUZW1wbGF0ZSh2
ODo6SXNvbGF0ZSopOworICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1w
bGF0ZT4gR2V0VGVtcGxhdGUodjg6Oklzb2xhdGUqKTsKKyAgICBzdGF0aWMgVGVzdFR5cGVkZWZz
KiB0b05hdGl2ZSh2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCkKKyAgICB7CisgICAgICAg
IHJldHVybiByZWludGVycHJldF9jYXN0PFRlc3RUeXBlZGVmcyo+KG9iamVjdC0+R2V0QWxpZ25l
ZFBvaW50ZXJGcm9tSW50ZXJuYWxGaWVsZCh2OERPTVdyYXBwZXJPYmplY3RJbmRleCkpOworICAg
IH0KKyAgICBzdGF0aWMgdm9pZCBkZXJlZk9iamVjdCh2b2lkKik7CisgICAgc3RhdGljIFdyYXBw
ZXJUeXBlSW5mbyBpbmZvOworICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29uc3Ry
dWN0b3JDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJik7CisgICAgc3RhdGljIGNvbnN0IGlu
dCBpbnRlcm5hbEZpZWxkQ291bnQgPSB2OERlZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENvdW50
ICsgMDsKKyAgICBzdGF0aWMgdm9pZCBpbnN0YWxsUGVyQ29udGV4dFByb3BlcnRpZXModjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiwgVGVzdFR5cGVkZWZzKiwgdjg6Oklzb2xhdGUqKSB7IH0KKyAgICBz
dGF0aWMgdm9pZCBpbnN0YWxsUGVyQ29udGV4dFByb3RvdHlwZVByb3BlcnRpZXModjg6OkhhbmRs
ZTx2ODo6T2JqZWN0Piwgdjg6Oklzb2xhdGUqKSB7IH0KK3ByaXZhdGU6CisgICAgZnJpZW5kIHY4
OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcChUZXN0VHlwZWRlZnMqLCB2ODo6SGFuZGxlPHY4OjpP
YmplY3Q+IGNyZWF0aW9uQ29udGV4dCwgdjg6Oklzb2xhdGUqKTsKKyAgICBzdGF0aWMgdjg6Okhh
bmRsZTx2ODo6T2JqZWN0PiBjcmVhdGVXcmFwcGVyKFBhc3NSZWZQdHI8VGVzdFR5cGVkZWZzPiwg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4OjpJc29sYXRlKik7Cit9
OworCisKK2lubGluZSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXAoVGVzdFR5cGVkZWZzKiBp
bXBsLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGNyZWF0aW9uQ29udGV4dCwgdjg6Oklzb2xhdGUq
IGlzb2xhdGUpCit7CisgICAgQVNTRVJUKGltcGwpOworICAgIEFTU0VSVChET01EYXRhU3RvcmU6
OmdldFdyYXBwZXIoaW1wbCwgaXNvbGF0ZSkuSXNFbXB0eSgpKTsKKyAgICByZXR1cm4gVjhUZXN0
VHlwZWRlZnM6OmNyZWF0ZVdyYXBwZXIoaW1wbCwgY3JlYXRpb25Db250ZXh0LCBpc29sYXRlKTsK
K30KKworaW5saW5lIHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0b1Y4KFRlc3RUeXBlZGVmcyogaW1w
bCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4OjpJc29sYXRlKiBp
c29sYXRlKQoreworICAgIGlmIChVTkxJS0VMWSghaW1wbCkpCisgICAgICAgIHJldHVybiB2OE51
bGxXaXRoQ2hlY2soaXNvbGF0ZSk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIg
PSBET01EYXRhU3RvcmU6OmdldFdyYXBwZXIoaW1wbCwgaXNvbGF0ZSk7CisgICAgaWYgKCF3cmFw
cGVyLklzRW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgcmV0dXJuIHdyYXAo
aW1wbCwgY3JlYXRpb25Db250ZXh0LCBpc29sYXRlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgSG9s
ZGVyQ29udGFpbmVyLCBjbGFzcyBXcmFwcGFibGU+CitpbmxpbmUgdjg6OkhhbmRsZTx2ODo6VmFs
dWU+IHRvVjhGYXN0KFRlc3RUeXBlZGVmcyogaW1wbCwgY29uc3QgSG9sZGVyQ29udGFpbmVyJiBj
b250YWluZXIsIFdyYXBwYWJsZSogd3JhcHBhYmxlKQoreworICAgIGlmIChVTkxJS0VMWSghaW1w
bCkpCisgICAgICAgIHJldHVybiB2OE51bGwoY29udGFpbmVyLkdldElzb2xhdGUoKSk7CisgICAg
djg6OkhhbmRsZTx2ODo6T2JqZWN0PiB3cmFwcGVyID0gRE9NRGF0YVN0b3JlOjpnZXRXcmFwcGVy
RmFzdChpbXBsLCBjb250YWluZXIsIHdyYXBwYWJsZSk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1w
dHkoKSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgcmV0dXJuIHdyYXAoaW1wbCwgY29u
dGFpbmVyLkhvbGRlcigpLCBjb250YWluZXIuR2V0SXNvbGF0ZSgpKTsKK30KKwordGVtcGxhdGU8
Y2xhc3MgSG9sZGVyQ29udGFpbmVyLCBjbGFzcyBXcmFwcGFibGU+CitpbmxpbmUgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IHRvVjhGYXN0KFBhc3NSZWZQdHI8IFRlc3RUeXBlZGVmcyA+IGltcGwsIGNv
bnN0IEhvbGRlckNvbnRhaW5lciYgY29udGFpbmVyLCBXcmFwcGFibGUqIHdyYXBwYWJsZSkKK3sK
KyAgICByZXR1cm4gdG9WOEZhc3QoaW1wbC5nZXQoKSwgY29udGFpbmVyLCB3cmFwcGFibGUpOwor
fQorCitpbmxpbmUgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHRvVjgoUGFzc1JlZlB0cjwgVGVzdFR5
cGVkZWZzID4gaW1wbCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4
OjpJc29sYXRlKiBpc29sYXRlKQoreworICAgIHJldHVybiB0b1Y4KGltcGwuZ2V0KCksIGNyZWF0
aW9uQ29udGV4dCwgaXNvbGF0ZSk7Cit9CisKK30KKworI2VuZGlmIC8vIFY4VGVzdFR5cGVkZWZz
X2gK
</data>

          </attachment>
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>188280</attachid>
            <date>2013-02-14 01:11:41 -0800</date>
            <delta_ts>2013-02-14 03:55:36 -0800</delta_ts>
            <desc>with a test case for STRING[]</desc>
            <filename>bug-52340-20130214130808.patch</filename>
            <type>text/plain</type>
            <size>141807</size>
            <attacher name="Andrey Adaikin">aandrey</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMTQyNjM1CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9D
aGFuZ2VMb2cgYi9Tb3VyY2UvV2ViQ29yZS9DaGFuZ2VMb2cKaW5kZXggNWNiZWQyNTQwZjhjNDMw
YjcyNGI2NDc5ZTE5YzNiODE5MzBiNGIyNi4uOGJkYWRiMWY1YjFjY2RjZGUyNGMxMmFkYzBjYjU2
NzA2ZjAxODU4NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvQ2hhbmdlTG9nCisrKyBiL1Nv
dXJjZS9XZWJDb3JlL0NoYW5nZUxvZwpAQCAtMSwzICsxLDE3OSBAQAorMjAxMy0wMi0xMyAgQW5k
cmV5IEFkYWlraW4gIDxhYW5kcmV5QGNocm9taXVtLm9yZz4KKworICAgICAgICBMb29rIGludG8g
cG9zc2liaWxpdGllcyBvZiB0eXBlZGVmIGluIHdlYmtpdCBpZGwgZmlsZXMKKyAgICAgICAgaHR0
cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTUyMzQwCisKKyAgICAgICAgUmV2
aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgQWRkIHR5cGVkZWYgc3VwcG9ydCBm
b3IgV2ViS2l0IElETCBwYXJzZXIuCisgICAgICAgIERyaXZlIGJ5OiBmaXhlZCBhIGJ1ZyBvZiBn
ZW5lcmF0aW5nICJ1bnJlc3RyaWN0ZWRmbG9hdCIgd2l0aG91dCBhIHNwYWNlLgorCisgICAgICAg
IEFkZGVkIGEgbmV3IElETCB0ZXN0IFRlc3RUeXBlZGVmcy5pZGwuIFRoZSByZXN1bHRzIHdlcmUg
Z2VuZXJhdGVkIHdpdGhvdXQgdHlwZWRlZnMuCisKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRz
L0lETFBhcnNlci5wbToKKyAgICAgICAgKGFzc2VydE5vRXh0ZW5kZWRBdHRyaWJ1dGVzSW5UeXBl
ZGVmKToKKyAgICAgICAgKHBhcnNlRGVmaW5pdGlvbnMpOgorICAgICAgICAoYXBwbHlUeXBlZGVm
cyk6CisgICAgICAgIChhcHBseVR5cGVkZWZzRm9yU2lnbmF0dXJlKToKKyAgICAgICAgKHBhcnNl
VHlwZWRlZik6CisgICAgICAgIChwYXJzZVVucmVzdHJpY3RlZEZsb2F0VHlwZSk6CisgICAgICAg
ICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMuY3BwOiBBZGRl
ZC4KKyAgICAgICAgKFdlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0
ZTo6V2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSk6CisgICAgICAgIChXZWJET01UZXN0VHlwZWRl
ZnM6OldlYkRPTVRlc3RUeXBlZGVmc1ByaXZhdGUpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVk
ZWZzOjpXZWJET01UZXN0VHlwZWRlZnMpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpv
cGVyYXRvcj0pOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjppbXBsKToKKyAgICAgICAg
KFdlYkRPTVRlc3RUeXBlZGVmczo6fldlYkRPTVRlc3RUeXBlZGVmcyk6CisgICAgICAgIChXZWJE
T01UZXN0VHlwZWRlZnM6OnVuc2lnbmVkTG9uZ0xvbmdBdHRyKToKKyAgICAgICAgKFdlYkRPTVRl
c3RUeXBlZGVmczo6c2V0VW5zaWduZWRMb25nTG9uZ0F0dHIpOgorICAgICAgICAoV2ViRE9NVGVz
dFR5cGVkZWZzOjppbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAgICAgICAoV2Vi
RE9NVGVzdFR5cGVkZWZzOjpzZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpOgorICAg
ICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpmdW5jKToKKyAgICAgICAgKFdlYkRPTVRlc3RUeXBl
ZGVmczo6bXVsdGlUcmFuc2Zlckxpc3QpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpz
ZXRTaGFkb3cpOgorICAgICAgICAoV2ViRE9NVGVzdFR5cGVkZWZzOjpudWxsYWJsZUFycmF5QXJn
KToKKyAgICAgICAgKFdlYkRPTVRlc3RUeXBlZGVmczo6aW1tdXRhYmxlUG9pbnRGdW5jdGlvbik6
CisgICAgICAgICh0b1dlYkNvcmUpOgorICAgICAgICAodG9XZWJLaXQpOgorICAgICAgICAqIGJp
bmRpbmdzL3NjcmlwdHMvdGVzdC9DUFAvV2ViRE9NVGVzdFR5cGVkZWZzLmg6IEFkZGVkLgorICAg
ICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJET01UZXN0VHlwZWRlZnMpOgorICAgICAgICAq
IGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmcy5jcHA6
IEFkZGVkLgorICAgICAgICAoX1dlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUpOgorICAgICAg
ICAoV2ViS2l0KToKKyAgICAgICAgKFdlYktpdDo6a2l0KToKKyAgICAgICAgKFdlYktpdDo6Y29y
ZSk6CisgICAgICAgIChXZWJLaXQ6OndyYXBUZXN0VHlwZWRlZnMpOgorICAgICAgICAod2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2ZpbmFsaXplKToKKyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90
eXBlZGVmc19zZXRfcHJvcGVydHkpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X2dldF9wcm9wZXJ0eSk6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfY29uc3Ry
dWN0b3IpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2NsYXNzX2luaXQpOgor
ICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2luaXQpOgorICAgICAgICAod2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX2Z1bmMpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX211bHRpX3RyYW5zZmVyX2xpc3QpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX3NldF9zaGFkb3cpOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX251bGxh
YmxlX2FycmF5X2FyZyk6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfaW1tdXRh
YmxlX3BvaW50X2Z1bmN0aW9uKToKKyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19z
dHJpbmdfYXJyYXlfZnVuY3Rpb24pOgorICAgICAgICAod2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X2dldF91bnNpZ25lZF9sb25nX2xvbmdfYXR0cik6CisgICAgICAgICh3ZWJraXRfZG9tX3Rlc3Rf
dHlwZWRlZnNfc2V0X3Vuc2lnbmVkX2xvbmdfbG9uZ19hdHRyKToKKyAgICAgICAgKHdlYmtpdF9k
b21fdGVzdF90eXBlZGVmc19nZXRfaW1tdXRhYmxlX3NlcmlhbGl6ZWRfc2NyaXB0X3ZhbHVlKToK
KyAgICAgICAgKHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfaW1tdXRhYmxlX3NlcmlhbGl6
ZWRfc2NyaXB0X3ZhbHVlKToKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvR09iamVj
dC9XZWJLaXRET01UZXN0VHlwZWRlZnMuaDogQWRkZWQuCisgICAgICAgIChfV2ViS2l0RE9NVGVz
dFR5cGVkZWZzKToKKyAgICAgICAgKF9XZWJLaXRET01UZXN0VHlwZWRlZnNDbGFzcyk6CisgICAg
ICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZz
UHJpdmF0ZS5oOiBBZGRlZC4KKyAgICAgICAgKFdlYktpdCk6CisgICAgICAgICogYmluZGluZ3Mv
c2NyaXB0cy90ZXN0L0pTL0pTVGVzdFR5cGVkZWZzLmNwcDogQWRkZWQuCisgICAgICAgIChXZWJD
b3JlKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmNvbnN0
cnVjdEpTVGVzdFR5cGVkZWZzKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29u
c3RydWN0b3I6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IpOgorICAgICAgICAoV2ViQ29yZTo6
SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6ZmluaXNoQ3JlYXRpb24pOgorICAgICAgICAoV2Vi
Q29yZTo6SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6Z2V0T3duUHJvcGVydHlTbG90KToKKyAg
ICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmdldE93blByb3BlcnR5
RGVzY3JpcHRvcik6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9y
OjpnZXRDb25zdHJ1Y3REYXRhKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJv
dG90eXBlOjpzZWxmKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJvdG90eXBl
OjpnZXRPd25Qcm9wZXJ0eVNsb3QpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNQ
cm90b3R5cGU6OmdldE93blByb3BlcnR5RGVzY3JpcHRvcik6CisgICAgICAgIChXZWJDb3JlOjpK
U1Rlc3RUeXBlZGVmczo6SlNUZXN0VHlwZWRlZnMpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0
VHlwZWRlZnM6OmZpbmlzaENyZWF0aW9uKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVk
ZWZzOjpjcmVhdGVQcm90b3R5cGUpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6
OmRlc3Ryb3kpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6On5KU1Rlc3RUeXBl
ZGVmcyk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Z2V0T3duUHJvcGVydHlT
bG90KToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpnZXRPd25Qcm9wZXJ0eURl
c2NyaXB0b3IpOgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdM
b25nQXR0cik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0ltbXV0YWJsZVNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0NvbnN0
cnVjdG9yVGVzdFN1Yk9iaik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc0NvbnN0
cnVjdG9yKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpwdXQpOgorICAgICAg
ICAoV2ViQ29yZTo6c2V0SlNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdMb25nQXR0cik6CisgICAg
ICAgIChXZWJDb3JlOjpzZXRKU1Rlc3RUeXBlZGVmc0ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZSk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Z2V0Q29uc3RydWN0b3Ip
OgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbkZ1bmMp
OgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk11bHRp
VHJhbnNmZXJMaXN0KToKKyAgICAgICAgKFdlYkNvcmU6OmpzVGVzdFR5cGVkZWZzUHJvdG90eXBl
RnVuY3Rpb25TZXRTaGFkb3cpOgorICAgICAgICAoV2ViQ29yZTo6anNUZXN0VHlwZWRlZnNQcm90
b3R5cGVGdW5jdGlvbk1ldGhvZFdpdGhTZXF1ZW5jZUFyZyk6CisgICAgICAgIChXZWJDb3JlOjpq
c1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uTnVsbGFibGVBcnJheUFyZyk6CisgICAgICAg
IChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uRnVuY1dpdGhDbGFtcCk6
CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uSW1tdXRh
YmxlUG9pbnRGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjpqc1Rlc3RUeXBlZGVmc1Byb3Rv
dHlwZUZ1bmN0aW9uU3RyaW5nQXJyYXlGdW5jdGlvbik6CisgICAgICAgIChXZWJDb3JlOjppc09i
c2VydmFibGUpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNPd25lcjo6aXNSZWFj
aGFibGVGcm9tT3BhcXVlUm9vdHMpOgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNP
d25lcjo6ZmluYWxpemUpOgorICAgICAgICAoV2ViQ29yZTo6dG9KUyk6CisgICAgICAgIChXZWJD
b3JlOjp0b1Rlc3RUeXBlZGVmcyk6CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pT
L0pTVGVzdFR5cGVkZWZzLmg6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChK
U1Rlc3RUeXBlZGVmcyk6CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmczo6Y3JlYXRl
KToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzOjpjcmVhdGVTdHJ1Y3R1cmUpOgor
ICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnM6OmltcGwpOgorICAgICAgICAoV2ViQ29y
ZTo6SlNUZXN0VHlwZWRlZnM6OnJlbGVhc2VJbXBsKToKKyAgICAgICAgKFdlYkNvcmU6OkpTVGVz
dFR5cGVkZWZzOjpyZWxlYXNlSW1wbElmTm90TnVsbCk6CisgICAgICAgIChKU1Rlc3RUeXBlZGVm
c093bmVyKToKKyAgICAgICAgKFdlYkNvcmU6OndyYXBwZXJPd25lcik6CisgICAgICAgIChXZWJD
b3JlOjp3cmFwcGVyQ29udGV4dCk6CisgICAgICAgIChKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSk6
CisgICAgICAgIChXZWJDb3JlOjpKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZTo6Y3JlYXRlKToKKyAg
ICAgICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzUHJvdG90eXBlOjpjcmVhdGVTdHJ1Y3R1cmUp
OgorICAgICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6OkpTVGVzdFR5cGVk
ZWZzUHJvdG90eXBlKToKKyAgICAgICAgKEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IpOgorICAg
ICAgICAoV2ViQ29yZTo6SlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6Y3JlYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OkpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OmNyZWF0ZVN0cnVjdHVyZSk6
CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLmg6
IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBl
ZGVmcy5tbTogQWRkZWQuCisgICAgICAgICgtW0RPTVRlc3RUeXBlZGVmcyBkZWFsbG9jXSk6Cisg
ICAgICAgICgtW0RPTVRlc3RUeXBlZGVmcyBmaW5hbGl6ZV0pOgorICAgICAgICAoLVtET01UZXN0
VHlwZWRlZnMgdW5zaWduZWRMb25nTG9uZ0F0dHJdKToKKyAgICAgICAgKC1bRE9NVGVzdFR5cGVk
ZWZzIHNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyOl0pOgorICAgICAgICAoLVtET01UZXN0VHlwZWRl
ZnMgaW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlXSk6CisgICAgICAgICgtW0RPTVRlc3RU
eXBlZGVmcyBzZXRJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWU6XSk6CisgICAgICAgICgt
W0RPTVRlc3RUeXBlZGVmcyBtdWx0aVRyYW5zZmVyTGlzdDp0eDpzZWNvbmQ6dHh4Ol0pOgorICAg
ICAgICAoLVtET01UZXN0VHlwZWRlZnMgc2V0U2hhZG93OmhlaWdodDpibHVyOmNvbG9yOmFscGhh
Ol0pOgorICAgICAgICAoLVtET01UZXN0VHlwZWRlZnMgaW1tdXRhYmxlUG9pbnRGdW5jdGlvbl0p
OgorICAgICAgICAoY29yZSk6CisgICAgICAgIChraXQpOgorICAgICAgICAqIGJpbmRpbmdzL3Nj
cmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBlZGVmc0ludGVybmFsLmg6IEFkZGVkLgorICAgICAg
ICAoV2ViQ29yZSk6CisgICAgICAgICogYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RUeXBlZGVm
cy5pZGw6IEFkZGVkLgorICAgICAgICAqIGJpbmRpbmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RU
eXBlZGVmcy5jcHA6IEFkZGVkLgorICAgICAgICAoV2ViQ29yZSk6CisgICAgICAgIChXZWJDb3Jl
OjpjaGVja1R5cGVPckRpZVRyeWluZyk6CisgICAgICAgIChUZXN0VHlwZWRlZnNWOEludGVybmFs
KToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6OlY4X1VTRSk6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNWOEludGVybmFsOjp1bnNpZ25lZExvbmdMb25n
QXR0ckF0dHJHZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5h
bDo6dW5zaWduZWRMb25nTG9uZ0F0dHJBdHRyU2V0dGVyKToKKyAgICAgICAgKFdlYkNvcmU6OlRl
c3RUeXBlZGVmc1Y4SW50ZXJuYWw6OmltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZUF0dHJH
ZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6aW1tdXRh
YmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlQXR0clNldHRlcik6CisgICAgICAgIChXZWJDb3JlOjpU
ZXN0VHlwZWRlZnNWOEludGVybmFsOjpUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvckdldHRlcik6Cisg
ICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNWOEludGVybmFsOjpUZXN0VHlwZWRlZnNSZXBs
YWNlYWJsZUF0dHJTZXR0ZXIpOgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRl
cm5hbDo6ZnVuY0NhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50
ZXJuYWw6Om11bHRpVHJhbnNmZXJMaXN0Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29yZTo6VGVz
dFR5cGVkZWZzVjhJbnRlcm5hbDo6c2V0U2hhZG93Q2FsbGJhY2spOgorICAgICAgICAoV2ViQ29y
ZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6bWV0aG9kV2l0aFNlcXVlbmNlQXJnQ2FsbGJhY2sp
OgorICAgICAgICAoV2ViQ29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6bnVsbGFibGVBcnJh
eUFyZ0NhbGxiYWNrKToKKyAgICAgICAgKFdlYkNvcmU6OlRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6
OmZ1bmNXaXRoQ2xhbXBDYWxsYmFjayk6CisgICAgICAgIChXZWJDb3JlOjpUZXN0VHlwZWRlZnNW
OEludGVybmFsOjppbW11dGFibGVQb2ludEZ1bmN0aW9uQ2FsbGJhY2spOgorICAgICAgICAoV2Vi
Q29yZTo6VGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6c3RyaW5nQXJyYXlGdW5jdGlvbkNhbGxiYWNr
KToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjpjb25zdHJ1Y3RvckNhbGxiYWNr
KToKKyAgICAgICAgKFdlYkNvcmU6OkNvbmZpZ3VyZVY4VGVzdFR5cGVkZWZzVGVtcGxhdGUpOgor
ICAgICAgICAoV2ViQ29yZTo6VjhUZXN0VHlwZWRlZnM6OkdldFJhd1RlbXBsYXRlKToKKyAgICAg
ICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjpHZXRUZW1wbGF0ZSk6CisgICAgICAgIChXZWJD
b3JlOjpWOFRlc3RUeXBlZGVmczo6SGFzSW5zdGFuY2UpOgorICAgICAgICAoV2ViQ29yZTo6VjhU
ZXN0VHlwZWRlZnM6OmNyZWF0ZVdyYXBwZXIpOgorICAgICAgICAoV2ViQ29yZTo6VjhUZXN0VHlw
ZWRlZnM6OmRlcmVmT2JqZWN0KToKKyAgICAgICAgKiBiaW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgv
VjhUZXN0VHlwZWRlZnMuaDogQWRkZWQuCisgICAgICAgIChXZWJDb3JlKToKKyAgICAgICAgKFY4
VGVzdFR5cGVkZWZzKToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjp0b05hdGl2
ZSk6CisgICAgICAgIChXZWJDb3JlOjpWOFRlc3RUeXBlZGVmczo6aW5zdGFsbFBlckNvbnRleHRQ
cm9wZXJ0aWVzKToKKyAgICAgICAgKFdlYkNvcmU6OlY4VGVzdFR5cGVkZWZzOjppbnN0YWxsUGVy
Q29udGV4dFByb3RvdHlwZVByb3BlcnRpZXMpOgorICAgICAgICAoV2ViQ29yZTo6d3JhcCk6Cisg
ICAgICAgIChXZWJDb3JlOjp0b1Y4KToKKyAgICAgICAgKFdlYkNvcmU6OnRvVjhGYXN0KToKKwog
MjAxMy0wMi0xMiAgUmFmYWVsIFdlaW5zdGVpbiAgPHJhZmFlbHdAY2hyb21pdW0ub3JnPgogCiAg
ICAgICAgIFtIVE1MVGVtcGxhdGVFbGVtZW50XSA8dGVtcGxhdGU+IGluc2lkZSBvZiA8aGVhZD4g
bWF5IG5vdCBjcmVhdGUgPGJvZHk+IGlmIEVPRiBpcyBoaXQKZGlmZiAtLWdpdCBhL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvSURMUGFyc2VyLnBtIGIvU291cmNlL1dlYkNvcmUvYmlu
ZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIucG0KaW5kZXggNmFlOGI5ZTBkZDJjZjk4Mjg4MThjYTIx
YmI3ZWJkYjA3NjI5NjI2Yy4uN2Y1ODNhNDVmOTA1NTQzMmRkYTg1MWNmY2VlOTM3M2E5NzZiNzJh
NCAxMDA2NDQKLS0tIGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIu
cG0KKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy9JRExQYXJzZXIucG0KQEAg
LTQ4LDcgKzQ4LDcgQEAgc3RydWN0KCBkb21JbnRlcmZhY2UgPT4gewogICAgIGZ1bmN0aW9ucyA9
PiAnQCcsICAgICMgTGlzdCBvZiAnZG9tRnVuY3Rpb24nCiAgICAgYXR0cmlidXRlcyA9PiAnQCcs
ICAgICMgTGlzdCBvZiAnZG9tQXR0cmlidXRlJyAgICAKICAgICBleHRlbmRlZEF0dHJpYnV0ZXMg
PT4gJyQnLCAjIEV4dGVuZGVkIGF0dHJpYnV0ZXMKLSAgICBjb25zdHJ1Y3RvcnMgPT4gJ0AnLCAj
IENvbnN0cnVjdG9yCisgICAgY29uc3RydWN0b3JzID0+ICdAJywgIyBDb25zdHJ1Y3RvcnMsIGxp
c3Qgb2YgJ2RvbUZ1bmN0aW9uJwogICAgIGlzRXhjZXB0aW9uID0+ICckJywgIyBVc2VkIGZvciBl
eGNlcHRpb24gaW50ZXJmYWNlcwogfSk7CiAKQEAgLTk4LDYgKzk4LDE0IEBAIHN0cnVjdCggVG9r
ZW4gPT4gewogICAgIHZhbHVlID0+ICckJyAjIHZhbHVlIG9mIHRva2VuCiB9KTsKIAorc3RydWN0
KCBUeXBlZGVmID0+IHsKKyAgICBleHRlbmRlZEF0dHJpYnV0ZXMgPT4gJyQnLCAjIEV4dGVuZGVk
IGF0dHJpYnV0ZXMKKyAgICB0eXBlID0+ICckJywgIyBUeXBlIG9mIGRhdGEKK30pOworCisjIE1h
cHMgJ3R5cGVkZWYgbmFtZScgLT4gVHlwZWRlZgorbXkgJXR5cGVkZWZzID0gKCk7CisKIHN1YiBu
ZXcgewogICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogCkBAIC0xNDksNiArMTU3LDE5IEBAIHN1YiBh
c3NlcnRVbmV4cGVjdGVkVG9rZW4KICAgICBkaWUgJG1zZzsKIH0KIAorc3ViIGFzc2VydE5vRXh0
ZW5kZWRBdHRyaWJ1dGVzSW5UeXBlZGVmCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBt
eSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRsaW5lID0gc2hpZnQ7CisgICAgbXkgJHR5cGVkZWYg
PSAkdHlwZWRlZnN7JG5hbWV9OworICAgIG15ICRtc2cgPSAiVW5leHBlY3RlZCBleHRlbmRlZEF0
dHJpYnV0ZUxpc3QgaW4gdHlwZWRlZiBcIiRuYW1lXCIgYXQgIiAuICRzZWxmLT57TGluZX07Cisg
ICAgaWYgKGRlZmluZWQgKCRsaW5lKSkgeworICAgICAgICAkbXNnIC49ICIgSURMUGFyc2VyLnBt
OiIgLiAkbGluZTsKKyAgICB9CisgICAgZGllICRtc2cgaWYgJXskdHlwZWRlZi0+ZXh0ZW5kZWRB
dHRyaWJ1dGVzfTsKK30KKwogc3ViIFBhcnNlCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKQEAg
LTMyMiw5ICszNDMsNzMgQEAgc3ViIHBhcnNlRGVmaW5pdGlvbnMKICAgICAgICAgICAgIHB1c2go
QGRlZmluaXRpb25zLCAkZGVmaW5pdGlvbik7CiAgICAgICAgIH0KICAgICB9CisgICAgJHNlbGYt
PmFwcGx5VHlwZWRlZnMoXEBkZWZpbml0aW9ucyk7CiAgICAgcmV0dXJuIFxAZGVmaW5pdGlvbnM7
CiB9CiAKK3N1YiBhcHBseVR5cGVkZWZzCit7CisgICAgbXkgJHNlbGYgPSBzaGlmdDsKKyAgICBt
eSAkZGVmaW5pdGlvbnMgPSBzaGlmdDsKKyAgIAorICAgIGlmICghJXR5cGVkZWZzKSB7CisgICAg
ICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yZWFjaCBteSAkZGVmaW5pdGlvbiAoQCRkZWZpbml0
aW9ucykgeworICAgICAgICBpZiAocmVmKCRkZWZpbml0aW9uKSBlcSAiZG9tSW50ZXJmYWNlIikg
eworICAgICAgICAgICAgZm9yZWFjaCBteSAkY29uc3RhbnQgKEB7JGRlZmluaXRpb24tPmNvbnN0
YW50c30pIHsKKyAgICAgICAgICAgICAgICBpZiAoZXhpc3RzICR0eXBlZGVmc3skY29uc3RhbnQt
PnR5cGV9KSB7CisgICAgICAgICAgICAgICAgICAgIG15ICR0eXBlZGVmID0gJHR5cGVkZWZzeyRj
b25zdGFudC0+dHlwZX07CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5hc3NlcnROb0V4dGVu
ZGVkQXR0cmlidXRlc0luVHlwZWRlZigkY29uc3RhbnQtPnR5cGUsIF9fTElORV9fKTsKKyAgICAg
ICAgICAgICAgICAgICAgJGNvbnN0YW50LT50eXBlKCR0eXBlZGVmLT50eXBlKTsKKyAgICAgICAg
ICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3JlYWNoIG15ICRhdHRyaWJ1
dGUgKEB7JGRlZmluaXRpb24tPmF0dHJpYnV0ZXN9KSB7CisgICAgICAgICAgICAgICAgJHNlbGYt
PmFwcGx5VHlwZWRlZnNGb3JTaWduYXR1cmUoJGF0dHJpYnV0ZS0+c2lnbmF0dXJlKTsKKyAgICAg
ICAgICAgIH0KKyAgICAgICAgICAgIGZvcmVhY2ggbXkgJGZ1bmN0aW9uIChAeyRkZWZpbml0aW9u
LT5mdW5jdGlvbnN9LCBAeyRkZWZpbml0aW9uLT5jb25zdHJ1Y3RvcnN9KSB7CisgICAgICAgICAg
ICAgICAgJHNlbGYtPmFwcGx5VHlwZWRlZnNGb3JTaWduYXR1cmUoJGZ1bmN0aW9uLT5zaWduYXR1
cmUpOworICAgICAgICAgICAgICAgIGZvcmVhY2ggbXkgJHNpZ25hdHVyZSAoQHskZnVuY3Rpb24t
PnBhcmFtZXRlcnN9KSB7CisgICAgICAgICAgICAgICAgICAgICRzZWxmLT5hcHBseVR5cGVkZWZz
Rm9yU2lnbmF0dXJlKCRzaWduYXR1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAg
IH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3ViIGFwcGx5VHlwZWRlZnNGb3JTaWduYXR1cmUK
K3sKKyAgICBteSAkc2VsZiA9IHNoaWZ0OworICAgIG15ICRzaWduYXR1cmUgPSBzaGlmdDsKKwor
ICAgIGlmICghZGVmaW5lZCAoJHNpZ25hdHVyZS0+dHlwZSkpIHsKKyAgICAgICAgcmV0dXJuOwor
ICAgIH0KKworICAgIG15ICR0eXBlID0gJHNpZ25hdHVyZS0+dHlwZTsKKyAgICAkdHlwZSA9fiBz
L1tcP1xbXF1dKyQvL2c7CisgICAgbXkgJHR5cGVTdWZmaXggPSAkc2lnbmF0dXJlLT50eXBlOwor
ICAgICR0eXBlU3VmZml4ID1+IHMvXlteXD9cW1xdXSsvL2c7CisgICAgaWYgKGV4aXN0cyAkdHlw
ZWRlZnN7JHR5cGV9KSB7CisgICAgICAgIG15ICR0eXBlZGVmID0gJHR5cGVkZWZzeyR0eXBlfTsK
KyAgICAgICAgJHNpZ25hdHVyZS0+dHlwZSgkdHlwZWRlZi0+dHlwZSAuICR0eXBlU3VmZml4KTsK
KyAgICAgICAgY29weUV4dGVuZGVkQXR0cmlidXRlcygkc2lnbmF0dXJlLT5leHRlbmRlZEF0dHJp
YnV0ZXMsICR0eXBlZGVmLT5leHRlbmRlZEF0dHJpYnV0ZXMpOworICAgIH0KKworICAgICMgSGFu
ZGxlIHVuaW9uIHR5cGVzLCBzZXF1ZW5jZXMgYW5kIGV0Yy4KKyAgICBmb3JlYWNoIG15ICRuYW1l
ICgldHlwZWRlZnMpIHsKKyAgICAgICAgaWYgKCFleGlzdHMgJHR5cGVkZWZzeyRuYW1lfSkgewor
ICAgICAgICAgICAgbmV4dDsKKyAgICAgICAgfQorICAgICAgICBteSAkdHlwZWRlZiA9ICR0eXBl
ZGVmc3skbmFtZX07CisgICAgICAgIG15ICRyZWdleCA9ICdcXGInIC4gJG5hbWUgLiAnXFxiJzsK
KyAgICAgICAgbXkgJHJlcGxhY2VtZW50ID0gJHR5cGVkZWYtPnR5cGU7CisgICAgICAgIG15ICR0
eXBlID0gJHNpZ25hdHVyZS0+dHlwZTsKKyAgICAgICAgJHR5cGUgPX4gcy8oJHJlZ2V4KS8kcmVw
bGFjZW1lbnQvZzsKKyAgICAgICAgJHNpZ25hdHVyZS0+dHlwZSgkdHlwZSk7CisgICAgfQorfQor
CiBzdWIgcGFyc2VEZWZpbml0aW9uCiB7CiAgICAgbXkgJHNlbGYgPSBzaGlmdDsKQEAgLTcyNiwx
NCArODExLDIwIEBAIHN1YiBwYXJzZVR5cGVkZWYKIHsKICAgICBteSAkc2VsZiA9IHNoaWZ0Owog
ICAgIG15ICRleHRlbmRlZEF0dHJpYnV0ZUxpc3QgPSBzaGlmdDsKKyAgICBkaWUgIkV4dGVuZGVk
IGF0dHJpYnV0ZXMgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIHR5cGVkZWZzIHRoZW1zZWx2ZXM6ICIg
LiAkc2VsZi0+e0xpbmV9IGlmICV7JGV4dGVuZGVkQXR0cmlidXRlTGlzdH07CiAKICAgICBteSAk
bmV4dCA9ICRzZWxmLT5uZXh0VG9rZW4oKTsKICAgICBpZiAoJG5leHQtPnZhbHVlKCkgZXEgInR5
cGVkZWYiKSB7CiAgICAgICAgICRzZWxmLT5hc3NlcnRUb2tlblZhbHVlKCRzZWxmLT5nZXRUb2tl
bigpLCAidHlwZWRlZiIsIF9fTElORV9fKTsKLSAgICAgICAgJHNlbGYtPnBhcnNlRXh0ZW5kZWRB
dHRyaWJ1dGVMaXN0KCk7Ci0gICAgICAgICRzZWxmLT5wYXJzZVR5cGUoKTsKLSAgICAgICAgJHNl
bGYtPmFzc2VydFRva2VuVHlwZSgkc2VsZi0+Z2V0VG9rZW4oKSwgSWRlbnRpZmllclRva2VuKTsK
KyAgICAgICAgbXkgJHR5cGVkZWYgPSBUeXBlZGVmLT5uZXcoKTsKKyAgICAgICAgJHR5cGVkZWYt
PmV4dGVuZGVkQXR0cmlidXRlcygkc2VsZi0+cGFyc2VFeHRlbmRlZEF0dHJpYnV0ZUxpc3RBbGxv
d0VtcHR5KCkpOworICAgICAgICAkdHlwZWRlZi0+dHlwZSgkc2VsZi0+cGFyc2VUeXBlKCkpOwor
ICAgICAgICBteSAkbmFtZVRva2VuID0gJHNlbGYtPmdldFRva2VuKCk7CisgICAgICAgICRzZWxm
LT5hc3NlcnRUb2tlblR5cGUoJG5hbWVUb2tlbiwgSWRlbnRpZmllclRva2VuKTsKICAgICAgICAg
JHNlbGYtPmFzc2VydFRva2VuVmFsdWUoJHNlbGYtPmdldFRva2VuKCksICI7IiwgX19MSU5FX18p
OworICAgICAgICBteSAkbmFtZSA9ICRuYW1lVG9rZW4tPnZhbHVlKCk7CisgICAgICAgIGRpZSAi
dHlwZWRlZiByZWRlZmluaXRpb24gZm9yICIgLiAkbmFtZSAuICIgYXQgIiAuICRzZWxmLT57TGlu
ZX0gaWYgZXhpc3RzICR0eXBlZGVmc3skbmFtZX07CisgICAgICAgICR0eXBlZGVmc3skbmFtZX0g
PSAkdHlwZWRlZjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAkc2VsZi0+YXNzZXJ0VW5l
eHBlY3RlZFRva2VuKCRuZXh0LT52YWx1ZSgpLCBfX0xJTkVfXyk7CkBAIC0xODAzLDcgKzE4OTQs
NyBAQCBzdWIgcGFyc2VVbnJlc3RyaWN0ZWRGbG9hdFR5cGUKICAgICBteSAkbmV4dCA9ICRzZWxm
LT5uZXh0VG9rZW4oKTsKICAgICBpZiAoJG5leHQtPnZhbHVlKCkgZXEgInVucmVzdHJpY3RlZCIp
IHsKICAgICAgICAgJHNlbGYtPmFzc2VydFRva2VuVmFsdWUoJHNlbGYtPmdldFRva2VuKCksICJ1
bnJlc3RyaWN0ZWQiLCBfX0xJTkVfXyk7Ci0gICAgICAgIHJldHVybiAidW5yZXN0cmljdGVkIiAu
ICRzZWxmLT5wYXJzZUZsb2F0VHlwZSgpOworICAgICAgICByZXR1cm4gInVucmVzdHJpY3RlZCAi
IC4gJHNlbGYtPnBhcnNlRmxvYXRUeXBlKCk7CiAgICAgfQogICAgIGlmICgkbmV4dC0+dmFsdWUo
KSA9fiAvJG5leHRVbnJlc3RyaWN0ZWRGbG9hdFR5cGVfMS8pIHsKICAgICAgICAgcmV0dXJuICRz
ZWxmLT5wYXJzZUZsb2F0VHlwZSgpOwpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGlu
Z3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMuY3BwIGIvU291cmNlL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMuY3BwCm5ldyBm
aWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAuLmQwMTZhMzQ5MzgyMzllZTdlNjc4MzU1ZGIyZjNiMjQ3Y2NmMDNlMzkKLS0tIC9kZXYv
bnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvQ1BQL1dlYkRP
TVRlc3RUeXBlZGVmcy5jcHAKQEAgLTAsMCArMSwyNDUgQEAKKy8qCisgKiBUaGlzIGZpbGUgaXMg
cGFydCBvZiB0aGUgV2ViS2l0IG9wZW4gc291cmNlIHByb2plY3QuCisgKiBUaGlzIGZpbGUgaGFz
IGJlZW4gZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWJpbmRpbmdzLnBsLiBETyBOT1QgTU9ESUZZIQor
ICoKKyAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0
ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJy
YXJ5IEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBT
b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg
b3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIGxpYnJh
cnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAq
IGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJh
bnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBV
UlBPU0UuICBTZWUgdGhlIEdOVQorICogTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZv
ciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv
ZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0
aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8K
KyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVl
dCwgRmlmdGggRmxvb3IsCisgKiBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworCisj
aW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAiV2ViRE9NVGVzdFR5cGVkZWZzLmgiCisKKyNp
bmNsdWRlICJBcnJheS5oIgorI2luY2x1ZGUgIktVUkwuaCIKKyNpbmNsdWRlICJTVkdQb2ludC5o
IgorI2luY2x1ZGUgIlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorI2luY2x1ZGUgIldlYkRPTUFy
cmF5LmgiCisjaW5jbHVkZSAiV2ViRE9NU1ZHUG9pbnQuaCIKKyNpbmNsdWRlICJXZWJET01TdHJp
bmcuaCIKKyNpbmNsdWRlICJXZWJFeGNlcHRpb25IYW5kbGVyLmgiCisjaW5jbHVkZSAid3RmL3Rl
eHQvQXRvbWljU3RyaW5nLmgiCisjaW5jbHVkZSA8d3RmL0dldFB0ci5oPgorI2luY2x1ZGUgPHd0
Zi9SZWZQdHIuaD4KKworc3RydWN0IFdlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVk
ZWZzUHJpdmF0ZSB7CisgICAgV2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0ZShXZWJDb3JlOjpUZXN0
VHlwZWRlZnMqIG9iamVjdCA9IDApCisgICAgICAgIDogaW1wbChvYmplY3QpCisgICAgeworICAg
IH0KKworICAgIFJlZlB0cjxXZWJDb3JlOjpUZXN0VHlwZWRlZnM+IGltcGw7Cit9OworCitXZWJE
T01UZXN0VHlwZWRlZnM6OldlYkRPTVRlc3RUeXBlZGVmcygpCisgICAgOiBXZWJET01PYmplY3Qo
KQorICAgICwgbV9pbXBsKDApCit7Cit9CisKK1dlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVz
dFR5cGVkZWZzKFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaW1wbCkKKyAgICA6IFdlYkRPTU9iamVj
dCgpCisgICAgLCBtX2ltcGwobmV3IFdlYkRPTVRlc3RUeXBlZGVmc1ByaXZhdGUoaW1wbCkpCit7
Cit9CisKK1dlYkRPTVRlc3RUeXBlZGVmczo6V2ViRE9NVGVzdFR5cGVkZWZzKGNvbnN0IFdlYkRP
TVRlc3RUeXBlZGVmcyYgY29weSkKKyAgICA6IFdlYkRPTU9iamVjdCgpCit7CisgICAgbV9pbXBs
ID0gY29weS5pbXBsKCkgPyBuZXcgV2ViRE9NVGVzdFR5cGVkZWZzUHJpdmF0ZShjb3B5LmltcGwo
KSkgOiAwOworfQorCitXZWJET01UZXN0VHlwZWRlZnMmIFdlYkRPTVRlc3RUeXBlZGVmczo6b3Bl
cmF0b3I9KGNvbnN0IFdlYkRPTVRlc3RUeXBlZGVmcyYgY29weSkKK3sKKyAgICBkZWxldGUgbV9p
bXBsOworICAgIG1faW1wbCA9IGNvcHkuaW1wbCgpID8gbmV3IFdlYkRPTVRlc3RUeXBlZGVmc1By
aXZhdGUoY29weS5pbXBsKCkpIDogMDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK1dlYkNvcmU6
OlRlc3RUeXBlZGVmcyogV2ViRE9NVGVzdFR5cGVkZWZzOjppbXBsKCkgY29uc3QKK3sKKyAgICBy
ZXR1cm4gbV9pbXBsID8gV1RGOjpnZXRQdHIobV9pbXBsLT5pbXBsKSA6IDA7Cit9CisKK1dlYkRP
TVRlc3RUeXBlZGVmczo6fldlYkRPTVRlc3RUeXBlZGVmcygpCit7CisgICAgZGVsZXRlIG1faW1w
bDsKKyAgICBtX2ltcGwgPSAwOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgV2ViRE9NVGVzdFR5
cGVkZWZzOjp1bnNpZ25lZExvbmdMb25nQXR0cigpIGNvbnN0Cit7CisgICAgaWYgKCFpbXBsKCkp
CisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGltcGwoKS0+dW5zaWduZWRMb25nTG9u
Z0F0dHIoKTsKK30KKwordm9pZCBXZWJET01UZXN0VHlwZWRlZnM6OnNldFVuc2lnbmVkTG9uZ0xv
bmdBdHRyKHVuc2lnbmVkIGxvbmcgbG9uZyBuZXdVbnNpZ25lZExvbmdMb25nQXR0cikKK3sKKyAg
ICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW1wbCgpLT5zZXRVbnNpZ25l
ZExvbmdMb25nQXR0cihuZXdVbnNpZ25lZExvbmdMb25nQXR0cik7Cit9CisKK1dlYkRPTVN0cmlu
ZyBXZWJET01UZXN0VHlwZWRlZnM6OmltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpIGNv
bnN0Cit7CisgICAgaWYgKCFpbXBsKCkpCisgICAgICAgIHJldHVybiBXZWJET01TdHJpbmcoKTsK
KworICAgIHJldHVybiBpbXBsKCktPmltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpLT50
b1N0cmluZygpOworfQorCit2b2lkIFdlYkRPTVRlc3RUeXBlZGVmczo6c2V0SW1tdXRhYmxlU2Vy
aWFsaXplZFNjcmlwdFZhbHVlKGNvbnN0IFdlYkRPTVN0cmluZyYgbmV3SW1tdXRhYmxlU2VyaWFs
aXplZFNjcmlwdFZhbHVlKQoreworICAgIGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisK
KyAgICBpbXBsKCktPnNldEltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShXZWJDb3JlOjpT
ZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShXVEY6OlN0cmluZyhuZXdJbW11dGFibGVTZXJp
YWxpemVkU2NyaXB0VmFsdWUpKSk7Cit9CisKK2ludCBXZWJET01UZXN0VHlwZWRlZnM6OmF0dHJX
aXRoR2V0dGVyRXhjZXB0aW9uKCkgY29uc3QKK3sKKyAgICBpZiAoIWltcGwoKSkKKyAgICAgICAg
cmV0dXJuIDA7CisKKyAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBpbnQg
cmVzdWx0ID0gaW1wbCgpLT5hdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYyk7CisgICAgd2ViRE9N
UmFpc2VFcnJvcihzdGF0aWNfY2FzdDxXZWJET01FeGNlcHRpb25Db2RlPihlYykpOworICAgIHJl
dHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgV2ViRE9NVGVzdFR5cGVkZWZzOjpzZXRBdHRyV2l0aEdl
dHRlckV4Y2VwdGlvbihpbnQgbmV3QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24pCit7CisgICAgaWYg
KCFpbXBsKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGltcGwoKS0+c2V0QXR0cldpdGhHZXR0
ZXJFeGNlcHRpb24obmV3QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24pOworfQorCitpbnQgV2ViRE9N
VGVzdFR5cGVkZWZzOjphdHRyV2l0aFNldHRlckV4Y2VwdGlvbigpIGNvbnN0Cit7CisgICAgaWYg
KCFpbXBsKCkpCisgICAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIGltcGwoKS0+YXR0cldp
dGhTZXR0ZXJFeGNlcHRpb24oKTsKK30KKwordm9pZCBXZWJET01UZXN0VHlwZWRlZnM6OnNldEF0
dHJXaXRoU2V0dGVyRXhjZXB0aW9uKGludCBuZXdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbikKK3sK
KyAgICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6RXhjZXB0
aW9uQ29kZSBlYyA9IDA7CisgICAgaW1wbCgpLT5zZXRBdHRyV2l0aFNldHRlckV4Y2VwdGlvbihu
ZXdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbiwgZWMpOworICAgIHdlYkRPTVJhaXNlRXJyb3Ioc3Rh
dGljX2Nhc3Q8V2ViRE9NRXhjZXB0aW9uQ29kZT4oZWMpKTsKK30KKworV2ViRE9NU3RyaW5nIFdl
YkRPTVRlc3RUeXBlZGVmczo6c3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oKSBjb25zdAor
eworICAgIGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm4gV2ViRE9NU3RyaW5nKCk7CisKKyAg
ICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBXZWJET01TdHJpbmcgcmVzdWx0
ID0gaW1wbCgpLT5zdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYyk7CisgICAgd2ViRE9N
UmFpc2VFcnJvcihzdGF0aWNfY2FzdDxXZWJET01FeGNlcHRpb25Db2RlPihlYykpOworICAgIHJl
dHVybiBzdGF0aWNfY2FzdDxjb25zdCBXVEY6OlN0cmluZyY+KHJlc3VsdCk7Cit9CisKK3ZvaWQg
V2ViRE9NVGVzdFR5cGVkZWZzOjpzZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihjb25z
dCBXZWJET01TdHJpbmcmIG5ld1N0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKQoreworICAg
IGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbXBsKCktPnNldFN0cmluZ0F0
dHJXaXRoR2V0dGVyRXhjZXB0aW9uKG5ld1N0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKTsK
K30KKworV2ViRE9NU3RyaW5nIFdlYkRPTVRlc3RUeXBlZGVmczo6c3RyaW5nQXR0cldpdGhTZXR0
ZXJFeGNlcHRpb24oKSBjb25zdAoreworICAgIGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm4g
V2ViRE9NU3RyaW5nKCk7CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgV1RGOjpTdHJp
bmcmPihpbXBsKCktPnN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKCkpOworfQorCit2b2lk
IFdlYkRPTVRlc3RUeXBlZGVmczo6c2V0U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oY29u
c3QgV2ViRE9NU3RyaW5nJiBuZXdTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbikKK3sKKyAg
ICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6RXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgaW1wbCgpLT5zZXRTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlv
bihuZXdTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbiwgZWMpOworICAgIHdlYkRPTVJhaXNl
RXJyb3Ioc3RhdGljX2Nhc3Q8V2ViRE9NRXhjZXB0aW9uQ29kZT4oZWMpKTsKK30KKwordm9pZCBX
ZWJET01UZXN0VHlwZWRlZnM6OmZ1bmMoY29uc3QgV2ViRE9NbG9uZ1tdJiB4KQoreworICAgIGlm
ICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbXBsKCktPmZ1bmModG9XZWJDb3Jl
KHgpKTsKK30KKwordm9pZCBXZWJET01UZXN0VHlwZWRlZnM6Om11bHRpVHJhbnNmZXJMaXN0KGNv
bnN0IFdlYkRPTVN0cmluZyYgZmlyc3QsIGNvbnN0IFdlYkRPTUFycmF5JiB0eCwgY29uc3QgV2Vi
RE9NU3RyaW5nJiBzZWNvbmQsIGNvbnN0IFdlYkRPTUFycmF5JiB0eHgpCit7CisgICAgaWYgKCFp
bXBsKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGltcGwoKS0+bXVsdGlUcmFuc2Zlckxpc3Qo
V2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoV1RGOjpTdHJpbmcoZmlyc3Qp
KSwgdG9XZWJDb3JlKHR4KSwgV2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUo
V1RGOjpTdHJpbmcoc2Vjb25kKSksIHRvV2ViQ29yZSh0eHgpKTsKK30KKwordm9pZCBXZWJET01U
ZXN0VHlwZWRlZnM6OnNldFNoYWRvdyhmbG9hdCB3aWR0aCwgZmxvYXQgaGVpZ2h0LCBmbG9hdCBi
bHVyLCBjb25zdCBXZWJET01TdHJpbmcmIGNvbG9yLCBmbG9hdCBhbHBoYSkKK3sKKyAgICBpZiAo
IWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgaW1wbCgpLT5zZXRTaGFkb3cod2lkdGgs
IGhlaWdodCwgYmx1ciwgY29sb3IsIGFscGhhKTsKK30KKwordm9pZCBXZWJET01UZXN0VHlwZWRl
ZnM6Om51bGxhYmxlQXJyYXlBcmcoY29uc3QgV2ViRE9NRE9NU3RyaW5nW10mIGFycmF5QXJnKQor
eworICAgIGlmICghaW1wbCgpKQorICAgICAgICByZXR1cm47CisKKyAgICBpbXBsKCktPm51bGxh
YmxlQXJyYXlBcmcodG9XZWJDb3JlKGFycmF5QXJnKSk7Cit9CisKK1dlYkRPTVNWR1BvaW50IFdl
YkRPTVRlc3RUeXBlZGVmczo6aW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpCit7CisgICAgaWYgKCFp
bXBsKCkpCisgICAgICAgIHJldHVybiBXZWJET01TVkdQb2ludCgpOworCisgICAgcmV0dXJuIHRv
V2ViS2l0KFdURjo6Z2V0UHRyKGltcGwoKS0+aW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpKSk7Cit9
CisKK3ZvaWQgV2ViRE9NVGVzdFR5cGVkZWZzOjptZXRob2RXaXRoRXhjZXB0aW9uKCkKK3sKKyAg
ICBpZiAoIWltcGwoKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgV2ViQ29yZTo6RXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgaW1wbCgpLT5tZXRob2RXaXRoRXhjZXB0aW9uKGVjKTsKKyAgICB3
ZWJET01SYWlzZUVycm9yKHN0YXRpY19jYXN0PFdlYkRPTUV4Y2VwdGlvbkNvZGU+KGVjKSk7Cit9
CisKK1dlYkNvcmU6OlRlc3RUeXBlZGVmcyogdG9XZWJDb3JlKGNvbnN0IFdlYkRPTVRlc3RUeXBl
ZGVmcyYgd3JhcHBlcikKK3sKKyAgICByZXR1cm4gd3JhcHBlci5pbXBsKCk7Cit9CisKK1dlYkRP
TVRlc3RUeXBlZGVmcyB0b1dlYktpdChXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIHZhbHVlKQorewor
ICAgIHJldHVybiBXZWJET01UZXN0VHlwZWRlZnModmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0NQUC9XZWJET01UZXN0VHlwZWRlZnMu
aCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9DUFAvV2ViRE9NVGVzdFR5
cGVkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMC4uN2RjMTkyNThkN2ZjZTYyNTI1MTNiOTA4NzI5YTYyYzIyOWM3
OTFjNwotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMv
dGVzdC9DUFAvV2ViRE9NVGVzdFR5cGVkZWZzLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENv
cHlyaWdodCAoQykgUmVzZWFyY2ggSW4gTW90aW9uIExpbWl0ZWQgMjAxMC4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwNCwgMjAwNSwgMjAwNiwgMjAwNywgMjAwOCwg
MjAwOSBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMpIDIw
MDYgU2FtdWVsIFdlaW5pZyA8c2FtLndlaW5pZ0BnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMp
IFJlc2VhcmNoIEluIE1vdGlvbiBMaW1pdGVkIDIwMTAuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisg
KgorICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRl
IGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJh
cnkgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNv
ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICogdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv
ciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgbGlicmFy
eSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICog
YnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFu
dHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVS
UE9TRS4gIFNlZSB0aGUgR05VCisgKiBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9y
IG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9m
IHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRo
aXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bwor
ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0
LCBGaWZ0aCBGbG9vciwKKyAqIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNp
Zm5kZWYgV2ViRE9NVGVzdFR5cGVkZWZzX2gKKyNkZWZpbmUgV2ViRE9NVGVzdFR5cGVkZWZzX2gK
KworI2luY2x1ZGUgPFdlYkRPTU9iamVjdC5oPgorI2luY2x1ZGUgPFdlYkRPTVN0cmluZy5oPgor
CituYW1lc3BhY2UgV2ViQ29yZSB7CitjbGFzcyBUZXN0VHlwZWRlZnM7Cit9OworCitjbGFzcyBX
ZWJET01BcnJheTsKK2NsYXNzIFdlYkRPTURPTVN0cmluZ1tdOworY2xhc3MgV2ViRE9NU1ZHUG9p
bnQ7CitjbGFzcyBXZWJET01TdHJpbmc7CitjbGFzcyBXZWJET01sb25nW107CisKK2NsYXNzIFdl
YkRPTVRlc3RUeXBlZGVmcyA6IHB1YmxpYyBXZWJET01PYmplY3QgeworcHVibGljOgorICAgIFdl
YkRPTVRlc3RUeXBlZGVmcygpOworICAgIGV4cGxpY2l0IFdlYkRPTVRlc3RUeXBlZGVmcyhXZWJD
b3JlOjpUZXN0VHlwZWRlZnMqKTsKKyAgICBXZWJET01UZXN0VHlwZWRlZnMoY29uc3QgV2ViRE9N
VGVzdFR5cGVkZWZzJik7CisgICAgV2ViRE9NVGVzdFR5cGVkZWZzJiBvcGVyYXRvcj0oY29uc3Qg
V2ViRE9NVGVzdFR5cGVkZWZzJik7CisgICAgdmlydHVhbCB+V2ViRE9NVGVzdFR5cGVkZWZzKCk7
CisKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdW5zaWduZWRMb25nTG9uZ0F0dHIoKSBjb25zdDsK
KyAgICB2b2lkIHNldFVuc2lnbmVkTG9uZ0xvbmdBdHRyKHVuc2lnbmVkIGxvbmcgbG9uZyk7Cisg
ICAgV2ViRE9NU3RyaW5nIGltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpIGNvbnN0Owor
ICAgIHZvaWQgc2V0SW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKGNvbnN0IFdlYkRPTVN0
cmluZyYpOworICAgIGludCBhdHRyV2l0aEdldHRlckV4Y2VwdGlvbigpIGNvbnN0OworICAgIHZv
aWQgc2V0QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oaW50KTsKKyAgICBpbnQgYXR0cldpdGhTZXR0
ZXJFeGNlcHRpb24oKSBjb25zdDsKKyAgICB2b2lkIHNldEF0dHJXaXRoU2V0dGVyRXhjZXB0aW9u
KGludCk7CisgICAgV2ViRE9NU3RyaW5nIHN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKCkg
Y29uc3Q7CisgICAgdm9pZCBzZXRTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihjb25zdCBX
ZWJET01TdHJpbmcmKTsKKyAgICBXZWJET01TdHJpbmcgc3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNl
cHRpb24oKSBjb25zdDsKKyAgICB2b2lkIHNldFN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9u
KGNvbnN0IFdlYkRPTVN0cmluZyYpOworCisgICAgdm9pZCBmdW5jKGNvbnN0IFdlYkRPTWxvbmdb
XSYgeCk7CisgICAgdm9pZCBtdWx0aVRyYW5zZmVyTGlzdChjb25zdCBXZWJET01TdHJpbmcmIGZp
cnN0LCBjb25zdCBXZWJET01BcnJheSYgdHgsIGNvbnN0IFdlYkRPTVN0cmluZyYgc2Vjb25kLCBj
b25zdCBXZWJET01BcnJheSYgdHh4KTsKKyAgICB2b2lkIHNldFNoYWRvdyhmbG9hdCB3aWR0aCwg
ZmxvYXQgaGVpZ2h0LCBmbG9hdCBibHVyLCBjb25zdCBXZWJET01TdHJpbmcmIGNvbG9yLCBmbG9h
dCBhbHBoYSk7CisgICAgdm9pZCBudWxsYWJsZUFycmF5QXJnKGNvbnN0IFdlYkRPTURPTVN0cmlu
Z1tdJiBhcnJheUFyZyk7CisgICAgV2ViRE9NU1ZHUG9pbnQgaW1tdXRhYmxlUG9pbnRGdW5jdGlv
bigpOworICAgIHZvaWQgbWV0aG9kV2l0aEV4Y2VwdGlvbigpOworCisgICAgV2ViQ29yZTo6VGVz
dFR5cGVkZWZzKiBpbXBsKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgV2ViRE9N
VGVzdFR5cGVkZWZzUHJpdmF0ZTsKKyAgICBXZWJET01UZXN0VHlwZWRlZnNQcml2YXRlKiBtX2lt
cGw7Cit9OworCitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIHRvV2ViQ29yZShjb25zdCBXZWJET01U
ZXN0VHlwZWRlZnMmKTsKK1dlYkRPTVRlc3RUeXBlZGVmcyB0b1dlYktpdChXZWJDb3JlOjpUZXN0
VHlwZWRlZnMqKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5n
cy9zY3JpcHRzL3Rlc3QvR09iamVjdC9XZWJLaXRET01UZXN0VHlwZWRlZnMuY3BwIGIvU291cmNl
L1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi5iOTQ1OWEwMzI5NTQ5NjQyMjcxYmIyNjcxMjNhNWExOTMwMGVm
ZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90
ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZzLmNwcApAQCAtMCwwICsxLDQ5NSBAQAor
LyoKKyAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgV2ViS2l0IG9wZW4gc291cmNlIHByb2pl
Y3QuCisgICAgVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBnZW5lcmF0ZS1iaW5kaW5n
cy5wbC4gRE8gTk9UIE1PRElGWSEKKworICAgIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJl
OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhl
IHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMg
cHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZl
cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy
c2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0
IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91
dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJ
VE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5
IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91
bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGlj
IExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJ
TkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp
b24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsCisgICAgQm9zdG9uLCBN
QSAwMjExMC0xMzAxLCBVU0EuCisqLworCisjaW5jbHVkZSAiY29uZmlnLmgiCisjaW5jbHVkZSAi
V2ViS2l0RE9NVGVzdFR5cGVkZWZzLmgiCisKKyNpbmNsdWRlICJET01PYmplY3RDYWNoZS5oIgor
I2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNpbmNsdWRlICJKU01haW5UaHJlYWRFeGVjU3Rh
dGUuaCIKKyNpbmNsdWRlICJXZWJLaXRET01BcnJheVByaXZhdGUuaCIKKyNpbmNsdWRlICJXZWJL
aXRET01CaW5kaW5nLmgiCisjaW5jbHVkZSAiV2ViS2l0RE9NRE9NU3RyaW5nW11Qcml2YXRlLmgi
CisjaW5jbHVkZSAiV2ViS2l0RE9NU1ZHUG9pbnRQcml2YXRlLmgiCisjaW5jbHVkZSAiV2ViS2l0
RE9NU2VyaWFsaXplZFNjcmlwdFZhbHVlUHJpdmF0ZS5oIgorI2luY2x1ZGUgIldlYktpdERPTVRl
c3RUeXBlZGVmc1ByaXZhdGUuaCIKKyNpbmNsdWRlICJXZWJLaXRET01sb25nW11Qcml2YXRlLmgi
CisjaW5jbHVkZSAiZ29iamVjdC9Db252ZXJ0VG9VVEY4U3RyaW5nLmgiCisjaW5jbHVkZSA8d3Rm
L0dldFB0ci5oPgorI2luY2x1ZGUgPHd0Zi9SZWZQdHIuaD4KKworI2RlZmluZSBXRUJLSVRfRE9N
X1RFU1RfVFlQRURFRlNfR0VUX1BSSVZBVEUob2JqKSBHX1RZUEVfSU5TVEFOQ0VfR0VUX1BSSVZB
VEUob2JqLCBXRUJLSVRfVFlQRV9ET01fVEVTVF9UWVBFREVGUywgV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzUHJpdmF0ZSkKKwordHlwZWRlZiBzdHJ1Y3QgX1dlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZh
dGUgeworICAgIFJlZlB0cjxXZWJDb3JlOjpUZXN0VHlwZWRlZnM+IGNvcmVPYmplY3Q7Cit9IFdl
YktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGU7CisKK25hbWVzcGFjZSBXZWJLaXQgeworCitXZWJL
aXRET01UZXN0VHlwZWRlZnMqIGtpdChXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIG9iaikKK3sKKyAg
ICBpZiAoIW9iaikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoZ3BvaW50ZXIgcmV0ID0g
RE9NT2JqZWN0Q2FjaGU6OmdldChvYmopKQorICAgICAgICByZXR1cm4gV0VCS0lUX0RPTV9URVNU
X1RZUEVERUZTKHJldCk7CisKKyAgICByZXR1cm4gd3JhcFRlc3RUeXBlZGVmcyhvYmopOworfQor
CitXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGNvcmUoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiByZXF1
ZXN0KQoreworICAgIHJldHVybiByZXF1ZXN0ID8gc3RhdGljX2Nhc3Q8V2ViQ29yZTo6VGVzdFR5
cGVkZWZzKj4oV0VCS0lUX0RPTV9PQkpFQ1QocmVxdWVzdCktPmNvcmVPYmplY3QpIDogMDsKK30K
KworV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiB3cmFwVGVzdFR5cGVkZWZzKFdlYkNvcmU6OlRlc3RU
eXBlZGVmcyogY29yZU9iamVjdCkKK3sKKyAgICBBU1NFUlQoY29yZU9iamVjdCk7CisgICAgcmV0
dXJuIFdFQktJVF9ET01fVEVTVF9UWVBFREVGUyhnX29iamVjdF9uZXcoV0VCS0lUX1RZUEVfRE9N
X1RFU1RfVFlQRURFRlMsICJjb3JlLW9iamVjdCIsIGNvcmVPYmplY3QsIE5VTEwpKTsKK30KKwor
fSAvLyBuYW1lc3BhY2UgV2ViS2l0CisKK0dfREVGSU5FX1RZUEUoV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzLCB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnMsIFdFQktJVF9UWVBFX0RPTV9PQkpFQ1QpCisK
K2VudW0geworICAgIFBST1BfMCwKKyAgICBQUk9QX1VOU0lHTkVEX0xPTkdfTE9OR19BVFRSLAor
ICAgIFBST1BfSU1NVVRBQkxFX1NFUklBTElaRURfU0NSSVBUX1ZBTFVFLAorICAgIFBST1BfQVRU
Ul9XSVRIX0dFVFRFUl9FWENFUFRJT04sCisgICAgUFJPUF9BVFRSX1dJVEhfU0VUVEVSX0VYQ0VQ
VElPTiwKKyAgICBQUk9QX1NUUklOR19BVFRSX1dJVEhfR0VUVEVSX0VYQ0VQVElPTiwKKyAgICBQ
Uk9QX1NUUklOR19BVFRSX1dJVEhfU0VUVEVSX0VYQ0VQVElPTiwKK307CisKK3N0YXRpYyB2b2lk
IHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19maW5hbGl6ZShHT2JqZWN0KiBvYmplY3QpCit7Cisg
ICAgV2ViS2l0RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSogcHJpdiA9IFdFQktJVF9ET01fVEVTVF9U
WVBFREVGU19HRVRfUFJJVkFURShvYmplY3QpOworCisgICAgV2ViS2l0OjpET01PYmplY3RDYWNo
ZTo6Zm9yZ2V0KHByaXYtPmNvcmVPYmplY3QuZ2V0KCkpOworCisgICAgcHJpdi0+fldlYktpdERP
TVRlc3RUeXBlZGVmc1ByaXZhdGUoKTsKKyAgICBHX09CSkVDVF9DTEFTUyh3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfcGFyZW50X2NsYXNzKS0+ZmluYWxpemUob2JqZWN0KTsKK30KKworc3RhdGlj
IHZvaWQgd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9wcm9wZXJ0eShHT2JqZWN0KiBvYmpl
Y3QsIGd1aW50IHByb3BlcnR5SWQsIGNvbnN0IEdWYWx1ZSogdmFsdWUsIEdQYXJhbVNwZWMqIHBz
cGVjKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKworICAg
IFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiA9IFdFQktJVF9ET01fVEVTVF9UWVBFREVGUyhv
YmplY3QpOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogY29yZVNlbGYgPSBXZWJLaXQ6OmNv
cmUoc2VsZik7CisKKyAgICBzd2l0Y2ggKHByb3BlcnR5SWQpIHsKKyAgICBjYXNlIFBST1BfVU5T
SUdORURfTE9OR19MT05HX0FUVFI6IHsKKyAgICAgICAgY29yZVNlbGYtPnNldFVuc2lnbmVkTG9u
Z0xvbmdBdHRyKChnX3ZhbHVlX2dldF91aW50NjQodmFsdWUpKSk7CisgICAgICAgIGJyZWFrOwor
ICAgIH0KKyAgICBjYXNlIFBST1BfQVRUUl9XSVRIX0dFVFRFUl9FWENFUFRJT046IHsKKyAgICAg
ICAgY29yZVNlbGYtPnNldEF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKChnX3ZhbHVlX2dldF9sb25n
KHZhbHVlKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBQUk9QX0FUVFJfV0lU
SF9TRVRURVJfRVhDRVBUSU9OOiB7CisgICAgICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMg
PSAwOworICAgICAgICBjb3JlU2VsZi0+c2V0QXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oKGdfdmFs
dWVfZ2V0X2xvbmcodmFsdWUpKSwgZWMpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2Fz
ZSBQUk9QX1NUUklOR19BVFRSX1dJVEhfR0VUVEVSX0VYQ0VQVElPTjogeworICAgICAgICBjb3Jl
U2VsZi0+c2V0U3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oV1RGOjpTdHJpbmc6OmZyb21V
VEY4KGdfdmFsdWVfZ2V0X3N0cmluZyh2YWx1ZSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQor
ICAgIGNhc2UgUFJPUF9TVFJJTkdfQVRUUl9XSVRIX1NFVFRFUl9FWENFUFRJT046IHsKKyAgICAg
ICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgICAgIGNvcmVTZWxmLT5zZXRT
dHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbihXVEY6OlN0cmluZzo6ZnJvbVVURjgoZ192YWx1
ZV9nZXRfc3RyaW5nKHZhbHVlKSksIGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRl
ZmF1bHQ6CisgICAgICAgIEdfT0JKRUNUX1dBUk5fSU5WQUxJRF9QUk9QRVJUWV9JRChvYmplY3Qs
IHByb3BlcnR5SWQsIHBzcGVjKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitzdGF0aWMg
dm9pZCB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X3Byb3BlcnR5KEdPYmplY3QqIG9iamVj
dCwgZ3VpbnQgcHJvcGVydHlJZCwgR1ZhbHVlKiB2YWx1ZSwgR1BhcmFtU3BlYyogcHNwZWMpCit7
CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworCisgICAgV2ViS2l0
RE9NVGVzdFR5cGVkZWZzKiBzZWxmID0gV0VCS0lUX0RPTV9URVNUX1RZUEVERUZTKG9iamVjdCk7
CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBjb3JlU2VsZiA9IFdlYktpdDo6Y29yZShzZWxm
KTsKKworICAgIHN3aXRjaCAocHJvcGVydHlJZCkgeworICAgIGNhc2UgUFJPUF9VTlNJR05FRF9M
T05HX0xPTkdfQVRUUjogeworICAgICAgICBnX3ZhbHVlX3NldF91aW50NjQodmFsdWUsIGNvcmVT
ZWxmLT51bnNpZ25lZExvbmdMb25nQXR0cigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAg
IGNhc2UgUFJPUF9JTU1VVEFCTEVfU0VSSUFMSVpFRF9TQ1JJUFRfVkFMVUU6IHsKKyAgICAgICAg
UmVmUHRyPFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gcHRyID0gY29yZVNlbGYtPmlt
bXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpOworICAgICAgICBnX3ZhbHVlX3NldF9vYmpl
Y3QodmFsdWUsIFdlYktpdDo6a2l0KHB0ci5nZXQoKSkpOworICAgICAgICBicmVhazsKKyAgICB9
CisgICAgY2FzZSBQUk9QX0FUVFJfV0lUSF9HRVRURVJfRVhDRVBUSU9OOiB7CisgICAgICAgIFdl
YkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgICAgICBnX3ZhbHVlX3NldF9sb25nKHZh
bHVlLCBjb3JlU2VsZi0+YXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oZWMpKTsKKyAgICAgICAgYnJl
YWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9BVFRSX1dJVEhfU0VUVEVSX0VYQ0VQVElPTjogewor
ICAgICAgICBnX3ZhbHVlX3NldF9sb25nKHZhbHVlLCBjb3JlU2VsZi0+YXR0cldpdGhTZXR0ZXJF
eGNlcHRpb24oKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFBST1BfU1RSSU5H
X0FUVFJfV0lUSF9HRVRURVJfRVhDRVBUSU9OOiB7CisgICAgICAgIFdlYkNvcmU6OkV4Y2VwdGlv
bkNvZGUgZWMgPSAwOworICAgICAgICBnX3ZhbHVlX3Rha2Vfc3RyaW5nKHZhbHVlLCBjb252ZXJ0
VG9VVEY4U3RyaW5nKGNvcmVTZWxmLT5zdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYykp
KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgUFJPUF9TVFJJTkdfQVRUUl9XSVRI
X1NFVFRFUl9FWENFUFRJT046IHsKKyAgICAgICAgZ192YWx1ZV90YWtlX3N0cmluZyh2YWx1ZSwg
Y29udmVydFRvVVRGOFN0cmluZyhjb3JlU2VsZi0+c3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRp
b24oKSkpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgR19P
QkpFQ1RfV0FSTl9JTlZBTElEX1BST1BFUlRZX0lEKG9iamVjdCwgcHJvcGVydHlJZCwgcHNwZWMp
OworICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBHT2JqZWN0KiB3ZWJraXRfZG9t
X3Rlc3RfdHlwZWRlZnNfY29uc3RydWN0b3IoR1R5cGUgdHlwZSwgZ3VpbnQgY29uc3RydWN0UHJv
cGVydGllc0NvdW50LCBHT2JqZWN0Q29uc3RydWN0UGFyYW0qIGNvbnN0cnVjdFByb3BlcnRpZXMp
Cit7CisgICAgR09iamVjdCogb2JqZWN0ID0gR19PQkpFQ1RfQ0xBU1Mod2Via2l0X2RvbV90ZXN0
X3R5cGVkZWZzX3BhcmVudF9jbGFzcyktPmNvbnN0cnVjdG9yKHR5cGUsIGNvbnN0cnVjdFByb3Bl
cnRpZXNDb3VudCwgY29uc3RydWN0UHJvcGVydGllcyk7CisKKyAgICBXZWJLaXRET01UZXN0VHlw
ZWRlZnNQcml2YXRlKiBwcml2ID0gV0VCS0lUX0RPTV9URVNUX1RZUEVERUZTX0dFVF9QUklWQVRF
KG9iamVjdCk7CisgICAgcHJpdi0+Y29yZU9iamVjdCA9IHN0YXRpY19jYXN0PFdlYkNvcmU6OlRl
c3RUeXBlZGVmcyo+KFdFQktJVF9ET01fT0JKRUNUKG9iamVjdCktPmNvcmVPYmplY3QpOworICAg
IFdlYktpdDo6RE9NT2JqZWN0Q2FjaGU6OnB1dChwcml2LT5jb3JlT2JqZWN0LmdldCgpLCBvYmpl
Y3QpOworCisgICAgcmV0dXJuIG9iamVjdDsKK30KKworc3RhdGljIHZvaWQgd2Via2l0X2RvbV90
ZXN0X3R5cGVkZWZzX2NsYXNzX2luaXQoV2ViS2l0RE9NVGVzdFR5cGVkZWZzQ2xhc3MqIHJlcXVl
c3RDbGFzcykKK3sKKyAgICBHT2JqZWN0Q2xhc3MqIGdvYmplY3RDbGFzcyA9IEdfT0JKRUNUX0NM
QVNTKHJlcXVlc3RDbGFzcyk7CisgICAgZ190eXBlX2NsYXNzX2FkZF9wcml2YXRlKGdvYmplY3RD
bGFzcywgc2l6ZW9mKFdlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUpKTsKKyAgICBnb2JqZWN0
Q2xhc3MtPmNvbnN0cnVjdG9yID0gd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2NvbnN0cnVjdG9y
OworICAgIGdvYmplY3RDbGFzcy0+ZmluYWxpemUgPSB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNf
ZmluYWxpemU7CisgICAgZ29iamVjdENsYXNzLT5zZXRfcHJvcGVydHkgPSB3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfc2V0X3Byb3BlcnR5OworICAgIGdvYmplY3RDbGFzcy0+Z2V0X3Byb3BlcnR5
ID0gd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF9wcm9wZXJ0eTsKKworICAgIGdfb2JqZWN0
X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29iamVjdENsYXNzLAorICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgUFJPUF9VTlNJR05FRF9MT05HX0xPTkdfQVRUUiwKKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfcGFyYW1fc3BlY191aW50NjQoInVuc2lnbmVk
LWxvbmctbG9uZy1hdHRyIiwgLyogbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF90eXBlZGVmc191bnNpZ25lZC1s
b25nLWxvbmctYXR0ciIsIC8qIHNob3J0IGRlc2NyaXB0aW9uICovCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkLXdyaXRlICBn
dWludDY0IFRlc3RUeXBlZGVmcy51bnNpZ25lZC1sb25nLWxvbmctYXR0ciIsIC8qIGxvbmdlciAt
IGNvdWxkIGRvIHdpdGggc29tZSBleHRyYSBkb2Mgc3R1ZmYgaGVyZSAqLworICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAvKiBtaW4g
Ki8KK0dfTUFYVUlOVDY0LCAvKiBtaW4gKi8KKzAsIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BB
UkFNX1JFQURXUklURSkpOworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29i
amVjdENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9JTU1V
VEFCTEVfU0VSSUFMSVpFRF9TQ1JJUFRfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBnX3BhcmFtX3NwZWNfb2JqZWN0KCJpbW11dGFibGUtc2VyaWFsaXplZC1zY3Jp
cHQtdmFsdWUiLCAvKiBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0X3R5cGVkZWZzX2ltbXV0YWJsZS1zZXJpYWxp
emVkLXNjcmlwdC12YWx1ZSIsIC8qIHNob3J0IGRlc2NyaXB0aW9uICovCisgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkLXdyaXRl
ICBXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqIFRlc3RUeXBlZGVmcy5pbW11dGFibGUt
c2VyaWFsaXplZC1zY3JpcHQtdmFsdWUiLCAvKiBsb25nZXIgLSBjb3VsZCBkbyB3aXRoIHNvbWUg
ZXh0cmEgZG9jIHN0dWZmIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1RZUEVfRE9NX1NFUklBTElaRURfU0NS
SVBUX1ZBTFVFLCAvKiBnb2JqZWN0IHR5cGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURXUklURSkp
OworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29iamVjdENsYXNzLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9BVFRSX1dJVEhfR0VUVEVSX0VY
Q0VQVElPTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdfcGFyYW1fc3Bl
Y19sb25nKCJhdHRyLXdpdGgtZ2V0dGVyLWV4Y2VwdGlvbiIsIC8qIG5hbWUgKi8KKyAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Rf
dHlwZWRlZnNfYXR0ci13aXRoLWdldHRlci1leGNlcHRpb24iLCAvKiBzaG9ydCBkZXNjcmlwdGlv
biAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAicmVhZC13cml0ZSAgZ2xvbmcgVGVzdFR5cGVkZWZzLmF0dHItd2l0aC1nZXR0ZXIt
ZXhjZXB0aW9uIiwgLyogbG9uZ2VyIC0gY291bGQgZG8gd2l0aCBzb21lIGV4dHJhIGRvYyBzdHVm
ZiBoZXJlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgIEdfTUlOTE9ORywgLyogbWluICovCitHX01BWExPTkcsIC8qIG1heCAqLwor
MCwgLyogZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBXRUJLSVRfUEFSQU1fUkVBRFdSSVRFKSk7CisgICAgZ19vYmpl
Y3RfY2xhc3NfaW5zdGFsbF9wcm9wZXJ0eShnb2JqZWN0Q2xhc3MsCisgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICBQUk9QX0FUVFJfV0lUSF9TRVRURVJfRVhDRVBUSU9OLAorICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19wYXJhbV9zcGVjX2xvbmcoImF0dHIt
d2l0aC1zZXR0ZXItZXhjZXB0aW9uIiwgLyogbmFtZSAqLworICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF90eXBlZGVmc19hdHRy
LXdpdGgtc2V0dGVyLWV4Y2VwdGlvbiIsIC8qIHNob3J0IGRlc2NyaXB0aW9uICovCisgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFk
LXdyaXRlICBnbG9uZyBUZXN0VHlwZWRlZnMuYXR0ci13aXRoLXNldHRlci1leGNlcHRpb24iLCAv
KiBsb25nZXIgLSBjb3VsZCBkbyB3aXRoIHNvbWUgZXh0cmEgZG9jIHN0dWZmIGhlcmUgKi8KKyAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
R19NSU5MT05HLCAvKiBtaW4gKi8KK0dfTUFYTE9ORywgLyogbWF4ICovCiswLCAvKiBkZWZhdWx0
ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFdFQktJVF9QQVJBTV9SRUFEV1JJVEUpKTsKKyAgICBnX29iamVjdF9jbGFzc19pbnN0
YWxsX3Byb3BlcnR5KGdvYmplY3RDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgIFBST1BfU1RSSU5HX0FUVFJfV0lUSF9HRVRURVJfRVhDRVBUSU9OLAorICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19wYXJhbV9zcGVjX3N0cmluZygic3RyaW5nLWF0
dHItd2l0aC1nZXR0ZXItZXhjZXB0aW9uIiwgLyogbmFtZSAqLworICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdF90eXBlZGVmc19z
dHJpbmctYXR0ci13aXRoLWdldHRlci1leGNlcHRpb24iLCAvKiBzaG9ydCBkZXNjcmlwdGlvbiAq
LworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAicmVhZC13cml0ZSAgZ2NoYXIqIFRlc3RUeXBlZGVmcy5zdHJpbmctYXR0ci13aXRoLWdl
dHRlci1leGNlcHRpb24iLCAvKiBsb25nZXIgLSBjb3VsZCBkbyB3aXRoIHNvbWUgZXh0cmEgZG9j
IHN0dWZmIGhlcmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgIiIsIC8qIGRlZmF1bHQgKi8KKyAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0VCS0lUX1BBUkFNX1JFQURX
UklURSkpOworICAgIGdfb2JqZWN0X2NsYXNzX2luc3RhbGxfcHJvcGVydHkoZ29iamVjdENsYXNz
LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPUF9TVFJJTkdfQVRUUl9X
SVRIX1NFVFRFUl9FWENFUFRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBnX3BhcmFtX3NwZWNfc3RyaW5nKCJzdHJpbmctYXR0ci13aXRoLXNldHRlci1leGNlcHRpb24i
LCAvKiBuYW1lICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICJ0ZXN0X3R5cGVkZWZzX3N0cmluZy1hdHRyLXdpdGgtc2V0dGVyLWV4
Y2VwdGlvbiIsIC8qIHNob3J0IGRlc2NyaXB0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkLXdyaXRlICBnY2hhciog
VGVzdFR5cGVkZWZzLnN0cmluZy1hdHRyLXdpdGgtc2V0dGVyLWV4Y2VwdGlvbiIsIC8qIGxvbmdl
ciAtIGNvdWxkIGRvIHdpdGggc29tZSBleHRyYSBkb2Mgc3R1ZmYgaGVyZSAqLworICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwgLyog
ZGVmYXVsdCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICBXRUJLSVRfUEFSQU1fUkVBRFdSSVRFKSk7Cit9CisKK3N0YXRpYyB2b2lk
IHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19pbml0KFdlYktpdERPTVRlc3RUeXBlZGVmcyogcmVx
dWVzdCkKK3sKKyAgICBXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRlKiBwcml2ID0gV0VCS0lU
X0RPTV9URVNUX1RZUEVERUZTX0dFVF9QUklWQVRFKHJlcXVlc3QpOworICAgIG5ldyAocHJpdikg
V2ViS2l0RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZSgpOworfQorCit2b2lkCit3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfZnVuYyhXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIFdlYktpdERPTWxv
bmdbXSogeCkKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7Cisg
ICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMoc2VsZikpOwor
ICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19MT05HW10oeCkpOworICAgIFdlYkNv
cmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBXZWJDb3Jl
Ojpsb25nW10qIGNvbnZlcnRlZFggPSBXZWJLaXQ6OmNvcmUoeCk7CisgICAgaXRlbS0+ZnVuYyhj
b252ZXJ0ZWRYKTsKK30KKwordm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX211bHRpX3Ry
YW5zZmVyX2xpc3QoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJLaXRET01TZXJpYWxp
emVkU2NyaXB0VmFsdWUqIGZpcnN0LCBXZWJLaXRET01BcnJheSogdHgsIFdlYktpdERPTVNlcmlh
bGl6ZWRTY3JpcHRWYWx1ZSogc2Vjb25kLCBXZWJLaXRET01BcnJheSogdHh4KQoreworICAgIFdl
YkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl9pZl9mYWls
KFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSk7CisgICAgZ19yZXR1cm5faWZfZmFp
bChXRUJLSVRfRE9NX0lTX1NFUklBTElaRURfU0NSSVBUX1ZBTFVFKGZpcnN0KSk7CisgICAgZ19y
ZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lTX0FSUkFZKHR4KSk7CisgICAgZ19yZXR1cm5faWZf
ZmFpbChXRUJLSVRfRE9NX0lTX1NFUklBTElaRURfU0NSSVBUX1ZBTFVFKHNlY29uZCkpOworICAg
IGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19BUlJBWSh0eHgpKTsKKyAgICBXZWJDb3Jl
OjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgV2ViQ29yZTo6
U2VyaWFsaXplZFNjcmlwdFZhbHVlKiBjb252ZXJ0ZWRGaXJzdCA9IFdlYktpdDo6Y29yZShmaXJz
dCk7CisgICAgV2ViQ29yZTo6QXJyYXkqIGNvbnZlcnRlZFR4ID0gV2ViS2l0Ojpjb3JlKHR4KTsK
KyAgICBXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWUqIGNvbnZlcnRlZFNlY29uZCA9IFdl
YktpdDo6Y29yZShzZWNvbmQpOworICAgIFdlYkNvcmU6OkFycmF5KiBjb252ZXJ0ZWRUeHggPSBX
ZWJLaXQ6OmNvcmUodHh4KTsKKyAgICBpdGVtLT5tdWx0aVRyYW5zZmVyTGlzdChjb252ZXJ0ZWRG
aXJzdCwgY29udmVydGVkVHgsIGNvbnZlcnRlZFNlY29uZCwgY29udmVydGVkVHh4KTsKK30KKwor
dm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9zaGFkb3coV2ViS2l0RE9NVGVzdFR5
cGVkZWZzKiBzZWxmLCBnZmxvYXQgd2lkdGgsIGdmbG9hdCBoZWlnaHQsIGdmbG9hdCBibHVyLCBj
b25zdCBnY2hhciogY29sb3IsIGdmbG9hdCBhbHBoYSkKK3sKKyAgICBXZWJDb3JlOjpKU01haW5U
aHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lT
X1RFU1RfVFlQRURFRlMoc2VsZikpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoY29sb3IpOworICAg
IFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBX
VEY6OlN0cmluZyBjb252ZXJ0ZWRDb2xvciA9IFdURjo6U3RyaW5nOjpmcm9tVVRGOChjb2xvcik7
CisgICAgaXRlbS0+c2V0U2hhZG93KHdpZHRoLCBoZWlnaHQsIGJsdXIsIGNvbnZlcnRlZENvbG9y
LCBhbHBoYSk7Cit9CisKK3ZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19udWxsYWJsZV9h
cnJheV9hcmcoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJLaXRET01ET01TdHJpbmdb
XSogYXJyYXlBcmcpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRl
OworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYp
KTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfRE9NX1NUUklOR1tdKGFycmF5
QXJnKSk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNl
bGYpOworICAgIFdlYkNvcmU6OkRPTVN0cmluZ1tdKiBjb252ZXJ0ZWRBcnJheUFyZyA9IFdlYktp
dDo6Y29yZShhcnJheUFyZyk7CisgICAgaXRlbS0+bnVsbGFibGVBcnJheUFyZyhjb252ZXJ0ZWRB
cnJheUFyZyk7Cit9CisKK1dlYktpdERPTVNWR1BvaW50Kgord2Via2l0X2RvbV90ZXN0X3R5cGVk
ZWZzX2ltbXV0YWJsZV9wb2ludF9mdW5jdGlvbihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYp
Cit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIGdfcmV0
dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSwgMCk7Cisg
ICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAg
IFJlZlB0cjxXZWJDb3JlOjpTVkdQb2ludD4gZ29iamVjdFJlc3VsdCA9IFdURjo6Z2V0UHRyKGl0
ZW0tPmltbXV0YWJsZVBvaW50RnVuY3Rpb24oKSk7CisgICAgcmV0dXJuIFdlYktpdDo6a2l0KGdv
YmplY3RSZXN1bHQuZ2V0KCkpOworfQorCitXZWJLaXRET01ET01TdHJpbmdbXSoKK3dlYmtpdF9k
b21fdGVzdF90eXBlZGVmc19zdHJpbmdfYXJyYXlfZnVuY3Rpb24oV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzKiBzZWxmLCBXZWJLaXRET01ET01TdHJpbmdbXSogdmFsdWVzLCBHRXJyb3IqKiBlcnJvcikK
K3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1
cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpLCAwKTsKKyAg
ICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfRE9NX0lTX0RPTV9TVFJJTkdbXSh2YWx1ZXMp
LCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCghZXJyb3IgfHwgISplcnJvciwgMCk7Cisg
ICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAg
IFdlYkNvcmU6OkRPTVN0cmluZ1tdKiBjb252ZXJ0ZWRWYWx1ZXMgPSBXZWJLaXQ6OmNvcmUodmFs
dWVzKTsKKyAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBSZWZQdHI8V2Vi
Q29yZTo6RE9NU3RyaW5nW10+IGdvYmplY3RSZXN1bHQgPSBXVEY6OmdldFB0cihpdGVtLT5zdHJp
bmdBcnJheUZ1bmN0aW9uKGNvbnZlcnRlZFZhbHVlcywgZWMpKTsKKyAgICBpZiAoZWMpIHsKKyAg
ICAgICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZURlc2NyaXB0aW9uIGVjZGVzYyhlYyk7CisgICAg
ICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwoZXJyb3IsIGdfcXVhcmtfZnJvbV9zdHJpbmcoIldFQktJ
VF9ET00iKSwgZWNkZXNjLmNvZGUsIGVjZGVzYy5uYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIFdl
YktpdDo6a2l0KGdvYmplY3RSZXN1bHQuZ2V0KCkpOworfQorCitXZWJLaXRET01ET01TdHJpbmdb
XSoKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zdHJpbmdfYXJyYXlfZnVuY3Rpb24yKFdlYktp
dERPTVRlc3RUeXBlZGVmcyogc2VsZiwgV2ViS2l0RE9NRE9NU3RyaW5nW10qIHZhbHVlcywgR0Vy
cm9yKiogZXJyb3IpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRl
OworICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhz
ZWxmKSwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19ET01fU1RS
SU5HW10odmFsdWVzKSwgMCk7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoIWVycm9yIHx8ICEq
ZXJyb3IsIDApOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29y
ZShzZWxmKTsKKyAgICBXZWJDb3JlOjpET01TdHJpbmdbXSogY29udmVydGVkVmFsdWVzID0gV2Vi
S2l0Ojpjb3JlKHZhbHVlcyk7CisgICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZSBlYyA9IDA7Cisg
ICAgUmVmUHRyPFdlYkNvcmU6OkRPTVN0cmluZ1tdPiBnb2JqZWN0UmVzdWx0ID0gV1RGOjpnZXRQ
dHIoaXRlbS0+c3RyaW5nQXJyYXlGdW5jdGlvbjIoY29udmVydGVkVmFsdWVzLCBlYykpOworICAg
IGlmIChlYykgeworICAgICAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlRGVzY3JpcHRpb24gZWNk
ZXNjKGVjKTsKKyAgICAgICAgZ19zZXRfZXJyb3JfbGl0ZXJhbChlcnJvciwgZ19xdWFya19mcm9t
X3N0cmluZygiV0VCS0lUX0RPTSIpLCBlY2Rlc2MuY29kZSwgZWNkZXNjLm5hbWUpOworICAgIH0K
KyAgICByZXR1cm4gV2ViS2l0OjpraXQoZ29iamVjdFJlc3VsdC5nZXQoKSk7Cit9CisKK3ZvaWQK
K3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19tZXRob2Rfd2l0aF9leGNlcHRpb24oV2ViS2l0RE9N
VGVzdFR5cGVkZWZzKiBzZWxmLCBHRXJyb3IqKiBlcnJvcikKK3sKKyAgICBXZWJDb3JlOjpKU01h
aW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9N
X0lTX1RFU1RfVFlQRURFRlMoc2VsZikpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoIWVycm9yIHx8
ICEqZXJyb3IpOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29y
ZShzZWxmKTsKKyAgICBXZWJDb3JlOjpFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBpdGVtLT5t
ZXRob2RXaXRoRXhjZXB0aW9uKGVjKTsKKyAgICBpZiAoZWMpIHsKKyAgICAgICAgV2ViQ29yZTo6
RXhjZXB0aW9uQ29kZURlc2NyaXB0aW9uIGVjZGVzYyhlYyk7CisgICAgICAgIGdfc2V0X2Vycm9y
X2xpdGVyYWwoZXJyb3IsIGdfcXVhcmtfZnJvbV9zdHJpbmcoIldFQktJVF9ET00iKSwgZWNkZXNj
LmNvZGUsIGVjZGVzYy5uYW1lKTsKKyAgICB9Cit9CisKK2d1aW50NjQKK3dlYmtpdF9kb21fdGVz
dF90eXBlZGVmc19nZXRfdW5zaWduZWRfbG9uZ19sb25nX2F0dHIoV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzKiBzZWxmKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsK
KyAgICBnX3JldHVybl92YWxfaWZfZmFpbChXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMoc2Vs
ZiksIDApOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShz
ZWxmKTsKKyAgICBndWludDY0IHJlc3VsdCA9IGl0ZW0tPnVuc2lnbmVkTG9uZ0xvbmdBdHRyKCk7
CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X3NldF91bnNpZ25lZF9sb25nX2xvbmdfYXR0cihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYs
IGd1aW50NjQgdmFsdWUpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0
YXRlOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNl
bGYpKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2Vs
Zik7CisgICAgaXRlbS0+c2V0VW5zaWduZWRMb25nTG9uZ0F0dHIodmFsdWUpOworfQorCitXZWJL
aXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0
X2ltbXV0YWJsZV9zZXJpYWxpemVkX3NjcmlwdF92YWx1ZShXZWJLaXRET01UZXN0VHlwZWRlZnMq
IHNlbGYpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAg
IGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxmKSwg
MCk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYp
OworICAgIFJlZlB0cjxXZWJDb3JlOjpTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGdvYmplY3RSZXN1
bHQgPSBXVEY6OmdldFB0cihpdGVtLT5pbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSk7
CisgICAgcmV0dXJuIFdlYktpdDo6a2l0KGdvYmplY3RSZXN1bHQuZ2V0KCkpOworfQorCit2b2lk
Cit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X2ltbXV0YWJsZV9zZXJpYWxpemVkX3Njcmlw
dF92YWx1ZShXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIFdlYktpdERPTVNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZSogdmFsdWUpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRl
IHN0YXRlOworICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZT
KHNlbGYpKTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfU0VSSUFMSVpFRF9T
Q1JJUFRfVkFMVUUodmFsdWUpKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBX
ZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgV2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlKiBj
b252ZXJ0ZWRWYWx1ZSA9IFdlYktpdDo6Y29yZSh2YWx1ZSk7CisgICAgaXRlbS0+c2V0SW1tdXRh
YmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKGNvbnZlcnRlZFZhbHVlKTsKK30KKworZ2xvbmcKK3dl
YmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfYXR0cl93aXRoX2dldHRlcl9leGNlcHRpb24oV2Vi
S2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBHRXJyb3IqKiBlcnJvcikKK3sKKyAgICBXZWJDb3Jl
OjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwo
V0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpLCAwKTsKKyAgICBnX3JldHVybl92YWxf
aWZfZmFpbCghZXJyb3IgfHwgISplcnJvciwgMCk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZz
KiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNlbGYpOworICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUg
ZWMgPSAwOworICAgIGdsb25nIHJlc3VsdCA9IGl0ZW0tPmF0dHJXaXRoR2V0dGVyRXhjZXB0aW9u
KGVjKTsKKyAgICBpZiAoZWMpIHsKKyAgICAgICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZURlc2Ny
aXB0aW9uIGVjZGVzYyhlYyk7CisgICAgICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwoZXJyb3IsIGdf
cXVhcmtfZnJvbV9zdHJpbmcoIldFQktJVF9ET00iKSwgZWNkZXNjLmNvZGUsIGVjZGVzYy5uYW1l
KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAord2Via2l0X2RvbV90ZXN0
X3R5cGVkZWZzX3NldF9hdHRyX3dpdGhfZ2V0dGVyX2V4Y2VwdGlvbihXZWJLaXRET01UZXN0VHlw
ZWRlZnMqIHNlbGYsIGdsb25nIHZhbHVlKQoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVhZE51
bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9U
WVBFREVGUyhzZWxmKSk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0
Ojpjb3JlKHNlbGYpOworICAgIGl0ZW0tPnNldEF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKHZhbHVl
KTsKK30KKworZ2xvbmcKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfYXR0cl93aXRoX3Nl
dHRlcl9leGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmKQoreworICAgIFdlYkNv
cmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFp
bChXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMoc2VsZiksIDApOworICAgIFdlYkNvcmU6OlRl
c3RUeXBlZGVmcyogaXRlbSA9IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBnbG9uZyByZXN1bHQg
PSBpdGVtLT5hdHRyV2l0aFNldHRlckV4Y2VwdGlvbigpOworICAgIHJldHVybiByZXN1bHQ7Cit9
CisKK3ZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfYXR0cl93aXRoX3NldHRlcl9l
eGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBnbG9uZyB2YWx1ZSwgR0Vycm9y
KiogZXJyb3IpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOwor
ICAgIGdfcmV0dXJuX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpKTsK
KyAgICBnX3JldHVybl9pZl9mYWlsKCFlcnJvciB8fCAhKmVycm9yKTsKKyAgICBXZWJDb3JlOjpU
ZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUoc2VsZik7CisgICAgV2ViQ29yZTo6RXhj
ZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgaXRlbS0+c2V0QXR0cldpdGhTZXR0ZXJFeGNlcHRpb24o
dmFsdWUsIGVjKTsKKyAgICBpZiAoZWMpIHsKKyAgICAgICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29k
ZURlc2NyaXB0aW9uIGVjZGVzYyhlYyk7CisgICAgICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwoZXJy
b3IsIGdfcXVhcmtfZnJvbV9zdHJpbmcoIldFQktJVF9ET00iKSwgZWNkZXNjLmNvZGUsIGVjZGVz
Yy5uYW1lKTsKKyAgICB9Cit9CisKK2djaGFyKgord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dl
dF9zdHJpbmdfYXR0cl93aXRoX2dldHRlcl9leGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZz
KiBzZWxmLCBHRXJyb3IqKiBlcnJvcikKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxs
U3RhdGUgc3RhdGU7CisgICAgZ19yZXR1cm5fdmFsX2lmX2ZhaWwoV0VCS0lUX0RPTV9JU19URVNU
X1RZUEVERUZTKHNlbGYpLCAwKTsKKyAgICBnX3JldHVybl92YWxfaWZfZmFpbCghZXJyb3IgfHwg
ISplcnJvciwgMCk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpj
b3JlKHNlbGYpOworICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIGdjaGFy
KiByZXN1bHQgPSBjb252ZXJ0VG9VVEY4U3RyaW5nKGl0ZW0tPnN0cmluZ0F0dHJXaXRoR2V0dGVy
RXhjZXB0aW9uKGVjKSk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZAord2Via2l0X2Rv
bV90ZXN0X3R5cGVkZWZzX3NldF9zdHJpbmdfYXR0cl93aXRoX2dldHRlcl9leGNlcHRpb24oV2Vi
S2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBjb25zdCBnY2hhciogdmFsdWUpCit7CisgICAgV2Vi
Q29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIGdfcmV0dXJuX2lmX2ZhaWwo
V0VCS0lUX0RPTV9JU19URVNUX1RZUEVERUZTKHNlbGYpKTsKKyAgICBnX3JldHVybl9pZl9mYWls
KHZhbHVlKTsKKyAgICBXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIGl0ZW0gPSBXZWJLaXQ6OmNvcmUo
c2VsZik7CisgICAgV1RGOjpTdHJpbmcgY29udmVydGVkVmFsdWUgPSBXVEY6OlN0cmluZzo6ZnJv
bVVURjgodmFsdWUpOworICAgIGl0ZW0tPnNldFN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9u
KGNvbnZlcnRlZFZhbHVlKTsKK30KKworZ2NoYXIqCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNf
Z2V0X3N0cmluZ19hdHRyX3dpdGhfc2V0dGVyX2V4Y2VwdGlvbihXZWJLaXRET01UZXN0VHlwZWRl
ZnMqIHNlbGYpCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOwor
ICAgIGdfcmV0dXJuX3ZhbF9pZl9mYWlsKFdFQktJVF9ET01fSVNfVEVTVF9UWVBFREVGUyhzZWxm
KSwgMCk7CisgICAgV2ViQ29yZTo6VGVzdFR5cGVkZWZzKiBpdGVtID0gV2ViS2l0Ojpjb3JlKHNl
bGYpOworICAgIGdjaGFyKiByZXN1bHQgPSBjb252ZXJ0VG9VVEY4U3RyaW5nKGl0ZW0tPnN0cmlu
Z0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3Zv
aWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfc3RyaW5nX2F0dHJfd2l0aF9zZXR0ZXJf
ZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgY29uc3QgZ2NoYXIqIHZhbHVl
LCBHRXJyb3IqKiBlcnJvcikKK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUg
c3RhdGU7CisgICAgZ19yZXR1cm5faWZfZmFpbChXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMo
c2VsZikpOworICAgIGdfcmV0dXJuX2lmX2ZhaWwodmFsdWUpOworICAgIGdfcmV0dXJuX2lmX2Zh
aWwoIWVycm9yIHx8ICEqZXJyb3IpOworICAgIFdlYkNvcmU6OlRlc3RUeXBlZGVmcyogaXRlbSA9
IFdlYktpdDo6Y29yZShzZWxmKTsKKyAgICBXVEY6OlN0cmluZyBjb252ZXJ0ZWRWYWx1ZSA9IFdU
Rjo6U3RyaW5nOjpmcm9tVVRGOCh2YWx1ZSk7CisgICAgV2ViQ29yZTo6RXhjZXB0aW9uQ29kZSBl
YyA9IDA7CisgICAgaXRlbS0+c2V0U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oY29udmVy
dGVkVmFsdWUsIGVjKTsKKyAgICBpZiAoZWMpIHsKKyAgICAgICAgV2ViQ29yZTo6RXhjZXB0aW9u
Q29kZURlc2NyaXB0aW9uIGVjZGVzYyhlYyk7CisgICAgICAgIGdfc2V0X2Vycm9yX2xpdGVyYWwo
ZXJyb3IsIGdfcXVhcmtfZnJvbV9zdHJpbmcoIldFQktJVF9ET00iKSwgZWNkZXNjLmNvZGUsIGVj
ZGVzYy5uYW1lKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmcy5oIGIvU291cmNl
L1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMC4uMDE2NzdhZDVkYzQ1NGMyNDU2M2QxYmVhNmFmMmJjNWEwNjA2ZGZk
ZAotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVz
dC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmcy5oCkBAIC0wLDAgKzEsMjc2IEBACisvKgor
ICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBXZWJLaXQgb3BlbiBzb3VyY2UgcHJvamVjdC4K
KyAgICBUaGlzIGZpbGUgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWJpbmRpbmdzLnBs
LiBETyBOT1QgTU9ESUZZIQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlv
dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVy
bXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5zZSBhcyBwdWJs
aXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgICAgdmVyc2lv
biAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u
LgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQg
d2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2
ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVT
UyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExpYnJhcnkgR2Vu
ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91IHNob3VsZCBo
YXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMgTGlj
ZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy5M
SUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwg
SW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0b24sIE1BIDAy
MTEwLTEzMDEsIFVTQS4KKyovCisKKyNpZm5kZWYgV2ViS2l0RE9NVGVzdFR5cGVkZWZzX2gKKyNk
ZWZpbmUgV2ViS2l0RE9NVGVzdFR5cGVkZWZzX2gKKworI2luY2x1ZGUgPGdsaWItb2JqZWN0Lmg+
CisjaW5jbHVkZSA8d2Via2l0ZG9tL1dlYktpdERPTU9iamVjdC5oPgorI2luY2x1ZGUgPHdlYmtp
dGRvbS93ZWJraXRkb21kZWZpbmVzLmg+CisKK0dfQkVHSU5fREVDTFMKKworI2RlZmluZSBXRUJL
SVRfVFlQRV9ET01fVEVTVF9UWVBFREVGUyAgICAgICAgICAgICh3ZWJraXRfZG9tX3Rlc3RfdHlw
ZWRlZnNfZ2V0X3R5cGUoKSkKKyNkZWZpbmUgV0VCS0lUX0RPTV9URVNUX1RZUEVERUZTKG9iaikg
ICAgICAgICAgICAoR19UWVBFX0NIRUNLX0lOU1RBTkNFX0NBU1QoKG9iaiksIFdFQktJVF9UWVBF
X0RPTV9URVNUX1RZUEVERUZTLCBXZWJLaXRET01UZXN0VHlwZWRlZnMpKQorI2RlZmluZSBXRUJL
SVRfRE9NX1RFU1RfVFlQRURFRlNfQ0xBU1Moa2xhc3MpICAgIChHX1RZUEVfQ0hFQ0tfQ0xBU1Nf
Q0FTVCgoa2xhc3MpLCAgV0VCS0lUX1RZUEVfRE9NX1RFU1RfVFlQRURFRlMsIFdlYktpdERPTVRl
c3RUeXBlZGVmc0NsYXNzKQorI2RlZmluZSBXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlMob2Jq
KSAgICAgICAgIChHX1RZUEVfQ0hFQ0tfSU5TVEFOQ0VfVFlQRSgob2JqKSwgV0VCS0lUX1RZUEVf
RE9NX1RFU1RfVFlQRURFRlMpKQorI2RlZmluZSBXRUJLSVRfRE9NX0lTX1RFU1RfVFlQRURFRlNf
Q0xBU1Moa2xhc3MpIChHX1RZUEVfQ0hFQ0tfQ0xBU1NfVFlQRSgoa2xhc3MpLCAgV0VCS0lUX1RZ
UEVfRE9NX1RFU1RfVFlQRURFRlMpKQorI2RlZmluZSBXRUJLSVRfRE9NX1RFU1RfVFlQRURFRlNf
R0VUX0NMQVNTKG9iaikgIChHX1RZUEVfSU5TVEFOQ0VfR0VUX0NMQVNTKChvYmopLCAgV0VCS0lU
X1RZUEVfRE9NX1RFU1RfVFlQRURFRlMsIFdlYktpdERPTVRlc3RUeXBlZGVmc0NsYXNzKSkKKwor
c3RydWN0IF9XZWJLaXRET01UZXN0VHlwZWRlZnMgeworICAgIFdlYktpdERPTU9iamVjdCBwYXJl
bnRfaW5zdGFuY2U7Cit9OworCitzdHJ1Y3QgX1dlYktpdERPTVRlc3RUeXBlZGVmc0NsYXNzIHsK
KyAgICBXZWJLaXRET01PYmplY3RDbGFzcyBwYXJlbnRfY2xhc3M7Cit9OworCitXRUJLSVRfQVBJ
IEdUeXBlCit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X3R5cGUgKHZvaWQpOworCisvKioK
KyAqIHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19mdW5jOgorICogQHNlbGY6IEEgI1dlYktpdERP
TVRlc3RUeXBlZGVmcworICogQHg6IEEgI1dlYktpdERPTWxvbmdbXQorICoKKyAqIFJldHVybnM6
CisgKgorKiovCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19mdW5j
KFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgV2ViS2l0RE9NbG9uZ1tdKiB4KTsKKworLyoq
CisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfbXVsdGlfdHJhbnNmZXJfbGlzdDoKKyAqIEBz
ZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqIEBmaXJzdDogQSAjV2ViS2l0RE9NU2Vy
aWFsaXplZFNjcmlwdFZhbHVlCisgKiBAdHg6IEEgI1dlYktpdERPTUFycmF5CisgKiBAc2Vjb25k
OiBBICNXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUKKyAqIEB0eHg6IEEgI1dlYktpdERP
TUFycmF5CisgKgorICogUmV0dXJuczoKKyAqCisqKi8KK1dFQktJVF9BUEkgdm9pZAord2Via2l0
X2RvbV90ZXN0X3R5cGVkZWZzX211bHRpX3RyYW5zZmVyX2xpc3QoV2ViS2l0RE9NVGVzdFR5cGVk
ZWZzKiBzZWxmLCBXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUqIGZpcnN0LCBXZWJLaXRE
T01BcnJheSogdHgsIFdlYktpdERPTVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSogc2Vjb25kLCBXZWJL
aXRET01BcnJheSogdHh4KTsKKworLyoqCisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0
X3NoYWRvdzoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqIEB3aWR0aDog
QSAjZ2Zsb2F0CisgKiBAaGVpZ2h0OiBBICNnZmxvYXQKKyAqIEBibHVyOiBBICNnZmxvYXQKKyAq
IEBjb2xvcjogQSAjZ2NoYXIKKyAqIEBhbHBoYTogQSAjZ2Zsb2F0CisgKgorICogUmV0dXJuczoK
KyAqCisqKi8KK1dFQktJVF9BUEkgdm9pZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9z
aGFkb3coV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBnZmxvYXQgd2lkdGgsIGdmbG9hdCBo
ZWlnaHQsIGdmbG9hdCBibHVyLCBjb25zdCBnY2hhciogY29sb3IsIGdmbG9hdCBhbHBoYSk7CisK
Ky8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX251bGxhYmxlX2FycmF5X2FyZzoKKyAq
IEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqIEBhcnJheUFyZzogQSAjV2ViS2l0
RE9NRE9NU3RyaW5nW10KKyAqCisgKiBSZXR1cm5zOgorICoKKyoqLworV0VCS0lUX0FQSSB2b2lk
Cit3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfbnVsbGFibGVfYXJyYXlfYXJnKFdlYktpdERPTVRl
c3RUeXBlZGVmcyogc2VsZiwgV2ViS2l0RE9NRE9NU3RyaW5nW10qIGFycmF5QXJnKTsKKworLyoq
CisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfaW1tdXRhYmxlX3BvaW50X2Z1bmN0aW9uOgor
ICogQHNlbGY6IEEgI1dlYktpdERPTVRlc3RUeXBlZGVmcworICoKKyAqIFJldHVybnM6ICh0cmFu
c2ZlciBub25lKToKKyAqCisqKi8KK1dFQktJVF9BUEkgV2ViS2l0RE9NU1ZHUG9pbnQqCit3ZWJr
aXRfZG9tX3Rlc3RfdHlwZWRlZnNfaW1tdXRhYmxlX3BvaW50X2Z1bmN0aW9uKFdlYktpdERPTVRl
c3RUeXBlZGVmcyogc2VsZik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3N0
cmluZ19hcnJheV9mdW5jdGlvbjoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMK
KyAqIEB2YWx1ZXM6IEEgI1dlYktpdERPTURPTVN0cmluZ1tdCisgKiBAZXJyb3I6ICNHRXJyb3IK
KyAqCisgKiBSZXR1cm5zOiAodHJhbnNmZXIgbm9uZSk6CisgKgorKiovCitXRUJLSVRfQVBJIFdl
YktpdERPTURPTVN0cmluZ1tdKgord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3N0cmluZ19hcnJh
eV9mdW5jdGlvbihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIFdlYktpdERPTURPTVN0cmlu
Z1tdKiB2YWx1ZXMsIEdFcnJvcioqIGVycm9yKTsKKworLyoqCisgKiB3ZWJraXRfZG9tX3Rlc3Rf
dHlwZWRlZnNfc3RyaW5nX2FycmF5X2Z1bmN0aW9uMjoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01U
ZXN0VHlwZWRlZnMKKyAqIEB2YWx1ZXM6IEEgI1dlYktpdERPTURPTVN0cmluZ1tdCisgKiBAZXJy
b3I6ICNHRXJyb3IKKyAqCisgKiBSZXR1cm5zOiAodHJhbnNmZXIgbm9uZSk6CisgKgorKiovCitX
RUJLSVRfQVBJIFdlYktpdERPTURPTVN0cmluZ1tdKgord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZz
X3N0cmluZ19hcnJheV9mdW5jdGlvbjIoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJL
aXRET01ET01TdHJpbmdbXSogdmFsdWVzLCBHRXJyb3IqKiBlcnJvcik7CisKKy8qKgorICogd2Vi
a2l0X2RvbV90ZXN0X3R5cGVkZWZzX21ldGhvZF93aXRoX2V4Y2VwdGlvbjoKKyAqIEBzZWxmOiBB
ICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqIEBlcnJvcjogI0dFcnJvcgorICoKKyAqIFJldHVy
bnM6CisgKgorKiovCitXRUJLSVRfQVBJIHZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19t
ZXRob2Rfd2l0aF9leGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBHRXJyb3Iq
KiBlcnJvcik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF91bnNpZ25l
ZF9sb25nX2xvbmdfYXR0cjoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAq
CisgKiBSZXR1cm5zOgorICoKKyoqLworV0VCS0lUX0FQSSBndWludDY0Cit3ZWJraXRfZG9tX3Rl
c3RfdHlwZWRlZnNfZ2V0X3Vuc2lnbmVkX2xvbmdfbG9uZ19hdHRyKFdlYktpdERPTVRlc3RUeXBl
ZGVmcyogc2VsZik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF91bnNp
Z25lZF9sb25nX2xvbmdfYXR0cjoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMK
KyAqIEB2YWx1ZTogQSAjZ3VpbnQ2NAorICoKKyAqIFJldHVybnM6CisgKgorKiovCitXRUJLSVRf
QVBJIHZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfdW5zaWduZWRfbG9uZ19sb25n
X2F0dHIoV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBndWludDY0IHZhbHVlKTsKKworLyoq
CisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X2ltbXV0YWJsZV9zZXJpYWxpemVkX3Nj
cmlwdF92YWx1ZToKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqCisgKiBS
ZXR1cm5zOiAodHJhbnNmZXIgbm9uZSk6CisgKgorKiovCitXRUJLSVRfQVBJIFdlYktpdERPTVNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZSoKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfaW1tdXRh
YmxlX3NlcmlhbGl6ZWRfc2NyaXB0X3ZhbHVlKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZik7
CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9pbW11dGFibGVfc2VyaWFs
aXplZF9zY3JpcHRfdmFsdWU6CisgKiBAc2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisg
KiBAdmFsdWU6IEEgI1dlYktpdERPTVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZQorICoKKyAqIFJldHVy
bnM6ICh0cmFuc2ZlciBub25lKToKKyAqCisqKi8KK1dFQktJVF9BUEkgdm9pZAord2Via2l0X2Rv
bV90ZXN0X3R5cGVkZWZzX3NldF9pbW11dGFibGVfc2VyaWFsaXplZF9zY3JpcHRfdmFsdWUoV2Vi
S2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBXZWJLaXRET01TZXJpYWxpemVkU2NyaXB0VmFsdWUq
IHZhbHVlKTsKKworLyoqCisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X2F0dHJfd2l0
aF9nZXR0ZXJfZXhjZXB0aW9uOgorICogQHNlbGY6IEEgI1dlYktpdERPTVRlc3RUeXBlZGVmcwor
ICogQGVycm9yOiAjR0Vycm9yCisgKgorICogUmV0dXJuczoKKyAqCisqKi8KK1dFQktJVF9BUEkg
Z2xvbmcKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfYXR0cl93aXRoX2dldHRlcl9leGNl
cHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmLCBHRXJyb3IqKiBlcnJvcik7CisKKy8q
KgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9hdHRyX3dpdGhfZ2V0dGVyX2V4Y2Vw
dGlvbjoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlwZWRlZnMKKyAqIEB2YWx1ZTogQSAj
Z2xvbmcKKyAqCisgKiBSZXR1cm5zOgorICoKKyoqLworV0VCS0lUX0FQSSB2b2lkCit3ZWJraXRf
ZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X2F0dHJfd2l0aF9nZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERP
TVRlc3RUeXBlZGVmcyogc2VsZiwgZ2xvbmcgdmFsdWUpOworCisvKioKKyAqIHdlYmtpdF9kb21f
dGVzdF90eXBlZGVmc19nZXRfYXR0cl93aXRoX3NldHRlcl9leGNlcHRpb246CisgKiBAc2VsZjog
QSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisgKgorICogUmV0dXJuczoKKyAqCisqKi8KK1dFQktJ
VF9BUEkgZ2xvbmcKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfYXR0cl93aXRoX3NldHRl
cl9leGNlcHRpb24oV2ViS2l0RE9NVGVzdFR5cGVkZWZzKiBzZWxmKTsKKworLyoqCisgKiB3ZWJr
aXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X2F0dHJfd2l0aF9zZXR0ZXJfZXhjZXB0aW9uOgorICog
QHNlbGY6IEEgI1dlYktpdERPTVRlc3RUeXBlZGVmcworICogQHZhbHVlOiBBICNnbG9uZworICog
QGVycm9yOiAjR0Vycm9yCisgKgorICogUmV0dXJuczoKKyAqCisqKi8KK1dFQktJVF9BUEkgdm9p
ZAord2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX3NldF9hdHRyX3dpdGhfc2V0dGVyX2V4Y2VwdGlv
bihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIGdsb25nIHZhbHVlLCBHRXJyb3IqKiBlcnJv
cik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0X3R5cGVkZWZzX2dldF9zdHJpbmdfYXR0cl93
aXRoX2dldHRlcl9leGNlcHRpb246CisgKiBAc2VsZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZz
CisgKiBAZXJyb3I6ICNHRXJyb3IKKyAqCisgKiBSZXR1cm5zOgorICoKKyoqLworV0VCS0lUX0FQ
SSBnY2hhcioKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19nZXRfc3RyaW5nX2F0dHJfd2l0aF9n
ZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgR0Vycm9yKiogZXJy
b3IpOworCisvKioKKyAqIHdlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfc3RyaW5nX2F0dHJf
d2l0aF9nZXR0ZXJfZXhjZXB0aW9uOgorICogQHNlbGY6IEEgI1dlYktpdERPTVRlc3RUeXBlZGVm
cworICogQHZhbHVlOiBBICNnY2hhcgorICoKKyAqIFJldHVybnM6CisgKgorKiovCitXRUJLSVRf
QVBJIHZvaWQKK3dlYmtpdF9kb21fdGVzdF90eXBlZGVmc19zZXRfc3RyaW5nX2F0dHJfd2l0aF9n
ZXR0ZXJfZXhjZXB0aW9uKFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZiwgY29uc3QgZ2NoYXIq
IHZhbHVlKTsKKworLyoqCisgKiB3ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfZ2V0X3N0cmluZ19h
dHRyX3dpdGhfc2V0dGVyX2V4Y2VwdGlvbjoKKyAqIEBzZWxmOiBBICNXZWJLaXRET01UZXN0VHlw
ZWRlZnMKKyAqCisgKiBSZXR1cm5zOgorICoKKyoqLworV0VCS0lUX0FQSSBnY2hhcioKK3dlYmtp
dF9kb21fdGVzdF90eXBlZGVmc19nZXRfc3RyaW5nX2F0dHJfd2l0aF9zZXR0ZXJfZXhjZXB0aW9u
KFdlYktpdERPTVRlc3RUeXBlZGVmcyogc2VsZik7CisKKy8qKgorICogd2Via2l0X2RvbV90ZXN0
X3R5cGVkZWZzX3NldF9zdHJpbmdfYXR0cl93aXRoX3NldHRlcl9leGNlcHRpb246CisgKiBAc2Vs
ZjogQSAjV2ViS2l0RE9NVGVzdFR5cGVkZWZzCisgKiBAdmFsdWU6IEEgI2djaGFyCisgKiBAZXJy
b3I6ICNHRXJyb3IKKyAqCisgKiBSZXR1cm5zOgorICoKKyoqLworV0VCS0lUX0FQSSB2b2lkCit3
ZWJraXRfZG9tX3Rlc3RfdHlwZWRlZnNfc2V0X3N0cmluZ19hdHRyX3dpdGhfc2V0dGVyX2V4Y2Vw
dGlvbihXZWJLaXRET01UZXN0VHlwZWRlZnMqIHNlbGYsIGNvbnN0IGdjaGFyKiB2YWx1ZSwgR0Vy
cm9yKiogZXJyb3IpOworCitHX0VORF9ERUNMUworCisjZW5kaWYgLyogV2ViS2l0RE9NVGVzdFR5
cGVkZWZzX2ggKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMv
dGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmc1ByaXZhdGUuaCBiL1NvdXJjZS9XZWJD
b3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9HT2JqZWN0L1dlYktpdERPTVRlc3RUeXBlZGVmc1By
aXZhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwLi4zYjg5MGJlNTU0OWM0NjM5YWE4ZmNmMjdjNmRmOTBhMzgyN2U4
ZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90
ZXN0L0dPYmplY3QvV2ViS2l0RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZS5oCkBAIC0wLDAgKzEsMzMg
QEAKKy8qCisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNvdXJjZSBw
cm9qZWN0LgorICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtYmlu
ZGluZ3MucGwuIERPIE5PVCBNT0RJRlkhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAg
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBXZWJLaXRET01UZXN0VHlwZWRl
ZnNQcml2YXRlX2gKKyNkZWZpbmUgV2ViS2l0RE9NVGVzdFR5cGVkZWZzUHJpdmF0ZV9oCisKKyNp
bmNsdWRlICJUZXN0VHlwZWRlZnMuaCIKKyNpbmNsdWRlIDx3ZWJraXRkb20vV2ViS2l0RE9NVGVz
dFR5cGVkZWZzLmg+CisKK25hbWVzcGFjZSBXZWJLaXQgeworV2ViS2l0RE9NVGVzdFR5cGVkZWZz
KiB3cmFwVGVzdFR5cGVkZWZzKFdlYkNvcmU6OlRlc3RUeXBlZGVmcyopOworV2ViQ29yZTo6VGVz
dFR5cGVkZWZzKiBjb3JlKFdlYktpdERPTVRlc3RUeXBlZGVmcyogcmVxdWVzdCk7CitXZWJLaXRE
T01UZXN0VHlwZWRlZnMqIGtpdChXZWJDb3JlOjpUZXN0VHlwZWRlZnMqIG5vZGUpOworfSAvLyBu
YW1lc3BhY2UgV2ViS2l0CisKKyNlbmRpZiAvKiBXZWJLaXRET01UZXN0VHlwZWRlZnNQcml2YXRl
X2ggKi8KZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9K
Uy9KU1Rlc3RUeXBlZGVmcy5jcHAgYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rl
c3QvSlMvSlNUZXN0VHlwZWRlZnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLmViNzkwNDE5MTdkZGFmZmMwZDgz
MjY4NmJkMGNkZGM2YjVmOWE2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9i
aW5kaW5ncy9zY3JpcHRzL3Rlc3QvSlMvSlNUZXN0VHlwZWRlZnMuY3BwCkBAIC0wLDAgKzEsNjIy
IEBACisvKgorICAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBXZWJLaXQgb3BlbiBzb3VyY2Ug
cHJvamVjdC4KKyAgICBUaGlzIGZpbGUgaGFzIGJlZW4gZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLWJp
bmRpbmdzLnBsLiBETyBOT1QgTU9ESUZZIQorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29m
dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgIG1vZGlmeSBpdCB1bmRl
ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljCisgICAgTGljZW5z
ZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisg
ICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl
ciB2ZXJzaW9uLgorCisgICAgVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3Bl
IHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3
aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkg
b3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgIExp
YnJhcnkgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgWW91
IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQ
dWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUg
Q09QWUlORy5MSUIuICBJZiBub3QsIHdyaXRlIHRvCisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91
bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKKyAgICBCb3N0
b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyovCisKKyNpbmNsdWRlICJjb25maWcuaCIKKyNpbmNs
dWRlICJKU1Rlc3RUeXBlZGVmcy5oIgorCisjaW5jbHVkZSAiRE9NU3RyaW5nTGlzdC5oIgorI2lu
Y2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNpbmNsdWRlICJKU0FycmF5LmgiCisjaW5jbHVkZSAi
SlNET01CaW5kaW5nLmgiCisjaW5jbHVkZSAiSlNET01TdHJpbmdMaXN0LmgiCisjaW5jbHVkZSAi
SlNTVkdQb2ludC5oIgorI2luY2x1ZGUgIkpTU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCisjaW5j
bHVkZSAiSlNUZXN0Q2FsbGJhY2suaCIKKyNpbmNsdWRlICJKU1Rlc3RTdWJPYmouaCIKKyNpbmNs
dWRlICJLVVJMLmgiCisjaW5jbHVkZSAiU2VyaWFsaXplZFNjcmlwdFZhbHVlLmgiCisjaW5jbHVk
ZSAiVGVzdFR5cGVkZWZzLmgiCisjaW5jbHVkZSA8cnVudGltZS9FcnJvci5oPgorI2luY2x1ZGUg
PHJ1bnRpbWUvSlNBcnJheS5oPgorI2luY2x1ZGUgPHJ1bnRpbWUvSlNTdHJpbmcuaD4KKyNpbmNs
dWRlIDx3dGYvR2V0UHRyLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBKU0M7CisKK25hbWVzcGFjZSBX
ZWJDb3JlIHsKKworLyogSGFzaCB0YWJsZSAqLworCitzdGF0aWMgY29uc3QgSGFzaFRhYmxlVmFs
dWUgSlNUZXN0VHlwZWRlZnNUYWJsZVZhbHVlc1tdID0KK3sKKyAgICB7ICJ1bnNpZ25lZExvbmdM
b25nQXR0ciIsIERvbnREZWxldGUsIChpbnRwdHJfdClzdGF0aWNfY2FzdDxQcm9wZXJ0eVNsb3Q6
OkdldFZhbHVlRnVuYz4oanNUZXN0VHlwZWRlZnNVbnNpZ25lZExvbmdMb25nQXR0ciksIChpbnRw
dHJfdClzZXRKU1Rlc3RUeXBlZGVmc1Vuc2lnbmVkTG9uZ0xvbmdBdHRyLCBOb0ludHJpbnNpYyB9
LAorICAgIHsgImltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSIsIERvbnREZWxldGUsIChp
bnRwdHJfdClzdGF0aWNfY2FzdDxQcm9wZXJ0eVNsb3Q6OkdldFZhbHVlRnVuYz4oanNUZXN0VHlw
ZWRlZnNJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpLCAoaW50cHRyX3Qpc2V0SlNUZXN0
VHlwZWRlZnNJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUsIE5vSW50cmluc2ljIH0sCisg
ICAgeyAiYXR0cldpdGhHZXR0ZXJFeGNlcHRpb24iLCBEb250RGVsZXRlLCAoaW50cHRyX3Qpc3Rh
dGljX2Nhc3Q8UHJvcGVydHlTbG90OjpHZXRWYWx1ZUZ1bmM+KGpzVGVzdFR5cGVkZWZzQXR0cldp
dGhHZXR0ZXJFeGNlcHRpb24pLCAoaW50cHRyX3Qpc2V0SlNUZXN0VHlwZWRlZnNBdHRyV2l0aEdl
dHRlckV4Y2VwdGlvbiwgTm9JbnRyaW5zaWMgfSwKKyAgICB7ICJhdHRyV2l0aFNldHRlckV4Y2Vw
dGlvbiIsIERvbnREZWxldGUsIChpbnRwdHJfdClzdGF0aWNfY2FzdDxQcm9wZXJ0eVNsb3Q6Okdl
dFZhbHVlRnVuYz4oanNUZXN0VHlwZWRlZnNBdHRyV2l0aFNldHRlckV4Y2VwdGlvbiksIChpbnRw
dHJfdClzZXRKU1Rlc3RUeXBlZGVmc0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uLCBOb0ludHJpbnNp
YyB9LAorICAgIHsgInN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uIiwgRG9udERlbGV0ZSwg
KGludHB0cl90KXN0YXRpY19jYXN0PFByb3BlcnR5U2xvdDo6R2V0VmFsdWVGdW5jPihqc1Rlc3RU
eXBlZGVmc1N0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKSwgKGludHB0cl90KXNldEpTVGVz
dFR5cGVkZWZzU3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24sIE5vSW50cmluc2ljIH0sCisg
ICAgeyAic3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24iLCBEb250RGVsZXRlLCAoaW50cHRy
X3Qpc3RhdGljX2Nhc3Q8UHJvcGVydHlTbG90OjpHZXRWYWx1ZUZ1bmM+KGpzVGVzdFR5cGVkZWZz
U3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24pLCAoaW50cHRyX3Qpc2V0SlNUZXN0VHlwZWRl
ZnNTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbiwgTm9JbnRyaW5zaWMgfSwKKyAgICB7ICJj
b25zdHJ1Y3RvciIsIERvbnRFbnVtIHwgUmVhZE9ubHksIChpbnRwdHJfdClzdGF0aWNfY2FzdDxQ
cm9wZXJ0eVNsb3Q6OkdldFZhbHVlRnVuYz4oanNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvciksIChp
bnRwdHJfdCkwLCBOb0ludHJpbnNpYyB9LAorICAgIHsgMCwgMCwgMCwgMCwgTm9JbnRyaW5zaWMg
fQorfTsKKworc3RhdGljIGNvbnN0IEhhc2hUYWJsZSBKU1Rlc3RUeXBlZGVmc1RhYmxlID0geyAx
OCwgMTUsIEpTVGVzdFR5cGVkZWZzVGFibGVWYWx1ZXMsIDAgfTsKKy8qIEhhc2ggdGFibGUgZm9y
IGNvbnN0cnVjdG9yICovCisKK3N0YXRpYyBjb25zdCBIYXNoVGFibGVWYWx1ZSBKU1Rlc3RUeXBl
ZGVmc0NvbnN0cnVjdG9yVGFibGVWYWx1ZXNbXSA9Cit7CisgICAgeyAiVGVzdFN1Yk9iaiIsIERv
bnREZWxldGUgfCBSZWFkT25seSwgKGludHB0cl90KXN0YXRpY19jYXN0PFByb3BlcnR5U2xvdDo6
R2V0VmFsdWVGdW5jPihqc1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yVGVzdFN1Yk9iaiksIChpbnRw
dHJfdCkwLCBOb0ludHJpbnNpYyB9LAorICAgIHsgMCwgMCwgMCwgMCwgTm9JbnRyaW5zaWMgfQor
fTsKKworc3RhdGljIGNvbnN0IEhhc2hUYWJsZSBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yVGFi
bGUgPSB7IDEsIDAsIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3JUYWJsZVZhbHVlcywgMCB9Owor
RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yOjpj
b25zdHJ1Y3RKU1Rlc3RUeXBlZGVmcyhFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgSlNUZXN0VHlw
ZWRlZnNDb25zdHJ1Y3RvciogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmc0NvbnN0
cnVjdG9yKj4oZXhlYy0+Y2FsbGVlKCkpOworICAgIGlmIChleGVjLT5hcmd1bWVudENvdW50KCkg
PCAyKQorICAgICAgICByZXR1cm4gdGhyb3dWTUVycm9yKGV4ZWMsIGNyZWF0ZU5vdEVub3VnaEFy
Z3VtZW50c0Vycm9yKGV4ZWMpKTsKKyAgICBjb25zdCBTdHJpbmcmIGhlbGxvKE1BWUJFX01JU1NJ
TkdfUEFSQU1FVEVSKGV4ZWMsIDAsIERlZmF1bHRJc1VuZGVmaW5lZCkuaXNFbXB0eSgpID8gU3Ry
aW5nKCkgOiBNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAwLCBEZWZhdWx0SXNVbmRlZmlu
ZWQpLnRvU3RyaW5nKGV4ZWMpLT52YWx1ZShleGVjKSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2Vw
dGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOwor
ICAgIGlmIChleGVjLT5hcmd1bWVudENvdW50KCkgPD0gMSB8fCAhZXhlYy0+YXJndW1lbnQoMSku
aXNGdW5jdGlvbigpKQorICAgICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAg
ICBSZWZQdHI8VGVzdENhbGxiYWNrPiB0ZXN0Q2FsbGJhY2sgPSBKU1Rlc3RDYWxsYmFjazo6Y3Jl
YXRlKGFzT2JqZWN0KGV4ZWMtPmFyZ3VtZW50KDEpKSwgY2FzdGVkVGhpcy0+Z2xvYmFsT2JqZWN0
KCkpOworICAgIFJlZlB0cjxUZXN0VHlwZWRlZnM+IG9iamVjdCA9IFRlc3RUeXBlZGVmczo6Y3Jl
YXRlKGhlbGxvLCB0ZXN0Q2FsbGJhY2spOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoYXNP
YmplY3QodG9KUyhleGVjLCBjYXN0ZWRUaGlzLT5nbG9iYWxPYmplY3QoKSwgb2JqZWN0LmdldCgp
KSkpOworfQorCitjb25zdCBDbGFzc0luZm8gSlNUZXN0VHlwZWRlZnNDb25zdHJ1Y3Rvcjo6c19p
bmZvID0geyAiVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IiLCAmQmFzZTo6c19pbmZvLCAmSlNUZXN0
VHlwZWRlZnNDb25zdHJ1Y3RvclRhYmxlLCAwLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEpTVGVzdFR5
cGVkZWZzQ29uc3RydWN0b3IpIH07CisKK0pTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3I6OkpTVGVz
dFR5cGVkZWZzQ29uc3RydWN0b3IoU3RydWN0dXJlKiBzdHJ1Y3R1cmUsIEpTRE9NR2xvYmFsT2Jq
ZWN0KiBnbG9iYWxPYmplY3QpCisgICAgOiBET01Db25zdHJ1Y3Rvck9iamVjdChzdHJ1Y3R1cmUs
IGdsb2JhbE9iamVjdCkKK3sKK30KKwordm9pZCBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yOjpm
aW5pc2hDcmVhdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTRE9NR2xvYmFsT2JqZWN0KiBnbG9iYWxP
YmplY3QpCit7CisgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24oZXhlYy0+Z2xvYmFsRGF0YSgpKTsK
KyAgICBBU1NFUlQoaW5oZXJpdHMoJnNfaW5mbykpOworICAgIHB1dERpcmVjdChleGVjLT5nbG9i
YWxEYXRhKCksIGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5wcm90b3R5cGUsIEpTVGVzdFR5cGVkZWZz
UHJvdG90eXBlOjpzZWxmKGV4ZWMsIGdsb2JhbE9iamVjdCksIERvbnREZWxldGUgfCBSZWFkT25s
eSk7CisgICAgcHV0RGlyZWN0KGV4ZWMtPmdsb2JhbERhdGEoKSwgZXhlYy0+cHJvcGVydHlOYW1l
cygpLmxlbmd0aCwganNOdW1iZXIoMiksIFJlYWRPbmx5IHwgRG9udERlbGV0ZSB8IERvbnRFbnVt
KTsKK30KKworYm9vbCBKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yOjpnZXRPd25Qcm9wZXJ0eVNs
b3QoSlNDZWxsKiBjZWxsLCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5h
bWUsIFByb3BlcnR5U2xvdCYgc2xvdCkKK3sKKyAgICByZXR1cm4gZ2V0U3RhdGljVmFsdWVTbG90
PEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IsIEpTRE9NV3JhcHBlcj4oZXhlYywgJkpTVGVzdFR5
cGVkZWZzQ29uc3RydWN0b3JUYWJsZSwganNDYXN0PEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3Iq
PihjZWxsKSwgcHJvcGVydHlOYW1lLCBzbG90KTsKK30KKworYm9vbCBKU1Rlc3RUeXBlZGVmc0Nv
bnN0cnVjdG9yOjpnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSlNPYmplY3QqIG9iamVjdCwgRXhl
Y1N0YXRlKiBleGVjLCBQcm9wZXJ0eU5hbWUgcHJvcGVydHlOYW1lLCBQcm9wZXJ0eURlc2NyaXB0
b3ImIGRlc2NyaXB0b3IpCit7CisgICAgcmV0dXJuIGdldFN0YXRpY1ZhbHVlRGVzY3JpcHRvcjxK
U1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yLCBKU0RPTVdyYXBwZXI+KGV4ZWMsICZKU1Rlc3RUeXBl
ZGVmc0NvbnN0cnVjdG9yVGFibGUsIGpzQ2FzdDxKU1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yKj4o
b2JqZWN0KSwgcHJvcGVydHlOYW1lLCBkZXNjcmlwdG9yKTsKK30KKworQ29uc3RydWN0VHlwZSBK
U1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yOjpnZXRDb25zdHJ1Y3REYXRhKEpTQ2VsbCosIENvbnN0
cnVjdERhdGEmIGNvbnN0cnVjdERhdGEpCit7CisgICAgY29uc3RydWN0RGF0YS5uYXRpdmUuZnVu
Y3Rpb24gPSBjb25zdHJ1Y3RKU1Rlc3RUeXBlZGVmczsKKyAgICByZXR1cm4gQ29uc3RydWN0VHlw
ZUhvc3Q7Cit9CisKKy8qIEhhc2ggdGFibGUgZm9yIHByb3RvdHlwZSAqLworCitzdGF0aWMgY29u
c3QgSGFzaFRhYmxlVmFsdWUgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGVUYWJsZVZhbHVlc1tdID0K
K3sKKyAgICB7ICJmdW5jIiwgRG9udERlbGV0ZSB8IEpTQzo6RnVuY3Rpb24sIChpbnRwdHJfdClz
dGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4oanNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlv
bkZ1bmMpLCAoaW50cHRyX3QpMSwgTm9JbnRyaW5zaWMgfSwKKyAgICB7ICJtdWx0aVRyYW5zZmVy
TGlzdCIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8
TmF0aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25NdWx0aVRyYW5z
ZmVyTGlzdCksIChpbnRwdHJfdCk0LCBOb0ludHJpbnNpYyB9LAorICAgIHsgInNldFNoYWRvdyIs
IERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZl
RnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25TZXRTaGFkb3cpLCAoaW50
cHRyX3QpNSwgTm9JbnRyaW5zaWMgfSwKKyAgICB7ICJtZXRob2RXaXRoU2VxdWVuY2VBcmciLCBE
b250RGVsZXRlIHwgSlNDOjpGdW5jdGlvbiwgKGludHB0cl90KXN0YXRpY19jYXN0PE5hdGl2ZUZ1
bmN0aW9uPihqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0aW9uTWV0aG9kV2l0aFNlcXVlbmNl
QXJnKSwgKGludHB0cl90KTEsIE5vSW50cmluc2ljIH0sCisgICAgeyAibnVsbGFibGVBcnJheUFy
ZyIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0
aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25OdWxsYWJsZUFycmF5
QXJnKSwgKGludHB0cl90KTEsIE5vSW50cmluc2ljIH0sCisgICAgeyAiZnVuY1dpdGhDbGFtcCIs
IERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0aXZl
RnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25GdW5jV2l0aENsYW1wKSwg
KGludHB0cl90KTIsIE5vSW50cmluc2ljIH0sCisgICAgeyAiaW1tdXRhYmxlUG9pbnRGdW5jdGlv
biIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGljX2Nhc3Q8TmF0
aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25JbW11dGFibGVQb2lu
dEZ1bmN0aW9uKSwgKGludHB0cl90KTAsIE5vSW50cmluc2ljIH0sCisgICAgeyAic3RyaW5nQXJy
YXlGdW5jdGlvbiIsIERvbnREZWxldGUgfCBKU0M6OkZ1bmN0aW9uLCAoaW50cHRyX3Qpc3RhdGlj
X2Nhc3Q8TmF0aXZlRnVuY3Rpb24+KGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25TdHJp
bmdBcnJheUZ1bmN0aW9uKSwgKGludHB0cl90KTEsIE5vSW50cmluc2ljIH0sCisgICAgeyAic3Ry
aW5nQXJyYXlGdW5jdGlvbjIiLCBEb250RGVsZXRlIHwgSlNDOjpGdW5jdGlvbiwgKGludHB0cl90
KXN0YXRpY19jYXN0PE5hdGl2ZUZ1bmN0aW9uPihqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0
aW9uU3RyaW5nQXJyYXlGdW5jdGlvbjIpLCAoaW50cHRyX3QpMSwgTm9JbnRyaW5zaWMgfSwKKyAg
ICB7ICJtZXRob2RXaXRoRXhjZXB0aW9uIiwgRG9udERlbGV0ZSB8IEpTQzo6RnVuY3Rpb24sIChp
bnRwdHJfdClzdGF0aWNfY2FzdDxOYXRpdmVGdW5jdGlvbj4oanNUZXN0VHlwZWRlZnNQcm90b3R5
cGVGdW5jdGlvbk1ldGhvZFdpdGhFeGNlcHRpb24pLCAoaW50cHRyX3QpMCwgTm9JbnRyaW5zaWMg
fSwKKyAgICB7IDAsIDAsIDAsIDAsIE5vSW50cmluc2ljIH0KK307CisKK3N0YXRpYyBjb25zdCBI
YXNoVGFibGUgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGVUYWJsZSA9IHsgMzQsIDMxLCBKU1Rlc3RU
eXBlZGVmc1Byb3RvdHlwZVRhYmxlVmFsdWVzLCAwIH07Citjb25zdCBDbGFzc0luZm8gSlNUZXN0
VHlwZWRlZnNQcm90b3R5cGU6OnNfaW5mbyA9IHsgIlRlc3RUeXBlZGVmc1Byb3RvdHlwZSIsICZC
YXNlOjpzX2luZm8sICZKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZVRhYmxlLCAwLCBDUkVBVEVfTUVU
SE9EX1RBQkxFKEpTVGVzdFR5cGVkZWZzUHJvdG90eXBlKSB9OworCitKU09iamVjdCogSlNUZXN0
VHlwZWRlZnNQcm90b3R5cGU6OnNlbGYoRXhlY1N0YXRlKiBleGVjLCBKU0dsb2JhbE9iamVjdCog
Z2xvYmFsT2JqZWN0KQoreworICAgIHJldHVybiBnZXRET01Qcm90b3R5cGU8SlNUZXN0VHlwZWRl
ZnM+KGV4ZWMsIGdsb2JhbE9iamVjdCk7Cit9CisKK2Jvb2wgSlNUZXN0VHlwZWRlZnNQcm90b3R5
cGU6OmdldE93blByb3BlcnR5U2xvdChKU0NlbGwqIGNlbGwsIEV4ZWNTdGF0ZSogZXhlYywgUHJv
cGVydHlOYW1lIHByb3BlcnR5TmFtZSwgUHJvcGVydHlTbG90JiBzbG90KQoreworICAgIEpTVGVz
dFR5cGVkZWZzUHJvdG90eXBlKiB0aGlzT2JqZWN0ID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzUHJv
dG90eXBlKj4oY2VsbCk7CisgICAgcmV0dXJuIGdldFN0YXRpY0Z1bmN0aW9uU2xvdDxKU09iamVj
dD4oZXhlYywgJkpTVGVzdFR5cGVkZWZzUHJvdG90eXBlVGFibGUsIHRoaXNPYmplY3QsIHByb3Bl
cnR5TmFtZSwgc2xvdCk7Cit9CisKK2Jvb2wgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGU6OmdldE93
blByb3BlcnR5RGVzY3JpcHRvcihKU09iamVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4ZWMsIFBy
b3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5RGVzY3JpcHRvciYgZGVzY3JpcHRvcikK
K3sKKyAgICBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSogdGhpc09iamVjdCA9IGpzQ2FzdDxKU1Rl
c3RUeXBlZGVmc1Byb3RvdHlwZSo+KG9iamVjdCk7CisgICAgcmV0dXJuIGdldFN0YXRpY0Z1bmN0
aW9uRGVzY3JpcHRvcjxKU09iamVjdD4oZXhlYywgJkpTVGVzdFR5cGVkZWZzUHJvdG90eXBlVGFi
bGUsIHRoaXNPYmplY3QsIHByb3BlcnR5TmFtZSwgZGVzY3JpcHRvcik7Cit9CisKK2NvbnN0IENs
YXNzSW5mbyBKU1Rlc3RUeXBlZGVmczo6c19pbmZvID0geyAiVGVzdFR5cGVkZWZzIiwgJkJhc2U6
OnNfaW5mbywgJkpTVGVzdFR5cGVkZWZzVGFibGUsIDAgLCBDUkVBVEVfTUVUSE9EX1RBQkxFKEpT
VGVzdFR5cGVkZWZzKSB9OworCitKU1Rlc3RUeXBlZGVmczo6SlNUZXN0VHlwZWRlZnMoU3RydWN0
dXJlKiBzdHJ1Y3R1cmUsIEpTRE9NR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIFBhc3NSZWZQ
dHI8VGVzdFR5cGVkZWZzPiBpbXBsKQorICAgIDogSlNET01XcmFwcGVyKHN0cnVjdHVyZSwgZ2xv
YmFsT2JqZWN0KQorICAgICwgbV9pbXBsKGltcGwubGVha1JlZigpKQoreworfQorCit2b2lkIEpT
VGVzdFR5cGVkZWZzOjpmaW5pc2hDcmVhdGlvbihKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEpCit7
CisgICAgQmFzZTo6ZmluaXNoQ3JlYXRpb24oZ2xvYmFsRGF0YSk7CisgICAgQVNTRVJUKGluaGVy
aXRzKCZzX2luZm8pKTsKK30KKworSlNPYmplY3QqIEpTVGVzdFR5cGVkZWZzOjpjcmVhdGVQcm90
b3R5cGUoRXhlY1N0YXRlKiBleGVjLCBKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0KQorewor
ICAgIHJldHVybiBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZTo6Y3JlYXRlKGV4ZWMtPmdsb2JhbERh
dGEoKSwgZ2xvYmFsT2JqZWN0LCBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZTo6Y3JlYXRlU3RydWN0
dXJlKGdsb2JhbE9iamVjdC0+Z2xvYmFsRGF0YSgpLCBnbG9iYWxPYmplY3QsIGdsb2JhbE9iamVj
dC0+b2JqZWN0UHJvdG90eXBlKCkpKTsKK30KKwordm9pZCBKU1Rlc3RUeXBlZGVmczo6ZGVzdHJv
eShKU0M6OkpTQ2VsbCogY2VsbCkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogdGhpc09iamVjdCA9
IHN0YXRpY19jYXN0PEpTVGVzdFR5cGVkZWZzKj4oY2VsbCk7CisgICAgdGhpc09iamVjdC0+SlNU
ZXN0VHlwZWRlZnM6On5KU1Rlc3RUeXBlZGVmcygpOworfQorCitKU1Rlc3RUeXBlZGVmczo6fkpT
VGVzdFR5cGVkZWZzKCkKK3sKKyAgICByZWxlYXNlSW1wbElmTm90TnVsbCgpOworfQorCitib29s
IEpTVGVzdFR5cGVkZWZzOjpnZXRPd25Qcm9wZXJ0eVNsb3QoSlNDZWxsKiBjZWxsLCBFeGVjU3Rh
dGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0eU5hbWUsIFByb3BlcnR5U2xvdCYgc2xvdCkK
K3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogdGhpc09iamVjdCA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVm
cyo+KGNlbGwpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFModGhpc09iamVjdCwgJnNf
aW5mbyk7CisgICAgcmV0dXJuIGdldFN0YXRpY1ZhbHVlU2xvdDxKU1Rlc3RUeXBlZGVmcywgQmFz
ZT4oZXhlYywgJkpTVGVzdFR5cGVkZWZzVGFibGUsIHRoaXNPYmplY3QsIHByb3BlcnR5TmFtZSwg
c2xvdCk7Cit9CisKK2Jvb2wgSlNUZXN0VHlwZWRlZnM6OmdldE93blByb3BlcnR5RGVzY3JpcHRv
cihKU09iamVjdCogb2JqZWN0LCBFeGVjU3RhdGUqIGV4ZWMsIFByb3BlcnR5TmFtZSBwcm9wZXJ0
eU5hbWUsIFByb3BlcnR5RGVzY3JpcHRvciYgZGVzY3JpcHRvcikKK3sKKyAgICBKU1Rlc3RUeXBl
ZGVmcyogdGhpc09iamVjdCA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KG9iamVjdCk7CisgICAg
QVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2JqZWN0LCAmc19pbmZvKTsKKyAgICByZXR1
cm4gZ2V0U3RhdGljVmFsdWVEZXNjcmlwdG9yPEpTVGVzdFR5cGVkZWZzLCBCYXNlPihleGVjLCAm
SlNUZXN0VHlwZWRlZnNUYWJsZSwgdGhpc09iamVjdCwgcHJvcGVydHlOYW1lLCBkZXNjcmlwdG9y
KTsKK30KKworSlNWYWx1ZSBqc1Rlc3RUeXBlZGVmc1Vuc2lnbmVkTG9uZ0xvbmdBdHRyKEV4ZWNT
dGF0ZSogZXhlYywgSlNWYWx1ZSBzbG90QmFzZSwgUHJvcGVydHlOYW1lKQoreworICAgIEpTVGVz
dFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3Qo
c2xvdEJhc2UpKTsKKyAgICBVTlVTRURfUEFSQU0oZXhlYyk7CisgICAgVGVzdFR5cGVkZWZzKiBp
bXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAg
ICBKU1ZhbHVlIHJlc3VsdCA9IGpzTnVtYmVyKGltcGwtPnVuc2lnbmVkTG9uZ0xvbmdBdHRyKCkp
OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworSlNWYWx1ZSBqc1Rlc3RUeXBlZGVmc0ltbXV0
YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgc2xvdEJh
c2UsIFByb3BlcnR5TmFtZSkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpz
Q2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHNsb3RCYXNlKSk7CisgICAgVU5VU0VEX1BB
UkFNKGV4ZWMpOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBl
ZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgSlNWYWx1ZSByZXN1bHQgPSBpbXBsLT5p
bW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoKSA/IGltcGwtPmltbXV0YWJsZVNlcmlhbGl6
ZWRTY3JpcHRWYWx1ZSgpLT5kZXNlcmlhbGl6ZShleGVjLCBjYXN0ZWRUaGlzLT5nbG9iYWxPYmpl
Y3QoKSwgMCkgOiBqc051bGwoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0pTVmFsdWUg
anNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvclRlc3RTdWJPYmooRXhlY1N0YXRlKiBleGVjLCBKU1Zh
bHVlIHNsb3RCYXNlLCBQcm9wZXJ0eU5hbWUpCit7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3Rl
ZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihhc09iamVjdChzbG90QmFzZSkpOworICAg
IHJldHVybiBKU1Rlc3RTdWJPYmo6OmdldENvbnN0cnVjdG9yKGV4ZWMsIGNhc3RlZFRoaXMtPmds
b2JhbE9iamVjdCgpKTsKK30KKworCitKU1ZhbHVlIGpzVGVzdFR5cGVkZWZzQXR0cldpdGhHZXR0
ZXJFeGNlcHRpb24oRXhlY1N0YXRlKiBleGVjLCBKU1ZhbHVlIHNsb3RCYXNlLCBQcm9wZXJ0eU5h
bWUpCit7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlw
ZWRlZnMqPihhc09iamVjdChzbG90QmFzZSkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOwor
ICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNhc3Rl
ZFRoaXMtPmltcGwoKSk7CisgICAgSlNDOjpKU1ZhbHVlIHJlc3VsdCA9IGpzTnVtYmVyKGltcGwt
PmF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKGVjKSk7CisgICAgc2V0RE9NRXhjZXB0aW9uKGV4ZWMs
IGVjKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisKK0pTVmFsdWUganNUZXN0VHlwZWRlZnNB
dHRyV2l0aFNldHRlckV4Y2VwdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgc2xvdEJhc2Us
IFByb3BlcnR5TmFtZSkKK3sKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2Fz
dDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHNsb3RCYXNlKSk7CisgICAgVU5VU0VEX1BBUkFN
KGV4ZWMpOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVm
cyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgSlNWYWx1ZSByZXN1bHQgPSBqc051bWJlcihp
bXBsLT5hdHRyV2l0aFNldHRlckV4Y2VwdGlvbigpKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQor
CisKK0pTVmFsdWUganNUZXN0VHlwZWRlZnNTdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbihF
eGVjU3RhdGUqIGV4ZWMsIEpTVmFsdWUgc2xvdEJhc2UsIFByb3BlcnR5TmFtZSkKK3sKKyAgICBK
U1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2Jq
ZWN0KHNsb3RCYXNlKSk7CisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgVGVzdFR5cGVk
ZWZzKiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgp
KTsKKyAgICBKU0M6OkpTVmFsdWUgcmVzdWx0ID0ganNTdHJpbmdXaXRoQ2FjaGUoZXhlYywgaW1w
bC0+c3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oZWMpKTsKKyAgICBzZXRET01FeGNlcHRp
b24oZXhlYywgZWMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworSlNWYWx1ZSBqc1Rlc3RU
eXBlZGVmc1N0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNW
YWx1ZSBzbG90QmFzZSwgUHJvcGVydHlOYW1lKQoreworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0
ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3Qoc2xvdEJhc2UpKTsKKyAg
ICBVTlVTRURfUEFSQU0oZXhlYyk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGljX2Nh
c3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBKU1ZhbHVlIHJlc3Vs
dCA9IGpzU3RyaW5nV2l0aENhY2hlKGV4ZWMsIGltcGwtPnN0cmluZ0F0dHJXaXRoU2V0dGVyRXhj
ZXB0aW9uKCkpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKworSlNWYWx1ZSBqc1Rlc3RUeXBl
ZGVmc0NvbnN0cnVjdG9yKEV4ZWNTdGF0ZSogZXhlYywgSlNWYWx1ZSBzbG90QmFzZSwgUHJvcGVy
dHlOYW1lKQoreworICAgIEpTVGVzdFR5cGVkZWZzKiBkb21PYmplY3QgPSBqc0Nhc3Q8SlNUZXN0
VHlwZWRlZnMqPihhc09iamVjdChzbG90QmFzZSkpOworICAgIHJldHVybiBKU1Rlc3RUeXBlZGVm
czo6Z2V0Q29uc3RydWN0b3IoZXhlYywgZG9tT2JqZWN0LT5nbG9iYWxPYmplY3QoKSk7Cit9CisK
K3ZvaWQgSlNUZXN0VHlwZWRlZnM6OnB1dChKU0NlbGwqIGNlbGwsIEV4ZWNTdGF0ZSogZXhlYywg
UHJvcGVydHlOYW1lIHByb3BlcnR5TmFtZSwgSlNWYWx1ZSB2YWx1ZSwgUHV0UHJvcGVydHlTbG90
JiBzbG90KQoreworICAgIEpTVGVzdFR5cGVkZWZzKiB0aGlzT2JqZWN0ID0ganNDYXN0PEpTVGVz
dFR5cGVkZWZzKj4oY2VsbCk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyh0aGlzT2Jq
ZWN0LCAmc19pbmZvKTsKKyAgICBsb29rdXBQdXQ8SlNUZXN0VHlwZWRlZnMsIEJhc2U+KGV4ZWMs
IHByb3BlcnR5TmFtZSwgdmFsdWUsICZKU1Rlc3RUeXBlZGVmc1RhYmxlLCB0aGlzT2JqZWN0LCBz
bG90KTsKK30KKwordm9pZCBzZXRKU1Rlc3RUeXBlZGVmc1Vuc2lnbmVkTG9uZ0xvbmdBdHRyKEV4
ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmplY3QsIEpTVmFsdWUgdmFsdWUpCit7Cisg
ICAgVU5VU0VEX1BBUkFNKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0g
anNDYXN0PEpTVGVzdFR5cGVkZWZzKj4odGhpc09iamVjdCk7CisgICAgVGVzdFR5cGVkZWZzKiBp
bXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAg
ICBpbXBsLT5zZXRVbnNpZ25lZExvbmdMb25nQXR0cihzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25n
IGxvbmc+KHZhbHVlLnRvSW50ZWdlcihleGVjKSkpOworfQorCisKK3ZvaWQgc2V0SlNUZXN0VHlw
ZWRlZnNJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUoRXhlY1N0YXRlKiBleGVjLCBKU09i
amVjdCogdGhpc09iamVjdCwgSlNWYWx1ZSB2YWx1ZSkKK3sKKyAgICBVTlVTRURfUEFSQU0oZXhl
Yyk7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRl
ZnMqPih0aGlzT2JqZWN0KTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBzdGF0aWNfY2FzdDxU
ZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIGltcGwtPnNldEltbXV0YWJs
ZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZShTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShleGVj
LCB2YWx1ZSwgMCwgMCkpOworfQorCisKK3ZvaWQgc2V0SlNUZXN0VHlwZWRlZnNBdHRyV2l0aEdl
dHRlckV4Y2VwdGlvbihFeGVjU3RhdGUqIGV4ZWMsIEpTT2JqZWN0KiB0aGlzT2JqZWN0LCBKU1Zh
bHVlIHZhbHVlKQoreworICAgIFVOVVNFRF9QQVJBTShleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVm
cyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KHRoaXNPYmplY3QpOworICAg
IFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNhc3RlZFRo
aXMtPmltcGwoKSk7CisgICAgaW1wbC0+c2V0QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24odmFsdWUu
dG9JbnQzMihleGVjKSk7Cit9CisKKwordm9pZCBzZXRKU1Rlc3RUeXBlZGVmc0F0dHJXaXRoU2V0
dGVyRXhjZXB0aW9uKEV4ZWNTdGF0ZSogZXhlYywgSlNPYmplY3QqIHRoaXNPYmplY3QsIEpTVmFs
dWUgdmFsdWUpCit7CisgICAgVU5VU0VEX1BBUkFNKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZz
KiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4odGhpc09iamVjdCk7CisgICAg
VGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhp
cy0+aW1wbCgpKTsKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBpbXBsLT5zZXRBdHRy
V2l0aFNldHRlckV4Y2VwdGlvbih2YWx1ZS50b0ludDMyKGV4ZWMpLCBlYyk7CisgICAgc2V0RE9N
RXhjZXB0aW9uKGV4ZWMsIGVjKTsKK30KKworCit2b2lkIHNldEpTVGVzdFR5cGVkZWZzU3RyaW5n
QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09i
amVjdCwgSlNWYWx1ZSB2YWx1ZSkKK3sKKyAgICBVTlVTRURfUEFSQU0oZXhlYyk7CisgICAgSlNU
ZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPih0aGlzT2Jq
ZWN0KTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBzdGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMq
PihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIGltcGwtPnNldFN0cmluZ0F0dHJXaXRoR2V0dGVy
RXhjZXB0aW9uKHZhbHVlLmlzRW1wdHkoKSA/IFN0cmluZygpIDogdmFsdWUudG9TdHJpbmcoZXhl
YyktPnZhbHVlKGV4ZWMpKTsKK30KKworCit2b2lkIHNldEpTVGVzdFR5cGVkZWZzU3RyaW5nQXR0
cldpdGhTZXR0ZXJFeGNlcHRpb24oRXhlY1N0YXRlKiBleGVjLCBKU09iamVjdCogdGhpc09iamVj
dCwgSlNWYWx1ZSB2YWx1ZSkKK3sKKyAgICBVTlVTRURfUEFSQU0oZXhlYyk7CisgICAgSlNUZXN0
VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPih0aGlzT2JqZWN0
KTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBzdGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihj
YXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIGltcGwt
PnNldFN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKHZhbHVlLmlzRW1wdHkoKSA/IFN0cmlu
ZygpIDogdmFsdWUudG9TdHJpbmcoZXhlYyktPnZhbHVlKGV4ZWMpLCBlYyk7CisgICAgc2V0RE9N
RXhjZXB0aW9uKGV4ZWMsIGVjKTsKK30KKworCitKU1ZhbHVlIEpTVGVzdFR5cGVkZWZzOjpnZXRD
b25zdHJ1Y3RvcihFeGVjU3RhdGUqIGV4ZWMsIEpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3Qp
Cit7CisgICAgcmV0dXJuIGdldERPTUNvbnN0cnVjdG9yPEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0
b3I+KGV4ZWMsIGpzQ2FzdDxKU0RPTUdsb2JhbE9iamVjdCo+KGdsb2JhbE9iamVjdCkpOworfQor
CitFbmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVu
Y3Rpb25GdW5jKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBKU1ZhbHVlIHRoaXNWYWx1ZSA9IGV4
ZWMtPmhvc3RUaGlzVmFsdWUoKTsKKyAgICBpZiAoIXRoaXNWYWx1ZS5pbmhlcml0cygmSlNUZXN0
VHlwZWRlZnM6OnNfaW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd1ZNVHlwZUVycm9yKGV4ZWMp
OworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZz
Kj4oYXNPYmplY3QodGhpc1ZhbHVlKSk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyhj
YXN0ZWRUaGlzLCAmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbyk7CisgICAgVGVzdFR5cGVkZWZzKiBp
bXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKwor
ICAgIHNpemVfdCBhcmdzQ291bnQgPSBleGVjLT5hcmd1bWVudENvdW50KCk7CisgICAgaWYgKGFy
Z3NDb3VudCA8PSAwKSB7CisgICAgICAgIGltcGwtPmZ1bmMoKTsKKyAgICAgICAgcmV0dXJuIEpT
VmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICB9CisKKyAgICBpZiAoZXhlYy0+YXJn
dW1lbnRDb3VudCgpID4gMCAmJiAhZXhlYy0+YXJndW1lbnQoMCkuaXNVbmRlZmluZWRPck51bGwo
KSAmJiAhZXhlYy0+YXJndW1lbnQoMCkuaW5oZXJpdHMoJkpTbG9uZ1tdOjpzX2luZm8pKQorICAg
ICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBWZWN0b3I8aW50PiB4KHRv
TmF0aXZlQXJyYXk8aW50PihleGVjLCBNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAwLCBE
ZWZhdWx0SXNVbmRlZmluZWQpKSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAg
ICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAgIGltcGwtPmZ1
bmMoeCk7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKwor
RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlwZUZ1bmN0
aW9uTXVsdGlUcmFuc2Zlckxpc3QoRXhlY1N0YXRlKiBleGVjKQoreworICAgIEpTVmFsdWUgdGhp
c1ZhbHVlID0gZXhlYy0+aG9zdFRoaXNWYWx1ZSgpOworICAgIGlmICghdGhpc1ZhbHVlLmluaGVy
aXRzKCZKU1Rlc3RUeXBlZGVmczo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1UeXBl
RXJyb3IoZXhlYyk7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNU
ZXN0VHlwZWRlZnMqPihhc09iamVjdCh0aGlzVmFsdWUpKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNU
X0lOSEVSSVRTKGNhc3RlZFRoaXMsICZKU1Rlc3RUeXBlZGVmczo6c19pbmZvKTsKKyAgICBUZXN0
VHlwZWRlZnMqIGltcGwgPSBzdGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5p
bXBsKCkpOworICAgIGlmIChleGVjLT5hcmd1bWVudENvdW50KCkgPCAxKQorICAgICAgICByZXR1
cm4gdGhyb3dWTUVycm9yKGV4ZWMsIGNyZWF0ZU5vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGV4ZWMp
KTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiBmaXJzdChTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6OmNyZWF0ZShleGVjLCBNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAwLCBE
ZWZhdWx0SXNVbmRlZmluZWQpLCAwLCAwKSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigp
KQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworCisgICAg
c2l6ZV90IGFyZ3NDb3VudCA9IGV4ZWMtPmFyZ3VtZW50Q291bnQoKTsKKyAgICBpZiAoYXJnc0Nv
dW50IDw9IDEpIHsKKyAgICAgICAgaW1wbC0+bXVsdGlUcmFuc2Zlckxpc3QoZmlyc3QpOworICAg
ICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAgIH0KKworICAg
IEFycmF5KiB0eCh0b0FycmF5KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDEsIERlZmF1
bHRJc1VuZGVmaW5lZCkpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAg
IHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgaWYgKGFyZ3NDb3Vu
dCA8PSAyKSB7CisgICAgICAgIGltcGwtPm11bHRpVHJhbnNmZXJMaXN0KGZpcnN0LCB0eCk7Cisg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgfQorCisg
ICAgUmVmUHRyPFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4gc2Vjb25kKFNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZTo6Y3JlYXRlKGV4ZWMsIE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDIsIERlZmF1
bHRJc1VuZGVmaW5lZCksIDAsIDApKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisg
ICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgaWYgKGFy
Z3NDb3VudCA8PSAzKSB7CisgICAgICAgIGltcGwtPm11bHRpVHJhbnNmZXJMaXN0KGZpcnN0LCB0
eCwgc2Vjb25kKTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgp
KTsKKyAgICB9CisKKyAgICBBcnJheSogdHh4KHRvQXJyYXkoTUFZQkVfTUlTU0lOR19QQVJBTUVU
RVIoZXhlYywgMywgRGVmYXVsdElzVW5kZWZpbmVkKSkpOworICAgIGlmIChleGVjLT5oYWRFeGNl
cHRpb24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsK
KyAgICBpbXBsLT5tdWx0aVRyYW5zZmVyTGlzdChmaXJzdCwgdHgsIHNlY29uZCwgdHh4KTsKKyAg
ICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworfQorCitFbmNvZGVkSlNW
YWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25TZXRTaGFk
b3coRXhlY1N0YXRlKiBleGVjKQoreworICAgIEpTVmFsdWUgdGhpc1ZhbHVlID0gZXhlYy0+aG9z
dFRoaXNWYWx1ZSgpOworICAgIGlmICghdGhpc1ZhbHVlLmluaGVyaXRzKCZKU1Rlc3RUeXBlZGVm
czo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1UeXBlRXJyb3IoZXhlYyk7CisgICAg
SlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihhc09i
amVjdCh0aGlzVmFsdWUpKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKGNhc3RlZFRo
aXMsICZKU1Rlc3RUeXBlZGVmczo6c19pbmZvKTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcGwgPSBz
dGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAgIGlmIChl
eGVjLT5hcmd1bWVudENvdW50KCkgPCAzKQorICAgICAgICByZXR1cm4gdGhyb3dWTUVycm9yKGV4
ZWMsIGNyZWF0ZU5vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGV4ZWMpKTsKKyAgICBmbG9hdCB3aWR0
aChNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAwLCBEZWZhdWx0SXNVbmRlZmluZWQpLnRv
RmxvYXQoZXhlYykpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICBmbG9hdCBoZWlnaHQoTUFZ
QkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMSwgRGVmYXVsdElzVW5kZWZpbmVkKS50b0Zsb2F0
KGV4ZWMpKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkpCisgICAgICAgIHJldHVybiBK
U1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisgICAgZmxvYXQgYmx1cihNQVlCRV9NSVNT
SU5HX1BBUkFNRVRFUihleGVjLCAyLCBEZWZhdWx0SXNVbmRlZmluZWQpLnRvRmxvYXQoZXhlYykp
OworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKworICAgIHNpemVfdCBhcmdzQ291bnQgPSBleGVjLT5h
cmd1bWVudENvdW50KCk7CisgICAgaWYgKGFyZ3NDb3VudCA8PSAzKSB7CisgICAgICAgIGltcGwt
PnNldFNoYWRvdyh3aWR0aCwgaGVpZ2h0LCBibHVyKTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICB9CisKKyAgICBjb25zdCBTdHJpbmcmIGNvbG9y
KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDMsIERlZmF1bHRJc1VuZGVmaW5lZCkuaXNF
bXB0eSgpID8gU3RyaW5nKCkgOiBNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAzLCBEZWZh
dWx0SXNVbmRlZmluZWQpLnRvU3RyaW5nKGV4ZWMpLT52YWx1ZShleGVjKSk7CisgICAgaWYgKGV4
ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5k
ZWZpbmVkKCkpOworICAgIGlmIChhcmdzQ291bnQgPD0gNCkgeworICAgICAgICBpbXBsLT5zZXRT
aGFkb3cod2lkdGgsIGhlaWdodCwgYmx1ciwgY29sb3IpOworICAgICAgICByZXR1cm4gSlNWYWx1
ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAgIH0KKworICAgIGZsb2F0IGFscGhhKE1BWUJF
X01JU1NJTkdfUEFSQU1FVEVSKGV4ZWMsIDQsIERlZmF1bHRJc1VuZGVmaW5lZCkudG9GbG9hdChl
eGVjKSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4gSlNW
YWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworICAgIGltcGwtPnNldFNoYWRvdyh3aWR0aCwg
aGVpZ2h0LCBibHVyLCBjb2xvciwgYWxwaGEpOworICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUo
anNVbmRlZmluZWQoKSk7Cit9CisKK0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwganNUZXN0
VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk1ldGhvZFdpdGhTZXF1ZW5jZUFyZyhFeGVjU3RhdGUq
IGV4ZWMpCit7CisgICAgSlNWYWx1ZSB0aGlzVmFsdWUgPSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7
CisgICAgaWYgKCF0aGlzVmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pKQor
ICAgICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihleGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVm
cyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1
ZSkpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJVFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5
cGVkZWZzOjpzX2luZm8pOworICAgIFRlc3RUeXBlZGVmcyogaW1wbCA9IHN0YXRpY19jYXN0PFRl
c3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50
Q291bnQoKSA8IDEpCisgICAgICAgIHJldHVybiB0aHJvd1ZNRXJyb3IoZXhlYywgY3JlYXRlTm90
RW5vdWdoQXJndW1lbnRzRXJyb3IoZXhlYykpOworICAgIFZlY3RvcjxSZWZQdHI8U2VyaWFsaXpl
ZFNjcmlwdFZhbHVlPj4gc2VxdWVuY2VBcmcoKHRvUmVmUHRyTmF0aXZlQXJyYXk8U2VyaWFsaXpl
ZFNjcmlwdFZhbHVlLCBKU1NlcmlhbGl6ZWRTY3JpcHRWYWx1ZT4oZXhlYywgTUFZQkVfTUlTU0lO
R19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSwgJnRvU2VyaWFsaXplZFNj
cmlwdFZhbHVlKSkpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKworICAgIEpTQzo6SlNWYWx1ZSBy
ZXN1bHQgPSBqc051bWJlcihpbXBsLT5tZXRob2RXaXRoU2VxdWVuY2VBcmcoc2VxdWVuY2VBcmcp
KTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHJlc3VsdCk7Cit9CisKK0VuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk51bGxhYmxl
QXJyYXlBcmcoRXhlY1N0YXRlKiBleGVjKQoreworICAgIEpTVmFsdWUgdGhpc1ZhbHVlID0gZXhl
Yy0+aG9zdFRoaXNWYWx1ZSgpOworICAgIGlmICghdGhpc1ZhbHVlLmluaGVyaXRzKCZKU1Rlc3RU
eXBlZGVmczo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1UeXBlRXJyb3IoZXhlYyk7
CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMq
Pihhc09iamVjdCh0aGlzVmFsdWUpKTsKKyAgICBBU1NFUlRfR0NfT0JKRUNUX0lOSEVSSVRTKGNh
c3RlZFRoaXMsICZKU1Rlc3RUeXBlZGVmczo6c19pbmZvKTsKKyAgICBUZXN0VHlwZWRlZnMqIGlt
cGwgPSBzdGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlzLT5pbXBsKCkpOworICAg
IGlmIChleGVjLT5hcmd1bWVudENvdW50KCkgPCAxKQorICAgICAgICByZXR1cm4gdGhyb3dWTUVy
cm9yKGV4ZWMsIGNyZWF0ZU5vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGV4ZWMpKTsKKyAgICBWZWN0
b3I8U3RyaW5nPiBhcnJheUFyZyh0b05hdGl2ZUFycmF5PFN0cmluZz4oZXhlYywgTUFZQkVfTUlT
U0lOR19QQVJBTUVURVIoZXhlYywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSkpOworICAgIGlmIChl
eGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1Vu
ZGVmaW5lZCgpKTsKKyAgICBpbXBsLT5udWxsYWJsZUFycmF5QXJnKGFycmF5QXJnKTsKKyAgICBy
ZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworfQorCitFbmNvZGVkSlNWYWx1
ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25GdW5jV2l0aENs
YW1wKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBKU1ZhbHVlIHRoaXNWYWx1ZSA9IGV4ZWMtPmhv
c3RUaGlzVmFsdWUoKTsKKyAgICBpZiAoIXRoaXNWYWx1ZS5pbmhlcml0cygmSlNUZXN0VHlwZWRl
ZnM6OnNfaW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd1ZNVHlwZUVycm9yKGV4ZWMpOworICAg
IEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNP
YmplY3QodGhpc1ZhbHVlKSk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyhjYXN0ZWRU
aGlzLCAmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbyk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0g
c3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBpZiAo
ZXhlYy0+YXJndW1lbnRDb3VudCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1FcnJvcihl
eGVjLCBjcmVhdGVOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihleGVjKSk7CisgICAgdW5zaWduZWQg
bG9uZyBsb25nIGFyZzEgPSAwOworICAgIGRvdWJsZSBhcmcxTmF0aXZlVmFsdWUgPSBleGVjLT5h
cmd1bWVudCgwKS50b051bWJlcihleGVjKTsKKyAgICBpZiAoZXhlYy0+aGFkRXhjZXB0aW9uKCkp
CisgICAgICAgIHJldHVybiBKU1ZhbHVlOjplbmNvZGUoanNVbmRlZmluZWQoKSk7CisKKyAgICBp
ZiAoIWlzbmFuKGFyZzFOYXRpdmVWYWx1ZSkpCisgICAgICAgIGFyZzEgPSBjbGFtcFRvPHVuc2ln
bmVkIGxvbmcgbG9uZz4oYXJnMU5hdGl2ZVZhbHVlKTsKKworCisgICAgc2l6ZV90IGFyZ3NDb3Vu
dCA9IGV4ZWMtPmFyZ3VtZW50Q291bnQoKTsKKyAgICBpZiAoYXJnc0NvdW50IDw9IDEpIHsKKyAg
ICAgICAgaW1wbC0+ZnVuY1dpdGhDbGFtcChhcmcxKTsKKyAgICAgICAgcmV0dXJuIEpTVmFsdWU6
OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcg
YXJnMiA9IDA7CisgICAgZG91YmxlIGFyZzJOYXRpdmVWYWx1ZSA9IGV4ZWMtPmFyZ3VtZW50KDEp
LnRvTnVtYmVyKGV4ZWMpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAgICAg
cmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKworICAgIGlmICghaXNuYW4o
YXJnMk5hdGl2ZVZhbHVlKSkKKyAgICAgICAgYXJnMiA9IGNsYW1wVG88dW5zaWduZWQgbG9uZyBs
b25nPihhcmcyTmF0aXZlVmFsdWUpOworCisgICAgaW1wbC0+ZnVuY1dpdGhDbGFtcChhcmcxLCBh
cmcyKTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworfQorCitF
bmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rp
b25JbW11dGFibGVQb2ludEZ1bmN0aW9uKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBKU1ZhbHVl
IHRoaXNWYWx1ZSA9IGV4ZWMtPmhvc3RUaGlzVmFsdWUoKTsKKyAgICBpZiAoIXRoaXNWYWx1ZS5p
bmhlcml0cygmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd1ZN
VHlwZUVycm9yKGV4ZWMpOworICAgIEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0
PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3QodGhpc1ZhbHVlKSk7CisgICAgQVNTRVJUX0dDX09C
SkVDVF9JTkhFUklUUyhjYXN0ZWRUaGlzLCAmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbyk7CisgICAg
VGVzdFR5cGVkZWZzKiBpbXBsID0gc3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhp
cy0+aW1wbCgpKTsKKworICAgIEpTQzo6SlNWYWx1ZSByZXN1bHQgPSB0b0pTKGV4ZWMsIGNhc3Rl
ZFRoaXMtPmdsb2JhbE9iamVjdCgpLCBXVEY6OmdldFB0cihTVkdQcm9wZXJ0eVRlYXJPZmY8Rmxv
YXRQb2ludD46OmNyZWF0ZShpbXBsLT5pbW11dGFibGVQb2ludEZ1bmN0aW9uKCkpKSk7CisgICAg
cmV0dXJuIEpTVmFsdWU6OmVuY29kZShyZXN1bHQpOworfQorCitFbmNvZGVkSlNWYWx1ZSBKU0Nf
SE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25TdHJpbmdBcnJheUZ1bmN0
aW9uKEV4ZWNTdGF0ZSogZXhlYykKK3sKKyAgICBKU1ZhbHVlIHRoaXNWYWx1ZSA9IGV4ZWMtPmhv
c3RUaGlzVmFsdWUoKTsKKyAgICBpZiAoIXRoaXNWYWx1ZS5pbmhlcml0cygmSlNUZXN0VHlwZWRl
ZnM6OnNfaW5mbykpCisgICAgICAgIHJldHVybiB0aHJvd1ZNVHlwZUVycm9yKGV4ZWMpOworICAg
IEpTVGVzdFR5cGVkZWZzKiBjYXN0ZWRUaGlzID0ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNP
YmplY3QodGhpc1ZhbHVlKSk7CisgICAgQVNTRVJUX0dDX09CSkVDVF9JTkhFUklUUyhjYXN0ZWRU
aGlzLCAmSlNUZXN0VHlwZWRlZnM6OnNfaW5mbyk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsID0g
c3RhdGljX2Nhc3Q8VGVzdFR5cGVkZWZzKj4oY2FzdGVkVGhpcy0+aW1wbCgpKTsKKyAgICBpZiAo
ZXhlYy0+YXJndW1lbnRDb3VudCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1FcnJvcihl
eGVjLCBjcmVhdGVOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihleGVjKSk7CisgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgVmVjdG9yPFN0cmluZz4gdmFsdWVzKHRvTmF0aXZlQXJyYXk8U3Ry
aW5nPihleGVjLCBNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihleGVjLCAwLCBEZWZhdWx0SXNVbmRl
ZmluZWQpKSk7CisgICAgaWYgKGV4ZWMtPmhhZEV4Y2VwdGlvbigpKQorICAgICAgICByZXR1cm4g
SlNWYWx1ZTo6ZW5jb2RlKGpzVW5kZWZpbmVkKCkpOworCisgICAgSlNDOjpKU1ZhbHVlIHJlc3Vs
dCA9IGpzQXJyYXkoZXhlYywgY2FzdGVkVGhpcy0+Z2xvYmFsT2JqZWN0KCksIGltcGwtPnN0cmlu
Z0FycmF5RnVuY3Rpb24odmFsdWVzLCBlYykpOworICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBl
Yyk7CisgICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShyZXN1bHQpOworfQorCitFbmNvZGVkSlNW
YWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25TdHJpbmdB
cnJheUZ1bmN0aW9uMihFeGVjU3RhdGUqIGV4ZWMpCit7CisgICAgSlNWYWx1ZSB0aGlzVmFsdWUg
PSBleGVjLT5ob3N0VGhpc1ZhbHVlKCk7CisgICAgaWYgKCF0aGlzVmFsdWUuaW5oZXJpdHMoJkpT
VGVzdFR5cGVkZWZzOjpzX2luZm8pKQorICAgICAgICByZXR1cm4gdGhyb3dWTVR5cGVFcnJvcihl
eGVjKTsKKyAgICBKU1Rlc3RUeXBlZGVmcyogY2FzdGVkVGhpcyA9IGpzQ2FzdDxKU1Rlc3RUeXBl
ZGVmcyo+KGFzT2JqZWN0KHRoaXNWYWx1ZSkpOworICAgIEFTU0VSVF9HQ19PQkpFQ1RfSU5IRVJJ
VFMoY2FzdGVkVGhpcywgJkpTVGVzdFR5cGVkZWZzOjpzX2luZm8pOworICAgIFRlc3RUeXBlZGVm
cyogaW1wbCA9IHN0YXRpY19jYXN0PFRlc3RUeXBlZGVmcyo+KGNhc3RlZFRoaXMtPmltcGwoKSk7
CisgICAgaWYgKGV4ZWMtPmFyZ3VtZW50Q291bnQoKSA8IDEpCisgICAgICAgIHJldHVybiB0aHJv
d1ZNRXJyb3IoZXhlYywgY3JlYXRlTm90RW5vdWdoQXJndW1lbnRzRXJyb3IoZXhlYykpOworICAg
IEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIFZlY3RvcjxTdHJpbmc+IHZhbHVlcyh0b05hdGl2
ZUFycmF5PFN0cmluZz4oZXhlYywgTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoZXhlYywgMCwgRGVm
YXVsdElzVW5kZWZpbmVkKSkpOworICAgIGlmIChleGVjLT5oYWRFeGNlcHRpb24oKSkKKyAgICAg
ICAgcmV0dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKKworICAgIEpTQzo6SlNW
YWx1ZSByZXN1bHQgPSBqc0FycmF5KGV4ZWMsIGNhc3RlZFRoaXMtPmdsb2JhbE9iamVjdCgpLCBp
bXBsLT5zdHJpbmdBcnJheUZ1bmN0aW9uMih2YWx1ZXMsIGVjKSk7CisgICAgc2V0RE9NRXhjZXB0
aW9uKGV4ZWMsIGVjKTsKKyAgICByZXR1cm4gSlNWYWx1ZTo6ZW5jb2RlKHJlc3VsdCk7Cit9CisK
K0VuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5j
dGlvbk1ldGhvZFdpdGhFeGNlcHRpb24oRXhlY1N0YXRlKiBleGVjKQoreworICAgIEpTVmFsdWUg
dGhpc1ZhbHVlID0gZXhlYy0+aG9zdFRoaXNWYWx1ZSgpOworICAgIGlmICghdGhpc1ZhbHVlLmlu
aGVyaXRzKCZKU1Rlc3RUeXBlZGVmczo6c19pbmZvKSkKKyAgICAgICAgcmV0dXJuIHRocm93Vk1U
eXBlRXJyb3IoZXhlYyk7CisgICAgSlNUZXN0VHlwZWRlZnMqIGNhc3RlZFRoaXMgPSBqc0Nhc3Q8
SlNUZXN0VHlwZWRlZnMqPihhc09iamVjdCh0aGlzVmFsdWUpKTsKKyAgICBBU1NFUlRfR0NfT0JK
RUNUX0lOSEVSSVRTKGNhc3RlZFRoaXMsICZKU1Rlc3RUeXBlZGVmczo6c19pbmZvKTsKKyAgICBU
ZXN0VHlwZWRlZnMqIGltcGwgPSBzdGF0aWNfY2FzdDxUZXN0VHlwZWRlZnMqPihjYXN0ZWRUaGlz
LT5pbXBsKCkpOworICAgIEV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIGltcGwtPm1ldGhvZFdp
dGhFeGNlcHRpb24oZWMpOworICAgIHNldERPTUV4Y2VwdGlvbihleGVjLCBlYyk7CisgICAgcmV0
dXJuIEpTVmFsdWU6OmVuY29kZShqc1VuZGVmaW5lZCgpKTsKK30KKworc3RhdGljIGlubGluZSBi
b29sIGlzT2JzZXJ2YWJsZShKU1Rlc3RUeXBlZGVmcyoganNUZXN0VHlwZWRlZnMpCit7CisgICAg
aWYgKGpzVGVzdFR5cGVkZWZzLT5oYXNDdXN0b21Qcm9wZXJ0aWVzKCkpCisgICAgICAgIHJldHVy
biB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBKU1Rlc3RUeXBlZGVmc093bmVy
Ojppc1JlYWNoYWJsZUZyb21PcGFxdWVSb290cyhKU0M6OkhhbmRsZTxKU0M6OlVua25vd24+IGhh
bmRsZSwgdm9pZCosIFNsb3RWaXNpdG9yJiB2aXNpdG9yKQoreworICAgIEpTVGVzdFR5cGVkZWZz
KiBqc1Rlc3RUeXBlZGVmcyA9IGpzQ2FzdDxKU1Rlc3RUeXBlZGVmcyo+KGhhbmRsZS5nZXQoKS5h
c0NlbGwoKSk7CisgICAgaWYgKCFpc09ic2VydmFibGUoanNUZXN0VHlwZWRlZnMpKQorICAgICAg
ICByZXR1cm4gZmFsc2U7CisgICAgVU5VU0VEX1BBUkFNKHZpc2l0b3IpOworICAgIHJldHVybiBm
YWxzZTsKK30KKwordm9pZCBKU1Rlc3RUeXBlZGVmc093bmVyOjpmaW5hbGl6ZShKU0M6OkhhbmRs
ZTxKU0M6OlVua25vd24+IGhhbmRsZSwgdm9pZCogY29udGV4dCkKK3sKKyAgICBKU1Rlc3RUeXBl
ZGVmcyoganNUZXN0VHlwZWRlZnMgPSBqc0Nhc3Q8SlNUZXN0VHlwZWRlZnMqPihoYW5kbGUuZ2V0
KCkuYXNDZWxsKCkpOworICAgIERPTVdyYXBwZXJXb3JsZCogd29ybGQgPSBzdGF0aWNfY2FzdDxE
T01XcmFwcGVyV29ybGQqPihjb250ZXh0KTsKKyAgICB1bmNhY2hlV3JhcHBlcih3b3JsZCwganNU
ZXN0VHlwZWRlZnMtPmltcGwoKSwganNUZXN0VHlwZWRlZnMpOworICAgIGpzVGVzdFR5cGVkZWZz
LT5yZWxlYXNlSW1wbCgpOworfQorCitKU0M6OkpTVmFsdWUgdG9KUyhKU0M6OkV4ZWNTdGF0ZSog
ZXhlYywgSlNET01HbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgVGVzdFR5cGVkZWZzKiBpbXBs
KQoreworICAgIHJldHVybiB3cmFwPEpTVGVzdFR5cGVkZWZzPihleGVjLCBnbG9iYWxPYmplY3Qs
IGltcGwpOworfQorCitUZXN0VHlwZWRlZnMqIHRvVGVzdFR5cGVkZWZzKEpTQzo6SlNWYWx1ZSB2
YWx1ZSkKK3sKKyAgICByZXR1cm4gdmFsdWUuaW5oZXJpdHMoJkpTVGVzdFR5cGVkZWZzOjpzX2lu
Zm8pID8ganNDYXN0PEpTVGVzdFR5cGVkZWZzKj4oYXNPYmplY3QodmFsdWUpKS0+aW1wbCgpIDog
MDsKK30KKworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90
ZXN0L0pTL0pTVGVzdFR5cGVkZWZzLmggYi9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRz
L3Rlc3QvSlMvSlNUZXN0VHlwZWRlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi40MWYwODA3ZDc3MjRkY2FmOWNl
Mzg1NTU3Nzk1NWYzOGZiMmM5ZGY2Ci0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNvcmUv
YmluZGluZ3Mvc2NyaXB0cy90ZXN0L0pTL0pTVGVzdFR5cGVkZWZzLmgKQEAgLTAsMCArMSwxNzIg
QEAKKy8qCisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNvdXJjZSBw
cm9qZWN0LgorICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtYmlu
ZGluZ3MucGwuIERPIE5PVCBNT0RJRlkhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0
d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVy
IHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNl
IGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAg
ICB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy
IHZlcnNpb24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg
dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp
dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBv
ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGli
cmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ug
c2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1
YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBD
T1BZSU5HLkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu
ZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLAorICAgIEJvc3Rv
biwgTUEgMDIxMTAtMTMwMSwgVVNBLgorKi8KKworI2lmbmRlZiBKU1Rlc3RUeXBlZGVmc19oCisj
ZGVmaW5lIEpTVGVzdFR5cGVkZWZzX2gKKworI2luY2x1ZGUgIkpTRE9NQmluZGluZy5oIgorI2lu
Y2x1ZGUgIlRlc3RUeXBlZGVmcy5oIgorI2luY2x1ZGUgPHJ1bnRpbWUvSlNHbG9iYWxPYmplY3Qu
aD4KKyNpbmNsdWRlIDxydW50aW1lL0pTT2JqZWN0Lmg+CisjaW5jbHVkZSA8cnVudGltZS9PYmpl
Y3RQcm90b3R5cGUuaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitjbGFzcyBKU1Rlc3RUeXBl
ZGVmcyA6IHB1YmxpYyBKU0RPTVdyYXBwZXIgeworcHVibGljOgorICAgIHR5cGVkZWYgSlNET01X
cmFwcGVyIEJhc2U7CisgICAgc3RhdGljIEpTVGVzdFR5cGVkZWZzKiBjcmVhdGUoSlNDOjpTdHJ1
Y3R1cmUqIHN0cnVjdHVyZSwgSlNET01HbG9iYWxPYmplY3QqIGdsb2JhbE9iamVjdCwgUGFzc1Jl
ZlB0cjxUZXN0VHlwZWRlZnM+IGltcGwpCisgICAgeworICAgICAgICBKU1Rlc3RUeXBlZGVmcyog
cHRyID0gbmV3IChOb3ROdWxsLCBKU0M6OmFsbG9jYXRlQ2VsbDxKU1Rlc3RUeXBlZGVmcz4oZ2xv
YmFsT2JqZWN0LT5nbG9iYWxEYXRhKCkuaGVhcCkpIEpTVGVzdFR5cGVkZWZzKHN0cnVjdHVyZSwg
Z2xvYmFsT2JqZWN0LCBpbXBsKTsKKyAgICAgICAgcHRyLT5maW5pc2hDcmVhdGlvbihnbG9iYWxP
YmplY3QtPmdsb2JhbERhdGEoKSk7CisgICAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisgICAg
c3RhdGljIEpTQzo6SlNPYmplY3QqIGNyZWF0ZVByb3RvdHlwZShKU0M6OkV4ZWNTdGF0ZSosIEpT
Qzo6SlNHbG9iYWxPYmplY3QqKTsKKyAgICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9wZXJ0eVNsb3Qo
SlNDOjpKU0NlbGwqLCBKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6UHJvcGVydHlOYW1lLCBKU0M6OlBy
b3BlcnR5U2xvdCYpOworICAgIHN0YXRpYyBib29sIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihK
U0M6OkpTT2JqZWN0KiwgSlNDOjpFeGVjU3RhdGUqLCBKU0M6OlByb3BlcnR5TmFtZSwgSlNDOjpQ
cm9wZXJ0eURlc2NyaXB0b3ImKTsKKyAgICBzdGF0aWMgdm9pZCBwdXQoSlNDOjpKU0NlbGwqLCBK
U0M6OkV4ZWNTdGF0ZSosIEpTQzo6UHJvcGVydHlOYW1lLCBKU0M6OkpTVmFsdWUsIEpTQzo6UHV0
UHJvcGVydHlTbG90Jik7CisgICAgc3RhdGljIHZvaWQgZGVzdHJveShKU0M6OkpTQ2VsbCopOwor
ICAgIH5KU1Rlc3RUeXBlZGVmcygpOworICAgIHN0YXRpYyBjb25zdCBKU0M6OkNsYXNzSW5mbyBz
X2luZm87CisKKyAgICBzdGF0aWMgSlNDOjpTdHJ1Y3R1cmUqIGNyZWF0ZVN0cnVjdHVyZShKU0M6
OkpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgSlNDOjpKU0dsb2JhbE9iamVjdCogZ2xvYmFsT2Jq
ZWN0LCBKU0M6OkpTVmFsdWUgcHJvdG90eXBlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEpTQzo6
U3RydWN0dXJlOjpjcmVhdGUoZ2xvYmFsRGF0YSwgZ2xvYmFsT2JqZWN0LCBwcm90b3R5cGUsIEpT
Qzo6VHlwZUluZm8oSlNDOjpPYmplY3RUeXBlLCBTdHJ1Y3R1cmVGbGFncyksICZzX2luZm8pOwor
ICAgIH0KKworICAgIHN0YXRpYyBKU0M6OkpTVmFsdWUgZ2V0Q29uc3RydWN0b3IoSlNDOjpFeGVj
U3RhdGUqLCBKU0M6OkpTR2xvYmFsT2JqZWN0Kik7CisgICAgVGVzdFR5cGVkZWZzKiBpbXBsKCkg
Y29uc3QgeyByZXR1cm4gbV9pbXBsOyB9CisgICAgdm9pZCByZWxlYXNlSW1wbCgpIHsgbV9pbXBs
LT5kZXJlZigpOyBtX2ltcGwgPSAwOyB9CisKKyAgICB2b2lkIHJlbGVhc2VJbXBsSWZOb3ROdWxs
KCkgeyBpZiAobV9pbXBsKSB7IG1faW1wbC0+ZGVyZWYoKTsgbV9pbXBsID0gMDsgfSB9CisKK3By
aXZhdGU6CisgICAgVGVzdFR5cGVkZWZzKiBtX2ltcGw7Citwcm90ZWN0ZWQ6CisgICAgSlNUZXN0
VHlwZWRlZnMoSlNDOjpTdHJ1Y3R1cmUqLCBKU0RPTUdsb2JhbE9iamVjdCosIFBhc3NSZWZQdHI8
VGVzdFR5cGVkZWZzPik7CisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihKU0M6OkpTR2xvYmFsRGF0
YSYpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEpTQzo6T3Zl
cnJpZGVzR2V0T3duUHJvcGVydHlTbG90IHwgSlNDOjpJbnRlcmNlcHRzR2V0T3duUHJvcGVydHlT
bG90QnlJbmRleEV2ZW5XaGVuTGVuZ3RoSXNOb3RaZXJvIHwgQmFzZTo6U3RydWN0dXJlRmxhZ3M7
Cit9OworCitjbGFzcyBKU1Rlc3RUeXBlZGVmc093bmVyIDogcHVibGljIEpTQzo6V2Vha0hhbmRs
ZU93bmVyIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIGJvb2wgaXNSZWFjaGFibGVGcm9tT3BhcXVl
Um9vdHMoSlNDOjpIYW5kbGU8SlNDOjpVbmtub3duPiwgdm9pZCogY29udGV4dCwgSlNDOjpTbG90
VmlzaXRvciYpOworICAgIHZpcnR1YWwgdm9pZCBmaW5hbGl6ZShKU0M6OkhhbmRsZTxKU0M6OlVu
a25vd24+LCB2b2lkKiBjb250ZXh0KTsKK307CisKK2lubGluZSBKU0M6OldlYWtIYW5kbGVPd25l
ciogd3JhcHBlck93bmVyKERPTVdyYXBwZXJXb3JsZCosIFRlc3RUeXBlZGVmcyopCit7CisgICAg
REVGSU5FX1NUQVRJQ19MT0NBTChKU1Rlc3RUeXBlZGVmc093bmVyLCBqc1Rlc3RUeXBlZGVmc093
bmVyLCAoKSk7CisgICAgcmV0dXJuICZqc1Rlc3RUeXBlZGVmc093bmVyOworfQorCitpbmxpbmUg
dm9pZCogd3JhcHBlckNvbnRleHQoRE9NV3JhcHBlcldvcmxkKiB3b3JsZCwgVGVzdFR5cGVkZWZz
KikKK3sKKyAgICByZXR1cm4gd29ybGQ7Cit9CisKK0pTQzo6SlNWYWx1ZSB0b0pTKEpTQzo6RXhl
Y1N0YXRlKiwgSlNET01HbG9iYWxPYmplY3QqLCBUZXN0VHlwZWRlZnMqKTsKK1Rlc3RUeXBlZGVm
cyogdG9UZXN0VHlwZWRlZnMoSlNDOjpKU1ZhbHVlKTsKKworY2xhc3MgSlNUZXN0VHlwZWRlZnNQ
cm90b3R5cGUgOiBwdWJsaWMgSlNDOjpKU05vbkZpbmFsT2JqZWN0IHsKK3B1YmxpYzoKKyAgICB0
eXBlZGVmIEpTQzo6SlNOb25GaW5hbE9iamVjdCBCYXNlOworICAgIHN0YXRpYyBKU0M6OkpTT2Jq
ZWN0KiBzZWxmKEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpKU0dsb2JhbE9iamVjdCopOworICAgIHN0
YXRpYyBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSogY3JlYXRlKEpTQzo6SlNHbG9iYWxEYXRhJiBn
bG9iYWxEYXRhLCBKU0M6OkpTR2xvYmFsT2JqZWN0KiBnbG9iYWxPYmplY3QsIEpTQzo6U3RydWN0
dXJlKiBzdHJ1Y3R1cmUpCisgICAgeworICAgICAgICBKU1Rlc3RUeXBlZGVmc1Byb3RvdHlwZSog
cHRyID0gbmV3IChOb3ROdWxsLCBKU0M6OmFsbG9jYXRlQ2VsbDxKU1Rlc3RUeXBlZGVmc1Byb3Rv
dHlwZT4oZ2xvYmFsRGF0YS5oZWFwKSkgSlNUZXN0VHlwZWRlZnNQcm90b3R5cGUoZ2xvYmFsRGF0
YSwgZ2xvYmFsT2JqZWN0LCBzdHJ1Y3R1cmUpOworICAgICAgICBwdHItPmZpbmlzaENyZWF0aW9u
KGdsb2JhbERhdGEpOworICAgICAgICByZXR1cm4gcHRyOworICAgIH0KKworICAgIHN0YXRpYyBj
b25zdCBKU0M6OkNsYXNzSW5mbyBzX2luZm87CisgICAgc3RhdGljIGJvb2wgZ2V0T3duUHJvcGVy
dHlTbG90KEpTQzo6SlNDZWxsKiwgSlNDOjpFeGVjU3RhdGUqLCBKU0M6OlByb3BlcnR5TmFtZSwg
SlNDOjpQcm9wZXJ0eVNsb3QmKTsKKyAgICBzdGF0aWMgYm9vbCBnZXRPd25Qcm9wZXJ0eURlc2Ny
aXB0b3IoSlNDOjpKU09iamVjdCosIEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpQcm9wZXJ0eU5hbWUs
IEpTQzo6UHJvcGVydHlEZXNjcmlwdG9yJik7CisgICAgc3RhdGljIEpTQzo6U3RydWN0dXJlKiBj
cmVhdGVTdHJ1Y3R1cmUoSlNDOjpKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIEpTQzo6SlNHbG9i
YWxPYmplY3QqIGdsb2JhbE9iamVjdCwgSlNDOjpKU1ZhbHVlIHByb3RvdHlwZSkKKyAgICB7Cisg
ICAgICAgIHJldHVybiBKU0M6OlN0cnVjdHVyZTo6Y3JlYXRlKGdsb2JhbERhdGEsIGdsb2JhbE9i
amVjdCwgcHJvdG90eXBlLCBKU0M6OlR5cGVJbmZvKEpTQzo6T2JqZWN0VHlwZSwgU3RydWN0dXJl
RmxhZ3MpLCAmc19pbmZvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgSlNUZXN0VHlwZWRlZnNQ
cm90b3R5cGUoSlNDOjpKU0dsb2JhbERhdGEmIGdsb2JhbERhdGEsIEpTQzo6SlNHbG9iYWxPYmpl
Y3QqLCBKU0M6OlN0cnVjdHVyZSogc3RydWN0dXJlKSA6IEpTQzo6SlNOb25GaW5hbE9iamVjdChn
bG9iYWxEYXRhLCBzdHJ1Y3R1cmUpIHsgfQorcHJvdGVjdGVkOgorICAgIHN0YXRpYyBjb25zdCB1
bnNpZ25lZCBTdHJ1Y3R1cmVGbGFncyA9IEpTQzo6T3ZlcnJpZGVzR2V0T3duUHJvcGVydHlTbG90
IHwgQmFzZTo6U3RydWN0dXJlRmxhZ3M7Cit9OworCitjbGFzcyBKU1Rlc3RUeXBlZGVmc0NvbnN0
cnVjdG9yIDogcHVibGljIERPTUNvbnN0cnVjdG9yT2JqZWN0IHsKK3ByaXZhdGU6CisgICAgSlNU
ZXN0VHlwZWRlZnNDb25zdHJ1Y3RvcihKU0M6OlN0cnVjdHVyZSosIEpTRE9NR2xvYmFsT2JqZWN0
Kik7CisgICAgdm9pZCBmaW5pc2hDcmVhdGlvbihKU0M6OkV4ZWNTdGF0ZSosIEpTRE9NR2xvYmFs
T2JqZWN0Kik7CisKK3B1YmxpYzoKKyAgICB0eXBlZGVmIERPTUNvbnN0cnVjdG9yT2JqZWN0IEJh
c2U7CisgICAgc3RhdGljIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3IqIGNyZWF0ZShKU0M6OkV4
ZWNTdGF0ZSogZXhlYywgSlNDOjpTdHJ1Y3R1cmUqIHN0cnVjdHVyZSwgSlNET01HbG9iYWxPYmpl
Y3QqIGdsb2JhbE9iamVjdCkKKyAgICB7CisgICAgICAgIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0
b3IqIHB0ciA9IG5ldyAoTm90TnVsbCwgSlNDOjphbGxvY2F0ZUNlbGw8SlNUZXN0VHlwZWRlZnND
b25zdHJ1Y3Rvcj4oKmV4ZWMtPmhlYXAoKSkpIEpTVGVzdFR5cGVkZWZzQ29uc3RydWN0b3Ioc3Ry
dWN0dXJlLCBnbG9iYWxPYmplY3QpOworICAgICAgICBwdHItPmZpbmlzaENyZWF0aW9uKGV4ZWMs
IGdsb2JhbE9iamVjdCk7CisgICAgICAgIHJldHVybiBwdHI7CisgICAgfQorCisgICAgc3RhdGlj
IGJvb2wgZ2V0T3duUHJvcGVydHlTbG90KEpTQzo6SlNDZWxsKiwgSlNDOjpFeGVjU3RhdGUqLCBK
U0M6OlByb3BlcnR5TmFtZSwgSlNDOjpQcm9wZXJ0eVNsb3QmKTsKKyAgICBzdGF0aWMgYm9vbCBn
ZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSlNDOjpKU09iamVjdCosIEpTQzo6RXhlY1N0YXRlKiwg
SlNDOjpQcm9wZXJ0eU5hbWUsIEpTQzo6UHJvcGVydHlEZXNjcmlwdG9yJik7CisgICAgc3RhdGlj
IGNvbnN0IEpTQzo6Q2xhc3NJbmZvIHNfaW5mbzsKKyAgICBzdGF0aWMgSlNDOjpTdHJ1Y3R1cmUq
IGNyZWF0ZVN0cnVjdHVyZShKU0M6OkpTR2xvYmFsRGF0YSYgZ2xvYmFsRGF0YSwgSlNDOjpKU0ds
b2JhbE9iamVjdCogZ2xvYmFsT2JqZWN0LCBKU0M6OkpTVmFsdWUgcHJvdG90eXBlKQorICAgIHsK
KyAgICAgICAgcmV0dXJuIEpTQzo6U3RydWN0dXJlOjpjcmVhdGUoZ2xvYmFsRGF0YSwgZ2xvYmFs
T2JqZWN0LCBwcm90b3R5cGUsIEpTQzo6VHlwZUluZm8oSlNDOjpPYmplY3RUeXBlLCBTdHJ1Y3R1
cmVGbGFncyksICZzX2luZm8pOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBzdGF0aWMgY29uc3Qg
dW5zaWduZWQgU3RydWN0dXJlRmxhZ3MgPSBKU0M6Ok92ZXJyaWRlc0dldE93blByb3BlcnR5U2xv
dCB8IEpTQzo6SW1wbGVtZW50c0hhc0luc3RhbmNlIHwgRE9NQ29uc3RydWN0b3JPYmplY3Q6OlN0
cnVjdHVyZUZsYWdzOworICAgIHN0YXRpYyBKU0M6OkVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NB
TEwgY29uc3RydWN0SlNUZXN0VHlwZWRlZnMoSlNDOjpFeGVjU3RhdGUqKTsKKyAgICBzdGF0aWMg
SlNDOjpDb25zdHJ1Y3RUeXBlIGdldENvbnN0cnVjdERhdGEoSlNDOjpKU0NlbGwqLCBKU0M6OkNv
bnN0cnVjdERhdGEmKTsKK307CisKKy8vIEZ1bmN0aW9ucworCitKU0M6OkVuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbkZ1bmMoSlNDOjpF
eGVjU3RhdGUqKTsKK0pTQzo6RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBl
ZGVmc1Byb3RvdHlwZUZ1bmN0aW9uTXVsdGlUcmFuc2Zlckxpc3QoSlNDOjpFeGVjU3RhdGUqKTsK
K0pTQzo6RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlw
ZUZ1bmN0aW9uU2V0U2hhZG93KEpTQzo6RXhlY1N0YXRlKik7CitKU0M6OkVuY29kZWRKU1ZhbHVl
IEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk1ldGhvZFdpdGhT
ZXF1ZW5jZUFyZyhKU0M6OkV4ZWNTdGF0ZSopOworSlNDOjpFbmNvZGVkSlNWYWx1ZSBKU0NfSE9T
VF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rpb25OdWxsYWJsZUFycmF5QXJnKEpT
Qzo6RXhlY1N0YXRlKik7CitKU0M6OkVuY29kZWRKU1ZhbHVlIEpTQ19IT1NUX0NBTEwganNUZXN0
VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbkZ1bmNXaXRoQ2xhbXAoSlNDOjpFeGVjU3RhdGUqKTsK
K0pTQzo6RW5jb2RlZEpTVmFsdWUgSlNDX0hPU1RfQ0FMTCBqc1Rlc3RUeXBlZGVmc1Byb3RvdHlw
ZUZ1bmN0aW9uSW1tdXRhYmxlUG9pbnRGdW5jdGlvbihKU0M6OkV4ZWNTdGF0ZSopOworSlNDOjpF
bmNvZGVkSlNWYWx1ZSBKU0NfSE9TVF9DQUxMIGpzVGVzdFR5cGVkZWZzUHJvdG90eXBlRnVuY3Rp
b25TdHJpbmdBcnJheUZ1bmN0aW9uKEpTQzo6RXhlY1N0YXRlKik7CitKU0M6OkVuY29kZWRKU1Zh
bHVlIEpTQ19IT1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvblN0cmluZ0Fy
cmF5RnVuY3Rpb24yKEpTQzo6RXhlY1N0YXRlKik7CitKU0M6OkVuY29kZWRKU1ZhbHVlIEpTQ19I
T1NUX0NBTEwganNUZXN0VHlwZWRlZnNQcm90b3R5cGVGdW5jdGlvbk1ldGhvZFdpdGhFeGNlcHRp
b24oSlNDOjpFeGVjU3RhdGUqKTsKKy8vIEF0dHJpYnV0ZXMKKworSlNDOjpKU1ZhbHVlIGpzVGVz
dFR5cGVkZWZzVW5zaWduZWRMb25nTG9uZ0F0dHIoSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTVmFs
dWUsIEpTQzo6UHJvcGVydHlOYW1lKTsKK3ZvaWQgc2V0SlNUZXN0VHlwZWRlZnNVbnNpZ25lZExv
bmdMb25nQXR0cihKU0M6OkV4ZWNTdGF0ZSosIEpTQzo6SlNPYmplY3QqLCBKU0M6OkpTVmFsdWUp
OworSlNDOjpKU1ZhbHVlIGpzVGVzdFR5cGVkZWZzSW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZh
bHVlKEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpKU1ZhbHVlLCBKU0M6OlByb3BlcnR5TmFtZSk7Cit2
b2lkIHNldEpTVGVzdFR5cGVkZWZzSW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKEpTQzo6
RXhlY1N0YXRlKiwgSlNDOjpKU09iamVjdCosIEpTQzo6SlNWYWx1ZSk7CitKU0M6OkpTVmFsdWUg
anNUZXN0VHlwZWRlZnNDb25zdHJ1Y3RvclRlc3RTdWJPYmooSlNDOjpFeGVjU3RhdGUqLCBKU0M6
OkpTVmFsdWUsIEpTQzo6UHJvcGVydHlOYW1lKTsKK0pTQzo6SlNWYWx1ZSBqc1Rlc3RUeXBlZGVm
c0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpKU1ZhbHVlLCBK
U0M6OlByb3BlcnR5TmFtZSk7Cit2b2lkIHNldEpTVGVzdFR5cGVkZWZzQXR0cldpdGhHZXR0ZXJF
eGNlcHRpb24oSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTT2JqZWN0KiwgSlNDOjpKU1ZhbHVlKTsK
K0pTQzo6SlNWYWx1ZSBqc1Rlc3RUeXBlZGVmc0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKEpTQzo6
RXhlY1N0YXRlKiwgSlNDOjpKU1ZhbHVlLCBKU0M6OlByb3BlcnR5TmFtZSk7Cit2b2lkIHNldEpT
VGVzdFR5cGVkZWZzQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24oSlNDOjpFeGVjU3RhdGUqLCBKU0M6
OkpTT2JqZWN0KiwgSlNDOjpKU1ZhbHVlKTsKK0pTQzo6SlNWYWx1ZSBqc1Rlc3RUeXBlZGVmc1N0
cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpKU1ZhbHVl
LCBKU0M6OlByb3BlcnR5TmFtZSk7Cit2b2lkIHNldEpTVGVzdFR5cGVkZWZzU3RyaW5nQXR0cldp
dGhHZXR0ZXJFeGNlcHRpb24oSlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTT2JqZWN0KiwgSlNDOjpK
U1ZhbHVlKTsKK0pTQzo6SlNWYWx1ZSBqc1Rlc3RUeXBlZGVmc1N0cmluZ0F0dHJXaXRoU2V0dGVy
RXhjZXB0aW9uKEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpKU1ZhbHVlLCBKU0M6OlByb3BlcnR5TmFt
ZSk7Cit2b2lkIHNldEpTVGVzdFR5cGVkZWZzU3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24o
SlNDOjpFeGVjU3RhdGUqLCBKU0M6OkpTT2JqZWN0KiwgSlNDOjpKU1ZhbHVlKTsKK0pTQzo6SlNW
YWx1ZSBqc1Rlc3RUeXBlZGVmc0NvbnN0cnVjdG9yKEpTQzo6RXhlY1N0YXRlKiwgSlNDOjpKU1Zh
bHVlLCBKU0M6OlByb3BlcnR5TmFtZSk7CisKK30gLy8gbmFtZXNwYWNlIFdlYkNvcmUKKworI2Vu
ZGlmCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9iaW5kaW5ncy9zY3JpcHRzL3Rlc3QvT2Jq
Qy9ET01UZXN0VHlwZWRlZnMuaCBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVz
dC9PYmpDL0RPTVRlc3RUeXBlZGVmcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAuLjRmZmQ3ZjMwMDA5Y2M4MjFlZjAy
YzE2ZGNjMzViZTIwMDAxYzFhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9Tb3VyY2UvV2ViQ29yZS9i
aW5kaW5ncy9zY3JpcHRzL3Rlc3QvT2JqQy9ET01UZXN0VHlwZWRlZnMuaApAQCAtMCwwICsxLDQ5
IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA1LCAyMDA2LCAyMDA3LCAyMDA4LCAy
MDA5IEFwcGxlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAw
NiBTYW11ZWwgV2VpbmlnIDxzYW0ud2VpbmlnQGdtYWlsLmNvbT4KKyAqCisgKiBSZWRpc3RyaWJ1
dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQK
KyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dp
bmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3Vy
Y2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRo
aXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAy
LiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Ig
b3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBU
SElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMn
JyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBC
VVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5U
QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVND
TEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENP
TlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFM
LCBTUEVDSUFMLAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xV
RElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBH
T09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBC
VVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisg
KiBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S
IFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4g
QU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJ
U0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2ltcG9ydCA8
V2ViQ29yZS9ET01PYmplY3QuaD4KKworI2lmIFdFQktJVF9WRVJTSU9OX01BWF9BTExPV0VEID49
IFdFQktJVF9WRVJTSU9OX0xBVEVTVAorCitAY2xhc3MgRE9NQXJyYXk7CitAY2xhc3MgRE9NU1ZH
UG9pbnQ7CitAY2xhc3MgTlNTdHJpbmc7CisKK0BpbnRlcmZhY2UgRE9NVGVzdFR5cGVkZWZzIDog
RE9NT2JqZWN0CitAcHJvcGVydHkgdW5zaWduZWQgbG9uZyBsb25nIHVuc2lnbmVkTG9uZ0xvbmdB
dHRyOworQHByb3BlcnR5KHJldGFpbikgTlNTdHJpbmcgKmltbXV0YWJsZVNlcmlhbGl6ZWRTY3Jp
cHRWYWx1ZTsKK0Bwcm9wZXJ0eSBpbnQgYXR0cldpdGhHZXR0ZXJFeGNlcHRpb247CitAcHJvcGVy
dHkgaW50IGF0dHJXaXRoU2V0dGVyRXhjZXB0aW9uOworQHByb3BlcnR5KGNvcHkpIE5TU3RyaW5n
ICpzdHJpbmdBdHRyV2l0aEdldHRlckV4Y2VwdGlvbjsKK0Bwcm9wZXJ0eShjb3B5KSBOU1N0cmlu
ZyAqc3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb247CisKKy0gKHZvaWQpbXVsdGlUcmFuc2Zl
ckxpc3Q6KE5TU3RyaW5nICopZmlyc3QgdHg6KERPTUFycmF5ICopdHggc2Vjb25kOihOU1N0cmlu
ZyAqKXNlY29uZCB0eHg6KERPTUFycmF5ICopdHh4OworLSAodm9pZClzZXRTaGFkb3c6KGZsb2F0
KXdpZHRoIGhlaWdodDooZmxvYXQpaGVpZ2h0IGJsdXI6KGZsb2F0KWJsdXIgY29sb3I6KE5TU3Ry
aW5nICopY29sb3IgYWxwaGE6KGZsb2F0KWFscGhhOworLSAoRE9NU1ZHUG9pbnQgKilpbW11dGFi
bGVQb2ludEZ1bmN0aW9uOworLSAodm9pZCltZXRob2RXaXRoRXhjZXB0aW9uOworQGVuZAorCisj
ZW5kaWYKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9P
YmpDL0RPTVRlc3RUeXBlZGVmcy5tbSBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMv
dGVzdC9PYmpDL0RPTVRlc3RUeXBlZGVmcy5tbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwLi5lYjAyYTAyMmIyZDM3OTQ2
M2Y2ZWU5YzM5MDNhNTM2NzRlMTQ0YTUxCi0tLSAvZGV2L251bGwKKysrIGIvU291cmNlL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzLm1tCkBAIC0wLDAg
KzEsMjAyIEBACisvKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNv
dXJjZSBwcm9qZWN0LgorICogVGhpcyBmaWxlIGhhcyBiZWVuIGdlbmVyYXRlZCBieSBnZW5lcmF0
ZS1iaW5kaW5ncy5wbC4gRE8gTk9UIE1PRElGWSEKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt
dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBv
ZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3Ry
aWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdo
dAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2lu
ZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0
ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRX
QVJFIElTIFBST1ZJREVEIEJZIEFQUExFIENPTVBVVEVSLCBJTkMuIGBgQVMgSVMnJyBBTkQgQU5Z
CisgKiBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJ
TUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB
TkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAg
SU4gTk8gRVZFTlQgU0hBTEwgQVBQTEUgQ09NUFVURVIsIElOQy4gT1IKKyAqIENPTlRSSUJVVE9S
UyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFM
LAorICogRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU
IE5PVCBMSU1JVEVEIFRPLAorICogUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBT
RVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SCisgKiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJ
TlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCisgKiBPRiBMSUFC
SUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAq
IChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBP
VVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRI
RSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4gCisgKi8KKworI2ltcG9ydCAiY29uZmlnLmgi
CisjaW1wb3J0ICJET01JbnRlcm5hbC5oIgorCisjaW1wb3J0ICJET01UZXN0VHlwZWRlZnMuaCIK
KworI2ltcG9ydCAiQXJyYXkuaCIKKyNpbXBvcnQgIkRPTUFycmF5SW50ZXJuYWwuaCIKKyNpbXBv
cnQgIkRPTUJsb2JJbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9NQ1NTUnVsZUludGVybmFsLmgiCisj
aW1wb3J0ICJET01DU1NWYWx1ZUludGVybmFsLmgiCisjaW1wb3J0ICJET01FdmVudEludGVybmFs
LmgiCisjaW1wb3J0ICJET01Ob2RlSW50ZXJuYWwuaCIKKyNpbXBvcnQgIkRPTVNWR1BvaW50SW50
ZXJuYWwuaCIKKyNpbXBvcnQgIkRPTVN0eWxlU2hlZXRJbnRlcm5hbC5oIgorI2ltcG9ydCAiRE9N
VGVzdFR5cGVkZWZzSW50ZXJuYWwuaCIKKyNpbXBvcnQgIkV4Y2VwdGlvbkhhbmRsZXJzLmgiCisj
aW1wb3J0ICJKU01haW5UaHJlYWRFeGVjU3RhdGUuaCIKKyNpbXBvcnQgIktVUkwuaCIKKyNpbXBv
cnQgIlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorI2ltcG9ydCAiVGVzdFR5cGVkZWZzLmgiCisj
aW1wb3J0ICJUaHJlYWRDaGVjay5oIgorI2ltcG9ydCAiV2ViQ29yZU9iakNFeHRyYXMuaCIKKyNp
bXBvcnQgIldlYlNjcmlwdE9iamVjdFByaXZhdGUuaCIKKyNpbXBvcnQgPHd0Zi9HZXRQdHIuaD4K
KworI2RlZmluZSBJTVBMIHJlaW50ZXJwcmV0X2Nhc3Q8V2ViQ29yZTo6VGVzdFR5cGVkZWZzKj4o
X2ludGVybmFsKQorCitAaW1wbGVtZW50YXRpb24gRE9NVGVzdFR5cGVkZWZzCisKKy0gKHZvaWQp
ZGVhbGxvYworeworICAgIGlmIChXZWJDb3JlT2JqQ1NjaGVkdWxlRGVhbGxvY2F0ZU9uTWFpblRo
cmVhZChbRE9NVGVzdFR5cGVkZWZzIGNsYXNzXSwgc2VsZikpCisgICAgICAgIHJldHVybjsKKwor
ICAgIGlmIChfaW50ZXJuYWwpCisgICAgICAgIElNUEwtPmRlcmVmKCk7CisgICAgW3N1cGVyIGRl
YWxsb2NdOworfQorCistICh2b2lkKWZpbmFsaXplCit7CisgICAgaWYgKF9pbnRlcm5hbCkKKyAg
ICAgICAgSU1QTC0+ZGVyZWYoKTsKKyAgICBbc3VwZXIgZmluYWxpemVdOworfQorCistICh1bnNp
Z25lZCBsb25nIGxvbmcpdW5zaWduZWRMb25nTG9uZ0F0dHIKK3sKKyAgICBXZWJDb3JlOjpKU01h
aW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgcmV0dXJuIElNUEwtPnVuc2lnbmVkTG9uZ0xv
bmdBdHRyKCk7Cit9CisKKy0gKHZvaWQpc2V0VW5zaWduZWRMb25nTG9uZ0F0dHI6KHVuc2lnbmVk
IGxvbmcgbG9uZyluZXdVbnNpZ25lZExvbmdMb25nQXR0cgoreworICAgIFdlYkNvcmU6OkpTTWFp
blRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBJTVBMLT5zZXRVbnNpZ25lZExvbmdMb25nQXR0
cihuZXdVbnNpZ25lZExvbmdMb25nQXR0cik7Cit9CisKKy0gKE5TU3RyaW5nICopaW1tdXRhYmxl
U2VyaWFsaXplZFNjcmlwdFZhbHVlCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0
YXRlIHN0YXRlOworICAgIHJldHVybiBJTVBMLT5pbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFs
dWUoKS0+dG9TdHJpbmcoKTsKK30KKworLSAodm9pZClzZXRJbW11dGFibGVTZXJpYWxpemVkU2Ny
aXB0VmFsdWU6KE5TU3RyaW5nICopbmV3SW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlCit7
CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIEFTU0VSVChu
ZXdJbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUpOworCisgICAgSU1QTC0+c2V0SW1tdXRh
YmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlKFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRWYWx1ZTo6
Y3JlYXRlKFdURjo6U3RyaW5nKG5ld0ltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSkpKTsK
K30KKworLSAoaW50KWF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uCit7CisgICAgV2ViQ29yZTo6SlNN
YWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMg
PSAwOworICAgIGludCByZXN1bHQgPSBJTVBMLT5hdHRyV2l0aEdldHRlckV4Y2VwdGlvbihlYyk7
CisgICAgV2ViQ29yZTo6cmFpc2VPbkRPTUVycm9yKGVjKTsKKyAgICByZXR1cm4gcmVzdWx0Owor
fQorCistICh2b2lkKXNldEF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uOihpbnQpbmV3QXR0cldpdGhH
ZXR0ZXJFeGNlcHRpb24KK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3Rh
dGU7CisgICAgSU1QTC0+c2V0QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24obmV3QXR0cldpdGhHZXR0
ZXJFeGNlcHRpb24pOworfQorCistIChpbnQpYXR0cldpdGhTZXR0ZXJFeGNlcHRpb24KK3sKKyAg
ICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgcmV0dXJuIElNUEwt
PmF0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKCk7Cit9CisKKy0gKHZvaWQpc2V0QXR0cldpdGhTZXR0
ZXJFeGNlcHRpb246KGludCluZXdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbgoreworICAgIFdlYkNv
cmU6OkpTTWFpblRocmVhZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICBXZWJDb3JlOjpFeGNlcHRpb25D
b2RlIGVjID0gMDsKKyAgICBJTVBMLT5zZXRBdHRyV2l0aFNldHRlckV4Y2VwdGlvbihuZXdBdHRy
V2l0aFNldHRlckV4Y2VwdGlvbiwgZWMpOworICAgIFdlYkNvcmU6OnJhaXNlT25ET01FcnJvcihl
Yyk7Cit9CisKKy0gKE5TU3RyaW5nICopc3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24KK3sK
KyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgV2ViQ29yZTo6
RXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgTlNTdHJpbmcgKnJlc3VsdCA9IElNUEwtPnN0cmlu
Z0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uKGVjKTsKKyAgICBXZWJDb3JlOjpyYWlzZU9uRE9NRXJy
b3IoZWMpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy0gKHZvaWQpc2V0U3RyaW5nQXR0cldp
dGhHZXR0ZXJFeGNlcHRpb246KE5TU3RyaW5nICopbmV3U3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNl
cHRpb24KK3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAg
SU1QTC0+c2V0U3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24obmV3U3RyaW5nQXR0cldpdGhH
ZXR0ZXJFeGNlcHRpb24pOworfQorCistIChOU1N0cmluZyAqKXN0cmluZ0F0dHJXaXRoU2V0dGVy
RXhjZXB0aW9uCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOwor
ICAgIHJldHVybiBJTVBMLT5zdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbigpOworfQorCist
ICh2b2lkKXNldFN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uOihOU1N0cmluZyAqKW5ld1N0
cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uCit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFk
TnVsbFN0YXRlIHN0YXRlOworICAgIFdlYkNvcmU6OkV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAg
IElNUEwtPnNldFN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uKG5ld1N0cmluZ0F0dHJXaXRo
U2V0dGVyRXhjZXB0aW9uLCBlYyk7CisgICAgV2ViQ29yZTo6cmFpc2VPbkRPTUVycm9yKGVjKTsK
K30KKworLSAodm9pZCltdWx0aVRyYW5zZmVyTGlzdDooTlNTdHJpbmcgKilmaXJzdCB0eDooRE9N
QXJyYXkgKil0eCBzZWNvbmQ6KE5TU3RyaW5nICopc2Vjb25kIHR4eDooRE9NQXJyYXkgKil0eHgK
K3sKKyAgICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgSU1QTC0+
bXVsdGlUcmFuc2Zlckxpc3QoV2ViQ29yZTo6U2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUo
V1RGOjpTdHJpbmcoZmlyc3QpKSwgY29yZSh0eCksIFdlYkNvcmU6OlNlcmlhbGl6ZWRTY3JpcHRW
YWx1ZTo6Y3JlYXRlKFdURjo6U3RyaW5nKHNlY29uZCkpLCBjb3JlKHR4eCkpOworfQorCistICh2
b2lkKXNldFNoYWRvdzooZmxvYXQpd2lkdGggaGVpZ2h0OihmbG9hdCloZWlnaHQgYmx1cjooZmxv
YXQpYmx1ciBjb2xvcjooTlNTdHJpbmcgKiljb2xvciBhbHBoYTooZmxvYXQpYWxwaGEKK3sKKyAg
ICBXZWJDb3JlOjpKU01haW5UaHJlYWROdWxsU3RhdGUgc3RhdGU7CisgICAgSU1QTC0+c2V0U2hh
ZG93KHdpZHRoLCBoZWlnaHQsIGJsdXIsIGNvbG9yLCBhbHBoYSk7Cit9CisKKy0gKERPTVNWR1Bv
aW50ICopaW1tdXRhYmxlUG9pbnRGdW5jdGlvbgoreworICAgIFdlYkNvcmU6OkpTTWFpblRocmVh
ZE51bGxTdGF0ZSBzdGF0ZTsKKyAgICByZXR1cm4ga2l0KFdURjo6Z2V0UHRyKFdlYkNvcmU6OlNW
R1Byb3BlcnR5VGVhck9mZjxXZWJDb3JlOjpGbG9hdFBvaW50Pjo6Y3JlYXRlKElNUEwtPmltbXV0
YWJsZVBvaW50RnVuY3Rpb24oKSkpKTsKK30KKworLSAodm9pZCltZXRob2RXaXRoRXhjZXB0aW9u
Cit7CisgICAgV2ViQ29yZTo6SlNNYWluVGhyZWFkTnVsbFN0YXRlIHN0YXRlOworICAgIFdlYkNv
cmU6OkV4Y2VwdGlvbkNvZGUgZWMgPSAwOworICAgIElNUEwtPm1ldGhvZFdpdGhFeGNlcHRpb24o
ZWMpOworICAgIFdlYkNvcmU6OnJhaXNlT25ET01FcnJvcihlYyk7Cit9CisKK0BlbmQKKworV2Vi
Q29yZTo6VGVzdFR5cGVkZWZzKiBjb3JlKERPTVRlc3RUeXBlZGVmcyAqd3JhcHBlcikKK3sKKyAg
ICByZXR1cm4gd3JhcHBlciA/IHJlaW50ZXJwcmV0X2Nhc3Q8V2ViQ29yZTo6VGVzdFR5cGVkZWZz
Kj4od3JhcHBlci0+X2ludGVybmFsKSA6IDA7Cit9CisKK0RPTVRlc3RUeXBlZGVmcyAqa2l0KFdl
YkNvcmU6OlRlc3RUeXBlZGVmcyogdmFsdWUpCit7CisgICAgeyBET01fQVNTRVJUX01BSU5fVEhS
RUFEKCk7IFdlYkNvcmVUaHJlYWRWaW9sYXRpb25DaGVja1JvdW5kT25lKCk7IH07CisgICAgaWYg
KCF2YWx1ZSkKKyAgICAgICAgcmV0dXJuIG5pbDsKKyAgICBpZiAoRE9NVGVzdFR5cGVkZWZzICp3
cmFwcGVyID0gZ2V0RE9NV3JhcHBlcih2YWx1ZSkpCisgICAgICAgIHJldHVybiBbW3dyYXBwZXIg
cmV0YWluXSBhdXRvcmVsZWFzZV07CisgICAgRE9NVGVzdFR5cGVkZWZzICp3cmFwcGVyID0gW1tE
T01UZXN0VHlwZWRlZnMgYWxsb2NdIF9pbml0XTsKKyAgICB3cmFwcGVyLT5faW50ZXJuYWwgPSBy
ZWludGVycHJldF9jYXN0PERPTU9iamVjdEludGVybmFsKj4odmFsdWUpOworICAgIHZhbHVlLT5y
ZWYoKTsKKyAgICBhZGRET01XcmFwcGVyKHdyYXBwZXIsIHZhbHVlKTsKKyAgICByZXR1cm4gW3dy
YXBwZXIgYXV0b3JlbGVhc2VdOworfQpkaWZmIC0tZ2l0IGEvU291cmNlL1dlYkNvcmUvYmluZGlu
Z3Mvc2NyaXB0cy90ZXN0L09iakMvRE9NVGVzdFR5cGVkZWZzSW50ZXJuYWwuaCBiL1NvdXJjZS9X
ZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9PYmpDL0RPTVRlc3RUeXBlZGVmc0ludGVybmFs
LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMC4uZWRhOGJjMzc3ZTNlMDc0NGY1MTQ2MjJjNTY1MjFmODRmZmVkZDhlNgot
LS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9P
YmpDL0RPTVRlc3RUeXBlZGVmc0ludGVybmFsLmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIFRo
aXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBXZWJLaXQgb3BlbiBzb3VyY2UgcHJvamVjdC4KKyAqIFRo
aXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtYmluZGluZ3MucGwuIERPIE5P
VCBNT0RJRlkhCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJp
bmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0
ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6Cisg
KiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3Zl
IGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl
IGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBm
b3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhp
cyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUK
KyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRo
IHRoZSBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBB
UFBMRSBDT01QVVRFUiwgSU5DLiBgYEFTIElTJycgQU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBM
SUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElN
UExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFS
VElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEFQ
UExFIENPTVBVVEVSLCBJTkMuIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkg
RElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwKKyAqIEVYRU1QTEFSWSwgT1Ig
Q09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKKyAq
IFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNF
LCBEQVRBLCBPUgorICogUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS
IENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQorICogT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENP
TlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisgKiAoSU5DTFVESU5HIE5FR0xJR0VO
Q0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKyAqIE9G
IFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VD
SCBEQU1BR0UuIAorICovCisKKyNpbXBvcnQgPFdlYkNvcmUvRE9NVGVzdFR5cGVkZWZzLmg+CisK
KyNpZiBXRUJLSVRfVkVSU0lPTl9NQVhfQUxMT1dFRCA+PSBXRUJLSVRfVkVSU0lPTl9MQVRFU1QK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworICAgIGNsYXNzIFRlc3RUeXBlZGVmczsKK30KKworV2Vi
Q29yZTo6VGVzdFR5cGVkZWZzKiBjb3JlKERPTVRlc3RUeXBlZGVmcyAqKTsKK0RPTVRlc3RUeXBl
ZGVmcyAqa2l0KFdlYkNvcmU6OlRlc3RUeXBlZGVmcyopOworCisjZW5kaWYKZGlmZiAtLWdpdCBh
L1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0VHlwZWRlZnMuaWRsIGIv
U291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Rlc3RUeXBlZGVmcy5pZGwKbmV3
IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
MDAwMDAwMC4uNzg1MTA4OTgzOTZmOTY2ZDA3NTM1MTg5NzY1NTIwZjdhMTg5ZWFmNwotLS0gL2Rl
di9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9UZXN0VHlw
ZWRlZnMuaWRsCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29v
Z2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQg
dXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlm
aWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0
aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNl
IGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxp
c3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICog
UmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQor
ICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xs
b3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1h
dGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVp
dGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29u
dHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJp
dmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVu
IHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09Q
WVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJF
U1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQg
VE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNT
IEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5U
IFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUg
Rk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBM
QVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElN
SVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9T
UyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04p
IEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI
RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcg
TkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVT
RQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElU
WSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBUaGlzIElETCBmaWxlIGlzIGZvciB0ZXN0aW5n
IHRoZSBiaW5kaW5ncyBjb2RlIGdlbmVyYXRvciBhbmQgZm9yIHRyYWNraW5nCisvLyBjaGFuZ2Vz
IGluIGl0cyBvdXB1dC4KKworWworICAgIENvbnN0cnVjdG9yKGluIFNUUklORyBoZWxsbywgaW4g
VEVTVF9DQUxMQkFDSyB0ZXN0Q2FsbGJhY2spLAorXSBpbnRlcmZhY2UgVGVzdFR5cGVkZWZzIHsK
KyAgICBhdHRyaWJ1dGUgVUxPTkdMT05HIHVuc2lnbmVkTG9uZ0xvbmdBdHRyOworCisgICAgW0lt
bXV0YWJsZV0gYXR0cmlidXRlIFNDUklQVF9WQUxVRSBpbW11dGFibGVTZXJpYWxpemVkU2NyaXB0
VmFsdWU7CisgICAgCisgICAgc3RhdGljIHJlYWRvbmx5IGF0dHJpYnV0ZSBUIFRlc3RTdWJPYmo7
CisKKyAgICBbU3RyaWN0VHlwZUNoZWNraW5nXSB2b2lkIGZ1bmMoaW4gW09wdGlvbmFsXSBBUlJB
WV9PRl9MT05HUyB4KTsKKworICAgIHZvaWQgbXVsdGlUcmFuc2Zlckxpc3QoaW4gW1RyYW5zZmVy
TGlzdD10eF0gU0NSSVBUX1ZBTFVFIGZpcnN0LCBpbiBbT3B0aW9uYWxdIEFSUkFZIHR4LCBpbiBb
T3B0aW9uYWxdIFRSQU5TRkVSX1RYWF9TQ1JJUFRfVkFMVUUgc2Vjb25kLCBpbiBbT3B0aW9uYWxd
IEFSUkFZIHR4eCk7CisKKyAgICB2b2lkIHNldFNoYWRvdyhpbiBET1VCTEUgd2lkdGgsIGluIERP
VUJMRSBoZWlnaHQsIGluIGZsb2F0IGJsdXIsIGluIFtTdHJpY3RUeXBlQ2hlY2tpbmddIE9QVElP
TkFMX1NUUklORyBjb2xvciwgaW4gW09wdGlvbmFsXSBET1VCTEUgYWxwaGEpOworCisgICAgVUxP
TkdMT05HIG1ldGhvZFdpdGhTZXF1ZW5jZUFyZyhpbiBzZXF1ZW5jZTxTQ1JJUFRfVkFMVUU+IHNl
cXVlbmNlQXJnKTsKKworICAgIHZvaWQgbnVsbGFibGVBcnJheUFyZyhpbiBBUlJBWV9PRl9TVFJJ
TkdTPyBhcnJheUFyZyk7CisKKyAgICB2b2lkIGZ1bmNXaXRoQ2xhbXAoaW4gVUxPTkdMT05HX0NM
QU1QIGFyZzEsIGluIFtPcHRpb25hbF0gVUxPTkdMT05HX0NMQU1QIGFyZzIpOworCisgICAgW0lt
bXV0YWJsZV0gU1ZHUE9JTlQgaW1tdXRhYmxlUG9pbnRGdW5jdGlvbigpOworCisgICAgQVJSQVlf
T0ZfU1RSSU5HUyBzdHJpbmdBcnJheUZ1bmN0aW9uKGluIEFSUkFZX09GX1NUUklOR1MgdmFsdWVz
KSByYWlzZXMoRSk7CisgICAgU1RSSU5HW10gc3RyaW5nQXJyYXlGdW5jdGlvbjIoaW4gU1RSSU5H
W10gdmFsdWVzKSByYWlzZXMoRSk7CisKKyAgICAvLyBFeGNlcHRpb25zCisgICAgdm9pZCBtZXRo
b2RXaXRoRXhjZXB0aW9uKCkgcmFpc2VzKEUpOworICAgIGF0dHJpYnV0ZSBsb25nIGF0dHJXaXRo
R2V0dGVyRXhjZXB0aW9uIGdldHRlciByYWlzZXMoRSk7CisgICAgYXR0cmlidXRlIGxvbmcgYXR0
cldpdGhTZXR0ZXJFeGNlcHRpb24gc2V0dGVyIHJhaXNlcyhFKTsKKyAgICBhdHRyaWJ1dGUgRE9N
U3RyaW5nIHN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uIGdldHRlciByYWlzZXMoRSk7Cisg
ICAgYXR0cmlidXRlIERPTVN0cmluZyBzdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbiBzZXR0
ZXIgcmFpc2VzKEUpOworfTsKKwordHlwZWRlZiBmbG9hdCAgICAgICAgICAgICAgICAgICAgICBE
T1VCTEU7Cit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyAgICAgICAgIFVMT05HTE9ORzsKK3R5
cGVkZWYgW0NsYW1wXSB1bnNpZ25lZCBsb25nIGxvbmcgVUxPTkdMT05HX0NMQU1QOwordHlwZWRl
ZiBTZXJpYWxpemVkU2NyaXB0VmFsdWUgICAgICBTQ1JJUFRfVkFMVUU7Cit0eXBlZGVmIGxvbmdb
XSAgICAgICAgICAgICAgICAgICAgIEFSUkFZX09GX0xPTkdTOwordHlwZWRlZiBTVkdQb2ludCAg
ICAgICAgICAgICAgICAgICBTVkdQT0lOVDsKK3R5cGVkZWYgRE9NU3RyaW5nICAgICAgICAgICAg
ICAgICAgU1RSSU5HOwordHlwZWRlZiBbT3B0aW9uYWxdIERPTVN0cmluZyAgICAgICBPUFRJT05B
TF9TVFJJTkc7Cit0eXBlZGVmIERPTVN0cmluZ1tdICAgICAgICAgICAgICAgIEFSUkFZX09GX1NU
UklOR1M7Cit0eXBlZGVmIFtDYWxsYmFja10gVGVzdENhbGxiYWNrICAgIFRFU1RfQ0FMTEJBQ0s7
Cit0eXBlZGVmIFRlc3RTdWJPYmpDb25zdHJ1Y3RvciAgICAgIFQ7Cit0eXBlZGVmIEFycmF5ICAg
ICAgICAgICAgICAgICAgICAgIEFSUkFZOwordHlwZWRlZiBET01FeGNlcHRpb24gICAgICAgICAg
ICAgICBFOwordHlwZWRlZiBbVHJhbnNmZXJMaXN0PXR4eF0gU2VyaWFsaXplZFNjcmlwdFZhbHVl
IFRSQU5TRkVSX1RYWF9TQ1JJUFRfVkFMVUU7CmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViQ29yZS9i
aW5kaW5ncy9zY3JpcHRzL3Rlc3QvVjgvVjhUZXN0VHlwZWRlZnMuY3BwIGIvU291cmNlL1dlYkNv
cmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdFR5cGVkZWZzLmNwcApuZXcgZmlsZSBt
b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAw
Li5mMWIwNTI0ZWExMjIzMDgxZTk2NjllYmM3Nzg5NjQ0YWNiNGY5N2ZiCi0tLSAvZGV2L251bGwK
KysrIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0L1Y4L1Y4VGVzdFR5cGVk
ZWZzLmNwcApAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0
aGUgV2ViS2l0IG9wZW4gc291cmNlIHByb2plY3QuCisgICAgVGhpcyBmaWxlIGhhcyBiZWVuIGdl
bmVyYXRlZCBieSBnZW5lcmF0ZS1iaW5kaW5ncy5wbC4gRE8gTk9UIE1PRElGWSEKKworICAgIFRo
aXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv
b3IKKyAgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGlicmFyeSBHZW5l
cmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJl
IEZvdW5kYXRpb247IGVpdGhlcgorICAgIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0
IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgbGlicmFyeSBpcyBk
aXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBX
SVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9m
CisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NF
LiAgU2VlIHRoZSBHTlUKKyAgICBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1v
cmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhl
IEdOVSBMaWJyYXJ5IEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgICBhbG9uZyB3aXRoIHRoaXMg
bGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuTElCLiAgSWYgbm90LCB3cml0ZSB0bworICAg
IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1
aXRlIDMzMCwKKyAgICBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKyovCisKKyNpbmNsdWRl
ICJjb25maWcuaCIKKyNpbmNsdWRlICJWOFRlc3RUeXBlZGVmcy5oIgorCisjaW5jbHVkZSAiQmlu
ZGluZ1N0YXRlLmgiCisjaW5jbHVkZSAiQ29udGV4dEZlYXR1cmVzLmgiCisjaW5jbHVkZSAiRE9N
U3RyaW5nTGlzdC5oIgorI2luY2x1ZGUgIkV4Y2VwdGlvbkNvZGUuaCIKKyNpbmNsdWRlICJGcmFt
ZS5oIgorI2luY2x1ZGUgIk1lc3NhZ2VQb3J0LmgiCisjaW5jbHVkZSAiUnVudGltZUVuYWJsZWRG
ZWF0dXJlcy5oIgorI2luY2x1ZGUgIlNWR1Byb3BlcnR5VGVhck9mZi5oIgorI2luY2x1ZGUgIlNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorI2luY2x1ZGUgIlY4QmluZGluZy5oIgorI2luY2x1ZGUg
IlY4RE9NU3RyaW5nTGlzdC5oIgorI2luY2x1ZGUgIlY4RE9NV3JhcHBlci5oIgorI2luY2x1ZGUg
IlY4U1ZHUG9pbnQuaCIKKyNpbmNsdWRlICJWOFNlcmlhbGl6ZWRTY3JpcHRWYWx1ZS5oIgorI2lu
Y2x1ZGUgIlY4VGVzdENhbGxiYWNrLmgiCisjaW5jbHVkZSAiVjhUZXN0U3ViT2JqLmgiCisjaW5j
bHVkZSA8d3RmL0FycmF5QnVmZmVyLmg+CisjaW5jbHVkZSA8d3RmL1VudXNlZFBhcmFtLmg+CisK
KyNpZiBFTkFCTEUoQklORElOR19JTlRFR1JJVFkpCisjaWYgZGVmaW5lZChPU19XSU4pCisjcHJh
Z21hIHdhcm5pbmcoZGlzYWJsZTogNDQ4MykKK2V4dGVybiAiQyIgeyBleHRlcm4gdm9pZCAoKmNv
bnN0IF9faWRlbnRpZmllcigiPz9fN1Rlc3RUeXBlZGVmc0BXZWJDb3JlQEA2QkAiKVtdKSgpOyB9
CisjZWxzZQorZXh0ZXJuICJDIiB7IGV4dGVybiB2b2lkKiBfWlRWTjdXZWJDb3JlMTJUZXN0VHlw
ZWRlZnNFW107IH0KKyNlbmRpZgorI2VuZGlmIC8vIEVOQUJMRShCSU5ESU5HX0lOVEVHUklUWSkK
KworbmFtZXNwYWNlIFdlYkNvcmUgeworCisjaWYgRU5BQkxFKEJJTkRJTkdfSU5URUdSSVRZKQor
aW5saW5lIHZvaWQgY2hlY2tUeXBlT3JEaWVUcnlpbmcoVGVzdFR5cGVkZWZzKiBvYmplY3QpCit7
CisgICAgdm9pZCogYWN0dWFsVlRhYmxlUG9pbnRlciA9ICoocmVpbnRlcnByZXRfY2FzdDx2b2lk
Kio+KG9iamVjdCkpOworI2lmIGRlZmluZWQoT1NfV0lOKQorICAgIHZvaWQqIGV4cGVjdGVkVlRh
YmxlUG9pbnRlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KF9faWRlbnRpZmllcigiPz9fN1Rl
c3RUeXBlZGVmc0BXZWJDb3JlQEA2QkAiKSk7CisjZWxzZQorICAgIHZvaWQqIGV4cGVjdGVkVlRh
YmxlUG9pbnRlciA9ICZfWlRWTjdXZWJDb3JlMTJUZXN0VHlwZWRlZnNFWzJdOworI2VuZGlmCisg
ICAgaWYgKGFjdHVhbFZUYWJsZVBvaW50ZXIgIT0gZXhwZWN0ZWRWVGFibGVQb2ludGVyKQorICAg
ICAgICBDUkFTSCgpOworfQorI2VuZGlmIC8vIEVOQUJMRShCSU5ESU5HX0lOVEVHUklUWSkKKwor
V3JhcHBlclR5cGVJbmZvIFY4VGVzdFR5cGVkZWZzOjppbmZvID0geyBWOFRlc3RUeXBlZGVmczo6
R2V0VGVtcGxhdGUsIFY4VGVzdFR5cGVkZWZzOjpkZXJlZk9iamVjdCwgMCwgMCwgMCwgVjhUZXN0
VHlwZWRlZnM6Omluc3RhbGxQZXJDb250ZXh0UHJvdG90eXBlUHJvcGVydGllcywgMCwgV3JhcHBl
clR5cGVPYmplY3RQcm90b3R5cGUgfTsKKworbmFtZXNwYWNlIFRlc3RUeXBlZGVmc1Y4SW50ZXJu
YWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBWOF9VU0UoVCkgeyB9CisKK3N0YXRp
YyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gdW5zaWduZWRMb25nTG9uZ0F0dHJBdHRyR2V0dGVyKHY4
OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQor
eworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGluZm8u
SG9sZGVyKCkpOworICAgIHJldHVybiB2ODo6TnVtYmVyOjpOZXcoc3RhdGljX2Nhc3Q8ZG91Ymxl
PihpbXAtPnVuc2lnbmVkTG9uZ0xvbmdBdHRyKCkpKTsKK30KKworc3RhdGljIHZvaWQgdW5zaWdu
ZWRMb25nTG9uZ0F0dHJBdHRyU2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCB2ODo6
TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbykKK3sK
KyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShpbmZvLkhv
bGRlcigpKTsKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgdiA9IHRvSW50NjQodmFsdWUpOworICAg
IGltcC0+c2V0VW5zaWduZWRMb25nTG9uZ0F0dHIodik7CisgICAgcmV0dXJuOworfQorCitzdGF0
aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZUF0
dHJHZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IG5hbWUsIGNvbnN0IHY4OjpBY2Nlc3Nvcklu
Zm8mIGluZm8pCit7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6dG9O
YXRpdmUoaW5mby5Ib2xkZXIoKSk7CisgICAgcmV0dXJuIGltcC0+aW1tdXRhYmxlU2VyaWFsaXpl
ZFNjcmlwdFZhbHVlKCkgPyBpbXAtPmltbXV0YWJsZVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZSgpLT5k
ZXNlcmlhbGl6ZSgpIDogdjg6OkhhbmRsZTx2ODo6VmFsdWU+KHY4TnVsbChpbmZvLkdldElzb2xh
dGUoKSkpOworfQorCitzdGF0aWMgdm9pZCBpbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWVB
dHRyU2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVl
PiB2YWx1ZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbykKK3sKKyAgICBUZXN0VHlwZWRl
ZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShpbmZvLkhvbGRlcigpKTsKKyAgICBS
ZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZhbHVlPiB2ID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpj
cmVhdGUodmFsdWUsIGluZm8uR2V0SXNvbGF0ZSgpKTsKKyAgICBpbXAtPnNldEltbXV0YWJsZVNl
cmlhbGl6ZWRTY3JpcHRWYWx1ZShXVEY6OmdldFB0cih2KSk7CisgICAgcmV0dXJuOworfQorCitz
dGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uQXR0ckdl
dHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYg
aW5mbykKK3sKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2
ZShpbmZvLkhvbGRlcigpKTsKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBpbnQgdiA9
IGltcC0+YXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oZWMpOworICAgIGlmIChVTkxJS0VMWShlYykp
CisgICAgICAgIHJldHVybiBzZXRET01FeGNlcHRpb24oZWMsIGluZm8uR2V0SXNvbGF0ZSgpKTsK
KyAgICByZXR1cm4gdjhJbnRlZ2VyKHYsIGluZm8uR2V0SXNvbGF0ZSgpKTsKK30KKworc3RhdGlj
IHZvaWQgYXR0cldpdGhHZXR0ZXJFeGNlcHRpb25BdHRyU2V0dGVyKHY4OjpMb2NhbDx2ODo6U3Ry
aW5nPiBuYW1lLCB2ODo6TG9jYWw8djg6OlZhbHVlPiB2YWx1ZSwgY29uc3Qgdjg6OkFjY2Vzc29y
SW5mbyYgaW5mbykKK3sKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0
b05hdGl2ZShpbmZvLkhvbGRlcigpKTsKKyAgICBpbnQgdiA9IHRvSW50MzIodmFsdWUpOworICAg
IGltcC0+c2V0QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24odik7CisgICAgcmV0dXJuOworfQorCitz
dGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IGF0dHJXaXRoU2V0dGVyRXhjZXB0aW9uQXR0ckdl
dHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYg
aW5mbykKK3sKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2
ZShpbmZvLkhvbGRlcigpKTsKKyAgICByZXR1cm4gdjhJbnRlZ2VyKGltcC0+YXR0cldpdGhTZXR0
ZXJFeGNlcHRpb24oKSwgaW5mby5HZXRJc29sYXRlKCkpOworfQorCitzdGF0aWMgdm9pZCBhdHRy
V2l0aFNldHRlckV4Y2VwdGlvbkF0dHJTZXR0ZXIodjg6OkxvY2FsPHY4OjpTdHJpbmc+IG5hbWUs
IHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBjb25zdCB2ODo6QWNjZXNzb3JJbmZvJiBpbmZv
KQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGlu
Zm8uSG9sZGVyKCkpOworICAgIGludCB2ID0gdG9JbnQzMih2YWx1ZSk7CisgICAgRXhjZXB0aW9u
Q29kZSBlYyA9IDA7CisgICAgaW1wLT5zZXRBdHRyV2l0aFNldHRlckV4Y2VwdGlvbih2LCBlYyk7
CisgICAgaWYgKFVOTElLRUxZKGVjKSkKKyAgICAgICAgc2V0RE9NRXhjZXB0aW9uKGVjLCBpbmZv
LkdldElzb2xhdGUoKSk7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6
VmFsdWU+IHN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uQXR0ckdldHRlcih2ODo6TG9jYWw8
djg6OlN0cmluZz4gbmFtZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbykKK3sKKyAgICBU
ZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShpbmZvLkhvbGRlcigp
KTsKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICBTdHJpbmcgdiA9IGltcC0+c3RyaW5n
QXR0cldpdGhHZXR0ZXJFeGNlcHRpb24oZWMpOworICAgIGlmIChVTkxJS0VMWShlYykpCisgICAg
ICAgIHJldHVybiBzZXRET01FeGNlcHRpb24oZWMsIGluZm8uR2V0SXNvbGF0ZSgpKTsKKyAgICBy
ZXR1cm4gdjhTdHJpbmcodiwgaW5mby5HZXRJc29sYXRlKCksIFJldHVyblVuc2FmZUhhbmRsZSk7
Cit9CisKK3N0YXRpYyB2b2lkIHN0cmluZ0F0dHJXaXRoR2V0dGVyRXhjZXB0aW9uQXR0clNldHRl
cih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgdjg6OkxvY2FsPHY4OjpWYWx1ZT4gdmFsdWUs
IGNvbnN0IHY4OjpBY2Nlc3NvckluZm8mIGluZm8pCit7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAg
PSBWOFRlc3RUeXBlZGVmczo6dG9OYXRpdmUoaW5mby5Ib2xkZXIoKSk7CisgICAgVjhUUllDQVRD
SF9GT1JfVjhTVFJJTkdSRVNPVVJDRV9WT0lEKFY4U3RyaW5nUmVzb3VyY2U8PiwgdiwgdmFsdWUp
OworICAgIGltcC0+c2V0U3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24odik7CisgICAgcmV0
dXJuOworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHN0cmluZ0F0dHJXaXRoU2V0
dGVyRXhjZXB0aW9uQXR0ckdldHRlcih2ODo6TG9jYWw8djg6OlN0cmluZz4gbmFtZSwgY29uc3Qg
djg6OkFjY2Vzc29ySW5mbyYgaW5mbykKK3sKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVz
dFR5cGVkZWZzOjp0b05hdGl2ZShpbmZvLkhvbGRlcigpKTsKKyAgICByZXR1cm4gdjhTdHJpbmco
aW1wLT5zdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbigpLCBpbmZvLkdldElzb2xhdGUoKSwg
UmV0dXJuVW5zYWZlSGFuZGxlKTsKK30KKworc3RhdGljIHZvaWQgc3RyaW5nQXR0cldpdGhTZXR0
ZXJFeGNlcHRpb25BdHRyU2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCB2ODo6TG9j
YWw8djg6OlZhbHVlPiB2YWx1ZSwgY29uc3Qgdjg6OkFjY2Vzc29ySW5mbyYgaW5mbykKK3sKKyAg
ICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShpbmZvLkhvbGRl
cigpKTsKKyAgICBWOFRSWUNBVENIX0ZPUl9WOFNUUklOR1JFU09VUkNFX1ZPSUQoVjhTdHJpbmdS
ZXNvdXJjZTw+LCB2LCB2YWx1ZSk7CisgICAgRXhjZXB0aW9uQ29kZSBlYyA9IDA7CisgICAgaW1w
LT5zZXRTdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlvbih2LCBlYyk7CisgICAgaWYgKFVOTElL
RUxZKGVjKSkKKyAgICAgICAgc2V0RE9NRXhjZXB0aW9uKGVjLCBpbmZvLkdldElzb2xhdGUoKSk7
CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IFRlc3RUeXBl
ZGVmc0NvbnN0cnVjdG9yR2V0dGVyKHY4OjpMb2NhbDx2ODo6U3RyaW5nPiBuYW1lLCBjb25zdCB2
ODo6QWNjZXNzb3JJbmZvJiBpbmZvKQoreworICAgIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBkYXRh
ID0gaW5mby5EYXRhKCk7CisgICAgQVNTRVJUKGRhdGEtPklzRXh0ZXJuYWwoKSk7CisgICAgVjhQ
ZXJDb250ZXh0RGF0YSogcGVyQ29udGV4dERhdGEgPSBWOFBlckNvbnRleHREYXRhOjpmcm9tKGlu
Zm8uSG9sZGVyKCktPkNyZWF0aW9uQ29udGV4dCgpKTsKKyAgICBpZiAoIXBlckNvbnRleHREYXRh
KQorICAgICAgICByZXR1cm4gdjhVbmRlZmluZWQoKTsKKyAgICByZXR1cm4gcGVyQ29udGV4dERh
dGEtPmNvbnN0cnVjdG9yRm9yVHlwZShXcmFwcGVyVHlwZUluZm86OnVud3JhcChkYXRhKSk7Cit9
CitzdGF0aWMgdm9pZCBUZXN0VHlwZWRlZnNSZXBsYWNlYWJsZUF0dHJTZXR0ZXIodjg6OkxvY2Fs
PHY4OjpTdHJpbmc+IG5hbWUsIHY4OjpMb2NhbDx2ODo6VmFsdWU+IHZhbHVlLCBjb25zdCB2ODo6
QWNjZXNzb3JJbmZvJiBpbmZvKQoreworICAgIGluZm8uVGhpcygpLT5Gb3JjZVNldChuYW1lLCB2
YWx1ZSk7Cit9CisKK3N0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gZnVuY0NhbGxiYWNrKGNv
bnN0IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRl
c3RUeXBlZGVmczo6dG9OYXRpdmUoYXJncy5Ib2xkZXIoKSk7CisgICAgaWYgKGFyZ3MuTGVuZ3Ro
KCkgPD0gMCkgeworICAgICAgICBpbXAtPmZ1bmMoKTsKKyAgICAgICAgcmV0dXJuIHY4VW5kZWZp
bmVkKCk7CisgICAgfQorICAgIGlmIChhcmdzLkxlbmd0aCgpID4gMCAmJiAhaXNVbmRlZmluZWRP
ck51bGwoYXJnc1swXSkgJiYgIVY4bG9uZ1tdOjpIYXNJbnN0YW5jZShhcmdzWzBdLCBhcmdzLkdl
dElzb2xhdGUoKSkpCisgICAgICAgIHJldHVybiB0aHJvd1R5cGVFcnJvcigwLCBhcmdzLkdldElz
b2xhdGUoKSk7CisgICAgVjhUUllDQVRDSChWZWN0b3I8aW50PiwgeCwgdG9OYXRpdmVBcnJheTxp
bnQ+KE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGFyZ3MsIDAsIERlZmF1bHRJc1VuZGVmaW5lZCkp
KTsKKyAgICBpbXAtPmZ1bmMoeCk7CisgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7Cit9CisKK3N0
YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gbXVsdGlUcmFuc2Zlckxpc3RDYWxsYmFjayhjb25z
dCB2ODo6QXJndW1lbnRzJiBhcmdzKQoreworICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMSkKKyAg
ICAgICAgcmV0dXJuIHRocm93Tm90RW5vdWdoQXJndW1lbnRzRXJyb3IoYXJncy5HZXRJc29sYXRl
KCkpOworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGFy
Z3MuSG9sZGVyKCkpOworICAgIE1lc3NhZ2VQb3J0QXJyYXkgbWVzc2FnZVBvcnRBcnJheVR4Owor
ICAgIEFycmF5QnVmZmVyQXJyYXkgYXJyYXlCdWZmZXJBcnJheVR4OworICAgIGlmIChhcmdzLkxl
bmd0aCgpID4gMSkgeworICAgICAgICBpZiAoIWV4dHJhY3RUcmFuc2ZlcmFibGVzKGFyZ3NbMV0s
IG1lc3NhZ2VQb3J0QXJyYXlUeCwgYXJyYXlCdWZmZXJBcnJheVR4LCBhcmdzLkdldElzb2xhdGUo
KSkpCisgICAgICAgICAgICByZXR1cm4gdGhyb3dUeXBlRXJyb3IoIkNvdWxkIG5vdCBleHRyYWN0
IHRyYW5zZmVyYWJsZXMiLCBhcmdzLkdldElzb2xhdGUoKSk7CisgICAgfQorICAgIGJvb2wgZmly
c3REaWRUaHJvdyA9IGZhbHNlOworICAgIFJlZlB0cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+IGZp
cnN0ID0gU2VyaWFsaXplZFNjcmlwdFZhbHVlOjpjcmVhdGUoYXJnc1swXSwgJm1lc3NhZ2VQb3J0
QXJyYXlUeCwgJmFycmF5QnVmZmVyQXJyYXlUeCwgZmlyc3REaWRUaHJvdywgYXJncy5HZXRJc29s
YXRlKCkpOworICAgIGlmIChmaXJzdERpZFRocm93KQorICAgICAgICByZXR1cm4gdjhVbmRlZmlu
ZWQoKTsKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA8PSAxKSB7CisgICAgICAgIGltcC0+bXVsdGlU
cmFuc2Zlckxpc3QoZmlyc3QpOworICAgICAgICByZXR1cm4gdjhVbmRlZmluZWQoKTsKKyAgICB9
CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPD0gMikgeworICAgICAgICBpbXAtPm11bHRpVHJhbnNm
ZXJMaXN0KGZpcnN0LCBtZXNzYWdlUG9ydEFycmF5VHgpOworICAgICAgICByZXR1cm4gdjhVbmRl
ZmluZWQoKTsKKyAgICB9CisgICAgTWVzc2FnZVBvcnRBcnJheSBtZXNzYWdlUG9ydEFycmF5VHh4
OworICAgIEFycmF5QnVmZmVyQXJyYXkgYXJyYXlCdWZmZXJBcnJheVR4eDsKKyAgICBpZiAoYXJn
cy5MZW5ndGgoKSA+IDMpIHsKKyAgICAgICAgaWYgKCFleHRyYWN0VHJhbnNmZXJhYmxlcyhhcmdz
WzNdLCBtZXNzYWdlUG9ydEFycmF5VHh4LCBhcnJheUJ1ZmZlckFycmF5VHh4LCBhcmdzLkdldElz
b2xhdGUoKSkpCisgICAgICAgICAgICByZXR1cm4gdGhyb3dUeXBlRXJyb3IoIkNvdWxkIG5vdCBl
eHRyYWN0IHRyYW5zZmVyYWJsZXMiLCBhcmdzLkdldElzb2xhdGUoKSk7CisgICAgfQorICAgIGJv
b2wgc2Vjb25kRGlkVGhyb3cgPSBmYWxzZTsKKyAgICBSZWZQdHI8U2VyaWFsaXplZFNjcmlwdFZh
bHVlPiBzZWNvbmQgPSBTZXJpYWxpemVkU2NyaXB0VmFsdWU6OmNyZWF0ZShhcmdzWzJdLCAmbWVz
c2FnZVBvcnRBcnJheVR4eCwgJmFycmF5QnVmZmVyQXJyYXlUeHgsIHNlY29uZERpZFRocm93LCBh
cmdzLkdldElzb2xhdGUoKSk7CisgICAgaWYgKHNlY29uZERpZFRocm93KQorICAgICAgICByZXR1
cm4gdjhVbmRlZmluZWQoKTsKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA8PSAzKSB7CisgICAgICAg
IGltcC0+bXVsdGlUcmFuc2Zlckxpc3QoZmlyc3QsIG1lc3NhZ2VQb3J0QXJyYXlUeCwgc2Vjb25k
KTsKKyAgICAgICAgcmV0dXJuIHY4VW5kZWZpbmVkKCk7CisgICAgfQorICAgIGltcC0+bXVsdGlU
cmFuc2Zlckxpc3QoZmlyc3QsIG1lc3NhZ2VQb3J0QXJyYXlUeCwgc2Vjb25kLCBtZXNzYWdlUG9y
dEFycmF5VHh4KTsKKyAgICByZXR1cm4gdjhVbmRlZmluZWQoKTsKK30KKworc3RhdGljIHY4OjpI
YW5kbGU8djg6OlZhbHVlPiBzZXRTaGFkb3dDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBh
cmdzKQoreworICAgIGlmIChhcmdzLkxlbmd0aCgpIDwgMykKKyAgICAgICAgcmV0dXJuIHRocm93
Tm90RW5vdWdoQXJndW1lbnRzRXJyb3IoYXJncy5HZXRJc29sYXRlKCkpOworICAgIFRlc3RUeXBl
ZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOworICAg
IFY4VFJZQ0FUQ0goZmxvYXQsIHdpZHRoLCBzdGF0aWNfY2FzdDxmbG9hdD4oTUFZQkVfTUlTU0lO
R19QQVJBTUVURVIoYXJncywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKS0+TnVtYmVyVmFsdWUoKSkp
OworICAgIFY4VFJZQ0FUQ0goZmxvYXQsIGhlaWdodCwgc3RhdGljX2Nhc3Q8ZmxvYXQ+KE1BWUJF
X01JU1NJTkdfUEFSQU1FVEVSKGFyZ3MsIDEsIERlZmF1bHRJc1VuZGVmaW5lZCktPk51bWJlclZh
bHVlKCkpKTsKKyAgICBWOFRSWUNBVENIKGZsb2F0LCBibHVyLCBzdGF0aWNfY2FzdDxmbG9hdD4o
TUFZQkVfTUlTU0lOR19QQVJBTUVURVIoYXJncywgMiwgRGVmYXVsdElzVW5kZWZpbmVkKS0+TnVt
YmVyVmFsdWUoKSkpOworICAgIGlmIChhcmdzLkxlbmd0aCgpIDw9IDMpIHsKKyAgICAgICAgaW1w
LT5zZXRTaGFkb3cod2lkdGgsIGhlaWdodCwgYmx1cik7CisgICAgICAgIHJldHVybiB2OFVuZGVm
aW5lZCgpOworICAgIH0KKyAgICBWOFRSWUNBVENIX0ZPUl9WOFNUUklOR1JFU09VUkNFKFY4U3Ry
aW5nUmVzb3VyY2U8PiwgY29sb3IsIE1BWUJFX01JU1NJTkdfUEFSQU1FVEVSKGFyZ3MsIDMsIERl
ZmF1bHRJc1VuZGVmaW5lZCkpOworICAgIGlmIChhcmdzLkxlbmd0aCgpIDw9IDQpIHsKKyAgICAg
ICAgaW1wLT5zZXRTaGFkb3cod2lkdGgsIGhlaWdodCwgYmx1ciwgY29sb3IpOworICAgICAgICBy
ZXR1cm4gdjhVbmRlZmluZWQoKTsKKyAgICB9CisgICAgVjhUUllDQVRDSChmbG9hdCwgYWxwaGEs
IHN0YXRpY19jYXN0PGZsb2F0PihNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihhcmdzLCA0LCBEZWZh
dWx0SXNVbmRlZmluZWQpLT5OdW1iZXJWYWx1ZSgpKSk7CisgICAgaW1wLT5zZXRTaGFkb3cod2lk
dGgsIGhlaWdodCwgYmx1ciwgY29sb3IsIGFscGhhKTsKKyAgICByZXR1cm4gdjhVbmRlZmluZWQo
KTsKK30KKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBtZXRob2RXaXRoU2VxdWVuY2VB
cmdDYWxsYmFjayhjb25zdCB2ODo6QXJndW1lbnRzJiBhcmdzKQoreworICAgIGlmIChhcmdzLkxl
bmd0aCgpIDwgMSkKKyAgICAgICAgcmV0dXJuIHRocm93Tm90RW5vdWdoQXJndW1lbnRzRXJyb3Io
YXJncy5HZXRJc29sYXRlKCkpOworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRl
ZnM6OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOworICAgIFY4VFJZQ0FUQ0goVmVjdG9yPFJlZlB0
cjxTZXJpYWxpemVkU2NyaXB0VmFsdWU+ID4sIHNlcXVlbmNlQXJnLCAodG9SZWZQdHJOYXRpdmVB
cnJheTxTZXJpYWxpemVkU2NyaXB0VmFsdWUsIFY4U2VyaWFsaXplZFNjcmlwdFZhbHVlPihNQVlC
RV9NSVNTSU5HX1BBUkFNRVRFUihhcmdzLCAwLCBEZWZhdWx0SXNVbmRlZmluZWQpLCBhcmdzLkdl
dElzb2xhdGUoKSkpKTsKKyAgICByZXR1cm4gdjg6Ok51bWJlcjo6TmV3KHN0YXRpY19jYXN0PGRv
dWJsZT4oaW1wLT5tZXRob2RXaXRoU2VxdWVuY2VBcmcoc2VxdWVuY2VBcmcpKSk7Cit9CisKK3N0
YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gbnVsbGFibGVBcnJheUFyZ0NhbGxiYWNrKGNvbnN0
IHY4OjpBcmd1bWVudHMmIGFyZ3MpCit7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPCAxKQorICAg
ICAgICByZXR1cm4gdGhyb3dOb3RFbm91Z2hBcmd1bWVudHNFcnJvcihhcmdzLkdldElzb2xhdGUo
KSk7CisgICAgVGVzdFR5cGVkZWZzKiBpbXAgPSBWOFRlc3RUeXBlZGVmczo6dG9OYXRpdmUoYXJn
cy5Ib2xkZXIoKSk7CisgICAgVjhUUllDQVRDSChWZWN0b3I8U3RyaW5nPiwgYXJyYXlBcmcsIHRv
TmF0aXZlQXJyYXk8U3RyaW5nPihNQVlCRV9NSVNTSU5HX1BBUkFNRVRFUihhcmdzLCAwLCBEZWZh
dWx0SXNVbmRlZmluZWQpKSk7CisgICAgaW1wLT5udWxsYWJsZUFycmF5QXJnKGFycmF5QXJnKTsK
KyAgICByZXR1cm4gdjhVbmRlZmluZWQoKTsKK30KKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZh
bHVlPiBmdW5jV2l0aENsYW1wQ2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sK
KyAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCisgICAgICAgIHJldHVybiB0aHJvd05vdEVub3Vn
aEFyZ3VtZW50c0Vycm9yKGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICBUZXN0VHlwZWRlZnMqIGlt
cCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKKyAgICB1bnNpZ25l
ZCBsb25nIGxvbmcgYXJnMSA9IDA7CisgICAgVjhUUllDQVRDSChkb3VibGUsIGFyZzFOYXRpdmVW
YWx1ZSwgYXJnc1swXS0+TnVtYmVyVmFsdWUoKSk7CisgICAgaWYgKCFpc25hbihhcmcxTmF0aXZl
VmFsdWUpKQorICAgICAgICBhcmcxID0gY2xhbXBUbzx1bnNpZ25lZCBsb25nIGxvbmc+KGFyZzFO
YXRpdmVWYWx1ZSk7CisgICAgaWYgKGFyZ3MuTGVuZ3RoKCkgPD0gMSkgeworICAgICAgICBpbXAt
PmZ1bmNXaXRoQ2xhbXAoYXJnMSk7CisgICAgICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworICAg
IH0KKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgYXJnMiA9IDA7CisgICAgVjhUUllDQVRDSChkb3Vi
bGUsIGFyZzJOYXRpdmVWYWx1ZSwgYXJnc1sxXS0+TnVtYmVyVmFsdWUoKSk7CisgICAgaWYgKCFp
c25hbihhcmcyTmF0aXZlVmFsdWUpKQorICAgICAgICBhcmcyID0gY2xhbXBUbzx1bnNpZ25lZCBs
b25nIGxvbmc+KGFyZzJOYXRpdmVWYWx1ZSk7CisgICAgaW1wLT5mdW5jV2l0aENsYW1wKGFyZzEs
IGFyZzIpOworICAgIHJldHVybiB2OFVuZGVmaW5lZCgpOworfQorCitzdGF0aWMgdjg6OkhhbmRs
ZTx2ODo6VmFsdWU+IGltbXV0YWJsZVBvaW50RnVuY3Rpb25DYWxsYmFjayhjb25zdCB2ODo6QXJn
dW1lbnRzJiBhcmdzKQoreworICAgIFRlc3RUeXBlZGVmcyogaW1wID0gVjhUZXN0VHlwZWRlZnM6
OnRvTmF0aXZlKGFyZ3MuSG9sZGVyKCkpOworICAgIHJldHVybiB0b1Y4KFdURjo6Z2V0UHRyKFNW
R1Byb3BlcnR5VGVhck9mZjxGbG9hdFBvaW50Pjo6Y3JlYXRlKGltcC0+aW1tdXRhYmxlUG9pbnRG
dW5jdGlvbigpKSksIGFyZ3MuSG9sZGVyKCksIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKK30KKworc3Rh
dGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBzdHJpbmdBcnJheUZ1bmN0aW9uQ2FsbGJhY2soY29u
c3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA8IDEpCisg
ICAgICAgIHJldHVybiB0aHJvd05vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGFyZ3MuR2V0SXNvbGF0
ZSgpKTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShh
cmdzLkhvbGRlcigpKTsKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICB7CisgICAgVjhU
UllDQVRDSChWZWN0b3I8U3RyaW5nPiwgdmFsdWVzLCB0b05hdGl2ZUFycmF5PFN0cmluZz4oTUFZ
QkVfTUlTU0lOR19QQVJBTUVURVIoYXJncywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSkpOworICAg
IFZlY3RvcjxTdHJpbmc+IHJlc3VsdCA9IGltcC0+c3RyaW5nQXJyYXlGdW5jdGlvbih2YWx1ZXMs
IGVjKTsKKyAgICBpZiAoVU5MSUtFTFkoZWMpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcmV0
dXJuIHY4QXJyYXkocmVzdWx0LCBhcmdzLkdldElzb2xhdGUoKSk7CisgICAgfQorICAgIGZhaWw6
CisgICAgcmV0dXJuIHNldERPTUV4Y2VwdGlvbihlYywgYXJncy5HZXRJc29sYXRlKCkpOworfQor
CitzdGF0aWMgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHN0cmluZ0FycmF5RnVuY3Rpb24yQ2FsbGJh
Y2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBpZiAoYXJncy5MZW5ndGgoKSA8
IDEpCisgICAgICAgIHJldHVybiB0aHJvd05vdEVub3VnaEFyZ3VtZW50c0Vycm9yKGFyZ3MuR2V0
SXNvbGF0ZSgpKTsKKyAgICBUZXN0VHlwZWRlZnMqIGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05h
dGl2ZShhcmdzLkhvbGRlcigpKTsKKyAgICBFeGNlcHRpb25Db2RlIGVjID0gMDsKKyAgICB7Cisg
ICAgVjhUUllDQVRDSChWZWN0b3I8U3RyaW5nPiwgdmFsdWVzLCB0b05hdGl2ZUFycmF5PFN0cmlu
Zz4oTUFZQkVfTUlTU0lOR19QQVJBTUVURVIoYXJncywgMCwgRGVmYXVsdElzVW5kZWZpbmVkKSkp
OworICAgIFZlY3RvcjxTdHJpbmc+IHJlc3VsdCA9IGltcC0+c3RyaW5nQXJyYXlGdW5jdGlvbjIo
dmFsdWVzLCBlYyk7CisgICAgaWYgKFVOTElLRUxZKGVjKSkKKyAgICAgICAgZ290byBmYWlsOwor
ICAgIHJldHVybiB2OEFycmF5KHJlc3VsdCwgYXJncy5HZXRJc29sYXRlKCkpOworICAgIH0KKyAg
ICBmYWlsOgorICAgIHJldHVybiBzZXRET01FeGNlcHRpb24oZWMsIGFyZ3MuR2V0SXNvbGF0ZSgp
KTsKK30KKworc3RhdGljIHY4OjpIYW5kbGU8djg6OlZhbHVlPiBtZXRob2RXaXRoRXhjZXB0aW9u
Q2FsbGJhY2soY29uc3Qgdjg6OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICBUZXN0VHlwZWRlZnMq
IGltcCA9IFY4VGVzdFR5cGVkZWZzOjp0b05hdGl2ZShhcmdzLkhvbGRlcigpKTsKKyAgICBFeGNl
cHRpb25Db2RlIGVjID0gMDsKKyAgICB7CisgICAgaW1wLT5tZXRob2RXaXRoRXhjZXB0aW9uKGVj
KTsKKyAgICBpZiAoVU5MSUtFTFkoZWMpKQorICAgICAgICBnb3RvIGZhaWw7CisgICAgcmV0dXJu
IHY4VW5kZWZpbmVkKCk7CisgICAgfQorICAgIGZhaWw6CisgICAgcmV0dXJuIHNldERPTUV4Y2Vw
dGlvbihlYywgYXJncy5HZXRJc29sYXRlKCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBUZXN0VHlw
ZWRlZnNWOEludGVybmFsCisKK3N0YXRpYyBjb25zdCBWOERPTUNvbmZpZ3VyYXRpb246OkJhdGNo
ZWRBdHRyaWJ1dGUgVjhUZXN0VHlwZWRlZnNBdHRyc1tdID0geworICAgIC8vIEF0dHJpYnV0ZSAn
dW5zaWduZWRMb25nTG9uZ0F0dHInIChUeXBlOiAnYXR0cmlidXRlJyBFeHRBdHRyOiAnJykKKyAg
ICB7InVuc2lnbmVkTG9uZ0xvbmdBdHRyIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6dW5zaWdu
ZWRMb25nTG9uZ0F0dHJBdHRyR2V0dGVyLCBUZXN0VHlwZWRlZnNWOEludGVybmFsOjp1bnNpZ25l
ZExvbmdMb25nQXR0ckF0dHJTZXR0ZXIsIDAgLyogbm8gZGF0YSAqLywgc3RhdGljX2Nhc3Q8djg6
OkFjY2Vzc0NvbnRyb2w+KHY4OjpERUZBVUxUKSwgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0
cmlidXRlPih2ODo6Tm9uZSksIDAgLyogb24gaW5zdGFuY2UgKi99LAorICAgIC8vIEF0dHJpYnV0
ZSAnaW1tdXRhYmxlU2VyaWFsaXplZFNjcmlwdFZhbHVlJyAoVHlwZTogJ2F0dHJpYnV0ZScgRXh0
QXR0cjogJ0ltbXV0YWJsZScpCisgICAgeyJpbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWUi
LCBUZXN0VHlwZWRlZnNWOEludGVybmFsOjppbW11dGFibGVTZXJpYWxpemVkU2NyaXB0VmFsdWVB
dHRyR2V0dGVyLCBUZXN0VHlwZWRlZnNWOEludGVybmFsOjppbW11dGFibGVTZXJpYWxpemVkU2Ny
aXB0VmFsdWVBdHRyU2V0dGVyLCAwIC8qIG5vIGRhdGEgKi8sIHN0YXRpY19jYXN0PHY4OjpBY2Nl
c3NDb250cm9sPih2ODo6REVGQVVMVCksIHN0YXRpY19jYXN0PHY4OjpQcm9wZXJ0eUF0dHJpYnV0
ZT4odjg6Ok5vbmUpLCAwIC8qIG9uIGluc3RhbmNlICovfSwKKyAgICAvLyBBdHRyaWJ1dGUgJ1Rl
c3RTdWJPYmonIChUeXBlOiAncmVhZG9ubHkgYXR0cmlidXRlJyBFeHRBdHRyOiAnJykKKyAgICB7
IlRlc3RTdWJPYmoiLCBUZXN0VHlwZWRlZnNWOEludGVybmFsOjpUZXN0VHlwZWRlZnNDb25zdHJ1
Y3RvckdldHRlciwgMCwgJlY4VGVzdFN1Yk9iajo6aW5mbywgc3RhdGljX2Nhc3Q8djg6OkFjY2Vz
c0NvbnRyb2w+KHY4OjpERUZBVUxUKSwgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRl
Pih2ODo6Tm9uZSksIDAgLyogb24gaW5zdGFuY2UgKi99LAorICAgIC8vIEF0dHJpYnV0ZSAnYXR0
cldpdGhHZXR0ZXJFeGNlcHRpb24nIChUeXBlOiAnYXR0cmlidXRlJyBFeHRBdHRyOiAnJykKKyAg
ICB7ImF0dHJXaXRoR2V0dGVyRXhjZXB0aW9uIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6YXR0
cldpdGhHZXR0ZXJFeGNlcHRpb25BdHRyR2V0dGVyLCBUZXN0VHlwZWRlZnNWOEludGVybmFsOjph
dHRyV2l0aEdldHRlckV4Y2VwdGlvbkF0dHJTZXR0ZXIsIDAgLyogbm8gZGF0YSAqLywgc3RhdGlj
X2Nhc3Q8djg6OkFjY2Vzc0NvbnRyb2w+KHY4OjpERUZBVUxUKSwgc3RhdGljX2Nhc3Q8djg6OlBy
b3BlcnR5QXR0cmlidXRlPih2ODo6Tm9uZSksIDAgLyogb24gaW5zdGFuY2UgKi99LAorICAgIC8v
IEF0dHJpYnV0ZSAnYXR0cldpdGhTZXR0ZXJFeGNlcHRpb24nIChUeXBlOiAnYXR0cmlidXRlJyBF
eHRBdHRyOiAnJykKKyAgICB7ImF0dHJXaXRoU2V0dGVyRXhjZXB0aW9uIiwgVGVzdFR5cGVkZWZz
VjhJbnRlcm5hbDo6YXR0cldpdGhTZXR0ZXJFeGNlcHRpb25BdHRyR2V0dGVyLCBUZXN0VHlwZWRl
ZnNWOEludGVybmFsOjphdHRyV2l0aFNldHRlckV4Y2VwdGlvbkF0dHJTZXR0ZXIsIDAgLyogbm8g
ZGF0YSAqLywgc3RhdGljX2Nhc3Q8djg6OkFjY2Vzc0NvbnRyb2w+KHY4OjpERUZBVUxUKSwgc3Rh
dGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6Tm9uZSksIDAgLyogb24gaW5zdGFu
Y2UgKi99LAorICAgIC8vIEF0dHJpYnV0ZSAnc3RyaW5nQXR0cldpdGhHZXR0ZXJFeGNlcHRpb24n
IChUeXBlOiAnYXR0cmlidXRlJyBFeHRBdHRyOiAnJykKKyAgICB7InN0cmluZ0F0dHJXaXRoR2V0
dGVyRXhjZXB0aW9uIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6c3RyaW5nQXR0cldpdGhHZXR0
ZXJFeGNlcHRpb25BdHRyR2V0dGVyLCBUZXN0VHlwZWRlZnNWOEludGVybmFsOjpzdHJpbmdBdHRy
V2l0aEdldHRlckV4Y2VwdGlvbkF0dHJTZXR0ZXIsIDAgLyogbm8gZGF0YSAqLywgc3RhdGljX2Nh
c3Q8djg6OkFjY2Vzc0NvbnRyb2w+KHY4OjpERUZBVUxUKSwgc3RhdGljX2Nhc3Q8djg6OlByb3Bl
cnR5QXR0cmlidXRlPih2ODo6Tm9uZSksIDAgLyogb24gaW5zdGFuY2UgKi99LAorICAgIC8vIEF0
dHJpYnV0ZSAnc3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb24nIChUeXBlOiAnYXR0cmlidXRl
JyBFeHRBdHRyOiAnJykKKyAgICB7InN0cmluZ0F0dHJXaXRoU2V0dGVyRXhjZXB0aW9uIiwgVGVz
dFR5cGVkZWZzVjhJbnRlcm5hbDo6c3RyaW5nQXR0cldpdGhTZXR0ZXJFeGNlcHRpb25BdHRyR2V0
dGVyLCBUZXN0VHlwZWRlZnNWOEludGVybmFsOjpzdHJpbmdBdHRyV2l0aFNldHRlckV4Y2VwdGlv
bkF0dHJTZXR0ZXIsIDAgLyogbm8gZGF0YSAqLywgc3RhdGljX2Nhc3Q8djg6OkFjY2Vzc0NvbnRy
b2w+KHY4OjpERUZBVUxUKSwgc3RhdGljX2Nhc3Q8djg6OlByb3BlcnR5QXR0cmlidXRlPih2ODo6
Tm9uZSksIDAgLyogb24gaW5zdGFuY2UgKi99LAorfTsKKworc3RhdGljIGNvbnN0IFY4RE9NQ29u
ZmlndXJhdGlvbjo6QmF0Y2hlZENhbGxiYWNrIFY4VGVzdFR5cGVkZWZzQ2FsbGJhY2tzW10gPSB7
CisgICAgeyJmdW5jIiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6ZnVuY0NhbGxiYWNrfSwKKyAg
ICB7Im11bHRpVHJhbnNmZXJMaXN0IiwgVGVzdFR5cGVkZWZzVjhJbnRlcm5hbDo6bXVsdGlUcmFu
c2Zlckxpc3RDYWxsYmFja30sCisgICAgeyJzZXRTaGFkb3ciLCBUZXN0VHlwZWRlZnNWOEludGVy
bmFsOjpzZXRTaGFkb3dDYWxsYmFja30sCisgICAgeyJmdW5jV2l0aENsYW1wIiwgVGVzdFR5cGVk
ZWZzVjhJbnRlcm5hbDo6ZnVuY1dpdGhDbGFtcENhbGxiYWNrfSwKKyAgICB7ImltbXV0YWJsZVBv
aW50RnVuY3Rpb24iLCBUZXN0VHlwZWRlZnNWOEludGVybmFsOjppbW11dGFibGVQb2ludEZ1bmN0
aW9uQ2FsbGJhY2t9LAorICAgIHsibWV0aG9kV2l0aEV4Y2VwdGlvbiIsIFRlc3RUeXBlZGVmc1Y4
SW50ZXJuYWw6Om1ldGhvZFdpdGhFeGNlcHRpb25DYWxsYmFja30sCit9OworCit2ODo6SGFuZGxl
PHY4OjpWYWx1ZT4gVjhUZXN0VHlwZWRlZnM6OmNvbnN0cnVjdG9yQ2FsbGJhY2soY29uc3Qgdjg6
OkFyZ3VtZW50cyYgYXJncykKK3sKKyAgICAKKyAgICBpZiAoIWFyZ3MuSXNDb25zdHJ1Y3RDYWxs
KCkpCisgICAgICAgIHJldHVybiB0aHJvd1R5cGVFcnJvcigiRE9NIG9iamVjdCBjb25zdHJ1Y3Rv
ciBjYW5ub3QgYmUgY2FsbGVkIGFzIGEgZnVuY3Rpb24uIiwgYXJncy5HZXRJc29sYXRlKCkpOwor
CisgICAgaWYgKENvbnN0cnVjdG9yTW9kZTo6Y3VycmVudCgpID09IENvbnN0cnVjdG9yTW9kZTo6
V3JhcEV4aXN0aW5nT2JqZWN0KQorICAgICAgICByZXR1cm4gYXJncy5Ib2xkZXIoKTsKKyAgICBp
ZiAoYXJncy5MZW5ndGgoKSA8IDIpCisgICAgICAgIHJldHVybiB0aHJvd05vdEVub3VnaEFyZ3Vt
ZW50c0Vycm9yKGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICBWOFRSWUNBVENIX0ZPUl9WOFNUUklO
R1JFU09VUkNFKFY4U3RyaW5nUmVzb3VyY2U8PiwgaGVsbG8sIE1BWUJFX01JU1NJTkdfUEFSQU1F
VEVSKGFyZ3MsIDAsIERlZmF1bHRJc1VuZGVmaW5lZCkpOworICAgIGlmIChhcmdzLkxlbmd0aCgp
IDw9IDEgfHwgIWFyZ3NbMV0tPklzRnVuY3Rpb24oKSkKKyAgICAgICAgcmV0dXJuIHRocm93VHlw
ZUVycm9yKDAsIGFyZ3MuR2V0SXNvbGF0ZSgpKTsKKyAgICBSZWZQdHI8VGVzdENhbGxiYWNrPiB0
ZXN0Q2FsbGJhY2sgPSBWOFRlc3RDYWxsYmFjazo6Y3JlYXRlKGFyZ3NbMV0sIGdldFNjcmlwdEV4
ZWN1dGlvbkNvbnRleHQoKSk7CisKKyAgICBSZWZQdHI8VGVzdFR5cGVkZWZzPiBpbXBsID0gVGVz
dFR5cGVkZWZzOjpjcmVhdGUoaGVsbG8sIHRlc3RDYWxsYmFjayk7CisgICAgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0PiB3cmFwcGVyID0gYXJncy5Ib2xkZXIoKTsKKworICAgIFY4RE9NV3JhcHBlcjo6
YXNzb2NpYXRlT2JqZWN0V2l0aFdyYXBwZXIoaW1wbC5yZWxlYXNlKCksICZpbmZvLCB3cmFwcGVy
LCBhcmdzLkdldElzb2xhdGUoKSwgV3JhcHBlckNvbmZpZ3VyYXRpb246OkRlcGVuZGVudCk7Cisg
ICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKK3N0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rp
b25UZW1wbGF0ZT4gQ29uZmlndXJlVjhUZXN0VHlwZWRlZnNUZW1wbGF0ZSh2ODo6UGVyc2lzdGVu
dDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gZGVzYywgdjg6Oklzb2xhdGUqIGlzb2xhdGUpCit7Cisg
ICAgZGVzYy0+UmVhZE9ubHlQcm90b3R5cGUoKTsKKworICAgIHY4OjpMb2NhbDx2ODo6U2lnbmF0
dXJlPiBkZWZhdWx0U2lnbmF0dXJlOworICAgIGRlZmF1bHRTaWduYXR1cmUgPSBWOERPTUNvbmZp
Z3VyYXRpb246OmNvbmZpZ3VyZVRlbXBsYXRlKGRlc2MsICJUZXN0VHlwZWRlZnMiLCB2ODo6UGVy
c2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4oKSwgVjhUZXN0VHlwZWRlZnM6OmludGVybmFs
RmllbGRDb3VudCwKKyAgICAgICAgVjhUZXN0VHlwZWRlZnNBdHRycywgV1RGX0FSUkFZX0xFTkdU
SChWOFRlc3RUeXBlZGVmc0F0dHJzKSwKKyAgICAgICAgVjhUZXN0VHlwZWRlZnNDYWxsYmFja3Ms
IFdURl9BUlJBWV9MRU5HVEgoVjhUZXN0VHlwZWRlZnNDYWxsYmFja3MpLCBpc29sYXRlKTsKKyAg
ICBVTlVTRURfUEFSQU0oZGVmYXVsdFNpZ25hdHVyZSk7IC8vIEluIHNvbWUgY2FzZXMsIGl0IHdp
bGwgbm90IGJlIHVzZWQuCisgICAgZGVzYy0+U2V0Q2FsbEhhbmRsZXIoVjhUZXN0VHlwZWRlZnM6
OmNvbnN0cnVjdG9yQ2FsbGJhY2spOworICAgIHY4OjpMb2NhbDx2ODo6T2JqZWN0VGVtcGxhdGU+
IGluc3RhbmNlID0gZGVzYy0+SW5zdGFuY2VUZW1wbGF0ZSgpOworICAgIHY4OjpMb2NhbDx2ODo6
T2JqZWN0VGVtcGxhdGU+IHByb3RvID0gZGVzYy0+UHJvdG90eXBlVGVtcGxhdGUoKTsKKyAgICBV
TlVTRURfUEFSQU0oaW5zdGFuY2UpOyAvLyBJbiBzb21lIGNhc2VzLCBpdCB3aWxsIG5vdCBiZSB1
c2VkLgorICAgIFVOVVNFRF9QQVJBTShwcm90byk7IC8vIEluIHNvbWUgY2FzZXMsIGl0IHdpbGwg
bm90IGJlIHVzZWQuCisgICAgCisKKyAgICAvLyBDdXN0b20gU2lnbmF0dXJlICdtZXRob2RXaXRo
U2VxdWVuY2VBcmcnCisgICAgY29uc3QgaW50IG1ldGhvZFdpdGhTZXF1ZW5jZUFyZ0FyZ2MgPSAx
OworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IG1ldGhvZFdpdGhTZXF1ZW5j
ZUFyZ0FyZ3ZbbWV0aG9kV2l0aFNlcXVlbmNlQXJnQXJnY10gPSB7IFY4c2VxdWVuY2U8U2VyaWFs
aXplZFNjcmlwdFZhbHVlPjo6R2V0UmF3VGVtcGxhdGUoaXNvbGF0ZSkgfTsKKyAgICB2ODo6SGFu
ZGxlPHY4OjpTaWduYXR1cmU+IG1ldGhvZFdpdGhTZXF1ZW5jZUFyZ1NpZ25hdHVyZSA9IHY4OjpT
aWduYXR1cmU6Ok5ldyhkZXNjLCBtZXRob2RXaXRoU2VxdWVuY2VBcmdBcmdjLCBtZXRob2RXaXRo
U2VxdWVuY2VBcmdBcmd2KTsKKyAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgi
bWV0aG9kV2l0aFNlcXVlbmNlQXJnIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdFR5
cGVkZWZzVjhJbnRlcm5hbDo6bWV0aG9kV2l0aFNlcXVlbmNlQXJnQ2FsbGJhY2ssIHY4VW5kZWZp
bmVkKCksIG1ldGhvZFdpdGhTZXF1ZW5jZUFyZ1NpZ25hdHVyZSkpOworCisgICAgLy8gQ3VzdG9t
IFNpZ25hdHVyZSAnbnVsbGFibGVBcnJheUFyZycKKyAgICBjb25zdCBpbnQgbnVsbGFibGVBcnJh
eUFyZ0FyZ2MgPSAxOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IG51bGxh
YmxlQXJyYXlBcmdBcmd2W251bGxhYmxlQXJyYXlBcmdBcmdjXSA9IHsgVjhET01TdHJpbmdbXTo6
R2V0UmF3VGVtcGxhdGUoaXNvbGF0ZSkgfTsKKyAgICB2ODo6SGFuZGxlPHY4OjpTaWduYXR1cmU+
IG51bGxhYmxlQXJyYXlBcmdTaWduYXR1cmUgPSB2ODo6U2lnbmF0dXJlOjpOZXcoZGVzYywgbnVs
bGFibGVBcnJheUFyZ0FyZ2MsIG51bGxhYmxlQXJyYXlBcmdBcmd2KTsKKyAgICBwcm90by0+U2V0
KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgibnVsbGFibGVBcnJheUFyZyIpLCB2ODo6RnVuY3Rpb25U
ZW1wbGF0ZTo6TmV3KFRlc3RUeXBlZGVmc1Y4SW50ZXJuYWw6Om51bGxhYmxlQXJyYXlBcmdDYWxs
YmFjaywgdjhVbmRlZmluZWQoKSwgbnVsbGFibGVBcnJheUFyZ1NpZ25hdHVyZSkpOworCisgICAg
Ly8gQ3VzdG9tIFNpZ25hdHVyZSAnc3RyaW5nQXJyYXlGdW5jdGlvbicKKyAgICBjb25zdCBpbnQg
c3RyaW5nQXJyYXlGdW5jdGlvbkFyZ2MgPSAxOworICAgIHY4OjpIYW5kbGU8djg6OkZ1bmN0aW9u
VGVtcGxhdGU+IHN0cmluZ0FycmF5RnVuY3Rpb25Bcmd2W3N0cmluZ0FycmF5RnVuY3Rpb25Bcmdj
XSA9IHsgVjhET01TdHJpbmdbXTo6R2V0UmF3VGVtcGxhdGUoaXNvbGF0ZSkgfTsKKyAgICB2ODo6
SGFuZGxlPHY4OjpTaWduYXR1cmU+IHN0cmluZ0FycmF5RnVuY3Rpb25TaWduYXR1cmUgPSB2ODo6
U2lnbmF0dXJlOjpOZXcoZGVzYywgc3RyaW5nQXJyYXlGdW5jdGlvbkFyZ2MsIHN0cmluZ0FycmF5
RnVuY3Rpb25Bcmd2KTsKKyAgICBwcm90by0+U2V0KHY4OjpTdHJpbmc6Ok5ld1N5bWJvbCgic3Ry
aW5nQXJyYXlGdW5jdGlvbiIpLCB2ODo6RnVuY3Rpb25UZW1wbGF0ZTo6TmV3KFRlc3RUeXBlZGVm
c1Y4SW50ZXJuYWw6OnN0cmluZ0FycmF5RnVuY3Rpb25DYWxsYmFjaywgdjhVbmRlZmluZWQoKSwg
c3RyaW5nQXJyYXlGdW5jdGlvblNpZ25hdHVyZSkpOworCisgICAgLy8gQ3VzdG9tIFNpZ25hdHVy
ZSAnc3RyaW5nQXJyYXlGdW5jdGlvbjInCisgICAgY29uc3QgaW50IHN0cmluZ0FycmF5RnVuY3Rp
b24yQXJnYyA9IDE7CisgICAgdjg6OkhhbmRsZTx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gc3RyaW5n
QXJyYXlGdW5jdGlvbjJBcmd2W3N0cmluZ0FycmF5RnVuY3Rpb24yQXJnY10gPSB7IFY4RE9NU3Ry
aW5nW106OkdldFJhd1RlbXBsYXRlKGlzb2xhdGUpIH07CisgICAgdjg6OkhhbmRsZTx2ODo6U2ln
bmF0dXJlPiBzdHJpbmdBcnJheUZ1bmN0aW9uMlNpZ25hdHVyZSA9IHY4OjpTaWduYXR1cmU6Ok5l
dyhkZXNjLCBzdHJpbmdBcnJheUZ1bmN0aW9uMkFyZ2MsIHN0cmluZ0FycmF5RnVuY3Rpb24yQXJn
dik7CisgICAgcHJvdG8tPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woInN0cmluZ0FycmF5RnVu
Y3Rpb24yIiksIHY4OjpGdW5jdGlvblRlbXBsYXRlOjpOZXcoVGVzdFR5cGVkZWZzVjhJbnRlcm5h
bDo6c3RyaW5nQXJyYXlGdW5jdGlvbjJDYWxsYmFjaywgdjhVbmRlZmluZWQoKSwgc3RyaW5nQXJy
YXlGdW5jdGlvbjJTaWduYXR1cmUpKTsKKworICAgIC8vIEN1c3RvbSB0b1N0cmluZyB0ZW1wbGF0
ZQorICAgIGRlc2MtPlNldCh2ODo6U3RyaW5nOjpOZXdTeW1ib2woInRvU3RyaW5nIiksIFY4UGVy
SXNvbGF0ZURhdGE6OmN1cnJlbnQoKS0+dG9TdHJpbmdUZW1wbGF0ZSgpKTsKKyAgICByZXR1cm4g
ZGVzYzsKK30KKwordjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVtcGxhdGU+IFY4VGVzdFR5
cGVkZWZzOjpHZXRSYXdUZW1wbGF0ZSh2ODo6SXNvbGF0ZSogaXNvbGF0ZSkKK3sKKyAgICBWOFBl
cklzb2xhdGVEYXRhKiBkYXRhID0gVjhQZXJJc29sYXRlRGF0YTo6ZnJvbShpc29sYXRlKTsKKyAg
ICBWOFBlcklzb2xhdGVEYXRhOjpUZW1wbGF0ZU1hcDo6aXRlcmF0b3IgcmVzdWx0ID0gZGF0YS0+
cmF3VGVtcGxhdGVNYXAoKS5maW5kKCZpbmZvKTsKKyAgICBpZiAocmVzdWx0ICE9IGRhdGEtPnJh
d1RlbXBsYXRlTWFwKCkuZW5kKCkpCisgICAgICAgIHJldHVybiByZXN1bHQtPnZhbHVlOworCisg
ICAgdjg6OkhhbmRsZVNjb3BlIGhhbmRsZVNjb3BlOworICAgIHY4OjpQZXJzaXN0ZW50PHY4OjpG
dW5jdGlvblRlbXBsYXRlPiB0ZW1wbCA9IGNyZWF0ZVJhd1RlbXBsYXRlKGlzb2xhdGUpOworICAg
IGRhdGEtPnJhd1RlbXBsYXRlTWFwKCkuYWRkKCZpbmZvLCB0ZW1wbCk7CisgICAgcmV0dXJuIHRl
bXBsOworfQorCit2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gVjhUZXN0VHlw
ZWRlZnM6OkdldFRlbXBsYXRlKHY4OjpJc29sYXRlKiBpc29sYXRlKQoreworICAgIFY4UGVySXNv
bGF0ZURhdGEqIGRhdGEgPSBWOFBlcklzb2xhdGVEYXRhOjpmcm9tKGlzb2xhdGUpOworICAgIFY4
UGVySXNvbGF0ZURhdGE6OlRlbXBsYXRlTWFwOjppdGVyYXRvciByZXN1bHQgPSBkYXRhLT50ZW1w
bGF0ZU1hcCgpLmZpbmQoJmluZm8pOworICAgIGlmIChyZXN1bHQgIT0gZGF0YS0+dGVtcGxhdGVN
YXAoKS5lbmQoKSkKKyAgICAgICAgcmV0dXJuIHJlc3VsdC0+dmFsdWU7CisKKyAgICB2ODo6SGFu
ZGxlU2NvcGUgaGFuZGxlU2NvcGU7CisgICAgdjg6OlBlcnNpc3RlbnQ8djg6OkZ1bmN0aW9uVGVt
cGxhdGU+IHRlbXBsID0KKyAgICAgICAgQ29uZmlndXJlVjhUZXN0VHlwZWRlZnNUZW1wbGF0ZShH
ZXRSYXdUZW1wbGF0ZShpc29sYXRlKSwgaXNvbGF0ZSk7CisgICAgZGF0YS0+dGVtcGxhdGVNYXAo
KS5hZGQoJmluZm8sIHRlbXBsKTsKKyAgICByZXR1cm4gdGVtcGw7Cit9CisKK2Jvb2wgVjhUZXN0
VHlwZWRlZnM6Okhhc0luc3RhbmNlKHY4OjpIYW5kbGU8djg6OlZhbHVlPiB2YWx1ZSwgdjg6Oklz
b2xhdGUqIGlzb2xhdGUpCit7CisgICAgcmV0dXJuIEdldFJhd1RlbXBsYXRlKGlzb2xhdGUpLT5I
YXNJbnN0YW5jZSh2YWx1ZSk7Cit9CisKKwordjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBWOFRlc3RU
eXBlZGVmczo6Y3JlYXRlV3JhcHBlcihQYXNzUmVmUHRyPFRlc3RUeXBlZGVmcz4gaW1wbCwgdjg6
OkhhbmRsZTx2ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4OjpJc29sYXRlKiBpc29sYXRl
KQoreworICAgIEFTU0VSVChpbXBsLmdldCgpKTsKKyAgICBBU1NFUlQoRE9NRGF0YVN0b3JlOjpn
ZXRXcmFwcGVyKGltcGwuZ2V0KCksIGlzb2xhdGUpLklzRW1wdHkoKSk7CisKKyNpZiBFTkFCTEUo
QklORElOR19JTlRFR1JJVFkpCisgICAgY2hlY2tUeXBlT3JEaWVUcnlpbmcoaW1wbC5nZXQoKSk7
CisjZW5kaWYKKworICAgIHY4OjpIYW5kbGU8djg6Ok9iamVjdD4gd3JhcHBlciA9IFY4RE9NV3Jh
cHBlcjo6Y3JlYXRlV3JhcHBlcihjcmVhdGlvbkNvbnRleHQsICZpbmZvLCBpbXBsLmdldCgpLCBp
c29sYXRlKTsKKyAgICBpZiAoVU5MSUtFTFkod3JhcHBlci5Jc0VtcHR5KCkpKQorICAgICAgICBy
ZXR1cm4gd3JhcHBlcjsKKworICAgIGluc3RhbGxQZXJDb250ZXh0UHJvcGVydGllcyh3cmFwcGVy
LCBpbXBsLmdldCgpLCBpc29sYXRlKTsKKyAgICBWOERPTVdyYXBwZXI6OmFzc29jaWF0ZU9iamVj
dFdpdGhXcmFwcGVyKGltcGwsICZpbmZvLCB3cmFwcGVyLCBpc29sYXRlLCBoYXNEZXBlbmRlbnRM
aWZldGltZSA/IFdyYXBwZXJDb25maWd1cmF0aW9uOjpEZXBlbmRlbnQgOiBXcmFwcGVyQ29uZmln
dXJhdGlvbjo6SW5kZXBlbmRlbnQpOworICAgIHJldHVybiB3cmFwcGVyOworfQordm9pZCBWOFRl
c3RUeXBlZGVmczo6ZGVyZWZPYmplY3Qodm9pZCogb2JqZWN0KQoreworICAgIHN0YXRpY19jYXN0
PFRlc3RUeXBlZGVmcyo+KG9iamVjdCktPmRlcmVmKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIFdl
YkNvcmUKZGlmZiAtLWdpdCBhL1NvdXJjZS9XZWJDb3JlL2JpbmRpbmdzL3NjcmlwdHMvdGVzdC9W
OC9WOFRlc3RUeXBlZGVmcy5oIGIvU291cmNlL1dlYkNvcmUvYmluZGluZ3Mvc2NyaXB0cy90ZXN0
L1Y4L1Y4VGVzdFR5cGVkZWZzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw
MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMC4uYzFlNmYyOTY4OWEzODVhNDI3NjJiMzJk
NzFmZmU0ZmM0OGRjMzViYQotLS0gL2Rldi9udWxsCisrKyBiL1NvdXJjZS9XZWJDb3JlL2JpbmRp
bmdzL3NjcmlwdHMvdGVzdC9WOC9WOFRlc3RUeXBlZGVmcy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8q
CisgICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFdlYktpdCBvcGVuIHNvdXJjZSBwcm9qZWN0
LgorICAgIFRoaXMgZmlsZSBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgZ2VuZXJhdGUtYmluZGluZ3Mu
cGwuIERPIE5PVCBNT0RJRlkhCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsg
eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0
ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbCBQdWJsaWMKKyAgICBMaWNlbnNlIGFzIHB1
Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICB2ZXJz
aW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp
b24uCisKKyAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp
dCB3aWxsIGJlIHVzZWZ1bCwKKyAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg
ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO
RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICAgTGlicmFyeSBH
ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxk
IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBM
aWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5H
LkxJQi4gIElmIG5vdCwgd3JpdGUgdG8KKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9u
LCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCisgICAgQm9zdG9uLCBNQSAwMjEx
MS0xMzA3LCBVU0EuCisqLworCisjaWZuZGVmIFY4VGVzdFR5cGVkZWZzX2gKKyNkZWZpbmUgVjhU
ZXN0VHlwZWRlZnNfaAorCisjaW5jbHVkZSAiVGVzdFR5cGVkZWZzLmgiCisjaW5jbHVkZSAiVjhC
aW5kaW5nLmgiCisjaW5jbHVkZSAiVjhET01XcmFwcGVyLmgiCisjaW5jbHVkZSAiV3JhcHBlclR5
cGVJbmZvLmgiCisjaW5jbHVkZSA8djguaD4KKyNpbmNsdWRlIDx3dGYvSGFzaE1hcC5oPgorI2lu
Y2x1ZGUgPHd0Zi90ZXh0L1N0cmluZ0hhc2guaD4KKworbmFtZXNwYWNlIFdlYkNvcmUgeworCitj
bGFzcyBWOFRlc3RUeXBlZGVmcyB7CitwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGJvb2wgaGFz
RGVwZW5kZW50TGlmZXRpbWUgPSBmYWxzZTsKKyAgICBzdGF0aWMgYm9vbCBIYXNJbnN0YW5jZSh2
ODo6SGFuZGxlPHY4OjpWYWx1ZT4sIHY4OjpJc29sYXRlKik7CisgICAgc3RhdGljIHY4OjpQZXJz
aXN0ZW50PHY4OjpGdW5jdGlvblRlbXBsYXRlPiBHZXRSYXdUZW1wbGF0ZSh2ODo6SXNvbGF0ZSop
OworICAgIHN0YXRpYyB2ODo6UGVyc2lzdGVudDx2ODo6RnVuY3Rpb25UZW1wbGF0ZT4gR2V0VGVt
cGxhdGUodjg6Oklzb2xhdGUqKTsKKyAgICBzdGF0aWMgVGVzdFR5cGVkZWZzKiB0b05hdGl2ZSh2
ODo6SGFuZGxlPHY4OjpPYmplY3Q+IG9iamVjdCkKKyAgICB7CisgICAgICAgIHJldHVybiByZWlu
dGVycHJldF9jYXN0PFRlc3RUeXBlZGVmcyo+KG9iamVjdC0+R2V0QWxpZ25lZFBvaW50ZXJGcm9t
SW50ZXJuYWxGaWVsZCh2OERPTVdyYXBwZXJPYmplY3RJbmRleCkpOworICAgIH0KKyAgICBzdGF0
aWMgdm9pZCBkZXJlZk9iamVjdCh2b2lkKik7CisgICAgc3RhdGljIFdyYXBwZXJUeXBlSW5mbyBp
bmZvOworICAgIHN0YXRpYyB2ODo6SGFuZGxlPHY4OjpWYWx1ZT4gY29uc3RydWN0b3JDYWxsYmFj
ayhjb25zdCB2ODo6QXJndW1lbnRzJik7CisgICAgc3RhdGljIGNvbnN0IGludCBpbnRlcm5hbEZp
ZWxkQ291bnQgPSB2OERlZmF1bHRXcmFwcGVySW50ZXJuYWxGaWVsZENvdW50ICsgMDsKKyAgICBz
dGF0aWMgdm9pZCBpbnN0YWxsUGVyQ29udGV4dFByb3BlcnRpZXModjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiwgVGVzdFR5cGVkZWZzKiwgdjg6Oklzb2xhdGUqKSB7IH0KKyAgICBzdGF0aWMgdm9pZCBp
bnN0YWxsUGVyQ29udGV4dFByb3RvdHlwZVByb3BlcnRpZXModjg6OkhhbmRsZTx2ODo6T2JqZWN0
Piwgdjg6Oklzb2xhdGUqKSB7IH0KK3ByaXZhdGU6CisgICAgZnJpZW5kIHY4OjpIYW5kbGU8djg6
Ok9iamVjdD4gd3JhcChUZXN0VHlwZWRlZnMqLCB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IGNyZWF0
aW9uQ29udGV4dCwgdjg6Oklzb2xhdGUqKTsKKyAgICBzdGF0aWMgdjg6OkhhbmRsZTx2ODo6T2Jq
ZWN0PiBjcmVhdGVXcmFwcGVyKFBhc3NSZWZQdHI8VGVzdFR5cGVkZWZzPiwgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4OjpJc29sYXRlKik7Cit9OworCisKK2lubGlu
ZSB2ODo6SGFuZGxlPHY4OjpPYmplY3Q+IHdyYXAoVGVzdFR5cGVkZWZzKiBpbXBsLCB2ODo6SGFu
ZGxlPHY4OjpPYmplY3Q+IGNyZWF0aW9uQ29udGV4dCwgdjg6Oklzb2xhdGUqIGlzb2xhdGUpCit7
CisgICAgQVNTRVJUKGltcGwpOworICAgIEFTU0VSVChET01EYXRhU3RvcmU6OmdldFdyYXBwZXIo
aW1wbCwgaXNvbGF0ZSkuSXNFbXB0eSgpKTsKKyAgICByZXR1cm4gVjhUZXN0VHlwZWRlZnM6OmNy
ZWF0ZVdyYXBwZXIoaW1wbCwgY3JlYXRpb25Db250ZXh0LCBpc29sYXRlKTsKK30KKworaW5saW5l
IHY4OjpIYW5kbGU8djg6OlZhbHVlPiB0b1Y4KFRlc3RUeXBlZGVmcyogaW1wbCwgdjg6OkhhbmRs
ZTx2ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4OjpJc29sYXRlKiBpc29sYXRlKQorewor
ICAgIGlmIChVTkxJS0VMWSghaW1wbCkpCisgICAgICAgIHJldHVybiB2OE51bGxXaXRoQ2hlY2so
aXNvbGF0ZSk7CisgICAgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHdyYXBwZXIgPSBET01EYXRhU3Rv
cmU6OmdldFdyYXBwZXIoaW1wbCwgaXNvbGF0ZSk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHko
KSkKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgcmV0dXJuIHdyYXAoaW1wbCwgY3JlYXRp
b25Db250ZXh0LCBpc29sYXRlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgSG9sZGVyQ29udGFpbmVy
LCBjbGFzcyBXcmFwcGFibGU+CitpbmxpbmUgdjg6OkhhbmRsZTx2ODo6VmFsdWU+IHRvVjhGYXN0
KFRlc3RUeXBlZGVmcyogaW1wbCwgY29uc3QgSG9sZGVyQ29udGFpbmVyJiBjb250YWluZXIsIFdy
YXBwYWJsZSogd3JhcHBhYmxlKQoreworICAgIGlmIChVTkxJS0VMWSghaW1wbCkpCisgICAgICAg
IHJldHVybiB2OE51bGwoY29udGFpbmVyLkdldElzb2xhdGUoKSk7CisgICAgdjg6OkhhbmRsZTx2
ODo6T2JqZWN0PiB3cmFwcGVyID0gRE9NRGF0YVN0b3JlOjpnZXRXcmFwcGVyRmFzdChpbXBsLCBj
b250YWluZXIsIHdyYXBwYWJsZSk7CisgICAgaWYgKCF3cmFwcGVyLklzRW1wdHkoKSkKKyAgICAg
ICAgcmV0dXJuIHdyYXBwZXI7CisgICAgcmV0dXJuIHdyYXAoaW1wbCwgY29udGFpbmVyLkhvbGRl
cigpLCBjb250YWluZXIuR2V0SXNvbGF0ZSgpKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgSG9sZGVy
Q29udGFpbmVyLCBjbGFzcyBXcmFwcGFibGU+CitpbmxpbmUgdjg6OkhhbmRsZTx2ODo6VmFsdWU+
IHRvVjhGYXN0KFBhc3NSZWZQdHI8IFRlc3RUeXBlZGVmcyA+IGltcGwsIGNvbnN0IEhvbGRlckNv
bnRhaW5lciYgY29udGFpbmVyLCBXcmFwcGFibGUqIHdyYXBwYWJsZSkKK3sKKyAgICByZXR1cm4g
dG9WOEZhc3QoaW1wbC5nZXQoKSwgY29udGFpbmVyLCB3cmFwcGFibGUpOworfQorCitpbmxpbmUg
djg6OkhhbmRsZTx2ODo6VmFsdWU+IHRvVjgoUGFzc1JlZlB0cjwgVGVzdFR5cGVkZWZzID4gaW1w
bCwgdjg6OkhhbmRsZTx2ODo6T2JqZWN0PiBjcmVhdGlvbkNvbnRleHQsIHY4OjpJc29sYXRlKiBp
c29sYXRlKQoreworICAgIHJldHVybiB0b1Y4KGltcGwuZ2V0KCksIGNyZWF0aW9uQ29udGV4dCwg
aXNvbGF0ZSk7Cit9CisKK30KKworI2VuZGlmIC8vIFY4VGVzdFR5cGVkZWZzX2gK
</data>

          </attachment>
      

    </bug>

</bugzilla>