Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNZW1vcnkgSW5wdXQvT3V0cHV0IGZ1bmN0aW9ucwovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gUnlhbiBSdWJsZXkgPHJ5YW5AbG9zdHJlYWxpdHkub3JnPiAKLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgojaW5jbHVkZSAiRnJlZUltYWdlSU8uaCIKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBPcGVuIGFuZCBjbG9zZSBhIG1lbW9yeSBoYW5kbGUKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpGSU1FTU9SWSAqIERMTF9DQUxMQ09OViAKRnJlZUltYWdlX09wZW5NZW1vcnkoQllURSAqZGF0YSwgRFdPUkQgc2l6ZV9pbl9ieXRlcykgewoJLy8gYWxsb2NhdGUgYSBtZW1vcnkgaGFuZGxlCglGSU1FTU9SWSAqc3RyZWFtID0gKEZJTUVNT1JZKiltYWxsb2Moc2l6ZW9mKEZJTUVNT1JZKSk7CglpZihzdHJlYW0pIHsKCQlzdHJlYW0tPmRhdGEgPSAoQllURSopbWFsbG9jKHNpemVvZihGSU1FTU9SWUhFQURFUikpOwoKCQlpZihzdHJlYW0tPmRhdGEpIHsKCQkJRklNRU1PUllIRUFERVIgKm1lbV9oZWFkZXIgPSAoRklNRU1PUllIRUFERVIqKShzdHJlYW0tPmRhdGEpOwoKCQkJLy8gaW5pdGlhbGl6ZSB0aGUgbWVtb3J5IGhlYWRlcgoJCQltZW1zZXQobWVtX2hlYWRlciwgMCwgc2l6ZW9mKEZJTUVNT1JZSEVBREVSKSk7CgkJCQoJCQlpZihkYXRhICYmIHNpemVfaW5fYnl0ZXMpIHsKCQkJCS8vIHdyYXAgYSB1c2VyIGJ1ZmZlcgoJCQkJbWVtX2hlYWRlci0+ZGVsZXRlX21lID0gRkFMU0U7CgkJCQltZW1faGVhZGVyLT5kYXRhID0gKEJZVEUqKWRhdGE7CgkJCQltZW1faGVhZGVyLT5kYXRhbGVuID0gbWVtX2hlYWRlci0+ZmlsZWxlbiA9IHNpemVfaW5fYnl0ZXM7CgkJCX0gZWxzZSB7CgkJCQltZW1faGVhZGVyLT5kZWxldGVfbWUgPSBUUlVFOwoJCQl9CgoJCQlyZXR1cm4gc3RyZWFtOwoJCX0KCQlmcmVlKHN0cmVhbSk7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KCgp2b2lkIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQ2xvc2VNZW1vcnkoRklNRU1PUlkgKnN0cmVhbSkgewoJRklNRU1PUllIRUFERVIgKm1lbV9oZWFkZXIgPSAoRklNRU1PUllIRUFERVIqKShzdHJlYW0tPmRhdGEpOwoJaWYobWVtX2hlYWRlci0+ZGVsZXRlX21lKSAKCQlmcmVlKG1lbV9oZWFkZXItPmRhdGEpOwoJZnJlZShtZW1faGVhZGVyKTsKCWZyZWUoc3RyZWFtKTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIE1lbW9yeSBzdHJlYW0gbG9hZC9zYXZlIGZ1bmN0aW9ucwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkZJQklUTUFQICogRExMX0NBTExDT05WCkZyZWVJbWFnZV9Mb2FkRnJvbU1lbW9yeShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJTUVNT1JZICpzdHJlYW0sIGludCBmbGFncykgewoJaWYgKHN0cmVhbSAmJiBzdHJlYW0tPmRhdGEpIHsKCQlGcmVlSW1hZ2VJTyBpbzsKCQlTZXRNZW1vcnlJTygmaW8pOwoKCQlyZXR1cm4gRnJlZUltYWdlX0xvYWRGcm9tSGFuZGxlKGZpZiwgJmlvLCAoZmlfaGFuZGxlKXN0cmVhbSwgZmxhZ3MpOwoJfQoKCXJldHVybiBOVUxMOwp9CgoKQk9PTCBETExfQ0FMTENPTlYKRnJlZUltYWdlX1NhdmVUb01lbW9yeShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIEZJQklUTUFQICpkaWIsIEZJTUVNT1JZICpzdHJlYW0sIGludCBmbGFncykgewoJaWYgKHN0cmVhbSkgewoJCUZyZWVJbWFnZUlPIGlvOwoJCVNldE1lbW9yeUlPKCZpbyk7CgoJCUZJTUVNT1JZSEVBREVSICptZW1faGVhZGVyID0gKEZJTUVNT1JZSEVBREVSKikoc3RyZWFtLT5kYXRhKTsKCgkJaWYobWVtX2hlYWRlci0+ZGVsZXRlX21lID09IFRSVUUpIHsKCQkJcmV0dXJuIEZyZWVJbWFnZV9TYXZlVG9IYW5kbGUoZmlmLCBkaWIsICZpbywgKGZpX2hhbmRsZSlzdHJlYW0sIGZsYWdzKTsKCQl9IGVsc2UgewoJCQkvLyBkbyBub3Qgc2F2ZSBpbiBhIHVzZXIgYnVmZmVyCgkJCUZyZWVJbWFnZV9PdXRwdXRNZXNzYWdlUHJvYyhmaWYsICJNZW1vcnkgYnVmZmVyIGlzIHJlYWQgb25seSIpOwoJCX0KCX0KCglyZXR1cm4gRkFMU0U7Cn0KCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBNZW1vcnkgc3RyZWFtIGJ1ZmZlciBhY2Nlc3MKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpCT09MIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfQWNxdWlyZU1lbW9yeShGSU1FTU9SWSAqc3RyZWFtLCBCWVRFICoqZGF0YSwgRFdPUkQgKnNpemVfaW5fYnl0ZXMpIHsKCWlmIChzdHJlYW0pIHsKCQlGSU1FTU9SWUhFQURFUiAqbWVtX2hlYWRlciA9IChGSU1FTU9SWUhFQURFUiopKHN0cmVhbS0+ZGF0YSk7CgoJCSpkYXRhID0gKEJZVEUqKW1lbV9oZWFkZXItPmRhdGE7CgkJKnNpemVfaW5fYnl0ZXMgPSBtZW1faGVhZGVyLT5maWxlbGVuOwoJCXJldHVybiBUUlVFOwoJfQoKCXJldHVybiBGQUxTRTsKfQoKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIE1lbW9yeSBzdHJlYW0gZmlsZSB0eXBlIGFjY2VzcwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCkZSRUVfSU1BR0VfRk9STUFUIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tTWVtb3J5KEZJTUVNT1JZICpzdHJlYW0sIGludCBzaXplKSB7CglGcmVlSW1hZ2VJTyBpbzsKCVNldE1lbW9yeUlPKCZpbyk7CgoJaWYgKHN0cmVhbSAhPSBOVUxMKSB7CgkJcmV0dXJuIEZyZWVJbWFnZV9HZXRGaWxlVHlwZUZyb21IYW5kbGUoJmlvLCAoZmlfaGFuZGxlKXN0cmVhbSwgc2l6ZSk7Cgl9CgoJcmV0dXJuIEZJRl9VTktOT1dOOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gU2Vla2luZyBpbiBNZW1vcnkgc3RyZWFtCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLyoqCk1vdmVzIHRoZSBtZW1vcnkgcG9pbnRlciB0byBhIHNwZWNpZmllZCBsb2NhdGlvbgpAcGFyYW0gc3RyZWFtIFBvaW50ZXIgdG8gRklNRU1PUlkgc3RydWN0dXJlCkBwYXJhbSBvZmZzZXQgTnVtYmVyIG9mIGJ5dGVzIGZyb20gb3JpZ2luCkBwYXJhbSBvcmlnaW4gSW5pdGlhbCBwb3NpdGlvbgpAcmV0dXJuIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCByZXR1cm5zIEZBTFNFIG90aGVyd2lzZQoqLwpCT09MIERMTF9DQUxMQ09OVgpGcmVlSW1hZ2VfU2Vla01lbW9yeShGSU1FTU9SWSAqc3RyZWFtLCBsb25nIG9mZnNldCwgaW50IG9yaWdpbikgewoJRnJlZUltYWdlSU8gaW87CglTZXRNZW1vcnlJTygmaW8pOwoKCWlmIChzdHJlYW0gIT0gTlVMTCkgewoJCWludCBzdWNjZXNzID0gaW8uc2Vla19wcm9jKChmaV9oYW5kbGUpc3RyZWFtLCBvZmZzZXQsIG9yaWdpbik7CgkJcmV0dXJuIChzdWNjZXNzID09IDApID8gVFJVRSA6IEZBTFNFOwoJfQoKCXJldHVybiBGQUxTRTsKfQoKLyoqCkdldHMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgYSBtZW1vcnkgcG9pbnRlcgpAcGFyYW0gc3RyZWFtIFRhcmdldCBGSU1FTU9SWSBzdHJ1Y3R1cmUKQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50IGZpbGUgcG9zaXRpb24gaWYgc3VjY2Vzc2Z1bCwgLTEgb3RoZXJ3aXNlCiovCmxvbmcgRExMX0NBTExDT05WCkZyZWVJbWFnZV9UZWxsTWVtb3J5KEZJTUVNT1JZICpzdHJlYW0pIHsKCUZyZWVJbWFnZUlPIGlvOwoJU2V0TWVtb3J5SU8oJmlvKTsKCglpZiAoc3RyZWFtICE9IE5VTEwpIHsKCQlyZXR1cm4gaW8udGVsbF9wcm9jKChmaV9oYW5kbGUpc3RyZWFtKTsKCX0KCglyZXR1cm4gLTFMOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gUmVhZGluZyBvciBXcml0aW5nIGluIE1lbW9yeSBzdHJlYW0KLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgovKioKUmVhZHMgZGF0YSBmcm9tIGEgbWVtb3J5IHN0cmVhbQpAcGFyYW0gYnVmZmVyIFN0b3JhZ2UgbG9jYXRpb24gZm9yIGRhdGEKQHBhcmFtIHNpemUgSXRlbSBzaXplIGluIGJ5dGVzCkBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBiZSByZWFkCkBwYXJhbSBzdHJlYW0gUG9pbnRlciB0byBGSU1FTU9SWSBzdHJ1Y3R1cmUKQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnVsbCBpdGVtcyBhY3R1YWxseSByZWFkLCB3aGljaCBtYXkgYmUgbGVzcyB0aGFuIGNvdW50IGlmIGFuIGVycm9yIG9jY3VycwoqLwp1bnNpZ25lZCBETExfQ0FMTENPTlYgCkZyZWVJbWFnZV9SZWFkTWVtb3J5KHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgY291bnQsIEZJTUVNT1JZICpzdHJlYW0pIHsKCUZyZWVJbWFnZUlPIGlvOwoJU2V0TWVtb3J5SU8oJmlvKTsKCglpZiAoc3RyZWFtICE9IE5VTEwpIHsKCQlyZXR1cm4gaW8ucmVhZF9wcm9jKGJ1ZmZlciwgc2l6ZSwgY291bnQsIHN0cmVhbSk7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qKgpXcml0ZXMgZGF0YSB0byBhIG1lbW9yeSBzdHJlYW0uCkBwYXJhbSBidWZmZXIgUG9pbnRlciB0byBkYXRhIHRvIGJlIHdyaXR0ZW4KQHBhcmFtIHNpemUgSXRlbSBzaXplIGluIGJ5dGVzCkBwYXJhbSBjb3VudCBNYXhpbXVtIG51bWJlciBvZiBpdGVtcyB0byBiZSB3cml0dGVuCkBwYXJhbSBzdHJlYW0gUG9pbnRlciB0byBGSU1FTU9SWSBzdHJ1Y3R1cmUKQHJldHVybiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZnVsbCBpdGVtcyBhY3R1YWxseSB3cml0dGVuLCB3aGljaCBtYXkgYmUgbGVzcyB0aGFuIGNvdW50IGlmIGFuIGVycm9yIG9jY3VycwoqLwp1bnNpZ25lZCBETExfQ0FMTENPTlYgCkZyZWVJbWFnZV9Xcml0ZU1lbW9yeShjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIGNvdW50LCBGSU1FTU9SWSAqc3RyZWFtKSB7CglpZiAoc3RyZWFtICE9IE5VTEwpIHsKCQlGcmVlSW1hZ2VJTyBpbzsKCQlTZXRNZW1vcnlJTygmaW8pOwoKCQlGSU1FTU9SWUhFQURFUiAqbWVtX2hlYWRlciA9IChGSU1FTU9SWUhFQURFUiopKCgoRklNRU1PUlkqKXN0cmVhbSktPmRhdGEpOwoKCQlpZihtZW1faGVhZGVyLT5kZWxldGVfbWUgPT0gVFJVRSkgewoJCQlyZXR1cm4gaW8ud3JpdGVfcHJvYygodm9pZCAqKWJ1ZmZlciwgc2l6ZSwgY291bnQsIHN0cmVhbSk7CgkJfSBlbHNlIHsKCQkJLy8gZG8gbm90IHdyaXRlIGluIGEgdXNlciBidWZmZXIKCQkJRnJlZUltYWdlX091dHB1dE1lc3NhZ2VQcm9jKEZJRl9VTktOT1dOLCAiTWVtb3J5IGJ1ZmZlciBpcyByZWFkIG9ubHkiKTsKCQl9Cgl9CgoJcmV0dXJuIDA7Cn0KCg==