<?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>70278</bug_id>
          
          <creation_ts>2011-10-17 15:46:25 -0700</creation_ts>
          <short_desc>DFG bytecode parser should understand inline stacks</short_desc>
          <delta_ts>2011-10-17 16:54:28 -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>
          
          <blocked>69996</blocked>
          <everconfirmed>1</everconfirmed>
          <reporter name="Filip Pizlo">fpizlo</reporter>
          <assigned_to name="Nobody">webkit-unassigned</assigned_to>
          <cc>webkit.review.bot</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>485571</commentid>
    <comment_count>0</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-17 15:46:25 -0700</bug_when>
    <thetext>The lowest-overhead way to do inlining is to have it occur on-the-fly as part of bytecode parsing.  The parser will simply switch from parsing the original code block to the code block being inlined.  This requires having a notion of an inline stack in the parser, and the ability to remap operand according to the meta-data in the inline stack.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>485580</commentid>
    <comment_count>1</comment_count>
      <attachid>111337</attachid>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-17 15:57:24 -0700</bug_when>
    <thetext>Created attachment 111337
the patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>485584</commentid>
    <comment_count>2</comment_count>
    <who name="WebKit Review Bot">webkit.review.bot</who>
    <bug_when>2011-10-17 15:59:08 -0700</bug_when>
    <thetext>Attachment 111337 did not pass style-queue:

Failed to run &quot;[&apos;Tools/Scripts/update-webkit&apos;, &apos;--chromium&apos;]&quot; exit_code: 2

Updating OpenSource
From git://git.webkit.org/WebKit
   11b4b08..e267723  master     -&gt; origin/master
	D	LayoutTests/fast/writing-mode/borders-expected.html
	D	LayoutTests/fast/writing-mode/borders.html
	M	LayoutTests/ChangeLog
	M	Source/WebCore/ChangeLog
	M	Source/WebCore/rendering/RenderBlock.cpp
W: -empty_dir: trunk/LayoutTests/fast/writing-mode/borders-expected.html
W: -empty_dir: trunk/LayoutTests/fast/writing-mode/borders.html
r97661 = 37e4051614e94ab874cbe577a72eda95cbcfda20 (refs/remotes/trunk)
	M	LayoutTests/platform/mac/fast/table/028-vertical-expected.png
	M	LayoutTests/platform/mac/fast/table/028-vertical-expected.txt
	M	LayoutTests/platform/mac/fast/table/height-percent-test-vertical-expected.png
	M	LayoutTests/platform/mac/fast/table/height-percent-test-vertical-expected.txt
	M	LayoutTests/platform/mac/fast/backgrounds/background-leakage-transforms-expected.txt
	M	LayoutTests/platform/mac/fast/writing-mode/fallback-orientation-expected.txt
	M	LayoutTests/ChangeLog
	M	Source/WebCore/ChangeLog
	M	Source/WebCore/rendering/RenderBox.cpp
r97662 = e267723a03ccda5733d1d2e3c9f19ca60337f019 (refs/remotes/trunk)
First, rewinding head to replay your work on top of it...
Fast-forwarded master to refs/remotes/trunk.
Updating chromium port dependencies using gclient...
Error: Can&apos;t switch the checkout to http://v8.googlecode.com/svn/branches/3.6@9637; UUID don&apos;t match and there is local changes in /mnt/git/webkit-style-queue/Source/WebKit/chromium/v8. Delete the directory and try again.
Re-trying &apos;depot_tools/gclient sync&apos;
Error: Can&apos;t switch the checkout to http://v8.googlecode.com/svn/branches/3.6@9637; UUID don&apos;t match and there is local changes in /mnt/git/webkit-style-queue/Source/WebKit/chromium/v8. Delete the directory and try again.
Re-trying &apos;depot_tools/gclient sync&apos;
Error: Can&apos;t switch the checkout to http://v8.googlecode.com/svn/branches/3.6@9637; UUID don&apos;t match and there is local changes in /mnt/git/webkit-style-queue/Source/WebKit/chromium/v8. Delete the directory and try again.
Error: &apos;depot_tools/gclient sync&apos; failed 3 tries and returned 256 at Tools/Scripts/update-webkit-chromium line 107.
Re-trying &apos;depot_tools/gclient sync&apos;
No such file or directory at Tools/Scripts/update-webkit line 104.


If any of these errors are false positives, please file a bug against check-webkit-style.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>485590</commentid>
    <comment_count>3</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-17 16:03:05 -0700</bug_when>
    <thetext>This seems performance-neutral so far.



Benchmark report for SunSpider, V8, and Kraken.

VMs tested:
&quot;TipOfTree&quot; at /Volumes/Data/pizlo/OpenSource/WebKitBuild/Release/jsc
&quot;InlineStack&quot; at /Volumes/Data/pizlo/septenary/OpenSource/WebKitBuild/Release/jsc

Collected 12 samples per benchmark/VM, with 4 VM invocations per benchmark. Used 1 benchmark iteration per VM
invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level timing. Reporting
benchmark execution times with 95% confidence intervals in milliseconds.

                                            TipOfTree              InlineStack                                   
SunSpider:
   3d-cube                                7.2205+-0.1513    ?     7.2677+-0.2177       ?
   3d-morph                               7.5988+-0.0636    !     7.8181+-0.1492       ! definitely 1.0289x slower
   3d-raytrace                            7.4270+-0.2080          7.4245+-0.1597       
   access-binary-trees                    1.8440+-0.0969          1.6934+-0.0679         might be 1.0889x faster
   access-fannkuch                        6.3934+-0.1075          6.2947+-0.0921         might be 1.0157x faster
   access-nbody                           3.2616+-0.0681    ?     3.3369+-0.0850       ? might be 1.0231x slower
   access-nsieve                          2.6203+-0.0732          2.5963+-0.0808       
   bitops-3bit-bits-in-byte               1.7243+-0.0400    ?     1.7362+-0.0295       ?
   bitops-bits-in-byte                    2.7257+-0.0612    ?     2.7913+-0.0787       ? might be 1.0241x slower
   bitops-bitwise-and                     3.4017+-0.1555          3.3368+-0.1267         might be 1.0195x faster
   bitops-nsieve-bits                     5.2809+-0.1064    ?     5.4964+-0.1392       ? might be 1.0408x slower
   controlflow-recursive                  2.1204+-0.0597    ?     2.1476+-0.0552       ? might be 1.0128x slower
   crypto-aes                             6.7542+-0.1925          6.6802+-0.1621         might be 1.0111x faster
   crypto-md5                             2.8105+-0.0872          2.7963+-0.0890       
   crypto-sha1                            2.5244+-0.0795    ?     2.5391+-0.0825       ?
   date-format-tofte                     10.2752+-0.2823          9.9658+-0.2151         might be 1.0310x faster
   date-format-xparb                      8.9344+-0.2005          8.6349+-0.1990         might be 1.0347x faster
   math-cordic                            6.5539+-0.1290          6.4514+-0.1097         might be 1.0159x faster
   math-partial-sums                      7.6067+-0.1294    ?     7.8538+-0.3118       ? might be 1.0325x slower
   math-spectral-norm                     2.8247+-0.0407    ?     2.8671+-0.0506       ? might be 1.0150x slower
   regexp-dna                            10.7199+-0.1800         10.7125+-0.2426       
   string-base64                          5.3415+-0.0999    ?     5.3796+-0.1241       ?
   string-fasta                           6.4785+-0.1476          6.4336+-0.1339       
   string-tagcloud                       10.9209+-0.1997    ?    11.0666+-0.1537       ? might be 1.0133x slower
   string-unpack-code                    19.9217+-0.3454    ?    19.9705+-0.1953       ?
   string-validate-input                  6.3603+-0.1937    ?     6.3996+-0.1801       ?

   &lt;arithmetic&gt; *                         6.1402+-0.0199    ?     6.1420+-0.0214       ?
   &lt;geometric&gt;                            5.0836+-0.0271          5.0815+-0.0210       
   &lt;harmonic&gt;                             4.2036+-0.0418          4.1898+-0.0316       

                                            TipOfTree              InlineStack                                   
V8:
   crypto                                72.4464+-1.1142    ?    72.8270+-0.6869       ?
   deltablue                            220.1600+-0.9873    ?   221.4059+-1.2341       ?
   earley-boyer                          90.1134+-1.6313         89.9995+-1.6972       
   raytrace                              57.0296+-0.2720    ?    57.2557+-0.3214       ?
   regexp                               102.8816+-0.4624    ?   103.6077+-0.6321       ?
   richards                             178.9582+-0.6043    ?   179.7995+-0.3924       ?
   splay                                 96.5100+-0.9840         95.1582+-0.8484         might be 1.0142x faster

   &lt;arithmetic&gt;                         116.8713+-0.3375    ?   117.1505+-0.4165       ?
   &lt;geometric&gt; *                        105.5076+-0.3589    ?   105.6790+-0.4455       ?
   &lt;harmonic&gt;                            96.3346+-0.3947    ?    96.4731+-0.4496       ?

                                            TipOfTree              InlineStack                                   
Kraken:
   ai-astar                             493.6155+-3.8328        492.1463+-2.8087       
   audio-beat-detection                 189.8595+-0.9593    ?   189.8930+-1.2548       ?
   audio-dft                            261.6987+-1.6363    ?   264.6344+-3.3935       ? might be 1.0112x slower
   audio-fft                            123.8973+-1.2454        123.1248+-0.6818       
   audio-oscillator                     250.5794+-1.7787        250.0582+-1.7051       
   imaging-darkroom                     414.5912+-1.0350    ?   414.6210+-1.2052       ?
   imaging-desaturate                   217.3752+-0.4283    ?   217.4867+-0.9803       ?
   imaging-gaussian-blur                552.6816+-3.6620    ?   552.9712+-1.1946       ?
   json-parse-financial                  55.4810+-0.2754         55.2085+-0.4757       
   json-stringify-tinderbox              67.8895+-0.3746         67.7780+-0.9214       
   stanford-crypto-aes                  130.0658+-1.6892    ?   131.1331+-1.5111       ?
   stanford-crypto-ccm                  102.9781+-0.5390    ?   103.4665+-1.4906       ?
   stanford-crypto-pbkdf2               190.1582+-1.3107    ?   193.3028+-2.3632       ? might be 1.0165x slower
   stanford-crypto-sha256-iterative      70.7091+-0.4266         70.1000+-0.3308       

   &lt;arithmetic&gt; *                       222.9700+-0.5295    ?   223.2803+-0.4987       ?
   &lt;geometric&gt;                          175.2175+-0.3656    ?   175.4024+-0.5088       ?
   &lt;harmonic&gt;                           137.8468+-0.2869        137.7530+-0.4848       

                                            TipOfTree              InlineStack                                   
All benchmarks:
   &lt;arithmetic&gt;                          87.2197+-0.1975    ?    87.3547+-0.1881       ?
   &lt;geometric&gt;                           22.9237+-0.0805    ?    22.9312+-0.0733       ?
   &lt;harmonic&gt;                             7.3906+-0.0716          7.3671+-0.0545       

                                            TipOfTree              InlineStack                                   
Geomean of preferred means:
   &lt;scaled-result&gt;                       52.4690+-0.1223    ?    52.5265+-0.1103       ?</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>485636</commentid>
    <comment_count>4</comment_count>
    <who name="Filip Pizlo">fpizlo</who>
    <bug_when>2011-10-17 16:54:28 -0700</bug_when>
    <thetext>Landed in http://trac.webkit.org/changeset/97675</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>111337</attachid>
            <date>2011-10-17 15:57:24 -0700</date>
            <delta_ts>2011-10-17 16:08:18 -0700</delta_ts>
            <desc>the patch</desc>
            <filename>inlinestack_patch_1.diff</filename>
            <type>text/plain</type>
            <size>34681</size>
            <attacher name="Filip Pizlo">fpizlo</attacher>
            
              <data encoding="base64">SW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291
cmNlL0phdmFTY3JpcHRDb3JlL0NoYW5nZUxvZwkocmV2aXNpb24gOTc2NjApCisrKyBTb3VyY2Uv
SmF2YVNjcmlwdENvcmUvQ2hhbmdlTG9nCSh3b3JraW5nIGNvcHkpCkBAIC0xLDMgKzEsNTcgQEAK
KzIwMTEtMTAtMTcgIEZpbGlwIFBpemxvICA8ZnBpemxvQGFwcGxlLmNvbT4KKworICAgICAgICBE
RkcgYnl0ZWNvZGUgcGFyc2VyIHNob3VsZCB1bmRlcnN0YW5kIGlubGluZSBzdGFja3MKKyAgICAg
ICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTcwMjc4CisKKyAgICAg
ICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisgICAgICAgIAorICAgICAgICBUaGUgREZH
IGJ5dGVjb2RlIHBhcnNlciBpcyBub3cgY2FwYWJsZSBvZiBwYXJzaW5nIG11bHRpcGxlIGNvZGUg
YmxvY2tzIGF0CisgICAgICAgIG9uY2UuIFRoaXMgcmVtYWlucyB0dXJuZWQgb2ZmIHNpbmNlIG5v
dCBhbGwgaW5saW5pbmcgZnVuY3Rpb25hbGl0eSBpcworICAgICAgICBpbXBsZW1lbnRlZC4gICAg
ICAgCisgICAgICAgIAorICAgICAgICBUaGlzIHJlcXVpcmVkIG1ha2luZyBhIGZldyBjaGFuZ2Vz
IGVsc2V3aGVyZSBpbiB0aGUgc3lzdGVtLiBUaGUgYnl0ZWNvZGUKKyAgICAgICAgcGFyc2VyIG5v
dyBtYXkgZG8gc29tZSBvZiB0aGUgc2FtZSB0aGluZ3MgdGhhdCB0aGUgYnl0ZWNvZGUgZ2VuZXJh
dG9yIGRvZXMsCisgICAgICAgIGxpa2UgYWxsb2NhdGluZyBjb25zdGFudHMgYW5kIGlkZW50aWZp
ZXJzLiBCYXNpYyBibG9jayBsaW5raW5nIHJlbGllcyBvbgorICAgICAgICBieXRlY29kZSBpbmRp
Y2VzLCB3aGljaCBhcmUgb25seSBtZWFuaW5nZnVsIHdpdGhpbiB0aGUgY29udGV4dCBvZiBvbmUg
YmFzaWMKKyAgICAgICAgYmxvY2suIFRoaXMgaXMgZmluZSwgc28gbG9uZyBhcyBsaW5raW5nIGlz
IGRvbmUgZWFnZXJseSB3aGVuZXZlciBzd2l0Y2hpbmcKKyAgICAgICAgZnJvbSBvbmUgY29kZSBi
bG9jayB0byBhbm90aGVyLgorCisgICAgICAgICogYnl0ZWNvZGUvQ29kZU9yaWdpbi5oOgorICAg
ICAgICAoSlNDOjpDb2RlT3JpZ2luOjpDb2RlT3JpZ2luKToKKyAgICAgICAgKiBieXRlY29tcGls
ZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaDoKKyAgICAgICAgKiBkZmcvREZHQmFzaWNCbG9jay5oOgor
ICAgICAgICAqIGRmZy9ERkdCeXRlQ29kZVBhcnNlci5jcHA6CisgICAgICAgIChKU0M6OkRGRzo6
Qnl0ZUNvZGVQYXJzZXI6OkJ5dGVDb2RlUGFyc2VyKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRl
Q29kZVBhcnNlcjo6Z2V0KToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6c2V0
KToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6Z2V0VGhpcyk6CisgICAgICAg
IChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OnNldFRoaXMpOgorICAgICAgICAoSlNDOjpERkc6
OkJ5dGVDb2RlUGFyc2VyOjpjdXJyZW50Q29kZU9yaWdpbik6CisgICAgICAgIChKU0M6OkRGRzo6
Qnl0ZUNvZGVQYXJzZXI6OmdldFByZWRpY3Rpb24pOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVD
b2RlUGFyc2VyOjptYWtlU2FmZSk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6
Om1ha2VEaXZTYWZlKToKKyAgICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6SW5saW5l
U3RhY2tFbnRyeTo6ZXhlY3V0YWJsZSk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJz
ZXI6OklubGluZVN0YWNrRW50cnk6On5JbmxpbmVTdGFja0VudHJ5KToKKyAgICAgICAgKEpTQzo6
REZHOjpCeXRlQ29kZVBhcnNlcjo6SW5saW5lU3RhY2tFbnRyeTo6cmVtYXBPcGVyYW5kKToKKyAg
ICAgICAgKEpTQzo6REZHOjpCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayk6CisgICAgICAgIChK
U0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OmxpbmtCbG9jayk6CisgICAgICAgIChKU0M6OkRGRzo6
Qnl0ZUNvZGVQYXJzZXI6OmxpbmtCbG9ja3MpOgorICAgICAgICAoSlNDOjpERkc6OkJ5dGVDb2Rl
UGFyc2VyOjpzZXR1cFByZWRlY2Vzc29ycyk6CisgICAgICAgIChKU0M6OkRGRzo6Qnl0ZUNvZGVQ
YXJzZXI6OmJ1aWxkT3BlcmFuZE1hcHNJZk5lY2Vzc2FyeSk6CisgICAgICAgIChKU0M6OkRGRzo6
Qnl0ZUNvZGVQYXJzZXI6OklubGluZVN0YWNrRW50cnk6OklubGluZVN0YWNrRW50cnkpOgorICAg
ICAgICAoSlNDOjpERkc6OkJ5dGVDb2RlUGFyc2VyOjpwYXJzZUNvZGVCbG9jayk6CisgICAgICAg
IChKU0M6OkRGRzo6Qnl0ZUNvZGVQYXJzZXI6OnBhcnNlKToKKyAgICAgICAgKiBkZmcvREZHR3Jh
cGguaDoKKyAgICAgICAgKEpTQzo6REZHOjpHZXRCeXRlY29kZUJlZ2luRm9yQmxvY2s6OkdldEJ5
dGVjb2RlQmVnaW5Gb3JCbG9jayk6CisgICAgICAgIChKU0M6OkRGRzo6R2V0Qnl0ZWNvZGVCZWdp
bkZvckJsb2NrOjpvcGVyYXRvcigpKToKKyAgICAgICAgKEpTQzo6REZHOjpHcmFwaDo6YmxvY2tJ
bmRleEZvckJ5dGVjb2RlT2Zmc2V0KToKKyAgICAgICAgKiBkZmcvREZHTm9kZS5oOgorICAgICAg
ICAqIHJ1bnRpbWUvSWRlbnRpZmllci5oOgorICAgICAgICAoSlNDOjpJZGVudGlmaWVyTWFwSW5k
ZXhIYXNoVHJhaXRzOjplbXB0eVZhbHVlKToKKyAgICAgICAgKiBydW50aW1lL0pTVmFsdWUuaDoK
KyAgICAgICAgKiB3dGYvU3RkTGliRXh0cmFzLmg6CisgICAgICAgIChXVEY6OmJpbmFyeVNlYXJj
aFdpdGhGdW5jdG9yKToKKwogMjAxMS0xMC0xNyAgR2F2aW4gQmFycmFjbG91Z2ggIDxiYXJyYWNs
b3VnaEBhcHBsZS5jb20+CiAKICAgICAgICAgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19i
dWcuY2dpP2lkPTcwMjA3CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvZGUvQ29k
ZU9yaWdpbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29kZS9D
b2RlT3JpZ2luLmgJKHJldmlzaW9uIDk3NjYwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL2J5
dGVjb2RlL0NvZGVPcmlnaW4uaAkod29ya2luZyBjb3B5KQpAQCAtNDksNiArNDksMTIgQEAgc3Ry
dWN0IENvZGVPcmlnaW4gewogICAgIHsKICAgICB9CiAgICAgCisgICAgZXhwbGljaXQgQ29kZU9y
aWdpbih1aW50MzJfdCBieXRlY29kZUluZGV4LCBJbmxpbmVDYWxsRnJhbWUqIGlubGluZUNhbGxG
cmFtZSkKKyAgICAgICAgOiBieXRlY29kZUluZGV4KGJ5dGVjb2RlSW5kZXgpCisgICAgICAgICwg
aW5saW5lQ2FsbEZyYW1lKGlubGluZUNhbGxGcmFtZSkKKyAgICB7CisgICAgfQorICAgIAogICAg
IGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBieXRlY29kZUluZGV4ICE9IHN0ZDo6bnVtZXJp
Y19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsgfQogfTsKIApJbmRleDogU291cmNlL0phdmFTY3Jp
cHRDb3JlL2J5dGVjb21waWxlci9CeXRlY29kZUdlbmVyYXRvci5oCj09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9ieXRlY29tcGlsZXIvQnl0ZWNvZGVHZW5lcmF0b3IuaAkocmV2
aXNpb24gOTc2NjApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvYnl0ZWNvbXBpbGVyL0J5dGVj
b2RlR2VuZXJhdG9yLmgJKHdvcmtpbmcgY29weSkKQEAgLTQxMywxOCArNDEzLDYgQEAgbmFtZXNw
YWNlIEpTQyB7CiAKICAgICAgICAgUGFzc1JlZlB0cjxMYWJlbD4gZW1pdENvbXBsZXhKdW1wU2Nv
cGVzKExhYmVsKiB0YXJnZXQsIENvbnRyb2xGbG93Q29udGV4dCogdG9wU2NvcGUsIENvbnRyb2xG
bG93Q29udGV4dCogYm90dG9tU2NvcGUpOwogCi0gICAgICAgIHR5cGVkZWYgSGFzaE1hcDxFbmNv
ZGVkSlNWYWx1ZSwgdW5zaWduZWQsIEVuY29kZWRKU1ZhbHVlSGFzaCwgRW5jb2RlZEpTVmFsdWVI
YXNoVHJhaXRzPiBKU1ZhbHVlTWFwOwotCi0gICAgICAgIHN0cnVjdCBJZGVudGlmaWVyTWFwSW5k
ZXhIYXNoVHJhaXRzIHsKLSAgICAgICAgICAgIHR5cGVkZWYgaW50IFRyYWl0VHlwZTsKLSAgICAg
ICAgICAgIHR5cGVkZWYgSWRlbnRpZmllck1hcEluZGV4SGFzaFRyYWl0cyBTdG9yYWdlVHJhaXRz
OwotICAgICAgICAgICAgc3RhdGljIGludCBlbXB0eVZhbHVlKCkgeyByZXR1cm4gc3RkOjpudW1l
cmljX2xpbWl0czxpbnQ+OjptYXgoKTsgfQotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg
ZW1wdHlWYWx1ZUlzWmVybyA9IGZhbHNlOwotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg
bmVlZHNEZXN0cnVjdGlvbiA9IGZhbHNlOwotICAgICAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wg
bmVlZHNSZWYgPSBmYWxzZTsKLSAgICAgICAgfTsKLQotICAgICAgICB0eXBlZGVmIEhhc2hNYXA8
UmVmUHRyPFN0cmluZ0ltcGw+LCBpbnQsIElkZW50aWZpZXJSZXBIYXNoLCBIYXNoVHJhaXRzPFJl
ZlB0cjxTdHJpbmdJbXBsPiA+LCBJZGVudGlmaWVyTWFwSW5kZXhIYXNoVHJhaXRzPiBJZGVudGlm
aWVyTWFwOwogICAgICAgICB0eXBlZGVmIEhhc2hNYXA8ZG91YmxlLCBKU1ZhbHVlPiBOdW1iZXJN
YXA7CiAgICAgICAgIHR5cGVkZWYgSGFzaE1hcDxTdHJpbmdJbXBsKiwgSlNTdHJpbmcqLCBJZGVu
dGlmaWVyUmVwSGFzaD4gSWRlbnRpZmllclN0cmluZ01hcDsKICAgICAgICAgCkluZGV4OiBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Jhc2ljQmxvY2suaAo9PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3Vy
Y2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Jhc2ljQmxvY2suaAkocmV2aXNpb24gOTc2NjApCisr
KyBTb3VyY2UvSmF2YVNjcmlwdENvcmUvZGZnL0RGR0Jhc2ljQmxvY2suaAkod29ya2luZyBjb3B5
KQpAQCAtNTMsMTIgKzUzLDEwIEBAIHN0cnVjdCBCYXNpY0Jsb2NrIHsKICAgICB7CiAgICAgfQog
Ci0gICAgc3RhdGljIGlubGluZSBCbG9ja0luZGV4IGdldEJ5dGVjb2RlQmVnaW4oT3duUHRyPEJh
c2ljQmxvY2s+KiBibG9jaykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoKmJsb2NrKS0+Ynl0ZWNv
ZGVCZWdpbjsKLSAgICB9Ci0KKyAgICAvLyBUaGlzIHZhbHVlIGlzIHVzZWQgaW50ZXJuYWxseSBm
b3IgYmxvY2sgbGlua2luZyBhbmQgT1NSIGVudHJ5LiBJdCBpcyBtb3N0bHkgbWVhbmluZ2xlc3MK
KyAgICAvLyBmb3Igb3RoZXIgcHVycG9zZXMgZHVlIHRvIGlubGluaW5nLgogICAgIHVuc2lnbmVk
IGJ5dGVjb2RlQmVnaW47CisgICAgCiAgICAgTm9kZUluZGV4IGJlZ2luOwogICAgIE5vZGVJbmRl
eCBlbmQ7CiAgICAgYm9vbCBpc09TUlRhcmdldDsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29y
ZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIFNvdXJjZS9KYXZhU2Ny
aXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCShyZXZpc2lvbiA5NzY2MCkKKysrIFNv
dXJjZS9KYXZhU2NyaXB0Q29yZS9kZmcvREZHQnl0ZUNvZGVQYXJzZXIuY3BwCSh3b3JraW5nIGNv
cHkpCkBAIC01OCw2ICs1OCw4IEBAIHB1YmxpYzoKICAgICAgICAgLCBtX3BhcmFtZXRlclNsb3Rz
KDApCiAgICAgICAgICwgbV9udW1QYXNzZWRWYXJBcmdzKDApCiAgICAgICAgICwgbV9nbG9iYWxS
ZXNvbHZlTnVtYmVyKDApCisgICAgICAgICwgbV9pbmxpbmVTdGFja1RvcCgwKQorICAgICAgICAs
IG1faGF2ZUJ1aWx0T3BlcmFuZE1hcHMoZmFsc2UpCiAgICAgewogICAgICAgICBBU1NFUlQobV9w
cm9maWxlZEJsb2NrKTsKICAgICAgICAgCkBAIC02Nyw4ICs2OSwxMSBAQCBwdWJsaWM6CiAKICAg
ICAvLyBQYXJzZSBhIGZ1bGwgQ29kZUJsb2NrIG9mIGJ5dGVjb2RlLgogICAgIGJvb2wgcGFyc2Uo
KTsKLQorICAgIAogcHJpdmF0ZToKKyAgICAvLyBKdXN0IHBhcnNlIGZyb20gbV9jdXJyZW50SW5k
ZXggdG8gdGhlIGVuZCBvZiB0aGUgY3VycmVudCBDb2RlQmxvY2suCisgICAgYm9vbCBwYXJzZUNv
ZGVCbG9jaygpOworCiAgICAgLy8gSGVscGVyIGZvciBtaW4gYW5kIG1heC4KICAgICBib29sIGhh
bmRsZU1pbk1heChib29sIHVzZXNSZXN1bHQsIGludCByZXN1bHRPcGVyYW5kLCBOb2RlVHlwZSBv
cCwgaW50IGZpcnN0QXJnLCBpbnQgbGFzdEFyZyk7CiAgICAgCkBAIC03OCw2ICs4Myw5IEBAIHBy
aXZhdGU6CiAgICAgYm9vbCBwYXJzZUJsb2NrKHVuc2lnbmVkIGxpbWl0KTsKICAgICAvLyBTZXR1
cCBwcmVkZWNlc3NvciBsaW5rcyBpbiB0aGUgZ3JhcGgncyBCYXNpY0Jsb2Nrcy4KICAgICB2b2lk
IHNldHVwUHJlZGVjZXNzb3JzKCk7CisgICAgLy8gTGluayBibG9jayBzdWNjZXNzb3JzLgorICAg
IHZvaWQgbGlua0Jsb2NrKEJhc2ljQmxvY2sqLCBWZWN0b3I8QmxvY2tJbmRleD4mIHBvc3NpYmxl
VGFyZ2V0cyk7CisgICAgdm9pZCBsaW5rQmxvY2tzKFZlY3RvcjxCbG9ja0luZGV4PiYgdW5saW5r
ZWRCbG9ja3MpOwogICAgIC8vIExpbmsgR2V0TG9jYWwgJiBTZXRMb2NhbCBub2RlcywgdG8gZW5z
dXJlIGxpdmUgdmFsdWVzIGFyZSBnZW5lcmF0ZWQuCiAgICAgZW51bSBQaGlTdGFja1R5cGUgewog
ICAgICAgICBMb2NhbFBoaVN0YWNrLApAQCAtOTksNiArMTA3LDggQEAgcHJpdmF0ZToKICAgICAv
LyBHZXQvU2V0IHRoZSBvcGVyYW5kcy9yZXN1bHQgb2YgYSBieXRlY29kZSBpbnN0cnVjdGlvbi4K
ICAgICBOb2RlSW5kZXggZ2V0KGludCBvcGVyYW5kKQogICAgIHsKKyAgICAgICAgb3BlcmFuZCA9
IG1faW5saW5lU3RhY2tUb3AtPnJlbWFwT3BlcmFuZChvcGVyYW5kKTsKKyAgICAgICAgCiAgICAg
ICAgIC8vIElzIHRoaXMgYSBjb25zdGFudD8KICAgICAgICAgaWYgKG9wZXJhbmQgPj0gRmlyc3RD
b25zdGFudFJlZ2lzdGVySW5kZXgpIHsKICAgICAgICAgICAgIHVuc2lnbmVkIGNvbnN0YW50ID0g
b3BlcmFuZCAtIEZpcnN0Q29uc3RhbnRSZWdpc3RlckluZGV4OwpAQCAtMTE1LDYgKzEyNSw4IEBA
IHByaXZhdGU6CiAgICAgfQogICAgIHZvaWQgc2V0KGludCBvcGVyYW5kLCBOb2RlSW5kZXggdmFs
dWUpCiAgICAgeworICAgICAgICBvcGVyYW5kID0gbV9pbmxpbmVTdGFja1RvcC0+cmVtYXBPcGVy
YW5kKG9wZXJhbmQpOworICAgICAgICAKICAgICAgICAgLy8gSXMgdGhpcyBhbiBhcmd1bWVudD8K
ICAgICAgICAgaWYgKG9wZXJhbmRJc0FyZ3VtZW50KG9wZXJhbmQpKSB7CiAgICAgICAgICAgICBz
ZXRBcmd1bWVudChvcGVyYW5kLCB2YWx1ZSk7CkBAIC0yNjYsMTEgKzI3OCwxMSBAQCBwcml2YXRl
OgogICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgdG8gZ2V0L3NldCB0aGUgdGhpcyB2YWx1ZS4KICAg
ICBOb2RlSW5kZXggZ2V0VGhpcygpCiAgICAgewotICAgICAgICByZXR1cm4gZ2V0QXJndW1lbnQo
bV9jb2RlQmxvY2stPnRoaXNSZWdpc3RlcigpKTsKKyAgICAgICAgcmV0dXJuIGdldChtX2lubGlu
ZVN0YWNrVG9wLT5tX2NvZGVCbG9jay0+dGhpc1JlZ2lzdGVyKCkpOwogICAgIH0KICAgICB2b2lk
IHNldFRoaXMoTm9kZUluZGV4IHZhbHVlKQogICAgIHsKLSAgICAgICAgc2V0QXJndW1lbnQobV9j
b2RlQmxvY2stPnRoaXNSZWdpc3RlcigpLCB2YWx1ZSk7CisgICAgICAgIHNldChtX2lubGluZVN0
YWNrVG9wLT5tX2NvZGVCbG9jay0+dGhpc1JlZ2lzdGVyKCksIHZhbHVlKTsKICAgICB9CiAKICAg
ICAvLyBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBjaGVja2luZyBub2RlcyBmb3IgY29uc3RhbnRz
LgpAQCAtNDI1LDcgKzQzNyw3IEBAIHByaXZhdGU6CiAgICAgCiAgICAgQ29kZU9yaWdpbiBjdXJy
ZW50Q29kZU9yaWdpbigpCiAgICAgewotICAgICAgICByZXR1cm4gQ29kZU9yaWdpbihtX2N1cnJl
bnRJbmRleCk7CisgICAgICAgIHJldHVybiBDb2RlT3JpZ2luKG1fY3VycmVudEluZGV4LCBtX2lu
bGluZVN0YWNrVG9wLT5tX2lubGluZUNhbGxGcmFtZSk7CiAgICAgfQogCiAgICAgLy8gVGhlc2Ug
bWV0aG9kcyBjcmVhdGUgYSBub2RlIGFuZCBhZGQgaXQgdG8gdGhlIGdyYXBoLiBJZiBub2RlcyBv
ZiB0aGlzIHR5cGUgYXJlCkBAIC01MDEsNyArNTEzLDcgQEAgcHJpdmF0ZToKICAgICB7CiAgICAg
ICAgIFVOVVNFRF9QQVJBTShub2RlSW5kZXgpOwogICAgICAgICAKLSAgICAgICAgVmFsdWVQcm9m
aWxlKiBwcm9maWxlID0gbV9wcm9maWxlZEJsb2NrLT52YWx1ZVByb2ZpbGVGb3JCeXRlY29kZU9m
ZnNldChieXRlY29kZUluZGV4KTsKKyAgICAgICAgVmFsdWVQcm9maWxlKiBwcm9maWxlID0gbV9p
bmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT52YWx1ZVByb2ZpbGVGb3JCeXRlY29kZU9m
ZnNldChieXRlY29kZUluZGV4KTsKICAgICAgICAgQVNTRVJUKHByb2ZpbGUpOwogICAgICAgICBQ
cmVkaWN0ZWRUeXBlIHByZWRpY3Rpb24gPSBwcm9maWxlLT5jb21wdXRlVXBkYXRlZFByZWRpY3Rp
b24oKTsKICNpZiBERkdfRU5BQkxFKERFQlVHX1ZFUkJPU0UpCkBAIC01MjQsMTEgKzUzNiwxMSBA
QCBwcml2YXRlOgogCiAgICAgTm9kZUluZGV4IG1ha2VTYWZlKE5vZGVJbmRleCBub2RlSW5kZXgp
CiAgICAgewotICAgICAgICBpZiAoIW1fcHJvZmlsZWRCbG9jay0+bGlrZWx5VG9UYWtlU2xvd0Nh
c2UobV9jdXJyZW50SW5kZXgpKQorICAgICAgICBpZiAoIW1faW5saW5lU3RhY2tUb3AtPm1fcHJv
ZmlsZWRCbG9jay0+bGlrZWx5VG9UYWtlU2xvd0Nhc2UobV9jdXJyZW50SW5kZXgpKQogICAgICAg
ICAgICAgcmV0dXJuIG5vZGVJbmRleDsKICAgICAgICAgCiAjaWYgREZHX0VOQUJMRShERUJVR19W
RVJCT1NFKQotICAgICAgICBwcmludGYoIk1ha2luZyAlcyBAJXUgc2FmZSBhdCBiYyMldSBiZWNh
dXNlIHNsb3ctY2FzZSBjb3VudGVyIGlzIGF0ICV1XG4iLCBHcmFwaDo6b3BOYW1lKG1fZ3JhcGhb
bm9kZUluZGV4XS5vcCksIG5vZGVJbmRleCwgbV9jdXJyZW50SW5kZXgsIG1fcHJvZmlsZWRCbG9j
ay0+cmFyZUNhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQobV9jdXJyZW50SW5kZXgpLT5tX2Nv
dW50ZXIpOworICAgICAgICBwcmludGYoIk1ha2luZyAlcyBAJXUgc2FmZSBhdCBiYyMldSBiZWNh
dXNlIHNsb3ctY2FzZSBjb3VudGVyIGlzIGF0ICV1XG4iLCBHcmFwaDo6b3BOYW1lKG1fZ3JhcGhb
bm9kZUluZGV4XS5vcCksIG5vZGVJbmRleCwgbV9jdXJyZW50SW5kZXgsIG1faW5saW5lU3RhY2tU
b3AtPm1fcHJvZmlsZWRCbG9jay0+cmFyZUNhc2VQcm9maWxlRm9yQnl0ZWNvZGVPZmZzZXQobV9j
dXJyZW50SW5kZXgpLT5tX2NvdW50ZXIpOwogI2VuZGlmCiAgICAgICAgIAogICAgICAgICBzd2l0
Y2ggKG1fZ3JhcGhbbm9kZUluZGV4XS5vcCkgewpAQCAtNTQxLDcgKzU1Myw3IEBAIHByaXZhdGU6
CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIAogICAgICAgICBjYXNlIEFyaXRoTXVs
OgotICAgICAgICAgICAgaWYgKG1fcHJvZmlsZWRCbG9jay0+bGlrZWx5VG9UYWtlRGVlcGVzdFNs
b3dDYXNlKG1fY3VycmVudEluZGV4KSkKKyAgICAgICAgICAgIGlmIChtX2lubGluZVN0YWNrVG9w
LT5tX3Byb2ZpbGVkQmxvY2stPmxpa2VseVRvVGFrZURlZXBlc3RTbG93Q2FzZShtX2N1cnJlbnRJ
bmRleCkpCiAgICAgICAgICAgICAgICAgbV9ncmFwaFtub2RlSW5kZXhdLm1lcmdlQXJpdGhOb2Rl
RmxhZ3MoTm9kZU1heU92ZXJmbG93IHwgTm9kZU1heU5lZ1plcm8pOwogICAgICAgICAgICAgZWxz
ZQogICAgICAgICAgICAgICAgIG1fZ3JhcGhbbm9kZUluZGV4XS5tZXJnZUFyaXRoTm9kZUZsYWdz
KE5vZGVNYXlOZWdaZXJvKTsKQEAgLTU2NSw3ICs1NzcsNyBAQCBwcml2YXRlOgogICAgICAgICAv
LyBjYXJlIGFib3V0IHdoZW4gdGhlIG91dGNvbWUgb2YgdGhlIGRpdmlzaW9uIGlzIG5vdCBhbiBp
bnRlZ2VyLCB3aGljaAogICAgICAgICAvLyBpcyB3aGF0IHRoZSBzcGVjaWFsIGZhc3QgY2FzZSBj
b3VudGVyIHRlbGxzIHVzLgogICAgICAgICAKLSAgICAgICAgaWYgKCFtX3Byb2ZpbGVkQmxvY2st
Pmxpa2VseVRvVGFrZVNwZWNpYWxGYXN0Q2FzZShtX2N1cnJlbnRJbmRleCkpCisgICAgICAgIGlm
ICghbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5saWtlbHlUb1Rha2VTcGVjaWFs
RmFzdENhc2UobV9jdXJyZW50SW5kZXgpKQogICAgICAgICAgICAgcmV0dXJuIG5vZGVJbmRleDsK
ICAgICAgICAgCiAgICAgICAgIG1fZ3JhcGhbbm9kZUluZGV4XS5tZXJnZUFyaXRoTm9kZUZsYWdz
KE5vZGVNYXlPdmVyZmxvdyB8IE5vZGVNYXlOZWdaZXJvKTsKQEAgLTU3Myw2ICs1ODUsOCBAQCBw
cml2YXRlOgogICAgICAgICByZXR1cm4gbm9kZUluZGV4OwogICAgIH0KICAgICAKKyAgICB2b2lk
IGJ1aWxkT3BlcmFuZE1hcHNJZk5lY2Vzc2FyeSgpOworICAgIAogICAgIEpTR2xvYmFsRGF0YSog
bV9nbG9iYWxEYXRhOwogICAgIENvZGVCbG9jayogbV9jb2RlQmxvY2s7CiAgICAgQ29kZUJsb2Nr
KiBtX3Byb2ZpbGVkQmxvY2s7CkBAIC02NTAsNiArNjY0LDY0IEBAIHByaXZhdGU6CiAgICAgVmVj
dG9yPFBoaVN0YWNrRW50cnksIDE2PiBtX2xvY2FsUGhpU3RhY2s7CiAgICAgCiAgICAgVmVjdG9y
PE5vZGUqLCAxNj4gbV9yZXVzYWJsZU5vZGVTdGFjazsKKyAgICAKKyAgICBzdHJ1Y3QgSW5saW5l
U3RhY2tFbnRyeSB7CisgICAgICAgIEJ5dGVDb2RlUGFyc2VyKiBtX2J5dGVDb2RlUGFyc2VyOwor
ICAgICAgICAKKyAgICAgICAgQ29kZUJsb2NrKiBtX2NvZGVCbG9jazsKKyAgICAgICAgQ29kZUJs
b2NrKiBtX3Byb2ZpbGVkQmxvY2s7CisgICAgICAgIElubGluZUNhbGxGcmFtZSogbV9pbmxpbmVD
YWxsRnJhbWU7CisgICAgICAgIAorICAgICAgICBTY3JpcHRFeGVjdXRhYmxlKiBleGVjdXRhYmxl
KCkgeyByZXR1cm4gbV9jb2RlQmxvY2stPm93bmVyRXhlY3V0YWJsZSgpOyB9CisgICAgICAgIAor
ICAgICAgICAvLyBSZW1hcHBpbmcgb2YgaWRlbnRpZmllciBhbmQgY29uc3RhbnQgbnVtYmVycyBm
cm9tIHRoZSBjb2RlIGJsb2NrIGJlaW5nCisgICAgICAgIC8vIGlubGluZWQgKGlubGluZSBjYWxs
ZWUpIHRvIHRoZSBjb2RlIGJsb2NrIHRoYXQgd2UncmUgaW5saW5pbmcgaW50bworICAgICAgICAv
LyAodGhlIG1hY2hpbmUgY29kZSBibG9jaywgd2hpY2ggaXMgdGhlIHRyYW5zaXRpdmUsIHRob3Vn
aCBub3QgbmVjZXNzYXJpbHkKKyAgICAgICAgLy8gZGlyZWN0LCBjYWxsZXIpLgorICAgICAgICBW
ZWN0b3I8dW5zaWduZWQ+IG1faWRlbnRpZmllclJlbWFwOworICAgICAgICBWZWN0b3I8dW5zaWdu
ZWQ+IG1fY29uc3RhbnRSZW1hcDsKKyAgICAgICAgCisgICAgICAgIC8vIEJsb2NrcyBpbnRyb2R1
Y2VkIGJ5IHRoaXMgY29kZSBibG9jaywgd2hpY2ggbmVlZCBzdWNjZXNzb3IgbGlua2luZy4KKyAg
ICAgICAgLy8gTWF5IGluY2x1ZGUgdXAgdG8gb25lIGJhc2ljIGJsb2NrIHRoYXQgaW5jbHVkZXMg
dGhlIGNvbnRpbnVhdGlvbiBhZnRlcgorICAgICAgICAvLyB0aGUgY2FsbHNpdGUgaW4gdGhlIGNh
bGxlci4KKyAgICAgICAgVmVjdG9yPEJsb2NrSW5kZXg+IG1fdW5saW5rZWRCbG9ja3M7CisgICAg
ICAgIAorICAgICAgICAvLyBJZiB0aGUgY2FsbHNpdGUncyBiYXNpYyBibG9jayB3YXMgc3BsaXQg
aW50byB0d28sIHRoZW4gdGhpcyB3aWxsIGJlCisgICAgICAgIC8vIHRoZSBoZWFkIG9mIHRoZSBj
YWxsc2l0ZSBibG9jay4gSXQgbmVlZHMgaXRzIHN1Y2Nlc3NvcnMgbGlua2VkIHRvIHRoZQorICAg
ICAgICAvLyBtX3VubGlua2VkQmxvY2tzLCBidXQgbm90IHRoZSBvdGhlciB3YXkgYXJvdW5kOiB0
aGVyZSdzIG5vIHdheSBmb3IKKyAgICAgICAgLy8gYW55IGJsb2NrcyBpbiBtX3VubGlua2VkQmxv
Y2tzIHRvIGp1bXAgYmFjayBpbnRvIHRoaXMgYmxvY2suCisgICAgICAgIEJsb2NrSW5kZXggbV9j
YWxsc2l0ZUJsb2NrSGVhZDsKKyAgICAgICAgCisgICAgICAgIElubGluZVN0YWNrRW50cnkqIG1f
Y2FsbGVlOworICAgICAgICAKKyAgICAgICAgSW5saW5lU3RhY2tFbnRyeShCeXRlQ29kZVBhcnNl
ciosIENvZGVCbG9jayosIENvZGVCbG9jayogcHJvZmlsZWRCbG9jaywgQmxvY2tJbmRleCBjYWxs
c2l0ZUJsb2NrSGVhZCwgVmlydHVhbFJlZ2lzdGVyIGNhbGxlZVZSKTsKKyAgICAgICAgCisgICAg
ICAgIH5JbmxpbmVTdGFja0VudHJ5KCkKKyAgICAgICAgeworICAgICAgICAgICAgbV9ieXRlQ29k
ZVBhcnNlci0+bV9pbmxpbmVTdGFja1RvcCA9IG1fY2FsbGVlOworICAgICAgICB9CisgICAgICAg
IAorICAgICAgICBpbnQgcmVtYXBPcGVyYW5kKGludCBvcGVyYW5kKQorICAgICAgICB7CisgICAg
ICAgICAgICBpZiAoIW1faW5saW5lQ2FsbEZyYW1lKQorICAgICAgICAgICAgICAgIHJldHVybiBv
cGVyYW5kOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAob3BlcmFuZCA+PSBGaXJzdENv
bnN0YW50UmVnaXN0ZXJJbmRleCkKKyAgICAgICAgICAgICAgICByZXR1cm4gbV9jb25zdGFudFJl
bWFwW29wZXJhbmQgLSBGaXJzdENvbnN0YW50UmVnaXN0ZXJJbmRleF0gKyBGaXJzdENvbnN0YW50
UmVnaXN0ZXJJbmRleDsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcmV0dXJuIG9wZXJhbmQg
KyBtX2lubGluZUNhbGxGcmFtZS0+c3RhY2tPZmZzZXQ7CisgICAgICAgIH0KKyAgICB9OworICAg
IAorICAgIElubGluZVN0YWNrRW50cnkqIG1faW5saW5lU3RhY2tUb3A7CisKKyAgICAvLyBIYXZl
IHdlIGJ1aWx0IG9wZXJhbmQgbWFwcz8gV2UgaW5pdGlhbGl6ZSB0aGVtIGxhemlseSwgYW5kIG9u
bHkgd2hlbiBkb2luZworICAgIC8vIGlubGluaW5nLgorICAgIGJvb2wgbV9oYXZlQnVpbHRPcGVy
YW5kTWFwczsKKyAgICAvLyBNYXBwaW5nIGJldHdlZW4gaWRlbnRpZmllciBuYW1lcyBhbmQgbnVt
YmVycy4KKyAgICBJZGVudGlmaWVyTWFwIG1faWRlbnRpZmllck1hcDsKKyAgICAvLyBNYXBwaW5n
IGJldHdlZW4gdmFsdWVzIGFuZCBjb25zdGFudCBudW1iZXJzLgorICAgIEpTVmFsdWVNYXAgbV9q
c1ZhbHVlTWFwOwogfTsKIAogI2RlZmluZSBORVhUX09QQ09ERShuYW1lKSBcCkBAIC03ODEsNyAr
ODUzLDcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgIC8v
IElmIHdlIGFyZSB0aGUgZmlyc3QgYmFzaWMgYmxvY2ssIGludHJvZHVjZSBtYXJrZXJzIGZvciBh
cmd1bWVudHMuIFRoaXMgYWxsb3dzCiAgICAgLy8gdXMgdG8gdHJhY2sgaWYgYSB1c2Ugb2YgYW4g
YXJndW1lbnQgbWF5IHVzZSB0aGUgYWN0dWFsIGFyZ3VtZW50IHBhc3NlZCwgYXMKICAgICAvLyBv
cHBvc2VkIHRvIHVzaW5nIGEgdmFsdWUgd2Ugc2V0IGV4cGxpY2l0bHkuCi0gICAgaWYgKCFtX2N1
cnJlbnRJbmRleCkgeworICAgIGlmIChtX2N1cnJlbnRCbG9jayA9PSBtX2dyYXBoLm1fYmxvY2tz
WzBdLmdldCgpKSB7CiAgICAgICAgIG1fZ3JhcGgubV9hcmd1bWVudHMucmVzaXplKG1fbnVtQXJn
dW1lbnRzKTsKICAgICAgICAgZm9yICh1bnNpZ25lZCBhcmd1bWVudCA9IDA7IGFyZ3VtZW50IDwg
bV9udW1Bcmd1bWVudHM7ICsrYXJndW1lbnQpIHsKICAgICAgICAgICAgIE5vZGVJbmRleCBzZXRB
cmd1bWVudCA9IGFkZFRvR3JhcGgoU2V0QXJndW1lbnQsIE9wSW5mbyhuZXdWYXJpYWJsZUFjY2Vz
c0RhdGEoYXJndW1lbnQgLSBtX2NvZGVCbG9jay0+bV9udW1QYXJhbWV0ZXJzIC0gUmVnaXN0ZXJG
aWxlOjpDYWxsRnJhbWVIZWFkZXJTaXplKSkpOwpAQCAtNzkyLDcgKzg2NCw3IEBAIGJvb2wgQnl0
ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICB9CiAKICAgICBJbnRlcnByZXRl
ciogaW50ZXJwcmV0ZXIgPSBtX2dsb2JhbERhdGEtPmludGVycHJldGVyOwotICAgIEluc3RydWN0
aW9uKiBpbnN0cnVjdGlvbnNCZWdpbiA9IG1fY29kZUJsb2NrLT5pbnN0cnVjdGlvbnMoKS5iZWdp
bigpOworICAgIEluc3RydWN0aW9uKiBpbnN0cnVjdGlvbnNCZWdpbiA9IG1faW5saW5lU3RhY2tU
b3AtPm1fY29kZUJsb2NrLT5pbnN0cnVjdGlvbnMoKS5iZWdpbigpOwogICAgIHVuc2lnbmVkIGJs
b2NrQmVnaW4gPSBtX2N1cnJlbnRJbmRleDsKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAv
LyBEb24ndCBleHRlbmQgb3ZlciBqdW1wIGRlc3RpbmF0aW9ucy4KQEAgLTgxMCw3ICs4ODIsNyBA
QCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAKICAgICAgICAgY2Fz
ZSBvcF9lbnRlcjoKICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgYWxsIGxvY2FscyB0byB1bmRl
ZmluZWQuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fY29kZUJsb2NrLT5tX251
bVZhcnM7ICsraSkKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV9pbmxpbmVTdGFj
a1RvcC0+bV9jb2RlQmxvY2stPm1fbnVtVmFyczsgKytpKQogICAgICAgICAgICAgICAgIHNldChp
LCBjb25zdGFudFVuZGVmaW5lZCgpKTsKICAgICAgICAgICAgIE5FWFRfT1BDT0RFKG9wX2VudGVy
KTsKIApAQCAtMTE1NSwxMiArMTIyNywxMiBAQCBib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJs
b2NrKHVuc2lnbmVkCiAgICAgICAgICAgICBBU1NFUlQoaW50ZXJwcmV0ZXItPmdldE9wY29kZUlE
KGdldEluc3RydWN0aW9uLT51Lm9wY29kZSkgPT0gb3BfZ2V0X2J5X2lkKTsKICAgICAgICAgICAg
IAogICAgICAgICAgICAgTm9kZUluZGV4IGJhc2UgPSBnZXQoZ2V0SW5zdHJ1Y3Rpb25bMl0udS5v
cGVyYW5kKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGlkZW50aWZpZXIgPSBnZXRJbnN0cnVjdGlv
blszXS51Lm9wZXJhbmQ7CisgICAgICAgICAgICB1bnNpZ25lZCBpZGVudGlmaWVyID0gbV9pbmxp
bmVTdGFja1RvcC0+bV9pZGVudGlmaWVyUmVtYXBbZ2V0SW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5k
XTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBtZXRob2Rf
Y2hlY2sgd2FzIG1vbm9tb3JwaGljLiBJZiBzbywgZW1pdCBhIENoZWNrWFlaTWV0aG9kCiAgICAg
ICAgICAgICAvLyBub2RlLCB3aGljaCBpcyBhIGxvdCBtb3JlIGVmZmljaWVudC4KLSAgICAgICAg
ICAgIFN0cnVjdHVyZVN0dWJJbmZvJiBzdHViSW5mbyA9IG1fcHJvZmlsZWRCbG9jay0+Z2V0U3R1
YkluZm8obV9jdXJyZW50SW5kZXgpOwotICAgICAgICAgICAgTWV0aG9kQ2FsbExpbmtJbmZvJiBt
ZXRob2RDYWxsID0gbV9wcm9maWxlZEJsb2NrLT5nZXRNZXRob2RDYWxsTGlua0luZm8obV9jdXJy
ZW50SW5kZXgpOworICAgICAgICAgICAgU3RydWN0dXJlU3R1YkluZm8mIHN0dWJJbmZvID0gbV9p
bmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5nZXRTdHViSW5mbyhtX2N1cnJlbnRJbmRl
eCk7CisgICAgICAgICAgICBNZXRob2RDYWxsTGlua0luZm8mIG1ldGhvZENhbGwgPSBtX2lubGlu
ZVN0YWNrVG9wLT5tX3Byb2ZpbGVkQmxvY2stPmdldE1ldGhvZENhbGxMaW5rSW5mbyhtX2N1cnJl
bnRJbmRleCk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIGlmIChtZXRob2RDYWxsLnNlZW4g
JiYgISFtZXRob2RDYWxsLmNhY2hlZFN0cnVjdHVyZSAmJiAhc3R1YkluZm8uc2VlbikgewogICAg
ICAgICAgICAgICAgIC8vIEl0J3MgbW9ub21vcnBoaWMgYXMgZmFyIGFzIHdlIGNhbiB0ZWxsLCBz
aW5jZSB0aGUgbWV0aG9kX2NoZWNrIHdhcyBsaW5rZWQKQEAgLTEyMDUsMTAgKzEyNzcsMTAgQEAg
Ym9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNpZ25lZAogICAgICAgICAgICAgUHJl
ZGljdGVkVHlwZSBwcmVkaWN0aW9uID0gZ2V0UHJlZGljdGlvbigpOwogICAgICAgICAgICAgCiAg
ICAgICAgICAgICBOb2RlSW5kZXggYmFzZSA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5v
cGVyYW5kKTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGlkZW50aWZpZXJOdW1iZXIgPSBjdXJyZW50
SW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kOworICAgICAgICAgICAgdW5zaWduZWQgaWRlbnRpZmll
ck51bWJlciA9IG1faW5saW5lU3RhY2tUb3AtPm1faWRlbnRpZmllclJlbWFwW2N1cnJlbnRJbnN0
cnVjdGlvblszXS51Lm9wZXJhbmRdOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBJZGVudGlm
aWVyIGlkZW50aWZpZXIgPSBtX2NvZGVCbG9jay0+aWRlbnRpZmllcihpZGVudGlmaWVyTnVtYmVy
KTsKLSAgICAgICAgICAgIFN0cnVjdHVyZVN0dWJJbmZvJiBzdHViSW5mbyA9IG1fcHJvZmlsZWRC
bG9jay0+Z2V0U3R1YkluZm8obV9jdXJyZW50SW5kZXgpOworICAgICAgICAgICAgU3RydWN0dXJl
U3R1YkluZm8mIHN0dWJJbmZvID0gbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5n
ZXRTdHViSW5mbyhtX2N1cnJlbnRJbmRleCk7CiAgICAgICAgICAgICAKICAgICAgICAgICAgIHNp
emVfdCBvZmZzZXQgPSBub3RGb3VuZDsKICAgICAgICAgICAgIFN0cnVjdHVyZVNldCBzdHJ1Y3R1
cmVTZXQ7CkBAIC0xMjg1LDE2ICsxMzU3LDE2IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNl
QmxvY2sodW5zaWduZWQKICAgICAgICAgY2FzZSBvcF9wdXRfYnlfaWQ6IHsKICAgICAgICAgICAg
IE5vZGVJbmRleCB2YWx1ZSA9IGdldChjdXJyZW50SW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kKTsK
ICAgICAgICAgICAgIE5vZGVJbmRleCBiYXNlID0gZ2V0KGN1cnJlbnRJbnN0cnVjdGlvblsxXS51
Lm9wZXJhbmQpOwotICAgICAgICAgICAgdW5zaWduZWQgaWRlbnRpZmllck51bWJlciA9IGN1cnJl
bnRJbnN0cnVjdGlvblsyXS51Lm9wZXJhbmQ7CisgICAgICAgICAgICB1bnNpZ25lZCBpZGVudGlm
aWVyTnVtYmVyID0gbV9pbmxpbmVTdGFja1RvcC0+bV9pZGVudGlmaWVyUmVtYXBbY3VycmVudElu
c3RydWN0aW9uWzJdLnUub3BlcmFuZF07CiAgICAgICAgICAgICBib29sIGRpcmVjdCA9IGN1cnJl
bnRJbnN0cnVjdGlvbls4XS51Lm9wZXJhbmQ7CiAKLSAgICAgICAgICAgIFN0cnVjdHVyZVN0dWJJ
bmZvJiBzdHViSW5mbyA9IG1fcHJvZmlsZWRCbG9jay0+Z2V0U3R1YkluZm8obV9jdXJyZW50SW5k
ZXgpOworICAgICAgICAgICAgU3RydWN0dXJlU3R1YkluZm8mIHN0dWJJbmZvID0gbV9pbmxpbmVT
dGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5nZXRTdHViSW5mbyhtX2N1cnJlbnRJbmRleCk7CiAg
ICAgICAgICAgICBpZiAoIXN0dWJJbmZvLnNlZW4pCiAgICAgICAgICAgICAgICAgYWRkVG9HcmFw
aChGb3JjZU9TUkV4aXQpOwogICAgICAgICAgICAgCiAgICAgICAgICAgICBib29sIGFscmVhZHlH
ZW5lcmF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHN0dWJJbmZv
LnNlZW4gJiYgIW1fcHJvZmlsZWRCbG9jay0+bGlrZWx5VG9UYWtlU2xvd0Nhc2UobV9jdXJyZW50
SW5kZXgpKSB7CisgICAgICAgICAgICBpZiAoc3R1YkluZm8uc2VlbiAmJiAhbV9pbmxpbmVTdGFj
a1RvcC0+bV9wcm9maWxlZEJsb2NrLT5saWtlbHlUb1Rha2VTbG93Q2FzZShtX2N1cnJlbnRJbmRl
eCkpIHsKICAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0dWJJbmZvLmFjY2Vzc1R5cGUpIHsKICAg
ICAgICAgICAgICAgICBjYXNlIGFjY2Vzc19wdXRfYnlfaWRfcmVwbGFjZTogewogICAgICAgICAg
ICAgICAgICAgICBTdHJ1Y3R1cmUqIHN0cnVjdHVyZSA9IHN0dWJJbmZvLnUucHV0QnlJZFJlcGxh
Y2UuYmFzZU9iamVjdFN0cnVjdHVyZS5nZXQoKTsKQEAgLTE1NzAsNyArMTY0Miw3IEBAIGJvb2wg
Qnl0ZUNvZGVQYXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAgIAogICAgICAg
ICAgICAgaWYgKG1fZ3JhcGguaXNGdW5jdGlvbkNvbnN0YW50KG1fY29kZUJsb2NrLCBjYWxsVGFy
Z2V0KSkKICAgICAgICAgICAgICAgICBjYWxsVHlwZSA9IENvbnN0YW50RnVuY3Rpb247Ci0gICAg
ICAgICAgICBlbHNlIGlmIChtX3Byb2ZpbGVkQmxvY2stPmdldENhbGxMaW5rSW5mbyhtX2N1cnJl
bnRJbmRleCkuaXNMaW5rZWQoKSAmJiAhbV9wcm9maWxlZEJsb2NrLT5saWtlbHlUb1Rha2VTbG93
Q2FzZShtX2N1cnJlbnRJbmRleCkpCisgICAgICAgICAgICBlbHNlIGlmIChtX2lubGluZVN0YWNr
VG9wLT5tX3Byb2ZpbGVkQmxvY2stPmdldENhbGxMaW5rSW5mbyhtX2N1cnJlbnRJbmRleCkuaXNM
aW5rZWQoKSAmJiAhbV9pbmxpbmVTdGFja1RvcC0+bV9wcm9maWxlZEJsb2NrLT5saWtlbHlUb1Rh
a2VTbG93Q2FzZShtX2N1cnJlbnRJbmRleCkpCiAgICAgICAgICAgICAgICAgY2FsbFR5cGUgPSBM
aW5rZWRGdW5jdGlvbjsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICBjYWxsVHlw
ZSA9IFVua25vd25GdW5jdGlvbjsKQEAgLTE1OTUsNyArMTY2Nyw3IEBAIGJvb2wgQnl0ZUNvZGVQ
YXJzZXI6OnBhcnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgICAgICAgICAgICAgaW50cmluc2lj
ID0gbV9ncmFwaC52YWx1ZU9mRnVuY3Rpb25Db25zdGFudChtX2NvZGVCbG9jaywgY2FsbFRhcmdl
dCktPmV4ZWN1dGFibGUoKS0+aW50cmluc2ljKCk7CiAgICAgICAgICAgICAgICAgZWxzZSB7CiAg
ICAgICAgICAgICAgICAgICAgIEFTU0VSVChjYWxsVHlwZSA9PSBMaW5rZWRGdW5jdGlvbik7Ci0g
ICAgICAgICAgICAgICAgICAgIEpTRnVuY3Rpb24qIGZ1bmN0aW9uID0gbV9wcm9maWxlZEJsb2Nr
LT5nZXRDYWxsTGlua0luZm8obV9jdXJyZW50SW5kZXgpLmNhbGxlZS5nZXQoKTsKKyAgICAgICAg
ICAgICAgICAgICAgSlNGdW5jdGlvbiogZnVuY3Rpb24gPSBtX2lubGluZVN0YWNrVG9wLT5tX3By
b2ZpbGVkQmxvY2stPmdldENhbGxMaW5rSW5mbyhtX2N1cnJlbnRJbmRleCkuY2FsbGVlLmdldCgp
OwogICAgICAgICAgICAgICAgICAgICBpbnRyaW5zaWMgPSBmdW5jdGlvbi0+ZXhlY3V0YWJsZSgp
LT5pbnRyaW5zaWMoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGludHJpbnNpYyAhPSBOb0lu
dHJpbnNpYykKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZFRvR3JhcGgoQ2hlY2tGdW5jdGlv
biwgT3BJbmZvKGZ1bmN0aW9uKSwgY2FsbFRhcmdldCk7CkBAIC0xNjIyLDcgKzE2OTQsNyBAQCBi
b29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJzZUJsb2NrKHVuc2lnbmVkCiAgICAgICAgIGNhc2Ugb3Bf
cmVzb2x2ZTogewogICAgICAgICAgICAgUHJlZGljdGVkVHlwZSBwcmVkaWN0aW9uID0gZ2V0UHJl
ZGljdGlvbigpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICB1bnNpZ25lZCBpZGVudGlmaWVy
ID0gY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZDsKKyAgICAgICAgICAgIHVuc2lnbmVk
IGlkZW50aWZpZXIgPSBtX2lubGluZVN0YWNrVG9wLT5tX2lkZW50aWZpZXJSZW1hcFtjdXJyZW50
SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5kXTsKIAogICAgICAgICAgICAgTm9kZUluZGV4IHJlc29s
dmUgPSBhZGRUb0dyYXBoKFJlc29sdmUsIE9wSW5mbyhpZGVudGlmaWVyKSwgT3BJbmZvKHByZWRp
Y3Rpb24pKTsKICAgICAgICAgICAgIHNldChjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5k
LCByZXNvbHZlKTsKQEAgLTE2MzMsNyArMTcwNSw3IEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBh
cnNlQmxvY2sodW5zaWduZWQKICAgICAgICAgY2FzZSBvcF9yZXNvbHZlX2Jhc2U6IHsKICAgICAg
ICAgICAgIFByZWRpY3RlZFR5cGUgcHJlZGljdGlvbiA9IGdldFByZWRpY3Rpb24oKTsKICAgICAg
ICAgICAgIAotICAgICAgICAgICAgdW5zaWduZWQgaWRlbnRpZmllciA9IGN1cnJlbnRJbnN0cnVj
dGlvblsyXS51Lm9wZXJhbmQ7CisgICAgICAgICAgICB1bnNpZ25lZCBpZGVudGlmaWVyID0gbV9p
bmxpbmVTdGFja1RvcC0+bV9pZGVudGlmaWVyUmVtYXBbY3VycmVudEluc3RydWN0aW9uWzJdLnUu
b3BlcmFuZF07CiAKICAgICAgICAgICAgIE5vZGVJbmRleCByZXNvbHZlID0gYWRkVG9HcmFwaChj
dXJyZW50SW5zdHJ1Y3Rpb25bM10udS5vcGVyYW5kID8gUmVzb2x2ZUJhc2VTdHJpY3RQdXQgOiBS
ZXNvbHZlQmFzZSwgT3BJbmZvKGlkZW50aWZpZXIpLCBPcEluZm8ocHJlZGljdGlvbikpOwogICAg
ICAgICAgICAgc2V0KGN1cnJlbnRJbnN0cnVjdGlvblsxXS51Lm9wZXJhbmQsIHJlc29sdmUpOwpA
QCAtMTY0Nyw3ICsxNzE5LDcgQEAgYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFyc2VCbG9jayh1bnNp
Z25lZAogICAgICAgICAgICAgTm9kZUluZGV4IHJlc29sdmUgPSBhZGRUb0dyYXBoKFJlc29sdmVH
bG9iYWwsIE9wSW5mbyhtX2dyYXBoLm1fcmVzb2x2ZUdsb2JhbERhdGEuc2l6ZSgpKSwgT3BJbmZv
KHByZWRpY3Rpb24pKTsKICAgICAgICAgICAgIG1fZ3JhcGgubV9yZXNvbHZlR2xvYmFsRGF0YS5h
cHBlbmQoUmVzb2x2ZUdsb2JhbERhdGEoKSk7CiAgICAgICAgICAgICBSZXNvbHZlR2xvYmFsRGF0
YSYgZGF0YSA9IG1fZ3JhcGgubV9yZXNvbHZlR2xvYmFsRGF0YS5sYXN0KCk7Ci0gICAgICAgICAg
ICBkYXRhLmlkZW50aWZpZXJOdW1iZXIgPSBjdXJyZW50SW5zdHJ1Y3Rpb25bMl0udS5vcGVyYW5k
OworICAgICAgICAgICAgZGF0YS5pZGVudGlmaWVyTnVtYmVyID0gbV9pbmxpbmVTdGFja1RvcC0+
bV9pZGVudGlmaWVyUmVtYXBbY3VycmVudEluc3RydWN0aW9uWzJdLnUub3BlcmFuZF07CiAgICAg
ICAgICAgICBkYXRhLnJlc29sdmVJbmZvSW5kZXggPSBtX2dsb2JhbFJlc29sdmVOdW1iZXIrKzsK
ICAgICAgICAgICAgIHNldChjdXJyZW50SW5zdHJ1Y3Rpb25bMV0udS5vcGVyYW5kLCByZXNvbHZl
KTsKIApAQCAtMTc1Myw2ICsxODI1LDMzIEBAIHZvaWQgQnl0ZUNvZGVQYXJzZXI6OnByb2Nlc3NQ
aGlTdGFjaygpCiAgICAgfQogfQogCit2b2lkIEJ5dGVDb2RlUGFyc2VyOjpsaW5rQmxvY2soQmFz
aWNCbG9jayogYmxvY2ssIFZlY3RvcjxCbG9ja0luZGV4PiYgcG9zc2libGVUYXJnZXRzKQorewor
ICAgIEFTU0VSVChibG9jay0+ZW5kICE9IE5vTm9kZSk7CisgICAgTm9kZSYgbm9kZSA9IG1fZ3Jh
cGhbYmxvY2stPmVuZCAtIDFdOworICAgIEFTU0VSVChub2RlLmlzVGVybWluYWwoKSk7CisgICAg
CisgICAgc3dpdGNoIChub2RlLm9wKSB7CisgICAgY2FzZSBKdW1wOgorICAgICAgICBub2RlLnNl
dFRha2VuQmxvY2tJbmRleChtX2dyYXBoLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChwb3Nz
aWJsZVRhcmdldHMsIG5vZGUudGFrZW5CeXRlY29kZU9mZnNldER1cmluZ1BhcnNpbmcoKSkpOwor
ICAgICAgICBicmVhazsKKyAgICAgICAgCisgICAgY2FzZSBCcmFuY2g6CisgICAgICAgIG5vZGUu
c2V0VGFrZW5CbG9ja0luZGV4KG1fZ3JhcGguYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KHBv
c3NpYmxlVGFyZ2V0cywgbm9kZS50YWtlbkJ5dGVjb2RlT2Zmc2V0RHVyaW5nUGFyc2luZygpKSk7
CisgICAgICAgIG5vZGUuc2V0Tm90VGFrZW5CbG9ja0luZGV4KG1fZ3JhcGguYmxvY2tJbmRleEZv
ckJ5dGVjb2RlT2Zmc2V0KHBvc3NpYmxlVGFyZ2V0cywgbm9kZS5ub3RUYWtlbkJ5dGVjb2RlT2Zm
c2V0RHVyaW5nUGFyc2luZygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgICAKKyAgICBkZWZh
dWx0OgorICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQgQnl0ZUNvZGVQYXJzZXI6Omxp
bmtCbG9ja3MoVmVjdG9yPEJsb2NrSW5kZXg+JiB1bmxpbmtlZEJsb2NrcykKK3sKKyAgICBmb3Ig
KHNpemVfdCBpID0gMDsgaSA8IHVubGlua2VkQmxvY2tzLnNpemUoKTsgKytpKQorICAgICAgICBs
aW5rQmxvY2sobV9ncmFwaC5tX2Jsb2Nrc1t1bmxpbmtlZEJsb2Nrc1tpXV0uZ2V0KCksIHVubGlu
a2VkQmxvY2tzKTsKK30KKwogdm9pZCBCeXRlQ29kZVBhcnNlcjo6c2V0dXBQcmVkZWNlc3NvcnMo
KQogewogICAgIGZvciAoQmxvY2tJbmRleCBpbmRleCA9IDA7IGluZGV4IDwgbV9ncmFwaC5tX2Js
b2Nrcy5zaXplKCk7ICsraW5kZXgpIHsKQEAgLTE3NjEsMzIgKzE4NjAsMTAzIEBAIHZvaWQgQnl0
ZUNvZGVQYXJzZXI6OnNldHVwUHJlZGVjZXNzb3JzKCkKICAgICAgICAgTm9kZSYgbm9kZSA9IG1f
Z3JhcGhbYmxvY2stPmVuZCAtIDFdOwogICAgICAgICBBU1NFUlQobm9kZS5pc1Rlcm1pbmFsKCkp
OwogCi0gICAgICAgIGlmIChub2RlLmlzSnVtcCgpKSB7Ci0gICAgICAgICAgICBub2RlLnNldFRh
a2VuQmxvY2tJbmRleChtX2dyYXBoLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLnRh
a2VuQnl0ZWNvZGVPZmZzZXREdXJpbmdQYXJzaW5nKCkpKTsKKyAgICAgICAgaWYgKG5vZGUuaXNK
dW1wKCkpCiAgICAgICAgICAgICBtX2dyYXBoLm1fYmxvY2tzW25vZGUudGFrZW5CbG9ja0luZGV4
KCldLT5tX3ByZWRlY2Vzc29ycy5hcHBlbmQoaW5kZXgpOwotICAgICAgICB9IGVsc2UgaWYgKG5v
ZGUuaXNCcmFuY2goKSkgewotICAgICAgICAgICAgbm9kZS5zZXRUYWtlbkJsb2NrSW5kZXgobV9n
cmFwaC5ibG9ja0luZGV4Rm9yQnl0ZWNvZGVPZmZzZXQobm9kZS50YWtlbkJ5dGVjb2RlT2Zmc2V0
RHVyaW5nUGFyc2luZygpKSk7Ci0gICAgICAgICAgICBub2RlLnNldE5vdFRha2VuQmxvY2tJbmRl
eChtX2dyYXBoLmJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldChub2RlLm5vdFRha2VuQnl0ZWNv
ZGVPZmZzZXREdXJpbmdQYXJzaW5nKCkpKTsKKyAgICAgICAgZWxzZSBpZiAobm9kZS5pc0JyYW5j
aCgpKSB7CiAgICAgICAgICAgICBtX2dyYXBoLm1fYmxvY2tzW25vZGUudGFrZW5CbG9ja0luZGV4
KCldLT5tX3ByZWRlY2Vzc29ycy5hcHBlbmQoaW5kZXgpOwogICAgICAgICAgICAgbV9ncmFwaC5t
X2Jsb2Nrc1tub2RlLm5vdFRha2VuQmxvY2tJbmRleCgpXS0+bV9wcmVkZWNlc3NvcnMuYXBwZW5k
KGluZGV4KTsKICAgICAgICAgfQogICAgIH0KIH0KIAotYm9vbCBCeXRlQ29kZVBhcnNlcjo6cGFy
c2UoKQordm9pZCBCeXRlQ29kZVBhcnNlcjo6YnVpbGRPcGVyYW5kTWFwc0lmTmVjZXNzYXJ5KCkK
IHsKLSAgICAvLyBTZXQgZHVyaW5nIGNvbnN0cnVjdGlvbi4KLSAgICBBU1NFUlQoIW1fY3VycmVu
dEluZGV4KTsKKyAgICBpZiAobV9oYXZlQnVpbHRPcGVyYW5kTWFwcykKKyAgICAgICAgcmV0dXJu
OworICAgIAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbV9jb2RlQmxvY2stPm51bWJlck9m
SWRlbnRpZmllcnMoKTsgKytpKQorICAgICAgICBtX2lkZW50aWZpZXJNYXAuYWRkKG1fY29kZUJs
b2NrLT5pZGVudGlmaWVyKGkpLmltcGwoKSwgaSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkg
PCBtX2NvZGVCbG9jay0+bnVtYmVyT2ZDb25zdGFudFJlZ2lzdGVycygpOyArK2kpCisgICAgICAg
IG1fanNWYWx1ZU1hcC5hZGQoSlNWYWx1ZTo6ZW5jb2RlKG1fY29kZUJsb2NrLT5nZXRDb25zdGFu
dChpICsgRmlyc3RDb25zdGFudFJlZ2lzdGVySW5kZXgpKSwgaSk7CisgICAgCisgICAgbV9oYXZl
QnVpbHRPcGVyYW5kTWFwcyA9IHRydWU7Cit9CiAKLSAgICBmb3IgKHVuc2lnbmVkIGp1bXBUYXJn
ZXRJbmRleCA9IDA7IGp1bXBUYXJnZXRJbmRleCA8PSBtX2NvZGVCbG9jay0+bnVtYmVyT2ZKdW1w
VGFyZ2V0cygpOyArK2p1bXBUYXJnZXRJbmRleCkgeworQnl0ZUNvZGVQYXJzZXI6OklubGluZVN0
YWNrRW50cnk6OklubGluZVN0YWNrRW50cnkoQnl0ZUNvZGVQYXJzZXIqIGJ5dGVDb2RlUGFyc2Vy
LCBDb2RlQmxvY2sqIGNvZGVCbG9jaywgQ29kZUJsb2NrKiBwcm9maWxlZEJsb2NrLCBCbG9ja0lu
ZGV4IGNhbGxzaXRlQmxvY2tIZWFkLCBWaXJ0dWFsUmVnaXN0ZXIgY2FsbGVlVlIpCisgICAgOiBt
X2J5dGVDb2RlUGFyc2VyKGJ5dGVDb2RlUGFyc2VyKQorICAgICwgbV9jb2RlQmxvY2soY29kZUJs
b2NrKQorICAgICwgbV9wcm9maWxlZEJsb2NrKHByb2ZpbGVkQmxvY2spCisgICAgLCBtX2NhbGxz
aXRlQmxvY2tIZWFkKGNhbGxzaXRlQmxvY2tIZWFkKQorICAgICwgbV9jYWxsZWUoYnl0ZUNvZGVQ
YXJzZXItPm1faW5saW5lU3RhY2tUb3ApCit7CisgICAgaWYgKG1fY2FsbGVlKSB7CisgICAgICAg
IC8vIElubGluZSBjYXNlLgorICAgICAgICBBU1NFUlQoY29kZUJsb2NrICE9IGJ5dGVDb2RlUGFy
c2VyLT5tX2NvZGVCbG9jayk7CisgICAgICAgIEFTU0VSVChjYWxsZWVWUiAhPSBJbnZhbGlkVmly
dHVhbFJlZ2lzdGVyKTsKKyAgICAgICAgQVNTRVJUKGNhbGxzaXRlQmxvY2tIZWFkICE9IE5vQmxv
Y2spOworICAgICAgICAKKyAgICAgICAgSW5saW5lQ2FsbEZyYW1lIGlubGluZUNhbGxGcmFtZTsK
KyAgICAgICAgaW5saW5lQ2FsbEZyYW1lLmV4ZWN1dGFibGUgPSBjb2RlQmxvY2stPm93bmVyRXhl
Y3V0YWJsZSgpOworICAgICAgICBpbmxpbmVDYWxsRnJhbWUuc3RhY2tPZmZzZXQgPSBtX2NhbGxl
ZS0+bV9jb2RlQmxvY2stPm1fbnVtQ2FsbGVlUmVnaXN0ZXJzOworICAgICAgICBpbmxpbmVDYWxs
RnJhbWUuY2FsbGVlVlIgPSBjYWxsZWVWUjsKKyAgICAgICAgaW5saW5lQ2FsbEZyYW1lLmNhbGxl
ciA9IGJ5dGVDb2RlUGFyc2VyLT5jdXJyZW50Q29kZU9yaWdpbigpOworICAgICAgICBpbmxpbmVD
YWxsRnJhbWUubnVtQXJndW1lbnRzSW5jbHVkaW5nVGhpcyA9IGNvZGVCbG9jay0+bV9udW1QYXJh
bWV0ZXJzOworICAgICAgICBieXRlQ29kZVBhcnNlci0+bV9jb2RlQmxvY2stPmlubGluZUNhbGxG
cmFtZXMoKS5hcHBlbmQoaW5saW5lQ2FsbEZyYW1lKTsKKyAgICAgICAgbV9pbmxpbmVDYWxsRnJh
bWUgPSAmYnl0ZUNvZGVQYXJzZXItPm1fY29kZUJsb2NrLT5pbmxpbmVDYWxsRnJhbWVzKCkubGFz
dCgpOworICAgICAgICAKKyAgICAgICAgYnl0ZUNvZGVQYXJzZXItPmJ1aWxkT3BlcmFuZE1hcHNJ
Zk5lY2Vzc2FyeSgpOworICAgICAgICAKKyAgICAgICAgbV9pZGVudGlmaWVyUmVtYXAucmVzaXpl
KGNvZGVCbG9jay0+bnVtYmVyT2ZJZGVudGlmaWVycygpKTsKKyAgICAgICAgbV9jb25zdGFudFJl
bWFwLnJlc2l6ZShjb2RlQmxvY2stPm51bWJlck9mQ29uc3RhbnRSZWdpc3RlcnMoKSk7CisKKyAg
ICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2RlQmxvY2stPm51bWJlck9mSWRlbnRpZmll
cnMoKTsgKytpKSB7CisgICAgICAgICAgICBTdHJpbmdJbXBsKiByZXAgPSBjb2RlQmxvY2stPmlk
ZW50aWZpZXIoaSkuaW1wbCgpOworICAgICAgICAgICAgcGFpcjxJZGVudGlmaWVyTWFwOjppdGVy
YXRvciwgYm9vbD4gcmVzdWx0ID0gYnl0ZUNvZGVQYXJzZXItPm1faWRlbnRpZmllck1hcC5hZGQo
cmVwLCBieXRlQ29kZVBhcnNlci0+bV9jb2RlQmxvY2stPm51bWJlck9mSWRlbnRpZmllcnMoKSk7
CisgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkKKyAgICAgICAgICAgICAgICBieXRlQ29k
ZVBhcnNlci0+bV9jb2RlQmxvY2stPmFkZElkZW50aWZpZXIoSWRlbnRpZmllcihieXRlQ29kZVBh
cnNlci0+bV9nbG9iYWxEYXRhLCByZXApKTsKKyAgICAgICAgICAgIG1faWRlbnRpZmllclJlbWFw
W2ldID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXpl
X3QgaSA9IDA7IGkgPCBjb2RlQmxvY2stPm51bWJlck9mQ29uc3RhbnRSZWdpc3RlcnMoKTsgKytp
KSB7CisgICAgICAgICAgICBKU1ZhbHVlIHZhbHVlID0gY29kZUJsb2NrLT5nZXRDb25zdGFudChp
ICsgRmlyc3RDb25zdGFudFJlZ2lzdGVySW5kZXgpOworICAgICAgICAgICAgcGFpcjxKU1ZhbHVl
TWFwOjppdGVyYXRvciwgYm9vbD4gcmVzdWx0ID0gYnl0ZUNvZGVQYXJzZXItPm1fanNWYWx1ZU1h
cC5hZGQoSlNWYWx1ZTo6ZW5jb2RlKHZhbHVlKSwgY29kZUJsb2NrLT5udW1iZXJPZkNvbnN0YW50
UmVnaXN0ZXJzKCkgKyBGaXJzdENvbnN0YW50UmVnaXN0ZXJJbmRleCk7CisgICAgICAgICAgICBp
ZiAocmVzdWx0LnNlY29uZCkKKyAgICAgICAgICAgICAgICBieXRlQ29kZVBhcnNlci0+bV9jb2Rl
QmxvY2stPmFkZENvbnN0YW50KHZhbHVlKTsKKyAgICAgICAgICAgIG1fY29uc3RhbnRSZW1hcFtp
XSA9IHJlc3VsdC5maXJzdC0+c2Vjb25kOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAg
ICAgLy8gTWFjaGluZSBjb2RlIGJsb2NrIGNhc2UuCisgICAgICAgIEFTU0VSVChjb2RlQmxvY2sg
PT0gYnl0ZUNvZGVQYXJzZXItPm1fY29kZUJsb2NrKTsKKyAgICAgICAgQVNTRVJUKGNhbGxlZVZS
ID09IEludmFsaWRWaXJ0dWFsUmVnaXN0ZXIpOworICAgICAgICBBU1NFUlQoY2FsbHNpdGVCbG9j
a0hlYWQgPT0gTm9CbG9jayk7CisKKyAgICAgICAgbV9pbmxpbmVDYWxsRnJhbWUgPSAwOworCisg
ICAgICAgIG1faWRlbnRpZmllclJlbWFwLnJlc2l6ZShjb2RlQmxvY2stPm51bWJlck9mSWRlbnRp
ZmllcnMoKSk7CisgICAgICAgIG1fY29uc3RhbnRSZW1hcC5yZXNpemUoY29kZUJsb2NrLT5udW1i
ZXJPZkNvbnN0YW50UmVnaXN0ZXJzKCkpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBp
IDwgY29kZUJsb2NrLT5udW1iZXJPZklkZW50aWZpZXJzKCk7ICsraSkKKyAgICAgICAgICAgIG1f
aWRlbnRpZmllclJlbWFwW2ldID0gaTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBj
b2RlQmxvY2stPm51bWJlck9mQ29uc3RhbnRSZWdpc3RlcnMoKTsgKytpKQorICAgICAgICAgICAg
bV9jb25zdGFudFJlbWFwW2ldID0gaTsKKyAgICB9CisgICAgCisgICAgYnl0ZUNvZGVQYXJzZXIt
Pm1faW5saW5lU3RhY2tUb3AgPSB0aGlzOworfQorCitib29sIEJ5dGVDb2RlUGFyc2VyOjpwYXJz
ZUNvZGVCbG9jaygpCit7CisgICAgQ29kZUJsb2NrKiBjb2RlQmxvY2sgPSBtX2lubGluZVN0YWNr
VG9wLT5tX2NvZGVCbG9jazsKKyAgICAKKyAgICBmb3IgKHVuc2lnbmVkIGp1bXBUYXJnZXRJbmRl
eCA9IDA7IGp1bXBUYXJnZXRJbmRleCA8PSBjb2RlQmxvY2stPm51bWJlck9mSnVtcFRhcmdldHMo
KTsgKytqdW1wVGFyZ2V0SW5kZXgpIHsKICAgICAgICAgLy8gVGhlIG1heGltdW0gYnl0ZWNvZGUg
b2Zmc2V0IHRvIGdvIGludG8gdGhlIGN1cnJlbnQgYmFzaWNibG9jayBpcyBlaXRoZXIgdGhlIG5l
eHQganVtcCB0YXJnZXQsIG9yIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucy4KLSAgICAgICAg
dW5zaWduZWQgbGltaXQgPSBqdW1wVGFyZ2V0SW5kZXggPCBtX2NvZGVCbG9jay0+bnVtYmVyT2ZK
dW1wVGFyZ2V0cygpID8gbV9jb2RlQmxvY2stPmp1bXBUYXJnZXQoanVtcFRhcmdldEluZGV4KSA6
IG1fY29kZUJsb2NrLT5pbnN0cnVjdGlvbnMoKS5zaXplKCk7CisgICAgICAgIHVuc2lnbmVkIGxp
bWl0ID0ganVtcFRhcmdldEluZGV4IDwgY29kZUJsb2NrLT5udW1iZXJPZkp1bXBUYXJnZXRzKCkg
PyBjb2RlQmxvY2stPmp1bXBUYXJnZXQoanVtcFRhcmdldEluZGV4KSA6IGNvZGVCbG9jay0+aW5z
dHJ1Y3Rpb25zKCkuc2l6ZSgpOwogICAgICAgICBBU1NFUlQobV9jdXJyZW50SW5kZXggPCBsaW1p
dCk7CiAKICAgICAgICAgLy8gTG9vcCB1bnRpbCB3ZSByZWFjaCB0aGUgY3VycmVudCBsaW1pdCAo
aS5lLiBuZXh0IGp1bXAgdGFyZ2V0KS4KICAgICAgICAgZG8gewogICAgICAgICAgICAgT3duUHRy
PEJhc2ljQmxvY2s+IGJsb2NrID0gYWRvcHRQdHIobmV3IEJhc2ljQmxvY2sobV9jdXJyZW50SW5k
ZXgsIG1fZ3JhcGguc2l6ZSgpLCBtX251bUFyZ3VtZW50cywgbV9udW1Mb2NhbHMpKTsKICAgICAg
ICAgICAgIG1fY3VycmVudEJsb2NrID0gYmxvY2suZ2V0KCk7CisgICAgICAgICAgICBtX2lubGlu
ZVN0YWNrVG9wLT5tX3VubGlua2VkQmxvY2tzLmFwcGVuZChtX2dyYXBoLm1fYmxvY2tzLnNpemUo
KSk7CiAgICAgICAgICAgICBtX2dyYXBoLm1fYmxvY2tzLmFwcGVuZChibG9jay5yZWxlYXNlKCkp
OwogCiAgICAgICAgICAgICBpZiAoIXBhcnNlQmxvY2sobGltaXQpKQpAQCAtMTc5OSw4ICsxOTY5
LDIxIEBAIGJvb2wgQnl0ZUNvZGVQYXJzZXI6OnBhcnNlKCkKICAgICB9CiAKICAgICAvLyBTaG91
bGQgaGF2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGluc3RydWN0aW9ucy4KLSAgICBBU1NFUlQo
bV9jdXJyZW50SW5kZXggPT0gbV9jb2RlQmxvY2stPmluc3RydWN0aW9ucygpLnNpemUoKSk7Cisg
ICAgQVNTRVJUKG1fY3VycmVudEluZGV4ID09IGNvZGVCbG9jay0+aW5zdHJ1Y3Rpb25zKCkuc2l6
ZSgpKTsKKyAgICAKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCeXRlQ29kZVBhcnNlcjo6
cGFyc2UoKQoreworICAgIC8vIFNldCBkdXJpbmcgY29uc3RydWN0aW9uLgorICAgIEFTU0VSVCgh
bV9jdXJyZW50SW5kZXgpOworICAgIAorICAgIElubGluZVN0YWNrRW50cnkgaW5saW5lU3RhY2tF
bnRyeSh0aGlzLCBtX2NvZGVCbG9jaywgbV9wcm9maWxlZEJsb2NrLCBOb0Jsb2NrLCBJbnZhbGlk
VmlydHVhbFJlZ2lzdGVyKTsKKyAgICAKKyAgICBwYXJzZUNvZGVCbG9jaygpOwogCisgICAgbGlu
a0Jsb2NrcyhpbmxpbmVTdGFja0VudHJ5Lm1fdW5saW5rZWRCbG9ja3MpOwogICAgIHNldHVwUHJl
ZGVjZXNzb3JzKCk7CiAgICAgcHJvY2Vzc1BoaVN0YWNrPExvY2FsUGhpU3RhY2s+KCk7CiAgICAg
cHJvY2Vzc1BoaVN0YWNrPEFyZ3VtZW50UGhpU3RhY2s+KCk7CkluZGV4OiBTb3VyY2UvSmF2YVNj
cmlwdENvcmUvZGZnL0RGR0dyYXBoLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRD
b3JlL2RmZy9ERkdHcmFwaC5oCShyZXZpc2lvbiA5NzY2MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0
Q29yZS9kZmcvREZHR3JhcGguaAkod29ya2luZyBjb3B5KQpAQCAtMTEzLDE5ICsxMTMsOCBAQCBw
dWJsaWM6CiAgICAgdm9pZCBkdW1wKE5vZGVJbmRleCwgQ29kZUJsb2NrKiA9IDApOwogI2VuZGlm
CiAKLSAgICBCbG9ja0luZGV4IGJsb2NrSW5kZXhGb3JCeXRlY29kZU9mZnNldCh1bnNpZ25lZCBi
eXRlY29kZUJlZ2luKQotICAgIHsKLSAgICAgICAgT3duUHRyPEJhc2ljQmxvY2s+KiBiZWdpbiA9
IG1fYmxvY2tzLmJlZ2luKCk7Ci0gICAgICAgIE93blB0cjxCYXNpY0Jsb2NrPiogYmxvY2sgPSBi
aW5hcnlTZWFyY2g8T3duUHRyPEJhc2ljQmxvY2s+LCB1bnNpZ25lZCwgQmFzaWNCbG9jazo6Z2V0
Qnl0ZWNvZGVCZWdpbj4oYmVnaW4sIG1fYmxvY2tzLnNpemUoKSwgYnl0ZWNvZGVCZWdpbik7Ci0g
ICAgICAgIEFTU0VSVChibG9jayA+PSBtX2Jsb2Nrcy5iZWdpbigpICYmIGJsb2NrIDwgbV9ibG9j
a3MuZW5kKCkpOwotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmxvY2tJbmRleD4oYmxvY2sg
LSBiZWdpbik7Ci0gICAgfQorICAgIEJsb2NrSW5kZXggYmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zm
c2V0KFZlY3RvcjxCbG9ja0luZGV4PiYgYmxvY2tzLCB1bnNpZ25lZCBieXRlY29kZUJlZ2luKTsK
IAotICAgIEJhc2ljQmxvY2smIGJsb2NrRm9yQnl0ZWNvZGVPZmZzZXQodW5zaWduZWQgYnl0ZWNv
ZGVCZWdpbikKLSAgICB7Ci0gICAgICAgIHJldHVybiAqbV9ibG9ja3NbYmxvY2tJbmRleEZvckJ5
dGVjb2RlT2Zmc2V0KGJ5dGVjb2RlQmVnaW4pXTsKLSAgICB9Ci0gICAgCiAgICAgYm9vbCBwcmVk
aWN0R2xvYmFsVmFyKHVuc2lnbmVkIHZhck51bWJlciwgUHJlZGljdGVkVHlwZSBwcmVkaWN0aW9u
KQogICAgIHsKICAgICAgICAgcmV0dXJuIG1fcHJlZGljdGlvbnMucHJlZGljdEdsb2JhbFZhcih2
YXJOdW1iZXIsIHByZWRpY3Rpb24pOwpAQCAtMjUyLDYgKzI0MSwyNyBAQCBwcml2YXRlOgogICAg
IFByZWRpY3Rpb25UcmFja2VyIG1fcHJlZGljdGlvbnM7CiB9OwogCitjbGFzcyBHZXRCeXRlY29k
ZUJlZ2luRm9yQmxvY2sgeworcHVibGljOgorICAgIEdldEJ5dGVjb2RlQmVnaW5Gb3JCbG9jayhH
cmFwaCYgZ3JhcGgpCisgICAgICAgIDogbV9ncmFwaChncmFwaCkKKyAgICB7CisgICAgfQorICAg
IAorICAgIHVuc2lnbmVkIG9wZXJhdG9yKCkoQmxvY2tJbmRleCogYmxvY2tJbmRleCkgY29uc3QK
KyAgICB7CisgICAgICAgIHJldHVybiBtX2dyYXBoLm1fYmxvY2tzWypibG9ja0luZGV4XS0+Ynl0
ZWNvZGVCZWdpbjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgR3JhcGgmIG1fZ3JhcGg7Cit9Owor
CitpbmxpbmUgQmxvY2tJbmRleCBHcmFwaDo6YmxvY2tJbmRleEZvckJ5dGVjb2RlT2Zmc2V0KFZl
Y3RvcjxCbG9ja0luZGV4PiYgYmxvY2tzLCB1bnNpZ25lZCBieXRlY29kZUJlZ2luKQoreworICAg
IHJldHVybiAqV1RGOjpiaW5hcnlTZWFyY2hXaXRoRnVuY3RvcjxCbG9ja0luZGV4LCB1bnNpZ25l
ZD4oYmxvY2tzLmJlZ2luKCksIGJsb2Nrcy5zaXplKCksIGJ5dGVjb2RlQmVnaW4sIFdURjo6S2V5
TXVzdEJlUHJlc2VudEluQXJyYXksIEdldEJ5dGVjb2RlQmVnaW5Gb3JCbG9jaygqdGhpcykpOwor
fQorCiB9IH0gLy8gbmFtZXNwYWNlIEpTQzo6REZHCiAKICNlbmRpZgpJbmRleDogU291cmNlL0ph
dmFTY3JpcHRDb3JlL2RmZy9ERkdOb2RlLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdOb2RlLmgJKHJldmlzaW9uIDk3NjYwKQorKysgU291cmNlL0phdmFTY3Jp
cHRDb3JlL2RmZy9ERkdOb2RlLmgJKHdvcmtpbmcgY29weSkKQEAgLTgyLDYgKzgyLDcgQEAgdHlw
ZWRlZiB1aW50MzJfdCBOb2RlSW5kZXg7CiBzdGF0aWMgY29uc3QgTm9kZUluZGV4IE5vTm9kZSA9
IFVJTlRfTUFYOwogCiB0eXBlZGVmIHVpbnQzMl90IEJsb2NrSW5kZXg7CitzdGF0aWMgY29uc3Qg
QmxvY2tJbmRleCBOb0Jsb2NrID0gVUlOVF9NQVg7CiAKIHN0cnVjdCBOb2RlSW5kZXhUcmFpdHMg
ewogICAgIHN0YXRpYyBOb2RlSW5kZXggZGVmYXVsdFZhbHVlKCkgeyByZXR1cm4gTm9Ob2RlOyB9
CkluZGV4OiBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGltZS9JZGVudGlmaWVyLmgKPT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3J1bnRpbWUvSWRlbnRpZmllci5oCShyZXZp
c2lvbiA5NzY2MCkKKysrIFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50aW1lL0lkZW50aWZpZXIu
aAkod29ya2luZyBjb3B5KQpAQCAtMTUzLDYgKzE1MywxNyBAQCBuYW1lc3BhY2UgSlNDIHsKICAg
ICAgICAgc3RhdGljIHVuc2lnbmVkIGhhc2goU3RyaW5nSW1wbCoga2V5KSB7IHJldHVybiBrZXkt
PmV4aXN0aW5nSGFzaCgpOyB9CiAgICAgfTsKIAorICAgIHN0cnVjdCBJZGVudGlmaWVyTWFwSW5k
ZXhIYXNoVHJhaXRzIHsKKyAgICAgICAgdHlwZWRlZiBpbnQgVHJhaXRUeXBlOworICAgICAgICB0
eXBlZGVmIElkZW50aWZpZXJNYXBJbmRleEhhc2hUcmFpdHMgU3RvcmFnZVRyYWl0czsKKyAgICAg
ICAgc3RhdGljIGludCBlbXB0eVZhbHVlKCkgeyByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxp
bnQ+OjptYXgoKTsgfQorICAgICAgICBzdGF0aWMgY29uc3QgYm9vbCBlbXB0eVZhbHVlSXNaZXJv
ID0gZmFsc2U7CisgICAgICAgIHN0YXRpYyBjb25zdCBib29sIG5lZWRzRGVzdHJ1Y3Rpb24gPSBm
YWxzZTsKKyAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wgbmVlZHNSZWYgPSBmYWxzZTsKKyAgICB9
OworCisgICAgdHlwZWRlZiBIYXNoTWFwPFJlZlB0cjxTdHJpbmdJbXBsPiwgaW50LCBJZGVudGlm
aWVyUmVwSGFzaCwgSGFzaFRyYWl0czxSZWZQdHI8U3RyaW5nSW1wbD4gPiwgSWRlbnRpZmllck1h
cEluZGV4SGFzaFRyYWl0cz4gSWRlbnRpZmllck1hcDsKKwogfSAvLyBuYW1lc3BhY2UgSlNDCiAK
ICNlbmRpZiAvLyBJZGVudGlmaWVyX2gKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS9ydW50
aW1lL0pTVmFsdWUuaAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBTb3VyY2UvSmF2YVNjcmlwdENvcmUvcnVudGlt
ZS9KU1ZhbHVlLmgJKHJldmlzaW9uIDk3NjYwKQorKysgU291cmNlL0phdmFTY3JpcHRDb3JlL3J1
bnRpbWUvSlNWYWx1ZS5oCSh3b3JraW5nIGNvcHkpCkBAIC0yOCw2ICsyOCw3IEBACiAjaW5jbHVk
ZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8d3RmL0Fsd2F5c0lubGluZS5oPgogI2luY2x1ZGUgPHd0
Zi9Bc3NlcnRpb25zLmg+CisjaW5jbHVkZSA8d3RmL0hhc2hNYXAuaD4KICNpbmNsdWRlIDx3dGYv
SGFzaFRyYWl0cy5oPgogI2luY2x1ZGUgPHd0Zi9NYXRoRXh0cmFzLmg+CiAjaW5jbHVkZSA8d3Rm
L1N0ZExpYkV4dHJhcy5oPgpAQCAtMzc5LDYgKzM4MCw4IEBAIG5hbWVzcGFjZSBKU0MgewogICAg
IH07CiAjZW5kaWYKIAorICAgIHR5cGVkZWYgSGFzaE1hcDxFbmNvZGVkSlNWYWx1ZSwgdW5zaWdu
ZWQsIEVuY29kZWRKU1ZhbHVlSGFzaCwgRW5jb2RlZEpTVmFsdWVIYXNoVHJhaXRzPiBKU1ZhbHVl
TWFwOworCiAgICAgLy8gU3RhbmQtYWxvbmUgaGVscGVyIGZ1bmN0aW9ucy4KICAgICBpbmxpbmUg
SlNWYWx1ZSBqc051bGwoKQogICAgIHsKSW5kZXg6IFNvdXJjZS9KYXZhU2NyaXB0Q29yZS93dGYv
U3RkTGliRXh0cmFzLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09
PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gU291cmNlL0phdmFTY3JpcHRDb3JlL3d0Zi9T
dGRMaWJFeHRyYXMuaAkocmV2aXNpb24gOTc2NjApCisrKyBTb3VyY2UvSmF2YVNjcmlwdENvcmUv
d3RmL1N0ZExpYkV4dHJhcy5oCSh3b3JraW5nIGNvcHkpCkBAIC0xOTUsNiArMTk1LDQ3IEBAIGlu
bGluZSBBcnJheUVsZW1lbnRUeXBlKiBiaW5hcnlTZWFyY2goQXIKICAgICByZXR1cm4gJmFycmF5
WzBdOwogfQogCisvLyBNb2RpZmllZCBiaW5hcnkgc2VhcmNoIGFsZ29yaXRobSB0aGF0IHVzZXMg
YSBmdW5jdG9yLiBOb3RlIHRoYXQgdGhpcyBpcyBzdHJpY3RseQorLy8gbW9yZSBwb3dlcmZ1bCB0
aGFuIHRoZSBhYm92ZSwgYnV0IHJlc3VsdHMgaW4gc29tZXdoYXQgbGVzcyB0ZW1wbGF0ZSBzcGVj
aWFsaXphdGlvbi4KKy8vIEhlbmNlLCBkZXBlbmRpbmcgb24gaW5saW5pbmcgaGV1cmlzdGljcywg
aXQgbWlnaHQgYmUgc2xvd2VyLgordGVtcGxhdGU8dHlwZW5hbWUgQXJyYXlFbGVtZW50VHlwZSwg
dHlwZW5hbWUgS2V5VHlwZSwgdHlwZW5hbWUgRXh0cmFjdEtleT4KK2lubGluZSBBcnJheUVsZW1l
bnRUeXBlKiBiaW5hcnlTZWFyY2hXaXRoRnVuY3RvcihBcnJheUVsZW1lbnRUeXBlKiBhcnJheSwg
c2l6ZV90IHNpemUsIEtleVR5cGUga2V5LCBCaW5hcnlTZWFyY2hNb2RlIG1vZGUgPSBLZXlNdXN0
QmVQcmVzZW50SW5BcnJheSwgY29uc3QgRXh0cmFjdEtleSYgZXh0cmFjdEtleSA9IEV4dHJhY3RL
ZXkoKSkKK3sKKyAgICAvLyBUaGUgYXJyYXkgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVt
ZW50IChwcmUtY29uZGl0aW9uLCBhcnJheSBkb2VzIGNvbnRhaW4ga2V5KS4KKyAgICAvLyBJZiB0
aGUgYXJyYXkgY29udGFpbnMgb25seSBvbmUgZWxlbWVudCwgbm8gbmVlZCB0byBkbyB0aGUgY29t
cGFyaXNvbi4KKyAgICB3aGlsZSAoc2l6ZSA+IDEpIHsKKyAgICAgICAgLy8gUGljayBhbiBlbGVt
ZW50IHRvIGNoZWNrLCBoYWxmIHdheSB0aHJvdWdoIHRoZSBhcnJheSwgYW5kIHJlYWQgdGhlIHZh
bHVlLgorICAgICAgICBpbnQgcG9zID0gKHNpemUgLSAxKSA+PiAxOworICAgICAgICBLZXlUeXBl
IHZhbCA9IGV4dHJhY3RLZXkoJmFycmF5W3Bvc10pOworCisgICAgICAgIC8vIElmIHRoZSBrZXkg
bWF0Y2hlcywgc3VjY2VzcyEKKyAgICAgICAgaWYgKHZhbCA9PSBrZXkpCisgICAgICAgICAgICBy
ZXR1cm4gJmFycmF5W3Bvc107CisgICAgICAgIC8vIFRoZSBpdGVtIHdlIGFyZSBsb29raW5nIGZv
ciBpcyBzbWFsbGVyIHRoYW4gdGhlIGl0ZW0gYmVpbmcgY2hlY2s7IHJlZHVjZSB0aGUgdmFsdWUg
b2YgJ3NpemUnLAorICAgICAgICAvLyBjaG9wcGluZyBvZmYgdGhlIHJpZ2h0IGhhbmQgaGFsZiBv
ZiB0aGUgYXJyYXkuCisgICAgICAgIGVsc2UgaWYgKGtleSA8IHZhbCkKKyAgICAgICAgICAgIHNp
emUgPSBwb3M7CisgICAgICAgIC8vIERpc2NhcmQgYWxsIHZhbHVlcyBpbiB0aGUgbGVmdCBoYW5k
IGhhbGYgb2YgdGhlIGFycmF5LCB1cCB0byBhbmQgaW5jbHVkaW5nIHRoZSBpdGVtIGF0IHBvcy4K
KyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBzaXplIC09IChwb3MgKyAxKTsKKyAgICAgICAg
ICAgIGFycmF5ICs9IChwb3MgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEluIGNhc2Ug
b2YgQmluYXJ5U2VhcmNoTW9kZSA9IEtleU11c3RCZVByZXNlbnRJbkFycmF5ICdzaXplJyBzaG91
bGQgbmV2ZXIgcmVhY2ggemVyby4KKyAgICAgICAgaWYgKG1vZGUgPT0gS2V5TXVzdEJlUHJlc2Vu
dEluQXJyYXkpCisgICAgICAgICAgICBBU1NFUlQoc2l6ZSk7CisgICAgfQorCisgICAgLy8gSW4g
Y2FzZSBvZiBCaW5hcnlTZWFyY2hNb2RlID0gS2V5TXVzdEJlUHJlc2VudEluQXJyYXkgaWYgd2Ug
cmVhY2ggdGhpcyBwb2ludAorICAgIC8vIHdlJ3ZlIGNob3BwZWQgZG93biB0byBvbmUgZWxlbWVu
dCwgbm8gbmVlZCB0byBjaGVjayBpdCBtYXRjaGVzCisgICAgaWYgKG1vZGUgPT0gS2V5TXVzdEJl
UHJlc2VudEluQXJyYXkpIHsKKyAgICAgICAgQVNTRVJUKHNpemUgPT0gMSk7CisgICAgICAgIEFT
U0VSVChrZXkgPT0gZXh0cmFjdEtleSgmYXJyYXlbMF0pKTsKKyAgICB9CisKKyAgICByZXR1cm4g
JmFycmF5WzBdOworfQorCiAvLyBNb2RpZmllZCBiaW5hcnlTZWFyY2goKSBhbGdvcml0aG0gZGVz
aWduZWQgZm9yIGFycmF5LWxpa2UgY2xhc3NlcyB0aGF0IHN1cHBvcnQKIC8vIG9wZXJhdG9yW10g
YnV0IG5vdCBvcGVyYXRvcis9LiBPbmUgZXhhbXBsZSBvZiBhIGNsYXNzIHRoYXQgcXVhbGlmaWVz
IGlzCiAvLyBTZWdtZW50ZWRWZWN0b3IuCg==
</data>
<flag name="review"
          id="109141"
          type_id="1"
          status="+"
          setter="oliver"
    />
          </attachment>
      

    </bug>

</bugzilla>