LyoKICAgIGkyYy12aWEuYyAtIFBhcnQgb2YgbG1fc2Vuc29ycywgIExpbnV4IGtlcm5lbCBtb2R1bGVzCiAgICAgICAgICAgICAgICBmb3IgaGFyZHdhcmUgbW9uaXRvcmluZwoKICAgIGkyYyBTdXBwb3J0IGZvciBWaWEgVGVjaG5vbG9naWVzIDgyQzU4NkIgU291dGggQnJpZGdlCgogICAgQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPgoKICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgoqLwoKI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaTJjLmg+CiNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1iaXQuaD4KI2luY2x1ZGUgPGFzbS9pby5oPgoKLyogUG93ZXIgbWFuYWdlbWVudCByZWdpc3RlcnMgKi8KI2RlZmluZSBQTV9DRkdfUkVWSUQJMHgwOAkvKiBzaWxpY29uIHJldmlzaW9uIGNvZGUgKi8KI2RlZmluZSBQTV9DRkdfSU9CQVNFMAkweDIwCiNkZWZpbmUgUE1fQ0ZHX0lPQkFTRTEJMHg0OAoKI2RlZmluZSBJMkNfRElSCQkocG1faW9fYmFzZSsweDQwKQojZGVmaW5lIEkyQ19PVVQJCShwbV9pb19iYXNlKzB4NDIpCiNkZWZpbmUgSTJDX0lOCQkocG1faW9fYmFzZSsweDQ0KQojZGVmaW5lIEkyQ19TQ0wJCTB4MDIJLyogY2xvY2sgYml0IGluIERJUi9PVVQvSU4gcmVnaXN0ZXIgKi8KI2RlZmluZSBJMkNfU0RBCQkweDA0CgovKiBpby1yZWdpb24gcmVzZXJ2YXRpb24gKi8KI2RlZmluZSBJT1NQQUNFCQkweDA2CgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgdnQ1ODZiX2RyaXZlcjsKc3RhdGljIHUxNiBwbV9pb19iYXNlOwoKLyoKICAgSXQgZG9lcyBub3QgYXBwZWFyIGZyb20gdGhlIGRhdGFzaGVldCB0aGF0IHRoZSBHUElPIHBpbnMgYXJlCiAgIG9wZW4gZHJhaW4uIFNvIGEgd2Ugc2V0IGEgbG93IHZhbHVlIGJ5IHNldHRpbmcgdGhlIGRpcmVjdGlvbiB0bwogICBvdXRwdXQgYW5kIGEgaGlnaCB2YWx1ZSBieSBzZXR0aW5nIHRoZSBkaXJlY3Rpb24gdG8gaW5wdXQgYW5kCiAgIHJlbHlpbmcgb24gdGhlIHJlcXVpcmVkIEkyQyBwdWxsdXAuIFRoZSBkYXRhIHZhbHVlIGlzIGluaXRpYWxpemVkCiAgIHRvIDAgaW4gdmlhX2luaXQoKSBhbmQgbmV2ZXIgY2hhbmdlZC4KKi8Kc3RhdGljIHZvaWQgYml0X3ZpYV9zZXRzY2wodm9pZCAqZGF0YSwgaW50IHN0YXRlKQp7CglvdXRiKHN0YXRlID8gaW5iKEkyQ19ESVIpICYgfkkyQ19TQ0wgOiBpbmIoSTJDX0RJUikgfCBJMkNfU0NMLCBJMkNfRElSKTsKfQoKc3RhdGljIHZvaWQgYml0X3ZpYV9zZXRzZGEodm9pZCAqZGF0YSwgaW50IHN0YXRlKQp7CglvdXRiKHN0YXRlID8gaW5iKEkyQ19ESVIpICYgfkkyQ19TREEgOiBpbmIoSTJDX0RJUikgfCBJMkNfU0RBLCBJMkNfRElSKTsKfQoKc3RhdGljIGludCBiaXRfdmlhX2dldHNjbCh2b2lkICpkYXRhKQp7CglyZXR1cm4gKDAgIT0gKGluYihJMkNfSU4pICYgSTJDX1NDTCkpOwp9CgpzdGF0aWMgaW50IGJpdF92aWFfZ2V0c2RhKHZvaWQgKmRhdGEpCnsKCXJldHVybiAoMCAhPSAoaW5iKEkyQ19JTikgJiBJMkNfU0RBKSk7Cn0KCgpzdGF0aWMgc3RydWN0IGkyY19hbGdvX2JpdF9kYXRhIGJpdF9kYXRhID0gewoJLnNldHNkYQkJPSBiaXRfdmlhX3NldHNkYSwKCS5zZXRzY2wJCT0gYml0X3ZpYV9zZXRzY2wsCgkuZ2V0c2RhCQk9IGJpdF92aWFfZ2V0c2RhLAoJLmdldHNjbAkJPSBiaXRfdmlhX2dldHNjbCwKCS51ZGVsYXkJCT0gNSwKCS50aW1lb3V0CT0gSFoKfTsKCnN0YXRpYyBzdHJ1Y3QgaTJjX2FkYXB0ZXIgdnQ1ODZiX2FkYXB0ZXIgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuaWQJCT0gSTJDX0hXX0JfVklBLAoJLmNsYXNzICAgICAgICAgID0gSTJDX0NMQVNTX0hXTU9OLAoJLm5hbWUJCT0gIlZJQSBpMmMiLAoJLmFsZ29fZGF0YQk9ICZiaXRfZGF0YSwKfTsKCgpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgdnQ1ODZiX2lkc1tdIF9fZGV2aW5pdGRhdGEgPSB7Cgl7IFBDSV9ERVZJQ0UoUENJX1ZFTkRPUl9JRF9WSUEsIFBDSV9ERVZJQ0VfSURfVklBXzgyQzU4Nl8zKSB9LAoJeyAwLCB9Cn07CgpNT0RVTEVfREVWSUNFX1RBQkxFIChwY2ksIHZ0NTg2Yl9pZHMpOwoKc3RhdGljIGludCBfX2RldmluaXQgdnQ1ODZiX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICppZCkKewoJdTE2IGJhc2U7Cgl1OCByZXY7CglpbnQgcmVzOwoKCWlmIChwbV9pb19iYXNlKSB7CgkJZGV2X2VycigmZGV2LT5kZXYsICJpMmMtdmlhOiBXaWxsIG9ubHkgc3VwcG9ydCBvbmUgaG9zdFxuIik7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQTV9DRkdfUkVWSUQsICZyZXYpOwoKCXN3aXRjaCAocmV2KSB7CgljYXNlIDB4MDA6CgkJYmFzZSA9IFBNX0NGR19JT0JBU0UwOwoJCWJyZWFrOwoJY2FzZSAweDAxOgoJY2FzZSAweDEwOgoJCWJhc2UgPSBQTV9DRkdfSU9CQVNFMTsKCQlicmVhazsKCglkZWZhdWx0OgoJCWJhc2UgPSBQTV9DRkdfSU9CQVNFMTsKCQkvKiBsYXRlciByZXZpc2lvbiAqLwoJfQoKCXBjaV9yZWFkX2NvbmZpZ193b3JkKGRldiwgYmFzZSwgJnBtX2lvX2Jhc2UpOwoJcG1faW9fYmFzZSAmPSAoMHhmZiA8PCA4KTsKCglpZiAoIXJlcXVlc3RfcmVnaW9uKEkyQ19ESVIsIElPU1BBQ0UsIHZ0NTg2Yl9kcml2ZXIubmFtZSkpIHsKCQlkZXZfZXJyKCZkZXYtPmRldiwgIklPIDB4JXgtMHgleCBhbHJlYWR5IGluIHVzZVxuIiwgSTJDX0RJUiwgSTJDX0RJUiArIElPU1BBQ0UpOwoJCXJldHVybiAtRU5PREVWOwoJfQoKCW91dGIoaW5iKEkyQ19ESVIpICYgfihJMkNfU0RBIHwgSTJDX1NDTCksIEkyQ19ESVIpOwoJb3V0YihpbmIoSTJDX09VVCkgJiB+KEkyQ19TREEgfCBJMkNfU0NMKSwgSTJDX09VVCk7CgoJLyogc2V0IHVwIHRoZSBzeXNmcyBsaW5rYWdlIHRvIG91ciBwYXJlbnQgZGV2aWNlICovCgl2dDU4NmJfYWRhcHRlci5kZXYucGFyZW50ID0gJmRldi0+ZGV2OwoKCXJlcyA9IGkyY19iaXRfYWRkX2J1cygmdnQ1ODZiX2FkYXB0ZXIpOwoJaWYgKCByZXMgPCAwICkgewoJCXJlbGVhc2VfcmVnaW9uKEkyQ19ESVIsIElPU1BBQ0UpOwoJCXBtX2lvX2Jhc2UgPSAwOwoJCXJldHVybiByZXM7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgX19kZXZleGl0IHZ0NTg2Yl9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKmRldikKewoJaTJjX2RlbF9hZGFwdGVyKCZ2dDU4NmJfYWRhcHRlcik7CglyZWxlYXNlX3JlZ2lvbihJMkNfRElSLCBJT1NQQUNFKTsKCXBtX2lvX2Jhc2UgPSAwOwp9CgoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIHZ0NTg2Yl9kcml2ZXIgPSB7CgkubmFtZQkJPSAidnQ1ODZiX3NtYnVzIiwKCS5pZF90YWJsZQk9IHZ0NTg2Yl9pZHMsCgkucHJvYmUJCT0gdnQ1ODZiX3Byb2JlLAoJLnJlbW92ZQkJPSBfX2RldmV4aXRfcCh2dDU4NmJfcmVtb3ZlKSwKfTsKCnN0YXRpYyBpbnQgX19pbml0IGkyY192dDU4NmJfaW5pdCh2b2lkKQp7CglyZXR1cm4gcGNpX3JlZ2lzdGVyX2RyaXZlcigmdnQ1ODZiX2RyaXZlcik7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBpMmNfdnQ1ODZiX2V4aXQodm9pZCkKewoJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZ2dDU4NmJfZHJpdmVyKTsKfQoKCk1PRFVMRV9BVVRIT1IoIkt59nN0aSBN5Gxra2kgPGttYWxra2lAY2MuaHV0LmZpPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oImkyYyBmb3IgVmlhIHZ0ODJjNTg2YiBzb3V0aGJyaWRnZSIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7Cgptb2R1bGVfaW5pdChpMmNfdnQ1ODZiX2luaXQpOwptb2R1bGVfZXhpdChpMmNfdnQ1ODZiX2V4aXQpOwo=