<?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>125275</bug_id>
          
          <creation_ts>2013-12-04 18:50:20 -0800</creation_ts>
          <short_desc>FTL should use cvttsd2si directly for double-to-int32 conversions</short_desc>
          <delta_ts>2013-12-08 18:57:13 -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>JavaScriptCore</component>
          <version>528+ (Nightly build)</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P2</priority>
          <bug_severity>Normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          <blocked>112840</blocked>
    
    <blocked>125283</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Filip Pizlo">fpizlo</assigned_to>
          <cc>barraclough</cc>
    
    <cc>ggaren</cc>
    
    <cc>mark.lam</cc>
    
    <cc>mhahnenberg</cc>
    
    <cc>msaboff</cc>
    
    <cc>nrotem</cc>
    
    <cc>oliver</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>956747</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-04 18:50:20 -0800</bug_when>
    <thetext>Patch forthcoming.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>956776</commentid>
    <comment_count>1</comment_count>
      <attachid>218490</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-04 22:49:28 -0800</bug_when>
    <thetext>Created attachment 218490
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>956922</commentid>
    <comment_count>2</comment_count>
    <who name="Nadav Rotem">nrotem</who>
    <bug_when>2013-12-05 09:12:50 -0800</bug_when>
    <thetext>Filip, in sensibleDoubleToInt you are creating an undef vector and insert a value into it.  If you don&apos;t initialize the vector the RA can pick whatever vector register it wants, potentially causing a partial-register dependency.  I would zero the register before inserting a value into it.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>957109</commentid>
    <comment_count>3</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-05 17:34:35 -0800</bug_when>
    <thetext>(In reply to comment #2)
&gt; Filip, in sensibleDoubleToInt you are creating an undef vector and insert a value into it.  If you don&apos;t initialize the vector the RA can pick whatever vector register it wants, potentially causing a partial-register dependency.

For my own edification, can you explain what the downside to my current approach is?  Under what conditions would this lead to a partial-register dependency, and why is that bad?

I was leaving the second element of the vector as undef bits because I thought that this would be the best way to tell LLVM that it&apos;s OK to use a register that had garbage in those bits.  But I take it that initializing it to zero would anyway allow LLVM to do this because LLVM can see that the initialization of those bits to zero is dead anyway?

&gt; I would zero the register before inserting a value into it.

Thanks for the feedback, I will do it!  To make sure you mean:

%1 = insertelement undef, %doubleValue, i32 0
%2 = insertelement %1, 0.0, i32 1
%3 = call @llvm.x86.sse2.cvttsd2si(%2)

Right?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>957112</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-05 17:41:55 -0800</bug_when>
    <thetext>(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; Filip, in sensibleDoubleToInt you are creating an undef vector and insert a value into it.  If you don&apos;t initialize the vector the RA can pick whatever vector register it wants, potentially causing a partial-register dependency.
&gt; 
&gt; For my own edification, can you explain what the downside to my current approach is?  Under what conditions would this lead to a partial-register dependency, and why is that bad?
&gt; 
&gt; I was leaving the second element of the vector as undef bits because I thought that this would be the best way to tell LLVM that it&apos;s OK to use a register that had garbage in those bits.  But I take it that initializing it to zero would anyway allow LLVM to do this because LLVM can see that the initialization of those bits to zero is dead anyway?
&gt; 
&gt; &gt; I would zero the register before inserting a value into it.
&gt; 
&gt; Thanks for the feedback, I will do it!  To make sure you mean:
&gt; 
&gt; %1 = insertelement undef, %doubleValue, i32 0
&gt; %2 = insertelement %1, 0.0, i32 1
&gt; %3 = call @llvm.x86.sse2.cvttsd2si(%2)
&gt; 
&gt; Right?

OK, I made this change and it seems to work.  I will land with this change.  In particular, here&apos;s what the relevant method looks like now:

    LValue sensibleDoubleToInt(LValue value)
    {
        RELEASE_ASSERT(isX86());
        return call(
            x86SSE2CvtTSD2SIIntrinsic(),
            insertElement(
                insertElement(getUndef(vectorType(doubleType, 2)), value, int32Zero),
                doubleZero, int32One));
    }</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>957115</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-05 17:45:21 -0800</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/160205</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>957143</commentid>
    <comment_count>6</comment_count>
    <who name="Nadav Rotem">nrotem</who>
    <bug_when>2013-12-05 20:36:50 -0800</bug_when>
    <thetext>I(In reply to comment #3)
&gt; (In reply to comment #2)
&gt; &gt; Filip, in sensibleDoubleToInt you are creating an undef vector and insert a value into it.  If you don&apos;t initialize the vector the RA can pick whatever vector register it wants, potentially causing a partial-register dependency.
&gt; 
&gt; For my own edification, can you explain what the downside to my current approach is?  Under what conditions would this lead to a partial-register dependency, and why is that bad?
&gt; 
&gt; I was leaving the second element of the vector as undef bits because I thought that this would be the best way to tell LLVM that it&apos;s OK to use a register that had garbage in those bits.  But I take it that initializing it to zero would anyway allow LLVM to do this because LLVM can see that the initialization of those bits to zero is dead anyway?
&gt; 
&gt; &gt; I would zero the register before inserting a value into it.
&gt; 
&gt; Thanks for the feedback, I will do it!  To make sure you mean:
&gt; 
&gt; %1 = insertelement undef, %doubleValue, i32 0
&gt; %2 = insertelement %1, 0.0, i32 1
&gt; %3 = call @llvm.x86.sse2.cvttsd2si(%2)
&gt; 
&gt; Right?

The IR looks right. The assembly looks okay ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>957695</commentid>
    <comment_count>7</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-12-08 12:25:14 -0800</bug_when>
    <thetext>(In reply to comment #6)
&gt; I(In reply to comment #3)
&gt; &gt; (In reply to comment #2)
&gt; &gt; &gt; Filip, in sensibleDoubleToInt you are creating an undef vector and insert a value into it.  If you don&apos;t initialize the vector the RA can pick whatever vector register it wants, potentially causing a partial-register dependency.
&gt; &gt; 
&gt; &gt; For my own edification, can you explain what the downside to my current approach is?  Under what conditions would this lead to a partial-register dependency, and why is that bad?
&gt; &gt; 
&gt; &gt; I was leaving the second element of the vector as undef bits because I thought that this would be the best way to tell LLVM that it&apos;s OK to use a register that had garbage in those bits.  But I take it that initializing it to zero would anyway allow LLVM to do this because LLVM can see that the initialization of those bits to zero is dead anyway?
&gt; &gt; 
&gt; &gt; &gt; I would zero the register before inserting a value into it.
&gt; &gt; 
&gt; &gt; Thanks for the feedback, I will do it!  To make sure you mean:
&gt; &gt; 
&gt; &gt; %1 = insertelement undef, %doubleValue, i32 0
&gt; &gt; %2 = insertelement %1, 0.0, i32 1
&gt; &gt; %3 = call @llvm.x86.sse2.cvttsd2si(%2)
&gt; &gt; 
&gt; &gt; Right?
&gt; 
&gt; The IR looks right. The assembly looks okay ?

Yup!  And it looked identical to what it was before.

Can you explain what the partial-register dependency problem is?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>957735</commentid>
    <comment_count>8</comment_count>
    <who name="Nadav Rotem">nrotem</who>
    <bug_when>2013-12-08 18:57:13 -0800</bug_when>
    <thetext>&gt; Can you explain what the partial-register dependency problem is?

Oops, I confused CVTTSD2SI with CVTTSI2SD. This code looks good. The the problem with the 2SD instruction is that it modifies a part of the XMM register. So the out-of-order engine can&apos;t execute the instruction whenever it wants because we need to wait for the upper part of the register to be calculated before we can execute the 2SD instruction.  By zeroing the upper part of the register we break this false dependency. Again, this does not apply to this instruction because we only read from the XMM register, not write into it.</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>218490</attachid>
            <date>2013-12-04 22:49:28 -0800</date>
            <delta_ts>2013-12-04 23:41:02 -0800</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>26460</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTYwMTU5KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDU3IEBA
CisyMDEzLTEyLTA0ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
RlRMIHNob3VsZCB1c2UgY3Z0dHNkMnNpIGRpcmVjdGx5IGZvciBkb3VibGUtdG8taW50MzIgY29u
dmVyc2lvbnMKKyAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lk
PTEyNTI3NQorCisgICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorICAgICAgICAK
KyAgICAgICAgV293LiBUaGlzIHdhcyBhbiBvcmRlYWwuIFVzaW5nIGN2dHRzZDJzaSB3YXMgYWN0
dWFsbHkgZWFzeSwgYnV0IEkgbGVhcm5lZCwgYW5kCisgICAgICAgIHNvbWV0aW1lcyBldmVuIGZp
eGVkLCBzb21lIGludGVyZXN0aW5nIHRoaW5nczoKKyAgICAgICAgCisgICAgICAgIC0gVGhlIGxs
dm0ueDg2LnNzZTIuY3Z0dHNkMnNpIGludHJpbnNpYyBjYW4gYWN0dWFsbHkgcmVzdWx0IGluIExM
Vk0gZW1pdHRpbmcgYQorICAgICAgICAgIHZjdnR0c2Qyc2kuIEkgZ3Vlc3MgdGhlIGludHJpbnNp
YyBkb2Vzbid0IGFjdHVhbGx5IGltcGx5IHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgICAgCisgICAg
ICAgIC0gVGhhdCB3aG9sZSB0aGluZyBhYm91dCBicmFuY2hUcnVuY2F0ZURvdWJsZVRvVWludDMy
PyBZZWFoIHdlIGRvbid0IG5lZWQgdGhhdC4gSXQncworICAgICAgICAgIGJldHRlciB0byB1c2Ug
YnJhbmNoVHJ1bmNhdGVEb3VibGVUb0ludDMyIGluc3RlYWQuIEl0IGhhcyB0aGUgcmlnaHQgc2Vt
YW50aWNzIGZvcgorICAgICAgICAgIGFsbCBvZiBpdHMgY2FsbGVycyAoZXJyLCBpdHMgb25lLWFu
ZC1vbmx5IGNhbGxlciksIGFuZCBpdCdzIG1vcmUgbGlrZWx5IHRvIHRha2UKKyAgICAgICAgICBm
YXN0IHBhdGguIFRoaXMgcGF0Y2gga2lsbHMgYnJhbmNoVHJ1bmNhdGVEb3VibGVUb1VpbnQzMi4K
KyAgICAgICAgCisgICAgICAgIC0gImFbaV0gPSB2OyB2ID0gYVtpXSIuIERvZXMgdGhpcyBjaGFu
Z2Ugdj8gT0ssIGFzc3VtZSB0aGF0ICdhW2ldJyBpcyBhIHB1cmUtaXNoCisgICAgICAgICAgb3Bl
cmF0aW9uIC0gbGlrZSBhbiBhcnJheSBhY2Nlc3Mgd2l0aCAnaScgYmVpbmcgYW4gaW50ZWdlciBp
bmRleCBhbmQgd2UncmUgbm90CisgICAgICAgICAgaGF2aW5nIGEgYmFkIHRpbWUuIE5vdyBkb2Vz
IHRoaXMgY2hhbmdlIHY/IENTRSBhc3N1bWVzIHRoYXQgaXQgZG9lc24ndC4gVGhhdCdzCisgICAg
ICAgICAgd3JvbmcuIElmICdhJyBpcyBhIHR5cGVkIGFycmF5IC0gdGhlIG1vc3Qgc2Vuc2libGUg
YW5kIHB1cmUga2luZCBvZiBhcnJheSAtIHRoZW4KKyAgICAgICAgICB0aGlzIGNhbiBiZSBhIHRy
dW5jYXRpbmcgY2FzdC4gRm9yIGV4YW1wbGUgJ3YnIGNvdWxkIGJlIGEgZG91YmxlIGFuZCAnYScg
Y291bGQgYmUKKyAgICAgICAgICBhbiBpbnRlZ2VyIGFycmF5LgorICAgICAgICAKKyAgICAgICAg
LSAidjEgPSBhW2ldOyB2MiA9IGFbaV0iLiBJcyB2MSA9PT0gdjIgYXNzdW1pbmcgdGhhdCAnYVtp
XScgaXMgcHVyZS1pc2g/IFRoZSBhbnN3ZXIKKyAgICAgICAgICBpcyBuby4gWW91IGNvdWxkIGhh
dmUgYSBkaWZmZXJlbnQgYXJyYXlNb2RlIGluIGVhY2ggYWNjZXNzLiBJIGtub3cgdGhpcyBzb3Vu
ZHMKKyAgICAgICAgICB3ZWlyZCwgYnV0IHdpdGggY29uY3VycmVudCBKSVQgdGhhdCBtaWdodCBo
YXBwZW4uCisgICAgICAgIAorICAgICAgICBUaGlzIHBhdGNoIGFkZHMgdGVzdHMgZm9yIGFsbCBv
ZiB0aGlzIHN0dWZmLCBleGNlcHQgZm9yIHRoZSBmaXJzdCBpc3N1ZSAoaXQncyB3ZWlyZAorICAg
ICAgICBidXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIpIGFuZCB0aGUgbGFzdCBpc3N1ZSAoaXQn
cyB0b28gbXVjaCBvZiBhIGZyZWFrc2hvdykuCisKKyAgICAgICAgKiBhc3NlbWJsZXIvTWFjcm9B
c3NlbWJsZXJBUk02NC5oOgorICAgICAgICAqIGFzc2VtYmxlci9NYWNyb0Fzc2VtYmxlckFSTXY3
Lmg6CisgICAgICAgICogYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyWDg2Q29tbW9uLmg6CisgICAg
ICAgICogZGZnL0RGR0NTRVBoYXNlLmNwcDoKKyAgICAgICAgKEpTQzo6REZHOjpDU0VQaGFzZTo6
Z2V0QnlWYWxMb2FkRWxpbWluYXRpb24pOgorICAgICAgICAoSlNDOjpERkc6OkNTRVBoYXNlOjpw
ZXJmb3JtTm9kZUNTRSk6CisgICAgICAgICogZGZnL0RGR1NwZWN1bGF0aXZlSklULmNwcDoKKyAg
ICAgICAgKEpTQzo6REZHOjpTcGVjdWxhdGl2ZUpJVDo6Y29tcGlsZVB1dEJ5VmFsRm9ySW50VHlw
ZWRBcnJheSk6CisgICAgICAgICogZnRsL0ZUTEFiYnJldmlhdGlvbnMuaDoKKyAgICAgICAgKEpT
Qzo6RlRMOjp2ZWN0b3JUeXBlKToKKyAgICAgICAgKEpTQzo6RlRMOjpnZXRVbmRlZik6CisgICAg
ICAgIChKU0M6OkZUTDo6YnVpbGRJbnNlcnRFbGVtZW50KToKKyAgICAgICAgKiBmdGwvRlRMSW50
cmluc2ljUmVwb3NpdG9yeS5oOgorICAgICAgICAqIGZ0bC9GVExMb3dlckRGR1RvTExWTS5jcHA6
CisgICAgICAgIChKU0M6OkZUTDo6TG93ZXJERkdUb0xMVk06OmRvdWJsZVRvSW50MzIpOgorICAg
ICAgICAoSlNDOjpGVEw6Okxvd2VyREZHVG9MTFZNOjpkb3VibGVUb1VJbnQzMik6CisgICAgICAg
IChKU0M6OkZUTDo6TG93ZXJERkdUb0xMVk06OnNlbnNpYmxlRG91YmxlVG9JbnQzMik6CisgICAg
ICAgICogZnRsL0ZUTE91dHB1dC5oOgorICAgICAgICAoSlNDOjpGVEw6Ok91dHB1dDo6aW5zZXJ0
RWxlbWVudCk6CisgICAgICAgIChKU0M6OkZUTDo6T3V0cHV0OjpoYXNTZW5zaWJsZURvdWJsZVRv
SW50KToKKyAgICAgICAgKEpTQzo6RlRMOjpPdXRwdXQ6OnNlbnNpYmxlRG91YmxlVG9JbnQpOgor
CiAyMDEzLTEyLTA0ICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CiAKICAgICAgICAg
Rm9sZCBjb25zdGFudCB0eXBlZCBhcnJheXMKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9h
c3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXJBUk02NC5oCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXJBUk02NC5oCShyZXZpc2lvbiAxNjAx
NTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyQVJN
NjQuaAkod29ya2luZyBjb3B5KQpAQCAtMTE5NiwxNSArMTE5Niw2IEBAIHB1YmxpYzoKICAgICAg
ICAgcmV0dXJuIEp1bXAobWFrZUJyYW5jaChicmFuY2hUeXBlID09IEJyYW5jaElmVHJ1bmNhdGVT
dWNjZXNzZnVsID8gRXF1YWwgOiBOb3RFcXVhbCkpOwogICAgIH0KIAotICAgIEp1bXAgYnJhbmNo
VHJ1bmNhdGVEb3VibGVUb1VpbnQzMihGUFJlZ2lzdGVySUQgc3JjLCBSZWdpc3RlcklEIGRlc3Qs
IEJyYW5jaFRydW5jYXRlVHlwZSBicmFuY2hUeXBlID0gQnJhbmNoSWZUcnVuY2F0ZUZhaWxlZCkK
LSAgICB7Ci0gICAgICAgIC8vIFRydW5jYXRlIHRvIGEgNjQtYml0IGludGVnZXIgaW4gZGF0YVRl
bXBSZWdpc3RlciwgY29weSB0aGUgbG93IDMyLWJpdCB0byBkZXN0LgotICAgICAgICBtX2Fzc2Vt
Ymxlci5mY3Z0enM8NjQsIDY0PihkZXN0LCBzcmMpOwotICAgICAgICAvLyBDaGVjayB0aGxvdyAz
Mi1iaXRzIHplcm8gZXh0ZW5kIHRvIGJlIGVxdWFsIHRvIHRoZSBmdWxsIHZhbHVlLgotICAgICAg
ICBtX2Fzc2VtYmxlci5jbXA8NjQ+KGRlc3QsIGRlc3QsIEFSTTY0QXNzZW1ibGVyOjpVWFRXLCAw
KTsKLSAgICAgICAgcmV0dXJuIEp1bXAobWFrZUJyYW5jaChicmFuY2hUeXBlID09IEJyYW5jaElm
VHJ1bmNhdGVTdWNjZXNzZnVsID8gRXF1YWwgOiBOb3RFcXVhbCkpOwotICAgIH0KLQogICAgIHZv
aWQgY29udmVydERvdWJsZVRvRmxvYXQoRlBSZWdpc3RlcklEIHNyYywgRlBSZWdpc3RlcklEIGRl
c3QpCiAgICAgewogICAgICAgICBtX2Fzc2VtYmxlci5mY3Z0PDMyLCA2ND4oZGVzdCwgc3JjKTsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXJBUk12
Ny5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9B
c3NlbWJsZXJBUk12Ny5oCShyZXZpc2lvbiAxNjAxNTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENv
cmUvYXNzZW1ibGVyL01hY3JvQXNzZW1ibGVyQVJNdjcuaAkod29ya2luZyBjb3B5KQpAQCAtMTA3
NCwyMyArMTA3NCw2IEBAIHB1YmxpYzoKICAgICAgICAgcmV0dXJuIGZhaWx1cmU7CiAgICAgfQog
Ci0gICAgSnVtcCBicmFuY2hUcnVuY2F0ZURvdWJsZVRvVWludDMyKEZQUmVnaXN0ZXJJRCBzcmMs
IFJlZ2lzdGVySUQgZGVzdCwgQnJhbmNoVHJ1bmNhdGVUeXBlIGJyYW5jaFR5cGUgPSBCcmFuY2hJ
ZlRydW5jYXRlRmFpbGVkKQotICAgIHsKLSAgICAgICAgbV9hc3NlbWJsZXIudmN2dF9mbG9hdGlu
Z1BvaW50VG9TaWduZWQoZnBUZW1wUmVnaXN0ZXJBc1NpbmdsZSgpLCBzcmMpOwotICAgICAgICBt
X2Fzc2VtYmxlci52bW92KGRlc3QsIGZwVGVtcFJlZ2lzdGVyQXNTaW5nbGUoKSk7Ci0gICAgICAg
IAotICAgICAgICBKdW1wIG92ZXJmbG93ID0gYnJhbmNoMzIoRXF1YWwsIGRlc3QsIFRydXN0ZWRJ
bW0zMigweDdmZmZmZmZmKSk7Ci0gICAgICAgIEp1bXAgc3VjY2VzcyA9IGJyYW5jaDMyKEdyZWF0
ZXJUaGFuT3JFcXVhbCwgZGVzdCwgVHJ1c3RlZEltbTMyKDApKTsKLSAgICAgICAgb3ZlcmZsb3cu
bGluayh0aGlzKTsKLQotICAgICAgICBpZiAoYnJhbmNoVHlwZSA9PSBCcmFuY2hJZlRydW5jYXRl
U3VjY2Vzc2Z1bCkKLSAgICAgICAgICAgIHJldHVybiBzdWNjZXNzOwotICAgICAgICAKLSAgICAg
ICAgSnVtcCBmYWlsdXJlID0ganVtcCgpOwotICAgICAgICBzdWNjZXNzLmxpbmsodGhpcyk7Ci0g
ICAgICAgIHJldHVybiBmYWlsdXJlOwotICAgIH0KLQogICAgIC8vIFJlc3VsdCBpcyB1bmRlZmlu
ZWQgaWYgdGhlIHZhbHVlIGlzIG91dHNpZGUgb2YgdGhlIGludGVnZXIgcmFuZ2UuCiAgICAgdm9p
ZCB0cnVuY2F0ZURvdWJsZVRvSW50MzIoRlBSZWdpc3RlcklEIHNyYywgUmVnaXN0ZXJJRCBkZXN0
KQogICAgIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3Nl
bWJsZXJYODZDb21tb24uaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYXNz
ZW1ibGVyL01hY3JvQXNzZW1ibGVyWDg2Q29tbW9uLmgJKHJldmlzaW9uIDE2MDE1MCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9hc3NlbWJsZXIvTWFjcm9Bc3NlbWJsZXJYODZDb21tb24uaAko
d29ya2luZyBjb3B5KQpAQCAtODg1LDEzICs4ODUsNiBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVy
biBicmFuY2gzMihicmFuY2hUeXBlID8gTm90RXF1YWwgOiBFcXVhbCwgZGVzdCwgVHJ1c3RlZElt
bTMyKDB4ODAwMDAwMDApKTsKICAgICB9CiAKLSAgICBKdW1wIGJyYW5jaFRydW5jYXRlRG91Ymxl
VG9VaW50MzIoRlBSZWdpc3RlcklEIHNyYywgUmVnaXN0ZXJJRCBkZXN0LCBCcmFuY2hUcnVuY2F0
ZVR5cGUgYnJhbmNoVHlwZSA9IEJyYW5jaElmVHJ1bmNhdGVGYWlsZWQpCi0gICAgewotICAgICAg
ICBBU1NFUlQoaXNTU0UyUHJlc2VudCgpKTsKLSAgICAgICAgbV9hc3NlbWJsZXIuY3Z0dHNkMnNp
X3JyKHNyYywgZGVzdCk7Ci0gICAgICAgIHJldHVybiBicmFuY2gzMihicmFuY2hUeXBlID8gR3Jl
YXRlclRoYW5PckVxdWFsIDogTGVzc1RoYW4sIGRlc3QsIFRydXN0ZWRJbW0zMigwKSk7Ci0gICAg
fQotCiAgICAgdm9pZCB0cnVuY2F0ZURvdWJsZVRvSW50MzIoRlBSZWdpc3RlcklEIHNyYywgUmVn
aXN0ZXJJRCBkZXN0KQogICAgIHsKICAgICAgICAgQVNTRVJUKGlzU1NFMlByZXNlbnQoKSk7Cklu
ZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NTRVBoYXNlLmNwcAo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0NTRVBoYXNlLmNwcAkocmV2aXNpb24g
MTYwMTUwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9ERkdDU0VQaGFzZS5jcHAJKHdv
cmtpbmcgY29weSkKQEAgLTMzMSw3ICszMzEsNyBAQCBwcml2YXRlOgogICAgICAgICByZXR1cm4g
MDsKICAgICB9CiAgICAgCi0gICAgTm9kZSogZ2V0QnlWYWxMb2FkRWxpbWluYXRpb24oTm9kZSog
Y2hpbGQxLCBOb2RlKiBjaGlsZDIpCisgICAgTm9kZSogZ2V0QnlWYWxMb2FkRWxpbWluYXRpb24o
Tm9kZSogY2hpbGQxLCBOb2RlKiBjaGlsZDIsIEFycmF5TW9kZSBhcnJheU1vZGUpCiAgICAgewog
ICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBtX2luZGV4SW5CbG9jazsgaS0tOykgewogICAgICAg
ICAgICAgTm9kZSogbm9kZSA9IG1fY3VycmVudEJsb2NrLT5hdChpKTsKQEAgLTM0Miw3ICszNDIs
OSBAQCBwcml2YXRlOgogICAgICAgICAgICAgY2FzZSBHZXRCeVZhbDoKICAgICAgICAgICAgICAg
ICBpZiAoIW1fZ3JhcGguYnlWYWxJc1B1cmUobm9kZSkpCiAgICAgICAgICAgICAgICAgICAgIHJl
dHVybiAwOwotICAgICAgICAgICAgICAgIGlmIChub2RlLT5jaGlsZDEoKSA9PSBjaGlsZDEgJiYg
bm9kZS0+Y2hpbGQyKCkgPT0gY2hpbGQyKQorICAgICAgICAgICAgICAgIGlmIChub2RlLT5jaGls
ZDEoKSA9PSBjaGlsZDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbm9kZS0+Y2hpbGQyKCkgPT0g
Y2hpbGQyCisgICAgICAgICAgICAgICAgICAgICYmIG5vZGUtPmFycmF5TW9kZSgpLnR5cGUoKSA9
PSBhcnJheU1vZGUudHlwZSgpKQogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKICAg
ICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgCkBAIC0zNTEsNyArMzUz
LDEyIEBAIHByaXZhdGU6CiAgICAgICAgICAgICBjYXNlIFB1dEJ5VmFsQWxpYXM6IHsKICAgICAg
ICAgICAgICAgICBpZiAoIW1fZ3JhcGguYnlWYWxJc1B1cmUobm9kZSkpCiAgICAgICAgICAgICAg
ICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIGlmIChtX2dyYXBoLnZhckFyZ0NoaWxk
KG5vZGUsIDApID09IGNoaWxkMSAmJiBtX2dyYXBoLnZhckFyZ0NoaWxkKG5vZGUsIDEpID09IGNo
aWxkMikKKyAgICAgICAgICAgICAgICAvLyBUeXBlZCBhcnJheXMgCisgICAgICAgICAgICAgICAg
aWYgKGFycmF5TW9kZS50eXBlZEFycmF5VHlwZSgpICE9IE5vdFR5cGVkQXJyYXkpCisgICAgICAg
ICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIGlmIChtX2dyYXBoLnZhckFy
Z0NoaWxkKG5vZGUsIDApID09IGNoaWxkMQorICAgICAgICAgICAgICAgICAgICAmJiBtX2dyYXBo
LnZhckFyZ0NoaWxkKG5vZGUsIDEpID09IGNoaWxkMgorICAgICAgICAgICAgICAgICAgICAmJiBu
b2RlLT5hcnJheU1vZGUoKS50eXBlKCkgPT0gYXJyYXlNb2RlLnR5cGUoKSkKICAgICAgICAgICAg
ICAgICAgICAgcmV0dXJuIG1fZ3JhcGgudmFyQXJnQ2hpbGQobm9kZSwgMikubm9kZSgpOwogICAg
ICAgICAgICAgICAgIC8vIFdlIG11c3QgYXNzdW1lIHRoYXQgdGhlIFB1dEJ5VmFsIHdpbGwgY2xv
YmJlciB0aGUgbG9jYXRpb24gd2UncmUgZ2V0dGluZyBmcm9tLgogICAgICAgICAgICAgICAgIC8v
IEZJWE1FOiBXZSBjYW4gZG8gYmV0dGVyOyBpZiB3ZSBrbm93IHRoYXQgdGhlIFB1dEJ5VmFsIGlz
IGFjY2Vzc2luZyBhbiBhcnJheSBvZiBhCkBAIC0xMjE2LDcgKzEyMjMsNyBAQCBwcml2YXRlOgog
ICAgICAgICAgICAgaWYgKGNzZU1vZGUgPT0gU3RvcmVFbGltaW5hdGlvbikKICAgICAgICAgICAg
ICAgICBicmVhazsKICAgICAgICAgICAgIGlmIChtX2dyYXBoLmJ5VmFsSXNQdXJlKG5vZGUpKQot
ICAgICAgICAgICAgICAgIHNldFJlcGxhY2VtZW50KGdldEJ5VmFsTG9hZEVsaW1pbmF0aW9uKG5v
ZGUtPmNoaWxkMSgpLm5vZGUoKSwgbm9kZS0+Y2hpbGQyKCkubm9kZSgpKSk7CisgICAgICAgICAg
ICAgICAgc2V0UmVwbGFjZW1lbnQoZ2V0QnlWYWxMb2FkRWxpbWluYXRpb24obm9kZS0+Y2hpbGQx
KCkubm9kZSgpLCBub2RlLT5jaGlsZDIoKS5ub2RlKCksIG5vZGUtPmFycmF5TW9kZSgpKSk7CiAg
ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAKICAgICAgICAgY2FzZSBQdXRCeVZh
bERpcmVjdDoKQEAgLTEyMjYsNyArMTIzMyw3IEBAIHByaXZhdGU6CiAgICAgICAgICAgICBFZGdl
IGNoaWxkMSA9IG1fZ3JhcGgudmFyQXJnQ2hpbGQobm9kZSwgMCk7CiAgICAgICAgICAgICBFZGdl
IGNoaWxkMiA9IG1fZ3JhcGgudmFyQXJnQ2hpbGQobm9kZSwgMSk7CiAgICAgICAgICAgICBpZiAo
bm9kZS0+YXJyYXlNb2RlKCkuY2FuQ1NFU3RvcmFnZSgpKSB7Ci0gICAgICAgICAgICAgICAgTm9k
ZSogcmVwbGFjZW1lbnQgPSBnZXRCeVZhbExvYWRFbGltaW5hdGlvbihjaGlsZDEubm9kZSgpLCBj
aGlsZDIubm9kZSgpKTsKKyAgICAgICAgICAgICAgICBOb2RlKiByZXBsYWNlbWVudCA9IGdldEJ5
VmFsTG9hZEVsaW1pbmF0aW9uKGNoaWxkMS5ub2RlKCksIGNoaWxkMi5ub2RlKCksIG5vZGUtPmFy
cmF5TW9kZSgpKTsKICAgICAgICAgICAgICAgICBpZiAoIXJlcGxhY2VtZW50KQogICAgICAgICAg
ICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBub2RlLT5zZXRPcChQdXRCeVZhbEFs
aWFzKTsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRpdmVKSVQu
Y3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHU3BlY3VsYXRp
dmVKSVQuY3BwCShyZXZpc2lvbiAxNjAxNTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZn
L0RGR1NwZWN1bGF0aXZlSklULmNwcAkod29ya2luZyBjb3B5KQpAQCAtMjUwNiwxMSArMjUwNiw4
IEBAIHZvaWQgU3BlY3VsYXRpdmVKSVQ6OmNvbXBpbGVQdXRCeVZhbEZvckkKICAgICAgICAgICAg
ICAgICBNYWNyb0Fzc2VtYmxlcjo6SnVtcCBmaXhlZCA9IG1faml0Lmp1bXAoKTsKICAgICAgICAg
ICAgICAgICBub3ROYU4ubGluaygmbV9qaXQpOwogICAgICAgICAgICAgICAgIAotICAgICAgICAg
ICAgICAgIE1hY3JvQXNzZW1ibGVyOjpKdW1wIGZhaWxlZDsKLSAgICAgICAgICAgICAgICBpZiAo
aXNTaWduZWQodHlwZSkpCi0gICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IG1faml0LmJyYW5j
aFRydW5jYXRlRG91YmxlVG9JbnQzMihmcHIsIGdwciwgTWFjcm9Bc3NlbWJsZXI6OkJyYW5jaElm
VHJ1bmNhdGVGYWlsZWQpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAg
ICAgZmFpbGVkID0gbV9qaXQuYnJhbmNoVHJ1bmNhdGVEb3VibGVUb1VpbnQzMihmcHIsIGdwciwg
TWFjcm9Bc3NlbWJsZXI6OkJyYW5jaElmVHJ1bmNhdGVGYWlsZWQpOworICAgICAgICAgICAgICAg
IE1hY3JvQXNzZW1ibGVyOjpKdW1wIGZhaWxlZCA9IG1faml0LmJyYW5jaFRydW5jYXRlRG91Ymxl
VG9JbnQzMigKKyAgICAgICAgICAgICAgICAgICAgZnByLCBncHIsIE1hY3JvQXNzZW1ibGVyOjpC
cmFuY2hJZlRydW5jYXRlRmFpbGVkKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAg
ICBhZGRTbG93UGF0aEdlbmVyYXRvcihzbG93UGF0aENhbGwoZmFpbGVkLCB0aGlzLCB0b0ludDMy
LCBncHIsIGZwcikpOwogICAgICAgICAgICAgICAgIApJbmRleDogU291cmNlL0phdmFTY3JpcHRD
b3JlL2Z0bC9GVExBYmJyZXZpYXRpb25zLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2Z0bC9GVExBYmJyZXZpYXRpb25zLmgJKHJldmlzaW9uIDE2MDE1MCkKKysrIFNvdXJj
ZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMQWJicmV2aWF0aW9ucy5oCSh3b3JraW5nIGNvcHkpCkBA
IC01OCw2ICs1OCw3IEBAIHN0YXRpYyBpbmxpbmUgTFR5cGUgZmxvYXRUeXBlKExDb250ZXh0IGMK
IHN0YXRpYyBpbmxpbmUgTFR5cGUgZG91YmxlVHlwZShMQ29udGV4dCBjb250ZXh0KSB7IHJldHVy
biBsbHZtLT5Eb3VibGVUeXBlSW5Db250ZXh0KGNvbnRleHQpOyB9CiAKIHN0YXRpYyBpbmxpbmUg
TFR5cGUgcG9pbnRlclR5cGUoTFR5cGUgdHlwZSkgeyByZXR1cm4gbGx2bS0+UG9pbnRlclR5cGUo
dHlwZSwgMCk7IH0KK3N0YXRpYyBpbmxpbmUgTFR5cGUgdmVjdG9yVHlwZShMVHlwZSB0eXBlLCB1
bnNpZ25lZCBjb3VudCkgeyByZXR1cm4gbGx2bS0+VmVjdG9yVHlwZSh0eXBlLCBjb3VudCk7IH0K
IAogZW51bSBQYWNraW5nTW9kZSB7IE5vdFBhY2tlZCwgUGFja2VkIH07CiBzdGF0aWMgaW5saW5l
IExUeXBlIHN0cnVjdFR5cGUoTENvbnRleHQgY29udGV4dCwgTFR5cGUqIGVsZW1lbnRUeXBlcywg
dW5zaWduZWQgZWxlbWVudENvdW50LCBQYWNraW5nTW9kZSBwYWNraW5nID0gTm90UGFja2VkKQpA
QCAtMTQwLDYgKzE0MSw3IEBAIHN0YXRpYyBpbmxpbmUgTFZhbHVlIGFkZEV4dGVybkZ1bmN0aW9u
KEwKIH0KIAogc3RhdGljIGlubGluZSBMVmFsdWUgZ2V0UGFyYW0oTFZhbHVlIGZ1bmN0aW9uLCB1
bnNpZ25lZCBpbmRleCkgeyByZXR1cm4gbGx2bS0+R2V0UGFyYW0oZnVuY3Rpb24sIGluZGV4KTsg
fQorc3RhdGljIGlubGluZSBMVmFsdWUgZ2V0VW5kZWYoTFR5cGUgdHlwZSkgeyByZXR1cm4gbGx2
bS0+R2V0VW5kZWYodHlwZSk7IH0KIAogZW51bSBCaXRFeHRlbnNpb24geyBaZXJvRXh0ZW5kLCBT
aWduRXh0ZW5kIH07CiBzdGF0aWMgaW5saW5lIExWYWx1ZSBjb25zdEludChMVHlwZSB0eXBlLCB1
bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUsIEJpdEV4dGVuc2lvbiBleHRlbnNpb24gPSBaZXJvRXh0
ZW5kKSB7IHJldHVybiBsbHZtLT5Db25zdEludCh0eXBlLCB2YWx1ZSwgZXh0ZW5zaW9uID09IFNp
Z25FeHRlbmQpOyB9CkBAIC0yMTcsNiArMjE5LDcgQEAgc3RhdGljIGlubGluZSBMVmFsdWUgYnVp
bGRQdHJUb0ludChMQnVpbAogc3RhdGljIGlubGluZSBMVmFsdWUgYnVpbGRCaXRDYXN0KExCdWls
ZGVyIGJ1aWxkZXIsIExWYWx1ZSB2YWx1ZSwgTFR5cGUgdHlwZSkgeyByZXR1cm4gbGx2bS0+QnVp
bGRCaXRDYXN0KGJ1aWxkZXIsIHZhbHVlLCB0eXBlLCAiIik7IH0KIHN0YXRpYyBpbmxpbmUgTFZh
bHVlIGJ1aWxkSUNtcChMQnVpbGRlciBidWlsZGVyLCBMSW50UHJlZGljYXRlIGNvbmQsIExWYWx1
ZSBsZWZ0LCBMVmFsdWUgcmlnaHQpIHsgcmV0dXJuIGxsdm0tPkJ1aWxkSUNtcChidWlsZGVyLCBj
b25kLCBsZWZ0LCByaWdodCwgIiIpOyB9CiBzdGF0aWMgaW5saW5lIExWYWx1ZSBidWlsZEZDbXAo
TEJ1aWxkZXIgYnVpbGRlciwgTFJlYWxQcmVkaWNhdGUgY29uZCwgTFZhbHVlIGxlZnQsIExWYWx1
ZSByaWdodCkgeyByZXR1cm4gbGx2bS0+QnVpbGRGQ21wKGJ1aWxkZXIsIGNvbmQsIGxlZnQsIHJp
Z2h0LCAiIik7IH0KK3N0YXRpYyBpbmxpbmUgTFZhbHVlIGJ1aWxkSW5zZXJ0RWxlbWVudChMQnVp
bGRlciBidWlsZGVyLCBMVmFsdWUgdmVjdG9yLCBMVmFsdWUgZWxlbWVudCwgTFZhbHVlIGluZGV4
KSB7IHJldHVybiBsbHZtLT5CdWlsZEluc2VydEVsZW1lbnQoYnVpbGRlciwgdmVjdG9yLCBlbGVt
ZW50LCBpbmRleCwgIiIpOyB9CiAKIGVudW0gU3luY2hyb25pemF0aW9uU2NvcGUgeyBTaW5nbGVU
aHJlYWQsIENyb3NzVGhyZWFkIH07CiBzdGF0aWMgaW5saW5lIExWYWx1ZSBidWlsZEZlbmNlKExC
dWlsZGVyIGJ1aWxkZXIsIExBdG9taWNPcmRlcmluZyBvcmRlcmluZywgU3luY2hyb25pemF0aW9u
U2NvcGUgc2NvcGUgPSBDcm9zc1RocmVhZCkKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9m
dGwvRlRMSW50cmluc2ljUmVwb3NpdG9yeS5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9mdGwvRlRMSW50cmluc2ljUmVwb3NpdG9yeS5oCShyZXZpc2lvbiAxNjAxNTApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTEludHJpbnNpY1JlcG9zaXRvcnkuaAkod29y
a2luZyBjb3B5KQpAQCAtNDcsNyArNDcsOCBAQCBuYW1lc3BhY2UgSlNDIHsgbmFtZXNwYWNlIEZU
TCB7CiAgICAgbWFjcm8ocGF0Y2hwb2ludEludDY0LCAibGx2bS5leHBlcmltZW50YWwucGF0Y2hw
b2ludC5pNjQiLCBmdW5jdGlvblR5cGUoaW50NjQsIGludDMyLCBpbnQzMiwgcmVmOCwgaW50MzIs
IFZhcmlhZGljKSkgXAogICAgIG1hY3JvKHBhdGNocG9pbnRWb2lkLCAibGx2bS5leHBlcmltZW50
YWwucGF0Y2hwb2ludC52b2lkIiwgZnVuY3Rpb25UeXBlKHZvaWRUeXBlLCBpbnQzMiwgaW50MzIs
IHJlZjgsIGludDMyLCBWYXJpYWRpYykpIFwKICAgICBtYWNybyhzdGFja21hcCwgImxsdm0uZXhw
ZXJpbWVudGFsLnN0YWNrbWFwIiwgZnVuY3Rpb25UeXBlKHZvaWRUeXBlLCBpbnQzMiwgaW50MzIs
IFZhcmlhZGljKSkgXAotICAgIG1hY3JvKHRyYXAsICJsbHZtLnRyYXAiLCBmdW5jdGlvblR5cGUo
dm9pZFR5cGUpKQorICAgIG1hY3JvKHRyYXAsICJsbHZtLnRyYXAiLCBmdW5jdGlvblR5cGUodm9p
ZFR5cGUpKSBcCisgICAgbWFjcm8oeDg2U1NFMkN2dFRTRDJTSSwgImxsdm0ueDg2LnNzZTIuY3Z0
dHNkMnNpIiwgZnVuY3Rpb25UeXBlKGludDMyLCB2ZWN0b3JUeXBlKGRvdWJsZVR5cGUsIDIpKSkK
IAogI2RlZmluZSBGT1JfRUFDSF9GVU5DVElPTl9UWVBFKG1hY3JvKSBcCiAgICAgbWFjcm8oQ19K
SVRPcGVyYXRpb25fRVN0LCBmdW5jdGlvblR5cGUoaW50UHRyLCBpbnRQdHIsIGludFB0cikpIFwK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMTG93ZXJERkdUb0xMVk0uY3BwCj09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMTG93ZXJERkdUb0xMVk0u
Y3BwCShyZXZpc2lvbiAxNjAxNTApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZnRsL0ZUTExv
d2VyREZHVG9MTFZNLmNwcAkod29ya2luZyBjb3B5KQpAQCAtMzAxMSwxNSArMzAxMSw0MSBAQCBw
cml2YXRlOgogICAgIAogICAgIExWYWx1ZSBkb3VibGVUb0ludDMyKExWYWx1ZSBkb3VibGVWYWx1
ZSkKICAgICB7CisgICAgICAgIGlmIChPdXRwdXQ6Omhhc1NlbnNpYmxlRG91YmxlVG9JbnQoKSkK
KyAgICAgICAgICAgIHJldHVybiBzZW5zaWJsZURvdWJsZVRvSW50MzIoZG91YmxlVmFsdWUpOwor
ICAgICAgICAKICAgICAgICAgZG91YmxlIGxpbWl0ID0gcG93KDIsIDMxKSAtIDE7CiAgICAgICAg
IHJldHVybiBkb3VibGVUb0ludDMyKGRvdWJsZVZhbHVlLCAtbGltaXQsIGxpbWl0KTsKICAgICB9
CiAgICAgCiAgICAgTFZhbHVlIGRvdWJsZVRvVUludDMyKExWYWx1ZSBkb3VibGVWYWx1ZSkKICAg
ICB7CisgICAgICAgIGlmIChPdXRwdXQ6Omhhc1NlbnNpYmxlRG91YmxlVG9JbnQoKSkKKyAgICAg
ICAgICAgIHJldHVybiBzZW5zaWJsZURvdWJsZVRvSW50MzIoZG91YmxlVmFsdWUpOworICAgICAg
ICAKICAgICAgICAgcmV0dXJuIGRvdWJsZVRvSW50MzIoZG91YmxlVmFsdWUsIDAsIHBvdygyLCAz
MikgLSAxLCBmYWxzZSk7CiAgICAgfQogICAgIAorICAgIExWYWx1ZSBzZW5zaWJsZURvdWJsZVRv
SW50MzIoTFZhbHVlIGRvdWJsZVZhbHVlKQorICAgIHsKKyAgICAgICAgTEJhc2ljQmxvY2sgc2xv
d1BhdGggPSBGVExfTkVXX0JMT0NLKG1fb3V0LCAoInNlbnNpYmxlIGRvdWJsZVRvSW50MzIgc2xv
dyBwYXRoIikpOworICAgICAgICBMQmFzaWNCbG9jayBjb250aW51YXRpb24gPSBGVExfTkVXX0JM
T0NLKG1fb3V0LCAoInNlbnNpYmxlIGRvdWJsZVRvSW50MzIgY29udGludWF0aW9uIikpOworICAg
ICAgICAKKyAgICAgICAgVmFsdWVGcm9tQmxvY2sgZmFzdFJlc3VsdCA9IG1fb3V0LmFuY2hvcigK
KyAgICAgICAgICAgIG1fb3V0LnNlbnNpYmxlRG91YmxlVG9JbnQoZG91YmxlVmFsdWUpKTsKKyAg
ICAgICAgbV9vdXQuYnJhbmNoKAorICAgICAgICAgICAgbV9vdXQuZXF1YWwoZmFzdFJlc3VsdC52
YWx1ZSgpLCBtX291dC5jb25zdEludDMyKDB4ODAwMDAwMDApKSwKKyAgICAgICAgICAgIHNsb3dQ
YXRoLCBjb250aW51YXRpb24pOworICAgICAgICAKKyAgICAgICAgTEJhc2ljQmxvY2sgbGFzdE5l
eHQgPSBtX291dC5hcHBlbmRUbyhzbG93UGF0aCwgY29udGludWF0aW9uKTsKKyAgICAgICAgVmFs
dWVGcm9tQmxvY2sgc2xvd1Jlc3VsdCA9IG1fb3V0LmFuY2hvcigKKyAgICAgICAgICAgIG1fb3V0
LmNhbGwobV9vdXQub3BlcmF0aW9uKHRvSW50MzIpLCBkb3VibGVWYWx1ZSkpOworICAgICAgICBt
X291dC5qdW1wKGNvbnRpbnVhdGlvbik7CisgICAgICAgIAorICAgICAgICBtX291dC5hcHBlbmRU
byhjb250aW51YXRpb24sIGxhc3ROZXh0KTsKKyAgICAgICAgcmV0dXJuIG1fb3V0LnBoaShtX291
dC5pbnQzMiwgZmFzdFJlc3VsdCwgc2xvd1Jlc3VsdCk7CisgICAgfQorICAgIAogICAgIHZvaWQg
c3BlY3VsYXRlQmFja3dhcmQoCiAgICAgICAgIEV4aXRLaW5kIGtpbmQsIEZvcm1hdHRlZFZhbHVl
IGxvd1ZhbHVlLCBOb2RlKiBoaWdoVmFsdWUsIExWYWx1ZSBmYWlsQ29uZGl0aW9uKQogICAgIHsK
SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9mdGwvRlRMT3V0cHV0LmgKPT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot
LS0gU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPdXRwdXQuaAkocmV2aXNpb24gMTYwMTUw
KQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2Z0bC9GVExPdXRwdXQuaAkod29ya2luZyBjb3B5
KQpAQCAtMTU0LDYgKzE1NCw4IEBAIHB1YmxpYzoKICAgICBMVmFsdWUgbFNocihMVmFsdWUgbGVm
dCwgTFZhbHVlIHJpZ2h0KSB7IHJldHVybiBidWlsZExTaHIobV9idWlsZGVyLCBsZWZ0LCByaWdo
dCk7IH0KICAgICBMVmFsdWUgYml0Tm90KExWYWx1ZSB2YWx1ZSkgeyByZXR1cm4gYnVpbGROb3Qo
bV9idWlsZGVyLCB2YWx1ZSk7IH0KICAgICAKKyAgICBMVmFsdWUgaW5zZXJ0RWxlbWVudChMVmFs
dWUgdmVjdG9yLCBMVmFsdWUgZWxlbWVudCwgTFZhbHVlIGluZGV4KSB7IHJldHVybiBidWlsZElu
c2VydEVsZW1lbnQobV9idWlsZGVyLCB2ZWN0b3IsIGVsZW1lbnQsIGluZGV4KTsgfQorICAgIAog
ICAgIExWYWx1ZSBhZGRXaXRoT3ZlcmZsb3czMihMVmFsdWUgbGVmdCwgTFZhbHVlIHJpZ2h0KQog
ICAgIHsKICAgICAgICAgcmV0dXJuIGNhbGwoYWRkV2l0aE92ZXJmbG93MzJJbnRyaW5zaWMoKSwg
bGVmdCwgcmlnaHQpOwpAQCAtMTgzLDYgKzE4NSwxNSBAQCBwdWJsaWM6CiAgICAgICAgIHJldHVy
biBjYWxsKGRvdWJsZUFic0ludHJpbnNpYygpLCB2YWx1ZSk7CiAgICAgfQogICAgIAorICAgIHN0
YXRpYyBib29sIGhhc1NlbnNpYmxlRG91YmxlVG9JbnQoKSB7IHJldHVybiBpc1g4NigpOyB9Cisg
ICAgTFZhbHVlIHNlbnNpYmxlRG91YmxlVG9JbnQoTFZhbHVlIHZhbHVlKQorICAgIHsKKyAgICAg
ICAgUkVMRUFTRV9BU1NFUlQoaXNYODYoKSk7CisgICAgICAgIHJldHVybiBjYWxsKAorICAgICAg
ICAgICAgeDg2U1NFMkN2dFRTRDJTSUludHJpbnNpYygpLAorICAgICAgICAgICAgaW5zZXJ0RWxl
bWVudChnZXRVbmRlZih2ZWN0b3JUeXBlKGRvdWJsZVR5cGUsIDIpKSwgdmFsdWUsIGludDMyWmVy
bykpOworICAgIH0KKyAgICAKICAgICBMVmFsdWUgc2lnbkV4dChMVmFsdWUgdmFsdWUsIExUeXBl
IHR5cGUpIHsgcmV0dXJuIGJ1aWxkU0V4dChtX2J1aWxkZXIsIHZhbHVlLCB0eXBlKTsgfQogICAg
IExWYWx1ZSB6ZXJvRXh0KExWYWx1ZSB2YWx1ZSwgTFR5cGUgdHlwZSkgeyByZXR1cm4gYnVpbGRa
RXh0KG1fYnVpbGRlciwgdmFsdWUsIHR5cGUpOyB9CiAgICAgTFZhbHVlIGZwVG9JbnQoTFZhbHVl
IHZhbHVlLCBMVHlwZSB0eXBlKSB7IHJldHVybiBidWlsZEZQVG9TSShtX2J1aWxkZXIsIHZhbHVl
LCB0eXBlKTsgfQpJbmRleDogTGF5b3V0VGVzdHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExh
eW91dFRlc3RzL0NoYW5nZUxvZwkocmV2aXNpb24gMTYwMTYwKQorKysgTGF5b3V0VGVzdHMvQ2hh
bmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMzEgQEAKKzIwMTMtMTItMDQgIEZpbGlw
IFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBGVEwgc2hvdWxkIHVzZSBjdnR0
c2Qyc2kgZGlyZWN0bHkgZm9yIGRvdWJsZS10by1pbnQzMiBjb252ZXJzaW9ucworICAgICAgICBo
dHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTI1Mjc1CisKKyAgICAgICAg
UmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAgICAgICAgKiBqcy9yZWdyZXNzL2RvdWJs
ZS10by1pbnQzMi10eXBlZC1hcnJheS1leHBlY3RlZC50eHQ6IEFkZGVkLgorICAgICAgICAqIGpz
L3JlZ3Jlc3MvZG91YmxlLXRvLWludDMyLXR5cGVkLWFycmF5LW5vLWlubGluZS1leHBlY3RlZC50
eHQ6IEFkZGVkLgorICAgICAgICAqIGpzL3JlZ3Jlc3MvZG91YmxlLXRvLWludDMyLXR5cGVkLWFy
cmF5LW5vLWlubGluZS5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2RvdWJsZS10
by1pbnQzMi10eXBlZC1hcnJheS5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2Rv
dWJsZS10by11aW50MzItdHlwZWQtYXJyYXktZXhwZWN0ZWQudHh0OiBBZGRlZC4KKyAgICAgICAg
KiBqcy9yZWdyZXNzL2RvdWJsZS10by11aW50MzItdHlwZWQtYXJyYXktbm8taW5saW5lLWV4cGVj
dGVkLnR4dDogQWRkZWQuCisgICAgICAgICoganMvcmVncmVzcy9kb3VibGUtdG8tdWludDMyLXR5
cGVkLWFycmF5LW5vLWlubGluZS5odG1sOiBBZGRlZC4KKyAgICAgICAgKiBqcy9yZWdyZXNzL2Rv
dWJsZS10by11aW50MzItdHlwZWQtYXJyYXkuaHRtbDogQWRkZWQuCisgICAgICAgICoganMvcmVn
cmVzcy9zY3JpcHQtdGVzdHMvZG91YmxlLXRvLWludDMyLXR5cGVkLWFycmF5LW5vLWlubGluZS5q
czogQWRkZWQuCisgICAgICAgIChmb28pOgorICAgICAgICAodGVzdCk6CisgICAgICAgICoganMv
cmVncmVzcy9zY3JpcHQtdGVzdHMvZG91YmxlLXRvLWludDMyLXR5cGVkLWFycmF5LmpzOiBBZGRl
ZC4KKyAgICAgICAgKGZvbyk6CisgICAgICAgICh0ZXN0KToKKyAgICAgICAgKiBqcy9yZWdyZXNz
L3NjcmlwdC10ZXN0cy9kb3VibGUtdG8tdWludDMyLXR5cGVkLWFycmF5LW5vLWlubGluZS5qczog
QWRkZWQuCisgICAgICAgIChmb28pOgorICAgICAgICAodGVzdCk6CisgICAgICAgICoganMvcmVn
cmVzcy9zY3JpcHQtdGVzdHMvZG91YmxlLXRvLXVpbnQzMi10eXBlZC1hcnJheS5qczogQWRkZWQu
CisgICAgICAgIChmb28pOgorICAgICAgICAodGVzdCk6CisKIDIwMTMtMTItMDQgIFNhbXVlbCBX
aGl0ZSAgPHNhbXVlbF93aGl0ZUBhcHBsZS5jb20+CiAKICAgICAgICAgTGF5b3V0IFRlc3QgcGxh
dGZvcm0vbWFjL2FjY2Vzc2liaWxpdHkvc2VhcmNoLXByZWRpY2F0ZS1lbGVtZW50LWNvdW50Lmh0
bWwgaXMgZmxha3kKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZG91YmxlLXRvLWludDMy
LXR5cGVkLWFycmF5LWV4cGVjdGVkLnR4dAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9y
ZWdyZXNzL2RvdWJsZS10by1pbnQzMi10eXBlZC1hcnJheS1leHBlY3RlZC50eHQJKHJldmlzaW9u
IDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2RvdWJsZS10by1pbnQzMi10eXBlZC1hcnJh
eS1leHBlY3RlZC50eHQJKHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMCBAQAorSlNSZWdyZXNz
L2RvdWJsZS10by1pbnQzMi10eXBlZC1hcnJheQorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUg
YSBzZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIu
CisKKworUEFTUyBubyBleGNlcHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBp
cyB0cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9k
b3VibGUtdG8taW50MzItdHlwZWQtYXJyYXktbm8taW5saW5lLWV4cGVjdGVkLnR4dAo9PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2RvdWJsZS10by1pbnQzMi10eXBlZC1hcnJh
eS1uby1pbmxpbmUtZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMv
cmVncmVzcy9kb3VibGUtdG8taW50MzItdHlwZWQtYXJyYXktbm8taW5saW5lLWV4cGVjdGVkLnR4
dAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDEwIEBACitKU1JlZ3Jlc3MvZG91YmxlLXRvLWlu
dDMyLXR5cGVkLWFycmF5LW5vLWlubGluZQorCitPbiBzdWNjZXNzLCB5b3Ugd2lsbCBzZWUgYSBz
ZXJpZXMgb2YgIlBBU1MiIG1lc3NhZ2VzLCBmb2xsb3dlZCBieSAiVEVTVCBDT01QTEVURSIuCisK
KworUEFTUyBubyBleGNlcHRpb24gdGhyb3duCitQQVNTIHN1Y2Nlc3NmdWxseVBhcnNlZCBpcyB0
cnVlCisKK1RFU1QgQ09NUExFVEUKKwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9kb3Vi
bGUtdG8taW50MzItdHlwZWQtYXJyYXktbm8taW5saW5lLmh0bWwKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5
b3V0VGVzdHMvanMvcmVncmVzcy9kb3VibGUtdG8taW50MzItdHlwZWQtYXJyYXktbm8taW5saW5l
Lmh0bWwJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2RvdWJsZS10by1p
bnQzMi10eXBlZC1hcnJheS1uby1pbmxpbmUuaHRtbAkod29ya2luZyBjb3B5KQpAQCAtMCwwICsx
LDEyIEBACis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MLy9FTiI+Cis8
aHRtbD4KKzxoZWFkPgorPHNjcmlwdCBzcmM9Ii4uLy4uL3Jlc291cmNlcy9qcy10ZXN0LXByZS5q
cyI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxzY3JpcHQgc3JjPSJyZXNvdXJjZXMvcmVn
cmVzcy1wcmUuanMiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9InNjcmlwdC10ZXN0cy9kb3VibGUt
dG8taW50MzItdHlwZWQtYXJyYXktbm8taW5saW5lLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3Jj
PSJyZXNvdXJjZXMvcmVncmVzcy1wb3N0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8u
Li9yZXNvdXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4K
SW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZG91YmxlLXRvLWludDMyLXR5cGVkLWFycmF5
Lmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9kb3VibGUtdG8taW50
MzItdHlwZWQtYXJyYXkuaHRtbAkocmV2aXNpb24gMCkKKysrIExheW91dFRlc3RzL2pzL3JlZ3Jl
c3MvZG91YmxlLXRvLWludDMyLXR5cGVkLWFycmF5Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAs
MCArMSwxMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4i
PgorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1w
cmUuanMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2Vz
L3JlZ3Jlc3MtcHJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVzdHMvZG91
YmxlLXRvLWludDMyLXR5cGVkLWFycmF5LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNv
dXJjZXMvcmVncmVzcy1wb3N0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNv
dXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6
IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZG91YmxlLXRvLXVpbnQzMi10eXBlZC1hcnJheS1leHBl
Y3RlZC50eHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9kb3VibGUtdG8t
dWludDMyLXR5cGVkLWFycmF5LWV4cGVjdGVkLnR4dAkocmV2aXNpb24gMCkKKysrIExheW91dFRl
c3RzL2pzL3JlZ3Jlc3MvZG91YmxlLXRvLXVpbnQzMi10eXBlZC1hcnJheS1leHBlY3RlZC50eHQJ
KHdvcmtpbmcgY29weSkKQEAgLTAsMCArMSwxMCBAQAorSlNSZWdyZXNzL2RvdWJsZS10by11aW50
MzItdHlwZWQtYXJyYXkKKworT24gc3VjY2VzcywgeW91IHdpbGwgc2VlIGEgc2VyaWVzIG9mICJQ
QVNTIiBtZXNzYWdlcywgZm9sbG93ZWQgYnkgIlRFU1QgQ09NUExFVEUiLgorCisKK1BBU1Mgbm8g
ZXhjZXB0aW9uIHRocm93bgorUEFTUyBzdWNjZXNzZnVsbHlQYXJzZWQgaXMgdHJ1ZQorCitURVNU
IENPTVBMRVRFCisKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZG91YmxlLXRvLXVpbnQz
Mi10eXBlZC1hcnJheS1uby1pbmxpbmUtZXhwZWN0ZWQudHh0Cj09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91
dFRlc3RzL2pzL3JlZ3Jlc3MvZG91YmxlLXRvLXVpbnQzMi10eXBlZC1hcnJheS1uby1pbmxpbmUt
ZXhwZWN0ZWQudHh0CShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9kb3Vi
bGUtdG8tdWludDMyLXR5cGVkLWFycmF5LW5vLWlubGluZS1leHBlY3RlZC50eHQJKHdvcmtpbmcg
Y29weSkKQEAgLTAsMCArMSwxMCBAQAorSlNSZWdyZXNzL2RvdWJsZS10by11aW50MzItdHlwZWQt
YXJyYXktbm8taW5saW5lCisKK09uIHN1Y2Nlc3MsIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiAi
UEFTUyIgbWVzc2FnZXMsIGZvbGxvd2VkIGJ5ICJURVNUIENPTVBMRVRFIi4KKworCitQQVNTIG5v
IGV4Y2VwdGlvbiB0aHJvd24KK1BBU1Mgc3VjY2Vzc2Z1bGx5UGFyc2VkIGlzIHRydWUKKworVEVT
VCBDT01QTEVURQorCkluZGV4OiBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL2RvdWJsZS10by11aW50
MzItdHlwZWQtYXJyYXktbm8taW5saW5lLmh0bWwKPT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gTGF5b3V0VGVzdHMv
anMvcmVncmVzcy9kb3VibGUtdG8tdWludDMyLXR5cGVkLWFycmF5LW5vLWlubGluZS5odG1sCShy
ZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9kb3VibGUtdG8tdWludDMyLXR5
cGVkLWFycmF5LW5vLWlubGluZS5odG1sCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMTIgQEAK
KzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vSUVURi8vRFREIEhUTUwvL0VOIj4KKzxodG1sPgor
PGhlYWQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3VyY2VzL2pzLXRlc3QtcHJlLmpzIj48L3Nj
cmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHNjcmlwdCBzcmM9InJlc291cmNlcy9yZWdyZXNzLXBy
ZS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0ic2NyaXB0LXRlc3RzL2RvdWJsZS10by11aW50
MzItdHlwZWQtYXJyYXktbm8taW5saW5lLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJyZXNv
dXJjZXMvcmVncmVzcy1wb3N0LmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNv
dXJjZXMvanMtdGVzdC1wb3N0LmpzIj48L3NjcmlwdD4KKzwvYm9keT4KKzwvaHRtbD4KSW5kZXg6
IExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZG91YmxlLXRvLXVpbnQzMi10eXBlZC1hcnJheS5odG1s
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3MvZG91YmxlLXRvLXVpbnQzMi10
eXBlZC1hcnJheS5odG1sCShyZXZpc2lvbiAwKQorKysgTGF5b3V0VGVzdHMvanMvcmVncmVzcy9k
b3VibGUtdG8tdWludDMyLXR5cGVkLWFycmF5Lmh0bWwJKHdvcmtpbmcgY29weSkKQEAgLTAsMCAr
MSwxMiBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9JRVRGLy9EVEQgSFRNTC8vRU4iPgor
PGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQgc3JjPSIuLi8uLi9yZXNvdXJjZXMvanMtdGVzdC1wcmUu
anMiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8c2NyaXB0IHNyYz0icmVzb3VyY2VzL3Jl
Z3Jlc3MtcHJlLmpzIj48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSJzY3JpcHQtdGVzdHMvZG91Ymxl
LXRvLXVpbnQzMi10eXBlZC1hcnJheS5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0icmVzb3Vy
Y2VzL3JlZ3Jlc3MtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iLi4vLi4vcmVzb3Vy
Y2VzL2pzLXRlc3QtcG9zdC5qcyI+PC9zY3JpcHQ+Cis8L2JvZHk+Cis8L2h0bWw+CkluZGV4OiBM
YXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9kb3VibGUtdG8taW50MzItdHlwZWQt
YXJyYXktbm8taW5saW5lLmpzCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mv
c2NyaXB0LXRlc3RzL2RvdWJsZS10by1pbnQzMi10eXBlZC1hcnJheS1uby1pbmxpbmUuanMJKHJl
dmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9kb3VibGUt
dG8taW50MzItdHlwZWQtYXJyYXktbm8taW5saW5lLmpzCSh3b3JraW5nIGNvcHkpCkBAIC0wLDAg
KzEsMjQgQEAKK3ZhciBhcnJheSA9IG5ldyBJbnQzMkFycmF5KDEpOworCitmdW5jdGlvbiBmb28o
dmFsdWUpIHsKKyAgICBhcnJheVswXSA9IHZhbHVlOworICAgIHJldHVybiBhcnJheVswXTsKK30K
Kworbm9JbmxpbmUoZm9vKTsKKworZnVuY3Rpb24gdGVzdChpbnB1dCwgb3V0cHV0KSB7CisgICAg
dmFyIHJlc3VsdCA9IGZvbyhpbnB1dCk7CisgICAgaWYgKHJlc3VsdCAhPSBvdXRwdXQpCisgICAg
ICAgIHRocm93ICJFcnJvcjogIiArIGlucHV0ICsgIiB3YXMgc3VwcG9zZWQgdG8gcmVzdWx0IGlu
ICIgKyBvdXRwdXQgKyAiIGJ1dCBpbnN0ZWFkIGdvdCAiICsgcmVzdWx0OworfQorCitmb3IgKHZh
ciBpID0gMDsgaSA8IDEwMDAwMDsgKytpKQorICAgIHRlc3QoaSArIDAuNSwgaSk7CisKK3Rlc3Qo
MCwgMCk7Cit0ZXN0KDEwMC41LCAxMDApOwordGVzdCgtMTAwLjUsIC0xMDApOwordGVzdCgzMDAw
MDAwMDAwLCAtMTI5NDk2NzI5Nik7Cit0ZXN0KC0zMDAwMDAwMDAwLCAxMjk0OTY3Mjk2KTsKK3Rl
c3QoLTIxNDc0ODM2NDgsIC0yMTQ3NDgzNjQ4KTsKSW5kZXg6IExheW91dFRlc3RzL2pzL3JlZ3Jl
c3Mvc2NyaXB0LXRlc3RzL2RvdWJsZS10by1pbnQzMi10eXBlZC1hcnJheS5qcwo9PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
Ci0tLSBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9kb3VibGUtdG8taW50MzIt
dHlwZWQtYXJyYXkuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9qcy9yZWdyZXNzL3Nj
cmlwdC10ZXN0cy9kb3VibGUtdG8taW50MzItdHlwZWQtYXJyYXkuanMJKHdvcmtpbmcgY29weSkK
QEAgLTAsMCArMSwyMiBAQAordmFyIGFycmF5ID0gbmV3IEludDMyQXJyYXkoMSk7CisKK2Z1bmN0
aW9uIGZvbyh2YWx1ZSkgeworICAgIGFycmF5WzBdID0gdmFsdWU7CisgICAgcmV0dXJuIGFycmF5
WzBdOworfQorCitmdW5jdGlvbiB0ZXN0KGlucHV0LCBvdXRwdXQpIHsKKyAgICB2YXIgcmVzdWx0
ID0gZm9vKGlucHV0KTsKKyAgICBpZiAocmVzdWx0ICE9IG91dHB1dCkKKyAgICAgICAgdGhyb3cg
IkVycm9yOiAiICsgaW5wdXQgKyAiIHdhcyBzdXBwb3NlZCB0byByZXN1bHQgaW4gIiArIG91dHB1
dCArICIgYnV0IGluc3RlYWQgZ290ICIgKyByZXN1bHQ7Cit9CisKK2ZvciAodmFyIGkgPSAwOyBp
IDwgMTAwMDAwOyArK2kpCisgICAgdGVzdChpICsgMC41LCBpKTsKKwordGVzdCgwLCAwKTsKK3Rl
c3QoMTAwLjUsIDEwMCk7Cit0ZXN0KC0xMDAuNSwgLTEwMCk7Cit0ZXN0KDMwMDAwMDAwMDAsIC0x
Mjk0OTY3Mjk2KTsKK3Rlc3QoLTMwMDAwMDAwMDAsIDEyOTQ5NjcyOTYpOwordGVzdCgtMjE0NzQ4
MzY0OCwgLTIxNDc0ODM2NDgpOwpJbmRleDogTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQt
dGVzdHMvZG91YmxlLXRvLXVpbnQzMi10eXBlZC1hcnJheS1uby1pbmxpbmUuanMKPT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PQotLS0gTGF5b3V0VGVzdHMvanMvcmVncmVzcy9zY3JpcHQtdGVzdHMvZG91YmxlLXRvLXVpbnQz
Mi10eXBlZC1hcnJheS1uby1pbmxpbmUuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9q
cy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9kb3VibGUtdG8tdWludDMyLXR5cGVkLWFycmF5LW5vLWlu
bGluZS5qcwkod29ya2luZyBjb3B5KQpAQCAtMCwwICsxLDI1IEBACit2YXIgYXJyYXkgPSBuZXcg
VWludDMyQXJyYXkoMSk7CisKK2Z1bmN0aW9uIGZvbyh2YWx1ZSkgeworICAgIGFycmF5WzBdID0g
dmFsdWU7CisgICAgcmV0dXJuIGFycmF5WzBdOworfQorCitub0lubGluZShmb28pOworCitmdW5j
dGlvbiB0ZXN0KGlucHV0LCBvdXRwdXQpIHsKKyAgICB2YXIgcmVzdWx0ID0gZm9vKGlucHV0KTsK
KyAgICBpZiAocmVzdWx0ICE9IG91dHB1dCkKKyAgICAgICAgdGhyb3cgIkVycm9yOiAiICsgaW5w
dXQgKyAiIHdhcyBzdXBwb3NlZCB0byByZXN1bHQgaW4gIiArIG91dHB1dCArICIgYnV0IGluc3Rl
YWQgZ290ICIgKyByZXN1bHQ7Cit9CisKK2ZvciAodmFyIGkgPSAwOyBpIDwgMTAwMDAwOyArK2kp
CisgICAgdGVzdChpICsgMC41LCBpKTsKKwordGVzdCgwLCAwKTsKK3Rlc3QoMTAwLjUsIDEwMCk7
Cit0ZXN0KC0xMDAuNSwgNDI5NDk2NzE5Nik7Cit0ZXN0KDMwMDAwMDAwMDAsIDMwMDAwMDAwMDAp
OwordGVzdCg2MDAwMDAwMDAwLCAxNzA1MDMyNzA0KTsKK3Rlc3QoLTMwMDAwMDAwMDAsIDEyOTQ5
NjcyOTYpOwordGVzdCgtMjE0NzQ4MzY0OCwgMjE0NzQ4MzY0OCk7CkluZGV4OiBMYXlvdXRUZXN0
cy9qcy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9kb3VibGUtdG8tdWludDMyLXR5cGVkLWFycmF5Lmpz
Cj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT0KLS0tIExheW91dFRlc3RzL2pzL3JlZ3Jlc3Mvc2NyaXB0LXRlc3RzL2RvdWJs
ZS10by11aW50MzItdHlwZWQtYXJyYXkuanMJKHJldmlzaW9uIDApCisrKyBMYXlvdXRUZXN0cy9q
cy9yZWdyZXNzL3NjcmlwdC10ZXN0cy9kb3VibGUtdG8tdWludDMyLXR5cGVkLWFycmF5LmpzCSh3
b3JraW5nIGNvcHkpCkBAIC0wLDAgKzEsMjMgQEAKK3ZhciBhcnJheSA9IG5ldyBVaW50MzJBcnJh
eSgxKTsKKworZnVuY3Rpb24gZm9vKHZhbHVlKSB7CisgICAgYXJyYXlbMF0gPSB2YWx1ZTsKKyAg
ICByZXR1cm4gYXJyYXlbMF07Cit9CisKK2Z1bmN0aW9uIHRlc3QoaW5wdXQsIG91dHB1dCkgewor
ICAgIHZhciByZXN1bHQgPSBmb28oaW5wdXQpOworICAgIGlmIChyZXN1bHQgIT0gb3V0cHV0KQor
ICAgICAgICB0aHJvdyAiRXJyb3I6ICIgKyBpbnB1dCArICIgd2FzIHN1cHBvc2VkIHRvIHJlc3Vs
dCBpbiAiICsgb3V0cHV0ICsgIiBidXQgaW5zdGVhZCBnb3QgIiArIHJlc3VsdDsKK30KKworZm9y
ICh2YXIgaSA9IDA7IGkgPCAxMDAwMDA7ICsraSkKKyAgICB0ZXN0KGkgKyAwLjUsIGkpOworCit0
ZXN0KDAsIDApOwordGVzdCgxMDAuNSwgMTAwKTsKK3Rlc3QoLTEwMC41LCA0Mjk0OTY3MTk2KTsK
K3Rlc3QoMzAwMDAwMDAwMCwgMzAwMDAwMDAwMCk7Cit0ZXN0KDYwMDAwMDAwMDAsIDE3MDUwMzI3
MDQpOwordGVzdCgtMzAwMDAwMDAwMCwgMTI5NDk2NzI5Nik7Cit0ZXN0KC0yMTQ3NDgzNjQ4LCAy
MTQ3NDgzNjQ4KTsK
</data>
<flag name="review"
          id="241932"
          type_id="1"
          status="+"
          setter="msaboff"
    />
          </attachment>
      

    </bug>

</bugzilla>