From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: multipart/mixed; boundary="===============1221484326538599555==" MIME-Version: 1.0 From: Harris, James R Subject: Re: [SPDK] blobstore metadata questions, comments and potential issues Date: Mon, 02 Oct 2017 21:46:21 +0000 Message-ID: List-ID: To: spdk@lists.01.org --===============1221484326538599555== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Hey Paul, The masks on disk are solely an optimization during load. We only write th= e masks out to disk when a Blobstore is unloaded. If Blobstore is not unlo= aded cleanly, we can rebuild both masks with a full walk of all of the meta= data pages. This avoids an extra page write on every metadata operation (c= reate/delete/resize/xattr). I agree that we should defer clearing the clean bit until the first metadat= a operation. That is not in the I/O path so an extra step on create/delete= /resize/xattr would not be cumbersome. -Jim From: SPDK on behalf of Paul E Luse Reply-To: Storage Performance Development Kit Date: Monday, October 2, 2017 at 2:00 PM To: Storage Performance Development Kit Subject: [SPDK] blobstore metadata questions, comments and potential issues Guys- Going through the finer details on MD handling (for the first time so forgi= ve misunderstandings) before looking more closely at Cunyn=E2=80=99s patch = (https://review.gerrithub.io/#/c/376470/ ) and I=E2=80=99m seeing some unex= pected, well IMHO, things that I wanted to cover real quick. Mostly they re= late to my very early comments on the patch where we never updated the clea= n bit in MD. Forget blobstore or the patch for a minute, in general I would argue that t= he most efficient way to manage clean/dirty metadata in a system like this = is: - When you init the system you are clean by definition so your on-= disk and in-memory structs should match and your =E2=80=98clean=E2=80=99 bi= t should be 1 in both cases - When you encounter an event that requires a metadata change: o If your in-memory clean=3D=3D0 do nothing wrt on disk sync=E2=80=99ing= because you=E2=80=99re already dirty o If your in-memory clean=3D=3D1 then set to 0 and write the on-disk cle= an to 0 so that (a) you know you don=E2=80=99t need to update on disk clean= w/next MD update and (b) you are protected from power fail because on disk= clean is now 1. Do not sync metadata, this is just an update to that bit = (or in our case a superblock-only write) - In each of these following scenarios do a full sync of the metad= ata and set clean to 1 both in memory and on disk o Just loaded or initialized the system o Unloading the system o Just recovered the system after loading and recognizing that clean was= 0 so you rebuilt everything So when I look through blobstore and see the following I can certainly cont= inue to review the patch as it builds on this but would like to follow it u= p with a patch to make it work like above so that we don=E2=80=99t have win= dows where we are dirty for no reason. But, before that I also have a few questions for things I just don=E2=80=99= t understand. - When we init a BS we claim the MD used cluster in memory but nev= er sync. I assume this is not an oversight because clean is 0 (but if we do= the stuff I mention above this would end with a superblock only update to = set clean to 1) - When we load a BS, (with the patch) we are going to immediately= change clean to 0 (assuming we didn=E2=80=99t come up dirty) and then turn= right around and not only update the superblock to set clean to 0 (just ex= plained how I feel about that) but then we recalc and then rewrite, to disk= the masks that we just read when nothing could have changed? If I read thi= s correctly, besides my comment about us not actually being dirty yet, why = are we updating the on disks masks again? - When an app calls spdk_bs_md_sync_blob after a resize or someth= ing, I don=E2=80=99t see where the masks on disk immediately following the = superblock are ever updated. It appears at least that we are only updating = he metadata for the blob itself and the in memory masks (in the bs struct) = but not the on disk masks. So any scenario where we do a resize & sync (or = xattr and sync) and have a dirty shutdown, even with the recovery code, is = going to end up corrupted right? It seems like the on disk masks that are s= tored just after the superblock need to be written as part of spdk_bs_md_sy= nc_blob() and from what I can tell they=E2=80=99re only updated with unload= today. This is, of course, independent of Cunyin=E2=80=99s patch but I wan= ted to ask about it since that=E2=80=99s the context I=E2=80=99m looking at= it from Sorry for the length email and all the claims/questions. I=E2=80=99m certai= n I have mis-read some of this stuff at least but w/o understanding these p= oints I can=E2=80=99t really responsibly review Cunyin=E2=80=99s patch whic= h is critical I think=E2=80=A6 well, his patch is critical I mean, not my r= eview of it =E2=98=BA -Paul --===============1221484326538599555== 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 CkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCglwYW5vc2UtMToyIDcg MyA5IDIgMiA1IDIgNCA0O30NCkBmb250LWZhY2UNCgl7Zm9udC1mYW1pbHk6V2luZ2RpbmdzOw0K CXBhbm9zZS0xOjUgMCAwIDAgMCAwIDAgMCAwIDA7fQ0KQGZvbnQtZmFjZQ0KCXtmb250LWZhbWls eToiQ2FtYnJpYSBNYXRoIjsNCglwYW5vc2UtMToyIDQgNSAzIDUgNCA2IDMgMiA0O30NCkBmb250 LWZhY2UNCgl7Zm9udC1mYW1pbHk6RGVuZ1hpYW47DQoJcGFub3NlLTE6MiAxIDYgMCAzIDEgMSAx IDEgMTt9DQpAZm9udC1mYWNlDQoJe2ZvbnQtZmFtaWx5OkNhbGlicmk7DQoJcGFub3NlLTE6MiAx NSA1IDIgMiAyIDQgMyAyIDQ7fQ0KLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8NCnAuTXNvTm9ybWFs LCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwNCgl7bWFyZ2luOjBpbjsNCgltYXJnaW4tYm90 dG9tOi4wMDAxcHQ7DQoJZm9udC1zaXplOjExLjBwdDsNCglmb250LWZhbWlseTpDYWxpYnJpO30N CmE6bGluaywgc3Bhbi5Nc29IeXBlcmxpbmsNCgl7bXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCWNv bG9yOiMwNTYzQzE7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQphOnZpc2l0ZWQsIHNw YW4uTXNvSHlwZXJsaW5rRm9sbG93ZWQNCgl7bXNvLXN0eWxlLXByaW9yaXR5Ojk5Ow0KCWNvbG9y OiM5NTRGNzI7DQoJdGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZTt9DQpwLk1zb0xpc3RQYXJhZ3Jh cGgsIGxpLk1zb0xpc3RQYXJhZ3JhcGgsIGRpdi5Nc29MaXN0UGFyYWdyYXBoDQoJe21zby1zdHls ZS1wcmlvcml0eTozNDsNCgltYXJnaW4tdG9wOjBpbjsNCgltYXJnaW4tcmlnaHQ6MGluOw0KCW1h cmdpbi1ib3R0b206MGluOw0KCW1hcmdpbi1sZWZ0Oi41aW47DQoJbWFyZ2luLWJvdHRvbTouMDAw MXB0Ow0KCWZvbnQtc2l6ZToxMS4wcHQ7DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTt9DQpzcGFuLkVt YWlsU3R5bGUxOA0KCXttc28tc3R5bGUtdHlwZTpwZXJzb25hbDsNCglmb250LWZhbWlseTpDYWxp YnJpOw0KCWNvbG9yOndpbmRvd3RleHQ7fQ0Kc3Bhbi5FbWFpbFN0eWxlMTkNCgl7bXNvLXN0eWxl LXR5cGU6cGVyc29uYWwtcmVwbHk7DQoJZm9udC1mYW1pbHk6Q2FsaWJyaTsNCgljb2xvcjp3aW5k b3d0ZXh0O30NCnNwYW4ubXNvSW5zDQoJe21zby1zdHlsZS10eXBlOmV4cG9ydC1vbmx5Ow0KCW1z by1zdHlsZS1uYW1lOiIiOw0KCXRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7DQoJY29sb3I6dGVh bDt9DQouTXNvQ2hwRGVmYXVsdA0KCXttc28tc3R5bGUtdHlwZTpleHBvcnQtb25seTsNCglmb250 LXNpemU6MTAuMHB0O30NCkBwYWdlIFdvcmRTZWN0aW9uMQ0KCXtzaXplOjguNWluIDExLjBpbjsN CgltYXJnaW46MS4waW4gMS4waW4gMS4waW4gMS4waW47fQ0KZGl2LldvcmRTZWN0aW9uMQ0KCXtw YWdlOldvcmRTZWN0aW9uMTt9DQovKiBMaXN0IERlZmluaXRpb25zICovDQpAbGlzdCBsMA0KCXtt c28tbGlzdC1pZDozMDQ4OTA4MDY7DQoJbXNvLWxpc3QtdHlwZTpoeWJyaWQ7DQoJbXNvLWxpc3Qt dGVtcGxhdGUtaWRzOjYzOTE1MzgyMCAyMDUwODk0ODc0IDY3Njk4NjkxIDY3Njk4NjkzIDY3Njk4 Njg5IDY3Njk4NjkxIDY3Njk4NjkzIDY3Njk4Njg5IDY3Njk4NjkxIDY3Njk4NjkzO30NCkBsaXN0 IGwwOmxldmVsMQ0KCXttc28tbGV2ZWwtc3RhcnQtYXQ6MDsNCgltc28tbGV2ZWwtbnVtYmVyLWZv cm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ6LTsNCgltc28tbGV2ZWwtdGFiLXN0b3A6bm9u ZTsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4dC1pbmRlbnQ6LS4yNWlu Ow0KCWZvbnQtZmFtaWx5OkNhbGlicmk7DQoJbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6Q2FsaWJy aTt9DQpAbGlzdCBsMDpsZXZlbDINCgl7bXNvLWxldmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0K CW1zby1sZXZlbC10ZXh0Om87DQoJbXNvLWxldmVsLXRhYi1zdG9wOm5vbmU7DQoJbXNvLWxldmVs LW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCglmb250LWZhbWls eToiQ291cmllciBOZXciO30NCkBsaXN0IGwwOmxldmVsMw0KCXttc28tbGV2ZWwtbnVtYmVyLWZv cm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674KnOw0KCW1zby1sZXZlbC10YWItc3RvcDpu b25lOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1 aW47DQoJZm9udC1mYW1pbHk6V2luZ2RpbmdzO30NCkBsaXN0IGwwOmxldmVsNA0KCXttc28tbGV2 ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ674K3Ow0KCW1zby1sZXZl bC10YWItc3RvcDpub25lOw0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0 LWluZGVudDotLjI1aW47DQoJZm9udC1mYW1pbHk6U3ltYm9sO30NCkBsaXN0IGwwOmxldmVsNQ0K CXttc28tbGV2ZWwtbnVtYmVyLWZvcm1hdDpidWxsZXQ7DQoJbXNvLWxldmVsLXRleHQ6bzsNCglt c28tbGV2ZWwtdGFiLXN0b3A6bm9uZTsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7 DQoJdGV4dC1pbmRlbnQ6LS4yNWluOw0KCWZvbnQtZmFtaWx5OiJDb3VyaWVyIE5ldyI7fQ0KQGxp c3QgbDA6bGV2ZWw2DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxldDsNCgltc28tbGV2 ZWwtdGV4dDrvgqc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOm5vbmU7DQoJbXNvLWxldmVsLW51bWJl ci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCglmb250LWZhbWlseTpXaW5n ZGluZ3M7fQ0KQGxpc3QgbDA6bGV2ZWw3DQoJe21zby1sZXZlbC1udW1iZXItZm9ybWF0OmJ1bGxl dDsNCgltc28tbGV2ZWwtdGV4dDrvgrc7DQoJbXNvLWxldmVsLXRhYi1zdG9wOm5vbmU7DQoJbXNv LWxldmVsLW51bWJlci1wb3NpdGlvbjpsZWZ0Ow0KCXRleHQtaW5kZW50Oi0uMjVpbjsNCglmb250 LWZhbWlseTpTeW1ib2w7fQ0KQGxpc3QgbDA6bGV2ZWw4DQoJe21zby1sZXZlbC1udW1iZXItZm9y bWF0OmJ1bGxldDsNCgltc28tbGV2ZWwtdGV4dDpvOw0KCW1zby1sZXZlbC10YWItc3RvcDpub25l Ow0KCW1zby1sZXZlbC1udW1iZXItcG9zaXRpb246bGVmdDsNCgl0ZXh0LWluZGVudDotLjI1aW47 DQoJZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3Ijt9DQpAbGlzdCBsMDpsZXZlbDkNCgl7bXNvLWxl dmVsLW51bWJlci1mb3JtYXQ6YnVsbGV0Ow0KCW1zby1sZXZlbC10ZXh0Ou+CpzsNCgltc28tbGV2 ZWwtdGFiLXN0b3A6bm9uZTsNCgltc28tbGV2ZWwtbnVtYmVyLXBvc2l0aW9uOmxlZnQ7DQoJdGV4 dC1pbmRlbnQ6LS4yNWluOw0KCWZvbnQtZmFtaWx5OldpbmdkaW5nczt9DQpvbA0KCXttYXJnaW4t Ym90dG9tOjBpbjt9DQp1bA0KCXttYXJnaW4tYm90dG9tOjBpbjt9DQotLT48L3N0eWxlPg0KPC9o ZWFkPg0KPGJvZHkgYmdjb2xvcj0id2hpdGUiIGxhbmc9IkVOLVVTIiBsaW5rPSIjMDU2M0MxIiB2 bGluaz0iIzk1NEY3MiI+DQo8ZGl2IGNsYXNzPSJXb3JkU2VjdGlvbjEiPg0KPHAgY2xhc3M9Ik1z b05vcm1hbCI+SGV5IFBhdWwsPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48 bzpwPiZuYnNwOzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPlRoZSBtYXNrcyBvbiBk aXNrIGFyZSBzb2xlbHkgYW4gb3B0aW1pemF0aW9uIGR1cmluZyBsb2FkLiZuYnNwOyBXZSBvbmx5 IHdyaXRlIHRoZSBtYXNrcyBvdXQgdG8gZGlzayB3aGVuIGEgQmxvYnN0b3JlIGlzIHVubG9hZGVk LiZuYnNwOyBJZiBCbG9ic3RvcmUgaXMgbm90IHVubG9hZGVkIGNsZWFubHksIHdlIGNhbiByZWJ1 aWxkIGJvdGggbWFza3Mgd2l0aCBhIGZ1bGwgd2FsayBvZiBhbGwgb2YgdGhlIG1ldGFkYXRhIHBh Z2VzLiZuYnNwOw0KIFRoaXMgYXZvaWRzIGFuIGV4dHJhIHBhZ2Ugd3JpdGUgb24gZXZlcnkgbWV0 YWRhdGEgb3BlcmF0aW9uIChjcmVhdGUvZGVsZXRlL3Jlc2l6ZS94YXR0cikuDQo8bzpwPjwvbzpw PjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCI+SSBhZ3JlZSB0aGF0IHdlIHNob3VsZCBkZWZlciBjbGVhcmluZyB0aGUg Y2xlYW4gYml0IHVudGlsIHRoZSBmaXJzdCBtZXRhZGF0YSBvcGVyYXRpb24uJm5ic3A7IFRoYXQg aXMgbm90IGluIHRoZSBJL08gcGF0aCBzbyBhbiBleHRyYSBzdGVwIG9uIGNyZWF0ZS9kZWxldGUv cmVzaXplL3hhdHRyIHdvdWxkIG5vdCBiZSBjdW1iZXJzb21lLjxvOnA+PC9vOnA+PC9wPg0KPHAg Y2xhc3M9Ik1zb05vcm1hbCI+PG86cD4mbmJzcDs8L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9y bWFsIj4tSmltPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIj48bzpwPiZuYnNw OzwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiPjxvOnA+Jm5ic3A7PC9vOnA+PC9wPg0K PGRpdiBzdHlsZT0iYm9yZGVyOm5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAjQjVDNERGIDEuMHB0O3Bh ZGRpbmc6My4wcHQgMGluIDBpbiAwaW4iPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1h cmdpbi1sZWZ0Oi41aW4iPjxiPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+RnJvbTogPC9zcGFu Pg0KPC9iPjxzcGFuIHN0eWxlPSJjb2xvcjpibGFjayI+U1BESyAmbHQ7c3Bkay1ib3VuY2VzQGxp c3RzLjAxLm9yZyZndDsgb24gYmVoYWxmIG9mIFBhdWwgRSBMdXNlICZsdDtwYXVsLmUubHVzZUBp bnRlbC5jb20mZ3Q7PGJyPg0KPGI+UmVwbHktVG86IDwvYj5TdG9yYWdlIFBlcmZvcm1hbmNlIERl dmVsb3BtZW50IEtpdCAmbHQ7c3Bka0BsaXN0cy4wMS5vcmcmZ3Q7PGJyPg0KPGI+RGF0ZTogPC9i Pk1vbmRheSwgT2N0b2JlciAyLCAyMDE3IGF0IDI6MDAgUE08YnI+DQo8Yj5UbzogPC9iPlN0b3Jh Z2UgUGVyZm9ybWFuY2UgRGV2ZWxvcG1lbnQgS2l0ICZsdDtzcGRrQGxpc3RzLjAxLm9yZyZndDs8 YnI+DQo8Yj5TdWJqZWN0OiA8L2I+W1NQREtdIGJsb2JzdG9yZSBtZXRhZGF0YSBxdWVzdGlvbnMs IGNvbW1lbnRzIGFuZCBwb3RlbnRpYWwgaXNzdWVzPC9zcGFuPjxzcGFuIHN0eWxlPSJmb250LXNp emU6MTIuMHB0O2NvbG9yOmJsYWNrIj48bzpwPjwvbzpwPjwvc3Bhbj48L3A+DQo8L2Rpdj4NCjxk aXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+PHNwYW4g c3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+PG86cD4mbmJz cDs8L286cD48L3NwYW4+PC9wPg0KPC9kaXY+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0i bWFyZ2luLWxlZnQ6LjVpbiI+R3V5cy08bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3Jt YWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNs YXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5Hb2luZyB0aHJvdWdoIHRo ZSBmaW5lciBkZXRhaWxzIG9uIE1EIGhhbmRsaW5nIChmb3IgdGhlIGZpcnN0IHRpbWUgc28gZm9y Z2l2ZSBtaXN1bmRlcnN0YW5kaW5ncykgYmVmb3JlIGxvb2tpbmcgbW9yZSBjbG9zZWx5IGF0IEN1 bnlu4oCZcyBwYXRjaCAoaHR0cHM6Ly9yZXZpZXcuZ2Vycml0aHViLmlvLyMvYy8zNzY0NzAvICkg YW5kIEnigJltIHNlZWluZyBzb21lIHVuZXhwZWN0ZWQsDQogd2VsbCBJTUhPLCB0aGluZ3MgdGhh dCBJIHdhbnRlZCB0byBjb3ZlciByZWFsIHF1aWNrLiBNb3N0bHkgdGhleSByZWxhdGUgdG8gbXkg dmVyeSBlYXJseSBjb21tZW50cyBvbiB0aGUgcGF0Y2ggd2hlcmUgd2UgbmV2ZXIgdXBkYXRlZCB0 aGUgY2xlYW4gYml0IGluIE1ELjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9 Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPkZvcmdldCBibG9ic3RvcmUgb3Ig dGhlIHBhdGNoIGZvciBhIG1pbnV0ZSwgaW4gZ2VuZXJhbCBJIHdvdWxkIGFyZ3VlIHRoYXQgdGhl IG1vc3QgZWZmaWNpZW50IHdheSB0byBtYW5hZ2UgY2xlYW4vZGlydHkgbWV0YWRhdGEgaW4gYSBz eXN0ZW0gbGlrZSB0aGlzIGlzOjxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1hbCIg c3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9 Ik1zb0xpc3RQYXJhZ3JhcGgiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbjt0ZXh0LWluZGVudDot LjI1aW47bXNvLWxpc3Q6bDAgbGV2ZWwxIGxmbzIiPg0KPCFbaWYgIXN1cHBvcnRMaXN0c10+PHNw YW4gc3R5bGU9Im1zby1saXN0Oklnbm9yZSI+LTxzcGFuIHN0eWxlPSJmb250OjcuMHB0ICZxdW90 O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5i c3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjwhW2VuZGlmXT5XaGVuIHlvdSBp bml0IHRoZSBzeXN0ZW0geW91IGFyZSBjbGVhbiBieSBkZWZpbml0aW9uIHNvIHlvdXIgb24tZGlz ayBhbmQgaW4tbWVtb3J5IHN0cnVjdHMgc2hvdWxkIG1hdGNoIGFuZCB5b3VyIOKAmGNsZWFu4oCZ IGJpdCBzaG91bGQgYmUgMSBpbiBib3RoIGNhc2VzPG86cD48L286cD48L3A+DQo8cCBjbGFzcz0i TXNvTGlzdFBhcmFncmFwaCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluO3RleHQtaW5kZW50Oi0u MjVpbjttc28tbGlzdDpsMCBsZXZlbDEgbGZvMiI+DQo8IVtpZiAhc3VwcG9ydExpc3RzXT48c3Bh biBzdHlsZT0ibXNvLWxpc3Q6SWdub3JlIj4tPHNwYW4gc3R5bGU9ImZvbnQ6Ny4wcHQgJnF1b3Q7 VGltZXMgTmV3IFJvbWFuJnF1b3Q7Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJz cDsmbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PCFbZW5kaWZdPldoZW4geW91IGVu Y291bnRlciBhbiBldmVudCB0aGF0IHJlcXVpcmVzIGEgbWV0YWRhdGEgY2hhbmdlOjxvOnA+PC9v OnA+PC9wPg0KPHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiIHN0eWxlPSJtYXJnaW4tbGVmdDox LjVpbjt0ZXh0LWluZGVudDotLjI1aW47bXNvLWxpc3Q6bDAgbGV2ZWwyIGxmbzIiPg0KPCFbaWYg IXN1cHBvcnRMaXN0c10+PHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiZxdW90O0NvdXJpZXIgTmV3 JnF1b3Q7Ij48c3BhbiBzdHlsZT0ibXNvLWxpc3Q6SWdub3JlIj5vPHNwYW4gc3R5bGU9ImZvbnQ6 Ny4wcHQgJnF1b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7Ij4mbmJzcDsmbmJzcDsmbmJzcDsNCjwv c3Bhbj48L3NwYW4+PC9zcGFuPjwhW2VuZGlmXT5JZiB5b3VyIGluLW1lbW9yeSBjbGVhbj09MCBk byBub3RoaW5nIHdydCBvbiBkaXNrIHN5bmPigJlpbmcgYmVjYXVzZSB5b3XigJlyZSBhbHJlYWR5 IGRpcnR5PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCIgc3R5bGU9 Im1hcmdpbi1sZWZ0OjEuNWluO3RleHQtaW5kZW50Oi0uMjVpbjttc28tbGlzdDpsMCBsZXZlbDIg bGZvMiI+DQo8IVtpZiAhc3VwcG9ydExpc3RzXT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1 b3Q7Q291cmllciBOZXcmcXVvdDsiPjxzcGFuIHN0eWxlPSJtc28tbGlzdDpJZ25vcmUiPm88c3Bh biBzdHlsZT0iZm9udDo3LjBwdCAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDsiPiZuYnNwOyZu YnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48L3NwYW4+PCFbZW5kaWZdPklmIHlvdXIgaW4tbWVt b3J5IGNsZWFuPT0xIHRoZW4gc2V0IHRvIDAgYW5kIHdyaXRlIHRoZSBvbi1kaXNrIGNsZWFuIHRv IDAgc28gdGhhdCAoYSkgeW91IGtub3cgeW91IGRvbuKAmXQgbmVlZCB0byB1cGRhdGUgb24gZGlz ayBjbGVhbiB3L25leHQgTUQgdXBkYXRlIGFuZCAoYikgeW91IGFyZSBwcm90ZWN0ZWQgZnJvbSBw b3dlciBmYWlsIGJlY2F1c2Ugb24gZGlzayBjbGVhbiBpcyBub3cgMS4mbmJzcDsNCiBEbyBub3Qg c3luYyBtZXRhZGF0YSwgdGhpcyBpcyBqdXN0IGFuIHVwZGF0ZSB0byB0aGF0IGJpdCAob3IgaW4g b3VyIGNhc2UgYSBzdXBlcmJsb2NrLW9ubHkgd3JpdGUpPG86cD48L286cD48L3A+DQo8cCBjbGFz cz0iTXNvTGlzdFBhcmFncmFwaCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEuMGluO3RleHQtaW5kZW50 Oi0uMjVpbjttc28tbGlzdDpsMCBsZXZlbDEgbGZvMiI+DQo8IVtpZiAhc3VwcG9ydExpc3RzXT48 c3BhbiBzdHlsZT0ibXNvLWxpc3Q6SWdub3JlIj4tPHNwYW4gc3R5bGU9ImZvbnQ6Ny4wcHQgJnF1 b3Q7VGltZXMgTmV3IFJvbWFuJnF1b3Q7Ij4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsm bmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsNCjwvc3Bhbj48L3NwYW4+PCFbZW5kaWZdPkluIGVhY2gg b2YgdGhlc2UgZm9sbG93aW5nIHNjZW5hcmlvcyBkbyBhIGZ1bGwgc3luYyBvZiB0aGUgbWV0YWRh dGEgYW5kIHNldCBjbGVhbiB0byAxIGJvdGggaW4gbWVtb3J5IGFuZCBvbiBkaXNrPG86cD48L286 cD48L3A+DQo8cCBjbGFzcz0iTXNvTGlzdFBhcmFncmFwaCIgc3R5bGU9Im1hcmdpbi1sZWZ0OjEu NWluO3RleHQtaW5kZW50Oi0uMjVpbjttc28tbGlzdDpsMCBsZXZlbDIgbGZvMiI+DQo8IVtpZiAh c3VwcG9ydExpc3RzXT48c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6JnF1b3Q7Q291cmllciBOZXcm cXVvdDsiPjxzcGFuIHN0eWxlPSJtc28tbGlzdDpJZ25vcmUiPm88c3BhbiBzdHlsZT0iZm9udDo3 LjBwdCAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNwOw0KPC9z cGFuPjwvc3Bhbj48L3NwYW4+PCFbZW5kaWZdPkp1c3QgbG9hZGVkIG9yIGluaXRpYWxpemVkIHRo ZSBzeXN0ZW08bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIiBzdHls ZT0ibWFyZ2luLWxlZnQ6MS41aW47dGV4dC1pbmRlbnQ6LS4yNWluO21zby1saXN0OmwwIGxldmVs MiBsZm8yIj4NCjwhW2lmICFzdXBwb3J0TGlzdHNdPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90OyI+PHNwYW4gc3R5bGU9Im1zby1saXN0Oklnbm9yZSI+bzxz cGFuIHN0eWxlPSJmb250OjcuMHB0ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+Jm5ic3A7 Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjwvc3Bhbj48IVtlbmRpZl0+VW5sb2FkaW5nIHRo ZSBzeXN0ZW08bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIiBzdHls ZT0ibWFyZ2luLWxlZnQ6MS41aW47dGV4dC1pbmRlbnQ6LS4yNWluO21zby1saXN0OmwwIGxldmVs MiBsZm8yIj4NCjwhW2lmICFzdXBwb3J0TGlzdHNdPjxzcGFuIHN0eWxlPSJmb250LWZhbWlseTom cXVvdDtDb3VyaWVyIE5ldyZxdW90OyI+PHNwYW4gc3R5bGU9Im1zby1saXN0Oklnbm9yZSI+bzxz cGFuIHN0eWxlPSJmb250OjcuMHB0ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+Jm5ic3A7 Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjwvc3Bhbj48IVtlbmRpZl0+SnVzdCByZWNvdmVy ZWQgdGhlIHN5c3RlbSBhZnRlciBsb2FkaW5nIGFuZCByZWNvZ25pemluZyB0aGF0IGNsZWFuIHdh cyAwIHNvIHlvdSByZWJ1aWx0IGV2ZXJ5dGhpbmc8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJN c29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4N CjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj5TbyB3aGVuIEkg bG9vayB0aHJvdWdoIGJsb2JzdG9yZSBhbmQgc2VlIHRoZSBmb2xsb3dpbmcgSSBjYW4gY2VydGFp bmx5IGNvbnRpbnVlIHRvIHJldmlldyB0aGUgcGF0Y2ggYXMgaXQgYnVpbGRzIG9uIHRoaXMgYnV0 IHdvdWxkIGxpa2UgdG8gZm9sbG93IGl0IHVwIHdpdGggYSBwYXRjaCB0byBtYWtlIGl0IHdvcmsg bGlrZSBhYm92ZSBzbyB0aGF0IHdlIGRvbuKAmXQgaGF2ZQ0KIHdpbmRvd3Mgd2hlcmUgd2UgYXJl IGRpcnR5IGZvciBubyByZWFzb24uIDxvOnA+PC9vOnA+PC9wPg0KPHAgY2xhc3M9Ik1zb05vcm1h bCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPiZuYnNwOzxvOnA+PC9vOnA+PC9wPg0KPHAgY2xh c3M9Ik1zb05vcm1hbCIgc3R5bGU9Im1hcmdpbi1sZWZ0Oi41aW4iPkJ1dCwgYmVmb3JlIHRoYXQg SSBhbHNvIGhhdmUgYSBmZXcgcXVlc3Rpb25zIGZvciB0aGluZ3MgSSBqdXN0IGRvbuKAmXQgdW5k ZXJzdGFuZC48bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJn aW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29MaXN0UGFy YWdyYXBoIiBzdHlsZT0ibWFyZ2luLWxlZnQ6MS4waW47dGV4dC1pbmRlbnQ6LS4yNWluO21zby1s aXN0OmwwIGxldmVsMSBsZm8yIj4NCjwhW2lmICFzdXBwb3J0TGlzdHNdPjxzcGFuIHN0eWxlPSJt c28tbGlzdDpJZ25vcmUiPi08c3BhbiBzdHlsZT0iZm9udDo3LjBwdCAmcXVvdDtUaW1lcyBOZXcg Um9tYW4mcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZu YnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48IVtlbmRpZl0+V2hlbiB3ZSA8Yj5pbml0IGEgQlM8 L2I+IHdlIGNsYWltIHRoZSBNRCB1c2VkIGNsdXN0ZXIgaW4gbWVtb3J5IGJ1dCBuZXZlciBzeW5j LiBJIGFzc3VtZSB0aGlzIGlzIG5vdCBhbiBvdmVyc2lnaHQgYmVjYXVzZSBjbGVhbiBpcyAwIChi dXQgaWYgd2UgZG8gdGhlIHN0dWZmIEkgbWVudGlvbiBhYm92ZSB0aGlzIHdvdWxkIGVuZCB3aXRo IGEgc3VwZXJibG9jayBvbmx5IHVwZGF0ZSB0byBzZXQgY2xlYW4gdG8NCiAxKSA8bzpwPjwvbzpw PjwvcD4NCjxwIGNsYXNzPSJNc29MaXN0UGFyYWdyYXBoIiBzdHlsZT0ibWFyZ2luLWxlZnQ6MS4w aW47dGV4dC1pbmRlbnQ6LS4yNWluO21zby1saXN0OmwwIGxldmVsMSBsZm8yIj4NCjwhW2lmICFz dXBwb3J0TGlzdHNdPjxzcGFuIHN0eWxlPSJtc28tbGlzdDpJZ25vcmUiPi08c3BhbiBzdHlsZT0i Zm9udDo3LjBwdCAmcXVvdDtUaW1lcyBOZXcgUm9tYW4mcXVvdDsiPiZuYnNwOyZuYnNwOyZuYnNw OyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOw0KPC9zcGFuPjwvc3Bhbj48IVtl bmRpZl0+Jm5ic3A7V2hlbiB3ZTxiPiBsb2FkIGEgQlM8L2I+LCAod2l0aCB0aGUgcGF0Y2gpIHdl IGFyZSBnb2luZyB0byBpbW1lZGlhdGVseSBjaGFuZ2UgY2xlYW4gdG8gMCAoYXNzdW1pbmcgd2Ug ZGlkbuKAmXQgY29tZSB1cCBkaXJ0eSkgYW5kIHRoZW4gdHVybiByaWdodCBhcm91bmQgYW5kIG5v dCBvbmx5IHVwZGF0ZSB0aGUgc3VwZXJibG9jayB0byBzZXQgY2xlYW4gdG8gMCAoanVzdCBleHBs YWluZWQgaG93IEkgZmVlbCBhYm91dA0KIHRoYXQpIGJ1dCB0aGVuIHdlIHJlY2FsYyBhbmQgdGhl biByZXdyaXRlLCB0byBkaXNrIHRoZSBtYXNrcyB0aGF0IHdlIGp1c3QgcmVhZCB3aGVuIG5vdGhp bmcgY291bGQgaGF2ZSBjaGFuZ2VkPyBJZiBJIHJlYWQgdGhpcyBjb3JyZWN0bHksIGJlc2lkZXMg bXkgY29tbWVudCBhYm91dCB1cyBub3QgYWN0dWFsbHkgYmVpbmcgZGlydHkgeWV0LCB3aHkgYXJl IHdlIHVwZGF0aW5nIHRoZSBvbiBkaXNrcyBtYXNrcyBhZ2Fpbj8NCjxvOnA+PC9vOnA+PC9wPg0K PHAgY2xhc3M9Ik1zb0xpc3RQYXJhZ3JhcGgiIHN0eWxlPSJtYXJnaW4tbGVmdDoxLjBpbjt0ZXh0 LWluZGVudDotLjI1aW47bXNvLWxpc3Q6bDAgbGV2ZWwxIGxmbzIiPg0KPCFbaWYgIXN1cHBvcnRM aXN0c10+PHNwYW4gc3R5bGU9Im1zby1saXN0Oklnbm9yZSI+LTxzcGFuIHN0eWxlPSJmb250Ojcu MHB0ICZxdW90O1RpbWVzIE5ldyBSb21hbiZxdW90OyI+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7 Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7DQo8L3NwYW4+PC9zcGFuPjwhW2VuZGlmXT4m bmJzcDtXaGVuIGFuIGFwcCBjYWxscyA8Yj5zcGRrX2JzX21kX3N5bmNfYmxvYiA8L2I+YWZ0ZXIg YSByZXNpemUgb3Igc29tZXRoaW5nLCBJIGRvbuKAmXQgc2VlIHdoZXJlIHRoZSBtYXNrcyBvbiBk aXNrIGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgc3VwZXJibG9jayBhcmUgZXZlciB1cGRhdGVk LiBJdA0KPGk+YXBwZWFyczwvaT4gYXQgbGVhc3QgdGhhdCB3ZSBhcmUgb25seSB1cGRhdGluZyBo ZSBtZXRhZGF0YSBmb3IgdGhlIGJsb2IgaXRzZWxmIGFuZCB0aGUgaW4gbWVtb3J5IG1hc2tzIChp biB0aGUgYnMgc3RydWN0KSBidXQgbm90IHRoZSBvbiBkaXNrIG1hc2tzLiBTbyBhbnkgc2NlbmFy aW8gd2hlcmUgd2UgZG8gYSByZXNpemUgJmFtcDsgc3luYyAob3IgeGF0dHIgYW5kIHN5bmMpIGFu ZCBoYXZlIGEgZGlydHkgc2h1dGRvd24sIGV2ZW4gd2l0aCB0aGUNCiByZWNvdmVyeSBjb2RlLCBp cyBnb2luZyB0byBlbmQgdXAgY29ycnVwdGVkIHJpZ2h0PyBJdCBzZWVtcyBsaWtlIHRoZSBvbiBk aXNrIG1hc2tzIHRoYXQgYXJlIHN0b3JlZCBqdXN0IGFmdGVyIHRoZSBzdXBlcmJsb2NrIG5lZWQg dG8gYmUgd3JpdHRlbiBhcyBwYXJ0IG9mDQo8Yj5zcGRrX2JzX21kX3N5bmNfYmxvYigpPC9iPiBh bmQgZnJvbSB3aGF0IEkgY2FuIHRlbGwgdGhleeKAmXJlIG9ubHkgdXBkYXRlZCB3aXRoIDxiPg0K dW5sb2FkPC9iPiB0b2RheS4gVGhpcyBpcywgb2YgY291cnNlLCBpbmRlcGVuZGVudCBvZiBDdW55 aW7igJlzIHBhdGNoIGJ1dCBJIHdhbnRlZCB0byBhc2sgYWJvdXQgaXQgc2luY2UgdGhhdOKAmXMg dGhlIGNvbnRleHQgSeKAmW0gbG9va2luZyBhdCBpdCBmcm9tPG86cD48L286cD48L3A+DQo8cCBj bGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+Jm5ic3A7PG86cD48L286 cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVpbiI+U29y cnkgZm9yIHRoZSBsZW5ndGggZW1haWwgYW5kIGFsbCB0aGUgY2xhaW1zL3F1ZXN0aW9ucy4gSeKA mW0gY2VydGFpbiBJIGhhdmUgbWlzLXJlYWQgc29tZSBvZiB0aGlzIHN0dWZmIGF0IGxlYXN0IGJ1 dCB3L28gdW5kZXJzdGFuZGluZyB0aGVzZSBwb2ludHMgSSBjYW7igJl0IHJlYWxseSByZXNwb25z aWJseSByZXZpZXcgQ3VueWlu4oCZcyBwYXRjaCB3aGljaCBpcw0KPGk+Y3JpdGljYWw8L2k+IEkg dGhpbmvigKYgd2VsbCwgaGlzIHBhdGNoIGlzIGNyaXRpY2FsIEkgbWVhbiwgbm90IG15IHJldmll dyBvZiBpdCA8c3BhbiBzdHlsZT0iZm9udC1mYW1pbHk6V2luZ2RpbmdzIj4NCko8L3NwYW4+PG86 cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFyZ2luLWxlZnQ6LjVp biI+Jm5ic3A7PG86cD48L286cD48L3A+DQo8cCBjbGFzcz0iTXNvTm9ybWFsIiBzdHlsZT0ibWFy Z2luLWxlZnQ6LjVpbiI+LVBhdWw8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwi IHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNz PSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwv cD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDouNWluIj4mbmJzcDs8 bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJtYXJnaW4tbGVmdDou NWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjxwIGNsYXNzPSJNc29Ob3JtYWwiIHN0eWxlPSJt YXJnaW4tbGVmdDouNWluIj4mbmJzcDs8bzpwPjwvbzpwPjwvcD4NCjwvZGl2Pg0KPC9ib2R5Pg0K PC9odG1sPg0K --===============1221484326538599555==--