PGh0bWw+CjxoZWFkPgo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KPHRpdGxlPlBhcnSgSUkuoEJvb3N0IFRlc3QgTGlicmFyeTogVGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3I8L3RpdGxlPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0eWxlL3N0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPgo8bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjc0LjAiPgo8bGluayByZWw9ImhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJCb29zdCBUZXN0IExpYnJhcnkiPgo8bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iQm9vc3QgVGVzdCBMaWJyYXJ5Ij4KPGxpbmsgcmVsPSJwcmV2IiBocmVmPSJleGVjdXRpb24tbW9uaXRvci9yZWZlcmVuY2UuaHRtbCIgdGl0bGU9IlRoZSBFeGVjdXRpb24gTW9uaXRvciByZWZlcmVuY2UiPgo8bGluayByZWw9Im5leHQiIGhyZWY9InByZy1leGVjLW1vbml0b3IvaW1wbC5odG1sIiB0aXRsZT0iVGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3IgaW1wbGVtZW50YXRpb24iPgo8c2NyaXB0IGxhbmd1YWdlPSJKYXZhU2NyaXB0MS4yIiBzcmM9Ii4uL2pzL2Jvb3N0LXRlc3QuanMiPjwvc2NyaXB0Pgo8L2hlYWQ+Cjxib2R5IGJnY29sb3I9IndoaXRlIiB0ZXh0PSJibGFjayIgbGluaz0iIzAwMDBGRiIgdmxpbms9IiM4NDAwODQiIGFsaW5rPSIjMDAwMEZGIj4KPHRhYmxlIHdpZHRoPSIxMDAlIj48dHI+Cjx0ZCB3aWR0aD0iMTAlIj48YSBocmVmPSJpbmRleC5odG1sIj48aW1nIGFsdD0iSG9tZSIgd2lkdGg9IjIyOSIgaGVpZ2h0PSI2MSIgYm9yZGVyPSIwIiBzcmM9Ii4uLy4uLy4uLy4uL2xpYnMvdGVzdC9kb2Nib29rL2ltZy9ib29zdC50ZXN0LmxvZ28ucG5nIj48L2E+PC90ZD4KPHRkIHZhbGlnbj0ibWlkZGxlIiBhbGlnbj0ibGVmdCI+ICZndDsgPGI+VGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3I8L2I+PGEgaHJlZj0ibWluaW1hbC5odG1sIj4KICAgICAgJmd0OwogICAgICA8L2E+CjwvdGQ+Cjx0ZD48ZGl2IGNsYXNzPSJzcGlyaXQtbmF2Ij4KPGEgaHJlZj0iZXhlY3V0aW9uLW1vbml0b3IvcmVmZXJlbmNlLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvcHJldi5wbmciIGFsdD0iUHJldiI+PC9hPjxhIGhyZWY9InByZy1leGVjLW1vbml0b3IvaW1wbC5odG1sIj48aW1nIHNyYz0iLi4vLi4vLi4vLi4vZG9jL2h0bWwvaW1hZ2VzL25leHQucG5nIiBhbHQ9Ik5leHQiPjwvYT4KPC9kaXY+PC90ZD4KPC90cj48L3RhYmxlPgo8aHI+CjxkaXYgY2xhc3M9InBhcnQiIGxhbmc9ImVuIj4KPGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgxIGNsYXNzPSJ0aXRsZSI+CjxhIG5hbWU9InBlbSI+PC9hPlBhcnSgSUkuoEJvb3N0IFRlc3QgTGlicmFyeTogVGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3I8L2gxPjwvZGl2PjwvZGl2PjwvZGl2Pgo8ZGl2IGNsYXNzPSJ0b2MiPgo8cD48Yj5UYWJsZSBvZiBDb250ZW50czwvYj48L3A+CjxkbD4KPGR0PjxhIGhyZWY9InByZy1leGVjLW1vbml0b3IvaW1wbC5odG1sIj5JbXBsZW1lbnRhdGlvbjwvYT48L2R0Pgo8ZHQ+PGEgaHJlZj0icHJnLWV4ZWMtbW9uaXRvci9jb21waWxhdGlvbi5odG1sIj5Db21waWxhdGlvbjwvYT48L2R0Pgo8L2RsPgo8L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPgo8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj4KPGEgbmFtZT0icGVtLmludHJvIj48L2E+SW50cm9kdWN0aW9uPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogICAgVGhlIGNvbXBvbmVudHMgb2YgYSBDKysgcHJvZ3JhbSBtYXkgcmVwb3J0IHVzZXItZGV0ZWN0ZWQgZXJyb3JzIGluIHNldmVyYWwgd2F5cywgc3VjaCBhcyB2aWEgYSByZXR1cm4gdmFsdWUgb3IgCiAgICB0aHJvd2luZyBhbiBleGNlcHRpb24uIFN5c3RlbS1kZXRlY3RlZCBlcnJvcnMgc3VjaCBhcyBkZXJlZmVyZW5jaW5nIGFuIGludmFsaWQgcG9pbnRlciBhcmUgcmVwb3J0ZWQgaW4gb3RoZXIgd2F5cywgCiAgICB0b3RhbGx5IG9wZXJhdGluZyBzeXN0ZW0gYW5kIGNvbXBpbGVyIGRlcGVuZGVudC4KICAgPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgICBZZXQgbWFueSBDKysgcHJvZ3JhbXMsIGJvdGggcHJvZHVjdGlvbiBhbmQgdGVzdCwgbXVzdCBydW4gaW4gYW4gZW52aXJvbm1lbnQgd2hlcmUgdW5pZm9ybSByZXBvcnRpbmcgb2YgZXJyb3JzIGlzIAogICAgbmVjZXNzYXJ5LiBGb3IgZXhhbXBsZSwgY29udmVydGluZyBvdGhlcndpc2UgdW5jYXVnaHQgZXhjZXB0aW9ucyB0byBub24temVybyBwcm9ncmFtIHJldHVybiBjb2RlcyBhbGxvd3MgbWFueSAKICAgIGNvbW1hbmQgbGluZSwgc2NyaXB0LCBvciBiYXRjaCBlbnZpcm9ubWVudHMgdG8gY29udGludWUgcHJvY2Vzc2luZyBpbiBhIGNvbnRyb2xsZWQgbWFubmVyLiBFdmVuIHNvbWUgCiAgICA8YWNyb255bSBjbGFzcz0iYWNyb255bSI+R1VJPC9hY3JvbnltPiBlbnZpcm9ubWVudHMgYmVuZWZpdCBmcm9tIHRoZSB1bmlmaWNhdGlvbiBvZiBlcnJvcnMgaW50byBwcm9ncmFtIHJldHVybiBjb2Rlcy4KICAgPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgICA8ZW0gY2xhc3M9ImZpcnN0dGVybSI+VGhlIEJvb3N0IFRlc3QgTGlicmFyeSdzIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3I8L2VtPiByZWxpZXZlcyB1c2VycyBmcm9tIG1lc3N5IGVycm9yIAogICAgZGV0ZWN0aW9uIGFuZCByZXBvcnRpbmcgZHV0aWVzIGJ5IHByb3ZpZGluZyBhIHJlcGxhY2VtZW50IGZ1bmN0aW9uIG1haW4oKSB3aGljaCBjYWxscyBhIHVzZXItc3VwcGxpZWQgY3BwX21haW4oKSAKICAgIGZ1bmN0aW9uIHdpdGhpbiBhIG1vbml0b3JlZCBlbnZpcm9ubWVudC4gVGhlIHN1cHBsaWVkIG1haW4oKSB0aGVuIHVuaWZvcm1seSBkZXRlY3RzIGFuZCByZXBvcnRzIHRoZSBvY2N1cnJlbmNlIG9mIAogICAgc2V2ZXJhbCB0eXBlcyBvZiBlcnJvcnMsIHJlZHVjaW5nIHRoZW0gdG8gYSB1bmlmb3JtIHJldHVybiBjb2RlIHdoaWNoIGlzIHJldHVybmVkIHRvIHRoZSBob3N0IGVudmlyb25tZW50LgogICA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICAgIFVuaWZvcm0gZXJyb3IgcmVwb3J0aW5nIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHByb2dyYW1zIHJ1bm5pbmcgdW5hdHRlbmRlZCB1bmRlciBjb250cm9sIG9mIHNjcmlwdHMgb3IgYmF0Y2ggCiAgICBmaWxlcy4gU29tZSBvcGVyYXRpbmcgc3lzdGVtcyBwb3AgdXAgbWVzc2FnZSBib3hlcyBpZiBhbiB1bmNhdWdodCBleGNlcHRpb24gb2NjdXJzLCBhbmQgdGhpcyByZXF1aXJlcyBtYW51YWwgCiAgICBpbnRlcnZlbnRpb24uIEJ5IGNvbnZlcnRpbmcgc3VjaCBleGNlcHRpb25zIGludG8gbm9uLXplcm8gcHJvZ3JhbSByZXR1cm4gY29kZXMsIHRoZSBsaWJyYXJ5IG1ha2VzIHRoZSBwcm9ncmFtIGEgCiAgICBiZXR0ZXIgY2l0aXplbi4gTW9yZSB1bmlmb3JtIHJlcG9ydGluZyBvZiBlcnJvcnMgaXNuJ3QgYSBiZW5lZml0IHRvIHNvbWUgcHJvZ3JhbXMsIHBhcnRpY3VsYXJseSBwcm9ncmFtcyBhbHdheXMgCiAgICBydW4gYnkgaGFuZCBvZiBhIGtub3dsZWRnZWFibGUgcGVyc29uLiBTbyB0aGUgUHJvZ3JhbSBFeGVjdXRpb24gTW9uaXRvciB3b3VsZG4ndCBiZSB3b3J0aCB1c2luZyBpbiB0aGF0IGVudmlyb25tZW50LgogICA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICAgIFVuaWZvcm0gZXJyb3IgcmVwb3J0aW5nIGNhbiBiZSBhbHNvIHVzZWZ1bCBpbiB0ZXN0IGVudmlyb25tZW50cyBzdWNoIGFzIHRoZSBCb29zdCByZWdyZXNzaW9uIHRlc3RzLiBCZSBhd2FyZSB0aG91Z2ggCiAgICBpbiBzdWNoIGNhc2UgaXQgbWlnaHQgYmUgcHJlZmVyYWJsZSB0byB1c2UgdGhlIDxhIGNsYXNzPSJsaW5rIiBocmVmPSJ1dGYuaHRtbCIgdGl0bGU9IlBhcnSgSVYuoEJvb3N0IFRlc3QgTGlicmFyeTogVGhlIFVuaXQgVGVzdCBGcmFtZXdvcmsiPlVuaXQgVGVzdCBGcmFtZXdvcms8L2E+LCBjYXVzZSBpdCBhbGxvd3Mgb25lIAogICAgdG8gdXNlIHRoZSA8YSBjbGFzcz0ibGluayIgaHJlZj0idXRmL3Rlc3RpbmctdG9vbHMuaHRtbCIgdGl0bGU9IlRoZSBVVEYgdGVzdGluZyB0b29scyBvciB0ZXN0ZXIncyB0b29sYm94IGZvciBhbGwgb2NjYXNpb25zIj5UZXN0aW5nIHRvb2xzPC9hPiBhbmQgZ2VuZXJhdGUgbW9yZSBkZXRhaWxlZCBlcnJvciBpbmZvcm1hdGlvbi4KICAgPC9wPgo8L2Rpdj4KPGRpdiBjbGFzcz0ic2VjdGlvbiIgbGFuZz0iZW4iPgo8ZGl2IGNsYXNzPSJ0aXRsZXBhZ2UiPjxkaXY+PGRpdj48aDMgY2xhc3M9InRpdGxlIj4KPGEgbmFtZT0icGVtLnVzYWdlIj48L2E+VXNhZ2U8L2gzPjwvZGl2PjwvZGl2PjwvZGl2Pgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgIFRvIGZhY2lsaXRhdGUgdW5pZm9ybSBlcnJvciByZXBvcnRpbmcgdGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3Igc3VwcGxpZXMgZnVuY3Rpb24gbWFpbigpIGFzIHBhcnQgaWYgaXQncyBpbXBsZW1lbnRhdGlvbi4gVG8gdXNlIHRoZSAKICAgUHJvZ3JhbSBFeGVjdXRpb24gTW9uaXRvciBpbnN0ZWFkIG9mIHJlZ3VsYXIgZnVuY3Rpb24gbWFpbiB5b3VyIHByb2dyYW0gaXMgcmVxdWlyZWQgdG8gc3VwcGx5IGEgZnVuY3Rpb24gY3BwX21haW4oKSB3aXRoIHNhbWUgc2lnbmF0dXJlLgogIDwvcD4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogICBIZXJlIGlzIHRoZSB0cmFkaXRpb25hbCBIZWxsbyBXb3JsZCBwcm9ncmFtIGltcGxlbWVudGVkIHVzaW5nIHRoZSBQcm9ncmFtIEV4ZWN1dGlvbiBNb25pdG9yOgogIDwvcD4KPGRpdiBjbGFzcz0iZXhhbXBsZSI+CjxhIG5hbWU9InBlbS51c2FnZS5leGFtcGxlMjQiPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkV4YW1wbGWgMS6gVGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3I6IEhlbGxvIFdvcmxkPC9iPjwvcD4KPGRpdiBjbGFzcz0iZXhhbXBsZS1jb250ZW50cyI+CjxwcmUgY2xhc3M9InByb2dyYW1saXN0aW5nIj4jaW5jbHVkZSAmbHQ7aW9zdHJlYW0mZ3Q7CiNpbmNsdWRlICZsdDtib29zdC90ZXN0L2luY2x1ZGVkL3ByZ19leGVjX21vbml0b3IuaHBwJmd0OyAKCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCgppbnQgY3BwX21haW4oIGludCwgY2hhciogW10gKSAvLyBub3RlIG5hbWUgY3BwX21haW4sIG5vdCBtYWluLgp7CiAgICBzdGQ6OmNvdXQgJmx0OyZsdDsgIkhlbGxvLCB3b3JsZFxuIjsKCiAgICByZXR1cm4gMDsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KPC9wcmU+Cjx0YWJsZSBjbGFzcz0ic2ltcGxlbGlzdCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSJTaW1wbGUgbGlzdCI+PHRyPgo8dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPjxhIGhyZWY9Ii4uL3NyYy9leGFtcGxlcy9leGFtcGxlMjQuY3BwIiB0YXJnZXQ9Il90b3AiPlNvdXJjZSBjb2RlPC9hPjwvY29kZT48L3RkPgo8dGQ+IHwgPC90ZD4KPHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48YSBocmVmPSIjIiB0YXJnZXQ9Il90b3AiIGlkPSJpZDYzMTIxNiIgb25jbGljaz0idG9nZ2xlX2VsZW1lbnQoICdleGFtcGxlMjQtb3V0cHV0JywgJ2lkNjMxMjE2JywgJ1Nob3cgb3V0cHV0JywgJ0hpZGUgb3V0cHV0JyApOyByZXR1cm4gZmFsc2U7Ij5TaG93IG91dHB1dDwvYT48L2NvZGU+PC90ZD4KPC90cj48L3RhYmxlPgo8cHJlIGNsYXNzPSJleGFtcGxlLW91dHB1dCIgaWQ9ImV4YW1wbGUyNC1vdXRwdXQiPkhlbGxvLCB3b3JsZAoKbm8gZXJyb3JzIGRldGVjdGVkPC9wcmU+CjwvZGl2Pgo8L2Rpdj4KPGJyIGNsYXNzPSJleGFtcGxlLWJyZWFrIj48cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgIEl0IHJlYWxseSBpcyB0aGF0IHNpbXBsZSAtIGp1c3QgY2hhbmdlIHRoZSBuYW1lIG9mIHlvdXIgaW5pdGlhbCBmdW5jdGlvbiBmcm9tIG1haW4oKSB0byBjcHBfbWFpbigpLiBEbyBtYWtlIHN1cmUgCiAgIHRoZSBhcmdjIGFuZCBhcmd2IHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCAoYWx0aG91Z2ggeW91IGRvbid0IGhhdmUgdG8gbmFtZSB0aGVtIGlmIHlvdSBkb24ndCB1c2UgdGhlbSkuCiAgPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgIFRoZSBQcm9ncmFtIEV4ZWN1dGlvbiBNb25pdG9yIHRyZWF0cyBhcyBlcnJvcnM6CiAgPC9wPgo8ZGl2IHhtbG5zOnJldj0iaHR0cDovL3d3dy5jcy5ycGkuZWR1L35ncmVnb2QvYm9vc3QvdG9vbHMvZG9jL3JldmlzaW9uIiBjbGFzcz0iaXRlbWl6ZWRsaXN0Ij48dWwgdHlwZT0iZGlzYyI+CjxsaT5FeGNlcHRpb25zIHRocm93biBmcm9tIGNwcF9tYWluKCkuPC9saT4KPGxpPk5vbi16ZXJvIHJldHVybiBmcm9tIGNwcF9tYWluKCkuPC9saT4KPC91bD48L2Rpdj4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogICBTbyB3aGF0IGlmIHNvbWUgZnVuY3Rpb24gaGFkIHRocm93biBhIHJ1bnRpbWVfZXJyb3Igd2l0aCB0aGUgbWVzc2FnZSAiYmlnIHRyb3VibGUiIGFuZCBpdCdzIG5vdCB0cmFwcGVkIGJ5IGFueSAKICAgY2F0Y2ggY2xhdXNlPyBMaWtlIGluIGEgZm9sbG93aW5nIGV4YW1wbGU6CiAgPC9wPgo8ZGl2IGNsYXNzPSJleGFtcGxlIj4KPGEgbmFtZT0icGVtLnVzYWdlLmV4YW1wbGUyNSI+PC9hPjxwIGNsYXNzPSJ0aXRsZSI+PGI+RXhhbXBsZaAyLqBUaGUgUHJvZ3JhbSBFeGVjdXRpb24gTW9uaXRvcjogc3RhbmRhcmQgZXhjZXB0aW9uIGRldGVjdGlvbjwvYj48L3A+CjxkaXYgY2xhc3M9ImV4YW1wbGUtY29udGVudHMiPgo8cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+I2luY2x1ZGUgJmx0O3N0ZGV4Y2VwdCZndDsKI2luY2x1ZGUgJmx0O2Jvb3N0L3Rlc3QvaW5jbHVkZWQvcHJnX2V4ZWNfbW9uaXRvci5ocHAmZ3Q7IAoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KCmludCBmb28oKSB7IHRocm93IHN0ZDo6cnVudGltZV9leGNlcHRpb24oICJiaWcgdHJvdWJsZSIgKTsgfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KCmludCBjcHBfbWFpbiggaW50LCBjaGFyKiBbXSApIC8vIG5vdGUgdGhlIG5hbWUKewogICAgZm9vKCk7CgogICAgcmV0dXJuIDA7Cn0KCi8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy8vCjwvcHJlPgo8dGFibGUgY2xhc3M9InNpbXBsZWxpc3QiIGJvcmRlcj0iMCIgc3VtbWFyeT0iU2ltcGxlIGxpc3QiPjx0cj4KPHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48YSBocmVmPSIuLi9zcmMvZXhhbXBsZXMvZXhhbXBsZTI1LmNwcCIgdGFyZ2V0PSJfdG9wIj5Tb3VyY2UgY29kZTwvYT48L2NvZGU+PC90ZD4KPHRkPiB8IDwvdGQ+Cjx0ZD48Y29kZSBjbGFzcz0ibGl0ZXJhbCI+PGEgaHJlZj0iIyIgdGFyZ2V0PSJfdG9wIiBpZD0iaWQ2MzEzNDYiIG9uY2xpY2s9InRvZ2dsZV9lbGVtZW50KCAnZXhhbXBsZTI1LW91dHB1dCcsICdpZDYzMTM0NicsICdTaG93IG91dHB1dCcsICdIaWRlIG91dHB1dCcgKTsgcmV0dXJuIGZhbHNlOyI+U2hvdyBvdXRwdXQ8L2E+PC9jb2RlPjwvdGQ+CjwvdHI+PC90YWJsZT4KPHByZSBjbGFzcz0iZXhhbXBsZS1vdXRwdXQiIGlkPSJleGFtcGxlMjUtb3V0cHV0Ij4qKioqIGV4Y2VwdGlvbigyMDUpOiBzdGQ6OnJ1bnRpbWVfZXJyb3I6IGJpZyB0cm91YmxlCioqKioqKioqIGVycm9ycyBkZXRlY3RlZDsgc2VlIHN0YW5kYXJkIG91dHB1dCBmb3IgZGV0YWlscyAqKioqKioqKjwvcHJlPgo8L2Rpdj4KPC9kaXY+CjxiciBjbGFzcz0iZXhhbXBsZS1icmVhayI+PHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogICBOb3RlIHRoYXQgaW4gYm90aCBleGFtcGxlcyBhYm92ZSB3ZSB1c2VkIHNpbmdsZS1oZWFkZXIgdmFyaWFudCBvZiB0aGUgUHJvZ3JhbSBFeGVjdXRpb24gTW9uaXRvci4gQWx0ZXJuYXRpdmVseSB3ZSBjYW4gYnVpbGQgYW5kIGxpbmsgd2l0aAogICBzdGFuZGFsb25lIGxpYnJhcnkuIEluIGNhc2Ugb2Ygc3RhdGljIGxpYnJhcnkgd2UgYXJlIG5vdCByZXF1aXJlZCB0byBpbmNsdWRlIGFueSBQcm9ncmFtIEV4ZWN1dGlvbiBNb25pdG9yIHJlbGF0ZWQgaGVhZGVycy4gVG8gdXNlIGR5bmFtaWMgCiAgIGxpYnJhcnkgeW91IGFyZSByZXF1aXJlZCB0byBpbmNsdWRlIAogICA8YSBocmVmPSIuLi8uLi8uLi8uLi9ib29zdC90ZXN0L3ByZ19leGVjX21vbml0b3IuaHBwIiB0YXJnZXQ9Il90b3AiPjxjb2RlIGNsYXNzPSJmaWxlbmFtZSI+Ym9vc3QvdGVzdC9wcmdfZXhlY19tb25pdG9yLmhwcDwvY29kZT48L2E+CiAgIGFuZCBkZWZpbmUgPGEgY2xhc3M9InhyZWYiIGhyZWY9InByZy1leGVjLW1vbml0b3IvY29tcGlsYXRpb24uaHRtbCNwZW0uZmxhZy5keW4tbGluayI+Qk9PU1RfVEVTVF9EWU5fTElOSzwvYT4gZHVyaW5nIHByb2dyYW0gY29tcGlsYXRpb24uIFRoZSBzYW1lIAogICBoZWFkZXIgaXMgcmVxdWlyZWQgaWYgeW91IHdhbnQgdG8gZW1wbG95IDxhIGNsYXNzPSJsaW5rIiBocmVmPSJwcmctZXhlYy1tb25pdG9yL2NvbXBpbGF0aW9uLmh0bWwjcGVtLmNvbXBpbGF0aW9uLmF1dG8tbGlua2luZyIgdGl0bGU9IlN1cHBvcnQgb2YgdGhlIGF1dG8tbGlua2luZyBmZWF0dXJlIj5hdXRvLWxpbmtpbmc8L2E+IGZlYXR1cmUuCiAgPC9wPgo8cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgIExldCdzIGNvbnNpZGVyIGFuIGV4YW1wbGUgd2hlcmUgZnVuY3Rpb24gY3BwX21haW4oKSBoYWQgIGJ1YmJsZWQgdXAgYSByZXR1cm4gY29kZSBvZiA1OgogIDwvcD4KPGRpdiBjbGFzcz0iZXhhbXBsZSI+CjxhIG5hbWU9InBlbS51c2FnZS5leGFtcGxlMjYiPjwvYT48cCBjbGFzcz0idGl0bGUiPjxiPkV4YW1wbGWgMy6gVGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3I6IGVycm9yIHJldHVybiBjb2RlIGRldGVjdGlvbjwvYj48L3A+CjxkaXYgY2xhc3M9ImV4YW1wbGUtY29udGVudHMiPgo8cHJlIGNsYXNzPSJwcm9ncmFtbGlzdGluZyI+I2luY2x1ZGUgJmx0O2Jvb3N0L3Rlc3QvcHJnX2V4ZWNfbW9uaXRvci5ocHAmZ3Q7IC8vIHRoaXMgaGVhZGVyIGlzIG9wdGlvbmFsCgovL19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18vLwoKaW50IGNwcF9tYWluKCBpbnQsIGNoYXIqIFtdICkgLy8gbm90ZSB0aGUgbmFtZQp7CiAgICByZXR1cm4gNTsKfQoKLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLy8KPC9wcmU+Cjx0YWJsZSBjbGFzcz0ic2ltcGxlbGlzdCIgYm9yZGVyPSIwIiBzdW1tYXJ5PSJTaW1wbGUgbGlzdCI+PHRyPgo8dGQ+PGNvZGUgY2xhc3M9ImxpdGVyYWwiPjxhIGhyZWY9Ii4uL3NyYy9leGFtcGxlcy9leGFtcGxlMjYuY3BwIiB0YXJnZXQ9Il90b3AiPlNvdXJjZSBjb2RlPC9hPjwvY29kZT48L3RkPgo8dGQ+IHwgPC90ZD4KPHRkPjxjb2RlIGNsYXNzPSJsaXRlcmFsIj48YSBocmVmPSIjIiB0YXJnZXQ9Il90b3AiIGlkPSJpZDYzMTQ3NyIgb25jbGljaz0idG9nZ2xlX2VsZW1lbnQoICdleGFtcGxlMjYtb3V0cHV0JywgJ2lkNjMxNDc3JywgJ1Nob3cgb3V0cHV0JywgJ0hpZGUgb3V0cHV0JyApOyByZXR1cm4gZmFsc2U7Ij5TaG93IG91dHB1dDwvYT48L2NvZGU+PC90ZD4KPC90cj48L3RhYmxlPgo8cHJlIGNsYXNzPSJleGFtcGxlLW91dHB1dCIgaWQ9ImV4YW1wbGUyNi1vdXRwdXQiPioqKiogZXJyb3IgcmV0dXJuIGNvZGU6IDUKKioqKioqKiogZXJyb3JzIGRldGVjdGVkOyBzZWUgc3RhbmRhcmQgb3V0cHV0IGZvciBkZXRhaWxzICoqKioqKioqPC9wcmU+CjwvZGl2Pgo8L2Rpdj4KPGJyIGNsYXNzPSJleGFtcGxlLWJyZWFrIj48cCBjbGFzcz0iZmlyc3QtbGluZS1pbmRlbnRlZCI+CiAgIFRoZSBQcm9ncmFtIEV4ZWN1dGlvbiBNb25pdG9yIHJlcG9ydHMgZXJyb3JzIHRvIGJvdGggY291dCAoZGV0YWlscykgYW5kIGNlcnIgKHN1bW1hcnkpLiBQcmltYXJ5IGRldGFpbGVkIGVycm9yIAogICBtZXNzYWdlcyBhcHBlYXIgb24gc3RhbmRhcmQgb3V0cHV0IHN0cmVhbSBzbyB0aGF0IGl0IGlzIHByb3Blcmx5IGludGVybGFjZWQgd2l0aCBvdGhlciBvdXRwdXQsIHRodXMgYWlkaW5nIGVycm9yIAogICBhbmFseXNpcy4gV2hpbGUgdGhlIGZpbmFsIGVycm9yIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGFwcGVhcnMgb24gc3RhbmRhcmQgZXJyb3Igc3RyZWFtLiBUaGlzIGluY3JlYXNlcyB0aGUgCiAgIHZpc2liaWxpdHkgb2YgZXJyb3Igbm90aWZpY2F0aW9uIGlmIHN0YW5kYXJkIG91dHB1dCBhbmQgZXJyb3Igc3RyZWFtcyBhcmUgZGlyZWN0ZWQgdG8gZGlmZmVyZW50IGRldmljZXMgb3IgZmlsZXMuCiA8L3A+CjxwIGNsYXNzPSJmaXJzdC1saW5lLWluZGVudGVkIj4KICAgVGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3IncyBzdXBwbGllZCBtYWluKCkgd2lsbCByZXR1cm4gZm9sbG93aW5nIHJlc3VsdCBjb2RlczoKICA8L3A+CjxkaXYgeG1sbnM6cmV2PSJodHRwOi8vd3d3LmNzLnJwaS5lZHUvfmdyZWdvZC9ib29zdC90b29scy9kb2MvcmV2aXNpb24iIGNsYXNzPSJpdGVtaXplZGxpc3QiPjx1bCB0eXBlPSJkaXNjIj4KPGxpPmJvb3N0OjpleGl0X3N1Y2Nlc3MgLSBubyBlcnJvcnM8L2xpPgo8bGk+Ym9vc3Q6OmV4aXRfZmFpbHVyZSAtIG5vbi16ZXJvIGFuZCBub24tYm9vc3Q6OmV4aXRfc3VjY2VzcyByZXR1cm4gY29kZSBmcm9tIGNwcF9tYWluKCkuPC9saT4KPGxpPmJvb3N0OjpleGl0X2V4Y2VwdGlvbl9mYWlsdXJlIC0gY3BwX21haW4oKSB0aHJvdyBhbiBleGNlcHRpb24uPC9saT4KPC91bD48L2Rpdj4KPC9kaXY+CjxkaXYgY2xhc3M9InNlY3Rpb24iIGxhbmc9ImVuIj4KPGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgzIGNsYXNzPSJ0aXRsZSI+CjxhIG5hbWU9InBlbS5jb25maWciPjwvYT5Db25maWd1cmF0aW9uPC9oMz48L2Rpdj48L2Rpdj48L2Rpdj4KPHAgY2xhc3M9ImZpcnN0LWxpbmUtaW5kZW50ZWQiPgogICBUaGVyZSBhcmUgdHdvIGFzcGVjdHMgb2YgdGhlIFByb2dyYW0gRXhlY3V0aW9uIE1vbml0b3IgYmVoYXZpb3IgdGhhdCB5b3UgY2FuIGN1c3RvbWl6ZSBhdCBydW50aW1lLiBDdXN0b21pemF0aW9uIGlzIHBlcmZvcm1lZCB1c2luZyAKICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgogIDwvcD4KPGRpdiBjbGFzcz0idGFibGUiPgo8YSBuYW1lPSJwZW0uY29uZmlnLmZsYWdzIj48L2E+PHAgY2xhc3M9InRpdGxlIj48Yj5UYWJsZaAxLqBUaGUgUHJvZ3JhbSBFeGVjdXRpb24gTW9uaXRvciBjb25maWd1cmF0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlczwvYj48L3A+CjxkaXYgY2xhc3M9InRhYmxlLWNvbnRlbnRzIj48dGFibGUgY2xhc3M9InRhYmxlIiBzdW1tYXJ5PSJUaGUgUHJvZ3JhbSBFeGVjdXRpb24gTW9uaXRvciBjb25maWd1cmF0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlcyI+Cjxjb2xncm91cD4KPGNvbD4KPGNvbD4KPC9jb2xncm91cD4KPHRoZWFkPjx0cj4KPHRoPkZsYWc8L3RoPgo8dGg+VXNhZ2U8L3RoPgo8L3RyPjwvdGhlYWQ+Cjx0Ym9keT4KPHRyPgo8dGQ+Qk9PU1RfVEVTVF9DQVRDSF9TWVNURU1fRVJST1JTPC90ZD4KPHRkPgogICAgICAgYWxsb3dzIGN1c3RvbWl6aW5nIGJlaGF2aW9yIG9mIHRoZSBQcm9ncmFtIEV4ZWN1dGlvbiBNb25pdG9yIGluIHJlZ2FyZHMgb2YgY2F0Y2hpbmcgc3lzdGVtIGVycm9ycy4gRm9yIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgCiAgICAgICBtZWFuaW5nIG9mIHRoaXMgb3B0aW9uIHNlZSB0aGUgPGEgY2xhc3M9ImxpbmsiIGhyZWY9ImV4ZWN1dGlvbi1tb25pdG9yL3JlZmVyZW5jZS5odG1sI2Jvb3N0LmV4ZWN1dGlvbl9tb25pdG9yIiB0aXRsZT0iQ2xhc3MgZXhlY3V0aW9uX21vbml0b3IiPkV4ZWN1dGlvbiBNb25pdG9yPC9hPi4gSWYgeW91IAogICAgICAgd2FudCB0byBwcmV2ZW50IHRoZSBQcm9ncmFtIEV4ZWN1dGlvbiBNb25pdG9yIGZyb20gY2F0Y2hpbmcgc3lzdGVtIGV4Y2VwdGlvbiwgc2V0IHRoZSB2YWx1ZSBvZiB0aGlzIAogICAgICAgdmFyaWFibGUgdG8gIm5vIi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgInllcyIuCiAgICAgIDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPkJPT1NUX1BSR19NT05fQ09ORklSTTwvdGQ+Cjx0ZD4KICAgICAgIGFsbG93cyBhdm9pZGluZyBzdWNjZXNzIGNvbmZpcm1hdGlvbiBtZXNzYWdlLiBTb21lIHVzZXJzIHByZWZlciB0byBzZWUgYSBjb25maXJtYXRpb24gbWVzc2FnZSBpbiBjYXNlIGlmIHByb2dyYW0KICAgICAgIHN1Y2Nlc3NmdWxseSBleGVjdXRlZC4gV2hpbGUgb3RoZXJzIGRvbid0IGxpa2UgdGhlIGNsdXR0ZXIgb3IgYW55IG91dHB1dCBpcyBwcm9oaWJpdGVkIGJ5IG9yZ2FuaXphdGlvbiBzdGFuZGFyZHMuCiAgICAgICBUbyBhdm9pZCB0aGUgbWVzc2FnZSBzZXQgdGhlIHZhbHVlIG9mIHRoaXMgdmFyaWFibGUgdG8gIm5vIi4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgInllcyIuCiAgICAgIDwvdGQ+CjwvdHI+CjwvdGJvZHk+CjwvdGFibGU+PC9kaXY+CjwvZGl2Pgo8YnIgY2xhc3M9InRhYmxlLWJyZWFrIj4KPC9kaXY+CjwvZGl2Pgo8dGFibGUgeG1sbnM6cmV2PSJodHRwOi8vd3d3LmNzLnJwaS5lZHUvfmdyZWdvZC9ib29zdC90b29scy9kb2MvcmV2aXNpb24iIHdpZHRoPSIxMDAlIj48dHI+Cjx0ZCBhbGlnbj0ibGVmdCI+PHA+PHNtYWxsPkxhc3QgcmV2aXNlZDogICwgIGF0ICA8L3NtYWxsPjwvcD48L3RkPgo8dGQgYWxpZ249InJpZ2h0Ij48ZGl2IGNsYXNzPSJjb3B5cmlnaHQtZm9vdGVyIj5Db3B5cmlnaHQgqSAyMDAxLTIwMDcgR2VubmFkaXkgUm96ZW50YWw8L2Rpdj48L3RkPgo8L3RyPjwvdGFibGU+Cjxocj4KPGRpdiBjbGFzcz0ic3Bpcml0LW5hdiI+CjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iZXhlY3V0aW9uLW1vbml0b3IvcmVmZXJlbmNlLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvcHJldi5wbmciIGFsdD0iUHJldiI+PC9hPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0iaW5kZXguaHRtbCI+PGltZyBzcmM9Ii4uLy4uLy4uLy4uL2RvYy9odG1sL2ltYWdlcy91cC5wbmciIGFsdD0iVXAiPjwvYT48YSBhY2Nlc3NrZXk9ImgiIGhyZWY9ImluZGV4Lmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvaG9tZS5wbmciIGFsdD0iSG9tZSI+PC9hPjxhIGFjY2Vzc2tleT0ibiIgaHJlZj0icHJnLWV4ZWMtbW9uaXRvci9pbXBsLmh0bWwiPjxpbWcgc3JjPSIuLi8uLi8uLi8uLi9kb2MvaHRtbC9pbWFnZXMvbmV4dC5wbmciIGFsdD0iTmV4dCI+PC9hPgo8L2Rpdj4KPC9ib2R5Pgo8L2h0bWw+Cg==