From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============8488921559573439036==" MIME-Version: 1.0 From: Verkamp, Daniel Subject: Re: [SPDK] spdk_malloc vs. malloc Date: Thu, 03 May 2018 18:05:53 +0000 Message-ID: In-Reply-To: EF5B90A2-9255-40D5-9A05-2428EA73CD20@netapp.com List-ID: To: spdk@lists.01.org --===============8488921559573439036== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hi John, The new API is intended to allow memory that is shared and not DMA-able, so= spdk_dma_malloc() wouldn=E2=80=99t be an appropriate name; also, we did no= t want to break public API by adding a new flags parameter to the existing = function. We intend to update the internal SPDK callers of spdk_dma_malloc= () to all use spdk_malloc() with the appropriate flags (leaving the old nam= es for backwards compatibility for now). If the user passes flags =3D=3D 0 to the new spdk_malloc() call, this could= be implemented by malloc() or equivalent behind the scenes, since the memo= ry does not need to be DMA-able or shared across multi-process boundaries (= it has no special properties). Does this suffice for your use case? Thanks, -- Daniel From: SPDK [mailto:spdk-bounces(a)lists.01.org] On Behalf Of Meneghini, John Sent: Thursday, May 3, 2018 10:53 AM To: Harris, James R ; Walker, Benjamin ; z.khatami88(a)gmail.com; Storage Performance Develop= ment Kit Cc: Meneghini, John Subject: [SPDK] spdk_malloc vs. malloc Hi Jim, Ben, and Zahra. I am sorry I didn=E2=80=99t catch this during the code review, but it=E2=80= =99s really hard to keep track of all of the changes that are going on. https://review.gerrithub.io/#/c/spdk/spdk/+/402334/ As you may recall, we wanted to use spdk_malloc and spdk_calloc to abstract= the POSIX malloc and calloc calls. This is still an issue in multiple pla= ces as we want a non-blocking malloc and calloc call that returns a status = rather than setting errno (e.g. to ENOMEM). Remember, not all execution env= ironments support errno. Can we revert change a77cd3f7, and use the spdk_malloc/calloc/free api for = that purpose? Also, I don=E2=80=99t see the point of introducing an additional API for dm= a-able memory. We went through this once before. * a77cd3f7 2018-04-24 env: add malloc variants with DMA/shareable flags [ = Ben Walker / z.khatami88(a)gmail.com ] * 8a44220b 2017-05-31 env: Rename spdk_malloc/zmalloc/realloc/free to spdk= _dma_(func) [ Jim Harris / johnm(a)netapp.com ] I fully support adding the SPDK_MALLOC_DMA and SPDK_MALLOC_SHARE flag and s= ocket_id to spdk_dma_malloc/zmalloc(), and I prefer to do this rather than = invent a new API for allocating dma-able memory. void *spdk_dma_malloc(size_t size, size_t align, uint64_t *phys_addr); void *spdk_malloc(size_t size, size_t align, uint64_t *phys_addr,= int socket_id, uint32_t flags); I=E2=80=99m proposing: void *spdk_dma_malloc(size_t size, size_t align, uint64_t *phys_addr, int s= ocket_id, uint32_t flags); /John P.S. What I really need is a filter that allows me to watch all of the head= ers in include/spdk/{api}.h. Looking at the GerritHub documentation, I see= no way to do this. It appears all I can do is watch the master branch. https://review.gerrithub.io/Documentation/intro-user.html#watch --===============8488921559573439036== Content-Type: text/html MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="attachment.html" PGh0bWwgeG1sbnM6dj0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTp2bWwiIHhtbG5zOm89InVy bjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIgeG1sbnM6dz0idXJuOnNjaGVt YXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIgeG1sbnM6bT0iaHR0cDovL3NjaGVtYXMubWlj cm9zb2Z0LmNvbS9vZmZpY2UvMjAwNC8xMi9vbW1sIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcv VFIvUkVDLWh0bWw0MCI+DQo8aGVhZD4NCjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIg Y29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4NCjxtZXRhIG5hbWU9IkdlbmVyYXRv ciIgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgMTUgKGZpbHRlcmVkIG1lZGl1bSkiPg0KPHN0eWxl PjwhLS0NCi8qIEZvbnQgRGVmaW5pdGlvbnMgKi8NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6 IkNhbWJyaWEgTWF0aCI7DQoJcGFub3NlLTE6MiA0IDUgMyA1IDQgNiAzIDIgNDt9DQpAZm9udC1m YWNlDQoJe2ZvbnQtZmFtaWx5OkNhbGlicmk7DQoJcGFub3NlLTE6MiAxNSA1IDIgMiAyIDQgMyAy IDQ7fQ0KLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8NCnAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWws IGRpdi5Nc29Ob3JtYWwNCgl7bWFyZ2luOjBpbjsNCgltYXJnaW4tYm90dG9tOi4wMDAxcHQ7DQoJ Zm9udC1zaXplOjEyLjBwdDsNCglmb250LWZhbWlseToiQ2FsaWJyaSIsc2Fucy1zZXJpZjt9DQph OmxpbmssIHNwYW4uTXNvSHlwZXJsaW5rDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xv cjojMDU2M0MxOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KYTp2aXNpdGVkLCBzcGFu Lk1zb0h5cGVybGlua0ZvbGxvd2VkDQoJe21zby1zdHlsZS1wcmlvcml0eTo5OTsNCgljb2xvcjoj OTU0RjcyOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQ0KcC5Nc29MaXN0UGFyYWdyYXBo LCBsaS5Nc29MaXN0UGFyYWdyYXBoLCBkaXYuTXNvTGlzdFBhcmFncmFwaA0KCXttc28tc3R5bGUt cHJpb3JpdHk6MzQ7DQoJbWFyZ2luLXRvcDowaW47DQoJbWFyZ2luLXJpZ2h0OjBpbjsNCgltYXJn aW4tYm90dG9tOjBpbjsNCgltYXJnaW4tbGVmdDouNWluOw0KCW1hcmdpbi1ib3R0b206LjAwMDFw dDsNCglmb250LXNpemU6MTIuMHB0Ow0KCWZvbnQtZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlm O30NCnNwYW4uRW1haWxTdHlsZTE4DQoJe21zby1zdHlsZS10eXBlOnBlcnNvbmFsOw0KCWZvbnQt ZmFtaWx5OiJDYWxpYnJpIixzYW5zLXNlcmlmOw0KCWNvbG9yOndpbmRvd3RleHQ7fQ0Kc3Bhbi5F bWFpbFN0eWxlMTkNCgl7bXNvLXN0eWxlLXR5cGU6cGVyc29uYWwtcmVwbHk7DQoJZm9udC1mYW1p bHk6IkNhbGlicmkiLHNhbnMtc2VyaWY7DQoJY29sb3I6IzFGNDk3RDt9DQouTXNvQ2hwRGVmYXVs dA0KCXttc28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsNCglmb250LXNpemU6MTAuMHB0O30NCkBw YWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjguNWluIDExLjBpbjsNCgltYXJnaW46MS4waW4gMS4w aW4gMS4waW4gMS4waW47fQ0KZGl2LldvcmRTZWN0aW9uMQ0KCXtwYWdlOldvcmRTZWN0aW9uMTt9 DQotLT48L3N0eWxlPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPg0KPG86c2hhcGVkZWZhdWx0cyB2 OmV4dD0iZWRpdCIgc3BpZG1heD0iMTAyNiIgLz4NCjwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYg Z3RlIG1zbyA5XT48eG1sPg0KPG86c2hhcGVsYXlvdXQgdjpleHQ9ImVkaXQiPg0KPG86aWRtYXAg djpleHQ9ImVkaXQiIGRhdGE9IjEiIC8+DQo8L286c2hhcGVsYXlvdXQ+PC94bWw+PCFbZW5kaWZd LS0+DQo8L2hlYWQ+DQo8Ym9keSBsYW5nPSJFTi1VUyIgbGluaz0iIzA1NjNDMSIgdmxpbms9IiM5 NTRGNzIiPg0KPGRpdiBjbGFzcz0iV29yZFNlY3Rpb24xIj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi PjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2NvbG9yOiMxRjQ5N0QiPkhpIEpvaG4sPG86 cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMS4wcHQ7Y29sb3I6IzFGNDk3RCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9w Pg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQ7Y29s b3I6IzFGNDk3RCI+VGhlIG5ldyBBUEkgaXMgaW50ZW5kZWQgdG8gYWxsb3cgbWVtb3J5IHRoYXQg aXMgc2hhcmVkIGFuZCBub3QgRE1BLWFibGUsIHNvIHNwZGtfZG1hX21hbGxvYygpIHdvdWxkbuKA mXQgYmUgYW4gYXBwcm9wcmlhdGUgbmFtZTsgYWxzbywgd2UgZGlkIG5vdCB3YW50IHRvIGJyZWFr IHB1YmxpYyBBUEkgYnkgYWRkaW5nIGEgbmV3IGZsYWdzDQogcGFyYW1ldGVyIHRvIHRoZSBleGlz dGluZyBmdW5jdGlvbi4mbmJzcDsgV2UgaW50ZW5kIHRvIHVwZGF0ZSB0aGUgaW50ZXJuYWwgU1BE SyBjYWxsZXJzIG9mIHNwZGtfZG1hX21hbGxvYygpIHRvIGFsbCB1c2Ugc3Bka19tYWxsb2MoKSB3 aXRoIHRoZSBhcHByb3ByaWF0ZSBmbGFncyAobGVhdmluZyB0aGUgb2xkIG5hbWVzIGZvciBiYWNr d2FyZHMgY29tcGF0aWJpbGl0eSBmb3Igbm93KS48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtjb2xvcjojMUY0 OTdEIj48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtjb2xvcjojMUY0OTdEIj5JZiB0aGUgdXNlciBw YXNzZXMgZmxhZ3MgPT0gMCB0byB0aGUgbmV3IHNwZGtfbWFsbG9jKCkgY2FsbCwgdGhpcyBjb3Vs ZCBiZSBpbXBsZW1lbnRlZCBieSBtYWxsb2MoKSBvciBlcXVpdmFsZW50IGJlaGluZCB0aGUgc2Nl bmVzLCBzaW5jZSB0aGUgbWVtb3J5IGRvZXMgbm90IG5lZWQgdG8gYmUgRE1BLWFibGUgb3Igc2hh cmVkIGFjcm9zcw0KIG11bHRpLXByb2Nlc3MgYm91bmRhcmllcyAoaXQgaGFzIG5vIHNwZWNpYWwg cHJvcGVydGllcykuJm5ic3A7IERvZXMgdGhpcyBzdWZmaWNlIGZvciB5b3VyIHVzZSBjYXNlPzxv OnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJm b250LXNpemU6MTEuMHB0O2NvbG9yOiMxRjQ5N0QiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0O2Nv bG9yOiMxRjQ5N0QiPlRoYW5rcyw8bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNv Tm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtjb2xvcjojMUY0OTdEIj4tLSBE YW5pZWwgPG86cD4NCjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3Bh biBzdHlsZT0iZm9udC1zaXplOjExLjBwdDtjb2xvcjojMUY0OTdEIj48bzpwPiZuYnNwOzwvbzpw Pjwvc3Bhbj48L3A+DQo8ZGl2IHN0eWxlPSJib3JkZXI6bm9uZTtib3JkZXItbGVmdDpzb2xpZCBi bHVlIDEuNXB0O3BhZGRpbmc6MGluIDBpbiAwaW4gNC4wcHQiPg0KPGRpdj4NCjxkaXYgc3R5bGU9 ImJvcmRlcjpub25lO2JvcmRlci10b3A6c29saWQgI0UxRTFFMSAxLjBwdDtwYWRkaW5nOjMuMHB0 IDBpbiAwaW4gMGluIj4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxhIG5hbWU9Il9fX19fcmVwbHlz ZXBhcmF0b3IiPjwvYT48Yj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdCI+RnJvbTo8L3Nw YW4+PC9iPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij4gU1BESyBbbWFpbHRvOnNwZGst Ym91bmNlc0BsaXN0cy4wMS5vcmddDQo8Yj5PbiBCZWhhbGYgT2YgPC9iPk1lbmVnaGluaSwgSm9o bjxicj4NCjxiPlNlbnQ6PC9iPiBUaHVyc2RheSwgTWF5IDMsIDIwMTggMTA6NTMgQU08YnI+DQo8 Yj5Ubzo8L2I+IEhhcnJpcywgSmFtZXMgUiAmbHQ7amFtZXMuci5oYXJyaXNAaW50ZWwuY29tJmd0 OzsgV2Fsa2VyLCBCZW5qYW1pbiAmbHQ7YmVuamFtaW4ud2Fsa2VyQGludGVsLmNvbSZndDs7IHou a2hhdGFtaTg4QGdtYWlsLmNvbTsgU3RvcmFnZSBQZXJmb3JtYW5jZSBEZXZlbG9wbWVudCBLaXQg Jmx0O3NwZGtAbGlzdHMuMDEub3JnJmd0Ozxicj4NCjxiPkNjOjwvYj4gTWVuZWdoaW5pLCBKb2hu ICZsdDtKb2huLk1lbmVnaGluaUBuZXRhcHAuY29tJmd0Ozxicj4NCjxiPlN1YmplY3Q6PC9iPiBb U1BES10gc3Bka19tYWxsb2MgdnMuIG1hbGxvYzxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij5IaSBKaW0s IEJlbiwgYW5kIFphaHJhLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij48bzpwPiZuYnNwOzwvbzpwPjwvc3Bh bj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBw dCI+SSBhbSBzb3JyeSBJIGRpZG7igJl0IGNhdGNoIHRoaXMgZHVyaW5nIHRoZSBjb2RlIHJldmll dywgYnV0IGl04oCZcyByZWFsbHkgaGFyZCB0byBrZWVwIHRyYWNrIG9mIGFsbCBvZiB0aGUgY2hh bmdlcyB0aGF0IGFyZSBnb2luZyBvbi4mbmJzcDsNCjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0i Zm9udC1zaXplOjExLjBwdCI+PGEgaHJlZj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvLyMv Yy9zcGRrL3NwZGsvJiM0MzsvNDAyMzM0LyI+aHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvLyMv Yy9zcGRrL3NwZGsvJiM0MzsvNDAyMzM0LzwvYT48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdCI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZv bnQtc2l6ZToxMS4wcHQiPkFzIHlvdSBtYXkgcmVjYWxsLCB3ZSB3YW50ZWQgdG8gdXNlIHNwZGtf bWFsbG9jIGFuZCBzcGRrX2NhbGxvYyB0byBhYnN0cmFjdCB0aGUgUE9TSVggbWFsbG9jIGFuZCBj YWxsb2MgY2FsbHMuJm5ic3A7IFRoaXMgaXMgc3RpbGwgYW4gaXNzdWUgaW4gbXVsdGlwbGUgcGxh Y2VzIGFzIHdlIHdhbnQgYSBub24tYmxvY2tpbmcgbWFsbG9jIGFuZCBjYWxsb2MgY2FsbCB0aGF0 DQogcmV0dXJucyBhIHN0YXR1cyByYXRoZXIgdGhhbiBzZXR0aW5nIGVycm5vIChlLmcuIHRvIEVO T01FTSkuIFJlbWVtYmVyLCBub3QgYWxsIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgc3VwcG9ydCBl cnJuby48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBz dHlsZT0iZm9udC1zaXplOjExLjBwdCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQiPkNhbiB3ZSBy ZXZlcnQgY2hhbmdlIGE3N2NkM2Y3LCBhbmQgdXNlIHRoZSBzcGRrX21hbGxvYy9jYWxsb2MvZnJl ZSBhcGkgZm9yIHRoYXQgcHVycG9zZT88bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0i TXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdCI+PG86cD4mbmJzcDs8L286 cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6 ZToxMS4wcHQiPkFsc28sIEkgZG9u4oCZdCBzZWUgdGhlIHBvaW50IG9mIGludHJvZHVjaW5nIGFu IGFkZGl0aW9uYWwgQVBJIGZvciBkbWEtYWJsZSBtZW1vcnkuJm5ic3A7Jm5ic3A7ICZuYnNwO1dl IHdlbnQgdGhyb3VnaCB0aGlzIG9uY2UgYmVmb3JlLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxw IGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij48bzpwPiZu YnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0i Zm9udC1zaXplOjExLjBwdCI+KiBhNzdjZDNmNyAyMDE4LTA0LTI0Jm5ic3A7IGVudjogYWRkIG1h bGxvYyB2YXJpYW50cyB3aXRoIERNQS9zaGFyZWFibGUgZmxhZ3MgWyBCZW4gV2Fsa2VyIC8NCjxh IGhyZWY9Im1haWx0bzp6LmtoYXRhbWk4OEBnbWFpbC5jb20iPnoua2hhdGFtaTg4QGdtYWlsLmNv bTwvYT4gXTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij4qIDhhNDQyMjBiIDIwMTctMDUtMzEmbmJzcDsgZW52 OiBSZW5hbWUgc3Bka19tYWxsb2Mvem1hbGxvYy9yZWFsbG9jL2ZyZWUgdG8gc3Bka19kbWFfKGZ1 bmMpIFsgSmltIEhhcnJpcyAvDQo8YSBocmVmPSJtYWlsdG86am9obm1AbmV0YXBwLmNvbSI+am9o bm1AbmV0YXBwLmNvbTwvYT4gXTxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29O b3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij48bzpwPiZuYnNwOzwvbzpwPjwv c3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjEx LjBwdCI+SSBmdWxseSBzdXBwb3J0IGFkZGluZyB0aGUgU1BES19NQUxMT0NfRE1BIGFuZCBTUERL X01BTExPQ19TSEFSRSBmbGFnIGFuZCBzb2NrZXRfaWQgdG8gc3Bka19kbWFfbWFsbG9jL3ptYWxs b2MoKSwgYW5kIEkgcHJlZmVyIHRvIGRvIHRoaXMgcmF0aGVyIHRoYW4gaW52ZW50IGEgbmV3IEFQ SSBmb3IgYWxsb2NhdGluZyBkbWEtYWJsZSBtZW1vcnkuPG86cD48L286cD48L3NwYW4+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQiPjxvOnA+ Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxl PSJmb250LXNpemU6MTEuMHB0Ij52b2lkICpzcGRrX2RtYV9tYWxsb2Moc2l6ZV90IHNpemUsIHNp emVfdCBhbGlnbiwgdWludDY0X3QgKnBoeXNfYWRkcik7PG86cD48L286cD48L3NwYW4+PC9wPg0K PHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQiPnZvaWQg Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7KnNwZGtfbWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sIHVpbnQ2NF90ICpwaHlz X2FkZHIsIGludCBzb2NrZXRfaWQsIHVpbnQzMl90IGZsYWdzKTs8bzpwPjwvbzpwPjwvc3Bhbj48 L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdCI+ PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4g c3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQiPknigJltIHByb3Bvc2luZzo8bzpwPjwvbzpwPjwvc3Bh bj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBw dCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PGI+ PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQiPnZvaWQgKnNwZGtfZG1hX21hbGxvYyhzaXpl X3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1aW50NjRfdCAqcGh5c19hZGRyLCBpbnQgc29ja2V0X2lk LCB1aW50MzJfdCBmbGFncyk7PG86cD48L286cD48L3NwYW4+PC9iPjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij48bzpwPiZuYnNwOzwvbzpw Pjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXpl OjExLjBwdCI+L0pvaG48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQi PlAuUy4gV2hhdCBJIHJlYWxseSBuZWVkIGlzIGEgZmlsdGVyIHRoYXQgYWxsb3dzIG1lIHRvIHdh dGNoIGFsbCBvZiB0aGUgaGVhZGVycyBpbiBpbmNsdWRlL3NwZGsve2FwaX0uaC4mbmJzcDsgTG9v a2luZyBhdCB0aGUgR2Vycml0SHViIGRvY3VtZW50YXRpb24sIEkgc2VlIG5vIHdheSB0byBkbyB0 aGlzLiZuYnNwOyBJdCBhcHBlYXJzIGFsbCBJIGNhbiBkbyBpcyB3YXRjaCB0aGUNCiBtYXN0ZXIg YnJhbmNoLjxvOnA+PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdCI+PGEgaHJl Zj0iaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvL0RvY3VtZW50YXRpb24vaW50cm8tdXNlci5o dG1sI3dhdGNoIj5odHRwczovL3Jldmlldy5nZXJyaXRodWIuaW8vRG9jdW1lbnRhdGlvbi9pbnRy by11c2VyLmh0bWwjd2F0Y2g8L2E+PG86cD48L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQiPjxvOnA+Jm5ic3A7PC9vOnA+ PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6 MTEuMHB0Ij48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFs Ij48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdCI+PG86cD4mbmJzcDs8L286cD48L3NwYW4+ PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9ImZvbnQtc2l6ZToxMS4wcHQi PjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxzcGFu IHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij48bzpwPiZuYnNwOzwvbzpwPjwvc3Bhbj48L3A+DQo8 cCBjbGFzcz0iTXNvTm9ybWFsIj48c3BhbiBzdHlsZT0iZm9udC1zaXplOjExLjBwdCI+PG86cD4m bmJzcDs8L286cD48L3NwYW4+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCI+PHNwYW4gc3R5bGU9 ImZvbnQtc2l6ZToxMS4wcHQiPjxvOnA+Jm5ic3A7PC9vOnA+PC9zcGFuPjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiPjxzcGFuIHN0eWxlPSJmb250LXNpemU6MTEuMHB0Ij48bzpwPiZuYnNwOzwv bzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K --===============8488921559573439036==--