From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============5744456878933950841==" MIME-Version: 1.0 From: Ernest Zaslavsky Subject: Re: [SPDK] Code robustness test Date: Thu, 08 Feb 2018 09:14:58 +0200 Message-ID: <5a7bf8f5.09f4500a.36022.c5f6@mx.google.com> In-Reply-To: 122B872DCF83AB4DB816E25A2C1AD08D7E91CC65@IRSMSX102.ger.corp.intel.com List-ID: To: spdk@lists.01.org --===============5744456878933950841== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sounds like just what the doctor ordered. Will check it out. Thanks! Sent from Mail for Windows 10 From: Szwed, Maciej Sent: Thursday, February 8, 2018 9:12 AM To: Storage Performance Development Kit Subject: Re: [SPDK] Code robustness test Hi, For reset you can use our error injection framework. You can find it in thi= s location: spdk\lib\bdev\error . You can configure it using RPC commands. = What it basically does is to add another layer on top of existing one (like= NVMe) and simulate errors. It can simulate resets. Let me know if this is = something that you were looking for. Regards, Maciek From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Ernest Zaslavs= ky Sent: Thursday, February 8, 2018 6:57 AM To: Storage Performance Development Kit Subject: Re: [SPDK] Code robustness test Hi Paul, Thanks for your reply. I wasn=E2=80=99t clear enough with my question. Sure= you have tests in SPDK, but I was asking for something that may assist me = in testing my code. I=E2=80=99m writing something that uses NVMe driver. I= =E2=80=99m trying to handle errors where applicable. Now I want to simulate= real world problems which may occur (like controller reset) and see if my = code handles such a situation. Thanks, E. From: Luse, Paul E Sent: Thursday, February 8, 2018 1:37 AM To: Storage Performance Development Kit Subject: Re: [SPDK] Code robustness test Hi, SPDK is tested in =E2=80=9Ctiers=E2=80=9D and nvme is no different other th= an it may have more robust tests than some of the other modules due to its = maturity: - unit tests:=C2=A0 Look in /spdk/test/unit/lib/nvme and you=E2=80=99ll fin= d =E2=80=9Cper file=E2=80=9D unit tests that use C-unit.=C2=A0 These are, o= f course, SW only tests focused around exercising the public API in each fi= le geared towards catching regressions.=C2=A0 Every new public function add= ed is required to have a new unit test. Coverage reports are available on t= he CI page at spdk.io and there are clearly opportunities there for anyone = that wants to beef it up. - component level tests attempt to isolate just a pustular module (sometime= s a few other are required to be involved) and use either real hardware or = run on a VM with emulated NVMe devices.=C2=A0 They are in spdk/test/lib/nvm= e mainly via nvme.sh however you=E2=80=99ll find a few standalone focused t= ests that operate solely on the component, like sgl, in cases where we real= ly want to throw strange things at complicated code (like sgl and prp creat= ion). You=E2=80=99ll find a few other focused tets in here like hotplug.sh = for hotplug testing and aer for Async Event Requests and overhead for laten= cy measurements - system: there are bunch of other tests that use NVMe as a back end but ar= e focused on system level applications that are part of SPDK like the NVMe-= oF target tests, the vHost tests. iSCSI tests, etc. - performance: these are pretty manual right now so there=E2=80=99s not muc= h to point at but as the name implies they=E2=80=99re really about performa= nce stress testing. Basically there=E2=80=99s a TON of tests in the repo. There=E2=80=99s a lot= of activity right now ongoing to beef up the automated testing, to move ou= r CI over to Jenkins and to rework the dozens of bash scripts that control = the various tests.=C2=A0 The goal there is to make it easier for anyone to = come in and find what they are interested in to either understand testing, = help beef it up or reproduce a failure locally that they encountered on a p= atch in CI. After you dig around a little feel free to ask more questions and someone w= ill jump in and provide more detail.=C2=A0 As the effort I just mentioned m= akes progress there will be new docs added to http://spdk.io that explain t= he test strategy and hierarchy in a clear way - we hope =E2=98=BA -Paul From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of E.W.Z. Sent: Wednesday, February 7, 2018 9:14 AM To: Storage Performance Development Kit Subject: [SPDK] Code robustness test Hi, Is there anything that can wreck havoc on NVMe to check how well the code c= opes with it? Something like a script or utility that runs in background an= d resets PCIe controller, detaches disks and anything else that could theor= etically happen to NVMe. Thanks, E. --===============5744456878933950841== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4 bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PUNv bnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPjxtZXRhIG5hbWU9 R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDE1IChmaWx0ZXJlZCBtZWRpdW0pIj48 c3R5bGU+PCEtLQovKiBGb250IERlZmluaXRpb25zICovCkBmb250LWZhY2UKCXtmb250LWZhbWls eTpXaW5nZGluZ3M7CglwYW5vc2UtMTo1IDAgMCAwIDAgMCAwIDAgMCAwO30KQGZvbnQtZmFjZQoJ e2ZvbnQtZmFtaWx5OiJDYW1icmlhIE1hdGgiOwoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIg NDt9CkBmb250LWZhY2UKCXtmb250LWZhbWlseTpDYWxpYnJpOwoJcGFub3NlLTE6MiAxNSA1IDIg MiAyIDQgMyAyIDQ7fQovKiBTdHlsZSBEZWZpbml0aW9ucyAqLwpwLk1zb05vcm1hbCwgbGkuTXNv Tm9ybWFsLCBkaXYuTXNvTm9ybWFsCgl7bWFyZ2luOjBpbjsKCW1hcmdpbi1ib3R0b206LjAwMDFw dDsKCWZvbnQtc2l6ZToxMS4wcHQ7Cglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9 CmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsKCXttc28tc3R5bGUtcHJpb3JpdHk6OTk7Cgljb2xv cjpibHVlOwoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9CmE6dmlzaXRlZCwgc3Bhbi5Nc29I eXBlcmxpbmtGb2xsb3dlZAoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsKCWNvbG9yOiM5NTRGNzI7 Cgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KLk1zb0NocERlZmF1bHQKCXttc28tc3R5bGUt dHlwZTpleHBvcnQtb25seTt9CkBwYWdlIFdvcmRTZWN0aW9uMQoJe3NpemU6OC41aW4gMTEuMGlu OwoJbWFyZ2luOjEuMGluIDEuMGluIDEuMGluIDEuMGluO30KZGl2LldvcmRTZWN0aW9uMQoJe3Bh Z2U6V29yZFNlY3Rpb24xO30KLS0+PC9zdHlsZT48L2hlYWQ+PGJvZHkgbGFuZz1FTi1VUyBsaW5r PWJsdWUgdmxpbms9IiM5NTRGNzIiPjxkaXYgY2xhc3M9V29yZFNlY3Rpb24xPjxwIGNsYXNzPU1z b05vcm1hbD5Tb3VuZHMgbGlrZSBqdXN0IHdoYXQgdGhlIGRvY3RvciBvcmRlcmVkLiBXaWxsIGNo ZWNrIGl0IG91dC4gVGhhbmtzITwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PG86cD4mbmJzcDs8L286 cD48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPjxwIGNsYXNzPU1z b05vcm1hbD5TZW50IGZyb20gPGEgaHJlZj0iaHR0cHM6Ly9nby5taWNyb3NvZnQuY29tL2Z3bGlu ay8/TGlua0lkPTU1MDk4NiI+TWFpbDwvYT4gZm9yIFdpbmRvd3MgMTA8L3A+PHAgY2xhc3M9TXNv Tm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPjxkaXYgc3R5bGU9J21zby1lbGVtZW50OnBhcmEt Ym9yZGVyLWRpdjtib3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFk ZGluZzozLjBwdCAwaW4gMGluIDBpbic+PHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdib3JkZXI6 bm9uZTtwYWRkaW5nOjBpbic+PGI+RnJvbTogPC9iPjxhIGhyZWY9Im1haWx0bzptYWNpZWouc3p3 ZWRAaW50ZWwuY29tIj5TendlZCwgTWFjaWVqPC9hPjxicj48Yj5TZW50OiA8L2I+VGh1cnNkYXks IEZlYnJ1YXJ5IDgsIDIwMTggOToxMiBBTTxicj48Yj5UbzogPC9iPjxhIGhyZWY9Im1haWx0bzpz cGRrQGxpc3RzLjAxLm9yZyI+U3RvcmFnZSBQZXJmb3JtYW5jZSBEZXZlbG9wbWVudCBLaXQ8L2E+ PGJyPjxiPlN1YmplY3Q6IDwvYj5SZTogW1NQREtdIENvZGUgcm9idXN0bmVzcyB0ZXN0PC9wPjwv ZGl2PjxwIGNsYXNzPU1zb05vcm1hbD48bzpwPiZuYnNwOzwvbzpwPjwvcD48cCBjbGFzcz1Nc29O b3JtYWw+PHNwYW4gbGFuZz1QTCBzdHlsZT0nY29sb3I6IzFGNDk3RCc+SGksPG86cD48L286cD48 L3NwYW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nY29sb3I6IzFGNDk3RCc+ Rm9yIHJlc2V0IHlvdSBjYW4gdXNlIG91ciBlcnJvciBpbmplY3Rpb24gZnJhbWV3b3JrLiBZb3Ug Y2FuIGZpbmQgaXQgaW4gdGhpcyBsb2NhdGlvbjogc3Bka1xsaWJcYmRldlxlcnJvciAuIFlvdSBj YW4gY29uZmlndXJlIGl0IHVzaW5nIFJQQyBjb21tYW5kcy4gV2hhdCBpdCBiYXNpY2FsbHkgZG9l cyBpcyB0byBhZGQgYW5vdGhlciBsYXllciBvbiB0b3Agb2YgZXhpc3Rpbmcgb25lIChsaWtlIE5W TWUpIGFuZCBzaW11bGF0ZSBlcnJvcnMuIEl0IGNhbiBzaW11bGF0ZSByZXNldHMuIExldCBtZSBr bm93IGlmIHRoaXMgaXMgc29tZXRoaW5nIHRoYXQgeW91IHdlcmUgbG9va2luZyBmb3IuPG86cD48 L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nY29sb3I6IzFG NDk3RCc+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3Bh biBzdHlsZT0nY29sb3I6IzFGNDk3RCc+UmVnYXJkcyw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAg Y2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz5NYWNpZWs8bzpwPjwv bzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxhIG5hbWU9Il9NYWlsRW5kQ29tcG9z ZSI+PC9hPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPjxkaXY+PGRpdiBzdHlsZT0nYm9yZGVyOm5vbmU7 Ym9yZGVyLXRvcDpzb2xpZCAjRTFFMUUxIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAwaW4n PjxwIGNsYXNzPU1zb05vcm1hbD48YSBuYW1lPSJfX19fX3JlcGx5c2VwYXJhdG9yIj48L2E+PGI+ RnJvbTo8L2I+IFNQREsgW21haWx0bzpzcGRrLWJvdW5jZXNAbGlzdHMuMDEub3JnXSA8Yj5PbiBC ZWhhbGYgT2YgPC9iPkVybmVzdCBaYXNsYXZza3k8YnI+PGI+U2VudDo8L2I+IFRodXJzZGF5LCBG ZWJydWFyeSA4LCAyMDE4IDY6NTcgQU08YnI+PGI+VG86PC9iPiBTdG9yYWdlIFBlcmZvcm1hbmNl IERldmVsb3BtZW50IEtpdCAmbHQ7c3Bka0BsaXN0cy4wMS5vcmcmZ3Q7PGJyPjxiPlN1YmplY3Q6 PC9iPiBSZTogW1NQREtdIENvZGUgcm9idXN0bmVzcyB0ZXN0PG86cD48L286cD48L3A+PC9kaXY+ PC9kaXY+PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIGxhbmc9UEw+PG86cD4mbmJzcDs8L286cD48 L3NwYW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD5IaSBQYXVsLDxvOnA+PC9vOnA+PC9wPjxwIGNs YXNzPU1zb05vcm1hbD5UaGFua3MgZm9yIHlvdXIgcmVwbHkuIEkgd2FzbuKAmXQgY2xlYXIgZW5v dWdoIHdpdGggbXkgcXVlc3Rpb24uIFN1cmUgeW91IGhhdmUgdGVzdHMgaW4gU1BESywgYnV0IEkg d2FzIGFza2luZyBmb3Igc29tZXRoaW5nIHRoYXQgbWF5IGFzc2lzdCBtZSBpbiB0ZXN0aW5nIG15 IGNvZGUuIEnigJltIHdyaXRpbmcgc29tZXRoaW5nIHRoYXQgdXNlcyBOVk1lIGRyaXZlci4gSeKA mW0gdHJ5aW5nIHRvIGhhbmRsZSBlcnJvcnMgd2hlcmUgYXBwbGljYWJsZS4gTm93IEkgd2FudCB0 byBzaW11bGF0ZSByZWFsIHdvcmxkIHByb2JsZW1zIHdoaWNoIG1heSBvY2N1ciAobGlrZSBjb250 cm9sbGVyIHJlc2V0KSBhbmQgc2VlIGlmIG15IGNvZGUgaGFuZGxlcyBzdWNoIGEgc2l0dWF0aW9u LjxvOnA+PC9vOnA+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD5UaGFua3MsPG86cD48L286cD48L3A+ PHAgY2xhc3M9TXNvTm9ybWFsPkUuPG86cD48L286cD48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxv OnA+Jm5ic3A7PC9vOnA+PC9wPjxkaXYgc3R5bGU9J2JvcmRlcjpub25lO2JvcmRlci10b3A6c29s aWQgI0UxRTFFMSAxLjBwdDtwYWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluJz48cCBjbGFzcz1Nc29O b3JtYWw+PGI+RnJvbTogPC9iPjxhIGhyZWY9Im1haWx0bzpwYXVsLmUubHVzZUBpbnRlbC5jb20i Pkx1c2UsIFBhdWwgRTwvYT48YnI+PGI+U2VudDogPC9iPlRodXJzZGF5LCBGZWJydWFyeSA4LCAy MDE4IDE6MzcgQU08YnI+PGI+VG86IDwvYj48YSBocmVmPSJtYWlsdG86c3Bka0BsaXN0cy4wMS5v cmciPlN0b3JhZ2UgUGVyZm9ybWFuY2UgRGV2ZWxvcG1lbnQgS2l0PC9hPjxicj48Yj5TdWJqZWN0 OiA8L2I+UmU6IFtTUERLXSBDb2RlIHJvYnVzdG5lc3MgdGVzdDxvOnA+PC9vOnA+PC9wPjwvZGl2 PjxwIGNsYXNzPU1zb05vcm1hbD48bzpwPiZuYnNwOzwvbzpwPjwvcD48cCBjbGFzcz1Nc29Ob3Jt YWw+PHNwYW4gc3R5bGU9J2NvbG9yOiMxRjQ5N0QnPkhpLDxvOnA+PC9vOnA+PC9zcGFuPjwvcD48 cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2NvbG9yOiMxRjQ5N0QnPjxvOnA+Jm5ic3A7 PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2NvbG9yOiMx RjQ5N0QnPlNQREsgaXMgdGVzdGVkIGluIOKAnHRpZXJz4oCdIGFuZCBudm1lIGlzIG5vIGRpZmZl cmVudCBvdGhlciB0aGFuIGl0IG1heSBoYXZlIG1vcmUgcm9idXN0IHRlc3RzIHRoYW4gc29tZSBv ZiB0aGUgb3RoZXIgbW9kdWxlcyBkdWUgdG8gaXRzIG1hdHVyaXR5OjxvOnA+PC9vOnA+PC9zcGFu PjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2NvbG9yOiMxRjQ5N0QnPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PHNwYW4gc3R5bGU9J2Nv bG9yOiMxRjQ5N0QnPi0gdW5pdCB0ZXN0czombmJzcDsgTG9vayBpbiAvc3Bkay90ZXN0L3VuaXQv bGliL252bWUgYW5kIHlvdeKAmWxsIGZpbmQg4oCccGVyIGZpbGXigJ0gdW5pdCB0ZXN0cyB0aGF0 IHVzZSBDLXVuaXQuJm5ic3A7IFRoZXNlIGFyZSwgb2YgY291cnNlLCBTVyBvbmx5IHRlc3RzIGZv Y3VzZWQgYXJvdW5kIGV4ZXJjaXNpbmcgdGhlIHB1YmxpYyBBUEkgaW4gZWFjaCBmaWxlIGdlYXJl ZCB0b3dhcmRzIGNhdGNoaW5nIHJlZ3Jlc3Npb25zLiZuYnNwOyBFdmVyeSBuZXcgcHVibGljIGZ1 bmN0aW9uIGFkZGVkIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSBuZXcgdW5pdCB0ZXN0LiBDb3ZlcmFn ZSByZXBvcnRzIGFyZSBhdmFpbGFibGUgb24gdGhlIENJIHBhZ2UgYXQgc3Bkay5pbyBhbmQgdGhl cmUgYXJlIGNsZWFybHkgb3Bwb3J0dW5pdGllcyB0aGVyZSBmb3IgYW55b25lIHRoYXQgd2FudHMg dG8gYmVlZiBpdCB1cC48bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxz cGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz4tIGNvbXBvbmVudCBsZXZlbCB0ZXN0cyBhdHRlbXB0 IHRvIGlzb2xhdGUganVzdCBhIHB1c3R1bGFyIG1vZHVsZSAoc29tZXRpbWVzIGEgZmV3IG90aGVy IGFyZSByZXF1aXJlZCB0byBiZSBpbnZvbHZlZCkgYW5kIHVzZSBlaXRoZXIgcmVhbCBoYXJkd2Fy ZSBvciBydW4gb24gYSBWTSB3aXRoIGVtdWxhdGVkIE5WTWUgZGV2aWNlcy4mbmJzcDsgVGhleSBh cmUgaW4gc3Bkay90ZXN0L2xpYi9udm1lIG1haW5seSB2aWEgbnZtZS5zaCBob3dldmVyIHlvdeKA mWxsIGZpbmQgYSBmZXcgc3RhbmRhbG9uZSBmb2N1c2VkIHRlc3RzIHRoYXQgb3BlcmF0ZSBzb2xl bHkgb24gdGhlIGNvbXBvbmVudCwgbGlrZSBzZ2wsIGluIGNhc2VzIHdoZXJlIHdlIHJlYWxseSB3 YW50IHRvIHRocm93IHN0cmFuZ2UgdGhpbmdzIGF0IGNvbXBsaWNhdGVkIGNvZGUgKGxpa2Ugc2ds IGFuZCBwcnAgY3JlYXRpb24pLiBZb3XigJlsbCBmaW5kIGEgZmV3IG90aGVyIGZvY3VzZWQgdGV0 cyBpbiBoZXJlIGxpa2UgaG90cGx1Zy5zaCBmb3IgaG90cGx1ZyB0ZXN0aW5nIGFuZCBhZXIgZm9y IEFzeW5jIEV2ZW50IFJlcXVlc3RzIGFuZCBvdmVyaGVhZCBmb3IgbGF0ZW5jeSBtZWFzdXJlbWVu dHM8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdj b2xvcjojMUY0OTdEJz4tIHN5c3RlbTogdGhlcmUgYXJlIGJ1bmNoIG9mIG90aGVyIHRlc3RzIHRo YXQgdXNlIE5WTWUgYXMgYSBiYWNrIGVuZCBidXQgYXJlIGZvY3VzZWQgb24gc3lzdGVtIGxldmVs IGFwcGxpY2F0aW9ucyB0aGF0IGFyZSBwYXJ0IG9mIFNQREsgbGlrZSB0aGUgTlZNZS1vRiB0YXJn ZXQgdGVzdHMsIHRoZSB2SG9zdCB0ZXN0cy4gaVNDU0kgdGVzdHMsIGV0Yy48bzpwPjwvbzpwPjwv c3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz4t IHBlcmZvcm1hbmNlOiB0aGVzZSBhcmUgcHJldHR5IG1hbnVhbCByaWdodCBub3cgc28gdGhlcmXi gJlzIG5vdCBtdWNoIHRvIHBvaW50IGF0IGJ1dCBhcyB0aGUgbmFtZSBpbXBsaWVzIHRoZXnigJly ZSByZWFsbHkgYWJvdXQgcGVyZm9ybWFuY2Ugc3RyZXNzIHRlc3RpbmcuPG86cD48L286cD48L3Nw YW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nY29sb3I6IzFGNDk3RCc+PG86 cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0n Y29sb3I6IzFGNDk3RCc+QmFzaWNhbGx5IHRoZXJl4oCZcyBhIFRPTiBvZiB0ZXN0cyBpbiB0aGUg cmVwby4gVGhlcmXigJlzIGEgbG90IG9mIGFjdGl2aXR5IHJpZ2h0IG5vdyBvbmdvaW5nIHRvIGJl ZWYgdXAgdGhlIGF1dG9tYXRlZCB0ZXN0aW5nLCB0byBtb3ZlIG91ciBDSSBvdmVyIHRvIEplbmtp bnMgYW5kIHRvIHJld29yayB0aGUgZG96ZW5zIG9mIGJhc2ggc2NyaXB0cyB0aGF0IGNvbnRyb2wg dGhlIHZhcmlvdXMgdGVzdHMuJm5ic3A7IFRoZSBnb2FsIHRoZXJlIGlzIHRvIG1ha2UgaXQgZWFz aWVyIGZvciBhbnlvbmUgdG8gY29tZSBpbiBhbmQgZmluZCB3aGF0IHRoZXkgYXJlIGludGVyZXN0 ZWQgaW4gdG8gZWl0aGVyIHVuZGVyc3RhbmQgdGVzdGluZywgaGVscCBiZWVmIGl0IHVwIG9yIHJl cHJvZHVjZSBhIGZhaWx1cmUgbG9jYWxseSB0aGF0IHRoZXkgZW5jb3VudGVyZWQgb24gYSBwYXRj aCBpbiBDSS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0 eWxlPSdjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9 TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz5BZnRlciB5b3UgZGlnIGFyb3Vu ZCBhIGxpdHRsZSBmZWVsIGZyZWUgdG8gYXNrIG1vcmUgcXVlc3Rpb25zIGFuZCBzb21lb25lIHdp bGwganVtcCBpbiBhbmQgcHJvdmlkZSBtb3JlIGRldGFpbC4mbmJzcDsgQXMgdGhlIGVmZm9ydCBJ IGp1c3QgbWVudGlvbmVkIG1ha2VzIHByb2dyZXNzIHRoZXJlIHdpbGwgYmUgbmV3IGRvY3MgYWRk ZWQgdG8gPGEgaHJlZj0iaHR0cDovL3NwZGsuaW8iPmh0dHA6Ly9zcGRrLmlvPC9hPiB0aGF0IGV4 cGxhaW4gdGhlIHRlc3Qgc3RyYXRlZ3kgYW5kIGhpZXJhcmNoeSBpbiBhIGNsZWFyIHdheSAtIHdl IGhvcGUgPC9zcGFuPjxzcGFuIHN0eWxlPSdmb250LWZhbWlseTpXaW5nZGluZ3M7Y29sb3I6IzFG NDk3RCc+Sjwvc3Bhbj48c3BhbiBzdHlsZT0nY29sb3I6IzFGNDk3RCc+PG86cD48L286cD48L3Nw YW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0nY29sb3I6IzFGNDk3RCc+PG86 cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48c3BhbiBzdHlsZT0n Y29sb3I6IzFGNDk3RCc+LVBhdWw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9y bWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48 L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xvcjojMUY0OTdEJz48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxzcGFuIHN0eWxlPSdjb2xv cjojMUY0OTdEJz48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+PGRpdj48ZGl2IHN0eWxlPSdi b3JkZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBwdCAw aW4gMGluIDBpbic+PHAgY2xhc3M9TXNvTm9ybWFsPjxiPkZyb206PC9iPiBTUERLIFs8YSBocmVm PSJtYWlsdG86c3Bkay1ib3VuY2VzQGxpc3RzLjAxLm9yZyI+bWFpbHRvOnNwZGstYm91bmNlc0Bs aXN0cy4wMS5vcmc8L2E+XSA8Yj5PbiBCZWhhbGYgT2YgPC9iPkUuVy5aLjxicj48Yj5TZW50Ojwv Yj4gV2VkbmVzZGF5LCBGZWJydWFyeSA3LCAyMDE4IDk6MTQgQU08YnI+PGI+VG86PC9iPiBTdG9y YWdlIFBlcmZvcm1hbmNlIERldmVsb3BtZW50IEtpdCAmbHQ7PGEgaHJlZj0ibWFpbHRvOnNwZGtA bGlzdHMuMDEub3JnIj5zcGRrQGxpc3RzLjAxLm9yZzwvYT4mZ3Q7PGJyPjxiPlN1YmplY3Q6PC9i PiBbU1BES10gQ29kZSByb2J1c3RuZXNzIHRlc3Q8bzpwPjwvbzpwPjwvcD48L2Rpdj48L2Rpdj48 cCBjbGFzcz1Nc29Ob3JtYWw+PG86cD4mbmJzcDs8L286cD48L3A+PHAgY2xhc3M9TXNvTm9ybWFs PkhpLDxvOnA+PC9vOnA+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD5JcyB0aGVyZSBhbnl0aGluZyB0 aGF0IGNhbiB3cmVjayBoYXZvYyBvbiBOVk1lIHRvIGNoZWNrIGhvdyB3ZWxsIHRoZSBjb2RlIGNv cGVzIHdpdGggaXQ/IFNvbWV0aGluZyBsaWtlIGEgc2NyaXB0IG9yIHV0aWxpdHkgdGhhdCBydW5z IGluIGJhY2tncm91bmQgYW5kIHJlc2V0cyBQQ0llIGNvbnRyb2xsZXIsIGRldGFjaGVzIGRpc2tz IGFuZCBhbnl0aGluZyBlbHNlIHRoYXQgY291bGQgdGhlb3JldGljYWxseSBoYXBwZW4gdG8gTlZN ZS48bzpwPjwvbzpwPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+VGhhbmtzLDxvOnA+PC9vOnA+PC9w PjxwIGNsYXNzPU1zb05vcm1hbD5FLjxvOnA+PC9vOnA+PC9wPjxwIGNsYXNzPU1zb05vcm1hbD48 bzpwPiZuYnNwOzwvbzpwPjwvcD48cCBjbGFzcz1Nc29Ob3JtYWw+PG86cD4mbmJzcDs8L286cD48 L3A+PHAgY2xhc3M9TXNvTm9ybWFsPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPjwvZGl2PjwvYm9keT48 L2h0bWw+ --===============5744456878933950841==--