Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBTdW4gcmFzdGVyZmlsZSBMb2FkZXIKLy8KLy8gRGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBieSAKLy8gLSBIZXJ26SBEcm9sb24gKGRyb2xvbkBpbmZvbmllLmZyKQovLwovLyBUaGlzIGZpbGUgaXMgcGFydCBvZiBGcmVlSW1hZ2UgMwovLwovLyBDT1ZFUkVEIENPREUgSVMgUFJPVklERUQgVU5ERVIgVEhJUyBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVFkKLy8gT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFdBUlJBTlRJRVMKLy8gVEhBVCBUSEUgQ09WRVJFRCBDT0RFIElTIEZSRUUgT0YgREVGRUNUUywgTUVSQ0hBTlRBQkxFLCBGSVQgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi8vIE9SIE5PTi1JTkZSSU5HSU5HLiBUSEUgRU5USVJFIFJJU0sgQVMgVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBDT1ZFUkVECi8vIENPREUgSVMgV0lUSCBZT1UuIFNIT1VMRCBBTlkgQ09WRVJFRCBDT0RFIFBST1ZFIERFRkVDVElWRSBJTiBBTlkgUkVTUEVDVCwgWU9VIChOT1QKLy8gVEhFIElOSVRJQUwgREVWRUxPUEVSIE9SIEFOWSBPVEhFUiBDT05UUklCVVRPUikgQVNTVU1FIFRIRSBDT1NUIE9GIEFOWSBORUNFU1NBUlkKLy8gU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4gVEhJUyBESVNDTEFJTUVSIE9GIFdBUlJBTlRZIENPTlNUSVRVVEVTIEFOIEVTU0VOVElBTAovLyBQQVJUIE9GIFRISVMgTElDRU5TRS4gTk8gVVNFIE9GIEFOWSBDT1ZFUkVEIENPREUgSVMgQVVUSE9SSVpFRCBIRVJFVU5ERVIgRVhDRVBUIFVOREVSCi8vIFRISVMgRElTQ0xBSU1FUi4KLy8KLy8gVXNlIGF0IHlvdXIgb3duIHJpc2shCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKI2luY2x1ZGUgIlV0aWxpdGllcy5oIgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgIENvbnN0YW50cyArIGhlYWRlcnMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKI2lmZGVmIF9XSU4zMgojcHJhZ21hIHBhY2socHVzaCwgMSkKI2Vsc2UKI3ByYWdtYSBwYWNrKDEpCiNlbmRpZgoKdHlwZWRlZiBzdHJ1Y3QgdGFnU1VOSEVBREVSIHsKCURXT1JEIG1hZ2ljOwkJLy8gTWFnaWMgbnVtYmVyCglEV09SRCB3aWR0aDsJCS8vIEltYWdlIHdpZHRoIGluIHBpeGVscwoJRFdPUkQgaGVpZ2h0OwkJLy8gSW1hZ2UgaGVpZ2h0IGluIHBpeGVscwoJRFdPUkQgZGVwdGg7CQkvLyBEZXB0aCAoMSwgOCwgMjQgb3IgMzIgYml0cykgb2YgZWFjaCBwaXhlbAoJRFdPUkQgbGVuZ3RoOwkJLy8gSW1hZ2UgbGVuZ3RoIChpbiBieXRlcykKCURXT1JEIHR5cGU7CQkJLy8gRm9ybWF0IG9mIGZpbGUgKHNlZSBSVF8qIGJlbG93KQoJRFdPUkQgbWFwdHlwZTsJCS8vIFR5cGUgb2YgY29sb3JtYXAgKHNlZSBSTVRfKiBiZWxvdykKCURXT1JEIG1hcGxlbmd0aDsJLy8gTGVuZ3RoIG9mIGNvbG9ybWFwIChpbiBieXRlcykKfSBTVU5IRUFERVI7CgojaWZkZWYgX1dJTjMyCiNwcmFnbWEgcGFjayhwb3ApCiNlbHNlCiNwcmFnbWEgcGFjaygpCiNlbmRpZgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gRm9sbG93aW5nIHRoZSBoZWFkZXIgaXMgdGhlIGNvbG9ybWFwLCBmb3IgbWFwbGVuZ3RoIGJ5dGVzICh1bmxlc3MgbWFwbGVuZ3RoIGlzIHplcm8pLAovLyB0aGVuIHRoZSBpbWFnZS4gRWFjaCByb3cgb2YgdGhlIGltYWdlIGlzIHJvdW5kZWQgdG8gMiBieXRlcy4KCiNkZWZpbmUgUkFTX01BR0lDIDB4NTlBNjZBOTUgLy8gTWFnaWMgbnVtYmVyIGZvciBTdW4gcmFzdGVyZmlsZXMKCi8vIFN1biBzdXBwb3J0ZWQgdHlwZSdzCgojZGVmaW5lIFJUX09MRAkJCTAJLy8gT2xkIGZvcm1hdCAocmF3IGltYWdlIGluIDY4MDAwIGJ5dGUgb3JkZXIpCiNkZWZpbmUgUlRfU1RBTkRBUkQJCTEJLy8gUmF3IGltYWdlIGluIDY4MDAwIGJ5dGUgb3JkZXIKI2RlZmluZSBSVF9CWVRFX0VOQ09ERUQJMgkvLyBSdW4tbGVuZ3RoIGVuY29kaW5nIG9mIGJ5dGVzIAojZGVmaW5lIFJUX0ZPUk1BVF9SR0IJMwkvLyBYUkdCIG9yIFJHQiBpbnN0ZWFkIG9mIFhCR1Igb3IgQkdSCiNkZWZpbmUgUlRfRk9STUFUX1RJRkYJNAkvLyBUSUZGIDwtPiBzdGFuZGFyZCByYXN0ZXJmaWxlCiNkZWZpbmUgUlRfRk9STUFUX0lGRgk1CS8vIElGRiAoVEFBQyBmb3JtYXQpIDwtPiBzdGFuZGFyZCByYXN0ZXJmaWxlCgojZGVmaW5lIFJUX0VYUEVSSU1FTlRBTCAweGZmZmYJLy8gUmVzZXJ2ZWQgZm9yIHRlc3RpbmcKCi8vIFRoZXNlIGFyZSB0aGUgcG9zc2libGUgY29sb3JtYXAgdHlwZXMuCi8vIGlmIGl0J3MgaW4gUkdCIGZvcm1hdCwgdGhlIG1hcCBpcyBtYWRlIHVwIG9mIHRocmVlIGJ5dGUgYXJyYXlzCi8vIChyZWQsIGdyZWVuLCB0aGVuIGJsdWUpIHRoYXQgYXJlIGVhY2ggMS8zIG9mIHRoZSBjb2xvcm1hcCBsZW5ndGguCgojZGVmaW5lIFJNVF9OT05FCQkwCS8vIG1hcGxlbmd0aCBpcyBleHBlY3RlZCB0byBiZSAwCiNkZWZpbmUgUk1UX0VRVUFMX1JHQgkxCS8vIHJlZFttYXBsZW5ndGgvM10sIGdyZWVuW21hcGxlbmd0aC8zXSwgYmx1ZVttYXBsZW5ndGgvM10KI2RlZmluZSBSTVRfUkFXCQkJMgkvLyBSYXcgY29sb3JtYXAKI2RlZmluZSBSRVNDCQkJMTI4IC8vIFJ1bi1sZW5ndGggZW5jb2RpbmcgZXNjYXBlIGNoYXJhY3RlcgoKLy8gLS0tLS0gTk9URVMgLS0tLS0KLy8gRWFjaCBsaW5lIG9mIHRoZSBpbWFnZSBpcyByb3VuZGVkIG91dCB0byBhIG11bHRpcGxlIG9mIDE2IGJpdHMuCi8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHJvdW5kaW5nIGNvbnZlbnRpb24gdXNlZCBieSB0aGUgbWVtb3J5IHBpeHJlY3QKLy8gcGFja2FnZSAoL3Vzci9pbmNsdWRlL3BpeHJlY3QvbWVtdmFyLmgpIG9mIHRoZSBTdW5XaW5kb3dzIHN5c3RlbS4KLy8gVGhlIHJhc19lbmNvZGluZyBmaWVsZCAoYWx3YXlzIHNldCB0byAwIGJ5IFN1bidzIHN1cHBvcnRlZCBzb2Z0d2FyZSkKLy8gd2FzIHJlbmFtZWQgdG8gcmFzX2xlbmd0aCBpbiByZWxlYXNlIDIuMC4gIEFzIGEgcmVzdWx0LCByYXN0ZXJmaWxlcwovLyBvZiB0eXBlIDAgZ2VuZXJhdGVkIGJ5IHRoZSBvbGQgc29mdHdhcmUgY2xhaW0gdG8gaGF2ZSAwIGxlbmd0aDsgZm9yCi8vIGNvbXBhdGliaWxpdHksIGNvZGUgcmVhZGluZyByYXN0ZXJmaWxlcyBtdXN0IGJlIHByZXBhcmVkIHRvIGNvbXB1dGUgdGhlCi8vIFRSVUUgbGVuZ3RoIGZyb20gdGhlIHdpZHRoLCBoZWlnaHQsIGFuZCBkZXB0aCBmaWVsZHMuCgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIEludGVybmFsIGZ1bmN0aW9ucwovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpzdGF0aWMgdm9pZApSZWFkRGF0YShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIEJZVEUgKmJ1ZiwgRFdPUkQgbGVuZ3RoLCBCT09MIHJsZSkgewoJLy8gUmVhZCBlaXRoZXIgUnVuLUxlbmd0aCBFbmNvZGVkIG9yIG5vcm1hbCBpbWFnZSBkYXRhCgoJc3RhdGljIEJZVEUgcmVwY2hhciwgcmVtYWluaW5nPSAwOwoKCWlmIChybGUpIHsKCQkvLyBSdW4tbGVuZ3RoIGVuY29kZWQgcmVhZAoKCQl3aGlsZShsZW5ndGgtLSkgewoJCQlpZiAocmVtYWluaW5nKSB7CgkJCQlyZW1haW5pbmctLTsKCQkJCSooYnVmKyspPSByZXBjaGFyOwoJCQl9IGVsc2UgewoJCQkJaW8tPnJlYWRfcHJvYygmcmVwY2hhciwgMSwgMSwgaGFuZGxlKTsKCgkJCQlpZiAocmVwY2hhciA9PSBSRVNDKSB7CgkJCQkJaW8tPnJlYWRfcHJvYygmcmVtYWluaW5nLCAxLCAxLCBoYW5kbGUpOwoKCQkJCQlpZiAocmVtYWluaW5nID09IDApIHsKCQkJCQkJKihidWYrKyk9IFJFU0M7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaW8tPnJlYWRfcHJvYygmcmVwY2hhciwgMSwgMSwgaGFuZGxlKTsKCgkJCQkJCSooYnVmKyspPSByZXBjaGFyOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJKihidWYrKyk9IHJlcGNoYXI7CgkJCQl9CgkJCX0KCQl9Cgl9IGVsc2UgewoJCS8vIE5vcm1hbCByZWFkCgkKCQlpby0+cmVhZF9wcm9jKGJ1ZiwgbGVuZ3RoLCAxLCBoYW5kbGUpOwoJfQp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vIFBsdWdpbiBJbnRlcmZhY2UKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKc3RhdGljIGludCBzX2Zvcm1hdF9pZDsKCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gUGx1Z2luIEltcGxlbWVudGF0aW9uCi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WCkZvcm1hdCgpIHsKCXJldHVybiAiUkFTIjsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKRGVzY3JpcHRpb24oKSB7CglyZXR1cm4gIlN1biBSYXN0ZXIgSW1hZ2UiOwp9CgpzdGF0aWMgY29uc3QgY2hhciAqIERMTF9DQUxMQ09OVgpFeHRlbnNpb24oKSB7CglyZXR1cm4gInJhcyI7Cn0KCnN0YXRpYyBjb25zdCBjaGFyICogRExMX0NBTExDT05WClJlZ0V4cHIoKSB7CglyZXR1cm4gTlVMTDsKfQoKc3RhdGljIGNvbnN0IGNoYXIgKiBETExfQ0FMTENPTlYKTWltZVR5cGUoKSB7CglyZXR1cm4gImltYWdlL3gtY211LXJhc3RlciI7Cn0KCnN0YXRpYyBCT09MIERMTF9DQUxMQ09OVgpWYWxpZGF0ZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUpIHsKCUJZVEUgcmFzX3NpZ25hdHVyZVtdID0geyAweDU5LCAweEE2LCAweDZBLCAweDk1IH07CglCWVRFIHNpZ25hdHVyZVs0XSA9IHsgMCwgMCwgMCwgMCB9OwoKCWlvLT5yZWFkX3Byb2Moc2lnbmF0dXJlLCAxLCBzaXplb2YocmFzX3NpZ25hdHVyZSksIGhhbmRsZSk7CgoJcmV0dXJuIChtZW1jbXAocmFzX3NpZ25hdHVyZSwgc2lnbmF0dXJlLCBzaXplb2YocmFzX3NpZ25hdHVyZSkpID09IDApOwp9CgpzdGF0aWMgQk9PTCBETExfQ0FMTENPTlYKU3VwcG9ydHNFeHBvcnREZXB0aChpbnQgZGVwdGgpIHsKCXJldHVybiBGQUxTRTsKfQoKc3RhdGljIEJPT0wgRExMX0NBTExDT05WIApTdXBwb3J0c0V4cG9ydFR5cGUoRlJFRV9JTUFHRV9UWVBFIHR5cGUpIHsKCXJldHVybiBGQUxTRTsKfQoKc3RhdGljIEJPT0wgRExMX0NBTExDT05WClN1cHBvcnRzTm9QaXhlbHMoKSB7CglyZXR1cm4gVFJVRTsKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIEZJQklUTUFQICogRExMX0NBTExDT05WCkxvYWQoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgcGFnZSwgaW50IGZsYWdzLCB2b2lkICpkYXRhKSB7CglTVU5IRUFERVIgaGVhZGVyOwkvLyBTdW4gZmlsZSBoZWFkZXIKCVdPUkQgbGluZWxlbmd0aDsJLy8gTGVuZ3RoIG9mIHJhc3RlciBsaW5lIGluIGJ5dGVzCglXT1JEIGZpbGw7CQkJLy8gTnVtYmVyIG9mIGZpbGwgYnl0ZXMgcGVyIHJhc3RlciBsaW5lCglCT09MIHJsZTsJCQkvLyBUUlVFIGlmIFJMRSBmaWxlCglCT09MIGlzUkdCOwkJCS8vIFRSVUUgaWYgZmlsZSB0eXBlIGlzIFJUX0ZPUk1BVF9SR0IKCUJZVEUgZmlsbGNoYXI7CgoJRklCSVRNQVAgKmRpYiA9IE5VTEw7CglCWVRFICpiaXRzOwkJCS8vIFBvaW50ZXIgdG8gZGliIGRhdGEKCVdPUkQgeCwgeTsKCglpZighaGFuZGxlKSB7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJQk9PTCBoZWFkZXJfb25seSA9IChmbGFncyAmIEZJRl9MT0FEX05PUElYRUxTKSA9PSBGSUZfTE9BRF9OT1BJWEVMUzsKCgl0cnkgewoJCS8vIFJlYWQgU1VOIHJhc3RlciBoZWFkZXIKCgkJaW8tPnJlYWRfcHJvYygmaGVhZGVyLCBzaXplb2YoU1VOSEVBREVSKSwgMSwgaGFuZGxlKTsKCiNpZm5kZWYgRlJFRUlNQUdFX0JJR0VORElBTgoJCS8vIFNVTiByYXN0ZXJmaWxlcyBhcmUgYmlnIGVuZGlhbiBvbmx5CgoJCVN3YXBMb25nKCZoZWFkZXIubWFnaWMpOwoJCVN3YXBMb25nKCZoZWFkZXIud2lkdGgpOwoJCVN3YXBMb25nKCZoZWFkZXIuaGVpZ2h0KTsKCQlTd2FwTG9uZygmaGVhZGVyLmRlcHRoKTsKCQlTd2FwTG9uZygmaGVhZGVyLmxlbmd0aCk7CgkJU3dhcExvbmcoJmhlYWRlci50eXBlKTsKCQlTd2FwTG9uZygmaGVhZGVyLm1hcHR5cGUpOwoJCVN3YXBMb25nKCZoZWFkZXIubWFwbGVuZ3RoKTsKI2VuZGlmCgoJCS8vIFZlcmlmeSBTVU4gaWRlbnRpZmllcgoKCQlpZiAoaGVhZGVyLm1hZ2ljICE9IFJBU19NQUdJQykgewoJCQl0aHJvdyBGSV9NU0dfRVJST1JfTUFHSUNfTlVNQkVSOwoJCX0KCgkJLy8gQWxsb2NhdGUgYSBuZXcgRElCCgoJCXN3aXRjaChoZWFkZXIuZGVwdGgpIHsKCQkJY2FzZSAxOgoJCQljYXNlIDg6CgkJCQlkaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGVIZWFkZXIoaGVhZGVyX29ubHksIGhlYWRlci53aWR0aCwgaGVhZGVyLmhlaWdodCwgaGVhZGVyLmRlcHRoKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAyNDoKCQkJCWRpYiA9IEZyZWVJbWFnZV9BbGxvY2F0ZUhlYWRlcihoZWFkZXJfb25seSwgaGVhZGVyLndpZHRoLCBoZWFkZXIuaGVpZ2h0LCBoZWFkZXIuZGVwdGgsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOwoJCQkJYnJlYWs7CgoJCQljYXNlIDMyOgoJCQkJZGliID0gRnJlZUltYWdlX0FsbG9jYXRlSGVhZGVyKGhlYWRlcl9vbmx5LCBoZWFkZXIud2lkdGgsIGhlYWRlci5oZWlnaHQsIGhlYWRlci5kZXB0aCwgRklfUkdCQV9SRURfTUFTSywgRklfUkdCQV9HUkVFTl9NQVNLLCBGSV9SR0JBX0JMVUVfTUFTSyk7CgkJCQlicmVhazsKCQl9CgoJCWlmIChkaWIgPT0gTlVMTCkgewoJCQl0aHJvdyBGSV9NU0dfRVJST1JfRElCX01FTU9SWTsKCQl9CgoJCS8vIENoZWNrIHRoZSBmaWxlIGZvcm1hdAoKCQlybGUgPSBGQUxTRTsKCQlpc1JHQiA9IEZBTFNFOwoKCQlzd2l0Y2goaGVhZGVyLnR5cGUpIHsKCQkJY2FzZSBSVF9PTEQ6CgkJCWNhc2UgUlRfU1RBTkRBUkQ6CgkJCWNhc2UgUlRfRk9STUFUX1RJRkY6IC8vIEkgZG9uJ3QgZXZlbiBrbm93IHdoYXQgdGhlc2UgZm9ybWF0IGFyZS4uLgoJCQljYXNlIFJUX0ZPUk1BVF9JRkY6IC8vVGhlIFRJRkYgYW5kIElGRiBmb3JtYXQgdHlwZXMgaW5kaWNhdGUgdGhhdCB0aGUgcmFzdGVyCgkJCQkvL2ZpbGUgd2FzIG9yaWdpbmFsbHkgY29udmVydGVkIGZyb20gZWl0aGVyIG9mIHRoZXNlIGZpbGUgZm9ybWF0cy4KCQkJCS8vc28gbGV0cyBhdCBsZWFzdCB0cnkgdG8gcHJvY2VzcyB0aGVtIGFzIFJUX1NUQU5EQVJECgkJCQlicmVhazsKCgkJCWNhc2UgUlRfQllURV9FTkNPREVEOgoJCQkJcmxlID0gVFJVRTsKCQkJCWJyZWFrOwoKCQkJY2FzZSBSVF9GT1JNQVRfUkdCOgoJCQkJaXNSR0IgPSBUUlVFOwoJCQkJYnJlYWs7CgoJCQlkZWZhdWx0OgoJCQkJdGhyb3cgRklfTVNHX0VSUk9SX1VOU1VQUE9SVEVEX0ZPUk1BVDsKCQl9CgoJCS8vIHNldCB1cCB0aGUgY29sb3JtYXAgaWYgbmVlZGVkCgoJCXN3aXRjaChoZWFkZXIubWFwdHlwZSkgewoJCQljYXNlIFJNVF9OT05FIDoKCQkJewkJCQkKCQkJCWlmIChoZWFkZXIuZGVwdGggPCAyNCkgewoJCQkJCS8vIENyZWF0ZSBsaW5lYXIgY29sb3IgcmFtcAoKCQkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOwoKCQkJCQlpbnQgbnVtY29sb3JzID0gMSA8PCBoZWFkZXIuZGVwdGg7CgoJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtY29sb3JzOyBpKyspIHsKCQkJCQkJcGFsW2ldLnJnYlJlZAk9IChCWVRFKSgoMjU1ICogaSkgLyAobnVtY29sb3JzIC0gMSkpOwoJCQkJCQlwYWxbaV0ucmdiR3JlZW4gPSAoQllURSkoKDI1NSAqIGkpIC8gKG51bWNvbG9ycyAtIDEpKTsKCQkJCQkJcGFsW2ldLnJnYkJsdWUJPSAoQllURSkoKDI1NSAqIGkpIC8gKG51bWNvbG9ycyAtIDEpKTsKCQkJCQl9CgkJCQl9CgoJCQkJYnJlYWs7CgkJCX0KCgkJCWNhc2UgUk1UX0VRVUFMX1JHQjoKCQkJewoJCQkJQllURSAqciwgKmcsICpiOwoKCQkJCS8vIFJlYWQgU1VOIHJhc3RlciBjb2xvcm1hcAoKCQkJCWludCBudW1jb2xvcnMgPSAxIDw8IGhlYWRlci5kZXB0aDsKCQkJCWlmKChEV09SRCkoMyAqIG51bWNvbG9ycykgPiBoZWFkZXIubWFwbGVuZ3RoKSB7CgkJCQkJLy8gc29tZSBSQVMgbWF5IGhhdmUgbGVzcyBjb2xvcnMgdGhhbiB0aGUgZnVsbCBwYWxldHRlCgkJCQkJbnVtY29sb3JzID0gaGVhZGVyLm1hcGxlbmd0aCAvIDM7CgkJCQl9IGVsc2UgewoJCQkJCXRocm93ICJJbnZhbGlkIHBhbGV0dGUiOwoJCQkJfQoKCQkJCXIgPSAoQllURSopbWFsbG9jKDMgKiBudW1jb2xvcnMgKiBzaXplb2YoQllURSkpOwoJCQkJZyA9IHIgKyBudW1jb2xvcnM7CgkJCQliID0gZyArIG51bWNvbG9yczsKCgkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShkaWIpOwoKCQkJCWlvLT5yZWFkX3Byb2MociwgMyAqIG51bWNvbG9ycywgMSwgaGFuZGxlKTsKCgkJCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWNvbG9yczsgaSsrKSB7CgkJCQkJcGFsW2ldLnJnYlJlZAk9IHJbaV07CgkJCQkJcGFsW2ldLnJnYkdyZWVuID0gZ1tpXTsKCQkJCQlwYWxbaV0ucmdiQmx1ZQk9IGJbaV07CgkJCQl9CgoJCQkJZnJlZShyKTsKCQkJCWJyZWFrOwoJCQl9CgoJCQljYXNlIFJNVF9SQVc6CgkJCXsKCQkJCUJZVEUgKmNvbG9ybWFwOwoKCQkJCS8vIFJlYWQgKHNraXApIFNVTiByYXN0ZXIgY29sb3JtYXAuCgoJCQkJY29sb3JtYXAgPSAoQllURSAqKW1hbGxvYyhoZWFkZXIubWFwbGVuZ3RoICogc2l6ZW9mKEJZVEUpKTsKCgkJCQlpby0+cmVhZF9wcm9jKGNvbG9ybWFwLCBoZWFkZXIubWFwbGVuZ3RoLCAxLCBoYW5kbGUpOwoKCQkJCWZyZWUoY29sb3JtYXApOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgoJCWlmKGhlYWRlcl9vbmx5KSB7CgkJCS8vIGhlYWRlciBvbmx5IG1vZGUKCQkJcmV0dXJuIGRpYjsKCQl9CgoJCS8vIENhbGN1bGF0ZSB0aGUgbGluZSArIHBpdGNoCgkJLy8gRWFjaCByb3cgaXMgbXVsdGlwbGUgb2YgMTYgYml0cyAoMiBieXRlcykuCgoJCWlmIChoZWFkZXIuZGVwdGggPT0gMSkgewoJCQlsaW5lbGVuZ3RoID0gKFdPUkQpKChoZWFkZXIud2lkdGggLyA4KSArIChoZWFkZXIud2lkdGggJSA4ID8gMSA6IDApKTsKCQl9IGVsc2UgewoJCQlsaW5lbGVuZ3RoID0gKFdPUkQpaGVhZGVyLndpZHRoOwoJCX0KCgkJZmlsbCA9IChsaW5lbGVuZ3RoICUgMikgPyAxIDogMDsKCgkJdW5zaWduZWQgcGl0Y2ggPSBGcmVlSW1hZ2VfR2V0UGl0Y2goZGliKTsKCgkJLy8gUmVhZCB0aGUgaW1hZ2UgZGF0YQoJCQoJCXN3aXRjaChoZWFkZXIuZGVwdGgpIHsKCQkJY2FzZSAxOgoJCQljYXNlIDg6CgkJCXsKCQkJCWJpdHMgPSBGcmVlSW1hZ2VfR2V0Qml0cyhkaWIpICsgKGhlYWRlci5oZWlnaHQgLSAxKSAqIHBpdGNoOwoKCQkJCWZvciAoeSA9IDA7IHkgPCBoZWFkZXIuaGVpZ2h0OyB5KyspIHsKCQkJCQlSZWFkRGF0YShpbywgaGFuZGxlLCBiaXRzLCBsaW5lbGVuZ3RoLCBybGUpOwoKCQkJCQliaXRzIC09IHBpdGNoOwoKCQkJCQlpZiAoZmlsbCkgewoJCQkJCQlSZWFkRGF0YShpbywgaGFuZGxlLCAmZmlsbGNoYXIsIGZpbGwsIHJsZSk7CgkJCQkJfQoJCQkJfQoKCQkJCWJyZWFrOwoJCQl9CgoJCQljYXNlIDI0OgoJCQl7CgkJCQlCWVRFICpidWYsICpicDsKCgkJCQlidWYgPSAoQllURSopbWFsbG9jKGhlYWRlci53aWR0aCAqIDMpOwoKCQkJCWZvciAoeSA9IDA7IHkgPCBoZWFkZXIuaGVpZ2h0OyB5KyspIHsKCQkJCQliaXRzID0gRnJlZUltYWdlX0dldEJpdHMoZGliKSArIChoZWFkZXIuaGVpZ2h0IC0gMSAtIHkpICogcGl0Y2g7CgoJCQkJCVJlYWREYXRhKGlvLCBoYW5kbGUsIGJ1ZiwgaGVhZGVyLndpZHRoICogMywgcmxlKTsKCgkJCQkJYnAgPSBidWY7CgoJCQkJCWlmIChpc1JHQikgewoJCQkJCQlmb3IgKHggPSAwOyB4IDwgaGVhZGVyLndpZHRoOyB4KyspIHsKCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdID0gKihicCsrKTsJLy8gcmVkCgkJCQkJCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gKihicCsrKTsJLy8gZ3JlZW4KCQkJCQkJCWJpdHNbRklfUkdCQV9CTFVFXSA9ICooYnArKyk7CS8vIGJsdWUKCgkJCQkJCQliaXRzICs9IDM7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQlmb3IgKHggPSAwOyB4IDwgaGVhZGVyLndpZHRoOyB4KyspIHsKCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdID0gKihicCArIDIpOwkvLyByZWQKCQkJCQkJCWJpdHNbRklfUkdCQV9HUkVFTl0gPSAqKGJwICsgMSk7Ly8gZ3JlZW4KCQkJCQkJCWJpdHNbRklfUkdCQV9CTFVFXSA9ICpicDsgICAgICAgLy8gYmx1ZQoKCQkJCQkJCWJpdHMgKz0gMzsgYnAgKz0gMzsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKGZpbGwpIHsKCQkJCQkJUmVhZERhdGEoaW8sIGhhbmRsZSwgJmZpbGxjaGFyLCBmaWxsLCBybGUpOwoJCQkJCX0KCQkJCX0KCgkJCQlmcmVlKGJ1Zik7CgkJCQlicmVhazsKCQkJfQoKCQkJY2FzZSAzMjoKCQkJewoJCQkJQllURSAqYnVmLCAqYnA7CgoJCQkJYnVmID0gKEJZVEUqKW1hbGxvYyhoZWFkZXIud2lkdGggKiA0KTsKCgkJCQlmb3IgKHkgPSAwOyB5IDwgaGVhZGVyLmhlaWdodDsgeSsrKSB7CgkJCQkJYml0cyA9IEZyZWVJbWFnZV9HZXRCaXRzKGRpYikgKyAoaGVhZGVyLmhlaWdodCAtIDEgLSB5KSAqIHBpdGNoOwoKCQkJCQlSZWFkRGF0YShpbywgaGFuZGxlLCBidWYsIGhlYWRlci53aWR0aCAqIDQsIHJsZSk7CgoJCQkJCWJwID0gYnVmOwoKCQkJCQlpZiAoaXNSR0IpIHsKCQkJCQkJZm9yICh4ID0gMDsgeCA8IGhlYWRlci53aWR0aDsgeCsrKSB7CgkJCQkJCQliaXRzW0ZJX1JHQkFfQUxQSEFdID0gKihicCsrKTsJLy8gYWxwaGEKCQkJCQkJCWJpdHNbRklfUkdCQV9SRURdID0gKihicCsrKTsJLy8gcmVkCgkJCQkJCQliaXRzW0ZJX1JHQkFfR1JFRU5dID0gKihicCsrKTsJLy8gZ3JlZW4KCQkJCQkJCWJpdHNbRklfUkdCQV9CTFVFXSA9ICooYnArKyk7CS8vIGJsdWUKCgkJCQkJCQliaXRzICs9IDQ7CgkJCQkJCX0KCQkJCQl9CgkJCQkJZWxzZSB7CgkJCQkJCWZvciAoeCA9IDA7IHggPCBoZWFkZXIud2lkdGg7IHgrKykgewoJCQkJCQkJYml0c1tGSV9SR0JBX1JFRF0gPSAqKGJwICsgMyk7CS8vIHJlZAoJCQkJCQkJYml0c1tGSV9SR0JBX0dSRUVOXSA9ICooYnAgKyAyKTsgLy8gZ3JlZW4KCQkJCQkJCWJpdHNbRklfUkdCQV9CTFVFXSA9ICooYnAgKyAxKTsJLy8gYmx1ZQoJCQkJCQkJYml0c1tGSV9SR0JBX0FMUEhBXSA9ICpicDsJCS8vIGFscGhhCgoJCQkJCQkJYml0cyArPSA0OwoJCQkJCQkJYnAgKz0gNDsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKGZpbGwpIHsKCQkJCQkJUmVhZERhdGEoaW8sIGhhbmRsZSwgJmZpbGxjaGFyLCBmaWxsLCBybGUpOwoJCQkJCX0KCQkJCX0KCgkJCQlmcmVlKGJ1Zik7CgkJCQlicmVhazsKCQkJfQoJCX0KCQkKCQlyZXR1cm4gZGliOwoKCX0gY2F0Y2ggKGNvbnN0IGNoYXIgKnRleHQpIHsKCQlpZihkaWIpIHsKCQkJRnJlZUltYWdlX1VubG9hZChkaWIpOwoJCX0KCQlGcmVlSW1hZ2VfT3V0cHV0TWVzc2FnZVByb2Moc19mb3JtYXRfaWQsIHRleHQpOwoJfQoKCXJldHVybiBOVUxMOwp9CgovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci8vICAgSW5pdAovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cgp2b2lkIERMTF9DQUxMQ09OVgpJbml0UkFTKFBsdWdpbiAqcGx1Z2luLCBpbnQgZm9ybWF0X2lkKSB7CglzX2Zvcm1hdF9pZCA9IGZvcm1hdF9pZDsKCglwbHVnaW4tPmZvcm1hdF9wcm9jID0gRm9ybWF0OwoJcGx1Z2luLT5kZXNjcmlwdGlvbl9wcm9jID0gRGVzY3JpcHRpb247CglwbHVnaW4tPmV4dGVuc2lvbl9wcm9jID0gRXh0ZW5zaW9uOwoJcGx1Z2luLT5yZWdleHByX3Byb2MgPSBSZWdFeHByOwoJcGx1Z2luLT5vcGVuX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5jbG9zZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+cGFnZWNvdW50X3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5wYWdlY2FwYWJpbGl0eV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+bG9hZF9wcm9jID0gTG9hZDsKCXBsdWdpbi0+c2F2ZV9wcm9jID0gTlVMTDsKCXBsdWdpbi0+dmFsaWRhdGVfcHJvYyA9IFZhbGlkYXRlOwoJcGx1Z2luLT5taW1lX3Byb2MgPSBNaW1lVHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X2JwcF9wcm9jID0gU3VwcG9ydHNFeHBvcnREZXB0aDsKCXBsdWdpbi0+c3VwcG9ydHNfZXhwb3J0X3R5cGVfcHJvYyA9IFN1cHBvcnRzRXhwb3J0VHlwZTsKCXBsdWdpbi0+c3VwcG9ydHNfaWNjX3Byb2ZpbGVzX3Byb2MgPSBOVUxMOwoJcGx1Z2luLT5zdXBwb3J0c19ub19waXhlbHNfcHJvYyA9IFN1cHBvcnRzTm9QaXhlbHM7Cn0K