PCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CjxodG1sPjxoZWFkPjxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiPjx0aXRsZT5FLiBDb2RlIGZvciBSZXRyaWV2aW5nIEF0dHJpYnV0ZSBWYWx1ZSBFeGFtcGxlPC90aXRsZT48bWV0YSBuYW1lPSJnZW5lcmF0b3IiIGNvbnRlbnQ9IkRvY0Jvb2sgWFNMIFN0eWxlc2hlZXRzIFYxLjQ4Ij48bGluayByZWw9ImhvbWUiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJMaWJ4bWwgVHV0b3JpYWwiPjxsaW5rIHJlbD0idXAiIGhyZWY9ImluZGV4Lmh0bWwiIHRpdGxlPSJMaWJ4bWwgVHV0b3JpYWwiPjxsaW5rIHJlbD0icHJldmlvdXMiIGhyZWY9ImFwZC5odG1sIiB0aXRsZT0iRC4gQ29kZSBmb3IgQWRkIEF0dHJpYnV0ZSBFeGFtcGxlIj48L2hlYWQ+PGJvZHkgYmdjb2xvcj0id2hpdGUiIHRleHQ9ImJsYWNrIiBsaW5rPSIjMDAwMEZGIiB2bGluaz0iIzg0MDA4NCIgYWxpbms9IiMwMDAwRkYiPjxkaXYgY2xhc3M9Im5hdmhlYWRlciI+PHRhYmxlIHdpZHRoPSIxMDAlIiBzdW1tYXJ5PSJOYXZpZ2F0aW9uIGhlYWRlciI+PHRyPjx0aCBjb2xzcGFuPSIzIiBhbGlnbj0iY2VudGVyIj5FLiBDb2RlIGZvciBSZXRyaWV2aW5nIEF0dHJpYnV0ZSBWYWx1ZSBFeGFtcGxlPC90aD48L3RyPjx0cj48dGQgd2lkdGg9IjIwJSIgYWxpZ249ImxlZnQiPjxhIGFjY2Vzc2tleT0icCIgaHJlZj0iYXBkLmh0bWwiPlByZXY8L2E+oDwvdGQ+PHRoIHdpZHRoPSI2MCUiIGFsaWduPSJjZW50ZXIiPqA8L3RoPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0icmlnaHQiPqA8L3RkPjwvdHI+PC90YWJsZT48aHI+PC9kaXY+PGRpdiBjbGFzcz0iYXBwZW5kaXgiPjxoMiBjbGFzcz0idGl0bGUiIHN0eWxlPSJjbGVhcjogYm90aCI+PGEgbmFtZT0iZ2V0YXR0cmlidXRlYXBwZW5kaXgiPjwvYT5FLiBDb2RlIGZvciBSZXRyaWV2aW5nIEF0dHJpYnV0ZSBWYWx1ZSBFeGFtcGxlPC9oMj48cD4KICAgICAgPHByZSBjbGFzcz0icHJvZ3JhbWxpc3RpbmciPgojaW5jbHVkZSAmbHQ7c3RkaW8uaCZndDsKI2luY2x1ZGUgJmx0O3N0cmluZy5oJmd0OwojaW5jbHVkZSAmbHQ7c3RkbGliLmgmZ3Q7CiNpbmNsdWRlICZsdDtsaWJ4bWwveG1sbWVtb3J5LmgmZ3Q7CiNpbmNsdWRlICZsdDtsaWJ4bWwvcGFyc2VyLmgmZ3Q7Cgp2b2lkCmdldFJlZmVyZW5jZSAoeG1sRG9jUHRyIGRvYywgeG1sTm9kZVB0ciBjdXIpIHsKCgljdXIgPSBjdXItJmd0O3htbENoaWxkcmVuTm9kZTsKCXdoaWxlIChjdXIgIT0gTlVMTCkgewoJICAgIGlmICgoIXhtbFN0cmNtcChjdXItJmd0O25hbWUsIChjb25zdCB4bWxDaGFyICopJnF1b3Q7cmVmZXJlbmNlJnF1b3Q7KSkpIHsKCQkgICAgcHJpbnRmKCZxdW90O3VyaTogJXNcbiZxdW90OywgeG1sR2V0UHJvcChjdXIsICZxdW90O3VyaSZxdW90OykpOwoJCSAgICB9CgkgICAgY3VyID0gY3VyLSZndDtuZXh0OwoJfQogICAgcmV0dXJuOwp9CgoKdm9pZApwYXJzZURvYyhjaGFyICpkb2NuYW1lKSB7CgoJeG1sRG9jUHRyIGRvYzsKCXhtbE5vZGVQdHIgY3VyOwoKCWRvYyA9IHhtbFBhcnNlRmlsZShkb2NuYW1lKTsKCQoJaWYgKGRvYyA9PSBOVUxMICkgewoJCWZwcmludGYoc3RkZXJyLCZxdW90O0RvY3VtZW50IG5vdCBwYXJzZWQgc3VjY2Vzc2Z1bGx5LiBcbiZxdW90Oyk7CgkJcmV0dXJuOwoJfQoJCgljdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOwoJCglpZiAoY3VyID09IE5VTEwpIHsKCQlmcHJpbnRmKHN0ZGVyciwmcXVvdDtlbXB0eSBkb2N1bWVudFxuJnF1b3Q7KTsKCQl4bWxGcmVlRG9jKGRvYyk7CgkJcmV0dXJuOwoJfQoJCglpZiAoeG1sU3RyY21wKGN1ci0mZ3Q7bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgJnF1b3Q7c3RvcnkmcXVvdDspKSB7CgkJZnByaW50ZihzdGRlcnIsJnF1b3Q7ZG9jdW1lbnQgb2YgdGhlIHdyb25nIHR5cGUsIHJvb3Qgbm9kZSAhPSBzdG9yeSZxdW90Oyk7CgkJeG1sRnJlZURvYyhkb2MpOwoJCXJldHVybjsKCX0KCQoJZ2V0UmVmZXJlbmNlIChkb2MsIGN1cik7CgoJcmV0dXJuOwp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKCgljaGFyICpkb2NuYW1lOwoKCWlmIChhcmdjICZsdDs9IDEpIHsKCQlwcmludGYoJnF1b3Q7VXNhZ2U6ICVzIGRvY25hbWVcbiZxdW90OywgYXJndlswXSk7CgkJcmV0dXJuKDApOwoJfQoKCWRvY25hbWUgPSBhcmd2WzFdOwoJcGFyc2VEb2MgKGRvY25hbWUpOwoJCglyZXR1cm4gKDEpOwp9Cgo8L3ByZT4KICAgIDwvcD48L2Rpdj48ZGl2IGNsYXNzPSJuYXZmb290ZXIiPjxocj48dGFibGUgd2lkdGg9IjEwMCUiIHN1bW1hcnk9Ik5hdmlnYXRpb24gZm9vdGVyIj48dHI+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJsZWZ0Ij48YSBhY2Nlc3NrZXk9InAiIGhyZWY9ImFwZC5odG1sIj5QcmV2PC9hPqA8L3RkPjx0ZCB3aWR0aD0iMjAlIiBhbGlnbj0iY2VudGVyIj48YSBhY2Nlc3NrZXk9InUiIGhyZWY9ImluZGV4Lmh0bWwiPlVwPC9hPjwvdGQ+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJyaWdodCI+oDwvdGQ+PC90cj48dHI+PHRkIHdpZHRoPSI0MCUiIGFsaWduPSJsZWZ0IiB2YWxpZ249InRvcCI+RC4gQ29kZSBmb3IgQWRkIEF0dHJpYnV0ZSBFeGFtcGxloDwvdGQ+PHRkIHdpZHRoPSIyMCUiIGFsaWduPSJjZW50ZXIiPjxhIGFjY2Vzc2tleT0iaCIgaHJlZj0iaW5kZXguaHRtbCI+SG9tZTwvYT48L3RkPjx0ZCB3aWR0aD0iNDAlIiBhbGlnbj0icmlnaHQiIHZhbGlnbj0idG9wIj6gPC90ZD48L3RyPjwvdGFibGU+PC9kaXY+PC9ib2R5PjwvaHRtbD4K