<?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>112988</bug_id>
          
          <creation_ts>2013-03-21 17:46:12 -0700</creation_ts>
          <short_desc>JSC profiler should have an at-a-glance report of the success of DFG optimization</short_desc>
          <delta_ts>2013-03-21 18:19:59 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>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>
          
          
          <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>oliver</cc>
    
    <cc>sam</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>860941</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-21 17:46:12 -0700</bug_when>
    <thetext>It should report the number of inlined GetByIds, PutByIds, and Calls in the DFG.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860943</commentid>
    <comment_count>1</comment_count>
      <attachid>194401</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-21 17:48:24 -0700</bug_when>
    <thetext>Created attachment 194401
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860944</commentid>
    <comment_count>2</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-21 17:48:43 -0700</bug_when>
    <thetext>Example output:

[pizlo@dethklok OpenSource] Tools/Scripts/display-profiler-output deltablue.profile 
          CodeBlock            #Instr  Source Counts    Machine Counts  #Compil  Inlines  #Exits  Recent Opts                        Source                        
                                          Base/DFG         Base/DFG             Src/Total           G/P/C/M  
         size#DCkJLC             24     67/18026927        67/51988        2      17/41      0      1/0/0/0   function () { return this.elms.length; }
          at#C3TUO6              21     67/14911927        67/44751        2      10/26      0      1/0/0/0   function (index) { return this.elms[index]; }
        output#CKTGff            56     884/13716222     884/2516778       4       4/9      314     1/0/0/0   function () { return (this.direction == Direction.FOR
         size#EJQJjM             33     67/12299927         67/895         2      7/13       0      3/0/1/0   function () { return this.v.size(); }
     constraintAt#BFWFPX         36     67/12159927         67/885         2      7/13       0      3/0/1/0   function (index) { return this.v.at(index); }
        execute#BrpnW7          104     865/12159042     865/1461301       2      5/12       0     12/0/6/0   function () { for (var i = 0; i &lt; this.size(); i++) {
         input#AMNJAd            56     437/11706680       437/342         3      5/10      201     1/0/0/0   function () { return (this.direction == Direction.FOR
        execute#CNoE25           66     78/10199927      78/10000039       2       2/2       0      9/1/2/0   function () { this.output().value = this.input().valu
          add#BAffrf             33      67/2342927        67/15589        2      17/41      0      2/0/1/0   function (elm) { this.elms.push(elm); }
        execute#ES9SmN          202     114/2321880      114/2321880       2       0/0       0     16/2/0/0   function () { if (this.direction == Direction.FORWARD
           #Bys3HT              153     801/1728495       801/12452        3       1/4      302    11/0/5/0   function (v, coll) { var determining = v.determinedBy
      isSatisfied#DcAQMs         33     301/1710694      301/1689320       3       2/4      101     1/0/0/0   function () { return this.direction != Direction.NONE
      removeFirst#DJ4I9h         33      67/1220927        67/16684        2       1/6       0      2/0/1/0   function () { return this.elms.pop(); }
        weaker#ARC9cl            25      67/1204927        67/1479         2       4/7       0      2/0/0/0   function (s1, s2) { return s1.strengthValue &gt; s2.stre
   OrderedCollection#CjbgyO      47      502/833592        502/1164        2      6/22      101     0/1/0/0   function OrderedCollection() { this.elms = new Array(
       weakestOf#BI04sI          44      67/803927          67/158         2       2/3       0      3/0/1/0   function (s1, s2) { return this.weaker(s1, s2) ? s1 :
     addPropagate#Aj89I2        233     9220/698975      9220/1105167      4       0/0       0     23/1/13/0  function (c, mark) { var todo = new OrderedCollection
       stronger#DVK8sV           25      67/707927         67/6625         2       1/8       0      2/0/0/0   function (s1, s2) { return s1.strengthValue &lt; s2.stre
     addConstraint#EVo2Xv        33      67/705927         67/2755         2      4/10       0      4/0/2/0   function (c) { this.constraints.add(c); }
        satisfy#A7Z1GK          241      693/508400       693/508400       3       0/0      67      2/2/0/0   function (mark) { this.chooseMethod(mark); if (!this.
      recalculate#BFdxSK        194      113/503881       113/503881       2       0/0       0     17/2/4/0   function () { var ihn = this.input(), out = this.outp
  removePropagateFrom#DUqg5Z    509     12517/400519     12517/400519      3       0/0      101    39/5/19/0  function (out) { out.determinedBy = null; out.walkStr
     chooseMethod#EmCrCd        550     1472/399722      1472/399722       4       0/0      302    32/1/5/0   function (mark) { if (this.v1.mark == mark) { this.di
      markInputs#Bt3d5o          36      299/400794       299/299901       3       1/1       1      1/1/1/0   function (mark) { this.input().mark = mark; }
        output#DWTxXW            15      67/336927        67/333040        2       1/1       0      1/0/0/0   function () { return this.myOutput; }
        newMark#DnukEw           26      67/310927        67/197170        2      8/10       0      1/1/0/0   function () { return ++this.currentMark; }
     addConstraint#BL4Fyw        33      67/306927         67/1489         2       1/1       0      4/0/2/0   function (c) { this.v.add(c); }
       makePlan#CwbrZK          273     1469/305438      1469/610876       2       0/0       0     27/4/16/0  function (sources) { var mark = this.newMark(); var p
      Constraint#AN1q13          15      319/305848        319/101         2      14/24     174     0/1/0/0   function Constraint(strength) { this.strength = stren
     addConstraint#AXuot7        47      300/305794       300/10138        3      14/24     101     3/1/2/0   function () { this.addToGraph(); planner.incrementalA
    incrementalAdd#AfRCV0        91      201/305873        201/3692        2      12/18      0      2/1/1/0   function (c) { var mark = this.newMark(); var overrid
       Variable#DRKHYr          122      101/302893       101/302893       2       0/0       0      1/8/1/0   function Variable(name, initialValue) { this.value = 
      inputsKnown#CXx5Vd         67      134/301860       134/301860       2       0/0       0      3/0/1/0   function (mark) { var i = this.input(); return i.mark
      recalculate#CMNQ9a        152      106/299888       106/299888       2       1/1       0     30/3/7/0   function () { var ihn = this.input(), out = this.outp
        remove#B0QTYU           142     1185/205753       1185/2482        2       2/2       0      6/0/1/0   function (elm) { var index = 0, skipped = 0; for (var
    markUnsatisfied#BRrDiL       32      848/200380       848/193746       4       1/1      336     1/0/0/0   function () { this.direction = Direction.NONE; }
      addToGraph#BFaSkU          86      353/199741       353/97149        3       2/3      101    11/0/6/0   function () { this.v1.addConstraint(this); this.v2.ad
   BinaryConstraint#AiYUrn      127      174/199892         174/73         2       2/4       0      6/5/4/0   function BinaryConstraint(var1, var2, strength) { Bin
        execute#AkCU8K           3       64/139930        64/139930        2       0/0       0      0/0/0/0   function () { // Edit constraints do nothing }
      isSatisfied#CPIBWT         15      301/134694       301/125878       3      6/12      101     1/0/0/0   function () { return this.satisfied; }
     chooseMethod#CHIPoh         93     4390/105006      4390/105006       6       0/0     1504     8/0/1/0   function (mark) { this.satisfied = (this.myOutput.mar
      addToGraph#BaFEGQ          42     1883/104712      1883/104712       5       0/0      703     6/0/3/0   function () { this.myOutput.addConstraint(this); this
      recalculate#AUYZp5        114     2154/104441      2154/104441       5       0/0      703     6/2/1/0   function () { this.myOutput.walkStrength = this.stren
    UnaryConstraint#AyJC8w      101      441/105927         441/73         2      9/18      375     6/3/4/0   function UnaryConstraint(v, strength) { UnaryConstrai
      markInputs#CKYAeP          3       64/105930        64/105930        2       0/0       0      0/0/0/0   function (mark) { // has no inputs }
        isInput#Bzw1mn           3       64/100930         64/98881        2       1/1       0      0/0/0/0   function () { return false; }
    StayConstraint#EJitEM        75      67/100927         67/2500         2       1/4       0      8/3/5/0   function StayConstraint(v, str) { StayConstraint.supe
      markInputs#BKEMak         122      101/100893       101/100893       2       0/0       0      7/3/2/0   function (mark) { ScaleConstraint.superConstructor.pr
        execute#BG8Smc           3       64/100930         64/1320         2       1/4       0      0/0/0/0   function () { // Stay constraints do nothing }
       chainTest#BRCzIm         326     12700/98198     12700/8817300      3       0/0       0     40/3/26/0  function chainTest(n) { planner = new Planner(); var 
      addToGraph#Ay1DPa         131      103/99891        103/99891        2       0/0       0     27/0/13/0  function () { ScaleConstraint.superConstructor.protot
    ScaleConstraint#B4nxgu      125      102/99892        102/99892        2       0/0       0      9/4/5/0   function ScaleConstraint(src, scale, offset, dest, st
  EqualityConstraint#DhTXTS      81       67/99927         67/2701         2       1/2       0     20/6/8/0   function EqualityConstraint(var1, var2, strength) { E
    projectionTest#EMOLLI       545     12078/97900      12078/886780      3       0/0       0    127/10/79/0 function projectionTest(n) { planner = new Planner();
        change#C6ERan           154      3661/36301       3661/71761       3       1/2       0     28/2/17/0  function change(v, newValue) { var edit = new EditCon
        isInput#AqNT7n           3        64/9930          64/5041         2       1/1       0      0/0/0/0   function () { return true; }
    markUnsatisfied#Bzjx03       15       300/5794         300/1907        3       1/1      101     0/0/0/0   function () { this.satisfied = false; }
           #DenAe5              193       106/4889         106/4889        2       0/0       0     13/1/8/0   function (constraints) { var sources = new OrderedCol
      inputsKnown#AqNT7n         3        64/4930          64/4930         2       0/0       0      0/0/0/0   function () { return true; }
    EditConstraint#DUrVIr        75       369/4927         369/1752        2      5/12       0      7/1/5/0   function EditConstraint(v, str) { EditConstraint.supe
         Plan#B5ZGol             36       19/4974            19/0          1       1/1       0      0/0/0/0   function Plan() { this.v = new OrderedCollection(); }
   incrementalRemove#DcbNld     261       108/3887        108/201201       2       0/0       0     29/3/10/0  function (c) { var out = c.output(); c.markUnsatisfie
    removeFromGraph#EBtMK9       54       67/3927          67/2070         2       1/1       0     12/2/3/0   function () { if (this.myOutput != null) this.myOutpu
   destroyConstraint#B8OrJM      73       67/3927           67/296         2      5/10       0      3/0/1/0   function () { if (this.isSatisfied()) planner.increme
   removeConstraint#CvIMm2       61       66/3927            66/0          1       2/2       0      0/0/0/0   function (c) { this.constraints.remove(c); if (this.d
      nextWeaker#ATSwLS         173       106/3887          106/0          1       1/1       0      0/0/0/0   function () { switch (this.strengthValue) { case 0: r
        Planner#AduH5W           19       42/1951            42/0          1       1/4       0      0/0/0/0   function Planner() { this.currentMark = 0; }
        jscRun#DUxbew            15        67/927           67/927         2       0/0       0      0/0/1/0   function jscRun() { deltaBlue(); }
       deltaBlue#DNE2LT          33        66/927            66/0          1       1/1       0      0/0/0/0   function deltaBlue() { chainTest(100); projectionTest
       &lt;global&gt;#EnIUXZ          120        906/0            906/0          1       0/0       0      0/0/0/0   load(&quot;/Volumes/Data/pizlo/primary/Internal/Tools/V8Ha
       Inheriter#EBoivL          10         0/0              0/0           0       0/0       0        N/A     function Inheriter() { }
     inheritsFrom#AGNDON         67         0/0              0/0           0       0/0       0        N/A     function (shuper) { function Inheriter() { } Inherite
       &lt;global&gt;#AOJHdh           6          0/0              0/0           0       0/0       0        N/A     function jscSetUp() { } function jscTearDown() { } fu
    BenchmarkSuite#Dk0K1c        69         0/0              0/0           0       0/0       0        N/A     function BenchmarkSuite(name, reference, benchmarks) 
       Benchmark#BkgIav          74         0/0              0/0           0       0/0       0        N/A     function Benchmark(name, run, setup, tearDown) { this
       &lt;global&gt;#EAxWiA          2016        0/0              0/0           0       0/0       0        N/A     // Copyright 2008 the V8 project authors. All rights 
           #AIjJVG               15         0/0              0/0           0       0/0       0        N/A     function () { var seed = 49734321; return function() 
       &lt;global&gt;#Ac5Ih0          295         0/0              0/0           0       0/0       0        N/A     // Copyright 2008 the V8 project authors. All rights 
       Strength#BVqzBD           28         0/0              0/0           1       0/0       0      0/0/0/0   function Strength(strengthValue, name) { this.strengt</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860955</commentid>
    <comment_count>3</comment_count>
      <attachid>194401</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2013-03-21 18:06:29 -0700</bug_when>
    <thetext>Comment on attachment 194401
the patch

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

What do we do with these numbers? Higher is better, but what we really want to know is how many calls/gets/etc. did we fail to optimize, and we can only know that with a number where lower is better, or if we display a total.

&gt; Source/JavaScriptCore/profiler/ProfilerCompilation.h:61
&gt; +    void noticeMiscInline() { m_numMiscInlines++; }

What&apos;s this for? It&apos;s unused. I just spent five minutes trying to figure out why the &quot;M&quot; column was always zero. Why do you torture me?

&gt; Tools/Scripts/display-profiler-output:537
&gt; +        print(&quot; &quot; + center(&quot;Recent Opts&quot;, recentOptsCols))

What does &quot;Recent&quot; mean here? Is it the last compilation? If so, can we call it &quot;Last Opts&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860958</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-21 18:10:30 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 194401 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=194401&amp;action=review
&gt; 
&gt; What do we do with these numbers? Higher is better, but what we really want to know is how many calls/gets/etc. did we fail to optimize, and we can only know that with a number where lower is better, or if we display a total.
&gt; 
&gt; &gt; Source/JavaScriptCore/profiler/ProfilerCompilation.h:61
&gt; &gt; +    void noticeMiscInline() { m_numMiscInlines++; }
&gt; 
&gt; What&apos;s this for? It&apos;s unused. I just spent five minutes trying to figure out why the &quot;M&quot; column was always zero. Why do you torture me?

:-(  Sorry about that.  I wanted to use it as a catch-all for weird things like the String.prototype.valueOf inlining.  But then I forgot to implement it.  It seemed to be good to have a catch-all for those because I thought we had a lot of them.

But now I think it&apos;s just dumb.  I&apos;ll apply the YAGNI rule and kill the misc thingy.

&gt; 
&gt; &gt; Tools/Scripts/display-profiler-output:537
&gt; &gt; +        print(&quot; &quot; + center(&quot;Recent Opts&quot;, recentOptsCols))
&gt; 
&gt; What does &quot;Recent&quot; mean here? Is it the last compilation? If so, can we call it &quot;Last Opts&quot;?

ggaren++, I like that better.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860959</commentid>
    <comment_count>5</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-21 18:13:37 -0700</bug_when>
    <thetext>(In reply to comment #3)
&gt; (From update of attachment 194401 [details])
&gt; View in context: https://bugs.webkit.org/attachment.cgi?id=194401&amp;action=review
&gt; 
&gt; What do we do with these numbers? Higher is better, but what we really want to know is how many calls/gets/etc. did we fail to optimize, and we can only know that with a number where lower is better, or if we display a total.

I like to do the following:

Baseline JSC:
jsc -p thingy.profile thingy.js

Modified JSC:
jsc -p thingy.profile thingy.js

And then compare:

Baseline JSC:
echo &quot;f&quot; | Tools/Scripts/display-profiler-output &gt; thingy.full

Modified JSC:
echo &quot;f&quot; | Tools/Scripts/display-profiler-output &gt; thingy.full

And then the goodness:

diff -u /path/to/baseline/thingy.full /path/to/modified/thingy.full

I&apos;ve used this for exits in the past and it&apos;s wonderful.  Now I&apos;m using it for inlines.

The downside of counting &quot;failures to inline&quot; is that there are two of them: ForceOSRExit and the slow path version that does matching and/or makes calls.  The downside of counting them is that it would clutter the &quot;full&quot; display.

I think it would be cool to add the totals at some point, but I just wanted to have the basic thing first so that I could do my evil diff trick for seeing why my patch was slowing things down.

&gt; 
&gt; &gt; Source/JavaScriptCore/profiler/ProfilerCompilation.h:61
&gt; &gt; +    void noticeMiscInline() { m_numMiscInlines++; }
&gt; 
&gt; What&apos;s this for? It&apos;s unused. I just spent five minutes trying to figure out why the &quot;M&quot; column was always zero. Why do you torture me?
&gt; 
&gt; &gt; Tools/Scripts/display-profiler-output:537
&gt; &gt; +        print(&quot; &quot; + center(&quot;Recent Opts&quot;, recentOptsCols))
&gt; 
&gt; What does &quot;Recent&quot; mean here? Is it the last compilation? If so, can we call it &quot;Last Opts&quot;?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>860963</commentid>
    <comment_count>6</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2013-03-21 18:19:59 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/146548</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>194401</attachid>
            <date>2013-03-21 17:48:24 -0700</date>
            <delta_ts>2013-03-21 18:06:29 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>blah.patch</filename>
            <type>text/plain</type>
            <size>11907</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gMTQ2NTQ2KQorKysgU291cmNl
L0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDI1IEBA
CisyMDEzLTAzLTIxICBGaWxpcCBQaXpsbyAgPGZwaXpsb0BhcHBsZS5jb20+CisKKyAgICAgICAg
SlNDIHByb2ZpbGVyIHNob3VsZCBoYXZlIGFuIGF0LWEtZ2xhbmNlIHJlcG9ydCBvZiB0aGUgc3Vj
Y2VzcyBvZiBERkcgb3B0aW1pemF0aW9uCisgICAgICAgIGh0dHBzOi8vYnVncy53ZWJraXQub3Jn
L3Nob3dfYnVnLmNnaT9pZD0xMTI5ODgKKworICAgICAgICBSZXZpZXdlZCBieSBOT0JPRFkgKE9P
UFMhKS4KKworICAgICAgICAqIGRmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHA6CisgICAgICAgIChK
U0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmhhbmRsZUNhbGwpOgorICAgICAgICAoSlNDOjpERkc6
OkJ5dGVDb2RlUGFyc2VyOjpoYW5kbGVHZXRCeUlkKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRl
Q29kZVBhcnNlcjo6cGFyc2VCbG9jayk6CisgICAgICAgICogcHJvZmlsZXIvUHJvZmlsZXJDb21w
aWxhdGlvbi5jcHA6CisgICAgICAgIChKU0M6OlByb2ZpbGVyOjpDb21waWxhdGlvbjo6Q29tcGls
YXRpb24pOgorICAgICAgICAoSlNDOjpQcm9maWxlcjo6Q29tcGlsYXRpb246OnRvSlMpOgorICAg
ICAgICAqIHByb2ZpbGVyL1Byb2ZpbGVyQ29tcGlsYXRpb24uaDoKKyAgICAgICAgKEpTQzo6UHJv
ZmlsZXI6OkNvbXBpbGF0aW9uOjpub3RpY2VJbmxpbmVkR2V0QnlJZCk6CisgICAgICAgIChKU0M6
OlByb2ZpbGVyOjpDb21waWxhdGlvbjo6bm90aWNlSW5saW5lZFB1dEJ5SWQpOgorICAgICAgICAo
SlNDOjpQcm9maWxlcjo6Q29tcGlsYXRpb246Om5vdGljZUlubGluZWRDYWxsKToKKyAgICAgICAg
KEpTQzo6UHJvZmlsZXI6OkNvbXBpbGF0aW9uOjpub3RpY2VNaXNjSW5saW5lKToKKyAgICAgICAg
KENvbXBpbGF0aW9uKToKKyAgICAgICAgKiBydW50aW1lL0NvbW1vbklkZW50aWZpZXJzLmg6CisK
IDIwMTMtMDMtMjEgIE1hcmsgTGFtICA8bWFyay5sYW1AYXBwbGUuY29tPgogCiAgICAgICAgIEZp
eCBsZXhlciBjaGFyUG9zaXRpb24gY29tcHV0YXRpb24gd2hlbiAicmV3aW5kImluZyB0aGUgbGV4
ZXIuCkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFyc2VyLmNw
cAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0J5dGVDb2RlUGFy
c2VyLmNwcAkocmV2aXNpb24gMTQ2MzgzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2RmZy9E
RkdCeXRlQ29kZVBhcnNlci5jcHAJKHdvcmtpbmcgY29weSkKQEAgLTEyMzAsMTAgKzEyMzAsMTUg
QEAgdm9pZCBCeXRlQ29kZVBhcnNlcjo6aGFuZGxlQ2FsbChJbnRlcnByZQogICAgICAgICAgICAg
Ly8gdGhlIGlucHV0cyBtdXN0IGJlIGtlcHQgYWxpdmUgd2hhdGV2ZXIgZXhpdHMgdGhlIGludHJp
bnNpYyBtYXkgZG8uCiAgICAgICAgICAgICBhZGRUb0dyYXBoKFBoYW50b20sIGNhbGxUYXJnZXQp
OwogICAgICAgICAgICAgZW1pdEFyZ3VtZW50UGhhbnRvbXMocmVnaXN0ZXJPZmZzZXQsIGFyZ3Vt
ZW50Q291bnRJbmNsdWRpbmdUaGlzLCBraW5kKTsKKyAgICAgICAgICAgIGlmIChtX2dyYXBoLm1f
Y29tcGlsYXRpb24pCisgICAgICAgICAgICAgICAgbV9ncmFwaC5tX2NvbXBpbGF0aW9uLT5ub3Rp
Y2VJbmxpbmVkQ2FsbCgpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgfSBl
bHNlIGlmIChoYW5kbGVJbmxpbmluZyh1c2VzUmVzdWx0LCBjYWxsVGFyZ2V0LCByZXN1bHRPcGVy
YW5kLCBjYWxsTGlua1N0YXR1cywgcmVnaXN0ZXJPZmZzZXQsIGFyZ3VtZW50Q291bnRJbmNsdWRp
bmdUaGlzLCBuZXh0T2Zmc2V0LCBraW5kKSkKKyAgICB9IGVsc2UgaWYgKGhhbmRsZUlubGluaW5n
KHVzZXNSZXN1bHQsIGNhbGxUYXJnZXQsIHJlc3VsdE9wZXJhbmQsIGNhbGxMaW5rU3RhdHVzLCBy
ZWdpc3Rlck9mZnNldCwgYXJndW1lbnRDb3VudEluY2x1ZGluZ1RoaXMsIG5leHRPZmZzZXQsIGtp
bmQpKSB7CisgICAgICAgIGlmIChtX2dyYXBoLm1fY29tcGlsYXRpb24pCisgICAgICAgICAgICBt
X2dyYXBoLm1fY29tcGlsYXRpb24tPm5vdGljZUlubGluZWRDYWxsKCk7CiAgICAgICAgIHJldHVy
bjsKKyAgICB9CiAgICAgCiAgICAgYWRkQ2FsbChpbnRlcnByZXRlciwgY3VycmVudEluc3RydWN0
aW9uLCBvcCk7CiB9CkBAIC0xNzE3LDYgKzE3MjIsOCBAQCB2b2lkIEJ5dGVDb2RlUGFyc2VyOjpo
YW5kbGVHZXRCeUlkKAogICAgIC8vIGV4ZWN1dGlvbiBpZiBpdCBkb2Vzbid0IGhhdmUgYSBwcmVk
aWN0aW9uLCBzbyB3ZSBkbyBpdCBtYW51YWxseS4KICAgICBpZiAocHJlZGljdGlvbiA9PSBTcGVj
Tm9uZSkKICAgICAgICAgYWRkVG9HcmFwaChGb3JjZU9TUkV4aXQpOworICAgIGVsc2UgaWYgKG1f
Z3JhcGgubV9jb21waWxhdGlvbikKKyAgICAgICAgbV9ncmFwaC5tX2NvbXBpbGF0aW9uLT5ub3Rp
Y2VJbmxpbmVkR2V0QnlJZCgpOwogICAgIAogICAgIE5vZGUqIG9yaWdpbmFsQmFzZUZvckJhc2Vs
aW5lSklUID0gYmFzZTsKICAgICAgICAgICAgICAgICAKQEAgLTI1OTUsOCArMjYwMiwxMSBAQCBi
b29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgICAgICAgICAg
bV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLAogICAgICAgICAgICAgICAgIG1fY3Vy
cmVudEluZGV4LAogICAgICAgICAgICAgICAgIG1fY29kZUJsb2NrLT5pZGVudGlmaWVyKGlkZW50
aWZpZXJOdW1iZXIpKTsKLSAgICAgICAgICAgIGlmICghcHV0QnlJZFN0YXR1cy5pc1NldCgpKQor
ICAgICAgICAgICAgYm9vbCBjYW5Db3VudEFzSW5saW5lZCA9IHRydWU7CisgICAgICAgICAgICBp
ZiAoIXB1dEJ5SWRTdGF0dXMuaXNTZXQoKSkgewogICAgICAgICAgICAgICAgIGFkZFRvR3JhcGgo
Rm9yY2VPU1JFeGl0KTsKKyAgICAgICAgICAgICAgICBjYW5Db3VudEFzSW5saW5lZCA9IGZhbHNl
OworICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBib29sIGhhc0V4aXRT
aXRlID0gbV9pbmxpbmVTdGFja1RvcC0+bV9leGl0UHJvZmlsZS5oYXNFeGl0U2l0ZShtX2N1cnJl
bnRJbmRleCwgQmFkQ2FjaGUpOwogICAgICAgICAgICAgCkBAIC0yNjg0LDcgKzI2OTQsMTEgQEAg
Ym9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgICAg
ICAgICBhZGRUb0dyYXBoKFB1dEJ5SWREaXJlY3QsIE9wSW5mbyhpZGVudGlmaWVyTnVtYmVyKSwg
YmFzZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAg
YWRkVG9HcmFwaChQdXRCeUlkLCBPcEluZm8oaWRlbnRpZmllck51bWJlciksIGJhc2UsIHZhbHVl
KTsKKyAgICAgICAgICAgICAgICBjYW5Db3VudEFzSW5saW5lZCA9IGZhbHNlOwogICAgICAgICAg
ICAgfQorICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoY2FuQ291bnRBc0lubGluZWQgJiYg
bV9ncmFwaC5tX2NvbXBpbGF0aW9uKQorICAgICAgICAgICAgICAgIG1fZ3JhcGgubV9jb21waWxh
dGlvbi0+bm90aWNlSW5saW5lZFB1dEJ5SWQoKTsKIAogICAgICAgICAgICAgTkVYVF9PUENPREUo
b3BfcHV0X2J5X2lkKTsKICAgICAgICAgfQpJbmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3By
b2ZpbGVyL1Byb2ZpbGVyQ29tcGlsYXRpb24uY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZh
U2NyaXB0Q29yZS9wcm9maWxlci9Qcm9maWxlckNvbXBpbGF0aW9uLmNwcAkocmV2aXNpb24gMTQ2
MzgzKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3Byb2ZpbGVyL1Byb2ZpbGVyQ29tcGlsYXRp
b24uY3BwCSh3b3JraW5nIGNvcHkpCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAo
QykgMjAxMiBBcHBsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgKEMp
IDIwMTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFJlZGlz
dHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0
aG91dAogICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZv
bGxvd2luZyBjb25kaXRpb25zCkBAIC0zNyw2ICszNywxMCBAQCBuYW1lc3BhY2UgSlNDIHsgbmFt
ZXNwYWNlIFByb2ZpbGVyIHsKIENvbXBpbGF0aW9uOjpDb21waWxhdGlvbihCeXRlY29kZXMqIGJ5
dGVjb2RlcywgQ29tcGlsYXRpb25LaW5kIGtpbmQpCiAgICAgOiBtX2J5dGVjb2RlcyhieXRlY29k
ZXMpCiAgICAgLCBtX2tpbmQoa2luZCkKKyAgICAsIG1fbnVtSW5saW5lZEdldEJ5SWRzKDApCisg
ICAgLCBtX251bUlubGluZWRQdXRCeUlkcygwKQorICAgICwgbV9udW1JbmxpbmVkQ2FsbHMoMCkK
KyAgICAsIG1fbnVtTWlzY0lubGluZXMoMCkKIHsKIH0KIApAQCAtMTI0LDYgKzEyOCwxMSBAQCBK
U1ZhbHVlIENvbXBpbGF0aW9uOjp0b0pTKEV4ZWNTdGF0ZSogZXhlCiAgICAgICAgIGV4aXRzLT5w
dXREaXJlY3RJbmRleChleGVjLCBpLCBtX29zckV4aXRzW2ldLnRvSlMoZXhlYykpOwogICAgIHJl
c3VsdC0+cHV0RGlyZWN0KGV4ZWMtPmdsb2JhbERhdGEoKSwgZXhlYy0+cHJvcGVydHlOYW1lcygp
Lm9zckV4aXRzLCBleGl0cyk7CiAgICAgCisgICAgcmVzdWx0LT5wdXREaXJlY3QoZXhlYy0+Z2xv
YmFsRGF0YSgpLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkubnVtSW5saW5lZEdldEJ5SWRzLCBqc051
bWJlcihtX251bUlubGluZWRHZXRCeUlkcykpOworICAgIHJlc3VsdC0+cHV0RGlyZWN0KGV4ZWMt
Pmdsb2JhbERhdGEoKSwgZXhlYy0+cHJvcGVydHlOYW1lcygpLm51bUlubGluZWRQdXRCeUlkcywg
anNOdW1iZXIobV9udW1JbmxpbmVkUHV0QnlJZHMpKTsKKyAgICByZXN1bHQtPnB1dERpcmVjdChl
eGVjLT5nbG9iYWxEYXRhKCksIGV4ZWMtPnByb3BlcnR5TmFtZXMoKS5udW1JbmxpbmVkQ2FsbHMs
IGpzTnVtYmVyKG1fbnVtSW5saW5lZENhbGxzKSk7CisgICAgcmVzdWx0LT5wdXREaXJlY3QoZXhl
Yy0+Z2xvYmFsRGF0YSgpLCBleGVjLT5wcm9wZXJ0eU5hbWVzKCkubnVtTWlzY0lubGluZXMsIGpz
TnVtYmVyKG1fbnVtTWlzY0lubGluZXMpKTsKKyAgICAKICAgICByZXR1cm4gcmVzdWx0OwogfQog
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcHJvZmlsZXIvUHJvZmlsZXJDb21waWxhdGlv
bi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9wcm9maWxlci9Qcm9maWxl
ckNvbXBpbGF0aW9uLmgJKHJldmlzaW9uIDE0NjM4MykKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9wcm9maWxlci9Qcm9maWxlckNvbXBpbGF0aW9uLmgJKHdvcmtpbmcgY29weSkKQEAgLTEsNSAr
MSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDEyIEFwcGxlIEluYy4gQWxsIHJpZ2h0cyBy
ZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAxMiwgMjAxMyBBcHBsZSBJbmMuIEFsbCByaWdo
dHMgcmVzZXJ2ZWQuCiAgKgogICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5k
IGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJt
aXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKQEAgLTU1LDYgKzU1
LDExIEBAIHB1YmxpYzoKICAgICB1bnNpZ25lZCBwcm9maWxlZEJ5dGVjb2Rlc1NpemUoKSBjb25z
dCB7IHJldHVybiBtX3Byb2ZpbGVkQnl0ZWNvZGVzLnNpemUoKTsgfQogICAgIGNvbnN0IFByb2Zp
bGVkQnl0ZWNvZGVzJiBwcm9maWxlZEJ5dGVjb2Rlc0F0KHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0
dXJuIG1fcHJvZmlsZWRCeXRlY29kZXNbaV07IH0KICAgICAKKyAgICB2b2lkIG5vdGljZUlubGlu
ZWRHZXRCeUlkKCkgeyBtX251bUlubGluZWRHZXRCeUlkcysrOyB9CisgICAgdm9pZCBub3RpY2VJ
bmxpbmVkUHV0QnlJZCgpIHsgbV9udW1JbmxpbmVkUHV0QnlJZHMrKzsgfQorICAgIHZvaWQgbm90
aWNlSW5saW5lZENhbGwoKSB7IG1fbnVtSW5saW5lZENhbGxzKys7IH0KKyAgICB2b2lkIG5vdGlj
ZU1pc2NJbmxpbmUoKSB7IG1fbnVtTWlzY0lubGluZXMrKzsgfQorICAgIAogICAgIEJ5dGVjb2Rl
cyogYnl0ZWNvZGVzKCkgY29uc3QgeyByZXR1cm4gbV9ieXRlY29kZXM7IH0KICAgICBDb21waWxh
dGlvbktpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIG1fa2luZDsgfQogICAgIApAQCAtNzMsNiAr
NzgsMTAgQEAgcHJpdmF0ZToKICAgICBIYXNoTWFwPE9yaWdpblN0YWNrLCBPd25QdHI8RXhlY3V0
aW9uQ291bnRlcj4gPiBtX2NvdW50ZXJzOwogICAgIFZlY3RvcjxPU1JFeGl0U2l0ZT4gbV9vc3JF
eGl0U2l0ZXM7CiAgICAgU2VnbWVudGVkVmVjdG9yPE9TUkV4aXQ+IG1fb3NyRXhpdHM7CisgICAg
dW5zaWduZWQgbV9udW1JbmxpbmVkR2V0QnlJZHM7CisgICAgdW5zaWduZWQgbV9udW1JbmxpbmVk
UHV0QnlJZHM7CisgICAgdW5zaWduZWQgbV9udW1JbmxpbmVkQ2FsbHM7CisgICAgdW5zaWduZWQg
bV9udW1NaXNjSW5saW5lczsKIH07CiAKIH0gfSAvLyBuYW1lc3BhY2UgSlNDOjpQcm9maWxlcgpJ
bmRleDogU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvQ29tbW9uSWRlbnRpZmllcnMuaAo9
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9Db21tb25JZGVudGlm
aWVycy5oCShyZXZpc2lvbiAxNDYzODMpCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9Db21tb25JZGVudGlmaWVycy5oCSh3b3JraW5nIGNvcHkpCkBAIC03Myw2ICs3MywxMCBAQAog
ICAgIG1hY3JvKG11bHRpbGluZSkgXAogICAgIG1hY3JvKG5hbWUpIFwKICAgICBtYWNybyhub3cp
IFwKKyAgICBtYWNybyhudW1JbmxpbmVkR2V0QnlJZHMpIFwKKyAgICBtYWNybyhudW1JbmxpbmVk
UHV0QnlJZHMpIFwKKyAgICBtYWNybyhudW1JbmxpbmVkQ2FsbHMpIFwKKyAgICBtYWNybyhudW1N
aXNjSW5saW5lcykgXAogICAgIG1hY3JvKE9iamVjdCkgXAogICAgIG1hY3JvKG9wY29kZSkgXAog
ICAgIG1hY3JvKG9yaWdpbikgXApJbmRleDogVG9vbHMvQ2hhbmdlTG9nCj09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t
IFRvb2xzL0NoYW5nZUxvZwkocmV2aXNpb24gMTQ2NTQ2KQorKysgVG9vbHMvQ2hhbmdlTG9nCSh3
b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsMTIgQEAKKzIwMTMtMDMtMjEgIEZpbGlwIFBpemxvICA8
ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBKU0MgcHJvZmlsZXIgc2hvdWxkIGhhdmUgYW4g
YXQtYS1nbGFuY2UgcmVwb3J0IG9mIHRoZSBzdWNjZXNzIG9mIERGRyBvcHRpbWl6YXRpb24KKyAg
ICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTExMjk4OAorCisg
ICAgICAgIFJldmlld2VkIGJ5IE5PQk9EWSAoT09QUyEpLgorCisgICAgICAgICogU2NyaXB0cy9k
aXNwbGF5LXByb2ZpbGVyLW91dHB1dDoKKwogMjAxMy0wMy0yMSAgRGlyayBQcmFua2UgIDxkcHJh
bmtlQGNocm9taXVtLm9yZz4KIAogICAgICAgICBbY2hyb21pdW1dIExpbnV4IEFTQU4gV2ViS2l0
IGNhbmFyeSBpcyBydW5uaW5nIG91dCBvZiBtZW1vcnkKSW5kZXg6IFRvb2xzL1NjcmlwdHMvZGlz
cGxheS1wcm9maWxlci1vdXRwdXQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gVG9vbHMvU2NyaXB0cy9kaXNwbGF5
LXByb2ZpbGVyLW91dHB1dAkocmV2aXNpb24gMTQ2MzgzKQorKysgVG9vbHMvU2NyaXB0cy9kaXNw
bGF5LXByb2ZpbGVyLW91dHB1dAkod29ya2luZyBjb3B5KQpAQCAtMSw2ICsxLDYgQEAKICMhL3Vz
ci9iaW4vZW52IHJ1YnkKIAotIyBDb3B5cmlnaHQgKEMpIDIwMTIgQXBwbGUgSW5jLiBBbGwgcmln
aHRzIHJlc2VydmVkLgorIyBDb3B5cmlnaHQgKEMpIDIwMTIsIDIwMTMgQXBwbGUgSW5jLiBBbGwg
cmlnaHRzIHJlc2VydmVkLgogIwogIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh
bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICMgbW9kaWZpY2F0aW9uLCBhcmUgcGVy
bWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCkBAIC0zMjUsNyAr
MzI1LDkgQEAgY2xhc3MgT1NSRXhpdAogZW5kCiAKIGNsYXNzIENvbXBpbGF0aW9uCi0gICAgYXR0
cl9hY2Nlc3NvciA6Ynl0ZWNvZGUsIDplbmdpbmUsIDpkZXNjcmlwdGlvbnMsIDpjb3VudGVycywg
OmNvbXBpbGF0aW9uSW5kZXgsIDpvc3JFeGl0cywgOnByb2ZpbGVkQnl0ZWNvZGVzCisgICAgYXR0
cl9hY2Nlc3NvciA6Ynl0ZWNvZGUsIDplbmdpbmUsIDpkZXNjcmlwdGlvbnMsIDpjb3VudGVycywg
OmNvbXBpbGF0aW9uSW5kZXgKKyAgICBhdHRyX2FjY2Vzc29yIDpvc3JFeGl0cywgOnByb2ZpbGVk
Qnl0ZWNvZGVzLCA6bnVtSW5saW5lZEdldEJ5SWRzLCA6bnVtSW5saW5lZFB1dEJ5SWRzCisgICAg
YXR0cl9hY2Nlc3NvciA6bnVtSW5saW5lZENhbGxzLCA6bnVtTWlzY0lubGluZXMKICAgICAKICAg
ICBkZWYgaW5pdGlhbGl6ZShqc29uKQogICAgICAgICBAYnl0ZWNvZGUgPSAkYnl0ZWNvZGVzW2pz
b25bImJ5dGVjb2Rlc0lEIl0udG9faV0KQEAgLTM3NSw2ICszNzcsMTAgQEAgY2xhc3MgQ29tcGls
YXRpb24KICAgICAgICAgICAgIHwgc3ViSnNvbiB8CiAgICAgICAgICAgICBAcHJvZmlsZWRCeXRl
Y29kZXMgPDwgUHJvZmlsZWRCeXRlY29kZXMubmV3KHN1Ykpzb24pCiAgICAgICAgIH0KKyAgICAg
ICAgQG51bUlubGluZWRHZXRCeUlkcyA9IGpzb25bIm51bUlubGluZWRHZXRCeUlkcyJdCisgICAg
ICAgIEBudW1JbmxpbmVkUHV0QnlJZHMgPSBqc29uWyJudW1JbmxpbmVkUHV0QnlJZHMiXQorICAg
ICAgICBAbnVtSW5saW5lZENhbGxzID0ganNvblsibnVtSW5saW5lZENhbGxzIl0KKyAgICAgICAg
QG51bU1pc2NJbmxpbmVzID0ganNvblsibnVtTWlzY0lubGluZXMiXQogICAgIGVuZAogICAgIAog
ICAgIGRlZiBjb3VudGVyKG9yaWdpbikKQEAgLTUwNyw2ICs1MTMsOSBAQCBkZWYgc3VtbWFyeSht
b2RlKQogICAgICAgICAKICAgICAgICAgZXhpdENvdW50Q29scyA9IDcKICAgICAgICAgcmVtYWlu
aW5nIC09IGV4aXRDb3VudENvbHMgKyAxCisgICAgICAgIAorICAgICAgICByZWNlbnRPcHRzQ29s
cyA9IDExCisgICAgICAgIHJlbWFpbmluZyAtPSByZWNlbnRPcHRzQ29scyArIDEKICAgICBlbmQK
ICAgICAKICAgICBpZiByZW1haW5pbmcgPiAwCkBAIC01MjUsNiArNTM0LDcgQEAgZGVmIHN1bW1h
cnkobW9kZSkKICAgICAgICAgcHJpbnQoIiAiICsgY2VudGVyKCIjQ29tcGlsIiwgY29tcGlsYXRp
b25zQ29scykpCiAgICAgICAgIHByaW50KCIgIiArIGNlbnRlcigiSW5saW5lcyIsIGlubGluZXND
b2xzKSkKICAgICAgICAgcHJpbnQoIiAiICsgY2VudGVyKCIjRXhpdHMiLCBleGl0Q291bnRDb2xz
KSkKKyAgICAgICAgcHJpbnQoIiAiICsgY2VudGVyKCJSZWNlbnQgT3B0cyIsIHJlY2VudE9wdHND
b2xzKSkKICAgICBlbmQKICAgICBpZiBzb3VyY2VDb2xzCiAgICAgICAgIHByaW50KCIgIiArIGNl
bnRlcigiU291cmNlIiwgc291cmNlQ29scykpCkBAIC01NDAsNiArNTUwLDggQEAgZGVmIHN1bW1h
cnkobW9kZSkKICAgICAgICAgcHJpbnQoIiAiICsgY2VudGVyKCJCYXNlL0RGRyIsIG1hY2hpbmVD
b3VudENvbHMpKQogICAgICAgICBwcmludCgiICIgKyAoIiAiICogY29tcGlsYXRpb25zQ29scykp
CiAgICAgICAgIHByaW50KCIgIiArIGNlbnRlcigiU3JjL1RvdGFsIiwgaW5saW5lc0NvbHMpKQor
ICAgICAgICBwcmludCgiICIgKyAoIiAiICogZXhpdENvdW50Q29scykpCisgICAgICAgIHByaW50
KCIgIiArIGNlbnRlcigiRy9QL0MvTSIsIHJlY2VudE9wdHNDb2xzKSkKICAgICBlbmQKICAgICBw
dXRzCiAgICAgJGJ5dGVjb2Rlcy5zb3J0IHsKQEAgLTU2NCw2ICs1NzYsMTYgQEAgZGVmIHN1bW1h
cnkobW9kZSkKICAgICAgICAgICAgIHByaW50KCIgIiArIGNlbnRlcihieXRlY29kZS5jb21waWxh
dGlvbnMuc2l6ZS50b19zLCBjb21waWxhdGlvbnNDb2xzKSkKICAgICAgICAgICAgIHByaW50KCIg
IiArIGNlbnRlcihieXRlY29kZS5zb3VyY2VNYWNoaW5lSW5saW5lU2l0ZXMudG9fcyArICIvIiAr
IGJ5dGVjb2RlLnRvdGFsTWFjaGluZUlubGluZVNpdGVzLnRvX3MsIGlubGluZXNDb2xzKSkKICAg
ICAgICAgICAgIHByaW50KCIgIiArIGNlbnRlcihieXRlY29kZS50b3RhbEV4aXRDb3VudC50b19z
LCBleGl0Q291bnRDb2xzKSkKKyAgICAgICAgICAgIGxhc3RDb21waWxhdGlvbiA9IGJ5dGVjb2Rl
LmNvbXBpbGF0aW9uc1stMV0KKyAgICAgICAgICAgIGlmIGxhc3RDb21waWxhdGlvbgorICAgICAg
ICAgICAgICAgIG9wdERhdGEgPSBbbGFzdENvbXBpbGF0aW9uLm51bUlubGluZWRHZXRCeUlkcywK
KyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RDb21waWxhdGlvbi5udW1JbmxpbmVkUHV0
QnlJZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Q29tcGlsYXRpb24ubnVtSW5s
aW5lZENhbGxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENvbXBpbGF0aW9uLm51
bU1pc2NJbmxpbmVzXQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIG9wdERhdGEg
PSBbIk4vQSJdCisgICAgICAgICAgICBlbmQKKyAgICAgICAgICAgIHByaW50KCIgIiArIGNlbnRl
cihvcHREYXRhLmpvaW4oJy8nKSwgcmVjZW50T3B0c0NvbHMpKQogICAgICAgICBlbmQKICAgICAg
ICAgaWYgc291cmNlQ29scwogICAgICAgICAgICAgcHJpbnQoIiAiICsgc291cmNlT25PbmVMaW5l
KGJ5dGVjb2RlLnNvdXJjZSwgc291cmNlQ29scykpCkBAIC04MjYsNiArODQ4LDcgQEAgZGVmIGV4
ZWN1dGVDb21tYW5kKCpjb21tYW5kQXJyYXkpCiAgICAgICAgICAgICBlbmQKICAgICAgICAgICAg
IAogICAgICAgICAgICAgcHV0cygiQ29tcGlsYXRpb24gI3tjb21waWxhdGlvbn06IikKKyAgICAg
ICAgICAgIHB1dHMoIiAgICBOdW0gaW5saW5lZDogR2V0QnlJZHM6ICN7Y29tcGlsYXRpb24ubnVt
SW5saW5lZEdldEJ5SWRzfSAgUHV0QnlJZHM6ICN7Y29tcGlsYXRpb24ubnVtSW5saW5lZFB1dEJ5
SWRzfSAgQ2FsbHM6ICN7Y29tcGlsYXRpb24ubnVtSW5saW5lZENhbGxzfSAgTWlzYzogI3tjb21w
aWxhdGlvbi5udW1NaXNjSW5saW5lc30iKQogICAgICAgICAgICAgcHV0cyhjZW50ZXIoIkFjdHVh
bCBDb3VudHMiLCBhY3R1YWxDb3VudENvbHMpICsgIiAiICsgY2VudGVyKCJTb3VyY2UgQ291bnRz
Iiwgc291cmNlQ291bnRDb2xzKSArICIgIiArIGNlbnRlcigiRGlzYXNzZW1ibHkgaW4gI3tjb21w
aWxhdGlvbi5lbmdpbmV9Iiwgc2NyZWVuV2lkdGggLSAxIC0gc291cmNlQ291bnRDb2xzIC0gMSAt
IGFjdHVhbENvdW50Q29scykpCiAgICAgICAgICAgICBwdXRzKCgiICIgKiBhY3R1YWxDb3VudENv
bHMpICsgIiAiICsgY2VudGVyKCJCYXNlL0RGRyIsIHNvdXJjZUNvdW50Q29scykpCiAK
</data>
<flag name="review"
          id="216162"
          type_id="1"
          status="+"
          setter="ggaren"
    />
          </attachment>
      

    </bug>

</bugzilla>