PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPjxodG1sPjxoZWFkPjx0aXRsZT5BeGlzMi9DIC0gQXhpczIvQyBEZXZlbG9wZXIgR3VpZGU8L3RpdGxlPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9ImFsbCI+CiAgICAgICAgICBAaW1wb3J0IHVybCgiLi4vc3R5bGUvbWF2ZW4tYmFzZS5jc3MiKTsKICAgICAgICAgIAoJCQkgICAgQGltcG9ydCB1cmwoIi4uL3N0eWxlL21hdmVuLWNsYXNzaWMuY3NzIik7PC9zdHlsZT48bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3N0eWxlL3ByaW50LmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJwcmludCI+PC9saW5rPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjwvbWV0YT48L2hlYWQ+PGJvZHkgY2xhc3M9ImNvbXBvc2l0ZSI+PGRpdiBpZD0iYmFubmVyIj48YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiBpZD0ib3JnYW5pemF0aW9uTG9nbyI+PGltZyBhbHQ9IkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBzcmM9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9pbWFnZXMvYXNmLWxvZ28uZ2lmIj48L2ltZz48L2E+PGEgaHJlZj0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvYyIgaWQ9InByb2plY3RMb2dvIj48aW1nIGFsdD0iQXBhY2hlIEF4aXMyIEMiIHNyYz0iaHR0cDovL3dzLmFwYWNoZS5vcmcvYXhpczIvaW1hZ2VzL2F4aXMuanBnIj48L2ltZz48L2E+PGRpdiBjbGFzcz0iY2xlYXIiPjxocj48L2hyPjwvZGl2PjwvZGl2PjxkaXYgaWQ9ImJyZWFkY3J1bWJzIj48ZGl2IGNsYXNzPSJ4bGVmdCI+CiAgICAgICAgICAgICAgICAJTGFzdCBwdWJsaXNoZWQ6IDIyIERlY2VtYmVyIDIwMDYKICAgICAgICAgICAgICAgICAgfCBEb2MgZm9yIDAuOTY8L2Rpdj48ZGl2IGNsYXNzPSJ4cmlnaHQiPjwvZGl2PjxkaXYgY2xhc3M9ImNsZWFyIj48aHI+PC9ocj48L2Rpdj48L2Rpdj48ZGl2IGlkPSJsZWZ0Q29sdW1uIj48ZGl2IGlkPSJuYXZjb2x1bW4iPjxkaXYgaWQ9Im1lbnVBeGlzMl9DIj48aDU+QXhpczIvQzwvaDU+PHVsPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT48L2xpPjxsaSBjbGFzcz0iZXhwYW5kZWQiPjxhIGhyZWY9Ii4uL2Rvd25sb2FkLmNnaSI+RG93bmxvYWQgQXhpczIvQzwvYT48dWw+PGxpIGNsYXNzPSJub25lIj48YSBocmVmPSIuLi9kb3dubG9hZC5jZ2kiPlJlbGVhc2VzPC9hPjwvbGk+PGxpIGNsYXNzPSJub25lIj48YSBocmVmPSJodHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld2N2cy5jZ2kvd2Vic2VydmljZXMvYXhpczIvdHJ1bmsvYy8iIGNsYXNzPSJleHRlcm5hbExpbmsiIHRpdGxlPSJFeHRlcm5hbCBMaW5rIj5WaWV3IFNvdXJjZSBDb2RlIE9ubGluZTwvYT48L2xpPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iLi4vc3ZuLmh0bWwiPkNoZWNrb3V0IFNvdXJjZSBDb2RlPC9hPjwvbGk+PC91bD48L2xpPjxsaSBjbGFzcz0iZXhwYW5kZWQiPjxhIGhyZWY9Ii4uL2RvY3MvaW5kZXguaHRtbCI+RG9jdW1lbnRhdGlvbjwvYT48dWw+PGxpIGNsYXNzPSJub25lIj48YSBocmVmPSIuLi9kb2NzL2luc3RhbGxhdGlvbmd1aWRlLmh0bWwiPkluc3RhbGxhdGlvbiBHdWlkZTwvYT48L2xpPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iLi4vZG9jcy9kZXZlbG9wZXJndWlkZS5odG1sIj5EZXZlbG9wZXIgR3VpZGU8L2E+PC9saT48bGkgY2xhc3M9Im5vbmUiPjxhIGhyZWY9Ii4uL2RvY3MvdXNlcmd1aWRlLmh0bWwiPlVzZXIgR3VpZGU8L2E+PC9saT48bGkgY2xhc3M9Im5vbmUiPjxhIGhyZWY9Ii4uL2RvY3MvYXhpczJjX21hbnVhbC5odG1sIj5BeGlzMi9DIG1hbnVhbDwvYT48L2xpPjwvdWw+PC9saT48bGkgY2xhc3M9ImV4cGFuZGVkIj48YSBocmVmPSIuLi9tYWlsLWxpc3RzLmh0bWwiPkdldCBJbnZvbHZlZDwvYT48dWw+PGxpIGNsYXNzPSJub25lIj48YSBocmVmPSIuLi9tYWlsLWxpc3RzLmh0bWwiPk1haWxpbmcgTGlzdHM8L2E+PC9saT48L3VsPjwvbGk+PGxpIGNsYXNzPSJleHBhbmRlZCI+PGEgaHJlZj0iLi4vdGVhbS1saXN0Lmh0bWwiPlByb2plY3QgSW5mb3JtYXRpb248L2E+PHVsPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iLi4vdGVhbS1saXN0Lmh0bWwiPlByb2plY3QgVGVhbTwvYT48L2xpPjxsaSBjbGFzcz0ibm9uZSI+PGEgaHJlZj0iLi4vaXNzdWUtdHJhY2tpbmcuaHRtbCI+SXNzdWUgVHJhY2tpbmc8L2E+PC9saT48L3VsPjwvbGk+PC91bD48L2Rpdj48YSBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8iIHRpdGxlPSJCdWlsdCBieSBNYXZlbiIgaWQ9InBvd2VyZWRCeSI+PGltZyBhbHQ9IkJ1aWx0IGJ5IE1hdmVuIiBzcmM9Ii4uL2ltYWdlcy9sb2dvcy9tYXZlbi1idXR0b24tMS5wbmciPjwvaW1nPjwvYT48L2Rpdj48L2Rpdj48ZGl2IGlkPSJib2R5Q29sdW1uIj48ZGl2IGNsYXNzPSJjb250ZW50Qm94Ij48ZGl2IGNsYXNzPSJzZWN0aW9uIj48YSBuYW1lPSJBeGlzMl9DX0RldmVsb3Blcl9HdWlkZSI+PC9hPjxoMj5BeGlzMi9DIERldmVsb3BlciBHdWlkZTwvaDI+PHA+UGxlYXNlIHNlbmQgeW91ciBmZWVkYmFjayB0byBkZXZlbG9wZXIgbWFpbGluZyBsaXN0OiA8YSBocmVmPSJtYWlsdG86YXhpcy1jLWRldkB3cy5hcGFjaGUub3JnIj5heGlzLWMtZGV2QHdzLmFwYWNoZS5vcmc8L2E+IChQbGVhc2UKcmVtZW1iZXIgdG8gcHJlZml4IHRoZSBzdWJqZWN0IHdpdGggW0F4aXMyXSkuIFRvIHN1YnNjcmliZSB0byBkZXZlbG9wZXIKbWFpbGluZyBsaXN0cyBzZWUgPGEgaHJlZj0iLi4vbWFpbC1saXN0cy5odG1sIj5oZXJlPC9hPi48L3A+PGRpdiBjbGFzcz0ic3Vic2VjdGlvbiI+PGEgbmFtZT0iQ29udGVudCI+PC9hPjxoMz5Db250ZW50PC9oMz48cD5UaGlzIGd1aWRlIHdhbGtzIHlvdSB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgdG9waWNzIHdpdGggdGhlIGFpbSBvZiBoZWxwaW5nIHlvdSBnZXQKZmFtaWxpYXIgd2l0aCB0aGUgQXhpczIvQyBwcm9qZWN0IGFuZCBpdHMgZGV2ZWxvcG1lbnQgbm9ybXMgcXVpY2tseS48L3A+PHVsPgogIDxsaT48YSBocmVmPSIjUHJvZ3JhbW1pbmdfTW9kZWwiPlByb2dyYW1taW5nIG1vZGVsPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiNNZW1vcnlfTWFuYWdlbWVudCI+TWVtb3J5IG1hbmFnZW1lbnQ8L2E+PC9saT4KICA8bGk+PGEgaHJlZj0iI0NvZGluZ19Db252ZW50aW9ucyI+Q29kaW5nIGNvbnZlbnRpb25zPC9hPjwvbGk+CiAgPGxpPjxhIGhyZWY9IiNVbml0X1Rlc3RzIj5Vbml0IHRlc3RzPC9hPjwvbGk+CjwvdWw+PHA+PGEgaWQ9IlByb2dyYW1taW5nX01vZGVsIj48L2E+PC9wPjwvZGl2PjxkaXYgY2xhc3M9InN1YnNlY3Rpb24iPjxhIG5hbWU9IlByb2dyYW1taW5nX01vZGVsIj48L2E+PGgzPlByb2dyYW1taW5nIE1vZGVsPC9oMz48cD5BeGlzMi9DIHByb2dyYW1taW5nIG1vZGVsIHVzZXMgYSBwc2V1ZG8gb2JqZWN0IG9yaWVudGVkIG1vZGVsIHRvIGFjaGlldmUKZGF0YSBoaWRpbmcuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBob3cgdGhpcyBpcyBkb25lLgpFYWNoIHN0cnVjdCBjb3JyZXNwb25kcyB0byB0aGUgImNsYXNzIiBjb25jZXB0IGluIG9iamVjdCBvcmllbnRlZApwcm9ncmFtbWluZy4gSGVuY2UsIGVhY2ggc3RydWN0IGhhcyBpdHMgb3duIGhlYWRlciBmaWxlLCB0aGF0IGV4cG9zZXMgdGhlIEFQSQpmb3IgdGhhdCBzdHJ1Y3QgYW5kIGEgc291cmNlIGZpbGUsIHRoYXQgY29udGFpbnMgdGhlIGZ1bmN0aW9uYWwKaW1wbGVtZW50YXRpb24uPC9wPjxwPk9wZXJhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgc3RydWN0IGFyZSBidW5kbGVkIGludG8gYW4gb3BlcmF0aW9ucyBzdHJ1Y3QKKCdvcHMnIHN0cnVjdCksIGFuZCB0aGlzIG9wcyBzdHJ1Y3QgaXMgZXhwb3NlZCBpbiB0aGUgaGVhZGVyIGZpbGUuIFRoZSByZWFsCmltcGxlbWVudGF0aW9uIHN0cnVjdCAoJ2ltcGwnIHN0cnVjdCkgd2l0aCB0aGUgZGF0YSBmaWVsZHMgaXMgaGlkZGVuIGZyb20gdGhlCnVzZXIsIGFuZCBsaXZlcyBpbiB0aGUgc291cmNlIGZpbGUuIFRvIGVhc2UgdGhlIHVzZXIgZnJvbSB0aGUgY29tcGxleCBzeW50YXgKcmVxdWlyZWQgdG8gYWNjZXNzIHRoZSBmdW5jdGlvbnMgaW4gYSBnaXZlbiBvcHMgc3RydWN0LCBtYWNyb3MgYXJlIHByb3ZpZGVkCnRvIGFjY2VzcyB0aGVtLiBTaW5jZSB0aGUgZGF0YSBpcyBoaWRkZW4sIGl0IGlzIHRoZSB1c3VhbCBwcmFjdGljZSB0byBwcm92aWRlCipnZXR0ZXIqIGFuZCAqc2V0dGVyKiBtZXRob2RzIGZvciB0aGUgZGF0YSBmaWVsZHMgb2YgdGhlIHN0cnVjdCwgaW4gYWRkaXRpb24gdG8KdGhlIG90aGVyIHByb2Nlc3NpbmcgZnVuY3Rpb25hbGl0eS4gVGhlIGFjdHVhbCBmdW5jdGlvbmFsIGltcGxlbWVudGF0aW9ucyBpbgp0aGUgc291cmNlIGZpbGUgYXJlIG1hcHBlZCB0byB0aGUgb3BzIHN0cnVjdCBmdW5jdGlvbnMgZGVjbGFyZWQgaW4gdGhlIGhlYWRlcgpmaWxlIGJ5IG1lYW5zIG9mIGZ1bmN0aW9uIHBvaW50ZXIgYXNzaWdubWVudHMuPC9wPjxwPkhlcmUgaXMgYSBzYW1wbGUgaGVhZGVyIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSAiZm9vIiBzdHJ1Y3QuIChJbWFnaW5lIGEKY2xhc3MgY2FsbGVkICJmb28iIGluIHRoZSBwcm9wZXIgb2JqZWN0IG9yaWVudGVkIHByb2dyYW1taW5nIG1vZGVsLik8L3A+PHN0cm9uZz4vKiBheGlzMl8gZm9vLmggKi88L3N0cm9uZz4KICAgIDxkaXYgY2xhc3M9InNvdXJjZSI+PHByZT4gCnR5cGVkZWYgc3RydWN0IGF4aXMyX2Zvb19vcHMgYXhpczJfZm9vX29wc190Owp0eXBlZGVmIHN0cnVjdCBheGlzMl9mb28gYXhpczJfZm9vX3Q7CgpzdHJ1Y3QgYXhpczJfZm9vX29wcwp7CiAgICB2b2lkIChBWElTMl9DQUxMICpiYXIpKGF4aXMyX2Zvb190ICpmb28sIGNvbnN0IGF4aXMyX2Vudl90ICplbnYsIHZvaWQgKmRhdGEpOwogICAgYXhpczJfc3RhdHVzX3QgKEFYSVMyX0NBTEwgKmZyZWUpKGF4aXMyX2Zvb190ICpmb28sIGNvbnN0IGF4aXMyX2Vudl90ICplbnYpOwp9OwoKc3RydWN0IGF4aXMyX2Zvbwp7CiAgICBheGlzMl9mb29fb3BzX3QgKm9wczsKfQoKCmF4aXMyX2Zvb190ICogYXhpczJfZm9vX2NyZWF0ZShjb25zdCBheGlzMl9lbnZfdCAqZW52KTsKCi8qIE1hY3JvcyBhcmUgcHJvdmlkZWQgdG8gYWNjZXNzIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBvcHMgc3RydWN0dXJlICovCgojZGVmaW5lIEFYSVMyX0ZPT19CQVIoZm9vLCBlbnYsIGRhdGEpXCAKICAgICAgICAgICAgKChmb28pLSZndDtvcHMtJmd0O2Jhcihmb28sIGVudiwgZGF0YSkpCiNkZWZpbmUgQVhJUzJfRk9PX0ZSRUUoZm9vLCBlbnYpXAogICAgICAgICAgICAoKGZvbyktJmd0O29wcy0mZ3Q7ZnJlZShmb28sIGVudikpCgo8L3ByZT48L2Rpdj4KICA8cD48L3A+PHA+VGhlIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yICJmb28iIHN0cnVjdCBpcyBzaG93biBiZWxvdy48L3A+CiAgICA8ZGl2IGNsYXNzPSJzb3VyY2UiPjxwcmU+CiNpbmNsdWRlICZsdDtheGlzMl9mb28uaCZndDsKCnR5cGVkZWYgc3RydWN0IGF4aXMyX2Zvb19pbXBsIGF4aXMyX2Zvb19pbXBsX3Q7CgpzdHJ1Y3QgYXhpczJfZm9vX2ltcGwKewogICAgYXhpczJfZm9vX3QgZm9vOwogICAgbXlfdHlwZSBteV9kYXRhOyAvKnByaXZhdGUgZGF0YSovCn07CgoKLyogRnVuY3Rpb24gSGVhZGVycyAqLwoKdm9pZCBBWElTMl9DQUxMIGF4aXMyX2Zvb19iYXIoYXhpczJfZm9vX3QgKmZvbywgY29uc3QgYXhpczJfZW52X3QgKmVudiwgdm9pZCAqZGF0YSk7CmF4aXMyX3N0YXR1c190IEFYSVMyX0NBTEwgYXhpczJfZm9vX2ZyZWUoYXhpczJfZm9vX3QgKmZvbywgY29uc3QgYXhpczJfZW52X3QgKmVudik7CgovKiBGdW5jdGlvbiBJbXBsZW1lbnRhdGlvbnMgKi8KYXhpczJfZm9vX3QgKiBBWElTMl9DQUxMIGF4aXMyX2Zvb19jcmVhdGUoY29uc3QgYXhpczJfZW52X3QgKmVudikKewogICAgYXhpczJfZm9vX2ltcGxfdCAqIGZvb19pbXBsID0gTlVMTDsKICAgIC8qIGNyZWF0ZSBheGlzMl9mb29faW1wbF90IHN0cnVjdHVyZSBhbmQgaW5pdGlhbGl6ZSBwcml2YXRlIGRhdGEgKi8KCiAgICAvKiBjcmVhdGUgb3BzIHN0cnVjdHVyZSBvZiBmb28gKi8KCiAgICAvKiBiaW5kIG9wcyB0byBmdW5jdGlvbnMgKi8KICAgIGZvb19pbXBsLSZndDtmb28ub3BzLSZndDtiYXIgPSBheGlzMl9mb29fYmFyOwogICAgZm9vX2ltcGwtJmd0O2Zvby5vcHMtJmd0O2ZyZWUgPSBheGlzMl9mb29fZnJlZTsKCiAgICByZXR1cm4gJmFtcDsoZm9vX2ltcGwtJmd0O2Zvbyk7Cn0KCnZvaWQgQVhJUzJfQ0FMTCBheGlzMl9mb29fYmFyKGF4aXMyX2Zvb190ICpmb28sIGNvbnN0IGF4aXMyX2Vudl90ICplbnYsIHZvaWQgKmRhdGEpCnsKICAgIC8qIGRvIHNvbWV0aGluZyAqLwp9CgpheGlzMl9zdGF0dXNfdCBBWElTMl9DQUxMIGF4aXMyX2Zvb19mcmVlKGF4aXMyX2Zvb190ICpmb28sIGNvbnN0IGF4aXMyX2Vudl90ICplbnYpCnsKICAgIC8qIGRvIHRoZSBkaXJ0eSB3b3JrIG9mIGNsZWFuaW5nIHRoZSBhbGxvY2F0ZWQgbWVtb3J5ICovCn0KPC9wcmU+PC9kaXY+CiAgPHA+PGEgaWQ9Ik1lbW9yeV9NYW5hZ2VtZW50Ij48L2E+PC9wPjxwPklmIHlvdSB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIHNhbXBsZSBhYm92ZSwgeW91IHdpbGwgc2VlIHRoYXQKYWxtb3N0IGFsbCBmdW5jdGlvbnMgdGFrZSBhIGRvdWJsZSBwb2ludGVyIHRvIHRoZSBheGlzMl9lbnYgc3RydWN0LiBUbyBsZWFybgptb3JlIGFib3V0IHRoZSBBeGlzMi9DIGVudmlyb25tZW50LCBwbGVhc2UgaGF2ZSBhIGxvb2sgYXQgdGhlIDxhIGhyZWY9ImFyY2hpdGVjdHVyZV9ub3Rlcy5odG1sIj5hcmNoaXRlY3R1cmUgbm90ZXM8L2E+LjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSJNZW1vcnlfTWFuYWdlbWVudCI+PC9hPjxoMz5NZW1vcnkgTWFuYWdlbWVudDwvaDM+PHA+V2hlbiB3cml0aW5nIHNlcnZpY2VzIGFzIHdlbGwgYXMgY2xpZW50IHByb2dyYW1zLCB5b3UgaGF2ZSB0byBlbnN1cmUgdGhhdAp5b3UgZG8gcHJvcGVyIG1lbW9yeSBtYW5hZ2VtZW50LiBZb3UgbmVlZCB0byBiZSBjYXJlZnVsIHRvIGRlYWxsb2NhdGUgdGhlCm1lbW9yeSB5b3UgaGF2ZSBhbGxvY2F0ZWQgaW4gb3JkZXIgdG8gYXZvaWQgbWVtb3J5IGxlYWtzIChhbmQgdG8gYXZvaWQgdGhvc2UKbmFzdHkgc2VnbWVudGF0aW9uIGZhdWx0cyA7LSkgKS4gUmVtZWJlcmluZyB3aGVyZSB5b3UgYWxsb2NhdGUgbWVtb3J5IGlzIGEKZ29vZCBwcmFjdGljZSwgd2hpY2ggd2lsbCBoZWxwIHlvdSB0byBwcm9wZXJseSBmcmVlIHN1Y2ggYWxsb2NhdGVkIG1lbW9yeS48L3A+PC9kaXY+PGRpdiBjbGFzcz0ic3Vic2VjdGlvbiI+PGEgbmFtZT0iTWVtb3J5X01hbmFnZW1lbnRfR3VpZGVsaW5lc19mb3JfRGV2ZWxvcGluZ19TZXJ2aWNlcyI+PC9hPjxoMz5NZW1vcnkgTWFuYWdlbWVudCBHdWlkZWxpbmVzIGZvciBEZXZlbG9waW5nIFNlcnZpY2VzPC9oMz48cD5UbyB1bmRlcnN0YW5kIGhvdyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpcyByZWNsYWltZWQsIGl0IGlzIHdvcnRoIGxvb2tpbmcKYXQgdGhlIHNlcnZpY2Ugc2tlbGV0b24gaW50ZXJmYWNlIHdoaWNoIGlzIGRlZmluZWQgaW4gOgo8c3Ryb25nPmF4aXMyX3N2Y19za2VsZXRvbi5oPC9zdHJvbmc+PC9wPgogICAgPGRpdiBjbGFzcz0ic291cmNlIj48cHJlPgpBWElTMl9ERUNMQVJFX0RBVEEgc3RydWN0IGF4aXMyX3N2Y19za2VsZXRvbl9vcHMKewogICAgaW50IChBWElTMl9DQUxMICogZnJlZSkoYXhpczJfc3ZjX3NrZWxldG9uX3QgKnN2Y19za2VsaSwgY29uc3QgYXhpczJfZW52X3QgKmVudik7CiAgICAuLi4KfTsKCkFYSVMyX0RFQ0xBUkVfREFUQSBzdHJ1Y3QgYXhpczJfc3ZjX3NrZWxldG9uCnsKICAgIGF4aXMyX3N2Y19za2VsZXRvbl9vcHNfdCAqb3BzOwogICAgYXhpczJfYXJyYXlfbGlzdF90ICpmdW5jX2FycmF5Owp9OwoKPC9wcmU+PC9kaXY+CiAgPHA+PC9wPjxwPlRoZSBzZXJ2aWNlIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIHNob3VsZCBpbXBsZW1lbnQgdGhlIDxjb2RlPmZyZWU8L2NvZGU+CmZ1bmN0aW9uIGFuZCBhdHRhY2ggdGhhdCB0byB0aGUgb3BzIHN0cnVjdCBvZgo8Y29kZT5heGlzMl9zdmNfc2tlbGV0b25fdDwvY29kZT4gc3RydWN0LiBUaGlzIDxjb2RlPmZyZWU8L2NvZGU+IGZ1bmN0aW9uIGlzCmNhbGxlZCBlYWNoIHRpbWUgYWZ0ZXIgYSB3ZWIgc2VydmljZXMgcmVxdWVzdCBpcyBzZXJ2ZWQuPC9wPjxwPkxldCdzIHRyeSB0byB1bmRlcnN0YW5kIHRoaXMgdGhyb3VnaCBhbiBleGFtcGxlLjwvcD48cD48L3A+PHA+RXhhbXBsZTogPGI+U2VydmljZSBza2VsZXRvbiBpbXBsZW1lbnRhdGlvbiBmb3IgbWF0aCBzZXJ2aWNlLjwvYj48L3A+PHA+VGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5tYXRoX2ZyZWU8L2NvZGU+CmZ1bmN0aW9uIHdoaWNoIGlzIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBvcHMgb2YKPGNvZGU+YXhpczJfc3ZjX3NrZWxldG9uX3Q8L2NvZGU+IHN0cnVjdC4gVXN1YWxseSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IKdGhlIG9wZXJhdGlvbnMgc3RydWN0LCB0aGUgZnVuY3Rpb24gYXJyYXkgYW5kIHRoZSBzZXJ2aWNlIHNrZWxldG9uIHN0cnVjdCBhcmUKY2xlYW5lZCBpbnNpZGUgdGhpcy4gWW91IG1heSBjbGVhbiBhZGRpdGlvbmFsIG1lbW9yeSBoZXJlIGlmIHlvdSBoYXZlCmFsbG9jYXRlZCBhbnkgc3BlY2lmaWMgbWVtb3J5IGJsb2NrcyBpbiA8Y29kZT5tYXRoX2NyZWF0ZTwvY29kZT4gZnVuY3Rpb24gb3IKZWxzZXdoZXJlLCBkZXBlbmRpbmcgb24geW91ciBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpY3MuPC9wPjxwPjwvcD4KICAgIDxkaXYgY2xhc3M9InNvdXJjZSI+PHByZT5pbnQgQVhJUzJfQ0FMTCBtYXRoX2ZyZWUoYXhpczJfc3ZjX3NrZWxldG9uX3QgKnN2Y19za2VsZXRvbiwgY29uc3QgYXhpczJfZW52X3QgKmVudikKewogICAgaWYoc3ZjX3NrZWxldG9uLSZndDtvcHMpCiAgICB7CiAgICAgICAgQVhJUzJfRlJFRShlbnYtJmd0O2FsbG9jYXRvciwgc3ZjX3NrZWxldG9uLSZndDtvcHMpOwogICAgICAgIHN2Y19za2VsZXRvbi0mZ3Q7b3BzID0gTlVMTDsKICAgIH0KICAgIGlmKHN2Y19za2VsZXRvbi0mZ3Q7ZnVuY19hcnJheSkKICAgIHsKICAgICAgICBBWElTMl9BUlJBWV9MSVNUX0ZSRUUoc3ZjX3NrZWxldG9uLSZndDtmdW5jX2FycmF5LCBlbnYpOwogICAgICAgIHN2Y19za2VsZXRvbi0mZ3Q7ZnVuY19hcnJheSA9IE5VTEw7CiAgICB9CiAgICBpZihzdmNfc2tlbGV0b24pCiAgICB7CiAgICAgICAgQVhJUzJfRlJFRShlbnYtJmd0O2FsbG9jYXRvciwgc3ZjX3NrZWxldG9uKTsKICAgICAgICBzdmNfc2tlbGV0b24gPSBOVUxMOwogICAgfQogICAgcmV0dXJuIEFYSVMyX1NVQ0NFU1M7Cn0KCjwvcHJlPjwvZGl2PgogIDxwPjwvcD48cD5JbiB0aGUgPGNvZGU+YXhpczJfbWF0aF9jcmVhdGU8L2NvZGU+IGZ1bmN0aW9uLCB5b3UgYXNzaWduIHRoZSBmdW5jdGlvbgpwb2ludGVyIG9mIDxjb2RlPm1hdGhfZnJlZTwvY29kZT4gZnVuY3Rpb24gdG8gdGhlIDxjb2RlPmZyZWU8L2NvZGU+IGZ1bmN0aW9uCm9mIHRoZSBvcGVyYXRpb25zIHN0cnVjdC4gQXMgeW91IGNhbiBzZWUsIG5vdyB0aGUgU09BUCBlbmdpbmUgaGFzIGEgZnVuY3Rpb24KcmVmZXJlbmNlIHRvIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIGFmdGVyIGVhY2ggc2VydmljZSByZXF1ZXN0LjwvcD48cD48L3A+CiAgICA8ZGl2IGNsYXNzPSJzb3VyY2UiPjxwcmU+QVhJUzJfRVhURVJOIGF4aXMyX3N2Y19za2VsZXRvbl90ICogQVhJUzJfQ0FMTCBheGlzMl9tYXRoX2NyZWF0ZShjb25zdCBheGlzMl9lbnZfdCAqZW52KQp7CiAgICBheGlzMl9zdmNfc2tlbGV0b25fdCAqc3ZjX3NrZWxldG9uID0gTlVMTDsKICAgIHN2Y19za2VsZXRvbiA9IEFYSVMyX01BTExPQyhlbnYtJmd0O2FsbG9jYXRvciwgc2l6ZW9mKGF4aXMyX3N2Y19za2VsZXRvbl90KSk7CgogICAgc3ZjX3NrZWxldG9uLSZndDtvcHMgPSBBWElTMl9NQUxMT0MoZW52LSZndDthbGxvY2F0b3IsIHNpemVvZihheGlzMl9zdmNfc2tlbGV0b25fb3BzX3QpKTsKCiAgICBzdmNfc2tlbGV0b24tJmd0O29wcy0mZ3Q7ZnJlZSA9IG1hdGhfZnJlZTsKICAgIC4uLgogICAgcmV0dXJuIHN2Y19za2VsZXRvbjsKfQoKCjwvcHJlPjwvZGl2PgogIDxwPlNPQVAgZW5naW5lIGZyZWVzIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGZvciB0aGUgPGNvZGU+YXhpb21fbm9kZV90PC9jb2RlPgpzdHJ1Y3QgdGhhdCBpcyB1c2VkIHRvIGZvcm0gdGhlIHJlc3BvbnNlIFNPQVAgbWVzc2FnZS4gSG93ZXZlciwgaXQgaXMgdGhlCnJlc3BvbnNpYmlsaXR5IG9mIHRoZSBzZXJ2aWNlIGRldmVsb3BlciB0byBjbGVhbiBhbnkgYWRkaXRpb25hbCBtZW1vcnkKYWxsb2NhdGVkLjwvcD48cD48L3A+PC9kaXY+PGRpdiBjbGFzcz0ic3Vic2VjdGlvbiI+PGEgbmFtZT0iTWVtb3J5X01hbmFnZW1lbnRfR3VpZGVsaW5lc19mb3JfRGV2ZWxvcGluZ19DbGllbnRzIj48L2E+PGgzPk1lbW9yeSBNYW5hZ2VtZW50IEd1aWRlbGluZXMgZm9yIERldmVsb3BpbmcgQ2xpZW50czwvaDM+PHA+Ck1vc3Qgb2YgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgaW4gdGhlIGNsaWVudCBzaWRlIChpbmNsdWRpbmcgU09BUCByZXF1ZXN0IGFuZApyZXBseSBtZXNzZ2VzKSwgc2hvdWxkIGJlIGNsZWFuZWQgaW4gdGhlIGNsaWVudCBzaWRlIGl0c2VsZi4gTWVtb3J5IGFsbG9jYXRlZApmb3IgcHJvcGVydGllcyBhcmUgdGFrZW4gY2FyZSBvZiBieSB0aGUgU09BUCBlbmdpbmUuIFNPQVAgZW5naW5lIHJlY2xhaW1zIHRoZQptZW1vcnkgYWxsb2NhdGVkIGZvciBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBzY29wZSAoUmVxdWVzdCwgU2Vzc2lvbiBvcgpBcHBsaWNhdGlvbikgdGhhdCB5b3Ugc2V0IGZvciBlYWNoIHByb3BlcnR5LgoKPGEgaWQ9IkNvZGluZ19Db252ZW50aW9ucyI+PC9hPjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSJDb2RpbmdfQ29udmVudGlvbnMiPjwvYT48aDM+Q29kaW5nIENvbnZlbnRpb25zPC9oMz48cD5Db2RpbmcgY29udmVudGlvbnMgdXNlZCB3aXRoIHRoZSBBeGlzMiBwcm9qZWN0IGlzIGxpc3RlZCBpbiA8YSBocmVmPSIuLi9jb2RpbmdfY29udmVudGlvbnMuaHRtbCI+dGhpczwvYT4gZG9jdW1lbnQuPC9wPjxwPjxhIGlkPSJVbml0X1Rlc3RzIj48L2E+PC9wPjwvZGl2PjxkaXYgY2xhc3M9InN1YnNlY3Rpb24iPjxhIG5hbWU9IlVuaXRfVGVzdHMiPjwvYT48aDM+VW5pdCBUZXN0czwvaDM+PHA+PGEgaHJlZj0iaHR0cDovL2N1dGVzdC5zb3VyY2Vmb3JnZS5uZXQvIiBjbGFzcz0iZXh0ZXJuYWxMaW5rIiB0aXRsZT0iRXh0ZXJuYWwgTGluayI+Q3VUZXN0PC9hPiBsaWJyYXJ5IGlzIHVzZWQgdG8Kd3JpdGUgdW5pdCB0ZXN0cyBpbiBBeGlzMi9DLjwvcD48cD5Zb3UgbmVlZCB0byBmb2xsb3cgdHdvIHN0ZXBzIHRvIHdyaXRlIGEgdW5pdCB0ZXN0IGZvciBhIG1vZHVsZS48L3A+PHA+CjEuIEFkZCB0aGUgdW5pdCB0ZXN0IHRvIHRoZSBtb2R1bGUncyB0ZXN0IHN1aXRlLgoKPC9wPjxwPjIuIEFkZCB0aGUgbW9kdWxlJ3MgdGVzdCBzdWl0ZSB0byB0aGUgbWFpbiB1bml0IHRlc3Qgc3VpdGUuPC9wPjxwPjwvcD48L2Rpdj48ZGl2IGNsYXNzPSJzdWJzZWN0aW9uIj48YSBuYW1lPSJTdGVwMTpfQWRkaW5nX2FfdW5pdF90ZXN0X3RvX2FfbW9kdWxlX3NfdW5pdF90ZXN0X3N1aXRlIj48L2E+PGgzPlN0ZXAxOiBBZGRpbmcgYSB1bml0IHRlc3QgdG8gYSBtb2R1bGUncyB1bml0IHRlc3Qgc3VpdGU8L2gzPjxwPlRoaXMgc2VjdGlvbiBpbGx1c3RyYXRlcyBob3cgdG8gYWRkIGEgdW5pdCB0ZXN0IGNhc2UgdG8gdGhlIHV0aWwgbW9kdWxlLgpMZXQncyB0YWtlLCBmb3IgZXhhbXBsZSwgdGhlIHVuaXQgdGVzdHMgZm9yIGF4aXMyIHN0cmVhbS4gVGhlcmUgYXJlIHR3byBmaWxlcwpuYW1lZCA8Y29kZT51dGlsX3N0cmVhbV90ZXN0LmMvLmg8L2NvZGU+IHBsYWNlZCBpbnRvIG1vZHVsZXMvdXRpbC90ZXN0IGZvbGRlci4gSGVyZSdzIGEKc2FtcGxlIGNvZGUgd3JpdHRlbiB0byB0ZXN0IHRoZSBvcGVyYXRpb24KPGNvZGU+YXhpczJfc3RyZWFtX29wc19yZWFkPC9jb2RlPi48L3A+CiAgICA8ZGl2IGNsYXNzPSJzb3VyY2UiPjxwcmU+CiNpbmNsdWRlICJ1dGlsX3N0cmVhbV90ZXN0LmgiCgp2b2lkIFRlc3RheGlzMl9zdHJlYW1fb3BzX3JlYWQoQ3VUZXN0ICp0YykKewogICAgY2hhciBhY3R1YWxbMTBdOwogICAgYXhpczJfYWxsb2NhdG9yX3QgKmFsbG9jYXRvciA9IGF4aXMyX2FsbG9jYXRvcl9pbml0KE5VTEwpOwogICAgYXhpczJfZW52X3QgKmVudiA9IGF4aXMyX2Vudmlyb25tZW50X2NyZWF0ZShhbGxvY2F0b3IsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpOwogICAgYXhpczJfc3RyZWFtX3JlYWQoZW52LSZndDtzdHJlYW0sIGFjdHVhbCwgMTApOwogICAgY2hhciAqZXhwZWN0ZWQgPSBzdHJkdXAoImFhYWFhYWFhYSIpOwogICAgQ3VBc3NlcnRTdHJFcXVhbHModGMsIGV4cGVjdGVkLCBhY3R1YWwpOwp9CgoKPC9wcmU+PC9kaXY+CiAgPHA+VGhlIHByb3RvdHlwZSBvZiB0aGUgZnVuY3Rpb24gc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBoZWFkZXIgZmlsZS4gVGhlIHRlc3QKc3VpdGUgaXMgZGVmaW5lZCBpbiA8Y29kZT51dGlsX3Rlc3QuYzwvY29kZT4uIFlvdSBuZWVkIHRvIGFkZCB0aGUgYWJvdmUgZGVmaW5lZCB0ZXN0IGNhc2UKdG8gdGhlIHRlc3Qgc3VpdGUgYXMgc2hvd24gYmVsb3cuPC9wPgogICAgPGRpdiBjbGFzcz0ic291cmNlIj48cHJlPiNpbmNsdWRlICJ1dGlsX3Rlc3QuaCIKI2luY2x1ZGUgJmx0O2F4aXMyX2FsbG9jYXRvci5oJmd0OwojaW5jbHVkZSAmbHQ7YXhpczJfZW52aXJvbm1lbnQuaCZndDsKCkN1U3VpdGUqIGF4aXMyX3V0aWxHZXRTdWl0ZSgpCnsKICAgIEN1U3VpdGUqIHN1aXRlID0gQ3VTdWl0ZU5ldygpOwoKICAgIFNVSVRFX0FERF9URVNUKHN1aXRlLCBUZXN0YXhpczJfc3RyZWFtX29wc19yZWFkKTsKICAgIFNVSVRFX0FERF9URVNUKHN1aXRlLCBUZXN0YXhpczJfbG9nX29wc193cml0ZSk7CiAgICBTVUlURV9BRERfVEVTVChzdWl0ZSwgVGVzdGF4aXMyX2hhc2hfb3BzX2dldCk7CgogICAgcmV0dXJuIHN1aXRlOwp9CgoKPC9wcmU+PC9kaXY+CiAgPC9kaXY+PGRpdiBjbGFzcz0ic3Vic2VjdGlvbiI+PGEgbmFtZT0iU3RlcDI6X0FkZGluZ190aGVfTW9kdWxlX3Rlc3Rfc3VpdGVfdG9fdGhlX01haW5fVW5pdF9UZXN0X1N1aXRlIj48L2E+PGgzPlN0ZXAyOiBBZGRpbmcgdGhlIE1vZHVsZSB0ZXN0IHN1aXRlIHRvIHRoZSBNYWluIFVuaXQgVGVzdCBTdWl0ZTwvaDM+PHA+Tm93LCB5b3UgbmVlZCB0byBhZGQgdGhlIHV0aWwgbW9kdWxlIHRlc3Qgc3VpdGUgdG8gdGhlIG1haW4gdGVzdCBzdWl0ZS48L3A+CiAgICA8ZGl2IGNsYXNzPSJzb3VyY2UiPjxwcmU+I2luY2x1ZGUgJmx0O0N1VGVzdC5oJmd0OwojaW5jbHVkZSAiLi4vLi4vdXRpbC90ZXN0L3V0aWxfdGVzdC5oIgojaW5jbHVkZSAiLi4vLi4vY29tbW9uL3Rlc3QvY29tbW9uX3Rlc3QuaCIKCnZvaWQgUnVuQWxsVGVzdHModm9pZCkKewogICAgQ3VTdHJpbmcgKm91dHB1dCA9IEN1U3RyaW5nTmV3KCk7CiAgICBDdVN1aXRlKiBzdWl0ZSA9IEN1U3VpdGVOZXcoKTsKCiAgICBDdVN1aXRlQWRkU3VpdGUoc3VpdGUsIGF4aXMyX3V0aWxHZXRTdWl0ZSgpKTsKICAgIEN1U3VpdGVBZGRTdWl0ZShzdWl0ZSwgYXhpczJfY29tbW9uR2V0U3VpdGUoKSk7CiAgICBDdVN1aXRlUnVuKHN1aXRlKTsKICAgIEN1U3VpdGVTdW1tYXJ5KHN1aXRlLCBvdXRwdXQpOwogICAgQ3VTdWl0ZURldGFpbHMoc3VpdGUsIG91dHB1dCk7CiAgICBwcmludGYoIiVzXG4iLCBvdXRwdXQtJmd0O2J1ZmZlcik7Cn0KCmludCBtYWluKHZvaWQpCnsgICAKICAgIFJ1bkFsbFRlc3RzKCk7CiAgICByZXR1cm4gMDsKfQoKCjwvcHJlPjwvZGl2PgogIDxwPllvdSBjYW4gZWl0aGVyIHJ1biBvbmx5IHRoZSB1bml0IHRlc3RzIHdyaXR0ZW4gZm9yIHRoZSB1dGlsIG1vZHVsZSBvciAKYWxsIHRoZSB0ZXN0cy48L3A+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz0iY2xlYXIiPjxocj48L2hyPjwvZGl2PjxkaXYgaWQ9ImZvb3RlciI+PGRpdiBjbGFzcz0ieHJpZ2h0Ij6pIDIwMDUtMjAwNiwgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb248L2Rpdj48ZGl2IGNsYXNzPSJjbGVhciI+PGhyPjwvaHI+PC9kaXY+PC9kaXY+PC9ib2R5PjwvaHRtbD4=