<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:1.2em 0px!important">Hi,</p>
<p style="margin:1.2em 0px!important">You will probably need to override the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">pytest_runtestloop</code> hook. Here’s pytest’s implementation in <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">main.py</code>:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-python" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline;white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;background:rgb(35,36,31);color:rgb(248,248,242)"><span class="hljs-function" style="color:rgb(249,38,114)"><span class="hljs-keyword" style="color:rgb(249,38,114);color:rgb(102,217,239)">def</span> <span class="hljs-title" style="color:rgb(166,226,46)">pytest_runtestloop</span><span class="hljs-params" style="color:rgb(248,248,242)">(session)</span>:</span>
    <span class="hljs-keyword" style="color:rgb(249,38,114)">if</span> (session.testsfailed <span class="hljs-keyword" style="color:rgb(249,38,114)">and</span>
            <span class="hljs-keyword" style="color:rgb(249,38,114)">not</span> session.config.option.continue_on_collection_errors):
        <span class="hljs-keyword" style="color:rgb(249,38,114)">raise</span> session.Interrupted(
            <span class="hljs-string" style="color:rgb(230,219,116)">&quot;%d errors during collection&quot;</span> % session.testsfailed)

    <span class="hljs-keyword" style="color:rgb(249,38,114)">if</span> session.config.option.collectonly:
        <span class="hljs-keyword" style="color:rgb(249,38,114)">return</span> <span class="hljs-keyword" style="color:rgb(249,38,114)">True</span>

    <span class="hljs-keyword" style="color:rgb(249,38,114)">for</span> i, item <span class="hljs-keyword" style="color:rgb(249,38,114)">in</span> enumerate(session.items):
        nextitem = session.items[i + <span class="hljs-number" style="color:rgb(174,129,255)">1</span>] <span class="hljs-keyword" style="color:rgb(249,38,114)">if</span> i + <span class="hljs-number" style="color:rgb(174,129,255)">1</span> &lt; len(session.items) <span class="hljs-keyword" style="color:rgb(249,38,114)">else</span> <span class="hljs-keyword" style="color:rgb(249,38,114)">None</span>
        item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
        <span class="hljs-keyword" style="color:rgb(249,38,114)">if</span> session.shouldfail:
            <span class="hljs-keyword" style="color:rgb(249,38,114)">raise</span> session.Failed(session.shouldfail)
        <span class="hljs-keyword" style="color:rgb(249,38,114)">if</span> session.shouldstop:
            <span class="hljs-keyword" style="color:rgb(249,38,114)">raise</span> session.Interrupted(session.shouldstop)
    <span class="hljs-keyword" style="color:rgb(249,38,114)">return</span> <span class="hljs-keyword" style="color:rgb(249,38,114)">True</span>
</code></pre>
<p style="margin:1.2em 0px!important">You should be able customize the <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">for</code> loop to fit your requirements.</p>
<p style="margin:1.2em 0px!important">You will need to keep the runtest reports around somewhere if you need to see if a test item has passed or not, there’s an example on how to do that here:</p>
<p style="margin:1.2em 0px!important"><a href="http://pytest.readthedocs.io/en/latest/example/simple.html#making-test-result-information-available-in-fixtures">http://pytest.readthedocs.io/en/latest/example/simple.html#making-test-result-information-available-in-fixtures</a></p>
<p style="margin:1.2em 0px!important">In this example each test item gets a <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);background-color:rgb(248,248,248);border-radius:3px;display:inline">rep_&lt;when&gt;</code> attribute with the report object.</p>
<p style="margin:1.2em 0px!important">Hope this helps!</p>
<p style="margin:1.2em 0px!important">Cheers,<br>Bruno.</p>
<p style="margin:1.2em 0px!important">On Mon, Nov 27, 2017 at 2:21 PM arun kali raja <a href="http://mailto:arunsep886@gmail.com">arunsep886@gmail.com</a> wrote:</p>
<p style="margin:1.2em 0px!important"></p><div class="markdown-here-exclude"><p></p><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,
<div><br></div><div>Currently pytest creates an item object for each of the testcase and then puts them in a list. During run phase it serially pics one item after the other and runs the testcases one after the other.</div><div><br>I have a requirement where the next testcase to run has to be chosen dynamically based on the pass or fail criteria of the previous testcase..</div><div><br></div><div>Say i logically arrange by testcases in a tree structure like below:</div><div><br></div><div><img src="cid:ii_15ffe4432caf8c4e" alt="image.png" class="" style="max-width: 100%;"><div id="eFrame-dbc873b861e3e4d84b016831" class="m-encrypt-frame" style="display:block"><a class="m-frame-close">×</a>              <button id="undoBtn" class="m-btn m-encrypt-button" type="button" style="display:none"><i class="m-icon m-icon-undo"></i></button>               <button id="editorBtn" class="m-btn m-encrypt-button" type="button" style=""><i class="m-icon m-icon-editor"></i></button>               </div><div id="eFrame-fd9098efc7d848e59f329f" class="m-encrypt-frame" style="display:block"><a class="m-frame-close">×</a>              <button id="undoBtn" class="m-btn m-encrypt-button" type="button" style="display:none"><i class="m-icon m-icon-undo"></i></button>               <button id="editorBtn" class="m-btn m-encrypt-button" type="button" style=""><i class="m-icon m-icon-editor"></i></button>               </div><div id="eFrame-963f9e767f65ca58a6f2166" class="m-encrypt-frame" style="display:block"><a class="m-frame-close">×</a>              <button id="undoBtn" class="m-btn m-encrypt-button" type="button" style="display:none"><i class="m-icon m-icon-undo"></i></button>               <button id="editorBtn" class="m-btn m-encrypt-button" type="button" style=""><i class="m-icon m-icon-editor"></i></button>               </div><br></div><div>So if Test_A passed then test_B can be executed or else Test_C has to be executed. And so forth.. </div><div><br></div><div><br></div><div>There could be a scenarios:</div><div><br></div><div>1. where say i may have to run a single level for multiple iterations to verify if i am getting a stable result at a particular level.</div><div><br></div><div>2. Say through some internal logic i selected Test_H and it has failed. I may now decide to run Test_F and see if it passes. </div><div><br></div><div><div><span style="color:rgb(6,40,126);font-family:Consolas,Menlo,&quot;Deja Vu Sans Mono&quot;,&quot;Bitstream Vera Sans Mono&quot;,monospace;font-size:15.3px;white-space:pre-wrap;background-color:rgb(238,238,238)">pytest_runtest_teardown </span>And seems to get the nextItem directly so how to control what is the nextItem to be executed.Is there any existing hook i can use to do this.. Or can i implement a new hook to do such things???<br></div></div><div><br></div><div><br></div></div>
_______________________________________________<br>
testing-in-python mailing list<br>
<a href="mailto:testing-in-python@lists.idyll.org" target="_blank">testing-in-python@lists.idyll.org</a><br>
<a href="http://lists.idyll.org/listinfo/testing-in-python" rel="noreferrer" target="_blank">http://lists.idyll.org/listinfo/testing-in-python</a><br>
</blockquote><p></p></div><p style="margin:1.2em 0px!important"></p>
<div title="MDH:SGksPGRpdj48YnI+PC9kaXY+PGRpdj5Zb3Ugd2lsbCBwcm9iYWJseSBuZWVkIHRvIG92ZXJyaWRl
IHRoZSBgcHl0ZXN0X3J1bnRlc3Rsb29wYCBob29rLiBIZXJlJ3MgcHl0ZXN0J3MgaW1wbGVtZW50
YXRpb24gaW4gYG1haW4ucHlgOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgcHl0aG9uPC9k
aXY+PGRpdj48ZGl2PmRlZiBweXRlc3RfcnVudGVzdGxvb3Aoc2Vzc2lvbik6PC9kaXY+PGRpdj4m
bmJzcDsgJm5ic3A7IGlmIChzZXNzaW9uLnRlc3RzZmFpbGVkIGFuZDwvZGl2PjxkaXY+Jm5ic3A7
ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgbm90IHNlc3Npb24uY29uZmlnLm9w
dGlvbi5jb250aW51ZV9vbl9jb2xsZWN0aW9uX2Vycm9ycyk6PC9kaXY+PGRpdj4mbmJzcDsgJm5i
c3A7ICZuYnNwOyAmbmJzcDsgcmFpc2Ugc2Vzc2lvbi5JbnRlcnJ1cHRlZCg8L2Rpdj48ZGl2PiZu
YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICIlZCBlcnJvcnMgZHVyaW5n
IGNvbGxlY3Rpb24iICUgc2Vzc2lvbi50ZXN0c2ZhaWxlZCk8L2Rpdj48ZGl2Pjxicj48L2Rpdj48
ZGl2PiZuYnNwOyAmbmJzcDsgaWYgc2Vzc2lvbi5jb25maWcub3B0aW9uLmNvbGxlY3Rvbmx5Ojwv
ZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IHJldHVybiBUcnVlPC9kaXY+PGRp
dj48YnI+PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7IGZvciBpLCBpdGVtIGluIGVudW1lcmF0ZShz
ZXNzaW9uLml0ZW1zKTo8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBuZXh0
aXRlbSA9IHNlc3Npb24uaXRlbXNbaSArIDFdIGlmIGkgKyAxICZsdDsgbGVuKHNlc3Npb24uaXRl
bXMpIGVsc2UgTm9uZTwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7IGl0ZW0u
Y29uZmlnLmhvb2sucHl0ZXN0X3J1bnRlc3RfcHJvdG9jb2woaXRlbT1pdGVtLCBuZXh0aXRlbT1u
ZXh0aXRlbSk8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyBpZiBzZXNzaW9u
LnNob3VsZGZhaWw6PC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7
ICZuYnNwOyByYWlzZSBzZXNzaW9uLkZhaWxlZChzZXNzaW9uLnNob3VsZGZhaWwpPC9kaXY+PGRp
dj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgaWYgc2Vzc2lvbi5zaG91bGRzdG9wOjwvZGl2
PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgcmFpc2Ugc2Vz
c2lvbi5JbnRlcnJ1cHRlZChzZXNzaW9uLnNob3VsZHN0b3ApPC9kaXY+PGRpdj4mbmJzcDsgJm5i
c3A7IHJldHVybiBUcnVlPC9kaXY+PC9kaXY+PGRpdj5gYGA8L2Rpdj48ZGl2Pjxicj48L2Rpdj48
ZGl2PllvdSBzaG91bGQgYmUgYWJsZSBjdXN0b21pemUgdGhlIGBmb3JgIGxvb3AgdG8gZml0IHlv
dXIgcmVxdWlyZW1lbnRzLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+WW91IHdpbGwgbmVlZCB0
byBrZWVwIHRoZSBydW50ZXN0IHJlcG9ydHMgYXJvdW5kIHNvbWV3aGVyZSBpZiB5b3UgbmVlZCB0
byBzZWUgaWYgYSB0ZXN0IGl0ZW0gaGFzIHBhc3NlZCBvciBub3QsIHRoZXJlJ3MgYW4gZXhhbXBs
ZSBvbiBob3cgdG8gZG8gdGhhdCBoZXJlOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+aHR0cDov
L3B5dGVzdC5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvZXhhbXBsZS9zaW1wbGUuaHRtbCNtYWtp
bmctdGVzdC1yZXN1bHQtaW5mb3JtYXRpb24tYXZhaWxhYmxlLWluLWZpeHR1cmVzPGJyPjwvZGl2
PjxkaXY+PGJyPjwvZGl2PjxkaXY+SW4gdGhpcyBleGFtcGxlIGVhY2ggdGVzdCBpdGVtIGdldHMg
YSBgcmVwXyZsdDt3aGVuJmd0O2AgYXR0cmlidXRlIHdpdGggdGhlIHJlcG9ydCBvYmplY3QuPC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj5Ib3BlIHRoaXMgaGVscHMhPC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj5DaGVlcnMsPC9kaXY+PGRpdj5CcnVuby48L2Rpdj48ZGl2Pjxicj48YnI+PGRpdiBj
bGFzcz0iZ21haWxfcXVvdGUiPjxkaXYgZGlyPSJsdHIiPk9uIE1vbiwgTm92IDI3LCAyMDE3IGF0
IDI6MjEgUE0gYXJ1biBrYWxpIHJhamEgJmx0O2FydW5zZXA4ODZAZ21haWwuY29tJmd0OyB3cm90
ZTo8YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2lu
OjAgMCAwIC44ZXg7Ym9yZGVyLWxlZnQ6MXB4ICNjY2Mgc29saWQ7cGFkZGluZy1sZWZ0OjFleDsi
PjxkaXYgZGlyPSJsdHIiPkhpLAo8ZGl2Pjxicj48L2Rpdj48ZGl2PkN1cnJlbnRseSBweXRlc3Qg
Y3JlYXRlcyBhbiBpdGVtIG9iamVjdCBmb3IgZWFjaCBvZiB0aGUgdGVzdGNhc2UgYW5kIHRoZW4g
cHV0cyB0aGVtIGluIGEgbGlzdC4gRHVyaW5nIHJ1biBwaGFzZSBpdCBzZXJpYWxseSBwaWNzIG9u
ZSBpdGVtIGFmdGVyIHRoZSBvdGhlciBhbmQgcnVucyB0aGUgdGVzdGNhc2VzIG9uZSBhZnRlciB0
aGUgb3RoZXIuPC9kaXY+PGRpdj48YnI+SSBoYXZlIGEgcmVxdWlyZW1lbnQgd2hlcmUgdGhlIG5l
eHQgdGVzdGNhc2UgdG8gcnVuIGhhcyB0byBiZSBjaG9zZW4gZHluYW1pY2FsbHkgYmFzZWQgb24g
dGhlIHBhc3Mgb3IgZmFpbCBjcml0ZXJpYSBvZiB0aGUgcHJldmlvdXMgdGVzdGNhc2UuLjwvZGl2
PjxkaXY+PGJyPjwvZGl2PjxkaXY+U2F5IGkgbG9naWNhbGx5IGFycmFuZ2UgYnkgdGVzdGNhc2Vz
IGluIGEgdHJlZSBzdHJ1Y3R1cmUgbGlrZSBiZWxvdzo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2
PjxkaXYganN0Y2FjaGU9IjQxMzYiIGRhdGEtZHJhZnQtYXR0YWNobWVudC1pZD0iaWlfMTVmZmU0
NDMyY2FmOGM0ZSIgY29udGVudGVkaXRhYmxlPSJmYWxzZSIgY2xhc3M9IkxtIExtLWlpXzE1ZmZl
NDQzMmNhZjhjNGUiIGpzYW49InQtXzg1aVJvVTc0WE0sNy5MbSw3LkxtLWlpXzE1ZmZlNDQzMmNh
ZjhjNGUsMC5kYXRhLWRyYWZ0LWF0dGFjaG1lbnQtaWQsMC5jb250ZW50ZWRpdGFibGUiPjxkaXYg
Y2xhc3M9Inl4Ij48ZGl2IGNsYXNzPSJtQVZ0UmQiPjxpbWcgZGF0YS1zdXJsPSJjaWQ6aWlfMTVm
ZmU0NDMyY2FmOGM0ZSIgc3JjPSJodHRwczovL21haWwuZ29vZ2xlLmNvbS9tYWlsL3UvMD91aT0y
JmFtcDtpaz1iNjQ1MWRhYTIxJmFtcDthdHRpZD0wLjAuMSZhbXA7dGg9MTVmZmU0ODZhZDMyNTNm
MyZhbXA7dmlldz1maW1nJmFtcDtyZWFsYXR0aWQ9aWlfMTVmZmU0NDMyY2FmOGM0ZSZhbXA7ZGlz
cD10aGQmYW1wO2F0dGJpZD1BTkdqZEo4VmMycWtrNkdTamZsd1Z1YTVIVUdfNXdlSGZJaTNTZ1Nf
YklhQnRUTXZNYlV5Zk9VTTF0eU5pdE1Ua08wd1pQUUdDLUY0Nzc4SGk2enMzUklLTi1feHVBbTJV
UTBfdVlPdDdSd3NYdUx2MGgyNGh6RnlKM0RiMGNBJmFtcDthdHM9MjUyNDYwODAwMDAwMCZhbXA7
c3o9dzE2MDAtaDEwMDAiIGFsdD0iaW1hZ2UucG5nIiBjbGFzcz0iR1EiIHN0eWxlPSJtYXgtd2lk
dGg6IDEwMCU7Ij48L2Rpdj48ZGl2IGFyaWEtaGlkZGVuPSJ0cnVlIiBqc3RjYWNoZT0iNDEzMyIg
ZGF0YS1hY3Rpb24tZGF0YT0iIiBkYXRhLWRyYWZ0LWF0dGFjaG1lbnQtaWQ9ImlpXzE1ZmZlNDQz
MmNhZjhjNGUiIGpzYWN0aW9uPSJjbGljazpjb21wb3NlMTA1LnRvZ2dsZV9hdHRhY2htZW50X21l
bnU7bW91c2Vkb3duOmNvbXBvc2UxMDUudG9nZ2xlX2F0dGFjaG1lbnRfbWVudTttb3VzZXVwOmNv
bXBvc2UxMDUudG9nZ2xlX2F0dGFjaG1lbnRfbWVudSIgYXJpYS1sYWJlbD0iaW1hZ2UucG5nIChp
bmxpbmUgYXR0YWNobWVudCksIE9wZW4gbWVudSIgdGFiaW5kZXg9Ii0xIiBjbGFzcz0ieFAgZTEi
IGpzYW49IjcueFAsMC5hcmlhLWhpZGRlbix0LVJ1MjE3NTJiNzVrLDcuZTEsMC5kYXRhLWFjdGlv
bi1kYXRhLDAuZGF0YS1kcmFmdC1hdHRhY2htZW50LWlkLDAuanNhY3Rpb24sMC5hcmlhLWxhYmVs
LDAudGFiaW5kZXgiPjxpbWcgc3Jjc2V0PSIvL3NzbC5nc3RhdGljLmNvbS9idC9DMzM0MUFBN0Ex
QTA3Njc1NjQ2MkVFMkU1Q0Q3MUMxMS8yeC9idHdfaWNfb3ZlcmZsb3dfYmxhY2tfMjRkcF8yeC5w
bmcgMngiIGFsdD0iIiBqc3RjYWNoZT0iNDA1OCIgc3JjPSIvL3NzbC5nc3RhdGljLmNvbS9idC9D
MzM0MUFBN0ExQTA3Njc1NjQ2MkVFMkU1Q0Q3MUMxMS8xeC9idHdfaWNfb3ZlcmZsb3dfYmxhY2tf
MjRkcC5wbmciIGNsYXNzPSJLUyIganNhbj0iNy5LUyw4LnNyYywwLnNyY3NldCwwLmFsdCI+PC9k
aXY+PC9kaXY+PC9kaXY+PGRpdiBpZD0iZUZyYW1lLWZkOTA5OGVmYzdkODQ4ZTU5ZjMyOWYiIGNs
YXNzPSJtLWVuY3J5cHQtZnJhbWUiIHN0eWxlPSJ0b3A6IDg5NnB4OyBsZWZ0OiA2ODEuNDM4cHg7
IGRpc3BsYXk6IGJsb2NrOyI+PGEgY2xhc3M9Im0tZnJhbWUtY2xvc2UiPsOXPC9hPiAgICAgICAg
ICAgICAgPGJ1dHRvbiBpZD0idW5kb0J0biIgY2xhc3M9Im0tYnRuIG0tZW5jcnlwdC1idXR0b24i
IHR5cGU9ImJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij48aSBjbGFzcz0ibS1pY29uIG0t
aWNvbi11bmRvIj48L2k+PC9idXR0b24+ICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZWRpdG9y
QnRuIiBjbGFzcz0ibS1idG4gbS1lbmNyeXB0LWJ1dHRvbiIgdHlwZT0iYnV0dG9uIiBzdHlsZT0i
Ij48aSBjbGFzcz0ibS1pY29uIG0taWNvbi1lZGl0b3IiPjwvaT48L2J1dHRvbj4gICAgICAgICAg
ICAgICA8L2Rpdj48ZGl2IGlkPSJlRnJhbWUtOTYzZjllNzY3ZjY1Y2E1OGE2ZjIxNjYiIGNsYXNz
PSJtLWVuY3J5cHQtZnJhbWUiIHN0eWxlPSJ0b3A6IDg5NnB4OyBsZWZ0OiA2ODEuNDM4cHg7IGRp
c3BsYXk6IGJsb2NrOyI+PGEgY2xhc3M9Im0tZnJhbWUtY2xvc2UiPsOXPC9hPiAgICAgICAgICAg
ICAgPGJ1dHRvbiBpZD0idW5kb0J0biIgY2xhc3M9Im0tYnRuIG0tZW5jcnlwdC1idXR0b24iIHR5
cGU9ImJ1dHRvbiIgc3R5bGU9ImRpc3BsYXk6IG5vbmU7Ij48aSBjbGFzcz0ibS1pY29uIG0taWNv
bi11bmRvIj48L2k+PC9idXR0b24+ICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD0iZWRpdG9yQnRu
IiBjbGFzcz0ibS1idG4gbS1lbmNyeXB0LWJ1dHRvbiIgdHlwZT0iYnV0dG9uIiBzdHlsZT0iIj48
aSBjbGFzcz0ibS1pY29uIG0taWNvbi1lZGl0b3IiPjwvaT48L2J1dHRvbj4gICAgICAgICAgICAg
ICA8L2Rpdj48YnI+PC9kaXY+PGRpdj5TbyBpZiBUZXN0X0EgcGFzc2VkIHRoZW4gdGVzdF9CIGNh
biBiZSBleGVjdXRlZCBvciBlbHNlIFRlc3RfQyBoYXMgdG8gYmUgZXhlY3V0ZWQuIEFuZCBzbyBm
b3J0aC4uJm5ic3A7PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5UaGVy
ZSBjb3VsZCBiZSBhIHNjZW5hcmlvczo8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PjEuIHdoZXJl
IHNheSBpIG1heSBoYXZlIHRvIHJ1biBhIHNpbmdsZSBsZXZlbCBmb3IgbXVsdGlwbGUgaXRlcmF0
aW9ucyB0byB2ZXJpZnkgaWYgaSBhbSBnZXR0aW5nIGEgc3RhYmxlIHJlc3VsdCBhdCBhIHBhcnRp
Y3VsYXIgbGV2ZWwuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj4yLiBTYXkgdGhyb3VnaCBzb21l
IGludGVybmFsIGxvZ2ljIGkgc2VsZWN0ZWQgVGVzdF9IIGFuZCBpdCBoYXMgZmFpbGVkLiBJIG1h
eSBub3cgZGVjaWRlIHRvIHJ1biBUZXN0X0YgYW5kIHNlZSBpZiBpdCBwYXNzZXMuJm5ic3A7PC9k
aXY+PGRpdj48YnI+PC9kaXY+PGRpdj48ZGl2PjxzcGFuIHN0eWxlPSJjb2xvcjpyZ2IoNiw0MCwx
MjYpO2ZvbnQtZmFtaWx5OkNvbnNvbGFzLE1lbmxvLCZxdW90O0RlamEgVnUgU2FucyBNb25vJnF1
b3Q7LCZxdW90O0JpdHN0cmVhbSBWZXJhIFNhbnMgTW9ubyZxdW90Oyxtb25vc3BhY2U7Zm9udC1z
aXplOjE1LjNweDt3aGl0ZS1zcGFjZTpwcmUtd3JhcDtiYWNrZ3JvdW5kLWNvbG9yOnJnYigyMzgs
MjM4LDIzOCkiPnB5dGVzdF9ydW50ZXN0X3RlYXJkb3duIDwvc3Bhbj5BbmQgc2VlbXMgdG8gZ2V0
IHRoZSBuZXh0SXRlbSBkaXJlY3RseSBzbyBob3cgdG8gY29udHJvbCB3aGF0IGlzIHRoZSBuZXh0
SXRlbSB0byBiZSBleGVjdXRlZC5JcyB0aGVyZSBhbnkgZXhpc3RpbmcgaG9vayBpIGNhbiB1c2Ug
dG8gZG8gdGhpcy4uIE9yIGNhbiBpIGltcGxlbWVudCBhIG5ldyBob29rIHRvIGRvIHN1Y2ggdGhp
bmdzPz8/PGJyPjwvZGl2PjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+PGJyPjwvZGl2PjwvZGl2
PgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX188d2JyPl9fX19fX19fX19fX19fX19fPGJy
Pgp0ZXN0aW5nLWluLXB5dGhvbiBtYWlsaW5nIGxpc3Q8YnI+CjxhIGhyZWY9Im1haWx0bzp0ZXN0
aW5nLWluLXB5dGhvbkBsaXN0cy5pZHlsbC5vcmciIHRhcmdldD0iX2JsYW5rIj50ZXN0aW5nLWlu
LXB5dGhvbkBsaXN0cy5pZHlsbC48d2JyPm9yZzwvYT48YnI+CjxhIGhyZWY9Imh0dHA6Ly9saXN0
cy5pZHlsbC5vcmcvbGlzdGluZm8vdGVzdGluZy1pbi1weXRob24iIHJlbD0ibm9yZWZlcnJlciIg
dGFyZ2V0PSJfYmxhbmsiIGRhdGEtc2FmZXJlZGlyZWN0dXJsPSJodHRwczovL3d3dy5nb29nbGUu
Y29tL3VybD9xPWh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vdGVzdGluZy1pbi1weXRo
b24mYW1wO3NvdXJjZT1nbWFpbCZhbXA7dXN0PTE1MTE5NDkyMDk3NzkwMDAmYW1wO3VzZz1BRlFq
Q05GZ0tGQXg1dU5QNVVvQWRwUEJwVEx1b2NZUTd3Ij5odHRwOi8vbGlzdHMuaWR5bGwub3JnL2xp
c3RpbmY8d2JyPm8vdGVzdGluZy1pbi1weXRob248L2E+PGJyPgo8L2Jsb2NrcXVvdGU+PC9kaXY+
PC9kaXY+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>