PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CjxodG1sPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPjx0aXRsZT5GLqBDb2RlIGZvciBFbmNvZGluZyBDb252ZXJzaW9uIEV4YW1wbGU8L3RpdGxlPjxtZXRhIG5hbWU9ImdlbmVyYXRvciIgY29udGVudD0iRG9jQm9vayBYU0wgU3R5bGVzaGVldHMgVjEuNjAuMSI+PGxpbmsgcmVsPSJob21lIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InVwIiBocmVmPSJpbmRleC5odG1sIiB0aXRsZT0iTGlieG1sIFR1dG9yaWFsIj48bGluayByZWw9InByZXZpb3VzIiBocmVmPSJhcGUuaHRtbCIgdGl0bGU9IkUuoENvZGUgZm9yIFJldHJpZXZpbmcgQXR0cmlidXRlIFZhbHVlIEV4YW1wbGUiPjxsaW5rIHJlbD0ibmV4dCIgaHJlZj0iaXgwMS5odG1sIiB0aXRsZT0iSW5kZXgiPjwvaGVhZD48Ym9keSBiZ2NvbG9yPSJ3aGl0ZSIgdGV4dD0iYmxhY2siIGxpbms9IiMwMDAwRkYiIHZsaW5rPSIjODQwMDg0IiBhbGluaz0iIzAwMDBGRiI+PGRpdiBjbGFzcz0ibmF2aGVhZGVyIj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gaGVhZGVyIj48dHI+PHRoIGNvbHNwYW49IjMiIGFsaWduPSJjZW50ZXIiPkYuoENvZGUgZm9yIEVuY29kaW5nIENvbnZlcnNpb24gRXhhbXBsZTwvdGg+PC90cj48dHI+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJsZWZ0Ij48YSBhY2Nlc3NrZXk9InAiIGhyZWY9ImFwZS5odG1sIj5QcmV2PC9hPqA8L3RkPjx0aCB3aWR0aD0iNjAlIiBhbGlnbj0iY2VudGVyIj6gPC90aD48dGQgd2lkdGg9IjIwJSIgYWxpZ249InJpZ2h0Ij6gPGEgYWNjZXNza2V5PSJuIiBocmVmPSJpeDAxLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjwvdGFibGU+PGhyPjwvZGl2PjxkaXYgY2xhc3M9ImFwcGVuZGl4IiBsYW5nPSJlbiI+PGRpdiBjbGFzcz0idGl0bGVwYWdlIj48ZGl2PjxkaXY+PGgyIGNsYXNzPSJ0aXRsZSI+PGEgbmFtZT0iY29udmVydGFwcGVuZGl4Ij48L2E+Ri6gQ29kZSBmb3IgRW5jb2RpbmcgQ29udmVyc2lvbiBFeGFtcGxlPC9oMj48L2Rpdj48L2Rpdj48ZGl2PjwvZGl2PjwvZGl2PjxwPgogICAgICA8L3A+PHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgojaW5jbHVkZSAmbHQ7c3RyaW5nLmgmZ3Q7CiNpbmNsdWRlICZsdDtsaWJ4bWwvcGFyc2VyLmgmZ3Q7CgoKdW5zaWduZWQgY2hhcioKY29udmVydCAodW5zaWduZWQgY2hhciAqaW4sIGNoYXIgKmVuY29kaW5nKQp7Cgl1bnNpZ25lZCBjaGFyICpvdXQ7CiAgICAgICAgaW50IHJldCxzaXplLG91dF9zaXplLHRlbXA7CiAgICAgICAgeG1sQ2hhckVuY29kaW5nSGFuZGxlclB0ciBoYW5kbGVyOwoKICAgICAgICBzaXplID0gKGludClzdHJsZW4oaW4pKzE7IAogICAgICAgIG91dF9zaXplID0gc2l6ZSoyLTE7IAogICAgICAgIG91dCA9IG1hbGxvYygoc2l6ZV90KW91dF9zaXplKTsgCgogICAgICAgIGlmIChvdXQpIHsKICAgICAgICAgICAgICAgIGhhbmRsZXIgPSB4bWxGaW5kQ2hhckVuY29kaW5nSGFuZGxlcihlbmNvZGluZyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGlmICghaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICBmcmVlKG91dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IE5VTEw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChvdXQpIHsKICAgICAgICAgICAgICAgIHRlbXA9c2l6ZS0xOwogICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlci0mZ3Q7aW5wdXQob3V0LCAmYW1wO291dF9zaXplLCBpbiwgJmFtcDt0ZW1wKTsKICAgICAgICAgICAgICAgIGlmIChyZXQgfHwgdGVtcC1zaXplKzEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigmcXVvdDtjb252ZXJzaW9uIHdhc24ndCBzdWNjZXNzZnVsLlxuJnF1b3Q7KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoJnF1b3Q7Y29udmVyc2lvbiB3YXNuJ3Qgc3VjY2Vzc2Z1bC4gY29udmVydGVkOiAlaSBvY3RldHMuXG4mcXVvdDssdGVtcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZnJlZShvdXQpOwogICAgICAgICAgICAgICAgICAgICAgICBvdXQgPSBOVUxMOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3V0ID0gcmVhbGxvYyhvdXQsb3V0X3NpemUrMSk7IAogICAgICAgICAgICAgICAgICAgICAgICBvdXRbb3V0X3NpemVdPTA7IC8qbnVsbCB0ZXJtaW5hdGluZyBvdXQqLwogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnRmKCZxdW90O25vIG1lbVxuJnF1b3Q7KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChvdXQpOwp9CQoKCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewoKCXVuc2lnbmVkIGNoYXIgKmNvbnRlbnQsICpvdXQ7Cgl4bWxEb2NQdHIgZG9jOwoJeG1sTm9kZVB0ciByb290bm9kZTsKCWNoYXIgKmVuY29kaW5nID0gJnF1b3Q7SVNPLTg4NTktMSZxdW90OzsKCQoJCQoJaWYgKGFyZ2MgJmx0Oz0gMSkgewoJCXByaW50ZigmcXVvdDtVc2FnZTogJXMgY29udGVudFxuJnF1b3Q7LCBhcmd2WzBdKTsKCQlyZXR1cm4oMCk7Cgl9CgoJY29udGVudCA9IGFyZ3ZbMV07CgoJb3V0ID0gY29udmVydChjb250ZW50LCBlbmNvZGluZyk7CgoJZG9jID0geG1sTmV3RG9jICgmcXVvdDsxLjAmcXVvdDspOwoJcm9vdG5vZGUgPSB4bWxOZXdEb2NOb2RlKGRvYywgTlVMTCwgKGNvbnN0IHhtbENoYXIqKSZxdW90O3Jvb3QmcXVvdDssIG91dCk7Cgl4bWxEb2NTZXRSb290RWxlbWVudChkb2MsIHJvb3Rub2RlKTsKCgl4bWxTYXZlRm9ybWF0RmlsZUVuYygmcXVvdDstJnF1b3Q7LCBkb2MsIGVuY29kaW5nLCAxKTsKCXJldHVybiAoMSk7Cn0KCjwvcHJlPjxwPgogICAgPC9wPjwvZGl2PjxkaXYgY2xhc3M9Im5hdmZvb3RlciI+PGhyPjx0YWJsZSB3aWR0aD0iMTAwJSIgc3VtbWFyeT0iTmF2aWdhdGlvbiBmb290ZXIiPjx0cj48dGQgd2lkdGg9IjQwJSIgYWxpZ249ImxlZnQiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iYXBlLmh0bWwiPlByZXY8L2E+oDwvdGQ+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJjZW50ZXIiPjxhIGFjY2Vzc2tleT0idSIgaHJlZj0iaW5kZXguaHRtbCI+VXA8L2E+PC90ZD48dGQgd2lkdGg9IjQwJSIgYWxpZ249InJpZ2h0Ij6gPGEgYWNjZXNza2V5PSJuIiBocmVmPSJpeDAxLmh0bWwiPk5leHQ8L2E+PC90ZD48L3RyPjx0cj48dGQgd2lkdGg9IjQwJSIgYWxpZ249ImxlZnQiIHZhbGlnbj0idG9wIj5FLqBDb2RlIGZvciBSZXRyaWV2aW5nIEF0dHJpYnV0ZSBWYWx1ZSBFeGFtcGxloDwvdGQ+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJjZW50ZXIiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj6gSW5kZXg8L3RkPjwvdHI+PC90YWJsZT48L2Rpdj48L2JvZHk+PC9odG1sPgo=