LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCIDxkYW5pZWxAb21pY3Jvbi5zZT4uCiAqCiAqIFNlZSBmaWxlIENSRURJVFMgZm9yIGxpc3Qgb2YgcGVvcGxlIHdobyBjb250cmlidXRlZCB0byB0aGlzCiAqIHByb2plY3QuCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKICogdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sCiAqIE1BIDAyMTExLTEzMDcgVVNBCiAqLwoKLyoKICogQmFzZWQgb24gc2M1MjBjZHAuYyBmcm9tIHJvbG8gMS42OgogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogKEMpIENvcHlyaWdodCAyMDAwCiAqIFN5c2dvIFJlYWwtVGltZSBTb2x1dGlvbnMgR21iSAogKiBLbGVpbi1XaW50ZXJuaGVpbSwgR2VybWFueQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCgojaW5jbHVkZSA8Y29tbW9uLmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGFzbS9pYy9hbGk1MTJ4Lmg+CgoKLyogQUxJIE01MTIzIExvZ2ljYWwgZGV2aWNlIG51bWJlcnM6CiAqIDAgRkRDCiAqIDEgdW51c2VkPwogKiAyIHVudXNlZD8KICogMyBscHQKICogNCBVQVJUMQogKiA1IFVBUlQyCiAqIDYgUlRDCiAqIDcgbW91c2Uva2JkCiAqIDggQ0lPCiAqLwoKLyoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgU29tZSBhY2Nlc3MgcHJpbWl0aXZlcyBmb3IgdGhlIEFMaSBjaGlwOiAgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICovCgpzdGF0aWMgdm9pZCBhbGlfd3JpdGUodTggaW5kZXgsIHU4IHZhbHVlKQp7CQoJLyogd3JpdGUgYW4gYXJiaXJhcnkgcmVnaXN0ZXIgKi8KCW91dGIoaW5kZXgsIEFMSV9JTkRFWCk7CglvdXRiKHZhbHVlLCBBTElfREFUQSk7Cn0KCnN0YXRpYyBpbnQgYWxpX3JlYWQodTggaW5kZXgpCnsKCW91dGIoaW5kZXgsIEFMSV9JTkRFWCk7CglyZXR1cm4gaW5iKEFMSV9EQVRBKTsKfQoKI2RlZmluZSBBTElfT1BFTigpIFwKCW91dGIoMHg1MSwgQUxJX0RBVEEpOyBcCglvdXRiKDB4MjMsIEFMSV9EQVRBKQkKCgojZGVmaW5lIEFMSV9DTE9TRSgpIFwKCW91dGIoMHhiYiwgQUxJX0RBVEEpCgovKiBTZWxlY3QgYSBsb2dpY2FsIGRldmljZSAqLwojZGVmaW5lIEFMSV9TRUxERVYoZGV2KQlcCglhbGlfd3JpdGUoMHgwNywgZGV2KQkKCgp2b2lkIGFsaTUxMnhfaW5pdCh2b2lkKQp7CglBTElfT1BFTigpOwoKCWFsaV93cml0ZSgweDAyLCAweDAxKTsJLyogc29mdCByZXNldCAqLwoJYWxpX3dyaXRlKDB4MDMsIDB4MDMpOwkvKiBkaXNhYmxlIGFjY2VzcyB0byBDSU9zICovCglhbGlfd3JpdGUoMHgyMiwgMHgwMCk7CS8qIGRpc2FibGUgZGlyZWN0IHBvd2VyZG93biAqLwoJYWxpX3dyaXRlKDB4MjMsIDB4MDApOwkvKiBkaXNhYmxlIGF1dG8gcG93ZXJkb3duICovCglhbGlfd3JpdGUoMHgyNCwgMHgwMCk7CS8qIElSIDggaXMgYWN0aXZlIGhpLCBwaW4yNiBpcyBQRElSICovCgoJQUxJX0NMT1NFKCk7Cn0KCnZvaWQgYWxpNTEyeF9zZXRfZmRjKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSwgdTggZG1hX2NoYW5uZWwpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDApOwoJCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CgkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CgkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CgkJYWxpX3dyaXRlKDB4NzQsIGRtYV9jaGFubmVsKTsKCQkKCQkvKiBBVCBtb2RlLCBubyBkcml2ZSBzd2FwICovCgkJYWxpX3dyaXRlKDB4ZjAsIDB4MDgpOwoJCWFsaV93cml0ZSgweGYxLCAweDAwKTsKCQlhbGlfd3JpdGUoMHhmMiwgMHhmZik7CgkJYWxpX3dyaXRlKDB4ZjQsIDB4MDApOwoJfQoJQUxJX0NMT1NFKCk7Cn0KCgp2b2lkIGFsaTUxMnhfc2V0X3BwKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSwgdTggZG1hX2NoYW5uZWwpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDMpOwoJCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg2MCwgaW8gPj4gOCk7CgkJYWxpX3dyaXRlKDB4NjEsIGlvICYgMHhmZik7CgkJYWxpX3dyaXRlKDB4NzAsIGlycSk7CgkJYWxpX3dyaXRlKDB4NzQsIGRtYV9jaGFubmVsKTsKCQkKCQkvKiBtb2RlOiBFUFAgMS45LCBFQ1AgRklGTyB0aHJlc2hvbGQgPSA3LCBJUlEgYWN0aXZlIGxvdyAqLwoJCWFsaV93cml0ZSgweGYwLCAweGJjKTsKCQkvKiAxMiBNSHosIEJ1cnN0IERNQSBpbiBFQ1AgKi8KCQlhbGlfd3JpdGUoMHhmMSwgMHgwNSk7Cgl9CglBTElfQ0xPU0UoKTsKCn0KCnZvaWQgYWxpNTEyeF9zZXRfdWFydChpbnQgZW5hYmxlZCwgaW50IGluZGV4LCB1MTYgaW8sIHU4IGlycSkKewoJQUxJX09QRU4oKTsKCUFMSV9TRUxERVYoaW5kZXg/NTo0KTsKCQoJYWxpX3dyaXRlKDB4MzAsIGVuYWJsZWQ/MTowKTsKCWlmIChlbmFibGVkKSB7CgkJYWxpX3dyaXRlKDB4NjAsIGlvID4+IDgpOwoJCWFsaV93cml0ZSgweDYxLCBpbyAmIDB4ZmYpOwoJCWFsaV93cml0ZSgweDcwLCBpcnEpOwoJCQoJCWFsaV93cml0ZSgweGYwLCAweDAwKTsKCQlhbGlfd3JpdGUoMHhmMSwgMHgwMCk7CgkJCgkJLyogaHVoPyB3cml0ZSAweGYyIHR3aWNlIC0gYSB0eXBvIGluIHJvbG8KCQkgKiBvciBzb21lIHNlY3JldCBhbGkgZXJyYXRhPyBXaG8ga25vd3M/IAoJCSAqLwoJCWlmIChpbmRleCkgewoJCQlhbGlfd3JpdGUoMHhmMiwgMHgwMCk7CgkJfQoJCWFsaV93cml0ZSgweGYyLCAweDBjKTsKCX0KCUFMSV9DTE9TRSgpOwoKfQoKdm9pZCBhbGk1MTJ4X3NldF91YXJ0Ml9pcmRhKGludCBlbmFibGVkKQp7CglBTElfT1BFTigpOwoJQUxJX1NFTERFVig1KTsKCQoJYWxpX3dyaXRlKDB4ZjEsIGVuYWJsZWQ/MHg0ODoweDAwKTsgLyogZnVsbGR1cGxleCBJckRhICovCglBTElfQ0xPU0UoKTsKCn0KCnZvaWQgYWxpNTEyeF9zZXRfcnRjKGludCBlbmFibGVkLCB1MTYgaW8sIHU4IGlycSkKewoJQUxJX09QRU4oKTsKCUFMSV9TRUxERVYoNik7CgkKCWFsaV93cml0ZSgweDMwLCBlbmFibGVkPzE6MCk7CglpZiAoZW5hYmxlZCkgewoJCWFsaV93cml0ZSgweDYwLCBpbyA+PiA4KTsKCQlhbGlfd3JpdGUoMHg2MSwgaW8gJiAweGZmKTsKCQlhbGlfd3JpdGUoMHg3MCwgaXJxKTsKCgkJYWxpX3dyaXRlKDB4ZjAsIDB4MDApOwoJfQoJQUxJX0NMT1NFKCk7Cn0KCnZvaWQgYWxpNTEyeF9zZXRfa2JjKGludCBlbmFibGVkLCB1OCBrYmNfaXJxLCB1OCBtb3VzZV9pcnEpCnsKCUFMSV9PUEVOKCk7CglBTElfU0VMREVWKDcpOwoJCglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJaWYgKGVuYWJsZWQpIHsKCQlhbGlfd3JpdGUoMHg3MCwga2JjX2lycSk7CgkJYWxpX3dyaXRlKDB4NzIsIG1vdXNlX2lycSk7CQkKCQkKCQlhbGlfd3JpdGUoMHhmMCwgMHgwMCk7Cgl9CglBTElfQ0xPU0UoKTsKfQoKCi8qIENvbW1vbiBJL08KICogCiAqIChUaGlzIGRlc2NyaXBvdHNpb24gaXMgYmFzZSBvbiBzZXZlcmFsIGluY29tcGV0ZSBzb3VyY2VzCiAqICBzaW5jZSBJIGhhdmUgbm90IGJlZW4gYWJsZSB0byBvYnRhaW4gYW55IGRhdGFzaGVldCBmb3IgdGhlIGRldmljZQogKiAgdGhlcmUgbWF5IGJlIHNvbWUgbWlzLXVuZGVyc3RhbmRpbmdzIGJ1cnJpZWQgaW4gaGVyZS4gCiAqICAtLSBEYW5pZWwgZGFuaWVsQG9taWNyb24uc2UpCiAqIAogKiBUaGVyZSBhcmUgMjIgQ0lPIHBpbnMgbnVtYmVyZWQKICogMTAtMTcKICogMjAtMjUKICogMzAtMzcKICogCiAqIDIwLTI0IGFyZSBkZWRpY2F0ZWQgQ0lPIHBpbnMsIHRoZSBvdGhlciAxNyBhcmUgbXVsaXBsZXhlZCB3aXRoCiAqIG90aGVyIGZ1bmN0aW9ucy4KICogCiAqICAgICAgICAgICBTZWNvbmRhcnkgCiAqIENJTyBQaW4gICBGdW5jdGlvbiAgICBEZWNyaXB0aW9uCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogQ0lPMTAgICAgIElSUUlOMSAgICAgIEludGVycnVwdCBpbnB1dCAxPwogKiBDSU8xMSAgICAgSVJRSU4yICAgICAgSW50ZXJydXB0IGlucHV0IDI/CiAqIENJTzEyICAgICBJUlJYICAgICAgICBJckRhIFJlY2VpdmUKICogQ0lPMTMgICAgIElSVFggICAgICAgIElyRGEgVHJhbnNtaXQKICogQ0lPMTQgICAgIFAyMSAgICAgICAgIEtCQyBQMjEgZnVjbnRpb24KICogQ0lPMTUgICAgIFAyMCAgICAgICAgIEtCQyBQMjEgZnVjbnRpb24KICogQ0lPMTYgICAgIEkyQ19DTEsgICAgIEkyQyBDbG9jawogKiBDSU8xNyAgICAgSTJDX0RBVCAgICAgSTJDIERhdGEKICogCiAqIENJTzIwICAgICAtCiAqIENJTzIxICAgICAtCiAqIENJTzIyICAgICAtCiAqIENJTzIzICAgICAtCiAqIENJTzI0ICAgICAtCiAqIENJTzI1ICAgICBMT0NLICAgICAgICBLZXlsb2NrCiAqIAogKiBDSU8zMCAgICAgS0JDX0NMSyAgICAgS2V5YmFvcmQgQ2xvY2sKICogQ0lPMzEgICAgIENTMEogICAgICAgIEdlbmVyYWwgQ2hpcCBTZWxlY3QgZGVjb2RlciBDUzBKCiAqIENJTzMyICAgICBDUzFKICAgICAgICBHZW5lcmFsIENoaXAgU2VsZWN0IGRlY29kZXIgQ1MxSgogKiBDSU8zMyAgICAgQUxUX0tDTEsgICAgQWx0ZXJuYXRpdmUgS2V5Ym9hcmQgQ2xvY2sKICogQ0lPMzQgICAgIEFMVF9LREFUICAgIEFsdGVybmF0aXZlIEtleWJvYXJkIERhdGEKICogQ0lPMzUgICAgIEFMVF9NQ0xLICAgIEFsdGVybmF0aXZlIE1vdXNlIENsb2NrCiAqIENJTzM2ICAgICBBTFRfTURBVCAgICBBbHRlcm5hdGl2ZSBNb3VzZSBEYXRhCiAqIENJTzM3ICAgICBBTFRfS0JDICAgICBBbHRlcm5hdGl2ZSBLQkMgc2VsZWN0CiAqCiAqIFRoZSBDSU8gdXNlIGEgZG91YmxlIGluZGlyZWN0IGFkZHJlc3Mgc2NoZW1lLiAKICogCiAqIFJlaWdzdGVyIDMgaW4gdGhlIFNJTyBpcyB1c2VkIHRvIHNlbGVjdGcgd2hlcmUgdGhlIENJTyAKICogSS9PIHJlZ2lzdGVycyBzaG93IHVwIHVuZGVyIGZ1bmN0aW9uIDguIE5vdGUgdGhhdCB0aGVzZQogKiByZWdpc3RlcnMgY2xhc2ggd2l0aCB0aGUgQ0lPIGZ1bmN0aW9uIHNlbGVjdCByZWdzdGVycywKICogYmVsb3cuCiAqIAogKiBTSU8gcmVpZ3N0ZXIgMyAoQ0lPIEFkZHJlc3MgU2VsZWN0aW9uKSBiaXQgZGVmaW5pdGlvbnM6CiAqIGJpdCA3ICAgQ0lPIGRhdGEgcmVnaXN0ZXIgZW5hYmxlZAogKiBiaXQgMS0wIENJTyBpbmRpcmVjdCByZWdpc3RlcnMgc2VsZWN0CiAqICAgICAJIDAgIGluZGV4ID0gMHhFMCBkYXRhID0gMHhFMQogKiAgICAgICAxICBpbmRleCA9IDB4RTIgZGF0YSA9IDB4RTMKICogICAgICAgMiAgaW5kZXggPSAweEU0IGRhdGEgPSAweEU1CiAqICAgICAgIDMgIGluZGV4ID0gMHhFQSBkYXRhID0gMHhFQgogKiAKICogVGhlcmUgYXJlIHRocmVlIENJTyBJL08gcmVnaXN0ZXIgYWNjZXNzZWQgdmlhIENJTyBpbmRleCBhbmQgQ0lPIGRhdGEKICogMHgwMSAgICAgQ0lPIDEwLTE3IGRhdGEKICogMHgwMiAgICAgQ0lPIDIwLTI1IGRhdGEgKGJpdHMgNy02IHVudXNlZCkKICogMHgwMyAgICAgQ0lPIDMwLTM3IGRhdGEKICogCiAqIAogKiBUaGUgcGluIGZ1bmN0aW9uIGlzIGFjY2Vzc2VkIHRocm91Z2ggbm9ybWFsIAogKiBTSU8gcmVnaXN0ZXJzLCBlYWNoIHJlZ2lzdGVyIGhhdmUgdGhlIHNhbWUgZm9ybWF0OgogKiAKICogQml0ICAgRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICBWYWx1ZQogKiAwICAgICBJbnB1dC9vdXRwdXQgICAgICAgICAgICAgICAgIDE9aW5wdXQgCiAqIDEgICAgIFBvbGFyaXR5IG9mIHNpZ25hbCAgICAgICAgICAgMT1pbnZlcnRlZAogKiAyICAgICBVbnVzZWQgICAgICAgICAgICAgICAgICAgICAgID8/CiAqIDMgICAgIEZ1bmN0aW9uIChub3JtYWwgb3Igc3BlY2lhbCkgMT1zcGVjaWFsCiAqIDctNCAgIFVudXNlZAogKiAKICogU0lPIFJFRwogKiAweGUwICAgICBDSU8gMTAgQ29uZmlnCiAqIDB4ZTEgICAgIENJTyAxMSBDb25maWcKICogMHhlMiAgICAgQ0lPIDEyIENvbmZpZwogKiAweGUzICAgICBDSU8gMTMgQ29uZmlnCiAqIDB4ZTQgICAgIENJTyAxNCBDb25maWcKICogMHhlNSAgICAgQ0lPIDE1IENvbmZpZwogKiAweGU2ICAgICBDSU8gMTYgQ29uZmlnCiAqIDB4ZTcgICAgIENJTyAxNiBDb25maWcKICoKICogMHhlOCAgICAgQ0lPIDIwIENvbmZpZwogKiAweGU5ICAgICBDSU8gMjEgQ29uZmlnCiAqIDB4ZWEgICAgIENJTyAyMiBDb25maWcKICogMHhlYiAgICAgQ0lPIDIzIENvbmZpZwogKiAweGVjICAgICBDSU8gMjQgQ29uZmlnCiAqIDB4ZWQgICAgIENJTyAyNSBDb25maWcKICoKICogMHhmNSAgICAgQ0lPIDMwIENvbmZpZwogKiAweGY2ICAgICBDSU8gMzEgQ29uZmlnCiAqIDB4ZjcgICAgIENJTyAzMiBDb25maWcKICogMHhmOCAgICAgQ0lPIDMzIENvbmZpZwogKiAweGY5ICAgICBDSU8gMzQgQ29uZmlnCiAqIDB4ZmEgICAgIENJTyAzNSBDb25maWcKICogMHhmYiAgICAgQ0lPIDM2IENvbmZpZwogKiAweGZjICAgICBDSU8gMzcgQ29uZmlnCiAqIAogKi8KCnZvaWQgYWxpNTEyeF9zZXRfY2lvKGludCBlbmFibGVkKQp7CglpbnQgaTsKCQoJQUxJX09QRU4oKTsKCWFsaV93cml0ZSgweDMsIDMpOyAgICAvKiBEaXNhYmxlIENJTyBkYXRhIHJlZ2lzdGVyICovCgkKCUFMSV9TRUxERVYoOCk7CglhbGlfd3JpdGUoMHgzMCwgZW5hYmxlZD8xOjApOwoJCgkvKiBzZXQgYWxsIHBpbnMgdG8gaW5wdXQgdG8gc3RhcnQgd2l0aCAqLwoJZm9yIChpPTB4ZTA7aTwweGVlO2krKykgewoJCWFsaV93cml0ZShpLCAxKTsKCX0KCWZvciAoaT0weGY1O2k8MHhmZTtpKyspIHsKCQlhbGlfd3JpdGUoaSwgMSk7Cgl9CgkJCQoJQUxJX0NMT1NFKCk7Cn0KCnZvaWQgYWxpNTEyeF9jaW9fZnVuY3Rpb24oaW50IHBpbiwgaW50IHNwZWNpYWwsIGludCBpbnYsIGludCBpbnB1dCkKewoJdTggZGF0YTsKCXU4IGFkZHI7CgkKCQoJLyogdmFsaWQgcGlucyBhcmUgMTAtMTcsIDIwLTI1IGFuZCAzMC0zNyAqLwoJaWYgKHBpbiA+PSAxMCAmJiBwaW4gPD0gMTcpIHsgCgkJYWRkciA9IDB4ZTArKHBpbi0xMCk7Cgl9IGVsc2UgaWYgKHBpbiA+PSAyMCAmJiBwaW4gPD0gMjUpIHsKCQlhZGRyID0gMHhlOCsocGluLTIwKTsKCX0gZWxzZSBpZiAocGluID49IDMwICYmIHBpbiA8PSAzNykgeyAKCQlhZGRyID0gMHhmNSsocGluLTMwKTsKCX0gZWxzZSB7CgkJcmV0dXJuOwoJfQoJCglBTElfT1BFTigpOwoJQUxJX1NFTERFVig4KTsKCQoJYWxpX3dyaXRlKDB4MDMsIDB4MDMpOyAgICAvKiBEaXNhYmxlIENJTyBkYXRhIHJlZ2lzdGVyICovCgkKCWRhdGE9MDsKCWlmIChzcGVjaWFsKSB7CgkJZGF0YSB8PSAweDA4OwoJfSBlbHNlIHsKCQlpZiAoaW52KSB7CgkJCWRhdGEgfD0gMHgwMjsKCQl9CgkJaWYgKGlucHV0KSB7CgkJCWRhdGEgfD0gMHgwMTsKCQl9Cgl9CgkKCWFsaV93cml0ZShhZGRyLCBkYXRhKTsKCQoJQUxJX0NMT1NFKCk7Cn0KCnZvaWQgYWxpNTEyeF9jaW9fb3V0KGludCBwaW4sIGludCB2YWx1ZSkgCnsKCXU4IHJlZzsKCXU4IGRhdGE7Cgl1OCBiaXQ7CgkKCS8qIHZhbGlkIHBpbnMgYXJlIDEwLTE3LCAyMC0yNSBhbmQgMzAtMzcgKi8KCWlmIChwaW4gPj0gMTAgJiYgcGluIDw9IDE3KSB7IAoJCXJlZyA9IDE7CgkJcGluIC09IDEwOwoJfSBlbHNlIGlmIChwaW4gPj0gMjAgJiYgcGluIDw9IDI1KSB7CgkJcmVnID0gMjsKCQlwaW4gLT0gMjA7Cgl9IGVsc2UgaWYgKHBpbiA+PSAzMCAmJiBwaW4gPD0gMzcpIHsgCgkJcmVnID0gMzsKCQlwaW4gLT0gMzA7Cgl9IGVsc2UgewoJCXJldHVybjsKCX0KCWJpdCA9IDEgPDwgcGluOwoJCglBTElfT1BFTigpOwoJQUxJX1NFTERFVig4KTsKCQoJYWxpX3dyaXRlKDB4MDMsIDB4ODMpOyAgICAvKiBFbmFibGUgQ0lPIGRhdGEgcmVnaXN0ZXIsIHVzZSBkYXRhIHBvcnQgYXQgMHhlYSAqLwoJCglhbGlfd3JpdGUoMHhlYSwgcmVnKTsgICAgIC8qIHNlbGVjdCBJL08gcmVnaXN0ZXIgKi8KCWRhdGEgPSBhbGlfcmVhZCgweGViKTsKCWlmICh2YWx1ZSkgewoJCWRhdGEgfD0gYml0OwoJfSBlbHNlIHsKCQlkYXRhICY9IH5iaXQ7Cgl9CglhbGlfd3JpdGUoMHhlYiwgZGF0YSk7CglhbGlfd3JpdGUoMHhlYSwgMCk7ICAgICAgIC8qIHNlbGVjdCByZWdpc3RlciAwICovCglhbGlfd3JpdGUoMHgwMywgMHgwMyk7ICAgIC8qIERpc2FibGUgQ0lPIGRhdGEgcmVnaXN0ZXIgKi8KCUFMSV9DTE9TRSgpOwp9CgppbnQgYWxpNTEyeF9jaW9faW4oaW50IHBpbikKewoJdTggcmVnOwoJdTggZGF0YTsKCXU4IGJpdDsKCQoJLyogdmFsaWQgcGlucyBhcmUgMTAtMTcsIDIwLTI1IGFuZCAzMC0zNyAqLwoJaWYgKHBpbiA+PSAxMCAmJiBwaW4gPD0gMTcpIHsgCgkJcmVnID0gMTsKCQlwaW4gLT0gMTA7Cgl9IGVsc2UgaWYgKHBpbiA+PSAyMCAmJiBwaW4gPD0gMjUpIHsKCQlyZWcgPSAyOwoJCXBpbiAtPSAyMDsKCX0gZWxzZSBpZiAocGluID49IDMwICYmIHBpbiA8PSAzNykgeyAKCQlyZWcgPSAzOwoJCXBpbiAtPSAzMDsKCX0gZWxzZSB7CgkJcmV0dXJuIC0xOyAKCX0KCWJpdCA9IDEgPDwgcGluOwoJCglBTElfT1BFTigpOwoJQUxJX1NFTERFVig4KTsKCQoJYWxpX3dyaXRlKDB4MDMsIDB4ODMpOyAgICAvKiBFbmFibGUgQ0lPIGRhdGEgcmVnaXN0ZXIsIHVzZSBkYXRhIHBvcnQgYXQgMHhlYSAqLwoJCglhbGlfd3JpdGUoMHhlYSwgcmVnKTsgICAgIC8qIHNlbGVjdCBJL08gcmVnaXN0ZXIgKi8KCWRhdGEgPSBhbGlfcmVhZCgweGViKTsKCWFsaV93cml0ZSgweGVhLCAwKTsgICAgICAgLyogc2VsZWN0IHJlZ2lzdGVyIDAgKi8KCWFsaV93cml0ZSgweDAzLCAweDAzKTsgICAgLyogRGlzYWJsZSBDSU8gZGF0YSByZWdpc3RlciAqLwoJQUxJX0NMT1NFKCk7CgkKCXJldHVybiBkYXRhICYgYml0OyAKfQoKIAo=