From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============4664312280309620082==" MIME-Version: 1.0 From: Harris, James R Subject: Re: [SPDK] BDEV-IO Lifecycle - Need your input. Date: Thu, 21 Jun 2018 18:20:34 +0000 Message-ID: <85F121BB-8345-46FC-B9D7-DAEADAA05A2A@intel.com> In-Reply-To: DM6PR06MB3881D64EC0CC5793E59B09F0EB770@DM6PR06MB3881.namprd06.prod.outlook.com List-ID: To: spdk@lists.01.org --===============4664312280309620082== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi Srikanth, Following up on this thread and the discussion in yesterday=E2=80=99s commu= nity meeting. The recent spdk_bdev_queue_io_wait() changes allow an SPDK application to w= ork better in general when the spdk_bdev_io buffer pool is exhausted. We s= till need to make changes to the NVMe-oF target to use this new API but tha= t should be done soon-ish. With that in place, the spdk_bdev_io buffer pool itself can be configured u= p or down when the application starts. Currently the default is 64K spdk_b= dev_io buffers. sizeof(struct spdk_bdev_io) =3D=3D 216 plus the per-IO con= text size allocated for the bdev module. This can be up to 192 bytes (virt= io bdev module) but is likely much smaller for you depending on the context= size for your ontap bdev module. Let=E2=80=99s assume your per-IO context size is 64 bytes. 64K x (192 + 64= ) =3D 16MB. I=E2=80=99m not sure how many spdk_bdev_io you need in flight at any given = time. 64K seems like a lot but I=E2=80=99d be curious to hear your thought= s on this. If this is the right number, then worst case, there would be ab= out 16MB of DRAM that would sit unused if the NVMe-oF target in your system= was not active. Is that too burdensome for your application? Thanks, -Jim From: "Kaligotla, Srikanth" Date: Wednesday, June 20, 2018 at 12:47 PM To: "Walker, Benjamin" , James Harris , Daniel Verkamp Cc: "raju.gottumukkala(a)broadcom.com" , = "Meneghini, John" , "Rodriguez, Edwin" , "Pai, Madhu" , "NGC-john= .barnard-broadcom.com" , "spdk(a)lists.01.org"= Subject: RE: BDEV-IO Lifecycle - Need your input. Hello, First revision of changes to extend the lifecycle of bdev_io are available = for review. I would like to solicit your input on the proposed API/Code flo= w changes. https://review.gerrithub.io/c/spdk/spdk/+/415860 Thanks, Srikanth From: "Kaligotla, Srikanth" > Date: Friday, May 11, 2018 at 2:27 PM To: "Walker, Benjamin" >, "Harris, James R" > Cc: "raju.gottumukkala(a)broadcom.com" >, "Meneghini, John" >, "Rodriguez, Edwin" >, "Pai, Madhu" >, "NGC-john.barnard-broadcom.com" >, "spdk(a)lists.01.org" > Subject: RE: BDEV-IO Lifecycle - Need your input. CC: List Hi Ben, Your proposal to inter= face with the backend to acquire and release buffers is good. You have accu= rately stated that the challenge is in developing intuitive semantics. And = that has been my struggle. To me, there are two problem statements; 1. It is expected that bdev_io pool is sized correctly so the call to= get bdev_io succeeds. Failure to acquire bdev_io will result in DEVICE-ERR= OR. The transport is already capable of handling temporary memory failures = by moving the request to PENDING-Queue. Hence the proposal to change the bd= ev_io lifecycle and perhaps connect it with the spdk_nvmf_request object. T= hus all buffer needs are addressed at the beginning of I/O request. 2. I/O Data buffers are sourced and managed by the backend. One of th= e challenges I see with your proposed interface is the lack of details like= if resource is being acquired for a READ operation or WRITE operation. The= handling is quite different in each case. Since bdev_io->type is overloade= d the type of I/O operation is lost. I suppose one can cast the cb_arg (nvm= f_request) and then proceed. Also, the bdev_io should be present to RELEASE= the buffer. Zero copy semantics warrants that data buffer stays until cont= roller-to-host has occurred. In other words, bdev_io lives till REQUEST com= e to COMPLETE state. What are your thoughts in introducing spdk_bdev_init() and spdk_bdev_fini()= as an alternative approach to extend the lifecyle of bdev_io and allow dat= a buffer management via bdev fn_table ? I hope I=E2=80=99m making sense=E2=80=A6 Thanks, Srikanth From: Walker, Benjamin > Sent: Friday, May 11, 2018 12:28 PM To: Harris, James R >; Kaligotla, Srikanth > Cc: raju.gottumukkala(a)broadcom.com; Meneghini, John >; Rodriguez, Edwin >; Pai, Madhu >; NGC-john.barnard-broadcom.com > Subject: Re: BDEV-IO Lifecycle - Need your input. Hi Srikanth, Yes - we'll need to introduce some way to acquire and release buffers from = the bdev layer earlier on in the state machine that processes an NVMe-oF re= quest. I've had this patch out for review for several months as a proposal = for this scenario: https://review.gerrithub.io/#/c/spdk/spdk/+/386166/ It doesn't pass the tests - it's just a proposal for the interface. 90% of = the challenge here is in developing intuitive semantics. Thanks, Ben P.S. This is the kind of discussion that would fit perfectly on the mailing= list. On Wed, 2018-05-09 at 20:35 +0000, Kaligotla, Srikanth wrote: Hi Ben, Hi James, I would like to solicit opinions on the lifecycle for bdev-io resource obje= ct. Attached is the image of RDMA state machine in its current implementati= on. When the REQUEST enters the NEED-BUFFER state, the buffers necessary fo= r carrying out I/O operation are allocated/acquired from the memory pool. A= n instance of BDEV-IO comes into existence after REQUEST reaches READY-TO-E= XECUTE state. The BDEV-IO is teared down as soon the backend returns. From = a BDEV perspective, BDEV-IO is simply a translation unit that facilitates I= /O buffers from the backend. The driver context embedded within bdev_io hol= ds great deal of information pertaining to the I/O under execution. It assi= sts in error handling, dereferencing the buffers upon I/O completion and in= abort handling. In summary, the bdev_io stays alive until request has come= to COMPLETE state. I=E2=80=99d like to hear peoples thoughts in introducin= g the plumbing to acquire BDEV-IO resource in REQUEST-NEED-BUFFER state and= release it in REQUEST-COMPLETE state. I will shortly have patch available= for review that introduces spdk_bdev_init and spdk_bdev_fini which in turn= invokes the corresponding bdev fn_table to initialize/cleanup. I wanted to use this email to communicate our intent and solicit your feedb= ack. We have a working implementation of the above proposal and prior to pu= shing it upstream for review would like to hear your thoughts. These propos= ed changes to upstream are a result of FC transport work in collaboration w= ith the Broadcom team who are also copied to this mail. Myself and John wil= l be at SPDK Dev conference and if required we can elaborate further on thi= s proposal. Thanks, Srikanth --===============4664312280309620082== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIiB4 bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIiB4bWxuczptPSJo dHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL29mZmljZS8yMDA0LzEyL29tbWwiIHhtbG5zPSJo dHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4NCjxoZWFkPg0KPG1ldGEgaHR0cC1lcXVp dj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiPg0KPG1l dGEgbmFtZT0iVGl0bGUiIGNvbnRlbnQ9IiI+DQo8bWV0YSBuYW1lPSJLZXl3b3JkcyIgY29udGVu dD0iIj4NCjxtZXRhIG5hbWU9IkdlbmVyYXRvciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUg KGZpbHRlcmVkIG1lZGl1bSkiPg0KPHN0eWxlPjwhLS0NCi8qIEZvbnQgRGVmaW5pdGlvbnMgKi8N CkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6IkNhbWJyaWEgTWF0aCI7DQoJcGFub3NlLTE6MiA0 IDUgMyA1IDQgNiAzIDIgNDt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OkRlbmdYaWFuOw0K CXBhbm9zZS0xOjIgMSA2IDAgMyAxIDEgMSAxIDE7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWls eTpDYWxpYnJpOw0KCXBhbm9zZS0xOjIgMTUgNSAyIDIgMiA0IDMgMiA0O30NCi8qIFN0eWxlIERl ZmluaXRpb25zICovDQpwLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsDQoJ e21hcmdpbjowaW47DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQtc2l6ZToxMS4wcHQ7 DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTt9DQphOmxpbmssIHNwYW4uTXNvSHlwZXJsaW5rDQoJe21z by1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjpibHVlOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRl cmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFuLk1zb0h5cGVybGlua0ZvbGxvd2VkDQoJe21zby1zdHls ZS1wcmlvcml0eTo5OTsNCgljb2xvcjpwdXJwbGU7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGlu ZTt9DQpwLk1zb0xpc3RQYXJhZ3JhcGgsIGxpLk1zb0xpc3RQYXJhZ3JhcGgsIGRpdi5Nc29MaXN0 UGFyYWdyYXBoDQoJe21zby1zdHlsZS1wcmlvcml0eTozNDsNCgltYXJnaW4tdG9wOjBpbjsNCglt YXJnaW4tcmlnaHQ6MGluOw0KCW1hcmdpbi1ib3R0b206MGluOw0KCW1hcmdpbi1sZWZ0Oi41aW47 DQoJbWFyZ2luLWJvdHRvbTouMDAwMXB0Ow0KCWZvbnQtc2l6ZToxMi4wcHQ7DQoJZm9udC1mYW1p bHk6Q2FsaWJyaTt9DQpwLm1zb25vcm1hbDAsIGxpLm1zb25vcm1hbDAsIGRpdi5tc29ub3JtYWww DQoJe21zby1zdHlsZS1uYW1lOm1zb25vcm1hbDsNCgltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsN CgltYXJnaW4tcmlnaHQ6MGluOw0KCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOw0KCW1hcmdp bi1sZWZ0OjBpbjsNCglmb250LXNpemU6MTEuMHB0Ow0KCWZvbnQtZmFtaWx5OkNhbGlicmk7fQ0K c3Bhbi5FbWFpbFN0eWxlMTkNCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWw7DQoJZm9udC1mYW1p bHk6Q2FsaWJyaTsNCgljb2xvcjp3aW5kb3d0ZXh0O30NCnNwYW4uRW1haWxTdHlsZTIwDQoJe21z by1zdHlsZS10eXBlOnBlcnNvbmFsOw0KCWZvbnQtZmFtaWx5OkNhbGlicmk7DQoJY29sb3I6d2lu ZG93dGV4dDt9DQpzcGFuLkVtYWlsU3R5bGUyMQ0KCXttc28tc3R5bGUtdHlwZTpwZXJzb25hbDsN Cglmb250LWZhbWlseTpDYWxpYnJpOw0KCWNvbG9yOndpbmRvd3RleHQ7fQ0Kc3Bhbi5FbWFpbFN0 eWxlMjINCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWw7DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTsN Cgljb2xvcjp3aW5kb3d0ZXh0O30NCnNwYW4uRW1haWxTdHlsZTIzDQoJe21zby1zdHlsZS10eXBl OnBlcnNvbmFsLXJlcGx5Ow0KCWZvbnQtZmFtaWx5OkNhbGlicmk7DQoJY29sb3I6d2luZG93dGV4 dDt9DQpzcGFuLm1zb0lucw0KCXttc28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsNCgltc28tc3R5 bGUtbmFtZToiIjsNCgl0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOw0KCWNvbG9yOnRlYWw7fQ0K Lk1zb0NocERlZmF1bHQNCgl7bXNvLXN0eWxlLXR5cGU6ZXhwb3J0LW9ubHk7DQoJZm9udC1zaXpl OjEwLjBwdDt9DQpAcGFnZSBXb3JkU2VjdGlvbjENCgl7c2l6ZTo4LjVpbiAxMS4waW47DQoJbWFy Z2luOjEuMGluIDEuMGluIDEuMGluIDEuMGluO30NCmRpdi5Xb3JkU2VjdGlvbjENCgl7cGFnZTpX b3JkU2VjdGlvbjE7fQ0KLyogTGlzdCBEZWZpbml0aW9ucyAqLw0KQGxpc3QgbDANCgl7bXNvLWxp c3QtaWQ6MTAwNjA1MjM2NzsNCgltc28tbGlzdC10ZW1wbGF0ZS1pZHM6Mzg5OTUxMDI2O30NCkBs aXN0IGwxDQoJe21zby1saXN0LWlkOjEzNzA3NjA5NDE7DQoJbXNvLWxpc3QtdHlwZTpoeWJyaWQ7 DQoJbXNvLWxpc3QtdGVtcGxhdGUtaWRzOi0xNTc5MTc2MTIgNjc2OTg3MDMgNjc2OTg3MTMgNjc2 OTg3MTUgNjc2OTg3MDMgNjc2OTg3MTMgNjc2OTg3MTUgNjc2OTg3MDMgNjc2OTg3MTMgNjc2OTg3 MTU7fQ0KQGxpc3QgbDE6bGV2ZWwxDQoJe21zby1sZXZlbC10YWItc3RvcDpub25lOw0KCW1zby1s ZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgltYXJnaW4tbGVmdDouNzVpbjsNCgl0ZXh0LWlu ZGVudDotLjI1aW47fQ0KQGxpc3QgbDE6bGV2ZWwyDQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0 OmFscGhhLWxvd2VyOw0KCW1zby1sZXZlbC10YWItc3RvcDpub25lOw0KCW1zby1sZXZlbC1udW1i ZXItcG9zaXRpb246bGVmdDsNCgltYXJnaW4tbGVmdDoxLjI1aW47DQoJdGV4dC1pbmRlbnQ6LS4y NWluO30NCkBsaXN0IGwxOmxldmVsMw0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpyb21hbi1s b3dlcjsNCgltc28tbGV2ZWwtdGFiLXN0b3A6bm9uZTsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0 aW9uOnJpZ2h0Ow0KCW1hcmdpbi1sZWZ0OjEuNzVpbjsNCgl0ZXh0LWluZGVudDotOS4wcHQ7fQ0K QGxpc3QgbDE6bGV2ZWw0DQoJe21zby1sZXZlbC10YWItc3RvcDpub25lOw0KCW1zby1sZXZlbC1u dW1iZXItcG9zaXRpb246bGVmdDsNCgltYXJnaW4tbGVmdDoyLjI1aW47DQoJdGV4dC1pbmRlbnQ6 LS4yNWluO30NCkBsaXN0IGwxOmxldmVsNQ0KCXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDphbHBo YS1sb3dlcjsNCgltc28tbGV2ZWwtdGFiLXN0b3A6bm9uZTsNCgltc28tbGV2ZWwtbnVtYmVyLXBv c2l0aW9uOmxlZnQ7DQoJbWFyZ2luLWxlZnQ6Mi43NWluOw0KCXRleHQtaW5kZW50Oi0uMjVpbjt9 DQpAbGlzdCBsMTpsZXZlbDYNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6cm9tYW4tbG93ZXI7 DQoJbXNvLWxldmVsLXRhYi1zdG9wOm5vbmU7DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlvbjpy aWdodDsNCgltYXJnaW4tbGVmdDozLjI1aW47DQoJdGV4dC1pbmRlbnQ6LTkuMHB0O30NCkBsaXN0 IGwxOmxldmVsNw0KCXttc28tbGV2ZWwtdGFiLXN0b3A6bm9uZTsNCgltc28tbGV2ZWwtbnVtYmVy LXBvc2l0aW9uOmxlZnQ7DQoJbWFyZ2luLWxlZnQ6My43NWluOw0KCXRleHQtaW5kZW50Oi0uMjVp bjt9DQpAbGlzdCBsMTpsZXZlbDgNCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YWxwaGEtbG93 ZXI7DQoJbXNvLWxldmVsLXRhYi1zdG9wOm5vbmU7DQoJbXNvLWxldmVsLW51bWJlci1wb3NpdGlv bjpsZWZ0Ow0KCW1hcmdpbi1sZWZ0OjQuMjVpbjsNCgl0ZXh0LWluZGVudDotLjI1aW47fQ0KQGxp c3QgbDE6bGV2ZWw5DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OnJvbWFuLWxvd2VyOw0KCW1z by1sZXZlbC10YWItc3RvcDpub25lOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246cmlnaHQ7 DQoJbWFyZ2luLWxlZnQ6NC43NWluOw0KCXRleHQtaW5kZW50Oi05LjBwdDt9DQpvbA0KCXttYXJn aW4tYm90dG9tOjBpbjt9DQp1bA0KCXttYXJnaW4tYm90dG9tOjBpbjt9DQotLT48L3N0eWxlPg0K PC9oZWFkPg0KPGJvZHkgYmdjb2xvcj0id2hpdGUiIGxhbmc9IkVOLVVTIiBsaW5rPSJibHVlIiB2 bGluaz0icHVycGxlIj4NCjxkaXYgY2xhc3M9IldvcmRTZWN0aW9uMSI+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj5IaSBTcmlrYW50aCw8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+Rm9sbG93aW5nIHVw IG9uIHRoaXMgdGhyZWFkIGFuZCB0aGUgZGlzY3Vzc2lvbiBpbiB5ZXN0ZXJkYXnigJlzIGNvbW11 bml0eSBtZWV0aW5nLjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4m bmJzcDs8L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5UaGUgcmVjZW50IHNwZGtfYmRl dl9xdWV1ZV9pb193YWl0KCkgY2hhbmdlcyBhbGxvdyBhbiBTUERLIGFwcGxpY2F0aW9uIHRvIHdv cmsgYmV0dGVyIGluIGdlbmVyYWwgd2hlbiB0aGUgc3Bka19iZGV2X2lvIGJ1ZmZlciBwb29sIGlz IGV4aGF1c3RlZC4mbmJzcDsgV2Ugc3RpbGwgbmVlZCB0byBtYWtlIGNoYW5nZXMgdG8gdGhlIE5W TWUtb0YgdGFyZ2V0IHRvIHVzZSB0aGlzIG5ldyBBUEkgYnV0IHRoYXQgc2hvdWxkIGJlDQogZG9u ZSBzb29uLWlzaC48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5i c3A7PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+V2l0aCB0aGF0IGluIHBsYWNlLCB0 aGUgc3Bka19iZGV2X2lvIGJ1ZmZlciBwb29sIGl0c2VsZiBjYW4gYmUgY29uZmlndXJlZCB1cCBv ciBkb3duIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHN0YXJ0cy4mbmJzcDsgQ3VycmVudGx5IHRoZSBk ZWZhdWx0IGlzIDY0SyBzcGRrX2JkZXZfaW8gYnVmZmVycy4mbmJzcDsgc2l6ZW9mKHN0cnVjdCBz cGRrX2JkZXZfaW8pID09IDIxNiBwbHVzIHRoZSBwZXItSU8gY29udGV4dCBzaXplIGFsbG9jYXRl ZA0KIGZvciB0aGUgYmRldiBtb2R1bGUuJm5ic3A7IFRoaXMgY2FuIGJlIHVwIHRvIDE5MiBieXRl cyAodmlydGlvIGJkZXYgbW9kdWxlKSBidXQgaXMgbGlrZWx5IG11Y2ggc21hbGxlciBmb3IgeW91 IGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBzaXplIGZvciB5b3VyIG9udGFwIGJkZXYgbW9kdWxl LjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj5MZXTigJlzIGFzc3VtZSB5b3VyIHBlci1JTyBjb250 ZXh0IHNpemUgaXMgNjQgYnl0ZXMuJm5ic3A7IDY0SyB4ICgxOTIgJiM0MzsgNjQpID0gMTZNQi48 bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+SeKAmW0gbm90IHN1cmUgaG93IG1hbnkgc3Bka19iZGV2 X2lvIHlvdSBuZWVkIGluIGZsaWdodCBhdCBhbnkgZ2l2ZW4gdGltZS4mbmJzcDsgNjRLIHNlZW1z IGxpa2UgYSBsb3QgYnV0IEnigJlkIGJlIGN1cmlvdXMgdG8gaGVhciB5b3VyIHRob3VnaHRzIG9u IHRoaXMuJm5ic3A7IElmIHRoaXMgaXMgdGhlIHJpZ2h0IG51bWJlciwgdGhlbiB3b3JzdCBjYXNl LCB0aGVyZSB3b3VsZCBiZSBhYm91dCAxNk1CIG9mIERSQU0gdGhhdCB3b3VsZA0KIHNpdCB1bnVz ZWQgaWYgdGhlIE5WTWUtb0YgdGFyZ2V0IGluIHlvdXIgc3lzdGVtIHdhcyBub3QgYWN0aXZlLiZu YnNwOyBJcyB0aGF0IHRvbyBidXJkZW5zb21lIGZvciB5b3VyIGFwcGxpY2F0aW9uPzxvOnA+PC9v OnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj5UaGFua3MsPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPi1KaW08bzpw PjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxkaXYgc3R5bGU9ImJvcmRlcjpub25lO2Jv cmRlci10b3A6c29saWQgI0I1QzRERiAxLjBwdDtwYWRkaW5nOjMuMHB0IDBpbiAwaW4gMGluIj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj48Yj48c3BhbiBz dHlsZT0iY29sb3I6YmxhY2siPkZyb206IDwvc3Bhbj4NCjwvYj48c3BhbiBzdHlsZT0iY29sb3I6 YmxhY2siPiZxdW90O0thbGlnb3RsYSwgU3Jpa2FudGgmcXVvdDsgJmx0O1NyaWthbnRoLkthbGln b3RsYUBuZXRhcHAuY29tJmd0Ozxicj4NCjxiPkRhdGU6IDwvYj5XZWRuZXNkYXksIEp1bmUgMjAs IDIwMTggYXQgMTI6NDcgUE08YnI+DQo8Yj5UbzogPC9iPiZxdW90O1dhbGtlciwgQmVuamFtaW4m cXVvdDsgJmx0O2JlbmphbWluLndhbGtlckBpbnRlbC5jb20mZ3Q7LCBKYW1lcyBIYXJyaXMgJmx0 O2phbWVzLnIuaGFycmlzQGludGVsLmNvbSZndDssIERhbmllbCBWZXJrYW1wICZsdDtkYW5pZWwu dmVya2FtcEBpbnRlbC5jb20mZ3Q7PGJyPg0KPGI+Q2M6IDwvYj4mcXVvdDtyYWp1LmdvdHR1bXVr a2FsYUBicm9hZGNvbS5jb20mcXVvdDsgJmx0O3JhanUuZ290dHVtdWtrYWxhQGJyb2FkY29tLmNv bSZndDssICZxdW90O01lbmVnaGluaSwgSm9obiZxdW90OyAmbHQ7Sm9obi5NZW5lZ2hpbmlAbmV0 YXBwLmNvbSZndDssICZxdW90O1JvZHJpZ3VleiwgRWR3aW4mcXVvdDsgJmx0O0VkLlJvZHJpZ3Vl ekBuZXRhcHAuY29tJmd0OywgJnF1b3Q7UGFpLCBNYWRodSZxdW90OyAmbHQ7TWFkaHVzdWRhbi5Q YWlAbmV0YXBwLmNvbSZndDssICZxdW90O05HQy1qb2huLmJhcm5hcmQtYnJvYWRjb20uY29tJnF1 b3Q7ICZsdDtqb2huLmJhcm5hcmRAYnJvYWRjb20uY29tJmd0OywNCiAmcXVvdDtzcGRrQGxpc3Rz LjAxLm9yZyZxdW90OyAmbHQ7c3Bka0BsaXN0cy4wMS5vcmcmZ3Q7PGJyPg0KPGI+U3ViamVjdDog PC9iPlJFOiBCREVWLUlPIExpZmVjeWNsZSAtIE5lZWQgeW91ciBpbnB1dC48L3NwYW4+PHNwYW4g c3R5bGU9ImZvbnQtc2l6ZToxMi4wcHQ7Y29sb3I6YmxhY2siPjxvOnA+PC9vOnA+PC9zcGFuPjwv cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVm dDouNWluIj48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1 b3Q7Ij48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5IZWxsbyw8bzpwPjwvbzpwPjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwv bzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5G aXJzdCByZXZpc2lvbiBvZiBjaGFuZ2VzIHRvIGV4dGVuZCB0aGUgbGlmZWN5Y2xlIG9mIGJkZXZf aW8gYXJlIGF2YWlsYWJsZSBmb3IgcmV2aWV3LiBJIHdvdWxkIGxpa2UgdG8gc29saWNpdCB5b3Vy IGlucHV0IG9uIHRoZSBwcm9wb3NlZCBBUEkvQ29kZSBmbG93IGNoYW5nZXMuDQo8bzpwPjwvbzpw PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJz cDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVm dDouNWluIj48YSBocmVmPSJodHRwczovL3Jldmlldy5nZXJyaXRodWIuaW8vYy9zcGRrL3NwZGsv JiM0MzsvNDE1ODYwIj5odHRwczovL3Jldmlldy5nZXJyaXRodWIuaW8vYy9zcGRrL3NwZGsvJiM0 MzsvNDE1ODYwPC9hPjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9 Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05v cm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPlRoYW5rcyw8bzpwPjwvbzpwPjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5TcmlrYW50aDxvOnA+ PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4i PiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdp bi1sZWZ0Oi41aW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPGRpdiBzdHlsZT0iYm9yZGVyOm5v bmU7Ym9yZGVyLXRvcDpzb2xpZCAjQjVDNERGIDEuMHB0O3BhZGRpbmc6My4wcHQgMGluIDBpbiAw aW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPjxiPjxz cGFuIHN0eWxlPSJjb2xvcjpibGFjayI+RnJvbTogPC9zcGFuPg0KPC9iPjxzcGFuIHN0eWxlPSJj b2xvcjpibGFjayI+JnF1b3Q7S2FsaWdvdGxhLCBTcmlrYW50aCZxdW90OyAmbHQ7PGEgaHJlZj0i bWFpbHRvOlNyaWthbnRoLkthbGlnb3RsYUBuZXRhcHAuY29tIj5TcmlrYW50aC5LYWxpZ290bGFA bmV0YXBwLmNvbTwvYT4mZ3Q7PGJyPg0KPGI+RGF0ZTogPC9iPkZyaWRheSwgTWF5IDExLCAyMDE4 IGF0IDI6MjcgUE08YnI+DQo8Yj5UbzogPC9iPiZxdW90O1dhbGtlciwgQmVuamFtaW4mcXVvdDsg Jmx0OzxhIGhyZWY9Im1haWx0bzpiZW5qYW1pbi53YWxrZXJAaW50ZWwuY29tIj5iZW5qYW1pbi53 YWxrZXJAaW50ZWwuY29tPC9hPiZndDssICZxdW90O0hhcnJpcywgSmFtZXMgUiZxdW90OyAmbHQ7 PGEgaHJlZj0ibWFpbHRvOmphbWVzLnIuaGFycmlzQGludGVsLmNvbSI+amFtZXMuci5oYXJyaXNA aW50ZWwuY29tPC9hPiZndDs8YnI+DQo8Yj5DYzogPC9iPiZxdW90OzxhIGhyZWY9Im1haWx0bzpy YWp1LmdvdHR1bXVra2FsYUBicm9hZGNvbS5jb20iPnJhanUuZ290dHVtdWtrYWxhQGJyb2FkY29t LmNvbTwvYT4mcXVvdDsgJmx0OzxhIGhyZWY9Im1haWx0bzpyYWp1LmdvdHR1bXVra2FsYUBicm9h ZGNvbS5jb20iPnJhanUuZ290dHVtdWtrYWxhQGJyb2FkY29tLmNvbTwvYT4mZ3Q7LCAmcXVvdDtN ZW5lZ2hpbmksIEpvaG4mcXVvdDsgJmx0OzxhIGhyZWY9Im1haWx0bzpKb2huLk1lbmVnaGluaUBu ZXRhcHAuY29tIj5Kb2huLk1lbmVnaGluaUBuZXRhcHAuY29tPC9hPiZndDssDQogJnF1b3Q7Um9k cmlndWV6LCBFZHdpbiZxdW90OyAmbHQ7PGEgaHJlZj0ibWFpbHRvOkVkLlJvZHJpZ3VlekBuZXRh cHAuY29tIj5FZC5Sb2RyaWd1ZXpAbmV0YXBwLmNvbTwvYT4mZ3Q7LCAmcXVvdDtQYWksIE1hZGh1 JnF1b3Q7ICZsdDs8YSBocmVmPSJtYWlsdG86TWFkaHVzdWRhbi5QYWlAbmV0YXBwLmNvbSI+TWFk aHVzdWRhbi5QYWlAbmV0YXBwLmNvbTwvYT4mZ3Q7LCAmcXVvdDtOR0Mtam9obi5iYXJuYXJkLWJy b2FkY29tLmNvbSZxdW90OyAmbHQ7PGEgaHJlZj0ibWFpbHRvOmpvaG4uYmFybmFyZEBicm9hZGNv bS5jb20iPmpvaG4uYmFybmFyZEBicm9hZGNvbS5jb208L2E+Jmd0OywNCiAmcXVvdDs8YSBocmVm PSJtYWlsdG86c3Bka0BsaXN0cy4wMS5vcmciPnNwZGtAbGlzdHMuMDEub3JnPC9hPiZxdW90OyAm bHQ7PGEgaHJlZj0ibWFpbHRvOnNwZGtAbGlzdHMuMDEub3JnIj5zcGRrQGxpc3RzLjAxLm9yZzwv YT4mZ3Q7PGJyPg0KPGI+U3ViamVjdDogPC9iPlJFOiBCREVWLUlPIExpZmVjeWNsZSAtIE5lZWQg eW91ciBpbnB1dC48L3NwYW4+PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFz cz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+PHNwYW4gc3R5bGU9ImZvbnQt ZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+Jm5ic3A7PC9zcGFuPjxvOnA+PC9v OnA+PC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6 LjVpbiI+Q0M6IExpc3Q8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxl PSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5IaSBCZW4sPG86cD48L286cD48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48 L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+ WW91ciA8YSBocmVmPSJodHRwczovL3Jldmlldy5nZXJyaXRodWIuaW8vIy9jL3NwZGsvc3Bkay8m IzQzOy8zODYxNjYvIj4NCnByb3Bvc2FsPC9hPiB0byBpbnRlcmZhY2Ugd2l0aCB0aGUgYmFja2Vu ZCB0byBhY3F1aXJlIGFuZCByZWxlYXNlIGJ1ZmZlcnMgaXMgZ29vZC4gWW91IGhhdmUgYWNjdXJh dGVseSBzdGF0ZWQgdGhhdCB0aGUgY2hhbGxlbmdlIGlzIGluIGRldmVsb3BpbmcgaW50dWl0aXZl IHNlbWFudGljcy4gQW5kIHRoYXQgaGFzIGJlZW4gbXkgc3RydWdnbGUuIFRvIG1lLCB0aGVyZSBh cmUgdHdvIHByb2JsZW0gc3RhdGVtZW50czsNCjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMjVpbjt0ZXh0LWluZGVu dDotLjI1aW47bXNvLWxpc3Q6bDEgbGV2ZWwxIGxmbzMiPg0KPCFbaWYgIXN1cHBvcnRMaXN0c10+ PHNwYW4gc3R5bGU9Im1zby1saXN0Oklnbm9yZSI+MS48c3BhbiBzdHlsZT0iZm9udDo3LjBwdCAm cXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48IVtlbmRpZl0+SXQgaXMgZXhwZWN0ZWQgdGhhdCBiZGV2 X2lvIHBvb2wgaXMgc2l6ZWQgY29ycmVjdGx5IHNvIHRoZSBjYWxsIHRvIGdldCBiZGV2X2lvIHN1 Y2NlZWRzLiBGYWlsdXJlIHRvIGFjcXVpcmUgYmRldl9pbyB3aWxsIHJlc3VsdCBpbiBERVZJQ0Ut RVJST1IuIFRoZSB0cmFuc3BvcnQgaXMgYWxyZWFkeSBjYXBhYmxlIG9mIGhhbmRsaW5nIHRlbXBv cmFyeSBtZW1vcnkgZmFpbHVyZXMgYnkgbW92aW5nIHRoZSByZXF1ZXN0DQogdG8gUEVORElORy1R dWV1ZS4gSGVuY2UgdGhlIHByb3Bvc2FsIHRvIGNoYW5nZSB0aGUgYmRldl9pbyBsaWZlY3ljbGUg YW5kIHBlcmhhcHMgY29ubmVjdCBpdCB3aXRoIHRoZSBzcGRrX252bWZfcmVxdWVzdCBvYmplY3Qu IFRodXMgYWxsIGJ1ZmZlciBuZWVkcyBhcmUgYWRkcmVzc2VkIGF0IHRoZSBiZWdpbm5pbmcgb2Yg SS9PIHJlcXVlc3QuPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luLWxlZnQ6MS4yNWluO3RleHQtaW5kZW50Oi0uMjVpbjttc28tbGlzdDpsMSBsZXZlbDEg bGZvMyI+DQo8IVtpZiAhc3VwcG9ydExpc3RzXT48c3BhbiBzdHlsZT0ibXNvLWxpc3Q6SWdub3Jl Ij4yLjxzcGFuIHN0eWxlPSJmb250OjcuMHB0ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+ Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjwhW2Vu ZGlmXT5JL08gRGF0YSBidWZmZXJzIGFyZSBzb3VyY2VkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBiYWNr ZW5kLiBPbmUgb2YgdGhlIGNoYWxsZW5nZXMgSSBzZWUgd2l0aCB5b3VyIHByb3Bvc2VkIGludGVy ZmFjZSBpcyB0aGUgbGFjayBvZiBkZXRhaWxzIGxpa2UgaWYgcmVzb3VyY2UgaXMgYmVpbmcgYWNx dWlyZWQgZm9yIGEgUkVBRCBvcGVyYXRpb24gb3IgV1JJVEUgb3BlcmF0aW9uLiBUaGUgaGFuZGxp bmcgaXMgcXVpdGUNCiBkaWZmZXJlbnQgaW4gZWFjaCBjYXNlLiBTaW5jZSBiZGV2X2lvLSZndDt0 eXBlIGlzIG92ZXJsb2FkZWQgdGhlIHR5cGUgb2YgSS9PIG9wZXJhdGlvbiBpcyBsb3N0LiBJIHN1 cHBvc2Ugb25lIGNhbiBjYXN0IHRoZSBjYl9hcmcgKG52bWZfcmVxdWVzdCkgYW5kIHRoZW4gcHJv Y2VlZC4gQWxzbywgdGhlIGJkZXZfaW8gc2hvdWxkIGJlIHByZXNlbnQgdG8gUkVMRUFTRSB0aGUg YnVmZmVyLiBaZXJvIGNvcHkgc2VtYW50aWNzIHdhcnJhbnRzIHRoYXQgZGF0YQ0KIGJ1ZmZlciBz dGF5cyB1bnRpbCBjb250cm9sbGVyLXRvLWhvc3QgaGFzIG9jY3VycmVkLiBJbiBvdGhlciB3b3Jk cywgYmRldl9pbyBsaXZlcyB0aWxsIFJFUVVFU1QgY29tZSB0byBDT01QTEVURSBzdGF0ZS4NCjxv OnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41 aW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1h cmdpbi1sZWZ0Oi41aW4iPldoYXQgYXJlIHlvdXIgdGhvdWdodHMgaW4gaW50cm9kdWNpbmcgc3Bk a19iZGV2X2luaXQoKSBhbmQgc3Bka19iZGV2X2ZpbmkoKSBhcyBhbiBhbHRlcm5hdGl2ZSBhcHBy b2FjaCB0byBleHRlbmQgdGhlIGxpZmVjeWxlIG9mIGJkZXZfaW8gYW5kIGFsbG93IGRhdGEgYnVm ZmVyIG1hbmFnZW1lbnQgdmlhIGJkZXYgZm5fdGFibGUgPzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNwOzxvOnA+PC9vOnA+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPkkgaG9w ZSBJ4oCZbSBtYWtpbmcgc2Vuc2XigKY8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5UaGFua3MsPG86cD48L286 cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+U3Jp a2FudGg8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4t bGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxkaXY+DQo8ZGl2IHN0eWxlPSJib3Jk ZXI6bm9uZTtib3JkZXItdG9wOnNvbGlkICNFMUUxRTEgMS4wcHQ7cGFkZGluZzozLjBwdCAwaW4g MGluIDBpbiI+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+ PGI+RnJvbTo8L2I+IFdhbGtlciwgQmVuamFtaW4gJmx0OzxhIGhyZWY9Im1haWx0bzpiZW5qYW1p bi53YWxrZXJAaW50ZWwuY29tIj5iZW5qYW1pbi53YWxrZXJAaW50ZWwuY29tPC9hPiZndDsNCjxi cj4NCjxiPlNlbnQ6PC9iPiBGcmlkYXksIE1heSAxMSwgMjAxOCAxMjoyOCBQTTxicj4NCjxiPlRv OjwvYj4gSGFycmlzLCBKYW1lcyBSICZsdDs8YSBocmVmPSJtYWlsdG86amFtZXMuci5oYXJyaXNA aW50ZWwuY29tIj5qYW1lcy5yLmhhcnJpc0BpbnRlbC5jb208L2E+Jmd0OzsgS2FsaWdvdGxhLCBT cmlrYW50aCAmbHQ7PGEgaHJlZj0ibWFpbHRvOlNyaWthbnRoLkthbGlnb3RsYUBuZXRhcHAuY29t Ij5TcmlrYW50aC5LYWxpZ290bGFAbmV0YXBwLmNvbTwvYT4mZ3Q7PGJyPg0KPGI+Q2M6PC9iPiA8 YSBocmVmPSJtYWlsdG86cmFqdS5nb3R0dW11a2thbGFAYnJvYWRjb20uY29tIj5yYWp1LmdvdHR1 bXVra2FsYUBicm9hZGNvbS5jb208L2E+OyBNZW5lZ2hpbmksIEpvaG4gJmx0OzxhIGhyZWY9Im1h aWx0bzpKb2huLk1lbmVnaGluaUBuZXRhcHAuY29tIj5Kb2huLk1lbmVnaGluaUBuZXRhcHAuY29t PC9hPiZndDs7IFJvZHJpZ3VleiwgRWR3aW4gJmx0OzxhIGhyZWY9Im1haWx0bzpFZC5Sb2RyaWd1 ZXpAbmV0YXBwLmNvbSI+RWQuUm9kcmlndWV6QG5ldGFwcC5jb208L2E+Jmd0OzsNCiBQYWksIE1h ZGh1ICZsdDs8YSBocmVmPSJtYWlsdG86TWFkaHVzdWRhbi5QYWlAbmV0YXBwLmNvbSI+TWFkaHVz dWRhbi5QYWlAbmV0YXBwLmNvbTwvYT4mZ3Q7OyBOR0Mtam9obi5iYXJuYXJkLWJyb2FkY29tLmNv bSAmbHQ7PGEgaHJlZj0ibWFpbHRvOmpvaG4uYmFybmFyZEBicm9hZGNvbS5jb20iPmpvaG4uYmFy bmFyZEBicm9hZGNvbS5jb208L2E+Jmd0Ozxicj4NCjxiPlN1YmplY3Q6PC9iPiBSZTogQkRFVi1J TyBMaWZlY3ljbGUgLSBOZWVkIHlvdXIgaW5wdXQuPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNw OzxvOnA+PC9vOnA+PC9wPg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJn aW4tbGVmdDouNWluIj5IaSBTcmlrYW50aCw8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpw PjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJt YXJnaW4tbGVmdDouNWluIj5ZZXMgLSB3ZSdsbCBuZWVkIHRvIGludHJvZHVjZSBzb21lIHdheSB0 byBhY3F1aXJlIGFuZCByZWxlYXNlIGJ1ZmZlcnMgZnJvbSB0aGUgYmRldiBsYXllciBlYXJsaWVy IG9uIGluIHRoZSBzdGF0ZSBtYWNoaW5lIHRoYXQgcHJvY2Vzc2VzIGFuIE5WTWUtb0YgcmVxdWVz dC4gSSd2ZSBoYWQgdGhpcyBwYXRjaCBvdXQgZm9yIHJldmlldyBmb3Igc2V2ZXJhbCBtb250aHMN CiBhcyBhIHByb3Bvc2FsIGZvciB0aGlzIHNjZW5hcmlvOjxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+ DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZu YnNwOzxvOnA+PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPjxhIGhyZWY9Imh0dHBzOi8vcmV2aWV3LmdlcnJpdGh1 Yi5pby8jL2Mvc3Bkay9zcGRrLyYjNDM7LzM4NjE2Ni8iPmh0dHBzOi8vcmV2aWV3LmdlcnJpdGh1 Yi5pby8jL2Mvc3Bkay9zcGRrLyYjNDM7LzM4NjE2Ni88L2E+PG86cD48L286cD48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+ Jm5ic3A7PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFs IiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+SXQgZG9lc24ndCBwYXNzIHRoZSB0ZXN0cyAtIGl0 J3MganVzdCBhIHByb3Bvc2FsIGZvciB0aGUgaW50ZXJmYWNlLiA5MCUgb2YgdGhlIGNoYWxsZW5n ZSBoZXJlIGlzIGluIGRldmVsb3BpbmcgaW50dWl0aXZlIHNlbWFudGljcy48bzpwPjwvbzpwPjwv cD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVm dDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5UaGFua3MsPG86cD48L286cD48L3A+ DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6 LjVpbiI+QmVuPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8L2Rp dj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+ UC5TLiBUaGlzIGlzIHRoZSBraW5kIG9mIGRpc2N1c3Npb24gdGhhdCB3b3VsZCBmaXQgcGVyZmVj dGx5IG9uIHRoZSBtYWlsaW5nIGxpc3QuPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48 L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luLWxlZnQ6LjVpbiI+T24gV2VkLCAyMDE4LTA1LTA5IGF0IDIwOjM1ICYjNDM7MDAwMCwgS2Fs aWdvdGxhLCBTcmlrYW50aCB3cm90ZTo8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGJsb2NrcXVv dGUgc3R5bGU9ImJvcmRlcjpub25lO2JvcmRlci1sZWZ0OnNvbGlkICM3MjlGQ0YgMS41cHQ7cGFk ZGluZzowaW4gMGluIDBpbiA2LjBwdDttYXJnaW4tbGVmdDo0LjhwdDttYXJnaW4tdG9wOjUuMHB0 O21hcmdpbi1yaWdodDowaW47bWFyZ2luLWJvdHRvbTo1LjBwdCI+DQo8ZGl2Pg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPkhpIEJlbiwgSGkgSmFtZXMsPG86 cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+SSB3b3VsZCBsaWtl IHRvIHNvbGljaXQgb3BpbmlvbnMgb24gdGhlIGxpZmVjeWNsZSBmb3IgYmRldi1pbyByZXNvdXJj ZSBvYmplY3QuIEF0dGFjaGVkIGlzIHRoZSBpbWFnZSBvZiBSRE1BIHN0YXRlIG1hY2hpbmUgaW4g aXRzIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uIFdoZW4gdGhlIFJFUVVFU1QgZW50ZXJzIHRoZSBO RUVELUJVRkZFUiBzdGF0ZSwgdGhlIGJ1ZmZlcnMNCiBuZWNlc3NhcnkgZm9yIGNhcnJ5aW5nIG91 dCBJL08gb3BlcmF0aW9uIGFyZSBhbGxvY2F0ZWQvYWNxdWlyZWQgZnJvbSB0aGUgbWVtb3J5IHBv b2wuIEFuIGluc3RhbmNlIG9mIEJERVYtSU8gY29tZXMgaW50byBleGlzdGVuY2UgYWZ0ZXIgUkVR VUVTVCByZWFjaGVzIFJFQURZLVRPLUVYRUNVVEUgc3RhdGUuIFRoZSBCREVWLUlPIGlzIHRlYXJl ZCBkb3duIGFzIHNvb24gdGhlIGJhY2tlbmQgcmV0dXJucy4gRnJvbSBhIEJERVYgcGVyc3BlY3Rp dmUsDQogQkRFVi1JTyBpcyBzaW1wbHkgYSB0cmFuc2xhdGlvbiB1bml0IHRoYXQgZmFjaWxpdGF0 ZXMgSS9PIGJ1ZmZlcnMgZnJvbSB0aGUgYmFja2VuZC4gVGhlIGRyaXZlciBjb250ZXh0IGVtYmVk ZGVkIHdpdGhpbiBiZGV2X2lvIGhvbGRzIGdyZWF0IGRlYWwgb2YgaW5mb3JtYXRpb24gcGVydGFp bmluZyB0byB0aGUgSS9PIHVuZGVyIGV4ZWN1dGlvbi4gSXQgYXNzaXN0cyBpbiBlcnJvciBoYW5k bGluZywgZGVyZWZlcmVuY2luZyB0aGUgYnVmZmVycyB1cG9uDQogSS9PIGNvbXBsZXRpb24gYW5k IGluIGFib3J0IGhhbmRsaW5nLiBJbiBzdW1tYXJ5LCB0aGUgYmRldl9pbyBzdGF5cyBhbGl2ZSB1 bnRpbCByZXF1ZXN0IGhhcyBjb21lIHRvIENPTVBMRVRFIHN0YXRlLiBJ4oCZZCBsaWtlIHRvIGhl YXIgcGVvcGxlcyB0aG91Z2h0cyBpbiBpbnRyb2R1Y2luZyB0aGUgcGx1bWJpbmcgdG8gYWNxdWly ZSBCREVWLUlPIHJlc291cmNlIGluIFJFUVVFU1QtTkVFRC1CVUZGRVIgc3RhdGUgYW5kIHJlbGVh c2UgaXQgaW4gUkVRVUVTVC1DT01QTEVURQ0KIHN0YXRlLiZuYnNwOyBJIHdpbGwgc2hvcnRseSBo YXZlIHBhdGNoIGF2YWlsYWJsZSBmb3IgcmV2aWV3IHRoYXQgaW50cm9kdWNlcyBzcGRrX2JkZXZf aW5pdCBhbmQgc3Bka19iZGV2X2Zpbmkgd2hpY2ggaW4gdHVybiBpbnZva2VzIHRoZSBjb3JyZXNw b25kaW5nIGJkZXYgZm5fdGFibGUgdG8gJm5ic3A7aW5pdGlhbGl6ZS9jbGVhbnVwLiAmbmJzcDs8 bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxl PSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPGRpdj4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5JIHdhbnRlZCB0 byB1c2UgdGhpcyBlbWFpbCB0byBjb21tdW5pY2F0ZSBvdXIgaW50ZW50IGFuZCBzb2xpY2l0IHlv dXIgZmVlZGJhY2suIFdlIGhhdmUgYSB3b3JraW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhYm92 ZSBwcm9wb3NhbCBhbmQgcHJpb3IgdG8gcHVzaGluZyBpdCB1cHN0cmVhbSBmb3IgcmV2aWV3IHdv dWxkIGxpa2UgdG8gaGVhciB5b3VyIHRob3VnaHRzLg0KIFRoZXNlIHByb3Bvc2VkIGNoYW5nZXMg dG8gdXBzdHJlYW0gYXJlIGEgcmVzdWx0IG9mIEZDIHRyYW5zcG9ydCB3b3JrIGluIGNvbGxhYm9y YXRpb24gd2l0aCB0aGUgQnJvYWRjb20gdGVhbSB3aG8gYXJlIGFsc28gY29waWVkIHRvIHRoaXMg bWFpbC4gTXlzZWxmIGFuZCBKb2huIHdpbGwgYmUgYXQgU1BESyBEZXYgY29uZmVyZW5jZSBhbmQg aWYgcmVxdWlyZWQgd2UgY2FuIGVsYWJvcmF0ZSBmdXJ0aGVyIG9uIHRoaXMgcHJvcG9zYWwuPG86 cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjxkaXY+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+VGhhbmtzLDxvOnA+ PC9vOnA+PC9wPg0KPC9kaXY+DQo8ZGl2Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1h cmdpbi1sZWZ0Oi41aW4iPlNyaWthbnRoPG86cD48L286cD48L3A+DQo8L2Rpdj4NCjwvYmxvY2tx dW90ZT4NCjxkaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVp biI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1s Pg0K --===============4664312280309620082==--