LyoKICogWE1TIHYyKyBlbXVsYXRpb24KICoKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqCiAqIFRoaXMgWE1TIGVtdWxhdGlvbiBpcyBob29rZWQgdGhyb3VnaCB0aGUgRFBNSSBpbnRlcnJ1cHQuCiAqLwoKI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJnbG9iYWwuaCIKI2luY2x1ZGUgIm1vZHVsZS5oIgojaW5jbHVkZSAibWlzY2VtdS5oIgojaW5jbHVkZSAidG9vbGhlbHAuaCIKI2luY2x1ZGUgImRlYnVndG9vbHMuaCIKI2luY2x1ZGUgInNlbGVjdG9ycy5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKGludDMxKQoKdHlwZWRlZiBzdHJ1Y3QgewogV09SRCBIYW5kbGU7CiBEV09SRCBPZmZzZXQ7Cn0gV0lORV9QQUNLRUQgTU9WRU9GUzsKCnR5cGVkZWYgc3RydWN0IHsKIERXT1JEIExlbmd0aDsKIE1PVkVPRlMgU291cmNlOwogTU9WRU9GUyBEZXN0Owp9IFdJTkVfUEFDS0VEIE1PVkVTVFJVQ1Q7CgpzdGF0aWMgQllURSAqIFhNU19PZmZzZXQoIE1PVkVPRlMgKm9mcyApCnsKICAgIGlmIChvZnMtPkhhbmRsZSkgcmV0dXJuIChCWVRFKilHbG9iYWxMb2NrMTYob2ZzLT5IYW5kbGUpK29mcy0+T2Zmc2V0OwogICAgICAgIGVsc2UgcmV0dXJuIChCWVRFKilET1NNRU1fTWFwUmVhbFRvTGluZWFyKG9mcy0+T2Zmc2V0KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJICAgIFhNU19IYW5kbGVyCiAqLwoKdm9pZCBXSU5BUEkgWE1TX0hhbmRsZXIoIENPTlRFWFQ4NiAqY29udGV4dCApCnsKICAgIHN3aXRjaChBSF9yZWcoY29udGV4dCkpCiAgICB7CiAgICBjYXNlIDB4MDA6ICAgLyogR2V0IFhNUyB2ZXJzaW9uIG51bWJlciAqLwogICAgICAgIFRSQUNFKCJnZXQgWE1TIHZlcnNpb24gbnVtYmVyXG4iKTsKICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDAyMDA7IC8qIDIuMCAqLwogICAgICAgIEJYX3JlZyhjb250ZXh0KSA9IDB4MDAwMDsgLyogaW50ZXJuYWwgcmV2aXNpb24gKi8KICAgICAgICBEWF9yZWcoY29udGV4dCkgPSAweDAwMDE7IC8qIEhNQSBleGlzdHMgKi8KICAgICAgICBicmVhazsKICAgIGNhc2UgMHgwODogICAvKiBRdWVyeSBGcmVlIEV4dGVuZGVkIE1lbW9yeSAqLwogICAgewoJTUVNTUFOSU5GTyBtbWk7CgogICAgICAgIFRSQUNFKCJxdWVyeSBmcmVlIGV4dGVuZGVkIG1lbW9yeVxuIik7CgltbWkuZHdTaXplID0gc2l6ZW9mKG1taSk7CglNZW1NYW5JbmZvMTYoJm1taSk7CiAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gbW1pLmR3TGFyZ2VzdEZyZWVCbG9jayA+PiAxMDsKCSAgICBEWF9yZWcoY29udGV4dCkgPSAobW1pLmR3RnJlZVBhZ2VzICogVklSVFVBTF9HZXRQYWdlU2l6ZSgpKSA+PiAxMDsKICAgICAgICBUUkFDRSgicmV0dXJuaW5nIGxhcmdlc3QgJWRLLCB0b3RhbCAlZEtcbiIsIEFYX3JlZyhjb250ZXh0KSwgRFhfcmVnKGNvbnRleHQpKTsKICAgIH0KICAgIGJyZWFrOwogICAgY2FzZSAweDA5OiAgIC8qIEFsbG9jYXRlIEV4dGVuZGVkIE1lbW9yeSBCbG9jayAqLwogICAgICAgIFRSQUNFKCJhbGxvY2F0ZSBleHRlbmRlZCBtZW1vcnkgYmxvY2sgKCVkSylcbiIsCiAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSk7CglEWF9yZWcoY29udGV4dCkgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsCgkgICAgKERXT1JEKURYX3JlZyhjb250ZXh0KTw8MTApOwoJQVhfcmVnKGNvbnRleHQpID0gRFhfcmVnKGNvbnRleHQpID8gMSA6IDA7CglpZiAoIURYX3JlZyhjb250ZXh0KSkgQkxfcmVnKGNvbnRleHQpID0gMHhBMDsgLyogb3V0IG9mIG1lbW9yeSAqLwoJYnJlYWs7CiAgICBjYXNlIDB4MGE6ICAgLyogRnJlZSBFeHRlbmRlZCBNZW1vcnkgQmxvY2sgKi8KCVRSQUNFKCJmcmVlIGV4dGVuZGVkIG1lbW9yeSBibG9jayAlMDR4XG4iLERYX3JlZyhjb250ZXh0KSk7CglHbG9iYWxGcmVlMTYoRFhfcmVnKGNvbnRleHQpKTsKCWJyZWFrOwogICAgY2FzZSAweDBiOiAgIC8qIE1vdmUgRXh0ZW5kZWQgTWVtb3J5IEJsb2NrICovCiAgICB7CglNT1ZFU1RSVUNUKm1vdmU9Q1RYX1NFR19PRkZfVE9fTElOKGNvbnRleHQsCgkgICAgRFNfcmVnKGNvbnRleHQpLEVTSV9yZWcoY29udGV4dCkpOwogICAgICAgIEJZVEUqc3JjLCpkc3Q7CiAgICAgICAgVFJBQ0UoIm1vdmUgZXh0ZW5kZWQgbWVtb3J5IGJsb2NrXG4iKTsKICAgICAgICBzcmM9WE1TX09mZnNldCgmbW92ZS0+U291cmNlKTsKICAgICAgICBkc3Q9WE1TX09mZnNldCgmbW92ZS0+RGVzdCk7CgltZW1jcHkoZHN0LHNyYyxtb3ZlLT5MZW5ndGgpOwoJaWYgKG1vdmUtPlNvdXJjZS5IYW5kbGUpIEdsb2JhbFVubG9jazE2KG1vdmUtPlNvdXJjZS5IYW5kbGUpOwoJaWYgKG1vdmUtPkRlc3QuSGFuZGxlKSBHbG9iYWxVbmxvY2sxNihtb3ZlLT5EZXN0LkhhbmRsZSk7CglicmVhazsKICAgIH0KICAgIGRlZmF1bHQ6CiAgICAgICAgSU5UX0JBUkYoIGNvbnRleHQsIDB4MzEgKTsKICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAweDAwMDA7IC8qIGZhaWx1cmUgKi8KICAgICAgICBCTF9yZWcoY29udGV4dCkgPSAweDgwOyAgIC8qIGZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLwogICAgICAgIGJyZWFrOwogICAgfQp9Cg==