Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBXaXJlbGVzcyBCaXRtYXAgRm9ybWF0IExvYWRlciBhbmQgV3JpdGVyCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnkKLy8gLSBIZXJ26SBEcm9sb24gPGRyb2xvbkBpbmZvbmllLmZyPgovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXaXJlbGVzcyBCaXRtYXAgRm9ybWF0Ci8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhlIFdCTVAgZm9ybWF0IGVuYWJsZXMgZ3JhcGhpY2FsIGluZm9ybWF0aW9uIHRvIGJlIHNlbnQgdG8gYSB2YXJpZXR5IG9mIGhhbmRzZXRzLgovLyBUaGUgV0JNUCBmb3JtYXQgaXMgdGVybWluYWwgaW5kZXBlbmRlbnQgYW5kIGRlc2NyaWJlcyBvbmx5IGdyYXBoaWNhbCBpbmZvcm1hdGlvbi4KCi8vIElNUExFTUVOVEFUSU9OIE5PVEVTOgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhlIFdCTVAgZm9ybWF0IGlzIGNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIGEgdHlwZSBmaWVsZCB2YWx1ZSAoVHlwZUZpZWxkIGJlbG93KSwKLy8gd2hpY2ggbWFwcyB0byBhbGwgcmVsZXZhbnQgaW1hZ2UgZW5jb2RpbmcgaW5mb3JtYXRpb24sIHN1Y2ggYXM6Ci8vILcgUGl4ZWwgb3JnYW5pc2F0aW9uIGFuZCBlbmNvZGluZwovLyC3IFBhbGV0dGUgb3JnYW5pc2F0aW9uIGFuZCBlbmNvZGluZwovLyC3IENvbXByZXNzaW9uIGNoYXJhY3RlcmlzdGljcwovLyC3IEFuaW1hdGlvbiBlbmNvZGluZwovLyBGb3IgZWFjaCBUeXBlRmllbGQgdmFsdWUsIGFsbCByZWxldmFudCBpbWFnZSBjaGFyYWN0ZXJpc3RpY3MgYXJlIAovLyBmdWxseSBzcGVjaWZpZWQgYXMgcGFydCBvZiB0aGUgV0FQIGRvY3VtZW50YXRpb24uCi8vIEN1cnJlbnRseSwgYSBzaW1wbGUgY29tcGFjdCwgbW9ub2Nocm9tZSBpbWFnZSBmb3JtYXQgaXMgZGVmaW5lZAovLyB3aXRoaW4gdGhlIFdCTVAgdHlwZSBzcGFjZSA6Ci8vCi8vIEltYWdlIFR5cGUgSWRlbnRpZmllciwgbXVsdGktYnl0ZSBpbnRlZ2VyCTAKLy8gSW1hZ2UgRm9ybWF0IGRlc2NyaXB0aW9uCQkJCQkJMCBCL1csIG5vIGNvbXByZXNzaW9uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIFdCTVAgSGVhZGVyCgojaWZkZWYgX1dJTjMyCiNwcmFnbWEgcGFjayhwdXNoLCAxKQojZWxzZQojcHJhZ21hIHBhY2soMSkKI2VuZGlmCgp0eXBlZGVmIHN0cnVjdCB0YWdXQk1QSEVBREVSIHsKCVdPUkQgVHlwZUZpZWxkOwkJCS8vIEltYWdlIHR5cGUgaWRlbnRpZmllciBvZiBtdWx0aS1ieXRlIGxlbmd0aAoJQllURSBGaXhIZWFkZXJGaWVsZDsJLy8gT2N0ZXQgb2YgZ2VuZXJhbCBoZWFkZXIgaW5mb3JtYXRpb24KCUJZVEUgRXh0SGVhZGVyRmllbGRzOwkvLyBaZXJvIG9yIG1vcmUgZXh0ZW5zaW9uIGhlYWRlciBmaWVsZHMKCVdPUkQgV2lkdGg7CQkJCS8vIE11bHRpLWJ5dGUgd2lkdGggZmllbGQKCVdPUkQgSGVpZ2h0OwkJCS8vIE11bHRpLWJ5dGUgaGVpZ2h0IGZpZWxkCn0gV0JNUEhFQURFUjsKCiNpZmRlZiBfV0lOMzIKI3ByYWdtYSBwYWNrKHBvcCkKI2Vsc2UKI3ByYWdtYSBwYWNrKCkKI2VuZGlmCgovLyBUaGUgZXh0ZW5zaW9uIGhlYWRlcnMgbWF5IGJlIG9mIHR5cGUgYmluYXJ5IDAwIHRocm91Z2ggYmluYXJ5IDExLCBkZWZpbmVkIGFzIGZvbGxvd3MuCgovLyAtIFR5cGUgMDAgaW5kaWNhdGVzIGEgbXVsdGktYnl0ZSBiaXRmaWVsZCB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCBoZWFkZXIgaW5mb3JtYXRpb24uCi8vIFRoZSBmaXJzdCBiaXQgaXMgc2V0IGlmIGEgdHlwZSAwMCwgZXh0ZW5zaW9uIGhlYWRlciBpcyBzZXQgaWYgbW9yZSBkYXRhIGZvbGxvd3MuCi8vICBUaGUgb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuCi8vIC0gVHlwZSAwMSAtIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLgovLyAtIFR5cGUgMTAgLSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4KLy8gLSBUeXBlIDExIGluZGljYXRlcyBhIHNlcXVlbmNlIG9mIHBhcmFtZXRlci92YWx1ZSBwYWlycy4gVGhlc2UgY2FuIGJlIHVzZWQgZm9yIAovLyBvcHRpbWlzYXRpb25zIGFuZCBzcGVjaWFsIHB1cnBvc2UgZXh0ZW5zaW9ucywgZWcsIGFuaW1hdGlvbiBpbWFnZSBmb3JtYXRzLgovLyBUaGUgcGFyYW1ldGVyIHNpemUgdGVsbHMgdGhlIGxlbmd0aCAoMS04IGJ5dGVzKSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciBuYW1lLgovLyBUaGUgdmFsdWUgc2l6ZSBnaXZlcyB0aGUgbGVuZ3RoICgxLTE2IGJ5dGVzKSBvZiB0aGUgZm9sbG93aW5nIHBhcmFtZXRlciB2YWx1ZS4KLy8gVGhlIGNvbmNhdGVuYXRpb24gZmxhZyBpbmRpY2F0ZXMgd2hldGhlciBhbm90aGVyIHBhcmFtZXRlci92YWx1ZSBwYWlyIHdpbGwgZm9sbG93Ci8vIGFmdGVyIHJlYWRpbmcgdGhlIHNwZWNpZmllZCBieXRlcyBvZiBkYXRhLgoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBJbnRlcm5hbCBmdW5jdGlvbnMKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RhdGljIERXT1JECm11bHRpQnl0ZVJlYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CgkvLyBNdWx0aS1ieXRlIGVuY29kaW5nIC8gZGVjb2RpbmcKCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCS8vIEEgbXVsdGktYnl0ZSBpbnRlZ2VyIGNvbnNpc3RzIG9mIGEgc2VyaWVzIG9mIG9jdGV0cywgd2hlcmUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0CgkvLyBpcyB0aGUgY29udGludWF0aW9uIGZsYWcsIGFuZCB0aGUgcmVtYWluaW5nIHNldmVuIGJpdHMgYXJlIGEgc2NhbGFyIHZhbHVlLgoJLy8gVGhlIGNvbnRpbnVhdGlvbiBmbGFnIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCBhbiBvY3RldCBpcyBub3QgdGhlIGVuZCBvZiB0aGUgbXVsdGktYnl0ZQoJLy8gc2VxdWVuY2UuCgoJRFdPUkQgT3V0ID0gMDsKCUJZVEUgSW4gPSAwOwoKCXdoaWxlIChpby0+cmVhZF9wcm9jKCZJbiwgMSwgMSwgaGFuZGxlKSkgewoJCU91dCArPSAoSW4gJiAweDdGKTsKCgkJaWYgKChJbiAmIDB4ODApID09IDB4MDApCgkJCWJyZWFrOwoKCQlPdXQgPDw9IDc7Cgl9CgoJcmV0dXJuIE91dDsKfQoKc3RhdGljIHZvaWQKbXVsdGlCeXRlV3JpdGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBEV09SRCBJbikgewoJQllURSBPdXQsIGsgPSAxOwogIAoJd2hpbGUgKEluICYgKDB4N0YgPDwgNyprKSkKCQlrKys7CiAgCgl3aGlsZSAoayA+IDEpIHsKCQlrLS07CgoJCU91dCA9IChCWVRFKSgweDgwIHwgKEluID4+IDcqaykgJiAweEZGKTsKCgkJaW8tPndyaXRlX3Byb2MoJk91dCwgMSwgMSwgaGFuZGxlKTsKCX0KCglPdXQgPSAoQllURSkoSW4gJiAweDdGKTsKCglpby0+d3JpdGVfcHJvYygmT3V0LCAxLCAxLCBoYW5kbGUpOwp9CgpzdGF0aWMgdm9pZApyZWFkRXh0SGVhZGVyKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgQllURSBiKSB7CiAgICAvLyBFeHRlbnNpb24gaGVhZGVyIGZpZWxkcwogICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBSZWFkIHRoZSBleHRlbnNpb24gaGVhZGVyIGZpZWxkcwogICAgLy8gKHNpbmNlIHdlIGRvbid0IHVzZSB0aGVtIGZvciB0aGUgbW9tZW50LCB3ZSBza2lwIHRoZW0pLgoKCXN3aXRjaCAoYiAmIDB4NjApIHsKCQkvLyBUeXBlIDAwOiByZWFkIG11bHRpLWJ5dGUgYml0ZmllbGQKCgkJY2FzZSAweDAwOgoJCXsKCQkJRFdPUkQgaW5mbyA9IG11bHRpQnl0ZVJlYWQoaW8sIGhhbmRsZSk7CgkJCWJyZWFrOwoJCX0JCQoKCQkvLyBUeXBlIDExOiByZWFkIGEgc2VxdWVuY2Ugb2YgcGFyYW1ldGVyL3ZhbHVlIHBhaXJzLgoKCQljYXNlIDB4NjA6CgkJewoJCQlCWVRFIHNpemVQYXJhbUlkZW50ID0gKGIgJiAweDcwKSA+PiA0OwkvLyBTaXplIG9mIFBhcmFtZXRlciBJZGVudGlmaWVyIChpbiBieXRlcykKCQkJQllURSBzaXplUGFyYW1WYWx1ZSA9IChiICYgMHgwRik7CQkvLyBTaXplIG9mIFBhcmFtZXRlciBWYWx1ZSAoaW4gYnl0ZXMpCgkJCQoJCQlCWVRFICpJZGVudCA9IChCWVRFKiltYWxsb2Moc2l6ZVBhcmFtSWRlbnQgKiBzaXplb2YoQllURSkpOwoJCQlCWVRFICpWYWx1ZSA9IChCWVRFKiltYWxsb2Moc2l6ZVBhcmFtVmFsdWUgKiBzaXplb2YoQllURSkpOwoJCQoJCQlpby0+cmVhZF9wcm9jKElkZW50LCBzaXplUGFyYW1JZGVudCwgMSwgaGFuZGxlKTsKCQkJaW8tPnJlYWRfcHJvYyhWYWx1ZSwgc2l6ZVBhcmFtVmFsdWUsIDEsIGhhbmRsZSk7CgkJCQoJCQlmcmVlKElkZW50KTsKCQkJZnJlZShWYWx1ZSk7CgkJCWJyZWFrOwoJCX0JCQoKCQkvLyByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQoKCQljYXNlIDB4MjA6CS8vIFR5cGUgMDEKCQljYXNlIDB4NDA6CS8vIFR5cGUgMTAKCQkJYnJlYWs7Cgl9Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gUGx1Z2luIEludGVyZmFjZQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGF0aWMgaW50IHNfZm9ybWF0X2lkOwoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBQbHVnaW4gSW1wbGVtZW50YXRpb24KLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRm9ybWF0KCkgewoJcmV0dXJuICJXQk1QIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRGVzY3JpcHRpb24oKSB7CglyZXR1cm4gIldpcmVsZXNzIEJpdG1hcCI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCkV4dGVuc2lvbigpIHsKCXJldHVybiAid2FwLHdibXAsd2JtIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKUmVnRXhwcigpIHsKCXJldHVybiBOVUxMOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpNaW1lVHlwZSgpIHsKCXJldHVybiAiaW1hZ2Uvdm5kLndhcC53Ym1wIjsKfQoKc3RhdGljIEJPT0wgRExMX0NBTExDT05WClN1cHBvcnRzRXhwb3J0RGVwdGgoaW50IGRlcHRoKSB7CglyZXR1cm4gKAoJCShkZXB0aCA9PSAxKQoJCSk7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OViAKU3VwcG9ydHNFeHBvcnRUeXBlKEZSRUVfSU1BR0VfVFlQRSB0eXBlKSB7CglyZXR1cm4gKHR5cGUgPT0gRklUX0JJVE1BUCkgPyBUUlVFIDogRkFMU0U7Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyBGSUJJVE1BUCAqIERMTF9DQUxMQ09OVgpMb2FkKEZyZWVJbWFnZUlPICppbywgZmlfaGFuZGxlIGhhbmRsZSwgaW50IHBhZ2UsIGludCBmbGFncywgdm9pZCAqZGF0YSkgewoJV09SRCB4LCB5LCB3aWR0aCwgaGVpZ2h0OwoJRklCSVRNQVAgKmRpYjsKICAgIEJZVEUgKmJpdHM7CQkvLyBwb2ludGVyIHRvIGRpYiBkYXRhCglSR0JRVUFEICpwYWw7CS8vIHBvaW50ZXIgdG8gZGliIHBhbGV0dGUKCglXQk1QSEVBREVSIGhlYWRlcjsKCglpZiAoaGFuZGxlKSB7CgkJdHJ5IHsKCQkJLy8gUmVhZCBoZWFkZXIgaW5mb3JtYXRpb24KCQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgkJCS8vIFR5cGUKCgkJCWhlYWRlci5UeXBlRmllbGQgPSAoV09SRCltdWx0aUJ5dGVSZWFkKGlvLCBoYW5kbGUpOwoKCQkJaWYgKGhlYWRlci5UeXBlRmllbGQgIT0gMCkgewoJCQkJdGhyb3cgRklfTVNHX0VSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVDsKCQkJfQoKCQkJLy8gRml4SGVhZGVyRmllbGQKCgkJCWlvLT5yZWFkX3Byb2MoJmhlYWRlci5GaXhIZWFkZXJGaWVsZCwgMSwgMSwgaGFuZGxlKTsKCgkJCS8vIEV4dEhlYWRlckZpZWxkcwoJCQkvLyAxID0gbW9yZSB3aWxsIGZvbGxvdywgMCA9IGxhc3Qgb2N0ZXQKCgkJCWlmIChoZWFkZXIuRml4SGVhZGVyRmllbGQgJiAweDgwKSB7CgkJCQloZWFkZXIuRXh0SGVhZGVyRmllbGRzID0gMHg4MDsKCgkJCQl3aGlsZShoZWFkZXIuRXh0SGVhZGVyRmllbGRzICYgMHg4MCkgewoJCQkJCWlvLT5yZWFkX3Byb2MoJmhlYWRlci5FeHRIZWFkZXJGaWVsZHMsIDEsIDEsIGhhbmRsZSk7CgoJCQkJCXJlYWRFeHRIZWFkZXIoaW8sIGhhbmRsZSwgaGVhZGVyLkV4dEhlYWRlckZpZWxkcyk7CgkJCQl9CgkJCX0KCgkJCS8vIHdpZHRoICYgaGVpZ2h0CgoJCQl3aWR0aCAgPSAoV09SRCltdWx0aUJ5dGVSZWFkKGlvLCBoYW5kbGUpOwoJCQloZWlnaHQgPSAoV09SRCltdWx0aUJ5dGVSZWFkKGlvLCBoYW5kbGUpOwoKCQkJLy8gQWxsb2NhdGUgYSBuZXcgZGliCgoJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgMSk7CgkJCWlmICghZGliKSB7CgkJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKCQkJfQoKCQkJLy8gd3JpdGUgdGhlIHBhbGV0dGUgZGF0YQoKCQkJcGFsID0gRnJlZUltYWdlX0dldFBhbGV0dGUoZGliKTsKCQkJcGFsWzBdLnJnYlJlZCA9IHBhbFswXS5yZ2JHcmVlbiA9IHBhbFswXS5yZ2JCbHVlID0gMDsKCQkJcGFsWzFdLnJnYlJlZCA9IHBhbFsxXS5yZ2JHcmVlbiA9IHBhbFsxXS5yZ2JCbHVlID0gMjU1OwoKCQkJLy8gcmVhZCB0aGUgYml0bWFwIGRhdGEKCQkJCgkJCWludCBsaW5lID0gRnJlZUltYWdlX0dldExpbmUoZGliKTsKCgkJCWZvciAoeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykgewoJCQkJYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlaWdodCAtIDEgLSB5KTsKCgkJCQlmb3IgKHggPSAwOyB4IDwgbGluZTsgeCsrKSB7CgkJCQkJaW8tPnJlYWRfcHJvYygmYml0c1t4XSwgMSwgMSwgaGFuZGxlKTsKCQkJCX0KCQkJfQoKCQkJcmV0dXJuIGRpYjsKCgkJfSBjYXRjaChjb25zdCBjaGFyICp0ZXh0KSAgewoJCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOwoKCQkJcmV0dXJuIE5VTEw7CgkJfQoKCX0KCglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIEJPT0wgRExMX0NBTExDT05WClNhdmUoRnJlZUltYWdlSU8gKmlvLCBGSUJJVE1BUCAqZGliLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CiAgICBCWVRFICpiaXRzOwkvLyBwb2ludGVyIHRvIGRpYiBkYXRhCgoJaWYgKChkaWIpICYmIChoYW5kbGUpKSB7CgkJdHJ5IHsKCQkJaWYgKEZyZWVJbWFnZV9HZXRCUFAoZGliKSAhPSAxKQoJCQkJdGhyb3cgIk9ubHkgMS1iaXQgZGVwdGggYml0bWFwcyBjYW4gYmUgc2F2ZWQgYXMgV0JNUCI7CgoJCQkvLyB3cml0ZSB0aGUgaGVhZGVyCgoJCQlXQk1QSEVBREVSIGhlYWRlcjsKCQkJaGVhZGVyLlR5cGVGaWVsZCA9IDA7CQkJCQkJCQkvLyBUeXBlIDA6IEIvVywgbm8gY29tcHJlc3Npb24KCQkJaGVhZGVyLkZpeEhlYWRlckZpZWxkID0gMDsJCQkJCQkJLy8gTm8gRXh0SGVhZGVyRmllbGQKCQkJaGVhZGVyLldpZHRoID0gKFdPUkQpRnJlZUltYWdlX0dldFdpZHRoKGRpYik7CQkvLyBJbWFnZSB3aWR0aAoJCQloZWFkZXIuSGVpZ2h0ID0gKFdPUkQpRnJlZUltYWdlX0dldEhlaWdodChkaWIpOwkJLy8gSW1hZ2UgaGVpZ2h0CgoJCQltdWx0aUJ5dGVXcml0ZShpbywgaGFuZGxlLCBoZWFkZXIuVHlwZUZpZWxkKTsKCQkJCgkJCWlvLT53cml0ZV9wcm9jKCZoZWFkZXIuRml4SGVhZGVyRmllbGQsIDEsIDEsIGhhbmRsZSk7CgoJCQltdWx0aUJ5dGVXcml0ZShpbywgaGFuZGxlLCBoZWFkZXIuV2lkdGgpOwoJCQltdWx0aUJ5dGVXcml0ZShpbywgaGFuZGxlLCBoZWFkZXIuSGVpZ2h0KTsKCgkJCS8vIHdyaXRlIHRoZSBiaXRtYXAgZGF0YQoKCQkJV09SRCBsaW5lbGVuZ3RoID0gKFdPUkQpRnJlZUltYWdlX0dldExpbmUoZGliKTsKCgkJCWZvciAoV09SRCB5ID0gMDsgeSA8IGhlYWRlci5IZWlnaHQ7IHkrKykgewoJCQkJYml0cyA9IEZyZWVJbWFnZV9HZXRTY2FuTGluZShkaWIsIGhlYWRlci5IZWlnaHQgLSAxIC0geSk7CgoJCQkJaW8tPndyaXRlX3Byb2MoJmJpdHNbMF0sIGxpbmVsZW5ndGgsIDEsIGhhbmRsZSk7CgkJCX0KCgkJCXJldHVybiBUUlVFOwoKCQl9IGNhdGNoIChjb25zdCBjaGFyKiB0ZXh0KSB7CgkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhzX2Zvcm1hdF9pZCwgdGV4dCk7CgkJfQoJfQoKCXJldHVybiBGQUxTRTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyAgIEluaXQKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKdm9pZCBETExfQ0FMTENPTlYKSW5pdFdCTVAoUGx1Z2luICpwbHVnaW4sIGludCBmb3JtYXRfaWQpIHsKCXNfZm9ybWF0X2lkID0gZm9ybWF0X2lkOwoKCXBsdWdpbi0+Zm9ybWF0X3Byb2MgPSBGb3JtYXQ7CglwbHVnaW4tPmRlc2NyaXB0aW9uX3Byb2MgPSBEZXNjcmlwdGlvbjsKCXBsdWdpbi0+ZXh0ZW5zaW9uX3Byb2MgPSBFeHRlbnNpb247CglwbHVnaW4tPnJlZ2V4cHJfcHJvYyA9IFJlZ0V4cHI7CglwbHVnaW4tPm9wZW5fcHJvYyA9IE5VTEw7CglwbHVnaW4tPmNsb3NlX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5wYWdlY291bnRfcHJvYyA9IE5VTEw7CglwbHVnaW4tPnBhZ2VjYXBhYmlsaXR5X3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5sb2FkX3Byb2MgPSBMb2FkOwoJcGx1Z2luLT5zYXZlX3Byb2MgPSBTYXZlOwoJcGx1Z2luLT52YWxpZGF0ZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+bWltZV9wcm9jID0gTWltZVR5cGU7CglwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF9icHBfcHJvYyA9IFN1cHBvcnRzRXhwb3J0RGVwdGg7CglwbHVnaW4tPnN1cHBvcnRzX2V4cG9ydF90eXBlX3Byb2MgPSBTdXBwb3J0c0V4cG9ydFR5cGU7CglwbHVnaW4tPnN1cHBvcnRzX2ljY19wcm9maWxlc19wcm9jID0gTlVMTDsKfQo=